Transaction executed successfully

Transaction Details

Inspect execution, participants, message data, gas usage, events and raw transaction data.

Transaction hash
8BBEAA47F952BB32A44D60DB1556FF5E2E17398D4B8372FF3C7D271C1D029EC1

Transaction overview

Status
Success
Execution completed
Block
#77251
Included in block
Message Type
m_addpkg
Primary message

Execution summary

TX INDEX
0
Position in block
GAS WANTED
41,909,648
Requested gas limit
GAS USED
34,924,736
Gas consumed
FEE
41910ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04

Execution log

msg:0,success:true,log:,events:[]

Events

No events emitted by this transaction.

Raw encoded transaction

CoPkAQoML3ZtLm1fYWRkcGtnEvHjAQooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLD4wEKBGduZnQSF2duby5sYW5kL3IvZ25vc3dhcC9nbmZ0GpwwCglSRUFETUUubWQSjjAjIEdORlQKCkdSQzcyMS1jb21wYXRpYmxlIE5GVCBjb250cmFjdCBmb3IgR25vU3dhcCBMUCBwb3NpdGlvbnMuCgojIyBPdmVydmlldwoKR05GVCByZXByZXNlbnRzIGVhY2ggbGlxdWlkaXR5IHBvc2l0aW9uIGFzIGEgdW5pcXVlIE5GVC4gSXQgZXhwb3NlcyBvd25lcnNoaXAsCnRyYW5zZmVyLCBhcHByb3ZhbCwgYW5kIG1ldGFkYXRhIG9wZXJhdGlvbnMgd2hpbGUgZ2VuZXJhdGluZyBjb21wYWN0IFNWRyBhcnR3b3JrCmZvciB0b2tlbnMgd2hvc2UgVVJJIGlzIHN0b3JlZCBpbiBHTkZUJ3MgcGFyYW1ldGVyIGZvcm1hdC4KCkdORlQgaW1wbGVtZW50cyB0aGUgcG9zaXRpb24tTkZUIHN1cmZhY2UgdXNlZCBieSBHbm9Td2FwOyBpdCBkb2VzIG5vdCBleHBvc2UKZXZlcnkgb3B0aW9uYWwgR1JDNzIxIGV4dGVuc2lvbi4gSW4gcGFydGljdWxhciwgdGhpcyBwYWNrYWdlIGhhcyBubyB0b2tlbgplbnVtZXJhdGlvbiBBUEkgYW5kIGRvZXMgbm90IGV4cG9zZSBgc2FmZVRyYW5zZmVyRnJvbWAuCgojIyBDb3JlIEZlYXR1cmVzCgojIyMgT3duZXJzaGlwIGFuZCBhcHByb3ZhbHMKCi0gVHJhbnNmZXIsIHNpbmdsZS10b2tlbiBhcHByb3ZhbCwgYW5kIG9wZXJhdG9yIGFwcHJvdmFsCi0gT3duZXIsIGJhbGFuY2UsIGV4aXN0ZW5jZSwgYW5kIGFwcHJvdmFsIHF1ZXJpZXMKLSBTdGFrZWQgdG9rZW5zIGFyZSBsb2NrZWQgdG8gdGhlIHN0YWtlciBjb250cmFjdAotIE90aGVyIHRyYW5zZmVycyB1c2UgdGhlIEdSQzcyMSBvd25lciBhbmQgYXBwcm92YWwgY2hlY2tzCgojIyMgRHluYW1pYyBTVkcgZ2VuZXJhdGlvbgoKLSBHZW5lcmF0ZWQgdG9rZW5zIHN0b3JlIGNvbXBhY3QgZ3JhZGllbnQgcGFyYW1ldGVycwotIFBhcmFtZXRlcnMgYXJlIHJlbmRlcmVkIHRvIFNWRyBhbmQgcmV0dXJuZWQgYXMgYSBiYXNlNjQtZW5jb2RlZCBkYXRhIFVSSQotIFJlbmRlcmluZyBvY2N1cnMgb24gYFRva2VuVVJJYCByZWFkcyByYXRoZXIgdGhhbiBzdG9yaW5nIHRoZSBmdWxsIFNWRwotIEEgY3VzdG9tIG5vbi1lbXB0eSBVUkkgc2V0IHdpdGggYFNldFRva2VuVVJJYCBpcyByZXR1cm5lZCB1bmNoYW5nZWQgd2hlbiBpdCBpcyBub3QgaW4gR05GVCBwYXJhbWV0ZXIgZm9ybWF0CgojIyMgU3RvcmFnZQoKLSBDb21wYWN0IHBhcmFtZXRlciBzdG9yYWdlIHJlZHVjZXMgcGVyLXRva2VuIG1ldGFkYXRhIHNpemUKLSBUZW1wbGF0ZS1iYXNlZCBTVkcgZ2VuZXJhdGlvbiBhdm9pZHMgc3RvcmluZyByZXBlYXRlZCBtYXJrdXAKCiMjIEtleSBGdW5jdGlvbnMKCiMjIyBgTWludGAKCk1pbnRzIGEgbmV3IE5GVCBmb3IgYW4gTFAgcG9zaXRpb24uIE9ubHkgdGhlIHBvc2l0aW9uIHJvbGUgbWF5IGNhbGwgaXQuCgoqKlBhcmFtZXRlcnM6KioKLSBgY3VyIHJlYWxtYDogQ3VycmVudCByZWFsbSBjb250ZXh0Ci0gYHRvIGFkZHJlc3NgOiBSZWNpcGllbnQgYWRkcmVzcwotIGB0aWQgZ3JjNzIxLlRva2VuSURgOiBUb2tlbiBJRCB0byBtaW50CgoqKlJldHVybnM6KiogYGdyYzcyMS5Ub2tlbklEYAoKIyMjIGBCdXJuYAoKQnVybnMgYW4gTkZUIHdoZW4gaXRzIHBvc2l0aW9uIGlzIGNsb3NlZC4gT25seSB0aGUgcG9zaXRpb24gcm9sZSBtYXkgY2FsbCBpdC4KCioqUGFyYW1ldGVyczoqKgotIGBjdXIgcmVhbG1gOiBDdXJyZW50IHJlYWxtIGNvbnRleHQKLSBgdGlkIGdyYzcyMS5Ub2tlbklEYDogVG9rZW4gSUQgdG8gYnVybgoKIyMjIGBUcmFuc2ZlckZyb21gCgpUcmFuc2ZlcnMgTkZUIG93bmVyc2hpcC4KCioqUGFyYW1ldGVyczoqKgotIGBjdXIgcmVhbG1gOiBDdXJyZW50IHJlYWxtIGNvbnRleHQKLSBgZnJvbSBhZGRyZXNzYDogQ3VycmVudCBvd25lcgotIGB0byBhZGRyZXNzYDogTmV3IG93bmVyCi0gYHRpZCBncmM3MjEuVG9rZW5JRGA6IFRva2VuIElEIHRvIHRyYW5zZmVyCgpGb3IgYSB0b2tlbiBoZWxkIGJ5IHRoZSBzdGFrZXIgY29udHJhY3QsIG9ubHkgdGhlIHN0YWtlciBjYW4gbW92ZSBpdC4gRm9yIG90aGVyCnRva2VucywgdGhlIG93bmVyLCB0b2tlbiBhcHByb3ZhbCwgb3Igb3BlcmF0b3IgYXBwcm92YWwgbXVzdCBhdXRob3JpemUgdGhlCnRyYW5zZmVyLgoKIyMjIGBUb2tlblVSSWAKClJldHVybnMgbWV0YWRhdGEgZm9yIGEgdG9rZW4uIFdoZW4gdGhlIHN0b3JlZCBVUkkgcGFyc2VzIGFzIEdORlQgaW1hZ2UKcGFyYW1ldGVycyAoYHgxLHkxLHgyLHkyLGNvbG9yMSxjb2xvcjJgKSwgR05GVCByZW5kZXJzIHRob3NlIHBhcmFtZXRlcnMgYXMgYW4KU1ZHIGFuZCByZXR1cm5zIGEgYmFzZTY0LWVuY29kZWQgZGF0YSBVUkkuIEEgY3VzdG9tIG5vbi1lbXB0eSBVUkkgdGhhdCBpcyBub3QgaW4KdGhhdCBwYXJhbWV0ZXIgZm9ybWF0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KCioqUGFyYW1ldGVyczoqKgotIGB0aWQgZ3JjNzIxLlRva2VuSURgOiBUb2tlbiBJRAoKKipSZXR1cm5zOioqIFRva2VuIFVSSSBzdHJpbmcgYW5kIGFuIGVycm9yIHdoZW4gdGhlIHRva2VuIG9yIG1ldGFkYXRhIGlzIG1pc3NpbmcKCiMjIyBgU2V0VG9rZW5VUklgCgpTZXRzIGEgbm9uLWVtcHR5IHRva2VuIFVSSS4gT25seSB0aGUgcG9zaXRpb24gcm9sZSBtYXkgY2FsbCBpdC4KCioqUGFyYW1ldGVyczoqKgotIGBjdXIgcmVhbG1gOiBDdXJyZW50IHJlYWxtIGNvbnRleHQKLSBgdGlkIGdyYzcyMS5Ub2tlbklEYDogVG9rZW4gSUQKLSBgdFVSSSBzdHJpbmdgOiBOb24tZW1wdHkgbWV0YWRhdGEgVVJJCgojIyMgYEFwcHJvdmVgCgpBcHByb3ZlcyBhbiBhZGRyZXNzIHRvIG1hbmFnZSBhIHNwZWNpZmljIHRva2VuLgoKKipQYXJhbWV0ZXJzOioqCi0gYGN1ciByZWFsbWA6IEN1cnJlbnQgcmVhbG0gY29udGV4dAotIGBhcHByb3ZlZCBhZGRyZXNzYDogQWRkcmVzcyB0byBhcHByb3ZlCi0gYHRpZCBncmM3MjEuVG9rZW5JRGA6IFRva2VuIElECgojIyMgYFNldEFwcHJvdmFsRm9yQWxsYAoKQXBwcm92ZXMgb3IgcmV2b2tlcyBhbiBvcGVyYXRvciBmb3IgYWxsIHRva2VucyBvd25lZCBieSB0aGUgY2FsbGVyLgoKKipQYXJhbWV0ZXJzOioqCi0gYGN1ciByZWFsbWA6IEN1cnJlbnQgcmVhbG0gY29udGV4dAotIGBvcGVyYXRvciBhZGRyZXNzYDogT3BlcmF0b3IgYWRkcmVzcwotIGBhcHByb3ZlZCBib29sYDogQXBwcm92YWwgc3RhdHVzCgojIyMgUXVlcmllcwoKLSBgTmFtZSgpIHN0cmluZ2A6IENvbGxlY3Rpb24gbmFtZQotIGBTeW1ib2woKSBzdHJpbmdgOiBDb2xsZWN0aW9uIHN5bWJvbAotIGBUb3RhbFN1cHBseSgpIGludDY0YDogTnVtYmVyIG9mIG1pbnRlZCBORlRzCi0gYEJhbGFuY2VPZihvd25lciBhZGRyZXNzKSAoaW50NjQsIGVycm9yKWA6IE51bWJlciBvZiBORlRzIG93bmVkCi0gYE93bmVyT2YodGlkIGdyYzcyMS5Ub2tlbklEKSAoYWRkcmVzcywgZXJyb3IpYDogQ3VycmVudCBvd25lcgotIGBNdXN0T3duZXJPZih0aWQgZ3JjNzIxLlRva2VuSUQpIGFkZHJlc3NgOiBPd25lciBvciBwYW5pYyBvbiBlcnJvcgotIGBFeGlzdHModGlkIGdyYzcyMS5Ub2tlbklEKSBib29sYDogV2hldGhlciBhIHRva2VuIGV4aXN0cwotIGBHZXRBcHByb3ZlZCh0aWQgZ3JjNzIxLlRva2VuSUQpIChhZGRyZXNzLCBlcnJvcilgOiBUb2tlbiBhcHByb3ZhbAotIGBJc0FwcHJvdmVkRm9yQWxsKG93bmVyLCBvcGVyYXRvciBhZGRyZXNzKSBib29sYDogT3BlcmF0b3IgYXBwcm92YWwKCiMjIFNWRyBHZW5lcmF0aW9uCgojIyMgUGFyYW1ldGVyIEZvcm1hdAoKR2VuZXJhdGVkIHRva2VuIFVSSXMgc3RvcmUgY29tcGFjdCBwYXJhbWV0ZXJzOgoKYGBgCiJ4MSx5MSx4Mix5MiwjQ09MT1IxLCNDT0xPUjIiCkV4YW1wbGU6ICIxMCwxMiwxMjUsMTIzLCNGRjU3MzMsIzMzQjVGRiIKYGBgCgojIyMgUGFyYW1ldGVyIFJhbmdlcwoKLSBgeDFgOiA3LTEzCi0gYHkxYDogNy0xMwotIGB4MmA6IDEyMS0xMjYKLSBgeTJgOiAxMjEtMTI2Ci0gY29sb3JzOiA2LWRpZ2l0IGhleCAoYCNSUkdHQkJgKQoKIyMjIFJlbmRlcmluZyBQcm9jZXNzCgoxLiAqKk1pbnQqKjogR2VuZXJhdGUgcHNldWRvLXJhbmRvbSBwYXJhbWV0ZXJzIGFuZCBzdG9yZSB0aGVtIGFzIGEgQ1NWIHN0cmluZwoyLiAqKlRva2VuVVJJKio6IFBhcnNlIHRoZSBDU1YsIGdlbmVyYXRlIFNWRywgZW5jb2RlIGl0IGFzIGJhc2U2NCwgYW5kIHJldHVybiBhIGRhdGEgVVJJCjMuICoqRGlzcGxheSoqOiBUaGUgYnJvd3NlciBkZWNvZGVzIHRoZSBkYXRhIFVSSSBhbmQgcmVuZGVycyB0aGUgU1ZHCgpUaGUgcGFyYW1ldGVycyB1c2UgdGltZS1zZWVkZWQgYG1hdGgvcmFuZGA7IHRoaXMgaXMgcHNldWRvLXJhbmRvbSBhcnR3b3JrCmdlbmVyYXRpb24sIG5vdCBhIHNlY3VyaXR5IG9yIGNyeXB0b2dyYXBoaWMgcmFuZG9tbmVzcyBzb3VyY2UuCgojIyBVc2FnZQoKVGhlc2UgaGVscGVycyBpbGx1c3RyYXRlIGNhbGxzIGZyb20gYW4gaW50ZWdyYXRpbmcgcmVhbG0uIGBtaW50RXhhbXBsZWAgYW5kCmBidXJuRXhhbXBsZWAgcmVxdWlyZSB0aGF0IHJlYWxtIHRvIGhvbGQgdGhlIHBvc2l0aW9uIHJvbGU7IGB0cmFuc2ZlckV4YW1wbGVgCnJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gc2F0aXNmeSB0aGUgb3duZXJzaGlwL2FwcHJvdmFsIHJ1bGVzIGRlc2NyaWJlZCBhYm92ZS4KCmBgYGdvCmltcG9ydCAoCiAgICAiZ25vLmxhbmQvcC9udC9ncmM3MjEvdjAiCiAgICAiZ25vLmxhbmQvci9nbm9zd2FwL2duZnQiCikKCmZ1bmMgbWludEV4YW1wbGUoY3VyIHJlYWxtLCBvd25lciBhZGRyZXNzLCB0b2tlbklEIGdyYzcyMS5Ub2tlbklEKSBncmM3MjEuVG9rZW5JRCB7CiAgICByZXR1cm4gZ25mdC5NaW50KGNyb3NzKGN1ciksIG93bmVyLCB0b2tlbklEKQp9CgpmdW5jIG1ldGFkYXRhRXhhbXBsZSh0b2tlbklEIGdyYzcyMS5Ub2tlbklEKSAoc3RyaW5nLCBlcnJvcikgewogICAgcmV0dXJuIGduZnQuVG9rZW5VUkkodG9rZW5JRCkKfQoKZnVuYyB0cmFuc2ZlckV4YW1wbGUoY3VyIHJlYWxtLCBmcm9tLCB0byBhZGRyZXNzLCB0b2tlbklEIGdyYzcyMS5Ub2tlbklEKSBlcnJvciB7CiAgICByZXR1cm4gZ25mdC5UcmFuc2ZlckZyb20oY3Jvc3MoY3VyKSwgZnJvbSwgdG8sIHRva2VuSUQpCn0KCmZ1bmMgYnVybkV4YW1wbGUoY3VyIHJlYWxtLCB0b2tlbklEIGdyYzcyMS5Ub2tlbklEKSB7CiAgICBnbmZ0LkJ1cm4oY3Jvc3MoY3VyKSwgdG9rZW5JRCkKfQpgYGAKCiMjIFNlY3VyaXR5IGFuZCBBY2Nlc3MgQ29udHJvbAoKLSBgTWludGAsIGBTZXRUb2tlblVSSWAsIGFuZCBgQnVybmAgcmVxdWlyZSB0aGUgcG9zaXRpb24gcm9sZQotIFN0YWtlci1oZWxkIHRva2VucyBjYW4gb25seSBiZSBtb3ZlZCBieSB0aGUgc3Rha2VyIGNvbnRyYWN0Ci0gT3RoZXIgdHJhbnNmZXJzIGFyZSBjaGVja2VkIGJ5IHRoZSBvd25lci9hcHByb3ZhbCBydWxlcyBpbiB0aGUgR1JDNzIxIGxlZGdlcgotIFRva2VuIFVSSSBwYXJhbWV0ZXJzIGFyZSB2YWxpZGF0ZWQgYmVmb3JlIGdlbmVyYXRlZCBhcnR3b3JrIGlzIHJlbmRlcmVkCi0gR2VuZXJhdGVkIGFydHdvcmsgdXNlcyBwc2V1ZG8tcmFuZG9tLCB0aW1lLXNlZWRlZCBwYXJhbWV0ZXJzIGFuZCBtdXN0IG5vdCBiZQogIHRyZWF0ZWQgYXMgYSBzb3VyY2Ugb2Ygc2VjdXJlIHJhbmRvbW5lc3MKCiMjIEFyY2hpdGVjdHVyZQoKIyMjIERlcGVuZGVuY2llcwoKLSBgZ25vLmxhbmQvcC9udC9ncmM3MjEvdjBgOiBHUkM3MjEgdG9rZW4gYW5kIGxlZGdlciBpbXBsZW1lbnRhdGlvbgotIGBnbm8ubGFuZC9wL250L2dyYzcyMS9tZXRhZGF0YS92MGA6IE1ldGFkYXRhIHN0b3JhZ2UKLSBgZ25vLmxhbmQvci9nbm9zd2FwL3JiYWMvdjFgOiBBY2Nlc3MgY29udHJvbAotIGBnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxYDogUG9zaXRpb24tcm9sZSBhdXRob3JpemF0aW9uIGFuZCByb2xlIG1pcnJvcgoKIyMjIFN0YXRlIFZhcmlhYmxlcwoKLSBgdG9rZW5gOiBHUkM3MjEgdG9rZW4gbWV0YWRhdGEgYW5kIHN1cHBseSBzdGF0ZQotIGBsZWRnZXJgOiBPd25lcnNoaXAsIHRyYW5zZmVyLCBhbmQgYXBwcm92YWwgbGVkZ2VyCi0gYG1ldGFgOiBUb2tlbiBVUkkgbWV0YWRhdGEKLSBgbWV0YUxlZGdlcmA6IE1ldGFkYXRhIHVwZGF0ZSBsZWRnZXIKCkdlbmVyYXRlZCBpbWFnZSB0b2tlbnMgc3RvcmUgY29tcGFjdCBwYXJhbWV0ZXJzIGluIG1ldGFkYXRhOyB0aGUgZnVsbCBTVkcgZGF0YQpVUkkgaXMgZ2VuZXJhdGVkIHdoZW4gYFRva2VuVVJJYCBpcyBjYWxsZWQuChrjDwoKYXNzZXJ0LmdubxLUD3BhY2thZ2UgZ25mdAoKaW1wb3J0ICgKCXByYWJjICJnbm8ubGFuZC9wL2dub3N3YXAvcmJhYy92MSIKCSJnbm8ubGFuZC9wL250L2dyYzcyMS92MCIKCSJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKKQoKLy8gYXNzZXJ0SXNWYWxpZFRva2VuVVJJIHBhbmljcyBpZiB0aGUgdG9rZW4gYWxyZWFkeSBoYXMgYSBVUkkgc2V0LgpmdW5jIGFzc2VydElzVmFsaWRUb2tlblVSSSh0aWQgZ3JjNzIxLlRva2VuSUQpIHsKCXVyaSwgXyA6PSBtZXRhLlRva2VuVVJJKHRpZCkKCWlmIHVyaSAhPSAiIiB7CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoZXJyQ2Fubm90U2V0VVJJLCB1Zm10LlNwcmludGYoInRva2VuIGlkICglcykgaGFzIGFscmVhZHkgc2V0IFVSSSIsIHN0cmluZyh0aWQpKSkpCgl9Cn0KCi8vIGFzc2VydElzTm9uRW1wdHlUb2tlblVSSSBwYW5pY3MgaWYgdGhlIG5ldyBVUkkgaXMgZW1wdHkuCmZ1bmMgYXNzZXJ0SXNOb25FbXB0eVRva2VuVVJJKHRVUkkgc3RyaW5nKSB7CglpZiB0VVJJID09ICIiIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJDYW5ub3RTZXRVUkksICJlbXB0eSB0b2tlbiBVUkkiKSkKCX0KfQoKLy8gYXNzZXJ0SXNWYWxpZEFkZHJlc3MgcGFuaWNzIGlmIHRoZSBhZGRyZXNzIGlzIGludmFsaWQuCmZ1bmMgYXNzZXJ0SXNWYWxpZEFkZHJlc3MoYWRkciBhZGRyZXNzKSB7CglpZiAhYWRkci5Jc1ZhbGlkKCkgewoJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRBZGRyZXNzLCB1Zm10LlNwcmludGYoImFkZHJlc3MgKCVzKSIsIGFkZHIuU3RyaW5nKCkpKSkKCX0KfQoKLy8gYXNzZXJ0RnJvbUlzVmFsaWRBZGRyZXNzIHBhbmljcyBpZiB0aGUgZnJvbSBhZGRyZXNzIGlzIGludmFsaWQuCmZ1bmMgYXNzZXJ0RnJvbUlzVmFsaWRBZGRyZXNzKGZyb20gYWRkcmVzcykgewoJaWYgIWZyb20uSXNWYWxpZCgpIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkQWRkcmVzcywgdWZtdC5TcHJpbnRmKCJmcm9tIGFkZHJlc3MgKCVzKSIsIGZyb20uU3RyaW5nKCkpKSkKCX0KfQoKLy8gYXNzZXJ0VG9Jc1ZhbGlkQWRkcmVzcyBwYW5pY3MgaWYgdGhlIHRvIGFkZHJlc3MgaXMgaW52YWxpZC4KZnVuYyBhc3NlcnRUb0lzVmFsaWRBZGRyZXNzKHRvIGFkZHJlc3MpIHsKCWlmICF0by5Jc1ZhbGlkKCkgewoJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRBZGRyZXNzLCB1Zm10LlNwcmludGYoInRvIGFkZHJlc3MgKCVzKSIsIHRvLlN0cmluZygpKSkpCgl9Cn0KCi8vIGFzc2VydElzQWxsb3dlZFRyYW5zZmVyIGVuZm9yY2VzIHRoYXQgTkZUcyBoZWxkCi8vIGJ5IHRoZSBzdGFrZXIgKGkuZS4gY3VycmVudGx5IHN0YWtlZCkgY2FuIG9ubHkgYmUgbW92ZWQgYnkgdGhlIHN0YWtlciBpdHNlbGYuCi8vIE90aGVyIHRva2VucyBmYWxsIHRocm91Z2ggdG8gdGhlIHN0YW5kYXJkIEdSQzcyMSBvd25lci9hcHByb3ZhbCBjaGVja3MgcGVyZm9ybWVkIGluc2lkZSBsZWRnZXIuCmZ1bmMgYXNzZXJ0SXNBbGxvd2VkVHJhbnNmZXIoY2FsbGVyIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgewoJb3duZXIsIGVyciA6PSB0b2tlbi5Pd25lck9mKHRpZCkKCWlmIGVyciAhPSBuaWwgewoJCS8vIFN1cmZhY2UgdGhlIHNhbWUgbm90LWZvdW5kIGVycm9yIGFzIHRoZSBzdGFuZGFyZCB0cmFuc2ZlciBwYXRoLgoJCWNoZWNrRXJyKGVycikKCX0KCglzdGFrZXJBZGRyIDo9IGFjY2Vzcy5NdXN0R2V0QWRkcmVzcyhwcmFiYy5ST0xFX1NUQUtFUi5TdHJpbmcoKSkKCWlmIG93bmVyICE9IHN0YWtlckFkZHIgewoJCXJldHVybgoJfQoKCWlmIGNhbGxlciAhPSBzdGFrZXJBZGRyIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJyU3Rha2VkVG9rZW5Mb2NrZWQsCgkJCXVmbXQuU3ByaW50ZigidG9rZW4gKCVzKSBpcyBoZWxkIGJ5IHN0YWtlciIsIHN0cmluZyh0aWQpKSwKCQkpKQoJfQp9ChqCAwoHZG9jLmdubxL2Ai8vIFBhY2thZ2UgZ25mdCBpbXBsZW1lbnRzIHRoZSBwb3NpdGlvbi1ORlQgc3VyZmFjZSB1c2VkIGJ5IEdub1N3YXAuCi8vCi8vIEl0IHByb3ZpZGVzIEdSQzcyMS1jb21wYXRpYmxlIG93bmVyc2hpcCwgdHJhbnNmZXIsIGFwcHJvdmFsLCBhbmQgbWV0YWRhdGEKLy8gb3BlcmF0aW9ucyBmb3IgTFAgcG9zaXRpb25zLiBHZW5lcmF0ZWQgcGFyYW1ldGVyLWZvcm1hdCBVUklzIGJlY29tZSBTVkcgZGF0YQovLyBVUklzIG9uIHJlYWQ7IGN1c3RvbSBub24tZW1wdHkgVVJJcyBhcmUgcmV0dXJuZWQgdW5jaGFuZ2VkLiBFbnVtZXJhdGlvbiBhbmQKLy8gc2FmZVRyYW5zZmVyRnJvbSBhcmUgbm90IGV4cG9zZWQgYnkgdGhpcyBwYWNrYWdlLgpwYWNrYWdlIGduZnQKGoAICgplcnJvcnMuZ25vEvEHcGFja2FnZSBnbmZ0CgppbXBvcnQgKAoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpjb25zdCAoCgllcnJDYW5ub3RTZXRVUkkgICA9ICJbR05PU1dBUC1HTkZULTAwMV0gY2Fubm90IHNldCBVUkkiCgllcnJJbnZhbGlkQWRkcmVzcyA9ICJbR05PU1dBUC1HTkZULTAwMl0gaW52YWxpZCBhZGRyZXNzIgoKCS8vIFRyYW5zZmVyIGVycm9ycwoJZXJyTm90T3duZXJPckFwcHJvdmVkID0gIltHTk9TV0FQLUdORlQtMDAzXSBjYWxsZXIgaXMgbm90IHRva2VuIG93bmVyIG9yIGFwcHJvdmVkIgoJZXJyVG9rZW5Ob3RFeGlzdHMgICAgID0gIltHTk9TV0FQLUdORlQtMDA0XSB0b2tlbiBkb2VzIG5vdCBleGlzdCIKCWVyclRyYW5zZmVyVG9TZWxmICAgICA9ICJbR05PU1dBUC1HTkZULTAwNV0gY2Fubm90IHRyYW5zZmVyIHRvIHNlbGYiCgoJZXJySW52YWxpZFRva2VuUGFyYW1zICAgICAgPSAiW0dOT1NXQVAtR05GVC0wMDZdIGludmFsaWQgdG9rZW4gcGFyYW1ldGVycyIKCWVyckludmFsaWRUb2tlblBhcmFtc1JhbmdlID0gIltHTk9TV0FQLUdORlQtMDA3XSB0b2tlbiBwYXJhbWV0ZXJzIG91dCBvZiByYW5nZSIKCWVyckludmFsaWRDb2xvckZvcm1hdCAgICAgID0gIltHTk9TV0FQLUdORlQtMDA4XSBpbnZhbGlkIGNvbG9yIGZvcm1hdCIKCWVyclN0YWtlZFRva2VuTG9ja2VkICAgICAgID0gIltHTk9TV0FQLUdORlQtMDA5XSBzdGFrZWQgdG9rZW4gaXMgbG9ja2VkIgoJZXJyU3Bvb2ZlZFJlYWxtICAgICAgICAgICAgPSAiW0dOT1NXQVAtR05GVC0wMTBdIHJsbSBkb2VzIG5vdCBtYXRjaCB0aGUgY3VycmVudCBjcm9zc2luZyBmcmFtZSIKKQoKLy8gbWFrZUVycm9yV2l0aERldGFpbHMgY3JlYXRlcyBhbiBlcnJvciB3aXRoIGFkZGl0aW9uYWwgY29udGV4dC4KZnVuYyBtYWtlRXJyb3JXaXRoRGV0YWlscyhtZXNzYWdlIHN0cmluZywgZGV0YWlscyBzdHJpbmcpIGVycm9yIHsKCXJldHVybiB1Zm10LkVycm9yZigiJXMgfHwgJXMiLCBtZXNzYWdlLCBkZXRhaWxzKQp9ChqNSQoIZ25mdC5nbm8SgElwYWNrYWdlIGduZnQKCmltcG9ydCAoCgkiY2hhaW4iCgkiZXJyb3JzIgoKCSJnbm8ubGFuZC9wL250L2dyYzcyMS9tZXRhZGF0YS92MCIKCSJnbm8ubGFuZC9wL250L2dyYzcyMS92MCIKCSJnbm8ubGFuZC9wL250L3NlcWlkL3YwIgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgoKCXByYWJjICJnbm8ubGFuZC9wL2dub3N3YXAvcmJhYy92MSIKCV8gImduby5sYW5kL3IvZ25vc3dhcC9yYmFjL3YxIgopCgp2YXIgKAoJdG9rZW4gICAgICAqZ3JjNzIxLlRva2VuCglsZWRnZXIgICAgICpncmM3MjEuUHJpdmF0ZUxlZGdlcgoJbWV0YSAgICAgICAqbWV0YWRhdGEuTWV0YWRhdGEKCW1ldGFMZWRnZXIgKm1ldGFkYXRhLkxlZGdlcgopCgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7Cgl0b2tlbiwgbGVkZ2VyID0gZ3JjNzIxLk5ld1Rva2VuKCJHTk9TV0FQIE5GVCIsICJHTkZUIiwgc2VxaWQuSUQoMCksIGN1cikKCW1ldGEsIG1ldGFMZWRnZXIgPSBtZXRhZGF0YS5OZXdNZXRhZGF0YShsZWRnZXIpCn0KCi8vIE5hbWUgcmV0dXJucyB0aGUgTkZUIGNvbGxlY3Rpb24gbmFtZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG5hbWU6IGNvbGxlY3Rpb24gbmFtZQpmdW5jIE5hbWUoKSBzdHJpbmcgewoJcmV0dXJuIHRva2VuLkdldE5hbWUoKQp9CgovLyBTeW1ib2wgcmV0dXJucyB0aGUgTkZUIGNvbGxlY3Rpb24gc3ltYm9sLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3ltYm9sOiBjb2xsZWN0aW9uIHN5bWJvbApmdW5jIFN5bWJvbCgpIHN0cmluZyB7CglyZXR1cm4gdG9rZW4uR2V0U3ltYm9sKCkKfQoKLy8gVG90YWxTdXBwbHkgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIE5GVHMgbWludGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3VwcGx5OiBudW1iZXIgb2YgTkZUcyBtaW50ZWQgYnkgdGhlIGNvbGxlY3Rpb24KZnVuYyBUb3RhbFN1cHBseSgpIGludDY0IHsKCXJldHVybiB0b2tlbi5Ub3RhbFN1cHBseSgpCn0KCi8vIFRva2VuVVJJIHJldHVybnMgdGhlIG1ldGFkYXRhIFVSSSBmb3IgdGhlIHNwZWNpZmllZCB0b2tlbiBJRC4KLy8gUGFyYW1ldGVyLWZvcm1hdCB2YWx1ZXMgKHgxLHkxLHgyLHkyLGNvbG9yMSxjb2xvcjIpIGFyZSByZW5kZXJlZCBhcyBhCi8vIGJhc2U2NC1lbmNvZGVkIFNWRyBkYXRhIFVSSTsgb3RoZXIgbm9uLWVtcHR5IHN0b3JlZCBVUklzIGFyZSByZXR1cm5lZCB1bmNoYW5nZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWQ6IHRva2VuIElEIHdob3NlIG1ldGFkYXRhIFVSSSBpcyByZXF1ZXN0ZWQKLy8KLy8gUmV0dXJuczoKLy8gICAtIHVyaTogc3RvcmVkIFVSSSwgb3IgYSBnZW5lcmF0ZWQgU1ZHIGRhdGEgVVJJIGZvciBwYXJhbWV0ZXItZm9ybWF0IG1ldGFkYXRhCi8vICAgLSBlcnJvcjogbWV0YWRhdGEgbG9va3VwIGVycm9yIHdoZW4gdGlkIGhhcyBubyByZXRyaWV2YWJsZSBtZXRhZGF0YQpmdW5jIFRva2VuVVJJKHRpZCBncmM3MjEuVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpIHsKCXN0b3JlZCwgZXJyIDo9IG1ldGEuVG9rZW5VUkkodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCBlcnIKCX0KCglwYXJhbXMsIGVyciA6PSBwYXJzZUltYWdlUGFyYW1zKHN0b3JlZCkKCWlmIGVyciA9PSBuaWwgewoJCXJldHVybiBwYXJhbXMuZ2VuZXJhdGVJbWFnZVVSSSh0aWQpLCBuaWwKCX0KCglyZXR1cm4gc3RvcmVkLCBuaWwKfQoKLy8gQmFsYW5jZU9mIHJldHVybnMgdGhlIG51bWJlciBvZiBORlRzIG93bmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG93bmVyOiBhZGRyZXNzIHdob3NlIE5GVCBiYWxhbmNlIGlzIHF1ZXJpZWQKLy8KLy8gUmV0dXJuczoKLy8gICAtIGJhbGFuY2U6IG51bWJlciBvZiBORlRzIG93bmVkIGJ5IG93bmVyCi8vICAgLSBlcnJvcjogdG9rZW4tbGVkZ2VyIGJhbGFuY2UgbG9va3VwIGVycm9yOyBhbiBpbnZhbGlkIG93bmVyIGFkZHJlc3MKLy8gICAgIHBhbmljcyBiZWZvcmUgdGhlIGxvb2t1cApmdW5jIEJhbGFuY2VPZihvd25lciBhZGRyZXNzKSAoaW50NjQsIGVycm9yKSB7Cglhc3NlcnRJc1ZhbGlkQWRkcmVzcyhvd25lcikKCXJldHVybiB0b2tlbi5CYWxhbmNlT2Yob3duZXIpCn0KCi8vIE93bmVyT2YgcmV0dXJucyB0aGUgb3duZXIgYWRkcmVzcyBmb3IgdGhlIHNwZWNpZmllZCB0b2tlbiBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpZDogdG9rZW4gSUQgd2hvc2Ugb3duZXIgaXMgcmVxdWVzdGVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSBvd25lcjogY3VycmVudCBvd25lciBhZGRyZXNzCi8vICAgLSBlcnJvcjogdG9rZW4tbGVkZ2VyIGVycm9yIHdoZW4gdGlkIGRvZXMgbm90IGV4aXN0IG9yIGNhbm5vdCBiZSByZWFkCmZ1bmMgT3duZXJPZih0aWQgZ3JjNzIxLlRva2VuSUQpIChhZGRyZXNzLCBlcnJvcikgewoJcmV0dXJuIHRva2VuLk93bmVyT2YodGlkKQp9CgovLyBNdXN0T3duZXJPZiByZXR1cm5zIHRoZSBvd25lciBhZGRyZXNzIGZvciB0aGUgc3BlY2lmaWVkIHRva2VuIElELgovLyBJdCBwYW5pY3MgaWYgdGhlIHRva2VuIElEIGlzIGludmFsaWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWQ6IHRva2VuIElEIHdob3NlIG93bmVyIGlzIHJlcXVlc3RlZAovLwovLyBSZXR1cm5zOgovLyAgIC0gb3duZXI6IGN1cnJlbnQgb3duZXIgYWRkcmVzczsgcGFuaWNzIHdoZW4gdGlkIGlzIGludmFsaWQgb3IgYWJzZW50CmZ1bmMgTXVzdE93bmVyT2YodGlkIGdyYzcyMS5Ub2tlbklEKSBhZGRyZXNzIHsKCW93bmVyQWRkciwgZXJyIDo9IHRva2VuLk93bmVyT2YodGlkKQoJY2hlY2tFcnIoZXJyKQoJcmV0dXJuIG93bmVyQWRkcgp9CgovLyBTZXRUb2tlblVSSSBzZXRzIHRoZSBtZXRhZGF0YSBVUkkgZm9yIHRoZSBzcGVjaWZpZWQgdG9rZW4uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIHRpZDogdG9rZW4gSUQgd2hvc2UgbWV0YWRhdGEgVVJJIGlzIHJlcGxhY2VkCi8vICAgLSB0VVJJOiBub24tZW1wdHkgbWV0YWRhdGEgVVJJIG9yIHBhcmFtZXRlci1mb3JtYXQgaW1hZ2UgZGVzY3JpcHRpb24KLy8KLy8gUmV0dXJuczoKLy8gICAtIHVwZGF0ZWQ6IHRydWUgYWZ0ZXIgdGhlIFVSSSBpcyBzdG9yZWQgYW5kIHJlLXJlYWQgc3VjY2Vzc2Z1bGx5Ci8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3M7IHZhbGlkYXRpb24gYW5kIHN0b3JhZ2UgZmFpbHVyZXMgcGFuaWMgYmVmb3JlIGEKLy8gICAgIG5vbi1uaWwgZXJyb3IgY2FuIGJlIHJldHVybmVkCi8vCi8vIE9ubHkgY2FsbGFibGUgYnkgcG9zaXRpb24gY29udHJhY3QuCmZ1bmMgU2V0VG9rZW5VUkkoY3VyIHJlYWxtLCB0aWQgZ3JjNzIxLlRva2VuSUQsIHRVUkkgc3RyaW5nKSAoYm9vbCwgZXJyb3IpIHsKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFjY2Vzcy5Bc3NlcnRJc1Bvc2l0aW9uKGNhbGxlcikKCglhc3NlcnRJc05vbkVtcHR5VG9rZW5VUkkodFVSSSkKCWFzc2VydElzVmFsaWRUb2tlblVSSSh0aWQpCgoJY2hlY2tFcnIoc2V0VG9rZW5VUkkoMCwgY3VyLCB0aWQsIHRVUkkpKQoKCXJldHVybiB0cnVlLCBuaWwKfQoKLy8gVHJhbnNmZXJGcm9tIHRyYW5zZmVycyBhIHRva2VuIGZyb20gb25lIGFkZHJlc3MgdG8gYW5vdGhlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gZnJvbTogY3VycmVudCBvd25lciBhZGRyZXNzCi8vICAgLSB0bzogcmVjaXBpZW50IGFkZHJlc3MKLy8gICAtIHRpZDogdG9rZW4gSUQgdG8gdHJhbnNmZXIKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgYWZ0ZXIgYSBzdWNjZXNzZnVsIHRyYW5zZmVyOyBpbnZhbGlkIGFkZHJlc3NlcywgYXV0aG9yaXphdGlvbiwKLy8gICAgIG93bmVyc2hpcCwgb3IgbGVkZ2VyIGZhaWx1cmVzIHBhbmljIHRocm91Z2ggY2hlY2tUcmFuc2ZlckVycgovLwovLyBQZXJtaXNzaW9uIG1vZGVsOgovLyAgIC0gVG9rZW5zIGhlbGQgYnkgdGhlIHN0YWtlciBjb250cmFjdCAoaS5lLiBjdXJyZW50bHkgc3Rha2VkKSBjYW4gb25seSBiZQovLyAgICAgbW92ZWQgYnkgdGhlIHN0YWtlciBpdHNlbGY7IHRoZSB1bmRlcmx5aW5nIHN0YWtlZCBMUCBwb3NpdGlvbiBpcwovLyAgICAgbm9uLXRyYW5zZmVyYWJsZS4KLy8gICAtIE90aGVyd2lzZSwgb3duZXJzaGlwIGFuZCBhcHByb3ZhbCBhcmUgZW5mb3JjZWQgYnkgdGhlIEdSQzcyMSBsYXllcgovLyAgICAgKG93bmVyIC8gYXBwcm92ZWQtZm9yLXRva2VuIC8gYXBwcm92ZWQtZm9yLWFsbCkuCmZ1bmMgVHJhbnNmZXJGcm9tKGN1ciByZWFsbSwgZnJvbSwgdG8gYWRkcmVzcywgdGlkIGdyYzcyMS5Ub2tlbklEKSBlcnJvciB7Cglhc3NlcnRGcm9tSXNWYWxpZEFkZHJlc3MoZnJvbSkKCWFzc2VydFRvSXNWYWxpZEFkZHJlc3ModG8pCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglhc3NlcnRJc0FsbG93ZWRUcmFuc2ZlcihjYWxsZXIsIHRpZCkKCgllcnIgOj0gbGVkZ2VyLlRyYW5zZmVyRnJvbShjYWxsZXIsIGZyb20sIHRvLCB0aWQpCgljaGVja1RyYW5zZmVyRXJyKGVyciwgY2FsbGVyLCBmcm9tLCB0bywgdGlkKQoJcmV0dXJuIG5pbAp9CgovLyBBcHByb3ZlIGdyYW50cyBwZXJtaXNzaW9uIHRvIHRyYW5zZmVyIGEgc3BlY2lmaWMgdG9rZW4gSUQgdG8gYW5vdGhlciBhZGRyZXNzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBhcHByb3ZlZDogYWRkcmVzcyB0byBhcHByb3ZlCi8vICAgLSB0aWQ6IHRva2VuIElEIHRvIGFwcHJvdmUgZm9yIHRyYW5zZmVyCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogbmlsIGFmdGVyIGFwcHJvdmFsIGlzIHN0b3JlZDsgaW52YWxpZCBhZGRyZXNzZXMsIG93bmVyc2hpcCwgb3IKLy8gICAgIGxlZGdlciBmYWlsdXJlcyBwYW5pYyB0aHJvdWdoIGNoZWNrQXBwcm92ZUVycgpmdW5jIEFwcHJvdmUoY3VyIHJlYWxtLCBhcHByb3ZlZCBhZGRyZXNzLCB0aWQgZ3JjNzIxLlRva2VuSUQpIGVycm9yIHsKCWFzc2VydElzVmFsaWRBZGRyZXNzKGFwcHJvdmVkKQoKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWVyciA6PSBsZWRnZXIuQXBwcm92ZShjYWxsZXIsIGFwcHJvdmVkLCB0aWQpCgljaGVja0FwcHJvdmVFcnIoZXJyLCBjYWxsZXIsIGFwcHJvdmVkLCB0aWQpCglyZXR1cm4gbmlsCn0KCi8vIFNldEFwcHJvdmFsRm9yQWxsIGVuYWJsZXMvZGlzYWJsZXMgb3BlcmF0b3IgYXBwcm92YWwgZm9yIGFsbCB0b2tlbnMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIG9wZXJhdG9yOiBhZGRyZXNzIHRvIHNldCBhcHByb3ZhbCBmb3IKLy8gICAtIGFwcHJvdmVkOiB0cnVlIHRvIGFwcHJvdmUsIGZhbHNlIHRvIHJldm9rZQovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IG5pbCBhZnRlciB0aGUgb3BlcmF0b3IgYXBwcm92YWwgaXMgc3RvcmVkOyBsZWRnZXIgZmFpbHVyZXMgcGFuaWMKLy8gICAgIGJlZm9yZSBhIG5vbi1uaWwgZXJyb3IgY2FuIGJlIHJldHVybmVkCmZ1bmMgU2V0QXBwcm92YWxGb3JBbGwoY3VyIHJlYWxtLCBvcGVyYXRvciBhZGRyZXNzLCBhcHByb3ZlZCBib29sKSBlcnJvciB7Cglhc3NlcnRJc1ZhbGlkQWRkcmVzcyhvcGVyYXRvcikKCgljaGVja0VycihsZWRnZXIuU2V0QXBwcm92YWxGb3JBbGwoY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLCBvcGVyYXRvciwgYXBwcm92ZWQpKQoJcmV0dXJuIG5pbAp9CgovLyBHZXRBcHByb3ZlZCByZXR1cm5zIGFwcHJvdmVkIGFkZHJlc3MgZm9yIHRva2VuIElELgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGlkOiB0b2tlbiBJRCB3aG9zZSBwZXItdG9rZW4gYXBwcm92YWwgaXMgcmVxdWVzdGVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhcHByb3ZlZDogYWRkcmVzcyBhcHByb3ZlZCBmb3IgdGlkCi8vICAgLSBlcnJvcjogdG9rZW4tbGVkZ2VyIGVycm9yIGlmIHRpZCBkb2VzIG5vdCBleGlzdCBvciBhcHByb3ZhbCBjYW5ub3QgYmUgcmVhZApmdW5jIEdldEFwcHJvdmVkKHRpZCBncmM3MjEuVG9rZW5JRCkgKGFkZHJlc3MsIGVycm9yKSB7CglyZXR1cm4gdG9rZW4uR2V0QXBwcm92ZWQodGlkKQp9CgovLyBJc0FwcHJvdmVkRm9yQWxsIGNoZWNrcyBpZiBvcGVyYXRvciBjYW4gbWFuYWdlIGFsbCBvd25lcidzIHRva2Vucy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG93bmVyOiB0b2tlbiBvd25lciBhZGRyZXNzCi8vICAgLSBvcGVyYXRvcjogb3BlcmF0b3IgYWRkcmVzcyB0byBjaGVjawovLwovLyBSZXR1cm5zOgovLyAgIC0gYXBwcm92ZWQ6IHRydWUgd2hlbiBvcGVyYXRvciBpcyBhcHByb3ZlZCBmb3IgZXZlcnkgdG9rZW4gb3duZWQgYnkgb3duZXIKZnVuYyBJc0FwcHJvdmVkRm9yQWxsKG93bmVyLCBvcGVyYXRvciBhZGRyZXNzKSBib29sIHsKCXJldHVybiB0b2tlbi5Jc0FwcHJvdmVkRm9yQWxsKG93bmVyLCBvcGVyYXRvcikKfQoKLy8gTWludCBjcmVhdGVzIG5ldyBORlQgYW5kIHRyYW5zZmVycyBpdCB0byB0by4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gdG86IHJlY2lwaWVudCBhZGRyZXNzCi8vICAgLSB0aWQ6IHRva2VuIElEIHRvIG1pbnQKLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2VuSUQ6IG1pbnRlZCB0b2tlbiBJRAovLwovLyBPbmx5IGNhbGxhYmxlIGJ5IHBvc2l0aW9uIGNvbnRyYWN0LgpmdW5jIE1pbnQoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCB0aWQgZ3JjNzIxLlRva2VuSUQpIGdyYzcyMS5Ub2tlbklEIHsKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFjY2Vzcy5Bc3NlcnRJc1Bvc2l0aW9uKGNhbGxlcikKCglwb3NpdGlvbkFkZHIgOj0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYWJjLlJPTEVfUE9TSVRJT04uU3RyaW5nKCkpCgljaGVja0VycihsZWRnZXIuTWludChwb3NpdGlvbkFkZHIsIHRpZCkpCgoJLy8gU3RvcmUgb25seSB0aGUgZ3JhZGllbnQgcGFyYW1ldGVycyBpbnN0ZWFkIG9mIGZ1bGwgYmFzZTY0IFNWRyB0byByZWR1Y2Ugc3RvcmFnZSBjb3N0cy4KCS8vIFBhcmFtZXRlcnMgYXJlIGNvbnZlcnRlZCB0byBmdWxsIFNWRyBvbiByZWFkIHZpYSBUb2tlblVSSSgpLgoJaW1hZ2VQYXJhbXMgOj0gZ2VuSW1hZ2VQYXJhbXNTdHJpbmcoZ2VuZXJhdGVSYW5kSW5zdGFuY2UoKSkKCWNoZWNrRXJyKHNldFRva2VuVVJJKDAsIGN1ciwgdGlkLCBpbWFnZVBhcmFtcykpCgoJY2hlY2tFcnIobGVkZ2VyLlRyYW5zZmVyRnJvbShwb3NpdGlvbkFkZHIsIHBvc2l0aW9uQWRkciwgdG8sIHRpZCkpCgoJcmV0dXJuIHRpZAp9CgovLyBFeGlzdHMgY2hlY2tzIGlmIHRva2VuIElEIGV4aXN0cy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpZDogdG9rZW4gSUQgdG8gY2hlY2sKLy8KLy8gUmV0dXJuczoKLy8gICAtIGV4aXN0czogdHJ1ZSB3aGVuIHRoZSBsZWRnZXIgY2FuIHJlc29sdmUgYW4gb3duZXIgZm9yIHRpZDsgZmFsc2Ugb3RoZXJ3aXNlCmZ1bmMgRXhpc3RzKHRpZCBncmM3MjEuVG9rZW5JRCkgYm9vbCB7CglfLCBlcnIgOj0gdG9rZW4uT3duZXJPZih0aWQpCglyZXR1cm4gZXJyID09IG5pbAp9CgovLyBCdXJuIHJlbW92ZXMgYSBzcGVjaWZpYyB0b2tlbiBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gdGlkOiB0b2tlbiBJRCB0byBidXJuCi8vCi8vIE9ubHkgY2FsbGFibGUgYnkgcG9zaXRpb24uCmZ1bmMgQnVybihjdXIgcmVhbG0sIHRpZCBncmM3MjEuVG9rZW5JRCkgewoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYWNjZXNzLkFzc2VydElzUG9zaXRpb24oY2FsbGVyKQoKCWNoZWNrRXJyKGxlZGdlci5CdXJuKHRpZCkpCn0KCi8vIFJlbmRlciByZXR1cm5zIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBORlQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwYXRoOiByZW5kZXIgcGF0aDsgdGhlIGVtcHR5IHBhdGggc2VsZWN0cyB0aGUgY29sbGVjdGlvbiBob21lIHBhZ2UKLy8KLy8gUmV0dXJuczoKLy8gICAtIGh0bWw6IGNvbGxlY3Rpb24gSFRNTCBmb3IgdGhlIGhvbWUgcGF0aCwgb3IgIjQwNFxuIiBmb3IgdW5zdXBwb3J0ZWQgcGF0aHMKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBwYXRoID09ICIiIHsKCQlyZXR1cm4gdG9rZW4uUmVuZGVySG9tZSgpCgl9CglyZXR1cm4gIjQwNFxuIgp9CgovLyBzZXRUb2tlblVSSSBzZXRzIHRoZSBtZXRhZGF0YSBVUkkgZm9yIGEgc3BlY2lmaWMgdG9rZW4gSUQuCmZ1bmMgc2V0VG9rZW5VUkkoXyBpbnQsIHJsbSByZWFsbSwgdGlkIGdyYzcyMS5Ub2tlbklELCB0VVJJIHN0cmluZykgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoZXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXByZXZpb3VzUmVhbG0gOj0gcmxtLlByZXZpb3VzKCkKCXByZXZpb3VzQWRkciA6PSBwcmV2aW91c1JlYWxtLkFkZHJlc3MoKQoKCWVyciA6PSBtZXRhTGVkZ2VyLlNldFRva2VuVVJJKHRpZCwgdFVSSSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnIuRXJyb3IoKSwgdWZtdC5TcHJpbnRmKCJ0b2tlbiBpZCAoJXMpIiwgdGlkKSkKCX0KCXRva2VuVVJJLCBlcnIgOj0gVG9rZW5VUkkodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyci5FcnJvcigpLCB1Zm10LlNwcmludGYoInRva2VuIGlkICglcykiLCB0aWQpKQoJfQoKCWNoYWluLkVtaXQoCgkJIlNldFRva2VuVVJJIiwKCQkicHJldkFkZHIiLCBwcmV2aW91c0FkZHIuU3RyaW5nKCksCgkJInByZXZSZWFsbSIsIHByZXZpb3VzUmVhbG0uUGtnUGF0aCgpLAoJCSJ0b2tlbklkIiwgc3RyaW5nKHRpZCksCgkJInRva2VuVVJJIiwgdG9rZW5VUkksCgkpCgoJcmV0dXJuIG5pbAp9Cho+Cgtnbm9tb2QudG9tbBIvbW9kdWxlID0gImduby5sYW5kL3IvZ25vc3dhcC9nbmZ0Igpnbm8gPSAiMC45IgoakTgKEXN2Z19nZW5lcmF0b3IuZ25vEvs3cGFja2FnZSBnbmZ0CgppbXBvcnQgKAoJYjY0ICJlbmNvZGluZy9iYXNlNjQiCgkiZXJyb3JzIgoJIm1hdGgvcmFuZCIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvbnQvZ3JjNzIxL3YwIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgovLyBNVVNUIEJFIElNTVVUQUJMRSwgRE8gTk9UIE1PRElGWS4KLy8gU1ZHIHRlbXBsYXRlIHN0cnVjdHVyZToKLy8gVGhlIHRlbXBsYXRlIGlzIHNwbGl0IGF0IHZhcmlhYmxlIGluc2VydGlvbiBwb2ludHMgZm9yIGVmZmljaWVudCBzdHJpbmcgY29uY2F0ZW5hdGlvbi4KLy8gRnVsbCB0ZW1wbGF0ZSB3aXRoIHBsYWNlaG9sZGVycyAoZm9yIHJlZmVyZW5jZSk6Ci8vCi8vCTxzdmcgd2lkdGg9IjEzNSIgaGVpZ2h0PSIxMzUiIHZpZXdCb3g9IjAgMCAxMzUgMTM1IiBmaWxsPSJub25lIiB4bWxucz0iLi4uIj4KLy8JICA8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfNzY5OF81Njg0NikiPgovLwkgICAgPGNpcmNsZSBjeD0iNjcuNSIgY3k9IjY3LjUiIHI9IjY3LjUiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl83Njk4XzU2ODQ2KSIvPgovLwkgICAgLi4uIChwYXRoIGVsZW1lbnRzKSAuLi4KLy8JICA8L2c+Ci8vCSAgPGRlZnM+Ci8vCSAgICA8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfNzY5OF81Njg0NiIKLy8JICAgICAgeDE9Int4MX0iIHkxPSJ7eTF9IiB4Mj0ie3gyfSIgeTI9Int5Mn0iICAgPC0tIHZhcmlhYmxlcwovLwkgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+Ci8vCSAgICAgIDxzdG9wIHN0b3AtY29sb3I9Intjb2xvcjF9Ii8+ICAgICAgICAgICAgIDwtLSB2YXJpYWJsZQovLwkgICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9Intjb2xvcjJ9Ii8+ICA8LS0gdmFyaWFibGUKLy8JICAgIDwvbGluZWFyR3JhZGllbnQ+Ci8vCSAgICAuLi4KLy8JICA8L2RlZnM+Ci8vCTwvc3ZnPgoKLy8gc3ZnVGVtcGxhdGUgaG9sZHMgcHJlLXNwbGl0IHRlbXBsYXRlIHBhcnRzIGZvciBlZmZpY2llbnQgY29uY2F0ZW5hdGlvbi4KLy8gVXNhZ2U6IHN2Z1RlbXBsYXRlWzBdICsgY2xpcElEICsgc3ZnVGVtcGxhdGVbMV0gKyBwYWludElEICsgLi4uICsgY29sb3IyICsgc3ZnVGVtcGxhdGVbMTBdCnZhciBzdmdUZW1wbGF0ZSA9IFsxMV1zdHJpbmd7CgkvLyBbMF0gU1ZHIGhlYWRlciBhbmQgYm9keSAoYmVmb3JlIGNsaXAtcGF0aCBpZCkKCWA8c3ZnIHdpZHRoPSIxMzUiIGhlaWdodD0iMTM1IiB2aWV3Qm94PSIwIDAgMTM1IDEzNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2AsCgkvLyBbMV0gYmV0d2VlbiBjbGlwLXBhdGggaWQgYW5kIGZpbGwgaWQKCWApIj4KPGNpcmNsZSBjeD0iNjcuNSIgY3k9IjY3LjUiIHI9IjY3LjUiIGZpbGw9InVybCgjYCwKCS8vIFsyXSBiZXR3ZWVuIGZpbGwgaWQgYW5kIGdyYWRpZW50IGlkCglgKSIvPgo8cGF0aCBkPSJNNTEuMjkwNSA0Mi45NDQ5TDY2LjQ4OTUgMzNMOTcgNTIuODA2MUw4MS44MjQxIDYyLjc0MjVMNTEuMjkwNSA0Mi45NDQ5WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTUxLjYwNTUgNjcuNTA1OUw2Ni44MDQ0IDU3LjU2MUw5NyA3Ny4wNjU3TDgyLjEwNDYgODcuMTc5M0w1MS42MDU1IDY3LjUwNTlaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTM2LjA0NjQgODEuNzU1OUw1MS4yOTA1IDcxLjgxMUw4MS43MzM2IDkxLjY1NDdMNjYuNDg5NSAxMDEuNTA4TDM2LjA0NjQgODEuNzU1OVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNMzYuMDAxIDUyLjgwNTVMNTEuMjg4NCA0Mi45MTc3TDUxLjI4ODQgNzEuODE0NUwzNi4wMDEgODEuNzc5TDM2LjAwMSA1Mi44MDU1WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTgyLjEwNTEgODcuMTc5N0w5Ny4wMDE2IDc3LjA2NjJMOTcuMDAxNiA4MS43MDI5TDgxLjc4OTYgOTEuNjI5TDgyLjEwNTEgODcuMTc5N1oiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8L2c+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9ImAsCgkvLyBbM10gYmV0d2VlbiBncmFkaWVudCBpZCBhbmQgeDEKCWAiIHgxPSJgLAoJLy8gWzRdIGJldHdlZW4geDEgYW5kIHkxCglgIiB5MT0iYCwKCS8vIFs1XSBiZXR3ZWVuIHkxIGFuZCB4MgoJYCIgeDI9ImAsCgkvLyBbNl0gYmV0d2VlbiB4MiBhbmQgeTIKCWAiIHkyPSJgLAoJLy8gWzddIGJldHdlZW4geTIgYW5kIGNvbG9yMQoJYCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJgLAoJLy8gWzhdIGJldHdlZW4gY29sb3IxIGFuZCBjb2xvcjIKCWAiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSJgLAoJLy8gWzldIGJldHdlZW4gY29sb3IyIGFuZCBjbGlwUGF0aCBpZAoJYCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImAsCgkvLyBbMTBdIFNWRyBmb290ZXIgKGFmdGVyIGNsaXBQYXRoIGlkKQoJYCI+CjxyZWN0IHdpZHRoPSIxMzUiIGhlaWdodD0iMTM1IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgpgLAp9CgovLyBjaGFyc2V0IGNvbnRhaW5zIHZhbGlkIGhleCBkaWdpdHMgZm9yIGNvbG9yIGdlbmVyYXRpb24uCmNvbnN0IGNoYXJzZXQgPSAiMDEyMzQ1Njc4OUFCQ0RFRiIKCi8vIFBhcmFtZXRlciByYW5nZSBjb25zdGFudHMgZm9yIGdyYWRpZW50IGNvb3JkaW5hdGVzLgpjb25zdCAoCgl4MU1pbiA9IDcKCXgxTWF4ID0gMTMKCXkxTWluID0gNwoJeTFNYXggPSAxMwoJeDJNaW4gPSAxMjEKCXgyTWF4ID0gMTI2Cgl5Mk1pbiA9IDEyMQoJeTJNYXggPSAxMjYKCgl4MVJhbmdlID0geDFNYXggLSB4MU1pbiArIDEKCXkxUmFuZ2UgPSB5MU1heCAtIHkxTWluICsgMQoJeDJSYW5nZSA9IHgyTWF4IC0geDJNaW4gKyAxCgl5MlJhbmdlID0geTJNYXggLSB5Mk1pbiArIDEKKQoKLy8gZ2VuSW1hZ2VQYXJhbXNTdHJpbmcgZ2VuZXJhdGVzIHJhbmRvbSBncmFkaWVudCBwYXJhbWV0ZXJzIGFuZCByZXR1cm5zIHRoZW0gYXMgYSBjb21wYWN0IHN0cmluZy4KLy8gRm9ybWF0OiAieDEseTEseDIseTIsY29sb3IxLGNvbG9yMiIgKGUuZy4sICIxMCwxMiwxMjUsMTIzLCNBQUJCQ0MsI0RERUVGRiIpCmZ1bmMgZ2VuSW1hZ2VQYXJhbXNTdHJpbmcociAqcmFuZC5SYW5kKSBzdHJpbmcgewoJeDEgOj0geDFNaW4gKyByLlVpbnQ2NE4oeDFSYW5nZSkKCXkxIDo9IHkxTWluICsgci5VaW50NjROKHkxUmFuZ2UpCgl4MiA6PSB4Mk1pbiArIHIuVWludDY0Tih4MlJhbmdlKQoJeTIgOj0geTJNaW4gKyByLlVpbnQ2NE4oeTJSYW5nZSkKCgl2YXIgYnVmMSBbN11ieXRlCgl2YXIgYnVmMiBbN11ieXRlCglidWYxWzBdID0gJyMnCglidWYyWzBdID0gJyMnCglmb3IgaSA6PSAxOyBpIDwgNzsgaSsrIHsKCQlidWYxW2ldID0gY2hhcnNldFtyLkludE4oMTYpXQoJCWJ1ZjJbaV0gPSBjaGFyc2V0W3IuSW50TigxNildCgl9Cgljb2xvcjEgOj0gc3RyaW5nKGJ1ZjFbOl0pCgljb2xvcjIgOj0gc3RyaW5nKGJ1ZjJbOl0pCgoJcmV0dXJuIHN0cmNvbnYuSXRvYShpbnQoeDEpKSArICIsIiArIHN0cmNvbnYuSXRvYShpbnQoeTEpKSArICIsIiArCgkJc3RyY29udi5JdG9hKGludCh4MikpICsgIiwiICsgc3RyY29udi5JdG9hKGludCh5MikpICsgIiwiICsKCQljb2xvcjEgKyAiLCIgKyBjb2xvcjIKfQoKLy8gSW1hZ2VQYXJhbXMgaG9sZHMgcGFyc2VkIGFuZCB2YWxpZGF0ZWQgaW1hZ2UgcGFyYW1ldGVycy4KdHlwZSBJbWFnZVBhcmFtcyBzdHJ1Y3QgewoJeDEsIHkxLCB4MiwgeTIgaW50Cgljb2xvcjEsIGNvbG9yMiBzdHJpbmcKfQoKLy8gdmFsaWRhdGVDb29yZGluYXRlIGNoZWNrcyBpZiBhIGNvb3JkaW5hdGUgdmFsdWUgaXMgd2l0aGluIHZhbGlkIHJhbmdlLgovLyBSZXR1cm5zIGVycm9yIHdpdGggZGV0YWlscyBhYm91dCB3aGljaCBjb29yZGluYXRlIGZhaWxlZCBpZiBvdXQgb2YgcmFuZ2UuCmZ1bmMgdmFsaWRhdGVDb29yZGluYXRlKHZhbHVlIGludCwgbWluIGludCwgbWF4IGludCwgbmFtZSBzdHJpbmcpIGVycm9yIHsKCWlmIHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4IHsKCQlkZXRhaWxzIDo9IHVmbXQuU3ByaW50ZigiJXM9JWQgKGV4cGVjdGVkIHJhbmdlOiBbJWQsICVkXSkiLCBuYW1lLCB2YWx1ZSwgbWluLCBtYXgpCgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRUb2tlblBhcmFtc1JhbmdlLCBkZXRhaWxzKQoJfQoJcmV0dXJuIG5pbAp9CgovLyBwYXJzZUltYWdlUGFyYW1zIHBhcnNlcyBhbmQgdmFsaWRhdGVzIHBhcmFtZXRlcnMgaW4gb25lIHN0ZXAuCi8vIFJldHVybnMgcGFyc2VkIEltYWdlUGFyYW1zIHBvaW50ZXIgb3IgZXJyb3IuCi8vIFJldHVybnMgbmlsIG9uIGVycm9yIHRvIGF2b2lkIGFsbG9jYXRpbmcgemVyby12YWx1ZSBzdHJ1Y3QuCi8vIEV4cGVjdGVkIGZvcm1hdDogIngxLHkxLHgyLHkyLGNvbG9yMSxjb2xvcjIiCmZ1bmMgcGFyc2VJbWFnZVBhcmFtcyhzIHN0cmluZykgKCpJbWFnZVBhcmFtcywgZXJyb3IpIHsKCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQocywgIiwiKQoJaWYgbGVuKHBhcnRzKSAhPSA2IHsKCQlyZXR1cm4gbmlsLCBlcnJvcnMuTmV3KGVyckludmFsaWRUb2tlblBhcmFtcykKCX0KCgl4MSwgZXJyIDo9IHN0cmNvbnYuQXRvaShwYXJ0c1swXSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycm9ycy5OZXcoZXJySW52YWxpZFRva2VuUGFyYW1zKQoJfQoKCXkxLCBlcnIgOj0gc3RyY29udi5BdG9pKHBhcnRzWzFdKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldyhlcnJJbnZhbGlkVG9rZW5QYXJhbXMpCgl9CgoJeDIsIGVyciA6PSBzdHJjb252LkF0b2kocGFydHNbMl0pCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnJvcnMuTmV3KGVyckludmFsaWRUb2tlblBhcmFtcykKCX0KCgl5MiwgZXJyIDo9IHN0cmNvbnYuQXRvaShwYXJ0c1szXSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycm9ycy5OZXcoZXJySW52YWxpZFRva2VuUGFyYW1zKQoJfQoKCS8vIFZhbGlkYXRlIGNvb3JkaW5hdGUgcmFuZ2VzIHdpdGggZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMKCWlmIGVyciA6PSB2YWxpZGF0ZUNvb3JkaW5hdGUoeDEsIHgxTWluLCB4MU1heCwgIngxIik7IGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJaWYgZXJyIDo9IHZhbGlkYXRlQ29vcmRpbmF0ZSh5MSwgeTFNaW4sIHkxTWF4LCAieTEiKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CglpZiBlcnIgOj0gdmFsaWRhdGVDb29yZGluYXRlKHgyLCB4Mk1pbiwgeDJNYXgsICJ4MiIpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCWlmIGVyciA6PSB2YWxpZGF0ZUNvb3JkaW5hdGUoeTIsIHkyTWluLCB5Mk1heCwgInkyIik7IGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCWNvbG9yMSA6PSBwYXJ0c1s0XQoJY29sb3IyIDo9IHBhcnRzWzVdCgoJLy8gVmFsaWRhdGUgY29sb3IgZm9ybWF0ICgjWFhYWFhYKQoJaWYgIWlzVmFsaWRIZXhDb2xvcihjb2xvcjEpIHx8ICFpc1ZhbGlkSGV4Q29sb3IoY29sb3IyKSB7CgkJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldyhlcnJJbnZhbGlkQ29sb3JGb3JtYXQpCgl9CgoJcmV0dXJuICZJbWFnZVBhcmFtc3sKCQl4MTogICAgIHgxLAoJCXkxOiAgICAgeTEsCgkJeDI6ICAgICB4MiwKCQl5MjogICAgIHkyLAoJCWNvbG9yMTogY29sb3IxLAoJCWNvbG9yMjogY29sb3IyLAoJfSwgbmlsCn0KCi8vIGdlbmVyYXRlSW1hZ2VVUkkgY29udmVydHMgcGFyc2VkIGltYWdlIHBhcmFtZXRlcnMgdG8gYSBiYXNlNjQtZW5jb2RlZCBTVkcgaW1hZ2UgVVJJLgpmdW5jIChwYXJhbXMgSW1hZ2VQYXJhbXMpIGdlbmVyYXRlSW1hZ2VVUkkodGlkIGdyYzcyMS5Ub2tlbklEKSBzdHJpbmcgewoJc3ZnIDo9IHBhcmFtcy5nZW5lcmF0ZVNWRyh0aWQpCglzRW5jIDo9IGI2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUoc3ZnKSkKCglyZXR1cm4gImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsIiArIHNFbmMKfQoKLy8gZ2VuZXJhdGVTVkcgZ2VuZXJhdGVzIFNWRyBpbWFnZSBmcm9tIHBhcnNlZCBhbmQgdmFsaWRhdGVkIHBhcmFtZXRlcnMuCmZ1bmMgKHBhcmFtcyBJbWFnZVBhcmFtcykgZ2VuZXJhdGVTVkcodGlkIGdyYzcyMS5Ub2tlbklEKSBzdHJpbmcgewoJc3VmZml4IDo9IHN2Z0lEU3VmZml4KHRpZCkKCXBhaW50SUQgOj0gInBhaW50MF9saW5lYXJfIiArIHN1ZmZpeAoJY2xpcElEIDo9ICJjbGlwMF8iICsgc3VmZml4CglyZXR1cm4gc3ZnVGVtcGxhdGVbMF0gKyBjbGlwSUQgKyBzdmdUZW1wbGF0ZVsxXSArIHBhaW50SUQgKyBzdmdUZW1wbGF0ZVsyXSArIHBhaW50SUQgKwoJCXN2Z1RlbXBsYXRlWzNdICsgc3RyY29udi5JdG9hKHBhcmFtcy54MSkgKyBzdmdUZW1wbGF0ZVs0XSArIHN0cmNvbnYuSXRvYShwYXJhbXMueTEpICsKCQlzdmdUZW1wbGF0ZVs1XSArIHN0cmNvbnYuSXRvYShwYXJhbXMueDIpICsgc3ZnVGVtcGxhdGVbNl0gKyBzdHJjb252Lkl0b2EocGFyYW1zLnkyKSArCgkJc3ZnVGVtcGxhdGVbN10gKyBwYXJhbXMuY29sb3IxICsgc3ZnVGVtcGxhdGVbOF0gKyBwYXJhbXMuY29sb3IyICsgc3ZnVGVtcGxhdGVbOV0gKwoJCWNsaXBJRCArIHN2Z1RlbXBsYXRlWzEwXQp9CgpmdW5jIHN2Z0lEU3VmZml4KHRpZCBncmM3MjEuVG9rZW5JRCkgc3RyaW5nIHsKCXJldHVybiAiZ25mdF8iICsgc3RyaW5nKHRpZCkKfQoKLy8gaXNWYWxpZEhleENvbG9yIGNoZWNrcyBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIGhleCBjb2xvciBpbiAjWFhYWFhYIGZvcm1hdC4KZnVuYyBpc1ZhbGlkSGV4Q29sb3IoY29sb3Igc3RyaW5nKSBib29sIHsKCWlmIGxlbihjb2xvcikgIT0gNyB8fCBjb2xvclswXSAhPSAnIycgewoJCXJldHVybiBmYWxzZQoJfQoKCWZvciBpIDo9IDE7IGkgPCA3OyBpKysgewoJCWMgOj0gY29sb3JbaV0KCgkJaXNIZXggOj0gKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnRicpIHx8IChjID49ICdhJyAmJiBjIDw9ICdmJykKCQlpZiAhaXNIZXggewoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CgoJcmV0dXJuIHRydWUKfQoajBYKCXV0aWxzLmdubxL+FXBhY2thZ2UgZ25mdAoKaW1wb3J0ICgKCSJlcnJvcnMiCgkibWF0aC9yYW5kIgoJInRpbWUiCgoJImduby5sYW5kL3AvbnQvZ3JjNzIxL3YwIgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKLy8gZ2VuZXJhdGVSYW5kSW5zdGFuY2UgZ2VuZXJhdGVzIGEgbmV3IHJhbmRvbSBpbnN0YW5jZS4KZnVuYyBnZW5lcmF0ZVJhbmRJbnN0YW5jZSgpICpyYW5kLlJhbmQgewoJbm93IDo9IHRpbWUuTm93KCkKCXNlZWQxIDo9IG5vdy5Vbml4KCkgKyBUb3RhbFN1cHBseSgpCglzZWVkMiA6PSBub3cuVW5peE5hbm8oKSArIFRvdGFsU3VwcGx5KCkKCXBjZyA6PSByYW5kLk5ld1BDRyh1aW50NjQoc2VlZDEpLCB1aW50NjQoc2VlZDIpKQoJcmV0dXJuIHJhbmQuTmV3KHBjZykKfQoKLy8gY2hlY2tFcnIgcGFuaWNzIGlmIGFuIGVycm9yIG9jY3Vycy4KZnVuYyBjaGVja0VycihlcnIgZXJyb3IpIHsKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfQp9CgovLyBjaGVja1RyYW5zZmVyRXJyIHdyYXBzIHRyYW5zZmVyIGVycm9ycyB3aXRoIG1vcmUgc3BlY2lmaWMgY29udGV4dC4KZnVuYyBjaGVja1RyYW5zZmVyRXJyKGVyciBlcnJvciwgY2FsbGVyLCBmcm9tLCB0byBhZGRyZXNzLCB0aWQgZ3JjNzIxLlRva2VuSUQpIHsKCWlmIGVyciA9PSBuaWwgewoJCXJldHVybgoJfQoKCS8vIENoZWNrIGlmIHRva2VuIGV4aXN0cwoJb3duZXIsIG93bmVyRXJyIDo9IHRva2VuLk93bmVyT2YodGlkKQoJaWYgb3duZXJFcnIgIT0gbmlsIHsKCQlwYW5pYyhvd25lckVycikKCX0KCglzd2l0Y2ggZXJyIHsKCWNhc2UgZ3JjNzIxLkVyckNhbGxlcklzTm90T3duZXJPckFwcHJvdmVkOgoJCS8vIENoZWNrIGlmIGNhbGxlciBpcyB0aGUgb3duZXIKCQlpZiBjYWxsZXIgPT0gb3duZXIgewoJCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscyhncmM3MjEuRXJyVHJhbnNmZXJGcm9tSW5jb3JyZWN0T3duZXIuRXJyb3IoKSwgdWZtdC5TcHJpbnRmKCJvd25lciBtaXNtYXRjaCAtIGZyb206ICVzLCBhY3R1YWwgb3duZXI6ICVzLCB0b2tlbjogJXMiLCBmcm9tLCBvd25lciwgc3RyaW5nKHRpZCkpKSkKCQl9CgoJCS8vIENoZWNrIGlmIGNhbGxlciBpcyBhcHByb3ZlZCBmb3IgdGhpcyBzcGVjaWZpYyB0b2tlbgoJCWFwcHJvdmVkLCBfIDo9IHRva2VuLkdldEFwcHJvdmVkKHRpZCkKCQlpZiBhcHByb3ZlZCAhPSBjYWxsZXIgewoJCQkvLyBDaGVjayBpZiBjYWxsZXIgaXMgYXBwcm92ZWQgZm9yIGFsbCB0b2tlbnMKCQkJaWYgIXRva2VuLklzQXBwcm92ZWRGb3JBbGwob3duZXIsIGNhbGxlcikgewoJCQkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoZ3JjNzIxLkVyckNhbGxlcklzTm90T3duZXJPckFwcHJvdmVkLkVycm9yKCksIHVmbXQuU3ByaW50ZigiY2FsbGVyICVzIGlzIG5vdCBvd25lciAlcyBvciBhcHByb3ZlZCBmb3IgdG9rZW4gJXMiLCBjYWxsZXIsIG93bmVyLCBzdHJpbmcodGlkKSkpKQoJCQl9CgkJfQoKCWNhc2UgZ3JjNzIxLkVyckludmFsaWRBZGRyZXNzOgoJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWxzKGdyYzcyMS5FcnJJbnZhbGlkQWRkcmVzcy5FcnJvcigpLCB1Zm10LlNwcmludGYoInRvIGFkZHJlc3MgKCVzKSIsIHRvKSkpCgoJY2FzZSBncmM3MjEuRXJyVHJhbnNmZXJGcm9tSW5jb3JyZWN0T3duZXI6CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoZ3JjNzIxLkVyclRyYW5zZmVyRnJvbUluY29ycmVjdE93bmVyLkVycm9yKCksIHVmbXQuU3ByaW50ZigiZnJvbSAlcyBpcyBub3QgdGhlIG93bmVyICVzIG9mIHRva2VuICVzIiwgZnJvbSwgb3duZXIsIHN0cmluZyh0aWQpKSkpCgoJY2FzZSBncmM3MjEuRXJySW52YWxpZFRva2VuSWQ6CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoZ3JjNzIxLkVyckludmFsaWRUb2tlbklkLkVycm9yKCksIHVmbXQuU3ByaW50ZigidG9rZW4gJXMiLCBzdHJpbmcodGlkKSkpKQoKCWRlZmF1bHQ6CgkJcGFuaWMoZXJyLkVycm9yKCkpCgl9Cn0KCi8vIGNoZWNrQXBwcm92ZUVyciB3cmFwcyBhcHByb3ZlIGVycm9ycyB3aXRoIG1vcmUgc3BlY2lmaWMgY29udGV4dC4KZnVuYyBjaGVja0FwcHJvdmVFcnIoZXJyIGVycm9yLCBjYWxsZXIsIGFwcHJvdmVkIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgewoJaWYgZXJyID09IG5pbCB7CgkJcmV0dXJuCgl9CgoJc3dpdGNoIHsKCWNhc2UgZXJyb3JzLklzKGVyciwgZ3JjNzIxLkVyckludmFsaWRUb2tlbklkKToKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJUb2tlbk5vdEV4aXN0cywgdWZtdC5TcHJpbnRmKCJ0b2tlbiAlcyIsIHN0cmluZyh0aWQpKSkpCgoJY2FzZSBlcnJvcnMuSXMoZXJyLCBncmM3MjEuRXJyQ2FsbGVySXNOb3RPd25lck9yQXBwcm92ZWQpOgoJCW93bmVyLCBvd25lckVyciA6PSB0b2tlbi5Pd25lck9mKHRpZCkKCQljaGVja0Vycihvd25lckVycikKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJOb3RPd25lck9yQXBwcm92ZWQsIHVmbXQuU3ByaW50ZigiY2FsbGVyICVzIGNhbm5vdCBhcHByb3ZlIGZvciB0b2tlbiAlcyBvd25lZCBieSAlcyIsIGNhbGxlciwgc3RyaW5nKHRpZCksIG93bmVyKSkpCgoJY2FzZSBlcnJvcnMuSXMoZXJyLCBncmM3MjEuRXJyQXBwcm92YWxUb0N1cnJlbnRPd25lcik6CgkJcGFuaWMobWFrZUVycm9yV2l0aERldGFpbHMoZXJyVHJhbnNmZXJUb1NlbGYsIHVmbXQuU3ByaW50ZigiY2Fubm90IGFwcHJvdmUgdG8gY3VycmVudCBvd25lciAlcyBmb3IgdG9rZW4gJXMiLCBhcHByb3ZlZCwgc3RyaW5nKHRpZCkpKSkKCglkZWZhdWx0OgoJCXBhbmljKGVyci5FcnJvcigpKQoJfQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBIRCKD2+ycSCjQxOTEwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQKKnQCRyo+BgWOlwfDQH/PeXUSTB41VixCaC426DJyOLHfYI8+LVDzHP5rxHBvokovuQ0ttS5HaQJeIEYoLVu9waKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data