Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥新概念青少年版@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImdtdE1vZGlmaWVkXCI6MCxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWkuOWFi+WIl+ihqEFQSVwiLFwicGF0aFwiOlwiUXVhcmtTaGFyZUFwaVwiLFwicnVsZVwiOlwianM6XFxuLy9AYXV0aG9yIExveURnSWtcXG5sZXQgaHR0cFJlcXVlc3QgPSAkLnJlcXVpcmUoXFxcImh0dHBSZXF1ZXN0XFxcIik7XFxubGV0IENvb2tpZU1hbmFnZT0kLnJlcXVpcmUoXFxcIkNvb2tpZU1hbmFnZVxcXCIpO1xcbmxldCBmcm9tRHJpdmUgPSBtb2R1bGUuaW1wb3J0UGFyYW07XFxubGV0IHByLCBiYXNlVXJsLCBjb29raWU7XFxuaWYgKGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIikge1xcbiAgICBiYXNlVXJsID0gXFxcImh0dHBzOi8vcGMtYXBpLnVjLmNuXFxcIjtcXG4gICAgcHIgPSBcXFwiVUNCcm93c2VyXFxcIjtcXG4gICAgY29va2llID0gZ2V0SXRlbShcXFwidWNDb29raWVcXFwiLCBcXFwiXFxcIik7XFxufSBlbHNlIHtcXG4gICAgYmFzZVVybCA9IFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuXFxcIjtcXG4gICAgcHIgPSBcXFwidWNwcm9cXFwiO1xcbiAgICBjb29raWUgPSBnZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIFxcXCJcXFwiKTtcXG59XFxuXFxuY29uc3QgY29va2llTWFuYWdlID0gbmV3IENvb2tpZU1hbmFnZShjb29raWUpO1xcbmZ1bmN0aW9uIFF1YXJrU2hhcmVBcGkoc2hhcmVJZCwgc2hhcmVQd2QpIHtcXG4gICAgdGhpcy5zaGFyZUlkID0gc2hhcmVJZDtcXG4gICAgdGhpcy5zaGFyZVB3ZCA9IHNoYXJlUHdkO1xcbiAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayA9ICgoKSA9PiB2b2lkIDApO1xcbiAgICAvL3RoaXMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW4gfHwgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxufVxcbk9iamVjdC5hc3NpZ24oUXVhcmtTaGFyZUFwaS5wcm90b3R5cGUsIHtcXG4gICAgc2V0UmVmcmVzaChyZWZyZXNoQ2FsbEJhY2spIHtcXG4gICAgICAgIHRoaXMucmVmcmVzaENhbGxCYWNrID0gcmVmcmVzaENhbGxCYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHNldFRva2VuKHNoYXJlVG9rZW4pIHtcXG4gICAgICAgIHRoaXMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW47XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgcmVxdWVzdEh0dHAoYXBpKSB7XFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KGFwaS5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikgPyBhcGkgOiAoYmFzZVVybCArIGFwaSkpLnN1Y2Nlc3MoKGJvZHkscmVzKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGJvZHkuc3RhdHVzICE9PSAyMDApIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJvZHkubWVzc2FnZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGNvb2tpZU1hbmFnZS5hZGQocmVzLmhlYWRlcnNbXFxcInNldC1jb29raWVcXFwiXSk7XFxuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XFxuICAgICAgICB9KS5oZWFkZXJzKHtcXG4gICAgICAgICAgICBcXFwiY29va2llXFxcIjogY29va2llTWFuYWdlLmdldCgpLFxcbiAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIHF1YXJrLWNsb3VkLWRyaXZlLzIuNS4yMCBDaHJvbWUvMTAwLjAuNDg5Ni4xNjAgRWxlY3Ryb24vMTguMy41LjQtYjQ3ODQ5MTEwMCBTYWZhcmkvNTM3LjM2IENoYW5uZWwvcGNra19vdGhlcl9jaFxcXCIsXFxuICAgICAgICAgICAgXFxcInJlZmVyZXJcXFwiOiBiYXNlVXJsXFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgZ2V0VG9rZW4oKSB7XFxuICAgICAgICBpZiAodGhpcy5zaGFyZUlkICE9PSBcXFwic2VsZlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcIlxcXCI7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIGdldFBpY0Nvb2tpZSgpe1xcbiAgICAgICAgcmV0dXJuIGNvb2tpZU1hbmFnZS5nZXQoKTtcXG4gICAgICAgIFxcbiAgICB9LFxcbiAgICBnZXRTaGFyZVRva2VuKCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucmVxdWVzdEh0dHAoXFxcIi8xL2Nsb3VkZHJpdmUvc2hhcmUvc2hhcmVwYWdlL3Rva2VuXFxcIikuYm9keSh7XFxuICAgICAgICAgICAgXFxcInB3ZF9pZFxcXCI6IHRoaXMuc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwicGFzc2NvZGVcXFwiOiB0aGlzLnNoYXJlUHdkLFxcbiAgICAgICAgfSkuYm9keVRvU3RyaW5nKHRydWUpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuZGF0YS5zdG9rZW47XFxuICAgICAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayhyZXN1bHQuZGF0YS5zdG9rZW4sIHRoaXMpO1xcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hhcmVUb2tlbjtcXG4gICAgfSxcXG4gICAgX2dldFNlbGZMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnJlcXVlc3RIdHRwKFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuLzEvY2xvdWRkcml2ZS9maWxlL3NvcnQ/cHI9XFxcIiArIHByICsgXFxcIiZmcj1wY1xcXCIpLmJ1aWxkVXJsKHtcXG4gICAgICAgICAgICBwZGlyX2ZpZDogZmlsZUlkIHx8IFxcXCIwXFxcIixcXG4gICAgICAgICAgICBmb3JjZTogMCxcXG4gICAgICAgICAgICBfcGFnZTogcGFnZSxcXG4gICAgICAgICAgICBfc2l6ZTogMTAwLFxcbiAgICAgICAgICAgIHVjX3BhcmFtX3N0cjogXFxcIlxcXCIsXFxuICAgICAgICAgICAgX2ZldGNoX3RvdGFsOiAxLFxcbiAgICAgICAgICAgIF9mZXRjaF9zdWJfZGlyczogMCxcXG4gICAgICAgICAgICBfc29ydDogXFxcImZpbGVfdHlwZTphc2MsXFxcIiArIG9yZGVyQnlcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgX2dldFNoYXJlTGlzdEZpbGUoZmlsZUlkLCBwYWdlLCBvcmRlckJ5KSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0SHR0cChcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2UvZGV0YWlsP3ByPVxcXCIgKyBwciArIFxcXCImZnI9cGNcXFwiKS5idWlsZFVybCh7XFxuICAgICAgICAgICAgcHdkX2lkOiB0aGlzLnNoYXJlSWQgfHwgXFxcIlxcXCIsXFxuICAgICAgICAgICAgc3Rva2VuOiBlbmNvZGVVUklDb21wb25lbnQodGhpcy5nZXRUb2tlbigpIHx8IFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBwZGlyX2ZpZDogZmlsZUlkIHx8IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIGZvcmNlOiAwLFxcbiAgICAgICAgICAgIF9wYWdlOiBwYWdlLFxcbiAgICAgICAgICAgIF9zaXplOiAxMDAsXFxuICAgICAgICAgICAgX2ZldGNoX2Jhbm5lcjogMSxcXG4gICAgICAgICAgICBfZmV0Y2hfc2hhcmU6IDEsXFxuICAgICAgICAgICAgX2ZldGNoX3RvdGFsOiAxLFxcbiAgICAgICAgICAgIF9zb3J0OiBcXFwiZmlsZV90eXBlOmFzYyxcXFwiICsgb3JkZXJCeVxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoKGVyciwgcmVzLCBodHRwKSA9PiB7XFxuICAgICAgICAgICAgaWYgKEpTT04ucGFyc2UocmVzLmJvZHkpLm1lc3NhZ2UuaW5jbHVkZXMoJ3N0b2tlbicpKSB7XFxuICAgICAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgICAgICBidWlsZFVybDoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b2tlbjogZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZ2V0U2hhcmVUb2tlbigpIHx8IFxcXCJcXFwiKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9LFxcbiAgICBnZXRMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpIHtcXG4gICAgICAgIGlmICh0aGlzLnNoYXJlSWQgIT09IFxcXCJzZWxmXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTaGFyZUxpc3RGaWxlKGZpbGVJZCwgcGFnZSwgb3JkZXJCeSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTZWxmTGlzdEZpbGUoZmlsZUlkLCBwYWdlLCBvcmRlckJ5KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IFF1YXJrU2hhcmVBcGk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJodHRwUmVxdWVzdFwiLFwicGF0aFwiOlwiaHR0cFJlcXVlc3RcIixcInJ1bGVcIjpcImZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xcbiAgICB0aGlzLnVybCA9IHVybDtcXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xcbiAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXG4gICAgfSk7XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFjayA9IChlcnIsIHJlcykgPT4ge3Rocm93IGVycn07XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9IChlcnIsIHJlcywgdHJ5UmVzdGFydCkgPT4gZmFsc2U7XFxuICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrID0gKGJvZHksIHN0YXR1c0NvZGUsIGhlYWRlcnMpID0+IGJvZHk7XFxuICAgIHRoaXMuZXJyb3JUeXBlQ2FsbGJhY2sgPSAoZXJyLCByZXMpID0+IGVycjtcXG4gICAgdGhpcy5zdGFydFJlcXVlc3QgPSBmZXRjaDtcXG4gICAgdGhpcy5fYm9keVRvU3RyaW5nID0gZmFsc2U7XFxuICAgIHRoaXMuYnVpbGRQYXJhbSA9IHZvaWQoMCk7XFxufVxcblxcbk9iamVjdC5hc3NpZ24oaHR0cFJlcXVlc3QucHJvdG90eXBlLCB7XFxuICAgIGJvZHlUb1N0cmluZyhmbGFnKSB7XFxuICAgICAgICB0aGlzLl9ib2R5VG9TdHJpbmcgPSAhIWZsYWc7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgYm9keShib2R5KSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMuYm9keSA9IGJvZHkgfHwgdm9pZCAwO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGJ1aWxkVXJsKGJ1aWxkUGFyYW0pIHtcXG4gICAgICAgIHRoaXMuYnVpbGRQYXJhbSA9IGJ1aWxkUGFyYW0gfHwge307XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgc2V0U3RhcnRSZXF1ZXN0RnVuYyhmdW5jKSB7XFxuICAgICAgICB0aGlzLnN0YXJ0UmVxdWVzdCA9IGZ1bmM7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgaGVhZGVycyhoZWFkZXJzKSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IGhlYWRlcnMgfHwgdm9pZCAwO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHN1Y2Nlc3Moc3VjY2Vzc0NhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIHN1Y2Nlc3NDYWxsYmFjayAhPT0gXFxcImZ1bmN0aW9uXFxcIikgcmV0dXJuIHRoaXM7XFxuICAgICAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayA9IHN1Y2Nlc3NDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvcihlcnJvckNhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIGVycm9yQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvclR5cGUoZXJyb3JUeXBlQ2FsbGJhY2spIHtcXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JUeXBlQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvclR5cGVDYWxsYmFjayA9IGVycm9yVHlwZUNhbGxiYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGVycm9yV2l0aFJldHJ5KHJldHJ5Q291bnQsIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgcmV0cnlDb3VudCA9PT0gXFxcImZ1bmN0aW9uXFxcIiAmJiB0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9PT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gcmV0cnlDb3VudDtcXG4gICAgICAgICAgICByZXRyeUNvdW50ID0gMTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSAhPT0gXFxcImZ1bmN0aW9uXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfVxcbiAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gTnVtYmVyKHJldHJ5Q291bnQpO1xcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gZXJyb3JDYWxsYmFja1dpdGhSZXRyeTtcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBzdGFydCh0b0pzb24pIHtcXG4gICAgICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5ib2R5ID09PSBcXFwib2JqZWN0XFxcIiAmJiB0aGlzLl9ib2R5VG9TdHJpbmcpIHtcXG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmJvZHkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIHJlcyA9IEpTT04ucGFyc2UodGhpcy5zdGFydFJlcXVlc3QodGhpcy5idWlsZFBhcmFtP2J1aWxkVXJsKHRoaXMudXJsLCB0aGlzLmJ1aWxkUGFyYW0pOnRoaXMudXJsLCBvcHRpb25zKSk7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPD0gMzAwKSB7XFxuICAgICAgICAgICAgICAgIGxldCBib2R5ID0gcmVzLmJvZHk7XFxuICAgICAgICAgICAgICAgIGlmICh0b0pzb24pIHtcXG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Y2Nlc3NDYWxsYmFjayhib2R5LCByZXMpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihTdHJpbmcocmVzLnN0YXR1c0NvZGUpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBlcnIgPSB0aGlzLmVycm9yVHlwZUNhbGxiYWNrKGVyciwgcmVzKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh0aGlzLnJldHJ5Q291bnQpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHRyeVJlc3VsdCA9IHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeShlcnIsIHJlcywgdGhpcyk7XFxuICAgICAgICAgICAgICAgIGlmICh0cnlSZXN1bHQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudC0tO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQodG9Kc29uKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckNhbGxiYWNrKGVyciwgcmVzKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yQ2FsbGJhY2soZXJyLCByZXMpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XFxuICAgICAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIG1lcmdlSGVhZEFuZEJvZHkob3B0aW9ucykge1xcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XFxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucy5oZWFkZXJzfHx7fSwgb3B0aW9ucy5oZWFkZXJzKTtcXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiICYmIHR5cGVvZiBvcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMuYm9keXx8e30sIG9wdGlvbnMuYm9keSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYnVpbGRVcmwgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmJ1aWxkUGFyYW18fHt9LCBvcHRpb25zLmJ1aWxkVXJsKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9XFxufSk7XFxuXFxuT2JqZWN0LmFzc2lnbihodHRwUmVxdWVzdCwge1xcbiAgICBmZXRjaCh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKTtcXG4gICAgfSxcXG4gICAgcG9zdCh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpO1xcbiAgICB9LFxcbiAgICByZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocmVxdWVzdCk7XFxuICAgIH0sXFxuICAgIHBvc3RSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdFJlcXVlc3QpO1xcbiAgICB9LFxcbiAgICBmZXRjaENvb2tpZSh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKGZldGNoQ29va2llKTtcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IGh0dHBSZXF1ZXN0O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5aS45YWL5YiX6KGoXCIsXCJwYXRoXCI6XCJxdWFya0xpc3RcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkID0gW107XFxuXFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiKSk7XFxuYWRkTGlzdGVuZXIoXFxcIm9uUmVmcmVzaFxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIpKTtcXG5sZXQgc29VcmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInJlYWx1cmxcXFwiLCBcXFwiXFxcIikpO1xcbmxldCBmcm9tRHJpdmUgPSBNWV9QQVJBTVMuZnJvbURyaXZlIHx8IFxcXCJxdWFya1xcXCI7XFxuXFxuaWYgKHNvVXJsLmluY2x1ZGVzKFxcXCJkcml2ZS51Yy5jblxcXCIpKSB7XFxuICAgIGZyb21Ecml2ZSA9IFxcXCJ1Y1xcXCI7XFxufVxcbmxldCByZWFsdXJsID0gc29Vcmwuc3BsaXQoXFxcIj9cXFwiKVswXTtcXG5sZXQgdXJsRGF0YSA9IHJlYWx1cmwuc3BsaXQoXFxcIi9cXFwiKTtcXG5cXG5sZXQgc2hhcmVJZCA9IE1ZX1BBUkFNUy5zaGFyZUlkIHx8IHVybERhdGFbNF0ucmVwbGFjZShcXFwiI1xcXCIsIFxcXCJcXFwiKTtcXG5sZXQgc2hhcmVQd2QgPSBnZXRQYXJhbShcXFwic2hhcmVQd2RcXFwiLCBNWV9QQVJBTVMuc2hhcmVQd2QgfHwgZ2V0UGFyYW0oXFxcInBhc3Njb2RlXFxcIiwgXFxcIlxcXCIsIHNvVXJsKSB8fCBcXFwiXFxcIik7XFxubGV0IHNoYXJlVG9rZW4gPSBnZXRQYXJhbShcXFwic2hhcmVUb2tlblxcXCIsIE1ZX1BBUkFNUy5zaGFyZVRva2VuIHx8IFxcXCJcXFwiKTtcXG5cXG5sZXQgZmlsZUlkID0gTVlfUEFSQU1TLmZpbGVJZDtcXG5cXG5sZXQgc29ydCA9IHtcXG4gICAgXFxcIuWQjeensOato+W6j1xcXCI6IFxcXCJmaWxlX25hbWU6YXNjXFxcIixcXG4gICAgXFxcIuWQjeensOWAkuW6j1xcXCI6IFxcXCJmaWxlX25hbWU6ZGVzY1xcXCIsXFxuICAgIFxcXCLml7bpl7TmraPluo9cXFwiOiBcXFwidXBkYXRlZF9hdDphc2NcXFwiLFxcbiAgICBcXFwi5pe26Ze05YCS5bqPXFxcIjogXFxcInVwZGF0ZWRfYXQ6ZGVzY1xcXCJcXG59O1xcbmxldCBzdHlsZXMgPSBbXFxcInRleHRfMVxcXCIsIFxcXCJhdmF0YXJcXFwiXTtcXG5cXG5sZXQgc29ydFZhbHVlID0gc29ydFtnZXRJdGVtKFxcXCJzb3J0S2V5XFxcIiwgXFxcIuWQjeensOato+W6j1xcXCIpXTtcXG5sZXQgc3R5bGUgPSBnZXRJdGVtKFxcXCJzdHlsZVxcXCIsIHN0eWxlc1swXSk7XFxuaWYgKE1ZX1BBR0UgPT0gMSkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIiA/IFxcXCJVQ+e9keebmFxcXCIgOiBcXFwi5aS45YWL572R55uYXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl81XFxcIixcXG4gICAgICAgIHBpY191cmw6IGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIiA/IFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvdHViaWFvL2VyZGkvMTQucG5nXFxcIiA6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2t1YWtlXFxcIixcXG4gICAgICAgIHVybDogJChcXFwi54K55Ye75Yqf6IO95oyJ6ZKuPT7kuKrkurrotKblj7fnrqHnkIbljbPlj6/nmbvlvZXotKblj7dcXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogc3R5bGUsXFxuICAgICAgICB1cmw6ICQoc3R5bGVzLCAxLCAn6K+36YCJ5oupJykuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKCdzdHlsZScsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfaWNvbi5zdmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBcXFwi5ZCN56ew5q2j5bqPXFxcIiksXFxuICAgICAgICB1cmw6ICQoT2JqZWN0LmtleXMoc29ydCksIDEsICfor7fpgInmi6knKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBpbnB1dClcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfc29ydC5zdmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcInF1YXJrX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpLFxcbiAgICAgICAgdXJsOiAkKFtcXFwi6L2s56CBXFxcIiwgXFxcIuWOn+eUu1xcXCIsIFxcXCLmma7pgJrljp/nlLtcXFwiLCBcXFwiY3VybFxcXCIsIFxcXCJhcmlhMlxcXCIsIFxcXCJSUENcXFwiXSwgMiwgXFxcIuaSreaUvuaooeW8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwicXVhcmtfcGxheU1vZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX3BsYXkuc3ZnXFxcIixcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWKn+iDvVxcXCIsXFxuICAgICAgICB1cmw6ICQoW1xcXCLot7PovazlpLjlhYtBUFBcXFwiLCBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIiwgXFxcIuS4quS6uui0puWPt+euoeeQhlxcXCIsIFxcXCLljp/nlLvkuIvovb3nur/nqItcXFwiLCBcXFwi6K6+572uUlBDXFxcIl0sIDIpLnNlbGVjdCgoc2hhcmVJZCwgc2hhcmVQd2QsIGZyb21Ecml2ZSkgPT4ge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIui3s+i9rOWkuOWFi0FQUFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJxa2xpbms6Ly93d3cudWMuY24vYjIwYjg0ZmQ3MzVhOGRkM2Y3NTQxMTI5YmFjYzRlOWE/YWN0aW9uPW9wZW5fdXJsJnVybD1odHRwczovL3Bhbi5xdWFyay5jbi9zL1xcXCIgKyBzaGFyZUlkO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLkuKrkurrotKblj7fnrqHnkIZcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImFjY291bnRcXFwiKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5Y6f55S75LiL6L2957q/56iLXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXCJzcGVlZFRocmVhZFxcXCIsIFxcXCIxMFxcXCIpLCBcXFwi6K+36L6T5YWlMy0zMuS5i+mXtOeahOaVtOaVsFxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGVlZFRocmVhZCA9IHBhcnNlSW50KGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGVlZFRocmVhZCA8IDMgfHwgc3BlZWRUaHJlYWQgPiAzMikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7kuI3lkIjms5VcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwic3BlZWRUaHJlYWRcXFwiLCBTdHJpbmcoc3BlZWRUaHJlYWQpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIikge1xcbiAgICAgICAgICAgICAgICBpZiAoZnJvbURyaXZlID09PSBcXFwidWNcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgYnVpbGRVcmwoXFxcImh0dHBzOi8vZHJpdmUudWMuY24vcy9cXFwiICsgc2hhcmVJZCArIFxcXCI/cHVibGljPTEjL2xpc3Qvc2hhcmVcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBidWlsZFVybChcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY24vcy9cXFwiICsgc2hhcmVJZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3Njb2RlOiBzaGFyZVB3ZFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi6K6+572uUlBDXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChbXFxcIuiuvue9rlJQQ+WcsOWdgFxcXCIsIFxcXCLorr7nva5Ub2tlblxcXCIsIFxcXCLkuIvovb3nm67lvZVcXFwiXSkuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIuiuvue9rlJQQ+WcsOWdgFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb3duVG9vbCA9ICQucmVxdWlyZShcXFwiRG93blRvb2xcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXCJycGNVcmxcXFwiLCBEb3duVG9vbC5nZXREZWZScGNVcmwoKSksIFxcXCJSUEPlnLDlnYAs5Li656m66Ieq5Yqo6I635Y+W5bGA5Z+f572R5Zyw5Z2AXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJwY1VybFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJycGNVcmxcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/muIXpmaTorr7nva5cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi6K6+572uVG9rZW5cXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoZ2V0SXRlbShcXFwicnBjQXJpYVRva2VuXFxcIiwgXFxcIlxcXCIpLCBcXFwiVG9rZW4s5rKh5pyJ5bCx5LiN5aGrXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJycGNBcmlhVG9rZW5cXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoZ2V0SXRlbShcXFwicnBjRG93bkRpclxcXCIsIFxcXCJcXFwiKSwgXFxcIuS4i+i9veS/neWtmOebruW9lSzkuLrnqbrlsLHmjInkuIvovb3lmajpu5jorqTot6/lvoRcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJwY0Rvd25EaXJcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBzaGFyZUlkLCBzaGFyZVB3ZCwgZnJvbURyaXZlKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl81XFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvaW1nL2FsaV9maWxlaW50by5zdmdcXFwiLFxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnbGluZV9ibGFuaydcXG4gICAgfSk7XFxufVxcblxcblxcbmxldCBRdWFya1NoYXJlQXBpID0gJC5yZXF1aXJlKFxcXCJRdWFya1NoYXJlQXBpXFxcIiwgZnJvbURyaXZlKTtcXG5sZXQgcXVhcmtTaGFyZUFwaSA9IG5ldyBRdWFya1NoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkKS5zZXRUb2tlbihzaGFyZVRva2VuKS5zZXRSZWZyZXNoKChzaGFyZVRva2VuKSA9PiB7XFxuICAgIE1ZX1BBUkFNUy5zaGFyZVRva2VuID0gc2hhcmVUb2tlbjtcXG4gICAgc2V0UGFnZVBhcmFtcyhNWV9QQVJBTVMpO1xcbn0pO1xcblxcbmZ1bmN0aW9uIGZvcm1hdFNpemUoc2l6ZSkge1xcbiAgICBpZiAoIXNpemUpIHtcXG4gICAgICAgIHJldHVybiAnJztcXG4gICAgfVxcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xcbiAgICBsZXQgaSA9IDA7XFxuICAgIHdoaWxlIChzaXplID49IDEwMjQpIHtcXG4gICAgICAgIHNpemUgLz0gMTAyNDtcXG4gICAgICAgIGkrKztcXG4gICAgfVxcbiAgICBzaXplID0gaSA/IE51bWJlcihzaXplLnRvRml4ZWQoMikpIDogc2l6ZTtcXG4gICAgcmV0dXJuIGAke3NpemV9ICR7dW5pdHNbaV19YDtcXG59XFxuXFxubGV0IHN1YkV4dHMgPSBbXFxcInZ0dFxcXCIsIFxcXCJzcnRcXFwiLCBcXFwiYXNzXFxcIl07XFxubGV0IHRpdGxlSGVhZCA9IHtcXG4gICAgdmlkZW86IFxcXCLwn46sXFxcIixcXG4gICAgYXVkaW86IFxcXCLwn461XFxcIixcXG4gICAgZG9jOiBcXFwi8J+TkVxcXCIsXFxuICAgIGltYWdlOiBcXFwi8J+WvFxcXCIsXFxuICAgIGFyY2hpdmU6IFxcXCLwn5OmXFxcIixcXG4gICAgXFxcImRlZmF1bHRcXFwiOiBcXFwi4p2TXFxcIlxcbn07XFxuXFxuZnVuY3Rpb24gZ2V0SGVhZCh0eXBlLCBleHQpIHtcXG4gICAgbGV0IGhlYWQgPSB0aXRsZUhlYWRbdHlwZV07XFxuXFxuICAgIHJldHVybiBoZWFkIHx8IFxcXCLinZNcXFwiO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXREb3duVXJsKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbiwgY2F0ZWdvcnksIGZyb21Ecml2ZSkge1xcblxcbiAgICB0cnkge1xcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOiOt+WPli4uLlxcXCIpO1xcbiAgICAgICAgbGV0IHBsYXlVcmxDYWNoZSA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiLCB7fSk7XFxuICAgICAgICBpZiAocGxheVVybENhY2hlW2ZpZF0pIHtcXG4gICAgICAgICAgICByZXR1cm4gcGxheVVybENhY2hlW2ZpZF07XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSAkLnJlcXVpcmUoXFxcInBsYXlcXFwiLCBmcm9tRHJpdmUpLmdldFBsYXlVcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSk7XFxuICAgICAgICAgICAgcGxheVVybENhY2hlW2ZpZF0gPSB1cmw7XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIsIHBsYXlVcmxDYWNoZSk7XFxuICAgICAgICAgICAgcmV0dXJuIHVybDtcXG4gICAgICAgIH1cXG4gICAgfSBmaW5hbGx5IHtcXG4gICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgIH1cXG59XFxudHJ5IHtcXG4gICAgdmFyIHJlcyA9IHF1YXJrU2hhcmVBcGkuZ2V0TGlzdEZpbGUoZmlsZUlkLCBNWV9QQUdFLCBzb3J0VmFsdWUpO1xcbiAgICAvL+iuvue9ruagh+mimFxcbiAgICB2YXIgbGlzdCA9IHJlcy5kYXRhLmxpc3QgfHwgW107XFxuICAgIGlmIChzaGFyZUlkICE9PSBcXFwic2VsZlxcXCIpIHtcXG4gICAgICAgIHNldFBhZ2VUaXRsZShyZXMuZGF0YS5zaGFyZS50aXRsZSk7XFxuXFxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDAgJiYgIWZpbGVJZCkge1xcbiAgICAgICAgICAgIHJlcyA9IHF1YXJrU2hhcmVBcGkuZ2V0TGlzdEZpbGUocmVzLmRhdGEuc2hhcmUuZmlyc3RfZmlkLCBNWV9QQUdFLCBzb3J0VmFsdWUpO1xcbiAgICAgICAgICAgIHNldFBhZ2VUaXRsZShyZXMuZGF0YS5zaGFyZS50aXRsZSk7XFxuICAgICAgICAgICAgdmFyIGxpc3QgPSByZXMuZGF0YS5saXN0IHx8IFtdO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCBuY29va2llID0gcXVhcmtTaGFyZUFwaS5nZXRQaWNDb29raWUoKTtcXG4gICAgLy9sb2cobmNvb2tpZSlcXG4gICAgbGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xcbiAgICAgICAgLy/liKTmlq3mmK/lkKbmlofku7blpLlcXG4gICAgICAgIGlmIChpdGVtLmRpcikge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi8J+TglxcXCIgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBpdGVtLmluY2x1ZGVfaXRlbXMgKyAn6aG5ICAnLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L3R1Ymlhby9tZXNzeS8yNy5zdmdcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3BhZ2U9ZnlwYWdlXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHN0eWxlLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBpdGVtLmZpZCxcXG4gICAgICAgICAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICBmcm9tRHJpdmVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogZ2V0SGVhZChpdGVtLm9ial9jYXRlZ29yeSkgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBmb3JtYXRTaXplKGl0ZW0uc2l6ZSksXFxuICAgICAgICAgICAgICAgIHBpY191cmw6ICQoaXRlbS50aHVtYm5haWwsIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZTogbmNvb2tpZVxcbiAgICAgICAgICAgICAgICB9KS5pbWFnZSgpLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoZ2V0RG93blVybCwgaXRlbS5maWQsIGl0ZW0uc2hhcmVfZmlkX3Rva2VuLCBzaGFyZUlkLCBxdWFya1NoYXJlQXBpLmdldFRva2VuKCksIGl0ZW0ub2JqX2NhdGVnb3J5LCBmcm9tRHJpdmUpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogaXRlbS5maWQsXFxuICAgICAgICAgICAgICAgICAgICAvL2luaGVyaXRUaXRsZTogZmFsc2UsXFxuXFxuICAgICAgICAgICAgICAgICAgICBjbHM6ICdwbGF5bGlzdCAnICsgaXRlbS5vYmpfY2F0ZWdvcnlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9XFxuXFxuICAgIH0pO1xcbn0gY2F0Y2ggKGUpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBlLm1lc3NhZ2UsXFxuICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcyhcXFwi5o+Q5Y+W56CBXFxcIikpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLovpPlhaXmj5Dlj5bnoIFcXFwiLFxcbiAgICAgICAgICAgIHVybDogJCgpLmlucHV0KChNWV9QQVJBTVMpID0+IHtcXG4gICAgICAgICAgICAgICAgc2V0UGFnZVBhcmFtcyhPYmplY3QuYXNzaWduKHt9LCBNWV9QQVJBTVMsIHtcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBpbnB1dFxcbiAgICAgICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgfSwgTVlfUEFSQU1TKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJwbGF5XCIsXCJwYXRoXCI6XCJwbGF5XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZnJvbURyaXZlID0gbW9kdWxlLmltcG9ydFBhcmFtO1xcbmxldCBwciwgaG9tZVVybCwgYXBpLCBjb29raWU7XFxuaWYgKGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIikge1xcbiAgICBob21lVXJsID0gXFxcImh0dHBzOi8vZHJpdmUudWMuY24vXFxcIjtcXG4gICAgcHIgPSBcXFwiVUNCcm93c2VyXFxcIjtcXG4gICAgYXBpID0gXFxcImh0dHBzOi8vcGMtYXBpLnVjLmNuXFxcIjtcXG4gICAgY29va2llID0gZ2V0SXRlbShcXFwidWNDb29raWVcXFwiLCBcXFwiXFxcIik7XFxufSBlbHNlIHtcXG4gICAgaG9tZVVybCA9IFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuL1xcXCI7XFxuICAgIHByID0gXFxcInVjcHJvXFxcIjtcXG4gICAgYXBpID0gXFxcImh0dHBzOi8vZHJpdmUucXVhcmsuY25cXFwiO1xcbiAgICBjb29raWUgPSBnZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIFxcXCJcXFwiKTtcXG59XFxuXFxubGV0IENvb2tpZU1hbmFnZSA9ICQucmVxdWlyZShcXFwiQ29va2llTWFuYWdlXFxcIik7XFxuXFxuY29uc3QgY29va2llTWFuYWdlID0gbmV3IENvb2tpZU1hbmFnZShjb29raWUpO1xcbmxldCBodHRwUmVxdWVzdCA9ICQucmVxdWlyZShcXFwiaHR0cFJlcXVlc3RcXFwiKTtcXG5cXG5mdW5jdGlvbiB3YWl0U2xlZXAodGltZSkge1xcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWUgfHwgNjAwKTtcXG59XFxuXFxuZnVuY3Rpb24gcmVxdWVzdEh0dHAodXJsKSB7XFxuICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsKVxcbiAgICAgICAgLnN1Y2Nlc3MoKGJvZHksIHJlcykgPT4ge1xcbiAgICAgICAgICAgIGlmIChib2R5LnN0YXR1cyAhPT0gMjAwKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5Lm1lc3NhZ2UpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBjb29raWVNYW5hZ2UuYWRkKHJlcy5oZWFkZXJzW1xcXCJzZXQtY29va2llXFxcIl0pO1xcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xcbiAgICAgICAgfSlcXG4gICAgICAgIC5lcnJvclR5cGUoKGVyciwgcmVzKSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnBhcnNlKHJlcy5ib2R5KS5tZXNzYWdlKTtcXG4gICAgICAgIH0pXFxuICAgICAgICAuYm9keVRvU3RyaW5nKHRydWUpXFxuICAgICAgICAuaGVhZGVycyh7XFxuICAgICAgICAgICAgY29va2llOiBjb29raWVNYW5hZ2UuZ2V0KCksXFxuICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgcXVhcmstY2xvdWQtZHJpdmUvMi41LjIwIENocm9tZS8xMDAuMC40ODk2LjE2MCBFbGVjdHJvbi8xOC4zLjUuNC1iNDc4NDkxMTAwIFNhZmFyaS81MzcuMzYgQ2hhbm5lbC9wY2trX290aGVyX2NoXFxcIixcXG4gICAgICAgICAgICBcXFwicmVmZXJlclxcXCI6IGhvbWVVcmxcXG4gICAgICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXREcml2ZUluZm8oKSB7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2UvZGlyP3ByPVxcXCIgKyBwciArIFxcXCImZnI9cGMmYXZlcj0xXFxcIikuc3RhcnQodHJ1ZSk7XFxufVxcblxcbmZ1bmN0aW9uIGNyZWF0ZVNhdmVUYXNrKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbikge1xcbiAgICBsZXQgZHJpdmVJbmZvID0gZ2V0RHJpdmVJbmZvKCk7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2Uvc2F2ZT9wcj1cXFwiICsgcHIgKyBcXFwiJmZyPXBjXFxcIikuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5ib2R5KHtcXG4gICAgICAgIFxcXCJmaWRfbGlzdFxcXCI6IFtcXG4gICAgICAgICAgICBmaWRcXG4gICAgICAgIF0sXFxuICAgICAgICBcXFwiZmlkX3Rva2VuX2xpc3RcXFwiOiBbXFxuICAgICAgICAgICAgZmlkX3Rva2VuXFxuICAgICAgICBdLFxcbiAgICAgICAgXFxcInRvX3BkaXJfZmlkXFxcIjogZHJpdmVJbmZvLmRhdGEuZGlyLmZpZCxcXG4gICAgICAgIFxcXCJwd2RfaWRcXFwiOiBwd2RfaWQsXFxuICAgICAgICBcXFwic3Rva2VuXFxcIjogc3Rva2VuLFxcbiAgICAgICAgXFxcInBkaXJfZmlkXFxcIjogZHJpdmVJbmZvLmRhdGEuZGlyLnBkaXJfZmlkXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBjcmVhdGVEZWxldGVUYXNrKGZpZCkge1xcbiAgICBsZXQgZHJpdmVJbmZvID0gZ2V0RHJpdmVJbmZvKCk7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS9maWxlL2RlbGV0ZT9wcj1cXFwiICsgcHIgKyBcXFwiJmZyPXBjXFxcIikuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5ib2R5KHtcXG4gICAgICAgIFxcXCJhY3Rpb25fdHlwZVxcXCI6IDIsXFxuICAgICAgICBcXFwiZmlsZWxpc3RcXFwiOiBbXFxuICAgICAgICAgICAgZmlkXFxuICAgICAgICBdLFxcbiAgICAgICAgXFxcImV4Y2x1ZGVfZmlkc1xcXCI6IFtdXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiB0YXNrKHRhc2tfaWQsIHJldHJ5X2luZGV4KSB7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS90YXNrXFxcIikuYnVpbGRVcmwoe1xcbiAgICAgICAgcHI6IHByLFxcbiAgICAgICAgZnI6IFxcXCJwY1xcXCIsXFxuICAgICAgICB0YXNrX2lkOiB0YXNrX2lkLFxcbiAgICAgICAgcmV0cnlfaW5kZXg6IHJldHJ5X2luZGV4XFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBxdWVyeVRhc2sodGFza19pZCkge1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gdGFzayh0YXNrX2lkLCBpICsgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5zdGF0dXMgPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgd2FpdFNsZWVwKDEwMDApO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGEuc2F2ZV9hcy5zYXZlX2FzX3RvcF9maWRzWzBdO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB3YWl0U2xlZXAoMzAwICogKGkgKyAxKSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICB9XFxuICAgIHJldHVybiB2b2lkKDApO1xcbn1cXG5cXG5mdW5jdGlvbiBxdWVyeVRhc2tTdGF0dXModGFza19pZCkge1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gdGFzayh0YXNrX2lkLCBpICsgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5zdGF0dXMgPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgd2FpdFNsZWVwKDEwMDApO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgd2FpdFNsZWVwKDMwMCk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICB9XFxuICAgIHJldHVybiBmYWxzZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0UHJldmlld1ZpZGVvKGZpZCkge1xcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoYXBpICsgXFxcIi8xL2Nsb3VkZHJpdmUvZmlsZS92Mi9wbGF5P3ByPVxcXCIgKyBwciArIFxcXCImZnI9cGNcXFwiKS5ib2R5KHtcXG4gICAgICAgIFxcXCJmaWRcXFwiOiBmaWQsXFxuICAgICAgICBcXFwicmVzb2x1dGlvbnNcXFwiOiBcXFwibm9ybWFsLGxvdyxoaWdoLHN1cGVyLDJrLDRrXFxcIixcXG4gICAgICAgIFxcXCJzdXBwb3J0c1xcXCI6IFxcXCJmbXA0LG0zdThcXFwiXFxuICAgIH0pLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxufVxcblxcblxcbmZ1bmN0aW9uIGdldERvd25sb2FkVXJsKGZpZCkge1xcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoYXBpICsgXFxcIi8xL2Nsb3VkZHJpdmUvZmlsZS9kb3dubG9hZD9wcj1cXFwiICsgcHIgKyBcXFwiJmZyPXBjXFxcIikuYm9keSh7XFxuICAgICAgICBcXFwiZmlkc1xcXCI6IFtmaWRdXFxuICAgIH0pLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxufVxcblxcblxcbmNvbnN0IERvd25Ub29sID0gJC5yZXF1aXJlKFxcXCJEb3duVG9vbFxcXCIpO1xcblxcbmZ1bmN0aW9uIGdldFBsYXlVcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSwgaXNnZXRjdXJsKSB7XFxuICAgIGxldCBpc1NoYXJlID0gcHdkX2lkICE9PSBcXFwic2VsZlxcXCI7XFxuICAgIFxcbiAgICB0cnkge1xcbiAgICAgICAgaWYgKCFjb29raWUpIHJldHVybiBcXFwidG9hc3Q6Ly/or7fnmbvlvZXotKblj7dcXFwiO1xcbiAgICAgICAgbGV0IGFzZmlkID0gXFxcIlxcXCI7XFxuICAgICAgICBpZiAoaXNTaGFyZSkge1xcbiAgICAgICAgICAgIGxldCB0YXNrSWQgPSBjcmVhdGVTYXZlVGFzayhmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4pLmRhdGEudGFza19pZDtcXG4gICAgICAgICAgICBhc2ZpZCA9IHF1ZXJ5VGFzayh0YXNrSWQpO1xcbiAgICAgICAgICAgIGlmICghYXNmaWQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iOt+WPluWksei0pVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBhc2ZpZCA9IGZpZDtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBwbGF5Q29va2llID0gY29va2llTWFuYWdlLmdldCgpO1xcbiAgICAgICAgLyppZiAocHIgPT09IFxcXCJVQ0Jyb3dzZXJcXFwiKSB7XFxuICAgICAgICAgICAgcGxheUNvb2tpZSA9IGNvb2tpZTtcXG4gICAgICAgIH0qL1xcbiAgICAgICAgbGV0IHBsYXlIZWFkZXIgPSB7XFxuICAgICAgICAgICAgUmVmZXJlcjogaG9tZVVybCxcXG4gICAgICAgICAgICBjb29raWU6IHBsYXlDb29raWUsXFxuICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzEwMC4wLjQ4OTYuNTggVUNCcm93c2VyLzE2LjUuOC4xMzA5IE1vYmlsZSBTYWZhcmkvNTM3LjM2XFxcIlxcbiAgICAgICAgfTtcXG4gICAgICAgIC8qbGV0IHBsYXlIZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgcGxheUhlYWRlciwge1xcbiAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIkxvZ1N0YXRpc3RpY1xcXCJcXG4gICAgICAgIH0pOyovXFxuICAgICAgICBsZXQgY2hlY2tTaGFyZT0oKT0+KGlzU2hhcmUgJiYgY3JlYXRlRGVsZXRlVGFzayhhc2ZpZCkpfHwocGxheUhlYWRlci5jb29raWU9Y29va2llTWFuYWdlLmdldCgpKTtcXG4gICAgICAgIGxldCBwbGF5TW9kZSA9IGdldEl0ZW0oXFxcInF1YXJrX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpO1xcbiAgICAgICAgaWYgKHBsYXlNb2RlID09PSBcXFwiUlBDXFxcIikge1xcbiAgICAgICAgICAgIGxldCBkb3duSW5mbyA9IGdldERvd25sb2FkVXJsKGFzZmlkKS5kYXRhWzBdO1xcbiAgICAgICAgICAgIGxldCBkb3dubG9hZF91cmwgPSBkb3duSW5mby5kb3dubG9hZF91cmw7XFxuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gZG93bkluZm8uZmlsZV9uYW1lO1xcbiAgICAgICAgICAgIGNoZWNrU2hhcmUoKTtcXG4gICAgICAgICAgICByZXR1cm4gRG93blRvb2wudXBkYXRlUnBjKGRvd25sb2FkX3VybCwgcGxheUhlYWRlciwgZmlsZW5hbWUpID8gXFxcInRvYXN0Oi8v5Yib5bu65oiQ5YqfXFxcIiA6IFxcXCJ0b2FzdDovL+WIm+W7uuWksei0pVxcXCI7XFxuICAgICAgICAgICAgLy9yZXR1cm4gXFxcInRvYXN0Oi8v5bey5o6o6YCBXFxcIjtcXG4gICAgICAgIH0gZWxzZSBpZiAoW1xcXCJjdXJsXFxcIiwgXFxcImFyaWEyXFxcIl0uaW5jbHVkZXMocGxheU1vZGUpKSB7XFxuICAgICAgICAgICAgbGV0IGRvd25JbmZvID0gZ2V0RG93bmxvYWRVcmwoYXNmaWQpLmRhdGFbMF07XFxuICAgICAgICAgICAgbGV0IGRvd25sb2FkX3VybCA9IGRvd25JbmZvLmRvd25sb2FkX3VybDtcXG4gICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBkb3duSW5mby5maWxlX25hbWU7XFxuICAgICAgICAgICAgY2hlY2tTaGFyZSgpXFxuICAgICAgICAgICAgbGV0IGNubWQgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBpZiAocGxheU1vZGUgPT09IFxcXCJjdXJsXFxcIikge1xcbiAgICAgICAgICAgICAgICBjbm1kID0gRG93blRvb2wuZ2V0RG93bkNVUkwoZG93bmxvYWRfdXJsLCBwbGF5SGVhZGVyLCBmaWxlbmFtZSk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgY25tZCA9IERvd25Ub29sLmdldERvd25BcmlhMmMoZG93bmxvYWRfdXJsLCBwbGF5SGVhZGVyLCBmaWxlbmFtZSwgTnVtYmVyKGdldEl0ZW0oXFxcInNwZWVkVGhyZWFkXFxcIiwgXFxcIjEwXFxcIikpKTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgbGV0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvXFxcIiArIGZpbGVuYW1lICsgXFxcIihcXFwiICsgcGxheU1vZGUgKyBcXFwiKS50eHRcXFwiO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShwYXRoLCBjbm1kKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInNoYXJlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICB9IGVsc2UgaWYgKGNhdGVnb3J5ID09IFxcXCJ2aWRlb1xcXCIpIHtcXG5cXG4gICAgICAgICAgICBpZiAocGxheU1vZGUgPT09IFxcXCLovaznoIFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCB2aWRlb1JlcyA9IGdldFByZXZpZXdWaWRlbyhhc2ZpZCk7XFxuICAgICAgICAgICAgICAgIGNoZWNrU2hhcmUoKTtcXG4gICAgICAgICAgICAgICAgbGV0IHZpZGVvTGlzdCA9IHZpZGVvUmVzLmRhdGEudmlkZW9fbGlzdDtcXG4gICAgICAgICAgICAgICAgbGV0IHBsYXlMaXN0ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZXM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW10sXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBbXVxcbiAgICAgICAgICAgICAgICB9OyAgICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgdmlkZW9MaXN0LmZpbHRlcih2ID0+IHYuYWNjZXNzYWJsZSkuZm9yRWFjaCh2ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHBsYXlMaXN0Lm5hbWVzLnB1c2godi5yZXNvbHV0aW9uKTtcXG4gICAgICAgICAgICAgICAgICAgIHBsYXlMaXN0LnVybHMucHVzaCh2LnZpZGVvX2luZm8udXJsICsgXFxcIiNpc1ZpZGVvPXRydWUjXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBwbGF5TGlzdC5oZWFkZXJzLnB1c2gocGxheUhlYWRlcik7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcblxcbiAgICAgICAgICAgICAgICBsZXQgcGxheVVybCA9IGdldERvd25sb2FkVXJsKGFzZmlkKS5kYXRhWzBdLmRvd25sb2FkX3VybDtcXG4gICAgICAgICAgICAgICAgY2hlY2tTaGFyZSgpO1xcbiAgICAgICAgICAgICAgICBsZXQgcGxheUxpc3QgPSB7XFxuICAgICAgICAgICAgICAgICAgICBuYW1lczogW3BsYXlNb2RlXSxcXG4gICAgICAgICAgICAgICAgICAgIHVybHM6IFtwbGF5VXJsICsgXFxcIiNpc1ZpZGVvPXRydWUjXFxcIiArIChwbGF5TW9kZSA9PT0gXFxcIuWOn+eUu1xcXCIgPyBcXFwiI2Zhc3RQbGF5TW9kZSMjdGhyZWFkcz1cXFwiICsgZ2V0SXRlbShcXFwic3BlZWRUaHJlYWRcXFwiLCBcXFwiMTBcXFwiKSArIFxcXCIjXFxcIiA6IFxcXCJcXFwiKV0sXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBbcGxheUhlYWRlcl1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCBwbGF5VXJsID0gZ2V0RG93bmxvYWRVcmwoYXNmaWQpLmRhdGFbMF0uZG93bmxvYWRfdXJsO1xcblxcbiAgICAgICAgICAgIGNoZWNrU2hhcmUoKTtcXG4gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT09ICdhdWRpbycpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHBsYXlMaXN0ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZXM6IFtcXFwi6Z+z6aKRXFxcIl0sXFxuICAgICAgICAgICAgICAgICAgICB1cmxzOiBbcGxheVVybCArIFxcXCIjaXNNdXNpYz10cnVlI1xcXCJdLFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogW3BsYXlIZWFkZXJdLFxcbiAgICAgICAgICAgICAgICAgICAgbHlyaWM6IFxcXCJcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhdGVnb3J5ID09PSAnaW1hZ2UnKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKHBsYXlVcmwsIHBsYXlIZWFkZXIpLmltYWdlKCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcGxheUhlYWRlciA9IE9iamVjdC5rZXlzKHBsYXlIZWFkZXIpLm1hcChrZXkgPT4ga2V5ICsgXFxcIkBcXFwiICsgU3RyaW5nKHBsYXlIZWFkZXJba2V5XSkucmVwbGFjZSgvOy9nLCBcXFwi77yb77ybXFxcIikpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImRvd25sb2FkOi8vXFxcIiArIHBsYXlVcmwgKyBcXFwiO3tcXFwiICsgcGxheUhlYWRlci5qb2luKFxcXCImJlxcXCIpICsgXFxcIn1cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcyhcXFwicmVxdWlyZSBsb2dpblxcXCIpIHx8IGUubWVzc2FnZS5pbmNsdWRlcyhcXFwidG9rZW5cXFwiKSB8fCBlLm1lc3NhZ2UuaW5jbHVkZXMoXFxcImludmFsaWRcXFwiKSkge1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLmnKrnmbvlvZXmiJbnmbvlvZXov4fmnJ/vvIzor7fph43mlrDnmbvlvZVcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/ZnJvbT1cXFwiICsgZnJvbURyaXZlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBlLnRvU3RyaW5nKCk7XFxuICAgIH1cXG59XFxuXFxuJC5leHBvcnRzID0ge1xcbiAgICBnZXRQbGF5VXJsXFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIueZu+W9lei0puWPt1wiLFwicGF0aFwiOlwibG9naW5cIixcInJ1bGVcIjpcImpzOlxcbmxldCBkID0gW107XFxuc2V0UGFnZVRpdGxlKFxcXCLnmbvlvZXotKblj7dcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcImNvb2tpZVxcXCIpKTtcXG5sZXQgZnJvbT1nZXRQYXJhbShcXFwiZnJvbVxcXCIsXFxcIlxcXCIpO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc56Gu6K6k55m75b2V4oCd4oCdXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChmcm9tKSA9PiB7XFxuICAgICAgICAvL2xldCBjbSA9IGFuZHJvaWQud2Via2l0LkNvb2tpZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcXG4gICAgICAgIC8vbGV0IGNtID0gY29tLnRlbmNlbnQuc210dC5zZGsuQ29va2llTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xcbiAgICAgICAgLy9sZXQgY29va2llID0gU3RyaW5nKGNtLmdldENvb2tpZShcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY25cXFwiKSB8fCBcXFwiXFxcIik7XFxuICAgICAgICBsZXQgY29va2llID0gZ2V0TXlWYXIoXFxcImNvb2tpZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICgkLnJlcXVpcmUoXFxcInRvb2xcXFwiKS5pc0xvZ2luQ29va2llKGNvb2tpZSkpIHtcXG4gICAgICAgICAgICBpZihmcm9tPT09XFxcInVjXFxcIil7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInVjQ29va2llXFxcIiwgY29va2llKTtcXG4gICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFwicXVhcmtDb29raWVcXFwiLCBjb29raWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+eZu+W9leaIkOWKn1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pyq55m75b2VXFxcIjtcXG4gICAgfSwgZnJvbSksXFxuICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ08c21hbGw+54K55Ye75aS05YOP5Y+v5Lul6YCA5Ye66LSm5Y+36YeN5paw55m75b2VPC9zbWFsbD5cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxldCBkdXJsPWZyb209PT1cXFwidWNcXFwiP1xcXCJodHRwczovL2RyaXZlLnVjLmNuXFxcIjpcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY25cXFwiO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwieDVfd2Vidmlld19zaW5nbGVcXFwiLFxcbiAgICB1cmw6IGR1cmwsXFxuICAgIGRlc2M6IFxcXCJsaXN0JiZzY3JlZW4tMTUwXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHVhOiBQQ19VQSxcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCh0aXRsZSwgZHVybCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBjb29raWUgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGNvb2tpZSA9IGZiYS5nZXRDb29raWUoZHVybCk7XFxuICAgICAgICAgICAgICAgIGZiYS5wdXRWYXIodGl0bGUgKyBcXFwiQGNvb2tpZVxcXCIsIGNvb2tpZSk7XFxuICAgICAgICAgICAgfSwgMjAwKTtcXG4gICAgICAgIH0sIE1ZX1JVTEUudGl0bGUsIGR1cmwpXFxuICAgIH1cXG59KTtcXG5zZXRSZXN1bHQoZClcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW3peWFt1wiLFwicGF0aFwiOlwidG9vbFwiLFwicnVsZVwiOlwianM6XFxuXFxuJC5leHBvcnRzPXtcXG4gICAgaXNMb2dpbkNvb2tpZShjb29raWUpe1xcbiAgICAgICAgLy9yZXR1cm4gdHJ1ZTtcXG4gICAgICAgIHJldHVybiAhIShjb29raWUgICYmIGNvb2tpZS5pbmNsdWRlcyhcXFwiX191aWQ9XFxcIikgJiYgY29va2llLmluY2x1ZGVzKFxcXCJfX3B1cz1cXFwiKSk7XFxuICAgIH1cXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Liq5Lq66LSm5Y+36K6+572uXCIsXCJwYXRoXCI6XCJhY2NvdW50XCIsXCJydWxlXCI6XCIkLmV4cG9ydHMgPSAkKFtcXFwi5aS45YWL5LqM57u056CB55m75b2VXFxcIiwgXFxcIkNvb2tpZeeZu+W9lVxcXCIsIFxcXCLnvZHpobXnmbvlvZVcXFwiLCBcXFwi5aSN5Yi2Q29va2llXFxcIiwgXFxcIua4hemZpENvb2tpZVxcXCIsIFxcXCLojrflj5bnvZHnu5zlhbHkuqtLS0Nvb2tpZVxcXCIsIFxcXCJVQ+S6jOe7tOeggeeZu+W9lVxcXCIsIFxcXCJVQ+e9kemhteeZu+W9lVxcXCIsIFxcXCJVQ0Nvb2tpZeeZu+W9lVxcXCIsIFxcXCLlpI3liLZVQ0Nvb2tpZVxcXCIsIFxcXCLmuIXpmaRVQ0Nvb2tpZVxcXCJdKS5zZWxlY3QoKGlzcikgPT4ge1xcbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbVVVSUQoKSB7XFxuICAgICAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XFxuICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLFxcbiAgICAgICAgICAgICAgICB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcXG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBpZiAoaW5wdXQgPT09IFxcXCLnvZHpobXnmbvlvZVcXFwiKSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwiQ29va2ll55m75b2VXFxcIikge1xcbiAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIsIFxcXCLor7fovpPlhaVDb29raWVcXFwiKS5pbnB1dCgoaXNyKSA9PiB7XFxuICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFwidG9vbFxcXCIpLmlzTG9naW5Db29raWUoaW5wdXQpKSB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInF1YXJrQ29va2llXFxcIiwgaW5wdXQucmVwbGFjZSgvXFxcXHMvZywgXFxcIlxcXCIpKTtcXG4gICAgICAgICAgICAgICAgaXNyICYmIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9Db29raWXmoLzlvI/plJnor69cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGlzcik7XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLku45UVkJPWOiOt+WPlkNvb2tpZVxcXCIpIHtcXG4gICAgICAgIGxldCBwYXRoID0gXFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvVFYvLnF1YXJrX3VzZXJcXFwiO1xcbiAgICAgICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoKSkge1xcbiAgICAgICAgICAgIGlmICghbmV3IGphdmEuaW8uRmlsZShwYXRoKS5jYW5SZWFkKCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIuayoeacieadg+mZkOivu+WPlkNvb2tpZeaWh+S7tu+8jOivt+aJk+W8gOaJgOacieaWh+S7tuadg+mZkFxcXFxu5rW36ZiU6K6+572uLT7mm7TlpJrlip/og70tPuWGhemDqOaWh+S7tueuoeeQhi0+5Y+z5LiK6KeSXFxcIikuY29uZmlybSgoKSA9PiB7fSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShmZXRjaChcXFwiZmlsZTovL1xcXCIgKyBwYXRoKSk7XFxuICAgICAgICAgICAgICAgIGxldCBjb29raWUgPSBqc29uLmNvb2tpZTtcXG4gICAgICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFwidG9vbFxcXCIpLmlzTG9naW5Db29raWUoY29va2llKSkge1xcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwicXVhcmtDb29raWVcXFwiLCBjb29raWUpO1xcbiAgICAgICAgICAgICAgICAgICAgaXNyICYmIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9Db29raWXmoLzlvI/plJnor69cXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6I635Y+W5aSx6LSl5YWx5Lqr5paH5Lu25o2f5Z2PXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiAkKFxcXCLmnKrmo4DmtYvliLBUVkJPWOeahENvb2tpZeaWh+S7tlxcXFxu6K+35L2/55So6L+H5ZCO5YaN5bCd6K+VXFxcIikuY29uZmlybSgoKSA9PiB7fSk7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLlpI3liLZDb29raWVcXFwiKSB7XFxuICAgICAgICBsZXQgY29va2llID0gZ2V0SXRlbShcXFwicXVhcmtDb29raWVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoY29va2llKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGNvb2tpZTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acqueZu+W9lVxcXCI7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLmuIXpmaRDb29raWVcXFwiKSB7XFxuICAgICAgICBjbGVhckl0ZW0oXFxcInF1YXJrQ29va2llXFxcIik7XFxuICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/pgIDlh7rnmbvlvZVcXFwiO1xcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwiVUPnvZHpobXnmbvlvZVcXFwiKSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/ZnJvbT11Y1xcXCI7XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCJVQ0Nvb2tpZeeZu+W9lVxcXCIpIHtcXG4gICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6K+36L6T5YWlQ29va2llXFxcIikuaW5wdXQoKGlzcikgPT4ge1xcbiAgICAgICAgICAgIGlmICgkLnJlcXVpcmUoXFxcInRvb2xcXFwiKS5pc0xvZ2luQ29va2llKGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJ1Y0Nvb2tpZVxcXCIsIGlucHV0LnJlcGxhY2UoL1xcXFxzL2csIFxcXCJcXFwiKSk7XFxuICAgICAgICAgICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vQ29va2ll5qC85byP6ZSZ6K+vXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBpc3IpO1xcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5aSN5Yi2VUNDb29raWVcXFwiKSB7XFxuICAgICAgICBsZXQgY29va2llID0gZ2V0SXRlbShcXFwidWNDb29raWVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoY29va2llKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGNvb2tpZTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acqueZu+W9lVxcXCI7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLmuIXpmaRVQ0Nvb2tpZVxcXCIpIHtcXG4gICAgICAgIGNsZWFySXRlbShcXFwidWNDb29raWVcXFwiKTtcXG4gICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mAgOWHuueZu+W9lVxcXCI7XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLojrflj5bnvZHnu5zlhbHkuqtLS0Nvb2tpZVxcXCIpIHtcXG4gICAgICAgIGxldCBoaGQgPSB7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnQXBhY2hlLUh0dHBDbGllbnQvVU5BVkFJTEFCTEUgKGphdmEgMS40KSdcXG4gICAgICAgIH3CoFxcbiAgICAgICAgbGV0IGR4Y3VybCA9ICdodHRwOi8vYXBpLnY2eC53aHQuZGd3aHQudG9wL3RleHQvM2RlODhkMTBkMDE5MjliZS8nXFxuICAgICAgICBsZXQgeGNkYXRhID0gWydjOTlkNzQxMWNjYzI5YmMxJ11cXG4gICAgICAgIGxldCBkeGMgPSBbXVxcbiAgICAgICAgbGV0IHlzY29va2llID0gJydcXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeGNkYXRhLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgbGV0IGRhdGEgPSBmZXRjaChkeGN1cmwgKyB4Y2RhdGFbaV0sIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGhkXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFwidG9vbFxcXCIpLmlzTG9naW5Db29raWUoZGF0YSkpIHtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIHlzY29va2llID0gZGF0YS5zcGxpdChcXFwi4pGgXFxcIilbMV07XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh5c2Nvb2tpZSkge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInF1YXJrQ29va2llXFxcIiwgeXNjb29raWUpO1xcbiAgICAgICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6I635Y+W5aSx6LSlXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuWkuOWFi+S6jOe7tOeggeeZu+W9lVxcXCIpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHJlcXVlc3RfaWQgPSBnZW5lcmF0ZVJhbmRvbVVVSUQoKTtcXG4gICAgICAgICAgICBsZXQgcWNUb2tlbiA9IEpTT04ucGFyc2UoZmV0Y2goYnVpbGRVcmwoXFxcImh0dHBzOi8vdW9wLnF1YXJrLmNuL2Nhcy9hamF4L2dldFRva2VuRm9yUXJjb2RlTG9naW5cXFwiLCB7XFxuICAgICAgICAgICAgICAgIHJlcXVlc3RfaWQsXFxuICAgICAgICAgICAgICAgIGNsaWVudF9pZDogXFxcIjUzMlxcXCIsXFxuICAgICAgICAgICAgICAgIHY6IFxcXCIxLjJcXFwiXFxuICAgICAgICAgICAgfSkpKS5kYXRhLm1lbWJlcnMudG9rZW47XFxuICAgICAgICAgICAgY3JlYXRlUVJDb2RlKGBodHRwczovL3N1LnF1YXJrLmNuLzRfZU1IQko/dG9rZW49JHtxY1Rva2VufSZjbGllbnRfaWQ9NTMyJnNzYj13ZWJsb2dpbiZ1Y19wYXJhbV9zdHI9JnVjX2Jpel9zdHI9UyUzQWN1c3RvbSU3Q09QVCUzQVNBUkVBJTQwMCU3Q09QVCUzQUlNTUVSU0lWRSU0MDElN0NPUFQlM0FCQUNLX0JUTl9TVFlMRSU0MDBgLCBmYWxzZSk7XFxuICAgICAgICAgICAgbGV0IHNlcnZpY2VfdGlja2V0ID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGVjID0gMDsgaSA8IDMwOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCgyMDAwKTtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aWNrZXQgPSBKU09OLnBhcnNlKGZldGNoKGJ1aWxkVXJsKFxcXCJodHRwczovL3VvcC5xdWFyay5jbi9jYXMvYWpheC9nZXRTZXJ2aWNlVGlja2V0QnlRcmNvZGVUb2tlblxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X2lkOiBnZW5lcmF0ZVJhbmRvbVVVSUQoKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IFxcXCI1MzJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHY6IFxcXCIxLjJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBxY1Rva2VuXFxuICAgICAgICAgICAgICAgICAgICB9KSkpO1xcbiAgICAgICAgICAgICAgICAgICAgLy9sb2codGlja2V0KVxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpY2tldC5zdGF0dXMgPT0gMjAwMDAwMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdGlja2V0ID0gdGlja2V0LmRhdGEubWVtYmVycy5zZXJ2aWNlX3RpY2tldDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZXQuc3RhdHVzID09IDUwMDA0MDAxKSBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZXQuc3RhdHVzID09IDUwMDA0MDAyIHx8IGkgPT09IDI5KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S6jOe7tOeggei/h+acn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGVjKys7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoZWMgPj0gNSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mn6Xor6Lkuoznu7TnoIHlh7rplJlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICghc2VydmljZV90aWNrZXQpIHJldHVybiBcXFwidG9hc3Q6Ly90aWNrZXTojrflj5blpLHotKVcXFwiO1xcbiAgICAgICAgICAgIGxldCByZXMgPSBKU09OLnBhcnNlKGZldGNoKFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9hY2NvdW50L2luZm8/c3Q9XFxcIiArIHNlcnZpY2VfdGlja2V0ICsgXFxcIiZsdz1zY2FuXFxcIiwge1xcbiAgICAgICAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAvL2xvZyhyZXMpXFxuICAgICAgICAgICAgaWYgKCFKU09OLnBhcnNlKHJlcy5ib2R5KS5zdWNjZXNzKSByZXR1cm4gXFxcInRvYXN0Oi8vdGlja2V06aqM6K+B5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICBsZXQgY29va2llID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSByZXMuaGVhZGVycztcXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGhlYWRlcnNbXFxcInNldC1jb29raWVcXFwiXSkge1xcbiAgICAgICAgICAgICAgICBjb29raWUgKz0gYy5zcGxpdChcXFwiO1xcXCIpWzBdICsgXFxcIjtcXFwiO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBsb2coY29va2llKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIGNvb2tpZSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nmbvlvZXmiJDlip9cXFwiO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAoXFxcInRvYXN0Oi8v55m75b2V5aSx6LSl77yaXFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgICAgICAvL2h0dHBzOi8vc3UucXVhcmsuY24vNF9lTUhCSj90b2tlbj1zdDk2YTYzMzM5MG55OXl6bGswaXZ1b3VjN2I5Z2ZtaiZjbGllbnRfaWQ9NTMyJnNzYj13ZWJsb2dpbiZ1Y19wYXJhbV9zdHI9JnVjX2Jpel9zdHI9UyUzQWN1c3RvbSU3Q09QVCUzQVNBUkVBJTQwMCU3Q09QVCUzQUlNTUVSU0lWRSU0MDElN0NPUFQlM0FCQUNLX0JUTl9TVFlMRSU0MDBcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIlVD5LqM57u056CB55m75b2VXFxcIikge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVxdWVzdF9pZCA9IGdlbmVyYXRlUmFuZG9tVVVJRCgpO1xcbiAgICAgICAgICAgIGxldCBxY1Rva2VuID0gSlNPTi5wYXJzZShwb3N0KGBodHRwczovL2FwaS5vcGVuLnVjLmNuL2Nhcy9hamF4L2dldFRva2VuRm9yUXJjb2RlTG9naW4/X190PSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9YCwge1xcbiAgICAgICAgICAgICAgICBib2R5OiBgdj0xLjImcmVxdWVzdF9pZD0ke3JlcXVlc3RfaWR9JmNsaWVudF9pZD0zODFgXFxuICAgICAgICAgICAgfSkpLmRhdGEubWVtYmVycy50b2tlbjtcXG4gICAgICAgICAgICBjcmVhdGVRUkNvZGUoYGh0dHBzOi8vc3UudWMuY24vMV9uMFpDdj90b2tlbj0ke3FjVG9rZW59JmNsaWVudF9pZD0zODEmdWNfcGFyYW1fc3RyPSZ1Y19iaXpfc3RyPVMlM0FjdXN0b20lN0NDJTNBdGl0bGViYXJfZml4YCwgZmFsc2UpO1xcbiAgICAgICAgICAgIGxldCBzZXJ2aWNlX3RpY2tldCA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBlYyA9IDA7IGkgPCAzMDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoMjAwMCk7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGlja2V0ID0gSlNPTi5wYXJzZShwb3N0KGBodHRwczovL2FwaS5vcGVuLnVjLmNuL2Nhcy9hamF4L2dldFNlcnZpY2VUaWNrZXRCeVFyY29kZVRva2VuP19fdD0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWAsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBgdj0xLjImcmVxdWVzdF9pZD0ke3JlcXVlc3RfaWR9JmNsaWVudF9pZD0zODEmdG9rZW49JHtxY1Rva2VufWBcXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKHRpY2tldClcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZXQuc3RhdHVzID09IDIwMDAwMDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX3RpY2tldCA9IHRpY2tldC5kYXRhLm1lbWJlcnMuc2VydmljZV90aWNrZXQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0LnN0YXR1cyA9PSA1MDAwNDAwMSkgY29udGludWU7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0LnN0YXR1cyA9PSA1MDAwNDAwMiB8fCBpID09PSAyOSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuoznu7TnoIHov4fmnJ9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBlYysrO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVjID49IDUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5p+l6K+i5LqM57u056CB5Ye66ZSZXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoIXNlcnZpY2VfdGlja2V0KSByZXR1cm4gXFxcInRvYXN0Oi8vdGlja2V06I635Y+W5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICBsZXQgcmVzID0gSlNPTi5wYXJzZShmZXRjaChgaHR0cHM6Ly9kcml2ZS51Yy5jbi9hY2NvdW50L2luZm8/c3Q9JHtzZXJ2aWNlX3RpY2tldH1gLCB7XFxuICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIC8vbG9nKHJlcylcXG4gICAgICAgICAgICBpZiAoIUpTT04ucGFyc2UocmVzLmJvZHkpLnN1Y2Nlc3MpIHJldHVybiBcXFwidG9hc3Q6Ly90aWNrZXTpqozor4HlpLHotKVcXFwiO1xcbiAgICAgICAgICAgIGxldCBjb29raWUgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IHJlcy5oZWFkZXJzO1xcbiAgICAgICAgICAgIGZvciAobGV0IGMgb2YgaGVhZGVyc1tcXFwic2V0LWNvb2tpZVxcXCJdKSB7XFxuICAgICAgICAgICAgICAgIGNvb2tpZSArPSBjLnNwbGl0KFxcXCI7XFxcIilbMF0gKyBcXFwiO1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxvZyhjb29raWUpO1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInVjQ29va2llXFxcIiwgY29va2llKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+eZu+W9leaIkOWKn1xcXCI7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgcmV0dXJuIChcXFwidG9hc3Q6Ly/nmbvlvZXlpLHotKXvvJpcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn0sICQuaW1wb3J0UGFyYW0pO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiQ29va2llTWFuYWdlXCIsXCJwYXRoXCI6XCJDb29raWVNYW5hZ2VcIixcInJ1bGVcIjpcImZ1bmN0aW9uIENvb2tpZU1hbmFnZShjb29raWUpIHtcXG4gICAgdGhpcy5jb29raWUgPSB7fTtcXG4gICAgdGhpcy5hZGQoY29va2llKTtcXG59XFxuT2JqZWN0LmFzc2lnbihDb29raWVNYW5hZ2UucHJvdG90eXBlLCB7XFxuICAgIGFkZChjb29raWUpIHtcXG4gICAgICAgIGxldCBjb29raWVzID0gW107XFxuICAgICAgICBpZiAodHlwZW9mIGNvb2tpZSA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgICAgICBjb29raWVzID0gY29va2llLnNwbGl0KFxcXCI7XFxcIik7XFxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29va2llKSkge1xcbiAgICAgICAgICAgIGNvb2tpZXMgPSBjb29raWU7XFxuICAgICAgICB9XFxuICAgICAgICBjb29raWVzLmZvckVhY2godiA9PiB7XFxuICAgICAgICAgICAgdiA9IHYuc3BsaXQoXFxcIj1cXFwiKTtcXG4gICAgICAgICAgICBpZiAodi5sZW5ndGggPCAyKSByZXR1cm47XFxuICAgICAgICAgICAgbGV0IGtleSA9IHYuc2hpZnQoKS50cmltKCk7XFxuICAgICAgICAgICAgdGhpcy5jb29raWVba2V5XSA9IHYuam9pbihcXFwiPVxcXCIpLnRyaW0oKTtcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcbiAgICBnZXQoKSB7XFxuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5jb29raWUpLm1hcCh2ID0+IHZbMF0gKyBcXFwiPVxcXCIgKyB2WzFdKS5qb2luKFxcXCI7XFxcIik7XFxuICAgIH1cXG59KTtcXG4vL2NvbnN0IGNvb2tpZU1hbmFnZSA9IG5ldyBDb29raWVNYW5hZ2UoY29va2llKTtcXG4kLmV4cG9ydHM9Q29va2llTWFuYWdlO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5aSp57+8QVBJXCIsXCJwYXRoXCI6XCJDbG91ZERyaXZlXCIsXCJydWxlXCI6XCJjb25zdCBDcnlwdG9VdGlsID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2Fzc2V0cy9jcnlwdG8tamF2YS5qc1xcXCIpO1xcblxcbmZ1bmN0aW9uIENsb3VkRHJpdmUoKSB7XFxuICAgIHRoaXMucmVnZXggPSAvaHR0cHM6XFxcXC9cXFxcL2Nsb3VkXFxcXC4xODlcXFxcLmNuXFxcXC93ZWJcXFxcL3NoYXJlXFxcXD9jb2RlPShbMC05QS1aYS16XSspLzsgLy9odHRwczovL2Nsb3VkLjE4OS5jbi93ZWIvc2hhcmU/Y29kZT1xSTNhTWpxWVJycWFcXG4gICAgdGhpcy5jb25maWcgPSB7XFxuICAgICAgICBjbGllbnRJZDogJzUzODEzNTE1MDY5MzQxMicsXFxuICAgICAgICBtb2RlbDogJ0tCMjAwMCcsXFxuICAgICAgICB2ZXJzaW9uOiAnOS4wLjYnLFxcbiAgICAgICAgcHViS2V5OiAnTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDWkx5VjRnSE5EVUdKTVpvT2NZYXV4bU5Fc0tyYzBUbExlQkVWVklJUU56RzRXcWppbWNlT2o1UjlFVHdEZWVTTjN5ZWpBS0xHSGd4ODNseXkyd0Jqdm5iZm0vbkxPYnlXd1FELzA5Q21wWmR4b0ZZQ0g2cmREalJwd1pPWjJuWFNacGdrWlhvT0JrZk5YTnhuTjc0YVh0aG8yZHFCeW5UdzNORlRXeVFsOEJRSURBUUFCJyxcXG4gICAgfTtcXG4gICAgdGhpcy5oZWFkZXJzID0ge1xcbiAgICAgICAgJ1VzZXItQWdlbnQnOiBgTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDExOyAke3RoaXMuY29uZmlnLm1vZGVsfSBCdWlsZC9SUDFBLjIwMTAwNS4wMDEpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS83NC4wLjM3MjkuMTM2IE1vYmlsZSBTYWZhcmkvNTM3LjM2IEVjbG91ZC8ke3RoaXMuY29uZmlnLnZlcnNpb259IEFuZHJvaWQvMzAgY2xpZW50SWQvJHt0aGlzLmNvbmZpZy5jbGllbnRJZH0gY2xpZW50TW9kZWwvJHt0aGlzLmNvbmZpZy5tb2RlbH0gY2xpZW50Q2hhbm5lbElkL3FxIHByb1ZlcnNpb24vMS4wLjZgLFxcbiAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly9tLmNsb3VkLjE4OS5jbi96aHVhbnRpLzIwMTYvc2lnbi9pbmRleC5qc3A/YWxidW1CYWNrdXBPcGVuZWQ9MScsXFxuICAgICAgICAnQWNjZXB0LUVuY29kaW5nJzogJ2d6aXAsIGRlZmxhdGUnLFxcbiAgICB9O1xcbiAgICB0aGlzLmFwaSA9ICdodHRwczovL2Nsb3VkLjE4OS5jbi9hcGknO1xcbiAgICB0aGlzLnNoYXJlQ29kZSA9ICcnO1xcbiAgICB0aGlzLmFjY2Vzc0NvZGUgPSAnJztcXG4gICAgdGhpcy5zaGFyZUlkID0gJyc7XFxuICAgIHRoaXMuc2hhcmVNb2RlID0gJyc7XFxuICAgIHRoaXMuaXNGb2xkZXIgPSAnJztcXG59XFxuT2JqZWN0LmFzc2lnbihDbG91ZERyaXZlLnByb3RvdHlwZSwge1xcbiAgICBjaGVja0Nvb2tpZSgpIHtcXG4gICAgICAgIGlmICghdGhpcy5jb29raWUgJiYgdGhpcy5hY2NvdW50ICYmIHRoaXMucGFzc3dvcmQpIHtcXG4gICAgICAgICAgICBzZXRJdGVtKCdjbG91ZENvb2tpZScsIHRoaXMubG9naW4odGhpcy5hY2NvdW50LCB0aGlzLnBhc3N3b3JkKSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5pyq55m75b2VXFxcIik7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIGdldENvb2tpZSgpIHtcXG4gICAgICAgIHJldHVybiBnZXRJdGVtKFxcXCJjbG91ZENvb2tpZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgfSxcXG4gICAgbG9naW4odW5hbWUsIHBhc3N3ZCkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocG9zdCgnaHR0cHM6Ly9vcGVuLmUuMTg5LmNuL2FwaS9sb2dib3gvY29uZmlnL2VuY3J5cHRDb25mLmRvP2FwcElkPWNsb3VkJykpO1xcbiAgICAgICAgICAgIGxldCBwdWJLZXkgPSByZXNwLmRhdGEucHViS2V5O1xcbiAgICAgICAgICAgIHJlc3AgPSBKU09OLnBhcnNlKHJlcXVlc3QoJ2h0dHBzOi8vY2xvdWQuMTg5LmNuL2FwaS9wb3J0YWwvbG9naW5VcmwuYWN0aW9uP3JlZGlyZWN0VVJMPWh0dHBzOi8vY2xvdWQuMTg5LmNuL3dlYi9yZWRpcmVjdC5odG1sP3JldHVyblVSTD0vbWFpbi5hY3Rpb24nLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZTogXFxcIiNub0Nvb2tpZSNcXFwiXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIC8vbG9nKHJlc3ApXFxuICAgICAgICAgICAgLy8g6I635Y+W5pyA5ZCO6K+35rGCdXJs5Lit55qE5Y+C5pWwcmVxSWTlkoxsdFxcbiAgICAgICAgICAgIGxldCBSZXFpZCA9IHJlc3AudXJsLm1hdGNoKC9yZXFJZD0oXFxcXHcrKS8pWzFdO1xcbiAgICAgICAgICAgIGxldCBMdCA9IHJlc3AudXJsLm1hdGNoKC9sdD0oXFxcXHcrKS8pWzFdO1xcbiAgICAgICAgICAgIGxldCB0SGVhZGVycyA9IHtcXG4gICAgICAgICAgICAgICAgXFxcIkNvbnRlbnQtVHlwZVxcXCI6IFxcXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcXFwiLFxcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0OyBydjo3NC4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94Lzc2LjAnLFxcbiAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL29wZW4uZS4xODkuY24vJyxcXG4gICAgICAgICAgICAgICAgTHQsXFxuICAgICAgICAgICAgICAgIFJlcWlkLFxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XFxuICAgICAgICAgICAgICAgIHZlcnNpb246ICcyLjAnLFxcbiAgICAgICAgICAgICAgICBhcHBLZXk6ICdjbG91ZCdcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIHJlc3AgPSBKU09OLnBhcnNlKHBvc3QoJ2h0dHBzOi8vb3Blbi5lLjE4OS5jbi9hcGkvbG9nYm94L29hdXRoMi9hcHBDb25mLmRvJywge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0SGVhZGVycyxcXG4gICAgICAgICAgICAgICAgYm9keTogZGF0YVxcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICBsZXQgcmV0dXJuVXJsID0gcmVzcC5kYXRhLnJldHVyblVybDtcXG4gICAgICAgICAgICBsZXQgcGFyYW1JZCA9IHJlc3AuZGF0YS5wYXJhbUlkO1xcbiAgICAgICAgICAgIC8vY29uc3Qga2V5RGF0YSA9IGAtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxcXFxuJHtwdWJLZXl9XFxcXG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1gO1xcbiAgICAgICAgICAgIC8vY29uc3QganNlbmNyeXB0ID0gbmV3IEpTRW5jcnlwdCgpO1xcbiAgICAgICAgICAgIC8vanNlbmNyeXB0LnNldFB1YmxpY0tleShrZXlEYXRhKTtcXG4gICAgICAgICAgICAvL2NvbnN0IGVuVW5hbWUgPSBCdWZmZXIuZnJvbShqc2VuY3J5cHQuZW5jcnlwdCh1bmFtZSksICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XFxuICAgICAgICAgICAgLy9jb25zdCBlblBhc3N3ZCA9IEJ1ZmZlci5mcm9tKGpzZW5jcnlwdC5lbmNyeXB0KHBhc3N3ZCksICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XFxuICAgICAgICAgICAgbGV0IGVuVW5hbWUgPSBDcnlwdG9VdGlsLkRhdGEucGFyc2VCYXNlNjQocnNhRW5jcnlwdCh1bmFtZSwgcHViS2V5KSwgX2Jhc2U2NC5OT19XUkFQKS50b0hleCgpLnRvVXBwZXJDYXNlKCk7XFxuICAgICAgICAgICAgbGV0IGVuUGFzc3dkID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlQmFzZTY0KHJzYUVuY3J5cHQocGFzc3dkLCBwdWJLZXkpLCBfYmFzZTY0Lk5PX1dSQVApLnRvSGV4KCkudG9VcHBlckNhc2UoKTtcXG4gICAgICAgICAgICBkYXRhID0ge1xcbiAgICAgICAgICAgICAgICBhcHBLZXk6ICdjbG91ZCcsXFxuICAgICAgICAgICAgICAgIHZlcnNpb246ICcyLjAnLFxcbiAgICAgICAgICAgICAgICBhY2NvdW50VHlwZTogJzAxJyxcXG4gICAgICAgICAgICAgICAgbWFpbFN1ZmZpeDogJ0AxODkuY24nLFxcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUNvZGU6ICcnLFxcbiAgICAgICAgICAgICAgICByZXR1cm5VcmwsXFxuICAgICAgICAgICAgICAgIHBhcmFtSWQsXFxuICAgICAgICAgICAgICAgIGNhcHRjaGFUb2tlbjogJycsXFxuICAgICAgICAgICAgICAgIGR5bmFtaWNDaGVjazogJ0ZBTFNFJyxcXG4gICAgICAgICAgICAgICAgY2xpZW50VHlwZTogJzEnLFxcbiAgICAgICAgICAgICAgICBjYl9TYXZlTmFtZTogJzAnLFxcbiAgICAgICAgICAgICAgICBpc09hdXRoMjogZmFsc2UsXFxuICAgICAgICAgICAgICAgIHVzZXJOYW1lOiBge05SUH0ke2VuVW5hbWV9YCxcXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IGB7TlJQfSR7ZW5QYXNzd2R9YCxcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIHJlc3AgPSBKU09OLnBhcnNlKHBvc3QoJ2h0dHBzOi8vb3Blbi5lLjE4OS5jbi9hcGkvbG9nYm94L29hdXRoMi9sb2dpblN1Ym1pdC5kbycsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdEhlYWRlcnMsXFxuICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlLFxcbiAgICAgICAgICAgICAgICBib2R5OiBkYXRhXFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIGxldCByZXMgPSBKU09OLnBhcnNlKHJlc3AuYm9keSk7XFxuICAgICAgICAgICAgaWYgKHJlcy50b1VybCkge1xcblxcbiAgICAgICAgICAgICAgICBsZXQgY29va2llcyA9IHJlc3AuaGVhZGVyc1snc2V0LWNvb2tpZSddLm1hcChpdCA9PiBpdC5zcGxpdCgnOycpWzBdKS5qb2luKCc7Jyk7XFxuICAgICAgICAgICAgICAgIHJlcyA9IEpTT04ucGFyc2UocmVxdWVzdChyZXMudG9VcmwsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuaGVhZGVycywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZTogY29va2llc1xcbiAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcbiAgICAgICAgICAgICAgICB9KSk7XFxuXFxuICAgICAgICAgICAgICAgIGNvb2tpZXMgKz0gJzsgJyArIChyZXMuaGVhZGVyc1snc2V0LWNvb2tpZSddIHx8IFtdKS5tYXAoaXQgPT4gaXQuc3BsaXQoJzsnKVswXSkuam9pbignOycpO1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKCdjbG91ZENvb2tpZScsIGNvb2tpZXMpO1xcbiAgICAgICAgICAgICAgICBsb2coY29va2llcyk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGxvZ2luOicgKyBKU09OLnN0cmluZ2lmeShyZXNwKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgbG9naW46JyArIGVycm9yLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBnZXRTaGFyZVVybERhdGEodXJsKSB7XFxuICAgICAgICBsZXQgbWF0Y2hlcyA9IHRoaXMucmVnZXguZXhlYyh1cmwpO1xcbiAgICAgICAgbGV0IHNoYXJlRGF0YTAgPSB7fTtcXG4gICAgICAgIGlmIChtYXRjaGVzICYmIG1hdGNoZXNbMV0pIHtcXG4gICAgICAgICAgICBzaGFyZURhdGEwLnNoYXJlQ29kZSA9IG1hdGNoZXNbMV07XFxuICAgICAgICAgICAgbGV0IGFjY2Vzc0NvZGVNYXRjaCA9IHVybC5tYXRjaCgv6K6/6Zeu56CB77yaKFthLXpBLVowLTldKykvKTtcXG4gICAgICAgICAgICBzaGFyZURhdGEwLmFjY2Vzc0NvZGUgPSBhY2Nlc3NDb2RlTWF0Y2ggPyBhY2Nlc3NDb2RlTWF0Y2hbMV0gOiAnJztcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IG1hdGNoZXNfID0gdXJsLm1hdGNoKC9odHRwczpcXFxcL1xcXFwvY2xvdWRcXFxcLjE4OVxcXFwuY25cXFxcL3RcXFxcLyhbMC05QS1aYS16XSspLyk7XFxuICAgICAgICAgICAgc2hhcmVEYXRhMC5zaGFyZUNvZGUgPSBtYXRjaGVzXyA/IG1hdGNoZXNfWzFdIDogbnVsbDtcXG4gICAgICAgICAgICBsZXQgYWNjZXNzQ29kZU1hdGNoID0gdXJsLm1hdGNoKC/orr/pl67noIHvvJooW2EtekEtWjAtOV0rKS8pO1xcbiAgICAgICAgICAgIHNoYXJlRGF0YTAuYWNjZXNzQ29kZSA9IGFjY2Vzc0NvZGVNYXRjaCA/IGFjY2Vzc0NvZGVNYXRjaFsxXSA6ICcnO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHNoYXJlRGF0YTA7XFxuICAgIH0sXFxuICAgIGdldFNoYXJlSW5mb0RhdGEoc2hhcmVVcmwsIGNvZGUpIHtcXG4gICAgICAgIGxldCBzaGFyZURhdGEgPSB0aGlzLmdldFNoYXJlVXJsRGF0YShzaGFyZVVybCk7XFxuICAgICAgICBjb2RlICYmIChzaGFyZURhdGEuYWNjZXNzQ29kZSA9IGNvZGUpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocmVxdWVzdChgJHt0aGlzLmFwaX0vb3Blbi9zaGFyZS9nZXRTaGFyZUluZm9CeUNvZGVWMi5hY3Rpb24/a2V5PW5vQ2FjaGUmc2hhcmVDb2RlPSR7c2hhcmVEYXRhLnNoYXJlQ29kZX1gLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICd1c2VyLWFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMzEuMC4wLjAgU2FmYXJpLzUzNy4zNicsXFxuICAgICAgICAgICAgICAgICAgICAnYWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsXFxuICAgICAgICAgICAgICAgICAgICAvLydhY2NlcHQtZW5jb2RpbmcnOiAnZ3ppcCwgZGVmbGF0ZSwgYnIsIHpzdGQnLFxcbiAgICAgICAgICAgICAgICAgICAgJ2FjY2VwdC1sYW5ndWFnZSc6ICd6aC1DTix6aDtxPTAuOScsXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgc2hhcmVEYXRhLnJvb3RGaWxlSWQgPSByZXNwLmZpbGVJZDtcXG4gICAgICAgICAgICBzaGFyZURhdGEuc2hhcmVJZCA9IHJlc3Auc2hhcmVJZDtcXG4gICAgICAgICAgICBzaGFyZURhdGEuc2hhcmVNb2RlID0gcmVzcC5zaGFyZU1vZGU7XFxuICAgICAgICAgICAgc2hhcmVEYXRhLmlzRm9sZGVyID0gcmVzcC5pc0ZvbGRlcjtcXG4gICAgICAgICAgICByZXR1cm4gc2hhcmVEYXRhO1xcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgZ2V0U2hhcmVJbmZvOicgKyBlcnJvci50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB7fTtcXG4gICAgfSxcXG4gICAgZ2V0U2hhcmVGaWxlcyhmaWxlSWQsIHNoYXJlRGF0YSwgcGFnZSwgb3JkZXJCeSkge1xcbiAgICAgICAgbGV0IHJlc3AgPSBKU09OLnBhcnNlKHJlcXVlc3QoYCR7dGhpcy5hcGl9L29wZW4vc2hhcmUvbGlzdFNoYXJlRGlyLmFjdGlvbj9rZXk9bm9DYWNoZSZwYWdlTnVtPSR7cGFnZXx8MX0mcGFnZVNpemU9NjAmZmlsZUlkPSR7ZmlsZUlkfSZzaGFyZURpckZpbGVJZD0ke2ZpbGVJZH0maXNGb2xkZXI9JHtzaGFyZURhdGEuaXNGb2xkZXJ9JnNoYXJlSWQ9JHtzaGFyZURhdGEuc2hhcmVJZHx8XFxcIlxcXCJ9JnNoYXJlTW9kZT0ke3NoYXJlRGF0YS5zaGFyZU1vZGV9Jmljb25PcHRpb249NSZvcmRlckJ5PSR7b3JkZXJCeXx8XFxcImxhc3RPcFRpbWVcXFwifSZkZXNjZW5kaW5nPXRydWUmYWNjZXNzQ29kZT0ke3NoYXJlRGF0YS5hY2Nlc3NDb2RlfWAsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICdhY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyxcXG4gICAgICAgICAgICAgICAgJ3VzZXItYWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEzMS4wLjAuMCBTYWZhcmkvNTM3LjM2JyxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KSk7XFxuICAgICAgICBsb2cocmVzcClcXG4gICAgICAgIGxldCBmaWxlcyA9IFtdO1xcbiAgICAgICAgZm9yIChsZXQgaXRlbSBvZiByZXNwLmZpbGVMaXN0QU8uZmlsZUxpc3QpIHtcXG4gICAgICAgICAgICBmaWxlcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgZmlsZUlkOiBpdGVtLmlkLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIGxhc3RPcFRpbWU6IGl0ZW0ubGFzdE9wVGltZSxcXG4gICAgICAgICAgICAgICAgZGlyOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBpdGVtLm1lZGlhVHlwZVxcbiAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgfVxcbiAgICAgICAgZm9yIChsZXQgaXRlbSBvZiByZXNwLmZpbGVMaXN0QU8uZm9sZGVyTGlzdCkge1xcbiAgICAgICAgICAgIGZpbGVzLnB1c2goe1xcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5pZC50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICAgICAgbGFzdE9wVGltZTogaXRlbS5sYXN0T3BUaW1lLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgICAgIGRpcjogdHJ1ZVxcbiAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzID0gbmV3IENsb3VkRHJpdmUoKTtcXG4vL25ldyBDbG91ZERyaXZlKCkubG9naW4oXFxcIjE4MTgxMTI1NTM4XFxcIiwgXFxcIl5BMUIyQzNAbG95ZGdpa1xcXCIpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5aSp57+85YiX6KGoXCIsXCJwYXRoXCI6XCJjbG91ZFNoYXJlTGlzdFwiLFwicnVsZVwiOlwianM6XFxubGV0IHRpdGxlSGVhZCA9IHtcXG4gICAgdmlkZW86IFxcXCLwn46sXFxcIixcXG4gICAgYXVkaW86IFxcXCLwn461XFxcIixcXG4gICAgZG9jOiBcXFwi8J+TkVxcXCIsXFxuICAgIGltYWdlOiBcXFwi8J+WvFxcXCIsXFxuICAgIGFyY2hpdmU6IFxcXCLwn5OmXFxcIixcXG4gICAgXFxcImRlZmF1bHRcXFwiOiBcXFwi4p2TXFxcIlxcbn07XFxuXFxuZnVuY3Rpb24gZ2V0SGVhZCh0eXBlLCBleHQpIHtcXG4gICAgbGV0IGhlYWQgPSB0aXRsZUhlYWRbdHlwZV07XFxuXFxuICAgIHJldHVybiBoZWFkIHx8IFxcXCLinZNcXFwiO1xcbn1cXG5cXG5mdW5jdGlvbiBmb3JtYXRTaXplKHNpemUpIHtcXG4gICAgaWYgKCFzaXplKSB7XFxuICAgICAgICByZXR1cm4gJyc7XFxuICAgIH1cXG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcXG4gICAgbGV0IGkgPSAwO1xcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0KSB7XFxuICAgICAgICBzaXplIC89IDEwMjQ7XFxuICAgICAgICBpKys7XFxuICAgIH1cXG4gICAgc2l6ZSA9IGkgPyBOdW1iZXIoc2l6ZS50b0ZpeGVkKDIpKSA6IHNpemU7XFxuICAgIHJldHVybiBgJHtzaXplfSAke3VuaXRzW2ldfWA7XFxufVxcblxcblxcbmxldCByZWFsdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJyZWFsdXJsXFxcIiwgXFxcIlxcXCIpKTtcXG5cXG5cXG5sZXQgY2xvdWREcml2ZSA9ICQucmVxdWlyZShcXFwiQ2xvdWREcml2ZVxcXCIpO1xcblxcblxcbmxldCBzaGFyZURhdGEgPSBjbG91ZERyaXZlLmdldFNoYXJlSW5mb0RhdGEocmVhbHVybCk7XFxubGV0IGxpc3QgPSBjbG91ZERyaXZlLmdldFNoYXJlRmlsZXMoTVlfUEFSQU1TLmZpbGVJZCB8fCBzaGFyZURhdGEucm9vdEZpbGVJZCwgc2hhcmVEYXRhLCBNWV9QQUdFKTtcXG5cXG5sZXQgZCA9IFtdO1xcbmxpc3QuZm9yRWFjaChpdGVtID0+IHtcXG4gICAgLy/liKTmlq3mmK/lkKbmlofku7blpLlcXG4gICAgaWYgKGl0ZW0uZGlyKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi8J+TglxcXCIgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICBkZXNjOiAkLmRhdGVGb3JtYXQoaXRlbS51cGRhdGVkX2F0LCAneXl5eS1NTS1kZCcpICsgJyAgJyArIGl0ZW0uaW5jbHVkZV9pdGVtcyArICfpobkgICcsXFxuICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS90dWJpYW8vbWVzc3kvMjcuc3ZnXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3BhZ2U9ZnlwYWdlXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgc2hhcmVQd2QsXFxuICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSxcXG4gICAgICAgICAgICAgICAgZmlsZUlkOiBpdGVtLmZpZCxcXG4gICAgICAgICAgICAgICAgaW5oZXJpdFRpdGxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgZnJvbURyaXZlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBnZXRIZWFkKGl0ZW0ub2JqX2NhdGVnb3J5KSArIGl0ZW0uZmlsZV9uYW1lLFxcbiAgICAgICAgICAgIGRlc2M6ICQuZGF0ZUZvcm1hdChpdGVtLnVwZGF0ZWRfYXQsICd5eXl5LU1NLWRkJykgKyAnICAnICsgZm9ybWF0U2l6ZShpdGVtLnNpemUpLFxcbiAgICAgICAgICAgIHBpY191cmw6ICQoaXRlbS50aHVtYm5haWwsIHtcXG4gICAgICAgICAgICAgICAgY29va2llOiBuY29va2llXFxuICAgICAgICAgICAgfSkuaW1hZ2UoKSxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSwgZnJvbURyaXZlKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBwbGF5VXJsQ2FjaGUgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwicGxheVVybENhY2hlXFxcIiwge30pO1xcbiAgICAgICAgICAgICAgICBpZiAocGxheVVybENhY2hlW2ZpZF0pIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5VXJsQ2FjaGVbZmlkXTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSAkLnJlcXVpcmUoXFxcInBsYXlcXFwiLCBmcm9tRHJpdmUpLmdldFBsYXlVcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSk7XFxuICAgICAgICAgICAgICAgICAgICBwbGF5VXJsQ2FjaGVbZmlkXSA9IHVybDtcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiLCBwbGF5VXJsQ2FjaGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0sIGl0ZW0uZmlkLCBpdGVtLnNoYXJlX2ZpZF90b2tlbiwgc2hhcmVJZCwgcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLCBpdGVtLm9ial9jYXRlZ29yeSwgZnJvbURyaXZlKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW0uZmlkLFxcbiAgICAgICAgICAgICAgICAvL2luaGVyaXRUaXRsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgIGNsczogJ3BsYXlsaXN0ICcgKyBpdGVtLm9ial9jYXRlZ29yeVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgIH1cXG5cXG59KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIkRvd25Ub29sXCIsXCJwYXRoXCI6XCJEb3duVG9vbFwiLFwicnVsZVwiOlwianM6XFxuXFxuZnVuY3Rpb24gZ2V0RG93bkNVUkwodXJsLCBoZWFkZXJzLCBmaWxlbmFtZSkge1xcbiAgICAvLyBTdGFydCBidWlsZGluZyB0aGUgY3VybCBjb21tYW5kIHdpdGggdGhlIFVSTFxcbiAgICBsZXQgY3VybENvbW1hbmQgPSBgY3VybCAtbyBcXFwiJHtmaWxlbmFtZX1cXFwiIFxcXCIke3VybH1cXFwiYDtcXG5cXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIGN1cmwgY29tbWFuZCBpZiBhbnkgYXJlIHByb3ZpZGVkXFxuICAgIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgY3VybENvbW1hbmQgKz0gT2JqZWN0LmVudHJpZXMoaGVhZGVycykucmVkdWNlKChjb21tYW5kLCBba2V5LCB2YWx1ZV0pID0+IHtcXG4gICAgICAgICAgICByZXR1cm4gYCR7Y29tbWFuZH0gLUggXFxcIiR7a2V5fTogJHt2YWx1ZX1cXFwiYDtcXG4gICAgICAgIH0sICcgJyk7XFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIGN1cmxDb21tYW5kO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXREb3duQXJpYTJjKHVybCwgaGVhZGVycywgZmlsZW5hbWUsIGN1dCkge1xcbiAgICAvLyBTdGFydCBidWlsZGluZyB0aGUgYXJpYTJjIGNvbW1hbmQgd2l0aCB0aGUgVVJMIGFuZCBudW1iZXIgb2YgY29ubmVjdGlvbnMvc2VnbWVudHNcXG4gICAgY3V0ID0gY3V0IHx8IDE7XFxuICAgIGN1dCA9IGN1dCA+IDE2ID8gMTYgOiBjdXQ7XFxuXFxuICAgIGxldCBhcmlhMkNvbW1hbmQgPSBgYXJpYTJjIC14ICR7Y3V0fSAtcyAke2N1dH0gLW8gXFxcIiR7ZmlsZW5hbWV9XFxcIiBcXFwiJHt1cmx9XFxcImA7XFxuXFxuICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSBhcmlhMmMgY29tbWFuZCBpZiBhbnkgYXJlIHByb3ZpZGVkXFxuICAgIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgYXJpYTJDb21tYW5kICs9IE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLnJlZHVjZSgoY29tbWFuZCwgW2tleSwgdmFsdWVdKSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIGAke2NvbW1hbmR9IC0taGVhZGVyPVxcXCIke2tleX06ICR7dmFsdWV9XFxcImA7XFxuICAgICAgICB9LCAnICcpO1xcbiAgICB9XFxuXFxuICAgIHJldHVybiBhcmlhMkNvbW1hbmQ7XFxufVxcbmZ1bmN0aW9uIGdldERlZlJwY1VybCgpe1xcbiAgICBsZXQgZGVmaXAgPSBnZXRJUCgpLnNwbGl0KFxcXCIuXFxcIik7XFxuICAgIGRlZmlwLnB1c2goTnVtYmVyKGRlZmlwLnBvcCgpKSArIDIpO1xcbiAgICByZXR1cm4gXFxcImh0dHA6Ly9cXFwiICsgZGVmaXAuam9pbihcXFwiLlxcXCIpICsgXFxcIjoxNjgwMC9qc29ucnBjXFxcIjtcXG59XFxuZnVuY3Rpb24gdXBkYXRlUnBjKHVybCwgaGVhZGVycywgZmlsZW5hbWUpIHtcXG4gICAgLy9sb2coaGVhZGVycylcXG4gICAgbGV0IGhlYWRlciA9IFtdO1xcbiAgICBsZXQgcnBjRGF0YSA9IHtcXG4gICAgICAgIGlkOiBEYXRlLm5vdygpLFxcbiAgICAgICAganNvbnJwYzogXFxcIjIuMFxcXCIsXFxuICAgICAgICBtZXRob2Q6IFxcXCJhcmlhMi5hZGRVcmlcXFwiLFxcbiAgICAgICAgcGFyYW1zOiBbXFxcInRva2VuOlxcXCIgKyBnZXRJdGVtKFxcXCJycGNBcmlhVG9rZW5cXFwiLCBcXFwiXFxcIiksIFt1cmxdLCB7XFxuICAgICAgICAgICAgZGlyOiBnZXRJdGVtKFxcXCJycGNEb3duRGlyXFxcIixcXFwiXFxcIil8fHZvaWQgMCxcXG4gICAgICAgICAgICBvdXQ6IGZpbGVuYW1lLFxcbiAgICAgICAgICAgIGhlYWRlclxcbiAgICAgICAgfV1cXG4gICAgfTtcXG5cXG4gICAgaWYgKGhlYWRlcnMgJiYgdHlwZW9mIGhlYWRlcnMgPT09ICdvYmplY3QnKSB7XFxuICAgICAgICBPYmplY3QuZW50cmllcyhoZWFkZXJzKS5mb3JFYWNoKFtrZXksIHZhbHVlXSA9PiB7XFxuICAgICAgICAgICAgaGVhZGVyLnB1c2goYCR7a2V5fTogJHt2YWx1ZX1gKTtcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIFxcbiAgICBsZXQgcmVzID0gcG9zdChnZXRJdGVtKFxcXCJycGNVcmxcXFwiLCBnZXREZWZScGNVcmwoKSksIHtcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJwY0RhdGEpXFxuICAgIH0pO1xcbiAgICByZXR1cm4gcmVzLmluY2x1ZGVzKCdcXFwicmVzdWx0XFxcIjonKTtcXG59XFxuXFxuJC5leHBvcnRzPXtcXG4gICAgZ2V0RG93bkNVUkwsXFxuICAgIGdldERvd25BcmlhMmMsXFxuICAgIHVwZGF0ZVJwYyxcXG4gICAgZ2V0RGVmUnBjVXJsXFxufTtcXG5cIn1dLFwicGFyYW1zXCI6XCJ7XFxcImZpbGVJZFxcXCI6XFxcIjc4ZDM1YjYyNjk5MjRiOGFiMmVkM2VmYmQzMDdjMDMyXFxcIixcXFwiZnJvbURyaXZlXFxcIjpcXFwicXVhcmtcXFwiLFxcXCJpbmhlcml0VGl0bGVcXFwiOmZhbHNlLFxcXCJzaGFyZUlkXFxcIjpcXFwiOGE0MjAyN2Q2ZTZiXFxcIixcXFwic2hhcmVQd2RcXFwiOlxcXCJcXFwiLFxcXCJzaGFyZVRva2VuXFxcIjpcXFwiNkpHRTN5bUtrZjJPZ3c4SVVxVSt5cXRnZkZ1dlpXQlJNazhtS0ppUFd5Yz1cXFwifVwiLFwic2F2ZWRcIjpmYWxzZSxcInRpdGxlXCI6XCJRdWFyay7nroBcIixcInZlcnNpb25cIjowLFwidXJsXCI6XCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3BhZ2U9ZnlwYWdlXCIsXCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwiZmluZF9ydWxlXCI6XCJqczpcXG5sZXQgZCA9IFtdO1xcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4gY2xlYXJNeVZhcihcXFwicGxheVVybENhY2hlXFxcIikpO1xcbmFkZExpc3RlbmVyKFxcXCJvblJlZnJlc2hcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiKSk7XFxubGV0IHNvVXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJyZWFsdXJsXFxcIiwgXFxcIlxcXCIpKTtcXG5sZXQgZnJvbURyaXZlID0gTVlfUEFSQU1TLmZyb21Ecml2ZSB8fCBcXFwicXVhcmtcXFwiO1xcblxcbmlmIChzb1VybC5pbmNsdWRlcyhcXFwiZHJpdmUudWMuY25cXFwiKSkge1xcbiAgICBmcm9tRHJpdmUgPSBcXFwidWNcXFwiO1xcbn1cXG5sZXQgcmVhbHVybCA9IHNvVXJsLnNwbGl0KFxcXCI/XFxcIilbMF07XFxubGV0IHVybERhdGEgPSByZWFsdXJsLnNwbGl0KFxcXCIvXFxcIik7XFxuXFxubGV0IHNoYXJlSWQgPSBNWV9QQVJBTVMuc2hhcmVJZCB8fCB1cmxEYXRhWzRdLnJlcGxhY2UoXFxcIiNcXFwiLCBcXFwiXFxcIik7XFxubGV0IHNoYXJlUHdkID0gZ2V0UGFyYW0oXFxcInNoYXJlUHdkXFxcIiwgTVlfUEFSQU1TLnNoYXJlUHdkIHx8IGdldFBhcmFtKFxcXCJwYXNzY29kZVxcXCIsIFxcXCJcXFwiLCBzb1VybCkgfHwgXFxcIlxcXCIpO1xcbmxldCBzaGFyZVRva2VuID0gZ2V0UGFyYW0oXFxcInNoYXJlVG9rZW5cXFwiLCBNWV9QQVJBTVMuc2hhcmVUb2tlbiB8fCBcXFwiXFxcIik7XFxuXFxubGV0IGZpbGVJZCA9IE1ZX1BBUkFNUy5maWxlSWQ7XFxuXFxubGV0IHNvcnQgPSB7XFxuICAgIFxcXCLlkI3np7DmraPluo9cXFwiOiBcXFwiZmlsZV9uYW1lOmFzY1xcXCIsXFxuICAgIFxcXCLlkI3np7DlgJLluo9cXFwiOiBcXFwiZmlsZV9uYW1lOmRlc2NcXFwiLFxcbiAgICBcXFwi5pe26Ze05q2j5bqPXFxcIjogXFxcInVwZGF0ZWRfYXQ6YXNjXFxcIixcXG4gICAgXFxcIuaXtumXtOWAkuW6j1xcXCI6IFxcXCJ1cGRhdGVkX2F0OmRlc2NcXFwiXFxufTtcXG5sZXQgc3R5bGVzID0gW1xcXCJ0ZXh0XzFcXFwiLCBcXFwiYXZhdGFyXFxcIl07XFxuXFxubGV0IHNvcnRWYWx1ZSA9IHNvcnRbZ2V0SXRlbShcXFwic29ydEtleVxcXCIsIFxcXCLlkI3np7DmraPluo9cXFwiKV07XFxubGV0IHN0eWxlID0gZ2V0SXRlbShcXFwic3R5bGVcXFwiLCBzdHlsZXNbMF0pO1xcbmlmIChNWV9QQUdFID09IDEpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBmcm9tRHJpdmUgPT09IFxcXCJ1Y1xcXCIgPyBcXFwiVUPnvZHnm5hcXFwiIDogXFxcIuWkuOWFi+e9keebmFxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fNVxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBmcm9tRHJpdmUgPT09IFxcXCJ1Y1xcXCIgPyBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L3R1Ymlhby9lcmRpLzE0LnBuZ1xcXCIgOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9rdWFrZVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIueCueWHu+WKn+iDveaMiemSrj0+5Liq5Lq66LSm5Y+3566h55CG5Y2z5Y+v55m75b2V6LSm5Y+3XFxcIikuY29uZmlybSgoKSA9PiB7fSksXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHN0eWxlLFxcbiAgICAgICAgdXJsOiAkKHN0eWxlcywgMSwgJ+ivt+mAieaLqScpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbSgnc3R5bGUnLCBpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX2ljb24uc3ZnXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl81XFxcIlxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBnZXRJdGVtKFxcXCJzb3J0S2V5XFxcIiwgXFxcIuWQjeensOato+W6j1xcXCIpLFxcbiAgICAgICAgdXJsOiAkKE9iamVjdC5rZXlzKHNvcnQpLCAxLCAn6K+36YCJ5oupJykuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJzb3J0S2V5XFxcIiwgaW5wdXQpXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX3NvcnQuc3ZnXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl81XFxcIlxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBnZXRJdGVtKFxcXCJxdWFya19wbGF5TW9kZVxcXCIsIFxcXCLovaznoIFcXFwiKSxcXG4gICAgICAgIHVybDogJChbXFxcIui9rOeggVxcXCIsIFxcXCLljp/nlLtcXFwiLCBcXFwi5pmu6YCa5Y6f55S7XFxcIiwgXFxcImN1cmxcXFwiLCBcXFwiYXJpYTJcXFwiLCBcXFwiUlBDXFxcIl0sIDIsIFxcXCLmkq3mlL7mqKHlvI9cXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInF1YXJrX3BsYXlNb2RlXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIh+aNouaIkOWKn1xcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl81XFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvaW1nL2FsaV9wbGF5LnN2Z1xcXCIsXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlip/og71cXFwiLFxcbiAgICAgICAgdXJsOiAkKFtcXFwi6Lez6L2s5aS45YWLQVBQXFxcIiwgXFxcIuWkjeWItuWIhuS6q+mTvuaOpVxcXCIsIFxcXCLkuKrkurrotKblj7fnrqHnkIZcXFwiLCBcXFwi5Y6f55S75LiL6L2957q/56iLXFxcIiwgXFxcIuiuvue9rlJQQ1xcXCJdLCAyKS5zZWxlY3QoKHNoYXJlSWQsIHNoYXJlUHdkLCBmcm9tRHJpdmUpID0+IHtcXG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLot7PovazlpLjlhYtBUFBcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwicWtsaW5rOi8vd3d3LnVjLmNuL2IyMGI4NGZkNzM1YThkZDNmNzU0MTEyOWJhY2M0ZTlhP2FjdGlvbj1vcGVuX3VybCZ1cmw9aHR0cHM6Ly9wYW4ucXVhcmsuY24vcy9cXFwiICsgc2hhcmVJZDtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5Liq5Lq66LSm5Y+3566h55CGXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJhY2NvdW50XFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuWOn+eUu+S4i+i9vee6v+eoi1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoZ2V0SXRlbShcXFwic3BlZWRUaHJlYWRcXFwiLCBcXFwiMTBcXFwiKSwgXFxcIuivt+i+k+WFpTMtMzLkuYvpl7TnmoTmlbTmlbBcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgc3BlZWRUaHJlYWQgPSBwYXJzZUludChpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoc3BlZWRUaHJlYWQgPCAzIHx8IHNwZWVkVGhyZWFkID4gMzIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5LiN5ZCI5rOVXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInNwZWVkVGhyZWFkXFxcIiwgU3RyaW5nKHNwZWVkVGhyZWFkKSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuWkjeWItuWIhuS6q+mTvuaOpVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGJ1aWxkVXJsKFxcXCJodHRwczovL2RyaXZlLnVjLmNuL3MvXFxcIiArIHNoYXJlSWQgKyBcXFwiP3B1YmxpYz0xIy9saXN0L3NoYXJlXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBzaGFyZVB3ZFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgYnVpbGRVcmwoXFxcImh0dHBzOi8vcGFuLnF1YXJrLmNuL3MvXFxcIiArIHNoYXJlSWQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzY29kZTogc2hhcmVQd2RcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuiuvue9rlJQQ1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLorr7nva5SUEPlnLDlnYBcXFwiLCBcXFwi6K6+572uVG9rZW5cXFwiLCBcXFwi5LiL6L2955uu5b2VXFxcIl0pLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLorr7nva5SUEPlnLDlnYBcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG93blRvb2wgPSAkLnJlcXVpcmUoXFxcIkRvd25Ub29sXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoZ2V0SXRlbShcXFwicnBjVXJsXFxcIiwgRG93blRvb2wuZ2V0RGVmUnBjVXJsKCkpLCBcXFwiUlBD5Zyw5Z2ALOS4uuepuuiHquWKqOiOt+WPluWxgOWfn+e9keWcsOWdgFxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJycGNVcmxcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySXRlbShcXFwicnBjVXJsXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk6K6+572uXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuiuvue9rlRva2VuXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKGdldEl0ZW0oXFxcInJwY0FyaWFUb2tlblxcXCIsIFxcXCJcXFwiKSwgXFxcIlRva2VuLOayoeacieWwseS4jeWhq1xcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwicnBjQXJpYVRva2VuXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKGdldEl0ZW0oXFxcInJwY0Rvd25EaXJcXFwiLCBcXFwiXFxcIiksIFxcXCLkuIvovb3kv53lrZjnm67lvZUs5Li656m65bCx5oyJ5LiL6L295Zmo6buY6K6k6Lev5b6EXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJycGNEb3duRGlyXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgc2hhcmVJZCwgc2hhcmVQd2QsIGZyb21Ecml2ZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fNVxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfZmlsZWludG8uc3ZnXFxcIixcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogJ2xpbmVfYmxhbmsnXFxuICAgIH0pO1xcbn1cXG5cXG5cXG5sZXQgUXVhcmtTaGFyZUFwaSA9ICQucmVxdWlyZShcXFwiUXVhcmtTaGFyZUFwaVxcXCIsIGZyb21Ecml2ZSk7XFxubGV0IHF1YXJrU2hhcmVBcGkgPSBuZXcgUXVhcmtTaGFyZUFwaShzaGFyZUlkLCBzaGFyZVB3ZCkuc2V0VG9rZW4oc2hhcmVUb2tlbikuc2V0UmVmcmVzaCgoc2hhcmVUb2tlbikgPT4ge1xcbiAgICBNWV9QQVJBTVMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW47XFxuICAgIHNldFBhZ2VQYXJhbXMoTVlfUEFSQU1TKTtcXG59KTtcXG5cXG5mdW5jdGlvbiBmb3JtYXRTaXplKHNpemUpIHtcXG4gICAgaWYgKCFzaXplKSB7XFxuICAgICAgICByZXR1cm4gJyc7XFxuICAgIH1cXG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcXG4gICAgbGV0IGkgPSAwO1xcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0KSB7XFxuICAgICAgICBzaXplIC89IDEwMjQ7XFxuICAgICAgICBpKys7XFxuICAgIH1cXG4gICAgc2l6ZSA9IGkgPyBOdW1iZXIoc2l6ZS50b0ZpeGVkKDIpKSA6IHNpemU7XFxuICAgIHJldHVybiBgJHtzaXplfSAke3VuaXRzW2ldfWA7XFxufVxcblxcbmxldCBzdWJFeHRzID0gW1xcXCJ2dHRcXFwiLCBcXFwic3J0XFxcIiwgXFxcImFzc1xcXCJdO1xcbmxldCB0aXRsZUhlYWQgPSB7XFxuICAgIHZpZGVvOiBcXFwi8J+OrFxcXCIsXFxuICAgIGF1ZGlvOiBcXFwi8J+OtVxcXCIsXFxuICAgIGRvYzogXFxcIvCfk5FcXFwiLFxcbiAgICBpbWFnZTogXFxcIvCflrxcXFwiLFxcbiAgICBhcmNoaXZlOiBcXFwi8J+TplxcXCIsXFxuICAgIFxcXCJkZWZhdWx0XFxcIjogXFxcIuKdk1xcXCJcXG59O1xcblxcbmZ1bmN0aW9uIGdldEhlYWQodHlwZSwgZXh0KSB7XFxuICAgIGxldCBoZWFkID0gdGl0bGVIZWFkW3R5cGVdO1xcblxcbiAgICByZXR1cm4gaGVhZCB8fCBcXFwi4p2TXFxcIjtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0RG93blVybChmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4sIGNhdGVnb3J5LCBmcm9tRHJpdmUpIHtcXG5cXG4gICAgdHJ5IHtcXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjojrflj5YuLi5cXFwiKTtcXG4gICAgICAgIGxldCBwbGF5VXJsQ2FjaGUgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwicGxheVVybENhY2hlXFxcIiwge30pO1xcbiAgICAgICAgaWYgKHBsYXlVcmxDYWNoZVtmaWRdKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHBsYXlVcmxDYWNoZVtmaWRdO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gJC5yZXF1aXJlKFxcXCJwbGF5XFxcIiwgZnJvbURyaXZlKS5nZXRQbGF5VXJsKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbiwgY2F0ZWdvcnkpO1xcbiAgICAgICAgICAgIHBsYXlVcmxDYWNoZVtmaWRdID0gdXJsO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiLCBwbGF5VXJsQ2FjaGUpO1xcbiAgICAgICAgICAgIHJldHVybiB1cmw7XFxuICAgICAgICB9XFxuICAgIH0gZmluYWxseSB7XFxuICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICB9XFxufVxcbnRyeSB7XFxuICAgIHZhciByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKGZpbGVJZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXG4gICAgLy/orr7nva7moIfpophcXG4gICAgdmFyIGxpc3QgPSByZXMuZGF0YS5saXN0IHx8IFtdO1xcbiAgICBpZiAoc2hhcmVJZCAhPT0gXFxcInNlbGZcXFwiKSB7XFxuICAgICAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcblxcbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwICYmICFmaWxlSWQpIHtcXG4gICAgICAgICAgICByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKHJlcy5kYXRhLnNoYXJlLmZpcnN0X2ZpZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXG4gICAgICAgICAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcbiAgICAgICAgICAgIHZhciBsaXN0ID0gcmVzLmRhdGEubGlzdCB8fCBbXTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsZXQgbmNvb2tpZSA9IHF1YXJrU2hhcmVBcGkuZ2V0UGljQ29va2llKCk7XFxuICAgIC8vbG9nKG5jb29raWUpXFxuICAgIGxpc3QuZm9yRWFjaChpdGVtID0+IHtcXG4gICAgICAgIC8v5Yik5pat5piv5ZCm5paH5Lu25aS5XFxuICAgICAgICBpZiAoaXRlbS5kaXIpIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIvCfk4JcXFwiICsgaXRlbS5maWxlX25hbWUsXFxuICAgICAgICAgICAgICAgIGRlc2M6ICQuZGF0ZUZvcm1hdChpdGVtLnVwZGF0ZWRfYXQsICd5eXl5LU1NLWRkJykgKyAnICAnICsgaXRlbS5pbmNsdWRlX2l0ZW1zICsgJ+mhuSAgJyxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS90dWJpYW8vbWVzc3kvMjcuc3ZnXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3F1YXJrTGlzdD9wYWdlPWZ5cGFnZVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBzdHlsZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlSWQsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSxcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogaXRlbS5maWQsXFxuICAgICAgICAgICAgICAgICAgICBpbmhlcml0VGl0bGU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAgZnJvbURyaXZlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGdldEhlYWQoaXRlbS5vYmpfY2F0ZWdvcnkpICsgaXRlbS5maWxlX25hbWUsXFxuICAgICAgICAgICAgICAgIGRlc2M6ICQuZGF0ZUZvcm1hdChpdGVtLnVwZGF0ZWRfYXQsICd5eXl5LU1NLWRkJykgKyAnICAnICsgZm9ybWF0U2l6ZShpdGVtLnNpemUpLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiAkKGl0ZW0udGh1bWJuYWlsLCB7XFxuICAgICAgICAgICAgICAgICAgICBjb29raWU6IG5jb29raWVcXG4gICAgICAgICAgICAgICAgfSkuaW1hZ2UoKSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKGdldERvd25VcmwsIGl0ZW0uZmlkLCBpdGVtLnNoYXJlX2ZpZF90b2tlbiwgc2hhcmVJZCwgcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLCBpdGVtLm9ial9jYXRlZ29yeSwgZnJvbURyaXZlKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHN0eWxlLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGl0ZW0uZmlkLFxcbiAgICAgICAgICAgICAgICAgICAgLy9pbmhlcml0VGl0bGU6IGZhbHNlLFxcblxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiAncGxheWxpc3QgJyArIGl0ZW0ub2JqX2NhdGVnb3J5XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfVxcblxcbiAgICB9KTtcXG59IGNhdGNoIChlKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogZS5tZXNzYWdlLFxcbiAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGlmIChlLm1lc3NhZ2UuaW5jbHVkZXMoXFxcIuaPkOWPlueggVxcXCIpKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi6L6T5YWl5o+Q5Y+W56CBXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoKS5pbnB1dCgoTVlfUEFSQU1TKSA9PiB7XFxuICAgICAgICAgICAgICAgIHNldFBhZ2VQYXJhbXMoT2JqZWN0LmFzc2lnbih7fSwgTVlfUEFSQU1TLCB7XFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogaW5wdXRcXG4gICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIH0sIE1ZX1BBUkFNUyksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuc2V0UmVzdWx0KGQpO1wiLFwiZ3JvdXBcIjpcIuKRoOe9keebmFwiLFwidWFcIjpcIm1vYmlsZVwiLFwicHJlUnVsZVwiOlwiXCIsXCJwYWdlc1wiOlwiW3tcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWkuOWFi+WIl+ihqEFQSVxcXCIsXFxcInBhdGhcXFwiOlxcXCJRdWFya1NoYXJlQXBpXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuLy9AYXV0aG9yIExveURnSWtcXFxcbmxldCBodHRwUmVxdWVzdCA9ICQucmVxdWlyZShcXFxcXFxcImh0dHBSZXF1ZXN0XFxcXFxcXCIpO1xcXFxubGV0IENvb2tpZU1hbmFnZT0kLnJlcXVpcmUoXFxcXFxcXCJDb29raWVNYW5hZ2VcXFxcXFxcIik7XFxcXG5sZXQgZnJvbURyaXZlID0gbW9kdWxlLmltcG9ydFBhcmFtO1xcXFxubGV0IHByLCBiYXNlVXJsLCBjb29raWU7XFxcXG5pZiAoZnJvbURyaXZlID09PSBcXFxcXFxcInVjXFxcXFxcXCIpIHtcXFxcbiAgICBiYXNlVXJsID0gXFxcXFxcXCJodHRwczovL3BjLWFwaS51Yy5jblxcXFxcXFwiO1xcXFxuICAgIHByID0gXFxcXFxcXCJVQ0Jyb3dzZXJcXFxcXFxcIjtcXFxcbiAgICBjb29raWUgPSBnZXRJdGVtKFxcXFxcXFwidWNDb29raWVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG59IGVsc2Uge1xcXFxuICAgIGJhc2VVcmwgPSBcXFxcXFxcImh0dHBzOi8vZHJpdmUucXVhcmsuY25cXFxcXFxcIjtcXFxcbiAgICBwciA9IFxcXFxcXFwidWNwcm9cXFxcXFxcIjtcXFxcbiAgICBjb29raWUgPSBnZXRJdGVtKFxcXFxcXFwicXVhcmtDb29raWVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG59XFxcXG5cXFxcbmNvbnN0IGNvb2tpZU1hbmFnZSA9IG5ldyBDb29raWVNYW5hZ2UoY29va2llKTtcXFxcbmZ1bmN0aW9uIFF1YXJrU2hhcmVBcGkoc2hhcmVJZCwgc2hhcmVQd2QpIHtcXFxcbiAgICB0aGlzLnNoYXJlSWQgPSBzaGFyZUlkO1xcXFxuICAgIHRoaXMuc2hhcmVQd2QgPSBzaGFyZVB3ZDtcXFxcbiAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayA9ICgoKSA9PiB2b2lkIDApO1xcXFxuICAgIC8vdGhpcy5zaGFyZVRva2VuID0gc2hhcmVUb2tlbiB8fCB0aGlzLmdldFNoYXJlVG9rZW4oKTtcXFxcbn1cXFxcbk9iamVjdC5hc3NpZ24oUXVhcmtTaGFyZUFwaS5wcm90b3R5cGUsIHtcXFxcbiAgICBzZXRSZWZyZXNoKHJlZnJlc2hDYWxsQmFjaykge1xcXFxuICAgICAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayA9IHJlZnJlc2hDYWxsQmFjaztcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBzZXRUb2tlbihzaGFyZVRva2VuKSB7XFxcXG4gICAgICAgIHRoaXMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW47XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgcmVxdWVzdEh0dHAoYXBpKSB7XFxcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QoYXBpLnN0YXJ0c1dpdGgoXFxcXFxcXCJodHRwXFxcXFxcXCIpID8gYXBpIDogKGJhc2VVcmwgKyBhcGkpKS5zdWNjZXNzKChib2R5LHJlcykgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGJvZHkuc3RhdHVzICE9PSAyMDApIHtcXFxcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGNvb2tpZU1hbmFnZS5hZGQocmVzLmhlYWRlcnNbXFxcXFxcXCJzZXQtY29va2llXFxcXFxcXCJdKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xcXFxuICAgICAgICB9KS5oZWFkZXJzKHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiY29va2llXFxcXFxcXCI6IGNvb2tpZU1hbmFnZS5nZXQoKSxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBcXFxcXFxcIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIHF1YXJrLWNsb3VkLWRyaXZlLzIuNS4yMCBDaHJvbWUvMTAwLjAuNDg5Ni4xNjAgRWxlY3Ryb24vMTguMy41LjQtYjQ3ODQ5MTEwMCBTYWZhcmkvNTM3LjM2IENoYW5uZWwvcGNra19vdGhlcl9jaFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJyZWZlcmVyXFxcXFxcXCI6IGJhc2VVcmxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSxcXFxcbiAgICBnZXRUb2tlbigpIHtcXFxcbiAgICAgICAgaWYgKHRoaXMuc2hhcmVJZCAhPT0gXFxcXFxcXCJzZWxmXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYXJlVG9rZW4gfHwgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAgZ2V0UGljQ29va2llKCl7XFxcXG4gICAgICAgIHJldHVybiBjb29raWVNYW5hZ2UuZ2V0KCk7XFxcXG4gICAgICAgIFxcXFxuICAgIH0sXFxcXG4gICAgZ2V0U2hhcmVUb2tlbigpIHtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucmVxdWVzdEh0dHAoXFxcXFxcXCIvMS9jbG91ZGRyaXZlL3NoYXJlL3NoYXJlcGFnZS90b2tlblxcXFxcXFwiKS5ib2R5KHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicHdkX2lkXFxcXFxcXCI6IHRoaXMuc2hhcmVJZCxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicGFzc2NvZGVcXFxcXFxcIjogdGhpcy5zaGFyZVB3ZCxcXFxcbiAgICAgICAgfSkuYm9keVRvU3RyaW5nKHRydWUpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxcXG4gICAgICAgIHRoaXMuc2hhcmVUb2tlbiA9IHJlc3VsdC5kYXRhLnN0b2tlbjtcXFxcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2FsbEJhY2socmVzdWx0LmRhdGEuc3Rva2VuLCB0aGlzKTtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hhcmVUb2tlbjtcXFxcbiAgICB9LFxcXFxuICAgIF9nZXRTZWxmTGlzdEZpbGUoZmlsZUlkLCBwYWdlLCBvcmRlckJ5KSB7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnJlcXVlc3RIdHRwKFxcXFxcXFwiaHR0cHM6Ly9kcml2ZS5xdWFyay5jbi8xL2Nsb3VkZHJpdmUvZmlsZS9zb3J0P3ByPVxcXFxcXFwiICsgcHIgKyBcXFxcXFxcIiZmcj1wY1xcXFxcXFwiKS5idWlsZFVybCh7XFxcXG4gICAgICAgICAgICBwZGlyX2ZpZDogZmlsZUlkIHx8IFxcXFxcXFwiMFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZm9yY2U6IDAsXFxcXG4gICAgICAgICAgICBfcGFnZTogcGFnZSxcXFxcbiAgICAgICAgICAgIF9zaXplOiAxMDAsXFxcXG4gICAgICAgICAgICB1Y19wYXJhbV9zdHI6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBfZmV0Y2hfdG90YWw6IDEsXFxcXG4gICAgICAgICAgICBfZmV0Y2hfc3ViX2RpcnM6IDAsXFxcXG4gICAgICAgICAgICBfc29ydDogXFxcXFxcXCJmaWxlX3R5cGU6YXNjLFxcXFxcXFwiICsgb3JkZXJCeVxcXFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXFxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXFxcbiAgICB9LFxcXFxuICAgIF9nZXRTaGFyZUxpc3RGaWxlKGZpbGVJZCwgcGFnZSwgb3JkZXJCeSkge1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0SHR0cChcXFxcXFxcIi8xL2Nsb3VkZHJpdmUvc2hhcmUvc2hhcmVwYWdlL2RldGFpbD9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGNcXFxcXFxcIikuYnVpbGRVcmwoe1xcXFxuICAgICAgICAgICAgcHdkX2lkOiB0aGlzLnNoYXJlSWQgfHwgXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHN0b2tlbjogZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZ2V0VG9rZW4oKSB8fCBcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIHBkaXJfZmlkOiBmaWxlSWQgfHwgXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGZvcmNlOiAwLFxcXFxuICAgICAgICAgICAgX3BhZ2U6IHBhZ2UsXFxcXG4gICAgICAgICAgICBfc2l6ZTogMTAwLFxcXFxuICAgICAgICAgICAgX2ZldGNoX2Jhbm5lcjogMSxcXFxcbiAgICAgICAgICAgIF9mZXRjaF9zaGFyZTogMSxcXFxcbiAgICAgICAgICAgIF9mZXRjaF90b3RhbDogMSxcXFxcbiAgICAgICAgICAgIF9zb3J0OiBcXFxcXFxcImZpbGVfdHlwZTphc2MsXFxcXFxcXCIgKyBvcmRlckJ5XFxcXG4gICAgICAgIH0pLmVycm9yV2l0aFJldHJ5KChlcnIsIHJlcywgaHR0cCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKEpTT04ucGFyc2UocmVzLmJvZHkpLm1lc3NhZ2UuaW5jbHVkZXMoJ3N0b2tlbicpKSB7XFxcXG4gICAgICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXFxcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRVcmw6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b2tlbjogZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZ2V0U2hhcmVUb2tlbigpIHx8IFxcXFxcXFwiXFxcXFxcXCIpXFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxcXG4gICAgfSxcXFxcbiAgICBnZXRMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpIHtcXFxcbiAgICAgICAgaWYgKHRoaXMuc2hhcmVJZCAhPT0gXFxcXFxcXCJzZWxmXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTaGFyZUxpc3RGaWxlKGZpbGVJZCwgcGFnZSwgb3JkZXJCeSk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2VsZkxpc3RGaWxlKGZpbGVJZCwgcGFnZSwgb3JkZXJCeSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG59KTtcXFxcbiQuZXhwb3J0cyA9IFF1YXJrU2hhcmVBcGk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiaHR0cFJlcXVlc3RcXFwiLFxcXCJwYXRoXFxcIjpcXFwiaHR0cFJlcXVlc3RcXFwiLFxcXCJydWxlXFxcIjpcXFwiZnVuY3Rpb24gaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKSB7XFxcXG4gICAgdGhpcy5yZXRyeUNvdW50ID0gMDtcXFxcbiAgICB0aGlzLnVybCA9IHVybDtcXFxcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XFxcXG4gICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxcXG4gICAgfSk7XFxcXG4gICAgdGhpcy5lcnJvckNhbGxiYWNrID0gKGVyciwgcmVzKSA9PiB7dGhyb3cgZXJyfTtcXFxcbiAgICB0aGlzLmVycm9yQ2FsbGJhY2tXaXRoUmV0cnkgPSAoZXJyLCByZXMsIHRyeVJlc3RhcnQpID0+IGZhbHNlO1xcXFxuICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrID0gKGJvZHksIHN0YXR1c0NvZGUsIGhlYWRlcnMpID0+IGJvZHk7XFxcXG4gICAgdGhpcy5lcnJvclR5cGVDYWxsYmFjayA9IChlcnIsIHJlcykgPT4gZXJyO1xcXFxuICAgIHRoaXMuc3RhcnRSZXF1ZXN0ID0gZmV0Y2g7XFxcXG4gICAgdGhpcy5fYm9keVRvU3RyaW5nID0gZmFsc2U7XFxcXG4gICAgdGhpcy5idWlsZFBhcmFtID0gdm9pZCgwKTtcXFxcbn1cXFxcblxcXFxuT2JqZWN0LmFzc2lnbihodHRwUmVxdWVzdC5wcm90b3R5cGUsIHtcXFxcbiAgICBib2R5VG9TdHJpbmcoZmxhZykge1xcXFxuICAgICAgICB0aGlzLl9ib2R5VG9TdHJpbmcgPSAhIWZsYWc7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgYm9keShib2R5KSB7XFxcXG4gICAgICAgIHRoaXMub3B0aW9ucy5ib2R5ID0gYm9keSB8fCB2b2lkIDA7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgYnVpbGRVcmwoYnVpbGRQYXJhbSkge1xcXFxuICAgICAgICB0aGlzLmJ1aWxkUGFyYW0gPSBidWlsZFBhcmFtIHx8IHt9O1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIHNldFN0YXJ0UmVxdWVzdEZ1bmMoZnVuYykge1xcXFxuICAgICAgICB0aGlzLnN0YXJ0UmVxdWVzdCA9IGZ1bmM7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgaGVhZGVycyhoZWFkZXJzKSB7XFxcXG4gICAgICAgIHRoaXMub3B0aW9ucy5oZWFkZXJzID0gaGVhZGVycyB8fCB2b2lkIDA7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgc3VjY2VzcyhzdWNjZXNzQ2FsbGJhY2spIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBzdWNjZXNzQ2FsbGJhY2sgIT09IFxcXFxcXFwiZnVuY3Rpb25cXFxcXFxcIikgcmV0dXJuIHRoaXM7XFxcXG4gICAgICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrID0gc3VjY2Vzc0NhbGxiYWNrO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGVycm9yKGVycm9yQ2FsbGJhY2spIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvckNhbGxiYWNrICE9PSBcXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCIpIHJldHVybiB0aGlzO1xcXFxuICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGVycm9yVHlwZShlcnJvclR5cGVDYWxsYmFjaykge1xcXFxuICAgICAgICBpZiAodHlwZW9mIGVycm9yVHlwZUNhbGxiYWNrICE9PSBcXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCIpIHJldHVybiB0aGlzO1xcXFxuICAgICAgICB0aGlzLmVycm9yVHlwZUNhbGxiYWNrID0gZXJyb3JUeXBlQ2FsbGJhY2s7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgZXJyb3JXaXRoUmV0cnkocmV0cnlDb3VudCwgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSkge1xcXFxuICAgICAgICBpZiAodHlwZW9mIHJldHJ5Q291bnQgPT09IFxcXFxcXFwiZnVuY3Rpb25cXFxcXFxcIiAmJiB0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9PT0gXFxcXFxcXCJ1bmRlZmluZWRcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9IHJldHJ5Q291bnQ7XFxcXG4gICAgICAgICAgICByZXRyeUNvdW50ID0gMTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAodHlwZW9mIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkgIT09IFxcXFxcXFwiZnVuY3Rpb25cXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gTnVtYmVyKHJldHJ5Q291bnQpO1xcXFxuICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2tXaXRoUmV0cnkgPSBlcnJvckNhbGxiYWNrV2l0aFJldHJ5O1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIHN0YXJ0KHRvSnNvbikge1xcXFxuICAgICAgICBsZXQgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucyk7XFxcXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5ib2R5ID09PSBcXFxcXFxcIm9iamVjdFxcXFxcXFwiICYmIHRoaXMuX2JvZHlUb1N0cmluZykge1xcXFxuICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5ib2R5KTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB2YXIgcmVzID0gSlNPTi5wYXJzZSh0aGlzLnN0YXJ0UmVxdWVzdCh0aGlzLmJ1aWxkUGFyYW0/YnVpbGRVcmwodGhpcy51cmwsIHRoaXMuYnVpbGRQYXJhbSk6dGhpcy51cmwsIG9wdGlvbnMpKTtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPD0gMzAwKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGJvZHkgPSByZXMuYm9keTtcXFxcbiAgICAgICAgICAgICAgICBpZiAodG9Kc29uKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdWNjZXNzQ2FsbGJhY2soYm9keSwgcmVzKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFN0cmluZyhyZXMuc3RhdHVzQ29kZSkpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcXFxcbiAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgZXJyID0gdGhpcy5lcnJvclR5cGVDYWxsYmFjayhlcnIsIHJlcyk7XFxcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG5cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmICh0aGlzLnJldHJ5Q291bnQpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdHJ5UmVzdWx0ID0gdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5KGVyciwgcmVzLCB0aGlzKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAodHJ5UmVzdWx0KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudC0tO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydCh0b0pzb24pO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yQ2FsbGJhY2soZXJyLCByZXMpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JDYWxsYmFjayhlcnIsIHJlcyk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIHNldE9wdGlvbnMob3B0aW9ucykge1xcXFxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XFxcXG4gICAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBtZXJnZUhlYWRBbmRCb2R5KG9wdGlvbnMpIHtcXFxcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XFxcXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRpb25zLmhlYWRlcnN8fHt9LCBvcHRpb25zLmhlYWRlcnMpO1xcXFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5ib2R5ID09PSBcXFxcXFxcIm9iamVjdFxcXFxcXFwiICYmIHR5cGVvZiBvcHRpb25zLmJvZHkgPT09IFxcXFxcXFwib2JqZWN0XFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRpb25zLmJvZHl8fHt9LCBvcHRpb25zLmJvZHkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5idWlsZFVybCA9PT0gXFxcXFxcXCJvYmplY3RcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmJ1aWxkUGFyYW18fHt9LCBvcHRpb25zLmJ1aWxkVXJsKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuT2JqZWN0LmFzc2lnbihodHRwUmVxdWVzdCwge1xcXFxuICAgIGZldGNoKHVybCwgb3B0aW9ucykge1xcXFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucyk7XFxcXG4gICAgfSxcXFxcbiAgICBwb3N0KHVybCwgb3B0aW9ucykge1xcXFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KTtcXFxcbiAgICB9LFxcXFxuICAgIHJlcXVlc3QodXJsLCBvcHRpb25zKSB7XFxcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKHJlcXVlc3QpO1xcXFxuICAgIH0sXFxcXG4gICAgcG9zdFJlcXVlc3QodXJsLCBvcHRpb25zKSB7XFxcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3RSZXF1ZXN0KTtcXFxcbiAgICB9LFxcXFxuICAgIGZldGNoQ29va2llKHVybCwgb3B0aW9ucykge1xcXFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhmZXRjaENvb2tpZSk7XFxcXG4gICAgfVxcXFxufSk7XFxcXG4kLmV4cG9ydHMgPSBodHRwUmVxdWVzdDtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlpLjlhYvliJfooahcXFwiLFxcXCJwYXRoXFxcIjpcXFwicXVhcmtMaXN0XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGQgPSBbXTtcXFxcblxcXFxuYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcXFxcXCJwbGF5VXJsQ2FjaGVcXFxcXFxcIikpO1xcXFxuYWRkTGlzdGVuZXIoXFxcXFxcXCJvblJlZnJlc2hcXFxcXFxcIiwgKCkgPT4gY2xlYXJNeVZhcihcXFxcXFxcInBsYXlVcmxDYWNoZVxcXFxcXFwiKSk7XFxcXG5sZXQgc29VcmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJyZWFsdXJsXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpKTtcXFxcbmxldCBmcm9tRHJpdmUgPSBNWV9QQVJBTVMuZnJvbURyaXZlIHx8IFxcXFxcXFwicXVhcmtcXFxcXFxcIjtcXFxcblxcXFxuaWYgKHNvVXJsLmluY2x1ZGVzKFxcXFxcXFwiZHJpdmUudWMuY25cXFxcXFxcIikpIHtcXFxcbiAgICBmcm9tRHJpdmUgPSBcXFxcXFxcInVjXFxcXFxcXCI7XFxcXG59XFxcXG5sZXQgcmVhbHVybCA9IHNvVXJsLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVswXTtcXFxcbmxldCB1cmxEYXRhID0gcmVhbHVybC5zcGxpdChcXFxcXFxcIi9cXFxcXFxcIik7XFxcXG5cXFxcbmxldCBzaGFyZUlkID0gTVlfUEFSQU1TLnNoYXJlSWQgfHwgdXJsRGF0YVs0XS5yZXBsYWNlKFxcXFxcXFwiI1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmxldCBzaGFyZVB3ZCA9IGdldFBhcmFtKFxcXFxcXFwic2hhcmVQd2RcXFxcXFxcIiwgTVlfUEFSQU1TLnNoYXJlUHdkIHx8IGdldFBhcmFtKFxcXFxcXFwicGFzc2NvZGVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiwgc29VcmwpIHx8IFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxubGV0IHNoYXJlVG9rZW4gPSBnZXRQYXJhbShcXFxcXFxcInNoYXJlVG9rZW5cXFxcXFxcIiwgTVlfUEFSQU1TLnNoYXJlVG9rZW4gfHwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5cXFxcbmxldCBmaWxlSWQgPSBNWV9QQVJBTVMuZmlsZUlkO1xcXFxuXFxcXG5sZXQgc29ydCA9IHtcXFxcbiAgICBcXFxcXFxcIuWQjeensOato+W6j1xcXFxcXFwiOiBcXFxcXFxcImZpbGVfbmFtZTphc2NcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcIuWQjeensOWAkuW6j1xcXFxcXFwiOiBcXFxcXFxcImZpbGVfbmFtZTpkZXNjXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCLml7bpl7TmraPluo9cXFxcXFxcIjogXFxcXFxcXCJ1cGRhdGVkX2F0OmFzY1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwi5pe26Ze05YCS5bqPXFxcXFxcXCI6IFxcXFxcXFwidXBkYXRlZF9hdDpkZXNjXFxcXFxcXCJcXFxcbn07XFxcXG5sZXQgc3R5bGVzID0gW1xcXFxcXFwidGV4dF8xXFxcXFxcXCIsIFxcXFxcXFwiYXZhdGFyXFxcXFxcXCJdO1xcXFxuXFxcXG5sZXQgc29ydFZhbHVlID0gc29ydFtnZXRJdGVtKFxcXFxcXFwic29ydEtleVxcXFxcXFwiLCBcXFxcXFxcIuWQjeensOato+W6j1xcXFxcXFwiKV07XFxcXG5sZXQgc3R5bGUgPSBnZXRJdGVtKFxcXFxcXFwic3R5bGVcXFxcXFxcIiwgc3R5bGVzWzBdKTtcXFxcbmlmIChNWV9QQUdFID09IDEpIHtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogZnJvbURyaXZlID09PSBcXFxcXFxcInVjXFxcXFxcXCIgPyBcXFxcXFxcIlVD572R55uYXFxcXFxcXCIgOiBcXFxcXFxcIuWkuOWFi+e9keebmFxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uXzVcXFxcXFxcIixcXFxcbiAgICAgICAgcGljX3VybDogZnJvbURyaXZlID09PSBcXFxcXFxcInVjXFxcXFxcXCIgPyBcXFxcXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS90dWJpYW8vZXJkaS8xNC5wbmdcXFxcXFxcIiA6IFxcXFxcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9rdWFrZVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCLngrnlh7vlip/og73mjInpkq49PuS4quS6uui0puWPt+euoeeQhuWNs+WPr+eZu+W9lei0puWPt1xcXFxcXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogc3R5bGUsXFxcXG4gICAgICAgIHVybDogJChzdHlsZXMsIDEsICfor7fpgInmi6knKS5zZWxlY3QoKCkgPT4ge1xcXFxuICAgICAgICAgICAgc2V0SXRlbSgnc3R5bGUnLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgcGljX3VybDogXFxcXFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvaW1nL2FsaV9pY29uLnN2Z1xcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uXzVcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBnZXRJdGVtKFxcXFxcXFwic29ydEtleVxcXFxcXFwiLCBcXFxcXFxcIuWQjeensOato+W6j1xcXFxcXFwiKSxcXFxcbiAgICAgICAgdXJsOiAkKE9iamVjdC5rZXlzKHNvcnQpLCAxLCAn6K+36YCJ5oupJykuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJzb3J0S2V5XFxcXFxcXCIsIGlucHV0KVxcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfc29ydC5zdmdcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl81XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogZ2V0SXRlbShcXFxcXFxcInF1YXJrX3BsYXlNb2RlXFxcXFxcXCIsIFxcXFxcXFwi6L2s56CBXFxcXFxcXCIpLFxcXFxuICAgICAgICB1cmw6ICQoW1xcXFxcXFwi6L2s56CBXFxcXFxcXCIsIFxcXFxcXFwi5Y6f55S7XFxcXFxcXCIsIFxcXFxcXFwi5pmu6YCa5Y6f55S7XFxcXFxcXCIsIFxcXFxcXFwiY3VybFxcXFxcXFwiLCBcXFxcXFxcImFyaWEyXFxcXFxcXCIsIFxcXFxcXFwiUlBDXFxcXFxcXCJdLCAyLCBcXFxcXFxcIuaSreaUvuaooeW8j1xcXFxcXFwiKS5zZWxlY3QoKCkgPT4ge1xcXFxuICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInF1YXJrX3BsYXlNb2RlXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIh+aNouaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl81XFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfcGxheS5zdmdcXFxcXFxcIixcXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlip/og71cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFtcXFxcXFxcIui3s+i9rOWkuOWFi0FQUFxcXFxcXFwiLCBcXFxcXFxcIuWkjeWItuWIhuS6q+mTvuaOpVxcXFxcXFwiLCBcXFxcXFxcIuS4quS6uui0puWPt+euoeeQhlxcXFxcXFwiLCBcXFxcXFxcIuWOn+eUu+S4i+i9vee6v+eoi1xcXFxcXFwiLCBcXFxcXFxcIuiuvue9rlJQQ1xcXFxcXFwiXSwgMikuc2VsZWN0KChzaGFyZUlkLCBzaGFyZVB3ZCwgZnJvbURyaXZlKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXFxcXFwi6Lez6L2s5aS45YWLQVBQXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJxa2xpbms6Ly93d3cudWMuY24vYjIwYjg0ZmQ3MzVhOGRkM2Y3NTQxMTI5YmFjYzRlOWE/YWN0aW9uPW9wZW5fdXJsJnVybD1odHRwczovL3Bhbi5xdWFyay5jbi9zL1xcXFxcXFwiICsgc2hhcmVJZDtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5Liq5Lq66LSm5Y+3566h55CGXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXFxcXFwiYWNjb3VudFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5Y6f55S75LiL6L2957q/56iLXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXFxcXFwic3BlZWRUaHJlYWRcXFxcXFxcIiwgXFxcXFxcXCIxMFxcXFxcXFwiKSwgXFxcXFxcXCLor7fovpPlhaUzLTMy5LmL6Ze055qE5pW05pWwXFxcXFxcXCIpLmlucHV0KCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwZWVkVGhyZWFkID0gcGFyc2VJbnQoaW5wdXQpO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoc3BlZWRUaHJlYWQgPCAzIHx8IHNwZWVkVGhyZWFkID4gMzIpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6K6+572u5LiN5ZCI5rOVXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInNwZWVkVGhyZWFkXFxcXFxcXCIsIFN0cmluZyhzcGVlZFRocmVhZCkpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIGlmIChmcm9tRHJpdmUgPT09IFxcXFxcXFwidWNcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIgKyBidWlsZFVybChcXFxcXFxcImh0dHBzOi8vZHJpdmUudWMuY24vcy9cXFxcXFxcIiArIHNoYXJlSWQgKyBcXFxcXFxcIj9wdWJsaWM9MSMvbGlzdC9zaGFyZVxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2RcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiY29weTovL1xcXFxcXFwiICsgYnVpbGRVcmwoXFxcXFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9zL1xcXFxcXFwiICsgc2hhcmVJZCwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2NvZGU6IHNoYXJlUHdkXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi6K6+572uUlBDXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJChbXFxcXFxcXCLorr7nva5SUEPlnLDlnYBcXFxcXFxcIiwgXFxcXFxcXCLorr7nva5Ub2tlblxcXFxcXFwiLCBcXFxcXFxcIuS4i+i9veebruW9lVxcXFxcXFwiXSkuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIuiuvue9rlJQQ+WcsOWdgFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb3duVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcIkRvd25Ub29sXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoZ2V0SXRlbShcXFxcXFxcInJwY1VybFxcXFxcXFwiLCBEb3duVG9vbC5nZXREZWZScGNVcmwoKSksIFxcXFxcXFwiUlBD5Zyw5Z2ALOS4uuepuuiHquWKqOiOt+WPluWxgOWfn+e9keWcsOWdgFxcXFxcXFwiKS5pbnB1dCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJycGNVcmxcXFxcXFxcIiwgaW5wdXQpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySXRlbShcXFxcXFxcInJwY1VybFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/muIXpmaTorr7nva5cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLorr7nva5Ub2tlblxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXFxcXFwicnBjQXJpYVRva2VuXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLCBcXFxcXFxcIlRva2VuLOayoeacieWwseS4jeWhq1xcXFxcXFwiKS5pbnB1dCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInJwY0FyaWFUb2tlblxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKGdldEl0ZW0oXFxcXFxcXCJycGNEb3duRGlyXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLCBcXFxcXFxcIuS4i+i9veS/neWtmOebruW9lSzkuLrnqbrlsLHmjInkuIvovb3lmajpu5jorqTot6/lvoRcXFxcXFxcIikuaW5wdXQoKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJycGNEb3duRGlyXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgc2hhcmVJZCwgc2hhcmVQd2QsIGZyb21Ecml2ZSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fNVxcXFxcXFwiLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX2ZpbGVpbnRvLnN2Z1xcXFxcXFwiLFxcXFxuICAgIH0pO1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiAnbGluZV9ibGFuaydcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuXFxcXG5sZXQgUXVhcmtTaGFyZUFwaSA9ICQucmVxdWlyZShcXFxcXFxcIlF1YXJrU2hhcmVBcGlcXFxcXFxcIiwgZnJvbURyaXZlKTtcXFxcbmxldCBxdWFya1NoYXJlQXBpID0gbmV3IFF1YXJrU2hhcmVBcGkoc2hhcmVJZCwgc2hhcmVQd2QpLnNldFRva2VuKHNoYXJlVG9rZW4pLnNldFJlZnJlc2goKHNoYXJlVG9rZW4pID0+IHtcXFxcbiAgICBNWV9QQVJBTVMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW47XFxcXG4gICAgc2V0UGFnZVBhcmFtcyhNWV9QQVJBTVMpO1xcXFxufSk7XFxcXG5cXFxcbmZ1bmN0aW9uIGZvcm1hdFNpemUoc2l6ZSkge1xcXFxuICAgIGlmICghc2l6ZSkge1xcXFxuICAgICAgICByZXR1cm4gJyc7XFxcXG4gICAgfVxcXFxuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJywgJ1pCJywgJ1lCJ107XFxcXG4gICAgbGV0IGkgPSAwO1xcXFxuICAgIHdoaWxlIChzaXplID49IDEwMjQpIHtcXFxcbiAgICAgICAgc2l6ZSAvPSAxMDI0O1xcXFxuICAgICAgICBpKys7XFxcXG4gICAgfVxcXFxuICAgIHNpemUgPSBpID8gTnVtYmVyKHNpemUudG9GaXhlZCgyKSkgOiBzaXplO1xcXFxuICAgIHJldHVybiBgJHtzaXplfSAke3VuaXRzW2ldfWA7XFxcXG59XFxcXG5cXFxcbmxldCBzdWJFeHRzID0gW1xcXFxcXFwidnR0XFxcXFxcXCIsIFxcXFxcXFwic3J0XFxcXFxcXCIsIFxcXFxcXFwiYXNzXFxcXFxcXCJdO1xcXFxubGV0IHRpdGxlSGVhZCA9IHtcXFxcbiAgICB2aWRlbzogXFxcXFxcXCLwn46sXFxcXFxcXCIsXFxcXG4gICAgYXVkaW86IFxcXFxcXFwi8J+OtVxcXFxcXFwiLFxcXFxuICAgIGRvYzogXFxcXFxcXCLwn5ORXFxcXFxcXCIsXFxcXG4gICAgaW1hZ2U6IFxcXFxcXFwi8J+WvFxcXFxcXFwiLFxcXFxuICAgIGFyY2hpdmU6IFxcXFxcXFwi8J+TplxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGVmYXVsdFxcXFxcXFwiOiBcXFxcXFxcIuKdk1xcXFxcXFwiXFxcXG59O1xcXFxuXFxcXG5mdW5jdGlvbiBnZXRIZWFkKHR5cGUsIGV4dCkge1xcXFxuICAgIGxldCBoZWFkID0gdGl0bGVIZWFkW3R5cGVdO1xcXFxuXFxcXG4gICAgcmV0dXJuIGhlYWQgfHwgXFxcXFxcXCLinZNcXFxcXFxcIjtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0RG93blVybChmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4sIGNhdGVnb3J5LCBmcm9tRHJpdmUpIHtcXFxcblxcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXFxcXFwi5q2j5Zyo6I635Y+WLi4uXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgcGxheVVybENhY2hlID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcXFxcXCJwbGF5VXJsQ2FjaGVcXFxcXFxcIiwge30pO1xcXFxuICAgICAgICBpZiAocGxheVVybENhY2hlW2ZpZF0pIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBwbGF5VXJsQ2FjaGVbZmlkXTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGxldCB1cmwgPSAkLnJlcXVpcmUoXFxcXFxcXCJwbGF5XFxcXFxcXCIsIGZyb21Ecml2ZSkuZ2V0UGxheVVybChmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4sIGNhdGVnb3J5KTtcXFxcbiAgICAgICAgICAgIHBsYXlVcmxDYWNoZVtmaWRdID0gdXJsO1xcXFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcXFxcXCJwbGF5VXJsQ2FjaGVcXFxcXFxcIiwgcGxheVVybENhY2hlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiB1cmw7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9IGZpbmFsbHkge1xcXFxuICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgIH1cXFxcbn1cXFxcbnRyeSB7XFxcXG4gICAgdmFyIHJlcyA9IHF1YXJrU2hhcmVBcGkuZ2V0TGlzdEZpbGUoZmlsZUlkLCBNWV9QQUdFLCBzb3J0VmFsdWUpO1xcXFxuICAgIC8v6K6+572u5qCH6aKYXFxcXG4gICAgdmFyIGxpc3QgPSByZXMuZGF0YS5saXN0IHx8IFtdO1xcXFxuICAgIGlmIChzaGFyZUlkICE9PSBcXFxcXFxcInNlbGZcXFxcXFxcIikge1xcXFxuICAgICAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcXFxuXFxcXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCAmJiAhZmlsZUlkKSB7XFxcXG4gICAgICAgICAgICByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKHJlcy5kYXRhLnNoYXJlLmZpcnN0X2ZpZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXFxcbiAgICAgICAgICAgIHNldFBhZ2VUaXRsZShyZXMuZGF0YS5zaGFyZS50aXRsZSk7XFxcXG4gICAgICAgICAgICB2YXIgbGlzdCA9IHJlcy5kYXRhLmxpc3QgfHwgW107XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgbGV0IG5jb29raWUgPSBxdWFya1NoYXJlQXBpLmdldFBpY0Nvb2tpZSgpO1xcXFxuICAgIC8vbG9nKG5jb29raWUpXFxcXG4gICAgbGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xcXFxuICAgICAgICAvL+WIpOaWreaYr+WQpuaWh+S7tuWkuVxcXFxuICAgICAgICBpZiAoaXRlbS5kaXIpIHtcXFxcbiAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi8J+TglxcXFxcXFwiICsgaXRlbS5maWxlX25hbWUsXFxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBpdGVtLmluY2x1ZGVfaXRlbXMgKyAn6aG5ICAnLFxcXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L3R1Ymlhby9tZXNzeS8yNy5zdmdcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3F1YXJrTGlzdD9wYWdlPWZ5cGFnZVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBzdHlsZSxcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZUlkLFxcXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLFxcXFxuICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IGl0ZW0uZmlkLFxcXFxuICAgICAgICAgICAgICAgICAgICBpbmhlcml0VGl0bGU6IGZhbHNlLFxcXFxuICAgICAgICAgICAgICAgICAgICBmcm9tRHJpdmVcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGdldEhlYWQoaXRlbS5vYmpfY2F0ZWdvcnkpICsgaXRlbS5maWxlX25hbWUsXFxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBmb3JtYXRTaXplKGl0ZW0uc2l6ZSksXFxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogJChpdGVtLnRodW1ibmFpbCwge1xcXFxuICAgICAgICAgICAgICAgICAgICBjb29raWU6IG5jb29raWVcXFxcbiAgICAgICAgICAgICAgICB9KS5pbWFnZSgpLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKGdldERvd25VcmwsIGl0ZW0uZmlkLCBpdGVtLnNoYXJlX2ZpZF90b2tlbiwgc2hhcmVJZCwgcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLCBpdGVtLm9ial9jYXRlZ29yeSwgZnJvbURyaXZlKSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGl0ZW0uZmlkLFxcXFxuICAgICAgICAgICAgICAgICAgICAvL2luaGVyaXRUaXRsZTogZmFsc2UsXFxcXG5cXFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiAncGxheWxpc3QgJyArIGl0ZW0ub2JqX2NhdGVnb3J5XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgfSk7XFxcXG59IGNhdGNoIChlKSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGUubWVzc2FnZSxcXFxcbiAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGlmIChlLm1lc3NhZ2UuaW5jbHVkZXMoXFxcXFxcXCLmj5Dlj5bnoIFcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIui+k+WFpeaPkOWPlueggVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiAkKCkuaW5wdXQoKE1ZX1BBUkFNUykgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHNldFBhZ2VQYXJhbXMoT2JqZWN0LmFzc2lnbih7fSwgTVlfUEFSQU1TLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBpbnB1dFxcXFxuICAgICAgICAgICAgICAgIH0pKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgfSwgTVlfUEFSQU1TKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG5zZXRSZXN1bHQoZCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwicGxheVxcXCIsXFxcInBhdGhcXFwiOlxcXCJwbGF5XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGZyb21Ecml2ZSA9IG1vZHVsZS5pbXBvcnRQYXJhbTtcXFxcbmxldCBwciwgaG9tZVVybCwgYXBpLCBjb29raWU7XFxcXG5pZiAoZnJvbURyaXZlID09PSBcXFxcXFxcInVjXFxcXFxcXCIpIHtcXFxcbiAgICBob21lVXJsID0gXFxcXFxcXCJodHRwczovL2RyaXZlLnVjLmNuL1xcXFxcXFwiO1xcXFxuICAgIHByID0gXFxcXFxcXCJVQ0Jyb3dzZXJcXFxcXFxcIjtcXFxcbiAgICBhcGkgPSBcXFxcXFxcImh0dHBzOi8vcGMtYXBpLnVjLmNuXFxcXFxcXCI7XFxcXG4gICAgY29va2llID0gZ2V0SXRlbShcXFxcXFxcInVjQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxufSBlbHNlIHtcXFxcbiAgICBob21lVXJsID0gXFxcXFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuL1xcXFxcXFwiO1xcXFxuICAgIHByID0gXFxcXFxcXCJ1Y3Byb1xcXFxcXFwiO1xcXFxuICAgIGFwaSA9IFxcXFxcXFwiaHR0cHM6Ly9kcml2ZS5xdWFyay5jblxcXFxcXFwiO1xcXFxuICAgIGNvb2tpZSA9IGdldEl0ZW0oXFxcXFxcXCJxdWFya0Nvb2tpZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbn1cXFxcblxcXFxubGV0IENvb2tpZU1hbmFnZSA9ICQucmVxdWlyZShcXFxcXFxcIkNvb2tpZU1hbmFnZVxcXFxcXFwiKTtcXFxcblxcXFxuY29uc3QgY29va2llTWFuYWdlID0gbmV3IENvb2tpZU1hbmFnZShjb29raWUpO1xcXFxubGV0IGh0dHBSZXF1ZXN0ID0gJC5yZXF1aXJlKFxcXFxcXFwiaHR0cFJlcXVlc3RcXFxcXFxcIik7XFxcXG5cXFxcbmZ1bmN0aW9uIHdhaXRTbGVlcCh0aW1lKSB7XFxcXG4gICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCh0aW1lIHx8IDYwMCk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHJlcXVlc3RIdHRwKHVybCkge1xcXFxuICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsKVxcXFxuICAgICAgICAuc3VjY2VzcygoYm9keSwgcmVzKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoYm9keS5zdGF0dXMgIT09IDIwMCkge1xcXFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5Lm1lc3NhZ2UpO1xcXFxuICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICBjb29raWVNYW5hZ2UuYWRkKHJlcy5oZWFkZXJzW1xcXFxcXFwic2V0LWNvb2tpZVxcXFxcXFwiXSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gYm9keTtcXFxcbiAgICAgICAgfSlcXFxcbiAgICAgICAgLmVycm9yVHlwZSgoZXJyLCByZXMpID0+IHtcXFxcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5wYXJzZShyZXMuYm9keSkubWVzc2FnZSk7XFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIC5ib2R5VG9TdHJpbmcodHJ1ZSlcXFxcbiAgICAgICAgLmhlYWRlcnMoe1xcXFxuICAgICAgICAgICAgY29va2llOiBjb29raWVNYW5hZ2UuZ2V0KCksXFxcXG4gICAgICAgICAgICBcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogXFxcXFxcXCJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBxdWFyay1jbG91ZC1kcml2ZS8yLjUuMjAgQ2hyb21lLzEwMC4wLjQ4OTYuMTYwIEVsZWN0cm9uLzE4LjMuNS40LWI0Nzg0OTExMDAgU2FmYXJpLzUzNy4zNiBDaGFubmVsL3Bja2tfb3RoZXJfY2hcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicmVmZXJlclxcXFxcXFwiOiBob21lVXJsXFxcXG4gICAgICAgIH0pO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXREcml2ZUluZm8oKSB7XFxcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKGFwaSArIFxcXFxcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2UvZGlyP3ByPVxcXFxcXFwiICsgcHIgKyBcXFxcXFxcIiZmcj1wYyZhdmVyPTFcXFxcXFxcIikuc3RhcnQodHJ1ZSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGNyZWF0ZVNhdmVUYXNrKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbikge1xcXFxuICAgIGxldCBkcml2ZUluZm8gPSBnZXREcml2ZUluZm8oKTtcXFxcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoYXBpICsgXFxcXFxcXCIvMS9jbG91ZGRyaXZlL3NoYXJlL3NoYXJlcGFnZS9zYXZlP3ByPVxcXFxcXFwiICsgcHIgKyBcXFxcXFxcIiZmcj1wY1xcXFxcXFwiKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpLmJvZHkoe1xcXFxuICAgICAgICBcXFxcXFxcImZpZF9saXN0XFxcXFxcXCI6IFtcXFxcbiAgICAgICAgICAgIGZpZFxcXFxuICAgICAgICBdLFxcXFxuICAgICAgICBcXFxcXFxcImZpZF90b2tlbl9saXN0XFxcXFxcXCI6IFtcXFxcbiAgICAgICAgICAgIGZpZF90b2tlblxcXFxuICAgICAgICBdLFxcXFxuICAgICAgICBcXFxcXFxcInRvX3BkaXJfZmlkXFxcXFxcXCI6IGRyaXZlSW5mby5kYXRhLmRpci5maWQsXFxcXG4gICAgICAgIFxcXFxcXFwicHdkX2lkXFxcXFxcXCI6IHB3ZF9pZCxcXFxcbiAgICAgICAgXFxcXFxcXCJzdG9rZW5cXFxcXFxcIjogc3Rva2VuLFxcXFxuICAgICAgICBcXFxcXFxcInBkaXJfZmlkXFxcXFxcXCI6IGRyaXZlSW5mby5kYXRhLmRpci5wZGlyX2ZpZFxcXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBjcmVhdGVEZWxldGVUYXNrKGZpZCkge1xcXFxuICAgIGxldCBkcml2ZUluZm8gPSBnZXREcml2ZUluZm8oKTtcXFxcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoYXBpICsgXFxcXFxcXCIvMS9jbG91ZGRyaXZlL2ZpbGUvZGVsZXRlP3ByPVxcXFxcXFwiICsgcHIgKyBcXFxcXFxcIiZmcj1wY1xcXFxcXFwiKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpLmJvZHkoe1xcXFxuICAgICAgICBcXFxcXFxcImFjdGlvbl90eXBlXFxcXFxcXCI6IDIsXFxcXG4gICAgICAgIFxcXFxcXFwiZmlsZWxpc3RcXFxcXFxcIjogW1xcXFxuICAgICAgICAgICAgZmlkXFxcXG4gICAgICAgIF0sXFxcXG4gICAgICAgIFxcXFxcXFwiZXhjbHVkZV9maWRzXFxcXFxcXCI6IFtdXFxcXG4gICAgfSkuc3RhcnQodHJ1ZSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHRhc2sodGFza19pZCwgcmV0cnlfaW5kZXgpIHtcXFxcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoYXBpICsgXFxcXFxcXCIvMS9jbG91ZGRyaXZlL3Rhc2tcXFxcXFxcIikuYnVpbGRVcmwoe1xcXFxuICAgICAgICBwcjogcHIsXFxcXG4gICAgICAgIGZyOiBcXFxcXFxcInBjXFxcXFxcXCIsXFxcXG4gICAgICAgIHRhc2tfaWQ6IHRhc2tfaWQsXFxcXG4gICAgICAgIHJldHJ5X2luZGV4OiByZXRyeV9pbmRleFxcXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBxdWVyeVRhc2sodGFza19pZCkge1xcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgOTsgaSsrKSB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgcmVzID0gdGFzayh0YXNrX2lkLCBpICsgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAocmVzLmRhdGEuc3RhdHVzID09PSAyKSB7XFxcXG4gICAgICAgICAgICAgICAgd2FpdFNsZWVwKDEwMDApO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiByZXMuZGF0YS5zYXZlX2FzLnNhdmVfYXNfdG9wX2ZpZHNbMF07XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB3YWl0U2xlZXAoMzAwICogKGkgKyAxKSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiB2b2lkKDApO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBxdWVyeVRhc2tTdGF0dXModGFza19pZCkge1xcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgcmVzID0gdGFzayh0YXNrX2lkLCBpICsgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAocmVzLmRhdGEuc3RhdHVzID09PSAyKSB7XFxcXG4gICAgICAgICAgICAgICAgd2FpdFNsZWVwKDEwMDApO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgd2FpdFNsZWVwKDMwMCk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBmYWxzZTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0UHJldmlld1ZpZGVvKGZpZCkge1xcXFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFxcXFxcIi8xL2Nsb3VkZHJpdmUvZmlsZS92Mi9wbGF5P3ByPVxcXFxcXFwiICsgcHIgKyBcXFxcXFxcIiZmcj1wY1xcXFxcXFwiKS5ib2R5KHtcXFxcbiAgICAgICAgXFxcXFxcXCJmaWRcXFxcXFxcIjogZmlkLFxcXFxuICAgICAgICBcXFxcXFxcInJlc29sdXRpb25zXFxcXFxcXCI6IFxcXFxcXFwibm9ybWFsLGxvdyxoaWdoLHN1cGVyLDJrLDRrXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic3VwcG9ydHNcXFxcXFxcIjogXFxcXFxcXCJmbXA0LG0zdThcXFxcXFxcIlxcXFxuICAgIH0pLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxcXG59XFxcXG5cXFxcblxcXFxuZnVuY3Rpb24gZ2V0RG93bmxvYWRVcmwoZmlkKSB7XFxcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKGFwaSArIFxcXFxcXFwiLzEvY2xvdWRkcml2ZS9maWxlL2Rvd25sb2FkP3ByPVxcXFxcXFwiICsgcHIgKyBcXFxcXFxcIiZmcj1wY1xcXFxcXFwiKS5ib2R5KHtcXFxcbiAgICAgICAgXFxcXFxcXCJmaWRzXFxcXFxcXCI6IFtmaWRdXFxcXG4gICAgfSkuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5zdGFydCh0cnVlKTtcXFxcbn1cXFxcblxcXFxuXFxcXG5jb25zdCBEb3duVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcIkRvd25Ub29sXFxcXFxcXCIpO1xcXFxuXFxcXG5mdW5jdGlvbiBnZXRQbGF5VXJsKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbiwgY2F0ZWdvcnksIGlzZ2V0Y3VybCkge1xcXFxuICAgIGxldCBpc1NoYXJlID0gcHdkX2lkICE9PSBcXFxcXFxcInNlbGZcXFxcXFxcIjtcXFxcbiAgICBcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBpZiAoIWNvb2tpZSkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/or7fnmbvlvZXotKblj7dcXFxcXFxcIjtcXFxcbiAgICAgICAgbGV0IGFzZmlkID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgaWYgKGlzU2hhcmUpIHtcXFxcbiAgICAgICAgICAgIGxldCB0YXNrSWQgPSBjcmVhdGVTYXZlVGFzayhmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4pLmRhdGEudGFza19pZDtcXFxcbiAgICAgICAgICAgIGFzZmlkID0gcXVlcnlUYXNrKHRhc2tJZCk7XFxcXG4gICAgICAgICAgICBpZiAoIWFzZmlkKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGFzZmlkID0gZmlkO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBwbGF5Q29va2llID0gY29va2llTWFuYWdlLmdldCgpO1xcXFxuICAgICAgICAvKmlmIChwciA9PT0gXFxcXFxcXCJVQ0Jyb3dzZXJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcGxheUNvb2tpZSA9IGNvb2tpZTtcXFxcbiAgICAgICAgfSovXFxcXG4gICAgICAgIGxldCBwbGF5SGVhZGVyID0ge1xcXFxuICAgICAgICAgICAgUmVmZXJlcjogaG9tZVVybCxcXFxcbiAgICAgICAgICAgIGNvb2tpZTogcGxheUNvb2tpZSxcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBcXFxcXFxcIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS8xMDAuMC40ODk2LjU4IFVDQnJvd3Nlci8xNi41LjguMTMwOSBNb2JpbGUgU2FmYXJpLzUzNy4zNlxcXFxcXFwiXFxcXG4gICAgICAgIH07XFxcXG4gICAgICAgIC8qbGV0IHBsYXlIZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgcGxheUhlYWRlciwge1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6IFxcXFxcXFwiTG9nU3RhdGlzdGljXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7Ki9cXFxcbiAgICAgICAgbGV0IGNoZWNrU2hhcmU9KCk9Pihpc1NoYXJlICYmIGNyZWF0ZURlbGV0ZVRhc2soYXNmaWQpKXx8KHBsYXlIZWFkZXIuY29va2llPWNvb2tpZU1hbmFnZS5nZXQoKSk7XFxcXG4gICAgICAgIGxldCBwbGF5TW9kZSA9IGdldEl0ZW0oXFxcXFxcXCJxdWFya19wbGF5TW9kZVxcXFxcXFwiLCBcXFxcXFxcIui9rOeggVxcXFxcXFwiKTtcXFxcbiAgICAgICAgaWYgKHBsYXlNb2RlID09PSBcXFxcXFxcIlJQQ1xcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBsZXQgZG93bkluZm8gPSBnZXREb3dubG9hZFVybChhc2ZpZCkuZGF0YVswXTtcXFxcbiAgICAgICAgICAgIGxldCBkb3dubG9hZF91cmwgPSBkb3duSW5mby5kb3dubG9hZF91cmw7XFxcXG4gICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBkb3duSW5mby5maWxlX25hbWU7XFxcXG4gICAgICAgICAgICBjaGVja1NoYXJlKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gRG93blRvb2wudXBkYXRlUnBjKGRvd25sb2FkX3VybCwgcGxheUhlYWRlciwgZmlsZW5hbWUpID8gXFxcXFxcXCJ0b2FzdDovL+WIm+W7uuaIkOWKn1xcXFxcXFwiIDogXFxcXFxcXCJ0b2FzdDovL+WIm+W7uuWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgLy9yZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3suaOqOmAgVxcXFxcXFwiO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKFtcXFxcXFxcImN1cmxcXFxcXFxcIiwgXFxcXFxcXCJhcmlhMlxcXFxcXFwiXS5pbmNsdWRlcyhwbGF5TW9kZSkpIHtcXFxcbiAgICAgICAgICAgIGxldCBkb3duSW5mbyA9IGdldERvd25sb2FkVXJsKGFzZmlkKS5kYXRhWzBdO1xcXFxuICAgICAgICAgICAgbGV0IGRvd25sb2FkX3VybCA9IGRvd25JbmZvLmRvd25sb2FkX3VybDtcXFxcbiAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IGRvd25JbmZvLmZpbGVfbmFtZTtcXFxcbiAgICAgICAgICAgIGNoZWNrU2hhcmUoKVxcXFxuICAgICAgICAgICAgbGV0IGNubWQgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgaWYgKHBsYXlNb2RlID09PSBcXFxcXFxcImN1cmxcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIGNubWQgPSBEb3duVG9vbC5nZXREb3duQ1VSTChkb3dubG9hZF91cmwsIHBsYXlIZWFkZXIsIGZpbGVuYW1lKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgY25tZCA9IERvd25Ub29sLmdldERvd25BcmlhMmMoZG93bmxvYWRfdXJsLCBwbGF5SGVhZGVyLCBmaWxlbmFtZSwgTnVtYmVyKGdldEl0ZW0oXFxcXFxcXCJzcGVlZFRocmVhZFxcXFxcXFwiLCBcXFxcXFxcIjEwXFxcXFxcXCIpKSk7XFxcXG4gICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgIGxldCBwYXRoID0gXFxcXFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9cXFxcXFxcIiArIGZpbGVuYW1lICsgXFxcXFxcXCIoXFxcXFxcXCIgKyBwbGF5TW9kZSArIFxcXFxcXFwiKS50eHRcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShwYXRoLCBjbm1kKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInNoYXJlOi8vXFxcXFxcXCIgKyBwYXRoO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKGNhdGVnb3J5ID09IFxcXFxcXFwidmlkZW9cXFxcXFxcIikge1xcXFxuXFxcXG4gICAgICAgICAgICBpZiAocGxheU1vZGUgPT09IFxcXFxcXFwi6L2s56CBXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdmlkZW9SZXMgPSBnZXRQcmV2aWV3VmlkZW8oYXNmaWQpO1xcXFxuICAgICAgICAgICAgICAgIGNoZWNrU2hhcmUoKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdmlkZW9MaXN0ID0gdmlkZW9SZXMuZGF0YS52aWRlb19saXN0O1xcXFxuICAgICAgICAgICAgICAgIGxldCBwbGF5TGlzdCA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXM6IFtdLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmxzOiBbXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogW11cXFxcbiAgICAgICAgICAgICAgICB9OyAgICAgICAgICAgICAgICBcXFxcbiAgICAgICAgICAgICAgICB2aWRlb0xpc3QuZmlsdGVyKHYgPT4gdi5hY2Nlc3NhYmxlKS5mb3JFYWNoKHYgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBwbGF5TGlzdC5uYW1lcy5wdXNoKHYucmVzb2x1dGlvbik7XFxcXG4gICAgICAgICAgICAgICAgICAgIHBsYXlMaXN0LnVybHMucHVzaCh2LnZpZGVvX2luZm8udXJsICsgXFxcXFxcXCIjaXNWaWRlbz10cnVlI1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcGxheUxpc3QuaGVhZGVycy5wdXNoKHBsYXlIZWFkZXIpO1xcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIFxcXFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5TGlzdCk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuXFxcXG4gICAgICAgICAgICAgICAgbGV0IHBsYXlVcmwgPSBnZXREb3dubG9hZFVybChhc2ZpZCkuZGF0YVswXS5kb3dubG9hZF91cmw7XFxcXG4gICAgICAgICAgICAgICAgY2hlY2tTaGFyZSgpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBwbGF5TGlzdCA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXM6IFtwbGF5TW9kZV0sXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybHM6IFtwbGF5VXJsICsgXFxcXFxcXCIjaXNWaWRlbz10cnVlI1xcXFxcXFwiICsgKHBsYXlNb2RlID09PSBcXFxcXFxcIuWOn+eUu1xcXFxcXFwiID8gXFxcXFxcXCIjZmFzdFBsYXlNb2RlIyN0aHJlYWRzPVxcXFxcXFwiICsgZ2V0SXRlbShcXFxcXFxcInNwZWVkVGhyZWFkXFxcXFxcXCIsIFxcXFxcXFwiMTBcXFxcXFxcIikgKyBcXFxcXFxcIiNcXFxcXFxcIiA6IFxcXFxcXFwiXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogW3BsYXlIZWFkZXJdXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIFxcXFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5TGlzdCk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBsZXQgcGxheVVybCA9IGdldERvd25sb2FkVXJsKGFzZmlkKS5kYXRhWzBdLmRvd25sb2FkX3VybDtcXFxcblxcXFxuICAgICAgICAgICAgY2hlY2tTaGFyZSgpO1xcXFxuICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09PSAnYXVkaW8nKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHBsYXlMaXN0ID0ge1xcXFxuICAgICAgICAgICAgICAgICAgICBuYW1lczogW1xcXFxcXFwi6Z+z6aKRXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmxzOiBbcGxheVVybCArIFxcXFxcXFwiI2lzTXVzaWM9dHJ1ZSNcXFxcXFxcIl0sXFxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtwbGF5SGVhZGVyXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgbHlyaWM6IFxcXFxcXFwiXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkgPT09ICdpbWFnZScpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJChwbGF5VXJsLCBwbGF5SGVhZGVyKS5pbWFnZSgpO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICBwbGF5SGVhZGVyID0gT2JqZWN0LmtleXMocGxheUhlYWRlcikubWFwKGtleSA9PiBrZXkgKyBcXFxcXFxcIkBcXFxcXFxcIiArIFN0cmluZyhwbGF5SGVhZGVyW2tleV0pLnJlcGxhY2UoLzsvZywgXFxcXFxcXCLvvJvvvJtcXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImRvd25sb2FkOi8vXFxcXFxcXCIgKyBwbGF5VXJsICsgXFxcXFxcXCI7e1xcXFxcXFwiICsgcGxheUhlYWRlci5qb2luKFxcXFxcXFwiJiZcXFxcXFxcIikgKyBcXFxcXFxcIn1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcyhcXFxcXFxcInJlcXVpcmUgbG9naW5cXFxcXFxcIikgfHwgZS5tZXNzYWdlLmluY2x1ZGVzKFxcXFxcXFwidG9rZW5cXFxcXFxcIikgfHwgZS5tZXNzYWdlLmluY2x1ZGVzKFxcXFxcXFwiaW52YWxpZFxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgdG9hc3QoXFxcXFxcXCLmnKrnmbvlvZXmiJbnmbvlvZXov4fmnJ/vvIzor7fph43mlrDnmbvlvZVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2Zyb209XFxcXFxcXCIgKyBmcm9tRHJpdmU7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIGUudG9TdHJpbmcoKTtcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbiQuZXhwb3J0cyA9IHtcXFxcbiAgICBnZXRQbGF5VXJsXFxcXG59O1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIueZu+W9lei0puWPt1xcXCIsXFxcInBhdGhcXFwiOlxcXCJsb2dpblxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBkID0gW107XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLnmbvlvZXotKblj7dcXFxcXFxcIik7XFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgKCkgPT4gY2xlYXJNeVZhcihcXFxcXFxcImNvb2tpZVxcXFxcXFwiKSk7XFxcXG5sZXQgZnJvbT1nZXRQYXJhbShcXFxcXFxcImZyb21cXFxcXFxcIixcXFxcXFxcIlxcXFxcXFwiKTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLigJzigJznoa7orqTnmbvlvZXigJ3igJ1cXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoZnJvbSkgPT4ge1xcXFxuICAgICAgICAvL2xldCBjbSA9IGFuZHJvaWQud2Via2l0LkNvb2tpZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcXFxcbiAgICAgICAgLy9sZXQgY20gPSBjb20udGVuY2VudC5zbXR0LnNkay5Db29raWVNYW5hZ2VyLmdldEluc3RhbmNlKCk7XFxcXG4gICAgICAgIC8vbGV0IGNvb2tpZSA9IFN0cmluZyhjbS5nZXRDb29raWUoXFxcXFxcXCJodHRwczovL3Bhbi5xdWFyay5jblxcXFxcXFwiKSB8fCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGNvb2tpZSA9IGdldE15VmFyKFxcXFxcXFwiY29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoJC5yZXF1aXJlKFxcXFxcXFwidG9vbFxcXFxcXFwiKS5pc0xvZ2luQ29va2llKGNvb2tpZSkpIHtcXFxcbiAgICAgICAgICAgIGlmKGZyb209PT1cXFxcXFxcInVjXFxcXFxcXCIpe1xcXFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJ1Y0Nvb2tpZVxcXFxcXFwiLCBjb29raWUpO1xcXFxuICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIGNvb2tpZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+eZu+W9leaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pyq55m75b2VXFxcXFxcXCI7XFxcXG4gICAgfSwgZnJvbSksXFxcXG4gICAgZGVzYzogXFxcXFxcXCLigJzigJzigJ3igJ08c21hbGw+54K55Ye75aS05YOP5Y+v5Lul6YCA5Ye66LSm5Y+36YeN5paw55m75b2VPC9zbWFsbD5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxubGV0IGR1cmw9ZnJvbT09PVxcXFxcXFwidWNcXFxcXFxcIj9cXFxcXFxcImh0dHBzOi8vZHJpdmUudWMuY25cXFxcXFxcIjpcXFxcXFxcImh0dHBzOi8vcGFuLnF1YXJrLmNuXFxcXFxcXCI7XFxcXG5kLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcIng1X3dlYnZpZXdfc2luZ2xlXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBkdXJsLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwibGlzdCYmc2NyZWVuLTE1MFxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHVhOiBQQ19VQSxcXFxcbiAgICAgICAganM6ICQudG9TdHJpbmcoKHRpdGxlLCBkdXJsKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgY29va2llID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIHNldEludGVydmFsKCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBjb29raWUgPSBmYmEuZ2V0Q29va2llKGR1cmwpO1xcXFxuICAgICAgICAgICAgICAgIGZiYS5wdXRWYXIodGl0bGUgKyBcXFxcXFxcIkBjb29raWVcXFxcXFxcIiwgY29va2llKTtcXFxcbiAgICAgICAgICAgIH0sIDIwMCk7XFxcXG4gICAgICAgIH0sIE1ZX1JVTEUudGl0bGUsIGR1cmwpXFxcXG4gICAgfVxcXFxufSk7XFxcXG5zZXRSZXN1bHQoZClcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlt6XlhbdcXFwiLFxcXCJwYXRoXFxcIjpcXFwidG9vbFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcblxcXFxuJC5leHBvcnRzPXtcXFxcbiAgICBpc0xvZ2luQ29va2llKGNvb2tpZSl7XFxcXG4gICAgICAgIC8vcmV0dXJuIHRydWU7XFxcXG4gICAgICAgIHJldHVybiAhIShjb29raWUgICYmIGNvb2tpZS5pbmNsdWRlcyhcXFxcXFxcIl9fdWlkPVxcXFxcXFwiKSAmJiBjb29raWUuaW5jbHVkZXMoXFxcXFxcXCJfX3B1cz1cXFxcXFxcIikpO1xcXFxuICAgIH1cXFxcbn07XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Liq5Lq66LSm5Y+36K6+572uXFxcIixcXFwicGF0aFxcXCI6XFxcImFjY291bnRcXFwiLFxcXCJydWxlXFxcIjpcXFwiJC5leHBvcnRzID0gJChbXFxcXFxcXCLlpLjlhYvkuoznu7TnoIHnmbvlvZVcXFxcXFxcIiwgXFxcXFxcXCJDb29raWXnmbvlvZVcXFxcXFxcIiwgXFxcXFxcXCLnvZHpobXnmbvlvZVcXFxcXFxcIiwgXFxcXFxcXCLlpI3liLZDb29raWVcXFxcXFxcIiwgXFxcXFxcXCLmuIXpmaRDb29raWVcXFxcXFxcIiwgXFxcXFxcXCLojrflj5bnvZHnu5zlhbHkuqtLS0Nvb2tpZVxcXFxcXFwiLCBcXFxcXFxcIlVD5LqM57u056CB55m75b2VXFxcXFxcXCIsIFxcXFxcXFwiVUPnvZHpobXnmbvlvZVcXFxcXFxcIiwgXFxcXFxcXCJVQ0Nvb2tpZeeZu+W9lVxcXFxcXFwiLCBcXFxcXFxcIuWkjeWItlVDQ29va2llXFxcXFxcXCIsIFxcXFxcXFwi5riF6ZmkVUNDb29raWVcXFxcXFxcIl0pLnNlbGVjdCgoaXNyKSA9PiB7XFxcXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21VVUlEKCkge1xcXFxuICAgICAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XFxcXG4gICAgICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsXFxcXG4gICAgICAgICAgICAgICAgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgICBpZiAoaW5wdXQgPT09IFxcXFxcXFwi572R6aG155m75b2VXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXFxcXFwiO1xcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwiQ29va2ll55m75b2VXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgcmV0dXJuICQoXFxcXFxcXCJcXFxcXFxcIiwgXFxcXFxcXCLor7fovpPlhaVDb29raWVcXFxcXFxcIikuaW5wdXQoKGlzcikgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFxcXFxcInRvb2xcXFxcXFxcIikuaXNMb2dpbkNvb2tpZShpbnB1dCkpIHtcXFxcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwicXVhcmtDb29raWVcXFxcXFxcIiwgaW5wdXQucmVwbGFjZSgvXFxcXFxcXFxzL2csIFxcXFxcXFwiXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL0Nvb2tpZeagvOW8j+mUmeivr1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LCBpc3IpO1xcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5LuOVFZCT1jojrflj5ZDb29raWVcXFxcXFxcIikge1xcXFxuICAgICAgICBsZXQgcGF0aCA9IFxcXFxcXFwiL3N0b3JhZ2UvZW11bGF0ZWQvMC9UVi8ucXVhcmtfdXNlclxcXFxcXFwiO1xcXFxuICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCkpIHtcXFxcbiAgICAgICAgICAgIGlmICghbmV3IGphdmEuaW8uRmlsZShwYXRoKS5jYW5SZWFkKCkpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFxcXFxcIuayoeacieadg+mZkOivu+WPlkNvb2tpZeaWh+S7tu+8jOivt+aJk+W8gOaJgOacieaWh+S7tuadg+mZkFxcXFxcXFxcbua1t+mYlOiuvue9ri0+5pu05aSa5Yqf6IO9LT7lhoXpg6jmlofku7bnrqHnkIYtPuWPs+S4iuinklxcXFxcXFwiKS5jb25maXJtKCgpID0+IHt9KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGZldGNoKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCkpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBjb29raWUgPSBqc29uLmNvb2tpZTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoJC5yZXF1aXJlKFxcXFxcXFwidG9vbFxcXFxcXFwiKS5pc0xvZ2luQ29va2llKGNvb2tpZSkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIGNvb2tpZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vQ29va2ll5qC85byP6ZSZ6K+vXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6I635Y+W5aSx6LSl5YWx5Lqr5paH5Lu25o2f5Z2PXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gJChcXFxcXFxcIuacquajgOa1i+WIsFRWQk9Y55qEQ29va2ll5paH5Lu2XFxcXFxcXFxu6K+35L2/55So6L+H5ZCO5YaN5bCd6K+VXFxcXFxcXCIpLmNvbmZpcm0oKCkgPT4ge30pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLlpI3liLZDb29raWVcXFxcXFxcIikge1xcXFxuICAgICAgICBsZXQgY29va2llID0gZ2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoY29va2llKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIgKyBjb29raWU7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acqueZu+W9lVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLmuIXpmaRDb29raWVcXFxcXFxcIikge1xcXFxuICAgICAgICBjbGVhckl0ZW0oXFxcXFxcXCJxdWFya0Nvb2tpZVxcXFxcXFwiKTtcXFxcbiAgICAgICAgaXNyICYmIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6YCA5Ye655m75b2VXFxcXFxcXCI7XFxcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcXFxcXCJVQ+e9kemhteeZu+W9lVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/ZnJvbT11Y1xcXFxcXFwiO1xcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwiVUNDb29raWXnmbvlvZVcXFxcXFxcIikge1xcXFxuICAgICAgICByZXR1cm4gJChcXFxcXFxcIlxcXFxcXFwiLCBcXFxcXFxcIuivt+i+k+WFpUNvb2tpZVxcXFxcXFwiKS5pbnB1dCgoaXNyKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoJC5yZXF1aXJlKFxcXFxcXFwidG9vbFxcXFxcXFwiKS5pc0xvZ2luQ29va2llKGlucHV0KSkge1xcXFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJ1Y0Nvb2tpZVxcXFxcXFwiLCBpbnB1dC5yZXBsYWNlKC9cXFxcXFxcXHMvZywgXFxcXFxcXCJcXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vQ29va2ll5qC85byP6ZSZ6K+vXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIGlzcik7XFxcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLlpI3liLZVQ0Nvb2tpZVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIGxldCBjb29raWUgPSBnZXRJdGVtKFxcXFxcXFwidWNDb29raWVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmIChjb29raWUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIiArIGNvb2tpZTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pyq55m75b2VXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIua4hemZpFVDQ29va2llXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgY2xlYXJJdGVtKFxcXFxcXFwidWNDb29raWVcXFxcXFxcIik7XFxcXG4gICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+mAgOWHuueZu+W9lVxcXFxcXFwiO1xcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi6I635Y+W572R57uc5YWx5LqrS0tDb29raWVcXFxcXFxcIikge1xcXFxuICAgICAgICBsZXQgaGhkID0ge1xcXFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnQXBhY2hlLUh0dHBDbGllbnQvVU5BVkFJTEFCTEUgKGphdmEgMS40KSdcXFxcbiAgICAgICAgfcKgXFxcXG4gICAgICAgIGxldCBkeGN1cmwgPSAnaHR0cDovL2FwaS52Nngud2h0LmRnd2h0LnRvcC90ZXh0LzNkZTg4ZDEwZDAxOTI5YmUvJ1xcXFxuICAgICAgICBsZXQgeGNkYXRhID0gWydjOTlkNzQxMWNjYzI5YmMxJ11cXFxcbiAgICAgICAgbGV0IGR4YyA9IFtdXFxcXG4gICAgICAgIGxldCB5c2Nvb2tpZSA9ICcnXFxcXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeGNkYXRhLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICBsZXQgZGF0YSA9IGZldGNoKGR4Y3VybCArIHhjZGF0YVtpXSwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhoZFxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBpZiAoJC5yZXF1aXJlKFxcXFxcXFwidG9vbFxcXFxcXFwiKS5pc0xvZ2luQ29va2llKGRhdGEpKSB7XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgeXNjb29raWUgPSBkYXRhLnNwbGl0KFxcXFxcXFwi4pGgXFxcXFxcXCIpWzFdO1xcXFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHlzY29va2llKSB7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwicXVhcmtDb29raWVcXFxcXFxcIiwgeXNjb29raWUpO1xcXFxuICAgICAgICAgICAgaXNyICYmIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5aS45YWL5LqM57u056CB55m75b2VXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCByZXF1ZXN0X2lkID0gZ2VuZXJhdGVSYW5kb21VVUlEKCk7XFxcXG4gICAgICAgICAgICBsZXQgcWNUb2tlbiA9IEpTT04ucGFyc2UoZmV0Y2goYnVpbGRVcmwoXFxcXFxcXCJodHRwczovL3VvcC5xdWFyay5jbi9jYXMvYWpheC9nZXRUb2tlbkZvclFyY29kZUxvZ2luXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICByZXF1ZXN0X2lkLFxcXFxuICAgICAgICAgICAgICAgIGNsaWVudF9pZDogXFxcXFxcXCI1MzJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB2OiBcXFxcXFxcIjEuMlxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9KSkpLmRhdGEubWVtYmVycy50b2tlbjtcXFxcbiAgICAgICAgICAgIGNyZWF0ZVFSQ29kZShgaHR0cHM6Ly9zdS5xdWFyay5jbi80X2VNSEJKP3Rva2VuPSR7cWNUb2tlbn0mY2xpZW50X2lkPTUzMiZzc2I9d2VibG9naW4mdWNfcGFyYW1fc3RyPSZ1Y19iaXpfc3RyPVMlM0FjdXN0b20lN0NPUFQlM0FTQVJFQSU0MDAlN0NPUFQlM0FJTU1FUlNJVkUlNDAxJTdDT1BUJTNBQkFDS19CVE5fU1RZTEUlNDAwYCwgZmFsc2UpO1xcXFxuICAgICAgICAgICAgbGV0IHNlcnZpY2VfdGlja2V0ID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBlYyA9IDA7IGkgPCAzMDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCgyMDAwKTtcXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGlja2V0ID0gSlNPTi5wYXJzZShmZXRjaChidWlsZFVybChcXFxcXFxcImh0dHBzOi8vdW9wLnF1YXJrLmNuL2Nhcy9hamF4L2dldFNlcnZpY2VUaWNrZXRCeVFyY29kZVRva2VuXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfaWQ6IGdlbmVyYXRlUmFuZG9tVVVJRCgpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkOiBcXFxcXFxcIjUzMlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdjogXFxcXFxcXCIxLjJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBxY1Rva2VuXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKHRpY2tldClcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpY2tldC5zdGF0dXMgPT0gMjAwMDAwMCkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV90aWNrZXQgPSB0aWNrZXQuZGF0YS5tZW1iZXJzLnNlcnZpY2VfdGlja2V0O1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpY2tldC5zdGF0dXMgPT0gNTAwMDQwMDEpIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0LnN0YXR1cyA9PSA1MDAwNDAwMiB8fCBpID09PSAyOSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kuoznu7TnoIHov4fmnJ9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgZWMrKztcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVjID49IDUpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5p+l6K+i5LqM57u056CB5Ye66ZSZXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmICghc2VydmljZV90aWNrZXQpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vdGlja2V06I635Y+W5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBsZXQgcmVzID0gSlNPTi5wYXJzZShmZXRjaChcXFxcXFxcImh0dHBzOi8vcGFuLnF1YXJrLmNuL2FjY291bnQvaW5mbz9zdD1cXFxcXFxcIiArIHNlcnZpY2VfdGlja2V0ICsgXFxcXFxcXCImbHc9c2NhblxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXFxcbiAgICAgICAgICAgIH0pKTtcXFxcbiAgICAgICAgICAgIC8vbG9nKHJlcylcXFxcbiAgICAgICAgICAgIGlmICghSlNPTi5wYXJzZShyZXMuYm9keSkuc3VjY2VzcykgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly90aWNrZXTpqozor4HlpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCBjb29raWUgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSByZXMuaGVhZGVycztcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGMgb2YgaGVhZGVyc1tcXFxcXFxcInNldC1jb29raWVcXFxcXFxcIl0pIHtcXFxcbiAgICAgICAgICAgICAgICBjb29raWUgKz0gYy5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilbMF0gKyBcXFxcXFxcIjtcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgbG9nKGNvb2tpZSk7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwicXVhcmtDb29raWVcXFxcXFxcIiwgY29va2llKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v55m75b2V5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAoXFxcXFxcXCJ0b2FzdDovL+eZu+W9leWksei0pe+8mlxcXFxcXFwiICsgZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICAvL2h0dHBzOi8vc3UucXVhcmsuY24vNF9lTUhCSj90b2tlbj1zdDk2YTYzMzM5MG55OXl6bGswaXZ1b3VjN2I5Z2ZtaiZjbGllbnRfaWQ9NTMyJnNzYj13ZWJsb2dpbiZ1Y19wYXJhbV9zdHI9JnVjX2Jpel9zdHI9UyUzQWN1c3RvbSU3Q09QVCUzQVNBUkVBJTQwMCU3Q09QVCUzQUlNTUVSU0lWRSU0MDElN0NPUFQlM0FCQUNLX0JUTl9TVFlMRSU0MDBcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIlVD5LqM57u056CB55m75b2VXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCByZXF1ZXN0X2lkID0gZ2VuZXJhdGVSYW5kb21VVUlEKCk7XFxcXG4gICAgICAgICAgICBsZXQgcWNUb2tlbiA9IEpTT04ucGFyc2UocG9zdChgaHR0cHM6Ly9hcGkub3Blbi51Yy5jbi9jYXMvYWpheC9nZXRUb2tlbkZvclFyY29kZUxvZ2luP19fdD0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWAsIHtcXFxcbiAgICAgICAgICAgICAgICBib2R5OiBgdj0xLjImcmVxdWVzdF9pZD0ke3JlcXVlc3RfaWR9JmNsaWVudF9pZD0zODFgXFxcXG4gICAgICAgICAgICB9KSkuZGF0YS5tZW1iZXJzLnRva2VuO1xcXFxuICAgICAgICAgICAgY3JlYXRlUVJDb2RlKGBodHRwczovL3N1LnVjLmNuLzFfbjBaQ3Y/dG9rZW49JHtxY1Rva2VufSZjbGllbnRfaWQ9MzgxJnVjX3BhcmFtX3N0cj0mdWNfYml6X3N0cj1TJTNBY3VzdG9tJTdDQyUzQXRpdGxlYmFyX2ZpeGAsIGZhbHNlKTtcXFxcbiAgICAgICAgICAgIGxldCBzZXJ2aWNlX3RpY2tldCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgZWMgPSAwOyBpIDwgMzA7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoMjAwMCk7XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpY2tldCA9IEpTT04ucGFyc2UocG9zdChgaHR0cHM6Ly9hcGkub3Blbi51Yy5jbi9jYXMvYWpheC9nZXRTZXJ2aWNlVGlja2V0QnlRcmNvZGVUb2tlbj9fX3Q9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBgdj0xLjImcmVxdWVzdF9pZD0ke3JlcXVlc3RfaWR9JmNsaWVudF9pZD0zODEmdG9rZW49JHtxY1Rva2VufWBcXFxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xcXFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyh0aWNrZXQpXFxcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZXQuc3RhdHVzID09IDIwMDAwMDApIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdGlja2V0ID0gdGlja2V0LmRhdGEubWVtYmVycy5zZXJ2aWNlX3RpY2tldDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZXQuc3RhdHVzID09IDUwMDA0MDAxKSBjb250aW51ZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpY2tldC5zdGF0dXMgPT0gNTAwMDQwMDIgfHwgaSA9PT0gMjkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5LqM57u056CB6L+H5pyfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGVjKys7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChlYyA+PSA1KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+afpeivouS6jOe7tOeggeWHuumUmVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAoIXNlcnZpY2VfdGlja2V0KSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL3RpY2tldOiOt+WPluWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IHJlcyA9IEpTT04ucGFyc2UoZmV0Y2goYGh0dHBzOi8vZHJpdmUudWMuY24vYWNjb3VudC9pbmZvP3N0PSR7c2VydmljZV90aWNrZXR9YCwge1xcXFxuICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxcXG4gICAgICAgICAgICB9KSk7XFxcXG4gICAgICAgICAgICAvL2xvZyhyZXMpXFxcXG4gICAgICAgICAgICBpZiAoIUpTT04ucGFyc2UocmVzLmJvZHkpLnN1Y2Nlc3MpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vdGlja2V06aqM6K+B5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBsZXQgY29va2llID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0gcmVzLmhlYWRlcnM7XFxcXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGhlYWRlcnNbXFxcXFxcXCJzZXQtY29va2llXFxcXFxcXCJdKSB7XFxcXG4gICAgICAgICAgICAgICAgY29va2llICs9IGMuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzBdICsgXFxcXFxcXCI7XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsb2coY29va2llKTtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJ1Y0Nvb2tpZVxcXFxcXFwiLCBjb29raWUpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/nmbvlvZXmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIChcXFxcXFxcInRvYXN0Oi8v55m75b2V5aSx6LSl77yaXFxcXFxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxufSwgJC5pbXBvcnRQYXJhbSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiQ29va2llTWFuYWdlXFxcIixcXFwicGF0aFxcXCI6XFxcIkNvb2tpZU1hbmFnZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJmdW5jdGlvbiBDb29raWVNYW5hZ2UoY29va2llKSB7XFxcXG4gICAgdGhpcy5jb29raWUgPSB7fTtcXFxcbiAgICB0aGlzLmFkZChjb29raWUpO1xcXFxufVxcXFxuT2JqZWN0LmFzc2lnbihDb29raWVNYW5hZ2UucHJvdG90eXBlLCB7XFxcXG4gICAgYWRkKGNvb2tpZSkge1xcXFxuICAgICAgICBsZXQgY29va2llcyA9IFtdO1xcXFxuICAgICAgICBpZiAodHlwZW9mIGNvb2tpZSA9PT0gXFxcXFxcXCJzdHJpbmdcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgY29va2llcyA9IGNvb2tpZS5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIik7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb29raWUpKSB7XFxcXG4gICAgICAgICAgICBjb29raWVzID0gY29va2llO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGNvb2tpZXMuZm9yRWFjaCh2ID0+IHtcXFxcbiAgICAgICAgICAgIHYgPSB2LnNwbGl0KFxcXFxcXFwiPVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGlmICh2Lmxlbmd0aCA8IDIpIHJldHVybjtcXFxcbiAgICAgICAgICAgIGxldCBrZXkgPSB2LnNoaWZ0KCkudHJpbSgpO1xcXFxuICAgICAgICAgICAgdGhpcy5jb29raWVba2V5XSA9IHYuam9pbihcXFxcXFxcIj1cXFxcXFxcIikudHJpbSgpO1xcXFxuICAgICAgICB9KTtcXFxcbiAgICB9LFxcXFxuICAgIGdldCgpIHtcXFxcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuY29va2llKS5tYXAodiA9PiB2WzBdICsgXFxcXFxcXCI9XFxcXFxcXCIgKyB2WzFdKS5qb2luKFxcXFxcXFwiO1xcXFxcXFwiKTtcXFxcbiAgICB9XFxcXG59KTtcXFxcbi8vY29uc3QgY29va2llTWFuYWdlID0gbmV3IENvb2tpZU1hbmFnZShjb29raWUpO1xcXFxuJC5leHBvcnRzPUNvb2tpZU1hbmFnZTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlpKnnv7xBUElcXFwiLFxcXCJwYXRoXFxcIjpcXFwiQ2xvdWREcml2ZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBDcnlwdG9VdGlsID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9hc3NldHMvY3J5cHRvLWphdmEuanNcXFxcXFxcIik7XFxcXG5cXFxcbmZ1bmN0aW9uIENsb3VkRHJpdmUoKSB7XFxcXG4gICAgdGhpcy5yZWdleCA9IC9odHRwczpcXFxcXFxcXC9cXFxcXFxcXC9jbG91ZFxcXFxcXFxcLjE4OVxcXFxcXFxcLmNuXFxcXFxcXFwvd2ViXFxcXFxcXFwvc2hhcmVcXFxcXFxcXD9jb2RlPShbMC05QS1aYS16XSspLzsgLy9odHRwczovL2Nsb3VkLjE4OS5jbi93ZWIvc2hhcmU/Y29kZT1xSTNhTWpxWVJycWFcXFxcbiAgICB0aGlzLmNvbmZpZyA9IHtcXFxcbiAgICAgICAgY2xpZW50SWQ6ICc1MzgxMzUxNTA2OTM0MTInLFxcXFxuICAgICAgICBtb2RlbDogJ0tCMjAwMCcsXFxcXG4gICAgICAgIHZlcnNpb246ICc5LjAuNicsXFxcXG4gICAgICAgIHB1YktleTogJ01JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRQ1pMeVY0Z0hORFVHSk1ab09jWWF1eG1ORXNLcmMwVGxMZUJFVlZJSVFOekc0V3FqaW1jZU9qNVI5RVR3RGVlU04zeWVqQUtMR0hneDgzbHl5MndCanZuYmZtL25MT2J5V3dRRC8wOUNtcFpkeG9GWUNINnJkRGpScHdaT1oyblhTWnBna1pYb09Ca2ZOWE54bk43NGFYdGhvMmRxQnluVHczTkZUV3lRbDhCUUlEQVFBQicsXFxcXG4gICAgfTtcXFxcbiAgICB0aGlzLmhlYWRlcnMgPSB7XFxcXG4gICAgICAgICdVc2VyLUFnZW50JzogYE1vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCAxMTsgJHt0aGlzLmNvbmZpZy5tb2RlbH0gQnVpbGQvUlAxQS4yMDEwMDUuMDAxKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvNzQuMC4zNzI5LjEzNiBNb2JpbGUgU2FmYXJpLzUzNy4zNiBFY2xvdWQvJHt0aGlzLmNvbmZpZy52ZXJzaW9ufSBBbmRyb2lkLzMwIGNsaWVudElkLyR7dGhpcy5jb25maWcuY2xpZW50SWR9IGNsaWVudE1vZGVsLyR7dGhpcy5jb25maWcubW9kZWx9IGNsaWVudENoYW5uZWxJZC9xcSBwcm9WZXJzaW9uLzEuMC42YCxcXFxcbiAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly9tLmNsb3VkLjE4OS5jbi96aHVhbnRpLzIwMTYvc2lnbi9pbmRleC5qc3A/YWxidW1CYWNrdXBPcGVuZWQ9MScsXFxcXG4gICAgICAgICdBY2NlcHQtRW5jb2RpbmcnOiAnZ3ppcCwgZGVmbGF0ZScsXFxcXG4gICAgfTtcXFxcbiAgICB0aGlzLmFwaSA9ICdodHRwczovL2Nsb3VkLjE4OS5jbi9hcGknO1xcXFxuICAgIHRoaXMuc2hhcmVDb2RlID0gJyc7XFxcXG4gICAgdGhpcy5hY2Nlc3NDb2RlID0gJyc7XFxcXG4gICAgdGhpcy5zaGFyZUlkID0gJyc7XFxcXG4gICAgdGhpcy5zaGFyZU1vZGUgPSAnJztcXFxcbiAgICB0aGlzLmlzRm9sZGVyID0gJyc7XFxcXG59XFxcXG5PYmplY3QuYXNzaWduKENsb3VkRHJpdmUucHJvdG90eXBlLCB7XFxcXG4gICAgY2hlY2tDb29raWUoKSB7XFxcXG4gICAgICAgIGlmICghdGhpcy5jb29raWUgJiYgdGhpcy5hY2NvdW50ICYmIHRoaXMucGFzc3dvcmQpIHtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oJ2Nsb3VkQ29va2llJywgdGhpcy5sb2dpbih0aGlzLmFjY291bnQsIHRoaXMucGFzc3dvcmQpKTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuacqueZu+W9lVxcXFxcXFwiKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAgZ2V0Q29va2llKCkge1xcXFxuICAgICAgICByZXR1cm4gZ2V0SXRlbShcXFxcXFxcImNsb3VkQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgIH0sXFxcXG4gICAgbG9naW4odW5hbWUsIHBhc3N3ZCkge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHJlc3AgPSBKU09OLnBhcnNlKHBvc3QoJ2h0dHBzOi8vb3Blbi5lLjE4OS5jbi9hcGkvbG9nYm94L2NvbmZpZy9lbmNyeXB0Q29uZi5kbz9hcHBJZD1jbG91ZCcpKTtcXFxcbiAgICAgICAgICAgIGxldCBwdWJLZXkgPSByZXNwLmRhdGEucHViS2V5O1xcXFxuICAgICAgICAgICAgcmVzcCA9IEpTT04ucGFyc2UocmVxdWVzdCgnaHR0cHM6Ly9jbG91ZC4xODkuY24vYXBpL3BvcnRhbC9sb2dpblVybC5hY3Rpb24/cmVkaXJlY3RVUkw9aHR0cHM6Ly9jbG91ZC4xODkuY24vd2ViL3JlZGlyZWN0Lmh0bWw/cmV0dXJuVVJMPS9tYWluLmFjdGlvbicsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZTogXFxcXFxcXCIjbm9Db29raWUjXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxcXG4gICAgICAgICAgICB9KSk7XFxcXG4gICAgICAgICAgICAvL2xvZyhyZXNwKVxcXFxuICAgICAgICAgICAgLy8g6I635Y+W5pyA5ZCO6K+35rGCdXJs5Lit55qE5Y+C5pWwcmVxSWTlkoxsdFxcXFxuICAgICAgICAgICAgbGV0IFJlcWlkID0gcmVzcC51cmwubWF0Y2goL3JlcUlkPShcXFxcXFxcXHcrKS8pWzFdO1xcXFxuICAgICAgICAgICAgbGV0IEx0ID0gcmVzcC51cmwubWF0Y2goL2x0PShcXFxcXFxcXHcrKS8pWzFdO1xcXFxuICAgICAgICAgICAgbGV0IHRIZWFkZXJzID0ge1xcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiQ29udGVudC1UeXBlXFxcXFxcXCI6IFxcXFxcXFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6NzQuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC83Ni4wJyxcXFxcbiAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL29wZW4uZS4xODkuY24vJyxcXFxcbiAgICAgICAgICAgICAgICBMdCxcXFxcbiAgICAgICAgICAgICAgICBSZXFpZCxcXFxcbiAgICAgICAgICAgIH07XFxcXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHtcXFxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMi4wJyxcXFxcbiAgICAgICAgICAgICAgICBhcHBLZXk6ICdjbG91ZCdcXFxcbiAgICAgICAgICAgIH07XFxcXG4gICAgICAgICAgICByZXNwID0gSlNPTi5wYXJzZShwb3N0KCdodHRwczovL29wZW4uZS4xODkuY24vYXBpL2xvZ2JveC9vYXV0aDIvYXBwQ29uZi5kbycsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0SGVhZGVycyxcXFxcbiAgICAgICAgICAgICAgICBib2R5OiBkYXRhXFxcXG4gICAgICAgICAgICB9KSk7XFxcXG4gICAgICAgICAgICBsZXQgcmV0dXJuVXJsID0gcmVzcC5kYXRhLnJldHVyblVybDtcXFxcbiAgICAgICAgICAgIGxldCBwYXJhbUlkID0gcmVzcC5kYXRhLnBhcmFtSWQ7XFxcXG4gICAgICAgICAgICAvL2NvbnN0IGtleURhdGEgPSBgLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cXFxcXFxcXG4ke3B1YktleX1cXFxcXFxcXG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1gO1xcXFxuICAgICAgICAgICAgLy9jb25zdCBqc2VuY3J5cHQgPSBuZXcgSlNFbmNyeXB0KCk7XFxcXG4gICAgICAgICAgICAvL2pzZW5jcnlwdC5zZXRQdWJsaWNLZXkoa2V5RGF0YSk7XFxcXG4gICAgICAgICAgICAvL2NvbnN0IGVuVW5hbWUgPSBCdWZmZXIuZnJvbShqc2VuY3J5cHQuZW5jcnlwdCh1bmFtZSksICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XFxcXG4gICAgICAgICAgICAvL2NvbnN0IGVuUGFzc3dkID0gQnVmZmVyLmZyb20oanNlbmNyeXB0LmVuY3J5cHQocGFzc3dkKSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcXFxcbiAgICAgICAgICAgIGxldCBlblVuYW1lID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlQmFzZTY0KHJzYUVuY3J5cHQodW5hbWUsIHB1YktleSksIF9iYXNlNjQuTk9fV1JBUCkudG9IZXgoKS50b1VwcGVyQ2FzZSgpO1xcXFxuICAgICAgICAgICAgbGV0IGVuUGFzc3dkID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlQmFzZTY0KHJzYUVuY3J5cHQocGFzc3dkLCBwdWJLZXkpLCBfYmFzZTY0Lk5PX1dSQVApLnRvSGV4KCkudG9VcHBlckNhc2UoKTtcXFxcbiAgICAgICAgICAgIGRhdGEgPSB7XFxcXG4gICAgICAgICAgICAgICAgYXBwS2V5OiAnY2xvdWQnLFxcXFxuICAgICAgICAgICAgICAgIHZlcnNpb246ICcyLjAnLFxcXFxuICAgICAgICAgICAgICAgIGFjY291bnRUeXBlOiAnMDEnLFxcXFxuICAgICAgICAgICAgICAgIG1haWxTdWZmaXg6ICdAMTg5LmNuJyxcXFxcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUNvZGU6ICcnLFxcXFxuICAgICAgICAgICAgICAgIHJldHVyblVybCxcXFxcbiAgICAgICAgICAgICAgICBwYXJhbUlkLFxcXFxuICAgICAgICAgICAgICAgIGNhcHRjaGFUb2tlbjogJycsXFxcXG4gICAgICAgICAgICAgICAgZHluYW1pY0NoZWNrOiAnRkFMU0UnLFxcXFxuICAgICAgICAgICAgICAgIGNsaWVudFR5cGU6ICcxJyxcXFxcbiAgICAgICAgICAgICAgICBjYl9TYXZlTmFtZTogJzAnLFxcXFxuICAgICAgICAgICAgICAgIGlzT2F1dGgyOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICB1c2VyTmFtZTogYHtOUlB9JHtlblVuYW1lfWAsXFxcXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IGB7TlJQfSR7ZW5QYXNzd2R9YCxcXFxcbiAgICAgICAgICAgIH07XFxcXG4gICAgICAgICAgICByZXNwID0gSlNPTi5wYXJzZShwb3N0KCdodHRwczovL29wZW4uZS4xODkuY24vYXBpL2xvZ2JveC9vYXV0aDIvbG9naW5TdWJtaXQuZG8nLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdEhlYWRlcnMsXFxcXG4gICAgICAgICAgICAgICAgd2l0aEhlYWRlcnM6IHRydWUsXFxcXG4gICAgICAgICAgICAgICAgYm9keTogZGF0YVxcXFxuICAgICAgICAgICAgfSkpO1xcXFxuICAgICAgICAgICAgbGV0IHJlcyA9IEpTT04ucGFyc2UocmVzcC5ib2R5KTtcXFxcbiAgICAgICAgICAgIGlmIChyZXMudG9VcmwpIHtcXFxcblxcXFxuICAgICAgICAgICAgICAgIGxldCBjb29raWVzID0gcmVzcC5oZWFkZXJzWydzZXQtY29va2llJ10ubWFwKGl0ID0+IGl0LnNwbGl0KCc7JylbMF0pLmpvaW4oJzsnKTtcXFxcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcXVlc3QocmVzLnRvVXJsLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuaGVhZGVycywge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29va2llOiBjb29raWVzXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcXFxuICAgICAgICAgICAgICAgIH0pKTtcXFxcblxcXFxuICAgICAgICAgICAgICAgIGNvb2tpZXMgKz0gJzsgJyArIChyZXMuaGVhZGVyc1snc2V0LWNvb2tpZSddIHx8IFtdKS5tYXAoaXQgPT4gaXQuc3BsaXQoJzsnKVswXSkuam9pbignOycpO1xcXFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oJ2Nsb3VkQ29va2llJywgY29va2llcyk7XFxcXG4gICAgICAgICAgICAgICAgbG9nKGNvb2tpZXMpO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgbG9naW46JyArIEpTT04uc3RyaW5naWZ5KHJlc3ApKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcXFxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBsb2dpbjonICsgZXJyb3IudG9TdHJpbmcoKSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIGdldFNoYXJlVXJsRGF0YSh1cmwpIHtcXFxcbiAgICAgICAgbGV0IG1hdGNoZXMgPSB0aGlzLnJlZ2V4LmV4ZWModXJsKTtcXFxcbiAgICAgICAgbGV0IHNoYXJlRGF0YTAgPSB7fTtcXFxcbiAgICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlc1sxXSkge1xcXFxuICAgICAgICAgICAgc2hhcmVEYXRhMC5zaGFyZUNvZGUgPSBtYXRjaGVzWzFdO1xcXFxuICAgICAgICAgICAgbGV0IGFjY2Vzc0NvZGVNYXRjaCA9IHVybC5tYXRjaCgv6K6/6Zeu56CB77yaKFthLXpBLVowLTldKykvKTtcXFxcbiAgICAgICAgICAgIHNoYXJlRGF0YTAuYWNjZXNzQ29kZSA9IGFjY2Vzc0NvZGVNYXRjaCA/IGFjY2Vzc0NvZGVNYXRjaFsxXSA6ICcnO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgbGV0IG1hdGNoZXNfID0gdXJsLm1hdGNoKC9odHRwczpcXFxcXFxcXC9cXFxcXFxcXC9jbG91ZFxcXFxcXFxcLjE4OVxcXFxcXFxcLmNuXFxcXFxcXFwvdFxcXFxcXFxcLyhbMC05QS1aYS16XSspLyk7XFxcXG4gICAgICAgICAgICBzaGFyZURhdGEwLnNoYXJlQ29kZSA9IG1hdGNoZXNfID8gbWF0Y2hlc19bMV0gOiBudWxsO1xcXFxuICAgICAgICAgICAgbGV0IGFjY2Vzc0NvZGVNYXRjaCA9IHVybC5tYXRjaCgv6K6/6Zeu56CB77yaKFthLXpBLVowLTldKykvKTtcXFxcbiAgICAgICAgICAgIHNoYXJlRGF0YTAuYWNjZXNzQ29kZSA9IGFjY2Vzc0NvZGVNYXRjaCA/IGFjY2Vzc0NvZGVNYXRjaFsxXSA6ICcnO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBzaGFyZURhdGEwO1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0U2hhcmVJbmZvRGF0YShzaGFyZVVybCwgY29kZSkge1xcXFxuICAgICAgICBsZXQgc2hhcmVEYXRhID0gdGhpcy5nZXRTaGFyZVVybERhdGEoc2hhcmVVcmwpO1xcXFxuICAgICAgICBjb2RlICYmIChzaGFyZURhdGEuYWNjZXNzQ29kZSA9IGNvZGUpO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHJlc3AgPSBKU09OLnBhcnNlKHJlcXVlc3QoYCR7dGhpcy5hcGl9L29wZW4vc2hhcmUvZ2V0U2hhcmVJbmZvQnlDb2RlVjIuYWN0aW9uP2tleT1ub0NhY2hlJnNoYXJlQ29kZT0ke3NoYXJlRGF0YS5zaGFyZUNvZGV9YCwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgJ3VzZXItYWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEzMS4wLjAuMCBTYWZhcmkvNTM3LjM2JyxcXFxcbiAgICAgICAgICAgICAgICAgICAgJ2FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLFxcXFxuICAgICAgICAgICAgICAgICAgICAvLydhY2NlcHQtZW5jb2RpbmcnOiAnZ3ppcCwgZGVmbGF0ZSwgYnIsIHpzdGQnLFxcXFxuICAgICAgICAgICAgICAgICAgICAnYWNjZXB0LWxhbmd1YWdlJzogJ3poLUNOLHpoO3E9MC45JyxcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KSk7XFxcXG4gICAgICAgICAgICBzaGFyZURhdGEucm9vdEZpbGVJZCA9IHJlc3AuZmlsZUlkO1xcXFxuICAgICAgICAgICAgc2hhcmVEYXRhLnNoYXJlSWQgPSByZXNwLnNoYXJlSWQ7XFxcXG4gICAgICAgICAgICBzaGFyZURhdGEuc2hhcmVNb2RlID0gcmVzcC5zaGFyZU1vZGU7XFxcXG4gICAgICAgICAgICBzaGFyZURhdGEuaXNGb2xkZXIgPSByZXNwLmlzRm9sZGVyO1xcXFxuICAgICAgICAgICAgcmV0dXJuIHNoYXJlRGF0YTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcXFxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBnZXRTaGFyZUluZm86JyArIGVycm9yLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiB7fTtcXFxcbiAgICB9LFxcXFxuICAgIGdldFNoYXJlRmlsZXMoZmlsZUlkLCBzaGFyZURhdGEsIHBhZ2UsIG9yZGVyQnkpIHtcXFxcbiAgICAgICAgbGV0IHJlc3AgPSBKU09OLnBhcnNlKHJlcXVlc3QoYCR7dGhpcy5hcGl9L29wZW4vc2hhcmUvbGlzdFNoYXJlRGlyLmFjdGlvbj9rZXk9bm9DYWNoZSZwYWdlTnVtPSR7cGFnZXx8MX0mcGFnZVNpemU9NjAmZmlsZUlkPSR7ZmlsZUlkfSZzaGFyZURpckZpbGVJZD0ke2ZpbGVJZH0maXNGb2xkZXI9JHtzaGFyZURhdGEuaXNGb2xkZXJ9JnNoYXJlSWQ9JHtzaGFyZURhdGEuc2hhcmVJZHx8XFxcXFxcXCJcXFxcXFxcIn0mc2hhcmVNb2RlPSR7c2hhcmVEYXRhLnNoYXJlTW9kZX0maWNvbk9wdGlvbj01Jm9yZGVyQnk9JHtvcmRlckJ5fHxcXFxcXFxcImxhc3RPcFRpbWVcXFxcXFxcIn0mZGVzY2VuZGluZz10cnVlJmFjY2Vzc0NvZGU9JHtzaGFyZURhdGEuYWNjZXNzQ29kZX1gLCB7XFxcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgJ2FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLFxcXFxuICAgICAgICAgICAgICAgICd1c2VyLWFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMzEuMC4wLjAgU2FmYXJpLzUzNy4zNicsXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pKTtcXFxcbiAgICAgICAgbG9nKHJlc3ApXFxcXG4gICAgICAgIGxldCBmaWxlcyA9IFtdO1xcXFxuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHJlc3AuZmlsZUxpc3RBTy5maWxlTGlzdCkge1xcXFxuICAgICAgICAgICAgZmlsZXMucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgZmlsZUlkOiBpdGVtLmlkLFxcXFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICBsYXN0T3BUaW1lOiBpdGVtLmxhc3RPcFRpbWUsXFxcXG4gICAgICAgICAgICAgICAgZGlyOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICBtZWRpYVR5cGU6IGl0ZW0ubWVkaWFUeXBlXFxcXG4gICAgICAgICAgICB9KTtcXFxcblxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgcmVzcC5maWxlTGlzdEFPLmZvbGRlckxpc3QpIHtcXFxcbiAgICAgICAgICAgIGZpbGVzLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIGlkOiBpdGVtLmlkLnRvU3RyaW5nKCksXFxcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLnRvU3RyaW5nKCksXFxcXG4gICAgICAgICAgICAgICAgbGFzdE9wVGltZTogaXRlbS5sYXN0T3BUaW1lLnRvU3RyaW5nKCksXFxcXG4gICAgICAgICAgICAgICAgZGlyOiB0cnVlXFxcXG4gICAgICAgICAgICB9KTtcXFxcblxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBmaWxlcztcXFxcbiAgICB9XFxcXG59KTtcXFxcbiQuZXhwb3J0cyA9IG5ldyBDbG91ZERyaXZlKCk7XFxcXG4vL25ldyBDbG91ZERyaXZlKCkubG9naW4oXFxcXFxcXCIxODE4MTEyNTUzOFxcXFxcXFwiLCBcXFxcXFxcIl5BMUIyQzNAbG95ZGdpa1xcXFxcXFwiKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlpKnnv7zliJfooahcXFwiLFxcXCJwYXRoXFxcIjpcXFwiY2xvdWRTaGFyZUxpc3RcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgdGl0bGVIZWFkID0ge1xcXFxuICAgIHZpZGVvOiBcXFxcXFxcIvCfjqxcXFxcXFxcIixcXFxcbiAgICBhdWRpbzogXFxcXFxcXCLwn461XFxcXFxcXCIsXFxcXG4gICAgZG9jOiBcXFxcXFxcIvCfk5FcXFxcXFxcIixcXFxcbiAgICBpbWFnZTogXFxcXFxcXCLwn5a8XFxcXFxcXCIsXFxcXG4gICAgYXJjaGl2ZTogXFxcXFxcXCLwn5OmXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkZWZhdWx0XFxcXFxcXCI6IFxcXFxcXFwi4p2TXFxcXFxcXCJcXFxcbn07XFxcXG5cXFxcbmZ1bmN0aW9uIGdldEhlYWQodHlwZSwgZXh0KSB7XFxcXG4gICAgbGV0IGhlYWQgPSB0aXRsZUhlYWRbdHlwZV07XFxcXG5cXFxcbiAgICByZXR1cm4gaGVhZCB8fCBcXFxcXFxcIuKdk1xcXFxcXFwiO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBmb3JtYXRTaXplKHNpemUpIHtcXFxcbiAgICBpZiAoIXNpemUpIHtcXFxcbiAgICAgICAgcmV0dXJuICcnO1xcXFxuICAgIH1cXFxcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xcXFxuICAgIGxldCBpID0gMDtcXFxcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0KSB7XFxcXG4gICAgICAgIHNpemUgLz0gMTAyNDtcXFxcbiAgICAgICAgaSsrO1xcXFxuICAgIH1cXFxcbiAgICBzaXplID0gaSA/IE51bWJlcihzaXplLnRvRml4ZWQoMikpIDogc2l6ZTtcXFxcbiAgICByZXR1cm4gYCR7c2l6ZX0gJHt1bml0c1tpXX1gO1xcXFxufVxcXFxuXFxcXG5cXFxcbmxldCByZWFsdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwicmVhbHVybFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSk7XFxcXG5cXFxcblxcXFxubGV0IGNsb3VkRHJpdmUgPSAkLnJlcXVpcmUoXFxcXFxcXCJDbG91ZERyaXZlXFxcXFxcXCIpO1xcXFxuXFxcXG5cXFxcbmxldCBzaGFyZURhdGEgPSBjbG91ZERyaXZlLmdldFNoYXJlSW5mb0RhdGEocmVhbHVybCk7XFxcXG5sZXQgbGlzdCA9IGNsb3VkRHJpdmUuZ2V0U2hhcmVGaWxlcyhNWV9QQVJBTVMuZmlsZUlkIHx8IHNoYXJlRGF0YS5yb290RmlsZUlkLCBzaGFyZURhdGEsIE1ZX1BBR0UpO1xcXFxuXFxcXG5sZXQgZCA9IFtdO1xcXFxubGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xcXFxuICAgIC8v5Yik5pat5piv5ZCm5paH5Lu25aS5XFxcXG4gICAgaWYgKGl0ZW0uZGlyKSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLwn5OCXFxcXFxcXCIgKyBpdGVtLmZpbGVfbmFtZSxcXFxcbiAgICAgICAgICAgIGRlc2M6ICQuZGF0ZUZvcm1hdChpdGVtLnVwZGF0ZWRfYXQsICd5eXl5LU1NLWRkJykgKyAnICAnICsgaXRlbS5pbmNsdWRlX2l0ZW1zICsgJ+mhuSAgJyxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L3R1Ymlhby9tZXNzeS8yNy5zdmdcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3BhZ2U9ZnlwYWdlXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIHNoYXJlSWQsXFxcXG4gICAgICAgICAgICAgICAgc2hhcmVQd2QsXFxcXG4gICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLFxcXFxuICAgICAgICAgICAgICAgIGZpbGVJZDogaXRlbS5maWQsXFxcXG4gICAgICAgICAgICAgICAgaW5oZXJpdFRpdGxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICBmcm9tRHJpdmVcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBnZXRIZWFkKGl0ZW0ub2JqX2NhdGVnb3J5KSArIGl0ZW0uZmlsZV9uYW1lLFxcXFxuICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBmb3JtYXRTaXplKGl0ZW0uc2l6ZSksXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiAkKGl0ZW0udGh1bWJuYWlsLCB7XFxcXG4gICAgICAgICAgICAgICAgY29va2llOiBuY29va2llXFxcXG4gICAgICAgICAgICB9KS5pbWFnZSgpLFxcXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbiwgY2F0ZWdvcnksIGZyb21Ecml2ZSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCBwbGF5VXJsQ2FjaGUgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFxcXFxcInBsYXlVcmxDYWNoZVxcXFxcXFwiLCB7fSk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHBsYXlVcmxDYWNoZVtmaWRdKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5VXJsQ2FjaGVbZmlkXTtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gJC5yZXF1aXJlKFxcXFxcXFwicGxheVxcXFxcXFwiLCBmcm9tRHJpdmUpLmdldFBsYXlVcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHBsYXlVcmxDYWNoZVtmaWRdID0gdXJsO1xcXFxuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFxcXFxcInBsYXlVcmxDYWNoZVxcXFxcXFwiLCBwbGF5VXJsQ2FjaGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0sIGl0ZW0uZmlkLCBpdGVtLnNoYXJlX2ZpZF90b2tlbiwgc2hhcmVJZCwgcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLCBpdGVtLm9ial9jYXRlZ29yeSwgZnJvbURyaXZlKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBzdHlsZSxcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW0uZmlkLFxcXFxuICAgICAgICAgICAgICAgIC8vaW5oZXJpdFRpdGxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICBjbHM6ICdwbGF5bGlzdCAnICsgaXRlbS5vYmpfY2F0ZWdvcnlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSlcXFxcbiAgICB9XFxcXG5cXFxcbn0pO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIkRvd25Ub29sXFxcIixcXFwicGF0aFxcXCI6XFxcIkRvd25Ub29sXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuXFxcXG5mdW5jdGlvbiBnZXREb3duQ1VSTCh1cmwsIGhlYWRlcnMsIGZpbGVuYW1lKSB7XFxcXG4gICAgLy8gU3RhcnQgYnVpbGRpbmcgdGhlIGN1cmwgY29tbWFuZCB3aXRoIHRoZSBVUkxcXFxcbiAgICBsZXQgY3VybENvbW1hbmQgPSBgY3VybCAtbyBcXFxcXFxcIiR7ZmlsZW5hbWV9XFxcXFxcXCIgXFxcXFxcXCIke3VybH1cXFxcXFxcImA7XFxcXG5cXFxcbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgY3VybCBjb21tYW5kIGlmIGFueSBhcmUgcHJvdmlkZWRcXFxcbiAgICBpZiAoaGVhZGVycyAmJiB0eXBlb2YgaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcXFxcbiAgICAgICAgY3VybENvbW1hbmQgKz0gT2JqZWN0LmVudHJpZXMoaGVhZGVycykucmVkdWNlKChjb21tYW5kLCBba2V5LCB2YWx1ZV0pID0+IHtcXFxcbiAgICAgICAgICAgIHJldHVybiBgJHtjb21tYW5kfSAtSCBcXFxcXFxcIiR7a2V5fTogJHt2YWx1ZX1cXFxcXFxcImA7XFxcXG4gICAgICAgIH0sICcgJyk7XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgcmV0dXJuIGN1cmxDb21tYW5kO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXREb3duQXJpYTJjKHVybCwgaGVhZGVycywgZmlsZW5hbWUsIGN1dCkge1xcXFxuICAgIC8vIFN0YXJ0IGJ1aWxkaW5nIHRoZSBhcmlhMmMgY29tbWFuZCB3aXRoIHRoZSBVUkwgYW5kIG51bWJlciBvZiBjb25uZWN0aW9ucy9zZWdtZW50c1xcXFxuICAgIGN1dCA9IGN1dCB8fCAxO1xcXFxuICAgIGN1dCA9IGN1dCA+IDE2ID8gMTYgOiBjdXQ7XFxcXG5cXFxcbiAgICBsZXQgYXJpYTJDb21tYW5kID0gYGFyaWEyYyAteCAke2N1dH0gLXMgJHtjdXR9IC1vIFxcXFxcXFwiJHtmaWxlbmFtZX1cXFxcXFxcIiBcXFxcXFxcIiR7dXJsfVxcXFxcXFwiYDtcXFxcblxcXFxuICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSBhcmlhMmMgY29tbWFuZCBpZiBhbnkgYXJlIHByb3ZpZGVkXFxcXG4gICAgaWYgKGhlYWRlcnMgJiYgdHlwZW9mIGhlYWRlcnMgPT09ICdvYmplY3QnKSB7XFxcXG4gICAgICAgIGFyaWEyQ29tbWFuZCArPSBPYmplY3QuZW50cmllcyhoZWFkZXJzKS5yZWR1Y2UoKGNvbW1hbmQsIFtrZXksIHZhbHVlXSkgPT4ge1xcXFxuICAgICAgICAgICAgcmV0dXJuIGAke2NvbW1hbmR9IC0taGVhZGVyPVxcXFxcXFwiJHtrZXl9OiAke3ZhbHVlfVxcXFxcXFwiYDtcXFxcbiAgICAgICAgfSwgJyAnKTtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICByZXR1cm4gYXJpYTJDb21tYW5kO1xcXFxufVxcXFxuZnVuY3Rpb24gZ2V0RGVmUnBjVXJsKCl7XFxcXG4gICAgbGV0IGRlZmlwID0gZ2V0SVAoKS5zcGxpdChcXFxcXFxcIi5cXFxcXFxcIik7XFxcXG4gICAgZGVmaXAucHVzaChOdW1iZXIoZGVmaXAucG9wKCkpICsgMik7XFxcXG4gICAgcmV0dXJuIFxcXFxcXFwiaHR0cDovL1xcXFxcXFwiICsgZGVmaXAuam9pbihcXFxcXFxcIi5cXFxcXFxcIikgKyBcXFxcXFxcIjoxNjgwMC9qc29ucnBjXFxcXFxcXCI7XFxcXG59XFxcXG5mdW5jdGlvbiB1cGRhdGVScGModXJsLCBoZWFkZXJzLCBmaWxlbmFtZSkge1xcXFxuICAgIC8vbG9nKGhlYWRlcnMpXFxcXG4gICAgbGV0IGhlYWRlciA9IFtdO1xcXFxuICAgIGxldCBycGNEYXRhID0ge1xcXFxuICAgICAgICBpZDogRGF0ZS5ub3coKSxcXFxcbiAgICAgICAganNvbnJwYzogXFxcXFxcXCIyLjBcXFxcXFxcIixcXFxcbiAgICAgICAgbWV0aG9kOiBcXFxcXFxcImFyaWEyLmFkZFVyaVxcXFxcXFwiLFxcXFxuICAgICAgICBwYXJhbXM6IFtcXFxcXFxcInRva2VuOlxcXFxcXFwiICsgZ2V0SXRlbShcXFxcXFxcInJwY0FyaWFUb2tlblxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSwgW3VybF0sIHtcXFxcbiAgICAgICAgICAgIGRpcjogZ2V0SXRlbShcXFxcXFxcInJwY0Rvd25EaXJcXFxcXFxcIixcXFxcXFxcIlxcXFxcXFwiKXx8dm9pZCAwLFxcXFxuICAgICAgICAgICAgb3V0OiBmaWxlbmFtZSxcXFxcbiAgICAgICAgICAgIGhlYWRlclxcXFxuICAgICAgICB9XVxcXFxuICAgIH07XFxcXG5cXFxcbiAgICBpZiAoaGVhZGVycyAmJiB0eXBlb2YgaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcXFxcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoaGVhZGVycykuZm9yRWFjaChba2V5LCB2YWx1ZV0gPT4ge1xcXFxuICAgICAgICAgICAgaGVhZGVyLnB1c2goYCR7a2V5fTogJHt2YWx1ZX1gKTtcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIFxcXFxuICAgIGxldCByZXMgPSBwb3N0KGdldEl0ZW0oXFxcXFxcXCJycGNVcmxcXFxcXFxcIiwgZ2V0RGVmUnBjVXJsKCkpLCB7XFxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJwY0RhdGEpXFxcXG4gICAgfSk7XFxcXG4gICAgcmV0dXJuIHJlcy5pbmNsdWRlcygnXFxcXFxcXCJyZXN1bHRcXFxcXFxcIjonKTtcXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzPXtcXFxcbiAgICBnZXREb3duQ1VSTCxcXFxcbiAgICBnZXREb3duQXJpYTJjLFxcXFxuICAgIHVwZGF0ZVJwYyxcXFxcbiAgICBnZXREZWZScGNVcmxcXFxcbn07XFxcXG5cXFwifV1cIixcInByb3h5XCI6XCJcIn0iLCJwaWNVcmwiOiJodHRwOi8vMTIzLjU2LjEwNS4xNDUvdHViaWFvL21lc3N5LzI3LnN2ZyIsInRpdGxlIjoi5paw5qaC5b+16Z2S5bCR5bm054mIIn0=
Add Comment
Please, Sign In to add comment