Event Details

This is a KIND 5391 event created on 2024-03-25 23:51:32 (5 months, 3 weeks ago). Debug this event chain.

{
  "id": "662cc584ce04bafb5393ab5a8624010fe854d55298e82c22bca8ca657d1a7b31",
  "pubkey": "a029df4a2c4a042f4b23a0d6197fd9680805327e023eb1705c70d13db9821a3d",
  "created_at": 1711410692,
  "kind": "5391",
  "tags": [
    [
      "e",
      "67c2163ef886642d4e3a0c9d99c4b056a0176320a88b3a502595d1bf9f8b15dc",
      "wss://dashglow-test.nostr1.com",
      "root"
    ],
    [
      "m",
      "text/html"
    ],
    [
      "alt",
      "This is a binary chunk of a web-based video game. Play the full game at https://crashglow.com/game/nevent1qqsx0ssk8mugvepdfcaqe8vecjc9dgqhvvs23ze62qjet5dln793thqpremhxue69uhkgctndpnkcmmh946x2um59ehx7um5wgcjucm0d5q3vamnwvaz7tmjv4kxz7fwwpexjmtpdshxuet5qy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszymhwden5te0wfjkcctev93xcefwdaexwqg5waehxw309aex2mrp0yhxummnw3ezumt9qyxhwumn8ghj7mn0wvhxcmmvqyt8wumn8ghj7un9d3shjtnwdaehgu3wvfskueqzyzsznh62939qgt6tywsdvxtlm95qspfj0cpravtst3cdz0desgdr6qcyqqqqqqgn47xm6"
    ],
    [
      "index",
      "1"
    ],
    [
      "x",
      "a33194f438851920cc43d59c61a386b79adcc5a55b0b64667386cd8f43baaab0"
    ]
  ],
  "content": "bnVsbCkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCXJldHVybiB7CgkJCWJhciA6IGJhckluZGV4LAoJCQliZWF0IDogYmVhdDE2SW5kZXgsCgkJfTsKCX07CgoJdGhpcy5nZXRCbGlwU3RhdGUgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gYWN0aXZlU2Z4OwoJfTsKCgl0aGlzLnBsYXlOb3RlID0gZnVuY3Rpb24ocGl0Y2gsIGluc3RydW1lbnQsIGNoYW5uZWwsIGtleSkgewoJCWJlYXQxNiA9IHRlbXBvc1tUZW1wby5TTFddOwoJCW11dGVUaW1lciA9IGJlYXQxNjsKCQlwbGF5Tm90ZShwaXRjaCwgaW5zdHJ1bWVudCwgeyBjaGFubmVsOiBjaGFubmVsLCBrZXk6IGtleSB9KTsKCX07CgoJdGhpcy5zZXRUZW1wbyA9IGZ1bmN0aW9uKHRlbXBvKSB7CgkJYmVhdDE2ID0gdGVtcG9zW3RlbXBvXTsKCX07CgoJdGhpcy5zZXRMb29waW5nID0gZnVuY3Rpb24obG9vcGluZykgewoJCWlzTG9vcGluZyA9IGxvb3Bpbmc7Cgl9OwoKCS8qIFNPVU5EIEVGRkVDVFMgKi8KCXZhciBzZnhQZWFrVm9sdW1lID0gMTA7IC8vIHRvZG8gOiBpcyB0aGlzIGEgZ29vZCB2YWx1ZT8KCXZhciBhY3RpdmVTZnggPSBudWxsOwoJdmFyIGlzTXVzaWNQYXVzZWRGb3JCbGlwID0gZmFsc2U7CgoJZnVuY3Rpb24gY3JlYXRlU2Z4U3RhdGUoYmxpcCwgcGl0Y2gsIGlzUGl0Y2hSYW5kb21pemVkKSB7CgkJLy8gYml0c3kubG9nKCJpbml0IHNmeCBibGlwOiAiICsgYmxpcC5pZCk7CgoJCXZhciBzZnhTdGF0ZSA9IHsKCQkJYmxpcCA6IGJsaXAsCgkJCXBpdGNoSW5kZXggOiAtMSwKCQkJZnJlcXVlbmNpZXMgOiBbXSwKCQkJdGltZXIgOiAwLAoJCQlkdXJhdGlvbiA6IDAsCgkJfTsKCgkJLy8gaXMgaXQgd2VpcmQgdG8gdHJhY2sgdGhpcyBib3RoIGluIHRoZSBzeXN0ZW0gKkFORCogdGhlIGVuZ2luZT8KCQlzZnhTdGF0ZS5kdXJhdGlvbiA9IChibGlwLmVudmVsb3BlLmF0dGFjayArIGJsaXAuZW52ZWxvcGUuZGVjYXkgKyBibGlwLmVudmVsb3BlLmxlbmd0aCArIGJsaXAuZW52ZWxvcGUucmVsZWFzZSk7CgoJCS8vIGFkanVzdCBzdGFydGluZyBwaXRjaAoJCXZhciBzdGVwID0gMDsKCQlpZiAocGl0Y2ggIT0gbnVsbCkgewoJCQlzdGVwID0gcGl0Y2hEaXN0YW5jZShibGlwLnBpdGNoQSwgcGl0Y2gpOwoJCX0KCQllbHNlIGlmIChpc1BpdGNoUmFuZG9taXplZCA+IDApIHsKCQkJc3RlcCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDYpOwoJCX0KCgkJaWYgKGJsaXAucGl0Y2hBLmJlYXRzID4gMCkgewoJCQlzZnhTdGF0ZS5mcmVxdWVuY2llcy5wdXNoKG1ha2VQaXRjaEZyZXF1ZW5jeShhZGp1c3RQaXRjaChibGlwLnBpdGNoQSwgc3RlcCkpKTsKCQl9CgkJaWYgKGJsaXAucGl0Y2hCLmJlYXRzID4gMCkgewoJCQlzZnhTdGF0ZS5mcmVxdWVuY2llcy5wdXNoKG1ha2VQaXRjaEZyZXF1ZW5jeShhZGp1c3RQaXRjaChibGlwLnBpdGNoQiwgc3RlcCkpKTsKCQl9CgkJaWYgKGJsaXAucGl0Y2hDLmJlYXRzID4gMCkgewoJCQlzZnhTdGF0ZS5mcmVxdWVuY2llcy5wdXNoKG1ha2VQaXRjaEZyZXF1ZW5jeShhZGp1c3RQaXRjaChibGlwLnBpdGNoQywgc3RlcCkpKTsKCQl9CgoJCXJldHVybiBzZnhTdGF0ZTsKCX0KCglmdW5jdGlvbiBwbGF5QmxpcChibGlwLCBvcHRpb25zKSB7CgkJLy8gZGVmYXVsdCB0byBwYXVzaW5nIG11c2ljIHdoaWxlIHRoZSBibGlwIHBsYXlzIChleGNlcHQgd2hlbiBwbGF5aW5nIGEgYmxpcCBhcyAqcGFydCogb2YgbXVzaWMpCgkJaXNNdXNpY1BhdXNlZEZvckJsaXAgPSAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaW50ZXJydXB0TXVzaWMgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogb3B0aW9ucy5pbnRlcnJ1cHRNdXNpYzsKCgkJLy8gYWx3YXlzIHBsYXkgYmxpcHMgb24gY2hhbm5lbCAxCgkJdmFyIGNoYW5uZWwgPSBiaXRzeS5TT1VORDE7CgoJCS8vIG90aGVyIG9wdGlvbnMKCQl2YXIgcGl0Y2ggPSAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMucGl0Y2ggPT09IHVuZGVmaW5lZCkgPyBudWxsIDogb3B0aW9ucy5waXRjaDsKCQl2YXIgaXNQaXRjaFJhbmRvbWl6ZWQgPSAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaXNQaXRjaFJhbmRvbWl6ZWQgPT09IHVuZGVmaW5lZCkgPyBmYWxzZSA6IG9wdGlvbnMuaXNQaXRjaFJhbmRvbWl6ZWQ7CgkJdmFyIGtleSA9IChvcHRpb25zICE9IHVuZGVmaW5lZCAmJiBvcHRpb25zLmtleSAhPSB1bmRlZmluZWQpID8gb3B0aW9ucy5rZXkgOiBudWxsOwoKCQlhY3RpdmVTZnggPSBjcmVhdGVTZnhTdGF0ZShibGlwLCBwaXRjaFRvQ2hyb21hdGljKHBpdGNoLCBrZXkpLCBpc1BpdGNoUmFuZG9taXplZCk7CgkJYml0c3kubG9nKCJwbGF5IGJsaXA6ICIgKyBhY3RpdmVTZnguZnJlcXVlbmNpZXMpOwoKCQliaXRzeS5zb3VuZCgKCQkJY2hhbm5lbCwKCQkJYWN0aXZlU2Z4LmR1cmF0aW9uICogMTAsIC8vIEhBQ0sgOiBtdWx0IGJ5IDEwIGlzIHRvIGF2b2lkIGFjY2lkZW50YWxseSB0dXJuaW5nIG9mZiBlYXJseQoJCQlhY3RpdmVTZnguZnJlcXVlbmNpZXMubGVuZ3RoID4gMCA/IChhY3RpdmVTZnguZnJlcXVlbmNpZXNbMF0gKiAxMDApIDogMCwKCQkJMCwgLy8gdm9sdW1lCgkJCWFjdGl2ZVNmeC5ibGlwLmluc3RydW1lbnQpOwoJfTsKCgl0aGlzLnBsYXlCbGlwID0gcGxheUJsaXA7CgoJdGhpcy5pc0JsaXBQbGF5aW5nID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGlzTXVzaWNQYXVzZWRGb3JCbGlwOyAvLyB0b2RvIDogcmVuYW1lIHRoaXMgdmFyaWFibGU/Cgl9OwoKCS8vIHRvZG8gOiBzaG91bGQgYW55IG9mIHRoaXMgc3R1ZmYgYmUgbW92ZWQgaW50byB0aGUgdG9vbCBjb2RlPwoJdGhpcy5zYW1wbGVCbGlwID0gZnVuY3Rpb24oYmxpcCwgc2FtcGxlQ291bnQpIHsKCQl2YXIgc2Z4ID0gY3JlYXRlU2Z4U3RhdGUoYmxpcCwgbnVsbCwgZmFsc2UpOwoKCQl2YXIgbWluRnJlcSA9IG1ha2VQaXRjaEZyZXF1ZW5jeSh7IG5vdGU6IE5vdGUuQywgb2N0YXZlOiBPY3RhdmVbMl0gfSk7CgkJdmFyIG1heEZyZXEgPSBtYWtlUGl0Y2hGcmVxdWVuY3koeyBub3RlOiBOb3RlLkIsIG9jdGF2ZTogT2N0YXZlWzVdIH0pOwoKCQkvLyBzYW1wbGUgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgc291bmQKCQl2YXIgZnJlcXVlbmN5U2FtcGxlcyA9IFtdOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7IGkrKykgewoJCQlpZiAoc2Z4LmZyZXF1ZW5jaWVzLmxlbmd0aCA+IDApIHsKCQkJCXZhciB0ID0gTWF0aC5mbG9vcigoaSAvIHNhbXBsZUNvdW50KSAqIHNmeC5kdXJhdGlvbik7CgkJCQkvLyBnZXQgZnJlcXVlbmN5IGF0IHRpbWUKCQkJCXZhciBmcmVxID0gc2Z4RnJlcXVlbmN5QXRUaW1lKHNmeCwgdCk7CgkJCQkvLyBub3JtYWxpemUgdGhlIHNhbXBsZQoJCQkJZnJlcSA9IGZyZXEgLyAobWF4RnJlcSAtIG1pbkZyZXEpOwoKCQkJCWZyZXF1ZW5jeVNhbXBsZXMucHVzaChmcmVxKTsKCQkJfQoJCQllbHNlIHsKCQkJCWZyZXF1ZW5jeVNhbXBsZXMucHVzaCgwKTsKCQkJfQoJCX0KCgkJLy8gc2FtcGxlIHRoZSB2b2x1bWUgZW52ZWxvcGUKCQl2YXIgYW1wbGl0dWRlU2FtcGxlcyA9IFtdOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7IGkrKykgewoJCQl2YXIgdCA9IE1hdGguZmxvb3IoKGkgLyBzYW1wbGVDb3VudCkgKiBzZnguZHVyYXRpb24pOwoJCQlhbXBsaXR1ZGVTYW1wbGVzLnB1c2goc2Z4Vm9sdW1lQXRUaW1lKHNmeCwgdCkgLyBtYXhWb2x1bWUpOwoJCX0KCgkJcmV0dXJuIHsKCQkJZnJlcXVlbmNpZXM6IGZyZXF1ZW5jeVNhbXBsZXMsCgkJCWFtcGxpdHVkZXM6IGFtcGxpdHVkZVNhbXBsZXMKCQl9OwoJfTsKfQo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8qClRPRE86Ci0gY2FuIEkgc2ltcGxpZnkgdGhpcyBtb3JlIG5vdyB0aGF0IEkndmUgcmVtb3ZlZCB0aGUgZXh0ZXJuYWwgcmVzb3VyY2VzIHN0dWZmPwoqLwoKZnVuY3Rpb24gRm9udE1hbmFnZXIocGFja2FnZWRGb250TmFtZXMpIHsKCnZhciBzZWxmID0gdGhpczsKCnZhciBmb250RXh0ZW5zaW9uID0gIi5iaXRzeWZvbnQiOwp0aGlzLkdldEV4dGVuc2lvbiA9IGZ1bmN0aW9uKCkgewoJcmV0dXJuIGZvbnRFeHRlbnNpb247Cn0KCi8vIHBsYWNlIHRvIHN0b3JlIGZvbnQgZGF0YQp2YXIgZm9udFJlc291cmNlcyA9IHt9OwoKLy8gbG9hZCBmb250cyBmcm9tIHRoZSBlZGl0b3IKaWYgKHBhY2thZ2VkRm9udE5hbWVzICE9IHVuZGVmaW5lZCAmJiBwYWNrYWdlZEZvbnROYW1lcyAhPSBudWxsICYmIHBhY2thZ2VkRm9udE5hbWVzLmxlbmd0aCA+IDAKCQkmJiBSZXNvdXJjZXMgIT0gdW5kZWZpbmVkICYmIFJlc291cmNlcyAhPSBudWxsKSB7CgoJZm9yICh2YXIgaSA9IDA7IGkgPCBwYWNrYWdlZEZvbnROYW1lcy5sZW5ndGg7IGkrKykgewoJCXZhciBmaWxlbmFtZSA9IHBhY2thZ2VkRm9udE5hbWVzW2ldOwoJCWZvbnRSZXNvdXJjZXNbZmlsZW5hbWVdID0gUmVzb3VyY2VzW2ZpbGVuYW1lXTsKCX0KfQoKLy8gbWFudWFsbHkgYWRkIHJlc291cmNlCnRoaXMuQWRkUmVzb3VyY2UgPSBmdW5jdGlvbihmaWxlbmFtZSwgZm9udGRhdGEpIHsKCWZvbnRSZXNvdXJjZXNbZmlsZW5hbWVdID0gZm9udGRhdGE7Cn0KCnRoaXMuQ29udGFpbnNSZXNvdXJjZSA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7CglyZXR1cm4gZm9udFJlc291cmNlc1tmaWxlbmFtZV0gIT0gbnVsbDsKfQoKZnVuY3Rpb24gR2V0RGF0YShmb250TmFtZSkgewoJcmV0dXJuIGZvbnRSZXNvdXJjZXNbZm9udE5hbWUgKyBmb250RXh0ZW5zaW9uXTsKfQp0aGlzLkdldERhdGEgPSBHZXREYXRhOwoKZnVuY3Rpb24gQ3JlYXRlKGZvbnREYXRhKSB7CglyZXR1cm4gbmV3IEZvbnQoZm9udERhdGEpOwp9CnRoaXMuQ3JlYXRlID0gQ3JlYXRlOwoKdGhpcy5HZXQgPSBmdW5jdGlvbihmb250TmFtZSkgewoJdmFyIGZvbnREYXRhID0gc2VsZi5HZXREYXRhKGZvbnROYW1lKTsKCXJldHVybiBzZWxmLkNyZWF0ZShmb250RGF0YSk7Cn0KCmZ1bmN0aW9uIEZvbnQoZm9udERhdGEpIHsKCWJpdHN5LmxvZygiY3JlYXRlIGZvbnQiKTsKCgl2YXIgbmFtZSA9ICJ1bmtub3duIjsKCXZhciB3aWR0aCA9IDY7IC8vIGRlZmF1bHQgc2l6ZSBzbyBpZiB5b3UgaGF2ZSBOTyBmb250IG9yIGFuIGludmFsaWQgZm9udCBpdCBkaXNwbGF5cyBib3hlcwoJdmFyIGhlaWdodCA9IDg7Cgl2YXIgY2hhcmRhdGEgPSB7fTsKCgkvLyBjcmVhdGUgaW52YWxpZCBjaGFyIGRhdGEgYXQgZGVmYXVsdCBzaXplIGluIGNhc2UgdGhlIGZvbnQgaXMgbWlzc2luZwoJdmFyIGludmFsaWRDaGFyRGF0YSA9IHt9OwoJdXBkYXRlSW52YWxpZENoYXJEYXRhKCk7CgoJdGhpcy5nZXROYW1lID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJdGhpcy5nZXREYXRhID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGNoYXJkYXRhOwoJfQoKCXRoaXMuZ2V0V2lkdGggPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gd2lkdGg7Cgl9CgoJdGhpcy5nZXRIZWlnaHQgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gaGVpZ2h0OwoJfQoKCXRoaXMuaGFzQ2hhciA9IGZ1bmN0aW9uKGNoYXIpIHsKCQl2YXIgY29kZXBvaW50ID0gY2hhci5jaGFyQ29kZUF0KDApOwoJCXJldHVybiBjaGFyZGF0YVtjb2RlcG9pbnRdICE9IG51bGw7Cgl9CgoJdGhpcy5nZXRDaGFyID0gZnVuY3Rpb24oY2hhcikgewoKCQl2YXIgY29kZXBvaW50ID0gY2hhci5jaGFyQ29kZUF0KDApOwoKCQlpZiAoY2hhcmRhdGFbY29kZXBvaW50XSAhPSBudWxsKSB7CgkJCXJldHVybiBjaGFyZGF0YVtjb2RlcG9pbnRdOwoJCX0KCQllbHNlIHsKCQkJcmV0dXJuIGludmFsaWRDaGFyRGF0YTsKCQl9Cgl9CgoJdGhpcy5hbGxDaGFyQ29kZXMgPSBmdW5jdGlvbigpIHsKCQl2YXIgY29kZUxpc3QgPSBbXTsKCQlmb3IgKHZhciBjb2RlIGluIGNoYXJkYXRhKSB7CgkJCWNvZGVMaXN0LnB1c2goY29kZSk7CgkJfQoJCXJldHVybiBjb2RlTGlzdDsKCX0KCglmdW5jdGlvbiBjcmVhdGVDaGFyRGF0YSgpIHsKCQlyZXR1cm4geyAKCQkJd2lkdGg6IHdpZHRoLAoJCQloZWlnaHQ6IGhlaWdodCwKCQkJb2Zmc2V0OiB7CgkJCQl4OiAwLAoJCQkJeTogMAoJCQl9LAoJCQlzcGFjaW5nOiB3aWR0aCwKCQkJZGF0YTogW10sCgkJfTsKCX0KCglmdW5jdGlvbiB1cGRhdGVJbnZhbGlkQ2hhckRhdGEoKSB7CgkJaW52YWxpZENoYXJEYXRhID0gY3JlYXRlQ2hhckRhdGEoKTsKCQlmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkJCWZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJCQkJaWYgKHggPCB3aWR0aC0xICYmIHkgPCBoZWlnaHQtMSkgewoJCQkJCWludmFsaWRDaGFyRGF0YS5kYXRhLnB1c2goMSk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlpbnZhbGlkQ2hhckRhdGEuZGF0YS5wdXNoKDApOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWZ1bmN0aW9uIHBhcnNlRm9udChmb250RGF0YSkgewoJCWlmIChmb250RGF0YSA9PSBudWxsKSB7CgkJCXJldHVybjsKCQl9CgoJCWJpdHN5LmxvZygic3BsaXQgZm9udCBsaW5lcyIpOwoJCS8vIE5PVEU6IHRoaXMgaXMgd2hlcmUgd2UgcnVuIG91dCBvZiBtZW1vcnkgLSBzcGxpdCBjcmVhdGVzIGEgbG90IG9mIG1lbW9yeSBpc3N1ZXMKCQkvLyB2YXIgbGluZXMgPSBmb250RGF0YS5zcGxpdCgiXG4iKTsKCQliaXRzeS5sb2coImFmdGVyIHNwbGl0IGxpbmVzIik7CgoJCXZhciBpc1JlYWRpbmdDaGFyID0gZmFsc2U7CgkJdmFyIGlzUmVhZGluZ0NoYXJQcm9wZXJ0aWVzID0gZmFsc2U7CgkJdmFyIGN1ckNoYXJMaW5lQ291bnQgPSAwOwoJCXZhciBjdXJDaGFyQ29kZSA9IDA7CgoJCXZhciBsaW5lU3RhcnQgPSAwOwoJCXZhciBsaW5lRW5kID0gZm9udERhdGEuaW5kZXhPZigiXG4iLCBsaW5lU3RhcnQpICE9IC0xCgkJCT8gZm9udERhdGEuaW5kZXhPZigiXG4iLCBsaW5lU3RhcnQpCgkJCTogZm9udERhdGEubGVuZ3RoOwoKCQkvLyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CgkJLy8gCXZhciBsaW5lID0gbGluZXNbaV07CgkJd2hpbGUgKGxpbmVTdGFydCA8IGZvbnREYXRhLmxlbmd0aCkgewoJCQl2YXIgbGluZSA9IGZvbnREYXRhLnN1YnN0cmluZyhsaW5lU3RhcnQsIGxpbmVFbmQpOwoJCQkvLyBiaXRzeS5sb2coInBhcnNlIGZvbnQgeHggIiArIGxpbmUpOwoKCQkJaWYgKGxpbmVbMF0gPT09ICIjIikgewoJCQkJLy8gc2tpcCBjb21tZW50IGxpbmVzCgkJCX0KCQkJZWxzZSBpZiAoIWlzUmVhZGluZ0NoYXIpIHsKCQkJCS8vIFJFQURJTkcgTk9OIENIQVJBQ1RFUiBEQVRBIExJTkUKCQkJCXZhciBhcmdzID0gbGluZS5zcGxpdCgiICIpOwoJCQkJaWYgKGFyZ3NbMF0gPT0gIkZPTlQiKSB7CgkJCQkJbmFtZSA9IGFyZ3NbMV07CgkJCQl9CgkJCQllbHNlIGlmIChhcmdzWzBdID09ICJTSVpFIikgewoJCQkJCXdpZHRoID0gcGFyc2VJbnQoYXJnc1sxXSk7CgkJCQkJaGVpZ2h0ID0gcGFyc2VJbnQoYXJnc1syXSk7CgkJCQl9CgkJCQllbHNlIGlmIChhcmdzWzBdID09ICJDSEFSIikgewoJCQkJCWlzUmVhZGluZ0NoYXIgPSB0cnVlOwoJCQkJCWlzUmVhZGluZ0NoYXJQcm9wZXJ0aWVzID0gdHJ1ZTsKCgkJCQkJY3VyQ2hhckxpbmVDb3VudCA9IDA7CgkJCQkJY3VyQ2hhckNvZGUgPSBwYXJzZUludChhcmdzWzFdKTsKCQkJCQljaGFyZGF0YVtjdXJDaGFyQ29kZV0gPSBjcmVhdGVDaGFyRGF0YSgpOwoJCQkJfQoJCQl9CgkJCWVsc2UgewoJCQkJLy8gQ0hBUiBQUk9QRVJUSUVTCgkJCQlpZiAoaXNSZWFkaW5nQ2hhclByb3BlcnRpZXMpIHsKCQkJCQl2YXIgYXJncyA9IGxpbmUuc3BsaXQoIiAiKTsKCQkJCQlpZiAoYXJnc1swXS5pbmRleE9mKCJDSEFSXyIpID09IDApIHsgLy8gU3ViLXByb3BlcnRpZXMgc3RhcnQgd2l0aCAiQ0hBUl8iCgkJCQkJCWlmIChhcmdzWzBdID09ICJDSEFSX1NJWkUiKSB7CgkJCQkJCQkvLyBDdXN0b20gY2hhcmFjdGVyIHNpemUgLSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIHNpemUgZm9yIHRoZSBmb250CgkJCQkJCQljaGFyZGF0YVtjdXJDaGFyQ29kZV0ud2lkdGggPSBwYXJzZUludChhcmdzWzFdKTsKCQkJCQkJCWNoYXJkYXRhW2N1ckNoYXJDb2RlXS5oZWlnaHQgPSBwYXJzZUludChhcmdzWzJdKTsKCQkJCQkJCWNoYXJkYXRhW2N1ckNoYXJDb2RlXS5zcGFjaW5nID0gcGFyc2VJbnQoYXJnc1sxXSk7IC8vIEhBQ0sgOiBhc3N1bWVzIENIQVJfU0laRSBpcyBhbHdheXMgZGVjbGFyZWQgZmlyc3QKCQkJCQkJfQoJCQkJCQllbHNlIGlmIChhcmdzWzBdID09ICJDSEFSX09GRlNFVCIpIHsKCQkJCQkJCS8vIENoYXJhY3RlciBvZmZzZXQgLSBzaGlmdCB0aGUgb3JpZ2luIG9mIHRoZSBjaGFyYWN0ZXIgb24gdGhlIFggb3IgWSBheGlzCgkJCQkJCQljaGFyZGF0YVtjdXJDaGFyQ29kZV0ub2Zmc2V0LnggPSBwYXJzZUludChhcmdzWzFdKTsKCQkJCQkJCWNoYXJkYXRhW2N1ckNoYXJDb2RlXS5vZmZzZXQueSA9IHBhcnNlSW50KGFyZ3NbMl0pOwoJCQkJCQl9CgkJCQkJCWVsc2UgaWYgKGFyZ3NbMF0gPT0gIkNIQVJfU1BBQ0lORyIpIHsKCQkJCQkJCS8vIENoYXJhY3RlciBzcGFjaW5nOgoJCQkJCQkJLy8gc3BlY2lmeSB0b3RhbCBob3Jpem9udGFsIHNwYWNlIHRha2VuIHVwIGJ5IHRoZSBjaGFyYWN0ZXIKCQkJCQkJCS8vIGxldHMgY2hhcnMgdGFrZSB1cCBtb3JlIG9yIGxlc3Mgc3BhY2Ugb24gYSBsaW5lIHRoYW4gaXRzIGJpdG1hcCBkb2VzCgkJCQkJCQljaGFyZGF0YVtjdXJDaGFyQ29kZV0uc3BhY2luZyA9IHBhcnNlSW50KGFyZ3NbMV0pOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlpc1JlYWRpbmdDaGFyUHJvcGVydGllcyA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBDSEFSIERBVEEKCQkJCWlmICghaXNSZWFkaW5nQ2hhclByb3BlcnRpZXMpIHsKCQkJCQkvLyBSRUFESU5HIENIQVJBQ1RFUiBEQVRBIExJTkUKCQkJCQlmb3IgKHZhciBqID0gMDsgaiA8IGNoYXJkYXRhW2N1ckNoYXJDb2RlXS53aWR0aDsgaisrKQoJCQkJCXsKCQkJCQkJY2hhcmRhdGFbY3VyQ2hhckNvZGVdLmRhdGEucHVzaCggcGFyc2VJbnQobGluZVtqXSkgKTsKCQkJCQl9CgoJCQkJCWN1ckNoYXJMaW5lQ291bnQrKzsKCQkJCQlpZiAoY3VyQ2hhckxpbmVDb3VudCA+PSBjaGFyZGF0YVtjdXJDaGFyQ29kZV0uaGVpZ2h0KSB7CgkJCQkJCWlzUmVhZGluZ0NoYXIgPSBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWxpbmVTdGFydCA9IGxpbmVFbmQgKyAxOwoJCQlsaW5lRW5kID0gZm9udERhdGEuaW5kZXhPZigiXG4iLCBsaW5lU3RhcnQpICE9IC0xCgkJCQk/IGZvbnREYXRhLmluZGV4T2YoIlxuIiwgbGluZVN0YXJ0KQoJCQkJOiBmb250RGF0YS5sZW5ndGg7CgkJfQoKCQkvLyByZS1pbml0IGludmFsaWQgY2hhcmFjdGVyIGJveCBhdCB0aGUgYWN0dWFsIGZvbnQgc2l6ZSBvbmNlIGl0J3MgbG9hZGVkCgkJdXBkYXRlSW52YWxpZENoYXJEYXRhKCk7Cgl9CgoJYml0c3kubG9nKCJwYXJzZSBmb250Iik7CglwYXJzZUZvbnQoZm9udERhdGEpOwoKCWJpdHN5LmxvZygiY3JlYXRlIGZvbnQiKTsKfQoKfSAvLyBGb250TWFuYWdlcgoKPC9zY3JpcHQ+Cgo8c2NyaXB0Pgp2YXIgVHJhbnNpdGlvbk1hbmFnZXIgPSBmdW5jdGlvbigpIHsKCXZhciB0cmFuc2l0aW9uU3RhcnQgPSBudWxsOwoJdmFyIHRyYW5zaXRpb25FbmQgPSBudWxsOwoKCXZhciBpc1RyYW5zaXRpb25pbmcgPSBmYWxzZTsKCXZhciB0cmFuc2l0aW9uVGltZSA9IDA7IC8vIG1pbGxpc2Vjb25kcwoJdmFyIG1pblN0ZXBUaW1lID0gMTI1OyAvLyBjYXAgdGhlIGZyYW1lIHJhdGUKCXZhciBjdXJTdGVwID0gMDsKCgl0aGlzLkJlZ2luVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKHN0YXJ0Um9vbSwgc3RhcnRYLCBzdGFydFksIGVuZFJvb20sIGVuZFgsIGVuZFksIGVmZmVjdE5hbWUpIHsKCQliaXRzeS5sb2coIi0tLSBTVEFSVCBST09NIFRSQU5TSVRJT04gLS0tIik7CgoJCWN1ckVmZmVjdCA9IGVmZmVjdE5hbWU7CgoJCXZhciB0bXBSb29tID0gcGxheWVyKCkucm9vbTsKCQl2YXIgdG1wWCA9IHBsYXllcigpLng7CgkJdmFyIHRtcFkgPSBwbGF5ZXIoKS55OwoKCQlpZiAodHJhbnNpdGlvbkVmZmVjdHNbY3VyRWZmZWN0XS5zaG93UGxheWVyU3RhcnQpIHsKCQkJcGxheWVyKCkucm9vbSA9IHN0YXJ0Um9vbTsKCQkJcGxheWVyKCkueCA9IHN0YXJ0WDsKCQkJcGxheWVyKCkueSA9IHN0YXJ0WTsKCQl9CgkJZWxzZSB7CgkJCXBsYXllcigpLnJvb20gPSAiX3RyYW5zaXRpb25fbm9uZSI7IC8vIGtpbmQgb2YgaGFja3khIQoJCX0KCgkJdmFyIHN0YXJ0Um9vbVBpeGVscyA9IGNyZWF0ZVJvb21QaXhlbEJ1ZmZlcihyb29tW3N0YXJ0Um9vbV0pOwoJCXZhciBzdGFydFBhbGV0dGUgPSBnZXRQYWwocm9vbVtzdGFydFJvb21dLnBhbCk7CgkJdmFyIHN0YXJ0SW1hZ2UgPSBuZXcgUG9zdFByb2Nlc3NJbWFnZShzdGFydFJvb21QaXhlbHMpOwoJCXRyYW5zaXRpb25TdGFydCA9IG5ldyBUcmFuc2l0aW9uSW5mbyhzdGFydEltYWdlLCBzdGFydFBhbGV0dGUsIHN0YXJ0WCwgc3RhcnRZKTsKCgkJaWYgKHRyYW5zaXRpb25FZmZlY3RzW2N1ckVmZmVjdF0uc2hvd1BsYXllckVuZCkgewoJCQlwbGF5ZXIoKS5yb29tID0gZW5kUm9vbTsKCQkJcGxheWVyKCkueCA9IGVuZFg7CgkJCXBsYXllcigpLnkgPSBlbmRZOwoJCX0KCQllbHNlIHsKCQkJcGxheWVyKCkucm9vbSA9ICJfdHJhbnNpdGlvbl9ub25lIjsKCQl9CgoJCXZhciBlbmRSb29tUGl4ZWxzID0gY3JlYXRlUm9vbVBpeGVsQnVmZmVyKHJvb21bZW5kUm9vbV0pOwoJCXZhciBlbmRQYWxldHRlID0gZ2V0UGFsKHJvb21bZW5kUm9vbV0ucGFsKTsKCQl2YXIgZW5kSW1hZ2UgPSBuZXcgUG9zdFByb2Nlc3NJbWFnZShlbmRSb29tUGl4ZWxzKTsKCQl0cmFuc2l0aW9uRW5kID0gbmV3IFRyYW5zaXRpb25JbmZvKGVuZEltYWdlLCBlbmRQYWxldHRlLCBlbmRYLCBlbmRZKTsKCgkJaXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTsKCQl0cmFuc2l0aW9uVGltZSA9IDA7CgkJY3VyU3RlcCA9IDA7CgoJCXBsYXllcigpLnJvb20gPSBlbmRSb29tOwoJCXBsYXllcigpLnggPSBlbmRYOwoJCXBsYXllcigpLnkgPSBlbmRZOwoKCQliaXRzeS5ncmFwaGljc01vZGUoYml0c3kuR0ZYX1ZJREVPKTsKCX0KCgl0aGlzLlVwZGF0ZVRyYW5zaXRpb24gPSBmdW5jdGlvbihkdCkgewoJCWlmICghaXNUcmFuc2l0aW9uaW5nKSB7CgkJCXJldHVybjsKCQl9CgoJCXRyYW5zaXRpb25UaW1lICs9IGR0OwoKCQl2YXIgbWF4U3RlcCA9IHRyYW5zaXRpb25FZmZlY3RzW2N1ckVmZmVjdF0uc3RlcENvdW50OwoKCQlpZiAodHJhbnNpdGlvblRpbWUgPj0gbWluU3RlcFRpbWUpIHsKCQkJY3VyU3RlcCsrOwoKCQkJdmFyIHN0ZXAgPSBjdXJTdGVwOwoJCQliaXRzeS5sb2coInRyYW5zaXRpb24gc3RlcCAiICsgc3RlcCk7CgoJCQlpZiAodHJhbnNpdGlvbkVmZmVjdHNbY3VyRWZmZWN0XS5wYWxldHRlRWZmZWN0RnVuYykgewoJCQkJdmFyIGNvbG9ycyA9IHRyYW5zaXRpb25FZmZlY3RzW2N1ckVmZmVjdF0ucGFsZXR0ZUVmZmVjdEZ1bmModHJhbnNpdGlvblN0YXJ0LCB0cmFuc2l0aW9uRW5kLCAoc3RlcCAvIG1heFN0ZXApKTsKCQkJCXVwZGF0ZVBhbGV0dGVXaXRoVGlsZUNvbG9ycyhjb2xvcnMpOwoJCQl9CgoJCQliaXRzeS5maWxsKGJpdHN5LlZJREVPLCB0aWxlQ29sb3JTdGFydEluZGV4KTsKCgkJCWZvciAodmFyIHkgPSAwOyB5IDwgYml0c3kuVklERU9fU0laRTsgeSsrKSB7CgkJCQlmb3IgKHZhciB4ID0gMDsgeCA8IGJpdHN5LlZJREVPX1NJWkU7IHgrKykgewoJCQkJCXZhciBjb2xvciA9IHRyYW5zaXRpb25FZmZlY3RzW2N1ckVmZmVjdF0ucGl4ZWxFZmZlY3RGdW5jKHRyYW5zaXRpb25TdGFydCwgdHJhbnNpdGlvbkVuZCwgeCwgeSwgKHN0ZXAgLyBtYXhTdGVwKSk7CgkJCQkJYml0c3kuc2V0KGJpdHN5LlZJREVPLCAoeSAqIGJpdHN5LlZJREVPX1NJWkUpICsgeCwgY29sb3IpOwoJCQkJfQoJCQl9CgoJCQl0cmFuc2l0aW9uVGltZSA9IDA7CgkJfQoKCQlpZiAoY3VyU3RlcCA+PSAobWF4U3RlcCAtIDEpKSB7CgkJCWlzVHJhbnNpdGlvbmluZyA9IGZhbHNlOwoJCQl0cmFuc2l0aW9uVGltZSA9IDA7CgkJCXRyYW5zaXRpb25TdGFydCA9IG51bGw7CgkJCXRyYW5zaXRpb25FbmQgPSBudWxsOwoJCQljdXJTdGVwID0gMDsKCgkJCWlmICh0cmFuc2l0aW9uQ29tcGxldGVDYWxsYmFjayAhPSBudWxsKSB7CgkJCQl0cmFuc2l0aW9uQ29tcGxldGVDYWxsYmFjaygpOwoJCQl9CgkJCXRyYW5zaXRpb25Db21wbGV0ZUNhbGxiYWNrID0gbnVsbDsKCgkJCWJpdHN5LmdyYXBoaWNzTW9kZShiaXRzeS5HRlhfTUFQKTsKCQl9Cgl9CgoJdGhpcy5Jc1RyYW5zaXRpb25BY3RpdmUgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gaXNUcmFuc2l0aW9uaW5nOwoJfQoKCS8vIHRvZG8gOiBzaG91bGQgdGhpcyBiZSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3Rvcj8KCXZhciB0cmFuc2l0aW9uQ29tcGxldGVDYWxsYmFjayA9IG51bGw7Cgl0aGlzLk9uVHJhbnNpdGlvbkNvbXBsZXRlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCQlpZiAoaXNUcmFuc2l0aW9uaW5nKSB7IC8vIFRPRE8gOiBzYWZldHkgY2hlY2sgbmVjZXNzYXJ5PwoJCQl0cmFuc2l0aW9uQ29tcGxldGVDYWxsYmFjayA9IGNhbGxiYWNrOwoJCX0KCX0KCgl2YXIgdHJhbnNpdGlvbkVmZmVjdHMgPSB7fTsKCXZhciBjdXJFZmZlY3QgPSAibm9uZSI7Cgl0aGlzLlJlZ2lzdGVyVHJhbnNpdGlvbkVmZmVjdCA9IGZ1bmN0aW9uKG5hbWUsIGVmZmVjdCkgewoJCXRyYW5zaXRpb25FZmZlY3RzW25hbWVdID0gZWZmZWN0OwoJfQoKCXRoaXMuUmVnaXN0ZXJUcmFuc2l0aW9uRWZmZWN0KCJub25lIiwgewoJCXNob3dQbGF5ZXJTdGFydCA6IGZhbHNlLAoJCXNob3dQbGF5ZXJFbmQgOiBmYWxzZSwKCQlwYWxldHRlRWZmZWN0RnVuYyA6IGZ1bmN0aW9uKCkge30sCgkJcGl4ZWxFZmZlY3RGdW5jIDogZnVuY3Rpb24oKSB7fSwKCX0pOwoKCXRoaXMuUmVnaXN0ZXJUcmFuc2l0aW9uRWZmZWN0KCJmYWRlX3ciLCB7IC8vIFRPRE8gOiBoYXZlIGl0IGxpbmdlciBvbiBmdWxsIHdoaXRlIGJyaWVmbHk/CgkJc2hvd1BsYXllclN0YXJ0IDogZmFsc2UsCgkJc2hvd1BsYXllckVuZCA6IHRydWUsCgkJc3RlcENvdW50IDogNiwKCQlwaXhlbEVmZmVjdEZ1bmMgOiBmdW5jdGlvbihzdGFydCwgZW5kLCBwaXhlbFgsIHBpeGVsWSwgZGVsdGEpIHsKCQkJcmV0dXJuIGRlbHRhIDwgMC41ID8gc3RhcnQuSW1hZ2UuR2V0UGl4ZWwocGl4ZWxYLCBwaXhlbFkpIDogZW5kLkltYWdlLkdldFBpeGVsKHBpeGVsWCwgcGl4ZWxZKTsKCQl9LAoJCXBhbGV0dGVFZmZlY3RGdW5jIDogZnVuY3Rpb24oc3RhcnQsIGVuZCwgZGVsdGEpIHsKCQkJdmFyIGNvbG9ycyA9IFtdOwoKCQkJaWYgKGRlbHRhIDwgMC41KSB7CgkJCQlkZWx0YSA9IGRlbHRhIC8gMC41OwoKCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgc3RhcnQuUGFsZXR0ZS5sZW5ndGg7IGkrKykgewoJCQkJCWNvbG9ycy5wdXNoKGxlcnBDb2xvcihzdGFydC5QYWxldHRlW2ldLCBbMjU1LCAyNTUsIDI1NV0sIGRlbHRhKSk7CgkJCQl9CgkJCX0KCQkJZWxzZSB7CgkJCQlkZWx0YSA9ICgoZGVsdGEgLSAwLjUpIC8gMC41KTsKCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGVuZC5QYWxldHRlLmxlbmd0aDsgaSsrKSB7CgkJCQkJY29sb3JzLnB1c2gobGVycENvbG9yKFsyNTUsIDI1NSwgMjU1XSwgZW5kLlBhbGV0dGVbaV0sIGRlbHRhKSk7CgkJCQl9CgkJCX0KCgkJCXJldHVybiBjb2xvcnM7CgkJfSwKCX0pOwoKCXRoaXMuUmVnaXN0ZXJUcmFuc2l0aW9uRWZmZWN0KCJmYWRlX2IiLCB7CgkJc2hvd1BsYXllclN0YXJ0IDogZmFsc2UsCgkJc2hvd1BsYXllckVuZCA6IHRydWUsCgkJc3RlcENvdW50IDogNiwKCQlwaXhlbEVmZmVjdEZ1bmMgOiBmdW5jdGlvbihzdGFydCwgZW5kLCBwaXhlbFgsIHBpeGVsWSwgZGVsdGEpIHsKCQkJcmV0dXJuIGRlbHRhIDwgMC41ID8gc3RhcnQuSW1hZ2UuR2V0UGl4ZWwocGl4ZWxYLCBwaXhlbFkpIDogZW5kLkltYWdlLkdldFBpeGVsKHBpeGVsWCwgcGl4ZWxZKTsKCQl9LAoJCXBhbGV0dGVFZmZlY3RGdW5jIDogZnVuY3Rpb24oc3RhcnQsIGVuZCwgZGVsdGEpIHsKCQkJdmFyIGNvbG9ycyA9IFtdOwoKCQkJaWYgKGRlbHRhIDwgMC41KSB7CgkJCQlkZWx0YSA9IGRlbHRhIC8gMC41OwoKCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgc3RhcnQuUGFsZXR0ZS5sZW5ndGg7IGkrKykgewoJCQkJCWNvbG9ycy5wdXNoKGxlcnBDb2xvcihzdGFydC5QYWxldHRlW2ldLCBbMCwgMCwgMF0sIGRlbHRhKSk7CgkJCQl9CgkJCX0KCQkJZWxzZSB7CgkJCQlkZWx0YSA9ICgoZGVsdGEgLSAwLjUpIC8gMC41KTsKCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGVuZC5QYWxldHRlLmxlbmd0aDsgaSsrKSB7CgkJCQkJY29sb3JzLnB1c2gobGVycENvbG9yKFswLCAwLCAwXSwgZW5kLlBhbGV0dGVbaV0sIGRlbHRhKSk7CgkJCQl9CgkJCX0KCgkJCXJldHVybiBjb2xvcnM7CgkJfSwKCX0pOwoKCXRoaXMuUmVnaXN0ZXJUcmFuc2l0aW9uRWZmZWN0KCJ3YXZlIiwgewoJCXNob3dQbGF5ZXJTdGFydCA6IHRydWUsCgkJc2hvd1BsYXllckVuZCA6IHRydWUsCgkJc3RlcENvdW50IDogMTIsCgkJcGl4ZWxFZmZlY3RGdW5jIDogZnVuY3Rpb24oc3RhcnQsIGVuZCwgcGl4ZWxYLCBwaXhlbFksIGRlbHRhKSB7CgkJCXZhciB3YXZlRGVsdGEgPSBkZWx0YSA8IDAuNSA/IGRlbHRhIC8gMC41IDogMSAtICgoZGVsdGEgLSAwLjUpIC8gMC41KTsKCgkJCXZhciBvZmZzZXQgPSAocGl4ZWxZICsgKHdhdmVEZWx0YSAqIHdhdmVEZWx0YSAqIDAuMiAqIHN0YXJ0LkltYWdlLkhlaWdodCkpOwoJCQl2YXIgZnJlcSA9IDQ7CgkJCXZhciBzaXplID0gMiArICgxNCAqIHdhdmVEZWx0YSk7CgkJCXBpeGVsWCArPSBNYXRoLmZsb29yKE1hdGguc2luKG9mZnNldCAvIGZyZXEpICogc2l6ZSk7CgoJCQlpZiAocGl4ZWxYIDwgMCkgewoJCQkJcGl4ZWxYICs9IHN0YXJ0LkltYWdlLldpZHRoOwoJCQl9CgkJCWVsc2UgaWYgKHBpeGVsWCA+PSBzdGFydC5JbWFnZS5XaWR0aCkgewoJCQkJcGl4ZWxYIC09IHN0YXJ0LkltYWdlLldpZHRoOwoJCQl9CgoJCQl2YXIgY3VySW1hZ2UgPSBkZWx0YSA8IDAuNSA/IHN0YXJ0LkltYWdlIDogZW5kLkltYWdlOwoJCQlyZXR1cm4gY3VySW1hZ2UuR2V0UGl4ZWwocGl4ZWxYLCBwaXhlbFkpOwoJCX0sCgkJcGFsZXR0ZUVmZmVjdEZ1bmMgOiBmdW5jdGlvbihzdGFydCwgZW5kLCBkZWx0YSkgewoJCQlyZXR1cm4gZGVsdGEgPCAwLjUgPyBzdGFydC5QYWxldHRlIDogZW5kLlBhbGV0dGU7CgkJfSwKCX0pOwoKCXRoaXMuUmVnaXN0ZXJUcmFuc2l0aW9uRWZmZWN0KCJ0dW5uZWwiLCB7CgkJc2hvd1BsYXllclN0YXJ0IDogdHJ1ZSwKCQlzaG93UGxheWVyRW5kIDogdHJ1ZSwKCQlzdGVwQ291bnQgOiAxMiwKCQlwaXhlbEVmZmVjdEZ1bmMgOiBmdW5jdGlvbihzdGFydCwgZW5kLCBwaXhlbFgsIHBpeGVsWSwgZGVsdGEpIHsKCQkJaWYgKGRlbHRhIDw9IDAuNCkgewoJCQkJdmFyIHR1bm5lbERlbHRhID0gMSAtIChkZWx0YSAvIDAuNCk7CgoJCQkJdmFyIHhEaXN0ID0gc3RhcnQuUGxheWVyQ2VudGVyLnggLSBwaXhlbFg7CgkJCQl2YXIgeURpc3QgPSBzdGFydC5QbGF5ZXJDZW50ZXIueSAtIHBpeGVsWTsKCQkJCXZhciBkaXN0ID0gTWF0aC5zcXJ0KCh4RGlzdCAqIHhEaXN0KSArICh5RGlzdCAqIHlEaXN0KSk7CgoJCQkJaWYgKGRpc3QgPiBzdGFydC5JbWFnZS5XaWR0aCAqIHR1bm5lbERlbHRhKSB7CgkJCQkJcmV0dXJuIDA7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlyZXR1cm4gc3RhcnQuSW1hZ2UuR2V0UGl4ZWwocGl4ZWxYLCBwaXhlbFkpOwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYgKGRlbHRhIDw9IDAuNikgewoJCQkJcmV0dXJuIDA7CgkJCX0KCQkJZWxzZSB7CgkJCQl2YXIgdHVubmVsRGVsdGEgPSAoZGVsdGEgLSAwLjYpIC8gMC40OwoKCQkJCXZhciB4RGlzdCA9IGVuZC5QbGF5ZXJDZW50ZXIueCAtIHBpeGVsWDsKCQkJCXZhciB5RGlzdCA9IGVuZC5QbGF5ZXJDZW50ZXIueSAtIHBpeGVsWTsKCQkJCXZhciBkaXN0ID0gTWF0aC5zcXJ0KCh4RGlzdCAqIHhEaXN0KSArICh5RGlzdCAqIHlEaXN0KSk7CgoJCQkJaWYgKGRpc3QgPiBlbmQuSW1hZ2UuV2lkdGggKiB0dW5uZWxEZWx0YSkgewoJCQkJCXJldHVybiAwOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJcmV0dXJuIGVuZC5JbWFnZS5HZXRQaXhlbChwaXhlbFgsIHBpeGVsWSk7CgkJCQl9CgkJCX0KCQl9LAoJCXBhbGV0dGVFZmZlY3RGdW5jIDogZnVuY3Rpb24oc3RhcnQsIGVuZCwgZGVsdGEpIHsKCQkJcmV0dXJuIGRlbHRhIDwgMC41ID8gc3RhcnQuUGFsZXR0ZSA6IGVuZC5QYWxldHRlOwoJCX0sCgl9KTsKCglmdW5jdGlvbiBsZXJwUGFsZXR0ZXMoc3RhcnQsIGVuZCwgZGVsdGEpIHsKCQl2YXIgY29sb3JzID0gW107CgoJCXZhciBtYXhMZW5ndGggPSAoc3RhcnQuUGFsZXR0ZS5sZW5ndGggPiBlbmQuUGFsZXR0ZS5sZW5ndGgpID8KCQkJc3RhcnQuUGFsZXR0ZS5sZW5ndGggOiBlbmQuUGFsZXR0ZS5sZW5ndGg7CgoJCWZvciAodmFyIGkgPSAwOyBpIDwgbWF4TGVuZ3RoOyBpKyspIHsKCQkJaWYgKGkgPCBzdGFydC5QYWxldHRlLmxlbmd0aCAmJiBpIDwgZW5kLlBhbGV0dGUubGVuZ3RoKSB7CgkJCQljb2xvcnMucHVzaChsZXJwQ29sb3Ioc3RhcnQuUGFsZXR0ZVtpXSwgZW5kLlBhbGV0dGVbaV0sIGRlbHRhKSk7CgkJCX0KCQkJZWxzZSBpZiAoaSA8IHN0YXJ0LlBhbGV0dGUubGVuZ3RoKSB7CgkJCQljb2xvcnMucHVzaChsZXJwQ29sb3IoCgkJCQkJc3RhcnQuUGFsZXR0ZVtpXSwKCQkJCQllbmQuUGFsZXR0ZVtlbmQuUGFsZXR0ZS5sZW5ndGggLSAxXSwKCQkJCQlkZWx0YSkpOwoJCQl9CgkJCWVsc2UgaWYgKGkgPCBlbmQuUGFsZXR0ZS5sZW5ndGgpIHsKCQkJCWNvbG9ycy5wdXNoKGxlcnBDb2xvcigKCQkJCQlzdGFydC5QYWxldHRlW3N0YXJ0LlBhbGV0dGUubGVuZ3RoIC0gMV0sCgkJCQkJZW5kLlBhbGV0dGVbaV0sCgkJCQkJZGVsdGEpKTsKCQkJfQoJCX0KCgkJcmV0dXJuIGNvbG9yczsKCX0KCgl0aGlzLlJlZ2lzdGVyVHJhbnNpdGlvbkVmZmVjdCgic2xpZGVfdSIsIHsKCQlzaG93UGxheWVyU3RhcnQgOiBmYWxzZSwKCQlzaG93UGxheWVyRW5kIDogdHJ1ZSwKCQlzdGVwQ291bnQgOiA4LAoJCXBpeGVsRWZmZWN0RnVuYyA6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHBpeGVsWCwgcGl4ZWxZLCBkZWx0YSkgewoJCQl2YXIgcGl4ZWxPZmZzZXQgPSAtMSAqIE1hdGguZmxvb3Ioc3RhcnQuSW1hZ2UuSGVpZ2h0ICogZGVsdGEpOwoJCQl2YXIgc2xpZGVQaXhlbFkgPSBwaXhlbFkgKyBwaXhlbE9mZnNldDsKCgkJCWlmIChzbGlkZVBpeGVsWSA+PSAwKSB7CgkJCQlyZXR1cm4gc3RhcnQuSW1hZ2UuR2V0UGl4ZWwocGl4ZWxYLCBzbGlkZVBpeGVsWSk7CgkJCX0KCQkJZWxzZSB7CgkJCQlzbGlkZVBpeGVsWSArPSBzdGFydC5JbWFnZS5IZWlnaHQ7CgkJCQlyZXR1cm4gZW5kLkltYWdlLkdldFBpeGVsKHBpeGVsWCwgc2xpZGVQaXhlbFkpOwoJCQl9CgkJfSwKCQlwYWxldHRlRWZmZWN0RnVuYyA6IGxlcnBQYWxldHRlcywKCX0pOwoKCXRoaXMuUmVnaXN0ZXJUcmFuc2l0aW9uRWZmZWN0KCJzbGlkZV9kIiwgewoJCXNob3dQbGF5ZXJTdGFydCA6IGZhbHNlLAoJCXNob3dQbGF5ZXJFbmQgOiB0cnVlLAoJCXN0ZXBDb3VudCA6IDgsCgkJcGl4ZWxFZmZlY3RGdW5jIDogZnVuY3Rpb24oc3RhcnQsIGVuZCwgcGl4ZWxYLCBwaXhlbFksIGRlbHRhKSB7CgkJCXZhciBwaXhlbE9mZnNldCA9IE1hdGguZmxvb3Ioc3RhcnQuSW1hZ2UuSGVpZ2h0ICogZGVsdGEpOwoJCQl2YXIgc2xpZGVQaXhlbFkgPSBwaXhlbFkgKyBwaXhlbE9mZnNldDsKCgkJCWlmIChzbGlkZVBpeGVsWSA8IHN0YXJ0LkltYWdlLkhlaWdodCkgewoJCQkJcmV0dXJuIHN0YXJ0LkltYWdlLkdldFBpeGVsKHBpeGVsWCwgc2xpZGVQaXhlbFkpOwoJCQl9CgkJCWVsc2UgewoJCQkJc2xpZGVQaXhlbFkgLT0gc3RhcnQuSW1hZ2UuSGVpZ2h0OwoJCQkJcmV0dXJuIGVuZC5JbWFnZS5HZXRQaXhlbChwaXhlbFgsIHNsaWRlUGl4ZWxZKTsKCQkJfQoJCX0sCgkJcGFsZXR0ZUVmZmVjdEZ1bmMgOiBsZXJwUGFsZXR0ZXMsCgl9KTsKCgl0aGlzLlJlZ2lzdGVyVHJhbnNpdGlvbkVmZmVjdCgic2xpZGVfbCIsIHsKCQlzaG93UGxheWVyU3RhcnQgOiBmYWxzZSwKCQlzaG93UGxheWVyRW5kIDogdHJ1ZSwKCQlzdGVwQ291bnQgOiA4LAoJCXBpeGVsRWZmZWN0RnVuYyA6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHBpeGVsWCwgcGl4ZWxZLCBkZWx0YSkgewoJCQl2YXIgcGl4ZWxPZmZzZXQgPSAtMSAqIE1hdGguZmxvb3Ioc3RhcnQuSW1hZ2UuV2lkdGggKiBkZWx0YSk7CgkJCXZhciBzbGlkZVBpeGVsWCA9IHBpeGVsWCArIHBpeGVsT2Zmc2V0OwoKCQkJaWYgKHNsaWRlUGl4ZWxYID49IDApIHsKCQkJCXJldHVybiBzdGFydC5JbWFnZS5HZXRQaXhlbChzbGlkZVBpeGVsWCwgcGl4ZWxZKTsKCQkJfQoJCQllbHNlIHsKCQkJCXNsaWRlUGl4ZWxYICs9IHN0YXJ0LkltYWdlLldpZHRoOwoJCQkJcmV0dXJuIGVuZC5JbWFnZS5HZXRQaXhlbChzbGlkZVBpeGVsWCwgcGl4ZWxZKTsKCQkJfQoJCX0sCgkJcGFsZXR0ZUVmZmVjdEZ1bmMgOiBsZXJwUGFsZXR0ZXMsCgl9KTsKCgl0aGlzLlJlZ2lzdGVyVHJhbnNpdGlvbkVmZmVjdCgic2xpZGVfciIsIHsKCQlzaG93UGxheWVyU3RhcnQgOiBmYWxzZSwKCQlzaG93UGxheWVyRW5kIDogdHJ1ZSwKCQlzdGVwQ291bnQgOiA4LAoJCXBpeGVsRWZmZWN0RnVuYyA6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHBpeGVsWCwgcGl4ZWxZLCBkZWx0YSkgewoJCQl2YXIgcGl4ZWxPZmZzZXQgPSBNYXRoLmZsb29yKHN0YXJ0LkltYWdlLldpZHRoICogZGVsdGEpOwoJCQl2YXIgc2xpZGVQaXhlbFggPSBwaXhlbFggKyBwaXhlbE9mZnNldDsKCgkJCWlmIChzbGlkZVBpeGVsWCA8IHN0YXJ0LkltYWdlLldpZHRoKSB7CgkJCQlyZXR1cm4gc3RhcnQuSW1hZ2UuR2V0UGl4ZWwoc2xpZGVQaXhlbFgsIHBpeGVsWSk7CgkJCX0KCQkJZWxzZSB7CgkJCQlzbGlkZVBpeGVsWCAtPSBzdGFydC5JbWFnZS5XaWR0aDsKCQkJCXJldHVybiBlbmQuSW1hZ2UuR2V0UGl4ZWwoc2xpZGVQaXhlbFgsIHBpeGVsWSk7CgkJCX0KCQl9LAoJCXBhbGV0dGVFZmZlY3RGdW5jIDogbGVycFBhbGV0dGVzLAoJfSk7CgoJLy8gdG9kbyA6IG1vdmUgdG8gUmVuZGVyZXIoKT8KCWZ1bmN0aW9uIGNyZWF0ZVJvb21QaXhlbEJ1ZmZlcihyb29tKSB7CgkJdmFyIHBpeGVsQnVmZmVyID0gW107CgoJCWZvciAodmFyIGkgPSAwOyBpIDwgYml0c3kuVklERU9fU0laRSAqIGJpdHN5LlZJREVPX1NJWkU7IGkrKykgewoJCQlwaXhlbEJ1ZmZlci5wdXNoKHRpbGVDb2xvclN0YXJ0SW5kZXgpOwoJCX0KCgkJdmFyIGRyYXdUaWxlSW5QaXhlbEJ1ZmZlciA9IGZ1bmN0aW9uKHNvdXJjZURhdGEsIGZyYW1lSW5kZXgsIGNvbG9ySW5kZXgsIHR4LCB0eSwgcGl4ZWxCdWZmZXIpIHsKCQkJdmFyIGZyYW1lRGF0YSA9IHNvdXJjZURhdGFbZnJhbWVJbmRleF07CgoJCQlmb3IgKHZhciB5ID0gMDsgeSA8IGJpdHN5LlRJTEVfU0laRTsgeSsrKSB7CgkJCQlmb3IgKHZhciB4ID0gMDsgeCA8IGJpdHN5LlRJTEVfU0laRTsgeCsrKSB7CgkJCQkJdmFyIGNvbG9yID0gdGlsZUNvbG9yU3RhcnRJbmRleCArIChmcmFtZURhdGFbeV1beF0gPT09IDEgPyBjb2xvckluZGV4IDogMCk7CgkJCQkJcGl4ZWxCdWZmZXJbKCgodHkgKiBiaXRzeS5USUxFX1NJWkUpICsgeSkgKiBiaXRzeS5WSURFT19TSVpFKSArICgodHggKiBiaXRzeS5USUxFX1NJWkUpICsgeCldID0gY29sb3I7CgkJCQl9CgkJCX0KCQl9CgoJCS8vZHJhdyB0aWxlcwoJCWZvciAoaSBpbiByb29tLnRpbGVtYXApIHsKCQkJZm9yIChqIGluIHJvb20udGlsZW1hcFtpXSkgewoJCQkJdmFyIGlkID0gcm9vbS50aWxlbWFwW2ldW2pdOwoJCQkJdmFyIHggPSBwYXJzZUludChqKTsKCQkJCXZhciB5ID0gcGFyc2VJbnQoaSk7CgoJCQkJaWYgKGlkICE9ICIwIiAmJiB0aWxlW2lkXSAhPSBudWxsKSB7CgkJCQkJZHJhd1RpbGVJblBpeGVsQnVmZmVyKAoJCQkJCQlyZW5kZXJlci5HZXREcmF3aW5nU291cmNlKHRpbGVbaWRdLmRydyksCgkJCQkJCXRpbGVbaWRdLmFuaW1hdGlvbi5mcmFtZUluZGV4LAoJCQkJCQl0aWxlW2lkXS5jb2wsCgkJCQkJCXgsCgkJCQkJCXksCgkJCQkJCXBpeGVsQnVmZmVyKTsKCQkJCX0KCQkJfQoJCX0KCgkJLy9kcmF3IGl0ZW1zCgkJZm9yICh2YXIgaSA9IDA7IGkgPCByb29tLml0ZW1zLmxlbmd0aDsgaSsrKSB7CgkJCXZhciBpdG0gPSByb29tLml0ZW1zW2ldOwoJCQlkcmF3VGlsZUluUGl4ZWxCdWZmZXIoCgkJCQlyZW5kZXJlci5HZXREcmF3aW5nU291cmNlKGl0ZW1baXRtLmlkXS5kcncpLAoJCQkJaXRlbVtpdG0uaWRdLmFuaW1hdGlvbi5mcmFtZUluZGV4LAoJCQkJaXRlbVtpdG0uaWRdLmNvbCwKCQkJCWl0bS54LAoJCQkJaXRtLnksCgkJCQlwaXhlbEJ1ZmZlcik7CgkJfQoKCQkvL2RyYXcgc3ByaXRlcwoJCWZvciAoaWQgaW4gc3ByaXRlKSB7CgkJCXZhciBzcHIgPSBzcHJpdGVbaWRdOwoJCQlpZiAoc3ByLnJvb20gPT09IHJvb20uaWQpIHsKCQkJCWRyYXdUaWxlSW5QaXhlbEJ1ZmZlcigKCQkJCQlyZW5kZXJlci5HZXREcmF3aW5nU291cmNlKHNwci5kcncpLAoJCQkJCXNwci5hbmltYXRpb24uZnJhbWVJbmRleCwKCQkJCQlzcHIuY29sLAoJCQkJCXNwci54LAoJCQkJCXNwci55LAoJCQkJCXBpeGVsQnVmZmVyKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHBpeGVsQnVmZmVyOwoJfQoKCWZ1bmN0aW9uIGxlcnBDb2xvcihjb2xvckEsIGNvbG9yQiwgdCkgewoJCXJldHVybiBbCgkJCWNvbG9yQVswXSArICgoY29sb3JCWzBdIC0gY29sb3JBWzBdKSAqIHQpLAoJCQljb2xvckFbMV0gKyAoKGNvbG9yQlsxXSAtIGNvbG9yQVsxXSkgKiB0KSwKCQkJY29sb3JBWzJdICsgKChjb2xvckJbMl0gLSBjb2xvckFbMl0pICogdCksCgkJXTsKCX07Cn07IC8vIFRyYW5zaXRpb25NYW5hZ2VyKCkKCi8vIHRvZG8gOiBpcyB0aGlzIHdyYXBwZXIgc3RpbGwgdXNlZnVsPwp2YXIgUG9zdFByb2Nlc3NJbWFnZSA9IGZ1bmN0aW9uKGltYWdlRGF0YSkgewoJdGhpcy5XaWR0aCA9IGJpdHN5LlZJREVPX1NJWkU7Cgl0aGlzLkhlaWdodCA9IGJpdHN5LlZJREVPX1NJWkU7CgoJdGhpcy5HZXRQaXhlbCA9IGZ1bmN0aW9uKHgsIHkpIHsKCQlyZXR1cm4gaW1hZ2VEYXRhWyh5ICogYml0c3kuVklERU9fU0laRSkgKyB4XTsKCX07CgoJdGhpcy5HZXREYXRhID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGltYWdlRGF0YTsKCX07Cn07Cgp2YXIgVHJhbnNpdGlvbkluZm8gPSBmdW5jdGlvbihpbWFnZSwgcGFsZXR0ZSwgcGxheWVyWCwgcGxheWVyWSkgewoJdGhpcy5JbWFnZSA9IGltYWdlOwoKCXRoaXMuUGFsZXR0ZSA9IHBhbGV0dGU7CgoJdGhpcy5QbGF5ZXJUaWxlUG9zID0gewoJCXg6IHBsYXllclgsCgkJeTogcGxheWVyWQoJfTsKCgl0aGlzLlBsYXllckNlbnRlciA9IHsKCQl4OiBNYXRoLmZsb29yKChwbGF5ZXJYICogYml0c3kuVElMRV9TSVpFKSArIChiaXRzeS5USUxFX1NJWkUgLyAyKSksCgkJeTogTWF0aC5mbG9vcigocGxheWVyWSAqIGJpdHN5LlRJTEVfU0laRSkgKyAoYml0c3kuVElMRV9TSVpFIC8gMikpCgl9Owp9Owo8L3NjcmlwdD4KCjxzY3JpcHQ+CmZ1bmN0aW9uIFNjcmlwdCgpIHsKCnRoaXMuQ3JlYXRlSW50ZXJwcmV0ZXIgPSBmdW5jdGlvbigpIHsKCXJldHVybiBuZXcgSW50ZXJwcmV0ZXIoKTsKfTsKCnRoaXMuQ3JlYXRlVXRpbHMgPSBmdW5jdGlvbigpIHsKCXJldHVybiBuZXcgVXRpbHMoKTsKfTsKCnZhciBJbnRlcnByZXRlciA9IGZ1bmN0aW9uKCkgewoJdmFyIGVudiA9IG5ldyBFbnZpcm9ubWVudCgpOwoJdmFyIHBhcnNlciA9IG5ldyBQYXJzZXIoIGVudiApOwoKCXRoaXMuU2V0RGlhbG9nQnVmZmVyID0gZnVuY3Rpb24oYnVmZmVyKSB7IGVudi5TZXREaWFsb2dCdWZmZXIoIGJ1ZmZlciApOyB9OwoKCS8vIFRPRE8gLS0gbWF5YmUgdGhpcyBzaG91bGQgcmV0dXJuIGEgc3RyaW5nIGluc3RlYWQgb3RoZSBhY3R1YWwgc2NyaXB0Pz8KCXRoaXMuQ29tcGlsZSA9IGZ1bmN0aW9uKHNjcmlwdE5hbWUsIHNjcmlwdFN0cikgewoJCXZhciBzY3JpcHQgPSBwYXJzZXIuUGFyc2Uoc2NyaXB0U3RyLCBzY3JpcHROYW1lKTsKCQllbnYuU2V0U2NyaXB0KHNjcmlwdE5hbWUsIHNjcmlwdCk7Cgl9Cgl0aGlzLlJ1biA9IGZ1bmN0aW9uKHNjcmlwdE5hbWUsIGV4aXRIYW5kbGVyLCBvYmplY3RDb250ZXh0KSB7IC8vIFJ1bnMgcHJlLWNvbXBpbGVkIHNjcmlwdAoJCXZhciBsb2NhbEVudiA9IG5ldyBMb2NhbEVudmlyb25tZW50KGVudik7CgoJCWlmIChvYmplY3RDb250ZXh0KSB7CgkJCWxvY2FsRW52LlNldE9iamVjdChvYmplY3RDb250ZXh0KTsgLy8gUFJPVE8gOiBzaG91bGQgdGhpcyBiZSBmb2xkZWQgaW50byB0aGUgY29uc3RydWN0b3I/CgkJfQoKCQl2YXIgc2NyaXB0ID0gZW52LkdldFNjcmlwdChzY3JpcHROYW1lKTsKCgkJc2NyaXB0LkV2YWwoIGxvY2FsRW52LCBmdW5jdGlvbihyZXN1bHQpIHsgT25TY3JpcHRSZXR1cm4obG9jYWxFbnYsIGV4aXRIYW5kbGVyKTsgfSApOwoJfQoJdGhpcy5JbnRlcnByZXQgPSBmdW5jdGlvbihzY3JpcHRTdHIsIGV4aXRIYW5kbGVyLCBvYmplY3RDb250ZXh0KSB7IC8vIENvbXBpbGVzIGFuZCBydW5zIGNvZGUgaW1tZWRpYXRlbHkKCQkvLyBiaXRzeS5sb2coIklOVEVSUFJFVCIpOwoJCXZhciBsb2NhbEVudiA9IG5ldyBMb2NhbEVudmlyb25tZW50KGVudik7CgoJCWlmIChvYmplY3RDb250ZXh0KSB7CgkJCWxvY2FsRW52LlNldE9iamVjdChvYmplY3RDb250ZXh0KTsgLy8gUFJPVE8gOiBzaG91bGQgdGhpcyBiZSBmb2xkZWQgaW50byB0aGUgY29uc3RydWN0b3I/CgkJfQoKCQl2YXIgc2NyaXB0ID0gcGFyc2VyLlBhcnNlKHNjcmlwdFN0ciwgImFub255bW91cyIpOwoJCXNjcmlwdC5FdmFsKCBsb2NhbEVudiwgZnVuY3Rpb24ocmVzdWx0KSB7IE9uU2NyaXB0UmV0dXJuKGxvY2FsRW52LCBleGl0SGFuZGxlcik7IH0gKTsKCX0KCXRoaXMuSGFzU2NyaXB0ID0gZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gZW52Lkhhc1NjcmlwdChuYW1lKTsgfTsKCgl0aGlzLlJlc2V0RW52aXJvbm1lbnQgPSBmdW5jdGlvbigpIHsKCQllbnYgPSBuZXcgRW52aXJvbm1lbnQoKTsKCQlwYXJzZXIgPSBuZXcgUGFyc2VyKCBlbnYgKTsKCX0KCgl0aGlzLlBhcnNlID0gZnVuY3Rpb24oc2NyaXB0U3RyLCByb290SWQpIHsgLy8gcGFyc2VzIGEgc2NyaXB0IGJ1dCBkb2Vzbid0IHNhdmUgaXQKCQlyZXR1cm4gcGFyc2VyLlBhcnNlKHNjcmlwdFN0ciwgcm9vdElkKTsKCX0KCgl0aGlzLkV2YWwgPSBmdW5jdGlvbihzY3JpcHRUcmVlLCBleGl0SGFuZGxlcikgeyAvLyBydW5zIGEgc2NyaXB0IHN0b3JlZCBleHRlcm5hbGx5CgkJdmFyIGxvY2FsRW52ID0gbmV3IExvY2FsRW52aXJvbm1lbnQoZW52KTsgLy8gVE9ETyA6IGRvZXMgdGhpcyBuZWVkIGFuIG9iamVjdCBjb250ZXh0PwoJCXNjcmlwdFRyZWUuRXZhbCgKCQkJbG9jYWxFbnYsCgkJCWZ1bmN0aW9uKHJlc3VsdCkgewoJCQkJT25TY3JpcHRSZXR1cm4ocmVzdWx0LCBleGl0SGFuZGxlcik7CgkJCX0pOwoJfQoKCWZ1bmN0aW9uIE9uU2NyaXB0UmV0dXJuKHJlc3VsdCwgZXhpdEhhbmRsZXIpIHsKCQlpZiAoZXhpdEhhbmRsZXIgIT0gbnVsbCkgewoJCQlleGl0SGFuZGxlcihyZXN1bHQpOwoJCX0KCX0KCgl0aGlzLkNyZWF0ZUV4cHJlc3Npb24gPSBmdW5jdGlvbihleHBTdHIpIHsKCQlyZXR1cm4gcGFyc2VyLkNyZWF0ZUV4cHJlc3Npb24oZXhwU3RyKTsKCX0KCgl0aGlzLlNldFZhcmlhYmxlID0gZnVuY3Rpb24obmFtZSx2YWx1ZSx1c2VIYW5kbGVyKSB7CgkJZW52LlNldFZhcmlhYmxlKG5hbWUsdmFsdWUsdXNlSGFuZGxlcik7Cgl9CgoJdGhpcy5EZWxldGVWYXJpYWJsZSA9IGZ1bmN0aW9uKG5hbWUsdXNlSGFuZGxlcikgewoJCWVudi5EZWxldGVWYXJpYWJsZShuYW1lLHVzZUhhbmRsZXIpOwoJfQoJdGhpcy5IYXNWYXJpYWJsZSA9IGZ1bmN0aW9uKG5hbWUpIHsKCQlyZXR1cm4gZW52Lkhhc1ZhcmlhYmxlKG5hbWUpOwoJfQoKCXRoaXMuU2V0T25WYXJpYWJsZUNoYW5nZUhhbmRsZXIgPSBmdW5jdGlvbihvblZhcmlhYmxlQ2hhbmdlKSB7CgkJZW52LlNldE9uVmFyaWFibGVDaGFuZ2VIYW5kbGVyKG9uVmFyaWFibGVDaGFuZ2UpOwoJfQoJdGhpcy5HZXRWYXJpYWJsZU5hbWVzID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGVudi5HZXRWYXJpYWJsZU5hbWVzKCk7Cgl9Cgl0aGlzLkdldFZhcmlhYmxlID0gZnVuY3Rpb24obmFtZSkgewoJCXJldHVybiBlbnYuR2V0VmFyaWFibGUobmFtZSk7Cgl9CgoJZnVuY3Rpb24gRGVidWdWaXN1YWxpemVTY3JpcHRUcmVlKHNjcmlwdFRyZWUpIHsKCQl2YXIgcHJpbnRWaXNpdG9yID0gewoJCQlWaXNpdCA6IGZ1bmN0aW9uKG5vZGUsZGVwdGgpIHsKCQkJCWJpdHN5LmxvZygiLSIucmVwZWF0KGRlcHRoKSArICItICIgKyBub2RlLlRvU3RyaW5nKCkpOwoJCQl9LAoJCX07CgoJCXNjcmlwdFRyZWUuVmlzaXRBbGwoIHByaW50VmlzaXRvciApOwoJfQoKCXRoaXMuRGVidWdWaXN1YWxpemVTY3JpcHRUcmVlID0gRGVidWdWaXN1YWxpemVTY3JpcHRUcmVlOwoKCXRoaXMuRGVidWdWaXN1YWxpemVTY3JpcHQgPSBmdW5jdGlvbihzY3JpcHROYW1lKSB7CgkJRGVidWdWaXN1YWxpemVTY3JpcHRUcmVlKGVudi5HZXRTY3JpcHQoc2NyaXB0TmFtZSkpOwoJfQp9CgoKdmFyIFV0aWxzID0gZnVuY3Rpb24oKSB7CgkvLyBmb3IgZWRpdG9yIHVpCgl0aGlzLkNyZWF0ZURpYWxvZ0Jsb2NrID0gZnVuY3Rpb24oY2hpbGRyZW4sZG9JbmRlbnRGaXJzdExpbmUpIHsKCQlpZiAoZG9JbmRlbnRGaXJzdExpbmUgPT09IHVuZGVmaW5lZCkgewoJCQlkb0luZGVudEZpcnN0TGluZSA9IHRydWU7CgkJfQoKCQl2YXIgYmxvY2sgPSBuZXcgRGlhbG9nQmxvY2tOb2RlKGRvSW5kZW50Rmlyc3RMaW5lKTsKCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewoJCQlibG9jay5BZGRDaGlsZChjaGlsZHJlbltpXSk7CgkJfQoJCXJldHVybiBibG9jazsKCX0KCgl0aGlzLkNyZWF0ZU9wdGlvbkJsb2NrID0gZnVuY3Rpb24oKSB7CgkJdmFyIGJsb2NrID0gbmV3IERpYWxvZ0Jsb2NrTm9kZShmYWxzZSk7CgkJYmxvY2suQWRkQ2hpbGQobmV3IEZ1bmNOb2RlKCJzYXkiLCBbbmV3IExpdGVyYWxOb2RlKCIgIildKSk7CgkJcmV0dXJuIGJsb2NrOwoJfQoKCXRoaXMuQ3JlYXRlSXRlbUNvbmRpdGlvblBhaXIgPSBmdW5jdGlvbigpIHsKCQl2YXIgaXRlbUZ1bmMgPSB0aGlzLkNyZWF0ZUZ1bmN0aW9uQmxvY2soIml0ZW0iLCBbIjAiXSk7CgkJdmFyIGNvbmRpdGlvbiA9IG5ldyBFeHBOb2RlKCI9PSIsIGl0ZW1GdW5jLCBuZXcgTGl0ZXJhbE5vZGUoMSkpOwoJCXZhciByZXN1bHQgPSBuZXcgRGlhbG9nQmxvY2tOb2RlKHRydWUpOwoJCXJlc3VsdC5BZGRDaGlsZChuZXcgRnVuY05vZGUoInNheSIsIFtuZXcgTGl0ZXJhbE5vZGUoIiAiKV0pKTsKCQl2YXIgY29uZGl0aW9uUGFpciA9IG5ldyBDb25kaXRpb25QYWlyTm9kZShjb25kaXRpb24sIHJlc3VsdCk7CgkJcmV0dXJuIGNvbmRpdGlvblBhaXI7Cgl9CgoJdGhpcy5DcmVhdGVWYXJpYWJsZUNvbmRpdGlvblBhaXIgPSBmdW5jdGlvbigpIHsKCQl2YXIgdmFyTm9kZSA9IHRoaXMuQ3JlYXRlVmFyaWFibGVOb2RlKCJhIik7CgkJdmFyIGNvbmRpdGlvbiA9IG5ldyBFeHBOb2RlKCI9PSIsIHZhck5vZGUsIG5ldyBMaXRlcmFsTm9kZSgxKSk7CgkJdmFyIHJlc3VsdCA9IG5ldyBEaWFsb2dCbG9ja05vZGUodHJ1ZSk7CgkJcmVzdWx0LkFkZENoaWxkKG5ldyBGdW5jTm9kZSgic2F5IiwgW25ldyBMaXRlcmFsTm9kZSgiICIpXSkpOwoJCXZhciBjb25kaXRpb25QYWlyID0gbmV3IENvbmRpdGlvblBhaXJOb2RlKGNvbmRpdGlvbiwgcmVzdWx0KTsKCQlyZXR1cm4gY29uZGl0aW9uUGFpcjsKCX0KCgl0aGlzLkNyZWF0ZURlZmF1bHRDb25kaXRpb25QYWlyID0gZnVuY3Rpb24oKSB7CgkJdmFyIGNvbmRpdGlvbiA9IHRoaXMuQ3JlYXRlRWxzZU5vZGUoKTsKCQl2YXIgcmVzdWx0ID0gbmV3IERpYWxvZ0Jsb2NrTm9kZSh0cnVlKTsKCQlyZXN1bHQuQWRkQ2hpbGQobmV3IEZ1bmNOb2RlKCJzYXkiLCBbbmV3IExpdGVyYWxOb2RlKCIgIildKSk7CgkJdmFyIGNvbmRpdGlvblBhaXIgPSBuZXcgQ29uZGl0aW9uUGFpck5vZGUoY29uZGl0aW9uLCByZXN1bHQpOwoJCXJldHVybiBjb25kaXRpb25QYWlyOwoJfQoKCXRoaXMuQ3JlYXRlRW1wdHlTYXlGdW5jID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIG5ldyBGdW5jTm9kZSgic2F5IiwgW25ldyBMaXRlcmFsTm9kZSgiLi4uIildKTsKCX0KCgl0aGlzLkNyZWF0ZUZ1bmN0aW9uQmxvY2sgPSBmdW5jdGlvbihuYW1lLCBpbml0UGFyYW1WYWx1ZXMpIHsKCQl2YXIgcGFyYW1ldGVycyA9IFtdOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgaW5pdFBhcmFtVmFsdWVzLmxlbmd0aDsgaSsrKSB7CgkJCXBhcmFtZXRlcnMucHVzaChuZXcgTGl0ZXJhbE5vZGUoaW5pdFBhcmFtVmFsdWVzW2ldKSk7CgkJfQoKCQl2YXIgbm9kZSA9IG5ldyBGdW5jTm9kZShuYW1lLCBwYXJhbWV0ZXJzKTsKCQl2YXIgYmxvY2sgPSBuZXcgQ29kZUJsb2NrTm9kZSgpOwoJCWJsb2NrLkFkZENoaWxkKG5vZGUpOwoJCXJldHVybiBibG9jazsKCX0KCgkvLyBUT0RPIDogcmVuYW1lIFBhcnNlU3RyaW5nVG9MaXRlcmFsTm9kZT8KCXRoaXMuQ3JlYXRlTGl0ZXJhbE5vZGUgPSBmdW5jdGlvbihzdHIpIHsKCQlpZiAoc3RyID09PSAidHJ1ZSIpIHsKCQkJcmV0dXJuIG5ldyBMaXRlcmFsTm9kZSh0cnVlKTsKCQl9CgkJZWxzZSBpZiAoc3RyID09PSAiZmFsc2UiKSB7CgkJCXJldHVybiBuZXcgTGl0ZXJhbE5vZGUoZmFsc2UpOwoJCX0KCQllbHNlIGlmICghaXNOYU4ocGFyc2VGbG9hdChzdHIpKSkgewoJCQlyZXR1cm4gbmV3IExpdGVyYWxOb2RlKHBhcnNlRmxvYXQoc3RyKSk7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gbmV3IExpdGVyYWxOb2RlKHN0cik7CgkJfQoJfQoKCXRoaXMuQ3JlYXRlVmFyaWFibGVOb2RlID0gZnVuY3Rpb24odmFyaWFibGVOYW1lKSB7CgkJcmV0dXJuIG5ldyBWYXJOb2RlKHZhcmlhYmxlTmFtZSk7Cgl9CgoJdGhpcy5DcmVhdGVQcm9wZXJ0eU5vZGUgPSBmdW5jdGlvbihwcm9wZXJ0eU5hbWUsIGxpdGVyYWxWYWx1ZSkgewoJCXZhciB2YXJOb2RlID0gbmV3IFZhck5vZGUocHJvcGVydHlOYW1lKTsKCQl2YXIgdmFsTm9kZSA9IG5ldyBMaXRlcmFsTm9kZShsaXRlcmFsVmFsdWUpOwoJCXZhciBub2RlID0gbmV3IEZ1bmNOb2RlKCJwcm9wZXJ0eSIsIFt2YXJOb2RlLCB2YWxOb2RlXSk7CgkJdmFyIGJsb2NrID0gbmV3IENvZGVCbG9ja05vZGUoKTsKCQlibG9jay5BZGRDaGlsZChub2RlKTsKCQlyZXR1cm4gYmxvY2s7Cgl9CgoJdGhpcy5DcmVhdGVFbHNlTm9kZSA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiBuZXcgRWxzZU5vZGUoKTsKCX0KCgl0aGlzLkNyZWF0ZVN0cmluZ0xpdGVyYWxOb2RlID0gZnVuY3Rpb24oc3RyKSB7CgkJcmV0dXJuIG5ldyBMaXRlcmFsTm9kZShzdHIpOwoJfQoKCS8vIFRPRE8gOiBuZWVkIHRvIHNwbGl0IHVwIGNvZGUgJiBkaWFsb2cgYmxvY2tzIDp8Cgl0aGlzLkNyZWF0ZUNvZGVCbG9jayA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiBuZXcgQ29kZUJsb2NrTm9kZSgpOwoJfQoKCXRoaXMuQ2hhbmdlU2VxdWVuY2VUeXBlID0gZnVuY3Rpb24ob2xkU2VxdWVuY2UsIHR5cGUpIHsKCQlpZih0eXBlID09PSAic2VxdWVuY2UiKSB7CgkJCXJldHVybiBuZXcgU2VxdWVuY2VOb2RlKG9sZFNlcXVlbmNlLmNoaWxkcmVuKTsKCQl9CgkJZWxzZSBpZih0eXBlID09PSAiY3ljbGUiKSB7CgkJCXJldHVybiBuZXcgQ3ljbGVOb2RlKG9sZFNlcXVlbmNlLmNoaWxkcmVuKTsKCQl9CgkJZWxzZSBpZih0eXBlID09PSAic2h1ZmZsZSIpIHsKCQkJcmV0dXJuIG5ldyBTaHVmZmxlTm9kZShvbGRTZXF1ZW5jZS5jaGlsZHJlbik7CgkJfQoJCXJldHVybiBvbGRTZXF1ZW5jZTsKCX0KCgl0aGlzLkNyZWF0ZVNlcXVlbmNlQmxvY2sgPSBmdW5jdGlvbigpIHsKCQl2YXIgb3B0aW9uMSA9IG5ldyBEaWFsb2dCbG9ja05vZGUoIGZhbHNlIC8qZG9JbmRlbnRGaXJzdExpbmUqLyApOwoJCW9wdGlvbjEuQWRkQ2hpbGQobmV3IEZ1bmNOb2RlKCJzYXkiLCBbbmV3IExpdGVyYWxOb2RlKCIuLi4iKV0pKTsKCgkJdmFyIG9wdGlvbjIgPSBuZXcgRGlhbG9nQmxvY2tOb2RlKCBmYWxzZSAvKmRvSW5kZW50Rmlyc3RMaW5lKi8gKTsKCQlvcHRpb24yLkFkZENoaWxkKG5ldyBGdW5jTm9kZSgic2F5IiwgW25ldyBMaXRlcmFsTm9kZSgiLi4uIildKSk7CgoJCXZhciBzZXF1ZW5jZSA9IG5ldyBTZXF1ZW5jZU5vZGUoIFsgb3B0aW9uMSwgb3B0aW9uMiBdICk7CgkJdmFyIGJsb2NrID0gbmV3IENvZGVCbG9ja05vZGUoKTsKCQlibG9jay5BZGRDaGlsZCggc2VxdWVuY2UgKTsKCQlyZXR1cm4gYmxvY2s7Cgl9CgoJdGhpcy5DcmVhdGVDeWNsZUJsb2NrID0gZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbjEgPSBuZXcgRGlhbG9nQmxvY2tOb2RlKCBmYWxzZSAvKmRvSW5kZW50Rmlyc3RMaW5lKi8gKTsKCQlvcHRpb24xLkFkZENoaWxkKG5ldyBGdW5jTm9kZSgic2F5IiwgW25ldyBMaXRlcmFsTm9kZSgiLi4uIildKSk7CgoJCXZhciBvcHRpb24yID0gbmV3IERpYWxvZ0Jsb2NrTm9kZSggZmFsc2UgLypkb0luZGVudEZpcnN0TGluZSovICk7CgkJb3B0aW9uMi5BZGRDaGlsZChuZXcgRnVuY05vZGUoInNheSIsIFtuZXcgTGl0ZXJhbE5vZGUoIi4uLiIpXSkpOwoKCQl2YXIgc2VxdWVuY2UgPSBuZXcgQ3ljbGVOb2RlKCBbIG9wdGlvbjEsIG9wdGlvbjIgXSApOwoJCXZhciBibG9jayA9IG5ldyBDb2RlQmxvY2tOb2RlKCk7CgkJYmxvY2suQWRkQ2hpbGQoIHNlcXVlbmNlICk7CgkJcmV0dXJuIGJsb2NrOwoJfQoKCXRoaXMuQ3JlYXRlU2h1ZmZsZUJsb2NrID0gZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbjEgPSBuZXcgRGlhbG9nQmxvY2tOb2RlKCBmYWxzZSAvKmRvSW5kZW50Rmlyc3RMaW5lKi8gKTsKCQlvcHRpb24xLkFkZENoaWxkKG5ldyBGdW5jTm9kZSgic2F5IiwgW25ldyBMaXRlcmFsTm9kZSgiLi4uIildKSk7CgoJCXZhciBvcHRpb24yID0gbmV3IERpYWxvZ0Jsb2NrTm9kZSggZmFsc2UgLypkb0luZGVudEZpcnN0TGluZSovICk7CgkJb3B0aW9uMi5BZGRDaGlsZChuZXcgRnVuY05vZGUoInNheSIsIFtuZXcgTGl0ZXJhbE5vZGUoIi4uLiIpXSkpOwoKCQl2YXIgc2VxdWVuY2UgPSBuZXcgU2h1ZmZsZU5vZGUoIFsgb3B0aW9uMSwgb3B0aW9uMiBdICk7CgkJdmFyIGJsb2NrID0gbmV3IENvZGVCbG9ja05vZGUoKTsKCQlibG9jay5BZGRDaGlsZCggc2VxdWVuY2UgKTsKCQlyZXR1cm4gYmxvY2s7Cgl9CgoJdGhpcy5DcmVhdGVJZkJsb2NrID0gZnVuY3Rpb24oKSB7CgkJdmFyIGxlZnROb2RlID0gbmV3IENvZGVCbG9ja05vZGUoKTsKCQlsZWZ0Tm9kZS5BZGRDaGlsZCggbmV3IEZ1bmNOb2RlKCJpdGVtIiwgW25ldyBMaXRlcmFsTm9kZSgiMCIpXSApICk7CgkJdmFyIHJpZ2h0Tm9kZSA9IG5ldyBMaXRlcmFsTm9kZSggMSApOwoJCXZhciBjb25kaXRpb24xID0gbmV3IEV4cE5vZGUoIj09IiwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSApOwoKCQl2YXIgY29uZGl0aW9uMiA9IG5ldyBFbHNlTm9kZSgpOwoKCQl2YXIgcmVzdWx0MSA9IG5ldyBEaWFsb2dCbG9ja05vZGUoKTsKCQlyZXN1bHQxLkFkZENoaWxkKG5ldyBGdW5jTm9kZSgic2F5IiwgW25ldyBMaXRlcmFsTm9kZSgiLi4uIildKSk7CgoJCXZhciByZXN1bHQyID0gbmV3IERpYWxvZ0Jsb2NrTm9kZSgpOwoJCXJlc3VsdDIuQWRkQ2hpbGQobmV3IEZ1bmNOb2RlKCJzYXkiLCBbbmV3IExpdGVyYWxOb2RlKCIuLi4iKV0pKTsKCgkJdmFyIGlmTm9kZSA9IG5ldyBJZk5vZGUoIFsgY29uZGl0aW9uMSwgY29uZGl0aW9uMiBdLCBbIHJlc3VsdDEsIHJlc3VsdDIgXSApOwoJCXZhciBibG9jayA9IG5ldyBDb2RlQmxvY2tOb2RlKCk7CgkJYmxvY2suQWRkQ2hpbGQoIGlmTm9kZSApOwoJCXJldHVybiBibG9jazsKCX0KCgl0aGlzLlJlYWREaWFsb2dTY3JpcHQgPSBmdW5jdGlvbihsaW5lcywgaSkgewoJCXZhciBzY3JpcHRTdHIgPSAiIjsKCQlpZiAobGluZXNbaV0gPT09IFN5bS5EaWFsb2dPcGVuKSB7CgkJCXNjcmlwdFN0ciArPSBsaW5lc1tpXSArICJcbiI7CgkJCWkrKzsKCQkJd2hpbGUobGluZXNbaV0gIT0gU3ltLkRpYWxvZ0Nsb3NlKSB7CgkJCQlzY3JpcHRTdHIgKz0gbGluZXNbaV0gKyAiXG4iOwoJCQkJaSsrOwoJCQl9CgkJCXNjcmlwdFN0ciArPSBsaW5lc1tpXTsKCQkJaSsrOwoJCX0KCQllbHNlIHsKCQkJc2NyaXB0U3RyICs9IGxpbmVzW2ldOwoJCQlpKys7CgkJfQoJCXJldHVybiB7IHNjcmlwdDpzY3JpcHRTdHIsIGluZGV4OmkgfTsKCX0KCgkvLyBUT0RPIHRoaXMuUmVhZENvZGVTY3JpcHQgKHJlYWRzIHRocm91Z2ggY29kZSBvcGVuIGFuZCBjbG9zZSBzeW1ib2xzKSwgYW5kIHRoaXMuUmVhZFNjcmlwdAoKCXRoaXMuRW5zdXJlRGlhbG9nQmxvY2tGb3JtYXQgPSBmdW5jdGlvbihkaWFsb2dTdHIpIHsKCQkvLyBUT0RPIC0tIHdoYXQgaWYgaXQncyBhbHJlYWR5IGVuY2xvc2VkIGluIGRpYWxvZyBzeW1ib2xzPz8KCQlpZihkaWFsb2dTdHIuaW5kZXhPZignXG4nKSA+IC0xKSB7CgkJCWRpYWxvZ1N0ciA9IFN5bS5EaWFsb2dPcGVuICsgIlxuIiArIGRpYWxvZ1N0ciArICJcbiIgKyBTeW0uRGlhbG9nQ2xvc2U7CgkJfQoJCXJldHVybiBkaWFsb2dTdHI7Cgl9CgoJdGhpcy5SZW1vdmVEaWFsb2dCbG9ja0Zvcm1hdCA9IGZ1bmN0aW9uKHNvdXJjZSkgewoJCXZhciBzb3VyY2VMaW5lcyA9IHNvdXJjZS5zcGxpdCgiXG4iKTsKCQl2YXIgZGlhbG9nU3RyID0gIiI7CgkJaWYoc291cmNlTGluZXNbMF0gPT09IFN5bS5EaWFsb2dPcGVuKSB7CgkJCS8vIG11bHRpIGxpbmUKCQkJdmFyIGkgPSAxOwoJCQl3aGlsZSAoaSA8IHNvdXJjZUxpbmVzLmxlbmd0aCAmJiBzb3VyY2VMaW5lc1tpXSAhPSBTeW0uRGlhbG9nQ2xvc2UpIHsKCQkJCWRpYWxvZ1N0ciArPSBzb3VyY2VMaW5lc1tpXSArIChzb3VyY2VMaW5lc1tpKzFdICE9IFN5bS5EaWFsb2dDbG9zZSA/ICdcbicgOiAnJyk7CgkJCQlpKys7CgkJCX0KCQl9CgkJZWxzZSB7CgkJCS8vIHNpbmdsZSBsaW5lCgkJCWRpYWxvZ1N0ciA9IHNvdXJjZTsKCQl9CgkJcmV0dXJuIGRpYWxvZ1N0cjsKCX0KCgl0aGlzLlNlcmlhbGl6ZURpYWxvZ05vZGVMaXN0ID0gZnVuY3Rpb24obm9kZUxpc3QpIHsKCQl2YXIgdGVtcEJsb2NrID0gbmV3IERpYWxvZ0Jsb2NrTm9kZShmYWxzZSk7CgkJIC8vIHNldCBjaGlsZHJlbiBkaXJlY3RseSB0byBhdm9pZCBicmVha2luZyB0aGUgcGFyZW50aW5nIGNoYWluIGZvciB0aGlzIHRlbXAgb3BlcmF0aW9uCgkJdGVtcEJsb2NrLmNoaWxkcmVuID0gbm9kZUxpc3Q7CgkJcmV0dXJuIHRlbXBCbG9jay5TZXJpYWxpemUoKTsKCX0KCgl0aGlzLkdldE9wZXJhdG9yTGlzdCA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiBbU3ltLlNldF0uY29uY2F0KFN5bS5PcGVyYXRvcnMpOwoJfQoKCXRoaXMuSXNJbmxpbmVDb2RlID0gZnVuY3Rpb24obm9kZSkgewoJCXJldHVybiBpc0lubGluZUNvZGUobm9kZSk7Cgl9Cn0KCgovKiBCVUlMVC1JTiBGVU5DVElPTlMgKi8gLy8gVE9ETzogYmV0dGVyIHdheSB0byBlbmNhcHN1bGF0ZSB0aGVzZT8KZnVuY3Rpb24gZGVwcmVjYXRlZEZ1bmMoZW52aXJvbm1lbnQscGFyYW1ldGVycyxvblJldHVybikgewoJYml0c3kubG9nKCJCSVRTWSBTQ1JJUFQgV0FSTklORzogVHJpZWQgdG8gdXNlIGRlcHJlY2F0ZWQgZnVuY3Rpb24iKTsKCW9uUmV0dXJuKG51bGwpOwp9CgpmdW5jdGlvbiBzYXlGdW5jKGVudmlyb25tZW50LCBwYXJhbWV0ZXJzLCBvblJldHVybikgewoJaWYgKHBhcmFtZXRlcnNbMF0gIT0gdW5kZWZpbmVkICYmIHBhcmFtZXRlcnNbMF0gIT0gbnVsbCkgewoJCXZhciB0ZXh0U3RyID0gIiIgKyBwYXJhbWV0ZXJzWzBdOwoJCWVudmlyb25tZW50LkdldERpYWxvZ0J1ZmZlcigpLkFkZFRleHQodGV4dFN0cik7CgkJZW52aXJvbm1lbnQuR2V0RGlhbG9nQnVmZmVyKCkuQWRkU2NyaXB0UmV0dXJuKGZ1bmN0aW9uKCkgeyBvblJldHVybihudWxsKTsgfSk7Cgl9CgllbHNlIHsKCQlvblJldHVybihudWxsKTsKCX0KfQoKZnVuY3Rpb24gbGluZWJyZWFrRnVuYyhlbnZpcm9ubWVudCwgcGFyYW1ldGVycywgb25SZXR1cm4pIHsKCS8vIGJpdHN5LmxvZygiTElORUJSRUFLIEZVTkMiKTsKCWVudmlyb25tZW50LkdldERpYWxvZ0J1ZmZlcigpLkFkZExpbmVicmVhaygpOwoJZW52aXJvbm1lbnQuR2V0RGlhbG9nQnVmZmVyKCkuQWRkU2NyaXB0UmV0dXJuKGZ1bmN0aW9uKCkgeyBvblJldHVybihudWxsKTsgfSk7Cn0KCmZ1bmN0aW9uIHBhZ2VicmVha0Z1bmMoZW52aXJvbm1lbnQsIHBhcmFtZXRlcnMsIG9uUmV0dXJuKSB7CgllbnZpcm9ubWVudC5HZXREaWFsb2dCdWZmZXIoKS5BZGRQYWdlYnJlYWsoZnVuY3Rpb24oKSB7IG9uUmV0dXJuKG51bGwpOyB9KTsKfQoKZnVuY3Rpb24gZHJhd0Z1bmMoZW52aXJvbm1lbnQsIHBhcmFtZXRlcnMsIG9uUmV0dXJuKSB7Cgl2YXIgZHJhd2luZ0lkID0gcGFyYW1ldGVyc1swXTsKCWVudmlyb25tZW50LkdldERpYWxvZ0J1ZmZlcigpLkFkZERyYXdpbmcoZHJhd2luZ0lkKTsKCWVudmlyb25tZW50LkdldERpYWxvZ0J1ZmZlcigpLkFkZFNjcmlwdFJldHVybihmdW5jdGlvbigpIHsgb25SZXR1cm4obnVsbCk7IH0pOwp9CgpmdW5jdGlvbiBkcmF3U3ByaXRlRnVuYyhlbnZpcm9ubWVudCwgcGFyYW1ldGVycywgb25SZXR1cm4pIHsKCXZhciBzcHJpdGVJZCA9IHBhcmFtZXRlcnNbMF07CgoJLy8gY2hlY2sgaWYgaWQgcGFyYW1ldGVyIGlzIGFjdHVhbGx5IGEgbmFtZQoJaWYgKG5hbWVzLnNwcml0ZVtzcHJpdGVJZF0gIT0gdW5kZWZpbmVkKSB7CgkJc3ByaXRlSWQgPSBuYW1lcy5zcHJpdGVbc3ByaXRlSWRdOwoJfQoKCXZhciBkcmF3aW5nSWQgPSBzcHJpdGVbc3ByaXRlSWRdLmRydzsKCWRyYXdGdW5jKGVudmlyb25tZW50LCBbZHJhd2luZ0lkXSwgb25SZXR1cm4pOwp9CgpmdW5jdGlvbiBkcmF3VGlsZUZ1bmMoZW52aXJvbm1lbnQsIHBhcmFtZXRlcnMsIG9uUmV0dXJuKSB7Cgl2YXIgdGlsZUlkID0gcGFyYW1ldGVyc1swXTsKCgkvLyBjaGVjayBpZiBpZCBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgYSBuYW1lCglpZiAobmFtZXMudGlsZVt0aWxlSWRdICE9IHVuZGVmaW5lZCkgewoJCXRpbGVJZCA9IG5hbWVzLnRpbGVbdGlsZUlkXTsKCX0KCgl2YXIgZHJhd2luZ0lkID0gdGlsZVt0aWxlSWRdLmRydzsKCWRyYXdGdW5jKGVudmlyb25tZW50LCBbZHJhd2luZ0lkXSwgb25SZXR1cm4pOwp9CgpmdW5jdGlvbiBkcmF3SXRlbUZ1bmMoZW52aXJvbm1lbnQsIHBhcmFtZXRlcnMsIG9uUmV0dXJuKSB7Cgl2YXIgaXRlbUlkID0gcGFyYW1ldGVyc1swXTsKCgkvLyBjaGVjayBpZiBpZCBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgYSBuYW1lCglpZiAobmFtZXMuaXRlbVtpdGVtSWRdICE9IHVuZGVmaW5lZCkgewoJCWl0ZW1JZCA9IG5hbWVzLml0ZW1baXRlbUlkXTsKCX0KCgl2YXIgZHJhd2luZ0lkID0gaXRlbVtpdGVtSWRdLmRydzsKCWRyYXdGdW5jKGVudmlyb25tZW50LCBbZHJhd2luZ0lkXSwgb25SZXR1cm4pOwp9CgpmdW5jdGlvbiBwcmludEZvbnRGdW5jKGVudmlyb25tZW50LCBwYXJhbWV0ZXJzLCBvblJldHVybikgewoJdmFyIGFsbENoYXJhY3RlcnMgPSAiIjsKCXZhciBmb250ID0gZm9udE1hbmFnZXIuR2V0KGZvbnROYW1lKTsKCXZhciBjb2RlTGlzdCA9IGZvbnQuYWxsQ2hhckNvZGVzKCk7Cglmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVMaXN0Lmxlbmd0aDsgaSsrKSB7CgkJYWxsQ2hhcmFjdGVycyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVMaXN0W2ldKSArICIgIjsKCX0KCXNheUZ1bmMoZW52aXJvbm1lbnQsIFthbGxDaGFyYWN0ZXJzXSwgb25SZXR1cm4pOwp9CgpmdW5jdGlvbiBpdGVtRnVuYyhlbnZpcm9ubWVudCxwYXJhbWV0ZXJzLG9uUmV0dXJuKSB7Cgl2YXIgaXRlbUlkID0gcGFyYW1ldGVyc1swXTsKCglpZiAobmFtZXMuaXRlbVtpdGVtSWRdICE9IHVuZGVmaW5lZCkgewoJCS8vIGlkIGlzIGFjdHVhbGx5IGEgbmFtZQoJCWl0ZW1JZCA9IG5hbWVzLml0ZW1baXRlbUlkXTsKCX0KCgl2YXIgY3VySXRlbUNvdW50ID0gcGxheWVyKCkuaW52ZW50b3J5W2l0ZW1JZF0gPyBwbGF5ZXIoKS5pbnZlbnRvcnlbaXRlbUlkXSA6IDA7CgoJaWYgKHBhcmFtZXRlcnMubGVuZ3RoID4gMSkgewoJCS8vIFRPRE8gOiBpcyBpdCBhIGdvb2QgaWRlYSB0byBmb3JjZSBpbnZlbnRvcnkgdG8gYmUgPj0gMD8KCQlwbGF5ZXIoKS5pbnZlbnRvcnlbaXRlbUlkXSA9IE1hdGgubWF4KDAsIHBhcnNlSW50KHBhcmFtZXRlcnNbMV0pKTsKCQljdXJJdGVtQ291bnQgPSBwbGF5ZXIoKS5pbnZlbnRvcnlbaXRlbUlkXTsKCgkJaWYgKG9uSW52ZW50b3J5Q2hhbmdlZCAhPSBudWxsKSB7CgkJCW9uSW52ZW50b3J5Q2hhbmdlZChpdGVtSWQpOwoJCX0KCX0KCglvblJldHVybihjdXJJdGVtQ291bnQpOwp9CgpmdW5jdGlvbiB0b2dnbGVUZXh0RWZmZWN0KGVudmlyb25tZW50LCBuYW1lKSB7CglpZiAoZW52aXJvbm1lbnQuR2V0RGlhbG9nQnVmZmVyKCkuaGFzVGV4dEVmZmVjdChuYW1lKSkgewoJCWVudmlyb25tZW50LkdldERpYWxvZ0J1ZmZlcigpLnBvcFRleHRFZmZlY3QobmFtZSk7Cgl9CgllbHNlIHsKCQllbnZpcm9ubWVudC5HZXREaWFsb2dCdWZmZXIoKS5wdXNoVGV4dEVmZmVjdChuYW1lLCBbXSk7Cgl9Cn0KCmZ1bmN0aW9uIGNvbG9yMUZ1bmMoZW52aXJvbm1lbnQsIHBhcmFtZXRlcnMsIG9uUmV0dXJuKSB7Cgl0b2dnbGVUZXh0RWZmZWN0KGVudmlyb25tZW50LCAiY2xyMSIpOwoJb25SZXR1cm4obnVsbCk7Cn0KCmZ1bmN0aW9uIGNvbG9yMkZ1bmMoZW52aXJvbm1lbnQsIHBhcmFtZXRlcnMsIG9uUmV0dXJuKSB7Cgl0b2dnbGVUZXh0RWZmZWN0KGVudmlyb25tZW50LCAiY2xyMiIpOwoJb25SZXR1cm4obnVsbCk7Cn0KCmZ1bmN0aW9uIGNvbG9yM0Z1bmMoZW52aXJvbm1lbnQsIHBhcmFtZXRlcnMsIG9uUmV0dXJuKSB7Cgl0b2dnbGVUZXh0RWZmZWN0KGVudmlyb25tZW50LCAiY2xyMyIpOwoJb25SZXR1cm4obnVsbCk7Cn0KCmZ1bmN0aW9uIGNvbG9yRnVuYyhlbnZpcm9ubWVudCwgcGFyYW1ldGVycywgb25SZXR1cm4pIHsKCWVudmlyb25tZW50LkdldERpYWxvZ0J1ZmZlcigpLnB1c2hUZXh0RWZmZWN0KCJjbHIiLCBwYXJhbWV0ZXJzKTsKCW9uUmV0dXJuKG51bGwpOwp9CgpmdW5jdGlvbiBjb2xvclBvcEZ1bmMoZW52aXJvbm1lbnQsIHBhcmFtZXRlcnMsIG9uUmV0dXJuKSB7CglpZiAoZW52aXJvbm1lbnQuR2V0RGlhbG9nQnVmZmVyKCkuaGFzVGV4dEVmZmVjdCgiY2xyIikpIHsKCQllbnZpcm9ubWVudC5HZXREaWFsb2dCdWZmZXIoKS5wb3BUZXh0RWZmZWN0KCJjbHIiKTsKCX0KCW9uUmV0dXJuKG51bGwpOwp9CgpmdW5jdGlvbiByYWluYm93RnVuYyhlbnZpcm9ubWVudCwgcGFyYW1ldGVycywgb25SZXR1cm4pIHsKCXRvZ2dsZVRleHRFZmZlY3QoZW52aXJvbm1lbnQsICJyYnciKTsKCW9uUmV0dXJuKG51bGwpOwp9CgpmdW5jdGlvbiByYWluYm93UG9wRnVuYyhlbnZpcm9ubWVudCwgcGFyYW1ldGVycywgb25SZXR1cm4pIHsKCWlmIChlbnZpcm9ubWVudC5HZXREaWFsb2dCdWZmZXIoKS5oYXNUZXh0RWZmZWN0KCJyYnciKSkgewoJCWVudmlyb25tZW50LkdldERpYWxvZ0J1ZmZlcigpLnBvcFRleHRFZmZlY3QoInJidyIpOwoJfQoJb25SZXR1cm4obnVsbCk7Cn0KCmZ1bmN0aW9uIHdhdnlGdW5jKGVudmlyb25tZW50LCBwYXJhbWV0ZXJzLCBvblJldHVybikgewoJdG9nZ2xlVGV4dEVmZmVjdChlbnZpcm9ubWVudCwgInd2eSIpOwoJb25SZXR1cm4obnVsbCk7Cn0KCmZ1bmN0aW9uIHdhdnlQb3BGdW5jKGVudmlyb25tZW50LCBwYXJhbWV0ZXJzLCBvblJldHVybikgewoJaWYgKGVudmlyb25tZW50LkdldERpYWxvZ0J1ZmZlcigpLmhhc1RleHRFZmZlY3QoInd2eSIpKSB7CgkJZW52aXJvbm1lbnQuR2V0RGlhbG9nQnVmZmVyKCkucG9wVGV4dEVmZmVjdCgid3Z5Iik7Cgl9CglvblJldHVybihudWxsKTsKfQoKZnVuY3Rpb24gc2hha3lGdW5jKGVudmlyb25tZW50LCBwYXJhbWV0ZXJzLCBvblJldHVybikgewoJdG9nZ2xlVGV4dEVmZmVjdChlbnZpcm9ubWVudCwgInNoayIpOwoJb25SZXR1cm4obnVsbCk7Cn0KCmZ1bmN0aW9uIHNoYWt5UG9wRnVuYyhlbnZpcm9ubWVudCwgcGFyYW1ldGVycywgb25SZXR1cm4pIHsKCWlmIChlbnZpcm9ubWVudC5HZXREaWFsb2dCdWZmZXIoKS5oYXNUZXh0RWZmZWN0KCJzaGsiKSkgewoJCWVudmlyb25tZW50LkdldERpYWxvZ0J1ZmZlcigpLnBvcFRleHRFZmZlY3QoInNoayIpOwoJfQoJb25SZXR1cm4obnVsbCk7Cn0KCmZ1bmN0aW9uIHByb3BlcnR5RnVuYyhlbnZpcm9ubWVudCwgcGFyYW1ldGVycywgb25SZXR1cm4pIHsKCXZhciBvdXRWYWx1ZSA9IG51bGw7CgoJaWYgKHBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBwYXJhbWV0ZXJzWzBdKSB7CgkJdmFyIHByb3BlcnR5TmFtZSA9IHBhcmFtZXRlcnNbMF07CgoJCWlmIChlbnZpcm9ubWVudC5IYXNQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7CgkJCS8vIFRPRE8gOiBpbiBhIGZ1dHVyZSB1cGRhdGUgSSBjYW4gaGFuZGxlIHRoZSBjYXNlIG9mIGluaXRpYWxpemluZyBhIG5ldyBwcm9wZXJ0eQoJCQkvLyBhZnRlciB3aGljaCB3ZSBjYW4gbW92ZSB0aGlzIGJsb2NrIG91dHNpZGUgdGhlIEhhc1Byb3BlcnR5IGNoZWNrCgkJCWlmIChwYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHsKCQkJCXZhciBpblZhbHVlID0gcGFyYW1ldGVyc1sxXTsKCQkJCWVudmlyb25tZW50LlNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgaW5WYWx1ZSk7CgkJCX0KCgkJCW91dFZhbHVlID0gZW52aXJvbm1lbnQuR2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKCQl9Cgl9CgoJYml0c3kubG9nKCJQUk9QRVJUWSEgIiArIHByb3BlcnR5TmFtZSArICIgIiArIG91dFZhbHVlKTsKCglvblJldHVybihvdXRWYWx1ZSk7Cn0KCmZ1bmN0aW9uIGVuZEZ1bmMoZW52aXJvbm1lbnQscGFyYW1ldGVycyxvblJldHVybikgewoJaXNFbmRpbmcgPSB0cnVlOwoJaXNOYXJyYXRpbmcgPSB0cnVlOwoJZGlhbG9nUmVuZGVyZXIuU2V0Q2VudGVyZWQodHJ1ZSk7CglkaWFsb2dSZW5kZXJlci5EcmF3VGV4dGJveCgpOwoJb25SZXR1cm4obnVsbCk7Cn0KCmZ1bmN0aW9uIGV4aXRGdW5jKGVudmlyb25tZW50LCBwYXJhbWV0ZXJzLCBvblJldHVybikgewoJdmFyIGRlc3RSb29tOwoJdmFyIGRlc3RYOwoJdmFyIGRlc3RZOwoKCWlmIChwYXJhbWV0ZXJzLmxlbmd0aCA+PSAxKSB7CgkJZGVzdFJvb20gPSBwYXJhbWV0ZXJzWzBdOwoKCQkvLyBpcyBpdCBhIG5hbWU/CgkJaWYgKG5hbWVzLnJvb21bZGVzdFJvb21dICE9IHVuZGVmaW5lZCkgewoJCQlkZXN0Um9vbSA9IG5hbWVzLnJvb21bZGVzdFJvb21dOwoJCX0KCX0KCglpZiAocGFyYW1ldGVycy5sZW5ndGggPj0gMykgewoJCWRlc3RYID0gcGFyc2VJbnQocGFyYW1ldGVyc1sxXSk7CgkJZGVzdFkgPSBwYXJzZUludChwYXJhbWV0ZXJzWzJdKTsKCX0KCglpZiAocGFyYW1ldGVycy5sZW5ndGggPj0gNCkgewoJCXZhciB0cmFuc2l0aW9uRWZmZWN0ID0gcGFyYW1ldGVyc1szXTsKCgkJdHJhbnNpdGlvbi5CZWdpblRyYW5zaXRpb24oCgkJCXBsYXllcigpLnJvb20sCgkJCXBsYXllcigpLngsCgkJCXBsYXllcigpLnksCgkJCWRlc3RSb29tLAoJCQlkZXN0WCwKCQkJZGVzdFksCgkJCXRyYW5zaXRpb25FZmZlY3QpOwoJCXRyYW5zaXRpb24uVXBkYXRlVHJhbnNpdGlvbigwKTsKCX0KCgl2YXIgbW92ZVBsYXllckFuZFJlc3VtZVNjcmlwdCA9IGZ1bmN0aW9uKCkgewoJCWlmIChkZXN0Um9vbSAhPSB1bmRlZmluZWQgJiYgZGVzdFggIT0gdW5kZWZpbmVkICYmIGRlc3RZICE9IHVuZGVmaW5lZCkgewoJCQkvLyB1cGRhdGUgd29ybGQgc3RhdGUKCQkJcGxheWVyKCkucm9vbSA9IGRlc3RSb29tOwoJCQlwbGF5ZXIoKS54ID0gZGVzdFg7CgkJCXBsYXllcigpLnkgPSBkZXN0WTsKCQkJc3RhdGUucm9vbSA9IGRlc3RSb29tOwoKCQkJLy8gdXBkYXRlIGdhbWUgc3RhdGUKCQkJaW5pdFJvb20oc3RhdGUucm9vbSk7CgkJfQoKCQlpZiAoZGlhbG9nUmVuZGVyZXIpIHsKCQkJZGlhbG9nUmVuZGVyZXIudXBkYXRlVGV4dGJveFBvc2l0aW9uKCk7CgkJfQoKCQkvLyByZXN1bWUgZGlhbG9nIHNjcmlwdAoJCW9uUmV0dXJuKHN0YXRlLnJvb20pOwoJfTsKCgkvLyBUT0RPIDogdGhpcyBkb2Vzbid0IHBsYXkgbmljZSB3aXRoIHBhZ2VicmVhayBiZWNhdXNlIGl0IHRoaW5rcyB0aGUgZGlhbG9nIGlzIGZpbmlzaGVkIQoJaWYgKHRyYW5zaXRpb24uSXNUcmFuc2l0aW9uQWN0aXZlKCkpIHsKCQl0cmFuc2l0aW9uLk9uVHJhbnNpdGlvbkNvbXBsZXRlKG1vdmVQbGF5ZXJBbmRSZXN1bWVTY3JpcHQpOwoJfQoJZWxzZSB7CgkJbW92ZVBsYXllckFuZFJlc3VtZVNjcmlwdCgpOwoJfQp9CgpmdW5jdGlvbiB0dW5lRnVuYyhlbnZpcm9ubWVudCwgcGFyYW1ldGVycywgb25SZXR1cm4pIHsKCWlmIChwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKCQl2YXIgdHVuZUlkID0gcGFyYW1ldGVyc1swXTsKCgkJLy8gY2hlY2sgaWYgaWQgcGFyYW1ldGVyIGlzIGFjdHVhbGx5IGEgbmFtZQoJCWlmIChuYW1lcy50dW5lW3R1bmVJZF0gIT0gdW5kZWZpbmVkKSB7CgkJCXR1bmVJZCA9IG5hbWVzLnR1bmVbdHVuZUlkXTsKCQl9CgoJCWlmIChzb3VuZFBsYXllcikgewoJCQlpZiAodHVuZUlkID09PSAiMCIpIHsKCQkJCXNvdW5kUGxheWVyLnN0b3BUdW5lKCk7CgkJCX0KCQkJZWxzZSBpZiAoc3RhdGUudHVuZSAhPSB0dW5lSWQpIHsKCQkJCXNvdW5kUGxheWVyLnBsYXlUdW5lKHR1bmVbdHVuZUlkXSk7CgkJCX0KCQl9CgoJCXN0YXRlLnR1bmUgPSB0dW5lSWQ7Cgl9CgoJb25SZXR1cm4oc3RhdGUudHVuZSk7Cn0KCmZ1bmN0aW9uIGJsaXBGdW5jKGVudmlyb25tZW50LCBwYXJhbWV0ZXJzLCBvblJldHVybikgewoJaWYgKHBhcmFtZXRlcnMubGVuZ3RoID4gMCkgewoJCXZhciBibGlwSWQgPSBwYXJhbWV0ZXJzWzBdOwoKCQkvLyBjaGVjayBpZiBpZCBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgYSBuYW1lCgkJaWYgKG5hbWVzLmJsaXBbYmxpcElkXSAhPSB1bmRlZmluZWQpIHsKCQkJYmxpcElkID0gbmFtZXMuYmxpcFtibGlwSWRdOwoJCX0KCgkJc291bmRQbGF5ZXIucGxheUJsaXAoYmxpcFtibGlwSWRdKTsKCX0KCgkvLyBpZiBhIGRpYWxvZyBza2lwIGlzIGhhcHBlbmluZywgc3RvcCBpdCBhbmQgZm9yY2UgYSByZWRyYXcgb2YgdGhlIHRleHRib3gKCWlmIChkaWFsb2dCdWZmZXIpIHsKCQlpZiAoZGlhbG9nQnVmZmVyLnRyeUludGVycnVwdFNraXAoKSkgewoJCQlkaWFsb2dSZW5kZXJlci5EcmF3KGRpYWxvZ0J1ZmZlciwgMCwgdHJ1ZSAvKiBkaXNhYmxlT25QcmludCAqLyk7CgkJfQoJfQoKCW9uUmV0dXJuKG51bGwpOwp9CgovKgovLyBUT0RPIDogdXNlIGxhdGVyPwpmdW5jdGlvbiB5YWtGdW5jKGVudmlyb25tZW50LCBwYXJhbWV0ZXJzLCBvblJldHVybikgewoJaWYgKHBhcmFtZXRlcnMubGVuZ3RoID4gMCkgewoJCXZhciBibGlwSWQgPSBwYXJhbWV0ZXJzWzBdOwoKCQkvLyBjaGVjayBpZiBpZCBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgYSBuYW1lCgkJaWYgKG5hbWVzLmJsaXBbYmxpcElkXSAhPSB1bmRlZmluZWQpIHsKCQkJYmxpcElkID0gbmFtZXMuYmxpcFtibGlwSWRdOwoJCX0KCgkJZW52aXJvbm1lbnQuR2V0RGlhbG9nQnVmZmVyKCkucHVzaFRleHRFZmZlY3QoInlhayIsIFtibGlwSWRdKTsKCX0KCglvblJldHVybihudWxsKTsKfQoKZnVuY3Rpb24geWFrUG9wRnVuYyhlbnZpcm9ubWVudCwgcGFyYW1ldGVycywgb25SZXR1cm4pIHsKCWlmIChlbnZpcm9ubWVudC5HZXREaWFsb2dCdWZmZXIoKS5oYXNUZXh0RWZmZWN0KCJ5YWsiKSkgewoJCWVudmlyb25tZW50LkdldERpYWxvZ0J1ZmZlcigpLnBvcFRleHRFZmZlY3QoInlhayIpOwoJfQoKCW9uUmV0dXJuKG51bGwpOwp9CiovCgpmdW5jdGlvbiBwYWxldHRlRnVuYyhlbnZpcm9ubWVudCwgcGFyYW1ldGVycywgb25SZXR1cm4pIHsKCWlmIChwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKCQl2YXIgcGFsSWQgPSBwYXJhbWV0ZXJzWzBdOwoKCQkvLyBjaGVjayBpZiBpZCBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgYSBuYW1lCgkJaWYgKG5hbWVzLnBhbGV0dGVbcGFsSWRdICE9IHVuZGVmaW5lZCkgewoJCQlwYWxJZCA9IG5hbWVzLnBhbGV0dGVbcGFsSWRdOwoJCX0KCgkJdXBkYXRlUGFsZXR0ZShwYWxJZCk7Cgl9CgoJb25SZXR1cm4oc3RhdGUucGFsKTsKfQoKZnVuY3Rpb24gYXZhdGFyRnVuYyhlbnZpcm9ubWVudCwgcGFyYW1ldGVycywgb25SZXR1cm4pIHsKCWlmIChwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKCQl2YXIgc3BySWQgPSBwYXJhbWV0ZXJzWzBdOwoKCQkvLyBjaGVjayBpZiBpZCBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgYSBuYW1lCgkJaWYgKG5hbWVzLnNwcml0ZVtzcHJJZF0gIT0gdW5kZWZpbmVkKSB7CgkJCXNwcklkID0gbmFtZXMuc3ByaXRlW3NwcklkXTsKCQl9CgoJCS8vIG92ZXJyaWRlIHRoZSBhdmF0YXIncyBjdXJyZW50IGFwcGVhcmFuY2UKCQlzdGF0ZS5hdmEgPSBzcHJJZDsKCgkJLy8gcmVkcmF3IHRoZSBhdmF0YXIgd2l0aCBpdHMgbmV3IGFwcGVhcmFuY2UKCQlkcmF3Um9vbShyb29tW3N0YXRlLnJvb21dLCB7IHJlZHJhd0F2YXRhcjogdHJ1ZSB9KTsKCX0KCglvblJldHVybihzdGF0ZS5hdmEpOwp9CgovKiBCVUlMVC1JTiBPUEVSQVRPUlMgKi8KZnVuY3Rpb24gc2V0RXhwKGVudmlyb25tZW50LGxlZnQscmlnaHQsb25SZXR1cm4pIHsKCS8vIGJpdHN5LmxvZygiU0VUICIgKyBsZWZ0Lm5hbWUpOwoKCWlmKGxlZnQudHlwZSAhPSAidmFyaWFibGUiKSB7CgkJLy8gbm90IGEgdmFyaWFibGUhIHJldHVybiBudWxsIGFuZCBob3BlIGZvciB0aGUgYmVzdCBEOgoJCW9uUmV0dXJuKCBudWxsICk7CgkJcmV0dXJuOwoJfQoKCXJpZ2h0LkV2YWwoZW52aXJvbm1lbnQsZnVuY3Rpb24oclZhbCkgewoJCWVudmlyb25tZW50LlNldFZhcmlhYmxlKCBsZWZ0Lm5hbWUsIHJWYWwgKTsKCQkvLyBiaXRzeS5sb2coIlZBTCAiICsgZW52aXJvbm1lbnQuR2V0VmFyaWFibGUoIGxlZnQubmFtZSApICk7CgkJbGVmdC5FdmFsKGVudmlyb25tZW50LGZ1bmN0aW9uKGxWYWwpIHsKCQkJb25SZXR1cm4oIGxWYWwgKTsKCQl9KTsKCX0pOwp9CmZ1bmN0aW9uIGVxdWFsRXhwKGVudmlyb25tZW50LGxlZnQscmlnaHQsb25SZXR1cm4pIHsKCS8vIGJpdHN5LmxvZygiRVZBTCBFUVVBTCIpOwoJLy8gYml0c3kubG9nKGxlZnQpOwoJLy8gYml0c3kubG9nKHJpZ2h0KTsKCXJpZ2h0LkV2YWwoZW52aXJvbm1lbnQsZnVuY3Rpb24oclZhbCl7CgkJbGVmdC5FdmFsKGVudmlyb25tZW50LGZ1bmN0aW9uKGxWYWwpewoJCQlvblJldHVybiggbFZhbCA9PT0gclZhbCApOwoJCX0pOwoJfSk7Cn0KZnVuY3Rpb24gZ3JlYXRlckV4cChlbnZpcm9ubWVudCxsZWZ0LHJpZ2h0LG9uUmV0dXJuKSB7CglyaWdodC5FdmFsKGVudmlyb25tZW50LGZ1bmN0aW9uKHJWYWwpewoJCWxlZnQuRXZhbChlbnZpcm9ubWVudCxmdW5jdGlvbihsVmFsKXsKCQkJb25SZXR1cm4oIGxWYWwgPiByVmFsICk7CgkJfSk7Cgl9KTsKfQpmdW5jdGlvbiBsZXNzRXhwKGVudmlyb25tZW50LGxlZnQscmlnaHQsb25SZXR1cm4pIHsKCXJpZ2h0LkV2YWwoZW52aXJvbm1lbnQsZnVuY3Rpb24oclZhbCl7CgkJbGVmdC5FdmFsKGVudmlyb25tZW50LGZ1bmN0aW9uKGxWYWwpewoJCQlvblJldHVybiggbFZhbCA8IHJWYWwgKTsKCQl9KTsKCX0pOwp9CmZ1bmN0aW9uIGdyZWF0ZXJFcUV4cChlbnZpcm9ubWVudCxsZWZ0LHJpZ2h0LG9uUmV0dXJuKSB7CglyaWdodC5FdmFsKGVudmlyb25tZW50LGZ1bmN0aW9uKHJWYWwpewoJCWxlZnQuRXZhbChlbnZpcm9ubWVudCxmdW5jdGlvbihsVmFsKXsKCQkJb25SZXR1cm4oIGxWYWwgPj0gclZhbCApOwoJCX0pOwoJfSk7Cn0KZnVuY3Rpb24gbGVzc0VxRXhwKGVudmlyb25tZW50LGxlZnQscmlnaHQsb25SZXR1cm4pIHsKCXJpZ2h0LkV2YWwoZW52aXJvbm1lbnQsZnVuY3Rpb24oclZhbCl7CgkJbGVmdC5FdmFsKGVudmlyb25tZW50LGZ1bmN0aW9uKGxWYWwpewoJCQlvblJldHVybiggbFZhbCA8PSByVmFsICk7CgkJfSk7Cgl9KTsKfQpmdW5jdGlvbiBtdWx0RXhwKGVudmlyb25tZW50LGxlZnQscmlnaHQsb25SZXR1cm4pIHsKCXJpZ2h0LkV2YWwoZW52aXJvbm1lbnQsZnVuY3Rpb24oclZhbCl7CgkJbGVmdC5FdmFsKGVudmlyb25tZW50LGZ1bmN0aW9uKGxWYWwpewoJCQlvblJldHVybiggbFZhbCAqIHJWYWwgKTsKCQl9KTsKCX0pOwp9CmZ1bmN0aW9uIGRpdkV4cChlbnZpcm9ubWVudCxsZWZ0LHJpZ2h0LG9uUmV0dXJuKSB7CglyaWdodC5FdmFsKGVudmlyb25tZW50LGZ1bmN0aW9uKHJWYWwpewoJCWxlZnQuRXZhbChlbnZpcm9ubWVudCxmdW5jdGlvbihsVmFsKXsKCQkJb25SZXR1cm4oIGxWYWwgLyByVmFsICk7CgkJfSk7Cgl9KTsKfQpmdW5jdGlvbiBhZGRFeHAoZW52aXJvbm1lbnQsbGVmdCxyaWdodCxvblJldHVybikgewoJcmlnaHQuRXZhbChlbnZpcm9ubWVudCxmdW5jdGlvbihyVmFsKXsKCQlsZWZ0LkV2YWwoZW52aXJvbm1lbnQsZnVuY3Rpb24obFZhbCl7CgkJCW9uUmV0dXJuKCBsVmFsICsgclZhbCApOwoJCX0pOwoJfSk7Cn0KZnVuY3Rpb24gc3ViRXhwKGVudmlyb25tZW50LGxlZnQscmlnaHQsb25SZXR1cm4pIHsKCXJpZ2h0LkV2YWwoZW52aXJvbm1lbnQsZnVuY3Rpb24oclZhbCl7CgkJbGVmdC5FdmFsKGVudmlyb25tZW50LGZ1bmN0aW9uKGxWYWwpewoJCQlvblJldHVybiggbFZhbCAtIHJWYWwgKTsKCQl9KTsKCX0pOwp9CgovKiBFTlZJUk9OTUVOVCAqLwp2YXIgRW52aXJvbm1lbnQgPSBmdW5jdGlvbigpIHsKCXZhciBkaWFsb2dCdWZmZXIgPSBudWxsOwoJdGhpcy5TZXREaWFsb2dCdWZmZXIgPSBmdW5jdGlvbihidWZmZXIpIHsgZGlhbG9nQnVmZmVyID0gYnVmZmVyOyB9OwoJdGhpcy5HZXREaWFsb2dCdWZmZXIgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGRpYWxvZ0J1ZmZlcjsgfTsKCgl2YXIgZnVuY3Rpb25NYXAgPSB7fTsKCgkvLyBkaWFsb2cKCWZ1bmN0aW9uTWFwWyJzYXkiXSA9IHNheUZ1bmM7CglmdW5jdGlvbk1hcFsiYnIiXSA9IGxpbmVicmVha0Z1bmM7CglmdW5jdGlvbk1hcFsicGciXSA9IHBhZ2VicmVha0Z1bmM7CgoJLy8gdGV4dCBlZmZlY3RzCglmdW5jdGlvbk1hcFsid3Z5Il0gPSB3YXZ5RnVuYzsKCWZ1bmN0aW9uTWFwWyIvd3Z5Il0gPSB3YXZ5UG9wRnVuYzsKCWZ1bmN0aW9uTWFwWyJzaGsiXSA9IHNoYWt5RnVuYzsKCWZ1bmN0aW9uTWFwWyIvc2hrIl0gPSBzaGFreVBvcEZ1bmM7CglmdW5jdGlvbk1hcFsicmJ3Il0gPSByYWluYm93RnVuYzsKCWZ1bmN0aW9uTWFwWyIvcmJ3Il0gPSByYWluYm93UG9wRnVuYzsKCWZ1bmN0aW9uTWFwWyJjbHIiXSA9IGNvbG9yRnVuYzsKCWZ1bmN0aW9uTWFwWyIvY2xyIl0gPSBjb2xvclBvcEZ1bmM7CgkvLyBkcmF3aW5nIHRleHQgZWZmZWN0cwoJZnVuY3Rpb25NYXBbImRyd3QiXSA9IGRyYXdUaWxlRnVuYzsKCWZ1bmN0aW9uTWFwWyJkcndzIl0gPSBkcmF3U3ByaXRlRnVuYzsKCWZ1bmN0aW9uTWFwWyJkcndpIl0gPSBkcmF3SXRlbUZ1bmM7CgoJLy8gcm9vbQoJZnVuY3Rpb25NYXBbImVuZCJdID0gZW5kRnVuYzsKCWZ1bmN0aW9uTWFwWyJleGl0Il0gPSBleGl0RnVuYzsKCWZ1bmN0aW9uTWFwWyJwYWwiXSA9IHBhbGV0dGVGdW5jOwoJZnVuY3Rpb25NYXBbImF2YSJdID0gYXZhdGFyRnVuYzsKCgkvLyBpbnZlbnRvcnkgJiB2YXJpYWJsZXMKCWZ1bmN0aW9uTWFwWyJpdGVtIl0gPSBpdGVtRnVuYzsKCWZ1bmN0aW9uTWFwWyJwcm9wZXJ0eSJdID0gcHJvcGVydHlGdW5jOwoKCS8vIHNvdW5kCglmdW5jdGlvbk1hcFsidHVuZSJdID0gdHVuZUZ1bmM7CglmdW5jdGlvbk1hcFsiYmxpcCJdID0gYmxpcEZ1bmM7CgoJLy8gbGVnYWN5CglmdW5jdGlvbk1hcFsiY2xyMSJdID0gY29sb3IxRnVuYzsKCWZ1bmN0aW9uTWFwWyJjbHIyIl0gPSBjb2xvcjJGdW5jOwoJZnVuY3Rpb25NYXBbImNscjMiXSA9IGNvbG9yM0Z1bmM7CglmdW5jdGlvbk1hcFsicHJpbnQiXSA9IHNheUZ1bmM7CglmdW5jdGlvbk1hcFsicHJpbnRUaWxlIl0gPSBkcmF3VGlsZUZ1bmM7CglmdW5jdGlvbk1hcFsicHJpbnRTcHJpdGUiXSA9IGRyYXdTcHJpdGVGdW5jOwoJZnVuY3Rpb25NYXBbInByaW50SXRlbSJdID0gZHJhd0l0ZW1GdW5jOwoKCS8vIERFQlVHCglmdW5jdGlvbk1hcFsiX2RlYnVnT25seVByaW50Rm9udCJdID0gcHJpbnRGb250RnVuYzsKCgkvLyBFWFBFUklNRU5UQUwKCS8vIGZ1bmN0aW9uTWFwWyJ5YWsiXSA9IHlha0Z1bmM7CgkvLyBmdW5jdGlvbk1hcFsiL3lhayJdID0geWFrUG9wRnVuYzsKCgl0aGlzLkhhc0Z1bmN0aW9uID0gZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gZnVuY3Rpb25NYXBbbmFtZV0gIT0gdW5kZWZpbmVkOyB9OwoJdGhpcy5FdmFsRnVuY3Rpb24gPSBmdW5jdGlvbihuYW1lLHBhcmFtZXRlcnMsb25SZXR1cm4sZW52KSB7CgkJaWYgKGVudiA9PSB1bmRlZmluZWQgfHwgZW52ID09IG51bGwpIHsKCQkJZW52ID0gdGhpczsKCQl9CgoJCWZ1bmN0aW9uTWFwW25hbWVdKGVudiwgcGFyYW1ldGVycywgb25SZXR1cm4pOwoJfQoKCXZhciB2YXJpYWJsZU1hcCA9IHt9OwoKCXRoaXMuSGFzVmFyaWFibGUgPSBmdW5jdGlvbihuYW1lKSB7IHJldHVybiB2YXJpYWJsZU1hcFtuYW1lXSAhPSB1bmRlZmluZWQ7IH07Cgl0aGlzLkdldFZhcmlhYmxlID0gZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gdmFyaWFibGVNYXBbbmFtZV07IH07Cgl0aGlzLlNldFZhcmlhYmxlID0gZnVuY3Rpb24obmFtZSx2YWx1ZSx1c2VIYW5kbGVyKSB7CgkJLy8gYml0c3kubG9nKCJTRVQgVkFSSUFCTEUgIiArIG5hbWUgKyAiID0gIiArIHZhbHVlKTsKCQlpZih1c2VIYW5kbGVyID09PSB1bmRlZmluZWQpIHVzZUhhbmRsZXIgPSB0cnVlOwoJCXZhcmlhYmxlTWFwW25hbWVdID0gdmFsdWU7CgkJaWYob25WYXJpYWJsZUNoYW5nZUhhbmRsZXIgIT0gbnVsbCAmJiB1c2VIYW5kbGVyKXsKCQkJb25WYXJpYWJsZUNoYW5nZUhhbmRsZXIobmFtZSk7CgkJfQoJfTsKCXRoaXMuRGVsZXRlVmFyaWFibGUgPSBmdW5jdGlvbihuYW1lLHVzZUhhbmRsZXIpIHsKCQlpZih1c2VIYW5kbGVyID09PSB1bmRlZmluZWQpIHVzZUhhbmRsZXIgPSB0cnVlOwoJCWlmKHZhcmlhYmxlTWFwW25hbWVdICE9IHVuZGVmaW5lZCkgewoJCQl2YXJpYWJsZU1hcC5kZWxldGUobmFtZSk7CgkJCWlmKG9uVmFyaWFibGVDaGFuZ2VIYW5kbGVyICE9IG51bGwgJiYgdXNlSGFuZGxlcikgewoJCQkJb25WYXJpYWJsZUNoYW5nZUhhbmRsZXIobmFtZSk7CgkJCX0KCQl9Cgl9OwoKCXZhciBvcGVyYXRvck1hcCA9IHt9OwoJb3BlcmF0b3JNYXBbIj0iXSA9IHNldEV4cDsKCW9wZXJhdG9yTWFwWyI9PSJdID0gZXF1YWxFeHA7CglvcGVyYXRvck1hcFsiPiJdID0gZ3JlYXRlckV4cDsKCW9wZXJhdG9yTWFwWyI8Il0gPSBsZXNzRXhwOwoJb3BlcmF0b3JNYXBbIj49Il0gPSBncmVhdGVyRXFFeHA7CglvcGVyYXRvck1hcFsiPD0iXSA9IGxlc3NFcUV4cDsKCW9wZXJhdG9yTWFwWyIqIl0gPSBtdWx0RXhwOwoJb3BlcmF0b3JNYXBbIi8iXSA9IGRpdkV4cDsKCW9wZXJhdG9yTWFwWyIrIl0gPSBhZGRFeHA7CglvcGVyYXRvck1hcFsiLSJdID0gc3ViRXhwOwoKCXRoaXMuSGFzT3BlcmF0b3IgPSBmdW5jdGlvbihzeW0pIHsgcmV0dXJuIG9wZXJhdG9yTWFwW3N5bV0gIT0gdW5kZWZpbmVkOyB9OwoJdGhpcy5FdmFsT3BlcmF0b3IgPSBmdW5jdGlvbihzeW0sbGVmdCxyaWdodCxvblJldHVybikgewoJCW9wZXJhdG9yTWFwWyBzeW0gXSggdGhpcywgbGVmdCwgcmlnaHQsIG9uUmV0dXJuICk7Cgl9CgoJdmFyIHNjcmlwdE1hcCA9IHt9OwoJdGhpcy5IYXNTY3JpcHQgPSBmdW5jdGlvbihuYW1lKSB7IHJldHVybiBzY3JpcHRNYXBbbmFtZV0gIT0gdW5kZWZpbmVkOyB9OwoJdGhpcy5HZXRTY3JpcHQgPSBmdW5jdGlvbihuYW1lKSB7IHJldHVybiBzY3JpcHRNYXBbbmFtZV07IH07Cgl0aGlzLlNldFNjcmlwdCA9IGZ1bmN0aW9uKG5hbWUsc2NyaXB0KSB7IHNjcmlwdE1hcFtuYW1lXSA9IHNjcmlwdDsgfTsKCgl2YXIgb25WYXJpYWJsZUNoYW5nZUhhbmRsZXIgPSBudWxsOwoJdGhpcy5TZXRPblZhcmlhYmxlQ2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uKG9uVmFyaWFibGVDaGFuZ2UpIHsKCQlvblZhcmlhYmxlQ2hhbmdlSGFuZGxlciA9IG9uVmFyaWFibGVDaGFuZ2U7Cgl9Cgl0aGlzLkdldFZhcmlhYmxlTmFtZXMgPSBmdW5jdGlvbigpIHsKCQl2YXIgdmFyaWFibGVOYW1lcyA9IFtdOwoKCQlmb3IgKHZhciBrZXkgaW4gdmFyaWFibGVNYXApIHsKCQkJdmFyaWFibGVOYW1lcy5wdXNoKGtleSk7CgkJfQoKCQlyZXR1cm4gdmFyaWFibGVOYW1lczsKCX0KfQoKLy8gTG9jYWwgZW52aXJvbm1lbnQgZm9yIGEgc2luZ2xlIHJ1biBvZiBhIHNjcmlwdDoga25vd3MgbG9jYWwgY29udGV4dAp2YXIgTG9jYWxFbnZpcm9ubWVudCA9IGZ1bmN0aW9uKHBhcmVudEVudmlyb25tZW50KSB7CgkvLyB0aGlzLlNldERpYWxvZ0J1ZmZlciAvLyBub3QgYWxsb3dlZCBpbiBsb2NhbCBlbnZpcm9ubWVudD8KCXRoaXMuR2V0RGlhbG9nQnVmZmVyID0gZnVuY3Rpb24oKSB7IHJldHVybiBwYXJlbnRFbnZpcm9ubWVudC5HZXREaWFsb2dCdWZmZXIoKTsgfTsKCgl0aGlzLkhhc0Z1bmN0aW9uID0gZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gcGFyZW50RW52aXJvbm1lbnQuSGFzRnVuY3Rpb24obmFtZSk7IH07Cgl0aGlzLkV2YWxGdW5jdGlvbiA9IGZ1bmN0aW9uKG5hbWUscGFyYW1ldGVycyxvblJldHVybixlbnYpIHsKCQlpZiAoZW52ID09IHVuZGVmaW5lZCB8fCBlbnYgPT0gbnVsbCkgewoJCQllbnYgPSB0aGlzOwoJCX0KCgkJcGFyZW50RW52aXJvbm1lbnQuRXZhbEZ1bmN0aW9uKG5hbWUscGFyYW1ldGVycyxvblJldHVybixlbnYpOwoJfQoKCXRoaXMuSGFzVmFyaWFibGUgPSBmdW5jdGlvbihuYW1lKSB7IHJldHVybiBwYXJlbnRFbnZpcm9ubWVudC5IYXNWYXJpYWJsZShuYW1lKTsgfTsKCXRoaXMuR2V0VmFyaWFibGUgPSBmdW5jdGlvbihuYW1lKSB7IHJldHVybiBwYXJlbnRFbnZpcm9ubWVudC5HZXRWYXJpYWJsZShuYW1lKTsgfTsKCXRoaXMuU2V0VmFyaWFibGUgPSBmdW5jdGlvbihuYW1lLHZhbHVlLHVzZUhhbmRsZXIpIHsgcGFyZW50RW52aXJvbm1lbnQuU2V0VmFyaWFibGUobmFtZSx2YWx1ZSx1c2VIYW5kbGVyKTsgfTsKCS8vIHRoaXMuRGVsZXRlVmFyaWFibGUgLy8gbm90IG5lZWRlZCBpbiBsb2NhbCBlbnZpcm9ubWVudD8KCgl0aGlzLkhhc09wZXJhdG9yID0gZnVuY3Rpb24oc3ltKSB7IHJldHVybiBwYXJlbnRFbnZpcm9ubWVudC5IYXNPcGVyYXRvcihzeW0pOyB9OwoJdGhpcy5FdmFsT3BlcmF0b3IgPSBmdW5jdGlvbihzeW0sbGVmdCxyaWdodCxvblJldHVybixlbnYpIHsKCQlpZiAoZW52ID09IHVuZGVmaW5lZCB8fCBlbnYgPT0gbnVsbCkgewoJCQllbnYgPSB0aGlzOwoJCX0KCgkJcGFyZW50RW52aXJvbm1lbnQuRXZhbE9wZXJhdG9yKHN5bSxsZWZ0LHJpZ2h0LG9uUmV0dXJuLGVudik7Cgl9OwoKCS8vIFRPRE8gOiBJIGRvbid0ICp0aGluayogYW55IG9mIHRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIGxvY2FsIGVudmlyb25tZW50CgkvLyB0aGlzLkhhc1NjcmlwdAoJLy8gdGhpcy5HZXRTY3JpcHQKCS8vIHRoaXMuU2V0U2NyaXB0CgoJLy8gVE9ETyA6IHByZXR0eSBzdXJlIHRoZXNlIGRlYnVnIG1ldGhvZHMgYXJlbid0IHJlcXVpcmVkIGJ5IHRoZSBsb2NhbCBlbnZpcm9ubWVudCBlaXRoZXIKCS8vIHRoaXMuU2V0T25WYXJpYWJsZUNoYW5nZUhhbmRsZXIKCS8vIHRoaXMuR2V0VmFyaWFibGVOYW1lcwoKCS8qIEhlcmUncyB3aGVyZSBzcGVjaWZpYyBsb2NhbCBjb250ZXh0IGRhdGEgZ29lczoKCSAqIHRoaXMgaW5jbHVkZXMgYWNjZXNzIHRvIHRoZSBvYmplY3QgcnVubmluZyB0aGUgc2NyaXB0CgkgKiBhbmQgYW55IHByb3BlcnRpZXMgaXQgbWF5IGhhdmUgKHNvIGZhciBvbmx5ICJsb2NrZWQiKQoJICovCgoJLy8gVGhlIGxvY2FsIGVudmlyb25tZW50IGtub3dzIHdoYXQgb2JqZWN0IGNhbGxlZCBpdCAtLSBjdXJyZW50bHkgb25seSB1c2VkIHRvIGFjY2VzcyBwcm9wZXJ0aWVzCgl2YXIgY3VyT2JqZWN0ID0gbnVsbDsKCXRoaXMuSGFzT2JqZWN0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBjdXJPYmplY3QgIT0gdW5kZWZpbmVkICYmIGN1ck9iamVjdCAhPSBudWxsOyB9Cgl0aGlzLlNldE9iamVjdCA9IGZ1bmN0aW9uKG9iamVjdCkgeyBjdXJPYmplY3QgPSBvYmplY3Q7IH0KCXRoaXMuR2V0T2JqZWN0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBjdXJPYmplY3Q7IH0KCgkvLyBhY2Nlc3NvcnMgZm9yIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCB0aGF0J3MgcnVubmluZyB0aGUgc2NyaXB0Cgl0aGlzLkhhc1Byb3BlcnR5ID0gZnVuY3Rpb24obmFtZSkgewoJCWlmIChjdXJPYmplY3QgJiYgY3VyT2JqZWN0LnByb3BlcnR5ICYmIGN1ck9iamVjdC5wcm9wZXJ0eS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9OwoJdGhpcy5HZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUpIHsKCQlpZiAoY3VyT2JqZWN0ICYmIGN1ck9iamVjdC5wcm9wZXJ0eSAmJiBjdXJPYmplY3QucHJvcGVydHkuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKCQkJcmV0dXJuIGN1ck9iamVjdC5wcm9wZXJ0eVtuYW1lXTsgLy8gVE9ETyA6IHNob3VsZCB0aGVzZSBiZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGluc3RlYWQ/CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9OwoJdGhpcy5TZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CgkJLy8gTk9URSA6IGZvciBub3csIHdlIG5lZWQgdG8gZ2F1cmQgYWdhaW5zdCBjcmVhdGluZyBuZXcgcHJvcGVydGllcwoJCWlmIChjdXJPYmplY3QgJiYgY3VyT2JqZWN0LnByb3BlcnR5ICYmIGN1ck9iamVjdC5wcm9wZXJ0eS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewoJCQljdXJPYmplY3QucHJvcGVydHlbbmFtZV0gPSB2YWx1ZTsKCQl9Cgl9Owp9CgpmdW5jdGlvbiBsZWFkaW5nV2hpdGVzcGFjZShkZXB0aCkgewoJdmFyIHN0ciA9ICIiOwoJZm9yKHZhciBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKCQlzdHIgKz0gIiAgIjsgLy8gdHdvIHNwYWNlcyBwZXIgaW5kZW50Cgl9CgkvLyBiaXRzeS5sb2coIldISVRFU1BBQ0UgIiArIGRlcHRoICsgIiA6OiIgKyBzdHIgKyAiOjoiKTsKCXJldHVybiBzdHI7Cn0KCi8qIE5PREVTICovCnZhciBUcmVlUmVsYXRpb25zaGlwID0gZnVuY3Rpb24oKSB7Cgl0aGlzLnBhcmVudCA9IG51bGw7Cgl0aGlzLmNoaWxkcmVuID0gW107CgoJdGhpcy5BZGRDaGlsZCA9IGZ1bmN0aW9uKG5vZGUpIHsKCQl0aGlzLmNoaWxkcmVuLnB1c2gobm9kZSk7CgkJbm9kZS5wYXJlbnQgPSB0aGlzOwoJfTsKCgl0aGlzLkFkZENoaWxkcmVuID0gZnVuY3Rpb24obm9kZUxpc3QpIHsKCQlmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVMaXN0Lmxlbmd0aDsgaSsrKSB7CgkJCXRoaXMuQWRkQ2hpbGQobm9kZUxpc3RbaV0pOwoJCX0KCX07CgoJdGhpcy5TZXRDaGlsZHJlbiA9IGZ1bmN0aW9uKG5vZGVMaXN0KSB7CgkJdGhpcy5jaGlsZHJlbiA9IFtdOwoJCXRoaXMuQWRkQ2hpbGRyZW4obm9kZUxpc3QpOwoJfTsKCgl0aGlzLlZpc2l0QWxsID0gZnVuY3Rpb24odmlzaXRvciwgZGVwdGgpIHsKCQlpZiAoZGVwdGggPT0gdW5kZWZpbmVkIHx8IGRlcHRoID09IG51bGwpIHsKCQkJZGVwdGggPSAwOwoJCX0KCgkJdmlzaXRvci5WaXNpdCh0aGlzLCBkZXB0aCk7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CgkJCXRoaXMuY2hpbGRyZW5baV0uVmlzaXRBbGwoIHZpc2l0b3IsIGRlcHRoICsgMSApOwoJCX0KCX07CgoJdGhpcy5yb290SWQgPSBudWxsOyAvLyBmb3IgZGVidWdnaW5nCgl0aGlzLkdldElkID0gZnVuY3Rpb24oKSB7CgkJLy8gYml0c3kubG9nKHRoaXMpOwoJCWlmICh0aGlzLnJvb3RJZCAhPSBudWxsKSB7CgkJCXJldHVybiB0aGlzLnJvb3RJZDsKCQl9CgkJZWxzZSBpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCkgewoJCQl2YXIgcGFyZW50SWQgPSB0aGlzLnBhcmVudC5HZXRJZCgpOwoJCQlpZiAocGFyZW50SWQgIT0gbnVsbCkgewoJCQkJcmV0dXJuIHBhcmVudElkICsgIl8iICsgdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQp9CgpmdW5jdGlvbiBEaWFsb2dCbG9ja05vZGUoZG9JbmRlbnRGaXJzdExpbmUpIHsKCVRyZWVSZWxhdGlvbnNoaXAuY2FsbCh0aGlzKTsKCgl0aGlzLnR5cGUgPSAiZGlhbG9nX2Jsb2NrIjsKCgl0aGlzLkV2YWwgPSBmdW5jdGlvbihlbnZpcm9ubWVudCwgb25SZXR1cm4pIHsKCQkvLyBiaXRzeS5sb2coIkVWQUwgQkxPQ0sgIiArIHRoaXMuY2hpbGRyZW4ubGVuZ3RoKTsKCgkJaWYgKGlzUGxheWVyRW1iZWRkZWRJbkVkaXRvciAmJiBldmVudHMgIT0gdW5kZWZpbmVkICYmIGV2ZW50cyAhPSBudWxsKSB7CgkJCWV2ZW50cy5SYWlzZSgic2NyaXB0X25vZGVfZW50ZXIiLCB7IGlkOiB0aGlzLkdldElkKCkgfSk7CgkJfQoKCQl2YXIgbGFzdFZhbCA9IG51bGw7CgkJdmFyIGkgPSAwOwoKCQlmdW5jdGlvbiBldmFsQ2hpbGRyZW4oY2hpbGRyZW4sIGRvbmUpIHsKCQkJaWYgKGkgPCBjaGlsZHJlbi5sZW5ndGgpIHsKCQkJCS8vIGJpdHN5LmxvZygiPj4gQ0hJTEQgIiArIGkpOwoJCQkJY2hpbGRyZW5baV0uRXZhbChlbnZpcm9ubWVudCwgZnVuY3Rpb24odmFsKSB7CgkJCQkJLy8gYml0c3kubG9nKCI8PCBDSElMRCAiICsgaSk7CgkJCQkJbGFzdFZhbCA9IHZhbDsKCQkJCQlpKys7CgkJCQkJZXZhbENoaWxkcmVuKGNoaWxkcmVuLGRvbmUpOwoJCQkJfSk7CgkJCX0KCQkJZWxzZSB7CgkJCQlkb25lKCk7CgkJCX0KCQl9OwoKCQl2YXIgc2VsZiA9IHRoaXM7CgkJZXZhbENoaWxkcmVuKHRoaXMuY2hpbGRyZW4sIGZ1bmN0aW9uKCkgewoJCQlpZiAoaXNQbGF5ZXJFbWJlZGRlZEluRWRpdG9yICYmIGV2ZW50cyAhPSB1bmRlZmluZWQgJiYgZXZlbnRzICE9IG51bGwpIHsKCQkJCWV2ZW50cy5SYWlzZSgic2NyaXB0X25vZGVfZXhpdCIsIHsgaWQ6IHNlbGYuR2V0SWQoKSB9KTsKCQkJfQoKCQkJb25SZXR1cm4obGFzdFZhbCk7CgkJfSk7Cgl9CgoJaWYgKGRvSW5kZW50Rmlyc3RMaW5lID09PSB1bmRlZmluZWQpIHsKCQlkb0luZGVudEZpcnN0TGluZSA9IHRydWU7IC8vIFRoaXMgaXMganVzdCBmb3Igc2VyaWFsaXphdGlvbgoJfQoKCXRoaXMuU2VyaWFsaXplID0gZnVuY3Rpb24oZGVwdGgpIHsKCQlpZiAoZGVwdGggPT09IHVuZGVmaW5lZCkgewoJCQlkZXB0aCA9IDA7CgkJfQoKCQl2YXIgc3RyID0gIiI7CgkJdmFyIGxhc3ROb2RlID0gbnVsbDsKCgkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CgoJCQl2YXIgY3VyTm9kZSA9IHRoaXMuY2hpbGRyZW5baV07CgoJCQl2YXIgc2hvdWxkSW5kZW50Rmlyc3RMaW5lID0gKGkgPT0gMCAmJiBkb0luZGVudEZpcnN0TGluZSk7CgkJCXZhciBzaG91bGRJbmRlbnRBZnRlckxpbmVicmVhayA9IChsYXN0Tm9kZSAmJiBsYXN0Tm9kZS50eXBlID09PSAiZnVuY3Rpb24iICYmIGxhc3ROb2RlLm5hbWUgPT09ICJiciIpOwoKCQkJaWYgKHNob3VsZEluZGVudEZpcnN0TGluZSB8fCBzaG91bGRJbmRlbnRBZnRlckxpbmVicmVhaykgewoJCQkJc3RyICs9IGxlYWRpbmdXaGl0ZXNwYWNlKGRlcHRoKTsKCQkJfQoKCQkJc3RyICs9IGN1ck5vZGUuU2VyaWFsaXplKGRlcHRoKTsKCgkJCWxhc3ROb2RlID0gY3VyTm9kZTsKCQl9CgoJCXJldHVybiBzdHI7Cgl9CgoJdGhpcy5Ub1N0cmluZyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLkdldElkKCk7Cgl9Owp9CgpmdW5jdGlvbiBDb2RlQmxvY2tOb2RlKCkgewoJVHJlZVJlbGF0aW9uc2hpcC5jYWxsKHRoaXMpOwoKCXRoaXMudHlwZSA9ICJjb2RlX2Jsb2NrIjsKCgl0aGlzLkV2YWwgPSBmdW5jdGlvbihlbnZpcm9ubWVudCwgb25SZXR1cm4pIHsKCQkvLyBiaXRzeS5sb2coIkVWQUwgQkxPQ0sgIiArIHRoaXMuY2hpbGRyZW4ubGVuZ3RoKTsKCgkJaWYgKGlzUGxheWVyRW1iZWRkZWRJbkVkaXRvciAmJiBldmVudHMgIT0gdW5kZWZpbmVkICYmIGV2ZW50cyAhPSBudWxsKSB7CgkJCWV2ZW50cy5SYWlzZSgic2NyaXB0X25vZGVfZW50ZXIiLCB7IGlkOiB0aGlzLkdldElkKCkgfSk7CgkJfQoKCQl2YXIgbGFzdFZhbCA9IG51bGw7CgkJdmFyIGkgPSAwOwoKCQlmdW5jdGlvbiBldmFsQ2hpbGRyZW4oY2hpbGRyZW4sIGRvbmUpIHsKCQkJaWYgKGkgPCBjaGlsZHJlbi5sZW5ndGgpIHsKCQkJCS8vIGJpdHN5LmxvZygiPj4gQ0hJTEQgIiArIGkpOwoJCQkJY2hpbGRyZW5baV0uRXZhbChlbnZpcm9ubWVudCwgZnVuY3Rpb24odmFsKSB7CgkJCQkJLy8gYml0c3kubG9nKCI8PCBDSElMRCAiICsgaSk7CgkJCQkJbGFzdFZhbCA9IHZhbDsKCQkJCQlpKys7CgkJCQkJZXZhbENoaWxkcmVuKGNoaWxkcmVuLGRvbmUpOwoJCQkJfSk7CgkJCX0KCQkJZWxzZSB7CgkJCQlkb25lKCk7CgkJCX0KCQl9OwoKCQl2YXIgc2VsZiA9IHRoaXM7CgkJZXZhbENoaWxkcmVuKHRoaXMuY2hpbGRyZW4sIGZ1bmN0aW9uKCkgewoJCQlpZiAoaXNQbGF5ZXJFbWJlZGRlZEluRWRpdG9yICYmIGV2ZW50cyAhPSB1bmRlZmluZWQgJiYgZXZlbnRzICE9IG51bGwpIHsKCQkJCWV2ZW50cy5SYWlzZSgic2NyaXB0X25vZGVfZXhpdCIsIHsgaWQ6IHNlbGYuR2V0SWQoKSB9KTsKCQkJfQoKCQkJb25SZXR1cm4obGFzdFZhbCk7CgkJfSk7Cgl9CgoJdGhpcy5TZXJpYWxpemUgPSBmdW5jdGlvbihkZXB0aCkgewoJCWlmKGRlcHRoID09PSB1bmRlZmluZWQpIHsKCQkJZGVwdGggPSAwOwoJCX0KCgkJLy8gYml0c3kubG9nKCJTRVJJQUxJWkUgQkxPQ0shISEiKTsKCQkvLyBiaXRzeS5sb2coZGVwdGgpOwoJCS8vIGJpdHN5LmxvZyhkb0luZGVudEZpcnN0TGluZSk7CgoJCXZhciBzdHIgPSAieyI7IC8vIHRvZG86IGluY3JlYXNlIHNjb3BlIG9mIFN5bT8KCgkJLy8gVE9ETyA6IGRvIGNvZGUgYmxvY2tzIGV2ZXIgaGF2ZSBtb3JlIHRoYW4gb25lIGNoaWxkIGFueW1vcmU/Pz8/CgkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CgkJCXZhciBjdXJOb2RlID0gdGhpcy5jaGlsZHJlbltpXTsKCQkJc3RyICs9IGN1ck5vZGUuU2VyaWFsaXplKGRlcHRoKTsKCQl9CgoJCXN0ciArPSAifSI7CgoJCXJldHVybiBzdHI7Cgl9CgoJdGhpcy5Ub1N0cmluZyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLkdldElkKCk7Cgl9Owp9CgpmdW5jdGlvbiBpc0lubGluZUNvZGUobm9kZSkgewoJcmV0dXJuIGlzVGV4dEVmZmVjdEJsb2NrKG5vZGUpIHx8IGlzVW5kZWZpbmVkQmxvY2sobm9kZSkgfHwgaXNNdWx0aWxpbmVMaXN0QmxvY2sobm9kZSk7Cn0KCmZ1bmN0aW9uIGlzVW5kZWZpbmVkQmxvY2sobm9kZSkgewoJcmV0dXJuIG5vZGUudHlwZSA9PT0gImNvZGVfYmxvY2siICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiBub2RlLmNoaWxkcmVuWzBdLnR5cGUgPT09ICJ1bmRlZmluZWQiOwp9Cgp2YXIgdGV4dEVmZmVjdEJsb2NrTmFtZXMgPSBbImNscjEiLCAiY2xyMiIsICJjbHIzIiwgInd2eSIsICJzaGsiLCAicmJ3IiwgInByaW50U3ByaXRlIiwgInByaW50SXRlbSIsICJwcmludFRpbGUiLCAicHJpbnQiLCAic2F5IiwgImJyIl07CmZ1bmN0aW9uIGlzVGV4dEVmZmVjdEJsb2NrKG5vZGUpIHsKCWlmIChub2RlLnR5cGUgPT09ICJjb2RlX2Jsb2NrIikgewoJCWlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgbm9kZS5jaGlsZHJlblswXS50eXBlID09PSAiZnVuY3Rpb24iKSB7CgkJCXZhciBmdW5jID0gbm9kZS5jaGlsZHJlblswXTsKCQkJcmV0dXJuIHRleHRFZmZlY3RCbG9ja05hbWVzLmluZGV4T2YoZnVuYy5uYW1lKSAhPSAtMTsKCQl9Cgl9CglyZXR1cm4gZmFsc2U7Cn0KCnZhciBsaXN0QmxvY2tUeXBlcyA9IFsic2VxdWVuY2UiLCAiY3ljbGUiLCAic2h1ZmZsZSIsICJpZiJdOwpmdW5jdGlvbiBpc011bHRpbGluZUxpc3RCbG9jayhub2RlKSB7CglpZiAobm9kZS50eXBlID09PSAiY29kZV9ibG9jayIpIHsKCQlpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CgkJCXZhciBjaGlsZCA9IG5vZGUuY2hpbGRyZW5bMF07CgkJCXJldHVybiBsaXN0QmxvY2tUeXBlcy5pbmRleE9mKGNoaWxkLnR5cGUpICE9IC0xOwoJCX0KCX0KCXJldHVybiBmYWxzZTsKfQoKLy8gZm9yIHJvdW5kLXRyaXBwaW5nIHVuZGVmaW5lZCBjb2RlIHRocm91Z2ggdGhlIHBhcnNlciAodXNlZnVsIGZvciBoYWNrcyEpCmZ1bmN0aW9uIFVuZGVmaW5lZE5vZGUoc291cmNlU3RyKSB7CglUcmVlUmVsYXRpb25zaGlwLmNhbGwodGhpcyk7CgoJdGhpcy50eXBlID0gInVuZGVmaW5lZCI7Cgl0aGlzLnNvdXJjZSA9IHNvdXJjZVN0cjsKCgl0aGlzLkV2YWwgPSBmdW5jdGlvbihlbnZpcm9ubWVudCxvblJldHVybikgewoJCXRvZ2dsZVRleHRFZmZlY3QoZW52aXJvbm1lbnQsICJfZGVidWdfaGlnaGxpZ2h0Iik7CgkJc2F5RnVuYyhlbnZpcm9ubWVudCwgWyJ7IiArIHNvdXJjZVN0ciArICJ9Il0sIGZ1bmN0aW9uKCkgewoJCQlvblJldHVybihudWxsKTsKCQl9KTsKCQl0b2dnbGVUZXh0RWZmZWN0KGVudmlyb25tZW50LCAiX2RlYnVnX2hpZ2hsaWdodCIpOwoJfQoKCXRoaXMuU2VyaWFsaXplID0gZnVuY3Rpb24oZGVwdGgpIHsKCQlyZXR1cm4gdGhpcy5zb3VyY2U7Cgl9CgoJdGhpcy5Ub1N0cmluZyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiAidW5kZWZpbmVkIiArICIgIiArIHRoaXMuR2V0SWQoKTsKCX0KfQoKZnVuY3Rpb24gRnVuY05vZGUobmFtZSwgYXJncykgewoJVHJlZVJlbGF0aW9uc2hpcC5jYWxsKHRoaXMpOwoKCXRoaXMudHlwZSA9ICJmdW5jdGlvbiI7Cgl0aGlzLm5hbWUgPSBuYW1lOwoJdGhpcy5hcmdzID0gYXJnczsKCgl0aGlzLkV2YWwgPSBmdW5jdGlvbihlbnZpcm9ubWVudCxvblJldHVybikgewoJCWlmIChpc1BsYXllckVtYmVkZGVkSW5FZGl0b3IgJiYgZXZlbnRzICE9IHVuZGVmaW5lZCAmJiBldmVudHMgIT0gbnVsbCkgewoJCQlldmVudHMuUmFpc2UoInNjcmlwdF9ub2RlX2VudGVyIiwgeyBpZDogdGhpcy5HZXRJZCgpIH0pOwoJCX0KCgkJdmFyIHNlbGYgPSB0aGlzOyAvLyBoYWNrIHRvIGRlYWwgd2l0aCBzY29wZSAoVE9ETyA6IG1vdmUgdXAgaGlnaGVyPykKCgkJdmFyIGFyZ3VtZW50VmFsdWVzID0gW107CgkJdmFyIGkgPSAwOwoKCQlmdW5jdGlvbiBldmFsQXJncyhhcmdzLCBkb25lKSB7CgkJCS8vIFRPRE8gOiByZWFsbHkgaGFja3kgd2F5IHRvIG1ha2Ugd2UgZ2V0IHRoZSBmaXJzdAoJCQkvLyBzeW1ib2wncyBOQU1FIGluc3RlYWQgb2YgaXRzIHZhcmlhYmxlIHZhbHVlCgkJCS8vIGlmIHdlIGFyZSB0cnlpbmcgdG8gZG8gc29tZXRoaW5nIHdpdGggYSBwcm9wZXJ0eQoJCQlpZiAoc2VsZi5uYW1lID09PSAicHJvcGVydHkiICYmIGkgPT09IDAgJiYgaSA8IGFyZ3MubGVuZ3RoKSB7CgkJCQlpZiAoYXJnc1tpXS50eXBlID09PSAidmFyaWFibGUiKSB7CgkJCQkJYXJndW1lbnRWYWx1ZXMucHVzaChhcmdzW2ldLm5hbWUpOwoJCQkJCWkrKzsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCS8vIGZpcnN0IGFyZ3VtZW50IGZvciBhIHByb3BlcnR5IE1VU1QgYmUgYSB2YXJpYWJsZSBzeW1ib2wKCQkJCQkvLyAtLSBzbyBza2lwIGV2ZXJ5dGhpbmcgaWYgaXQncyBub3QhCgkJCQkJaSA9IGFyZ3MubGVuZ3RoOwoJCQkJfQoJCQl9CgoJCQlpZiAoaSA8IGFyZ3MubGVuZ3RoKSB7CgkJCQkvLyBFdmFsdWF0ZSBlYWNoIGFyZ3VtZW50CgkJCQlhcmdzW2ldLkV2YWwoCgkJCQkJZW52aXJvbm1lbnQsCgkJCQkJZnVuY3Rpb24odmFsKSB7CgkJCQkJCWFyZ3VtZW50VmFsdWVzLnB1c2godmFsKTsKCQkJCQkJaSsrOwoJCQkJCQlldmFsQXJncyhhcmdzLCBkb25lKTsKCQkJCQl9KTsKCQkJfQoJCQllbHNlIHsKCQkJCWRvbmUoKTsKCQkJfQoJCX07CgoJCWV2YWxBcmdzKAoJCQl0aGlzLmFyZ3MsCgkJCWZ1bmN0aW9uKCkgewoJCQkJaWYgKGlzUGxheWVyRW1iZWRkZWRJbkVkaXRvciAmJiBldmVudHMgIT0gdW5kZWZpbmVkICYmIGV2ZW50cyAhPSBudWxsKSB7CgkJCQkJZXZlbnRzLlJhaXNlKCJzY3JpcHRfbm9kZV9leGl0IiwgeyBpZDogc2VsZi5HZXRJZCgpIH0pOwoJCQkJfQoKCQkJCWVudmlyb25tZW50LkV2YWxGdW5jdGlvbihzZWxmLm5hbWUsIGFyZ3VtZW50VmFsdWVzLCBvblJldHVybik7CgkJCX0pOwoJfQoKCXRoaXMuU2VyaWFsaXplID0gZnVuY3Rpb24oZGVwdGgpIHsKCQl2YXIgaXNEaWFsb2dCbG9jayA9IHRoaXMucGFyZW50LnR5cGUgPT09ICJkaWFsb2dfYmxvY2siOwoJCWlmIChpc0RpYWxvZ0Jsb2NrICYmIHRoaXMubmFtZSA9PT0gInNheSIpIHsKCQkJLy8gVE9ETyB0aGlzIGNvdWxkIGNhdXNlIHByb2JsZW1zIHdpdGggInJlYWwiIHByaW50IGZ1bmN0aW9ucwoJCQlyZXR1cm4gdGhpcy5hcmdzWzBdLnZhbHVlOyAvLyBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIHRleHQgb2YgdGhlIHtwcmludH0gZnVuYwoJCX0KCQllbHNlIGlmIChpc0RpYWxvZ0Jsb2NrICYmIHRoaXMubmFtZSA9PT0gImJyIikgewoJCQlyZXR1cm4gIlxuIjsKCQl9CgkJZWxzZSB7CgkJCXZhciBzdHIgPSAiIjsKCQkJc3RyICs9IHRoaXMubmFtZTsKCQkJZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuYXJncy5sZW5ndGg7IGkrKykgewoJCQkJc3RyICs9ICIgIjsKCQkJCXN0ciArPSB0aGlzLmFyZ3NbaV0uU2VyaWFsaXplKGRlcHRoKTsKCQkJfQoJCQlyZXR1cm4gc3RyOwoJCX0KCX0KCgl0aGlzLlRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudHlwZSArICIgIiArIHRoaXMubmFtZSArICIgIiArIHRoaXMuR2V0SWQoKTsKCX07Cn0KCmZ1bmN0aW9uIExpdGVyYWxOb2RlKHZhbHVlKSB7CglUcmVlUmVsYXRpb25zaGlwLmNhbGwodGhpcyk7CgoJdGhpcy50eXBlID0gImxpdGVyYWwiOwoJdGhpcy52YWx1ZSA9IHZhbHVlOwoKCXRoaXMuRXZhbCA9IGZ1bmN0aW9uKGVudmlyb25tZW50LG9uUmV0dXJuKSB7CgkJb25SZXR1cm4odGhpcy52YWx1ZSk7Cgl9OwoKCXRoaXMuU2VyaWFsaXplID0gZnVuY3Rpb24oZGVwdGgpIHsKCQl2YXIgc3RyID0gIiI7CgoJCWlmICh0aGlzLnZhbHVlID09PSBudWxsKSB7CgkJCXJldHVybiBzdHI7CgkJfQoKCQlpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICJzdHJpbmciKSB7CgkJCXN0ciArPSAnIic7CgkJfQoKCQlzdHIgKz0gdGhpcy52YWx1ZTsKCgkJaWYgKHR5cGVvZiB0aGlzLnZhbHVlID09PSAic3RyaW5nIikgewoJCQlzdHIgKz0gJyInOwoJCX0KCgkJcmV0dXJuIHN0cjsKCX07CgoJdGhpcy5Ub1N0cmluZyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLnZhbHVlICsgIiAiICsgdGhpcy5HZXRJZCgpOwoJfTsKfQoKZnVuY3Rpb24gVmFyTm9kZShuYW1lKSB7CglUcmVlUmVsYXRpb25zaGlwLmNhbGwodGhpcyk7CgoJdGhpcy50eXBlID0gInZhcmlhYmxlIjsKCXRoaXMubmFtZSA9IG5hbWU7CgoJdGhpcy5FdmFsID0gZnVuY3Rpb24oZW52aXJvbm1lbnQsb25SZXR1cm4pIHsKCQkvLyBiaXRzeS5sb2coIkVWQUwgIiArIHRoaXMubmFtZSArICIgIiArIGVudmlyb25tZW50Lkhhc1ZhcmlhYmxlKHRoaXMubmFtZSkgKyAiICIgKyBlbnZpcm9ubWVudC5HZXRWYXJpYWJsZSh0aGlzLm5hbWUpKTsKCQlpZiggZW52aXJvbm1lbnQuSGFzVmFyaWFibGUodGhpcy5uYW1lKSApCgkJCW9uUmV0dXJuKCBlbnZpcm9ubWVudC5HZXRWYXJpYWJsZSggdGhpcy5uYW1lICkgKTsKCQllbHNlCgkJCW9uUmV0dXJuKG51bGwpOyAvLyBub3QgYSB2YWxpZCB2YXJpYWJsZSAtLSByZXR1cm4gbnVsbCBhbmQgaG9wZSB0aGF0J3Mgb2sKCX0gLy8gVE9ETzogbWlnaHQgd2FudCB0byBzdG9yZSBub2RlcyBpbiB0aGUgdmFyaWFibGVNYXAgaW5zdGVhZCBvZiB2YWx1ZXM/Pz8KCgl0aGlzLlNlcmlhbGl6ZSA9IGZ1bmN0aW9uKGRlcHRoKSB7CgkJdmFyIHN0ciA9ICIiICsgdGhpcy5uYW1lOwoJCXJldHVybiBzdHI7Cgl9CgoJdGhpcy5Ub1N0cmluZyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWUgKyAiICIgKyB0aGlzLkdldElkKCk7Cgl9Owp9CgpmdW5jdGlvbiBFeHBOb2RlKG9wZXJhdG9yLCBsZWZ0LCByaWdodCkgewoJVHJlZVJlbGF0aW9uc2hpcC5jYWxsKHRoaXMpOwoKCXRoaXMudHlwZSA9ICJvcGVyYXRvciI7Cgl0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7Cgl0aGlzLmxlZnQgPSBsZWZ0OwoJdGhpcy5yaWdodCA9IHJpZ2h0OwoKCXRoaXMuRXZhbCA9IGZ1bmN0aW9uKGVudmlyb25tZW50LG9uUmV0dXJuKSB7CgkJLy8gYml0c3kubG9nKCJFVkFMICIgKyB0aGlzLm9wZXJhdG9yKTsKCQl2YXIgc2VsZiA9IHRoaXM7IC8vIGhhY2sgdG8gZGVhbCB3aXRoIHNjb3BlCgkJZW52aXJvbm1lbnQuRXZhbE9wZXJhdG9yKCB0aGlzLm9wZXJhdG9yLCB0aGlzLmxlZnQsIHRoaXMucmlnaHQsIAoJCQlmdW5jdGlvbih2YWwpewoJCQkJLy8gYml0c3kubG9nKCJFVkFMIEVYUCAiICsgc2VsZi5vcGVyYXRvciArICIgIiArIHZhbCk7CgkJCQlvblJldHVybih2YWwpOwoJCQl9ICk7CgkJLy8gTk9URSA6IHNhZGx5IHRoaXMgcHVzaGVzIGEgbG90IG9mIGNvbXBsZXhpdHkgZG93biBvbnRvIHRoZSBhY3R1YWwgb3BlcmF0b3IgbWV0aG9kcwoJfTsKCgl0aGlzLlNlcmlhbGl6ZSA9IGZ1bmN0aW9uKGRlcHRoKSB7CgkJdmFyIGlzTmVnYXRpdmVOdW1iZXIgPSB0aGlzLm9wZXJhdG9yID09PSAiLSIgJiYgdGhpcy5sZWZ0LnR5cGUgPT09ICJsaXRlcmFsIiAmJiB0aGlzLmxlZnQudmFsdWUgPT09IG51bGw7CgoJCWlmICghaXNOZWdhdGl2ZU51bWJlcikgewoJCQl2YXIgc3RyID0gIiI7CgoJCQlpZiAodGhpcy5sZWZ0ICE9IHVuZGVmaW5lZCAmJiB0aGlzLmxlZnQgIT0gbnVsbCkgewoJCQkJc3RyICs9IHRoaXMubGVmdC5TZXJpYWxpemUoZGVwdGgpICsgIiAiOwoJCQl9CgoJCQlzdHIgKz0gdGhpcy5vcGVyYXRvcjsKCgkJCWlmICh0aGlzLnJpZ2h0ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9IG51bGwpIHsKCQkJCXN0ciArPSAiICIgKyB0aGlzLnJpZ2h0LlNlcmlhbGl6ZShkZXB0aCk7CgkJCX0KCgkJCXJldHVybiBzdHI7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gdGhpcy5vcGVyYXRvciArIHRoaXMucmlnaHQuU2VyaWFsaXplKGRlcHRoKTsgLy8gaGFja3kgYnV0IHNlZW1zIHRvIHdvcmsKCQl9Cgl9OwoKCXRoaXMuVmlzaXRBbGwgPSBmdW5jdGlvbih2aXNpdG9yLCBkZXB0aCkgewoJCWlmIChkZXB0aCA9PSB1bmRlZmluZWQgfHwgZGVwdGggPT0gbnVsbCkgewoJCQlkZXB0aCA9IDA7CgkJfQoKCQl2aXNpdG9yLlZpc2l0KCB0aGlzLCBkZXB0aCApOwoJCWlmKHRoaXMubGVmdCAhPSBudWxsKQoJCQl0aGlzLmxlZnQuVmlzaXRBbGwoIHZpc2l0b3IsIGRlcHRoICsgMSApOwoJCWlmKHRoaXMucmlnaHQgIT0gbnVsbCkKCQkJdGhpcy5yaWdodC5WaXNpdEFsbCggdmlzaXRvciwgZGVwdGggKyAxICk7Cgl9OwoKCXRoaXMuVG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5vcGVyYXRvciArICIgIiArIHRoaXMuR2V0SWQoKTsKCX07Cn0KCmZ1bmN0aW9uIFNlcXVlbmNlQmFzZSgpIHsKCVRyZWVSZWxhdGlvbnNoaXAuY2FsbCh0aGlzKTsKCgl0aGlzLlNlcmlhbGl6ZSA9IGZ1bmN0aW9uKGRlcHRoKSB7CgkJdmFyIHN0ciA9ICIiOwoJCXN0ciArPSB0aGlzLnR5cGUgKyAiXG4iOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewoJCQlzdHIgKz0gbGVhZGluZ1doaXRlc3BhY2UoZGVwdGggKyAxKSArIFN5bS5MaXN0ICsgIiAiOwoJCQlzdHIgKz0gdGhpcy5jaGlsZHJlbltpXS5TZXJpYWxpemUoZGVwdGggKyAyKTsKCQkJc3RyICs9ICJcbiI7CgkJfQoJCXN0ciArPSBsZWFkaW5nV2hpdGVzcGFjZShkZXB0aCk7CgkJcmV0dXJuIHN0cjsKCX07CgoJdGhpcy5WaXNpdEFsbCA9IGZ1bmN0aW9uKHZpc2l0b3IsIGRlcHRoKSB7CgkJaWYgKGRlcHRoID09IHVuZGVmaW5lZCB8fCBkZXB0aCA9PSBudWxsKSB7CgkJCWRlcHRoID0gMDsKCQl9CgoJCXZpc2l0b3IuVmlzaXQodGhpcywgZGVwdGgpOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewoJCQl0aGlzLmNoaWxkcmVuW2ldLlZpc2l0QWxsKCB2aXNpdG9yLCBkZXB0aCArIDEgKTsKCQl9Cgl9OwoKCXRoaXMuVG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5HZXRJZCgpOwoJfTsKfQoKZnVuY3Rpb24gU2VxdWVuY2VOb2RlKG9wdGlvbnMpIHsKCVNlcXVlbmNlQmFzZS5jYWxsKHRoaXMpOwoKCXRoaXMudHlwZSA9ICJzZXF1ZW5jZSI7Cgl0aGlzLkFkZENoaWxkcmVuKG9wdGlvbnMpOwoKCXZhciBpbmRleCA9IDA7Cgl0aGlzLkV2YWwgPSBmdW5jdGlvbihlbnZpcm9ubWVudCwgb25SZXR1cm4pIHsKCQkvLyBiaXRzeS5sb2coIlNFUVVFTkNFICIgKyBpbmRleCk7CgkJdGhpcy5jaGlsZHJlbltpbmRleF0uRXZhbChlbnZpcm9ubWVudCwgb25SZXR1cm4pOwoKCQl2YXIgbmV4dCA9IGluZGV4ICsgMTsKCQlpZiAobmV4dCA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoKSB7CgkJCWluZGV4ID0gbmV4dDsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIEN5Y2xlTm9kZShvcHRpb25zKSB7CglTZXF1ZW5jZUJhc2UuY2FsbCh0aGlzKTsKCgl0aGlzLnR5cGUgPSAiY3ljbGUiOwoJdGhpcy5BZGRDaGlsZHJlbihvcHRpb25zKTsKCgl2YXIgaW5kZXggPSAwOwoJdGhpcy5FdmFsID0gZnVuY3Rpb24oZW52aXJvbm1lbnQsIG9uUmV0dXJuKSB7CgkJLy8gYml0c3kubG9nKCJDWUNMRSAiICsgaW5kZXgpOwoJCXRoaXMuY2hpbGRyZW5baW5kZXhdLkV2YWwoZW52aXJvbm1lbnQsIG9uUmV0dXJuKTsKCgkJdmFyIG5leHQgPSBpbmRleCArIDE7CgkJaWYgKG5leHQgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aCkgewoJCQlpbmRleCA9IG5leHQ7CgkJfQoJCWVsc2UgewoJCQlpbmRleCA9IDA7CgkJfQoJfQp9CgpmdW5jdGlvbiBTaHVmZmxlTm9kZShvcHRpb25zKSB7CglTZXF1ZW5jZUJhc2UuY2FsbCh0aGlzKTsKCgl0aGlzLnR5cGUgPSAic2h1ZmZsZSI7Cgl0aGlzLkFkZENoaWxkcmVuKG9wdGlvbnMpOwoKCXZhciBvcHRpb25zU2h1ZmZsZWQgPSBbXTsKCWZ1bmN0aW9uIHNodWZmbGUob3B0aW9ucykgewoJCW9wdGlvbnNTaHVmZmxlZCA9IFtdOwoJCXZhciBvcHRpb25zVW5zaHVmZmxlZCA9IG9wdGlvbnMuc2xpY2UoKTsKCQl3aGlsZSAob3B0aW9uc1Vuc2h1ZmZsZWQubGVuZ3RoID4gMCkgewoJCQl2YXIgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG9wdGlvbnNVbnNodWZmbGVkLmxlbmd0aCk7CgkJCW9wdGlvbnNTaHVmZmxlZC5wdXNoKG9wdGlvbnNVbnNodWZmbGVkLnNwbGljZShpLDEpWzBdKTsKCQl9Cgl9CglzaHVmZmxlKHRoaXMuY2hpbGRyZW4pOwoKCXZhciBpbmRleCA9IDA7Cgl0aGlzLkV2YWwgPSBmdW5jdGlvbihlbnZpcm9ubWVudCwgb25SZXR1cm4pIHsKCQlvcHRpb25zU2h1ZmZsZWRbaW5kZXhdLkV2YWwoZW52aXJvbm1lbnQsIG9uUmV0dXJuKTsKCQkKCQlpbmRleCsrOwoJCWlmIChpbmRleCA+PSB0aGlzLmNoaWxkcmVuLmxlbmd0aCkgewoJCQlzaHVmZmxlKHRoaXMuY2hpbGRyZW4pOwoJCQlpbmRleCA9IDA7CgkJfQoJfQp9CgovLyBUT0RPIDogcmVuYW1lPyBDb25kaXRpb25hbE5vZGU/CmZ1bmN0aW9uIElmTm9kZShjb25kaXRpb25zLCByZXN1bHRzLCBpc1NpbmdsZUxpbmUpIHsKCVRyZWVSZWxhdGlvbnNoaXAuY2FsbCh0aGlzKTsKCgl0aGlzLnR5cGUgPSAiaWYiOwoKCWZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgewoJCXRoaXMuQWRkQ2hpbGQobmV3IENvbmRpdGlvblBhaXJOb2RlKGNvbmRpdGlvbnNbaV0sIHJlc3VsdHNbaV0pKTsKCX0KCgl2YXIgc2VsZiA9IHRoaXM7Cgl0aGlzLkV2YWwgPSBmdW5jdGlvbihlbnZpcm9ubWVudCwgb25SZXR1cm4pIHsKCQkvLyBiaXRzeS5sb2coIkVWQUwgSUYiKTsKCQl2YXIgaSA9IDA7CgkJZnVuY3Rpb24gVGVzdENvbmRpdGlvbigpIHsKCQkJc2VsZi5jaGlsZHJlbltpXS5FdmFsKGVudmlyb25tZW50LCBmdW5jdGlvbihyZXN1bHQpIHsKCQkJCWlmIChyZXN1bHQuY29uZGl0aW9uVmFsdWUgPT0gdHJ1ZSkgewoJCQkJCW9uUmV0dXJuKHJlc3VsdC5yZXN1bHRWYWx1ZSk7CgkJCQl9CgkJCQllbHNlIGlmIChpKzEgPCBzZWxmLmNoaWxkcmVuLmxlbmd0aCkgewoJCQkJCWkrKzsKCQkJCQlUZXN0Q29uZGl0aW9uKCk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlvblJldHVybihudWxsKTsKCQkJCX0KCQkJfSk7CgkJfTsKCQlUZXN0Q29uZGl0aW9uKCk7Cgl9OwoKCWlmIChpc1NpbmdsZUxpbmUgPT09IHVuZGVmaW5lZCkgewoJCWlzU2luZ2xlTGluZSA9IGZhbHNlOyAvLyBUaGlzIGlzIGp1c3QgZm9yIHNlcmlhbGl6YXRpb24KCX0KCgl0aGlzLlNlcmlhbGl6ZSA9IGZ1bmN0aW9uKGRlcHRoKSB7CgkJdmFyIHN0ciA9ICIiOwoJCWlmKGlzU2luZ2xlTGluZSkgewoJCQkvLyBIQUNLWSAtIHNob3VsZCBJIGV2ZW4ga2VlcCB0aGlzIG1vZGU/Pz8KCQkJc3RyICs9IHRoaXMuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uU2VyaWFsaXplKCkgKyAiID8gIiArIHRoaXMuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMV0uU2VyaWFsaXplKCk7CgkJCWlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEgJiYgdGhpcy5jaGlsZHJlblsxXS5jaGlsZHJlblswXS50eXBlID09PSBTeW0uRWxzZSkgewoJCQkJc3RyICs9ICIgIiArIFN5bS5FbHNlRXhwICsgIiAiICsgdGhpcy5jaGlsZHJlblsxXS5jaGlsZHJlblsxXS5TZXJpYWxpemUoKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJc3RyICs9ICJcbiI7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewoJCQkJc3RyICs9IHRoaXMuY2hpbGRyZW5baV0uU2VyaWFsaXplKGRlcHRoKTsKCQkJfQoJCQlzdHIgKz0gbGVhZGluZ1doaXRlc3BhY2UoZGVwdGgpOwoJCX0KCQlyZXR1cm4gc3RyOwoJfTsKCgl0aGlzLklzU2luZ2xlTGluZSA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiBpc1NpbmdsZUxpbmU7Cgl9OwoKCXRoaXMuVmlzaXRBbGwgPSBmdW5jdGlvbih2aXNpdG9yLCBkZXB0aCkgewoJCWlmIChkZXB0aCA9PSB1bmRlZmluZWQgfHwgZGVwdGggPT0gbnVsbCkgewoJCQlkZXB0aCA9IDA7CgkJfQoKCQl2aXNpdG9yLlZpc2l0KHRoaXMsIGRlcHRoKTsKCgkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CgkJCXRoaXMuY2hpbGRyZW5baV0uVmlzaXRBbGwodmlzaXRvciwgZGVwdGggKyAxKTsKCQl9Cgl9OwoKCXRoaXMuVG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5tb2RlICsgIiAiICsgdGhpcy5HZXRJZCgpOwoJfTsKfQoKZnVuY3Rpb24gQ29uZGl0aW9uUGFpck5vZGUoY29uZGl0aW9uLCByZXN1bHQpIHsKCVRyZWVSZWxhdGlvbnNoaXAuY2FsbCh0aGlzKTsKCgl0aGlzLnR5cGUgPSAiY29uZGl0aW9uX3BhaXIiOwoKCXRoaXMuQWRkQ2hpbGQoY29uZGl0aW9uKTsKCXRoaXMuQWRkQ2hpbGQocmVzdWx0KTsKCgl2YXIgc2VsZiA9IHRoaXM7CgoJdGhpcy5FdmFsID0gZnVuY3Rpb24oZW52aXJvbm1lbnQsIG9uUmV0dXJuKSB7CgkJc2VsZi5jaGlsZHJlblswXS5FdmFsKGVudmlyb25tZW50LCBmdW5jdGlvbihjb25kaXRpb25TdWNjZXNzKSB7CgkJCWlmIChjb25kaXRpb25TdWNjZXNzKSB7CgkJCQlzZWxmLmNoaWxkcmVuWzFdLkV2YWwoZW52aXJvbm1lbnQsIGZ1bmN0aW9uKHJlc3VsdFZhbHVlKSB7CgkJCQkJb25SZXR1cm4oeyBjb25kaXRpb25WYWx1ZTp0cnVlLCByZXN1bHRWYWx1ZTpyZXN1bHRWYWx1ZSB9KTsKCQkJCX0pOwoJCQl9CgkJCWVsc2UgewoJCQkJb25SZXR1cm4oeyBjb25kaXRpb25WYWx1ZTpmYWxzZSB9KTsKCQkJfQoJCX0pOwoJfTsKCgl0aGlzLlNlcmlhbGl6ZSA9IGZ1bmN0aW9uKGRlcHRoKSB7CgkJdmFyIHN0ciA9ICIiOwoJCXN0ciArPSBsZWFkaW5nV2hpdGVzcGFjZShkZXB0aCArIDEpOwoJCXN0ciArPSBTeW0uTGlzdCArICIgIiArIHRoaXMuY2hpbGRyZW5bMF0uU2VyaWFsaXplKGRlcHRoKSArICIgIiArIFN5bS5Db25kaXRpb25FbmQgKyBTeW0uTGluZWJyZWFrOwoJCXN0ciArPSB0aGlzLmNoaWxkcmVuWzFdLlNlcmlhbGl6ZShkZXB0aCArIDIpICsgU3ltLkxpbmVicmVhazsKCQlyZXR1cm4gc3RyOwoJfTsKCgl0aGlzLlZpc2l0QWxsID0gZnVuY3Rpb24odmlzaXRvciwgZGVwdGgpIHsKCQlpZiAoZGVwdGggPT0gdW5kZWZpbmVkIHx8IGRlcHRoID09IG51bGwpIHsKCQkJZGVwdGggPSAwOwoJCX0KCgkJdmlzaXRvci5WaXNpdCh0aGlzLCBkZXB0aCk7CgoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewoJCQl0aGlzLmNoaWxkcmVuW2ldLlZpc2l0QWxsKHZpc2l0b3IsIGRlcHRoICsgMSk7CgkJfQoJfTsKCgl0aGlzLlRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudHlwZSArICIgIiArIHRoaXMuR2V0SWQoKTsKCX07Cn0KCmZ1bmN0aW9uIEVsc2VOb2RlKCkgewoJVHJlZVJlbGF0aW9uc2hpcC5jYWxsKHRoaXMpOwoKCXRoaXMudHlwZSA9IFN5bS5FbHNlOwoKCXRoaXMuRXZhbCA9IGZ1bmN0aW9uKGVudmlyb25tZW50LCBvblJldHVybikgewoJCW9uUmV0dXJuKHRydWUpOwoJfTsKCgl0aGlzLlNlcmlhbGl6ZSA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiBTeW0uRWxzZTsKCX07CgoJdGhpcy5Ub1N0cmluZyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm1vZGUgKyAiICIgKyB0aGlzLkdldElkKCk7Cgl9Owp9Cgp2YXIgU3ltID0gewoJRGlhbG9nT3BlbiA6ICciIiInLAoJRGlhbG9nQ2xvc2UgOiAnIiIiJywKCUNvZGVPcGVuIDogInsiLAoJQ29kZUNsb3NlIDogIn0iLAoJTGluZWJyZWFrIDogIlxuIiwgLy8ganVzdCBjYWxsIGl0ICJicmVhayIgPwoJU2VwYXJhdG9yIDogIjoiLAoJTGlzdCA6ICItIiwKCVN0cmluZyA6ICciJywKCUNvbmRpdGlvbkVuZCA6ICI/IiwKCUVsc2UgOiAiZWxzZSIsCglFbHNlRXhwIDogIjoiLCAvLyBzcGVjaWFsIHNob3J0aGFuZCBmb3IgZXhwcmVzc2lvbnMgKGRlcHJlY2F0ZT8pCglTZXQgOiAiPSIsCglPcGVyYXRvcnMgOiBbIj09IiwgIj49IiwgIjw9IiwgIj4iLCAiPCIsICItIiwgIisiLCAiLyIsICIqIl0sIC8vIG9wZXJhdG9ycyBuZWVkIHRvIGJlIGluIHJldmVyc2Ugb3JkZXIgb2YgcHJlY2VkZW5jZQp9OwoKdmFyIFBhcnNlciA9IGZ1bmN0aW9uKGVudikgewoJdmFyIGVudmlyb25tZW50ID0gZW52OwoKCXRoaXMuUGFyc2UgPSBmdW5jdGlvbihzY3JpcHRTdHIsIHJvb3RJZCkgewoJCXZhciByb290Tm9kZSA9IG5ldyBEaWFsb2dCbG9ja05vZGUoKTsKCQlyb290Tm9kZS5yb290SWQgPSByb290SWQ7CgkJdmFyIHN0YXRlID0gbmV3IFBhcnNlclN0YXRlKHJvb3ROb2RlLCBzY3JpcHRTdHIpOwoKCQlpZiAoc3RhdGUuTWF0Y2hBaGVhZChTeW0uRGlhbG9nT3BlbikpIHsKCQkJLy8gbXVsdGktbGluZSBkaWFsb2cgYmxvY2sKCQkJdmFyIGRpYWxvZ1N0ciA9IHN0YXRlLkNvbnN1bWVCbG9jayhTeW0uRGlhbG9nT3BlbiArIFN5bS5MaW5lYnJlYWssIFN5bS5MaW5lYnJlYWsgKyBTeW0uRGlhbG9nQ2xvc2UpOwoJCQlyb290Tm9kZSA9IG5ldyBEaWFsb2dCbG9ja05vZGUoKTsKCQkJcm9vdE5vZGUucm9vdElkID0gcm9vdElkOyAvLyBoYWNreSEhCgkJCXN0YXRlID0gbmV3IFBhcnNlclN0YXRlKHJvb3ROb2RlLCBkaWFsb2dTdHIpOwoJCQlzdGF0ZSA9IFBhcnNlRGlhbG9nKHN0YXRlKTsKCQl9CgkJZWxzZSB7CgkJCS8vIHNpbmdsZS1saW5lIGRpYWxvZyBibG9jawoJCQlzdGF0ZSA9IFBhcnNlRGlhbG9nKHN0YXRlKTsKCQl9CgoJCXJldHVybiBzdGF0ZS5yb290Tm9kZTsKCX07CgoJdmFyIFBhcnNlclN0YXRlID0gZnVuY3Rpb24oIHJvb3ROb2RlLCBzdHIgKSB7CgkJdGhpcy5yb290Tm9kZSA9IHJvb3ROb2RlOwoJCXRoaXMuY3VyTm9kZSA9IHRoaXMucm9vdE5vZGU7CgoJCXZhciBzb3VyY2VTdHIgPSBzdHI7CgkJdmFyIGkgPSAwOwoJCXRoaXMuSW5kZXggPSBmdW5jdGlvbigpIHsgcmV0dXJuIGk7IH07CgkJdGhpcy5Db3VudCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc291cmNlU3RyLmxlbmd0aDsgfTsKCQl0aGlzLkRvbmUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGkgPj0gc291cmNlU3RyLmxlbmd0aDsgfTsKCQl0aGlzLkNoYXIgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNvdXJjZVN0cltpXTsgfTsKCQl0aGlzLlN0ZXAgPSBmdW5jdGlvbihuKSB7IGlmKG49PT11bmRlZmluZWQpIG49MTsgaSArPSBuOyB9OwoJCXRoaXMuTWF0Y2hBaGVhZCA9IGZ1bmN0aW9uKHN0cikgewoJCQkvLyBiaXRzeS5sb2coc3RyKTsKCQkJc3RyID0gIiIgKyBzdHI7IC8vIGhhY2sgdG8gdHVybiBzaW5nbGUgY2hhcnMgaW50byBzdHJpbmdzCgkJCS8vIGJpdHN5LmxvZyhzdHIpOwoJCQkvLyBiaXRzeS5sb2coc3RyLmxlbmd0aCk7CgkJCWZvciAodmFyIGogPSAwOyBqIDwgc3RyLmxlbmd0aDsgaisrKSB7CgkJCQlpZiAoaSArIGogPj0gc291cmNlU3RyLmxlbmd0aCkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCWVsc2UgaWYgKHN0cltqXSAhPSBzb3VyY2VTdHJbaStqXSkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJdGhpcy5QZWFrID0gZnVuY3Rpb24oZW5kKSB7CgkJCXZhciBzdHIgPSAiIjsKCQkJdmFyIGogPSBpOwoJCQkvLyBiaXRzeS5sb2coaik7CgkJCXdoaWxlIChqIDwgc291cmNlU3RyLmxlbmd0aCAmJiBlbmQuaW5kZXhPZihzb3VyY2VTdHJbal0pID09IC0xKSB7CgkJCQlzdHIgKz0gc291cmNlU3RyW2pdOwoJCQkJaisrOwoJCQl9CgkJCS8vIGJpdHN5LmxvZygiUEVBSyA6OiIgKyBzdHIgKyAiOjoiKTsKCQkJcmV0dXJuIHN0cjsKCQl9CgkJdGhpcy5Db25zdW1lQmxvY2sgPSBmdW5jdGlvbihvcGVuLCBjbG9zZSwgaW5jbHVkZVN5bWJvbHMpIHsKCQkJaWYgKGluY2x1ZGVTeW1ib2xzID09PSB1bmRlZmluZWQgfHwgaW5jbHVkZVN5bWJvbHMgPT09IG51bGwpIHsKCQkJCWluY2x1ZGVTeW1ib2xzID0gZmFsc2U7CgkJCX0KCgkJCXZhciBzdGFydEluZGV4ID0gaTsKCgkJCXZhciBtYXRjaENvdW50ID0gMDsKCQkJaWYgKHRoaXMuTWF0Y2hBaGVhZChvcGVuKSkgewoJCQkJbWF0Y2hDb3VudCsrOwoJCQkJdGhpcy5TdGVwKG9wZW4ubGVuZ3RoKTsKCQkJfQoKCQkJd2hpbGUgKG1hdGNoQ291bnQgPiAwICYmICF0aGlzLkRvbmUoKSkgewoJCQkJaWYgKHRoaXMuTWF0Y2hBaGVhZChjbG9zZSkpIHsKCQkJCQltYXRjaENvdW50LS07CgkJCQkJdGhpcy5TdGVwKCBjbG9zZS5sZW5ndGggKTsKCQkJCX0KCQkJCWVsc2UgaWYgKHRoaXMuTWF0Y2hBaGVhZChvcGVuKSkgewoJCQkJCW1hdGNoQ291bnQrKzsKCQkJCQl0aGlzLlN0ZXAob3Blbi5sZW5ndGgpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJdGhpcy5TdGVwKCk7CgkJCQl9CgkJCX0KCgkJCWlmIChpbmNsdWRlU3ltYm9scykgewoJCQkJcmV0dXJuIHNvdXJjZVN0ci5zbGljZShzdGFydEluZGV4LCBpKTsKCQkJfQoJCQllbHNlIHsKCQkJCXJldHVybiBzb3VyY2VTdHIuc2xpY2Uoc3RhcnRJbmRleCArIG9wZW4ubGVuZ3RoLCBpIC0gY2xvc2UubGVuZ3RoKTsKCQkJfQoJCX0KCgkJdGhpcy5QcmludCA9IGZ1bmN0aW9uKCkgeyBiaXRzeS5sb2coc291cmNlU3RyKTsgfTsKCQl0aGlzLlNvdXJjZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc291cmNlU3RyOyB9OwoJfTsKCgkvKgoJCVBhcnNlRGlhbG9nKCk6CgkJVGhpcyBmdW5jdGlvbiBhZGRzIHtwcmludH0gbm9kZXMgYW5kIGxpbmVicmVhayB7YnJ9IG5vZGVzIHRvIGRpc3BsYXkgdGV4dCwKCQlpbnRlcmxlYXZlZCB3aXRoIGJyYWNrZXRlZCBjb2RlIG5vZGVzIGZvciBmdW5jdGlvbnMgYW5kIGZsb3cgY29udHJvbCwKCQlzdWNoIGFzIHRleHQgZWZmZWN0cyB7c2hrfSB7d3Z5fSBvciBzZXF1ZW5jZXMgbGlrZSB7Y3ljbGV9IGFuZCB7c2h1ZmZsZX0uCgkJVGhlIHBhcnNpbmcgb2YgdGhvc2UgY29kZSBibG9ja3MgaXMgaGFuZGxlZCBieSBQYXJzZUNvZGUuCgoJCU5vdGUgb24gcGFyc2luZyBuZXdsaW5lIGNoYXJhY3RlcnM6CgkJLSB0aGVyZSBzaG91bGQgYmUgYW4gaW1wbGljaXQgbGluZWJyZWFrIHticn0gYWZ0ZXIgZWFjaCBkaWFsb2cgbGluZQoJCS0gYSAiZGlhbG9nIGxpbmUiIGlzIGRlZmluZWQgYXMgYW55IGxpbmUgdGhhdCBlaXRoZXI6CgkJCS0gMSkgY29udGFpbnMgZGlhbG9nIHRleHQgKGFueSB0ZXh0IG91dHNpZGUgb2YgYSBjb2RlIGJsb2NrKQoJCQktIDIpIGlzIGVudGlyZWx5IGVtcHR5IChubyB0ZXh0LCBubyBjb2RlKQoJCQktICpvciogMykgY29udGFpbnMgYSBsaXN0IGJsb2NrIChzZXF1ZW5jZSwgY3ljbGUsIHNodWZmbGUsIG9yIGNvbmRpdGlvbmFsKQoJCS0gbGluZXMgKm9ubHkqIGNvbnRhaW5pbmcge2NvZGV9IGJsb2NrcyBhcmUgbm90IGRpYWxvZyBsaW5lcwoKCQlOT1RFIFRPIFNFTEY6IGFsbCB0aGUgc3RhdGUgSSdtIHN0b3JpbmcgaW4gaGVyZSBmZWVscyBsaWtlCgkJZXZpZGVuY2UgdGhhdCB0aGUgcGFyc2luZyBzeXN0ZW0ga2luZCBvZiBicm9rZSBkb3duIGF0IHRoaXMgcG9pbnQgOigKCQlNYXliZSBpdCB3b3VsZCBmZWVsIGJldHRlciBpZiBJIG1vdmUgaW50byB0aGUgInN0YXRlIiBvYmplY3QKCSovCglmdW5jdGlvbiBQYXJzZURpYWxvZyhzdGF0ZSkgewoJCXZhciBjdXJMaW5lTm9kZUxpc3QgPSBbXTsKCQl2YXIgY3VyVGV4dCA9ICIiOwoJCXZhciBjdXJMaW5lSXNFbXB0eSA9IHRydWU7CgkJdmFyIGN1ckxpbmVDb250YWluc0RpYWxvZ1RleHQgPSBmYWxzZTsKCQl2YXIgcHJldkxpbmVJc0RpYWxvZ0xpbmUgPSBmYWxzZTsKCgkJdmFyIGN1ckxpbmVJc0RpYWxvZ0xpbmUgPSBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGN1ckxpbmVDb250YWluc0RpYWxvZ1RleHQgfHwgY3VyTGluZUlzRW1wdHk7CgkJfQoKCQl2YXIgcmVzZXRMaW5lU3RhdGVGb3JOZXdMaW5lID0gZnVuY3Rpb24oKSB7CgkJCXByZXZMaW5lSXNEaWFsb2dMaW5lID0gY3VyTGluZUlzRGlhbG9nTGluZSgpOwoJCQljdXJMaW5lQ29udGFpbnNEaWFsb2dUZXh0ID0gZmFsc2U7CgkJCWN1ckxpbmVJc0VtcHR5ID0gdHJ1ZTsKCQkJY3VyVGV4dCA9ICIiOwoJCQljdXJMaW5lTm9kZUxpc3QgPSBbXTsKCQl9CgoJCXZhciB0cnlBZGRUZXh0Tm9kZVRvTGlzdCA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoY3VyVGV4dC5sZW5ndGggPiAwKSB7CgkJCQl2YXIgc2F5Tm9kZSA9IG5ldyBGdW5jTm9kZSgic2F5IiwgW25ldyBMaXRlcmFsTm9kZShjdXJUZXh0KV0pOwoJCQkJY3VyTGluZU5vZGVMaXN0LnB1c2goc2F5Tm9kZSk7CgoJCQkJY3VyVGV4dCA9ICIiOwoJCQkJY3VyTGluZUlzRW1wdHkgPSBmYWxzZTsKCQkJCWN1ckxpbmVDb250YWluc0RpYWxvZ1RleHQgPSB0cnVlOwoJCQl9CgkJfQoKCQl2YXIgYWRkQ29kZU5vZGVUb0xpc3QgPSBmdW5jdGlvbigpIHsKCQkJdmFyIGNvZGVTb3VyY2UgPSBzdGF0ZS5Db25zdW1lQmxvY2soU3ltLkNvZGVPcGVuLCBTeW0uQ29kZUNsb3NlKTsKCQkJdmFyIGNvZGVTdGF0ZSA9IG5ldyBQYXJzZXJTdGF0ZShuZXcgQ29kZUJsb2NrTm9kZSgpLCBjb2RlU291cmNlKTsKCQkJY29kZVN0YXRlID0gUGFyc2VDb2RlKGNvZGVTdGF0ZSk7CgkJCXZhciBjb2RlQmxvY2tOb2RlID0gY29kZVN0YXRlLnJvb3ROb2RlOwoJCQljdXJMaW5lTm9kZUxpc3QucHVzaChjb2RlQmxvY2tOb2RlKTsKCgkJCWN1ckxpbmVJc0VtcHR5ID0gZmFsc2U7CgoJCQkvLyBsaXN0cyBjb3VudCBhcyBkaWFsb2cgdGV4dCwgYmVjYXVzZSB0aGV5IGNhbiBjb250YWluIGl0CgkJCWlmIChpc011bHRpbGluZUxpc3RCbG9jayhjb2RlQmxvY2tOb2RlKSkgewoJCQkJY3VyTGluZUNvbnRhaW5zRGlhbG9nVGV4dCA9IHRydWU7CgkJCX0KCQl9CgoJCXZhciB0cnlBZGRMaW5lYnJlYWtOb2RlVG9MaXN0ID0gZnVuY3Rpb24oKSB7CgkJCWlmIChwcmV2TGluZUlzRGlhbG9nTGluZSkgewoJCQkJdmFyIGxpbmVicmVha05vZGUgPSBuZXcgRnVuY05vZGUoImJyIiwgW10pOwoJCQkJY3VyTGluZU5vZGVMaXN0LnVuc2hpZnQobGluZWJyZWFrTm9kZSk7CgkJCX0KCQl9CgoJCXZhciBhZGRMaW5lTm9kZXNUb1BhcmVudCA9IGZ1bmN0aW9uKCkgewoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGN1ckxpbmVOb2RlTGlzdC5sZW5ndGg7IGkrKykgewoJCQkJc3RhdGUuY3VyTm9kZS5BZGRDaGlsZChjdXJMaW5lTm9kZUxpc3RbaV0pOwoJCQl9CgkJfQoKCQl3aGlsZSAoIXN0YXRlLkRvbmUoKSkgewoJCQlpZiAoc3RhdGUuTWF0Y2hBaGVhZChTeW0uQ29kZU9wZW4pKSB7IC8vIHByb2Nlc3MgY29kZSBibG9jawoJCQkJLy8gYWRkIGFueSBidWZmZXJlZCB0ZXh0IHRvIGEgcHJpbnQgbm9kZSwgYW5kIHBhcnNlIHRoZSBjb2RlCgkJCQl0cnlBZGRUZXh0Tm9kZVRvTGlzdCgpOwoJCQkJYWRkQ29kZU5vZGVUb0xpc3QoKTsKCQkJfQoJCQllbHNlIGlmIChzdGF0ZS5NYXRjaEFoZWFkKFN5bS5MaW5lYnJlYWspKSB7IC8vIHByb2Nlc3MgbmV3IGxpbmUKCQkJCS8vIGFkZCBhbnkgYnVmZmVyZWQgdGV4dCB0byBhIHByaW50IG5vZGUsIAoJCQkJLy8gYW5kIGFkZCBhIGxpbmVicmVhayBpZiB3ZSBhcmUgYmV0d2VlbiB0d28gZGlhbG9nIGxpbmVzCgkJCQl0cnlBZGRUZXh0Tm9kZVRvTGlzdCgpOwoJCQkJdHJ5QWRkTGluZWJyZWFrTm9kZVRvTGlzdCgpOwoKCQkJCS8vIHNpbmNlIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiBhIGxpbmUKCQkJCS8vIGFkZCBzdG9yZWQgbm9kZXMgZm9yIHRoaXMgbGluZSB0byB0aGUgcGFyZW50IG5vZGUgd2UgYXJlIGJ1aWxkaW5nLAoJCQkJLy8gYW5kIHJlc2V0IHN0YXRlIGZvciB0aGUgbmV4dCBsaW5lCgkJCQlhZGRMaW5lTm9kZXNUb1BhcmVudCgpOwoJCQkJcmVzZXRMaW5lU3RhdGVGb3JOZXdMaW5lKCk7CgoJCQkJc3RhdGUuU3RlcCgpOwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gY29udGludWUgYWRkaW5nIHRleHQgdG8gdGhlIGN1cnJlbnQgdGV4dCBidWZmZXIKCQkJCWN1clRleHQgKz0gc3RhdGUuQ2hhcigpOwoJCQkJc3RhdGUuU3RlcCgpOwoJCQl9CgkJfQoKCQkvLyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgbGVhdmUgYW55dGhpbmcgYmVoaW5kOgoJCS8vIGFkZCBidWZmZXJlZCB0ZXh0IHRvIGEgcHJpbnQgbm9kZSBhbmQgYWRkIGFsbCBub2RlcwoJCS8vIHRvIHRoZSBjdXJyZW50IHBhcmVudCBub2RlCgkJdHJ5QWRkVGV4dE5vZGVUb0xpc3QoKTsKCQl0cnlBZGRMaW5lYnJlYWtOb2RlVG9MaXN0KCk7CgkJYWRkTGluZU5vZGVzVG9QYXJlbnQoKTsKCgkJcmV0dXJuIHN0YXRlOwoJfQoKCWZ1bmN0aW9uIFBhcnNlRGlhbG9nQmxvY2soc3RhdGUpIHsKCQl2YXIgZGlhbG9nU3RyID0gc3RhdGUuQ29uc3VtZUJsb2NrKCBTeW0uRGlhbG9nT3BlbiwgU3ltLkRpYWxvZ0Nsb3NlICk7CgoJCXZhciBkaWFsb2dTdGF0ZSA9IG5ldyBQYXJzZXJTdGF0ZShuZXcgRGlhbG9nQmxvY2tOb2RlKCksIGRpYWxvZ1N0cik7CgkJZGlhbG9nU3RhdGUgPSBQYXJzZURpYWxvZyggZGlhbG9nU3RhdGUgKTsKCgkJc3RhdGUuY3VyTm9kZS5BZGRDaGlsZCggZGlhbG9nU3RhdGUucm9vdE5vZGUgKTsKCgkJcmV0dXJuIHN0YXRlOwoJfQoKCS8qCgkJUGFyc2VDb25kaXRpb25hbCgpOgoJCUEgY29uZGl0aW9uYWwgY29udGFpbnMgYSBsaXN0IG9mIGNvbmRpdGlvbnMgdGhhdCBjYW4gYmUKCQlldmFsdWF0ZWQgdG8gdHJ1ZSBvciBmYWxzZSwgZm9sbG93ZWQgYnkgbW9yZSBkaWFsb2cKCQl0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4gVGhlIGZpcnN0CgkJdHJ1ZSBjb25kaXRpb24gaXMgdGhlIG9uZSB0aGF0IGdldHMgZXZhbHVhdGVkLgoJKi8KCWZ1bmN0aW9uIFBhcnNlQ29uZGl0aW9uYWwoc3RhdGUpIHsKCQl2YXIgY29uZGl0aW9uU3RyaW5ncyA9IFtdOwoJCXZhciByZXN1bHRTdHJpbmdzID0gW107CgkJdmFyIGN1ckluZGV4ID0gLTE7CgkJdmFyIHJlcXVpcmVkTGVhZGluZ1doaXRlc3BhY2UgPSAtMTsKCgkJLy8gVE9ETyA6IHZlcnkgc2ltaWxhciB0byBzZXF1ZW5jZSBwYXJzaW5nIC0gY2FuIHdlIHNoYXJlIGFueXRoaW5nPwoJCWZ1bmN0aW9uIHBhcnNlQ29uZGl0aW9uYWxJdGVtTGluZShzdGF0ZSkgewoJCQl2YXIgbGluZVRleHQgPSAiIjsKCQkJdmFyIHdoaXRlc3BhY2VDb3VudCA9IDA7CgkJCXZhciBpc05ld0NvbmRpdGlvbiA9IGZhbHNlOwoJCQl2YXIgZW5jb3VudGVyZWROb25XaGl0ZXNwYWNlID0gZmFsc2U7CgkJCXZhciBlbmNvdW50ZXJlZENvbmRpdGlvbkVuZCA9IGZhbHNlOwoKCQkJd2hpbGUgKCFzdGF0ZS5Eb25lKCkgJiYgIShzdGF0ZS5DaGFyKCkgPT09IFN5bS5MaW5lYnJlYWspKSB7CgkJCQkvLyBjb3VudCB3aGl0ZXNwYWNlIHVudGlsIHdlIGhpdCB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyCgkJCQlpZiAoIWVuY291bnRlcmVkTm9uV2hpdGVzcGFjZSkgewoJCQkJCWlmIChzdGF0ZS5DaGFyKCkgPT09ICIgIiB8fCBzdGF0ZS5DaGFyKCkgPT09ICJcdCIpIHsKCQkJCQkJd2hpdGVzcGFjZUNvdW50Kys7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQllbmNvdW50ZXJlZE5vbldoaXRlc3BhY2UgPSB0cnVlOwoKCQkJCQkJaWYgKHN0YXRlLkNoYXIoKSA9PT0gU3ltLkxpc3QpIHsKCQkJCQkJCWlzTmV3Q29uZGl0aW9uID0gdHJ1ZTsKCQkJCQkJCXdoaXRlc3BhY2VDb3VudCArPSAyOyAvLyBjb3VudCB0aGUgbGlzdCBzZXBlcmF0b3IgQU5EIHRoZSBmb2xsb3dpbmcgZXh0cmEgc3BhY2UKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBpZiB0aGlzIGlzIHRoZSBjb25kaXRpb24sIHdlIG5lZWQgdG8gdHJhY2sgd2hldGhlciB3ZSd2ZQoJCQkJLy8gcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjb25kaXRpb24KCQkJCWlmIChpc05ld0NvbmRpdGlvbiAmJiAhZW5jb3VudGVyZWRDb25kaXRpb25FbmQpIHsKCQkJCQlpZiAoc3RhdGUuQ2hhcigpID09PSBTeW0uQ29uZGl0aW9uRW5kKSB7CgkJCQkJCWVuY291bnRlcmVkQ29uZGl0aW9uRW5kID0gdHJ1ZTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gYWRkIGNoYXJhY3RlcnMgb25lIGF0IGEgdGltZSwgdW5sZXNzIGl0J3MgYSBjb2RlIGJsb2NrCgkJCQkvLyBzaW5jZSBjb2RlIGJsb2NrcyBjYW4gY29udGFpbiBhZGRpdGlvbmFsIHNlcXVlbmNlcyBpbnNpZGUKCQkJCS8vIHRoZW0gdGhhdCB3aWxsIG1lc3MgdXAgb3VyIGxpc3QgaXRlbSBkZXRlY3Rpb24KCQkJCWlmIChzdGF0ZS5DaGFyKCkgPT09IFN5bS5Db2RlT3BlbikgewoJCQkJCWxpbmVUZXh0ICs9IHN0YXRlLkNvbnN1bWVCbG9jayhTeW0uQ29kZU9wZW4sIFN5bS5Db2RlQ2xvc2UsIHRydWUgLyppbmNsdWRlU3ltYm9scyovKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCWlmICghZW5jb3VudGVyZWRDb25kaXRpb25FbmQpIHsgLy8gc2tpcCBhbGwgY2hhcmFjdGVycyBpbmNsdWRpbmcgJiBhZnRlciB0aGUgY29uZGl0aW9uIGVuZAoJCQkJCQlsaW5lVGV4dCArPSBzdGF0ZS5DaGFyKCk7CgkJCQkJfQoJCQkJCXN0YXRlLlN0ZXAoKTsKCQkJCX0KCQkJfQoKCQkJaWYgKHN0YXRlLkNoYXIoKSA9PT0gU3ltLkxpbmVicmVhaykgewoJCQkJc3RhdGUuU3RlcCgpOwoJCQl9CgoJCQlyZXR1cm4geyB0ZXh0OmxpbmVUZXh0LCB3aGl0ZXNwYWNlOndoaXRlc3BhY2VDb3VudCwgaXNOZXdDb25kaXRpb246aXNOZXdDb25kaXRpb24gfTsKCQl9CgoJCS8vIFRPRE8gOiB0aGlzIGlzIGNvcGllZCBmcm9tIHNlcXVlbmNlIHBhcnNpbmc7IHNoYXJlPwoJCWZ1bmN0aW9uIHRyaW1MZWFkaW5nV2hpdGVzcGFjZSh0ZXh0LCB0cmltTGVuZ3RoKSB7CgkJCXZhciB0ZXh0U3BsaXQgPSB0ZXh0LnNwbGl0KFN5bS5saW5lYnJlYWspOwoJCQl0ZXh0U3BsaXQgPSB0ZXh0U3BsaXQubWFwKGZ1bmN0aW9uKGxpbmUpIHsgcmV0dXJuIGxpbmUuc2xpY2UodHJpbUxlbmd0aCkgfSk7CgkJCXJldHVybiB0ZXh0U3BsaXQuam9pbihTeW0ubGluZWJyZWFrKTsKCQl9CgoJCXdoaWxlICghc3RhdGUuRG9uZSgpKSB7CgkJCXZhciBsaW5lUmVzdWx0cyA9IHBhcnNlQ29uZGl0aW9uYWxJdGVtTGluZShzdGF0ZSk7CgoJCQlpZiAobGluZVJlc3VsdHMuaXNOZXdDb25kaXRpb24pIHsKCQkJCXJlcXVpcmVkTGVhZGluZ1doaXRlc3BhY2UgPSBsaW5lUmVzdWx0cy53aGl0ZXNwYWNlOwoJCQkJY3VySW5kZXgrKzsKCQkJCWNvbmRpdGlvblN0cmluZ3NbY3VySW5kZXhdID0gIiI7CgkJCQlyZXN1bHRTdHJpbmdzW2N1ckluZGV4XSA9ICIiOwoJCQl9CgoJCQkvLyB0byBhdm9pZCBleHRyYSBuZXdsaW5lcyBpbiBuZXN0ZWQgY29uZGl0aW9uYWxzLCBvbmx5IGNvdW50IGxpbmVzCgkJCS8vIHRoYXQgYXQgbGVhc3QgbWF0Y2ggdGhlIHdoaXRlc3BhY2UgY291bnQgb2YgdGhlIGluaXRpYWwgbGluZQoJCQkvLyBOT1RFOiBzZWUgdGhlIGNvbW1lbnQgaW4gc2VxdWVuY2UgcGFyc2luZyBmb3IgbW9yZSBkZXRhaWxzCgkJCWlmIChsaW5lUmVzdWx0cy53aGl0ZXNwYWNlID49IHJlcXVpcmVkTGVhZGluZ1doaXRlc3BhY2UpIHsKCQkJCXZhciB0cmltbWVkVGV4dCA9IHRyaW1MZWFkaW5nV2hpdGVzcGFjZShsaW5lUmVzdWx0cy50ZXh0LCByZXF1aXJlZExlYWRpbmdXaGl0ZXNwYWNlKTsKCgkJCQlpZiAobGluZVJlc3VsdHMuaXNOZXdDb25kaXRpb24pIHsKCQkJCQljb25kaXRpb25TdHJpbmdzW2N1ckluZGV4XSArPSB0cmltbWVkVGV4dDsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXJlc3VsdFN0cmluZ3NbY3VySW5kZXhdICs9IHRyaW1tZWRUZXh0ICsgU3ltLkxpbmVicmVhazsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gaGFjazogY3V0IG9mZiB0aGUgdHJhaWxpbmcgbmV3bGluZXMgZnJvbSBhbGwgdGhlIHJlc3VsdCBzdHJpbmdzCgkJcmVzdWx0U3RyaW5ncyA9IHJlc3VsdFN0cmluZ3MubWFwKGZ1bmN0aW9uKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0LnNsaWNlKDAsLTEpOyB9KTsKCgkJdmFyIGNvbmRpdGlvbnMgPSBbXTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRpdGlvblN0cmluZ3MubGVuZ3RoOyBpKyspIHsKCQkJdmFyIHN0ciA9IGNvbmRpdGlvblN0cmluZ3NbaV0udHJpbSgpOwoJCQlpZiAoc3RyID09PSBTeW0uRWxzZSkgewoJCQkJY29uZGl0aW9ucy5wdXNoKG5ldyBFbHNlTm9kZSgpKTsKCQkJfQoJCQllbHNlIHsKCQkJCXZhciBleHAgPSBDcmVhdGVFeHByZXNzaW9uKHN0cik7CgkJCQljb25kaXRpb25zLnB1c2goZXhwKTsKCQkJfQoJCX0KCgkJdmFyIHJlc3VsdHMgPSBbXTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKCQkJdmFyIHN0ciA9IHJlc3VsdFN0cmluZ3NbaV07CgkJCXZhciBkaWFsb2dCbG9ja1N0YXRlID0gbmV3IFBhcnNlclN0YXRlKG5ldyBEaWFsb2dCbG9ja05vZGUoKSwgc3RyKTsKCQkJZGlhbG9nQmxvY2tTdGF0ZSA9IFBhcnNlRGlhbG9nKGRpYWxvZ0Jsb2NrU3RhdGUpOwoJCQl2YXIgZGlhbG9nQmxvY2sgPSBkaWFsb2dCbG9ja1N0YXRlLnJvb3ROb2RlOwoJCQlyZXN1bHRzLnB1c2goZGlhbG9nQmxvY2spOwoJCX0KCgkJc3RhdGUuY3VyTm9kZS5BZGRDaGlsZChuZXcgSWZOb2RlKGNvbmRpdGlvbnMsIHJlc3VsdHMpKTsKCgkJcmV0dXJuIHN0YXRlOwoJfQoKCWZ1bmN0aW9uIElzU2VxdWVuY2Uoc3RyKSB7CgkJLy8gYml0c3kubG9nKCJJc1NlcXVlbmNlPyAiICsgc3RyKTsKCQlyZXR1cm4gc3RyID09PSAic2VxdWVuY2UiIHx8IHN0ciA9PT0gImN5Y2xlIiB8fCBzdHIgPT09ICJzaHVmZmxlIjsKCX0KCgkvKgoJCVBhcnNlU2VxdWVuY2UoKToKCQlTZXF1ZW5jZSBub2RlcyBjb250YWluIGEgbGlzdCBvZiBkaWFsb2cgYmxvY2sgbm9kZXMuIFRoZSBvcmRlciB0aG9zZQoJCW5vZGVzIGFyZSBldmFsdWF0ZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdHlwZSBvZiBzZXF1ZW5jZToKCQktIHNlcXVlbmNlOiBlYWNoIGNoaWxkIG5vZGUgZXZhbHVhdGVkIG9uY2UgaW4gb3JkZXIKCQktIGN5Y2xlOiByZXBlYXRzIGZyb20gdGhlIGJlZ2lubmluZyBhZnRlciBhbGwgbm9kZXMgZXZhbHVhdGUKCQktIHNodWZmbGU6IGV2YWx1YXRlIGluIGEgcmFuZG9tIG9yZGVyCgoJCUVhY2ggaXRlbSBpbiBhIHNlcXVlbmNlIGlzIHNlcGVhcmF0ZWQgYnkgYSAiLSIgY2hhcmFjdGVyLgoJCVRoZSBzZXBlcmF0b3IgbXVzdCBjb21lIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUsCgkJYnV0IG1heSBiZSBwcmVjZWRlZCBieSB3aGl0ZXNwYWNlIChpbiBhbnkgYW1vdW50KS4KCgkJQWJvdXQgd2hpdGVzcGFjZTogV2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lCgkJaXMgaWdub3JlZCBpZiBpdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGNvdW50IG9mCgkJd2hpdGVzcGFjZSB0aGF0IHByZWNlZGVkIHRoZSBsaXN0IHNlcGFyYXRvciAoIi0iKSBhdAoJCXRoZSBzdGFydCBvZiB0aGF0IGl0ZW0uIChUaGUgY291bnQgYWxzbyBpbmNsdWRlcyB0aGUKCQlzZXBlcmF0b3IgYW5kIHRoZSBleHRyYSBzcGFjZSBhZnRlciB0aGUgc2VwZXJhdG9yLikKCSAqLwoJZnVuY3Rpb24gUGFyc2VTZXF1ZW5jZShzdGF0ZSwgc2VxdWVuY2VUeXBlKSB7CgkJdmFyIGl0ZW1TdHJpbmdzID0gW107CgkJdmFyIGN1ckl0ZW1JbmRleCA9IC0xOyAvLyAtMSBpbmRpY2F0ZXMgbm90IHJlYWRpbmcgYW4gaXRlbSB5ZXQKCQl2YXIgcmVxdWlyZWRMZWFkaW5nV2hpdGVzcGFjZSA9IC0xOwoKCQlmdW5jdGlvbiBwYXJzZVNlcXVlbmNlSXRlbUxpbmUoc3RhdGUpIHsKCQkJ",
  "sig": "d7c87803988520b04cb37d00a5bb605228bd831683dd4864ae2acd54f18c30faef01008fafbc41011990871efc6178e7ff39cd2a223fb69886b356151c5e5a0d"
}

Note: Under active development, if you find a bug, please report it here GitHub & Reach out.