{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "YJNnXxXCdwL4yFmTCeGkDllkuWlzNpVH7hG6MB+KP2A=",
    "height": "584731",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": [
          {
            "@type": "/tm.StorageDepositEvent",
            "bytes_delta": "39862",
            "fee_delta": "3986200ugnot",
            "pkg_path": "gno.land/r/g1ut6uspuh73e02yauxpmyt8g3wwddaq8utagvm3/grants"
          }
        ],
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "58507135",
      "GasUsed": "39004757"
    },
    "tx": "Cv6oAQoML3ZtLm1fYWRkcGtnEuyoAQooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKvqAEKBmdyYW50cxI6Z25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2dyYW50cxphCgtnbm9tb2QudG9tbBJSCm1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvZ3JhbnRzIgpnbm8gPSAiMC45IhqEpwEKCmdyYW50cy5nbm8S9KYBLy8gUmVhbG0gZ3JhbnRzIGlzIGEgZGVjZW50cmFsaXplZCBncmFudHMgbWFya2V0OiBhIGNyZWF0b3IgZXNjcm93cwovLyBHTk9UIGJlaGluZCBhIGdyYW50IHdpdGggYW4gYXBwbGljYXRpb24gZGVhZGxpbmUsIGFwcGxpY2FudHMgYXBwbHkKLy8gb24tY2hhaW4sIHRoZSBjcmVhdG9yIHNlbGVjdHMgb25lIGFwcGxpY2FudCwgYW5kIHRoZSB3aW5uZXIgY2xhaW1zCi8vIHRoZSBmdW5kaW5nIG1pbnVzIGEgdHJhbnNwYXJlbnQgcHJvdG9jb2wgZmVlLgovLwovLyBDT01QT1NJVElPTiAocGVyIHRoZSByZWNvcmRlZCBESVNDT1ZFUlkgLyBSRVVTRSBBTkFMWVNJUyk6IGFsbAovLyBiYWxhbmNlIGFjY291bnRpbmcgaXMgZGVsZWdhdGVkIHRvIGZlZWxlZGdlciwgYWxsIGNvaW4gbW92ZW1lbnQgdG8KLy8gY29pbmlvLCBhbmQgYWxsIGZyZWUtdGV4dCByZW5kZXIgb3V0cHV0IHRvIHRoZSBlY29zeXN0ZW0gc2FuaXRpemVyCi8vIHAvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAuIFRoaXMgcmVhbG0gb3ducyBvbmx5IHRoZSBncmFudHMgc3RhdGUKLy8gbWFjaGluZTogZ3JhbnQgcmVjb3JkcywgcGVyLWdyYW50IGFwcGxpY2F0aW9ucywgb3Blbi1lc2Nyb3cgdG90YWwsCi8vIGRlYWRsaW5lcywgYW5kIHJvbGVzLgovLwovLyBMSUZFQ1lDTEUgKHRlcm1pbmFsIHN0YXRlcyBhcmUgZnJvemVuOyBvbmUgdHJhbnNpdGlvbiBwZXIgZ3JhbnQpOgovLwovLwlDcmVhdGVHcmFudCAoRU9BICsgLXNlbmQpICAgICA6IGVzY3JvdyAtPiBvcGVuVG90YWwsIHN0YXR1cyBPcGVuLAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlZSBicHMgU05BUFNIT1RURUQgYXQgY3JlYXRpb24KLy8JQXBwbHkgKGFsc28gcmUtYXBwbHkvdXBkYXRlKSAgOiB3aGlsZSBPcGVuIGFuZCBoZWlnaHQgPCBkZWFkbGluZTsKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXllZCBieSB0aGUgY2FsbGVyJ3Mgb3duIGFkZHJlc3MKLy8JU2VsZWN0V2lubmVyIChjcmVhdG9yIG9ubHkpICAgOiBPcGVuIC0+IEF3YXJkZWQ7IHdpbm5lciBNVVNUIGJlIGFuCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYW50OyBlc2Nyb3cgLT4gd2lubmVyJ3MKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFpbWFibGUgYmFsYW5jZSBtaW51cyB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdHRlZCBmZWUKLy8JQ2FuY2VsR3JhbnQgKGNyZWF0b3Igb25seSkgICAgOiBPcGVuIC0+IENhbmNlbGxlZDsgZmVlLWZyZWUgcmVmdW5kCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGNyZWF0b3IncyBjbGFpbWFibGUgYmFsYW5jZQovLwlFeHBpcmVHcmFudCAoQU5ZT05FKSAgICAgICAgICA6IE9wZW4gLT4gRXhwaXJlZCBvbmNlIGhlaWdodCA+PQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWRsaW5lICsgRXhwaXJ5R3JhY2VCbG9ja3M7Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVlLWZyZWUgcmVmdW5kIHRvIHRoZSBjcmVhdG9yIOKAlAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwZXJtaXNzaW9ubGVzcyB2YWx2ZSB0aGF0IG1ha2VzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuZC10cmFwcGluZyBpbXBvc3NpYmxlCi8vCUNsYWltIC8gQ2xhaW1BbGwgKGFueW9uZSkgICAgIDogcGF5cyBvdXQgdGhlIGNhbGxlcidzIG93biBsZWRnZXIKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlICh3aW5uZXJzIGFuZCByZWZ1bmRzKQovLwlXaXRoZHJhd0ZlZXMgKGZlZSByZWNpcGllbnQpICA6IHBheXMgb3V0IHRoZSBmZWUgcG90Ci8vCi8vIEFVVEhPUklaQVRJT046IGV2ZXJ5IGlkZW50aXR5IGlzIGRlcml2ZWQgZnJvbSB0aGUgY3Jvc3NpbmcKLy8gZW50cnlwb2ludCdzIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSDigJQgbm8gZnVuY3Rpb24gdGFrZXMgYSBjYWxsZXIKLy8gaWRlbnRpdHkgYXMgYSBwYXJhbWV0ZXIuIEFwcGxpY2F0aW9ucyBhbmQgY2xhaW1hYmxlIGJhbGFuY2VzIGFyZQovLyBrZXllZCBieSB0aGF0IHJ1bnRpbWUtZGVyaXZlZCBhZGRyZXNzLCBzbyBhbHRlcmluZyBhbm90aGVyIHVzZXIncwovLyBhcHBsaWNhdGlvbiBvciBjbGFpbWluZyBhbm90aGVyIHVzZXIncyBncmFudCBpcyBpbXBvc3NpYmxlIGJ5Ci8vIGNvbnN0cnVjdGlvbi4gVGhlIGNyZWF0b3IgY2Fubm90IGFwcGx5IHRvIHRoZWlyIG93biBncmFudCwgYW5kCi8vIFNlbGVjdFdpbm5lciBvbmx5IGFjY2VwdHMgYWRkcmVzc2VzIHRoYXQgYWN0dWFsbHkgYXBwbGllZC4KLy8KLy8gREVBRExJTkUgU0VNQU5USUNTOiBkZWFkbGluZSA9IENoYWluSGVpZ2h0KCkgKyBkdXJhdGlvbkJsb2NrcywKLy8gZml4ZWQgYXQgY3JlYXRpb24gKGJvdW5kZWQgYnkgW01pbkR1cmF0aW9uQmxvY2tzLCBNYXhEdXJhdGlvbkJsb2Nrc10pLgovLyBUaGUgZGVhZGxpbmUgZ2F0ZXMgTkVXL1VQREFURUQgYXBwbGljYXRpb25zIG9ubHk7IHRoZSBjcmVhdG9yIG1heQovLyBzZWxlY3Qgb3IgY2FuY2VsIGF0IGFueSB0aW1lIHdoaWxlIHRoZSBncmFudCBpcyBPcGVuLiBBZnRlcgovLyBkZWFkbGluZSArIEV4cGlyeUdyYWNlQmxvY2tzIGFueW9uZSBtYXkgZXhwaXJlIHRoZSBncmFudC4KLy8KLy8gRkVFIE1PREVMOiBmZWUgPSBmbG9vcihhbW91bnQgKiBicHMgLyAxMDAwMCksIHJvdW5kaW5nIGZhdm9ycyB0aGUKLy8gd2lubmVyOyBubyBtaW5pbXVtIGZlZTsgYnBzIHNuYXBzaG90dGVkIGludG8gdGhlIGdyYW50IGF0IGNyZWF0aW9uLAovLyBzbyBTZXRGZWVCcHMgYWZmZWN0cyBmdXR1cmUgZ3JhbnRzIG9ubHkgKGNsb3NlcyB0aGUgQVdBUkQtdGltZQovLyBhZG1pbiByYWNlKSwgYW5kIENyZWF0ZUdyYW50IHRha2VzIHRoZSBjYWxsZXIncyBvd24gbWF4RmVlQnBzCi8vIGNlaWxpbmcsIHJlamVjdGluZyBjcmVhdGlvbiBpZiB0aGUgbGl2ZSBmZWUgZXhjZWVkcyB3aGF0IHRoZQovLyBjcmVhdG9yIHNpZ25lZCBmb3IgKGNsb3NlcyB0aGUgQ1JFQVRJT04tdGltZSByYWNlIOKAlCBhdWRpdCBZMSk7Ci8vIGhhcmQgY29tcGlsZS10aW1lIGNhcCBNYXhGZWVCcHMgKDEwJSk7IHJlZnVuZHMgKGNhbmNlbC9leHBpcmUpIGFyZQovLyBhbHdheXMgZmVlLWZyZWU7IHRoZSBwb3QgaXMgd2l0aGRyYXdhYmxlIGJ5IHRoZSBmZWUtcmVjaXBpZW50IHJvbGUuCi8vCi8vIE1PTkVUQVJZIElOVkFSSUFOVCAoY29uc2VydmF0aW9uKTogbGV0IEggYmUgdWdub3QgaGVsZCBhdCB0aGlzCi8vIHJlYWxtJ3MgYWRkcmVzcywgRyA9IG9wZW5Ub3RhbCAozqMgYW1vdW50IG92ZXIgT3BlbiBncmFudHMpLCBVIHRoZQovLyBsZWRnZXIncyBjbGFpbWFibGUgYmFsYW5jZXMsIEYgdGhlIGZlZSBwb3QsIFMgPj0gMCBvdXQtb2YtYmFuZAovLyBzdXJwbHVzOgovLwovLwlIID09IEcgKyBVICsgRiArIFMKLy8KLy8gRXZlcnkgdHJhbnNpdGlvbiBtb3ZlcyB2YWx1ZSBiZXR3ZWVuIGV4YWN0bHkgdHdvIHRlcm1zIGluc2lkZSBvbmUKLy8gdHJhbnNhY3Rpb246IENyZWF0ZUdyYW50IHJhaXNlcyBIIGFuZCBHIHRvZ2V0aGVyIChjb2luaW8uUmVjZWl2ZSBpcwovLyB0aGUgcmVjZWlwdC1ndWFyYW50ZWVkIHNoYXBlLCB2YWxpZGF0ZWQgbGl2ZSBvbiBwZWFybC0xKTsKLy8gU2VsZWN0V2lubmVyL0NhbmNlbEdyYW50L0V4cGlyZUdyYW50IG1vdmUgYW1vdW50IGZyb20gRyBpbnRvIFUrRgovLyB3aXRoIGZlZWxlZGdlciBndWFyYW50ZWVpbmcgY3JlZGl0ZWQgKyBmZWUgPT0gYW1vdW50OyBjbGFpbXMgYW5kIGZlZQovLyB3aXRoZHJhd2FsIGRlYml0IHRoZSBsZWRnZXIgYmVmb3JlIGNvaW5pby5QYXlvdXQgbW92ZXMgdGhlIGlkZW50aWNhbAovLyBhbW91bnQgb3V0IChjaGVja3MtZWZmZWN0cy1pbnRlcmFjdGlvbnMpOyBhbnkgcGFuaWMgYWJvcnRzIHRoZSB3aG9sZQovLyB0cmFuc2FjdGlvbjsgdGhpcyByZWFsbSBuZXZlciBpc3N1ZXMgb3IgcmVtb3ZlcyBjb2lucy4gU3VycGx1cyBpcwovLyByZWNvdmVyYWJsZSBvbmx5IHZpYSBTd2VlcERlbm9tIChmZWUgcmVjaXBpZW50KSwgd2hpY2ggcmVzZXJ2ZXMKLy8gTGlhYmlsaXRpZXMoKSA9IEcgKyBVICsgRi4KLy8KLy8gT05MWSBHTk9UOiBDcmVhdGVHcmFudCByZWplY3RzIGFueSBlbnZlbG9wZSB0aGF0IGlzIG5vdCBleGFjdGx5IG9uZQovLyBwb3NpdGl2ZSB1Z25vdCBjb2luIChjb2luaW8uUmVjZWl2ZSkuIEZvcmVpZ24gZGVub21pbmF0aW9ucyBzaXQgaW4KLy8gc3VycGx1cy4KcGFja2FnZSBncmFudHMKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvY29pbmlvIgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9mZWVsZWRnZXIiCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCgkiZ25vLmxhbmQvcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MCIKKQoKLy8gRGVub20gaXMgdGhlIG9ubHkgYXNzZXQgdGhpcyByZWFsbSBhY2NlcHRzLgpjb25zdCBEZW5vbSA9ICJ1Z25vdCIKCi8vIE1heEZlZUJwcyBpcyB0aGUgaGFyZCBwcm90b2NvbC1mZWUgY2FwOiAxMDAwIGJwcyA9IDEwJS4KY29uc3QgTWF4RmVlQnBzID0gaW50NjQoMTAwMCkKCi8vIEdyYW50IHN0YXR1cyB2YWx1ZXMuCmNvbnN0ICgKCVN0YXR1c09wZW4gICAgICA9ICJvcGVuIgoJU3RhdHVzQXdhcmRlZCAgID0gImF3YXJkZWQiCglTdGF0dXNDYW5jZWxsZWQgPSAiY2FuY2VsbGVkIgoJU3RhdHVzRXhwaXJlZCAgID0gImV4cGlyZWQiCikKCi8vIElucHV0IGJvdW5kcy4KY29uc3QgKAoJTWF4VGl0bGVMZW4gPSA4MAoJTWF4RGVzY0xlbiAgPSAyMDAwCglNYXhQaXRjaExlbiA9IDEwMDAKCgkvLyBNaW5EdXJhdGlvbkJsb2NrcyAvIE1heER1cmF0aW9uQmxvY2tzIGJvdW5kIHRoZSBhcHBsaWNhdGlvbgoJLy8gd2luZG93IGEgY3JlYXRvciBtYXkgY29uZmlndXJlICh+NXMgYmxvY2tzOiAxIGJsb2NrIHRvIH41ODAgZGF5cykuCglNaW5EdXJhdGlvbkJsb2NrcyA9IGludDY0KDEpCglNYXhEdXJhdGlvbkJsb2NrcyA9IGludDY0KDEwXzAwMF8wMDApCgoJLy8gRXhwaXJ5R3JhY2VCbG9ja3MgYWZ0ZXIgdGhlIGRlYWRsaW5lLCBhbiBPcGVuIGdyYW50IGJlY29tZXMKCS8vIGV4cGlyYWJsZSBieSBhbnlvbmUgKH44IG1pbnV0ZXMgYXQgNXMgYmxvY2tzIOKAlCBzaG9ydCBiZWNhdXNlCgkvLyB0aGlzIGlzIGEgdGVzdG5ldCBkZXBsb3ltZW50OyBhIHByb2R1Y3Rpb24gZm9yayB3b3VsZCByYWlzZSBpdCkuCglFeHBpcnlHcmFjZUJsb2NrcyA9IGludDY0KDEwMCkKKQoKdHlwZSBhcHBsaWNhdGlvbiBzdHJ1Y3QgewoJcGl0Y2ggIHN0cmluZwoJaGVpZ2h0IGludDY0IC8vIGJsb2NrIGhlaWdodCBvZiB0aGUgbGF0ZXN0IChyZSlzdWJtaXNzaW9uCn0KCnR5cGUgZ3JhbnQgc3RydWN0IHsKCWlkICAgICAgICAgIGludDY0CgljcmVhdG9yICAgICBhZGRyZXNzCgl0aXRsZSAgICAgICBzdHJpbmcKCWRlc2NyaXB0aW9uIHN0cmluZwoJYW1vdW50ICAgICAgaW50NjQKCWZlZUJwcyAgICAgIGludDY0IC8vIHNuYXBzaG90dGVkIGF0IGNyZWF0aW9uLCBjaGFyZ2VkIGF0IGF3YXJkCglkZWFkbGluZSAgICBpbnQ2NCAvLyBibG9jayBoZWlnaHQ7IGFwcGxpY2F0aW9ucyBjbG9zZSBoZXJlCglzdGF0dXMgICAgICBzdHJpbmcKCXdpbm5lciAgICAgIGFkZHJlc3MgICAvLyBzZXQgaWZmIHN0YXR1cyA9PSBTdGF0dXNBd2FyZGVkCglhcHBzICAgICAgICAqYXZsLlRyZWUgLy8gYXBwbGljYW50IGFkZHJlc3Mgc3RyaW5nIC0+ICphcHBsaWNhdGlvbgoJbnVtQXBwcyAgICAgaW50NjQKfQoKdmFyICgKCWFkbWluICAgICAgICBhZGRyZXNzIC8vIG1heSBzZXQgZmVlLCBmZWUgcmVjaXBpZW50LCBzdWNjZXNzb3IgYWRtaW4KCWZlZVJlY2lwaWVudCBhZGRyZXNzIC8vIG1heSB3aXRoZHJhdyBmZWVzIGFuZCBzd2VlcCBzdXJwbHVzCglmZWVCcHMgICAgICAgaW50NjQgICAvLyBmZWUgc25hcHNob3R0ZWQgaW50byBORVcgZ3JhbnRzCgoJc2VsZiAgICAgIGFkZHJlc3MgLy8gdGhpcyByZWFsbSdzIGFkZHJlc3MsIGNhcHR1cmVkIGF0IGRlcGxveQoJbmV4dElEICAgIGludDY0CglvcGVuVG90YWwgaW50NjQgLy8gPT0gzqMgYW1vdW50IG92ZXIgZ3JhbnRzIHdpdGggc3RhdHVzIE9wZW4KCglncmFudHMgPSBhdmwuTmV3VHJlZSgpIC8vIHBhZElEKGlkKSAtPiAqZ3JhbnQKCWxlZGdlciA9IGZlZWxlZGdlci5NdXN0TmV3KE1heEZlZUJwcykKKQoKZnVuYyBpbml0KCkgewoJYWRtaW4gPSB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkKCWZlZVJlY2lwaWVudCA9IGFkbWluCglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQp9CgovLyBDcmVhdGVHcmFudCBlc2Nyb3dzIHRoZSBhdHRhY2hlZCBHTk9UIGFzIGEgbmV3IG9wZW4gZ3JhbnQgYW5kCi8vIHJldHVybnMgaXRzIGlkLiBPbmx5IGRpcmVjdCBFT0EgY2FsbHMgd2l0aCAtc2VuZCBhcmUgYWNjZXB0ZWQuIFRoZQovLyBjdXJyZW50IHByb3RvY29sIGZlZSBpcyBzbmFwc2hvdHRlZCBpbnRvIHRoZSBncmFudCDigJQgYW5kIG11c3Qgbm90Ci8vIGV4Y2VlZCBtYXhGZWVCcHMsIHRoZSBjZWlsaW5nIHRoZSBjYWxsZXIgc2lnbmVkIGZvciAocmVqZWN0cyBhIGZlZQovLyByYWlzZSBzZXF1ZW5jZWQgYWhlYWQgb2YgdGhpcyB0cmFuc2FjdGlvbik7IHBhc3MgTWF4RmVlQnBzIHRvCi8vIGFjY2VwdCBhbnkgbGVnYWwgZmVlLiBUaGUgYXBwbGljYXRpb24gd2luZG93IGlzIGR1cmF0aW9uQmxvY2tzIGZyb20KLy8gbm93LgpmdW5jIENyZWF0ZUdyYW50KGN1ciByZWFsbSwgdGl0bGUsIGRlc2NyaXB0aW9uIHN0cmluZywgZHVyYXRpb25CbG9ja3MsIG1heEZlZUJwcyBpbnQ2NCkgaW50NjQgewoJY3JlYXRvciwgYW1vdW50IDo9IGNvaW5pby5SZWNlaXZlKDAsIGN1ciwgRGVub20pCglpZiBmZWVCcHMgPiBtYXhGZWVCcHMgewoJCXBhbmljKCJjdXJyZW50IGZlZSAiICsgaXRvYShmZWVCcHMpICsgIiBicHMgZXhjZWVkcyB0aGUgY2FsbGVyJ3MgbWF4aW11bSAiICsgaXRvYShtYXhGZWVCcHMpKQoJfQoJYXNzZXJ0VmFsaWRUaXRsZSh0aXRsZSkKCWlmIGxlbihkZXNjcmlwdGlvbikgPT0gMCB8fCBsZW4oZGVzY3JpcHRpb24pID4gTWF4RGVzY0xlbiB7CgkJcGFuaWMoImRlc2NyaXB0aW9uIG11c3QgYmUgMS0iICsgc3RyY29udi5JdG9hKE1heERlc2NMZW4pICsgIiBieXRlcyIpCgl9CglpZiBkdXJhdGlvbkJsb2NrcyA8IE1pbkR1cmF0aW9uQmxvY2tzIHx8IGR1cmF0aW9uQmxvY2tzID4gTWF4RHVyYXRpb25CbG9ja3MgewoJCXBhbmljKCJkdXJhdGlvbkJsb2NrcyBvdXQgb2YgcmFuZ2UgWyIgKyBpdG9hKE1pbkR1cmF0aW9uQmxvY2tzKSArICIsICIgKyBpdG9hKE1heER1cmF0aW9uQmxvY2tzKSArICJdIikKCX0KCgluZXdPcGVuVG90YWwsIG9rIDo9IGNoZWNrZWRBZGQob3BlblRvdGFsLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJvcGVuIGVzY3JvdyBvdmVyZmxvdyIpCgl9CgoJbmV4dElEKysKCWcgOj0gJmdyYW50ewoJCWlkOiAgICAgICAgICBuZXh0SUQsCgkJY3JlYXRvcjogICAgIGNyZWF0b3IsCgkJdGl0bGU6ICAgICAgIHRpdGxlLAoJCWRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiwKCQlhbW91bnQ6ICAgICAgYW1vdW50LAoJCWZlZUJwczogICAgICBmZWVCcHMsCgkJZGVhZGxpbmU6ICAgIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSArIGR1cmF0aW9uQmxvY2tzLAoJCXN0YXR1czogICAgICBTdGF0dXNPcGVuLAoJCWFwcHM6ICAgICAgICBhdmwuTmV3VHJlZSgpLAoJfQoJZ3JhbnRzLlNldChwYWRJRChnLmlkKSwgZykKCW9wZW5Ub3RhbCA9IG5ld09wZW5Ub3RhbAoKCWNoYWluLkVtaXQoIkdyYW50Q3JlYXRlZCIsCgkJImlkIiwgaXRvYShnLmlkKSwKCQkiY3JlYXRvciIsIGNyZWF0b3IuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkiZmVlQnBzIiwgaXRvYShnLmZlZUJwcyksCgkJImRlYWRsaW5lIiwgaXRvYShnLmRlYWRsaW5lKSwKCSkKCXJldHVybiBnLmlkCn0KCi8vIEFwcGx5IHN1Ym1pdHMgKG9yIHJlLXN1Ym1pdHMpIHRoZSBjYWxsZXIncyBhcHBsaWNhdGlvbiB0byBhbiBvcGVuCi8vIGdyYW50IGJlZm9yZSBpdHMgZGVhZGxpbmUuIE9uZSBhcHBsaWNhdGlvbiBwZXIgYWRkcmVzcyBwZXIgZ3JhbnQg4oCUCi8vIHJlLWFwcGx5aW5nIHJlcGxhY2VzIHRoZSBjYWxsZXIncyBvd24gcGl0Y2ggb25seS4gVGhlIGNyZWF0b3IgY2Fubm90Ci8vIGFwcGx5IHRvIHRoZWlyIG93biBncmFudC4KZnVuYyBBcHBseShjdXIgcmVhbG0sIGlkIGludDY0LCBwaXRjaCBzdHJpbmcpIHsKCWFwcGxpY2FudCA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWcgOj0gbXVzdEdldEdyYW50KGlkKQoJaWYgZy5zdGF0dXMgIT0gU3RhdHVzT3BlbiB7CgkJcGFuaWMoImdyYW50IGlzIG5vdCBvcGVuIikKCX0KCWlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA+PSBnLmRlYWRsaW5lIHsKCQlwYW5pYygiYXBwbGljYXRpb24gZGVhZGxpbmUgaGFzIHBhc3NlZCIpCgl9CglpZiBhcHBsaWNhbnQgPT0gZy5jcmVhdG9yIHsKCQlwYW5pYygidGhlIGNyZWF0b3IgY2Fubm90IGFwcGx5IHRvIHRoZWlyIG93biBncmFudCIpCgl9CglpZiBsZW4ocGl0Y2gpID09IDAgfHwgbGVuKHBpdGNoKSA+IE1heFBpdGNoTGVuIHsKCQlwYW5pYygicGl0Y2ggbXVzdCBiZSAxLSIgKyBzdHJjb252Lkl0b2EoTWF4UGl0Y2hMZW4pICsgIiBieXRlcyIpCgl9CgoJa2V5IDo9IGFwcGxpY2FudC5TdHJpbmcoKQoJaWYgZy5hcHBzLkdldChrZXkpID09IG5pbCB7CgkJZy5udW1BcHBzKysKCX0KCWcuYXBwcy5TZXQoa2V5LCAmYXBwbGljYXRpb257cGl0Y2g6IHBpdGNoLCBoZWlnaHQ6IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKX0pCgoJY2hhaW4uRW1pdCgiQXBwbGllZCIsICJpZCIsIGl0b2EoaWQpLCAiYXBwbGljYW50Iiwga2V5KQp9CgovLyBTZWxlY3RXaW5uZXIgYXdhcmRzIGFuIG9wZW4gZ3JhbnQgdG8gb25lIG9mIGl0cyBhcHBsaWNhbnRzOiB0aGUKLy8gZXNjcm93IGxlYXZlcyB0aGUgb3BlbiBwb29sIGFuZCBpcyBjcmVkaXRlZCB0byB0aGUgd2lubmVyJ3MKLy8gY2xhaW1hYmxlIGJhbGFuY2UgdGhyb3VnaCB0aGUgbGVkZ2VyLCBjaGFyZ2luZyB0aGUgZmVlIHNuYXBzaG90dGVkCi8vIGF0IGNyZWF0aW9uLiBPbmx5IHRoZSBncmFudCdzIGNyZWF0b3IgbWF5IHNlbGVjdCwgYW5kIG9ubHkgYW4KLy8gYWRkcmVzcyB0aGF0IGFjdHVhbGx5IGFwcGxpZWQgY2FuIHdpbi4gVGVybWluYWwuCmZ1bmMgU2VsZWN0V2lubmVyKGN1ciByZWFsbSwgaWQgaW50NjQsIHdpbm5lciBhZGRyZXNzKSB7CgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglnIDo9IG11c3RHZXRHcmFudChpZCkKCWlmIGNhbGxlciAhPSBnLmNyZWF0b3IgewoJCXBhbmljKCJvbmx5IHRoZSBncmFudCBjcmVhdG9yIG1heSBzZWxlY3QgYSB3aW5uZXIiKQoJfQoJaWYgZy5zdGF0dXMgIT0gU3RhdHVzT3BlbiB7CgkJcGFuaWMoImdyYW50IGlzIG5vdCBvcGVuIikKCX0KCWlmIGcuYXBwcy5HZXQod2lubmVyLlN0cmluZygpKSA9PSBuaWwgewoJCXBhbmljKCJ3aW5uZXIgbXVzdCBiZSBhbiBhcHBsaWNhbnQgb2YgdGhpcyBncmFudCIpCgl9CgoJLy8gTW92ZSB0aGUgZXNjcm93IGZyb20gYXBwbGljYXRpb24gc3RhdGUgaW50byBsZWRnZXIgbGlhYmlsaXRpZXMgaW4KCS8vIG9uZSB0cmFuc2FjdGlvbiwgYXQgdGhlIHNuYXBzaG90dGVkIGZlZS4gZmVlbGVkZ2VyIHZhbGlkYXRlcwoJLy8gYmVmb3JlIG11dGF0aW5nOyBhbiBlcnJvciBhYm9ydHMgZXZlcnl0aGluZyBhbmQgbGVhdmVzIHRoZSBncmFudAoJLy8gT3BlbiAodGhlIGNyZWF0b3IgY2FuIHJldHJ5IG9yIGNhbmNlbCkuCgljcmVkaXRlZCwgZmVlLCBlcnIgOj0gbGVkZ2VyLkRlcG9zaXQod2lubmVyLlN0cmluZygpLCBnLmFtb3VudCwgZy5mZWVCcHMpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglvcGVuVG90YWwgLT0gZy5hbW91bnQgLy8gPj0gMDogb3BlblRvdGFsID09IM6jIG9wZW4gYW1vdW50cyA+PSBnLmFtb3VudAoJZy5zdGF0dXMgPSBTdGF0dXNBd2FyZGVkCglnLndpbm5lciA9IHdpbm5lcgoKCWNoYWluLkVtaXQoIkdyYW50QXdhcmRlZCIsCgkJImlkIiwgaXRvYShpZCksCgkJIndpbm5lciIsIHdpbm5lci5TdHJpbmcoKSwKCQkiY3JlZGl0ZWQiLCBpdG9hKGNyZWRpdGVkKSwKCQkiZmVlIiwgaXRvYShmZWUpLAoJKQp9CgovLyBDYW5jZWxHcmFudCBjbG9zZXMgYW4gb3BlbiBncmFudCBhbmQgcmVmdW5kcyBpdHMgZXNjcm93IHRvIHRoZQovLyBjcmVhdG9yJ3MgY2xhaW1hYmxlIGJhbGFuY2UsIGZlZS1mcmVlLiBPbmx5IHRoZSBjcmVhdG9yIG1heSBjYW5jZWwuCi8vIFRlcm1pbmFsLgpmdW5jIENhbmNlbEdyYW50KGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWcgOj0gbXVzdEdldEdyYW50KGlkKQoJaWYgY2FsbGVyICE9IGcuY3JlYXRvciB7CgkJcGFuaWMoIm9ubHkgdGhlIGdyYW50IGNyZWF0b3IgbWF5IGNhbmNlbCIpCgl9CglpZiBnLnN0YXR1cyAhPSBTdGF0dXNPcGVuIHsKCQlwYW5pYygiZ3JhbnQgaXMgbm90IG9wZW4iKQoJfQoJcmVmdW5kT3BlbihnLCBTdGF0dXNDYW5jZWxsZWQpCgljaGFpbi5FbWl0KCJHcmFudENhbmNlbGxlZCIsICJpZCIsIGl0b2EoaWQpLCAiY3JlYXRvciIsIGcuY3JlYXRvci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoZy5hbW91bnQpKQp9CgovLyBFeHBpcmVHcmFudCBjbG9zZXMgYW4gb3BlbiBncmFudCB3aG9zZSBkZWFkbGluZSBwYXNzZWQgbW9yZSB0aGFuCi8vIEV4cGlyeUdyYWNlQmxvY2tzIGFnbywgcmVmdW5kaW5nIHRoZSBjcmVhdG9yIGZlZS1mcmVlLiBBTllPTkUgbWF5Ci8vIGNhbGwgaXQg4oCUIHRoaXMgaXMgdGhlIHBlcm1pc3Npb25sZXNzIHZhbHZlIHRoYXQgZ3VhcmFudGVlcyBlc2Nyb3cKLy8gY2FuIG5ldmVyIGJlIHRyYXBwZWQgYnkgYW4gaW5hY3RpdmUgY3JlYXRvci4gVGVybWluYWwuCmZ1bmMgRXhwaXJlR3JhbnQoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJZyA6PSBtdXN0R2V0R3JhbnQoaWQpCglpZiBnLnN0YXR1cyAhPSBTdGF0dXNPcGVuIHsKCQlwYW5pYygiZ3JhbnQgaXMgbm90IG9wZW4iKQoJfQoJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpIDwgZy5kZWFkbGluZStFeHBpcnlHcmFjZUJsb2NrcyB7CgkJcGFuaWMoImdyYW50IGlzIG5vdCBleHBpcmFibGUgeWV0IikKCX0KCXJlZnVuZE9wZW4oZywgU3RhdHVzRXhwaXJlZCkKCWNoYWluLkVtaXQoIkdyYW50RXhwaXJlZCIsICJpZCIsIGl0b2EoZy5pZCksICJjcmVhdG9yIiwgZy5jcmVhdG9yLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShnLmFtb3VudCkpCn0KCi8vIHJlZnVuZE9wZW4gbW92ZXMgYW4gT3BlbiBncmFudCdzIGVzY3JvdyBpbnRvIHRoZSBjcmVhdG9yJ3MgY2xhaW1hYmxlCi8vIGJhbGFuY2UgZmVlLWZyZWUgYW5kIGZpbmFsaXplcyB0aGUgc3RhdHVzLiBDYWxsZXJzIGhhdmUgYWxyZWFkeQovLyB2ZXJpZmllZCBhdXRob3JpemF0aW9uIGFuZCBzdGF0dXMuCmZ1bmMgcmVmdW5kT3BlbihnICpncmFudCwgdGVybWluYWwgc3RyaW5nKSB7CglpZiBfLCBfLCBlcnIgOj0gbGVkZ2VyLkRlcG9zaXQoZy5jcmVhdG9yLlN0cmluZygpLCBnLmFtb3VudCwgMCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCW9wZW5Ub3RhbCAtPSBnLmFtb3VudAoJZy5zdGF0dXMgPSB0ZXJtaW5hbAp9CgovLyBDbGFpbSBzZW5kcyBhbW91bnQgdWdub3Qgb2YgdGhlIGNhbGxlcidzIGNsYWltYWJsZSBiYWxhbmNlICh3b24KLy8gZ3JhbnRzIGFuZCByZWZ1bmRzKSBiYWNrIHRvIHRoZSBjYWxsZXIuCmZ1bmMgQ2xhaW0oY3VyIHJlYWxtLCBhbW91bnQgaW50NjQpIHsKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGVyciA6PSBsZWRnZXIuV2l0aGRyYXcoY2FsbGVyLlN0cmluZygpLCBhbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cgljb2luaW8uUGF5b3V0KDAsIGN1ciwgY2FsbGVyLCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiQ2xhaW0iLCAidG8iLCBjYWxsZXIuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIENsYWltQWxsIHNlbmRzIHRoZSBjYWxsZXIncyBlbnRpcmUgY2xhaW1hYmxlIGJhbGFuY2UgYmFjayB0byB0aGUKLy8gY2FsbGVyLiBGYWlscyBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGNsYWltLgpmdW5jIENsYWltQWxsKGN1ciByZWFsbSkgewoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYW1vdW50LCBlcnIgOj0gbGVkZ2VyLldpdGhkcmF3QWxsKGNhbGxlci5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWlmIGFtb3VudCA9PSAwIHsKCQlwYW5pYygibm90aGluZyB0byBjbGFpbSIpCgl9Cgljb2luaW8uUGF5b3V0KDAsIGN1ciwgY2FsbGVyLCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiQ2xhaW0iLCAidG8iLCBjYWxsZXIuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIFdpdGhkcmF3RmVlcyBzZW5kcyB0aGUgYWNjcnVlZCBmZWUgcG90IHRvIHRoZSBmZWUgcmVjaXBpZW50LiBPbmx5Ci8vIHRoZSBmZWUgcmVjaXBpZW50IG1heSBjYWxsIGl0LgpmdW5jIFdpdGhkcmF3RmVlcyhjdXIgcmVhbG0pIHsKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGNhbGxlciAhPSBmZWVSZWNpcGllbnQgewoJCXBhbmljKCJvbmx5IHRoZSBmZWUgcmVjaXBpZW50IG1heSB3aXRoZHJhdyBmZWVzIikKCX0KCWlmIGxlZGdlci5GZWVzQWNjcnVlZCgpID09IDAgewoJCXBhbmljKCJubyBmZWVzIGFjY3J1ZWQiKQoJfQoJYW1vdW50IDo9IGxlZGdlci5XaXRoZHJhd0ZlZXMoKQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGZlZVJlY2lwaWVudCwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkZlZXNXaXRoZHJhd24iLCAidG8iLCBmZWVSZWNpcGllbnQuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIFN3ZWVwRGVub20gc2VuZHMgdGhlIHN1cnBsdXMgb2YgYSBzaW5nbGUgZGVub21pbmF0aW9uIHRvIHRoZSBmZWUKLy8gcmVjaXBpZW50LiBGb3IgdWdub3Qgb25seSB0aGUgZXhjZXNzIG92ZXIgTGlhYmlsaXRpZXMoKSBtb3Zlczsgb3RoZXIKLy8gZGVub21zIG1vdmUgd2hvbGx5LiBPbmx5IHRoZSBmZWUgcmVjaXBpZW50IG1heSBjYWxsIGl0LgpmdW5jIFN3ZWVwRGVub20oY3VyIHJlYWxtLCBkZW5vbSBzdHJpbmcpIHsKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGNhbGxlciAhPSBmZWVSZWNpcGllbnQgewoJCXBhbmljKCJvbmx5IHRoZSBmZWUgcmVjaXBpZW50IG1heSBzd2VlcCBzdXJwbHVzIikKCX0KCXJlc2VydmUgOj0gaW50NjQoMCkKCWlmIGRlbm9tID09IERlbm9tIHsKCQlyZXNlcnZlID0gTGlhYmlsaXRpZXMoKQoJfQoJc3dlcHQgOj0gY29pbmlvLlN3ZWVwKDAsIGN1ciwgZmVlUmVjaXBpZW50LCBkZW5vbSwgcmVzZXJ2ZSkKCWNoYWluLkVtaXQoIlN1cnBsdXNTd2VwdCIsICJ0byIsIGZlZVJlY2lwaWVudC5TdHJpbmcoKSwgImNvaW5zIiwgaXRvYShzd2VwdCkrZGVub20pCn0KCi8vIFNldEZlZUJwcyBzZXRzIHRoZSBwcm90b2NvbCBmZWUgc25hcHNob3R0ZWQgaW50byBGVVRVUkUgZ3JhbnRzIGF0Ci8vIGNyZWF0aW9uLiBFeGlzdGluZyBncmFudHMga2VlcCB0aGUgZmVlIHRoZXkgd2VyZSBjcmVhdGVkIHVuZGVyLgovLyBBZG1pbiBvbmx5OyBib3VuZGVkIGJ5IFswLCBNYXhGZWVCcHNdLgpmdW5jIFNldEZlZUJwcyhjdXIgcmVhbG0sIGJwcyBpbnQ2NCkgewoJYXNzZXJ0QWRtaW4oY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJaWYgYnBzIDwgMCB8fCBicHMgPiBNYXhGZWVCcHMgewoJCXBhbmljKCJmZWUgYnBzIG91dCBvZiByYW5nZSBbMCwgIiArIGl0b2EoTWF4RmVlQnBzKSArICJdIikKCX0KCW9sZCA6PSBmZWVCcHMKCWZlZUJwcyA9IGJwcwoJY2hhaW4uRW1pdCgiRmVlQnBzQ2hhbmdlZCIsICJvbGQiLCBpdG9hKG9sZCksICJuZXciLCBpdG9hKGJwcykpCn0KCi8vIFNldEZlZVJlY2lwaWVudCByZS1wb2ludHMgdGhlIGZlZS9zdXJwbHVzIHJvbGUsIGluY2x1ZGluZyB0aGUgcG90Ci8vIGFjY3J1ZWQgc28gZmFyLiBBZG1pbiBvbmx5OyB6ZXJvIGFkZHJlc3MgcmVqZWN0ZWQuCmZ1bmMgU2V0RmVlUmVjaXBpZW50KGN1ciByZWFsbSwgbmV4dCBhZGRyZXNzKSB7Cglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCgl2YXIgemVybyBhZGRyZXNzCglpZiBuZXh0ID09IHplcm8gewoJCXBhbmljKCJlbXB0eSBmZWUgcmVjaXBpZW50IikKCX0KCW9sZCA6PSBmZWVSZWNpcGllbnQKCWZlZVJlY2lwaWVudCA9IG5leHQKCWNoYWluLkVtaXQoIkZlZVJlY2lwaWVudENoYW5nZWQiLCAib2xkIiwgb2xkLlN0cmluZygpLCAibmV3IiwgbmV4dC5TdHJpbmcoKSkKfQoKLy8gVHJhbnNmZXJBZG1pbiBoYW5kcyB0aGUgYWRtaW4gcm9sZSB0byBuZXh0LiBBZG1pbiBvbmx5OyB6ZXJvIGFkZHJlc3MKLy8gcmVqZWN0ZWQuIE9uZS1zdGVwIChkb2N1bWVudGVkIHRyYWRlLW9mZikuCmZ1bmMgVHJhbnNmZXJBZG1pbihjdXIgcmVhbG0sIG5leHQgYWRkcmVzcykgewoJYXNzZXJ0QWRtaW4oY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJdmFyIHplcm8gYWRkcmVzcwoJaWYgbmV4dCA9PSB6ZXJvIHsKCQlwYW5pYygiZW1wdHkgYWRtaW4gYWRkcmVzcyIpCgl9CglhZG1pbiA9IG5leHQKCWNoYWluLkVtaXQoIkFkbWluVHJhbnNmZXJyZWQiLCAibmV3QWRtaW4iLCBuZXh0LlN0cmluZygpKQp9CgovLyAtLS0gcmVhZC1vbmx5IHZpZXdzIC0tLQoKLy8gR3JhbnRJbmZvIHJldHVybnMgYSBncmFudCdzIGZpZWxkcyBieSB2YWx1ZTogY3JlYXRvciwgdGl0bGUsIGFtb3VudCwKLy8gc25hcHNob3R0ZWQgZmVlIGJwcywgYXBwbGljYXRpb24gZGVhZGxpbmUgKGJsb2NrIGhlaWdodCksIHN0YXR1cywKLy8gd2lubmVyICh6ZXJvIHVubGVzcyBhd2FyZGVkKSwgYW5kIG51bWJlciBvZiBhcHBsaWNhbnRzLgpmdW5jIEdyYW50SW5mbyhpZCBpbnQ2NCkgKGNyZWF0b3IgYWRkcmVzcywgdGl0bGUgc3RyaW5nLCBhbW91bnQsIGZlZUJwcywgZGVhZGxpbmUgaW50NjQsIHN0YXR1cyBzdHJpbmcsIHdpbm5lciBhZGRyZXNzLCBudW1BcHBsaWNhbnRzIGludDY0KSB7CglnIDo9IG11c3RHZXRHcmFudChpZCkKCXJldHVybiBnLmNyZWF0b3IsIGcudGl0bGUsIGcuYW1vdW50LCBnLmZlZUJwcywgZy5kZWFkbGluZSwgZy5zdGF0dXMsIGcud2lubmVyLCBnLm51bUFwcHMKfQoKLy8gRGVzY3JpcHRpb24gcmV0dXJucyBhIGdyYW50J3MgcmF3IGRlc2NyaXB0aW9uIHRleHQuCmZ1bmMgRGVzY3JpcHRpb24oaWQgaW50NjQpIHN0cmluZyB7IHJldHVybiBtdXN0R2V0R3JhbnQoaWQpLmRlc2NyaXB0aW9uIH0KCi8vIEFwcGxpY2F0aW9uT2YgcmV0dXJucyBhZGRyJ3MgcGl0Y2ggYW5kIHN1Ym1pc3Npb24gaGVpZ2h0IGZvciBhCi8vIGdyYW50LCB3aXRoIG9rIHJlcG9ydGluZyB3aGV0aGVyIGFuIGFwcGxpY2F0aW9uIGV4aXN0cy4KZnVuYyBBcHBsaWNhdGlvbk9mKGlkIGludDY0LCBhZGRyIGFkZHJlc3MpIChwaXRjaCBzdHJpbmcsIGhlaWdodCBpbnQ2NCwgb2sgYm9vbCkgewoJZyA6PSBtdXN0R2V0R3JhbnQoaWQpCgl2IDo9IGcuYXBwcy5HZXQoYWRkci5TdHJpbmcoKSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gIiIsIDAsIGZhbHNlCgl9CglhIDo9IHYuKCphcHBsaWNhdGlvbikKCXJldHVybiBhLnBpdGNoLCBhLmhlaWdodCwgdHJ1ZQp9CgovLyBBZG1pbiByZXR1cm5zIHRoZSBjdXJyZW50IGFkbWluLgpmdW5jIEFkbWluKCkgYWRkcmVzcyB7IHJldHVybiBhZG1pbiB9CgovLyBGZWVSZWNpcGllbnQgcmV0dXJucyB3aG8gbWF5IHdpdGhkcmF3IGZlZXMgYW5kIHN3ZWVwIHN1cnBsdXMuCmZ1bmMgRmVlUmVjaXBpZW50KCkgYWRkcmVzcyB7IHJldHVybiBmZWVSZWNpcGllbnQgfQoKLy8gRmVlQnBzIHJldHVybnMgdGhlIGZlZSB0aGF0IHdpbGwgYmUgc25hcHNob3R0ZWQgaW50byBuZXdseSBjcmVhdGVkCi8vIGdyYW50cyAoZXhpc3RpbmcgZ3JhbnRzIGtlZXAgdGhlaXIgb3duIHNuYXBzaG90KS4KZnVuYyBGZWVCcHMoKSBpbnQ2NCB7IHJldHVybiBmZWVCcHMgfQoKLy8gRmVlT24gcHJldmlld3MgdGhlIGZlZSBhbmQgbmV0IHBheW91dCBmb3IgYSBncmFudCBvZiBhbW91bnQgYXQgdGhlCi8vIENVUlJFTlQgRmVlQnBzLgpmdW5jIEZlZU9uKGFtb3VudCBpbnQ2NCkgKGZlZSwgY3JlZGl0ZWQgaW50NjQpIHsKCWYsIGVyciA6PSBmZWVsZWRnZXIuRmVlRm9yKGFtb3VudCwgZmVlQnBzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIGYsIGFtb3VudCAtIGYKfQoKLy8gTnVtR3JhbnRzIHJldHVybnMgaG93IG1hbnkgZ3JhbnRzIGhhdmUgZXZlciBiZWVuIGNyZWF0ZWQuCmZ1bmMgTnVtR3JhbnRzKCkgaW50NjQgeyByZXR1cm4gbmV4dElEIH0KCi8vIE9wZW5Ub3RhbCByZXR1cm5zIHRoZSBlc2Nyb3cgaGVsZCBieSBvcGVuIGdyYW50cyAodGhlIEcgdGVybSkuCmZ1bmMgT3BlblRvdGFsKCkgaW50NjQgeyByZXR1cm4gb3BlblRvdGFsIH0KCi8vIEJhbGFuY2VPZiByZXR1cm5zIGFkZHIncyBjbGFpbWFibGUgYmFsYW5jZSAod29uIGdyYW50cyArIHJlZnVuZHMpLgpmdW5jIEJhbGFuY2VPZihhZGRyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIGxlZGdlci5CYWxhbmNlT2YoYWRkci5TdHJpbmcoKSkgfQoKLy8gVXNlcnNUb3RhbCByZXR1cm5zIHRoZSBzdW0gb2YgYWxsIGNsYWltYWJsZSBiYWxhbmNlcyAodGhlIFUgdGVybSkuCmZ1bmMgVXNlcnNUb3RhbCgpIGludDY0IHsgcmV0dXJuIGxlZGdlci5Vc2Vyc1RvdGFsKCkgfQoKLy8gRmVlc0FjY3J1ZWQgcmV0dXJucyB0aGUgZmVlIHBvdCAodGhlIEYgdGVybSkuCmZ1bmMgRmVlc0FjY3J1ZWQoKSBpbnQ2NCB7IHJldHVybiBsZWRnZXIuRmVlc0FjY3J1ZWQoKSB9CgovLyBMaWFiaWxpdGllcyByZXR1cm5zIGV2ZXJ5dGhpbmcgdGhpcyByZWFsbSBvd2VzOgovLyBvcGVuVG90YWwgKyBVc2Vyc1RvdGFsICsgRmVlc0FjY3J1ZWQuCmZ1bmMgTGlhYmlsaXRpZXMoKSBpbnQ2NCB7IHJldHVybiBvcGVuVG90YWwgKyBsZWRnZXIuTGlhYmlsaXRpZXMoKSB9CgovLyBIZWxkIHJldHVybnMgdGhlIHVnbm90IGFjdHVhbGx5IGhlbGQgYXQgdGhlIHJlYWxtIGFkZHJlc3MgKEgpLgpmdW5jIEhlbGQoKSBpbnQ2NCB7IHJldHVybiBjb2luaW8uSGVsZEF0KHNlbGYsIERlbm9tKSB9CgovLyBTdXJwbHVzIHJldHVybnMgSGVsZCgpIC0gTGlhYmlsaXRpZXMoKSAodGhlIFMgdGVybSkuCmZ1bmMgU3VycGx1cygpIGludDY0IHsgcmV0dXJuIEhlbGQoKSAtIExpYWJpbGl0aWVzKCkgfQoKLy8gQWRkcmVzcyByZXR1cm5zIHRoaXMgcmVhbG0ncyBhZGRyZXNzICh0aGUgZXNjcm93IHRhcmdldCkuCmZ1bmMgQWRkcmVzcygpIGFkZHJlc3MgeyByZXR1cm4gc2VsZiB9CgovLyBIZWlnaHQgcmV0dXJucyB0aGUgY3VycmVudCBjaGFpbiBoZWlnaHQgKGRlYWRsaW5lIGFyaXRobWV0aWMgYWlkKS4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gUmVuZGVyIHNob3dzIHRoZSBtYXJrZXQgYXQgIiIgYW5kIGEgZ3JhbnQgZGV0YWlsIGF0ICI8aWQ+Ii4gRnJlZQovLyB0ZXh0ICh0aXRsZXMgYXJlIGNoYXJzZXQtcmVzdHJpY3RlZDsgZGVzY3JpcHRpb25zIGFyZSBub3QpIHBhc3NlcwovLyB0aHJvdWdoIHRoZSBlY29zeXN0ZW0gc2FuaXRpemVyIGJlZm9yZSBoaXR0aW5nIG1hcmtkb3duLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggIT0gIiIgewoJCXJldHVybiByZW5kZXJHcmFudChwYXRoKQoJfQoJaGVsZCA6PSBIZWxkKCkKCWxpYWIgOj0gTGlhYmlsaXRpZXMoKQoJc3RhdHVzIDo9ICJPSyIKCWlmIGhlbGQgPCBsaWFiIHsKCQlzdGF0dXMgPSAiVklPTEFURUQiCgl9CglvdXQgOj0gIiMgR3JhbnRzIG1hcmtldFxuXG4iCglvdXQgKz0gIkVzY3Jvd2VkIEdOT1QgZ3JhbnRzIHdpdGggb24tY2hhaW4gYXBwbGljYXRpb25zOyBhY2NvdW50aW5nIHZpYSBmZWVsZWRnZXIsIGNvaW4gSS9PIHZpYSBjb2luaW8uXG5cbiIKCW91dCArPSAiIyMgQ29uZmlndXJhdGlvblxuXG4iCglvdXQgKz0gIi0gZmVlIGZvciBuZXcgZ3JhbnRzOiAiICsgaXRvYShmZWVCcHMpICsgIiBicHMgKGNhcCAiICsgaXRvYShNYXhGZWVCcHMpICsKCQkiIGJwczsgZWFjaCBncmFudCBrZWVwcyB0aGUgZmVlIHNuYXBzaG90dGVkIGF0IGl0cyBjcmVhdGlvbilcbiIKCW91dCArPSAiLSBmZWUgcmVjaXBpZW50OiAiICsgZmVlUmVjaXBpZW50LlN0cmluZygpICsgIlxuIgoJb3V0ICs9ICItIGFkbWluOiAiICsgYWRtaW4uU3RyaW5nKCkgKyAiXG5cbiIKCW91dCArPSAiIyMgQWNjb3VudGluZyAoSCA9PSBHICsgVSArIEYgKyBTKVxuXG4iCglvdXQgKz0gIi0gb3BlbiBlc2Nyb3cgKEcpOiAiICsgaXRvYShvcGVuVG90YWwpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gY2xhaW1hYmxlIChVKTogIiArIGl0b2EobGVkZ2VyLlVzZXJzVG90YWwoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBmZWVzIGFjY3J1ZWQgKEYpOiAiICsgaXRvYShsZWRnZXIuRmVlc0FjY3J1ZWQoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBoZWxkIChIKTogIiArIGl0b2EoaGVsZCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBjb25zZXJ2YXRpb246ICIgKyBzdGF0dXMgKyAiXG5cbiIKCW91dCArPSAiIyMgTGF0ZXN0IGdyYW50c1xuXG4iCglpZiBuZXh0SUQgPT0gMCB7CgkJb3V0ICs9ICJObyBncmFudHMgeWV0LlxuIgoJCXJldHVybiBvdXQKCX0KCXNob3duIDo9IDAKCWdyYW50cy5SZXZlcnNlSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQlnIDo9IHYuKCpncmFudCkKCQlvdXQgKz0gIi0gWyMiICsgaXRvYShnLmlkKSArICJdKCIgKyAiL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9ncmFudHM6IiArIGl0b2EoZy5pZCkgKyAiKSBbIiArCgkJCWcuc3RhdHVzICsgIl0gIiArIGcudGl0bGUgKyAiIOKAlCAiICsgaXRvYShnLmFtb3VudCkgKyBEZW5vbSArCgkJCSIgKCIgKyBpdG9hKGcubnVtQXBwcykgKyAiIGFwcGxpY2FudHMpXG4iCgkJc2hvd24rKwoJCXJldHVybiBzaG93biA+PSAyMAoJfSkKCXJldHVybiBvdXQKfQoKZnVuYyByZW5kZXJHcmFudChwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlkLCBlcnIgOj0gc3RyY29udi5QYXJzZUludChwYXRoLCAxMCwgNjQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIj4gWyFXQVJOSU5HXVxuPiBpbnZhbGlkIGdyYW50IGlkXG4iCgl9Cgl2IDo9IGdyYW50cy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAiPiBbIVdBUk5JTkddXG4+IHVua25vd24gZ3JhbnQgaWRcbiIKCX0KCWcgOj0gdi4oKmdyYW50KQoJb3V0IDo9ICIjIEdyYW50ICMiICsgaXRvYShnLmlkKSArICI6ICIgKyBnLnRpdGxlICsgIlxuXG4iCglvdXQgKz0gIi0gc3RhdHVzOiAiICsgZy5zdGF0dXMgKyAiXG4iCglvdXQgKz0gIi0gY3JlYXRvcjogIiArIGcuY3JlYXRvci5TdHJpbmcoKSArICJcbiIKCW91dCArPSAiLSBhbW91bnQ6ICIgKyBpdG9hKGcuYW1vdW50KSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGZlZSAoc25hcHNob3QpOiAiICsgaXRvYShnLmZlZUJwcykgKyAiIGJwc1xuIgoJb3V0ICs9ICItIGFwcGxpY2F0aW9uIGRlYWRsaW5lOiBibG9jayAiICsgaXRvYShnLmRlYWRsaW5lKSArICIgKG5vdyAiICsgaXRvYShydW50aW1lLkNoYWluSGVpZ2h0KCkpICsgIilcbiIKCW91dCArPSAiLSBhcHBsaWNhbnRzOiAiICsgaXRvYShnLm51bUFwcHMpICsgIlxuIgoJaWYgZy5zdGF0dXMgPT0gU3RhdHVzQXdhcmRlZCB7CgkJb3V0ICs9ICItIHdpbm5lcjogIiArIGcud2lubmVyLlN0cmluZygpICsgIlxuIgoJfQoJb3V0ICs9ICJcbiMjIERlc2NyaXB0aW9uXG5cbiIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGcuZGVzY3JpcHRpb24pICsgIlxuIgoJcmV0dXJuIG91dAp9CgovLyAtLS0gaW50ZXJuYWxzIC0tLQoKZnVuYyBhc3NlcnRBZG1pbihjYWxsZXIgYWRkcmVzcykgewoJaWYgY2FsbGVyICE9IGFkbWluIHsKCQlwYW5pYygiYWRtaW4gb25seSIpCgl9Cn0KCmZ1bmMgbXVzdEdldEdyYW50KGlkIGludDY0KSAqZ3JhbnQgewoJdiA6PSBncmFudHMuR2V0KHBhZElEKGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygidW5rbm93biBncmFudCBpZCIpCgl9CglyZXR1cm4gdi4oKmdyYW50KQp9CgovLyBhc3NlcnRWYWxpZFRpdGxlIGJvdW5kcyBsZW5ndGggYW5kIHJlc3RyaWN0cyB0aGUgY2hhcnNldCBzbyB0aXRsZXMKLy8gYXJlIGxpc3Qtc2FmZSBpbiBSZW5kZXIgd2l0aG91dCBlc2NhcGluZy4KZnVuYyBhc3NlcnRWYWxpZFRpdGxlKHRpdGxlIHN0cmluZykgewoJaWYgbGVuKHRpdGxlKSA9PSAwIHx8IGxlbih0aXRsZSkgPiBNYXhUaXRsZUxlbiB7CgkJcGFuaWMoInRpdGxlIG11c3QgYmUgMS0iICsgc3RyY29udi5JdG9hKE1heFRpdGxlTGVuKSArICIgY2hhcmFjdGVycyIpCgl9Cglmb3IgaSA6PSAwOyBpIDwgbGVuKHRpdGxlKTsgaSsrIHsKCQljIDo9IHRpdGxlW2ldCgkJc3dpdGNoIHsKCQljYXNlIGMgPj0gJ2EnICYmIGMgPD0gJ3onOgoJCWNhc2UgYyA+PSAnQScgJiYgYyA8PSAnWic6CgkJY2FzZSBjID49ICcwJyAmJiBjIDw9ICc5JzoKCQljYXNlIGMgPT0gJyAnIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy0nOgoJCWRlZmF1bHQ6CgkJCXBhbmljKCJ0aXRsZSBtYXkgb25seSBjb250YWluIGxldHRlcnMsIGRpZ2l0cywgc3BhY2UsIF8gYW5kIC0iKQoJCX0KCX0KfQoKLy8gcGFkSUQgcmVuZGVycyBhbiBpZCBhcyBhIGZpeGVkLXdpZHRoIGtleSBzbyBhdmwgaXRlcmF0aW9uIG9yZGVyIGlzCi8vIG51bWVyaWMgb3JkZXIuCmZ1bmMgcGFkSUQoaWQgaW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkKCWZvciBsZW4ocykgPCAxMiB7CgkJcyA9ICIwIiArIHMKCX0KCXJldHVybiBzCn0KCmZ1bmMgaXRvYShuIGludDY0KSBzdHJpbmcgewoJcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKQp9CgpmdW5jIGNoZWNrZWRBZGQoYSwgYiBpbnQ2NCkgKGludDY0LCBib29sKSB7CglzdW0gOj0gYSArIGIKCWlmIChiID4gMCAmJiBzdW0gPCBhKSB8fCAoYiA8IDAgJiYgc3VtID4gYSkgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHN1bSwgdHJ1ZQp9CiINMTAwMDAwMDB1Z25vdBISCP795TcSCzExNzAxNnVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkCSJLUbmClBdkv9m33Db+zCnlq44Y6Sy+mYrufVo32Vj0e8QNBA//oBQ5gYL3UBjQbekNHr/BbAbIFrM/xiCC6OGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}