{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "8Yilj4OxNS8w7wJYodqrfMwHyRyHDJCGg4aCVPWocJo=",
    "height": "558757",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "81908971",
      "GasUsed": "54605981"
    },
    "tx": "CtzAAgoML3ZtLm1fYWRkcGtnEsrAAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKNwAIKCXNlYWxlZGJpZBI9Z25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3NlYWxlZGJpZBpkCgtnbm9tb2QudG9tbBJVbW9kdWxlID0gImduby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9zZWFsZWRiaWQiCmdubyA9ICIwLjkiChrZvgIKDXNlYWxlZGJpZC5nbm8Sxr4CLy8gUmVhbG0gc2VhbGVkYmlkIGlzIGEgU0VBTEVELUJJRCBTRUNPTkQtUFJJQ0UgKFZpY2tyZXkpIGF1Y3Rpb24gc2V0dGxlZCBpbgovLyB1Z25vdCwgaG9sZGluZyByZWFsIGNvaW5zLiBBIFNFTExFUiBsaXN0cyBhIGxvdDsgQklEREVSUyBjb21taXQgdG8gYSBwcmljZQovLyB0aGV5IG5ldmVyIGRpc2Nsb3NlLCBieSBwdWJsaXNoaW5nIG9ubHkgc2hhMjU2KGFtb3VudCwgc2FsdCkgYW5kIGVzY3Jvd2luZyBhCi8vIGRlcG9zaXQ7IGFmdGVyIHRoZSBjb21taXQgd2luZG93IGNsb3NlcyB0aGV5IE9QRU4gdGhlaXIgYmlkcyBieSByZXZlYWxpbmcKLy8gKGFtb3VudCwgc2FsdCk7IHRoZSBoaWdoZXN0IHJldmVhbGVkIGJpZCB3aW5zIGFuZCB0aGUgd2lubmVyIHBheXMgdGhlIFNFQ09ORAovLyBoaWdoZXN0IHByaWNlLCB0aGVpciBkZXBvc2l0IHJlZnVuZGVkIGRvd24gdG8gaXQuCi8vCi8vIEl0IGlzIGEgZGlmZmVyZW50IGNsZWFyaW5nIHJ1bGUgYW5kIGEgZGlmZmVyZW50IHRocmVhdCBtb2RlbCBmcm9tIHRoaXMKLy8gcG9ydGZvbGlvJ3Mgb3RoZXIgbWFya2V0IHJlYWxtLiByL2F1Y3Rpb24gaXMgYXNjZW5kaW5nIEVuZ2xpc2ggb3Blbi1vdXRjcnk6Ci8vIGV2ZXJ5IGJpZCBpcyBwdWJsaWMgdGhlIGluc3RhbnQgaXQgbGFuZHMsIGJpZGRlcnMgcmVhY3QgdG8gZWFjaCBvdGhlciwgYW5kCi8vIHRoZSB3aW5uZXIgcGF5cyB0aGVpciBvd24gYmlkLiBIZXJlIG5vIGJpZGRlciBsZWFybnMgYW5vdGhlcidzIG51bWJlciB1bnRpbAovLyB0aGUgY29tbWl0IHdpbmRvdyBoYXMgc2h1dCwgc28gdGhlcmUgaXMgbm90aGluZyB0byByZWFjdCB0byBhbmQgbm90aGluZyB0bwovLyBmcm9udC1ydW47IGFuZCBiZWNhdXNlIHRoZSB3aW5uZXIgcGF5cyB0aGUgcnVubmVyLXVwJ3MgcHJpY2UsIGJpZGRpbmcgb25lJ3MKLy8gdHJ1ZSB2YWx1YXRpb24gaXMgdGhlIGRvbWluYW50IHN0cmF0ZWd5IHJhdGhlciB0aGFuIGEgbWlzdGFrZS4gVGhlIHR3bwovLyByZWFsbXMgYW5zd2VyIHRoZSBzYW1lIHF1ZXN0aW9uIOKAlCB3aG8gZ2V0cyB0aGUgbG90LCBhdCB3aGF0IHByaWNlIOKAlCBieQovLyBtZWNoYW5pc21zIHRoYXQgZG8gbm90IHJlc2VtYmxlIGVhY2ggb3RoZXIuCi8vCi8vIENPTU1JVC1SRVZFQUwgaXMgdGhlIG1lY2hhbmlzbSB0aGlzIHBvcnRmb2xpbyBkaWQgbm90IGhhdmUuIE5vdGhpbmcgaW4gaXQKLy8gaGFzaGVkIGFueXRoaW5nLCBvbiBhbnkgb2YgdGhlIHRocmVlIHRyZWVzLCBiZWZvcmUgdGhpcyByZWFsbS4KLy8KLy8gIyBDdXN0b2R5IOKAlCB0aGUgY29uc2VydmF0aW9uIGludmFyaWFudCBpcyB0aGUgcHJvZHVjdAovLwovLyBBIGN1c3RvZGlhbCByZWFsbSwgc28gdGhlIG1vbmV0YXJ5IGludmFyaWFudCBnb3Zlcm5zIGl0IGFzIGl0IGRvZXMgci9sb2FucywKLy8gci9hdWN0aW9uIGFuZCByL2RlcG9zaXRzOgovLwovLwlIZWxkID09IHNlYWxlZCArIHJldmVhbGVkICsgZmVlbGVkZ2VyLkxpYWJpbGl0aWVzKCkKLy8KLy8gd2hlcmUgYHNlYWxlZGAgaXMgdGhlIHN1bSBvZiBkZXBvc2l0cyBiZWhpbmQgY29tbWl0bWVudHMgdGhhdCBoYXZlIE5PVCBiZWVuCi8vIG9wZW5lZCBpbiBhIG5vbi10ZXJtaW5hbCBzYWxlLCBgcmV2ZWFsZWRgIHRoZSBzdW0gb2YgZGVwb3NpdHMgYmVoaW5kCi8vIGNvbW1pdG1lbnRzIHRoYXQgSEFWRSBiZWVuIG9wZW5lZCBhbmQgYXJlIGF3YWl0aW5nIGNsb3NlLCBhbmQgdGhlIGxlZGdlcgovLyBob2xkcyBldmVyeSBjbGFpbWFibGUga2luZCDigJQgbG9zaW5nLWJpZCByZWZ1bmRzLCB0aGUgd2lubmVyJ3MgY2hhbmdlLCBzZWxsZXIKLy8gcHJvY2VlZHMg4oCUIHBsdXMgdGhlIGZlZSBwb3QuIFRoZSB0d28gaGVsZCBidWNrZXRzIGFyZSBkaXNqb2ludCBieQovLyBjb25zdHJ1Y3Rpb246IG9wZW5pbmcgYSBiaWQgbW92ZXMgaXRzIGRlcG9zaXQgZnJvbSB0aGUgZmlyc3QgdG8gdGhlIHNlY29uZCwKLy8gbmV2ZXIgZHVwbGljYXRpbmcgaXQsIGFuZCBDbG9zZSBkcmFpbnMgYm90aCBpbnRvIHRoZSBsZWRnZXIuIEV2ZXJ5IHZhbHVlCi8vIHRyYW5zaXRpb24gcHJlc2VydmVzIHRoZSBlcXVhbGl0eTsgc2VlIHRoZSBERUxUQS1mb3JtIGNvbnNlcnZhdGlvbiB0ZXN0LgovLwovLyBDT1JSRUNUSU9OLCByZWNvcmRlZCByYXRoZXIgdGhhbiBzaGlwcGVkIHNpbGVudGx5OiB0aGUgwqc3IGRpc2NvdmVyeSBnYXRlIGZvcgovLyB0aGlzIHJlYWxtIHByZWRpY3RlZCBUSFJFRSBkaXNqb2ludCBoZWxkIGJ1Y2tldHMsIG5hbWluZyBgZm9yZmVpdGVkYCBhcyB0aGUKLy8gdGhpcmQuIEFyY2hpdGVjdHVyZSByZWZ1dGVkIHRoYXQuIEEgZm9yZmVpdGVkIGRlcG9zaXQgaXMgY3JlZGl0ZWQgdG8gdGhlCi8vIHNlbGxlciBhdCBDbG9zZSBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiB0aGF0IHZvaWRzIHRoZSBjb21taXRtZW50LCBzbyBpdCBpcwovLyBuZXZlciBoZWxkIGFzIGEgZGlzdGluY3QgYmFsYW5jZSBhY3Jvc3MgYW55IHR3byB0cmFuc2FjdGlvbnMg4oCUIHRoZXJlIGlzIG5vCi8vIHRoaXJkIGJ1Y2tldCB0byBiZSBkaXNqb2ludCBmcm9tLiBgZm9yZmVpdGVkYCBzdXJ2aXZlcyBhcyBhIENVTVVMQVRJVkUKLy8gU1RBVElTVElDIChbRm9yZmVpdGVkT2ZdLCBbRm9yZmVpdGVkVG90YWxdKSwgd2hpY2ggaXMgYSByZXBvcnQgYW5kIG5vdCBhCi8vIGN1c3RvZHkgY2xhaW0uIFRoZSBnYXRlJ3MgZmlsZSBpcyBub3QgZWRpdGVkOyB0aGlzIGlzIHRoZSBhbWVuZG1lbnQuCi8vCi8vIFBheW91dHMgYXJlIFBVTEwsIG5ldmVyIHB1c2guIENsb3NlIGNyZWRpdHMgYmFsYW5jZXMgYW5kIHNlbmRzIG5vdGhpbmcsIHNvIGEKLy8gaG9zdGlsZSBvciBjb250cmFjdC1kZWFkIGxvc2VyIGNhbm5vdCBtYWtlIENsb3NlIGZhaWwgZm9yIGV2ZXJ5b25lIGVsc2UsIGFuZAovLyB0aGUgc2V0dGxlbWVudCBwYXRoIGhhcyBubyBjcm9zcy1jYWxsIHJlZW50cmFuY3kgc3VyZmFjZS4KLy8KLy8gIyBOb24tcmV2ZWxhdGlvbiwgYW5kIHdoeSB3aXRoaG9sZGluZyBuZXZlciBwYXlzCi8vCi8vIEEgc2VhbGVkLWJpZCBhdWN0aW9uIGhhcyBhIGxpdmVuZXNzIHByb2JsZW0gYW4gYXNjZW5kaW5nIG9uZSBkb2VzIG5vdDogYQovLyBiaWRkZXIgd2hvIGRpc2xpa2VzIHRoZSBvdXRjb21lIGNhbiBzaW1wbHkgbmV2ZXIgb3BlbiB0aGVpciBiaWQsIHN0YWxsaW5nCi8vIHNldHRsZW1lbnQgb3IgZGlzdG9ydGluZyB0aGUgcHJpY2UuIFRoZSBhbnN3ZXIgaGVyZSBpcyBhZG9wdGVkIGJ5IGNpdGF0aW9uCi8vIHJhdGhlciB0aGFuIGludmVudGVkIOKAlCByL21vdWwvYWdlbnRzL2J1YmJsZXJ1bWJsZTYgcmVhY2hlZCBpdCBpbmRlcGVuZGVudGx5LAovLyBhbmQgaXRzIHBvbGljeSBpcyB0aGUgcmlnaHQgb25lOiBhIGNvbW1pdG1lbnQgbm90IG9wZW5lZCBpbiBpdHMgd2luZG93IGlzCi8vIFZPSUQsIG5vdGhpbmcgaXMgcmVmdW5kZWQsIGFuZCB0aGUgZGVwb3NpdCBpcyBjcmVkaXRlZCB0byB0aGUgc2VsbGVyLiBTbwovLyB3aXRoaG9sZGluZyBhIHJldmVhbCBjb3N0cyB0aGUgd2l0aGhvbGRlciB0aGVpciB3aG9sZSBkZXBvc2l0IGFuZCBwYXlzIHRoZW0KLy8gbm90aGluZywgYW5kIHRoZSBhdWN0aW9uIGFsd2F5cyBjbG9zZXM6IENsb3NlIGlzIHBlcm1pc3Npb25sZXNzIGFuZCBuZWVkcyBubwovLyBiaWRkZXIgdG8gYWN0LgovLwovLyBUd28gY29uc2VxdWVuY2VzIG9mIHRoYXQgcG9saWN5IGFyZSBoYXphcmRzLCBzdGF0ZWQgcmF0aGVyIHRoYW4gZGlzY292ZXJlZDoKLy8KLy8gICAtIEEgU0hPUlQgUkVWRUFMIFdJTkRPVyBJUyBBIFNFTExFUidTIElOQ0VOVElWRSBUTyBTRVQuIFRoZSBzZWxsZXIga2VlcHMKLy8gICAgIGV2ZXJ5IHVub3BlbmVkIGRlcG9zaXQsIHNvIGEgc2VsbGVyIHdobyBwaWNrcyB0aGUgTWluUmV2ZWFsQmxvY2tzIGZsb29yCi8vICAgICBwcm9maXRzIGZyb20gYmlkZGVycyB3aG8gY2Fubm90IGFjdCBpbiB0aW1lLiBUaGUgd2luZG93IGlzIHB1YmxpYyBiZWZvcmUKLy8gICAgIGFueW9uZSBjb21taXRzIGFuZCBpcyByZXBvcnRlZCBieSBbU2FsZUluZm9dIGFuZCBbUGhhc2VdOyBhIGJpZGRlciB3aG8KLy8gICAgIGRvZXMgbm90IGxpa2UgaXQgc2hvdWxkIG5vdCBjb21taXQuIFRoZSByZWFsbSBkb2VzIG5vdCBzZWNvbmQtZ3Vlc3MgYQovLyAgICAgZGlzY2xvc2VkIHRlcm0uCi8vICAgLSBBIENPTU1JVE1FTlQgQUJPVkUgT05FJ1MgREVQT1NJVCBDQU4gTkVWRVIgQkUgT1BFTkVELiBSZXZlYWwgcmVxdWlyZXMKLy8gICAgIGBhbW91bnQgPD0gZGVwb3NpdGAsIHNvIGEgYmlkZGVyIHdobyBjb21taXRzIHRvIG1vcmUgdGhhbiB0aGV5IGVzY3Jvd2VkCi8vICAgICBoYXMgbm8gdmFsaWQgb3BlbmluZyBhbmQgZm9yZmVpdHMuIFRoYXQgaXMgdGhlIGRlcG9zaXQtYXMtY2VpbGluZyBydWxlLAovLyAgICAgYW5kIGl0IGlzIHdoYXQgbWFrZXMgdGhlIGVzY3JvdyBzdWZmaWNpZW50OiBjb21taXQgdG8gbm8gbW9yZSB0aGFuIHlvdQovLyAgICAgcHV0IHVwLgovLwovLyAjIFByaXZhY3kg4oCUIHdoYXQgaXMgaGlkZGVuLCBhbmQgd2hhdCBpcyBub3QKLy8KLy8gVGhlIEJJRCBBTU9VTlQgaXMgaGlkZGVuIHVudGlsIHRoZSBiaWRkZXIgb3BlbnMgaXQuIFRoZSBERVBPU0lUIGlzIG5vdDogaXQKLy8gaXMgYSBjb2luIHRyYW5zZmVyIGFuZCBpcyBwdWJsaWMsIGFuZCBzaW5jZSBhIHZhbGlkIGJpZCBjYW5ub3QgZXhjZWVkIGl0cwovLyBkZXBvc2l0LCB0aGUgZGVwb3NpdCBsZWFrcyBhbiBVUFBFUiBCT1VORCBvbiB0aGUgYmlkLiBBIGJpZGRlciB3aG8gd2FudHMKLy8gbW9yZSBwcml2YWN5IHRoYW4gdGhhdCBvdmVyLWRlcG9zaXRzIGFuZCB0YWtlcyB0aGUgY2hhbmdlIGJhY2sgYXQgQ2xvc2UuCi8vIFRoaXMgaXMgdGhlIHJlYWwgY2VpbGluZyBvZiB0aGUgc2NoZW1lIGFuZCBpcyBzdGF0ZWQgaGVyZSBiZWNhdXNlIG5vIGFtb3VudAovLyBvZiBoYXNoaW5nIG1vdmVzIGl0LgovLwovLyBUaGUgc2FsdCBpcyB3aGF0IGtlZXBzIHRoZSBjb21taXRtZW50IGZyb20gYmVpbmcgYnJ1dGUtZm9yY2VkIG92ZXIgdGhlCi8vIHBsYXVzaWJsZSByb3VuZCBudW1iZXJzLCBzbyBbTWluU2FsdExlbl0gYnl0ZXMgYXJlIHJlcXVpcmVkLiBUaGUgcmVhbG0gY2FuCi8vIGNoZWNrIGEgc2FsdCdzIExFTkdUSCBhbmQgY2FuIG5ldmVyIGNoZWNrIGl0cyBFTlRST1BZOiBhIDE2LWJ5dGUgc2FsdCBvZgovLyAiYWFhYWFhYWFhYWFhYWFhYSIgc2F0aXNmaWVzIHRoZSBndWFyZCBhbmQgcHJvdGVjdHMgbm90aGluZy4gVXNlIHJhbmRvbQovLyBieXRlcy4gQ29tcHV0ZSB0aGUgY29tbWl0bWVudCBsb2NhbGx5LCBvciB3aXRoIGEgUkVBRC1PTkxZIHF1ZXJ5IGFnYWluc3QKLy8gW0NvbW1pdEhhc2hdIOKAlCBuZXZlciBpbiBhIHRyYW5zYWN0aW9uLCB3aGljaCB3b3VsZCBwdWJsaXNoIHRoZSBzYWx0IGFuZAovLyBkZWZlYXQgdGhlIHdob2xlIG1lY2hhbmlzbS4KLy8KLy8gIyBXaGF0IHRoZSByZWFsbSBzZXR0bGVzLCBhbmQgd2hhdCBpdCBkb2VzIE5PVAovLwovLyBUaGUgcmVhbG0gc2V0dGxlcyBQQVlNRU5UIGFuZCByZWNvcmRzIHRoZSBXSU5ORVI7IGl0IGRvZXMgbm90IGN1c3RvZHkgb3IKLy8gZGVsaXZlciB0aGUgbG90LCB3aGljaCBpcyBmcmVlIHRleHQgYW5kIGNoYW5nZXMgaGFuZHMgb2ZmLWNoYWluIChvciBieSBhCi8vIGRvd25zdHJlYW0gcmVhbG0gcmVhZGluZyBbV2lubmVyXSkuIFRoZSBzYW1lIHNjb3BlIGRlY2lzaW9uIHIvYXVjdGlvbiBzdGF0ZXMsCi8vIGZvciB0aGUgc2FtZSByZWFzb246IGFuIG9uLWNoYWluLWFzc2V0IGF1Y3Rpb24gaXMgYSB2MiBhbmQgdGhpcyB2MSBvbWl0cyB0aGUKLy8gYXNzZXQtZXNjcm93IHN1cmZhY2UgZGVsaWJlcmF0ZWx5LgovLwovLyBSRUFMTS1DQUxMRVIgQ0FWRUFULCBpbmhlcml0ZWQgZnJvbSB0aGUgc2libGluZ3M6IGNvaW5pbydzIHJlY2VpcHQgZ3VhcmQKLy8gYWRtaXRzIG9ubHkgRU9BIHBheWVycywgc28gZXZlcnkgQklEREVSIGlzIGFuIEVPQS4gVGhlIFNFTExFUiBpcyB3aG9ldmVyCi8vIGNhbGxzIFtDcmVhdGVTYWxlXTsgYSByZWFsbSBtYXkgc2VsbCwgYnV0IGEgcmVhbG0gc2VsbGVyIG11c3QgZXhwb3NlIGl0cyBvd24KLy8gY3Jvc3NpbmcgcGF0aCB0byBbQ2xhaW1dIG9yIGl0cyBwcm9jZWVkcyBzdHJhbmQg4oCUIHRoZSBzZWxsZXIncyBjb25jZXJuLCBub3QgYQovLyB0aGlyZC1wYXJ0eSBoYXphcmQuIGFzc2VydE5vU2VuZCByZWFkcyB0aGUgT1JJR0lOIGVudmVsb3BlLCBzbyBldmVyeQovLyBub24tcGF5YWJsZSBmdW5jdGlvbiByZWZ1c2VzIGEgdHJhbnNhY3Rpb24gdGhhdCBhdHRhY2hlZCBjb2lucyBhbnl3aGVyZS4KLy8KLy8gIyBXaHkgY3J5cHRvL3NoYTI1NiBkaXJlY3RseQovLwovLyBUaGUgZGlzY292ZXJ5IGdhdGUgZm91bmQgZ2VudWluZSBwcmlvciBhcnQgZm9yIHRoZSBoYXNoaW5nIHNjaGVtZSDigJQKLy8gcC9tb3VsL2FnZW50cy9jb21taXQvdjAsIHdob3NlIEhhc2ggaXMgTEVOR1RILVBSRUZJWEVEIHNvIHRoYXQKLy8gSGFzaCgiYWIiLCJjIikgZGlmZmVycyBmcm9tIEhhc2goImEiLCJiYyIpIOKAlCBhbmQgZGVmZXJyZWQgdGhlIGltcG9ydC1vci0KLy8gcmVpbXBsZW1lbnQgY2hvaWNlIHRvIGFyY2hpdGVjdHVyZS4gSXQgaXMgcmVzb2x2ZWQgaGVyZSBpbiBmYXZvdXIgb2YgY2FsbGluZwovLyBjcnlwdG8vc2hhMjU2IGRpcmVjdGx5IGFuZCBGT0xMT1dJTkcgdGhhdCBwYWNrYWdlJ3Mgc2NoZW1lLCBiZWNhdXNlIHRoZQovLyBwYWNrYWdlIHJlc29sdmVzIHRvIGEgRElGRkVSRU5UIElNUE9SVCBQQVRIIG9uIGVhY2ggY2hhaW4gdGhpcyBwb3J0Zm9saW8KLy8gdGFyZ2V0cywgYW5kIHRoZSBuYW1lc3BhY2UgcmV3cml0ZXIgc3Vic3RpdHV0ZXMgb25seSBvdXIgb3duIGFkZHJlc3MuIEFuCi8vIGltcG9ydCBvZiBpdCB3b3VsZCBtYWtlIHRoZSBtYWlubmV0IHR3aW4gb2YgdGhpcyByZWFsbSBub24tc3Vic3RpdHV0YWJsZSwKLy8gd2hpY2ggaXMgYSBzdHJ1Y3R1cmFsIGNvc3QgdGhhdCAxLjQgS0Igb2Ygc2F2ZWQgY29kZSBkb2VzIG5vdCBidXkuCnBhY2thZ2Ugc2VhbGVkYmlkCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkiY3J5cHRvL3NoYTI1NiIKCSJlbmNvZGluZy9oZXgiCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2NvaW5pbyIKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvZmVlbGVkZ2VyIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCikKCi8vIERlbm9tIGlzIHRoZSBvbmx5IGFzc2V0IHRoaXMgcmVhbG0gYWNjZXB0cy4KY29uc3QgRGVub20gPSAidWdub3QiCgovLyBNYXhGZWVCcHMgaXMgdGhlIGhhcmQgcHJvdG9jb2wtZmVlIGNhcDogMTAwMCBicHMgPSAxMCUuIFRoZSBmZWUgYXBwbGllcyBvbmx5Ci8vIHRvIHRoZSBzZWxsZXIncyBQUk9DRUVEUyBhdCBjbG9zZSDigJQgbmV2ZXIgdG8gYSByZWZ1bmQsIG5ldmVyIHRvIHRoZSB3aW5uZXIncwovLyBjaGFuZ2UsIGFuZCBuZXZlciB0byBhIGZvcmZlaXRlZCBkZXBvc2l0IChzZWUgQ2xvc2UpLgpjb25zdCBNYXhGZWVCcHMgPSBpbnQ2NCgxMDAwKQoKLy8gU2FsZSBzdGF0dXMgdmFsdWVzLiBPbmx5IE9wZW4gaXMgbm9uLXRlcm1pbmFsOyB0aGUgcGhhc2UgaW5zaWRlIE9wZW4gaXMKLy8gZGVyaXZlZCBmcm9tIHRoZSBjaGFpbiBoZWlnaHQsIG5ldmVyIHN0b3JlZC4KY29uc3QgKAoJU2FsZU9wZW4gICAgICA9ICJvcGVuIiAgICAgIC8vIGluIGl0cyBjb21taXQsIHJldmVhbCwgb3IgYXdhaXRpbmctY2xvc2UgcGhhc2UKCVNhbGVTZXR0bGVkICAgPSAic2V0dGxlZCIgICAvLyBjbG9zZWQgV0lUSCBhIHdpbm5lcjsgcHJvY2VlZHMgY3JlZGl0ZWQKCVNhbGVVbnNvbGQgICAgPSAidW5zb2xkIiAgICAvLyBjbG9zZWQgd2l0aCBubyB2YWxpZCBvcGVuaW5nLCBvciBiZWxvdyByZXNlcnZlCglTYWxlQ2FuY2VsbGVkID0gImNhbmNlbGxlZCIgLy8gc2VsbGVyIGNhbmNlbGxlZCBiZWZvcmUgYW55IGNvbW1pdG1lbnQKKQoKLy8gUGhhc2UgdmFsdWVzIHJldHVybmVkIGJ5IFtQaGFzZV0gZm9yIGEgc2FsZSB0aGF0IGlzIHN0aWxsIE9wZW4uCmNvbnN0ICgKCVBoYXNlQ29tbWl0ICAgID0gImNvbW1pdCIgICAgLy8gYWNjZXB0aW5nIGNvbW1pdG1lbnRzCglQaGFzZVJldmVhbCAgICA9ICJyZXZlYWwiICAgIC8vIGFjY2VwdGluZyBvcGVuaW5ncwoJUGhhc2VDbG9zZWFibGUgPSAiY2xvc2VhYmxlIiAvLyByZXZlYWwgd2luZG93IHNodXQ7IENsb3NlIHdpbGwgc3VjY2VlZAopCgovLyBJbnB1dCBib3VuZHMuCmNvbnN0ICgKCS8vIE1pbkJpZCBpcyB0aGUgZHVzdCBmbG9vciBmb3IgYW55IHJldmVhbGVkIGJpZCwgYW55IGRlcG9zaXQgYW5kIGFueQoJLy8gbm9uLXplcm8gcmVzZXJ2ZTsgTWF4QmlkIGtlZXBzIGV2ZXJ5IGJpZCBhbmQgdGhlIGZlZSBzcGxpdCBmYXIgZnJvbQoJLy8gaW50NjQgb3ZlcmZsb3cuIFRoZSBiaWRkZXIgbXVzdCBFU0NST1cgYXQgbGVhc3QgdGhlaXIgYmlkLCBzbyB0aGUgcmVhbAoJLy8gY2VpbGluZyBpcyB0aGVpciBiYWxhbmNlLgoJTWluQmlkID0gaW50NjQoMV8wMDApCglNYXhCaWQgPSBpbnQ2NCgxXzAwMF8wMDBfMDAwXzAwMCkgLy8gMSwwMDAsMDAwIEdOT1QKCgkvLyBXaW5kb3cgYm91bmRzLCBpbiBibG9ja3MuIFRoZSByZXZlYWwgZmxvb3IgaXMgaGlnaGVyIHRoYW4gdGhlIGNvbW1pdAoJLy8gZmxvb3Igb24gcHVycG9zZTogZmFpbGluZyB0byBjb21taXQgY29zdHMgbm90aGluZywgd2hpbGUgZmFpbGluZyB0bwoJLy8gcmV2ZWFsIGNvc3RzIHRoZSB3aG9sZSBkZXBvc2l0LCBzbyB0aGUgd2luZG93IGluIHdoaWNoIHRoYXQgY2FuIGhhcHBlbgoJLy8gZ2V0cyB0aGUgd2lkZXIgZmxvb3IuIFNlZSB0aGUgc2hvcnQtcmV2ZWFsLXdpbmRvdyBoYXphcmQgYWJvdmUuCglNaW5Db21taXRCbG9ja3MgPSBpbnQ2NCgxMCkKCU1pblJldmVhbEJsb2NrcyA9IGludDY0KDIwKQoJTWF4V2luZG93QmxvY2tzID0gaW50NjQoN181MDBfMDAwKQoKCS8vIENvbW1pdG1lbnRMZW4gaXMgdGhlIGxlbmd0aCBvZiBhIGNvbW1pdG1lbnQgc3RyaW5nOiBzaGEyNTYgYXMgNjQKCS8vIGxvd2VyY2FzZSBoZXggY2hhcmFjdGVycywgZXhhY3RseSBhcyBbQ29tbWl0SGFzaF0gZW1pdHMgaXQuCglDb21taXRtZW50TGVuID0gMiAqIHNoYTI1Ni5TaXplCgoJLy8gTWluU2FsdExlbiBpcyB0aGUgcmVxdWlyZWQgc2FsdCBsZW5ndGguIEl0IGJvdW5kcyBicnV0ZSBmb3JjZSBvdmVyCgkvLyBwbGF1c2libGUgYmlkIGFtb3VudHM7IGl0IGNhbm5vdCBib3VuZCBhIGNhbGxlcidzIGNob2ljZSBvZiBlbnRyb3B5LgoJTWluU2FsdExlbiA9IDE2CglNYXhTYWx0TGVuID0gMTI4CgoJLy8gTWF4TG90TGVuIGJvdW5kcyB0aGUgc3RvcmVkIGxvdCBkZXNjcmlwdGlvbi4KCU1heExvdExlbiA9IDIwMAoKCS8vIE1heEJpZGRlcnNQZXJTYWxlIGJvdW5kcyB0aGUgY29tbWl0bWVudHMgb24gb25lIHNhbGUuIEl0IGlzIHRoZSByZWFzb24KCS8vIHRoZSBkdXBsaWNhdGUtY29tbWl0bWVudCBzY2FuIGFuZCB0aGUgQ2xvc2UgcGF5b3V0IGxvb3AgbWF5IGJlIGxpbmVhcjoKCS8vIGJvdGggYXJlIE8oTWF4QmlkZGVyc1BlclNhbGUpIGFuZCBuZWl0aGVyIGlzIGNhbGxlci1leHRlbnNpYmxlLgoJLy8KCS8vIEl0IGlzIEFMU08gYSBzY2FyY2UgcmVzb3VyY2UsIHdoaWNoIGlzIHdoeSBhIHNhbGUgY2FycmllcyBtaW5EZXBvc2l0LgoJLy8gQSBzbG90IGlzIG5ldmVyIHJlbGVhc2VkIOKAlCB0aGVyZSBpcyBubyB3aXRoZHJhdy1jb21taXRtZW50IHBhdGgg4oCUIHNvCgkvLyB3aXRob3V0IGEgc2VsbGVyLXNpemVkIGVudHJ5IHByaWNlLCAyNSBhZGRyZXNzZXMgY29tbWl0dGluZyBNaW5CaWQKCS8vIGVhY2ggZmlsbCBhIHNhbGUgZm9yIDI1LDAwMHVnbm90LCByZXZlYWwgTWluQmlkLCBhbmQgYXJlIHJlZnVuZGVkIGluCgkvLyBmdWxsIGZlZS1mcmVlOiBhbiBob25lc3QgYmlkZGVyIGlzIGxvY2tlZCBvdXQgZm9yIHRoZSBjb3N0IG9mIGdhcy4KCS8vIEF1ZGl0IFkxLCBhbmQgdGhlIHJlYXNvbiBtaW5EZXBvc2l0IGV4aXN0cy4gU2VlIFtDcmVhdGVTYWxlXS4KCU1heEJpZGRlcnNQZXJTYWxlID0gMjUKCgkvLyBNYXhTYWxlc1BlclNlbGxlciBib3VuZHMgb25lIHNlbGxlcidzIHN0b3JlZCBzYWxlczsgdGVybWluYWwgc2FsZXMgZG8KCS8vIE5PVCBmcmVlIHRoZSBzbG90LCBiZWNhdXNlIGEgc2V0dGxlZC91bnNvbGQvY2FuY2VsbGVkIHNhbGUgaXMgYQoJLy8gcGVybWFuZW50IHJlY29yZCBhIGJpZGRlciBhbmQgYW4gYXVkaXRvciBtYXkgbmVlZCB0byByZWFkLgoJTWF4U2FsZXNQZXJTZWxsZXIgPSA1MAoKCS8vIFJlbmRlckxpbWl0IGJvdW5kcyBldmVyeSByZW5kZXJlZCBsaXN0IOKAlCBhbiB1bmJvdW5kZWQgUmVuZGVyIHdhcyBZRUxMT1cKCS8vIGluIHRocmVlIHByaW9yIGF1ZGl0cy4KCVJlbmRlckxpbWl0ID0gMjAKKQoKLy8gYmlkIGlzIG9uZSBiaWRkZXIncyBzZWFsZWQgY29tbWl0bWVudCBhbmQsIG9uY2Ugb3BlbmVkLCBpdHMgY29udGVudHMuCnR5cGUgYmlkIHN0cnVjdCB7CgliaWRkZXIgICAgIGFkZHJlc3MKCWNvbW1pdG1lbnQgc3RyaW5nIC8vIDY0IGxvd2VyY2FzZSBoZXggY2hhcnMKCWRlcG9zaXQgICAgaW50NjQgIC8vIGVzY3Jvd2VkIGF0IENvbW1pdDsgdGhlIGNlaWxpbmcgb24gYSB2YWxpZCBhbW91bnQKCW9wZW5lZCAgICAgYm9vbCAgIC8vIHRydWUgb25jZSBSZXZlYWwgbWF0Y2hlZCB0aGUgY29tbWl0bWVudAoJYW1vdW50ICAgICBpbnQ2NCAgLy8gbWVhbmluZ2Z1bCBvbmx5IHdoZW4gb3BlbmVkCglyZXZlYWxTZXEgIGludDY0ICAvLyAxLWJhc2VkIG9yZGVyIG9mIG9wZW5pbmcgd2l0aGluIHRoZSBzYWxlOyAwIGlmIHVub3BlbmVkCn0KCnR5cGUgc2FsZSBzdHJ1Y3QgewoJaWQgICAgICAgICAgICBpbnQ2NAoJc2VsbGVyICAgICAgICBhZGRyZXNzCglsb3QgICAgICAgICAgIHN0cmluZyAvLyBmcmVlLXRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGxvdCAoZGVsaXZlcnkgaXMgb2ZmLWNoYWluKQoJcmVzZXJ2ZSAgICAgICBpbnQ2NCAgLy8gMCAobm9uZSkgb3IgYSBmbG9vciB0aGUgSElHSEVTVCByZXZlYWxlZCBiaWQgbXVzdCBtZWV0CgltaW5EZXBvc2l0ICAgIGludDY0ICAvLyBlbnRyeSBwcmljZSBwZXIgY29tbWl0bWVudDsgPj0gbWF4KE1pbkJpZCwgcmVzZXJ2ZSkKCWZlZUJwcyAgICAgICAgaW50NjQgIC8vIHNuYXBzaG90IGF0IGNyZWF0ZTsgYXBwbGllZCB0byB0aGUgc2VsbGVyJ3MgcHJvY2VlZHMKCWNvbW1pdEVuZCAgICAgaW50NjQgIC8vIGNvbW1pdG1lbnRzIGFjY2VwdGVkIHdoaWxlIGhlaWdodCA8IGNvbW1pdEVuZAoJcmV2ZWFsRW5kICAgICBpbnQ2NCAgLy8gb3BlbmluZ3MgYWNjZXB0ZWQgd2hpbGUgY29tbWl0RW5kIDw9IGhlaWdodCA8IHJldmVhbEVuZAoJc3RhdHVzICAgICAgICBzdHJpbmcKCWNyZWF0ZWRIZWlnaHQgaW50NjQKCWJpZHMgICAgICAgICAgW10qYmlkCglyZXZlYWxDb3VudCAgIGludDY0IC8vIG9wZW5pbmdzIHNvIGZhcjsgYWxzbyB0aGUgcmV2ZWFsU2VxIGFsbG9jYXRvcgoKCS8vIFNldHRsZW1lbnQgcmVzdWx0cywgd3JpdHRlbiBvbmNlIGF0IENsb3NlLgoJd2lubmVyICAgIGFkZHJlc3MKCXByaWNlICAgICBpbnQ2NAoJZm9yZmVpdGVkIGludDY0IC8vIGN1bXVsYXRpdmUgc3RhdGlzdGljLCBub3QgYSBoZWxkIGJ1Y2tldCDigJQgc2VlIHRoZSBwYWNrYWdlIGRvYwp9Cgp2YXIgKAoJYWRtaW4gICAgICAgIGFkZHJlc3MKCXBlbmRpbmdBZG1pbiBhZGRyZXNzCglmZWVSZWNpcGllbnQgYWRkcmVzcwoJZmVlQnBzICAgICAgIGludDY0IC8vIHNuYXBzaG90dGVkIGludG8gTkVXIHNhbGVzCgoJc2VsZiAgIGFkZHJlc3MKCW5leHRJRCBpbnQ2NAoKCS8vIFRoZSB0d28gaGVsZCBidWNrZXRzLiBEaXNqb2ludCBieSBjb25zdHJ1Y3Rpb246IFJldmVhbCBtb3ZlcyBhIGRlcG9zaXQKCS8vIGZyb20gdGhlIGZpcnN0IHRvIHRoZSBzZWNvbmQsIGFuZCBDbG9zZSBkcmFpbnMgYm90aCBpbnRvIHRoZSBsZWRnZXIuCglzZWFsZWQgICBpbnQ2NCAvLyDOoyBkZXBvc2l0cyBiZWhpbmQgVU5PUEVORUQgY29tbWl0bWVudHMgaW4gbm9uLXRlcm1pbmFsIHNhbGVzCglyZXZlYWxlZCBpbnQ2NCAvLyDOoyBkZXBvc2l0cyBiZWhpbmQgT1BFTkVEIGNvbW1pdG1lbnRzIGF3YWl0aW5nIGNsb3NlCgoJZm9yZmVpdGVkVG90YWwgaW50NjQgLy8gY3VtdWxhdGl2ZSBzdGF0aXN0aWMgYWNyb3NzIGFsbCBzYWxlcwoKCXNhbGVzICAgICA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQoaWQpICAgICAgIC0+ICpzYWxlCglzZWxsZXJOdW0gPSBhdmwuTmV3VHJlZSgpIC8vIHNlbGxlci5TdHJpbmcoKSAtPiAqaW50NjQsIHN0b3JlZCBzYWxlcwoJbGVkZ2VyICAgID0gZmVlbGVkZ2VyLk11c3ROZXcoTWF4RmVlQnBzKQopCgpmdW5jIGluaXQoKSB7CglhZG1pbiA9IHVuc2FmZS5PcmlnaW5DYWxsZXIoKQoJZmVlUmVjaXBpZW50ID0gYWRtaW4KCXNlbGYgPSB1bnNhZmUuQ3VycmVudFJlYWxtKCkuQWRkcmVzcygpCn0KCi8vIC0tLSB0aGUgY29tbWl0bWVudCBzY2hlbWUgLS0tCgovLyBDb21taXRIYXNoIHJldHVybnMgdGhlIGNvbW1pdG1lbnQgZm9yIGEgYmlkIG9mIGBhbW91bnRgIHVuZGVyIGBzYWx0YDogdGhlCi8vIHNoYTI1NiBvZiBhIExFTkdUSC1QUkVGSVhFRCBlbmNvZGluZyBvZiB0aGUgdHdvIHBhcnRzLCBhcyA2NCBsb3dlcmNhc2UgaGV4Ci8vIGNoYXJhY3RlcnMuIFRoZSBsZW5ndGggcHJlZml4ZXMgYXJlIHdoYXQgbWFrZSB0aGUgZW5jb2RpbmcgdW5hbWJpZ3VvdXMg4oCUCi8vIHdpdGhvdXQgdGhlbSBhIGNvbW1pdG1lbnQgdG8gKDEyLCAiMzRzYWx0Li4uIikgYW5kIG9uZSB0byAoMSwgIjIzNHNhbHQuLi4iKQovLyBjb3VsZCBjb2xsaWRlLCBhbmQgYSBiaWRkZXIgY291bGQgb3BlbiBhIGNvbW1pdG1lbnQgYXMgYSBiaWQgdGhleSBuZXZlcgovLyBtYWRlLiBUaGUgc2NoZW1lIGZvbGxvd3MgcC9tb3VsL2FnZW50cy9jb21taXQvdjA7IHNlZSB0aGUgcGFja2FnZSBkb2MgZm9yCi8vIHdoeSBpdCBpcyByZWltcGxlbWVudGVkIHJhdGhlciB0aGFuIGltcG9ydGVkLgovLwovLyBUaGlzIGlzIGEgVklFVy4gQ29tcHV0ZSB5b3VyIGNvbW1pdG1lbnQgbG9jYWxseSBvciB3aXRoIGEgcmVhZC1vbmx5IHF1ZXJ5IOKAlAovLyBjYWxsaW5nIGl0IGluc2lkZSBhIHRyYW5zYWN0aW9uIHB1Ymxpc2hlcyB0aGUgc2FsdCBhbmQgZGVzdHJveXMgdGhlIHNlYWwuCmZ1bmMgQ29tbWl0SGFzaChhbW91bnQgaW50NjQsIHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJYSA6PSBpdG9hKGFtb3VudCkKCXByZSA6PSBpdG9hKGludDY0KGxlbihhKSkpICsgIjoiICsgYSArIGl0b2EoaW50NjQobGVuKHNhbHQpKSkgKyAiOiIgKyBzYWx0CglzdW0gOj0gc2hhMjU2LlN1bTI1NihbXWJ5dGUocHJlKSkKCXJldHVybiBoZXguRW5jb2RlVG9TdHJpbmcoc3VtWzpdKQp9CgovLyAtLS0gc2VsbGVyIHNpZGUgLS0tCgovLyBDcmVhdGVTYWxlIGxpc3RzIGEgbG90IGZvciBzZWFsZWQtYmlkIHNlY29uZC1wcmljZSBzYWxlLiBUaGUgY2FsbGVyIGJlY29tZXMKLy8gdGhlIHNlbGxlci4gYHJlc2VydmVgIGlzIDAgKG5vIHJlc2VydmUpIG9yIGEgZmxvb3IgaW4gW01pbkJpZCwgTWF4QmlkXSB0aGF0Ci8vIHRoZSBISUdIRVNUIHJldmVhbGVkIGJpZCBtdXN0IG1lZXQgZm9yIHRoZSBzYWxlIHRvIHNldHRsZS4gQ29tbWl0bWVudHMgYXJlCi8vIGFjY2VwdGVkIGZvciBgY29tbWl0QmxvY2tzYCBibG9ja3MsIHRoZW4gb3BlbmluZ3MgZm9yIGByZXZlYWxCbG9ja3NgIGJsb2NrcywKLy8gYWZ0ZXIgd2hpY2ggYW55b25lIG1heSBbQ2xvc2VdLiBUaGUgY3VycmVudCBwcm90b2NvbCBmZWUgaXMgc25hcHNob3R0ZWQgaW4uCi8vIFJldHVybnMgdGhlIGlkLgovLwovLyBgbWluRGVwb3NpdGAgaXMgdGhlIEVOVFJZIFBSSUNFIHBlciBjb21taXRtZW50LCBhbmQgaXQgaXMgdGhlIHNlbGxlcidzIG9uZQovLyBkZWZlbmNlIGFnYWluc3Qgc2xvdCBzcXVhdHRpbmc6IGEgc2FsZSBoYXMgYXQgbW9zdCBNYXhCaWRkZXJzUGVyU2FsZSBzbG90cywKLy8gYSBzbG90IGlzIG5ldmVyIHJlbGVhc2VkLCBhbmQgYSBzcXVhdHRlciB3aG8gcmV2ZWFscyBhIGR1c3QgYmlkIGlzIHJlZnVuZGVkCi8vIGluIGZ1bGwgZmVlLWZyZWUg4oCUIHNvIHdpdGggbm8gZW50cnkgcHJpY2UgYSByaXZhbCBsb2NrcyBhbiBob25lc3QgYmlkZGVyIG91dAovLyBvZiBhbnkgc2FsZSBmb3IgdGhlIGNvc3Qgb2YgZ2FzLiBTaXplIGl0IHRvIHRoZSBsb3QsIG5vdCB0byB0aGUgZHVzdCBmbG9vci4KLy8gMCBtZWFucyAibm8gcHJlZmVyZW5jZSIsIHJlc29sdmVkIHRvIHRoZSBtYXgoTWluQmlkLCByZXNlcnZlKSBmbG9vciwgd2hpY2gKLy8gaXMgdGhlIHdlYWtlc3Qgc2V0dGluZyBhbmQgbGVhdmVzIHRoZSBzcXVhdHRpbmcgY29zdCBhdCBNYXhCaWRkZXJzUGVyU2FsZQovLyB0aW1lcyB0aGF0IGZsb29yLiBUaGUgZmxvb3IgaW5jbHVkZXMgdGhlIHJlc2VydmUgYmVjYXVzZSBhIGJpZCB1bmRlciB0aGUKLy8gcmVzZXJ2ZSBjYW5ub3Qgd2luLCBzbyBlc2Nyb3dpbmcgbGVzcyB0aGFuIHRoZSByZXNlcnZlIGJ1eXMgb25seSBhIHNsb3QuCmZ1bmMgQ3JlYXRlU2FsZShjdXIgcmVhbG0sIGxvdCBzdHJpbmcsIHJlc2VydmUsIG1pbkRlcG9zaXQsIGNvbW1pdEJsb2NrcywgcmV2ZWFsQmxvY2tzIGludDY0KSBpbnQ2NCB7Cglhc3NlcnROb1NlbmQoKQoJc2VsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgbGVuKGxvdCkgPT0gMCB8fCBsZW4obG90KSA+IE1heExvdExlbiB7CgkJcGFuaWMoImxvdCBkZXNjcmlwdGlvbiBtdXN0IGJlIDEuLiIgKyBpdG9hKE1heExvdExlbikgKyAiIGJ5dGVzIikKCX0KCWlmIHJlc2VydmUgIT0gMCAmJiAocmVzZXJ2ZSA8IE1pbkJpZCB8fCByZXNlcnZlID4gTWF4QmlkKSB7CgkJcGFuaWMoInJlc2VydmUgbXVzdCBiZSAwIG9yICIgKyBpdG9hKE1pbkJpZCkgKyAiLi4iICsgaXRvYShNYXhCaWQpICsgRGVub20pCgl9CglmbG9vciA6PSBNaW5CaWQKCWlmIHJlc2VydmUgPiBmbG9vciB7CgkJZmxvb3IgPSByZXNlcnZlCgl9CglpZiBtaW5EZXBvc2l0ID09IDAgewoJCW1pbkRlcG9zaXQgPSBmbG9vcgoJfQoJaWYgbWluRGVwb3NpdCA8IGZsb29yIHx8IG1pbkRlcG9zaXQgPiBNYXhCaWQgewoJCXBhbmljKCJtaW5EZXBvc2l0IG11c3QgYmUgMCBvciAiICsgaXRvYShmbG9vcikgKyAiLi4iICsgaXRvYShNYXhCaWQpICsgRGVub20gKwoJCQkiIChhdCBsZWFzdCBtYXgoTWluQmlkLCByZXNlcnZlKSkiKQoJfQoJaWYgY29tbWl0QmxvY2tzIDwgTWluQ29tbWl0QmxvY2tzIHx8IGNvbW1pdEJsb2NrcyA+IE1heFdpbmRvd0Jsb2NrcyB7CgkJcGFuaWMoImNvbW1pdEJsb2NrcyBtdXN0IGJlICIgKyBpdG9hKE1pbkNvbW1pdEJsb2NrcykgKyAiLi4iICsgaXRvYShNYXhXaW5kb3dCbG9ja3MpKQoJfQoJaWYgcmV2ZWFsQmxvY2tzIDwgTWluUmV2ZWFsQmxvY2tzIHx8IHJldmVhbEJsb2NrcyA+IE1heFdpbmRvd0Jsb2NrcyB7CgkJcGFuaWMoInJldmVhbEJsb2NrcyBtdXN0IGJlICIgKyBpdG9hKE1pblJldmVhbEJsb2NrcykgKyAiLi4iICsgaXRvYShNYXhXaW5kb3dCbG9ja3MpKQoJfQoKCW4gOj0gY291bnRlcihzZWxsZXJOdW0sIHNlbGxlcikKCWlmICpuID49IE1heFNhbGVzUGVyU2VsbGVyIHsKCQlwYW5pYygicGVyLXNlbGxlciBzYWxlIGxpbWl0IHJlYWNoZWQiKQoJfQoKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWNFbmQsIG9rIDo9IGFkZENoZWNrZWQobm93LCBjb21taXRCbG9ja3MpCglpZiAhb2sgewoJCXBhbmljKCJjb21taXQtZW5kIGhlaWdodCBvdmVyZmxvdyIpCgl9CglyRW5kLCBvayA6PSBhZGRDaGVja2VkKGNFbmQsIHJldmVhbEJsb2NrcykKCWlmICFvayB7CgkJcGFuaWMoInJldmVhbC1lbmQgaGVpZ2h0IG92ZXJmbG93IikKCX0KCglpZCA6PSBuZXh0SUQKCW5leHRJRCsrCglzYWxlcy5TZXQocGFkSUQoaWQpLCAmc2FsZXsKCQlpZDogICAgICAgICAgICBpZCwKCQlzZWxsZXI6ICAgICAgICBzZWxsZXIsCgkJbG90OiAgICAgICAgICAgbG90LAoJCXJlc2VydmU6ICAgICAgIHJlc2VydmUsCgkJbWluRGVwb3NpdDogICAgbWluRGVwb3NpdCwKCQlmZWVCcHM6ICAgICAgICBmZWVCcHMsCgkJY29tbWl0RW5kOiAgICAgY0VuZCwKCQlyZXZlYWxFbmQ6ICAgICByRW5kLAoJCXN0YXR1czogICAgICAgIFNhbGVPcGVuLAoJCWNyZWF0ZWRIZWlnaHQ6IG5vdywKCQl3aW5uZXI6ICAgICAgICAiIiwKCX0pCgkqbisrCgoJY2hhaW4uRW1pdCgiU2FsZUNyZWF0ZWQiLAoJCSJzYWxlSWQiLCBpdG9hKGlkKSwKCQkic2VsbGVyIiwgc2VsbGVyLlN0cmluZygpLAoJCSJyZXNlcnZlIiwgaXRvYShyZXNlcnZlKSwKCQkibWluRGVwb3NpdCIsIGl0b2EobWluRGVwb3NpdCksCgkJImNvbW1pdEVuZCIsIGl0b2EoY0VuZCksCgkJInJldmVhbEVuZCIsIGl0b2EockVuZCksCgkJImZlZUJwcyIsIGl0b2EoZmVlQnBzKSwKCSkKCXJldHVybiBpZAp9CgovLyBDYW5jZWwgd2l0aGRyYXdzIGEgc2FsZSB0aGF0IGhhcyB0YWtlbiBubyBjb21taXRtZW50LiBTZWxsZXIgb25seS4gT25jZSBhbnkKLy8gY29tbWl0bWVudCBzdGFuZHMgdGhlIHNhbGUgY2FuIG9ubHkgcnVuIHRvIENsb3NlIOKAlCBhIHNlbGxlciBjYW5ub3QgcHVsbCB0aGUKLy8gbG90IG91dCBmcm9tIHVuZGVyIGFuIGVzY3Jvd2VkIGJpZGRlciwgYW5kIGNhbm5vdCBzdHJhbmQgYSBkZXBvc2l0LgpmdW5jIENhbmNlbChjdXIgcmVhbG0sIHNhbGVJRCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCXMgOj0gbXVzdFNhbGUoc2FsZUlEKQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IHMuc2VsbGVyIHsKCQlwYW5pYygib25seSB0aGUgc2VsbGVyIG1heSBjYW5jZWwiKQoJfQoJaWYgcy5zdGF0dXMgIT0gU2FsZU9wZW4gewoJCXBhbmljKCJzYWxlIGlzICIgKyBzLnN0YXR1cykKCX0KCWlmIGxlbihzLmJpZHMpICE9IDAgewoJCXBhbmljKCJjYW5ub3QgY2FuY2VsIGFmdGVyIGEgY29tbWl0bWVudCIpCgl9CglzLnN0YXR1cyA9IFNhbGVDYW5jZWxsZWQKCWNoYWluLkVtaXQoIlNhbGVDYW5jZWxsZWQiLCAic2FsZUlkIiwgaXRvYShzYWxlSUQpLCAic2VsbGVyIiwgcy5zZWxsZXIuU3RyaW5nKCkpCn0KCi8vIC0tLSBiaWRkZXIgc2lkZSAtLS0KCi8vIENvbW1pdCBlc2Nyb3dzIGEgZGVwb3NpdCBiZWhpbmQgYSBzZWFsZWQgYmlkLiBUaGUgY2FsbGVyIGF0dGFjaGVzIHRoZQovLyBkZXBvc2l0IGFuZCBzdXBwbGllcyBvbmx5IGBjb21taXRtZW50YCDigJQgW0NvbW1pdEhhc2hdKGFtb3VudCwgc2FsdCkgYXMgNjQKLy8gbG93ZXJjYXNlIGhleCBjaGFyYWN0ZXJzIOKAlCBzbyB0aGUgcmVhbG0gbGVhcm5zIHRoZSBiaWQncyBDRUlMSU5HICh0aGUKLy8gZGVwb3NpdCkgYW5kIG5vdCB0aGUgYmlkLiBUaGUgZGVwb3NpdCBpcyB0aGUgY2VpbGluZyBvbiB3aGF0IGNhbiBsYXRlciBiZQovLyBvcGVuZWQsIHNvIGVzY3JvdyBhdCBsZWFzdCB3aGF0IHlvdSBpbnRlbmQgdG8gYmlkOyBlc2Nyb3cgbW9yZSB0byBoaWRlIGl0Ci8vIGJldHRlci4gT25lIGNvbW1pdG1lbnQgcGVyIGJpZGRlciBwZXIgc2FsZSwgYW5kIGEgY29tbWl0bWVudCBhbHJlYWR5IHByZXNlbnQKLy8gb24gdGhpcyBzYWxlIGlzIHJlZnVzZWQgKGNvcHlpbmcgYW5vdGhlciBiaWRkZXIncyBoYXNoIHdpdGhvdXQga25vd2luZyBpdHMKLy8gY29udGVudHMgd291bGQgb3RoZXJ3aXNlIGJlIGZyZWUgYW5kIGNvdWxkIG5ldmVyIGJlIG9wZW5lZCkuCmZ1bmMgQ29tbWl0KGN1ciByZWFsbSwgc2FsZUlEIGludDY0LCBjb21taXRtZW50IHN0cmluZykgewoJYmlkZGVyLCBkZXBvc2l0IDo9IGNvaW5pby5SZWNlaXZlKDAsIGN1ciwgRGVub20pCglzIDo9IG11c3RTYWxlKHNhbGVJRCkKCWlmIHMuc3RhdHVzICE9IFNhbGVPcGVuIHsKCQlwYW5pYygic2FsZSBpcyAiICsgcy5zdGF0dXMpCgl9CglpZiBydW50aW1lLkNoYWluSGVpZ2h0KCkgPj0gcy5jb21taXRFbmQgewoJCXBhbmljKCJjb21taXQgd2luZG93IGhhcyBjbG9zZWQgYXQgaGVpZ2h0ICIgKyBpdG9hKHMuY29tbWl0RW5kKSkKCX0KCWlmIGJpZGRlciA9PSBzLnNlbGxlciB7CgkJcGFuaWMoInNlbGxlciBjYW5ub3QgYmlkIG9uIHRoZWlyIG93biBzYWxlIikKCX0KCWlmIGRlcG9zaXQgPCBzLm1pbkRlcG9zaXQgfHwgZGVwb3NpdCA+IE1heEJpZCB7CgkJcGFuaWMoImRlcG9zaXQgbXVzdCBiZSAiICsgaXRvYShzLm1pbkRlcG9zaXQpICsgIi4uIiArIGl0b2EoTWF4QmlkKSArIERlbm9tICsKCQkJIiBvbiB0aGlzIHNhbGUiKQoJfQoJYXNzZXJ0Q29tbWl0bWVudChjb21taXRtZW50KQoJaWYgbGVuKHMuYmlkcykgPj0gTWF4QmlkZGVyc1BlclNhbGUgewoJCXBhbmljKCJwZXItc2FsZSBiaWRkZXIgbGltaXQgcmVhY2hlZCIpCgl9Cglmb3IgXywgYiA6PSByYW5nZSBzLmJpZHMgewoJCWlmIGIuYmlkZGVyID09IGJpZGRlciB7CgkJCXBhbmljKCJhbHJlYWR5IGNvbW1pdHRlZCB0byB0aGlzIHNhbGUiKQoJCX0KCQlpZiBiLmNvbW1pdG1lbnQgPT0gY29tbWl0bWVudCB7CgkJCXBhbmljKCJ0aGF0IGNvbW1pdG1lbnQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoaXMgc2FsZSIpCgkJfQoJfQoKCXMuYmlkcyA9IGFwcGVuZChzLmJpZHMsICZiaWR7CgkJYmlkZGVyOiAgICAgYmlkZGVyLAoJCWNvbW1pdG1lbnQ6IGNvbW1pdG1lbnQsCgkJZGVwb3NpdDogICAgZGVwb3NpdCwKCX0pCglzZWFsZWQgKz0gZGVwb3NpdAoKCWNoYWluLkVtaXQoIkNvbW1pdHRlZCIsCgkJInNhbGVJZCIsIGl0b2Eoc2FsZUlEKSwKCQkiYmlkZGVyIiwgYmlkZGVyLlN0cmluZygpLAoJCSJkZXBvc2l0IiwgaXRvYShkZXBvc2l0KSwKCQkiY29tbWl0bWVudCIsIGNvbW1pdG1lbnQsCgkpCn0KCi8vIFJldmVhbCBvcGVucyB0aGUgY2FsbGVyJ3Mgc2VhbGVkIGJpZCBvbiBhIHNhbGUgd2hvc2UgY29tbWl0IHdpbmRvdyBoYXMgc2h1dC4KLy8gYGFtb3VudGAgYW5kIGBzYWx0YCBtdXN0IGhhc2ggdG8gdGhlIHN0b3JlZCBjb21taXRtZW50LCBgYW1vdW50YCBtdXN0IGJlIGluCi8vIFtNaW5CaWQsIE1heEJpZF0sIGFuZCBgYW1vdW50YCBtdXN0IG5vdCBleGNlZWQgdGhlIGRlcG9zaXQg4oCUIGEgYmlkZGVyIHdobwovLyBjb21taXR0ZWQgYWJvdmUgdGhlaXIgZXNjcm93IGhhcyBubyB2YWxpZCBvcGVuaW5nIGFuZCBmb3JmZWl0cyBhdCBDbG9zZS4KLy8gT3BlbmluZyBkb2VzIG5vdCBtb3ZlIGNvaW5zOyBpdCBtb3ZlcyB0aGUgZGVwb3NpdCBmcm9tIHRoZSBgc2VhbGVkYCBidWNrZXQKLy8gdG8gdGhlIGByZXZlYWxlZGAgb25lIGFuZCByZWNvcmRzIHRoZSBiaWQgZm9yIHRoZSBjbGVhcmluZyBzY2FuLgpmdW5jIFJldmVhbChjdXIgcmVhbG0sIHNhbGVJRCBpbnQ2NCwgYW1vdW50IGludDY0LCBzYWx0IHN0cmluZykgewoJYXNzZXJ0Tm9TZW5kKCkKCWJpZGRlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCXMgOj0gbXVzdFNhbGUoc2FsZUlEKQoJaWYgcy5zdGF0dXMgIT0gU2FsZU9wZW4gewoJCXBhbmljKCJzYWxlIGlzICIgKyBzLnN0YXR1cykKCX0KCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlmIG5vdyA8IHMuY29tbWl0RW5kIHsKCQlwYW5pYygicmV2ZWFsIHdpbmRvdyBvcGVucyBhdCBoZWlnaHQgIiArIGl0b2Eocy5jb21taXRFbmQpKQoJfQoJaWYgbm93ID49IHMucmV2ZWFsRW5kIHsKCQlwYW5pYygicmV2ZWFsIHdpbmRvdyBjbG9zZWQgYXQgaGVpZ2h0ICIgKyBpdG9hKHMucmV2ZWFsRW5kKSkKCX0KCWIgOj0gZmluZEJpZChzLCBiaWRkZXIpCglpZiBiID09IG5pbCB7CgkJcGFuaWMoIm5vIGNvbW1pdG1lbnQgZnJvbSBjYWxsZXIgb24gdGhpcyBzYWxlIikKCX0KCWlmIGIub3BlbmVkIHsKCQlwYW5pYygiYWxyZWFkeSByZXZlYWxlZCIpCgl9CglpZiBsZW4oc2FsdCkgPCBNaW5TYWx0TGVuIHx8IGxlbihzYWx0KSA+IE1heFNhbHRMZW4gewoJCXBhbmljKCJzYWx0IG11c3QgYmUgIiArIGl0b2EoTWluU2FsdExlbikgKyAiLi4iICsgaXRvYShNYXhTYWx0TGVuKSArICIgYnl0ZXMiKQoJfQoJaWYgYW1vdW50IDwgTWluQmlkIHx8IGFtb3VudCA+IE1heEJpZCB7CgkJcGFuaWMoImFtb3VudCBtdXN0IGJlICIgKyBpdG9hKE1pbkJpZCkgKyAiLi4iICsgaXRvYShNYXhCaWQpICsgRGVub20pCgl9CglpZiBhbW91bnQgPiBiLmRlcG9zaXQgewoJCXBhbmljKCJhbW91bnQgIiArIGl0b2EoYW1vdW50KSArICIgZXhjZWVkcyB0aGUgZXNjcm93ZWQgZGVwb3NpdCAiICsgaXRvYShiLmRlcG9zaXQpICsgRGVub20pCgl9CglpZiBDb21taXRIYXNoKGFtb3VudCwgc2FsdCkgIT0gYi5jb21taXRtZW50IHsKCQlwYW5pYygiYW1vdW50IGFuZCBzYWx0IGRvIG5vdCBtYXRjaCB0aGUgY29tbWl0bWVudCIpCgl9CgoJYi5vcGVuZWQgPSB0cnVlCgliLmFtb3VudCA9IGFtb3VudAoJcy5yZXZlYWxDb3VudCsrCgliLnJldmVhbFNlcSA9IHMucmV2ZWFsQ291bnQKCglzZWFsZWQgLT0gYi5kZXBvc2l0CglyZXZlYWxlZCArPSBiLmRlcG9zaXQKCgljaGFpbi5FbWl0KCJSZXZlYWxlZCIsCgkJInNhbGVJZCIsIGl0b2Eoc2FsZUlEKSwKCQkiYmlkZGVyIiwgYmlkZGVyLlN0cmluZygpLAoJCSJhbW91bnQiLCBpdG9hKGFtb3VudCksCgkJInJldmVhbFNlcSIsIGl0b2EoYi5yZXZlYWxTZXEpLAoJKQp9CgovLyAtLS0gY2xvc2UgKHBlcm1pc3Npb25sZXNzLCBsaWtlIGV2ZXJ5IHNpYmxpbmcgcmVhbG0ncyB2YWx2ZSkgLS0tCgovLyBDbG9zZSBzZXR0bGVzIGEgc2FsZSB3aG9zZSByZXZlYWwgd2luZG93IGhhcyBzaHV0LiBBbnlvbmUgbWF5IGNhbGwgaXQ7IG5vCi8vIHNhbGUncyB0ZXJtaW5hbCBzdGF0ZSBtYXkgZGVwZW5kIG9uIGEgcGFydHkgYWN0aW5nLgovLwovLyBUaGUgY2xlYXJpbmcgcnVsZTogYW1vbmcgdGhlIE9QRU5FRCBiaWRzIHRoZSBoaWdoZXN0IHdpbnMgYW5kIHBheXMKLy8gbWF4KHNlY29uZC1oaWdoZXN0LCByZXNlcnZlLCBNaW5CaWQpIOKAlCBhIHN0cmljdCBWaWNrcmV5IHByaWNlLCBmbG9vcmVkIHNvCi8vIHRoYXQgYSBsb25lIGJpZGRlciBkb2VzIG5vdCB3aW4gZm9yIG5vdGhpbmcgYW5kIHNvIHRoYXQgYSByZXNlcnZlIGlzCi8vIGhvbm91cmVkIGFzIGEgcHJpY2UgYW5kIG5vdCBtZXJlbHkgYXMgYSB2ZXRvLiBUaWVzIG9uIHRoZSBoaWdoZXN0IGFtb3VudCBnbwovLyB0byB0aGUgRUFSTElFU1Qgb3BlbmluZywgd2hpY2ggbWFrZXMgdGhlIHRpZS1icmVhayBkZXRlcm1pbmlzdGljIGFuZAovLyBpbmRlcGVuZGVudCBvZiBzdG9yYWdlIG9yZGVyLCBhbmQgYSB0aWUgc2V0cyB0aGUgc2Vjb25kIHByaWNlIGVxdWFsIHRvIHRoZQovLyBmaXJzdCwgc28gYSB0aWVkIHdpbm5lciBwYXlzIHRoZWlyIGZ1bGwgYmlkLgovLwovLyBUaGUgbW9uZXksIGFsbCBvZiBpdCBjcmVkaXRlZCBhbmQgbm9uZSBvZiBpdCBzZW50OgovLwovLyAgIC0gd2lubmVyOiBjaGFuZ2Ugb2YgYGRlcG9zaXQgLSBwcmljZWAsIGZlZS1mcmVlIChpdCBpcyB0aGVpciBvd24gY29pbgovLyAgICAgY29taW5nIGJhY2ssIG5vdCBhIHNhbGUpCi8vICAgLSBzZWxsZXI6IGBwcmljZWAsIGF0IHRoZSBzYWxlJ3Mgc25hcHNob3R0ZWQgZmVlCi8vICAgLSBldmVyeSBvdGhlciBvcGVuZWQgYmlkOiBpdHMgZGVwb3NpdCBiYWNrIGluIGZ1bGwsIGZlZS1mcmVlCi8vICAgLSBldmVyeSBVTk9QRU5FRCBjb21taXRtZW50OiBkZXBvc2l0IGNyZWRpdGVkIHRvIHRoZSBTRUxMRVIsIGZlZS1mcmVlLgovLyAgICAgRmVlLWZyZWUgaXMgZGVsaWJlcmF0ZTogYSBmZWUgaXMgYSBjdXQgb2YgYSBTQUxFLCBhbmQgdGFraW5nIGEgY3V0IG9mCi8vICAgICBsaXF1aWRhdGVkIGRhbWFnZXMgd291bGQgZ2l2ZSB0aGUgZmVlIHJlY2lwaWVudCBhIHJldmVudWUgaW50ZXJlc3QgaW4KLy8gICAgIGJpZGRlcnMgZmFpbGluZyB0byByZXZlYWwuCi8vCi8vIElmIG5vIGJpZCB3YXMgb3BlbmVkLCBvciB0aGUgaGlnaGVzdCBvcGVuZWQgYmlkIGlzIGJlbG93IHRoZSByZXNlcnZlLCB0aGUKLy8gc2FsZSBpcyBVbnNvbGQ6IGV2ZXJ5IG9wZW5lZCBiaWQgaXMgcmVmdW5kZWQgaW4gZnVsbCBhbmQgb25seSB0aGUgdW5vcGVuZWQKLy8gY29tbWl0bWVudHMgZm9yZmVpdC4KZnVuYyBDbG9zZShjdXIgcmVhbG0sIHNhbGVJRCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCXMgOj0gbXVzdFNhbGUoc2FsZUlEKQoJaWYgcy5zdGF0dXMgIT0gU2FsZU9wZW4gewoJCXBhbmljKCJzYWxlIGlzICIgKyBzLnN0YXR1cykKCX0KCWlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA8IHMucmV2ZWFsRW5kIHsKCQlwYW5pYygicmV2ZWFsIHdpbmRvdyBoYXMgbm90IGNsb3NlZDsgY2xvc2VzIGF0IGhlaWdodCAiICsgaXRvYShzLnJldmVhbEVuZCkpCgl9CgoJaDEsIGgyLCB3aW5uZXIsIHdpbm5lclNlcSA6PSBjbGVhcmluZyhzKQoKCS8vIEEgc2FsZSBzZXR0bGVzIG9ubHkgaWYgc29tZXRoaW5nIHdhcyBvcGVuZWQgQU5EIGl0IG1ldCB0aGUgcmVzZXJ2ZS4KCXNldHRsZXMgOj0gd2lubmVyICE9ICIiICYmIGgxID49IHMucmVzZXJ2ZQoJcHJpY2UgOj0gaW50NjQoMCkKCWlmIHNldHRsZXMgewoJCXByaWNlID0gdmlja3JleVByaWNlKGgyLCBzLnJlc2VydmUpCgl9CgoJZm9yZmVpdGVkIDo9IGludDY0KDApCglwcm9jZWVkcyA6PSBpbnQ2NCgwKQoKCWZvciBfLCBiIDo9IHJhbmdlIHMuYmlkcyB7CgkJaWYgIWIub3BlbmVkIHsKCQkJLy8gVm9pZCBjb21taXRtZW50OiB0aGUgZGVwb3NpdCBpcyBsaXF1aWRhdGVkIHRvIHRoZSBzZWxsZXIuCgkJCXNlYWxlZCAtPSBiLmRlcG9zaXQKCQkJZm9yZmVpdGVkICs9IGIuZGVwb3NpdAoJCQlwcm9jZWVkcyArPSBiLmRlcG9zaXQKCQkJY29udGludWUKCQl9CgkJcmV2ZWFsZWQgLT0gYi5kZXBvc2l0CgkJaWYgc2V0dGxlcyAmJiBiLmJpZGRlciA9PSB3aW5uZXIgewoJCQkvLyBUaGUgd2lubmVyIHBheXMgYHByaWNlYCBvdXQgb2YgdGhlaXIgZGVwb3NpdDsgdGhlIHJlc3QgaXMgY2hhbmdlLgoJCQkvLyBwcmljZSA8PSBiLmFtb3VudCA8PSBiLmRlcG9zaXQsIHByb3ZlbiBpbiB0aGUgcGFja2FnZSB0ZXN0cywgc28KCQkJLy8gY2hhbmdlIGlzIG5ldmVyIG5lZ2F0aXZlLgoJCQljaGFuZ2UgOj0gYi5kZXBvc2l0IC0gcHJpY2UKCQkJaWYgY2hhbmdlID4gMCB7CgkJCQlsZWRnZXIuTXVzdERlcG9zaXQoYi5iaWRkZXIuU3RyaW5nKCksIGNoYW5nZSwgMCkKCQkJfQoJCQljb250aW51ZQoJCX0KCQlsZWRnZXIuTXVzdERlcG9zaXQoYi5iaWRkZXIuU3RyaW5nKCksIGIuZGVwb3NpdCwgMCkKCX0KCgkvLyBGb3JmZWl0cyBhcmUgY3JlZGl0ZWQgZmVlLWZyZWU7IG9ubHkgdGhlIHNhbGUgcHJpY2UgcGF5cyB0aGUgZmVlLgoJaWYgcHJvY2VlZHMgPiAwIHsKCQlsZWRnZXIuTXVzdERlcG9zaXQocy5zZWxsZXIuU3RyaW5nKCksIHByb2NlZWRzLCAwKQoJfQoJY3JlZGl0ZWQsIGZlZSA6PSBpbnQ2NCgwKSwgaW50NjQoMCkKCWlmIHNldHRsZXMgewoJCWNyZWRpdGVkLCBmZWUgPSBsZWRnZXIuTXVzdERlcG9zaXQocy5zZWxsZXIuU3RyaW5nKCksIHByaWNlLCBzLmZlZUJwcykKCX0KCglzLmZvcmZlaXRlZCA9IGZvcmZlaXRlZAoJZm9yZmVpdGVkVG90YWwgKz0gZm9yZmVpdGVkCgoJaWYgIXNldHRsZXMgewoJCXMuc3RhdHVzID0gU2FsZVVuc29sZAoJCWNoYWluLkVtaXQoIlNhbGVVbnNvbGQiLAoJCQkic2FsZUlkIiwgaXRvYShzYWxlSUQpLAoJCQkic2VsbGVyIiwgcy5zZWxsZXIuU3RyaW5nKCksCgkJCSJyZXZlYWxlZCIsIGl0b2Eocy5yZXZlYWxDb3VudCksCgkJCSJoaWdoQmlkIiwgaXRvYShoMSksCgkJCSJyZXNlcnZlIiwgaXRvYShzLnJlc2VydmUpLAoJCQkiZm9yZmVpdGVkIiwgaXRvYShmb3JmZWl0ZWQpLAoJCSkKCQlyZXR1cm4KCX0KCglzLnN0YXR1cyA9IFNhbGVTZXR0bGVkCglzLndpbm5lciA9IHdpbm5lcgoJcy5wcmljZSA9IHByaWNlCgljaGFpbi5FbWl0KCJTYWxlU2V0dGxlZCIsCgkJInNhbGVJZCIsIGl0b2Eoc2FsZUlEKSwKCQkic2VsbGVyIiwgcy5zZWxsZXIuU3RyaW5nKCksCgkJIndpbm5lciIsIHdpbm5lci5TdHJpbmcoKSwKCQkid2lubmluZ0JpZCIsIGl0b2EoaDEpLAoJCSJzZWNvbmRCaWQiLCBpdG9hKGgyKSwKCQkicHJpY2UiLCBpdG9hKHByaWNlKSwKCQkid2lubmVyU2VxIiwgaXRvYSh3aW5uZXJTZXEpLAoJCSJjcmVkaXRlZCIsIGl0b2EoY3JlZGl0ZWQpLAoJCSJmZWUiLCBpdG9hKGZlZSksCgkJImZvcmZlaXRlZCIsIGl0b2EoZm9yZmVpdGVkKSwKCSkKfQoKLy8gLS0tIGNsYWltcyAocHVsbDogcmVmdW5kcywgY2hhbmdlIGFuZCBzZWxsZXIgcHJvY2VlZHMpIC0tLQoKLy8gQ2xhaW0gc2VuZHMgYW1vdW50IHVnbm90IG9mIHRoZSBjYWxsZXIncyBjbGFpbWFibGUgYmFsYW5jZSDigJQgcmVmdW5kcywKLy8gd2lubmVyJ3MgY2hhbmdlLCBhbmQgc2VsbGVyIHByb2NlZWRzIOKAlCB0byB0aGUgY2FsbGVyLgpmdW5jIENsYWltKGN1ciByZWFsbSwgYW1vdW50IGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgZXJyIDo9IGxlZGdlci5XaXRoZHJhdyhjYWxsZXIuU3RyaW5nKCksIGFtb3VudCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBjYWxsZXIsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJDbGFpbSIsICJ0byIsIGNhbGxlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gQ2xhaW1BbGwgc2VuZHMgdGhlIGNhbGxlcidzIGVudGlyZSBjbGFpbWFibGUgYmFsYW5jZSB0byB0aGUgY2FsbGVyLgpmdW5jIENsYWltQWxsKGN1ciByZWFsbSkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFtb3VudCwgZXJyIDo9IGxlZGdlci5XaXRoZHJhd0FsbChjYWxsZXIuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglpZiBhbW91bnQgPT0gMCB7CgkJcGFuaWMoIm5vdGhpbmcgdG8gY2xhaW0iKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGNhbGxlciwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkNsYWltIiwgInRvIiwgY2FsbGVyLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyAtLS0gYWRtaW5pc3RyYXRpb24gKHR3by1zdGVwIHRyYW5zZmVyLCB0aGUgaG91c2UgcGF0dGVybikgLS0tCgpmdW5jIFNldEZlZUJwcyhjdXIgcmVhbG0sIGJwcyBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBhZG1pbiB7CgkJcGFuaWMoImFkbWluIG9ubHkiKQoJfQoJaWYgYnBzIDwgMCB8fCBicHMgPiBNYXhGZWVCcHMgewoJCXBhbmljKCJmZWUgbXVzdCBiZSAwLi4iICsgaXRvYShNYXhGZWVCcHMpICsgIiBicHMiKQoJfQoJZmVlQnBzID0gYnBzCgljaGFpbi5FbWl0KCJGZWVTZXQiLCAiYnBzIiwgaXRvYShicHMpKQp9CgpmdW5jIFNldEZlZVJlY2lwaWVudChjdXIgcmVhbG0sIHJlY2lwaWVudCBhZGRyZXNzKSB7Cglhc3NlcnROb1NlbmQoKQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IGFkbWluIHsKCQlwYW5pYygiYWRtaW4gb25seSIpCgl9CglpZiAhcmVjaXBpZW50LklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgcmVjaXBpZW50IikKCX0KCWZlZVJlY2lwaWVudCA9IHJlY2lwaWVudAoJY2hhaW4uRW1pdCgiRmVlUmVjaXBpZW50U2V0IiwgInRvIiwgcmVjaXBpZW50LlN0cmluZygpKQp9CgpmdW5jIFdpdGhkcmF3RmVlcyhjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gZmVlUmVjaXBpZW50IHsKCQlwYW5pYygiZmVlIHJlY2lwaWVudCBvbmx5IikKCX0KCWFtb3VudCA6PSBsZWRnZXIuV2l0aGRyYXdGZWVzKCkKCWlmIGFtb3VudCA9PSAwIHsKCQlwYW5pYygibm8gZmVlcyBhY2NydWVkIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBmZWVSZWNpcGllbnQsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJGZWVzV2l0aGRyYXduIiwgInRvIiwgZmVlUmVjaXBpZW50LlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyBTd2VlcERlbm9tIHJlY292ZXJzIG91dC1vZi1iYW5kIGNvaW5zIHRvIHRoZSBmZWUgcmVjaXBpZW50LiBGb3IgdGhlIGxlZGdlcgovLyBkZW5vbSB0aGUgcmVzZXJ2ZSBpcyBzZWFsZWQgKyByZXZlYWxlZCArIExpYWJpbGl0aWVzKCkg4oCUIGVzY3Jvd2VkIGRlcG9zaXRzLAovLyBjbGFpbWFibGUgcmVmdW5kcywgY2hhbmdlLCBwcm9jZWVkcyBhbmQgdGhlIGZlZSBwb3QgYXJlIGFsbCBzdHJ1Y3R1cmFsbHkKLy8gdW5yZWFjaGFibGUuCmZ1bmMgU3dlZXBEZW5vbShjdXIgcmVhbG0sIGRlbm9tIHN0cmluZykgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBmZWVSZWNpcGllbnQgewoJCXBhbmljKCJmZWUgcmVjaXBpZW50IG9ubHkiKQoJfQoJcmVzZXJ2ZSA6PSBpbnQ2NCgwKQoJaWYgZGVub20gPT0gRGVub20gewoJCXJlc2VydmUgPSBzZWFsZWQgKyByZXZlYWxlZCArIGxlZGdlci5MaWFiaWxpdGllcygpCgl9Cglzd2VwdCA6PSBjb2luaW8uU3dlZXAoMCwgY3VyLCBmZWVSZWNpcGllbnQsIGRlbm9tLCByZXNlcnZlKQoJY2hhaW4uRW1pdCgiU3VycGx1c1N3ZXB0IiwgInRvIiwgZmVlUmVjaXBpZW50LlN0cmluZygpLCAiY29pbnMiLCBpdG9hKHN3ZXB0KStkZW5vbSkKfQoKZnVuYyBUcmFuc2ZlckFkbWluKGN1ciByZWFsbSwgc3VjY2Vzc29yIGFkZHJlc3MpIHsKCWFzc2VydE5vU2VuZCgpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gYWRtaW4gewoJCXBhbmljKCJhZG1pbiBvbmx5IikKCX0KCWlmICFzdWNjZXNzb3IuSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBzdWNjZXNzb3IiKQoJfQoJcGVuZGluZ0FkbWluID0gc3VjY2Vzc29yCgljaGFpbi5FbWl0KCJBZG1pblRyYW5zZmVyU3RhZ2VkIiwgInRvIiwgc3VjY2Vzc29yLlN0cmluZygpKQp9CgpmdW5jIEFjY2VwdEFkbWluKGN1ciByZWFsbSkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIHBlbmRpbmdBZG1pbiA9PSAiIiB8fCBjYWxsZXIgIT0gcGVuZGluZ0FkbWluIHsKCQlwYW5pYygibm8gYWRtaW4gdHJhbnNmZXIgc3RhZ2VkIGZvciBjYWxsZXIiKQoJfQoJYWRtaW4gPSBwZW5kaW5nQWRtaW4KCXBlbmRpbmdBZG1pbiA9ICIiCgljaGFpbi5FbWl0KCJBZG1pblRyYW5zZmVycmVkIiwgInRvIiwgY2FsbGVyLlN0cmluZygpKQp9CgovLyAtLS0gdmlld3MgKG5vbi1jcm9zc2luZzogY3Jvc3MtcmVhbG0gcmVhZGFibGUpIC0tLQoKLy8gU2FsZUluZm8gcmV0dXJucyBhIHNhbGUncyB0ZXJtcyBhbmQgc3RhbmRpbmcgc3RhdGUuIExvdCB0ZXh0IGlzIGEgc2VwYXJhdGUKLy8gdmlldyAoW0xvdF0pIHNvIHRoaXMgc3RheXMgYSBudW1lcmljL2FkZHJlc3MgdHVwbGUuCi8vCi8vIGBtaW5EZXBvc2l0YCBpcyByZXBvcnRlZCBhcyBSRVNPTFZFRCwgbmV2ZXIgYXMgdGhlIHNlbGxlciB0eXBlZCBpdDogYSAwIGF0Ci8vIGNyZWF0ZSBtZWFucyAibm8gcHJlZmVyZW5jZSIgYW5kIGJlY29tZXMgdGhlIG1heChNaW5CaWQsIHJlc2VydmUpIGZsb29yLCBzbwovLyBhIGJpZGRlciByZWFkaW5nIHRoaXMgbmV2ZXIgaGFzIHRvIHJlLWRlcml2ZSB0aGUgZmxvb3IgdG8gZmluZCBvdXQgd2hhdAovLyBbQ29tbWl0XSB3aWxsIGFjY2VwdC4KZnVuYyBTYWxlSW5mbyhzYWxlSUQgaW50NjQpIChzZWxsZXIgYWRkcmVzcywgcmVzZXJ2ZSwgbWluRGVwb3NpdCwgZmVlQnBzLCBjb21taXRFbmQsIHJldmVhbEVuZCwgY3JlYXRlZEhlaWdodCwgYmlkcywgcmV2ZWFsZWRCaWRzIGludDY0LCBzdGF0dXMgc3RyaW5nKSB7CglzIDo9IG11c3RTYWxlKHNhbGVJRCkKCXJldHVybiBzLnNlbGxlciwgcy5yZXNlcnZlLCBzLm1pbkRlcG9zaXQsIHMuZmVlQnBzLCBzLmNvbW1pdEVuZCwgcy5yZXZlYWxFbmQsCgkJcy5jcmVhdGVkSGVpZ2h0LCBpbnQ2NChsZW4ocy5iaWRzKSksIHMucmV2ZWFsQ291bnQsIHMuc3RhdHVzCn0KCi8vIE1pbkRlcG9zaXQgaXMgdGhlIHJlc29sdmVkIGVudHJ5IHByaWNlIGZvciBvbmUgY29tbWl0bWVudCBvbiB0aGlzIHNhbGU6IHRoZQovLyBzbWFsbGVzdCBkZXBvc2l0IFtDb21taXRdIGFjY2VwdHMuIEl0IGlzIGF0IGxlYXN0IG1heChNaW5CaWQsIHJlc2VydmUpIGFuZAovLyBpcyB0aGUgc2VsbGVyJ3MgZGVmZW5jZSBhZ2FpbnN0IHNsb3Qgc3F1YXR0aW5nIChhdWRpdCBZMTsgc2VlIFtDcmVhdGVTYWxlXSkuCmZ1bmMgTWluRGVwb3NpdChzYWxlSUQgaW50NjQpIGludDY0IHsgcmV0dXJuIG11c3RTYWxlKHNhbGVJRCkubWluRGVwb3NpdCB9CgovLyBMb3QgcmV0dXJucyB0aGUgc2FsZSdzIGZyZWUtdGV4dCBsb3QgZGVzY3JpcHRpb24uCmZ1bmMgTG90KHNhbGVJRCBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIG11c3RTYWxlKHNhbGVJRCkubG90IH0KCi8vIFBoYXNlIHJlcG9ydHMgd2hlcmUgYSBzYWxlIGlzOiAiY29tbWl0IiwgInJldmVhbCIgb3IgImNsb3NlYWJsZSIgd2hpbGUgaXQgaXMKLy8gb3BlbiwgZWxzZSBpdHMgdGVybWluYWwgc3RhdHVzLiBUaGUgcGhhc2UgaXMgZGVyaXZlZCBmcm9tIHRoZSBjaGFpbiBoZWlnaHQKLy8gYW5kIGlzIG5ldmVyIHN0b3JlZCwgc28gaXQgY2Fubm90IGRpc2FncmVlIHdpdGggdGhlIGd1YXJkcy4KZnVuYyBQaGFzZShzYWxlSUQgaW50NjQpIHN0cmluZyB7IHJldHVybiBwaGFzZU9mKG11c3RTYWxlKHNhbGVJRCkpIH0KCi8vIFN0YXR1cyBpcyB0aGUgc2FsZSdzIFNUT1JFRCBzdGF0ZSAtLSBvbmUgb2YgIm9wZW4iLCAic2V0dGxlZCIsICJ1bnNvbGQiIG9yCi8vICJjYW5jZWxsZWQiLiBJdCBhbnN3ZXJzIGEgZGlmZmVyZW50IHF1ZXN0aW9uIGZyb20gW1BoYXNlXTogYW4gb3BlbiBzYWxlIGhhcwovLyB0aHJlZSBkaXN0aW5jdCBwaGFzZXMgYnV0IG9ubHkgb25lIHN0YXR1cywgYW5kIGEgY2xvc2VkIG9uZSBoYXMgYSBzdGF0dXMKLy8gdGhhdCBubyBsb25nZXIgbW92ZXMgd2l0aCB0aGUgY2hhaW4gaGVpZ2h0LgpmdW5jIFN0YXR1cyhzYWxlSUQgaW50NjQpIHN0cmluZyB7IHJldHVybiBtdXN0U2FsZShzYWxlSUQpLnN0YXR1cyB9CgovLyBXaW5uZXIgaXMgdGhlIHdpbm5pbmcgYmlkZGVyIG9uY2UgdGhlIHNhbGUgaGFzIFNldHRsZWQsIGVsc2UgIiIuCmZ1bmMgV2lubmVyKHNhbGVJRCBpbnQ2NCkgYWRkcmVzcyB7IHJldHVybiBtdXN0U2FsZShzYWxlSUQpLndpbm5lciB9CgovLyBQcmljZSBpcyB0aGUgU0VDT05EIHByaWNlIHRoZSB3aW5uZXIgYWN0dWFsbHkgcGFpZCBvbmNlIHRoZSBzYWxlIGhhcwovLyBTZXR0bGVkLCBlbHNlIDAuIEl0IGlzIG5vdCB0aGUgd2lubmluZyBiaWQ7IHNlZSBbV2lubmluZ0JpZF0uCmZ1bmMgUHJpY2Uoc2FsZUlEIGludDY0KSBpbnQ2NCB7IHJldHVybiBtdXN0U2FsZShzYWxlSUQpLnByaWNlIH0KCi8vIFdpbm5pbmdCaWQgaXMgdGhlIGhpZ2hlc3QgT1BFTkVEIGJpZCBvbiBhIHNhbGUsIGF2YWlsYWJsZSBhcyBzb29uIGFzIGl0IGlzCi8vIHJldmVhbGVkIChhIHJldmVhbGVkIGJpZCBpcyBwdWJsaWMpLiBJdCBpcyB3aGF0IHRoZSB3aW5uZXIgYmlkLCBub3Qgd2hhdAovLyB0aGV5IHBheS4KZnVuYyBXaW5uaW5nQmlkKHNhbGVJRCBpbnQ2NCkgaW50NjQgewoJaDEsIF8sIF8sIF8gOj0gY2xlYXJpbmcobXVzdFNhbGUoc2FsZUlEKSkKCXJldHVybiBoMQp9CgovLyBTZWNvbmRCaWQgaXMgdGhlIHNlY29uZC1oaWdoZXN0IE9QRU5FRCBiaWQsIG9yIDAuIFdpdGggYSB0aWUgb24gdGhlIGhpZ2hlc3QKLy8gaXQgZXF1YWxzIHRoZSBoaWdoZXN0LgpmdW5jIFNlY29uZEJpZChzYWxlSUQgaW50NjQpIGludDY0IHsKCV8sIGgyLCBfLCBfIDo9IGNsZWFyaW5nKG11c3RTYWxlKHNhbGVJRCkpCglyZXR1cm4gaDIKfQoKLy8gUHJvdmlzaW9uYWxQcmljZSBpcyB3aGF0IHRoZSB3aW5uZXIgd291bGQgcGF5IGlmIHRoZSBzYWxlIGNsb3NlZCByaWdodCBub3c6Ci8vIG1heChzZWNvbmQgYmlkLCByZXNlcnZlLCBNaW5CaWQpLCBvciAwIGlmIG5vdGhpbmcgaXMgb3BlbmVkIHlldCBvciB0aGUKLy8gaGlnaGVzdCBvcGVuaW5nIGlzIGJlbG93IHRoZSByZXNlcnZlLgpmdW5jIFByb3Zpc2lvbmFsUHJpY2Uoc2FsZUlEIGludDY0KSBpbnQ2NCB7CglzIDo9IG11c3RTYWxlKHNhbGVJRCkKCWlmIHMuc3RhdHVzID09IFNhbGVTZXR0bGVkIHsKCQlyZXR1cm4gcy5wcmljZQoJfQoJaDEsIGgyLCB3aW5uZXIsIF8gOj0gY2xlYXJpbmcocykKCWlmIHdpbm5lciA9PSAiIiB8fCBoMSA8IHMucmVzZXJ2ZSB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiB2aWNrcmV5UHJpY2UoaDIsIHMucmVzZXJ2ZSkKfQoKLy8gQ29tbWl0bWVudE9mIHJldHVybnMgdGhlIGJpZGRlcidzIHN0b3JlZCBjb21taXRtZW50IG9uIGEgc2FsZSAoIiIgaWYgbm9uZSkuCmZ1bmMgQ29tbWl0bWVudE9mKHNhbGVJRCBpbnQ2NCwgYmlkZGVyIGFkZHJlc3MpIHN0cmluZyB7CglpZiBiIDo9IGZpbmRCaWQobXVzdFNhbGUoc2FsZUlEKSwgYmlkZGVyKTsgYiAhPSBuaWwgewoJCXJldHVybiBiLmNvbW1pdG1lbnQKCX0KCXJldHVybiAiIgp9CgovLyBEZXBvc2l0T2YgcmV0dXJucyB0aGUgYmlkZGVyJ3MgZXNjcm93ZWQgZGVwb3NpdCBvbiBhIHNhbGUgKDAgaWYgbm9uZSkuCmZ1bmMgRGVwb3NpdE9mKHNhbGVJRCBpbnQ2NCwgYmlkZGVyIGFkZHJlc3MpIGludDY0IHsKCWlmIGIgOj0gZmluZEJpZChtdXN0U2FsZShzYWxlSUQpLCBiaWRkZXIpOyBiICE9IG5pbCB7CgkJcmV0dXJuIGIuZGVwb3NpdAoJfQoJcmV0dXJuIDAKfQoKLy8gSGFzUmV2ZWFsZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBiaWRkZXIgaGFzIG9wZW5lZCB0aGVpciBiaWQgb24gYSBzYWxlLgpmdW5jIEhhc1JldmVhbGVkKHNhbGVJRCBpbnQ2NCwgYmlkZGVyIGFkZHJlc3MpIGJvb2wgewoJYiA6PSBmaW5kQmlkKG11c3RTYWxlKHNhbGVJRCksIGJpZGRlcikKCXJldHVybiBiICE9IG5pbCAmJiBiLm9wZW5lZAp9CgovLyBSZXZlYWxlZEFtb3VudE9mIHJldHVybnMgdGhlIGJpZGRlcidzIE9QRU5FRCBiaWQgYW1vdW50ICgwIHdoaWxlIHNlYWxlZCkuIEEKLy8gcmV2ZWFsZWQgYmlkIGlzIHB1YmxpYyBieSBjb25zdHJ1Y3Rpb24g4oCUIGl0IHRyYXZlbGxlZCBpbiBhIHRyYW5zYWN0aW9uLgpmdW5jIFJldmVhbGVkQW1vdW50T2Yoc2FsZUlEIGludDY0LCBiaWRkZXIgYWRkcmVzcykgaW50NjQgewoJYiA6PSBmaW5kQmlkKG11c3RTYWxlKHNhbGVJRCksIGJpZGRlcikKCWlmIGIgPT0gbmlsIHx8ICFiLm9wZW5lZCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBiLmFtb3VudAp9CgovLyBGb3JmZWl0ZWRPZiBpcyB0aGUgdG90YWwgZGVwb3NpdCBsaXF1aWRhdGVkIHRvIHRoZSBzZWxsZXIgb24gYSBjbG9zZWQgc2FsZQovLyAoMCBiZWZvcmUgY2xvc2UpLiBBIGN1bXVsYXRpdmUgc3RhdGlzdGljLCBub3QgYSBoZWxkIGJhbGFuY2UuCmZ1bmMgRm9yZmVpdGVkT2Yoc2FsZUlEIGludDY0KSBpbnQ2NCB7IHJldHVybiBtdXN0U2FsZShzYWxlSUQpLmZvcmZlaXRlZCB9CgovLyBCaWRzT24gaXMgaG93IG1hbnkgY29tbWl0bWVudHMgYSBzYWxlIGhvbGRzOyBSZXZlYWxlZE9uIGhvdyBtYW55IGFyZSBvcGVuZWQuCmZ1bmMgQmlkc09uKHNhbGVJRCBpbnQ2NCkgaW50NjQgICAgIHsgcmV0dXJuIGludDY0KGxlbihtdXN0U2FsZShzYWxlSUQpLmJpZHMpKSB9CmZ1bmMgUmV2ZWFsZWRPbihzYWxlSUQgaW50NjQpIGludDY0IHsgcmV0dXJuIG11c3RTYWxlKHNhbGVJRCkucmV2ZWFsQ291bnQgfQoKLy8gQmxvY2tzTGVmdCBpcyBob3cgbWFueSBibG9ja3MgcmVtYWluIGluIHRoZSBzYWxlJ3MgY3VycmVudCB3aW5kb3cgKDAgb25jZQovLyB0aGUgcmV2ZWFsIHdpbmRvdyBoYXMgc2h1dCBvciB0aGUgc2FsZSBpcyB0ZXJtaW5hbCkuCmZ1bmMgQmxvY2tzTGVmdChzYWxlSUQgaW50NjQpIGludDY0IHsKCXMgOj0gbXVzdFNhbGUoc2FsZUlEKQoJaWYgcy5zdGF0dXMgIT0gU2FsZU9wZW4gewoJCXJldHVybiAwCgl9Cglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgl0YXJnZXQgOj0gcy5yZXZlYWxFbmQKCWlmIG5vdyA8IHMuY29tbWl0RW5kIHsKCQl0YXJnZXQgPSBzLmNvbW1pdEVuZAoJfQoJaWYgbGVmdCA6PSB0YXJnZXQgLSBub3c7IGxlZnQgPiAwIHsKCQlyZXR1cm4gbGVmdAoJfQoJcmV0dXJuIDAKfQoKLy8gSXNDbG9zZWFibGUgcmVwb3J0cyB3aGV0aGVyIENsb3NlIHdvdWxkIHN1Y2NlZWQgcmlnaHQgbm93LgpmdW5jIElzQ2xvc2VhYmxlKHNhbGVJRCBpbnQ2NCkgYm9vbCB7CglzIDo9IG11c3RTYWxlKHNhbGVJRCkKCXJldHVybiBzLnN0YXR1cyA9PSBTYWxlT3BlbiAmJiBydW50aW1lLkNoYWluSGVpZ2h0KCkgPj0gcy5yZXZlYWxFbmQKfQoKZnVuYyBIYXNTYWxlKHNhbGVJRCBpbnQ2NCkgYm9vbCB7IHJldHVybiBzYWxlcy5HZXQocGFkSUQoc2FsZUlEKSkgIT0gbmlsIH0KCmZ1bmMgU2FsZXNPZihzZWxsZXIgYWRkcmVzcykgaW50NjQgewoJdiA6PSBzZWxsZXJOdW0uR2V0KHNlbGxlci5TdHJpbmcoKSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuICp2LigqaW50NjQpCn0KCmZ1bmMgQWRtaW4oKSBhZGRyZXNzICAgICAgICAgICAgICB7IHJldHVybiBhZG1pbiB9CmZ1bmMgUGVuZGluZ0FkbWluKCkgYWRkcmVzcyAgICAgICB7IHJldHVybiBwZW5kaW5nQWRtaW4gfQpmdW5jIEZlZVJlY2lwaWVudCgpIGFkZHJlc3MgICAgICAgeyByZXR1cm4gZmVlUmVjaXBpZW50IH0KZnVuYyBGZWVCcHMoKSBpbnQ2NCAgICAgICAgICAgICAgIHsgcmV0dXJuIGZlZUJwcyB9CmZ1bmMgTnVtU2FsZXMoKSBpbnQ2NCAgICAgICAgICAgICB7IHJldHVybiBuZXh0SUQgfQpmdW5jIENsYWltYWJsZU9mKGEgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gbGVkZ2VyLkJhbGFuY2VPZihhLlN0cmluZygpKSB9CmZ1bmMgRmVlc0FjY3J1ZWQoKSBpbnQ2NCAgICAgICAgICB7IHJldHVybiBsZWRnZXIuRmVlc0FjY3J1ZWQoKSB9CmZ1bmMgTGlhYmlsaXRpZXMoKSBpbnQ2NCAgICAgICAgICB7IHJldHVybiBsZWRnZXIuTGlhYmlsaXRpZXMoKSB9CmZ1bmMgU2VhbGVkKCkgaW50NjQgICAgICAgICAgICAgICB7IHJldHVybiBzZWFsZWQgfQpmdW5jIFJldmVhbGVkKCkgaW50NjQgICAgICAgICAgICAgeyByZXR1cm4gcmV2ZWFsZWQgfQpmdW5jIEZvcmZlaXRlZFRvdGFsKCkgaW50NjQgICAgICAgeyByZXR1cm4gZm9yZmVpdGVkVG90YWwgfQpmdW5jIEhlbGQoKSBpbnQ2NCAgICAgICAgICAgICAgICAgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQpmdW5jIEFkZHJlc3MoKSBhZGRyZXNzICAgICAgICAgICAgeyByZXR1cm4gc2VsZiB9CmZ1bmMgSGVpZ2h0KCkgaW50NjQgICAgICAgICAgICAgICB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gLS0tIGludGVybmFscyAtLS0KCi8vIHBoYXNlT2YgZGVyaXZlcyB0aGUgc2FsZSdzIHBoYXNlIGZyb20gdGhlIGNoYWluIGhlaWdodC4gTm90aGluZyBzdG9yZXMgaXQsCi8vIHNvIGl0IGNhbm5vdCBkaXNhZ3JlZSB3aXRoIHRoZSBndWFyZHMgaW4gQ29tbWl0LCBSZXZlYWwgYW5kIENsb3NlLgpmdW5jIHBoYXNlT2YocyAqc2FsZSkgc3RyaW5nIHsKCWlmIHMuc3RhdHVzICE9IFNhbGVPcGVuIHsKCQlyZXR1cm4gcy5zdGF0dXMKCX0KCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCXN3aXRjaCB7CgljYXNlIG5vdyA8IHMuY29tbWl0RW5kOgoJCXJldHVybiBQaGFzZUNvbW1pdAoJY2FzZSBub3cgPCBzLnJldmVhbEVuZDoKCQlyZXR1cm4gUGhhc2VSZXZlYWwKCWRlZmF1bHQ6CgkJcmV0dXJuIFBoYXNlQ2xvc2VhYmxlCgl9Cn0KCi8vIGNsZWFyaW5nIHNjYW5zIHRoZSBvcGVuZWQgYmlkcyBvZiBhIHNhbGUgZm9yIHRoZSBoaWdoZXN0IGFuZCBzZWNvbmQtaGlnaGVzdAovLyBhbW91bnRzIGFuZCB0aGUgd2lubmVyLiBJdCBpcyBhIHB1cmUgcmVhZCBvdmVyIGEgc2xpY2UgYm91bmRlZCBieQovLyBNYXhCaWRkZXJzUGVyU2FsZS4KLy8KLy8gVGhlIHJlc3VsdCBpcyBJTkRFUEVOREVOVCBPRiBTVE9SQUdFIE9SREVSLCB3aGljaCBtYXR0ZXJzIGJlY2F1c2UgYGJpZHNgIGlzCi8vIGluIGNvbW1pdCBvcmRlciB3aGlsZSB0aGUgdGllLWJyZWFrIGlzIG9uIHJldmVhbCBvcmRlci4gQSB0aWUgb24gdGhlIGhpZ2hlc3QKLy8gYW1vdW50IHJlc29sdmVzIHRvIHRoZSBlYXJsaWVzdCByZXZlYWxTZXEgYW5kIGxlYXZlcyBoMiA9PSBoMSwgc28gdGhlIHRpZWQKLy8gd2lubmVyIHBheXMgdGhlaXIgZnVsbCBiaWQgcmF0aGVyIHRoYW4gcHJvZml0aW5nIGZyb20gdGhlIGNvbGxpc2lvbi4KZnVuYyBjbGVhcmluZyhzICpzYWxlKSAoaDEsIGgyIGludDY0LCB3aW5uZXIgYWRkcmVzcywgd2lubmVyU2VxIGludDY0KSB7Cgl3aW5uZXIgPSAiIgoJZm9yIF8sIGIgOj0gcmFuZ2Ugcy5iaWRzIHsKCQlpZiAhYi5vcGVuZWQgewoJCQljb250aW51ZQoJCX0KCQliZXR0ZXIgOj0gYi5hbW91bnQgPiBoMSB8fCAoYi5hbW91bnQgPT0gaDEgJiYgd2lubmVyICE9ICIiICYmIGIucmV2ZWFsU2VxIDwgd2lubmVyU2VxKQoJCWlmIGJldHRlciB7CgkJCWgyID0gaDEKCQkJaDEgPSBiLmFtb3VudAoJCQl3aW5uZXIgPSBiLmJpZGRlcgoJCQl3aW5uZXJTZXEgPSBiLnJldmVhbFNlcQoJCQljb250aW51ZQoJCX0KCQlpZiBiLmFtb3VudCA+IGgyIHsKCQkJaDIgPSBiLmFtb3VudAoJCX0KCX0KCXJldHVybiBoMSwgaDIsIHdpbm5lciwgd2lubmVyU2VxCn0KCi8vIHZpY2tyZXlQcmljZSBpcyB0aGUgY2xlYXJpbmcgcHJpY2U6IHRoZSBzZWNvbmQgYmlkLCBmbG9vcmVkIGJ5IHRoZSByZXNlcnZlCi8vIGFuZCBieSB0aGUgZHVzdCBmbG9vci4gRWFjaCBvZiB0aGUgdGhyZWUgaXMgPD0gdGhlIHdpbm5pbmcgYmlkIGluIHRoZSBicmFuY2gKLy8gdGhhdCB1c2VzIGl0IOKAlCBoMiBieSBkZWZpbml0aW9uLCB0aGUgcmVzZXJ2ZSBiZWNhdXNlIGEgbG93ZXIgaGlnaCBiaWQgaXMKLy8gVW5zb2xkLCBhbmQgTWluQmlkIGJlY2F1c2UgUmV2ZWFsIHJlamVjdHMgYW55dGhpbmcgdW5kZXIgaXQg4oCUIHNvIHRoZQovLyB3aW5uZXIncyBjaGFuZ2UgaXMgbmV2ZXIgbmVnYXRpdmUuCmZ1bmMgdmlja3JleVByaWNlKGgyLCByZXNlcnZlIGludDY0KSBpbnQ2NCB7CglwIDo9IGgyCglpZiByZXNlcnZlID4gcCB7CgkJcCA9IHJlc2VydmUKCX0KCWlmIE1pbkJpZCA+IHAgewoJCXAgPSBNaW5CaWQKCX0KCXJldHVybiBwCn0KCmZ1bmMgZmluZEJpZChzICpzYWxlLCBiaWRkZXIgYWRkcmVzcykgKmJpZCB7Cglmb3IgXywgYiA6PSByYW5nZSBzLmJpZHMgewoJCWlmIGIuYmlkZGVyID09IGJpZGRlciB7CgkJCXJldHVybiBiCgkJfQoJfQoJcmV0dXJuIG5pbAp9CgovLyBhc3NlcnRDb21taXRtZW50IGFjY2VwdHMgZXhhY3RseSBDb21taXRtZW50TGVuIExPV0VSQ0FTRSBoZXggY2hhcmFjdGVycy4KLy8gVXBwZXJjYXNlIGlzIHJlamVjdGVkIHJhdGhlciB0aGFuIG5vcm1hbGlzZWQ6IENvbW1pdEhhc2ggZW1pdHMgbG93ZXJjYXNlLCBzbwovLyBhbiB1cHBlcmNhc2UgY29tbWl0bWVudCBjb3VsZCBuZXZlciBiZSBvcGVuZWQsIGFuZCByZWZ1c2luZyBpdCBhdCBDb21taXQKLy8gdHVybnMgYSBzaWxlbnQgdG90YWwgbG9zcyBvZiB0aGUgZGVwb3NpdCBpbnRvIGFuIGltbWVkaWF0ZSBlcnJvci4KZnVuYyBhc3NlcnRDb21taXRtZW50KGMgc3RyaW5nKSB7CglpZiBsZW4oYykgIT0gQ29tbWl0bWVudExlbiB7CgkJcGFuaWMoImNvbW1pdG1lbnQgbXVzdCBiZSAiICsgaXRvYShDb21taXRtZW50TGVuKSArICIgbG93ZXJjYXNlIGhleCBjaGFyYWN0ZXJzIikKCX0KCWZvciBpIDo9IDA7IGkgPCBsZW4oYyk7IGkrKyB7CgkJY2ggOj0gY1tpXQoJCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgewoJCQljb250aW51ZQoJCX0KCQlwYW5pYygiY29tbWl0bWVudCBtdXN0IGJlIGxvd2VyY2FzZSBoZXg7IGdvdCBhbiBpbnZhbGlkIGNoYXJhY3RlciIpCgl9Cn0KCmZ1bmMgbXVzdFNhbGUoaWQgaW50NjQpICpzYWxlIHsKCXYgOj0gc2FsZXMuR2V0KHBhZElEKGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygidW5rbm93biBzYWxlICIgKyBpdG9hKGlkKSkKCX0KCXJldHVybiB2Ligqc2FsZSkKfQoKZnVuYyBhc3NlcnROb1NlbmQoKSB7CglpZiAhdW5zYWZlLk9yaWdpblNlbmQoKS5Jc1plcm8oKSB7CgkJcGFuaWMoInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zIikKCX0KfQoKZnVuYyBjb3VudGVyKHRyZWUgKmF2bC5UcmVlLCBhIGFkZHJlc3MpICppbnQ2NCB7CglrIDo9IGEuU3RyaW5nKCkKCWlmIHYgOj0gdHJlZS5HZXQoayk7IHYgIT0gbmlsIHsKCQlyZXR1cm4gdi4oKmludDY0KQoJfQoJbiA6PSBpbnQ2NCgwKQoJdHJlZS5TZXQoaywgJm4pCglyZXR1cm4gJm4KfQoKZnVuYyBhZGRDaGVja2VkKGEsIGIgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJcyA6PSBhICsgYgoJaWYgKGIgPiAwICYmIHMgPCBhKSB8fCAoYiA8IDAgJiYgcyA+IGEpIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBzLCB0cnVlCn0KCmZ1bmMgcGFkSUQoaWQgaW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkKCWZvciBsZW4ocykgPCAxMiB7CgkJcyA9ICIwIiArIHMKCX0KCXJldHVybiBzCn0KCmZ1bmMgaXRvYShuIGludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQobiwgMTApIH0KCmZ1bmMgaGFzUHJlZml4KHMsIHAgc3RyaW5nKSBib29sIHsgcmV0dXJuIGxlbihzKSA+PSBsZW4ocCkgJiYgc1s6bGVuKHApXSA9PSBwIH0KCi8vIC0tLSBSZW5kZXIgLS0tCgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXN3aXRjaCB7CgljYXNlIHBhdGggPT0gIiI6CgkJcmV0dXJuIHJlbmRlckhvbWUoKQoJY2FzZSBoYXNQcmVmaXgocGF0aCwgInNhbGUvIik6CgkJcmV0dXJuIHJlbmRlclNhbGUocGF0aFtsZW4oInNhbGUvIik6XSkKCWRlZmF1bHQ6CgkJcmV0dXJuICJ1bmtub3duIHBhdGg7IHRyeSBcIlwiIG9yIFwic2FsZS88aWQ+XCJcbiIKCX0KfQoKZnVuYyByZW5kZXJIb21lKCkgc3RyaW5nIHsKCW91dCA6PSAiIyBzZWFsZWRiaWQg4oCUIHNlYWxlZC1iaWQgc2Vjb25kLXByaWNlIChWaWNrcmV5KSBhdWN0aW9ucyBpbiB1Z25vdFxuXG4iCglvdXQgKz0gIlNhbGVzOiAiICsgaXRvYShuZXh0SUQpICsgIiDCtyBzZWFsZWQgZGVwb3NpdHM6ICIgKyBpdG9hKHNlYWxlZCkgKyBEZW5vbSArCgkJIiDCtyByZXZlYWxlZCBkZXBvc2l0czogIiArIGl0b2EocmV2ZWFsZWQpICsgRGVub20gKwoJCSIgwrcgY2xhaW1hYmxlK2ZlZXMgaGVsZDogIiArIGl0b2EobGVkZ2VyLkxpYWJpbGl0aWVzKCkpICsgRGVub20gKwoJCSIgwrcgZmVlcyBhY2NydWVkOiAiICsgaXRvYShsZWRnZXIuRmVlc0FjY3J1ZWQoKSkgKyBEZW5vbSArCgkJIiDCtyBmb3JmZWl0ZWQgdG8gZGF0ZTogIiArIGl0b2EoZm9yZmVpdGVkVG90YWwpICsgRGVub20gKyAiXG5cbiIKCW91dCArPSAiQ29tbWl0IGEgaGFzaCBvZiB5b3VyIGJpZCBhbmQgZXNjcm93IGEgZGVwb3NpdDsgb3BlbiBpdCBhZnRlciB0aGUgY29tbWl0IHdpbmRvdyBzaHV0cy4gIiArCgkJIlRoZSBoaWdoZXN0IG9wZW5lZCBiaWQgd2lucyBhbmQgcGF5cyB0aGUgU0VDT05EIGhpZ2hlc3QgcHJpY2UuICIgKwoJCSJBIGNvbW1pdG1lbnQgbmV2ZXIgb3BlbmVkIGlzIHZvaWQgYW5kIGl0cyBkZXBvc2l0IGdvZXMgdG8gdGhlIHNlbGxlci5cblxuIgoJb3V0ICs9ICJ8IGlkIHwgc2VsbGVyIHwgbG90IHwgcmVzZXJ2ZSB8IGRlcG9zaXQgZnJvbSB8IHBoYXNlIHwgYmlkcyB8IG9wZW5lZCB8IHByaWNlIHxcbiIgKwoJCSJ8LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18XG4iCglzaG93biA6PSBpbnQ2NCgwKQoJZm9yIGlkIDo9IG5leHRJRCAtIDE7IGlkID49IDAgJiYgc2hvd24gPCBSZW5kZXJMaW1pdDsgaWQtLSB7CgkJdiA6PSBzYWxlcy5HZXQocGFkSUQoaWQpKQoJCWlmIHYgPT0gbmlsIHsKCQkJY29udGludWUKCQl9CgkJcyA6PSB2Ligqc2FsZSkKCQlvdXQgKz0gInwgIiArIGl0b2Eocy5pZCkgKyAiIHwgIiArIHNhbml0aXplLlRhYmxlQ2VsbChzLnNlbGxlci5TdHJpbmcoKSkgKyAiIHwgIiArCgkJCXNhbml0aXplLlRhYmxlQ2VsbChzLmxvdCkgKyAiIHwgIiArIGl0b2Eocy5yZXNlcnZlKSArIERlbm9tICsgIiB8ICIgKwoJCQlpdG9hKHMubWluRGVwb3NpdCkgKyBEZW5vbSArICIgfCAiICsKCQkJcGhhc2VPZihzKSArICIgfCAiICsgaXRvYShpbnQ2NChsZW4ocy5iaWRzKSkpICsgIiB8ICIgKyBpdG9hKHMucmV2ZWFsQ291bnQpICsgIiB8ICIgKwoJCQlwcmljZUNlbGwocykgKyAiIHxcbiIKCQlzaG93bisrCgl9CglpZiBuZXh0SUQgPiBzaG93biB7CgkJb3V0ICs9ICJcbigiICsgaXRvYShzaG93bikgKyAiIG1vc3QgcmVjZW50IG9mICIgKyBpdG9hKG5leHRJRCkgKyAiKVxuIgoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIHJlbmRlclNhbGUoaWRTdHIgc3RyaW5nKSBzdHJpbmcgewoJaWQsIGVyciA6PSBzdHJjb252LlBhcnNlSW50KGlkU3RyLCAxMCwgNjQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gImJhZCBzYWxlIGlkXG4iCgl9Cgl2IDo9IHNhbGVzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICJ1bmtub3duIHNhbGUgIiArIGlkU3RyICsgIlxuIgoJfQoJcyA6PSB2Ligqc2FsZSkKCW91dCA6PSAiIyBzYWxlICIgKyBpdG9hKHMuaWQpICsgIlxuXG4iCglvdXQgKz0gIi0gbG90OiAiICsgc2FuaXRpemUuSW5saW5lVGV4dChzLmxvdCkgKyAiXG4iCgkvLyBFdmVyeSBzdG9yZWQgc3RyaW5nIHJlYWNoaW5nIG1hcmtkb3duIGlzIHNhbml0aXplZCwgYWRkcmVzc2VzIGluY2x1ZGVkLgoJLy8gQSBiZWNoMzIgYWRkcmVzcyBjYXJyaWVzIG5vIG1hcmtkb3duIG1ldGFjaGFyYWN0ZXIsIHNvIHRoaXMgaXMgbm90IGFuCgkvLyBlc2NhcGUgdGhhdCBpcyBsb2FkLWJlYXJpbmcgdG9kYXk7IGl0IGlzIGhlcmUgYmVjYXVzZSByZW5kZXJIb21lIGFscmVhZHkKCS8vIHJvdXRlZCB0aGlzIHNhbWUgZmllbGQgdGhyb3VnaCBzYW5pdGl6ZS5UYWJsZUNlbGwgYW5kIHRoaXMgcmVuZGVyZXIgZGlkCgkvLyBub3QsIGFuZCB0d28gcmVuZGVyZXJzIGRpc2FncmVlaW5nIGFib3V0IHdoZXRoZXIgYSBmaWVsZCBuZWVkcyBlc2NhcGluZwoJLy8gaXMgaG93IHRoZSBuZXh0IGZpZWxkIGdldHMgdGhlIHdyb25nIGFuc3dlci4gQXVkaXQgWTIuCglvdXQgKz0gIi0gc2VsbGVyOiAiICsgc2FuaXRpemUuSW5saW5lVGV4dChzLnNlbGxlci5TdHJpbmcoKSkgKyAiXG4iCglvdXQgKz0gIi0gcmVzZXJ2ZTogIiArIGl0b2Eocy5yZXNlcnZlKSArIERlbm9tICsKCQkiIMK3IGRlcG9zaXQgZnJvbSAiICsgaXRvYShzLm1pbkRlcG9zaXQpICsgRGVub20gKwoJCSIgwrcgZmVlOiAiICsgaXRvYShzLmZlZUJwcykgKyAiIGJwc1xuIgoJb3V0ICs9ICItIHBoYXNlOiAiICsgcGhhc2VPZihzKSArICIgwrcgc3RhdHVzOiAiICsgcy5zdGF0dXMgKwoJCSIgwrcgY3JlYXRlZCBhdCBoZWlnaHQgIiArIGl0b2Eocy5jcmVhdGVkSGVpZ2h0KSArICJcbiIKCW91dCArPSAiLSBjb21taXQgd2luZG93IGVuZHMgYXQgaGVpZ2h0ICIgKyBpdG9hKHMuY29tbWl0RW5kKSArCgkJIiDCtyByZXZlYWwgd2luZG93IGVuZHMgYXQgaGVpZ2h0ICIgKyBpdG9hKHMucmV2ZWFsRW5kKSArICJcbiIKCW91dCArPSAiLSBjb21taXRtZW50czogIiArIGl0b2EoaW50NjQobGVuKHMuYmlkcykpKSArICIgwrcgb3BlbmVkOiAiICsgaXRvYShzLnJldmVhbENvdW50KSArICJcbiIKCWlmIHMuc3RhdHVzID09IFNhbGVPcGVuIHsKCQlvdXQgKz0gIi0gYmxvY2tzIGxlZnQgaW4gdGhpcyB3aW5kb3c6ICIgKyBpdG9hKEJsb2Nrc0xlZnQocy5pZCkpICsgIlxuIgoJCWlmIHMucmV2ZWFsQ291bnQgPiAwIHsKCQkJXywgaDIsIF8sIF8gOj0gY2xlYXJpbmcocykKCQkJb3V0ICs9ICItIHByb3Zpc2lvbmFsIHNlY29uZCBwcmljZTogIiArIGl0b2EoUHJvdmlzaW9uYWxQcmljZShzLmlkKSkgKyBEZW5vbSArCgkJCQkiIChzZWNvbmQgYmlkICIgKyBpdG9hKGgyKSArIERlbm9tICsgIilcbiIKCQl9Cgl9CglpZiBzLnN0YXR1cyA9PSBTYWxlU2V0dGxlZCB7CgkJaDEsIGgyLCBfLCBfIDo9IGNsZWFyaW5nKHMpCgkJb3V0ICs9ICItIHdpbm5lcjogIiArIHNhbml0aXplLklubGluZVRleHQocy53aW5uZXIuU3RyaW5nKCkpICsgIiBiaWQgIiArIGl0b2EoaDEpICsgRGVub20gKwoJCQkiIGFuZCBwYWlkICIgKyBpdG9hKHMucHJpY2UpICsgRGVub20gKyAiIChzZWNvbmQgYmlkICIgKyBpdG9hKGgyKSArIERlbm9tICsgIilcbiIKCX0KCWlmIHMuc3RhdHVzID09IFNhbGVVbnNvbGQgewoJCWgxLCBfLCBfLCBfIDo9IGNsZWFyaW5nKHMpCgkJb3V0ICs9ICItIHVuc29sZDogaGlnaGVzdCBvcGVuZWQgYmlkICIgKyBpdG9hKGgxKSArIERlbm9tICsKCQkJIiBhZ2FpbnN0IHJlc2VydmUgIiArIGl0b2Eocy5yZXNlcnZlKSArIERlbm9tICsgIlxuIgoJfQoJaWYgcy5mb3JmZWl0ZWQgPiAwIHsKCQlvdXQgKz0gIi0gZm9yZmVpdGVkIHRvIHRoZSBzZWxsZXI6ICIgKyBpdG9hKHMuZm9yZmVpdGVkKSArIERlbm9tICsgIlxuIgoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIHByaWNlQ2VsbChzICpzYWxlKSBzdHJpbmcgewoJaWYgcy5zdGF0dXMgPT0gU2FsZVNldHRsZWQgewoJCXJldHVybiBpdG9hKHMucHJpY2UpICsgRGVub20KCX0KCXJldHVybiAi4oCUIgp9CiINNTAwMDAwMDB1Z25vdBISCNbTjk4SCzE2MzgxOHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkCCsnoRBI/jesejhcUw+KQF9tt+LDak5kKxpv82r9UWUypoID6L0ys3M3Ux6dtRi4yunNZbCKdvMQmxoJRitZowGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}