Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
552DDEC7F9BDE7711D4A50ABD1F3B9424EAB5EDF54A38D7C28D014F5AD5C7562
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
62,784,318
Requested gas limit
GAS USED
52,320,295
Gas consumed
FEE
62785ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CprGAgoML3ZtLm1fYWRkcGtnEojGAgooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLaxQIKCGVtaXNzaW9uEhtnbm8ubGFuZC9yL2dub3N3YXAvZW1pc3Npb24auScKCVJFQURNRS5tZBKrJyMgRW1pc3Npb24KCkdOUyB0b2tlbiBlbWlzc2lvbiBhbmQgZGlzdHJpYnV0aW9uIHN5c3RlbS4KCiMjIE92ZXJ2aWV3CgpUaGUgZW1pc3Npb24gc3lzdGVtIGNvbnRyb2xzIGNyZWF0aW9uIGFuZCBkaXN0cmlidXRpb24gb2YgbmV3IEdOUyB0b2tlbnMgd2l0aCBhIGRlZmxhdGlvbmFyeSBtb2RlbCBmZWF0dXJpbmcgcGVyaW9kaWMgaGFsdmluZ3MsIGVuc3VyaW5nIHByZWRpY3RhYmxlIGFuZCBkZWNyZWFzaW5nIHN1cHBseSBncm93dGggb3ZlciAxMiB5ZWFycy4gRm9yIG1vcmUgZGV0YWlscywgY2hlY2sgb3V0IFtkb2NzXShodHRwczovL2RvY3MuZ25vc3dhcC5pby9nbm9zd2FwLXRva2VuL2VtaXNzaW9uKS4KCiMjIFRva2VuIEVjb25vbWljcwoKLSAqKlRvdGFsIFN1cHBseSBDYXAqKjogMSwwMDAsMDAwLDAwMCBHTlMKLSAqKkluaXRpYWwgTWludGVkKio6IDEwMCwwMDAsMDAwIEdOUywgcHJlLW1pbnRlZCB0byB0aGUgY29uZmlndXJlZCBgQURNSU5gCiAgcm9sZSBhZGRyZXNzIGR1cmluZyBHTlMgcmVhbG0gaW5pdGlhbGl6YXRpb24KLSAqKlRvIEJlIE1pbnRlZCoqOiA5MDAsMDAwLDAwMCBHTlMgb3ZlciAxMiB5ZWFycwotICoqSGFsdmluZyBQZXJpb2QqKjogRXZlcnkgMiB5ZWFycyAoNjMsMDcyLDAwMCBzZWNvbmRzKQotICoqSGFsdmluZyBSZWR1Y3Rpb24qKjogNTAlIGRlY3JlYXNlIGluIGVtaXNzaW9uIHJhdGUKLSAqKkRpc3RyaWJ1dGlvbioqOiBBdXRvbWF0aWMgZHVyaW5nIHByb3RvY29sIGFjdGl2aXR5CgojIyBDb25maWd1cmF0aW9uCgotICoqRGlzdHJpYnV0aW9uIFJhdGlvcyoqIChtb2RpZmlhYmxlIGJ5IGFkbWluIG9yIGdvdmVybmFuY2UpOgogIC0gTGlxdWlkaXR5IFN0YWtlcjogNzUlIChkZWZhdWx0KQogIC0gRGV2T3BzOiAyMCUgKGRlZmF1bHQpCiAgLSBDb21tdW5pdHkgUG9vbDogNSUgKGRlZmF1bHQpCiAgLSBHb3Zlcm5hbmNlIFN0YWtlcjogMCUgKGRlZmF1bHQpCi0gKipTdGFydCBUaW1lKio6IFVuaXggdGltZXN0YW1wLiBJdCBtYXkgYmUgY2hhbmdlZCB3aGlsZSB0aGUgY29uZmlndXJlZCB0aW1lc3RhbXAgaXMgc3RpbGwgaW4gdGhlIGZ1dHVyZTsgb25jZSBhY3RpdmUsIGl0IGNhbm5vdCBiZSBjaGFuZ2VkLgoKIyMgQ29yZSBGZWF0dXJlcwoKIyMjIEVtaXNzaW9uIFNjaGVkdWxlCgpJbXBsZW1lbnRzIEJpdGNvaW4tc3R5bGUgaGFsdmluZyBtb2RlbDoKCi0gWWVhciAxLTI6IDEwMCUgZW1pc3Npb24gcmF0ZQotIFllYXIgMy00OiA1MCUgZW1pc3Npb24gcmF0ZQotIFllYXIgNS02OiAyNSUgZW1pc3Npb24gcmF0ZQotIFllYXIgNy04OiAxMi41JSBlbWlzc2lvbiByYXRlCi0gWWVhciA5LTEyOiA2LjI1JSBlbWlzc2lvbiByYXRlCgojIyMgRGlzdHJpYnV0aW9uIE1lY2hhbmlzbQoKV2hlbiB0cmlnZ2VyZWQgYnkgcHJvdG9jb2wgYWN0aXZpdHk6CgoxLiBDYWxjdWxhdGVzIGVsYXBzZWQgdGltZSBzaW5jZSBsYXN0IGRpc3RyaWJ1dGlvbgoyLiBNaW50cyBHTlMgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZXN0YW1wIHJhbmdlIGFuZCBoYWx2aW5nLXllYXIgcmF0ZXMKMy4gRGlzdHJpYnV0ZXMgdG8gdGFyZ2V0cyBwZXIgY29uZmlndXJlZCByYXRpb3MKNC4gQ2FycmllcyBmb3J3YXJkIGFueSB1bmRpc3RyaWJ1dGVkIGFtb3VudHMKCklmIGVtaXNzaW9uIGlzIGhhbHRlZCwgYE1pbnRBbmREaXN0cmlidXRlR25zYCByZXR1cm5zIGAoMCwgZmFsc2UpYCB3aXRob3V0CnBhbmlja2luZy4gQSBjYWxsZXIgdGhhdCByZXF1aXJlcyBlbWlzc2lvbiBtdXN0IGV4cGxpY2l0bHkgaGFuZGxlIHRoYXQgcmVzdWx0LgoKIyMgS2V5IEZ1bmN0aW9ucwoKIyMjIGBNaW50QW5kRGlzdHJpYnV0ZUduc2AKCk1pbnRzIGFuZCBkaXN0cmlidXRlcyBHTlMgdG9rZW5zIGF1dG9tYXRpY2FsbHkuCgojIyMgYFNldERpc3RyaWJ1dGlvblN0YXJ0VGltZWAKClNldHMgb3IgcmVzY2hlZHVsZXMgdGhlIGVtaXNzaW9uIHN0YXJ0IHRpbWVzdGFtcCBiZWZvcmUgZGlzdHJpYnV0aW9uIGlzIGFjdGl2ZS4KVGhlIHRpbWVzdGFtcCBtdXN0IGJlIHBvc2l0aXZlIGFuZCBpbiB0aGUgZnV0dXJlOyBhZnRlciB0aGUgY29uZmlndXJlZCBzdGFydAp0aW1lIGhhcyBiZWVuIHJlYWNoZWQsIHRoZSB0aW1lc3RhbXAgaXMgaW1tdXRhYmxlLgoKIyMjIGBDaGFuZ2VEaXN0cmlidXRpb25QY3RgCgpVcGRhdGVzIGRpc3RyaWJ1dGlvbiBwZXJjZW50YWdlcyAoYWRtaW4gb3IgZ292ZXJuYW5jZSBvbmx5KS4KCiMjIyBgR2V0RGlzdHJpYnV0aW9uQnBzUGN0YAoKUmV0dXJucyBjdXJyZW50IGRpc3RyaWJ1dGlvbiBwZXJjZW50YWdlIGluIGJhc2lzIHBvaW50cyBmb3IgYSB0YXJnZXQsIG9yIGFuIGVycm9yIGlmIHRoZSB0YXJnZXQgaXMgaW52YWxpZC4KCiMjIEdub3dlYgoKYFJlbmRlcigiIilgIHNob3dzIGRpc3RyaWJ1dGlvbiBkYXRlcyBpbiBVVEMsIEdOUyBhbW91bnRzIHdpdGggc2l4IGRlY2ltYWwgcGxhY2VzLAphbGxvY2F0aW9uIHBlcmNlbnRhZ2VzLCBhbmQgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb25zIGZvciB0aGUgZm91ciByZWNpcGllbnRzLgpTdGFrZXIgYW5kIGdvdmVybmFuY2Utc3Rha2VyIGNvdW50ZXJzIHNpbmNlIHRoZWlyIGxhc3QgYWNjb3VudGluZyBjbGVhciBhcmUgc2hvd24Kc2VwYXJhdGVseTogdGhlc2UgYWxsb2NhdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gdHJhbnNmZXJyZWQgYW5kIGFyZSBub3Qgd2FsbGV0CmJhbGFuY2VzIG9yIHVzZXItY2xhaW1hYmxlIHJld2FyZHMuIFVuc3VwcG9ydGVkIHBhdGhzIHJldHVybiBgNDA0YC4KCiMjIFRlY2huaWNhbCBEZXRhaWxzCgojIyMgVGltZXN0YW1wLUJhc2VkIEVtaXNzaW9uCgpUaGUgZm9sbG93aW5nIGlzIGEgY29uY2VwdHVhbCB2aWV3IG9mIHRoZSBzY2hlZHVsZToKCmBgYAplbWlzc2lvblBlclNlY29uZCA9IGJhc2VFbWlzc2lvbiAvICgyXmhhbHZpbmdDb3VudCkKYW1vdW50VG9NaW50ID0gZW1pc3Npb25QZXJTZWNvbmQgKiBlbGFwc2VkU2Vjb25kcwpgYGAKClRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGludGVnZXIsIHBpZWNld2lzZSByYXRlcy4gRm9yIGVhY2ggaGFsdmluZyB5ZWFyCmludGVyc2VjdGluZyB0aGUgaW5jbHVzaXZlIG1pbnQgcmFuZ2UgYFtmcm9tVGltZXN0YW1wLCB0b1RpbWVzdGFtcF1gLCBpdAppbml0aWFsaXplcyBgeWVhckFtb3VudFBlclNlY29uZGAgYXMKYGZsb29yKHllYXJEaXN0cmlidXRpb25BbW91bnQgLyBTRUNPTkRTX0lOX1lFQVIpYCBhbmQgbXVsdGlwbGllcyB0aGF0IHJhdGUgYnkKdGhlIGluY2x1c2l2ZSBudW1iZXIgb2Ygc2Vjb25kcy4gVGhlIG1pbnQgcmFuZ2UgaXMgY2xhbXBlZCB0byB0aGUgMTIteWVhcgpzY2hlZHVsZSBlbmQuIFdoZW4gYSByYW5nZSByZWFjaGVzIGEgeWVhciBlbmQsIHRoZSByZW1haW5pbmcgaW50ZWdlciBhbW91bnQKKGluY2x1ZGluZyBkaXZpc2lvbiBkdXN0KSBpcyBhZGRlZCBzbyB0aGF0IHRoZSB5ZWFyJ3MgYWxsb2NhdGlvbiBpcyBleGhhdXN0ZWQuCgojIyMgSGFsdmluZyBDYWxjdWxhdGlvbgoKSGFsdmluZyB5ZWFycyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgc2NoZWR1bGUncyB5ZWFyIGJvdW5kYXJpZXM7IHRoZSBjb25jZXB0dWFsCmZvcm0gaXM6CgpgYGAKaGFsdmluZ0NvdW50ID0gZmxvb3IodGltZVNpbmNlU3RhcnQgLyBoYWx2aW5nUGVyaW9kKQpgYGAKCiMjIyBEaXN0cmlidXRpb24gVGFyZ2V0cwoKMS4gKipMaXF1aWRpdHkgU3Rha2VyKio6IFJld2FyZHMgZm9yIExQIHByb3ZpZGVycwoyLiAqKkRldk9wcyoqOiBEZXZlbG9wbWVudCBhbmQgb3BlcmF0aW9ucyBmdW5kCjMuICoqQ29tbXVuaXR5IFBvb2wqKjogQ29tbXVuaXR5LWdvdmVybmVkIHRyZWFzdXJ5CjQuICoqR292ZXJuYW5jZSBTdGFrZXIqKjogR05TIHN0YWtpbmcgcmV3YXJkcyAoY3VycmVudGx5IDAlKQoKIyMgVXNhZ2UKCmBgYGdvCi8vIFNldCBlbWlzc2lvbiBzdGFydCAoYWRtaW4vZ292ZXJuYW5jZTsgdGltZXN0YW1wIG11c3QgYmUgaW4gdGhlIGZ1dHVyZSkKU2V0RGlzdHJpYnV0aW9uU3RhcnRUaW1lKGNyb3NzKGN1ciksIGZ1dHVyZVN0YXJ0VGltZXN0YW1wKQoKLy8gVHJpZ2dlciBlbWlzc2lvbiAoY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgcHJvdG9jb2wgZmxvd3MpCmFtb3VudCwgb2sgOj0gTWludEFuZERpc3RyaWJ1dGVHbnMoY3Jvc3MoY3VyKSkKCi8vIFVwZGF0ZSBkaXN0cmlidXRpb24gcmF0aW9zCkNoYW5nZURpc3RyaWJ1dGlvblBjdCgKICAgIGNyb3NzKGN1ciksCiAgICA3MDAwLCAvLyA3MCUgdG8gbGlxdWlkaXR5IHN0YWtlcnMKICAgIDIwMDAsIC8vIDIwJSB0byBkZXZvcHMKICAgIDEwMDAsIC8vIDEwJSB0byBjb21tdW5pdHkgcG9vbAogICAgMCwgICAgLy8gMCUgdG8gZ292ZXJuYW5jZSBzdGFrZXJzCikKCi8vIFF1ZXJ5IGRpc3RyaWJ1dGlvbiBpbmZvCnN0YWtlclBjdCwgZXJyIDo9IEdldERpc3RyaWJ1dGlvbkJwc1BjdChMSVFVSURJVFlfU1RBS0VSKQppZiBlcnIgIT0gbmlsIHsKICAgIHBhbmljKGVycikKfQphY2N1bXVsYXRlZCA6PSBHZXRBY2N1RGlzdHJpYnV0ZWRUb1N0YWtlcigpCnJhdGUsIGVyciA6PSBHZXRTdGFrZXJFbWlzc2lvbkFtb3VudFBlclNlY29uZCgpCmlmIGVyciAhPSBuaWwgewogICAgcGFuaWMoZXJyKQp9CmBgYAoKIyMgU2VjdXJpdHkKCi0gU3RhcnQgdGltZSBtYXkgYmUgcmVzY2hlZHVsZWQgd2hpbGUgc3RpbGwgaW4gdGhlIGZ1dHVyZSBhbmQgaXMgaW1tdXRhYmxlIG9uY2UgYWN0aXZlCi0gRGlzdHJpYnV0aW9uIHBlcmNlbnRhZ2VzIG11c3Qgc3VtIHRvIDEwMDAwICgxMDAlKQotIEEgaGFsdGVkIGBNaW50QW5kRGlzdHJpYnV0ZUduc2AgY2FsbCByZXR1cm5zIGBmYWxzZWA7IG5vIGF1dG9tYXRpYyBjcm9zcy1tb2R1bGUgY2FzY2FkZSBvY2N1cnMKLSBJZiBzdGFrZXIgY2FjaGUgaW52YWxpZGF0aW9uIGlzIHJlcXVpcmVkLCBrZWVwIHRoZSBvcHRpb25hbCBkaXN0cmlidXRpb24tY2hhbmdlIGNhbGxiYWNrIHJlZ2lzdGVyZWQKLSBMZWZ0b3ZlciB0cmFja2luZyBjYXJyaWVzIHVuZGlzdHJpYnV0ZWQgYW1vdW50cyBmb3J3YXJkCi0gSGFsdmluZyBpcyBlbmZvcmNlZCBhdCBwcm90b2NvbCBsZXZlbAoa6xAKCmFzc2VydC5nbm8S3BBwYWNrYWdlIGVtaXNzaW9uCgppbXBvcnQgKAoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpmdW5jIGFzc2VydERlZmF1bHRJbml0aWFsUG9vbEV4aXN0cygpIHsKCWlmIGRlZmF1bHRJbml0aWFsUG9vbENoZWNrZXIgPT0gbmlsIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkRW1pc3Npb25TdGFydCwgImRlZmF1bHQgaW5pdGlhbCBwb29sIGNoZWNrZXIgaXMgbm90IHJlZ2lzdGVyZWQiKSkKCX0KCglpZiAhZGVmYXVsdEluaXRpYWxQb29sQ2hlY2tlcihEZWZhdWx0SW5pdGlhbFBvb2xUaWVyUGF0aCkgewoJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRFbWlzc2lvblN0YXJ0LCAiZGVmYXVsdCBpbml0aWFsIHBvb2wgZG9lcyBub3QgZXhpc3Q6ICIrRGVmYXVsdEluaXRpYWxQb29sVGllclBhdGgpKQoJfQp9CgovLyB2YWxpZGF0ZURpc3RyaWJ1dGlvblRhcmdldCByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBnaXZlbiBkaXN0cmlidXRpb24gdGFyZ2V0IGlzIGludmFsaWQuCmZ1bmMgdmFsaWRhdGVEaXN0cmlidXRpb25UYXJnZXQodGFyZ2V0IGludCkgZXJyb3IgewoJdmFsaWRUYXJnZXRzIDo9IG1hcFtpbnRdYm9vbHsKCQlMSVFVSURJVFlfU1RBS0VSOiBmYWxzZSwKCQlERVZPUFM6ICAgICAgICAgICBmYWxzZSwKCQlDT01NVU5JVFlfUE9PTDogICBmYWxzZSwKCQlHT1ZfU1RBS0VSOiAgICAgICBmYWxzZSwKCX0KCglpZiBfLCBvayA6PSB2YWxpZFRhcmdldHNbdGFyZ2V0XTsgIW9rIHsKCQlyZXR1cm4gbWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyckludmFsaWRFbWlzc2lvblRhcmdldCwKCQkJdWZtdC5TcHJpbnRmKCJpbnZhbGlkIHRhcmdldCglZCkiLCB0YXJnZXQpLAoJCSkKCX0KCglyZXR1cm4gbmlsCn0KCi8vIGFzc2VydFZhbGlkRGlzdHJpYnV0aW9uVGFyZ2V0IHBhbmljcyBpZiB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uIHRhcmdldCBpcyBpbnZhbGlkLgovLyBLZXB0IGZvciBpbnRlcm5hbCBpbnZhcmlhbnQgY2hlY2tzLgpmdW5jIGFzc2VydFZhbGlkRGlzdHJpYnV0aW9uVGFyZ2V0KHRhcmdldCBpbnQpIHsKCWlmIGVyciA6PSB2YWxpZGF0ZURpc3RyaWJ1dGlvblRhcmdldCh0YXJnZXQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCi8vIGFzc2VydFZhbGlkRGlzdHJpYnV0aW9uUGN0IGVuc3VyZXMgdGhlIHN1bSBvZiBhbGwgZGlzdHJpYnV0aW9uIHBlcmNlbnRhZ2VzIGVxdWFscyAxMDAwMCAoMTAwJSkuCi8vIFBhbmljcyBpZiB0aGUgc3VtIGRvZXMgbm90IGVxdWFsIGV4YWN0bHkgMTAwMDAgYmFzaXMgcG9pbnRzLgpmdW5jIGFzc2VydFZhbGlkRGlzdHJpYnV0aW9uUGN0KGxpcXVpZGl0eVN0YWtlclBjdCwgZGV2T3BzUGN0LCBjb21tdW5pdHlQb29sUGN0LCBnb3ZTdGFrZXJQY3QgaW50NjQpIHsKCS8vIFZhbGlkYXRlIGluZGl2aWR1YWwgcGVyY2VudGFnZXMgYXJlIG5vbi1uZWdhdGl2ZSBhbmQgcmVhc29uYWJsZQoJcGVyY2VudGFnZXMgOj0gW11pbnQ2NHtsaXF1aWRpdHlTdGFrZXJQY3QsIGRldk9wc1BjdCwgY29tbXVuaXR5UG9vbFBjdCwgZ292U3Rha2VyUGN0fQoJZm9yIGksIHBjdCA6PSByYW5nZSBwZXJjZW50YWdlcyB7CgkJaWYgcGN0IDwgMCB7CgkJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQkJZXJySW52YWxpZEVtaXNzaW9uUGN0LAoJCQkJdWZtdC5TcHJpbnRmKCJwZXJjZW50YWdlICVkIGNhbm5vdCBiZSBuZWdhdGl2ZTogJWQiLCBpKzEsIHBjdCksCgkJCSkpCgkJfQoKCQlpZiBwY3QgPiAxMDAwMCB7CgkJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQkJZXJySW52YWxpZEVtaXNzaW9uUGN0LAoJCQkJdWZtdC5TcHJpbnRmKCJwZXJjZW50YWdlICVkIGNhbm5vdCBleGNlZWQgMTAwJSU6ICVkIiwgaSsxLCBwY3QpLAoJCQkpKQoJCX0KCX0KCglzdW0gOj0gbGlxdWlkaXR5U3Rha2VyUGN0ICsgZGV2T3BzUGN0ICsgY29tbXVuaXR5UG9vbFBjdCArIGdvdlN0YWtlclBjdAoJaWYgc3VtICE9IDEwMDAwIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZEVtaXNzaW9uUGN0LAoJCQl1Zm10LlNwcmludGYoInN1bSBvZiBwZXJjZW50YWdlcyBtdXN0IGJlIDEwMDAwLCBnb3QgJWQiLCBzdW0pLAoJCSkpCgl9Cn0KGrlzChBkaXN0cmlidXRpb24uZ25vEqRzcGFja2FnZSBlbWlzc2lvbgoKaW1wb3J0ICgKCSJjaGFpbiIKCSJ0aW1lIgoKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCglnbnNtYXRoICJnbm8ubGFuZC9wL2dub3N3YXAvZ25zbWF0aC92MSIKCXByYmFjICJnbm8ubGFuZC9wL2dub3N3YXAvcmJhYy92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdXRpbHMvdjEiCgoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCgkiZ25vLmxhbmQvci9nbm9zd2FwL2ducyIKCSJnbm8ubGFuZC9yL2dub3N3YXAvaGFsdC92MSIKKQoKY29uc3QgKAoJXyBpbnQgPSBpb3RhCglMSVFVSURJVFlfU1RBS0VSCglERVZPUFMKCUNPTU1VTklUWV9QT09MCglHT1ZfU1RBS0VSCikKCnZhciAoCgkvLyBTdG9yZXMgdGhlIHBlcmNlbnRhZ2UgKGluIGJhc2lzIHBvaW50cykgZm9yIGVhY2ggZGlzdHJpYnV0aW9uIHRhcmdldAoJLy8gMSBiYXNpcyBwb2ludCA9IDAuMDElCgkvLyBUaGVzZSBwZXJjZW50YWdlcyBjYW4gYmUgbW9kaWZpZWQgYnkgYWRtaW4gb3IgZ292ZXJuYW5jZS4KCWRpc3RyaWJ1dGlvbkJwc1BjdCBtYXBbaW50XWludDY0CgoJZGlzdHJpYnV0ZWRUb1N0YWtlciAgICAgICAgaW50NjQgLy8gY2FuIGJlIGNsZWFyZWQgYnkgc3Rha2VyIGNvbnRyYWN0CglkaXN0cmlidXRlZFRvRGV2T3BzICAgICAgICBpbnQ2NAoJZGlzdHJpYnV0ZWRUb0NvbW11bml0eVBvb2wgaW50NjQKCWRpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXIgICAgIGludDY0IC8vIGNhbiBiZSBjbGVhcmVkIGJ5IGdvdmVybmFuY2Ugc3Rha2VyCgoJLy8gSGlzdG9yaWNhbCB0b3RhbCBkaXN0cmlidXRpb25zIChuZXZlciByZXNldCkKCWFjY3VEaXN0cmlidXRlZFRvU3Rha2VyICAgICAgICBpbnQ2NAoJYWNjdURpc3RyaWJ1dGVkVG9EZXZPcHMgICAgICAgIGludDY0CglhY2N1RGlzdHJpYnV0ZWRUb0NvbW11bml0eVBvb2wgaW50NjQKCWFjY3VEaXN0cmlidXRlZFRvR292U3Rha2VyICAgICBpbnQ2NAopCgovLyBJbml0aWFsaXplIGRlZmF1bHQgZGlzdHJpYnV0aW9uIHBlcmNlbnRhZ2VzOgovLyAtIExpcXVpZGl0eSBTdGFrZXJzOiA3NSUKLy8gLSBEZXZPcHM6IDIwJQovLyAtIENvbW11bml0eSBQb29sOiA1JQovLyAtIEdvdmVybmFuY2UgU3Rha2VyczogMCUKLy8KLy8gcmVmOiBodHRwczovL2RvY3MuZ25vc3dhcC5pby9nbm9zd2FwLXRva2VuL2VtaXNzaW9uCmZ1bmMgaW5pdCgpIHsKCWRpc3RyaWJ1dGlvbkJwc1BjdCA9IG1hcFtpbnRdaW50NjR7CgkJTElRVUlESVRZX1NUQUtFUjogNzUwMCwKCQlERVZPUFM6ICAgICAgICAgICAyMDAwLAoJCUNPTU1VTklUWV9QT09MOiAgIDUwMCwKCQlHT1ZfU1RBS0VSOiAgICAgICAwLAoJfQp9CgovLyBDaGFuZ2VEaXN0cmlidXRpb25QY3QgY2hhbmdlcyBkaXN0cmlidXRpb24gcGVyY2VudGFnZXMgZm9yIGVtaXNzaW9uIHRhcmdldHMuCi8vCi8vIFRoaXMgZnVuY3Rpb24gcmVkaXN0cmlidXRlcyBob3cgbmV3bHkgbWludGVkIEdOUyB0b2tlbnMgYXJlIGFsbG9jYXRlZCBhY3Jvc3MKLy8gcHJvdG9jb2wgY29tcG9uZW50cy4gQmVmb3JlIGFwcGx5aW5nIG5ldyByYXRpb3MsIGl0IGRpc3RyaWJ1dGVzIGFueSBhY2N1bXVsYXRlZAovLyBlbWlzc2lvbnMgdXNpbmcgdGhlIGN1cnJlbnQgcmF0aW9zLCBlbnN1cmluZyBlbWlzc2lvbnMgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZwovLyB0byB0aGUgcmF0aW9zIGluIGVmZmVjdCB3aGVuIHRoZXkgd2VyZSBnZW5lcmF0ZWQuIFRoaXMgcHJldmVudHMgcmV0cm9hY3RpdmUKLy8gYXBwbGljYXRpb24gb2YgbmV3IHJhdGlvcyB0byBwYXN0IGVtaXNzaW9ucy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gbGlxdWlkaXR5U3Rha2VyUGN0OiBwZXJjZW50YWdlIGZvciBsaXF1aWRpdHkgc3Rha2VycyBpbiBiYXNpcyBwb2ludHMgKDEwMCA9IDElLCAxMDAwMCA9IDEwMCUpLgovLyAgIC0gZGV2T3BzUGN0OiBwZXJjZW50YWdlIGZvciBEZXZPcHMgaW4gYmFzaXMgcG9pbnRzICgxMDAgPSAxJSwgMTAwMDAgPSAxMDAlKS4KLy8gICAtIGNvbW11bml0eVBvb2xQY3Q6IHBlcmNlbnRhZ2UgZm9yIHRoZSBjb21tdW5pdHkgcG9vbCBpbiBiYXNpcyBwb2ludHMgKDEwMCA9IDElLCAxMDAwMCA9IDEwMCUpLgovLyAgIC0gZ292U3Rha2VyUGN0OiBwZXJjZW50YWdlIGZvciBnb3Zlcm5hbmNlIHN0YWtlcnMgaW4gYmFzaXMgcG9pbnRzICgxMDAgPSAxJSwgMTAwMDAgPSAxMDAlKS4KLy8KLy8gUmVxdWlyZW1lbnRzOgovLyAgIC0gUGVyY2VudGFnZXMgbXVzdCBzdW0gdG8gZXhhY3RseSAxMDAwMCAoMTAwJSkuCi8vICAgLSBFYWNoIHBlcmNlbnRhZ2UgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMDAwIGluY2x1c2l2ZS4KLy8KLy8gRXhhbXBsZToKLy8KLy8JQ2hhbmdlRGlzdHJpYnV0aW9uUGN0KAovLwkgIDcwMDAsICAvLyA3MCUgdG8gbGlxdWlkaXR5IHN0YWtlcnMKLy8JICAyMDAwLCAgLy8gMjAlIHRvIGRldm9wcwovLwkgIDEwMDAsICAvLyAxMCUgdG8gY29tbXVuaXR5IHBvb2wKLy8JICAwLCAgICAgLy8gMCUgdG8gZ292ZXJuYW5jZSBzdGFrZXJzCi8vCSkKLy8KLy8gT25seSBjYWxsYWJsZSBieSBhZG1pbiBvciBnb3Zlcm5hbmNlLgpmdW5jIENoYW5nZURpc3RyaWJ1dGlvblBjdCgKCWN1ciByZWFsbSwKCWxpcXVpZGl0eVN0YWtlclBjdCBpbnQ2NCwKCWRldk9wc1BjdCBpbnQ2NCwKCWNvbW11bml0eVBvb2xQY3QgaW50NjQsCglnb3ZTdGFrZXJQY3QgaW50NjQsCikgewoJaGFsdC5Bc3NlcnRJc05vdEhhbHRlZEVtaXNzaW9uKCkKCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglhY2Nlc3MuQXNzZXJ0SXNBZG1pbk9yR292ZXJuYW5jZShjYWxsZXIpCgoJYXNzZXJ0VmFsaWREaXN0cmlidXRpb25QY3QobGlxdWlkaXR5U3Rha2VyUGN0LCBkZXZPcHNQY3QsIGNvbW11bml0eVBvb2xQY3QsIGdvdlN0YWtlclBjdCkKCgkvLyBEaXN0cmlidXRlIGFjY3VtdWxhdGVkIGVtaXNzaW9ucyB3aXRoIGN1cnJlbnQgcmF0aW9zIGJlZm9yZSBjaGFuZ2luZyByYXRpb3MuCgkvLyBUaGlzIHByZXZlbnRzIHJldHJvYWN0aXZlIGFwcGxpY2F0aW9uIG9mIG5ldyByYXRpb3MgdG8gZW1pc3Npb25zIHRoYXQgb2NjdXJyZWQKCS8vIHVuZGVyIHByZXZpb3VzIHJhdGlvIGNvbmZpZ3VyYXRpb25zLgoJTWludEFuZERpc3RyaWJ1dGVHbnMoY3VyKQoKCWN1cnJlbnRUaW1lc3RhbXAgOj0gdGltZS5Ob3coKS5Vbml4KCkKCXN0YWtlclJld2FyZFBlclNlY29uZCA6PSBHZXRFbWlzc2lvbkFtb3VudFBlclNlY29uZEJ5KGN1cnJlbnRUaW1lc3RhbXAsIGxpcXVpZGl0eVN0YWtlclBjdCkKCWdvdlN0YWtlclJld2FyZFBlclNlY29uZCA6PSBHZXRFbWlzc2lvbkFtb3VudFBlclNlY29uZEJ5KGN1cnJlbnRUaW1lc3RhbXAsIGdvdlN0YWtlclBjdCkKCglpZiBvbkRpc3RyaWJ1dGlvblBjdENoYW5nZUNhbGxiYWNrICE9IG5pbCB7CgkJb25EaXN0cmlidXRpb25QY3RDaGFuZ2VDYWxsYmFjayhjcm9zcyhjdXIpLCBzdGFrZXJSZXdhcmRQZXJTZWNvbmQpCgl9CgoJY2hhbmdlRGlzdHJpYnV0aW9uUGN0cyhsaXF1aWRpdHlTdGFrZXJQY3QsIGRldk9wc1BjdCwgY29tbXVuaXR5UG9vbFBjdCwgZ292U3Rha2VyUGN0KQoKCXByZXZpb3VzUmVhbG0gOj0gY3VyLlByZXZpb3VzKCkKCWNoYWluLkVtaXQoCgkJIkNoYW5nZURpc3RyaWJ1dGlvblBjdCIsCgkJInByZXZBZGRyIiwgcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkuU3RyaW5nKCksCgkJInByZXZSZWFsbSIsIHByZXZpb3VzUmVhbG0uUGtnUGF0aCgpLAoJCSJsaXF1aWRpdHlTdGFrZXJQY3QiLCB1dGlscy5Gb3JtYXRJbnQobGlxdWlkaXR5U3Rha2VyUGN0KSwKCQkiZGV2T3BzUGN0IiwgdXRpbHMuRm9ybWF0SW50KGRldk9wc1BjdCksCgkJImNvbW11bml0eVBvb2xQY3QiLCB1dGlscy5Gb3JtYXRJbnQoY29tbXVuaXR5UG9vbFBjdCksCgkJImdvdlN0YWtlclBjdCIsIHV0aWxzLkZvcm1hdEludChnb3ZTdGFrZXJQY3QpLAoJCSJzdGFrZXJSZXdhcmRQZXJTZWNvbmQiLCB1dGlscy5Gb3JtYXRJbnQoc3Rha2VyUmV3YXJkUGVyU2Vjb25kKSwKCQkiZ292U3Rha2VyUmV3YXJkUGVyU2Vjb25kIiwgdXRpbHMuRm9ybWF0SW50KGdvdlN0YWtlclJld2FyZFBlclNlY29uZCksCgkpCn0KCi8vIGNoYW5nZURpc3RyaWJ1dGlvblBjdHMgdXBkYXRlcyB0aGUgZGlzdHJpYnV0aW9uIHBlcmNlbnRhZ2VzIGZvciBhbGwgdGFyZ2V0cy4KZnVuYyBjaGFuZ2VEaXN0cmlidXRpb25QY3RzKGxpcXVpZGl0eVN0YWtlclBjdCwgZGV2T3BzUGN0LCBjb21tdW5pdHlQb29sUGN0LCBnb3ZTdGFrZXJQY3QgaW50NjQpIHsKCXNldERpc3RyaWJ1dGlvbkJwc1BjdChMSVFVSURJVFlfU1RBS0VSLCBsaXF1aWRpdHlTdGFrZXJQY3QpCglzZXREaXN0cmlidXRpb25CcHNQY3QoREVWT1BTLCBkZXZPcHNQY3QpCglzZXREaXN0cmlidXRpb25CcHNQY3QoQ09NTVVOSVRZX1BPT0wsIGNvbW11bml0eVBvb2xQY3QpCglzZXREaXN0cmlidXRpb25CcHNQY3QoR09WX1NUQUtFUiwgZ292U3Rha2VyUGN0KQp9CgpmdW5jIGNhbGN1bGF0ZURpc3RyaWJ1dGFibGVBbW91bnRzKGFtb3VudCBpbnQ2NCkgKG1hcFtpbnRdaW50NjQsIGludDY0KSB7CglkaXN0cmlidXRhYmxlIDo9IG1ha2UobWFwW2ludF1pbnQ2NCwgMCkKCXRvdGFsU2VudCA6PSBpbnQ2NCgwKQoKCWZvciB0YXJnZXQsIHBjdCA6PSByYW5nZSBkaXN0cmlidXRpb25CcHNQY3QgewoJCWRpc3RBbW91bnQgOj0gY2FsY3VsYXRlQW1vdW50KGFtb3VudCwgcGN0KQoJCWlmIGRpc3RBbW91bnQgPT0gMCB7CgkJCWNvbnRpbnVlCgkJfQoKCQlkaXN0cmlidXRhYmxlW3RhcmdldF0gPSBkaXN0QW1vdW50CgkJdG90YWxTZW50ID0gZ25zbWF0aC5TYWZlQWRkSW50NjQodG90YWxTZW50LCBkaXN0QW1vdW50KQoJfQoKCWxlZnRBbW91bnQgOj0gZ25zbWF0aC5TYWZlU3ViSW50NjQoYW1vdW50LCB0b3RhbFNlbnQpCglyZXR1cm4gZGlzdHJpYnV0YWJsZSwgbGVmdEFtb3VudAp9CgovLyBjYWxjdWxhdGVBbW91bnQgY29udmVydHMgYmFzaXMgcG9pbnRzIHRvIGFjdHVhbCB0b2tlbiBhbW91bnQuCmZ1bmMgY2FsY3VsYXRlQW1vdW50KGFtb3VudCwgYnB0UGN0IGludDY0KSBpbnQ2NCB7CglpZiBhbW91bnQgPCAwIHx8IGJwdFBjdCA8IDAgfHwgYnB0UGN0ID4gMTAwMDAgewoJCXBhbmljKCJpbnZhbGlkIGFtb3VudCBvciBicHRQY3QiKQoJfQoKCS8vIE1vcmUgcHJlY2lzZSBvdmVyZmxvdyBwcmV2ZW50aW9uCgljb25zdCBtYXhJbnQ2NCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKCWlmIGFtb3VudCA+IG1heEludDY0LzEwMDAwIHsKCQlwYW5pYygiYW1vdW50IHRvbyBsYXJnZSwgd291bGQgY2F1c2Ugb3ZlcmZsb3ciKQoJfQoKCS8vIEFkZGl0aW9uYWwgc2FmZXR5IGNoZWNrIGZvciB6ZXJvIGRpdmlzaW9uCglpZiBicHRQY3QgPT0gMCB7CgkJcmV0dXJuIDAKCX0KCglyZXR1cm4gYW1vdW50ICogYnB0UGN0IC8gMTAwMDAKfQoKZnVuYyBhcHBseURpc3RyaWJ1dGlvbih0YXJnZXRzIG1hcFtpbnRdaW50NjQpIChtYXBbYWRkcmVzc11pbnQ2NCwgZXJyb3IpIHsKCWFtb3VudEJ5QWRkcmVzcyA6PSBtYWtlKG1hcFthZGRyZXNzXWludDY0LCAwKQoKCWZvciB0YXJnZXQsIGFtb3VudCA6PSByYW5nZSB0YXJnZXRzIHsKCQl2YXIgYWRkciBhZGRyZXNzCgoJCXN3aXRjaCB0YXJnZXQgewoJCWNhc2UgTElRVUlESVRZX1NUQUtFUjoKCQkJZGlzdHJpYnV0ZWRUb1N0YWtlciA9IGduc21hdGguU2FmZUFkZEludDY0KGRpc3RyaWJ1dGVkVG9TdGFrZXIsIGFtb3VudCkKCQkJYWNjdURpc3RyaWJ1dGVkVG9TdGFrZXIgPSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChhY2N1RGlzdHJpYnV0ZWRUb1N0YWtlciwgYW1vdW50KQoJCQlhZGRyID0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYmFjLlJPTEVfU1RBS0VSLlN0cmluZygpKQoKCQljYXNlIERFVk9QUzoKCQkJZGlzdHJpYnV0ZWRUb0Rldk9wcyA9IGduc21hdGguU2FmZUFkZEludDY0KGRpc3RyaWJ1dGVkVG9EZXZPcHMsIGFtb3VudCkKCQkJYWNjdURpc3RyaWJ1dGVkVG9EZXZPcHMgPSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChhY2N1RGlzdHJpYnV0ZWRUb0Rldk9wcywgYW1vdW50KQoJCQlhZGRyID0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYmFjLlJPTEVfREVWT1BTLlN0cmluZygpKQoKCQljYXNlIENPTU1VTklUWV9QT09MOgoJCQlkaXN0cmlidXRlZFRvQ29tbXVuaXR5UG9vbCA9IGduc21hdGguU2FmZUFkZEludDY0KGRpc3RyaWJ1dGVkVG9Db21tdW5pdHlQb29sLCBhbW91bnQpCgkJCWFjY3VEaXN0cmlidXRlZFRvQ29tbXVuaXR5UG9vbCA9IGduc21hdGguU2FmZUFkZEludDY0KGFjY3VEaXN0cmlidXRlZFRvQ29tbXVuaXR5UG9vbCwgYW1vdW50KQoJCQlhZGRyID0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYmFjLlJPTEVfQ09NTVVOSVRZX1BPT0wuU3RyaW5nKCkpCgoJCWNhc2UgR09WX1NUQUtFUjoKCQkJZGlzdHJpYnV0ZWRUb0dvdlN0YWtlciA9IGduc21hdGguU2FmZUFkZEludDY0KGRpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXIsIGFtb3VudCkKCQkJYWNjdURpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXIgPSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChhY2N1RGlzdHJpYnV0ZWRUb0dvdlN0YWtlciwgYW1vdW50KQoJCQlhZGRyID0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYmFjLlJPTEVfR09WX1NUQUtFUi5TdHJpbmcoKSkKCgkJZGVmYXVsdDoKCQkJcmV0dXJuIG5pbCwgbWFrZUVycm9yV2l0aERldGFpbHMoCgkJCQllcnJJbnZhbGlkRW1pc3Npb25UYXJnZXQsCgkJCQl1Zm10LlNwcmludGYoImludmFsaWQgdGFyZ2V0KCVkKSIsIHRhcmdldCksCgkJCSkKCQl9CgoJCWFtb3VudEJ5QWRkcmVzc1thZGRyXSA9IGduc21hdGguU2FmZUFkZEludDY0KGFtb3VudEJ5QWRkcmVzc1thZGRyXSwgYW1vdW50KQoJfQoKCXJldHVybiBhbW91bnRCeUFkZHJlc3MsIG5pbAp9CgpmdW5jIHRyYW5zZmVyVG9UYXJnZXQoXyBpbnQsIHJsbSByZWFsbSwgdGFyZ2V0cyBtYXBbYWRkcmVzc11pbnQ2NCkgZXJyb3IgewoJZm9yIGFkZHJlc3MsIGFtb3VudCA6PSByYW5nZSB0YXJnZXRzIHsKCQlnbnMuVHJhbnNmZXIoY3Jvc3MocmxtKSwgYWRkcmVzcywgYW1vdW50KQoJfQoKCXJldHVybiBuaWwKfQoKLy8gR2V0RGlzdHJpYnV0aW9uQnBzUGN0IHJldHVybnMgdGhlIGNvbmZpZ3VyZWQgZGlzdHJpYnV0aW9uIHBlcmNlbnRhZ2UgaW4gYmFzaXMgcG9pbnRzIGZvciBhIHRhcmdldC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRhcmdldDogZGlzdHJpYnV0aW9uIHRhcmdldCBjb25zdGFudCB3aG9zZSBjb25maWd1cmVkIHNoYXJlIGlzIHF1ZXJpZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwY3Q6IGNvbmZpZ3VyZWQgdGFyZ2V0IHNoYXJlIGluIGJhc2lzIHBvaW50cyAoMTAwID0gMSUsIDEwMDAwID0gMTAwJSkuCi8vICAgLSBlcnJvcjogbmlsIHdoZW4gdGhlIHRhcmdldCBleGlzdHMgaW4gdGhlIGluaXRpYWxpemVkIG1hcDsgb3RoZXJ3aXNlIGFuIGludmFsaWQtdGFyZ2V0IGVycm9yLgpmdW5jIEdldERpc3RyaWJ1dGlvbkJwc1BjdCh0YXJnZXQgaW50KSAoaW50NjQsIGVycm9yKSB7CglpZiBlcnIgOj0gdmFsaWRhdGVEaXN0cmlidXRpb25UYXJnZXQodGFyZ2V0KTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoKCWlmIGRpc3RyaWJ1dGlvbkJwc1BjdCA9PSBuaWwgewoJCXJldHVybiAwLCBtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZEVtaXNzaW9uVGFyZ2V0LAoJCQl1Zm10LlNwcmludGYoImRpc3RyaWJ1dGlvbkJwc1BjdCBpcyBuaWwiKSwKCQkpCgl9CgoJcGN0LCBleGlzdCA6PSBkaXN0cmlidXRpb25CcHNQY3RbdGFyZ2V0XQoJaWYgIWV4aXN0IHsKCQlyZXR1cm4gMCwgbWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyckludmFsaWRFbWlzc2lvblRhcmdldCwKCQkJdWZtdC5TcHJpbnRmKCJpbnZhbGlkIHRhcmdldCglZCkiLCB0YXJnZXQpLAoJCSkKCX0KCglyZXR1cm4gcGN0LCBuaWwKfQoKLy8gR2V0RGlzdHJpYnV0ZWRUb1N0YWtlciByZXR1cm5zIHRoZSBwZW5kaW5nIEdOUyBhbW91bnQgYWxsb2NhdGVkIHRvIGxpcXVpZGl0eSBzdGFrZXJzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBwZW5kaW5nIGxpcXVpZGl0eS1zdGFrZXIgYWxsb2NhdGlvbiBpbiBHTlMgYmFzZSB1bml0cyBzaW5jZSB0aGUgbGFzdCBjbGVhci4KZnVuYyBHZXREaXN0cmlidXRlZFRvU3Rha2VyKCkgaW50NjQgewoJcmV0dXJuIGRpc3RyaWJ1dGVkVG9TdGFrZXIKfQoKLy8gR2V0RGlzdHJpYnV0ZWRUb0Rldk9wcyByZXR1cm5zIHRoZSBHTlMgYW1vdW50IGN1cnJlbnRseSBhY2N1bXVsYXRlZCBmb3IgRGV2T3BzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBhY2N1bXVsYXRlZCBEZXZPcHMgYWxsb2NhdGlvbiBpbiBHTlMgYmFzZSB1bml0cy4KZnVuYyBHZXREaXN0cmlidXRlZFRvRGV2T3BzKCkgaW50NjQgewoJcmV0dXJuIGRpc3RyaWJ1dGVkVG9EZXZPcHMKfQoKLy8gR2V0RGlzdHJpYnV0ZWRUb0NvbW11bml0eVBvb2wgcmV0dXJucyB0aGUgR05TIGFtb3VudCBjdXJyZW50bHkgYWNjdW11bGF0ZWQgZm9yIHRoZSBjb21tdW5pdHkgcG9vbC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogYWNjdW11bGF0ZWQgY29tbXVuaXR5LXBvb2wgYWxsb2NhdGlvbiBpbiBHTlMgYmFzZSB1bml0cy4KZnVuYyBHZXREaXN0cmlidXRlZFRvQ29tbXVuaXR5UG9vbCgpIGludDY0IHsKCXJldHVybiBkaXN0cmlidXRlZFRvQ29tbXVuaXR5UG9vbAp9CgovLyBHZXREaXN0cmlidXRlZFRvR292U3Rha2VyIHJldHVybnMgdGhlIHBlbmRpbmcgR05TIGFtb3VudCBhbGxvY2F0ZWQgdG8gZ292ZXJuYW5jZSBzdGFrZXJzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBwZW5kaW5nIGdvdmVybmFuY2Utc3Rha2VyIGFsbG9jYXRpb24gaW4gR05TIGJhc2UgdW5pdHMgc2luY2UgdGhlIGxhc3QgY2xlYXIuCmZ1bmMgR2V0RGlzdHJpYnV0ZWRUb0dvdlN0YWtlcigpIGludDY0IHsKCXJldHVybiBkaXN0cmlidXRlZFRvR292U3Rha2VyCn0KCi8vIEFjY3VtdWxhdGVEaXN0cmlidXRlZEluZm8gcmV0dXJucyB0aGUgY3VycmVudCBwZW5kaW5nIGFsbG9jYXRpb24gZm9yIGV2ZXJ5IGRpc3RyaWJ1dGlvbiB0YXJnZXQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b1N0YWtlcjogcGVuZGluZyBHTlMgYWxsb2NhdGlvbiBmb3IgbGlxdWlkaXR5IHN0YWtlcnMsIGluIHRva2VuIGJhc2UgdW5pdHMuCi8vICAgLSB0b0Rldk9wczogYWNjdW11bGF0ZWQgR05TIGFsbG9jYXRpb24gZm9yIERldk9wcywgaW4gdG9rZW4gYmFzZSB1bml0cy4KLy8gICAtIHRvQ29tbXVuaXR5UG9vbDogYWNjdW11bGF0ZWQgR05TIGFsbG9jYXRpb24gZm9yIHRoZSBjb21tdW5pdHkgcG9vbCwgaW4gdG9rZW4gYmFzZSB1bml0cy4KLy8gICAtIHRvR292U3Rha2VyOiBwZW5kaW5nIEdOUyBhbGxvY2F0aW9uIGZvciBnb3Zlcm5hbmNlIHN0YWtlcnMsIGluIHRva2VuIGJhc2UgdW5pdHMuCmZ1bmMgQWNjdW11bGF0ZURpc3RyaWJ1dGVkSW5mbygpICh0b1N0YWtlciwgdG9EZXZPcHMsIHRvQ29tbXVuaXR5UG9vbCwgdG9Hb3ZTdGFrZXIgaW50NjQpIHsKCXRvU3Rha2VyID0gR2V0RGlzdHJpYnV0ZWRUb1N0YWtlcigpCgl0b0Rldk9wcyA9IEdldERpc3RyaWJ1dGVkVG9EZXZPcHMoKQoJdG9Db21tdW5pdHlQb29sID0gR2V0RGlzdHJpYnV0ZWRUb0NvbW11bml0eVBvb2woKQoJdG9Hb3ZTdGFrZXIgPSBHZXREaXN0cmlidXRlZFRvR292U3Rha2VyKCkKCXJldHVybgp9CgovLyBHZXRBY2N1RGlzdHJpYnV0ZWRUb1N0YWtlciByZXR1cm5zIHRoZSB0b3RhbCBoaXN0b3JpY2FsIEdOUyBhbW91bnQgYWxsb2NhdGVkIHRvIGxpcXVpZGl0eSBzdGFrZXJzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBjdW11bGF0aXZlIGxpcXVpZGl0eS1zdGFrZXIgYWxsb2NhdGlvbiBpbiBHTlMgYmFzZSB1bml0czsgdGhpcyB2YWx1ZSBpcyBub3QgY2xlYXJlZC4KZnVuYyBHZXRBY2N1RGlzdHJpYnV0ZWRUb1N0YWtlcigpIGludDY0IHsKCXJldHVybiBhY2N1RGlzdHJpYnV0ZWRUb1N0YWtlcgp9CgovLyBHZXRBY2N1RGlzdHJpYnV0ZWRUb0Rldk9wcyByZXR1cm5zIHRoZSB0b3RhbCBoaXN0b3JpY2FsIEdOUyBhbW91bnQgYWxsb2NhdGVkIHRvIERldk9wcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogY3VtdWxhdGl2ZSBEZXZPcHMgYWxsb2NhdGlvbiBpbiBHTlMgYmFzZSB1bml0czsgdGhpcyB2YWx1ZSBpcyBub3QgY2xlYXJlZC4KZnVuYyBHZXRBY2N1RGlzdHJpYnV0ZWRUb0Rldk9wcygpIGludDY0IHsKCXJldHVybiBhY2N1RGlzdHJpYnV0ZWRUb0Rldk9wcwp9CgovLyBHZXRBY2N1RGlzdHJpYnV0ZWRUb0NvbW11bml0eVBvb2wgcmV0dXJucyB0aGUgdG90YWwgaGlzdG9yaWNhbCBHTlMgYW1vdW50IGFsbG9jYXRlZCB0byB0aGUgY29tbXVuaXR5IHBvb2wuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IGN1bXVsYXRpdmUgY29tbXVuaXR5LXBvb2wgYWxsb2NhdGlvbiBpbiBHTlMgYmFzZSB1bml0czsgdGhpcyB2YWx1ZSBpcyBub3QgY2xlYXJlZC4KZnVuYyBHZXRBY2N1RGlzdHJpYnV0ZWRUb0NvbW11bml0eVBvb2woKSBpbnQ2NCB7CglyZXR1cm4gYWNjdURpc3RyaWJ1dGVkVG9Db21tdW5pdHlQb29sCn0KCi8vIEdldEFjY3VEaXN0cmlidXRlZFRvR292U3Rha2VyIHJldHVybnMgdGhlIHRvdGFsIGhpc3RvcmljYWwgR05TIGFtb3VudCBhbGxvY2F0ZWQgdG8gZ292ZXJuYW5jZSBzdGFrZXJzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBjdW11bGF0aXZlIGdvdmVybmFuY2Utc3Rha2VyIGFsbG9jYXRpb24gaW4gR05TIGJhc2UgdW5pdHM7IHRoaXMgdmFsdWUgaXMgbm90IGNsZWFyZWQuCmZ1bmMgR2V0QWNjdURpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXIoKSBpbnQ2NCB7CglyZXR1cm4gYWNjdURpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXIKfQoKLy8gR2V0RW1pc3Npb25BbW91bnRQZXJTZWNvbmRCeSByZXR1cm5zIHRoZSBHTlMgZW1pc3Npb24gcmF0ZSBwZXIgc2Vjb25kIGZvciBhIHRpbWVzdGFtcCBhbmQgdGFyZ2V0IHNoYXJlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgYmFzZSBlbWlzc2lvbiByYXRlIGlzIHF1ZXJpZWQuCi8vICAgLSBkaXN0cmlidXRpb25QY3Q6IHRhcmdldCBzaGFyZSBpbiBiYXNpcyBwb2ludHMsIGZyb20gMCB0aHJvdWdoIDEwMDAwIGluY2x1c2l2ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudFBlclNlY29uZDogdGFyZ2V0J3MgR05TIGVtaXNzaW9uIHJhdGUgaW4gdG9rZW4gYmFzZSB1bml0cyBwZXIgc2Vjb25kLCBvciB6ZXJvIG91dHNpZGUgdGhlIHNjaGVkdWxlLgpmdW5jIEdldEVtaXNzaW9uQW1vdW50UGVyU2Vjb25kQnkodGltZXN0YW1wLCBkaXN0cmlidXRpb25QY3QgaW50NjQpIGludDY0IHsKCXJldHVybiBjYWxjdWxhdGVBbW91bnQoZ25zLkdldEVtaXNzaW9uQW1vdW50UGVyU2Vjb25kQnlUaW1lc3RhbXAodGltZXN0YW1wKSwgZGlzdHJpYnV0aW9uUGN0KQp9CgovLyBHZXRTdGFrZXJFbWlzc2lvbkFtb3VudFBlclNlY29uZCByZXR1cm5zIHRoZSBjdXJyZW50IEdOUyBlbWlzc2lvbiByYXRlIGFsbG9jYXRlZCB0byBsaXF1aWRpdHkgc3Rha2Vycy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudFBlclNlY29uZDogY3VycmVudCBsaXF1aWRpdHktc3Rha2VyIGVtaXNzaW9uIHJhdGUgaW4gR05TIGJhc2UgdW5pdHMgcGVyIHNlY29uZC4KLy8gICAtIGVycm9yOiBuaWwgd2hlbiB0aGUgbGlxdWlkaXR5LXN0YWtlciBkaXN0cmlidXRpb24gc2hhcmUgaXMgYXZhaWxhYmxlOyBvdGhlcndpc2UgdGhlIHRhcmdldCBsb29rdXAgZXJyb3IuCmZ1bmMgR2V0U3Rha2VyRW1pc3Npb25BbW91bnRQZXJTZWNvbmQoKSAoaW50NjQsIGVycm9yKSB7CgljdXJyZW50VGltZXN0YW1wIDo9IHRpbWUuTm93KCkuVW5peCgpCglwY3QsIGVyciA6PSBHZXREaXN0cmlidXRpb25CcHNQY3QoTElRVUlESVRZX1NUQUtFUikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCXJldHVybiBHZXRFbWlzc2lvbkFtb3VudFBlclNlY29uZEJ5KGN1cnJlbnRUaW1lc3RhbXAsIHBjdCksIG5pbAp9CgovLyBHZXRTdGFrZXJFbWlzc2lvbkFtb3VudFBlclNlY29uZEluUmFuZ2UgcmV0dXJucyBsaXF1aWRpdHktc3Rha2VyIGVtaXNzaW9uLXJhdGUgY2hhbmdlIHBvaW50cyBpbiBhIHRpbWUgcmFuZ2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzdGFydDogaW5jbHVzaXZlIHN0YXJ0IFVuaXggdGltZXN0YW1wIGZvciB0aGUgcmFuZ2UuCi8vICAgLSBlbmQ6IGluY2x1c2l2ZSBlbmQgVW5peCB0aW1lc3RhbXAgZm9yIHRoZSByYW5nZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpbWVzdGFtcHM6IG9yZGVyZWQgdGltZXN0YW1wcyBpbiB0aGUgcmFuZ2Ugd2hlcmUgdGhlIGJhc2UgZW1pc3Npb24gcmF0ZSBjaGFuZ2VzLgovLyAgIC0gYW1vdW50c1BlclNlY29uZDogbGlxdWlkaXR5LXN0YWtlciBHTlMgcmF0ZXMgY29ycmVzcG9uZGluZyB0byB0aW1lc3RhbXBzLCBpbiB0b2tlbiBiYXNlIHVuaXRzIHBlciBzZWNvbmQuCi8vICAgLSBlcnJvcjogbmlsIHdoZW4gdGhlIGxpcXVpZGl0eS1zdGFrZXIgZGlzdHJpYnV0aW9uIHNoYXJlIGlzIGF2YWlsYWJsZTsgb3RoZXJ3aXNlIHRoZSB0YXJnZXQgbG9va3VwIGVycm9yLgpmdW5jIEdldFN0YWtlckVtaXNzaW9uQW1vdW50UGVyU2Vjb25kSW5SYW5nZShzdGFydCwgZW5kIGludDY0KSAoW11pbnQ2NCwgW11pbnQ2NCwgZXJyb3IpIHsKCWduc0hhbHZpbmdCbG9ja3MsIGduc0hhbHZpbmdFbWlzc2lvbnMgOj0gZ25zLkdldEVtaXNzaW9uQW1vdW50UGVyU2Vjb25kSW5SYW5nZShzdGFydCwgZW5kKQoJaGFsdmluZ0Jsb2NrcyA6PSBtYWtlKFtdaW50NjQsIGxlbihnbnNIYWx2aW5nQmxvY2tzKSkKCWhhbHZpbmdFbWlzc2lvbnMgOj0gbWFrZShbXWludDY0LCBsZW4oZ25zSGFsdmluZ0VtaXNzaW9ucykpCgoJcGN0LCBlcnIgOj0gR2V0RGlzdHJpYnV0aW9uQnBzUGN0KExJUVVJRElUWV9TVEFLRVIpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBuaWwsIGVycgoJfQoKCWZvciBpIDo9IHJhbmdlIGhhbHZpbmdCbG9ja3MgewoJCWhhbHZpbmdCbG9ja3NbaV0gPSBnbnNIYWx2aW5nQmxvY2tzW2ldCgkJLy8gQXBwbHlpbmcgc3Rha2VyIHJhdGlvIGZvciBwYXN0IGhhbHZpbmcgYmxvY2tzCgkJaGFsdmluZ0VtaXNzaW9uc1tpXSA9IGNhbGN1bGF0ZUFtb3VudChnbnNIYWx2aW5nRW1pc3Npb25zW2ldLCBwY3QpCgl9CgoJcmV0dXJuIGhhbHZpbmdCbG9ja3MsIGhhbHZpbmdFbWlzc2lvbnMsIG5pbAp9CgovLyBDbGVhckRpc3RyaWJ1dGVkVG9TdGFrZXIgcmVzZXRzIHRoZSBwZW5kaW5nIGRpc3RyaWJ1dGlvbiBhbW91bnQgZm9yIGxpcXVpZGl0eSBzdGFrZXJzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vCi8vIE9ubHkgY2FsbGFibGUgYnkgc3Rha2VyIGNvbnRyYWN0LgpmdW5jIENsZWFyRGlzdHJpYnV0ZWRUb1N0YWtlcihjdXIgcmVhbG0pIHsKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFjY2Vzcy5Bc3NlcnRJc1N0YWtlcihjYWxsZXIpCgoJZGlzdHJpYnV0ZWRUb1N0YWtlciA9IDAKfQoKLy8gQ2xlYXJEaXN0cmlidXRlZFRvR292U3Rha2VyIHJlc2V0cyB0aGUgcGVuZGluZyBkaXN0cmlidXRpb24gYW1vdW50IGZvciBnb3Zlcm5hbmNlIHN0YWtlcnMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8KLy8gT25seSBjYWxsYWJsZSBieSBnb3Zlcm5hbmNlIHN0YWtlciBjb250cmFjdC4KZnVuYyBDbGVhckRpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXIoY3VyIHJlYWxtKSB7CgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglhY2Nlc3MuQXNzZXJ0SXNHb3ZTdGFrZXIoY2FsbGVyKQoJZGlzdHJpYnV0ZWRUb0dvdlN0YWtlciA9IDAKfQoKLy8gc2V0RGlzdHJpYnV0aW9uQnBzUGN0IGNoYW5nZXMgcGVyY2VudGFnZSBvZiBlYWNoIHRhcmdldCBmb3IgaG93IG11Y2ggR05TIGl0IHdpbGwgZ2V0IGJ5IGVtaXNzaW9uLgovLyBDcmVhdGVzIG5ldyBtYXAgaWYgbmlsLgpmdW5jIHNldERpc3RyaWJ1dGlvbkJwc1BjdCh0YXJnZXQgaW50LCBwY3QgaW50NjQpIHsKCWlmIGRpc3RyaWJ1dGlvbkJwc1BjdCA9PSBuaWwgewoJCWRpc3RyaWJ1dGlvbkJwc1BjdCA9IG1ha2UobWFwW2ludF1pbnQ2NCkKCX0KCglkaXN0cmlidXRpb25CcHNQY3RbdGFyZ2V0XSA9IHBjdAp9CgovLyB0YXJnZXRUb1N0ciBjb252ZXJ0cyB0YXJnZXQgY29uc3RhbnQgdG8gc3RyaW5nIHJlcHJlc2VudGF0aW9uLgpmdW5jIHRhcmdldFRvU3RyKHRhcmdldCBpbnQpIHN0cmluZyB7Cglzd2l0Y2ggdGFyZ2V0IHsKCWNhc2UgTElRVUlESVRZX1NUQUtFUjoKCQlyZXR1cm4gIkxJUVVJRElUWV9TVEFLRVIiCgljYXNlIERFVk9QUzoKCQlyZXR1cm4gIkRFVk9QUyIKCWNhc2UgQ09NTVVOSVRZX1BPT0w6CgkJcmV0dXJuICJDT01NVU5JVFlfUE9PTCIKCWNhc2UgR09WX1NUQUtFUjoKCQlyZXR1cm4gIkdPVl9TVEFLRVIiCglkZWZhdWx0OgoJCXJldHVybiAiVU5LTk9XTiIKCX0KfQoarwoKB2RvYy5nbm8SowovLyBQYWNrYWdlIGVtaXNzaW9uIG1hbmFnZXMgR05TIHRva2VuIGVtaXNzaW9uIGFuZCBkaXN0cmlidXRpb24gZm9yIEdub1N3YXAuCi8vCi8vIFRoZSBlbWlzc2lvbiBzeXN0ZW0gY29udHJvbHMgY3JlYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBvZiBuZXcgR05TIHRva2VucwovLyB3aXRoIGEgZGVmbGF0aW9uYXJ5IG1vZGVsIGZlYXR1cmluZyBwZXJpb2RpYyBoYWx2aW5ncyBvdmVyIDEyIHllYXJzLgovLwovLyBFbWlzc2lvbiBTY2hlZHVsZToKLy8gICAtIFllYXIgMS0yOiAgMTAwJSBlbWlzc2lvbiByYXRlICgyMjUsMDAwLDAwMCBHTlMveWVhcikKLy8gICAtIFllYXIgMy00OiAgIDUwJSBlbWlzc2lvbiByYXRlICgxMTIsNTAwLDAwMCBHTlMveWVhcikKLy8gICAtIFllYXIgNS02OiAgIDI1JSBlbWlzc2lvbiByYXRlICAoNTYsMjUwLDAwMCBHTlMveWVhcikKLy8gICAtIFllYXIgNy04OiAgMTIuNSUgZW1pc3Npb24gcmF0ZSAoMjgsMTI1LDAwMCBHTlMveWVhcikKLy8gICAtIFllYXIgOS0xMjogIDYuMjUlIGVtaXNzaW9uIHJhdGUgKDE0LDA2Miw1MDAgR05TL3llYXIpCi8vCi8vIERpc3RyaWJ1dGlvbiBUYXJnZXRzIChjb25maWd1cmFibGUgdmlhIGFkbWluIG9yIGdvdmVybmFuY2UpOgovLyAgIC0gTElRVUlESVRZX1NUQUtFUjogUmV3YXJkcyBmb3IgTFAgcHJvdmlkZXJzIChkZWZhdWx0IDc1JSkKLy8gICAtIERFVk9QUzogRGV2ZWxvcG1lbnQgYW5kIG9wZXJhdGlvbnMgZnVuZCAoZGVmYXVsdCAyMCUpCi8vICAgLSBDT01NVU5JVFlfUE9PTDogQ29tbXVuaXR5IHRyZWFzdXJ5IChkZWZhdWx0IDUlKQovLyAgIC0gR09WX1NUQUtFUjogR05TIHN0YWtpbmcgcmV3YXJkcyAoZGVmYXVsdCAwJSkKLy8KLy8gS2V5IEZ1bmN0aW9uczoKLy8gICAtIE1pbnRBbmREaXN0cmlidXRlR25zOiBNaW50cyBhbmQgZGlzdHJpYnV0ZXMgR05TIHBlciBlbWlzc2lvbiBzY2hlZHVsZTsKLy8gICAgIHJldHVybnMgZmFsc2Ugb25seSB3aGVuIGVtaXNzaW9uIGlzIGhhbHRlZC4KLy8gICAtIFNldERpc3RyaWJ1dGlvblN0YXJ0VGltZTogU2V0cyBvciByZXNjaGVkdWxlcyB0aGUgc3RhcnQgdGltZXN0YW1wIHdoaWxlCi8vICAgICBpdCBpcyBzdGlsbCBpbiB0aGUgZnV0dXJlOyB0aGUgdGltZXN0YW1wIGlzIGltbXV0YWJsZSBvbmNlIGFjdGl2ZS4KLy8gICAtIENoYW5nZURpc3RyaWJ1dGlvblBjdDogVXBkYXRlcyBkaXN0cmlidXRpb24gcGVyY2VudGFnZXMKLy8gICAtIENsZWFyRGlzdHJpYnV0ZWRUb1N0YWtlci9Hb3ZTdGFrZXI6IFJlc2V0cyBwZW5kaW5nIGRpc3RyaWJ1dGlvbiBhbW91bnRzCnBhY2thZ2UgZW1pc3Npb24KGoxRCgxlbWlzc2lvbi5nbm8S+1BwYWNrYWdlIGVtaXNzaW9uCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkibWF0aCIKCSJ0aW1lIgoKCWduc21hdGggImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJImduby5sYW5kL3AvZ25vc3dhcC91dGlscy92MSIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvZ25zIgoJImduby5sYW5kL3IvZ25vc3dhcC9oYWx0L3YxIgopCgpjb25zdCAoCgl0b3RhbERpc3RyaWJ1dGlvbkR1cmF0aW9uID0gMTIgKiAzNjUgKiAyNCAqIDYwICogNjAgLy8gMTIgeWVhcnMKCgkvLyBEZWZhdWx0SW5pdGlhbFBvb2xUaWVyUGF0aCBpcyB0aGUgY2Fub25pY2FsIGRlZmF1bHQgaW5pdGlhbCBwb29sIHRoYXQgbXVzdAoJLy8gZXhpc3QgYmVmb3JlIGVtaXNzaW9uIGRpc3RyaWJ1dGlvbiBjYW4gc3RhcnQuIFRoZSBwb29sIGNvbnRyYWN0IHJlZ2lzdGVycyBhCgkvLyBjaGVja2VyIChTZXREZWZhdWx0SW5pdGlhbFBvb2xDaGVja2VyKSB0aGF0IHZlcmlmaWVzIHRoaXMgcG9vbCBleGlzdHMuCglEZWZhdWx0SW5pdGlhbFBvb2xUaWVyUGF0aCA9ICJnbm8ubGFuZC9yL2dub2xhbmQvd3Vnbm90Lnd1Z25vdDpnbm8ubGFuZC9yL2dub3N3YXAvZ25zLkdOUzozMDAwIgopCgp2YXIgKAoJLy8gbGVmdEdOU0Ftb3VudCB0cmFja3MgdW5kaXN0cmlidXRlZCBHTlMgdG9rZW5zIGZyb20gcHJldmlvdXMgZGlzdHJpYnV0aW9ucwoJbGVmdEdOU0Ftb3VudCBpbnQ2NAoKCS8vIGxhc3RFeGVjdXRlZFRpbWVzdGFtcCBzdG9yZXMgdGhlIGxhc3QgdGltZXN0YW1wIHdoZW4gZGlzdHJpYnV0aW9uIHdhcyBleGVjdXRlZAoJbGFzdEV4ZWN1dGVkVGltZXN0YW1wIGludDY0CgoJLy8gZW1pc3Npb25BZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbWlzc2lvbiByZWFsbQoJZW1pc3Npb25BZGRyIGFkZHJlc3MKCgkvLyBkaXN0cmlidXRpb25TdGFydFRpbWVzdGFtcCBpcyB0aGUgdGltZXN0YW1wIGZyb20gd2hpY2ggZW1pc3Npb24gZGlzdHJpYnV0aW9uIHN0YXJ0cwoJLy8gRGVmYXVsdCBpcyAwLCBtZWFuaW5nIGRpc3RyaWJ1dGlvbiBpcyBub3Qgc3RhcnRlZCB1bnRpbCBleHBsaWNpdGx5IHNldAoJZGlzdHJpYnV0aW9uU3RhcnRUaW1lc3RhbXAgaW50NjQKCgkvLyBvbkRpc3RyaWJ1dGlvblBjdENoYW5nZUNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIGRpc3RyaWJ1dGlvbiBwZXJjZW50YWdlcyBjaGFuZ2UKCS8vIFRoaXMgYWxsb3dzIGV4dGVybmFsIGNvbnRyYWN0cyAobGlrZSBzdGFrZXIpIHRvIHVwZGF0ZSB0aGVpciBjYWNoZXMKCW9uRGlzdHJpYnV0aW9uUGN0Q2hhbmdlQ2FsbGJhY2sgZnVuYyhjdXIgcmVhbG0sIGVtaXNzaW9uQW1vdW50UGVyU2Vjb25kIGludDY0KQoKCS8vIGRlZmF1bHRJbml0aWFsUG9vbENoZWNrZXIgdmVyaWZpZXMgdGhlIGNhbm9uaWNhbCBkZWZhdWx0IGluaXRpYWwgcG9vbCBleGlzdHMuCgkvLyBJdCBpcyByZWdpc3RlcmVkIGJ5IHBvb2wvdjEgYXQgaW5pdGlhbGl6YXRpb24gdGltZSBzbyB0aGF0IGVtaXNzaW9uIGRvZXMgbm90CgkvLyBuZWVkIGEgY29tcGlsZS10aW1lIGRlcGVuZGVuY3kgb24gdGhlIHBvb2wgcmVhbG0uCglkZWZhdWx0SW5pdGlhbFBvb2xDaGVja2VyIGZ1bmMocG9vbFBhdGggc3RyaW5nKSBib29sCikKCmZ1bmMgaW5pdChjdXIgcmVhbG0pIHsKCWVtaXNzaW9uQWRkciA9IGN1ci5BZGRyZXNzKCkKfQoKLy8gc2V0TGVmdEdOU0Ftb3VudCB1cGRhdGVzIHRoZSB1bmRpc3RyaWJ1dGVkIEdOUyB0b2tlbiBhbW91bnQKZnVuYyBzZXRMZWZ0R05TQW1vdW50KGFtb3VudCBpbnQ2NCkgewoJaWYgYW1vdW50IDwgMCB7CgkJcGFuaWMoImxlZnQgR05TIGFtb3VudCBjYW5ub3QgYmUgbmVnYXRpdmUiKQoJfQoKCWxlZnRHTlNBbW91bnQgPSBhbW91bnQKfQoKLy8gc2V0TGFzdEV4ZWN1dGVkVGltZXN0YW1wIHVwZGF0ZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBlbWlzc2lvbiBkaXN0cmlidXRpb24gZXhlY3V0aW9uLgpmdW5jIHNldExhc3RFeGVjdXRlZFRpbWVzdGFtcCh0aW1lc3RhbXAgaW50NjQpIHsKCWlmIHRpbWVzdGFtcCA8IDAgewoJCXBhbmljKCJsYXN0IGV4ZWN1dGVkIHRpbWVzdGFtcCBjYW5ub3QgYmUgbmVnYXRpdmUiKQoJfQoKCWxhc3RFeGVjdXRlZFRpbWVzdGFtcCA9IHRpbWVzdGFtcAp9CgovLyBNaW50QW5kRGlzdHJpYnV0ZUducyBtaW50cyBhbmQgZGlzdHJpYnV0ZXMgR05TIHRva2VucyBhY2NvcmRpbmcgdG8gdGhlIGVtaXNzaW9uIHNjaGVkdWxlLgovLwovLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHByb3RvY29sIGNvbnRyYWN0cyBkdXJpbmcgdXNlciBpbnRlcmFjdGlvbnMKLy8gdG8gdHJpZ2dlciBwZXJpb2RpYyBHTlMgZW1pc3Npb24uIEl0IG1pbnRzIG5ldyB0b2tlbnMgYmFzZWQgb24gZWxhcHNlZCB0aW1lIHNpbmNlCi8vIGxhc3QgZGlzdHJpYnV0aW9uIGFuZCBkaXN0cmlidXRlcyB0aGVtIHRvIHByZWRlZmluZWQgdGFyZ2V0cyAoc3Rha2VyLCBkZXZvcHMsIGV0Yy4pLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBkaXN0cmlidXRlZEFtb3VudDogdG90YWwgYW1vdW50IG9mIEdOUyBkaXN0cmlidXRlZCBpbiB0aGlzIGNhbGwKLy8gICAtIHN1Y2Nlc3M6IGZhbHNlIG9ubHkgd2hlbiBlbWlzc2lvbiBpcyBoYWx0ZWQ7IHRydWUgd2hlbiBwcm9jZXNzaW5nIGNvbXBsZXRlcywgZXZlbiBpZiBubyB0b2tlbnMgYXJlIGRpc3RyaWJ1dGVkCi8vCi8vIE5vdGU6IERpc3RyaWJ1dGlvbiBvbmx5IG9jY3VycyBpZiBzdGFydCB0aW1lc3RhbXAgaXMgc2V0IGFuZCByZWFjaGVkLgovLyBBbnkgdW5kaXN0cmlidXRlZCB0b2tlbnMgZnJvbSBwcmV2aW91cyBjYWxscyBhcmUgY2FycmllZCBmb3J3YXJkLgpmdW5jIE1pbnRBbmREaXN0cmlidXRlR25zKGN1ciByZWFsbSkgKGludDY0LCBib29sKSB7CglpZiBoYWx0LklzSGFsdGVkRW1pc3Npb24oKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CgoJY3VycmVudEhlaWdodCA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWN1cnJlbnRUaW1lc3RhbXAgOj0gdGltZS5Ob3coKS5Vbml4KCkKCgkvLyBDaGVjayBpZiBkaXN0cmlidXRpb24gc3RhcnQgdGltZXN0YW1wIGlzIHNldCBhbmQgaWYgY3VycmVudCB0aW1lc3RhbXAgaGFzIHJlYWNoZWQgaXQKCS8vIElmIGRpc3RyaWJ1dGlvblN0YXJ0VGltZXN0YW1wIGlzIDAgKGRlZmF1bHQpLCBza2lwIGRpc3RyaWJ1dGlvbiB0byBwcmV2ZW50IGltbWVkaWF0ZSBzdGFydAoJLy8gSWYgY3VycmVudCB0aW1lc3RhbXAgaXMgYmVsb3cgc3RhcnQgdGltZXN0YW1wLCBza2lwIGRpc3RyaWJ1dGlvbgoJaWYgZGlzdHJpYnV0aW9uU3RhcnRUaW1lc3RhbXAgPT0gMCB8fCBjdXJyZW50VGltZXN0YW1wIDwgZGlzdHJpYnV0aW9uU3RhcnRUaW1lc3RhbXAgewoJCXJldHVybiAwLCB0cnVlCgl9CgoJLy8gU2tpcCBpZiB3ZSd2ZSBhbHJlYWR5IG1pbnRlZCB0b2tlbnMgYXQgdGhpcyB0aW1lc3RhbXAKCWxhc3RNaW50ZWRUaW1lc3RhbXAgOj0gZ25zLkxhc3RNaW50ZWRUaW1lc3RhbXAoKQoJaWYgY3VycmVudFRpbWVzdGFtcCA8PSBsYXN0TWludGVkVGltZXN0YW1wIHsKCQlyZXR1cm4gMCwgdHJ1ZQoJfQoKCS8vIEFkZGl0aW9uYWwgY2hlY2sgdG8gcHJldmVudCByZS1lbnRyYW5jeQoJaWYgbGFzdEV4ZWN1dGVkVGltZXN0YW1wID49IGN1cnJlbnRUaW1lc3RhbXAgewoJCS8vIFNraXAgaWYgd2UndmUgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBoZWlnaHQgaW4gZW1pc3Npb24KCQlyZXR1cm4gMCwgdHJ1ZQoJfQoKCS8vIE1pbnQgbmV3IHRva2VucyBhbmQgYWRkIGFueSBsZWZ0b3ZlciBhbW91bnRzIGZyb20gcHJldmlvdXMgZGlzdHJpYnV0aW9uCgltaW50ZWRFbWlzc2lvblJld2FyZEFtb3VudCA6PSBnbnMuTWludEducyhjcm9zcyhjdXIpLCBlbWlzc2lvbkFkZHIpCgoJLy8gVmFsaWRhdGUgbWludGVkIGFtb3VudAoJaWYgbWludGVkRW1pc3Npb25SZXdhcmRBbW91bnQgPCAwIHsKCQlwYW5pYygibWludGVkIGVtaXNzaW9uIHJld2FyZCBhbW91bnQgY2Fubm90IGJlIG5lZ2F0aXZlIikKCX0KCglkaXN0cmlidXRhYmxlQW1vdW50IDo9IG1pbnRlZEVtaXNzaW9uUmV3YXJkQW1vdW50CglwcmV2TGVmdEFtb3VudCA6PSBHZXRMZWZ0R05TQW1vdW50KCkKCglpZiBsZWZ0R05TQW1vdW50ID4gMCB7CgkJLy8gQ2hlY2sgZm9yIG92ZXJmbG93IGJlZm9yZSBhZGRpdGlvbgoJCWlmIGRpc3RyaWJ1dGFibGVBbW91bnQgPiBtYXRoLk1heEludDY0LXByZXZMZWZ0QW1vdW50IHsKCQkJcGFuaWMoImRpc3RyaWJ1dGFibGUgYW1vdW50IHdvdWxkIG92ZXJmbG93IikKCQl9CgoJCWRpc3RyaWJ1dGFibGVBbW91bnQgKz0gcHJldkxlZnRBbW91bnQKCQlzZXRMZWZ0R05TQW1vdW50KDApCgl9CgoJZGlzdHJpYnV0YWJsZSwgbGVmdEFtb3VudCA6PSBjYWxjdWxhdGVEaXN0cmlidXRhYmxlQW1vdW50cyhkaXN0cmlidXRhYmxlQW1vdW50KQoJdG90YWxEaXN0QW1vdW50IDo9IGduc21hdGguU2FmZVN1YkludDY0KGRpc3RyaWJ1dGFibGVBbW91bnQsIGxlZnRBbW91bnQpCglpZiBsZWZ0QW1vdW50ID4gMCB7CgkJc2V0TGVmdEdOU0Ftb3VudChsZWZ0QW1vdW50KQoJfQoJc2V0TGFzdEV4ZWN1dGVkVGltZXN0YW1wKGN1cnJlbnRUaW1lc3RhbXApCgoJYW1vdW50QnlBZGRyZXNzLCBlcnIgOj0gYXBwbHlEaXN0cmlidXRpb24oZGlzdHJpYnV0YWJsZSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglpZiBlcnIgOj0gdHJhbnNmZXJUb1RhcmdldCgwLCBjdXIsIGFtb3VudEJ5QWRkcmVzcyk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglzdGFrZXJQY3QsIGVyciA6PSBHZXREaXN0cmlidXRpb25CcHNQY3QoTElRVUlESVRZX1NUQUtFUikKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXN0YWtlclJld2FyZFBlclNlY29uZCA6PSBHZXRFbWlzc2lvbkFtb3VudFBlclNlY29uZEJ5KGN1cnJlbnRUaW1lc3RhbXAsIHN0YWtlclBjdCkKCglnb3ZTdGFrZXJQY3QsIGVyciA6PSBHZXREaXN0cmlidXRpb25CcHNQY3QoR09WX1NUQUtFUikKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWdvdlN0YWtlclJld2FyZFBlclNlY29uZCA6PSBHZXRFbWlzc2lvbkFtb3VudFBlclNlY29uZEJ5KGN1cnJlbnRUaW1lc3RhbXAsIGdvdlN0YWtlclBjdCkKCglwcmV2aW91c1JlYWxtIDo9IGN1ci5QcmV2aW91cygpCgljaGFpbi5FbWl0KAoJCSJNaW50QW5kRGlzdHJpYnV0ZUducyIsCgkJInByZXZBZGRyIiwgcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkuU3RyaW5nKCksCgkJInByZXZSZWFsbSIsIHByZXZpb3VzUmVhbG0uUGtnUGF0aCgpLAoJCSJsYXN0VGltZXN0YW1wIiwgdXRpbHMuRm9ybWF0SW50KGxhc3RFeGVjdXRlZFRpbWVzdGFtcCksCgkJImN1cnJlbnRUaW1lc3RhbXAiLCB1dGlscy5Gb3JtYXRJbnQoY3VycmVudFRpbWVzdGFtcCksCgkJImN1cnJlbnRIZWlnaHQiLCB1dGlscy5Gb3JtYXRJbnQoY3VycmVudEhlaWdodCksCgkJIm1pbnRlZEFtb3VudCIsIHV0aWxzLkZvcm1hdEludChtaW50ZWRFbWlzc2lvblJld2FyZEFtb3VudCksCgkJInByZXZMZWZ0QW1vdW50IiwgdXRpbHMuRm9ybWF0SW50KHByZXZMZWZ0QW1vdW50KSwKCQkiZGlzdHJpYnV0ZWRBbW91bnQiLCB1dGlscy5Gb3JtYXRJbnQodG90YWxEaXN0QW1vdW50KSwKCQkiY3VycmVudExlZnRBbW91bnQiLCB1dGlscy5Gb3JtYXRJbnQoR2V0TGVmdEdOU0Ftb3VudCgpKSwKCQkiZ25zVG90YWxTdXBwbHkiLCB1dGlscy5Gb3JtYXRJbnQoZ25zLlRvdGFsU3VwcGx5KCkpLAoJCSJzdGFrZXJSZXdhcmRQZXJTZWNvbmQiLCB1dGlscy5Gb3JtYXRJbnQoc3Rha2VyUmV3YXJkUGVyU2Vjb25kKSwKCQkiZ292U3Rha2VyUmV3YXJkUGVyU2Vjb25kIiwgdXRpbHMuRm9ybWF0SW50KGdvdlN0YWtlclJld2FyZFBlclNlY29uZCksCgkpCgoJcmV0dXJuIHRvdGFsRGlzdEFtb3VudCwgdHJ1ZQp9CgovLyBTZXREaXN0cmlidXRpb25TdGFydFRpbWUgc2V0cyB0aGUgdGltZXN0YW1wIHdoZW4gZW1pc3Npb24gZGlzdHJpYnV0aW9uIHN0YXJ0cy4KLy8KLy8gVGhpcyBmdW5jdGlvbiBjb250cm9scyB3aGVuIEdOUyBlbWlzc2lvbiBiZWdpbnMuIEJlZm9yZSB0aGUgY29uZmlndXJlZAovLyB0aW1lc3RhbXAgaXMgcmVhY2hlZCwgYW4gYWRtaW4gb3IgZ292ZXJuYW5jZSBjYWxsZXIgbWF5IHJlc2NoZWR1bGUgaXQuIE9uY2UKLy8gdGhlIHRpbWVzdGFtcCBpcyByZWFjaGVkLCB0aGUgc3RhcnQgdGltZSBpcyBpbW11dGFibGUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIHN0YXJ0VGltZXN0YW1wOiBwb3NpdGl2ZSBmdXR1cmUgVW5peCB0aW1lc3RhbXAgd2hlbiBlbWlzc2lvbiBzaG91bGQgYmVnaW4uCi8vCi8vIFJlcXVpcmVtZW50czoKLy8gICAtIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBkaXN0cmlidXRpb24gc3RhcnRzLgovLyAgIC0gVGltZXN0YW1wIG11c3QgYmUgaW4gdGhlIGZ1dHVyZSBhbmQgbGVhdmUgcm9vbSBmb3IgdGhlIDEyLXllYXIgc2NoZWR1bGUuCi8vCi8vIEVmZmVjdHM6Ci8vICAgLSBTZXRzIGdsb2JhbCBkaXN0cmlidXRpb24gc3RhcnQgdGltZS4KLy8gICAtIEluaXRpYWxpemVzIEdOUyBlbWlzc2lvbiBzdGF0ZSBpZiBub3QgYWxyZWFkeSBzdGFydGVkLgovLyAgIC0gRW1pc3Npb24gYmVnaW5zIGF1dG9tYXRpY2FsbHkgd2hlbiB0aW1lc3RhbXAgaXMgcmVhY2hlZC4KLy8KLy8gT25seSBjYWxsYWJsZSBieSBhZG1pbiBvciBnb3Zlcm5hbmNlLgpmdW5jIFNldERpc3RyaWJ1dGlvblN0YXJ0VGltZShjdXIgcmVhbG0sIHN0YXJ0VGltZXN0YW1wIGludDY0KSB7CgloYWx0LkFzc2VydElzTm90SGFsdGVkRW1pc3Npb24oKQoKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFjY2Vzcy5Bc3NlcnRJc0FkbWluT3JHb3Zlcm5hbmNlKGNhbGxlcikKCWFzc2VydERlZmF1bHRJbml0aWFsUG9vbEV4aXN0cygpCgoJaWYgc3RhcnRUaW1lc3RhbXAgPD0gMCB7CgkJcGFuaWMoImRpc3RyaWJ1dGlvbiBzdGFydCB0aW1lc3RhbXAgbXVzdCBiZSBwb3NpdGl2ZSIpCgl9CgoJaWYgc3RhcnRUaW1lc3RhbXAgPiBtYXRoLk1heEludDY0LXRvdGFsRGlzdHJpYnV0aW9uRHVyYXRpb24gewoJCXBhbmljKCJkaXN0cmlidXRpb24gZW5kIHRpbWVzdGFtcCBtdXN0IGJlIGJlZm9yZSBtYXggaW50NjQgdGltZXN0YW1wIikKCX0KCgljdXJyZW50VGltZXN0YW1wIDo9IHRpbWUuTm93KCkuVW5peCgpCgoJLy8gTXVzdCBiZSBpbiB0aGUgZnV0dXJlLgoJaWYgc3RhcnRUaW1lc3RhbXAgPD0gY3VycmVudFRpbWVzdGFtcCB7CgkJcGFuaWMoImRpc3RyaWJ1dGlvbiBzdGFydCB0aW1lc3RhbXAgbXVzdCBiZSBncmVhdGVyIHRoYW4gY3VycmVudCB0aW1lc3RhbXAiKQoJfQoKCS8vIENhbm5vdCBjaGFuZ2UgYWZ0ZXIgZGlzdHJpYnV0aW9uIHN0YXJ0ZWQuCglpZiBkaXN0cmlidXRpb25TdGFydFRpbWVzdGFtcCAhPSAwICYmIGRpc3RyaWJ1dGlvblN0YXJ0VGltZXN0YW1wIDw9IGN1cnJlbnRUaW1lc3RhbXAgewoJCXBhbmljKCJkaXN0cmlidXRpb24gaGFzIGFscmVhZHkgc3RhcnRlZCwgY2Fubm90IGNoYW5nZSBzdGFydCB0aW1lc3RhbXAiKQoJfQoKCXByZXZTdGFydFRpbWVzdGFtcCA6PSBkaXN0cmlidXRpb25TdGFydFRpbWVzdGFtcAoKCWlmIGducy5NaW50ZWRFbWlzc2lvbkFtb3VudCgpID09IDAgewoJCWN1cnJlbnRIZWlnaHQgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgkJZ25zLkluaXRFbWlzc2lvblN0YXRlKGNyb3NzKGN1ciksIGN1cnJlbnRIZWlnaHQsIHN0YXJ0VGltZXN0YW1wKQoJfQoKCWRpc3RyaWJ1dGlvblN0YXJ0VGltZXN0YW1wID0gc3RhcnRUaW1lc3RhbXAKCgljaGFpbi5FbWl0KAoJCSJTZXREaXN0cmlidXRpb25TdGFydFRpbWUiLAoJCSJjYWxsZXIiLCBjYWxsZXIuU3RyaW5nKCksCgkJInByZXZTdGFydFRpbWVzdGFtcCIsIHV0aWxzLkZvcm1hdEludChwcmV2U3RhcnRUaW1lc3RhbXApLAoJCSJuZXdTdGFydFRpbWVzdGFtcCIsIHV0aWxzLkZvcm1hdEludChzdGFydFRpbWVzdGFtcCksCgkJImhlaWdodCIsIHV0aWxzLkZvcm1hdEludChydW50aW1lLkNoYWluSGVpZ2h0KCkpLAoJCSJ0aW1lc3RhbXAiLCB1dGlscy5Gb3JtYXRJbnQodGltZS5Ob3coKS5Vbml4KCkpLAoJKQp9CgovLyBTZXRPbkRpc3RyaWJ1dGlvblBjdENoYW5nZUNhbGxiYWNrIHJlZ2lzdGVycyB0aGUgb3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCB3aGVuCi8vIGRpc3RyaWJ1dGlvbiBwZXJjZW50YWdlcyBjaGFuZ2UuIEEgbmlsIGNhbGxiYWNrIGNsZWFycyB0aGUgcmVnaXN0cmF0aW9uLgovLyBUaGlzIGFsbG93cyBleHRlcm5hbCBjb250cmFjdHMgKGxpa2Ugc3Rha2VyKSB0byB1cGRhdGUgdGhlaXIgaW50ZXJuYWwgY2FjaGVzCi8vIHdoZW4gZ292ZXJuYW5jZSBvciBhZG1pbiBjaGFuZ2VzIGVtaXNzaW9uIHJhdGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBjYWxsYmFjazogbmlsIHRvIGNsZWFyIHRoZSBjYWxsYmFjaywgb3IgYSBmdW5jdGlvbiByZWNlaXZpbmcgaXRzIGNhbGxiYWNrCi8vICAgICByZWFsbSBjb250ZXh0IGFuZCB0aGUgY3VycmVudCBzdGFrZXIgR05TIGVtaXNzaW9uIHJhdGUgcGVyIHNlY29uZDsgYSBub25uaWwKLy8gICAgIGNhbGxiYWNrIGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVnaXN0cmF0aW9uLgpmdW5jIFNldE9uRGlzdHJpYnV0aW9uUGN0Q2hhbmdlQ2FsbGJhY2soY3VyIHJlYWxtLCBjYWxsYmFjayBmdW5jKGN1ciByZWFsbSwgZW1pc3Npb25BbW91bnRQZXJTZWNvbmQgaW50NjQpKSB7CgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglhY2Nlc3MuQXNzZXJ0SXNTdGFrZXIoY2FsbGVyKQoKCWlmIGNhbGxiYWNrID09IG5pbCB7CgkJb25EaXN0cmlidXRpb25QY3RDaGFuZ2VDYWxsYmFjayA9IG5pbAoJCXJldHVybgoJfQoKCWVtaXNzaW9uQW1vdW50UGVyU2Vjb25kLCBlcnIgOj0gR2V0U3Rha2VyRW1pc3Npb25BbW91bnRQZXJTZWNvbmQoKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCW9uRGlzdHJpYnV0aW9uUGN0Q2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjawoJb25EaXN0cmlidXRpb25QY3RDaGFuZ2VDYWxsYmFjayhjcm9zcyhjdXIpLCBlbWlzc2lvbkFtb3VudFBlclNlY29uZCkKfQoKLy8gU2V0RGVmYXVsdEluaXRpYWxQb29sQ2hlY2tlciByZWdpc3RlcnMgdGhlIGNhbGxiYWNrIHRoYXQgdmVyaWZpZXMgdGhlCi8vIGNhbm9uaWNhbCBkZWZhdWx0IGluaXRpYWwgcG9vbCBleGlzdHMgYmVmb3JlIGVtaXNzaW9uIHN0YXJ0cy4KLy8KLy8gVGhlIGNoZWNrZXIgcmVjZWl2ZXMgdGhlIHBvb2wgcGF0aCBhcyBhIHBhcmFtZXRlciBzbyBlbWlzc2lvbiBvd25zIHRoZQovLyBjYW5vbmljYWwgcGF0aCBwb2xpY3kgKERlZmF1bHRJbml0aWFsUG9vbFRpZXJQYXRoKSB3aGlsZSBwb29sIHN1cHBsaWVzIG9ubHkKLy8gdGhlIGdlbmVyaWMgImRvZXMgdGhpcyBwb29sIGV4aXN0IiBjYXBhYmlsaXR5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBjaGVja2VyOiBub25uaWwgZnVuY3Rpb24gcmV0dXJuaW5nIHRydWUgd2hlbiB0aGUgc3VwcGxpZWQgcG9vbCBwYXRoIGV4aXN0czsKLy8gICAgIGl0IGlzIGNhbGxlZCB3aXRoIERlZmF1bHRJbml0aWFsUG9vbFRpZXJQYXRoIGFuZCBuaWwgY2F1c2VzIGEgcGFuaWMuCi8vCi8vIE9ubHkgY2FsbGFibGUgYnkgdGhlIHBvb2wgY29udHJhY3QuCmZ1bmMgU2V0RGVmYXVsdEluaXRpYWxQb29sQ2hlY2tlcihjdXIgcmVhbG0sIGNoZWNrZXIgZnVuYyhwb29sUGF0aCBzdHJpbmcpIGJvb2wpIHsKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFjY2Vzcy5Bc3NlcnRJc1Bvb2woY2FsbGVyKQoKCWlmIGNoZWNrZXIgPT0gbmlsIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkRW1pc3Npb25TdGFydCwgImRlZmF1bHQgaW5pdGlhbCBwb29sIGNoZWNrZXIgY2Fubm90IGJlIG5pbCIpKQoJfQoKCWRlZmF1bHRJbml0aWFsUG9vbENoZWNrZXIgPSBjaGVja2VyCn0KGtQFCgplcnJvcnMuZ25vEsUFcGFja2FnZSBlbWlzc2lvbgoKaW1wb3J0ICgKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKY29uc3QgKAoJZXJySW52YWxpZEVtaXNzaW9uVGFyZ2V0ICAgICAgID0gIltHTk9TV0FQLUVNSVNTSU9OLTAwMV0gaW52YWxpZCBlbWlzc2lvbiB0YXJnZXQiCgllcnJJbnZhbGlkRW1pc3Npb25QY3QgICAgICAgICAgPSAiW0dOT1NXQVAtRU1JU1NJT04tMDAyXSBpbnZhbGlkIGVtaXNzaW9uIHBlcmNlbnRhZ2UiCgllcnJEdXBsaWNhdGVUYXJnZXQgICAgICAgICAgICAgPSAiW0dOT1NXQVAtRU1JU1NJT04tMDAzXSBkdXBsaWNhdGUgZW1pc3Npb24gdGFyZ2V0IgoJZXJyRGlzdHJpYnV0aW9uQWRkcmVzc05vdEZvdW5kID0gIltHTk9TV0FQLUVNSVNTSU9OLTAwNF0gZGlzdHJpYnV0aW9uIGFkZHJlc3Mgbm90IGZvdW5kIgoJZXJySW52YWxpZEVtaXNzaW9uU3RhcnQgICAgICAgID0gIltHTk9TV0FQLUVNSVNTSU9OLTAwNV0gaW52YWxpZCBlbWlzc2lvbiBzdGFydCIKKQoKLy8gbWFrZUVycm9yV2l0aERldGFpbHMgY3JlYXRlcyBhIG5ldyBlcnJvciBieSBjb21iaW5pbmcgYSBiYXNlIGVycm9yIHdpdGggYWRkaXRpb25hbCBkZXRhaWxzLgpmdW5jIG1ha2VFcnJvcldpdGhEZXRhaWxzKG1lc3NhZ2Ugc3RyaW5nLCBkZXRhaWwgc3RyaW5nKSBlcnJvciB7CglyZXR1cm4gdWZtdC5FcnJvcmYoIiVzIHx8ICVzIiwgbWVzc2FnZSwgZGV0YWlsKQp9ChrRGAoKZ2V0dGVyLmdubxLCGHBhY2thZ2UgZW1pc3Npb24KCmltcG9ydCAoCglnbnNtYXRoICJnbm8ubGFuZC9wL2dub3N3YXAvZ25zbWF0aC92MSIKKQoKLy8gR2V0TGVmdEdOU0Ftb3VudCByZXR1cm5zIHRoZSBhbW91bnQgb2YgdW5kaXN0cmlidXRlZCBHTlMgdG9rZW5zIGZyb20gcHJldmlvdXMgZGlzdHJpYnV0aW9ucy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogdW5kaXN0cmlidXRlZCBHTlMgYW1vdW50CmZ1bmMgR2V0TGVmdEdOU0Ftb3VudCgpIGludDY0IHsKCXJldHVybiBsZWZ0R05TQW1vdW50Cn0KCi8vIEdldERpc3RyaWJ1dGlvblN0YXJ0VGltZXN0YW1wIHJldHVybnMgdGhlIGNvbmZpZ3VyZWQgZW1pc3Npb24gc3RhcnQgdGltZXN0YW1wLgovLyBUaGUgdmFsdWUgbWF5IGJlIGluIHRoZSBmdXR1cmU7IGl0IGlzIDAgd2hlbiBubyBzdGFydCB0aW1lc3RhbXAgaXMgY29uZmlndXJlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpbWVzdGFtcDogY29uZmlndXJlZCBkaXN0cmlidXRpb24gc3RhcnQgdGltZXN0YW1wLCBvciAwIGlmIHVuY29uZmlndXJlZApmdW5jIEdldERpc3RyaWJ1dGlvblN0YXJ0VGltZXN0YW1wKCkgaW50NjQgewoJcmV0dXJuIGRpc3RyaWJ1dGlvblN0YXJ0VGltZXN0YW1wCn0KCi8vIEdldExhc3RFeGVjdXRlZFRpbWVzdGFtcCByZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZW1pc3Npb24gZGlzdHJpYnV0aW9uIGV4ZWN1dGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpbWVzdGFtcDogbGFzdCBleGVjdXRpb24gdGltZXN0YW1wCmZ1bmMgR2V0TGFzdEV4ZWN1dGVkVGltZXN0YW1wKCkgaW50NjQgewoJcmV0dXJuIGxhc3RFeGVjdXRlZFRpbWVzdGFtcAp9CgovLyBHZXRBbGxEaXN0cmlidXRpb25CcHNQY3QgcmV0dXJucyBhbGwgZGlzdHJpYnV0aW9uIHBlcmNlbnRhZ2VzIGluIGJhc2lzIHBvaW50cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHBlcmNlbnRhZ2VzOiBtYXAgb2YgdGFyZ2V0IHRvIHBlcmNlbnRhZ2UgaW4gYmFzaXMgcG9pbnRzCmZ1bmMgR2V0QWxsRGlzdHJpYnV0aW9uQnBzUGN0KCkgbWFwW2ludF1pbnQ2NCB7CglyZXN1bHQgOj0gbWFrZShtYXBbaW50XWludDY0LCBsZW4oZGlzdHJpYnV0aW9uQnBzUGN0KSkKCWlmIGRpc3RyaWJ1dGlvbkJwc1BjdCA9PSBuaWwgewoJCXJldHVybiByZXN1bHQKCX0KCglmb3IgdGFyZ2V0LCBwY3QgOj0gcmFuZ2UgZGlzdHJpYnV0aW9uQnBzUGN0IHsKCQlyZXN1bHRbdGFyZ2V0XSA9IHBjdAoJfQoKCXJldHVybiByZXN1bHQKfQoKLy8gR2V0VG90YWxBY2N1RGlzdHJpYnV0ZWQgcmV0dXJucyB0aGUgdG90YWwgYWNjdW11bGF0ZWQgZGlzdHJpYnV0ZWQgR05TIGFtb3VudC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogdG90YWwgYWNjdW11bGF0ZWQgZGlzdHJpYnV0ZWQgR05TCmZ1bmMgR2V0VG90YWxBY2N1RGlzdHJpYnV0ZWQoKSBpbnQ2NCB7CglyZXR1cm4gZ25zbWF0aC5TYWZlQWRkSW50NjQoCgkJZ25zbWF0aC5TYWZlQWRkSW50NjQoYWNjdURpc3RyaWJ1dGVkVG9TdGFrZXIsIGFjY3VEaXN0cmlidXRlZFRvRGV2T3BzKSwKCQlnbnNtYXRoLlNhZmVBZGRJbnQ2NChhY2N1RGlzdHJpYnV0ZWRUb0NvbW11bml0eVBvb2wsIGFjY3VEaXN0cmlidXRlZFRvR292U3Rha2VyKSwKCSkKfQoKLy8gR2V0VG90YWxEaXN0cmlidXRlZCByZXR1cm5zIHRoZSB0b3RhbCBwZW5kaW5nIGRpc3RyaWJ1dGVkIEdOUyBhbW91bnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IHRvdGFsIHBlbmRpbmcgZGlzdHJpYnV0ZWQgR05TCmZ1bmMgR2V0VG90YWxEaXN0cmlidXRlZCgpIGludDY0IHsKCXJldHVybiBnbnNtYXRoLlNhZmVBZGRJbnQ2NCgKCQlnbnNtYXRoLlNhZmVBZGRJbnQ2NChkaXN0cmlidXRlZFRvU3Rha2VyLCBkaXN0cmlidXRlZFRvRGV2T3BzKSwKCQlnbnNtYXRoLlNhZmVBZGRJbnQ2NChkaXN0cmlidXRlZFRvQ29tbXVuaXR5UG9vbCwgZGlzdHJpYnV0ZWRUb0dvdlN0YWtlciksCgkpCn0KCi8vIEdldERpc3RyaWJ1dGlvbkVuZFRpbWVzdGFtcCByZXR1cm5zIHRoZSB0aW1lc3RhbXAgd2hlbiBlbWlzc2lvbiBkaXN0cmlidXRpb24gZW5kcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpbWVzdGFtcDogZGlzdHJpYnV0aW9uIGVuZCB0aW1lc3RhbXAsIG9yIDAgaWYgbm90IHN0YXJ0ZWQKZnVuYyBHZXREaXN0cmlidXRpb25FbmRUaW1lc3RhbXAoKSBpbnQ2NCB7CglpZiBkaXN0cmlidXRpb25TdGFydFRpbWVzdGFtcCA9PSAwIHsKCQlyZXR1cm4gMAoJfQoKCXJldHVybiBnbnNtYXRoLlNhZmVBZGRJbnQ2NChkaXN0cmlidXRpb25TdGFydFRpbWVzdGFtcCwgdG90YWxEaXN0cmlidXRpb25EdXJhdGlvbi0xKQp9CgovLyBHZXREaXN0cmlidXRhYmxlQW1vdW50IHJldHVybnMgZGlzdHJpYnV0aW9uIGFtb3VudHMgYnkgdGFyZ2V0IGFuZCB0aGUgcmVtYWluZGVyLgovLyBJZiB0aW1lc3RhbXAgaXMgb3V0c2lkZSB0aGUgZGlzdHJpYnV0aW9uIHdpbmRvdywgaXQgcmV0dXJucyBhbiBlbXB0eSBtYXAgYW5kIHRoZSBmdWxsIGFtb3VudCBhcyBsZWZ0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYW1vdW50OiB0b3RhbCBhbW91bnQgdG8gZGlzdHJpYnV0ZQovLyAgIC0gdGltZXN0YW1wOiB0aW1lc3RhbXAgdG8gY2hlY2sgZGlzdHJpYnV0aW9uIHdpbmRvdwovLwovLyBSZXR1cm5zOgovLyAgIC0gZGlzdHJpYnV0aW9uczogbWFwIG9mIHRhcmdldCB0byBkaXN0cmlidXRpb24gYW1vdW50Ci8vICAgLSByZW1haW5kZXI6IHVuZGlzdHJpYnV0ZWQgYW1vdW50CmZ1bmMgR2V0RGlzdHJpYnV0YWJsZUFtb3VudChhbW91bnQsIHRpbWVzdGFtcCBpbnQ2NCkgKG1hcFtpbnRdaW50NjQsIGludDY0KSB7CglpZiBkaXN0cmlidXRpb25TdGFydFRpbWVzdGFtcCA9PSAwIHx8IHRpbWVzdGFtcCA8IGRpc3RyaWJ1dGlvblN0YXJ0VGltZXN0YW1wIHsKCQlyZXR1cm4gbWFrZShtYXBbaW50XWludDY0KSwgYW1vdW50Cgl9CgoJZW5kVGltZXN0YW1wIDo9IEdldERpc3RyaWJ1dGlvbkVuZFRpbWVzdGFtcCgpCglpZiBlbmRUaW1lc3RhbXAgIT0gMCAmJiB0aW1lc3RhbXAgPiBlbmRUaW1lc3RhbXAgewoJCXJldHVybiBtYWtlKG1hcFtpbnRdaW50NjQpLCBhbW91bnQKCX0KCglyZXR1cm4gY2FsY3VsYXRlRGlzdHJpYnV0YWJsZUFtb3VudHMoYW1vdW50KQp9ChpCCgtnbm9tb2QudG9tbBIzbW9kdWxlID0gImduby5sYW5kL3IvZ25vc3dhcC9lbWlzc2lvbiIKZ25vID0gIjAuOSIKGtYeCgpyZW5kZXIuZ25vEscecGFja2FnZSBlbWlzc2lvbgoKaW1wb3J0ICgKCSJzdHJpbmdzIgoJInRpbWUiCgoJImduby5sYW5kL3AvZ25vc3dhcC91dGlscy92MSIKCSJnbm8ubGFuZC9wL21vdWwvbWQvdjAiCgkiZ25vLmxhbmQvcC9tb3VsL21kdGFibGUvdjAiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCmNvbnN0IGduc0Rpc3BsYXlTY2FsZSB1aW50NjQgPSAxXzAwMF8wMDAKCi8vIFJlbmRlciByZXR1cm5zIHRoZSBjdXJyZW50IEdOUyBlbWlzc2lvbiBhbmQgZGlzdHJpYnV0aW9uIHN0YXRlLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggIT0gIiIgewoJCXJldHVybiAiNDA0XG4iCgl9CgoJb3V0IDo9IG1kLkgxKCJHTlMgRW1pc3Npb24iKSArCgkJIlxuIiArCgkJbWQuUGFyYWdyYXBoKCJBbGwgR05TIGFtb3VudHMgdXNlIGV4YWN0bHkgc2l4IGRlY2ltYWwgcGxhY2VzLiBTY2hlZHVsZSB0aW1lc3RhbXBzIGFyZSBVVEMuIikKCglzY2hlZHVsZVRhYmxlIDo9IG1kdGFibGUuVGFibGV7CgkJSGVhZGVyczogW11zdHJpbmd7IkZpZWxkIiwgIlZhbHVlIn0sCgkJUm93czogW11bXXN0cmluZ3sKCQkJeyJEaXN0cmlidXRpb24gc3RhcnQiLCBmb3JtYXRFbWlzc2lvblRpbWVzdGFtcChHZXREaXN0cmlidXRpb25TdGFydFRpbWVzdGFtcCgpLCAiTm90IHN0YXJ0ZWQiKX0sCgkJCXsiRGlzdHJpYnV0aW9uIGVuZCIsIGZvcm1hdEVtaXNzaW9uVGltZXN0YW1wKEdldERpc3RyaWJ1dGlvbkVuZFRpbWVzdGFtcCgpLCAiTm90IHNjaGVkdWxlZCIpfSwKCQkJeyJMYXN0IGV4ZWN1dGlvbiIsIGZvcm1hdEVtaXNzaW9uVGltZXN0YW1wKEdldExhc3RFeGVjdXRlZFRpbWVzdGFtcCgpLCAiTm90IHlldCBleGVjdXRlZCIpfSwKCQl9LAoJfQoJb3V0ICs9IG1kLkgyKCJEaXN0cmlidXRpb24gc2NoZWR1bGUiKSArCgkJIlxuIiArCgkJc2NoZWR1bGVUYWJsZS5TdHJpbmcoKSArCgkJIlxuIgoKCWFjY291bnRpbmdUYWJsZSA6PSBtZHRhYmxlLlRhYmxlewoJCUhlYWRlcnM6IFtdc3RyaW5neyJNZXRyaWMiLCAiQW1vdW50In0sCgkJUm93czogW11bXXN0cmluZ3sKCQkJeyJVbmRpc3RyaWJ1dGVkIEdOUyIsIGZvcm1hdEduc0Ftb3VudChHZXRMZWZ0R05TQW1vdW50KCkpfSwKCQkJeyJUb3RhbCBjdW11bGF0aXZlIGRpc3RyaWJ1dGVkIiwgZm9ybWF0R25zQW1vdW50KEdldFRvdGFsQWNjdURpc3RyaWJ1dGVkKCkpfSwKCQl9LAoJfQoJb3V0ICs9IG1kLkgyKCJEaXN0cmlidXRpb24gYWNjb3VudGluZyIpICsKCQkiXG4iICsKCQlhY2NvdW50aW5nVGFibGUuU3RyaW5nKCkgKwoJCSJcbiIgKwoJCW1kLlBhcmFncmFwaCgKCQkJIlRoZSBjdW11bGF0aXZlIHRvdGFsIGluY2x1ZGVzIGFsbG9jYXRpb25zIHNlbnQgdG8gYWxsIGZvdXIgcmVjaXBpZW50cztcbiIrCgkJCQkiRGV2T3BzIGFuZCBjb21tdW5pdHktcG9vbCByb3dzIHJlcHJlc2VudCBjb21wbGV0ZWQgZGlyZWN0LXRyYW5zZmVyIGFjY291bnRpbmcuIiwKCQkpCgoJcmVjaXBpZW50c1RhYmxlIDo9IG1kdGFibGUuVGFibGV7CgkJSGVhZGVyczogW11zdHJpbmd7IlJlY2lwaWVudCIsICJBbGxvY2F0aW9uIiwgIkN1bXVsYXRpdmUgZGlzdHJpYnV0ZWQifSwKCQlSb3dzOiBbXVtdc3RyaW5newoJCQl7IkxpcXVpZGl0eSBzdGFrZXJzIiwgZm9ybWF0RGlzdHJpYnV0aW9uUGVyY2VudChkaXN0cmlidXRpb25CcHNQY3RbTElRVUlESVRZX1NUQUtFUl0pLCBmb3JtYXRHbnNBbW91bnQoR2V0QWNjdURpc3RyaWJ1dGVkVG9TdGFrZXIoKSl9LAoJCQl7IkRldk9wcyIsIGZvcm1hdERpc3RyaWJ1dGlvblBlcmNlbnQoZGlzdHJpYnV0aW9uQnBzUGN0W0RFVk9QU10pLCBmb3JtYXRHbnNBbW91bnQoR2V0QWNjdURpc3RyaWJ1dGVkVG9EZXZPcHMoKSl9LAoJCQl7IkNvbW11bml0eSBwb29sIiwgZm9ybWF0RGlzdHJpYnV0aW9uUGVyY2VudChkaXN0cmlidXRpb25CcHNQY3RbQ09NTVVOSVRZX1BPT0xdKSwgZm9ybWF0R25zQW1vdW50KEdldEFjY3VEaXN0cmlidXRlZFRvQ29tbXVuaXR5UG9vbCgpKX0sCgkJCXsiR292ZXJuYW5jZSBzdGFrZXJzIiwgZm9ybWF0RGlzdHJpYnV0aW9uUGVyY2VudChkaXN0cmlidXRpb25CcHNQY3RbR09WX1NUQUtFUl0pLCBmb3JtYXRHbnNBbW91bnQoR2V0QWNjdURpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXIoKSl9LAoJCX0sCgl9CglvdXQgKz0gbWQuSDIoIlJlY2lwaWVudHMiKSArCgkJIlxuIiArCgkJcmVjaXBpZW50c1RhYmxlLlN0cmluZygpICsKCQkiXG4iCgoJc3Rha2luZ1RhYmxlIDo9IG1kdGFibGUuVGFibGV7CgkJSGVhZGVyczogW11zdHJpbmd7IlJlY2lwaWVudCIsICJTaW5jZSBsYXN0IGFjY291bnRpbmcgY2xlYXIifSwKCQlSb3dzOiBbXVtdc3RyaW5newoJCQl7IkxpcXVpZGl0eSBzdGFrZXJzIiwgZm9ybWF0R25zQW1vdW50KEdldERpc3RyaWJ1dGVkVG9TdGFrZXIoKSl9LAoJCQl7IkdvdmVybmFuY2Ugc3Rha2VycyIsIGZvcm1hdEduc0Ftb3VudChHZXREaXN0cmlidXRlZFRvR292U3Rha2VyKCkpfSwKCQl9LAoJfQoJb3V0ICs9IG1kLkgyKCJTdGFraW5nIGFjY291bnRpbmciKSArCgkJIlxuIiArCgkJbWQuUGFyYWdyYXBoKAoJCQkiVGhlc2UgYWxsb2NhdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudHMuXG4iKwoJCQkJIlRoZSBjb3VudGVycyBiZWxvdyBzaG93IGFtb3VudHMgc2luY2UgZWFjaCBhY2NvdW50aW5nIGNvbnRyYWN0J3MgbGFzdCBjbGVhcjsgdGhleVxuIisKCQkJCSJhcmUgbm90IHdhbGxldCBiYWxhbmNlcyBvciBjbGFpbWFibGUgYW1vdW50cy4iLAoJCSkgKwoJCXN0YWtpbmdUYWJsZS5TdHJpbmcoKQoKCXJldHVybiBvdXQKfQoKZnVuYyBmb3JtYXRFbWlzc2lvblRpbWVzdGFtcCh0aW1lc3RhbXAgaW50NjQsIHplcm9MYWJlbCBzdHJpbmcpIHN0cmluZyB7CglpZiB0aW1lc3RhbXAgPT0gMCB7CgkJcmV0dXJuIHplcm9MYWJlbAoJfQoKCXJldHVybiB0aW1lLlVuaXgodGltZXN0YW1wLCAwKS5VVEMoKS5Gb3JtYXQodGltZS5SRkMzMzM5KQp9CgpmdW5jIGZvcm1hdEduc0Ftb3VudChhbW91bnQgaW50NjQpIHN0cmluZyB7CglzaWduIDo9ICIiCgltYWduaXR1ZGUgOj0gdWludDY0KGFtb3VudCkKCWlmIGFtb3VudCA8IDAgewoJCXNpZ24gPSAiLSIKCQkvLyBBdm9pZCBvdmVyZmxvd2luZyB3aGVuIGZvcm1hdHRpbmcgdGhlIHNtYWxsZXN0IGludDY0IHZhbHVlLgoJCW1hZ25pdHVkZSA9IHVpbnQ2NCgtKGFtb3VudCArIDEpKSArIDEKCX0KCgl3aG9sZSA6PSBtYWduaXR1ZGUgLyBnbnNEaXNwbGF5U2NhbGUKCWZyYWN0aW9uIDo9IG1hZ25pdHVkZSAlIGduc0Rpc3BsYXlTY2FsZQoJcmV0dXJuIHVmbXQuU3ByaW50ZigiJXMlZC4lcyBHTlMiLCBzaWduLCB3aG9sZSwgemVyb1BhZFVuc2lnbmVkKGZyYWN0aW9uLCA2KSkKfQoKZnVuYyBmb3JtYXREaXN0cmlidXRpb25QZXJjZW50KGJwcyBpbnQ2NCkgc3RyaW5nIHsKCXNpZ24gOj0gIiIKCW1hZ25pdHVkZSA6PSB1aW50NjQoYnBzKQoJaWYgYnBzIDwgMCB7CgkJc2lnbiA9ICItIgoJCW1hZ25pdHVkZSA9IHVpbnQ2NCgtKGJwcyArIDEpKSArIDEKCX0KCgl3aG9sZSA6PSBtYWduaXR1ZGUgLyAxMDAKCWZyYWN0aW9uIDo9IG1hZ25pdHVkZSAlIDEwMAoJcmV0dXJuIHVmbXQuU3ByaW50ZigiJXMlZC4lcyUlIiwgc2lnbiwgd2hvbGUsIHplcm9QYWRVbnNpZ25lZChmcmFjdGlvbiwgMikpCn0KCmZ1bmMgemVyb1BhZFVuc2lnbmVkKHZhbHVlIHVpbnQ2NCwgd2lkdGggaW50KSBzdHJpbmcgewoJdmFsdWVTdHJpbmcgOj0gdXRpbHMuRm9ybWF0VWludCh2YWx1ZSkKCXBhZGRpbmcgOj0gd2lkdGggLSBsZW4odmFsdWVTdHJpbmcpCglpZiBwYWRkaW5nIDw9IDAgewoJCXJldHVybiB2YWx1ZVN0cmluZwoJfQoKCXJldHVybiBzdHJpbmdzLlJlcGVhdCgiMCIsIHBhZGRpbmcpICsgdmFsdWVTdHJpbmcKfQoaHgoJdXRpbHMuZ25vEhFwYWNrYWdlIGVtaXNzaW9uCiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBIRCPyM8DsSCjYyNzg1dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQAFQzqTODNN6x+jrtQkVzEPwU4XundWmhWXvhLFVPyWCFf+wO8xGcMRyuO9ixf1UotBld7iCa5A2T+7OlWhtj5AaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=