Advertisement
xiaomianao666

邀您一起看:番·仓________风吹花海轻舞,醉卧番仓梦乡。

May 17th, 2024
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥番·仓________风吹花海轻舞,醉卧番仓梦乡。@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImdtdE1vZGlmaWVkXCI6MCxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJqczpcXG52YXIgY2hwID0gW107XFxudHJ5IHtcXG4gICAgdmFyIGh0bWwgPSBnZXRSZXNDb2RlKCk7XFxuICAgIHZhciBjb250cyA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgJ2JvZHkmJi5zb3J0LWl0ZW0nKTtcXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250cy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgdmFyIGxpc3QgPSBwZGZhKGNvbnRzW2ldLCAnYm9keSYmYScpO1xcbiAgICAgICAgY2hwLnB1c2gobGlzdC5sZW5ndGgpO1xcbiAgICB9ICAgICBcXG59IGNhdGNoIChlKSB7fVxcbnNldFJlc3VsdCgn5pu05paw6IezOicgKyAoTWF0aC5tYXguYXBwbHkobnVsbCwgY2hwKSkpO1wiLFwibGlzdFRvQ2xlYXJBc3NvY2lhdGVkRktcIjpbXSxcImxpc3RUb0NsZWFyU2VsZkZLXCI6W10sXCJwYWdlTGlzdFwiOlt7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5LiA57qn5YiG57G75YiX6KGoXCIsXCJwYXRoXCI6XCJ5aVwiLFwicnVsZVwiOlwianM6XFxuLypcXG7kuIDnuqflsIHoo4UgXFxu5Yqo5oCB5YiG57G7IOWIl+ihqOWIm+W7uiDoh6rliqjkuIvkuIDpobVcXG52ZXIgMjAyMzA3MTAgMS4wXFxuKi9cXG5cXG4vL2V2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL2xhenknLCB7fSkpLnJ1bGUpO1xcblxcbmZ1bmN0aW9uIGR5bmFtaWNDbGFzcyhvcHRpb25zKSB7XFxuICBjb25zdCBvYmogPSB7XFxuICAgIC8v6buY6K6k5YC8XFxuICAgIGxheW91dDogXFxcInVuZGVmaW5lZFxcXCIsXFxuICAgIGh0bWw6IFxcXCJlbXB0eVxcXCIsXFxuICAgIHBhZ2U6IDAsXFxuICAgIOWIhuexu+minOiJsjogXFxcIiNGQTcyOThcXFwiLFxcbiAgICDmipjlj6A6IFxcXCLigJzigJzigJ3igJ08Yj5cXFwiICsgXFxcIuKIqFxcXCIuZm9udGNvbG9yKFxcXCIjMWFhZDE5XFxcIikgKyBcXFwiPC9iPlxcXCIsXFxuICAgIOWxleW8gDogXFxcIuKAnOKAnOKAneKAnTxiPlxcXCIgKyBcXFwi4oinXFxcIi5mb250Y29sb3IoXFxcIiNGRjAwMDBcXFwiKSArIFxcXCI8L2I+XFxcIixcXG4gICAgb3BlbjogdHJ1ZSxcXG4gICAgc3RhdGU6IE1ZX1JVTEUudXJsLFxcbiAgICBzZWFyY2g6IGZhbHNlLFxcbiAgICBjbGVhcnM6IFtdLFxcbiAgICBjbGVhcmFsbDogW1xcXCJ5aV9maXJzdHBhZ2VcXFwiXSxcXG4gICAgZGVidWc6IGZhbHNlLFxcblxcbiAgICDpooTorr4ocGFyYW0pIHtcXG4gICAgICBpZihwYXJhbT09dW5kZWZpbmVkKXtcXG4gICAgICAgIHBhcmFtPVtdO1xcbiAgICAgIH1cXG4gICAgICBPYmplY3Qua2V5cyhwYXJhbSkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcXG4gICAgICAgIC8vIOWvueavj+S4quWxnuaAp+WQjeaJp+ihjOaTjeS9nFxcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbVtwcm9wZXJ0eV07IC8vIOiOt+WPluWxnuaAp+WAvFxcbiAgICAgICAgLy8g5Zyo6L+Z6YeM5omn6KGM5oKo55qE5pON5L2cXFxuICAgICAgICB0aGlzW3Byb3BlcnR5XSA9IHZhbHVlO1xcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcXG4gICAgICAgICAgY29uc29sZS5sb2cocHJvcGVydHkgKyBcXFwiOlxcXCIgKyB2YWx1ZSk7XFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgIH0sXFxuICAgIGV2YWxKU1J1bGUoaXRlbSwganNSdWxlKSB7XFxuICAgICAgbGV0IHJ1bGUgPSBqc1J1bGUucmVwbGFjZShcXFwiQGpzOlxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICBydWxlID0gcnVsZS50cmltKCk7XFxuICAgICAgLy9sb2coJC5zdHJpbmdpZnkocnVsZSkpXFxuICAgICAgbGV0IGlucHV0ID0gaXRlbTtcXG4gICAgICBpZiAocnVsZS5zdGFydHNXaXRoKFxcXCIoXFxcIikpIHtcXG4gICAgICAgIGV2YWwoXFxcInJlc3VsdCA9IFxcXCIgKyBydWxlKTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgLyoqXFxuICAgICAgICAgKiDov5jljp/miJAgJC50b1N0cmluZyguLi4pIOeahOacgOe7iOe7k+aenO+8jOi+vuWIsOacgOe7iOWkhOeQhuaWueW8j+i3n+S4iumdoueahCBpZiDkuIDoh7TnmoTnm67nmoRcXG4gICAgICAgICAqL1xcbiAgICAgICAgZXZhbChcXFwicmVzdWx0ID0gXFxcIiArIFxcXCIoKCkgPT4ge1xcXCIgKyBydWxlICsgXFxcIn0pKClcXFwiKTtcXG4gICAgICB9XFxuICAgICAgcmV0dXJuIHJlc3VsdCB8fCBcXFwiXFxcIjtcXG4gICAgfSxcXG4gICAgZ2V0VGl0bGUoc3JjLCBjYXRlZ29yeSkge1xcbiAgICAgIGxldCB0aXRsZSA9IFxcXCJcXFwiO1xcbiAgICAgIGxldCB0aXRsZVJ1bGUgPSBjYXRlZ29yeSB8fCBcXFwiYSYmVGV4dFxcXCI7XFxuICAgICAgaWYgKHRpdGxlUnVsZS5zdGFydHNXaXRoKFxcXCJAanM6XFxcIikpIHtcXG4gICAgICAgIHRpdGxlID0gdGhpcy5ldmFsSlNSdWxlKHNyYywgdGl0bGVSdWxlKTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgdGl0bGUgPSBwYXJzZURvbUZvckh0bWwoc3JjLCB0aXRsZVJ1bGUpO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gdGl0bGUgfHwgXFxcIlxcXCI7XFxuICAgIH0sXFxuICAgIGdldFVybChzcmMsIGNhdGVnb3J5KSB7XFxuICAgICAgbGV0IHVybCA9IFxcXCJcXFwiO1xcbiAgICAgIGxldCB1cmxSdWxlID0gY2F0ZWdvcnku6ZO+5o6lIHx8IFxcXCJhJiZocmVmXFxcIjtcXG4gICAgICBpZiAodXJsUnVsZS5zdGFydHNXaXRoKFxcXCJAanM6XFxcIikpIHtcXG4gICAgICAgIHVybCA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIHVybFJ1bGUpO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICB1cmwgPSBwZChzcmMsIHVybFJ1bGUpO1xcbiAgICAgIH1cXG4gICAgICBpZiAodHlwZW9mIGNhdGVnb3J5LumTvuaOpeWkhOeQhiA9PSBcXFwiZnVuY3Rpb25cXFwiKSB7XFxuICAgICAgICB1cmwgPSBjYXRlZ29yeS7pk77mjqXlpITnkIYodXJsKTtcXG4gICAgICB9XFxuICAgICAgcmV0dXJuIHVybCB8fCBcXFwiXFxcIjtcXG4gICAgfSxcXG4gICAgaXNOdWxsKHBhcmFtKSB7XFxuICAgICAgaWYgKHBhcmFtID09IG51bGwpIHtcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH0sXFxuICAgIGlzQm9vbGVhbih2YXJpYWJsZSkge1xcbiAgICAgIGlmICh0eXBlb2YgdmFyaWFibGUgIT09IFxcXCJib29sZWFuXFxcIikge1xcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLlvIDlkK/mipjlj6Dor7fkvKDlhaXluIPlsJTlgLxcXFwiKTtcXG4gICAgICB9XFxuICAgIH0sXFxuICAgIOa4hemZpChsaXN0KSB7XFxuICAgICAgaWYgKHRoaXMuaXNOdWxsKGxpc3QpKSB7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgICB9XFxuICAgICAgaWYgKGxpc3QuY29uc3RydWN0b3IgPT0gU3RyaW5nKSB7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIua4hemZpOaKpemUmTror7fkvKDliJfooahcXFwiKTtcXG4gICAgICB9XFxuICAgICAgdGhpcy5jbGVhcnMgPSBsaXN0O1xcbiAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICDlhajmuIUobGlzdCkge1xcbiAgICAgIGlmICh0aGlzLmlzTnVsbChsaXN0KSkge1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgfVxcbiAgICAgIHZhciBjID0gdGhpcy5jbGVhcmFsbDtcXG4gICAgICBsaXN0ID0gYy5jb25jYXQobGlzdCk7XFxuICAgICAgdGhpcy5jbGVhcmFsbCA9IGxpc3Q7XFxuICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIOa6kOeggShpbnB1dCkge1xcbiAgICAgIHRoaXMuaHRtbCA9IGlucHV0O1xcbiAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICDnlYzpnaIoaW5wdXQpIHtcXG4gICAgICB0aGlzLmxheW91dCA9IGlucHV0O1xcbiAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICDpobXnoIEoaW5wdXQpIHtcXG4gICAgICB0aGlzLnBhZ2UgPSBpbnB1dDtcXG4gICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAg54q25oCBKGlucHV0KSB7XFxuICAgICAgdGhpcy5zdGF0ZSA9IGlucHV0O1xcbiAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICDlvIDlkK/mkJzntKIoKSB7XFxuICAgICAgdGhpcy5zZWFyY2ggPSB0cnVlO1xcbiAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICDlvIDlkK/mipjlj6AoaW5wdXQpIHtcXG4gICAgICBpZiAoaW5wdXQgPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICBpbnB1dCA9IHRydWU7XFxuICAgICAgfVxcbiAgICAgIHRoaXMuaXNCb29sZWFuKGlucHV0KTtcXG4gICAgICB0aGlzLm9wZW4gPSBpbnB1dDtcXG4gICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgc2V0VGl0bGUoaywgaSwgdCkge1xcbiAgICAgIHJldHVybiBrID09IGkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIHQuZm9udGNvbG9yKHRoaXMu5YiG57G76aKc6ImyKSA6IHQ7XFxuICAgIH0sXFxuICAgIGFjdGlvbihvYmopIHtcXG4gICAgICByZXR1cm4gW1xcbiAgICAgICAge1xcbiAgICAgICAgICB0aXRsZTogXFxcIua4hemZpOeKtuaAgVxcXCIsXFxuICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChvYmopID0+IHtcXG4gICAgICAgICAgICBsb2cob2JqKTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKG9iai5zdGF0ZSk7XFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiaGVhZC5jYXRlXFxcIik7XFxuICAgICAgICAgICAgb2JqLmFsbC5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIG9iai5jbC5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIH0sIG9iaiksXFxuICAgICAgICB9LFxcbiAgICAgIF07XFxuICAgIH0sXFxuICAgIGNoZWNrUGFyYW0oKSB7XFxuICAgICAgdmFyIG9iaiA9IHt9O1xcbiAgICAgIGlmICh0aGlzLnBhZ2UgPT0gMCAmJiB0eXBlb2YgcGFnZSA9PSBcXFwidW5kZWZpbmVkXFxcIikge1xcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7fkvKDlhaXpobXnoIFcXFwiKTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgaWYgKHR5cGVvZiBwYWdlID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgIG9ialtcXFwi6aG156CBXFxcIl0gPSB0aGlzLnBhZ2U7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBvYmpbXFxcIumhteeggVxcXCJdID0gcGFnZTtcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgICAgaWYgKHRoaXMuaHRtbCA9PSBcXFwiZW1wdHlcXFwiICYmIHR5cGVvZiBodG1sID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+S8oOWFpea6kOeggVxcXCIpO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBpZiAodHlwZW9mIGh0bWwgPT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgb2JqW1xcXCLmupDnoIFcXFwiXSA9IHRoaXMuaHRtbDtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIG9ialtcXFwi5rqQ56CBXFxcIl0gPSBodG1sO1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgICBpZiAodGhpcy5sYXlvdXQgPT0gXFxcInVuZGVmaW5lZFxcXCIgJiYgdHlwZW9mIGQgPT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35Lyg5YWl55WM6Z2iXFxcIik7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGlmICh0eXBlb2YgZCA9PSBcXFwidW5kZWZpbmVkXFxcIikge1xcbiAgICAgICAgICBvYmpbXFxcIueVjOmdolxcXCJdID0gdGhpcy5sYXlvdXQ7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBvYmpbXFxcIueVjOmdolxcXCJdID0gZDtcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgICAgcmV0dXJuIG9iajtcXG4gICAgfSxcXG4gICAg5Yib5bu65Yqo5oCB5YiG57G7KHJ1bGVPYmopIHtcXG4gICAgICBpZiAocnVsZU9iaiA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgIHJ1bGVPYmogPSBbXTtcXG4gICAgICB9XFxuICAgICAgLy/liJ3lp4vljJblj5jph4/lvIDlp4tcXG4gICAgICBjb25zdCBwYXJhbSA9IHRoaXMuY2hlY2tQYXJhbSgpO1xcbiAgICAgIGNvbnN0IHBhZ2UgPSBwYXJhbS7pobXnoIE7XFxuICAgICAgY29uc3QgaHRtbCA9IHBhcmFtLua6kOeggTtcXG4gICAgICBjb25zdCBkID0gcGFyYW0u55WM6Z2iO1xcbiAgICAgIGNvbnN0IOeKtuaAgSA9IHRoaXMuc3RhdGU7XFxuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2g7XFxuICAgICAgY29uc3QgZW1wdHkgPSBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgY29uc3Qg5oqY5Y+g54q25oCBID0gdGhpcy5vcGVuO1xcbiAgICAgIHZhciDlsZXlvIAgPSB0aGlzLuWxleW8gDtcXG4gICAgICB2YXIg5oqY5Y+gID0gdGhpcy7mipjlj6A7XFxuICAgICAgdmFyIOWFqOa4hSA9IHRoaXMuY2xlYXJhbGw7XFxuICAgICAgdmFyIOa4hemZpCA9IHRoaXMuY2xlYXJzO1xcbiAgICAgIC8v5Yid5aeL5YyW5Y+Y6YeP57uT5p2fXFxuICAgICAgbGV0IGluaXRfY2F0ZSA9IG5ldyBBcnJheSgyMCkuZmlsbChcXFwiMFxcXCIpO1xcbiAgICAgIGNvbnN0IGZvbGQgPSBnZXRNeVZhcihNWV9SVUxFLmdyb3VwLCBcXFwiMFxcXCIpO1xcbiAgICAgIGNvbnN0IGNhdGVfdGVtcCA9IEpTT04ucGFyc2UoXFxuICAgICAgICBnZXRNeVZhcihcXFwiaGVhZC5jYXRlXFxcIiwgSlNPTi5zdHJpbmdpZnkoaW5pdF9jYXRlKSlcXG4gICAgICApO1xcbiAgICAgIGlmIChzZWFyY2ggJiYgcGFnZSA9PSAxKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICB0aXRsZTogXFxcIlxcXCIsXFxuICAgICAgICAgIHVybDogXFxcIidoaWtlcjovL3NlYXJjaD9ydWxlPVxcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcIiZzPScraW5wdXRcXFwiLFxcbiAgICAgICAgICBkZXNjOiBcXFwi5pCc57Si5YWz6ZSu6K+NXFxcIixcXG4gICAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwia2V5d29yZFxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICBwdXRNeVZhcihcXFwia2V5d29yZFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgfSxcXG4gICAgICAgIH0pO1xcbiAgICAgIH1cXG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gW107XFxuICAgICAgcnVsZU9iai5mb3JFYWNoKCh4KSA9PiB7XFxuICAgICAgICB2YXIgbGlzdCA9IFtdO1xcbiAgICAgICAgaWYoeC7kuIDnuqflrprkvY0pe1xcbiAgICAgICAgICBpZiAoeC7kuIDnuqflrprkvY0uc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgIGxpc3QgPSB0aGlzLmV2YWxKU1J1bGUoaHRtbCwgeC7kuIDnuqflrprkvY0pO1xcbiAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIGxpc3QgPSBwZGZhKGh0bWwsIHgu5LiA57qn5a6a5L2NKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYoeC7lpKfnsbvlrprkvY0pe1xcbiAgICAgICAgICBpZiAoeC7lpKfnsbvlrprkvY0uc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgIGxpc3QgPSB0aGlzLmV2YWxKU1J1bGUoaHRtbCwgeC7lpKfnsbvlrprkvY0pO1xcbiAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIGxpc3QgPSBbcGRmYShodG1sLCB4LuWkp+exu+WumuS9jSkuam9pbignXFxcXG4nKV07XFxuICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIOS4gOe6pyA9IGxpc3QubWFwKChzKSA9PiB7XFxuICAgICAgICAgIHZhciBzbGlzdCA9IFtdO1xcbiAgICAgICAgICBpZiAoIShcXFwi5bCP57G7XFxcIiBpbiB4KSkge1xcbiAgICAgICAgICAgIHgu5bCP57G7ID0gXFxcImJvZHkmJmE6bm90KDptYXRjaGVzKOmmlumhtSkpOm5vdChhOm5vdChbaHJlZl0pKVxcXCI7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKHgu5bCP57G7LnN0YXJ0c1dpdGgoXFxcIkBqczpcXFwiKSkge1xcbiAgICAgICAgICAgIHNsaXN0ID0gdGhpcy5ldmFsSlNSdWxlKHMsIHgu5bCP57G7KTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBzbGlzdCA9IHBkZmEocywgeC7lsI/nsbspO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHZhciDlrprkvY0gPSBzbGlzdC5tYXAoKGl0ZW0pID0+IHtcXG4gICAgICAgICAgICB2YXIgdGl0bGUgPSB0aGlzLmdldFRpdGxlKGl0ZW0sIHgu5qCH6aKYKTtcXG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5nZXRVcmwoaXRlbSwgeCk7XFxuICAgICAgICAgICAgdmFyIG9iaiA9IHsgdGl0bGU6IHRpdGxlLCB1cmw6IHVybCB9O1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xcbiAgICAgICAgICB9KTtcXG4gICAgICAgICAgcmV0dXJuIOWumuS9jTtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgLy9sb2co5LiA57qnKVxcbiAgICAgICAgLy9sb2co5LiA57qnLmxlbmd0aClcXG4gICAgICAgIGlmICjkuIDnuqcubGVuZ3RoID09IDEpIHtcXG4gICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKOS4gOe6py5qb2luKFxcXCJcXFxcblxcXCIpKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIOS4gOe6py5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKGl0ZW0uam9pbihcXFwiLFxcXCIpKTtcXG4gICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICAvL2xvZyhjYXRlZ29yaWVzKVxcbiAgICAgIH0pO1xcbiAgICAgIGlmICjmipjlj6DnirbmgIEpIHtcXG4gICAgICAgIGlmIChwYWdlID09IDEpIHtcXG4gICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogZm9sZCA9PT0gXFxcIjFcXFwiID8g5oqY5Y+gIDog5bGV5byALFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShcXG4gICAgICAgICAgICAgIChmb2xkLCB1LCBhbGwpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoTVlfUlVMRS5ncm91cCwgZm9sZCA9PT0gXFxcIjFcXFwiID8gXFxcIjBcXFwiIDogXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICAgICAgLyphbGwuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaXRlbSk7XFxuICAgICAgICAgICAgICAgIH0pOyovXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICBmb2xkLFxcbiAgICAgICAgICAgICAg54q25oCBLFxcbiAgICAgICAgICAgICAg5YWo5riFXFxuICAgICAgICAgICAgKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICBsb25nQ2xpY2s6IHRoaXMuYWN0aW9uKHtcXG4gICAgICAgICAgICAgICAgc3RhdGU6IOeKtuaAgSxcXG4gICAgICAgICAgICAgICAgYWxsOiDlhajmuIUsXFxuICAgICAgICAgICAgICAgIGNsOiDmuIXpmaQsXFxuICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgIGNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnksIGluZGV4KSA9PiB7XFxuICAgICAgICAvL2xvZyhjYXRlZ29yaWVzKVxcbiAgICAgICAgbGV0IHN1Yl9jYXRlZ29yaWVzID0gW107XFxuICAgICAgICAvKmlmICjlsI/nsbvlrprkvY0uaW5jbHVkZXMoXFxcIjtcXFwiKSkge1xcbiAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHBkZmEoY2F0ZWdvcnksIOWwj+exu+WumuS9jS5zcGxpdChcXFwiO1xcXCIpWzBdKTtcXG4gICAgICAgICAgaWYgKHN1Yl9jYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMgPSBwZGZhKGNhdGVnb3J5LCDlsI/nsbvlrprkvY0uc3BsaXQoXFxcIjtcXFwiKVsxXSk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7Ki9cXG4gICAgICAgIC8vbG9nKGluZGV4KVxcbiAgICAgICAgc3ViX2NhdGVnb3JpZXMgPSBKU09OLnBhcnNlKGBbJHtjYXRlZ29yeX1dYCk7XFxuICAgICAgICAvLyBzdWJfY2F0ZWdvcmllcyA9IHBkZmEoY2F0ZWdvcnksIOWwj+exu+WumuS9jSk7XFxuICAgICAgICAvL31cXG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xcbiAgICAgICAgICBzdWJfY2F0ZWdvcmllcy5mb3JFYWNoKChpdGVtLCBrZXkpID0+IHtcXG5cXG4gICAgICAgICAgICAvL2xldCB0aXRsZSA9IHBkZmgoaXRlbSwgX+Wkp+exu+agh+mimCk7XFxuICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS50aXRsZTtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIOaOkumZpCAhPSBcXFwidW5kZWZpbmVkXFxcIiAmJiDmjpLpmaQgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZShuZXdSZWdFeHAo5o6S6ZmkLCBcXFwiZ1xcXCIpLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBqc29uPScnXFxuICAgICAgICAgICAganNvbiA9IGl0ZW0udXJsO1xcbiAgICAgICAgICAgIFxcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7XFxuICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgIGtleToga2V5LFxcbiAgICAgICAgICAgICAgcGFnZTogcGFnZSxcXG4gICAgICAgICAgICAgIGNsZWFyczog5riF6ZmkLFxcbiAgICAgICAgICAgICAganNvbjoganNvbixcXG4gICAgICAgICAgICAgIHN0YXRlOiDnirbmgIEsXFxuICAgICAgICAgICAgICBhbGxjbGVhcnM6IOWFqOa4hSxcXG4gICAgICAgICAgICB9O1xcblxcbiAgICAgICAgICAgIC8vbGV0IHVybCA9IHBkKGl0ZW0sIF/lpKfnsbvpk77mjqUpO1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBpdGVtLnVybDtcXG4gICAgICAgICAgICAvKmlmICjlpKfnsbvlpITnkIYpIHtcXG4gICAgICAgICAgICAgIHVybCA9IOS4gOe6p+WIhuexu+WkhOeQhih1cmwpO1xcbiAgICAgICAgICAgIH0qL1xcbiAgICAgICAgICAgIC8vbG9nKHVybClcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuc2V0VGl0bGUoa2V5LnRvU3RyaW5nKCksIGNhdGVfdGVtcFtpbmRleF0sIHRpdGxlKSxcXG4gICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgICAgICB1cmw6ICQoXFxcImhpa2VyOi8vZW1wdHkjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IG5ld19jYXRlID0gW107XFxuICAgICAgICAgICAgICAgIHBhcmFtcy5jbGVhcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaXRlbSk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBwYXJhbXMuYWxsY2xlYXJzLmZvckVhY2goKGl0ZW0pID0+IHtcXG4gICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcC5mb3JFYWNoKChjYXRlLCBpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIG5ld19jYXRlLnB1c2goaW5kZXggPT09IDAgPyBwYXJhbXMua2V5LnRvU3RyaW5nKCkgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImhlYWQuY2F0ZVxcXCIsIEpTT04uc3RyaW5naWZ5KG5ld19jYXRlKSk7XFxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuanNvbi5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XFxuICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImR0X1xcXCIgKyBwYXJhbXMuanNvbi50eXBlLCBwYXJhbXMuanNvbi52YWx1ZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnN0YXRlLCBwYXJhbXMuanNvbik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICB9LCBwYXJhbXMpLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICB9KTtcXG4gICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2UgaWYgKGZvbGQgPT09IFxcXCIxXFxcIiB8fCDmipjlj6DnirbmgIEgPT0gZmFsc2UpIHtcXG4gICAgICAgICAgc3ViX2NhdGVnb3JpZXMuZm9yRWFjaCgoaXRlbSwga2V5KSA9PiB7XFxuICAgICAgICAgICAgdmFyIGV4dHJhcG9zID0gZmFsc2U7XFxuICAgICAgICAgICAgLyppZiAoaXRlbS5pbmNsdWRlcygndHlwZT1cXFwiQGV4dHJhXFxcIicpKSB7XFxuICAgICAgICAgICAgICBleHRyYXBvcyA9IHRydWU7XFxuICAgICAgICAgICAgICAvL2xvZygn6ZmE5Yqg5a6a5L2NJylcXG4gICAgICAgICAgICB9Ki9cXG5cXG4gICAgICAgICAgICBpZiAoZXh0cmFwb3MpIHtcXG4gICAgICAgICAgICAgIHZhciB0aXRsZSA9IHBkZmgoaXRlbSwgXFxcImEmJlRleHRcXFwiKTtcXG4gICAgICAgICAgICAgIGlmICh0eXBlb2Yg5o6S6ZmkICE9IFxcXCJ1bmRlZmluZWRcXFwiICYmIOaOkumZpCAhPSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cCjmjpLpmaQsIFxcXCJnXFxcIiksIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIHZhciBqc29uID0ge1xcbiAgICAgICAgICAgICAgICB0eXBlOiBwZGZoKGl0ZW0sIFxcXCJhJiZzdGF0ZVxcXCIpLFxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcGRmaChpdGVtLCBcXFwiYSYmdmFsdWVcXFwiKSxcXG4gICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIC8vdmFyIHRpdGxlID0gcGRmaChpdGVtLCDliIbnsbvmoIfpopgpO1xcbiAgICAgICAgICAgICAgdmFyIHRpdGxlID0gaXRlbS50aXRsZTtcXG4gICAgICAgICAgICAgIGlmICh0eXBlb2Yg5o6S6ZmkICE9IFxcXCJ1bmRlZmluZWRcXFwiICYmIOaOkumZpCAhPSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cCjmjpLpmaQsIFxcXCJnXFxcIiksIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgIHZhciBqc29uID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAvKnN3aXRjaCAodHJ1ZSkge1xcbiAgICAgICAgICAgICAgICBjYXNlIOWIhuexu+mTvuaOpS5pbmNsdWRlcyhcXFwiQEBAXFxcIik6XFxuICAgICAgICAgICAgICAgICAganNvbiA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHBkZmgoaXRlbSwg5YiG57G76ZO+5o6lLnNwbGl0KFxcXCJAQEBcXFwiKVswXSksXFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcGRmaChpdGVtLCDliIbnsbvpk77mjqUuc3BsaXQoXFxcIkBAQFxcXCIpWzFdKSxcXG4gICAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBjYXNlIOWIhuexu+mTvuaOpS5pbmNsdWRlcyhcXFwiQEBcXFwiKTpcXG4gICAgICAgICAgICAgICAgICBqc29uID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdHlwZTog5YiG57G76ZO+5o6lLnNwbGl0KFxcXCJAQFxcXCIpWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBkZmgoaXRlbSwg5YiG57G76ZO+5o6lLnNwbGl0KFxcXCJAQFxcXCIpWzFdKSxcXG4gICAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxcbiAgICAgICAgICAgICAgICAgIGpzb24gPSBpdGVtLnVybDtcXG4gICAgICAgICAgICAgICAgICAvLyBqc29uID0gcGQoaXRlbSwg5YiG57G76ZO+5o6lKTtcXG4gICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgIH0qL1xcbiAgICAgICAgICAgICAganNvbiA9IGl0ZW0udXJsO1xcbiAgICAgICAgICAgICAgLyp2YXIganNvbj3liIbnsbvpk77mjqUuaW5jbHVkZXMoJ0BAQCcpP3tcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6cGRmaChpdGVtLOWIhuexu+mTvuaOpS5zcGxpdCgnQEBAJylbMF0pLFxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6cGRmaChpdGVtLOWIhuexu+mTvuaOpS5zcGxpdCgnQEBAJylbMV0pLFxcbiAgICAgICAgICAgICAgICB9OnBkKGl0ZW0s5YiG57G76ZO+5o6lKTtcXG4gICAgICAgICAgICAgICAgXFxuICAgICAgICAgICAgICAgIGpzb2495YiG57G76ZO+5o6lLmluY2x1ZGVzKCdAQCcpP3tcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU65YiG57G76ZO+5o6lLnNwbGl0KCdAQCcpWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6cGRmaChpdGVtLOWIhuexu+mTvuaOpS5zcGxpdCgnQEAnKVsxXSksXFxuICAgICAgICAgICAgICAgIH06cGQoaXRlbSzliIbnsbvpk77mjqUpOyovXFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7XFxuICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcXG4gICAgICAgICAgICAgIGtleToga2V5LFxcbiAgICAgICAgICAgICAgcGFnZTogcGFnZSxcXG4gICAgICAgICAgICAgIGpzb246IGpzb24sXFxuICAgICAgICAgICAgICBzdGF0ZTog54q25oCBLFxcbiAgICAgICAgICAgICAgYWxsY2xlYXJzOiDlhajmuIUsXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuc2V0VGl0bGUoa2V5LnRvU3RyaW5nKCksIGNhdGVfdGVtcFtpbmRleF0sIHRpdGxlKSxcXG4gICAgICAgICAgICAgIHVybDogJChcXFwiaGlrZXI6Ly9lbXB0eVxcXCIgKyBcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxuICAgICAgICAgICAgICAgIHBhcmFtcy5hbGxjbGVhcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaXRlbSk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wW3BhcmFtcy5pbmRleF0gPSBwYXJhbXMua2V5LnRvU3RyaW5nKCk7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJoZWFkLmNhdGVcXFwiLCBKU09OLnN0cmluZ2lmeShwYXJhbXMuY2F0ZV90ZW1wKSk7XFxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuanNvbi5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XFxuICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImR0X1xcXCIgKyBwYXJhbXMuanNvbi50eXBlLCBwYXJhbXMuanNvbi52YWx1ZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnN0YXRlLCBwYXJhbXMuanNvbik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgIH0sIHBhcmFtcyksXFxuICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICB9KTtcXG4gICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgIH1cXG4gICAgfSxcXG4gIH07XFxuICBvYmou6aKE6K6+KG9wdGlvbnMpO1xcbiAgcmV0dXJuIG9iajtcXG59XFxuXFxuICAvLy7nirbmgIEoXFxcInVybFxcXCIpXFxuICAvLy7nlYzpnaIoZClcXG4gIC8vLua6kOeggSh4aHRtbClcXG4gIC8vLuWFqOa4hShbXFxcIjFcXFwiLCBcXFwiMlxcXCJdKVxcbiAgLy8u5riF6ZmkKClcXG4gIC8vLuW8gOWQr+aKmOWPoCgpXFxuICAvLy7pobXnoIEocGFnZSlcXG4gIC8vLuWIm+W7uuWKqOaAgeWIhuexuyjlrprkvY3liJfooagpO1xcblxcbmZ1bmN0aW9uIGdldE9iamZ1YyhvYmopIHtcXG4gIGNvbnN0IG1ldGhvZHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmZpbHRlcihcXG4gICAgKG5hbWUpID0+IHR5cGVvZiBvYmpbbmFtZV0gPT09IFxcXCJmdW5jdGlvblxcXCJcXG4gICk7XFxuICBpZiAobWV0aG9kcy5sZW5ndGggPT0gMCkge1xcbiAgICBjb25zb2xlLmxvZyhvYmoudG9TdHJpbmcoKSk7XFxuICAgIHJldHVybjtcXG4gIH1cXG4gIGNvbnN0IGZvcm1hdHRlZFN0cmluZyA9IG1ldGhvZHNcXG4gICAgLm1hcCgobmFtZSkgPT4ge1xcbiAgICAgIGNvbnN0IGZuID0gb2JqW25hbWVdO1xcbiAgICAgIGNvbnN0IGZuU3RyaW5nID0gYCR7bmFtZX06ICR7Zm4udG9TdHJpbmcoKX1gO1xcbiAgICAgIGNvbnN0IHJlc3RvcmVkRm5TdHJpbmcgPSBmblN0cmluZy5yZXBsYWNlKFxcbiAgICAgICAgL1xcXFxcXFxcdShbXFxcXGRcXFxcd117NH0pL2dpLFxcbiAgICAgICAgZnVuY3Rpb24gKG1hdGNoLCBncnApIHtcXG4gICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoZ3JwLCAxNikpO1xcbiAgICAgICAgfVxcbiAgICAgICk7XFxuICAgICAgcmV0dXJuIHJlc3RvcmVkRm5TdHJpbmc7XFxuICAgIH0pXFxuICAgIC5qb2luKFxcXCJcXFxcblxcXCIpO1xcbiAgY29uc29sZS5sb2coZm9ybWF0dGVkU3RyaW5nKTtcXG59XFxuXFxuLypcXG52ZXIgMjAyMy0wNi0xNiAgMS4wXFxuKi9cXG52YXIg54q25oCBID1cXG4gIHR5cGVvZiDnirbmgIHmoIforrAgIT0gXFxcInVuZGVmaW5lZFxcXCIgJiYg54q25oCB5qCH6K6wICE9IFxcXCJcXFwiID8g54q25oCB5qCH6K6wIDogTVlfUlVMRS51cmw7XFxuXFxubGV0IGR0X2RlYnVnPWZhbHNlOyAgXFxuICBcXG5hZGRMaXN0ZW5lcihcXG4gIFxcXCJvbkNsb3NlXFxcIixcXG4gICQudG9TdHJpbmcoKCkgPT4ge30pXFxuKTtcXG5cXG52YXIgQ3JlYXRlID0ge1xcbiAgc3BhZ2U6IHtcXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XFxuICAgICAgcmV0dXJuIHN0b3JhZ2UwLmdldE15VmFyKFxcXCJzcGFnZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgfSxcXG4gICAgc2V0OiBmdW5jdGlvbiAodXJsKSB7XFxuICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcInNwYWdlXFxcIiwgdXJsKTtcXG4gICAgfSxcXG4gIH0sXFxuICBuZXh0UGFnZTogZnVuY3Rpb24gKCkge1xcbiAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XFxuICAgIHRyeSB7XFxuICAgICAgdmFyIG5leHQgPSBldmFsKOS4i+S4gOmhtSk7XFxuICAgICAgLy9sb2coJ246JytuZXh0KVxcbiAgICAgIGlmKG5leHQgPT1cXFwiXFxcIil7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ+S4i+S4gOmhtemTvuaOpeS4uuepuicpXFxuICAgICAgfVxcbiAgICAgIHJlc3VsdD10cnVlO1xcbiAgICAgIGlmKHRydWVfdXJsPT1uZXh0KXtcXG4gICAgICAgICByZXN1bHQ9ZmFsc2U7XFxuICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgLy9sb2coXFxcIuWPr+iDveS4jeWtmOWcqOS4i+S4gOmhteaIluiAheS4i+S4gOmhteWumuS9jeaciemXrumimFxcXCIpO1xcbiAgICAgIGxvZyhcXFwi6ZSZ6K+v5L+h5oGvOlxcXCIgKyBlLm1lc3NhZ2UpO1xcbiAgICB9XFxuICAgIGlmICgobmV4dCA9PSBcXFwiXFxcIiB8fCBuZXh0ID09IHVuZGVmaW5lZCkgJiYgcGFnZSA9PSAxKSB7XFxuICAgICAgbmV4dCA9IHRydWVfdXJsO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIC8vcmVzdWx0PWZhbHNlO1xcbiAgICAgIG5leHQgPSBnZXRNeVZhcijnirbmgIEpO1xcbiAgICB9XFxuICAgIC8vbG9nKCdsJyt0cnVlX3VybClcXG4gICAgLy9sb2coJ24nK25leHQpXFxuICAgIGlmKHBhZ2UhPTEpe1xcbiAgICBpZiAodHJ1ZV91cmwgPT0gbmV4dCYmIXJlc3VsdCkge1xcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIHJlc3VsdCA9IHRydWU7XFxuICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgLy9wdXRNeVZhcijnirbmgIEsIG5leHQpO1xcbiAgfSxcXG4gIGdldEJhY2tJbWFnZTogZnVuY3Rpb24gKGltZ3VybCkge1xcbiAgICB2YXIgcmVzdWx0ID0gaW1ndXJsO1xcbiAgICB0cnkge1xcbiAgICAgIHJlc3VsdCA9IC91cmwoPzpcXFxccyspP1xcXFwoKC4qPylcXFxcKS9nXFxuICAgICAgICAuZXhlYyhpbWd1cmwpWzFdXFxuICAgICAgICAucmVwbGFjZSgvKCd8XFxcInwmcXVvdDspL2dtLCBcXFwiXFxcIik7XFxuICAgIH0gY2F0Y2gge31cXG4gICAgcmV0dXJuIHJlc3VsdDtcXG4gIH0sXFxuICBodHRwSGFuZGxlOiBmdW5jdGlvbiAoaW5wdXQpIHtcXG4gICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgIHJldHVybiBpbnB1dDtcXG4gICAgfSBlbHNlIGlmIChpbnB1dC5zdGFydHNXaXRoKFxcXCIvL1xcXCIpKSB7XFxuICAgICAgcmV0dXJuIFxcXCJodHRwczpcXFwiICsgaW5wdXQ7XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFwiL1xcXCIpKSB7XFxuICAgICAgcmV0dXJuIE1ZX0hPTUUgKyBpbnB1dDtcXG4gICAgfVxcbiAgfSxcXG4gIGltZ0hhbmRsZTogZnVuY3Rpb24gKGl0ZW0sIHJ1bGUpIHtcXG4gICAgdmFyIGltZyA9IFxcXCJcXFwiO1xcbiAgICBpZiAocnVsZS5pbWcuc3RhcnRzV2l0aChcXFwicGRcXFwiKSkge1xcbiAgICAgIGltZyA9IGV2YWwocnVsZS5pbWcpO1xcbiAgICB9IGVsc2UgaWYgKHJ1bGUuYmFja2ltZykge1xcbiAgICAgIGltZyA9IHBkZmgoaXRlbSwgcnVsZS5pbWcpO1xcbiAgICAgIGltZyA9IHRoaXMuZ2V0QmFja0ltYWdlKGltZyk7XFxuICAgICAgaW1nID0gdGhpcy5odHRwSGFuZGxlKGltZyk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgaW1nID0gcGRmaChpdGVtLCBydWxlLmltZyk7XFxuICAgICAgaWYgKCFpbWcuc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICBpbWcgPSBwZChpdGVtLCBydWxlLmltZyk7XFxuICAgICAgICBpbWcgPSB0aGlzLmh0dHBIYW5kbGUoaW1nKTtcXG4gICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIGltZyArIHJ1bGUucmVmO1xcbiAgfSxcXG4gIHVybEhhbmRsZTogZnVuY3Rpb24gKGl0ZW0sIHJ1bGUpIHtcXG4gICAgdmFyIGhyZWYgPSBcXFwiXFxcIjtcXG4gICAgaWYgKHJ1bGUudXJsLnN0YXJ0c1dpdGgoXFxcInBkXFxcIikpIHtcXG4gICAgICBocmVmID0gZXZhbChydWxlLnVybCk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgaHJlZiA9IHBkKGl0ZW0sIHJ1bGUudXJsKTtcXG4gICAgfVxcbiAgICBocmVmID0gcnVsZS5pbXQgPyBocmVmICsgXFxcIiNpbW1lcnNpdmVUaGVtZSNcXFwiIDogaHJlZjtcXG4gICAgcmV0dXJuIGhyZWY7XFxuICB9LFxcbiAgc2V0Q29udGVudDogZnVuY3Rpb24gKGl0ZW0sIGlucHV0KSB7XFxuICAgIGxldCBvdXRwdXQgPSBcXFwiXFxcIjtcXG4gICAgaWYgKGlucHV0ID09IHVuZGVmaW5lZCkge1xcbiAgICAgIHJldHVybiBvdXRwdXQ7XFxuICAgIH1cXG4gICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXFxcInBkXFxcIikpIHtcXG4gICAgICBvdXRwdXQgPSBldmFsKGlucHV0KTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICBvdXRwdXQgPSBwZGZoKGl0ZW0sIGlucHV0KTtcXG4gICAgfVxcbiAgICByZXR1cm4gb3V0cHV0O1xcbiAgfSxcXG4gIHJlZnJlc2g6IGZ1bmN0aW9uICgpIHtcXG4gICAgYWRkTGlzdGVuZXIoXFxuICAgICAgXFxcIm9uUmVmcmVzaFxcXCIsXFxuICAgICAgJC50b1N0cmluZygodSkgPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwieWlsaXN0XFxcIik7XFxuICAgICAgICAvL3ZhciBwID0gc3RvcmFnZTAuZ2V0TXlWYXIoJ3NwYWdlJywgJycpO1xcbiAgICAgICAgLy9wdXRNeVZhcih1LCBwKTtcXG4gICAgICB9LCDnirbmgIEpXFxuICAgICk7XFxuICB9LFxcbiAganNvbkxpc3Q6IGZ1bmN0aW9uIChhcnIsIGpzb24sIHJ1bGUpIHtcXG4gICAgaWYgKGpzb24uY29uc3RydWN0b3IgIT0gT2JqZWN0KSB7XFxuICAgICAgdHJ5IHtcXG4gICAgICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pO1xcbiAgICAgIH0gY2F0Y2gge31cXG4gICAgfVxcbiAgICBqc29uW3J1bGUubGlzdF0uZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgIHZhciBpbWcgPSBldmFsKHJ1bGUuaW1nKSArIHJ1bGUucmVmO1xcbiAgICAgIHZhciBocmVmID0gZXZhbChydWxlLnVybCk7XFxuICAgICAgaHJlZiA9IHJ1bGUuaW10ID8gaHJlZiArIFxcXCIjaW1tZXJzaXZlVGhlbWUjXFxcIiA6IGhyZWY7XFxuICAgICAgdmFyIGxhenkgPSBydWxlLmxhenkgPyBydWxlLmxhenkgOiBcXFwiXFxcIjtcXG4gICAgICB2YXIgZGQgPSB7XFxuICAgICAgICB0aXRsZTogZXZhbChydWxlLnRpdGxlKSxcXG4gICAgICAgIGRlc2M6IGV2YWwocnVsZS5kZXNjKSxcXG4gICAgICAgIGNvbnRlbnQ6IGV2YWwocnVsZS5jb250ZW50KSxcXG4gICAgICAgIHBpY191cmw6IGltZyxcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHkjI1xcXCIgKyBocmVmLFxcbiAgICAgICAgY29sX3R5cGU6IHJ1bGUuY29sX3R5cGUsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBpbWc6IGltZyxcXG4gICAgICAgIH0sXFxuICAgICAgfTtcXG4gICAgICBpZiAobGF6eSAhPSBcXFwiXFxcIikge1xcbiAgICAgICAgZGRbXFxcInVybFxcXCJdID0gaHJlZiArIGxhenk7XFxuICAgICAgfVxcbiAgICAgIGFyci5wdXNoKGRkKTtcXG4gICAgfSk7XFxuICB9LFxcbiAgcnVsZUxpc3Q6IGZ1bmN0aW9uIChhcnIsIGh0bWwsIHJ1bGUpIHtcXG4gICAgdmFyIGxpc3QgPSBwZGZhKGh0bWwsIHJ1bGUubGlzdCk7XFxuICAgIGxpc3QuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICAgIHZhciB0aXRsZSA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLnRpdGxlKTtcXG4gICAgICB2YXIgZGVzYyA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLmRlc2MpO1xcbiAgICAgIHZhciBpbWcgPSB0aGlzLmltZ0hhbmRsZShpdGVtLCBydWxlKTtcXG4gICAgICB2YXIgdXJsID0gdGhpcy51cmxIYW5kbGUoaXRlbSwgcnVsZSk7XFxuICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLnNldENvbnRlbnQoaXRlbSwgcnVsZS5jb250ZW50KTtcXG4gICAgICB2YXIgbGF6eSA9IHJ1bGUubGF6eSA/IHJ1bGUubGF6eSA6IFxcXCJcXFwiO1xcbiAgICAgIHZhciBkZCA9IHtcXG4gICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgIGRlc2M6IGRlc2MsXFxuICAgICAgICBwaWNfdXJsOiBpbWcsXFxuICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXFxuICAgICAgICBjb2xfdHlwZTogcnVsZS5jb2xfdHlwZSxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGltZzogaW1nLFxcbiAgICAgICAgfSxcXG4gICAgICB9O1xcbiAgICAgIGlmIChsYXp5ICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICBkZFtcXFwidXJsXFxcIl0gPSB1cmwgKyBsYXp5O1xcbiAgICAgIH1cXG4gICAgICBhcnIucHVzaChkZCk7XFxuICAgIH0pO1xcbiAgfSxcXG4gIExpc3Q6IGZ1bmN0aW9uIChhcnIsIGh0bWwsIHJ1bGUsIHBhcmFtKSB7XFxuICAgIHBhcmFtID0gcGFyYW0gPyBwYXJhbSA6IHt9O1xcbiAgICB2YXIgYXV0byA9IHBhcmFtLmF1dG8gPyBwYXJhbS5hdXRvIDogZmFsc2U7XFxuICAgIHZhciBzaG93ID0gcGFyYW0uc2hvdyA/IHBhcmFtLnNob3cgOiBmYWxzZTtcXG4gICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgIC8vdGhpcy5zcGFnZS5zZXQodHJ1ZV91cmwpO1xcbiAgICB9XFxuICAgIHRoaXMucmVmcmVzaCgpO1xcbiAgICB2YXIgbGlzdCA9IHBkZmEoaHRtbCwgcnVsZS5saXN0KTtcXG4gICAgLy9sb2codGhpcy5uZXh0UGFnZSgpKVxcbiAgICBpZiAoKHN0b3JhZ2UwLmdldE15VmFyKCd5aV9pc25leHQnLCd0Jyk9PSd0JyYmbGlzdC5sZW5ndGggPiAwKSB8fCBwYWdlID09IDEpIHtcXG4gICAgICBsaXN0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgICAgIGRlbGV0ZUl0ZW0oXFxcInBhZ2VudW1cXFwiKTtcXG4gICAgICAgIGRlbGV0ZUl0ZW0oXFxcInBhZ2VsaW5lXFxcIik7XFxuICAgICAgICB2YXIgaWQgPSBcXFwiXFxcIjtcXG4gICAgICAgIHZhciBjbHMgPSBcXFwiXFxcIjtcXG4gICAgICAgIHZhciB0aXRsZSA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLnRpdGxlKTtcXG4gICAgICAgIHZhciBkZXNjID0gdGhpcy5zZXRDb250ZW50KGl0ZW0sIHJ1bGUuZGVzYyk7XFxuICAgICAgICB2YXIgaW1nID0gdGhpcy5pbWdIYW5kbGUoaXRlbSwgcnVsZSk7XFxuICAgICAgICB2YXIgdXJsID0gdGhpcy51cmxIYW5kbGUoaXRlbSwgcnVsZSk7XFxuICAgICAgICB2YXIgY29udGVudCA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLmNvbnRlbnQpO1xcbiAgICAgICAgaWYgKGkgPT0gbGlzdC5sZW5ndGggLSAxKSB7XFxuICAgICAgICAgIGlkID0gXFxcImxhc3RpZF9cXFwiICsgcGFnZTtcXG4gICAgICAgICAgY2xzID0gXFxcImxhc3RtYXJrXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgZGVzYzogZGVzYyxcXG4gICAgICAgICAgcGljX3VybDogaW1nLFxcbiAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZXI/dXJsPVxcXCIgKyB1cmwsXFxuICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXFxuICAgICAgICAgIGNvbF90eXBlOiBydWxlLmNvbF90eXBlLFxcbiAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICBpbWc6IGltZyxcXG4gICAgICAgICAgICBpZDogaWQsXFxuICAgICAgICAgICAgY2xzOiBjbHMsXFxuICAgICAgICAgIH0sXFxuICAgICAgICB9KTtcXG4gICAgICAgIGlmIChpID09IGxpc3QubGVuZ3RoIC0gMSAmJiBzaG93KSB7XFxuICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgaWQ6IFxcXCJwYWdlbGluZVxcXCIsXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08c21hbGw+5Yqg6L295LitLi4uPC9zbWFsbD5cXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgIGlkOiBcXFwicGFnZW51bVxcXCIsXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgdXBkYXRlSXRlbShcXFwicGFnZW51bVxcXCIsIHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9XFxcImdyZXlcXFwiPjxzbWFsbD7liLDlupXkuoY8L3NtYWxsPjwvZm9udD4nLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgaWQ6IFxcXCJsYXN0XFxcIixcXG4gICAgICAgIH0sXFxuICAgICAgfSk7XFxuICAgIH1cXG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDAgJiYgcGFnZSA9PSAxKSB7XFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCIsXFxuICAgICAgfSk7XFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9XFxcImdyZXlcXFwiPjxzbWFsbD7ml6DlhoXlrrk8L3NtYWxsPjwvZm9udD4nLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHt9LFxcbiAgICAgIH0pO1xcbiAgICB9XFxuICAgIGlmKHRoaXMubmV4dFBhZ2UoKSl7XFxuICAgICAgLy9sb2coJ3QnKTtcXG4gICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKCd5aV9pc25leHQnLCd0Jyk7XFxuICAgIH1lbHNle1xcbiAgICAgIC8vbG9nKCdmJyk7XFxuICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcigneWlfaXNuZXh0JywnZicpO1xcbiAgICB9XFxuICAgIGlmIChhdXRvKSB7XFxuICAgICAgLy9jcmVhdGVOZXh0UGFnZSgpO1xcbiAgICAgIGF1dG9QYWdlKCk7XFxuICAgIH1cXG4gIH0sXFxufTtcXG5cXG52YXIgZXh0TWV0aG9kID0ge1xcbiAgVG9QYXJhbXM6IGZ1bmN0aW9uICgpIHtcXG4gICAgdmFyIGpzb24gPSBhcmd1bWVudHNbMF07XFxuICAgIHJldHVybiBPYmplY3Qua2V5cyhqc29uKVxcbiAgICAgIC5tYXAoKGtleSkgPT4ga2V5ICsgXFxcIj1cXFwiICsganNvbltrZXldKVxcbiAgICAgIC5qb2luKFxcXCImXFxcIik7XFxuICB9LFxcbiAgdXJsUGFyc2U6IGZ1bmN0aW9uICh1KSB7XFxuICAgIHZhciBkaWN0ID0ge307XFxuICAgIGRpY3QuU291cmNlID0gdTtcXG4gICAgbGV0IHBhcmFtcyA9ICh1cmwpID0+IHtcXG4gICAgICBsZXQgcXVlcnlQYXJhbXMgPSB7fTtcXG4gICAgICBsZXQgcmVnID0gLyhbXj89Jl0rKT0oW14/PSZdKykvZztcXG4gICAgICB1cmwucmVwbGFjZShyZWcsIGZ1bmN0aW9uICgpIHtcXG4gICAgICAgIHF1ZXJ5UGFyYW1zW2FyZ3VtZW50c1sxXV0gPSBhcmd1bWVudHNbMl07XFxuICAgICAgfSk7XFxuICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zO1xcbiAgICB9O1xcbiAgICB2YXIgamF2YVVybCA9IEphdmFJbXBvcnRlcihqYXZhLm5ldC5VUkwpO1xcbiAgICB3aXRoIChqYXZhVXJsKSB7XFxuICAgICAgdmFyIHVybCA9IG5ldyBVUkwodSk7XFxuICAgICAgZGljdC5Qcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpO1xcbiAgICAgIGRpY3QuSG9zdCA9IHVybC5nZXRIb3N0KCk7XFxuICAgICAgZGljdC5Qb3J0ID0gdXJsLmdldFBvcnQoKTtcXG4gICAgICBkaWN0LkZpbGUgPSB1cmwuZ2V0RmlsZSgpO1xcbiAgICAgIGRpY3QuUGF0aCA9IHVybC5nZXRQYXRoKCk7XFxuICAgICAgZGljdC5SZWYgPSB1cmwuZ2V0UmVmKCk7XFxuICAgICAgZGljdC5Ib3N0cyA9IGAke2RpY3QuUHJvdG9jb2x9Oi8vJHt1cmwuZ2V0SG9zdCgpfWA7XFxuICAgIH1cXG4gICAgZGljdC5QYXJhbXMgPSBwYXJhbXModSk7XFxuICAgIHJldHVybiBkaWN0O1xcbiAgfSxcXG4gIGlzRXF1YWw6IGZ1bmN0aW9uICh4LCB5KSB7XFxuICAgIGNvbnN0IG9rID0gT2JqZWN0LmtleXMsXFxuICAgICAgdHggPSB0eXBlb2YgeCxcXG4gICAgICB0eSA9IHR5cGVvZiB5O1xcbiAgICByZXR1cm4geCAmJiB5ICYmIHR4ID09PSBcXFwib2JqZWN0XFxcIiAmJiB0eCA9PT0gdHlcXG4gICAgICA/IG9rKHgpLmxlbmd0aCA9PT0gb2soeSkubGVuZ3RoICYmXFxuICAgICAgICAgIG9rKHgpLmV2ZXJ5KChrZXkpID0+IHRoaXMuaXNFcXVhbCh4W2tleV0sIHlba2V5XSkpXFxuICAgICAgOiB4ID09PSB5O1xcbiAgfSxcXG4gIGZpbmREaWZmZXJlbnRJbmRleDogZnVuY3Rpb24gKHN0cjEsIHN0cjIpIHtcXG4gICAgY29uc3QgZGlmZkNoYXJzID0gW107XFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyMi5sZW5ndGg7IGkrKykge1xcbiAgICAgIGlmIChzdHIxW2ldICE9PSBzdHIyW2ldKSB7XFxuICAgICAgICBkaWZmQ2hhcnMucHVzaCh7XFxuICAgICAgICAgIGluZGV4OiBpLFxcbiAgICAgICAgICBzMTogc3RyMVtpXSxcXG4gICAgICAgICAgczI6IHN0cjJbaV0sXFxuICAgICAgICB9KTtcXG4gICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIGRpZmZDaGFycztcXG4gIH0sXFxuICByZXBsYWNlQ2hhckF0OiBmdW5jdGlvbiAoc3RyLCBpbmRleCwgcmVwbGFjZW1lbnQpIHtcXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzdHIubGVuZ3RoKSB7XFxuICAgICAgcmV0dXJuIHN0cjtcXG4gICAgfVxcbiAgICAvL2xvZyhpbmRleClcXG4gICAgY29uc3QgYXJyID0gc3RyLnNwbGl0KFxcXCJcXFwiKTtcXG4gICAgYXJyW2luZGV4XSA9IHJlcGxhY2VtZW50O1xcbiAgICByZXR1cm4gYXJyLmpvaW4oXFxcIlxcXCIpO1xcbiAgfSxcXG4gIGdldE9iamVjdEtleXNEaWZmOmZ1bmN0aW9uKG9iajEsIG9iajIpIHtcXG4gIGNvbnN0IGRpZmZlcmVudEtleXMgPSBbXTtcXG4gIGZvciAobGV0IGtleSBpbiBvYmoxKSB7XFxuICAgIGlmICghb2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpIHx8IG9iajFba2V5XSAhPT0gb2JqMltrZXldKSB7XFxuICAgICAgZGlmZmVyZW50S2V5cy5wdXNoKGtleSk7XFxuICAgIH1cXG4gIH1cXG4gIGZvciAobGV0IGtleSBpbiBvYmoyKSB7XFxuICAgIGlmICghb2JqMS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XFxuICAgICAgZGlmZmVyZW50S2V5cy5wdXNoKGtleSk7XFxuICAgIH1cXG4gIH1cXG4gIHJldHVybiBkaWZmZXJlbnRLZXlzO1xcbiAgfSxcXG4gIGdldE5leHRVcmw6IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCwgcGFyYW1zKSB7XFxuICAgIHZhciB1MSA9IHRoaXMudXJsUGFyc2Uoc291cmNlKTtcXG4gICAgdmFyIHUyID0gdGhpcy51cmxQYXJzZSh0YXJnZXQpO1xcbiAgICB2YXIgcGEgPSB1bmRlZmluZWQ7XFxuICAgIGlmICh0eXBlb2YgcGFyYW1zID09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgcGEgPSBwYXJhbXMuaGFzT3duUHJvcGVydHkoXFxcIueJueW+gVxcXCIpID8gcGFyYW1zLueJueW+gSA6IHVuZGVmaW5lZDtcXG4gICAgfVxcbiAgICB2YXIgbmV4dHVybCA9IHNvdXJjZTtcXG4gICAgdmFyIGNhID0gT2JqZWN0LmtleXModTIuUGFyYW1zKS5sZW5ndGggPT0gMCA/IFxcXCJcXFwiIDogXFxcIj9cXFwiO1xcbiAgICBpZiAocGEgIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgdmFyIHJzID0gU3RyaW5nKHUyLlBhdGgpLnJlcGxhY2UobmV3IFJlZ0V4cChwYSksIFxcXCIkMWZ5cGFnZVxcXCIpO1xcbiAgICAgIG5leHR1cmwgPSB1Mi5Ib3N0cyArIHJzICsgY2EgKyB0aGlzLlRvUGFyYW1zKHUyLlBhcmFtcyk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgaWYgKHRoaXMuaXNFcXVhbCh1MS5QYXJhbXMsIHUyLlBhcmFtcykpIHtcXG4gICAgICAgIGlmKGR0X2RlYnVnKXtcXG4gICAgICAgIGxvZyh1MS5QYXRoKTtcXG4gICAgICAgIGxvZyh1Mi5QYXRoKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHZhciBkZiA9IHRoaXMuZmluZERpZmZlcmVudEluZGV4KFN0cmluZyh1MS5QYXRoKSwgU3RyaW5nKHUyLlBhdGgpKTtcXG4gICAgICAgIGlmKGR0X2RlYnVnKXtcXG4gICAgICAgIGxvZyhkZik7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoZGYubGVuZ3RoID09IDEpIHtcXG4gICAgICAgICAgdmFyIHJlID0gZGZbMF0uaW5kZXg7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICB2YXIgZiA9IGRmLmZpbHRlcigoeCkgPT4gL1xcXFxkKy8udGVzdCh4LnMyKSk7XFxuICAgICAgICAgIHZhciByZSA9IGZbMF0uaW5kZXg7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgZXEgPSB0aGlzLnJlcGxhY2VDaGFyQXQoU3RyaW5nKHUyLlBhdGgpLCByZSwgXFxcImZ5cGFnZVxcXCIpO1xcbiAgICAgICAgbmV4dHVybCA9IHUyLkhvc3RzICsgZXEgKyBjYSArIHRoaXMuVG9QYXJhbXModTIuUGFyYW1zKTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgdmFyIGVwPXRoaXMuZ2V0T2JqZWN0S2V5c0RpZmYodTEuUGFyYW1zLHUyLlBhcmFtcylcXG4gICAgICAgIGlmKGVwLmxlbmd0aD09MSl7XFxuICAgICAgICAgIHUxLlBhcmFtc1tlcFswXV09J2Z5cGFnZSdcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICBsb2coZXApO1xcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIGVxID0gU3RyaW5nKHUxLlBhdGgpLnJlcGxhY2UoL1xcXFxkKy8sIFxcXCJmeXBhZ2VcXFwiKTtcXG4gICAgICAgIG5leHR1cmwgPSB1MS5Ib3N0cyArIGVxICsgY2EgKyB0aGlzLlRvUGFyYW1zKHUxLlBhcmFtcyk7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIC8vbG9nKCduZXh0OicrbmV4dHVybClcXG4gICAgcmV0dXJuIG5leHR1cmw7XFxuICB9LFxcbn07XFxuXFxuZnVuY3Rpb24gZ2V0VHJ1ZWxpbmsobWFyaywgdXJsLCBwYWdlKSB7XFxuICB2YXIgcCA9IGdldE15VmFyKG1hcmssIHVybCkucmVwbGFjZShcXFwiZnlwYWdlXFxcIiwgcGFnZSk7XFxuICBpZiAocGFnZSA9PSAxKSB7XFxuICAgIHJldHVybiBnZXRNeVZhcihcXFwieWlfZmlyc3RwYWdlXFxcIiwgcCk7XFxuICB9IGVsc2UgaWYgKHAgIT0gXFxcIlxcXCIpIHtcXG4gICAgcmV0dXJuIHA7XFxuICB9IGVsc2Uge1xcbiAgICByZXR1cm4gdXJsO1xcbiAgfVxcbn1cXG4vL+aehOW7ulxcbmZ1bmN0aW9uIGNyZWF0ZU5leHRQYWdlKCkge1xcbiAgbGV0IHN0YXJ0bnVtID0gMTtcXG4gIHZhciBvYmogPSBhcmd1bWVudHNbMF07XFxuICBpZiAodHJ1ZV91cmwgIT0gZ2V0TXlWYXIoXFxcInlpX3BhZ2V1cmxcXFwiLCBcXFwiXFxcIikpIHtcXG4gICAgY2xlYXJNeVZhcihcXFwieWlfcGFnZXVybFxcXCIpO1xcbiAgfVxcbiAgaWYgKHBhZ2UgPT0gc3RhcnRudW0gJiYgZ2V0TXlWYXIoXFxcInlpX3BhZ2V1cmxcXFwiKSA9PSBcXFwiXFxcIikge1xcbiAgICBwdXRNeVZhcihcXFwieWlfZmlyc3RwYWdlXFxcIiwgdHJ1ZV91cmwpO1xcbiAgICB0cnkge1xcbiAgICAgIHZhciBuZXh0ID0gZXZhbCjkuIvkuIDpobUpO1xcbiAgICAgIC8vbG9nKFxcXCJuZXh0XFxcIik7XFxuICAgICAgLy9sb2cobmV4dCk7XFxuICAgIH0gY2F0Y2gge1xcbiAgICAgIGxvZyhcXFwi5Y+v6IO95LiN5a2Y5Zyo5LiL5LiA6aG15oiW6ICF5LiL5LiA6aG15a6a5L2N5pyJ6Zeu6aKYXFxcIik7XFxuICAgICAgbmV4dCA9IFxcXCJcXFwiO1xcbiAgICB9XFxuICAgIGlmIChuZXh0ICE9IFxcXCJcXFwiKSB7XFxuICAgICAgdmFyIG54dXJsID0gZXh0TWV0aG9kLmdldE5leHRVcmwodHJ1ZV91cmwsIG5leHQsIG9iaik7XFxuICAgICAgLy9sb2coXFxcIm54dXJsOlxcXCIgKyBueHVybCk7XFxuICAgICAgcHV0TXlWYXIo54q25oCBLCBueHVybCk7XFxuICAgICAgcHV0TXlWYXIoXFxcInlpX3BhZ2V1cmxcXFwiLCBueHVybCk7XFxuICAgIH1cXG4gIH1cXG59XFxuXFxuZnVuY3Rpb24gYXV0b1BhZ2UoKSB7XFxuICBpZihwYWdlPT0xKXtcXG4gICAgcHV0TXlWYXIoXFxcInlpX2ZpcnN0cGFnZVxcXCIsIHRydWVfdXJsKTtcXG4gICAgfVxcbiAgICB0cnkge1xcbiAgICAgIHZhciBuZXh0ID0gZXZhbCjkuIvkuIDpobUpO1xcbiAgICAgIC8vbG9nKFxcXCJuZXh0XFxcIik7XFxuICAgICAgLy9sb2coJ25leHQ6JytuZXh0KTtcXG4gICAgfSBjYXRjaCB7XFxuICAgICAgbG9nKFxcXCLlj6/og73kuI3lrZjlnKjkuIvkuIDpobXmiJbogIXkuIvkuIDpobXlrprkvY3mnInpl67pophcXFwiKTtcXG4gICAgICBuZXh0ID0gXFxcIlxcXCI7XFxuICAgIH1cXG4gICAgaWYgKG5leHQgIT0gXFxcIlxcXCIpIHtcXG4gICAgICBwdXRNeVZhcijnirbmgIEsIG5leHQpO1xcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6QXCIsXCJwYXRoXCI6XCJsYXp5XCIsXCJydWxlXCI6XCJ2YXIgbGF6eSA9ICQoJycpLmxhenlSdWxlKChNWV9IT01FKSA9PiB7XFxuICAgIHZhciBpbnAgPSBmZXRjaChpbnB1dCx7fSk7XFxuICAgIHZhciBodG1sID0gcGRmaChpbnAsICdzb3VyY2UmJnNyYycpO1xcbiAgICB2YXIgcGljID0gcGRmaChpbnAsICcubWVzc2FnZSYmaW1nLC0xJiZkYXRhLWxhenktc3JjJylcXG4gICAgaWYoaHRtbCl7XFxuICAgICB1cmwgPSBodG1sLm1hdGNoKC9odHRwP1teXFxcXHNdKy8pWzBdXFxuICAgICByZXR1cm4gdXJsXFxuICAgICAgICAgfSBpZihwaWMpIHtcXG4gICAgICAgIHJldHVybiBcXFwicGljczovL1xcXCIrcGRmYShpbnAsICcubWVzc2FnZSYmaW1nJykubWFwKGltZyA9PnBkKGltZywgJ2ltZyYmZGF0YS1sYXp5LXNyYycpK1xcXCJAUmVmZXJlcj1cXFwiLCkuam9pbihcXFwiJiZcXFwiKVxcbiAgICAgfWVsc2V7XFxuICAgICByZXR1cm4gJ3RvYXN0Oi8v5rSX5rSX552h5ZCnJ1xcbiAgICAgICAgfVxcbn0sTVlfSE9NRSlcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuS6jOe6p+mhtemdouWGheWuuVwiLFwicGF0aFwiOlwiZXJcIixcInJ1bGVcIjpcImpzOlxcbnZhciBkID0gW11cXG5ldmFsKEpTT04ucGFyc2UocmVxdWVzdCgnaGlrZXI6Ly9wYWdlL3JlcGFpcicpKS5ydWxlKTtcXG5NWV9VUkw9TVlfVVJMLnJlcGxhY2UoJ2hpa2VyOi8vZW1wdHkjIycsJycpO1xcbnZhciB0ZW1wID0gZ3VhcmQoTVlfVVJMKTtcXG4gICAgaWYodGVtcC5pbmNsdWRlcyhcXFwi5qOA5rWL5LitXFxcIikpe1xcbiAgICAgICAgIE1ZX1VSTCA9IE1ZX0hPTUUgKyB0ZW1wLm1hdGNoKC9ocmVmID1cXFwiKC4qPylcXFwiLylbMV1cXG4gICAgICAgICAgfVxcbnZhciBodG1sID0gZ3VhcmQoTVlfVVJMKTtcXG5sb2coTVlfVVJMKVxcbmV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL2xhenknLCB7fSkpLnJ1bGUpO1xcblxcbnZhciB0aXRsZSA9IHBkZmgoaHRtbCwnaDQmJlRleHQnKTtcXG52YXIgZGVzYyA9IHBkZmgoaHRtbCwnLm1lZGlhLWJvZHkmJi5kYXRlJiZUZXh0JykrXFxcIlxcXFx0XFxcXHRcXFxcdOeCueWHu+WwneivleaSreaUvlxcXCI7XFxuICAgaWYodGl0bGUgIT09bnVsbCl7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxtaWRkbGU+PGZvbnQgY29sb3I9I0ZGQTUwMD4nK3RpdGxlKyc8L2ZvbnQ+PC9taWRkbGU+JyxcXG4gICAgICAgIGRlc2M6IGRlc2MsXFxuICAgICAgICB1cmw6IE1ZX1VSTCxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXG4gICAgICAgIGV4dHJhOiB7bGluZVZpc2libGU6IGZhbHNlfVxcbiAgICB9KVxcbn1cXG5cXG52YXIg6K+G5Yir56CBO1xcbnRyeXtcXG4gIOivhuWIq+eggSA9IHBhcnNlRG9tRm9ySHRtbChodG1sLCAnYm9keSYmLmZhbi1pbmZvJiZhLC0xJiZUZXh0JykucmVwbGFjZSgn6K+G5Yir56CBOiAnLCcnKTtcXG4gICAgICAgICAgIH1jYXRjaChlcnIpe31cXG5cXG52YXIgaW1nID0gcGQoaHRtbCwnLm1lc3NhZ2UmJmltZyYmc3JjfHxkYXRhLWxhenktc3JjJyk7XFxuICAgIGlmKGltZyAhPT1udWxsKXtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgIGltZzogaW1nLFxcbiAgICAgICAgICAgICB1cmw6IE1ZX1VSTCArIGxhenksXFxuICAgICAgICAgICAgIGNvbF90eXBlOiAncGljXzFfZnVsbCcsXFxuICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgfVxcblxcbnRyeXtcXG52YXIgayA9IHBkZmgoaHRtbCwnLnBnJiZhLC0yJiZUZXh0JykucmVwbGFjZSgvXFxcXC4vZywnJyk7XFxubG9nKHR5cGVvZihrKSlcXG5mb3IgKHZhciBqID0gMTsgaiA8PSBrIDsgaisrKXtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn56ysJyArIGogKyfpobUnLFxcbiAgICAgICAgdXJsOiBNWV9VUkwgKyAnP3RwYWdlPScgKyBqICsgbGF6eSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF81JyxcXG59KVxcbn19Y2F0Y2goZXJyKXtcXG4gICAgLy9jb25zb2xlLmxvZygn5Y+q5pyJ5LiA6aG1LOWHkeWQiOeci+WQpycsIGVycik7XFxufVxcblxcblxcblxcbiB2YXIgZmggPSBwZGZoKGh0bWwsJy5mYW4taW5mbyYmVGV4dCcpO1xcbiAgICBpZihmaCl7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08bWlkZGxlPjxmb250IGNvbG9yPWN5YW4+JytmaCsnPC9mb250PjwvbWlkZGxlPicsXFxuICAgIHVybDogJ2hpa2VyOi8vc2VhcmNoP3J1bGU9JyArIE1ZX1JVTEUudGl0bGUgKyAnJnM9JytwZGZoKGh0bWwsICcuZmFuLWluZm8mJmEmJlRleHQnKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxcbiAgICAgICBleHRyYToge2xpbmVWaXNpYmxlOiBmYWxzZX1cXG59KTtcXG59XFxuXFxuaWYo6K+G5Yir56CBKXtcXG5ldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS90b29sJywge30pKS5ydWxlKTtcXG59XFxuLy/pooTop4jlm75cXG50cnl7XFxuICAgIHZhciBsaXN0ID0gcGRmYShodG1sLFxcXCIueXVsYW50dSYmaW1nLDA6OVxcXCIpXFxuaWYobGlzdC5sZW5ndGg+MCl7XFxuICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPG1pZGRsZT48Zm9udCBjb2xvcj0jZmY2ODc3Puagt+WTgeWbvuWDjzwvZm9udD48L21pZGRsZT4nLFxcbiAgICAgICAgdXJsOiBNWV9VUkwgKyAkKCcnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QoaW5wdXQpXFxuICAgICAgICAgICAgICAgICAgICB2YXIgcGljcyA9IHBkZmEoaHRtbCxcXFwiLnl1bGFudHUmJmltZ1xcXCIpLm1hcChpdGVtPT5wZChpdGVtLFxcXCJpbWcmJnNyY1xcXCIpKVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJwaWNzOi8vXFxcIitwaWNzLmpvaW4oXFxcIiYmXFxcIilcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxuICAgICAgICBleHRyYToge2xpbmVWaXNpYmxlOiBmYWxzZX1cXG4gICAgfSlcXG59XFxubGlzdC5mb3JFYWNoKGl0ZW09PntcXG4gICAgIGQucHVzaCh7XFxuICAgICAgICAgaW1nOiBwZChpdGVtLFxcXCJpbWcmJnNyY1xcXCIpLFxcbiAgICAgICAgIHVybDogcGQoaXRlbSxcXFwiaW1nJiZzcmNcXFwiKSxcXG4gICAgICAgICBjb2xfdHlwZTogXFxcInBpY18zX3NxdWFyZVxcXCJcXG4gICAgICAgIH0pXFxuICAgICAgIH0pXFxuICAgICB9Y2F0Y2h7fVxcblxcbi8v56OB5YqbXFxudmFyIGNpbGkgPSBwZGZhKGh0bWwsICcuY2lsaWxpYW4mJmJsb2NrcXVvdGUnKTtcXG52YXIgY2wgPSBwZGZhKGh0bWwsICcuY2lsaWxpYW4mJnNjcmlwdDpub3QoW2RhdGEtY2Zhc3luY10pJyk7XFxuaWYoY2wubGVuZ3RoPjApe1xcbmZvciAodmFyIGkgPSAwOyBpIDwgTWF0aC5taW4oY2lsaS5sZW5ndGgsIGNsLmxlbmd0aCk7IGkrKykge1xcbiB2YXIgdGl0bGUgPSAn4oCc4oCc4oCd4oCdPG1pZGRsZT48Zm9udCBjb2xvcj15ZWxsb3c+JytwZGZoKGNpbGlbaV0sJ2Jsb2NrcXVvdGUtLWEmJlRleHQnKSsnPC9mb250PjwvbWlkZGxlPicrJ+KAnOKAnOKAneKAnTxtaWRkbGU+PGZvbnQgY29sb3I9IzAwOTlGRj4nK3BkZmgoY2lsaVtpXSwnYSYmVGV4dCcpLnJlcGxhY2UoXFxcIltlbWFpbCBwcm90ZWN0ZWRdXFxcIixcXFwiXFxcIikrJzwvZm9udD48L21pZGRsZT4nO1xcbiB2YXIgY2wwID0gcGRmaChjbFtpXSwnc2NyaXB0JiZIdG1sJykuc3BsaXQoXFxcInJldXJsKCdcXFwiKVsxXS5zcGxpdChcXFwiJylcXFwiKVswXTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogdGl0bGUsXFxuICAgIHVybDogJ21hZ25ldDo/eHQ9dXJuOmJ0aWg6JytyZXVybChjbDApLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICAgICBleHRyYToge2xpbmVWaXNpYmxlOiBmYWxzZX1cXG59KTtcXG59fWVsc2V7XFxuZm9yICh2YXIgaiBpbiBjaWxpKSB7XFxuIHZhciB0aXRsZSA9IHBkZmgoY2lsaVtqXSwnYmxvY2txdW90ZSYmVGV4dCcpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPG1pZGRsZT48Zm9udCBjb2xvcj15ZWxsb3c+Jyt0aXRsZSsnPC9mb250PjwvbWlkZGxlPicsXFxuICAgIHVybDogcGRmaChjaWxpW2pdLCdhJiZUZXh0JyksXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxuICAgICAgIGV4dHJhOiB7bGluZVZpc2libGU6IGZhbHNlfVxcbn0pO1xcbn1cXG59XFxuXFxuXFxuXFxuLypcXG52YXIgeGlhb3NodW8gPSBKU09OLnBhcnNlKHBkZmgoaHRtbCwnLm1lc3NhZ2UmJnNjcmlwdCYmSHRtbCcpLm1hdGNoKC9cXFxcWy4qP1xcXFxdL2cpWzFdKTtcXG54aWFvc2h1by5mb3JFYWNoKHggPT57XFxuICAgIGQucHVzaCh7XFxuICAgICAgIHRpdGxlOiB4Lm5hbWUsXFxuICAgICAgIGRlc2M6IHguYXJ0aXN0LFxcbiAgICAgICBpbWc6IE1ZX0hPTUUgKyB4LmNvdmVyLFxcbiAgICAgICB1cmw6IE1ZX0hPTUUgKyB4LnVybCxcXG4gICAgICAgY29sX3R5cGU6ICdhdmF0YXInXFxuICAgICAgIH0pXFxuICAgfSkqL1xcblxcbnRyeXtcXG52YXIgdXJscyA9IGh0bWwubWF0Y2goL1xcXFwvbXAzXFxcXC8uKj9cXFxcLm1wMy9nKTtcXG51cmxzID0gdXJscy5tYXAoZnVuY3Rpb24odXJsKSB7XFxuICByZXR1cm4gTVlfSE9NRSArIHVybDtcXG59KTtcXG52YXIgbmFtZXMgPSBodG1sLm1hdGNoKC/nrKwuKj/pm4YvZyk7ICAgXFxuICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTWF0aC5taW4odXJscy5sZW5ndGgsIG5hbWVzLmxlbmd0aCk7IGkrKykge1xcbiAgZC5wdXNoKHtcXG4gICAgdXJsOiB1cmxzW2ldLFxcbiAgICB0aXRsZTogbmFtZXNbaV0sXFxuICAgIGRlc2M6ICfmnInlo7DlsI/or7QnLFxcbiAgICBpbWc6IE1ZX0hPTUUgKyAnL2ltZy9wbGF5MS5wbmcnLFxcbiAgICBjb2xfdHlwZTogJ2F2YXRhcidcXG4gIH0pO1xcbn19Y2F0Y2ggKGVycikge1xcbiAgLy9jb25zb2xlLmxvZygn5q2k6aG16Z2i5rKh5pyJ5pyJ5aOw5bCP6K+0JywgZXJyKTtcXG59O1xcblxcblxcbnZhciBjb250ZW50ID0gcGFyc2VEb21Gb3JIdG1sKGh0bWwsIFxcXCIubWVzc2FnZSYmLmh0eHQmJkh0bWxcXFwiKTtcXG5pZihjb250ZW50KXtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogY29udGVudCxcXG4gICAgZGVzYzogJycsXFxuICAgIHBpY191cmw6ICcnLFxcbiAgICB1cmw6ICcnLFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCdcXG59KTtcXG59XFxuICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPG1pZGRsZT48Zm9udCBjb2xvcj0jQTAyMEYwPuebuOWFs+i1hOa6kOaOqOiNkDwvZm9udD48L21pZGRsZT4nLFxcbiAgICAgICAgdXJsOiBcXFwiY29weTovL1xcXCIgKyDor4bliKvnoIEsXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxuICAgICAgICAgZXh0cmE6IHtsaW5lVmlzaWJsZTogZmFsc2V9XFxuICAgIH0pO1xcblxcbmxldCB0aiA9IHBkZmEoaHRtbCwgJ2JvZHkmJi5wbHVnaW5fbGlzdCcpO1xcbnRqLmZvckVhY2goeCA9PiB7ICAgXFxuIGQucHVzaCh7XFxuICAgIHRpdGxlOiBwZGZoKHgsICdhJiZ0aXRsZScpLFxcbiAgICBkZXNjOiBwZGZoKHgsJy5kYXRlJiZUZXh0JyksXFxuICAgIGltZzogcGQoeCwnaW1nJiZzcmMnKSxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2VyP3VybD1cXFwiK3BkKHgsICdhJiZocmVmJyksXFxuICAgIGNvbF90eXBlOiAnbW92aWVfMicsXFxuICAgICAgZXh0cmE6e1xcbiAgICAgICAgIHBhZ2VUaXRsZTogcGRmaCh4LCAnYSYmdGl0bGUnKSxcXG4gICAgICAgICB9XFxuXFxuICB9KTtcXG59KVxcblxcblxcbnNldFJlc3VsdChkKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5LqM57qn5aSW6YOo5pCc57SiXCIsXCJwYXRoXCI6XCJ0b29sXCIsXCJydWxlXCI6XCIvL3ZhciB0aXRsZSA9IHBhcnNlRG9tRm9ySHRtbChodG1sLCDmkJzntKLmoIfnrb4pO1xcbi8vdmFyIHRpdGxlID0gTVlfUEFSQU1TLnRpdGxlO1xcbi8vbG9nKHRpdGxlKVxcblxcbi8vVGhpc3NBVlxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFwiI0ZGMDAwMFxcXCI+IFRoaXNBVjwvZm9udD48L21pZGRsZT4nLFxcbiAgICBwaWNfdXJsOiAnaHR0cHM6Ly9jZG40Lmljb25maW5kZXIuY29tL2RhdGEvaWNvbnMvbG9nb3MtYW5kLWJyYW5kcy81MTIvMjMyX05pbnRlbmRvX1N3aXRjaF9sb2dvLTEyOC5wbmcnLFxcbiAgICB1cmw6ICQoJycpLmxhenlSdWxlKCjor4bliKvnoIEpID0+IHtcXG4gICAgICAgICAgICAgICAgIHZhciBhdiA9IFxcXCJodHRwczovL3RoaXNhdi5jb20vY24vXFxcIiArIOivhuWIq+eggTsgXFxuLy9sb2coYXYpXFxuICAgICAgICAgICAgICB0cnl7XFxuICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGZldGNoKGF2LCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMCknXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgfSx0aW1lb3V0OjUwMDBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgIGV2YWwoaHRtbC5tYXRjaCgvZXZhbC4qP1xcXFxuLylbMF0pXFxuICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bnlLvotKjliJfooajvvIzlubbljrvmnIDpq5jnlLvotKhcXG4gICAgICAgICAgICAgICAgICAgIGxldCBncm91cF9xdWFsaXR5ID0gZmV0Y2goc291cmNlLHtoZWFkZXJzOntcXFwib3JpZ2luXFxcIjpcXFwiaHR0cHM6Ly90aGlzYXYuY29tXFxcIn19KVxcbiAgICAgICAgICAgICAgICAgICAgaGdoZXN0X3F1YWxpdHkgPSBncm91cF9xdWFsaXR5Lm1hdGNoKC9eKC4qKVxcXFwubTN1OCQvZ20pXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLnJlcGxhY2UoXFxcInBsYXlsaXN0Lm0zdThcXFwiLCBoZ2hlc3RfcXVhbGl0eVtoZ2hlc3RfcXVhbGl0eS5sZW5ndGgtMV0pICsgJzt7T3JpZ2luQGh0dHBzOi8vdGhpc2F2LmNvbX0nICAgICAgICAgXFxuICAgICAgICAgICAgICAgICB9Y2F0Y2h7cmV0dXJuIFxcXCJ0b2FzdDovL+aMguair+aIluayoeacieatpOW9seeJh1xcXCJ9XFxuICAgICAgICAgICAgICAgICAgfSzor4bliKvnoIEpLFxcbiAgICBjb2xfdHlwZTogJ2ljb25fNScsXFxuICAgIGV4dHJhOiB7IGxvbmdDbGljazogW3t0aXRsZTogJ+afpeeci+e9keWdgCcsIGpzOiAkLnRvU3RyaW5nKCjor4bliKvnoIEpPT57IHJldHVybiBcXFwiaHR0cHM6Ly90aGlzYXYuY29tL2NuL1xcXCIgKyDor4bliKvnoIE7fSzor4bliKvnoIEpfV0gfVxcbn0pO1xcblxcbi8vTUlTU0FWXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJjigJjigJnigJk8Yj48bWlkZGxlPjxmb250IGNvbG9yPVxcXCIjMDBGRjAwXFxcIj4gTUlTU0FWPC9mb250PjwvbWlkZGxlPicsXFxuICAgIHBpY191cmw6ICdodHRwczovL2NkbjEuaWNvbmZpbmRlci5jb20vZGF0YS9pY29ucy9mcnVpdHMtbi12ZWdldGFibGVzLWNvbG9yZWQtZ3JhZGllbnQvMTI4L2NhdWxpZmxvd2VyLTEyOC5wbmcnLFxcbiAgICB1cmw6ICQoJycpLmxhenlSdWxlKCjor4bliKvnoIEpID0+IHtcXG4gICAgICAgdHJ5e1xcbiAgICAgICAgICAgICB2YXIgYXYgPSBcXFwiaHR0cHM6Ly9taXNzYXYudG8vc2VhcmNoL21vdmllL1xcXCIgKyDor4bliKvnoIE7ICBcXG4gICAgICAgICAgICAgdmFyIHVybHMgPSBbXTsgICAgXFxuICAgICAgICAgICAgIHZhciBsaXN0ID0gcGRmYShmZXRjaChhdix7dGltZW91dDo1MDAwfSksXFxcIi52aWRlb3MtbGlzdCYmYXJ0aWNsZVxcXCIpO1xcbiAgICAgICAgICAgIGZvcih2YXIgaiBpbiBsaXN0KXtcXG4gICAgICAgICAgICAgIHVybHMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHBkZmgobGlzdFtqXSxcXFwiYSYmaHJlZlxcXCIpXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdmFyIHBsYXlzID0gYmYodXJscykubWFwKGg9PmgubWF0Y2goL3NyYz1cXFwiKC4qPylcXFwiLylbMV0uc3BsaXQoXFxcIiZcXFwiKVswXS5yZXBsYWNlKFxcXCI/aWQ9XFxcIixcXFwiaGxzL1xcXCIpICsgXFxcIi5tM3U4XFxcIikgICBcXG4gICAgICAgICAgICAgcmV0dXJuIHt1cmxzOnBsYXlzfVxcbiAgICAgICB9Y2F0Y2h7XFxuICAgICAgICAgdHJ5e1xcbiAgICAgICAgICAgICB2YXIgYXYgPSBcXFwiaHR0cHM6Ly9taXNzYXYudG8vc2VhcmNoL21vdmllL1xcXCIgKyDor4bliKvnoIEucmVwbGFjZSgvXFxcXC18XFxcXF8vLFxcXCIlMjBcXFwiKTsgIFxcbiAgICAgICAgICAgICB2YXIgdXJscyA9IFtdOyAgICBcXG4gICAgICAgICAgICAgdmFyIGxpc3QgPSBwZGZhKGZldGNoKGF2LHt0aW1lb3V0OjUwMDB9KSxcXFwiLnZpZGVvcy1saXN0JiZhcnRpY2xlXFxcIik7XFxuICAgICAgICAgICAgZm9yKHZhciBqIGluIGxpc3Qpe1xcbiAgICAgICAgICAgICAgdXJscy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgIHVybDogcGRmaChsaXN0W2pdLFxcXCJhJiZocmVmXFxcIilcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB2YXIgcGxheXMgPSBiZih1cmxzKS5tYXAoaD0+aC5tYXRjaCgvc3JjPVxcXCIoLio/KVxcXCIvKVsxXS5zcGxpdChcXFwiJlxcXCIpWzBdLnJlcGxhY2UoXFxcIj9pZD1cXFwiLFxcXCJobHMvXFxcIikgKyBcXFwiLm0zdThcXFwiKSAgIFxcbiAgICAgICAgICAgICByZXR1cm4ge3VybHM6cGxheXN9XFxuICAgICAgICAgIH1jYXRjaHtyZXR1cm4gXFxcInRvYXN0Oi8v5rKh5pyJ5q2k5b2x54mHXFxcIn1cXG4gICAgICAgfSAgIFxcbiAgICAgICAgICAgICAgICAgIH0s6K+G5Yir56CBKSxcXG4gICAgY29sX3R5cGU6ICdpY29uXzUnLFxcbiAgICBleHRyYTogeyBsb25nQ2xpY2s6IFt7dGl0bGU6ICfmn6XnnIvnvZHlnYAnLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyByZXR1cm4gXFxcImh0dHBzOi8vbWlzc2F2LnRvL3NlYXJjaC9tb3ZpZS9cXFwiICsg6K+G5Yir56CBfSzor4bliKvnoIEpfV0gfVxcbn0pO1xcblxcbi8vbmphdlxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFwiIzFFOTBGRlxcXCI+IG5KYXYudHY8L2ZvbnQ+PC9taWRkbGU+JyxcXG4gICAgcGljX3VybDogJ2h0dHBzOi8vY2RuMi5pY29uZmluZGVyLmNvbS9kYXRhL2ljb25zL3NvY2lhbC1pY29ucy0zMy8xMjgvRmFjZWJvb2tfTWVzc2VuZ2VyLTEyOC5wbmcnLFxcbiAgICB1cmw6ICQoJycpLmxhenlSdWxlKCjor4bliKvnoIEpID0+IHtcXG4gICAgICAgICAgICAgICAgIHZhciBhdiA9IFxcXCJodHRwczovL25qYXYudHYvemgvdi9cXFwiICsg6K+G5Yir56CBOyBcXG4vL2xvZyhhdilcXG4gICAgICAgICAgICAgICAgIHZhciBodG1sID0gZmV0Y2goYXYse3RpbWVvdXQ6NTAwMH0pXFxuICAgICAgICAgICAgICAgICBpZighaHRtbCB8fCBodG1sLmluY2x1ZGVzKFxcXCLor7fmo4Dmn6XlnLDlnYDmoI/kuK3nmoTnvZHlnYBcXFwiKSl7ICAgICAgICAgXFxuICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oyC5qKv5oiW5rKh5pyJ5q2k5b2x54mHXFxcIlxcbiAgICAgICAgICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgIHJldHVybiBcXFwidmlkZW86Ly9cXFwiICsgYXY7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgfSzor4bliKvnoIEpLFxcbiAgICBjb2xfdHlwZTogJ2ljb25fNScsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIHZpZGVvRXhjbHVkZVJ1bGVzOiBbJzI0MCddLFxcbiAgICAgICAgICAgICAgICBibG9ja1J1bGVzOiBbJyouZG9wcGlvY2RuLionXSxcXG4gICAgICAgICAgICAgICAgYmxvY2tSdWxlczogWydkbW0uY28uanAnXSxcXG4gICAgICAgICAgICAgICAgLy92aWRlb1J1bGVzOiBbJyptM3U4KiddLFxcbiAgICAgICAgICAgICAgICBjYWNoZU0zdTg6IHRydWUsXFxuICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe3RpdGxlOiAn5p+l55yL572R5Z2AJywganM6ICQudG9TdHJpbmcoKOivhuWIq+eggSk9PnsgcmV0dXJuIFxcXCJodHRwczovL25qYXYudHYvemgvdi9cXFwiICsg6K+G5Yir56CBO30s6K+G5Yir56CBKX1dXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbn0pO1xcblxcbi8vYXYwMVxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFwiIzc1MTI3QVxcXCI+IEFWMDE8L2ZvbnQ+PC9taWRkbGU+JyxcXG4gICAgcGljX3VybDogJ2h0dHBzOi8vY2RuMi5pY29uZmluZGVyLmNvbS9kYXRhL2ljb25zL293bC0xMC81MDAvbmltNTMyXzExX3B1cnBsZV9vd2xfa2lkX2JpcnRoZGF5X2ZhY2VfZXllLTEyOC5wbmcnLFxcbiAgICB1cmw6ICQoJycpLmxhenlSdWxlKCjor4bliKvnoIEpID0+IHtcXG4gICAgICAgICAgICAgICAgIHZhciBhdiA9IFxcXCJodHRwczovL3d3dy5hdjAxLnR2L1xcXCIgKyDor4bliKvnoIE7IFxcbi8vbG9nKGF2KVxcbiAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBmZXRjaChhdix7dGltZW91dDo1MDAwfSlcXG4gICAgICAgICAgICAgICAgIHZhciBjb2RlID0gcGRmaChodG1sLCcjcGx5cl92aWRlbyYmcG9zdGVyJylcXG5sb2coY29kZSlcXG4gICAgICAgICAgICAgICAgIGlmKCFjb2RlKXsgICAgICAgICBcXG4gICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mjILmoq/miJbmsqHmnInmraTlvbHniYdcXFwiXFxuICAgICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ2aWRlbzovL1xcXCIgKyBhdjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICB9LOivhuWIq+eggSksXFxuICAgIGNvbF90eXBlOiAnaWNvbl81JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgdmlkZW9FeGNsdWRlUnVsZXM6IFsnZG9wcGlvY2RuJ10sXFxuICAgICAgICAgICAgICAgIHZpZGVvRXhjbHVkZVJ1bGVzOiBbJzI0MCddLFxcbiAgICAgICAgICAgICAgICB2aWRlb0V4Y2x1ZGVSdWxlczogWyc0ODAnXSxcXG4gICAgICAgICAgICAgICAgYmxvY2tSdWxlczogWycuZG9wcGlvY2RuLiddLFxcbiAgICAgICAgICAgICAgICBibG9ja1J1bGVzOiBbJ2RtbS5jby5qcCddLFxcbiAgICAgICAgICAgICAgICAvL3ZpZGVvUnVsZXM6IFsnKm0zdTgqJ10sXFxuICAgICAgICAgICAgICAgIGNhY2hlTTN1ODogdHJ1ZSxcXG4gICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7dGl0bGU6ICfmn6XnnIvnvZHlnYAnLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyByZXR1cm4gXFxcImh0dHBzOi8vd3d3LmF2MDEudHYvXFxcIiArIOivhuWIq+eggTt9LOivhuWIq+eggSl9XVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG59KTtcXG5cXG4vL0phYmxlXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJjigJjigJnigJk8Yj48bWlkZGxlPjxmb250IGNvbG9yPVxcXCIjRkY4QzAwXFxcIj4gSmFibGU8L2ZvbnQ+PC9taWRkbGU+JyxcXG4gICAgcGljX3VybDogJ2h0dHBzOi8vY2RuMy5pY29uZmluZGVyLmNvbS9kYXRhL2ljb25zL2NhdC1wb3dlci1wcmVtaXVtLzEyMC9jYXRfZm9vZGxvdmUtMTI4LnBuZycsXFxuICAgIHVybDogJCgnJykubGF6eVJ1bGUoKOivhuWIq+eggSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgdmFyIGF2ID0gXFxcImh0dHBzOi8vamFibGUudHYvdmlkZW9zL1xcXCIgKyDor4bliKvnoIEgKyBcXFwiL1xcXCI7IFxcbi8vbG9nKGF2KVxcbiAgICAgICAgICAgICAgICAvLyByZXF1ZXN0KFxcXCJodHRwczovL2phYmxlLnR2L1xcXCIpXFxuICAgICAgICAgICAgICB0cnl7XFxuICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGZldGNoKGF2LHt0aW1lb3V0OjUwMDB9KVxcbiAgICAgICAgICAgICAgICAgdmFyIHVybCA9IGh0bWwubWF0Y2goL2h0dHBzPzpcXFxcL1xcXFwvXFxcXFMrP1xcXFwubTN1OC8pWzBdXFxuICAgICAgICAgICAgICAgICByZXR1cm4gdXJsXFxuICAgICAgICAgICAgICAgICB9Y2F0Y2h7cmV0dXJuIFxcXCJ0b2FzdDovL+ayoeacieaMguair+WtkOaIluayoeacieatpOW9seeJh1xcXCJ9XFxuICAgICAgICAgICAgICAgICAgfSzor4bliKvnoIEpLFxcbiAgICBjb2xfdHlwZTogJ2ljb25fNScsXFxuICAgIGV4dHJhOiB7IGxvbmdDbGljazogW3t0aXRsZTogJ+afpeeci+e9keWdgCcsIGpzOiAkLnRvU3RyaW5nKCjor4bliKvnoIEpPT57IHJldHVybiBcXFwiaHR0cHM6Ly9qYWJsZS50di92aWRlb3MvXFxcIiArIOivhuWIq+eggSArIFxcXCIvXFxcIjt9LOivhuWIq+eggSl9XSB9XFxufSk7XFxuXFxuLy9UaGlzc0FW56C06KejXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJjigJjigJnigJk8Yj48bWlkZGxlPjxmb250IGNvbG9yPVxcXCIjRkVGRTAwXFxcIj7nhKHnorznoLTop6M8L2ZvbnQ+PC9taWRkbGU+JyxcXG4gICAgcGljX3VybDogJ2h0dHBzOi8vY2RuNC5pY29uZmluZGVyLmNvbS9kYXRhL2ljb25zL3NvY2lhbC1tZWRpYS1mbGF0LTcvNjQvU29jaWFsLW1lZGlhX1NuYXBjaGF0LTEyOC5wbmcnLFxcbiAgICB1cmw6ICQoJycpLmxhenlSdWxlKCjor4bliKvnoIEpID0+IHtcXG4gICAgICAgICAgICAgICAgIHZhciBhdiA9IFxcXCJodHRwczovL3RoaXNhdi5jb20vY24vXFxcIiArIOivhuWIq+eggSArIFxcXCItdW5jZW5zb3JlZC1sZWFrXFxcIjsgXFxuLy9sb2coYXYpXFxuICAgICAgICAgICAgICB0cnl7XFxuICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGZldGNoKGF2LCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMCknXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgfSx0aW1lb3V0OjUwMDBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgIGV2YWwoaHRtbC5tYXRjaCgvZXZhbC4qP1xcXFxuLylbMF0pXFxuICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bnlLvotKjliJfooajvvIzlubbljrvmnIDpq5jnlLvotKhcXG4gICAgICAgICAgICAgICAgICAgIGxldCBncm91cF9xdWFsaXR5ID0gZmV0Y2goc291cmNlLHtoZWFkZXJzOntcXFwib3JpZ2luXFxcIjpcXFwiaHR0cHM6Ly90aGlzYXYuY29tXFxcIn19KVxcbiAgICAgICAgICAgICAgICAgICAgaGdoZXN0X3F1YWxpdHkgPSBncm91cF9xdWFsaXR5Lm1hdGNoKC9eKC4qKVxcXFwubTN1OCQvZ20pXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLnJlcGxhY2UoXFxcInBsYXlsaXN0Lm0zdThcXFwiLCBoZ2hlc3RfcXVhbGl0eVtoZ2hlc3RfcXVhbGl0eS5sZW5ndGgtMV0pICsgJzt7T3JpZ2luQGh0dHBzOi8vdGhpc2F2LmNvbX0nICAgICAgICAgXFxuICAgICAgICAgICAgICAgICB9Y2F0Y2h7cmV0dXJuIFxcXCJ0b2FzdDovL+aMguair+aIluayoeacieatpOW9seeJh1xcXCJ9XFxuICAgICAgICAgICAgICAgICAgfSzor4bliKvnoIEpLFxcbiAgICBjb2xfdHlwZTogJ2ljb25fNScsXFxuICAgIGV4dHJhOiB7IGxvbmdDbGljazogW3t0aXRsZTogJ+afpeeci+e9keWdgCcsIGpzOiAkLnRvU3RyaW5nKCjor4bliKvnoIEpPT57IHJldHVybiBcXFwiaHR0cHM6Ly90aGlzYXYuY29tL2NuL1xcXCIgKyDor4bliKvnoIEgKyBcXFwiLXVuY2Vuc29yZWQtbGVha1xcXCI7fSzor4bliKvnoIEpfV0gfVxcbn0pO1xcblxcbi8vbmphduegtOino1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFwiIzFFOTBGRlxcXCI+IG5KYXbnoLTop6M8L2ZvbnQ+PC9taWRkbGU+JyxcXG4gICAgcGljX3VybDogJ2h0dHBzOi8vY2RuMC5pY29uZmluZGVyLmNvbS9kYXRhL2ljb25zL0N1dGVNb25zdGVyc1BORy8xMjgvYmx1ZV9tb25zdGVyLnBuZycsXFxuICAgIHVybDogJCgnJykubGF6eVJ1bGUoKOivhuWIq+eggSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgdmFyIGF2ID0gXFxcImh0dHBzOi8vbmphdi50di96aC92L1xcXCIgKyDor4bliKvnoIEgKyBcXFwiLXVuY2Vuc29yZWQtbGVha2VkXFxcIjsgXFxuLy9sb2coYXYpXFxuICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGZldGNoKGF2LHt0aW1lb3V0OjUwMDB9KVxcbiAgICAgICAgICAgICAgICAgaWYoIWh0bWwgfHwgaHRtbC5pbmNsdWRlcyhcXFwi6K+35qOA5p+l5Zyw5Z2A5qCP5Lit55qE572R5Z2AXFxcIikpeyAgICAgICAgIFxcbiAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aMguair+aIluayoeacieatpOW9seeJh1xcXCJcXG4gICAgICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInZpZGVvOi8vXFxcIiArIGF2O1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgIH0s6K+G5Yir56CBKSxcXG4gICAgY29sX3R5cGU6ICdpY29uXzUnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICB2aWRlb0V4Y2x1ZGVSdWxlczogWycyNDAnXSxcXG4gICAgICAgICAgICAgICAgYmxvY2tSdWxlczogWycqLmRvcHBpb2Nkbi4qJ10sXFxuICAgICAgICAgICAgICAgIGJsb2NrUnVsZXM6IFsnZG1tLmNvLmpwJ10sXFxuICAgICAgICAgICAgICAgIC8vdmlkZW9SdWxlczogWycqbTN1OConXSxcXG4gICAgICAgICAgICAgICAgY2FjaGVNM3U4OiB0cnVlLFxcbiAgICAgICAgICAgICAgIGxvbmdDbGljazogW3t0aXRsZTogJ+afpeeci+e9keWdgCcsIGpzOiAkLnRvU3RyaW5nKCjor4bliKvnoIEpPT57IHJldHVybiBcXFwiaHR0cHM6Ly9uamF2LnR2L3poL3YvXFxcIiArIOivhuWIq+eggSArIFxcXCItdW5jZW5zb3JlZC1sZWFrZWRcXFwiO30s6K+G5Yir56CBKX1dXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbn0pO1xcblxcbi8vU3VwamF2XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJjigJjigJnigJk8Yj48bWlkZGxlPjxmb250IGNvbG9yPVxcXCIjQTMyOTg2XFxcIj5TdXBqYXY8L2ZvbnQ+PC9taWRkbGU+JyxcXG4gICAgcGljX3VybDogJ2h0dHBzOi8vY2RuMy5pY29uZmluZGVyLmNvbS9kYXRhL2ljb25zL2xvZ29zLWJyYW5kcy0zLzI0L2xvZ29fYnJhbmRfYnJhbmRzX2xvZ29zX3NrcmlsbC0xMjgucG5nJyxcXG4gICAgdXJsOiBcXFwieDU6Ly9odHRwczovL3N1cGphdi5jb20vemgvP3M9XFxcIiArIOivhuWIq+eggSxcXG4gICAgY29sX3R5cGU6ICdpY29uXzUnLFxcbiAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOmZhbHNlLFxcbiAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7dGl0bGU6ICflj6zllKTpm6jop4EnLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyBcXG4vKlxcbm9wZW5BcHBJbnRlbnQoJ2NvbS55dWppYW4uUmVzaWRlTWVudURlbW8nLCAnY24ueXVqaWFuLk1haW5BY3Rpdml0eScsIHtpbnRlbnREYXRhOiAnaHR0cHM6Ly9zdXBqYXYuY29tL3poLz9zPScgKyDor4bliKvnoIF9KVxcbiovXFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ5amJyb3dzZXI6Ly9zZWFyY2g/cT1odHRwczovL3N1cGphdi5jb20vemgvP3M9XFxcIiArIOivhuWIq+eggVxcbiAgICAgICAgICAgICAgICAgICAgICAgfSzor4bliKvnoIEpfSx7dGl0bGU6ICfmn6XnnIvnvZHlnYAnLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyBcXG4gICAgICAgIHJldHVybiBcXFwiaHR0cHM6Ly9zdXBqYXYuY29tL3poLz9zPVxcXCIgKyDor4bliKvnoIFcXG4gICAgICAgICAgICAgICAgICAgICAgIH0s6K+G5Yir56CBKX1dXFxuICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICB9KTtcXG5cXG4vL+iBmuaQnFxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFwiIzY3RTBGQVxcXCI+6IGa5pCcIOKAoiBSPC9mb250PjwvbWlkZGxlPicsXFxuICAgIHBpY191cmw6ICdodHRwczovL2NkbjQuaWNvbmZpbmRlci5jb20vZGF0YS9pY29ucy9lc3NlbnRpYWxzLTcyLzI0LzAwMl8tX1NlYXJjaC0xMjgucG5nJyxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiICsg6K+G5Yir56CBICsgXFxcIiZydWxlPeWlveeci+inhumikSZzaW1wbGU9ZmFsc2VcXFwiLFxcbiAgICBjb2xfdHlwZTogJ2ljb25fNScsXFxuICAgIGV4dHJhOiB7ICAgICAgICAgICAgICAgXFxuICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe3RpdGxlOiAnSmF2Lkd1cnUnLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyByZXR1cm4gXFxcImh0dHBzOi8vamF2Lmd1cnUvP3M9XFxcIiArIOivhuWIq+eggTt9LOivhuWIq+eggSl9LHt0aXRsZTogJ0phdkJhbmdlcnMnLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyByZXR1cm4gXFxcImh0dHBzOi8vd3d3LmphdmJhbmdlcnMuY29tL3NlYXJjaC9cXFwiICsg6K+G5Yir56CBICsnLyc7fSzor4bliKvnoIEpfSx7dGl0bGU6ICflpI3liLbor4bliKvnoIEnLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsg6K+G5Yir56CBO30s6K+G5Yir56CBKX1dXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbn0pO1xcblxcblxcbi8v56OB5Yqb5ZCbLueugFxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFwiI0VGNDgyM1xcXCI+56OB5Yqb5ZCbLueugDwvZm9udD48L21pZGRsZT4nLFxcbiAgICBwaWNfdXJsOiAnaHR0cHM6Ly9jZG40Lmljb25maW5kZXIuY29tL2RhdGEvaWNvbnMvc2hvcHBpbmctZG9vZGxlLzUxMi9TaG9wcGluZy0zMS0xMjgucG5nJyxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3NvdT9ydWxlPeejgeWKm+WQmy7nroAmcD1meXBhZ2Umc2VhcmNoVGVybXM9XFxcIiArIOivhuWIq+eggSxcXG4gICAgY29sX3R5cGU6ICdpY29uXzUnLFxcbiAgICBleHRyYTogeyAgICAgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgIGxvbmdDbGljazogW3t0aXRsZTogJ+iwt+atjOaQnOe0oicsIGpzOiAkLnRvU3RyaW5nKCjor4bliKvnoIEpPT57IHJldHVybiBcXFwiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT1cXFwiICsg6K+G5Yir56CBO30s6K+G5Yir56CBKX0se3RpdGxlOiAnWWFuZGV45pCc57SiJywganM6ICQudG9TdHJpbmcoKOivhuWIq+eggSk9PnsgcmV0dXJuIFxcXCJodHRwczovL3lhbmRleC5jb20vc2VhcmNoL3RvdWNoLz90ZXh0PVxcXCIgKyDor4bliKvnoIE7fSzor4bliKvnoIEpfSx7dGl0bGU6ICflpI3liLbor4bliKvnoIEnLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsg6K+G5Yir56CBO30s6K+G5Yir56CBKX1dXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbn0pO1xcblwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiMOe6p+mmlumhtemhtemdolwiLFwicGF0aFwiOlwic2hvdVwiLFwicnVsZVwiOlwianM6XFxudmFyIGQgPSBbXTtcXG5NWV9VUkwgPSBNWV9VUkwucmVwbGFjZSgnaGlrZXI6Ly9lbXB0eSMjJywgJycpO1xcbmV2YWwoSlNPTi5wYXJzZShyZXF1ZXN0KCdoaWtlcjovL3BhZ2UvcmVwYWlyJykpLnJ1bGUpO1xcbnZhciB0ZW1wID0gZ3VhcmQoTVlfVVJMKTtcXG4gICAgaWYodGVtcC5pbmNsdWRlcyhcXFwi5qOA5rWL5LitXFxcIikpe1xcbiAgICAgICAgIE1ZX1VSTCA9IE1ZX0hPTUUgKyB0ZW1wLm1hdGNoKC9ocmVmID1cXFwiKC4qPylcXFwiLylbMV1cXG4gICAgICAgICAgfVxcbnZhciBodG1sID0gZ3VhcmQoTVlfVVJMKTtcXG5sb2coTVlfVVJMKVxcblxcbnZhciBsaXMgPSBwZGZhKGh0bWwsICcucmVzb3VjaSYmYTpub3QoOm1hdGNoZXMo576O5Zu+fOabtOWkmikpJyk7XFxubGlzLmZvckVhY2goeCA9PiB7ICAgXFxuICAgIGQucHVzaCh7XFxuICAgICAgIHRpdGxlOiBwZGZoKHgsICdhJiZUZXh0JyksXFxuICAgICAgIHVybDogcGQoeCwgJ2EmJmhyZWYnKSsnIyNmeXBhZ2VAcnVsZT1qczokLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9zc1xcXCIpJyxcXG4gICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gIH0pO1xcbn0pXFxuLypcXG5kLnB1c2goe1xcbiAgICAgY29sX3R5cGU6ICdibGFua19ibG9jaycsXFxufSkqL1xcblxcbnZhciBjb250cyA9IHBkZmEoaHRtbCwgJy5zb3UtdGFneXVuJiYuc291LXRhZycpO1xcbmZvciAodmFyIGkgPSAwOyBpIDwgY29udHMubGVuZ3RoOyBpKyspIHtcXG4gICAgICB2YXIgbGlzdCA9IHBkZmEoY29udHNbaV0sICdib2R5JiZhJyk7IFxcbmQucHVzaCh7XFxuICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJyxcXG59KTtcXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGlzdC5sZW5ndGg7IGorKykgeyAgICAgICBcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChsaXN0W2pdLCAnYSYmVGV4dCcpLFxcbiAgICAgICAgICAgICAgICB1cmw6IHBkKGxpc3Rbal0sICdhJiZocmVmJykrJyMjZnlwYWdlQHJ1bGU9anM6JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2Uvc3NcXFwiKScsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsICAgICAgICAgICAgXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG52YXIgbGlzID0gcGRmYShodG1sLCAnYm9keSYmLnBpYy1ob21lJiZsaScpO1xcbmxpcy5mb3JFYWNoKHggPT4geyAgIFxcbiAgICBkLnB1c2goe1xcbiAgICAgICB0aXRsZTogcGRmaCh4LCAnYSYmVGV4dCcpLFxcbiAgICAgICBpbWc6IHBkKHgsICdpbWcmJnNyYycpLFxcbiAgICAgICB1cmw6IHBkKHgsICdhJiZocmVmJykrJyMjZnlwYWdlQHJ1bGU9anM6JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2Uvc3NcXFwiKScsXFxuICAgICAgIGNvbF90eXBlOiAnbW92aWVfMicsXFxuICB9KTtcXG59KVxcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiNmZjY2MDBcXFwiPjxiPvCflKXor4bliKvnoIHop4bpopFcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHTng63pl6jliIbnsbs8L2I+PC9zcGFuPicsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCdcXG59KTtcXG5cXG52YXIgdGl0bGUgPSBwZGZhKGh0bWwsICcuYXVpLWxheW91dC10dWlqaWFuJiYuYXVpLWxheW91dC10ZXh0Jyk7XFxudmFyIGltZyA9IHBkZmEoaHRtbCwgJy5hdWktbGF5b3V0LXR1aWppYW4mJmltZycpO1xcbnZhciB1cmwgPSBwZGZhKGh0bWwsICcuYXVpLWxheW91dC10dWlqaWFuJiZhJyk7XFxuZm9yICh2YXIgaSA9IDA7IGkgPCBNYXRoLm1pbih0aXRsZS5sZW5ndGgsIGltZy5sZW5ndGgsdXJsLmxlbmd0aCk7IGkrKykge1xcbiAgIGQucHVzaCh7XFxuICAgICAgIHRpdGxlOiBwZGZoKHRpdGxlW2ldLCdUZXh0JyksXFxuICAgICAgIGltZzogcGQoaW1nW2ldLCdpbWcmJnNyYycpLFxcbiAgICAgICB1cmw6IHBkKHVybFtpXSwnYSYmaHJlZicpKycjI2Z5cGFnZUBydWxlPWpzOiQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3NzXFxcIiknLFxcbiAgICAgICBjb2xfdHlwZTogJ2ljb25fNF9jYXJkJyxcXG59KVxcbn1cXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXCJjb2xvcjojZmY2NjAwXFxcIj48Yj7wn5Sl5Zu95Lqn6KeG6aKRXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx054Ot6Zeo5YiG57G7PC9iPjwvc3Bhbj4nLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnXFxufSk7XFxuXFxudmFyIHRpdGxlID0gcGRmYShodG1sLCAnLmF1aS1sYXlvdXQtdHVpamlhbiwxJiYuYXVpLWxheW91dC10ZXh0Jyk7XFxudmFyIGltZyA9IHBkZmEoaHRtbCwgJy5hdWktbGF5b3V0LXR1aWppYW4sMSYmaW1nJyk7XFxudmFyIHVybCA9IHBkZmEoaHRtbCwgJy5hdWktbGF5b3V0LXR1aWppYW4sMSYmYScpO1xcbmZvciAodmFyIGkgPSAwOyBpIDwgTWF0aC5taW4odGl0bGUubGVuZ3RoLCBpbWcubGVuZ3RoLHVybC5sZW5ndGgpOyBpKyspIHtcXG4gICBkLnB1c2goe1xcbiAgICAgICB0aXRsZTogcGRmaCh0aXRsZVtpXSwnVGV4dCcpLFxcbiAgICAgICBpbWc6IHBkKGltZ1tpXSwnaW1nJiZzcmMnKSxcXG4gICAgICAgdXJsOiBwZCh1cmxbaV0sJ2EmJmhyZWYnKSsnIyNmeXBhZ2VAcnVsZT1qczokLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9zc1xcXCIpJyxcXG4gICAgICAgY29sX3R5cGU6ICdpY29uXzRfY2FyZCcsXFxufSlcXG59XFxuXFxuc2V0UmVzdWx0KGQpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuIDnuqfmkJzntKLpobXpnaJcIixcInBhdGhcIjpcInNzXCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcbi8qXFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICAgIGZvciAobGV0IGl0IG9mIGxpc3RNeVZhcktleXMoKSkge1xcbiAgICAgICAgY2xlYXJNeVZhcihpdCk7XFxuICAgIH1cXG59KTsqL1xcbmFkZExpc3RlbmVyKFxcXCJvblJlZnJlc2hcXFwiLCAoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcIm5leHRQYWdlXFxcIik7XFxufSk7XFxudmFyIHdob3N0ID0gY29uZmlnLmhvc3Q7XFxuTVlfVVJMID0gTVlfVVJMLnJlcGxhY2UoJ2hpa2VyOi8vZW1wdHkjIycsICcnKTtcXG5sZXQgdHJ1ZV91cmwgPSBnZXRWYXIoTVlfUlVMRS51cmwsIE1ZX1VSTCk7XFxuXFxuY29uc3QgcGFnZSA9IE1ZX1BBR0U7XFxuLy/ojrflj5bkuIrmrKHnvJPlrZjnmoTkuIvpobXpk77mjqVcXG5sZXQgbmV4dFBhZ2UgPSBnZXRNeVZhcihcXFwibmV4dFBhZ2VcXFwiLCBcXFwiXFxcIik7XFxuLy/lpoLmnpzmnInkuIvkuIDpobXkuJTkuI3mmK/nrKzkuIDpobXlsLHkvb/nlKjkuIvkuIDpobXpk77mjqVcXG5pZiAobmV4dFBhZ2UgJiYgTVlfUEFHRSA+IDEpIHtcXG4gICAgdHJ1ZV91cmwgPSBuZXh0UGFnZTtcXG59XFxudmFyIHRlbXAgPSBmZXRjaCh0cnVlX3VybCk7XFxuICAgIGlmKHRlbXAuaW5jbHVkZXMoXFxcIuajgOa1i+S4rVxcXCIpKXtcXG4gICAgICAgICB0cnVlX3VybCA9IHdob3N0ICsgdGVtcC5tYXRjaCgvaHJlZiA9XFxcIiguKj8pXFxcIi8pWzFdXFxuICAgICAgICAvLyByZXF1ZXN0KHdob3N0KVxcbiAgICAgICAgICB9XFxudmFyIGh0bWwgPSBmZXRjaCh0cnVlX3VybCk7XFxubG9nKHRydWVfdXJsKVxcbnRyeSB7XFxuICAgIC8v57yT5a2Y5LiL5LiA6aG1XFxuICAgIGxldCBuZXh0VXJsID0gcGQoaHRtbCwgXFxcImE6Y29udGFpbnMo5LiL5LiA6aG1KSYmaHJlZlxcXCIpO1xcbiAgICBwdXRNeVZhcihcXFwibmV4dFBhZ2VcXFwiLCBuZXh0VXJsIHx8IFxcXCJcXFwiKTtcXG4gICAgLy9sb2coXFxcIuS4i+S4gOmhte+8mlxcXCIgKyBuZXh0VXJsKVxcbn0gY2F0Y2ggKGUpIHtcXG4gICAgY2xlYXJNeVZhcihcXFwibmV4dFBhZ2VcXFwiKTtcXG4gICAgdG9hc3QoXFxcIuWlveWDj+ayoeacieS4i+S4gOmhteS6hu+8gVxcXCIpO1xcbn1cXG5cXG50cnl7XFxudmFyIGsgPSBwZGZoKGh0bWwsJ2JvZHkmJi5wYWdpbmF0aW9uJiZhLC0yJiZUZXh0JykucmVwbGFjZSgvXFxcXC4vZywnJyk7XFxubGV0IG5vdyA9IGdldEl0ZW0oJ25vdycsICfpppbpobUnKTtcXG5cXG52YXIgYXJyID0gWyfpmo/mnLonLCfot7PpobUnLCflsL7pobUnK2tdOyBcXG5mb3IgKHZhciBpID0gMTsgaSA8IChrIDwgMTAxID8gayA6IDEwMSkgOyBpICs9IChpID09IDEpID8gNCA6IDUpe1xcbiAgYXJyLnB1c2goaSk7IFxcbn1cXG5pZihrPjIwMCl7XFxuZm9yICh2YXIgaSA9IDIwMDsgaSA8IChrIDwgMTAwMSA/IGsgOiAxMDAxKSA7IGkgKz0gMTAwKXtcXG4gIGFyci5wdXNoKGkpOyBcXG59fVxcbnZhciBuYW1lcyA9IFtdXFxubmFtZXMgPSBhcnIubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcXG4gIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpIHtcXG4gICAgcmV0dXJuIGl0ZW0gKyBcXFwi6aG1XFxcIjtcXG4gIH0gZWxzZSB7XFxuICAgIHJldHVybiBpdGVtO1xcbiAgfVxcbn0pO1xcblxcbmZvciAodmFyIGogPSAwOyBqIDwgTWF0aC5taW4oYXJyLmxlbmd0aCwgbmFtZXMubGVuZ3RoKTsgaisrKSB7XFxuaWYoYXJyW2pdPT0n6Lez6aG1Jyl7XFxuICAgICAgICAgICAgIGQucHVzaCh7XFxyXFxuICAgICAgICAgICAgdGl0bGU6bm93ID09bmFtZXNbal0/ICfigJzigJzigJ3igJ0nICsgbmFtZXNbal0uZm9udGNvbG9yKCdyZWQnKSA6IG5hbWVzW2pdLFxcclxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxyXFxuICAgICAgICAgICAgdXJsOiAkKDIzLCAn6K+36L6T5YWl6KaB6Lez6L2s5Yiw55qE6aG15pWwJykuaW5wdXQoKHRydWVfdXJsLGssbmFtZXMsaikgPT4ge1xcclxcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4ocGFyc2VJbnQoaW5wdXQpKSkge1xcclxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+i+k+WFpeacieivryzor7fovpPlhaXkuIDkuKoxficgKyBrICsgJ+eahOaVsOWtlydcXHJcXG4gICAgICAgICAgICAgICAgfVxcclxcbiAgICAgICAgICAgICAgICBsZXQgdG9QYWdlID0gcGFyc2VJbnQoaW5wdXQpO1xcclxcbiAgICAgICAgICAgICAgICBpZiAodG9QYWdlIDwgMSB8fCB0b1BhZ2UgPiBrKSB7XFxyXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6L6T5YWl5pyJ6K+vLOivt+i+k+WFpeS4gOS4qjF+JyArIGsgKyAn55qE5pWw5a2XJ1xcclxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgIGlmKC9mb3J1bVxcXFwtXFxcXGQrXFxcXC1cXFxcZCsvLnRlc3QodHJ1ZV91cmwpKXtcXG52YXIgdXJsID0gdHJ1ZV91cmwucmVwbGFjZSgvXFxcXGQrXFxcXC5odG0vLCB0b1BhZ2UgKyAnLmh0bScpO1xcbiAgICAgICAgICAgICAgfWVsc2V7XFxudmFyIHVybCA9IHRydWVfdXJsLnJlcGxhY2UoL1xcXFwuaHRtLywgJy0nICsgdG9QYWdlICsgJy5odG0nKTtcXG4gICAgICAgICAgICAgIH1cXHJcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFwibm93XFxcIiwgbmFtZXNbal0pO1xcbiAgICAgICAgICAgICAgICBwdXRWYXIoTVlfUlVMRS51cmwsIHVybCk7XFxuICAgICAgICAgICAgICAgIC8vcHV0TXlWYXIoJ3lpX2ZpcnN0cGFnZScsIHVybCk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcclxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6Lez6LaK5Yiw5LqG56ysJyArIHRvUGFnZSArICfpobUnXFxyXFxuICAgICAgICAgICAgfSx0cnVlX3VybCwgayxuYW1lcyxqKSxcXHJcXG4gICAgICAgIH0pO1xcblxcbn1lbHNle1xcblxcbmlmKGFycltqXT09J+maj+acuicpe1xcbiAgICAgICAgICAgICAgYXJyW2pdID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogaykgKzEgICBcXG59ZWxzZSBpZihhcnJbal09PSflsL7pobUnK2spe1xcbiAgICAgICAgICAgICAgYXJyW2pdID0ga1xcbn1lbHNlIGlmKGFycltqXT09MSl7XFxuICAgICAgICAgICAgICBuYW1lc1tqXSA9IFxcXCLpppbpobVcXFwiXFxufWVsc2UgaWYoYXJyW2pdPT0n6Lez6aG1Jyl7XFxuICAgICAgICAgICAgIGFycltqXSA9IDIyM1xcbn1cXG5cXG4gICAgICAgICAgaWYoL2ZvcnVtXFxcXC1cXFxcZCtcXFxcLVxcXFxkKy8udGVzdCh0cnVlX3VybCkpe1xcbnZhciB1cmwgPSB0cnVlX3VybC5yZXBsYWNlKC9cXFxcZCtcXFxcLmh0bS8sIGFycltqXSArICcuaHRtJyk7XFxuICAgICAgICAgICAgICB9ZWxzZXtcXG52YXIgdXJsID0gdHJ1ZV91cmwucmVwbGFjZSgvXFxcXC5odG0vLCAnLScgKyBhcnJbal0gKyAnLmh0bScpO1xcbiAgICAgICAgICAgICAgfVxcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6bm93ID09bmFtZXNbal0/ICfigJzigJzigJ3igJ0nICsgbmFtZXNbal0uZm9udGNvbG9yKCdyZWQnKSA6IG5hbWVzW2pdLFxcbiAgICAgICAgdXJsOiB1cmwgKyAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChhcnIsbmFtZXMsaikgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcIm5vd1xcXCIsbmFtZXNbal0pO1xcbiAgICAgICAgICAgIHB1dFZhcihNWV9SVUxFLnVybCwgaW5wdXQpO1xcbiAgICAgICAgICAgIC8vcHV0TXlWYXIoJ3lpX2ZpcnN0cGFnZScsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v56m/6LaK5Yiw5LqG56ysJyArIGFycltqXSArIFxcXCLpobVcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfSxhcnIsbmFtZXMsaiksXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgICAgIH0pXFxufVxcbn19Y2F0Y2goZXJyKXtcXG4gICAgdG9hc3QoXFxcIuWlveWDj+ayoeacieS4i+S4gOmhteS6hu+8gVxcXCIpO1xcbn07XFxuXFxuXFxudmFyIGxpc3QgPSBwZGZhKGh0bWwsICdib2R5JiYucGx1Z2luX2xpc3QnKTtcXG5saXN0LmZvckVhY2goeCA9PiB7ICAgXFxuICAgIGQucHVzaCh7XFxuICAgICAgIHRpdGxlOiBwZGZoKHgsICdhJiZUZXh0JykucmVwbGFjZShcXFwi44CQ56OB5Yqb44CRXFxcIixcXFwiXFxcIiksXFxuICAgICAgIGRlc2M6IHBkZmgoeCwnLmRhdGUmJlRleHQnKSxcXG4gICAgICAgaW1nOiBwZCh4LCdpbWd8fGEmJnNyY3x8ZGF0YS1vcmlnaW5hbCcpLFxcbiAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZXI/dXJsPVxcXCIrcGQoeCwgJ2EmJmhyZWYnKSxcXG4gICAgICAgY29sX3R5cGU6ICdtb3ZpZV8yJyxcXG4gICAgICAgZXh0cmE6e1xcbiAgICAgICAgICBwYWdlVGl0bGU6cGRmaCh4LCAnYSYmVGV4dCcpLFxcbiAgICAgICAgICAgICAgICAgIH1cXG4gIH0pO1xcbn0pXFxuXFxuc2V0UmVzdWx0KGQpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnjq/looNcIixcInBhdGhcIjpcInJlcGFpclwiLFwicnVsZVwiOlwianM6XFxudmFyIGRvY3VtZW50ID0ge307XFxudmFyIHdpbmRvdyA9IHtcXG4gICAgbG9jYXRpb246IHtcXG4gICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgfVxcbiAgICB9XFxufTtcXG5cXG4vLyDlrprkuYnkuIDkuKrlr7nosaHnlKjkuo7lrZjlgqggY29va2llIOWQjeensOWSjOWAvOeahOmUruWAvOWvuVxcbnZhciBjb29raWVzID0ge307XFxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnY29va2llJywge1xcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXFxuICAgIGdldDogZnVuY3Rpb24oKSB7XFxuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29va2llcykubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX09JHt2YWx1ZX1gKS5qb2luKCc7ICcpO1xcbiAgICB9LFxcbiAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XFxuICAgICAgICB2YXIgbGlzdCA9IFtdO1xcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKCc7JykpIHtcXG4gICAgICAgICAgICBsaXN0ID0gdmFsdWUuc3BsaXQoJzsnKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGlzdCA9IFt2YWx1ZV07XFxuICAgICAgICB9XFxuICAgICAgICBsaXN0LmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgdmFyIGluZGV4ID0geC5pbmRleE9mKFxcXCI9XFxcIik7XFxuICAgICAgICAgICAgdmFyIGtleSA9IHguc3Vic3RyaW5nKDAsIGluZGV4KS50cmltKCk7XFxuICAgICAgICAgICAgdmFyIHZhbHVlID0geC5zdWJzdHJpbmcoaW5kZXggKyAxKTtcXG4gICAgICAgICAgICBjb29raWVzW2tleV0gPSB2YWx1ZTtcXG4gICAgICAgIH0pXFxuICAgIH1cXG59KTtcXG5cXG5mdW5jdGlvbiBndWFyZCh1cmwsIGhlYWRvYmopIHtcXG4gICAgdmFyIGhlYWQgPSBoZWFkb2JqID8gaGVhZG9iajp7XFxuICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgQ29va2llOiBnZXRDb29raWUodXJsKSxcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICB2YXIgaHRtbCA9IGZldGNoKHVybCwgaGVhZCk7XFxuICAgIGlmIChodG1sLmluY2x1ZGVzKCdfZ3VhcmQvYXV0by5qcycpKSB7XFxuICAgICAgICBkb2N1bWVudFtcXFwiY29va2llXFxcIl0gPSBnZXRDb29raWUodXJsKTtcXG4gICAgICAgIGV2YWwoZmV0Y2goZ2V0SG9tZSh1cmwpICsgJy9fZ3VhcmQvYXV0by5qcycpKVxcbiAgICAgICAgaHRtbCA9IGZldGNoKHVybCwge1xcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgQ29va2llOiBkb2N1bWVudFtcXFwiY29va2llXFxcIl0sXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgLy9sb2coZG9jdW1lbnRbXFxcImNvb2tpZVxcXCJdKVxcbiAgICByZXR1cm4gaHRtbFxcbn1cXG5cXG5mdW5jdGlvbiBjc3BsaXQoYSwgYiwgYykge1xcbiAgICBiID0gcGFyc2VJbnQoYiwgMTApIHx8IDc2O1xcbiAgICBjID0gYyB8fCAnXFxcXHJcXFxcbic7XFxuICAgIGlmIChiIDwgMSkge1xcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxuICAgIH1cXG4gICAgcmV0dXJuIGEubWF0Y2gobmV3IFJlZ0V4cChcXFwiLnswLFxcXCIgKyBiICsgXFxcIn1cXFwiLFxcXCJnXFxcIikpLmpvaW4oYylcXG59XFxuXFxuZnVuY3Rpb24gcmV1cmwoYSkge1xcbiAgICB2YXIgYiA9ICcnO1xcbiAgICB2YXIgYyA9IGNzcGxpdChhLCA4KS5zcGxpdCgnXFxcXHJcXFxcbicpO1xcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IChjLmxlbmd0aCAtIDEpOyBpKyspIHtcXG4gICAgICAgIGIgPSBiICsgU3RyaW5nLmZyb21DaGFyQ29kZSgocGFyc2VJbnQoY1tpXSwgMikgLSAxMCkudG9TdHJpbmcoMTApKVxcbiAgICB9XFxuICAgIHJldHVybiBiXFxufVwifV0sXCJzYXZlZFwiOmZhbHNlLFwidGl0bGVcIjpcIueVqsK35LuTXCIsXCJ2ZXJzaW9uXCI6MCxcInVybFwiOlwiaHR0cHM6Ly93d3cuZmRuczEueHl6XCIsXCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwiZmluZF9ydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcbk1ZX1VSTCA9IE1ZX1VSTC5yZXBsYWNlKCdoaWtlcjovL2VtcHR5IyMnLCAnJyk7XFxuZXZhbChKU09OLnBhcnNlKHJlcXVlc3QoJ2hpa2VyOi8vcGFnZS9yZXBhaXInKSkucnVsZSk7XFxudmFyIHRlbXAgPSBndWFyZChNWV9VUkwpO1xcbiAgICBpZih0ZW1wLmluY2x1ZGVzKFxcXCLmo4DmtYvkuK1cXFwiKSl7XFxuICAgICAgICAgTVlfVVJMID0gTVlfSE9NRSArIHRlbXAubWF0Y2goL2hyZWYgPVxcXCIoLio/KVxcXCIvKVsxXVxcbiAgICAgICAgICB9XFxudmFyIGh0bWwgPSBndWFyZChNWV9VUkwpO1xcbmxvZyhNWV9VUkwpXFxuXFxudmFyIGxpcyA9IHBkZmEoaHRtbCwgJy5yZXNvdWNpJiZhOm5vdCg6bWF0Y2hlcyjnvo7lm7585pu05aSaKSknKTtcXG5saXMuZm9yRWFjaCh4ID0+IHsgICBcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgdGl0bGU6IHBkZmgoeCwgJ2EmJlRleHQnKSxcXG4gICAgICAgdXJsOiBwZCh4LCAnYSYmaHJlZicpKycjI2Z5cGFnZUBydWxlPWpzOiQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3NzXFxcIiknLFxcbiAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgfSk7XFxufSlcXG4vKlxcbmQucHVzaCh7XFxuICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJyxcXG59KSovXFxuXFxudmFyIGNvbnRzID0gcGRmYShodG1sLCAnLnNvdS10YWd5dW4mJi5zb3UtdGFnJyk7XFxuZm9yICh2YXIgaSA9IDA7IGkgPCBjb250cy5sZW5ndGg7IGkrKykge1xcbiAgICAgIHZhciBsaXN0ID0gcGRmYShjb250c1tpXSwgJ2JvZHkmJmEnKTsgXFxuZC5wdXNoKHtcXG4gICAgIGNvbF90eXBlOiAnYmxhbmtfYmxvY2snLFxcbn0pO1xcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7ICAgICAgIFxcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGxpc3Rbal0sICdhJiZUZXh0JyksXFxuICAgICAgICAgICAgICAgIHVybDogcGQobGlzdFtqXSwgJ2EmJmhyZWYnKSsnIyNmeXBhZ2VAcnVsZT1qczokLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9zc1xcXCIpJyxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJywgICAgICAgICAgICBcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbnZhciBsaXMgPSBwZGZhKGh0bWwsICdib2R5JiYucGljLWhvbWUmJmxpJyk7XFxubGlzLmZvckVhY2goeCA9PiB7ICAgXFxuICAgIGQucHVzaCh7XFxuICAgICAgIHRpdGxlOiBwZGZoKHgsICdhJiZUZXh0JyksXFxuICAgICAgIGltZzogcGQoeCwgJ2ltZyYmc3JjJyksXFxuICAgICAgIHVybDogcGQoeCwgJ2EmJmhyZWYnKSsnIyNmeXBhZ2VAcnVsZT1qczokLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9zc1xcXCIpJyxcXG4gICAgICAgY29sX3R5cGU6ICdtb3ZpZV8yJyxcXG4gIH0pO1xcbn0pXFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFwiY29sb3I6I2ZmNjYwMFxcXCI+PGI+8J+UpeivhuWIq+eggeinhumikVxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOeDremXqOWIhuexuzwvYj48L3NwYW4+JyxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0J1xcbn0pO1xcblxcbnZhciB0aXRsZSA9IHBkZmEoaHRtbCwgJy5hdWktbGF5b3V0LXR1aWppYW4mJi5hdWktbGF5b3V0LXRleHQnKTtcXG52YXIgaW1nID0gcGRmYShodG1sLCAnLmF1aS1sYXlvdXQtdHVpamlhbiYmaW1nJyk7XFxudmFyIHVybCA9IHBkZmEoaHRtbCwgJy5hdWktbGF5b3V0LXR1aWppYW4mJmEnKTtcXG5mb3IgKHZhciBpID0gMDsgaSA8IE1hdGgubWluKHRpdGxlLmxlbmd0aCwgaW1nLmxlbmd0aCx1cmwubGVuZ3RoKTsgaSsrKSB7XFxuICAgZC5wdXNoKHtcXG4gICAgICAgdGl0bGU6IHBkZmgodGl0bGVbaV0sJ1RleHQnKSxcXG4gICAgICAgaW1nOiBwZChpbWdbaV0sJ2ltZyYmc3JjJyksXFxuICAgICAgIHVybDogcGQodXJsW2ldLCdhJiZocmVmJykrJyMjZnlwYWdlQHJ1bGU9anM6JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2Uvc3NcXFwiKScsXFxuICAgICAgIGNvbF90eXBlOiAnaWNvbl80X2NhcmQnLFxcbn0pXFxufVxcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiNmZjY2MDBcXFwiPjxiPvCflKXlm73kuqfop4bpopFcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHTng63pl6jliIbnsbs8L2I+PC9zcGFuPicsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCdcXG59KTtcXG5cXG52YXIgdGl0bGUgPSBwZGZhKGh0bWwsICcuYXVpLWxheW91dC10dWlqaWFuLDEmJi5hdWktbGF5b3V0LXRleHQnKTtcXG52YXIgaW1nID0gcGRmYShodG1sLCAnLmF1aS1sYXlvdXQtdHVpamlhbiwxJiZpbWcnKTtcXG52YXIgdXJsID0gcGRmYShodG1sLCAnLmF1aS1sYXlvdXQtdHVpamlhbiwxJiZhJyk7XFxuZm9yICh2YXIgaSA9IDA7IGkgPCBNYXRoLm1pbih0aXRsZS5sZW5ndGgsIGltZy5sZW5ndGgsdXJsLmxlbmd0aCk7IGkrKykge1xcbiAgIGQucHVzaCh7XFxuICAgICAgIHRpdGxlOiBwZGZoKHRpdGxlW2ldLCdUZXh0JyksXFxuICAgICAgIGltZzogcGQoaW1nW2ldLCdpbWcmJnNyYycpLFxcbiAgICAgICB1cmw6IHBkKHVybFtpXSwnYSYmaHJlZicpKycjI2Z5cGFnZUBydWxlPWpzOiQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3NzXFxcIiknLFxcbiAgICAgICBjb2xfdHlwZTogJ2ljb25fNF9jYXJkJyxcXG59KVxcbn1cXG5cXG5zZXRSZXN1bHQoZClcIixcImdyb3VwXCI6XCLmiJHnmoTlsI/nqIvluo9cIixcInVhXCI6XCJwY1wiLFwicHJlUnVsZVwiOlwiLy/lj5HluIPlnLDlnYAgICAgaHR0cHM6Ly93d3cuZmNmYWJ1LmNvbS9cXG5cXG52YXIg5pu05paw6Ze06ZqUID0gMjNcXG5sZXQgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKClcXG5sZXQg5pe26Ze06Ze06ZqUID0gdGltZS1nZXRJdGVtKCd0aW1lJywgbmV3IERhdGUoKS5nZXRUaW1lKCkudG9TdHJpbmcoKSlcXG4vL2xvZyhcXFwi5b2T5YmN5pe26Ze05oizXFxcIit0aW1lKVxcbi8vbG9nKFxcXCLpl7TpmpTml7bpl7TmiLNcXFwiK+aXtumXtOmXtOmalClcXG5sZXQg6Ze06ZqU5aSp5pWwID0gTWF0aC5mbG9vcijml7bpl7Tpl7TpmpQgLyAoMjQgKiA2MCAqIDYwICogMTAwMCkpO1xcbmxldCDpl7TpmpTml7bmlbAgPSBNYXRoLmZsb29yKOaXtumXtOmXtOmalCAvICg2MCAqIDYwICogMTAwMCkpO1xcbmxldCDpl7TpmpTliIbmlbAgPSBNYXRoLmZsb29yKOaXtumXtOmXtOmalCAvICggNjAgKiAxMDAwKSk7XFxubGV0IOmXtOmalOenkuaVsCA9IE1hdGguZmxvb3Io5pe26Ze06Ze06ZqUIC8gMTAwMCk7XFxuICAgIC8vbG9nKFxcXCLpl7TpmpTml7bpl7Q9PT09XFxcIivpl7TpmpTnp5LmlbArXFxcIuenklxcXCIpXFxuc2V0SXRlbSgndGltZScsIHRpbWUpO1xcbi8qXFxudmFyIHVybDtcXG50cnl7XFxuICB1cmwgPSBKU09OLnBhcnNlKGZldGNoKGdldEl0ZW0oJ2xpbmsnLCAnJyksIHtcXG4gICAgICAgIG9ubHlIZWFkZXJzOiB0cnVlXFxuICAgIH0pKS51cmxcXG59Y2F0Y2h7fVxcbmxvZyh1cmwpXFxuKGdldEl0ZW0oJ2xpbmsnLCAnJykrJy8nKSAhPSB1cmwpXFxuKi9cXG5pZiAo6Ze06ZqU5aSp5pWwPj3mm7TmlrDpl7TpmpQgfHwgIWdldEl0ZW0oJ2xpbmsnLCAnJykuc3RhcnRzV2l0aCgnaHR0cCcpIHx8IGZldGNoKGdldEl0ZW0oJ2xpbmsnKSkuaW5jbHVkZXMoXFxcImhhbzEyM1xcXCIpKSB7XFxuICAgIGxldCBmYWJ1ID0gJ2h0dHBzOi8vd3d3LmZjZmFidS5jb20nO1xcbiAgICBsZXQgdGVtcCA9IGZldGNoKGZhYnUpO1xcbiAgICBpZih0ZW1wLmluY2x1ZGVzKFxcXCLmo4DmtYvkuK1cXFwiKSl7XFxuICAgICAgICAgdXJsID0gZmFidSArIHRlbXAubWF0Y2goL2hyZWYgPVxcXCIoLio/KVxcXCIvKVsxXVxcbiAgICAgICAgIHRlbXAgPSBmZXRjaCh1cmwpXFxuICAgICAgICAgIH1cXG4gICAgbGV0IGxpbmsgPSBwYXJzZURvbUZvckh0bWwodGVtcCwgJy5lbnRlci1saW5rJiZhJiZocmVmJyk7XFxuICAgIHNldEl0ZW0oJ2xpbmsnLCBsaW5rKTtcXG4gICAgLy90b2FzdCgn5pu05paw5Z+f5ZCNJyk7XFxuICAgIGxvZygn5pu05paw5Z+f5ZCN77yaJytsaW5rKTtcXG4gICAgIGNvbmZpcm0oe1xcbiAgICAgICAgdGl0bGU6J+eVqsK35LuTJywgXFxuICAgICAgICBjb250ZW50Oiflt7Lmm7TmlrDnvZHlnYDkuLpcXFxcbicrbGluaywgXFxuICAgICAgICBjb25maXJtOiQudG9TdHJpbmcoKCk9Pnt9KSwgXFxuICAgICAgICBjYW5jZWw6JC50b1N0cmluZygoKT0+e30pXFxuICAgIH0pXFxufVxcbmluaXRDb25maWcoe1xcbiAgICBob3N0OiBnZXRJdGVtKCdsaW5rJywgJ2h0dHBzOi8vd3d3LmZhbmFkLnh5ei8nKVxcbn0pO1wiLFwicGFnZXNcIjpcIlt7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkuIDnuqfliIbnsbvliJfooahcXFwiLFxcXCJwYXRoXFxcIjpcXFwieWlcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4vKlxcXFxu5LiA57qn5bCB6KOFIFxcXFxu5Yqo5oCB5YiG57G7IOWIl+ihqOWIm+W7uiDoh6rliqjkuIvkuIDpobVcXFxcbnZlciAyMDIzMDcxMCAxLjBcXFxcbiovXFxcXG5cXFxcbi8vZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvbGF6eScsIHt9KSkucnVsZSk7XFxcXG5cXFxcbmZ1bmN0aW9uIGR5bmFtaWNDbGFzcyhvcHRpb25zKSB7XFxcXG4gIGNvbnN0IG9iaiA9IHtcXFxcbiAgICAvL+m7mOiupOWAvFxcXFxuICAgIGxheW91dDogXFxcXFxcXCJ1bmRlZmluZWRcXFxcXFxcIixcXFxcbiAgICBodG1sOiBcXFxcXFxcImVtcHR5XFxcXFxcXCIsXFxcXG4gICAgcGFnZTogMCxcXFxcbiAgICDliIbnsbvpopzoibI6IFxcXFxcXFwiI0ZBNzI5OFxcXFxcXFwiLFxcXFxuICAgIOaKmOWPoDogXFxcXFxcXCLigJzigJzigJ3igJ08Yj5cXFxcXFxcIiArIFxcXFxcXFwi4oioXFxcXFxcXCIuZm9udGNvbG9yKFxcXFxcXFwiIzFhYWQxOVxcXFxcXFwiKSArIFxcXFxcXFwiPC9iPlxcXFxcXFwiLFxcXFxuICAgIOWxleW8gDogXFxcXFxcXCLigJzigJzigJ3igJ08Yj5cXFxcXFxcIiArIFxcXFxcXFwi4oinXFxcXFxcXCIuZm9udGNvbG9yKFxcXFxcXFwiI0ZGMDAwMFxcXFxcXFwiKSArIFxcXFxcXFwiPC9iPlxcXFxcXFwiLFxcXFxuICAgIG9wZW46IHRydWUsXFxcXG4gICAgc3RhdGU6IE1ZX1JVTEUudXJsLFxcXFxuICAgIHNlYXJjaDogZmFsc2UsXFxcXG4gICAgY2xlYXJzOiBbXSxcXFxcbiAgICBjbGVhcmFsbDogW1xcXFxcXFwieWlfZmlyc3RwYWdlXFxcXFxcXCJdLFxcXFxuICAgIGRlYnVnOiBmYWxzZSxcXFxcblxcXFxuICAgIOmihOiuvihwYXJhbSkge1xcXFxuICAgICAgaWYocGFyYW09PXVuZGVmaW5lZCl7XFxcXG4gICAgICAgIHBhcmFtPVtdO1xcXFxuICAgICAgfVxcXFxuICAgICAgT2JqZWN0LmtleXMocGFyYW0pLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XFxcXG4gICAgICAgIC8vIOWvueavj+S4quWxnuaAp+WQjeaJp+ihjOaTjeS9nFxcXFxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtW3Byb3BlcnR5XTsgLy8g6I635Y+W5bGe5oCn5YC8XFxcXG4gICAgICAgIC8vIOWcqOi/memHjOaJp+ihjOaCqOeahOaTjeS9nFxcXFxuICAgICAgICB0aGlzW3Byb3BlcnR5XSA9IHZhbHVlO1xcXFxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xcXFxuICAgICAgICAgIGNvbnNvbGUubG9nKHByb3BlcnR5ICsgXFxcXFxcXCI6XFxcXFxcXCIgKyB2YWx1ZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH0pO1xcXFxuICAgIH0sXFxcXG4gICAgZXZhbEpTUnVsZShpdGVtLCBqc1J1bGUpIHtcXFxcbiAgICAgIGxldCBydWxlID0ganNSdWxlLnJlcGxhY2UoXFxcXFxcXCJAanM6XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgcnVsZSA9IHJ1bGUudHJpbSgpO1xcXFxuICAgICAgLy9sb2coJC5zdHJpbmdpZnkocnVsZSkpXFxcXG4gICAgICBsZXQgaW5wdXQgPSBpdGVtO1xcXFxuICAgICAgaWYgKHJ1bGUuc3RhcnRzV2l0aChcXFxcXFxcIihcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgZXZhbChcXFxcXFxcInJlc3VsdCA9IFxcXFxcXFwiICsgcnVsZSk7XFxcXG4gICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAvKipcXFxcbiAgICAgICAgICog6L+Y5Y6f5oiQICQudG9TdHJpbmcoLi4uKSDnmoTmnIDnu4jnu5PmnpzvvIzovr7liLDmnIDnu4jlpITnkIbmlrnlvI/ot5/kuIrpnaLnmoQgaWYg5LiA6Ie055qE55uu55qEXFxcXG4gICAgICAgICAqL1xcXFxuICAgICAgICBldmFsKFxcXFxcXFwicmVzdWx0ID0gXFxcXFxcXCIgKyBcXFxcXFxcIigoKSA9PiB7XFxcXFxcXCIgKyBydWxlICsgXFxcXFxcXCJ9KSgpXFxcXFxcXCIpO1xcXFxuICAgICAgfVxcXFxuICAgICAgcmV0dXJuIHJlc3VsdCB8fCBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0VGl0bGUoc3JjLCBjYXRlZ29yeSkge1xcXFxuICAgICAgbGV0IHRpdGxlID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgIGxldCB0aXRsZVJ1bGUgPSBjYXRlZ29yeSB8fCBcXFxcXFxcImEmJlRleHRcXFxcXFxcIjtcXFxcbiAgICAgIGlmICh0aXRsZVJ1bGUuc3RhcnRzV2l0aChcXFxcXFxcIkBqczpcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgdGl0bGUgPSB0aGlzLmV2YWxKU1J1bGUoc3JjLCB0aXRsZVJ1bGUpO1xcXFxuICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgdGl0bGUgPSBwYXJzZURvbUZvckh0bWwoc3JjLCB0aXRsZVJ1bGUpO1xcXFxuICAgICAgfVxcXFxuICAgICAgcmV0dXJuIHRpdGxlIHx8IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgfSxcXFxcbiAgICBnZXRVcmwoc3JjLCBjYXRlZ29yeSkge1xcXFxuICAgICAgbGV0IHVybCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICBsZXQgdXJsUnVsZSA9IGNhdGVnb3J5LumTvuaOpSB8fCBcXFxcXFxcImEmJmhyZWZcXFxcXFxcIjtcXFxcbiAgICAgIGlmICh1cmxSdWxlLnN0YXJ0c1dpdGgoXFxcXFxcXCJAanM6XFxcXFxcXCIpKSB7XFxcXG4gICAgICAgIHVybCA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIHVybFJ1bGUpO1xcXFxuICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgdXJsID0gcGQoc3JjLCB1cmxSdWxlKTtcXFxcbiAgICAgIH1cXFxcbiAgICAgIGlmICh0eXBlb2YgY2F0ZWdvcnku6ZO+5o6l5aSE55CGID09IFxcXFxcXFwiZnVuY3Rpb25cXFxcXFxcIikge1xcXFxuICAgICAgICB1cmwgPSBjYXRlZ29yeS7pk77mjqXlpITnkIYodXJsKTtcXFxcbiAgICAgIH1cXFxcbiAgICAgIHJldHVybiB1cmwgfHwgXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICB9LFxcXFxuICAgIGlzTnVsbChwYXJhbSkge1xcXFxuICAgICAgaWYgKHBhcmFtID09IG51bGwpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgICB9XFxcXG4gICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfSxcXFxcbiAgICBpc0Jvb2xlYW4odmFyaWFibGUpIHtcXFxcbiAgICAgIGlmICh0eXBlb2YgdmFyaWFibGUgIT09IFxcXFxcXFwiYm9vbGVhblxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuW8gOWQr+aKmOWPoOivt+S8oOWFpeW4g+WwlOWAvFxcXFxcXFwiKTtcXFxcbiAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIOa4hemZpChsaXN0KSB7XFxcXG4gICAgICBpZiAodGhpcy5pc051bGwobGlzdCkpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgICB9XFxcXG4gICAgICBpZiAobGlzdC5jb25zdHJ1Y3RvciA9PSBTdHJpbmcpIHtcXFxcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi5riF6Zmk5oql6ZSZOuivt+S8oOWIl+ihqFxcXFxcXFwiKTtcXFxcbiAgICAgIH1cXFxcbiAgICAgIHRoaXMuY2xlYXJzID0gbGlzdDtcXFxcbiAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAg5YWo5riFKGxpc3QpIHtcXFxcbiAgICAgIGlmICh0aGlzLmlzTnVsbChsaXN0KSkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICAgIH1cXFxcbiAgICAgIHZhciBjID0gdGhpcy5jbGVhcmFsbDtcXFxcbiAgICAgIGxpc3QgPSBjLmNvbmNhdChsaXN0KTtcXFxcbiAgICAgIHRoaXMuY2xlYXJhbGwgPSBsaXN0O1xcXFxuICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICDmupDnoIEoaW5wdXQpIHtcXFxcbiAgICAgIHRoaXMuaHRtbCA9IGlucHV0O1xcXFxuICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICDnlYzpnaIoaW5wdXQpIHtcXFxcbiAgICAgIHRoaXMubGF5b3V0ID0gaW5wdXQ7XFxcXG4gICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIOmhteeggShpbnB1dCkge1xcXFxuICAgICAgdGhpcy5wYWdlID0gaW5wdXQ7XFxcXG4gICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIOeKtuaAgShpbnB1dCkge1xcXFxuICAgICAgdGhpcy5zdGF0ZSA9IGlucHV0O1xcXFxuICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICDlvIDlkK/mkJzntKIoKSB7XFxcXG4gICAgICB0aGlzLnNlYXJjaCA9IHRydWU7XFxcXG4gICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIOW8gOWQr+aKmOWPoChpbnB1dCkge1xcXFxuICAgICAgaWYgKGlucHV0ID09IHVuZGVmaW5lZCkge1xcXFxuICAgICAgICBpbnB1dCA9IHRydWU7XFxcXG4gICAgICB9XFxcXG4gICAgICB0aGlzLmlzQm9vbGVhbihpbnB1dCk7XFxcXG4gICAgICB0aGlzLm9wZW4gPSBpbnB1dDtcXFxcbiAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgc2V0VGl0bGUoaywgaSwgdCkge1xcXFxuICAgICAgcmV0dXJuIGsgPT0gaSA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyB0LmZvbnRjb2xvcih0aGlzLuWIhuexu+minOiJsikgOiB0O1xcXFxuICAgIH0sXFxcXG4gICAgYWN0aW9uKG9iaikge1xcXFxuICAgICAgcmV0dXJuIFtcXFxcbiAgICAgICAge1xcXFxuICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIua4hemZpOeKtuaAgVxcXFxcXFwiLFxcXFxuICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChvYmopID0+IHtcXFxcbiAgICAgICAgICAgIGxvZyhvYmopO1xcXFxuICAgICAgICAgICAgY2xlYXJNeVZhcihvYmouc3RhdGUpO1xcXFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcImhlYWQuY2F0ZVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIG9iai5hbGwuZm9yRWFjaCgoaXRlbSkgPT4ge1xcXFxuICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBvYmouY2wuZm9yRWFjaCgoaXRlbSkgPT4ge1xcXFxuICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgIH0sIG9iaiksXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICBdO1xcXFxuICAgIH0sXFxcXG4gICAgY2hlY2tQYXJhbSgpIHtcXFxcbiAgICAgIHZhciBvYmogPSB7fTtcXFxcbiAgICAgIGlmICh0aGlzLnBhZ2UgPT0gMCAmJiB0eXBlb2YgcGFnZSA9PSBcXFxcXFxcInVuZGVmaW5lZFxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+S8oOWFpemhteeggVxcXFxcXFwiKTtcXFxcbiAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgcGFnZSA9PSBcXFxcXFxcInVuZGVmaW5lZFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgb2JqW1xcXFxcXFwi6aG156CBXFxcXFxcXCJdID0gdGhpcy5wYWdlO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgIG9ialtcXFxcXFxcIumhteeggVxcXFxcXFwiXSA9IHBhZ2U7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH1cXFxcbiAgICAgIGlmICh0aGlzLmh0bWwgPT0gXFxcXFxcXCJlbXB0eVxcXFxcXFwiICYmIHR5cGVvZiBodG1sID09IFxcXFxcXFwidW5kZWZpbmVkXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi6K+35Lyg5YWl5rqQ56CBXFxcXFxcXCIpO1xcXFxuICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBodG1sID09IFxcXFxcXFwidW5kZWZpbmVkXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICBvYmpbXFxcXFxcXCLmupDnoIFcXFxcXFxcIl0gPSB0aGlzLmh0bWw7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgb2JqW1xcXFxcXFwi5rqQ56CBXFxcXFxcXCJdID0gaHRtbDtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgfVxcXFxuICAgICAgaWYgKHRoaXMubGF5b3V0ID09IFxcXFxcXFwidW5kZWZpbmVkXFxcXFxcXCIgJiYgdHlwZW9mIGQgPT0gXFxcXFxcXCJ1bmRlZmluZWRcXFxcXFxcIikge1xcXFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7fkvKDlhaXnlYzpnaJcXFxcXFxcIik7XFxcXG4gICAgICB9IGVsc2Uge1xcXFxuICAgICAgICBpZiAodHlwZW9mIGQgPT0gXFxcXFxcXCJ1bmRlZmluZWRcXFxcXFxcIikge1xcXFxuICAgICAgICAgIG9ialtcXFxcXFxcIueVjOmdolxcXFxcXFwiXSA9IHRoaXMubGF5b3V0O1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgIG9ialtcXFxcXFxcIueVjOmdolxcXFxcXFwiXSA9IGQ7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH1cXFxcbiAgICAgIHJldHVybiBvYmo7XFxcXG4gICAgfSxcXFxcbiAgICDliJvlu7rliqjmgIHliIbnsbsocnVsZU9iaikge1xcXFxuICAgICAgaWYgKHJ1bGVPYmogPT0gdW5kZWZpbmVkKSB7XFxcXG4gICAgICAgIHJ1bGVPYmogPSBbXTtcXFxcbiAgICAgIH1cXFxcbiAgICAgIC8v5Yid5aeL5YyW5Y+Y6YeP5byA5aeLXFxcXG4gICAgICBjb25zdCBwYXJhbSA9IHRoaXMuY2hlY2tQYXJhbSgpO1xcXFxuICAgICAgY29uc3QgcGFnZSA9IHBhcmFtLumhteeggTtcXFxcbiAgICAgIGNvbnN0IGh0bWwgPSBwYXJhbS7mupDnoIE7XFxcXG4gICAgICBjb25zdCBkID0gcGFyYW0u55WM6Z2iO1xcXFxuICAgICAgY29uc3Qg54q25oCBID0gdGhpcy5zdGF0ZTtcXFxcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuc2VhcmNoO1xcXFxuICAgICAgY29uc3QgZW1wdHkgPSBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgIGNvbnN0IOaKmOWPoOeKtuaAgSA9IHRoaXMub3BlbjtcXFxcbiAgICAgIHZhciDlsZXlvIAgPSB0aGlzLuWxleW8gDtcXFxcbiAgICAgIHZhciDmipjlj6AgPSB0aGlzLuaKmOWPoDtcXFxcbiAgICAgIHZhciDlhajmuIUgPSB0aGlzLmNsZWFyYWxsO1xcXFxuICAgICAgdmFyIOa4hemZpCA9IHRoaXMuY2xlYXJzO1xcXFxuICAgICAgLy/liJ3lp4vljJblj5jph4/nu5PmnZ9cXFxcbiAgICAgIGxldCBpbml0X2NhdGUgPSBuZXcgQXJyYXkoMjApLmZpbGwoXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgY29uc3QgZm9sZCA9IGdldE15VmFyKE1ZX1JVTEUuZ3JvdXAsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgIGNvbnN0IGNhdGVfdGVtcCA9IEpTT04ucGFyc2UoXFxcXG4gICAgICAgIGdldE15VmFyKFxcXFxcXFwiaGVhZC5jYXRlXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGluaXRfY2F0ZSkpXFxcXG4gICAgICApO1xcXFxuICAgICAgaWYgKHNlYXJjaCAmJiBwYWdlID09IDEpIHtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICB0aXRsZTogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICB1cmw6IFxcXFxcXFwiJ2hpa2VyOi8vc2VhcmNoP3J1bGU9XFxcXFxcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcXFxcXCImcz0nK2lucHV0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgZGVzYzogXFxcXFxcXCLmkJzntKLlhbPplK7or41cXFxcXFxcIixcXFxcbiAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXFxcXFwia2V5d29yZFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJrZXl3b3JkXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgIH0sXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgfVxcXFxuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtdO1xcXFxuICAgICAgcnVsZU9iai5mb3JFYWNoKCh4KSA9PiB7XFxcXG4gICAgICAgIHZhciBsaXN0ID0gW107XFxcXG4gICAgICAgIGlmKHgu5LiA57qn5a6a5L2NKXtcXFxcbiAgICAgICAgICBpZiAoeC7kuIDnuqflrprkvY0uc3RhcnRzV2l0aChcXFxcXFxcIkBqczpcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICBsaXN0ID0gdGhpcy5ldmFsSlNSdWxlKGh0bWwsIHgu5LiA57qn5a6a5L2NKTtcXFxcbiAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgbGlzdCA9IHBkZmEoaHRtbCwgeC7kuIDnuqflrprkvY0pO1xcXFxuICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZih4LuWkp+exu+WumuS9jSl7XFxcXG4gICAgICAgICAgaWYgKHgu5aSn57G75a6a5L2NLnN0YXJ0c1dpdGgoXFxcXFxcXCJAanM6XFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgbGlzdCA9IHRoaXMuZXZhbEpTUnVsZShodG1sLCB4LuWkp+exu+WumuS9jSk7XFxcXG4gICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgIGxpc3QgPSBbcGRmYShodG1sLCB4LuWkp+exu+WumuS9jSkuam9pbignXFxcXFxcXFxuJyldO1xcXFxuICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHZhciDkuIDnuqcgPSBsaXN0Lm1hcCgocykgPT4ge1xcXFxuICAgICAgICAgIHZhciBzbGlzdCA9IFtdO1xcXFxuICAgICAgICAgIGlmICghKFxcXFxcXFwi5bCP57G7XFxcXFxcXCIgaW4geCkpIHtcXFxcbiAgICAgICAgICAgIHgu5bCP57G7ID0gXFxcXFxcXCJib2R5JiZhOm5vdCg6bWF0Y2hlcyjpppbpobUpKTpub3QoYTpub3QoW2hyZWZdKSlcXFxcXFxcIjtcXFxcbiAgICAgICAgICB9XFxcXG4gICAgICAgICAgaWYgKHgu5bCP57G7LnN0YXJ0c1dpdGgoXFxcXFxcXCJAanM6XFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICBzbGlzdCA9IHRoaXMuZXZhbEpTUnVsZShzLCB4LuWwj+exuyk7XFxcXG4gICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHNsaXN0ID0gcGRmYShzLCB4LuWwj+exuyk7XFxcXG4gICAgICAgICAgfVxcXFxuICAgICAgICAgIHZhciDlrprkvY0gPSBzbGlzdC5tYXAoKGl0ZW0pID0+IHtcXFxcbiAgICAgICAgICAgIHZhciB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoaXRlbSwgeC7moIfpopgpO1xcXFxuICAgICAgICAgICAgdmFyIHVybCA9IHRoaXMuZ2V0VXJsKGl0ZW0sIHgpO1xcXFxuICAgICAgICAgICAgdmFyIG9iaiA9IHsgdGl0bGU6IHRpdGxlLCB1cmw6IHVybCB9O1xcXFxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7XFxcXG4gICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgcmV0dXJuIOWumuS9jTtcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIC8vbG9nKOS4gOe6pylcXFxcbiAgICAgICAgLy9sb2co5LiA57qnLmxlbmd0aClcXFxcbiAgICAgICAgaWYgKOS4gOe6py5sZW5ndGggPT0gMSkge1xcXFxuICAgICAgICAgIGNhdGVnb3JpZXMucHVzaCjkuIDnuqcuam9pbihcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiKSk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAg5LiA57qnLmZvckVhY2goKGl0ZW0pID0+IHtcXFxcbiAgICAgICAgICAgIGNhdGVnb3JpZXMucHVzaChpdGVtLmpvaW4oXFxcXFxcXCIsXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICAvL2xvZyhjYXRlZ29yaWVzKVxcXFxuICAgICAgfSk7XFxcXG4gICAgICBpZiAo5oqY5Y+g54q25oCBKSB7XFxcXG4gICAgICAgIGlmIChwYWdlID09IDEpIHtcXFxcbiAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGZvbGQgPT09IFxcXFxcXFwiMVxcXFxcXFwiID8g5oqY5Y+gIDog5bGV5byALFxcXFxuICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoXFxcXG4gICAgICAgICAgICAgIChmb2xkLCB1LCBhbGwpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihNWV9SVUxFLmdyb3VwLCBmb2xkID09PSBcXFxcXFxcIjFcXFxcXFxcIiA/IFxcXFxcXFwiMFxcXFxcXFwiIDogXFxcXFxcXCIxXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIC8qYWxsLmZvckVhY2goKGl0ZW0pID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaXRlbSk7XFxcXG4gICAgICAgICAgICAgICAgfSk7Ki9cXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICBmb2xkLFxcXFxuICAgICAgICAgICAgICDnirbmgIEsXFxcXG4gICAgICAgICAgICAgIOWFqOa4hVxcXFxuICAgICAgICAgICAgKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgIGxvbmdDbGljazogdGhpcy5hY3Rpb24oe1xcXFxuICAgICAgICAgICAgICAgIHN0YXRlOiDnirbmgIEsXFxcXG4gICAgICAgICAgICAgICAgYWxsOiDlhajmuIUsXFxcXG4gICAgICAgICAgICAgICAgY2w6IOa4hemZpCxcXFxcbiAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICB9XFxcXG4gICAgICBpZiAocGFnZSA9PSAxKSB7XFxcXG4gICAgICBjYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5LCBpbmRleCkgPT4ge1xcXFxuICAgICAgICAvL2xvZyhjYXRlZ29yaWVzKVxcXFxuICAgICAgICBsZXQgc3ViX2NhdGVnb3JpZXMgPSBbXTtcXFxcbiAgICAgICAgLyppZiAo5bCP57G75a6a5L2NLmluY2x1ZGVzKFxcXFxcXFwiO1xcXFxcXFwiKSkge1xcXFxuICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzID0gcGRmYShjYXRlZ29yeSwg5bCP57G75a6a5L2NLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVswXSk7XFxcXG4gICAgICAgICAgaWYgKHN1Yl9jYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XFxcXG4gICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHBkZmEoY2F0ZWdvcnksIOWwj+exu+WumuS9jS5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilbMV0pO1xcXFxuICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHsqL1xcXFxuICAgICAgICAvL2xvZyhpbmRleClcXFxcbiAgICAgICAgc3ViX2NhdGVnb3JpZXMgPSBKU09OLnBhcnNlKGBbJHtjYXRlZ29yeX1dYCk7XFxcXG4gICAgICAgIC8vIHN1Yl9jYXRlZ29yaWVzID0gcGRmYShjYXRlZ29yeSwg5bCP57G75a6a5L2NKTtcXFxcbiAgICAgICAgLy99XFxcXG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xcXFxuICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcXFxuXFxcXG4gICAgICAgICAgICAvL2xldCB0aXRsZSA9IHBkZmgoaXRlbSwgX+Wkp+exu+agh+mimCk7XFxcXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBpdGVtLnRpdGxlO1xcXFxuICAgICAgICAgICAgaWYgKHR5cGVvZiDmjpLpmaQgIT0gXFxcXFxcXCJ1bmRlZmluZWRcXFxcXFxcIiAmJiDmjpLpmaQgIT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UobmV3UmVnRXhwKOaOkumZpCwgXFxcXFxcXCJnXFxcXFxcXCIpLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxldCBqc29uPScnXFxcXG4gICAgICAgICAgICBqc29uID0gaXRlbS51cmw7XFxcXG4gICAgICAgICAgICBcXFxcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7XFxcXG4gICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcXFxuICAgICAgICAgICAgICBrZXk6IGtleSxcXFxcbiAgICAgICAgICAgICAgcGFnZTogcGFnZSxcXFxcbiAgICAgICAgICAgICAgY2xlYXJzOiDmuIXpmaQsXFxcXG4gICAgICAgICAgICAgIGpzb246IGpzb24sXFxcXG4gICAgICAgICAgICAgIHN0YXRlOiDnirbmgIEsXFxcXG4gICAgICAgICAgICAgIGFsbGNsZWFyczog5YWo5riFLFxcXFxuICAgICAgICAgICAgfTtcXFxcblxcXFxuICAgICAgICAgICAgLy9sZXQgdXJsID0gcGQoaXRlbSwgX+Wkp+exu+mTvuaOpSk7XFxcXG4gICAgICAgICAgICBsZXQgdXJsID0gaXRlbS51cmw7XFxcXG4gICAgICAgICAgICAvKmlmICjlpKfnsbvlpITnkIYpIHtcXFxcbiAgICAgICAgICAgICAgdXJsID0g5LiA57qn5YiG57G75aSE55CGKHVybCk7XFxcXG4gICAgICAgICAgICB9Ki9cXFxcbiAgICAgICAgICAgIC8vbG9nKHVybClcXFxcbiAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnNldFRpdGxlKGtleS50b1N0cmluZygpLCBjYXRlX3RlbXBbaW5kZXhdLCB0aXRsZSksXFxcXG4gICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiaGlrZXI6Ly9lbXB0eSNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgbmV3X2NhdGUgPSBbXTtcXFxcbiAgICAgICAgICAgICAgICBwYXJhbXMuY2xlYXJzLmZvckVhY2goKGl0ZW0pID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaXRlbSk7XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcGFyYW1zLmFsbGNsZWFycy5mb3JFYWNoKChpdGVtKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuXFxcXG4gICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcC5mb3JFYWNoKChjYXRlLCBpbmRleCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgbmV3X2NhdGUucHVzaChpbmRleCA9PT0gMCA/IHBhcmFtcy5rZXkudG9TdHJpbmcoKSA6IFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcImhlYWQuY2F0ZVxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShuZXdfY2F0ZSkpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuanNvbi5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XFxcXG4gICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcImR0X1xcXFxcXFwiICsgcGFyYW1zLmpzb24udHlwZSwgcGFyYW1zLmpzb24udmFsdWUpO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMuc3RhdGUsIHBhcmFtcy5qc29uKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICB9LCBwYXJhbXMpLFxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImJsYW5rX2Jsb2NrXFxcXFxcXCIsXFxcXG4gICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAoZm9sZCA9PT0gXFxcXFxcXCIxXFxcXFxcXCIgfHwg5oqY5Y+g54q25oCBID09IGZhbHNlKSB7XFxcXG4gICAgICAgICAgc3ViX2NhdGVnb3JpZXMuZm9yRWFjaCgoaXRlbSwga2V5KSA9PiB7XFxcXG4gICAgICAgICAgICB2YXIgZXh0cmFwb3MgPSBmYWxzZTtcXFxcbiAgICAgICAgICAgIC8qaWYgKGl0ZW0uaW5jbHVkZXMoJ3R5cGU9XFxcXFxcXCJAZXh0cmFcXFxcXFxcIicpKSB7XFxcXG4gICAgICAgICAgICAgIGV4dHJhcG9zID0gdHJ1ZTtcXFxcbiAgICAgICAgICAgICAgLy9sb2coJ+mZhOWKoOWumuS9jScpXFxcXG4gICAgICAgICAgICB9Ki9cXFxcblxcXFxuICAgICAgICAgICAgaWYgKGV4dHJhcG9zKSB7XFxcXG4gICAgICAgICAgICAgIHZhciB0aXRsZSA9IHBkZmgoaXRlbSwgXFxcXFxcXCJhJiZUZXh0XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICBpZiAodHlwZW9mIOaOkumZpCAhPSBcXFxcXFxcInVuZGVmaW5lZFxcXFxcXFwiICYmIOaOkumZpCAhPSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAo5o6S6ZmkLCBcXFxcXFxcImdcXFxcXFxcIiksIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgIHZhciBqc29uID0ge1xcXFxuICAgICAgICAgICAgICAgIHR5cGU6IHBkZmgoaXRlbSwgXFxcXFxcXCJhJiZzdGF0ZVxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcGRmaChpdGVtLCBcXFxcXFxcImEmJnZhbHVlXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgICB9O1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgLy92YXIgdGl0bGUgPSBwZGZoKGl0ZW0sIOWIhuexu+agh+mimCk7XFxcXG4gICAgICAgICAgICAgIHZhciB0aXRsZSA9IGl0ZW0udGl0bGU7XFxcXG4gICAgICAgICAgICAgIGlmICh0eXBlb2Yg5o6S6ZmkICE9IFxcXFxcXFwidW5kZWZpbmVkXFxcXFxcXCIgJiYg5o6S6ZmkICE9IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cCjmjpLpmaQsIFxcXFxcXFwiZ1xcXFxcXFwiKSwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgICB2YXIganNvbiA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgIC8qc3dpdGNoICh0cnVlKSB7XFxcXG4gICAgICAgICAgICAgICAgY2FzZSDliIbnsbvpk77mjqUuaW5jbHVkZXMoXFxcXFxcXCJAQEBcXFxcXFxcIik6XFxcXG4gICAgICAgICAgICAgICAgICBqc29uID0ge1xcXFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBwZGZoKGl0ZW0sIOWIhuexu+mTvuaOpS5zcGxpdChcXFxcXFxcIkBAQFxcXFxcXFwiKVswXSksXFxcXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwZGZoKGl0ZW0sIOWIhuexu+mTvuaOpS5zcGxpdChcXFxcXFxcIkBAQFxcXFxcXFwiKVsxXSksXFxcXG4gICAgICAgICAgICAgICAgICB9O1xcXFxuICAgICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICAgICAgY2FzZSDliIbnsbvpk77mjqUuaW5jbHVkZXMoXFxcXFxcXCJAQFxcXFxcXFwiKTpcXFxcbiAgICAgICAgICAgICAgICAgIGpzb24gPSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IOWIhuexu+mTvuaOpS5zcGxpdChcXFxcXFxcIkBAXFxcXFxcXCIpWzBdLFxcXFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcGRmaChpdGVtLCDliIbnsbvpk77mjqUuc3BsaXQoXFxcXFxcXCJAQFxcXFxcXFwiKVsxXSksXFxcXG4gICAgICAgICAgICAgICAgICB9O1xcXFxuICAgICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcXFxcbiAgICAgICAgICAgICAgICAgIGpzb24gPSBpdGVtLnVybDtcXFxcbiAgICAgICAgICAgICAgICAgIC8vIGpzb24gPSBwZChpdGVtLCDliIbnsbvpk77mjqUpO1xcXFxuICAgICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICAgIH0qL1xcXFxuICAgICAgICAgICAgICBqc29uID0gaXRlbS51cmw7XFxcXG4gICAgICAgICAgICAgIC8qdmFyIGpzb2495YiG57G76ZO+5o6lLmluY2x1ZGVzKCdAQEAnKT97XFxcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6cGRmaChpdGVtLOWIhuexu+mTvuaOpS5zcGxpdCgnQEBAJylbMF0pLFxcXFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTpwZGZoKGl0ZW0s5YiG57G76ZO+5o6lLnNwbGl0KCdAQEAnKVsxXSksXFxcXG4gICAgICAgICAgICAgICAgfTpwZChpdGVtLOWIhuexu+mTvuaOpSk7XFxcXG4gICAgICAgICAgICAgICAgXFxcXG4gICAgICAgICAgICAgICAganNvbj3liIbnsbvpk77mjqUuaW5jbHVkZXMoJ0BAJyk/e1xcXFxuICAgICAgICAgICAgICAgICAgICB0eXBlOuWIhuexu+mTvuaOpS5zcGxpdCgnQEAnKVswXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6cGRmaChpdGVtLOWIhuexu+mTvuaOpS5zcGxpdCgnQEAnKVsxXSksXFxcXG4gICAgICAgICAgICAgICAgfTpwZChpdGVtLOWIhuexu+mTvuaOpSk7Ki9cXFxcbiAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHtcXFxcbiAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsXFxcXG4gICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcXFxcbiAgICAgICAgICAgICAga2V5OiBrZXksXFxcXG4gICAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXFxcXG4gICAgICAgICAgICAgIGpzb246IGpzb24sXFxcXG4gICAgICAgICAgICAgIHN0YXRlOiDnirbmgIEsXFxcXG4gICAgICAgICAgICAgIGFsbGNsZWFyczog5YWo5riFLFxcXFxuICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnNldFRpdGxlKGtleS50b1N0cmluZygpLCBjYXRlX3RlbXBbaW5kZXhdLCB0aXRsZSksXFxcXG4gICAgICAgICAgICAgIHVybDogJChcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIiArIFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKHBhcmFtcykgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHBhcmFtcy5hbGxjbGVhcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihpdGVtKTtcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wW3BhcmFtcy5pbmRleF0gPSBwYXJhbXMua2V5LnRvU3RyaW5nKCk7XFxcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJoZWFkLmNhdGVcXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLmNhdGVfdGVtcCkpO1xcXFxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuanNvbi5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XFxcXG4gICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcImR0X1xcXFxcXFwiICsgcGFyYW1zLmpzb24udHlwZSwgcGFyYW1zLmpzb24udmFsdWUpO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMuc3RhdGUsIHBhcmFtcy5qc29uKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgIH0sIHBhcmFtcyksXFxcXG4gICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiLFxcXFxuICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgfSxcXFxcbiAgfTtcXFxcbiAgb2JqLumihOiuvihvcHRpb25zKTtcXFxcbiAgcmV0dXJuIG9iajtcXFxcbn1cXFxcblxcXFxuICAvLy7nirbmgIEoXFxcXFxcXCJ1cmxcXFxcXFxcIilcXFxcbiAgLy8u55WM6Z2iKGQpXFxcXG4gIC8vLua6kOeggSh4aHRtbClcXFxcbiAgLy8u5YWo5riFKFtcXFxcXFxcIjFcXFxcXFxcIiwgXFxcXFxcXCIyXFxcXFxcXCJdKVxcXFxuICAvLy7muIXpmaQoKVxcXFxuICAvLy7lvIDlkK/mipjlj6AoKVxcXFxuICAvLy7pobXnoIEocGFnZSlcXFxcbiAgLy8u5Yib5bu65Yqo5oCB5YiG57G7KOWumuS9jeWIl+ihqCk7XFxcXG5cXFxcbmZ1bmN0aW9uIGdldE9iamZ1YyhvYmopIHtcXFxcbiAgY29uc3QgbWV0aG9kcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikuZmlsdGVyKFxcXFxuICAgIChuYW1lKSA9PiB0eXBlb2Ygb2JqW25hbWVdID09PSBcXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCJcXFxcbiAgKTtcXFxcbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09IDApIHtcXFxcbiAgICBjb25zb2xlLmxvZyhvYmoudG9TdHJpbmcoKSk7XFxcXG4gICAgcmV0dXJuO1xcXFxuICB9XFxcXG4gIGNvbnN0IGZvcm1hdHRlZFN0cmluZyA9IG1ldGhvZHNcXFxcbiAgICAubWFwKChuYW1lKSA9PiB7XFxcXG4gICAgICBjb25zdCBmbiA9IG9ialtuYW1lXTtcXFxcbiAgICAgIGNvbnN0IGZuU3RyaW5nID0gYCR7bmFtZX06ICR7Zm4udG9TdHJpbmcoKX1gO1xcXFxuICAgICAgY29uc3QgcmVzdG9yZWRGblN0cmluZyA9IGZuU3RyaW5nLnJlcGxhY2UoXFxcXG4gICAgICAgIC9cXFxcXFxcXFxcXFxcXFxcdShbXFxcXFxcXFxkXFxcXFxcXFx3XXs0fSkvZ2ksXFxcXG4gICAgICAgIGZ1bmN0aW9uIChtYXRjaCwgZ3JwKSB7XFxcXG4gICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoZ3JwLCAxNikpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICApO1xcXFxuICAgICAgcmV0dXJuIHJlc3RvcmVkRm5TdHJpbmc7XFxcXG4gICAgfSlcXFxcbiAgICAuam9pbihcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiKTtcXFxcbiAgY29uc29sZS5sb2coZm9ybWF0dGVkU3RyaW5nKTtcXFxcbn1cXFxcblxcXFxuLypcXFxcbnZlciAyMDIzLTA2LTE2ICAxLjBcXFxcbiovXFxcXG52YXIg54q25oCBID1cXFxcbiAgdHlwZW9mIOeKtuaAgeagh+iusCAhPSBcXFxcXFxcInVuZGVmaW5lZFxcXFxcXFwiICYmIOeKtuaAgeagh+iusCAhPSBcXFxcXFxcIlxcXFxcXFwiID8g54q25oCB5qCH6K6wIDogTVlfUlVMRS51cmw7XFxcXG5cXFxcbmxldCBkdF9kZWJ1Zz1mYWxzZTsgIFxcXFxuICBcXFxcbmFkZExpc3RlbmVyKFxcXFxuICBcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIixcXFxcbiAgJC50b1N0cmluZygoKSA9PiB7fSlcXFxcbik7XFxcXG5cXFxcbnZhciBDcmVhdGUgPSB7XFxcXG4gIHNwYWdlOiB7XFxcXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XFxcXG4gICAgICByZXR1cm4gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcXFxcXCJzcGFnZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICB9LFxcXFxuICAgIHNldDogZnVuY3Rpb24gKHVybCkge1xcXFxuICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcXFxcXCJzcGFnZVxcXFxcXFwiLCB1cmwpO1xcXFxuICAgIH0sXFxcXG4gIH0sXFxcXG4gIG5leHRQYWdlOiBmdW5jdGlvbiAoKSB7XFxcXG4gICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICB2YXIgbmV4dCA9IGV2YWwo5LiL5LiA6aG1KTtcXFxcbiAgICAgIC8vbG9nKCduOicrbmV4dClcXFxcbiAgICAgIGlmKG5leHQgPT1cXFxcXFxcIlxcXFxcXFwiKXtcXFxcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCfkuIvkuIDpobXpk77mjqXkuLrnqbonKVxcXFxuICAgICAgfVxcXFxuICAgICAgcmVzdWx0PXRydWU7XFxcXG4gICAgICBpZih0cnVlX3VybD09bmV4dCl7XFxcXG4gICAgICAgICByZXN1bHQ9ZmFsc2U7XFxcXG4gICAgICB9XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgLy9sb2coXFxcXFxcXCLlj6/og73kuI3lrZjlnKjkuIvkuIDpobXmiJbogIXkuIvkuIDpobXlrprkvY3mnInpl67pophcXFxcXFxcIik7XFxcXG4gICAgICBsb2coXFxcXFxcXCLplJnor6/kv6Hmga86XFxcXFxcXCIgKyBlLm1lc3NhZ2UpO1xcXFxuICAgIH1cXFxcbiAgICBpZiAoKG5leHQgPT0gXFxcXFxcXCJcXFxcXFxcIiB8fCBuZXh0ID09IHVuZGVmaW5lZCkgJiYgcGFnZSA9PSAxKSB7XFxcXG4gICAgICBuZXh0ID0gdHJ1ZV91cmw7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgIC8vcmVzdWx0PWZhbHNlO1xcXFxuICAgICAgbmV4dCA9IGdldE15VmFyKOeKtuaAgSk7XFxcXG4gICAgfVxcXFxuICAgIC8vbG9nKCdsJyt0cnVlX3VybClcXFxcbiAgICAvL2xvZygnbicrbmV4dClcXFxcbiAgICBpZihwYWdlIT0xKXtcXFxcbiAgICBpZiAodHJ1ZV91cmwgPT0gbmV4dCYmIXJlc3VsdCkge1xcXFxuICAgICAgcmVzdWx0ID0gZmFsc2U7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgIHJlc3VsdCA9IHRydWU7XFxcXG4gICAgIH1cXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIHJlc3VsdDtcXFxcbiAgICAvL3B1dE15VmFyKOeKtuaAgSwgbmV4dCk7XFxcXG4gIH0sXFxcXG4gIGdldEJhY2tJbWFnZTogZnVuY3Rpb24gKGltZ3VybCkge1xcXFxuICAgIHZhciByZXN1bHQgPSBpbWd1cmw7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgIHJlc3VsdCA9IC91cmwoPzpcXFxcXFxcXHMrKT9cXFxcXFxcXCgoLio/KVxcXFxcXFxcKS9nXFxcXG4gICAgICAgIC5leGVjKGltZ3VybClbMV1cXFxcbiAgICAgICAgLnJlcGxhY2UoLygnfFxcXFxcXFwifCZxdW90OykvZ20sIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgIH0gY2F0Y2gge31cXFxcbiAgICByZXR1cm4gcmVzdWx0O1xcXFxuICB9LFxcXFxuICBodHRwSGFuZGxlOiBmdW5jdGlvbiAoaW5wdXQpIHtcXFxcbiAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFxcXFxcImh0dHBcXFxcXFxcIikpIHtcXFxcbiAgICAgIHJldHVybiBpbnB1dDtcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXFxcXFxcXCIvL1xcXFxcXFwiKSkge1xcXFxuICAgICAgcmV0dXJuIFxcXFxcXFwiaHR0cHM6XFxcXFxcXCIgKyBpbnB1dDtcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXFxcXFxcXCIvXFxcXFxcXCIpKSB7XFxcXG4gICAgICByZXR1cm4gTVlfSE9NRSArIGlucHV0O1xcXFxuICAgIH1cXFxcbiAgfSxcXFxcbiAgaW1nSGFuZGxlOiBmdW5jdGlvbiAoaXRlbSwgcnVsZSkge1xcXFxuICAgIHZhciBpbWcgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIGlmIChydWxlLmltZy5zdGFydHNXaXRoKFxcXFxcXFwicGRcXFxcXFxcIikpIHtcXFxcbiAgICAgIGltZyA9IGV2YWwocnVsZS5pbWcpO1xcXFxuICAgIH0gZWxzZSBpZiAocnVsZS5iYWNraW1nKSB7XFxcXG4gICAgICBpbWcgPSBwZGZoKGl0ZW0sIHJ1bGUuaW1nKTtcXFxcbiAgICAgIGltZyA9IHRoaXMuZ2V0QmFja0ltYWdlKGltZyk7XFxcXG4gICAgICBpbWcgPSB0aGlzLmh0dHBIYW5kbGUoaW1nKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgaW1nID0gcGRmaChpdGVtLCBydWxlLmltZyk7XFxcXG4gICAgICBpZiAoIWltZy5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cFxcXFxcXFwiKSkge1xcXFxuICAgICAgICBpbWcgPSBwZChpdGVtLCBydWxlLmltZyk7XFxcXG4gICAgICAgIGltZyA9IHRoaXMuaHR0cEhhbmRsZShpbWcpO1xcXFxuICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gaW1nICsgcnVsZS5yZWY7XFxcXG4gIH0sXFxcXG4gIHVybEhhbmRsZTogZnVuY3Rpb24gKGl0ZW0sIHJ1bGUpIHtcXFxcbiAgICB2YXIgaHJlZiA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgaWYgKHJ1bGUudXJsLnN0YXJ0c1dpdGgoXFxcXFxcXCJwZFxcXFxcXFwiKSkge1xcXFxuICAgICAgaHJlZiA9IGV2YWwocnVsZS51cmwpO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICBocmVmID0gcGQoaXRlbSwgcnVsZS51cmwpO1xcXFxuICAgIH1cXFxcbiAgICBocmVmID0gcnVsZS5pbXQgPyBocmVmICsgXFxcXFxcXCIjaW1tZXJzaXZlVGhlbWUjXFxcXFxcXCIgOiBocmVmO1xcXFxuICAgIHJldHVybiBocmVmO1xcXFxuICB9LFxcXFxuICBzZXRDb250ZW50OiBmdW5jdGlvbiAoaXRlbSwgaW5wdXQpIHtcXFxcbiAgICBsZXQgb3V0cHV0ID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICBpZiAoaW5wdXQgPT0gdW5kZWZpbmVkKSB7XFxcXG4gICAgICByZXR1cm4gb3V0cHV0O1xcXFxuICAgIH1cXFxcbiAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFxcXFxcInBkXFxcXFxcXCIpKSB7XFxcXG4gICAgICBvdXRwdXQgPSBldmFsKGlucHV0KTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgb3V0cHV0ID0gcGRmaChpdGVtLCBpbnB1dCk7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBvdXRwdXQ7XFxcXG4gIH0sXFxcXG4gIHJlZnJlc2g6IGZ1bmN0aW9uICgpIHtcXFxcbiAgICBhZGRMaXN0ZW5lcihcXFxcbiAgICAgIFxcXFxcXFwib25SZWZyZXNoXFxcXFxcXCIsXFxcXG4gICAgICAkLnRvU3RyaW5nKCh1KSA9PiB7XFxcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJ5aWxpc3RcXFxcXFxcIik7XFxcXG4gICAgICAgIC8vdmFyIHAgPSBzdG9yYWdlMC5nZXRNeVZhcignc3BhZ2UnLCAnJyk7XFxcXG4gICAgICAgIC8vcHV0TXlWYXIodSwgcCk7XFxcXG4gICAgICB9LCDnirbmgIEpXFxcXG4gICAgKTtcXFxcbiAgfSxcXFxcbiAganNvbkxpc3Q6IGZ1bmN0aW9uIChhcnIsIGpzb24sIHJ1bGUpIHtcXFxcbiAgICBpZiAoanNvbi5jb25zdHJ1Y3RvciAhPSBPYmplY3QpIHtcXFxcbiAgICAgIHRyeSB7XFxcXG4gICAgICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pO1xcXFxuICAgICAgfSBjYXRjaCB7fVxcXFxuICAgIH1cXFxcbiAgICBqc29uW3J1bGUubGlzdF0uZm9yRWFjaCgoaXRlbSkgPT4ge1xcXFxuICAgICAgdmFyIGltZyA9IGV2YWwocnVsZS5pbWcpICsgcnVsZS5yZWY7XFxcXG4gICAgICB2YXIgaHJlZiA9IGV2YWwocnVsZS51cmwpO1xcXFxuICAgICAgaHJlZiA9IHJ1bGUuaW10ID8gaHJlZiArIFxcXFxcXFwiI2ltbWVyc2l2ZVRoZW1lI1xcXFxcXFwiIDogaHJlZjtcXFxcbiAgICAgIHZhciBsYXp5ID0gcnVsZS5sYXp5ID8gcnVsZS5sYXp5IDogXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgIHZhciBkZCA9IHtcXFxcbiAgICAgICAgdGl0bGU6IGV2YWwocnVsZS50aXRsZSksXFxcXG4gICAgICAgIGRlc2M6IGV2YWwocnVsZS5kZXNjKSxcXFxcbiAgICAgICAgY29udGVudDogZXZhbChydWxlLmNvbnRlbnQpLFxcXFxuICAgICAgICBwaWNfdXJsOiBpbWcsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5IyNcXFxcXFxcIiArIGhyZWYsXFxcXG4gICAgICAgIGNvbF90eXBlOiBydWxlLmNvbF90eXBlLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgIGltZzogaW1nLFxcXFxuICAgICAgICB9LFxcXFxuICAgICAgfTtcXFxcbiAgICAgIGlmIChsYXp5ICE9IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgZGRbXFxcXFxcXCJ1cmxcXFxcXFxcIl0gPSBocmVmICsgbGF6eTtcXFxcbiAgICAgIH1cXFxcbiAgICAgIGFyci5wdXNoKGRkKTtcXFxcbiAgICB9KTtcXFxcbiAgfSxcXFxcbiAgcnVsZUxpc3Q6IGZ1bmN0aW9uIChhcnIsIGh0bWwsIHJ1bGUpIHtcXFxcbiAgICB2YXIgbGlzdCA9IHBkZmEoaHRtbCwgcnVsZS5saXN0KTtcXFxcbiAgICBsaXN0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXFxcbiAgICAgIHZhciB0aXRsZSA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLnRpdGxlKTtcXFxcbiAgICAgIHZhciBkZXNjID0gdGhpcy5zZXRDb250ZW50KGl0ZW0sIHJ1bGUuZGVzYyk7XFxcXG4gICAgICB2YXIgaW1nID0gdGhpcy5pbWdIYW5kbGUoaXRlbSwgcnVsZSk7XFxcXG4gICAgICB2YXIgdXJsID0gdGhpcy51cmxIYW5kbGUoaXRlbSwgcnVsZSk7XFxcXG4gICAgICB2YXIgY29udGVudCA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLmNvbnRlbnQpO1xcXFxuICAgICAgdmFyIGxhenkgPSBydWxlLmxhenkgPyBydWxlLmxhenkgOiBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgdmFyIGRkID0ge1xcXFxuICAgICAgICB0aXRsZTogdGl0bGUsXFxcXG4gICAgICAgIGRlc2M6IGRlc2MsXFxcXG4gICAgICAgIHBpY191cmw6IGltZyxcXFxcbiAgICAgICAgdXJsOiB1cmwsXFxcXG4gICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXFxcXG4gICAgICAgIGNvbF90eXBlOiBydWxlLmNvbF90eXBlLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgIGltZzogaW1nLFxcXFxuICAgICAgICB9LFxcXFxuICAgICAgfTtcXFxcbiAgICAgIGlmIChsYXp5ICE9IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgZGRbXFxcXFxcXCJ1cmxcXFxcXFxcIl0gPSB1cmwgKyBsYXp5O1xcXFxuICAgICAgfVxcXFxuICAgICAgYXJyLnB1c2goZGQpO1xcXFxuICAgIH0pO1xcXFxuICB9LFxcXFxuICBMaXN0OiBmdW5jdGlvbiAoYXJyLCBodG1sLCBydWxlLCBwYXJhbSkge1xcXFxuICAgIHBhcmFtID0gcGFyYW0gPyBwYXJhbSA6IHt9O1xcXFxuICAgIHZhciBhdXRvID0gcGFyYW0uYXV0byA/IHBhcmFtLmF1dG8gOiBmYWxzZTtcXFxcbiAgICB2YXIgc2hvdyA9IHBhcmFtLnNob3cgPyBwYXJhbS5zaG93IDogZmFsc2U7XFxcXG4gICAgaWYgKHBhZ2UgPT0gMSkge1xcXFxuICAgICAgLy90aGlzLnNwYWdlLnNldCh0cnVlX3VybCk7XFxcXG4gICAgfVxcXFxuICAgIHRoaXMucmVmcmVzaCgpO1xcXFxuICAgIHZhciBsaXN0ID0gcGRmYShodG1sLCBydWxlLmxpc3QpO1xcXFxuICAgIC8vbG9nKHRoaXMubmV4dFBhZ2UoKSlcXFxcbiAgICBpZiAoKHN0b3JhZ2UwLmdldE15VmFyKCd5aV9pc25leHQnLCd0Jyk9PSd0JyYmbGlzdC5sZW5ndGggPiAwKSB8fCBwYWdlID09IDEpIHtcXFxcbiAgICAgIGxpc3QuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcXFxuICAgICAgICBkZWxldGVJdGVtKFxcXFxcXFwicGFnZW51bVxcXFxcXFwiKTtcXFxcbiAgICAgICAgZGVsZXRlSXRlbShcXFxcXFxcInBhZ2VsaW5lXFxcXFxcXCIpO1xcXFxuICAgICAgICB2YXIgaWQgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICB2YXIgY2xzID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5zZXRDb250ZW50KGl0ZW0sIHJ1bGUudGl0bGUpO1xcXFxuICAgICAgICB2YXIgZGVzYyA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLmRlc2MpO1xcXFxuICAgICAgICB2YXIgaW1nID0gdGhpcy5pbWdIYW5kbGUoaXRlbSwgcnVsZSk7XFxcXG4gICAgICAgIHZhciB1cmwgPSB0aGlzLnVybEhhbmRsZShpdGVtLCBydWxlKTtcXFxcbiAgICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLnNldENvbnRlbnQoaXRlbSwgcnVsZS5jb250ZW50KTtcXFxcbiAgICAgICAgaWYgKGkgPT0gbGlzdC5sZW5ndGggLSAxKSB7XFxcXG4gICAgICAgICAgaWQgPSBcXFxcXFxcImxhc3RpZF9cXFxcXFxcIiArIHBhZ2U7XFxcXG4gICAgICAgICAgY2xzID0gXFxcXFxcXCJsYXN0bWFya1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgdGl0bGU6IHRpdGxlLFxcXFxuICAgICAgICAgIGRlc2M6IGRlc2MsXFxcXG4gICAgICAgICAgcGljX3VybDogaW1nLFxcXFxuICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvZXI/dXJsPVxcXFxcXFwiICsgdXJsLFxcXFxuICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXFxcXG4gICAgICAgICAgY29sX3R5cGU6IHJ1bGUuY29sX3R5cGUsXFxcXG4gICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXFxcbiAgICAgICAgICAgIGltZzogaW1nLFxcXFxuICAgICAgICAgICAgaWQ6IGlkLFxcXFxuICAgICAgICAgICAgY2xzOiBjbHMsXFxcXG4gICAgICAgICAgfSxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGlmIChpID09IGxpc3QubGVuZ3RoIC0gMSAmJiBzaG93KSB7XFxcXG4gICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgIGlkOiBcXFxcXFxcInBhZ2VsaW5lXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgIH0pO1xcXFxuXFxcXG4gICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnTxzbWFsbD7liqDovb3kuK0uLi48L3NtYWxsPlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgIGlkOiBcXFxcXFxcInBhZ2VudW1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgIH0pO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICB1cGRhdGVJdGVtKFxcXFxcXFwicGFnZW51bVxcXFxcXFwiLCB7XFxcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9XFxcXFxcXCJncmV5XFxcXFxcXCI+PHNtYWxsPuWIsOW6leS6hjwvc21hbGw+PC9mb250PicsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICBpZDogXFxcXFxcXCJsYXN0XFxcXFxcXCIsXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDAgJiYgcGFnZSA9PSAxKSB7XFxcXG4gICAgICBkLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCIsXFxcXG4gICAgICB9KTtcXFxcbiAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9XFxcXFxcXCJncmV5XFxcXFxcXCI+PHNtYWxsPuaXoOWGheWuuTwvc21hbGw+PC9mb250PicsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHt9LFxcXFxuICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIGlmKHRoaXMubmV4dFBhZ2UoKSl7XFxcXG4gICAgICAvL2xvZygndCcpO1xcXFxuICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcigneWlfaXNuZXh0JywndCcpO1xcXFxuICAgIH1lbHNle1xcXFxuICAgICAgLy9sb2coJ2YnKTtcXFxcbiAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoJ3lpX2lzbmV4dCcsJ2YnKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGF1dG8pIHtcXFxcbiAgICAgIC8vY3JlYXRlTmV4dFBhZ2UoKTtcXFxcbiAgICAgIGF1dG9QYWdlKCk7XFxcXG4gICAgfVxcXFxuICB9LFxcXFxufTtcXFxcblxcXFxudmFyIGV4dE1ldGhvZCA9IHtcXFxcbiAgVG9QYXJhbXM6IGZ1bmN0aW9uICgpIHtcXFxcbiAgICB2YXIganNvbiA9IGFyZ3VtZW50c1swXTtcXFxcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoanNvbilcXFxcbiAgICAgIC5tYXAoKGtleSkgPT4ga2V5ICsgXFxcXFxcXCI9XFxcXFxcXCIgKyBqc29uW2tleV0pXFxcXG4gICAgICAuam9pbihcXFxcXFxcIiZcXFxcXFxcIik7XFxcXG4gIH0sXFxcXG4gIHVybFBhcnNlOiBmdW5jdGlvbiAodSkge1xcXFxuICAgIHZhciBkaWN0ID0ge307XFxcXG4gICAgZGljdC5Tb3VyY2UgPSB1O1xcXFxuICAgIGxldCBwYXJhbXMgPSAodXJsKSA9PiB7XFxcXG4gICAgICBsZXQgcXVlcnlQYXJhbXMgPSB7fTtcXFxcbiAgICAgIGxldCByZWcgPSAvKFtePz0mXSspPShbXj89Jl0rKS9nO1xcXFxuICAgICAgdXJsLnJlcGxhY2UocmVnLCBmdW5jdGlvbiAoKSB7XFxcXG4gICAgICAgIHF1ZXJ5UGFyYW1zW2FyZ3VtZW50c1sxXV0gPSBhcmd1bWVudHNbMl07XFxcXG4gICAgICB9KTtcXFxcbiAgICAgIHJldHVybiBxdWVyeVBhcmFtcztcXFxcbiAgICB9O1xcXFxuICAgIHZhciBqYXZhVXJsID0gSmF2YUltcG9ydGVyKGphdmEubmV0LlVSTCk7XFxcXG4gICAgd2l0aCAoamF2YVVybCkge1xcXFxuICAgICAgdmFyIHVybCA9IG5ldyBVUkwodSk7XFxcXG4gICAgICBkaWN0LlByb3RvY29sID0gdXJsLmdldFByb3RvY29sKCk7XFxcXG4gICAgICBkaWN0Lkhvc3QgPSB1cmwuZ2V0SG9zdCgpO1xcXFxuICAgICAgZGljdC5Qb3J0ID0gdXJsLmdldFBvcnQoKTtcXFxcbiAgICAgIGRpY3QuRmlsZSA9IHVybC5nZXRGaWxlKCk7XFxcXG4gICAgICBkaWN0LlBhdGggPSB1cmwuZ2V0UGF0aCgpO1xcXFxuICAgICAgZGljdC5SZWYgPSB1cmwuZ2V0UmVmKCk7XFxcXG4gICAgICBkaWN0Lkhvc3RzID0gYCR7ZGljdC5Qcm90b2NvbH06Ly8ke3VybC5nZXRIb3N0KCl9YDtcXFxcbiAgICB9XFxcXG4gICAgZGljdC5QYXJhbXMgPSBwYXJhbXModSk7XFxcXG4gICAgcmV0dXJuIGRpY3Q7XFxcXG4gIH0sXFxcXG4gIGlzRXF1YWw6IGZ1bmN0aW9uICh4LCB5KSB7XFxcXG4gICAgY29uc3Qgb2sgPSBPYmplY3Qua2V5cyxcXFxcbiAgICAgIHR4ID0gdHlwZW9mIHgsXFxcXG4gICAgICB0eSA9IHR5cGVvZiB5O1xcXFxuICAgIHJldHVybiB4ICYmIHkgJiYgdHggPT09IFxcXFxcXFwib2JqZWN0XFxcXFxcXCIgJiYgdHggPT09IHR5XFxcXG4gICAgICA/IG9rKHgpLmxlbmd0aCA9PT0gb2soeSkubGVuZ3RoICYmXFxcXG4gICAgICAgICAgb2soeCkuZXZlcnkoKGtleSkgPT4gdGhpcy5pc0VxdWFsKHhba2V5XSwgeVtrZXldKSlcXFxcbiAgICAgIDogeCA9PT0geTtcXFxcbiAgfSxcXFxcbiAgZmluZERpZmZlcmVudEluZGV4OiBmdW5jdGlvbiAoc3RyMSwgc3RyMikge1xcXFxuICAgIGNvbnN0IGRpZmZDaGFycyA9IFtdO1xcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyMi5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgaWYgKHN0cjFbaV0gIT09IHN0cjJbaV0pIHtcXFxcbiAgICAgICAgZGlmZkNoYXJzLnB1c2goe1xcXFxuICAgICAgICAgIGluZGV4OiBpLFxcXFxuICAgICAgICAgIHMxOiBzdHIxW2ldLFxcXFxuICAgICAgICAgIHMyOiBzdHIyW2ldLFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIGRpZmZDaGFycztcXFxcbiAgfSxcXFxcbiAgcmVwbGFjZUNoYXJBdDogZnVuY3Rpb24gKHN0ciwgaW5kZXgsIHJlcGxhY2VtZW50KSB7XFxcXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzdHIubGVuZ3RoKSB7XFxcXG4gICAgICByZXR1cm4gc3RyO1xcXFxuICAgIH1cXFxcbiAgICAvL2xvZyhpbmRleClcXFxcbiAgICBjb25zdCBhcnIgPSBzdHIuc3BsaXQoXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgYXJyW2luZGV4XSA9IHJlcGxhY2VtZW50O1xcXFxuICAgIHJldHVybiBhcnIuam9pbihcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgfSxcXFxcbiAgZ2V0T2JqZWN0S2V5c0RpZmY6ZnVuY3Rpb24ob2JqMSwgb2JqMikge1xcXFxuICBjb25zdCBkaWZmZXJlbnRLZXlzID0gW107XFxcXG4gIGZvciAobGV0IGtleSBpbiBvYmoxKSB7XFxcXG4gICAgaWYgKCFvYmoyLmhhc093blByb3BlcnR5KGtleSkgfHwgb2JqMVtrZXldICE9PSBvYmoyW2tleV0pIHtcXFxcbiAgICAgIGRpZmZlcmVudEtleXMucHVzaChrZXkpO1xcXFxuICAgIH1cXFxcbiAgfVxcXFxuICBmb3IgKGxldCBrZXkgaW4gb2JqMikge1xcXFxuICAgIGlmICghb2JqMS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XFxcXG4gICAgICBkaWZmZXJlbnRLZXlzLnB1c2goa2V5KTtcXFxcbiAgICB9XFxcXG4gIH1cXFxcbiAgcmV0dXJuIGRpZmZlcmVudEtleXM7XFxcXG4gIH0sXFxcXG4gIGdldE5leHRVcmw6IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCwgcGFyYW1zKSB7XFxcXG4gICAgdmFyIHUxID0gdGhpcy51cmxQYXJzZShzb3VyY2UpO1xcXFxuICAgIHZhciB1MiA9IHRoaXMudXJsUGFyc2UodGFyZ2V0KTtcXFxcbiAgICB2YXIgcGEgPSB1bmRlZmluZWQ7XFxcXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT0gXFxcXFxcXCJvYmplY3RcXFxcXFxcIikge1xcXFxuICAgICAgcGEgPSBwYXJhbXMuaGFzT3duUHJvcGVydHkoXFxcXFxcXCLnibnlvoFcXFxcXFxcIikgPyBwYXJhbXMu54m55b6BIDogdW5kZWZpbmVkO1xcXFxuICAgIH1cXFxcbiAgICB2YXIgbmV4dHVybCA9IHNvdXJjZTtcXFxcbiAgICB2YXIgY2EgPSBPYmplY3Qua2V5cyh1Mi5QYXJhbXMpLmxlbmd0aCA9PSAwID8gXFxcXFxcXCJcXFxcXFxcIiA6IFxcXFxcXFwiP1xcXFxcXFwiO1xcXFxuICAgIGlmIChwYSAhPSB1bmRlZmluZWQpIHtcXFxcbiAgICAgIHZhciBycyA9IFN0cmluZyh1Mi5QYXRoKS5yZXBsYWNlKG5ldyBSZWdFeHAocGEpLCBcXFxcXFxcIiQxZnlwYWdlXFxcXFxcXCIpO1xcXFxuICAgICAgbmV4dHVybCA9IHUyLkhvc3RzICsgcnMgKyBjYSArIHRoaXMuVG9QYXJhbXModTIuUGFyYW1zKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgaWYgKHRoaXMuaXNFcXVhbCh1MS5QYXJhbXMsIHUyLlBhcmFtcykpIHtcXFxcbiAgICAgICAgaWYoZHRfZGVidWcpe1xcXFxuICAgICAgICBsb2codTEuUGF0aCk7XFxcXG4gICAgICAgIGxvZyh1Mi5QYXRoKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB2YXIgZGYgPSB0aGlzLmZpbmREaWZmZXJlbnRJbmRleChTdHJpbmcodTEuUGF0aCksIFN0cmluZyh1Mi5QYXRoKSk7XFxcXG4gICAgICAgIGlmKGR0X2RlYnVnKXtcXFxcbiAgICAgICAgbG9nKGRmKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoZGYubGVuZ3RoID09IDEpIHtcXFxcbiAgICAgICAgICB2YXIgcmUgPSBkZlswXS5pbmRleDtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICB2YXIgZiA9IGRmLmZpbHRlcigoeCkgPT4gL1xcXFxcXFxcZCsvLnRlc3QoeC5zMikpO1xcXFxuICAgICAgICAgIHZhciByZSA9IGZbMF0uaW5kZXg7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdmFyIGVxID0gdGhpcy5yZXBsYWNlQ2hhckF0KFN0cmluZyh1Mi5QYXRoKSwgcmUsIFxcXFxcXFwiZnlwYWdlXFxcXFxcXCIpO1xcXFxuICAgICAgICBuZXh0dXJsID0gdTIuSG9zdHMgKyBlcSArIGNhICsgdGhpcy5Ub1BhcmFtcyh1Mi5QYXJhbXMpO1xcXFxuICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgdmFyIGVwPXRoaXMuZ2V0T2JqZWN0S2V5c0RpZmYodTEuUGFyYW1zLHUyLlBhcmFtcylcXFxcbiAgICAgICAgaWYoZXAubGVuZ3RoPT0xKXtcXFxcbiAgICAgICAgICB1MS5QYXJhbXNbZXBbMF1dPSdmeXBhZ2UnXFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgIGxvZyhlcCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdmFyIGVxID0gU3RyaW5nKHUxLlBhdGgpLnJlcGxhY2UoL1xcXFxcXFxcZCsvLCBcXFxcXFxcImZ5cGFnZVxcXFxcXFwiKTtcXFxcbiAgICAgICAgbmV4dHVybCA9IHUxLkhvc3RzICsgZXEgKyBjYSArIHRoaXMuVG9QYXJhbXModTEuUGFyYW1zKTtcXFxcbiAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgLy9sb2coJ25leHQ6JytuZXh0dXJsKVxcXFxuICAgIHJldHVybiBuZXh0dXJsO1xcXFxuICB9LFxcXFxufTtcXFxcblxcXFxuZnVuY3Rpb24gZ2V0VHJ1ZWxpbmsobWFyaywgdXJsLCBwYWdlKSB7XFxcXG4gIHZhciBwID0gZ2V0TXlWYXIobWFyaywgdXJsKS5yZXBsYWNlKFxcXFxcXFwiZnlwYWdlXFxcXFxcXCIsIHBhZ2UpO1xcXFxuICBpZiAocGFnZSA9PSAxKSB7XFxcXG4gICAgcmV0dXJuIGdldE15VmFyKFxcXFxcXFwieWlfZmlyc3RwYWdlXFxcXFxcXCIsIHApO1xcXFxuICB9IGVsc2UgaWYgKHAgIT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgIHJldHVybiBwO1xcXFxuICB9IGVsc2Uge1xcXFxuICAgIHJldHVybiB1cmw7XFxcXG4gIH1cXFxcbn1cXFxcbi8v5p6E5bu6XFxcXG5mdW5jdGlvbiBjcmVhdGVOZXh0UGFnZSgpIHtcXFxcbiAgbGV0IHN0YXJ0bnVtID0gMTtcXFxcbiAgdmFyIG9iaiA9IGFyZ3VtZW50c1swXTtcXFxcbiAgaWYgKHRydWVfdXJsICE9IGdldE15VmFyKFxcXFxcXFwieWlfcGFnZXVybFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSkge1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCJ5aV9wYWdldXJsXFxcXFxcXCIpO1xcXFxuICB9XFxcXG4gIGlmIChwYWdlID09IHN0YXJ0bnVtICYmIGdldE15VmFyKFxcXFxcXFwieWlfcGFnZXVybFxcXFxcXFwiKSA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgcHV0TXlWYXIoXFxcXFxcXCJ5aV9maXJzdHBhZ2VcXFxcXFxcIiwgdHJ1ZV91cmwpO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICB2YXIgbmV4dCA9IGV2YWwo5LiL5LiA6aG1KTtcXFxcbiAgICAgIC8vbG9nKFxcXFxcXFwibmV4dFxcXFxcXFwiKTtcXFxcbiAgICAgIC8vbG9nKG5leHQpO1xcXFxuICAgIH0gY2F0Y2gge1xcXFxuICAgICAgbG9nKFxcXFxcXFwi5Y+v6IO95LiN5a2Y5Zyo5LiL5LiA6aG15oiW6ICF5LiL5LiA6aG15a6a5L2N5pyJ6Zeu6aKYXFxcXFxcXCIpO1xcXFxuICAgICAgbmV4dCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgfVxcXFxuICAgIGlmIChuZXh0ICE9IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgIHZhciBueHVybCA9IGV4dE1ldGhvZC5nZXROZXh0VXJsKHRydWVfdXJsLCBuZXh0LCBvYmopO1xcXFxuICAgICAgLy9sb2coXFxcXFxcXCJueHVybDpcXFxcXFxcIiArIG54dXJsKTtcXFxcbiAgICAgIHB1dE15VmFyKOeKtuaAgSwgbnh1cmwpO1xcXFxuICAgICAgcHV0TXlWYXIoXFxcXFxcXCJ5aV9wYWdldXJsXFxcXFxcXCIsIG54dXJsKTtcXFxcbiAgICB9XFxcXG4gIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gYXV0b1BhZ2UoKSB7XFxcXG4gIGlmKHBhZ2U9PTEpe1xcXFxuICAgIHB1dE15VmFyKFxcXFxcXFwieWlfZmlyc3RwYWdlXFxcXFxcXCIsIHRydWVfdXJsKTtcXFxcbiAgICB9XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgIHZhciBuZXh0ID0gZXZhbCjkuIvkuIDpobUpO1xcXFxuICAgICAgLy9sb2coXFxcXFxcXCJuZXh0XFxcXFxcXCIpO1xcXFxuICAgICAgLy9sb2coJ25leHQ6JytuZXh0KTtcXFxcbiAgICB9IGNhdGNoIHtcXFxcbiAgICAgIGxvZyhcXFxcXFxcIuWPr+iDveS4jeWtmOWcqOS4i+S4gOmhteaIluiAheS4i+S4gOmhteWumuS9jeaciemXrumimFxcXFxcXFwiKTtcXFxcbiAgICAgIG5leHQgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIH1cXFxcbiAgICBpZiAobmV4dCAhPSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICBwdXRNeVZhcijnirbmgIEsIG5leHQpO1xcXFxuICAgIH1cXFxcbn1cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLop6PmnpBcXFwiLFxcXCJwYXRoXFxcIjpcXFwibGF6eVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJ2YXIgbGF6eSA9ICQoJycpLmxhenlSdWxlKChNWV9IT01FKSA9PiB7XFxcXG4gICAgdmFyIGlucCA9IGZldGNoKGlucHV0LHt9KTtcXFxcbiAgICB2YXIgaHRtbCA9IHBkZmgoaW5wLCAnc291cmNlJiZzcmMnKTtcXFxcbiAgICB2YXIgcGljID0gcGRmaChpbnAsICcubWVzc2FnZSYmaW1nLC0xJiZkYXRhLWxhenktc3JjJylcXFxcbiAgICBpZihodG1sKXtcXFxcbiAgICAgdXJsID0gaHRtbC5tYXRjaCgvaHR0cD9bXlxcXFxcXFxcc10rLylbMF1cXFxcbiAgICAgcmV0dXJuIHVybFxcXFxuICAgICAgICAgfSBpZihwaWMpIHtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwicGljczovL1xcXFxcXFwiK3BkZmEoaW5wLCAnLm1lc3NhZ2UmJmltZycpLm1hcChpbWcgPT5wZChpbWcsICdpbWcmJmRhdGEtbGF6eS1zcmMnKStcXFxcXFxcIkBSZWZlcmVyPVxcXFxcXFwiLCkuam9pbihcXFxcXFxcIiYmXFxcXFxcXCIpXFxcXG4gICAgIH1lbHNle1xcXFxuICAgICByZXR1cm4gJ3RvYXN0Oi8v5rSX5rSX552h5ZCnJ1xcXFxuICAgICAgICB9XFxcXG59LE1ZX0hPTUUpXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5LqM57qn6aG16Z2i5YaF5a65XFxcIixcXFwicGF0aFxcXCI6XFxcImVyXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxudmFyIGQgPSBbXVxcXFxuZXZhbChKU09OLnBhcnNlKHJlcXVlc3QoJ2hpa2VyOi8vcGFnZS9yZXBhaXInKSkucnVsZSk7XFxcXG5NWV9VUkw9TVlfVVJMLnJlcGxhY2UoJ2hpa2VyOi8vZW1wdHkjIycsJycpO1xcXFxudmFyIHRlbXAgPSBndWFyZChNWV9VUkwpO1xcXFxuICAgIGlmKHRlbXAuaW5jbHVkZXMoXFxcXFxcXCLmo4DmtYvkuK1cXFxcXFxcIikpe1xcXFxuICAgICAgICAgTVlfVVJMID0gTVlfSE9NRSArIHRlbXAubWF0Y2goL2hyZWYgPVxcXFxcXFwiKC4qPylcXFxcXFxcIi8pWzFdXFxcXG4gICAgICAgICAgfVxcXFxudmFyIGh0bWwgPSBndWFyZChNWV9VUkwpO1xcXFxubG9nKE1ZX1VSTClcXFxcbmV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL2xhenknLCB7fSkpLnJ1bGUpO1xcXFxuXFxcXG52YXIgdGl0bGUgPSBwZGZoKGh0bWwsJ2g0JiZUZXh0Jyk7XFxcXG52YXIgZGVzYyA9IHBkZmgoaHRtbCwnLm1lZGlhLWJvZHkmJi5kYXRlJiZUZXh0JykrXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHTngrnlh7vlsJ3or5Xmkq3mlL5cXFxcXFxcIjtcXFxcbiAgIGlmKHRpdGxlICE9PW51bGwpe1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPG1pZGRsZT48Zm9udCBjb2xvcj0jRkZBNTAwPicrdGl0bGUrJzwvZm9udD48L21pZGRsZT4nLFxcXFxuICAgICAgICBkZXNjOiBkZXNjLFxcXFxuICAgICAgICB1cmw6IE1ZX1VSTCxcXFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxcXFxuICAgICAgICBleHRyYToge2xpbmVWaXNpYmxlOiBmYWxzZX1cXFxcbiAgICB9KVxcXFxufVxcXFxuXFxcXG52YXIg6K+G5Yir56CBO1xcXFxudHJ5e1xcXFxuICDor4bliKvnoIEgPSBwYXJzZURvbUZvckh0bWwoaHRtbCwgJ2JvZHkmJi5mYW4taW5mbyYmYSwtMSYmVGV4dCcpLnJlcGxhY2UoJ+ivhuWIq+eggTogJywnJyk7XFxcXG4gICAgICAgICAgIH1jYXRjaChlcnIpe31cXFxcblxcXFxudmFyIGltZyA9IHBkKGh0bWwsJy5tZXNzYWdlJiZpbWcmJnNyY3x8ZGF0YS1sYXp5LXNyYycpO1xcXFxuICAgIGlmKGltZyAhPT1udWxsKXtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICBpbWc6IGltZyxcXFxcbiAgICAgICAgICAgICB1cmw6IE1ZX1VSTCArIGxhenksXFxcXG4gICAgICAgICAgICAgY29sX3R5cGU6ICdwaWNfMV9mdWxsJyxcXFxcbiAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgfVxcXFxuXFxcXG50cnl7XFxcXG52YXIgayA9IHBkZmgoaHRtbCwnLnBnJiZhLC0yJiZUZXh0JykucmVwbGFjZSgvXFxcXFxcXFwuL2csJycpO1xcXFxubG9nKHR5cGVvZihrKSlcXFxcbmZvciAodmFyIGogPSAxOyBqIDw9IGsgOyBqKyspe1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAn56ysJyArIGogKyfpobUnLFxcXFxuICAgICAgICB1cmw6IE1ZX1VSTCArICc/dHBhZ2U9JyArIGogKyBsYXp5LFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNScsXFxcXG59KVxcXFxufX1jYXRjaChlcnIpe1xcXFxuICAgIC8vY29uc29sZS5sb2coJ+WPquacieS4gOmhtSzlh5HlkIjnnIvlkKcnLCBlcnIpO1xcXFxufVxcXFxuXFxcXG5cXFxcblxcXFxuIHZhciBmaCA9IHBkZmgoaHRtbCwnLmZhbi1pbmZvJiZUZXh0Jyk7XFxcXG4gICAgaWYoZmgpe1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxtaWRkbGU+PGZvbnQgY29sb3I9Y3lhbj4nK2ZoKyc8L2ZvbnQ+PC9taWRkbGU+JyxcXFxcbiAgICB1cmw6ICdoaWtlcjovL3NlYXJjaD9ydWxlPScgKyBNWV9SVUxFLnRpdGxlICsgJyZzPScrcGRmaChodG1sLCAnLmZhbi1pbmZvJiZhJiZUZXh0JyksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxcXFxuICAgICAgIGV4dHJhOiB7bGluZVZpc2libGU6IGZhbHNlfVxcXFxufSk7XFxcXG59XFxcXG5cXFxcbmlmKOivhuWIq+eggSl7XFxcXG5ldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS90b29sJywge30pKS5ydWxlKTtcXFxcbn1cXFxcbi8v6aKE6KeI5Zu+XFxcXG50cnl7XFxcXG4gICAgdmFyIGxpc3QgPSBwZGZhKGh0bWwsXFxcXFxcXCIueXVsYW50dSYmaW1nLDA6OVxcXFxcXFwiKVxcXFxuaWYobGlzdC5sZW5ndGg+MCl7XFxcXG4gICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxtaWRkbGU+PGZvbnQgY29sb3I9I2ZmNjg3Nz7moLflk4Hlm77lg488L2ZvbnQ+PC9taWRkbGU+JyxcXFxcbiAgICAgICAgdXJsOiBNWV9VUkwgKyAkKCcnKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHZhciBodG1sID0gcmVxdWVzdChpbnB1dClcXFxcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBpY3MgPSBwZGZhKGh0bWwsXFxcXFxcXCIueXVsYW50dSYmaW1nXFxcXFxcXCIpLm1hcChpdGVtPT5wZChpdGVtLFxcXFxcXFwiaW1nJiZzcmNcXFxcXFxcIikpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInBpY3M6Ly9cXFxcXFxcIitwaWNzLmpvaW4oXFxcXFxcXCImJlxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxcXG4gICAgICAgIGV4dHJhOiB7bGluZVZpc2libGU6IGZhbHNlfVxcXFxuICAgIH0pXFxcXG59XFxcXG5saXN0LmZvckVhY2goaXRlbT0+e1xcXFxuICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgaW1nOiBwZChpdGVtLFxcXFxcXFwiaW1nJiZzcmNcXFxcXFxcIiksXFxcXG4gICAgICAgICB1cmw6IHBkKGl0ZW0sXFxcXFxcXCJpbWcmJnNyY1xcXFxcXFwiKSxcXFxcbiAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInBpY18zX3NxdWFyZVxcXFxcXFwiXFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgfSlcXFxcbiAgICAgfWNhdGNoe31cXFxcblxcXFxuLy/no4HliptcXFxcbnZhciBjaWxpID0gcGRmYShodG1sLCAnLmNpbGlsaWFuJiZibG9ja3F1b3RlJyk7XFxcXG52YXIgY2wgPSBwZGZhKGh0bWwsICcuY2lsaWxpYW4mJnNjcmlwdDpub3QoW2RhdGEtY2Zhc3luY10pJyk7XFxcXG5pZihjbC5sZW5ndGg+MCl7XFxcXG5mb3IgKHZhciBpID0gMDsgaSA8IE1hdGgubWluKGNpbGkubGVuZ3RoLCBjbC5sZW5ndGgpOyBpKyspIHtcXFxcbiB2YXIgdGl0bGUgPSAn4oCc4oCc4oCd4oCdPG1pZGRsZT48Zm9udCBjb2xvcj15ZWxsb3c+JytwZGZoKGNpbGlbaV0sJ2Jsb2NrcXVvdGUtLWEmJlRleHQnKSsnPC9mb250PjwvbWlkZGxlPicrJ+KAnOKAnOKAneKAnTxtaWRkbGU+PGZvbnQgY29sb3I9IzAwOTlGRj4nK3BkZmgoY2lsaVtpXSwnYSYmVGV4dCcpLnJlcGxhY2UoXFxcXFxcXCJbZW1haWwgcHJvdGVjdGVkXVxcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCIpKyc8L2ZvbnQ+PC9taWRkbGU+JztcXFxcbiB2YXIgY2wwID0gcGRmaChjbFtpXSwnc2NyaXB0JiZIdG1sJykuc3BsaXQoXFxcXFxcXCJyZXVybCgnXFxcXFxcXCIpWzFdLnNwbGl0KFxcXFxcXFwiJylcXFxcXFxcIilbMF07XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiB0aXRsZSxcXFxcbiAgICB1cmw6ICdtYWduZXQ6P3h0PXVybjpidGloOicrcmV1cmwoY2wwKSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcXFxuICAgICAgIGV4dHJhOiB7bGluZVZpc2libGU6IGZhbHNlfVxcXFxufSk7XFxcXG59fWVsc2V7XFxcXG5mb3IgKHZhciBqIGluIGNpbGkpIHtcXFxcbiB2YXIgdGl0bGUgPSBwZGZoKGNpbGlbal0sJ2Jsb2NrcXVvdGUmJlRleHQnKTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08bWlkZGxlPjxmb250IGNvbG9yPXllbGxvdz4nK3RpdGxlKyc8L2ZvbnQ+PC9taWRkbGU+JyxcXFxcbiAgICB1cmw6IHBkZmgoY2lsaVtqXSwnYSYmVGV4dCcpLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxcXG4gICAgICAgZXh0cmE6IHtsaW5lVmlzaWJsZTogZmFsc2V9XFxcXG59KTtcXFxcbn1cXFxcbn1cXFxcblxcXFxuXFxcXG5cXFxcbi8qXFxcXG52YXIgeGlhb3NodW8gPSBKU09OLnBhcnNlKHBkZmgoaHRtbCwnLm1lc3NhZ2UmJnNjcmlwdCYmSHRtbCcpLm1hdGNoKC9cXFxcXFxcXFsuKj9cXFxcXFxcXF0vZylbMV0pO1xcXFxueGlhb3NodW8uZm9yRWFjaCh4ID0+e1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgdGl0bGU6IHgubmFtZSxcXFxcbiAgICAgICBkZXNjOiB4LmFydGlzdCxcXFxcbiAgICAgICBpbWc6IE1ZX0hPTUUgKyB4LmNvdmVyLFxcXFxuICAgICAgIHVybDogTVlfSE9NRSArIHgudXJsLFxcXFxuICAgICAgIGNvbF90eXBlOiAnYXZhdGFyJ1xcXFxuICAgICAgIH0pXFxcXG4gICB9KSovXFxcXG5cXFxcbnRyeXtcXFxcbnZhciB1cmxzID0gaHRtbC5tYXRjaCgvXFxcXFxcXFwvbXAzXFxcXFxcXFwvLio/XFxcXFxcXFwubXAzL2cpO1xcXFxudXJscyA9IHVybHMubWFwKGZ1bmN0aW9uKHVybCkge1xcXFxuICByZXR1cm4gTVlfSE9NRSArIHVybDtcXFxcbn0pO1xcXFxudmFyIG5hbWVzID0gaHRtbC5tYXRjaCgv56ysLio/6ZuGL2cpOyAgIFxcXFxuICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTWF0aC5taW4odXJscy5sZW5ndGgsIG5hbWVzLmxlbmd0aCk7IGkrKykge1xcXFxuICBkLnB1c2goe1xcXFxuICAgIHVybDogdXJsc1tpXSxcXFxcbiAgICB0aXRsZTogbmFtZXNbaV0sXFxcXG4gICAgZGVzYzogJ+acieWjsOWwj+ivtCcsXFxcXG4gICAgaW1nOiBNWV9IT01FICsgJy9pbWcvcGxheTEucG5nJyxcXFxcbiAgICBjb2xfdHlwZTogJ2F2YXRhcidcXFxcbiAgfSk7XFxcXG59fWNhdGNoIChlcnIpIHtcXFxcbiAgLy9jb25zb2xlLmxvZygn5q2k6aG16Z2i5rKh5pyJ5pyJ5aOw5bCP6K+0JywgZXJyKTtcXFxcbn07XFxcXG5cXFxcblxcXFxudmFyIGNvbnRlbnQgPSBwYXJzZURvbUZvckh0bWwoaHRtbCwgXFxcXFxcXCIubWVzc2FnZSYmLmh0eHQmJkh0bWxcXFxcXFxcIik7XFxcXG5pZihjb250ZW50KXtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IGNvbnRlbnQsXFxcXG4gICAgZGVzYzogJycsXFxcXG4gICAgcGljX3VybDogJycsXFxcXG4gICAgdXJsOiAnJyxcXFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCdcXFxcbn0pO1xcXFxufVxcXFxuICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08bWlkZGxlPjxmb250IGNvbG9yPSNBMDIwRjA+55u45YWz6LWE5rqQ5o6o6I2QPC9mb250PjwvbWlkZGxlPicsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIgKyDor4bliKvnoIEsXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXFxcbiAgICAgICAgIGV4dHJhOiB7bGluZVZpc2libGU6IGZhbHNlfVxcXFxuICAgIH0pO1xcXFxuXFxcXG5sZXQgdGogPSBwZGZhKGh0bWwsICdib2R5JiYucGx1Z2luX2xpc3QnKTtcXFxcbnRqLmZvckVhY2goeCA9PiB7ICAgXFxcXG4gZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogcGRmaCh4LCAnYSYmdGl0bGUnKSxcXFxcbiAgICBkZXNjOiBwZGZoKHgsJy5kYXRlJiZUZXh0JyksXFxcXG4gICAgaW1nOiBwZCh4LCdpbWcmJnNyYycpLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvZXI/dXJsPVxcXFxcXFwiK3BkKHgsICdhJiZocmVmJyksXFxcXG4gICAgY29sX3R5cGU6ICdtb3ZpZV8yJyxcXFxcbiAgICAgIGV4dHJhOntcXFxcbiAgICAgICAgIHBhZ2VUaXRsZTogcGRmaCh4LCAnYSYmdGl0bGUnKSxcXFxcbiAgICAgICAgIH1cXFxcblxcXFxuICB9KTtcXFxcbn0pXFxcXG5cXFxcblxcXFxuc2V0UmVzdWx0KGQpXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5LqM57qn5aSW6YOo5pCc57SiXFxcIixcXFwicGF0aFxcXCI6XFxcInRvb2xcXFwiLFxcXCJydWxlXFxcIjpcXFwiLy92YXIgdGl0bGUgPSBwYXJzZURvbUZvckh0bWwoaHRtbCwg5pCc57Si5qCH562+KTtcXFxcbi8vdmFyIHRpdGxlID0gTVlfUEFSQU1TLnRpdGxlO1xcXFxuLy9sb2codGl0bGUpXFxcXG5cXFxcbi8vVGhpc3NBVlxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmTxiPjxtaWRkbGU+PGZvbnQgY29sb3I9XFxcXFxcXCIjRkYwMDAwXFxcXFxcXCI+IFRoaXNBVjwvZm9udD48L21pZGRsZT4nLFxcXFxuICAgIHBpY191cmw6ICdodHRwczovL2NkbjQuaWNvbmZpbmRlci5jb20vZGF0YS9pY29ucy9sb2dvcy1hbmQtYnJhbmRzLzUxMi8yMzJfTmludGVuZG9fU3dpdGNoX2xvZ28tMTI4LnBuZycsXFxcXG4gICAgdXJsOiAkKCcnKS5sYXp5UnVsZSgo6K+G5Yir56CBKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgIHZhciBhdiA9IFxcXFxcXFwiaHR0cHM6Ly90aGlzYXYuY29tL2NuL1xcXFxcXFwiICsg6K+G5Yir56CBOyBcXFxcbi8vbG9nKGF2KVxcXFxuICAgICAgICAgICAgICB0cnl7XFxcXG4gICAgICAgICAgICAgICAgIHZhciBodG1sID0gZmV0Y2goYXYsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMCknXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9LHRpbWVvdXQ6NTAwMFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgIGV2YWwoaHRtbC5tYXRjaCgvZXZhbC4qP1xcXFxcXFxcbi8pWzBdKVxcXFxuICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bnlLvotKjliJfooajvvIzlubbljrvmnIDpq5jnlLvotKhcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwX3F1YWxpdHkgPSBmZXRjaChzb3VyY2Use2hlYWRlcnM6e1xcXFxcXFwib3JpZ2luXFxcXFxcXCI6XFxcXFxcXCJodHRwczovL3RoaXNhdi5jb21cXFxcXFxcIn19KVxcXFxuICAgICAgICAgICAgICAgICAgICBoZ2hlc3RfcXVhbGl0eSA9IGdyb3VwX3F1YWxpdHkubWF0Y2goL14oLiopXFxcXFxcXFwubTN1OCQvZ20pXFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UucmVwbGFjZShcXFxcXFxcInBsYXlsaXN0Lm0zdThcXFxcXFxcIiwgaGdoZXN0X3F1YWxpdHlbaGdoZXN0X3F1YWxpdHkubGVuZ3RoLTFdKSArICc7e09yaWdpbkBodHRwczovL3RoaXNhdi5jb219JyAgICAgICAgIFxcXFxuICAgICAgICAgICAgICAgICB9Y2F0Y2h7cmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mjILmoq/miJbmsqHmnInmraTlvbHniYdcXFxcXFxcIn1cXFxcbiAgICAgICAgICAgICAgICAgIH0s6K+G5Yir56CBKSxcXFxcbiAgICBjb2xfdHlwZTogJ2ljb25fNScsXFxcXG4gICAgZXh0cmE6IHsgbG9uZ0NsaWNrOiBbe3RpdGxlOiAn5p+l55yL572R5Z2AJywganM6ICQudG9TdHJpbmcoKOivhuWIq+eggSk9PnsgcmV0dXJuIFxcXFxcXFwiaHR0cHM6Ly90aGlzYXYuY29tL2NuL1xcXFxcXFwiICsg6K+G5Yir56CBO30s6K+G5Yir56CBKX1dIH1cXFxcbn0pO1xcXFxuXFxcXG4vL01JU1NBVlxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmTxiPjxtaWRkbGU+PGZvbnQgY29sb3I9XFxcXFxcXCIjMDBGRjAwXFxcXFxcXCI+IE1JU1NBVjwvZm9udD48L21pZGRsZT4nLFxcXFxuICAgIHBpY191cmw6ICdodHRwczovL2NkbjEuaWNvbmZpbmRlci5jb20vZGF0YS9pY29ucy9mcnVpdHMtbi12ZWdldGFibGVzLWNvbG9yZWQtZ3JhZGllbnQvMTI4L2NhdWxpZmxvd2VyLTEyOC5wbmcnLFxcXFxuICAgIHVybDogJCgnJykubGF6eVJ1bGUoKOivhuWIq+eggSkgPT4ge1xcXFxuICAgICAgIHRyeXtcXFxcbiAgICAgICAgICAgICB2YXIgYXYgPSBcXFxcXFxcImh0dHBzOi8vbWlzc2F2LnRvL3NlYXJjaC9tb3ZpZS9cXFxcXFxcIiArIOivhuWIq+eggTsgIFxcXFxuICAgICAgICAgICAgIHZhciB1cmxzID0gW107ICAgIFxcXFxuICAgICAgICAgICAgIHZhciBsaXN0ID0gcGRmYShmZXRjaChhdix7dGltZW91dDo1MDAwfSksXFxcXFxcXCIudmlkZW9zLWxpc3QmJmFydGljbGVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBmb3IodmFyIGogaW4gbGlzdCl7XFxcXG4gICAgICAgICAgICAgIHVybHMucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgIHVybDogcGRmaChsaXN0W2pdLFxcXFxcXFwiYSYmaHJlZlxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHZhciBwbGF5cyA9IGJmKHVybHMpLm1hcChoPT5oLm1hdGNoKC9zcmM9XFxcXFxcXCIoLio/KVxcXFxcXFwiLylbMV0uc3BsaXQoXFxcXFxcXCImXFxcXFxcXCIpWzBdLnJlcGxhY2UoXFxcXFxcXCI/aWQ9XFxcXFxcXCIsXFxcXFxcXCJobHMvXFxcXFxcXCIpICsgXFxcXFxcXCIubTN1OFxcXFxcXFwiKSAgIFxcXFxuICAgICAgICAgICAgIHJldHVybiB7dXJsczpwbGF5c31cXFxcbiAgICAgICB9Y2F0Y2h7XFxcXG4gICAgICAgICB0cnl7XFxcXG4gICAgICAgICAgICAgdmFyIGF2ID0gXFxcXFxcXCJodHRwczovL21pc3Nhdi50by9zZWFyY2gvbW92aWUvXFxcXFxcXCIgKyDor4bliKvnoIEucmVwbGFjZSgvXFxcXFxcXFwtfFxcXFxcXFxcXy8sXFxcXFxcXCIlMjBcXFxcXFxcIik7ICBcXFxcbiAgICAgICAgICAgICB2YXIgdXJscyA9IFtdOyAgICBcXFxcbiAgICAgICAgICAgICB2YXIgbGlzdCA9IHBkZmEoZmV0Y2goYXYse3RpbWVvdXQ6NTAwMH0pLFxcXFxcXFwiLnZpZGVvcy1saXN0JiZhcnRpY2xlXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgZm9yKHZhciBqIGluIGxpc3Qpe1xcXFxuICAgICAgICAgICAgICB1cmxzLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHBkZmgobGlzdFtqXSxcXFxcXFxcImEmJmhyZWZcXFxcXFxcIilcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB2YXIgcGxheXMgPSBiZih1cmxzKS5tYXAoaD0+aC5tYXRjaCgvc3JjPVxcXFxcXFwiKC4qPylcXFxcXFxcIi8pWzFdLnNwbGl0KFxcXFxcXFwiJlxcXFxcXFwiKVswXS5yZXBsYWNlKFxcXFxcXFwiP2lkPVxcXFxcXFwiLFxcXFxcXFwiaGxzL1xcXFxcXFwiKSArIFxcXFxcXFwiLm0zdThcXFxcXFxcIikgICBcXFxcbiAgICAgICAgICAgICByZXR1cm4ge3VybHM6cGxheXN9XFxcXG4gICAgICAgICAgfWNhdGNoe3JldHVybiBcXFxcXFxcInRvYXN0Oi8v5rKh5pyJ5q2k5b2x54mHXFxcXFxcXCJ9XFxcXG4gICAgICAgfSAgIFxcXFxuICAgICAgICAgICAgICAgICAgfSzor4bliKvnoIEpLFxcXFxuICAgIGNvbF90eXBlOiAnaWNvbl81JyxcXFxcbiAgICBleHRyYTogeyBsb25nQ2xpY2s6IFt7dGl0bGU6ICfmn6XnnIvnvZHlnYAnLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyByZXR1cm4gXFxcXFxcXCJodHRwczovL21pc3Nhdi50by9zZWFyY2gvbW92aWUvXFxcXFxcXCIgKyDor4bliKvnoIF9LOivhuWIq+eggSl9XSB9XFxcXG59KTtcXFxcblxcXFxuLy9uamF2XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFxcXFxcIiMxRTkwRkZcXFxcXFxcIj4gbkphdi50djwvZm9udD48L21pZGRsZT4nLFxcXFxuICAgIHBpY191cmw6ICdodHRwczovL2NkbjIuaWNvbmZpbmRlci5jb20vZGF0YS9pY29ucy9zb2NpYWwtaWNvbnMtMzMvMTI4L0ZhY2Vib29rX01lc3Nlbmdlci0xMjgucG5nJyxcXFxcbiAgICB1cmw6ICQoJycpLmxhenlSdWxlKCjor4bliKvnoIEpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgdmFyIGF2ID0gXFxcXFxcXCJodHRwczovL25qYXYudHYvemgvdi9cXFxcXFxcIiArIOivhuWIq+eggTsgXFxcXG4vL2xvZyhhdilcXFxcbiAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBmZXRjaChhdix7dGltZW91dDo1MDAwfSlcXFxcbiAgICAgICAgICAgICAgICAgaWYoIWh0bWwgfHwgaHRtbC5pbmNsdWRlcyhcXFxcXFxcIuivt+ajgOafpeWcsOWdgOagj+S4reeahOe9keWdgFxcXFxcXFwiKSl7ICAgICAgICAgXFxcXG4gICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5oyC5qKv5oiW5rKh5pyJ5q2k5b2x54mHXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidmlkZW86Ly9cXFxcXFxcIiArIGF2O1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICB9LOivhuWIq+eggSksXFxcXG4gICAgY29sX3R5cGU6ICdpY29uXzUnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgdmlkZW9FeGNsdWRlUnVsZXM6IFsnMjQwJ10sXFxcXG4gICAgICAgICAgICAgICAgYmxvY2tSdWxlczogWycqLmRvcHBpb2Nkbi4qJ10sXFxcXG4gICAgICAgICAgICAgICAgYmxvY2tSdWxlczogWydkbW0uY28uanAnXSxcXFxcbiAgICAgICAgICAgICAgICAvL3ZpZGVvUnVsZXM6IFsnKm0zdTgqJ10sXFxcXG4gICAgICAgICAgICAgICAgY2FjaGVNM3U4OiB0cnVlLFxcXFxuICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe3RpdGxlOiAn5p+l55yL572R5Z2AJywganM6ICQudG9TdHJpbmcoKOivhuWIq+eggSk9PnsgcmV0dXJuIFxcXFxcXFwiaHR0cHM6Ly9uamF2LnR2L3poL3YvXFxcXFxcXCIgKyDor4bliKvnoIE7fSzor4bliKvnoIEpfV1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbn0pO1xcXFxuXFxcXG4vL2F2MDFcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJjigJjigJnigJk8Yj48bWlkZGxlPjxmb250IGNvbG9yPVxcXFxcXFwiIzc1MTI3QVxcXFxcXFwiPiBBVjAxPC9mb250PjwvbWlkZGxlPicsXFxcXG4gICAgcGljX3VybDogJ2h0dHBzOi8vY2RuMi5pY29uZmluZGVyLmNvbS9kYXRhL2ljb25zL293bC0xMC81MDAvbmltNTMyXzExX3B1cnBsZV9vd2xfa2lkX2JpcnRoZGF5X2ZhY2VfZXllLTEyOC5wbmcnLFxcXFxuICAgIHVybDogJCgnJykubGF6eVJ1bGUoKOivhuWIq+eggSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICB2YXIgYXYgPSBcXFxcXFxcImh0dHBzOi8vd3d3LmF2MDEudHYvXFxcXFxcXCIgKyDor4bliKvnoIE7IFxcXFxuLy9sb2coYXYpXFxcXG4gICAgICAgICAgICAgICAgIHZhciBodG1sID0gZmV0Y2goYXYse3RpbWVvdXQ6NTAwMH0pXFxcXG4gICAgICAgICAgICAgICAgIHZhciBjb2RlID0gcGRmaChodG1sLCcjcGx5cl92aWRlbyYmcG9zdGVyJylcXFxcbmxvZyhjb2RlKVxcXFxuICAgICAgICAgICAgICAgICBpZighY29kZSl7ICAgICAgICAgXFxcXG4gICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5oyC5qKv5oiW5rKh5pyJ5q2k5b2x54mHXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidmlkZW86Ly9cXFxcXFxcIiArIGF2O1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICB9LOivhuWIq+eggSksXFxcXG4gICAgY29sX3R5cGU6ICdpY29uXzUnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgdmlkZW9FeGNsdWRlUnVsZXM6IFsnZG9wcGlvY2RuJ10sXFxcXG4gICAgICAgICAgICAgICAgdmlkZW9FeGNsdWRlUnVsZXM6IFsnMjQwJ10sXFxcXG4gICAgICAgICAgICAgICAgdmlkZW9FeGNsdWRlUnVsZXM6IFsnNDgwJ10sXFxcXG4gICAgICAgICAgICAgICAgYmxvY2tSdWxlczogWycuZG9wcGlvY2RuLiddLFxcXFxuICAgICAgICAgICAgICAgIGJsb2NrUnVsZXM6IFsnZG1tLmNvLmpwJ10sXFxcXG4gICAgICAgICAgICAgICAgLy92aWRlb1J1bGVzOiBbJyptM3U4KiddLFxcXFxuICAgICAgICAgICAgICAgIGNhY2hlTTN1ODogdHJ1ZSxcXFxcbiAgICAgICAgICAgICAgIGxvbmdDbGljazogW3t0aXRsZTogJ+afpeeci+e9keWdgCcsIGpzOiAkLnRvU3RyaW5nKCjor4bliKvnoIEpPT57IHJldHVybiBcXFxcXFxcImh0dHBzOi8vd3d3LmF2MDEudHYvXFxcXFxcXCIgKyDor4bliKvnoIE7fSzor4bliKvnoIEpfV1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbn0pO1xcXFxuXFxcXG4vL0phYmxlXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFxcXFxcIiNGRjhDMDBcXFxcXFxcIj4gSmFibGU8L2ZvbnQ+PC9taWRkbGU+JyxcXFxcbiAgICBwaWNfdXJsOiAnaHR0cHM6Ly9jZG4zLmljb25maW5kZXIuY29tL2RhdGEvaWNvbnMvY2F0LXBvd2VyLXByZW1pdW0vMTIwL2NhdF9mb29kbG92ZS0xMjgucG5nJyxcXFxcbiAgICB1cmw6ICQoJycpLmxhenlSdWxlKCjor4bliKvnoIEpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgdmFyIGF2ID0gXFxcXFxcXCJodHRwczovL2phYmxlLnR2L3ZpZGVvcy9cXFxcXFxcIiArIOivhuWIq+eggSArIFxcXFxcXFwiL1xcXFxcXFwiOyBcXFxcbi8vbG9nKGF2KVxcXFxuICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QoXFxcXFxcXCJodHRwczovL2phYmxlLnR2L1xcXFxcXFwiKVxcXFxuICAgICAgICAgICAgICB0cnl7XFxcXG4gICAgICAgICAgICAgICAgIHZhciBodG1sID0gZmV0Y2goYXYse3RpbWVvdXQ6NTAwMH0pXFxcXG4gICAgICAgICAgICAgICAgIHZhciB1cmwgPSBodG1sLm1hdGNoKC9odHRwcz86XFxcXFxcXFwvXFxcXFxcXFwvXFxcXFxcXFxTKz9cXFxcXFxcXC5tM3U4LylbMF1cXFxcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHVybFxcXFxuICAgICAgICAgICAgICAgICB9Y2F0Y2h7cmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/msqHmnInmjILmoq/lrZDmiJbmsqHmnInmraTlvbHniYdcXFxcXFxcIn1cXFxcbiAgICAgICAgICAgICAgICAgIH0s6K+G5Yir56CBKSxcXFxcbiAgICBjb2xfdHlwZTogJ2ljb25fNScsXFxcXG4gICAgZXh0cmE6IHsgbG9uZ0NsaWNrOiBbe3RpdGxlOiAn5p+l55yL572R5Z2AJywganM6ICQudG9TdHJpbmcoKOivhuWIq+eggSk9PnsgcmV0dXJuIFxcXFxcXFwiaHR0cHM6Ly9qYWJsZS50di92aWRlb3MvXFxcXFxcXCIgKyDor4bliKvnoIEgKyBcXFxcXFxcIi9cXFxcXFxcIjt9LOivhuWIq+eggSl9XSB9XFxcXG59KTtcXFxcblxcXFxuLy9UaGlzc0FW56C06KejXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFxcXFxcIiNGRUZFMDBcXFxcXFxcIj7nhKHnorznoLTop6M8L2ZvbnQ+PC9taWRkbGU+JyxcXFxcbiAgICBwaWNfdXJsOiAnaHR0cHM6Ly9jZG40Lmljb25maW5kZXIuY29tL2RhdGEvaWNvbnMvc29jaWFsLW1lZGlhLWZsYXQtNy82NC9Tb2NpYWwtbWVkaWFfU25hcGNoYXQtMTI4LnBuZycsXFxcXG4gICAgdXJsOiAkKCcnKS5sYXp5UnVsZSgo6K+G5Yir56CBKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgIHZhciBhdiA9IFxcXFxcXFwiaHR0cHM6Ly90aGlzYXYuY29tL2NuL1xcXFxcXFwiICsg6K+G5Yir56CBICsgXFxcXFxcXCItdW5jZW5zb3JlZC1sZWFrXFxcXFxcXCI7IFxcXFxuLy9sb2coYXYpXFxcXG4gICAgICAgICAgICAgIHRyeXtcXFxcbiAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBmZXRjaChhdiwge1xcXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wKSdcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sdGltZW91dDo1MDAwXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgZXZhbChodG1sLm1hdGNoKC9ldmFsLio/XFxcXFxcXFxuLylbMF0pXFxcXG4gICAgICAgICAgICAgICAgICAgIC8vIOiOt+WPlueUu+i0qOWIl+ihqO+8jOW5tuWOu+acgOmrmOeUu+i0qFxcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBfcXVhbGl0eSA9IGZldGNoKHNvdXJjZSx7aGVhZGVyczp7XFxcXFxcXCJvcmlnaW5cXFxcXFxcIjpcXFxcXFxcImh0dHBzOi8vdGhpc2F2LmNvbVxcXFxcXFwifX0pXFxcXG4gICAgICAgICAgICAgICAgICAgIGhnaGVzdF9xdWFsaXR5ID0gZ3JvdXBfcXVhbGl0eS5tYXRjaCgvXiguKilcXFxcXFxcXC5tM3U4JC9nbSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKFxcXFxcXFwicGxheWxpc3QubTN1OFxcXFxcXFwiLCBoZ2hlc3RfcXVhbGl0eVtoZ2hlc3RfcXVhbGl0eS5sZW5ndGgtMV0pICsgJzt7T3JpZ2luQGh0dHBzOi8vdGhpc2F2LmNvbX0nICAgICAgICAgXFxcXG4gICAgICAgICAgICAgICAgIH1jYXRjaHtyZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+aMguair+aIluayoeacieatpOW9seeJh1xcXFxcXFwifVxcXFxuICAgICAgICAgICAgICAgICAgfSzor4bliKvnoIEpLFxcXFxuICAgIGNvbF90eXBlOiAnaWNvbl81JyxcXFxcbiAgICBleHRyYTogeyBsb25nQ2xpY2s6IFt7dGl0bGU6ICfmn6XnnIvnvZHlnYAnLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyByZXR1cm4gXFxcXFxcXCJodHRwczovL3RoaXNhdi5jb20vY24vXFxcXFxcXCIgKyDor4bliKvnoIEgKyBcXFxcXFxcIi11bmNlbnNvcmVkLWxlYWtcXFxcXFxcIjt9LOivhuWIq+eggSl9XSB9XFxcXG59KTtcXFxcblxcXFxuLy9uamF256C06KejXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFxcXFxcIiMxRTkwRkZcXFxcXFxcIj4gbkphduegtOinozwvZm9udD48L21pZGRsZT4nLFxcXFxuICAgIHBpY191cmw6ICdodHRwczovL2NkbjAuaWNvbmZpbmRlci5jb20vZGF0YS9pY29ucy9DdXRlTW9uc3RlcnNQTkcvMTI4L2JsdWVfbW9uc3Rlci5wbmcnLFxcXFxuICAgIHVybDogJCgnJykubGF6eVJ1bGUoKOivhuWIq+eggSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICB2YXIgYXYgPSBcXFxcXFxcImh0dHBzOi8vbmphdi50di96aC92L1xcXFxcXFwiICsg6K+G5Yir56CBICsgXFxcXFxcXCItdW5jZW5zb3JlZC1sZWFrZWRcXFxcXFxcIjsgXFxcXG4vL2xvZyhhdilcXFxcbiAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBmZXRjaChhdix7dGltZW91dDo1MDAwfSlcXFxcbiAgICAgICAgICAgICAgICAgaWYoIWh0bWwgfHwgaHRtbC5pbmNsdWRlcyhcXFxcXFxcIuivt+ajgOafpeWcsOWdgOagj+S4reeahOe9keWdgFxcXFxcXFwiKSl7ICAgICAgICAgXFxcXG4gICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5oyC5qKv5oiW5rKh5pyJ5q2k5b2x54mHXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidmlkZW86Ly9cXFxcXFxcIiArIGF2O1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICB9LOivhuWIq+eggSksXFxcXG4gICAgY29sX3R5cGU6ICdpY29uXzUnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgdmlkZW9FeGNsdWRlUnVsZXM6IFsnMjQwJ10sXFxcXG4gICAgICAgICAgICAgICAgYmxvY2tSdWxlczogWycqLmRvcHBpb2Nkbi4qJ10sXFxcXG4gICAgICAgICAgICAgICAgYmxvY2tSdWxlczogWydkbW0uY28uanAnXSxcXFxcbiAgICAgICAgICAgICAgICAvL3ZpZGVvUnVsZXM6IFsnKm0zdTgqJ10sXFxcXG4gICAgICAgICAgICAgICAgY2FjaGVNM3U4OiB0cnVlLFxcXFxuICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe3RpdGxlOiAn5p+l55yL572R5Z2AJywganM6ICQudG9TdHJpbmcoKOivhuWIq+eggSk9PnsgcmV0dXJuIFxcXFxcXFwiaHR0cHM6Ly9uamF2LnR2L3poL3YvXFxcXFxcXCIgKyDor4bliKvnoIEgKyBcXFxcXFxcIi11bmNlbnNvcmVkLWxlYWtlZFxcXFxcXFwiO30s6K+G5Yir56CBKX1dXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG59KTtcXFxcblxcXFxuLy9TdXBqYXZcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJjigJjigJnigJk8Yj48bWlkZGxlPjxmb250IGNvbG9yPVxcXFxcXFwiI0EzMjk4NlxcXFxcXFwiPlN1cGphdjwvZm9udD48L21pZGRsZT4nLFxcXFxuICAgIHBpY191cmw6ICdodHRwczovL2NkbjMuaWNvbmZpbmRlci5jb20vZGF0YS9pY29ucy9sb2dvcy1icmFuZHMtMy8yNC9sb2dvX2JyYW5kX2JyYW5kc19sb2dvc19za3JpbGwtMTI4LnBuZycsXFxcXG4gICAgdXJsOiBcXFxcXFxcIng1Oi8vaHR0cHM6Ly9zdXBqYXYuY29tL3poLz9zPVxcXFxcXFwiICsg6K+G5Yir56CBLFxcXFxuICAgIGNvbF90eXBlOiAnaWNvbl81JyxcXFxcbiAgICBleHRyYTp7XFxcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6ZmFsc2UsXFxcXG4gICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe3RpdGxlOiAn5Y+s5ZSk6Zuo6KeBJywganM6ICQudG9TdHJpbmcoKOivhuWIq+eggSk9PnsgXFxcXG4vKlxcXFxub3BlbkFwcEludGVudCgnY29tLnl1amlhbi5SZXNpZGVNZW51RGVtbycsICdjbi55dWppYW4uTWFpbkFjdGl2aXR5Jywge2ludGVudERhdGE6ICdodHRwczovL3N1cGphdi5jb20vemgvP3M9JyArIOivhuWIq+eggX0pXFxcXG4qL1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwieWpicm93c2VyOi8vc2VhcmNoP3E9aHR0cHM6Ly9zdXBqYXYuY29tL3poLz9zPVxcXFxcXFwiICsg6K+G5Yir56CBXFxcXG4gICAgICAgICAgICAgICAgICAgICAgIH0s6K+G5Yir56CBKX0se3RpdGxlOiAn5p+l55yL572R5Z2AJywganM6ICQudG9TdHJpbmcoKOivhuWIq+eggSk9PnsgXFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImh0dHBzOi8vc3VwamF2LmNvbS96aC8/cz1cXFxcXFxcIiArIOivhuWIq+eggVxcXFxuICAgICAgICAgICAgICAgICAgICAgICB9LOivhuWIq+eggSl9XVxcXFxuICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgIH0pO1xcXFxuXFxcXG4vL+iBmuaQnFxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmTxiPjxtaWRkbGU+PGZvbnQgY29sb3I9XFxcXFxcXCIjNjdFMEZBXFxcXFxcXCI+6IGa5pCcIOKAoiBSPC9mb250PjwvbWlkZGxlPicsXFxcXG4gICAgcGljX3VybDogJ2h0dHBzOi8vY2RuNC5pY29uZmluZGVyLmNvbS9kYXRhL2ljb25zL2Vzc2VudGlhbHMtNzIvMjQvMDAyXy1fU2VhcmNoLTEyOC5wbmcnLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3NlYXJjaD9zPVxcXFxcXFwiICsg6K+G5Yir56CBICsgXFxcXFxcXCImcnVsZT3lpb3nnIvop4bpopEmc2ltcGxlPWZhbHNlXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpY29uXzUnLFxcXFxuICAgIGV4dHJhOiB7ICAgICAgICAgICAgICAgXFxcXG4gICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7dGl0bGU6ICdKYXYuR3VydScsIGpzOiAkLnRvU3RyaW5nKCjor4bliKvnoIEpPT57IHJldHVybiBcXFxcXFxcImh0dHBzOi8vamF2Lmd1cnUvP3M9XFxcXFxcXCIgKyDor4bliKvnoIE7fSzor4bliKvnoIEpfSx7dGl0bGU6ICdKYXZCYW5nZXJzJywganM6ICQudG9TdHJpbmcoKOivhuWIq+eggSk9PnsgcmV0dXJuIFxcXFxcXFwiaHR0cHM6Ly93d3cuamF2YmFuZ2Vycy5jb20vc2VhcmNoL1xcXFxcXFwiICsg6K+G5Yir56CBICsnLyc7fSzor4bliKvnoIEpfSx7dGl0bGU6ICflpI3liLbor4bliKvnoIEnLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyByZXR1cm4gXFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIgKyDor4bliKvnoIE7fSzor4bliKvnoIEpfV1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5cXFxcbi8v56OB5Yqb5ZCbLueugFxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmTxiPjxtaWRkbGU+PGZvbnQgY29sb3I9XFxcXFxcXCIjRUY0ODIzXFxcXFxcXCI+56OB5Yqb5ZCbLueugDwvZm9udD48L21pZGRsZT4nLFxcXFxuICAgIHBpY191cmw6ICdodHRwczovL2NkbjQuaWNvbmZpbmRlci5jb20vZGF0YS9pY29ucy9zaG9wcGluZy1kb29kbGUvNTEyL1Nob3BwaW5nLTMxLTEyOC5wbmcnLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2Uvc291P3J1bGU956OB5Yqb5ZCbLueugCZwPWZ5cGFnZSZzZWFyY2hUZXJtcz1cXFxcXFxcIiArIOivhuWIq+eggSxcXFxcbiAgICBjb2xfdHlwZTogJ2ljb25fNScsXFxcXG4gICAgZXh0cmE6IHsgICAgICAgICAgICAgICBcXFxcbiAgICAgICAgICAgICAgIGxvbmdDbGljazogW3t0aXRsZTogJ+iwt+atjOaQnOe0oicsIGpzOiAkLnRvU3RyaW5nKCjor4bliKvnoIEpPT57IHJldHVybiBcXFxcXFxcImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP3E9XFxcXFxcXCIgKyDor4bliKvnoIE7fSzor4bliKvnoIEpfSx7dGl0bGU6ICdZYW5kZXjmkJzntKInLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+eyByZXR1cm4gXFxcXFxcXCJodHRwczovL3lhbmRleC5jb20vc2VhcmNoL3RvdWNoLz90ZXh0PVxcXFxcXFwiICsg6K+G5Yir56CBO30s6K+G5Yir56CBKX0se3RpdGxlOiAn5aSN5Yi26K+G5Yir56CBJywganM6ICQudG9TdHJpbmcoKOivhuWIq+eggSk9PnsgcmV0dXJuIFxcXFxcXFwiY29weTovL1xcXFxcXFwiICsg6K+G5Yir56CBO30s6K+G5Yir56CBKX1dXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG59KTtcXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIjDnuqfpppbpobXpobXpnaJcXFwiLFxcXCJwYXRoXFxcIjpcXFwic2hvdVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnZhciBkID0gW107XFxcXG5NWV9VUkwgPSBNWV9VUkwucmVwbGFjZSgnaGlrZXI6Ly9lbXB0eSMjJywgJycpO1xcXFxuZXZhbChKU09OLnBhcnNlKHJlcXVlc3QoJ2hpa2VyOi8vcGFnZS9yZXBhaXInKSkucnVsZSk7XFxcXG52YXIgdGVtcCA9IGd1YXJkKE1ZX1VSTCk7XFxcXG4gICAgaWYodGVtcC5pbmNsdWRlcyhcXFxcXFxcIuajgOa1i+S4rVxcXFxcXFwiKSl7XFxcXG4gICAgICAgICBNWV9VUkwgPSBNWV9IT01FICsgdGVtcC5tYXRjaCgvaHJlZiA9XFxcXFxcXCIoLio/KVxcXFxcXFwiLylbMV1cXFxcbiAgICAgICAgICB9XFxcXG52YXIgaHRtbCA9IGd1YXJkKE1ZX1VSTCk7XFxcXG5sb2coTVlfVVJMKVxcXFxuXFxcXG52YXIgbGlzID0gcGRmYShodG1sLCAnLnJlc291Y2kmJmE6bm90KDptYXRjaGVzKOe+juWbvnzmm7TlpJopKScpO1xcXFxubGlzLmZvckVhY2goeCA9PiB7ICAgXFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICB0aXRsZTogcGRmaCh4LCAnYSYmVGV4dCcpLFxcXFxuICAgICAgIHVybDogcGQoeCwgJ2EmJmhyZWYnKSsnIyNmeXBhZ2VAcnVsZT1qczokLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2Uvc3NcXFxcXFxcIiknLFxcXFxuICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxcXG4gIH0pO1xcXFxufSlcXFxcbi8qXFxcXG5kLnB1c2goe1xcXFxuICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJyxcXFxcbn0pKi9cXFxcblxcXFxudmFyIGNvbnRzID0gcGRmYShodG1sLCAnLnNvdS10YWd5dW4mJi5zb3UtdGFnJyk7XFxcXG5mb3IgKHZhciBpID0gMDsgaSA8IGNvbnRzLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICB2YXIgbGlzdCA9IHBkZmEoY29udHNbaV0sICdib2R5JiZhJyk7IFxcXFxuZC5wdXNoKHtcXFxcbiAgICAgY29sX3R5cGU6ICdibGFua19ibG9jaycsXFxcXG59KTtcXFxcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7ICAgICAgIFxcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChsaXN0W2pdLCAnYSYmVGV4dCcpLFxcXFxuICAgICAgICAgICAgICAgIHVybDogcGQobGlzdFtqXSwgJ2EmJmhyZWYnKSsnIyNmeXBhZ2VAcnVsZT1qczokLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2Uvc3NcXFxcXFxcIiknLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsICAgICAgICAgICAgXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcblxcXFxudmFyIGxpcyA9IHBkZmEoaHRtbCwgJ2JvZHkmJi5waWMtaG9tZSYmbGknKTtcXFxcbmxpcy5mb3JFYWNoKHggPT4geyAgIFxcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgdGl0bGU6IHBkZmgoeCwgJ2EmJlRleHQnKSxcXFxcbiAgICAgICBpbWc6IHBkKHgsICdpbWcmJnNyYycpLFxcXFxuICAgICAgIHVybDogcGQoeCwgJ2EmJmhyZWYnKSsnIyNmeXBhZ2VAcnVsZT1qczokLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2Uvc3NcXFxcXFxcIiknLFxcXFxuICAgICAgIGNvbF90eXBlOiAnbW92aWVfMicsXFxcXG4gIH0pO1xcXFxufSlcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6I2ZmNjYwMFxcXFxcXFwiPjxiPvCflKXor4bliKvnoIHop4bpopFcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHTng63pl6jliIbnsbs8L2I+PC9zcGFuPicsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCdcXFxcbn0pO1xcXFxuXFxcXG52YXIgdGl0bGUgPSBwZGZhKGh0bWwsICcuYXVpLWxheW91dC10dWlqaWFuJiYuYXVpLWxheW91dC10ZXh0Jyk7XFxcXG52YXIgaW1nID0gcGRmYShodG1sLCAnLmF1aS1sYXlvdXQtdHVpamlhbiYmaW1nJyk7XFxcXG52YXIgdXJsID0gcGRmYShodG1sLCAnLmF1aS1sYXlvdXQtdHVpamlhbiYmYScpO1xcXFxuZm9yICh2YXIgaSA9IDA7IGkgPCBNYXRoLm1pbih0aXRsZS5sZW5ndGgsIGltZy5sZW5ndGgsdXJsLmxlbmd0aCk7IGkrKykge1xcXFxuICAgZC5wdXNoKHtcXFxcbiAgICAgICB0aXRsZTogcGRmaCh0aXRsZVtpXSwnVGV4dCcpLFxcXFxuICAgICAgIGltZzogcGQoaW1nW2ldLCdpbWcmJnNyYycpLFxcXFxuICAgICAgIHVybDogcGQodXJsW2ldLCdhJiZocmVmJykrJyMjZnlwYWdlQHJ1bGU9anM6JC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3NzXFxcXFxcXCIpJyxcXFxcbiAgICAgICBjb2xfdHlwZTogJ2ljb25fNF9jYXJkJyxcXFxcbn0pXFxcXG59XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiNmZjY2MDBcXFxcXFxcIj48Yj7wn5Sl5Zu95Lqn6KeG6aKRXFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx054Ot6Zeo5YiG57G7PC9iPjwvc3Bhbj4nLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnXFxcXG59KTtcXFxcblxcXFxudmFyIHRpdGxlID0gcGRmYShodG1sLCAnLmF1aS1sYXlvdXQtdHVpamlhbiwxJiYuYXVpLWxheW91dC10ZXh0Jyk7XFxcXG52YXIgaW1nID0gcGRmYShodG1sLCAnLmF1aS1sYXlvdXQtdHVpamlhbiwxJiZpbWcnKTtcXFxcbnZhciB1cmwgPSBwZGZhKGh0bWwsICcuYXVpLWxheW91dC10dWlqaWFuLDEmJmEnKTtcXFxcbmZvciAodmFyIGkgPSAwOyBpIDwgTWF0aC5taW4odGl0bGUubGVuZ3RoLCBpbWcubGVuZ3RoLHVybC5sZW5ndGgpOyBpKyspIHtcXFxcbiAgIGQucHVzaCh7XFxcXG4gICAgICAgdGl0bGU6IHBkZmgodGl0bGVbaV0sJ1RleHQnKSxcXFxcbiAgICAgICBpbWc6IHBkKGltZ1tpXSwnaW1nJiZzcmMnKSxcXFxcbiAgICAgICB1cmw6IHBkKHVybFtpXSwnYSYmaHJlZicpKycjI2Z5cGFnZUBydWxlPWpzOiQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9zc1xcXFxcXFwiKScsXFxcXG4gICAgICAgY29sX3R5cGU6ICdpY29uXzRfY2FyZCcsXFxcXG59KVxcXFxufVxcXFxuXFxcXG5zZXRSZXN1bHQoZClcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkuIDnuqfmkJzntKLpobXpnaJcXFwiLFxcXCJwYXRoXFxcIjpcXFwic3NcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG52YXIgZCA9IFtdO1xcXFxuLypcXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAoKSA9PiB7XFxcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdE15VmFyS2V5cygpKSB7XFxcXG4gICAgICAgIGNsZWFyTXlWYXIoaXQpO1xcXFxuICAgIH1cXFxcbn0pOyovXFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uUmVmcmVzaFxcXFxcXFwiLCAoKSA9PiB7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcIm5leHRQYWdlXFxcXFxcXCIpO1xcXFxufSk7XFxcXG52YXIgd2hvc3QgPSBjb25maWcuaG9zdDtcXFxcbk1ZX1VSTCA9IE1ZX1VSTC5yZXBsYWNlKCdoaWtlcjovL2VtcHR5IyMnLCAnJyk7XFxcXG5sZXQgdHJ1ZV91cmwgPSBnZXRWYXIoTVlfUlVMRS51cmwsIE1ZX1VSTCk7XFxcXG5cXFxcbmNvbnN0IHBhZ2UgPSBNWV9QQUdFO1xcXFxuLy/ojrflj5bkuIrmrKHnvJPlrZjnmoTkuIvpobXpk77mjqVcXFxcbmxldCBuZXh0UGFnZSA9IGdldE15VmFyKFxcXFxcXFwibmV4dFBhZ2VcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4vL+WmguaenOacieS4i+S4gOmhteS4lOS4jeaYr+esrOS4gOmhteWwseS9v+eUqOS4i+S4gOmhtemTvuaOpVxcXFxuaWYgKG5leHRQYWdlICYmIE1ZX1BBR0UgPiAxKSB7XFxcXG4gICAgdHJ1ZV91cmwgPSBuZXh0UGFnZTtcXFxcbn1cXFxcbnZhciB0ZW1wID0gZmV0Y2godHJ1ZV91cmwpO1xcXFxuICAgIGlmKHRlbXAuaW5jbHVkZXMoXFxcXFxcXCLmo4DmtYvkuK1cXFxcXFxcIikpe1xcXFxuICAgICAgICAgdHJ1ZV91cmwgPSB3aG9zdCArIHRlbXAubWF0Y2goL2hyZWYgPVxcXFxcXFwiKC4qPylcXFxcXFxcIi8pWzFdXFxcXG4gICAgICAgIC8vIHJlcXVlc3Qod2hvc3QpXFxcXG4gICAgICAgICAgfVxcXFxudmFyIGh0bWwgPSBmZXRjaCh0cnVlX3VybCk7XFxcXG5sb2codHJ1ZV91cmwpXFxcXG50cnkge1xcXFxuICAgIC8v57yT5a2Y5LiL5LiA6aG1XFxcXG4gICAgbGV0IG5leHRVcmwgPSBwZChodG1sLCBcXFxcXFxcImE6Y29udGFpbnMo5LiL5LiA6aG1KSYmaHJlZlxcXFxcXFwiKTtcXFxcbiAgICBwdXRNeVZhcihcXFxcXFxcIm5leHRQYWdlXFxcXFxcXCIsIG5leHRVcmwgfHwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgLy9sb2coXFxcXFxcXCLkuIvkuIDpobXvvJpcXFxcXFxcIiArIG5leHRVcmwpXFxcXG59IGNhdGNoIChlKSB7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcIm5leHRQYWdlXFxcXFxcXCIpO1xcXFxuICAgIHRvYXN0KFxcXFxcXFwi5aW95YOP5rKh5pyJ5LiL5LiA6aG15LqG77yBXFxcXFxcXCIpO1xcXFxufVxcXFxuXFxcXG50cnl7XFxcXG52YXIgayA9IHBkZmgoaHRtbCwnYm9keSYmLnBhZ2luYXRpb24mJmEsLTImJlRleHQnKS5yZXBsYWNlKC9cXFxcXFxcXC4vZywnJyk7XFxcXG5sZXQgbm93ID0gZ2V0SXRlbSgnbm93JywgJ+mmlumhtScpO1xcXFxuXFxcXG52YXIgYXJyID0gWyfpmo/mnLonLCfot7PpobUnLCflsL7pobUnK2tdOyBcXFxcbmZvciAodmFyIGkgPSAxOyBpIDwgKGsgPCAxMDEgPyBrIDogMTAxKSA7IGkgKz0gKGkgPT0gMSkgPyA0IDogNSl7XFxcXG4gIGFyci5wdXNoKGkpOyBcXFxcbn1cXFxcbmlmKGs+MjAwKXtcXFxcbmZvciAodmFyIGkgPSAyMDA7IGkgPCAoayA8IDEwMDEgPyBrIDogMTAwMSkgOyBpICs9IDEwMCl7XFxcXG4gIGFyci5wdXNoKGkpOyBcXFxcbn19XFxcXG52YXIgbmFtZXMgPSBbXVxcXFxubmFtZXMgPSBhcnIubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcXFxcbiAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJykge1xcXFxuICAgIHJldHVybiBpdGVtICsgXFxcXFxcXCLpobVcXFxcXFxcIjtcXFxcbiAgfSBlbHNlIHtcXFxcbiAgICByZXR1cm4gaXRlbTtcXFxcbiAgfVxcXFxufSk7XFxcXG5cXFxcbmZvciAodmFyIGogPSAwOyBqIDwgTWF0aC5taW4oYXJyLmxlbmd0aCwgbmFtZXMubGVuZ3RoKTsgaisrKSB7XFxcXG5pZihhcnJbal09PSfot7PpobUnKXtcXFxcbiAgICAgICAgICAgICBkLnB1c2goe1xcXFxyXFxcXG4gICAgICAgICAgICB0aXRsZTpub3cgPT1uYW1lc1tqXT8gJ+KAnOKAnOKAneKAnScgKyBuYW1lc1tqXS5mb250Y29sb3IoJ3JlZCcpIDogbmFtZXNbal0sXFxcXHJcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcclxcXFxuICAgICAgICAgICAgdXJsOiAkKDIzLCAn6K+36L6T5YWl6KaB6Lez6L2s5Yiw55qE6aG15pWwJykuaW5wdXQoKHRydWVfdXJsLGssbmFtZXMsaikgPT4ge1xcXFxyXFxcXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHBhcnNlSW50KGlucHV0KSkpIHtcXFxcclxcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6L6T5YWl5pyJ6K+vLOivt+i+k+WFpeS4gOS4qjF+JyArIGsgKyAn55qE5pWw5a2XJ1xcXFxyXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxyXFxcXG4gICAgICAgICAgICAgICAgbGV0IHRvUGFnZSA9IHBhcnNlSW50KGlucHV0KTtcXFxcclxcXFxuICAgICAgICAgICAgICAgIGlmICh0b1BhZ2UgPCAxIHx8IHRvUGFnZSA+IGspIHtcXFxcclxcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6L6T5YWl5pyJ6K+vLOivt+i+k+WFpeS4gOS4qjF+JyArIGsgKyAn55qE5pWw5a2XJ1xcXFxyXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgIGlmKC9mb3J1bVxcXFxcXFxcLVxcXFxcXFxcZCtcXFxcXFxcXC1cXFxcXFxcXGQrLy50ZXN0KHRydWVfdXJsKSl7XFxcXG52YXIgdXJsID0gdHJ1ZV91cmwucmVwbGFjZSgvXFxcXFxcXFxkK1xcXFxcXFxcLmh0bS8sIHRvUGFnZSArICcuaHRtJyk7XFxcXG4gICAgICAgICAgICAgIH1lbHNle1xcXFxudmFyIHVybCA9IHRydWVfdXJsLnJlcGxhY2UoL1xcXFxcXFxcLmh0bS8sICctJyArIHRvUGFnZSArICcuaHRtJyk7XFxcXG4gICAgICAgICAgICAgIH1cXFxcclxcXFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJub3dcXFxcXFxcIiwgbmFtZXNbal0pO1xcXFxuICAgICAgICAgICAgICAgIHB1dFZhcihNWV9SVUxFLnVybCwgdXJsKTtcXFxcbiAgICAgICAgICAgICAgICAvL3B1dE15VmFyKCd5aV9maXJzdHBhZ2UnLCB1cmwpO1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxyXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+i3s+i2iuWIsOS6huesrCcgKyB0b1BhZ2UgKyAn6aG1J1xcXFxyXFxcXG4gICAgICAgICAgICB9LHRydWVfdXJsLCBrLG5hbWVzLGopLFxcXFxyXFxcXG4gICAgICAgIH0pO1xcXFxuXFxcXG59ZWxzZXtcXFxcblxcXFxuaWYoYXJyW2pdPT0n6ZqP5py6Jyl7XFxcXG4gICAgICAgICAgICAgIGFycltqXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGspICsxICAgXFxcXG59ZWxzZSBpZihhcnJbal09PSflsL7pobUnK2spe1xcXFxuICAgICAgICAgICAgICBhcnJbal0gPSBrXFxcXG59ZWxzZSBpZihhcnJbal09PTEpe1xcXFxuICAgICAgICAgICAgICBuYW1lc1tqXSA9IFxcXFxcXFwi6aaW6aG1XFxcXFxcXCJcXFxcbn1lbHNlIGlmKGFycltqXT09J+i3s+mhtScpe1xcXFxuICAgICAgICAgICAgIGFycltqXSA9IDIyM1xcXFxufVxcXFxuXFxcXG4gICAgICAgICAgaWYoL2ZvcnVtXFxcXFxcXFwtXFxcXFxcXFxkK1xcXFxcXFxcLVxcXFxcXFxcZCsvLnRlc3QodHJ1ZV91cmwpKXtcXFxcbnZhciB1cmwgPSB0cnVlX3VybC5yZXBsYWNlKC9cXFxcXFxcXGQrXFxcXFxcXFwuaHRtLywgYXJyW2pdICsgJy5odG0nKTtcXFxcbiAgICAgICAgICAgICAgfWVsc2V7XFxcXG52YXIgdXJsID0gdHJ1ZV91cmwucmVwbGFjZSgvXFxcXFxcXFwuaHRtLywgJy0nICsgYXJyW2pdICsgJy5odG0nKTtcXFxcbiAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6bm93ID09bmFtZXNbal0/ICfigJzigJzigJ3igJ0nICsgbmFtZXNbal0uZm9udGNvbG9yKCdyZWQnKSA6IG5hbWVzW2pdLFxcXFxuICAgICAgICB1cmw6IHVybCArICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGFycixuYW1lcyxqKSA9PiB7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwibm93XFxcXFxcXCIsbmFtZXNbal0pO1xcXFxuICAgICAgICAgICAgcHV0VmFyKE1ZX1JVTEUudXJsLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICAvL3B1dE15VmFyKCd5aV9maXJzdHBhZ2UnLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/nqb/otorliLDkuobnrKwnICsgYXJyW2pdICsgXFxcXFxcXCLpobVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSxhcnIsbmFtZXMsaiksXFxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgICAgICAgICB9KVxcXFxufVxcXFxufX1jYXRjaChlcnIpe1xcXFxuICAgIHRvYXN0KFxcXFxcXFwi5aW95YOP5rKh5pyJ5LiL5LiA6aG15LqG77yBXFxcXFxcXCIpO1xcXFxufTtcXFxcblxcXFxuXFxcXG52YXIgbGlzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJi5wbHVnaW5fbGlzdCcpO1xcXFxubGlzdC5mb3JFYWNoKHggPT4geyAgIFxcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgdGl0bGU6IHBkZmgoeCwgJ2EmJlRleHQnKS5yZXBsYWNlKFxcXFxcXFwi44CQ56OB5Yqb44CRXFxcXFxcXCIsXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgZGVzYzogcGRmaCh4LCcuZGF0ZSYmVGV4dCcpLFxcXFxuICAgICAgIGltZzogcGQoeCwnaW1nfHxhJiZzcmN8fGRhdGEtb3JpZ2luYWwnKSxcXFxcbiAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2VyP3VybD1cXFxcXFxcIitwZCh4LCAnYSYmaHJlZicpLFxcXFxuICAgICAgIGNvbF90eXBlOiAnbW92aWVfMicsXFxcXG4gICAgICAgZXh0cmE6e1xcXFxuICAgICAgICAgIHBhZ2VUaXRsZTpwZGZoKHgsICdhJiZUZXh0JyksXFxcXG4gICAgICAgICAgICAgICAgICB9XFxcXG4gIH0pO1xcXFxufSlcXFxcblxcXFxuc2V0UmVzdWx0KGQpXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi546v5aKDXFxcIixcXFwicGF0aFxcXCI6XFxcInJlcGFpclxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnZhciBkb2N1bWVudCA9IHt9O1xcXFxudmFyIHdpbmRvdyA9IHtcXFxcbiAgICBsb2NhdGlvbjoge1xcXFxuICAgICAgICByZWxvYWQ6IGZ1bmN0aW9uKCkge1xcXFxuICAgICAgICAgICAgcmV0dXJuO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxufTtcXFxcblxcXFxuLy8g5a6a5LmJ5LiA5Liq5a+56LGh55So5LqO5a2Y5YKoIGNvb2tpZSDlkI3np7DlkozlgLznmoTplK7lgLzlr7lcXFxcbnZhciBjb29raWVzID0ge307XFxcXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICdjb29raWUnLCB7XFxcXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcXFxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXFxcXG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcXFxcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGNvb2tpZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7dmFsdWV9YCkuam9pbignOyAnKTtcXFxcbiAgICB9LFxcXFxuICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcXFxcbiAgICAgICAgdmFyIGxpc3QgPSBbXTtcXFxcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKCc7JykpIHtcXFxcbiAgICAgICAgICAgIGxpc3QgPSB2YWx1ZS5zcGxpdCgnOycpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgbGlzdCA9IFt2YWx1ZV07XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGlzdC5mb3JFYWNoKHggPT4ge1xcXFxuICAgICAgICAgICAgdmFyIGluZGV4ID0geC5pbmRleE9mKFxcXFxcXFwiPVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHZhciBrZXkgPSB4LnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpO1xcXFxuICAgICAgICAgICAgdmFyIHZhbHVlID0geC5zdWJzdHJpbmcoaW5kZXggKyAxKTtcXFxcbiAgICAgICAgICAgIGNvb2tpZXNba2V5XSA9IHZhbHVlO1xcXFxuICAgICAgICB9KVxcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5mdW5jdGlvbiBndWFyZCh1cmwsIGhlYWRvYmopIHtcXFxcbiAgICB2YXIgaGVhZCA9IGhlYWRvYmogPyBoZWFkb2JqOntcXFxcbiAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgQ29va2llOiBnZXRDb29raWUodXJsKSxcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICB2YXIgaHRtbCA9IGZldGNoKHVybCwgaGVhZCk7XFxcXG4gICAgaWYgKGh0bWwuaW5jbHVkZXMoJ19ndWFyZC9hdXRvLmpzJykpIHtcXFxcbiAgICAgICAgZG9jdW1lbnRbXFxcXFxcXCJjb29raWVcXFxcXFxcIl0gPSBnZXRDb29raWUodXJsKTtcXFxcbiAgICAgICAgZXZhbChmZXRjaChnZXRIb21lKHVybCkgKyAnL19ndWFyZC9hdXRvLmpzJykpXFxcXG4gICAgICAgIGh0bWwgPSBmZXRjaCh1cmwsIHtcXFxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICBDb29raWU6IGRvY3VtZW50W1xcXFxcXFwiY29va2llXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgLy9sb2coZG9jdW1lbnRbXFxcXFxcXCJjb29raWVcXFxcXFxcIl0pXFxcXG4gICAgcmV0dXJuIGh0bWxcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gY3NwbGl0KGEsIGIsIGMpIHtcXFxcbiAgICBiID0gcGFyc2VJbnQoYiwgMTApIHx8IDc2O1xcXFxuICAgIGMgPSBjIHx8ICdcXFxcXFxcXHJcXFxcXFxcXG4nO1xcXFxuICAgIGlmIChiIDwgMSkge1xcXFxuICAgICAgICByZXR1cm4gZmFsc2VcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIGEubWF0Y2gobmV3IFJlZ0V4cChcXFxcXFxcIi57MCxcXFxcXFxcIiArIGIgKyBcXFxcXFxcIn1cXFxcXFxcIixcXFxcXFxcImdcXFxcXFxcIikpLmpvaW4oYylcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcmV1cmwoYSkge1xcXFxuICAgIHZhciBiID0gJyc7XFxcXG4gICAgdmFyIGMgPSBjc3BsaXQoYSwgOCkuc3BsaXQoJ1xcXFxcXFxcclxcXFxcXFxcbicpO1xcXFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgKGMubGVuZ3RoIC0gMSk7IGkrKykge1xcXFxuICAgICAgICBiID0gYiArIFN0cmluZy5mcm9tQ2hhckNvZGUoKHBhcnNlSW50KGNbaV0sIDIpIC0gMTApLnRvU3RyaW5nKDEwKSlcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIGJcXFxcbn1cXFwifV1cIixcInByb3h5XCI6XCJcIn0iLCJwaWNVcmwiOiJodHRwczovL3d3dy5mZG5zMS54eXovdmlldy9pbWcvY2FuZzUucG5nIiwidGl0bGUiOiLnlarCt+S7k19fX19fX19f6aOO5ZC56Iqx5rW36L276Iie77yM6YaJ5Y2n55Wq5LuT5qKm5Lmh44CCIn0=
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement