Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
FD4170C50BDE923C544151EED2B50250545457E7598E63DA02813C0DE09679AD
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
55,020,444
Requested gas limit
GAS USED
52,400,392
Gas consumed
FEE
55021ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CtKzAgoML3ZtLm1fYWRkcGtnEsCzAgooZzFsbmt5dGZxY2p3bGx3czYzZ3ZmMG12OXl0MDRhc3d5NHk5YW1obRKSswIKA2FwcBI6Z25vLmxhbmQvcC9nMWxua3l0ZnFjandsbHdzNjNndmYwbXY5eXQwNGFzd3k0eTlhbWhtL2FwcC92MBqXdwoHYXBwLmdubxKLdy8vIFBhY2thZ2UgYXBwIGlzIGFuIHVwZ3JhZGVhYmxlIHJlYWxtIGluIGEgaGFuZGZ1bCBvZiBmb3J3YXJkaW5nIGZ1bmN0aW9ucy4KLy8KLy8gSXQgYW5zd2VycyBhIG5hcnJvd2VyIHF1ZXN0aW9uIHRoYW4gW3VwZ3JhZGVhYmxlXSBkb2VzLiBUaGF0IHBhY2thZ2UgZ2l2ZXMKLy8geW91IGEgcHJveHkgYW5kIGxlYXZlcyB0aGUgc2hhcGUgb2YgeW91ciByZWFsbSB0byB5b3U6IHlvdXIgaW50ZXJmYWNlLCB5b3VyCi8vIHN0YXRlLCB5b3VyIGVudHJ5IHBvaW50cywgYWxsIG9mIHRoZW0gcGVybWFuZW50LiBUaGlzIG9uZSBtYWtlcyBhIGRpZmZlcmVudAovLyB0cmFkZSDigJQgaXQgZml4ZXMgdGhlIHNoYXBlIG9uY2UsIGdlbmVyaWNhbGx5LCBzbyB0aGF0IG5vdGhpbmcgYWJvdXQgeW91cgovLyBhcHBsaWNhdGlvbiBpcyBwZXJtYW5lbnQgZXhjZXB0IHRoZSBwYXRoLgovLwovLwlwYWNrYWdlIHRvZG8KLy8KLy8JaW1wb3J0ICJnbm8ubGFuZC9wL2cxbG5reXRmcWNqd2xsd3M2M2d2ZjBtdjl5dDA0YXN3eTR5OWFtaG0vYXBwL3YwIgovLwovLwljb25zdCBBZG1pbiA9IGFkZHJlc3MoImcx4oCmIikKLy8KLy8JdmFyIGEgPSBhcHAuTmV3KGFwcC5Pd25lcihBZG1pbikpCi8vCi8vCWZ1bmMgaW5pdChjdXIgcmVhbG0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBhLkJpbmQoMCwgY3VyKSB9Ci8vCWZ1bmMgQ2FsbChjdXIgcmVhbG0sIHZlcmIsIHBheWxvYWQgc3RyaW5nKSBzdHJpbmcgeyByZXR1cm4gYS5DYWxsKDAsIGN1ciwgdmVyYiwgcGF5bG9hZCkgfQovLwlmdW5jIFJlZ2lzdGVyKGN1ciByZWFsbSwgaCBhcHAuSGFuZGxlcikgICAgICAgICAgIHsgYS5SZWdpc3RlcigwLCBjdXIsIGgpIH0KLy8JZnVuYyBNYW5hZ2UoY3VyIHJlYWxtLCB2ZXJiLCBhcmcgc3RyaW5nKSBzdHJpbmcgICB7IHJldHVybiBhLkFkbWluKDAsIGN1ciwgdmVyYiwgYXJnKSB9Ci8vCWZ1bmMgU3RvcmUoXyBpbnQsIHJsbSByZWFsbSkgKmFwcC5TdG9yZSAgICAgICAgICAgeyByZXR1cm4gYS5TdG9yZSgwLCBybG0pIH0KLy8JZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyAgICAgICAgICAgICAgICAgICB7IHJldHVybiBhLlJlbmRlcihwYXRoKSB9Ci8vCi8vIFRoYXQgcmVhbG0gbmV2ZXIgbmVlZHMgdG8gY2hhbmdlIGFnYWluLiBJdHMgQVBJIGlzIFtIYW5kbGVyXSdzIHZlcmIgc2V0LAovLyB3aGljaCBpcyBkYXRhOyBpdHMgc3RhdGUgaXMgYSBbU3RvcmVdLCB3aG9zZSBrZXlzIGFyZSBkYXRhLiBBIGxhdGVyCi8vIGltcGxlbWVudGF0aW9uIGFkZHMgdmVyYnMgYW5kIGtleXMgZnJlZWx5LCBhbmQgY2FsbGVycyByZWFjaCB0aGVtIHRocm91Z2gKLy8gdGhlIHNhbWUgQ2FsbC4KLy8KLy8gIyBXaHkgdGhlIGZvcndhcmRzIGNhbm5vdCBiZSBhdm9pZGVkCi8vCi8vIFRob3NlIHNpeCBsaW5lcyBhcmUgdGhlIGlycmVkdWNpYmxlIG1pbmltdW0uIEEgYHAvYCBwYWNrYWdlIGNhbm5vdCBkZWNsYXJlCi8vIGNyb3NzaW5nIGZ1bmN0aW9ucywgYW5kIGBNc2dDYWxsYCByZWFjaGVzIGEgZnVuY3Rpb24gYnkgbmFtZSBhdCBhIHJlYWxtCi8vIHBhdGgg4oCUIHNvIGV2ZXJ5IGVudHJ5IHBvaW50IGEgdXNlciBjYWxscyBoYXMgdG8gYmUgZGVjbGFyZWQgaW4geW91ciByZWFsbS4KLy8gV2hhdCBhIHB1cmUgcGFja2FnZSBjYW4gZG8gaXMgbWFrZSBlYWNoIG9uZSBhIHNpbmdsZSBmb3J3YXJkLCB3aGljaCBpcyB3aGF0Ci8vIHRoZSBtZXRob2RzIGJlbG93IGFyZSBzaGFwZWQgZm9yLiBDb3B5IHRoZSBibG9jazsgb25seSBBZG1pbiBjaGFuZ2VzLgovLwovLyAjIFdoYXQgeW91IGdpdmUgdXAKLy8KLy8gVHlwZWQgZW50cnkgcG9pbnRzLiBgQ2FsbChjdXIsICJ0cmFuc2ZlciIsIHBheWxvYWQpYCBpcyBvbmUgc2lnbmF0dXJlCi8vIGZvcmV2ZXIsIHNvIGdub3dlYiBzaG93cyBvbmUgZnVuY3Rpb24sIGFyZ3VtZW50cyBhcmUgc3RyaW5ncyB5b3UgZW5jb2RlCi8vIHlvdXJzZWxmLCBhbmQgYSBtaXNzcGVsbGVkIHZlcmIgaXMgYSBydW50aW1lIHBhbmljIHJhdGhlciB0aGFuIGEKLy8gY29tcGlsZS10aW1lIGVycm9yLiBJZiB5b3VyIEFQSSBpcyBzbWFsbCBhbmQgeW91IGNhbiBuYW1lIGl0IG5vdywgZGVjbGFyZSBpdAovLyB3aXRoIFt1cGdyYWRlYWJsZV0gYW5kIGtlZXAgeW91ciB0eXBlcy4KLy8KLy8gVGhlIHR3byBjb21wb3NlOiBhbiBhcHAgcmVhbG0gY2FuIGNhcnJ5IGhhbmQtd3JpdHRlbiB0eXBlZCBlbnRyeSBwb2ludHMKLy8gYmVzaWRlIENhbGwsIGZvcndhcmRpbmcgdG8gUHJveHkoKSBmb3IgZGlzcGF0Y2guIFN0YXJ0IGdlbmVyaWMsIGFkZCB0eXBlZAovLyBlbnRyeSBwb2ludHMgZm9yIHRoZSB2ZXJicyB0aGF0IHNldHRsZS4KcGFja2FnZSBhcHAKCmltcG9ydCAoCgkiZXJyb3JzIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9nMWxua3l0ZnFjandsbHdzNjNndmYwbXY5eXQwNGFzd3k0eTlhbWhtL3VwZ3JhZGVhYmxlL3YwIgopCgp2YXIgKAoJLy8gRXJyTm9IYW5kbGVyIGlzIHJhaXNlZCB3aGVuIHRoZSBhcHAgaGFzIG5vIGFjY2VwdGVkIGltcGxlbWVudGF0aW9uLgoJRXJyTm9IYW5kbGVyID0gZXJyb3JzLk5ldygiYXBwOiBubyBoYW5kbGVyIGlzIGxpdmUiKQoKCS8vIEVyck5vdEFIYW5kbGVyIGlzIHJhaXNlZCB3aGVuIHRoZSBsaXZlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHNhdGlzZnkKCS8vIEhhbmRsZXIuIFJlZ2lzdGVyIGFkbWl0cyBvbmx5IGEgSGFuZGxlciwgc28gdGhpcyBpcyB1bnJlYWNoYWJsZSBpbgoJLy8gcHJhY3RpY2UgYW5kIGNoZWFwIHRvIHJ1bGUgb3V0LgoJRXJyTm90QUhhbmRsZXIgPSBlcnJvcnMuTmV3KCJhcHA6IGxpdmUgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2F0aXNmeSBIYW5kbGVyIikKCgkvLyBFcnJTdGFsZVJlYWxtIGlzIHJhaXNlZCB3aGVuIHRoZSB0aHJlYWRlZCByZWFsbSB2YWx1ZSBpcyBub3QgdGhlCgkvLyBjYWxsZXIncyBsaXZlIGN1ci4KCUVyclN0YWxlUmVhbG0gPSBlcnJvcnMuTmV3KCJhcHA6IHJlYWxtIHZhbHVlIGlzIG5vdCB0aGUgY2FsbGVyJ3MgbGl2ZSBjdXIiKQoKCS8vIEVyck5vdEJvdW5kIGlzIHJhaXNlZCB3aGVuIEJpbmQgaGFzIG5vdCBydW4sIHNvIHRoZSBhcHAgZG9lcyBub3Qga25vdwoJLy8gaXRzIG93biBwYXRoIGFuZCBjYW5ub3QgdGVsbCBpdHMgY2FsbGVycyBhcGFydC4KCUVyck5vdEJvdW5kID0gZXJyb3JzLk5ldygiYXBwOiBCaW5kIGhhcyBub3QgYmVlbiBjYWxsZWQgZnJvbSBpbml0IikKCgkvLyBFcnJGb3JiaWRkZW4gaXMgcmFpc2VkIHdoZW4gYSByZWFsbSB0aGF0IGlzIG5laXRoZXIgdGhlIGFwcCBub3IgYQoJLy8gcmVnaXN0ZXJlZCBleHRlbnNpb24gYXNrcyBmb3IgdGhlIHN0b3JlLgoJRXJyRm9yYmlkZGVuID0gZXJyb3JzLk5ldygiYXBwOiBzdG9yZSBpcyBub3QgcmVhY2hhYmxlIGZyb20gdGhpcyByZWFsbSIpCgoJLy8gRXJyVW5rbm93blZlcmIgaXMgcmFpc2VkIGJ5IEFkbWluIGZvciBhIHZlcmIgaXQgZG9lcyBub3QgaW1wbGVtZW50LgoJRXJyVW5rbm93blZlcmIgPSBlcnJvcnMuTmV3KCJhcHA6IHVua25vd24gYWRtaW4gdmVyYiIpCgoJLy8gRXJyTm9TY2hlbWEgaXMgcmFpc2VkIHdoZW4gYSBoYW5kbGVyIGRlY2xhcmVzIG5vIHZlcmJzLiBBbiBhcHAgd2hvc2UKCS8vIEFQSSBjYW5ub3QgYmUgZW51bWVyYXRlZCBpcyB0aGUgdGhpbmcgdGhpcyBwYWNrYWdlIGV4aXN0cyB0byBhdm9pZC4KCUVyck5vU2NoZW1hID0gZXJyb3JzLk5ldygiYXBwOiBhIGhhbmRsZXIgbXVzdCBkZWNsYXJlIGF0IGxlYXN0IG9uZSB2ZXJiIikKKQoKLy8gSGFuZGxlciBpcyB3aGF0IGFuIGltcGxlbWVudGF0aW9uIHJlYWxtIGltcGxlbWVudHMuCi8vCi8vIFR3byBtZXRob2RzLiBbSGFuZGxlci5TY2hlbWFdIGRlY2xhcmVzIHRoZSBBUEkgYXMgZGF0YSDigJQgYSB2ZXJiIHNldCByYXRoZXIKLy8gdGhhbiBhIG1ldGhvZCBzZXQsIHdoaWNoIGlzIHdoYXQgbGV0cyBpdCBncm93IHBhc3QgdGhlIHJlYWxtIHRoYXQgc2VydmVzIGl0LgovLyBbSGFuZGxlci5IYW5kbGVdIGFuc3dlcnMgb25lIGNhbGwsIGhhdmluZyBiZWVuIGhhbmRlZCBhIHBheWxvYWQgdGhlIGFwcCBoYXMKLy8gYWxyZWFkeSBkZWNvZGVkIGFuZCBjaGVja2VkIGFnYWluc3QgdGhhdCBkZWNsYXJhdGlvbi4KLy8KLy8gUGFuaWMgdG8gZmFpbDsgcGFuaWNzIGNyb3NzIHRoZSByZWFsbSBib3VuZGFyeSBhbmQgYWJvcnQgdGhlIHRyYW5zYWN0aW9uLgp0eXBlIEhhbmRsZXIgaW50ZXJmYWNlIHsKCS8vIFNjaGVtYSBkZWNsYXJlcyB0aGUgdmVyYnMgdGhpcyBoYW5kbGVyIGFuc3dlcnMuIEl0IG11c3Qgbm90IGJlIG5pbCBvcgoJLy8gZW1wdHksIGFuZCBpdCBzaG91bGQgYmUgYSBwYWNrYWdlLWxldmVsIHZhbHVlIHJhdGhlciB0aGFuIHJlYnVpbHQgcGVyCgkvLyBjYWxsIOKAlCB0aGUgYXBwIHJlYWRzIGl0IG9uIGV2ZXJ5IGRpc3BhdGNoLgoJU2NoZW1hKCkgKlNjaGVtYQoKCS8vIEhhbmRsZSBhbnN3ZXJzIGFyZ3MuVmVyYigpLiBFdmVyeSBkZWNsYXJlZCBwYXJhbWV0ZXIgaXMgcHJlc2VudCBhbmQKCS8vIHBhcnNlcyBhcyBpdHMga2luZCBieSB0aGUgdGltZSB0aGlzIHJ1bnMsIHNvIHRoZSBhY2Nlc3NvcnMgb24gQXJncyBkbwoJLy8gbm90IHJldHVybiBlcnJvcnMuCglIYW5kbGUoXyBpbnQsIHJsbSByZWFsbSwgYXJncyAqQXJncykgc3RyaW5nCn0KCi8vIEFwcCBpcyB0aGUgcHJveHksIHRoZSBzdGF0ZSBhbmQgdGhlIGRpc3BhdGNoLCBpbiBvbmUgb2JqZWN0IHRvIGhvbGQgYXQKLy8gcmVhbG0gbGV2ZWwuCnR5cGUgQXBwIHN0cnVjdCB7Cglwcm94eSAqdXBncmFkZWFibGUuUHJveHkKCWRhdGEgICprdgoJc2VsZiAgc3RyaW5nCn0KCi8vIE93bmVyIHJldHVybnMgYW4gYXV0aG9yaXR5IGZvciBhIHNpbmdsZSBhZGRyZXNzLiBSZS1leHBvcnRlZCBzbyBhIHJlYWxtCi8vIHVzaW5nIHRoaXMgcGFja2FnZSBuZWVkIG5vdCBpbXBvcnQgW3VwZ3JhZGVhYmxlXSBhcyB3ZWxsLgpmdW5jIE93bmVyKGFkZHIgYWRkcmVzcykgdXBncmFkZWFibGUuQXV0aG9yaXR5IHsgcmV0dXJuIHVwZ3JhZGVhYmxlLk5ld0FkZHJBdXRob3JpdHkoYWRkcikgfQoKLy8gR292ZXJuZWQgcmV0dXJucyBhbiBhdXRob3JpdHkgZm9yIG9uZSBvciBtb3JlIGdvdmVybmFuY2UgcmVhbG0gcGF0aHMuCmZ1bmMgR292ZXJuZWQocGF0aHMgLi4uc3RyaW5nKSB1cGdyYWRlYWJsZS5BdXRob3JpdHkgewoJcmV0dXJuIHVwZ3JhZGVhYmxlLk5ld1JlYWxtQXV0aG9yaXR5KHBhdGhzLi4uKQp9CgovLyBOZXcgcmV0dXJucyBhbiBBcHAgd2hvc2UgaW1wbGVtZW50YXRpb25zIG11c3QgYmUgZGVwbG95ZWQgdW5kZXIgdGhlIGFwcAovLyByZWFsbSdzIG93biBwYXRoLgpmdW5jIE5ldyhhdXRoIHVwZ3JhZGVhYmxlLkF1dGhvcml0eSkgKkFwcCB7CglyZXR1cm4gJkFwcHtwcm94eTogdXBncmFkZWFibGUuTmV3KGF1dGgpLCBkYXRhOiBuZXdLVigpfQp9CgovLyBOZXdPcGVuIHJldHVybnMgYW4gQXBwIHRoYXQgYWNjZXB0cyBpbXBsZW1lbnRhdGlvbnMgZnJvbSBhbnkgcmVhbG0uIFRoZQovLyBhdXRob3JpdHkgc3RpbGwgZGVjaWRlcyB3aGljaCBvbmUgc2VydmVzLgpmdW5jIE5ld09wZW4oYXV0aCB1cGdyYWRlYWJsZS5BdXRob3JpdHkpICpBcHAgewoJcmV0dXJuICZBcHB7cHJveHk6IHVwZ3JhZGVhYmxlLk5ld09wZW4oYXV0aCksIGRhdGE6IG5ld0tWKCl9Cn0KCi8vIEJpbmQgdGVhY2hlcyB0aGUgYXBwIGl0cyBvd24gcGF0aCwgd2hpY2ggaXMgd2hhdCBldmVyeSBsYXRlciBjYWxsZXIgY2hlY2sKLy8gY29tcGFyZXMgYWdhaW5zdC4gQ2FsbCBpdCBvbmNlLCBmcm9tIHlvdXIgcmVhbG0ncyBpbml0OgovLwovLwlmdW5jIGluaXQoY3VyIHJlYWxtKSB7IGEuQmluZCgwLCBjdXIpIH0KLy8KLy8gSXQgaXMgc2VwYXJhdGUgZnJvbSBOZXcgYmVjYXVzZSBhIHBhY2thZ2UtbGV2ZWwgdmFyIGluaXRpYWxpemVyIHJ1bnMgYmVmb3JlCi8vIHRoZXJlIGlzIGEgcmVhbG0gZnJhbWUgdG8gcmVhZCB0aGUgcGF0aCBmcm9tLgpmdW5jIChhICpBcHApIEJpbmQoXyBpbnQsIHJsbSByZWFsbSkgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoRXJyU3RhbGVSZWFsbSkKCX0KCWEuc2VsZiA9IHJsbS5Qa2dQYXRoKCkKfQoKLy8gUHJveHkgZXhwb3NlcyB0aGUgdW5kZXJseWluZyBwcm94eSwgZm9yIHJlYWxtcyB0aGF0IHdhbnQgdHlwZWQgZW50cnkgcG9pbnRzCi8vIGJlc2lkZSBDYWxsIG9yIHRoZWlyIG93biBSZW5kZXIuCmZ1bmMgKGEgKkFwcCkgUHJveHkoKSAqdXBncmFkZWFibGUuUHJveHkgeyByZXR1cm4gYS5wcm94eSB9CgovLyBUaGUgaW5zcGVjdGlvbiBzdXJmYWNlLiBSZW5kZXIgc2hvd3MgYWxsIG9mIGl0IGFzIGEgcGFnZTsgdGhlc2UgYXJlIHRoZQovLyBzYW1lIGZhY3RzIGFzIGRpc2NyZXRlIHZhbHVlcywgd2hpY2ggaXMgd2hhdCBhbiBvcGVyYXRvciB3YW50cyBmcm9tCi8vIHZtL3FldmFsIGFuZCB3aGF0IGEgbW9uaXRvciB3YW50cyB0byBwb2xsLgoKLy8gTGl2ZVBhdGggcmV0dXJucyB0aGUgcmVhbG0gcGF0aCBvZiB0aGUgaGFuZGxlciBjdXJyZW50bHkgc2VydmluZywgb3IgIiIuCmZ1bmMgKGEgKkFwcCkgTGl2ZVBhdGgoKSBzdHJpbmcgeyByZXR1cm4gYS5wcm94eS5MaXZlUGF0aCgpIH0KCi8vIFBlbmRpbmdQYXRocyByZXR1cm5zIHRoZSBjYW5kaWRhdGUgaGFuZGxlciBwYXRocyBhd2FpdGluZyBhY2NlcHRhbmNlLgpmdW5jIChhICpBcHApIFBlbmRpbmdQYXRocygpIFtdc3RyaW5nIHsgcmV0dXJuIHBhdGhzKGEucHJveHkuUGVuZGluZygpKSB9CgovLyBIaXN0b3J5UGF0aHMgcmV0dXJucyB0aGUgaGFuZGxlcnMgYWxyZWFkeSBzZXJ2ZWQsIG9sZGVzdCBmaXJzdC4gQSBub24tZW1wdHkKLy8gcmVzdWx0IGlzIHdoYXQgbWFrZXMgcm9sbGJhY2sgYXZhaWxhYmxlLgpmdW5jIChhICpBcHApIEhpc3RvcnlQYXRocygpIFtdc3RyaW5nIHsgcmV0dXJuIHBhdGhzKGEucHJveHkuSGlzdG9yeSgpKSB9CgovLyBFeHRlbnNpb25zIHJldHVybnMgdGhlIHJlYWxtcyBwZXJtaXR0ZWQgdG8gYWN0IGFzIHRoaXMgYXBwLgpmdW5jIChhICpBcHApIEV4dGVuc2lvbnMoKSBbXXN0cmluZyB7IHJldHVybiBhLnByb3h5LkV4dGVuc2lvbnMoKSB9CgovLyBGcm96ZW4gcmVwb3J0cyB3aGV0aGVyIHVwZ3JhZGVhYmlsaXR5IGhhcyBlbmRlZC4KZnVuYyAoYSAqQXBwKSBGcm96ZW4oKSBib29sIHsgcmV0dXJuIGEucHJveHkuRnJvemVuKCkgfQoKLy8gQXV0aG9yaXR5IGRlc2NyaWJlcyB3aG8gbWF5IHVwZ3JhZGUuCmZ1bmMgKGEgKkFwcCkgQXV0aG9yaXR5KCkgc3RyaW5nIHsgcmV0dXJuIGEucHJveHkuQXV0aG9yaXR5KCkuU3RyaW5nKCkgfQoKZnVuYyBwYXRocyhycyBbXXVwZ3JhZGVhYmxlLlJlbGVhc2UpIFtdc3RyaW5nIHsKCW91dCA6PSBbXXN0cmluZ3t9Cglmb3IgXywgciA6PSByYW5nZSBycyB7CgkJb3V0ID0gYXBwZW5kKG91dCwgci5Qa2dQYXRoKCkpCgl9CglyZXR1cm4gb3V0Cn0KCi8vIGhhbmRsZXIgcmV0dXJucyB0aGUgbGl2ZSBoYW5kbGVyLgpmdW5jIChhICpBcHApIGhhbmRsZXIoKSBIYW5kbGVyIHsKCXYsIG9rIDo9IGEucHJveHkuVHJ5SW1wbCgpCglpZiAhb2sgewoJCXBhbmljKEVyck5vSGFuZGxlcikKCX0KCWgsIG9rIDo9IHYuKEhhbmRsZXIpCglpZiAhb2sgewoJCXBhbmljKEVyck5vdEFIYW5kbGVyKQoJfQoJcmV0dXJuIGgKfQoKLy8gQ2FsbCBkZWNvZGVzIHBheWxvYWQgYWdhaW5zdCB0aGUgbGl2ZSBoYW5kbGVyJ3MgZGVjbGFyYXRpb24gZm9yIHZlcmIsIGFuZAovLyBkaXNwYXRjaGVzLgovLwovLyBBbiB1bmtub3duIHZlcmIsIGEgcGF5bG9hZCB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgZmllbGRzLCBvciBhIGZpZWxkIHRoYXQKLy8gZG9lcyBub3QgcGFyc2UgYXMgaXRzIGRlY2xhcmVkIGtpbmQgYXJlIGFsbCByZWZ1c2VkIGhlcmUsIGJlZm9yZSB0aGUgaGFuZGxlcgovLyBydW5zLCB3aXRoIGEgbWVzc2FnZSBuYW1pbmcgdGhlIHZlcmIgYW5kIGl0cyBzaWduYXR1cmUuCmZ1bmMgKGEgKkFwcCkgQ2FsbChfIGludCwgcmxtIHJlYWxtLCB2ZXJiIHN0cmluZywgcGF5bG9hZCBzdHJpbmcpIHN0cmluZyB7CgloIDo9IGEuaGFuZGxlcigpCglzYyA6PSBoLlNjaGVtYSgpCgl2LCBvayA6PSBzYy5Mb29rdXAodmVyYikKCWlmICFvayB7CgkJcGFuaWMoZXJyb3JzLk5ldygiYXBwOiB1bmtub3duIHZlcmIgIiArIHN0cmNvbnYuUXVvdGUodmVyYikgKwoJCQkiOyB0aGlzIGFwcCBhbnN3ZXJzICIgKyBzdHJpbmdzLkpvaW4oc2MuTmFtZXMoKSwgIiwgIikpKQoJfQoJYXJncywgZXJyIDo9IGRlY29kZSh2LCBwYXlsb2FkKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIGguSGFuZGxlKDAsIHJsbSwgYXJncykKfQoKLy8gU2NoZW1hIHJldHVybnMgdGhlIGxpdmUgaGFuZGxlcidzIGRlY2xhcmF0aW9uLCBvciBuaWwgaWYgbm90aGluZyBpcyBsaXZlLgpmdW5jIChhICpBcHApIFNjaGVtYSgpICpTY2hlbWEgewoJdiwgb2sgOj0gYS5wcm94eS5UcnlJbXBsKCkKCWlmICFvayB7CgkJcmV0dXJuIG5pbAoJfQoJaCwgb2sgOj0gdi4oSGFuZGxlcikKCWlmICFvayB7CgkJcmV0dXJuIG5pbAoJfQoJcmV0dXJuIGguU2NoZW1hKCkKfQoKLy8gVmVyYnMgZW51bWVyYXRlcyB0aGUgQVBJLiBUaGlzIGlzIHRoZSBxdWVyeSBhIGNhbGxlciBtYWtlcyBmaXJzdC4KZnVuYyAoYSAqQXBwKSBWZXJicygpIFtdc3RyaW5nIHsgcmV0dXJuIGEuU2NoZW1hKCkuTmFtZXMoKSB9CgovLyBTaWduYXR1cmUgcmV0dXJucyBvbmUgdmVyYidzIGRlY2xhcmF0aW9uLCBvciAiIiBpZiBpdCBpcyBub3QgYW5zd2VyZWQuCmZ1bmMgKGEgKkFwcCkgU2lnbmF0dXJlKHZlcmIgc3RyaW5nKSBzdHJpbmcgeyByZXR1cm4gYS5TY2hlbWEoKS5TaWduYXR1cmUodmVyYikgfQoKLy8gU2NoZW1hSlNPTiByZW5kZXJzIHRoZSBBUEkgZm9yIHRvb2xpbmc6IGVub3VnaCB0byBidWlsZCBhIGZvcm0gd2l0aG91dAovLyByZWFkaW5nIGFueSBHbm8gc291cmNlLgpmdW5jIChhICpBcHApIFNjaGVtYUpTT04oKSBzdHJpbmcgeyByZXR1cm4gYS5TY2hlbWEoKS5KU09OKCkgfQoKLy8gU3VwcG9ydHMgcmVwb3J0cyB3aGV0aGVyIHRoZSBsaXZlIGhhbmRsZXIgYW5zd2VycyB2ZXJiLgpmdW5jIChhICpBcHApIFN1cHBvcnRzKHZlcmIgc3RyaW5nKSBib29sIHsKCV8sIG9rIDo9IGEuU2NoZW1hKCkuTG9va3VwKHZlcmIpCglyZXR1cm4gb2sKfQoKLy8gUmVnaXN0ZXIgbm9taW5hdGVzIHRoZSBjYWxsaW5nIHJlYWxtJ3MgaGFuZGxlci4gRm9yd2FyZCBpdCBmcm9tIHlvdXIgcmVhbG0KLy8gYW5kIGNhbGwgaXQgZnJvbSB0aGUgaW1wbGVtZW50YXRpb24ncyBpbml0LgovLwovLyBBIGhhbmRsZXIgdGhhdCBkZWNsYXJlcyBubyB2ZXJicyBpcyByZWZ1c2VkIGhlcmUgcmF0aGVyIHRoYW4gYXQgZmlyc3QgY2FsbDoKLy8gYW4gYXBwIHdob3NlIEFQSSBjYW5ub3QgYmUgZW51bWVyYXRlZCBpcyB0aGUgdGhpbmcgdGhpcyBwYWNrYWdlIGV4aXN0cyB0bwovLyBhdm9pZC4KZnVuYyAoYSAqQXBwKSBSZWdpc3RlcihfIGludCwgcmxtIHJlYWxtLCBoIEhhbmRsZXIpIHsKCWlmIGggPT0gbmlsIHx8IGxlbihoLlNjaGVtYSgpLk5hbWVzKCkpID09IDAgewoJCXBhbmljKEVyck5vU2NoZW1hKQoJfQoJYS5wcm94eS5Qcm9wb3NlKDAsIHJsbSwgaCkKfQoKLy8gY2FuZGlkYXRlIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlciBhdCBwa2dQYXRoLgpmdW5jIChhICpBcHApIGNhbmRpZGF0ZShwa2dQYXRoIHN0cmluZykgKEhhbmRsZXIsIGJvb2wpIHsKCWZvciBfLCByIDo9IHJhbmdlIGEucHJveHkuUGVuZGluZygpIHsKCQlpZiByLlBrZ1BhdGgoKSA9PSBwa2dQYXRoIHsKCQkJaCwgb2sgOj0gci5JbXBsKCkuKEhhbmRsZXIpCgkJCXJldHVybiBoLCBvawoJCX0KCX0KCXJldHVybiBuaWwsIGZhbHNlCn0KCi8vIGFjY2VwdCBwcm9tb3RlcyBhIGNhbmRpZGF0ZSwgcmVmdXNpbmcgYW4gdXBncmFkZSB0aGF0IHdvdWxkIGJyZWFrIGNhbGxlcnMKLy8gdW5sZXNzIGZvcmNlIGlzIHNldC4KLy8KLy8gVGhpcyBpcyB0aGUgY2hlY2sgYSB2ZXJiLWRpc3BhdGNoIEFQSSBjYW5ub3QgaGF2ZSB3aXRob3V0IGEgc2NoZW1hLiBXaXRob3V0Ci8vIGl0LCBhIGhhbmRsZXIgdGhhdCBxdWlldGx5IGRyb3BzIGEgdmVyYiBpdHMgcHJlZGVjZXNzb3Igc2VydmVkIGlzIGFjY2VwdGVkCi8vIGhhcHBpbHkgYW5kIGNhbGxlcnMgZmluZCBvdXQgYXQgcnVudGltZS4gV2l0aCBpdCwgdGhlIGRyb3AgaXMgbmFtZWQgYmVmb3JlCi8vIHRoZSB1cGdyYWRlIGxhbmRzLgpmdW5jIChhICpBcHApIGFjY2VwdChfIGludCwgcmxtIHJlYWxtLCBwa2dQYXRoIHN0cmluZywgZm9yY2UgYm9vbCkgewoJYS5wcm94eS5Bc3NlcnRBdXRob3JpemVkKDAsIHJsbSkKCW5leHQsIG9rIDo9IGEuY2FuZGlkYXRlKHBrZ1BhdGgpCglpZiBvayAmJiAhZm9yY2UgewoJCWlmIGJyZWFrcyA6PSBuZXh0LlNjaGVtYSgpLkRpZmYoYS5TY2hlbWEoKSk7IGxlbihicmVha3MpID4gMCB7CgkJCXBhbmljKGVycm9ycy5OZXcoImFwcDogcmVmdXNpbmcgYSBicmVha2luZyB1cGdyYWRlIHRvICIgKyBwa2dQYXRoICsKCQkJCSI6ICIgKyBzdHJpbmdzLkpvaW4oYnJlYWtzLCAiOyAiKSArCgkJCQkiIOKAlCB1c2UgdGhlIGFjY2VwdC1icmVha2luZyB2ZXJiIHRvIG92ZXJyaWRlIikpCgkJfQoJfQoJYS5wcm94eS5BY2NlcHQoMCwgcmxtLCBwa2dQYXRoKQp9CgovLyBTdG9yZSBoYW5kcyBvdXQgYSBbU3RvcmVdIGFjY2Vzc29yIHRvIGNvZGUgcnVubmluZyBvbiB0aGlzIGFwcCdzIGN1cjogdGhlCi8vIGxpdmUgaGFuZGxlciwgYW5kIGFueSByZWFsbSB0aGUgYXV0aG9yaXR5IGhhcyByZWdpc3RlcmVkIGFzIGFuIGV4dGVuc2lvbi4KLy8KLy8gQSByZWFsbSBob2xkaW5nIGEgcGVyZmVjdGx5IHZhbGlkIGN1ciBvZiBpdHMgb3duIGlzIHJlZnVzZWQsIGJlY2F1c2UgdGhhdAovLyBjdXIgY2FycmllcyBpdHMgb3duIHBhdGguIEFuZCBiZWNhdXNlIHRoZSBhY2Nlc3NvciBjYXJyaWVzIHRoZSBjdXIgYW5kCi8vIHJlLWNoZWNrcyBpdCBvbiBldmVyeSBvcGVyYXRpb24sIHRoZSBncmFudCBjYW5ub3Qgb3V0bGl2ZSB0aGlzIGNhbGwgZnJhbWU6Ci8vIGEgaGFuZGxlciB0aGF0IHN0YXNoZXMgdGhlIGFjY2Vzc29yIGFib3J0cyB0aGUgdHJhbnNhY3Rpb24gKGEgcmVhbG0gdmFsdWUKLy8gY2Fubm90IGJlIHBlcnNpc3RlZCksIHNvIHJvbGxiYWNrIGFuZCBmcmVlemUgY2FuIG5vIGxvbmdlciBiZSB1bmRlcm1pbmVkIGJ5Ci8vIGEgY2FwdHVyZWQgcmVmZXJlbmNlLiBTZWUgW1N0b3JlXS4KZnVuYyAoYSAqQXBwKSBTdG9yZShfIGludCwgcmxtIHJlYWxtKSAqU3RvcmUgewoJYS5hY2Nlc3MoMCwgcmxtKSAvLyBnYXRlIGF0IGFjcXVpc2l0aW9uLCBmb3IgYW4gaW1tZWRpYXRlLCBjbGVhciByZWZ1c2FsCglyZXR1cm4gJlN0b3Jle2FwcDogYSwgcmxtOiBybG19Cn0KCi8vIGFjY2VzcyB2YWxpZGF0ZXMgdGhhdCBybG0gbWF5IHJlYWNoIHRoZSBkYXRhIGFuZCByZXR1cm5zIGl0LiBJdCBydW5zIGF0Ci8vIGFjcXVpc2l0aW9uIGFuZCBhZ2FpbiBvbiBldmVyeSBTdG9yZSBvcGVyYXRpb24sIHNvIGEgc3RhbGUgb3IgZm9yZWlnbiBybG0KLy8gaXMgcmVmdXNlZCBldmVyeSB0aW1lLCBub3QganVzdCB3aGVuIHRoZSBhY2Nlc3NvciBpcyBtaW50ZWQgLS0gd2hpY2ggaXMgdGhlCi8vIHRlZXRoIGJlaGluZCBTdG9yZSBiZWluZyBhIHBlci1jYWxsIGNhcGFiaWxpdHkuCmZ1bmMgKGEgKkFwcCkgYWNjZXNzKF8gaW50LCBybG0gcmVhbG0pICprdiB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlwYW5pYyhFcnJTdGFsZVJlYWxtKQoJfQoJaWYgYS5zZWxmID09ICIiIHsKCQlwYW5pYyhFcnJOb3RCb3VuZCkKCX0KCWlmIGMgOj0gcmxtLlBrZ1BhdGgoKTsgYyAhPSBhLnNlbGYgJiYgIWEucHJveHkuSXNFeHRlbnNpb24oYykgewoJCXBhbmljKGVycm9ycy5OZXcoRXJyRm9yYmlkZGVuLkVycm9yKCkgKyAiOiAiICsgYykpCgl9CglyZXR1cm4gYS5kYXRhCn0KCi8vIEFkbWluIGlzIHRoZSB3aG9sZSBnb3Zlcm5hbmNlIHN1cmZhY2UgYmVoaW5kIG9uZSBlbnRyeSBwb2ludCwgc28gYSByZWFsbQovLyB1c2luZyB0aGlzIHBhY2thZ2UgZGVjbGFyZXMgb25lIGZ1bmN0aW9uIGluc3RlYWQgb2Ygb25lIHBlciBnb3Zlcm5hbmNlCi8vIGFjdGlvbi4KLy8KLy8JYWNjZXB0IDxwYXRoPiAgICAgbWFrZSBhIHJlZ2lzdGVyZWQgY2FuZGlkYXRlIGxpdmUsIHVubGVzcyBpdHMgc2NoZW1hCi8vCSAgICAgICAgICAgICAgICAgIHdvdWxkIGJyZWFrIGEgY2FsbGVyIG9mIHRoZSBvbmUgaXQgcmVwbGFjZXMKLy8JYWNjZXB0LWJyZWFraW5nIDxwYXRoPgovLwkgICAgICAgICAgICAgICAgICB0aGUgc2FtZSwgYWxsb3dpbmcgYSBicmVha2luZyBzY2hlbWEgY2hhbmdlCi8vCXdpdGhkcmF3IDxwYXRoPiAgIGRyb3AgYSBjYW5kaWRhdGUKLy8Jcm9sbGJhY2sgICAgICAgICAgcmVzdG9yZSB0aGUgcHJldmlvdXMgaGFuZGxlcgovLwlmb3JnZXQgICAgICAgICAgICBkcm9wIHRoZSByb2xsYmFjayBoaXN0b3J5Ci8vCWZyZWV6ZSAgICAgICAgICAgIGVuZCB1cGdyYWRlYWJpbGl0eSwgcGVybWFuZW50bHkKLy8JZXh0ZW5kIDxwYXRoPiAgICAgbGV0IGFub3RoZXIgcmVhbG0gYWN0IGFzIHRoaXMgb25lCi8vCXVuZXh0ZW5kIDxwYXRoPiAgIHJldm9rZSB0aGF0Ci8vCW93bmVyIDxhZGRyZXNzPiAgIGhhbmQgYXV0aG9yaXR5IHRvIGFuIGFkZHJlc3MKLy8JZ292ZXJuIDxwYXRocz4gICAgaGFuZCBhdXRob3JpdHkgdG8gZ292ZXJuYW5jZSByZWFsbXMgKGNvbW1hLXNlcGFyYXRlZCkKLy8KLy8gRXZlcnkgb25lIG9mIHRoZW0gaXMgYXV0aG9yaXR5LWdhdGVkIGJ5IHRoZSBwcm94eSwgZXhjZXB0IHRoYXQgYSByZWFsbSBtYXkKLy8gYWx3YXlzIHdpdGhkcmF3IGl0cyBvd24gY2FuZGlkYXRlLiBSZXR1cm5zICJvayIsIG9yIHBhbmljcy4KZnVuYyAoYSAqQXBwKSBBZG1pbihfIGludCwgcmxtIHJlYWxtLCB2ZXJiIHN0cmluZywgYXJnIHN0cmluZykgc3RyaW5nIHsKCXN3aXRjaCB2ZXJiIHsKCWNhc2UgImFjY2VwdCI6CgkJYS5hY2NlcHQoMCwgcmxtLCBhcmcsIGZhbHNlKQoJY2FzZSAiYWNjZXB0LWJyZWFraW5nIjoKCQlhLmFjY2VwdCgwLCBybG0sIGFyZywgdHJ1ZSkKCWNhc2UgIndpdGhkcmF3IjoKCQlhLnByb3h5LldpdGhkcmF3KDAsIHJsbSwgYXJnKQoJY2FzZSAicm9sbGJhY2siOgoJCWEucHJveHkuUm9sbGJhY2soMCwgcmxtKQoJY2FzZSAiZm9yZ2V0IjoKCQlhLnByb3h5LkZvcmdldCgwLCBybG0pCgljYXNlICJmcmVlemUiOgoJCWEucHJveHkuRnJlZXplKDAsIHJsbSkKCWNhc2UgImV4dGVuZCI6CgkJYS5wcm94eS5BZGRFeHRlbnNpb24oMCwgcmxtLCBhcmcpCgljYXNlICJ1bmV4dGVuZCI6CgkJYS5wcm94eS5Ecm9wRXh0ZW5zaW9uKDAsIHJsbSwgYXJnKQoJY2FzZSAib3duZXIiOgoJCWEucHJveHkuVHJhbnNmZXJBdXRob3JpdHkoMCwgcmxtLCBPd25lcihhZGRyZXNzKGFyZykpKQoJY2FzZSAiZ292ZXJuIjoKCQlwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KGFyZywgIiwiKQoJCXBhdGhzIDo9IG1ha2UoW11zdHJpbmcsIDAsIGxlbihwYXJ0cykpCgkJZm9yIF8sIHAgOj0gcmFuZ2UgcGFydHMgewoJCQlwYXRocyA9IGFwcGVuZChwYXRocywgc3RyaW5ncy5UcmltU3BhY2UocCkpCgkJfQoJCWEucHJveHkuVHJhbnNmZXJBdXRob3JpdHkoMCwgcmxtLCBHb3Zlcm5lZChwYXRocy4uLikpCglkZWZhdWx0OgoJCXBhbmljKGVycm9ycy5OZXcoRXJyVW5rbm93blZlcmIuRXJyb3IoKSArICI6ICIgKyB2ZXJiKSkKCX0KCXJldHVybiAib2siCn0KCi8vIFJlbmRlciBpcyBhIGdub3dlYiBwYWdlIGRlc2NyaWJpbmcgdGhlIGFwcCdzIGN1cnJlbnQgd2lyaW5nOiB3aGF0IHNlcnZlcywKLy8gd2hhdCBjb3VsZCwgd2hhdCBpdCB1c2VkIHRvLCB3aG8gZGVjaWRlcywgYW5kIGhvdyBtdWNoIHN0YXRlIHRoZXJlIGlzLgpmdW5jIChhICpBcHApIFJlbmRlcihfIHN0cmluZykgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyAiICsgYS5zZWxmICsgIlxuXG4iKQoKCWlmIHBhdGggOj0gYS5wcm94eS5MaXZlUGF0aCgpOyBwYXRoID09ICIiIHsKCQliLldyaXRlU3RyaW5nKCJfTm8gaGFuZGxlciBhY2NlcHRlZCB5ZXQuX1xuXG4iKQoJfSBlbHNlIHsKCQliLldyaXRlU3RyaW5nKCJTZXJ2aW5nOiBgIiArIHBhdGggKyAiYFxuXG4iKQoJfQoJYi5Xcml0ZVN0cmluZygiU3RhdGU6ICoqIiArIHN0cmNvbnYuSXRvYShhLmRhdGEubGVuZ3RoKCkpICsgIioqIGtleXNcblxuIikKCWIuV3JpdGVTdHJpbmcoIkF1dGhvcml0eTogYCIgKyBhLnByb3h5LkF1dGhvcml0eSgpLlN0cmluZygpICsgImBcblxuIikKCglpZiBzYyA6PSBhLlNjaGVtYSgpOyBzYyAhPSBuaWwgewoJCWIuV3JpdGVTdHJpbmcoIiMjIEFQSVxuXG4iICsgc2MuTWFya2Rvd24oKSArICJcbiIpCgl9CgoJaWYgYS5wcm94eS5Gcm96ZW4oKSB7CgkJYi5Xcml0ZVN0cmluZygiKipGcm96ZW4uKiogVGhlIGhhbmRsZXIgY2FuIG5vIGxvbmdlciBiZSByZXBsYWNlZC5cblxuIikKCX0KCXdyaXRlTGlzdCgmYiwgIkV4dGVuc2lvbnMiLCBhLnByb3h5LkV4dGVuc2lvbnMoKSkKCXdyaXRlUmVsZWFzZXMoJmIsICJBd2FpdGluZyBhY2NlcHRhbmNlIiwgYS5wcm94eS5QZW5kaW5nKCkpCgl3cml0ZVJlbGVhc2VzKCZiLCAiUHJldmlvdXNseSIsIGEucHJveHkuSGlzdG9yeSgpKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyB3cml0ZUxpc3QoYiAqc3RyaW5ncy5CdWlsZGVyLCB0aXRsZSBzdHJpbmcsIGl0ZW1zIFtdc3RyaW5nKSB7CglpZiBsZW4oaXRlbXMpID09IDAgewoJCXJldHVybgoJfQoJYi5Xcml0ZVN0cmluZygiIyMgIiArIHRpdGxlICsgIlxuXG4iKQoJZm9yIF8sIHMgOj0gcmFuZ2UgaXRlbXMgewoJCWIuV3JpdGVTdHJpbmcoIi0gYCIgKyBzICsgImBcbiIpCgl9CgliLldyaXRlU3RyaW5nKCJcbiIpCn0KCmZ1bmMgd3JpdGVSZWxlYXNlcyhiICpzdHJpbmdzLkJ1aWxkZXIsIHRpdGxlIHN0cmluZywgcnMgW111cGdyYWRlYWJsZS5SZWxlYXNlKSB7CglpZiBsZW4ocnMpID09IDAgewoJCXJldHVybgoJfQoJYi5Xcml0ZVN0cmluZygiIyMgIiArIHRpdGxlICsgIlxuXG4iKQoJZm9yIF8sIHIgOj0gcmFuZ2UgcnMgewoJCWIuV3JpdGVTdHJpbmcoIi0gYCIgKyByLlBrZ1BhdGgoKSArICJgIChoZWlnaHQgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KHIuSGVpZ2h0KCksIDEwKSArICIpXG4iKQoJfQoJYi5Xcml0ZVN0cmluZygiXG4iKQp9ChqRQgoIYXJncy5nbm8ShEJwYWNrYWdlIGFwcAoKaW1wb3J0ICgKCSJlbmNvZGluZy9jc3YiCgkiZXJyb3JzIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ1bmljb2RlL3V0ZjgiCikKCi8vIFRoZSB3aXJlIGZvcm1hdCBpcyBvbmUgQ1NWIHJlY29yZC4KLy8KLy8gQ1NWIGJlY2F1c2UgaXQgaXMgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnksIGJlY2F1c2UgaXQgcXVvdGVzIGNvcnJlY3RseSAtLQovLyBhIHRhc2sgY2FsbGVkIGBidXkgbWlsaywgZWdnc2Agc3Vydml2ZXMgYSByb3VuZCB0cmlwLCB3aGljaCBhIG5haXZlIHNwbGl0Ci8vIG9uIGNvbW1hcyBkb2VzIG5vdCAtLSBhbmQgYmVjYXVzZSBpdCBpcyB3cml0YWJsZSBieSBoYW5kIG9uIGEgZ25va2V5Ci8vIGNvbW1hbmQgbGluZS4gRmllbGRzIGFyZSBwb3NpdGlvbmFsLCBpbiB0aGUgb3JkZXIgdGhlIHZlcmIgZGVjbGFyZXMgdGhlbSwKLy8gd2hpY2ggaXMgd2h5IHRoZSBzY2hlbWEgZm9yYmlkcyBhIHJlcXVpcmVkIHBhcmFtZXRlciBhZnRlciBhbiBvcHRpb25hbCBvbmUKLy8gYW5kIHdoeSBEaWZmIHRyZWF0cyBhIHJlb3JkZXJpbmcgYXMgYnJlYWtpbmcuCi8vCi8vCUVuY29kZShhZGRUYXNrLCAiYnV5IG1pbGssIGVnZ3MiKSAgLT4gICJidXkgbWlsaywgZWdncyIgICAocXVvdGVkIGJ5IGNzdikKLy8JRW5jb2RlKHRyYW5zZmVyLCAiZzFhYmPigKYiLCAiNDIiKSAgIC0+ICAiZzFhYmPigKYsNDIiCi8vCi8vIEEgdmVyYiB3aXRoIG5vIHBhcmFtZXRlcnMgdGFrZXMgYW4gZW1wdHkgcGF5bG9hZC4KCi8vIEFyZ3MgaXMgYSBkZWNvZGVkLCB2YWxpZGF0ZWQgcGF5bG9hZC4gQSBoYW5kbGVyIHJlY2VpdmVzIG9uZSBhbmQgcmVhZHMKLy8gZmllbGRzIGJ5IG5hbWU7IHRoZSBhcHAgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IGV2ZXJ5IGZpZWxkIGlzIHByZXNlbnQgYW5kCi8vIHBhcnNlcyBhcyBpdHMgZGVjbGFyZWQga2luZCwgc28gdGhlIGFjY2Vzc29ycyBkbyBub3QgcmV0dXJuIGVycm9ycy4KdHlwZSBBcmdzIHN0cnVjdCB7Cgl2ZXJiICAgVmVyYgoJdmFsdWVzIFtdc3RyaW5nCn0KCi8vIFZlcmIgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdmVyYiBiZWluZyBjYWxsZWQuCmZ1bmMgKGEgKkFyZ3MpIFZlcmIoKSBzdHJpbmcgeyByZXR1cm4gYS52ZXJiLk5hbWUgfQoKLy8gU2lnbmF0dXJlIHJldHVybnMgdGhlIGRlY2xhcmF0aW9uIHRoaXMgcGF5bG9hZCB3YXMgY2hlY2tlZCBhZ2FpbnN0LCB3aGljaAovLyBpcyB3b3J0aCBwdXR0aW5nIGluIGEgcGFuaWMgbWVzc2FnZS4KZnVuYyAoYSAqQXJncykgU2lnbmF0dXJlKCkgc3RyaW5nIHsgcmV0dXJuIGEudmVyYi5TaWduYXR1cmUoKSB9CgovLyBSYXcgcmV0dXJucyB0aGUgZGVjb2RlZCBmaWVsZHMgaW4gZGVjbGFyYXRpb24gb3JkZXIsIGZvciBhIGhhbmRsZXIgdGhhdAovLyB3b3VsZCByYXRoZXIgbG9vcCB0aGFuIG5hbWUgdGhlbS4KZnVuYyAoYSAqQXJncykgUmF3KCkgW11zdHJpbmcgewoJZHVwIDo9IG1ha2UoW11zdHJpbmcsIGxlbihhLnZhbHVlcykpCgljb3B5KGR1cCwgYS52YWx1ZXMpCglyZXR1cm4gZHVwCn0KCi8vIGluZGV4IHJldHVybnMgdGhlIHBvc2l0aW9uIG9mIG5hbWUgYW5kIHdoZXRoZXIgYSB2YWx1ZSB3YXMgc3VwcGxpZWQuCi8vIEl0IHBhbmljcyBpZiB0aGUgdmVyYiBoYXMgbm8gc3VjaCBwYXJhbWV0ZXI6IHRoYXQgaXMgdGhlIGhhbmRsZXIgYXNraW5nIGZvcgovLyBzb21ldGhpbmcgaXQgZGlkIG5vdCBkZWNsYXJlLCB3aGljaCBubyBwYXlsb2FkIGNhbiBmaXguCmZ1bmMgKGEgKkFyZ3MpIGluZGV4KG5hbWUgc3RyaW5nLCB3YW50IEtpbmQpIChpbnQsIGJvb2wpIHsKCWZvciBpLCBwIDo9IHJhbmdlIGEudmVyYi5QYXJhbXMgewoJCWlmIHAuTmFtZSAhPSBuYW1lIHsKCQkJY29udGludWUKCQl9CgkJaWYgd2FudCAhPSAiIiAmJiBwLktpbmQgIT0gd2FudCB7CgkJCXBhbmljKGVycm9ycy5OZXcoImFwcDogIiArIGEudmVyYi5OYW1lICsgIjogcGFyYW1ldGVyICIgKyBuYW1lICsKCQkJCSIgaXMgZGVjbGFyZWQgIiArIHN0cmluZyhwLktpbmQpICsgIiwgcmVhZCBhcyAiICsgc3RyaW5nKHdhbnQpKSkKCQl9CgkJcmV0dXJuIGksIGkgPCBsZW4oYS52YWx1ZXMpCgl9CglwYW5pYyhlcnJvcnMuTmV3KCJhcHA6ICIgKyBhLnZlcmIuTmFtZSArICIgaGFzIG5vIHBhcmFtZXRlciAiICsgbmFtZSArCgkJIjsgaXRzIHNpZ25hdHVyZSBpcyAiICsgYS52ZXJiLlNpZ25hdHVyZSgpKSkKfQoKLy8gSGFzIHJlcG9ydHMgd2hldGhlciBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2FzIHN1cHBsaWVkLgpmdW5jIChhICpBcmdzKSBIYXMobmFtZSBzdHJpbmcpIGJvb2wgewoJXywgb2sgOj0gYS5pbmRleChuYW1lLCAiIikKCXJldHVybiBvawp9CgovLyBTdHJpbmcgcmV0dXJucyBhIHN0cmluZyBwYXJhbWV0ZXIsIG9yICIiIGlmIGl0IHdhcyBvcHRpb25hbCBhbmQgb21pdHRlZC4KZnVuYyAoYSAqQXJncykgU3RyaW5nKG5hbWUgc3RyaW5nKSBzdHJpbmcgewoJaSwgb2sgOj0gYS5pbmRleChuYW1lLCBLaW5kU3RyaW5nKQoJaWYgIW9rIHsKCQlyZXR1cm4gIiIKCX0KCXJldHVybiBhLnZhbHVlc1tpXQp9CgovLyBJbnQgcmV0dXJucyBhbiBpbnQgcGFyYW1ldGVyLCBvciAwIGlmIGl0IHdhcyBvcHRpb25hbCBhbmQgb21pdHRlZC4KZnVuYyAoYSAqQXJncykgSW50KG5hbWUgc3RyaW5nKSBpbnQ2NCB7CglpLCBvayA6PSBhLmluZGV4KG5hbWUsIEtpbmRJbnQpCglpZiAhb2sgewoJCXJldHVybiAwCgl9CgluLCBfIDo9IHN0cmNvbnYuUGFyc2VJbnQoYS52YWx1ZXNbaV0sIDEwLCA2NCkgLy8gY2hlY2tlZCBhdCBkZWNvZGUKCXJldHVybiBuCn0KCi8vIEJvb2wgcmV0dXJucyBhIGJvb2wgcGFyYW1ldGVyLCBvciBmYWxzZSBpZiBpdCB3YXMgb3B0aW9uYWwgYW5kIG9taXR0ZWQuCmZ1bmMgKGEgKkFyZ3MpIEJvb2wobmFtZSBzdHJpbmcpIGJvb2wgewoJaSwgb2sgOj0gYS5pbmRleChuYW1lLCBLaW5kQm9vbCkKCWlmICFvayB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gYS52YWx1ZXNbaV0gPT0gInRydWUiCn0KCi8vIEFkZHJlc3MgcmV0dXJucyBhbiBhZGRyZXNzIHBhcmFtZXRlciwgb3IgdGhlIHplcm8gYWRkcmVzcyBpZiBpdCB3YXMKLy8gb3B0aW9uYWwgYW5kIG9taXR0ZWQuCmZ1bmMgKGEgKkFyZ3MpIEFkZHJlc3MobmFtZSBzdHJpbmcpIGFkZHJlc3MgewoJaSwgb2sgOj0gYS5pbmRleChuYW1lLCBLaW5kQWRkcmVzcykKCWlmICFvayB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gYWRkcmVzcyhhLnZhbHVlc1tpXSkKfQoKLy8gRW5jb2RlIGJ1aWxkcyBhIHBheWxvYWQgZm9yIHYgZnJvbSB2YWx1ZXMgZ2l2ZW4gaW4gZGVjbGFyYXRpb24gb3JkZXIsCi8vIHZhbGlkYXRpbmcgZWFjaCBhZ2FpbnN0IGl0cyBkZWNsYXJlZCBraW5kLiBVc2UgaXQgd2hlbiBvbmUgcmVhbG0gY2FsbHMKLy8gYW5vdGhlciBhcHAsIHNvIGFuIGVuY29kaW5nIG1pc3Rha2UgZmFpbHMgd2hlcmUgaXQgd2FzIG1hZGUuCmZ1bmMgRW5jb2RlKHYgVmVyYiwgdmFsdWVzIC4uLnN0cmluZykgc3RyaW5nIHsKCWlmIGVyciA6PSBjaGVja0FyaXR5KHYsIGxlbih2YWx1ZXMpKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJZm9yIGksIHZhbCA6PSByYW5nZSB2YWx1ZXMgewoJCWlmIGVyciA6PSB2LlBhcmFtc1tpXS5LaW5kLnBhcnNlKHZhbCk7IGVyciAhPSBuaWwgewoJCQlwYW5pYyhmaWVsZEVycih2LCBpLCBlcnIpKQoJCX0KCX0KCWlmIGxlbih2YWx1ZXMpID09IDAgewoJCXJldHVybiAiIgoJfQoJLy8gQSBsb25lIGVtcHR5IGZpZWxkIGVuY29kZXMgdG8gbm90aGluZyBhdCBhbGwgLS0gY3N2IGRvZXMgbm90IHF1b3RlIGFuCgkvLyBlbXB0eSBmaWVsZCwgc28gdGhlIHJlY29yZCAiIiBhbmQgdGhlIHJlY29yZCB3aXRoIG5vIGZpZWxkcyBhcmUgdGhlCgkvLyBzYW1lIGJ5dGVzLiBRdW90ZSBpdCBleHBsaWNpdGx5IHNvIHRoZSBwYXlsb2FkIHNheXMgd2hpY2ggaXQgaXMuCglpZiBsZW4odmFsdWVzKSA9PSAxICYmIHZhbHVlc1swXSA9PSAiIiB7CgkJcmV0dXJuIGAiImAKCX0KCS8vIEZhc3QgcGF0aDogd2hlbiBub3RoaW5nIG5lZWRzIHF1b3RpbmcsIGEgQ1NWIHJlY29yZCBJUyB0aGUgZmllbGRzCgkvLyBqb2luZWQgYnkgY29tbWFzLCBhbmQgYnVpbGRpbmcgYSBjc3YuV3JpdGVyIHRvIGRpc2NvdmVyIHRoYXQgY29zdHMKCS8vIG1vcmUgdGhhbiB0aGUgd2hvbGUgcmVzdCBvZiB0aGUgY2FsbC4gU2VlIG5lZWRzUXVvdGVzLgoJcGxhaW4gOj0gdHJ1ZQoJZm9yIF8sIHZhbCA6PSByYW5nZSB2YWx1ZXMgewoJCWlmIG5lZWRzUXVvdGVzKHZhbCkgewoJCQlwbGFpbiA9IGZhbHNlCgkJCWJyZWFrCgkJfQoJfQoJaWYgcGxhaW4gewoJCXJldHVybiBzdHJpbmdzLkpvaW4odmFsdWVzLCAiLCIpCgl9CgoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgl3IDo9IGNzdi5OZXdXcml0ZXIoJmIpCglpZiBlcnIgOj0gdy5Xcml0ZSh2YWx1ZXMpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnJvcnMuTmV3KCJhcHA6ICIgKyB2Lk5hbWUgKyAiOiAiICsgZXJyLkVycm9yKCkpKQoJfQoJdy5GbHVzaCgpCglpZiBlcnIgOj0gdy5FcnJvcigpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnJvcnMuTmV3KCJhcHA6ICIgKyB2Lk5hbWUgKyAiOiAiICsgZXJyLkVycm9yKCkpKQoJfQoJcmV0dXJuIHN0cmluZ3MuVHJpbVJpZ2h0KGIuU3RyaW5nKCksICJcbiIpCn0KCi8vIHNwbGl0UGxhaW4gc3BsaXRzIGEgcGF5bG9hZCBvbiBjb21tYXMgaW4gYSBzaW5nbGUgcGFzcywgcmVwb3J0aW5nIGZhbHNlIHRoZQovLyBtb21lbnQgaXQgbWVldHMgYSBieXRlIHRoYXQgZ2l2ZXMgY29tbWFzIGEgZGlmZmVyZW50IG1lYW5pbmcuIFRoZSBvbmUgcGFzcwovLyBpcyB0aGUgcG9pbnQ6IGJhaWxpbmcgb3V0IGFuZCBzcGxpdHRpbmcgc2VwYXJhdGVseSBkb3VibGVzIHRoZSBpbnRlcnByZXRlZAovLyB3b3JrIG92ZXIgdGhlIHdob2xlIHBheWxvYWQuCmZ1bmMgc3BsaXRQbGFpbihwYXlsb2FkIHN0cmluZykgKFtdc3RyaW5nLCBib29sKSB7CglvdXQgOj0gW11zdHJpbmd7fQoJc3RhcnQgOj0gMAoJZm9yIGkgOj0gMDsgaSA8IGxlbihwYXlsb2FkKTsgaSsrIHsKCQlzd2l0Y2ggcGF5bG9hZFtpXSB7CgkJY2FzZSAnIicsICdccicsICdcbic6CgkJCXJldHVybiBuaWwsIGZhbHNlCgkJY2FzZSAnLCc6CgkJCW91dCA9IGFwcGVuZChvdXQsIHBheWxvYWRbc3RhcnQ6aV0pCgkJCXN0YXJ0ID0gaSArIDEKCQl9Cgl9CglyZXR1cm4gYXBwZW5kKG91dCwgcGF5bG9hZFtzdGFydDpdKSwgdHJ1ZQp9CgovLyBuZWVkc1F1b3RlcyBtaXJyb3JzIGNzdi5Xcml0ZXIncyBydWxlIGV4YWN0bHkuIERpdmVyZ2luZyBmcm9tIGl0IHdvdWxkIG1lYW4KLy8gRW5jb2RlIHByb2R1Y2VkIHNvbWV0aGluZyBjc3YuUmVhZGVyIHJlYWRzIGJhY2sgZGlmZmVyZW50bHksIHNvIHRoaXMgaXMKLy8gY29waWVkIHJhdGhlciB0aGFuIGFwcHJveGltYXRlZDogYSBmaWVsZCBpcyBxdW90ZWQgd2hlbiBpdCBpcyB0aGUgbGl0ZXJhbAovLyBgXC5gLCB3aGVuIGl0IGNvbnRhaW5zIGEgY29tbWEsIHF1b3RlLCBDUiBvciBMRiwgb3Igd2hlbiBpdCBiZWdpbnMgd2l0aCBhCi8vIHNwYWNlLgpmdW5jIG5lZWRzUXVvdGVzKGZpZWxkIHN0cmluZykgYm9vbCB7CglpZiBmaWVsZCA9PSAiIiB7CgkJcmV0dXJuIGZhbHNlCgl9CglpZiBmaWVsZCA9PSBgXC5gIHsKCQlyZXR1cm4gdHJ1ZQoJfQoJc3dpdGNoIGZpZWxkWzBdIHsKCWNhc2UgJyAnLCAnXHQnLCAnXHYnLCAnXGYnOgoJCXJldHVybiB0cnVlCgl9CgkvLyBBIGxlYWRpbmcgbm9uLUFTQ0lJIHNwYWNlIChVKzAwQTAgYW5kIGZyaWVuZHMpIGlzIHJhcmUgZW5vdWdoIHRvIGhhbmQKCS8vIHRvIHRoZSBzbG93IHBhdGggcmF0aGVyIHRoYW4gZGVjb2RlIGEgcnVuZSBmb3Igb24gZXZlcnkgY2FsbC4KCWlmIGZpZWxkWzBdID49IHV0ZjguUnVuZVNlbGYgewoJCXJldHVybiB0cnVlCgl9CgkvLyBPbmUgcGFzcywgZm9yIHRoZSBzYW1lIHJlYXNvbiBzcGxpdFBsYWluIGlzIG9uZSBwYXNzOgoJLy8gc3RyaW5ncy5Db250YWluc0FueSBpcyBpbnRlcnByZXRlZCBHbm8gYW5kIGNvc3RzIG1vcmUgb3ZlciBhIHNob3J0CgkvLyBmaWVsZCB0aGFuIHRoZSBjc3YuV3JpdGVyIGl0IGlzIHRyeWluZyB0byBhdm9pZC4KCWZvciBpIDo9IDA7IGkgPCBsZW4oZmllbGQpOyBpKysgewoJCXN3aXRjaCBmaWVsZFtpXSB7CgkJY2FzZSAnLCcsICciJywgJ1xyJywgJ1xuJzoKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CglyZXR1cm4gZmFsc2UKfQoKLy8gY2hlY2tBcml0eSByZXBvcnRzIHdoZXRoZXIgbiB2YWx1ZXMgY2FuIHNhdGlzZnkgdi4KZnVuYyBjaGVja0FyaXR5KHYgVmVyYiwgbiBpbnQpIGVycm9yIHsKCXJlcSA6PSB2LlJlcXVpcmVkKCkKCWlmIG4gPCByZXEgewoJCXJldHVybiBlcnJvcnMuTmV3KCJhcHA6ICIgKyB2Lk5hbWUgKyAiIG5lZWRzIGF0IGxlYXN0ICIgKyBzdHJjb252Lkl0b2EocmVxKSArCgkJCSIgcGFyYW1ldGVyKHMpLCBnb3QgIiArIHN0cmNvbnYuSXRvYShuKSArICI7IHNpZ25hdHVyZSBpcyAiICsgdi5TaWduYXR1cmUoKSkKCX0KCWlmIG4gPiBsZW4odi5QYXJhbXMpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygiYXBwOiAiICsgdi5OYW1lICsgIiB0YWtlcyBhdCBtb3N0ICIgKyBzdHJjb252Lkl0b2EobGVuKHYuUGFyYW1zKSkgKwoJCQkiIHBhcmFtZXRlcihzKSwgZ290ICIgKyBzdHJjb252Lkl0b2EobikgKyAiOyBzaWduYXR1cmUgaXMgIiArIHYuU2lnbmF0dXJlKCkpCgl9CglyZXR1cm4gbmlsCn0KCi8vIGZpZWxkRXJyIG5hbWVzIHRoZSB2ZXJiLCB0aGUgcGFyYW1ldGVyIGFuZCB0aGUgc2lnbmF0dXJlLCB3aGljaCBpcyB3aGF0IGEKLy8gY2FsbGVyIG5lZWRzIHRvIGZpeCB0aGUgcGF5bG9hZCB3aXRob3V0IHJlYWRpbmcgdGhlIGhhbmRsZXIncyBzb3VyY2UuCmZ1bmMgZmllbGRFcnIodiBWZXJiLCBpIGludCwgZXJyIGVycm9yKSBlcnJvciB7CglyZXR1cm4gZXJyb3JzLk5ldygiYXBwOiAiICsgdi5OYW1lICsgIjogcGFyYW1ldGVyICIgKyB2LlBhcmFtc1tpXS5OYW1lICsKCQkiOiAiICsgZXJyLkVycm9yKCkgKyAiOyBzaWduYXR1cmUgaXMgIiArIHYuU2lnbmF0dXJlKCkpCn0KCi8vIGRlY29kZSBwYXJzZXMgYW5kIHZhbGlkYXRlcyBhIHBheWxvYWQgYWdhaW5zdCB2LgpmdW5jIGRlY29kZSh2IFZlcmIsIHBheWxvYWQgc3RyaW5nKSAoKkFyZ3MsIGVycm9yKSB7Cgl2YWx1ZXMgOj0gW11zdHJpbmd7fQoJaWYgcGF5bG9hZCA9PSAiIiB7CgkJLy8gQW1iaWd1b3VzIG9uIGl0cyBvd246IG5vIGZpZWxkcywgb3Igb25lIGVtcHR5IGZpZWxkLiBUaGUgdmVyYgoJCS8vIGRlY2lkZXMuIEEgcmVxdWlyZWQgZmlyc3QgcGFyYW1ldGVyIG1lYW5zIGFuIGVtcHR5IHBheWxvYWQgaXMgdGhhdAoJCS8vIHBhcmFtZXRlciwgZW1wdHkgLS0gd2hpY2ggaXMgd2hhdCBhIGdub2tleSBjYWxsZXIgcGFzc2luZyAiIiBmb3IgYQoJCS8vIHN0cmluZyBtZWFucywgYW5kIEVuY29kZSBzcGVsbHMgYCIiYCBmb3IgdGhlIHNhbWUgY2FzZS4KCQlpZiB2LlJlcXVpcmVkKCkgPj0gMSB7CgkJCXZhbHVlcyA9IFtdc3RyaW5neyIifQoJCX0KCX0gZWxzZSBpZiByZWMsIHBsYWluIDo9IHNwbGl0UGxhaW4ocGF5bG9hZCk7IHBsYWluIHsKCQkvLyBGYXN0IHBhdGg6IHdpdGggbm8gcXVvdGUgYW5kIG5vIG5ld2xpbmUgYW55d2hlcmUsIG5vIGZpZWxkIGlzCgkJLy8gcXVvdGVkLCBzbyBldmVyeSBjb21tYSBpcyBhIHNlcGFyYXRvciBhbmQgZXZlcnkgZmllbGQgaXMgbGl0ZXJhbAoJCS8vIC0tIGV4YWN0bHkgd2hhdCBjc3YuUmVhZGVyIHdvdWxkIHJldHVybi4gc3BsaXRQbGFpbiBkZWNpZGVzIHRoYXQKCQkvLyBhbmQgZG9lcyB0aGUgc3BsaXQgaW4gb25lIHBhc3MsIGJlY2F1c2UgZXZlcnkgc3RyaW5nIG9wZXJhdGlvbgoJCS8vIGhlcmUgaXMgaW50ZXJwcmV0ZWQgR25vOiB0d28gcGFzc2VzIHdpdGggc3RyaW5ncy5Db250YWluc0FueSBhbmQKCQkvLyBzdHJpbmdzLlNwbGl0IGNvc3RzIG1vcmUgdGhhbiB0aGUgY3N2IHBhcnNlIGl0IHJlcGxhY2VzLgoJCXZhbHVlcyA9IHJlYwoJfSBlbHNlIHsKCQlyZWMsIGVyciA6PSBjc3YuTmV3UmVhZGVyKHN0cmluZ3MuTmV3UmVhZGVyKHBheWxvYWQpKS5SZWFkKCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldygiYXBwOiAiICsgdi5OYW1lICsgIjogbWFsZm9ybWVkIHBheWxvYWQ6ICIgKyBlcnIuRXJyb3IoKSkKCQl9CgkJdmFsdWVzID0gcmVjCgl9CglpZiBlcnIgOj0gY2hlY2tBcml0eSh2LCBsZW4odmFsdWVzKSk7IGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJZm9yIGksIHZhbCA6PSByYW5nZSB2YWx1ZXMgewoJCWlmIGVyciA6PSB2LlBhcmFtc1tpXS5LaW5kLnBhcnNlKHZhbCk7IGVyciAhPSBuaWwgewoJCQlyZXR1cm4gbmlsLCBmaWVsZEVycih2LCBpLCBlcnIpCgkJfQoJfQoJcmV0dXJuICZBcmdze3ZlcmI6IHYsIHZhbHVlczogdmFsdWVzfSwgbmlsCn0KGmEKC2dub21vZC50b21sElJtb2R1bGUgPSAiZ25vLmxhbmQvcC9nMWxua3l0ZnFjandsbHdzNjNndmYwbXY5eXQwNGFzd3k0eTlhbWhtL2FwcC92MCIKZ25vID0gIjAuOSIKGpdPCgpzY2hlbWEuZ25vEohPcGFja2FnZSBhcHAKCmltcG9ydCAoCgkiZXJyb3JzIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKKQoKLy8gQSBzY2hlbWEgaXMgd2hhdCBhIGhhbmRsZXIgc2F5cyBhYm91dCBpdHNlbGY6IHRoZSB2ZXJicyBpdCBhbnN3ZXJzLCB3aGF0Ci8vIGVhY2ggb25lIHRha2VzLCBhbmQgd2hhdCBpdCBnaXZlcyBiYWNrLiBIYW5kbGVycyBkZWNsYXJlIG9uZTsgdGhlIGFwcCByZWFkcwovLyBpdCB0byBlbnVtZXJhdGUgdGhlIEFQSSwgdG8gdmFsaWRhdGUgcGF5bG9hZHMgYmVmb3JlIGRpc3BhdGNoLCBhbmQgdG8gcmVmdXNlCi8vIGFuIHVwZ3JhZGUgdGhhdCB3b3VsZCBicmVhayBhIGNhbGxlci4KLy8KLy8gVGhpcyBpcyB0aGUgcGFydCBhIHZlcmItZGlzcGF0Y2ggQVBJIGlzIHVzdWFsbHkgbWlzc2luZy4gV2l0aG91dCBpdCwgInRoZQovLyBBUEkiIGlzIHdoYXRldmVyIHRoZSBsaXZlIGhhbmRsZXIncyBzd2l0Y2ggc3RhdGVtZW50IGhhcHBlbnMgdG8gYWNjZXB0OiBub3QKLy8gZGlzY292ZXJhYmxlLCBub3QgY2hlY2thYmxlLCBhbmQgZnJlZSB0byBjaGFuZ2UgdW5kZXIgY2FsbGVycyB3aXRob3V0Ci8vIGFueXRoaW5nIG5vdGljaW5nLiBBIHNjaGVtYSBtYWtlcyBpdCBkYXRhLCB3aGljaCBpcyB0aGUgc2FtZSBtb3ZlIHRoYXQgbWFrZXMKLy8gdGhlIEFQSSBncm93YWJsZSBpbiB0aGUgZmlyc3QgcGxhY2UuCi8vCi8vIFdoYXQgaXQgaXMgbm90IGlzIHN0YXRpYyB0eXBpbmcuIEdubyBoYXMgbm8gcmVmbGVjdGlvbiwgc28gbm90aGluZyBoZXJlIGNhbgovLyBsb29rIGF0IHlvdXIgR28gdHlwZXMuIFZhbGlkYXRpb24gaGFwcGVucyBhdCBjYWxsIHRpbWUgYWdhaW5zdCBkZWNsYXJhdGlvbnMKLy8geW91IHdyb3RlIGJ5IGhhbmQsIGFuZCBhIGhhbmRsZXIgd2hvc2Ugc3dpdGNoIGRpc2FncmVlcyB3aXRoIGl0cyBvd24gc2NoZW1hCi8vIGlzIGEgYnVnIHRoZSBzY2hlbWEgY2Fubm90IGNhdGNoLgoKLy8gS2luZCBpcyB0aGUgdHlwZSBvZiBvbmUgcGF5bG9hZCBmaWVsZC4gVGhlIHNldCBpcyBkZWxpYmVyYXRlbHkgc21hbGw6IHRoZXNlCi8vIGFyZSB0aGUgdHlwZXMgdGhhdCBzdXJ2aXZlIGEgc3RyaW5nIGVuY29kaW5nIHdpdGhvdXQgYW1iaWd1aXR5Lgp0eXBlIEtpbmQgc3RyaW5nCgpjb25zdCAoCglLaW5kU3RyaW5nICBLaW5kID0gInN0cmluZyIKCUtpbmRJbnQgICAgIEtpbmQgPSAiaW50IiAgICAgLy8gaW50NjQsIGJhc2UgMTAKCUtpbmRCb29sICAgIEtpbmQgPSAiYm9vbCIgICAgLy8gInRydWUiIG9yICJmYWxzZSIKCUtpbmRBZGRyZXNzIEtpbmQgPSAiYWRkcmVzcyIgLy8gYmVjaDMyLCB2YWxpZGF0ZWQKCUtpbmROb25lICAgIEtpbmQgPSAibm9uZSIgICAgLy8gYSB2ZXJiIHRoYXQgcmV0dXJucyBub3RoaW5nIG1lYW5pbmdmdWwKKQoKLy8gVmFsaWQgcmVwb3J0cyB3aGV0aGVyIGsgaXMgYSBrbm93biBraW5kLgpmdW5jIChrIEtpbmQpIFZhbGlkKCkgYm9vbCB7Cglzd2l0Y2ggayB7CgljYXNlIEtpbmRTdHJpbmcsIEtpbmRJbnQsIEtpbmRCb29sLCBLaW5kQWRkcmVzcywgS2luZE5vbmU6CgkJcmV0dXJuIHRydWUKCX0KCXJldHVybiBmYWxzZQp9CgovLyBwYXJzZSBjaGVja3MgdGhhdCB2IGlzIGEgd2VsbC1mb3JtZWQgdmFsdWUgb2Yga2luZCBrLgpmdW5jIChrIEtpbmQpIHBhcnNlKHYgc3RyaW5nKSBlcnJvciB7Cglzd2l0Y2ggayB7CgljYXNlIEtpbmRTdHJpbmcsIEtpbmROb25lOgoJCXJldHVybiBuaWwKCWNhc2UgS2luZEludDoKCQlpZiBfLCBlcnIgOj0gc3RyY29udi5QYXJzZUludCh2LCAxMCwgNjQpOyBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycm9ycy5OZXcoImV4cGVjdGVkIGFuIGludGVnZXIsIGdvdCAiICsgc3RyY29udi5RdW90ZSh2KSkKCQl9CgljYXNlIEtpbmRCb29sOgoJCWlmIHYgIT0gInRydWUiICYmIHYgIT0gImZhbHNlIiB7CgkJCXJldHVybiBlcnJvcnMuTmV3KCJleHBlY3RlZCB0cnVlIG9yIGZhbHNlLCBnb3QgIiArIHN0cmNvbnYuUXVvdGUodikpCgkJfQoJY2FzZSBLaW5kQWRkcmVzczoKCQlpZiAhYWRkcmVzcyh2KS5Jc1ZhbGlkKCkgewoJCQlyZXR1cm4gZXJyb3JzLk5ldygiZXhwZWN0ZWQgYW4gYWRkcmVzcywgZ290ICIgKyBzdHJjb252LlF1b3RlKHYpKQoJCX0KCWRlZmF1bHQ6CgkJcmV0dXJuIGVycm9ycy5OZXcoInVua25vd24ga2luZCAiICsgc3RyaW5nKGspKQoJfQoJcmV0dXJuIG5pbAp9CgovLyBGaWVsZCBpcyBvbmUgcGFyYW1ldGVyIG9mIGEgdmVyYi4KdHlwZSBGaWVsZCBzdHJ1Y3QgewoJTmFtZSBzdHJpbmcKCUtpbmQgS2luZAoJRG9jICBzdHJpbmcKCU9wdCAgYm9vbCAvLyBtYXkgYmUgb21pdHRlZCwgYW5kIG9ubHkgYXQgdGhlIGVuZCBvZiB0aGUgcGFyYW1ldGVyIGxpc3QKfQoKLy8gUCBkZWNsYXJlcyBhIHJlcXVpcmVkIHBhcmFtZXRlci4KZnVuYyBQKG5hbWUgc3RyaW5nLCBraW5kIEtpbmQsIGRvYyBzdHJpbmcpIEZpZWxkIHsKCXJldHVybiBGaWVsZHtOYW1lOiBuYW1lLCBLaW5kOiBraW5kLCBEb2M6IGRvY30KfQoKLy8gT3B0IGRlY2xhcmVzIGFuIG9wdGlvbmFsIHBhcmFtZXRlci4gT3B0aW9uYWwgcGFyYW1ldGVycyBtdXN0IGNvbWUgbGFzdCwgYW5kCi8vIGFwcGVuZGluZyBvbmUgaXMgdGhlIG9ubHkgd2F5IHRvIGFkZCBhIHBhcmFtZXRlciB0byBhIHZlcmIgd2l0aG91dCBicmVha2luZwovLyBjYWxsZXJzLgpmdW5jIE9wdChuYW1lIHN0cmluZywga2luZCBLaW5kLCBkb2Mgc3RyaW5nKSBGaWVsZCB7CglyZXR1cm4gRmllbGR7TmFtZTogbmFtZSwgS2luZDoga2luZCwgRG9jOiBkb2MsIE9wdDogdHJ1ZX0KfQoKLy8gVmVyYiBpcyBvbmUgb3BlcmF0aW9uJ3Mgc2lnbmF0dXJlLgp0eXBlIFZlcmIgc3RydWN0IHsKCU5hbWUgICBzdHJpbmcKCURvYyAgICBzdHJpbmcKCVJlc3VsdCBLaW5kCglQYXJhbXMgW11GaWVsZAp9CgovLyBPcCBkZWNsYXJlcyBhIHZlcmIuCmZ1bmMgT3AobmFtZSwgZG9jIHN0cmluZywgcmVzdWx0IEtpbmQsIHBhcmFtcyAuLi5GaWVsZCkgVmVyYiB7CglyZXR1cm4gVmVyYntOYW1lOiBuYW1lLCBEb2M6IGRvYywgUmVzdWx0OiByZXN1bHQsIFBhcmFtczogcGFyYW1zfQp9CgovLyBSZXF1aXJlZCByZXR1cm5zIGhvdyBtYW55IGxlYWRpbmcgcGFyYW1ldGVycyBtdXN0IGJlIHN1cHBsaWVkLgpmdW5jICh2IFZlcmIpIFJlcXVpcmVkKCkgaW50IHsKCW4gOj0gMAoJZm9yIF8sIHAgOj0gcmFuZ2Ugdi5QYXJhbXMgewoJCWlmIHAuT3B0IHsKCQkJYnJlYWsKCQl9CgkJbisrCgl9CglyZXR1cm4gbgp9CgovLyBTaWduYXR1cmUgcmVuZGVycyB0aGUgdmVyYiBhcyBhIG9uZS1saW5lIGRlY2xhcmF0aW9uOgovLwovLwlhZGQodGV4dDpzdHJpbmcsIHVyZ2VudDpib29sPykgLT4gaW50CmZ1bmMgKHYgVmVyYikgU2lnbmF0dXJlKCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZyh2Lk5hbWUpCgliLldyaXRlU3RyaW5nKCIoIikKCWZvciBpLCBwIDo9IHJhbmdlIHYuUGFyYW1zIHsKCQlpZiBpID4gMCB7CgkJCWIuV3JpdGVTdHJpbmcoIiwgIikKCQl9CgkJYi5Xcml0ZVN0cmluZyhwLk5hbWUgKyAiOiIgKyBzdHJpbmcocC5LaW5kKSkKCQlpZiBwLk9wdCB7CgkJCWIuV3JpdGVTdHJpbmcoIj8iKQoJCX0KCX0KCWIuV3JpdGVTdHJpbmcoIikgLT4gIiArIHN0cmluZyh2LlJlc3VsdCkpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBTY2hlbWEgaXMgYSBoYW5kbGVyJ3Mgd2hvbGUgQVBJLCBzb3J0ZWQgYnkgdmVyYiBuYW1lLgp0eXBlIFNjaGVtYSBzdHJ1Y3QgewoJdmVyYnMgW11WZXJiCn0KCi8vIE5ld1NjaGVtYSB2YWxpZGF0ZXMgYW5kIHNvcnRzIHRoZSBkZWNsYXJhdGlvbnMuIEl0IHBhbmljcyBvbiBhIHNjaGVtYSB0aGF0Ci8vIGNvdWxkIG5vdCBiZSBzZXJ2ZWQgY29ycmVjdGx5OiBhIGJsYW5rIG9yIGR1cGxpY2F0ZSBuYW1lLCBhbiB1bmtub3duIGtpbmQsIGEKLy8gcmVxdWlyZWQgcGFyYW1ldGVyIGFmdGVyIGFuIG9wdGlvbmFsIG9uZSwgb3IgYSBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWUuCi8vIFRob3NlIGFyZSBhbGwgYXV0aG9yaW5nIG1pc3Rha2VzLCBhbmQgYSBoYW5kbGVyIGNhcnJ5aW5nIG9uZSBzaG91bGQgZmFpbCB0bwovLyBkZXBsb3kgcmF0aGVyIHRoYW4gbWlzLWRlc2NyaWJlIGl0c2VsZiBmb3JldmVyLgpmdW5jIE5ld1NjaGVtYSh2ZXJicyAuLi5WZXJiKSAqU2NoZW1hIHsKCXMgOj0gJlNjaGVtYXt2ZXJiczogbWFrZShbXVZlcmIsIDAsIGxlbih2ZXJicykpfQoJZm9yIF8sIHYgOj0gcmFuZ2UgdmVyYnMgewoJCWlmIHN0cmluZ3MuVHJpbVNwYWNlKHYuTmFtZSkgPT0gIiIgfHwgdi5OYW1lICE9IHN0cmluZ3MuVHJpbVNwYWNlKHYuTmFtZSkgewoJCQlwYW5pYyhlcnJvcnMuTmV3KCJhcHA6IHZlcmIgbmFtZXMgbXVzdCBiZSBub24tYmxhbmsgYW5kIHVucGFkZGVkIikpCgkJfQoJCWlmICF2LlJlc3VsdC5WYWxpZCgpIHsKCQkJcGFuaWMoZXJyb3JzLk5ldygiYXBwOiB2ZXJiICIgKyB2Lk5hbWUgKyAiOiB1bmtub3duIHJlc3VsdCBraW5kICIgKyBzdHJpbmcodi5SZXN1bHQpKSkKCQl9CgkJaWYgXywgZHVwIDo9IHMuTG9va3VwKHYuTmFtZSk7IGR1cCB7CgkJCXBhbmljKGVycm9ycy5OZXcoImFwcDogZHVwbGljYXRlIHZlcmIgIiArIHYuTmFtZSkpCgkJfQoJCXNlZW5PcHQgOj0gZmFsc2UKCQlmb3IgaSwgcCA6PSByYW5nZSB2LlBhcmFtcyB7CgkJCWlmIHN0cmluZ3MuVHJpbVNwYWNlKHAuTmFtZSkgPT0gIiIgfHwgcC5OYW1lICE9IHN0cmluZ3MuVHJpbVNwYWNlKHAuTmFtZSkgewoJCQkJcGFuaWMoZXJyb3JzLk5ldygiYXBwOiB2ZXJiICIgKyB2Lk5hbWUgKyAiOiBwYXJhbWV0ZXIgbmFtZXMgbXVzdCBiZSBub24tYmxhbmsgYW5kIHVucGFkZGVkIikpCgkJCX0KCQkJaWYgIXAuS2luZC5WYWxpZCgpIHx8IHAuS2luZCA9PSBLaW5kTm9uZSB7CgkJCQlwYW5pYyhlcnJvcnMuTmV3KCJhcHA6IHZlcmIgIiArIHYuTmFtZSArICI6IHBhcmFtZXRlciAiICsgcC5OYW1lICsKCQkJCQkiIGhhcyB1bnVzYWJsZSBraW5kICIgKyBzdHJpbmcocC5LaW5kKSkpCgkJCX0KCQkJaWYgcC5PcHQgewoJCQkJc2Vlbk9wdCA9IHRydWUKCQkJfSBlbHNlIGlmIHNlZW5PcHQgewoJCQkJLy8gVGhlIGVuY29kaW5nIGlzIHBvc2l0aW9uYWwsIHNvIGEgcmVxdWlyZWQgcGFyYW1ldGVyIGFmdGVyIGFuCgkJCQkvLyBvcHRpb25hbCBvbmUgY291bGQgbmV2ZXIgYmUgc3VwcGxpZWQgd2l0aG91dCB0aGUgb3B0aW9uYWwuCgkJCQlwYW5pYyhlcnJvcnMuTmV3KCJhcHA6IHZlcmIgIiArIHYuTmFtZSArICI6IHJlcXVpcmVkIHBhcmFtZXRlciAiICsKCQkJCQlwLk5hbWUgKyAiIGZvbGxvd3MgYW4gb3B0aW9uYWwgb25lIikpCgkJCX0KCQkJZm9yIGogOj0gMDsgaiA8IGk7IGorKyB7CgkJCQlpZiB2LlBhcmFtc1tqXS5OYW1lID09IHAuTmFtZSB7CgkJCQkJcGFuaWMoZXJyb3JzLk5ldygiYXBwOiB2ZXJiICIgKyB2Lk5hbWUgKyAiOiBkdXBsaWNhdGUgcGFyYW1ldGVyICIgKyBwLk5hbWUpKQoJCQkJfQoJCQl9CgkJfQoJCWF0IDo9IGxlbihzLnZlcmJzKQoJCWZvciBpLCBlIDo9IHJhbmdlIHMudmVyYnMgewoJCQlpZiB2Lk5hbWUgPCBlLk5hbWUgewoJCQkJYXQgPSBpCgkJCQlicmVhawoJCQl9CgkJfQoJCXMudmVyYnMgPSBhcHBlbmQocy52ZXJicywgVmVyYnt9KQoJCWNvcHkocy52ZXJic1thdCsxOl0sIHMudmVyYnNbYXQ6XSkKCQlzLnZlcmJzW2F0XSA9IHYKCX0KCXJldHVybiBzCn0KCi8vIE5hbWVzIHJldHVybnMgdGhlIHZlcmIgbmFtZXMsIHNvcnRlZC4KZnVuYyAocyAqU2NoZW1hKSBOYW1lcygpIFtdc3RyaW5nIHsKCWlmIHMgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CglvdXQgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKHMudmVyYnMpKQoJZm9yIF8sIHYgOj0gcmFuZ2Ugcy52ZXJicyB7CgkJb3V0ID0gYXBwZW5kKG91dCwgdi5OYW1lKQoJfQoJcmV0dXJuIG91dAp9CgovLyBMb29rdXAgcmV0dXJucyB0aGUgdmVyYiBieSBuYW1lLgpmdW5jIChzICpTY2hlbWEpIExvb2t1cChuYW1lIHN0cmluZykgKFZlcmIsIGJvb2wpIHsKCWlmIHMgPT0gbmlsIHsKCQlyZXR1cm4gVmVyYnt9LCBmYWxzZQoJfQoJZm9yIF8sIHYgOj0gcmFuZ2Ugcy52ZXJicyB7CgkJaWYgdi5OYW1lID09IG5hbWUgewoJCQlyZXR1cm4gdiwgdHJ1ZQoJCX0KCX0KCXJldHVybiBWZXJie30sIGZhbHNlCn0KCi8vIFZlcmJzIHJldHVybnMgYSBjb3B5IG9mIHRoZSBkZWNsYXJhdGlvbnMuCmZ1bmMgKHMgKlNjaGVtYSkgVmVyYnMoKSBbXVZlcmIgewoJaWYgcyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCWR1cCA6PSBtYWtlKFtdVmVyYiwgbGVuKHMudmVyYnMpKQoJY29weShkdXAsIHMudmVyYnMpCglyZXR1cm4gZHVwCn0KCi8vIFNpZ25hdHVyZSByZW5kZXJzIG9uZSB2ZXJiLCBvciAiIiBpZiBpdCBpcyBub3QgZGVjbGFyZWQuCmZ1bmMgKHMgKlNjaGVtYSkgU2lnbmF0dXJlKG5hbWUgc3RyaW5nKSBzdHJpbmcgewoJaWYgdiwgb2sgOj0gcy5Mb29rdXAobmFtZSk7IG9rIHsKCQlyZXR1cm4gdi5TaWduYXR1cmUoKQoJfQoJcmV0dXJuICIiCn0KCi8vIE1hcmtkb3duIHJlbmRlcnMgdGhlIEFQSSBhcyBhIHRhYmxlLCBmb3IgUmVuZGVyLgpmdW5jIChzICpTY2hlbWEpIE1hcmtkb3duKCkgc3RyaW5nIHsKCWlmIHMgPT0gbmlsIHx8IGxlbihzLnZlcmJzKSA9PSAwIHsKCQlyZXR1cm4gIl9ObyBBUEkgZGVjbGFyZWQuX1xuIgoJfQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCJ8IFZlcmIgfCBQYXlsb2FkIHwgUmV0dXJucyB8IHxcbnwtLS18LS0tfC0tLXwtLS18XG4iKQoJZm9yIF8sIHYgOj0gcmFuZ2Ugcy52ZXJicyB7CgkJcGFyYW1zIDo9IG1ha2UoW11zdHJpbmcsIDAsIGxlbih2LlBhcmFtcykpCgkJZm9yIF8sIHAgOj0gcmFuZ2Ugdi5QYXJhbXMgewoJCQlmIDo9IHAuTmFtZSArICI6IiArIHN0cmluZyhwLktpbmQpCgkJCWlmIHAuT3B0IHsKCQkJCWYgKz0gIj8iCgkJCX0KCQkJcGFyYW1zID0gYXBwZW5kKHBhcmFtcywgZikKCQl9CgkJcCA6PSBzdHJpbmdzLkpvaW4ocGFyYW1zLCAiLCAiKQoJCWlmIHAgPT0gIiIgewoJCQlwID0gIuKAlCIKCQl9CgkJYi5Xcml0ZVN0cmluZygifCBgIiArIHYuTmFtZSArICJgIHwgYCIgKyBwICsgImAgfCBgIiArIHN0cmluZyh2LlJlc3VsdCkgKwoJCQkiYCB8ICIgKyB2LkRvYyArICIgfFxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCi8vIEpTT04gcmVuZGVycyB0aGUgc2NoZW1hIGZvciB0b29saW5nOiBhIGNsaWVudCBjYW4gYnVpbGQgYSBmb3JtIGZyb20gdGhpcwovLyB3aXRob3V0IHJlYWRpbmcgYW55IEdubyBzb3VyY2UuCmZ1bmMgKHMgKlNjaGVtYSkgSlNPTigpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoYHsidmVyYnMiOltgKQoJaWYgcyAhPSBuaWwgewoJCWZvciBpLCB2IDo9IHJhbmdlIHMudmVyYnMgewoJCQlpZiBpID4gMCB7CgkJCQliLldyaXRlU3RyaW5nKCIsIikKCQkJfQoJCQliLldyaXRlU3RyaW5nKGB7Im5hbWUiOmAgKyBqc29uU3RyKHYuTmFtZSkgKwoJCQkJYCwiZG9jIjpgICsganNvblN0cih2LkRvYykgKwoJCQkJYCwicmVzdWx0IjpgICsganNvblN0cihzdHJpbmcodi5SZXN1bHQpKSArCgkJCQlgLCJwYXJhbXMiOltgKQoJCQlmb3IgaiwgcCA6PSByYW5nZSB2LlBhcmFtcyB7CgkJCQlpZiBqID4gMCB7CgkJCQkJYi5Xcml0ZVN0cmluZygiLCIpCgkJCQl9CgkJCQliLldyaXRlU3RyaW5nKGB7Im5hbWUiOmAgKyBqc29uU3RyKHAuTmFtZSkgKwoJCQkJCWAsImtpbmQiOmAgKyBqc29uU3RyKHN0cmluZyhwLktpbmQpKSArCgkJCQkJYCwiZG9jIjpgICsganNvblN0cihwLkRvYykgKwoJCQkJCWAsIm9wdGlvbmFsIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHAuT3B0KSArIGB9YCkKCQkJfQoJCQliLldyaXRlU3RyaW5nKGBdfWApCgkJfQoJfQoJYi5Xcml0ZVN0cmluZyhgXX1gKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gRGlmZiByZXBvcnRzIHdoYXQgdXBncmFkaW5nIGZyb20gcHJldiB0byBzIHdvdWxkIGJyZWFrIGZvciBleGlzdGluZyBjYWxsZXJzLgovLyBBbiBlbXB0eSByZXN1bHQgbWVhbnMgZXZlcnkgcGF5bG9hZCB0aGF0IHdvcmtlZCBiZWZvcmUgc3RpbGwgd29ya3MuCi8vCi8vIEJyZWFraW5nOiBhIHZlcmIgZGlzYXBwZWFycywgYSBwYXJhbWV0ZXIgZGlzYXBwZWFycyBvciBjaGFuZ2VzIGtpbmQgb3IKLy8gcG9zaXRpb24sIGEgbmV3IHJlcXVpcmVkIHBhcmFtZXRlciBhcHBlYXJzLCBvciBhIHJlc3VsdCBraW5kIGNoYW5nZXMuCi8vIE5vdCBicmVha2luZzogYSBuZXcgdmVyYiwgYSBuZXcgb3B0aW9uYWwgcGFyYW1ldGVyIGF0IHRoZSBlbmQsIG5ldwovLyBkb2N1bWVudGF0aW9uLgpmdW5jIChzICpTY2hlbWEpIERpZmYocHJldiAqU2NoZW1hKSBbXXN0cmluZyB7CglvdXQgOj0gW11zdHJpbmd7fQoJaWYgcHJldiA9PSBuaWwgewoJCXJldHVybiBvdXQKCX0KCWZvciBfLCBvbGQgOj0gcmFuZ2UgcHJldi52ZXJicyB7CgkJbnYsIG9rIDo9IHMuTG9va3VwKG9sZC5OYW1lKQoJCWlmICFvayB7CgkJCW91dCA9IGFwcGVuZChvdXQsICJ2ZXJiICIrb2xkLk5hbWUrIiByZW1vdmVkIikKCQkJY29udGludWUKCQl9CgkJaWYgbnYuUmVzdWx0ICE9IG9sZC5SZXN1bHQgewoJCQlvdXQgPSBhcHBlbmQob3V0LCAidmVyYiAiK29sZC5OYW1lKyI6IHJlc3VsdCBjaGFuZ2VkIGZyb20gIisKCQkJCXN0cmluZyhvbGQuUmVzdWx0KSsiIHRvICIrc3RyaW5nKG52LlJlc3VsdCkpCgkJfQoJCWZvciBpLCBvcCA6PSByYW5nZSBvbGQuUGFyYW1zIHsKCQkJaWYgaSA+PSBsZW4obnYuUGFyYW1zKSB7CgkJCQlvdXQgPSBhcHBlbmQob3V0LCAidmVyYiAiK29sZC5OYW1lKyI6IHBhcmFtZXRlciAiK29wLk5hbWUrIiByZW1vdmVkIikKCQkJCWNvbnRpbnVlCgkJCX0KCQkJbnAgOj0gbnYuUGFyYW1zW2ldCgkJCWlmIG5wLk5hbWUgIT0gb3AuTmFtZSB7CgkJCQlvdXQgPSBhcHBlbmQob3V0LCAidmVyYiAiK29sZC5OYW1lKyI6IHBhcmFtZXRlciAiK3N0cmNvbnYuSXRvYShpKSsKCQkJCQkiIHJlbmFtZWQgZnJvbSAiK29wLk5hbWUrIiB0byAiK25wLk5hbWUpCgkJCX0KCQkJaWYgbnAuS2luZCAhPSBvcC5LaW5kIHsKCQkJCW91dCA9IGFwcGVuZChvdXQsICJ2ZXJiICIrb2xkLk5hbWUrIjogcGFyYW1ldGVyICIrb3AuTmFtZSsKCQkJCQkiIGNoYW5nZWQgZnJvbSAiK3N0cmluZyhvcC5LaW5kKSsiIHRvICIrc3RyaW5nKG5wLktpbmQpKQoJCQl9CgkJCWlmIG5wLk9wdCAhPSBvcC5PcHQgJiYgIW5wLk9wdCB7CgkJCQlvdXQgPSBhcHBlbmQob3V0LCAidmVyYiAiK29sZC5OYW1lKyI6IHBhcmFtZXRlciAiK29wLk5hbWUrCgkJCQkJIiBiZWNhbWUgcmVxdWlyZWQiKQoJCQl9CgkJfQoJCWZvciBpIDo9IGxlbihvbGQuUGFyYW1zKTsgaSA8IGxlbihudi5QYXJhbXMpOyBpKysgewoJCQlpZiAhbnYuUGFyYW1zW2ldLk9wdCB7CgkJCQlvdXQgPSBhcHBlbmQob3V0LCAidmVyYiAiK29sZC5OYW1lKyI6IHJlcXVpcmVkIHBhcmFtZXRlciAiKwoJCQkJCW52LlBhcmFtc1tpXS5OYW1lKyIgYWRkZWQiKQoJCQl9CgkJfQoJfQoJcmV0dXJuIG91dAp9CgovLyBqc29uU3RyIHF1b3RlcyBhbmQgZXNjYXBlcyBhIHN0cmluZyBmb3IgdGhlIEpTT04gcmVuZGVyaW5nIGFib3ZlLgpmdW5jIGpzb25TdHIocyBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoYCJgKQoJZm9yIF8sIHIgOj0gcmFuZ2UgcyB7CgkJc3dpdGNoIHIgewoJCWNhc2UgJyInOgoJCQliLldyaXRlU3RyaW5nKGBcImApCgkJY2FzZSAnXFwnOgoJCQliLldyaXRlU3RyaW5nKGBcXGApCgkJY2FzZSAnXG4nOgoJCQliLldyaXRlU3RyaW5nKGBcbmApCgkJY2FzZSAnXHInOgoJCQliLldyaXRlU3RyaW5nKGBccmApCgkJY2FzZSAnXHQnOgoJCQliLldyaXRlU3RyaW5nKGBcdGApCgkJZGVmYXVsdDoKCQkJaWYgciA8IDB4MjAgewoJCQkJYi5Xcml0ZVN0cmluZyhgXHUwMGApCgkJCQljb25zdCBoZXggPSAiMDEyMzQ1Njc4OWFiY2RlZiIKCQkJCWIuV3JpdGVCeXRlKGhleFsocj4+NCkmMHhmXSkKCQkJCWIuV3JpdGVCeXRlKGhleFtyJjB4Zl0pCgkJCQljb250aW51ZQoJCQl9CgkJCWIuV3JpdGVSdW5lKHIpCgkJfQoJfQoJYi5Xcml0ZVN0cmluZyhgImApCglyZXR1cm4gYi5TdHJpbmcoKQp9Chr/KAoJc3RvcmUuZ25vEvEocGFja2FnZSBhcHAKCmltcG9ydCAic3RyY29udiIKCi8vIGt2IGlzIHRoZSBzY2hlbWEtZnJlZSBrZXkvdmFsdWUgZGF0YSBpdHNlbGYuIEl0IGlzIHVuZXhwb3J0ZWQgYW5kIG5ldmVyCi8vIGhhbmRlZCBvdXQ6IGNhbGxlcnMgcmVhY2ggaXQgb25seSB0aHJvdWdoIGEgW1N0b3JlXSwgd2hpY2ggZ2F0ZXMgZXZlcnkKLy8gb3BlcmF0aW9uLiBLZWVwaW5nIHRoZSBkYXRhIGFuZCB0aGUgYWNjZXNzb3Igc2VwYXJhdGUgaXMgd2hhdCBsZXRzIHRoZQovLyBhY2Nlc3NvciBiZSBhIHJldm9jYWJsZSBjYXBhYmlsaXR5IHdoaWxlIHRoZSBkYXRhIHBlcnNpc3RzIHVudG91Y2hlZC4KLy8KLy8gSXQgZXhpc3RzIGJlY2F1c2UgYSBzdHJ1Y3QncyBmaWVsZHMgYXJlIGFzIHBlcm1hbmVudCBhcyB0aGUgcmVhbG0gdGhhdAovLyBkZWNsYXJlcyB0aGVtOiBpZiB5b3VyIHN0YXRlIGlzIGB0eXBlIFN0YXRlIHN0cnVjdCB7IGNvdW50IGludDY0IH1gIGluIGEKLy8gcmVhbG0geW91IGNhbiBuZXZlciByZWRlcGxveSwgeW91IGNhbiBuZXZlciBhZGQgYSBzZWNvbmQgZmllbGQuIEtleXMgYXJlCi8vIGRhdGEsIHNvIGEga3YgY2FuIGdyb3cgZm9yZXZlci4gVGhlIHRyYWRlIGlzIGV2ZXJ5dGhpbmcgYSB0eXBlIGdpdmVzIHlvdToKLy8gbm90aGluZyBpcyBjaGVja2VkLCB2YWx1ZXMgYXJlIHN0cmluZ3MsIGFuZCBhIHR5cG8gaW4gYSBrZXkgaXMgYSBzaWxlbnQKLy8gZW1wdHkgcmVhZC4KLy8KLy8gIyBXaGVyZSB0aGUgd3JpdGVzIGxhbmQKLy8KLy8gQSBrdiBpcyBhbGxvY2F0ZWQgYnkgeW91ciByZWFsbSwgc28gR25vJ3Mgc3RvcmFnZS1yZWFsbSBib3Jyb3cgcGVyc2lzdHMKLy8gZXZlcnkgd3JpdGUgaW4gdGhlIHJlYWxtIHRoYXQgb3ducyBpdCAtLSBub3QgaW4gdGhlIGNhbGxlcidzLiBUaGF0IGlzIHdoYXQKLy8gbGV0cyBhbiBpbXBsZW1lbnRhdGlvbiByZWFsbSBtdXRhdGUgeW91ciBzdGF0ZSB3aXRob3V0IGhvbGRpbmcgYW55IG9mIGl0Lgp0eXBlIGt2IHN0cnVjdCB7CglrZXlzIFtdc3RyaW5nIC8vIHNvcnRlZAoJdmFscyBbXXN0cmluZwp9CgpmdW5jIG5ld0tWKCkgKmt2IHsgcmV0dXJuICZrdnt9IH0KCi8vIGZpbmQgcmV0dXJucyB0aGUgaW5zZXJ0aW9uIGluZGV4IGZvciBrIGFuZCB3aGV0aGVyIGsgaXMgcHJlc2VudC4KZnVuYyAocyAqa3YpIGZpbmQoayBzdHJpbmcpIChpbnQsIGJvb2wpIHsKCWxvLCBoaSA6PSAwLCBsZW4ocy5rZXlzKQoJZm9yIGxvIDwgaGkgewoJCW1pZCA6PSBpbnQodWludChsbytoaSkgPj4gMSkKCQlpZiBzLmtleXNbbWlkXSA8IGsgewoJCQlsbyA9IG1pZCArIDEKCQl9IGVsc2UgewoJCQloaSA9IG1pZAoJCX0KCX0KCXJldHVybiBsbywgbG8gPCBsZW4ocy5rZXlzKSAmJiBzLmtleXNbbG9dID09IGsKfQoKZnVuYyAocyAqa3YpIGdldChrIHN0cmluZykgc3RyaW5nIHsKCWlmIGksIG9rIDo9IHMuZmluZChrKTsgb2sgewoJCXJldHVybiBzLnZhbHNbaV0KCX0KCXJldHVybiAiIgp9CgpmdW5jIChzICprdikgaGFzKGsgc3RyaW5nKSBib29sIHsKCV8sIG9rIDo9IHMuZmluZChrKQoJcmV0dXJuIG9rCn0KCmZ1bmMgKHMgKmt2KSBzZXQoaywgdiBzdHJpbmcpIHsKCWksIG9rIDo9IHMuZmluZChrKQoJaWYgb2sgewoJCXMudmFsc1tpXSA9IHYKCQlyZXR1cm4KCX0KCXMua2V5cyA9IGFwcGVuZChzLmtleXMsICIiKQoJcy52YWxzID0gYXBwZW5kKHMudmFscywgIiIpCgljb3B5KHMua2V5c1tpKzE6XSwgcy5rZXlzW2k6XSkKCWNvcHkocy52YWxzW2krMTpdLCBzLnZhbHNbaTpdKQoJcy5rZXlzW2ldLCBzLnZhbHNbaV0gPSBrLCB2Cn0KCmZ1bmMgKHMgKmt2KSBkZWwoayBzdHJpbmcpIGJvb2wgewoJaSwgb2sgOj0gcy5maW5kKGspCglpZiAhb2sgewoJCXJldHVybiBmYWxzZQoJfQoJcy5rZXlzID0gYXBwZW5kKHMua2V5c1s6aV0sIHMua2V5c1tpKzE6XS4uLikKCXMudmFscyA9IGFwcGVuZChzLnZhbHNbOmldLCBzLnZhbHNbaSsxOl0uLi4pCglyZXR1cm4gdHJ1ZQp9CgpmdW5jIChzICprdikgbGVuZ3RoKCkgaW50IHsgcmV0dXJuIGxlbihzLmtleXMpIH0KCmZ1bmMgKHMgKmt2KSBhbGxLZXlzKCkgW11zdHJpbmcgewoJZHVwIDo9IG1ha2UoW11zdHJpbmcsIGxlbihzLmtleXMpKQoJY29weShkdXAsIHMua2V5cykKCXJldHVybiBkdXAKfQoKZnVuYyAocyAqa3YpIGtleXNXaXRoUHJlZml4KHByZWZpeCBzdHJpbmcpIFtdc3RyaW5nIHsKCW91dCA6PSBbXXN0cmluZ3t9CglpLCBfIDo9IHMuZmluZChwcmVmaXgpCglmb3IgOyBpIDwgbGVuKHMua2V5cyk7IGkrKyB7CgkJayA6PSBzLmtleXNbaV0KCQlpZiBsZW4oaykgPCBsZW4ocHJlZml4KSB8fCBrWzpsZW4ocHJlZml4KV0gIT0gcHJlZml4IHsKCQkJYnJlYWsKCQl9CgkJb3V0ID0gYXBwZW5kKG91dCwgaykKCX0KCXJldHVybiBvdXQKfQoKZnVuYyAocyAqa3YpIGdldEludChrIHN0cmluZykgaW50NjQgewoJbiwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQocy5nZXQoayksIDEwLCA2NCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gbgp9CgpmdW5jIChzICprdikgc2V0SW50KGsgc3RyaW5nLCB2IGludDY0KSB7IHMuc2V0KGssIHN0cmNvbnYuRm9ybWF0SW50KHYsIDEwKSkgfQoKZnVuYyAocyAqa3YpIGFkZEludChrIHN0cmluZywgZGVsdGEgaW50NjQpIGludDY0IHsKCW4gOj0gcy5nZXRJbnQoaykgKyBkZWx0YQoJcy5zZXRJbnQoaywgbikKCXJldHVybiBuCn0KCi8vIFN0b3JlIGlzIHRoZSBoYW5kbGVyLWZhY2luZyBhY2Nlc3Nvci4gSXQgaXMgTk9UIHRoZSBkYXRhIC0tIGl0IGlzIGEKLy8gcGVybWlzc2lvbiB0byB0b3VjaCBpdCwgYm91bmQgdG8gdGhlIHJlYWxtIHZhbHVlIGl0IHdhcyBpc3N1ZWQgZm9yLgovLwovLyBUaGlzIGlzIHdoYXQgY2xvc2VzIHRoZSBjYXBhYmlsaXR5IGxlYWsuIFRoZSBvbGQgZGVzaWduIGhhbmRlZCBvdXQgYSByYXcKLy8gcG9pbnRlciB0byB0aGUgZGF0YSwgd2hpY2ggYSBoYW5kbGVyIGNvdWxkIHN0YXNoIGluIGEgcGFja2FnZSB2YXJpYWJsZSBhbmQKLy8ga2VlcCB1c2luZyBhZnRlciBpdCB3YXMgcm9sbGVkIGJhY2sgb3IgdGhlIHJlYWxtIHdhcyBmcm96ZW4uIEEgU3RvcmUgaG9sZHMKLy8gdGhlIGNhbGxlcidzIHJlYWxtIHZhbHVlIGFuZCByZS1jaGVja3MgaXQgb24gZXZlcnkgb3BlcmF0aW9uLCBzbzoKLy8KLy8gICAtIEl0IGNhbm5vdCBiZSBzdGFzaGVkLiBBc3NpZ25pbmcgaXQgdG8gcmVhbG0gc3RhdGUgcGVyc2lzdHMgdGhlIHJlYWxtCi8vICAgICB2YWx1ZSBpdCBjYXJyaWVzLCB3aGljaCB0aGUgVk0gcmVmdXNlcyAoImNhbm5vdCBwZXJzaXN0IHJlYWxtIHZhbHVlIiksCi8vICAgICBhYm9ydGluZyB0aGUgdHJhbnNhY3Rpb24uIFRoZSBjYXBhYmlsaXR5IGNhbm5vdCBvdXRsaXZlIHRoZSBjYWxsLgovLyAgIC0gSXQgY2Fubm90IGJlIHJlcGxheWVkLiBFdmVuIGhlbGQgdHJhbnNpZW50bHksIGEgU3RvcmUgd2hvc2UgZnJhbWUgaGFzCi8vICAgICByZXR1cm5lZCBmYWlscyBJc0N1cnJlbnQoKSBvbiBpdHMgbmV4dCB1c2UuCi8vCi8vIFNvIHRoZSBncmFudCBsaXZlcyBhbmQgZGllcyB3aXRoIHRoZSBleGFjdCBjYWxsIGZyYW1lIHRoYXQgb2J0YWluZWQgaXQsCi8vIHdoaWNoIGlzIHRoZSBvbmx5IHdpbmRvdyBpbiB3aGljaCB0aGUgY2FsbGVyIGlzIGdlbnVpbmVseSB0aGUgbGl2ZSBoYW5kbGVyCi8vIChvciBhIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uKS4gU2VlIFtBcHAuU3RvcmVdLgp0eXBlIFN0b3JlIHN0cnVjdCB7CglhcHAgKkFwcAoJcmxtIHJlYWxtCn0KCi8vIEdldCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBrLCBvciAiIiBpZiBhYnNlbnQuIEFuIGFic2VudCBrZXkgYW5kIGEga2V5IHNldCB0bwovLyAiIiByZWFkIHRoZSBzYW1lOyB1c2UgSGFzIHRvIHRlbGwgdGhlbSBhcGFydC4KZnVuYyAocyAqU3RvcmUpIEdldChrIHN0cmluZykgc3RyaW5nIHsgcmV0dXJuIHMuYXBwLmFjY2VzcygwLCBzLnJsbSkuZ2V0KGspIH0KCi8vIEhhcyByZXBvcnRzIHdoZXRoZXIgayBpcyBwcmVzZW50LgpmdW5jIChzICpTdG9yZSkgSGFzKGsgc3RyaW5nKSBib29sIHsgcmV0dXJuIHMuYXBwLmFjY2VzcygwLCBzLnJsbSkuaGFzKGspIH0KCi8vIFNldCB3cml0ZXMgdiBhdCBrLgpmdW5jIChzICpTdG9yZSkgU2V0KGssIHYgc3RyaW5nKSB7IHMuYXBwLmFjY2VzcygwLCBzLnJsbSkuc2V0KGssIHYpIH0KCi8vIERlbGV0ZSByZW1vdmVzIGssIHJlcG9ydGluZyB3aGV0aGVyIGl0IHdhcyB0aGVyZS4KZnVuYyAocyAqU3RvcmUpIERlbGV0ZShrIHN0cmluZykgYm9vbCB7IHJldHVybiBzLmFwcC5hY2Nlc3MoMCwgcy5ybG0pLmRlbChrKSB9CgovLyBMZW4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleXMuCmZ1bmMgKHMgKlN0b3JlKSBMZW4oKSBpbnQgeyByZXR1cm4gcy5hcHAuYWNjZXNzKDAsIHMucmxtKS5sZW5ndGgoKSB9CgovLyBLZXlzIHJldHVybnMgYSBjb3B5IG9mIHRoZSBrZXlzLCBpbiBvcmRlci4KZnVuYyAocyAqU3RvcmUpIEtleXMoKSBbXXN0cmluZyB7IHJldHVybiBzLmFwcC5hY2Nlc3MoMCwgcy5ybG0pLmFsbEtleXMoKSB9CgovLyBLZXlzV2l0aFByZWZpeCByZXR1cm5zIHRoZSBrZXlzIHVuZGVyIGEgcHJlZml4LCBpbiBvcmRlci4gUHJlZml4ZXMgYXJlIGhvdwovLyBhIFN0b3JlIGhvbGRzIG1vcmUgdGhhbiBvbmUgY29sbGVjdGlvbjogInRhc2svMSIsICJ0YXNrLzIiLCAibWV0YS9vd25lciIuCmZ1bmMgKHMgKlN0b3JlKSBLZXlzV2l0aFByZWZpeChwcmVmaXggc3RyaW5nKSBbXXN0cmluZyB7CglyZXR1cm4gcy5hcHAuYWNjZXNzKDAsIHMucmxtKS5rZXlzV2l0aFByZWZpeChwcmVmaXgpCn0KCi8vIEdldEludCByZWFkcyBrIGFzIGFuIGludDY0LCByZXR1cm5pbmcgMCBpZiBpdCBpcyBhYnNlbnQgb3IgdW5wYXJzYWJsZS4KZnVuYyAocyAqU3RvcmUpIEdldEludChrIHN0cmluZykgaW50NjQgeyByZXR1cm4gcy5hcHAuYWNjZXNzKDAsIHMucmxtKS5nZXRJbnQoaykgfQoKLy8gU2V0SW50IHdyaXRlcyBhbiBpbnQ2NCBhdCBrLgpmdW5jIChzICpTdG9yZSkgU2V0SW50KGsgc3RyaW5nLCB2IGludDY0KSB7IHMuYXBwLmFjY2VzcygwLCBzLnJsbSkuc2V0SW50KGssIHYpIH0KCi8vIEFkZEludCBhZGRzIGRlbHRhIHRvIGsgYW5kIHJldHVybnMgdGhlIG5ldyB2YWx1ZS4KZnVuYyAocyAqU3RvcmUpIEFkZEludChrIHN0cmluZywgZGVsdGEgaW50NjQpIGludDY0IHsgcmV0dXJuIHMuYXBwLmFjY2VzcygwLCBzLnJsbSkuYWRkSW50KGssIGRlbHRhKSB9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBIRCLiuvDQSCjU1MDIxdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDU0gMEM0B0A0pDTgqang6sN+Vm0Quk1Dx+P7f2IjDDzYSQJbcFivaKwJWG2h+ptTUCiijsKNn5M2J7k4uHOePNH7eK6Owed4VwnuJWooNBRwrS73NOVws9Q0XIjsq8+8u5XMaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=