{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "YMI80thj4OSVU/k2xu/MUrYqpLUPRStf7qR2hSj9DK0=",
    "height": "639086",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": [
          {
            "@type": "/tm.StorageDepositEvent",
            "bytes_delta": "52706",
            "fee_delta": "5270600ugnot",
            "pkg_path": "gno.land/r/g1ut6uspuh73e02yauxpmyt8g3wwddaq8utagvm3/subscriptions"
          }
        ],
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "74286823",
      "GasUsed": "49524549"
    },
    "tx": "CrvkAQoML3ZtLm1fYWRkcGtnEqnkAQooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLs4wEKDXN1YnNjcmlwdGlvbnMSQWduby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9zdWJzY3JpcHRpb25zGmgKC2dub21vZC50b21sElltb2R1bGUgPSAiZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3N1YnNjcmlwdGlvbnMiCmdubyA9ICIwLjkiChqs4gEKEXN1YnNjcmlwdGlvbnMuZ25vEpXiAS8vIFBhY2thZ2Ugc3Vic2NyaXB0aW9ucyBpcyBhIG11bHRpLXByb3ZpZGVyIHN1YnNjcmlwdGlvbiBodWI6IHByb3ZpZGVycwovLyBwdWJsaXNoIHBsYW5zIHByaWNlZCBwZXIgYmlsbGluZyBwZXJpb2Q7IHN1YnNjcmliZXJzIHBheSBwZXIgcGVyaW9kLAovLyB3aXRoIGRldGVybWluaXN0aWMgcmVuZXdhbCwgZ3JhY2UsIGV4cGlyYXRpb24gYW5kIGNhbmNlbGxhdGlvbiBydWxlczsKLy8gb3RoZXIgcmVhbG1zIGFuZCBvZmYtY2hhaW4gc2VydmljZXMgZ2F0ZSBhY2Nlc3Mgb24gRW50aXRsZWQgLwovLyBFbnRpdGxlZEZvciwgd2hpY2ggaXMgdGhlIGludGVncmF0aW9uIHN1cmZhY2UgdGhpcyByZWFsbSBleGlzdHMgdG8KLy8gcHJvdmlkZS4KLy8KLy8gVEhFIEJJTExJTkcgTU9ERUwsIENPTVBMRVRFTFk6Ci8vCi8vCVN1YnNjcmliZSAocGF5YWJsZSwgZXhhY3QgcHJpY2UpICA6IGNyZWF0ZXMgdGhlIHN1YnNjcmlwdGlvbiwgcGF5cwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgMS4gcGFpZFRocm91Z2ggPSBoZWlnaHQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwZXJpb2RCbG9ja3MuCi8vCVJlbmV3IChwYXlhYmxlLCBleGFjdCBwcmljZSkgICAgICA6IGV4dGVuZHMgcGFpZFRocm91Z2ggYnkgZXhhY3RseQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgcGVyaW9kQmxvY2tzLCBGUk9NCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaWRUaHJvdWdoIOKAlCBuZXZlciBmcm9tIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGhlaWdodCDigJQgc28gcGVyaW9kCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJpZXMgYXJlIGZpeGVkIGF0Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnNjcmliZSB0aW1lIGFuZCBuZXZlciBkcmlmdC4KLy8JRW50aXRsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIDogaGVpZ2h0IDwgcGFpZFRocm91Z2guIE5vdGhpbmcKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZS4gU3RhdHVzIGRvZXMgbm90IGVudGVyCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gaXQ6IGEgY2FuY2VsbGVkCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiBzdGF5cyBlbnRpdGxlZCB0bwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0IGl0IGFscmVhZHkgcGFpZCBmb3IuCi8vCVJlbmV3YWwgd2luZG93ICAgICAgICAgICAgICAgICAgICA6IGEgcmVuZXdhbCBpcyBhY2NlcHRlZCBpZmYgQk9USAovLwkgICAgICAgICAgICAgICAgICAgIHBhaWRUaHJvdWdoIC0gaGVpZ2h0IDw9IHBlcmlvZEJsb2NrcyAgIChlYXJseSBib3VuZCkKLy8JICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPCBwYWlkVGhyb3VnaCArIHBlcmlvZEJsb2NrcyAgICAobGF0ZSBib3VuZCkKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVhcmx5IGJvdW5kIGNhcHMgcHJlcGF5bWVudAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBvbmUgZnVsbCB1bnN0YXJ0ZWQgcGVyaW9kIOKAlAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHNlY29uZCBSZW5ldyBzdHJhaWdodCBhZnRlciBhCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGlzIHJlZnVzZWQsIHdoaWNoIGlzIHdoYXQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXMgYW4gYWNjaWRlbnRhbCBkdXBsaWNhdGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bWVudCBzdHJ1Y3R1cmFsbHkgaW1wb3NzaWJsZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRoZXIgdGhhbiBtZXJlbHkgdW5saWtlbHkuCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBsYXRlIGJvdW5kIGlzIHRoZSBncmFjZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3c6IHJlbmV3aW5nIGFmdGVyIGxhcHNlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZHMgZnJvbSBwYWlkVGhyb3VnaCwgc28gaXQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjay1wYXlzIHRoZSBsYXBzZWQgc3BhbiB0bwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwIHRoZSBvcmlnaW5hbCBzY2hlZHVsZSBhbmQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV5cyBwYWlkVGhyb3VnaCArIHBlcmlvZEJsb2NrcwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGhlaWdodCBmdXJ0aGVyIGJsb2NrcyDigJQgYWx3YXlzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IGxlYXN0IG9uZSwgYmVjYXVzZSB0aGUgYm91bmQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZXhjbHVzaXZlIChhdWRpdCBmaW5kaW5nIFkyKS4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBsYXBzZWQgc3Vic2NyaWJlciB3aG8gcHJlZmVycwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGZyZXNoIGZ1bGwgcGVyaW9kIG1heSBDYW5jZWwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFN1YnNjcmliZSBhZ2FpbiBhdCB0aGUgc2FtZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCBwcmljZTsgU3Vic2NyaWJlJ3MgcmVmdXNhbAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIHN0YXRlcyBib3RoIG9wdGlvbnMuCi8vCUV4cGlyZSAocGVybWlzc2lvbmxlc3MgdmFsdmUpICAgICA6IG9uY2UgaGVpZ2h0ID49IHBhaWRUaHJvdWdoICsKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kQmxvY2tzLCBhbnlvbmUgbWF5IG1hcmsKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN1YnNjcmlwdGlvbiBFeHBpcmVkLiBObwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5kcyBtb3ZlIOKAlCBldmVyeSBwYXltZW50Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRsZWQgd2hlbiBpdCB3YXMgbWFkZS4gVGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHZlIGV4aXN0cyBzbyB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbnxzdWJzY3JpYmVyIHNsb3QgZnJlZXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBkZXBlbmRpbmcgb24gZWl0aGVyCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnR5LCBhbmQgU3Vic2NyaWJlIGl0c2VsZgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZXMgYW4gZXhwaXJlZCBpbmN1bWJlbnQsCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGEgZnJlc2ggc3RhcnQgbmV2ZXIgZGVwZW5kcwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBob3VzZWtlZXBpbmcgaGF2aW5nIHJ1bi4gVGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmV3YWJsZSBhbmQgZXhwaXJhYmxlIGhlaWdodAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRzIHBhcnRpdGlvbiBleGFjdGx5OiBubwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgaXMgaW4gYm90aCBvciBuZWl0aGVyLgovLwlDYW5jZWwgKHN1YnNjcmliZXIgb25seSkgICAgICAgICAgOiBBY3RpdmUgLT4gQ2FuY2VsbGVkLiBUZXJtaW5hbC4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gcmVmdW5kIOKAlCBwYXltZW50cyBzZXR0bGUgdG8KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVyIGF0IHBheW1lbnQgdGltZSwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHdoYXQgd2FzIGJvdWdodCAoZW50aXRsZW1lbnQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCBwYWlkVGhyb3VnaCkgc3RheXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91Z2h0LiBXaGF0IGNhbmNlbGxhdGlvbiBlbmRzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSBPQkxJR0FUSU9OOiBhIENhbmNlbGxlZAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gY2FuIG5ldmVyIGJlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmV3ZWQsIGJ5IHRoZSBzdWJzY3JpYmVyIG9yCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueW9uZSBlbHNlLgovLwlSZXRpcmVQbGFuIChwcm92aWRlciBvbmx5KSAgICAgICAgOiBubyBuZXcgU3Vic2NyaWJlcywgbm8gcmVuZXdhbHMuCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aXN0aW5nIGVudGl0bGVtZW50cyBydW4gdG8KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpZFRocm91Z2ggdW50b3VjaGVkLiBSZWZ1c2luZwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5ld2FscyBvbiBhIHJldGlyZWQgcGxhbiBpcwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyIHByb3RlY3Rpb246IG5vYm9keQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4ga2VlcCBwYXlpbmcgZm9yIGEgc2VydmljZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBwcm92aWRlciBhbm5vdW5jZWQgaXRzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC4KLy8KLy8gVGhlIG9ibGlnYXRpb24gaXMgdGhlcmVmb3JlIGV4cGxpY2l0IG9uIGNoYWluIGF0IGV2ZXJ5IG1vbWVudDogYQovLyBzdWJzY3JpcHRpb24gb3dlcyBub3RoaW5nICh0aGVyZSBpcyBubyBwdWxsIHBheW1lbnQgYW5kIG5vIGRlYnQg4oCUIGEKLy8gbGFwc2Ugc2ltcGx5IGVuZHMgZW50aXRsZW1lbnQpLCBhbmQgdGhlIHJlYWxtIG93ZXMgdGhlIHN1YnNjcmliZXIKLy8gZXhhY3RseSBgcGFpZFRocm91Z2ggLSBoZWlnaHRgIGJsb2NrcyBvZiBlbnRpdGxlbWVudCwgcXVlcnlhYmxlIGJ5Ci8vIGFueW9uZSB2aWEgUGFpZFRocm91Z2ggLyBFbnRpdGxlZCAvIEVudGl0bGVkRm9yLgovLwovLyBXSE8gUEFZUyBXSE9NLiBQYXltZW50cyBzZXR0bGUgaW1tZWRpYXRlbHk6IHByaWNlIC0gZmVlIGlzIGNyZWRpdGVkCi8vIHRvIHRoZSBwcm92aWRlcidzIGNsYWltYWJsZSBiYWxhbmNlLCBmZWUgdG8gdGhlIHByb3RvY29sIHBvdCwgYm90aAovLyBpbnNpZGUgdGhlIHNhbWUgZmVlbGVkZ2VyIHRoZSBzaWJsaW5nIHJlYWxtcyB1c2UuIFRoZXJlIGlzIG5vIGVzY3JvdzoKLy8gSCA9PSBVICsgRiBhdCBhbGwgdGltZXMgKHBsdXMgb3V0LW9mLWJhbmQgc3VycGx1cywgcmVjb3ZlcmFibGUgYnkKLy8gU3dlZXBEZW5vbSBhYm92ZSB0aGUgTGlhYmlsaXRpZXMgcmVzZXJ2ZSkuIFRoZSByZW5ld2FsIGNhbGxlciBtdXN0IGJlCi8vIHRoZSBzdWJzY3JpYmVyIOKAlCBhIHRoaXJkIHBhcnR5IGNhbm5vdCBleHRlbmQgc29tZW9uZSBlbHNlJ3MKLy8gc3Vic2NyaXB0aW9uLCB3aGljaCBjbG9zZXMgYm90aCBhIGNvbnNlbnQgcHJvYmxlbSAoYW4gdW53YW50ZWQgZ2lmdAovLyByZS1hcm1zIGEgbGFwc2luZyBvYmxpZ2F0aW9uKSBhbmQgYSBncmllZmluZyBlZGdlIChzcGVuZGluZyBwZW5uaWVzCi8vIHRvIGtlZXAgYSB2aWN0aW0ncyBzbG90IG9jY3VwaWVkKS4KLy8KLy8gRkVFUyBmb2xsb3cgdGhlIGhvdXNlIHBhdHRlcm4gZXhhY3RseTogYSBjb21waWxlLXRpbWUgTWF4RmVlQnBzCi8vIGNlaWxpbmcsIHRoZSBjdXJyZW50IGZlZSBzbmFwc2hvdHRlZCBpbnRvIHRoZSBQTEFOIGF0IENyZWF0ZVBsYW4KLy8gKHByb3ZpZGVyIGNvbnNlbnRzIHZpYSBpdHMgb3duIG1heEZlZUJwcyBhcmd1bWVudCksIGNvcGllZCBpbnRvIHRoZQovLyBzdWJzY3JpcHRpb24gYXQgU3Vic2NyaWJlLCBhbmQgY2hhcmdlZCBhdCBldmVyeSBwYXltZW50IGZyb20gdGhlCi8vIFBST1ZJREVSJ3Mgc2lkZS4gQSBsYXRlciBTZXRGZWVCcHMgdG91Y2hlcyBvbmx5IHBsYW5zIGNyZWF0ZWQKLy8gYWZ0ZXJ3YXJkczsgbm8gZXhpc3RpbmcgcGxhbiBvciBzdWJzY3JpcHRpb24gY2FuIGhhdmUgaXRzIGZlZSBtb3ZlZAovLyBieSBhbnlvbmUuCi8vCi8vIFJFQUxNLUNBTExFUiBDQVZFQVQsIGluaGVyaXRlZCBmcm9tIHRoZSBzaWJsaW5ncyB2ZXJiYXRpbTogY29pbmlvJ3MKLy8gcmVjZWlwdCBndWFyZCBhZG1pdHMgb25seSBFT0EgcGF5ZXJzLCBzbyBzdWJzY3JpYmVycyBhcmUgRU9BczsKLy8gYXNzZXJ0Tm9TZW5kIHJlYWRzIHRoZSBPUklHSU4gZW52ZWxvcGUsIHNvIGV2ZXJ5IG5vbi1wYXlhYmxlIGZ1bmN0aW9uCi8vIHJlZnVzZXMgYW55IHRyYW5zYWN0aW9uIHRoYXQgYXR0YWNoZWQgY29pbnMgYW55d2hlcmUuIFByb3ZpZGVycyBtYXkKLy8gYmUgRU9BcyBvciByZWFsbXMsIGJ1dCBhIHJlYWxtIHByb3ZpZGVyIG11c3QgZXhwb3NlIGl0cyBvd24gY3Jvc3NpbmcKLy8gcGF0aCB0byBDbGFpbSwgb3Igd2hhdCBpdCBlYXJucyBpcyBzdHJhbmRlZCAoc2VlIFJlZ2lzdGVyU2VydmljZSdzCi8vIGNhdmVhdCBpbiBzZXJ2aWNlX21hcmtldCDigJQgdGhlIHNhbWUgdGhyZWUgb2JsaWdhdGlvbnMgYXBwbHkpLgpwYWNrYWdlIHN1YnNjcmlwdGlvbnMKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvY29pbmlvIgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9mZWVsZWRnZXIiCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCgkiZ25vLmxhbmQvcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MCIKKQoKLy8gRGVub20gaXMgdGhlIG9ubHkgYXNzZXQgdGhpcyByZWFsbSBhY2NlcHRzLgpjb25zdCBEZW5vbSA9ICJ1Z25vdCIKCi8vIE1heEZlZUJwcyBpcyB0aGUgaGFyZCBwcm90b2NvbC1mZWUgY2FwOiAxMDAwIGJwcyA9IDEwJS4KY29uc3QgTWF4RmVlQnBzID0gaW50NjQoMTAwMCkKCi8vIFBsYW4gc3RhdHVzIHZhbHVlcy4KY29uc3QgKAoJUGxhbkFjdGl2ZSAgPSAiYWN0aXZlIgoJUGxhblJldGlyZWQgPSAicmV0aXJlZCIKKQoKLy8gU3Vic2NyaXB0aW9uIHN0YXR1cyB2YWx1ZXMuIENhbmNlbGxlZCBhbmQgRXhwaXJlZCBhcmUgdGVybWluYWwuCmNvbnN0ICgKCVN1YkFjdGl2ZSAgICA9ICJhY3RpdmUiCglTdWJDYW5jZWxsZWQgPSAiY2FuY2VsbGVkIgoJU3ViRXhwaXJlZCAgID0gImV4cGlyZWQiCikKCi8vIElucHV0IGJvdW5kcy4KY29uc3QgKAoJTWF4VGl0bGVMZW4gPSA4MAoJTWF4RGVzY0xlbiAgPSAyMDAwCglNaW5QcmljZSAgICA9IGludDY0KDEpCgoJLy8gTWluUGVyaW9kQmxvY2tzL01heFBlcmlvZEJsb2NrcyBib3VuZCBhIHBsYW4ncyBiaWxsaW5nIHBlcmlvZDoKCS8vIH40MCBzZWNvbmRzIHRvIH4xIHllYXIgYXQgcGVhcmwncyBvYnNlcnZlZCB+NC4ycyBibG9ja3MuIFRoZQoJLy8gZmxvb3Iga2VlcHMgYSBob3N0aWxlIHBsYW4gZnJvbSB0dXJuaW5nIHJlbmV3YWwgaW50byBhCgkvLyBwZXItYmxvY2sgdHJlYWRtaWxsOyB0aGUgY2VpbGluZyBrZWVwcyBwYWlkVGhyb3VnaCBhcml0aG1ldGljCgkvLyBmYXIgZnJvbSBvdmVyZmxvdyBldmVuIGF0IG1heGltdW0gcHJlcGF5bWVudC4KCU1pblBlcmlvZEJsb2NrcyA9IGludDY0KDEwKQoJTWF4UGVyaW9kQmxvY2tzID0gaW50NjQoNzUwMDAwMCkKCgkvLyBNYXhQbGFuc1BlclByb3ZpZGVyIGJvdW5kcyBjYXRhbG9nIG1vbm9wb2xpemF0aW9uIGJ5IGEgc2luZ2xlCgkvLyBhZGRyZXNzIOKAlCB0aGUgZmluZGluZyB0aGF0IHdhcyBSRUQgaW4gcGVybWlzc2lvbl9yZWdpc3RyeSBhbmQKCS8vIHNlcnZpY2VfcmVnaXN0cnksIGNhcnJpZWQgZnJvbSB0aGUgc3RhcnQgaGVyZS4KCU1heFBsYW5zUGVyUHJvdmlkZXIgPSAyMAoKCS8vIE1heFN1YnNQZXJTdWJzY3JpYmVyIGJvdW5kcyBvbmUgYWNjb3VudCdzIG9wZW4tc3Vic2NyaXB0aW9uCgkvLyBzdGF0ZS4gVGVybWluYWwgc3Vic2NyaXB0aW9ucyBmcmVlIHRoZWlyIHNsb3QuCglNYXhTdWJzUGVyU3Vic2NyaWJlciA9IDEwMAoKCS8vIFJlbmRlckxpbWl0IGJvdW5kcyBldmVyeSByZW5kZXJlZCBsaXN0IOKAlCBhbiB1bmJvdW5kZWQgUmVuZGVyCgkvLyB3YXMgWUVMTE9XIGluIHRocmVlIHByaW9yIGF1ZGl0cy4KCVJlbmRlckxpbWl0ID0gMjAKKQoKdHlwZSBwbGFuIHN0cnVjdCB7CglpZCAgICAgICAgICAgaW50NjQKCXByb3ZpZGVyICAgICBhZGRyZXNzCgl0aXRsZSAgICAgICAgc3RyaW5nCglkZXNjcmlwdGlvbiAgc3RyaW5nCglwcmljZSAgICAgICAgaW50NjQKCXBlcmlvZEJsb2NrcyBpbnQ2NAoJZmVlQnBzICAgICAgIGludDY0IC8vIHNuYXBzaG90dGVkIGF0IGNyZWF0aW9uLCBjaGFyZ2VkIGF0IGV2ZXJ5IHBheW1lbnQKCXN0YXR1cyAgICAgICBzdHJpbmcKCXN1YnMgICAgICAgICBpbnQ2NCAvLyBsaWZldGltZSBjb3VudCwgbmV2ZXIgZGVjcmVtZW50ZWQKfQoKdHlwZSBzdWIgc3RydWN0IHsKCWlkICAgICAgICAgICBpbnQ2NAoJcGxhbklEICAgICAgIGludDY0CglzdWJzY3JpYmVyICAgYWRkcmVzcwoJcHJvdmlkZXIgICAgIGFkZHJlc3MgLy8gY29waWVkIGF0IFN1YnNjcmliZTsgbmV2ZXIgcmUtcmVhZCBmcm9tIHRoZSBwbGFuCglwcmljZSAgICAgICAgaW50NjQgICAvLyBjb3BpZWQgYXQgU3Vic2NyaWJlOyBhIHBsYW4gaXMgaW1tdXRhYmxlIGFueXdheQoJcGVyaW9kQmxvY2tzIGludDY0ICAgLy8gY29waWVkIGF0IFN1YnNjcmliZQoJZmVlQnBzICAgICAgIGludDY0ICAgLy8gY29waWVkIGF0IFN1YnNjcmliZSBmcm9tIHRoZSBwbGFuJ3Mgc25hcHNob3QKCXN0YXR1cyAgICAgICBzdHJpbmcKCXBhaWRUaHJvdWdoICBpbnQ2NCAvLyBhYnNvbHV0ZSBoZWlnaHQ7IGVudGl0bGVtZW50ID0gaGVpZ2h0IDwgcGFpZFRocm91Z2gKCXBlcmlvZHMgICAgICBpbnQ2NCAvLyBsaWZldGltZSBwYWlkLXBlcmlvZCBjb3VudAp9Cgp2YXIgKAoJYWRtaW4gICAgICAgIGFkZHJlc3MgLy8gbWF5IHNldCBmZWUsIGZlZSByZWNpcGllbnQsIHN0YWdlIHN1Y2Nlc3NvcgoJcGVuZGluZ0FkbWluIGFkZHJlc3MgLy8gc3RhZ2VkIGJ5IFRyYW5zZmVyQWRtaW4sIGNvbXBsZXRlcyB2aWEgQWNjZXB0QWRtaW4KCWZlZVJlY2lwaWVudCBhZGRyZXNzIC8vIG1heSB3aXRoZHJhdyBmZWVzIGFuZCBzd2VlcCBzdXJwbHVzCglmZWVCcHMgICAgICAgaW50NjQgICAvLyBmZWUgc25hcHNob3R0ZWQgaW50byBORVcgcGxhbnMKCglzZWxmICAgICBhZGRyZXNzIC8vIHRoaXMgcmVhbG0ncyBhZGRyZXNzLCBjYXB0dXJlZCBhdCBkZXBsb3kKCW5leHRQbGFuIGludDY0CgluZXh0U3ViICBpbnQ2NAoKCXBsYW5zICAgICAgID0gYXZsLk5ld1RyZWUoKSAvLyBwYWRJRChpZCkgICAgICAgICAgICAgICAgIC0+ICpwbGFuCglzdWJzICAgICAgICA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQoaWQpICAgICAgICAgICAgICAgICAtPiAqc3ViCglhY3RpdmVCeUtleSA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQocGxhbklEKXxzdWJzY3JpYmVyICAtPiBpbnQ2NCBzdWIgaWQsIHdoaWxlIEFjdGl2ZQoJbGF0ZXN0QnlLZXkgPSBhdmwuTmV3VHJlZSgpIC8vIHBhZElEKHBsYW5JRCl8c3Vic2NyaWJlciAgLT4gbW9zdCByZWNlbnQgc3ViIGlkLCBuZXZlciByZW1vdmVkCglwcm92aWRlck51bSA9IGF2bC5OZXdUcmVlKCkgLy8gYWRkcmVzcyAtPiAqaW50NjQsIGxpdmUgcGxhbnMgcGVyIHByb3ZpZGVyCglzdWJOdW0gICAgICA9IGF2bC5OZXdUcmVlKCkgLy8gYWRkcmVzcyAtPiAqaW50NjQsIEFjdGl2ZSBzdWJzIHBlciBzdWJzY3JpYmVyCglsZWRnZXIgICAgICA9IGZlZWxlZGdlci5NdXN0TmV3KE1heEZlZUJwcykKKQoKZnVuYyBpbml0KCkgewoJYWRtaW4gPSB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkKCWZlZVJlY2lwaWVudCA9IGFkbWluCglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQp9CgovLyAtLS0gcHJvdmlkZXIgc2lkZSAtLS0KCi8vIENyZWF0ZVBsYW4gcHVibGlzaGVzIGEgc3Vic2NyaXB0aW9uIHBsYW4gYW5kIHJldHVybnMgaXRzIGlkLiBObyBjb2lucwovLyBhcmUgYWNjZXB0ZWQ7IHRoZSBzdG9yYWdlIGRlcG9zaXQgdGhlIGNhbGxlciBwYXlzIGlzIHRoZSBhbnRpLXNwYW0uCi8vIFRoZSBjdXJyZW50IHByb3RvY29sIGZlZSBpcyBzbmFwc2hvdHRlZCBpbnRvIHRoZSBwbGFuIGFuZCBtdXN0IG5vdAovLyBleGNlZWQgbWF4RmVlQnBzLCB0aGUgY2VpbGluZyB0aGUgcHJvdmlkZXIgc2lnbmVkIGZvciDigJQgcGFzcwovLyBNYXhGZWVCcHMgdG8gYWNjZXB0IGFueSBsZWdhbCBmZWUuIFBsYW5zIGFyZSBpbW11dGFibGUgb25jZSBjcmVhdGVkOgovLyBwcmljZSBhbmQgcGVyaW9kIGNoYW5nZXMgYXJlIGEgbmV3IHBsYW4sIHNvIG5vdGhpbmcgYSBzdWJzY3JpYmVyCi8vIGFncmVlZCB0byBjYW4gbW92ZSB1bmRlcm5lYXRoIHRoZW0uCmZ1bmMgQ3JlYXRlUGxhbihjdXIgcmVhbG0sIHRpdGxlLCBkZXNjcmlwdGlvbiBzdHJpbmcsIHByaWNlLCBwZXJpb2RCbG9ja3MsIG1heEZlZUJwcyBpbnQ2NCkgaW50NjQgewoJYXNzZXJ0Tm9TZW5kKCkKCXByb3ZpZGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoKCWlmIHRpdGxlID09ICIiIHx8IGxlbih0aXRsZSkgPiBNYXhUaXRsZUxlbiB7CgkJcGFuaWMoInRpdGxlIG11c3QgYmUgMS4uIiArIGl0b2EoaW50NjQoTWF4VGl0bGVMZW4pKSArICIgYnl0ZXMiKQoJfQoJaWYgbGVuKGRlc2NyaXB0aW9uKSA+IE1heERlc2NMZW4gewoJCXBhbmljKCJkZXNjcmlwdGlvbiB0b28gbG9uZyIpCgl9CglpZiBwcmljZSA8IE1pblByaWNlIHsKCQlwYW5pYygicHJpY2UgbXVzdCBiZSBhdCBsZWFzdCAiICsgaXRvYShNaW5QcmljZSkgKyBEZW5vbSkKCX0KCWlmIHBlcmlvZEJsb2NrcyA8IE1pblBlcmlvZEJsb2NrcyB8fCBwZXJpb2RCbG9ja3MgPiBNYXhQZXJpb2RCbG9ja3MgewoJCXBhbmljKCJwZXJpb2RCbG9ja3MgbXVzdCBiZSBpbiBbIiArIGl0b2EoTWluUGVyaW9kQmxvY2tzKSArICIsICIgKwoJCQlpdG9hKE1heFBlcmlvZEJsb2NrcykgKyAiXSIpCgl9CglpZiBmZWVCcHMgPiBtYXhGZWVCcHMgewoJCXBhbmljKCJjdXJyZW50IGZlZSAiICsgaXRvYShmZWVCcHMpICsgIiBicHMgZXhjZWVkcyB0aGUgY2FsbGVyJ3MgbWF4aW11bSAiICsKCQkJaXRvYShtYXhGZWVCcHMpKQoJfQoJbiA6PSBjb3VudGVyKHByb3ZpZGVyTnVtLCBwcm92aWRlcikKCWlmICpuID49IE1heFBsYW5zUGVyUHJvdmlkZXIgewoJCXBhbmljKCJwZXItcHJvdmlkZXIgcGxhbiBsaW1pdCByZWFjaGVkIikKCX0KCglpZCA6PSBuZXh0UGxhbgoJbmV4dFBsYW4rKwoJcGxhbnMuU2V0KHBhZElEKGlkKSwgJnBsYW57CgkJaWQ6ICAgICAgICAgICBpZCwKCQlwcm92aWRlcjogICAgIHByb3ZpZGVyLAoJCXRpdGxlOiAgICAgICAgdGl0bGUsCgkJZGVzY3JpcHRpb246ICBkZXNjcmlwdGlvbiwKCQlwcmljZTogICAgICAgIHByaWNlLAoJCXBlcmlvZEJsb2NrczogcGVyaW9kQmxvY2tzLAoJCWZlZUJwczogICAgICAgZmVlQnBzLAoJCXN0YXR1czogICAgICAgUGxhbkFjdGl2ZSwKCX0pCgkqbisrCgoJY2hhaW4uRW1pdCgiUGxhbkNyZWF0ZWQiLAoJCSJwbGFuSWQiLCBpdG9hKGlkKSwKCQkicHJvdmlkZXIiLCBwcm92aWRlci5TdHJpbmcoKSwKCQkicHJpY2UiLCBpdG9hKHByaWNlKSwKCQkicGVyaW9kQmxvY2tzIiwgaXRvYShwZXJpb2RCbG9ja3MpLAoJCSJmZWVCcHMiLCBpdG9hKGZlZUJwcyksCgkpCglyZXR1cm4gaWQKfQoKLy8gUmV0aXJlUGxhbiB0YWtlcyBhIHBsYW4gb2ZmIHRoZSBtYXJrZXQ6IG5vIG5ldyBzdWJzY3JpcHRpb25zIGFuZCBubwovLyByZW5ld2Fscy4gUHJvdmlkZXIgb25seS4gRXhpc3RpbmcgZW50aXRsZW1lbnRzIHJ1biB0byB0aGVpcgovLyBwYWlkVGhyb3VnaCB1bnRvdWNoZWQ7IHJlZnVzaW5nIHJlbmV3YWxzIGlzIHN1YnNjcmliZXIgcHJvdGVjdGlvbiDigJQKLy8gbm9ib2R5IGtlZXBzIHBheWluZyBmb3IgYSBzZXJ2aWNlIHdob3NlIHByb3ZpZGVyIGFubm91bmNlZCBpdHMgZW5kLgovLyBUaGUgcHJvdmlkZXIncyBwbGFuLXF1b3RhIHNsb3QgZnJlZXMuCmZ1bmMgUmV0aXJlUGxhbihjdXIgcmVhbG0sIHBsYW5JRCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCXAgOj0gbXVzdEdldFBsYW4ocGxhbklEKQoJaWYgY2FsbGVyICE9IHAucHJvdmlkZXIgewoJCXBhbmljKCJvbmx5IHRoZSBwcm92aWRlciBtYXkgcmV0aXJlIGEgcGxhbiIpCgl9CglpZiBwLnN0YXR1cyAhPSBQbGFuQWN0aXZlIHsKCQlwYW5pYygicGxhbiBpcyBub3QgYWN0aXZlIikKCX0KCXAuc3RhdHVzID0gUGxhblJldGlyZWQKCSpjb3VudGVyKHByb3ZpZGVyTnVtLCBwLnByb3ZpZGVyKS0tCgljaGFpbi5FbWl0KCJQbGFuUmV0aXJlZCIsICJwbGFuSWQiLCBpdG9hKHBsYW5JRCksICJwcm92aWRlciIsIHAucHJvdmlkZXIuU3RyaW5nKCkpCn0KCi8vIC0tLSBzdWJzY3JpYmVyIHNpZGUgLS0tCgovLyBTdWJzY3JpYmUgcGF5cyBmb3IgdGhlIGZpcnN0IGJpbGxpbmcgcGVyaW9kIG9mIGEgcGxhbiBhbmQgcmV0dXJucyB0aGUKLy8gbmV3IHN1YnNjcmlwdGlvbiBpZC4gVGhlIHRyYW5zYWN0aW9uIG11c3QgYXR0YWNoIEVYQUNUTFkgdGhlIHBsYW4ncwovLyBwcmljZSBpbiB1Z25vdCDigJQgb3Zlci0gYW5kIHVuZGVycGF5bWVudCBhcmUgYm90aCByZWZ1c2VkLCBzbyBhCi8vIG1pc3Rha2VuIGRvdWJsZS1hdHRhY2ggY2Fubm90IHNpbGVudGx5IGJlY29tZSBhIGRvbmF0aW9uLiBPbmUKLy8gc3Vic2NyaWJlciBob2xkcyBhdCBtb3N0IG9uZSBsaXZlIHN1YnNjcmlwdGlvbiBwZXIgcGxhbjogaWYgYW4gQWN0aXZlCi8vIG9uZSBleGlzdHMgdGhlIGNhbGwgaXMgcmVmdXNlZCAodGhlIHJlbmV3YWwgcGF0aCBpcyBSZW5ldywgbmV2ZXIgYQovLyBzZWNvbmQgU3Vic2NyaWJlIOKAlCB0aGF0IGlzIHRoZSBkdXBsaWNhdGUtcGF5bWVudCBndWFyZCBhdCB0aGUKLy8gaWRlbnRpdHkgbGV2ZWwpOyBhbiBpbmN1bWJlbnQgcGFzdCBpdHMgZ3JhY2Ugd2luZG93IGlzIGNvbGxhcHNlZCB0bwovLyBFeHBpcmVkIGluIHBsYWNlLCBzbyBhIGZyZXNoIHN0YXJ0IG5ldmVyIHdhaXRzIG9uIGhvdXNla2VlcGluZy4KLy8KLy8gVGhlIHBheW1lbnQgc2V0dGxlcyBpbW1lZGlhdGVseTogcHJpY2UgbWludXMgdGhlIHBsYW4ncyBzbmFwc2hvdHRlZAovLyBmZWUgdG8gdGhlIHByb3ZpZGVyJ3MgY2xhaW1hYmxlIGJhbGFuY2UsIGZlZSB0byB0aGUgcHJvdG9jb2wgcG90LgovLyBFbnRpdGxlbWVudCBydW5zIGZyb20gdGhpcyBibG9jazogcGFpZFRocm91Z2ggPSBoZWlnaHQgKyBwZXJpb2RCbG9ja3MuCmZ1bmMgU3Vic2NyaWJlKGN1ciByZWFsbSwgcGxhbklEIGludDY0KSBpbnQ2NCB7CglzdWJzY3JpYmVyLCBhbW91bnQgOj0gY29pbmlvLlJlY2VpdmUoMCwgY3VyLCBEZW5vbSkKCXAgOj0gbXVzdEdldFBsYW4ocGxhbklEKQoJaWYgcC5zdGF0dXMgIT0gUGxhbkFjdGl2ZSB7CgkJcGFuaWMoInBsYW4gaXMgbm90IGFjdGl2ZSIpCgl9CglpZiBhbW91bnQgIT0gcC5wcmljZSB7CgkJcGFuaWMoInNlbmQgZXhhY3RseSB0aGUgcGxhbiBwcmljZTogIiArIGl0b2EocC5wcmljZSkgKyBEZW5vbSkKCX0KCglrZXkgOj0gcGFkSUQocGxhbklEKSArICJ8IiArIHN1YnNjcmliZXIuU3RyaW5nKCkKCWlmIHYgOj0gYWN0aXZlQnlLZXkuR2V0KGtleSk7IHYgIT0gbmlsIHsKCQlpbmMgOj0gbXVzdEdldFN1Yih2LihpbnQ2NCkpCgkJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpID49IGluYy5wYWlkVGhyb3VnaCtpbmMucGVyaW9kQmxvY2tzIHsKCQkJZXhwaXJlSW5QbGFjZShpbmMpCgkJfSBlbHNlIGlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA+PSBpbmMucGFpZFRocm91Z2ggewoJCQlwYW5pYygic3Vic2NyaXB0aW9uICIgKyBpdG9hKGluYy5pZCkgKyAiIHRvIHRoaXMgcGxhbiBpcyBsYXBzZWQgYnV0IHJlbmV3YWJsZTogIiArCgkJCQkiUmVuZXcgYmFjay1wYXlzIHRoZSBsYXBzZWQgc3BhbiBhbmQga2VlcHMgdGhlIHNjaGVkdWxlOyAiICsKCQkJCSJDYW5jZWwgdGhlbiBTdWJzY3JpYmUgcmVzdGFydHMgZnJlc2ggYXQgdGhlIHNhbWUgcHJpY2UiKQoJCX0gZWxzZSB7CgkJCXBhbmljKCJhbiBhY3RpdmUgc3Vic2NyaXB0aW9uIHRvIHRoaXMgcGxhbiBhbHJlYWR5IGV4aXN0czogcmVuZXcgaXQgaW5zdGVhZCIpCgkJfQoJfQoJbiA6PSBjb3VudGVyKHN1Yk51bSwgc3Vic2NyaWJlcikKCWlmICpuID49IE1heFN1YnNQZXJTdWJzY3JpYmVyIHsKCQlwYW5pYygicGVyLXN1YnNjcmliZXIgc3Vic2NyaXB0aW9uIGxpbWl0IHJlYWNoZWQiKQoJfQoKCWxlZGdlci5NdXN0RGVwb3NpdChwLnByb3ZpZGVyLlN0cmluZygpLCBhbW91bnQsIHAuZmVlQnBzKQoKCWlkIDo9IG5leHRTdWIKCW5leHRTdWIrKwoJc3Vicy5TZXQocGFkSUQoaWQpLCAmc3ViewoJCWlkOiAgICAgICAgICAgaWQsCgkJcGxhbklEOiAgICAgICBwbGFuSUQsCgkJc3Vic2NyaWJlcjogICBzdWJzY3JpYmVyLAoJCXByb3ZpZGVyOiAgICAgcC5wcm92aWRlciwKCQlwcmljZTogICAgICAgIHAucHJpY2UsCgkJcGVyaW9kQmxvY2tzOiBwLnBlcmlvZEJsb2NrcywKCQlmZWVCcHM6ICAgICAgIHAuZmVlQnBzLAoJCXN0YXR1czogICAgICAgU3ViQWN0aXZlLAoJCXBhaWRUaHJvdWdoOiAgcnVudGltZS5DaGFpbkhlaWdodCgpICsgcC5wZXJpb2RCbG9ja3MsCgkJcGVyaW9kczogICAgICAxLAoJfSkKCWFjdGl2ZUJ5S2V5LlNldChrZXksIGlkKQoJbGF0ZXN0QnlLZXkuU2V0KGtleSwgaWQpCgkqbisrCglwLnN1YnMrKwoKCWNoYWluLkVtaXQoIlN1YnNjcmliZWQiLAoJCSJzdWJJZCIsIGl0b2EoaWQpLAoJCSJwbGFuSWQiLCBpdG9hKHBsYW5JRCksCgkJInN1YnNjcmliZXIiLCBzdWJzY3JpYmVyLlN0cmluZygpLAoJCSJwcm92aWRlciIsIHAucHJvdmlkZXIuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkicGFpZFRocm91Z2giLCBpdG9hKHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKStwLnBlcmlvZEJsb2NrcyksCgkpCglyZXR1cm4gaWQKfQoKLy8gUmVuZXcgcGF5cyBmb3IgdGhlIG5leHQgYmlsbGluZyBwZXJpb2Qgb2YgdGhlIGNhbGxlcidzIG93bgovLyBzdWJzY3JpcHRpb24uIFRoZSB0cmFuc2FjdGlvbiBtdXN0IGF0dGFjaCBleGFjdGx5IHRoZSBzdWJzY3JpcHRpb24ncwovLyBwcmljZS4gVGhlIHJlbmV3YWwgd2luZG93IGlzIGRldGVybWluaXN0aWMgYW5kIHN0YXRlZCBpbiB0aGUgaGVhZGVyOgovLyBhY2NlcHRlZCBpZmYgcGFpZFRocm91Z2ggLSBoZWlnaHQgPD0gcGVyaW9kQmxvY2tzIChhdCBtb3N0IG9uZSBmdWxsCi8vIHVuc3RhcnRlZCBwZXJpb2QgcHJlcGFpZCDigJQgdGhlIGR1cGxpY2F0ZS1wYXltZW50IGJvdW5kKSBhbmQgaGVpZ2h0IDwKLy8gcGFpZFRocm91Z2ggKyBwZXJpb2RCbG9ja3MgKHRoZSBncmFjZSBib3VuZCwgZXhjbHVzaXZlIOKAlCBhIHJlbmV3YWwKLy8gYWx3YXlzIGJ1eXMgYXQgbGVhc3Qgb25lIGJsb2NrKS4gRXh0ZW5zaW9uIGlzIGFsd2F5cwovLyBGUk9NIHBhaWRUaHJvdWdoLCBzbyBwZXJpb2QgYm91bmRhcmllcyBuZXZlciBkcmlmdCwgYW5kIGEgcmVuZXdhbAovLyBpbnNpZGUgZ3JhY2UgY292ZXJzIHRoZSBsYXBzZWQgc3BhbiDigJQgdGhhdCBpcyB0aGUgcHJpY2Ugb2Yga2VlcGluZwovLyB0aGUgb3JpZ2luYWwgc2NoZWR1bGUsIGFuZCBpdCBpcyB0aGUgZG9jdW1lbnRlZCwgZGV0ZXJtaW5pc3RpYwovLyBjaG9pY2UuCmZ1bmMgUmVuZXcoY3VyIHJlYWxtLCBzdWJJRCBpbnQ2NCkgewoJcGF5ZXIsIGFtb3VudCA6PSBjb2luaW8uUmVjZWl2ZSgwLCBjdXIsIERlbm9tKQoJcyA6PSBtdXN0R2V0U3ViKHN1YklEKQoJaWYgcGF5ZXIgIT0gcy5zdWJzY3JpYmVyIHsKCQlwYW5pYygib25seSB0aGUgc3Vic2NyaWJlciBtYXkgcmVuZXciKQoJfQoJaWYgcy5zdGF0dXMgIT0gU3ViQWN0aXZlIHsKCQlwYW5pYygic3Vic2NyaXB0aW9uIGlzICIgKyBzLnN0YXR1cykKCX0KCXAgOj0gbXVzdEdldFBsYW4ocy5wbGFuSUQpCglpZiBwLnN0YXR1cyAhPSBQbGFuQWN0aXZlIHsKCQlwYW5pYygicGxhbiBpcyByZXRpcmVkOyB0aGUgcGFpZCBwZXJpb2QgcnVucyB0byBpdHMgZW5kIGJ1dCBjYW5ub3QgYmUgcmVuZXdlZCIpCgl9CglpZiBhbW91bnQgIT0gcy5wcmljZSB7CgkJcGFuaWMoInNlbmQgZXhhY3RseSB0aGUgc3Vic2NyaXB0aW9uIHByaWNlOiAiICsgaXRvYShzLnByaWNlKSArIERlbm9tKQoJfQoJaCA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlmIHMucGFpZFRocm91Z2gtaCA+IHMucGVyaW9kQmxvY2tzIHsKCQlwYW5pYygidG9vIGVhcmx5OiBhdCBtb3N0IG9uZSB1bnN0YXJ0ZWQgcGVyaW9kIG1heSBiZSBwcmVwYWlkOyByZW5ld2FibGUgZnJvbSBoZWlnaHQgIiArCgkJCWl0b2Eocy5wYWlkVGhyb3VnaC1zLnBlcmlvZEJsb2NrcykpCgl9CglpZiBoID49IHMucGFpZFRocm91Z2grcy5wZXJpb2RCbG9ja3MgewoJCXBhbmljKCJncmFjZSB3aW5kb3cgb3ZlcjsgdGhlIHN1YnNjcmlwdGlvbiBpcyBleHBpcmFibGUsIHN1YnNjcmliZSBhZnJlc2giKQoJfQoKCWxlZGdlci5NdXN0RGVwb3NpdChzLnByb3ZpZGVyLlN0cmluZygpLCBhbW91bnQsIHMuZmVlQnBzKQoJcy5wYWlkVGhyb3VnaCArPSBzLnBlcmlvZEJsb2NrcwoJcy5wZXJpb2RzKysKCgljaGFpbi5FbWl0KCJSZW5ld2VkIiwKCQkic3ViSWQiLCBpdG9hKHN1YklEKSwKCQkic3Vic2NyaWJlciIsIHMuc3Vic2NyaWJlci5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaXRvYShhbW91bnQpLAoJCSJwYWlkVGhyb3VnaCIsIGl0b2Eocy5wYWlkVGhyb3VnaCksCgkpCn0KCi8vIENhbmNlbCBlbmRzIHRoZSBjYWxsZXIncyBvd24gc3Vic2NyaXB0aW9uLiBUZXJtaW5hbDogaXQgY2FuIG5ldmVyIGJlCi8vIHJlbmV3ZWQgYWZ0ZXJ3YXJkcywgYnkgYW55b25lLiBObyByZWZ1bmQgYW5kIG5vIGZ1bmRzIG1vdmUg4oCUIGV2ZXJ5Ci8vIHBheW1lbnQgc2V0dGxlZCB3aGVuIGl0IHdhcyBtYWRlLCBhbmQgdGhlIGVudGl0bGVtZW50IGFscmVhZHkgYm91Z2h0Ci8vIChoZWlnaHQgPCBwYWlkVGhyb3VnaCkgcmVtYWlucyB1bnRpbCBpdCBydW5zIG91dC4gVGhlIHBsYW4gc2xvdCBhbmQKLy8gdGhlIHN1YnNjcmliZXIncyBxdW90YSBzbG90IGZyZWUgaW1tZWRpYXRlbHkuCmZ1bmMgQ2FuY2VsKGN1ciByZWFsbSwgc3ViSUQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglzIDo9IG11c3RHZXRTdWIoc3ViSUQpCglpZiBjYWxsZXIgIT0gcy5zdWJzY3JpYmVyIHsKCQlwYW5pYygib25seSB0aGUgc3Vic2NyaWJlciBtYXkgY2FuY2VsIikKCX0KCWlmIHMuc3RhdHVzICE9IFN1YkFjdGl2ZSB7CgkJcGFuaWMoInN1YnNjcmlwdGlvbiBpcyAiICsgcy5zdGF0dXMpCgl9CglzLnN0YXR1cyA9IFN1YkNhbmNlbGxlZAoJcmVsZWFzZVNsb3RzKHMpCgljaGFpbi5FbWl0KCJDYW5jZWxsZWQiLAoJCSJzdWJJZCIsIGl0b2Eoc3ViSUQpLAoJCSJzdWJzY3JpYmVyIiwgcy5zdWJzY3JpYmVyLlN0cmluZygpLAoJCSJwYWlkVGhyb3VnaCIsIGl0b2Eocy5wYWlkVGhyb3VnaCksCgkpCn0KCi8vIEV4cGlyZSBtYXJrcyBhIGxhcHNlZCBzdWJzY3JpcHRpb24gRXhwaXJlZCBvbmNlIGl0cyBncmFjZSB3aW5kb3cgaXMKLy8gb3ZlcjogaGVpZ2h0ID49IHBhaWRUaHJvdWdoICsgcGVyaW9kQmxvY2tzLiBQZXJtaXNzaW9ubGVzcyBieSBkZXNpZ24g4oCUCi8vIGxpa2UgdGhlIHNpYmxpbmcgcmVhbG1zJyB2YWx2ZXMsIG5vIHNsb3QncyBsaXZlbmVzcyBtYXkgZGVwZW5kIG9uCi8vIGVpdGhlciBwYXJ0eSBzaG93aW5nIHVwLiBObyBmdW5kcyBtb3ZlLgpmdW5jIEV4cGlyZShjdXIgcmVhbG0sIHN1YklEIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJcyA6PSBtdXN0R2V0U3ViKHN1YklEKQoJaWYgcy5zdGF0dXMgIT0gU3ViQWN0aXZlIHsKCQlwYW5pYygic3Vic2NyaXB0aW9uIGlzICIgKyBzLnN0YXR1cykKCX0KCWlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA8IHMucGFpZFRocm91Z2grcy5wZXJpb2RCbG9ja3MgewoJCXBhbmljKCJub3QgZXhwaXJhYmxlOiBncmFjZSBydW5zIHRocm91Z2ggaGVpZ2h0ICIgKwoJCQlpdG9hKHMucGFpZFRocm91Z2grcy5wZXJpb2RCbG9ja3MtMSkpCgl9CglleHBpcmVJblBsYWNlKHMpCn0KCi8vIC0tLSBwYXlvdXRzIC0tLQoKLy8gQ2xhaW0gc2VuZHMgYW1vdW50IHVnbm90IG9mIHRoZSBjYWxsZXIncyBjbGFpbWFibGUgYmFsYW5jZSBiYWNrIHRvCi8vIHRoZSBjYWxsZXIuIFByb3ZpZGVycyBlYXJuIGludG8gdGhpcyBiYWxhbmNlIGF0IGV2ZXJ5IHBheW1lbnQuCmZ1bmMgQ2xhaW0oY3VyIHJlYWxtLCBhbW91bnQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBlcnIgOj0gbGVkZ2VyLldpdGhkcmF3KGNhbGxlci5TdHJpbmcoKSwgYW1vdW50KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGNhbGxlciwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkNsYWltIiwgInRvIiwgY2FsbGVyLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyBDbGFpbUFsbCBzZW5kcyB0aGUgY2FsbGVyJ3MgZW50aXJlIGNsYWltYWJsZSBiYWxhbmNlIGJhY2sgdG8gdGhlCi8vIGNhbGxlci4gRmFpbHMgaWYgdGhlcmUgaXMgbm90aGluZyB0byBjbGFpbS4KZnVuYyBDbGFpbUFsbChjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglhbW91bnQsIGVyciA6PSBsZWRnZXIuV2l0aGRyYXdBbGwoY2FsbGVyLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJub3RoaW5nIHRvIGNsYWltIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBjYWxsZXIsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJDbGFpbSIsICJ0byIsIGNhbGxlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gV2l0aGRyYXdGZWVzIHNlbmRzIHRoZSBhY2NydWVkIGZlZSBwb3QgdG8gdGhlIGZlZSByZWNpcGllbnQuIE9ubHkgdGhlCi8vIGZlZSByZWNpcGllbnQgbWF5IGNhbGwgaXQsIGFuZCBvbmx5IHRoZSBwb3QgbW92ZXMuCmZ1bmMgV2l0aGRyYXdGZWVzKGN1ciByZWFsbSkgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBmZWVSZWNpcGllbnQgewoJCXBhbmljKCJmZWUgcmVjaXBpZW50IG9ubHkiKQoJfQoJYW1vdW50IDo9IGxlZGdlci5XaXRoZHJhd0ZlZXMoKQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJubyBmZWVzIGFjY3J1ZWQiKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGZlZVJlY2lwaWVudCwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkZlZXNXaXRoZHJhd24iLCAidG8iLCBmZWVSZWNpcGllbnQuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIFN3ZWVwRGVub20gcmVjb3ZlcnMgb3V0LW9mLWJhbmQgY29pbnMgKHNlbnQgYnkgcmF3IGJhbmsgdHJhbnNmZXIsCi8vIG91dHNpZGUgYW55IGVudHJ5cG9pbnQpIHRvIHRoZSBmZWUgcmVjaXBpZW50LiBGb3IgdGhlIGxlZGdlciBkZW5vbQovLyB0aGUgcmVzZXJ2ZSBpcyBMaWFiaWxpdGllcygpIOKAlCB1c2VyIGJhbGFuY2VzIGFuZCB0aGUgZmVlIHBvdCBhcmUKLy8gc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlLiBGZWUgcmVjaXBpZW50IG9ubHkuCmZ1bmMgU3dlZXBEZW5vbShjdXIgcmVhbG0sIGRlbm9tIHN0cmluZykgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBmZWVSZWNpcGllbnQgewoJCXBhbmljKCJmZWUgcmVjaXBpZW50IG9ubHkiKQoJfQoJcmVzZXJ2ZSA6PSBpbnQ2NCgwKQoJaWYgZGVub20gPT0gRGVub20gewoJCXJlc2VydmUgPSBsZWRnZXIuTGlhYmlsaXRpZXMoKQoJfQoJLy8gY29pbmlvLlN3ZWVwIGl0c2VsZiBhYm9ydHMgd2hlbiBub3RoaW5nIHNpdHMgYWJvdmUgdGhlIHJlc2VydmUuCglzd2VwdCA6PSBjb2luaW8uU3dlZXAoMCwgY3VyLCBmZWVSZWNpcGllbnQsIGRlbm9tLCByZXNlcnZlKQoJY2hhaW4uRW1pdCgiU3VycGx1c1N3ZXB0IiwgInRvIiwgZmVlUmVjaXBpZW50LlN0cmluZygpLCAiY29pbnMiLCBpdG9hKHN3ZXB0KStkZW5vbSkKfQoKLy8gLS0tIGFkbWluaXN0cmF0aW9uIC0tLQoKLy8gU2V0RmVlQnBzIHNldHMgdGhlIHByb3RvY29sIGZlZSBzbmFwc2hvdHRlZCBpbnRvIEZVVFVSRSBwbGFucy4KLy8gQm91bmRlZCBieSBNYXhGZWVCcHM7IGV4aXN0aW5nIHBsYW5zIGFuZCBzdWJzY3JpcHRpb25zIGFyZSB1bnRvdWNoZWQKLy8g4oCUIHRoZWlyIGZlZSB3YXMgZml4ZWQgdGhlIG1vbWVudCB0aGUgcHJvdmlkZXIgY29uc2VudGVkIHRvIGl0LgpmdW5jIFNldEZlZUJwcyhjdXIgcmVhbG0sIGJwcyBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWFzc2VydEFkbWluKGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkKCWlmIGJwcyA8IDAgfHwgYnBzID4gTWF4RmVlQnBzIHsKCQlwYW5pYygiZmVlIG11c3QgYmUgaW4gWzAsICIgKyBpdG9hKE1heEZlZUJwcykgKyAiXSBicHMiKQoJfQoJb2xkIDo9IGZlZUJwcwoJZmVlQnBzID0gYnBzCgljaGFpbi5FbWl0KCJGZWVDaGFuZ2VkIiwgIm9sZEJwcyIsIGl0b2Eob2xkKSwgIm5ld0JwcyIsIGl0b2EoYnBzKSkKfQoKLy8gU2V0RmVlUmVjaXBpZW50IHBvaW50cyBmdXR1cmUgZmVlIHdpdGhkcmF3YWxzIGFuZCBzd2VlcHMgYXQgYSBuZXcKLy8gYWRkcmVzcy4gQWRtaW4gb25seS4gVGhlIHplcm8gYWRkcmVzcyBpcyByZWZ1c2VkIOKAlCBpdCB3b3VsZCBzdHJhbmQKLy8gdGhlIHBvdC4KZnVuYyBTZXRGZWVSZWNpcGllbnQoY3VyIHJlYWxtLCByZWNpcGllbnQgYWRkcmVzcykgewoJYXNzZXJ0Tm9TZW5kKCkKCWFzc2VydEFkbWluKGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkKCXZhciB6ZXJvIGFkZHJlc3MKCWlmIHJlY2lwaWVudCA9PSB6ZXJvIHsKCQlwYW5pYygiZmVlIHJlY2lwaWVudCBtdXN0IG5vdCBiZSB0aGUgemVybyBhZGRyZXNzIikKCX0KCW9sZCA6PSBmZWVSZWNpcGllbnQKCWZlZVJlY2lwaWVudCA9IHJlY2lwaWVudAoJY2hhaW4uRW1pdCgiRmVlUmVjaXBpZW50Q2hhbmdlZCIsICJvbGQiLCBvbGQuU3RyaW5nKCksICJuZXciLCByZWNpcGllbnQuU3RyaW5nKCkpCn0KCi8vIFRyYW5zZmVyQWRtaW4gc3RhZ2VzIGEgdHdvLXN0ZXAgYWRtaW4gaGFuZG92ZXIuIFRoZSBzdWNjZXNzb3IgaG9sZHMKLy8gbm90aGluZyB1bnRpbCBBY2NlcHRBZG1pbi4KZnVuYyBUcmFuc2ZlckFkbWluKGN1ciByZWFsbSwgc3VjY2Vzc29yIGFkZHJlc3MpIHsKCWFzc2VydE5vU2VuZCgpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCgl2YXIgemVybyBhZGRyZXNzCglpZiBzdWNjZXNzb3IgPT0gemVybyB7CgkJcGFuaWMoInN1Y2Nlc3NvciBtdXN0IG5vdCBiZSB0aGUgemVybyBhZGRyZXNzIikKCX0KCXBlbmRpbmdBZG1pbiA9IHN1Y2Nlc3NvcgoJY2hhaW4uRW1pdCgiQWRtaW5UcmFuc2ZlclN0YWdlZCIsICJmcm9tIiwgYWRtaW4uU3RyaW5nKCksICJ0byIsIHN1Y2Nlc3Nvci5TdHJpbmcoKSkKfQoKLy8gQWNjZXB0QWRtaW4gY29tcGxldGVzIHRoZSBoYW5kb3Zlcjsgb25seSB0aGUgc3RhZ2VkIHN1Y2Nlc3NvciBtYXkuCmZ1bmMgQWNjZXB0QWRtaW4oY3VyIHJlYWxtKSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgY2FsbGVyICE9IHBlbmRpbmdBZG1pbiB7CgkJcGFuaWMoIm9ubHkgdGhlIHN0YWdlZCBzdWNjZXNzb3IgbWF5IGFjY2VwdCIpCgl9CglvbGQgOj0gYWRtaW4KCWFkbWluID0gY2FsbGVyCgl2YXIgemVybyBhZGRyZXNzCglwZW5kaW5nQWRtaW4gPSB6ZXJvCgljaGFpbi5FbWl0KCJBZG1pblRyYW5zZmVycmVkIiwgImZyb20iLCBvbGQuU3RyaW5nKCksICJ0byIsIGFkbWluLlN0cmluZygpKQp9CgovLyAtLS0gdmlld3MgLS0tCgovLyBFbnRpdGxlZCByZXBvcnRzIHdoZXRoZXIgdGhlIHN1YnNjcmlwdGlvbidzIHBhaWQgZW50aXRsZW1lbnQgY292ZXJzCi8vIHRoZSBjdXJyZW50IGJsb2NrOiBoZWlnaHQgPCBwYWlkVGhyb3VnaC4gU3RhdHVzIGRlbGliZXJhdGVseSBkb2VzIG5vdAovLyBlbnRlciBpbnRvIGl0IOKAlCBhIGNhbmNlbGxlZCBzdWJzY3JpYmVyIGtlZXBzIHdoYXQgdGhleSBwYWlkIGZvciwgYW5kCi8vIGFuIGV4cGlyYWJsZS1idXQtdW5leHBpcmVkIG9uZSBoYXMgYWxyZWFkeSBsYXBzZWQgaGVyZS4KZnVuYyBFbnRpdGxlZChzdWJJRCBpbnQ2NCkgYm9vbCB7CglzIDo9IG11c3RHZXRTdWIoc3ViSUQpCglyZXR1cm4gcnVudGltZS5DaGFpbkhlaWdodCgpIDwgcy5wYWlkVGhyb3VnaAp9CgovLyBFbnRpdGxlZEZvciByZXBvcnRzIHdoZXRoZXIgc3Vic2NyaWJlciBjdXJyZW50bHkgaG9sZHMgcGFpZAovLyBlbnRpdGxlbWVudCB0byBwbGFuSUQsIHRocm91Z2ggdGhlaXIgTU9TVCBSRUNFTlQgc3Vic2NyaXB0aW9uIHRvIGl0LgovLyBUaGlzIGlzIHRoZSBvbmUtY2FsbCBpbnRlZ3JhdGlvbiBzdXJmYWNlIGZvciBvdGhlciByZWFsbXMgYW5kCi8vIHNlcnZpY2VzLCBhbmQgaXQgaG9ub3JzIHRoZSBlbnRpdGxlbWVudCBjb250cmFjdCBhY3Jvc3Mgc3RhdHVzOiBhCi8vIGNhbmNlbGxlZCBzdWJzY3JpcHRpb24ga2VlcHMgYW5zd2VyaW5nIHRydWUgdW50aWwgaXRzIHBhaWRUaHJvdWdoIOKAlAovLyB3aGF0IHdhcyBib3VnaHQgc3RheXMgYm91Z2h0IChhdWRpdCBmaW5kaW5nIFkxKS4gT25lIHNlbGYtaW5mbGljdGVkCi8vIGVkZ2UgaXMgZmFpbC1jbG9zZWQ6IGNhbmNlbGxpbmcgYSBwcmVwYWlkIHN1YnNjcmlwdGlvbiBhbmQKLy8gcmUtc3Vic2NyaWJpbmcgYXQgb25jZSBwb2ludHMgdGhpcyBzdXJmYWNlIGF0IHRoZSBORVcsIGVhcmxpZXIKLy8gcGFpZFRocm91Z2g7IHRoZSBvbGQgc3Vic2NyaXB0aW9uJ3MgcmVtYWluaW5nIHNwYW4gc3RheXMgcXVlcnlhYmxlCi8vIHBlci1pZCB2aWEgRW50aXRsZWQuCmZ1bmMgRW50aXRsZWRGb3IocGxhbklEIGludDY0LCBzdWJzY3JpYmVyIGFkZHJlc3MpIGJvb2wgewoJdiA6PSBsYXRlc3RCeUtleS5HZXQocGFkSUQocGxhbklEKSArICJ8IiArIHN1YnNjcmliZXIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gRW50aXRsZWQodi4oaW50NjQpKQp9CgovLyBBY3RpdmVTdWJJRCByZXR1cm5zIHRoZSBjYWxsZXItZmFjaW5nIGlkIG9mIHN1YnNjcmliZXIncyBsaXZlCi8vIHN1YnNjcmlwdGlvbiB0byBwbGFuSUQsIG9yICgwLCBmYWxzZSkgaWYgbm9uZSBpcyBBY3RpdmUuCmZ1bmMgQWN0aXZlU3ViSUQocGxhbklEIGludDY0LCBzdWJzY3JpYmVyIGFkZHJlc3MpIChpbnQ2NCwgYm9vbCkgewoJdiA6PSBhY3RpdmVCeUtleS5HZXQocGFkSUQocGxhbklEKSArICJ8IiArIHN1YnNjcmliZXIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gdi4oaW50NjQpLCB0cnVlCn0KCi8vIFBsYW5JbmZvIHJldHVybnMgYSBwbGFuJ3MgcHVibGljIGZpZWxkcy4KZnVuYyBQbGFuSW5mbyhwbGFuSUQgaW50NjQpIChwcm92aWRlciBhZGRyZXNzLCB0aXRsZSBzdHJpbmcsIHByaWNlLCBwZXJpb2RCbG9ja3MsIHBsYW5GZWVCcHMgaW50NjQsIHN0YXR1cyBzdHJpbmcsIGxpZmV0aW1lU3VicyBpbnQ2NCkgewoJcCA6PSBtdXN0R2V0UGxhbihwbGFuSUQpCglyZXR1cm4gcC5wcm92aWRlciwgcC50aXRsZSwgcC5wcmljZSwgcC5wZXJpb2RCbG9ja3MsIHAuZmVlQnBzLCBwLnN0YXR1cywgcC5zdWJzCn0KCi8vIFN1YkluZm8gcmV0dXJucyBhIHN1YnNjcmlwdGlvbidzIHB1YmxpYyBmaWVsZHMuCmZ1bmMgU3ViSW5mbyhzdWJJRCBpbnQ2NCkgKHBsYW5JRCBpbnQ2NCwgc3Vic2NyaWJlciwgcHJvdmlkZXIgYWRkcmVzcywgcHJpY2UsIHBhaWRUaHJvdWdoLCBwZXJpb2RzIGludDY0LCBzdGF0dXMgc3RyaW5nKSB7CglzIDo9IG11c3RHZXRTdWIoc3ViSUQpCglyZXR1cm4gcy5wbGFuSUQsIHMuc3Vic2NyaWJlciwgcy5wcm92aWRlciwgcy5wcmljZSwgcy5wYWlkVGhyb3VnaCwgcy5wZXJpb2RzLCBzLnN0YXR1cwp9CgovLyBQYWlkVGhyb3VnaCByZXR1cm5zIHRoZSBhYnNvbHV0ZSBoZWlnaHQgYSBzdWJzY3JpcHRpb24gaXMgcGFpZCB0by4KZnVuYyBQYWlkVGhyb3VnaChzdWJJRCBpbnQ2NCkgaW50NjQgeyByZXR1cm4gbXVzdEdldFN1YihzdWJJRCkucGFpZFRocm91Z2ggfQoKLy8gUmVuZXdhYmxlRnJvbSByZXR1cm5zIHRoZSBlYXJsaWVzdCBoZWlnaHQgYXQgd2hpY2ggUmVuZXcgd2lsbCBhY2NlcHQKLy8gYSBwYXltZW50IGZvciB0aGlzIHN1YnNjcmlwdGlvbiwgYW5kIHRoZSBsYXN0IGhlaWdodCBhdCB3aGljaCBpdAovLyBzdGlsbCB3aWxsIChpbmNsdXNpdmUpIOKAlCB0aGUgZGV0ZXJtaW5pc3RpYyB3aW5kb3csIHByZWNvbXB1dGVkIGZvcgovLyBpbnRlZ3JhdG9ycy4gRnJvbSB1bnRpbCsxIHRoZSBzdWJzY3JpcHRpb24gaXMgZXhwaXJhYmxlIGluc3RlYWQ7IHRoZQovLyB0d28gc2V0cyBwYXJ0aXRpb24gZXhhY3RseS4KZnVuYyBSZW5ld2FibGVGcm9tKHN1YklEIGludDY0KSAoZnJvbSwgdW50aWwgaW50NjQpIHsKCXMgOj0gbXVzdEdldFN1YihzdWJJRCkKCXJldHVybiBzLnBhaWRUaHJvdWdoIC0gcy5wZXJpb2RCbG9ja3MsIHMucGFpZFRocm91Z2ggKyBzLnBlcmlvZEJsb2NrcyAtIDEKfQoKZnVuYyBBZG1pbigpIGFkZHJlc3MgICAgICAgICAgICB7IHJldHVybiBhZG1pbiB9CmZ1bmMgUGVuZGluZ0FkbWluKCkgYWRkcmVzcyAgICAgeyByZXR1cm4gcGVuZGluZ0FkbWluIH0KZnVuYyBGZWVSZWNpcGllbnQoKSBhZGRyZXNzICAgICB7IHJldHVybiBmZWVSZWNpcGllbnQgfQpmdW5jIEZlZUJwcygpIGludDY0ICAgICAgICAgICAgIHsgcmV0dXJuIGZlZUJwcyB9CmZ1bmMgTnVtUGxhbnMoKSBpbnQ2NCAgICAgICAgICAgeyByZXR1cm4gbmV4dFBsYW4gfQpmdW5jIE51bVN1YnMoKSBpbnQ2NCAgICAgICAgICAgIHsgcmV0dXJuIG5leHRTdWIgfQpmdW5jIFVzZXJzVG90YWwoKSBpbnQ2NCAgICAgICAgIHsgcmV0dXJuIGxlZGdlci5Vc2Vyc1RvdGFsKCkgfQpmdW5jIEZlZXNBY2NydWVkKCkgaW50NjQgICAgICAgIHsgcmV0dXJuIGxlZGdlci5GZWVzQWNjcnVlZCgpIH0KZnVuYyBMaWFiaWxpdGllcygpIGludDY0ICAgICAgICB7IHJldHVybiBsZWRnZXIuTGlhYmlsaXRpZXMoKSB9CmZ1bmMgQmFsYW5jZU9mKGEgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gbGVkZ2VyLkJhbGFuY2VPZihhLlN0cmluZygpKSB9CmZ1bmMgQWRkcmVzcygpIGFkZHJlc3MgICAgICAgICAgeyByZXR1cm4gc2VsZiB9CmZ1bmMgSGVsZCgpIGludDY0ICAgICAgICAgICAgICAgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQoKLy8gLS0tIHJlbmRlciAtLS0KCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgcGF0aCA9PSAiIiB7CgkJcmV0dXJuIHJlbmRlckhvbWUoKQoJfQoJcmV0dXJuICJ1bmtub3duIHBhZ2U7IHRyeSB0aGUgcmVhbG0gcm9vdCIKfQoKZnVuYyByZW5kZXJIb21lKCkgc3RyaW5nIHsKCW91dCA6PSAiIyBzdWJzY3JpcHRpb25zXG5cbiIKCW91dCArPSAiUHJvdmlkZXItcHVibGlzaGVkIHBsYW5zLCBwZXItcGVyaW9kIHBheW1lbnQsIGRldGVybWluaXN0aWMgIiArCgkJInJlbmV3YWwsIGdyYWNlLCBleHBpcmF0aW9uIGFuZCBjYW5jZWxsYXRpb24uIEVudGl0bGVtZW50IGlzICIgKwoJCSJgaGVpZ2h0IDwgcGFpZFRocm91Z2hgLCBxdWVyeWFibGUgYnkgYW55b25lLlxuXG4iCglvdXQgKz0gIi0gcGxhbnM6ICIgKyBpdG9hKG5leHRQbGFuKSArICJcbiIKCW91dCArPSAiLSBzdWJzY3JpcHRpb25zOiAiICsgaXRvYShuZXh0U3ViKSArICJcbiIKCW91dCArPSAiLSBwcm92aWRlciBiYWxhbmNlczogIiArIGl0b2EobGVkZ2VyLlVzZXJzVG90YWwoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBmZWVzIGFjY3J1ZWQ6ICIgKyBpdG9hKGxlZGdlci5GZWVzQWNjcnVlZCgpKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGN1cnJlbnQgZmVlIGZvciBuZXcgcGxhbnM6ICIgKyBpdG9hKGZlZUJwcykgKyAiIGJwcyAoY2FwICIgKwoJCWl0b2EoTWF4RmVlQnBzKSArICIpXG5cbiIKCglpZiBuZXh0UGxhbiA9PSAwIHsKCQlyZXR1cm4gb3V0ICsgIk5vIHBsYW5zIHlldC5cbiIKCX0KCW91dCArPSAiIyMgbmV3ZXN0IHBsYW5zXG5cbiIKCXNob3duIDo9IGludDY0KDApCglmb3IgaWQgOj0gbmV4dFBsYW4gLSAxOyBpZCA+PSAwICYmIHNob3duIDwgUmVuZGVyTGltaXQ7IGlkLS0gewoJCXAgOj0gbXVzdEdldFBsYW4oaWQpCgkJb3V0ICs9ICItICMiICsgaXRvYShwLmlkKSArICIgKioiICsgc2FuaXRpemUuSW5saW5lVGV4dChwLnRpdGxlKSArCgkJCSIqKiDigJQgIiArIGl0b2EocC5wcmljZSkgKyBEZW5vbSArICIgLyAiICsgaXRvYShwLnBlcmlvZEJsb2NrcykgKwoJCQkiIGJsb2NrcywgIiArIHAuc3RhdHVzICsgIiwgcHJvdmlkZXIgYCIgKyBwLnByb3ZpZGVyLlN0cmluZygpICsKCQkJImAsICIgKyBpdG9hKHAuc3VicykgKyAiIGxpZmV0aW1lIHN1YnNcbiIKCQlzaG93bisrCgl9CglpZiBuZXh0UGxhbiA+IHNob3duIHsKCQlvdXQgKz0gIlxuKCIgKyBpdG9hKG5leHRQbGFuLXNob3duKSArICIgb2xkZXIgcGxhbnMgbm90IHNob3duKVxuIgoJfQoJcmV0dXJuIG91dAp9CgovLyAtLS0gaW50ZXJuYWxzIC0tLQoKLy8gZXhwaXJlSW5QbGFjZSBmbGlwcyBhbiBBY3RpdmUgc3Vic2NyaXB0aW9uIHRvIEV4cGlyZWQgYW5kIGZyZWVzIGl0cwovLyBzbG90cy4gQ2FsbGVycyBoYXZlIGFscmVhZHkgZXN0YWJsaXNoZWQgZXhwaXJhYmlsaXR5LgpmdW5jIGV4cGlyZUluUGxhY2UocyAqc3ViKSB7CglzLnN0YXR1cyA9IFN1YkV4cGlyZWQKCXJlbGVhc2VTbG90cyhzKQoJY2hhaW4uRW1pdCgiU3Vic2NyaXB0aW9uRXhwaXJlZCIsCgkJInN1YklkIiwgaXRvYShzLmlkKSwKCQkic3Vic2NyaWJlciIsIHMuc3Vic2NyaWJlci5TdHJpbmcoKSwKCQkicGFpZFRocm91Z2giLCBpdG9hKHMucGFpZFRocm91Z2gpLAoJKQp9CgovLyByZWxlYXNlU2xvdHMgcmVtb3ZlcyB0aGUgcGxhbnxzdWJzY3JpYmVyIGFjdGl2aXR5IGluZGV4IGVudHJ5IGFuZAovLyBkZWNyZW1lbnRzIHRoZSBzdWJzY3JpYmVyJ3MgcXVvdGEgY291bnRlci4gRXhhY3RseSBvbmNlIHBlciB0ZXJtaW5hbAovLyB0cmFuc2l0aW9uLCB3aGljaCBib3RoIHRlcm1pbmFsIHBhdGhzIGd1YXJhbnRlZSBieSByZXF1aXJpbmcKLy8gU3ViQWN0aXZlIGZpcnN0LgpmdW5jIHJlbGVhc2VTbG90cyhzICpzdWIpIHsKCWFjdGl2ZUJ5S2V5LlJlbW92ZShwYWRJRChzLnBsYW5JRCkgKyAifCIgKyBzLnN1YnNjcmliZXIuU3RyaW5nKCkpCgkqY291bnRlcihzdWJOdW0sIHMuc3Vic2NyaWJlciktLQp9CgpmdW5jIGFzc2VydE5vU2VuZCgpIHsKCWlmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSAhPSAwIHsKCQlwYW5pYygidGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgY29pbnMiKQoJfQp9CgpmdW5jIGFzc2VydEFkbWluKGNhbGxlciBhZGRyZXNzKSB7CglpZiBjYWxsZXIgIT0gYWRtaW4gewoJCXBhbmljKCJhZG1pbiBvbmx5IikKCX0KfQoKZnVuYyBtdXN0R2V0UGxhbihpZCBpbnQ2NCkgKnBsYW4gewoJdiA6PSBwbGFucy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKCJ1bmtub3duIHBsYW4gaWQiKQoJfQoJcmV0dXJuIHYuKCpwbGFuKQp9CgpmdW5jIG11c3RHZXRTdWIoaWQgaW50NjQpICpzdWIgewoJdiA6PSBzdWJzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoInVua25vd24gc3Vic2NyaXB0aW9uIGlkIikKCX0KCXJldHVybiB2Ligqc3ViKQp9CgovLyBjb3VudGVyIHJldHVybnMgdGhlIHBlcnNpc3RlbnQgcGVyLWFkZHJlc3MgY291bnRlciBpbiB0cmVlLAovLyBhbGxvY2F0aW5nIGEgemVybyBvbiBmaXJzdCB1c2UuCmZ1bmMgY291bnRlcih0cmVlICphdmwuVHJlZSwgYSBhZGRyZXNzKSAqaW50NjQgewoJayA6PSBhLlN0cmluZygpCglpZiB2IDo9IHRyZWUuR2V0KGspOyB2ICE9IG5pbCB7CgkJcmV0dXJuIHYuKCppbnQ2NCkKCX0KCW4gOj0gbmV3KGludDY0KQoJdHJlZS5TZXQoaywgbikKCXJldHVybiBuCn0KCmZ1bmMgcGFkSUQoaWQgaW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkKCWZvciBsZW4ocykgPCAxMiB7CgkJcyA9ICIwIiArIHMKCX0KCXJldHVybiBzCn0KCmZ1bmMgaXRvYShuIGludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQobiwgMTApIH0KIg0xMDAwMDAwMHVnbm90EhIIzpvsRhILMTQ4NTc0dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQE5vB4pLjwE+8E0dg3b0Tb4p60jh5ZPikBYAczRtISksHggcgSRK7ndPdexTRj13iImqvtNKkW22v1sALSDRWfUaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}