Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
3D3A31A80E04E814A2372357F95646FF4712E4E7B5F3992C3576466866A7B5AF
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
100,000,000
Requested gas limit
GAS USED
74,970,381
Gas consumed
FEE
100000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1rayfgklwl0aspz488wvrcrvt7t2quy6q06lgk215000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
Cu6+AwoML3ZtLm1fYWRkcGtnEty+AwooZzFyYXlmZ2tsd2wwYXNwejQ4OHd2cmNydnQ3dDJxdXk2cTA2bGdrMhKfvgMKBGhvbWUSOGduby5sYW5kL3IvZzFyYXlmZ2tsd2wwYXNwejQ4OHd2cmNydnQ3dDJxdXk2cTA2bGdrMi9ob21lGr0WCgpiYW5uZXIuZ25vEq4WcGFja2FnZSBob21lCgppbXBvcnQgImVuY29kaW5nL2Jhc2U2NCIKCi8vIEFkYXB0ZWQgZnJvbSB0aGUgYmFubmVyIGV2ZXJ5IFNhbW91cmHDryBob21lIHJlYWxtIHNoYXJlcywgd2l0aCBhIGN5YW4gYWNjZW50Ci8vIGluIHBsYWNlIG9mIHRoZSByZWQuIFdoYXQgZGlmZmVycyBiZXR3ZWVuIHBhZ2VzIGxpdmVzIGluIGNvbnRlbnQuZ25vLgoKLy8gdG9yaWlNYXNrIGlzIHRoZSBTYW1vdXJhw68gQ29vcCBtYXJrLCByZWRyYXduIGFzIHZlY3RvcnM6IGEgdG9yaWkgZ2F0ZSBjdXQKLy8gb3V0IG9mIGEgZnVsbCBjaXJjbGUsIGluIGEgNDgweDQ4MCBib3guIEV2ZXJ5dGhpbmcgcGFpbnRlZCB0aHJvdWdoIHRoZSBtYXNrCi8vIHRha2VzIHRoZSBzaGFwZSBvZiB0aGUgbWFyay4KY29uc3QgdG9yaWlNYXNrID0gYDxtYXNrIGlkPSJ0b3JpaSI+PGNpcmNsZSBjeD0iMjM4IiBjeT0iMjQwIiByPSIyNDAiIGZpbGw9IiNmZmYiLz48ZyBmaWxsPSIjMDAwIj5gICsKCWA8cGF0aCBkPSJNLTEwIDkwIFEyMzggMTY0IDQ5MCA5MCBMNDkwIDE0MCBRMjM4IDE5MCAtMTAgMTQwIFoiLz5gICsKCWA8cGF0aCBkPSJNMTAyIDE0MCBMMTY1IDE0MCBMMTYyIDIwNiBMOTYgMjA2IFoiLz5gICsKCWA8cGF0aCBkPSJNMzAyIDE0MCBMMzY0IDE0MCBMMzcwIDIwNiBMMzA0IDIwNiBaIi8+YCArCglgPHJlY3QgeD0iLTEwIiB5PSIyMDUiIHdpZHRoPSI1MDAiIGhlaWdodD0iNDEiLz5gICsKCWA8cGF0aCBkPSJNODkgMjQ1IEwxNTkgMjQ1IEwxNDUgNDkwIEw1NSA0OTAgWiIvPmAgKwoJYDxyZWN0IHg9Ii0xMCIgeT0iMjc0IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMyIi8+YCArCglgPHBhdGggZD0iTTMwNyAyNDUgTDM3NyAyNDUgTDQxMSA0OTAgTDMyMSA0OTAgWiIvPmAgKwoJYDxwYXRoIGQ9Ik0zODIgMjk2IEw0OTAgMzk4IEw0OTAgNDU1IEwzOTAgMzU4IFoiLz5gICsKCWA8L2c+PC9tYXNrPmAKCnR5cGUgaGVyb1RleHQgc3RydWN0IHsKCWtpY2tlciAgIHN0cmluZyAvLyBzbWFsbCBjeWFuIGNhcHMgbGluZSBhYm92ZSB0aGUgdGl0bGUKCXRpdGxlICAgIHN0cmluZwoJc3VidGl0bGUgc3RyaW5nCgl0YWdsaW5lICBzdHJpbmcgLy8gY3lhbiBtb25vc3BhY2UgbGluZQoJZm9vdGxpbmUgc3RyaW5nIC8vIGdyZXkgbW9ub3NwYWNlIGxpbmUKCWFsdCAgICAgIHN0cmluZwp9CgovLyBoZXJvU1ZHIGRyYXdzIHRoZSBwYWdlIGJhbm5lcjogdGhlIG1hcmsgc2V0IGluIGEgY3lhbiBzdW4gb24gdGhlIHJpZ2h0LCB0aGUKLy8gdGV4dCBzdGFjayBvbiB0aGUgbGVmdC4KZnVuYyBoZXJvU1ZHKGggaGVyb1RleHQpIHN0cmluZyB7CglyZXR1cm4gYDxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iOTYwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDk2MCAzMDAiPmAgKwoJCWA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImJnIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMGUwZTBlIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMGYyMjI2Ii8+PC9saW5lYXJHcmFkaWVudD5gICsKCQl0b3JpaU1hc2sgKyBgPC9kZWZzPmAgKwoJCWA8cmVjdCB3aWR0aD0iOTYwIiBoZWlnaHQ9IjMwMCIgcng9IjE4IiBmaWxsPSJ1cmwoI2JnKSIvPmAgKwoJCWA8ZyBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS1vcGFjaXR5PSIuMDUiPjxwYXRoIGQ9Ik0wIDYwSDk2ME0wIDEyMEg5NjBNMCAxODBIOTYwTTAgMjQwSDk2MCIvPjwvZz5gICsKCQlgPGNpcmNsZSBjeD0iNzkwIiBjeT0iMTUwIiByPSIxMjgiIGZpbGw9IiM1ZWFhYjUiLz5gICsKCQlgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjg2IDQ2KSBzY2FsZSguNDMzMykiPjxyZWN0IHdpZHRoPSI0ODAiIGhlaWdodD0iNDgwIiBmaWxsPSIjZjRlZmU2IiBtYXNrPSJ1cmwoI3RvcmlpKSIvPjwvZz5gICsKCQlgPHRleHQgeD0iNTYiIHk9Ijc4IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLE1lbmxvLG1vbm9zcGFjZSIgZm9udC1zaXplPSIxMyIgbGV0dGVyLXNwYWNpbmc9IjMiIGZpbGw9IiM1ZWFhYjUiPmAgKyB4bWxUZXh0KGgua2lja2VyKSArIGA8L3RleHQ+YCArCgkJYDx0ZXh0IHg9IjUyIiB5PSIxNjAiIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSxTZWdvZSBVSSxzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iODAwIiBmb250LXNpemU9Ijc2IiBmaWxsPSIjZmZmZmZmIj5gICsgeG1sVGV4dChoLnRpdGxlKSArIGA8L3RleHQ+YCArCgkJYDx0ZXh0IHg9IjU2IiB5PSIyMDAiIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSxTZWdvZSBVSSxzYW5zLXNlcmlmIiBmb250LXNpemU9IjIyIiBmaWxsPSIjZThlMmQ4Ij5gICsgeG1sVGV4dChoLnN1YnRpdGxlKSArIGA8L3RleHQ+YCArCgkJYDx0ZXh0IHg9IjU2IiB5PSIyMzYiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsTWVubG8sbW9ub3NwYWNlIiBmb250LXNpemU9IjE2IiBmaWxsPSIjNWVhYWI1Ij5gICsgeG1sVGV4dChoLnRhZ2xpbmUpICsgYDwvdGV4dD5gICsKCQlgPHRleHQgeD0iNTYiIHk9IjI2NiIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSxNZW5sbyxtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiM4YThhOGEiPmAgKyB4bWxUZXh0KGguZm9vdGxpbmUpICsgYDwvdGV4dD5gICsKCQlgPC9zdmc+YAp9CgpmdW5jIGhlcm9JbWFnZSgpIHN0cmluZyB7CglyZXR1cm4gIiFbIiArIG1kVGV4dChjdXJyZW50SGVybygpLmFsdCkgKyAiXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgKwoJCWJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUoaGVyb1NWRyhjdXJyZW50SGVybygpKSkpICsgIikiCn0KGvJmCgpjaGFydHMuZ25vEuNmcGFja2FnZSBob21lCgppbXBvcnQgKAoJImVuY29kaW5nL2Jhc2U2NCIKCSJzdHJjb252IgoJInN0cmluZ3MiCikKCi8vIFR3byBjaGFydHMsIG1lcmdlZCBwdWxsIHJlcXVlc3RzIGFuZCByZXZpZXdzIHBlciBtb250aCwgZWFjaCBzdGFja2VkIGJ5Ci8vIHJlcG9zaXRvcnkuIEEgcmVhbG0gY2Fubm90IHJlYWQgR2l0SHViLCBzbyBlYWNoIGNoYXJ0J3MgbnVtYmVycyBsaXZlIGluIGEKLy8gc2VjdGlvbiwgImFjdGl2aXR5IiBhbmQgInJldmlld2FjdGl2aXR5IiwgYW5kIHNjcmlwdHMvYWN0aXZpdHkucHkgcHJpbnRzIHRoZQovLyBTZXQgY29tbWFuZHMgdGhhdCByZWZyZXNoIHRoZW0uIEEgc2VjdGlvbiByZWFkcywgbGluZXMgc3BsaXQgYnkgIjsiOgovLwovLwl0aXRsZSBtZXJnZWQgcHVsbCByZXF1ZXN0cwovLwlzdWJ0aXRsZSBwZXIgbW9udGgsIG9uIHB1YmxpYyBnbm8ubGFuZCByZXBvc2l0b3JpZXMKLy8Jc2VyaWVzIGdub2xhbmcvZ25vLGdub2Rhb2tpdCxPdGhlcnMsUGVlciBEZXYKLy8Jc2NhbGUgUGVlciBEZXYsMTAsY29tbWl0cwovLwlvdXRsaW5lIGdub2xhbmcvZ25vIHB1bGwgcmVxdWVzdHMgb3BlbmVkCi8vCXVwZGF0ZWQgMjAyNi0wOS0yNAovLwkyMDI1LTA3IDQgMCAxIDQ4IHwgMwovLwovLyBFYWNoIG1vbnRoIHJvdyBjYXJyaWVzIG9uZSBjb3VudCBwZXIgc2VyaWVzLiBBIHNjYWxlZCBzZXJpZXMgY291bnRzIGFub3RoZXIKLy8gdW5pdDogaXRzIGJhcnMgYXJlIGRyYXduIGF0IG9uZSBzdGVwIHBlciAxMCwgYW5kIGl0IHN0YXlzIG91dCBvZiB0aGUgdG90YWxzLgovLyBUaGUgY291bnQgYWZ0ZXIgInwiIGRyYXdzIGEgc3RyaXBlZCBiYXIgaW4gdGhlIGZpcnN0IHNlcmllcycgY29sb3VyIGJlc2lkZQovLyB0aGUgc3RhY2suCgpjb25zdCAoCglhY3Rpdml0eVNsb3QgICAgICAgPSAiYWN0aXZpdHkiCglyZXZpZXdBY3Rpdml0eVNsb3QgPSAicmV2aWV3YWN0aXZpdHkiCgljaGFydFdpZHRoICAgICAgICAgPSA3MjAKCWNoYXJ0WCAgICAgICAgICAgICA9IDI0CgltYXhCYXIgICAgICAgICAgICAgPSA5MAoJc2NhbGVkRmlsbCAgICAgICAgID0gIiNmYmJmMjQiCglvdGhlcnNGaWxsICAgICAgICAgPSAiIzk0YTNiOCIKKQoKdmFyICgKCW1vbnRoTmFtZXMgPSBbXXN0cmluZ3siSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMifQoJLy8gQSByZXBvc2l0b3J5IGtlZXBzIGl0cyBjb2xvdXIgaW4gYm90aCBjaGFydHM7IG9uZSBub3QgbGlzdGVkIGhlcmUgdGFrZXMKCS8vIGEgc3BhcmUgY29sb3VyIHBpY2tlZCBmcm9tIGl0cyBuYW1lLgoJcmVwb0ZpbGxzID0gbWFwW3N0cmluZ11zdHJpbmd7CgkJImdub2xhbmcvZ25vIjogICAgICAgICIjM2RkYzk3IiwKCQkiZ25vLW9uYm9hcmRpbmctYm90IjogIiM3YWEyZmYiLAoJCSJnbm9kYW9raXQiOiAgICAgICAgICAiI2MwODRmYyIsCgkJImF3ZXNvbWUtZ25vIjogICAgICAgICIjZjQ3MmI2IiwKCQkiZ25vbG92ZSI6ICAgICAgICAgICAgIiMyZGQ0YmYiLAoJfQoJc3BhcmVGaWxscyA9IFtdc3RyaW5neyIjZmI5MjNjIiwgIiNhM2U2MzUiLCAiIzM4YmRmOCIsICIjZTg3OWY5In0KKQoKdHlwZSBtb250aCBzdHJ1Y3QgewoJbGFiZWwgICBzdHJpbmcgLy8gIkp1bCIsIG9yICJKYW4gMjYiIHdoZXJlIGEgeWVhciBzdGFydHMKCWNvdW50cyAgW11pbnQKCW91dGxpbmUgaW50Cn0KCnR5cGUgYWN0aXZpdHkgc3RydWN0IHsKCW5vdW4gICAgICBzdHJpbmcKCXN1YnRpdGxlICBzdHJpbmcKCXNlcmllcyAgICBbXXN0cmluZwoJc2NhbGVkICAgIHN0cmluZyAvLyB0aGUgc2VyaWVzIGNvdW50ZWQgaW4gYW5vdGhlciB1bml0LCBvciAiIgoJc2NhbGVEaXYgIGludAoJc2NhbGVVbml0IHN0cmluZwoJb3V0bGluZSAgIHN0cmluZyAvLyB0aGUgc3RyaXBlZCBiYXIncyBsZWdlbmQsIG9yICIiCgl1cGRhdGVkICAgc3RyaW5nIC8vICIyNCBTZXAgMjAyNiIsIHRoZSBkYXkgdGhlIG51bWJlcnMgd2VyZSBjb3VudGVkCgltb250aHMgICAgW11tb250aAp9CgovLyBwYXJzZUFjdGl2aXR5IHJlYWRzIGEgY2hhcnQgc2VjdGlvbjsgYSBtYWxmb3JtZWQgbGluZSBpcyBza2lwcGVkLgpmdW5jIHBhcnNlQWN0aXZpdHkoc3BlYyBzdHJpbmcpIGFjdGl2aXR5IHsKCXZhciBhIGFjdGl2aXR5Cglmb3IgXywgbGluZSA6PSByYW5nZSBzdHJpbmdzLlNwbGl0KHN0cmluZ3MuUmVwbGFjZUFsbChzcGVjLCAiXG4iLCAiOyIpLCAiOyIpIHsKCQlsaW5lID0gc3RyaW5ncy5UcmltU3BhY2UobGluZSkKCQlzd2l0Y2ggewoJCWNhc2Ugc3RyaW5ncy5IYXNQcmVmaXgobGluZSwgInRpdGxlICIpOgoJCQlhLm5vdW4gPSBzdHJpbmdzLlRyaW1TcGFjZShsaW5lWzY6XSkKCQljYXNlIHN0cmluZ3MuSGFzUHJlZml4KGxpbmUsICJzdWJ0aXRsZSAiKToKCQkJYS5zdWJ0aXRsZSA9IHN0cmluZ3MuVHJpbVNwYWNlKGxpbmVbOTpdKQoJCWNhc2Ugc3RyaW5ncy5IYXNQcmVmaXgobGluZSwgInNlcmllcyAiKToKCQkJZm9yIF8sIHMgOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdChsaW5lWzc6XSwgIiwiKSB7CgkJCQlhLnNlcmllcyA9IGFwcGVuZChhLnNlcmllcywgc3RyaW5ncy5UcmltU3BhY2UocykpCgkJCX0KCQljYXNlIHN0cmluZ3MuSGFzUHJlZml4KGxpbmUsICJzY2FsZSAiKToKCQkJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChsaW5lWzY6XSwgIiwiKQoJCQlpZiBsZW4ocGFydHMpICE9IDMgewoJCQkJY29udGludWUKCQkJfQoJCQlkaXYsIGVyciA6PSBzdHJjb252LkF0b2koc3RyaW5ncy5UcmltU3BhY2UocGFydHNbMV0pKQoJCQlpZiBlcnIgIT0gbmlsIHx8IGRpdiA8IDEgewoJCQkJY29udGludWUKCQkJfQoJCQlhLnNjYWxlZCwgYS5zY2FsZURpdiwgYS5zY2FsZVVuaXQgPSBzdHJpbmdzLlRyaW1TcGFjZShwYXJ0c1swXSksIGRpdiwgc3RyaW5ncy5UcmltU3BhY2UocGFydHNbMl0pCgkJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChsaW5lLCAib3V0bGluZSAiKToKCQkJYS5vdXRsaW5lID0gc3RyaW5ncy5UcmltU3BhY2UobGluZVs4Ol0pCgkJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChsaW5lLCAidXBkYXRlZCAiKToKCQkJYS51cGRhdGVkID0gZm9ybWF0RGF5KHN0cmluZ3MuVHJpbVNwYWNlKGxpbmVbODpdKSkKCQlkZWZhdWx0OgoJCQlpZiBtLCBvayA6PSBwYXJzZU1vbnRoKGxpbmUsIGxlbihhLnNlcmllcyksIGxlbihhLm1vbnRocykgPT0gMCk7IG9rIHsKCQkJCWEubW9udGhzID0gYXBwZW5kKGEubW9udGhzLCBtKQoJCQl9CgkJfQoJfQoJcmV0dXJuIGEKfQoKZnVuYyBwYXJzZU1vbnRoKGxpbmUgc3RyaW5nLCB3aWR0aCBpbnQsIGZpcnN0IGJvb2wpIChtb250aCwgYm9vbCkgewoJZmllbGRzIDo9IHN0cmluZ3MuRmllbGRzKGxpbmUpCglpZiBsZW4oZmllbGRzKSA8IDEgfHwgbGVuKGZpZWxkc1swXSkgIT0gNyB8fCBmaWVsZHNbMF1bNF0gIT0gJy0nIHsKCQlyZXR1cm4gbW9udGh7fSwgZmFsc2UKCX0KCW0sIGVyciA6PSBzdHJjb252LkF0b2koZmllbGRzWzBdWzU6XSkKCWlmIGVyciAhPSBuaWwgfHwgbSA8IDEgfHwgbSA+IDEyIHsKCQlyZXR1cm4gbW9udGh7fSwgZmFsc2UKCX0KCW91dCA6PSBtb250aHtsYWJlbDogbW9udGhOYW1lc1ttLTFdfQoJaWYgbSA9PSAxIHx8IGZpcnN0IHsKCQlvdXQubGFiZWwgKz0gIiAiICsgZmllbGRzWzBdWzI6NF0KCX0KCWNvdW50cyA6PSBmaWVsZHNbMTpdCglpZiBuIDo9IGxlbihjb3VudHMpOyBuID49IDIgJiYgY291bnRzW24tMl0gPT0gInwiIHsKCQl2LCBlcnIgOj0gc3RyY29udi5BdG9pKGNvdW50c1tuLTFdKQoJCWlmIGVyciAhPSBuaWwgfHwgdiA8IDAgewoJCQlyZXR1cm4gbW9udGh7fSwgZmFsc2UKCQl9CgkJb3V0Lm91dGxpbmUsIGNvdW50cyA9IHYsIGNvdW50c1s6bi0yXQoJfQoJaWYgbGVuKGNvdW50cykgIT0gd2lkdGggfHwgd2lkdGggPT0gMCB7CgkJcmV0dXJuIG1vbnRoe30sIGZhbHNlCgl9Cglmb3IgXywgZiA6PSByYW5nZSBjb3VudHMgewoJCW4sIGVyciA6PSBzdHJjb252LkF0b2koZikKCQlpZiBlcnIgIT0gbmlsIHx8IG4gPCAwIHsKCQkJcmV0dXJuIG1vbnRoe30sIGZhbHNlCgkJfQoJCW91dC5jb3VudHMgPSBhcHBlbmQob3V0LmNvdW50cywgbikKCX0KCXJldHVybiBvdXQsIHRydWUKfQoKLy8gZm9ybWF0RGF5IHR1cm5zIDIwMjYtMDktMjQgaW50byAiMjQgU2VwIDIwMjYiLCBvciAiIiB3aGVuIGl0IGlzIG5vdCBhIGRhdGUuCmZ1bmMgZm9ybWF0RGF5KHMgc3RyaW5nKSBzdHJpbmcgewoJaWYgbGVuKHMpICE9IDEwIHx8IHNbNF0gIT0gJy0nIHx8IHNbN10gIT0gJy0nIHsKCQlyZXR1cm4gIiIKCX0KCW0sIGVycjEgOj0gc3RyY29udi5BdG9pKHNbNTo3XSkKCWQsIGVycjIgOj0gc3RyY29udi5BdG9pKHNbODpdKQoJaWYgZXJyMSAhPSBuaWwgfHwgZXJyMiAhPSBuaWwgfHwgbSA8IDEgfHwgbSA+IDEyIHx8IGQgPCAxIHx8IGQgPiAzMSB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gc3RyY29udi5JdG9hKGQpICsgIiAiICsgbW9udGhOYW1lc1ttLTFdICsgIiAiICsgc1s6NF0KfQoKZnVuYyAoYSBhY3Rpdml0eSkgZmlsbChpIGludCkgc3RyaW5nIHsKCW5hbWUgOj0gYS5zZXJpZXNbaV0KCXN3aXRjaCBuYW1lIHsKCWNhc2UgIk90aGVycyI6CgkJcmV0dXJuIG90aGVyc0ZpbGwKCWNhc2UgYS5zY2FsZWQ6CgkJcmV0dXJuIHNjYWxlZEZpbGwKCX0KCWlmIGYsIG9rIDo9IHJlcG9GaWxsc1tuYW1lXTsgb2sgewoJCXJldHVybiBmCgl9CglzdW0gOj0gMAoJZm9yIGogOj0gMDsgaiA8IGxlbihuYW1lKTsgaisrIHsKCQlzdW0gKz0gaW50KG5hbWVbal0pCgl9CglyZXR1cm4gc3BhcmVGaWxsc1tzdW0lbGVuKHNwYXJlRmlsbHMpXQp9CgovLyBkcmF3biByZXR1cm5zIGhvdyBtYW55IHN0ZXBzIHNlcmllcyBpIHRha2VzIGluIHRoZSBiYXIsIHJvdW5kaW5nIGEgc2NhbGVkCi8vIGNvdW50IHVwIHNvIGEgcXVpZXQgbW9udGggc3RpbGwgc2hvd3MuCmZ1bmMgKGEgYWN0aXZpdHkpIGRyYXduKGksIG4gaW50KSBpbnQgewoJaWYgYS5zZXJpZXNbaV0gPT0gYS5zY2FsZWQgewoJCXJldHVybiAobiArIGEuc2NhbGVEaXYgLSAxKSAvIGEuc2NhbGVEaXYKCX0KCXJldHVybiBuCn0KCi8vIHJlbmRlckNoYXJ0IGRyYXdzIGEgY2hhcnQgc2VjdGlvbiBhcyBhIG1hcmtkb3duIGltYWdlLCBvciAiIiB3aGVuIGl0IGhvbGRzCi8vIG5vIG1vbnRoLgpmdW5jIHJlbmRlckNoYXJ0KHNsb3Qgc3RyaW5nKSBzdHJpbmcgewoJYSA6PSBwYXJzZUFjdGl2aXR5KEdldChzbG90KSkKCWlmIGxlbihhLm1vbnRocykgPT0gMCB8fCBhLm5vdW4gPT0gIiIgewoJCXJldHVybiAiIgoJfQoJdG90YWxzIDo9IG1ha2UoW11pbnQsIGxlbihhLnNlcmllcykpCglwZWFrLCBzdW0sIG91dGxpbmVkIDo9IDEsIDAsIDAKCWZvciBfLCBtIDo9IHJhbmdlIGEubW9udGhzIHsKCQlvdXRsaW5lZCArPSBtLm91dGxpbmUKCQlpZiBtLm91dGxpbmUgPiBwZWFrIHsKCQkJcGVhayA9IG0ub3V0bGluZQoJCX0KCQlzdGVwcyA6PSAwCgkJZm9yIGksIG4gOj0gcmFuZ2UgbS5jb3VudHMgewoJCQl0b3RhbHNbaV0gKz0gbgoJCQlzdGVwcyArPSBhLmRyYXduKGksIG4pCgkJCWlmIGEuc2VyaWVzW2ldICE9IGEuc2NhbGVkIHsKCQkJCXN1bSArPSBuCgkJCX0KCQl9CgkJaWYgc3RlcHMgPiBwZWFrIHsKCQkJcGVhayA9IHN0ZXBzCgkJfQoJfQoKCS8vIExlZ2VuZCBlbnRyaWVzIGZsb3cgbGVmdCB0byByaWdodCBhbmQgd3JhcCwgc28gdGhlIGNoYXJ0IHNpdHMgYmVsb3cgdGhlbS4KCXZhciBiLCBpdGVtcyBzdHJpbmdzLkJ1aWxkZXIKCXgsIHkgOj0gY2hhcnRYLCA5NgoJZm9yIGksIHMgOj0gcmFuZ2UgYS5zZXJpZXMgewoJCWxhYmVsIDo9IHMgKyAiICIgKyBzdHJjb252Lkl0b2EodG90YWxzW2ldKQoJCWlmIHMgPT0gYS5zY2FsZWQgewoJCQlsYWJlbCArPSAiICIgKyBhLnNjYWxlVW5pdCArICIsIGRyYXduIDEgcGVyICIgKyBzdHJjb252Lkl0b2EoYS5zY2FsZURpdikKCQl9CgkJdyA6PSAyNCArIGxlbihsYWJlbCkqNwoJCWlmIHgrdyA+IGNoYXJ0V2lkdGgtY2hhcnRYIHsKCQkJeCwgeSA9IGNoYXJ0WCwgeSsyMgoJCX0KCQlyZWN0KCZpdGVtcywgeCwgeS0xMCwgMTIsIDEyLCAwLCBhLmZpbGwoaSkpCgkJdGV4dCgmaXRlbXMsIHgrMTgsIHksICJzIiwgIiNmZmZmZmYiLCBsYWJlbCkKCQl4ICs9IHcgKyAxMgoJfQoJaWYgYS5vdXRsaW5lICE9ICIiIHsKCQlsYWJlbCA6PSBhLm91dGxpbmUgKyAiICIgKyBzdHJjb252Lkl0b2Eob3V0bGluZWQpCgkJdyA6PSAyNCArIGxlbihsYWJlbCkqNwoJCWlmIHgrdyA+IGNoYXJ0V2lkdGgtY2hhcnRYIHsKCQkJeCwgeSA9IGNoYXJ0WCwgeSsyMgoJCX0KCQlyZWN0KCZpdGVtcywgeCwgeS0xMCwgMTIsIDEyLCAwLCAidXJsKCNvKSIpCgkJdGV4dCgmaXRlbXMsIHgrMTgsIHksICJzIiwgIiNmZmZmZmYiLCBsYWJlbCkKCX0KCWJhc2VsaW5lIDo9IHkgKyAzMCArIG1heEJhcgoJaGVpZ2h0IDo9IGJhc2VsaW5lICsgMzQKCglzaCwgc3cgOj0gc3RyY29udi5JdG9hKGhlaWdodCksIHN0cmNvbnYuSXRvYShjaGFydFdpZHRoKQoJYi5Xcml0ZVN0cmluZyhgPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSJgICsgc3cgKyBgIiBoZWlnaHQ9ImAgKyBzaCArIGAiIHZpZXdCb3g9IjAgMCBgICsgc3cgKyBgIGAgKyBzaCArIGAiPmApCgliLldyaXRlU3RyaW5nKCI8c3R5bGU+Lmh7Zm9udDo3MDAgMjZweCBzYW5zLXNlcmlmfS5ze2ZvbnQ6MTNweCBzYW5zLXNlcmlmfSIgKwoJCSIubntmb250OjYwMCAxMXB4IHNhbnMtc2VyaWY7dGV4dC1hbmNob3I6bWlkZGxlfS5te2ZvbnQ6MTFweCBzYW5zLXNlcmlmO3RleHQtYW5jaG9yOm1pZGRsZX0iICsKCQkiLnV7Zm9udDoxMnB4IHNhbnMtc2VyaWY7dGV4dC1hbmNob3I6ZW5kfTwvc3R5bGU+IikKCWIuV3JpdGVTdHJpbmcoYDxkZWZzPjxwYXR0ZXJuIGlkPSJvIiB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBwYXR0ZXJuVHJhbnNmb3JtPSJyb3RhdGUoNDUpIj5gICsKCQlgPHJlY3Qgd2lkdGg9IjIiIGhlaWdodD0iNSIgZmlsbD0iYCArIHJlcG9GaWxsc1siZ25vbGFuZy9nbm8iXSArIGAiLz48L3BhdHRlcm4+PC9kZWZzPmApCglyZWN0KCZiLCAwLCAwLCBjaGFydFdpZHRoLCBoZWlnaHQsIDEyLCAiIzEwMjMxYyIpCgl0ZXh0KCZiLCBjaGFydFgsIDQyLCAiaCIsICIjZmZmZmZmIiwgc3RyY29udi5JdG9hKHN1bSkrIiAiK2Eubm91bikKCWlmIGEuc3VidGl0bGUgIT0gIiIgewoJCXRleHQoJmIsIGNoYXJ0WCwgNjYsICJzIiwgIiM5ZmM5YjQiLCBhLnN1YnRpdGxlKQoJfQoJaWYgYS51cGRhdGVkICE9ICIiIHsKCQl0ZXh0KCZiLCBjaGFydFdpZHRoLWNoYXJ0WCwgNDIsICJ1IiwgIiM5ZmM5YjQiLCAidXBkYXRlZCAiK2EudXBkYXRlZCkKCX0KCWIuV3JpdGVTdHJpbmcoaXRlbXMuU3RyaW5nKCkpCgoJc3RlcCA6PSAoY2hhcnRXaWR0aCAtIDIqY2hhcnRYKSAvIGxlbihhLm1vbnRocykKCWJhclcgOj0gc3RlcCAqIDIgLyAzCglzdHJpcGVXIDo9IDAKCWlmIGEub3V0bGluZSAhPSAiIiB7CgkJLy8gVGhlIHN0cmlwZWQgYmFyIGFuZCB0aGUgc3RhY2sgc2hhcmUgdGhlIG1vbnRoJ3Mgc2xvdCwgb3BlbmVkIGZpcnN0LAoJCS8vIGF0IHRoZSBzYW1lIHdpZHRoIGFuZCB0b3VjaGluZy4KCQliYXJXID0gc3RlcCAqIDIgLyA1CgkJc3RyaXBlVyA9IGJhclcKCX0KCWZvciBpLCBtIDo9IHJhbmdlIGEubW9udGhzIHsKCQlzeCA6PSBjaGFydFggKyBpKnN0ZXAgKyAoc3RlcC1iYXJXLXN0cmlwZVcpLzIKCQltaWQgOj0gc3ggKyAoYmFyVytzdHJpcGVXKS8yCgkJYnggOj0gc3gKCQlpZiBzdHJpcGVXID4gMCB7CgkJCWJ4ID0gc3ggKyBzdHJpcGVXCgkJCWlmIG0ub3V0bGluZSA+IDAgewoJCQkJaCA6PSBtLm91dGxpbmUgKiBtYXhCYXIgLyBwZWFrCgkJCQlpZiBoID09IDAgewoJCQkJCWggPSAxCgkJCQl9CgkJCQlyZWN0KCZiLCBzeCwgYmFzZWxpbmUtaCwgc3RyaXBlVywgaCwgMCwgInVybCgjbykiKQoJCQl9CgkJfQoJCXRvcCwgdG90YWwgOj0gYmFzZWxpbmUsIDAKCQlmb3IgaiwgbiA6PSByYW5nZSBtLmNvdW50cyB7CgkJCWQgOj0gYS5kcmF3bihqLCBuKQoJCQloIDo9IGQgKiBtYXhCYXIgLyBwZWFrCgkJCWlmIGQgPiAwICYmIGggPT0gMCB7CgkJCQloID0gMQoJCQl9CgkJCWlmIGggPT0gMCB7CgkJCQljb250aW51ZQoJCQl9CgkJCXRvcCAtPSBoCgkJCWlmIGEuc2VyaWVzW2pdICE9IGEuc2NhbGVkIHsKCQkJCXRvdGFsICs9IG4KCQkJfQoJCQlyZWN0KCZiLCBieCwgdG9wLCBiYXJXLCBoLCAwLCBhLmZpbGwoaikpCgkJfQoJCWlmIHRvcCA9PSBiYXNlbGluZSB7CgkJCXJlY3QoJmIsIGJ4LCBiYXNlbGluZS0yLCBiYXJXLCAyLCAwLCAiIzJjNGEzZSIpCgkJfSBlbHNlIGlmIHRvdGFsID4gMCB7CgkJCXRleHQoJmIsIGJ4K2JhclcvMiwgdG9wLTUsICJuIiwgIiNmZmZmZmYiLCBzdHJjb252Lkl0b2EodG90YWwpKQoJCX0KCQl0ZXh0KCZiLCBtaWQsIGJhc2VsaW5lKzE4LCAibSIsICIjOWZjOWI0IiwgbS5sYWJlbCkKCX0KCWIuV3JpdGVTdHJpbmcoIjwvc3ZnPiIpCglhbHQgOj0gc3RyaW5ncy5Ub1VwcGVyKGEubm91bls6MV0pICsgYS5ub3VuWzE6XSArICIgcGVyIG1vbnRoLCBieSByZXBvc2l0b3J5IgoJcmV0dXJuICIhWyIgKyBhbHQgKyAiXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgKyBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcoW11ieXRlKGIuU3RyaW5nKCkpKSArICIpXG4iCn0KCi8vIFRoZSBjaGFydCBpcyB3cml0dGVuIHN0cmFpZ2h0IGludG8gb25lIGJ1aWxkZXI6IHAvbnQvc3ZnIGZvcm1hdHMgZWFjaAovLyBlbGVtZW50IHdpdGggdWZtdCBhbmQgYXBwZW5kcyBpdCB0byBhIGdyb3dpbmcgc3RyaW5nLCB3aGljaCBjb3N0IHRoaXMgcGFnZQovLyBjbG9zZSB0byBhIGJpbGxpb24gZ2FzLgoKZnVuYyByZWN0KGIgKnN0cmluZ3MuQnVpbGRlciwgeCwgeSwgdywgaCwgciBpbnQsIGZpbGwgc3RyaW5nKSB7CgliLldyaXRlU3RyaW5nKGA8cmVjdCB4PSJgICsgc3RyY29udi5JdG9hKHgpICsgYCIgeT0iYCArIHN0cmNvbnYuSXRvYSh5KSArIGAiIHdpZHRoPSJgICsgc3RyY29udi5JdG9hKHcpICsKCQlgIiBoZWlnaHQ9ImAgKyBzdHJjb252Lkl0b2EoaCkgKyBgIiByeD0iYCArIHN0cmNvbnYuSXRvYShyKSArIGAiIGZpbGw9ImAgKyBmaWxsICsgYCIvPmApCn0KCi8vIHRleHQgd3JpdGVzIHMgYXMgU1ZHIHRleHQ7IGNhbGxlcnMgcGFzcyByZXBvc2l0b3J5IG5hbWVzIGFuZCBudW1iZXJzLCBzbyBpdAovLyBlc2NhcGVzIHRoZSB0aHJlZSBjaGFyYWN0ZXJzIHRoYXQgY291bGQgYnJlYWsgdGhlIG1hcmt1cC4KZnVuYyB0ZXh0KGIgKnN0cmluZ3MuQnVpbGRlciwgeCwgeSBpbnQsIGNsYXNzLCBmaWxsLCBzIHN0cmluZykgewoJcyA9IHN0cmluZ3MuTmV3UmVwbGFjZXIoIiYiLCAiJmFtcDsiLCAiPCIsICImbHQ7IiwgIj4iLCAiJmd0OyIpLlJlcGxhY2UocykKCWIuV3JpdGVTdHJpbmcoYDx0ZXh0IHg9ImAgKyBzdHJjb252Lkl0b2EoeCkgKyBgIiB5PSJgICsgc3RyY29udi5JdG9hKHkpICsgYCIgY2xhc3M9ImAgKyBjbGFzcyArIGAiIGZpbGw9ImAgKyBmaWxsICsgYCI+YCArIHMgKyBgPC90ZXh0PmApCn0KCi8vIFRoZSBhcmVhIGNoYXJ0IGlzIGEgcmluZyBvZiBvbmUgbnVtYmVyIHBlciBhcmVhLCBmcm9tIHRoZSAiYXJlYXMiIHNlY3Rpb24sCi8vIHdoaWNoIHJlYWRzLCBsaW5lcyBzcGxpdCBieSAiOyI6Ci8vCi8vCXRpdGxlIHB1bGwgcmVxdWVzdHMgYnkgYXJlYQovLwlzdWJ0aXRsZSBtZXJnZWQgaW50byBnbm9sYW5nL2dubwovLwl1cGRhdGVkIDIwMjYtMDktMjQKLy8Jc2xpY2UgMjYgRG9jcwovLwlzbGljZSAxNyBHbm9WTQoKY29uc3QgYXJlYXNTbG90ID0gImFyZWFzIgoKdmFyIGFyZWFGaWxscyA9IFtdc3RyaW5neyIjM2RkYzk3IiwgIiM3YWEyZmYiLCAiI2MwODRmYyIsICIjZjQ3MmI2IiwgIiMyZGQ0YmYiLCAiI2ZiOTIzYyJ9Cgp0eXBlIHNsaWNlIHN0cnVjdCB7CglsYWJlbCBzdHJpbmcKCWNvdW50IGludAp9CgpmdW5jIHBhcnNlQXJlYXMoc3BlYyBzdHJpbmcpIChub3VuLCBzdWJ0aXRsZSwgdXBkYXRlZCBzdHJpbmcsIHNsaWNlcyBbXXNsaWNlKSB7Cglmb3IgXywgbGluZSA6PSByYW5nZSBzdHJpbmdzLlNwbGl0KHN0cmluZ3MuUmVwbGFjZUFsbChzcGVjLCAiXG4iLCAiOyIpLCAiOyIpIHsKCQlsaW5lID0gc3RyaW5ncy5UcmltU3BhY2UobGluZSkKCQlzd2l0Y2ggewoJCWNhc2Ugc3RyaW5ncy5IYXNQcmVmaXgobGluZSwgInRpdGxlICIpOgoJCQlub3VuID0gc3RyaW5ncy5UcmltU3BhY2UobGluZVs2Ol0pCgkJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChsaW5lLCAic3VidGl0bGUgIik6CgkJCXN1YnRpdGxlID0gc3RyaW5ncy5UcmltU3BhY2UobGluZVs5Ol0pCgkJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChsaW5lLCAidXBkYXRlZCAiKToKCQkJdXBkYXRlZCA9IGZvcm1hdERheShzdHJpbmdzLlRyaW1TcGFjZShsaW5lWzg6XSkpCgkJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChsaW5lLCAic2xpY2UgIik6CgkJCW4sIGxhYmVsLCBvayA6PSBzdHJpbmdzLkN1dChzdHJpbmdzLlRyaW1TcGFjZShsaW5lWzY6XSksICIgIikKCQkJYywgZXJyIDo9IHN0cmNvbnYuQXRvaShuKQoJCQlpZiBvayAmJiBlcnIgPT0gbmlsICYmIGMgPiAwICYmIHN0cmluZ3MuVHJpbVNwYWNlKGxhYmVsKSAhPSAiIiB7CgkJCQlzbGljZXMgPSBhcHBlbmQoc2xpY2VzLCBzbGljZXtzdHJpbmdzLlRyaW1TcGFjZShsYWJlbCksIGN9KQoJCQl9CgkJfQoJfQoJcmV0dXJuIG5vdW4sIHN1YnRpdGxlLCB1cGRhdGVkLCBzbGljZXMKfQoKLy8gcmVuZGVyQXJlYXMgZHJhd3MgdGhlICJhcmVhcyIgc2VjdGlvbiBhcyBhIHJpbmcsIG9yICIiIHdoZW4gaXQgaG9sZHMgbm8gc2xpY2UuCmZ1bmMgcmVuZGVyQXJlYXMoKSBzdHJpbmcgewoJbm91biwgc3VidGl0bGUsIHVwZGF0ZWQsIHNsaWNlcyA6PSBwYXJzZUFyZWFzKEdldChhcmVhc1Nsb3QpKQoJaWYgbGVuKHNsaWNlcykgPT0gMCB8fCBub3VuID09ICIiIHsKCQlyZXR1cm4gIiIKCX0KCXRvdGFsIDo9IDAKCWZvciBfLCBzIDo9IHJhbmdlIHNsaWNlcyB7CgkJdG90YWwgKz0gcy5jb3VudAoJfQoJY29uc3QgaGVpZ2h0LCBjeCwgY3ksIHIgPSAzMDAsIDE0MCwgMTkwLCA4MAoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKGA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjcyMCIgaGVpZ2h0PSIzMDAiIHZpZXdCb3g9IjAgMCA3MjAgMzAwIj5gKQoJYi5Xcml0ZVN0cmluZygiPHN0eWxlPi5oe2ZvbnQ6NzAwIDI2cHggc2Fucy1zZXJpZn0uc3tmb250OjEzcHggc2Fucy1zZXJpZn0udHtmb250OjcwMCAzNHB4IHNhbnMtc2VyaWY7dGV4dC1hbmNob3I6bWlkZGxlfSIgKwoJCSIuY3tmb250OjEzcHggc2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjptaWRkbGV9Lmx7Zm9udDoxNXB4IHNhbnMtc2VyaWZ9LnB7Zm9udDoxM3B4IHNhbnMtc2VyaWY7dGV4dC1hbmNob3I6ZW5kfSIgKwoJCSIudXtmb250OjEycHggc2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjplbmR9PC9zdHlsZT4iKQoJcmVjdCgmYiwgMCwgMCwgY2hhcnRXaWR0aCwgaGVpZ2h0LCAxMiwgIiMxMDIzMWMiKQoJdGV4dCgmYiwgY2hhcnRYLCA0MiwgImgiLCAiI2ZmZmZmZiIsIHN0cmluZ3MuVG9VcHBlcihub3VuWzoxXSkrbm91blsxOl0pCglpZiBzdWJ0aXRsZSAhPSAiIiB7CgkJdGV4dCgmYiwgY2hhcnRYLCA2NiwgInMiLCAiIzlmYzliNCIsIHN1YnRpdGxlKQoJfQoJaWYgdXBkYXRlZCAhPSAiIiB7CgkJdGV4dCgmYiwgY2hhcnRXaWR0aC1jaGFydFgsIDQyLCAidSIsICIjOWZjOWI0IiwgInVwZGF0ZWQgIit1cGRhdGVkKQoJfQoJLy8gRWFjaCBzbGljZSBpcyBhIGNpcmNsZSBzdHJva2Ugd2hvc2UgZGFzaCBjb3ZlcnMgaXRzIHNoYXJlIG9mIGEgcmluZwoJLy8gbWVhc3VyZWQgYXMgMTAwMCB1bml0cywgcm90YXRlZCBzbyB0aGUgZmlyc3Qgc2xpY2Ugc3RhcnRzIGF0IHRoZSB0b3AuCglzdGFydCA6PSAwCglmb3IgaSwgcyA6PSByYW5nZSBzbGljZXMgewoJCXNoYXJlIDo9IHMuY291bnQgKiAxMDAwIC8gdG90YWwKCQlpZiBpID09IGxlbihzbGljZXMpLTEgewoJCQlzaGFyZSA9IDEwMDAgLSBzdGFydAoJCX0KCQliLldyaXRlU3RyaW5nKGA8Y2lyY2xlIGN4PSJgICsgc3RyY29udi5JdG9hKGN4KSArIGAiIGN5PSJgICsgc3RyY29udi5JdG9hKGN5KSArIGAiIHI9ImAgKyBzdHJjb252Lkl0b2EocikgKwoJCQlgIiBmaWxsPSJub25lIiBzdHJva2U9ImAgKyBhcmVhRmlsbHNbaSVsZW4oYXJlYUZpbGxzKV0gKyBgIiBzdHJva2Utd2lkdGg9IjM0IiBwYXRoTGVuZ3RoPSIxMDAwImAgKwoJCQlgIHN0cm9rZS1kYXNoYXJyYXk9ImAgKyBzdHJjb252Lkl0b2Eoc2hhcmUpICsgYCAxMDAwIiBzdHJva2UtZGFzaG9mZnNldD0iYCArIHN0cmNvbnYuSXRvYSgtc3RhcnQpICsKCQkJYCIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIGAgKyBzdHJjb252Lkl0b2EoY3gpICsgYCBgICsgc3RyY29udi5JdG9hKGN5KSArIGApIi8+YCkKCQlzdGFydCArPSBzaGFyZQoJfQoJdGV4dCgmYiwgY3gsIGN5KzgsICJ0IiwgIiNmZmZmZmYiLCBzdHJjb252Lkl0b2EodG90YWwpKQoJdGV4dCgmYiwgY3gsIGN5KzI4LCAiYyIsICIjOWZjOWI0IiwgIm1lcmdlZCIpCglmb3IgaSwgcyA6PSByYW5nZSBzbGljZXMgewoJCXkgOj0gMTMwICsgaSozMAoJCXJlY3QoJmIsIDI4MCwgeS0xMiwgMTQsIDE0LCAzLCBhcmVhRmlsbHNbaSVsZW4oYXJlYUZpbGxzKV0pCgkJdGV4dCgmYiwgMzA0LCB5LCAibCIsICIjZmZmZmZmIiwgcy5sYWJlbCkKCQl0ZXh0KCZiLCBjaGFydFdpZHRoLWNoYXJ0WC02MCwgeSwgInAiLCAiI2ZmZmZmZiIsIHN0cmNvbnYuSXRvYShzLmNvdW50KSkKCQl0ZXh0KCZiLCBjaGFydFdpZHRoLWNoYXJ0WCwgeSwgInAiLCAiIzlmYzliNCIsIHN0cmNvbnYuSXRvYShzLmNvdW50KjEwMC90b3RhbCkrIiUiKQoJfQoJYi5Xcml0ZVN0cmluZygiPC9zdmc+IikKCXJldHVybiAiIVsiICsgbWRUZXh0KHN0cmluZ3MuVG9VcHBlcihub3VuWzoxXSkrbm91blsxOl0rIiwgIitzdWJ0aXRsZSkgKyAiXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgKyBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcoW11ieXRlKGIuU3RyaW5nKCkpKSArICIpXG4iCn0KGrY0Cg9jaGFydHNfdGVzdC5nbm8SojRwYWNrYWdlIGhvbWUKCmltcG9ydCAoCgkiZW5jb2RpbmcvYmFzZTY0IgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCmZ1bmMgVGVzdFBhcnNlQWN0aXZpdHkodCAqdGVzdGluZy5UKSB7CglhIDo9IHBhcnNlQWN0aXZpdHkoInRpdGxlIHJldmlld3M7IHNlcmllcyBnbm9sYW5nL2dubyxQZWVyIERldjsgc2NhbGUgUGVlciBEZXYsMTAsY29tbWl0czsgc2NhbGUgYmFkXG4iICsKCQkiMjAyNS0xMiAzIDIxOyAyMDI2LTAxIDAgMDsgYmFkOyAyMDI2LTEzIDEgMTsgMjAyNi0wMiB4IDE7IDIwMjYtMDIgNTsgMjAyNi0wMiA1IDIiKQoJdWFzc2VydC5FcXVhbCh0LCAicmV2aWV3cyIsIGEubm91bikKCXVhc3NlcnQuRXF1YWwodCwgIlBlZXIgRGV2IiwgYS5zY2FsZWQpCgl1YXNzZXJ0LkVxdWFsKHQsIDEwLCBhLnNjYWxlRGl2KQoJdWFzc2VydC5FcXVhbCh0LCAiY29tbWl0cyIsIGEuc2NhbGVVbml0KQoJdWFzc2VydC5FcXVhbCh0LCAzLCBsZW4oYS5tb250aHMpKQoJdWFzc2VydC5FcXVhbCh0LCAiRGVjIDI1IiwgYS5tb250aHNbMF0ubGFiZWwpCgl1YXNzZXJ0LkVxdWFsKHQsIDIxLCBhLm1vbnRoc1swXS5jb3VudHNbMV0pCgl1YXNzZXJ0LkVxdWFsKHQsIDMsIGEuZHJhd24oMSwgMjEpKSAvLyByb3VuZGVkIHVwCgl1YXNzZXJ0LkVxdWFsKHQsIDMsIGEuZHJhd24oMCwgMykpICAvLyBhbiB1bnNjYWxlZCBzZXJpZXMgZHJhd3MgaXRzIGNvdW50Cgl1YXNzZXJ0LkVxdWFsKHQsICJKYW4gMjYiLCBhLm1vbnRoc1sxXS5sYWJlbCkKCXVhc3NlcnQuRXF1YWwodCwgIkZlYiIsIGEubW9udGhzWzJdLmxhYmVsKQoJdWFzc2VydC5FcXVhbCh0LCAyLCBhLm1vbnRoc1syXS5jb3VudHNbMV0pCgoJYiA6PSBwYXJzZUFjdGl2aXR5KCJ0aXRsZSB4OyBzZXJpZXMgYTsgb3V0bGluZSBvcGVuZWQ7IHVwZGF0ZWQgMjAyNi0wOS0yNDsgIiArCgkJIjIwMjYtMDEgMSB8IDg7IDIwMjYtMDIgMiB8OyAyMDI2LTAzIDMgfCB5OyAyMDI2LTA0IDQiKQoJdWFzc2VydC5FcXVhbCh0LCAib3BlbmVkIiwgYi5vdXRsaW5lKQoJdWFzc2VydC5FcXVhbCh0LCAiMjQgU2VwIDIwMjYiLCBiLnVwZGF0ZWQpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGxlbihiLm1vbnRocykpIC8vICJ8IiB3aXRoIG5vIGNvdW50IGFuZCBhIG5vbi1udW1iZXIgYXJlIHJlamVjdGVkCgl1YXNzZXJ0LkVxdWFsKHQsIDgsIGIubW9udGhzWzBdLm91dGxpbmUpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGIubW9udGhzWzFdLm91dGxpbmUpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBmb3JtYXREYXkoIjIwMjYtMTMtMDEiKSkKfQoKZnVuYyBUZXN0RmlsbEtlZXBzUmVwb0NvbG91cih0ICp0ZXN0aW5nLlQpIHsKCS8vIGdub2Rhb2tpdCBrZWVwcyBpdHMgY29sb3VyIHdoZXJldmVyIGl0IHNpdHMgaW4gYSBjaGFydCdzIHNlcmllcy4KCWEgOj0gYWN0aXZpdHl7c2VyaWVzOiBbXXN0cmluZ3siZ25vbGFuZy9nbm8iLCAiZ25vZGFva2l0In19CgliIDo9IGFjdGl2aXR5e3NlcmllczogW11zdHJpbmd7Imdub2Rhb2tpdCJ9fQoJdWFzc2VydC5FcXVhbCh0LCByZXBvRmlsbHNbImdub2Rhb2tpdCJdLCBhLmZpbGwoMSkpCgl1YXNzZXJ0LkVxdWFsKHQsIHJlcG9GaWxsc1siZ25vZGFva2l0Il0sIGIuZmlsbCgwKSkKCWMgOj0gYWN0aXZpdHl7c2VyaWVzOiBbXXN0cmluZ3sidW5saXN0ZWQtcmVwbyIsICJPdGhlcnMifX0KCXVhc3NlcnQuRXF1YWwodCwgYy5maWxsKDApLCBjLmZpbGwoMCkpCgl1YXNzZXJ0LkVxdWFsKHQsIG90aGVyc0ZpbGwsIGMuZmlsbCgxKSkKfQoKZnVuYyBkZWNvZGVDaGFydCh0ICp0ZXN0aW5nLlQsIG91dCwgYWx0IHN0cmluZykgc3RyaW5nIHsKCXByZWZpeCA6PSAiIVsiICsgYWx0ICsgIl0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwiCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5IYXNQcmVmaXgob3V0LCBwcmVmaXgpLCAicHJlZml4IG9mICIrYWx0KQoJcmF3LCBlcnIgOj0gYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZVN0cmluZyhzdHJpbmdzLlRyaW1TdWZmaXgob3V0W2xlbihwcmVmaXgpOl0sICIpXG4iKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBlcnIpCglyZXR1cm4gc3RyaW5nKHJhdykKfQoKZnVuYyBUZXN0Q2hhcnRzKHQgKnRlc3RpbmcuVCkgewoJcHJzIDo9IGRlY29kZUNoYXJ0KHQsIHJlbmRlckNoYXJ0KGFjdGl2aXR5U2xvdCksICJNZXJnZWQgcHVsbCByZXF1ZXN0cyBwZXIgbW9udGgsIGJ5IHJlcG9zaXRvcnkiKQoJZm9yIF8sIHdhbnQgOj0gcmFuZ2UgW11zdHJpbmd7CgkJIj4xMDQgbWVyZ2VkIHB1bGwgcmVxdWVzdHM8L3RleHQ+IiwgIj5nbm9sYW5nL2dubyA3MDwvdGV4dD4iLCAiPmdub2Rhb2tpdCA2PC90ZXh0PiIsCgkJIj5PdGhlcnMgMTc8L3RleHQ+IiwgIj5QZWVyIERldiAyMzQgY29tbWl0cywgZHJhd24gMSBwZXIgMTA8L3RleHQ+IiwgIj5NYXkgMjU8L3RleHQ+IiwKCQkiPkphbiAyNjwvdGV4dD4iLCAiPjIzPC90ZXh0PiIsIC8vIEp1bmUgMjAyNjogMTYgKyA2ICsgMQoJCSI+NTwvdGV4dD4iLCAvLyBKdWx5IDIwMjUgY291bnRzIGl0cyA1IHB1bGwgcmVxdWVzdHMgYW5kIG5vdCBpdHMgNDggY29tbWl0cwoJfSB7CgkJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocHJzLCB3YW50KSwgInB1bGwgcmVxdWVzdHMgY2hhcnQ6ICIrd2FudCkKCX0KCS8vIE9uZSBhbWJlciBiYXIgcGVyIG1vbnRoIHdpdGggUGVlciBEZXYgY29tbWl0cywgTWF5IHRvIE5vdmVtYmVyIDIwMjUsIHBsdXMgdGhlIGxlZ2VuZCdzLgoJdWFzc2VydC5FcXVhbCh0LCA4LCBzdHJpbmdzLkNvdW50KHBycywgYGZpbGw9IiNmYmJmMjQiYCkpCgkvLyBPbmUgc3RyaXBlZCBiYXIgcGVyIG1vbnRoIHdpdGggb3BlbmVkIHB1bGwgcmVxdWVzdHMsIHBsdXMgdGhlIGxlZ2VuZCdzLgoJdWFzc2VydC5FcXVhbCh0LCAxNSwgc3RyaW5ncy5Db3VudChwcnMsIGBmaWxsPSJ1cmwoI28pImApKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocHJzLCAiPmdub2xhbmcvZ25vIHB1bGwgcmVxdWVzdHMgb3BlbmVkIDEzMTwvdGV4dD4iKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBycywgIj51cGRhdGVkIDI0IFNlcCAyMDI2PC90ZXh0PiIpKQoKCXJldnMgOj0gZGVjb2RlQ2hhcnQodCwgcmVuZGVyQ2hhcnQocmV2aWV3QWN0aXZpdHlTbG90KSwgIlJldmlld3MgcGVyIG1vbnRoLCBieSByZXBvc2l0b3J5IikKCWZvciBfLCB3YW50IDo9IHJhbmdlIFtdc3RyaW5neyI+NDA0IHJldmlld3M8L3RleHQ+IiwgIj5nbm9sYW5nL2dubyAzNTc8L3RleHQ+IiwgIj5PdGhlcnMgNDc8L3RleHQ+IiwgIj5wZXIgbW9udGgsIG9uIHRoZSBzYW1lIHJlcG9zaXRvcmllczwvdGV4dD4ifSB7CgkJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocmV2cywgd2FudCksICJyZXZpZXdzIGNoYXJ0OiAiK3dhbnQpCgl9Cgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMocmV2cywgIiNmYmJmMjQiKSkKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhyZXZzLCAiPmdub2xvdmUiKSkKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhyZXZzLCBgZmlsbD0idXJsKCNvKSJgKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHJldnMsICI+dXBkYXRlZCAyNCBTZXAgMjAyNjwvdGV4dD4iKSkKCglwYWdlIDo9IFJlbmRlcigiIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkluZGV4KHBhZ2UsICJNZXJnZWQgcHVsbCByZXF1ZXN0cyBwZXIgbW9udGgiKSA8IHN0cmluZ3MuSW5kZXgocGFnZSwgIlJldmlld3MgcGVyIG1vbnRoIikpCn0KCmZ1bmMgVGVzdENoYXJ0RW1wdHkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJb2xkIDo9IEdldChhY3Rpdml0eVNsb3QpCglTZXQoY3Jvc3MoY3VyKSwgYWN0aXZpdHlTbG90LCAiIikKCXVhc3NlcnQuRXF1YWwodCwgIiIsIHJlbmRlckNoYXJ0KGFjdGl2aXR5U2xvdCkpCglTZXQoY3Jvc3MoY3VyKSwgYWN0aXZpdHlTbG90LCBvbGQpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInJlc2VydmVkIHNlY3Rpb246IGJhbm5lciIsIGZ1bmMoKSB7IFNldChjcm9zcyhjdXIpLCAiYmFubmVyIiwgIngiKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJyZXNlcnZlZCBzZWN0aW9uOiByZXZpZXdzIiwgZnVuYygpIHsgU2V0KGNyb3NzKGN1ciksICJyZXZpZXdzIiwgIngiKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJyZXNlcnZlZCBzZWN0aW9uOiBoZXJvIiwgZnVuYygpIHsgU2V0KGNyb3NzKGN1ciksICJoZXJvIiwgIngiKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJyZXNlcnZlZCBzZWN0aW9uOiBhcmVhY2hhcnQiLCBmdW5jKCkgeyBTZXQoY3Jvc3MoY3VyKSwgImFyZWFjaGFydCIsICJ4IikgfSkKfQoKZnVuYyBUZXN0QXJlYXModCAqdGVzdGluZy5UKSB7Cglub3VuLCBzdWJ0aXRsZSwgdXBkYXRlZCwgc2xpY2VzIDo9IHBhcnNlQXJlYXMoInRpdGxlIHg7IHN1YnRpdGxlIHk7IHVwZGF0ZWQgMjAyNi0wOS0yNDsgc2xpY2UgMyBEb2NzOyBzbGljZSAwIEVtcHR5OyBzbGljZSB5IEJhZDsgc2xpY2UgMiBDaGFpbjogdG0yLCBjb25zZW5zdXMiKQoJdWFzc2VydC5FcXVhbCh0LCAieCIsIG5vdW4pCgl1YXNzZXJ0LkVxdWFsKHQsICJ5Iiwgc3VidGl0bGUpCgl1YXNzZXJ0LkVxdWFsKHQsICIyNCBTZXAgMjAyNiIsIHVwZGF0ZWQpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGxlbihzbGljZXMpKQoJdWFzc2VydC5FcXVhbCh0LCAiQ2hhaW46IHRtMiwgY29uc2Vuc3VzIiwgc2xpY2VzWzFdLmxhYmVsKQoKCXJpbmcgOj0gZGVjb2RlQ2hhcnQodCwgcmVuZGVyQXJlYXMoKSwgIlB1bGwgcmVxdWVzdHMgYnkgYXJlYSwgbWVyZ2VkIGludG8gZ25vbGFuZy9nbm8iKQoJZm9yIF8sIHdhbnQgOj0gcmFuZ2UgW11zdHJpbmd7Ij43MDwvdGV4dD4iLCAiPlB1bGwgcmVxdWVzdHMgYnkgYXJlYTwvdGV4dD4iLCAiPm1lcmdlZCBpbnRvIGdub2xhbmcvZ25vPC90ZXh0PiIsICI+RG9jczwvdGV4dD4iLCAiPjI2PC90ZXh0PiIsICI+MzclPC90ZXh0PiIsICI+dXBkYXRlZCAyNCBTZXAgMjAyNjwvdGV4dD4ifSB7CgkJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocmluZywgd2FudCksICJhcmVhIHJpbmc6ICIrd2FudCkKCX0KCS8vIFRoZSBzaGFyZXMgYWRkIHVwIHRvIHRoZSB3aG9sZSByaW5nLCB0aGUgbGFzdCBvbmUgdGFraW5nIHRoZSByb3VuZGluZy4KCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHJpbmcsIGBzdHJva2UtZGFzaGFycmF5PSIzNzEgMTAwMCIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiYCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhyaW5nLCBgc3Ryb2tlLWRhc2hvZmZzZXQ9Ii05NDEiYCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhyaW5nLCBgc3Ryb2tlLWRhc2hhcnJheT0iNTkgMTAwMCJgKSkKfQoKZnVuYyBUZXN0SGVhcnRzV2FsbChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaGVhcnRzID0gYXZsLk5ld1RyZWUoKQoJd2FsbCA6PSBkZWNvZGVDaGFydCh0LCByZW5kZXJIZWFydHNXYWxsKCksICIwIGhlYXJ0cyIpCgl1YXNzZXJ0LkVxdWFsKHQsIHdhbGxDb2xzLCBzdHJpbmdzLkNvdW50KHdhbGwsIGA8dXNlIGhyZWY9IiNoImApKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBzdHJpbmdzLkNvdW50KHdhbGwsIGBmaWxsPSIjZTYzOTQ2ImApKQoJZm9yIGkgOj0gMDsgaSA8IDI1OyBpKysgewoJCWhlYXJ0cy5TZXQodGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJmYW4iK3N0cmNvbnYuSXRvYShpKSkuU3RyaW5nKCksIGludDY0KGkpKQoJfQoJd2FsbCA9IGRlY29kZUNoYXJ0KHQsIHJlbmRlckhlYXJ0c1dhbGwoKSwgIjI1IGhlYXJ0cyIpCgl1YXNzZXJ0LkVxdWFsKHQsIDIqd2FsbENvbHMsIHN0cmluZ3MuQ291bnQod2FsbCwgYDx1c2UgaHJlZj0iI2giYCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDI1LCBzdHJpbmdzLkNvdW50KHdhbGwsIGBmaWxsPSIjZTYzOTQ2ImApKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHdhbGwsICJtb3JlPC90ZXh0PiIpKQoJZm9yIGkgOj0gMjU7IGkgPCAyNTA7IGkrKyB7CgkJaGVhcnRzLlNldCh0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImZhbiIrc3RyY29udi5JdG9hKGkpKS5TdHJpbmcoKSwgaW50NjQoaSkpCgl9Cgl3YWxsID0gZGVjb2RlQ2hhcnQodCwgcmVuZGVySGVhcnRzV2FsbCgpLCAiMjUwIGhlYXJ0cyIpCgl1YXNzZXJ0LkVxdWFsKHQsIHdhbGxDb2xzKndhbGxNYXhSb3dzLCBzdHJpbmdzLkNvdW50KHdhbGwsIGBmaWxsPSIjZTYzOTQ2ImApKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMod2FsbCwgIj5hbmQgMTAgbW9yZTwvdGV4dD4iKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHdhbGwsIGA8dGV4dCB4PSIzNDgiIHk9IjMxNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzlmYzliNCIgc3R5bGU9ImZvbnQ6MTNweCBzYW5zLXNlcmlmIj5hbmQgMTAgbW9yZTwvdGV4dD5gKSkKCWhlYXJ0cyA9IGF2bC5OZXdUcmVlKCkKfQoamCgKC2NvbnRlbnQuZ25vEogocGFja2FnZSBob21lCgovLyBoZXJvIGhvbGRzIHRoZSBiYW5uZXIgdGV4dCBhICJoZXJvdGV4dCIgc2VjdGlvbiBsZWF2ZXMgb3V0Lgp2YXIgaGVybyA9IGhlcm9UZXh0ewoJa2lja2VyOiAgICJTQU1PVVJBw48gQ09PUCDCtyBHTk8uTEFORCIsCgl0aXRsZTogICAgIkRhdmlkIEcuIiwKCXN1YnRpdGxlOiAiRGV2ZWxvcGVyIGVuZ2luZWVyIGF0IFNhbW91cmHDryBDb29wIiwKCXRhZ2xpbmU6ICAiIiwKCWZvb3RsaW5lOiAiZ25vLmxhbmQgY29yZSBjb250cmlidXRvciIsCglhbHQ6ICAgICAgIkRhdmlkIEcuLCBkZXZlbG9wZXIgZW5naW5lZXIgYXQgU2Ftb3VyYcOvIENvb3AiLAp9CgovLyBkZWZhdWx0U2xvdHMgc2VlZHMgdGhlIHBhZ2UgYXQgZGVwbG95IHRpbWUuIExhdGVyIGVkaXRzIGdvIHRocm91Z2ggU2V0Lgp2YXIgZGVmYXVsdFNsb3RzID0gW11zdHJ1Y3R7IG5hbWUsIGJvZHkgc3RyaW5nIH17Cgl7Im9yZGVyIiwgImhlcm8saGVhZGVyLGFjdGl2aXR5aGVhZCxiYW5uZXIscmV2aWV3cyxnbm8sYXJlYWNoYXJ0LHByb2plY3RzLHBlZXJkZXYsdW5yZWxhdGVkLGdhbWUsaGVhcnRzIn0sCgl7ImFjdGl2aXR5aGVhZCIsICIjIyBBY3Rpdml0eSJ9LAoJe2hlcm9TbG90LCAia2lja2VyIFNBTU9VUkHDjyBDT09QIMK3IEdOTy5MQU5EOyB0aXRsZSBEYXZpZCBHLjsgc3VidGl0bGUgRGV2ZWxvcGVyIGVuZ2luZWVyIGF0IFNhbW91cmHDryBDb29wOyBmb290bGluZSBnbm8ubGFuZCBjb3JlIGNvbnRyaWJ1dG9yOyBhbHQgRGF2aWQgRy4sIGRldmVsb3BlciBlbmdpbmVlciBhdCBTYW1vdXJhw68gQ29vcCJ9LAoJeyJhcmVhcyIsICJ0aXRsZSBwdWxsIHJlcXVlc3RzIGJ5IGFyZWE7IHN1YnRpdGxlIG1lcmdlZCBpbnRvIGdub2xhbmcvZ25vOyB1cGRhdGVkIDIwMjYtMDktMjQ7IHNsaWNlIDI2IERvY3M7IHNsaWNlIDE3IEdub1ZNOyBzbGljZSAxNCBFeGFtcGxlcyBhbmQgcmVhbG1zOyBzbGljZSA5IENoYWluOiB0bTIsIGNvbnNlbnN1cywgcGFja2FnZSBsb2FkaW5nOyBzbGljZSA0IFRvb2xzOiBnbm93ZWIsIGdub2tleSwgZ25vZGV2In0sCgl7ImFjdGl2aXR5IiwgInRpdGxlIG1lcmdlZCBwdWxsIHJlcXVlc3RzOyBzdWJ0aXRsZSBwZXIgbW9udGgsIG9uIHB1YmxpYyBnbm8ubGFuZCByZXBvc2l0b3JpZXM7IHNlcmllcyBnbm9sYW5nL2dubyxnbm8tb25ib2FyZGluZy1ib3QsZ25vZGFva2l0LGF3ZXNvbWUtZ25vLE90aGVycyxQZWVyIERldjsgc2NhbGUgUGVlciBEZXYsMTAsY29tbWl0czsgb3V0bGluZSBnbm9sYW5nL2dubyBwdWxsIHJlcXVlc3RzIG9wZW5lZDsgdXBkYXRlZCAyMDI2LTA5LTI0OyAyMDI1LTA1IDAgMCAwIDAgMCAyNSB8IDA7IDIwMjUtMDYgMCAwIDAgMCAwIDg3IHwgMjsgMjAyNS0wNyA0IDAgMCAwIDEgNDggfCAzOyAyMDI1LTA4IDAgMCA1IDAgMyAyNyB8IDA7IDIwMjUtMDkgNCAwIDAgMCAwIDE0IHwgOTsgMjAyNS0xMCAxIDAgMCAwIDUgMTUgfCAwOyAyMDI1LTExIDEgMCAxIDAgMSAxOCB8IDc7IDIwMjUtMTIgMSAwIDAgMCAwIDAgfCA3OyAyMDI2LTAxIDEgMCAwIDAgMCAwIHwgODsgMjAyNi0wMiA2IDAgMCAwIDAgMCB8IDExOyAyMDI2LTAzIDUgMCAwIDAgMCAwIHwgMjE7IDIwMjYtMDQgMTIgMCAwIDAgMiAwIHwgMTc7IDIwMjYtMDUgNyAwIDAgMCAxIDAgfCAxOTsgMjAyNi0wNiAxNiA2IDAgMCAxIDAgfCA3OyAyMDI2LTA3IDggMCAwIDUgMCAwIHwgMTU7IDIwMjYtMDggMiAwIDAgMCAwIDAgfCAzOyAyMDI2LTA5IDIgMCAwIDAgMyAwIHwgMiJ9LAoJeyJyZXZpZXdhY3Rpdml0eSIsICJ0aXRsZSByZXZpZXdzOyBzdWJ0aXRsZSBwZXIgbW9udGgsIG9uIHRoZSBzYW1lIHJlcG9zaXRvcmllczsgc2VyaWVzIGdub2xhbmcvZ25vLE90aGVyczsgdXBkYXRlZCAyMDI2LTA5LTI0OyAyMDI1LTA1IDAgMTsgMjAyNS0wNiAwIDA7IDIwMjUtMDcgMCAwOyAyMDI1LTA4IDAgMTE7IDIwMjUtMDkgMTEgNzsgMjAyNS0xMCAyIDEzOyAyMDI1LTExIDUgMTsgMjAyNS0xMiAxMyAwOyAyMDI2LTAxIDI0IDA7IDIwMjYtMDIgMzIgMjsgMjAyNi0wMyA0NyAwOyAyMDI2LTA0IDMwIDE7IDIwMjYtMDUgMzQgMDsgMjAyNi0wNiA0OSA1OyAyMDI2LTA3IDUxIDE7IDIwMjYtMDggMzUgMDsgMjAyNi0wOSAyNCA1In0sCgl7ImhlYWRlciIsIGBJJ20gYSBkZXZlbG9wZXIgZW5naW5lZXIgYXQgW1NhbW91cmHDryBDb29wXShodHRwczovL3d3dy5zYW1vdXJhaS53b3JsZC8pLCBpbiBbc2FtY3Jld10oL3Uvc2FtY3JldyksIGFuZCBhbiBbRXBpdGVjaF0oaHR0cHM6Ly93d3cuZXBpdGVjaC5ldS8pIGdyYWR1YXRlLgoKQ29udHJpYnV0aW5nIHRvIGduby5sYW5kIHNpbmNlIE1heSAyMDI1LiBHbm9WTSBhbmQgY2hhaW4gZml4ZXMsIGRvY3MgaW5jbHVkaW5nIHRoZSBnZXR0aW5nIHN0YXJ0ZWQgZ3VpZGUsIGFuZCBQZWVyIERldiB0dXRvcmlhbHMuIEknbSBwYXNzaW9uYXRlIGFib3V0IFAyUCwgbG93IGxldmVsIHByb2dyYW1taW5nLCB0cmF2ZWxsaW5nLCB1cmJhbmlzbSBhbmQgdHJhbnNwb3J0YXRpb24uIEknbSBhIGN1cmlvdXMgcGVyc29uIHdobyB3YW50cyB0byBjb250cmlidXRlIHRvIHRoZSBncmVhdGVyIGdvb2QuIE9wZW4gZm9yIGNvbnRyaWJ1dGlvbiEg8J+ZggoKW0dpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2RhdmQtZ3psKSDCtyBbUGVlciBEZXYgb24gWW91VHViZV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vQHBlZXJkZXZsZWFybmluZykgwrcgW1BlcnNvbmFsIHdpa2ldKGh0dHBzOi8vZGF2ZC1nemwuZ2l0aHViLmlvL3BlcnNvbmFsLXdpa2kvKWB9LAoJeyJnbm8iLCBgIyMgR25vIGNvcmUKCk1vc3Qgb2YgbXkgd29yayBnb2VzIGludG8gW2dub2xhbmcvZ25vXShodHRwczovL2dpdGh1Yi5jb20vZ25vbGFuZy9nbm8pLCB0aGUgW2duby5sYW5kXShodHRwczovL2duby5sYW5kKSBtb25vcmVwby4gW0FsbCBteSBtZXJnZWQgcHVsbCByZXF1ZXN0cyBhcmUgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ25vbGFuZy9nbm8vcHVsbHM/cT1pcyUzQXByK2F1dGhvciUzQWRhdmQtZ3psK2lzJTNBbWVyZ2VkKS5gfSwKCXsicHJvamVjdHMiLCBgIyMgUHJvamVjdHMKCnwgUHJvamVjdCB8IFdoYXQgSSBkaWQgfAp8IC0tLSB8IC0tLSB8CnwgW0dub1ZNLCBleHBsYWluZWRdKGh0dHBzOi8vc2Ftb3VyYWl3b3JsZC5naXRodWIuaW8vZ25vLWFnZW50LXdvcmtzcGFjZS8pIHwgSSB3cm90ZSBhIGd1aWRlIHRvIGhvdyB0aGUgR25vVk0gd29ya3MsIGZvciBHbyBkZXZlbG9wZXJzIHdobyBoYXZlIG5ldmVyIG9wZW5lZCBpdDogcGFyc2luZywgdHlwZS1jaGVja2luZywgdGhlIHByZXByb2Nlc3MgcGFzcywgdGhlIHN0YWNrIG1hY2hpbmUsIHJlYWxtIHN0b3JhZ2UgYW5kIGdhcy4gfAp8IFtnbm9kYW9raXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9zYW1vdXJhaXdvcmxkL2dub2Rhb2tpdCkgfCBBIHRvb2xraXQgZm9yIGJ1aWxkaW5nIERBT3Mgb24gZ25vLmxhbmQuIFtJIGNvbnRyaWJ1dGVkXShodHRwczovL2dpdGh1Yi5jb20vc2Ftb3VyYWl3b3JsZC9nbm9kYW9raXQvcHVsbHM/cT1pcyUzQXByK2F1dGhvciUzQWRhdmQtZ3psK2lzJTNBbWVyZ2VkKSBkb2N1bWVudGF0aW9uLCBjb250cmlidXRvciBpbnN0cnVjdGlvbnMgYW5kIGEgZ3VpZGVkIHNldHVwIGZvciB0aGUgZGVtbyBEQU8uIHwKfCBbYXdlc29tZS1nbm9dKGh0dHBzOi8vZ2l0aHViLmNvbS9nbm92ZXJzZS9hd2Vzb21lLWdubykgfCBUaGUgY3VyYXRlZCBsaXN0IG9mIGduby5sYW5kIHJlc291cmNlcy4gW0kgY29udHJpYnV0ZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9nbm92ZXJzZS9hd2Vzb21lLWduby9wdWxscz9xPWlzJTNBcHIrYXV0aG9yJTNBZGF2ZC1nemwraXMlM0FtZXJnZWQpIG5ldyBlbnRyaWVzLCBQZWVyIERldiwgci9kb2NzIGFuZCB0eC1leHBvcnRzIGFtb25nIHRoZW0sIGFuZCBhIGNsZWFudXAgb2YgbW92ZWQgbGlua3MgYW5kIG91dGRhdGVkIHR1dG9yaWFscy4gfGB9LAoJeyJ1bnJlbGF0ZWQiLCBgIyMgVW5yZWxhdGVkIHByb2plY3RzCgpQZXJzb25hbCBwcm9qZWN0cyBvdXRzaWRlIGduby5sYW5kLgoKfCBQcm9qZWN0IHwgV2hhdCBpdCBpcyB8CnwgLS0tIHwgLS0tIHwKfCBbTUFYLUZpbmRlcl0oaHR0cHM6Ly9vZmZ3YXJlLWFwcHMuZ2l0aHViLmlvL01BWC1GaW5kZXIvKSAoV0lQKSB8IEFuIG9wZW4tc291cmNlIGZpbmRlciBmb3IgYm9va2FibGUgTUFYIEpFVU5FIGFuZCBNQVggU0VOSU9SIHRyYWluIHNlYXRzLCBidWlsdCBvbiBTTkNGIG9wZW4gZGF0YS4gfAp8IFtQb3N0Y2FyZHNdKGh0dHBzOi8vb2Zmd2FyZS1hcHBzLmdpdGh1Yi5pby9Qb3N0Y2FyZHMvKSAoV0lQKSB8IEEgbWFwIG9mIGV2ZXJ5IHBsYWNlIHlvdSBoYXZlIGJlZW4sIGtlcHQgcHJpdmF0ZSBhbmQgb2ZmbGluZSBpbiBvbmUgZmlsZSB5b3Ugb3duLiB8YH0sCgl7InBlZXJkZXYiLCBgIyMgUGVlciBEZXYKCkkgdGVhY2ggZ25vLmxhbmQgb24gW1BlZXIgRGV2XShodHRwczovL3d3dy55b3V0dWJlLmNvbS9AcGVlcmRldmxlYXJuaW5nKSwgYSBZb3VUdWJlIGNoYW5uZWwgb2YgZGV2ZWxvcGVyIHR1dG9yaWFscywgZnJvbSBhbiBlbXB0eSBtYWNoaW5lIHRvIEdvdkRBTy4gW1dhdGNoIHRoZSBnbm8ubGFuZCBwbGF5bGlzdF0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vcGxheWxpc3Q/bGlzdD1QTEpaclFpa3lmTWMta0JvalhnQW9qT3o0VVFQdXE0RGlZKS4KClRoZSB2aWRlb3MgZGF0ZSBmcm9tIDIwMjUsIHNvIHNvbWUgY29tbWFuZHMgYW5kIHNjcmVlbnMgYXJlIG91dCBvZiBkYXRlLiBUaGUgbWFpbiBpZGVhcyBzdGlsbCBob2xkLgoKLSBbRGVwbG95aW5nIEdubyBQYWNrYWdlc10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1CN2JTcmVDd0lscykKLSBbQ3JlYXRlIHlvdXIgZmlyc3QgZEFwcF0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj16NVF0YzBOdXlxZykKLSBbR292ZXJuYW5jZSBEQU8gKEdvdkRBTyldKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9ak0tNmV6eW5fdjQpCi0gW0ludGVycmVhbG0gc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1KSmp1Ny1HZVJiQSkKLSBbR25vIFZTIFNvbGlkaXR5XShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PU9pNzdodkpDVmJVKWB9LAp9ChpuCgtnbm9tb2QudG9tbBJfbW9kdWxlID0gImduby5sYW5kL3IvZzFyYXlmZ2tsd2wwYXNwejQ4OHd2cmNydnQ3dDJxdXk2cTA2bGdrMi9ob21lIgpnbm8gPSAiMC45Igpwcml2YXRlID0gdHJ1ZQoatRAKCmhlYXJ0cy5nbm8SphBwYWNrYWdlIGhvbWUKCmltcG9ydCAoCgkiZW5jb2RpbmcvYmFzZTY0IgoJInN0cmNvbnYiCgkic3RyaW5ncyIKKQoKLy8gVGhlIGhlYXJ0cyB3YWxsIGRyYXdzIG9uZSByZWQgaGVhcnQgcGVyIGFkZHJlc3MgdGhhdCBzZW50IG9uZSwgcm93IGJ5IHJvdywKLy8gd2l0aCB0aGUgc2xvdHMgc3RpbGwgZnJlZSBpbiB0aGUgbGFzdCByb3cgbGVmdCBhcyBvdXRsaW5lcy4gUGFzdAovLyB3YWxsQ29scyp3YWxsTWF4Um93cyBoZWFydHMgdGhlIHdhbGwgc3RheXMgZnVsbCBhbmQgYSBsaW5lIHVuZGVyIGl0IGNvdW50cwovLyB0aGUgcmVzdCwgc28gdGhlIGltYWdlIG5ldmVyIGdyb3dzIHBhc3QgdGVuIHJvd3MuCgpjb25zdCAoCgl3YWxsQ29scyAgICA9IDI0Cgl3YWxsTWF4Um93cyA9IDEwCgl3YWxsQ2VsbCAgICA9IDI4CgloZWFydFJlZCAgICA9ICIjZTYzOTQ2IgoJaGVhcnRQYXRoICAgPSAiTTEyIDIxQzEyIDIxIDMgMTUuNSAzIDkuNSAzIDYuNSA1LjQgNCA4LjMgNCAxMCA0IDExLjIgNSAxMiA2LjIgMTIuOCA1IDE0IDQgMTUuNyA0IDE4LjYgNCAyMSA2LjUgMjEgOS41IDIxIDE1LjUgMTIgMjEgMTIgMjFaIgopCgovLyByZW5kZXJIZWFydHNXYWxsIHJldHVybnMgdGhlIHdhbGwgYXMgYSBtYXJrZG93biBpbWFnZTsgd2l0aCBubyBoZWFydCB5ZXQgaXQKLy8gaXMgb25lIHJvdyBvZiBlbXB0eSBzbG90cy4KZnVuYyByZW5kZXJIZWFydHNXYWxsKCkgc3RyaW5nIHsKCW4gOj0gSGVhcnRzKCkKCXNob3duIDo9IG4KCWlmIGxpbWl0IDo9IHdhbGxDb2xzICogd2FsbE1heFJvd3M7IHNob3duID4gbGltaXQgewoJCXNob3duID0gbGltaXQKCX0KCXJvd3MgOj0gc2hvd24vd2FsbENvbHMgKyAxCglpZiByb3dzID4gd2FsbE1heFJvd3MgewoJCXJvd3MgPSB3YWxsTWF4Um93cwoJfQoJdyA6PSAyNCArIHdhbGxDb2xzKndhbGxDZWxsCgloIDo9IDI0ICsgcm93cyp3YWxsQ2VsbAoJbW9yZSA6PSBuIC0gc2hvd24KCWlmIG1vcmUgPiAwIHsKCQloICs9IDI2Cgl9Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoYDxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iYCArIHN0cmNvbnYuSXRvYSh3KSArIGAiIGhlaWdodD0iYCArIHN0cmNvbnYuSXRvYShoKSArCgkJYCIgdmlld0JveD0iMCAwIGAgKyBzdHJjb252Lkl0b2EodykgKyBgIGAgKyBzdHJjb252Lkl0b2EoaCkgKyBgIj48ZGVmcz48cGF0aCBpZD0iaCIgZD0iYCArIGhlYXJ0UGF0aCArIGAiLz48L2RlZnM+YCkKCWIuV3JpdGVTdHJpbmcoYDxyZWN0IHdpZHRoPSJgICsgc3RyY29udi5JdG9hKHcpICsgYCIgaGVpZ2h0PSJgICsgc3RyY29udi5JdG9hKGgpICsgYCIgcng9IjEyIiBmaWxsPSIjMTAyMzFjIi8+YCkKCWZvciBpIDo9IDA7IGkgPCByb3dzKndhbGxDb2xzOyBpKysgewoJCXggOj0gMTQgKyAoaSV3YWxsQ29scykqd2FsbENlbGwKCQl5IDo9IDE0ICsgKGkvd2FsbENvbHMpKndhbGxDZWxsCgkJc3R5bGUgOj0gYGZpbGw9ImAgKyBoZWFydFJlZCArIGAiYAoJCWlmIGkgPj0gc2hvd24gewoJCQlzdHlsZSA9IGBmaWxsPSJub25lIiBzdHJva2U9IiM2YjhmN2YiIHN0cm9rZS13aWR0aD0iMS41ImAKCQl9CgkJYi5Xcml0ZVN0cmluZyhgPHVzZSBocmVmPSIjaCIgeD0iYCArIHN0cmNvbnYuSXRvYSh4KSArIGAiIHk9ImAgKyBzdHJjb252Lkl0b2EoeSkgKyBgIiBgICsgc3R5bGUgKyBgLz5gKQoJfQoJaWYgbW9yZSA+IDAgewoJCWIuV3JpdGVTdHJpbmcoYDx0ZXh0IHg9ImAgKyBzdHJjb252Lkl0b2Eody8yKSArIGAiIHk9ImAgKyBzdHJjb252Lkl0b2EoaC0xNCkgKyBgIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBgICsKCQkJYGZpbGw9IiM5ZmM5YjQiIHN0eWxlPSJmb250OjEzcHggc2Fucy1zZXJpZiI+YW5kIGAgKyBzdHJjb252Lkl0b2EobW9yZSkgKyBgIG1vcmU8L3RleHQ+YCkKCX0KCWIuV3JpdGVTdHJpbmcoIjwvc3ZnPiIpCglyZXR1cm4gIiFbIiArIHN0cmNvbnYuSXRvYShuKSArICIgaGVhcnRzXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgKyBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcoW11ieXRlKGIuU3RyaW5nKCkpKSArICIpXG4iCn0KGrVHCghob21lLmdubxKoRy8vIFBhY2thZ2UgaG9tZSBpcyBEYXZpZCBHLidzIHByb2ZpbGUgcGFnZSBvbiBnbm8ubGFuZC4KLy8KLy8gZ25vd2ViIHJlbmRlcnMgYSBwcm9maWxlIGJ5IGNhbGxpbmcgUmVuZGVyKCIiKSBvbiB0aGUgcmVhbG0gYXQgZXhhY3RseQovLyAvci88YWRkcmVzcz4vaG9tZSwgc28gdGhpcyBwYXRoIGNhcnJpZXMgbm8gL3ZOIHN1ZmZpeC4KLy8KLy8gVGhlIHBhZ2UgaXMgYSBsaXN0IG9mIHNlY3Rpb25zLCBlYWNoIGEgbWFya2Rvd24gYm9keSB0aGUgb3duZXIgZWRpdHMgd2l0aAovLyBvbmUgU2V0IHRyYW5zYWN0aW9uLCBzbyBjaGFuZ2luZyB0aGUgdGV4dCBuZXZlciBuZWVkcyBhIHJlZGVwbG95LiBUaGUgc2xvdAovLyBuYW1lZCAib3JkZXIiIGxpc3RzIHRoZSBzZWN0aW9ucyB0byBzaG93LiBTaXggc2VjdGlvbnMgYXJlIGRyYXduIHJhdGhlcgovLyB0aGFuIHN0b3JlZDogImhlcm8iLCB0aGUgcGFnZSBiYW5uZXIsICJiYW5uZXIiIGFuZCAicmV2aWV3cyIsIHRoZSBhY3Rpdml0eQovLyBjaGFydHMsICJhcmVhY2hhcnQiLCB0aGUgcmluZyBvZiBwdWxsIHJlcXVlc3RzIGJ5IGFyZWEsICJnYW1lIiwgdG9kYXkncwovLyBHbm9yZGxlLCBhbmQgImhlYXJ0cyIsIHRoZSBoZWFydCBjb3VudCBhbmQgd2FsbC4KcGFja2FnZSBob21lCgppbXBvcnQgKAoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiY2hhaW4vcnVudGltZSIKCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCikKCi8vIGFkbWluIGlzIHRoZSBvbmx5IGFkZHJlc3MgYWxsb3dlZCB0byBlZGl0IHNlY3Rpb25zLgpjb25zdCBhZG1pbiA9IGFkZHJlc3MoImcxcmF5ZmdrbHdsMGFzcHo0ODh3dnJjcnZ0N3QycXV5NnEwNmxnazIiKQoKY29uc3QgKAoJaG9tZSAgICAgICA9ICIvci9nMXJheWZna2x3bDBhc3B6NDg4d3ZyY3J2dDd0MnF1eTZxMDZsZ2syL2hvbWUiCglvcmRlclNsb3QgID0gIm9yZGVyIgoJbWF4TmFtZUxlbiA9IDMyCgkvLyBtYXhQYXRoTGVuIGlzIGZhciBhYm92ZSBhbnkgbGluayB0aGUgcGFnZSB3cml0ZXMsIGFuZCB0dXJucyBhIGxvbmcKCS8vIGNyYWZ0ZWQgbGluayBhd2F5IGJlZm9yZSB0aGUgcXVlcnkgcGFyc2VyLCB3aG9zZSBjb3N0IGdyb3dzIHdpdGggaXQuCgltYXhQYXRoTGVuID0gMjU2CikKCnZhciAoCglzbG90cyAgPSBhdmwuTmV3VHJlZSgpIC8vIHNlY3Rpb24gbmFtZSAtPiBtYXJrZG93biBib2R5CgloZWFydHMgPSBhdmwuTmV3VHJlZSgpIC8vIGFkZHJlc3MgLT4gYmxvY2sgaGVpZ2h0IG9mIHRoZSBoZWFydAopCgpmdW5jIGluaXQoKSB7Cglmb3IgXywgcyA6PSByYW5nZSBkZWZhdWx0U2xvdHMgewoJCXNsb3RzLlNldChzLm5hbWUsIHMuYm9keSkKCX0KfQoKLy8gU2V0IHdyaXRlcyBvbmUgc2VjdGlvbiBvZiB0aGUgcGFnZS4gT25seSB0aGUgYWRtaW4gY2FuIGNhbGwgaXQuCi8vCi8vIG5hbWUgaXMgdGhlIHNlY3Rpb24gdG8gd3JpdGUgYW5kIGJvZHkgaXMgaXRzIG1hcmtkb3duLiBUaGUgdGV4dCBzZWN0aW9ucyBhcmUKLy8gImhlYWRlciIsIHRoZSBiaW8gYXQgdGhlIHRvcCwgdGhlbiAiZ25vIiwgInByb2plY3RzIiwgInBlZXJkZXYiIGFuZAovLyAidW5yZWxhdGVkIjsgYW55IG90aGVyIG5hbWUgY3JlYXRlcyBhIG5ldyBzZWN0aW9uLgovLwovLyBuYW1lICJvcmRlciIgZGVjaWRlcyB3aGljaCBzZWN0aW9ucyBzaG93IGFuZCBpbiB3aGljaCBvcmRlci4gSXRzIGJvZHkgbGlzdHMKLy8gZXZlcnkgc2VjdGlvbiBuYW1lLCBjb21tYSBzZXBhcmF0ZWQsIHdpdGggbm8gc3BhY2VzLiBBIG5hbWUgbGVmdCBvdXQgb2YgdGhlCi8vIGxpc3QgaXMgaGlkZGVuLCBzbyBjb3B5IHRoZSBjdXJyZW50IGxpc3QsIGZyb20gR2V0KCJvcmRlciIpLCBhbmQgZWRpdCBpdC4KLy8KLy8gbmFtZSAiaGVyb3RleHQiIGlzIHRoZSBiYW5uZXIncyB0ZXh0OiAia2V5IHZhbHVlIiBwYWlycyBzcGxpdCBieSAiOyIsIHdpdGgKLy8gdGhlIGtleXMga2lja2VyLCB0aGUgc21hbGwgbGluZSBvbiB0b3AsIHRpdGxlLCBzdWJ0aXRsZSwgdGFnbGluZSwgZm9vdGxpbmUsCi8vIHRoZSBzbWFsbCBsaW5lIGF0IHRoZSBib3R0b20sIGFuZCBhbHQsIHRoZSBiYW5uZXIncyBkZXNjcmlwdGlvbiBmb3Igc2NyZWVuCi8vIHJlYWRlcnMuIEEga2V5IGxlZnQgb3V0IGtlZXBzIGl0cyBjdXJyZW50IGRlZmF1bHQuCi8vCi8vICJoZXJvIiwgImJhbm5lciIsICJyZXZpZXdzIiwgImFyZWFjaGFydCIsICJnYW1lIiBhbmQgImhlYXJ0cyIgYXJlIGRyYXduIGJ5Ci8vIHRoZSBwYWdlIGl0c2VsZjogdGhleSBjYW5ub3QgYmUgc2V0LCBvbmx5IHBsYWNlZCB0aHJvdWdoICJvcmRlciIuCi8vCi8vIEV4YW1wbGVzLCBhcyB0aGUgdHdvIGZpZWxkcyBvZiB0aGUgZm9ybToKLy8KLy8JbmFtZTogaGVhZGVyCi8vCWJvZHk6IEknbSBhIGRldmVsb3BlciBlbmdpbmVlciBhdCBbU2Ftb3VyYcOvIENvb3BdKGh0dHBzOi8vd3d3LnNhbW91cmFpLndvcmxkLykuCi8vCi8vCW5hbWU6IGhlcm90ZXh0Ci8vCWJvZHk6IHRpdGxlIERhdmlkIEcuOyBzdWJ0aXRsZSBEZXZlbG9wZXIgZW5naW5lZXIgYXQgU2Ftb3VyYcOvIENvb3A7IGZvb3RsaW5lIE9wZW4gZm9yIGNvbnRyaWJ1dGlvbgovLwovLwluYW1lOiB0YWxrcwovLwlib2R5OiAjIyBUYWxrcwovLwovLwluYW1lOiBvcmRlcgovLwlib2R5OiBoZXJvLGhlYWRlcixhY3Rpdml0eWhlYWQsYmFubmVyLHJldmlld3MsZ25vLGFyZWFjaGFydCxwcm9qZWN0cyxwZWVyZGV2LHVucmVsYXRlZCx0YWxrcyxnYW1lLGhlYXJ0cwpmdW5jIFNldChjdXIgcmVhbG0sIG5hbWUsIGJvZHkgc3RyaW5nKSB7Cglhc3NlcnRBZG1pbihjdXIpCglpZiBuYW1lID09ICIiIHx8IGxlbihuYW1lKSA+IG1heE5hbWVMZW4gfHwgc3RyaW5ncy5Db250YWluc0FueShuYW1lLCAiLCBcbiIpIHsKCQlwYW5pYygiaW52YWxpZCBzZWN0aW9uIG5hbWUiKQoJfQoJaWYgZHJhd25TZWN0aW9uc1tuYW1lXSB7CgkJcGFuaWMoInJlc2VydmVkIHNlY3Rpb246ICIgKyBuYW1lKQoJfQoJc2xvdHMuU2V0KG5hbWUsIGJvZHkpCn0KCi8vIFNldEFjdGl2aXR5IHJlZnJlc2hlcyB0aGUgdGhyZWUgY2hhcnRzIGluIG9uZSB0cmFuc2FjdGlvbi4gT25seSB0aGUgYWRtaW4KLy8gY2FuIGNhbGwgaXQuIEl0cyB0aHJlZSBhcmd1bWVudHMgYXJlIHRoZSBib2RpZXMgb2YgdGhlICJhY3Rpdml0eSIsCi8vICJyZXZpZXdhY3Rpdml0eSIgYW5kICJhcmVhcyIgc2VjdGlvbnMsIGFzIHNjcmlwdHMvYWN0aXZpdHkucHkgcHJpbnRzIHRoZW07Ci8vIGFuIGVtcHR5IGFyZ3VtZW50IGxlYXZlcyB0aGF0IGNoYXJ0IGFzIGl0IGlzLgpmdW5jIFNldEFjdGl2aXR5KGN1ciByZWFsbSwgYWN0aXZpdHksIHJldmlld3MsIGFyZWFzIHN0cmluZykgewoJYXNzZXJ0QWRtaW4oY3VyKQoJZm9yIF8sIHMgOj0gcmFuZ2UgW11zdHJ1Y3R7IG5hbWUsIGJvZHkgc3RyaW5nIH17CgkJe2FjdGl2aXR5U2xvdCwgYWN0aXZpdHl9LAoJCXtyZXZpZXdBY3Rpdml0eVNsb3QsIHJldmlld3N9LAoJCXthcmVhc1Nsb3QsIGFyZWFzfSwKCX0gewoJCWlmIHMuYm9keSAhPSAiIiB7CgkJCXNsb3RzLlNldChzLm5hbWUsIHMuYm9keSkKCQl9Cgl9Cn0KCi8vIERlbGV0ZSByZW1vdmVzIG9uZSBzZWN0aW9uLiBPbmx5IHRoZSBhZG1pbiBjYW4gY2FsbCBpdC4KLy8KLy8gbmFtZSBpcyB0aGUgc2VjdGlvbiB0byByZW1vdmUsICJ0YWxrcyIgZm9yIGV4YW1wbGUuIEl0cyBuYW1lIGNhbiBzdGF5IGluCi8vICJvcmRlciI6IGEgbmFtZSB3aXRoIG5vIHNlY3Rpb24gc2hvd3Mgbm90aGluZy4KZnVuYyBEZWxldGUoY3VyIHJlYWxtLCBuYW1lIHN0cmluZykgewoJYXNzZXJ0QWRtaW4oY3VyKQoJaWYgXywgb2sgOj0gc2xvdHMuUmVtb3ZlKG5hbWUpOyAhb2sgewoJCXBhbmljKCJubyBzdWNoIHNlY3Rpb246ICIgKyBuYW1lKQoJfQp9CgovLyBHZXQgcmV0dXJucyBhIHNlY3Rpb24ncyBtYXJrZG93biwgb3IgIiIgd2hlbiBpdCBkb2VzIG5vdCBleGlzdC4KLy8gR2V0KCJvcmRlciIpIHJldHVybnMgdGhlIGN1cnJlbnQgc2VjdGlvbiBsaXN0LCB0aGUgb25lIHRvIGVkaXQgYmVmb3JlCi8vIHNldHRpbmcgIm9yZGVyIi4KZnVuYyBHZXQobmFtZSBzdHJpbmcpIHN0cmluZyB7CglpZiB2IDo9IHNsb3RzLkdldChuYW1lKTsgdiAhPSBuaWwgewoJCXJldHVybiB2LihzdHJpbmcpCgl9CglyZXR1cm4gIiIKfQoKLy8gSGVhcnQgcmVjb3JkcyBvbmUgaGVhcnQgZnJvbSB0aGUgY2FsbGVyLiBFYWNoIGFkZHJlc3MgY2FuIHNlbmQgZXhhY3RseSBvbmUuCmZ1bmMgSGVhcnQoY3VyIHJlYWxtKSB7Cglmcm9tIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKS5TdHJpbmcoKQoJaWYgaGVhcnRzLkhhcyhmcm9tKSB7CgkJcGFuaWMoImFscmVhZHkgc2VudDogb25lIGhlYXJ0IHBlciBhZGRyZXNzIikKCX0KCWhlYXJ0cy5TZXQoZnJvbSwgcnVudGltZS5DaGFpbkhlaWdodCgpKQp9CgovLyBIZWFydHMgcmV0dXJucyBob3cgbWFueSBkaXN0aW5jdCBhZGRyZXNzZXMgc2VudCBhIGhlYXJ0LgpmdW5jIEhlYXJ0cygpIGludCB7IHJldHVybiBoZWFydHMuU2l6ZSgpIH0KCi8vIEhhc0hlYXJ0IHJlcG9ydHMgd2hldGhlciBhZGRyIGFscmVhZHkgc2VudCBhIGhlYXJ0LgpmdW5jIEhhc0hlYXJ0KGFkZHIgYWRkcmVzcykgYm9vbCB7IHJldHVybiBoZWFydHMuSGFzKGFkZHIuU3RyaW5nKCkpIH0KCmZ1bmMgYXNzZXJ0QWRtaW4oY3VyIHJlYWxtKSB7CglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gYWRtaW4gewoJCXBhbmljKCJ1bmF1dGhvcml6ZWQiKQoJfQp9CgovLyBSZW5kZXIgc2VydmVzOgovLwovLwkiIiAgICAgICAgICAgICB0aGUgcHJvZmlsZSBwYWdlCi8vCSJ3b3JkbGUvLi4uIiAgIHRoZSBHbm9yZGxlIGdhbWUKLy8JImhlYXJ0c1svPG4+XSIgdGhlIGFkZHJlc3NlcyB0aGF0IHNlbnQgYSBoZWFydCwgaGVhcnRzUGVyUGFnZSBwZXIgcGFnZQpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIGxlbihwYXRoKSA+IG1heFBhdGhMZW4gewoJCXJldHVybiAiIyBOb3QgZm91bmRcblxuW0JhY2sgaG9tZV0oIiArIGhvbWUgKyAiKVxuIgoJfQoJLy8gT25seSB0aGUgZ2FtZSByZWFkcyBhIHF1ZXJ5OyBlbHNld2hlcmUgb25lIGlzIGRyb3BwZWQsIHNvIGEgc2hhcmVkIGxpbmsKCS8vIGNhcnJ5aW5nID91dG1fc291cmNlPS4uLiBzdGlsbCBzaG93cyB0aGUgcGFnZS4KCWlmICFzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAid29yZGxlIikgewoJCXBhdGgsIF8sIF8gPSBzdHJpbmdzLkN1dChwYXRoLCAiPyIpCgl9Cglzd2l0Y2ggewoJY2FzZSBwYXRoID09ICIiOgoJCXJldHVybiByZW5kZXJQYWdlKCkKCWNhc2UgcGF0aCA9PSAid29yZGxlIiB8fCBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAid29yZGxlLyIpIHx8IHN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJ3b3JkbGU/Iik6CgkJcmV0dXJuIHJlbmRlcldvcmRsZShwYXRoKQoJY2FzZSBwYXRoID09ICJoZWFydHMiIHx8IHN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJoZWFydHMvIik6CgkJcmV0dXJuIHJlbmRlckhlYXJ0cyhzdHJpbmdzLlRyaW1QcmVmaXgoc3RyaW5ncy5UcmltUHJlZml4KHBhdGgsICJoZWFydHMiKSwgIi8iKSkKCX0KCXJldHVybiAiIyBOb3QgZm91bmRcblxuW0JhY2sgaG9tZV0oIiArIGhvbWUgKyAiKVxuIgp9CgpmdW5jIHJlbmRlclBhZ2UoKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCglmb3IgXywgbmFtZSA6PSByYW5nZSBzdHJpbmdzLlNwbGl0KEdldChvcmRlclNsb3QpLCAiLCIpIHsKCQlzd2l0Y2ggbmFtZSA9IHN0cmluZ3MuVHJpbVNwYWNlKG5hbWUpOyBuYW1lIHsKCQljYXNlICIiOgoJCWNhc2UgImhlcm8iOgoJCQliLldyaXRlU3RyaW5nKGhlcm9JbWFnZSgpKQoJCWNhc2UgImFyZWFjaGFydCI6CgkJCWIuV3JpdGVTdHJpbmcocmVuZGVyQXJlYXMoKSkKCQljYXNlICJiYW5uZXIiOgoJCQliLldyaXRlU3RyaW5nKHJlbmRlckNoYXJ0KGFjdGl2aXR5U2xvdCkpCgkJY2FzZSAicmV2aWV3cyI6CgkJCWIuV3JpdGVTdHJpbmcocmVuZGVyQ2hhcnQocmV2aWV3QWN0aXZpdHlTbG90KSkKCQljYXNlICJnYW1lIjoKCQkJYi5Xcml0ZVN0cmluZyhyZW5kZXJHYW1lVGVhc2VyKCkpCgkJY2FzZSAiaGVhcnRzIjoKCQkJYi5Xcml0ZVN0cmluZyhyZW5kZXJIZWFydHNUZWFzZXIoKSkKCQlkZWZhdWx0OgoJCQliLldyaXRlU3RyaW5nKEdldChuYW1lKSkKCQl9CgkJYi5Xcml0ZVN0cmluZygiXG5cbiIpCgl9CgliLldyaXRlU3RyaW5nKCItLS1cblxuVGhpcyBwYWdlIGlzIGEgY29udHJhY3Q6IFtnbm8ubGFuZCIgKyBob21lICsgIl0oIiArIGhvbWUgKyAiJHNvdXJjZSkuXG4iKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyByZW5kZXJIZWFydHNUZWFzZXIoKSBzdHJpbmcgewoJcmV0dXJuICIjIyBIZWFydHNcblxuKioiICsgc3RyY29udi5JdG9hKEhlYXJ0cygpKSArICIqKiBzbyBmYXIuICIgKwoJCSJbU2VuZCBvbmVdKCIgKyBob21lICsgIiRoZWxwJmZ1bmM9SGVhcnQpOiBvbmUgdHJhbnNhY3Rpb24sIG9uZSBwZXIgYWRkcmVzcywgIiArCgkJImZvcmV2ZXIgb24gY2hhaW4uIFtTZWUgd2hvIGRpZF0oIiArIGhvbWUgKyAiOmhlYXJ0cykuXG5cbiIgKyByZW5kZXJIZWFydHNXYWxsKCkKfQoKLy8gZHJhd25TZWN0aW9ucyBhcmUgcmVuZGVyZWQgZnJvbSBjb2RlIGFuZCBzdGF0ZSwgc28gU2V0IHJlZnVzZXMgdGhlaXIgbmFtZXMuCnZhciBkcmF3blNlY3Rpb25zID0gbWFwW3N0cmluZ11ib29sewoJImhlcm8iOiB0cnVlLCAiYmFubmVyIjogdHJ1ZSwgInJldmlld3MiOiB0cnVlLCAiYXJlYWNoYXJ0IjogdHJ1ZSwgImdhbWUiOiB0cnVlLCAiaGVhcnRzIjogdHJ1ZSwKfQoKLy8gaGVyb1Nsb3QgaG9sZHMgdGhlIGJhbm5lcidzIHRleHQsIG9uZSAia2V5IHZhbHVlIiBwYWlyIHBlciBmaWVsZCwgc3BsaXQgYnkKLy8gIjsiOiBraWNrZXIsIHRpdGxlLCBzdWJ0aXRsZSwgdGFnbGluZSwgZm9vdGxpbmUgYW5kIGFsdCwgdGhlIGltYWdlJ3MKLy8gZGVzY3JpcHRpb24uIEEgZmllbGQgdGhlIHNlY3Rpb24gbGVhdmVzIG91dCBrZWVwcyBpdHMgdmFsdWUgZnJvbSBoZXJvLgpjb25zdCBoZXJvU2xvdCA9ICJoZXJvdGV4dCIKCmZ1bmMgY3VycmVudEhlcm8oKSBoZXJvVGV4dCB7CgloIDo9IGhlcm8KCWZvciBfLCBwYWlyIDo9IHJhbmdlIHN0cmluZ3MuU3BsaXQoR2V0KGhlcm9TbG90KSwgIjsiKSB7CgkJa2V5LCB2YWx1ZSwgXyA6PSBzdHJpbmdzLkN1dChzdHJpbmdzLlRyaW1TcGFjZShwYWlyKSwgIiAiKQoJCXZhbHVlID0gc3RyaW5ncy5UcmltU3BhY2UodmFsdWUpCgkJc3dpdGNoIGtleSB7CgkJY2FzZSAia2lja2VyIjoKCQkJaC5raWNrZXIgPSB2YWx1ZQoJCWNhc2UgInRpdGxlIjoKCQkJaC50aXRsZSA9IHZhbHVlCgkJY2FzZSAic3VidGl0bGUiOgoJCQloLnN1YnRpdGxlID0gdmFsdWUKCQljYXNlICJ0YWdsaW5lIjoKCQkJaC50YWdsaW5lID0gdmFsdWUKCQljYXNlICJmb290bGluZSI6CgkJCWguZm9vdGxpbmUgPSB2YWx1ZQoJCWNhc2UgImFsdCI6CgkJCWguYWx0ID0gdmFsdWUKCQl9Cgl9CglyZXR1cm4gaAp9CgovLyBtZFRleHQga2VlcHMgcyBmcm9tIGNsb3NpbmcgYSBtYXJrZG93biBsaW5rIG9yIGltYWdlIGxhYmVsLgpmdW5jIG1kVGV4dChzIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiBzdHJpbmdzLk5ld1JlcGxhY2VyKCJbIiwgIigiLCAiXSIsICIpIikuUmVwbGFjZShzKQp9CgovLyB4bWxUZXh0IGVzY2FwZXMgcyBmb3IgU1ZHIHRleHQgYW5kIGF0dHJpYnV0ZXMuCmZ1bmMgeG1sVGV4dChzIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiBzdHJpbmdzLk5ld1JlcGxhY2VyKCImIiwgIiZhbXA7IiwgIjwiLCAiJmx0OyIsICI+IiwgIiZndDsiLCAiXCIiLCAiJnF1b3Q7IiwgIiciLCAiJiMzOTsiKS5SZXBsYWNlKHMpCn0KCi8vIGhlYXJ0c1BlclBhZ2Uga2VlcHMgb25lIHBhZ2Ugb2YgdGhlIGxpc3QgZmFyIHVuZGVyIHRoZSBxdWVyeSBnYXMgbGltaXQsCi8vIHdoaWNoIGEgbGlzdCBvZiBldmVyeSBoZWFydCB3b3VsZCBwYXNzIGF0IGFib3V0IDE1LDAwMCBvZiB0aGVtLgpjb25zdCBoZWFydHNQZXJQYWdlID0gMTAwCgpmdW5jIHJlbmRlckhlYXJ0cyhwYWdlIHN0cmluZykgc3RyaW5nIHsKCW4gOj0gMQoJaWYgcGFnZSAhPSAiIiB7CgkJdiwgZXJyIDo9IHN0cmNvbnYuQXRvaShwYWdlKQoJCWlmIGVyciAhPSBuaWwgfHwgdiA8IDEgewoJCQlyZXR1cm4gIiMgSGVhcnRzXG5cblRoZXJlIGlzIG5vIHN1Y2ggcGFnZS5cblxuW0JhY2sgaG9tZV0oIiArIGhvbWUgKyAiKVxuIgoJCX0KCQluID0gdgoJfQoJcGFnZXMgOj0gKGhlYXJ0cy5TaXplKCkgKyBoZWFydHNQZXJQYWdlIC0gMSkgLyBoZWFydHNQZXJQYWdlCglpZiBuID4gMSAmJiBuID4gcGFnZXMgewoJCXJldHVybiAiIyBIZWFydHNcblxuVGhlcmUgaXMgbm8gc3VjaCBwYWdlLlxuXG5bQmFjayBob21lXSgiICsgaG9tZSArICIpXG4iCgl9Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIiMgSGVhcnRzXG5cbiIpCglpZiBoZWFydHMuU2l6ZSgpID09IDAgewoJCWIuV3JpdGVTdHJpbmcoIk5vYm9keSB5ZXQuIFtCZSB0aGUgZmlyc3RdKCIgKyBob21lICsgIiRoZWxwJmZ1bmM9SGVhcnQpLlxuIikKCX0KCWhlYXJ0cy5JdGVyYXRlQnlPZmZzZXQoKG4tMSkqaGVhcnRzUGVyUGFnZSwgaGVhcnRzUGVyUGFnZSwgZnVuYyhhZGRyIHN0cmluZywgaCBhbnkpIGJvb2wgewoJCWIuV3JpdGVTdHJpbmcoIi0gIiArIGFkZHIgKyAiLCBibG9jayAiICsgc3RyY29udi5Gb3JtYXRJbnQoaC4oaW50NjQpLCAxMCkgKyAiXG4iKQoJCXJldHVybiBmYWxzZQoJfSkKCWlmIHBhZ2VzID4gMSB7CgkJYi5Xcml0ZVN0cmluZygiXG5QYWdlICIgKyBzdHJjb252Lkl0b2EobikgKyAiIG9mICIgKyBzdHJjb252Lkl0b2EocGFnZXMpICsgIi4iKQoJCWlmIG4gPiAxIHsKCQkJYi5Xcml0ZVN0cmluZygiIFtQcmV2aW91c10oIiArIGhvbWUgKyAiOmhlYXJ0cy8iICsgc3RyY29udi5JdG9hKG4tMSkgKyAiKSIpCgkJfQoJCWlmIG4gPCBwYWdlcyB7CgkJCWIuV3JpdGVTdHJpbmcoIiBbTmV4dF0oIiArIGhvbWUgKyAiOmhlYXJ0cy8iICsgc3RyY29udi5JdG9hKG4rMSkgKyAiKSIpCgkJfQoJCWIuV3JpdGVTdHJpbmcoIlxuIikKCX0KCWIuV3JpdGVTdHJpbmcoIlxuW0JhY2sgaG9tZV0oIiArIGhvbWUgKyAiKVxuIikKCXJldHVybiBiLlN0cmluZygpCn0KGuoTCg1ob21lX3Rlc3QuZ25vEtgTcGFja2FnZSBob21lCgppbXBvcnQgKAoJInN0cmluZ3MiCgkidGVzdGluZyIKCSJ0aW1lIgoKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCnZhciAoCglhbGljZSAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJhbGljZSIpCgltYWxsb3J5ID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJtYWxsb3J5IikKKQoKLy8gc2V0RGF5IG1vdmVzIHRoZSBibG9jayB0aW1lIHRvIG5vb24gb24gdGhlIGdpdmVuIGRheSBzaW5jZSAxOTcwLTAxLTAxIFVUQy4KZnVuYyBzZXREYXkoZGF5IGludDY0KSB7CgljdHggOj0gdGVzdGluZy5HZXRDb250ZXh0KCkKCWN0eC5UaW1lID0gdGltZS5Vbml4KGRheSo4NjQwMCs0MzIwMCwgMCkKCXRlc3RpbmcuU2V0Q29udGV4dChjdHgpCn0KCmZ1bmMgVGVzdERlZmF1bHRQYWdlKHQgKnRlc3RpbmcuVCkgewoJc2V0RGF5KGxhdW5jaERheSkKCXBhZ2UgOj0gUmVuZGVyKCIiKQoJZm9yIF8sIHdhbnQgOj0gcmFuZ2UgW11zdHJpbmd7CgkJIiFbRGF2aWQgRy4sIGRldmVsb3BlciBlbmdpbmVlciBhdCBTYW1vdXJhw68gQ29vcF0oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwiLCAiSSdtIGEgZGV2ZWxvcGVyIGVuZ2luZWVyIGF0IFtTYW1vdXJhw68gQ29vcF0oaHR0cHM6Ly93d3cuc2Ftb3VyYWkud29ybGQvKSwgaW4gW3NhbWNyZXddKC91L3NhbWNyZXcpIiwgIiMjIEdubyBjb3JlIiwgIiMjIFByb2plY3RzIiwgIiMjIFBlZXIgRGV2IiwKCQkiIyMgR25vcmRsZSIsICJbUGxheSBwdXp6bGUgIzFdKCIgKyBob21lICsgIjp3b3JkbGUpIiwgIltHbm9WTSwgZXhwbGFpbmVkXSgiLAoJCSIjIyBIZWFydHMiLCAiKiowKiogc28gZmFyLiIsICIkaGVscCZmdW5jPUhlYXJ0IiwKCX0gewoJCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsIHdhbnQpLCAibWlzc2luZzogIit3YW50KQoJfQp9CgpmdW5jIFRlc3RTZXRHZXREZWxldGUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJU2V0KGNyb3NzKGN1ciksICJiaW8iLCAiQnVpbGRpbmcgb24gZ25vLiIpCgl1YXNzZXJ0LkVxdWFsKHQsICJCdWlsZGluZyBvbiBnbm8uIiwgR2V0KCJiaW8iKSkKCVNldChjcm9zcyhjdXIpLCAib3JkZXIiLCAiYmlvIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkhhc1ByZWZpeChSZW5kZXIoIiIpLCAiQnVpbGRpbmcgb24gZ25vLiIpKQoKCURlbGV0ZShjcm9zcyhjdXIpLCAiYmlvIikKCXVhc3NlcnQuRXF1YWwodCwgIiIsIEdldCgiYmlvIikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm5vIHN1Y2ggc2VjdGlvbjogYmlvIiwgZnVuYygpIHsgRGVsZXRlKGNyb3NzKGN1ciksICJiaW8iKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJyZXNlcnZlZCBzZWN0aW9uOiBnYW1lIiwgZnVuYygpIHsgU2V0KGNyb3NzKGN1ciksICJnYW1lIiwgIngiKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJpbnZhbGlkIHNlY3Rpb24gbmFtZSIsIGZ1bmMoKSB7IFNldChjcm9zcyhjdXIpLCAiYSxiIiwgIngiKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInVuYXV0aG9yaXplZCIsIGZ1bmMoKSB7IFNldChjcm9zcyhjdXIpLCAiaGVhZGVyIiwgInB3bmVkIikgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidW5hdXRob3JpemVkIiwgZnVuYygpIHsgRGVsZXRlKGNyb3NzKGN1ciksICJoZWFkZXIiKSB9KQoKCWZvciBfLCBzIDo9IHJhbmdlIGRlZmF1bHRTbG90cyB7CgkJc2xvdHMuU2V0KHMubmFtZSwgcy5ib2R5KQoJfQp9CgpmdW5jIFRlc3RIZWFydChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaGVhcnRzID0gYXZsLk5ld1RyZWUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCglIZWFydChjcm9zcyhjdXIpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBIZWFydHMoKSkKCXVhc3NlcnQuVHJ1ZSh0LCBIYXNIZWFydChhbGljZSkpCgl1YXNzZXJ0LkZhbHNlKHQsIEhhc0hlYXJ0KG1hbGxvcnkpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhbHJlYWR5IHNlbnQ6IG9uZSBoZWFydCBwZXIgYWRkcmVzcyIsIGZ1bmMoKSB7IEhlYXJ0KGNyb3NzKGN1cikpIH0pCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhSZW5kZXIoImhlYXJ0cyIpLCBhbGljZS5TdHJpbmcoKSkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhSZW5kZXIoIiIpLCAiKioxKiogc28gZmFyLiIpKQp9CgpmdW5jIFRlc3ROb3RGb3VuZCh0ICp0ZXN0aW5nLlQpIHsKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkhhc1ByZWZpeChSZW5kZXIoIm5vcGUiKSwgIiMgTm90IGZvdW5kIikpCn0KGrIxChFzZWN1cml0eV90ZXN0LmdubxKcMXBhY2thZ2UgaG9tZQoKaW1wb3J0ICgKCSJjaGFpbi9ydW50aW1lIgoJImVuY29kaW5nL2Jhc2U2NCIKCSJuZXQvdXJsIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCi8vIEEgZ3Vlc3MgYXJyaXZlcyBpbiB0aGUgcGFnZSBsaW5rLCBzbyBhbnlvbmUgY2FuIHdyaXRlIG9uZTogbm9uZSBvZiBpdCBtYXkKLy8gcmVhY2ggdGhlIHJlbmRlcmVkIG1hcmtkb3duLgpmdW5jIFRlc3RHdWVzc0lzTmV2ZXJFY2hvZWQodCAqdGVzdGluZy5UKSB7CglzZXREYXkobGF1bmNoRGF5KQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoUmVuZGVyKCJ3b3JkbGUvMT9ndWVzcz1hYmMiKSwgIj4gVGhhdCBndWVzcyBpcyBub3QgZml2ZSBsZXR0ZXJzLCBBIHRvIFouIikpCglmb3IgXywgZ3Vlc3MgOj0gcmFuZ2UgW11zdHJpbmd7CgkJIltjbGFpbSB5b3VyIHJld2FyZF0oaHR0cHM6Ly9ldmlsLmV4YW1wbGUpIiwKCQkieFxuXG4jIE9GRklDSUFMIE5PVElDRSIsCgkJIiFbXShodHRwczovL2V2aWwuZXhhbXBsZS9waXhlbC5wbmcpIiwKCQlgPGduby1mb3JtIGV4ZWM9IlRyYW5zZmVyIj48Z25vLWlucHV0IG5hbWU9InRvIiAvPjwvZ25vLWZvcm0+YCwKCX0gewoJCS8vIEFueSByZWplY3RlZCBndWVzcyByZW5kZXJzIHRoZSB2ZXJ5IHBhZ2UgYSBoYXJtbGVzcyByZWplY3RlZCBvbmUgZG9lcy4KCQlwYWdlIDo9IFJlbmRlcigid29yZGxlLzE/Z3Vlc3M9IiArIHVybC5RdWVyeUVzY2FwZShndWVzcykpCgkJdWFzc2VydC5FcXVhbCh0LCBSZW5kZXIoIndvcmRsZS8xP2d1ZXNzPWFiYyIpLCBwYWdlLCAiZ3Vlc3MgbGVha2VkIGludG8gdGhlIHBhZ2U6ICIrZ3Vlc3MpCgl9Cn0KCmZ1bmMgVGVzdE9ubHlBZG1pbldyaXRlcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJZm9yIF8sIGNhbGxlciA6PSByYW5nZSBbXXJ1bnRpbWUuUmVhbG17CgkJdGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJtYWxsb3J5IikpLAoJCXRlc3RpbmcuTmV3Q29kZVJlYWxtKCJnbm8ubGFuZC9yL2V2aWwvcmVsYXkiKSwKCX0gewoJCXRlc3RpbmcuU2V0UmVhbG0oY2FsbGVyKQoJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidW5hdXRob3JpemVkIiwgZnVuYygpIHsgU2V0KGNyb3NzKGN1ciksICJoZWFkZXIiLCAicHduZWQiKSB9KQoJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidW5hdXRob3JpemVkIiwgZnVuYygpIHsgRGVsZXRlKGNyb3NzKGN1ciksICJoZWFkZXIiKSB9KQoJfQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKFJlbmRlcigiIiksICJwd25lZCIpKQp9CgpmdW5jIFRlc3RDaGFydFRleHRJc0VzY2FwZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJb2xkIDo9IEdldChyZXZpZXdBY3Rpdml0eVNsb3QpCglTZXQoY3Jvc3MoY3VyKSwgcmV2aWV3QWN0aXZpdHlTbG90LCBgdGl0bGUgcmV2aWV3czsgc2VyaWVzIDxzY3JpcHQ+YWxlcnQoMSk8L3NjcmlwdD4sYSZiOyAyMDI2LTAxIDEgMmApCglvdXQgOj0gcmVuZGVyQ2hhcnQocmV2aWV3QWN0aXZpdHlTbG90KQoJcmF3LCBlcnIgOj0gYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZVN0cmluZyhvdXRbc3RyaW5ncy5JbmRleChvdXQsICJiYXNlNjQsIikrNyA6IGxlbihvdXQpLTJdKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhzdHJpbmcocmF3KSwgIjxzY3JpcHQ+IikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhzdHJpbmcocmF3KSwgIiZsdDtzY3JpcHQmZ3Q7IikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhzdHJpbmcocmF3KSwgImEmYW1wO2IiKSkKCVNldChjcm9zcyhjdXIpLCByZXZpZXdBY3Rpdml0eVNsb3QsIG9sZCkKfQoKZnVuYyBUZXN0SGVhcnRzTGlzdElzUGFnZWQodCAqdGVzdGluZy5UKSB7CgloZWFydHMgPSBhdmwuTmV3VHJlZSgpCglmb3IgaSA6PSAwOyBpIDwgMjUwOyBpKysgewoJCWhlYXJ0cy5TZXQodGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJmYW4iK3N0cmNvbnYuSXRvYShpKSkuU3RyaW5nKCksIGludDY0KGkpKQoJfQoJZmlyc3QgOj0gUmVuZGVyKCJoZWFydHMiKQoJdWFzc2VydC5FcXVhbCh0LCBoZWFydHNQZXJQYWdlLCBzdHJpbmdzLkNvdW50KGZpcnN0LCAiXG4tICIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoZmlyc3QsICJQYWdlIDEgb2YgMy4iKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGZpcnN0LCAiW05leHRdKCIraG9tZSsiOmhlYXJ0cy8yKSIpKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGZpcnN0LCAiW1ByZXZpb3VzXSIpKQoJbGFzdCA6PSBSZW5kZXIoImhlYXJ0cy8zIikKCXVhc3NlcnQuRXF1YWwodCwgNTAsIHN0cmluZ3MuQ291bnQobGFzdCwgIlxuLSAiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGxhc3QsICJbUHJldmlvdXNdKCIraG9tZSsiOmhlYXJ0cy8yKSIpKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGxhc3QsICJbTmV4dF0iKSkKCWZvciBfLCBiYWQgOj0gcmFuZ2UgW11zdHJpbmd7ImhlYXJ0cy8wIiwgImhlYXJ0cy80IiwgImhlYXJ0cy94IiwgImhlYXJ0cy8tMSJ9IHsKCQl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhSZW5kZXIoYmFkKSwgIlRoZXJlIGlzIG5vIHN1Y2ggcGFnZS4iKSwgYmFkKQoJfQoJaGVhcnRzID0gYXZsLk5ld1RyZWUoKQp9CgpmdW5jIFRlc3RPcmRlclN1cnZpdmVzQmFkRW50cmllcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCglvbGQgOj0gR2V0KG9yZGVyU2xvdCkKCVNldChjcm9zcyhjdXIpLCBvcmRlclNsb3QsICJub3N1Y2hzZWN0aW9uLCxoZWFkZXIiKQoJcGFnZSA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5IYXNQcmVmaXgoc3RyaW5ncy5UcmltU3BhY2UocGFnZSksICJJJ20gYSBkZXZlbG9wZXIgZW5naW5lZXIiKSkKCURlbGV0ZShjcm9zcyhjdXIpLCBvcmRlclNsb3QpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhSZW5kZXIoIiIpLCAiVGhpcyBwYWdlIGlzIGEgY29udHJhY3QiKSkKCVNldChjcm9zcyhjdXIpLCBvcmRlclNsb3QsIG9sZCkKfQoKZnVuYyBUZXN0UXVlcnlEb2VzTm90QnJlYWtQYWdlcyh0ICp0ZXN0aW5nLlQpIHsKCXVhc3NlcnQuRXF1YWwodCwgUmVuZGVyKCIiKSwgUmVuZGVyKCI/dXRtX3NvdXJjZT14IikpCgl1YXNzZXJ0LkVxdWFsKHQsIFJlbmRlcigiIiksIFJlbmRlcigiP2ZiY2xpZD1hYmMmeD0xIikpCgl1YXNzZXJ0LkVxdWFsKHQsIFJlbmRlcigiaGVhcnRzIiksIFJlbmRlcigiaGVhcnRzP3g9MSIpKQoJLy8gVGhlIGdhbWUga2VlcHMgaXRzIHF1ZXJ5OiBpdCBjYXJyaWVzIHRoZSBndWVzcy4KCXNldERheShsYXVuY2hEYXkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhSZW5kZXIoIndvcmRsZS8xP2d1ZXNzPWNyYW5lIiksICJDUkFORSIpKQp9CgpmdW5jIFRlc3RMb25nUGF0aElzUmVmdXNlZCh0ICp0ZXN0aW5nLlQpIHsKCXNldERheShsYXVuY2hEYXkpCgkvLyBUaGUgbG9uZ2VzdCBsaW5rIHRoZSBnYW1lIHdyaXRlczogc2l4IGd1ZXNzZXMgYW5kIGEgdHlwZWQgb25lLgoJbG9uZ2VzdCA6PSAid29yZGxlLzk5OTk5L0NSQU5FLlNMQVRFLlJPVVRFLlRSQUNFLlFVRVJZLlBST1hZP2d1ZXNzPSIgKyB1cmwuUXVlcnlFc2NhcGUoIiAgY3JhbmUgICIpCgl1YXNzZXJ0LlRydWUodCwgbGVuKGxvbmdlc3QpIDw9IG1heFBhdGhMZW4pCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuSGFzUHJlZml4KFJlbmRlcihsb25nZXN0KSwgIiMgTm90IGZvdW5kIikpCglmb3IgXywgcCA6PSByYW5nZSBbXXN0cmluZ3sKCQkid29yZGxlLzE/IiArIHN0cmluZ3MuUmVwZWF0KCJhPSYiLCAxMDApLAoJCSJ3b3JkbGUvMS8iICsgc3RyaW5ncy5SZXBlYXQoIi4iLCAzMDApLAoJCSJoZWFydHMvIiArIHN0cmluZ3MuUmVwZWF0KCI5IiwgMzAwKSwKCX0gewoJCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkhhc1ByZWZpeChSZW5kZXIocCksICIjIE5vdCBmb3VuZCIpLCBwWzoyMF0pCgl9Cn0KCmZ1bmMgVGVzdEhlcm9UZXh0SXNFZGl0YWJsZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCglvbGQgOj0gR2V0KGhlcm9TbG90KQoJZGVjb2RlIDo9IGZ1bmMoKSBzdHJpbmcgewoJCW91dCA6PSBoZXJvSW1hZ2UoKQoJCXJhdywgZXJyIDo9IGJhc2U2NC5TdGRFbmNvZGluZy5EZWNvZGVTdHJpbmcob3V0W3N0cmluZ3MuSW5kZXgob3V0LCAiYmFzZTY0LCIpKzcgOiBsZW4ob3V0KS0xXSkKCQl1YXNzZXJ0Lk5vRXJyb3IodCwgZXJyKQoJCXJldHVybiBzdHJpbmcocmF3KQoJfQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoZGVjb2RlKCksICI+RGF2aWQgRy48L3RleHQ+IikpCgoJU2V0KGNyb3NzKGN1ciksIGhlcm9TbG90LCAidGl0bGUgRGF2ZTsgc3VidGl0bGUgPGI+JmNvPC9iPjsgYm9ndXMgeDsgdGFnbGluZSBoZWxsbyIpCglzdmcgOj0gZGVjb2RlKCkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHN2ZywgIj5EYXZlPC90ZXh0PiIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoc3ZnLCAiPiZsdDtiJmd0OyZhbXA7Y28mbHQ7L2ImZ3Q7PC90ZXh0PiIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoc3ZnLCAiPmhlbGxvPC90ZXh0PiIpKQoJLy8gQSBrZXkgdGhlIHNlY3Rpb24gbGVhdmVzIG91dCBrZWVwcyBpdHMgZGVmYXVsdC4KCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHN2ZywgIj5nbm8ubGFuZCBjb3JlIGNvbnRyaWJ1dG9yPC90ZXh0PiIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuSGFzUHJlZml4KGhlcm9JbWFnZSgpLCAiIVtEYXZpZCBHLiwgZGV2ZWxvcGVyIGVuZ2luZWVyIGF0IFNhbW91cmHDryBDb29wXSgiKSkKCglTZXQoY3Jvc3MoY3VyKSwgaGVyb1Nsb3QsICJhbHQgYSBdKCB0cmFwIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkhhc1ByZWZpeChoZXJvSW1hZ2UoKSwgIiFbYSApKCB0cmFwXSgiKSkKCglTZXQoY3Jvc3MoY3VyKSwgaGVyb1Nsb3QsIG9sZCkKfQoKZnVuYyBUZXN0U2V0QWN0aXZpdHkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCW9sZFBSLCBvbGRSZXYsIG9sZEFyZWFzIDo9IEdldChhY3Rpdml0eVNsb3QpLCBHZXQocmV2aWV3QWN0aXZpdHlTbG90KSwgR2V0KGFyZWFzU2xvdCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJtYWxsb3J5IikpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1bmF1dGhvcml6ZWQiLCBmdW5jKCkgeyBTZXRBY3Rpdml0eShjcm9zcyhjdXIpLCAieCIsICJ4IiwgIngiKSB9KQoJdWFzc2VydC5FcXVhbCh0LCBvbGRQUiwgR2V0KGFjdGl2aXR5U2xvdCkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCglTZXRBY3Rpdml0eShjcm9zcyhjdXIpLCAidGl0bGUgYTsgc2VyaWVzIHM7IDIwMjYtMDEgMSIsICIiLCAidGl0bGUgYzsgc2xpY2UgMyBEb2NzIikKCXVhc3NlcnQuRXF1YWwodCwgInRpdGxlIGE7IHNlcmllcyBzOyAyMDI2LTAxIDEiLCBHZXQoYWN0aXZpdHlTbG90KSkKCXVhc3NlcnQuRXF1YWwodCwgb2xkUmV2LCBHZXQocmV2aWV3QWN0aXZpdHlTbG90KSkgLy8gZW1wdHkgbGVhdmVzIGl0IGFzIGl0IGlzCgl1YXNzZXJ0LkVxdWFsKHQsICJ0aXRsZSBjOyBzbGljZSAzIERvY3MiLCBHZXQoYXJlYXNTbG90KSkKCW91dCA6PSByZW5kZXJDaGFydChhY3Rpdml0eVNsb3QpCglyYXcsIGVyciA6PSBiYXNlNjQuU3RkRW5jb2RpbmcuRGVjb2RlU3RyaW5nKG91dFtzdHJpbmdzLkluZGV4KG91dCwgImJhc2U2NCwiKSs3IDogbGVuKG91dCktMl0pCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZXJyKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoc3RyaW5nKHJhdyksICI+MSBhPC90ZXh0PiIpKQoKCVNldEFjdGl2aXR5KGNyb3NzKGN1ciksIG9sZFBSLCBvbGRSZXYsIG9sZEFyZWFzKQp9ChrsLQoKd29yZGxlLmdubxLdLXBhY2thZ2UgaG9tZQoKaW1wb3J0ICgKCSJuZXQvdXJsIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0aW1lIgopCgovLyBHbm9yZGxlOiBndWVzcyB0aGUgZGF5J3MgZml2ZS1sZXR0ZXIgd29yZCBpbiBzaXggdHJpZXMuIFRoZSBnYW1lIGtlZXBzIG5vCi8vIHN0YXRlIG9uIGNoYWluLiBQYXN0IGd1ZXNzZXMgcmlkZSBpbiB0aGUgcGFnZSBwYXRoLCB3b3JkbGUvPG4+L0NSQU5FLlNMQVRFLAovLyBhbmQgYSBnbm93ZWIgZm9ybSBhZGRzIHRoZSBuZXh0IG9uZSBhcyA/Z3Vlc3M9LCBzbyBwbGF5aW5nIG5lZWRzIG5vIHdhbGxldC4KCmNvbnN0ICgKCXdvcmRMZW4gICAgPSA1CgltYXhHdWVzc2VzID0gNgoJbGF1bmNoRGF5ICA9IDIwNzE5IC8vIDIwMjYtMDktMjMsIGluIGRheXMgc2luY2UgMTk3MC0wMS0wMSBVVEM6IHB1enpsZSAjMQoJc3RyaWRlICAgICA9IDE3ICAgIC8vIGNvcHJpbWUgd2l0aCBsZW4od29yZHMpLCBzbyBldmVyeSB3b3JkIGNvbWVzIHVwIG9uY2UgcGVyIGN5Y2xlCikKCi8vIHdvcmRzIGFyZSB0aGUgYW5zd2VycywgZ25vIGFuZCBibG9ja2NoYWluIGZsYXZvdXJlZC4KdmFyIHdvcmRzID0gW11zdHJpbmd7CgkiUkVBTE0iLCAiQ1JPU1MiLCAiQkxPQ0siLCAiQ0hBSU4iLCAiVE9LRU4iLCAiU1RBS0UiLCAiUEFOSUMiLCAiREVGRVIiLAoJIlNMSUNFIiwgIkFSUkFZIiwgIlBSSU5UIiwgIlNUQUNLIiwgIlFVRVVFIiwgIlRVUExFIiwgIkZMT0FUIiwgIkNPTlNUIiwKCSJQQVJTRSIsICJQUk9PRiIsICJOT05DRSIsICJWT1RFUiIsICJTSEFSRCIsICJNRVJHRSIsICJBVURJVCIsICJERUJVRyIsCgkiVFJBQ0UiLCAiQ0FDSEUiLCAiSU5ERVgiLCAiUVVFUlkiLCAiUk9VVEUiLCAiVkFMVUUiLCAiUlVORVMiLCAiRVJST1IiLAoJIkdVQVJEIiwgIk9XTkVSIiwgIkFETUlOIiwgIlRSRUVTIiwgIk5PREVTIiwgIlBFRVJTIiwgIkdSQVBIIiwgIkZPUktTIiwKCSJNSU5UUyIsICJMT0dJQyIsICJCWVRFUyIsICJDTEFTUyIsICJGSUVMRCIsICJMT09QUyIsICJQUk9CRSIsICJTQ09QRSIsCgkiVFlQRUQiLCAiQkVOQ0giLCAiQ0xPTkUiLCAiUEFUQ0giLCAiRU1CRUQiLCAiRkVUQ0giLCAiTEFCRUwiLCAiTE9DQUwiLAoJIlBST1hZIiwgIlNDQUxFIiwgIlNQQVdOIiwKfQoKLy8gdG9kYXkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHB1enpsZSwgZnJvbSB0aGUgbGFzdCBibG9jaydzIHRpbWUuCmZ1bmMgdG9kYXkoKSBpbnQgewoJcmV0dXJuIGludCh0aW1lLk5vdygpLlVuaXgoKS84NjQwMCkgLSBsYXVuY2hEYXkgKyAxCn0KCi8vIGFuc3dlciByZXR1cm5zIHRoZSB3b3JkIG9mIHB1enpsZSBuLgpmdW5jIGFuc3dlcihuIGludCkgc3RyaW5nIHsKCWkgOj0gKChuLTEpKnN0cmlkZSVsZW4od29yZHMpICsgbGVuKHdvcmRzKSkgJSBsZW4od29yZHMpCglyZXR1cm4gd29yZHNbaV0KfQoKLy8gc2NvcmUgY29sb3VycyBhIGd1ZXNzIGFnYWluc3QgdGhlIGFuc3dlciwgaGFuZGxpbmcgcmVwZWF0ZWQgbGV0dGVycyB0aGUgd2F5Ci8vIHRoZSBvcmlnaW5hbCBnYW1lIGRvZXM6IGEgbGV0dGVyIGlzIG1hcmtlZCBwcmVzZW50IG9ubHkgYXMgbWFueSB0aW1lcyBhcyBpdAovLyBpcyBzdGlsbCB1bm1hdGNoZWQgaW4gdGhlIGFuc3dlci4KZnVuYyBzY29yZShndWVzcywgYW5zIHN0cmluZykgc3RyaW5nIHsKCW1hcmtzIDo9IG1ha2UoW11zdHJpbmcsIHdvcmRMZW4pCglsZWZ0IDo9IG1hcFtieXRlXWludHt9Cglmb3IgaSA6PSAwOyBpIDwgd29yZExlbjsgaSsrIHsKCQlpZiBndWVzc1tpXSA9PSBhbnNbaV0gewoJCQltYXJrc1tpXSA9ICLwn5+pIgoJCX0gZWxzZSB7CgkJCWxlZnRbYW5zW2ldXSsrCgkJfQoJfQoJZm9yIGkgOj0gMDsgaSA8IHdvcmRMZW47IGkrKyB7CgkJaWYgbWFya3NbaV0gIT0gIiIgewoJCQljb250aW51ZQoJCX0KCQlpZiBsZWZ0W2d1ZXNzW2ldXSA+IDAgewoJCQltYXJrc1tpXSA9ICLwn5+oIgoJCQlsZWZ0W2d1ZXNzW2ldXS0tCgkJfSBlbHNlIHsKCQkJbWFya3NbaV0gPSAi4qybIgoJCX0KCX0KCXJldHVybiBzdHJpbmdzLkpvaW4obWFya3MsICIiKQp9CgpmdW5jIHZhbGlkR3Vlc3MoZyBzdHJpbmcpIGJvb2wgewoJaWYgbGVuKGcpICE9IHdvcmRMZW4gewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIGkgOj0gMDsgaSA8IHdvcmRMZW47IGkrKyB7CgkJaWYgZ1tpXSA8ICdBJyB8fCBnW2ldID4gJ1onIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoJcmV0dXJuIHRydWUKfQoKZnVuYyByZW5kZXJXb3JkbGUocGF0aCBzdHJpbmcpIHN0cmluZyB7CglwYXRoLCBxdWVyeSwgXyA6PSBzdHJpbmdzLkN1dChwYXRoLCAiPyIpCglwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KHBhdGgsICIvIikgLy8gIndvcmRsZSIsIFtuXSwgW2d1ZXNzZXNdCgluIDo9IHRvZGF5KCkKCXZhciBndWVzc2VzIFtdc3RyaW5nCglpZiBsZW4ocGFydHMpID4gMSB7CgkJdiwgZXJyIDo9IHN0cmNvbnYuQXRvaShwYXJ0c1sxXSkKCQlpZiBlcnIgIT0gbmlsIHx8IHYgPCAxIHsKCQkJcmV0dXJuIHdvcmRsZUVycm9yKCJUaGVyZSBpcyBubyBwdXp6bGUgd2l0aCB0aGF0IG51bWJlci4iKQoJCX0KCQluID0gdgoJfQoJaWYgbiA+IHRvZGF5KCkgewoJCXJldHVybiB3b3JkbGVFcnJvcigiUHV6emxlICMiICsgc3RyY29udi5JdG9hKG4pICsgIiBpcyBub3Qgb3V0IHlldC4iKQoJfQoJaWYgbGVuKHBhcnRzKSA+IDIgJiYgcGFydHNbMl0gIT0gIiIgewoJCWd1ZXNzZXMgPSBzdHJpbmdzLlNwbGl0KHBhcnRzWzJdLCAiLiIpCgl9CglpZiBsZW4ocGFydHMpID4gMyB8fCBsZW4oZ3Vlc3NlcykgPiBtYXhHdWVzc2VzIHsKCQlyZXR1cm4gd29yZGxlRXJyb3IoIlRoaXMgZ2FtZSBsaW5rIGlzIGJyb2tlbi4iKQoJfQoJZm9yIF8sIGcgOj0gcmFuZ2UgZ3Vlc3NlcyB7CgkJaWYgIXZhbGlkR3Vlc3MoZykgewoJCQlyZXR1cm4gd29yZGxlRXJyb3IoIlRoaXMgZ2FtZSBsaW5rIGlzIGJyb2tlbi4iKQoJCX0KCX0KCglhbnMgOj0gYW5zd2VyKG4pCglub3RpY2UgOj0gIiIKCWlmIHEsIGVyciA6PSB1cmwuUGFyc2VRdWVyeShxdWVyeSk7IGVyciA9PSBuaWwgJiYgcS5HZXQoImd1ZXNzIikgIT0gIiIgJiYgIXNvbHZlZChndWVzc2VzLCBhbnMpICYmIGxlbihndWVzc2VzKSA8IG1heEd1ZXNzZXMgewoJCWcgOj0gc3RyaW5ncy5Ub1VwcGVyKHN0cmluZ3MuVHJpbVNwYWNlKHEuR2V0KCJndWVzcyIpKSkKCQlpZiB2YWxpZEd1ZXNzKGcpIHsKCQkJZ3Vlc3NlcyA9IGFwcGVuZChndWVzc2VzLCBnKQoJCX0gZWxzZSB7CgkJCS8vIFRoZSBndWVzcyBpcyBuZXZlciBlY2hvZWQ6IGl0IGNvbWVzIGZyb20gdGhlIGxpbmssIGFuZCBtYXJrZG93biBpbgoJCQkvLyBpdCB3b3VsZCByZW5kZXIgb24gdGhpcyBwYWdlIHVuZGVyIHRoZSBvd25lcidzIGFkZHJlc3MuCgkJCW5vdGljZSA9ICI+IFRoYXQgZ3Vlc3MgaXMgbm90IGZpdmUgbGV0dGVycywgQSB0byBaLlxuXG4iCgkJfQoJfQoKCW51bSA6PSBzdHJjb252Lkl0b2EobikKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBHbm9yZGxlICMiICsgbnVtICsgIlxuXG4iKQoJYi5Xcml0ZVN0cmluZygiR3Vlc3MgdGhlIHdvcmQgaW4gc2l4IHRyaWVzLiDwn5+pIHJpZ2h0IGxldHRlciwgcmlnaHQgcGxhY2UuIPCfn6ggaW4gdGhlIHdvcmQsIGVsc2V3aGVyZS4g4qybIG5vdCBpbiB0aGUgd29yZC4gIikKCWIuV3JpdGVTdHJpbmcoIkV2ZXJ5b25lIGdldHMgdGhlIHNhbWUgd29yZCwgYW5kIGEgbmV3IG9uZSBjb21lcyBvdXQgZXZlcnkgZGF5IGF0IDAwOjAwIFVUQy5cblxuIikKCWIuV3JpdGVTdHJpbmcobm90aWNlKQoKCWdyaWQgOj0gIiIKCWZvciBfLCBnIDo9IHJhbmdlIGd1ZXNzZXMgewoJCXJvdyA6PSBzY29yZShnLCBhbnMpCgkJZ3JpZCArPSByb3cgKyAiXG4iCgkJYi5Xcml0ZVN0cmluZyhyb3cgKyAiICIgKyBnICsgIlxuXG4iKQoJfQoJaWYgbWlzcyA6PSBtaXNzaW5nKGd1ZXNzZXMsIGFucyk7IG1pc3MgIT0gIiIgewoJCWIuV3JpdGVTdHJpbmcoIk5vdCBpbiB0aGUgd29yZDogIiArIG1pc3MgKyAiXG5cbiIpCgl9CgoJc3dpdGNoIHsKCWNhc2Ugc29sdmVkKGd1ZXNzZXMsIGFucyk6CgkJYi5Xcml0ZVN0cmluZygiKipTb2x2ZWQgaW4gIiArIHN0cmNvbnYuSXRvYShsZW4oZ3Vlc3NlcykpICsgIi82LioqIENvcHkgeW91ciByZXN1bHQ6XG5cbiIpCgkJYi5Xcml0ZVN0cmluZygiYGBgXG5Hbm9yZGxlICMiICsgbnVtICsgIiAiICsgc3RyY29udi5JdG9hKGxlbihndWVzc2VzKSkgKyAiLzZcbiIgKyBncmlkICsgImBgYFxuXG4iKQoJY2FzZSBsZW4oZ3Vlc3NlcykgPT0gbWF4R3Vlc3NlczoKCQliLldyaXRlU3RyaW5nKCIqKlRoZSB3b3JkIHdhcyAiICsgYW5zICsgIi4qKiBDb3B5IHlvdXIgcmVzdWx0OlxuXG4iKQoJCWIuV3JpdGVTdHJpbmcoImBgYFxuR25vcmRsZSAjIiArIG51bSArICIgWC82XG4iICsgZ3JpZCArICJgYGBcblxuIikKCWRlZmF1bHQ6CgkJYi5Xcml0ZVN0cmluZygiPGduby1mb3JtIHBhdGg9XCJ3b3JkbGUvIiArIG51bSkKCQlpZiBsZW4oZ3Vlc3NlcykgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZygiLyIgKyBzdHJpbmdzLkpvaW4oZ3Vlc3NlcywgIi4iKSkKCQl9CgkJYi5Xcml0ZVN0cmluZygiXCI+XG4gIDxnbm8taW5wdXQgbmFtZT1cImd1ZXNzXCIgcGxhY2Vob2xkZXI9XCJHdWVzcyAiICsKCQkJc3RyY29udi5JdG9hKGxlbihndWVzc2VzKSsxKSArICIgb2YgNjogZml2ZSBsZXR0ZXJzXCIgLz5cbjwvZ25vLWZvcm0+XG5cbiIpCgl9CgoJYi5Xcml0ZVN0cmluZygiW1N0YXJ0IG92ZXJdKCIgKyBob21lICsgIjp3b3JkbGUvIiArIG51bSArICIpIikKCWlmIG4gPCB0b2RheSgpIHsKCQliLldyaXRlU3RyaW5nKCIgwrcgW1BsYXkgdG9kYXkncyBwdXp6bGVdKCIgKyBob21lICsgIjp3b3JkbGUpIikKCX0KCWIuV3JpdGVTdHJpbmcoIiDCtyBbQmFjayBob21lXSgiICsgaG9tZSArICIpXG4iKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyBzb2x2ZWQoZ3Vlc3NlcyBbXXN0cmluZywgYW5zIHN0cmluZykgYm9vbCB7CglyZXR1cm4gbGVuKGd1ZXNzZXMpID4gMCAmJiBndWVzc2VzW2xlbihndWVzc2VzKS0xXSA9PSBhbnMKfQoKLy8gbWlzc2luZyBsaXN0cyB0aGUgZ3Vlc3NlZCBsZXR0ZXJzIHRoYXQgYXJlIG5vdCBpbiB0aGUgYW5zd2VyLCBpbiBndWVzcyBvcmRlci4KZnVuYyBtaXNzaW5nKGd1ZXNzZXMgW11zdHJpbmcsIGFucyBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgb3V0IFtdc3RyaW5nCglzZWVuIDo9IG1hcFtieXRlXWJvb2x7fQoJZm9yIF8sIGcgOj0gcmFuZ2UgZ3Vlc3NlcyB7CgkJZm9yIGkgOj0gMDsgaSA8IHdvcmRMZW47IGkrKyB7CgkJCWMgOj0gZ1tpXQoJCQlpZiAhc2VlbltjXSAmJiAhc3RyaW5ncy5Db250YWluc1J1bmUoYW5zLCBydW5lKGMpKSB7CgkJCQlvdXQgPSBhcHBlbmQob3V0LCBzdHJpbmcoYykpCgkJCX0KCQkJc2VlbltjXSA9IHRydWUKCQl9Cgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKG91dCwgIiAiKQp9CgpmdW5jIHdvcmRsZUVycm9yKG1zZyBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gIiMgR25vcmRsZVxuXG4iICsgbXNnICsgIlxuXG5bUGxheSB0b2RheSdzIHB1enpsZV0oIiArIGhvbWUgKyAiOndvcmRsZSkgwrcgW0JhY2sgaG9tZV0oIiArIGhvbWUgKyAiKVxuIgp9CgpmdW5jIHJlbmRlckdhbWVUZWFzZXIoKSBzdHJpbmcgewoJcmV0dXJuICIjIyBHbm9yZGxlXG5cbkd1ZXNzIHRvZGF5J3MgZml2ZS1sZXR0ZXIgd29yZCBpbiBzaXggdHJpZXMuIFNhbWUgd29yZCBmb3IgZXZlcnlvbmUsICIgKwoJCSJhIG5ldyBvbmUgZXZlcnkgZGF5LCBubyB3YWxsZXQgbmVlZGVkLiBbUGxheSBwdXp6bGUgIyIgKyBzdHJjb252Lkl0b2EodG9kYXkoKSkgKyAiXSgiICsgaG9tZSArICI6d29yZGxlKVxuIgp9Chq+FwoPd29yZGxlX3Rlc3QuZ25vEqoXcGFja2FnZSBob21lCgppbXBvcnQgKAoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgpmdW5jIFRlc3RXb3Jkcyh0ICp0ZXN0aW5nLlQpIHsKCXNlZW4gOj0gbWFwW3N0cmluZ11ib29se30KCWZvciBfLCB3IDo9IHJhbmdlIHdvcmRzIHsKCQl1YXNzZXJ0LlRydWUodCwgdmFsaWRHdWVzcyh3KSwgImJhZCB3b3JkOiAiK3cpCgkJdWFzc2VydC5GYWxzZSh0LCBzZWVuW3ddLCAiZHVwbGljYXRlIHdvcmQ6ICIrdykKCQlzZWVuW3ddID0gdHJ1ZQoJfQoJLy8gc3RyaWRlIGlzIGNvcHJpbWUgd2l0aCB0aGUgbGlzdCwgc28gYSBmdWxsIGN5Y2xlIGhpdHMgZXZlcnkgd29yZCBvbmNlLgoJZ290IDo9IG1hcFtzdHJpbmddYm9vbHt9Cglmb3IgbiA6PSAxOyBuIDw9IGxlbih3b3Jkcyk7IG4rKyB7CgkJZ290W2Fuc3dlcihuKV0gPSB0cnVlCgl9Cgl1YXNzZXJ0LkVxdWFsKHQsIGxlbih3b3JkcyksIGxlbihnb3QpKQp9CgpmdW5jIFRlc3RTY29yZSh0ICp0ZXN0aW5nLlQpIHsKCXVhc3NlcnQuRXF1YWwodCwgIvCfn6nwn5+p8J+fqfCfn6nwn5+pIiwgc2NvcmUoIlJFQUxNIiwgIlJFQUxNIikpCgl1YXNzZXJ0LkVxdWFsKHQsICLirJvirJvirJvirJvirJsiLCBzY29yZSgiQlVOTlkiLCAiUkVBTE0iKSkKCXVhc3NlcnQuRXF1YWwodCwgIvCfn6jwn5+o8J+fqPCfn6jwn5+oIiwgc2NvcmUoIkVBTE1SIiwgIlJFQUxNIikpCgkvLyBPbmUgRSBpbiB0aGUgYW5zd2VyOiB0aGUgc2Vjb25kIEUgaW4gdGhlIGd1ZXNzIGdldHMgbm90aGluZy4KCXVhc3NlcnQuRXF1YWwodCwgIuKsm/Cfn6nwn5+o4qyb4qybIiwgc2NvcmUoIkVFUklFIiwgIlJFQUxNIikpCgl1YXNzZXJ0LkVxdWFsKHQsICLwn5+o4qyb4qyb4qyb4qybIiwgc2NvcmUoIkVYWEVYIiwgIlJFQUxNIikpCgkvLyBUaGUgZXhhY3QgbWF0Y2ggY2xhaW1zIHRoZSBsZXR0ZXIgYmVmb3JlIGEgbWlzcGxhY2VkIGNvcHkgY2FuLgoJdWFzc2VydC5FcXVhbCh0LCAi4qyb8J+fqfCfn6nirJvirJsiLCBzY29yZSgiQUFYWFgiLCAiQkFYWVoiKSkKfQoKZnVuYyBUZXN0V29yZGxlRmxvdyh0ICp0ZXN0aW5nLlQpIHsKCXNldERheShsYXVuY2hEYXkgKyAyKSAvLyBwdXp6bGUgIzMKCWFucyA6PSBhbnN3ZXIoMykKCglwYWdlIDo9IFJlbmRlcigid29yZGxlIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICIjIEdub3JkbGUgIzMiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsIGA8Z25vLWZvcm0gcGF0aD0id29yZGxlLzMiPmApKQoKCXBhZ2UgPSBSZW5kZXIoIndvcmRsZS8zP2d1ZXNzPWNyYW5lIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsIHNjb3JlKCJDUkFORSIsIGFucykrIiBDUkFORSIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgYDxnbm8tZm9ybSBwYXRoPSJ3b3JkbGUvMy9DUkFORSI+YCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiR3Vlc3MgMiBvZiA2IikpCgoJcGFnZSA9IFJlbmRlcigid29yZGxlLzMvQ1JBTkU/Z3Vlc3M9IiArIGFucykKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICIqKlNvbHZlZCBpbiAyLzYuKioiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICJHbm9yZGxlICMzIDIvNiIpKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICI8Z25vLWZvcm0iKSkKCglwYWdlID0gUmVuZGVyKCJ3b3JkbGUvMz9ndWVzcz1hYmMiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIj4gVGhhdCBndWVzcyBpcyBub3QgZml2ZSBsZXR0ZXJzLCBBIHRvIFouIikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCBgPGduby1mb3JtIHBhdGg9IndvcmRsZS8zIj5gKSkKCglwYWdlID0gUmVuZGVyKCJ3b3JkbGUvMSIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiW1BsYXkgdG9kYXkncyBwdXp6bGVdIikpCn0KCmZ1bmMgVGVzdFdvcmRsZUxvc3QodCAqdGVzdGluZy5UKSB7CglzZXREYXkobGF1bmNoRGF5KQoJYW5zIDo9IGFuc3dlcigxKQoJd3JvbmcgOj0gIlpaWlpaIgoJaWYgYW5zID09IHdyb25nIHsKCQl3cm9uZyA9ICJZWVlZWSIKCX0KCXBhdGggOj0gIndvcmRsZS8xLyIgKyBzdHJpbmdzLlJlcGVhdCh3cm9uZysiLiIsIDUpICsgd3JvbmcKCXBhZ2UgOj0gUmVuZGVyKHBhdGgpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiKipUaGUgd29yZCB3YXMgIithbnMrIi4qKiIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIkdub3JkbGUgIzEgWC82IikpCn0KCmZ1bmMgVGVzdFdvcmRsZUJhZExpbmtzKHQgKnRlc3RpbmcuVCkgewoJc2V0RGF5KGxhdW5jaERheSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKFJlbmRlcigid29yZGxlLzIiKSwgImlzIG5vdCBvdXQgeWV0IikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhSZW5kZXIoIndvcmRsZS8wIiksICJubyBwdXp6bGUgd2l0aCB0aGF0IG51bWJlciIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoUmVuZGVyKCJ3b3JkbGUveCIpLCAibm8gcHV6emxlIHdpdGggdGhhdCBudW1iZXIiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKFJlbmRlcigid29yZGxlLzEvQ1JBIiksICJsaW5rIGlzIGJyb2tlbiIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoUmVuZGVyKCJ3b3JkbGUvMS9BLkIvQyIpLCAibGluayBpcyBicm9rZW4iKSkKCXRvb01hbnkgOj0gIndvcmRsZS8xLyIgKyBzdHJpbmdzLlJlcGVhdCgiQ1JBTkUuIiwgNikgKyAiQ1JBTkUiCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhSZW5kZXIodG9vTWFueSksICJsaW5rIGlzIGJyb2tlbiIpKQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMTUwMDAwMDB1Z25vdBISCICEr18SCzEwMDAwMHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAnT4MNxVLZwrGVrKKJenv83NSYs31lzoaw7z84TzgN7eEkCvi+477qAMkVYENGXbtkUWjGTjREnD9GpQaikM4xG+myUspX6D1GoZMFzzIKHFeuqE3fXrIgzm0Bp/1X5YfUTfGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl