Transaction executed successfully

Transaction Details

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

Transaction hash
EAE032A6D7B1C56B2E1D20D5CB3A40DCB39C731837CC94938604309C49A2EFD3

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
157,497,795
Requested gas limit
GAS USED
131,248,212
Gas consumed
FEE
157498ugnot
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

CpmlBgoML3ZtLm1fYWRkcGtnEoelBgooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLZpAYKCWxhdW5jaHBhZBIfZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZC92MRr4IAoJUkVBRE1FLm1kEuogIyBMYXVuY2hwYWQKClRva2VuIGRpc3RyaWJ1dGlvbiBwbGF0Zm9ybSBmb3IgbGF1bmNoaW5nIHByb2plY3RzIHdpdGggdGltZS1sb2NrZWQgR05TCmRlcG9zaXRzIGFuZCBwcm9qZWN0LXRva2VuIHJld2FyZHMuCgojIyBPdmVydmlldwoKVGhlIGxhdW5jaHBhZCBzdXBwb3J0cyBwcm9qZWN0cyB3aXRoIHRocmVlIGxvY2sgdGllcnM6IDMwLCA5MCwgYW5kIDE4MCBkYXlzLgpQcm9qZWN0IGNyZWF0b3JzIGNvbmZpZ3VyZSB0aGUgcHJvamVjdC10b2tlbiByZXdhcmQgYWxsb2NhdGlvbiBmb3IgZWFjaCB0aWVyLAphbmQgZGVwb3NpdG9ycyByZWNlaXZlIHJld2FyZHMgYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCB0aWVyLgoKIyMgQ29uZmlndXJhdGlvbgoKLSAqKlBvb2wgVGllcnMqKjogMzAgZGF5cywgOTAgZGF5cywgYW5kIDE4MCBkYXlzCi0gKipNaW5pbXVtIFN0YXJ0IERlbGF5Kio6IDMgZGF5cyBmcm9tIHByb2plY3QgY3JlYXRpb24KLSAqKk1pbmltdW0gRGVwb3NpdCoqOiAxIEdOUyAoMSwwMDAsMDAwIGJhc2UgdW5pdHMpIGFuZCBpbnRlZ2VyIG11bHRpcGxlcyBvZiB0aGF0IGFtb3VudAotICoqUmV3YXJkIENsYWltIERlbGF5Kio6IDEgZGF5IGFmdGVyIGVhY2ggZGVwb3NpdCwgY2FwcGVkIGF0IHRoZSBzZWxlY3RlZCB0aWVyJ3MgZW5kIHRpbWUKLSAqKkNvbmRpdGlvbiBEZWxpbWl0ZXIqKjogVXNlIGAqUEFEKmAgYmV0d2VlbiBjb25kaXRpb24gZXhwcmVzc2lvbnMKLSAqKkF1dG8tRGVsZWdhdGlvbioqOiBQcm9qZWN0IGRlcG9zaXRzIGNhbiBiZSByZWZsZWN0ZWQgaW4gZ292ZXJuYW5jZS1zdGFrZXIgYWNjb3VudGluZwoKIyMgQ29yZSBGZWF0dXJlcwoKLSAqKlByb2plY3QgQ3JlYXRpb24qKjogQWRtaW4gb3IgZ292ZXJuYW5jZSBjcmVhdGVzIGEgcHJvamVjdCBhbmQgaXRzIHRpZXJzCi0gKipHTlMgRGVwb3NpdHMqKjogVXNlcnMgZGVwb3NpdCBHTlMgaW50byBhIHNlbGVjdGVkIHByb2plY3QgdGllcgotICoqVGltZS1Mb2NrZWQgV2l0aGRyYXdhbHMqKjogQSBkZXBvc2l0b3IgY2FuIHdpdGhkcmF3IHRoZSBvcmlnaW5hbCBHTlMgb25seSBhZnRlciB0aGUgdGllciBlbmRzCi0gKipQcm9qZWN0LVRva2VuIFJld2FyZHMqKjogUmV3YXJkcyBhY2NydWUgb3ZlciB0aGUgdGllciBkdXJhdGlvbiBhbmQgY2FuIGJlIGNsYWltZWQgYWZ0ZXIgdGhlIGNsYWltIGRlbGF5Ci0gKipBZG1pbmlzdHJhdGl2ZSBSZWZ1bmQqKjogQWRtaW4gY2FuIHRyYW5zZmVyIHRoZSByZW1haW5pbmcgcmVmdW5kYWJsZSBwcm9qZWN0LXRva2VuIGJhbGFuY2UgZnJvbSBhbiBlbmRlZCBwcm9qZWN0IHRvIGEgc3VwcGxpZWQgcmVjaXBpZW50OyBhY3RpdmUgZGVwb3NpdG9yIGNsYWltcyByZW1haW4gcmVzZXJ2ZWQKCiMjIEtleSBGdW5jdGlvbnMKCiMjIyBgQ3JlYXRlUHJvamVjdGAKCkNyZWF0ZXMgYSBuZXcgcHJvamVjdCB3aXRoIHRva2VuIGFkZHJlc3MsIHJld2FyZCBhbW91bnQsIHRpZXIgY29uZmlndXJhdGlvbiwKYW5kIG9wdGlvbmFsIGAqUEFEKmAtc2VwYXJhdGVkIGNvbmRpdGlvbnMuIE9ubHkgYWRtaW4gb3IgZ292ZXJuYW5jZSBtYXkgY2FsbCBpdC4KCiMjIyBgRGVwb3NpdEduc2AKCkRlcG9zaXRzIEdOUyBpbnRvIGEgcHJvamVjdCB0aWVyLiBUaGUgZGVwb3NpdCBhbW91bnQgbXVzdCBtZWV0IHRoZSBtaW5pbXVtIGFuZAptdWx0aXBsZSBydWxlcy4KCiMjIyBgQ29sbGVjdFJld2FyZEJ5RGVwb3NpdElkYAoKQ2xhaW1zIHRoZSBwcm9qZWN0LXRva2VuIHJld2FyZCBmb3IgYSBkZXBvc2l0LiBPbmx5IHRoZSBkZXBvc2l0IG93bmVyIGNhbiBjYWxsCml0LCBhbmQgdGhlIHJld2FyZCBpcyBjbGFpbWFibGUgb25lIGRheSBhZnRlciBkZXBvc2l0IGNyZWF0aW9uLCBjYXBwZWQgYnkgdGhlCnRpZXIgZW5kIHRpbWUuCgojIyMgYENvbGxlY3REZXBvc2l0R25zYAoKU2V0dGxlcyBhbnkgY2xhaW1hYmxlIHByb2plY3QtdG9rZW4gcmV3YXJkIGFuZCB0aGVuIHJldHVybnMgdGhlIG9yaWdpbmFsIEdOUwpkZXBvc2l0LiBPbmx5IHRoZSBkZXBvc2l0IG93bmVyIGNhbiBjYWxsIGl0LCBhbmQgdGhlIGN1cnJlbnQgdGltZSBtdXN0IGJlCnN0cmljdGx5IGFmdGVyIHRoZSBzZWxlY3RlZCB0aWVyJ3MgZW5kIHRpbWUuCgojIyMgYFRyYW5zZmVyTGVmdEZyb21Qcm9qZWN0QnlBZG1pbmAKClRyYW5zZmVycyB0aGUgcmVtYWluaW5nIHJlZnVuZGFibGUgcHJvamVjdC10b2tlbiBiYWxhbmNlIGZyb20gYW4gZW5kZWQgcHJvamVjdAp0byB0aGUgc3VwcGxpZWQgcmVjaXBpZW50LiBPbmx5IGFkbWluIG1heSBjYWxsIGl0OyBhbW91bnRzIHJlc2VydmVkIGZvciBhY3RpdmUKZGVwb3NpdG9yIGNsYWltcyBhcmUgbm90IHRyYW5zZmVycmVkLgoKIyMgQXBwcm92YWwgUmVxdWlyZW1lbnRzCgotIGBEZXBvc2l0R25zYCBwdWxscyBHTlMgZnJvbSB0aGUgY2FsbGVyIGludG8gdGhlIGxhdW5jaHBhZCByZWFsbSwgc28gYXBwcm92ZQogIHRoZSBsYXVuY2hwYWQgcmVhbG0gZm9yIGF0IGxlYXN0IHRoZSBkZXBvc2l0IGFtb3VudCBiZWZvcmUgY2FsbGluZy4KLSBgQ29sbGVjdFJld2FyZEJ5RGVwb3NpdElkYCBhbmQgYENvbGxlY3REZXBvc2l0R25zYCBwYXkgb3V0IHRvIHRoZSBjYWxsZXIgYW5kCiAgcmVxdWlyZSBubyBhcHByb3ZhbC4KCmBgYGdvCi8vIEFwcHJvdmUgdGhlIGxhdW5jaHBhZCByZWFsbSBiZWZvcmUgZGVwb3NpdGluZwpsYXVuY2hwYWRBZGRyZXNzIDo9IGFjY2Vzcy5NdXN0R2V0QWRkcmVzcyhwcmFiYy5ST0xFX0xBVU5DSFBBRC5TdHJpbmcoKSkKZ25zLkFwcHJvdmUoY3Jvc3MoY3VyKSwgbGF1bmNocGFkQWRkcmVzcywgMTBfMDAwXzAwMCkKYGBgCgojIyBVc2FnZQoKYGBgZ28KLy8gQ3JlYXRlIGEgcHJvamVjdCAoYWRtaW4gb3IgZ292ZXJuYW5jZTsgc3RhcnQgbXVzdCBiZSBhdCBsZWFzdCAzIGRheXMgYXdheSkKcHJvamVjdElEIDo9IENyZWF0ZVByb2plY3QoCiAgICBjcm9zcyhjdXIpLAogICAgIkV4YW1wbGUgUHJvamVjdCIsCiAgICAiZ25vLmxhbmQvci9kZW1vL3Byb2plY3R0b2tlbiIsCiAgICByZWNpcGllbnRBZGRyLAogICAgMV8wMDBfMDAwXzAwMCwKICAgICIiLCAvLyBubyBjb25kaXRpb24gdG9rZW5zCiAgICAiIiwgLy8gbm8gY29uZGl0aW9uIGFtb3VudHMKICAgIDEwLCAvLyAzMC1kYXkgdGllciByYXRpbwogICAgMjAsIC8vIDkwLWRheSB0aWVyIHJhdGlvCiAgICA3MCwgLy8gMTgwLWRheSB0aWVyIHJhdGlvCiAgICBmdXR1cmVTdGFydFRpbWVzdGFtcCwKKQoKLy8gRGVwb3NpdCBHTlMgaW50byBhIDMwLWRheSB0aWVyOyByZWZlcnJlciBpcyBvcHRpb25hbApkZXBvc2l0SUQgOj0gRGVwb3NpdEducyhjcm9zcyhjdXIpLCBwcm9qZWN0SUQrIjozMCIsIDEwXzAwMF8wMDAsICIiKQoKLy8gQ2xhaW0gYWZ0ZXIgdGhlIG9uZS1kYXkgZGVsYXkKQ29sbGVjdFJld2FyZEJ5RGVwb3NpdElkKGNyb3NzKGN1ciksIGRlcG9zaXRJRCkKCi8vIEFmdGVyIHRoZSB0aWVyIGhhcyBlbmRlZCwgc2V0dGxlIHJld2FyZCBhbmQgd2l0aGRyYXcgcHJpbmNpcGFsCkNvbGxlY3REZXBvc2l0R25zKGNyb3NzKGN1ciksIGRlcG9zaXRJRCkKCi8vIEFkbWluIHJlZnVuZCBvZiB0aGUgcmVtYWluaW5nIHByb2plY3QtdG9rZW4gYmFsYW5jZQpUcmFuc2ZlckxlZnRGcm9tUHJvamVjdEJ5QWRtaW4oY3Jvc3MoY3VyKSwgcHJvamVjdElELCByZWNpcGllbnRBZGRyKQpgYGAKCiMjIFNlY3VyaXR5CgotIEFkbWluIG9yIGdvdmVybmFuY2UgYXV0aG9yaXphdGlvbiBpcyByZXF1aXJlZCBmb3IgcHJvamVjdCBjcmVhdGlvbgotIERlcG9zaXRzIGFyZSBsb2NrZWQgdW50aWwgc3RyaWN0bHkgYWZ0ZXIgdGhlIHNlbGVjdGVkIHRpZXIncyBlbmQgdGltZQotIFByb2plY3QtdG9rZW4gcmV3YXJkcyBhcmUgY2xhaW1hYmxlIG9ubHkgYnkgdGhlIGRlcG9zaXQgb3duZXIgYW5kIG9ubHkgYWZ0ZXIgdGhlIG9uZS1kYXkgZGVsYXkKLSBXaXRoZHJhd2FsIHNldHRsZXMgYW55IGNsYWltYWJsZSBwcm9qZWN0LXRva2VuIHJld2FyZCBiZWZvcmUgcmV0dXJuaW5nIHByaW5jaXBhbAotIEFkbWluaXN0cmF0aXZlIHJlZnVuZHMgcmVxdWlyZSBhbiBlbmRlZCBwcm9qZWN0IGFuZCBwcmVzZXJ2ZSBhY3RpdmUgZGVwb3NpdG9yIGNsYWltcwotIENvbmRpdGlvbnMgYXJlIGV2YWx1YXRlZCBmb3IgZWFjaCBkZXBvc2l0IHdoZW4gY29uZmlndXJlZAotIERlcG9zaXRvciBhbmQgcmV3YXJkIHJlY2lwaWVudCBhZGRyZXNzZXMgYXJlIHZhbGlkYXRlZAoanwsKCmFzc2VydC5nbm8SkAtwYWNrYWdlIGxhdW5jaHBhZAoKaW1wb3J0ICgKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKLy8gYXNzZXJ0SXNEZXBvc2l0T3duZXIgYXNzZXJ0cyB0aGF0IHRoZSBjYWxsZXIgaXMgdGhlIG93bmVyIG9mIHRoZSBkZXBvc2l0LgovLyBQYW5pY3MgaWYgdGhlIGNhbGxlciBpcyBub3QgdGhlIG93bmVyIG9mIHRoZSBkZXBvc2l0LgpmdW5jIChscCAqbGF1bmNocGFkVjEpIGFzc2VydElzRGVwb3NpdE93bmVyKGRlcG9zaXRJRCBzdHJpbmcsIGNhbGxlciBhZGRyZXNzKSB7CglkZXBvc2l0LCBlcnIgOj0gbHAuZ2V0RGVwb3NpdChkZXBvc2l0SUQpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIuRXJyb3IoKSkKCX0KCglpZiAhZGVwb3NpdC5Jc0RlcG9zaXRvcihjYWxsZXIpIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkT3duZXIsIHVmbXQuU3ByaW50ZigiKCVzKSIsIGNhbGxlci5TdHJpbmcoKSkpLkVycm9yKCkpCgl9Cn0KCi8vIGFzc2VydElzVmFsaWRBbW91bnQgcGFuaWNzIGlmIHRoZSBhbW91bnQgaXMgemVyby4KZnVuYyBhc3NlcnRJc1ZhbGlkQW1vdW50KGFtb3VudCBpbnQ2NCkgewoJaWYgYW1vdW50IDwgbWluaW11bURlcG9zaXRBbW91bnQgewoJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJJbnZhbGlkQW1vdW50LAoJCQl1Zm10LlNwcmludGYoImFtb3VudCglZCkgc2hvdWxkIGdyZWF0ZXIgdGhhbiBtaW5pbXVtIGRlcG9zaXQgYW1vdW50KCVkKSIsIGFtb3VudCwgbWluaW11bURlcG9zaXRBbW91bnQpLAoJCSkpCgl9CgoJaWYgKGFtb3VudCAlIG1pbmltdW1EZXBvc2l0QW1vdW50KSAhPSAwIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZEFtb3VudCwKCQkJdWZtdC5TcHJpbnRmKCJhbW91bnQoJWQpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxXzAwMF8wMDAiLCBhbW91bnQpLAoJCSkpCgl9Cn0KCi8vIGFzc2VydEhhc1Byb2plY3QgYXNzZXJ0cyB0aGF0IHRoZSBjYWxsZXIgaXMgdGhlIG93bmVyIG9mIGF0IGxlYXN0IG9uZSBwcm9qZWN0LgovLyBQYW5pY3MgaWYgdGhlIGNhbGxlciBpcyBub3QgdGhlIG93bmVyIG9mIGFueSBwcm9qZWN0LgpmdW5jIChscCAqbGF1bmNocGFkVjEpIGFzc2VydEhhc1Byb2plY3QoY2FsbGVyIGFkZHJlc3MpIHsKCWlmICFscC5zdG9yZS5HZXRQcm9qZWN0UmVjaXBpZW50cygpLkhhcyhjYWxsZXIuU3RyaW5nKCkpIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZE93bmVyLAoJCQl1Zm10LlNwcmludGYoImNhbGxlciAlcyBpcyBub3QgdGhlIG93bmVyIG9mIGFueSBwcm9qZWN0IiwgY2FsbGVyLlN0cmluZygpKSwKCQkpKQoJfQp9CgpmdW5jIGFzc2VydE5vdEltcGxlbWVudFlldCgpIHsKCXBhbmljKCJOb3RJbXBsZW1lbnRZZXQiKQp9ChqkCAoKY29uc3RzLmdubxKVCHBhY2thZ2UgbGF1bmNocGFkCgpjb25zdCAoCglwcm9qZWN0VGllcjMwICA9IGludDY0KDMwKQoJcHJvamVjdFRpZXI5MCAgPSBpbnQ2NCg5MCkKCXByb2plY3RUaWVyMTgwID0gaW50NjQoMTgwKQoKCWRheVRpbWUgPSBpbnQ2NCgyNCAqIDYwICogNjApIC8vIDg2NDAwCgoJbWluaW11bURlcG9zaXRBbW91bnQgPSBpbnQ2NCgxXzAwMF8wMDApCgoJc3RyaW5nU3BsaXR0ZXJQYWQgPSAiKlBBRCoiCgoJbWF4UHJvamVjdENvbmRpdGlvbkNvdW50ID0gNQoKCXByb2plY3RNaW5pbXVtU3RhcnREZWxheVRpbWUgPSBkYXlUaW1lICogMyAvLyAzIGRheXMKKQoKLy8gY29udHJhY3QgcGF0aHMKY29uc3QgKAoJR09WX1hHTlNfUEFUSCBzdHJpbmcgPSAiZ25vLmxhbmQvci9nbm9zd2FwL2dvdi94Z25zIgoJR05TX1RPS0VOX0tFWSBzdHJpbmcgPSAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlMiCikKCi8vIE1VU1QgQkUgSU1NVVRBQkxFLCBETyBOT1QgTU9ESUZZLgp2YXIgcHJvamVjdFRpZXJEdXJhdGlvbnMgPSBbXWludDY0ewoJcHJvamVjdFRpZXIzMCwKCXByb2plY3RUaWVyOTAsCglwcm9qZWN0VGllcjE4MCwKfQoKLy8gTVVTVCBCRSBJTU1VVEFCTEUsIERPIE5PVCBNT0RJRlkuCnZhciBwcm9qZWN0VGllckR1cmF0aW9uVGltZXMgPSBtYXBbaW50NjRdaW50NjR7Cglwcm9qZWN0VGllcjMwOiAgZGF5VGltZSAqIHByb2plY3RUaWVyMzAsICAvLyAzMCBkYXlzCglwcm9qZWN0VGllcjkwOiAgZGF5VGltZSAqIHByb2plY3RUaWVyOTAsICAvLyA5MCBkYXlzCglwcm9qZWN0VGllcjE4MDogZGF5VGltZSAqIHByb2plY3RUaWVyMTgwLCAvLyAxODAgZGF5cwp9CgovLyBNVVNUIEJFIElNTVVUQUJMRSwgRE8gTk9UIE1PRElGWS4KdmFyIHByb2plY3RUaWVyUmV3YXJkQ29sbGVjdGFibGVEdXJhdGlvbiA9IG1hcFtpbnQ2NF1pbnQ2NHsKCXByb2plY3RUaWVyMzA6ICBkYXlUaW1lICogMSwgLy8gMSBkYXlzCglwcm9qZWN0VGllcjkwOiAgZGF5VGltZSAqIDEsIC8vIDEgZGF5cwoJcHJvamVjdFRpZXIxODA6IGRheVRpbWUgKiAxLCAvLyAxIGRheXMKfQoaxwIKC2RlcG9zaXQuZ25vErcCcGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAiZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZCIKCmZ1bmMgd2l0aGRyYXdEZXBvc2l0KGQgbGF1bmNocGFkLkRlcG9zaXQsIGN1cnJlbnRIZWlnaHQsIGN1cnJlbnRUaW1lIGludDY0KSAobGF1bmNocGFkLkRlcG9zaXQsIGludDY0KSB7CglkLlNldFdpdGhkcmF3bihjdXJyZW50SGVpZ2h0LCBjdXJyZW50VGltZSkKCglwcmV2aW91c0RlcG9zaXRBbW91bnQgOj0gZC5EZXBvc2l0QW1vdW50KCkKCWQuU2V0RGVwb3NpdEFtb3VudCgwKQoKCXJldHVybiBkLCBwcmV2aW91c0RlcG9zaXRBbW91bnQKfQoavgoKCWVtaXRzLmdubxKwCnBhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJImNoYWluIgoKCSJnbm8ubGFuZC9wL2dub3N3YXAvdXRpbHMvdjEiCgkiZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZCIKKQoKLy8gZW1pdFVwZGF0ZUxhdW5jaHBhZFJld2FyZEFjY3VtdWxhdGlvbiBlbWl0cyB0aGUgcGVyc2lzdGVkIHBlci10aWVyIHJld2FyZAovLyBhY2N1bXVsYXRpb24gc3RhdGUgc28gdGhhdCBvZmYtY2hhaW4gaW5kZXhlcnMgY2FuIGNvbnN1bWUgdGhlIGF1dGhvcml0YXRpdmUKLy8gYWNjdW11bGF0b3IgaW5zdGVhZCBvZiByZS1kZXJpdmluZyBpdC4gSXQgbXVzdCBiZSBlbWl0dGVkIGFmdGVyIGV2ZXJ5IHBhdGggdGhhdAovLyBjYWxscyB1cGRhdGVSZXdhcmRQZXJEZXBvc2l0WDEyOCAoZGVwb3NpdC93aXRoZHJhdy9jb2xsZWN0L2FkbWluLXJlY2xhaW0pLAovLyBvdGhlcndpc2UgdGhlIG9mZi1jaGFpbiBhY2N1bXVsYXRvciBkcmlmdHMgZnJvbSB0aGUgY29udHJhY3QuCi8vCi8vIFRoZSByZXdhcmQgbWFuYWdlciBpcyBrZXllZCBieSBwcm9qZWN0VGllcklkLCBzbyBpdCBpcyBpbmNsdWRlZCB0byBpZGVudGlmeSB3aGljaAovLyB0aWVyJ3MgYWNjdW11bGF0b3IgdGhpcyB1cGRhdGUgYmVsb25ncyB0by4gdG90YWxEZXBvc2l0QW1vdW50IGlzIHRoZSBjdXJyZW50IHRpZXIKLy8gZGVwb3NpdCB0b3RhbCBhZnRlciB0aGUgc3Rha2UgY2hhbmdlICh0aGUgZGl2aXNvciBmb3IgdGhlIG5leHQgYWNjdW11bGF0aW9uIGRlbHRhKSwKLy8gYW5kIGRpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4IGxldHMgaW5kZXhlcnMgcHJvamVjdCB0aGUgYWNjdW11bGF0b3IgZm9yd2FyZC4KZnVuYyBlbWl0VXBkYXRlTGF1bmNocGFkUmV3YXJkQWNjdW11bGF0aW9uKHByb2plY3RUaWVySUQgc3RyaW5nLCByICpsYXVuY2hwYWQuUmV3YXJkTWFuYWdlciwgdG90YWxEZXBvc2l0QW1vdW50IGludDY0KSB7CgljaGFpbi5FbWl0KAoJCSJVcGRhdGVMYXVuY2hwYWRSZXdhcmRBY2N1bXVsYXRpb24iLAoJCSJwcm9qZWN0VGllcklkIiwgcHJvamVjdFRpZXJJRCwKCQkidG90YWxEZXBvc2l0QW1vdW50IiwgdXRpbHMuRm9ybWF0SW50KHRvdGFsRGVwb3NpdEFtb3VudCksCgkJImFjY3VtdWxhdGVkUmV3YXJkUGVyRGVwb3NpdFgxMjgiLCByLkFjY3VtdWxhdGVkUmV3YXJkUGVyRGVwb3NpdFgxMjgoKS5Ub1N0cmluZygpLAoJCSJkaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOCIsIHIuRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgoKS5Ub1N0cmluZygpLAoJCSJhY2N1bXVsYXRlZFRpbWUiLCB1dGlscy5Gb3JtYXRJbnQoci5BY2N1bXVsYXRlZFRpbWUoKSksCgkpCn0KGqwMCgplcnJvcnMuZ25vEp0McGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAoCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCmNvbnN0ICgKCWVyck5vTGVmdFJld2FyZCAgICAgICAgPSAiW0dOT1NXQVAtTEFVTkNIUEFELTAwMV0gbm8gbGVmdCByZXdhcmQiCgllcnJJbnZhbGlkQWRkcmVzcyAgICAgID0gIltHTk9TV0FQLUxBVU5DSFBBRC0wMDJdIGludmFsaWQgYWRkcmVzcyIKCWVyckRhdGFOb3RGb3VuZCAgICAgICAgPSAiW0dOT1NXQVAtTEFVTkNIUEFELTAwM10gcmVxdWVzdGVkIGRhdGEgbm90IGZvdW5kIgoJZXJySW5hY3RpdmVQcm9qZWN0ICAgICA9ICJbR05PU1dBUC1MQVVOQ0hQQUQtMDA0XSBwcm9qZWN0IGlzIGluYWN0aXZlIgoJZXJySW52YWxpZElucHV0ICAgICAgICA9ICJbR05PU1dBUC1MQVVOQ0hQQUQtMDA1XSBpbnZhbGlkIGlucHV0IGRhdGEiCgllcnJEdXBsaWNhdGVQcm9qZWN0ICAgID0gIltHTk9TV0FQLUxBVU5DSFBBRC0wMDZdIGNhbm5vdCBjcmVhdGUgc2FtZSBwcm9qZWN0IGluIHNhbWUgYmxvY2siCgllcnJJbnZhbGlkVGllciAgICAgICAgID0gIltHTk9TV0FQLUxBVU5DSFBBRC0wMDddIGludmFsaWQgdGllciIKCWVyckluc3VmZmljaWVudEJhbGFuY2UgPSAiW0dOT1NXQVAtTEFVTkNIUEFELTAwOF0gaW5zdWZmaWNpZW50IGJhbGFuY2UiCgllcnJJbnZhbGlkRGF0YSAgICAgICAgID0gIltHTk9TV0FQLUxBVU5DSFBBRC0wMDldIGludmFsaWQgZGF0YSIKCWVyckludmFsaWRBbW91bnQgICAgICAgPSAiW0dOT1NXQVAtTEFVTkNIUEFELTAxMF0gaW52YWxpZCBhbW91bnQiCgllcnJJbnZhbGlkUmV3YXJkU3RhdGUgID0gIltHTk9TV0FQLUxBVU5DSFBBRC0wMTFdIGludmFsaWQgcmV3YXJkIHN0YXRlIgoJZXJyTm90RXhpc3REZXBvc2l0ICAgICA9ICJbR05PU1dBUC1MQVVOQ0hQQUQtMDEyXSBub3QgZXhpc3QgZGVwb3NpdCIKCWVyckFscmVhZHlDb2xsZWN0ZWQgICAgPSAiW0dOT1NXQVAtTEFVTkNIUEFELTAxM10gYWxyZWFkeSBjb2xsZWN0ZWQiCgllcnJJbnZhbGlkT3duZXIgICAgICAgID0gIltHTk9TV0FQLUxBVU5DSFBBRC0wMTRdIGludmFsaWQgb3duZXIiCgllcnJJbnZhbGlkVGltZSAgICAgICAgID0gIltHTk9TV0FQLUxBVU5DSFBBRC0wMTVdIGludmFsaWQgdGltZSIKCWVyck5vdFlldEVuZGVkUHJvamVjdCAgPSAiW0dOT1NXQVAtTEFVTkNIUEFELTAxNl0gcHJvamVjdCBsb2NrIHBlcmlvZCBpcyBub3Qgb3ZlciB5ZXQiCgllcnJPdmVyZmxvdyAgICAgICAgICAgID0gIltHTk9TV0FQLUxBVU5DSFBBRC0wMTddIG92ZXJmbG93IgoJZXJyU3Bvb2ZlZFJlYWxtICAgICAgICA9ICJbR05PU1dBUC1MQVVOQ0hQQUQtMDE4XSBybG0gZG9lcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgY3Jvc3NpbmcgZnJhbWUiCikKCi8vIG1ha2VFcnJvcldpdGhEZXRhaWxzIGNyZWF0ZXMgYW4gZXJyb3Igd2l0aCBhZGRpdGlvbmFsIGNvbnRleHQuCmZ1bmMgbWFrZUVycm9yV2l0aERldGFpbHMobWVzc2FnZSBzdHJpbmcsIGRldGFpbHMgc3RyaW5nKSBlcnJvciB7CglyZXR1cm4gdWZtdC5FcnJvcmYoIiVzIHx8ICVzIiwgbWVzc2FnZSwgZGV0YWlscykKfQoawekBCgpnZXR0ZXIuZ25vErHpAXBhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJImVycm9ycyIKCSJ0aW1lIgoKCXJvdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvcm90cmVlL3YwIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCSJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvbGF1bmNocGFkIgopCgovLyBHZXRQcm9qZWN0cyByZXR1cm5zIGEgcmVhZC1vbmx5IHZpZXcgb2YgZXZlcnkgcHJvamVjdCwga2V5ZWQgYnkgcHJvamVjdCBJRC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHByb2plY3RzOiByZWFkLW9ubHkgdHJlZSBrZXllZCBieSBwcm9qZWN0IElEOyBwcm9qZWN0IGVudHJpZXMgYXJlIGNsb25lZCBiZWZvcmUgYmVpbmcgZXhwb3NlZC4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXRQcm9qZWN0cygpICpyb3RyZWUuUmVhZE9ubHlUcmVlIHsKCXJldHVybiByb3RyZWUuV3JhcChscC5zdG9yZS5HZXRQcm9qZWN0cygpLCBjbG9uZVByb2plY3RFbnRyeSkKfQoKLy8gR2V0UHJvamVjdE5hbWUgcmV0dXJucyB0aGUgbmFtZSBvZiBhIHByb2plY3QgYnkgaXRzIElELgovLyBSZXR1cm5zIGVtcHR5IHN0cmluZyBhbmQgZXJyb3IgaWYgcHJvamVjdCBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBuYW1lOiBjb25maWd1cmVkIHByb2plY3QgbmFtZTsgZW1wdHkgd2hlbiB0aGUgcHJvamVjdCBpcyBhYnNlbnQuCi8vICAgLSBlcnI6IG5pbCB3aGVuIGZvdW5kOyBub24tbmlsIHdoZW4gcHJvamVjdElkIGlzIG5vdCBwcmVzZW50IGluIHN0YXRlLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3ROYW1lKHByb2plY3RJZCBzdHJpbmcpIChzdHJpbmcsIGVycm9yKSB7Cglwcm9qZWN0LCBlcnIgOj0gbHAuZ2V0UHJvamVjdChwcm9qZWN0SWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIiIsIGVycgoJfQoKCXJldHVybiBwcm9qZWN0Lk5hbWUoKSwgbmlsCn0KCi8vIEdldFByb2plY3RUb2tlblBhdGggcmV0dXJucyB0aGUgdG9rZW4gcGF0aCBvZiBhIHByb2plY3QgYnkgaXRzIElELgovLyBSZXR1cm5zIGVtcHR5IHN0cmluZyBhbmQgZXJyb3IgaWYgcHJvamVjdCBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b2tlblBhdGg6IHJld2FyZC10b2tlbiBjb250cmFjdCBwYXRoIGNvbmZpZ3VyZWQgZm9yIHRoZSBwcm9qZWN0OyBlbXB0eSB3aGVuIGFic2VudC4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgaXMgbm90IHByZXNlbnQgaW4gc3RhdGUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0UHJvamVjdFRva2VuUGF0aChwcm9qZWN0SWQgc3RyaW5nKSAoc3RyaW5nLCBlcnJvcikgewoJcHJvamVjdCwgZXJyIDo9IGxwLmdldFByb2plY3QocHJvamVjdElkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCBlcnIKCX0KCglyZXR1cm4gcHJvamVjdC5Ub2tlblBhdGgoKSwgbmlsCn0KCi8vIEdldFByb2plY3REZXBvc2l0QW1vdW50IHJldHVybnMgdGhlIGRlcG9zaXQgYW1vdW50IG9mIGEgcHJvamVjdCBieSBpdHMgSUQuCi8vIFJldHVybnMgMCBhbmQgZXJyb3IgaWYgcHJvamVjdCBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IHByb2plY3QtbGV2ZWwgdG9rZW4gYW1vdW50IGRlcG9zaXRlZCBmb3IgZGlzdHJpYnV0aW9uOyB6ZXJvIHdoZW4gYWJzZW50LgovLyAgIC0gZXJyOiBuaWwgd2hlbiBmb3VuZDsgbm9uLW5pbCB3aGVuIHByb2plY3RJZCBpcyBub3QgcHJlc2VudCBpbiBzdGF0ZS4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXRQcm9qZWN0RGVwb3NpdEFtb3VudChwcm9qZWN0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7Cglwcm9qZWN0LCBlcnIgOj0gbHAuZ2V0UHJvamVjdChwcm9qZWN0SWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJcmV0dXJuIHByb2plY3QuRGVwb3NpdEFtb3VudCgpLCBuaWwKfQoKLy8gR2V0UHJvamVjdFJlY2lwaWVudCByZXR1cm5zIHRoZSByZWNpcGllbnQgYWRkcmVzcyBvZiBhIHByb2plY3QgYnkgaXRzIElELgovLyBSZXR1cm5zIGVtcHR5IGFkZHJlc3MgYW5kIGVycm9yIGlmIHByb2plY3Qgbm90IGZvdW5kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgbGF1bmNocGFkIHByb2plY3QgaWRlbnRpZmllciB0byBsb29rIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVjaXBpZW50OiBhZGRyZXNzIGNvbmZpZ3VyZWQgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCdzIHRva2VuczsgZW1wdHkgYWRkcmVzcyB3aGVuIGFic2VudC4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgaXMgbm90IHByZXNlbnQgaW4gc3RhdGUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0UHJvamVjdFJlY2lwaWVudChwcm9qZWN0SWQgc3RyaW5nKSAoYWRkcmVzcywgZXJyb3IpIHsKCXByb2plY3QsIGVyciA6PSBscC5nZXRQcm9qZWN0KHByb2plY3RJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBhZGRyZXNzKCIiKSwgZXJyCgl9CgoJcmV0dXJuIHByb2plY3QuUmVjaXBpZW50KCksIG5pbAp9CgovLyBHZXRQcm9qZWN0Q29uZGl0aW9uIHJldHJpZXZlcyBhIHNwZWNpZmljIGNvbmRpdGlvbiBvZiBhIHByb2plY3QuCi8vIFJldHVybnMgbmlsIGFuZCBlcnJvciBpZiBwcm9qZWN0IG9yIGNvbmRpdGlvbiBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCi8vICAgLSB0b2tlblBhdGg6IGNvbmRpdGlvbi10b2tlbiBjb250cmFjdCBwYXRoIHVzZWQgYXMgdGhlIHByb2plY3QncyBjb25kaXRpb24ga2V5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gY29uZGl0aW9uOiBtYXRjaGluZyBwcm9qZWN0IGNvbmRpdGlvbjsgbmlsIHdoZW4gdGhlIHByb2plY3Qgb3IgY29uZGl0aW9uIGlzIGFic2VudC4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgb3IgdG9rZW5QYXRoIGlzIG5vdCBwcmVzZW50LgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RDb25kaXRpb24ocHJvamVjdElkIHN0cmluZywgdG9rZW5QYXRoIHN0cmluZykgKCpsYXVuY2hwYWQuUHJvamVjdENvbmRpdGlvbiwgZXJyb3IpIHsKCXByb2plY3QsIGVyciA6PSBscC5nZXRQcm9qZWN0KHByb2plY3RJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCWNvbmRpdGlvbnMgOj0gcHJvamVjdC5Db25kaXRpb25zKCkKCWNvbmRpdGlvbiwgZXhpc3RzIDo9IGNvbmRpdGlvbnNbdG9rZW5QYXRoXQoJaWYgIWV4aXN0cyB7CgkJcmV0dXJuIG5pbCwgbWFrZUVycm9yV2l0aERldGFpbHMoZXJyRGF0YU5vdEZvdW5kLCB1Zm10LlNwcmludGYoImNvbmRpdGlvbiglcykgbm90IGZvdW5kIiwgdG9rZW5QYXRoKSkKCX0KCglyZXR1cm4gY29uZGl0aW9uLCBuaWwKfQoKLy8gR2V0UHJvamVjdFRpZXJzUmF0aW9zIHJldHVybnMgdGhlIHRpZXJzIHJhdGlvcyBtYXAgb2YgYSBwcm9qZWN0IGJ5IGl0cyBJRC4KLy8gUmV0dXJucyBuaWwgYW5kIGVycm9yIGlmIHByb2plY3Qgbm90IGZvdW5kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgbGF1bmNocGFkIHByb2plY3QgaWRlbnRpZmllciB0byBsb29rIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmF0aW9zOiBtYXAgZnJvbSB0aWVyIGR1cmF0aW9uICgzMCwgOTAsIG9yIDE4MCkgdG8gaXRzIGFsbG9jYXRpb24gcGVyY2VudGFnZTsgbmlsIHdoZW4gdGhlIHByb2plY3QgaXMgYWJzZW50LgovLyAgIC0gZXJyOiBuaWwgd2hlbiBmb3VuZDsgbm9uLW5pbCB3aGVuIHByb2plY3RJZCBpcyBub3QgcHJlc2VudCBpbiBzdGF0ZS4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXRQcm9qZWN0VGllcnNSYXRpb3MocHJvamVjdElkIHN0cmluZykgKG1hcFtpbnQ2NF1pbnQ2NCwgZXJyb3IpIHsKCXByb2plY3QsIGVyciA6PSBscC5nZXRQcm9qZWN0KHByb2plY3RJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCXJldHVybiBwcm9qZWN0LlRpZXJzUmF0aW9zKCksIG5pbAp9CgovLyBHZXRQcm9qZWN0Q3JlYXRlZEhlaWdodCByZXR1cm5zIHRoZSBjcmVhdGVkIGhlaWdodCBvZiBhIHByb2plY3QgYnkgaXRzIElELgovLyBSZXR1cm5zIDAgYW5kIGVycm9yIGlmIHByb2plY3Qgbm90IGZvdW5kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgbGF1bmNocGFkIHByb2plY3QgaWRlbnRpZmllciB0byBsb29rIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaGVpZ2h0OiBwcm9qZWN0IGNyZWF0aW9uIGJsb2NrIGhlaWdodDsgemVybyB3aGVuIHRoZSBwcm9qZWN0IGlzIGFic2VudC4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgaXMgbm90IHByZXNlbnQgaW4gc3RhdGUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0UHJvamVjdENyZWF0ZWRIZWlnaHQocHJvamVjdElkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcHJvamVjdCwgZXJyIDo9IGxwLmdldFByb2plY3QocHJvamVjdElkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoKCXJldHVybiBwcm9qZWN0LkNyZWF0ZWRIZWlnaHQoKSwgbmlsCn0KCi8vIEdldFByb2plY3RDcmVhdGVkQXQgcmV0dXJucyB0aGUgY3JlYXRlZCB0aW1lIG9mIGEgcHJvamVjdCBieSBpdHMgSUQuCi8vIFJldHVybnMgMCBhbmQgZXJyb3IgaWYgcHJvamVjdCBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjcmVhdGVkQXQ6IHByb2plY3QgY3JlYXRpb24gdGltZXN0YW1wIGluIFVuaXggc2Vjb25kczsgemVybyB3aGVuIHRoZSBwcm9qZWN0IGlzIGFic2VudC4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgaXMgbm90IHByZXNlbnQgaW4gc3RhdGUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0UHJvamVjdENyZWF0ZWRBdChwcm9qZWN0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7Cglwcm9qZWN0LCBlcnIgOj0gbHAuZ2V0UHJvamVjdChwcm9qZWN0SWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJcmV0dXJuIHByb2plY3QuQ3JlYXRlZEF0KCksIG5pbAp9CgovLyBHZXRQcm9qZWN0VGllciByZXRyaWV2ZXMgYSBzcGVjaWZpYyB0aWVyIG9mIGEgcHJvamVjdC4KLy8gUmV0dXJucyBuaWwgYW5kIGVycm9yIGlmIHByb2plY3Qgb3IgdGllciBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCi8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGluIGRheXM7IGxhdW5jaHBhZCB0aWVycyB1c2UgMzAsIDkwLCBvciAxODAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwcm9qZWN0VGllcjogbWF0Y2hpbmcgcHJvamVjdCB0aWVyOyBuaWwgd2hlbiB0aGUgcHJvamVjdCBvciB0aWVyIGlzIGFic2VudC4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgb3IgdGllciBpcyBub3QgcHJlc2VudC4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXRQcm9qZWN0VGllcihwcm9qZWN0SWQgc3RyaW5nLCB0aWVyIGludDY0KSAoKmxhdW5jaHBhZC5Qcm9qZWN0VGllciwgZXJyb3IpIHsKCXByb2plY3QsIGVyciA6PSBscC5nZXRQcm9qZWN0KHByb2plY3RJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCXByb2plY3RUaWVyLCBlcnIgOj0gZ2V0UHJvamVjdFRpZXIocHJvamVjdCwgdGllcikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCXJldHVybiBwcm9qZWN0VGllciwgbmlsCn0KCi8vIEdldFByb2plY3RUaWVyRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjggcmV0dXJucyB0aGUgZGlzdHJpYnV0ZSBhbW91bnQgcGVyIHNlY29uZCAoUTEyOCkgb2YgYSBwcm9qZWN0IHRpZXIuCi8vIFJldHVybnMgbmlsIGFuZCBlcnJvciBpZiBwcm9qZWN0IG9yIHRpZXIgbm90IGZvdW5kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgbGF1bmNocGFkIHByb2plY3QgaWRlbnRpZmllciB0byBsb29rIHVwLgovLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBpbiBkYXlzOyBsYXVuY2hwYWQgdGllcnMgdXNlIDMwLCA5MCwgb3IgMTgwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50UGVyU2Vjb25kWDEyODogcGVyLXNlY29uZCBkaXN0cmlidXRpb24gcmF0ZSBlbmNvZGVkIGFzIGEgUTEyOCBmaXhlZC1wb2ludCB2YWx1ZTsgbmlsIHdoZW4gbG9va3VwIGZhaWxzLgovLyAgIC0gZXJyOiBuaWwgd2hlbiBmb3VuZDsgbm9uLW5pbCB3aGVuIHByb2plY3RJZCBvciB0aWVyIGlzIG5vdCBwcmVzZW50LgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKCp1aW50MjU2LlVpbnQsIGVycm9yKSB7Cglwcm9qZWN0VGllciwgZXJyIDo9IGxwLkdldFByb2plY3RUaWVyKHByb2plY3RJZCwgdGllcikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCXJldHVybiBwcm9qZWN0VGllci5EaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOCgpLCBuaWwKfQoKLy8gR2V0UHJvamVjdFRpZXJUb3RhbERpc3RyaWJ1dGVBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgZGlzdHJpYnV0ZSBhbW91bnQgb2YgYSBwcm9qZWN0IHRpZXIuCi8vIFJldHVybnMgMCBhbmQgZXJyb3IgaWYgcHJvamVjdCBvciB0aWVyIG5vdCBmb3VuZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RJZDogdW5pcXVlIGxhdW5jaHBhZCBwcm9qZWN0IGlkZW50aWZpZXIgdG8gbG9vayB1cC4KLy8gICAtIHRpZXI6IHRpZXIgZHVyYXRpb24gaW4gZGF5czsgbGF1bmNocGFkIHRpZXJzIHVzZSAzMCwgOTAsIG9yIDE4MC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogdG90YWwgdG9rZW4gYW1vdW50IGFsbG9jYXRlZCBmb3IgZGlzdHJpYnV0aW9uIGJ5IHRoZSB0aWVyOyB6ZXJvIHdoZW4gbG9va3VwIGZhaWxzLgovLyAgIC0gZXJyOiBuaWwgd2hlbiBmb3VuZDsgbm9uLW5pbCB3aGVuIHByb2plY3RJZCBvciB0aWVyIGlzIG5vdCBwcmVzZW50LgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyVG90YWxEaXN0cmlidXRlQW1vdW50KHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCXByb2plY3RUaWVyLCBlcnIgOj0gbHAuR2V0UHJvamVjdFRpZXIocHJvamVjdElkLCB0aWVyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoKCXJldHVybiBwcm9qZWN0VGllci5Ub3RhbERpc3RyaWJ1dGVBbW91bnQoKSwgbmlsCn0KCi8vIEdldFByb2plY3RUaWVyVG90YWxEZXBvc2l0QW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGRlcG9zaXQgYW1vdW50IG9mIGEgcHJvamVjdCB0aWVyLgovLyBSZXR1cm5zIDAgYW5kIGVycm9yIGlmIHByb2plY3Qgb3IgdGllciBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCi8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGluIGRheXM7IGxhdW5jaHBhZCB0aWVycyB1c2UgMzAsIDkwLCBvciAxODAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IGFnZ3JlZ2F0ZSB0b2tlbiBhbW91bnQgZGVwb3NpdGVkIGludG8gdGhlIHRpZXI7IHplcm8gd2hlbiBsb29rdXAgZmFpbHMuCi8vICAgLSBlcnI6IG5pbCB3aGVuIGZvdW5kOyBub24tbmlsIHdoZW4gcHJvamVjdElkIG9yIHRpZXIgaXMgbm90IHByZXNlbnQuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0UHJvamVjdFRpZXJUb3RhbERlcG9zaXRBbW91bnQocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcHJvamVjdFRpZXIsIGVyciA6PSBscC5HZXRQcm9qZWN0VGllcihwcm9qZWN0SWQsIHRpZXIpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJcmV0dXJuIHByb2plY3RUaWVyLlRvdGFsRGVwb3NpdEFtb3VudCgpLCBuaWwKfQoKLy8gR2V0UHJvamVjdFRpZXJUb3RhbFdpdGhkcmF3QW1vdW50IHJldHVybnMgdGhlIHRvdGFsIHdpdGhkcmF3IGFtb3VudCBvZiBhIHByb2plY3QgdGllci4KLy8gUmV0dXJucyAwIGFuZCBlcnJvciBpZiBwcm9qZWN0IG9yIHRpZXIgbm90IGZvdW5kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgbGF1bmNocGFkIHByb2plY3QgaWRlbnRpZmllciB0byBsb29rIHVwLgovLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBpbiBkYXlzOyBsYXVuY2hwYWQgdGllcnMgdXNlIDMwLCA5MCwgb3IgMTgwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBhZ2dyZWdhdGUgdG9rZW4gYW1vdW50IHdpdGhkcmF3biBmcm9tIHRoZSB0aWVyOyB6ZXJvIHdoZW4gbG9va3VwIGZhaWxzLgovLyAgIC0gZXJyOiBuaWwgd2hlbiBmb3VuZDsgbm9uLW5pbCB3aGVuIHByb2plY3RJZCBvciB0aWVyIGlzIG5vdCBwcmVzZW50LgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyVG90YWxXaXRoZHJhd0Ftb3VudChwcm9qZWN0SWQgc3RyaW5nLCB0aWVyIGludDY0KSAoaW50NjQsIGVycm9yKSB7Cglwcm9qZWN0VGllciwgZXJyIDo9IGxwLkdldFByb2plY3RUaWVyKHByb2plY3RJZCwgdGllcikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCglyZXR1cm4gcHJvamVjdFRpZXIuVG90YWxXaXRoZHJhd0Ftb3VudCgpLCBuaWwKfQoKLy8gR2V0UHJvamVjdFRpZXJUb3RhbERlcG9zaXRDb3VudCByZXR1cm5zIHRoZSB0b3RhbCBkZXBvc2l0IGNvdW50IG9mIGEgcHJvamVjdCB0aWVyLgovLyBSZXR1cm5zIDAgYW5kIGVycm9yIGlmIHByb2plY3Qgb3IgdGllciBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCi8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGluIGRheXM7IGxhdW5jaHBhZCB0aWVycyB1c2UgMzAsIDkwLCBvciAxODAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjb3VudDogbnVtYmVyIG9mIGRlcG9zaXRzIHJlY29yZGVkIGZvciB0aGUgdGllcjsgemVybyB3aGVuIGxvb2t1cCBmYWlscy4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgb3IgdGllciBpcyBub3QgcHJlc2VudC4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXRQcm9qZWN0VGllclRvdGFsRGVwb3NpdENvdW50KHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCXByb2plY3RUaWVyLCBlcnIgOj0gbHAuR2V0UHJvamVjdFRpZXIocHJvamVjdElkLCB0aWVyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoKCXJldHVybiBwcm9qZWN0VGllci5Ub3RhbERlcG9zaXRDb3VudCgpLCBuaWwKfQoKLy8gR2V0UHJvamVjdFRpZXJUb3RhbFdpdGhkcmF3Q291bnQgcmV0dXJucyB0aGUgdG90YWwgd2l0aGRyYXcgY291bnQgb2YgYSBwcm9qZWN0IHRpZXIuCi8vIFJldHVybnMgMCBhbmQgZXJyb3IgaWYgcHJvamVjdCBvciB0aWVyIG5vdCBmb3VuZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RJZDogdW5pcXVlIGxhdW5jaHBhZCBwcm9qZWN0IGlkZW50aWZpZXIgdG8gbG9vayB1cC4KLy8gICAtIHRpZXI6IHRpZXIgZHVyYXRpb24gaW4gZGF5czsgbGF1bmNocGFkIHRpZXJzIHVzZSAzMCwgOTAsIG9yIDE4MC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvdW50OiBudW1iZXIgb2Ygd2l0aGRyYXdhbHMgcmVjb3JkZWQgZm9yIHRoZSB0aWVyOyB6ZXJvIHdoZW4gbG9va3VwIGZhaWxzLgovLyAgIC0gZXJyOiBuaWwgd2hlbiBmb3VuZDsgbm9uLW5pbCB3aGVuIHByb2plY3RJZCBvciB0aWVyIGlzIG5vdCBwcmVzZW50LgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyVG90YWxXaXRoZHJhd0NvdW50KHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCXByb2plY3RUaWVyLCBlcnIgOj0gbHAuR2V0UHJvamVjdFRpZXIocHJvamVjdElkLCB0aWVyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoKCXJldHVybiBwcm9qZWN0VGllci5Ub3RhbFdpdGhkcmF3Q291bnQoKSwgbmlsCn0KCi8vIEdldFByb2plY3RUaWVyVG90YWxDb2xsZWN0ZWRBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgY29sbGVjdGVkIGFtb3VudCBvZiBhIHByb2plY3QgdGllci4KLy8gUmV0dXJucyAwIGFuZCBlcnJvciBpZiBwcm9qZWN0IG9yIHRpZXIgbm90IGZvdW5kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgbGF1bmNocGFkIHByb2plY3QgaWRlbnRpZmllciB0byBsb29rIHVwLgovLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBpbiBkYXlzOyBsYXVuY2hwYWQgdGllcnMgdXNlIDMwLCA5MCwgb3IgMTgwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBhZ2dyZWdhdGUgcmV3YXJkIGFtb3VudCBjb2xsZWN0ZWQgZnJvbSB0aGUgdGllcjsgemVybyB3aGVuIGxvb2t1cCBmYWlscy4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgb3IgdGllciBpcyBub3QgcHJlc2VudC4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXRQcm9qZWN0VGllclRvdGFsQ29sbGVjdGVkQW1vdW50KHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCXByb2plY3RUaWVyLCBlcnIgOj0gbHAuR2V0UHJvamVjdFRpZXIocHJvamVjdElkLCB0aWVyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoKCXJldHVybiBwcm9qZWN0VGllci5Ub3RhbENvbGxlY3RlZEFtb3VudCgpLCBuaWwKfQoKLy8gR2V0UHJvamVjdFRpZXJTdGFydFRpbWUgcmV0dXJucyB0aGUgc3RhcnQgdGltZSBvZiBhIHByb2plY3QgdGllci4KLy8gUmV0dXJucyAwIGFuZCBlcnJvciBpZiBwcm9qZWN0IG9yIHRpZXIgbm90IGZvdW5kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgbGF1bmNocGFkIHByb2plY3QgaWRlbnRpZmllciB0byBsb29rIHVwLgovLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBpbiBkYXlzOyBsYXVuY2hwYWQgdGllcnMgdXNlIDMwLCA5MCwgb3IgMTgwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RhcnRUaW1lOiB0aWVyIHN0YXJ0IHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHM7IHplcm8gd2hlbiBsb29rdXAgZmFpbHMuCi8vICAgLSBlcnI6IG5pbCB3aGVuIGZvdW5kOyBub24tbmlsIHdoZW4gcHJvamVjdElkIG9yIHRpZXIgaXMgbm90IHByZXNlbnQuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0UHJvamVjdFRpZXJTdGFydFRpbWUocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcHJvamVjdFRpZXIsIGVyciA6PSBscC5HZXRQcm9qZWN0VGllcihwcm9qZWN0SWQsIHRpZXIpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJcmV0dXJuIHByb2plY3RUaWVyLlN0YXJ0VGltZSgpLCBuaWwKfQoKLy8gR2V0UHJvamVjdFRpZXJFbmRUaW1lIHJldHVybnMgdGhlIGVuZCB0aW1lIG9mIGEgcHJvamVjdCB0aWVyLgovLyBSZXR1cm5zIDAgYW5kIGVycm9yIGlmIHByb2plY3Qgb3IgdGllciBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCi8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGluIGRheXM7IGxhdW5jaHBhZCB0aWVycyB1c2UgMzAsIDkwLCBvciAxODAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlbmRUaW1lOiB0aWVyIGVuZCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzOyB6ZXJvIHdoZW4gbG9va3VwIGZhaWxzLgovLyAgIC0gZXJyOiBuaWwgd2hlbiBmb3VuZDsgbm9uLW5pbCB3aGVuIHByb2plY3RJZCBvciB0aWVyIGlzIG5vdCBwcmVzZW50LgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyRW5kVGltZShwcm9qZWN0SWQgc3RyaW5nLCB0aWVyIGludDY0KSAoaW50NjQsIGVycm9yKSB7Cglwcm9qZWN0VGllciwgZXJyIDo9IGxwLkdldFByb2plY3RUaWVyKHByb2plY3RJZCwgdGllcikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCglyZXR1cm4gcHJvamVjdFRpZXIuRW5kVGltZSgpLCBuaWwKfQoKLy8gR2V0RGVwb3NpdENvdW50IHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBkZXBvc2l0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvdW50OiBudW1iZXIgb2YgZGVwb3NpdCBlbnRyaWVzIGN1cnJlbnRseSBzdG9yZWQuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0RGVwb3NpdENvdW50KCkgaW50IHsKCWRlcG9zaXRzIDo9IGxwLnN0b3JlLkdldERlcG9zaXRzKCkKCXJldHVybiBkZXBvc2l0cy5TaXplKCkKfQoKLy8gR2V0Q3VycmVudERlcG9zaXRJZCByZXR1cm5zIHRoZSBjdXJyZW50IGRlcG9zaXQgY291bnRlciB2YWx1ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGRlcG9zaXRJRDogY3VycmVudCBpbnQ2NCBkZXBvc2l0IGNvdW50ZXIgdXNlZCB0byBnZW5lcmF0ZSBzdWJzZXF1ZW50IGRlcG9zaXQgaWRlbnRpZmllcnMuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0Q3VycmVudERlcG9zaXRJZCgpIGludDY0IHsKCWNvdW50ZXIgOj0gbHAuc3RvcmUuR2V0RGVwb3NpdENvdW50ZXIoKQoJcmV0dXJuIGNvdW50ZXIuR2V0KCkKfQoKLy8gR2V0UHJvamVjdFRpZXJSZXdhcmRzIHJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiBhIHByb2plY3QgdGllcidzIHJld2FyZAovLyBzdGF0ZXMsIGtleWVkIGJ5IGRlcG9zaXQgSUQuIG5pbCBpcyByZXR1cm5lZCB3aGVuIHRoZSBwcm9qZWN0IHRpZXIgZG9lcyBub3QKLy8gZXhpc3QuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyIHVzZWQgdG8gZm9ybSB0aGUgdGllciBJRC4KLy8gICAtIHRpZXI6IHRpZXIgZHVyYXRpb24gaW4gZGF5czsgbGF1bmNocGFkIHRpZXJzIHVzZSAzMCwgOTAsIG9yIDE4MC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHJld2FyZHM6IHJlYWQtb25seSB0cmVlIG9mIHJld2FyZCBzdGF0ZXMga2V5ZWQgYnkgZGVwb3NpdCBJRDsgbmlsIHdoZW4gdGhlIHRpZXIncyByZXdhcmQgbWFuYWdlciBsb29rdXAgZmFpbHMuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0UHJvamVjdFRpZXJSZXdhcmRzKHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpICpyb3RyZWUuUmVhZE9ubHlUcmVlIHsKCXByb2plY3RUaWVySUQgOj0gbGF1bmNocGFkLk1ha2VQcm9qZWN0VGllcklEKHByb2plY3RJZCwgdGllcikKCglyZXdhcmRNYW5hZ2VyLCBlcnIgOj0gbHAuZ2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VyKHByb2plY3RUaWVySUQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CglyZXR1cm4gcm90cmVlLldyYXAocmV3YXJkTWFuYWdlci5SZXdhcmRzKCksIGNsb25lUmV3YXJkU3RhdGVFbnRyeSkKfQoKLy8gR2V0RGVwb3NpdCByZXRyaWV2ZXMgdGhlIHZhbHVlIHBheWxvYWQgb2YgYSBkZXBvc2l0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXRJZDogdW5pcXVlIGRlcG9zaXQgaWRlbnRpZmllciB0byBsb29rIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZGVwb3NpdDogc3RvcmVkIGRlcG9zaXQgdmFsdWU7IHplcm8tdmFsdWVkIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3Npbmcgb3IgaGFzIGFuIGludmFsaWQgdHlwZS4KLy8gICAtIGVycjogbmlsIGZvciBhIHZhbGlkIHN0b3JlZCBkZXBvc2l0OyBub24tbmlsIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3Npbmcgb3IgaGFzIGFuIGludmFsaWQgdHlwZS4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXREZXBvc2l0KGRlcG9zaXRJZCBzdHJpbmcpIChsYXVuY2hwYWQuRGVwb3NpdCwgZXJyb3IpIHsKCXJldHVybiBscC5nZXREZXBvc2l0VmFsdWUoZGVwb3NpdElkKQp9CgovLyBHZXREZXBvc2l0UHJvamVjdElEIHJldHVybnMgdGhlIHByb2plY3QgSUQgb2YgYSBkZXBvc2l0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXRJZDogdW5pcXVlIGRlcG9zaXQgaWRlbnRpZmllciB0byBsb29rIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJvamVjdElEOiBwcm9qZWN0IGlkZW50aWZpZXIgcmVjb3JkZWQgb24gdGhlIGRlcG9zaXQ7IGVtcHR5IHdoZW4gdGhlIGVudHJ5IGlzIG1pc3Npbmcgb3IgaW52YWxpZC4KLy8gICAtIGVycjogbmlsIGZvciBhIHZhbGlkIHN0b3JlZCBkZXBvc2l0OyBub24tbmlsIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3Npbmcgb3IgaGFzIGFuIGludmFsaWQgdHlwZS4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXREZXBvc2l0UHJvamVjdElEKGRlcG9zaXRJZCBzdHJpbmcpIChzdHJpbmcsIGVycm9yKSB7CglkZXBvc2l0LCBlcnIgOj0gbHAuZ2V0RGVwb3NpdFZhbHVlKGRlcG9zaXRJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgZXJyCgl9CglyZXR1cm4gZGVwb3NpdC5Qcm9qZWN0SUQoKSwgbmlsCn0KCi8vIEdldERlcG9zaXRUaWVyIHJldHVybnMgdGhlIHRpZXIgb2YgYSBkZXBvc2l0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXRJZDogdW5pcXVlIGRlcG9zaXQgaWRlbnRpZmllciB0byBsb29rIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiByZWNvcmRlZCBvbiB0aGUgZGVwb3NpdDsgemVybyB3aGVuIHRoZSBlbnRyeSBpcyBtaXNzaW5nIG9yIGludmFsaWQuCi8vICAgLSBlcnI6IG5pbCBmb3IgYSB2YWxpZCBzdG9yZWQgZGVwb3NpdDsgbm9uLW5pbCB3aGVuIHRoZSBlbnRyeSBpcyBtaXNzaW5nIG9yIGhhcyBhbiBpbnZhbGlkIHR5cGUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0RGVwb3NpdFRpZXIoZGVwb3NpdElkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJZGVwb3NpdCwgZXJyIDo9IGxwLmdldERlcG9zaXRWYWx1ZShkZXBvc2l0SWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CglyZXR1cm4gZGVwb3NpdC5UaWVyKCksIG5pbAp9CgovLyBHZXREZXBvc2l0UHJvamVjdFRpZXJJRCByZXR1cm5zIHRoZSBwcm9qZWN0IHRpZXIgSUQgb2YgYSBkZXBvc2l0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXRJZDogdW5pcXVlIGRlcG9zaXQgaWRlbnRpZmllciB0byBsb29rIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJvamVjdFRpZXJJRDogY29tcG9zaXRlIHByb2plY3QtdGllciBpZGVudGlmaWVyIGRlcml2ZWQgZnJvbSB0aGUgZGVwb3NpdDsgZW1wdHkgd2hlbiB0aGUgZW50cnkgaXMgbWlzc2luZyBvciBpbnZhbGlkLgovLyAgIC0gZXJyOiBuaWwgZm9yIGEgdmFsaWQgc3RvcmVkIGRlcG9zaXQ7IG5vbi1uaWwgd2hlbiB0aGUgZW50cnkgaXMgbWlzc2luZyBvciBoYXMgYW4gaW52YWxpZCB0eXBlLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldERlcG9zaXRQcm9qZWN0VGllcklEKGRlcG9zaXRJZCBzdHJpbmcpIChzdHJpbmcsIGVycm9yKSB7CglkZXBvc2l0LCBlcnIgOj0gbHAuZ2V0RGVwb3NpdFZhbHVlKGRlcG9zaXRJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgZXJyCgl9CglyZXR1cm4gZGVwb3NpdC5Qcm9qZWN0VGllcklEKCksIG5pbAp9CgovLyBHZXREZXBvc2l0QW1vdW50IHJldHVybnMgdGhlIGRlcG9zaXQgYW1vdW50IG9mIGEgZGVwb3NpdCBieSBpdHMgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0SWQ6IHVuaXF1ZSBkZXBvc2l0IGlkZW50aWZpZXIgdG8gbG9vayB1cC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogR05TIGFtb3VudCByZWNvcmRlZCBvbiB0aGUgZGVwb3NpdDsgemVybyB3aGVuIHRoZSBlbnRyeSBpcyBtaXNzaW5nIG9yIGludmFsaWQuCi8vICAgLSBlcnI6IG5pbCBmb3IgYSB2YWxpZCBzdG9yZWQgZGVwb3NpdDsgbm9uLW5pbCB3aGVuIHRoZSBlbnRyeSBpcyBtaXNzaW5nIG9yIGhhcyBhbiBpbnZhbGlkIHR5cGUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0RGVwb3NpdEFtb3VudChkZXBvc2l0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglkZXBvc2l0LCBlcnIgOj0gbHAuZ2V0RGVwb3NpdFZhbHVlKGRlcG9zaXRJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCXJldHVybiBkZXBvc2l0LkRlcG9zaXRBbW91bnQoKSwgbmlsCn0KCi8vIEdldERlcG9zaXRXaXRoZHJhd25IZWlnaHQgcmV0dXJucyB0aGUgd2l0aGRyYXduIGhlaWdodCBvZiBhIGRlcG9zaXQgYnkgaXRzIElELgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZGVwb3NpdElkOiB1bmlxdWUgZGVwb3NpdCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB3aXRoZHJhd25IZWlnaHQ6IHdpdGhkcmF3YWwgYmxvY2sgaGVpZ2h0IHJlY29yZGVkIG9uIHRoZSBkZXBvc2l0OyB6ZXJvIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3Npbmcgb3IgaW52YWxpZC4KLy8gICAtIGVycjogbmlsIGZvciBhIHZhbGlkIHN0b3JlZCBkZXBvc2l0OyBub24tbmlsIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3Npbmcgb3IgaGFzIGFuIGludmFsaWQgdHlwZS4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXREZXBvc2l0V2l0aGRyYXduSGVpZ2h0KGRlcG9zaXRJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCWRlcG9zaXQsIGVyciA6PSBscC5nZXREZXBvc2l0VmFsdWUoZGVwb3NpdElkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoJcmV0dXJuIGRlcG9zaXQuV2l0aGRyYXduSGVpZ2h0KCksIG5pbAp9CgovLyBHZXREZXBvc2l0V2l0aGRyYXduVGltZSByZXR1cm5zIHRoZSB3aXRoZHJhd24gdGltZSBvZiBhIGRlcG9zaXQgYnkgaXRzIElELgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZGVwb3NpdElkOiB1bmlxdWUgZGVwb3NpdCBpZGVudGlmaWVyIHRvIGxvb2sgdXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB3aXRoZHJhd25UaW1lOiB3aXRoZHJhd2FsIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHM7IHplcm8gd2hlbiB0aGUgZW50cnkgaXMgbWlzc2luZyBvciBpbnZhbGlkLgovLyAgIC0gZXJyOiBuaWwgZm9yIGEgdmFsaWQgc3RvcmVkIGRlcG9zaXQ7IG5vbi1uaWwgd2hlbiB0aGUgZW50cnkgaXMgbWlzc2luZyBvciBoYXMgYW4gaW52YWxpZCB0eXBlLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldERlcG9zaXRXaXRoZHJhd25UaW1lKGRlcG9zaXRJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCWRlcG9zaXQsIGVyciA6PSBscC5nZXREZXBvc2l0VmFsdWUoZGVwb3NpdElkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoJcmV0dXJuIGRlcG9zaXQuV2l0aGRyYXduVGltZSgpLCBuaWwKfQoKLy8gR2V0RGVwb3NpdENyZWF0ZWRIZWlnaHQgcmV0dXJucyB0aGUgY3JlYXRlZCBoZWlnaHQgb2YgYSBkZXBvc2l0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXRJZDogdW5pcXVlIGRlcG9zaXQgaWRlbnRpZmllciB0byBsb29rIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY3JlYXRlZEhlaWdodDogY3JlYXRpb24gYmxvY2sgaGVpZ2h0IHJlY29yZGVkIG9uIHRoZSBkZXBvc2l0OyB6ZXJvIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3Npbmcgb3IgaW52YWxpZC4KLy8gICAtIGVycjogbmlsIGZvciBhIHZhbGlkIHN0b3JlZCBkZXBvc2l0OyBub24tbmlsIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3Npbmcgb3IgaGFzIGFuIGludmFsaWQgdHlwZS4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXREZXBvc2l0Q3JlYXRlZEhlaWdodChkZXBvc2l0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglkZXBvc2l0LCBlcnIgOj0gbHAuZ2V0RGVwb3NpdFZhbHVlKGRlcG9zaXRJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCXJldHVybiBkZXBvc2l0LkNyZWF0ZWRIZWlnaHQoKSwgbmlsCn0KCi8vIEdldERlcG9zaXRDcmVhdGVkQXQgcmV0dXJucyB0aGUgY3JlYXRlZCB0aW1lIG9mIGEgZGVwb3NpdCBieSBpdHMgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0SWQ6IHVuaXF1ZSBkZXBvc2l0IGlkZW50aWZpZXIgdG8gbG9vayB1cC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNyZWF0ZWRBdDogY3JlYXRpb24gdGltZXN0YW1wIGluIFVuaXggc2Vjb25kczsgemVybyB3aGVuIHRoZSBlbnRyeSBpcyBtaXNzaW5nIG9yIGludmFsaWQuCi8vICAgLSBlcnI6IG5pbCBmb3IgYSB2YWxpZCBzdG9yZWQgZGVwb3NpdDsgbm9uLW5pbCB3aGVuIHRoZSBlbnRyeSBpcyBtaXNzaW5nIG9yIGhhcyBhbiBpbnZhbGlkIHR5cGUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0RGVwb3NpdENyZWF0ZWRBdChkZXBvc2l0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglkZXBvc2l0LCBlcnIgOj0gbHAuZ2V0RGVwb3NpdFZhbHVlKGRlcG9zaXRJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCXJldHVybiBkZXBvc2l0LkNyZWF0ZWRBdCgpLCBuaWwKfQoKLy8gR2V0RGVwb3NpdEVuZFRpbWUgcmV0dXJucyB0aGUgZW5kIHRpbWUgb2YgYSBkZXBvc2l0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXRJZDogdW5pcXVlIGRlcG9zaXQgaWRlbnRpZmllciB0byBsb29rIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZW5kVGltZTogdGllciBlbmQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kczsgemVybyB3aGVuIHRoZSBlbnRyeSBpcyBtaXNzaW5nIG9yIGludmFsaWQuCi8vICAgLSBlcnI6IG5pbCBmb3IgYSB2YWxpZCBzdG9yZWQgZGVwb3NpdDsgbm9uLW5pbCB3aGVuIHRoZSBlbnRyeSBpcyBtaXNzaW5nIG9yIGhhcyBhbiBpbnZhbGlkIHR5cGUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0RGVwb3NpdEVuZFRpbWUoZGVwb3NpdElkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJZGVwb3NpdCwgZXJyIDo9IGxwLmdldERlcG9zaXRWYWx1ZShkZXBvc2l0SWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CglyZXR1cm4gZGVwb3NpdC5FbmRUaW1lKCksIG5pbAp9CgovLyBHZXRUb3RhbEdOU1N0YWtlZEFtb3VudCByZXR1cm5zIHRoZSB0b3RhbCBhbW91bnQgb2YgR05TIGN1cnJlbnRseSBzdGFrZWQgYWNyb3NzIGFsbCBsYXVuY2hwYWQgZGVwb3NpdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IGFnZ3JlZ2F0ZSBHTlMgYW1vdW50IGN1cnJlbnRseSBzdGFrZWQgYWNyb3NzIGFsbCBsYXVuY2hwYWQgZGVwb3NpdHMuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0VG90YWxHTlNTdGFrZWRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gbHAuc3RvcmUuR2V0VG90YWxHTlNTdGFrZWRBbW91bnQoKQp9CgovLyBHZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXJDb3VudCByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcmV3YXJkIG1hbmFnZXJzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY291bnQ6IG51bWJlciBvZiBwcm9qZWN0LXRpZXIgcmV3YXJkLW1hbmFnZXIgZW50cmllcyBjdXJyZW50bHkgc3RvcmVkLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlckNvdW50KCkgaW50IHsKCW1hbmFnZXJzIDo9IGxwLnN0b3JlLkdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlcnMoKQoJcmV0dXJuIG1hbmFnZXJzLlNpemUoKQp9CgovLyBHZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXIgcmV0cmlldmVzIGEgcmV3YXJkIG1hbmFnZXIgYnkgcHJvamVjdCB0aWVyIElELgovLyBSZXR1cm5zIG5pbCBhbmQgZXJyb3IgaWYgcmV3YXJkIG1hbmFnZXIgbm90IGZvdW5kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdFRpZXJJZDogY29tcG9zaXRlIHByb2plY3QtdGllciBpZGVudGlmaWVyIHdob3NlIHJld2FyZCBtYW5hZ2VyIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG1hbmFnZXI6IG1hdGNoaW5nIHJld2FyZCBtYW5hZ2VyOyBuaWwgd2hlbiBubyBlbnRyeSBleGlzdHMgb3IgaXRzIHZhbHVlIGhhcyBhbiBpbnZhbGlkIHR5cGUuCi8vICAgLSBlcnI6IG5pbCBmb3IgYSB2YWxpZCBtYW5hZ2VyOyBub24tbmlsIHdoZW4gdGhlIGVudHJ5IGlzIGFic2VudCBvciBoYXMgYW4gaW52YWxpZCB0eXBlLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlcihwcm9qZWN0VGllcklkIHN0cmluZykgKCpsYXVuY2hwYWQuUmV3YXJkTWFuYWdlciwgZXJyb3IpIHsKCW1hbmFnZXJzIDo9IGxwLnN0b3JlLkdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlcnMoKQoJdmFsdWUgOj0gbWFuYWdlcnMuR2V0KHByb2plY3RUaWVySWQpCglpZiB2YWx1ZSA9PSBuaWwgewoJCXJldHVybiBuaWwsIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckRhdGFOb3RGb3VuZCwgInJld2FyZCBtYW5hZ2VyIG5vdCBmb3VuZCIpCgl9CgoJbWFuYWdlciwgb2sgOj0gdmFsdWUuKCpsYXVuY2hwYWQuUmV3YXJkTWFuYWdlcikKCWlmICFvayB7CgkJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldygiaW52YWxpZCByZXdhcmQgbWFuYWdlciB0eXBlIikKCX0KCglyZXR1cm4gbWFuYWdlciwgbmlsCn0KCi8vIEdldFByb2plY3RUaWVyUmV3YXJkRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjggcmV0dXJucyB0aGUgZGlzdHJpYnV0ZSBhbW91bnQgcGVyIHNlY29uZCAoUTEyOCkgb2YgYSByZXdhcmQgbWFuYWdlci4KLy8gUmV0dXJucyBuaWwgYW5kIGVycm9yIGlmIHJld2FyZCBtYW5hZ2VyIG5vdCBmb3VuZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RUaWVySWQ6IGNvbXBvc2l0ZSBwcm9qZWN0LXRpZXIgaWRlbnRpZmllciB3aG9zZSByZXdhcmQgbWFuYWdlciBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnRQZXJTZWNvbmRYMTI4OiBwZXItc2Vjb25kIGRpc3RyaWJ1dGlvbiByYXRlIGVuY29kZWQgYXMgYSBRMTI4IGZpeGVkLXBvaW50IHZhbHVlOyBuaWwgd2hlbiBsb29rdXAgZmFpbHMuCi8vICAgLSBlcnI6IG5pbCB3aGVuIGZvdW5kOyBub24tbmlsIHdoZW4gdGhlIHJld2FyZCBtYW5hZ2VyIGlzIGFic2VudCBvciBoYXMgYW4gaW52YWxpZCB0eXBlLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyUmV3YXJkRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgocHJvamVjdFRpZXJJZCBzdHJpbmcpICgqdWludDI1Ni5VaW50LCBlcnJvcikgewoJbWFuYWdlciwgZXJyIDo9IGxwLkdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlcihwcm9qZWN0VGllcklkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CgoJcmV0dXJuIG1hbmFnZXIuRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgoKSwgbmlsCn0KCi8vIEdldFByb2plY3RUaWVyUmV3YXJkQWNjdW11bGF0ZWRSZXdhcmRQZXJEZXBvc2l0WDEyOCByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCByZXdhcmQgcGVyIGRlcG9zaXQgKFExMjgpIG9mIGEgcmV3YXJkIG1hbmFnZXIuCi8vIFJldHVybnMgbmlsIGFuZCBlcnJvciBpZiByZXdhcmQgbWFuYWdlciBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0VGllcklkOiBjb21wb3NpdGUgcHJvamVjdC10aWVyIGlkZW50aWZpZXIgd2hvc2UgcmV3YXJkIG1hbmFnZXIgaXMgcmVxdWVzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYWNjdW11bGF0ZWRSZXdhcmRQZXJEZXBvc2l0WDEyODogYWNjdW11bGF0ZWQgcmV3YXJkIGluZGV4IHBlciBkZXBvc2l0ZWQgR05TLCBlbmNvZGVkIGFzIFExMjg7IG5pbCB3aGVuIGxvb2t1cCBmYWlscy4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiB0aGUgcmV3YXJkIG1hbmFnZXIgaXMgYWJzZW50IG9yIGhhcyBhbiBpbnZhbGlkIHR5cGUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0UHJvamVjdFRpZXJSZXdhcmRBY2N1bXVsYXRlZFJld2FyZFBlckRlcG9zaXRYMTI4KHByb2plY3RUaWVySWQgc3RyaW5nKSAoKnVpbnQyNTYuVWludCwgZXJyb3IpIHsKCW1hbmFnZXIsIGVyciA6PSBscC5HZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXIocHJvamVjdFRpZXJJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCXJldHVybiBtYW5hZ2VyLkFjY3VtdWxhdGVkUmV3YXJkUGVyRGVwb3NpdFgxMjgoKSwgbmlsCn0KCi8vIEdldFByb2plY3RUaWVyUmV3YXJkVG90YWxEaXN0cmlidXRlQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGRpc3RyaWJ1dGUgYW1vdW50IG9mIGEgcmV3YXJkIG1hbmFnZXIuCi8vIFJldHVybnMgMCBhbmQgZXJyb3IgaWYgcmV3YXJkIG1hbmFnZXIgbm90IGZvdW5kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdFRpZXJJZDogY29tcG9zaXRlIHByb2plY3QtdGllciBpZGVudGlmaWVyIHdob3NlIHJld2FyZCBtYW5hZ2VyIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogdG90YWwgdG9rZW4gYW1vdW50IGFsbG9jYXRlZCB0byB0aGUgcmV3YXJkIG1hbmFnZXI7IHplcm8gd2hlbiBsb29rdXAgZmFpbHMuCi8vICAgLSBlcnI6IG5pbCB3aGVuIGZvdW5kOyBub24tbmlsIHdoZW4gdGhlIHJld2FyZCBtYW5hZ2VyIGlzIGFic2VudCBvciBoYXMgYW4gaW52YWxpZCB0eXBlLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyUmV3YXJkVG90YWxEaXN0cmlidXRlQW1vdW50KHByb2plY3RUaWVySWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CgltYW5hZ2VyLCBlcnIgOj0gbHAuR2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VyKHByb2plY3RUaWVySWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJcmV0dXJuIG1hbmFnZXIuVG90YWxEaXN0cmlidXRlQW1vdW50KCksIG5pbAp9CgovLyBHZXRQcm9qZWN0VGllclJld2FyZFRvdGFsQ2xhaW1lZEFtb3VudCByZXR1cm5zIHRoZSB0b3RhbCBjbGFpbWVkIGFtb3VudCBvZiBhIHJld2FyZCBtYW5hZ2VyLgovLyBSZXR1cm5zIDAgYW5kIGVycm9yIGlmIHJld2FyZCBtYW5hZ2VyIG5vdCBmb3VuZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RUaWVySWQ6IGNvbXBvc2l0ZSBwcm9qZWN0LXRpZXIgaWRlbnRpZmllciB3aG9zZSByZXdhcmQgbWFuYWdlciBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IHRvdGFsIHRva2VuIGFtb3VudCBhbHJlYWR5IGNsYWltZWQgZnJvbSB0aGUgcmV3YXJkIG1hbmFnZXI7IHplcm8gd2hlbiBsb29rdXAgZmFpbHMuCi8vICAgLSBlcnI6IG5pbCB3aGVuIGZvdW5kOyBub24tbmlsIHdoZW4gdGhlIHJld2FyZCBtYW5hZ2VyIGlzIGFic2VudCBvciBoYXMgYW4gaW52YWxpZCB0eXBlLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyUmV3YXJkVG90YWxDbGFpbWVkQW1vdW50KHByb2plY3RUaWVySWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CgltYW5hZ2VyLCBlcnIgOj0gbHAuR2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VyKHByb2plY3RUaWVySWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJcmV0dXJuIG1hbmFnZXIuVG90YWxDbGFpbWVkQW1vdW50KCksIG5pbAp9CgovLyBHZXRQcm9qZWN0VGllclJld2FyZERpc3RyaWJ1dGVTdGFydFRpbWUgcmV0dXJucyB0aGUgZGlzdHJpYnV0ZSBzdGFydCB0aW1lIG9mIGEgcmV3YXJkIG1hbmFnZXIuCi8vIFJldHVybnMgMCBhbmQgZXJyb3IgaWYgcmV3YXJkIG1hbmFnZXIgbm90IGZvdW5kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdFRpZXJJZDogY29tcG9zaXRlIHByb2plY3QtdGllciBpZGVudGlmaWVyIHdob3NlIHJld2FyZCBtYW5hZ2VyIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0YXJ0VGltZTogcmV3YXJkIGRpc3RyaWJ1dGlvbiBzdGFydCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzOyB6ZXJvIHdoZW4gbG9va3VwIGZhaWxzLgovLyAgIC0gZXJyOiBuaWwgd2hlbiBmb3VuZDsgbm9uLW5pbCB3aGVuIHRoZSByZXdhcmQgbWFuYWdlciBpcyBhYnNlbnQgb3IgaGFzIGFuIGludmFsaWQgdHlwZS4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXRQcm9qZWN0VGllclJld2FyZERpc3RyaWJ1dGVTdGFydFRpbWUocHJvamVjdFRpZXJJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCW1hbmFnZXIsIGVyciA6PSBscC5HZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXIocHJvamVjdFRpZXJJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCglyZXR1cm4gbWFuYWdlci5EaXN0cmlidXRlU3RhcnRUaW1lKCksIG5pbAp9CgovLyBHZXRQcm9qZWN0VGllclJld2FyZERpc3RyaWJ1dGVFbmRUaW1lIHJldHVybnMgdGhlIGRpc3RyaWJ1dGUgZW5kIHRpbWUgb2YgYSByZXdhcmQgbWFuYWdlci4KLy8gUmV0dXJucyAwIGFuZCBlcnJvciBpZiByZXdhcmQgbWFuYWdlciBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0VGllcklkOiBjb21wb3NpdGUgcHJvamVjdC10aWVyIGlkZW50aWZpZXIgd2hvc2UgcmV3YXJkIG1hbmFnZXIgaXMgcmVxdWVzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZW5kVGltZTogcmV3YXJkIGRpc3RyaWJ1dGlvbiBlbmQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kczsgemVybyB3aGVuIGxvb2t1cCBmYWlscy4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiB0aGUgcmV3YXJkIG1hbmFnZXIgaXMgYWJzZW50IG9yIGhhcyBhbiBpbnZhbGlkIHR5cGUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0UHJvamVjdFRpZXJSZXdhcmREaXN0cmlidXRlRW5kVGltZShwcm9qZWN0VGllcklkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJbWFuYWdlciwgZXJyIDo9IGxwLkdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlcihwcm9qZWN0VGllcklkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoKCXJldHVybiBtYW5hZ2VyLkRpc3RyaWJ1dGVFbmRUaW1lKCksIG5pbAp9CgovLyBHZXRQcm9qZWN0VGllclJld2FyZEFjY3VtdWxhdGVkRGlzdHJpYnV0ZUFtb3VudCByZXR1cm5zIGEgbGVnYWN5IHJld2FyZC1tYW5hZ2VyIGZpZWxkLgovLyBUaGUgdjEgcmV3YXJkIHBhdGhzIGRvIG5vdCBtYWludGFpbiBpdCwgc28gbm9ybWFsIHJlYWRzIHJldHVybiB6ZXJvIHVubGVzcyBpdAovLyB3YXMgZXhwbGljaXRseSBzZXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0VGllcklkOiBjb21wb3NpdGUgcHJvamVjdC10aWVyIGlkZW50aWZpZXIgd2hvc2UgcmV3YXJkIG1hbmFnZXIgaXMgcmVxdWVzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBsZWdhY3kgYWNjdW11bGF0ZWQtZGlzdHJpYnV0aW9uIGFtb3VudCwgbm9ybWFsbHkgemVybyBpbiB2MSB1bmxlc3MgZXhwbGljaXRseSBzZXQuCi8vICAgLSBlcnI6IG5pbCB3aGVuIGZvdW5kOyBub24tbmlsIHdoZW4gdGhlIHJld2FyZCBtYW5hZ2VyIGlzIGFic2VudCBvciBoYXMgYW4gaW52YWxpZCB0eXBlLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyUmV3YXJkQWNjdW11bGF0ZWREaXN0cmlidXRlQW1vdW50KHByb2plY3RUaWVySWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CgltYW5hZ2VyLCBlcnIgOj0gbHAuR2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VyKHByb2plY3RUaWVySWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJcmV0dXJuIG1hbmFnZXIuQWNjdW11bGF0ZWREaXN0cmlidXRlQW1vdW50KCksIG5pbAp9CgovLyBHZXRQcm9qZWN0VGllclJld2FyZEFjY3VtdWxhdGVkVGltZSByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB0aW1lIG9mIGEgcmV3YXJkIG1hbmFnZXIuCi8vIFJldHVybnMgMCBhbmQgZXJyb3IgaWYgcmV3YXJkIG1hbmFnZXIgbm90IGZvdW5kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdFRpZXJJZDogY29tcG9zaXRlIHByb2plY3QtdGllciBpZGVudGlmaWVyIHdob3NlIHJld2FyZCBtYW5hZ2VyIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFjY3VtdWxhdGVkVGltZTogdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcyBhdCB3aGljaCByZXdhcmQgYWNjdW11bGF0aW9uIHdhcyBsYXN0IHVwZGF0ZWQ7IHplcm8gYmVmb3JlIGFuIHVwZGF0ZS4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiB0aGUgcmV3YXJkIG1hbmFnZXIgaXMgYWJzZW50IG9yIGhhcyBhbiBpbnZhbGlkIHR5cGUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgR2V0UHJvamVjdFRpZXJSZXdhcmRBY2N1bXVsYXRlZFRpbWUocHJvamVjdFRpZXJJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCW1hbmFnZXIsIGVyciA6PSBscC5HZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXIocHJvamVjdFRpZXJJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCglyZXR1cm4gbWFuYWdlci5BY2N1bXVsYXRlZFRpbWUoKSwgbmlsCn0KCi8vIEdldFByb2plY3RUaWVyUmV3YXJkQ2xhaW1hYmxlRHVyYXRpb24gcmV0dXJucyB0aGUgcmV3YXJkIGNsYWltYWJsZSBkdXJhdGlvbiBvZiBhIHJld2FyZCBtYW5hZ2VyLgovLyBSZXR1cm5zIDAgYW5kIGVycm9yIGlmIHJld2FyZCBtYW5hZ2VyIG5vdCBmb3VuZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RUaWVySWQ6IGNvbXBvc2l0ZSBwcm9qZWN0LXRpZXIgaWRlbnRpZmllciB3aG9zZSByZXdhcmQgbWFuYWdlciBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBkdXJhdGlvbjogY29uZmlndXJlZCBwZXJpb2QgZHVyaW5nIHdoaWNoIHJld2FyZHMgcmVtYWluIGNsYWltYWJsZSwgaW4gdGhlIG1hbmFnZXIncyB0aW1lc3RhbXAgdW5pdHM7IHplcm8gd2hlbiBsb29rdXAgZmFpbHMuCi8vICAgLSBlcnI6IG5pbCB3aGVuIGZvdW5kOyBub24tbmlsIHdoZW4gdGhlIHJld2FyZCBtYW5hZ2VyIGlzIGFic2VudCBvciBoYXMgYW4gaW52YWxpZCB0eXBlLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RUaWVyUmV3YXJkQ2xhaW1hYmxlRHVyYXRpb24ocHJvamVjdFRpZXJJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCW1hbmFnZXIsIGVyciA6PSBscC5HZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXIocHJvamVjdFRpZXJJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCglyZXR1cm4gbWFuYWdlci5SZXdhcmRDbGFpbWFibGVEdXJhdGlvbigpLCBuaWwKfQoKLy8gR2V0UmV3YXJkU3RhdGUgcmV0cmlldmVzIGEgcmV3YXJkIHN0YXRlIGJ5IHByb2plY3QgdGllciBJRCBhbmQgZGVwb3NpdCBJRC4KLy8gUmV0dXJucyBuaWwgYW5kIGVycm9yIGlmIHJld2FyZCBtYW5hZ2VyIG9yIHJld2FyZCBzdGF0ZSBub3QgZm91bmQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0VGllcklkOiBjb21wb3NpdGUgcHJvamVjdC10aWVyIGlkZW50aWZpZXIgd2hvc2UgcmV3YXJkIG1hbmFnZXIgY29udGFpbnMgdGhlIHN0YXRlLgovLyAgIC0gZGVwb3NpdElkOiB1bmlxdWUgZGVwb3NpdCBpZGVudGlmaWVyIHdob3NlIHJld2FyZCBzdGF0ZSBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXdhcmRTdGF0ZTogbWF0Y2hpbmcgcmV3YXJkIHN0YXRlOyBuaWwgd2hlbiB0aGUgbWFuYWdlciBvciBzdGF0ZSBpcyBhYnNlbnQgb3IgaGFzIGFuIGludmFsaWQgdHlwZS4KLy8gICAtIGVycjogbmlsIHdoZW4gZm91bmQ7IG5vbi1uaWwgd2hlbiB0aGUgbWFuYWdlciBvciBzdGF0ZSBpcyBhYnNlbnQgb3IgaGFzIGFuIGludmFsaWQgdHlwZS4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBHZXRSZXdhcmRTdGF0ZShwcm9qZWN0VGllcklkIHN0cmluZywgZGVwb3NpdElkIHN0cmluZykgKCpsYXVuY2hwYWQuUmV3YXJkU3RhdGUsIGVycm9yKSB7CgltYW5hZ2VycyA6PSBscC5zdG9yZS5HZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXJzKCkKCXZhbHVlIDo9IG1hbmFnZXJzLkdldChwcm9qZWN0VGllcklkKQoJaWYgdmFsdWUgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJEYXRhTm90Rm91bmQsICJyZXdhcmQgbWFuYWdlciBub3QgZm91bmQiKQoJfQoKCW1hbmFnZXIsIG9rIDo9IHZhbHVlLigqbGF1bmNocGFkLlJld2FyZE1hbmFnZXIpCglpZiAhb2sgewoJCXJldHVybiBuaWwsIGVycm9ycy5OZXcoImludmFsaWQgcmV3YXJkIG1hbmFnZXIgdHlwZSIpCgl9CgoJcmV3YXJkcyA6PSBtYW5hZ2VyLlJld2FyZHMoKQoJcmV3YXJkVmFsdWUgOj0gcmV3YXJkcy5HZXQoZGVwb3NpdElkKQoJaWYgcmV3YXJkVmFsdWUgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJEYXRhTm90Rm91bmQsICJyZXdhcmQgc3RhdGUgbm90IGZvdW5kIikKCX0KCglyZXdhcmRTdGF0ZSwgb2sgOj0gcmV3YXJkVmFsdWUuKCpsYXVuY2hwYWQuUmV3YXJkU3RhdGUpCglpZiAhb2sgewoJCXJldHVybiBuaWwsIGVycm9ycy5OZXcoImludmFsaWQgcmV3YXJkIHN0YXRlIHR5cGUiKQoJfQoKCXJldHVybiByZXdhcmRTdGF0ZSwgbmlsCn0KCi8vIEdldFByb2plY3RBY3RpdmVTdGF0dXMgcmV0dXJucyB3aGV0aGVyIGEgcHJvamVjdCBpcyBjdXJyZW50bHkgYWN0aXZlLgovLyBSZXR1cm5zIGZhbHNlIGFuZCBlcnJvciBpZiBwcm9qZWN0IG5vdCBmb3VuZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RJZDogdW5pcXVlIGxhdW5jaHBhZCBwcm9qZWN0IGlkZW50aWZpZXIgdG8gbG9vayB1cC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFjdGl2ZTogdHJ1ZSB3aGVuIHRoZSBwcm9qZWN0J3Mgc3RhbmRhcmQgMTgwLWRheSB0aWVyIGlzIGFjdGl2ZSBhdCB0aGUgY3VycmVudCBVbml4IHRpbWU7IGZhbHNlIHdoZW4gaW5hY3RpdmUuCi8vICAgLSBlcnI6IG5pbCB3aGVuIGZvdW5kOyBub24tbmlsIHdoZW4gcHJvamVjdElkIGlzIG5vdCBwcmVzZW50IGluIHN0YXRlLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIEdldFByb2plY3RBY3RpdmVTdGF0dXMocHJvamVjdElkIHN0cmluZykgKGJvb2wsIGVycm9yKSB7Cglwcm9qZWN0LCBlcnIgOj0gbHAuZ2V0UHJvamVjdChwcm9qZWN0SWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZmFsc2UsIGVycgoJfQoKCWN1cnJlbnRUaW1lIDo9IHRpbWUuTm93KCkuVW5peCgpCglyZXR1cm4gaXNQcm9qZWN0QWN0aXZlKHByb2plY3QsIGN1cnJlbnRUaW1lKSwgbmlsCn0KGowJChBnZXR0ZXJfdXRpbHMuZ25vEvcIcGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAoCgkiZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZCIKKQoKLy8gVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgbWFrZUVudHJ5U2FmZUZuIHRyYW5zZm9ybWF0aW9ucyBoYW5kZWQgdG8KLy8gcm90cmVlLldyYXAuIFRoZXkgcnVuIG9uIGV2ZXJ5IHJlYWQgdGhyb3VnaCBhIHJlYWQtb25seSB2aWV3LCBzbyBlYWNoIG9uZQovLyByZXR1cm5zIGEgdmFsdWUgdGhlIGNhbGxlciBtYXkgaG9sZCB3aXRob3V0IHJlYWNoaW5nIHJlYWxtLW93bmVkIHN0YXRlLgoKLy8gY2xvbmVQcm9qZWN0RW50cnkgaXMgdGhlIHRyYW5zZm9ybWF0aW9uIGZvciB0aGUgcHJvamVjdCB0cmVlLiBQcm9qZWN0IGlzCi8vIG11dGFibGUgYW5kIGl0cyBzZXR0ZXJzIGFyZSBkZWNsYXJlZCBpbiAvci9nbm9zd2FwL2xhdW5jaHBhZCwgc28gYW4gZXh0ZXJuYWwKLy8gaG9sZGVyIG9mIHRoZSBzdG9yZWQgcG9pbnRlciBjb3VsZCB3cml0ZSByZWFsbSBzdGF0ZSB0aHJvdWdoIGl0LgovLwovLyBQcm9qZWN0LkNsb25lIGxlYXZlcyB0aGUgcHJvamVjdCdzIG1hcHMgbmlsOyBzZWUgaXQgZm9yIHdoaWNoIGxvb2t1cHMgcmVhZAovLyB0aGVtIGluc3RlYWQuCmZ1bmMgY2xvbmVQcm9qZWN0RW50cnkodmFsdWUgYW55KSBhbnkgewoJcHJvamVjdCwgb2sgOj0gdmFsdWUuKCpsYXVuY2hwYWQuUHJvamVjdCkKCWlmICFvayB7CgkJcmV0dXJuIG5pbAoJfQoKCXJldHVybiBwcm9qZWN0LkNsb25lKCkKfQoKLy8gY2xvbmVSZXdhcmRTdGF0ZUVudHJ5IGlzIHRoZSB0cmFuc2Zvcm1hdGlvbiBmb3IgYSBwcm9qZWN0IHRpZXIncyByZXdhcmQKLy8gdHJlZS4gUmV3YXJkU3RhdGUgaXMgbXV0YWJsZSBhbmQgaXRzIHNldHRlcnMgYXJlIGRlY2xhcmVkIGluCi8vIC9yL2dub3N3YXAvbGF1bmNocGFkLCBzbyBhbiBleHRlcm5hbCBob2xkZXIgb2YgdGhlIHN0b3JlZCBwb2ludGVyIGNvdWxkCi8vIHdyaXRlIHJlYWxtIHN0YXRlIHRocm91Z2ggaXQuCmZ1bmMgY2xvbmVSZXdhcmRTdGF0ZUVudHJ5KHZhbHVlIGFueSkgYW55IHsKCXJld2FyZFN0YXRlLCBvayA6PSB2YWx1ZS4oKmxhdW5jaHBhZC5SZXdhcmRTdGF0ZSkKCWlmICFvayB7CgkJcmV0dXJuIG5pbAoJfQoKCXJldHVybiByZXdhcmRTdGF0ZS5DbG9uZSgpCn0KGkYKC2dub21vZC50b21sEjdtb2R1bGUgPSAiZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZC92MSIKZ25vID0gIjAuOSIKGs4LCghpbml0LmdubxLBC3BhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgImduby5sYW5kL3IvZ25vc3dhcC9sYXVuY2hwYWQiCgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CglyZWdpc3RlckxhdW5jaHBhZFYxKGN1cikKfQoKZnVuYyByZWdpc3RlckxhdW5jaHBhZFYxKGN1ciByZWFsbSkgewoJbGF1bmNocGFkLlJlZ2lzdGVySW5pdGlhbGl6ZXIoY3Jvc3MoY3VyKSwgZnVuYyhfIGludCwgcmxtIHJlYWxtLCBsYXVuY2hwYWRTdG9yZSBsYXVuY2hwYWQuSUxhdW5jaHBhZFN0b3JlKSBsYXVuY2hwYWQuSUxhdW5jaHBhZCB7CgkJZXJyIDo9IGluaXRTdG9yZURhdGEoMCwgcmxtLCBsYXVuY2hwYWRTdG9yZSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoZXJyKQoJCX0KCgkJcmV0dXJuIE5ld0xhdW5jaHBhZFYxKGxhdW5jaHBhZFN0b3JlKQoJfSkKfQoKZnVuYyBpbml0U3RvcmVEYXRhKF8gaW50LCBybG0gcmVhbG0sIGxhdW5jaHBhZFN0b3JlIGxhdW5jaHBhZC5JTGF1bmNocGFkU3RvcmUpIGVycm9yIHsKCWlmICFsYXVuY2hwYWRTdG9yZS5IYXNQcm9qZWN0c0tleSgpIHsKCQllcnIgOj0gbGF1bmNocGFkU3RvcmUuU2V0UHJvamVjdHMoMCwgcmxtLCBsYXVuY2hwYWQuTmV3QlBUcmVlTigxNikpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9Cgl9CgoJaWYgIWxhdW5jaHBhZFN0b3JlLkhhc1Byb2plY3RSZWNpcGllbnRzS2V5KCkgewoJCWVyciA6PSBsYXVuY2hwYWRTdG9yZS5TZXRQcm9qZWN0UmVjaXBpZW50cygwLCBybG0sIGxhdW5jaHBhZC5OZXdCUFRyZWVOKDE2KSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0KCglpZiAhbGF1bmNocGFkU3RvcmUuSGFzUHJvamVjdFRpZXJSZXdhcmRNYW5hZ2Vyc0tleSgpIHsKCQllcnIgOj0gbGF1bmNocGFkU3RvcmUuU2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VycygwLCBybG0sIGxhdW5jaHBhZC5OZXdCUFRyZWVOKDE2KSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0KCglpZiAhbGF1bmNocGFkU3RvcmUuSGFzRGVwb3NpdENvdW50ZXJTdG9yZUtleSgpIHsKCQllcnIgOj0gbGF1bmNocGFkU3RvcmUuU2V0RGVwb3NpdENvdW50ZXIoMCwgcmxtLCBsYXVuY2hwYWQuTmV3Q291bnRlcigpKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gZXJyCgkJfQoJfQoKCWlmICFsYXVuY2hwYWRTdG9yZS5IYXNEZXBvc2l0c0tleSgpIHsKCQllcnIgOj0gbGF1bmNocGFkU3RvcmUuU2V0RGVwb3NpdHMoMCwgcmxtLCBsYXVuY2hwYWQuTmV3QlBUcmVlTigxNikpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9Cgl9CgoJaWYgIWxhdW5jaHBhZFN0b3JlLkhhc1RvdGFsR05TU3Rha2VkQW1vdW50S2V5KCkgewoJCWVyciA6PSBsYXVuY2hwYWRTdG9yZS5TZXRUb3RhbEdOU1N0YWtlZEFtb3VudCgwLCBybG0sIDApCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9Cgl9CgoJcmV0dXJuIG5pbAp9ChrKBAoMaW5zdGFuY2UuZ25vErkEcGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAoCgkiZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZCIKKQoKdHlwZSBsYXVuY2hwYWRWMSBzdHJ1Y3QgewoJc3RvcmUgbGF1bmNocGFkLklMYXVuY2hwYWRTdG9yZQp9CgovLyBOZXdMYXVuY2hwYWRWMSBjb25zdHJ1Y3RzIGEgdmVyc2lvbi1vbmUgbGF1bmNocGFkIGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBsYXVuY2hwYWRTdG9yZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGxhdW5jaHBhZFN0b3JlOiBzdG9yZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGZvciBhbGwgbGF1bmNocGFkIHN0YXRlIHJlYWRzIGFuZCB3cml0ZXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBsYXVuY2hwYWQ6IGxhdW5jaHBhZCBpbXBsZW1lbnRhdGlvbiB0aGF0IGRlbGVnYXRlcyBwZXJzaXN0ZW5jZSB0byBsYXVuY2hwYWRTdG9yZS4KZnVuYyBOZXdMYXVuY2hwYWRWMShsYXVuY2hwYWRTdG9yZSBsYXVuY2hwYWQuSUxhdW5jaHBhZFN0b3JlKSBsYXVuY2hwYWQuSUxhdW5jaHBhZCB7CglyZXR1cm4gJmxhdW5jaHBhZFYxewoJCXN0b3JlOiBsYXVuY2hwYWRTdG9yZSwKCX0KfQoa4y8KFWxhdW5jaHBhZF9kZXBvc2l0LmdubxLJL3BhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkidGltZSIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKCglnbnNtYXRoICJnbm8ubGFuZC9wL2dub3N3YXAvZ25zbWF0aC92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdXRpbHMvdjEiCgoJImduby5sYW5kL3IvZ25vc3dhcC9jb21tb24iCgkiZ25vLmxhbmQvci9nbm9zd2FwL2VtaXNzaW9uIgoJImduby5sYW5kL3IvZ25vc3dhcC9nbnMiCglnb3Zfc3Rha2VyICJnbm8ubGFuZC9yL2dub3N3YXAvZ292L3N0YWtlciIKCSJnbm8ubGFuZC9yL2dub3N3YXAvZ292L3hnbnMiCgkiZ25vLmxhbmQvci9nbm9zd2FwL2hhbHQvdjEiCgkiZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZCIKCSJnbm8ubGFuZC9yL2dub3N3YXAvcmVmZXJyYWwvdjEiCikKCi8vIERlcG9zaXRHbnMgZGVwb3NpdHMgR05TIHRva2VucyB0byBhIGxhdW5jaHBhZCBwcm9qZWN0IHRpZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3IgdGhlIGZvcndhcmRlZCByZWFsbSBjYWxsOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyB0aGUgaW1wbGVtZW50YXRpb24gdmFsaWRhdGVzIGl0IGlzIHRoZSBjdXJyZW50IHJlYWxtLgovLyAgIC0gdGFyZ2V0UHJvamVjdFRpZXJJRDogcHJvamVjdC10aWVyIGlkZW50aWZpZXIgaW4gYHtwcm9qZWN0SUR9Ont0aWVyRHVyYXRpb259YCBmb3JtLgovLyAgIC0gZGVwb3NpdEFtb3VudDogYW1vdW50IG9mIEdOUyB0byBkZXBvc2l0IGludG8gdGhlIHRpZXIuCi8vICAgLSByZWZlcnJlcjogb3B0aW9uYWwgcmVmZXJyYWwgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlcG9zaXQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBkZXBvc2l0SUQ6IGlkZW50aWZpZXIgYXNzaWduZWQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZGVwb3NpdC4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBEZXBvc2l0R25zKF8gaW50LCBybG0gcmVhbG0sIHRhcmdldFByb2plY3RUaWVySUQgc3RyaW5nLCBkZXBvc2l0QW1vdW50IGludDY0LCByZWZlcnJlciBzdHJpbmcpIHN0cmluZyB7CglhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCgloYWx0LkFzc2VydElzTm90SGFsdGVkTGF1bmNocGFkKCkKCglwcmV2aW91c1JlYWxtIDo9IHJsbS5QcmV2aW91cygpCgoJYXNzZXJ0SXNWYWxpZEFtb3VudChkZXBvc2l0QW1vdW50KQoKCWVtaXNzaW9uLk1pbnRBbmREaXN0cmlidXRlR25zKGNyb3NzKHJsbSkpCgoJcHJvamVjdElELCB0aWVyRHVyYXRpb24gOj0gcGFyc2VQcm9qZWN0VGllcklEKHRhcmdldFByb2plY3RUaWVySUQpCgljYWxsZXIgOj0gcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkKCglwcm9qZWN0LCBlcnIgOj0gbHAuZ2V0UHJvamVjdChwcm9qZWN0SUQpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIuRXJyb3IoKSkKCX0KCgliZWZvcmVUb3RhbEdOU1N0YWtlZEFtb3VudCA6PSBscC5zdG9yZS5HZXRUb3RhbEdOU1N0YWtlZEFtb3VudCgpCgoJZGVwb3NpdCwgcmV3YXJkU3RhdGUsIGlzRmlyc3REZXBvc2l0LCBkaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOCwgZXJyIDo9IGxwLmRlcG9zaXRHbnMoCgkJMCwKCQlybG0sCgkJcHJvamVjdCwKCQl0aWVyRHVyYXRpb24sCgkJZGVwb3NpdEFtb3VudCwKCQljYWxsZXIsCgkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIuRXJyb3IoKSkKCX0KCglhZnRlclRvdGFsR05TU3Rha2VkQW1vdW50IDo9IGduc21hdGguU2FmZUFkZEludDY0KGJlZm9yZVRvdGFsR05TU3Rha2VkQW1vdW50LCBkZXBvc2l0QW1vdW50KQoJaWYgZXJyIDo9IGxwLnN0b3JlLlNldFRvdGFsR05TU3Rha2VkQW1vdW50KDAsIHJsbSwgYWZ0ZXJUb3RhbEdOU1N0YWtlZEFtb3VudCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfQoKCWFjdHVhbFJlZmVycmVyIDo9IHJlZmVycmFsLlRyeVJlZ2lzdGVyKGNyb3NzKHJsbSksIGNhbGxlciwgcmVmZXJyZXIpCgoJaWYgaXNGaXJzdERlcG9zaXQgewoJCWNoYWluLkVtaXQoCgkJCSJGaXJzdERlcG9zaXRGb3JQcm9qZWN0VGllciIsCgkJCSJwcmV2QWRkciIsIHByZXZpb3VzUmVhbG0uQWRkcmVzcygpLlN0cmluZygpLAoJCQkicHJldlJlYWxtIiwgcHJldmlvdXNSZWFsbS5Qa2dQYXRoKCksCgkJCSJ0YXJnZXRQcm9qZWN0VGllcklkIiwgdGFyZ2V0UHJvamVjdFRpZXJJRCwKCQkJImFtb3VudCIsIHV0aWxzLkZvcm1hdEludChkZXBvc2l0QW1vdW50KSwKCQkJImRlcG9zaXRJZCIsIGRlcG9zaXQuSUQoKSwKCQkJImNsYWltYWJsZVRpbWUiLCB1dGlscy5Gb3JtYXRJbnQocmV3YXJkU3RhdGUuQ2xhaW1hYmxlVGltZSgpKSwKCQkJInRpZXJBbW91bnRQZXJTZWNvbmRYMTI4IiwgZGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgsCgkJCSJ0b3RhbEdOU1N0YWtlZEFtb3VudCIsIHV0aWxzLkZvcm1hdEludChhZnRlclRvdGFsR05TU3Rha2VkQW1vdW50KSwKCQkJInJlY2lwaWVudCIsIHByb2plY3QuUmVjaXBpZW50KCkuU3RyaW5nKCksCgkJKQoJfQoKCWNoYWluLkVtaXQoCgkJIkRlcG9zaXRHbnMiLAoJCSJwcmV2QWRkciIsIHByZXZpb3VzUmVhbG0uQWRkcmVzcygpLlN0cmluZygpLAoJCSJwcmV2UmVhbG0iLCBwcmV2aW91c1JlYWxtLlBrZ1BhdGgoKSwKCQkidGFyZ2V0UHJvamVjdFRpZXJJZCIsIHRhcmdldFByb2plY3RUaWVySUQsCgkJImFtb3VudCIsIHV0aWxzLkZvcm1hdEludChkZXBvc2l0QW1vdW50KSwKCQkiZGVwb3NpdElkIiwgZGVwb3NpdC5JRCgpLAoJCSJjbGFpbWFibGVUaW1lIiwgdXRpbHMuRm9ybWF0SW50KHJld2FyZFN0YXRlLkNsYWltYWJsZVRpbWUoKSksCgkJInJlZmVycmVyIiwgYWN0dWFsUmVmZXJyZXIsCgkJInRvdGFsR05TU3Rha2VkQW1vdW50IiwgdXRpbHMuRm9ybWF0SW50KGFmdGVyVG90YWxHTlNTdGFrZWRBbW91bnQpLAoJCSJyZWNpcGllbnQiLCBwcm9qZWN0LlJlY2lwaWVudCgpLlN0cmluZygpLAoJKQoKCWxhdW5jaHBhZEFkZHJlc3MgOj0gcmxtLkFkZHJlc3MoKQoKCS8vIHN0YWtlIGdvdmVybmFuY2UgdG9rZW4gdG8gdGhlIHByb2plY3QKCWVyciA9IGxwLnN0YWtlR292ZXJuYW5jZSgwLCBybG0sIHByb2plY3QuUmVjaXBpZW50KCksIGRlcG9zaXRBbW91bnQsIGxhdW5jaHBhZEFkZHJlc3MsIGNhbGxlcikKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfQoKCXJldHVybiBkZXBvc2l0LklEKCkKfQoKLy8gZGVwb3NpdEducyBkZXBvc2l0cyBHTlMgdG8gYSBwcm9qZWN0IHRpZXIuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgZGVwb3NpdEducygKCV8gaW50LAoJcmxtIHJlYWxtLAoJcHJvamVjdCAqbGF1bmNocGFkLlByb2plY3QsCgl0aWVyRHVyYXRpb24gaW50NjQsCglkZXBvc2l0QW1vdW50IGludDY0LAoJY2FsbGVyQWRkcmVzcyBhZGRyZXNzLAopIChsYXVuY2hwYWQuRGVwb3NpdCwgKmxhdW5jaHBhZC5SZXdhcmRTdGF0ZSwgYm9vbCwgc3RyaW5nLCBlcnJvcikgewoJYmFsYW5jZU9mRm4gOj0gZnVuYyh0b2tlblBhdGggc3RyaW5nLCBjYWxsZXIgYWRkcmVzcykgaW50NjQgewoJCWlmIHRva2VuUGF0aCA9PSBHT1ZfWEdOU19QQVRIIHsKCQkJcmV0dXJuIHhnbnMuQmFsYW5jZU9mKGNhbGxlcikKCQl9CgoJCXJldHVybiBjb21tb24uQmFsYW5jZU9mKHRva2VuUGF0aCwgY2FsbGVyKQoJfQoKCWVyciA6PSBjaGVja1Byb2plY3RDb25kaXRpb25zKHByb2plY3QsIGNhbGxlckFkZHJlc3MsIGJhbGFuY2VPZkZuKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGxhdW5jaHBhZC5EZWZhdWx0RGVwb3NpdCgpLCBuaWwsIGZhbHNlLCAiIiwgZXJyCgl9CgoJcHJvamVjdFRpZXIsIGVyciA6PSBnZXRQcm9qZWN0VGllcihwcm9qZWN0LCB0aWVyRHVyYXRpb24pCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbGF1bmNocGFkLkRlZmF1bHREZXBvc2l0KCksIG5pbCwgZmFsc2UsICIiLCBlcnIKCX0KCgljdXJyZW50VGltZSA6PSB0aW1lLk5vdygpLlVuaXgoKQoJY3VycmVudEhlaWdodCA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCglpZiAhcHJvamVjdFRpZXIuSXNBY3RpdmF0ZWQoY3VycmVudFRpbWUpIHsKCQlyZXR1cm4gbGF1bmNocGFkLkRlZmF1bHREZXBvc2l0KCksIG5pbCwgZmFsc2UsICIiLCBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbmFjdGl2ZVByb2plY3QsIHByb2plY3QuSUQoKSkKCX0KCglkZXBvc2l0SUQgOj0gbHAubmV4dERlcG9zaXRJRCgpCglkZXBvc2l0IDo9IGxhdW5jaHBhZC5NYWtlRGVwb3NpdCgKCQlkZXBvc2l0SUQsCgkJcHJvamVjdC5JRCgpLAoJCXRpZXJEdXJhdGlvbiwKCQljYWxsZXJBZGRyZXNzLAoJCWRlcG9zaXRBbW91bnQsCgkJY3VycmVudEhlaWdodCwKCQljdXJyZW50VGltZSwKCQlwcm9qZWN0VGllci5FbmRUaW1lKCksCgkpCgoJLy8gU3RvcmUgYSB2YWx1ZSBpbiB0aGUgZGVwb3NpdHMgdHJlZSBhbmQgcGVyc2lzdCBsYXRlciB1cGRhdGVzIGV4cGxpY2l0bHkuCglkZXBvc2l0cyA6PSBscC5zdG9yZS5HZXREZXBvc2l0cygpCglkZXBvc2l0cy5TZXQoZGVwb3NpdElELCBkZXBvc2l0KQoKCXJld2FyZE1hbmFnZXIsIGVyciA6PSBscC5nZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXIocHJvamVjdFRpZXIuSUQoKSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBsYXVuY2hwYWQuRGVmYXVsdERlcG9zaXQoKSwgbmlsLCBmYWxzZSwgIiIsIGVycgoJfQoKCWlzRmlyc3REZXBvc2l0IDo9ICFpc1Jld2FyZE1hbmFnZXJJbml0aWFsaXplZChyZXdhcmRNYW5hZ2VyKQoKCS8vIHVwZGF0ZSByZXdhcmRzIGJlZm9yZSBhZGRpbmcgZGVwb3NpdCB0byByZXdhcmQgbWFuYWdlcgoJZXJyID0gdXBkYXRlUmV3YXJkUGVyRGVwb3NpdFgxMjgocmV3YXJkTWFuYWdlciwgZ2V0VGllckN1cnJlbnREZXBvc2l0QW1vdW50KHByb2plY3RUaWVyKSwgY3VycmVudFRpbWUpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbGF1bmNocGFkLkRlZmF1bHREZXBvc2l0KCksIG5pbCwgZmFsc2UsICIiLCBlcnIKCX0KCgkvLyBhZGQgcmV3YXJkIHN0YXRlIHRvIHJld2FyZCBtYW5hZ2VyCglyZXdhcmRTdGF0ZSA6PSBhZGRSZXdhcmRTdGF0ZUJ5RGVwb3NpdChyZXdhcmRNYW5hZ2VyLCBkZXBvc2l0KQoKCS8vIHVwZGF0ZSB0aWVyIGRhdGEgYWZ0ZXIgYWRkaW5nIHJld2FyZCBzdGF0ZSB0byByZXdhcmQgbWFuYWdlcgoJZGVwb3NpdFRvVGllcihwcm9qZWN0VGllciwgZGVwb3NpdCkKCXByb2plY3QuU2V0VGllcih0aWVyRHVyYXRpb24sIHByb2plY3RUaWVyKQoKCS8vIFNhdmUgdGhlIG1vZGlmaWVkIHN0YXRlIGJhY2sKCWlmIGVyciA6PSBscC5zdG9yZS5TZXREZXBvc2l0cygwLCBybG0sIGRlcG9zaXRzKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGxhdW5jaHBhZC5EZWZhdWx0RGVwb3NpdCgpLCBuaWwsIGZhbHNlLCAiIiwgZXJyCgl9CgoJZW1pdFVwZGF0ZUxhdW5jaHBhZFJld2FyZEFjY3VtdWxhdGlvbihwcm9qZWN0VGllci5JRCgpLCByZXdhcmRNYW5hZ2VyLCBnZXRUaWVyQ3VycmVudERlcG9zaXRBbW91bnQocHJvamVjdFRpZXIpKQoKCXJldHVybiBkZXBvc2l0LAoJCXJld2FyZFN0YXRlLAoJCWlzRmlyc3REZXBvc2l0LAoJCXJld2FyZE1hbmFnZXIuRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgoKS5Ub1N0cmluZygpLAoJCW5pbAp9CgovLyBzdGFrZUdvdmVybmFuY2Ugc3Rha2VzIGdvdmVybmFuY2UgdG9rZW4gdG8gdGhlIHByb2plY3QuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgc3Rha2VHb3Zlcm5hbmNlKF8gaW50LCBybG0gcmVhbG0sIHJlY2lwaWVudCBhZGRyZXNzLCBkZXBvc2l0QW1vdW50IGludDY0LCBsYXVuY2hwYWRBZGRyZXNzIGFkZHJlc3MsIGNhbGxlckFkZHJlc3MgYWRkcmVzcykgZXJyb3IgewoJZ292X3N0YWtlci5TZXRBbW91bnRCeVByb2plY3RXYWxsZXQoY3Jvc3MocmxtKSwgcmVjaXBpZW50LCBkZXBvc2l0QW1vdW50LCB0cnVlKQoKCWducy5UcmFuc2ZlckZyb20oCgkJY3Jvc3MocmxtKSwKCQljYWxsZXJBZGRyZXNzLAoJCWxhdW5jaHBhZEFkZHJlc3MsCgkJZGVwb3NpdEFtb3VudCwKCSkKCglyZXR1cm4gbmlsCn0KGseXAQoVbGF1bmNocGFkX3Byb2plY3QuZ25vEqyXAXBhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkiZXJyb3JzIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0aW1lIgoKCWduc21hdGggImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJImduby5sYW5kL3AvZ25vc3dhcC91dGlscy92MSIKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvY29tbW9uIgoJImduby5sYW5kL3IvZ25vc3dhcC9lbWlzc2lvbiIKCSJnbm8ubGFuZC9yL2dub3N3YXAvaGFsdC92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvbGF1bmNocGFkIgopCgovLyBDcmVhdGVQcm9qZWN0IGNyZWF0ZXMgYSBuZXcgbGF1bmNocGFkIHByb2plY3Qgd2l0aCB0aWVyZWQgYWxsb2NhdGlvbnMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIGxhdW5jaHBhZCBwcm94eS4KLy8gICAtIG5hbWU6IHByb2plY3QgbmFtZSwgbGltaXRlZCBieSB0aGUgcHJvamVjdCB2YWxpZGF0aW9uIHJ1bGVzLgovLyAgIC0gdG9rZW5QYXRoOiByZXdhcmQgdG9rZW4gY29udHJhY3QgcGF0aCB3aG9zZSBiYWxhbmNlIGlzIGRlcG9zaXRlZCBpbnRvIHRoZSBwcm9qZWN0LgovLyAgIC0gcmVjaXBpZW50OiBwcm9qZWN0IHJlY2lwaWVudCBhZGRyZXNzIHJlY29yZGVkIGZvciBhdXRob3JpemF0aW9uIGFuZCBsYXRlciBjb2xsZWN0aW9uLgovLyAgIC0gZGVwb3NpdEFtb3VudDogYW1vdW50IG9mIHJld2FyZCB0b2tlbnMgdG8gZGVwb3NpdCBpbnRvIHRoZSBwcm9qZWN0LgovLyAgIC0gY29uZGl0aW9uVG9rZW5zOiBgKlBBRCpgLXNlcGFyYXRlZCB0b2tlbiBwYXRocyBmb3IgZWxpZ2liaWxpdHkgY29uZGl0aW9ucy4KLy8gICAtIGNvbmRpdGlvbkFtb3VudHM6IGAqUEFEKmAtc2VwYXJhdGVkIG1pbmltdW0gYmFsYW5jZXMgYWxpZ25lZCB3aXRoIGNvbmRpdGlvblRva2Vucy4KLy8gICAtIHRpZXIzMFJhdGlvOiBwZXJjZW50YWdlIG9mIHRoZSBhbGxvY2F0aW9uIGFzc2lnbmVkIHRvIHRoZSAzMC1kYXkgdGllci4KLy8gICAtIHRpZXI5MFJhdGlvOiBwZXJjZW50YWdlIG9mIHRoZSBhbGxvY2F0aW9uIGFzc2lnbmVkIHRvIHRoZSA5MC1kYXkgdGllci4KLy8gICAtIHRpZXIxODBSYXRpbzogcGVyY2VudGFnZSBvZiB0aGUgYWxsb2NhdGlvbiBhc3NpZ25lZCB0byB0aGUgMTgwLWRheSB0aWVyLgovLyAgIC0gc3RhcnRUaW1lOiBwcm9qZWN0IHN0YXJ0IHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMsIHN1YmplY3QgdG8gdGhlIG1pbmltdW0gZGVsYXkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwcm9qZWN0SUQ6IG5ld2x5IGNyZWF0ZWQgbGF1bmNocGFkIHByb2plY3QgaWRlbnRpZmllci4KLy8KLy8gT25seSBjYWxsYWJsZSBieSBhZG1pbiBvciBnb3Zlcm5hbmNlLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIENyZWF0ZVByb2plY3QoCglfIGludCwKCXJsbSByZWFsbSwKCW5hbWUgc3RyaW5nLAoJdG9rZW5QYXRoIHN0cmluZywKCXJlY2lwaWVudCBhZGRyZXNzLAoJZGVwb3NpdEFtb3VudCBpbnQ2NCwKCWNvbmRpdGlvblRva2VucyBzdHJpbmcsCgljb25kaXRpb25BbW91bnRzIHN0cmluZywKCXRpZXIzMFJhdGlvIGludDY0LAoJdGllcjkwUmF0aW8gaW50NjQsCgl0aWVyMTgwUmF0aW8gaW50NjQsCglzdGFydFRpbWUgaW50NjQsCikgc3RyaW5nIHsKCWFjY2Vzcy5Bc3NlcnRJc1JsbUN1cnJlbnQoMCwgcmxtKQoKCWhhbHQuQXNzZXJ0SXNOb3RIYWx0ZWRMYXVuY2hwYWQoKQoKCXByZXZpb3VzUmVhbG0gOj0gcmxtLlByZXZpb3VzKCkKCWNhbGxlciA6PSBwcmV2aW91c1JlYWxtLkFkZHJlc3MoKQoJYWNjZXNzLkFzc2VydElzQWRtaW5PckdvdmVybmFuY2UoY2FsbGVyKQoKCWxhdW5jaHBhZEFkZHIgOj0gcmxtLkFkZHJlc3MoKQoJY3VycmVudEhlaWdodCA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWN1cnJlbnRUaW1lIDo9IHRpbWUuTm93KCkuVW5peCgpCgoJcGFyYW1zIDo9ICZjcmVhdGVQcm9qZWN0UGFyYW1zewoJCW5hbWU6ICAgICAgICAgICAgICAgICAgbmFtZSwKCQl0b2tlblBhdGg6ICAgICAgICAgICAgIHRva2VuUGF0aCwKCQlyZWNpcGllbnQ6ICAgICAgICAgICAgIHJlY2lwaWVudCwKCQlkZXBvc2l0QW1vdW50OiAgICAgICAgIGRlcG9zaXRBbW91bnQsCgkJY29uZGl0aW9uVG9rZW5zOiAgICAgICBjb25kaXRpb25Ub2tlbnMsCgkJY29uZGl0aW9uQW1vdW50czogICAgICBjb25kaXRpb25BbW91bnRzLAoJCXRpZXIzMFJhdGlvOiAgICAgICAgICAgdGllcjMwUmF0aW8sCgkJdGllcjkwUmF0aW86ICAgICAgICAgICB0aWVyOTBSYXRpbywKCQl0aWVyMTgwUmF0aW86ICAgICAgICAgIHRpZXIxODBSYXRpbywKCQlzdGFydFRpbWU6ICAgICAgICAgICAgIHN0YXJ0VGltZSwKCQljdXJyZW50VGltZTogICAgICAgICAgIGN1cnJlbnRUaW1lLAoJCWN1cnJlbnRIZWlnaHQ6ICAgICAgICAgY3VycmVudEhlaWdodCwKCQltaW5pbXVtU3RhcnREZWxheVRpbWU6IHByb2plY3RNaW5pbXVtU3RhcnREZWxheVRpbWUsCgl9CgoJLy8gQ2hlY2tzOiB2YWxpZGF0ZSBiYWxhbmNlIGJlZm9yZSBjcmVhdGluZyBwcm9qZWN0Cgl0b2tlbkJhbGFuY2UgOj0gY29tbW9uLkJhbGFuY2VPZih0b2tlblBhdGgsIGNhbGxlcikKCWlmIHRva2VuQmFsYW5jZSA8IGRlcG9zaXRBbW91bnQgewoJCXBhbmljKAoJCQltYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJCWVyckluc3VmZmljaWVudEJhbGFuY2UsIHVmbXQuU3ByaW50ZigKCQkJCQkiY2FsbGVyKCVzKSBiYWxhbmNlKCVkKSA8IGRlcG9zaXRBbW91bnQoJWQpIiwKCQkJCQljYWxsZXIuU3RyaW5nKCksIHRva2VuQmFsYW5jZSwgZGVwb3NpdEFtb3VudCwKCQkJCSksCgkJCSksCgkJKQoJfQoKCS8vIEVmZmVjdHM6IGNyZWF0ZSBwcm9qZWN0IGFuZCBzYXZlIHN0YXRlCglwcm9qZWN0LCBlcnIgOj0gbHAuY3JlYXRlUHJvamVjdCgwLCBybG0sIHBhcmFtcykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgkvLyBJbnRlcmFjdGlvbnM6IHRyYW5zZmVyIHRva2VucwoJY29tbW9uLlNhZmVHUkMyMFRyYW5zZmVyRnJvbSgKCQkwLCBybG0sCgkJdG9rZW5QYXRoLAoJCWNhbGxlciwKCQlsYXVuY2hwYWRBZGRyLAoJCWRlcG9zaXRBbW91bnQsCgkpCgoJdGllcjMwLCBlcnIgOj0gZ2V0UHJvamVjdFRpZXIocHJvamVjdCwgcHJvamVjdFRpZXIzMCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgl0aWVyOTAsIGVyciA6PSBnZXRQcm9qZWN0VGllcihwcm9qZWN0LCBwcm9qZWN0VGllcjkwKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXRpZXIxODAsIGVyciA6PSBnZXRQcm9qZWN0VGllcihwcm9qZWN0LCBwcm9qZWN0VGllcjE4MCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgljb25kaXRpb25FdmVudEF0dHJzIDo9IGJ1aWxkQ29uZGl0aW9uRXZlbnRBdHRycyhwYXJhbXMuY29uZGl0aW9uVG9rZW5zLCBwYXJhbXMuY29uZGl0aW9uQW1vdW50cykKCglldmVudEF0dHJzIDo9IGFwcGVuZChbXXN0cmluZ3sKCQkicHJldkFkZHIiLCBjYWxsZXIuU3RyaW5nKCksCgkJInByZXZSZWFsbSIsIHByZXZpb3VzUmVhbG0uUGtnUGF0aCgpLAoJCSJuYW1lIiwgbmFtZSwKCQkidG9rZW5QYXRoIiwgdG9rZW5QYXRoLAoJCSJyZWNpcGllbnQiLCByZWNpcGllbnQuU3RyaW5nKCksCgkJImRlcG9zaXRBbW91bnQiLCB1dGlscy5Gb3JtYXRJbnQoZGVwb3NpdEFtb3VudCksCgkJInRpZXIzMFJhdGlvIiwgdXRpbHMuRm9ybWF0SW50KHBhcmFtcy50aWVyMzBSYXRpbyksCgkJInRpZXI5MFJhdGlvIiwgdXRpbHMuRm9ybWF0SW50KHBhcmFtcy50aWVyOTBSYXRpbyksCgkJInRpZXIxODBSYXRpbyIsIHV0aWxzLkZvcm1hdEludChwYXJhbXMudGllcjE4MFJhdGlvKSwKCQkic3RhcnRUaW1lIiwgdXRpbHMuRm9ybWF0SW50KHBhcmFtcy5zdGFydFRpbWUpLAoJCSJwcm9qZWN0SWQiLCBwcm9qZWN0LklEKCksCgkJInRpZXIzMEFtb3VudCIsIHV0aWxzLkZvcm1hdEludCh0aWVyMzAuVG90YWxEaXN0cmlidXRlQW1vdW50KCkpLAoJCSJ0aWVyMzBFbmRUaW1lIiwgdXRpbHMuRm9ybWF0SW50KHRpZXIzMC5FbmRUaW1lKCkpLAoJCSJ0aWVyOTBBbW91bnQiLCB1dGlscy5Gb3JtYXRJbnQodGllcjkwLlRvdGFsRGlzdHJpYnV0ZUFtb3VudCgpKSwKCQkidGllcjkwRW5kVGltZSIsIHV0aWxzLkZvcm1hdEludCh0aWVyOTAuRW5kVGltZSgpKSwKCQkidGllcjE4MEFtb3VudCIsIHV0aWxzLkZvcm1hdEludCh0aWVyMTgwLlRvdGFsRGlzdHJpYnV0ZUFtb3VudCgpKSwKCQkidGllcjE4MEVuZFRpbWUiLCB1dGlscy5Gb3JtYXRJbnQodGllcjE4MC5FbmRUaW1lKCkpLAoJfSwgY29uZGl0aW9uRXZlbnRBdHRycy4uLikKCgljaGFpbi5FbWl0KAoJCSJDcmVhdGVQcm9qZWN0IiwKCQlldmVudEF0dHJzLi4uLAoJKQoKCXJldHVybiBwcm9qZWN0LklEKCkKfQoKLy8gY3JlYXRlUHJvamVjdCBjcmVhdGVzIGEgbmV3IHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KLy8gVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgdGhlIGlucHV0IHBhcmFtZXRlcnMsIGNyZWF0ZXMgdGhlIHByb2plY3Qgc3RydWN0dXJlLAovLyBhbmQgc2V0cyB1cCB0aGUgcHJvamVjdCB0aWVycyBhbmQgcmV3YXJkIG1hbmFnZXJzLgovLyBSZXR1cm5zIHRoZSBjcmVhdGVkIHByb2plY3QgYW5kIGFueSBlcnJvci4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBjcmVhdGVQcm9qZWN0KF8gaW50LCBybG0gcmVhbG0sIHBhcmFtcyAqY3JlYXRlUHJvamVjdFBhcmFtcykgKCpsYXVuY2hwYWQuUHJvamVjdCwgZXJyb3IpIHsKCWlmIGVyciA6PSBwYXJhbXMudmFsaWRhdGUoKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CgoJLy8gY3JlYXRlIHByb2plY3QKCXByb2plY3QgOj0gbGF1bmNocGFkLk5ld1Byb2plY3QoCgkJcGFyYW1zLm5hbWUsCgkJcGFyYW1zLnRva2VuUGF0aCwKCQlwYXJhbXMuZGVwb3NpdEFtb3VudCwKCQlwYXJhbXMucmVjaXBpZW50LAoJCXBhcmFtcy5jdXJyZW50SGVpZ2h0LAoJCXBhcmFtcy5jdXJyZW50VGltZSwKCSkKCgkvLyBHZXQgc3RhdGUgY29tcG9uZW50cwoJcHJvamVjdHMgOj0gbHAuc3RvcmUuR2V0UHJvamVjdHMoKQoJcHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VycyA6PSBscC5zdG9yZS5HZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXJzKCkKCgkvLyBjaGVjayBkdXBsaWNhdGUgcHJvamVjdAoJaWYgcHJvamVjdHMuSGFzKHByb2plY3QuSUQoKSkgewoJCXJldHVybiBuaWwsIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJEdXBsaWNhdGVQcm9qZWN0LAoJCQl1Zm10LlNwcmludGYoInByb2plY3QoJXMpIGFscmVhZHkgZXhpc3RzIiwgcHJvamVjdC5JRCgpKSwKCQkpCgl9CgoJcHJvamVjdENvbmRpdGlvbnMsIGVyciA6PSBsYXVuY2hwYWQuTmV3UHJvamVjdENvbmRpdGlvbnNXaXRoRXJyb3IocGFyYW1zLmNvbmRpdGlvblRva2VucywgcGFyYW1zLmNvbmRpdGlvbkFtb3VudHMpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCglmb3IgXywgY29uZGl0aW9uIDo9IHJhbmdlIHByb2plY3RDb25kaXRpb25zIHsKCQlhZGRQcm9qZWN0Q29uZGl0aW9uKHByb2plY3QsIGNvbmRpdGlvbi5Ub2tlblBhdGgoKSwgY29uZGl0aW9uKQoJfQoKCXByb2plY3RUaWVyUmF0aW9zIDo9IG1hcFtpbnQ2NF1pbnQ2NHsKCQlwcm9qZWN0VGllcjMwOiAgcGFyYW1zLnRpZXIzMFJhdGlvLAoJCXByb2plY3RUaWVyOTA6ICBwYXJhbXMudGllcjkwUmF0aW8sCgkJcHJvamVjdFRpZXIxODA6IHBhcmFtcy50aWVyMTgwUmF0aW8sCgl9CgoJYWNjdW11bGF0ZWRUaWVyRGlzdHJpYnV0ZUFtb3VudCA6PSBpbnQ2NCgwKQoKCWZvciBfLCBkdXJhdGlvbiA6PSByYW5nZSBwcm9qZWN0VGllckR1cmF0aW9ucyB7CgkJcmV3YXJkQ29sbGVjdGFibGVEdXJhdGlvbiA6PSBwcm9qZWN0VGllclJld2FyZENvbGxlY3RhYmxlRHVyYXRpb25bZHVyYXRpb25dCgkJdGllckR1cmF0aW9uVGltZSA6PSBwcm9qZWN0VGllckR1cmF0aW9uVGltZXNbZHVyYXRpb25dCgkJdGllckRpc3RyaWJ1dGVBbW91bnQgOj0gZ25zbWF0aC5TYWZlTXVsRGl2SW50NjQocGFyYW1zLmRlcG9zaXRBbW91bnQsIHByb2plY3RUaWVyUmF0aW9zW2R1cmF0aW9uXSwgMTAwKQoJCWFjY3VtdWxhdGVkVGllckRpc3RyaWJ1dGVBbW91bnQgPSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChhY2N1bXVsYXRlZFRpZXJEaXN0cmlidXRlQW1vdW50LCB0aWVyRGlzdHJpYnV0ZUFtb3VudCkKCgkJLy8gaWYgdGhlIGxhc3QgdGllciwgZGlzdHJpYnV0ZSB0aGUgcmVtYWluaW5nIGFtb3VudAoJCWlmIGR1cmF0aW9uID09IHByb2plY3RUaWVyMTgwIHsKCQkJcmVtYWluVGllckRpc3RyaWJ1dGVBbW91bnQgOj0gZ25zbWF0aC5TYWZlU3ViSW50NjQocGFyYW1zLmRlcG9zaXRBbW91bnQsIGFjY3VtdWxhdGVkVGllckRpc3RyaWJ1dGVBbW91bnQpCgkJCXRpZXJEaXN0cmlidXRlQW1vdW50ID0gZ25zbWF0aC5TYWZlQWRkSW50NjQodGllckRpc3RyaWJ1dGVBbW91bnQsIHJlbWFpblRpZXJEaXN0cmlidXRlQW1vdW50KQoJCX0KCgkJcHJvamVjdFRpZXIgOj0gbmV3UHJvamVjdFRpZXIoCgkJCXByb2plY3QuSUQoKSwKCQkJZHVyYXRpb24sCgkJCXRpZXJEaXN0cmlidXRlQW1vdW50LAoJCQlwYXJhbXMuc3RhcnRUaW1lLAoJCQlwYXJhbXMuc3RhcnRUaW1lK3RpZXJEdXJhdGlvblRpbWUsCgkJKQoJCWFkZFByb2plY3RUaWVyKHByb2plY3QsIGR1cmF0aW9uLCBwcm9qZWN0VGllcikKCgkJcHJvamVjdFRpZXJSZXdhcmRNYW5hZ2Vycy5TZXQocHJvamVjdFRpZXIuSUQoKSwgbmV3UmV3YXJkTWFuYWdlcigKCQkJcHJvamVjdFRpZXIuVG90YWxEaXN0cmlidXRlQW1vdW50KCksCgkJCXByb2plY3RUaWVyLlN0YXJ0VGltZSgpLAoJCQlwcm9qZWN0VGllci5FbmRUaW1lKCksCgkJCXJld2FyZENvbGxlY3RhYmxlRHVyYXRpb24sCgkJKSkKCX0KCglwcm9qZWN0LlNldFRpZXJzUmF0aW9zKHByb2plY3RUaWVyUmF0aW9zKQoJcHJvamVjdHMuU2V0KHByb2plY3QuSUQoKSwgcHJvamVjdCkKCgkvLyBTYXZlIHRoZSBtb2RpZmllZCBzdGF0ZSBiYWNrCglpZiBlcnIgOj0gbHAuc3RvcmUuU2V0UHJvamVjdHMoMCwgcmxtLCBwcm9qZWN0cyk7IGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJaWYgZXJyIDo9IGxwLnN0b3JlLlNldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlcnMoMCwgcmxtLCBwcm9qZWN0VGllclJld2FyZE1hbmFnZXJzKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CglyZWNpcGllbnRzIDo9IGxwLnN0b3JlLkdldFByb2plY3RSZWNpcGllbnRzKCkKCXJlY2lwaWVudHMuU2V0KHByb2plY3QuUmVjaXBpZW50KCkuU3RyaW5nKCksIHRydWUpCglpZiBlcnIgOj0gbHAuc3RvcmUuU2V0UHJvamVjdFJlY2lwaWVudHMoMCwgcmxtLCByZWNpcGllbnRzKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CgoJcmV0dXJuIHByb2plY3QsIG5pbAp9CgovLyBUcmFuc2ZlckxlZnRGcm9tUHJvamVjdEJ5QWRtaW4gdHJhbnNmZXJzIHRoZSByZW1haW5pbmcgcmVmdW5kYWJsZSBwcm9qZWN0LXRva2VuCi8vIGJhbGFuY2Ugb2YgYW4gZW5kZWQgcHJvamVjdCB0byBhIHNwZWNpZmllZCByZWNpcGllbnQuCi8vIE9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbi4gQW1vdW50cyByZXNlcnZlZCBmb3IgYWN0aXZlIGRlcG9zaXRvcgovLyBjbGFpbXMgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIHRyYW5zZmVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCi8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBsYXVuY2hwYWQgcHJveHkuCi8vICAgLSBwcm9qZWN0SUQ6IElEIG9mIHRoZSBlbmRlZCBwcm9qZWN0LgovLyAgIC0gcmVjaXBpZW50OiBhZGRyZXNzIHRoYXQgcmVjZWl2ZXMgdGhlIHJlbWFpbmluZyBwcm9qZWN0LXRva2VuIGJhbGFuY2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IGFtb3VudCBvZiBwcm9qZWN0LXRva2VuIGJhbGFuY2UgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudC4KZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBUcmFuc2ZlckxlZnRGcm9tUHJvamVjdEJ5QWRtaW4oXyBpbnQsIHJsbSByZWFsbSwgcHJvamVjdElEIHN0cmluZywgcmVjaXBpZW50IGFkZHJlc3MpIGludDY0IHsKCWFjY2Vzcy5Bc3NlcnRJc1JsbUN1cnJlbnQoMCwgcmxtKQoKCWhhbHQuQXNzZXJ0SXNOb3RIYWx0ZWRMYXVuY2hwYWQoKQoKCXByZXZpb3VzUmVhbG0gOj0gcmxtLlByZXZpb3VzKCkKCWNhbGxlciA6PSBwcmV2aW91c1JlYWxtLkFkZHJlc3MoKQoJYWNjZXNzLkFzc2VydElzQWRtaW4oY2FsbGVyKQoKCWN1cnJlbnRIZWlnaHQgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgljdXJyZW50VGltZSA6PSB0aW1lLk5vdygpLlVuaXgoKQoKCXByb2plY3QsIGVyciA6PSBscC5nZXRQcm9qZWN0KHByb2plY3RJRCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglwcm9qZWN0TGVmdFJld2FyZCwgZXJyIDo9IGxwLnRyYW5zZmVyTGVmdEZyb21Qcm9qZWN0KDAsIHJsbSwgcHJvamVjdCwgcmVjaXBpZW50LCBjdXJyZW50VGltZSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgl0aWVyMzAsIGVyciA6PSBnZXRQcm9qZWN0VGllcihwcm9qZWN0LCBwcm9qZWN0VGllcjMwKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXRpZXI5MCwgZXJyIDo9IGdldFByb2plY3RUaWVyKHByb2plY3QsIHByb2plY3RUaWVyOTApCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJdGllcjE4MCwgZXJyIDo9IGdldFByb2plY3RUaWVyKHByb2plY3QsIHByb2plY3RUaWVyMTgwKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWNoYWluLkVtaXQoCgkJIlRyYW5zZmVyTGVmdEZyb21Qcm9qZWN0QnlBZG1pbiIsCgkJInByZXZBZGRyIiwgY2FsbGVyLlN0cmluZygpLAoJCSJwcmV2UmVhbG0iLCBwcmV2aW91c1JlYWxtLlBrZ1BhdGgoKSwKCQkicHJvamVjdElkIiwgcHJvamVjdElELAoJCSJyZWNpcGllbnQiLCByZWNpcGllbnQuU3RyaW5nKCksCgkJInRva2VuUGF0aCIsIHByb2plY3QuVG9rZW5QYXRoKCksCgkJImxlZnRSZXdhcmQiLCB1dGlscy5Gb3JtYXRJbnQocHJvamVjdExlZnRSZXdhcmQpLAoJCSJ0aWVyMzBGdWxsIiwgdXRpbHMuRm9ybWF0SW50KHRpZXIzMC5Ub3RhbERlcG9zaXRBbW91bnQoKSksCgkJInRpZXIzMExlZnQiLCB1dGlscy5Gb3JtYXRJbnQoZ2V0Q2FsY3VsYXRlZExlZnRSZXdhcmQodGllcjMwKSksCgkJInRpZXI5MEZ1bGwiLCB1dGlscy5Gb3JtYXRJbnQodGllcjkwLlRvdGFsRGVwb3NpdEFtb3VudCgpKSwKCQkidGllcjkwTGVmdCIsIHV0aWxzLkZvcm1hdEludChnZXRDYWxjdWxhdGVkTGVmdFJld2FyZCh0aWVyOTApKSwKCQkidGllcjE4MEZ1bGwiLCB1dGlscy5Gb3JtYXRJbnQodGllcjE4MC5Ub3RhbERlcG9zaXRBbW91bnQoKSksCgkJInRpZXIxODBMZWZ0IiwgdXRpbHMuRm9ybWF0SW50KGdldENhbGN1bGF0ZWRMZWZ0UmV3YXJkKHRpZXIxODApKSwKCQkiY3VycmVudEhlaWdodCIsIHV0aWxzLkZvcm1hdEludChjdXJyZW50SGVpZ2h0KSwKCQkiY3VycmVudFRpbWUiLCB1dGlscy5Gb3JtYXRJbnQoY3VycmVudFRpbWUpLAoJKQoKCXJldHVybiBwcm9qZWN0TGVmdFJld2FyZAp9CgovLyB0cmFuc2ZlckxlZnRGcm9tUHJvamVjdCB0cmFuc2ZlcnMgdGhlIHJlbWFpbmluZyByZXdhcmRzIG9mIGEgcHJvamVjdCB0byBhIHNwZWNpZmllZCByZWNpcGllbnQuCi8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFuIGFkbWluIHRvIHRyYW5zZmVyIGFueSB1bmNsYWltZWQgcmV3YXJkcyBmcm9tIGEgcHJvamVjdCB0byBhIHJlY2lwaWVudCBhZGRyZXNzLgovLyBJdCB2YWxpZGF0ZXMgdGhlIHByb2plY3QgSUQsIGNoZWNrcyB0aGUgcmVjaXBpZW50IGNvbmRpdGlvbnMsIGNhbGN1bGF0ZXMgdGhlIHJlbWFpbmluZyByZXdhcmRzLCBhbmQgcGVyZm9ybXMgdGhlIHRyYW5zZmVyLgovLyBSZXR1cm5zIHRoZSBhbW91bnQgb2YgcmV3YXJkcyB0cmFuc2ZlcnJlZCB0byB0aGUgcmVjaXBpZW50IGFuZCBhbnkgZXJyb3IuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgdHJhbnNmZXJMZWZ0RnJvbVByb2plY3QoXyBpbnQsIHJsbSByZWFsbSwgcHJvamVjdCAqbGF1bmNocGFkLlByb2plY3QsIHJlY2lwaWVudCBhZGRyZXNzLCBjdXJyZW50VGltZSBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJaWYgZXJyIDo9IHZhbGlkYXRlUmVmdW5kUHJvamVjdChwcm9qZWN0LCByZWNpcGllbnQsIGN1cnJlbnRUaW1lKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoKCWVtaXNzaW9uLk1pbnRBbmREaXN0cmlidXRlR25zKGNyb3NzKHJsbSkpCgoJYWNjdW1Ub3RhbERpc3RyaWJ1dGVBbW91bnQgOj0gaW50NjQoMCkKCWFjY3VtTGVmdFJld2FyZCA6PSBpbnQ2NCgwKQoJYWNjdW1Db2xsZWN0ZWRSZXdhcmQgOj0gaW50NjQoMCkKCWFjY3VtQ29sbGVjdGFibGVSZXdhcmQgOj0gaW50NjQoMCkKCXJlZnVuZGFibGVBbW91bnRzQnlUaWVyIDo9IG1ha2UobWFwW2ludDY0XWludDY0KQoKCWZvciBkdXJhdGlvbiwgdGllciA6PSByYW5nZSBwcm9qZWN0LlRpZXJzKCkgewoJCS8vIFNldHRsZW1lbnQgdXNlcyB0aWVyIGFnZ3JlZ2F0ZSBhY2NvdW50aW5nLCBuZXZlciB0aGUgdW5ib3VuZGVkCgkJLy8gcGVyLWRlcG9zaXQgcmV3YXJkIHRyZWUuCgkJdGllckNvbGxlY3RhYmxlUmV3YXJkIDo9IGludDY0KDApCgkJaWYgZ2V0VGllckN1cnJlbnREZXBvc2l0Q291bnQodGllcikgPiAwIHsKCQkJdmFyIGVyciBlcnJvcgoJCQl0aWVyQ29sbGVjdGFibGVSZXdhcmQsIGVyciA9IGxwLmFwcGx5VGllclJld2FyZEdyb3d0aFdpdGhSZXdhcmRzKHRpZXIsIGN1cnJlbnRUaW1lKQoJCQlpZiBlcnIgIT0gbmlsIHsKCQkJCXJldHVybiAwLCBlcnIKCQkJfQoKCQkJYWNjdW1Db2xsZWN0YWJsZVJld2FyZCA9IGduc21hdGguU2FmZUFkZEludDY0KGFjY3VtQ29sbGVjdGFibGVSZXdhcmQsIHRpZXJDb2xsZWN0YWJsZVJld2FyZCkKCQl9CgoJCWxlZnRSZXdhcmQgOj0gZ2V0Q2FsY3VsYXRlZExlZnRSZXdhcmQodGllcikKCQl0aWVyUmVmdW5kYWJsZUFtb3VudCA6PSBnbnNtYXRoLlNhZmVTdWJJbnQ2NChsZWZ0UmV3YXJkLCB0aWVyQ29sbGVjdGFibGVSZXdhcmQpCgkJaWYgdGllclJlZnVuZGFibGVBbW91bnQgPCAwIHsKCQkJcmV0dXJuIDAsIGVycm9ycy5OZXcodWZtdC5TcHJpbnRmKCJ0aWVyUmVmdW5kYWJsZUFtb3VudCglZCkgPCAwIiwgdGllclJlZnVuZGFibGVBbW91bnQpKQoJCX0KCgkJcmVmdW5kYWJsZUFtb3VudHNCeVRpZXJbZHVyYXRpb25dID0gdGllclJlZnVuZGFibGVBbW91bnQKCQlhY2N1bUxlZnRSZXdhcmQgPSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChhY2N1bUxlZnRSZXdhcmQsIGxlZnRSZXdhcmQpCgkJYWNjdW1Db2xsZWN0ZWRSZXdhcmQgPSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChhY2N1bUNvbGxlY3RlZFJld2FyZCwgdGllci5Ub3RhbENvbGxlY3RlZEFtb3VudCgpKQoJCWFjY3VtVG90YWxEaXN0cmlidXRlQW1vdW50ID0gZ25zbWF0aC5TYWZlQWRkSW50NjQoYWNjdW1Ub3RhbERpc3RyaWJ1dGVBbW91bnQsIHRpZXIuVG90YWxEaXN0cmlidXRlQW1vdW50KCkpCgl9CgoJaWYgYWNjdW1MZWZ0UmV3YXJkID09IDAgewoJCXJldHVybiAwLCBlcnJvcnMuTmV3KCJwcm9qZWN0IGhhcyBubyByZW1haW5pbmcgYW1vdW50IikKCX0KCglhY3R1YWxUb3RhbERpc3RyaWJ1dGVBbW91bnQgOj0gZ25zbWF0aC5TYWZlQWRkSW50NjQoYWNjdW1Db2xsZWN0ZWRSZXdhcmQsIGFjY3VtTGVmdFJld2FyZCkKCWlmIGFjY3VtVG90YWxEaXN0cmlidXRlQW1vdW50ICE9IGFjdHVhbFRvdGFsRGlzdHJpYnV0ZUFtb3VudCB7CgkJcmV0dXJuIDAsIGVycm9ycy5OZXcodWZtdC5TcHJpbnRmKCJhY2N1bVRvdGFsRGlzdHJpYnV0ZUFtb3VudCglZCkgIT0gYWNjdW1Db2xsZWN0ZWRSZXdhcmQoJWQpK2FjY3VtTGVmdFJld2FyZCglZCkiLCBhY2N1bVRvdGFsRGlzdHJpYnV0ZUFtb3VudCwgYWNjdW1Db2xsZWN0ZWRSZXdhcmQsIGFjY3VtTGVmdFJld2FyZCkpCgl9CgoJLy8gQ2FsY3VsYXRlIHJlZnVuZGFibGUgYW1vdW50OiBwcm9qZWN0IHJlbWFpbmluZyBtaW51cyBjb2xsZWN0YWJsZSByZXdhcmRzIGZvciByZW1haW5pbmcgZGVwb3NpdG9ycwoJcHJvamVjdExlZnRSZXdhcmQgOj0gYWNjdW1MZWZ0UmV3YXJkCglwcm9qZWN0UmVmdW5kYWJsZUFtb3VudCA6PSBnbnNtYXRoLlNhZmVTdWJJbnQ2NChwcm9qZWN0TGVmdFJld2FyZCwgYWNjdW1Db2xsZWN0YWJsZVJld2FyZCkKCglpZiBwcm9qZWN0UmVmdW5kYWJsZUFtb3VudCA8IDAgewoJCXJldHVybiAwLCBlcnJvcnMuTmV3KHVmbXQuU3ByaW50ZigicHJvamVjdFJlZnVuZGFibGVBbW91bnQoJWQpIDwgMCIsIHByb2plY3RSZWZ1bmRhYmxlQW1vdW50KSkKCX0KCglpZiBwcm9qZWN0UmVmdW5kYWJsZUFtb3VudCA+IDAgewoJCXVwZGF0ZWRUaWVycyA6PSBtYWtlKG1hcFtpbnQ2NF0qbGF1bmNocGFkLlByb2plY3RUaWVyKQoJCWZvciBkdXJhdGlvbiwgdGllciA6PSByYW5nZSBwcm9qZWN0LlRpZXJzKCkgewoJCQl0aWVyUmVmdW5kYWJsZUFtb3VudCA6PSByZWZ1bmRhYmxlQW1vdW50c0J5VGllcltkdXJhdGlvbl0KCQkJaWYgdGllclJlZnVuZGFibGVBbW91bnQgPiAwIHsKCQkJCXRpZXIuU2V0VG90YWxDb2xsZWN0ZWRBbW91bnQoZ25zbWF0aC5TYWZlQWRkSW50NjQodGllci5Ub3RhbENvbGxlY3RlZEFtb3VudCgpLCB0aWVyUmVmdW5kYWJsZUFtb3VudCkpCgkJCX0KCgkJCXVwZGF0ZWRUaWVyc1tkdXJhdGlvbl0gPSB0aWVyCgkJfQoJCXByb2plY3QuU2V0VGllcnModXBkYXRlZFRpZXJzKQoKCQljb21tb24uU2FmZUdSQzIwVHJhbnNmZXIoMCwgcmxtLCBwcm9qZWN0LlRva2VuUGF0aCgpLCByZWNpcGllbnQsIHByb2plY3RSZWZ1bmRhYmxlQW1vdW50KQoJfQoKCXJldHVybiBwcm9qZWN0UmVmdW5kYWJsZUFtb3VudCwgbmlsCn0KCi8vIGFwcGx5VGllclJld2FyZEdyb3d0aFdpdGhSZXdhcmRzIHVwZGF0ZXMgYSB0aWVyIGluZGV4IGFuZCByZXR1cm5zIGEKLy8gY29uc2VydmF0aXZlIGFnZ3JlZ2F0ZSByZXNlcnZhdGlvbiBmb3IgYWN0aXZlIGNsYWltcy4gUm91bmRpbmcgZHVzdCByZW1haW5zCi8vIGluIHRoZSBwcm9qZWN0IGluc3RlYWQgb2Ygcmlza2luZyBhbiB1bmRlci1yZXNlcnZlZCBkZXBvc2l0b3IgY2xhaW0uCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgYXBwbHlUaWVyUmV3YXJkR3Jvd3RoV2l0aFJld2FyZHModGllciAqbGF1bmNocGFkLlByb2plY3RUaWVyLCBjdXJyZW50VGltZSBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcmV3YXJkTWFuYWdlciwgZXJyIDo9IGxwLmdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlcih0aWVyLklEKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJaWYgZXJyIDo9IHVwZGF0ZVJld2FyZFBlckRlcG9zaXRYMTI4KHJld2FyZE1hbmFnZXIsIGdldFRpZXJDdXJyZW50RGVwb3NpdEFtb3VudCh0aWVyKSwgY3VycmVudFRpbWUpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJZW1pdFVwZGF0ZUxhdW5jaHBhZFJld2FyZEFjY3VtdWxhdGlvbih0aWVyLklEKCksIHJld2FyZE1hbmFnZXIsIGdldFRpZXJDdXJyZW50RGVwb3NpdEFtb3VudCh0aWVyKSkKCglyZXR1cm4gY2FsY3VsYXRlTWF4aW11bUNsYWltYWJsZVJld2FyZHNGb3JBY3RpdmVEZXBvc2l0cyhyZXdhcmRNYW5hZ2VyKSwgbmlsCn0KCi8vIHZhbGlkYXRlVHJhbnNmZXJMZWZ0IHZhbGlkYXRlcyB0aGUgdHJhbnNmZXIgb2YgcmVtYWluaW5nIHRva2VucwpmdW5jIHZhbGlkYXRlUmVmdW5kUHJvamVjdChwcm9qZWN0ICpsYXVuY2hwYWQuUHJvamVjdCwgcmVjaXBpZW50IGFkZHJlc3MsIGN1cnJlbnRUaW1lIGludDY0KSBlcnJvciB7CglpZiAhcmVjaXBpZW50LklzVmFsaWQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcodWZtdC5TcHJpbnRmKCJpbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzKCVzKSIsIHJlY2lwaWVudC5TdHJpbmcoKSkpCgl9CgoJcmV0dXJuIHZhbGlkYXRlUmVmdW5kUmVtYWluaW5nQW1vdW50KHByb2plY3QsIGN1cnJlbnRUaW1lKQp9Cgp0eXBlIGNyZWF0ZVByb2plY3RQYXJhbXMgc3RydWN0IHsKCW5hbWUgICAgICAgICAgICAgICAgICBzdHJpbmcKCXRva2VuUGF0aCAgICAgICAgICAgICBzdHJpbmcKCXJlY2lwaWVudCAgICAgICAgICAgICBhZGRyZXNzCglkZXBvc2l0QW1vdW50ICAgICAgICAgaW50NjQKCWNvbmRpdGlvblRva2VucyAgICAgICBzdHJpbmcKCWNvbmRpdGlvbkFtb3VudHMgICAgICBzdHJpbmcKCXRpZXIzMFJhdGlvICAgICAgICAgICBpbnQ2NAoJdGllcjkwUmF0aW8gICAgICAgICAgIGludDY0Cgl0aWVyMTgwUmF0aW8gICAgICAgICAgaW50NjQKCXN0YXJ0VGltZSAgICAgICAgICAgICBpbnQ2NAoJY3VycmVudFRpbWUgICAgICAgICAgIGludDY0CgljdXJyZW50SGVpZ2h0ICAgICAgICAgaW50NjQKCW1pbmltdW1TdGFydERlbGF5VGltZSBpbnQ2NAp9CgpmdW5jIChwICpjcmVhdGVQcm9qZWN0UGFyYW1zKSB2YWxpZGF0ZSgpIGVycm9yIHsKCWlmIGVyciA6PSBwLnZhbGlkYXRlTmFtZSgpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJaWYgZXJyIDo9IHAudmFsaWRhdGVUb2tlblBhdGgoKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCWlmIGVyciA6PSBwLnZhbGlkYXRlUmVjaXBpZW50KCk7IGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCglpZiBlcnIgOj0gcC52YWxpZGF0ZURlcG9zaXRBbW91bnQoKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCWlmIGVyciA6PSBwLnZhbGlkYXRlUmF0aW8oKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCWlmIGVyciA6PSBwLnZhbGlkYXRlU3RhcnRUaW1lKHAuY3VycmVudFRpbWUsIHAubWluaW11bVN0YXJ0RGVsYXlUaW1lKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCWlmIGVyciA6PSBwLnZhbGlkYXRlQ29uZGl0aW9ucygpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJcmV0dXJuIG5pbAp9CgovLyB2YWxpZGF0ZU5hbWUgY2hlY2tzIGlmIHRoZSBwcm9qZWN0IG5hbWUgaXMgdmFsaWQuCmZ1bmMgKHAgKmNyZWF0ZVByb2plY3RQYXJhbXMpIHZhbGlkYXRlTmFtZSgpIGVycm9yIHsKCWlmIHAubmFtZSA9PSAiIiB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRJbnB1dCwgInByb2plY3QgbmFtZSBjYW5ub3QgYmUgZW1wdHkiKQoJfQoKCWlmIGxlbihwLm5hbWUpID4gMTAwIHsKCQlyZXR1cm4gbWFrZUVycm9yV2l0aERldGFpbHMoZXJySW52YWxpZElucHV0LCAicHJvamVjdCBuYW1lIGlzIHRvbyBsb25nIikKCX0KCglyZXR1cm4gbmlsCn0KCi8vIHZhbGlkYXRlVG9rZW5QYXRoIHZhbGlkYXRlcyB0aGUgdG9rZW4gcGF0aCBpcyBub3QgZW1wdHkgYW5kIGlzIHJlZ2lzdGVyZWQuCmZ1bmMgKHAgKmNyZWF0ZVByb2plY3RQYXJhbXMpIHZhbGlkYXRlVG9rZW5QYXRoKCkgZXJyb3IgewoJaWYgcC50b2tlblBhdGggPT0gIiIgewoJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkSW5wdXQsICJ0b2tlblBhdGggY2Fubm90IGJlIGVtcHR5IikKCX0KCglpZiBlcnIgOj0gY29tbW9uLklzUmVnaXN0ZXJlZChwLnRva2VuUGF0aCk7IGVyciAhPSBuaWwgJiYgIWlzR292ZXJuYW5jZVRva2VuKHAudG9rZW5QYXRoKSB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRJbnB1dCwgdWZtdC5TcHJpbnRmKCJ0b2tlblBhdGgoJXMpIG5vdCByZWdpc3RlcmVkIiwgcC50b2tlblBhdGgpKQoJfQoKCXJldHVybiBuaWwKfQoKLy8gdmFsaWRhdGVSZWNpcGllbnQgY2hlY2tzIGlmIHRoZSByZWNpcGllbnQgYWRkcmVzcyBpcyB2YWxpZC4KZnVuYyAocCAqY3JlYXRlUHJvamVjdFBhcmFtcykgdmFsaWRhdGVSZWNpcGllbnQoKSBlcnJvciB7CglpZiAhcC5yZWNpcGllbnQuSXNWYWxpZCgpIHsKCQlyZXR1cm4gbWFrZUVycm9yV2l0aERldGFpbHMoZXJySW52YWxpZEFkZHJlc3MsIHVmbXQuU3ByaW50ZigicmVjaXBpZW50IGFkZHJlc3MoJXMpIiwgcC5yZWNpcGllbnQuU3RyaW5nKCkpKQoJfQoKCXJldHVybiBuaWwKfQoKLy8gdmFsaWRhdGVEZXBvc2l0QW1vdW50IGVuc3VyZXMgdGhhdCB0aGUgZGVwb3NpdCBhbW91bnQgaXMgZ3JlYXRlciB0aGFuIHplcm8uCmZ1bmMgKHAgKmNyZWF0ZVByb2plY3RQYXJhbXMpIHZhbGlkYXRlRGVwb3NpdEFtb3VudCgpIGVycm9yIHsKCWlmIHAuZGVwb3NpdEFtb3VudCA9PSAwIHsKCQlyZXR1cm4gbWFrZUVycm9yV2l0aERldGFpbHMoZXJySW52YWxpZElucHV0LCAiZGVwb3NpdCBhbW91bnQgY2Fubm90IGJlIDAiKQoJfQoKCWlmIHAuZGVwb3NpdEFtb3VudCA8IDAgewoJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkSW5wdXQsICJkZXBvc2l0IGFtb3VudCBjYW5ub3QgYmUgbmVnYXRpdmUiKQoJfQoKCXJldHVybiBuaWwKfQoKLy8gdmFsaWRhdGVSYXRpbyBjaGVja3MgaWYgZWFjaCB0aWVyIHJhdGlvIGlzIG5vbi1uZWdhdGl2ZSBhbmQgdGhlIHN1bSBlcXVhbHMgMTAwLgpmdW5jIChwICpjcmVhdGVQcm9qZWN0UGFyYW1zKSB2YWxpZGF0ZVJhdGlvKCkgZXJyb3IgewoJaWYgcC50aWVyMzBSYXRpbyA8IDAgfHwgcC50aWVyOTBSYXRpbyA8IDAgfHwgcC50aWVyMTgwUmF0aW8gPCAwIHsKCQlyZXR1cm4gbWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyckludmFsaWRJbnB1dCwKCQkJdWZtdC5TcHJpbnRmKCJ0aWVyIHJhdGlvcyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSAoMzA6JWQsIDkwOiVkLCAxODA6JWQpIiwgcC50aWVyMzBSYXRpbywgcC50aWVyOTBSYXRpbywgcC50aWVyMTgwUmF0aW8pLAoJCSkKCX0KCglzdW0gOj0gcC50aWVyMzBSYXRpbyArIHAudGllcjkwUmF0aW8gKyBwLnRpZXIxODBSYXRpbwoJaWYgc3VtICE9IDEwMCB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJJbnZhbGlkSW5wdXQsCgkJCXVmbXQuU3ByaW50ZigiaW52YWxpZCByYXRpbywgc3VtIG9mIGFsbCB0aWVycygzMDolZCwgOTA6JWQsIDE4MDolZCkgc2hvdWxkIGJlIDEwMCIsIHAudGllcjMwUmF0aW8sIHAudGllcjkwUmF0aW8sIHAudGllcjE4MFJhdGlvKSwKCQkpCgl9CgoJcmV0dXJuIG5pbAp9CgovLyB2YWxpZGF0ZVN0YXJ0VGltZSBjaGVja3MgaWYgdGhlIHN0YXJ0IHRpbWUgaXMgYXZhaWxhYmxlIHdpdGggbWluaW11bSBkZWxheSByZXF1aXJlbWVudC4KZnVuYyAocCAqY3JlYXRlUHJvamVjdFBhcmFtcykgdmFsaWRhdGVTdGFydFRpbWUobm93IGludDY0LCBtaW5pbXVtU3RhcnREZWxheVRpbWUgaW50NjQpIGVycm9yIHsKCWF2YWlsYWJsZVN0YXJ0VGltZSA6PSBub3cgKyBtaW5pbXVtU3RhcnREZWxheVRpbWUKCglpZiBwLnN0YXJ0VGltZSA8IGF2YWlsYWJsZVN0YXJ0VGltZSB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRJbnB1dCwgdWZtdC5TcHJpbnRmKCJzdGFydCB0aW1lKCVkKSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3coJWQpIiwgcC5zdGFydFRpbWUsIGF2YWlsYWJsZVN0YXJ0VGltZSkpCgl9CgoJcmV0dXJuIG5pbAp9CgpmdW5jIChwICpjcmVhdGVQcm9qZWN0UGFyYW1zKSB2YWxpZGF0ZUNvbmRpdGlvbnMoKSBlcnJvciB7CglpZiBwLmNvbmRpdGlvblRva2VucyA9PSAiIiAmJiBwLmNvbmRpdGlvbkFtb3VudHMgPT0gIiIgewoJCXJldHVybiBuaWwKCX0KCgl0b2tlblBhdGhzIDo9IHN0cmluZ3MuU3BsaXQocC5jb25kaXRpb25Ub2tlbnMsIHN0cmluZ1NwbGl0dGVyUGFkKQoJbWluaW11bUFtb3VudHMgOj0gc3RyaW5ncy5TcGxpdChwLmNvbmRpdGlvbkFtb3VudHMsIHN0cmluZ1NwbGl0dGVyUGFkKQoKCWlmIGxlbih0b2tlblBhdGhzKSAhPSBsZW4obWluaW11bUFtb3VudHMpIHsKCQlyZXR1cm4gbWFrZUVycm9yV2l0aERldGFpbHMoZXJySW52YWxpZElucHV0LCAiY29uZGl0aW9uVG9rZW5zIGFuZCBjb25kaXRpb25BbW91bnRzIGFyZSBub3QgbWF0Y2hlZCIpCgl9CglpZiBsZW4odG9rZW5QYXRocykgPiBtYXhQcm9qZWN0Q29uZGl0aW9uQ291bnQgewoJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkSW5wdXQsIHVmbXQuU3ByaW50ZigiY29uZGl0aW9uIGNvdW50KCVkKSBleGNlZWRzIG1heGltdW0oJWQpIiwgbGVuKHRva2VuUGF0aHMpLCBtYXhQcm9qZWN0Q29uZGl0aW9uQ291bnQpKQoJfQoKCXRva2VuUGF0aE1hcCA6PSBtYWtlKG1hcFtzdHJpbmddYm9vbCkKCglmb3IgXywgdG9rZW5QYXRoIDo9IHJhbmdlIHRva2VuUGF0aHMgewoJCWVyciA6PSBjb21tb24uSXNSZWdpc3RlcmVkKHRva2VuUGF0aCkKCQlpZiBlcnIgIT0gbmlsICYmICFpc0dvdmVybmFuY2VUb2tlbih0b2tlblBhdGgpIHsKCQkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRJbnB1dCwgdWZtdC5TcHJpbnRmKCJ0b2tlblBhdGgoJXMpIG5vdCByZWdpc3RlcmVkIiwgdG9rZW5QYXRoKSkKCQl9CgoJCWlmIHRva2VuUGF0aE1hcFt0b2tlblBhdGhdIHsKCQkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRJbnB1dCwgdWZtdC5TcHJpbnRmKCJ0b2tlblBhdGgoJXMpIGlzIGR1cGxpY2F0ZWQiLCB0b2tlblBhdGgpKQoJCX0KCgkJdG9rZW5QYXRoTWFwW3Rva2VuUGF0aF0gPSB0cnVlCgl9CgoJZm9yIF8sIGFtb3VudFN0ciA6PSByYW5nZSBtaW5pbXVtQW1vdW50cyB7CgkJbWluaW11bUFtb3VudCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQoYW1vdW50U3RyLCAxMCwgNjQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkSW5wdXQsIHVmbXQuU3ByaW50ZigiaW52YWxpZCBjb25kaXRpb24gYW1vdW50KCVzKSIsIGFtb3VudFN0cikpCgkJfQoKCQlpZiBtaW5pbXVtQW1vdW50IDw9IDAgewoJCQlyZXR1cm4gbWFrZUVycm9yV2l0aERldGFpbHMoZXJySW52YWxpZElucHV0LCB1Zm10LlNwcmludGYoImNvbmRpdGlvbiBhbW91bnQoJXMpIGlzIG5vdCBhdmFpbGFibGUiLCBhbW91bnRTdHIpKQoJCX0KCX0KCglyZXR1cm4gbmlsCn0KCmZ1bmMgaXNHb3Zlcm5hbmNlVG9rZW4odG9rZW5QYXRoIHN0cmluZykgYm9vbCB7CglyZXR1cm4gdG9rZW5QYXRoID09IEdPVl9YR05TX1BBVEgKfQoarBEKGmxhdW5jaHBhZF9wcm90b2NvbF9mZWUuZ25vEo0RcGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAoCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKCglnb3Zfc3Rha2VyICJnbm8ubGFuZC9yL2dub3N3YXAvZ292L3N0YWtlciIKCSJnbm8ubGFuZC9yL2dub3N3YXAvaGFsdC92MSIKKQoKLy8gQ29sbGVjdFByb3RvY29sRmVlIGNvbGxlY3RzIHByb3RvY29sIGZlZSBmcm9tIGdvdi9zdGFrZXIgZm9yIHByb2plY3QgcmVjaXBpZW50IHdhbGxldHMuCi8vIE9ubHkgcHJvamVjdCByZWNpcGllbnRzIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIGxhdW5jaHBhZCBwcm94eTsgdmFsaWRhdGVkIGJlZm9yZSBjb2xsZWN0aW9uLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIENvbGxlY3RQcm90b2NvbEZlZShfIGludCwgcmxtIHJlYWxtKSB7CglhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCgloYWx0LkFzc2VydElzTm90SGFsdGVkV2l0aGRyYXcoKQoKCXByZXZpb3VzUmVhbG0gOj0gcmxtLlByZXZpb3VzKCkKCgljYWxsZXIgOj0gcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkKCWxwLmFzc2VydEhhc1Byb2plY3QoY2FsbGVyKQoKCWdvdl9zdGFrZXIuQ29sbGVjdFJld2FyZEZyb21MYXVuY2hQYWQoY3Jvc3MocmxtKSwgY2FsbGVyKQp9CgovLyBDb2xsZWN0RW1pc3Npb25SZXdhcmQgY29sbGVjdHMgZW1pc3Npb24gcmV3YXJkcyBmcm9tIGdvdi9zdGFrZXIgZm9yIHByb2plY3QgcmVjaXBpZW50IHdhbGxldHMuCi8vIE9ubHkgcHJvamVjdCByZWNpcGllbnRzIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIGxhdW5jaHBhZCBwcm94eTsgdmFsaWRhdGVkIGJlZm9yZSBjb2xsZWN0aW9uLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIENvbGxlY3RFbWlzc2lvblJld2FyZChfIGludCwgcmxtIHJlYWxtKSB7CglhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCgloYWx0LkFzc2VydElzTm90SGFsdGVkV2l0aGRyYXcoKQoKCXByZXZpb3VzUmVhbG0gOj0gcmxtLlByZXZpb3VzKCkKCgljYWxsZXIgOj0gcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkKCWxwLmFzc2VydEhhc1Byb2plY3QoY2FsbGVyKQoKCWdvdl9zdGFrZXIuQ29sbGVjdEVtaXNzaW9uUmV3YXJkRnJvbUxhdW5jaFBhZChjcm9zcyhybG0pLCBjYWxsZXIpCn0KCi8vIENvbGxlY3RQcm90b2NvbEZlZVJld2FyZCBjb2xsZWN0cyBvbmUgdG9rZW4gcGF0aCBvZiBwcm90b2NvbCBmZWUgcmV3YXJkcyBmcm9tIGdvdi9zdGFrZXIgZm9yIHByb2plY3QgcmVjaXBpZW50IHdhbGxldHMuCi8vIE9ubHkgcHJvamVjdCByZWNpcGllbnRzIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIGxhdW5jaHBhZCBwcm94eTsgdmFsaWRhdGVkIGJlZm9yZSBjb2xsZWN0aW9uLgovLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHdob3NlIHByb3RvY29sLWZlZSByZXdhcmQgaXMgY29sbGVjdGVkLgpmdW5jIChscCAqbGF1bmNocGFkVjEpIENvbGxlY3RQcm90b2NvbEZlZVJld2FyZChfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKSB7CglhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCgloYWx0LkFzc2VydElzTm90SGFsdGVkV2l0aGRyYXcoKQoKCXByZXZpb3VzUmVhbG0gOj0gcmxtLlByZXZpb3VzKCkKCgljYWxsZXIgOj0gcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkKCWxwLmFzc2VydEhhc1Byb2plY3QoY2FsbGVyKQoKCWdvdl9zdGFrZXIuQ29sbGVjdFByb3RvY29sRmVlUmV3YXJkRnJvbUxhdW5jaFBhZChjcm9zcyhybG0pLCBjYWxsZXIsIHRva2VuUGF0aCkKfQoaoBsKFGxhdW5jaHBhZF9yZXdhcmQuZ25vEocbcGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCSJ0aW1lIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgoKCWduc21hdGggImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJImduby5sYW5kL3AvZ25vc3dhcC91dGlscy92MSIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2NvbW1vbiIKCSJnbm8ubGFuZC9yL2dub3N3YXAvaGFsdC92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvbGF1bmNocGFkIgopCgovLyBDb2xsZWN0UmV3YXJkQnlEZXBvc2l0SWQgY29sbGVjdHMgdGhlIGNsYWltYWJsZSBwcm9qZWN0LXRva2VuIHJld2FyZCBmcm9tIGEKLy8gc3BlY2lmaWMgZGVwb3NpdC4gVGhlIHJld2FyZCBiZWNvbWVzIGNsYWltYWJsZSBvbmUgZGF5IGFmdGVyIGRlcG9zaXQgY3JlYXRpb24sCi8vIGNhcHBlZCBhdCB0aGUgc2VsZWN0ZWQgdGllcidzIGVuZCB0aW1lLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCi8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBsYXVuY2hwYWQgcHJveHkuCi8vICAgLSBkZXBvc2l0SUQ6IElEIG9mIHRoZSBkZXBvc2l0IHRvIGNvbGxlY3QgZnJvbS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogcHJvamVjdC10b2tlbiByZXdhcmQgYW1vdW50IGNvbGxlY3RlZCBmb3IgdGhlIGRlcG9zaXQsIGluIHRoZSB0b2tlbidzIGJhc2UgdW5pdHM7IGZhaWx1cmVzIHBhbmljIGJlZm9yZSByZXR1cm5pbmcuCi8vCi8vIE9ubHkgY2FsbGFibGUgYnkgZGVwb3NpdCBvd25lciBhZnRlciB0aGUgY2xhaW1hYmxlIHRpbWUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgQ29sbGVjdFJld2FyZEJ5RGVwb3NpdElkKF8gaW50LCBybG0gcmVhbG0sIGRlcG9zaXRJRCBzdHJpbmcpIGludDY0IHsKCWFjY2Vzcy5Bc3NlcnRJc1JsbUN1cnJlbnQoMCwgcmxtKQoKCWhhbHQuQXNzZXJ0SXNOb3RIYWx0ZWRXaXRoZHJhdygpCgoJcHJldmlvdXNSZWFsbSA6PSBybG0uUHJldmlvdXMoKQoKCWNhbGxlciA6PSBwcmV2aW91c1JlYWxtLkFkZHJlc3MoKQoJbHAuYXNzZXJ0SXNEZXBvc2l0T3duZXIoZGVwb3NpdElELCBjYWxsZXIpCgoJZGVwb3NpdCA6PSBscC5tdXN0R2V0RGVwb3NpdChkZXBvc2l0SUQpCgl0YXJnZXRQcm9qZWN0VGllcklEIDo9IGRlcG9zaXQuUHJvamVjdFRpZXJJRCgpCgljdXJyZW50SGVpZ2h0IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJY3VycmVudFRpbWUgOj0gdGltZS5Ob3coKS5Vbml4KCkKCglyZXdhcmRUb2tlblBhdGgsIHJld2FyZEFtb3VudCwgZXJyIDo9IGxwLmNvbGxlY3REZXBvc2l0UmV3YXJkKDAsIHJsbSwgZGVwb3NpdCwgY3VycmVudEhlaWdodCwgY3VycmVudFRpbWUpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJLy8gVHJhbnNmZXIgcmV3YXJkIHRva2VuIHRvIGRlcG9zaXRvcgoJaWYgcmV3YXJkQW1vdW50ID4gMCB7CgkJY29tbW9uLlNhZmVHUkMyMFRyYW5zZmVyKDAsIHJsbSwgcmV3YXJkVG9rZW5QYXRoLCBkZXBvc2l0LkRlcG9zaXRvcigpLCByZXdhcmRBbW91bnQpCgl9CgoJY2hhaW4uRW1pdCgKCQkiQ29sbGVjdFJld2FyZEJ5RGVwb3NpdElkIiwKCQkicHJldkFkZHIiLCBjYWxsZXIuU3RyaW5nKCksCgkJInByZXZSZWFsbSIsIHByZXZpb3VzUmVhbG0uUGtnUGF0aCgpLAoJCSJkZXBvc2l0SWQiLCBkZXBvc2l0SUQsCgkJInRhcmdldFByb2plY3RUaWVySWQiLCB0YXJnZXRQcm9qZWN0VGllcklELAoJCSJyZXdhcmRUb2tlblBhdGgiLCByZXdhcmRUb2tlblBhdGgsCgkJImFtb3VudCIsIHV0aWxzLkZvcm1hdEludChyZXdhcmRBbW91bnQpLAoJKQoKCXJldHVybiByZXdhcmRBbW91bnQKfQoKLy8gY29sbGVjdERlcG9zaXRSZXdhcmQgY2FsY3VsYXRlcyBhbmQgY29sbGVjdHMgdGhlIHJld2FyZCBmb3IgYSBkZXBvc2l0LgpmdW5jIChscCAqbGF1bmNocGFkVjEpIGNvbGxlY3REZXBvc2l0UmV3YXJkKF8gaW50LCBybG0gcmVhbG0sIGRlcG9zaXQgbGF1bmNocGFkLkRlcG9zaXQsIGN1cnJlbnRIZWlnaHQsIGN1cnJlbnRUaW1lIGludDY0KSAoc3RyaW5nLCBpbnQ2NCwgZXJyb3IpIHsKCWlmIGN1cnJlbnRUaW1lIDw9IDAgewoJCXJldHVybiAiIiwgMCwgbWFrZUVycm9yV2l0aERldGFpbHMoZXJySW52YWxpZFRpbWUsICJjdXJyZW50VGltZSBtdXN0IGJlIHBvc2l0aXZlIikKCX0KCgkvLyBHZXQgcHJvamVjdCBhbmQgdGllciBkYXRhCglwcm9qZWN0LCBlcnIgOj0gbHAuZ2V0UHJvamVjdChkZXBvc2l0LlByb2plY3RJRCgpKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCAwLCBlcnIKCX0KCglwcm9qZWN0VGllciwgZXJyIDo9IGdldFByb2plY3RUaWVyKHByb2plY3QsIGRlcG9zaXQuVGllcigpKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCAwLCBlcnIKCX0KCgkvLyBHZXQgcmV3YXJkIG1hbmFnZXIKCXJld2FyZE1hbmFnZXIsIGVyciA6PSBscC5nZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXIocHJvamVjdFRpZXIuSUQoKSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgMCwgZXJyCgl9CgoJLy8gVXBkYXRlIHJld2FyZCBzdGF0ZSBiZWZvcmUgY29sbGVjdGlvbgoJZXJyID0gdXBkYXRlUmV3YXJkUGVyRGVwb3NpdFgxMjgocmV3YXJkTWFuYWdlciwgZ2V0VGllckN1cnJlbnREZXBvc2l0QW1vdW50KHByb2plY3RUaWVyKSwgY3VycmVudFRpbWUpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIiIsIDAsIGVycgoJfQoKCS8vIENvbGxlY3QgcmV3YXJkCglyZXdhcmRBbW91bnQsIGVyciA6PSBjb2xsZWN0UmV3YXJkKHJld2FyZE1hbmFnZXIsIGRlcG9zaXQuSUQoKSwgY3VycmVudFRpbWUpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIiIsIDAsIGVycgoJfQoKCS8vIFVwZGF0ZSB0b3RhbCBjb2xsZWN0ZWQgYW1vdW50IGZvciB0aGUgdGllcgoJaWYgcmV3YXJkQW1vdW50ID4gMCB7CgkJcHJvamVjdFRpZXIuU2V0VG90YWxDb2xsZWN0ZWRBbW91bnQoZ25zbWF0aC5TYWZlQWRkSW50NjQocHJvamVjdFRpZXIuVG90YWxDb2xsZWN0ZWRBbW91bnQoKSwgcmV3YXJkQW1vdW50KSkKCQlwcm9qZWN0LlNldFRpZXIoZGVwb3NpdC5UaWVyKCksIHByb2plY3RUaWVyKQoKCQlwcm9qZWN0cyA6PSBscC5zdG9yZS5HZXRQcm9qZWN0cygpCgkJaWYgZXJyIDo9IGxwLnN0b3JlLlNldFByb2plY3RzKDAsIHJsbSwgcHJvamVjdHMpOyBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuICIiLCAwLCBlcnIKCQl9Cgl9CgoJZW1pdFVwZGF0ZUxhdW5jaHBhZFJld2FyZEFjY3VtdWxhdGlvbihwcm9qZWN0VGllci5JRCgpLCByZXdhcmRNYW5hZ2VyLCBnZXRUaWVyQ3VycmVudERlcG9zaXRBbW91bnQocHJvamVjdFRpZXIpKQoKCXJldHVybiBwcm9qZWN0LlRva2VuUGF0aCgpLCByZXdhcmRBbW91bnQsIG5pbAp9Chq+KwoWbGF1bmNocGFkX3dpdGhkcmF3LmdubxKjK3BhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkiZXJyb3JzIgoJInRpbWUiCgoJZ25zbWF0aCAiZ25vLmxhbmQvcC9nbm9zd2FwL2duc21hdGgvdjEiCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3V0aWxzL3YxIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvY29tbW9uIgoJImduby5sYW5kL3IvZ25vc3dhcC9lbWlzc2lvbiIKCSJnbm8ubGFuZC9yL2dub3N3YXAvaGFsdC92MSIKCSJnbm8ubGFuZC9yL2dub3N3YXAvbGF1bmNocGFkIgoKCWdvdl9zdGFrZXIgImduby5sYW5kL3IvZ25vc3dhcC9nb3Yvc3Rha2VyIgopCgovLyBDb2xsZWN0RGVwb3NpdEducyB3aXRoZHJhd3MgdGhlIG9yaWdpbmFsIEdOUyBkZXBvc2l0IGFmdGVyIHRoZSBsb2NrIHBlcmlvZAovLyBlbmRzLiBCZWZvcmUgcmV0dXJuaW5nIHRoZSBwcmluY2lwYWwsIGl0IHNldHRsZXMgYW55IGNsYWltYWJsZSBwcm9qZWN0LXRva2VuCi8vIHJld2FyZCBmb3IgdGhlIGRlcG9zaXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCBieSB0aGUgbGF1bmNocGFkIHByb3h5OyBpbnZhbGlkIGNvbnRleHRzIHJldHVybiBhbiBlcnJvci4KLy8gICAtIGRlcG9zaXRJRDogSUQgb2YgdGhlIGRlcG9zaXQgdG8gd2l0aGRyYXcuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IG9yaWdpbmFsIEdOUyBkZXBvc2l0IGFtb3VudCByZXR1cm5lZCB0byB0aGUgZGVwb3NpdG9yLCBpbiBiYXNlIHVuaXRzLgovLyAgIC0gZXJyOiBub24tbmlsIGZvciBhIHNwb29mZWQtcmVhbG0gY2FsbDsgb3RoZXIgd2l0aGRyYXdhbCBmYWlsdXJlcyBwYW5pYyBiZWZvcmUgcmV0dXJuaW5nLgovLwovLyBPbmx5IGNhbGxhYmxlIGJ5IGRlcG9zaXQgb3duZXIgd2hlbiB0aGUgY3VycmVudCB0aW1lIGlzIHN0cmljdGx5IGFmdGVyIHRoZQovLyBzZWxlY3RlZCB0aWVyJ3MgZW5kIHRpbWUuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgQ29sbGVjdERlcG9zaXRHbnMoXyBpbnQsIHJsbSByZWFsbSwgZGVwb3NpdElEIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIDAsIGVycm9ycy5OZXcoZXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCWhhbHQuQXNzZXJ0SXNOb3RIYWx0ZWRXaXRoZHJhdygpCgoJcHJldmlvdXNSZWFsbSA6PSBybG0uUHJldmlvdXMoKQoKCWNhbGxlciA6PSBwcmV2aW91c1JlYWxtLkFkZHJlc3MoKQoJbHAuYXNzZXJ0SXNEZXBvc2l0T3duZXIoZGVwb3NpdElELCBjYWxsZXIpCgoJZW1pc3Npb24uTWludEFuZERpc3RyaWJ1dGVHbnMoY3Jvc3MocmxtKSkKCglkZXBvc2l0IDo9IGxwLm11c3RHZXREZXBvc2l0KGRlcG9zaXRJRCkKCXRhcmdldFByb2plY3RUaWVySUQgOj0gZGVwb3NpdC5Qcm9qZWN0VGllcklEKCkKCWN1cnJlbnRIZWlnaHQgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgljdXJyZW50VGltZSA6PSB0aW1lLk5vdygpLlVuaXgoKQoKCS8vIENvbGxlY3QgcmV3YXJkIGJlZm9yZSB3aXRoZHJhd2FsCglyZXdhcmRUb2tlblBhdGgsIHJld2FyZEFtb3VudCwgZXJyIDo9IGxwLmNvbGxlY3REZXBvc2l0UmV3YXJkKDAsIHJsbSwgZGVwb3NpdCwgY3VycmVudEhlaWdodCwgY3VycmVudFRpbWUpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJYmVmb3JlVG90YWxHTlNTdGFrZWRBbW91bnQgOj0gbHAuc3RvcmUuR2V0VG90YWxHTlNTdGFrZWRBbW91bnQoKQoKCXJlY2lwaWVudCwgd2l0aGRyYXdhbEFtb3VudCwgZXJyIDo9IGxwLndpdGhkcmF3RGVwb3NpdCgwLCBybG0sIGRlcG9zaXQsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwgY3VycmVudFRpbWUpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIuRXJyb3IoKSkKCX0KCglhZnRlclRvdGFsR05TU3Rha2VkQW1vdW50IDo9IGduc21hdGguU2FmZVN1YkludDY0KGJlZm9yZVRvdGFsR05TU3Rha2VkQW1vdW50LCB3aXRoZHJhd2FsQW1vdW50KQoJaWYgZXJyIDo9IGxwLnN0b3JlLlNldFRvdGFsR05TU3Rha2VkQW1vdW50KDAsIHJsbSwgYWZ0ZXJUb3RhbEdOU1N0YWtlZEFtb3VudCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfQoKCS8vIENyb3NzLXJlYWxtIGdvdmVybmFuY2UgdXBkYXRlIGJlZm9yZSB0b2tlbiB0cmFuc2ZlcnMKCXVuU3Rha2VHb3Zlcm5hbmNlKDAsIHJsbSwgcmVjaXBpZW50LCB3aXRoZHJhd2FsQW1vdW50KQoKCS8vIFRyYW5zZmVyIHJld2FyZCB0b2tlbiB0byBkZXBvc2l0b3IKCWlmIHJld2FyZEFtb3VudCA+IDAgewoJCWNvbW1vbi5TYWZlR1JDMjBUcmFuc2ZlcigwLCBybG0sIHJld2FyZFRva2VuUGF0aCwgZGVwb3NpdC5EZXBvc2l0b3IoKSwgcmV3YXJkQW1vdW50KQoKCQljaGFpbi5FbWl0KAoJCQkiQ29sbGVjdFJld2FyZEJ5RGVwb3NpdElkIiwKCQkJInByZXZBZGRyIiwgY2FsbGVyLlN0cmluZygpLAoJCQkicHJldlJlYWxtIiwgcHJldmlvdXNSZWFsbS5Qa2dQYXRoKCksCgkJCSJkZXBvc2l0SWQiLCBkZXBvc2l0SUQsCgkJCSJ0YXJnZXRQcm9qZWN0VGllcklkIiwgdGFyZ2V0UHJvamVjdFRpZXJJRCwKCQkJImFtb3VudCIsIHV0aWxzLkZvcm1hdEludChyZXdhcmRBbW91bnQpLAoJCSkKCX0KCgkvLyBUcmFuc2ZlciB0aGUgb3JpZ2luYWwgR05TIGRlcG9zaXQgYmFjayB0byB0aGUgZGVwb3NpdG9yCgljb21tb24uU2FmZUdSQzIwVHJhbnNmZXIoMCwgcmxtLCBHTlNfVE9LRU5fS0VZLCBkZXBvc2l0LkRlcG9zaXRvcigpLCB3aXRoZHJhd2FsQW1vdW50KQoKCWNoYWluLkVtaXQoCgkJIkNvbGxlY3REZXBvc2l0R25zIiwKCQkicHJldkFkZHIiLCBjYWxsZXIuU3RyaW5nKCksCgkJInByZXZSZWFsbSIsIHByZXZpb3VzUmVhbG0uUGtnUGF0aCgpLAoJCSJkZXBvc2l0SWQiLCBkZXBvc2l0SUQsCgkJInRhcmdldFByb2plY3RUaWVySWQiLCB0YXJnZXRQcm9qZWN0VGllcklELAoJCSJhbW91bnQiLCB1dGlscy5Gb3JtYXRJbnQod2l0aGRyYXdhbEFtb3VudCksCgkJInRvdGFsR05TU3Rha2VkQW1vdW50IiwgdXRpbHMuRm9ybWF0SW50KGFmdGVyVG90YWxHTlNTdGFrZWRBbW91bnQpLAoJCSJyZWNpcGllbnQiLCByZWNpcGllbnQuU3RyaW5nKCksCgkpCgoJcmV0dXJuIHdpdGhkcmF3YWxBbW91bnQsIG5pbAp9CgovLyB3aXRoZHJhd0RlcG9zaXQgd2l0aGRyYXdzIGEgZGVwb3NpdCBhbmQgdXBkYXRlcyB0aGUgcmV3YXJkIG1hbmFnZXIuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgd2l0aGRyYXdEZXBvc2l0KF8gaW50LCBybG0gcmVhbG0sIGRlcG9zaXQgbGF1bmNocGFkLkRlcG9zaXQsIGN1cnJlbnRIZWlnaHQsIGN1cnJlbnRUaW1lIGludDY0KSAoYWRkcmVzcywgaW50NjQsIGVycm9yKSB7CgkvLyBJbnB1dCB2YWxpZGF0aW9uCglpZiBjdXJyZW50VGltZSA8PSAwIHsKCQlyZXR1cm4gIiIsIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRUaW1lLCAiY3VycmVudFRpbWUgbXVzdCBiZSBwb3NpdGl2ZSIpCgl9CgoJLy8gU3RhdGUgdmFsaWRhdGlvbgoJaWYgZGVwb3NpdC5Jc1dpdGhkcmF3bigpIHsKCQlyZXR1cm4gIiIsIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckFscmVhZHlDb2xsZWN0ZWQsIHVmbXQuU3ByaW50ZigiKCVzKSIsIGRlcG9zaXQuSUQoKSkpCgl9CgoJaWYgIWRlcG9zaXQuSXNFbmRlZChjdXJyZW50VGltZSkgewoJCXJldHVybiAiIiwgMCwgbWFrZUVycm9yV2l0aERldGFpbHMoZXJyTm90WWV0RW5kZWRQcm9qZWN0LCB1Zm10LlNwcmludGYoIiglcykiLCBkZXBvc2l0LklEKCkpKQoJfQoKCS8vIEdldCBwcm9qZWN0IGFuZCB0aWVyIGluZm9ybWF0aW9uCglwcm9qZWN0LCBlcnIgOj0gbHAuZ2V0UHJvamVjdChkZXBvc2l0LlByb2plY3RJRCgpKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCAwLCBlcnIKCX0KCglwcm9qZWN0VGllciwgZXJyIDo9IGdldFByb2plY3RUaWVyKHByb2plY3QsIGRlcG9zaXQuVGllcigpKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCAwLCBlcnIKCX0KCgkvLyBHZXQgcmV3YXJkIG1hbmFnZXIgYW5kIHVwZGF0ZSByZXdhcmRzIGJlZm9yZSB3aXRoZHJhd2FsCglyZXdhcmRNYW5hZ2VyLCBlcnIgOj0gbHAuZ2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VyKHByb2plY3RUaWVyLklEKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIiIsIDAsIGVycgoJfQoKCS8vIFVwZGF0ZSByZXdhcmRzIHdpdGggY3VycmVudCBkZXBvc2l0IGFtb3VudAoJZXJyID0gdXBkYXRlUmV3YXJkUGVyRGVwb3NpdFgxMjgocmV3YXJkTWFuYWdlciwgZ2V0VGllckN1cnJlbnREZXBvc2l0QW1vdW50KHByb2plY3RUaWVyKSwgY3VycmVudFRpbWUpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIiIsIDAsIGVycgoJfQoKCS8vIFByb2Nlc3Mgd2l0aGRyYXdhbCBmcm9tIHByb2plY3QgdGllcgoJd2l0aGRyYXdUb1RpZXIocHJvamVjdFRpZXIsIGRlcG9zaXQpCglwcm9qZWN0LlNldFRpZXIoZGVwb3NpdC5UaWVyKCksIHByb2plY3RUaWVyKQoKCS8vIEZpbmFsaXplIHdpdGhkcmF3YWwKCWRlcG9zaXQsIHdpdGhkcmF3YWxBbW91bnQgOj0gd2l0aGRyYXdEZXBvc2l0KGRlcG9zaXQsIGN1cnJlbnRIZWlnaHQsIGN1cnJlbnRUaW1lKQoKCS8vIFJlbW92ZSB0aGUgcmV3YXJkIHN0YXRlIGFuZCBpdHMgcmVzZXJ2ZWQgYWN0aXZlIGNsYWltIGFmdGVyIHdpdGhkcmF3YWwuCglpZiBlcnIgOj0gcmVtb3ZlUmV3YXJkU3RhdGUocmV3YXJkTWFuYWdlciwgZGVwb3NpdC5JRCgpKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCAwLCBlcnIKCX0KCgkvLyBQZXJzaXN0IHRoZSB1cGRhdGVkIHZhbHVlOyB0aGUgY2FsbGVyJ3MgZGVwb3NpdCB2YWx1ZSBpcyB1bmNoYW5nZWQuCglkZXBvc2l0cyA6PSBscC5zdG9yZS5HZXREZXBvc2l0cygpCglkZXBvc2l0cy5TZXQoZGVwb3NpdC5JRCgpLCBkZXBvc2l0KQoKCS8vIFNhdmUgdGhlIG1vZGlmaWVkIHN0YXRlIGJhY2sKCWlmIGVyciA6PSBscC5zdG9yZS5TZXREZXBvc2l0cygwLCBybG0sIGRlcG9zaXRzKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCAwLCBlcnIKCX0KCgllbWl0VXBkYXRlTGF1bmNocGFkUmV3YXJkQWNjdW11bGF0aW9uKHByb2plY3RUaWVyLklEKCksIHJld2FyZE1hbmFnZXIsIGdldFRpZXJDdXJyZW50RGVwb3NpdEFtb3VudChwcm9qZWN0VGllcikpCgoJcmV0dXJuIHByb2plY3QuUmVjaXBpZW50KCksIHdpdGhkcmF3YWxBbW91bnQsIG5pbAp9CgovLyB1blN0YWtlR292ZXJuYW5jZSByZW1vdmVzIHRoZSBzdGFrZWQgYW1vdW50IGZyb20gZ292ZXJuYW5jZSBzeXN0ZW0KZnVuYyB1blN0YWtlR292ZXJuYW5jZShfIGludCwgcmxtIHJlYWxtLCByZWNpcGllbnQgYWRkcmVzcywgd2l0aGRyYXdhbEFtb3VudCBpbnQ2NCkgewoJZ292X3N0YWtlci5TZXRBbW91bnRCeVByb2plY3RXYWxsZXQoY3Jvc3MocmxtKSwgcmVjaXBpZW50LCB3aXRoZHJhd2FsQW1vdW50LCBmYWxzZSkKfQoayBIKC3Byb2plY3QuZ25vErgScGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAoCgkiZXJyb3JzIgoKCWduc21hdGggImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoJImduby5sYW5kL3IvZ25vc3dhcC9sYXVuY2hwYWQiCikKCmZ1bmMgaXNQcm9qZWN0QWN0aXZlKHAgKmxhdW5jaHBhZC5Qcm9qZWN0LCBjdXJyZW50VGltZSBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gZ2V0U3RhbmRhcmRUaWVyKHApLklzQWN0aXZhdGVkKGN1cnJlbnRUaW1lKQp9CgpmdW5jIGlzUHJvamVjdEVuZGVkKHAgKmxhdW5jaHBhZC5Qcm9qZWN0LCBjdXJyZW50VGltZSBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gZ2V0U3RhbmRhcmRUaWVyKHApLklzRW5kZWQoY3VycmVudFRpbWUpCn0KCmZ1bmMgZ2V0UHJvamVjdFJlbWFpbmluZ0Ftb3VudChwICpsYXVuY2hwYWQuUHJvamVjdCkgaW50NjQgewoJcmVtYWluaW5nQW1vdW50IDo9IGludDY0KDApCgoJZm9yIF8sIHRpZXIgOj0gcmFuZ2UgcC5UaWVycygpIHsKCQlyZW1haW5pbmdBbW91bnQgPSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChyZW1haW5pbmdBbW91bnQsIGdldENhbGN1bGF0ZWRMZWZ0UmV3YXJkKHRpZXIpKQoJfQoKCXJldHVybiByZW1haW5pbmdBbW91bnQKfQoKZnVuYyBjaGVja1Byb2plY3RDb25kaXRpb25zKHAgKmxhdW5jaHBhZC5Qcm9qZWN0LCBjYWxsZXIgYWRkcmVzcywgYmFsYW5jZU9mRnVuYyBmdW5jKHRva2VuUGF0aCBzdHJpbmcsIGNhbGxlciBhZGRyZXNzKSBpbnQ2NCkgZXJyb3IgewoJY29uZGl0aW9ucyA6PSBwLkNvbmRpdGlvbnMoKQoJaWYgY29uZGl0aW9ucyA9PSBuaWwgewoJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkRGF0YSwgImNvbmRpdGlvbnMgaXMgbmlsIikKCX0KCglmb3IgXywgY29uZGl0aW9uIDo9IHJhbmdlIGNvbmRpdGlvbnMgewoJCS8vIHhHTlMob3IgR05TKSBtYXkgaGF2ZSBhIHplcm8gY29uZGl0aW9uCgkJaWYgIWNvbmRpdGlvbi5Jc0F2YWlsYWJsZSgpIHsKCQkJY29udGludWUKCQl9CgoJCXRva2VuUGF0aCA6PSBjb25kaXRpb24uVG9rZW5QYXRoKCkKCQliYWxhbmNlIDo9IGJhbGFuY2VPZkZ1bmModG9rZW5QYXRoLCBjYWxsZXIpCgoJCWlmIGVyciA6PSBjb25kaXRpb24uQ2hlY2tCYWxhbmNlQ29uZGl0aW9uKHRva2VuUGF0aCwgYmFsYW5jZSk7IGVyciAhPSBuaWwgewoJCQlyZXR1cm4gZXJyCgkJfQoJfQoKCXJldHVybiBuaWwKfQoKZnVuYyBnZXRQcm9qZWN0VGllcihwICpsYXVuY2hwYWQuUHJvamVjdCwgZHVyYXRpb24gaW50NjQpICgqbGF1bmNocGFkLlByb2plY3RUaWVyLCBlcnJvcikgewoJdGllciwgZXJyIDo9IHAuR2V0VGllcihkdXJhdGlvbikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckRhdGFOb3RGb3VuZCwgZXJyLkVycm9yKCkpCgl9CgoJcmV0dXJuIHRpZXIsIG5pbAp9CgpmdW5jIGdldFN0YW5kYXJkVGllcihwICpsYXVuY2hwYWQuUHJvamVjdCkgKmxhdW5jaHBhZC5Qcm9qZWN0VGllciB7Cglwcm9qZWN0VGllciwgZXJyIDo9IHAuR2V0VGllcihwcm9qZWN0VGllcjE4MCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckRhdGFOb3RGb3VuZCwgZXJyLkVycm9yKCkpKQoJfQoKCXJldHVybiBwcm9qZWN0VGllcgp9CgpmdW5jIHZhbGlkYXRlUmVmdW5kUmVtYWluaW5nQW1vdW50KHAgKmxhdW5jaHBhZC5Qcm9qZWN0LCBjdXJyZW50VGltZSBpbnQ2NCkgZXJyb3IgewoJaWYgIWlzUHJvamVjdEVuZGVkKHAsIGN1cnJlbnRUaW1lKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoCgkJCXVmbXQuU3ByaW50ZigicHJvamVjdCBub3QgZW5kZWQgeWV0KGN1cnJlbnQ6JWQsIGVuZFRpbWU6ICVkKSIsIGN1cnJlbnRUaW1lLCBnZXRTdGFuZGFyZFRpZXIocCkuRW5kVGltZSgpKSwKCQkpCgl9CgoJaWYgZ2V0UHJvamVjdFJlbWFpbmluZ0Ftb3VudChwKSA9PSAwIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygKCQkJdWZtdC5TcHJpbnRmKCJwcm9qZWN0IGhhcyBubyByZW1haW5pbmcgYW1vdW50IiksCgkJKQoJfQoKCXJldHVybiBuaWwKfQoKZnVuYyBhZGRQcm9qZWN0VGllcihwICpsYXVuY2hwYWQuUHJvamVjdCwgdGllckR1cmF0aW9uIGludDY0LCBwcm9qZWN0VGllciAqbGF1bmNocGFkLlByb2plY3RUaWVyKSB7CglwLlNldFRpZXIodGllckR1cmF0aW9uLCBwcm9qZWN0VGllcikKfQoKZnVuYyBhZGRQcm9qZWN0Q29uZGl0aW9uKHAgKmxhdW5jaHBhZC5Qcm9qZWN0LCB0b2tlblBhdGggc3RyaW5nLCBjb25kaXRpb24gKmxhdW5jaHBhZC5Qcm9qZWN0Q29uZGl0aW9uKSB7CglwLlNldENvbmRpdGlvbih0b2tlblBhdGgsIGNvbmRpdGlvbikKfQoaohIKEHByb2plY3RfdGllci5nbm8SjRJwYWNrYWdlIGxhdW5jaHBhZAoKaW1wb3J0ICgKCSJlcnJvcnMiCgoJImduby5sYW5kL3IvZ25vc3dhcC9sYXVuY2hwYWQiCgoJImduby5sYW5kL3AvZ25vc3dhcC9jb25zdHMvdjEiCglnbnNtYXRoICJnbm8ubGFuZC9wL2dub3N3YXAvZ25zbWF0aC92MSIKCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgopCgpmdW5jIGdldFRpZXJDdXJyZW50RGVwb3NpdENvdW50KHQgKmxhdW5jaHBhZC5Qcm9qZWN0VGllcikgaW50NjQgewoJcmV0dXJuIGduc21hdGguU2FmZVN1YkludDY0KHQuVG90YWxEZXBvc2l0Q291bnQoKSwgdC5Ub3RhbFdpdGhkcmF3Q291bnQoKSkKfQoKZnVuYyBnZXRUaWVyQ3VycmVudERlcG9zaXRBbW91bnQodCAqbGF1bmNocGFkLlByb2plY3RUaWVyKSBpbnQ2NCB7CglyZXR1cm4gZ25zbWF0aC5TYWZlU3ViSW50NjQodC5Ub3RhbERlcG9zaXRBbW91bnQoKSwgdC5Ub3RhbFdpdGhkcmF3QW1vdW50KCkpCn0KCmZ1bmMgZ2V0Q2FsY3VsYXRlZExlZnRSZXdhcmQodCAqbGF1bmNocGFkLlByb2plY3RUaWVyKSBpbnQ2NCB7CglyZXR1cm4gZ25zbWF0aC5TYWZlU3ViSW50NjQodC5Ub3RhbERpc3RyaWJ1dGVBbW91bnQoKSwgdC5Ub3RhbENvbGxlY3RlZEFtb3VudCgpKQp9CgpmdW5jIGRlcG9zaXRUb1RpZXIodCAqbGF1bmNocGFkLlByb2plY3RUaWVyLCBkZXBvc2l0IGxhdW5jaHBhZC5EZXBvc2l0KSB7Cgl0b3RhbERlcG9zaXRBbW91bnQgOj0gZ25zbWF0aC5TYWZlQWRkSW50NjQodC5Ub3RhbERlcG9zaXRBbW91bnQoKSwgZGVwb3NpdC5EZXBvc2l0QW1vdW50KCkpCgl0b3RhbERlcG9zaXRDb3VudCA6PSBnbnNtYXRoLlNhZmVBZGRJbnQ2NCh0LlRvdGFsRGVwb3NpdENvdW50KCksIDEpCgoJdC5TZXRUb3RhbERlcG9zaXRBbW91bnQodG90YWxEZXBvc2l0QW1vdW50KQoJdC5TZXRUb3RhbERlcG9zaXRDb3VudCh0b3RhbERlcG9zaXRDb3VudCkKfQoKZnVuYyB3aXRoZHJhd1RvVGllcih0ICpsYXVuY2hwYWQuUHJvamVjdFRpZXIsIGRlcG9zaXQgbGF1bmNocGFkLkRlcG9zaXQpIHsKCXRvdGFsV2l0aGRyYXdBbW91bnQgOj0gZ25zbWF0aC5TYWZlQWRkSW50NjQodC5Ub3RhbFdpdGhkcmF3QW1vdW50KCksIGRlcG9zaXQuRGVwb3NpdEFtb3VudCgpKQoJdG90YWxXaXRoZHJhd0NvdW50IDo9IGduc21hdGguU2FmZUFkZEludDY0KHQuVG90YWxXaXRoZHJhd0NvdW50KCksIDEpCgoJdC5TZXRUb3RhbFdpdGhkcmF3QW1vdW50KHRvdGFsV2l0aGRyYXdBbW91bnQpCgl0LlNldFRvdGFsV2l0aGRyYXdDb3VudCh0b3RhbFdpdGhkcmF3Q291bnQpCn0KCmZ1bmMgdXBkYXRlVGllckRpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmQodCAqbGF1bmNocGFkLlByb2plY3RUaWVyKSB7CgkvLyBVc2UgdGltZSBkdXJhdGlvbiBpbnN0ZWFkIG9mIGJsb2NrIGNvdW50CglkaXN0cmlidXRlVGltZUR1cmF0aW9uIDo9IHQuRW5kVGltZSgpIC0gdC5TdGFydFRpbWUoKQoJaWYgZGlzdHJpYnV0ZVRpbWVEdXJhdGlvbiA8PSAwIHsKCQlyZXR1cm4KCX0KCgl0b3RhbERpc3RyaWJ1dGVBbW91bnRYMTI4LCBvdmVyZmxvdyA6PSB1MjU2Llplcm8oKS5NdWxPdmVyZmxvdyh1MjU2Lk5ld1VpbnRGcm9tSW50NjQodC5Ub3RhbERpc3RyaWJ1dGVBbW91bnQoKSksIGNvbnN0cy5RMTI4KCkpCglpZiBvdmVyZmxvdyB7CgkJcGFuaWMoZXJyb3JzLk5ldyhlcnJPdmVyZmxvdykpCgl9CgoJLy8gRGl2aWRlIGJ5IHRpbWUgZHVyYXRpb24gaW4gc2Vjb25kcwoJZGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjggOj0gdTI1Ni5aZXJvKCkuRGl2KHRvdGFsRGlzdHJpYnV0ZUFtb3VudFgxMjgsIHUyNTYuTmV3VWludEZyb21JbnQ2NChkaXN0cmlidXRlVGltZUR1cmF0aW9uKSkKCgl0LlNldERpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4KGRpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4KQp9CgovLyBuZXdQcm9qZWN0VGllciByZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ldyBQcm9qZWN0VGllciB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMuCmZ1bmMgbmV3UHJvamVjdFRpZXIoCglwcm9qZWN0SUQgc3RyaW5nLAoJdGllckR1cmF0aW9uIGludDY0LAoJdG90YWxEaXN0cmlidXRlQW1vdW50IGludDY0LAoJc3RhcnRUaW1lIGludDY0LAoJZW5kVGltZSBpbnQ2NCwKKSAqbGF1bmNocGFkLlByb2plY3RUaWVyIHsKCXRpZXIgOj0gbGF1bmNocGFkLk5ld1Byb2plY3RUaWVyKHByb2plY3RJRCwgdGllckR1cmF0aW9uLCB0b3RhbERpc3RyaWJ1dGVBbW91bnQsIHN0YXJ0VGltZSwgZW5kVGltZSkKCgl1cGRhdGVUaWVyRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZCh0aWVyKQoKCXJldHVybiB0aWVyCn0KGrcVCgpyZW5kZXIuZ25vEqgVcGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAoCgkiY2hhaW4iCgkic3RyaW5ncyIKCglwcmJhYyAiZ25vLmxhbmQvcC9nbm9zd2FwL3JiYWMvdjEiCgkiZ25vLmxhbmQvcC9tb3VsL21kL3YwIgoJImduby5sYW5kL3AvbW91bC9tZHRhYmxlL3YwIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgoJImduby5sYW5kL3IvZ25vc3dhcC9oYWx0L3YxIgoJbGF1bmNocGFkUm9vdCAiZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZCIKKQoKZnVuYyAobCAqbGF1bmNocGFkVjEpIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggIT0gIiIgewoJCXJldHVybiAiNDA0XG4iCgl9CgoJaW1wbGVtZW50YXRpb24gOj0gbGF1bmNocGFkUm9vdC5HZXRJbXBsZW1lbnRhdGlvblBhY2thZ2VQYXRoKCkKCglvdXQgOj0gbWQuSDEoIkdub3N3YXAgTGF1bmNocGFkIikKCW91dCArPSBtZC5QYXJhZ3JhcGgoCgkJIkFsbCBHTlMgYW1vdW50cyB1c2UgdGhlIHRva2VuJ3Mgc2l4LWRlY2ltYWwgYmFzZSB1bml0cy4gUHJvamVjdCByZXdhcmQgYW1vdW50c1xuIiArCgkJCSJ1c2UgdGhlIHByb2plY3QgdG9rZW4ncyBvd24gYmFzZSB1bml0cy4iLAoJKQoKCW91dCArPSBtZC5IMigiSW1wbGVtZW50YXRpb24gYW5kIGFjY2VzcyIpCglpbXBsZW1lbnRhdGlvblRhYmxlIDo9IG1kdGFibGUuVGFibGV7CgkJSGVhZGVyczogW11zdHJpbmd7IkZpZWxkIiwgIlZhbHVlIn0sCgkJUm93czogW11bXXN0cmluZ3sKCQkJeyJSZWFsbSBhZGRyZXNzIiwgbWQuSW5saW5lQ29kZShjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZCIpLlN0cmluZygpKX0sCgkJCXsiQWN0aXZlIGltcGxlbWVudGF0aW9uIiwgbWQuTGluayhpbXBsZW1lbnRhdGlvbiwgc3RyaW5ncy5UcmltUHJlZml4KGltcGxlbWVudGF0aW9uLCAiZ25vLmxhbmQiKSl9LAoJCQl7IkxhdW5jaHBhZCBvcGVyYXRpb25zIGhhbHRlZCIsIHVmbXQuU3ByaW50ZigiJXQiLCBoYWx0LklzSGFsdGVkTGF1bmNocGFkKCkpfSwKCQkJeyJXaXRoZHJhd2FsIG9wZXJhdGlvbnMgaGFsdGVkIiwgdWZtdC5TcHJpbnRmKCIldCIsIGhhbHQuSXNIYWx0ZWRXaXRoZHJhdygpKX0sCgkJCXsiUHJvamVjdCBjcmVhdGlvbiByb2xlIChhZG1pbikiLCByZW5kZXJMYXVuY2hwYWRSb2xlKHByYmFjLlJPTEVfQURNSU4pfSwKCQkJeyJQcm9qZWN0IGNyZWF0aW9uIHJvbGUgKGdvdmVybmFuY2UpIiwgcmVuZGVyTGF1bmNocGFkUm9sZShwcmJhYy5ST0xFX0dPVkVSTkFOQ0UpfSwKCQl9LAoJfQoJb3V0ICs9IGltcGxlbWVudGF0aW9uVGFibGUuU3RyaW5nKCkKCglvdXQgKz0gbWQuSDIoIkRlcG9zaXQgYWNjb3VudGluZyBhbmQgY29uZmlndXJhdGlvbiIpCglhY2NvdW50aW5nVGFibGUgOj0gbWR0YWJsZS5UYWJsZXsKCQlIZWFkZXJzOiBbXXN0cmluZ3siRmllbGQiLCAiVmFsdWUifSwKCQlSb3dzOiBbXVtdc3RyaW5newoJCQl7IlN0b3JlZCBwcm9qZWN0IHJlY29yZHMiLCB1Zm10LlNwcmludGYoIiVkIiwgbC5zdG9yZS5HZXRQcm9qZWN0cygpLlNpemUoKSl9LAoJCQl7IlN0b3JlZCB1bmlxdWUgcHJvamVjdC1yZWNpcGllbnQgcmVjb3JkcyIsIHVmbXQuU3ByaW50ZigiJWQiLCBsLnN0b3JlLkdldFByb2plY3RSZWNpcGllbnRzKCkuU2l6ZSgpKX0sCgkJCXsiU3RvcmVkIHByb2plY3QtdGllciByZXdhcmQtbWFuYWdlciByZWNvcmRzIiwgdWZtdC5TcHJpbnRmKCIlZCIsIGwuc3RvcmUuR2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VycygpLlNpemUoKSl9LAoJCQl7IlN0b3JlZCBkZXBvc2l0IHJlY29yZHMgKGluY2x1ZGluZyB3aXRoZHJhd24pIiwgdWZtdC5TcHJpbnRmKCIlZCIsIGwuc3RvcmUuR2V0RGVwb3NpdHMoKS5TaXplKCkpfSwKCQkJeyJEZXBvc2l0IElEIGNvdW50ZXIgKGFsbG9jYXRlZCBJRHMpIiwgdWZtdC5TcHJpbnRmKCIlZCIsIGwuc3RvcmUuR2V0RGVwb3NpdENvdW50ZXIoKS5HZXQoKSl9LAoJCQl7IkN1cnJlbnQgR05TIHN0YWtlZCBhbW91bnQgKGJhc2UgdW5pdHM7IDYgZGVjaW1hbHMpIiwgdWZtdC5TcHJpbnRmKCIlZCIsIGwuc3RvcmUuR2V0VG90YWxHTlNTdGFrZWRBbW91bnQoKSl9LAoJCQl7Ik1pbmltdW0gR05TIGRlcG9zaXQgKGJhc2UgdW5pdHM7IDYgZGVjaW1hbHMpIiwgdWZtdC5TcHJpbnRmKCIlZCIsIG1pbmltdW1EZXBvc2l0QW1vdW50KX0sCgkJCXsiTWluaW11bSBwcm9qZWN0IHN0YXJ0IGRlbGF5IChzZWNvbmRzKSIsIHVmbXQuU3ByaW50ZigiJWQiLCBwcm9qZWN0TWluaW11bVN0YXJ0RGVsYXlUaW1lKX0sCgkJCXsiUHJvamVjdCB0aWVycyAoZGF5cykiLCAiMzAgLyA5MCAvIDE4MCJ9LAoJCQl7IlJld2FyZCBjbGFpbWFibGUgZHVyYXRpb24gKHNlY29uZHMpIiwgdWZtdC5TcHJpbnRmKCIlZCIsIHByb2plY3RUaWVyUmV3YXJkQ29sbGVjdGFibGVEdXJhdGlvbltwcm9qZWN0VGllcjMwXSl9LAoJCX0sCgl9CglvdXQgKz0gYWNjb3VudGluZ1RhYmxlLlN0cmluZygpCgoJcmV0dXJuIG91dAp9CgpmdW5jIHJlbmRlckxhdW5jaHBhZFJvbGUocm9sZSBwcmJhYy5TeXN0ZW1Sb2xlKSBzdHJpbmcgewoJYWRkciwgb2sgOj0gYWNjZXNzLkdldEFkZHJlc3Mocm9sZS5TdHJpbmcoKSkKCWlmICFvayB8fCBhZGRyID09IGFkZHJlc3MoIiIpIHsKCQlyZXR1cm4gIlVuYXNzaWduZWQiCgl9CglyZXR1cm4gbWQuSW5saW5lQ29kZShhZGRyLlN0cmluZygpKQp9ChrqSQoScmV3YXJkX21hbmFnZXIuZ25vEtNJcGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAoCgkiZXJyb3JzIgoKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCSJnbm8ubGFuZC9yL2dub3N3YXAvbGF1bmNocGFkIgoKCWduc21hdGggImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCikKCi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIFJld2FyZE1hbmFnZXIKCmZ1bmMgaXNSZXdhcmRNYW5hZ2VySW5pdGlhbGl6ZWQociAqbGF1bmNocGFkLlJld2FyZE1hbmFnZXIpIGJvb2wgewoJcmV0dXJuIHIuUmV3YXJkcygpLlNpemUoKSA+IDAKfQoKZnVuYyBnZXREZXBvc2l0UmV3YXJkU3RhdGUociAqbGF1bmNocGFkLlJld2FyZE1hbmFnZXIsIGRlcG9zaXRJZCBzdHJpbmcpICgqbGF1bmNocGFkLlJld2FyZFN0YXRlLCBlcnJvcikgewoJcmV3YXJkU3RhdGVJIDo9IHIuUmV3YXJkcygpLkdldChkZXBvc2l0SWQpCglpZiByZXdhcmRTdGF0ZUkgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJOb3RFeGlzdERlcG9zaXQsIHVmbXQuU3ByaW50ZigiKCVzKSIsIGRlcG9zaXRJZCkpCgl9CgoJcmV3YXJkU3RhdGUsIG9rIDo9IHJld2FyZFN0YXRlSS4oKmxhdW5jaHBhZC5SZXdhcmRTdGF0ZSkKCWlmICFvayB7CgkJcmV0dXJuIG5pbCwgdWZtdC5FcnJvcmYoImZhaWxlZCB0byBjYXN0IHJld2FyZFN0YXRlIHRvICpsYXVuY2hwYWQuUmV3YXJkU3RhdGU6ICVUIiwgcmV3YXJkU3RhdGVJKQoJfQoKCXJldHVybiByZXdhcmRTdGF0ZSwgbmlsCn0KCmZ1bmMgY2FsY3VsYXRlUmV3YXJkUGVyRGVwb3NpdFgxMjgociAqbGF1bmNocGFkLlJld2FyZE1hbmFnZXIsIHJld2FyZFBlclNlY29uZFgxMjggKnUyNTYuVWludCwgdG90YWxTdGFrZWQgaW50NjQsIGN1cnJlbnRUaW1lIGludDY0KSAoKnUyNTYuVWludCwgZXJyb3IpIHsKCWFjY3VtdWxhdGVkVGltZSA6PSByLkFjY3VtdWxhdGVkVGltZSgpCglpZiByLkRpc3RyaWJ1dGVTdGFydFRpbWUoKSA+IGFjY3VtdWxhdGVkVGltZSB7CgkJYWNjdW11bGF0ZWRUaW1lID0gci5EaXN0cmlidXRlU3RhcnRUaW1lKCkKCX0KCgkvLyBub3Qgc3RhcnRlZCB5ZXQKCWlmIGN1cnJlbnRUaW1lIDwgYWNjdW11bGF0ZWRUaW1lIHsKCQlyZXR1cm4gdTI1Ni5aZXJvKCksIG5pbAoJfQoKCS8vIHBhc3QgZGlzdHJpYnV0ZSBlbmQgdGltZQoJaWYgYWNjdW11bGF0ZWRUaW1lID4gci5EaXN0cmlidXRlRW5kVGltZSgpIHsKCQlyZXR1cm4gdTI1Ni5aZXJvKCksIG5pbAoJfQoKCS8vIHBhc3QgZGlzdHJpYnV0ZSBlbmQgdGltZSwgc2V0IHRvIGRpc3RyaWJ1dGUgZW5kIHRpbWUKCWlmIGN1cnJlbnRUaW1lID4gci5EaXN0cmlidXRlRW5kVGltZSgpIHsKCQljdXJyZW50VGltZSA9IHIuRGlzdHJpYnV0ZUVuZFRpbWUoKQoJfQoKCWlmIHJld2FyZFBlclNlY29uZFgxMjguSXNaZXJvKCkgewoJCXJldHVybiBuaWwsIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJOb0xlZnRSZXdhcmQsCgkJCXVmbXQuU3ByaW50ZigicmV3YXJkUGVyU2Vjb25kKCVkKSIsIHJld2FyZFBlclNlY29uZFgxMjgpLAoJCSkKCX0KCgkvLyBubyBsZWZ0IHJld2FyZAoJaWYgdG90YWxTdGFrZWQgPT0gMCB7CgkJcmV0dXJuIHUyNTYuWmVybygpLCBuaWwKCX0KCgkvLyB0aW1lRHVyYXRpb24gKiByZXdhcmRQZXJTZWNvbmQgLyB0b3RhbFN0YWtlZAoJdGltZUR1cmF0aW9uIDo9IGN1cnJlbnRUaW1lIC0gYWNjdW11bGF0ZWRUaW1lCglyZXdhcmRQZXJEZXBvc2l0WDEyOCA6PSB1MjU2Lk11bERpdigKCQl1MjU2Lk5ld1VpbnRGcm9tSW50NjQodGltZUR1cmF0aW9uKSwKCQlyZXdhcmRQZXJTZWNvbmRYMTI4LAoJCXUyNTYuTmV3VWludEZyb21JbnQ2NCh0b3RhbFN0YWtlZCksCgkpCgoJcmV0dXJuIHJld2FyZFBlckRlcG9zaXRYMTI4LCBuaWwKfQoKZnVuYyBhZGRSZXdhcmRTdGF0ZUJ5RGVwb3NpdChyICpsYXVuY2hwYWQuUmV3YXJkTWFuYWdlciwgZGVwb3NpdCBsYXVuY2hwYWQuRGVwb3NpdCkgKmxhdW5jaHBhZC5SZXdhcmRTdGF0ZSB7CgljbGFpbWFibGVUaW1lIDo9IGRlcG9zaXQuQ3JlYXRlZEF0KCkgKyByLlJld2FyZENsYWltYWJsZUR1cmF0aW9uKCkKCWlmIGNsYWltYWJsZVRpbWUgPiByLkRpc3RyaWJ1dGVFbmRUaW1lKCkgewoJCWNsYWltYWJsZVRpbWUgPSByLkRpc3RyaWJ1dGVFbmRUaW1lKCkKCX0KCglyZXdhcmRTdGF0ZSA6PSBsYXVuY2hwYWQuTmV3UmV3YXJkU3RhdGUoCgkJci5BY2N1bXVsYXRlZFJld2FyZFBlckRlcG9zaXRYMTI4KCkuQ2xvbmUoKSwKCQlkZXBvc2l0LkRlcG9zaXRBbW91bnQoKSwKCQlkZXBvc2l0LkNyZWF0ZWRBdCgpLAoJCXIuRGlzdHJpYnV0ZUVuZFRpbWUoKSwKCQljbGFpbWFibGVUaW1lLAoJKQoKCS8vIGlmIHRoZSBmaXJzdCBkZXBvc2l0LCBzZXQgdGhlIGRpc3RyaWJ1dGUgc3RhcnQgdGltZQoJaWYgIWlzUmV3YXJkTWFuYWdlckluaXRpYWxpemVkKHIpIHsKCQlyZXdhcmRTdGF0ZS5TZXREaXN0cmlidXRlU3RhcnRUaW1lKHIuRGlzdHJpYnV0ZVN0YXJ0VGltZSgpKQoJCXJld2FyZFN0YXRlLlNldERpc3RyaWJ1dGVFbmRUaW1lKHIuRGlzdHJpYnV0ZUVuZFRpbWUoKSkKCQlyZXdhcmRTdGF0ZS5TZXRBY2N1bXVsYXRlZFRpbWUoci5EaXN0cmlidXRlU3RhcnRUaW1lKCkpCgkJcmV3YXJkU3RhdGUuU2V0UHJpY2VEZWJ0WDEyOCh1MjU2Llplcm8oKSkKCX0KCglyZXR1cm4gYWRkUmV3YXJkU3RhdGUociwgZGVwb3NpdCwgcmV3YXJkU3RhdGUpCn0KCmZ1bmMgYWRkUmV3YXJkU3RhdGUociAqbGF1bmNocGFkLlJld2FyZE1hbmFnZXIsIGRlcG9zaXQgbGF1bmNocGFkLkRlcG9zaXQsIHJld2FyZFN0YXRlICpsYXVuY2hwYWQuUmV3YXJkU3RhdGUpICpsYXVuY2hwYWQuUmV3YXJkU3RhdGUgewoJYWRkQWN0aXZlUmV3YXJkU3RhdGUociwgcmV3YXJkU3RhdGUpCglyLlNldFJld2FyZChkZXBvc2l0LklEKCksIHJld2FyZFN0YXRlKQoKCXJldHVybiByZXdhcmRTdGF0ZQp9CgpmdW5jIHJlbW92ZVJld2FyZFN0YXRlKHIgKmxhdW5jaHBhZC5SZXdhcmRNYW5hZ2VyLCBkZXBvc2l0SWQgc3RyaW5nKSBlcnJvciB7CglyZXdhcmRTdGF0ZSwgZXJyIDo9IGdldERlcG9zaXRSZXdhcmRTdGF0ZShyLCBkZXBvc2l0SWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJcmVtb3ZlQWN0aXZlUmV3YXJkU3RhdGUociwgcmV3YXJkU3RhdGUpCglyLlJlbW92ZVJld2FyZChkZXBvc2l0SWQpCglyZXR1cm4gbmlsCn0KCmZ1bmMgYWRkQWN0aXZlUmV3YXJkU3RhdGUociAqbGF1bmNocGFkLlJld2FyZE1hbmFnZXIsIHJld2FyZFN0YXRlICpsYXVuY2hwYWQuUmV3YXJkU3RhdGUpIHsKCWRlYnQsIG92ZXJmbG93IDo9IHUyNTYuWmVybygpLk11bE92ZXJmbG93KAoJCXJld2FyZFN0YXRlLlByaWNlRGVidFgxMjgoKSwKCQl1MjU2Lk5ld1VpbnRGcm9tSW50NjQocmV3YXJkU3RhdGUuRGVwb3NpdEFtb3VudCgpKSwKCSkKCWlmIG92ZXJmbG93IHsKCQlwYW5pYyhlcnJvcnMuTmV3KGVyck92ZXJmbG93KSkKCX0KCglyLlNldEFjdGl2ZURlcG9zaXRBbW91bnQoZ25zbWF0aC5TYWZlQWRkSW50NjQoci5BY3RpdmVEZXBvc2l0QW1vdW50KCksIHJld2FyZFN0YXRlLkRlcG9zaXRBbW91bnQoKSkpCglyLlNldEFjdGl2ZVByaWNlRGVidFgxMjgodTI1Ni5aZXJvKCkuQWRkKHIuQWN0aXZlUHJpY2VEZWJ0WDEyOCgpLCBkZWJ0KSkKfQoKZnVuYyByZW1vdmVBY3RpdmVSZXdhcmRTdGF0ZShyICpsYXVuY2hwYWQuUmV3YXJkTWFuYWdlciwgcmV3YXJkU3RhdGUgKmxhdW5jaHBhZC5SZXdhcmRTdGF0ZSkgewoJZGVidCwgb3ZlcmZsb3cgOj0gdTI1Ni5aZXJvKCkuTXVsT3ZlcmZsb3coCgkJcmV3YXJkU3RhdGUuUHJpY2VEZWJ0WDEyOCgpLAoJCXUyNTYuTmV3VWludEZyb21JbnQ2NChyZXdhcmRTdGF0ZS5EZXBvc2l0QW1vdW50KCkpLAoJKQoJaWYgb3ZlcmZsb3cgewoJCXBhbmljKGVycm9ycy5OZXcoZXJyT3ZlcmZsb3cpKQoJfQoKCXIuU2V0QWN0aXZlRGVwb3NpdEFtb3VudChnbnNtYXRoLlNhZmVTdWJJbnQ2NChyLkFjdGl2ZURlcG9zaXRBbW91bnQoKSwgcmV3YXJkU3RhdGUuRGVwb3NpdEFtb3VudCgpKSkKCXIuU2V0QWN0aXZlQ2xhaW1lZEFtb3VudChnbnNtYXRoLlNhZmVTdWJJbnQ2NChyLkFjdGl2ZUNsYWltZWRBbW91bnQoKSwgcmV3YXJkU3RhdGUuQ2xhaW1lZEFtb3VudCgpKSkKCXIuU2V0QWN0aXZlUHJpY2VEZWJ0WDEyOCh1MjU2Llplcm8oKS5TdWIoci5BY3RpdmVQcmljZURlYnRYMTI4KCksIGRlYnQpKQp9CgpmdW5jIGFkZFJld2FyZFBlckRlcG9zaXRYMTI4KHIgKmxhdW5jaHBhZC5SZXdhcmRNYW5hZ2VyLCByZXdhcmRQZXJEZXBvc2l0WDEyOCAqdTI1Ni5VaW50LCBjdXJyZW50VGltZSBpbnQ2NCkgZXJyb3IgewoJaWYgcmV3YXJkUGVyRGVwb3NpdFgxMjguSXNaZXJvKCkgewoJCXJldHVybiBuaWwKCX0KCglpZiByLkFjY3VtdWxhdGVkVGltZSgpID4gY3VycmVudFRpbWUgfHwgci5EaXN0cmlidXRlU3RhcnRUaW1lKCkgPiBjdXJyZW50VGltZSB7CgkJcmV0dXJuIG5pbAoJfQoKCWlmIGN1cnJlbnRUaW1lID4gci5EaXN0cmlidXRlRW5kVGltZSgpIHsKCQljdXJyZW50VGltZSA9IHIuRGlzdHJpYnV0ZUVuZFRpbWUoKQoJfQoKCWFjY3VtdWxhdGVkIDo9IHUyNTYuWmVybygpLkFkZChyLkFjY3VtdWxhdGVkUmV3YXJkUGVyRGVwb3NpdFgxMjgoKSwgcmV3YXJkUGVyRGVwb3NpdFgxMjgpCglyLlNldEFjY3VtdWxhdGVkUmV3YXJkUGVyRGVwb3NpdFgxMjgoYWNjdW11bGF0ZWQpCglyLlNldEFjY3VtdWxhdGVkVGltZShjdXJyZW50VGltZSkKCglyZXR1cm4gbmlsCn0KCi8vIHVwZGF0ZVJld2FyZFBlckRlcG9zaXRYMTI4IHVwZGF0ZXMgdGhlIHJld2FyZCBwZXIgZGVwb3NpdCBzdGF0ZS4KLy8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGFuZCB1cGRhdGVzIHRoZSBhY2N1bXVsYXRlZCByZXdhcmQgcGVyIGRlcG9zaXQKLy8gYmFzZWQgb24gdGhlIGN1cnJlbnQgdG90YWwgZGVwb3NpdCBhbW91bnQgYW5kIHRpbWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vIC0gdG90YWxEZXBvc2l0QW1vdW50IChpbnQ2NCk6IEN1cnJlbnQgdG90YWwgZGVwb3NpdCBhbW91bnQKLy8gLSB0aW1lIChpbnQ2NCk6IEN1cnJlbnQgdGltZXN0YW1wCi8vCi8vIFJldHVybnM6Ci8vIC0gZXJyb3I6IElmIHRoZSB1cGRhdGUgZmFpbHMKZnVuYyB1cGRhdGVSZXdhcmRQZXJEZXBvc2l0WDEyOChyICpsYXVuY2hwYWQuUmV3YXJkTWFuYWdlciwgdG90YWxEZXBvc2l0QW1vdW50IGludDY0LCBjdXJyZW50VGltZSBpbnQ2NCkgZXJyb3IgewoJaWYgY3VycmVudFRpbWUgPD0gMCB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRUaW1lLCAidGltZSBtdXN0IGJlIHBvc2l0aXZlIikKCX0KCgkvLyBDYWxjdWxhdGUgYW5kIHVwZGF0ZSByZXdhcmRzCglyZXdhcmRQZXJEZXBvc2l0WDEyOCwgZXJyIDo9IGNhbGN1bGF0ZVJld2FyZFBlckRlcG9zaXRYMTI4KAoJCXIsCgkJci5EaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOCgpLAoJCXRvdGFsRGVwb3NpdEFtb3VudCwKCQljdXJyZW50VGltZSwKCSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCgllcnIgPSBhZGRSZXdhcmRQZXJEZXBvc2l0WDEyOChyLCByZXdhcmRQZXJEZXBvc2l0WDEyOCwgY3VycmVudFRpbWUpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJcmV0dXJuIG5pbAp9CgpmdW5jIHVwZGF0ZURpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4KHIgKmxhdW5jaHBhZC5SZXdhcmRNYW5hZ2VyLCB0b3RhbERpc3RyaWJ1dGVBbW91bnQgaW50NjQsIGRpc3RyaWJ1dGVTdGFydFRpbWUgaW50NjQsIGRpc3RyaWJ1dGVFbmRUaW1lIGludDY0KSB7CgkvLyBVc2UgdGltZSBkdXJhdGlvbiBmb3IgcGVyLXNlY29uZCBjYWxjdWxhdGlvbgoJdGltZUR1cmF0aW9uIDo9IGRpc3RyaWJ1dGVFbmRUaW1lIC0gZGlzdHJpYnV0ZVN0YXJ0VGltZQoJaWYgdGltZUR1cmF0aW9uIDw9IDAgewoJCXJldHVybgoJfQoKCXRvdGFsRGlzdHJpYnV0ZUFtb3VudFgxMjggOj0gdTI1Ni5aZXJvKCkuTHNoKAoJCXUyNTYuTmV3VWludEZyb21JbnQ2NCh0b3RhbERpc3RyaWJ1dGVBbW91bnQpLAoJCTEyOCwKCSkKCgkvLyBEaXZpZGUgYnkgdGltZSBkdXJhdGlvbiBpbiBzZWNvbmRzCglhbW91bnRQZXJTZWNvbmRYMTI4IDo9IHUyNTYuWmVybygpLkRpdigKCQl0b3RhbERpc3RyaWJ1dGVBbW91bnRYMTI4LAoJCXUyNTYuTmV3VWludEZyb21JbnQ2NCh0aW1lRHVyYXRpb24pLAoJKQoKCXIuU2V0RGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgoYW1vdW50UGVyU2Vjb25kWDEyOCkKCXIuU2V0RGlzdHJpYnV0ZVN0YXJ0VGltZShkaXN0cmlidXRlU3RhcnRUaW1lKQoJci5TZXREaXN0cmlidXRlRW5kVGltZShkaXN0cmlidXRlRW5kVGltZSkKfQoKLy8gY29sbGVjdFJld2FyZCBwcm9jZXNzZXMgdGhlIHJld2FyZCBjb2xsZWN0aW9uIGZvciBhIHNwZWNpZmljIGRlcG9zaXQuCi8vIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IHRoZSByZXdhcmQgY29sbGVjdGlvbiBpcyB2YWxpZCBhbmQgdXBkYXRlcwovLyB0aGUgY2xhaW1lZCBhbW91bnQgYWNjb3JkaW5nbHkuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vIC0gZGVwb3NpdElkIChzdHJpbmcpOiBUaGUgSUQgb2YgdGhlIGRlcG9zaXQKLy8gLSBjdXJyZW50VGltZSAoaW50NjQpOiBDdXJyZW50IHRpbWVzdGFtcAovLwovLyBSZXR1cm5zOgovLyAtIGludDY0OiBUaGUgYW1vdW50IG9mIHJld2FyZCBjb2xsZWN0ZWQKLy8gLSBlcnJvcjogSWYgdGhlIGNvbGxlY3Rpb24gZmFpbHMKZnVuYyBjb2xsZWN0UmV3YXJkKHIgKmxhdW5jaHBhZC5SZXdhcmRNYW5hZ2VyLCBkZXBvc2l0SWQgc3RyaW5nLCBjdXJyZW50VGltZSBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJaWYgY3VycmVudFRpbWUgPCByLkFjY3VtdWxhdGVkVGltZSgpIHsKCQlyZXR1cm4gMCwgbWFrZUVycm9yV2l0aERldGFpbHMoCgkJCWVyckludmFsaWRSZXdhcmRTdGF0ZSwKCQkJdWZtdC5TcHJpbnRmKCJjdXJyZW50VGltZSAlZCBpcyBsZXNzIHRoYW4gQWNjdW11bGF0ZWRUaW1lICVkIiwgY3VycmVudFRpbWUsIHIuQWNjdW11bGF0ZWRUaW1lKCkpLAoJCSkKCX0KCglyZXdhcmRTdGF0ZSwgZXJyIDo9IGdldERlcG9zaXRSZXdhcmRTdGF0ZShyLCBkZXBvc2l0SWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgoJaWYgIWlzUmV3YXJkU3RhdGVDbGFpbWFibGUocmV3YXJkU3RhdGUsIGN1cnJlbnRUaW1lKSB7CgkJcmV0dXJuIDAsIG1ha2VFcnJvcldpdGhEZXRhaWxzKAoJCQllcnJJbnZhbGlkUmV3YXJkU3RhdGUsCgkJCXVmbXQuU3ByaW50ZigiY3VycmVudFRpbWUgJWQgaXMgbGVzcyB0aGFuIGNsYWltYWJsZVRpbWUgJWQiLCBjdXJyZW50VGltZSwgcmV3YXJkU3RhdGUuQ2xhaW1hYmxlVGltZSgpKSwKCQkpCgl9CgoJaWYgY3VycmVudFRpbWUgPCByZXdhcmRTdGF0ZS5EaXN0cmlidXRlU3RhcnRUaW1lKCkgewoJCXJldHVybiAwLCBtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZFJld2FyZFN0YXRlLAoJCQl1Zm10LlNwcmludGYoImN1cnJlbnRUaW1lICVkIGlzIGxlc3MgdGhhbiBEaXN0cmlidXRlU3RhcnRUaW1lICVkIiwgY3VycmVudFRpbWUsIHJld2FyZFN0YXRlLkRpc3RyaWJ1dGVTdGFydFRpbWUoKSksCgkJKQoJfQoKCWNsYWltYWJsZVJld2FyZCA6PSBjYWxjdWxhdGVDbGFpbWFibGVSZXdhcmQocmV3YXJkU3RhdGUsIHIuQWNjdW11bGF0ZWRSZXdhcmRQZXJEZXBvc2l0WDEyOCgpKQoJaWYgY2xhaW1hYmxlUmV3YXJkID09IDAgewoJCXJldHVybiAwLCBuaWwKCX0KCglyZXdhcmRTdGF0ZS5TZXRDbGFpbWVkQW1vdW50KHJld2FyZFN0YXRlLkNsYWltZWRBbW91bnQoKSArIGNsYWltYWJsZVJld2FyZCkKCXJld2FyZHMgOj0gci5SZXdhcmRzKCkKCXJld2FyZHMuU2V0KGRlcG9zaXRJZCwgcmV3YXJkU3RhdGUpCglyLlNldFJld2FyZHMocmV3YXJkcykKCXIuU2V0VG90YWxDbGFpbWVkQW1vdW50KHIuVG90YWxDbGFpbWVkQW1vdW50KCkgKyBjbGFpbWFibGVSZXdhcmQpCglyLlNldEFjdGl2ZUNsYWltZWRBbW91bnQoZ25zbWF0aC5TYWZlQWRkSW50NjQoci5BY3RpdmVDbGFpbWVkQW1vdW50KCksIGNsYWltYWJsZVJld2FyZCkpCgoJcmV0dXJuIGNsYWltYWJsZVJld2FyZCwgbmlsCn0KCi8vIG5ld1Jld2FyZE1hbmFnZXIgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcgUmV3YXJkTWFuYWdlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMuCmZ1bmMgbmV3UmV3YXJkTWFuYWdlcigKCXRvdGFsRGlzdHJpYnV0ZUFtb3VudCBpbnQ2NCwKCWRpc3RyaWJ1dGVTdGFydFRpbWUgaW50NjQsCglkaXN0cmlidXRlRW5kVGltZSBpbnQ2NCwKCXJld2FyZENvbGxlY3RhYmxlRHVyYXRpb24gaW50NjQsCikgKmxhdW5jaHBhZC5SZXdhcmRNYW5hZ2VyIHsKCW1hbmFnZXIgOj0gbGF1bmNocGFkLk5ld1Jld2FyZE1hbmFnZXIodG90YWxEaXN0cmlidXRlQW1vdW50LCBkaXN0cmlidXRlU3RhcnRUaW1lLCBkaXN0cmlidXRlRW5kVGltZSwgcmV3YXJkQ29sbGVjdGFibGVEdXJhdGlvbikKCgl1cGRhdGVEaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOChtYW5hZ2VyLCB0b3RhbERpc3RyaWJ1dGVBbW91bnQsIGRpc3RyaWJ1dGVTdGFydFRpbWUsIGRpc3RyaWJ1dGVFbmRUaW1lKQoKCXJldHVybiBtYW5hZ2VyCn0KCi8vIGNhbGN1bGF0ZU1heGltdW1DbGFpbWFibGVSZXdhcmRzRm9yQWN0aXZlRGVwb3NpdHMgcmVzZXJ2ZXMgZXZlcnkgYWN0aXZlCi8vIGNsYWltIHdpdGhvdXQgdHJhdmVyc2luZyB0aGUgYXR0YWNrZXItY29udHJvbGxlZCByZXdhcmQgdHJlZS4gQWdncmVnYXRpbmcKLy8gYmVmb3JlIFExMjggdHJ1bmNhdGlvbiByZXRhaW5zIHJvdW5kaW5nIGR1c3QgYnV0IGNhbm5vdCB1bmRlci1yZXNlcnZlIGNsYWltcy4KZnVuYyBjYWxjdWxhdGVNYXhpbXVtQ2xhaW1hYmxlUmV3YXJkc0ZvckFjdGl2ZURlcG9zaXRzKHIgKmxhdW5jaHBhZC5SZXdhcmRNYW5hZ2VyKSBpbnQ2NCB7CglyZXdhcmQsIG92ZXJmbG93IDo9IHUyNTYuWmVybygpLk11bE92ZXJmbG93KAoJCXIuQWNjdW11bGF0ZWRSZXdhcmRQZXJEZXBvc2l0WDEyOCgpLAoJCXUyNTYuTmV3VWludEZyb21JbnQ2NChyLkFjdGl2ZURlcG9zaXRBbW91bnQoKSksCgkpCglpZiBvdmVyZmxvdyB7CgkJcGFuaWMoZXJyb3JzLk5ldyhlcnJPdmVyZmxvdykpCgl9CgoJcmV3YXJkID0gcmV3YXJkLlN1YihyZXdhcmQsIHIuQWN0aXZlUHJpY2VEZWJ0WDEyOCgpKS5Sc2gocmV3YXJkLCAxMjgpCgl0b3RhbFJld2FyZCA6PSBnbnNtYXRoLlNhZmVDb252ZXJ0VG9JbnQ2NChyZXdhcmQpCglpZiB0b3RhbFJld2FyZCA8PSByLkFjdGl2ZUNsYWltZWRBbW91bnQoKSB7CgkJcmV0dXJuIDAKCX0KCglyZXR1cm4gZ25zbWF0aC5TYWZlU3ViSW50NjQodG90YWxSZXdhcmQsIHIuQWN0aXZlQ2xhaW1lZEFtb3VudCgpKQp9ChqaDAoQcmV3YXJkX3N0YXRlLmdubxKFDHBhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJImVycm9ycyIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZCIKCglnbnNtYXRoICJnbm8ubGFuZC9wL2dub3N3YXAvZ25zbWF0aC92MSIKCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgopCgovLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBSZXdhcmRTdGF0ZQoKZnVuYyBpc1Jld2FyZFN0YXRlQ2xhaW1hYmxlKHIgKmxhdW5jaHBhZC5SZXdhcmRTdGF0ZSwgY3VycmVudFRpbWUgaW50NjQpIGJvb2wgewoJcmV0dXJuIGN1cnJlbnRUaW1lID49IHIuQ2xhaW1hYmxlVGltZSgpCn0KCi8vIGNhbGN1bGF0ZVJld2FyZCBjYWxjdWxhdGVzIHRoZSB0b3RhbCByZXdhcmQgYW1vdW50IGJhc2VkIG9uCi8vIHRoZSBhY2N1bXVsYXRlZCByZXdhcmQgcGVyIGRlcG9zaXQuCi8vIFJldHVybnMgdGhlIHRvdGFsIHJld2FyZCBhbW91bnQuCmZ1bmMgY2FsY3VsYXRlUmV3YXJkKHIgKmxhdW5jaHBhZC5SZXdhcmRTdGF0ZSwgYWNjdW1SZXdhcmRQZXJEZXBvc2l0WDEyOCAqdTI1Ni5VaW50KSBpbnQ2NCB7CglpZiBhY2N1bVJld2FyZFBlckRlcG9zaXRYMTI4ID09IG5pbCB8fCByLlByaWNlRGVidFgxMjgoKSA9PSBuaWwgewoJCXJldHVybiAwCgl9CgoJYWN0dWFsUmV3YXJkUGVyRGVwb3NpdFgxMjggOj0gdTI1Ni5aZXJvKCkuU3ViKGFjY3VtUmV3YXJkUGVyRGVwb3NpdFgxMjgsIHIuUHJpY2VEZWJ0WDEyOCgpKQoJaWYgYWN0dWFsUmV3YXJkUGVyRGVwb3NpdFgxMjguSXNaZXJvKCkgewoJCXJldHVybiAwCgl9CgoJcmV3YXJkLCBvdmVyZmxvdyA6PSB1MjU2Llplcm8oKS5NdWxPdmVyZmxvdyhhY3R1YWxSZXdhcmRQZXJEZXBvc2l0WDEyOCwgdTI1Ni5OZXdVaW50RnJvbUludDY0KHIuRGVwb3NpdEFtb3VudCgpKSkKCWlmIG92ZXJmbG93IHsKCQlwYW5pYyhlcnJvcnMuTmV3KGVyck92ZXJmbG93KSkKCX0KCXJld2FyZCA9IHJld2FyZC5Sc2gocmV3YXJkLCAxMjgpCglyZXR1cm4gZ25zbWF0aC5TYWZlQ29udmVydFRvSW50NjQocmV3YXJkKQp9CgovLyBjYWxjdWxhdGVDbGFpbWFibGVSZXdhcmQgY2FsY3VsYXRlcyB0aGUgYW1vdW50IG9mIHJld2FyZCB0aGF0IGNhbiBiZSBjbGFpbWVkCi8vIGJhc2VkIG9uIHRoZSBjdXJyZW50IGFjY3VtdWxhdGVkIHJld2FyZCBwZXIgZGVwb3NpdC4KLy8gUmV0dXJucyB0aGUgYW1vdW50IG9mIHJld2FyZCB0aGF0IGNhbiBiZSBjbGFpbWVkLgpmdW5jIGNhbGN1bGF0ZUNsYWltYWJsZVJld2FyZChyICpsYXVuY2hwYWQuUmV3YXJkU3RhdGUsIGFjY3VtUmV3YXJkUGVyRGVwb3NpdFgxMjggKnUyNTYuVWludCkgaW50NjQgewoJaWYgYWNjdW1SZXdhcmRQZXJEZXBvc2l0WDEyOCA9PSBuaWwgewoJCXJldHVybiAwCgl9CgoJcmV3YXJkIDo9IGNhbGN1bGF0ZVJld2FyZChyLCBhY2N1bVJld2FyZFBlckRlcG9zaXRYMTI4KQoJY2xhaW1lZEFtb3VudCA6PSByLkNsYWltZWRBbW91bnQoKQoKCWlmIHJld2FyZCA8PSBjbGFpbWVkQW1vdW50IHsKCQlyZXR1cm4gMAoJfQoKCXJldHVybiByZXdhcmQgLSBjbGFpbWVkQW1vdW50Cn0KGu8VCglzdGF0ZS5nbm8S4RVwYWNrYWdlIGxhdW5jaHBhZAoKaW1wb3J0ICgKCSJlcnJvcnMiCgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoJImduby5sYW5kL3IvZ25vc3dhcC9sYXVuY2hwYWQiCikKCi8vIEhlbHBlciBmdW5jdGlvbnMgdGhhdCBhY2Nlc3Mgc3RhdGUgdGhyb3VnaCBsYXVuY2hwYWRTdGF0ZQoKZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBnZXRQcm9qZWN0KHByb2plY3RJRCBzdHJpbmcpICgqbGF1bmNocGFkLlByb2plY3QsIGVycm9yKSB7Cglwcm9qZWN0cyA6PSBscC5zdG9yZS5HZXRQcm9qZWN0cygpCglwcm9qZWN0IDo9IHByb2plY3RzLkdldChwcm9qZWN0SUQpCglpZiBwcm9qZWN0ID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgbWFrZUVycm9yV2l0aERldGFpbHMoZXJyRGF0YU5vdEZvdW5kLCB1Zm10LlNwcmludGYoInByb2plY3QoJXMpIG5vdCBmb3VuZCIsIHByb2plY3RJRCkpCgl9CgoJcCwgb2sgOj0gcHJvamVjdC4oKmxhdW5jaHBhZC5Qcm9qZWN0KQoJaWYgIW9rIHsKCQlyZXR1cm4gbmlsLCBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJEYXRhTm90Rm91bmQsIHVmbXQuU3ByaW50ZigicHJvamVjdCglcykgbm90IGZvdW5kIiwgcHJvamVjdElEKSkKCX0KCglyZXR1cm4gcCwgbmlsCn0KCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgZ2V0UHJvamVjdFRpZXIocHJvamVjdElEIHN0cmluZywgdGllckR1cmF0aW9uIGludDY0KSAoKmxhdW5jaHBhZC5Qcm9qZWN0VGllciwgZXJyb3IpIHsKCXByb2plY3QsIGVyciA6PSBscC5nZXRQcm9qZWN0KHByb2plY3RJRCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoKCXRpZXIsIGVyciA6PSBwcm9qZWN0LkdldFRpZXIodGllckR1cmF0aW9uKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgbWFrZUVycm9yV2l0aERldGFpbHMoZXJyRGF0YU5vdEZvdW5kLCBlcnIuRXJyb3IoKSkKCX0KCglyZXR1cm4gdGllciwgbmlsCn0KCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgZ2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VyKHByb2plY3RUaWVySUQgc3RyaW5nKSAoKmxhdW5jaHBhZC5SZXdhcmRNYW5hZ2VyLCBlcnJvcikgewoJbWFuYWdlcnMgOj0gbHAuc3RvcmUuR2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VycygpCglyZXdhcmRNYW5hZ2VyIDo9IG1hbmFnZXJzLkdldChwcm9qZWN0VGllcklEKQoJaWYgcmV3YXJkTWFuYWdlciA9PSBuaWwgewoJCXJldHVybiBuaWwsIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckRhdGFOb3RGb3VuZCwgdWZtdC5TcHJpbnRmKCJyZXdhcmQgbWFuYWdlciglcykgbm90IGZvdW5kIiwgcHJvamVjdFRpZXJJRCkpCgl9CgoJbWFuYWdlciwgb2sgOj0gcmV3YXJkTWFuYWdlci4oKmxhdW5jaHBhZC5SZXdhcmRNYW5hZ2VyKQoJaWYgIW9rIHsKCQlyZXR1cm4gbmlsLCBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJEYXRhTm90Rm91bmQsIHVmbXQuU3ByaW50ZigicmV3YXJkIG1hbmFnZXIoJXMpIG5vdCBmb3VuZCIsIHByb2plY3RUaWVySUQpKQoJfQoKCXJldHVybiBtYW5hZ2VyLCBuaWwKfQoKZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBnZXREZXBvc2l0VmFsdWUoZGVwb3NpdElkIHN0cmluZykgKGxhdW5jaHBhZC5EZXBvc2l0LCBlcnJvcikgewoJZGVwb3NpdHMgOj0gbHAuc3RvcmUuR2V0RGVwb3NpdHMoKQoJdmFsdWUgOj0gZGVwb3NpdHMuR2V0KGRlcG9zaXRJZCkKCWlmIHZhbHVlID09IG5pbCB7CgkJcmV0dXJuIGxhdW5jaHBhZC5EZWZhdWx0RGVwb3NpdCgpLCBlcnJvcnMuTmV3KCJkZXBvc2l0IG5vdCBmb3VuZCIpCgl9CgoJZGVwb3NpdCwgb2sgOj0gdmFsdWUuKGxhdW5jaHBhZC5EZXBvc2l0KQoJaWYgIW9rIHsKCQlyZXR1cm4gbGF1bmNocGFkLkRlZmF1bHREZXBvc2l0KCksIGVycm9ycy5OZXcoImludmFsaWQgZGVwb3NpdCB0eXBlIikKCX0KCXJldHVybiBkZXBvc2l0LCBuaWwKfQoKZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBnZXREZXBvc2l0KGRlcG9zaXRJRCBzdHJpbmcpIChsYXVuY2hwYWQuRGVwb3NpdCwgZXJyb3IpIHsKCWRlcG9zaXRzIDo9IGxwLnN0b3JlLkdldERlcG9zaXRzKCkKCWRlcG9zaXRJIDo9IGRlcG9zaXRzLkdldChkZXBvc2l0SUQpCglpZiBkZXBvc2l0SSA9PSBuaWwgewoJCXJldHVybiBsYXVuY2hwYWQuRGVmYXVsdERlcG9zaXQoKSwgbWFrZUVycm9yV2l0aERldGFpbHMoZXJyTm90RXhpc3REZXBvc2l0LCB1Zm10LlNwcmludGYoIiglcykiLCBkZXBvc2l0SUQpKQoJfQoKCWRlcG9zaXQsIG9rIDo9IGRlcG9zaXRJLihsYXVuY2hwYWQuRGVwb3NpdCkKCWlmICFvayB7CgkJcmV0dXJuIGxhdW5jaHBhZC5EZWZhdWx0RGVwb3NpdCgpLCBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJEYXRhTm90Rm91bmQsIHVmbXQuU3ByaW50ZigiZGVwb3NpdCglcykgbm90IGZvdW5kIiwgZGVwb3NpdElEKSkKCX0KCXJldHVybiBkZXBvc2l0LCBuaWwKfQoKZnVuYyAobHAgKmxhdW5jaHBhZFYxKSBtdXN0R2V0RGVwb3NpdChkZXBvc2l0SUQgc3RyaW5nKSBsYXVuY2hwYWQuRGVwb3NpdCB7CglkZXBvc2l0LCBlcnIgOj0gbHAuZ2V0RGVwb3NpdChkZXBvc2l0SUQpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJcmV0dXJuIGRlcG9zaXQKfQoKLy8gbmV4dERlcG9zaXRJRCBpbmNyZW1lbnRzIGFuZCByZXR1cm5zIHRoZSBuZXh0IHVuaXF1ZSBkZXBvc2l0IElELgovLyBUaGlzIGlzIHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgZGVwb3NpdHMuCmZ1bmMgKGxwICpsYXVuY2hwYWRWMSkgbmV4dERlcG9zaXRJRCgpIHN0cmluZyB7CglyZXR1cm4gbHAuc3RvcmUuTmV4dERlcG9zaXRJRCgpCn0KGuQMCgl1dGlscy5nbm8S1gxwYWNrYWdlIGxhdW5jaHBhZAoKaW1wb3J0ICgKCSJtYXRoIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCmNvbnN0ICgKCU1BWF9JTlQ2NCA9IG1hdGguTWF4SW50NjQKCU1JTl9JTlQ2NCA9IG1hdGguTWluSW50NjQKKQoKZnVuYyBidWlsZENvbmRpdGlvbkV2ZW50QXR0cnMoY29uZGl0aW9uVG9rZW5zIHN0cmluZywgY29uZGl0aW9uQW1vdW50cyBzdHJpbmcpIFtdc3RyaW5nIHsKCWlmIGNvbmRpdGlvblRva2VucyA9PSAiIiB7CgkJcmV0dXJuIFtdc3RyaW5ne30KCX0KCgl0b2tlblBhdGhzIDo9IHN0cmluZ3MuU3BsaXQoY29uZGl0aW9uVG9rZW5zLCBzdHJpbmdTcGxpdHRlclBhZCkKCWFtb3VudHMgOj0gc3RyaW5ncy5TcGxpdChjb25kaXRpb25BbW91bnRzLCBzdHJpbmdTcGxpdHRlclBhZCkKCWV2ZW50QXR0cnMgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKHRva2VuUGF0aHMpKjIpCgoJZm9yIGluZGV4LCB0b2tlblBhdGggOj0gcmFuZ2UgdG9rZW5QYXRocyB7CgkJZXZlbnRBdHRycyA9IGFwcGVuZChldmVudEF0dHJzLCB1Zm10LlNwcmludGYoImNvbmRpdGlvbnNUb2tlbnNbJWRdIiwgaW5kZXgpKQoJCWV2ZW50QXR0cnMgPSBhcHBlbmQoZXZlbnRBdHRycywgdG9rZW5QYXRoK3N0cmluZ1NwbGl0dGVyUGFkK2Ftb3VudHNbaW5kZXhdKQoJfQoKCXJldHVybiBldmVudEF0dHJzCn0KCi8vIHBhcnNlUHJvamVjdFRpZXJJRCBwYXJzZXMgYSBwcm9qZWN0IHRpZXIgSUQgaW50byBpdHMgcHJvamVjdCBJRCBhbmQgZHVyYXRpb24uCi8vIFJldHVybnMgdGhlIHByb2plY3QgSUQge3Rva2VuUGF0aH06e2NyZWF0ZWRIZWlnaHR9IGFuZCB0aGUgZHVyYXRpb24gb2YgdGhlIHByb2plY3QgdGllciAoMzAsIDkwLCAxODApLgpmdW5jIHBhcnNlUHJvamVjdFRpZXJJRChwcm9qZWN0VGllcklEIHN0cmluZykgKHN0cmluZywgaW50NjQpIHsKCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQocHJvamVjdFRpZXJJRCwgIjoiKQoJaWYgbGVuKHBhcnRzKSAhPSAzIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZERhdGEsCgkJCXVmbXQuU3ByaW50ZigiKCVzKSIsIHByb2plY3RUaWVySUQpLAoJCSkpCgl9CgoJcHJvamVjdElEIDo9IHBhcnRzWzBdICsgIjoiICsgcGFydHNbMV0KCgl0aWVyRHVyYXRpb24sIGVyciA6PSBzdHJjb252LlBhcnNlSW50KHBhcnRzWzJdLCAxMCwgNjQpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZERhdGEsCgkJCXVmbXQuU3ByaW50ZigiKCVzKSIsIHByb2plY3RUaWVySUQpLAoJCSkpCgl9CgoJLy8gVmFsaWRhdGUgdGllciBkdXJhdGlvbgoJaWYgdGllckR1cmF0aW9uICE9IHByb2plY3RUaWVyMzAgJiYgdGllckR1cmF0aW9uICE9IHByb2plY3RUaWVyOTAgJiYgdGllckR1cmF0aW9uICE9IHByb2plY3RUaWVyMTgwIHsKCQlwYW5pYyhtYWtlRXJyb3JXaXRoRGV0YWlscygKCQkJZXJySW52YWxpZFRpZXIsCgkJCXVmbXQuU3ByaW50ZigicG9vbCB0eXBlKCVkKSBpcyBub3QgYXZhaWxhYmxlIiwgdGllckR1cmF0aW9uKSwKCQkpKQoJfQoKCXJldHVybiBwcm9qZWN0SUQsIHRpZXJEdXJhdGlvbgp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBITCIbnmZYBEgsxNTc0OTh1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMEnNUEw+LSOqLPC53myjgfoun1lzihgX/ZUaUiNcK64RJAXN5smiJCeyYxUf4rXrln4MZdqTx5Ax4xAxi1hcuTmldqMWnAKYedHwH8Qrblp16ZcGPruCA6dm3n3WPfqmfQKBooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==

Raw transaction data

Raw JSON data