Event Details

This is a KIND 5391 event created on 2023-11-03 04:31:38 (10 months, 2 weeks ago). Debug this event chain.

{
  "id": "4ecf8b743788fc9cee70a8a17e26dbe6b41ce6b4dfb7f37f64439d07b0fb368e",
  "pubkey": "e8ed3798c6ffebffa08501ac39e271662bfd160f688f94c45d692d8767dd345a",
  "created_at": 1698985898,
  "kind": "5391",
  "tags": [
    [
      "e",
      "7c90faab92915b934eaeac038f4d0d188fbe66569268d3acfe47add69bc9c638",
      "wss://dashglow-test.nostr1.com",
      "root"
    ],
    [
      "m",
      "text/javascript"
    ],
    [
      "alt",
      "This is a binary chunk of a web-based video game. Play the full game at https://crashglow.com/game/nevent1qqs8ey864wffzkunf6h2cqu0f5x33ra7vetfy6xn4nly0twkn0yuvwqpremhxue69uhkgctndpnkcmmh946x2um59ehx7um5wgcjucm0d5q3vamnwvaz7tmjv4kxz7fwwpexjmtpdshxuet5qy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszymhwden5te0wfjkcctev93xcefwdaexwqg5waehxw309aex2mrp0yhxummnw3ezumt9qyxhwumn8ghj7mn0wvhxcmmvqyt8wumn8ghj7un9d3shjtnwdaehgu3wvfskueqzyr5w6duccml7hlaqs5q6cw0zw9nzhlgkpa5gl9xyt45jmpm8m5695qcyqqqqqqgk7zq5g"
    ],
    [
      "index",
      "5"
    ],
    [
      "x",
      "7c8a57a48656f34ac9a8dd31ca419e155b5ed28df1bd279c74ccdb220579e243"
    ]
  ],
  "content": "ZTogZnVuY3Rpb24oKSB7DQogICBCcm93c2VyLm1haW5Mb29wLnNjaGVkdWxlciA9IG51bGw7DQogICBCcm93c2VyLm1haW5Mb29wLmN1cnJlbnRseVJ1bm5pbmdNYWlubG9vcCsrOw0KICB9LA0KICByZXN1bWU6IGZ1bmN0aW9uKCkgew0KICAgQnJvd3Nlci5tYWluTG9vcC5jdXJyZW50bHlSdW5uaW5nTWFpbmxvb3ArKzsNCiAgIHZhciB0aW1pbmdNb2RlID0gQnJvd3Nlci5tYWluTG9vcC50aW1pbmdNb2RlOw0KICAgdmFyIHRpbWluZ1ZhbHVlID0gQnJvd3Nlci5tYWluTG9vcC50aW1pbmdWYWx1ZTsNCiAgIHZhciBmdW5jID0gQnJvd3Nlci5tYWluTG9vcC5mdW5jOw0KICAgQnJvd3Nlci5tYWluTG9vcC5mdW5jID0gbnVsbDsNCiAgIF9lbXNjcmlwdGVuX3NldF9tYWluX2xvb3AoZnVuYywgMCwgZmFsc2UsIEJyb3dzZXIubWFpbkxvb3AuYXJnLCB0cnVlKTsNCiAgIF9lbXNjcmlwdGVuX3NldF9tYWluX2xvb3BfdGltaW5nKHRpbWluZ01vZGUsIHRpbWluZ1ZhbHVlKTsNCiAgIEJyb3dzZXIubWFpbkxvb3Auc2NoZWR1bGVyKCk7DQogIH0sDQogIHVwZGF0ZVN0YXR1czogZnVuY3Rpb24oKSB7DQogICBpZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkgew0KICAgIHZhciBtZXNzYWdlID0gTW9kdWxlWyJzdGF0dXNNZXNzYWdlIl0gfHwgIlBsZWFzZSB3YWl0Li4uIjsNCiAgICB2YXIgcmVtYWluaW5nID0gQnJvd3Nlci5tYWluTG9vcC5yZW1haW5pbmdCbG9ja2VyczsNCiAgICB2YXIgZXhwZWN0ZWQgPSBCcm93c2VyLm1haW5Mb29wLmV4cGVjdGVkQmxvY2tlcnM7DQogICAgaWYgKHJlbWFpbmluZykgew0KICAgICBpZiAocmVtYWluaW5nIDwgZXhwZWN0ZWQpIHsNCiAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0obWVzc2FnZSArICIgKCIgKyAoZXhwZWN0ZWQgLSByZW1haW5pbmcpICsgIi8iICsgZXhwZWN0ZWQgKyAiKSIpOw0KICAgICB9IGVsc2Ugew0KICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXShtZXNzYWdlKTsNCiAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIiIpOw0KICAgIH0NCiAgIH0NCiAgfSwNCiAgcnVuSXRlcjogZnVuY3Rpb24oZnVuYykgew0KICAgaWYgKEFCT1JUKSByZXR1cm47DQogICBpZiAoTW9kdWxlWyJwcmVNYWluTG9vcCJdKSB7DQogICAgdmFyIHByZVJldCA9IE1vZHVsZVsicHJlTWFpbkxvb3AiXSgpOw0KICAgIGlmIChwcmVSZXQgPT09IGZhbHNlKSB7DQogICAgIHJldHVybjsNCiAgICB9DQogICB9DQogICB0cnkgew0KICAgIGZ1bmMoKTsNCiAgIH0gY2F0Y2ggKGUpIHsNCiAgICBpZiAoZSBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpIHsNCiAgICAgcmV0dXJuOw0KICAgIH0gZWxzZSB7DQogICAgIGlmIChlICYmIHR5cGVvZiBlID09PSAib2JqZWN0IiAmJiBlLnN0YWNrKSBlcnIoImV4Y2VwdGlvbiB0aHJvd246ICIgKyBbIGUsIGUuc3RhY2sgXSk7DQogICAgIHRocm93IGU7DQogICAgfQ0KICAgfQ0KICAgaWYgKE1vZHVsZVsicG9zdE1haW5Mb29wIl0pIE1vZHVsZVsicG9zdE1haW5Mb29wIl0oKTsNCiAgfQ0KIH0sDQogaXNGdWxsc2NyZWVuOiBmYWxzZSwNCiBwb2ludGVyTG9jazogZmFsc2UsDQogbW9kdWxlQ29udGV4dENyZWF0ZWRDYWxsYmFja3M6IFtdLA0KIHdvcmtlcnM6IFtdLA0KIGluaXQ6IGZ1bmN0aW9uKCkgew0KICBpZiAoIU1vZHVsZVsicHJlbG9hZFBsdWdpbnMiXSkgTW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdID0gW107DQogIGlmIChCcm93c2VyLmluaXR0ZWQpIHJldHVybjsNCiAgQnJvd3Nlci5pbml0dGVkID0gdHJ1ZTsNCiAgdHJ5IHsNCiAgIG5ldyBCbG9iKCk7DQogICBCcm93c2VyLmhhc0Jsb2JDb25zdHJ1Y3RvciA9IHRydWU7DQogIH0gY2F0Y2ggKGUpIHsNCiAgIEJyb3dzZXIuaGFzQmxvYkNvbnN0cnVjdG9yID0gZmFsc2U7DQogICBjb25zb2xlLmxvZygid2FybmluZzogbm8gYmxvYiBjb25zdHJ1Y3RvciwgY2Fubm90IGNyZWF0ZSBibG9icyB3aXRoIG1pbWV0eXBlcyIpOw0KICB9DQogIEJyb3dzZXIuQmxvYkJ1aWxkZXIgPSB0eXBlb2YgTW96QmxvYkJ1aWxkZXIgIT0gInVuZGVmaW5lZCIgPyBNb3pCbG9iQnVpbGRlciA6IHR5cGVvZiBXZWJLaXRCbG9iQnVpbGRlciAhPSAidW5kZWZpbmVkIiA/IFdlYktpdEJsb2JCdWlsZGVyIDogIUJyb3dzZXIuaGFzQmxvYkNvbnN0cnVjdG9yID8gY29uc29sZS5sb2coIndhcm5pbmc6IG5vIEJsb2JCdWlsZGVyIikgOiBudWxsOw0KICBCcm93c2VyLlVSTE9iamVjdCA9IHR5cGVvZiB3aW5kb3cgIT0gInVuZGVmaW5lZCIgPyB3aW5kb3cuVVJMID8gd2luZG93LlVSTCA6IHdpbmRvdy53ZWJraXRVUkwgOiB1bmRlZmluZWQ7DQogIGlmICghTW9kdWxlLm5vSW1hZ2VEZWNvZGluZyAmJiB0eXBlb2YgQnJvd3Nlci5VUkxPYmplY3QgPT09ICJ1bmRlZmluZWQiKSB7DQogICBjb25zb2xlLmxvZygid2FybmluZzogQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGNyZWF0aW5nIG9iamVjdCBVUkxzLiBCdWlsdC1pbiBicm93c2VyIGltYWdlIGRlY29kaW5nIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4iKTsNCiAgIE1vZHVsZS5ub0ltYWdlRGVjb2RpbmcgPSB0cnVlOw0KICB9DQogIHZhciBpbWFnZVBsdWdpbiA9IHt9Ow0KICBpbWFnZVBsdWdpblsiY2FuSGFuZGxlIl0gPSBmdW5jdGlvbiBpbWFnZVBsdWdpbl9jYW5IYW5kbGUobmFtZSkgew0KICAgcmV0dXJuICFNb2R1bGUubm9JbWFnZURlY29kaW5nICYmIC9cLihqcGd8anBlZ3xwbmd8Ym1wKSQvaS50ZXN0KG5hbWUpOw0KICB9Ow0KICBpbWFnZVBsdWdpblsiaGFuZGxlIl0gPSBmdW5jdGlvbiBpbWFnZVBsdWdpbl9oYW5kbGUoYnl0ZUFycmF5LCBuYW1lLCBvbmxvYWQsIG9uZXJyb3IpIHsNCiAgIHZhciBiID0gbnVsbDsNCiAgIGlmIChCcm93c2VyLmhhc0Jsb2JDb25zdHJ1Y3Rvcikgew0KICAgIHRyeSB7DQogICAgIGIgPSBuZXcgQmxvYihbIGJ5dGVBcnJheSBdLCB7DQogICAgICB0eXBlOiBCcm93c2VyLmdldE1pbWV0eXBlKG5hbWUpDQogICAgIH0pOw0KICAgICBpZiAoYi5zaXplICE9PSBieXRlQXJyYXkubGVuZ3RoKSB7DQogICAgICBiID0gbmV3IEJsb2IoWyBuZXcgVWludDhBcnJheShieXRlQXJyYXkpLmJ1ZmZlciBdLCB7DQogICAgICAgdHlwZTogQnJvd3Nlci5nZXRNaW1ldHlwZShuYW1lKQ0KICAgICAgfSk7DQogICAgIH0NCiAgICB9IGNhdGNoIChlKSB7DQogICAgIHdhcm5PbmNlKCJCbG9iIGNvbnN0cnVjdG9yIHByZXNlbnQgYnV0IGZhaWxzOiAiICsgZSArICI7IGZhbGxpbmcgYmFjayB0byBibG9iIGJ1aWxkZXIiKTsNCiAgICB9DQogICB9DQogICBpZiAoIWIpIHsNCiAgICB2YXIgYmIgPSBuZXcgQnJvd3Nlci5CbG9iQnVpbGRlcigpOw0KICAgIGJiLmFwcGVuZChuZXcgVWludDhBcnJheShieXRlQXJyYXkpLmJ1ZmZlcik7DQogICAgYiA9IGJiLmdldEJsb2IoKTsNCiAgIH0NCiAgIHZhciB1cmwgPSBCcm93c2VyLlVSTE9iamVjdC5jcmVhdGVPYmplY3RVUkwoYik7DQogICB2YXIgaW1nID0gbmV3IEltYWdlKCk7DQogICBpbWcub25sb2FkID0gZnVuY3Rpb24gaW1nX29ubG9hZCgpIHsNCiAgICBhc3NlcnQoaW1nLmNvbXBsZXRlLCAiSW1hZ2UgIiArIG5hbWUgKyAiIGNvdWxkIG5vdCBiZSBkZWNvZGVkIik7DQogICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOw0KICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDsNCiAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDsNCiAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7DQogICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApOw0KICAgIE1vZHVsZVsicHJlbG9hZGVkSW1hZ2VzIl1bbmFtZV0gPSBjYW52YXM7DQogICAgQnJvd3Nlci5VUkxPYmplY3QucmV2b2tlT2JqZWN0VVJMKHVybCk7DQogICAgaWYgKG9ubG9hZCkgb25sb2FkKGJ5dGVBcnJheSk7DQogICB9Ow0KICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiBpbWdfb25lcnJvcihldmVudCkgew0KICAgIGNvbnNvbGUubG9nKCJJbWFnZSAiICsgdXJsICsgIiBjb3VsZCBub3QgYmUgZGVjb2RlZCIpOw0KICAgIGlmIChvbmVycm9yKSBvbmVycm9yKCk7DQogICB9Ow0KICAgaW1nLnNyYyA9IHVybDsNCiAgfTsNCiAgTW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdLnB1c2goaW1hZ2VQbHVnaW4pOw0KICB2YXIgYXVkaW9QbHVnaW4gPSB7fTsNCiAgYXVkaW9QbHVnaW5bImNhbkhhbmRsZSJdID0gZnVuY3Rpb24gYXVkaW9QbHVnaW5fY2FuSGFuZGxlKG5hbWUpIHsNCiAgIHJldHVybiAhTW9kdWxlLm5vQXVkaW9EZWNvZGluZyAmJiBuYW1lLnN1YnN0cigtNCkgaW4gew0KICAgICIub2dnIjogMSwNCiAgICAiLndhdiI6IDEsDQogICAgIi5tcDMiOiAxDQogICB9Ow0KICB9Ow0KICBhdWRpb1BsdWdpblsiaGFuZGxlIl0gPSBmdW5jdGlvbiBhdWRpb1BsdWdpbl9oYW5kbGUoYnl0ZUFycmF5LCBuYW1lLCBvbmxvYWQsIG9uZXJyb3IpIHsNCiAgIHZhciBkb25lID0gZmFsc2U7DQogICBmdW5jdGlvbiBmaW5pc2goYXVkaW8pIHsNCiAgICBpZiAoZG9uZSkgcmV0dXJuOw0KICAgIGRvbmUgPSB0cnVlOw0KICAgIE1vZHVsZVsicHJlbG9hZGVkQXVkaW9zIl1bbmFtZV0gPSBhdWRpbzsNCiAgICBpZiAob25sb2FkKSBvbmxvYWQoYnl0ZUFycmF5KTsNCiAgIH0NCiAgIGZ1bmN0aW9uIGZhaWwoKSB7DQogICAgaWYgKGRvbmUpIHJldHVybjsNCiAgICBkb25lID0gdHJ1ZTsNCiAgICBNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdW25hbWVdID0gbmV3IEF1ZGlvKCk7DQogICAgaWYgKG9uZXJyb3IpIG9uZXJyb3IoKTsNCiAgIH0NCiAgIGlmIChCcm93c2VyLmhhc0Jsb2JDb25zdHJ1Y3Rvcikgew0KICAgIHRyeSB7DQogICAgIHZhciBiID0gbmV3IEJsb2IoWyBieXRlQXJyYXkgXSwgew0KICAgICAgdHlwZTogQnJvd3Nlci5nZXRNaW1ldHlwZShuYW1lKQ0KICAgICB9KTsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgIHJldHVybiBmYWlsKCk7DQogICAgfQ0KICAgIHZhciB1cmwgPSBCcm93c2VyLlVSTE9iamVjdC5jcmVhdGVPYmplY3RVUkwoYik7DQogICAgdmFyIGF1ZGlvID0gbmV3IEF1ZGlvKCk7DQogICAgYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcigiY2FucGxheXRocm91Z2giLCBmdW5jdGlvbigpIHsNCiAgICAgZmluaXNoKGF1ZGlvKTsNCiAgICB9LCBmYWxzZSk7DQogICAgYXVkaW8ub25lcnJvciA9IGZ1bmN0aW9uIGF1ZGlvX29uZXJyb3IoZXZlbnQpIHsNCiAgICAgaWYgKGRvbmUpIHJldHVybjsNCiAgICAgY29uc29sZS5sb2coIndhcm5pbmc6IGJyb3dzZXIgY291bGQgbm90IGZ1bGx5IGRlY29kZSBhdWRpbyAiICsgbmFtZSArICIsIHRyeWluZyBzbG93ZXIgYmFzZTY0IGFwcHJvYWNoIik7DQogICAgIGZ1bmN0aW9uIGVuY29kZTY0KGRhdGEpIHsNCiAgICAgIHZhciBCQVNFID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOw0KICAgICAgdmFyIFBBRCA9ICI9IjsNCiAgICAgIHZhciByZXQgPSAiIjsNCiAgICAgIHZhciBsZWZ0Y2hhciA9IDA7DQogICAgICB2YXIgbGVmdGJpdHMgPSAwOw0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgbGVmdGNoYXIgPSBsZWZ0Y2hhciA8PCA4IHwgZGF0YVtpXTsNCiAgICAgICBsZWZ0Yml0cyArPSA4Ow0KICAgICAgIHdoaWxlIChsZWZ0Yml0cyA+PSA2KSB7DQogICAgICAgIHZhciBjdXJyID0gbGVmdGNoYXIgPj4gbGVmdGJpdHMgLSA2ICYgNjM7DQogICAgICAgIGxlZnRiaXRzIC09IDY7DQogICAgICAgIHJldCArPSBCQVNFW2N1cnJdOw0KICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmIChsZWZ0Yml0cyA9PSAyKSB7DQogICAgICAgcmV0ICs9IEJBU0VbKGxlZnRjaGFyICYgMykgPDwgNF07DQogICAgICAgcmV0ICs9IFBBRCArIFBBRDsNCiAgICAgIH0gZWxzZSBpZiAobGVmdGJpdHMgPT0gNCkgew0KICAgICAgIHJldCArPSBCQVNFWyhsZWZ0Y2hhciAmIDE1KSA8PCAyXTsNCiAgICAgICByZXQgKz0gUEFEOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHJldDsNCiAgICAgfQ0KICAgICBhdWRpby5zcmMgPSAiZGF0YTphdWRpby94LSIgKyBuYW1lLnN1YnN0cigtMykgKyAiO2Jhc2U2NCwiICsgZW5jb2RlNjQoYnl0ZUFycmF5KTsNCiAgICAgZmluaXNoKGF1ZGlvKTsNCiAgICB9Ow0KICAgIGF1ZGlvLnNyYyA9IHVybDsNCiAgICBCcm93c2VyLnNhZmVTZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICBmaW5pc2goYXVkaW8pOw0KICAgIH0sIDFlNCk7DQogICB9IGVsc2Ugew0KICAgIHJldHVybiBmYWlsKCk7DQogICB9DQogIH07DQogIE1vZHVsZVsicHJlbG9hZFBsdWdpbnMiXS5wdXNoKGF1ZGlvUGx1Z2luKTsNCiAgZnVuY3Rpb24gcG9pbnRlckxvY2tDaGFuZ2UoKSB7DQogICBCcm93c2VyLnBvaW50ZXJMb2NrID0gZG9jdW1lbnRbInBvaW50ZXJMb2NrRWxlbWVudCJdID09PSBNb2R1bGVbImNhbnZhcyJdIHx8IGRvY3VtZW50WyJtb3pQb2ludGVyTG9ja0VsZW1lbnQiXSA9PT0gTW9kdWxlWyJjYW52YXMiXSB8fCBkb2N1bWVudFsid2Via2l0UG9pbnRlckxvY2tFbGVtZW50Il0gPT09IE1vZHVsZVsiY2FudmFzIl0gfHwgZG9jdW1lbnRbIm1zUG9pbnRlckxvY2tFbGVtZW50Il0gPT09IE1vZHVsZVsiY2FudmFzIl07DQogIH0NCiAgdmFyIGNhbnZhcyA9IE1vZHVsZVsiY2FudmFzIl07DQogIGlmIChjYW52YXMpIHsNCiAgIGNhbnZhcy5yZXF1ZXN0UG9pbnRlckxvY2sgPSBjYW52YXNbInJlcXVlc3RQb2ludGVyTG9jayJdIHx8IGNhbnZhc1sibW96UmVxdWVzdFBvaW50ZXJMb2NrIl0gfHwgY2FudmFzWyJ3ZWJraXRSZXF1ZXN0UG9pbnRlckxvY2siXSB8fCBjYW52YXNbIm1zUmVxdWVzdFBvaW50ZXJMb2NrIl0gfHwgZnVuY3Rpb24oKSB7fTsNCiAgIGNhbnZhcy5leGl0UG9pbnRlckxvY2sgPSBkb2N1bWVudFsiZXhpdFBvaW50ZXJMb2NrIl0gfHwgZG9jdW1lbnRbIm1vekV4aXRQb2ludGVyTG9jayJdIHx8IGRvY3VtZW50WyJ3ZWJraXRFeGl0UG9pbnRlckxvY2siXSB8fCBkb2N1bWVudFsibXNFeGl0UG9pbnRlckxvY2siXSB8fCBmdW5jdGlvbigpIHt9Ow0KICAgY2FudmFzLmV4aXRQb2ludGVyTG9jayA9IGNhbnZhcy5leGl0UG9pbnRlckxvY2suYmluZChkb2N1bWVudCk7DQogICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybG9ja2NoYW5nZSIsIHBvaW50ZXJMb2NrQ2hhbmdlLCBmYWxzZSk7DQogICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3pwb2ludGVybG9ja2NoYW5nZSIsIHBvaW50ZXJMb2NrQ2hhbmdlLCBmYWxzZSk7DQogICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRwb2ludGVybG9ja2NoYW5nZSIsIHBvaW50ZXJMb2NrQ2hhbmdlLCBmYWxzZSk7DQogICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtc3BvaW50ZXJsb2NrY2hhbmdlIiwgcG9pbnRlckxvY2tDaGFuZ2UsIGZhbHNlKTsNCiAgIGlmIChNb2R1bGVbImVsZW1lbnRQb2ludGVyTG9jayJdKSB7DQogICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oZXYpIHsNCiAgICAgaWYgKCFCcm93c2VyLnBvaW50ZXJMb2NrICYmIE1vZHVsZVsiY2FudmFzIl0ucmVxdWVzdFBvaW50ZXJMb2NrKSB7DQogICAgICBNb2R1bGVbImNhbnZhcyJdLnJlcXVlc3RQb2ludGVyTG9jaygpOw0KICAgICAgZXYucHJldmVudERlZmF1bHQoKTsNCiAgICAgfQ0KICAgIH0sIGZhbHNlKTsNCiAgIH0NCiAgfQ0KIH0sDQogY3JlYXRlQ29udGV4dDogZnVuY3Rpb24oY2FudmFzLCB1c2VXZWJHTCwgc2V0SW5Nb2R1bGUsIHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMpIHsNCiAgaWYgKHVzZVdlYkdMICYmIE1vZHVsZS5jdHggJiYgY2FudmFzID09IE1vZHVsZS5jYW52YXMpIHJldHVybiBNb2R1bGUuY3R4Ow0KICB2YXIgY3R4Ow0KICB2YXIgY29udGV4dEhhbmRsZTsNCiAgaWYgKHVzZVdlYkdMKSB7DQogICB2YXIgY29udGV4dEF0dHJpYnV0ZXMgPSB7DQogICAgYW50aWFsaWFzOiBmYWxzZSwNCiAgICBhbHBoYTogZmFsc2UsDQogICAgbWFqb3JWZXJzaW9uOiAxDQogICB9Ow0KICAgaWYgKHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMpIHsNCiAgICBmb3IgKHZhciBhdHRyaWJ1dGUgaW4gd2ViR0xDb250ZXh0QXR0cmlidXRlcykgew0KICAgICBjb250ZXh0QXR0cmlidXRlc1thdHRyaWJ1dGVdID0gd2ViR0xDb250ZXh0QXR0cmlidXRlc1thdHRyaWJ1dGVdOw0KICAgIH0NCiAgIH0NCiAgIGlmICh0eXBlb2YgR0wgIT09ICJ1bmRlZmluZWQiKSB7DQogICAgY29udGV4dEhhbmRsZSA9IEdMLmNyZWF0ZUNvbnRleHQoY2FudmFzLCBjb250ZXh0QXR0cmlidXRlcyk7DQogICAgaWYgKGNvbnRleHRIYW5kbGUpIHsNCiAgICAgY3R4ID0gR0wuZ2V0Q29udGV4dChjb250ZXh0SGFuZGxlKS5HTGN0eDsNCiAgICB9DQogICB9DQogIH0gZWxzZSB7DQogICBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsNCiAgfQ0KICBpZiAoIWN0eCkgcmV0dXJuIG51bGw7DQogIGlmIChzZXRJbk1vZHVsZSkgew0KICAgaWYgKCF1c2VXZWJHTCkgYXNzZXJ0KHR5cGVvZiBHTGN0eCA9PT0gInVuZGVmaW5lZCIsICJjYW5ub3Qgc2V0IGluIG1vZHVsZSBpZiBHTGN0eCBpcyB1c2VkLCBidXQgd2UgYXJlIGEgbm9uLUdMIGNvbnRleHQgdGhhdCB3b3VsZCByZXBsYWNlIGl0Iik7DQogICBNb2R1bGUuY3R4ID0gY3R4Ow0KICAgaWYgKHVzZVdlYkdMKSBHTC5tYWtlQ29udGV4dEN1cnJlbnQoY29udGV4dEhhbmRsZSk7DQogICBNb2R1bGUudXNlV2ViR0wgPSB1c2VXZWJHTDsNCiAgIEJyb3dzZXIubW9kdWxlQ29udGV4dENyZWF0ZWRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihjYWxsYmFjaykgew0KICAgIGNhbGxiYWNrKCk7DQogICB9KTsNCiAgIEJyb3dzZXIuaW5pdCgpOw0KICB9DQogIHJldHVybiBjdHg7DQogfSwNCiBkZXN0cm95Q29udGV4dDogZnVuY3Rpb24oY2FudmFzLCB1c2VXZWJHTCwgc2V0SW5Nb2R1bGUpIHt9LA0KIGZ1bGxzY3JlZW5IYW5kbGVyc0luc3RhbGxlZDogZmFsc2UsDQogbG9ja1BvaW50ZXI6IHVuZGVmaW5lZCwNCiByZXNpemVDYW52YXM6IHVuZGVmaW5lZCwNCiByZXF1ZXN0RnVsbHNjcmVlbjogZnVuY3Rpb24obG9ja1BvaW50ZXIsIHJlc2l6ZUNhbnZhcywgdnJEZXZpY2UpIHsNCiAgbG9ja1BvaW50ZXIgPSBmYWxzZTsNCiAgY29uc29sZS5sb2coImZvcmNpbmcgbG9ja1BvaW50ZXIgdG8gZmFsc2UiKTsNCiAgQnJvd3Nlci5sb2NrUG9pbnRlciA9IGxvY2tQb2ludGVyOw0KICBCcm93c2VyLnJlc2l6ZUNhbnZhcyA9IHJlc2l6ZUNhbnZhczsNCiAgQnJvd3Nlci52ckRldmljZSA9IHZyRGV2aWNlOw0KICBpZiAodHlwZW9mIEJyb3dzZXIubG9ja1BvaW50ZXIgPT09ICJ1bmRlZmluZWQiKSBCcm93c2VyLmxvY2tQb2ludGVyID0gZmFsc2U7DQogIGlmICh0eXBlb2YgQnJvd3Nlci5yZXNpemVDYW52YXMgPT09ICJ1bmRlZmluZWQiKSBCcm93c2VyLnJlc2l6ZUNhbnZhcyA9IGZhbHNlOw0KICBpZiAodHlwZW9mIEJyb3dzZXIudnJEZXZpY2UgPT09ICJ1bmRlZmluZWQiKSBCcm93c2VyLnZyRGV2aWNlID0gbnVsbDsNCiAgdmFyIGNhbnZhcyA9IE1vZHVsZVsiY2FudmFzIl07DQogIGZ1bmN0aW9uIGZ1bGxzY3JlZW5DaGFuZ2UoKSB7DQogICBCcm93c2VyLmlzRnVsbHNjcmVlbiA9IGZhbHNlOw0KICAgdmFyIGNhbnZhc0NvbnRhaW5lciA9IGNhbnZhcy5wYXJlbnROb2RlOw0KICAgaWYgKChkb2N1bWVudFsiZnVsbHNjcmVlbkVsZW1lbnQiXSB8fCBkb2N1bWVudFsibW96RnVsbFNjcmVlbkVsZW1lbnQiXSB8fCBkb2N1bWVudFsibXNGdWxsc2NyZWVuRWxlbWVudCJdIHx8IGRvY3VtZW50WyJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCJdIHx8IGRvY3VtZW50WyJ3ZWJraXRDdXJyZW50RnVsbFNjcmVlbkVsZW1lbnQiXSkgPT09IGNhbnZhc0NvbnRhaW5lcikgew0KICAgIGNhbnZhcy5leGl0RnVsbHNjcmVlbiA9IGRvY3VtZW50WyJleGl0RnVsbHNjcmVlbiJdIHx8IGRvY3VtZW50WyJjYW5jZWxGdWxsU2NyZWVuIl0gfHwgZG9jdW1lbnRbIm1vekNhbmNlbEZ1bGxTY3JlZW4iXSB8fCBkb2N1bWVudFsibXNFeGl0RnVsbHNjcmVlbiJdIHx8IGRvY3VtZW50WyJ3ZWJraXRDYW5jZWxGdWxsU2NyZWVuIl0gfHwgZnVuY3Rpb24oKSB7fTsNCiAgICBjYW52YXMuZXhpdEZ1bGxzY3JlZW4gPSBjYW52YXMuZXhpdEZ1bGxzY3JlZW4uYmluZChkb2N1bWVudCk7DQogICAgQnJvd3Nlci5pc0Z1bGxzY3JlZW4gPSB0cnVlOw0KICAgIGlmIChCcm93c2VyLnJlc2l6ZUNhbnZhcykgew0KICAgICBCcm93c2VyLnNldEZ1bGxzY3JlZW5DYW52YXNTaXplKCk7DQogICAgfSBlbHNlIHsNCiAgICAgQnJvd3Nlci51cGRhdGVDYW52YXNEaW1lbnNpb25zKGNhbnZhcyk7DQogICAgfQ0KICAgfSBlbHNlIHsNCiAgICBjYW52YXNDb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2FudmFzLCBjYW52YXNDb250YWluZXIpOw0KICAgIGNhbnZhc0NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNhbnZhc0NvbnRhaW5lcik7DQogICAgaWYgKEJyb3dzZXIucmVzaXplQ2FudmFzKSB7DQogICAgIEJyb3dzZXIuc2V0V2luZG93ZWRDYW52YXNTaXplKCk7DQogICAgfSBlbHNlIHsNCiAgICAgQnJvd3Nlci51cGRhdGVDYW52YXNEaW1lbnNpb25zKGNhbnZhcyk7DQogICAgfQ0KICAgfQ0KICAgaWYgKE1vZHVsZVsib25GdWxsU2NyZWVuIl0pIE1vZHVsZVsib25GdWxsU2NyZWVuIl0oQnJvd3Nlci5pc0Z1bGxzY3JlZW4pOw0KICAgaWYgKE1vZHVsZVsib25GdWxsc2NyZWVuIl0pIE1vZHVsZVsib25GdWxsc2NyZWVuIl0oQnJvd3Nlci5pc0Z1bGxzY3JlZW4pOw0KICB9DQogIGlmICghQnJvd3Nlci5mdWxsc2NyZWVuSGFuZGxlcnNJbnN0YWxsZWQpIHsNCiAgIEJyb3dzZXIuZnVsbHNjcmVlbkhhbmRsZXJzSW5zdGFsbGVkID0gdHJ1ZTsNCiAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZ1bGxzY3JlZW5jaGFuZ2UiLCBmdWxsc2NyZWVuQ2hhbmdlLCBmYWxzZSk7DQogICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3pmdWxsc2NyZWVuY2hhbmdlIiwgZnVsbHNjcmVlbkNoYW5nZSwgZmFsc2UpOw0KICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2Via2l0ZnVsbHNjcmVlbmNoYW5nZSIsIGZ1bGxzY3JlZW5DaGFuZ2UsIGZhbHNlKTsNCiAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIk1TRnVsbHNjcmVlbkNoYW5nZSIsIGZ1bGxzY3JlZW5DaGFuZ2UsIGZhbHNlKTsNCiAgfQ0KICB2YXIgY2FudmFzQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogIGNhbnZhcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjYW52YXNDb250YWluZXIsIGNhbnZhcyk7DQogIGNhbnZhc0NvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpOw0KICBjYW52YXNDb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4gPSBjYW52YXNDb250YWluZXJbInJlcXVlc3RGdWxsc2NyZWVuIl0gfHwgY2FudmFzQ29udGFpbmVyWyJtb3pSZXF1ZXN0RnVsbFNjcmVlbiJdIHx8IGNhbnZhc0NvbnRhaW5lclsibXNSZXF1ZXN0RnVsbHNjcmVlbiJdIHx8IChjYW52YXNDb250YWluZXJbIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIl0gPyBmdW5jdGlvbigpIHsNCiAgIGNhbnZhc0NvbnRhaW5lclsid2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4iXShFbGVtZW50WyJBTExPV19LRVlCT0FSRF9JTlBVVCJdKTsNCiAgfSA6IG51bGwpIHx8IChjYW52YXNDb250YWluZXJbIndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuIl0gPyBmdW5jdGlvbigpIHsNCiAgIGNhbnZhc0NvbnRhaW5lclsid2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4iXShFbGVtZW50WyJBTExPV19LRVlCT0FSRF9JTlBVVCJdKTsNCiAgfSA6IG51bGwpOw0KICBpZiAodnJEZXZpY2UpIHsNCiAgIGNhbnZhc0NvbnRhaW5lci5yZXF1ZXN0RnVsbHNjcmVlbih7DQogICAgdnJEaXNwbGF5OiB2ckRldmljZQ0KICAgfSk7DQogIH0gZWxzZSB7DQogICBjYW52YXNDb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4oKTsNCiAgfQ0KIH0sDQogcmVxdWVzdEZ1bGxTY3JlZW46IGZ1bmN0aW9uKGxvY2tQb2ludGVyLCByZXNpemVDYW52YXMsIHZyRGV2aWNlKSB7DQogIGVycigiQnJvd3Nlci5yZXF1ZXN0RnVsbFNjcmVlbigpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBjYWxsIEJyb3dzZXIucmVxdWVzdEZ1bGxzY3JlZW4gaW5zdGVhZC4iKTsNCiAgQnJvd3Nlci5yZXF1ZXN0RnVsbFNjcmVlbiA9IGZ1bmN0aW9uKGxvY2tQb2ludGVyLCByZXNpemVDYW52YXMsIHZyRGV2aWNlKSB7DQogICByZXR1cm4gQnJvd3Nlci5yZXF1ZXN0RnVsbHNjcmVlbihsb2NrUG9pbnRlciwgcmVzaXplQ2FudmFzLCB2ckRldmljZSk7DQogIH07DQogIHJldHVybiBCcm93c2VyLnJlcXVlc3RGdWxsc2NyZWVuKGxvY2tQb2ludGVyLCByZXNpemVDYW52YXMsIHZyRGV2aWNlKTsNCiB9LA0KIG5leHRSQUY6IDAsDQogZmFrZVJlcXVlc3RBbmltYXRpb25GcmFtZTogZnVuY3Rpb24oZnVuYykgew0KICB2YXIgbm93ID0gRGF0ZS5ub3coKTsNCiAgaWYgKEJyb3dzZXIubmV4dFJBRiA9PT0gMCkgew0KICAgQnJvd3Nlci5uZXh0UkFGID0gbm93ICsgMWUzIC8gNjA7DQogIH0gZWxzZSB7DQogICB3aGlsZSAobm93ICsgMiA+PSBCcm93c2VyLm5leHRSQUYpIHsNCiAgICBCcm93c2VyLm5leHRSQUYgKz0gMWUzIC8gNjA7DQogICB9DQogIH0NCiAgdmFyIGRlbGF5ID0gTWF0aC5tYXgoQnJvd3Nlci5uZXh0UkFGIC0gbm93LCAwKTsNCiAgc2V0VGltZW91dChmdW5jLCBkZWxheSk7DQogfSwNCiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jKSB7DQogIGlmICh0eXBlb2Ygd2luZG93ID09PSAidW5kZWZpbmVkIikgew0KICAgQnJvd3Nlci5mYWtlUmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmMpOw0KICB9IGVsc2Ugew0KICAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7DQogICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1sicmVxdWVzdEFuaW1hdGlvbkZyYW1lIl0gfHwgd2luZG93WyJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiXSB8fCB3aW5kb3dbIndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSJdIHx8IHdpbmRvd1sibXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiXSB8fCB3aW5kb3dbIm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUiXSB8fCBCcm93c2VyLmZha2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7DQogICB9DQogICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmMpOw0KICB9DQogfSwNCiBzYWZlQ2FsbGJhY2s6IGZ1bmN0aW9uKGZ1bmMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgaWYgKCFBQk9SVCkgcmV0dXJuIGZ1bmMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsNCiAgfTsNCiB9LA0KIGFsbG93QXN5bmNDYWxsYmFja3M6IHRydWUsDQogcXVldWVkQXN5bmNDYWxsYmFja3M6IFtdLA0KIHBhdXNlQXN5bmNDYWxsYmFja3M6IGZ1bmN0aW9uKCkgew0KICBCcm93c2VyLmFsbG93QXN5bmNDYWxsYmFja3MgPSBmYWxzZTsNCiB9LA0KIHJlc3VtZUFzeW5jQ2FsbGJhY2tzOiBmdW5jdGlvbigpIHsNCiAgQnJvd3Nlci5hbGxvd0FzeW5jQ2FsbGJhY2tzID0gdHJ1ZTsNCiAgaWYgKEJyb3dzZXIucXVldWVkQXN5bmNDYWxsYmFja3MubGVuZ3RoID4gMCkgew0KICAgdmFyIGNhbGxiYWNrcyA9IEJyb3dzZXIucXVldWVkQXN5bmNDYWxsYmFja3M7DQogICBCcm93c2VyLnF1ZXVlZEFzeW5jQ2FsbGJhY2tzID0gW107DQogICBjYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihmdW5jKSB7DQogICAgZnVuYygpOw0KICAgfSk7DQogIH0NCiB9LA0KIHNhZmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IGZ1bmN0aW9uKGZ1bmMpIHsNCiAgcmV0dXJuIEJyb3dzZXIucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkgew0KICAgaWYgKEFCT1JUKSByZXR1cm47DQogICBpZiAoQnJvd3Nlci5hbGxvd0FzeW5jQ2FsbGJhY2tzKSB7DQogICAgZnVuYygpOw0KICAgfSBlbHNlIHsNCiAgICBCcm93c2VyLnF1ZXVlZEFzeW5jQ2FsbGJhY2tzLnB1c2goZnVuYyk7DQogICB9DQogIH0pOw0KIH0sDQogc2FmZVNldFRpbWVvdXQ6IGZ1bmN0aW9uKGZ1bmMsIHRpbWVvdXQpIHsNCiAgTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gPSB0cnVlOw0KICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgIGlmIChBQk9SVCkgcmV0dXJuOw0KICAgaWYgKEJyb3dzZXIuYWxsb3dBc3luY0NhbGxiYWNrcykgew0KICAgIGZ1bmMoKTsNCiAgIH0gZWxzZSB7DQogICAgQnJvd3Nlci5xdWV1ZWRBc3luY0NhbGxiYWNrcy5wdXNoKGZ1bmMpOw0KICAgfQ0KICB9LCB0aW1lb3V0KTsNCiB9LA0KIHNhZmVTZXRJbnRlcnZhbDogZnVuY3Rpb24oZnVuYywgdGltZW91dCkgew0KICBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSA9IHRydWU7DQogIHJldHVybiBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCiAgIGlmIChBQk9SVCkgcmV0dXJuOw0KICAgaWYgKEJyb3dzZXIuYWxsb3dBc3luY0NhbGxiYWNrcykgew0KICAgIGZ1bmMoKTsNCiAgIH0NCiAgfSwgdGltZW91dCk7DQogfSwNCiBnZXRNaW1ldHlwZTogZnVuY3Rpb24obmFtZSkgew0KICByZXR1cm4gew0KICAgImpwZyI6ICJpbWFnZS9qcGVnIiwNCiAgICJqcGVnIjogImltYWdlL2pwZWciLA0KICAgInBuZyI6ICJpbWFnZS9wbmciLA0KICAgImJtcCI6ICJpbWFnZS9ibXAiLA0KICAgIm9nZyI6ICJhdWRpby9vZ2ciLA0KICAgIndhdiI6ICJhdWRpby93YXYiLA0KICAgIm1wMyI6ICJhdWRpby9tcGVnIg0KICB9W25hbWUuc3Vic3RyKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpXTsNCiB9LA0KIGdldFVzZXJNZWRpYTogZnVuY3Rpb24oZnVuYykgew0KICBpZiAoIXdpbmRvdy5nZXRVc2VyTWVkaWEpIHsNCiAgIHdpbmRvdy5nZXRVc2VyTWVkaWEgPSBuYXZpZ2F0b3JbImdldFVzZXJNZWRpYSJdIHx8IG5hdmlnYXRvclsibW96R2V0VXNlck1lZGlhIl07DQogIH0NCiAgd2luZG93LmdldFVzZXJNZWRpYShmdW5jKTsNCiB9LA0KIGdldE1vdmVtZW50WDogZnVuY3Rpb24oZXZlbnQpIHsNCiAgcmV0dXJuIGV2ZW50WyJtb3ZlbWVudFgiXSB8fCBldmVudFsibW96TW92ZW1lbnRYIl0gfHwgZXZlbnRbIndlYmtpdE1vdmVtZW50WCJdIHx8IDA7DQogfSwNCiBnZXRNb3ZlbWVudFk6IGZ1bmN0aW9uKGV2ZW50KSB7DQogIHJldHVybiBldmVudFsibW92ZW1lbnRZIl0gfHwgZXZlbnRbIm1vek1vdmVtZW50WSJdIHx8IGV2ZW50WyJ3ZWJraXRNb3ZlbWVudFkiXSB8fCAwOw0KIH0sDQogZ2V0TW91c2VXaGVlbERlbHRhOiBmdW5jdGlvbihldmVudCkgew0KICB2YXIgZGVsdGEgPSAwOw0KICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsNCiAgY2FzZSAiRE9NTW91c2VTY3JvbGwiOg0KICAgZGVsdGEgPSBldmVudC5kZXRhaWw7DQogICBicmVhazsNCg0KICBjYXNlICJtb3VzZXdoZWVsIjoNCiAgIGRlbHRhID0gZXZlbnQud2hlZWxEZWx0YTsNCiAgIGJyZWFrOw0KDQogIGNhc2UgIndoZWVsIjoNCiAgIGRlbHRhID0gZXZlbnRbImRlbHRhWSJdOw0KICAgYnJlYWs7DQoNCiAgZGVmYXVsdDoNCiAgIHRocm93ICJ1bnJlY29nbml6ZWQgbW91c2Ugd2hlZWwgZXZlbnQ6ICIgKyBldmVudC50eXBlOw0KICB9DQogIHJldHVybiBkZWx0YTsNCiB9LA0KIG1vdXNlWDogMCwNCiBtb3VzZVk6IDAsDQogbW91c2VNb3ZlbWVudFg6IDAsDQogbW91c2VNb3ZlbWVudFk6IDAsDQogdG91Y2hlczoge30sDQogbGFzdFRvdWNoZXM6IHt9LA0KIGNhbGN1bGF0ZU1vdXNlRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7DQogIGlmIChCcm93c2VyLnBvaW50ZXJMb2NrKSB7DQogICBpZiAoZXZlbnQudHlwZSAhPSAibW91c2Vtb3ZlIiAmJiAibW96TW92ZW1lbnRYIiBpbiBldmVudCkgew0KICAgIEJyb3dzZXIubW91c2VNb3ZlbWVudFggPSBCcm93c2VyLm1vdXNlTW92ZW1lbnRZID0gMDsNCiAgIH0gZWxzZSB7DQogICAgQnJvd3Nlci5tb3VzZU1vdmVtZW50WCA9IEJyb3dzZXIuZ2V0TW92ZW1lbnRYKGV2ZW50KTsNCiAgICBCcm93c2VyLm1vdXNlTW92ZW1lbnRZID0gQnJvd3Nlci5nZXRNb3ZlbWVudFkoZXZlbnQpOw0KICAgfQ0KICAgaWYgKHR5cGVvZiBTREwgIT0gInVuZGVmaW5lZCIpIHsNCiAgICBCcm93c2VyLm1vdXNlWCA9IFNETC5tb3VzZVggKyBCcm93c2VyLm1vdXNlTW92ZW1lbnRYOw0KICAgIEJyb3dzZXIubW91c2VZID0gU0RMLm1vdXNlWSArIEJyb3dzZXIubW91c2VNb3ZlbWVudFk7DQogICB9IGVsc2Ugew0KICAgIEJyb3dzZXIubW91c2VYICs9IEJyb3dzZXIubW91c2VNb3ZlbWVudFg7DQogICAgQnJvd3Nlci5tb3VzZVkgKz0gQnJvd3Nlci5tb3VzZU1vdmVtZW50WTsNCiAgIH0NCiAgfSBlbHNlIHsNCiAgIHZhciByZWN0ID0gTW9kdWxlWyJjYW52YXMiXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgIHZhciBjdyA9IE1vZHVsZVsiY2FudmFzIl0ud2lkdGg7DQogICB2YXIgY2ggPSBNb2R1bGVbImNhbnZhcyJdLmhlaWdodDsNCiAgIHZhciBzY3JvbGxYID0gdHlwZW9mIHdpbmRvdy5zY3JvbGxYICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdy5zY3JvbGxYIDogd2luZG93LnBhZ2VYT2Zmc2V0Ow0KICAgdmFyIHNjcm9sbFkgPSB0eXBlb2Ygd2luZG93LnNjcm9sbFkgIT09ICJ1bmRlZmluZWQiID8gd2luZG93LnNjcm9sbFkgOiB3aW5kb3cucGFnZVlPZmZzZXQ7DQogICBpZiAoZXZlbnQudHlwZSA9PT0gInRvdWNoc3RhcnQiIHx8IGV2ZW50LnR5cGUgPT09ICJ0b3VjaGVuZCIgfHwgZXZlbnQudHlwZSA9PT0gInRvdWNobW92ZSIpIHsNCiAgICB2YXIgdG91Y2ggPSBldmVudC50b3VjaDsNCiAgICBpZiAodG91Y2ggPT09IHVuZGVmaW5lZCkgew0KICAgICByZXR1cm47DQogICAgfQ0KICAgIHZhciBhZGp1c3RlZFggPSB0b3VjaC5wYWdlWCAtIChzY3JvbGxYICsgcmVjdC5sZWZ0KTsNCiAgICB2YXIgYWRqdXN0ZWRZID0gdG91Y2gucGFnZVkgLSAoc2Nyb2xsWSArIHJlY3QudG9wKTsNCiAgICBhZGp1c3RlZFggPSBhZGp1c3RlZFggKiAoY3cgLyByZWN0LndpZHRoKTsNCiAgICBhZGp1c3RlZFkgPSBhZGp1c3RlZFkgKiAoY2ggLyByZWN0LmhlaWdodCk7DQogICAgdmFyIGNvb3JkcyA9IHsNCiAgICAgeDogYWRqdXN0ZWRYLA0KICAgICB5OiBhZGp1c3RlZFkNCiAgICB9Ow0KICAgIGlmIChldmVudC50eXBlID09PSAidG91Y2hzdGFydCIpIHsNCiAgICAgQnJvd3Nlci5sYXN0VG91Y2hlc1t0b3VjaC5pZGVudGlmaWVyXSA9IGNvb3JkczsNCiAgICAgQnJvd3Nlci50b3VjaGVzW3RvdWNoLmlkZW50aWZpZXJdID0gY29vcmRzOw0KICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gInRvdWNoZW5kIiB8fCBldmVudC50eXBlID09PSAidG91Y2htb3ZlIikgew0KICAgICB2YXIgbGFzdCA9IEJyb3dzZXIudG91Y2hlc1t0b3VjaC5pZGVudGlmaWVyXTsNCiAgICAgaWYgKCFsYXN0KSBsYXN0ID0gY29vcmRzOw0KICAgICBCcm93c2VyLmxhc3RUb3VjaGVzW3RvdWNoLmlkZW50aWZpZXJdID0gbGFzdDsNCiAgICAgQnJvd3Nlci50b3VjaGVzW3RvdWNoLmlkZW50aWZpZXJdID0gY29vcmRzOw0KICAgIH0NCiAgICByZXR1cm47DQogICB9DQogICB2YXIgeCA9IGV2ZW50LnBhZ2VYIC0gKHNjcm9sbFggKyByZWN0LmxlZnQpOw0KICAgdmFyIHkgPSBldmVudC5wYWdlWSAtIChzY3JvbGxZICsgcmVjdC50b3ApOw0KICAgeCA9IHggKiAoY3cgLyByZWN0LndpZHRoKTsNCiAgIHkgPSB5ICogKGNoIC8gcmVjdC5oZWlnaHQpOw0KICAgQnJvd3Nlci5tb3VzZU1vdmVtZW50WCA9IHggLSBCcm93c2VyLm1vdXNlWDsNCiAgIEJyb3dzZXIubW91c2VNb3ZlbWVudFkgPSB5IC0gQnJvd3Nlci5tb3VzZVk7DQogICBCcm93c2VyLm1vdXNlWCA9IHg7DQogICBCcm93c2VyLm1vdXNlWSA9IHk7DQogIH0NCiB9LA0KIGFzeW5jTG9hZDogZnVuY3Rpb24odXJsLCBvbmxvYWQsIG9uZXJyb3IsIG5vUnVuRGVwKSB7DQogIHZhciBkZXAgPSAhbm9SdW5EZXAgPyBnZXRVbmlxdWVSdW5EZXBlbmRlbmN5KCJhbCAiICsgdXJsKSA6ICIiOw0KICBNb2R1bGVbInJlYWRBc3luYyJdKHVybCwgZnVuY3Rpb24oYXJyYXlCdWZmZXIpIHsNCiAgIGFzc2VydChhcnJheUJ1ZmZlciwgJ0xvYWRpbmcgZGF0YSBmaWxlICInICsgdXJsICsgJyIgZmFpbGVkIChubyBhcnJheUJ1ZmZlcikuJyk7DQogICBvbmxvYWQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTsNCiAgIGlmIChkZXApIHJlbW92ZVJ1bkRlcGVuZGVuY3koZGVwKTsNCiAgfSwgZnVuY3Rpb24oZXZlbnQpIHsNCiAgIGlmIChvbmVycm9yKSB7DQogICAgb25lcnJvcigpOw0KICAgfSBlbHNlIHsNCiAgICB0aHJvdyAnTG9hZGluZyBkYXRhIGZpbGUgIicgKyB1cmwgKyAnIiBmYWlsZWQuJzsNCiAgIH0NCiAgfSk7DQogIGlmIChkZXApIGFkZFJ1bkRlcGVuZGVuY3koZGVwKTsNCiB9LA0KIHJlc2l6ZUxpc3RlbmVyczogW10sDQogdXBkYXRlUmVzaXplTGlzdGVuZXJzOiBmdW5jdGlvbigpIHsNCiAgdmFyIGNhbnZhcyA9IE1vZHVsZVsiY2FudmFzIl07DQogIEJyb3dzZXIucmVzaXplTGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24obGlzdGVuZXIpIHsNCiAgIGxpc3RlbmVyKGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7DQogIH0pOw0KIH0sDQogc2V0Q2FudmFzU2l6ZTogZnVuY3Rpb24od2lkdGgsIGhlaWdodCwgbm9VcGRhdGVzKSB7DQogIHZhciBjYW52YXMgPSBNb2R1bGVbImNhbnZhcyJdOw0KICBCcm93c2VyLnVwZGF0ZUNhbnZhc0RpbWVuc2lvbnMoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KTsNCiAgaWYgKCFub1VwZGF0ZXMpIEJyb3dzZXIudXBkYXRlUmVzaXplTGlzdGVuZXJzKCk7DQogfSwNCiB3aW5kb3dlZFdpZHRoOiAwLA0KIHdpbmRvd2VkSGVpZ2h0OiAwLA0KIHNldEZ1bGxzY3JlZW5DYW52YXNTaXplOiBmdW5jdGlvbigpIHsNCiAgaWYgKHR5cGVvZiBTREwgIT0gInVuZGVmaW5lZCIpIHsNCiAgIHZhciBmbGFncyA9IEhFQVBVMzJbU0RMLnNjcmVlbiA+PiAyXTsNCiAgIGZsYWdzID0gZmxhZ3MgfCA4Mzg4NjA4Ow0KICAgSEVBUDMyW1NETC5zY3JlZW4gPj4gMl0gPSBmbGFnczsNCiAgfQ0KICBCcm93c2VyLnVwZGF0ZUNhbnZhc0RpbWVuc2lvbnMoTW9kdWxlWyJjYW52YXMiXSk7DQogIEJyb3dzZXIudXBkYXRlUmVzaXplTGlzdGVuZXJzKCk7DQogfSwNCiBzZXRXaW5kb3dlZENhbnZhc1NpemU6IGZ1bmN0aW9uKCkgew0KICBpZiAodHlwZW9mIFNETCAhPSAidW5kZWZpbmVkIikgew0KICAgdmFyIGZsYWdzID0gSEVBUFUzMltTREwuc2NyZWVuID4+IDJdOw0KICAgZmxhZ3MgPSBmbGFncyAmIH44Mzg4NjA4Ow0KICAgSEVBUDMyW1NETC5zY3JlZW4gPj4gMl0gPSBmbGFnczsNCiAgfQ0KICBCcm93c2VyLnVwZGF0ZUNhbnZhc0RpbWVuc2lvbnMoTW9kdWxlWyJjYW52YXMiXSk7DQogIEJyb3dzZXIudXBkYXRlUmVzaXplTGlzdGVuZXJzKCk7DQogfSwNCiB1cGRhdGVDYW52YXNEaW1lbnNpb25zOiBmdW5jdGlvbihjYW52YXMsIHdOYXRpdmUsIGhOYXRpdmUpIHsNCiAgaWYgKHdOYXRpdmUgJiYgaE5hdGl2ZSkgew0KICAgY2FudmFzLndpZHRoTmF0aXZlID0gd05hdGl2ZTsNCiAgIGNhbnZhcy5oZWlnaHROYXRpdmUgPSBoTmF0aXZlOw0KICB9IGVsc2Ugew0KICAgd05hdGl2ZSA9IGNhbnZhcy53aWR0aE5hdGl2ZTsNCiAgIGhOYXRpdmUgPSBjYW52YXMuaGVpZ2h0TmF0aXZlOw0KICB9DQogIHZhciB3ID0gd05hdGl2ZTsNCiAgdmFyIGggPSBoTmF0aXZlOw0KICBpZiAoTW9kdWxlWyJmb3JjZWRBc3BlY3RSYXRpbyJdICYmIE1vZHVsZVsiZm9yY2VkQXNwZWN0UmF0aW8iXSA+IDApIHsNCiAgIGlmICh3IC8gaCA8IE1vZHVsZVsiZm9yY2VkQXNwZWN0UmF0aW8iXSkgew0KICAgIHcgPSBNYXRoLnJvdW5kKGggKiBNb2R1bGVbImZvcmNlZEFzcGVjdFJhdGlvIl0pOw0KICAgfSBlbHNlIHsNCiAgICBoID0gTWF0aC5yb3VuZCh3IC8gTW9kdWxlWyJmb3JjZWRBc3BlY3RSYXRpbyJdKTsNCiAgIH0NCiAgfQ0KICBpZiAoKGRvY3VtZW50WyJmdWxsc2NyZWVuRWxlbWVudCJdIHx8IGRvY3VtZW50WyJtb3pGdWxsU2NyZWVuRWxlbWVudCJdIHx8IGRvY3VtZW50WyJtc0Z1bGxzY3JlZW5FbGVtZW50Il0gfHwgZG9jdW1lbnRbIndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50Il0gfHwgZG9jdW1lbnRbIndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCJdKSA9PT0gY2FudmFzLnBhcmVudE5vZGUgJiYgdHlwZW9mIHNjcmVlbiAhPSAidW5kZWZpbmVkIikgew0KICAgdmFyIGZhY3RvciA9IE1hdGgubWluKHNjcmVlbi53aWR0aCAvIHcsIHNjcmVlbi5oZWlnaHQgLyBoKTsNCiAgIHcgPSBNYXRoLnJvdW5kKHcgKiBmYWN0b3IpOw0KICAgaCA9IE1hdGgucm91bmQoaCAqIGZhY3Rvcik7DQogIH0NCiAgaWYgKEJyb3dzZXIucmVzaXplQ2FudmFzKSB7DQogICBpZiAoY2FudmFzLndpZHRoICE9IHcpIGNhbnZhcy53aWR0aCA9IHc7DQogICBpZiAoY2FudmFzLmhlaWdodCAhPSBoKSBjYW52YXMuaGVpZ2h0ID0gaDsNCiAgIGlmICh0eXBlb2YgY2FudmFzLnN0eWxlICE9ICJ1bmRlZmluZWQiKSB7DQogICAgY2FudmFzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ3aWR0aCIpOw0KICAgIGNhbnZhcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiaGVpZ2h0Iik7DQogICB9DQogIH0gZWxzZSB7DQogICBpZiAoY2FudmFzLndpZHRoICE9IHdOYXRpdmUpIGNhbnZhcy53aWR0aCA9IHdOYXRpdmU7DQogICBpZiAoY2FudmFzLmhlaWdodCAhPSBoTmF0aXZlKSBjYW52YXMuaGVpZ2h0ID0gaE5hdGl2ZTsNCiAgIGlmICh0eXBlb2YgY2FudmFzLnN0eWxlICE9ICJ1bmRlZmluZWQiKSB7DQogICAgaWYgKHcgIT0gd05hdGl2ZSB8fCBoICE9IGhOYXRpdmUpIHsNCiAgICAgY2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCJ3aWR0aCIsIHcgKyAicHgiLCAiaW1wb3J0YW50Iik7DQogICAgIGNhbnZhcy5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwgaCArICJweCIsICJpbXBvcnRhbnQiKTsNCiAgICB9IGVsc2Ugew0KICAgICBjYW52YXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoIndpZHRoIik7DQogICAgIGNhbnZhcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiaGVpZ2h0Iik7DQogICAgfQ0KICAgfQ0KICB9DQogfSwNCiB3Z2V0UmVxdWVzdHM6IHt9LA0KIG5leHRXZ2V0UmVxdWVzdEhhbmRsZTogMCwNCiBnZXROZXh0V2dldFJlcXVlc3RIYW5kbGU6IGZ1bmN0aW9uKCkgew0KICB2YXIgaGFuZGxlID0gQnJvd3Nlci5uZXh0V2dldFJlcXVlc3RIYW5kbGU7DQogIEJyb3dzZXIubmV4dFdnZXRSZXF1ZXN0SGFuZGxlKys7DQogIHJldHVybiBoYW5kbGU7DQogfQ0KfTsNCg0KZnVuY3Rpb24gX1NETF9HZXRUaWNrcygpIHsNCiByZXR1cm4gRGF0ZS5ub3coKSAtIFNETC5zdGFydFRpbWUgfCAwOw0KfQ0KDQpmdW5jdGlvbiBfU0RMX0xvY2tTdXJmYWNlKHN1cmYpIHsNCiB2YXIgc3VyZkRhdGEgPSBTREwuc3VyZmFjZXNbc3VyZl07DQogc3VyZkRhdGEubG9ja2VkKys7DQogaWYgKHN1cmZEYXRhLmxvY2tlZCA+IDEpIHJldHVybiAwOw0KIGlmICghc3VyZkRhdGEuYnVmZmVyKSB7DQogIHN1cmZEYXRhLmJ1ZmZlciA9IF9tYWxsb2Moc3VyZkRhdGEud2lkdGggKiBzdXJmRGF0YS5oZWlnaHQgKiA0KTsNCiAgSEVBUDMyW3N1cmYgKyAyMCA+PiAyXSA9IHN1cmZEYXRhLmJ1ZmZlcjsNCiB9DQogSEVBUDMyW3N1cmYgKyAyMCA+PiAyXSA9IHN1cmZEYXRhLmJ1ZmZlcjsNCiBpZiAoc3VyZiA9PSBTREwuc2NyZWVuICYmIE1vZHVsZS5zY3JlZW5Jc1JlYWRPbmx5ICYmIHN1cmZEYXRhLmltYWdlKSByZXR1cm4gMDsNCiBpZiAoU0RMLmRlZmF1bHRzLmRpc2NhcmRPbkxvY2spIHsNCiAgaWYgKCFzdXJmRGF0YS5pbWFnZSkgew0KICAgc3VyZkRhdGEuaW1hZ2UgPSBzdXJmRGF0YS5jdHguY3JlYXRlSW1hZ2VEYXRhKHN1cmZEYXRhLndpZHRoLCBzdXJmRGF0YS5oZWlnaHQpOw0KICB9DQogIGlmICghU0RMLmRlZmF1bHRzLm9wYXF1ZUZyb250QnVmZmVyKSByZXR1cm47DQogfSBlbHNlIHsNCiAgc3VyZkRhdGEuaW1hZ2UgPSBzdXJmRGF0YS5jdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHN1cmZEYXRhLndpZHRoLCBzdXJmRGF0YS5oZWlnaHQpOw0KIH0NCiBpZiAoc3VyZiA9PSBTREwuc2NyZWVuICYmIFNETC5kZWZhdWx0cy5vcGFxdWVGcm9udEJ1ZmZlcikgew0KICB2YXIgZGF0YSA9IHN1cmZEYXRhLmltYWdlLmRhdGE7DQogIHZhciBudW0gPSBkYXRhLmxlbmd0aDsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0gLyA0OyBpKyspIHsNCiAgIGRhdGFbaSAqIDQgKyAzXSA9IDI1NTsNCiAgfQ0KIH0NCiBpZiAoU0RMLmRlZmF1bHRzLmNvcHlPbkxvY2sgJiYgIVNETC5kZWZhdWx0cy5kaXNjYXJkT25Mb2NrKSB7DQogIGlmIChzdXJmRGF0YS5pc0ZsYWdTZXQoMjA5NzE1MikpIHsNCiAgIHRocm93ICJDb3B5T25Mb2NrIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNETF9Mb2NrU3VyZmFjZSB3aXRoIFNETF9IV1BBTEVUVEUgZmxhZyBzZXQiICsgbmV3IEVycm9yKCkuc3RhY2s7DQogIH0gZWxzZSB7DQogICBIRUFQVTguc2V0KHN1cmZEYXRhLmltYWdlLmRhdGEsIHN1cmZEYXRhLmJ1ZmZlcik7DQogIH0NCiB9DQogcmV0dXJuIDA7DQp9DQoNCnZhciBTREwgPSB7DQogZGVmYXVsdHM6IHsNCiAgd2lkdGg6IDMyMCwNCiAgaGVpZ2h0OiAyMDAsDQogIGNvcHlPbkxvY2s6IGZhbHNlLA0KICBkaXNjYXJkT25Mb2NrOiB0cnVlLA0KICBvcGFxdWVGcm9udEJ1ZmZlcjogZmFsc2UNCiB9LA0KIHZlcnNpb246IG51bGwsDQogc3VyZmFjZXM6IHt9LA0KIGNhbnZhc1Bvb2w6IFtdLA0KIGV2ZW50czogW10sDQogZm9udHM6IFsgbnVsbCBdLA0KIGF1ZGlvczogWyBudWxsIF0sDQogcndvcHM6IFsgbnVsbCBdLA0KIG11c2ljOiB7DQogIGF1ZGlvOiBudWxsLA0KICB2b2x1bWU6IDENCiB9LA0KIG1peGVyRnJlcXVlbmN5OiAyMjA1MCwNCiBtaXhlckZvcm1hdDogMzI3ODQsDQogbWl4ZXJOdW1DaGFubmVsczogMiwNCiBtaXhlckNodW5rU2l6ZTogMTAyNCwNCiBjaGFubmVsTWluaW11bU51bWJlcjogMCwNCiBHTDogZmFsc2UsDQogZ2xBdHRyaWJ1dGVzOiB7DQogIDA6IDMsDQogIDE6IDMsDQogIDI6IDIsDQogIDM6IDAsDQogIDQ6IDAsDQogIDU6IDEsDQogIDY6IDE2LA0KICA3OiAwLA0KICA4OiAwLA0KICA5OiAwLA0KICAxMDogMCwNCiAgMTE6IDAsDQogIDEyOiAwLA0KICAxMzogMCwNCiAgMTQ6IDAsDQogIDE1OiAxLA0KICAxNjogMCwNCiAgMTc6IDAsDQogIDE4OiAwDQogfSwNCiBrZXlib2FyZFN0YXRlOiBudWxsLA0KIGtleWJvYXJkTWFwOiB7fSwNCiBjYW5SZXF1ZXN0RnVsbHNjcmVlbjogZmFsc2UsDQogaXNSZXF1ZXN0aW5nRnVsbHNjcmVlbjogZmFsc2UsDQogdGV4dElucHV0OiBmYWxzZSwNCiBzdGFydFRpbWU6IG51bGwsDQogaW5pdEZsYWdzOiAwLA0KIGJ1dHRvblN0YXRlOiAwLA0KIG1vZFN0YXRlOiAwLA0KIERPTUJ1dHRvbnM6IFsgMCwgMCwgMCBdLA0KIERPTUV2ZW50VG9TRExFdmVudDoge30sDQogVE9VQ0hfREVGQVVMVF9JRDogMCwNCiBldmVudEhhbmRsZXI6IG51bGwsDQogZXZlbnRIYW5kbGVyQ29udGV4dDogbnVsbCwNCiBldmVudEhhbmRsZXJUZW1wOiAwLA0KIGtleUNvZGVzOiB7DQogIDE2OiAxMjQ5LA0KICAxNzogMTI0OCwNCiAgMTg6IDEyNTAsDQogIDIwOiAxMDgxLA0KICAzMzogMTA5OSwNCiAgMzQ6IDExMDIsDQogIDM1OiAxMTAxLA0KICAzNjogMTA5OCwNCiAgMzc6IDExMDQsDQogIDM4OiAxMTA2LA0KICAzOTogMTEwMywNCiAgNDA6IDExMDUsDQogIDQ0OiAzMTYsDQogIDQ1OiAxMDk3LA0KICA0NjogMTI3LA0KICA5MTogMTI1MSwNCiAgOTM6IDExMjUsDQogIDk2OiAxMTIyLA0KICA5NzogMTExMywNCiAgOTg6IDExMTQsDQogIDk5OiAxMTE1LA0KICAxMDA6IDExMTYsDQogIDEwMTogMTExNywNCiAgMTAyOiAxMTE4LA0KICAxMDM6IDExMTksDQogIDEwNDogMTEyMCwNCiAgMTA1OiAxMTIxLA0KICAxMDY6IDExMDksDQogIDEwNzogMTExMSwNCiAgMTA5OiAxMTEwLA0KICAxMTA6IDExMjMsDQogIDExMTogMTEwOCwNCiAgMTEyOiAxMDgyLA0KICAxMTM6IDEwODMsDQogIDExNDogMTA4NCwNCiAgMTE1OiAxMDg1LA0KICAxMTY6IDEwODYsDQogIDExNzogMTA4NywNCiAgMTE4OiAxMDg4LA0KICAxMTk6IDEwODksDQogIDEyMDogMTA5MCwNCiAgMTIxOiAxMDkxLA0KICAxMjI6IDEwOTIsDQogIDEyMzogMTA5MywNCiAgMTI0OiAxMTI4LA0KICAxMjU6IDExMjksDQogIDEyNjogMTEzMCwNCiAgMTI3OiAxMTMxLA0KICAxMjg6IDExMzIsDQogIDEyOTogMTEzMywNCiAgMTMwOiAxMTM0LA0KICAxMzE6IDExMzUsDQogIDEzMjogMTEzNiwNCiAgMTMzOiAxMTM3LA0KICAxMzQ6IDExMzgsDQogIDEzNTogMTEzOSwNCiAgMTQ0OiAxMTA3LA0KICAxNjA6IDk0LA0KICAxNjE6IDMzLA0KICAxNjI6IDM0LA0KICAxNjM6IDM1LA0KICAxNjQ6IDM2LA0KICAxNjU6IDM3LA0KICAxNjY6IDM4LA0KICAxNjc6IDk1LA0KICAxNjg6IDQwLA0KICAxNjk6IDQxLA0KICAxNzA6IDQyLA0KICAxNzE6IDQzLA0KICAxNzI6IDEyNCwNCiAgMTczOiA0NSwNCiAgMTc0OiAxMjMsDQogIDE3NTogMTI1LA0KICAxNzY6IDEyNiwNCiAgMTgxOiAxMjcsDQogIDE4MjogMTI5LA0KICAxODM6IDEyOCwNCiAgMTg4OiA0NCwNCiAgMTkwOiA0NiwNCiAgMTkxOiA0NywNCiAgMTkyOiA5NiwNCiAgMjE5OiA5MSwNCiAgMjIwOiA5MiwNCiAgMjIxOiA5MywNCiAgMjIyOiAzOSwNCiAgMjI0OiAxMjUxDQogfSwNCiBzY2FuQ29kZXM6IHsNCiAgODogNDIsDQogIDk6IDQzLA0KICAxMzogNDAsDQogIDI3OiA0MSwNCiAgMzI6IDQ0LA0KICAzNTogMjA0LA0KICAzOTogNTMsDQogIDQ0OiA1NCwNCiAgNDY6IDU1LA0KICA0NzogNTYsDQogIDQ4OiAzOSwNCiAgNDk6IDMwLA0KICA1MDogMzEsDQogIDUxOiAzMiwNCiAgNTI6IDMzLA0KICA1MzogMzQsDQogIDU0OiAzNSwNCiAgNTU6IDM2LA0KICA1NjogMzcsDQogIDU3OiAzOCwNCiAgNTg6IDIwMywNCiAgNTk6IDUxLA0KICA2MTogNDYsDQogIDkxOiA0NywNCiAgOTI6IDQ5LA0KICA5MzogNDgsDQogIDk2OiA1MiwNCiAgOTc6IDQsDQogIDk4OiA1LA0KICA5OTogNiwNCiAgMTAwOiA3LA0KICAxMDE6IDgsDQogIDEwMjogOSwNCiAgMTAzOiAxMCwNCiAgMTA0OiAxMSwNCiAgMTA1OiAxMiwNCiAgMTA2OiAxMywNCiAgMTA3OiAxNCwNCiAgMTA4OiAxNSwNCiAgMTA5OiAxNiwNCiAgMTEwOiAxNywNCiAgMTExOiAxOCwNCiAgMTEyOiAxOSwNCiAgMTEzOiAyMCwNCiAgMTE0OiAyMSwNCiAgMTE1OiAyMiwNCiAgMTE2OiAyMywNCiAgMTE3OiAyNCwNCiAgMTE4OiAyNSwNCiAgMTE5OiAyNiwNCiAgMTIwOiAyNywNCiAgMTIxOiAyOCwNCiAgMTIyOiAyOSwNCiAgMTI3OiA3NiwNCiAgMzA1OiAyMjQsDQogIDMwODogMjI2LA0KICAzMTY6IDcwDQogfSwNCiBsb2FkUmVjdDogZnVuY3Rpb24ocmVjdCkgew0KICByZXR1cm4gew0KICAgeDogSEVBUDMyW3JlY3QgKyAwID4+IDJdLA0KICAgeTogSEVBUDMyW3JlY3QgKyA0ID4+IDJdLA0KICAgdzogSEVBUDMyW3JlY3QgKyA4ID4+IDJdLA0KICAgaDogSEVBUDMyW3JlY3QgKyAxMiA+PiAyXQ0KICB9Ow0KIH0sDQogdXBkYXRlUmVjdDogZnVuY3Rpb24ocmVjdCwgcikgew0KICBIRUFQMzJbcmVjdCA+PiAyXSA9IHIueDsNCiAgSEVBUDMyW3JlY3QgKyA0ID4+IDJdID0gci55Ow0KICBIRUFQMzJbcmVjdCArIDggPj4gMl0gPSByLnc7DQogIEhFQVAzMltyZWN0ICsgMTIgPj4gMl0gPSByLmg7DQogfSwNCiBpbnRlcnNlY3Rpb25PZlJlY3RzOiBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKSB7DQogIHZhciBsZWZ0WCA9IE1hdGgubWF4KGZpcnN0LngsIHNlY29uZC54KTsNCiAgdmFyIGxlZnRZID0gTWF0aC5tYXgoZmlyc3QueSwgc2Vjb25kLnkpOw0KICB2YXIgcmlnaHRYID0gTWF0aC5taW4oZmlyc3QueCArIGZpcnN0LncsIHNlY29uZC54ICsgc2Vjb25kLncpOw0KICB2YXIgcmlnaHRZID0gTWF0aC5taW4oZmlyc3QueSArIGZpcnN0LmgsIHNlY29uZC55ICsgc2Vjb25kLmgpOw0KICByZXR1cm4gew0KICAgeDogbGVmdFgsDQogICB5OiBsZWZ0WSwNCiAgIHc6IE1hdGgubWF4KGxlZnRYLCByaWdodFgpIC0gbGVmdFgsDQogICBoOiBNYXRoLm1heChsZWZ0WSwgcmlnaHRZKSAtIGxlZnRZDQogIH07DQogfSwNCiBjaGVja1BpeGVsRm9ybWF0OiBmdW5jdGlvbihmbXQpIHt9LA0KIGxvYWRDb2xvclRvQ1NTUkdCOiBmdW5jdGlvbihjb2xvcikgew0KICB2YXIgcmdiYSA9IEhFQVAzMltjb2xvciA+PiAyXTsNCiAgcmV0dXJuICJyZ2IoIiArIChyZ2JhICYgMjU1KSArICIsIiArIChyZ2JhID4+IDggJiAyNTUpICsgIiwiICsgKHJnYmEgPj4gMTYgJiAyNTUpICsgIikiOw0KIH0sDQogbG9hZENvbG9yVG9DU1NSR0JBOiBmdW5jdGlvbihjb2xvcikgew0KICB2YXIgcmdiYSA9IEhFQVAzMltjb2xvciA+PiAyXTsNCiAgcmV0dXJuICJyZ2JhKCIgKyAocmdiYSAmIDI1NSkgKyAiLCIgKyAocmdiYSA+PiA4ICYgMjU1KSArICIsIiArIChyZ2JhID4+IDE2ICYgMjU1KSArICIsIiArIChyZ2JhID4+IDI0ICYgMjU1KSAvIDI1NSArICIpIjsNCiB9LA0KIHRyYW5zbGF0ZUNvbG9yVG9DU1NSR0JBOiBmdW5jdGlvbihyZ2JhKSB7DQogIHJldHVybiAicmdiYSgiICsgKHJnYmEgJiAyNTUpICsgIiwiICsgKHJnYmEgPj4gOCAmIDI1NSkgKyAiLCIgKyAocmdiYSA+PiAxNiAmIDI1NSkgKyAiLCIgKyAocmdiYSA+Pj4gMjQpIC8gMjU1ICsgIikiOw0KIH0sDQogdHJhbnNsYXRlUkdCQVRvQ1NTUkdCQTogZnVuY3Rpb24ociwgZywgYiwgYSkgew0KICByZXR1cm4gInJnYmEoIiArIChyICYgMjU1KSArICIsIiArIChnICYgMjU1KSArICIsIiArIChiICYgMjU1KSArICIsIiArIChhICYgMjU1KSAvIDI1NSArICIpIjsNCiB9LA0KIHRyYW5zbGF0ZVJHQkFUb0NvbG9yOiBmdW5jdGlvbihyLCBnLCBiLCBhKSB7DQogIHJldHVybiByIHwgZyA8PCA4IHwgYiA8PCAxNiB8IGEgPDwgMjQ7DQogfSwNCiBtYWtlU3VyZmFjZTogZnVuY3Rpb24od2lkdGgsIGhlaWdodCwgZmxhZ3MsIHVzZVBhZ2VDYW52YXMsIHNvdXJjZSwgcm1hc2ssIGdtYXNrLCBibWFzaywgYW1hc2spIHsNCiAgZmxhZ3MgPSBmbGFncyB8fCAwOw0KICB2YXIgaXNfU0RMX0hXU1VSRkFDRSA9IGZsYWdzICYgMTsNCiAgdmFyIGlzX1NETF9IV1BBTEVUVEUgPSBmbGFncyAmIDIwOTcxNTI7DQogIHZhciBpc19TRExfT1BFTkdMID0gZmxhZ3MgJiA2NzEwODg2NDsNCiAgdmFyIHN1cmYgPSBfbWFsbG9jKDYwKTsNCiAgdmFyIHBpeGVsRm9ybWF0ID0gX21hbGxvYyg0NCk7DQogIHZhciBicHAgPSBpc19TRExfSFdQQUxFVFRFID8gMSA6IDQ7DQogIHZhciBidWZmZXIgPSAwOw0KICBpZiAoIWlzX1NETF9IV1NVUkZBQ0UgJiYgIWlzX1NETF9PUEVOR0wpIHsNCiAgIGJ1ZmZlciA9IF9tYWxsb2Mod2lkdGggKiBoZWlnaHQgKiA0KTsNCiAgfQ0KICBIRUFQMzJbc3VyZiA+PiAyXSA9IGZsYWdzOw0KICBIRUFQMzJbc3VyZiArIDQgPj4gMl0gPSBwaXhlbEZvcm1hdDsNCiAgSEVBUDMyW3N1cmYgKyA4ID4+IDJdID0gd2lkdGg7DQogIEhFQVAzMltzdXJmICsgMTIgPj4gMl0gPSBoZWlnaHQ7DQogIEhFQVAzMltzdXJmICsgMTYgPj4gMl0gPSB3aWR0aCAqIGJwcDsNCiAgSEVBUDMyW3N1cmYgKyAyMCA+PiAyXSA9IGJ1ZmZlcjsNCiAgSEVBUDMyW3N1cmYgKyAzNiA+PiAyXSA9IDA7DQogIEhFQVAzMltzdXJmICsgNDAgPj4gMl0gPSAwOw0KICBIRUFQMzJbc3VyZiArIDQ0ID4+IDJdID0gTW9kdWxlWyJjYW52YXMiXS53aWR0aDsNCiAgSEVBUDMyW3N1cmYgKyA0OCA+PiAyXSA9IE1vZHVsZVsiY2FudmFzIl0uaGVpZ2h0Ow0KICBIRUFQMzJbc3VyZiArIDU2ID4+IDJdID0gMTsNCiAgSEVBUDMyW3BpeGVsRm9ybWF0ID4+IDJdID0gLTIwNDIyMjQ2MzY7DQogIEhFQVAzMltwaXhlbEZvcm1hdCArIDQgPj4gMl0gPSAwOw0KICBIRUFQOFtwaXhlbEZvcm1hdCArIDggPj4gMF0gPSBicHAgKiA4Ow0KICBIRUFQOFtwaXhlbEZvcm1hdCArIDkgPj4gMF0gPSBicHA7DQogIEhFQVAzMltwaXhlbEZvcm1hdCArIDEyID4+IDJdID0gcm1hc2sgfHwgMjU1Ow0KICBIRUFQMzJbcGl4ZWxGb3JtYXQgKyAxNiA+PiAyXSA9IGdtYXNrIHx8IDY1MjgwOw0KICBIRUFQMzJbcGl4ZWxGb3JtYXQgKyAyMCA+PiAyXSA9IGJtYXNrIHx8IDE2NzExNjgwOw0KICBIRUFQMzJbcGl4ZWxGb3JtYXQgKyAyNCA+PiAyXSA9IGFtYXNrIHx8IDQyNzgxOTAwODA7DQogIFNETC5HTCA9IFNETC5HTCB8fCBpc19TRExfT1BFTkdMOw0KICB2YXIgY2FudmFzOw0KICBpZiAoIXVzZVBhZ2VDYW52YXMpIHsNCiAgIGlmIChTREwuY2FudmFzUG9vbC5sZW5ndGggPiAwKSB7DQogICAgY2FudmFzID0gU0RMLmNhbnZhc1Bvb2wucG9wKCk7DQogICB9IGVsc2Ugew0KICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOw0KICAgfQ0KICAgY2FudmFzLndpZHRoID0gd2lkdGg7DQogICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0Ow0KICB9IGVsc2Ugew0KICAgY2FudmFzID0gTW9kdWxlWyJjYW52YXMiXTsNCiAgfQ0KICB2YXIgd2ViR0xDb250ZXh0QXR0cmlidXRlcyA9IHsNCiAgIGFudGlhbGlhczogU0RMLmdsQXR0cmlidXRlc1sxM10gIT0gMCAmJiBTREwuZ2xBdHRyaWJ1dGVzWzE0XSA+IDEsDQogICBkZXB0aDogU0RMLmdsQXR0cmlidXRlc1s2XSA+IDAsDQogICBzdGVuY2lsOiBTREwuZ2xBdHRyaWJ1dGVzWzddID4gMCwNCiAgIGFscGhhOiBTREwuZ2xBdHRyaWJ1dGVzWzNdID4gMA0KICB9Ow0KICB2YXIgY3R4ID0gQnJvd3Nlci5jcmVhdGVDb250ZXh0KGNhbnZhcywgaXNfU0RMX09QRU5HTCwgdXNlUGFnZUNhbnZhcywgd2ViR0xDb250ZXh0QXR0cmlidXRlcyk7DQogIFNETC5zdXJmYWNlc1tzdXJmXSA9IHsNCiAgIHdpZHRoOiB3aWR0aCwNCiAgIGhlaWdodDogaGVpZ2h0LA0KICAgY2FudmFzOiBjYW52YXMsDQogICBjdHg6IGN0eCwNCiAgIHN1cmY6IHN1cmYsDQogICBidWZmZXI6IGJ1ZmZlciwNCiAgIHBpeGVsRm9ybWF0OiBwaXhlbEZvcm1hdCwNCiAgIGFscGhhOiAyNTUsDQogICBmbGFnczogZmxhZ3MsDQogICBsb2NrZWQ6IDAsDQogICB1c2VQYWdlQ2FudmFzOiB1c2VQYWdlQ2FudmFzLA0KICAgc291cmNlOiBzb3VyY2UsDQogICBpc0ZsYWdTZXQ6IGZ1bmN0aW9uKGZsYWcpIHsNCiAgICByZXR1cm4gZmxhZ3MgJiBmbGFnOw0KICAgfQ0KICB9Ow0KICByZXR1cm4gc3VyZjsNCiB9LA0KIGNvcHlJbmRleGVkQ29sb3JEYXRhOiBmdW5jdGlvbihzdXJmRGF0YSwgclgsIHJZLCByVywgckgpIHsNCiAgaWYgKCFzdXJmRGF0YS5jb2xvcnMpIHsNCiAgIHJldHVybjsNCiAgfQ0KICB2YXIgZnVsbFdpZHRoID0gTW9kdWxlWyJjYW52YXMiXS53aWR0aDsNCiAgdmFyIGZ1bGxIZWlnaHQgPSBNb2R1bGVbImNhbnZhcyJdLmhlaWdodDsNCiAgdmFyIHN0YXJ0WCA9IHJYIHx8IDA7DQogIHZhciBzdGFydFkgPSByWSB8fCAwOw0KICB2YXIgZW5kWCA9IChyVyB8fCBmdWxsV2lkdGggLSBzdGFydFgpICsgc3RhcnRYOw0KICB2YXIgZW5kWSA9IChySCB8fCBmdWxsSGVpZ2h0IC0gc3RhcnRZKSArIHN0YXJ0WTsNCiAgdmFyIGJ1ZmZlciA9IHN1cmZEYXRhLmJ1ZmZlcjsNCiAgaWYgKCFzdXJmRGF0YS5pbWFnZS5kYXRhMzIpIHsNCiAgIHN1cmZEYXRhLmltYWdlLmRhdGEzMiA9IG5ldyBVaW50MzJBcnJheShzdXJmRGF0YS5pbWFnZS5kYXRhLmJ1ZmZlcik7DQogIH0NCiAgdmFyIGRhdGEzMiA9IHN1cmZEYXRhLmltYWdlLmRhdGEzMjsNCiAgdmFyIGNvbG9yczMyID0gc3VyZkRhdGEuY29sb3JzMzI7DQogIGZvciAodmFyIHkgPSBzdGFydFk7IHkgPCBlbmRZOyArK3kpIHsNCiAgIHZhciBiYXNlID0geSAqIGZ1bGxXaWR0aDsNCiAgIGZvciAodmFyIHggPSBzdGFydFg7IHggPCBlbmRYOyArK3gpIHsNCiAgICBkYXRhMzJbYmFzZSArIHhdID0gY29sb3JzMzJbSEVBUFU4W2J1ZmZlciArIGJhc2UgKyB4ID4+IDBdXTsNCiAgIH0NCiAgfQ0KIH0sDQogZnJlZVN1cmZhY2U6IGZ1bmN0aW9uKHN1cmYpIHsNCiAgdmFyIHJlZmNvdW50UG9pbnRlciA9IHN1cmYgKyA1NjsNCiAgdmFyIHJlZmNvdW50ID0gSEVBUDMyW3JlZmNvdW50UG9pbnRlciA+PiAyXTsNCiAgaWYgKHJlZmNvdW50ID4gMSkgew0KICAgSEVBUDMyW3JlZmNvdW50UG9pbnRlciA+PiAyXSA9IHJlZmNvdW50IC0gMTsNCiAgIHJldHVybjsNCiAgfQ0KICB2YXIgaW5mbyA9IFNETC5zdXJmYWNlc1tzdXJmXTsNCiAgaWYgKCFpbmZvLnVzZVBhZ2VDYW52YXMgJiYgaW5mby5jYW52YXMpIFNETC5jYW52YXNQb29sLnB1c2goaW5mby5jYW52YXMpOw0KICBpZiAoaW5mby5idWZmZXIpIF9mcmVlKGluZm8uYnVmZmVyKTsNCiAgX2ZyZWUoaW5mby5waXhlbEZvcm1hdCk7DQogIF9mcmVlKHN1cmYpOw0KICBTREwuc3VyZmFjZXNbc3VyZl0gPSBudWxsOw0KICBpZiAoc3VyZiA9PT0gU0RMLnNjcmVlbikgew0KICAgU0RMLnNjcmVlbiA9IG51bGw7DQogIH0NCiB9LA0KIGJsaXRTdXJmYWNlOiBmdW5jdGlvbihzcmMsIHNyY3JlY3QsIGRzdCwgZHN0cmVjdCwgc2NhbGUpIHsNCiAgdmFyIHNyY0RhdGEgPSBTREwuc3VyZmFjZXNbc3JjXTsNCiAgdmFyIGRzdERhdGEgPSBTREwuc3VyZmFjZXNbZHN0XTsNCiAgdmFyIHNyLCBkcjsNCiAgaWYgKHNyY3JlY3QpIHsNCiAgIHNyID0gU0RMLmxvYWRSZWN0KHNyY3JlY3QpOw0KICB9IGVsc2Ugew0KICAgc3IgPSB7DQogICAgeDogMCwNCiAgICB5OiAwLA0KICAgIHc6IHNyY0RhdGEud2lkdGgsDQogICAgaDogc3JjRGF0YS5oZWlnaHQNCiAgIH07DQogIH0NCiAgaWYgKGRzdHJlY3QpIHsNCiAgIGRyID0gU0RMLmxvYWRSZWN0KGRzdHJlY3QpOw0KICB9IGVsc2Ugew0KICAgZHIgPSB7DQogICAgeDogMCwNCiAgICB5OiAwLA0KICAgIHc6IHNyY0RhdGEud2lkdGgsDQogICAgaDogc3JjRGF0YS5oZWlnaHQNCiAgIH07DQogIH0NCiAgaWYgKGRzdERhdGEuY2xpcFJlY3QpIHsNCiAgIHZhciB3aWR0aFNjYWxlID0gIXNjYWxlIHx8IHNyLncgPT09IDAgPyAxIDogc3IudyAvIGRyLnc7DQogICB2YXIgaGVpZ2h0U2NhbGUgPSAhc2NhbGUgfHwgc3IuaCA9PT0gMCA/IDEgOiBzci5oIC8gZHIuaDsNCiAgIGRyID0gU0RMLmludGVyc2VjdGlvbk9mUmVjdHMoZHN0RGF0YS5jbGlwUmVjdCwgZHIpOw0KICAgc3IudyA9IGRyLncgKiB3aWR0aFNjYWxlOw0KICAgc3IuaCA9IGRyLmggKiBoZWlnaHRTY2FsZTsNCiAgIGlmIChkc3RyZWN0KSB7DQogICAgU0RMLnVwZGF0ZVJlY3QoZHN0cmVjdCwgZHIpOw0KICAgfQ0KICB9DQogIHZhciBibGl0dywgYmxpdGg7DQogIGlmIChzY2FsZSkgew0KICAgYmxpdHcgPSBkci53Ow0KICAgYmxpdGggPSBkci5oOw0KICB9IGVsc2Ugew0KICAgYmxpdHcgPSBzci53Ow0KICAgYmxpdGggPSBzci5oOw0KICB9DQogIGlmIChzci53ID09PSAwIHx8IHNyLmggPT09IDAgfHwgYmxpdHcgPT09IDAgfHwgYmxpdGggPT09IDApIHsNCiAgIHJldHVybiAwOw0KICB9DQogIHZhciBvbGRBbHBoYSA9IGRzdERhdGEuY3R4Lmdsb2JhbEFscGhhOw0KICBkc3REYXRhLmN0eC5nbG9iYWxBbHBoYSA9IHNyY0RhdGEuYWxwaGEgLyAyNTU7DQogIGRzdERhdGEuY3R4LmRyYXdJbWFnZShzcmNEYXRhLmNhbnZhcywgc3IueCwgc3IueSwgc3Iudywgc3IuaCwgZHIueCwgZHIueSwgYmxpdHcsIGJsaXRoKTsNCiAgZHN0RGF0YS5jdHguZ2xvYmFsQWxwaGEgPSBvbGRBbHBoYTsNCiAgaWYgKGRzdCAhPSBTREwuc2NyZWVuKSB7DQogICB3YXJuT25jZSgiV0FSTklORzogY29weWluZyBjYW52YXMgZGF0YSB0byBtZW1vcnkgZm9yIGNvbXBhdGliaWxpdHkiKTsNCiAgIF9TRExfTG9ja1N1cmZhY2UoZHN0KTsNCiAgIGRzdERhdGEubG9ja2VkLS07DQogIH0NCiAgcmV0dXJuIDA7DQogfSwNCiBkb3duRmluZ2Vyczoge30sDQogc2F2ZWRLZXlkb3duOiBudWxsLA0KIHJlY2VpdmVFdmVudDogZnVuY3Rpb24oZXZlbnQpIHsNCiAgZnVuY3Rpb24gdW5wcmVzc0FsbFByZXNzZWRLZXlzKCkgew0KICAgZm9yICh2YXIgY29kZSBpbiBTREwua2V5Ym9hcmRNYXApIHsNCiAgICBTREwuZXZlbnRzLnB1c2goew0KICAgICB0eXBlOiAia2V5dXAiLA0KICAgICBrZXlDb2RlOiBTREwua2V5Ym9hcmRNYXBbY29kZV0NCiAgICB9KTsNCiAgIH0NCiAgfQ0KICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsNCiAgY2FzZSAidG91Y2hzdGFydCI6DQogIGNhc2UgInRvdWNobW92ZSI6DQogICB7DQogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICB2YXIgdG91Y2hlcyA9IFtdOw0KICAgIGlmIChldmVudC50eXBlID09PSAidG91Y2hzdGFydCIpIHsNCiAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC50b3VjaGVzLmxlbmd0aDsgaSsrKSB7DQogICAgICB2YXIgdG91Y2ggPSBldmVudC50b3VjaGVzW2ldOw0KICAgICAgaWYgKFNETC5kb3duRmluZ2Vyc1t0b3VjaC5pZGVudGlmaWVyXSAhPSB0cnVlKSB7DQogICAgICAgU0RMLmRvd25GaW5nZXJzW3RvdWNoLmlkZW50aWZpZXJdID0gdHJ1ZTsNCiAgICAgICB0b3VjaGVzLnB1c2godG91Y2gpOw0KICAgICAgfQ0KICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXM7DQogICAgfQ0KICAgIHZhciBmaXJzdFRvdWNoID0gdG91Y2hlc1swXTsNCiAgICBpZiAoZmlyc3RUb3VjaCkgew0KICAgICBpZiAoZXZlbnQudHlwZSA9PSAidG91Y2hzdGFydCIpIHsNCiAgICAgIFNETC5ET01CdXR0b25zWzBdID0gMTsNCiAgICAgfQ0KICAgICB2YXIgbW91c2VFdmVudFR5cGU7DQogICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgew0KICAgICBjYXNlICJ0b3VjaHN0YXJ0IjoNCiAgICAgIG1vdXNlRXZlbnRUeXBlID0gIm1vdXNlZG93biI7DQogICAgICBicmVhazsNCg0KICAgICBjYXNlICJ0b3VjaG1vdmUiOg0KICAgICAgbW91c2VFdmVudFR5cGUgPSAibW91c2Vtb3ZlIjsNCiAgICAgIGJyZWFrOw0KICAgICB9DQogICAgIHZhciBtb3VzZUV2ZW50ID0gew0KICAgICAgdHlwZTogbW91c2VFdmVudFR5cGUsDQogICAgICBidXR0b246IDAsDQogICAgICBwYWdlWDogZmlyc3RUb3VjaC5jbGllbnRYLA0KICAgICAgcGFnZVk6IGZpcnN0VG91Y2guY2xpZW50WQ0KICAgICB9Ow0KICAgICBTREwuZXZlbnRzLnB1c2gobW91c2VFdmVudCk7DQogICAgfQ0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKykgew0KICAgICB2YXIgdG91Y2ggPSB0b3VjaGVzW2ldOw0KICAgICBTREwuZXZlbnRzLnB1c2goew0KICAgICAgdHlwZTogZXZlbnQudHlwZSwNCiAgICAgIHRvdWNoOiB0b3VjaA0KICAgICB9KTsNCiAgICB9DQogICAgYnJlYWs7DQogICB9DQoNCiAgY2FzZSAidG91Y2hlbmQiOg0KICAgew0KICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGkrKykgew0KICAgICB2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1tpXTsNCiAgICAgaWYgKFNETC5kb3duRmluZ2Vyc1t0b3VjaC5pZGVudGlmaWVyXSA9PT0gdHJ1ZSkgew0KICAgICAgZGVsZXRlIFNETC5kb3duRmluZ2Vyc1t0b3VjaC5pZGVudGlmaWVyXTsNCiAgICAgfQ0KICAgIH0NCiAgICB2YXIgbW91c2VFdmVudCA9IHsNCiAgICAgdHlwZTogIm1vdXNldXAiLA0KICAgICBidXR0b246IDAsDQogICAgIHBhZ2VYOiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYLA0KICAgICBwYWdlWTogZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WQ0KICAgIH07DQogICAgU0RMLkRPTUJ1dHRvbnNbMF0gPSAwOw0KICAgIFNETC5ldmVudHMucHVzaChtb3VzZUV2ZW50KTsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgaSsrKSB7DQogICAgIHZhciB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzW2ldOw0KICAgICBTREwuZXZlbnRzLnB1c2goew0KICAgICAgdHlwZTogInRvdWNoZW5kIiwNCiAgICAgIHRvdWNoOiB0b3VjaA0KICAgICB9KTsNCiAgICB9DQogICAgYnJlYWs7DQogICB9DQoNCiAgY2FzZSAiRE9NTW91c2VTY3JvbGwiOg0KICBjYXNlICJtb3VzZXdoZWVsIjoNCiAgY2FzZSAid2hlZWwiOg0KICAgdmFyIGRlbHRhID0gLUJyb3dzZXIuZ2V0TW91c2VXaGVlbERlbHRhKGV2ZW50KTsNCiAgIGRlbHRhID0gZGVsdGEgPT0gMCA/IDAgOiBkZWx0YSA+IDAgPyBNYXRoLm1heChkZWx0YSwgMSkgOiBNYXRoLm1pbihkZWx0YSwgLTEpOw0KICAgdmFyIGJ1dHRvbiA9IGRlbHRhID4gMCA/IDMgOiA0Ow0KICAgU0RMLmV2ZW50cy5wdXNoKHsNCiAgICB0eXBlOiAibW91c2Vkb3duIiwNCiAgICBidXR0b246IGJ1dHRvbiwNCiAgICBwYWdlWDogZXZlbnQucGFnZVgsDQogICAgcGFnZVk6IGV2ZW50LnBhZ2VZDQogICB9KTsNCiAgIFNETC5ldmVudHMucHVzaCh7DQogICAgdHlwZTogIm1vdXNldXAiLA0KICAgIGJ1dHRvbjogYnV0dG9uLA0KICAgIHBhZ2VYOiBldmVudC5wYWdlWCwNCiAgICBwYWdlWTogZXZlbnQucGFnZVkNCiAgIH0pOw0KICAgU0RMLmV2ZW50cy5wdXNoKHsNCiAgICB0eXBlOiAid2hlZWwiLA0KICAgIGRlbHRhWDogMCwNCiAgICBkZWx0YVk6IGRlbHRhDQogICB9KTsNCiAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICBicmVhazsNCg0KICBjYXNlICJtb3VzZW1vdmUiOg0KICAgaWYgKFNETC5ET01CdXR0b25zWzBdID09PSAxKSB7DQogICAgU0RMLmV2ZW50cy5wdXNoKHsNCiAgICAgdHlwZTogInRvdWNobW92ZSIsDQogICAgIHRvdWNoOiB7DQogICAgICBpZGVudGlmaWVyOiAwLA0KICAgICAgZGV2aWNlSUQ6IC0xLA0KICAgICAgcGFnZVg6IGV2ZW50LnBhZ2VYLA0KICAgICAgcGFnZVk6IGV2ZW50LnBhZ2VZDQogICAgIH0NCiAgICB9KTsNCiAgIH0NCiAgIGlmIChCcm93c2VyLnBvaW50ZXJMb2NrKSB7DQogICAgaWYgKCJtb3pNb3ZlbWVudFgiIGluIGV2ZW50KSB7DQogICAgIGV2ZW50WyJtb3ZlbWVudFgiXSA9IGV2ZW50WyJtb3pNb3ZlbWVudFgiXTsNCiAgICAgZXZlbnRbIm1vdmVtZW50WSJdID0gZXZlbnRbIm1vek1vdmVtZW50WSJdOw0KICAgIH0NCiAgICBpZiAoZXZlbnRbIm1vdmVtZW50WCJdID09IDAgJiYgZXZlbnRbIm1vdmVtZW50WSJdID09IDApIHsNCiAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICAgcmV0dXJuOw0KICAgIH0NCiAgIH0NCg0KICBjYXNlICJrZXlkb3duIjoNCiAgY2FzZSAia2V5dXAiOg0KICBjYXNlICJrZXlwcmVzcyI6DQogIGNhc2UgIm1vdXNlZG93biI6DQogIGNhc2UgIm1vdXNldXAiOg0KICAgaWYgKGV2ZW50LnR5cGUgIT09ICJrZXlkb3duIiB8fCAhU0RMLnVuaWNvZGUgJiYgIVNETC50ZXh0SW5wdXQgfHwgKGV2ZW50LmtleUNvZGUgPT09IDggfHwgZXZlbnQua2V5Q29kZSA9PT0gOSkpIHt9DQogICBpZiAoZXZlbnQudHlwZSA9PSAibW91c2Vkb3duIikgew0KICAgIFNETC5ET01CdXR0b25zW2V2ZW50LmJ1dHRvbl0gPSAxOw0KICAgIFNETC5ldmVudHMucHVzaCh7DQogICAgIHR5cGU6ICJ0b3VjaHN0YXJ0IiwNCiAgICAgdG91Y2g6IHsNCiAgICAgIGlkZW50aWZpZXI6IDAsDQogICAgICBkZXZpY2VJRDogLTEsDQogICAgICBwYWdlWDogZXZlbnQucGFnZVgsDQogICAgICBwYWdlWTogZXZlbnQucGFnZVkNCiAgICAgfQ0KICAgIH0pOw0KICAgfSBlbHNlIGlmIChldmVudC50eXBlID09ICJtb3VzZXVwIikgew0KICAgIGlmICghU0RMLkRPTUJ1dHRvbnNbZXZlbnQuYnV0dG9uXSkgew0KICAgICByZXR1cm47DQogICAgfQ0KICAgIFNETC5ldmVudHMucHVzaCh7DQogICAgIHR5cGU6ICJ0b3VjaGVuZCIsDQogICAgIHRvdWNoOiB7DQogICAgICBpZGVudGlmaWVyOiAwLA0KICAgICAgZGV2aWNlSUQ6IC0xLA0KICAgICAgcGFnZVg6IGV2ZW50LnBhZ2VYLA0KICAgICAgcGFnZVk6IGV2ZW50LnBhZ2VZDQogICAgIH0NCiAgICB9KTsNCiAgICBTREwuRE9NQnV0dG9uc1tldmVudC5idXR0b25dID0gMDsNCiAgIH0NCiAgIGlmIChldmVudC50eXBlID09PSAia2V5ZG93biIgfHwgZXZlbnQudHlwZSA9PT0gIm1vdXNlZG93biIpIHsNCiAgICBTREwuY2FuUmVxdWVzdEZ1bGxzY3JlZW4gPSB0cnVlOw0KICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSAia2V5dXAiIHx8IGV2ZW50LnR5cGUgPT09ICJtb3VzZXVwIikgew0KICAgIGlmIChTREwuaXNSZXF1ZXN0aW5nRnVsbHNjcmVlbikgew0KICAgICBNb2R1bGVbInJlcXVlc3RGdWxsc2NyZWVuIl0oZmFsc2UsIHRydWUpOw0KICAgICBTREwuaXNSZXF1ZXN0aW5nRnVsbHNjcmVlbiA9IGZhbHNlOw0KICAgIH0NCiAgICBTREwuY2FuUmVxdWVzdEZ1bGxzY3JlZW4gPSBmYWxzZTsNCiAgIH0NCiAgIGlmIChldmVudC50eXBlID09PSAia2V5cHJlc3MiICYmIFNETC5zYXZlZEtleWRvd24pIHsNCiAgICBTREwuc2F2ZWRLZXlkb3duLmtleXByZXNzQ2hhckNvZGUgPSBldmVudC5jaGFyQ29kZTsNCiAgICBTREwuc2F2ZWRLZXlkb3duID0gbnVsbDsNCiAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gImtleWRvd24iKSB7DQogICAgU0RMLnNhdmVkS2V5ZG93biA9IGV2ZW50Ow0KICAgfQ0KICAgaWYgKGV2ZW50LnR5cGUgIT09ICJrZXlwcmVzcyIgfHwgU0RMLnRleHRJbnB1dCkgew0KICAgIFNETC5ldmVudHMucHVzaChldmVudCk7DQogICB9DQogICBicmVhazsNCg0KICBjYXNlICJtb3VzZW91dCI6DQogICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykgew0KICAgIGlmIChTREwuRE9NQnV0dG9uc1tpXSkgew0KICAgICBTREwuZXZlbnRzLnB1c2goew0KICAgICAgdHlwZTogIm1vdXNldXAiLA0KICAgICAgYnV0dG9uOiBpLA0KICAgICAgcGFnZVg6IGV2ZW50LnBhZ2VYLA0KICAgICAgcGFnZVk6IGV2ZW50LnBhZ2VZDQogICAgIH0pOw0KICAgICBTREwuRE9NQnV0dG9uc1tpXSA9IDA7DQogICAgfQ0KICAgfQ0KICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgIGJyZWFrOw0KDQogIGNhc2UgImZvY3VzIjoNCiAgIFNETC5ldmVudHMucHVzaChldmVudCk7DQogICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgYnJlYWs7DQoNCiAgY2FzZSAiYmx1ciI6DQogICBTREwuZXZlbnRzLnB1c2goZXZlbnQpOw0KICAgdW5wcmVzc0FsbFByZXNzZWRLZXlzKCk7DQogICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgYnJlYWs7DQoNCiAgY2FzZSAidmlzaWJpbGl0eWNoYW5nZSI6DQogICBTREwuZXZlbnRzLnB1c2goew0KICAgIHR5cGU6ICJ2aXNpYmlsaXR5Y2hhbmdlIiwNCiAgICB2aXNpYmxlOiAhZG9jdW1lbnQuaGlkZGVuDQogICB9KTsNCiAgIHVucHJlc3NBbGxQcmVzc2VkS2V5cygpOw0KICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgIGJyZWFrOw0KDQogIGNhc2UgInVubG9hZCI6DQogICBpZiAoQnJvd3Nlci5tYWluTG9vcC5ydW5uZXIpIHsNCiAgICBTREwuZXZlbnRzLnB1c2goZXZlbnQpOw0KICAgIEJyb3dzZXIubWFpbkxvb3AucnVubmVyKCk7DQogICB9DQogICByZXR1cm47DQoNCiAgY2FzZSAicmVzaXplIjoNCiAgIFNETC5ldmVudHMucHVzaChldmVudCk7DQogICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHsNCiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgfQ0KICAgYnJlYWs7DQogIH0NCiAgaWYgKFNETC5ldmVudHMubGVuZ3RoID49IDFlNCkgew0KICAgZXJyKCJTREwgZXZlbnQgcXVldWUgZnVsbCwgZHJvcHBpbmcgZXZlbnRzIik7DQogICBTREwuZXZlbnRzID0gU0RMLmV2ZW50cy5zbGljZSgwLCAxZTQpOw0KICB9DQogIFNETC5mbHVzaEV2ZW50c1RvSGFuZGxlcigpOw0KICByZXR1cm47DQogfSwNCiBsb29rdXBLZXlDb2RlRm9yRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7DQogIHZhciBjb2RlID0gZXZlbnQua2V5Q29kZTsNCiAgaWYgKGNvZGUgPj0gNjUgJiYgY29kZSA8PSA5MCkgew0KICAgY29kZSArPSAzMjsNCiAgfSBlbHNlIHsNCiAgIGNvZGUgPSBTREwua2V5Q29kZXNbZXZlbnQua2V5Q29kZV0gfHwgZXZlbnQua2V5Q29kZTsNCiAgIGlmIChldmVudC5sb2NhdGlvbiA9PT0gS2V5Ym9hcmRFdmVudC5ET01fS0VZX0xPQ0FUSU9OX1JJR0hUICYmIGNvZGUgPj0gKDIyNCB8IDEgPDwgMTApICYmIGNvZGUgPD0gKDIyNyB8IDEgPDwgMTApKSB7DQogICAgY29kZSArPSA0Ow0KICAgfQ0KICB9DQogIHJldHVybiBjb2RlOw0KIH0sDQogaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7DQogIGlmIChldmVudC5oYW5kbGVkKSByZXR1cm47DQogIGV2ZW50LmhhbmRsZWQgPSB0cnVlOw0KICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsNCiAgY2FzZSAidG91Y2hzdGFydCI6DQogIGNhc2UgInRvdWNoZW5kIjoNCiAgY2FzZSAidG91Y2htb3ZlIjoNCiAgIHsNCiAgICBCcm93c2VyLmNhbGN1bGF0ZU1vdXNlRXZlbnQoZXZlbnQpOw0KICAgIGJyZWFrOw0KICAgfQ0KDQogIGNhc2UgImtleWRvd24iOg0KICBjYXNlICJrZXl1cCI6DQogICB7DQogICAgdmFyIGRvd24gPSBldmVudC50eXBlID09PSAia2V5ZG93biI7DQogICAgdmFyIGNvZGUgPSBTREwubG9va3VwS2V5Q29kZUZvckV2ZW50KGV2ZW50KTsNCiAgICBIRUFQOFtTREwua2V5Ym9hcmRTdGF0ZSArIGNvZGUgPj4gMF0gPSBkb3duOw0KICAgIFNETC5tb2RTdGF0ZSA9IChIRUFQOFtTREwua2V5Ym9hcmRTdGF0ZSArIDEyNDggPj4gMF0gPyA2NCA6IDApIHwgKEhFQVA4W1NETC5rZXlib2FyZFN0YXRlICsgMTI0OSA+PiAwXSA/IDEgOiAwKSB8IChIRUFQOFtTREwua2V5Ym9hcmRTdGF0ZSArIDEyNTAgPj4gMF0gPyAyNTYgOiAwKSB8IChIRUFQOFtTREwua2V5Ym9hcmRTdGF0ZSArIDEyNTIgPj4gMF0gPyAxMjggOiAwKSB8IChIRUFQOFtTREwua2V5Ym9hcmRTdGF0ZSArIDEyNTMgPj4gMF0gPyAyIDogMCkgfCAoSEVBUDhbU0RMLmtleWJvYXJkU3RhdGUgKyAxMjU0ID4+IDBdID8gNTEyIDogMCk7DQogICAgaWYgKGRvd24pIHsNCiAgICAgU0RMLmtleWJvYXJkTWFwW2NvZGVdID0gZXZlbnQua2V5Q29kZTsNCiAgICB9IGVsc2Ugew0KICAgICBkZWxldGUgU0RMLmtleWJvYXJkTWFwW2NvZGVdOw0KICAgIH0NCiAgICBicmVhazsNCiAgIH0NCg0KICBjYXNlICJtb3VzZWRvd24iOg0KICBjYXNlICJtb3VzZXVwIjoNCiAgIGlmIChldmVudC50eXBlID09ICJtb3VzZWRvd24iKSB7DQogICAgU0RMLmJ1dHRvblN0YXRlIHw9IDEgPDwgZXZlbnQuYnV0dG9uOw0KICAgfSBlbHNlIGlmIChldmVudC50eXBlID09ICJtb3VzZXVwIikgew0KICAgIFNETC5idXR0b25TdGF0ZSAmPSB+KDEgPDwgZXZlbnQuYnV0dG9uKTsNCiAgIH0NCg0KICBjYXNlICJtb3VzZW1vdmUiOg0KICAgew0KICAgIEJyb3dzZXIuY2FsY3VsYXRlTW91c2VFdmVudChldmVudCk7DQogICAgYnJlYWs7DQogICB9DQogIH0NCiB9LA0KIGZsdXNoRXZlbnRzVG9IYW5kbGVyOiBmdW5jdGlvbigpIHsNCiAgaWYgKCFTREwuZXZlbnRIYW5kbGVyKSByZXR1cm47DQogIHdoaWxlIChTREwucG9sbEV2ZW50KFNETC5ldmVudEhhbmRsZXJUZW1wKSkgew0KICAgTW9kdWxlWyJkeW5DYWxsX2lpaSJdKFNETC5ldmVudEhhbmRsZXIsIFNETC5ldmVudEhhbmRsZXJDb250ZXh0LCBTREwuZXZlbnRIYW5kbGVyVGVtcCk7DQogIH0NCiB9LA0KIHBvbGxFdmVudDogZnVuY3Rpb24ocHRyKSB7DQogIGlmIChTREwuaW5pdEZsYWdzICYgNTEyICYmIFNETC5qb3lzdGlja0V2ZW50U3RhdGUpIHsNCiAgIFNETC5xdWVyeUpveXN0aWNrcygpOw0KICB9DQogIGlmIChwdHIpIHsNCiAgIHdoaWxlIChTREwuZXZlbnRzLmxlbmd0aCA+IDApIHsNCiAgICBpZiAoU0RMLm1ha2VDRXZlbnQoU0RMLmV2ZW50cy5zaGlmdCgpLCBwdHIpICE9PSBmYWxzZSkgcmV0dXJuIDE7DQogICB9DQogICByZXR1cm4gMDsNCiAgfSBlbHNlIHsNCiAgIHJldHVybiBTREwuZXZlbnRzLmxlbmd0aCA+IDA7DQogIH0NCiB9LA0KIG1ha2VDRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50LCBwdHIpIHsNCiAgaWYgKHR5cGVvZiBldmVudCA9PT0gIm51bWJlciIpIHsNCiAgIF9tZW1jcHkocHRyLCBldmVudCwgMjgpOw0KICAgX2ZyZWUoZXZlbnQpOw0KICAgcmV0dXJuOw0KICB9DQogIFNETC5oYW5kbGVFdmVudChldmVudCk7DQogIHN3aXRjaCAoZXZlbnQudHlwZSkgew0KICBjYXNlICJrZXlkb3duIjoNCiAgY2FzZSAia2V5dXAiOg0KICAgew0KICAgIHZhciBkb3duID0gZXZlbnQudHlwZSA9PT0gImtleWRvd24iOw0KICAgIHZhciBrZXkgPSBTREwubG9va3VwS2V5Q29kZUZvckV2ZW50KGV2ZW50KTsNCiAgICB2YXIgc2NhbjsNCiAgICBpZiAoa2V5ID49IDEwMjQpIHsNCiAgICAgc2NhbiA9IGtleSAtIDEwMjQ7DQogICAgfSBlbHNlIHsNCiAgICAgc2NhbiA9IFNETC5zY2FuQ29kZXNba2V5XSB8fCBrZXk7DQogICAgfQ0KICAgIEhFQVAzMltwdHIgPj4gMl0gPSBTREwuRE9NRXZlbnRUb1NETEV2ZW50W2V2ZW50LnR5cGVdOw0KICAgIEhFQVA4W3B0ciArIDggPj4gMF0gPSBkb3duID8gMSA6IDA7DQogICAgSEVBUDhbcHRyICsgOSA+PiAwXSA9IDA7DQogICAgSEVBUDMyW3B0ciArIDEyID4+IDJdID0gc2NhbjsNCiAgICBIRUFQMzJbcHRyICsgMTYgPj4gMl0gPSBrZXk7DQogICAgSEVBUDE2W3B0ciArIDIwID4+IDFdID0gU0RMLm1vZFN0YXRlOw0KICAgIEhFQVAzMltwdHIgKyAyNCA+PiAyXSA9IGV2ZW50LmtleXByZXNzQ2hhckNvZGUgfHwga2V5Ow0KICAgIGJyZWFrOw0KICAgfQ0KDQogIGNhc2UgImtleXByZXNzIjoNCiAgIHsNCiAgICBIRUFQMzJbcHRyID4+IDJdID0gU0RMLkRPTUV2ZW50VG9TRExFdmVudFtldmVudC50eXBlXTsNCiAgICB2YXIgY1N0ciA9IGludEFycmF5RnJvbVN0cmluZyhTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSk7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjU3RyLmxlbmd0aDsgKytpKSB7DQogICAgIEhFQVA4W3B0ciArICg4ICsgaSkgPj4gMF0gPSBjU3RyW2ldOw0KICAgIH0NCiAgICBicmVhazsNCiAgIH0NCg0KICBjYXNlICJtb3VzZWRvd24iOg0KICBjYXNlICJtb3VzZXVwIjoNCiAgY2FzZSAibW91c2Vtb3ZlIjoNCiAgIHsNCiAgICBpZiAoZXZlbnQudHlwZSAhPSAibW91c2Vtb3ZlIikgew0KICAgICB2YXIgZG93biA9IGV2ZW50LnR5cGUgPT09ICJtb3VzZWRvd24iOw0KICAgICBIRUFQMzJbcHRyID4+IDJdID0gU0RMLkRPTUV2ZW50VG9TRExFdmVudFtldmVudC50eXBlXTsNCiAgICAgSEVBUDMyW3B0ciArIDQgPj4gMl0gPSAwOw0KICAgICBIRUFQMzJbcHRyICsgOCA+PiAyXSA9IDA7DQogICAgIEhFQVAzMltwdHIgKyAxMiA+PiAyXSA9IDA7DQogICAgIEhFQVA4W3B0ciArIDE2ID4+IDBdID0gZXZlbnQuYnV0dG9uICsgMTsNCiAgICAgSEVBUDhbcHRyICsgMTcgPj4gMF0gPSBkb3duID8gMSA6IDA7DQogICAgIEhFQVAzMltwdHIgKyAyMCA+PiAyXSA9IEJyb3dzZXIubW91c2VYOw0KICAgICBIRUFQMzJbcHRyICsgMjQgPj4gMl0gPSBCcm93c2VyLm1vdXNlWTsNCiAgICB9IGVsc2Ugew0KICAgICBIRUFQMzJbcHRyID4+IDJdID0gU0RMLkRPTUV2ZW50VG9TRExFdmVudFtldmVudC50eXBlXTsNCiAgICAgSEVBUDMyW3B0ciArIDQgPj4gMl0gPSAwOw0KICAgICBIRUFQMzJbcHRyICsgOCA+PiAyXSA9IDA7DQogICAgIEhFQVAzMltwdHIgKyAxMiA+PiAyXSA9IDA7DQogICAgIEhFQVAzMltwdHIgKyAxNiA+PiAyXSA9IFNETC5idXR0b25TdGF0ZTsNCiAgICAgSEVBUDMyW3B0ciArIDIwID4+IDJdID0gQnJvd3Nlci5tb3VzZVg7DQogICAgIEhFQVAzMltwdHIgKyAyNCA+PiAyXSA9IEJyb3dzZXIubW91c2VZOw0KICAgICBIRUFQMzJbcHRyICsgMjggPj4gMl0gPSBCcm93c2VyLm1vdXNlTW92ZW1lbnRYOw0KICAgICBIRUFQMzJbcHRyICsgMzIgPj4gMl0gPSBCcm93c2VyLm1vdXNlTW92ZW1lbnRZOw0KICAgIH0NCiAgICBicmVhazsNCiAgIH0NCg0KICBjYXNlICJ3aGVlbCI6DQogICB7DQogICAgSEVBUDMyW3B0ciA+PiAyXSA9IFNETC5ET01FdmVudFRvU0RMRXZlbnRbZXZlbnQudHlwZV07DQogICAgSEVBUDMyW3B0ciArIDE2ID4+IDJdID0gZXZlbnQuZGVsdGFYOw0KICAgIEhFQVAzMltwdHIgKyAyMCA+PiAyXSA9IGV2ZW50LmRlbHRhWTsNCiAgICBicmVhazsNCiAgIH0NCg0KICBjYXNlICJ0b3VjaHN0YXJ0IjoNCiAgY2FzZSAidG91Y2hlbmQiOg0KICBjYXNlICJ0b3VjaG1vdmUiOg0KICAgew0KICAgIHZhciB0b3VjaCA9IGV2ZW50LnRvdWNoOw0KICAgIGlmICghQnJvd3Nlci50b3VjaGVzW3RvdWNoLmlkZW50aWZpZXJdKSBicmVhazsNCiAgICB2YXIgdyA9IE1vZHVsZVsiY2FudmFzIl0ud2lkdGg7DQogICAgdmFyIGggPSBNb2R1bGVbImNhbnZhcyJdLmhlaWdodDsNCiAgICB2YXIgeCA9IEJyb3dzZXIudG91Y2hlc1t0b3VjaC5pZGVudGlmaWVyXS54IC8gdzsNCiAgICB2YXIgeSA9IEJyb3dzZXIudG91Y2hlc1t0b3VjaC5pZGVudGlmaWVyXS55IC8gaDsNCiAgICB2YXIgbHggPSBCcm93c2VyLmxhc3RUb3VjaGVzW3RvdWNoLmlkZW50aWZpZXJdLnggLyB3Ow0KICAgIHZhciBseSA9IEJyb3dzZXIubGFzdFRvdWNoZXNbdG91Y2guaWRlbnRpZmllcl0ueSAvIGg7DQogICAgdmFyIGR4ID0geCAtIGx4Ow0KICAgIHZhciBkeSA9IHkgLSBseTsNCiAgICBpZiAodG91Y2hbImRldmljZUlEIl0gPT09IHVuZGVmaW5lZCkgdG91Y2guZGV2aWNlSUQgPSBTREwuVE9VQ0hfREVGQVVMVF9JRDsNCiAgICBpZiAoZHggPT09IDAgJiYgZHkgPT09IDAgJiYgZXZlbnQudHlwZSA9PT0gInRvdWNobW92ZSIpIHJldHVybiBmYWxzZTsNCiAgICBIRUFQMzJbcHRyID4+IDJdID0gU0RMLkRPTUV2ZW50VG9TRExFdmVudFtldmVudC50eXBlXTsNCiAgICBIRUFQMzJbcHRyICsgNCA+PiAyXSA9IF9TRExfR2V0VGlja3MoKTsNCiAgICB0ZW1wSTY0ID0gWyB0b3VjaC5kZXZpY2VJRCA+Pj4gMCwgKHRlbXBEb3VibGUgPSB0b3VjaC5kZXZpY2VJRCwgK01hdGhfYWJzKHRlbXBEb3VibGUpID49ICsxID8gdGVtcERvdWJsZSA+ICswID8gKE1hdGhfbWluKCtNYXRoX2Zsb29yKHRlbXBEb3VibGUgLyArNDI5NDk2NzI5NiksICs0Mjk0OTY3Mjk1KSB8IDApID4+PiAwIDogfn4rTWF0aF9jZWlsKCh0ZW1wRG91YmxlIC0gKyh+fnRlbXBEb3VibGUgPj4+IDApKSAvICs0Mjk0OTY3Mjk2KSA+Pj4gMCA6IDApIF0sIA0KICAgIEhFQVAzMltwdHIgKyA4ID4+IDJdID0gdGVtcEk2NFswXSwgSEVBUDMyW3B0ciArIDEyID4+IDJdID0gdGVtcEk2NFsxXTsNCiAgICB0ZW1wSTY0ID0gWyB0b3VjaC5pZGVudGlmaWVyID4+PiAwLCAodGVtcERvdWJsZSA9IHRvdWNoLmlkZW50aWZpZXIsICtNYXRoX2Ficyh0ZW1wRG91YmxlKSA+PSArMSA/IHRlbXBEb3VibGUgPiArMCA/IChNYXRoX21pbigrTWF0aF9mbG9vcih0ZW1wRG91YmxlIC8gKzQyOTQ5NjcyOTYpLCArNDI5NDk2NzI5NSkgfCAwKSA+Pj4gMCA6IH5+K01hdGhfY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyArNDI5NDk2NzI5NikgPj4+IDAgOiAwKSBdLCANCiAgICBIRUFQMzJbcHRyICsgMTYgPj4gMl0gPSB0ZW1wSTY0WzBdLCBIRUFQMzJbcHRyICsgMjAgPj4gMl0gPSB0ZW1wSTY0WzFdOw0KICAgIEhFQVBGMzJbcHRyICsgMjQgPj4gMl0gPSB4Ow0KICAgIEhFQVBGMzJbcHRyICsgMjggPj4gMl0gPSB5Ow0KICAgIEhFQVBGMzJbcHRyICsgMzIgPj4gMl0gPSBkeDsNCiAgICBIRUFQRjMyW3B0ciArIDM2ID4+IDJdID0gZHk7DQogICAgaWYgKHRvdWNoLmZvcmNlICE9PSB1bmRlZmluZWQpIHsNCiAgICAgSEVBUEYzMltwdHIgKyA0MCA+PiAyXSA9IHRvdWNoLmZvcmNlOw0KICAgIH0gZWxzZSB7DQogICAgIEhFQVBGMzJbcHRyICsgNDAgPj4gMl0gPSBldmVudC50eXBlID09ICJ0b3VjaGVuZCIgPyAwIDogMTsNCiAgICB9DQogICAgYnJlYWs7DQogICB9DQoNCiAgY2FzZSAidW5sb2FkIjoNCiAgIHsNCiAgICBIRUFQMzJbcHRyID4+IDJdID0gU0RMLkRPTUV2ZW50VG9TRExFdmVudFtldmVudC50eXBlXTsNCiAgICBicmVhazsNCiAgIH0NCg0KICBjYXNlICJyZXNpemUiOg0KICAgew0KICAgIEhFQVAzMltwdHIgPj4gMl0gPSBTREwuRE9NRXZlbnRUb1NETEV2ZW50W2V2ZW50LnR5cGVdOw0KICAgIEhFQVAzMltwdHIgKyA0ID4+IDJdID0gZXZlbnQudzsNCiAgICBIRUFQMzJbcHRyICsgOCA+PiAyXSA9IGV2ZW50Lmg7DQogICAgYnJlYWs7DQogICB9DQoNCiAgY2FzZSAiam95c3RpY2tfYnV0dG9uX3VwIjoNCiAgY2FzZSAiam95c3RpY2tfYnV0dG9uX2Rvd24iOg0KICAgew0KICAgIHZhciBzdGF0ZSA9IGV2ZW50LnR5cGUgPT09ICJqb3lzdGlja19idXR0b25fdXAiID8gMCA6IDE7DQogICAgSEVBUDMyW3B0ciA+PiAyXSA9IFNETC5ET01FdmVudFRvU0RMRXZlbnRbZXZlbnQudHlwZV07DQogICAgSEVBUDhbcHRyICsgNCA+PiAwXSA9IGV2ZW50LmluZGV4Ow0KICAgIEhFQVA4W3B0ciArIDUgPj4gMF0gPSBldmVudC5idXR0b247DQogICAgSEVBUDhbcHRyICsgNiA+PiAwXSA9IHN0YXRlOw0KICAgIGJyZWFrOw0KICAgfQ0KDQogIGNhc2UgImpveXN0aWNrX2F4aXNfbW90aW9uIjoNCiAgIHsNCiAgICBIRUFQMzJbcHRyID4+IDJdID0gU0RMLkRPTUV2ZW50VG9TRExFdmVudFtldmVudC50eXBlXTsNCiAgICBIRUFQOFtwdHIgKyA0ID4+IDBdID0gZXZlbnQuaW5kZXg7DQogICAgSEVBUDhbcHRyICsgNSA+PiAwXSA9IGV2ZW50LmF4aXM7DQogICAgSEVBUDMyW3B0ciArIDggPj4gMl0gPSBTREwuam95c3RpY2tBeGlzVmFsdWVDb252ZXJzaW9uKGV2ZW50LnZhbHVlKTsNCiAgICBicmVhazsNCiAgIH0NCg0KICBjYXNlICJmb2N1cyI6DQogICB7DQogICAgdmFyIFNETF9XSU5ET1dFVkVOVF9GT0NVU19HQUlORUQgPSAxMjsNCiAgICBIRUFQMzJbcHRyID4+IDJdID0gU0RMLkRPTUV2ZW50VG9TRExFdmVudFtldmVudC50eXBlXTsNCiAgICBIRUFQMzJbcHRyICsgNCA+PiAyXSA9IDA7DQogICAgSEVBUDhbcHRyICsgOCA+PiAwXSA9IFNETF9XSU5ET1dFVkVOVF9GT0NVU19HQUlORUQ7DQogICAgYnJlYWs7DQogICB9DQoNCiAgY2FzZSAiYmx1ciI6DQogICB7DQogICAgdmFyIFNETF9XSU5ET1dFVkVOVF9GT0NVU19MT1NUID0gMTM7DQogICAgSEVBUDMyW3B0ciA+PiAyXSA9IFNETC5ET01FdmVudFRvU0RMRXZlbnRbZXZlbnQudHlwZV07DQogICAgSEVBUDMyW3B0ciArIDQgPj4gMl0gPSAwOw0KICAgIEhFQVA4W3B0ciArIDggPj4gMF0gPSBTRExfV0lORE9XRVZFTlRfRk9DVVNfTE9TVDsNCiAgICBicmVhazsNCiAgIH0NCg0KICBjYXNlICJ2aXNpYmlsaXR5Y2hhbmdlIjoNCiAgIHsNCiAgICB2YXIgU0RMX1dJTkRPV0VWRU5UX1NIT1dOID0gMTsNCiAgICB2YXIgU0RMX1dJTkRPV0VWRU5UX0hJRERFTiA9IDI7DQogICAgdmFyIHZpc2liaWxpdHlFdmVudElEID0gZXZlbnQudmlzaWJsZSA/IFNETF9XSU5ET1dFVkVOVF9TSE9XTiA6IFNETF9XSU5ET1dFVkVOVF9ISURERU47DQogICAgSEVBUDMyW3B0ciA+PiAyXSA9IFNETC5ET01FdmVudFRvU0RMRXZlbnRbZXZlbnQudHlwZV07DQogICAgSEVBUDMyW3B0ciArIDQgPj4gMl0gPSAwOw0KICAgIEhFQVA4W3B0ciArIDggPj4gMF0gPSB2aXNpYmlsaXR5RXZlbnRJRDsNCiAgICBicmVhazsNCiAgIH0NCg0KICBkZWZhdWx0Og0KICAgdGhyb3cgIlVuaGFuZGxlZCBTREwgZXZlbnQ6ICIgKyBldmVudC50eXBlOw0KICB9DQogfSwNCiBtYWtlRm9udFN0cmluZzogZnVuY3Rpb24oaGVpZ2h0LCBmb250TmFtZSkgew0KICBpZiAoZm9udE5hbWUuY2hhckF0KDApICE9ICInIiAmJiBmb250TmFtZS5jaGFyQXQoMCkgIT0gJyInKSB7DQogICBmb250TmFtZSA9ICciJyArIGZvbnROYW1lICsgJyInOw0KICB9DQogIHJldHVybiBoZWlnaHQgKyAicHggIiArIGZvbnROYW1lICsgIiwgc2VyaWYiOw0KIH0sDQogZXN0aW1hdGVUZXh0V2lkdGg6IGZ1bmN0aW9uKGZvbnREYXRhLCB0ZXh0KSB7DQogIHZhciBoID0gZm9udERhdGEuc2l6ZTsNCiAgdmFyIGZvbnRTdHJpbmcgPSBTREwubWFrZUZvbnRTdHJpbmcoaCwgZm9udERhdGEubmFtZSk7DQogIHZhciB0ZW1wQ3R4ID0gU0RMLnR0ZkNvbnRleHQ7DQogIHRlbXBDdHguc2F2ZSgpOw0KICB0ZW1wQ3R4LmZvbnQgPSBmb250U3RyaW5nOw0KICB2YXIgcmV0ID0gdGVtcEN0eC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aCB8IDA7DQogIHRlbXBDdHgucmVzdG9yZSgpOw0KICByZXR1cm4gcmV0Ow0KIH0sDQogYWxsb2NhdGVDaGFubmVsczogZnVuY3Rpb24obnVtKSB7DQogIGlmIChTREwubnVtQ2hhbm5lbHMgJiYgU0RMLm51bUNoYW5uZWxzID49IG51bSAmJiBudW0gIT0gMCkgcmV0dXJuOw0KICBTREwubnVtQ2hhbm5lbHMgPSBudW07DQogIFNETC5jaGFubmVscyA9IFtdOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IG51bTsgaSsrKSB7DQogICBTREwuY2hhbm5lbHNbaV0gPSB7DQogICAgYXVkaW86IG51bGwsDQogICAgdm9sdW1lOiAxDQogICB9Ow0KICB9DQogfSwNCiBzZXRHZXRWb2x1bWU6IGZ1bmN0aW9uKGluZm8sIHZvbHVtZSkgew0KICBpZiAoIWluZm8pIHJldHVybiAwOw0KICB2YXIgcmV0ID0gaW5mby52b2x1bWUgKiAxMjg7DQogIGlmICh2b2x1bWUgIT0gLTEpIHsNCiAgIGluZm8udm9sdW1lID0gTWF0aC5taW4oTWF0aC5tYXgodm9sdW1lLCAwKSwgMTI4KSAvIDEyODsNCiAgIGlmIChpbmZvLmF1ZGlvKSB7DQogICAgdHJ5IHsNCiAgICAgaW5mby5hdWRpby52b2x1bWUgPSBpbmZvLnZvbHVtZTsNCiAgICAgaWYgKGluZm8uYXVkaW8ud2ViQXVkaW9HYWluTm9kZSkgaW5mby5hdWRpby53ZWJBdWRpb0dhaW5Ob2RlWyJnYWluIl1bInZhbHVlIl0gPSBpbmZvLnZvbHVtZTsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgIGVycigic2V0R2V0Vm9sdW1lIGZhaWxlZCB0byBzZXQgYXVkaW8gdm9sdW1lOiAiICsgZSk7DQogICAgfQ0KICAgfQ0KICB9DQogIHJldHVybiByZXQ7DQogfSwNCiBzZXRQYW5uZXJQb3NpdGlvbjogZnVuY3Rpb24oaW5mbywgeCwgeSwgeikgew0KICBpZiAoIWluZm8pIHJldHVybjsNCiAgaWYgKGluZm8uYXVkaW8pIHsNCiAgIGlmIChpbmZvLmF1ZGlvLndlYkF1ZGlvUGFubmVyTm9kZSkgew0KICAgIGluZm8uYXVkaW8ud2ViQXVkaW9QYW5uZXJOb2RlWyJzZXRQb3NpdGlvbiJdKHgsIHksIHopOw0KICAgfQ0KICB9DQogfSwNCiBwbGF5V2ViQXVkaW86IGZ1bmN0aW9uKGF1ZGlvKSB7DQogIGlmICghYXVkaW8pIHJldHVybjsNCiAgaWYgKGF1ZGlvLndlYkF1ZGlvTm9kZSkgcmV0dXJuOw0KICBpZiAoIVNETC53ZWJBdWRpb0F2YWlsYWJsZSgpKSByZXR1cm47DQogIHRyeSB7DQogICB2YXIgd2ViQXVkaW8gPSBhdWRpby5yZXNvdXJjZS53ZWJBdWRpbzsNCiAgIGF1ZGlvLnBhdXNlZCA9IGZhbHNlOw0KICAgaWYgKCF3ZWJBdWRpby5kZWNvZGVkQnVmZmVyKSB7DQogICAgaWYgKHdlYkF1ZGlvLm9uRGVjb2RlQ29tcGxldGUgPT09IHVuZGVmaW5lZCkgYWJvcnQoIkNhbm5vdCBwbGF5IGJhY2sgYXVkaW8gb2JqZWN0IHRoYXQgd2FzIG5vdCBsb2FkZWQiKTsNCiAgICB3ZWJBdWRpby5vbkRlY29kZUNvbXBsZXRlLnB1c2goZnVuY3Rpb24oKSB7DQogICAgIGlmICghYXVkaW8ucGF1c2VkKSBTREwucGxheVdlYkF1ZGlvKGF1ZGlvKTsNCiAgICB9KTsNCiAgICByZXR1cm47DQogICB9DQogICBhdWRpby53ZWJBdWRpb05vZGUgPSBTREwuYXVkaW9Db250ZXh0WyJjcmVhdGVCdWZmZXJTb3VyY2UiXSgpOw0KICAgYXVkaW8ud2ViQXVkaW9Ob2RlWyJidWZmZXIiXSA9IHdlYkF1ZGlvLmRlY29kZWRCdWZmZXI7DQogICBhdWRpby53ZWJBdWRpb05vZGVbImxvb3AiXSA9IGF1ZGlvLmxvb3A7DQogICBhdWRpby53ZWJBdWRpb05vZGVbIm9uZW5kZWQiXSA9IGZ1bmN0aW9uKCkgew0KICAgIGF1ZGlvWyJvbmVuZGVkIl0oKTsNCiAgIH07DQogICBhdWRpby53ZWJBdWRpb1Bhbm5lck5vZGUgPSBTREwuYXVkaW9Db250ZXh0WyJjcmVhdGVQYW5uZXIiXSgpOw0KICAgYXVkaW8ud2ViQXVkaW9QYW5uZXJOb2RlWyJzZXRQb3NpdGlvbiJdKDAsIDAsIC0uNSk7DQogICBhdWRpby53ZWJBdWRpb1Bhbm5lck5vZGVbInBhbm5pbmdNb2RlbCJdID0gImVxdWFscG93ZXIiOw0KICAgYXVkaW8ud2ViQXVkaW9HYWluTm9kZSA9IFNETC5hdWRpb0NvbnRleHRbImNyZWF0ZUdhaW4iXSgpOw0KICAgYXVkaW8ud2ViQXVkaW9HYWluTm9kZVsiZ2FpbiJdWyJ2YWx1ZSJdID0gYXVkaW8udm9sdW1lOw0KICAgYXVkaW8ud2ViQXVkaW9Ob2RlWyJjb25uZWN0Il0oYXVkaW8ud2ViQXVkaW9QYW5uZXJOb2RlKTsNCiAgIGF1ZGlvLndlYkF1ZGlvUGFubmVyTm9kZVsiY29ubmVjdCJdKGF1ZGlvLndlYkF1ZGlvR2Fpbk5vZGUpOw0KICAgYXVkaW8ud2ViQXVkaW9HYWluTm9kZVsiY29ubmVjdCJdKFNETC5hdWRpb0NvbnRleHRbImRlc3RpbmF0aW9uIl0pOw0KICAgYXVkaW8ud2ViQXVkaW9Ob2RlWyJzdGFydCJdKDAsIGF1ZGlvLmN1cnJlbnRQb3NpdGlvbik7DQogICBhdWRpby5zdGFydFRpbWUgPSBTREwuYXVkaW9Db250ZXh0WyJjdXJyZW50VGltZSJdIC0gYXVkaW8uY3VycmVudFBvc2l0aW9uOw0KICB9IGNhdGNoIChlKSB7DQogICBlcnIoInBsYXlXZWJBdWRpbyBmYWlsZWQ6ICIgKyBlKTsNCiAgfQ0KIH0sDQogcGF1c2VXZWJBdWRpbzogZnVuY3Rpb24oYXVkaW8pIHsNCiAgaWYgKCFhdWRpbykgcmV0dXJuOw0KICBpZiAoYXVkaW8ud2ViQXVkaW9Ob2RlKSB7DQogICB0cnkgew0KICAgIGF1ZGlvLmN1cnJlbnRQb3NpdGlvbiA9IChTREwuYXVkaW9Db250ZXh0WyJjdXJyZW50VGltZSJdIC0gYXVkaW8uc3RhcnRUaW1lKSAlIGF1ZGlvLnJlc291cmNlLndlYkF1ZGlvLmRlY29kZWRCdWZmZXIuZHVyYXRpb247DQogICAgYXVkaW8ud2ViQXVkaW9Ob2RlWyJvbmVuZGVkIl0gPSB1bmRlZmluZWQ7DQogICAgYXVkaW8ud2ViQXVkaW9Ob2RlLnN0b3AoMCk7DQogICAgYXVkaW8ud2ViQXVkaW9Ob2RlID0gdW5kZWZpbmVkOw0KICAgfSBjYXRjaCAoZSkgew0KICAgIGVycigicGF1c2VXZWJBdWRpbyBmYWlsZWQ6ICIgKyBlKTsNCiAgIH0NCiAgfQ0KICBhdWRpby5wYXVzZWQgPSB0cnVlOw0KIH0sDQogb3BlbkF1ZGlvQ29udGV4dDogZnVuY3Rpb24oKSB7DQogIGlmICghU0RMLmF1ZGlvQ29udGV4dCkgew0KICAgaWYgKHR5cGVvZiBBdWRpb0NvbnRleHQgIT09ICJ1bmRlZmluZWQiKSBTREwuYXVkaW9Db250ZXh0ID0gbmV3IEF1ZGlvQ29udGV4dCgpOyBlbHNlIGlmICh0eXBlb2Ygd2Via2l0QXVkaW9Db250ZXh0ICE9PSAidW5kZWZpbmVkIikgU0RMLmF1ZGlvQ29udGV4dCA9IG5ldyB3ZWJraXRBdWRpb0NvbnRleHQoKTsNCiAgfQ0KIH0sDQogd2ViQXVkaW9BdmFpbGFibGU6IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gISFTREwuYXVkaW9Db250ZXh0Ow0KIH0sDQogZmlsbFdlYkF1ZGlvQnVmZmVyRnJvbUhlYXA6IGZ1bmN0aW9uKGhlYXBQdHIsIHNpemVTYW1wbGVzUGVyQ2hhbm5lbCwgZHN0QXVkaW9CdWZmZXIpIHsNCiAgdmFyIG51bUNoYW5uZWxzID0gU0RMLmF1ZGlvLmNoYW5uZWxzOw0KICBmb3IgKHZhciBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyArK2MpIHsNCiAgIHZhciBjaGFubmVsRGF0YSA9IGRzdEF1ZGlvQnVmZmVyWyJnZXRDaGFubmVsRGF0YSJdKGMpOw0KICAgaWYgKGNoYW5uZWxEYXRhLmxlbmd0aCAhPSBzaXplU2FtcGxlc1BlckNoYW5uZWwpIHsNCiAgICB0aHJvdyAiV2ViIEF1ZGlvIG91dHB1dCBidWZmZXIgbGVuZ3RoIG1pc21hdGNoISBEZXN0aW5hdGlvbiBzaXplOiAiICsgY2hhbm5lbERhdGEubGVuZ3RoICsgIiBzYW1wbGVzIHZzIGV4cGVjdGVkICIgKyBzaXplU2FtcGxlc1BlckNoYW5uZWwgKyAiIHNhbXBsZXMhIjsNCiAgIH0NCiAgIGlmIChTREwuYXVkaW8uZm9ybWF0ID09IDMyNzg0KSB7DQogICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplU2FtcGxlc1BlckNoYW5uZWw7ICsraikgew0KICAgICBjaGFubmVsRGF0YVtqXSA9IEhFQVAxNltoZWFwUHRyICsgKGogKiBudW1DaGFubmVscyArIGMpICogMiA+PiAxXSAvIDMyNzY4Ow0KICAgIH0NCiAgIH0gZWxzZSBpZiAoU0RMLmF1ZGlvLmZvcm1hdCA9PSA4KSB7DQogICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplU2FtcGxlc1BlckNoYW5uZWw7ICsraikgew0KICAgICB2YXIgdiA9IEhFQVA4W2hlYXBQdHIgKyAoaiAqIG51bUNoYW5uZWxzICsgYykgPj4gMF07DQogICAgIGNoYW5uZWxEYXRhW2pdID0gKHYgPj0gMCA/IHYgLSAxMjggOiB2ICsgMTI4KSAvIDEyODsNCiAgICB9DQogICB9IGVsc2UgaWYgKFNETC5hdWRpby5mb3JtYXQgPT0gMzMwNTYpIHsNCiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNpemVTYW1wbGVzUGVyQ2hhbm5lbDsgKytqKSB7DQogICAgIGNoYW5uZWxEYXRhW2pdID0gSEVBUEYzMltoZWFwUHRyICsgKGogKiBudW1DaGFubmVscyArIGMpICogNCA+PiAyXTsNCiAgICB9DQogICB9IGVsc2Ugew0KICAgIHRocm93ICJJbnZhbGlkIFNETCBhdWRpbyBmb3JtYXQgIiArIFNETC5hdWRpby5mb3JtYXQgKyAiISI7DQogICB9DQogIH0NCiB9LA0KIGRlYnVnU3VyZmFjZTogZnVuY3Rpb24oc3VyZkRhdGEpIHsNCiAgY29uc29sZS5sb2coImR1bXBpbmcgc3VyZmFjZSAiICsgWyBzdXJmRGF0YS5zdXJmLCBzdXJmRGF0YS5zb3VyY2UsIHN1cmZEYXRhLndpZHRoLCBzdXJmRGF0YS5oZWlnaHQgXSk7DQogIHZhciBpbWFnZSA9IHN1cmZEYXRhLmN0eC5nZXRJbWFnZURhdGEoMCwgMCwgc3VyZkRhdGEud2lkdGgsIHN1cmZEYXRhLmhlaWdodCk7DQogIHZhciBkYXRhID0gaW1hZ2UuZGF0YTsNCiAgdmFyIG51bSA9IE1hdGgubWluKHN1cmZEYXRhLndpZHRoLCBzdXJmRGF0YS5oZWlnaHQpOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IG51bTsgaSsrKSB7DQogICBjb25zb2xlLmxvZygiICAgZGlhZ29uYWwgIiArIGkgKyAiOiIgKyBbIGRhdGFbaSAqIHN1cmZEYXRhLndpZHRoICogNCArIGkgKiA0ICsgMF0sIGRhdGFbaSAqIHN1cmZEYXRhLndpZHRoICogNCArIGkgKiA0ICsgMV0sIGRhdGFbaSAqIHN1cmZEYXRhLndpZHRoICogNCArIGkgKiA0ICsgMl0sIGRhdGFbaSAqIHN1cmZEYXRhLndpZHRoICogNCArIGkgKiA0ICsgM10gXSk7DQogIH0NCiB9LA0KIGpveXN0aWNrRXZlbnRTdGF0ZTogMSwNCiBsYXN0Sm95c3RpY2tTdGF0ZToge30sDQogam95c3RpY2tOYW1lUG9vbDoge30sDQogcmVjb3JkSm95c3RpY2tTdGF0ZTogZnVuY3Rpb24oam95c3RpY2ssIHN0YXRlKSB7DQogIHZhciBidXR0b25zID0gbmV3IEFycmF5KHN0YXRlLmJ1dHRvbnMubGVuZ3RoKTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5idXR0b25zLmxlbmd0aDsgaSsrKSB7DQogICBidXR0b25zW2ldID0gU0RMLmdldEpveXN0aWNrQnV0dG9uU3RhdGUoc3RhdGUuYnV0dG9uc1tpXSk7DQogIH0NCiAgU0RMLmxhc3RKb3lzdGlja1N0YXRlW2pveXN0aWNrXSA9IHsNCiAgIGJ1dHRvbnM6IGJ1dHRvbnMsDQogICBheGVzOiBzdGF0ZS5heGVzLnNsaWNlKDApLA0KICAgdGltZXN0YW1wOiBzdGF0ZS50aW1lc3RhbXAsDQogICBpbmRleDogc3RhdGUuaW5kZXgsDQogICBpZDogc3RhdGUuaWQNCiAgfTsNCiB9LA0KIGdldEpveXN0aWNrQnV0dG9uU3RhdGU6IGZ1bmN0aW9uKGJ1dHRvbikgew0KICBpZiAodHlwZW9mIGJ1dHRvbiA9PT0gIm9iamVjdCIpIHsNCiAgIHJldHVybiBidXR0b25bInByZXNzZWQiXTsNCiAgfSBlbHNlIHsNCiAgIHJldHVybiBidXR0b24gPiAwOw0KICB9DQogfSwNCiBxdWVyeUpveXN0aWNrczogZnVuY3Rpb24oKSB7DQogIGZvciAodmFyIGpveXN0aWNrIGluIFNETC5sYXN0Sm95c3RpY2tTdGF0ZSkgew0KICAgdmFyIHN0YXRlID0gU0RMLmdldEdhbWVwYWQoam95c3RpY2sgLSAxKTsNCiAgIHZhciBwcmV2U3RhdGUgPSBTREwubGFzdEpveXN0aWNrU3RhdGVbam95c3RpY2tdOw0KICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gInVuZGVmaW5lZCIpIHJldHVybjsNCiAgIGlmIChzdGF0ZSA9PT0gbnVsbCkgcmV0dXJuOw0KICAgaWYgKHR5cGVvZiBzdGF0ZS50aW1lc3RhbXAgIT09ICJudW1iZXIiIHx8IHN0YXRlLnRpbWVzdGFtcCAhPT0gcHJldlN0YXRlLnRpbWVzdGFtcCB8fCAhc3RhdGUudGltZXN0YW1wKSB7DQogICAgdmFyIGk7DQogICAgZm9yIChpID0gMDsgaSA8IHN0YXRlLmJ1dHRvbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgdmFyIGJ1dHRvblN0YXRlID0gU0RMLmdldEpveXN0aWNrQnV0dG9uU3RhdGUoc3RhdGUuYnV0dG9uc1tpXSk7DQogICAgIGlmIChidXR0b25TdGF0ZSAhPT0gcHJldlN0YXRlLmJ1dHRvbnNbaV0pIHsNCiAgICAgIFNETC5ldmVudHMucHVzaCh7DQogICAgICAgdHlwZTogYnV0dG9uU3RhdGUgPyAiam95c3RpY2tfYnV0dG9uX2Rvd24iIDogImpveXN0aWNrX2J1dHRvbl91cCIsDQogICAgICAgam95c3RpY2s6IGpveXN0aWNrLA0KICAgICAgIGluZGV4OiBqb3lzdGljayAtIDEsDQogICAgICAgYnV0dG9uOiBpDQogICAgICB9KTsNCiAgICAgfQ0KICAgIH0NCiAgICBmb3IgKGkgPSAwOyBpIDwgc3RhdGUuYXhlcy5sZW5ndGg7IGkrKykgew0KICAgICBpZiAoc3RhdGUuYXhlc1tpXSAhPT0gcHJldlN0YXRlLmF4ZXNbaV0pIHsNCiAgICAgIFNETC5ldmVudHMucHVzaCh7DQogICAgICAgdHlwZTogImpveXN0aWNrX2F4aXNfbW90aW9uIiwNCiAgICAgICBqb3lzdGljazogam95c3RpY2ssDQogICAgICAgaW5kZXg6IGpveXN0aWNrIC0gMSwNCiAgICAgICBheGlzOiBpLA0KICAgICAgIHZhbHVlOiBzdGF0ZS5heGVzW2ldDQogICAgICB9KTsNCiAgICAgfQ0KICAgIH0NCiAgICBTREwucmVjb3JkSm95c3RpY2tTdGF0ZShqb3lzdGljaywgc3RhdGUpOw0KICAgfQ0KICB9DQogfSwNCiBqb3lzdGlja0F4aXNWYWx1ZUNvbnZlcnNpb246IGZ1bmN0aW9uKHZhbHVlKSB7DQogIHZhbHVlID0gTWF0aC5taW4oMSwgTWF0aC5tYXgodmFsdWUsIC0xKSk7DQogIHJldHVybiBNYXRoLmNlaWwoKHZhbHVlICsgMSkgKiAzMjc2Ny41IC0gMzI3NjgpOw0KIH0sDQogZ2V0R2FtZXBhZHM6IGZ1bmN0aW9uKCkgew0KICB2YXIgZmNuID0gbmF2aWdhdG9yLmdldEdhbWVwYWRzIHx8IG5hdmlnYXRvci53ZWJraXRHYW1lcGFkcyB8fCBuYXZpZ2F0b3IubW96R2FtZXBhZHMgfHwgbmF2aWdhdG9yLmdhbWVwYWRzIHx8IG5hdmlnYXRvci53ZWJraXRHZXRHYW1lcGFkczsNCiAgaWYgKGZjbiAhPT0gdW5kZWZpbmVkKSB7DQogICByZXR1cm4gZmNuLmFwcGx5KG5hdmlnYXRvcik7DQogIH0gZWxzZSB7DQogICByZXR1cm4gW107DQogIH0NCiB9LA0KIGdldEdhbWVwYWQ6IGZ1bmN0aW9uKGRldmljZUluZGV4KSB7DQogIHZhciBnYW1lcGFkcyA9IFNETC5nZXRHYW1lcGFkcygpOw0KICBpZiAoZ2FtZXBhZHMubGVuZ3RoID4gZGV2aWNlSW5kZXggJiYgZGV2aWNlSW5kZXggPj0gMCkgew0KICAgcmV0dXJuIGdhbWVwYWRzW2RldmljZUluZGV4XTsNCiAgfQ0KICByZXR1cm4gbnVsbDsNCiB9DQp9Ow0KDQpmdW5jdGlvbiBfU0RMX0NsZWFyRXJyb3IoKSB7fQ0KDQpmdW5jdGlvbiBfU0RMX0dldEVycm9yKCkgew0KIGlmICghU0RMLmVycm9yTWVzc2FnZSkgew0KICBTREwuZXJyb3JNZXNzYWdlID0gYWxsb2NhdGUoaW50QXJyYXlGcm9tU3RyaW5nKCJ1bmtub3duIFNETC1lbXNjcmlwdGVuIGVycm9yIiksICJpOCIsIEFMTE9DX05PUk1BTCk7DQogfQ0KIHJldHVybiBTREwuZXJyb3JNZXNzYWdlOw0KfQ0KDQpmdW5jdGlvbiBfU0RMX0dldE1vZFN0YXRlKCkgew0KIHJldHVybiBTREwubW9kU3RhdGU7DQp9DQoNCmZ1bmN0aW9uIF9TRExfR2V0TW91c2VTdGF0ZSh4LCB5KSB7DQogaWYgKHgpIEhFQVAzMlt4ID4+IDJdID0gQnJvd3Nlci5tb3VzZVg7DQogaWYgKHkpIEhFQVAzMlt5ID4+IDJdID0gQnJvd3Nlci5tb3VzZVk7DQogcmV0dXJuIFNETC5idXR0b25TdGF0ZTsNCn0NCg0KZnVuY3Rpb24gX1NETF9HZXRXaW5kb3dTaXplKHdpbmRvdywgd2lkdGgsIGhlaWdodCkgew0KIHZhciB3ID0gTW9kdWxlWyJjYW52YXMiXS53aWR0aDsNCiB2YXIgaCA9IE1vZHVsZVsiY2FudmFzIl0uaGVpZ2h0Ow0KIGlmICh3aWR0aCkgSEVBUDMyW3dpZHRoID4+IDJdID0gdzsNCiBpZiAoaGVpZ2h0KSBIRUFQMzJbaGVpZ2h0ID4+IDJdID0gaDsNCn0NCg0KZnVuY3Rpb24gX1NETF9Jbml0KGluaXRGbGFncykgew0KIFNETC5zdGFydFRpbWUgPSBEYXRlLm5vdygpOw0KIFNETC5pbml0RmxhZ3MgPSBpbml0RmxhZ3M7DQogaWYgKCFNb2R1bGVbImRvTm90Q2FwdHVyZUtleWJvYXJkIl0pIHsNCiAgdmFyIGtleWJvYXJkTGlzdGVuaW5nRWxlbWVudCA9IE1vZHVsZVsia2V5Ym9hcmRMaXN0ZW5pbmdFbGVtZW50Il0gfHwgZG9jdW1lbnQ7DQogIGtleWJvYXJkTGlzdGVuaW5nRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgU0RMLnJlY2VpdmVFdmVudCk7DQogIGtleWJvYXJkTGlzdGVuaW5nRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsIFNETC5yZWNlaXZlRXZlbnQpOw0KICBrZXlib2FyZExpc3RlbmluZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5cHJlc3MiLCBTREwucmVjZWl2ZUV2ZW50KTsNCiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgU0RMLnJlY2VpdmVFdmVudCk7DQogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgU0RMLnJlY2VpdmVFdmVudCk7DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLCBTREwucmVjZWl2ZUV2ZW50KTsNCiB9DQogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsIFNETC5yZWNlaXZlRXZlbnQpOw0KIFNETC5rZXlib2FyZFN0YXRlID0gX21hbGxvYyg2NTUzNik7DQogX21lbXNldChTREwua2V5Ym9hcmRTdGF0ZSwgMCwgNjU1MzYpOw0KIFNETC5ET01FdmVudFRvU0RMRXZlbnRbImtleWRvd24iXSA9IDc2ODsNCiBTREwuRE9NRXZlbnRUb1NETEV2ZW50WyJrZXl1cCJdID0gNzY5Ow0KIFNETC5ET01FdmVudFRvU0RMRXZlbnRbImtleXByZXNzIl0gPSA3NzE7DQogU0RMLkRPTUV2ZW50VG9TRExFdmVudFsibW91c2Vkb3duIl0gPSAxMDI1Ow0KIFNETC5ET01FdmVudFRvU0RMRXZlbnRbIm1vdXNldXAiXSA9IDEwMjY7DQogU0RMLkRPTUV2ZW50VG9TRExFdmVudFsibW91c2Vtb3ZlIl0gPSAxMDI0Ow0KIFNETC5ET01FdmVudFRvU0RMRXZlbnRbIndoZWVsIl0gPSAxMDI3Ow0KIFNETC5ET01FdmVudFRvU0RMRXZlbnRbInRvdWNoc3RhcnQiXSA9IDE3OTI7DQogU0RMLkRPTUV2ZW50VG9TRExFdmVudFsidG91Y2hlbmQiXSA9IDE3OTM7DQogU0RMLkRPTUV2ZW50VG9TRExFdmVudFsidG91Y2htb3ZlIl0gPSAxNzk0Ow0KIFNETC5ET01FdmVudFRvU0RMRXZlbnRbInVubG9hZCJdID0gMjU2Ow0KIFNETC5ET01FdmVudFRvU0RMRXZlbnRbInJlc2l6ZSJdID0gMjg2NzM7DQogU0RMLkRPTUV2ZW50VG9TRExFdmVudFsidmlzaWJpbGl0eWNoYW5nZSJdID0gNTEyOw0KIFNETC5ET01FdmVudFRvU0RMRXZlbnRbImZvY3VzIl0gPSA1MTI7DQogU0RMLkRPTUV2ZW50VG9TRExFdmVudFsiYmx1ciJdID0gNTEyOw0KIFNETC5ET01FdmVudFRvU0RMRXZlbnRbImpveXN0aWNrX2F4aXNfbW90aW9uIl0gPSAxNTM2Ow0KIFNETC5ET01FdmVudFRvU0RMRXZlbnRbImpveXN0aWNrX2J1dHRvbl9kb3duIl0gPSAxNTM5Ow0KIFNETC5ET01FdmVudFRvU0RMRXZlbnRbImpveXN0aWNrX2J1dHRvbl91cCJdID0gMTU0MDsNCiByZXR1cm4gMDsNCn0NCg0KZnVuY3Rpb24gX1NETF9Mb2NrQXVkaW8oKSB7fQ0KDQpmdW5jdGlvbiBfU0RMX1BvbGxFdmVudChwdHIpIHsNCiByZXR1cm4gU0RMLnBvbGxFdmVudChwdHIpOw0KfQ0KDQp2YXIgR0wgPSB7DQogY291bnRlcjogMSwNCiBsYXN0RXJyb3I6IDAsDQogYnVmZmVyczogW10sDQogbWFwcGVkQnVmZmVyczoge30sDQogcHJvZ3JhbXM6IFtdLA0KIGZyYW1lYnVmZmVyczogW10sDQogcmVuZGVyYnVmZmVyczogW10sDQogdGV4dHVyZXM6IFtdLA0KIHVuaWZvcm1zOiBbXSwNCiBzaGFkZXJzOiBbXSwNCiB2YW9zOiBbXSwNCiBjb250ZXh0czoge30sDQogY3VycmVudENvbnRleHQ6IG51bGwsDQogb2Zmc2NyZWVuQ2FudmFzZXM6IHt9LA0KIHRpbWVyUXVlcmllc0VYVDogW10sDQogcHJvZ3JhbUluZm9zOiB7fSwNCiBzdHJpbmdDYWNoZToge30sDQogdW5wYWNrQWxpZ25tZW50OiA0LA0KIGluaXQ6IGZ1bmN0aW9uKCkgew0KICBHTC5taW5pVGVtcEJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoR0wuTUlOSV9URU1QX0JVRkZFUl9TSVpFKTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBHTC5NSU5JX1RFTVBfQlVGRkVSX1NJWkU7IGkrKykgew0KICAgR0wubWluaVRlbXBCdWZmZXJWaWV3c1tpXSA9IEdMLm1pbmlUZW1wQnVmZmVyLnN1YmFycmF5KDAsIGkgKyAxKTsNCiAgfQ0KIH0sDQogcmVjb3JkRXJyb3I6IGZ1bmN0aW9uIHJlY29yZEVycm9yKGVycm9yQ29kZSkgew0KICBpZiAoIUdMLmxhc3RFcnJvcikgew0KICAgR0wubGFzdEVycm9yID0gZXJyb3JDb2RlOw0KICB9DQogfSwNCiBnZXROZXdJZDogZnVuY3Rpb24odGFibGUpIHsNCiAgdmFyIHJldCA9IEdMLmNvdW50ZXIrKzsNCiAgZm9yICh2YXIgaSA9IHRhYmxlLmxlbmd0aDsgaSA8IHJldDsgaSsrKSB7DQogICB0YWJsZVtpXSA9IG51bGw7DQogIH0NCiAgcmV0dXJuIHJldDsNCiB9LA0KIE1JTklfVEVNUF9CVUZGRVJfU0laRTogMjU2LA0KIG1pbmlUZW1wQnVmZmVyOiBudWxsLA0KIG1pbmlUZW1wQnVmZmVyVmlld3M6IFsgMCBdLA0KIGdldFNvdXJjZTogZnVuY3Rpb24oc2hhZGVyLCBjb3VudCwgc3RyaW5nLCBsZW5ndGgpIHsNCiAgdmFyIHNvdXJjZSA9ICIiOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsNCiAgIHZhciBsZW4gPSBsZW5ndGggPyBIRUFQMzJbbGVuZ3RoICsgaSAqIDQgPj4gMl0gOiAtMTsNCiAgIHNvdXJjZSArPSBVVEY4VG9TdHJpbmcoSEVBUDMyW3N0cmluZyArIGkgKiA0ID4+IDJdLCBsZW4gPCAwID8gdW5kZWZpbmVkIDogbGVuKTsNCiAgfQ0KICByZXR1cm4gc291cmNlOw0KIH0sDQogY3JlYXRlQ29udGV4dDogZnVuY3Rpb24oY2FudmFzLCB3ZWJHTENvbnRleHRBdHRyaWJ1dGVzKSB7DQogIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgid2ViZ2wiLCB3ZWJHTENvbnRleHRBdHRyaWJ1dGVzKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgiZXhwZXJpbWVudGFsLXdlYmdsIiwgd2ViR0xDb250ZXh0QXR0cmlidXRlcyk7DQogIHJldHVybiBjdHggJiYgR0wucmVnaXN0ZXJDb250ZXh0KGN0eCwgd2ViR0xDb250ZXh0QXR0cmlidXRlcyk7DQogfSwNCiByZWdpc3RlckNvbnRleHQ6IGZ1bmN0aW9uKGN0eCwgd2ViR0xDb250ZXh0QXR0cmlidXRlcykgew0KICB2YXIgaGFuZGxlID0gX21hbGxvYyg4KTsNCiAgdmFyIGNvbnRleHQgPSB7DQogICBoYW5kbGU6IGhhbmRsZSwNCiAgIGF0dHJpYnV0ZXM6IHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMsDQogICB2ZXJzaW9uOiB3ZWJHTENvbnRleHRBdHRyaWJ1dGVzLm1ham9yVmVyc2lvbiwNCiAgIEdMY3R4OiBjdHgNCiAgfTsNCiAgaWYgKGN0eC5jYW52YXMpIGN0eC5jYW52YXMuR0xjdHhPYmplY3QgPSBjb250ZXh0Ow0KICBHTC5jb250ZXh0c1toYW5kbGVdID0gY29udGV4dDsNCiAgaWYgKHR5cGVvZiB3ZWJHTENvbnRleHRBdHRyaWJ1dGVzLmVuYWJsZUV4dGVuc2lvbnNCeURlZmF1bHQgPT09ICJ1bmRlZmluZWQiIHx8IHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMuZW5hYmxlRXh0ZW5zaW9uc0J5RGVmYXVsdCkgew0KICAgR0wuaW5pdEV4dGVuc2lvbnMoY29udGV4dCk7DQogIH0NCiAgcmV0dXJuIGhhbmRsZTsNCiB9LA0KIG1ha2VDb250ZXh0Q3VycmVudDogZnVuY3Rpb24oY29udGV4dEhhbmRsZSkgew0KICBHTC5jdXJyZW50Q29udGV4dCA9IEdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdOw0KICBNb2R1bGUuY3R4ID0gR0xjdHggPSBHTC5jdXJyZW50Q29udGV4dCAmJiBHTC5jdXJyZW50Q29udGV4dC5HTGN0eDsNCiAgcmV0dXJuICEoY29udGV4dEhhbmRsZSAmJiAhR0xjdHgpOw0KIH0sDQogZ2V0Q29udGV4dDogZnVuY3Rpb24oY29udGV4dEhhbmRsZSkgew0KICByZXR1cm4gR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV07DQogfSwNCiBkZWxldGVDb250ZXh0OiBmdW5jdGlvbihjb250ZXh0SGFuZGxlKSB7DQogIGlmIChHTC5jdXJyZW50Q29udGV4dCA9PT0gR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0pIEdMLmN1cnJlbnRDb250ZXh0ID0gbnVsbDsNCiAgaWYgKHR5cGVvZiBKU0V2ZW50cyA9PT0gIm9iamVjdCIpIEpTRXZlbnRzLnJlbW92ZUFsbEhhbmRsZXJzT25UYXJnZXQoR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0uR0xjdHguY2FudmFzKTsNCiAgaWYgKEdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdICYmIEdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdLkdMY3R4LmNhbnZhcykgR0wuY29udGV4dHNbY29udGV4dEhhbmRsZV0uR0xjdHguY2FudmFzLkdMY3R4T2JqZWN0ID0gdW5kZWZpbmVkOw0KICBfZnJlZShHTC5jb250ZXh0c1tjb250ZXh0SGFuZGxlXSk7DQogIEdMLmNvbnRleHRzW2NvbnRleHRIYW5kbGVdID0gbnVsbDsNCiB9LA0KIGluaXRFeHRlbnNpb25zOiBmdW5jdGlvbihjb250ZXh0KSB7DQogIGlmICghY29udGV4dCkgY29udGV4dCA9IEdMLmN1cnJlbnRDb250ZXh0Ow0KICBpZiAoY29udGV4dC5pbml0RXh0ZW5zaW9uc0RvbmUpIHJldHVybjsNCiAgY29udGV4dC5pbml0RXh0ZW5zaW9uc0RvbmUgPSB0cnVlOw0KICB2YXIgR0xjdHggPSBjb250ZXh0LkdMY3R4Ow0KICBpZiAoY29udGV4dC52ZXJzaW9uIDwgMikgew0KICAgdmFyIGluc3RhbmNlZEFycmF5c0V4dCA9IEdMY3R4LmdldEV4dGVuc2lvbigiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpOw0KICAgaWYgKGluc3RhbmNlZEFycmF5c0V4dCkgew0KICAgIEdMY3R4WyJ2ZXJ0ZXhBdHRyaWJEaXZpc29yIl0gPSBmdW5jdGlvbihpbmRleCwgZGl2aXNvcikgew0KICAgICBpbnN0YW5jZWRBcnJheXNFeHRbInZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSJdKGluZGV4LCBkaXZpc29yKTsNCiAgICB9Ow0KICAgIEdMY3R4WyJkcmF3QXJyYXlzSW5zdGFuY2VkIl0gPSBmdW5jdGlvbihtb2RlLCBmaXJzdCwgY291bnQsIHByaW1jb3VudCkgew0KICAgICBpbnN0YW5jZWRBcnJheXNFeHRbImRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSJdKG1vZGUsIGZpcnN0LCBjb3VudCwgcHJpbWNvdW50KTsNCiAgICB9Ow0KICAgIEdMY3R4WyJkcmF3RWxlbWVudHNJbnN0YW5jZWQiXSA9IGZ1bmN0aW9uKG1vZGUsIGNvdW50LCB0eXBlLCBpbmRpY2VzLCBwcmltY291bnQpIHsNCiAgICAgaW5zdGFuY2VkQXJyYXlzRXh0WyJkcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSJdKG1vZGUsIGNvdW50LCB0eXBlLCBpbmRpY2VzLCBwcmltY291bnQpOw0KICAgIH07DQogICB9DQogICB2YXIgdmFvRXh0ID0gR0xjdHguZ2V0RXh0ZW5zaW9uKCJPRVNfdmVydGV4X2FycmF5X29iamVjdCIpOw0KICAgaWYgKHZhb0V4dCkgew0KICAgIEdMY3R4WyJjcmVhdGVWZXJ0ZXhBcnJheSJdID0gZnVuY3Rpb24oKSB7DQogICAgIHJldHVybiB2YW9FeHRbImNyZWF0ZVZlcnRleEFycmF5T0VTIl0oKTsNCiAgICB9Ow0KICAgIEdMY3R4WyJkZWxldGVWZXJ0ZXhBcnJheSJdID0gZnVuY3Rpb24odmFvKSB7DQogICAgIHZhb0V4dFsiZGVsZXRlVmVydGV4QXJyYXlPRVMiXSh2YW8pOw0KICAgIH07DQogICAgR0xjdHhbImJpbmRWZXJ0ZXhBcnJheSJdID0gZnVuY3Rpb24odmFvKSB7DQogICAgIHZhb0V4dFsiYmluZFZlcnRleEFycmF5T0VTIl0odmFvKTsNCiAgICB9Ow0KICAgIEdMY3R4WyJpc1ZlcnRleEFycmF5Il0gPSBmdW5jdGlvbih2YW8pIHsNCiAgICAgcmV0dXJuIHZhb0V4dFsiaXNWZXJ0ZXhBcnJheU9FUyJdKHZhbyk7DQogICAgfTsNCiAgIH0NCiAgIHZhciBkcmF3QnVmZmVyc0V4dCA9IEdMY3R4LmdldEV4dGVuc2lvbigiV0VCR0xfZHJhd19idWZmZXJzIik7DQogICBpZiAoZHJhd0J1ZmZlcnNFeHQpIHsNCiAgICBHTGN0eFsiZHJhd0J1ZmZlcnMiXSA9IGZ1bmN0aW9uKG4sIGJ1ZnMpIHsNCiAgICAgZHJhd0J1ZmZlcnNFeHRbImRyYXdCdWZmZXJzV0VCR0wiXShuLCBidWZzKTsNCiAgICB9Ow0KICAgfQ0KICB9DQogIEdMY3R4LmRpc2pvaW50VGltZXJRdWVyeUV4dCA9IEdMY3R4LmdldEV4dGVuc2lvbigiRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5Iik7DQogIHZhciBhdXRvbWF0aWNhbGx5RW5hYmxlZEV4dGVuc2lvbnMgPSBbICJPRVNfdGV4dHVyZV9mbG9hdCIsICJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiwgIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIsICJPRVNfdmVydGV4X2FycmF5X29iamVjdCIsICJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIsICJXRUJHTF9kZXB0aF90ZXh0dXJlIiwgIk9FU19lbGVtZW50X2luZGV4X3VpbnQiLCAiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIiwgIkVYVF9mcmFnX2RlcHRoIiwgIldFQkdMX2RyYXdfYnVmZmVycyIsICJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiwgIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIsICJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIsICJFWFRfYmxlbmRfbWlubWF4IiwgIkVYVF9zaGFkZXJfdGV4dHVyZV9sb2QiLCAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIiwgIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIsICJXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQiLCAiRVhUX3NSR0IiLCAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiLCAiRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5IiwgIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMiLCAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiLCAiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIsICJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Y19zcmdiIiwgIkVYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDIiIF07DQogIHZhciBleHRzID0gR0xjdHguZ2V0U3VwcG9ydGVkRXh0ZW5zaW9ucygpOw0KICBpZiAoZXh0cyAmJiBleHRzLmxlbmd0aCA+IDApIHsNCiAgIEdMY3R4LmdldFN1cHBvcnRlZEV4dGVuc2lvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uKGV4dCkgew0KICAgIGlmIChhdXRvbWF0aWNhbGx5RW5hYmxlZEV4dGVuc2lvbnMuaW5kZXhPZihleHQpICE9IC0xKSB7DQogICAgIEdMY3R4LmdldEV4dGVuc2lvbihleHQpOw0KICAgIH0NCiAgIH0pOw0KICB9DQogfSwNCiBwb3B1bGF0ZVVuaWZvcm1UYWJsZTogZnVuY3Rpb24ocHJvZ3JhbSkgew0KICB2YXIgcCA9IEdMLnByb2dyYW1zW3Byb2dyYW1dOw0KICB2YXIgcHRhYmxlID0gR0wucHJvZ3JhbUluZm9zW3Byb2dyYW1dID0gew0KICAgdW5pZm9ybXM6IHt9LA0KICAgbWF4VW5pZm9ybUxlbmd0aDogMCwNCiAgIG1heEF0dHJpYnV0ZUxlbmd0aDogLTEsDQogICBtYXhVbmlmb3JtQmxvY2tOYW1lTGVuZ3RoOiAtMQ0KICB9Ow0KICB2YXIgdXRhYmxlID0gcHRhYmxlLnVuaWZvcm1zOw0KICB2YXIgbnVtVW5pZm9ybXMgPSBHTGN0eC5nZXRQcm9ncmFtUGFyYW1ldGVyKHAsIDM1NzE4KTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Vbmlmb3JtczsgKytpKSB7DQogICB2YXIgdSA9IEdMY3R4LmdldEFjdGl2ZVVuaWZvcm0ocCwgaSk7DQogICB2YXIgbmFtZSA9IHUubmFtZTsNCiAgIHB0YWJsZS5tYXhVbmlmb3JtTGVuZ3RoID0gTWF0aC5tYXgocHRhYmxlLm1heFVuaWZvcm1MZW5ndGgsIG5hbWUubGVuZ3RoICsgMSk7DQogICB2YXIgbHMgPSBuYW1lLmxhc3RJbmRleE9mKCJbIik7DQogICBpZiAobHMgPiAwKSB7DQogICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbHMpOw0KICAgfQ0KICAgdmFyIGxvYyA9IEdMY3R4LmdldFVuaWZvcm1Mb2NhdGlvbihwLCBuYW1lKTsNCiAgIGlmIChsb2MpIHsNCiAgICB2YXIgaWQgPSBHTC5nZXROZXdJZChHTC51bmlmb3Jtcyk7DQogICAgdXRhYmxlW25hbWVdID0gWyB1LnNpemUsIGlkIF07DQogICAgR0wudW5pZm9ybXNbaWRdID0gbG9jOw0KICAgIGZvciAodmFyIGogPSAxOyBqIDwgdS5zaXplOyArK2opIHsNCiAgICAgdmFyIG4gPSBuYW1lICsgIlsiICsgaiArICJdIjsNCiAgICAgbG9jID0gR0xjdHguZ2V0VW5pZm9ybUxvY2F0aW9uKHAsIG4pOw0KICAgICBpZCA9IEdMLmdldE5ld0lkKEdMLnVuaWZvcm1zKTsNCiAgICAgR0wudW5pZm9ybXNbaWRdID0gbG9jOw0KICAgIH0NCiAgIH0NCiAgfQ0KIH0NCn07DQoNCmZ1bmN0aW9uIF9TRExfU2V0VmlkZW9Nb2RlKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmbGFncykgew0KIFsgInRvdWNoc3RhcnQiLCAidG91Y2hlbmQiLCAidG91Y2htb3ZlIiwgIm1vdXNlZG93biIsICJtb3VzZXVwIiwgIm1vdXNlbW92ZSIsICJET01Nb3VzZVNjcm9sbCIsICJtb3VzZXdoZWVsIiwgIndoZWVsIiwgIm1vdXNlb3V0IiBdLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHsNCiAgTW9kdWxlWyJjYW52YXMiXS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBTREwucmVjZWl2ZUV2ZW50LCB0cnVlKTsNCiB9KTsNCiB2YXIgY2FudmFzID0gTW9kdWxlWyJjYW52YXMiXTsNCiBpZiAod2lkdGggPT0gMCAmJiBoZWlnaHQgPT0gMCkgew0KICB3aWR0aCA9IGNhbnZhcy53aWR0aDsNCiAgaGVpZ2h0ID0gY2FudmFzLmhlaWdodDsNCiB9DQogaWYgKCFTREwuYWRkZWRSZXNpemVMaXN0ZW5lcikgew0KICBTREwuYWRkZWRSZXNpemVMaXN0ZW5lciA9IHRydWU7DQogIEJyb3dzZXIucmVzaXplTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24odywgaCkgew0KICAgaWYgKCFTREwuc2V0dGluZ1ZpZGVvTW9kZSkgew0KICAgIFNETC5yZWNlaXZlRXZlbnQoew0KICAgICB0eXBlOiAicmVzaXplIiwNCiAgICAgdzogdywNCiAgICAgaDogaA0KICAgIH0pOw0KICAgfQ0KICB9KTsNCiB9DQogU0RMLnNldHRpbmdWaWRlb01vZGUgPSB0cnVlOw0KIEJyb3dzZXIuc2V0Q2FudmFzU2l6ZSh3aWR0aCwgaGVpZ2h0KTsNCiBTREwuc2V0dGluZ1ZpZGVvTW9kZSA9IGZhbHNlOw0KIGlmIChTREwuc2NyZWVuKSB7DQogIFNETC5mcmVlU3VyZmFjZShTREwuc2NyZWVuKTsNCiAgYXNzZXJ0KCFTREwuc2NyZWVuKTsNCiB9DQogaWYgKFNETC5HTCkgZmxhZ3MgPSBmbGFncyB8IDY3MTA4ODY0Ow0KIFNETC5zY3JlZW4gPSBTREwubWFrZVN1cmZhY2Uod2lkdGgsIGhlaWdodCwgZmxhZ3MsIHRydWUsICJzY3JlZW4iKTsNCiByZXR1cm4gU0RMLnNjcmVlbjsNCn0NCg0KZnVuY3Rpb24gX1NETF9VbmxvY2tBdWRpbygpIHt9DQoNCmZ1bmN0aW9uIF9TRExfVW5sb2NrU3VyZmFjZShzdXJmKSB7DQogYXNzZXJ0KCFTREwuR0wpOw0KIHZhciBzdXJmRGF0YSA9IFNETC5zdXJmYWNlc1tzdXJmXTsNCiBpZiAoIXN1cmZEYXRhLmxvY2tlZCB8fCAtLXN1cmZEYXRhLmxvY2tlZCA+IDApIHsNCiAgcmV0dXJuOw0KIH0NCiBpZiAoc3VyZkRhdGEuaXNGbGFnU2V0KDIwOTcxNTIpKSB7DQogIFNETC5jb3B5SW5kZXhlZENvbG9yRGF0YShzdXJmRGF0YSk7DQogfSBlbHNlIGlmICghc3VyZkRhdGEuY29sb3JzKSB7DQogIHZhciBkYXRhID0gc3VyZkRhdGEuaW1hZ2UuZGF0YTsNCiAgdmFyIGJ1ZmZlciA9IHN1cmZEYXRhLmJ1ZmZlcjsNCiAgYXNzZXJ0KGJ1ZmZlciAlIDQgPT0gMCwgIkludmFsaWQgYnVmZmVyIG9mZnNldDogIiArIGJ1ZmZlcik7DQogIHZhciBzcmMgPSBidWZmZXIgPj4gMjsNCiAgdmFyIGRzdCA9IDA7DQogIHZhciBpc1NjcmVlbiA9IHN1cmYgPT0gU0RMLnNjcmVlbjsNCiAgdmFyIG51bTsNCiAgaWYgKHR5cGVvZiBDYW52YXNQaXhlbEFycmF5ICE9PSAidW5kZWZpbmVkIiAmJiBkYXRhIGluc3RhbmNlb2YgQ2FudmFzUGl4ZWxBcnJheSkgew0KICAgbnVtID0gZGF0YS5sZW5ndGg7DQogICB3aGlsZSAoZHN0IDwgbnVtKSB7DQogICAgdmFyIHZhbCA9IEhFQVAzMltzcmNdOw0KICAgIGRhdGFbZHN0XSA9IHZhbCAmIDI1NTsNCiAgICBkYXRhW2RzdCArIDFdID0gdmFsID4+IDggJiAyNTU7DQogICAgZGF0YVtkc3QgKyAyXSA9IHZhbCA+PiAxNiAmIDI1NTsNCiAgICBkYXRhW2RzdCArIDNdID0gaXNTY3JlZW4gPyAyNTUgOiB2YWwgPj4gMjQgJiAyNTU7DQogICAgc3JjKys7DQogICAgZHN0ICs9IDQ7DQogICB9DQogIH0gZWxzZSB7DQogICB2YXIgZGF0YTMyID0gbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyKTsNCiAgIGlmIChpc1NjcmVlbiAmJiBTREwuZGVmYXVsdHMub3BhcXVlRnJvbnRCdWZmZXIpIHsNCiAgICBudW0gPSBkYXRhMzIubGVuZ3RoOw0KICAgIGRhdGEzMi5zZXQoSEVBUDMyLnN1YmFycmF5KHNyYywgc3JjICsgbnVtKSk7DQogICAgdmFyIGRhdGE4ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIpOw0KICAgIHZhciBpID0gMzsNCiAgICB2YXIgaiA9IGkgKyA0ICogbnVtOw0KICAgIGlmIChudW0gJSA4ID09IDApIHsNCiAgICAgd2hpbGUgKGkgPCBqKSB7DQogICAgICBkYXRhOFtpXSA9IDI1NTsNCiAgICAgIGkgPSBpICsgNCB8IDA7DQogICAgICBkYXRhOFtpXSA9IDI1NTsNCiAgICAgIGkgPSBpICsgNCB8IDA7DQogICAgICBkYXRhOFtpXSA9IDI1NTsNCiAgICAgIGkgPSBpICsgNCB8IDA7DQogICAgICBkYXRhOFtpXSA9IDI1NTsNCiAgICAgIGkgPSBpICsgNCB8IDA7DQogICAgICBkYXRhOFtpXSA9IDI1NTsNCiAgICAgIGkgPSBpICsgNCB8IDA7DQogICAgICBkYXRhOFtpXSA9IDI1NTsNCiAgICAgIGkgPSBpICsgNCB8IDA7DQogICAgICBkYXRhOFtpXSA9IDI1NTsNCiAgICAgIGkgPSBpICsgNCB8IDA7DQogICAgICBkYXRhOFtpXSA9IDI1NTsNCiAgICAgIGkgPSBpICsgNCB8IDA7DQogICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICB3aGlsZSAoaSA8IGopIHsNCiAgICAgIGRhdGE4W2ldID0gMjU1Ow0KICAgICAgaSA9IGkgKyA0IHwgMDsNCiAgICAgfQ0KICAgIH0NCiAgIH0gZWxzZSB7DQogICAgZGF0YTMyLnNldChIRUFQMzIuc3ViYXJyYXkoc3JjLCBzcmMgKyBkYXRhMzIubGVuZ3RoKSk7DQogICB9DQogIH0NCiB9IGVsc2Ugew0KICB2YXIgd2lkdGggPSBNb2R1bGVbImNhbnZhcyJdLndpZHRoOw0KICB2YXIgaGVpZ2h0ID0gTW9kdWxlWyJjYW52YXMiXS5oZWlnaHQ7DQogIHZhciBzID0gc3VyZkRhdGEuYnVmZmVyOw0KICB2YXIgZGF0YSA9IHN1cmZEYXRhLmltYWdlLmRhdGE7DQogIHZhciBjb2xvcnMgPSBzdXJmRGF0YS5jb2xvcnM7DQogIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsNCiAgIHZhciBiYXNlID0geSAqIHdpZHRoICogNDsNCiAgIGZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgew0KICAgIHZhciB2YWwgPSBIRUFQVThbcysrID4+IDBdICogNDsNCiAgICB2YXIgc3RhcnQgPSBiYXNlICsgeCAqIDQ7DQogICAgZGF0YVtzdGFydF0gPSBjb2xvcnNbdmFsXTsNCiAgICBkYXRhW3N0YXJ0ICsgMV0gPSBjb2xvcnNbdmFsICsgMV07DQogICAgZGF0YVtzdGFydCArIDJdID0gY29sb3JzW3ZhbCArIDJdOw0KICAgfQ0KICAgcyArPSB3aWR0aCAqIDM7DQogIH0NCiB9DQogc3VyZkRhdGEuY3R4LnB1dEltYWdlRGF0YShzdXJmRGF0YS5pbWFnZSwgMCwgMCk7DQp9DQoNCnZhciBFTlYgPSB7fTsNCg0KZnVuY3Rpb24gX19fYnVpbGRFbnZpcm9ubWVudChlbnZpcm9uKSB7DQogdmFyIE1BWF9FTlZfVkFMVUVTID0gNjQ7DQogdmFyIFRPVEFMX0VOVl9TSVpFID0gMTAyNDsNCiB2YXIgcG9vbFB0cjsNCiB2YXIgZW52UHRyOw0KIGlmICghX19fYnVpbGRFbnZpcm9ubWVudC5jYWxsZWQpIHsNCiAgX19fYnVpbGRFbnZpcm9ubWVudC5jYWxsZWQgPSB0cnVlOw0KICBFTlZbIlVTRVIiXSA9IEVOVlsiTE9HTkFNRSJdID0gIndlYl91c2VyIjsNCiAgRU5WWyJQQVRIIl0gPSAiLyI7DQogIEVOVlsiUFdEIl0gPSAiLyI7DQogIEVOVlsiSE9NRSJdID0gIi9ob21lL3dlYl91c2VyIjsNCiAgRU5WWyJMQU5HIl0gPSAiQy5VVEYtOCI7DQogIEVOVlsiXyJdID0gTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdOw0KICBwb29sUHRyID0gZ2V0TWVtb3J5KFRPVEFMX0VOVl9TSVpFKTsNCiAgZW52UHRyID0gZ2V0TWVtb3J5KE1BWF9FTlZfVkFMVUVTICogNCk7DQogIEhFQVAzMltlbnZQdHIgPj4gMl0gPSBwb29sUHRyOw0KICBIRUFQMzJbZW52aXJvbiA+PiAyXSA9IGVudlB0cjsNCiB9IGVsc2Ugew0KICBlbnZQdHIgPSBIRUFQMzJbZW52aXJvbiA+PiAyXTsNCiAgcG9vbFB0ciA9IEhFQVAzMltlbnZQdHIgPj4gMl07DQogfQ0KIHZhciBzdHJpbmdzID0gW107DQogdmFyIHRvdGFsU2l6ZSA9IDA7DQogZm9yICh2YXIga2V5IGluIEVOVikgew0KICBpZiAodHlwZW9mIEVOVltrZXldID09PSAic3RyaW5nIikgew0KICAgdmFyIGxpbmUgPSBrZXkgKyAiPSIgKyBFTlZba2V5XTsNCiAgIHN0cmluZ3MucHVzaChsaW5lKTsNCiAgIHRvdGFsU2l6ZSArPSBsaW5lLmxlbmd0aDsNCiAgfQ0KIH0NCiBpZiAodG90YWxTaXplID4gVE9UQUxfRU5WX1NJWkUpIHsNCiAgdGhyb3cgbmV3IEVycm9yKCJFbnZpcm9ubWVudCBzaXplIGV4Y2VlZGVkIFRPVEFMX0VOVl9TSVpFISIpOw0KIH0NCiB2YXIgcHRyU2l6ZSA9IDQ7DQogZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7DQogIHZhciBsaW5lID0gc3RyaW5nc1tpXTsNCiAgd3JpdGVBc2NpaVRvTWVtb3J5KGxpbmUsIHBvb2xQdHIpOw0KICBIRUFQMzJbZW52UHRyICsgaSAqIHB0clNpemUgPj4gMl0gPSBwb29sUHRyOw0KICBwb29sUHRyICs9IGxpbmUubGVuZ3RoICsgMTsNCiB9DQogSEVBUDMyW2VudlB0ciArIHN0cmluZ3MubGVuZ3RoICogcHRyU2l6ZSA+PiAyXSA9IDA7DQp9DQoNCmZ1bmN0aW9uIF9fX2xvY2soKSB7fQ0KDQp2YXIgRVJSTk9fQ09ERVMgPSB7DQogRVBFUk06IDEsDQogRU5PRU5UOiAyLA0KIEVTUkNIOiAzLA0KIEVJTlRSOiA0LA0KIEVJTzogNSwNCiBFTlhJTzogNiwNCiBFMkJJRzogNywNCiBFTk9FWEVDOiA4LA0KIEVCQURGOiA5LA0KIEVDSElMRDogMTAsDQogRUFHQUlOOiAxMSwNCiBFV09VTERCTE9DSzogMTEsDQogRU5PTUVNOiAxMiwNCiBFQUNDRVM6IDEzLA0KIEVGQVVMVDogMTQsDQogRU5PVEJMSzogMTUsDQogRUJVU1k6IDE2LA0KIEVFWElTVDogMTcsDQogRVhERVY6IDE4LA0KIEVOT0RFVjogMTksDQogRU5PVERJUjogMjAsDQogRUlTRElSOiAyMSwNCiBFSU5WQUw6IDIyLA0KIEVORklMRTogMjMsDQogRU1GSUxFOiAyNCwNCiBFTk9UVFk6IDI1LA0KIEVUWFRCU1k6IDI2LA0KIEVGQklHOiAyNywNCiBFTk9TUEM6IDI4LA0KIEVTUElQRTogMjksDQogRVJPRlM6IDMwLA0KIEVNTElOSzogMzEsDQogRVBJUEU6IDMyLA0KIEVET006IDMzLA0KIEVSQU5HRTogMzQsDQogRU5PTVNHOiA0MiwNCiBFSURSTTogNDMsDQogRUNIUk5HOiA0NCwNCiBFTDJOU1lOQzogNDUsDQogRUwzSExUOiA0NiwNCiBFTDNSU1Q6IDQ3LA0KIEVMTlJORzogNDgsDQogRVVOQVRDSDogNDksDQogRU5PQ1NJOiA1MCwNCiBFTDJITFQ6IDUxLA0KIEVERUFETEs6IDM1LA0KIEVOT0xDSzogMzcsDQogRUJBREU6IDUyLA0KIEVCQURSOiA1MywNCiBFWEZVTEw6IDU0LA0KIEVOT0FOTzogNTUsDQogRUJBRFJRQzogNTYsDQogRUJBRFNMVDogNTcsDQogRURFQURMT0NLOiAzNSwNCiBFQkZPTlQ6IDU5LA0KIEVOT1NUUjogNjAsDQogRU5PREFUQTogNjEsDQogRVRJTUU6IDYyLA0KIEVOT1NSOiA2MywNCiBFTk9ORVQ6IDY0LA0KIEVOT1BLRzogNjUsDQogRVJFTU9URTogNjYsDQogRU5PTElOSzogNjcsDQogRUFEVjogNjgsDQogRVNSTU5UOiA2OSwNCiBFQ09NTTogNzAsDQogRVBST1RPOiA3MSwNCiBFTVVMVElIT1A6IDcyLA0KIEVET1RET1Q6IDczLA0KIEVCQURNU0c6IDc0LA0KIEVOT1RVTklROiA3NiwNCiBFQkFERkQ6IDc3LA0KIEVSRU1DSEc6IDc4LA0KIEVMSUJBQ0M6IDc5LA0KIEVMSUJCQUQ6IDgwLA0KIEVMSUJTQ046IDgxLA0KIEVMSUJNQVg6IDgyLA0KIEVMSUJFWEVDOiA4MywNCiBFTk9TWVM6IDM4LA0KIEVOT1RFTVBUWTogMzksDQogRU5BTUVUT09MT05HOiAzNiwNCiBFTE9PUDogNDAsDQogRU9QTk9UU1VQUDogOTUsDQogRVBGTk9TVVBQT1JUOiA5NiwNCiBFQ09OTlJFU0VUOiAxMDQsDQogRU5PQlVGUzogMTA1LA0KIEVBRk5PU1VQUE9SVDogOTcsDQogRVBST1RPVFlQRTogOTEsDQogRU5PVFNPQ0s6IDg4LA0KIEVOT1BST1RPT1BUOiA5MiwNCiBFU0hVVERPV046IDEwOCwNCiBFQ09OTlJFRlVTRUQ6IDExMSwNCiBFQUREUklOVVNFOiA5OCwNCiBFQ09OTkFCT1JURUQ6IDEwMywNCiBFTkVUVU5SRUFDSDogMTAxLA0KIEVORVRET1dOOiAxMDAsDQogRVRJTUVET1VUOiAxMTAsDQogRUhPU1RET1dOOiAxMTIsDQogRUhPU1RVTlJFQUNIOiAxMTMsDQogRUlOUFJPR1JFU1M6IDExNSwNCiBFQUxSRUFEWTogMTE0LA0KIEVERVNUQUREUlJFUTogODksDQogRU1TR1NJWkU6IDkwLA0KIEVQUk9UT05PU1VQUE9SVDogOTMsDQogRVNPQ0tUTk9TVVBQT1JUOiA5NCwNCiBFQUREUk5PVEFWQUlMOiA5OSwNCiBFTkVUUkVTRVQ6IDEwMiwNCiBFSVNDT05OOiAxMDYsDQogRU5PVENPTk46IDEwNywNCiBFVE9PTUFOWVJFRlM6IDEwOSwNCiBFVVNFUlM6IDg3LA0KIEVEUVVPVDogMTIyLA0KIEVTVEFMRTogMTE2LA0KIEVOT1RTVVA6IDk1LA0KIEVOT01FRElVTTogMTIzLA0KIEVJTFNFUTogODQsDQogRU9WRVJGTE9XOiA3NSwNCiBFQ0FOQ0VMRUQ6IDEyNSwNCiBFTk9UUkVDT1ZFUkFCTEU6IDEzMSwNCiBFT1dORVJERUFEOiAxMzAsDQogRVNUUlBJUEU6IDg2DQp9Ow0KDQp2YXIgU1lTQ0FMTFMgPSB7DQogREVGQVVMVF9QT0xMTUFTSzogNSwNCiBtYXBwaW5nczoge30sDQogdW1hc2s6IDUxMSwNCiBjYWxjdWxhdGVBdDogZnVuY3Rpb24oZGlyZmQsIHBhdGgpIHsNCiAgaWYgKHBhdGhbMF0gIT09ICIvIikgew0KICAgdmFyIGRpcjsNCiAgIGlmIChkaXJmZCA9PT0gLTEwMCkgew0KICAgIGRpciA9IEZTLmN3ZCgpOw0KICAgfSBlbHNlIHsNCiAgICB2YXIgZGlyc3RyZWFtID0gRlMuZ2V0U3RyZWFtKGRpcmZkKTsNCiAgICBpZiAoIWRpcnN0cmVhbSkgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpOw0KICAgIGRpciA9IGRpcnN0cmVhbS5wYXRoOw0KICAgfQ0KICAgcGF0aCA9IFBBVEguam9pbjIoZGlyLCBwYXRoKTsNCiAgfQ0KICByZXR1cm4gcGF0aDsNCiB9LA0KIGRvU3RhdDogZnVuY3Rpb24oZnVuYywgcGF0aCwgYnVmKSB7DQogIHRyeSB7DQogICB2YXIgc3RhdCA9IGZ1bmMocGF0aCk7DQogIH0gY2F0Y2ggKGUpIHsNCiAgIGlmIChlICYmIGUubm9kZSAmJiBQQVRILm5vcm1hbGl6ZShwYXRoKSAhPT0gUEFUSC5ub3JtYWxpemUoRlMuZ2V0UGF0aChlLm5vZGUpKSkgew0KICAgIHJldHVybiAtRVJSTk9fQ09ERVMuRU5PVERJUjsNCiAgIH0NCiAgIHRocm93IGU7DQogIH0NCiAgSEVBUDMyW2J1ZiA+PiAyXSA9IHN0YXQuZGV2Ow0KICBIRUFQMzJbYnVmICsgNCA+PiAyXSA9IDA7DQogIEhFQVAzMltidWYgKyA4ID4+IDJdID0gc3RhdC5pbm87DQogIEhFQVAzMltidWYgKyAxMiA+PiAyXSA9IHN0YXQubW9kZTsNCiAgSEVBUDMyW2J1ZiArIDE2ID4+IDJdID0gc3RhdC5ubGluazsNCiAgSEVBUDMyW2J1ZiArIDIwID4+IDJdID0gc3RhdC51aWQ7DQogIEhFQVAzMltidWYgKyAyNCA+PiAyXSA9IHN0YXQuZ2lkOw0KICBIRUFQMzJbYnVmICsgMjggPj4gMl0gPSBzdGF0LnJkZXY7DQogIEhFQVAzMltidWYgKyAzMiA+PiAyXSA9IDA7DQogIEhFQVAzMltidWYgKyAzNiA+PiAyXSA9IHN0YXQuc2l6ZTsNCiAgSEVBUDMyW2J1ZiArIDQwID4+IDJdID0gNDA5NjsNCiAgSEVBUDMyW2J1ZiArIDQ0ID4+IDJdID0gc3RhdC5ibG9ja3M7DQogIEhFQVAzMltidWYgKyA0OCA+PiAyXSA9IHN0YXQuYXRpbWUuZ2V0VGltZSgpIC8gMWUzIHwgMDsNCiAgSEVBUDMyW2J1ZiArIDUyID4+IDJdID0gMDsNCiAgSEVBUDMyW2J1ZiArIDU2ID4+IDJdID0gc3RhdC5tdGltZS5nZXRUaW1lKCkgLyAxZTMgfCAwOw0KICBIRUFQMzJbYnVmICsgNjAgPj4gMl0gPSAwOw0KICBIRUFQMzJbYnVmICsgNjQgPj4gMl0gPSBzdGF0LmN0aW1lLmdldFRpbWUoKSAvIDFlMyB8IDA7DQogIEhFQVAzMltidWYgKyA2OCA+PiAyXSA9IDA7DQogIEhFQVAzMltidWYgKyA3MiA+PiAyXSA9IHN0YXQuaW5vOw0KICByZXR1cm4gMDsNCiB9LA0KIGRvTXN5bmM6IGZ1bmN0aW9uKGFkZHIsIHN0cmVhbSwgbGVuLCBmbGFncykgew0KICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoSEVBUFU4LnN1YmFycmF5KGFkZHIsIGFkZHIgKyBsZW4pKTsNCiAgRlMubXN5bmMoc3RyZWFtLCBidWZmZXIsIDAsIGxlbiwgZmxhZ3MpOw0KIH0sDQogZG9Na2RpcjogZnVuY3Rpb24ocGF0aCwgbW9kZSkgew0KICBwYXRoID0gUEFUSC5ub3JtYWxpemUocGF0aCk7DQogIGlmIChwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPT09ICIvIikgcGF0aCA9IHBhdGguc3Vic3RyKDAsIHBhdGgubGVuZ3RoIC0gMSk7DQogIEZTLm1rZGlyKHBhdGgsIG1vZGUsIDApOw0KICByZXR1cm4gMDsNCiB9LA0KIGRvTWtub2Q6IGZ1bmN0aW9uKHBhdGgsIG1vZGUsIGRldikgew0KICBzd2l0Y2ggKG1vZGUgJiA2MTQ0MCkgew0KICBjYXNlIDMyNzY4Og0KICBjYXNlIDgxOTI6DQogIGNhc2UgMjQ1NzY6DQogIGNhc2UgNDA5NjoNCiAgY2FzZSA0OTE1MjoNCiAgIGJyZWFrOw0KDQogIGRlZmF1bHQ6DQogICByZXR1cm4gLUVSUk5PX0NPREVTLkVJTlZBTDsNCiAgfQ0KICBGUy5ta25vZChwYXRoLCBtb2RlLCBkZXYpOw0KICByZXR1cm4gMDsNCiB9LA0KIGRvUmVhZGxpbms6IGZ1bmN0aW9uKHBhdGgsIGJ1ZiwgYnVmc2l6ZSkgew0KICBpZiAoYnVmc2l6ZSA8PSAwKSByZXR1cm4gLUVSUk5PX0NPREVTLkVJTlZBTDsNCiAgdmFyIHJldCA9IEZTLnJlYWRsaW5rKHBhdGgpOw0KICB2YXIgbGVuID0gTWF0aC5taW4oYnVmc2l6ZSwgbGVuZ3RoQnl0ZXNVVEY4KHJldCkpOw0KICB2YXIgZW5kQ2hhciA9IEhFQVA4W2J1ZiArIGxlbl07DQogIHN0cmluZ1RvVVRGOChyZXQsIGJ1ZiwgYnVmc2l6ZSArIDEpOw0KICBIRUFQOFtidWYgKyBsZW5dID0gZW5kQ2hhcjsNCiAgcmV0dXJuIGxlbjsNCiB9LA0KIGRvQWNjZXNzOiBmdW5jdGlvbihwYXRoLCBhbW9kZSkgew0KICBpZiAoYW1vZGUgJiB+Nykgew0KICAgcmV0dXJuIC1FUlJOT19DT0RFUy5FSU5WQUw7DQogIH0NCiAgdmFyIG5vZGU7DQogIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsNCiAgIGZvbGxvdzogdHJ1ZQ0KICB9KTsNCiAgbm9kZSA9IGxvb2t1cC5ub2RlOw0KICB2YXIgcGVybXMgPSAiIjsNCiAgaWYgKGFtb2RlICYgNCkgcGVybXMgKz0gInIiOw0KICBpZiAoYW1vZGUgJiAyKSBwZXJtcyArPSAidyI7DQogIGlmIChhbW9kZSAmIDEpIHBlcm1zICs9ICJ4IjsNCiAgaWYgKHBlcm1zICYmIEZTLm5vZGVQZXJtaXNzaW9ucyhub2RlLCBwZXJtcykpIHsNCiAgIHJldHVybiAtRVJSTk9fQ09ERVMuRUFDQ0VTOw0KICB9DQogIHJldHVybiAwOw0KIH0sDQogZG9EdXA6IGZ1bmN0aW9uKHBhdGgsIGZsYWdzLCBzdWdnZXN0RkQpIHsNCiAgdmFyIHN1Z2dlc3QgPSBGUy5nZXRTdHJlYW0oc3VnZ2VzdEZEKTsNCiAgaWYgKHN1Z2dlc3QpIEZTLmNsb3NlKHN1Z2dlc3QpOw0KICByZXR1cm4gRlMub3BlbihwYXRoLCBmbGFncywgMCwgc3VnZ2VzdEZELCBzdWdnZXN0RkQpLmZkOw0KIH0sDQogZG9SZWFkdjogZnVuY3Rpb24oc3RyZWFtLCBpb3YsIGlvdmNudCwgb2Zmc2V0KSB7DQogIHZhciByZXQgPSAwOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IGlvdmNudDsgaSsrKSB7DQogICB2YXIgcHRyID0gSEVBUDMyW2lvdiArIGkgKiA4ID4+IDJdOw0KICAgdmFyIGxlbiA9IEhFQVAzMltpb3YgKyAoaSAqIDggKyA0KSA+PiAyXTsNCiAgIHZhciBjdXJyID0gRlMucmVhZChzdHJlYW0sIEhFQVA4LCBwdHIsIGxlbiwgb2Zmc2V0KTsNCiAgIGlmIChjdXJyIDwgMCkgcmV0dXJuIC0xOw0KICAgcmV0ICs9IGN1cnI7DQogICBpZiAoY3VyciA8IGxlbikgYnJlYWs7DQogIH0NCiAgcmV0dXJuIHJldDsNCiB9LA0KIGRvV3JpdGV2OiBmdW5jdGlvbihzdHJlYW0sIGlvdiwgaW92Y250LCBvZmZzZXQpIHsNCiAgdmFyIHJldCA9IDA7DQogIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsNCiAgIHZhciBwdHIgPSBIRUFQMzJbaW92ICsgaSAqIDggPj4gMl07DQogICB2YXIgbGVuID0gSEVBUDMyW2lvdiArIChpICogOCArIDQpID4+IDJdOw0KICAgdmFyIGN1cnIgPSBGUy53cml0ZShzdHJlYW0sIEhFQVA4LCBwdHIsIGxlbiwgb2Zmc2V0KTsNCiAgIGlmIChjdXJyIDwgMCkgcmV0dXJuIC0xOw0KICAgcmV0ICs9IGN1cnI7DQogIH0NCiAgcmV0dXJuIHJldDsNCiB9LA0KIHZhcmFyZ3M6IDAsDQogZ2V0OiBmdW5jdGlvbih2YXJhcmdzKSB7DQogIFNZU0NBTExTLnZhcmFyZ3MgKz0gNDsNCiAgdmFyIHJldCA9IEhFQVAzMltTWVNDQUxMUy52YXJhcmdzIC0gNCA+PiAyXTsNCiAgcmV0dXJuIHJldDsNCiB9LA0KIGdldFN0cjogZnVuY3Rpb24oKSB7DQogIHZhciByZXQgPSBVVEY4VG9TdHJpbmcoU1lTQ0FMTFMuZ2V0KCkpOw0KICByZXR1cm4gcmV0Ow0KIH0sDQogZ2V0U3RyZWFtRnJvbUZEOiBmdW5jdGlvbigpIHsNCiAgdmFyIHN0cmVhbSA9IEZTLmdldFN0cmVhbShTWVNDQUxMUy5nZXQoKSk7DQogIGlmICghc3RyZWFtKSB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQkFERik7DQogIHJldHVybiBzdHJlYW07DQogfSwNCiBnZXRTb2NrZXRGcm9tRkQ6IGZ1bmN0aW9uKCkgew0KICB2YXIgc29ja2V0ID0gU09DS0ZTLmdldFNvY2tldChTWVNDQUxMUy5nZXQoKSk7DQogIGlmICghc29ja2V0KSB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQkFERik7DQogIHJldHVybiBzb2NrZXQ7DQogfSwNCiBnZXRTb2NrZXRBZGRyZXNzOiBmdW5jdGlvbihhbGxvd051bGwpIHsNCiAgdmFyIGFkZHJwID0gU1lTQ0FMTFMuZ2V0KCksIGFkZHJsZW4gPSBTWVNDQUxMUy5nZXQoKTsNCiAgaWYgKGFsbG93TnVsbCAmJiBhZGRycCA9PT0gMCkgcmV0dXJuIG51bGw7DQogIHZhciBpbmZvID0gX19yZWFkX3NvY2thZGRyKGFkZHJwLCBhZGRybGVuKTsNCiAgaWYgKGluZm8uZXJybm8pIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGluZm8uZXJybm8pOw0KICBpbmZvLmFkZHIgPSBETlMubG9va3VwX2FkZHIoaW5mby5hZGRyKSB8fCBpbmZvLmFkZHI7DQogIHJldHVybiBpbmZvOw0KIH0sDQogZ2V0NjQ6IGZ1bmN0aW9uKCkgew0KICB2YXIgbG93ID0gU1lTQ0FMTFMuZ2V0KCksIGhpZ2ggPSBTWVNDQUxMUy5nZXQoKTsNCiAgcmV0dXJuIGxvdzsNCiB9LA0KIGdldFplcm86IGZ1bmN0aW9uKCkgew0KICBTWVNDQUxMUy5nZXQoKTsNCiB9DQp9Ow0KDQpmdW5jdGlvbiBfX19zeXNjYWxsMTQwKHdoaWNoLCB2YXJhcmdzKSB7DQogU1lTQ0FMTFMudmFyYXJncyA9IHZhcmFyZ3M7DQogdHJ5IHsNCiAgdmFyIHN0cmVhbSA9IFNZU0NBTExTLmdldFN0cmVhbUZyb21GRCgpLCBvZmZzZXRfaGlnaCA9IFNZU0NBTExTLmdldCgpLCBvZmZzZXRfbG93ID0gU1lTQ0FMTFMuZ2V0KCksIHJlc3VsdCA9IFNZU0NBTExTLmdldCgpLCB3aGVuY2UgPSBTWVNDQUxMUy5nZXQoKTsNCiAgdmFyIG9mZnNldCA9IG9mZnNldF9sb3c7DQogIEZTLmxsc2VlayhzdHJlYW0sIG9mZnNldCwgd2hlbmNlKTsNCiAgSEVBUDMyW3Jlc3VsdCA+PiAyXSA9IHN0cmVhbS5wb3NpdGlvbjsNCiAgaWYgKHN0cmVhbS5nZXRkZW50cyAmJiBvZmZzZXQgPT09IDAgJiYgd2hlbmNlID09PSAwKSBzdHJlYW0uZ2V0ZGVudHMgPSBudWxsOw0KICByZXR1cm4gMDsNCiB9IGNhdGNoIChlKSB7DQogIGlmICh0eXBlb2YgRlMgPT09ICJ1bmRlZmluZWQiIHx8ICEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKSBhYm9ydChlKTsNCiAgcmV0dXJuIC1lLmVycm5vOw0KIH0NCn0NCg0KZnVuY3Rpb24gX19fc3lzY2FsbDE0NSh3aGljaCwgdmFyYXJncykgew0KIFNZU0NBTExTLnZhcmFyZ3MgPSB2YXJhcmdzOw0KIHRyeSB7DQogIHZhciBzdHJlYW0gPSBTWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoKSwgaW92ID0gU1lTQ0FMTFMuZ2V0KCksIGlvdmNudCA9IFNZU0NBTExTLmdldCgpOw0KICByZXR1cm4gU1lTQ0FMTFMuZG9SZWFkdihzdHJlYW0sIGlvdiwgaW92Y250KTsNCiB9IGNhdGNoIChlKSB7DQogIGlmICh0eXBlb2YgRlMgPT09ICJ1bmRlZmluZWQiIHx8ICEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKSBhYm9ydChlKTsNCiAgcmV0dXJuIC1lLmVycm5vOw0KIH0NCn0NCg0KZnVuY3Rpb24gX19fc3lzY2FsbDE0Nih3aGljaCwgdmFyYXJncykgew0KIFNZU0NBTExTLnZhcmFyZ3MgPSB2YXJhcmdzOw0KIHRyeSB7DQogIHZhciBzdHJlYW0gPSBTWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoKSwgaW92ID0gU1lTQ0FMTFMuZ2V0KCksIGlvdmNudCA9IFNZU0NBTExTLmdldCgpOw0KICByZXR1cm4gU1lTQ0FMTFMuZG9Xcml0ZXYoc3RyZWFtLCBpb3YsIGlvdmNudCk7DQogfSBjYXRjaCAoZSkgew0KICBpZiAodHlwZW9mIEZTID09PSAidW5kZWZpbmVkIiB8fCAhKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSkgYWJvcnQoZSk7DQogIHJldHVybiAtZS5lcnJubzsNCiB9DQp9DQoNCmZ1bmN0aW9uIF9fX3N5c2NhbGwxOTUod2hpY2gsIHZhcmFyZ3MpIHsNCiBTWVNDQUxMUy52YXJhcmdzID0gdmFyYXJnczsNCiB0cnkgew0KICB2YXIgcGF0aCA9IFNZU0NBTExTLmdldFN0cigpLCBidWYgPSBTWVNDQUxMUy5nZXQoKTsNCiAgcmV0dXJuIFNZU0NBTExTLmRvU3RhdChGUy5zdGF0LCBwYXRoLCBidWYpOw0KIH0gY2F0Y2ggKGUpIHsNCiAgaWYgKHR5cGVvZiBGUyA9PT0gInVuZGVmaW5lZCIgfHwgIShlIGluc3RhbmNlb2YgRlMuRXJybm9FcnJvcikpIGFib3J0KGUpOw0KICByZXR1cm4gLWUuZXJybm87DQogfQ0KfQ0KDQpmdW5jdGlvbiBfX19zeXNjYWxsMjIwKHdoaWNoLCB2YXJhcmdzKSB7DQogU1lTQ0FMTFMudmFyYXJncyA9IHZhcmFyZ3M7DQogdHJ5IHsNCiAgdmFyIHN0cmVhbSA9IFNZU0NBTExTLmdldFN0cmVhbUZyb21GRCgpLCBkaXJwID0gU1lTQ0FMTFMuZ2V0KCksIGNvdW50ID0gU1lTQ0FMTFMuZ2V0KCk7DQogIGlmICghc3RyZWFtLmdldGRlbnRzKSB7DQogICBzdHJlYW0uZ2V0ZGVudHMgPSBGUy5yZWFkZGlyKHN0cmVhbS5wYXRoKTsNCiAgfQ0KICB2YXIgcG9zID0gMDsNCiAgd2hpbGUgKHN0cmVhbS5nZXRkZW50cy5sZW5ndGggPiAwICYmIHBvcyArIDI2OCA8PSBjb3VudCkgew0KICAgdmFyIGlkOw0KICAgdmFyIHR5cGU7DQogICB2YXIgbmFtZSA9IHN0cmVhbS5nZXRkZW50cy5wb3AoKTsNCiAgIGlmIChuYW1lWzBdID09PSAiLiIpIHsNCiAgICBpZCA9IDE7DQogICAgdHlwZSA9IDQ7DQogICB9IGVsc2Ugew0KICAgIHZhciBjaGlsZCA9IEZTLmxvb2t1cE5vZGUoc3RyZWFtLm5vZGUsIG5hbWUpOw0KICAgIGlkID0gY2hpbGQuaWQ7DQogICAgdHlwZSA9IEZTLmlzQ2hyZGV2KGNoaWxkLm1vZGUpID8gMiA6IEZTLmlzRGlyKGNoaWxkLm1vZGUpID8gNCA6IEZTLmlzTGluayhjaGlsZC5tb2RlKSA/IDEwIDogODsNCiAgIH0NCiAgIEhFQVAzMltkaXJwICsgcG9zID4+IDJdID0gaWQ7DQogICBIRUFQMzJbZGlycCArIHBvcyArIDQgPj4gMl0gPSBzdHJlYW0ucG9zaXRpb247DQogICBIRUFQMTZbZGlycCArIHBvcyArIDggPj4gMV0gPSAyNjg7DQogICBIRUFQOFtkaXJwICsgcG9zICsgMTAgPj4gMF0gPSB0eXBlOw0KICAgc3RyaW5nVG9VVEY4KG5hbWUsIGRpcnAgKyBwb3MgKyAxMSwgMjU2KTsNCiAgIHBvcyArPSAyNjg7DQogIH0NCiAgcmV0dXJuIHBvczsNCiB9IGNhdGNoIChlKSB7DQogIGlmICh0eXBlb2YgRlMgPT09ICJ1bmRlZmluZWQiIHx8ICEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKSBhYm9ydChlKTsNCiAgcmV0dXJuIC1lLmVycm5vOw0KIH0NCn0NCg0KZnVuY3Rpb24gX19fc3lzY2FsbDIyMSh3aGljaCwgdmFyYXJncykgew0KIFNZU0NBTExTLnZhcmFyZ3MgPSB2YXJhcmdzOw0KIHRyeSB7DQogIHZhciBzdHJlYW0gPSBTWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoKSwgY21kID0gU1lTQ0FMTFMuZ2V0KCk7DQogIHN3aXRjaCAoY21kKSB7DQogIGNhc2UgMDoNCiAgIHsNCiAgICB2YXIgYXJnID0gU1lTQ0FMTFMuZ2V0KCk7DQogICAgaWYgKGFyZyA8IDApIHsNCiAgICAgcmV0dXJuIC1FUlJOT19DT0RFUy5FSU5WQUw7DQogICAgfQ0KICAgIHZhciBuZXdTdHJlYW07DQogICAgbmV3U3RyZWFtID0gRlMub3BlbihzdHJlYW0ucGF0aCwgc3RyZWFtLmZsYWdzLCAwLCBhcmcpOw0KICAgIHJldHVybiBuZXdTdHJlYW0uZmQ7DQogICB9DQoNCiAgY2FzZSAxOg0KICBjYXNlIDI6DQogICByZXR1cm4gMDsNCg0KICBjYXNlIDM6DQogICByZXR1cm4gc3RyZWFtLmZsYWdzOw0KDQogIGNhc2UgNDoNCiAgIHsNCiAgICB2YXIgYXJnID0gU1lTQ0FMTFMuZ2V0KCk7DQogICAgc3RyZWFtLmZsYWdzIHw9IGFyZzsNCiAgICByZXR1cm4gMDsNCiAgIH0NCg0KICBjYXNlIDEyOg0KICAgew0KICAgIHZhciBhcmcgPSBTWVNDQUxMUy5nZXQoKTsNCiAgICB2YXIgb2Zmc2V0ID0gMDsNCiAgICBIRUFQMTZbYXJnICsgb2Zmc2V0ID4+IDFdID0gMjsNCiAgICByZXR1cm4gMDsNCiAgIH0NCg0KICBjYXNlIDEzOg0KICBjYXNlIDE0Og0KICAgcmV0dXJuIDA7DQoNCiAgY2FzZSAxNjoNCiAgY2FzZSA4Og0KICAgcmV0dXJuIC1FUlJOT19DT0RFUy5FSU5WQUw7DQoNCiAgY2FzZSA5Og0KICAgX19fc2V0RXJyTm8oRVJSTk9fQ09ERVMuRUlOVkFMKTsNCiAgIHJldHVybiAtMTsNCg0KICBkZWZhdWx0Og0KICAgew0KICAgIHJldHVybiAtRVJSTk9fQ09ERVMuRUlOVkFMOw0KICAgfQ0KICB9DQogfSBjYXRjaCAoZSkgew0KICBpZiAodHlwZW9mIEZTID09PSAidW5kZWZpbmVkIiB8fCAhKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSkgYWJvcnQoZSk7DQogIHJldHVybiAtZS5lcnJubzsNCiB9DQp9DQoNCmZ1bmN0aW9uIF9fX3N5c2NhbGw1KHdoaWNoLCB2YXJhcmdzKSB7DQogU1lTQ0FMTFMudmFyYXJncyA9IHZhcmFyZ3M7DQogdHJ5IHsNCiAgdmFyIHBhdGhuYW1lID0gU1lTQ0FMTFMuZ2V0U3RyKCksIGZsYWdzID0gU1lTQ0FMTFMuZ2V0KCksIG1vZGUgPSBTWVNDQUxMUy5nZXQoKTsNCiAgdmFyIHN0cmVhbSA9IEZTLm9wZW4ocGF0aG5hbWUsIGZsYWdzLCBtb2RlKTsNCiAgcmV0dXJuIHN0cmVhbS5mZDsNCiB9IGNhdGNoIChlKSB7DQogIGlmICh0eXBlb2YgRlMgPT09ICJ1bmRlZmluZWQiIHx8ICEoZSBpbnN0YW5jZW9mIEZT",
  "sig": "1fbeaaea00b06f45f93312c8837ef99ae6c5071c3cc069e563553e07f56f00c2a343a03ac426a59538bfe895b9d3ef8e92ebcb5b4df91deddf72be763eb34140"
}

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