Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
25CE5D60B26D4A23A638F1A7B948539CBEA47EBDB3BDCA26220A60519B539554
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
48,203,606
Requested gas limit
GAS USED
37,079,657
Gas consumed
FEE
48204ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1wx60nkcp5lfsxmedeg7sfs47tzxkath05u63t417000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CuTVAQoML3ZtLm1fYWRkcGtnEtLVAQooZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NBKV1QEKBnN0YWJsZRJEZ25vLmxhbmQvci9nMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0L3RyaWFsbWludC9zdGFibGUaawoLZ25vbW9kLnRvbWwSXG1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxd3g2MG5rY3A1bGZzeG1lZGVnN3NmczQ3dHp4a2F0aDA1dTYzdDQvdHJpYWxtaW50L3N0YWJsZSIKZ25vID0gIjAuOSIKGrLTAQoKc3RhYmxlLmdubxKi0wFwYWNrYWdlIHN0YWJsZQoKaW1wb3J0ICgKCXJ1bnRpbWUgImNoYWluL3J1bnRpbWUiCgl1bnNhZmVyZWFsbSAiY2hhaW4vcnVudGltZS91bnNhZmUiCgkiZW5jb2RpbmcvYmFzZTY0IgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9nMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0L2F2bCIKCWdyYzcyMSAiZ25vLmxhbmQvcC9nMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0L2dyYzcyMXYyIgoJY2FtcGFpZ24gImduby5sYW5kL3IvZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NC90cmlhbG1pbnQvY2FtcGFpZ24iCglhcnRwa2cgImduby5sYW5kL3AvZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NC9hcnQzZCIKCSJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCmNvbnN0ICgKCUNvbGxlY3Rpb25OYW1lICAgPSAiVHJpYWwgTWludCIKCUNvbGxlY3Rpb25TeW1ib2wgPSAiVFJJQUwiCgoJcmVhbG1SZWxQYXRoID0gIi9yL2cxd3g2MG5rY3A1bGZzeG1lZGVnN3NmczQ3dHp4a2F0aDA1dTYzdDQvdHJpYWxtaW50L3N0YWJsZSIKCglzdW1tYXJ5UGFnZVNpemUgPSAxMAoJZ25vd2ViTGlzdExpbWl0ID0gMTAKCXBhZ2VXaW5kb3cgICAgICAgICA9IDIKCXRva2VuUGFnZUltYWdlU2l6ZSA9ICI0MjAiCgoJUmV2ZWFsRGVsYXlCbG9ja3MgPSA1CikKCnZhciAoCgluZnQgKmdyYzcyMS5NZXRhZGF0YU5GVAoKCWNvbGxlY3Rpb25Pd25lciBhZGRyZXNzID0gImcxd3g2MG5rY3A1bGZzeG1lZGVnN3NmczQ3dHp4a2F0aDA1dTYzdDQiCgoJYXBwcm92ZWRWZXJzaW9uIHN0cmluZwoKCW1pbnRQcmljZVVnbm90IGludDY0ID0gMTAwMDAwMDAwMDAwMCAvLyAxMDAgR05PVCwgcGVyIHJlcXVlc3QKCgl3aGl0ZWxpc3RCcHMgYXZsLlRyZWUKCglyb3lhbHR5QnBzICAgICAgIGludDY0ICAgPSA1MDAKCXJveWFsdHlSZWNpcGllbnQgYWRkcmVzcyA9ICJnMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0IgoKCW1pbnRlZElEcyBbXWdyYzcyMS5Ub2tlbklECgoJbWludGVkVHJhaXRDb21ib3MgYXZsLlRyZWUgLy8gY29tYm8ga2V5IC0+IHRydWUKCXRva2VuQ29tYm9LZXlzICAgIGF2bC5UcmVlIC8vIHRpZC5TdHJpbmcoKSAtPiBjb21ib0tleSBzdHJpbmcKCW1pbnRDb3VudEJ5V2FsbGV0IGF2bC5UcmVlIC8vIGFkZHJlc3MuU3RyaW5nKCkgLT4gaW50NjQKCgltaW50aW5nT3Blbk1pcnJvciAgICAgICA9IHRydWUKCW1heE1pbnRzUGVyV2FsbGV0TWlycm9yIGludDY0ID0gMAoKCWJ1cm5lZFJlY29yZHMgYXZsLlRyZWUgLy8gdGlkLlN0cmluZygpIC0+IGJ1cm5SZWNvcmQKCWJ1cm5lZElEcyAgICAgW11ncmM3MjEuVG9rZW5JRAoKCWNsYWltUmVjb3JkcyBbXWNsYWltUmVjb3JkCgoJc2VhbGVkRGF0YSBhdmwuVHJlZSAvLyB0aWQuU3RyaW5nKCkgLT4gdHJhaXRQcmVzZXQKCW1pbnRIZWlnaHQgYXZsLlRyZWUgLy8gdGlkLlN0cmluZygpIC0+IGludDY0CgoJc2VhbGVkSW1hZ2Ugc3RyaW5nCikKCnR5cGUgdHJhaXRQcmVzZXQgc3RydWN0IHsKCUNoYWluICAgIHN0cmluZwoJU2hhcGVJZHggaW50CglDb2xvcklkeCBpbnQKCU1ldGFsICAgIHN0cmluZwoJQWN0aXZlICAgYm9vbAoJUmFyaXR5ICAgc3RyaW5nIC8vIHRpZXIgZml4ZWQgYXQgbWludCBieSB0aGUgdmVyc2lvbiByZWFsbSAodjUucmFyaXR5VGllcikKfQoKdHlwZSBjbGFpbVJlY29yZCBzdHJ1Y3QgewoJV2FsbGV0ICAgICBhZGRyZXNzCglCcHMgICAgICAgIGludDY0CglNaW50SGVpZ2h0IGludDY0CglUaWQgICAgICAgIGdyYzcyMS5Ub2tlbklECn0KCnR5cGUgYnVyblJlY29yZCBzdHJ1Y3QgewoJQnVybmVkQnkgICBhZGRyZXNzCglCdXJuSGVpZ2h0IGludDY0CglNZXRhZGF0YSAgIGdyYzcyMS5NZXRhZGF0YQp9CgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CgluZnQgPSBncmM3MjEuTmV3TkZUV2l0aE1ldGFkYXRhKDAsIGN1ciwgQ29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25TeW1ib2wpCglzdmcgOj0gYDxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTcwIiBoZWlnaHQ9IjE3MCIgdmlld0JveD0iMCAwIDE3MCAxNzAiPmAgKwoJCWA8cmVjdCB3aWR0aD0iMTcwIiBoZWlnaHQ9IjE3MCIgZmlsbD0iIzBhMGIxMCIvPmAgKwoJCWA8Y2lyY2xlIGN4PSI4NSIgY3k9Ijc4IiByPSIzNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNTU1IiBzdHJva2Utd2lkdGg9IjQiLz5gICsKCQlgPHRleHQgeD0iODUiIHk9IjgzIiBmb250LXNpemU9IjEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjOTk5IiBmb250LWZhbWlseT0ibW9ub3NwYWNlIj5TRUFMRUQ8L3RleHQ+YCArCgkJYDwvc3ZnPmAKCXNlYWxlZEltYWdlID0gImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsIiArIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUoc3ZnKSkKfQoKZnVuYyBOYW1lKCkgc3RyaW5nICAgICAgeyByZXR1cm4gQ29sbGVjdGlvbk5hbWUgfQpmdW5jIFN5bWJvbCgpIHN0cmluZyAgICB7IHJldHVybiBDb2xsZWN0aW9uU3ltYm9sIH0KZnVuYyBUb2tlbkNvdW50KCkgaW50NjQgeyByZXR1cm4gbmZ0LlRva2VuQ291bnQoKSB9CgpmdW5jIE93bmVyT2YodGlkIGdyYzcyMS5Ub2tlbklEKSAoYWRkcmVzcywgZXJyb3IpICAgICAgICAgICAgeyByZXR1cm4gbmZ0Lk93bmVyT2YodGlkKSB9CmZ1bmMgQmFsYW5jZU9mKG93bmVyIGFkZHJlc3MpIChpbnQ2NCwgZXJyb3IpICAgICAgICAgICAgICAgICB7IHJldHVybiBuZnQuQmFsYW5jZU9mKG93bmVyKSB9CmZ1bmMgR2V0QXBwcm92ZWQodGlkIGdyYzcyMS5Ub2tlbklEKSAoYWRkcmVzcywgZXJyb3IpICAgICAgICB7IHJldHVybiBuZnQuR2V0QXBwcm92ZWQodGlkKSB9CmZ1bmMgSXNBcHByb3ZlZEZvckFsbChvd25lciwgb3BlcmF0b3IgYWRkcmVzcykgYm9vbCAgICAgICAgICB7IHJldHVybiBuZnQuSXNBcHByb3ZlZEZvckFsbChvd25lciwgb3BlcmF0b3IpIH0KCmZ1bmMgQXBwcm92ZWRWZXJzaW9uKCkgc3RyaW5nIHsgcmV0dXJuIGFwcHJvdmVkVmVyc2lvbiB9CmZ1bmMgT3duZXIoKSBhZGRyZXNzICAgICAgICAgIHsgcmV0dXJuIGNvbGxlY3Rpb25Pd25lciB9CmZ1bmMgTWludFByaWNlKCkgaW50NjQgICAgICAgIHsgcmV0dXJuIG1pbnRQcmljZVVnbm90IH0KCmZ1bmMgTWludGVkSURzKCkgW11ncmM3MjEuVG9rZW5JRCB7IHJldHVybiBtaW50ZWRJRHMgfQpmdW5jIFRvdGFsQnVybmVkKCkgaW50NjQgICAgICAgICAgeyByZXR1cm4gaW50NjQobGVuKGJ1cm5lZElEcykpIH0KCmZ1bmMgTWludGluZ09wZW4oKSBib29sICAgICAgICB7IHJldHVybiBtaW50aW5nT3Blbk1pcnJvciB9CmZ1bmMgTWF4TWludHNQZXJXYWxsZXQoKSBpbnQ2NCB7IHJldHVybiBtYXhNaW50c1BlcldhbGxldE1pcnJvciB9CgpmdW5jIE1pbnRzQnlXYWxsZXQob3duZXIgYWRkcmVzcykgaW50NjQgewoJbiwgXyA6PSBtaW50Q291bnRCeVdhbGxldC5HZXQob3duZXIuU3RyaW5nKCkpLihpbnQ2NCkKCXJldHVybiBuCn0KCmZ1bmMgSXNUcmFpdENvbWJvQXZhaWxhYmxlKGNvbWJvS2V5IHN0cmluZykgYm9vbCB7CglyZXR1cm4gIW1pbnRlZFRyYWl0Q29tYm9zLkhhcyhjb21ib0tleSkKfQoKZnVuYyBXaGl0ZWxpc3RCcHMod2FsbGV0IGFkZHJlc3MpIChicHMgaW50NjQsIG9rIGJvb2wpIHsKCWlmICF3aGl0ZWxpc3RCcHMuSGFzKHdhbGxldC5TdHJpbmcoKSkgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHdoaXRlbGlzdEJwcy5HZXQod2FsbGV0LlN0cmluZygpKS4oaW50NjQpLCB0cnVlCn0KCmZ1bmMgV2hpdGVsaXN0Q291bnQoKSBpbnQ2NCB7IHJldHVybiBpbnQ2NCh3aGl0ZWxpc3RCcHMuU2l6ZSgpKSB9CgpmdW5jIFdoaXRlbGlzdEVudHJ5KGluZGV4IGludCkgKHdhbGxldCBzdHJpbmcsIGJwcyBpbnQ2NCkgewoJdywgdiA6PSB3aGl0ZWxpc3RCcHMuR2V0QnlJbmRleChpbmRleCkKCXJldHVybiB3LCB2LihpbnQ2NCkKfQoKZnVuYyBFZmZlY3RpdmVQcmljZShjYWxsZXIgYWRkcmVzcykgaW50NjQgewoJaWYgdiwgb2sgOj0gd2hpdGVsaXN0QnBzLkdldChjYWxsZXIuU3RyaW5nKCkpLihpbnQ2NCk7IG9rIHsKCQlyZXR1cm4gbWludFByaWNlVWdub3QgKiB2IC8gMTAwMDAKCX0KCWlmIGJwcywgXywgb2sgOj0gY2FtcGFpZ24uUGVlayhjYWxsZXIpOyBvayB7CgkJcmV0dXJuIG1pbnRQcmljZVVnbm90ICogYnBzIC8gMTAwMDAKCX0KCXJldHVybiBtaW50UHJpY2VVZ25vdAp9CgpmdW5jIFJveWFsdHlJbmZvKHRpZCBncmM3MjEuVG9rZW5JRCwgc2FsZVByaWNlIGludDY0KSAoYWRkcmVzcywgaW50NjQsIGVycm9yKSB7CglpZiBfLCBlcnIgOj0gbmZ0Lk93bmVyT2YodGlkKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCAwLCBlcnIKCX0KCXJldHVybiByb3lhbHR5UmVjaXBpZW50LCBzYWxlUHJpY2UgKiByb3lhbHR5QnBzIC8gMTAwMDAsIG5pbAp9CgpmdW5jIFJveWFsdHlCcHMoKSBpbnQ2NCAgICAgICAgIHsgcmV0dXJuIHJveWFsdHlCcHMgfQpmdW5jIFJveWFsdHlSZWNpcGllbnQoKSBhZGRyZXNzIHsgcmV0dXJuIHJveWFsdHlSZWNpcGllbnQgfQoKZnVuYyBjYWxsZXJBZGRyZXNzKCkgYWRkcmVzcyB7CglyZXR1cm4gdW5zYWZlcmVhbG0uUHJldmlvdXNSZWFsbSgpLkFkZHJlc3MoKQp9CgpmdW5jIGFzc2VydE93bmVyKCkgewoJaWYgY2FsbGVyQWRkcmVzcygpICE9IGNvbGxlY3Rpb25Pd25lciB7CgkJcGFuaWMoInVuYXV0aG9yaXplZDogY2FsbGVyIGlzIG5vdCB0aGUgY29sbGVjdGlvbiBvd25lciIpCgl9Cn0KCmZ1bmMgU2V0QXBwcm92ZWRWZXJzaW9uKGN1ciByZWFsbSwgcGtncGF0aCBzdHJpbmcpIHsKCWFzc2VydE93bmVyKCkKCWFwcHJvdmVkVmVyc2lvbiA9IHBrZ3BhdGgKfQoKZnVuYyBTZXRNaW50UHJpY2UoY3VyIHJlYWxtLCB1Z25vdCBpbnQ2NCkgewoJYXNzZXJ0T3duZXIoKQoJaWYgdWdub3QgPCAwIHsKCQlwYW5pYygicHJpY2UgY2Fubm90IGJlIG5lZ2F0aXZlIikKCX0KCW1pbnRQcmljZVVnbm90ID0gdWdub3QKfQoKZnVuYyBBZGRUb1doaXRlbGlzdChjdXIgcmVhbG0sIHdhbGxldCBhZGRyZXNzLCBicHMgaW50NjQpIHsKCWFzc2VydE93bmVyKCkKCWlmIGJwcyA8IDAgfHwgYnBzID4gMTAwMDAgewoJCXBhbmljKCJicHMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMDAwIikKCX0KCXdoaXRlbGlzdEJwcy5TZXQod2FsbGV0LlN0cmluZygpLCBicHMpCn0KCmZ1bmMgQWRkVG9XaGl0ZWxpc3RCYXRjaChjdXIgcmVhbG0sIHdhbGxldHNDU1Ygc3RyaW5nLCBicHMgaW50NjQpIHsKCWFzc2VydE93bmVyKCkKCWlmIGJwcyA8IDAgfHwgYnBzID4gMTAwMDAgewoJCXBhbmljKCJicHMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMDAwIikKCX0KCWZvciBfLCB3IDo9IHJhbmdlIHN0cmluZ3MuU3BsaXQod2FsbGV0c0NTViwgIiwiKSB7CgkJdyA9IHN0cmluZ3MuVHJpbVNwYWNlKHcpCgkJaWYgdyA9PSAiIiB7CgkJCWNvbnRpbnVlCgkJfQoJCXdoaXRlbGlzdEJwcy5TZXQodywgYnBzKQoJfQp9CgpmdW5jIFJlbW92ZUZyb21XaGl0ZWxpc3QoY3VyIHJlYWxtLCB3YWxsZXQgYWRkcmVzcykgewoJYXNzZXJ0T3duZXIoKQoJd2hpdGVsaXN0QnBzLlJlbW92ZSh3YWxsZXQuU3RyaW5nKCkpCn0KCmZ1bmMgU2V0Um95YWx0eUJwcyhjdXIgcmVhbG0sIGJwcyBpbnQ2NCkgewoJYXNzZXJ0T3duZXIoKQoJaWYgYnBzIDwgMCB8fCBicHMgPiAxMDAwMCB7CgkJcGFuaWMoImJwcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwMDAiKQoJfQoJcm95YWx0eUJwcyA9IGJwcwp9CgpmdW5jIFNldFJveWFsdHlSZWNpcGllbnQoY3VyIHJlYWxtLCByZWNpcGllbnQgYWRkcmVzcykgewoJYXNzZXJ0T3duZXIoKQoJcm95YWx0eVJlY2lwaWVudCA9IHJlY2lwaWVudAp9CgpmdW5jIGFzc2VydENhbGxlcklzQXBwcm92ZWRWZXJzaW9uKGN1ciByZWFsbSkgewoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLlBrZ1BhdGgoKQoJaWYgYXBwcm92ZWRWZXJzaW9uID09ICIiIHsKCQlwYW5pYygibm8gdmVyc2lvbiByZWFsbSBoYXMgYmVlbiBhcHByb3ZlZCB5ZXQiKQoJfQoJaWYgY2FsbGVyICE9IGFwcHJvdmVkVmVyc2lvbiB7CgkJcGFuaWMoInVuYXV0aG9yaXplZDogY2FsbGVyIGlzIG5vdCB0aGUgYXBwcm92ZWQgdmVyc2lvbiByZWFsbSIpCgl9Cn0KCmZ1bmMgUmVjb3JkTWludChjdXIgcmVhbG0sIHRvIGFkZHJlc3MsIHBheWVyIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCwgY2hhaW5OYW1lIHN0cmluZywgc2hhcGVJZHgsIGNvbG9ySWR4IGludCwgbWV0YWwgc3RyaW5nLCBhY3RpdmUgYm9vbCwgY29tYm9LZXkgc3RyaW5nLCByYXJpdHkgc3RyaW5nKSBncmM3MjEuVG9rZW5JRCB7Cglhc3NlcnRDYWxsZXJJc0FwcHJvdmVkVmVyc2lvbihjdXIpCglpZiBtaW50ZWRUcmFpdENvbWJvcy5IYXMoY29tYm9LZXkpIHsKCQlwYW5pYygidHJhaXQgY29tYmluYXRpb24gYWxyZWFkeSBtaW50ZWQiKQoJfQoJY2hlY2tFcnIobmZ0Lk1pbnQodG8sIHRpZCkpCgljaGVja0VycihuZnQuU2V0VG9rZW5NZXRhZGF0YSh0bywgdGlkLCBncmM3MjEuTWV0YWRhdGF7CgkJTmFtZTogICAgICAgIlNlYWxlZCIsCgkJQXR0cmlidXRlczogW11ncmM3MjEuVHJhaXR7e1RyYWl0VHlwZTogIlN0YXR1cyIsIFZhbHVlOiAiU2VhbGVkIn19LAoJfSkpCgltaW50ZWRUcmFpdENvbWJvcy5TZXQoY29tYm9LZXksIHRydWUpCgl0b2tlbkNvbWJvS2V5cy5TZXQodGlkLlN0cmluZygpLCBjb21ib0tleSkKCW1pbnRDb3VudEJ5V2FsbGV0LlNldCh0by5TdHJpbmcoKSwgTWludHNCeVdhbGxldCh0bykrMSkKCW1pbnRlZElEcyA9IGFwcGVuZChtaW50ZWRJRHMsIHRpZCkKCgloZWlnaHQgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgltaW50SGVpZ2h0LlNldCh0aWQuU3RyaW5nKCksIGhlaWdodCkKCXNlYWxlZERhdGEuU2V0KHRpZC5TdHJpbmcoKSwgdHJhaXRQcmVzZXR7CgkJQ2hhaW46IGNoYWluTmFtZSwgU2hhcGVJZHg6IHNoYXBlSWR4LCBDb2xvcklkeDogY29sb3JJZHgsIE1ldGFsOiBtZXRhbCwgQWN0aXZlOiBhY3RpdmUsIFJhcml0eTogcmFyaXR5LAoJfSkKCglpZiBfLCBoYXNPdmVycmlkZSA6PSB3aGl0ZWxpc3RCcHMuR2V0KHBheWVyLlN0cmluZygpKS4oaW50NjQpOyAhaGFzT3ZlcnJpZGUgewoJCWlmIGJwcywgb2sgOj0gY2FtcGFpZ24uQ29uc3VtZURpc2NvdW50KGNyb3NzKGN1ciksIHBheWVyKTsgb2sgewoJCQljbGFpbVJlY29yZHMgPSBhcHBlbmQoY2xhaW1SZWNvcmRzLCBjbGFpbVJlY29yZHsKCQkJCVdhbGxldDogICAgIHBheWVyLAoJCQkJQnBzOiAgICAgICAgYnBzLAoJCQkJTWludEhlaWdodDogaGVpZ2h0LAoJCQkJVGlkOiAgICAgICAgdGlkLAoJCQl9KQoJCX0KCX0KCXJldHVybiB0aWQKfQoKZnVuYyBDbGFpbUNvdW50KCkgaW50NjQgeyByZXR1cm4gaW50NjQobGVuKGNsYWltUmVjb3JkcykpIH0KCmZ1bmMgQ2xhaW1BdChpbmRleCBpbnQpICh3YWxsZXQgYWRkcmVzcywgYnBzIGludDY0LCBtaW50SGVpZ2h0XyBpbnQ2NCwgdGlkIHN0cmluZykgewoJciA6PSBjbGFpbVJlY29yZHNbaW5kZXhdCglyZXR1cm4gci5XYWxsZXQsIHIuQnBzLCByLk1pbnRIZWlnaHQsIHIuVGlkLlN0cmluZygpCn0KCmZ1bmMgUmVwb3J0TWludGluZ09wZW4oY3VyIHJlYWxtLCBvcGVuIGJvb2wpIHsKCWFzc2VydENhbGxlcklzQXBwcm92ZWRWZXJzaW9uKGN1cikKCW1pbnRpbmdPcGVuTWlycm9yID0gb3Blbgp9CgpmdW5jIFJlcG9ydE1heE1pbnRzUGVyV2FsbGV0KGN1ciByZWFsbSwgbWF4IGludDY0KSB7Cglhc3NlcnRDYWxsZXJJc0FwcHJvdmVkVmVyc2lvbihjdXIpCgltYXhNaW50c1BlcldhbGxldE1pcnJvciA9IG1heAp9CgpmdW5jIEFnZSh0aWQgZ3JjNzIxLlRva2VuSUQpIGludDY0IHsKCWggOj0gbWludEhlaWdodC5HZXQodGlkLlN0cmluZygpKQoJaWYgaCA9PSBuaWwgewoJCXJldHVybiAtMQoJfQoJcmV0dXJuIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSAtIGguKGludDY0KQp9CgpmdW5jIElzUmV2ZWFsZWQodGlkIGdyYzcyMS5Ub2tlbklEKSBib29sIHsKCWlmIF8sIGlzVHJhaXRQcmVzZXQgOj0gc2VhbGVkRGF0YS5HZXQodGlkLlN0cmluZygpKS4odHJhaXRQcmVzZXQpOyAhaXNUcmFpdFByZXNldCB7CgkJcmV0dXJuIHRydWUKCX0KCWFnZSA6PSBBZ2UodGlkKQoJcmV0dXJuIGFnZSA+PSAwICYmIGFnZSA+PSBSZXZlYWxEZWxheUJsb2Nrcwp9CgpmdW5jIGN1cnJlbnRNZXRhZGF0YSh0aWQgZ3JjNzIxLlRva2VuSUQpIChncmM3MjEuTWV0YWRhdGEsIGVycm9yKSB7CglzdG9yZWQsIGVyciA6PSBuZnQuVG9rZW5NZXRhZGF0YSh0aWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gc3RvcmVkLCBlcnIKCX0KCXRwLCBoYWRSZXZlYWwgOj0gc2VhbGVkRGF0YS5HZXQodGlkLlN0cmluZygpKS4odHJhaXRQcmVzZXQpCglpZiAhaGFkUmV2ZWFsIHsKCQlyZXR1cm4gc3RvcmVkLCBuaWwKCX0KCWlmICFJc1JldmVhbGVkKHRpZCkgewoJCXN0b3JlZC5JbWFnZSA9IHNlYWxlZEltYWdlIC8vIHN0aWxsIHNlYWxlZDogc2hhcmVkIHBsYWNlaG9sZGVyLCBub3QgcGVyLXRva2VuIHN0b3JhZ2UKCQlyZXR1cm4gc3RvcmVkLCBuaWwKCX0KCXJldHVybiBhc3NlbWJsZWRNZXRhZGF0YSh0aWQsIHRwKSwgbmlsCn0KCmZ1bmMgbGlzdFJvdyh0aWQgZ3JjNzIxLlRva2VuSUQpIChuYW1lLCBpbWFnZSBzdHJpbmcpIHsKCXRwLCBvayA6PSBzZWFsZWREYXRhLkdldCh0aWQuU3RyaW5nKCkpLih0cmFpdFByZXNldCkKCWlmICFvayB7CgkJbSwgXyA6PSBuZnQuVG9rZW5NZXRhZGF0YSh0aWQpCgkJcmV0dXJuIG0uTmFtZSwgbS5JbWFnZQoJfQoJaWYgIUlzUmV2ZWFsZWQodGlkKSB7CgkJcmV0dXJuICJTZWFsZWQiLCBzZWFsZWRJbWFnZQoJfQoJbmFtZSA9IHRyYWl0T25seU1ldGFkYXRhKHRwKS5OYW1lCglzdmcgOj0gYXJ0cGtnLlJlbmRlclRva2VuVGh1bWJTVkcodHAuQ2hhaW4sIHRwLk1ldGFsLCB0cC5TaGFwZUlkeCwgdHAuQ29sb3JJZHgsIHRwLkFjdGl2ZSwgdGlkLlN0cmluZygpKQoJcmV0dXJuIG5hbWUsICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgKyBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHN2ZykpCn0KCmZ1bmMgYXNzZW1ibGVkTWV0YWRhdGEodGlkIGdyYzcyMS5Ub2tlbklELCB0cCB0cmFpdFByZXNldCkgZ3JjNzIxLk1ldGFkYXRhIHsKCXN2Zywgc3RvbmUsIF8sIGNvbG9yTmFtZSA6PSBhcnRwa2cuUmVuZGVyVG9rZW5TVkcodHAuQ2hhaW4sIHRwLk1ldGFsLCB0cC5TaGFwZUlkeCwgdHAuQ29sb3JJZHgsIHRwLkFjdGl2ZSwgdGlkLlN0cmluZygpKQoJc2hhcGVOYW1lIDo9IGFydHBrZy5TaGFwZU5hbWVzW3RwLlNoYXBlSWR4XQoJaWYgc3RvbmUgPT0gIlBlYXJsIiB7CgkJc2hhcGVOYW1lID0gYXJ0cGtnLlBlYXJsU2hhcGVOYW1lc1t0cC5TaGFwZUlkeF0KCX0KCWltYWdlIDo9ICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgKyBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHN2ZykpCglzdGF0dXMgOj0gIlN1bnNldCIKCWlmIHRwLkFjdGl2ZSB7CgkJc3RhdHVzID0gIkFjdGl2ZSIKCX0KCXJldHVybiBncmM3MjEuTWV0YWRhdGF7CgkJTmFtZTogICAgICAgICAgICBwaWVjZURpc3BsYXlOYW1lKGNvbG9yTmFtZSwgc3RvbmUsIHNoYXBlTmFtZSwgdHAuTWV0YWwsIHRwLkNoYWluKSwKCQlEZXNjcmlwdGlvbjogICAgIHVmbXQuU3ByaW50ZigiJXMgJXMgJXMgc2V0IGluIGEgJXMgcmluZywgbWludGVkIG9uICVzLiIsIGFydGljbGUoY29sb3JOYW1lKSwgY29sb3JOYW1lLCBzaGFwZU5hbWUsIHRwLk1ldGFsLCB0cC5DaGFpbiksCgkJSW1hZ2U6ICAgICAgICAgICBpbWFnZSwKCQlCYWNrZ3JvdW5kQ29sb3I6ICIwYTBiMTAiLAoJCUF0dHJpYnV0ZXM6IFtdZ3JjNzIxLlRyYWl0ewoJCQl7VHJhaXRUeXBlOiAiQ2hhaW4iLCBWYWx1ZTogdHAuQ2hhaW59LAoJCQl7VHJhaXRUeXBlOiAiU3RvbmUiLCBWYWx1ZTogc3RvbmV9LAoJCQl7VHJhaXRUeXBlOiAiU2hhcGUiLCBWYWx1ZTogc2hhcGVOYW1lfSwKCQkJe1RyYWl0VHlwZTogIkNvbG9yIiwgVmFsdWU6IGNvbG9yTmFtZX0sCgkJCXtUcmFpdFR5cGU6ICJSaW5nIiwgVmFsdWU6IHRwLk1ldGFsfSwKCQkJe1RyYWl0VHlwZTogIlN0YXR1cyIsIFZhbHVlOiBzdGF0dXN9LAoJCQl7VHJhaXRUeXBlOiAiUmFyaXR5IiwgVmFsdWU6IHRwLlJhcml0eX0sCgkJfSwKCX0KfQoKZnVuYyBhcnRpY2xlKHdvcmQgc3RyaW5nKSBzdHJpbmcgewoJaWYgd29yZCAhPSAiIiAmJiBzdHJpbmdzLkNvbnRhaW5zUnVuZSgiQUVJT1VhZWlvdSIsIHJ1bmUod29yZFswXSkpIHsKCQlyZXR1cm4gIkFuIgoJfQoJcmV0dXJuICJBIgp9CgpmdW5jIHBpZWNlRGlzcGxheU5hbWUoY29sb3JOYW1lLCBzdG9uZSwgc2hhcGUsIG1ldGFsLCBjaGFpbiBzdHJpbmcpIHN0cmluZyB7CglwaWVjZSA6PSBjb2xvck5hbWUgKyAiICIgKyBzdG9uZSArICIgIiArIHNoYXBlCglpZiBzdG9uZSA9PSAiUXVhcnR6IiB8fCBzdG9uZSA9PSAiIiB7CgkJcGllY2UgPSBjb2xvck5hbWUgKyAiICIgKyBzaGFwZQoJfQoJcmV0dXJuIHBpZWNlICsgIiDCtyAiICsgbWV0YWwgKyAiIFJpbmcgwrcgIiArIGNoYWluCn0KCmZ1bmMgY29sb3JOYW1lRm9yKHN0b25lIHN0cmluZywgY29sb3JJZHggaW50KSBzdHJpbmcgewoJcGFpcnMgOj0gc3RyaW5ncy5TcGxpdChhcnRwa2cuQ29sb3JQYWxldHRlQ1NWKHN0b25lKSwgIjsiKQoJaWYgY29sb3JJZHggPCAwIHx8IGNvbG9ySWR4ID49IGxlbihwYWlycykgewoJCXJldHVybiAiIgoJfQoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdE4ocGFpcnNbY29sb3JJZHhdLCAiOiIsIDIpCglpZiBsZW4ocGFydHMpICE9IDIgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIHBhcnRzWzFdCn0KCmZ1bmMgdHJhaXRPbmx5TWV0YWRhdGEodHAgdHJhaXRQcmVzZXQpIGdyYzcyMS5NZXRhZGF0YSB7CglzdG9uZSA6PSBhcnRwa2cuU3RvbmVGb3JDaGFpbih0cC5DaGFpbikKCXNoYXBlTmFtZSA6PSBhcnRwa2cuU2hhcGVOYW1lc1t0cC5TaGFwZUlkeF0KCWlmIHN0b25lID09ICJQZWFybCIgewoJCXNoYXBlTmFtZSA9IGFydHBrZy5QZWFybFNoYXBlTmFtZXNbdHAuU2hhcGVJZHhdCgl9Cgljb2xvck5hbWUgOj0gY29sb3JOYW1lRm9yKHN0b25lLCB0cC5Db2xvcklkeCkKCXN0YXR1cyA6PSAiU3Vuc2V0IgoJaWYgdHAuQWN0aXZlIHsKCQlzdGF0dXMgPSAiQWN0aXZlIgoJfQoJcmV0dXJuIGdyYzcyMS5NZXRhZGF0YXsKCQlOYW1lOiAgICAgICAgcGllY2VEaXNwbGF5TmFtZShjb2xvck5hbWUsIHN0b25lLCBzaGFwZU5hbWUsIHRwLk1ldGFsLCB0cC5DaGFpbiksCgkJRGVzY3JpcHRpb246IHVmbXQuU3ByaW50ZigiJXMgJXMgJXMgc2V0IGluIGEgJXMgcmluZywgbWludGVkIG9uICVzLiIsIGFydGljbGUoY29sb3JOYW1lKSwgY29sb3JOYW1lLCBzaGFwZU5hbWUsIHRwLk1ldGFsLCB0cC5DaGFpbiksCgkJQXR0cmlidXRlczogW11ncmM3MjEuVHJhaXR7CgkJCXtUcmFpdFR5cGU6ICJDaGFpbiIsIFZhbHVlOiB0cC5DaGFpbn0sCgkJCXtUcmFpdFR5cGU6ICJTdG9uZSIsIFZhbHVlOiBzdG9uZX0sCgkJCXtUcmFpdFR5cGU6ICJTaGFwZSIsIFZhbHVlOiBzaGFwZU5hbWV9LAoJCQl7VHJhaXRUeXBlOiAiQ29sb3IiLCBWYWx1ZTogY29sb3JOYW1lfSwKCQkJe1RyYWl0VHlwZTogIlJpbmciLCBWYWx1ZTogdHAuTWV0YWx9LAoJCQl7VHJhaXRUeXBlOiAiU3RhdHVzIiwgVmFsdWU6IHN0YXR1c30sCgkJCXtUcmFpdFR5cGU6ICJSYXJpdHkiLCBWYWx1ZTogdHAuUmFyaXR5fSwKCQl9LAoJfQp9CgpmdW5jIFRva2VuTWV0YWRhdGEodGlkIGdyYzcyMS5Ub2tlbklEKSAoZ3JjNzIxLk1ldGFkYXRhLCBlcnJvcikgeyByZXR1cm4gY3VycmVudE1ldGFkYXRhKHRpZCkgfQoKZnVuYyBUb2tlblVSSSh0aWQgZ3JjNzIxLlRva2VuSUQpIChzdHJpbmcsIGVycm9yKSB7CgltZXRhZGF0YSwgZXJyIDo9IGN1cnJlbnRNZXRhZGF0YSh0aWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIiIsIGVycgoJfQoJcmV0dXJuIG1ldGFkYXRhRGF0YVVSSShtZXRhZGF0YSksIG5pbAp9CgpmdW5jIGpzb25Fc2NhcGUocyBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciBpIDo9IDA7IGkgPCBsZW4ocyk7IGkrKyB7CgkJYyA6PSBzW2ldCgkJc3dpdGNoIGMgewoJCWNhc2UgJyInOgoJCQliLldyaXRlU3RyaW5nKGBcImApCgkJY2FzZSAnXFwnOgoJCQliLldyaXRlU3RyaW5nKGBcXGApCgkJZGVmYXVsdDoKCQkJYi5Xcml0ZUJ5dGUoYykKCQl9Cgl9CglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIG1ldGFkYXRhRGF0YVVSSShtIGdyYzcyMS5NZXRhZGF0YSkgc3RyaW5nIHsKCWltYWdlIDo9IG0uSW1hZ2UKCWlmIGltYWdlID09ICIiIHsKCQlpbWFnZSA9IG0uSW1hZ2VEYXRhCgl9Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoYHsibmFtZSI6ImApCgliLldyaXRlU3RyaW5nKGpzb25Fc2NhcGUobS5OYW1lKSkKCWIuV3JpdGVTdHJpbmcoYCIsImRlc2NyaXB0aW9uIjoiYCkKCWIuV3JpdGVTdHJpbmcoanNvbkVzY2FwZShtLkRlc2NyaXB0aW9uKSkKCWIuV3JpdGVTdHJpbmcoYCIsImltYWdlIjoiYCkKCWIuV3JpdGVTdHJpbmcoanNvbkVzY2FwZShpbWFnZSkpCgliLldyaXRlU3RyaW5nKGAiYCkKCWlmIG0uQmFja2dyb3VuZENvbG9yICE9ICIiIHsKCQliLldyaXRlU3RyaW5nKGAsImJhY2tncm91bmRfY29sb3IiOiJgKQoJCWIuV3JpdGVTdHJpbmcoanNvbkVzY2FwZShtLkJhY2tncm91bmRDb2xvcikpCgkJYi5Xcml0ZVN0cmluZyhgImApCgl9CgliLldyaXRlU3RyaW5nKGAsImF0dHJpYnV0ZXMiOltgKQoJZm9yIGksIHQgOj0gcmFuZ2UgbS5BdHRyaWJ1dGVzIHsKCQlpZiBpID4gMCB7CgkJCWIuV3JpdGVTdHJpbmcoIiwiKQoJCX0KCQliLldyaXRlU3RyaW5nKGB7InRyYWl0X3R5cGUiOiJgKQoJCWIuV3JpdGVTdHJpbmcoanNvbkVzY2FwZSh0LlRyYWl0VHlwZSkpCgkJYi5Xcml0ZVN0cmluZyhgIiwidmFsdWUiOiJgKQoJCWIuV3JpdGVTdHJpbmcoanNvbkVzY2FwZSh0LlZhbHVlKSkKCQliLldyaXRlU3RyaW5nKGAifWApCgl9CgliLldyaXRlU3RyaW5nKCJdfSIpCglyZXR1cm4gImRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsIiArIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUoYi5TdHJpbmcoKSkpCn0KCmZ1bmMgQXBwcm92ZShjdXIgcmVhbG0sIHRvIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgewoJY2hlY2tFcnIobmZ0LkFwcHJvdmUoY2FsbGVyQWRkcmVzcygpLCB0bywgdGlkKSkKfQoKZnVuYyBTZXRBcHByb3ZhbEZvckFsbChjdXIgcmVhbG0sIG9wZXJhdG9yIGFkZHJlc3MsIGFwcHJvdmVkIGJvb2wpIHsKCWNoZWNrRXJyKG5mdC5TZXRBcHByb3ZhbEZvckFsbChjYWxsZXJBZGRyZXNzKCksIG9wZXJhdG9yLCBhcHByb3ZlZCkpCn0KCmZ1bmMgVHJhbnNmZXJGcm9tKGN1ciByZWFsbSwgZnJvbSwgdG8gYWRkcmVzcywgdGlkIGdyYzcyMS5Ub2tlbklEKSB7CgljaGVja0VycihuZnQuVHJhbnNmZXJGcm9tKGNhbGxlckFkZHJlc3MoKSwgZnJvbSwgdG8sIHRpZCkpCn0KCmZ1bmMgU2FmZVRyYW5zZmVyRnJvbShjdXIgcmVhbG0sIGZyb20sIHRvIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgewoJY2hlY2tFcnIobmZ0LlNhZmVUcmFuc2ZlckZyb20oY2FsbGVyQWRkcmVzcygpLCBmcm9tLCB0bywgdGlkKSkKfQoKZnVuYyBCdXJuKGN1ciByZWFsbSwgdGlkIGdyYzcyMS5Ub2tlbklEKSB7CgljYWxsZXIgOj0gY2FsbGVyQWRkcmVzcygpCglvd25lciwgZXJyIDo9IG5mdC5Pd25lck9mKHRpZCkKCWNoZWNrRXJyKGVycikKCWlmIGNhbGxlciAhPSBvd25lciB7CgkJcGFuaWMoZ3JjNzIxLkVyckNhbGxlcklzTm90T3duZXIpCgl9CgoJa2V5IDo9IHRpZC5TdHJpbmcoKQoJdmFyIGFyY2hpdmVkIGdyYzcyMS5NZXRhZGF0YQoJaWYgdHAsIG9rIDo9IHNlYWxlZERhdGEuR2V0KGtleSkuKHRyYWl0UHJlc2V0KTsgb2sgewoJCWFyY2hpdmVkID0gdHJhaXRPbmx5TWV0YWRhdGEodHApCgl9CgoJaWYgY29tYm9LZXksIG9rIDo9IHRva2VuQ29tYm9LZXlzLkdldChrZXkpLihzdHJpbmcpOyBvayB7CgkJbWludGVkVHJhaXRDb21ib3MuUmVtb3ZlKGNvbWJvS2V5KQoJCXRva2VuQ29tYm9LZXlzLlJlbW92ZShrZXkpCgl9CglzZWFsZWREYXRhLlJlbW92ZShrZXkpCgltaW50SGVpZ2h0LlJlbW92ZShrZXkpCgoJY2hlY2tFcnIobmZ0LkJ1cm4odGlkKSkKCglidXJuZWRSZWNvcmRzLlNldChrZXksIGJ1cm5SZWNvcmR7CgkJQnVybmVkQnk6ICAgY2FsbGVyLAoJCUJ1cm5IZWlnaHQ6IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwKCQlNZXRhZGF0YTogICBhcmNoaXZlZCwKCX0pCglidXJuZWRJRHMgPSBhcHBlbmQoYnVybmVkSURzLCB0aWQpCn0KCmZ1bmMgdHJhaXRzVG9DU1YoYXR0cnMgW11ncmM3MjEuVHJhaXQpIHN0cmluZyB7CglwYWlycyA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oYXR0cnMpKQoJZm9yIGksIGEgOj0gcmFuZ2UgYXR0cnMgewoJCXBhaXJzW2ldID0gYS5UcmFpdFR5cGUgKyAiPSIgKyBhLlZhbHVlCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKHBhaXJzLCAiOyIpCn0KCmZ1bmMgVG9rZW5TdW1tYXJ5KHRpZCBncmM3MjEuVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpIHsgcmV0dXJuIHRva2VuU3VtbWFyeSh0aWQsIGZhbHNlKSB9CgpmdW5jIHRodW1iU3VtbWFyeSh0aWQgZ3JjNzIxLlRva2VuSUQpIChzdHJpbmcsIGVycm9yKSB7IHJldHVybiB0b2tlblN1bW1hcnkodGlkLCB0cnVlKSB9CgpmdW5jIHRva2VuU3VtbWFyeSh0aWQgZ3JjNzIxLlRva2VuSUQsIHRodW1iIGJvb2wpIChzdHJpbmcsIGVycm9yKSB7Cglvd25lciwgZXJyIDo9IG5mdC5Pd25lck9mKHRpZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgZXJyCgl9Cgl2YXIgbWV0YWRhdGEgZ3JjNzIxLk1ldGFkYXRhCglpZiB0cCwgb2sgOj0gc2VhbGVkRGF0YS5HZXQodGlkLlN0cmluZygpKS4odHJhaXRQcmVzZXQpOyB0aHVtYiAmJiBvayAmJiBJc1JldmVhbGVkKHRpZCkgewoJCXN0b3JlZCwgXyA6PSBuZnQuVG9rZW5NZXRhZGF0YSh0aWQpCgkJbWV0YWRhdGEgPSB0cmFpdE9ubHlNZXRhZGF0YSh0cCkKCQltZXRhZGF0YS5FeHRlcm5hbFVSTCA9IHN0b3JlZC5FeHRlcm5hbFVSTAoJCW1ldGFkYXRhLkJhY2tncm91bmRDb2xvciA9ICIwYTBiMTAiCgkJc3ZnIDo9IGFydHBrZy5SZW5kZXJUb2tlblRodW1iU1ZHKHRwLkNoYWluLCB0cC5NZXRhbCwgdHAuU2hhcGVJZHgsIHRwLkNvbG9ySWR4LCB0cC5BY3RpdmUsIHRpZC5TdHJpbmcoKSkKCQltZXRhZGF0YS5JbWFnZSA9ICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgKyBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHN2ZykpCgl9IGVsc2UgewoJCW1ldGFkYXRhLCBlcnIgPSBjdXJyZW50TWV0YWRhdGEodGlkKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gIiIsIGVycgoJCX0KCX0KCWVuYyA6PSBiYXNlNjQuU3RkRW5jb2RpbmcKCWZpZWxkcyA6PSBbXXN0cmluZ3sKCQl0aWQuU3RyaW5nKCksCgkJb3duZXIuU3RyaW5nKCksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShtZXRhZGF0YS5OYW1lKSksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShtZXRhZGF0YS5EZXNjcmlwdGlvbikpLAoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUobWV0YWRhdGEuSW1hZ2UpKSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKG1ldGFkYXRhLkV4dGVybmFsVVJMKSksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZSh0cmFpdHNUb0NTVihtZXRhZGF0YS5BdHRyaWJ1dGVzKSkpLAoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUobWV0YWRhdGEuQmFja2dyb3VuZENvbG9yKSksCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKGZpZWxkcywgInwiKSwgbmlsCn0KCmZ1bmMgQ29sbGVjdGlvblN1bW1hcnkocGFnZSBpbnQpIHN0cmluZyB7Cgl0b3RhbCA6PSBsZW4obWludGVkSURzKQoJaWYgcGFnZSA8IDEgewoJCXBhZ2UgPSAxCgl9CglzdGFydEsgOj0gKHBhZ2UgLSAxKSAqIHN1bW1hcnlQYWdlU2l6ZQoJZW5kSyA6PSBzdGFydEsgKyBzdW1tYXJ5UGFnZVNpemUKCWlmIGVuZEsgPiB0b3RhbCB7CgkJZW5kSyA9IHRvdGFsCgl9Cgl2YXIgbGluZXMgW11zdHJpbmcKCWZvciBrIDo9IHN0YXJ0SzsgayA8IGVuZEs7IGsrKyB7CgkJdGlkIDo9IG1pbnRlZElEc1t0b3RhbC0xLWtdCgkJbGluZSwgZXJyIDo9IHRodW1iU3VtbWFyeSh0aWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCWNvbnRpbnVlCgkJfQoJCWxpbmVzID0gYXBwZW5kKGxpbmVzLCBsaW5lKQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihsaW5lcywgIlxuIikKfQoKY29uc3QgKAoJd2FsbGV0U2NhbkNodW5rID0gMTAwCgl3YWxsZXRSZW5kZXJDYXAgPSBzdW1tYXJ5UGFnZVNpemUKKQoKZnVuYyBXYWxsZXRTdW1tYXJ5KG93bmVyIGFkZHJlc3MsIHN0YXJ0SWR4IGludDY0KSAoc3VtbWFyeSBzdHJpbmcsIG5leHRJZHggaW50NjQpIHsKCXRvdGFsIDo9IGxlbihtaW50ZWRJRHMpCglzdGFydCA6PSBpbnQoc3RhcnRJZHgpCglpZiBzdGFydCA8IDAgewoJCXN0YXJ0ID0gMAoJfQoJZW5kIDo9IHN0YXJ0ICsgd2FsbGV0U2NhbkNodW5rCglpZiBlbmQgPiB0b3RhbCB7CgkJZW5kID0gdG90YWwKCX0KCXZhciBsaW5lcyBbXXN0cmluZwoJayA6PSBzdGFydAoJZm9yIDsgayA8IGVuZDsgaysrIHsKCQlpZiBsZW4obGluZXMpID49IHdhbGxldFJlbmRlckNhcCB7CgkJCWJyZWFrCgkJfQoJCXRpZCA6PSBtaW50ZWRJRHNbdG90YWwtMS1rXQoJCXRva2VuT3duZXIsIGVyciA6PSBuZnQuT3duZXJPZih0aWQpCgkJaWYgZXJyICE9IG5pbCB8fCB0b2tlbk93bmVyICE9IG93bmVyIHsKCQkJY29udGludWUKCQl9CgkJbGluZSwgZXJyIDo9IHRodW1iU3VtbWFyeSh0aWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCWNvbnRpbnVlCgkJfQoJCWxpbmVzID0gYXBwZW5kKGxpbmVzLCBsaW5lKQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihsaW5lcywgIlxuIiksIGludDY0KGspCn0KCmZ1bmMgQnVybmVkVG9rZW5TdW1tYXJ5KHRpZCBncmM3MjEuVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpIHsKCXJhdyA6PSBidXJuZWRSZWNvcmRzLkdldCh0aWQuU3RyaW5nKCkpCglyZWMsIG9rIDo9IHJhdy4oYnVyblJlY29yZCkKCWlmICFvayB7CgkJcmV0dXJuICIiLCBncmM3MjEuRXJySW52YWxpZFRva2VuSWQKCX0KCWVuYyA6PSBiYXNlNjQuU3RkRW5jb2RpbmcKCWZpZWxkcyA6PSBbXXN0cmluZ3sKCQl0aWQuU3RyaW5nKCksCgkJcmVjLkJ1cm5lZEJ5LlN0cmluZygpLAoJCXVmbXQuU3ByaW50ZigiJWQiLCByZWMuQnVybkhlaWdodCksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShyZWMuTWV0YWRhdGEuTmFtZSkpLAoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUocmVjLk1ldGFkYXRhLkRlc2NyaXB0aW9uKSksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShyZWMuTWV0YWRhdGEuSW1hZ2UpKSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHJlYy5NZXRhZGF0YS5FeHRlcm5hbFVSTCkpLAoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUodHJhaXRzVG9DU1YocmVjLk1ldGFkYXRhLkF0dHJpYnV0ZXMpKSksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShyZWMuTWV0YWRhdGEuQmFja2dyb3VuZENvbG9yKSksCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKGZpZWxkcywgInwiKSwgbmlsCn0KCmZ1bmMgYmlnVG9rZW5JbWFnZShpbWFnZSBzdHJpbmcpIHN0cmluZyB7Cgljb25zdCBwcmVmaXggPSAiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwiCglpZiAhc3RyaW5ncy5IYXNQcmVmaXgoaW1hZ2UsIHByZWZpeCkgewoJCXJldHVybiBpbWFnZQoJfQoJcmF3LCBlcnIgOj0gYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZVN0cmluZyhpbWFnZVtsZW4ocHJlZml4KTpdKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGltYWdlCgl9CglzdmcgOj0gc3RyaW5nKHJhdykKCXJlc2l6ZWQgOj0gc3RyaW5ncy5SZXBsYWNlKHN2ZywgYHdpZHRoPSIxNzAuMDAiIGhlaWdodD0iMTcwLjAwImAsIGB3aWR0aD0iYCt0b2tlblBhZ2VJbWFnZVNpemUrYCIgaGVpZ2h0PSJgK3Rva2VuUGFnZUltYWdlU2l6ZStgImAsIDEpCglpZiByZXNpemVkID09IHN2ZyB7CgkJcmVzaXplZCA9IHN0cmluZ3MuUmVwbGFjZShzdmcsIGB3aWR0aD0iMTcwIiBoZWlnaHQ9IjE3MCJgLCBgd2lkdGg9ImArdG9rZW5QYWdlSW1hZ2VTaXplK2AiIGhlaWdodD0iYCt0b2tlblBhZ2VJbWFnZVNpemUrYCJgLCAxKQoJfQoJcmV0dXJuIHByZWZpeCArIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUocmVzaXplZCkpCn0KCmZ1bmMgcmVuZGVyTWludGVkTGlzdFBhZ2UoYiAqc3RyaW5ncy5CdWlsZGVyLCBwYWdlIGludCkgewoJdG90YWwgOj0gbGVuKG1pbnRlZElEcykKCWlmIHRvdGFsID09IDAgewoJCXJldHVybgoJfQoJdG90YWxQYWdlcyA6PSAodG90YWwgKyBnbm93ZWJMaXN0TGltaXQgLSAxKSAvIGdub3dlYkxpc3RMaW1pdAoJaWYgcGFnZSA8IDEgewoJCXBhZ2UgPSAxCgl9CglpZiBwYWdlID4gdG90YWxQYWdlcyB7CgkJcGFnZSA9IHRvdGFsUGFnZXMKCX0KCXN0YXJ0SyA6PSAocGFnZSAtIDEpICogZ25vd2ViTGlzdExpbWl0CgllbmRLIDo9IHN0YXJ0SyArIGdub3dlYkxpc3RMaW1pdAoJaWYgZW5kSyA+IHRvdGFsIHsKCQllbmRLID0gdG90YWwKCX0KCgliLldyaXRlU3RyaW5nKCJcbiMjIE1pbnRlZCBzbyBmYXJcblxuIikKCWlmIHRvdGFsUGFnZXMgPiAxIHsKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiX3BhZ2UgJWQgb2YgJWQgLS0gJWQgbWludGVkIHRvdGFsX1xuXG4iLCBwYWdlLCB0b3RhbFBhZ2VzLCB0b3RhbCkpCgl9CgliLldyaXRlU3RyaW5nKCJ8IEltYWdlIHwgSW5kZXggfCBOYW1lIHwgT3duZXIgfFxufC0tLXwtLS18LS0tfC0tLXxcbiIpCglmb3IgayA6PSBzdGFydEs7IGsgPCBlbmRLOyBrKysgewoJCXRpZCA6PSBtaW50ZWRJRHNbdG90YWwtMS1rXQoJCWxpbmsgOj0gcmVhbG1SZWxQYXRoICsgIjp0b2tlbi8iICsgdGlkLlN0cmluZygpCgkJb3duZXIsIGVyciA6PSBuZnQuT3duZXJPZih0aWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJhdyA6PSBidXJuZWRSZWNvcmRzLkdldCh0aWQuU3RyaW5nKCkpCgkJCXJlYywgb2sgOj0gcmF3LihidXJuUmVjb3JkKQoJCQlpZiAhb2sgewoJCQkJY29udGludWUgLy8gc2hvdWxkbid0IGhhcHBlbjogYnVybmVkIGJ1dCBubyBhcmNoaXZlIHJlY29yZAoJCQl9CgkJCW5hbWUgOj0gcmVjLk1ldGFkYXRhLk5hbWUKCQkJaWYgbmFtZSA9PSAiIiB7CgkJCQluYW1lID0gIlVudGl0bGVkIgoJCQl9CgkJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJ8IEJ1cm5lZCB8IFsjJXNdKCVzKSB8ICVzIChidXJuZWQgYXQgYmxvY2sgJWQpIHwgJXMgfFxuIiwgdGlkLlN0cmluZygpLCBsaW5rLCBuYW1lLCByZWMuQnVybkhlaWdodCwgcmVjLkJ1cm5lZEJ5KSkKCQkJY29udGludWUKCQl9CgkJbmFtZSwgaW1hZ2UgOj0gbGlzdFJvdyh0aWQpCgkJaW1nQ2VsbCA6PSAiIgoJCWlmIGltYWdlICE9ICIiIHsKCQkJaW1nQ2VsbCA9IHVmbXQuU3ByaW50ZigiWyFbJXNdKCVzKV0oJXMpIiwgbmFtZSwgaW1hZ2UsIGxpbmspCgkJfQoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJ8ICVzIHwgWyMlc10oJXMpIHwgJXMgfCAlcyB8XG4iLCBpbWdDZWxsLCB0aWQuU3RyaW5nKCksIGxpbmssIG5hbWUsIG93bmVyKSkKCX0KCWIuV3JpdGVTdHJpbmcoIlxuIikKCglyZW5kZXJQYWdlTGlua3MoYiwgcGFnZSwgdG90YWxQYWdlcywgInBhZ2UiKQp9CgpmdW5jIHJlbmRlclBhZ2VMaW5rcyhiICpzdHJpbmdzLkJ1aWxkZXIsIHBhZ2UsIHRvdGFsUGFnZXMgaW50LCBsaW5rQmFzZSBzdHJpbmcpIHsKCWlmIHRvdGFsUGFnZXMgPD0gMSB7CgkJcmV0dXJuCgl9CgliLldyaXRlU3RyaW5nKCJcbiIpCglwYXJ0cyA6PSBbXXN0cmluZ3t9CglpZiBwYWdlID4gMSB7CgkJcGFydHMgPSBhcHBlbmQocGFydHMsIHVmbXQuU3ByaW50ZigiWzw8IEZpcnN0XSglczolcy8xKSIsIHJlYWxtUmVsUGF0aCwgbGlua0Jhc2UpKQoJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCB1Zm10LlNwcmludGYoIls8LSBuZXdlcl0oJXM6JXMvJWQpIiwgcmVhbG1SZWxQYXRoLCBsaW5rQmFzZSwgcGFnZS0xKSkKCX0KCWxhc3RTaG93biA6PSAwCglmb3IgcCA6PSAxOyBwIDw9IHRvdGFsUGFnZXM7IHArKyB7CgkJaWYgcCAhPSAxICYmIHAgIT0gdG90YWxQYWdlcyAmJiAocCA8IHBhZ2UtcGFnZVdpbmRvdyB8fCBwID4gcGFnZStwYWdlV2luZG93KSB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIGxhc3RTaG93biAhPSAwICYmIHAgIT0gbGFzdFNob3duKzEgewoJCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgIi4uLiIpCgkJfQoJCWlmIHAgPT0gcGFnZSB7CgkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCB1Zm10LlNwcmludGYoIioqJWQqKiIsIHApKQoJCX0gZWxzZSB7CgkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCB1Zm10LlNwcmludGYoIlslZF0oJXM6JXMvJWQpIiwgcCwgcmVhbG1SZWxQYXRoLCBsaW5rQmFzZSwgcCkpCgkJfQoJCWxhc3RTaG93biA9IHAKCX0KCWlmIHBhZ2UgPCB0b3RhbFBhZ2VzIHsKCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgdWZtdC5TcHJpbnRmKCJbb2xkZXIgLT5dKCVzOiVzLyVkKSIsIHJlYWxtUmVsUGF0aCwgbGlua0Jhc2UsIHBhZ2UrMSkpCgkJcGFydHMgPSBhcHBlbmQocGFydHMsIHVmbXQuU3ByaW50ZigiW0xhc3QgPj5dKCVzOiVzLyVkKSIsIHJlYWxtUmVsUGF0aCwgbGlua0Jhc2UsIHRvdGFsUGFnZXMpKQoJfQoJYi5Xcml0ZVN0cmluZyhzdHJpbmdzLkpvaW4ocGFydHMsICIgLSAiKSkKCWIuV3JpdGVTdHJpbmcoIlxuIikKfQoKZnVuYyByZW5kZXJCdXJuZWRMaXN0UGFnZShiICpzdHJpbmdzLkJ1aWxkZXIsIHBhZ2UgaW50KSB7Cgl0b3RhbCA6PSBsZW4oYnVybmVkSURzKQoJaWYgdG90YWwgPT0gMCB7CgkJcmV0dXJuCgl9Cgl0b3RhbFBhZ2VzIDo9ICh0b3RhbCArIGdub3dlYkxpc3RMaW1pdCAtIDEpIC8gZ25vd2ViTGlzdExpbWl0CglpZiBwYWdlIDwgMSB7CgkJcGFnZSA9IDEKCX0KCWlmIHBhZ2UgPiB0b3RhbFBhZ2VzIHsKCQlwYWdlID0gdG90YWxQYWdlcwoJfQoJc3RhcnRLIDo9IChwYWdlIC0gMSkgKiBnbm93ZWJMaXN0TGltaXQKCWVuZEsgOj0gc3RhcnRLICsgZ25vd2ViTGlzdExpbWl0CglpZiBlbmRLID4gdG90YWwgewoJCWVuZEsgPSB0b3RhbAoJfQoKCWIuV3JpdGVTdHJpbmcoIlxuIyMgQnVybmVkIHRva2Vuc1xuXG4iKQoJaWYgdG90YWxQYWdlcyA+IDEgewoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJfcGFnZSAlZCBvZiAlZCAtLSAlZCBidXJuZWQgdG90YWxfXG5cbiIsIHBhZ2UsIHRvdGFsUGFnZXMsIHRvdGFsKSkKCX0KCWIuV3JpdGVTdHJpbmcoInwgSW5kZXggfCBOYW1lIHwgQnVybmVkIEJ5IHwgQmxvY2sgfFxufC0tLXwtLS18LS0tfC0tLXxcbiIpCglmb3IgayA6PSBzdGFydEs7IGsgPCBlbmRLOyBrKysgewoJCXRpZCA6PSBidXJuZWRJRHNbdG90YWwtMS1rXQoJCXJhdyA6PSBidXJuZWRSZWNvcmRzLkdldCh0aWQuU3RyaW5nKCkpCgkJcmVjLCBvayA6PSByYXcuKGJ1cm5SZWNvcmQpCgkJaWYgIW9rIHsKCQkJY29udGludWUKCQl9CgkJbmFtZSA6PSByZWMuTWV0YWRhdGEuTmFtZQoJCWlmIG5hbWUgPT0gIiIgewoJCQluYW1lID0gIlVudGl0bGVkIgoJCX0KCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCAjJXMgfCAlcyB8ICVzIHwgJWQgfFxuIiwgdGlkLlN0cmluZygpLCBuYW1lLCByZWMuQnVybmVkQnksIHJlYy5CdXJuSGVpZ2h0KSkKCX0KCWIuV3JpdGVTdHJpbmcoIlxuIikKCglyZW5kZXJQYWdlTGlua3MoYiwgcGFnZSwgdG90YWxQYWdlcywgImJ1cm5lZC9wYWdlIikKfQoKZnVuYyByZW5kZXJCdXJuZWRUb2tlblBhZ2UodGlkIGdyYzcyMS5Ub2tlbklEKSBzdHJpbmcgewoJcmF3IDo9IGJ1cm5lZFJlY29yZHMuR2V0KHRpZC5TdHJpbmcoKSkKCXJlYywgb2sgOj0gcmF3LihidXJuUmVjb3JkKQoJaWYgIW9rIHsKCQlyZXR1cm4gcmVuZGVyNDA0KCkKCX0KCW5hbWUgOj0gcmVjLk1ldGFkYXRhLk5hbWUKCWlmIG5hbWUgPT0gIiIgewoJCW5hbWUgPSAiVW50aXRsZWQiCgl9Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIjICVzICMlcyAoYnVybmVkKVxuXG5bPC0gYmFjayB0byBjb2xsZWN0aW9uXSglcylcblxuIiwgbmZ0Lk5hbWUoKSwgdGlkLlN0cmluZygpLCByZWFsbVJlbFBhdGgpKQoJYi5Xcml0ZVN0cmluZygiIyMgRGV0YWlsc1xuXG4iKQoJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipDb2xsZWN0aW9uKio6ICVzXG4iLCBuZnQuTmFtZSgpKSkKCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqTmFtZSoqOiAlc1xuIiwgbmFtZSkpCgliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkluZGV4Kio6ICMlc1xuIiwgdGlkLlN0cmluZygpKSkKCWlmIHJlYy5NZXRhZGF0YS5EZXNjcmlwdGlvbiAhPSAiIiB7CgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipEZXNjcmlwdGlvbioqOiAlc1xuIiwgcmVjLk1ldGFkYXRhLkRlc2NyaXB0aW9uKSkKCX0KCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqU3RhdHVzKio6IGJ1cm5lZCBieSAlcyBhdCBibG9jayAlZFxuIiwgcmVjLkJ1cm5lZEJ5LCByZWMuQnVybkhlaWdodCkpCgliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkFyY2hpdmUqKjogW2FsbCBidXJuZWQgdG9rZW5zXSglczpidXJuZWQpXG4iLCByZWFsbVJlbFBhdGgpKQoJaWYgbGVuKHJlYy5NZXRhZGF0YS5BdHRyaWJ1dGVzKSA+IDAgewoJCWIuV3JpdGVTdHJpbmcoIlxuIyMgVHJhaXRzXG5cbiIpCgkJZm9yIF8sIGF0dHIgOj0gcmFuZ2UgcmVjLk1ldGFkYXRhLkF0dHJpYnV0ZXMgewoJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKiVzKio6ICVzXG4iLCBhdHRyLlRyYWl0VHlwZSwgYXR0ci5WYWx1ZSkpCgkJfQoJfQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyByZW5kZXI0MDQoKSBzdHJpbmcgewoJcmV0dXJuIHVmbXQuU3ByaW50ZigiIyA0MDRcblxuWzwtIGJhY2sgdG8gY29sbGVjdGlvbl0oJXMpXG4iLCByZWFsbVJlbFBhdGgpCn0KCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgcGF0aCA9PSAiIiB7CgkJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgkJYi5Xcml0ZVN0cmluZyhuZnQuUmVuZGVySG9tZSgpKQoJCWIuV3JpdGVTdHJpbmcoIlxuIyMgQWJvdXRcblxuIikKCQliLldyaXRlU3RyaW5nKENvbGxlY3Rpb25OYW1lICsgIjogZWFjaCBwaWVjZSdzIENoYWluIHRyYWl0IG5hbWVzIGEgZ25vLmxhbmQgY2hhaW4gZ2VuZXJhdGlvbiwgYW5kIGl0cyBzdG9uZSBpcyB0aGF0IGNoYWluJ3MgcmVhbCBzdG9uZSAtLSBUb3BheiwgU2FwcGhpcmUsIFBlYXJsLCBEaWFtb25kIGZvciBtYWlubmV0LCBRdWFydHogZm9yIHRoZSB0ZXN0bmV0cyB3aXRob3V0IG9uZS4gT25seSByZWFsIGN1dHMgYW5kIGNvbG91cnM7IGV2ZXJ5IGltYWdlIGlzIGRyYXduIG9uLWNoYWluLiBEZWxheWVkLXJldmVhbCBtaW50IChyZWFsIG1ldGFkYXRhIHNlYWxlZCBmb3IgYSBzaG9ydCBkZWxheSBhZnRlciBtaW50aW5nKS5cblxuIikKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKk93bmVyKio6ICVzXG4iLCBPd25lcigpKSkKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkFzc2VtYmxlZCB0cmFpdCBjb21iaW5hdGlvbnMgbWludGVkKio6ICVkXG4iLCBpbnQ2NChtaW50ZWRUcmFpdENvbWJvcy5TaXplKCkpKSkKCQliLldyaXRlU3RyaW5nKCIqICoqTWF4IHN1cHBseSoqOiB1bmxpbWl0ZWRcbiIpCgkJaWYgbWludGluZ09wZW5NaXJyb3IgewoJCQliLldyaXRlU3RyaW5nKCIqICoqTWludGluZyoqOiBvcGVuXG4iKQoJCX0gZWxzZSB7CgkJCWIuV3JpdGVTdHJpbmcoIiogKipNaW50aW5nKio6IGNsb3NlZFxuIikKCQl9CgkJaWYgbWludFByaWNlVWdub3QgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipNaW50IHByaWNlKio6ICVkIHVnbm90XG4iLCBtaW50UHJpY2VVZ25vdCkpCgkJfSBlbHNlIHsKCQkJYi5Xcml0ZVN0cmluZygiKiAqKk1pbnQgcHJpY2UqKjogZnJlZVxuIikKCQl9CgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipSZXZlYWwgZGVsYXkqKjogJWQgYmxvY2socylcbiIsIFJldmVhbERlbGF5QmxvY2tzKSkKCQlpZiBtYXhNaW50c1BlcldhbGxldE1pcnJvciA+IDAgewoJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKk1heCBtaW50cyBwZXIgd2FsbGV0Kio6ICVkXG4iLCBtYXhNaW50c1BlcldhbGxldE1pcnJvcikpCgkJfSBlbHNlIHsKCQkJYi5Xcml0ZVN0cmluZygiKiAqKk1heCBtaW50cyBwZXIgd2FsbGV0Kio6IHVubGltaXRlZFxuIikKCQl9CgkJaWYgcm95YWx0eUJwcyA+IDAgewoJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKlNlY29uZGFyeSBzYWxlIHJveWFsdHkqKjogJWQuJTAyZCUlIChFSVAtMjk4MSBSb3lhbHR5SW5mbylcbiIsIHJveWFsdHlCcHMvMTAwLCByb3lhbHR5QnBzJTEwMCkpCgkJfQoJCWlmIGxlbihidXJuZWRJRHMpID4gMCB7CgkJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqQnVybmVkKio6ICVkIC0tIFt2aWV3IGJ1cm5lZCB0b2tlbnMgLT5dKCVzOmJ1cm5lZClcbiIsIGxlbihidXJuZWRJRHMpLCByZWFsbVJlbFBhdGgpKQoJCX0KCgkJcmVuZGVyTWludGVkTGlzdFBhZ2UoJmIsIDEpCgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCglwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KHBhdGgsICIvIikKCWlmIGxlbihwYXJ0cykgPT0gMiAmJiBwYXJ0c1swXSA9PSAicGFnZSIgewoJCXBhZ2UsIGVyciA6PSBzdHJjb252LkF0b2kocGFydHNbMV0pCgkJaWYgZXJyICE9IG5pbCB8fCBwYWdlIDwgMSB7CgkJCXJldHVybiByZW5kZXI0MDQoKQoJCX0KCQl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiIyAlcyAtLSBtaW50ZWQgdG9rZW5zXG5cbls8LSBiYWNrIHRvIGNvbGxlY3Rpb25dKCVzKVxuIiwgbmZ0Lk5hbWUoKSwgcmVhbG1SZWxQYXRoKSkKCQlyZW5kZXJNaW50ZWRMaXN0UGFnZSgmYiwgcGFnZSkKCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoJaWYgcGFydHNbMF0gPT0gImJ1cm5lZCIgewoJCXBhZ2UgOj0gMQoJCWlmIGxlbihwYXJ0cykgPT0gMyAmJiBwYXJ0c1sxXSA9PSAicGFnZSIgewoJCQlwLCBlcnIgOj0gc3RyY29udi5BdG9pKHBhcnRzWzJdKQoJCQlpZiBlcnIgIT0gbmlsIHx8IHAgPCAxIHsKCQkJCXJldHVybiByZW5kZXI0MDQoKQoJCQl9CgkJCXBhZ2UgPSBwCgkJfSBlbHNlIGlmIGxlbihwYXJ0cykgIT0gMSB7CgkJCXJldHVybiByZW5kZXI0MDQoKQoJCX0KCQl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiIyAlcyAtLSBidXJuZWQgdG9rZW5zXG5cbls8LSBiYWNrIHRvIGNvbGxlY3Rpb25dKCVzKVxuIiwgbmZ0Lk5hbWUoKSwgcmVhbG1SZWxQYXRoKSkKCQlyZW5kZXJCdXJuZWRMaXN0UGFnZSgmYiwgcGFnZSkKCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoJaWYgbGVuKHBhcnRzKSA9PSAyICYmIHBhcnRzWzBdID09ICJ0b2tlbiIgewoJCXRpZCA6PSBncmM3MjEuVG9rZW5JRChwYXJ0c1sxXSkKCQlvd25lciwgZXJyIDo9IG5mdC5Pd25lck9mKHRpZCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIHJlbmRlckJ1cm5lZFRva2VuUGFnZSh0aWQpCgkJfQoJCW1ldGFkYXRhLCBfIDo9IGN1cnJlbnRNZXRhZGF0YSh0aWQpCgkJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiMgJXMgIyVzXG5cbls8LSBiYWNrIHRvIGNvbGxlY3Rpb25dKCVzKVxuXG4iLCBuZnQuTmFtZSgpLCB0aWQuU3RyaW5nKCksIHJlYWxtUmVsUGF0aCkpCgkJaW1hZ2UgOj0gbWV0YWRhdGEuSW1hZ2UKCQlpZiBpbWFnZSA9PSAiIiB7CgkJCWltYWdlID0gbWV0YWRhdGEuSW1hZ2VEYXRhCgkJfQoJCW5hbWUgOj0gbWV0YWRhdGEuTmFtZQoJCWlmIG5hbWUgPT0gIiIgewoJCQluYW1lID0gIlVudGl0bGVkIgoJCX0KCQlpZiBpbWFnZSAhPSAiIiB7CgkJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIhWyVzXSglcylcblxuIiwgbmFtZSwgYmlnVG9rZW5JbWFnZShpbWFnZSkpKQoJCX0KCgkJYi5Xcml0ZVN0cmluZygiIyMgRGV0YWlsc1xuXG4iKQoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqQ29sbGVjdGlvbioqOiAlc1xuIiwgbmZ0Lk5hbWUoKSkpCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipOYW1lKio6ICVzXG4iLCBuYW1lKSkKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkluZGV4Kio6ICMlc1xuIiwgdGlkLlN0cmluZygpKSkKCQlpZiBtZXRhZGF0YS5EZXNjcmlwdGlvbiAhPSAiIiB7CgkJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqRGVzY3JpcHRpb24qKjogJXNcbiIsIG1ldGFkYXRhLkRlc2NyaXB0aW9uKSkKCQl9CgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipPd25lcioqOiAlc1xuIiwgb3duZXIpKQoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqUmV2ZWFsZWQqKjogJXQgKGFnZSAlZCBibG9jayhzKSlcbiIsIElzUmV2ZWFsZWQodGlkKSwgQWdlKHRpZCkpKQoKCQlpZiBsZW4obWV0YWRhdGEuQXR0cmlidXRlcykgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZygiXG4jIyBUcmFpdHNcblxuIikKCQkJZm9yIF8sIGF0dHIgOj0gcmFuZ2UgbWV0YWRhdGEuQXR0cmlidXRlcyB7CgkJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKiVzKio6ICVzXG4iLCBhdHRyLlRyYWl0VHlwZSwgYXR0ci5WYWx1ZSkpCgkJCX0KCQl9CgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCglyZXR1cm4gcmVuZGVyNDA0KCkKfQoKZnVuYyBjaGVja0VycihlcnIgZXJyb3IpIHsKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTE3MDAwMDAwdWdub3QSEQisnfwtEgo0ODIwNHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAmZ5o8YfM9QJ/120fX+9FT8V+U0E7tB46swEA7Z5uzFQEkDNhlIbv50am9WzofHVtsWzdAMqnODhC5kG9Y2iSQ8cLQDaKOWH7wXy6tOsiWoHzoRndQKxfOMpUngyNeoD1ezRGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl