{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "bbP3THZFI/jqHYL3zUGWOai7WXSUsXCo0upWvId577s=",
    "height": "602213",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": [
          {
            "@type": "/tm.StorageDepositEvent",
            "bytes_delta": "37342",
            "fee_delta": "3734200ugnot",
            "pkg_path": "gno.land/r/g1ut6uspuh73e02yauxpmyt8g3wwddaq8utagvm3/timelock_guardian"
          }
        ],
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "58381194",
      "GasUsed": "38920796"
    },
    "tx": "Cs3FAQoML3ZtLm1fYWRkcGtnErvFAQooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxL+xAEKEXRpbWVsb2NrX2d1YXJkaWFuEkVnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvdGltZWxvY2tfZ3VhcmRpYW4abAoLZ25vbW9kLnRvbWwSXW1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvdGltZWxvY2tfZ3VhcmRpYW4iCmdubyA9ICIwLjkiChqywwEKFXRpbWVsb2NrX2d1YXJkaWFuLmdubxKXwwFwYWNrYWdlIHRpbWVsb2NrX2d1YXJkaWFuCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0aW1lIgopCgovLyBUYXJnZXRDb25maWcgYmluZHMgYSBuYW1lZCB0YXJnZXQgdG8gdGhlIG9ubHkgYWRkcmVzcyBhbGxvd2VkIHRvCi8vIHNjaGVkdWxlIGFjdGlvbnMgYWdhaW5zdCBpdCwgYW4gZW5mb3JjZWQgbWluaW11bSBkZWxheSwgYW5kIGFuCi8vIG9wdGlvbmFsIGd1YXJkaWFuIHdobyBjYW4gdmV0byBwZW5kaW5nIGFjdGlvbnMuIFdpdGhvdXQgdGhpcyBiaW5kaW5nCi8vIGEgdGltZWxvY2sgYXR0ZXN0cyBub3RoaW5nOiBhbnlvbmUgY291bGQgc2NoZWR1bGUgdGhlaXIgb3duCi8vIHNob3J0LWRlbGF5IGFjdGlvbiBhZ2FpbnN0IGFueSBuYW1lIGFuZCAiZXhlY3V0ZSIgaXQuCnR5cGUgVGFyZ2V0Q29uZmlnIHN0cnVjdCB7CglOYW1lICAgICBzdHJpbmcKCU93bmVyICAgIGFkZHJlc3MKCUd1YXJkaWFuIGFkZHJlc3MgLy8gZW1wdHkgPSBubyBndWFyZGlhbgoJTWluRGVsYXkgaW50NjQgICAvLyBzZWNvbmRzOyBldmVyeSBhY3Rpb24gZm9yIHRoaXMgdGFyZ2V0IHdhaXRzIGF0IGxlYXN0IHRoaXMKCS8vIFBlbmRpbmdPd25lciBpcyB0aGUgb2ZmZXJlZC1idXQtbm90LWFjY2VwdGVkIG5ldyBvd25lciAoZml4IFk1OgoJLy8gb3duZXJzaGlwIG1vdmVzIGluIHR3byBzdGVwcywgc28gYSBzdHJhbmdlciBjYW4gbmV2ZXIgaGF2ZSBhCgkvLyB0YXJnZXQg4oCUIGFuZCBpdHMgcXVvdGEgc2xvdCBhbmQgcGVuZGluZyBvYmxpZ2F0aW9ucyDigJQgZHVtcGVkIG9uCgkvLyB0aGVtIHdpdGhvdXQgY29uc2VudGluZykuCglQZW5kaW5nT3duZXIgYWRkcmVzcwp9CgovLyBBY3Rpb24gcmVwcmVzZW50cyBhIHNjaGVkdWxlZCBvcGVyYXRpb24gdGhhdCBjYW4gb25seSBleGVjdXRlIGFmdGVyCi8vIGl0cyBkZWxheSBoYXMgZWxhcHNlZCwgYW5kIG9ubHkgd2l0aGluIGl0cyBncmFjZSB3aW5kb3cuCi8vCi8vIFN0YXRlIG1vZGVsIChyZS1hdWRpdCAyMDI2LTA5LTAyKTogb25seSBQRU5ESU5HIGFuZCBFWEVDVVRFRCBhY3Rpb25zCi8vIGFyZSBzdG9yZWQuIEV4ZWN1dGVkIHJlY29yZHMgYXJlIHBlcm1hbmVudCBhdHRlc3RhdGlvbnMgY29uc3VtZXJzCi8vIGNoZWNrIHZpYSBJc0V4ZWN1dGVkLiBDYW5jZWxsZWQsIHZldG9lZCwgYW5kIGV4cGlyZWQgYWN0aW9ucyBhcmUKLy8gUkVBUEVEIGZyb20gc3RhdGUg4oCUIHRoZWlyIGhpc3RvcnkgbGl2ZXMgaW4gZW1pdHRlZCBldmVudHMg4oCUIHNvIHRoZQovLyBsaXZlLWFjdGlvbiBjYXAgYm91bmRzIGxpdmUgZXhwb3N1cmUgYW5kIGNhbiBuZXZlciBiZSBjb25zdW1lZAovLyBwZXJtYW5lbnRseSBieSBzY2hlZHVsZS9jYW5jZWwgY3ljbGluZy4KdHlwZSBBY3Rpb24gc3RydWN0IHsKCUlEICAgICAgICAgICBzdHJpbmcKCVRhcmdldCAgICAgICBzdHJpbmcKCUNyZWF0b3IgICAgICBhZGRyZXNzCglEYXRhICAgICAgICAgc3RyaW5nIC8vIGVuY29kZWQgY2FsbCBkYXRhIG9yIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24KCVNjaGVkdWxlZEF0ICB0aW1lLlRpbWUKCUV4ZWN1dGVBZnRlciB0aW1lLlRpbWUKCUV4cGlyZXNBdCAgICB0aW1lLlRpbWUgLy8gRXhlY3V0ZUFmdGVyICsgR3JhY2VQZXJpb2Q7IG5vdCBleGVjdXRhYmxlIGFmdGVyCglFeGVjdXRlZCAgICAgYm9vbAp9Cgpjb25zdCAoCgkvLyBNaW5EZWxheUZsb29yIGlzIHRoZSBzbWFsbGVzdCBtaW5pbXVtIGRlbGF5IGEgdGFyZ2V0IG1heSByZWdpc3Rlci4KCS8vIEEgdGltZWxvY2sgd2l0aCBhIDEtc2Vjb25kIGRlbGF5IHByb3RlY3RzIG5vdGhpbmcuCglNaW5EZWxheUZsb29yID0gaW50NjQoNjApCgoJLy8gTWF4RGVsYXkgYm91bmRzIGJvdGggcmVnaXN0ZXJlZCBtaW5pbXVtIGRlbGF5cyBhbmQgcGVyLWFjdGlvbgoJLy8gZGVsYXlzLiBBbHNvIHRoZSBvdmVyZmxvdyBndWFyZDogTWF4RGVsYXkgc2Vjb25kcyBpbiBuYW5vc2Vjb25kcwoJLy8gaXMgZmFyIGJlbG93IGludDY0IHJhbmdlLCBzbyBFeGVjdXRlQWZ0ZXIgYXJpdGhtZXRpYyBjYW5ub3Qgd3JhcAoJLy8gaW50byB0aGUgcGFzdC4KCU1heERlbGF5ID0gaW50NjQoMTAgKiAzNjUgKiAyNCAqIDM2MDApIC8vIDEwIHllYXJzCgoJLy8gR3JhY2VQZXJpb2QgaXMgaG93IGxvbmcgYW4gYWN0aW9uIHN0YXlzIGV4ZWN1dGFibGUgb25jZSByZWFkeS4KCS8vIEFmdGVyIGl0LCB0aGUgYWN0aW9uIGV4cGlyZXM6IHNvbWV0aGluZyBzY2hlZHVsZWQgYW5kIGZvcmdvdHRlbgoJLy8gY2Fubm90IGJlIHNwcnVuZyBvbiBhIHRhcmdldCB5ZWFycyBsYXRlci4KCUdyYWNlUGVyaW9kID0gaW50NjQoMzAgKiAyNCAqIDM2MDApIC8vIDMwIGRheXMKCgkvLyBRdW90YXMgYXJlIFBFUi1PV05FUiBvbmx5IChyZS1hdWRpdCByb3VuZCAzKTogYW55IGdsb2JhbCBjYXAgaXMgYQoJLy8gc2hhcmVkIHJlc291cmNlIGEgZmV3IHN5YmlsIGFjY291bnRzIGNhbiBleGhhdXN0IGZvcmV2ZXIgKDEweQoJLy8gZGVsYXlzIGRlZmVhdCBleHBpcnkgc3dlZXBpbmcpLCBicmlja2luZyBldmVyeSBvdGhlciB0ZW5hbnQuIFdpdGgKCS8vIHBlci1vd25lciBxdW90YXMgYW4gYXR0YWNrZXIgb25seSBldmVyIGNvbnN1bWVzIHRoZWlyIG93biBidWRnZXQ7CgkvLyBzdGF0ZSBncm93dGggaXMgcHJpY2VkIGluIGdhcyBhbmQgZnVuZGVkIGFjY291bnRzLgoJTWF4VGFyZ2V0c1Blck93bmVyICA9IDEwCglNYXhQZW5kaW5nUGVyVGFyZ2V0ID0gMjAKCU1heFRhcmdldE5hbWVMZW4gICAgPSA2NAoJTWF4RGF0YUxlbiAgICAgICAgICA9IDIwMDAKCU1heFJlbmRlckFjdGlvbnMgICAgPSAxMDAKCS8vIFJlbmRlckluZGV4Q2FwIGJvdW5kcyB0aGUgcmVuZGVyLW9yZGVyaW5nIGluZGV4IChmaXggWTQpOiB0aGUKCS8vIGluZGV4IHNlbGYtdHJpbXMgdG8gdGhpcyBzaXplLCBzbyByZWFwaW5nIGFuIGVudHJ5IGZyb20gaXQgaXMgYQoJLy8gYm91bmRlZCBzY2FuIG5vIG1hdHRlciBob3cgbWFueSBhY3Rpb25zIHRoZSByZWFsbSBoYXMgZXZlciBzZWVuLgoJLy8gUmVjb3JkcyBvbGRlciB0aGFuIHRoZSB3aW5kb3cgc3RheSBpbiBzdGF0ZSAoR2V0QWN0aW9uL0lzRXhlY3V0ZWQKCS8vIGFyZSBtYXAgcmVhZHMgYW5kIHBlcm1hbmVudCk7IHRoZXkgb25seSBsZWF2ZSB0aGUgZnJvbnQgcGFnZS4KCVJlbmRlckluZGV4Q2FwID0gMiAqIE1heFJlbmRlckFjdGlvbnMKKQoKdmFyICgKCXRhcmdldHMgICAgICBtYXBbc3RyaW5nXSpUYXJnZXRDb25maWcKCXRhcmdldE5hbWVzICBbXXN0cmluZyAvLyBpbnNlcnRpb24tb3JkZXJlZCBmb3IgZGV0ZXJtaW5pc3RpYyBpdGVyYXRpb24KCW93bmVyVGFyZ2V0cyBtYXBbYWRkcmVzc11pbnQKCWFjdGlvbnMgICAgICBtYXBbc3RyaW5nXSpBY3Rpb24KCWFjdGlvbklEcyAgICBbXXN0cmluZyAvLyBpbnNlcnRpb24tb3JkZXJlZCByZW5kZXIgd2luZG93LCBzZWxmLXRyaW1tZWQgdG8gUmVuZGVySW5kZXhDYXAKCS8vIHBlbmRpbmcgaG9sZHMgZWFjaCB0YXJnZXQncyBMSVZFIHBlbmRpbmcgYWN0aW9uIElEcyBpbiBpbnNlcnRpb24KCS8vIG9yZGVyIChmaXggWTQpOiBldmVyeSBsaXN0IGlzIGJvdW5kZWQgYnkgTWF4UGVuZGluZ1BlclRhcmdldCwgc28KCS8vIHNjYW5zLCBzd2VlcHMsIGFuZCByZW1vdmFscyBhcmUgYm91bmRlZCBwZXIgY2FsbCByZWdhcmRsZXNzIG9mIGhvdwoJLy8gbXVjaCBzdGF0ZSBPVEhFUiB0ZW5hbnRzIGhhdmUgZ3Jvd24g4oCUIHF1ZXVlIHBvc2l0aW9uIGluIGEgZ2xvYmFsCgkvLyBsaXN0IGlzIG5vIGxvbmdlciBhIHNoYXJlZCByZXNvdXJjZS4KCXBlbmRpbmcgbWFwW3N0cmluZ11bXXN0cmluZwoJLy8gcGVuZGluZ1RhcmdldHMgbGlzdHMgdGhlIHRhcmdldHMgaG9sZGluZyA+PSAxIGxpdmUgcGVuZGluZyBhY3Rpb24sCgkvLyBtYWludGFpbmVkIHdpdGggTygxKSBzd2FwLXJlbW92ZSB2aWEgcHRJbmRleCAocm91bmQtMiBmaXggWS0xKTogbm8KCS8vIHdyaXRlIHBhdGggZXZlciBzY2FucyBhIGxpc3QgYW5vdGhlciB0ZW5hbnQgY2FuIGdyb3csIGFuZAoJLy8gR2V0UGVuZGluZy9SZW5kZXIgaXRlcmF0ZSBvbmx5IHRhcmdldHMgdGhhdCBhY3R1YWxseSBoYXZlIHdvcmsuCglwZW5kaW5nVGFyZ2V0cyBbXXN0cmluZwoJcHRJbmRleCAgICAgICAgbWFwW3N0cmluZ11pbnQKCW5leHRJRCAgICAgICAgIGludAopCgpmdW5jIGluaXQoKSB7Cgl0YXJnZXRzID0gbWFrZShtYXBbc3RyaW5nXSpUYXJnZXRDb25maWcpCgl0YXJnZXROYW1lcyA9IFtdc3RyaW5ne30KCW93bmVyVGFyZ2V0cyA9IG1ha2UobWFwW2FkZHJlc3NdaW50KQoJYWN0aW9ucyA9IG1ha2UobWFwW3N0cmluZ10qQWN0aW9uKQoJYWN0aW9uSURzID0gW11zdHJpbmd7fQoJcGVuZGluZyA9IG1ha2UobWFwW3N0cmluZ11bXXN0cmluZykKCXBlbmRpbmdUYXJnZXRzID0gW11zdHJpbmd7fQoJcHRJbmRleCA9IG1ha2UobWFwW3N0cmluZ11pbnQpCgluZXh0SUQgPSAxCn0KCmZ1bmMgbm93KCkgdGltZS5UaW1lIHsKCXJldHVybiB0aW1lLk5vdygpCn0KCi8vIC0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tCgovLyByZWplY3RTdHJheVNlbmQgYWJvcnRzIHdoZW4gY29pbnMgYXJlIGF0dGFjaGVkIHRvIGEgY2FsbCAoZml4IFk2KToKLy8gdGhpcyByZWFsbSBoYW5kbGVzIG5vIGZ1bmRzIGFuZCBob2xkcyBubyBiYW5rZXIsIHNvIGFuIGF0dGFjaGVkIHNlbmQKLy8gd291bGQgc3RyYW5kIG9uIHRoZSByZWFsbSBhZGRyZXNzIGZvcmV2ZXIuIEFib3J0aW5nIHJldmVydHMgdGhlCi8vIHRyYW5zZmVyIGJhY2sgdG8gdGhlIHNlbmRlci4gRmFpbHMgb3BlbiBmb3IgcmVhbG0tcm91dGVkIGNhbGxzLCB3aG9zZQovLyBhdHRhY2hlZCBzZW5kIGxhbmRzIG9uIHRoZSBpbnRlcm1lZGlhcnkgcmVhbG0sIG5ldmVyIGhlcmUuCmZ1bmMgcmVqZWN0U3RyYXlTZW5kKGN1ciByZWFsbSkgewoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSA+IDAgewoJCXBhbmljKCJ0aGlzIHJlYWxtIGRvZXMgbm90IGFjY2VwdCBjb2lucyIpCgl9Cn0KCmZ1bmMgbXVzdEdldFRhcmdldChuYW1lIHN0cmluZykgKlRhcmdldENvbmZpZyB7Cgl0LCBvayA6PSB0YXJnZXRzW25hbWVdCglpZiAhb2sgewoJCXBhbmljKCJ0YXJnZXQgbm90IGZvdW5kOiAiICsgbmFtZSkKCX0KCXJldHVybiB0Cn0KCmZ1bmMgbXVzdEdldChpZCBzdHJpbmcpICpBY3Rpb24gewoJYSwgb2sgOj0gYWN0aW9uc1tpZF0KCWlmICFvayB7CgkJcGFuaWMoImFjdGlvbiBub3QgZm91bmQ6ICIgKyBpZCkKCX0KCXJldHVybiBhCn0KCmZ1bmMgaXNWYWxpZE5hbWUobmFtZSBzdHJpbmcpIGJvb2wgewoJaWYgbmFtZSA9PSAiIiB8fCBsZW4obmFtZSkgPiBNYXhUYXJnZXROYW1lTGVuIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWZvciBfLCBjIDo9IHJhbmdlIG5hbWUgewoJCWlmICEoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IGMgPT0gJ18nKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCmZ1bmMgZXhwaXJlZChhICpBY3Rpb24pIGJvb2wgewoJcmV0dXJuICFhLkV4ZWN1dGVkICYmIG5vdygpLkFmdGVyKGEuRXhwaXJlc0F0KQp9CgpmdW5jIHJlbW92ZUlEKGxpc3QgW11zdHJpbmcsIGlkIHN0cmluZykgW11zdHJpbmcgewoJZm9yIGksIHggOj0gcmFuZ2UgbGlzdCB7CgkJaWYgeCA9PSBpZCB7CgkJCXJldHVybiBhcHBlbmQobGlzdFs6aV0sIGxpc3RbaSsxOl0uLi4pCgkJfQoJfQoJcmV0dXJuIGxpc3QKfQoKZnVuYyBhZGRQZW5kaW5nVGFyZ2V0KHRhcmdldCBzdHJpbmcpIHsKCWlmIF8sIG9rIDo9IHB0SW5kZXhbdGFyZ2V0XTsgb2sgewoJCXJldHVybgoJfQoJcHRJbmRleFt0YXJnZXRdID0gbGVuKHBlbmRpbmdUYXJnZXRzKQoJcGVuZGluZ1RhcmdldHMgPSBhcHBlbmQocGVuZGluZ1RhcmdldHMsIHRhcmdldCkKfQoKLy8gcmVtb3ZlUGVuZGluZ1RhcmdldCBkcm9wcyBhIHRhcmdldCBmcm9tIHRoZSB3aXRoLXBlbmRpbmdzIGxpc3QgaW4KLy8gTygxKSBieSBzd2FwcGluZyB0aGUgbGFzdCBlbnRyeSBpbnRvIGl0cyBzbG90LiBPcmRlciBhZnRlcndhcmRzIGlzCi8vIGRldGVybWluaXN0aWMgKGEgcHVyZSBmdW5jdGlvbiBvZiB0aGUgb3BlcmF0aW9uIGhpc3RvcnkpLCB3aGljaCBpcwovLyBhbGwgaXRlcmF0aW9uIG5lZWRzLgpmdW5jIHJlbW92ZVBlbmRpbmdUYXJnZXQodGFyZ2V0IHN0cmluZykgewoJaSwgb2sgOj0gcHRJbmRleFt0YXJnZXRdCglpZiAhb2sgewoJCXJldHVybgoJfQoJbGFzdCA6PSBsZW4ocGVuZGluZ1RhcmdldHMpIC0gMQoJbW92ZWQgOj0gcGVuZGluZ1RhcmdldHNbbGFzdF0KCXBlbmRpbmdUYXJnZXRzW2ldID0gbW92ZWQKCXB0SW5kZXhbbW92ZWRdID0gaQoJcGVuZGluZ1RhcmdldHMgPSBwZW5kaW5nVGFyZ2V0c1s6bGFzdF0KCWRlbGV0ZShwdEluZGV4LCB0YXJnZXQpCn0KCi8vIGRyb3BQZW5kaW5nIHJlbW92ZXMgaWQgZnJvbSBpdHMgdGFyZ2V0J3MgcGVuZGluZyBsaXN0LiBCb3VuZGVkOiB0aGUKLy8gbGlzdCBuZXZlciBleGNlZWRzIE1heFBlbmRpbmdQZXJUYXJnZXQuCmZ1bmMgZHJvcFBlbmRpbmcodGFyZ2V0LCBpZCBzdHJpbmcpIHsKCWwgOj0gcmVtb3ZlSUQocGVuZGluZ1t0YXJnZXRdLCBpZCkKCWlmIGxlbihsKSA9PSAwIHsKCQlkZWxldGUocGVuZGluZywgdGFyZ2V0KQoJCXJlbW92ZVBlbmRpbmdUYXJnZXQodGFyZ2V0KQoJfSBlbHNlIHsKCQlwZW5kaW5nW3RhcmdldF0gPSBsCgl9Cn0KCi8vIHJlYXAgcmVtb3ZlcyBhIG5vbi1leGVjdXRlZCBhY3Rpb24gZnJvbSBzdGF0ZSBlbnRpcmVseTsgaXRzIGhpc3RvcnkKLy8gaXMgdGhlIGVtaXR0ZWQgZXZlbnQuIEV4ZWN1dGVkIHJlY29yZHMgYXJlIHBlcm1hbmVudCBhdHRlc3RhdGlvbnM6Ci8vIHJlYXAgcmVmdXNlcyB0aGVtIG91dHJpZ2h0IChyb3VuZC0yIGhhcmRlbmluZyksIHNvIG5vIGZ1dHVyZSBjYWxsZXIKLy8gY2FuIGVyYXNlIG9uZSBieSBtaXN0YWtlLgpmdW5jIHJlYXAoaWQgc3RyaW5nKSB7CglhIDo9IGFjdGlvbnNbaWRdCglpZiBhICE9IG5pbCAmJiBhLkV4ZWN1dGVkIHsKCQlyZXR1cm4KCX0KCWlmIGEgIT0gbmlsIHsKCQlkcm9wUGVuZGluZyhhLlRhcmdldCwgaWQpCgl9CglkZWxldGUoYWN0aW9ucywgaWQpCglhY3Rpb25JRHMgPSByZW1vdmVJRChhY3Rpb25JRHMsIGlkKQp9CgovLyBzd2VlcEV4cGlyZWQgcmVhcHMgdGhlIGV4cGlyZWQgcGVuZGluZyBhY3Rpb25zIG9mIE9ORSB0YXJnZXQgKGZpeAovLyBZNC9ZMjogdGhlIG9sZCBnbG9iYWwgYnVkZ2V0LXdpbmRvd2VkIHN3ZWVwIGxldCBsb25nLWRlbGF5IGVudHJpZXMgYXQKLy8gdGhlIGZyb250IG9mIGEgc2hhcmVkIHF1ZXVlIHN0YXJ2ZSBldmVyeXRoaW5nIGJlaGluZCB0aGVtKS4gQQovLyB0YXJnZXQncyBsaXN0IGlzIGJvdW5kZWQgYnkgTWF4UGVuZGluZ1BlclRhcmdldCwgc28gdGhlIHN3ZWVwIGlzIGEKLy8gYm91bmRlZCBzY2FuLiBFeHBpcnkgaGlzdG9yeSBpcyB0aGUgZW1pdHRlZCBldmVudC4KZnVuYyBzd2VlcEV4cGlyZWQodGFyZ2V0IHN0cmluZykgewoJdmFyIGxpdmUgW11zdHJpbmcKCWZvciBfLCBpZCA6PSByYW5nZSBwZW5kaW5nW3RhcmdldF0gewoJCWEgOj0gYWN0aW9uc1tpZF0KCQlpZiBhID09IG5pbCB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIGV4cGlyZWQoYSkgewoJCQljaGFpbi5FbWl0KCJ0aW1lbG9ja19leHBpcmVkIiwgImlkIiwgaWQsICJ0YXJnZXQiLCBhLlRhcmdldCkKCQkJZGVsZXRlKGFjdGlvbnMsIGlkKQoJCQlhY3Rpb25JRHMgPSByZW1vdmVJRChhY3Rpb25JRHMsIGlkKQoJCQljb250aW51ZQoJCX0KCQlsaXZlID0gYXBwZW5kKGxpdmUsIGlkKQoJfQoJaWYgbGVuKGxpdmUpID09IDAgewoJCWRlbGV0ZShwZW5kaW5nLCB0YXJnZXQpCgkJcmVtb3ZlUGVuZGluZ1RhcmdldCh0YXJnZXQpCgl9IGVsc2UgewoJCXBlbmRpbmdbdGFyZ2V0XSA9IGxpdmUKCX0KfQoKLy8gcGVuZGluZ0NvdW50IGlzIHRoZSBsZW5ndGggb2YgdGhlIHRhcmdldCdzIGxpdmUgbGlzdC4gVGhlIGNvdW50ZXIgaXQKLy8gcmVwbGFjZXMgKGZpeCBZNCkgY291bGQgZGVzeW5jIGZyb20gdGhlIGxpc3RzIGl0IG1pcnJvcmVkOyBhIGxlbmd0aAovLyBjYW5ub3QuIEl0IG1heSBicmllZmx5IGluY2x1ZGUgbm90LXlldC1zd2VwdCBleHBpcmVkIGFjdGlvbnM7IHRob3NlCi8vIGFyZSByZWFwZWQgYnkgdGhlIG5leHQgU2NoZWR1bGUncyBzd2VlcCBvciBieSBhbnlvbmUncyBFeHBpcmUsIGFuZCBpbgovLyB0aGUgd29yc3QgY2FzZSBhbiBvd25lciBicmllZmx5IHVuZGVyLXVzZXMgdGhlaXIgb3duIHF1b3RhIOKAlCBuZXZlcgovLyBhbm90aGVyIHRlbmFudCdzLgpmdW5jIHBlbmRpbmdDb3VudCh0YXJnZXQgc3RyaW5nKSBpbnQgewoJcmV0dXJuIGxlbihwZW5kaW5nW3RhcmdldF0pCn0KCi8vIHNhbml0aXplIG1ha2VzIGF0dGFja2VyLWNvbnRyb2xsZWQgdGV4dCBzYWZlIHRvIGVtYmVkIGluIG1hcmtkb3duIGFuZAovLyBzaW5nbGUtbGluZSBzdW1tYXJpZXM6IGJhY2t0aWNrcywgcGlwZXMsIG5ld2xpbmVzLCBsaW5rIHN5bnRheCwgYW5kCi8vIHJhdyBIVE1MIGJyYWNrZXRzIChmaXggWTM6IGdub3dlYiBoYXMgbm8gSFRNTCBzYW5pdGl6YXRpb24gbGF5ZXIsIHNvCi8vIGEgbGl0ZXJhbCA8c2NyaXB0PiB0YWcgbXVzdCBuZXZlciByZWFjaCB0aGUgcGFnZSkgYXJlIHJlcGxhY2VkIHNvIGEKLy8gRGF0YSBzdHJpbmcgY2Fubm90IGJyZWFrIG91dCBvZiBpdHMgY2VsbCwgaW5qZWN0IHJvd3Mgb3IgbWFya3VwLCBvcgovLyByZW5kZXIgYSBsaXZlIGxpbmsuCmZ1bmMgc2FuaXRpemUocyBzdHJpbmcpIHN0cmluZyB7CglyIDo9IHN0cmluZ3MuTmV3UmVwbGFjZXIoCgkJImAiLCAiJyIsICJ8IiwgIi8iLCAiXG4iLCAiICIsICJcciIsICIgIiwKCQkiWyIsICIoIiwgIl0iLCAiKSIsICIqIiwgIsK3IiwgIl8iLCAiLSIsCgkJIjwiLCAiKCIsICI+IiwgIikiLAoJKQoJcmV0dXJuIHIuUmVwbGFjZShzKQp9CgovLyB0cnVuY2F0ZSBzaG9ydGVucyBzIHRvIGF0IG1vc3QgbiBydW5lcyB3aXRob3V0IHNwbGl0dGluZyBhIG11bHRpYnl0ZQovLyBjaGFyYWN0ZXIuIG4gaXMgY2xhbXBlZCB0byBhIG1pbmltdW0gb2YgNCAocmUtYXVkaXQ6IG48PTIgc2xpY2VkIG91dAovLyBvZiBib3VuZHMpLgpmdW5jIHRydW5jYXRlKHMgc3RyaW5nLCBuIGludCkgc3RyaW5nIHsKCWlmIG4gPCA0IHsKCQluID0gNAoJfQoJcnVuZXMgOj0gW11ydW5lKHMpCglpZiBsZW4ocnVuZXMpIDw9IG4gewoJCXJldHVybiBzCgl9CglyZXR1cm4gc3RyaW5nKHJ1bmVzWzpuLTNdKSArICIuLi4iCn0KCi8vIC0tLS0tLS0tLS0gdGFyZ2V0IHJlZ2lzdHJhdGlvbiAtLS0tLS0tLS0tCgovLyBSZWdpc3RlclRhcmdldCBjcmVhdGVzIGEgbmFtZWQgdGFyZ2V0LiBUaGUgY2FsbGVyIGJlY29tZXMgaXRzIG93bmVyIOKAlAovLyB0aGUgb25seSBhZGRyZXNzIHRoYXQgbWF5IHNjaGVkdWxlIGFjdGlvbnMgYWdhaW5zdCBpdC4gbWluRGVsYXkgaXMKLy8gdGhlIGVuZm9yY2VkIGZsb29yIGZvciBldmVyeSBhY3Rpb24ncyBkZWxheS4gZ3VhcmRpYW4gbWF5IGJlIGVtcHR5Ci8vIChubyBndWFyZGlhbikgb3IgYW4gYWRkcmVzcyBlbXBvd2VyZWQgdG8gdmV0byBwZW5kaW5nIGFjdGlvbnMuCmZ1bmMgUmVnaXN0ZXJUYXJnZXQoY3VyIHJlYWxtLCBuYW1lIHN0cmluZywgbWluRGVsYXkgaW50NjQsIGd1YXJkaWFuIGFkZHJlc3MpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmICFpc1ZhbGlkTmFtZShuYW1lKSB7CgkJcGFuaWMoInRhcmdldCBuYW1lIG11c3QgYmUgMS0iICsgc3RyY29udi5JdG9hKE1heFRhcmdldE5hbWVMZW4pICsKCQkJIiBjaGFycywgbG93ZXJjYXNlIGFscGhhbnVtZXJpYyB3aXRoIHVuZGVyc2NvcmVzIG9ubHkiKQoJfQoJaWYgXywgZXhpc3RzIDo9IHRhcmdldHNbbmFtZV07IGV4aXN0cyB7CgkJcGFuaWMoInRhcmdldCBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICIgKyBuYW1lKQoJfQoJaWYgb3duZXJUYXJnZXRzW293bmVyXSA+PSBNYXhUYXJnZXRzUGVyT3duZXIgewoJCXBhbmljKCJwZXItb3duZXIgdGFyZ2V0IGxpbWl0IHJlYWNoZWQiKQoJfQoJaWYgbWluRGVsYXkgPCBNaW5EZWxheUZsb29yIHsKCQlwYW5pYygibWluaW11bSBkZWxheSBtdXN0IGJlIGF0IGxlYXN0ICIgKyBzdHJjb252LkZvcm1hdEludChNaW5EZWxheUZsb29yLCAxMCkgKyAiIHNlY29uZHMiKQoJfQoJaWYgbWluRGVsYXkgPiBNYXhEZWxheSB7CgkJcGFuaWMoIm1pbmltdW0gZGVsYXkgZXhjZWVkcyB0aGUgbWF4aW11bSBvZiAiICsgc3RyY29udi5Gb3JtYXRJbnQoTWF4RGVsYXksIDEwKSArICIgc2Vjb25kcyIpCgl9CglpZiBndWFyZGlhbiAhPSAiIiAmJiAhZ3VhcmRpYW4uSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBndWFyZGlhbiBhZGRyZXNzOiAiICsgc3RyaW5nKGd1YXJkaWFuKSkKCX0KCgl0YXJnZXRzW25hbWVdID0gJlRhcmdldENvbmZpZ3sKCQlOYW1lOiAgICAgbmFtZSwKCQlPd25lcjogICAgb3duZXIsCgkJR3VhcmRpYW46IGd1YXJkaWFuLAoJCU1pbkRlbGF5OiBtaW5EZWxheSwKCX0KCXRhcmdldE5hbWVzID0gYXBwZW5kKHRhcmdldE5hbWVzLCBuYW1lKQoJb3duZXJUYXJnZXRzW293bmVyXSsrCgljaGFpbi5FbWl0KCJ0aW1lbG9ja190YXJnZXRfcmVnaXN0ZXJlZCIsICJ0YXJnZXQiLCBuYW1lLAoJCSJvd25lciIsIHN0cmluZyhvd25lciksICJndWFyZGlhbiIsIHN0cmluZyhndWFyZGlhbiksCgkJIm1pbl9kZWxheSIsIHN0cmNvbnYuRm9ybWF0SW50KG1pbkRlbGF5LCAxMCkpCn0KCi8vIFNldEd1YXJkaWFuIGNoYW5nZXMgKG9yIGNsZWFycywgd2l0aCAiIikgdGhlIHRhcmdldCdzIGd1YXJkaWFuLgovLyBPd25lciBvbmx5LCBhbmQgUkVGVVNFRCB3aGlsZSB0aGUgdGFyZ2V0IGhhcyBwZW5kaW5nIGFjdGlvbnM6IHRoZQovLyBndWFyZGlhbidzIHZldG8gcG93ZXIgZXhpc3RzIHByZWNpc2VseSB0byBjaGVjayB0aGUgb3duZXIgZHVyaW5nIGEKLy8gZGVsYXkgd2luZG93LCBzbyB0aGUgb3duZXIgbXVzdCBub3QgYmUgYWJsZSB0byBzdHJpcCBpdCBtaWQtd2luZG93LgovLwovLyBLTk9XTiBMSU1JVCAoZG9jdW1lbnRlZCwgcm91bmQtMyBhdWRpdCk6IHRoZSBvd25lciBjYW4gY2FuY2VsIGFsbAovLyBwZW5kaW5nIGFjdGlvbnMsIGNoYW5nZSB0aGUgZ3VhcmRpYW4sIGFuZCByZXNjaGVkdWxlIOKAlCB0aGUgcHJpY2UgaXMKLy8gYSBmdWxsIGZyZXNoIE1pbkRlbGF5IG9uIGV2ZXJ5IHJlc2NoZWR1bGVkIGFjdGlvbiwgYW5kIGV2ZXJ5IHN0ZXAKLy8gZW1pdHMgYW4gZXZlbnQgKGNhbmNlbGxhdGlvbnMgKyB0aGUgZ3VhcmRpYW4gY2hhbmdlIGJlbG93KSwgc28KLy8gb2JzZXJ2ZXJzIGFsd2F5cyBnZXQgTWluRGVsYXkgb2Ygd2FybmluZyB1bmRlciB0aGUgbmV3IGd1YXJkaWFuCi8vIHJlZ2ltZS4gR3VhcmRpYW5zIHByb3RlY3Qgb3BlbiB3aW5kb3dzLCBub3QgdGhlIG93bmVyJ3MgZnV0dXJlLgpmdW5jIFNldEd1YXJkaWFuKGN1ciByZWFsbSwgdGFyZ2V0TmFtZSBzdHJpbmcsIGd1YXJkaWFuIGFkZHJlc3MpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgl0IDo9IG11c3RHZXRUYXJnZXQodGFyZ2V0TmFtZSkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSB0Lk93bmVyIHsKCQlwYW5pYygib25seSB0aGUgdGFyZ2V0IG93bmVyIGNhbiBzZXQgdGhlIGd1YXJkaWFuIikKCX0KCS8vIGV4cGlyZWQtYnV0LXVuc3dlcHQgYWN0aW9ucyBwcm90ZWN0IG5vdGhpbmc7IHN3ZWVwIHRoZW0gc28gdGhleQoJLy8gY2Fubm90IGJsb2NrIGEgZ3VhcmRpYW4gcm90YXRpb24gKHJvdW5kLTIgaGFyZGVuaW5nKQoJc3dlZXBFeHBpcmVkKHRhcmdldE5hbWUpCglpZiBwZW5kaW5nQ291bnQodGFyZ2V0TmFtZSkgPiAwIHsKCQlwYW5pYygiY2Fubm90IGNoYW5nZSB0aGUgZ3VhcmRpYW4gd2hpbGUgYWN0aW9ucyBhcmUgcGVuZGluZyIpCgl9CglpZiBndWFyZGlhbiAhPSAiIiAmJiAhZ3VhcmRpYW4uSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBndWFyZGlhbiBhZGRyZXNzOiAiICsgc3RyaW5nKGd1YXJkaWFuKSkKCX0KCXQuR3VhcmRpYW4gPSBndWFyZGlhbgoJY2hhaW4uRW1pdCgidGltZWxvY2tfZ3VhcmRpYW5fY2hhbmdlZCIsICJ0YXJnZXQiLCB0YXJnZXROYW1lLAoJCSJndWFyZGlhbiIsIHN0cmluZyhndWFyZGlhbikpCn0KCi8vIFRyYW5zZmVyVGFyZ2V0T3duZXJzaGlwIE9GRkVSUyBhIHRhcmdldCB0byBhIG5ldyBvd25lcjsgdGhlIG5vbWluZWUKLy8gbXVzdCBBY2NlcHRUYXJnZXRPd25lcnNoaXAgdG8gY29tcGxldGUgaXQgKGZpeCBZNTogYSBvbmUtc3RlcAovLyB0cmFuc2ZlciBsZXQgYW55b25lIGZpbGwgYSBzdHJhbmdlcidzIHBlci1vd25lciBxdW90YSBhbmQgZHVtcAovLyBwZW5kaW5nIG9ibGlnYXRpb25zIOKAlCB3aXRoIGFuIGF0dGFja2VyLWNob3NlbiBndWFyZGlhbiDigJQgb24gYW4KLy8gYWRkcmVzcyB0aGF0IG5ldmVyIGFza2VkKS4gT3duZXIgb25seS4gUGFzcyAiIiB0byBjbGVhciBhIHBlbmRpbmcKLy8gb2ZmZXIuIE5vdGhpbmcgY2hhbmdlcyBoYW5kcyB1bnRpbCB0aGUgbm9taW5lZSBhY2NlcHRzLgpmdW5jIFRyYW5zZmVyVGFyZ2V0T3duZXJzaGlwKGN1ciByZWFsbSwgdGFyZ2V0TmFtZSBzdHJpbmcsIG5ld093bmVyIGFkZHJlc3MpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgl0IDo9IG11c3RHZXRUYXJnZXQodGFyZ2V0TmFtZSkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSB0Lk93bmVyIHsKCQlwYW5pYygib25seSB0aGUgdGFyZ2V0IG93bmVyIGNhbiB0cmFuc2ZlciBvd25lcnNoaXAiKQoJfQoJaWYgbmV3T3duZXIgPT0gIiIgewoJCXQuUGVuZGluZ093bmVyID0gIiIKCQljaGFpbi5FbWl0KCJ0aW1lbG9ja19vd25lcnNoaXBfb2ZmZXJfY2xlYXJlZCIsICJ0YXJnZXQiLCB0YXJnZXROYW1lKQoJCXJldHVybgoJfQoJaWYgIW5ld093bmVyLklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgbmV3IG93bmVyIGFkZHJlc3M6ICIgKyBzdHJpbmcobmV3T3duZXIpKQoJfQoJaWYgbmV3T3duZXIgPT0gdC5Pd25lciB7CgkJcGFuaWMoIm5ldyBvd25lciBpcyBhbHJlYWR5IHRoZSBvd25lciIpCgl9Cgl0LlBlbmRpbmdPd25lciA9IG5ld093bmVyCgljaGFpbi5FbWl0KCJ0aW1lbG9ja19vd25lcnNoaXBfb2ZmZXJlZCIsICJ0YXJnZXQiLCB0YXJnZXROYW1lLAoJCSJwZW5kaW5nX293bmVyIiwgc3RyaW5nKG5ld093bmVyKSkKfQoKLy8gQWNjZXB0VGFyZ2V0T3duZXJzaGlwIGNvbXBsZXRlcyBhIHBlbmRpbmcgb3duZXJzaGlwIG9mZmVyOyBvbmx5IHRoZQovLyBub21pbmVlIGNhbiBhY2NlcHQuIFRoZSBub21pbmVlJ3MgcXVvdGEgaXMgY2hlY2tlZCBIRVJFIOKAlCBjb25zZW50Ci8vIHRpbWUg4oCUIHNvIGFuIG9mZmVyIGNhbiBuZXZlciBvdmVyZmlsbCBhbiBhY2NvdW50IHRoYXQgZGlkIG5vdCBhZ3JlZQovLyB0byBjYXJyeSBpdC4KZnVuYyBBY2NlcHRUYXJnZXRPd25lcnNoaXAoY3VyIHJlYWxtLCB0YXJnZXROYW1lIHN0cmluZykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXQgOj0gbXVzdEdldFRhcmdldCh0YXJnZXROYW1lKQoJYSA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIHQuUGVuZGluZ093bmVyID09ICIiIHx8IGEgIT0gdC5QZW5kaW5nT3duZXIgewoJCXBhbmljKCJjYWxsZXIgaXMgbm90IHRoZSBwZW5kaW5nIG93bmVyIikKCX0KCWlmIG93bmVyVGFyZ2V0c1thXSA+PSBNYXhUYXJnZXRzUGVyT3duZXIgewoJCXBhbmljKCJhY2NlcHRpbmcgd291bGQgZXhjZWVkIHRoZSBwZXItb3duZXIgdGFyZ2V0IGxpbWl0IikKCX0KCW93bmVyVGFyZ2V0c1t0Lk93bmVyXS0tCglpZiBvd25lclRhcmdldHNbdC5Pd25lcl0gPD0gMCB7CgkJZGVsZXRlKG93bmVyVGFyZ2V0cywgdC5Pd25lcikKCX0KCW93bmVyVGFyZ2V0c1thXSsrCgl0Lk93bmVyID0gYQoJdC5QZW5kaW5nT3duZXIgPSAiIgoJY2hhaW4uRW1pdCgidGltZWxvY2tfb3duZXJzaGlwX3RyYW5zZmVycmVkIiwgInRhcmdldCIsIHRhcmdldE5hbWUsCgkJIm5ld19vd25lciIsIHN0cmluZyhhKSkKfQoKLy8gLS0tLS0tLS0tLSB3cml0ZSBvcGVyYXRpb25zIC0tLS0tLS0tLS0KCi8vIFNjaGVkdWxlIGNyZWF0ZXMgYSBuZXcgdGltZWxvY2tlZCBhY3Rpb24gYWdhaW5zdCBhIHJlZ2lzdGVyZWQgdGFyZ2V0LgovLyBPbmx5IHRoZSB0YXJnZXQncyBvd25lciBtYXkgc2NoZWR1bGUuIFRoZSBkZWxheSBtdXN0IGJlIGF0IGxlYXN0IHRoZQovLyB0YXJnZXQncyByZWdpc3RlcmVkIG1pbmltdW0gYW5kIGF0IG1vc3QgTWF4RGVsYXkuIFJldHVybnMgdGhlIGFjdGlvbiBJRC4KZnVuYyBTY2hlZHVsZShjdXIgcmVhbG0sIHRhcmdldE5hbWUsIGRhdGEgc3RyaW5nLCBkZWxheSBpbnQ2NCkgc3RyaW5nIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgl0IDo9IG11c3RHZXRUYXJnZXQodGFyZ2V0TmFtZSkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGNhbGxlciAhPSB0Lk93bmVyIHsKCQlwYW5pYygib25seSB0aGUgdGFyZ2V0IG93bmVyIGNhbiBzY2hlZHVsZSBhY3Rpb25zIGZvciAiICsgdGFyZ2V0TmFtZSkKCX0KCWlmIGRhdGEgPT0gIiIgewoJCXBhbmljKCJkYXRhIG11c3Qgbm90IGJlIGVtcHR5IikKCX0KCWlmIGxlbihkYXRhKSA+IE1heERhdGFMZW4gewoJCXBhbmljKCJkYXRhIGV4Y2VlZHMgIiArIHN0cmNvbnYuSXRvYShNYXhEYXRhTGVuKSArICIgYnl0ZXMiKQoJfQoJaWYgZGVsYXkgPCB0Lk1pbkRlbGF5IHsKCQlwYW5pYygiZGVsYXkgYmVsb3cgdGhlIHRhcmdldCdzIG1pbmltdW0gb2YgIiArIHN0cmNvbnYuRm9ybWF0SW50KHQuTWluRGVsYXksIDEwKSArICIgc2Vjb25kcyIpCgl9CglpZiBkZWxheSA+IE1heERlbGF5IHsKCQlwYW5pYygiZGVsYXkgZXhjZWVkcyB0aGUgbWF4aW11bSBvZiAiICsgc3RyY29udi5Gb3JtYXRJbnQoTWF4RGVsYXksIDEwKSArICIgc2Vjb25kcyIpCgl9CgoJc3dlZXBFeHBpcmVkKHRhcmdldE5hbWUpCglpZiBwZW5kaW5nQ291bnQodGFyZ2V0TmFtZSkgPj0gTWF4UGVuZGluZ1BlclRhcmdldCB7CgkJcGFuaWMoInRvbyBtYW55IHBlbmRpbmcgYWN0aW9ucyBmb3IgdGFyZ2V0ICIgKyB0YXJnZXROYW1lKQoJfQoKCWlkIDo9ICJhY3Rpb25fIiArIHN0cmNvbnYuSXRvYShuZXh0SUQpCgluZXh0SUQrKwoKCXRzIDo9IG5vdygpCglleGVjQWZ0ZXIgOj0gdHMuQWRkKHRpbWUuRHVyYXRpb24oZGVsYXkpICogdGltZS5TZWNvbmQpCglhY3Rpb25zW2lkXSA9ICZBY3Rpb257CgkJSUQ6ICAgICAgICAgICBpZCwKCQlUYXJnZXQ6ICAgICAgIHRhcmdldE5hbWUsCgkJQ3JlYXRvcjogICAgICBjYWxsZXIsCgkJRGF0YTogICAgICAgICBkYXRhLAoJCVNjaGVkdWxlZEF0OiAgdHMsCgkJRXhlY3V0ZUFmdGVyOiBleGVjQWZ0ZXIsCgkJRXhwaXJlc0F0OiAgICBleGVjQWZ0ZXIuQWRkKHRpbWUuRHVyYXRpb24oR3JhY2VQZXJpb2QpICogdGltZS5TZWNvbmQpLAoJfQoJYWN0aW9uSURzID0gYXBwZW5kKGFjdGlvbklEcywgaWQpCgkvLyBzZWxmLXRyaW0gKGZpeCBZNCk6IHRoZSByZW5kZXIgaW5kZXggc3RheXMgYm91bmRlZCwgc28gcmVhcGluZyBhbgoJLy8gZW50cnkgZnJvbSBpdCBjYW4gbmV2ZXIgYmVjb21lIGFuIHVuYm91bmRlZCBzY2FuLiBUcmltbWVkIGVudHJpZXMKCS8vIHJlbWFpbiBpbiB0aGUgYWN0aW9ucyBtYXA7IG9ubHkgZnJvbnQtcGFnZSBvcmRlcmluZyBmb3JnZXRzIHRoZW0uCglpZiBsZW4oYWN0aW9uSURzKSA+IFJlbmRlckluZGV4Q2FwIHsKCQlhY3Rpb25JRHMgPSBhcHBlbmQoW11zdHJpbmd7fSwgYWN0aW9uSURzW2xlbihhY3Rpb25JRHMpLU1heFJlbmRlckFjdGlvbnM6XS4uLikKCX0KCXBlbmRpbmdbdGFyZ2V0TmFtZV0gPSBhcHBlbmQocGVuZGluZ1t0YXJnZXROYW1lXSwgaWQpCglhZGRQZW5kaW5nVGFyZ2V0KHRhcmdldE5hbWUpCgkvLyBmdWxsLWF0dHJpYnV0ZSBldmVudCAocm91bmQtMyBhdWRpdCk6IHJlYXBlZCByZWNvcmRzIG11c3QgYmUKCS8vIHJlY29uc3RydWN0aWJsZSBmcm9tIGV2ZW50cyBhbG9uZQoJY2hhaW4uRW1pdCgidGltZWxvY2tfc2NoZWR1bGVkIiwgImlkIiwgaWQsICJ0YXJnZXQiLCB0YXJnZXROYW1lLAoJCSJjcmVhdG9yIiwgc3RyaW5nKGNhbGxlciksICJkYXRhIiwgZGF0YSwKCQkiZGVsYXkiLCBzdHJjb252LkZvcm1hdEludChkZWxheSwgMTApLAoJCSJleGVjdXRlX2FmdGVyIiwgZXhlY0FmdGVyLkZvcm1hdCh0aW1lLlJGQzMzMzkpLAoJCSJleHBpcmVzX2F0IiwgZXhlY0FmdGVyLkFkZCh0aW1lLkR1cmF0aW9uKEdyYWNlUGVyaW9kKSp0aW1lLlNlY29uZCkuRm9ybWF0KHRpbWUuUkZDMzMzOSkpCglyZXR1cm4gaWQKfQoKLy8gRXhlY3V0ZSBtYXJrcyBhbiBhY3Rpb24gYXMgZXhlY3V0ZWQuIEFueW9uZSBjYW4gY2FsbCB0aGlzIOKAlCB0aGUKLy8gdGltZWxvY2sgaXMgdGhlIHByb3RlY3Rpb24sIG5vdCB0aGUgZXhlY3V0b3IncyBpZGVudGl0eS4gVGhlIGFjdGlvbgovLyBtdXN0IGV4aXN0LCBiZSBwZW5kaW5nLCBpdHMgZGVsYXkgZWxhcHNlZCwgYW5kIGl0cyBncmFjZSB3aW5kb3cgbm90Ci8vIHlldCBleHBpcmVkLgpmdW5jIEV4ZWN1dGUoY3VyIHJlYWxtLCBhY3Rpb25JRCBzdHJpbmcpIHN0cmluZyB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJYSA6PSBtdXN0R2V0KGFjdGlvbklEKQoJaWYgYS5FeGVjdXRlZCB7CgkJcGFuaWMoImFjdGlvbiBhbHJlYWR5IGV4ZWN1dGVkIikKCX0KCWlmIG5vdygpLkJlZm9yZShhLkV4ZWN1dGVBZnRlcikgewoJCXJlbWFpbmluZyA6PSBhLkV4ZWN1dGVBZnRlci5TdWIobm93KCkpCgkJcGFuaWMoInRvbyBlYXJseTogIiArIHN0cmNvbnYuRm9ybWF0SW50KGludDY0KHJlbWFpbmluZy90aW1lLlNlY29uZCksIDEwKSArICJzIHJlbWFpbmluZyIpCgl9CglpZiBub3coKS5BZnRlcihhLkV4cGlyZXNBdCkgewoJCXBhbmljKCJhY3Rpb24gZXhwaXJlZDogdGhlIGdyYWNlIHdpbmRvdyBvZiAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoR3JhY2VQZXJpb2QsIDEwKSArICJzIGFmdGVyIHJlYWRpbmVzcyBoYXMgcGFzc2VkIikKCX0KCglhLkV4ZWN1dGVkID0gdHJ1ZQoJZHJvcFBlbmRpbmcoYS5UYXJnZXQsIGFjdGlvbklEKQoJY2hhaW4uRW1pdCgidGltZWxvY2tfZXhlY3V0ZWQiLCAiaWQiLCBhY3Rpb25JRCwgInRhcmdldCIsIGEuVGFyZ2V0KQoJcmV0dXJuICJleGVjdXRlZDogIiArIGFjdGlvbklECn0KCi8vIENhbmNlbCByZW1vdmVzIGEgcGVuZGluZyBhY3Rpb24uIE9ubHkgdGhlIHRhcmdldCdzIENVUlJFTlQgb3duZXIgY2FuCi8vIGNhbmNlbCAocmUtYXVkaXQ6IHRoZSBzY2hlZHVsaW5nIGNyZWF0b3IncyByaWdodHMgbXVzdCBub3Qgc3Vydml2ZSBhbgovLyBvd25lcnNoaXAgdHJhbnNmZXIpLiBUaGUgcmVjb3JkIGlzIHJlYXBlZDsgaGlzdG9yeSBpcyB0aGUgZXZlbnQuCmZ1bmMgQ2FuY2VsKGN1ciByZWFsbSwgYWN0aW9uSUQgc3RyaW5nKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWEgOj0gbXVzdEdldChhY3Rpb25JRCkKCXQgOj0gbXVzdEdldFRhcmdldChhLlRhcmdldCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSB0Lk93bmVyIHsKCQlwYW5pYygib25seSB0aGUgdGFyZ2V0IG93bmVyIGNhbiBjYW5jZWwiKQoJfQoJaWYgYS5FeGVjdXRlZCB7CgkJcGFuaWMoImNhbm5vdCBjYW5jZWwgYW4gYWxyZWFkeS1leGVjdXRlZCBhY3Rpb24iKQoJfQoJaWYgZXhwaXJlZChhKSB7CgkJcGFuaWMoImFjdGlvbiBleHBpcmVkOiBub3RoaW5nIHRvIGNhbmNlbCAodXNlIEV4cGlyZSkiKQoJfQoKCWNoYWluLkVtaXQoInRpbWVsb2NrX2NhbmNlbGxlZCIsICJpZCIsIGFjdGlvbklELCAidGFyZ2V0IiwgYS5UYXJnZXQpCglyZWFwKGFjdGlvbklEKQoJcmV0dXJuICJjYW5jZWxsZWQ6ICIgKyBhY3Rpb25JRAp9CgovLyBWZXRvIGNhbmNlbHMgYSBwZW5kaW5nIGFjdGlvbiBhcyB0aGUgdGFyZ2V0J3MgZ3VhcmRpYW4uIFRoaXMgaXMgdGhlCi8vIGd1YXJkaWFuJ3Mgd2hvbGUgcG93ZXI6IGl0IGNhbiBzdG9wIGEgc2NoZWR1bGVkIGFjdGlvbiBkdXJpbmcgdGhlCi8vIGRlbGF5IHdpbmRvdywgbmV2ZXIgY3JlYXRlIG9yIGV4ZWN1dGUgb25lLiBUaGUgcmVjb3JkIGlzIHJlYXBlZDsKLy8gaGlzdG9yeSBpcyB0aGUgZXZlbnQuCmZ1bmMgVmV0byhjdXIgcmVhbG0sIGFjdGlvbklEIHN0cmluZykgc3RyaW5nIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglhIDo9IG11c3RHZXQoYWN0aW9uSUQpCgl0IDo9IG11c3RHZXRUYXJnZXQoYS5UYXJnZXQpCglpZiB0Lkd1YXJkaWFuID09ICIiIHsKCQlwYW5pYygidGFyZ2V0IGhhcyBubyBndWFyZGlhbjogIiArIGEuVGFyZ2V0KQoJfQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IHQuR3VhcmRpYW4gewoJCXBhbmljKCJvbmx5IHRoZSB0YXJnZXQgZ3VhcmRpYW4gY2FuIHZldG8iKQoJfQoJaWYgYS5FeGVjdXRlZCB7CgkJcGFuaWMoImNhbm5vdCB2ZXRvIGFuIGFscmVhZHktZXhlY3V0ZWQgYWN0aW9uIikKCX0KCWlmIGV4cGlyZWQoYSkgewoJCXBhbmljKCJhY3Rpb24gZXhwaXJlZDogbm90aGluZyB0byB2ZXRvICh1c2UgRXhwaXJlKSIpCgl9CgoJY2hhaW4uRW1pdCgidGltZWxvY2tfdmV0b2VkIiwgImlkIiwgYWN0aW9uSUQsICJ0YXJnZXQiLCBhLlRhcmdldCkKCXJlYXAoYWN0aW9uSUQpCglyZXR1cm4gInZldG9lZDogIiArIGFjdGlvbklECn0KCi8vIEV4cGlyZSByZWFwcyBhIHByb3ZhYmx5IGV4cGlyZWQgYWN0aW9uLiBQZXJtaXNzaW9ubGVzcyAoZml4IFkyKTogYW4KLy8gZXhwaXJlZCBhY3Rpb24gZGVjaWRlcyBub3RoaW5nIOKAlCByZWFwaW5nIGl0IG9ubHkgd3JpdGVzIGRvd24gd2hhdCB0aGUKLy8gY2xvY2sgYWxyZWFkeSBkZWNpZGVkIOKAlCBzbyBhbnlvbmUgbWF5IGZyZWUgdGhlIHF1b3RhIHNsb3QgaXQgaG9sZHMuCi8vIFRoaXMgaXMgdGhlIHJlY292ZXJ5IHZhbHZlIHRoYXQgbWFrZXMgYSB3ZWRnZWQgdGFyZ2V0IGltcG9zc2libGU6Ci8vIGJlZm9yZSBpdCwgYSBwaGFudG9tIGV4cGlyZWQgZW50cnkgY29uc3VtZWQgcXVvdGEgYW5kIGJsb2NrZWQKLy8gU2V0R3VhcmRpYW4gdW50aWwgYSBnbG9iYWwgc3dlZXAgaGFwcGVuZWQgdG8gcmVhY2ggaXQ7IG5vdyBpdHMgb3duCi8vIHRhcmdldCdzIG93bmVyIOKAlCBvciBhbnlvbmUgZWxzZSDigJQgcmVhcHMgaXQgZGlyZWN0bHkuCmZ1bmMgRXhwaXJlKGN1ciByZWFsbSwgYWN0aW9uSUQgc3RyaW5nKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWEgOj0gbXVzdEdldChhY3Rpb25JRCkKCWlmIGEuRXhlY3V0ZWQgewoJCXBhbmljKCJhY3Rpb24gYWxyZWFkeSBleGVjdXRlZCIpCgl9CglpZiAhZXhwaXJlZChhKSB7CgkJcGFuaWMoImFjdGlvbiBpcyBub3QgZXhwaXJlZCIpCgl9CgljaGFpbi5FbWl0KCJ0aW1lbG9ja19leHBpcmVkIiwgImlkIiwgYWN0aW9uSUQsICJ0YXJnZXQiLCBhLlRhcmdldCkKCXJlYXAoYWN0aW9uSUQpCglyZXR1cm4gImV4cGlyZWQ6ICIgKyBhY3Rpb25JRAp9CgovLyAtLS0tLS0tLS0tIHJlYWQtb25seSBxdWVyaWVzIC0tLS0tLS0tLS0KCi8vIEdldFRhcmdldCByZXR1cm5zIGEgZm9ybWF0dGVkIHN1bW1hcnkgb2YgYSByZWdpc3RlcmVkIHRhcmdldC4KZnVuYyBHZXRUYXJnZXQodGFyZ2V0TmFtZSBzdHJpbmcpIHN0cmluZyB7Cgl0IDo9IG11c3RHZXRUYXJnZXQodGFyZ2V0TmFtZSkKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiVGFyZ2V0OiAiICsgdC5OYW1lICsgIlxuIikKCWIuV3JpdGVTdHJpbmcoIk93bmVyOiAiICsgc3RyaW5nKHQuT3duZXIpICsgIlxuIikKCWd1YXJkaWFuIDo9ICJub25lIgoJaWYgdC5HdWFyZGlhbiAhPSAiIiB7CgkJZ3VhcmRpYW4gPSBzdHJpbmcodC5HdWFyZGlhbikKCX0KCWIuV3JpdGVTdHJpbmcoIkd1YXJkaWFuOiAiICsgZ3VhcmRpYW4gKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiTWluIGRlbGF5OiAiICsgc3RyY29udi5Gb3JtYXRJbnQodC5NaW5EZWxheSwgMTApICsgInNcbiIpCglpZiB0LlBlbmRpbmdPd25lciAhPSAiIiB7CgkJYi5Xcml0ZVN0cmluZygiUGVuZGluZyBvd25lcjogIiArIHN0cmluZyh0LlBlbmRpbmdPd25lcikgKyAiXG4iKQoJfQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gR2V0QWN0aW9uIHJldHVybnMgYSBmb3JtYXR0ZWQgc3VtbWFyeSBvZiBhIHNpbmdsZSBwZW5kaW5nIG9yIGV4ZWN1dGVkCi8vIGFjdGlvbi4gQ2FuY2VsbGVkL3ZldG9lZC9leHBpcmVkIGFjdGlvbnMgYXJlIHJlYXBlZCDigJQgdGhlaXIgaGlzdG9yeQovLyBpcyBpbiBlbWl0dGVkIGV2ZW50cy4KZnVuYyBHZXRBY3Rpb24oYWN0aW9uSUQgc3RyaW5nKSBzdHJpbmcgewoJYSA6PSBtdXN0R2V0KGFjdGlvbklEKQoJcmV0dXJuIGZvcm1hdEFjdGlvbihhKQp9CgovLyBHZXRQZW5kaW5nIHJldHVybnMgdGhlIElEcyBvZiBhbGwgcGVuZGluZywgbm9uLWV4cGlyZWQgYWN0aW9ucywKLy8gZ3JvdXBlZCBieSB0YXJnZXQsIGluc2VydGlvbi1vcmRlcmVkIHdpdGhpbiBhIHRhcmdldC4gT25seSB0YXJnZXRzCi8vIHRoYXQgYWN0dWFsbHkgaG9sZCBsaXZlIHBlbmRpbmdzIGFyZSB2aXNpdGVkIChyb3VuZC0yIGZpeCBZLTEpLCBzbwovLyB0aGUgc2NhbiBjYW5ub3QgYmUgaW5mbGF0ZWQgYnkgcmVnaXN0cmF0aW9ucyBhbG9uZS4KZnVuYyBHZXRQZW5kaW5nKCkgc3RyaW5nIHsKCXZhciByZXN1bHRzIFtdc3RyaW5nCglmb3IgXywgbmFtZSA6PSByYW5nZSBwZW5kaW5nVGFyZ2V0cyB7CgkJZm9yIF8sIGlkIDo9IHJhbmdlIHBlbmRpbmdbbmFtZV0gewoJCQlhIDo9IGFjdGlvbnNbaWRdCgkJCWlmIGEgPT0gbmlsIHx8IGEuRXhlY3V0ZWQgfHwgZXhwaXJlZChhKSB7CgkJCQljb250aW51ZQoJCQl9CgkJCXJlc3VsdHMgPSBhcHBlbmQocmVzdWx0cywgYS5JRCkKCQl9Cgl9CglpZiBsZW4ocmVzdWx0cykgPT0gMCB7CgkJcmV0dXJuICJub25lIgoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihyZXN1bHRzLCAiLCAiKQp9CgovLyBJc1JlYWR5IHJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aW9uIGV4aXN0cywgaXMgcGVuZGluZywgaXRzIGRlbGF5IGhhcwovLyBlbGFwc2VkLCBhbmQgaXQgaGFzIG5vdCBleHBpcmVkLgpmdW5jIElzUmVhZHkoYWN0aW9uSUQgc3RyaW5nKSBib29sIHsKCWEsIG9rIDo9IGFjdGlvbnNbYWN0aW9uSURdCglpZiAhb2sgfHwgYS5FeGVjdXRlZCB8fCBleHBpcmVkKGEpIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXJldHVybiAhbm93KCkuQmVmb3JlKGEuRXhlY3V0ZUFmdGVyKQp9CgovLyBJc0V4ZWN1dGVkIHJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aW9uIGV4aXN0cyBhbmQgd2FzIGV4ZWN1dGVkLiBUaGlzIGlzCi8vIHRoZSBjb25zdW1lci1zaWRlIGNoZWNrOiBjb21iaW5lZCB3aXRoIHRhcmdldCByZWdpc3RyYXRpb24gaXQgYXR0ZXN0cwovLyB0aGF0IHRoZSB0YXJnZXQncyByZWdpc3RlcmVkIG93bmVyIHNjaGVkdWxlZCB0aGUgYWN0aW9uLCBpdCB3YWl0ZWQgYXQKLy8gbGVhc3QgdGhlIHJlZ2lzdGVyZWQgbWluaW11bSBkZWxheSwgbm8gZ3VhcmRpYW4gdmV0b2VkIGl0LCBhbmQgaXQgd2FzCi8vIGV4ZWN1dGVkIHdpdGhpbiBpdHMgZ3JhY2Ugd2luZG93LiBFeGVjdXRlZCByZWNvcmRzIGFyZSBwZXJtYW5lbnQuCmZ1bmMgSXNFeGVjdXRlZChhY3Rpb25JRCBzdHJpbmcpIGJvb2wgewoJYSwgb2sgOj0gYWN0aW9uc1thY3Rpb25JRF0KCXJldHVybiBvayAmJiBhLkV4ZWN1dGVkCn0KCi8vIC0tLS0tLS0tLS0gcmVuZGVyIC0tLS0tLS0tLS0KCi8vIFJlbmRlciByZXR1cm5zIGEgbWFya2Rvd24gb3ZlcnZpZXcuIE5ldmVyIHBhbmljcy4gQ2FuY2VsbGVkLCB2ZXRvZWQsCi8vIGFuZCBleHBpcmVkIGFjdGlvbnMgYXJlIHJlYXBlZCBmcm9tIHN0YXRlOyB0aGVpciBoaXN0b3J5IGlzIGluCi8vIGV2ZW50cy4gVGhlIHBhZ2Ugc2hvd3MgdGhlIG1vc3QgcmVjZW50IGFjdGlvbnMgb25seSAodGhlIG9yZGVyaW5nCi8vIGluZGV4IGlzIGJvdW5kZWQg4oCUIGZpeCBZNCk7IG9sZGVyIGV4ZWN1dGVkIHJlY29yZHMgc3RheSBxdWVyeWFibGUKLy8gdmlhIEdldEFjdGlvbi9Jc0V4ZWN1dGVkIGZvcmV2ZXIuCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgYWN0aW9ucyA9PSBuaWwgfHwgbGVuKGFjdGlvbnMpID09IDAgewoJCXJldHVybiAiIyBUaW1lbG9jayBHdWFyZGlhblxuXG5ObyBhY3Rpb25zIHNjaGVkdWxlZC5cbiIKCX0KCgkvLyBUaGUgUGVuZGluZyBzZWN0aW9uIHJlYWRzIHRoZSBsaXZlIHBlci10YXJnZXQgbGlzdHMsIHNvIGZsb29kaW5nCgkvLyB0aGUgcmVhbG0gd2l0aCBleGVjdXRlZCBjaHVybiBjYW4gbmV2ZXIgcHVzaCBhIHN0aWxsLWxpdmUgcGVuZGluZwoJLy8gYWN0aW9uIG9mZiB0aGUgcGFnZSBkdXJpbmcgaXRzIGRlbGF5IHdpbmRvdyAocm91bmQtMiBmaXggWS0yKS4KCXZhciBwZW5kaW5nTGlzdCBbXSpBY3Rpb24KCXRydW5jYXRlZCA6PSBmYWxzZQoJZm9yIF8sIG5hbWUgOj0gcmFuZ2UgcGVuZGluZ1RhcmdldHMgewoJCWZvciBfLCBpZCA6PSByYW5nZSBwZW5kaW5nW25hbWVdIHsKCQkJYSA6PSBhY3Rpb25zW2lkXQoJCQlpZiBhID09IG5pbCB8fCBhLkV4ZWN1dGVkIHx8IGV4cGlyZWQoYSkgewoJCQkJY29udGludWUKCQkJfQoJCQlpZiBsZW4ocGVuZGluZ0xpc3QpID49IE1heFJlbmRlckFjdGlvbnMgewoJCQkJdHJ1bmNhdGVkID0gdHJ1ZQoJCQkJYnJlYWsKCQkJfQoJCQlwZW5kaW5nTGlzdCA9IGFwcGVuZChwZW5kaW5nTGlzdCwgYSkKCQl9CgkJaWYgdHJ1bmNhdGVkIHsKCQkJYnJlYWsKCQl9Cgl9CgoJLy8gVGhlIEV4ZWN1dGVkIHNlY3Rpb24gcmVhZHMgdGhlIGJvdW5kZWQgcmVuZGVyIGluZGV4OiByZWNlbnQKCS8vIGF0dGVzdGF0aW9ucyBvbmx5OyBvbGRlciBvbmVzIHN0YXkgcXVlcnlhYmxlIHZpYSBHZXRBY3Rpb24uCgl2YXIgZXhlY3V0ZWRMaXN0IFtdKkFjdGlvbgoJc2hvdyA6PSBhY3Rpb25JRHMKCWlmIGxlbihzaG93KSA+IE1heFJlbmRlckFjdGlvbnMgewoJCXNob3cgPSBzaG93W2xlbihzaG93KS1NYXhSZW5kZXJBY3Rpb25zOl0KCQl0cnVuY2F0ZWQgPSB0cnVlCgl9Cglmb3IgXywgaWQgOj0gcmFuZ2Ugc2hvdyB7CgkJYSA6PSBhY3Rpb25zW2lkXQoJCWlmIGEgPT0gbmlsIHx8ICFhLkV4ZWN1dGVkIHsKCQkJY29udGludWUKCQl9CgkJZXhlY3V0ZWRMaXN0ID0gYXBwZW5kKGV4ZWN1dGVkTGlzdCwgYSkKCX0KCgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIiMgVGltZWxvY2sgR3VhcmRpYW5cblxuIikKCWlmIHRydW5jYXRlZCB7CgkJYi5Xcml0ZVN0cmluZygiX1Nob3dpbmcgYXQgbW9zdCAiICsgc3RyY29udi5JdG9hKE1heFJlbmRlckFjdGlvbnMpICsgIiBhY3Rpb25zIHBlciBzZWN0aW9uLl9cblxuIikKCX0KCglzZWN0aW9uIDo9IGZ1bmModGl0bGUgc3RyaW5nLCBsaXN0IFtdKkFjdGlvbikgewoJCWlmIGxlbihsaXN0KSA9PSAwIHsKCQkJcmV0dXJuCgkJfQoJCWIuV3JpdGVTdHJpbmcoIiMjICIgKyB0aXRsZSArICIgKCIgKyBzdHJjb252Lkl0b2EobGVuKGxpc3QpKSArICIpXG5cbiIpCgkJZm9yIF8sIGEgOj0gcmFuZ2UgbGlzdCB7CgkJCWIuV3JpdGVTdHJpbmcocmVuZGVyQWN0aW9uUm93KGEpKQoJCX0KCQliLldyaXRlU3RyaW5nKCJcbiIpCgl9CglzZWN0aW9uKCJQZW5kaW5nIiwgcGVuZGluZ0xpc3QpCglzZWN0aW9uKCJFeGVjdXRlZCIsIGV4ZWN1dGVkTGlzdCkKCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyAtLS0tLS0tLS0tIGZvcm1hdHRpbmcgaGVscGVycyAtLS0tLS0tLS0tCgpmdW5jIGZvcm1hdEFjdGlvbihhICpBY3Rpb24pIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIklEOiAiICsgYS5JRCArICJcbiIpCgliLldyaXRlU3RyaW5nKCJUYXJnZXQ6ICIgKyBzYW5pdGl6ZShhLlRhcmdldCkgKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiQ3JlYXRvcjogIiArIHN0cmluZyhhLkNyZWF0b3IpICsgIlxuIikKCWIuV3JpdGVTdHJpbmcoIkRhdGE6ICIgKyBzYW5pdGl6ZShhLkRhdGEpICsgIlxuIikKCWIuV3JpdGVTdHJpbmcoIlNjaGVkdWxlZDogIiArIGEuU2NoZWR1bGVkQXQuRm9ybWF0KHRpbWUuUkZDMzMzOSkgKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiRXhlY3V0ZSBhZnRlcjogIiArIGEuRXhlY3V0ZUFmdGVyLkZvcm1hdCh0aW1lLlJGQzMzMzkpICsgIlxuIikKCWIuV3JpdGVTdHJpbmcoIkV4cGlyZXM6ICIgKyBhLkV4cGlyZXNBdC5Gb3JtYXQodGltZS5SRkMzMzM5KSArICJcbiIpCgoJc3dpdGNoIHsKCWNhc2UgYS5FeGVjdXRlZDoKCQliLldyaXRlU3RyaW5nKCJTdGF0dXM6IGV4ZWN1dGVkXG4iKQoJY2FzZSBleHBpcmVkKGEpOgoJCWIuV3JpdGVTdHJpbmcoIlN0YXR1czogZXhwaXJlZFxuIikKCWNhc2Ugbm93KCkuQmVmb3JlKGEuRXhlY3V0ZUFmdGVyKToKCQlyZW1haW5pbmcgOj0gYS5FeGVjdXRlQWZ0ZXIuU3ViKG5vdygpKQoJCWIuV3JpdGVTdHJpbmcoIlN0YXR1czogbG9ja2VkICgiICsgc3RyY29udi5Gb3JtYXRJbnQoaW50NjQocmVtYWluaW5nL3RpbWUuU2Vjb25kKSwgMTApICsgInMgcmVtYWluaW5nKVxuIikKCWRlZmF1bHQ6CgkJYi5Xcml0ZVN0cmluZygiU3RhdHVzOiByZWFkeVxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVyQWN0aW9uUm93KGEgKkFjdGlvbikgc3RyaW5nIHsKCWRhdGEgOj0gdHJ1bmNhdGUoc2FuaXRpemUoYS5EYXRhKSwgNDApCgoJc3RhdHVzIDo9ICJwZW5kaW5nIgoJc3dpdGNoIHsKCWNhc2UgYS5FeGVjdXRlZDoKCQlzdGF0dXMgPSAiZXhlY3V0ZWQiCgljYXNlIGV4cGlyZWQoYSk6CgkJc3RhdHVzID0gImV4cGlyZWQiCgljYXNlICFub3coKS5CZWZvcmUoYS5FeGVjdXRlQWZ0ZXIpOgoJCXN0YXR1cyA9ICIqKnJlYWR5KioiCgl9CgoJcmV0dXJuICItICoqIiArIGEuSUQgKyAiKiogfCB0YXJnZXQ6IGAiICsgc2FuaXRpemUoYS5UYXJnZXQpICsgImAgfCAiICsgZGF0YSArICIgfCAiICsgc3RhdHVzICsgIlxuIgp9CiINMTAwMDAwMDB1Z25vdBISCJTO1jcSCzExNjc2NHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkDH0N3GFa2E1O4YTWnXj6JEfgw3ur2cWD2Kjd7MDe36rScdQHR3njMxwkMc+py4R6stxzNW2PTr9TLyRuNhqEe7GihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}