Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@DrpyHiker@eyJmaXJzdEhlYWRlciI6ImNsYXNzIiwibGFzdF9jaGFwdGVyX3J1bGUiOiIiLCJ0aXRsZSI6IkRycHlIaWtlciIsImF1dGhvciI6IkFyaWVzIiwidXJsIjoiaGlrZXI6Ly9lbXB0eSMjZnlwYWdlIiwidmVyc2lvbiI6NDksImNvbF90eXBlIjoibW92aWVfMyIsImNsYXNzX25hbWUiOiIiLCJ0eXBlIjoidmlkZW8iLCJjbGFzc191cmwiOiIiLCJhcmVhX25hbWUiOiIiLCJhcmVhX3VybCI6IiIsInNvcnRfbmFtZSI6IiIsInllYXJfbmFtZSI6IiIsInNvcnRfdXJsIjoiIiwieWVhcl91cmwiOiIiLCJmaW5kX3J1bGUiOiJqczokLnJlcXVpcmUoXCJNaWFuTG9hZFwiKTsiLCJzZWFyY2hfdXJsIjoiaGlrZXI6Ly9lbXB0eT9zPSoqJnBhZ2U9ZnlwYWdlIiwiZ3JvdXAiOiLikaDmjqjojZAiLCJzZWFyY2hGaW5kIjoianM6XG4oZnVuY3Rpb24gKCkge1xuICBsZXQge1xuICAgIHVpX2NvbmZpZyxcbiAgfSA9ICQucmVxdWlyZShcIlVJTWFuYWdlXCIpO1xuICB1aV9jb25maWc9dWlfY29uZmlnLnlpO1xuXG4gIGxldCBzbW9kZSA9IE51bWJlcihnZXRJdGVtKFwic21vZGVcIiwgXCIwXCIpKTtcbiAgbGV0IHRlbXNtb2RlID0gZ2V0TXlWYXIoXCJ0ZW1zbW9kZVwiLCBcIlwiKTtcbiAgaWYgKHRlbXNtb2RlKSB7XG4gICAgc21vZGUgPSBOdW1iZXIodGVtc21vZGUpO1xuICAgIGNsZWFyTXlWYXIoXCJ0ZW1zbW9kZVwiKTtcbiAgfVxuICBpZiAoIWZpbGVFeGlzdChcImhpa2VyOi8vZmlsZXMvZGF0YS9cIiArIE1ZX1JVTEUudGl0bGUgKyBcIi9saWJzX2hpa2VyL2RycHkyLmpzXCIpKSByZXR1cm4gc2V0UmVzdWx0KFt7XG4gICAgdGl0bGU6IFwi6K+35YmN5b6A5bCP56iL5bqP5Li76aG16K6+572uZHJweVBhdGhcIixcbiAgICB1cmw6IFwiaGlrZXI6Ly9ob21lQFwiICsgTVlfUlVMRS50aXRsZVxuICB9XSk7XG4gIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFwicnVudGltZUNvbmZpZ1wiKTtcbiAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXCJEcnB5TWFuYWdlXCIpO1xuICBpZiAoIXJ1bnRpbWVDb25maWcuaXNQcmVwYXJlZCgpKSByZXR1cm4gc2V0UmVzdWx0KFt7XG4gICAgdGl0bGU6IFwi6K+35YmN5b6A5bCP56iL5bqP5Li76aG16K6+572u5rqQXCIsXG4gICAgdXJsOiBcImhpa2VyOi8vaG9tZUBcIiArIE1ZX1JVTEUudGl0bGVcbiAgfV0pO1xuXG4gIGlmIChzbW9kZSA9PT0gMCkge1xuICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcbiAgICBpZiAoIXNvdXJjZS5zZWFyY2hhYmxlKSByZXR1cm4gc2V0UmVzdWx0KFt7XG4gICAgICB0aXRsZTogXCLlvZPliY3mupDkuI3mlK/mjIHmkJzntKJcIixcbiAgICAgIHVybDogXCJoaWtlcjovL2VtcHR5XCJcbiAgICB9XSk7XG4gICAgbGV0IGRycHkgPSBEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KTtcblxuICAgIGxldCBob21lTGlzdCA9IFtdXG4gICAgdHJ5IHtcbiAgICAgIGhvbWVMaXN0ID0gSlNPTi5wYXJzZShkcnB5LnNlYXJjaChNWV9LRVlXT1JELCBmYWxzZSwgTVlfUEFHRSkpLmxpc3QgfHwgW107XG4gICAgfSBjYXRjaCB7IH1cbiAgICBsZXQgZCA9IFtdO1xuICAgIGxldCBza2lwRXIgPSBkcnB5LmdldFJ1bGUoXCLkuoznuqdcIikgPT09IFwiKlwiICYmIGdldEl0ZW0oXCJza2lwRXJcIiwgXCJcIik7XG5cbiAgICBmb3IgKGxldCBpdCBvZiBob21lTGlzdCkge1xuICAgICAgbGV0IGNpZDtcbiAgICAgIGxldCBpZCA9IFN0cmluZyhpdC52b2RfaWQpO1xuICAgICAgbGV0IHVybCA9IFwiaGlrZXI6Ly9wYWdlL2RldGFpbGVkXCIrdWlfY29uZmlnLm1hcms7XG4gICAgICBpZiAoc2tpcEVyKSB7XG4gICAgICAgIHVybCA9ICQoKS5sYXp5UnVsZSgoc291cmNlLCBpZCwgbXkpID0+IHtcbiAgICAgICAgICBsZXQgdXJsO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcIkRycHlNYW5hZ2VcIik7XG4gICAgICAgICAgICBsZXQgZHJweSA9IERycHlNYW5hZ2UuZ2V0QnlTb3VyY2Uoc291cmNlKTtcbiAgICAgICAgICAgIHVybCA9IEpTT04ucGFyc2UoZHJweS5kZXRhaWwoaWQpKS5saXN0WzBdLnZvZF9wbGF5X3VybC5zcGxpdChcIiRcIilbMV07XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy9sb2coZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHVybCA9IGlkLnNwbGl0KFwiQEBcIilbMF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9ICQucmVxdWlyZShcInZpZGVvVXJsXCIpLnBhcnNlKHVybCwgaWQsIHNvdXJjZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vbG9nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LCBzb3VyY2UsIGlkLCBNWV9SVUxFLnRpdGxlKTtcbiAgICAgICAgY2lkID0gaWQ7XG4gICAgICB9XG5cbiAgICAgIGQucHVzaCh7XG4gICAgICAgIHRpdGxlOiBpdC52b2RfbmFtZSxcbiAgICAgICAgZGVzYzogaXQudm9kX3JlbWFya3MgKyBcIsK3XCIgKyBzb3VyY2UubmFtZSxcbiAgICAgICAgY29udGVudDogaXQudm9kX2NvbnRlbnQsXG4gICAgICAgIHVybDogdXJsLFxuICAgICAgICBwaWNfdXJsOiBpdC52b2RfcGljLFxuICAgICAgICBjb2xfdHlwZTogXCJtb3ZpZV8zXCIsXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgaWQ6IGNpZCxcbiAgICAgICAgICB2b2RJZDogaWQsXG4gICAgICAgICAgaW1nOiBpdC52b2RfcGljLFxuICAgICAgICAgIHNuYW1lOiBzb3VyY2UubmFtZSxcbiAgICAgICAgICBza2V5OiBzb3VyY2Uua2V5LFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgc2V0UmVzdWx0KGQpO1xuICB9IGVsc2Uge1xuICAgIHNldFJlc3VsdChbe1xuICAgICAgdGl0bGU6IFwi54K55oiR5byA5aeL6IGa5ZCI5pCc57SiXCIgKyBNWV9LRVlXT1JELFxuICAgICAgdXJsOiBcImhpa2VyOi8vc2VhcmNoP3M9XCIgKyBNWV9LRVlXT1JELFxuICAgICAgZXh0cmE6IHtcbiAgICAgICAgZGVsZWdhdGVPbmx5U2VhcmNoOiB0cnVlLFxuICAgICAgICBydWxlczogJC50b1N0cmluZygoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFwicnVudGltZUNvbmZpZ1wiLCBcInJ1bnRpbWVDb25maWdcIik7XG4gICAgICAgICAgICBsZXQgc21vZGUgPSBOdW1iZXIoZ2V0SXRlbShcInNtb2RlXCIsIFwiMFwiKSk7XG4gICAgICAgICAgICBsZXQgbGlzdCA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsb3dTZWFyY2hTb3VyY2Uoc21vZGUgPT09IDIpO1xuXG4gICAgICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XG5cbiAgICAgICAgICAgIGxldCBsaXN0aSA9IGxpc3QuZmluZEluZGV4KHggPT4geC5rZXkgPT0gc291cmNlLmtleSk7XG5cbiAgICAgICAgICAgIGxldCBzZWFyY2hzb3J0ID0gTnVtYmVyKGdldEl0ZW0oXCJzZWFyY2hzb3J0XCIsIFwiMFwiKSk7XG4gICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICBuYXR1cmFsU29ydCxcbiAgICAgICAgICAgICAgdXNpbmdTb3J0XG4gICAgICAgICAgICB9ID0gJC5yZXF1aXJlKFwibWV0aG9kc1wiKTtcblxuICAgICAgICAgICAgaWYgKHNlYXJjaHNvcnQgPiAwKSB7XG4gICAgICAgICAgICAgIGlmIChzZWFyY2hzb3J0ID09IDEpIHtcbiAgICAgICAgICAgICAgICBuYXR1cmFsU29ydChsaXN0LCBcIm5hbWVcIik7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VhcmNoc29ydCA9PSAyKSB7XG4gICAgICAgICAgICAgICAgdXNpbmdTb3J0LnNldGtleShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgdXNpbmdTb3J0LmdldChsaXN0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzb3VyY2Uuc2VhcmNoYWJsZSAmJiBsaXN0aSAhPSAtMSkge1xuICAgICAgICAgICAgICBsaXN0LnNwbGljZShsaXN0LmluZGV4T2Yoc291cmNlKSwgMSk7XG4gICAgICAgICAgICAgIGxpc3QudW5zaGlmdChzb3VyY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcnVsZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGl0Lm5hbWUsXG4gICAgICAgICAgICAgICAgc2VhcmNoX3VybDogXCJoaWtlcjovL2VtcHR5P3BhZ2U9ZnlwYWdlJnNlYXJjaFRlcm1zPSoqXCIsXG4gICAgICAgICAgICAgICAgc2VhcmNoRmluZDogXCJqczpcIiArICQudG9TdHJpbmcoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgICAgICAgIHVpX2NvbmZpZyxcbiAgICAgICAgICAgICAgICAgIH0gPSAkLnJlcXVpcmUoXCJVSU1hbmFnZVwiKTtcbiAgICAgICAgICAgICAgICAgIHVpX2NvbmZpZz11aV9jb25maWcueWk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBsZXQgZHJweSA9IEdNLmRlZmluZU1vZHVsZShcIkRycHlNYW5hZ2VcIikuZ2V0KGl0ZW0ua2V5KTtcbiAgICAgICAgICAgICAgICAgIGxldCBob21lTGlzdCA9IEpTT04ucGFyc2UoZHJweS5zZWFyY2goTVlfS0VZV09SRCwgZmFsc2UsIE1ZX1BBR0UpKS5saXN0IHx8IFtdO1xuICAgICAgICAgICAgICAgICAgbGV0IHNraXBFciA9IGRycHkuZ2V0UnVsZShcIuS6jOe6p1wiKSA9PT0gXCIqXCIgJiYgZ2V0SXRlbShcInNraXBFclwiLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgIGxldCBkID0gW107XG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBob21lTGlzdCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2lkO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBTdHJpbmcoaXQudm9kX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IFwiaGlrZXI6Ly9wYWdlL2RldGFpbGVkXCIrdWlfY29uZmlnLm1hcms7XG4gICAgICAgICAgICAgICAgICAgIGlmIChza2lwRXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICB1cmwgPSAkKCkubGF6eVJ1bGUoKHNvdXJjZSwgaWQsIG15KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXCJEcnB5TWFuYWdlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHJweSA9IERycHlNYW5hZ2UuZ2V0QnlTb3VyY2Uoc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gSlNPTi5wYXJzZShkcnB5LmRldGFpbChpZCkpLmxpc3RbMF0udm9kX3BsYXlfdXJsLnNwbGl0KFwiJFwiKVsxXTsgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xvZyhlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBpZC5zcGxpdChcIkBAXCIpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICQucmVxdWlyZShcInZpZGVvVXJsXCIpLnBhcnNlKHVybCwgaWQsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgfSwgaXRlbSwgaWQsTVlfUlVMRS5fdGl0bGUpO1xuICAgICAgICAgICAgICAgICAgICAgIGNpZCA9IGlkO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQudm9kX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZGVzYzogaXQudm9kX3JlbWFya3MsXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudDogaXQudm9kX2NvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgcGljX3VybDogaXQudm9kX3BpYyxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXCJtb3ZpZV8zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2b2RJZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1BvbHltZXJpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWc6IGl0LnZvZF9waWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzbmFtZTogaXRlbS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2tleTogaXRlbS5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChkKTtcbiAgICAgICAgICAgICAgICB9LCBpdClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocnVsZXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XSk7XG4gIH1cbn0pKCkiLCJkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwiZGV0YWlsX2ZpbmRfcnVsZSI6IiIsInNkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwic2RldGFpbF9maW5kX3J1bGUiOiIiLCJ1YSI6Im1vYmlsZSIsInByZVJ1bGUiOiIvKjwkPlxuQGluY2x1ZGUgc3RhcnRcbmh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5MTYmYXV0aD0xZDM1ZThmMC0yMmU4LTUyNzAtYTlkMS04MjZmNTNmMTc3YWRcbkBpbmNsdWRlIGVuZFxuPCQ+Ki9cbiIsInBhZ2VzIjoiW3tcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJkcnB5XCIsXCJwYXRoXCI6XCJkcnB5XCIsXCJydWxlXCI6XCJjb25zdCBza2V5ID0gbW9kdWxlLmltcG9ydFBhcmFtO1xcblxcbmZ1bmN0aW9uIGluaXRIaWtlcigpIHtcXG4gIGNvbnN0IGlzQ2xvc2VMb2cgPSAhZ2V0SXRlbShcXFwidXNlTG9nXFxcIiwgXFxcIlxcXCIpO1xcbiAgY29uc3QgbG9jYWxLZXkgPSBcXFwiZHJweVxcXCI7XFxuICBjb25zdCBDcnlwdG9VdGlsID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2Fzc2V0cy9jcnlwdG8tamF2YS5qc1xcXCIpO1xcbiAgZ2xvYmFsVGhpcy5sb2NhbCA9IHtcXG4gICAgc2V0KHJ1bGVrZXksIGssIHYpIHtcXG4gICAgICBzdG9yYWdlMC5zZXRJdGVtKGxvY2FsS2V5ICsgXFxcIkBcXFwiICsgcnVsZWtleSArIFxcXCJAXFxcIiArIGssIHYpO1xcbiAgICB9LFxcbiAgICBnZXQocnVsZWtleSwgaywgdikge1xcbiAgICAgIHJldHVybiBnZXRJdGVtKGxvY2FsS2V5ICsgXFxcIkBcXFwiICsgcnVsZWtleSArIFxcXCJAXFxcIiArIGssIFxcXCJcXFwiKSB8fCB2O1xcbiAgICB9LFxcbiAgICBkZWxldGUocnVsZWtleSwgaykge1xcbiAgICAgIHN0b3JhZ2UwLmNsZWFySXRlbShsb2NhbEtleSArIFxcXCJAXFxcIiArIHJ1bGVrZXkgKyBcXFwiQFxcXCIgKyBrKTtcXG4gICAgfVxcbiAgfTtcXG4gIGdsb2JhbFRoaXMuZ2V0UHJveHkgPSBmdW5jdGlvbiAoKSB7XFxuICAgIHJldHVybiBnZXRNeVZhcihcXFwiUHJveHlfVXJsXFxcIiwgXFxcImh0dHA6Ly8xMjcuMC4wLjE6NTIwMjAvcHJveHlcXFwiKSArIFxcXCI/aGlrZXJTa2V5PVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoc2tleSkgKyBcXFwiJmRvPWpzXFxcIjtcXG4gIH1cXG4gIGV2YWwoZ2V0Q3J5cHRvSlMoKSk7XFxuICBnbG9iYWxUaGlzLkNyeXB0b0pTID0gQ3J5cHRvSlM7XFxuXFxuICBsZXQgJHJlcXVlc3QgPSByZXF1ZXN0O1xcbiAgbGV0ICRwb3N0ID0gcG9zdDtcXG5cXG4gIGZ1bmN0aW9uIHJlYWRGaWxlVG9TdHJpbmcoZmlsZVBhdGgpIHtcXG4gICAgY29uc3QgU3RyaW5nQnVpbGRlciA9IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyO1xcbiAgICBjb25zdCBCdWZmZXJlZFJlYWRlciA9IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7XFxuICAgIGNvbnN0IEZpbGUgPSBqYXZhLmlvLkZpbGU7XFxuICAgIGNvbnN0IEZpbGVSZWFkZXIgPSBqYXZhLmlvLkZpbGVSZWFkZXI7XFxuXFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpO1xcbiAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHJldHVybiBcXFwiXFxcIjtcXG4gICAgbGV0IGZpbGVDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcXG4gICAgbGV0IGJyID0gbnVsbDtcXG4gICAgdHJ5IHtcXG4gICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7XFxuICAgICAgbGV0IGxpbmU7XFxuICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkge1xcbiAgICAgICAgZmlsZUNvbnRlbnQuYXBwZW5kKGxpbmUpLmFwcGVuZChcXFwiXFxcXG5cXFwiKTtcXG4gICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICBmaWxlQ29udGVudC5hcHBlbmQoXFxcIlxcXCIpO1xcbiAgICB9IGZpbmFsbHkge1xcbiAgICAgIHRyeSB7XFxuICAgICAgICBpZiAoYnIgIT0gbnVsbCkge1xcbiAgICAgICAgICBici5jbG9zZSgpO1xcbiAgICAgICAgfVxcbiAgICAgIH0gY2F0Y2ggKGUpIHsgfVxcbiAgICB9XFxuICAgIHJldHVybiBTdHJpbmcoZmlsZUNvbnRlbnQudG9TdHJpbmcoKSk7XFxuICB9XFxuICBmdW5jdGlvbiBoYXNQcm9wZXJ0eUlnbm9yZUNhc2Uob2JqLCBwcm9wZXJ0eU5hbWUpIHtcXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikuc29tZShrZXkgPT5cXG4gICAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gcHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKClcXG4gICAgKTtcXG4gIH1cXG4gIFxcbiAgZnVuY3Rpb24gdmFsdWVTdGFydHNXaXRoKG9iaiwgcHJvcGVydHlOYW1lLCBwcmVmaXgpIHtcXG4gICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMob2JqKS5maW5kKGtleSA9PlxcbiAgICAgIGtleS50b0xvd2VyQ2FzZSgpID09PSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKVxcbiAgICApO1xcbiAgICByZXR1cm4ga2V5ICE9PSB1bmRlZmluZWQgJiYgb2JqW2tleV0uc3RhcnRzV2l0aChwcmVmaXgpO1xcbiAgfVxcblxcbiAgZ2xvYmFsVGhpcy5yZXEgPSBmdW5jdGlvbiAodXJsLCBjb2JqKSB7XFxuICAgIHRyeSB7XFxuICAgICAgbGV0IHJlcyA9IHt9O1xcbiAgICAgIGxldCBvYmogPSBPYmplY3QuYXNzaWduKHt9LCBjb2JqKTtcXG4gICAgICBpZiAob2JqLmRhdGEpIHtcXG4gICAgICAgIG9iai5ib2R5ID0gb2JqLmRhdGE7XFxuICAgICAgICBpZiAoKG9iai5wb3N0VHlwZSAmJiBvYmoucG9zdFR5cGUgPT0gXFxcImZvcm1cXFwiKSB8fCAoaGFzUHJvcGVydHlJZ25vcmVDYXNlKG9iai5oZWFkZXJzLCBcXFwiQ29udGVudC1UeXBlXFxcIikgJiYgdmFsdWVTdGFydHNXaXRoKG9iai5oZWFkZXJzLCBcXFwiQ29udGVudC1UeXBlXFxcIiwgXFxcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcXCIpKSkge1xcbiAgICAgICAgICBsZXQgdGVtcF9vYmogPSBvYmouZGF0YTtcXG4gICAgICAgICAgb2JqLmJvZHkgPSBPYmplY3Qua2V5cyh0ZW1wX29iaikubWFwKGtleSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIGAke2tleX09JHt0ZW1wX29ialtrZXldfWA7XFxuICAgICAgICAgIH0pLmpvaW4oJyYnKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGRlbGV0ZSBvYmouZGF0YTtcXG4gICAgICB9XFxuXFxuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShcXFwicmVkaXJlY3RcXFwiKSkgb2JqLnJlZGlyZWN0ID0gISFvYmoucmVkaXJlY3Q7XFxuICAgICAgaWYgKG9iai5idWZmZXIgPT09IDIpIHtcXG4gICAgICAgIG9iai50b0hleCA9IHRydWU7XFxuICAgICAgfVxcbiAgICAgIG9iai5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7XFxuICAgICAgICBDb29raWU6IFxcXCIjbm9Db29raWUjXFxcIlxcbiAgICAgIH0sIG9iai5oZWFkZXJzKTtcXG4gICAgICBpZiAodXJsID09PSBcXFwiaHR0cHM6Ly9hcGkubm4uY2kvb2NyL2I2NC90ZXh0XFxcIiAmJiBvYmouaGVhZGVycykge1xcbiAgICAgICAgb2JqLmhlYWRlcnNbXFxcIkNvbnRlbnQtVHlwZVxcXCJdID0gXFxcInRleHQvcGxhaW5cXFwiO1xcbiAgICAgIH1cXG4gICAgICBsZXQgaXNGaWxlID0gdXJsLnN0YXJ0c1dpdGgoXFxcImZpbGU6Ly9cXFwiKTtcXG4gICAgICBpZiAoaXNGaWxlICYmICh1cmwuaW5jbHVkZXMoXFxcIj90eXBlPVxcXCIpIHx8IHVybC5pbmNsdWRlcyhcXFwiP3BhcmFtcz1cXFwiKSkpIHtcXG4gICAgICAgIHVybCA9IHVybC5zbGljZSgwLCB1cmwubGFzdEluZGV4T2YoXFxcIj9cXFwiKSk7XFxuICAgICAgfVxcbiAgICAgIGZvciAobGV0IGtleSBpbiBvYmouaGVhZGVycykge1xcbiAgICAgICAgaWYgKHR5cGVvZiBvYmouaGVhZGVyc1trZXldICE9PSBcXFwic3RyaW5nXFxcIikge1xcbiAgICAgICAgICBvYmouaGVhZGVyc1trZXldID0gU3RyaW5nKG9iai5oZWFkZXJzW2tleV0pO1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgICBsZXQgciA9IFxcXCJcXFwiO1xcbiAgICAgIGlmIChpc0ZpbGUpIHtcXG4gICAgICAgIHIgPSByZWFkRmlsZVRvU3RyaW5nKHVybC5yZXBsYWNlKFxcXCJmaWxlOi8vXFxcIiwgXFxcIlxcXCIpKTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgciA9ICRyZXF1ZXN0KHVybCwgb2JqKTtcXG4gICAgICB9XFxuICAgICAgaWYgKG9iai53aXRoSGVhZGVycykge1xcbiAgICAgICAgciA9IEpTT04ucGFyc2Uocik7XFxuICAgICAgICByZXMuY29udGVudCA9IHIuYm9keTtcXG4gICAgICAgIHJlcy5oZWFkZXJzID0ge307XFxuICAgICAgICBmb3IgKGxldCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoci5oZWFkZXJzIHx8IHt9KSkge1xcbiAgICAgICAgICByZXMuaGVhZGVyc1trXSA9IHZbMF07XFxuICAgICAgICB9XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHJlcy5jb250ZW50ID0gcjtcXG4gICAgICB9XFxuICAgICAgaWYgKG9iai5idWZmZXIgPT09IDIpIHtcXG4gICAgICAgIHJlcy5jb250ZW50ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KHJlcy5jb250ZW50KS50b0Jhc2U2NChfYmFzZTY0Lk5PX1dSQVApO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gcmVzO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgbG9nKFxcXCJFcnJvclxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcbiAgICB9XFxuICB9XFxuICAvKlxcbiAgY29uc3QgSmluSmEgPSAkLnJlcXVpcmUoXFxcImh0dHBzOi8vY2RuLmJvb3RjZG4ubmV0L2FqYXgvbGlicy9tdXN0YWNoZS5qcy80LjEuMC9tdXN0YWNoZS5qc1xcXCIpO1xcbiBcXG4gIGNvbnN0IEpQID0gJC5yZXF1aXJlKFxcXCJodHRwczovL2pzb25wYXRoLXBsdXMuZ2l0aHViLmlvL0pTT05QYXRoL2Rpc3QvaW5kZXgtYnJvd3Nlci11bWQuY2pzXFxcIik7XFxuICBnbG9iYWxUaGlzLmNoZWVyaW8gPSB7XFxuICAgICAgamluamEyKHRlbXBsYXRlLCBvYmopIHtcXG4gICAgICAgICAgXFxuICAgICAgICAgIHJldHVybiAkLmxvZyhKaW5KYS5yZW5kZXIodGVtcGxhdGUsIG9iaikpO1xcbiAgICAgIH0sXFxuICAgICAganAocGF0aCwganNvbikge1xcbiAgICAgICAgICByZXR1cm4gSlAuSlNPTlBhdGgoe1xcbiAgICAgICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgICAgIGpzb25cXG4gICAgICAgICAgfSlbMF07XFxuICAgICAgfVxcbiAgfSovXFxuICBnbG9iYWxUaGlzLnBkZmEgPSBfcGRmYTtcXG4gIFxcbiAgZ2xvYmFsVGhpcy5wZCA9IF9wZDtcXG4gIGdsb2JhbFRoaXMucGRmaCA9IF9wZGZoO1xcbiAgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHNlYXJjaCwgcmVwbGFjZW1lbnQpIHtcXG4gICAgcmV0dXJuIHRoaXMuc3BsaXQoc2VhcmNoKS5qb2luKHJlcGxhY2VtZW50KTtcXG4gIH07XFxuICBsZXQgJHRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xcbiAgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xcbiAgICByZXR1cm4gJHRvU3RyaW5nLmFwcGx5KHRoaXMpLnRyaW0oKTtcXG4gIH07XFxuICBpZiAoaXNDbG9zZUxvZykge1xcbiAgICAvLyDph43lhpljb25zb2xlLmxvZ+WHveaVsFxcbiAgICBjb25zb2xlLmxvZyA9IGZ1bmN0aW9uICgpIHtcXG4gICAgICAvLyDmo4Dmn6XkvKDlhaXlj4LmlbDnmoTmlbDph49cXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgIC8vIOWmguaenOWPguaVsOaVsOmHj+Wkp+S6jjHvvIzosIPnlKjljp/lp4vnmoRjb25zb2xlLmxvZ+WHveaVsFxcbiAgICAgICAgLy9vcmlnaW5hbExvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm47XFxuICAgICAgfVxcbiAgICAgIC8vIOWmguaenOWPguaVsOWPquacieS4gOS4qu+8jOWImeS4jeWBmuS7u+S9leaTjeS9nFxcbiAgICB9O1xcbiAgfVxcbn1cXG5pbml0SGlrZXIoKTtcXG5jb25zdCBkcnB5UGF0aCA9IGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvZGF0YS9cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCIvbGlic19oaWtlci9kcnB5Mi5qc1xcXCIpO1xcblxcbmlmICghZmlsZUV4aXN0KGRycHlQYXRoKSkge1xcbiAgdGhyb3cgbmV3IEVycm9yKFxcXCLnvLrlsJFkcnB5Lmpz6L+Q6KGM5bqTXFxcIik7XFxufVxcbmxldCBkcnB5ID0gJC5yZXF1aXJlKGRycHlQYXRoKTtcXG4vKlxcbmxldCBjdXJyZW50UGF0aCA9IFxcXCJcXFwiO1xcbmxldCAkaW5pdCA9IGRycHkuaW5pdDtcXG5kcnB5LmluaXQgPSBmdW5jdGlvbihleHQpIHtcXG4gICAgaWYgKGV4dCA9PT0gY3VycmVudFBhdGgpIHJldHVybjtcXG4gICAgJGluaXQuY2FsbCh0aGlzLCBleHQpO1xcbiAgICBjdXJyZW50UGF0aCA9IGV4dDtcXG59Ki9cXG5mdW5jdGlvbiBzeW5jKGZ1bmMsIHNwKSB7XFxuICByZXR1cm4gbmV3IG9yZy5tb3ppbGxhLmphdmFzY3JpcHQuU3luY2hyb25pemVyKGZ1bmMsIHNwIHx8IHt9KTtcXG59XFxuLy9kcnB5LnByb3h5ID0gc3luYyhkcnB5LnByb3h5LCBkcnB5KTtcXG5kcnB5LnBsYXkgPSBzeW5jKGRycHkucGxheSwgZHJweSk7XFxuJC5leHBvcnRzID0gZHJweTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzFfdmVydGljYWxfcGljX2JsdXJcIixcIm5hbWVcIjpcIuivpue7humhtemdolwiLFwicGF0aFwiOlwiZGV0YWlsZWRcIixcInJ1bGVcIjpcImpzOlxcbihmdW5jdGlvbiAoKSB7XFxuICBsZXQgY292ZXJfY29sID0gXFxcIm1vdmllXzFfdmVydGljYWxfcGljX2JsdXJcXFwiO1xcbiAgbGV0IGhlYWRfaW1nID0gXFxcIlxcXCI7XFxuICBpZiAoTVlfVVJMLmluY2x1ZGVzKFxcXCIjZ2FtZVRoZW1lI1xcXCIpKSB7XFxuICAgIGNvdmVyX2NvbCA9IFxcXCJtb3ZpZV8xX3ZlcnRpY2FsX3BpY1xcXCI7XFxuICAgIGhlYWRfaW1nID0gXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvdG9wLnBuZ1xcXCI7XFxuICB9XFxuXFxuICBsZXQgaWQgPSBNWV9QQVJBTVMudm9kSWQ7XFxuICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgR00uY2xlYXIoXFxcInJlbm92YXRlTGlzdFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJzb3J0aVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwYWdlbnVtXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIm5vcGFnZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwbGF5bGlzdF9yZWFkeVxcXCIpO1xcbiAgfSk7XFxuICBhZGRMaXN0ZW5lcignb25SZWZyZXNoJywgJC50b1N0cmluZygoaWQpID0+IHtcXG4gICAgLy9jbGVhck15VmFyKGlkICsgXFxcImVyaW5mb1xcXCIpXFxuICAgIGNsZWFyTXlWYXIoXFxcInBsYXlsaXN0X3JlYWR5XFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInNob3dpXFxcIik7XFxuICB9LCBpZCkpXFxuXFxuICBsZXQge1xcbiAgICB1aV9jb25maWcsXFxuICAgIGdldExpbmVTaG93LFxcbiAgfSA9ICQucmVxdWlyZShcXFwiVUlNYW5hZ2VcXFwiKTtcXG4gIGxldCBlcj11aV9jb25maWcuZXI7XFxuXFxuICAvL+aWueazlVxcbiAgbGV0IHtcXG4gICAgY2FjaGVNYW5hZ2UsXFxuICAgIGlzRGFya01vZGUsXFxuICAgIGZvbnRzdHlsZSxcXG4gICAgYmFja0NvbG9yLFxcbiAgICBmaW5kTG9uZ2VzdEVsZW1lbnQsXFxuICAgIGNvdW50VG90YWxCeXRlcyxcXG4gICAgaW5zZXJ0QXJyYXlBdCxcXG4gICAgaGlzdG9yeWxvZyxcXG4gICAgc3RyaW5nZXgsXFxuICAgIGFycmF5ZXgsXFxuICAgIGdldEVJbmZvLFxcbiAgICBlck9wdGlvbnMsXFxuICAgIHN1YnN0clxcbiAgfSA9ICQucmVxdWlyZShcXFwibWV0aG9kc1xcXCIpO1xcblxcbiAgc3RyaW5nZXgoKTtcXG4gIGFycmF5ZXgoKTtcXG4gIGVyT3B0aW9ucy5zZXQoXFxcInNrZXlcXFwiLCBNWV9QQVJBTVMuc2tleSk7XFxuICBlck9wdGlvbnMuc2V0KFxcXCJpZFxcXCIsIGlkKTtcXG4gIC8qbGV0IG9yZ2ludXBkYXRlSXRlbSA9IGdsb2JhbFRoaXMudXBkYXRlSXRlbTtcXG4gIGdsb2JhbFRoaXMudXBkYXRlSXRlbSA9IGZ1bmN0aW9uIChrZXksIG9iaikge1xcbiAgICAvL2xvZyhrZXkpXFxuICAgIG9yZ2ludXBkYXRlSXRlbShrZXksIG9iaik7XFxuICB9Ki9cXG5cXG4gIGxldCB7XFxuICAgIHNldERlc2MsXFxuICAgIGZpbmRJY29uLFxcbiAgfSA9ICQucmVxdWlyZShcXFwibWV0aG9kc19lclxcXCIpO1xcblxcbiAgbGV0IHNvcnRvYmogPSBbe1xcbiAgICB0aXRsZTogZm9udHN0eWxlKFxcXCLihr9cXFwiLCB7XFxuICAgICAgaDogZmFsc2UsXFxuICAgICAgYzogXFxcIiMxQUFEMTlcXFwiLFxcbiAgICAgIHRhZ3M6IFxcXCJiXFxcIlxcbiAgICB9KSArIGZvbnRzdHlsZShcXFwi4oeCXFxcIiwge1xcbiAgICAgIGg6IGZhbHNlLFxcbiAgICAgIHRhZ3M6IFxcXCJiXFxcIlxcbiAgICB9KSArIFxcXCJcXFxcdFxcXCIsXFxuICAgIGltZzogZXIuaWNvbnMu5q2j5bqPXFxuICB9LFxcbiAge1xcbiAgICB0aXRsZTogZm9udHN0eWxlKFxcXCLihr9cXFwiLCB7XFxuICAgICAgaDogZmFsc2UsXFxuICAgICAgdGFnczogXFxcImJcXFwiXFxuICAgIH0pICsgZm9udHN0eWxlKFxcXCLih4JcXFwiLCB7XFxuICAgICAgaDogZmFsc2UsXFxuICAgICAgYzogXFxcIiNGRjAwMDBcXFwiLFxcbiAgICAgIHRhZ3M6IFxcXCJiXFxcIlxcbiAgICB9KSArIFxcXCJcXFxcdFxcXCIsXFxuICAgIGltZzogZXIuaWNvbnMu5YCS5bqPXFxuICB9XFxuICBdXFxuXFxuICB2YXIgc29ydGkgPSBnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpO1xcblxcbiAgLy9sb2coc29ydG9iailcXG4gICQuZXh0ZW5kKHtcXG4gICAgZXJfdWk6IGVyLFxcbiAgICBzcGxpdFBhZ2UodG90YWxJdGVtcywgcGFnZVNpemUpIHtcXG4gICAgICBwYWdlU2l6ZSA9IE51bWJlcihwYWdlU2l6ZSk7XFxuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xcbiAgICAgIGlmIChwYWdlU2l6ZSA9PSAwKSB7XFxuICAgICAgICByZXR1cm4gW2AxLSR7dG90YWxJdGVtc31gXVxcbiAgICAgIH1cXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0b3RhbEl0ZW1zOyBpICs9IHBhZ2VTaXplKSB7XFxuICAgICAgICBsZXQgZW5kID0gaSArIHBhZ2VTaXplIC0gMTtcXG4gICAgICAgIGlmIChlbmQgPiB0b3RhbEl0ZW1zKSB7XFxuICAgICAgICAgIGVuZCA9IHRvdGFsSXRlbXM7XFxuICAgICAgICB9XFxuICAgICAgICByZXN1bHQucHVzaChgJHtpfS0ke2VuZH1gKTtcXG4gICAgICB9XFxuICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgc3BsaXRBcnJheUJ5UmFuZ2VzKGFycmF5LCByYW5nZXMpIHtcXG4gICAgICAvLyDmoLnmja7ojIPlm7Tmi4bliIbmlbDnu4RcXG4gICAgICB2YXIgcmVzdWx0ID0gcmFuZ2VzLm1hcChmdW5jdGlvbiAocmFuZ2UpIHtcXG4gICAgICAgIHZhciBwYXJ0cyA9IHJhbmdlLnNwbGl0KCctJykubWFwKE51bWJlcik7XFxuICAgICAgICB2YXIgc3RhcnQgPSBwYXJ0c1swXSAtIDE7IC8vIOWHjzHmmK/lm6DkuLrmlbDnu4TntKLlvJXku44w5byA5aeLXFxuICAgICAgICB2YXIgZW5kID0gcGFydHNbMV0gLSAxO1xcbiAgICAgICAgLy8g5L2/55SoQXJyYXkucHJvdG90eXBlLnNsaWNl5p2l6I635Y+W5a2Q5pWw57uEXFxuICAgICAgICByZXR1cm4gYXJyYXkuc2xpY2Uoc3RhcnQsIGVuZCArIDEpOyAvLyDljIXmi6znu5PmnZ/ntKLlvJXvvIzmiYDku6XliqAxXFxuICAgICAgfSk7XFxuICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gIH0pXFxuXFxuICBsZXQgc291cmNlID0ge307XFxuICBpZiAoTVlfUEFSQU1TLnNvdXJjZSkge1xcbiAgICBzb3VyY2UgPSBNWV9QQVJBTVMuc291cmNlO1xcbiAgfSBlbHNlIHtcXG4gICAgY29uc3QgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmZpbmRTb3VyY2UoTVlfUEFSQU1TLnNrZXkpO1xcbiAgICBNWV9QQVJBTVMuc291cmNlID0gc291cmNlO1xcbiAgICBzZXRQYWdlUGFyYW1zKE1ZX1BBUkFNUyk7XFxuICB9XFxuXFxuICBjb25zdCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuXFxuICBEcnB5TWFuYWdlLmluaXRQYWdlKFxcXCJlclxcXCIpO1xcblxcbiAgbGV0IGRycHkgPSBEcnB5TWFuYWdlLmdldEJ5U291cmNlKHNvdXJjZSk7XFxuICBsZXQgc3R5cGUgPSBkcnB5LmdldFJ1bGUoXFxcIuexu+Wei1xcXCIpO1xcbiAgLypcXG5sZXQgaW5mbyA9IHN0b3JhZ2UwLmdldE15VmFyKGlkICsgXFxcImVyaW5mb1xcXCIsIFxcXCJcXFwiKTtcXG5cXG5pZiAoaW5mbyA9PSBcXFwiXFxcIikge1xcbiAgaW5mbyA9IEpTT04ucGFyc2UoZHJweS5kZXRhaWwoU3RyaW5nKGlkKSkpLmxpc3RbMF07XFxuICAgIHN0b3JhZ2UwLnB1dE15VmFyKGlkICsgXFxcImVyaW5mb1xcXCIsIGluZm8pXFxuICB9XFxuICAqL1xcbiAgbGV0IFtsZmMsIGxiY10gPSBlci7mtYXmnaXmupDoibIuc3BsaXQoLzsvKS5maWx0ZXIoZSA9PiBlKTtcXG4gIGxldCBbbmZjLCBuYmNdID0gZXIu5rex5p2l5rqQ6ImyLnNwbGl0KC87LykuZmlsdGVyKGUgPT4gZSk7XFxuICBsZXQgZGFya21vZGUgPSBpc0RhcmtNb2RlKCk7XFxuICBsZXQgY3MgPSB7XFxuICAgIC8vZmM6ICcjNzM3QTgwJyxcXG4gICAgZmM6IGxmYyxcXG4gICAgYmM6IGxiYyxcXG4gICAgLy9iYzogJyNGN0Y4RkEnLFxcbiAgfVxcbiAgaWYgKGRhcmttb2RlKSB7XFxuICAgIGNzID0ge1xcbiAgICAgIGZjOiBuZmMsXFxuICAgICAgYmM6IG5iYyxcXG4gICAgfVxcbiAgfVxcblxcbiAgbGV0IGluZm8gPSBjYWNoZU1hbmFnZS5nZXQoTVlfUEFSQU1TLnNuYW1lICsgaWQpO1xcbiAgaWYgKE9iamVjdC5rZXlzKGluZm8pLmxlbmd0aCA9PSAwKSB7XFxuICAgIGluZm8gPSBKU09OLnBhcnNlKGRycHkuZGV0YWlsKFN0cmluZyhpZCkpKS5saXN0WzBdO1xcbiAgICBpZiAoZXIu5LqM57qn57yT5a2YKSB7XFxuICAgICAgY2FjaGVNYW5hZ2Uuc2V0KE1ZX1BBUkFNUy5zbmFtZSArIGlkLCBpbmZvKTtcXG4gICAgfVxcbiAgfVxcblxcbiAgbGV0IFvlr7zmvJQsIOS4u+a8lF0gPSBbaW5mby52b2RfZGlyZWN0b3IsIGluZm8udm9kX2FjdG9yXVxcbiAgaWYgKE1ZX1BBUkFNUy5pbWcgPT0gdW5kZWZpbmVkIHx8IE1ZX1BBUkFNUy5pbWcgPT0gXFxcIlxcXCIpIHtcXG4gICAgaWYgKGluZm8udm9kX3BpYyAhPSBcXFwiXFxcIikge1xcbiAgICAgIHNldFBhZ2VQaWNVcmwoaW5mby52b2RfcGljKTtcXG4gICAgICBNWV9QQVJBTVMuaW1nID0gaW5mby52b2RfcGljO1xcbiAgICAgIHNldFBhZ2VQYXJhbXMoTVlfUEFSQU1TKTtcXG4gICAgfVxcbiAgfVxcbiAg5a+85ryUID0g5a+85ryUID09IFxcXCLlr7zmvJRcXFwiID8gdW5kZWZpbmVkIDog5a+85ryUXFxuICDkuLvmvJQgPSDkuLvmvJQgPT0gXFxcIuS4u+a8lFxcXCIgPyB1bmRlZmluZWQgOiDkuLvmvJRcXG4gIGlmICjlr7zmvJQgIT0gdW5kZWZpbmVkICYmIOWvvOa8lCAhPSBcXFwiXFxcIikge1xcbiAgICDlr7zmvJQgPSBTdHJpbmco5a+85ryUKS5TcGxpdCgvXFxcXC8vZywgdHJ1ZSkuam9pbihcXFwiIFxcXCIpO1xcbiAgICDlr7zmvJQgPSAvWzrvvJpdLy50ZXN0KOWvvOa8lCkgPyDlr7zmvJQgOiBcXFwi5a+85ryUOlxcXCIgKyDlr7zmvJRcXG4gIH1cXG4gIGlmICjkuLvmvJQgIT0gdW5kZWZpbmVkICYmIOS4u+a8lCAhPSBcXFwiXFxcIikge1xcbiAgICDkuLvmvJQgPSBTdHJpbmco5Li75ryUKS5TcGxpdCgvXFxcXC8vZywgdHJ1ZSkuam9pbihcXFwiIFxcXCIpO1xcbiAgICDkuLvmvJQgPSAvWzrvvJpdLy50ZXN0KOS4u+a8lCkgPyDkuLvmvJQgOiBcXFwi5Li75ryUOlxcXCIgKyDkuLvmvJRcXG4gIH1cXG4gIGxldCBb5ZCN56ewLCDlpIfms6hdID0gW2luZm8udm9kX25hbWUsIGluZm8udm9kX3JlbWFya3NdXFxuICBpZiAo5aSH5rOoICE9IHVuZGVmaW5lZCAmJiDlpIfms6ggIT0gXFxcIlxcXCIpIHtcXG4gICAg5aSH5rOoID0gU3RyaW5nKOWkh+azqCkuU3BsaXQoL1xcXFwvL2csIHRydWUpLmpvaW4oXFxcIiBcXFwiKTtcXG4gICAg5aSH5rOoID0gL1s677yaXS8udGVzdCjlpIfms6gpID8g5aSH5rOoIDogXFxcIuWkh+azqDpcXFwiICsg5aSH5rOoO1xcbiAgfVxcbiAgbGV0IHRpdGxlcyA9IFvlkI3np7AsIOWkh+azqF07XFxuICBpbmZvLnZvZF9hcmVhID0gU3RyaW5nKGluZm8udm9kX2FyZWEpLlNwbGl0KC9cXFxcLy9nLCB0cnVlKS5qb2luKFxcXCIgXFxcIik7XFxuICBpbmZvLnZvZF95ZWFyID0gU3RyaW5nKGluZm8udm9kX3llYXIpLlNwbGl0KC9cXFxcLy9nLCB0cnVlKS5qb2luKFxcXCIgXFxcIik7XFxuICBsZXQgZGVzY3MgPSBb5a+85ryULCDkuLvmvJQsIGluZm8udm9kX2FyZWEsIGluZm8udm9kX3llYXJdO1xcblxcbiAgLy8gdGl0bGVzLnB1c2goXFxuICAvLyAgIGZvbnRzdHlsZShmb250c3R5bGUoXFxcIuadpea6kDogXFxcIiwgeyBoOiBmYWxzZSwgdGFnczogXFxcImJcXFwiIH0pICsgYmFja0NvbG9yKE1ZX1BBUkFNUy5zbmFtZSwgY3MpLCB7IGg6IGZhbHNlLCB0YWdzOiBcXFwic21hbGx8c21hbGxcXFwiIH0pXFxuICAvLyApXFxuXFxuICBpbnNlcnRBcnJheUF0KHRpdGxlcywgMSwgJ+KAnOKAnOKAneKAnScgKyBmb250c3R5bGUoZm9udHN0eWxlKFxcXCLmnaXmupA6IFxcXCIsIHsgaDogZmFsc2UsIHRhZ3M6IFxcXCJiXFxcIiB9KSArIGJhY2tDb2xvcihNWV9QQVJBTVMuc25hbWUsIGNzKSwgeyBoOiBmYWxzZSwgdGFnczogXFxcInNtYWxsXFxcIiB9KVxcbiAgKVxcblxcbiAgbGV0IGQgPSBbXTtcXG4gIGlmIChoZWFkX2ltZyAhPSBcXFwiXFxcIikge1xcbiAgICBkLnB1c2goe1xcbiAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL3RvcC5wbmdcXFwiLFxcbiAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgIGNvbF90eXBlOiBcXFwicGljXzFfZnVsbFxcXCJcXG4gICAgfSlcXG4gIH1cXG5cXG4gIGQucHVzaCh7XFxuICAgIHRpdGxlOiB0aXRsZXMuZmlsdGVyKGUgPT4gZSkubWFwKCh4LCBpKSA9PiBpID4gMSA/IGZvbnRzdHlsZSh4LCB7XFxuICAgICAgdGFnczogXFxcInNtYWxsXFxcIlxcbiAgICB9KSA6IHgpLmpvaW4oXFxcIlxcXFxuXFxcIiksXFxuICAgIGRlc2M6IGRlc2NzLmZpbHRlcihlID0+IGUgJiYgZSAhPSBcXFwidW5kZWZpbmVkXFxcIikuam9pbihcXFwiXFxcXG5cXFwiKSxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGltZzogaW5mby52b2RfcGljIHx8IE1ZX1BBUkFNUy5pbWcsXFxuICAgIGNvbF90eXBlOiBjb3Zlcl9jb2wsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgZ3JhZGllbnQ6IGZhbHNlLFxcbiAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICB0aXRsZTogXFxcIuS6jOe6p+iuvue9rlxcXCIsXFxuICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL1VJTWFuYWdlP21vZGU95LqM57qnI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgICB9KVxcbiAgICAgIH1dXFxuICAgIH1cXG4gIH0pO1xcblxcbiAgLypkLnB1c2goe1xcbiAgICB0aXRsZTogJ+aVsOaNruadpea6kCcsXFxuICAgIGRlc2M6IFxcXCJcXFwiICsgYmFja0NvbG9yKE1ZX1BBUkFNUy5zbmFtZSwgY3MpICsgXFxcIlxcXFx0XFxcIixcXG4gICAgaW1nOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tZXNzeS8xMTAuc3ZnXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIlxcbiAgfSkqL1xcbiAgc2V0RGVzYyhkLCBpbmZvLnZvZF9jb250ZW50KVxcblxcbiAgbGV0IGZyb20gPSBbXTtcXG4gIGlmIChpbmZvLnZvZF9wbGF5X2Zyb20gIT0gdW5kZWZpbmVkKSB7XFxuICAgIGZyb20gPSBpbmZvLnZvZF9wbGF5X2Zyb20uc3BsaXQoXFxcIiQkJFxcXCIpO1xcbiAgfVxcblxcbiAgbGV0IHBsYXlMYXp5ID0gJChcXFwiXFxcIikubGF6eVJ1bGUoKHNvdXJjZSkgPT4ge1xcbiAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJ2aWRlb1VybFxcXCIpLnBhcnNlKGlucHV0LCBpbnB1dC5zcGxpdChcXFwiI1xcXCIpWzBdLCBzb3VyY2UpO1xcbiAgfSwgc291cmNlKTtcXG5cXG4gIGxldCBwYWdlc3ppZSA9IGVyLuWIhumhtTtcXG5cXG4gIGxldCBwbGF5VXJsTGlzdCA9IFtdO1xcbiAgLy9jb25zb2xlLmxvZyhpbmZvLnZvZF9wbGF5X3VybCk7XFxuICBsZXQgaXNOb3ZlbCA9IHN0eXBlID09PSBcXFwi5bCP6K+0XFxcIjtcXG4gIGxldCBwbGF5cGFnZXMgPSBbXTtcXG5cXG4gIGlmIChpbmZvLnZvZF9wbGF5X3VybCAmJiBpbmZvLnZvZF9wbGF5X3VybCAhPSBcXFwiXFxcIiAmJiBpbmZvLnZvZF9wbGF5X3VybC5zcGxpdChcXFwiJCQkXFxcIikuZmlsdGVyKGUgPT4gZSkubGVuZ3RoID4gMCkge1xcbiAgICBsZXQgY29sID0gXFxcInRleHRfNFxcXCI7XFxuICAgIGxldCB0ZXh0YWxpZ24gPSBcXFwiXFxcIjtcXG4gICAgcGxheVVybExpc3QgPSBpbmZvLnZvZF9wbGF5X3VybC5zcGxpdChcXFwiJCQkXFxcIikubWFwKCh0LCBpKSA9PiB7XFxuICAgICAgbGV0IGltZyA9IFxcXCJcXFwiO1xcbiAgICAgIGxldCB0cyA9IHQuc3BsaXQoXFxcIiNcXFwiKS5tYXAoKGspID0+IGsuc3BsaXQoXFxcIiRcXFwiKVswXSk7XFxuICAgICAgbGV0IHBhZ2VzID0gJC5zcGxpdFBhZ2UodHMubGVuZ3RoLCBwYWdlc3ppZSk7XFxuICAgICAgbGV0IHRjID0gY291bnRUb3RhbEJ5dGVzKGZpbmRMb25nZXN0RWxlbWVudCh0cykpO1xcbiAgICAgIGlmICh0cy5maWx0ZXIoZSA9PiBlICE9IFxcXCJcXFwiKS5sZW5ndGgpIHtcXG4gICAgICAgIHBsYXlwYWdlc1tpXSA9IHBhZ2VzO1xcbiAgICAgIH1cXG4gICAgICBpZiAodGMgPiAyNCkge1xcbiAgICAgICAgY29sID0gXFxcInRleHRfMVxcXCI7XFxuICAgICAgICBpbWcgPSBNWV9QQVJBTVMuaW1nIHx8IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL21vdmllLzE0Ni5zdmdcXFwiO1xcbiAgICAgIH0gZWxzZSBpZiAodGMgPj0gMTIgJiYgdGMgPCAxNSkge1xcbiAgICAgICAgY29sID0gXFxcInRleHRfM1xcXCI7XFxuICAgICAgfSBlbHNlIGlmICh0YyA+PSAxNSkge1xcbiAgICAgICAgY29sID0gXFxcInRleHRfMlxcXCI7XFxuICAgICAgICB0ZXh0YWxpZ24gPSBcXFwibGVmdFxcXCI7XFxuICAgICAgfVxcbiAgICAgIGxldCBwbGF5b2JqID0gdC5zcGxpdChcXFwiI1xcXCIpLm1hcCgoaiwgaWkpID0+IHtcXG4gICAgICAgIGxldCBrID0gai5zcGxpdChcXFwiJFxcXCIpO1xcbiAgICAgICAgbGV0IHQgPSBrWzBdO1xcbiAgICAgICAgbGV0IHVpZCA9IChrWzFdIHx8IGtbMF0pO1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgc3RpdGxlOiB0LFxcbiAgICAgICAgICB0aXRsZTogZm9udHN0eWxlKHQsIHtcXG4gICAgICAgICAgICB0YWdzOiBcXFwic21hbGxcXFwiXFxuICAgICAgICAgIH0pLFxcbiAgICAgICAgICBzdXJsOiB1aWQgKyBcXFwiI1xcXCIgKyBmcm9tW2ldLFxcbiAgICAgICAgICB1cmw6IGlzTm92ZWwgPyBcXFwiaGlrZXI6Ly9wYWdlL25vdmVsI2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcIiA6ICh1aWQgKyBcXFwiI1xcXCIgKyBmcm9tW2ldICsgcGxheUxhenkpLFxcbiAgICAgICAgICBjb2xfdHlwZTogY29sLFxcbiAgICAgICAgICBpbWc6IGltZyxcXG4gICAgICAgICAgLypleHRyYTogT2JqZWN0LmFzc2lnbih7fSwgZXh0cmEsIHtcXG4gICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IGRlY29kZVVSSUNvbXBvbmVudChrWzFdKSxcXG4gICAgICAgICAgICBpZDoga1sxXSxcXG4gICAgICAgICAgICAvL2xpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICB0ZXh0QWxpZ246IHRleHRhbGlnbixcXG4gICAgICAgICAgICBjbHM6IFxcXCJwbGF5bGlzdFxcXCIsXFxuICAgICAgICAgIH0pKi9cXG4gICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBmcm9tOiBmcm9tW2ldLFxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxcbiAgICAgICAgICAgIGlkOiB1aWQsXFxuICAgICAgICAgICAgYmxvY2tSdWxlczogWydiYi4qLnBuZycsICcuanBnJywgXFxcImhtXFxcXC5iYWlkdVxcXFwuY29tXFxcXC9obS5qc1xcXCJdLFxcbiAgICAgICAgICAgIHZpZGVvRXhjbHVkZVJ1bGVzOiBbJz91cmw9J10sXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIHRleHRBbGlnbjogdGV4dGFsaWduLFxcbiAgICAgICAgICAgIGNsczogXFxcInBsYXlsaXN0XFxcIixcXG4gICAgICAgICAgfVxcbiAgICAgICAgfTtcXG4gICAgICB9KTtcXG5cXG4gICAgICBpZiAoKHN0eXBlID09IFxcXCLmvKvnlLtcXFwiIHx8IHN0eXBlID09IFxcXCLlsI/or7RcXFwiKSAmJiBpID09IDApIHtcXG5cXG4gICAgICAgIHZhciBkb3dubG9hZGxhenkgPSAkLnRvU3RyaW5nKChrZXksIHNrZXksIHRpdGxlKSA9PiB7XFxuICAgICAgICAgIGxldCBkcnB5O1xcbiAgICAgICAgICBpZiAoJC5oaWtlcltcXFwiX19kcnB5X19cXFwiXSkge1xcbiAgICAgICAgICAgIGRycHkgPSAkLmhpa2VyW1xcXCJfX2RycHlfX1xcXCJdO1xcblxcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCB7XFxuICAgICAgICAgICAgICBHTVxcbiAgICAgICAgICAgIH0gPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5MTYmYXV0aD0xZDM1ZThmMC0yMmU4LTUyNzAtYTlkMS04MjZmNTNmMTc3YWRcXFwiKTtcXG4gICAgICAgICAgICBHTS5zZXRTZWxmS2V5KGtleSk7XFxuICAgICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiLCBcXFwiRHJweU1hbmFnZT9ydWxlPVxcXCIgKyB0aXRsZSk7XFxuICAgICAgICAgICAgZHJweSA9IERycHlNYW5hZ2UuZ2V0KHNrZXkpO1xcbiAgICAgICAgICAgICQuaGlrZXJbXFxcIl9fZHJweV9fXFxcIl0gPSBkcnB5O1xcbiAgICAgICAgICAgICQuaGlrZXJbXFxcIl9fdGVzdF9fXFxcIl0gPSBbXTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpbnB1dCA9IGlucHV0LnNwbGl0KFxcXCIjXFxcIik7XFxuICAgICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGRycHkucGxheShpbnB1dFsxXSwgaW5wdXRbMF0pKTtcXG4gICAgICAgICAgaWYgKHJlc3VsdC51cmwuc3RhcnRzV2l0aChcXFwicGljczovL1xcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC51cmw7XFxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnVybC5zdGFydHNXaXRoKFxcXCJub3ZlbDovL1xcXCIpKSB7XFxuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBKU09OLnBhcnNlKHJlc3VsdC51cmwucmVwbGFjZShcXFwibm92ZWw6Ly9cXFwiLCBcXFwiXFxcIikpLmNvbnRlbnQ7XFxuICAgICAgICAgICAgbGV0IGNtZDUgPSBtZDUoY29udGVudCk7XFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcXG4gICAgICAgICAgICBpZiAoKGluZGV4ID0gJC5oaWtlcltcXFwiX190ZXN0X19cXFwiXS5pbmRleE9mKGNtZDUpKSAhPT0gLTEpIHtcXG4gICAgICAgICAgICAgIGxvZyhcXFwi6YeN5aSN77yaXFxcIiArIGlucHV0ICsgXFxcIj0+XFxcIiArIGluZGV4KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgJC5oaWtlcltcXFwiX190ZXN0X19cXFwiXS5wdXNoKGNtZDUpO1xcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5ryr55S75oiW5q2j5paH6I635Y+W5aSx6LSlXFxcIik7XFxuICAgICAgICB9LCBHTS5nZXRTZWxmS2V5KCksIE1ZX1BBUkFNUy5za2V5LCBNWV9SVUxFLnRpdGxlKTtcXG5cXG4gICAgICAgIGxldCBjaGFwdGVyTGlzdCA9IHBsYXlvYmouZXhjbHVkZUtleXMoW1xcXCJzdXJsXFxcIiwgXFxcInN0aXRsZVxcXCJdLCBmYWxzZSkudHJhbnNmb3JtS2V5cyh7XFxuICAgICAgICAgIFxcXCJzdXJsXFxcIjogXFxcInVybFxcXCIsXFxuICAgICAgICAgIFxcXCJzdGl0bGVcXFwiOiBcXFwidGl0bGVcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvZHJfZG93X2xpc3QuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGNoYXB0ZXJMaXN0KSk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICB0aXRsZTogXFxcIuS4i+i9vVxcXCIgKyBzdHlwZSxcXG4gICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2Rvd25sb2FkLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub1JlZnJlc2gjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGJyxcXG4gICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBjaGFwdGVyTGlzdDogXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL2RyX2Rvd19saXN0Lmpzb25cXFwiLFxcbiAgICAgICAgICAgIGluZm86IHtcXG4gICAgICAgICAgICAgIGJvb2tOYW1lOiBpbmZvLnZvZF9uYW1lLCAvL+a8q+eUu+WQjeensCxcXG4gICAgICAgICAgICAgIHJ1bGVOYW1lOiBNWV9SVUxFLnRpdGxlLFxcbiAgICAgICAgICAgICAgYm9va1RvcFBpYzogaW5mby52b2RfcGljLFxcbiAgICAgICAgICAgICAgcGFyc2VDb2RlOiBkb3dubG9hZGxhenksXFxuICAgICAgICAgICAgICBib29rSWQ6IE1ZX1BBUkFNUy5zbmFtZSxcXG4gICAgICAgICAgICAgIHR5cGU6IHN0eXBlID09PSBcXFwi5ryr55S7XFxcIiA/IFxcXCJjb21pY1xcXCIgOiBcXFwibm92ZWxcXFwiLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZGVmYXVsdFZpZXc6IFxcXCIxXFxcIlxcbiAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgIHRpdGxlOiBcXFwi5pys5Zyw5Lmm5p62XFxcIixcXG4gICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL0Jvb2tyYWNrLnZpZXcjbm9SZWNvcmRIaXN0b3J5Iz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhiZydWxlTmFtZT0nICsgTVlfUlVMRS50aXRsZSxcXG4gICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0eXBlOiBzdHlwZSA9PT0gXFxcIua8q+eUu1xcXCIgPyBcXFwiY29taWNcXFwiIDogXFxcIm5vdmVsXFxcIixcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSwge1xcbiAgICAgICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJ1xcbiAgICAgICAgfSk7XFxuICAgICAgfVxcblxcbiAgICAgIHBsYXlvYmogPSAkLnNwbGl0QXJyYXlCeVJhbmdlcyhwbGF5b2JqLCBwYWdlcyk7XFxuICAgICAgcmV0dXJuIHBsYXlvYmo7XFxuICAgIH0pO1xcbiAgfSBlbHNlIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogXFxcIuaaguaXoOaSreaUvua6kOaIluaSreaUvuWIl+ihqOWumuS9jemUmeivr1xcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICB1cmw6IE1ZX1BBUkFNUy52b2RJZCxcXG4gICAgfSk7XFxuICAgIHNldFJlc3VsdChkKTtcXG4gIH1cXG5cXG5cXG4gIGxldCBjdXJyZW50TG9jYXRpb24gPSAwO1xcblxcbiAgaWYgKGZyb20ubGVuZ3RoKSB7XFxuICAgIGVyT3B0aW9ucy5zZXQoXFxcImZyb21cXFwiLCBmcm9tKTtcXG4gICAgZXJPcHRpb25zLnNldChcXFwidG90YWxcXFwiLCBwbGF5VXJsTGlzdC5tYXAoeCA9PiB4Lmxlbmd0aCkpO1xcbiAgICBlck9wdGlvbnMuc2V0KFxcXCJwbGF5c1xcXCIsIHBsYXlVcmxMaXN0Lm1hcCh4ID0+IHguZmxhdCgpLmxlbmd0aCkpO1xcbiAgfVxcblxcblxcbiAgZnVuY3Rpb24gcmVub3ZhdGVMaXN0KGxvY2F0aW9uKSB7XFxuICAgIC8vZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5cGFnZVxcXCIpO1xcbiAgICAvL2RlbGV0ZUl0ZW1CeUNscyhcXFwicGxheWxpc3RcXFwiKTtcXG5cXG4gICAgaWYgKHBsYXlVcmxMaXN0Lmxlbmd0aCA9PSAwKSB7XFxuICAgICAgcmV0dXJuO1xcbiAgICB9XFxuICAgIGxldCBoaXMgPSBoaXN0b3J5bG9nKFxcXCJnZXRcXFwiLCBNWV9QQVJBTVMuc2tleSwgbWQ1KE1ZX1BBUkFNUy52b2RJZCkpO1xcblxcblxcbiAgICBsZXQgcGFnZW51bSA9IGdldE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgKGhpcyB8fCBcXFwiMFxcXCIpKTtcXG5cXG4gICAgbGV0IHBjb3VudCA9IHBsYXlVcmxMaXN0W2xvY2F0aW9uXS5sZW5ndGg7XFxuICAgIGxldCBsaXN0ID0gcGxheVVybExpc3RbbG9jYXRpb25dW3BhZ2VudW1dO1xcbiAgICBpZiAoIWxpc3QpIHtcXG4gICAgICBmb3IgKGxldCBpID0gcGFnZW51bTsgaSA+PSAwOyBpLS0pIHtcXG4gICAgICAgIGxpc3QgPSBwbGF5VXJsTGlzdFtsb2NhdGlvbl1baV07XFxuICAgICAgICBpZiAobGlzdCkge1xcbiAgICAgICAgICBwYWdlbnVtID0gaTtcXG4gICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpID09IDEpIHtcXG4gICAgICBsaXN0LnJldmVyc2UoKTtcXG4gICAgfVxcbiAgICAkLmV4dGVuZCh7XFxuICAgICAgdGVtcF9saXN0OiBwbGF5VXJsTGlzdFtsb2NhdGlvbl0sXFxuICAgIH0pXFxuICAgIGxldCBwbGF5cCA9IHBsYXlwYWdlc1tsb2NhdGlvbl07XFxuICAgIGlmIChwbGF5cCA9PSB1bmRlZmluZWQpIHtcXG4gICAgICBwbGF5cCA9IFtdO1xcbiAgICB9XFxuICAgIGxldCB0cGxheSA9IHBsYXlwLnNsaWNlKCk7XFxuXFxuICAgIC8vZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5cGFnZVxcXCIpXFxuICAgIC8vcGxheXAgJiYgcGxheXAubGVuZ3RoID4gMVxcbiAgICAvL2VyT3B0aW9ucy5nZXQoXFxcInRvdGFsXFxcIikuc29tZSh4PT54PjEpXFxuICAgIGxldCBib29sID0gKCFlci7liIbpobXpgLvovpEgfHwgZXIu5YiG6aG16YC76L6RID09IFxcXCIwXFxcIiA/IGVyT3B0aW9ucy5nZXQoXFxcInRvdGFsXFxcIikuc29tZSh4ID0+IHggPiAxKSA6IHBsYXlwICYmIHBsYXlwLmxlbmd0aCA+IDEpO1xcblxcbiAgICBpZiAoYm9vbCkge1xcbiAgICAgIGlmIChwbGF5cCAmJiBwbGF5cC5sZW5ndGggPiAxKSB7XFxuICAgICAgICBlck9wdGlvbnMuc2V0KFxcXCJwbGF5cFxcXCIsIHBsYXlwKTtcXG4gICAgICB9XFxuICAgICAgaGlzdG9yeWxvZyhcXFwic2V0XFxcIiwgTVlfUEFSQU1TLnNrZXksIG1kNShNWV9QQVJBTVMudm9kSWQpLCB7XFxuICAgICAgICB0aXRsZTogaW5mby52b2RfbmFtZSxcXG4gICAgICAgIHBhZ2U6IHBhZ2VudW0sXFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxcbiAgICAgIH0pO1xcbiAgICAgIGxldCB0ZW1wID0ge1xcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgY2xzOiBcXFwicGFnZW5hdlxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9XFxuXFxuICAgICAgdHBsYXkgPSBwbGF5cC5tYXAoKHgsIGkpID0+IHtcXG4gICAgICAgIGxldCBvYmogPSBPYmplY3QuYXNzaWduKHt9LCB0ZW1wLCB7XFxuICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChwYWdlbnVtID09IGkgPyB4LmZvbnRjb2xvcihlci7nur/ot6/popzoibIpIDogeCksXFxuICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSwgaWQsIHBhZ2VudW0pID0+IHtcXG4gICAgICAgICAgICBsZXQgbG9jYXRpb24gPSBnZXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBwYWdlbnVtKSA9PSBpKSB7XFxuICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgU3RyaW5nKGkpKTtcXG4gICAgICAgICAgICBsZXQgZXJyID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIikuZXJSZWZyZXNoO1xcbiAgICAgICAgICAgIHJldHVybiBlcnIobG9jYXRpb24pO1xcbiAgICAgICAgICB9LCBpLCBpZCwgcGFnZW51bSksXFxuICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCB0ZW1wLmV4dHJhLCB7XFxuICAgICAgICAgICAgaWQ6IFxcXCJwYWdlbnVtXFxcIiArIGksXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9KVxcbiAgICAgICAgcmV0dXJuIG9iajtcXG4gICAgICB9KVxcblxcbiAgICAgIGxldCBmYyA9IFxcXCJcXFwiO1xcbiAgICAgIGlmICghKHBsYXlwICYmIHBsYXlwLmxlbmd0aCA+IDEpKSB7XFxuICAgICAgICBmYyA9IFxcXCJncmV5XFxcIjtcXG4gICAgICB9XFxuXFxuICAgICAgbGV0IHBhZ2VvYmogPSBbe1xcbiAgICAgICAgdGl0bGU6IGZvbnRzdHlsZSgn5LiK5LiA6aG1Jywge1xcbiAgICAgICAgICBjOiBmY1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkLCBwY291bnQsIHBhZ2VudW0pID0+IHtcXG4gICAgICAgICAgbGV0IGxvY2F0aW9uID0gZ2V0TXlWYXIoaWQgKyBcXFwic291cmNlaVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgIGxldCBlZiA9ICQucmVxdWlyZShcXFwibWV0aG9kc1xcXCIpLmdldEVJbmZvKCk7XFxuICAgICAgICAgIGxldCBwY291bnQgPSBlZi5tYXhbbG9jYXRpb25dO1xcbiAgICAgICAgICBsZXQgcGFnZW51bSA9IGVmLnBhZ2VudW07XFxuICAgICAgICAgIGlmIChwY291bnQgPT0gMSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKHBhZ2VudW0gPT0gMCkge1xcbiAgICAgICAgICAgIHBhZ2VudW0gPSBwY291bnQgLSAxO1xcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHBhZ2VudW0tLTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBwdXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFN0cmluZyhwYWdlbnVtKSk7XFxuICAgICAgICAgIGxldCBlcnIgPSAkLnJlcXVpcmUoXFxcIm1ldGhvZHNcXFwiKS5lclJlZnJlc2g7XFxuICAgICAgICAgIHJldHVybiBlcnIobG9jYXRpb24pO1xcbiAgICAgICAgfSwgaWQsIHBjb3VudCwgU3RyaW5nKHBhZ2VudW0pKSxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGNsczogXFxcInBsYXlwYWdlXFxcIixcXG4gICAgICAgICAgaWQ6IFxcXCJwbGF5cGFnZUB1cFxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogZm9udHN0eWxlKHBsYXlwW3BhZ2VudW1dLCB7XFxuICAgICAgICAgIGM6IGZjXFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQsIHBhZ2VudW0pID0+IHtcXG4gICAgICAgICAgbGV0IGxvY2F0aW9uID0gZ2V0TXlWYXIoaWQgKyBcXFwic291cmNlaVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgIGxldCBwYWdlbnVtID0gZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBwYWdlbnVtKTtcXG4gICAgICAgICAgbGV0IGVmID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIikuZ2V0RUluZm8oKTtcXG4gICAgICAgICAgbGV0IHBjb3VudCA9IGVmLm1heFtsb2NhdGlvbl07XFxuICAgICAgICAgIGlmIChwY291bnQgPT0gMSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgbGV0IHBsYXlwID0gZWYucGxheXA7XFxuICAgICAgICAgIGxldCBlciA9ICQucmVxdWlyZShcXFwiVUlNYW5hZ2VcXFwiKS51aV9jb25maWcuZXI7XFxuICAgICAgICAgIGVyLue6v+i3r+agt+W8jyA9IGVyLue6v+i3r+agt+W8j3x8J3Njcm9sbF9idXR0b24nO1xcbiAgICAgICAgICBsZXQgcGFnZWFyciA9IHBsYXlwLm1hcCgoeCwgaSkgPT4gaSA9PSBwYWdlbnVtID8gJ+KAnOKAnOKAneKAnScgKyB4LmZvbnRjb2xvcihlci7nur/ot6/popzoibIpIDogeCk7XFxuICAgICAgICAgIHJldHVybiAkKHBhZ2VhcnIsIDMpLnNlbGVjdCgobG9jYXRpb24sIGVyKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcoTVlfSU5ERVgpKTtcXG4gICAgICAgICAgICBpZiAoZXIu5LqM57qn5Yi35pawKSB7XFxuICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJwbGF5bGlzdF9yZWFkeVxcXCIpO1xcbiAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICB9LCBsb2NhdGlvbiwgZXIpXFxuICAgICAgICB9LCBpZCwgcGFnZW51bSksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCIsXFxuICAgICAgICAgIGlkOiBcXFwicGxheXBhZ2VAcGFnZWFyclxcXCIsXFxuICAgICAgICB9XFxuICAgICAgfSwge1xcbiAgICAgICAgdGl0bGU6IGZvbnRzdHlsZSgn5LiL5LiA6aG1Jywge1xcbiAgICAgICAgICBjOiBmY1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkKSA9PiB7XFxuICAgICAgICAgIGxldCBsb2NhdGlvbiA9IGdldE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgICBsZXQgZWYgPSAkLnJlcXVpcmUoXFxcIm1ldGhvZHNcXFwiKS5nZXRFSW5mbygpO1xcbiAgICAgICAgICBsZXQgcGNvdW50ID0gZWYubWF4W2xvY2F0aW9uXTtcXG4gICAgICAgICAgbGV0IHBhZ2VudW0gPSBlZi5wYWdlbnVtO1xcbiAgICAgICAgICBpZiAocGNvdW50ID09IDEpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGlmIChwYWdlbnVtID49IHBjb3VudCAtIDEpIHtcXG4gICAgICAgICAgICBwYWdlbnVtID0gMDtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwYWdlbnVtKys7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcocGFnZW51bSkpO1xcbiAgICAgICAgICBsZXQgZXJyID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIikuZXJSZWZyZXNoO1xcbiAgICAgICAgICByZXR1cm4gZXJyKGxvY2F0aW9uKTtcXG4gICAgICAgIH0sIGlkKSxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGNsczogXFxcInBsYXlwYWdlXFxcIixcXG4gICAgICAgICAgaWQ6IFxcXCJwbGF5cGFnZUBuZXh0XFxcIlxcbiAgICAgICAgfVxcbiAgICAgIH1dXFxuXFxuICAgICAgaWYgKGVyLuWIhumhteWvvOiIqikge1xcbiAgICAgICAgcGFnZW9iaiA9IHBhZ2VvYmouY29uY2F0KHRwbGF5KTtcXG4gICAgICB9XFxuXFxuICAgICAgbGV0IHBsaW5lID0gZC5maW5kSW5kZXgoeCA9PiB4LmV4dHJhICYmIHguZXh0cmEuaWQgPT0gXFxcInBsYXlwYWdlbGluZVxcXCIpO1xcblxcbiAgICAgIGlmIChnZXRNeVZhcihcXFwicGxheWxpc3RfcmVhZHlcXFwiLCBcXFwiMFxcXCIpID09IFxcXCIwXFxcIikge1xcbiAgICAgICAgaWYgKHBsaW5lID4gLTEpIHtcXG4gICAgICAgICAgaW5zZXJ0QXJyYXlBdChkLCBwbGluZSArIDEsIHBhZ2VvYmopO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy9BcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkLHBhZ2VvYmopO1xcbiAgICAgICAgLy9hZGRJdGVtQWZ0ZXIoXFxcInBsYXlwYWdlbGluZVxcXCIsIHBhZ2VvYmopO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcIm5vcGFnZVxcXCIsIFxcXCIwXFxcIikgPT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheXBhZ2VsaW5lXFxcIiwgcGFnZW9iaik7XFxuICAgICAgICAgIGNsZWFyTXlWYXIoXFxcIm5vcGFnZVxcXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCFlci7kuoznuqfliLfmlrApIHtcXG4gICAgICAgICAgdXBkYXRlSXRlbShcXFwicGxheXBhZ2VAdXBcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IHBhZ2VvYmpbMF0udGl0bGUsXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcInBsYXlwYWdlQHBhZ2VhcnJcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IHBhZ2VvYmpbMV0udGl0bGUsXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcInBsYXlwYWdlQG5leHRcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IHBhZ2VvYmpbMl0udGl0bGUsXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9XFxuICAgICAgICBpZiAoZXIu5YiG6aG15a+86IiqKSB7XFxuICAgICAgICAgIGlmICghZXIu5LqM57qn5Yi35pawKSB7XFxuICAgICAgICAgICAgbGV0IHBuID0gZmluZEl0ZW1zQnlDbHMoXFxcInBhZ2VuYXZcXFwiKVxcbiAgICAgICAgICAgIGlmIChwbi5sZW5ndGggPiBwbGF5cC5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgIHBuID0gcG4uc2xpY2UocGxheXAubGVuZ3RoKVxcbiAgICAgICAgICAgICAgcG4ubWFwKHggPT4ge1xcbiAgICAgICAgICAgICAgICBkZWxldGVJdGVtKHguZXh0cmEuaWQpXFxuICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAocG4ubGVuZ3RoIDwgcGxheXAubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICBsZXQgcGlkID0gcG4uYXQoLTEpO1xcbiAgICAgICAgICAgICAgbGV0IGFkZCA9IHRwbGF5LnNsaWNlKHBuLmxlbmd0aCk7XFxuICAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIocGlkLmV4dHJhLmlkLCBhZGQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0cGxheS5mb3JFYWNoKCh4LCBpKSA9PiB7XFxuICAgICAgICAgICAgICB1cGRhdGVJdGVtKFxcXCJwYWdlbnVtXFxcIiArIGksIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHgudGl0bGUsXFxuICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICB9XFxuXFxuICAgICAgLy8gYWRkSXRlbUFmdGVyKFxcXCJwbGF5cGFnZWxpbmVcXFwiLCBbe1xcbiAgICAgIC8vICAgdGl0bGU6ICfkuIrkuIDpobUnLFxcbiAgICAgIC8vICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzRcXFwiLFxcbiAgICAgIC8vICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChsb2NhdGlvbiwgcGNvdW50KSA9PiB7XFxuICAgICAgLy8gICAgIGxldCBwYWdlbnVtID0gZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgIC8vICAgICBpZiAocGFnZW51bSA9PSAwKSB7XFxuICAgICAgLy8gICAgICAgcGFnZW51bSA9IHBjb3VudCAtIDE7XFxuICAgICAgLy8gICAgIH0gZWxzZSB7XFxuICAgICAgLy8gICAgICAgcGFnZW51bS0tO1xcbiAgICAgIC8vICAgICB9XFxuICAgICAgLy8gICAgIHB1dE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgU3RyaW5nKHBhZ2VudW0pKTtcXG4gICAgICAvLyAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7IH0pKGxvY2F0aW9uKTtcXG4gICAgICAvLyAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAvLyAgIH0sIGxvY2F0aW9uLCBwY291bnQpLFxcbiAgICAgIC8vICAgZXh0cmE6IHtcXG4gICAgICAvLyAgICAgY2xzOiBcXFwicGxheXBhZ2VcXFwiXFxuICAgICAgLy8gICB9XFxuICAgICAgLy8gfSwge1xcbiAgICAgIC8vICAgdGl0bGU6IHBsYXlwW3BhZ2VudW1dLFxcbiAgICAgIC8vICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgIC8vICAgdXJsOiAkKHBhZ2VhcnIsIDMpLnNlbGVjdCgobG9jYXRpb24pID0+IHtcXG4gICAgICAvLyAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcoTVlfSU5ERVgpKTtcXG4gICAgICAvLyAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7IH0pKGxvY2F0aW9uKTtcXG4gICAgICAvLyAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgIC8vICAgfSwgbG9jYXRpb24pLFxcbiAgICAgIC8vICAgZXh0cmE6IHtcXG4gICAgICAvLyAgICAgY2xzOiBcXFwicGxheXBhZ2VcXFwiXFxuICAgICAgLy8gICB9XFxuICAgICAgLy8gfSwge1xcbiAgICAgIC8vICAgdGl0bGU6ICfkuIvkuIDpobUnLFxcbiAgICAgIC8vICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzRcXFwiLFxcbiAgICAgIC8vICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChsb2NhdGlvbiwgcGNvdW50KSA9PiB7XFxuICAgICAgLy8gICAgIGxldCBwYWdlbnVtID0gZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgIC8vICAgICBpZiAocGFnZW51bSA+PSBwY291bnQgLSAxKSB7XFxuICAgICAgLy8gICAgICAgcGFnZW51bSA9IDA7XFxuICAgICAgLy8gICAgIH0gZWxzZSB7XFxuICAgICAgLy8gICAgICAgcGFnZW51bSsrO1xcbiAgICAgIC8vICAgICB9XFxuICAgICAgLy8gICAgIHB1dE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgU3RyaW5nKHBhZ2VudW0pKTtcXG4gICAgICAvLyAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7IH0pKGxvY2F0aW9uKTtcXG4gICAgICAvLyAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAvLyAgIH0sIGxvY2F0aW9uLCBwY291bnQpLFxcbiAgICAgIC8vICAgZXh0cmE6IHtcXG4gICAgICAvLyAgICAgY2xzOiBcXFwicGxheXBhZ2VcXFwiXFxuICAgICAgLy8gICB9XFxuICAgICAgLy8gfV0pXFxuICAgICAgLypwbGF5cCA9IHBsYXlwLm1hcCgoeCwgaSkgPT4ge1xcbiAgICAgICAgIGxldCBvYmogPSBPYmplY3QuYXNzaWduKHt9LCB0ZW1wLCB7XFxuICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAocGFnZW51bSA9PSBpID8geC5mb250Y29sb3IoXFxcInJlZFxcXCIpIDogeCksXFxuICAgICAgICAgICBjb2xfdHlwZTpcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICAgICAgICAgaWYgKGdldE15VmFyKFxcXCJwYWdlbnVtXFxcIikgPT0gaSkge1xcbiAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICBwdXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFN0cmluZyhpKSk7XFxuICAgICAgICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFwicGxheWxpc3RcXFwiKTtcXG4gICAgICAgICAgICAgYWRkSXRlbUFmdGVyKFxcXCJwbGF5bGlzdHNcXFwiLCAkLnRlbXBfbGlzdFtpXSk7XFxuICAgICAgICAgICAgIGZpbmRJdGVtc0J5Q2xzKFxcXCJwbGF5cGFnZVxcXCIpLmZvckVhY2goKHgsIGlpKSA9PiB7XFxuICAgICAgICAgICAgICAgbGV0IHRpdGxlID0geC50aXRsZS5yZXBsYWNlKC/igJh84oCZfOKAnHzigJ18PFtePl0rPi9nLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgaWYgKGlpID09IGkpIHtcXG4gICAgICAgICAgICAgICAgIHRpdGxlID0gJ+KAnOKAnOKAneKAnScgKyB0aXRsZS5mb250Y29sb3IoXFxcInJlZFxcXCIpO1xcbiAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICB1cGRhdGVJdGVtKHguZXh0cmEuaWQsIHtcXG4gICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgfSwgaSksXFxuICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih7fSwgdGVtcC5leHRyYSwge1xcbiAgICAgICAgICAgICBpZDogXFxcInBhZ2VudW1cXFwiICsgaSxcXG4gICAgICAgICAgIH0pXFxuICAgICAgICAgfSlcXG4gICAgICAgICByZXR1cm4gb2JqO1xcbiAgICAgICB9KVxcbiAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlwYWdlbGluZVxcXCIsIHBsYXlwKSovXFxuICAgIH0gZWxzZSB7XFxuICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwYWdlbmF2XFxcIik7XFxuICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5cGFnZVxcXCIpO1xcbiAgICAgIHB1dE15VmFyKFxcXCJub3BhZ2VcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICB9XFxuXFxuICAgIGlmIChnZXRNeVZhcihcXFwicGxheWxpc3RfcmVhZHlcXFwiLCBcXFwiMFxcXCIpID09IFxcXCIxXFxcIikge1xcbiAgICAgIGxldCBvbGRJZHMgPSAoZmluZEl0ZW1zQnlDbHMoJ3BsYXlsaXN0JykgfHwgW10pLm1hcChpdCA9PiBpdC5leHRyYS5pZCk7XFxuICAgICAgbGV0IHRvRGVsZXRlSWRzID0gW107IC8v5b6F5Yig6Zmk55qE5penaWRcXG4gICAgICBsZXQgdG9BZGREYXRhcyA9IFtdOyAvL+W+heaWsOWinueahOaWsOaVsOaNrlxcbiAgICAgIGlmIChvbGRJZHMubGVuZ3RoID4gbGlzdC5sZW5ndGgpIHtcXG4gICAgICAgIHRvRGVsZXRlSWRzID0gb2xkSWRzLnNsaWNlKGxpc3QubGVuZ3RoKTtcXG4gICAgICB9IGVsc2UgaWYgKG9sZElkcy5sZW5ndGggPCBsaXN0Lmxlbmd0aCkge1xcbiAgICAgICAgdG9BZGREYXRhcyA9IGxpc3Quc2xpY2Uob2xkSWRzLmxlbmd0aClcXG4gICAgICB9XFxuICAgICAgbGV0IGNudCA9IE1hdGgubWluKG9sZElkcy5sZW5ndGgsIGxpc3QubGVuZ3RoKTtcXG4gICAgICBpZiAodG9EZWxldGVJZHMubGVuZ3RoID4gMCkge1xcbiAgICAgICAgLy/mnInliKDpmaTnmoTlhYjliKDpmaRcXG4gICAgICAgIGRlbGV0ZUl0ZW0odG9EZWxldGVJZHMpO1xcbiAgICAgICAgLyp0b0RlbGV0ZUlkcy5mb3JFYWNoKGlkPT57XFxuICAgICAgICAgIGRlbGV0ZUl0ZW0oaWQpO1xcbiAgICAgICAgfSkqL1xcbiAgICAgIH1cXG4gICAgICBpZiAodG9BZGREYXRhcy5sZW5ndGggPiAwKSB7XFxuICAgICAgICAvL+acieaWsOWinueahOWFiOaWsOWinlxcbiAgICAgICAgYWRkSXRlbUFmdGVyKG9sZElkc1tjbnQgLSAxXSwgdG9BZGREYXRhcyk7XFxuICAgICAgfVxcbiAgICAgIC8vc2hvd0xvYWRpbmcoJ+WKoOi9veS4rScpXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbnQ7IGkrKykge1xcbiAgICAgICAgLy/mnIDlkI7pobrluo/mm7TmlrBcXG4gICAgICAgIHVwZGF0ZUl0ZW0ob2xkSWRzW2ldLCBsaXN0W2ldKTtcXG4gICAgICB9XFxuICAgIH0gZWxzZSB7XFxuXFxuICAgICAgLy9sb2cobGlzdC5sZW5ndGgpXFxuICAgICAgaWYgKGxpc3QpIHtcXG4gICAgICAgIGxldCBwbHMgPSBkLmZpbmRJbmRleCh4ID0+IHguZXh0cmEgJiYgeC5leHRyYS5pZCA9PSBcXFwicGxheWxpc3RzXFxcIik7XFxuICAgICAgICBpZiAocGxzID4gLTEpIHtcXG4gICAgICAgICAgaW5zZXJ0QXJyYXlBdChkLCBwbHMgKyAxLCBsaXN0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZCxsaXN0KTtcXG4gICAgICAgIC8vYWRkSXRlbUFmdGVyKFxcXCJwbGF5bGlzdHNcXFwiLCBsaXN0KTtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJwbGF5bGlzdF9yZWFkeVxcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgfVxcbiAgICB9XFxuXFxuICAgIC8qbGV0IHBhZ2VsaW5lcyA9IGZpbmRJdGVtc0J5Q2xzKFxcXCJsb2NhdGlvbkBcXFwiKTtcXG4gICAgaWYgKGdldE15VmFyKFxcXCJwbGF5bGlzdF9yZWFkeVxcXCIsIFxcXCIwXFxcIikgPT0gXFxcIjFcXFwiKSB7XFxuICAgICAgcGFnZWxpbmVzPXBhZ2VsaW5lcy5tYXAoeD0+e1xcbiAgICAgICAgeC5jb2xfdHlwZT14LnR5cGU7XFxuICAgICAgICByZXR1cm4geDtcXG4gICAgICB9KVxcbiAgICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFwibG9jYXRpb25AXFxcIik7XFxuICAgICAgYWRkSXRlbUJlZm9yZShcXFwicGxheXBhZ2VsaW5lXFxcIiwgcGFnZWxpbmVzKTtcXG4gICAgfSovXFxuXFxuICAgIC8qaWYgKGxpc3QpIHtcXG4gICAgICBkZWxldGVJdGVtQnlDbHMoXFxcInBsYXlsaXN0XFxcIik7XFxuICAgICAgbGV0IHBscyA9IGQuZmluZEluZGV4KHggPT4geC5leHRyYSAmJiB4LmV4dHJhLmlkID09IFxcXCJwbGF5bGlzdHNcXFwiKTtcXG4gICAgICBpZiAocGxzID4gLTEpIHtcXG4gICAgICAgIGluc2VydEFycmF5QXQoZCwgcGxzICsgMSwgbGlzdCk7XFxuICAgICAgfVxcbiAgICAgIC8vQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZCxsaXN0KTtcXG4gICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsIGxpc3QpO1xcbiAgICAgIHB1dE15VmFyKFxcXCJwbGF5bGlzdF9yZWFkeVxcXCIsIFxcXCIxXFxcIik7XFxuICAgIH0qL1xcbiAgICBpZiAoIWVyLuS6jOe6p+WIt+aWsCkge1xcbiAgICAgIHVwZGF0ZUl0ZW0oXFxcImxvY2F0aW9uQFxcXCIgKyBjdXJyZW50TG9jYXRpb24sIHtcXG4gICAgICAgIHRpdGxlOiBmb250c3R5bGUoZnJvbVtjdXJyZW50TG9jYXRpb25dLCB7XFxuICAgICAgICAgIHRhZ3M6IFxcXCJzbWFsbFxcXCJcXG4gICAgICAgIH0sIGVyLue6v+i3r+agt+W8jyksXFxuICAgICAgfSk7XFxuXFxuICAgICAgdXBkYXRlSXRlbShcXFwibG9jYXRpb25AXFxcIiArIGxvY2F0aW9uLCB7XFxuICAgICAgICB0aXRsZTogZm9udHN0eWxlKGZyb21bbG9jYXRpb25dLCB7XFxuICAgICAgICAgIGM6IGVyLue6v+i3r+minOiJsixcXG4gICAgICAgICAgdGFnczogXFxcInNtYWxsXFxcIlxcbiAgICAgICAgfSwgZXIu57q/6Lev5qC35byPKVxcbiAgICAgIH0pO1xcbiAgICB9XFxuXFxuICAgIGxldCBlZiA9ICQucmVxdWlyZShcXFwibWV0aG9kc1xcXCIpLmdldEVJbmZvKCk7XFxuICAgIGlmICghZXIu5LqM57qn5Yi35pawKSB7XFxuICAgICAgdXBkYXRlSXRlbShcXFwiQHNvcnRcXFwiLCB7XFxuICAgICAgICB0aXRsZTogZ2V0TGluZVNob3coZWYpLFxcbiAgICAgICAgZGVzYzogYDxzbWFsbD48c3BhbiBzdHlsZT1cXFwiY29sb3I6JHtlci7nur/ot6/popzoibJ9XFxcIj4ke2VmLmZyb21bZWYubGluZV19PC9zcGFuPjwvc21hbGw+YFxcbiAgICAgIH0pXFxuICAgIH1cXG5cXG4gICAgY3VycmVudExvY2F0aW9uID0gbG9jYXRpb247XFxuICB9XFxuXFxuICBHTS5wdXQoXFxcInJlbm92YXRlTGlzdFxcXCIsIHJlbm92YXRlTGlzdCk7XFxuXFxuICBpZiAoZnJvbS5sZW5ndGgpIHtcXG4gICAgbGV0IGVmID0gZ2V0RUluZm8oKTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogZ2V0TGluZVNob3coZWYpLFxcbiAgICAgIC8vZGVzYzogc29ydG9ialtzb3J0aV0udGl0bGUsXFxuICAgICAgZGVzYzogYDxzbWFsbD48c3BhbiBzdHlsZT1cXFwiY29sb3I6JHtlci7nur/ot6/popzoibJ9XFxcIj4ke2VmLmZyb21bZWYubGluZV19PC9zcGFuPjwvc21hbGw+YCxcXG4gICAgICBpbWc6IHNvcnRvYmpbc29ydGldLmltZyxcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHNvKSA9PiB7XFxuICAgICAgICBsZXQgZWYgPSAkLnJlcXVpcmUoXFxcIm1ldGhvZHNcXFwiKS5nZXRFSW5mbygpO1xcblxcbiAgICAgICAgbGV0IHNpID0gZ2V0TXlWYXIoXFxcInNvcnRpXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgIGxldCBpaSA9IChzaSA9PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwiQHNvcnRcXFwiLCB7XFxuICAgICAgICAgIGRlc2M6IHNvW2lpXS50aXRsZSxcXG4gICAgICAgICAgaW1nOiBzb1tpaV0uaW1nLFxcbiAgICAgICAgfSlcXG5cXG4gICAgICAgIC8vIHVwZGF0ZUl0ZW0oXFxcIkBzb3J0XFxcIiwge1xcbiAgICAgICAgLy8gICB0aXRsZTogXFxcIlxcXCIrXFxcIuW9k+WJjee6v+i3rzpcXFwiICsgZWYuZnJvbVtlZi5saW5lXSArIFxcXCJcXFxcdFxcXFx05YWxOlxcXCIgKyBlZi5wbGF5c1tlZi5saW5lXSArIFxcXCLpm4ZcXFxcdFxcXFx0XFxcIiArIGVmLnNwYWdlbnVtICsgXFxcIi9cXFwiICsgZWYubWF4W2VmLmxpbmVdLFxcbiAgICAgICAgLy8gfSlcXG5cXG4gICAgICAgIHZhciBwbGF5cyA9IGZpbmRJdGVtc0J5Q2xzKFxcXCJwbGF5bGlzdFxcXCIpLnJldmVyc2UoKS5tYXAoeCA9PiB7XFxuICAgICAgICAgIHguY29sX3R5cGUgPSB4LnR5cGU7XFxuICAgICAgICAgIHguZXh0cmEuaWQgPSB4LmV4dHJhLmlkLmVuZHNXaXRoKFxcXCLih4VcXFwiKSA/IHguZXh0cmEuaWQucmVwbGFjZSgv4oeFJC8sIFxcXCJcXFwiKSA6IHguZXh0cmEuaWQgKyBcXFwi4oeFXFxcIjtcXG4gICAgICAgICAgcmV0dXJuIHg7XFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBvbGRJZHMgPSAoZmluZEl0ZW1zQnlDbHMoJ3BsYXlsaXN0JykgfHwgW10pLm1hcChpdCA9PiBpdC5leHRyYS5pZCk7XFxuXFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZElkcy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAvL+acgOWQjumhuuW6j+abtOaWsFxcbiAgICAgICAgICB1cGRhdGVJdGVtKG9sZElkc1tpXSwgcGxheXNbaV0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IG5ld0l0ZW0gPSAoZmluZEl0ZW1zQnlDbHMoJ3BsYXlsaXN0JykgfHwgW10pO1xcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdJdGVtLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgIC8v5pyA5ZCO6aG65bqP5pu05pawXFxuICAgICAgICAgIHVwZGF0ZUl0ZW0obmV3SXRlbVtpXS5leHRyYS5pZCwge1xcbiAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCBuZXdJdGVtW2ldLmV4dHJhLCB7XFxuICAgICAgICAgICAgICBpZDogbmV3SXRlbVtpXS5leHRyYS5pZC5yZXBsYWNlKC/ih4UkLywgXFxcIlxcXCIpXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICAvLyBkZWxldGVJdGVtQnlDbHMoXFxcInBsYXlsaXN0XFxcIik7XFxuICAgICAgICAvLyBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsIHBsYXlzKTtcXG5cXG4gICAgICAgIHB1dE15VmFyKFxcXCJzb3J0aVxcXCIsIGlpKTtcXG4gICAgICAgIC8vcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyAoaWkgPT0gXFxcIjBcXFwiID8gXFxcIuato+W6j1xcXCIgOiBcXFwi5YCS5bqPXFxcIik7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgIH0sIHNvcnRvYmopLFxcbiAgICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IFxcXCJAc29ydFxcXCIsXFxuICAgICAgfVxcbiAgICB9KVxcbiAgICBpZiAoZnJvbS5sZW5ndGggPiAxKSB7XFxuICAgICAgbGV0IGNpID0gZ2V0TXlWYXIoaWQgKyBcXFwic291cmNlaVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgaWYgKGVyLue6v+i3r+agt+W8jyAhPSBcXFwic2VsZWN0XFxcIikge1xcbiAgICAgICAgZm9yIChsZXQgaSBpbiBmcm9tKSB7XFxuICAgICAgICAgIGxldCBpY29uaW1nID0gZXIu57q/6Lev5qC35byPLmluY2x1ZGVzKFxcXCJpY29uXFxcIikgPyBmaW5kSWNvbihmcm9tW2ldKSA6IFxcXCJcXFwiO1xcbiAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAoaSA9PSBjaSA/IGZvbnRzdHlsZShmcm9tW2ldLCB7XFxuICAgICAgICAgICAgICBjOiBlci7nur/ot6/popzoibIsXFxuICAgICAgICAgICAgICB0YWdzOiBcXFwic21hbGxcXFwiXFxuICAgICAgICAgICAgfSwgZXIu57q/6Lev5qC35byPKSA6IGZvbnRzdHlsZShmcm9tW2ldLCB7XFxuICAgICAgICAgICAgICB0YWdzOiBcXFwic21hbGxcXFwiXFxuICAgICAgICAgICAgfSwgZXIu57q/6Lev5qC35byPKSksXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpLCBpZCkgPT4ge1xcbiAgICAgICAgICAgICAgaWYgKGdldE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBcXFwiMFxcXCIpID09IGkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIHB1dE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBTdHJpbmcoaSkpO1xcbiAgICAgICAgICAgICAgbGV0IGVyciA9ICQucmVxdWlyZShcXFwibWV0aG9kc1xcXCIpLmVyUmVmcmVzaDtcXG4gICAgICAgICAgICAgIGVycihpKTtcXG4gICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgfSwgaSwgaWQpLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICBjbHM6IFxcXCJsb2NhdGlvbkBcXFwiLFxcbiAgICAgICAgICAgICAgaWQ6IFxcXCJsb2NhdGlvbkBcXFwiICsgaVxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgaW1nOiBpY29uaW1nLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBlci7nur/ot6/moLflvI9cXG4gICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgIHRpdGxlOiBmcm9tW2NpXSxcXG4gICAgICAgICAgZGVzYzogZnJvbS5sZW5ndGggKyBcXFwi5p2h57q/6LevXFxcIixcXG4gICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcbiAgICAgICAgICAgIGxldCB7XFxuICAgICAgICAgICAgICBmb250c3R5bGUsXFxuICAgICAgICAgICAgICBnZXRFSW5mbyxcXG4gICAgICAgICAgICB9ID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIik7XFxuICAgICAgICAgICAgbGV0IGVmID0gZ2V0RUluZm8oKTtcXG5cXG4gICAgICAgICAgICBsZXQgZnJvbSA9IGVmLmZyb207XFxuICAgICAgICAgICAgbGV0IG1heCA9IGVmLnBsYXlzO1xcblxcbiAgICAgICAgICAgIGxldCBjaSA9IGdldE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBzaG93aSA9IGdldE15VmFyKFxcXCJzaG93aVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgdGZyb20gPSBmcm9tLm1hcCgoeCwgaSkgPT4ge1xcbiAgICAgICAgICAgICAgcmV0dXJuIGNpID09IGkgPyBmb250c3R5bGUoeCArIFxcXCJbXFxcIiArIG1heFtpXSArIFxcXCJdXFxcIiwge1xcbiAgICAgICAgICAgICAgICBjOiAkLmVyX3VpLue6v+i3r+minOiJsixcXG4gICAgICAgICAgICAgICAgdGFnczogXFxcInNtYWxsXFxcIlxcbiAgICAgICAgICAgICAgfSkgOiBmb250c3R5bGUoeCArIFxcXCJbXFxcIiArIG1heFtpXSArIFxcXCJdXFxcIiwge1xcbiAgICAgICAgICAgICAgICB0YWdzOiBcXFwic21hbGxcXFwiXFxuICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgaWYgKHNob3dpID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICBwdXRNeVZhcihcXFwic2hvd2lcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgbGV0IHNob3cgPSAxO1xcbiAgICAgICAgICAgICAgbGV0IG51bSA9IHRmcm9tLmxlbmd0aDtcXG4gICAgICAgICAgICAgIGlmIChudW0gPCA4KSB7XFxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bSA+IDggJiYgbnVtIDw9IDEyKSB7XFxuICAgICAgICAgICAgICAgIHNob3cgPSAyO1xcbiAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgc2hvdyA9IDM7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgIHJldHVybiAkKHRmcm9tLCBzaG93KS5zZWxlY3QoKGNpLCBmLCBpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICBNWV9VUkw9XFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICBsZXQge1xcbiAgICAgICAgICAgICAgICAgIGVyUmVmcmVzaFxcbiAgICAgICAgICAgICAgICB9PSQucmVxdWlyZShcXFwibWV0aG9kc1xcXCIpO1xcbiAgICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgbGV0IHtcXG4gICAgICAgICAgICAgICAgICBmaW5kSWNvblxcbiAgICAgICAgICAgICAgICB9ID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzX2VyXFxcIik7XFxuICAgICAgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgICBsZXQgaSA9IE1ZX0lOREVYO1xcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBjaSkge1xcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBmW2ldO1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgU3RyaW5nKGkpKTtcXG4gICAgICAgICAgICAgICAgZXJSZWZyZXNoKGkpO1xcblxcbiAgICAgICAgICAgICAgICBsZXQgaWNvbmltZyA9IGZpbmRJY29uKG5hbWUsICQuZXJfdWkpO1xcblxcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKFxcXCJsb2NhdGlvbkBcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IG5hbWUsXFxuICAgICAgICAgICAgICAgICAgaW1nOiBpY29uaW1nLFxcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJzaG93aVxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgfSwgY2ksIGZyb20sIGlkKVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJzaG93aVxcXCIpO1xcbiAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH0sIGlkKSxcXG4gICAgICAgICAgaW1nOiBlci7nur/ot6/moLflvI8uaW5jbHVkZXMoXFxcInNlbGVjdFxcXCIpID8gZmluZEljb24oZnJvbVtjaV0pIDogXFxcIlxcXCIsXFxuICAgICAgICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcXG4gICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogXFxcImxvY2F0aW9uQFxcXCJcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG5cXG4gIGQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgIGlkOiBcXFwicGxheXBhZ2VsaW5lXFxcIlxcbiAgICB9XFxuICB9KVxcblxcbiAgZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBpZDogXFxcInBsYXlsaXN0c1xcXCJcXG4gICAgfVxcbiAgfSk7XFxuXFxuICBkLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBjbHM6IFxcXCJwbGF5bGlzdDJcXFwiLFxcbiAgICAgIGlkOiBcXFwicGxheWxpc3RzRU5EXFxcIlxcbiAgICB9XFxuICB9KTtcXG5cXG4gIGxldCBtZXMgPSBbZm9udHN0eWxlKCfku6XkuIrmlbDmja7mnaXmupDkuo7nvZHnu5zvvIzlpoLmgqjllpzmrKLvvIzor7fmlK/mjIHlrpjmlrnvvIEnLCB7IGM6IFxcXCJncmV5XFxcIiwgdGFnczogXFxcInNtYWxsXFxcIiB9KV07XFxuXFxuICBpZiAoY2FjaGVNYW5hZ2UuZXhpc3QoTVlfUEFSQU1TLnNuYW1lICsgaWQpKSB7XFxuICAgIG1lcy51bnNoaWZ0KGZvbnRzdHlsZShcXFwi5b2T5YmN5Li657yT5a2YLOeCueaIkeWIt+aWsFxcXCIsIHtcXG4gICAgICBjOiBlci7nur/ot6/popzoibIsIHRhZ3M6IFxcXCJzbWFsbFxcXCJcXG4gICAgfSkpXFxuICB9XFxuXFxuICBkLnB1c2goe1xcbiAgICB0aXRsZTogbWVzLmpvaW4oXFxcIlxcXFxuXFxcIiksXFxuICAgIC8vZGVzYzogZm9udHN0eWxlKCfmraTop4TliJnku4XpmZDlrabkuaDkuqTmtYHkvb/nlKjvvIzor7fkuo7lr7zlhaXlkI4yNOWwj+aXtuWGheWIoOmZpO+8jOS7u+S9lee7hOe7h+aIluS4quS6uuS4jeW+l+S7peS7u+S9leaWueW8j+aWueazleS8oOaSreatpOinhOWImeeahOaVtOS9k+aIlumDqOWIhu+8gScsIHsgYzogXFxcIiNGMjBDMDBcXFwiLCB0YWdzOiBcXFwic21hbGxcXFwiIH0pLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkLCBtcykgPT4ge1xcbiAgICAgIGxldCBlciA9ICQucmVxdWlyZShcXFwiVUlNYW5hZ2VcXFwiKS51aV9jb25maWcuZXI7XFxuICAgICAgbGV0IHtcXG4gICAgICAgIGNhY2hlTWFuYWdlXFxuICAgICAgfSA9ICQucmVxdWlyZShcXFwibWV0aG9kc1xcXCIpO1xcbiAgICAgIGxldCBjYSA9IGNhY2hlTWFuYWdlLmV4aXN0KG1zLnNuYW1lICsgaWQpO1xcbiAgICAgIGlmIChjYSkge1xcbiAgICAgICAgY2FjaGVNYW5hZ2UuZGVsKG1zLnNuYW1lICsgaWQpO1xcbiAgICAgIH1cXG4gICAgICBjbGVhck15VmFyKFxcXCJwbGF5bGlzdF9yZWFkeVxcXCIpO1xcbiAgICAgIGlmIChlci7kuoznuqfliLfmlrAgfHwgY2EpIHtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICB9XFxuICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgaWQsIE1ZX1BBUkFNUyksXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgY2xzOiBcXFwicGxheWxpc3QyXFxcIixcXG4gICAgfVxcbiAgfSlcXG5cXG4gIHJlbm92YXRlTGlzdChnZXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgXFxcIjBcXFwiKSk7XFxuICBzZXRSZXN1bHQoZCk7XFxufSkoKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6Q5paH5Lu2XCIsXCJwYXRoXCI6XCJjb25maWdzXCIsXCJydWxlXCI6XCJjb25zdCBwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvRHJweUhpa2VyL3BhcnNlcy5qc29uXFxcIjtcXG5jb25zdCBvbGRwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9wYXJzZXMuanNvblxcXCI7XFxubGV0IGRhdGE7XFxuXFxuZnVuY3Rpb24gZ2V0SnNvbigpIHtcXG4gICAgaWYgKCFmaWxlRXhpc3QocGF0aCkgJiYgZmlsZUV4aXN0KG9sZHBhdGgpKSB7XFxuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShyZWFkRmlsZShvbGRwYXRoKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgIHNhdmVGaWxlKHBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcXG4gICAgICAgIC8vZGVsZXRlRmlsZShvbGRwYXRoKTtcXG4gICAgfVxcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xcbiAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlKHBhdGgpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgZGF0YSA9IFtdO1xcbiAgICB9XFxuICAgIHJldHVybiBkYXRhO1xcbn1cXG5cXG5mdW5jdGlvbiBzYXZlSnNvbihqc29uKSB7XFxuICAgIHNhdmVGaWxlKHBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0VXNlZnVsSnNvbigpIHtcXG4gICAgcmV0dXJuIGdldEpzb24oKS5maWx0ZXIodiA9PiAhdi5mb3JiaWRkZW4pO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGb3JiaWRkZW5Kc29uKCkge1xcbiAgICByZXR1cm4gZ2V0SnNvbigpLmZpbHRlcih2ID0+IHYuZm9yYmlkZGVuKTtcXG59XFxuXFxuJC5leHBvcnRzID0ge1xcbiAgICBnZXRKc29uLFxcbiAgICBzYXZlSnNvbixcXG4gICAgZ2V0VXNlZnVsSnNvbixcXG4gICAgZ2V0Rm9yYmlkZGVuSnNvbixcXG4gICAgcGF0aCxcXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6Q566h55CGXCIsXCJwYXRoXCI6XCJydWxlTWFuYWdlXCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi6Kej5p6Q566h55CGXFxcIik7XFxubGV0IGNvbmZpZ3MgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKTtcXG5sZXQgYXJyID0gY29uZmlncy5nZXRKc29uKCk7XFxubGV0IGxlbmd0aCA9IGFyci5sZW5ndGg7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICB0aXRsZTogXFxcIuaPkOekulxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3N5c3RlbS8yNy5wbmdcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gICAgICAgIGxldCBwb3AgPSBoaWtlclBvcC5pbmZvQm90dG9tKHtcXG4gICAgICAgICAgICBvcHRpb25zOiBbXFxuICAgICAgICAgICAgICAgIFxcXCJb5bu66K6uXe+8muino+aekOWPqumcgOimgeS/neWtmOWwkemHj+WlveeUqOeahOWNs+WPr++8jOS4jemcgOimgeWkquWkmuOAglxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJb5o+Q56S6Xe+8muino+aekOacieaXtuaViOaIlumHjeWumuWQkeeahCfpq5jnuqcn6Kej5p6Q77yM5pys56iL5bqP5LiN5pSv5oyB77yM5bu66K6u5Yig6Zmk44CCXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcIltRJkFd77ya5Li65ZWl5Zyo57yW6L6R6aG16Z2i5rWL6K+V6Kej5p6Q5pe26IO955So77yM5L+d5a2Y5ZCO5YaN6KeG6aKR5rqQ5Lit5Y206Kej5p6Q5LiN5Ye65p2l77yfXFxcXG7kuI3nn6XpgZPvvIzmiJHnmoTop6PlhrPlip7ms5XmmK/lu7rorq7liKDpmaTjgIJcXFwiXFxuICAgICAgICAgICAgXSxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmlrDlop5cXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCNcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2RvbWFpbl9jb25maWdcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgcGFnZVRpdGxlOiBcXFwi5paw5aKe6Kej5p6QXFxcIlxcbiAgICB9XFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLliIbkuqtcXFwiLFxcbiAgICB1cmw6ICQoXFxcIi0xXFxcIiwgXFxcIui+k+WFpeS9oOimgeWIhuS6q+ino+aekOeahOW6j+WPt1xcXFxuLTHlhajpg6jvvIwtMuW3suWQr+eUqOeahO+8jC0z5bey56aB55So55qEXFxcIikuaW5wdXQoKGxlbmd0aCkgPT4ge1xcbiAgICAgICAgbGV0IGluZGV4YyA9IGlucHV0LnNwbGl0KC8sfO+8jC8pO1xcbiAgICAgICAgbGV0IGluZGV4cyA9IFtdO1xcbiAgICAgICAgbGV0IG1vID0gcGFyc2VJbnQoaW5kZXhjWzBdKTtcXG4gICAgICAgIGlmICghKGluZGV4Yy5sZW5ndGggIT09IDAgJiYgbW8gPCAwICYmIG1vID4gLTUpKSB7XFxuICAgICAgICAgICAgZm9yIChsZXQgaXQgb2YgaW5kZXhjKSB7XFxuICAgICAgICAgICAgICAgIGxldCBudW0gPSBwYXJzZUludChpdCk7XFxuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtKSB8fCBudW0gPj0gbGVuZ3RoIHx8IG51bSA8IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mlbDlrZfkuI3lkIjms5VcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGluZGV4cy5wdXNoKG51bSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgcmV0dXJuICQoW1xcXCJISUtFUlxcXCIsIFxcXCJUWFRcXFwiXS5jb25jYXQoZ2V0UGFzdGVzKCkpLCAyLCBcXFwi5YiG5Lqr5pa55byPXFxcIikuc2VsZWN0KChtbywgaW5kZXhzLCBleHQpID0+IHtcXG4gICAgICAgICAgICBmdW5jdGlvbiB1cChydWxlcykge1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZWI2NCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShydWxlcykpO1xcbiAgICAgICAgICAgICAgICBsZXQgZ2V0UGFzcyA9IChsZW5ndGgsIHJ1bGUsIHR5cGUpID0+IFxcXCLmtbfpmJTop4bnlYzvvIxEUlBZ6Kej5p6Q77yM5YWx44CMXFxcIiArIGxlbmd0aCArIFxcXCLjgI3mnaHvvIzlpI3liLbmlbTmnaHlj6Pku6TmiZPlvIDova/ku7blsLHkvJroh6rliqjlr7zlhaUkXFxcIiArIHJ1bGUgKyBcXFwiJFxcXCIgKyB0eXBlICsgXFxcIkBpbXBvcnQ9anM6JC5yZXF1aXJlKCdpbXBvcnQ/cnVsZT0nK1xcXCIgKyBKU09OLnN0cmluZ2lmeShNWV9SVUxFLnRpdGxlKSArIFxcXCIpKGlucHV0KVxcXCI7XFxuICAgICAgICAgICAgICAgIGlmIChnZXRQYXN0ZXMoKS5pbmNsdWRlcyhpbnB1dCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gc2hhcmVQYXN0ZShydWxlYjY0LCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlcy5sZW5ndGgsIHUsIFxcXCJiXFxcIik7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvc2hhcmUvZHJweeino+aekOOAjFxcXCIgKyBydWxlcy5sZW5ndGggKyBcXFwi44CN5p2hLlxcXCIgKyAoaW5wdXQgPT09IFxcXCJISUtFUlxcXCIgPyBcXFwiaGlrZXJcXFwiIDogXFxcInR4dFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGgsIGdldFBhc3MocnVsZXMubGVuZ3RoLCBydWxlYjY0LCBcXFwiYVxcXCIpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwic2hhcmU6Ly9cXFwiICsgcGF0aDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcnVsZXM7XFxuICAgICAgICAgICAgaWYgKG1vID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vID09PSAtMikge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldFVzZWZ1bEpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vID09PSAtMykge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEZvcmJpZGRlbkpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKS5maWx0ZXIoKHYsIGkpID0+IGluZGV4cy5pbmNsdWRlcyhpKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJ1bGVzID0gcnVsZXMubWFwKCh2KSA9PiB7XFxuICAgICAgICAgICAgICAgIHYuZm9yYmlkZGVuID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdXAocnVsZXMpO1xcbiAgICAgICAgfSwgbW8sIGluZGV4cywgaW5kZXhjWzFdKTtcXG5cXG4gICAgfSwgbGVuZ3RoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9zaGFyZV9ncmVlblxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumHjee9rlxcXCIsXFxuICAgIHVybDogJChcXFwi5L2g56Gu5a6a6YeN572u77yfXFxcXG7or6Xmk43kvZzkvJrliKDpmaTnjrDmnInop6PmnpDvvIzmgaLlpI3oh6rluKbop6PmnpDjgIJcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikucGF0aCksXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fcmVmcmVzaFxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua4heepulxcXCIsXFxuICAgIHVybDogJChcXFwi5L2g56Gu5a6a5YWo6YOo5Yig6Zmk77yfXFxcXG7or6Xmk43kvZzkvJrliKDpmaTnjrDmnInop6PmnpDjgIJcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICB3cml0ZUZpbGUocGF0aCwgXFxcIltdXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5wYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9jb2RlX3ZpZXdcXFwiXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgLy90aXRsZTogJzxmb250IGNvbG9yPVxcXCIjMTNCNjFCXFxcIj7ilpAgPC9mb250PjxiPuino+aekOWIl+ihqDxiPiAoJyArIFN0cmluZyhsZW5ndGgpLmZvbnRjb2xvcihcXFwiI2ZmNjYwMVxcXCIpICsgXFxcIilcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxufSk7XFxubGV0IGNvdW50VGl0bGUgPSBkLmF0KC0xKTtcXG5cXG5mdW5jdGlvbiB1bmlxdWVOZXN0ZWQoYXJyKSB7XFxuICAgIHJldHVybiBhcnIubWFwKGl0ZW0gPT4ge1xcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gdW5pcXVlTmVzdGVkKGl0ZW0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGl0ZW07XFxuICAgIH0pLmZsYXQoSW5maW5pdHkpLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleCk7XFxufVxcbnZhciBpdHMgPSBbXVxcbmxldCBmbGFnaSA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJmbGFnaVxcXCIsIFtcXFwi5YWo6YOoXFxcIl0pO1xcbmxldCBjb3VudCA9IGl0cy5sZW5ndGg7XFxubGV0IGZsYWdzID0gdW5pcXVlTmVzdGVkKGFyci5tYXAoeCA9PiB4LmZsYWcuc3BsaXQoXFxcInxcXFwiKSkpO1xcbmZsYWdzLnVuc2hpZnQoXFxcIuW3suemgeeUqFxcXCIpO1xcbmZsYWdzLnVuc2hpZnQoXFxcIuWFqOmDqFxcXCIpO1xcblxcbmxldCBzaG93ID0gZ2V0TXlWYXIoXFxcImZsYWdzaG93XFxcIiwgXFxcIlxcXCIpO1xcbmxldCBjb2wgPSBzaG93ID09IFxcXCLlsZXlvIBcXFwiID8gXFxcImZsZXhfYnV0dG9uXFxcIiA6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIjtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogc2hvdyA9PSBcXFwi5bGV5byAXFxcIiA/IFxcXCLigJzigJzigJ3igJ08Yj5cXFwiICsgXFxcIuKIp1xcXCIuZm9udGNvbG9yKFxcXCIjMWFhZDE5XFxcIikgKyBcXFwiPC9iPlxcXCIgOiBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKhcXFwiLmZvbnRjb2xvcihcXFwiI0ZGMDAwMFxcXCIpICsgXFxcIjwvYj5cXFwiLFxcbiAgICBjb2xfdHlwZTogY29sLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgbGV0IHNob3cgPSBnZXRNeVZhcihcXFwiZmxhZ3Nob3dcXFwiLCBcXFwi5bGV5byAXFxcIik7XFxuICAgICAgICBwdXRNeVZhcihcXFwiZmxhZ3Nob3dcXFwiLCBzaG93ID09IFxcXCLlsZXlvIBcXFwiID8gXFxcIuaUtui1t1xcXCIgOiBcXFwi5bGV5byAXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSlcXG59KVxcblxcblxcbmZsYWdzLmZvckVhY2goZiA9PiB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAoZmxhZ2kuaW5jbHVkZXMoZikgPyBmLmZvbnRjb2xvcihcXFwiIzEzQjYxQlxcXCIpIDogZiksXFxuICAgICAgICBjb2xfdHlwZTogY29sLFxcbiAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChmKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGZsYWdpID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImZsYWdpXFxcIiwgW1xcXCLlhajpg6hcXFwiXSk7XFxuICAgICAgICAgICAgaWYgKC8o5YWo6YOofOW3suemgeeUqCkvLnRlc3QoZikpIHtcXG4gICAgICAgICAgICAgICAgZmxhZ2kgPSBbZl1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBmbGFnaSA9IGZsYWdpLmZpbHRlcih4ID0+ICEvKOWFqOmDqHzlt7LnpoHnlKgpLy50ZXN0KHgpKTtcXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdpLmluY2x1ZGVzKGYpKSB7XFxuICAgICAgICAgICAgICAgICAgICBmbGFnaSA9IGZsYWdpLmZpbHRlcih4ID0+IHggIT0gZik7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ2kubGVuZ3RoID09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnaSA9IFtcXFwi5YWo6YOoXFxcIl1cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGZsYWdpLnB1c2goZilcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiZmxhZ2lcXFwiLCBmbGFnaSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgZilcXG4gICAgfSlcXG59KVxcbmZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcXG4gICAgbGV0IGl0ID0gYXJyW2ldO1xcblxcbiAgICBsZXQgZmxhZyA9IGl0LmZsYWcuc3BsaXQoXFxcInxcXFwiKTtcXG4gICAgaWYgKGZsYWdpLmxlbmd0aCA+IDAgJiYgIVtcXFwi5YWo6YOoXFxcIiwgXFxcIuW3suemgeeUqFxcXCJdLmluY2x1ZGVzKGZsYWdpWzBdKSkge1xcbiAgICAgICAgaWYgKCFmbGFnaS5ldmVyeShmID0+IGZsYWcuaW5jbHVkZXMoZikpKSB7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKFtcXFwi5bey56aB55SoXFxcIl0uaW5jbHVkZXMoZmxhZ2lbMF0pKSB7XFxuICAgICAgICBpZiAoIWl0Lmhhc093blByb3BlcnR5KFxcXCJmb3JiaWRkZW5cXFwiKSB8fCAhaXQuZm9yYmlkZGVuKSB7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaXRzLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ1bJyArIGkgKyAnXTxiPiAgJyArIGl0Lm5hbWUgKyAoaXQuZm9yYmlkZGVuID8gXFxcIiAj4oCc4oCc56aB55So4oCd4oCdXFxcIi5zbWFsbCgpIDogXFxcIlxcXCIpLFxcbiAgICAgICAgZGVzYzogaXQudXJsLFxcbiAgICAgICAgZm9yYmlkZGVuOiBpdC5mb3JiaWRkZW4sXFxuICAgICAgICB1cmw6ICQoW1xcXCLnvJbovpFcXFwiLCBcXFwi5YiG5LqrXFxcIiwgXFxcIuemgeeUqC/lkK/nlKhcXFwiLCBcXFwi56e75YqoXFxcIiwgXFxcIue9rumhtlxcXCIsIFxcXCLliKDpmaRcXFwiXSwgMSwgXFxcIuaTjeS9nO+8mlxcXCIgKyBpdC5uYW1lKS5zZWxlY3QoKGluZGV4LCBsZW5ndGgpID0+IHtcXG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLnvJbovpFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5YiG5LqrXFxcIikge1xcbiAgICAgICAgICAgICAgICBsZXQgb3BzID0gZ2V0UGFzdGVzKCk7XFxuICAgICAgICAgICAgICAgIG9wcy51bnNoaWZ0KFxcXCLlrozmlbTlj6Pku6RcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQob3BzLCAyLCBcXFwi5YiG5Lqr5pa55byPXFxcIikuc2VsZWN0KChpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKClbaW5kZXhdO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZS51c2VyID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZS5mb3JiaWRkZW4gPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZWI2NCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShydWxlKSk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZ2V0UGFzcyA9IChuYW1lLCBydWxlLCB0eXBlKSA9PiBcXFwi5rW36ZiU6KeG55WM77yM44CMXFxcIiArIG5hbWUgKyBcXFwi44CNRFJQWeino+aekO+8jOWkjeWItuaVtOadoeWPo+S7pOaJk+W8gOi9r+S7tuWwseS8muiHquWKqOWvvOWFpSRcXFwiICsgcnVsZSArIFxcXCIkXFxcIiArIHR5cGUgKyBcXFwiQGltcG9ydD1qczokLnJlcXVpcmUoJ2ltcG9ydD9ydWxlPScrXFxcIiArIEpTT04uc3RyaW5naWZ5KE1ZX1JVTEUudGl0bGUpICsgXFxcIikoaW5wdXQpXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBcXFwi5a6M5pW05Y+j5LukXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBnZXRQYXNzKHJ1bGUubmFtZSwgcnVsZWI2NCwgXFxcImFcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBzaGFyZVBhc3RlKHJ1bGViNjQsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlLm5hbWUsIHUsIFxcXCJiXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sIGluZGV4KTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi56e75YqoXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChpbmRleCArIFxcXCJcXFwiLCBcXFwi6L6T5YWl5L2N572uXFxcIikuaW5wdXQoKGluZGV4LCBsZW5ndGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdJbmRleCA9IE51bWJlcihpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG5ld0luZGV4KSB8fCBuZXdJbmRleCA+PSBsZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5ZKM6KeE55qE5L2N572uXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gcnVsZXMuc3BsaWNlKGluZGV4LCAxKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShuZXdJbmRleCwgMCwgcnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIH0sIGluZGV4LCBsZW5ndGgpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLnva7pobZcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCBuZXdJbmRleCA9IDA7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBydWxlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xcbiAgICAgICAgICAgICAgICBydWxlcy5zcGxpY2UobmV3SW5kZXgsIDAsIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5Yig6ZmkXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwi56Gu6K6k5Yig6Zmk77yfXFxcIikuY29uZmlybSgoaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gcnVsZXMuc3BsaWNlKGluZGV4LCAxKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliKDpmaRcXFwiICsgcnVsZS5uYW1lO1xcbiAgICAgICAgICAgICAgICB9LCBpbmRleCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBhcnJbaW5kZXhdO1xcbiAgICAgICAgICAgICAgICBydWxlLmZvcmJpZGRlbiA9ICFydWxlLmZvcmJpZGRlbjtcXG4gICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAvL3JldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgKHJ1bGUuZm9yYmlkZGVuID8gXFxcIuemgeeUqFxcXCIgOiBcXFwi5ZCv55SoXFxcIikgKyBydWxlLm5hbWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgaSwgbGVuZ3RoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaTogaSxcXG4gICAgICAgICAgICBwYWdlVGl0bGU6IGl0Lm5hbWVcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcblxcbmNvdW50VGl0bGUudGl0bGUgPSAnPGZvbnQgY29sb3I9XFxcIiMxM0I2MUJcXFwiPuKWkCA8L2ZvbnQ+PGI+6Kej5p6Q5YiX6KGoPGI+ICgnICsgKChpdHMubGVuZ3RoIC0gY291bnQpICsgXFxcIi9cXFwiICsgbGVuZ3RoKS5mb250Y29sb3IoXFxcIiNmZjY2MDFcXFwiKSArIFxcXCIpXFxcIjtcXG5cXG5kID0gZC5jb25jYXQoaXRzKTtcXG5cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDnvJbovpFcIixcInBhdGhcIjpcInJ1bGVFZGl0XCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX25hbWVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfdXJsXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX2ZsYWdcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfaGVhZGVyc1xcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19tZXRob2RcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19qc29uUGF0aFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19qc1xcXCIpO1xcbn0pKTtcXG5sZXQgdXJsSW5kZXggPSBwYXJzZUludChnZXRQYXJhbShcXFwiaW5kZXhcXFwiLCBcXFwiXFxcIikpO1xcbnVybEluZGV4ID0gTnVtYmVyLmlzTmFOKHVybEluZGV4KSA/IHZvaWQoMCkgOiB1cmxJbmRleDtcXG5sZXQgaW5kZXggPSB2b2lkKDApID09PSB1cmxJbmRleCA/IE1ZX1BBUkFNUy5pIDogdXJsSW5kZXg7XFxubGV0IGlzSW1wb3J0ID0gISFnZXRQYXJhbShcXFwiaXNJbXBvcnRcXFwiLCBcXFwiXFxcIik7XFxubGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG5sZXQgb2JqO1xcbmlmIChpc0ltcG9ydCkge1xcbiAgICB0cnkge1xcbiAgICAgICAgb2JqID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9qaWV4aVNpbXBsZUltcG9ydC5qc29uXFxcIik7XFxuICAgICAgICBsZXQgdGlwID0gaW5kZXggIT09IHZvaWQoMCkgPyBcXFwi5pu05paw6Kej5p6QXFxcIiA6IFxcXCLlr7zlhaXop6PmnpBcXFwiO1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKHRpcCArIFxcXCI6XFxcIiArIG9iai5uYW1lKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJjigJhcXFwiICsgdGlwICsgXFxcIuKAmeKAmVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgb2JqID0ge307XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl6ZSZ6K+vXFxcIik7XFxuICAgIH1cXG59IGVsc2UgaWYgKGluZGV4ICE9PSB2b2lkKDApKSB7XFxuICAgIG9iaiA9IGFycltpbmRleF07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi57yW6L6R6Kej5p6QOlxcXCIgKyBvYmoubmFtZSk7XFxufSBlbHNlIHtcXG4gICAgb2JqID0ge1xcbiAgICAgICAgcnVuVHlwZTogXFxcIldFQlxcXCIsXFxuICAgICAgICBtZXRob2Q6IFxcXCJHRVRcXFwiXFxuICAgIH07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi5paw5bu66Kej5p6QXFxcIik7XFxufVxcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5ZCN5a2XKOW/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19uYW1lXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5uYW1lLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuXFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLop6PmnpB1cmwo5b+F5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX3VybFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmoudXJsLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwiZmxhZyjlv4XloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IDIsXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2ZsYWdcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcInBzX2ZsYWdcXFwiLG9iai5mbGFnfHxcXFwicWl5aXxpbWdvfOeIseWlh+iJunzlpYfoibp8cXF8cXEg6aKE5ZGK5Y+K6Iqx57WufOiFvuiur3x5b3VrdXzkvJjphbd8cHB0dnxQUFRWfGxldHZ85LmQ6KeGfGxlc2hpfG1ndHZ86IqS5p6cfHNvaHV8eGlndWF8ZnVufOmjjuihjFxcXCIpLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwiaGVhZGVycyjpgInloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IDIsXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2hlYWRlcnNcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmhlYWRlcnMsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuXFxucHV0TXlWYXIoXFxcInBzX3J1blR5cGVcXFwiLCBvYmoucnVuVHlwZSB8fCBcXFwiXFxcIik7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLop6PmnpDmqKHlvI/vvJpcXFwiICsgKG9iai5ydW5UeXBlIHx8IFxcXCJXRUJcXFwiKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiAkKFtcXFwiV0VCXFxcIiwgXFxcIkpTT05cXFwiLCBcXFwiSlNcXFwiXSkuc2VsZWN0KCgpID0+IHtcXG5cXG4gICAgICAgIHB1dE15VmFyKFxcXCJwc19ydW5UeXBlXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwicHNfcnVuVHlwZVxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuino+aekOaooeW8j++8mlxcXCIgKyBpbnB1dFxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBcXFwicHNfcnVuVHlwZVxcXCIsXFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcblxcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcImpzb25QYXRoKEpTT07op6PmnpDmqKHlvI/lv4XloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfanNvblBhdGhcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmpzb25QYXRoLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbnB1dE15VmFyKFxcXCJwc19tZXRob2RcXFwiLCBvYmoubWV0aG9kIHx8IFxcXCJcXFwiKTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIkpTT07or7fmsYLmqKHlvI/vvJpcXFwiICsgKG9iai5tZXRob2QgfHwgXFxcIkdFVFxcXCIpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogJChbXFxcIkdFVFxcXCIsIFxcXCJQT1NUXFxcIl0pLnNlbGVjdCgoKSA9PiB7XFxuXFxuICAgICAgICBwdXRNeVZhcihcXFwicHNfbWV0aG9kXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwicHNfbWV0aG9kXFxcIiwge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwiSlNPTuivt+axguaooeW8j++8mlxcXCIgKyBpbnB1dFxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBcXFwicHNfbWV0aG9kXFxcIixcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwianMoSlPmqKHlvI/lv4XloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IDMsXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2pzXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5qcyxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLliKDpmaRcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGluZGV4LCB1cmxJbmRleCkgPT4ge1xcbiAgICAgICAgaWYgKGluZGV4ID09PSB2b2lkKDApKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+atpOmhueaXoOazleWIoOmZpFxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodXJsSW5kZXggIT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5pu05paw6Kej5p6Q77yM5Yig6Zmk6K+35LuO6Kej5p6Q566h55CG6L+b5YWlXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGNvbmZpcm0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5rip6aao5o+Q56S6XFxcIixcXG4gICAgICAgICAgICBjb250ZW50OiBcXFwi56Gu5a6a6KaB5Yig6Zmk5q2k6Kej5p6Q5ZCX77yf5rOo5oSP5Yig6Zmk5ZCO5peg5rOV5oGi5aSNXFxcIixcXG4gICAgICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKChpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcXG4gICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICAgICAgYmFjayh0cnVlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSwgaW5kZXgpXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwgaW5kZXgsIHVybEluZGV4KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5rWL6K+VXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGxldCB0ZXN0S2V5d29yZCA9IGdldEl0ZW0oXFxcInRlc3RVcmxcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICByZXR1cm4gJCh0ZXN0S2V5d29yZCwgXFxcIuivt+i+k+WFpeW9seinhue9keermeWcsOWdgFxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJ0ZXN0VXJsXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBnZXRNeVZhcihcXFwicHNfdXJsXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBuYW1lID0gZ2V0TXlWYXIoXFxcInBzX25hbWVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgbGV0IGZsYWcgPSBnZXRNeVZhcihcXFwicHNfZmxhZ1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IGdldE15VmFyKFxcXCJwc19oZWFkZXJzXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBydW5UeXBlID0gZ2V0TXlWYXIoXFxcInBzX3J1blR5cGVcXFwiLCBcXFwiV0VCXFxcIik7XFxuICAgICAgICAgICAgbGV0IG1ldGhvZCA9IGdldE15VmFyKFxcXCJwc19tZXRob2RcXFwiLCBcXFwiR0VUXFxcIik7XFxuICAgICAgICAgICAgbGV0IGpzb25QYXRoID0gZ2V0TXlWYXIoXFxcInBzX2pzb25QYXRoXFxcIiwgXFxcIlxcXCIpLnRyaW0oKSB8fCB2b2lkIDA7XFxuICAgICAgICAgICAgbGV0IGpzID0gZ2V0TXlWYXIoXFxcInBzX2pzXFxcIiwgXFxcIlxcXCIpIHx8IHZvaWQgMDtcXG4gICAgICAgICAgICBpZiAoaGVhZGVycykge1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IEpTT04ucGFyc2UoaGVhZGVycyk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGVhZGVyc+agvOW8j+mUmeivrzpcXFwiICsgZS50b1N0cmluZygpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcInZpZGVvVXJsXFxcIikucHJlcGFyZVBhcnNlcyhbe1xcbiAgICAgICAgICAgICAgICBuYW1lLFxcbiAgICAgICAgICAgICAgICB1cmwsXFxuICAgICAgICAgICAgICAgIGZsYWcsXFxuICAgICAgICAgICAgICAgIGhlYWRlcnMsXFxuICAgICAgICAgICAgICAgIHJ1blR5cGUsXFxuICAgICAgICAgICAgICAgIG1ldGhvZCxcXG4gICAgICAgICAgICAgICAganNvblBhdGgsXFxuICAgICAgICAgICAgICAgIGpzXFxuICAgICAgICAgICAgfV0sIGlucHV0LG51bGwsIHRydWUpO1xcbiAgICAgICAgfSk7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGluZGV4LCBpc0ltcG9ydCkgPT4ge1xcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRNeVZhcihcXFwicHNfbmFtZVxcXCIsIFxcXCJcXFwiKS50cmltKCk7XFxuICAgICAgICBpZiAoIW5hbWUpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5ZCN5a2X5b6X5pyJ5LiA5Liq5ZCnXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCB1cmwgPSBnZXRNeVZhcihcXFwicHNfdXJsXFxcIiwgXFxcIlxcXCIpLnRyaW0oKTtcXG4gICAgICAgIGlmICghdXJsKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ino+aekOWcsOWdgOS4jeiDveS4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZmxhZyA9IGdldE15VmFyKFxcXCJwc19mbGFnXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKCFmbGFnKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ino+aekOWcsOWdgOagh+ivhuS4jeiDveS4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaGVhZGVycyA9IGdldE15VmFyKFxcXCJwc19oZWFkZXJzXFxcIiwgXFxcIlxcXCIpLnRyaW0oKTtcXG4gICAgICAgIGlmIChoZWFkZXJzKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgaGVhZGVycyA9IEpTT04ucGFyc2UoaGVhZGVycyk7XFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBoZWFkZXJzIT09XFxcIm9iamVjdFxcXCIpIHRocm93IG5ldyBFcnJvcihcXFwi6ZSZ6K+v57G75Z6L77yM5b+F6aG75Li6T2JqZWN0XFxcIik7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhlYWRlcnPmoLzlvI/plJnor686XFxcIiArIGUudG9TdHJpbmcoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcnVuVHlwZSA9IGdldE15VmFyKFxcXCJwc19ydW5UeXBlXFxcIiwgXFxcIldFQlxcXCIpO1xcbiAgICAgICAgbGV0IG1ldGhvZCA9IGdldE15VmFyKFxcXCJwc19tZXRob2RcXFwiLCBcXFwiR0VUXFxcIik7XFxuICAgICAgICBsZXQganNvblBhdGggPSBnZXRNeVZhcihcXFwicHNfanNvblBhdGhcXFwiLCBcXFwiXFxcIikudHJpbSgpIHx8IHZvaWQgMDtcXG4gICAgICAgIGxldCBqcyA9IGdldE15VmFyKFxcXCJwc19qc1xcXCIsIFxcXCJcXFwiKSB8fCB2b2lkIDA7XFxuICAgICAgICBpZiAocnVuVHlwZSA9PT0gXFxcIkpTT05cXFwiICYmICFqc29uUGF0aCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9KU09O5qih5byP5LiL5b+F6aG75aGranNvblBhdGhcXFwiO1xcbiAgICAgICAgfSBlbHNlIGlmIChydW5UeXBlID09PSBcXFwiSlNcXFwiICYmICFqcykge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9KU+aooeW8j+S4i+W/hemhu+Whq2pzXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICBsZXQgb2JqMSA9IHtcXG4gICAgICAgICAgICBuYW1lLFxcbiAgICAgICAgICAgIHVybCxcXG4gICAgICAgICAgICBmbGFnLFxcbiAgICAgICAgICAgIGhlYWRlcnMsXFxuICAgICAgICAgICAgcnVuVHlwZSxcXG4gICAgICAgICAgICBtZXRob2QsXFxuICAgICAgICAgICAganNvblBhdGgsXFxuICAgICAgICAgICAganNcXG4gICAgICAgIH07XFxuICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICBpZiAoYXJyLnNvbWUodiA9PiB2Lm5hbWUgPT09IG5hbWUpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lnu4/lrZjlnKjor6Xop6PmnpBcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAob2JqMS5ncm91cCkge1xcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBvYmoxLmdyb3VwO1xcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBhcnIuZmluZEluZGV4KHYgPT4gdi5ncm91cCA9PT0gZ3JvdXApO1xcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XFxuICAgICAgICAgICAgICAgICAgICBhcnIudW5zaGlmdChvYmoxKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDAsIG9iajEpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgaWYgKGlzSW1wb3J0KSB7XFxuICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChvYmoxKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGFyci51bnNoaWZ0KG9iajEpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgbmFtZXkgPSBhcnJbaW5kZXhdLm5hbWU7XFxuICAgICAgICAgICAgaWYgKG5hbWUgIT09IG5hbWV5KSB7XFxuICAgICAgICAgICAgICAgIGlmIChhcnIuc29tZSh2ID0+IHYubmFtZSA9PT0gbmFtZSkpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lnu4/lrZjlnKjor6Xop6PmnpBcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIG9iajEgPSBPYmplY3QuYXNzaWduKGFycltpbmRleF0sIG9iajEpO1xcbiAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEsIG9iajEpO1xcbiAgICAgICAgfVxcbiAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgIGJhY2sodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+d5a2Y5oiQ5YqfXFxcIjtcXG4gICAgfSwgaW5kZXgsIGlzSW1wb3J0KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbn0pO1xcblxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuino+aekOWvvOWFpVwiLFwicGF0aFwiOlwiaW1wb3J0XCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBzYXZlQ2FjaGUoanNvbikge1xcbiAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL2ppZXhpU2ltcGxlSW1wb3J0Lmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShqc29uKSk7XFxufVxcblxcbmZ1bmN0aW9uIGltcG9ydFBhcnNlKHBhc3MpIHtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBbXywgcnVsZSwgdHlwZV0gPSBwYXNzLnNwbGl0KFxcXCIkXFxcIik7XFxuICAgICAgICBpZiAodHlwZSA9PT0gXFxcImJcXFwiKSB7XFxuICAgICAgICAgICAgcnVsZSA9IHBhcnNlUGFzdGUocnVsZSk7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZShydWxlKSk7XFxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZXMpKSB7XFxuICAgICAgICAgICAgcnVsZXMgPSBbcnVsZXNdO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy9ydWxlcy5yZXZlcnNlKCk7XFxuICAgICAgICBNWV9VUkwgPSBtb2R1bGUuaWQ7XFxuICAgICAgICBsZXQgcnVsZVRpdGxlID0gZ2V0UGFyYW0oXFxcInJ1bGVcXFwiKTtcXG4gICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3M/cnVsZT1cXFwiICsgcnVsZVRpdGxlKS5nZXRKc29uKCk7XFxuICAgICAgICBsZXQgbmV3SSA9IDA7XFxuICAgICAgICBmb3IgKGxldCBydWxlIG9mIHJ1bGVzKSB7XFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gYXJyLmZpbmRJbmRleCh2ID0+IHYubmFtZSA9PT0gcnVsZS5uYW1lKTtcXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xcbiAgICAgICAgICAgICAgICBydWxlID0gT2JqZWN0LmFzc2lnbihhcnJbaW5kZXhdLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgIGlmIChydWxlcy5sZW5ndGggPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVDYWNoZShydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9pc0ltcG9ydD10cnVlJmluZGV4PVxcXCIgKyBpbmRleCArIFxcXCImcnVsZT1cXFwiICsgcnVsZVRpdGxlO1xcbiAgICAgICAgICAgICAgICAgICAgLy90b2FzdChcXFwi5bey5pu05paw6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2coXFxcIuW3suabtOaWsOinhOWIme+8mlxcXCIgKyBydWxlLm5hbWUpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBuZXdJKys7XFxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBpZiAocnVsZXMubGVuZ3RoID09PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBzYXZlQ2FjaGUocnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9ydWxlRWRpdCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/aXNJbXBvcnQ9dHJ1ZSZydWxlPVxcXCIgKyBydWxlVGl0bGU7XFxuICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KFxcXCLlt7Llr7zlhaXop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi5bey5a+85YWl6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChydWxlcy5sZW5ndGggPiAxKSB7XFxuICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzP3J1bGU9XFxcIiArIHJ1bGVUaXRsZSkuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICB0b2FzdChcXFwi5paw5aKe77yaXFxcIiArIG5ld0kgKyBcXFwiIOimhuebluabtOaWsO+8mlxcXCIgKyAocnVsZXMubGVuZ3RoIC0gbmV3SSkpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIHRvYXN0KFxcXCLlr7zlhaXlpLHotKVcXFwiKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBpbXBvcnRSdWxlKHBhc3MpIHtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBbXywgcnVsZSwgcG5hbWVdID0gcGFzcy5zcGxpdChcXFwiJFxcXCIpO1xcbiAgICAgICAgbGV0IHBhdGggPSBnZXRQdWJsaWNJdGVtKFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICghcGF0aCkge1xcbiAgICAgICAgICAgIE1ZX1VSTCA9IG1vZHVsZS5pZDtcXG4gICAgICAgICAgICBsZXQgcnVsZVRpdGxlID0gZ2V0UGFyYW0oXFxcInJ1bGVcXFwiKTtcXG4gICAgICAgICAgICB0b2FzdChcXFwi5pyq5oyH5a6a6buY6K6k5L+d5a2Y55uu5b2V77yM6K+35YWI6K6+572u5L+d5a2Y55uu5b2VXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2Uvc2hhcmVkZWZhdWx0cGF0aCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/cnVsZT1cXFwiK3J1bGVUaXRsZTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydWxlcyA9IGJhc2U2NERlY29kZShwYXJzZVBhc3RlKHJ1bGUpKTtcXG4gICAgICAgIGlmICghcnVsZXMpIHRvYXN0KFxcXCLlhoXlrrnkuLrnqbrvvIzlr7zlhaXlpLHotKVcXFwiKTtcXG4gICAgICAgIHBhdGggPSBwYXRoLmVuZHNXaXRoKFxcXCIvXFxcIikgPyBwYXRoIDogKHBhdGggKyBcXFwiL1xcXCIpO1xcbiAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBwbmFtZSwgcnVsZXMpO1xcbiAgICAgICAgdG9hc3QoXFxcIuWvvOWFpeaIkOWKn+ivt+WIt+aWsOmFjee9rlxcXCIpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl5aSx6LSlOlxcXCIgKyBlLnRvU3RyaW5nKCkpXFxuICAgIH1cXG59XFxuJC5leHBvcnRzID0gZnVuY3Rpb24ocGFzcywgbW9kZSkge1xcbiAgICBpZiAobW9kZSkge1xcbiAgICAgICAgcmV0dXJuIGltcG9ydFJ1bGUocGFzcyk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gaW1wb3J0UGFyc2UocGFzcyk7XFxuICAgIH1cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4bpopHop6PmnpBcIixcInBhdGhcIjpcInZpZGVvVXJsXCIsXCJydWxlXCI6XCJmdW5jdGlvbiBpc29mZmljaWFsKHVybCkge1xcbiAgbGV0IGZsYWcgPSBuZXcgUmVnRXhwKCdxcVxcXFwuY29tfGlxaXlpXFxcXC5jb218eW91a3VcXFxcLmNvbXxtZ3R2XFxcXC5jb218YmlsaWJpbGlcXFxcLmNvbXxzb2h1XFxcXC5jb218aXhpZ3VhXFxcXC5jb218cHB0dlxcXFwuY29tfG1pZ3V2aWRlb1xcXFwuY29tfGxlXFxcXC5jb218MTkwNVxcXFwuY29tfGZ1blxcXFwudHYnKTtcXG4gIHJldHVybiBmbGFnLnRlc3QodXJsKTtcXG59XFxuXFxuXFxuZnVuY3Rpb24gcHJlcGFyZVBhcnNlcyhwYXJzZXMsIHVybCwgcGxheWxpc3QsIGlzVGVzdCwgZmxhZykge1xcbiAgcGxheWxpc3QgPSBwbGF5bGlzdCB8fCB7XFxuICAgIHVybHM6IFtdLFxcbiAgICBuYW1lczogW10sXFxuICAgIGhlYWRlcnM6IFtdLFxcbiAgICBpczogXFxcIiNpc1ZpZGVvPXRydWUjXFxcIixcXG4gIH07XFxuICBsZXQgUHJveHkgPSAkLnJlcXVpcmUoXFxcIkxvY2FsUHJveHlcXFwiKTtcXG4gIGxldCBwcm94eVVybCA9IFByb3h5LnN0YXJ0UHJveHkoTVlfUlVMRS50aXRsZSwgR00uZ2V0U2VsZktleSgpKTtcXG4gIHBhcnNlcy5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgIGlmICghaXNUZXN0ICYmICh2LmZvcmJpZGRlbiB8fCAhU3RyaW5nKHYuZmxhZykuc3BsaXQoXFxcInxcXFwiKS5pbmNsdWRlcyhmbGFnKSkpIHJldHVybjtcXG4gICAgcGxheWxpc3QubmFtZXMucHVzaCh2Lm5hbWUpO1xcbiAgICBpZiAodi5oZWFkZXJzKSB7XFxuICAgICAgcGxheWxpc3QuaGVhZGVycy5wdXNoKHYuaGVhZGVycyk7XFxuICAgIH1cXG4gICAgaWYgKHYucnVuVHlwZSA9PT0gXFxcIkpTT05cXFwiKSB7XFxuICAgICAgbGV0IHBhcmFtID0ge1xcbiAgICAgICAgLy91cmw6IHYudXJsLFxcbiAgICAgICAgbWV0aG9kOiB2Lm1ldGhvZCxcXG4gICAgICAgIGhlYWRlcnM6IHYuaGVhZGVycyxcXG4gICAgICAgIGpzb25QYXRoOiB2Lmpzb25QYXRoXFxuICAgICAgfTtcXG4gICAgICBwbGF5bGlzdC51cmxzLnB1c2gocHJveHlVcmwgKyBcXFwiP3J1blR5cGU9SlNPTiZ1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChiYXNlNjRFbmNvZGUodi51cmwgKyB1cmwpKSArIFxcXCImcGFyYW09XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkocGFyYW0pKSkpO1xcbiAgICB9IGVsc2UgaWYgKHYucnVuVHlwZSA9PT0gXFxcIkpTXFxcIikge1xcbiAgICAgIHBsYXlsaXN0LnVybHMucHVzaChwcm94eVVybCArIFxcXCI/cnVuVHlwZT1KUyZ1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChiYXNlNjRFbmNvZGUodXJsKSkgKyAoaXNUZXN0ID8gXFxcIiZwYXJhbT1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeSh2KSkpIDogXFxcIiZpbmRleD1cXFwiICsgaSkpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIHBsYXlsaXN0LnVybHMucHVzaChcXFwidmlkZW86Ly9cXFwiICsgdi51cmwgKyB1cmwpO1xcbiAgICB9XFxuICB9KTtcXG4gIGlmICghcGxheWxpc3QudXJscy5sZW5ndGgpIHJldHVybiBcXFwid2ViOi8vXFxcIiArIHVybDtcXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5bGlzdCk7XFxufVxcblxcbmZ1bmN0aW9uIHVzZVBhcnNlcyh1cmwsIGZsYWcpIHtcXG4gIGxldCBwYXJzZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuXFxuICBpZiAoIXBhcnNlcy5sZW5ndGgpIHJldHVybiBcXFwid2ViOi8vXFxcIiArIHVybDtcXG4gIGxldCBwbGF5bGlzdCA9IHtcXG4gICAgdXJsczogW10sXFxuICAgIG5hbWVzOiBbXSxcXG4gICAgaGVhZGVyczogW10sXFxuICAgIGlzOiBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiLFxcbiAgfTtcXG4gIHRyeSB7XFxuICAgIGxldCB1c2VEYW5tdSA9ICEhZ2V0SXRlbShcXFwidXNlRGFubXVcXFwiLCBcXFwiXFxcIik7XFxuICAgIGlmICh1c2VEYW5tdSkge1xcbiAgICAgIHBsYXlsaXN0LmRhbm11ID0gJC5yZXF1aXJlKCdkbUZ1bj9ydWxlPWRt55uS5a2QJykuZG1Sb3V0ZSh1cmwpO1xcbiAgICB9XFxuICB9IGNhdGNoIHsgfVxcbiAgZmxhZyA9IFN0cmluZyhmbGFnKS5yZXBsYWNlKC9cXFxccy9nLCBcXFwiXFxcIik7XFxuICByZXR1cm4gcHJlcGFyZVBhcnNlcyhwYXJzZXMsIHVybCwgcGxheWxpc3QsIGZhbHNlLCBmbGFnKTtcXG59XFxuXFxuZnVuY3Rpb24gY2FycnlKcyhwbGF5LCBpZCkge1xcbiAgdmFyIGV4dHJhID0ge1xcbiAgICBcXFwidWFcXFwiOiBNT0JJTEVfVUFcXG4gIH1cXG4gIGxldCBwYXJzZSA9IHBsYXk7XFxuICBsZXQgcGFyc2Vfb2JqID0ge1xcbiAgICBkZWZSdWxlczogW1xcXCIqLm1wNFxcXCIsIFxcXCIqLm0zdThcXFwiXSxcXG4gIH07XFxuICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcInBhcnNlX2V4dHJhXFxcIikpIHtcXG4gICAgbGV0IHBhcnNlX2V4dHJhID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnNlLnBhcnNlX2V4dHJhKTtcXG4gICAgcGFyc2Vfb2JqID0gT2JqZWN0LmFzc2lnbihwYXJzZV9vYmosIHBhcnNlUXVlcnkocGFyc2VfZXh0cmEpKTtcXG4gICAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFwiaW5pdF9zY3JpcHRcXFwiKSkge1xcbiAgICAgIHBhcnNlX29ialtcXFwiaW5pdF9zY3JpcHRcXFwiXSA9IGJhc2U2NERlY29kZShwYXJzZV9vYmpbXFxcImluaXRfc2NyaXB0XFxcIl0pO1xcbiAgICB9XFxuICB9XFxuICBpZiAocGFyc2Vfb2JqLmhhc093blByb3BlcnR5KFxcXCJpc19wY1xcXCIpICYmIHBhcnNlX29ialtcXFwiaXNfcGNcXFwiXSA9PSBcXFwiMVxcXCIpIHtcXG4gICAgZXh0cmFbXFxcInVhXFxcIl0gPSBQQ19VQTtcXG4gIH1cXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwiaGVhZGVyXFxcIikpIHtcXG4gICAgZXh0cmFbXFxcInVhXFxcIl0gPSBwYXJzZVtcXFwiaGVhZGVyXFxcIl1bXFxcIlVzZXItQWdlbnRcXFwiXTtcXG4gICAgZXh0cmFbXFxcIlJlZmVyZXJcXFwiXSA9IHBhcnNlW1xcXCJoZWFkZXJcXFwiXVtcXFwiUmVmZXJlclxcXCJdO1xcbiAgICAvL2V4dHJhW1xcXCJyZWRpcmVjdFxcXCJdPWZhbHNlO1xcbiAgICAvKmV4dHJhW1xcXCJqc1xcXCJdID0gJC50b1N0cmluZygoanMpID0+IHtcXG4gICAgICBldmFsKGpzKVxcbiAgICAgIGZiYS5sb2cobmF2aWdhdG9yLnVzZXJBZ2VudClcXG4gICAgICBmYmEubG9nKGxvY2F0aW9uLmhyZWYpXFxuICAgIH0sICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuYXZpZ2F0b3IsICd1c2VyQWdlbnQnLCB7XFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgcmV0dXJuICdNeS1DdXN0b20tVUEtU3RyaW5nJztcXG4gICAgICAgIH1cXG4gICAgICB9KTtcXG4gICAgfSkpKi9cXG4gIH1cXG4gIGlmIChwYXJzZV9vYmouaGFzT3duUHJvcGVydHkoXFxcImN1c3RvbV9yZWdleFxcXCIpKSB7XFxuICAgIGxldCBjdXJyZW50ID0gcGFyc2Vfb2JqW1xcXCJkZWZSdWxlc1xcXCJdO1xcbiAgICBleHRyYVtcXFwidmlkZW9SdWxlc1xcXCJdID0gY3VycmVudC5jb25jYXQocGFyc2Vfb2JqLmN1c3RvbV9yZWdleC5zcGxpdCgvXFxcXHwvZykuZmlsdGVyKGUgPT4gZSkpXFxuICB9XFxuICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcImpzXFxcIikgJiYgcGFyc2UuanMgIT0gXFxcIlxcXCIpIHtcXG4gICAgZXh0cmFbXFxcImpzXFxcIl0gPSAkLnRvU3RyaW5nKChqcywgcGFyc2UsIHQpID0+IHtcXG4gICAgICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcImluaXRfc2NyaXB0XFxcIikpIHtcXG4gICAgICAgIC8vZmJhLmxvZyh0ICsgXFxcIjrmiafooYxpbml0X3NjcmlwdFxcXCIpO1xcbiAgICAgICAgZXZhbChwYXJzZS5pbml0X3NjcmlwdCk7XFxuICAgICAgfVxcbiAgICAgIC8vZmJhLmxvZyhuYXZpZ2F0b3IucGxhdGZvcm0pO1xcbiAgICAgIGlmIChqcy5pbmNsdWRlcyhcXFwiY2xpY2soKVxcXCIpKSB7XFxuICAgICAgICAvL2ZiYS5sb2codCArIFxcXCI65omn6KGManPngrnlh7tcXFwiKVxcbiAgICAgIH1cXG4gICAgICBldmFsKGpzKVxcbiAgICB9LCBwYXJzZS5qcywgcGFyc2Vfb2JqLCBNWV9SVUxFLnRpdGxlKVxcbiAgfVxcbiAgdHJ5IHtcXG4gICAgbGV0IGl0ZW0gPSBmaW5kSXRlbShpZCk7XFxuICAgIHVwZGF0ZUl0ZW0oaWQsIHtcXG4gICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih7fSwgaXRlbS5leHRyYSwgZXh0cmEpXFxuICAgIH0pO1xcbiAgfSBjYXRjaCAoZSkgeyB9XFxufVxcblxcbmZ1bmN0aW9uIHBhcnNlUXVlcnkocXVlcnkpIHtcXG4gIHZhciBvYmogPSB7fTtcXG4gIHF1ZXJ5LnNwbGl0KFxcXCImXFxcIikuZmlsdGVyKGUgPT4gZSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xcbiAgICB2YXIgcGFydHMgPSBpdGVtLnNwbGl0KFxcXCI9XFxcIik7XFxuICAgIG9ialtwYXJ0c1swXV0gPSBwYXJ0c1sxXTtcXG4gIH0pO1xcbiAgcmV0dXJuIG9iajtcXG59XFxuXFxuJC5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKGlucHV0LCBpZCwgc291cmNlKSB7XFxuICBsZXQgZHJweSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpLmdldEJ5U291cmNlKHNvdXJjZSk7XFxuICBpbnB1dCA9IGlucHV0LnNwbGl0KFxcXCIjXFxcIik7XFxuICBsZXQgc3BsYXkgPSBKU09OLnBhcnNlKGRycHkucGxheShpbnB1dFsxXSwgaW5wdXRbMF0ucmVwbGFjZShcXFwidHZib3gteGc6XFxcIiwgXFxcIlxcXCIpLCBbXSkpO1xcbiAgbGV0IHBsYXkgPSBzcGxheTtcXG5cXG4gIGxldCBtYXJrID0gZHJweS5nZXRSdWxlKFxcXCLnsbvlnotcXFwiKSA9PT0gXFxcIuWQrOS5plxcXCJ8fGRycHkuZ2V0UnVsZShcXFwidGl0bGVcXFwiKS5pbmNsdWRlcygnW+WQrF0nKSAgPyBcXFwiI2lzTXVzaWM9dHJ1ZSNcXFwiIDogXFxcIiNpc1ZpZGVvPXRydWUjXFxcIjtcXG4gIGlmICh0eXBlb2YgcGxheSAhPT0gXFxcIm9iamVjdFxcXCIgfHwgIXBsYXkudXJsKSB7XFxuICAgIHBsYXkgPSB7XFxuICAgICAgdXJsOiBpbnB1dFswXSxcXG4gICAgICBwYXJzZTogMVxcbiAgICB9O1xcbiAgICBpZiAoIXBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ov57mjqXkuLrnqbpcXFwiO1xcbiAgICB9XFxuICB9XFxuICBwbGF5ID0gT2JqZWN0LmFzc2lnbihwbGF5LCBzcGxheSk7XFxuXFxuICBwbGF5LnVybCA9IFN0cmluZyhwbGF5LnVybCk7XFxuICBpZiAocGxheS51cmwuaW5jbHVkZXMoXFxcInByb3h5P2RvXFxcIikgfHwgcGxheS51cmwuaW5jbHVkZXMoXFxcInByb3h5P2hpa2VyU2tleVxcXCIpKSB7XFxuICAgIE1ZX1VSTCA9IHBsYXkudXJsO1xcbiAgICBwbGF5LnVybCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwidXJsXFxcIiwgXFxcIlxcXCIpKTtcXG4gIH1cXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJwdXNoOi8vXFxcIikpIHtcXG4gICAgcGxheS51cmwgPSBwbGF5LnVybC5yZXBsYWNlKFxcXCJwdXNoOi8vXFxcIiwgXFxcIlxcXCIpO1xcbiAgfVxcbiAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcImh0dHBzOi8vcGFuLnF1YXJrLmNuL1xcXCIpKSB7XFxuICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3F1YXJrTGlzdD9ydWxlPVF1YXJrLueugCZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocGxheS51cmwpICsgXFxcIiZzaGFyZVB3ZD1cXFwiO1xcbiAgfVxcbiAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zLycpIHx8IHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcImh0dHBzOi8vd3d3LmFsaXBhbi5jb20vcy9cXFwiKSkge1xcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9hbGl5dW4/cnVsZT3kupHnm5jlkJsu566AJnBhZ2U9ZnlwYWdlJnJlYWx1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChwbGF5LnVybCk7XFxuICB9XFxuICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwicGljczovL1xcXCIpKSB7XFxuICAgIHJldHVybiBwbGF5LnVybDtcXG4gIH1cXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJub3ZlbDovL1xcXCIpKSB7XFxuICAgIHJldHVybiAkKFxcXCJoaWtlcjovL2VtcHR5I3JlYWRUaGVtZSNcXFwiKS5ydWxlKChkYXRhKSA9PiB7XFxuICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xcbiAgICAgIGxldCBsYXlvdXQgPSBbXTtcXG4gICAgICBsZXQgY29udGVudCA9IFxcXCLjgIDjgIBcXFwiICsgZGF0YS5jb250ZW50LnNwbGl0KC8oXFxcXG58XFxcXHIpKy8pLmZpbHRlcihpdCA9PiBpdC50cmltKCkubGVuZ3RoID4gMSkubWFwKGl0ID0+IGl0LnRyaW0oKSkuam9pbihcXFwiPGJyPuOAgOOAgFxcXCIpO1xcbiAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG4gICAgICAgIHRpdGxlOiAoXFxcIjxzdHJvbmc+XFxcIiArIGRhdGEudGl0bGUgKyBcXFwiPC9zdHJvbmc+XFxcIikuYmlnKCksXFxuICAgICAgfSk7XFxuXFxuICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGNvbnRlbnQsXFxuICAgICAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICB0ZXh0U2l6ZTogMTgsXFxuICAgICAgICAgIGNsaWNrOiB0cnVlXFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgICAgc2V0UmVzdWx0KGxheW91dCk7XFxuICAgIH0sIHBsYXkudXJsLnJlcGxhY2UoXFxcIm5vdmVsOi8vXFxcIiwgXFxcIlxcXCIpKTtcXG4gIH1cXG4gIC8vbG9nKHBsYXkpO1xcbiAgaWYgKHBsYXkucGFyc2UgPT09IDEgfHwgcGxheS5qeCA9PT0gMSkge1xcbiAgICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwibWFnbmV0OlxcXCIpKSB7XFxuICAgICAgcmV0dXJuIHBsYXkudXJsO1xcbiAgICB9XFxuICAgIGlkICYmIGNhcnJ5SnMocGxheSwgaWQpO1xcbiAgICBpZiAocGxheS5qeCA9PT0gMSB8fCAoaXNvZmZpY2lhbChwbGF5LnVybCkgJiYgKHBsYXkuZmxhZyB8fCBpbnB1dFsxXSkpKSB7XFxuICAgICAgcmV0dXJuIHVzZVBhcnNlcyhwbGF5LnVybCwgcGxheS5mbGFnIHx8IGlucHV0WzFdKTtcXG4gICAgfVxcbiAgICByZXR1cm4gXFxcInZpZGVvOi8vXFxcIiArIHBsYXkudXJsO1xcblxcbiAgfSBlbHNlIGlmIChwbGF5LnBhcnNlID09PSAwKSB7XFxuICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJtYWduZXQ6XFxcIikpIHtcXG4gICAgICByZXR1cm4gcGxheS51cmw7XFxuICAgIH1cXG4gICAgLy9sb2cocGxheSlcXG4gICAgdmFyIHBsYXlvYmogPSB7fTtcXG4gICAgcGxheW9iai51cmxzID0gW3BsYXkudXJsICsgbWFya107XFxuICAgIGlmIChwbGF5Lmhhc093blByb3BlcnR5KFxcXCJoZWFkZXJcXFwiKSkge1xcbiAgICAgIHBsYXlvYmpbXFxcImhlYWRlcnNcXFwiXSA9IHBsYXkuaGVhZGVyO1xcbiAgICB9XFxuICAgIGlmIChwbGF5Lmhhc093blByb3BlcnR5KFxcXCJkYW5tYWt1XFxcIikpIHtcXG4gICAgICBwbGF5b2JqW1xcXCJkYW5tdVxcXCJdID0gcGxheS5kYW5tYWt1O1xcbiAgICB9XFxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5b2JqKTtcXG4gIH0gZWxzZSB7XFxuICAgIHJldHVybiBwbGF5LnVybDtcXG4gIH1cXG59XFxuJC5leHBvcnRzLnByZXBhcmVQYXJzZXMgPSBwcmVwYXJlUGFyc2VzO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Yib5bu66K6i6ZiFXCIsXCJwYXRoXCI6XCJjcmVhdGVTdWJzY3JpcHRpb25cIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5Yib5bu66K6i6ZiFXFxcIik7XFxubGV0IGxheW91dCA9IFtdO1xcbmxldCBmID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX3N1YnVybF9pbnB1dFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfc3VibmFtZV9pbnB1dFxcXCIpO1xcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLorqLpmIXlkI3np7BcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJuYW1lX2lucHV0XFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBpZDogXFxcImRycHlIaWtlcl9zdWJuYW1lX2lucHV0XFxcIlxcbiAgICB9XFxufSk7XFxubGV0IHBhdGggPSBqb2luVXJsKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIiksIFxcXCIuLi9cXFwiLnJlcGVhdCg1KSkuc2xpY2UoNyk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiKS5leHRyYTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIiwge1xcbiAgICAgICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSksXFxuICAgICAgICByb290RGlyUGF0aDogcGF0aCxcXG4gICAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbiAgICAgICAgcGF0dGVybjogMVxcbiAgICB9KSksXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5YKo5a2Y6Lev5b6EXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGlkOiBcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCJcXG4gICAgfVxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLorqLpmIXlnLDlnYBcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJ1cmxfaW5wdXRcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGlkOiBcXFwiZHJweUhpa2VyX3N1YnVybF9pbnB1dFxcXCJcXG4gICAgfVxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLnoa7orqRcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkKSA9PiB7XFxuICAgICAgICBsZXQgcGF0aCA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc3VidXJsX2lucHV0XFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX3N1Ym5hbWVfaW5wdXRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoIShwYXRoICYmIHVybCAmJiBuYW1lKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3lj6/kuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJ1bGUgPSBiYXNlNjRFbmNvZGUoXFxcIua1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8muWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lXFxcIiArIG5hbWUgKyBcXFwiQEBcXFwiICsgdXJsK2BAanM9JC5yZXF1aXJlKCdzdWJzY3JpYmU/cnVsZT0ke01ZX1JVTEUudGl0bGV9JykucGFyc2VVcmwoaW5wdXQsICcke2Jhc2U2NEVuY29kZShwYXRoKX0nKWApO1xcbiAgICAgICAgcmV0dXJuIFxcXCJydWxlOi8vXFxcIiArIHJ1bGU7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbn0pO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6Q6K6i6ZiFXCIsXCJwYXRoXCI6XCJzdWJzY3JpYmVcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlHaXRodWIodXJsLCBwYXRoKSB7XFxuICAgIGxldCByb3BlID0gdXJsLnNwbGl0KFxcXCIvXFxcIikuc2xpY2UoMywgNSkuam9pbihcXFwiL1xcXCIpO1xcbiAgICBsZXQgaHRtbCA9IGZldGNoKHVybCk7XFxuICAgIFxcbiAgICBsZXQganNvblRleHQgPSBwZGZoKGh0bWwsIFxcXCIjcmVwby1jb250ZW50LXBqYXgtY29udGFpbmVyJiZzY3JpcHQmJkh0bWxcXFwiKTtcXG4gICAgXFxuICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XFxuICAgIGxldCBsaXN0ID0ganNvbi5wYXlsb2FkLnRyZWUuaXRlbXM7XFxuICAgIGxldCBydWxlcyA9IFtdO1xcbiAgICBsZXQgY291bnQgPSAwO1xcbiAgICBsZXQgbmFtZXMgPSBbXTtcXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gXFxcInRvYXN0Oi8v5Y+v6IO95Yig5bqT5LqGXFxcIjtcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgbmFtZSA9IGl0Lm5hbWU7XFxuICAgICAgICAgICAgbGV0IHNwYXRoID0gaXQucGF0aDtcXG4gICAgICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXFxcIi5qc1xcXCIpKSBjb250aW51ZTtcXG4gICAgICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIikpO1xcbiAgICAgICAgICAgIGxldCBydWxlID0gZmV0Y2goYGh0dHBzOi8vcmF3LmdpdG1pcnJvci5jb20vJHtyb3BlfS9tYXN0ZXIvJHtzcGF0aH1gKTtcXG4gICAgICAgICAgICBpZiAoISgoIXJ1bGUgfHwgIXJ1bGUuaW5jbHVkZXMoXFxcInJ1bGVcXFwiKSkgJiYgIWZpbGVFeGlzdChwYXRoICsgaXQubmFtZSkpKSB7XFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShwYXRoICsgaXQubmFtZSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgJ2tleSc6IGBoaXB5X2pzXyR7bmFtZX1gLFxcbiAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiBgJHtuYW1lfWAsXFxuICAgICAgICAgICAgICAgICAgICAndHlwZSc6IDMsXFxuICAgICAgICAgICAgICAgICAgICAnYXBpJzogJy4uL2xpYnMvZHJweTIuanMnLFxcbiAgICAgICAgICAgICAgICAgICAgJ3NlYXJjaGFibGUnOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgJ3F1aWNrU2VhcmNoJzogMSxcXG4gICAgICAgICAgICAgICAgICAgICdmaWx0ZXJhYmxlJzogMSxcXG4gICAgICAgICAgICAgICAgICAgICdleHQnOiBcXFwiLi9cXFwiICsgaXQubmFtZSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIGNvdW50Kys7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbmFtZXMucHVzaChpdC5uYW1lKTtcXG4gICAgfVxcbiAgICBkZWxldGVsb3NlKG5hbWVzLCBwYXRoKVxcbiAgICBcXG4gICAgd3JpdGVGaWxlKHBhdGggKyBcXFwiaW5kZXguanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgIHNpdGVzOiBydWxlc1xcbiAgICB9KSk7XFxuICAgIFxcbiAgICAvKlxcbiAgICB3cml0ZUZpbGUocGF0aC5yZXBsYWNlKC9cXFxcLmpzJC8sJy5qc29uJyksIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgIHNpdGVzOiBydWxlc1xcbiAgICB9KSk7XFxuICAgICovXFxuXFxuICAgIHJldHVybiBcXFwidG9hc3Q6Ly/miJDlip/mm7TmlrBcXFwiICsgY291bnQgKyBcXFwi5LiqXFxcIjs7XFxufVxcblxcbmZ1bmN0aW9uIGRlbGV0ZWxvc2UobmFtZXMsIHBhdGgpIHtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBwYXRoRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aCk7XFxuICAgICAgICBpZiAoIXBhdGhGaWxlLmlzRGlyZWN0b3J5KCkpIHJldHVybjtcXG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgcGF0aEZpbGUubGlzdEZpbGVzKCkpIHtcXG4gICAgICAgICAgICBsZXQgbmFtZSA9IFN0cmluZyhmaWxlLmdldE5hbWUoKSk7XFxuICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSB8fCBuYW1lcy5pbmNsdWRlcyhuYW1lKSkgY29udGludWU7XFxuICAgICAgICAgICAgZGVsZXRlRmlsZShmaWxlLmdldFBhdGgoKSk7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHRvYXN0KFxcXCLmuIXnkIblpLHmlYjmupDlpLHotKU6XFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2VuZXJhdGVDb25maWdCeUluZGV4KHVybCwgcGF0aCkge1xcbiAgICBsZXQganNvbiA9IEpTT04ucGFyc2UodG9Db3JyZWN0SlNPTlN0cmluZyhyZXF1ZXN0KHVybCkpKTtcXG4gICAgbGV0IGFyciA9IGpzb24uc2l0ZXM7XFxuICAgIGxldCBjb3VudCA9IDA7XFxuICAgIGxldCBpID0gMDtcXG4gICAgbGV0IG5hbWVzID0gW107XFxuICAgIGZvciAobGV0IGl0IG9mIGFycikge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAoKFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXCJkcnB5Mi5taW4uanNcXFwiKSB8fCBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIuanNcXFwiKSkpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpdC5leHQuZW5kc1dpdGgoXFxcIi5qc1xcXCIpID8gZGVjb2RlVVJJQ29tcG9uZW50KGl0LmV4dC5zcGxpdChcXFwiL1xcXCIpLmF0KC0xKSkgOiAoaXQubmFtZSArIFxcXCIuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGU7XFxuICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoaXQuZXh0KS5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGUgPSByZXF1ZXN0KGl0LmV4dCk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBydWxlID0gcmVxdWVzdChqb2luVXJsKHVybCwgaXQuZXh0KSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaXQuZXh0ID0gXFxcIi4vXFxcIiArIG5hbWU7XFxuICAgICAgICAgICAgICAgIGlmICghcnVsZSB8fCAhcnVsZS5pbmNsdWRlcyhcXFwicnVsZVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVFeGlzdChwYXRoICsgbmFtZSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxKTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUocGF0aCArIG5hbWUsIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpO1xcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGkrKztcXG4gICAgfVxcbiAgICBkZWxldGVsb3NlKG5hbWVzLCBwYXRoKTtcXG4gICAgd3JpdGVGaWxlKHBhdGggKyBcXFwiaW5kZXguanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG4gICAgLy93cml0ZUZpbGUocGF0aC5yZXBsYWNlKC9cXFxcLmpzJC8sJy5qc29uJyksIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG4gICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aIkOWKn+abtOaWsFxcXCIgKyBjb3VudCArIFxcXCLkuKpcXFwiO1xcbn1cXG4kLmV4cG9ydHMucGFyc2VVcmwgPSBmdW5jdGlvbiAodXJsLCBwYXRoKSB7XFxuICAgIHBhdGggPSBiYXNlNjREZWNvZGUocGF0aCk7XFxuICAgIHBhdGggPSBwYXRoLmVuZHNXaXRoKFxcXCIvXFxcIikgPyBwYXRoIDogcGF0aCArIFxcXCIvXFxcIjtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aChcXFwiaHR0cHM6Ly9naXRodWIuY29tL2hqZGhueC9cXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZ0J5R2l0aHViKHVybCwgcGF0aCk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZ0J5SW5kZXgodXJsLCBwYXRoKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICByZXR1cm4gXFxcImVycm9yOlxcXCIgKyBlLnRvU3RyaW5nKCk7XFxuICAgIH1cXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6L+Q6KGM5pe26YWN572u566h55CGXCIsXCJwYXRoXCI6XCJydW50aW1lQ29uZmlnXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBzZWFyY2hBbGxvd1BhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9EcnB5SGlrZXIvc2VhcmNoQWxsb3cuanNvblxcXCI7XFxubGV0IGlzUHJlcGFyZSA9IGZhbHNlO1xcbmxldCBjb25maWdzLCBjdXJyZW50Q29uZmlnID0ge30sXFxuICAgIHNvdXJjZUxpc3QsIGN1cnJlbnRTb3VyY2UsIHNlYXJjaEFsbG93ID0gW107XFxubGV0IHRhZ0NsYXNzZXM7XFxubGV0IHNUYWcgPSBcXFwiXFxcIjtcXG5sZXQgbG9hZEVycm9yO1xcblxcbmZ1bmN0aW9uIGluaXQoY29uZmlnKSB7XFxuICAgIGlmICghY29uZmlnKSByZXR1cm4gbnVsbDtcXG4gICAgaWYgKCFjb25maWcucGF0aCkgcmV0dXJuIG51bGw7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgZmlsZTtcXG4gICAgICAgIGxldCBzb3VyY2VMaXN0ID0gW107XFxuICAgICAgICBpZiAoY29uZmlnLnBhdGguc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpICYmIChmaWxlID0gbmV3IGphdmEuaW8uRmlsZShjb25maWcucGF0aC5yZXBsYWNlKFxcXCJmaWxlOi8vXFxcIiwgXFxcIlxcXCIpKSkuaXNEaXJlY3RvcnkoKSkge1xcbiAgICAgICAgICAgIHNvdXJjZUxpc3QgPSBnZW5lcmF0ZUNvbmZpZ0J5TG9jYWwoZmlsZSk7XFxuICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBcXFwibG9jYWxEaXJcXFwiO1xcbiAgICAgICAgICAgIC8vc291cmNlTGlzdD1bXTtcXG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhdGguc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpICYmIGNvbmZpZy5wYXRoLmVuZHNXaXRoKFxcXCIuanNcXFwiKSAmJiBmaWxlICYmIGZpbGUuaXNGaWxlKCkpIHtcXG4gICAgICAgICAgICBzb3VyY2VMaXN0ID0gZ2VuZXJhdGVDb25maWdCeUpzKGNvbmZpZy5wYXRoKTtcXG4gICAgICAgICAgICBjb25maWcudHlwZSA9IFxcXCJpbmRleGpzXFxcIjtcXG4gICAgICAgICAgICAvL3NvdXJjZUxpc3Q9W107XFxuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5wYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBzOi8vZ2l0aHViLmNvbVxcXCIpKSB7XFxuICAgICAgICAgICAgc291cmNlTGlzdCA9IGdlbmVyYXRlQ29uZmlnQnlHaXRodWIoY29uZmlnLnBhdGgpO1xcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gXFxcImdpdGh1YkRpclxcXCI7XFxuICAgICAgICAgICAgLy9zb3VyY2VMaXN0PVtdO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UodG9Db3JyZWN0SlNPTlN0cmluZyhmZXRjaChjb25maWcucGF0aCkgfHwgXFxcInt9XFxcIikpO1xcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uLnNpdGVzKSB8fCAhanNvbi5zaXRlcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGpzb24uaGFzT3duUHJvcGVydHkoXFxcInNpdGVzXFxcIikgJiYganNvbi5zaXRlcy5oYXNPd25Qcm9wZXJ0eShcXFwiZGF0YVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBqc29uLnNpdGVzID0ganNvbi5zaXRlcy5kYXRhO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLku47nvZHnu5zojrflj5bnmoTphY3nva7mlofku7bkuLrnqbrvvIzor7fmo4Dmn6XnvZHnu5xcXFwiKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBzb3VyY2VMaXN0ID0gZmlsdGVyT3RoZXIoanNvbi5zaXRlcyk7XFxuICAgICAgICAgICAgaWYgKHNvdXJjZUxpc3RbMF0uaGFzT3duUHJvcGVydHkoXFxcImlkXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgc291cmNlTGlzdCA9IHNvdXJjZUxpc3QubWFwKGl0ZW0gPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaGFzT3duUHJvcGVydHkoXFxcImlkXFxcIikgJiYgIWl0ZW0uaGFzT3duUHJvcGVydHkoXFxcImtleVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVtcXFwia2V5XFxcIl0gPSBpdGVtW1xcXCJpZFxcXCJdO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gXFxcImluZGV4XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGZpbGUgPSB2b2lkIDA7XFxuICAgICAgICBsZXQgY3VycmVudFNvdXJjZSwgc2VhcmNoQWxsb3c7XFxuICAgICAgICBpZiAoY29uZmlnLmNLZXkpIHtcXG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gc291cmNlTGlzdC5maW5kKHYgPT4gdi5rZXkgPT09IGNvbmZpZy5jS2V5KTtcXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRTb3VyY2UpIHtcXG4gICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZUxpc3RbMF07XFxuICAgICAgICAgICAgICAgIC8vY3VycmVudENvbmZpZy5jS2V5ID0gc291cmNlTGlzdFswXS5rZXk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gc291cmNlTGlzdFswXTtcXG4gICAgICAgICAgICAvL2NvbmZpZy5jS2V5ID0gc291cmNlTGlzdFswXS5rZXk7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHNlYXJjaEFsbG93ID0gSlNPTi5wYXJzZShmZXRjaChzZWFyY2hBbGxvd1BhdGgpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGRlbGV0ZUZpbGUoc2VhcmNoQWxsb3dQYXRoKTtcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdyA9IFtdO1xcbiAgICAgICAgfVxcbiAgICAgICAgbG9hZEVycm9yID0gdm9pZCAwO1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICBjdXJyZW50U291cmNlLFxcbiAgICAgICAgICAgIHNlYXJjaEFsbG93LFxcbiAgICAgICAgICAgIHNvdXJjZUxpc3RcXG4gICAgICAgIH07XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgbG9hZEVycm9yID0gZTtcXG4gICAgfVxcblxcbiAgICByZXR1cm4gbnVsbDtcXG59XFxuXFxuZnVuY3Rpb24gZ2VuZXJhdGVDb25maWdCeUxvY2FsKGRpckZpbGUpIHtcXG4gICAgbGV0IGxpc3QgPSBkaXJGaWxlLmxpc3RGaWxlcygpO1xcbiAgICBsZXQgcnVsZXMgPSBbXTtcXG5cXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgbGV0IG5hbWUgPSBTdHJpbmcoaXQuZ2V0TmFtZSgpKTtcXG4gICAgICAgIGxldCBwYXRoID0gaXQuZ2V0UGF0aCgpO1xcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSB8fCBpdC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXFxcIi5cXFwiKSk7XFxuICAgICAgICBydWxlcy5wdXNoKHtcXG4gICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ25hbWUnOiBgJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ3R5cGUnOiAzLFxcbiAgICAgICAgICAgICdzZWFyY2hhYmxlJzogMSxcXG4gICAgICAgICAgICAncXVpY2tTZWFyY2gnOiAxLFxcbiAgICAgICAgICAgICdmaWx0ZXJhYmxlJzogMSxcXG4gICAgICAgICAgICAnZXh0JzogYCR7cGF0aH1gLFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBtYXBwaW5nID0gZ2V0TG9hY2xNYXBwaW5nKFN0cmluZyhkaXJGaWxlLmdldFBhdGgoKSkpO1xcblxcbiAgICAgICAgaWYgKG1hcHBpbmcubGVuZ3RoKSB7XFxuICAgICAgICAgICAgZm9yIChsZXQgaXQgb2YgbWFwcGluZykge1xcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBydWxlcy5maW5kSW5kZXgodiA9PiB2Lm5hbWUgPT09IGl0LmtleSk7XFxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHJ1bGVzW2luZGV4XTtcXG4gICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKGluZGV4LCAwLCBPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7XFxuICAgICAgICAgICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtpdC50b2tleX1gLFxcbiAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiBgJHtpdC50b2tleX1gLFxcbiAgICAgICAgICAgICAgICAgICAgJ2V4dCc6IGl0ZW0uZXh0ICsgXFxcIj9cXFwiICsgaXQucGFyYW1zLFxcbiAgICAgICAgICAgICAgICAgICAgZGVsOiB2b2lkIDBcXG4gICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgICAgICBpdGVtLmRlbCA9IHRydWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJ1bGVzID0gcnVsZXMuZmlsdGVyKHYgPT4gIXYuZGVsKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcblxcbiAgICB9XFxuICAgIHJldHVybiBydWxlcztcXG59XFxuXFxuZnVuY3Rpb24gZ2V0TG9hY2xNYXBwaW5nKGRpckZpbGUpIHtcXG4gICAgLy9rZXlAcGFyYW1zQHR5cGVcXG4gICAgbGV0IG1hcHBpbmdQYXRoID0gXFxcImZpbGU6Ly9cXFwiICsgam9pblVybChkaXJGaWxlLCBcXFwiLi9cXFwiKSArIFxcXCIvLm1hcHBpbmcudHh0XFxcIjtcXG4gICAgbGV0IG1hcHBpbmcgPSBbXTtcXG4gICAgaWYgKCFmaWxlRXhpc3QobWFwcGluZ1BhdGgpKSByZXR1cm4gbWFwcGluZztcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBtYXBwaW5nVHh0ID0gZmV0Y2gobWFwcGluZ1BhdGgpO1xcbiAgICAgICAgbWFwcGluZ1R4dC5zcGxpdChcXFwiXFxcXG5cXFwiKS5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgIGxldCBba2V5LCBwYXJhbXMsIHRva2V5LCB0eXBlXSA9IHYuc3BsaXQoXFxcIkBcXFwiKTtcXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXFxcImJhc2U2NFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcGFyYW1zID0gYmFzZTY0RGVjb2RlKHBhcmFtcyk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcXFwidXJpXFxcIikge1xcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBkZWNvZGVVUklDb21wb25lbnQocGFyYW1zKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbWFwcGluZy5wdXNoKHtcXG4gICAgICAgICAgICAgICAga2V5LFxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXFxuICAgICAgICAgICAgICAgIHRva2V5OiB0b2tleSB8fCBrZXlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0pO1xcblxcbiAgICB9IGNhdGNoIChlKSB7IH1cXG4gICAgcmV0dXJuIG1hcHBpbmc7XFxufVxcbmZ1bmN0aW9uIGV2YWxKcyhjb2RlLCBnbG9iYWwpIHtcXG4gICAgbGV0IENvbnRleHQgPSBvcmcubW96aWxsYS5qYXZhc2NyaXB0LkNvbnRleHQ7XFxuICAgIGxldCBjeCA9IENvbnRleHQuZ2V0Q3VycmVudENvbnRleHQoKTtcXG4gICAgLy9sZXQgZ2xvYmFsID0gb3JnLm1vemlsbGEuamF2YXNjcmlwdC5TY3JpcHRhYmxlT2JqZWN0LmdldFRvcExldmVsU2NvcGUodGhpcyk7XFxuICAgIC8qaWYoIWN4LmdldExhbmd1YWdlVmVyc2lvbigpKXtcXG4gICAgICAgIGN4LnNldExhbmd1YWdlVmVyc2lvbihDb250ZXh0LlZFUlNJT05fRVM2KTtcXG4gICAgfSovXFxuICAgIGdsb2JhbCA9IGdsb2JhbCB8fCB7fTtcXG4gICAgcmV0dXJuIG9yZy5tb3ppbGxhLmphdmFzY3JpcHQuU2NyaXB0UnVudGltZS5ldmFsU3BlY2lhbChjeCwgZ2xvYmFsLCBnbG9iYWwsIFtTdHJpbmcoY29kZSldLCBcXFwiZXZhbCBjb2RlXFxcIiwgMSk7XFxufVxcblxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlKcyhqc1BhdGgpIHtcXG5cXG4gICAgbGV0IG1haW4gPSBldmFsSnMocmVxdWVzdChqc1BhdGgpLnJlcGxhY2UoL2FzeW5jXFxcXHMqP2Z1bmN0aW9uXFxcXHMqP21haW4vZywgXFxcImZ1bmN0aW9uIG1haW5cXFwiKSArIFxcXCJcXFxcbjttYWluO1xcXCIsIHtcXG4gICAgICAgIHBhdGhMaWI6IHtcXG4gICAgICAgICAgICBqb2luOiBqb2luVXJsLFxcbiAgICAgICAgICAgIHJlYWRGaWxlKHBhdGgpIHtcXG4gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpID8gcGF0aCA6IChcXFwiZmlsZTovL1xcXCIgKyBwYXRoKTtcXG5cXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHBhdGgpO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcmVhZERpcihwYXRoKSB7XFxuICAgICAgICAgICAgICAgIGxldCBuYW1lcyA9IFtdO1xcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aC5yZXBsYWNlKFxcXCJmaWxlOi8vXFxcIiwgXFxcIlxcXCIpKTtcXG5cXG4gICAgICAgICAgICAgICAgaWYgKCEoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRGlyZWN0b3J5KCkpKSByZXR1cm4gbmFtZXM7XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGZpbGUubGlzdEZpbGVzKCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzLnB1c2goU3RyaW5nKGl0LmdldE5hbWUoKSkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiBuYW1lcztcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGRpcm5hbWUocGEpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBqb2luVXJsKGpzUGF0aCwgcGEpO1xcbiAgICAgICAgICAgICAgICBsZXQgbmFtZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgpO1xcblxcbiAgICAgICAgICAgICAgICBpZiAoIShmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkpIHJldHVybiBuYW1lcztcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaXQgb2YgZGlyRmlsZS5saXN0RmlsZXMoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0LmlzRGlyZWN0b3J5KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMucHVzaChTdHJpbmcoaXQuZ2V0TmFtZSgpKSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhzO1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgc3RhdCgpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICAgIGxvZzogbG9nLFxcbiAgICAgICAgcGF0aDoganNQYXRoLFxcbiAgICAgICAgcGF0aF9kaXI6IGpvaW5VcmwoanNQYXRoLCBcXFwiLi9cXFwiKVxcbiAgICB9KTtcXG4gICAgbGV0IGpzb25UZXh0ID0gbWFpbigpO1xcbiAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpO1xcblxcbiAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSkge1xcbiAgICAgICAgcmV0dXJuIGZpbHRlck90aGVyKGpzb24pO1xcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbi5zaXRlcykgJiYganNvbi5zaXRlcy5sZW5ndGgpIHtcXG4gICAgICAgLy8gd3JpdGVGaWxlKGpvaW5VcmwoanNQYXRoLCBcXFwiLi9pbmRleC5qc29uXFxcIiksIGpzb25UZXh0KTtcXG4gICAgICAgLypcXG4gICAgICAgIGlmKCEvaW5kZXhcXFxcLmpzJC8udGVzdChqc1BhdGgpKXtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoanNQYXRoLnJlcGxhY2UoL1xcXFwuanMkLywnLmpzb24nKSwganNvblRleHQpO1xcbiAgICAgICAgfVxcbiAgICAgICAgKi9cXG4gICAgICAgIHdyaXRlRmlsZShqc1BhdGgucmVwbGFjZSgvXFxcXC5qcyQvLCcuanNvbicpLCBqc29uVGV4dCk7XFxuICAgICAgICByZXR1cm4gZmlsdGVyT3RoZXIoanNvbi5zaXRlcyB8fCBbXSk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2VuZXJhdGVDb25maWdCeUdpdGh1Yih1cmwpIHtcXG4gICAgLy91cmw9dXJsLnJlcGxhY2UoLygjR0lUSFVCIykkLyxcXFwiXFxcIik7XFxuICAgIGxldCBwcmVmaXggPSBnZXRJdGVtKFxcXCJnaXRodWJyYXdcXFwiLCBcXFwiaHR0cHM6Ly9yYXcuZ2l0bWlycm9yLmNvbVxcXCIpO1xcbiAgICBsZXQgcm9wZSA9IHVybC5zcGxpdChcXFwiL1xcXCIpLnNsaWNlKDMsIDUpLmpvaW4oXFxcIi9cXFwiKTtcXG4gICAgbGV0IGh0bWwgPSBmZXRjaCh1cmwpO1xcbiAgICBsZXQganNvblRleHQgPSBwZGZoKGh0bWwsIFxcXCIjcmVwby1jb250ZW50LXBqYXgtY29udGFpbmVyJiZzY3JpcHQmJkh0bWxcXFwiKTtcXG4gICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcXG4gICAgbGV0IGxpc3QgPSBqc29uLnBheWxvYWQudHJlZS5pdGVtcztcXG4gICAgbGV0IHJ1bGVzID0gW107XFxuICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgIGxldCBuYW1lID0gaXQubmFtZTtcXG4gICAgICAgIGxldCBwYXRoID0gaXQucGF0aDtcXG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikpIGNvbnRpbnVlO1xcbiAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKTtcXG4gICAgICAgIHJ1bGVzLnB1c2goe1xcbiAgICAgICAgICAgICdrZXknOiBgaGlweV9qc18ke25hbWV9YCxcXG4gICAgICAgICAgICAnbmFtZSc6IGAke25hbWV9YCxcXG4gICAgICAgICAgICAndHlwZSc6IDMsXFxuICAgICAgICAgICAgJ3NlYXJjaGFibGUnOiAxLFxcbiAgICAgICAgICAgICdxdWlja1NlYXJjaCc6IDEsXFxuICAgICAgICAgICAgJ2ZpbHRlcmFibGUnOiAxLFxcbiAgICAgICAgICAgICdleHQnOiBgJHtwcmVmaXh9LyR7cm9wZX0vbWFzdGVyLyR7cGF0aH1gLFxcbiAgICAgICAgfSk7XFxuICAgICAgICAvKlxcbiAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2hqZGhueC9oaXB5LXNlcnZlci90cmVlL21hc3Rlci9hcHAvdDQvZmlsZXMvZHJweV9qc1xcbiAgICAgICAgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2hqZGhueC9oaXB5LXNlcnZlci9tYXN0ZXIvYXBwL3Q0L2ZpbGVzL2RycHlfanMvMzYwJUU1JUJEJUIxJUU4JUE3JTg2JTVCJUU1JUFFJTk4JTVELmpzKi9cXG4gICAgfVxcbiAgICByZXR1cm4gcnVsZXM7XFxufVxcblxcbmZ1bmN0aW9uIHByZXBhcmUoY29uZmlnKSB7XFxuICAgIGxldCBkYXRhID0gaW5pdChjb25maWcpO1xcbiAgICBpZiAoIWRhdGEpIHJldHVybiBmYWxzZTtcXG4gICAgY3VycmVudFNvdXJjZSA9IGRhdGEuY3VycmVudFNvdXJjZTtcXG4gICAgc2VhcmNoQWxsb3cgPSBkYXRhLnNlYXJjaEFsbG93O1xcbiAgICBzb3VyY2VMaXN0ID0gZGF0YS5zb3VyY2VMaXN0O1xcbiAgICBjdXJyZW50Q29uZmlnID0gY29uZmlnO1xcbiAgICBzVGFnID0gY29uZmlnLnNUYWcgfHwgXFxcIlxcXCI7XFxuICAgIHJldHVybiB0cnVlO1xcbn1cXG5cXG5mdW5jdGlvbiBmaWx0ZXJPdGhlcihsaXN0KSB7XFxuICAgIGxldCBzdXBwb3J0VHlwZSA9IFswLCAxLCA0XTtcXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKGl0ID0+IFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXCJkcnB5Mi5taW4uanNcXFwiKSB8fCBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIuanNcXFwiKSB8fCBzdXBwb3J0VHlwZS5pbmNsdWRlcyhpdC50eXBlKSk7XFxufVxcblxcblxcbmZ1bmN0aW9uIGdldEN1cnJlbnRDb25maWcoKSB7XFxuICAgIHJldHVybiBjdXJyZW50Q29uZmlnIHx8IHt9O1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRDdXJyZW50Q29uZmlnKGNvbmZpZykge1xcbiAgICBsZXQgY3BhdGggPSAoY3VycmVudENvbmZpZyB8fCB7fSkucGF0aDtcXG4gICAgaWYgKHByZXBhcmUoY29uZmlnKSkge1xcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwiY3VycmVudENvbmZpZ1xcXCIsIGNvbmZpZyk7XFxuICAgICAgICBpZiAoY3BhdGggIT0gY29uZmlnLnBhdGgpIHtcXG4gICAgICAgICAgICBkZWxldGVGaWxlKHNlYXJjaEFsbG93UGF0aCk7XFxuICAgICAgICAgICAgc2VhcmNoQWxsb3cgPSBbXTtcXG4gICAgICAgICAgICB0YWdDbGFzc2VzID0gdm9pZCAwO1xcbiAgICAgICAgfVxcbiAgICAgICAgaXNQcmVwYXJlID0gdHJ1ZTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGZpbmRTb3VyY2Uoa2V5KSB7XFxuICAgIGxldCBzID0gc291cmNlTGlzdC5maW5kKHYgPT4gdi5rZXkgPT09IGtleSk7XFxuICAgIGlmIChzKSB7XFxuICAgICAgICBzLmV4dCA9IGdldEFic29sdXRlUGF0aChTdHJpbmcocy5leHQpKTtcXG4gICAgfVxcbiAgICByZXR1cm4gcztcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Q3VycmVudFNvdXJjZSgpIHtcXG4gICAgcmV0dXJuIGN1cnJlbnRTb3VyY2U7XFxufVxcblxcbmZ1bmN0aW9uIGdldEN1cnJlbnRTb3VyY2VQYXRoKCkge1xcbiAgICBsZXQgcGF0aCA9IFN0cmluZyhjdXJyZW50U291cmNlLmV4dCk7XFxuICAgIHJldHVybiBnZXRBYnNvbHV0ZVBhdGgocGF0aCk7XFxufVxcblxcbmZ1bmN0aW9uIGdldEFic29sdXRlUGF0aChwYXRoKSB7XFxuICAgIHBhdGggPSBTdHJpbmcocGF0aCk7XFxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXFxcImZpbGU6Ly9cXFwiKSkge1xcbiAgICAgICAgcmV0dXJuIHBhdGg7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gam9pblVybChjdXJyZW50Q29uZmlnLnBhdGgsIHBhdGgpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHNldEN1cnJlbnRTb3VyY2Uoa2V5KSB7XFxuICAgIGxldCBzb3VyY2UgPSBzb3VyY2VMaXN0LmZpbmQodiA9PiB2LmtleSA9PT0ga2V5KTtcXG4gICAgaWYgKHNvdXJjZSkge1xcbiAgICAgICAgY3VycmVudENvbmZpZy5jS2V5ID0ga2V5O1xcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwiY3VycmVudENvbmZpZ1xcXCIsIGN1cnJlbnRDb25maWcpO1xcbiAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9XFxuICAgIHJldHVybiBmYWxzZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Q2FuU2VhcmNoU291cmNlKCkge1xcbiAgICBsZXQgbGlzdCA9IHNvdXJjZUxpc3QuZmlsdGVyKHYgPT4gdi5zZWFyY2hhYmxlID09PSB1bmRlZmluZWQgfHwgdi5zZWFyY2hhYmxlKTtcXG4gICAgaWYgKGdldExlYWNoKCkpIHtcXG4gICAgICAgIGxpc3QgPSBsZWFjaExpc3QobGlzdCk7XFxuICAgIH1cXG4gICAgcmV0dXJuIGxpc3Q7XFxufVxcblxcbmZ1bmN0aW9uIGdldExlYWNoKCkge1xcbiAgICBsZXQgbGVhY2g7XFxuICAgIGxldCBnbGVhY2ggPSBnZXRJdGVtKFxcXCJsZWFjaFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgbGV0IHRsZWFjaCA9IGdldE15VmFyKFxcXCJ0ZW1wTGVhY2hcXFwiLCBcXFwiXFxcIik7XFxuICAgIGlmKHRsZWFjaCE9XFxcIlxcXCIpe1xcbiAgICAgIGxlYWNoPWZhbHNlO1xcbiAgICAgIHJldHVybiBsZWFjaDtcXG4gICAgfVxcbiAgICBpZihnbGVhY2ghPVxcXCJcXFwiKXtcXG4gICAgICBsZWFjaD10cnVlO1xcbiAgICB9XFxuICAgIHJldHVybiBsZWFjaHx8ZmFsc2U7XFxufVxcblxcbmZ1bmN0aW9uIGxlYWNoTGlzdChsaXN0KSB7XFxuICAgIHZhciByZWcgPSAvKFtcXFxcW+OAkF0pW+Wvhl0oW+OAkVxcXFxdXSkvO1xcbiAgICByZXR1cm4gbGlzdC5maWx0ZXIodiA9PiAhcmVnLnRlc3Qodi5uYW1lKSk7XFxufVxcblxcbmZ1bmN0aW9uIGdldEFsbFNvdXJjZSgpIHtcXG4gICAgbGV0IGxpc3QgPSBzb3VyY2VMaXN0LnNsaWNlKCk7XFxuICAgIGlmIChnZXRMZWFjaCgpKSB7XFxuICAgICAgICBsaXN0ID0gbGVhY2hMaXN0KGxpc3QpO1xcbiAgICB9XFxuICAgIHJldHVybiBsaXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRBbGxTb3VyY2VzKCkge1xcbiAgICByZXR1cm4gc291cmNlTGlzdDtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0U2VhcmNoQWxsb3coKSB7XFxuICAgIHJldHVybiBzZWFyY2hBbGxvdztcXG59XFxuXFxuZnVuY3Rpb24gc2V0U2VhcmNoQWxsb3coKSB7XFxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaEFsbG93KSkge1xcbiAgICAgICAgc2F2ZUZpbGUoc2VhcmNoQWxsb3dQYXRoLCBKU09OLnN0cmluZ2lmeShzZWFyY2hBbGxvdykpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdldFRhZ0NsYXNzZXMoKSB7XFxuICAgIGlmIChBcnJheS5pc0FycmF5KHRhZ0NsYXNzZXMpKSByZXR1cm4gdGFnQ2xhc3Nlcy5zbGljZSgpO1xcbiAgICB0YWdDbGFzc2VzID0gW107XFxuICAgIGlmIChpc1ByZXBhcmUgJiYgc291cmNlTGlzdCkge1xcbiAgICAgICAgc291cmNlTGlzdC5mb3JFYWNoKCh2KSA9PiB7XFxuICAgICAgICAgICAgbGV0IHRhZyA9IFN0cmluZyh2Lm5hbWUpLnNwbGl0KFxcXCJdXFxcIilbMF0uc3BsaXQoXFxcIltcXFwiKVsxXTtcXG4gICAgICAgICAgICBpZiAodGFnICYmICF0YWdDbGFzc2VzLmluY2x1ZGVzKHRhZykpIHtcXG4gICAgICAgICAgICAgICAgdGFnQ2xhc3Nlcy5wdXNoKHRhZyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHRhZ0NsYXNzZXMuc2xpY2UoKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0U2VhcmNoVGFnKHRhZykge1xcblxcbiAgICBpZiAodGFnQ2xhc3NlcyAmJiB0YWdDbGFzc2VzLmluY2x1ZGVzKHRhZykgfHwgKHR5cGVvZiB0YWcgPT09IFxcXCJzdHJpbmdcXFwiICYmICF0YWcpKSB7XFxuICAgICAgICBjdXJyZW50Q29uZmlnLnNUYWcgPSB0YWc7XFxuICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJjdXJyZW50Q29uZmlnXFxcIiwgY3VycmVudENvbmZpZyk7XFxuICAgICAgICBzVGFnID0gdGFnO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH1cXG4gICAgcmV0dXJuIGZhbHNlO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRTZWFyY2hUYWcoKSB7XFxuICAgIHJldHVybiBzVGFnO1xcbn1cXG5cXG5cXG5cXG5cXG5mdW5jdGlvbiBnZXRBbGxvd1NlYXJjaFNvdXJjZSh1c2VTVGFnKSB7XFxuICAgIGxldCBzbGlzdDtcXG4gICAgaWYgKHNlYXJjaEFsbG93Lmxlbmd0aCAmJiAhdXNlU1RhZykge1xcbiAgICAgICAgc2xpc3QgPSBzb3VyY2VMaXN0LmZpbHRlcih2ID0+IHNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzbGlzdCA9IHNvdXJjZUxpc3QuZmlsdGVyKHYgPT4gdi5zZWFyY2hhYmxlKTtcXG4gICAgfVxcbiAgICBpZiAodXNlU1RhZykge1xcbiAgICAgICAgaWYgKHNUYWcpIHtcXG4gICAgICAgICAgICBzbGlzdCA9IHNsaXN0LmZpbHRlcih2ID0+IFN0cmluZyh2Lm5hbWUpLmluY2x1ZGVzKFxcXCJbXFxcIiArIHNUYWcgKyBcXFwiXVxcXCIpKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgc2xpc3QgPSBzbGlzdC5maWx0ZXIodiA9PiAhL1xcXFxbLio/XFxcXF0vLnRlc3QoU3RyaW5nKHYubmFtZSkpKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAoc2xpc3QubGVuZ3RoID09IDApIHtcXG4gICAgICAgIHNsaXN0ID0gc291cmNlTGlzdC5zbGljZSgpO1xcbiAgICB9XFxuICAgIGlmIChnZXRMZWFjaCgpKSB7XFxuICAgICAgICBzbGlzdCA9IGxlYWNoTGlzdChzbGlzdCk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHNsaXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBpc1ByZXBhcmVkKCkge1xcbiAgICByZXR1cm4gaXNQcmVwYXJlO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRMb2FkRXJyb3IoKSB7XFxuICAgIHJldHVybiBsb2FkRXJyb3I7XFxufVxcblxcbmZ1bmN0aW9uIGluaXREZWZhdWx0KCkge1xcbiAgICByZXR1cm4gcHJlcGFyZShjdXJyZW50Q29uZmlnLnBhdGggPyBjdXJyZW50Q29uZmlnIDogc3RvcmFnZTAuZ2V0SXRlbShcXFwiY3VycmVudENvbmZpZ1xcXCIsIHt9KSk7XFxufVxcblxcblxcbmZ1bmN0aW9uIGluaXRBbmRGaWx0ZXIoKSB7XFxuICAgIGlzUHJlcGFyZSA9IGluaXREZWZhdWx0KCk7XFxuICAgIGlmICghZ2V0TXlWYXIoXFxcInRlbXBMZWFjaFxcXCIsIFxcXCJcXFwiKSAmJiBnZXRJdGVtKFxcXCJsZWFjaFxcXCIsIFxcXCJcXFwiKSAmJiBjdXJyZW50U291cmNlKSB7XFxuICAgICAgICBpZiAoY3VycmVudFNvdXJjZS5uYW1lLmluY2x1ZGVzKFxcXCJb5a+GXVxcXCIpKSB7XFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IG51bGw7XFxuICAgICAgICB9XFxuICAgIH1cXG59XFxuaW5pdEFuZEZpbHRlcigpO1xcbiQuZXhwb3J0cyA9IHtcXG4gICAgaW5pdCxcXG4gICAgcHJlcGFyZSxcXG4gICAgZ2V0Q3VycmVudENvbmZpZyxcXG4gICAgc2V0Q3VycmVudENvbmZpZyxcXG4gICAgZ2V0Q3VycmVudFNvdXJjZSxcXG4gICAgZ2V0Q3VycmVudFNvdXJjZVBhdGgsXFxuICAgIHNldEN1cnJlbnRTb3VyY2UsXFxuICAgIGdldENhblNlYXJjaFNvdXJjZSxcXG4gICAgZ2V0U2VhcmNoQWxsb3csXFxuICAgIHNldFNlYXJjaEFsbG93LFxcbiAgICBnZXRBbGxTb3VyY2UsXFxuICAgIGdldEFsbG93U2VhcmNoU291cmNlLFxcbiAgICBpc1ByZXBhcmVkLFxcbiAgICBnZXRBYnNvbHV0ZVBhdGgsXFxuICAgIGdldEFsbFNvdXJjZXMsXFxuICAgIGZpbmRTb3VyY2UsXFxuICAgIGdldFRhZ0NsYXNzZXMsXFxuICAgIHNldFNlYXJjaFRhZyxcXG4gICAgZ2V0U2VhcmNoVGFnLFxcbiAgICBnZXRMb2FkRXJyb3IsXFxuICAgIGluaXREZWZhdWx0XFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIue8lui+kemFjee9rlwiLFwicGF0aFwiOlwiY3JlYXRlQ29uZmlnXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgbGF5b3V0ID0gW107XFxuc2V0UGFnZVRpdGxlKFxcXCLliJvlu7rphY3nva5cXFwiKTtcXG5sZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbmxldCBjdXJyZW50Y29uZmlnID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50Q29uZmlnKCk7XFxubGV0IGYgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCIpO1xcbiAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIik7XFxufSk7XFxuXFxuLy/ljoblj7LphY3nva7orrDlvZVcXG5mdW5jdGlvbiB1bmlxdWVBcnJheUJ5UHJvcGVydHkoYXJyYXksIHByb3BlcnR5KSB7XFxuICBsZXQgdW5pcXVlID0gW107XFxuICBsZXQgbWFwID0gbmV3IE1hcCgpO1xcbiAgZm9yIChsZXQgaXRlbSBvZiBhcnJheSkge1xcbiAgICBsZXQga2V5ID0gaXRlbVtwcm9wZXJ0eV07XFxuICAgIGlmICghbWFwLmhhcyhrZXkpKSB7XFxuICAgICAgbWFwLnNldChrZXksIHRydWUpO1xcbiAgICAgIHVuaXF1ZS5wdXNoKGl0ZW0pO1xcbiAgICB9XFxuICB9XFxuICByZXR1cm4gdW5pcXVlO1xcbn1cXG5sZXQgY3BhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9EcnB5SGlrZXIvXFxcIiArIFxcXCJkcnB5Y29uZmlnLmpzb25cXFwiO1xcbmxldCBvbGRwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvXFxcIiArIFxcXCJkcnB5Y29uZmlnLmpzb25cXFwiXFxuaWYgKCFmaWxlRXhpc3QoY3BhdGgpICYmIGZpbGVFeGlzdChvbGRwYXRoKSkge1xcbiAgbGV0IGNvbnRlbnQgPSBKU09OLnBhcnNlKHJlYWRGaWxlKG9sZHBhdGgpKSB8fCBbXTtcXG4gIHNhdmVGaWxlKGNwYXRoLCBKU09OLnN0cmluZ2lmeShjb250ZW50KSk7XFxufVxcbmxldCBwYXRoY29uZmlncyA9IFtdO1xcbnRyeSB7XFxuICBwYXRoY29uZmlncyA9IEpTT04ucGFyc2UocmVhZEZpbGUoY3BhdGgpKSB8fCBbXTtcXG4gIC8vcHV0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdzXFxcIixwYXRoY29uZmlncyk7XFxufSBjYXRjaCAoZSkge1xcbiAgY29uc29sZS5sb2coZS5tZXNzYWdlKTtcXG59XFxucGF0aGNvbmZpZ3MgPSB1bmlxdWVBcnJheUJ5UHJvcGVydHkocGF0aGNvbmZpZ3MsIFxcXCJwYXRoXFxcIik7XFxuLy9sb2cocGF0aGNvbmZpZ3MpXFxuXFxubGV0IGNvbmZpZ3Nfb2JqID0ge1xcbiAgcGF0aDogY3BhdGgsXFxuICBjb25maWdzOiBwYXRoY29uZmlnc1xcbn1cXG4vL+WOhuWPsumFjee9ruiusOW9lVxcblxcbmxheW91dC5wdXNoKHtcXG4gIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gIHRpdGxlOiBcXFwi5o+Q56S6XFxcIixcXG4gIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3N5c3RlbS8yNy5wbmdcXFwiLFxcbiAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gICAgbGV0IHBvcCA9IGhpa2VyUG9wLmluZm9Cb3R0b20oe1xcbiAgICAgIGNvbnRlbnQ6IFxcXCLor6bnu4ZcXFwiLFxcbiAgICAgIG9wdGlvbnM6IFtcXG4gICAgICAgIFxcXCLnrKzkuIDnqboo5ZCN56ewKTrmlrnkvr/kuIvmrKHmib7liLBcXFwiLFxcbiAgICAgICAgXFxcIuesrOS6jOepuijot6/lvoQpW+Whq+acrOWcsOe0ouW8leWcsOWdgF066YCJ5oupSlNPTi9VUkzpgInpobnvvIzngrnlh7vml4HovrnnmoTpgInmi6nlj6/ku6XmtY/op4jmnKzlnLDmlofku7bpgInmi6nmnKzlnLDljIXnmoQuanNvbue0ouW8leaWh+S7tuWNs+WPr+OAglxcXFxuKOazqOaEj++8muS9v+eUqOatpOenjeaWueW8j++8jOWcqOacrOWcsOaWh+S7tuWkueWGheaWsOWinuaIluWIoOmZpC5qc+a6kOaXtumcgOimgeiHquihjOmFjee9ri5qc29u5paH5Lu2KVxcXCIsXFxuICAgICAgICBcXFwi56ys5LqM56m6KOi3r+W+hClb5aGr5pys5aGr6L+c56iL5Zyw5Z2AXTrnm7TmjqXloavlhpnov5znqIvpk77mjqXljbPlj6/kuIDoiKzmmK/ku6VodHRw5byA5aS0Lmpzb27nu5PlsL7vvIzkuZ/lj6/lj6/ku6XovpPlhaVnaXRodWLku5PlupPnmoTmlofku7blpLnlnLDlnYDjgILmraTnp43mlrnlvI/lj6/ku6Xkv53mjIHkuI7ov5znqIvphY3nva7ogIXlkIzmraXmm7TmlrDvvIzkvYbkuI3lpoLmnKzlnLDlv6vjgIJcXFwiLFxcbiAgICAgICAgXFxcIuesrOS6jOepuijot6/lvoQpW+Whq+acrOWcsOaWh+S7tuWkueWcsOWdgF066YCJ5oup5paH5Lu25aS56YCJ6aG577yM5Y+v5Lul55u05o6l6L6T5YWlanPmupDmiYDlnKgj5paH5Lu25aS5ISEhI+eahOi3r+W+hO+8jOS5n+WPr+S7peeCueWHu+aXgei+uemAieaLqea1j+iniOacrOWcsOi3r+W+hOmAieaLqSPmlofku7blpLkhISEj77yM5L2/55So6K+l56eN5pa55rOV77yM5Zyo5paH5Lu25aS55paw5aKe5oiW5Yig6Zmk5rqQ5pe277yM5LiN55So5omL5Yqo6YWN572uLmpzb27mlofku7bvvIzoh6rliqjor7vlj5bjgIIo5rOo5oSP77ya6ZyA6KaB5Yi35paw6YWN572u5oiW6YeN5ZCv6L2v5Lu25omN6IO96K+75Y+WKVxcXCIsXFxuICAgICAgICBcXFwiW1EmQV3kuLrku4DkuYjorqLpmIXpk77mjqXmnInlvojlpJrmupDvvIzljbTlj6ror4bliKvliLDkuoblh6DkuKrmupDvvJ9cXFxcbuacrOWwj+eoi+W6j+WPquaUr+aMgemBk+mVv+eahGRycHlbanNd6KeG6aKR5rqQ77yM5YW25LuW5LiA5qaC5LiN5pSv5oyB44CC5Zug5q2k5Lya6Ieq5Yqo6L+H5ruk5YW25LuW5rqQXFxcIixcXG4gICAgICAgIFxcXCJbUSZBXeaJk+eul+aUr+aMgeWFtuS7lnR2Ym9455qE5rqQ5ZCX77yf5LiN5pSv5oyB5LiN6ICD6JmR44CC6K+355yL5ZCN5a2XRHJweUhpa2Vy77yM5Y+q5pSv5oyBZHJwee+8jOimgeeUqOWFtuS7lua6kO+8jOW7uuiuruWIoOmZpOacrOWwj+eoi+W6j++8jOWOu+eUqOWQhOenjeWjs+WtkOOAglxcXCJcXG4gICAgICBdXFxuICAgIH0pO1xcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgfSksXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICBkZXNjOiBcXFwi5ZCN56ewKOW/heWhqylcXFwiLFxcbiAgZXh0cmE6IHtcXG4gICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIiwgXFxcIlxcXCIpLFxcbiAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCIsIGlucHV0KTtcXG4gICAgfSksXFxuICAgIGlkOiBcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIlxcbiAgfVxcbn0pO1xcbi8vbGV0IHNlbGVjdF9tb2RlPVxcXCIwXFxcIjtcXG5cXG5sZXQgc2VsZWN0X21vZGUgPSBnZXRJdGVtKFxcXCJzZWxlY3RfY29uZmlnX21vZGVcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBuYXYgPSBbXFxcIkpTT04vVVJML0pTXFxcIiwgXFxcIuaWh+S7tuWkuVxcXCJdO1xcblxcbm5hdi5mb3JFYWNoKCh4LCBpKSA9PiB7XFxuICBsYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChpID09IHNlbGVjdF9tb2RlID8geC5mb250Y29sb3IoXFxcIiMxNUI3NkNcXFwiKSA6IHgpLFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICBzZXRJdGVtKFxcXCJzZWxlY3RfY29uZmlnX21vZGVcXFwiLCBpICsgXFxcIlxcXCIpO1xcbiAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgaSksXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICB9KVxcbn0pXFxuXFxuXFxubGV0IHBhdGggPSBqb2luVXJsKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIiksIFxcXCIuLi9cXFwiLnJlcGVhdCg1KSkuc2xpY2UoNyk7XFxuXFxuaWYgKHNlbGVjdF9tb2RlID09IFxcXCIwXFxcIikge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIpLmV4dHJhO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwge1xcbiAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgfSksXFxuICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxuICAgICAgcGF0dGVybjogMCxcXG4gICAgICBmaWxlVHlwZTogXFxcIi5qc29ufC5qc1xcXCIsXFxuICAgIH0pKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLot6/lvoQoVVJML0pTT04vSlMvR2l0aHViKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwgaW5wdXQpO1xcbiAgICAgIH0pLFxcbiAgICAgIGlkOiBcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIlxcbiAgICB9XFxuICB9KTtcXG59XFxuaWYgKHNlbGVjdF9tb2RlID09IFxcXCIxXFxcIikge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfZm9sZGVyXFxcIikuZXh0cmE7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJkcnB5SGlrZXJfY29uZmlnX2ZvbGRlclxcXCIsIHtcXG4gICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgIH0pLFxcbiAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbiAgICAgIHBhdHRlcm46IDEsXFxuICAgICAgLy9maWxlVHlwZTogXFxcIi5qc29uXFxcIixcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIui3r+W+hCjmlofku7blpLkpXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiLCBpbnB1dCk7XFxuICAgICAgfSksXFxuICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfY29uZmlnX2ZvbGRlclxcXCJcXG4gICAgfVxcbiAgfSk7XFxufVxcbmxheW91dC5wdXNoKHtcXG4gIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICB0aXRsZTogXFxcIuehruiupFxcXCIsXFxuICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGNvYmopID0+IHtcXG4gICAgbGV0IHBhdGggPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwgXFxcIlxcXCIpO1xcbiAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiLCBcXFwiXFxcIik7XFxuICAgIGlmICghKHBhdGggJiYgbmFtZSkpIHtcXG4gICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5Y+v5Li656m6XFxcIjtcXG4gICAgfVxcbiAgICBwYXRoID0gcGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikgPyBwYXRoIDogcGF0aC5zdGFydHNXaXRoKFxcXCIvXFxcIikgPyAoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCkgOiBwYXRoO1xcbiAgICAvL2xvZyhwYXRoKVxcbiAgICB0cnkge1xcbiAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5Yqg6L296YWN572uLi4uXFxcIik7XFxuICAgICAgfVxcbiAgICAgIGxldCBjb25maWdjID0ge1xcbiAgICAgICAgcGF0aCxcXG4gICAgICAgIG5hbWUsXFxuICAgICAgfTtcXG4gICAgICBpZiAocnVudGltZUNvbmZpZy5zZXRDdXJyZW50Q29uZmlnKGNvbmZpZ2MpKSB7XFxuICAgICAgICBjb2JqLmNvbmZpZ3MucHVzaCh7XFxuICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgIG5hbWUsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGNsZWFySXRlbShcXFwibm9fbG9hZGluZ1xcXCIpO1xcbiAgICAgICAgc2F2ZUZpbGUoY29iai5wYXRoLCBKU09OLnN0cmluZ2lmeShjb2JqLmNvbmZpZ3MpKTtcXG5cXG4gICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICAgICAgICBEcnB5TWFuYWdlLmNsZWFyKCk7XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICQucmVxdWlyZShcXFwiQ2hhbmdlU291cmNlUG9wXFxcIikuc2hvdygxMDApO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgfVxcbiAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/phY3nva7mlofku7bmnInor69cXFwiO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBlLnRvU3RyaW5nKCk7XFxuICAgIH0gZmluYWxseSB7XFxuICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgfVxcbiAgfSwgY29uZmlnc19vYmopLFxcbiAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5cXG5pZiAocGF0aGNvbmZpZ3MubGVuZ3RoKSB7XFxuICBsYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIFxcXCI8c21hbGw+5Y6G5Y+y6YWN572u6K6w5b2VIOeCueaIkei/m+ihjOmFjee9ruajgOmqjDwvc21hbGw+XFxcIixcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChwKSA9PiB7XFxuICAgICAgLy9sb2cocClcXG4gICAgICBmdW5jdGlvbiB1bmlxdWUoYXJyKSB7XFxuICAgICAgICBjb25zdCByZXMgPSBuZXcgTWFwKCk7XFxuICAgICAgICByZXR1cm4gYXJyLmZpbHRlcigoYSkgPT4gIXJlcy5oYXMoYSkgJiYgcmVzLnNldChhLCAxKSlcXG4gICAgICB9XFxuICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcXG4gICAgICBpZiAocC5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aXoOWcsOWdgFxcXCI7XFxuICAgICAgfVxcbiAgICAgIGxpc3QgPSBwLm1hcCh4ID0+IHgucGF0aCk7XFxuICAgICAgdmFyIHRhc2sgPSBmdW5jdGlvbiAob2JqKSB7XFxuICAgICAgICBsZXQgcyA9IERhdGUubm93KCk7XFxuICAgICAgICBsZXQganNGaWxlcyA9IFtdO1xcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcXG5cXG4gICAgICAgIGZ1bmN0aW9uIGZpbHRlck90aGVyKGxpc3QpIHtcXG4gICAgICAgICAgcmV0dXJuIGxpc3QuZmlsdGVyKGl0ID0+IFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXCJkcnB5Mi5taW4uanNcXFwiKSB8fCBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIuanNcXFwiKSlcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChvYmoudXJsLnN0YXJ0c1dpdGgoXFxcImZpbGU6XFxcIikpIHtcXG4gICAgICAgICAgbGV0IGNvZGUgPSBcXFwibm9cXFwiO1xcbiAgICAgICAgICBsZXQgcGF0aCA9IG9iai51cmwucmVwbGFjZShcXFwiZmlsZTovL1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgbGV0IGRpciA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aCk7XFxuICAgICAgICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSkge1xcbiAgICAgICAgICAgIGxldCBmbGlzdCA9IGRpci5saXN0RmlsZXMoKTtcXG4gICAgICAgICAgICBmb3IgKHZhciBmIG9mIGZsaXN0KSB7XFxuICAgICAgICAgICAgICAvLyDmo4Dmn6Xmlofku7blkI3mmK/lkKbku6UuanPnu5PlsL5cXG4gICAgICAgICAgICAgIGlmIChmLmlzRmlsZSgpICYmIGYuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoXFxcIi5qc1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGpzRmlsZXMucHVzaChmKTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGRpci5pc0ZpbGUoKSAmJiBmaWxlRXhpc3Qob2JqLnVybCkpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVhZEZpbGUob2JqLnVybCkpO1xcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbi5zaXRlcykgfHwganNvbi5zaXRlcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgY291bnQgPSBmaWx0ZXJPdGhlcihqc29uLnNpdGVzKS5sZW5ndGg7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyB9XFxuICAgICAgICAgICAgY29kZSA9IFxcXCJva1xcXCI7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGpzRmlsZXMubGVuZ3RoID49IDUpIHtcXG4gICAgICAgICAgICBjb3VudCA9IGpzRmlsZXMubGVuZ3RoO1xcbiAgICAgICAgICAgIGNvZGUgPSBcXFwib2tcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdGltZTogKERhdGUubm93KCkgLSBzKSxcXG4gICAgICAgICAgICB1cmw6IG9iai51cmwsXFxuICAgICAgICAgICAgY291bnQ6IGNvdW50LFxcbiAgICAgICAgICAgIGNvZGU6IGNvZGUsXFxuICAgICAgICAgICAgaW5kZXg6IG9iai5pXFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHZhciBqID0gSlNPTi5wYXJzZShmZXRjaChvYmoudXJsLCB7XFxuICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlLFxcbiAgICAgICAgICB0aW1lb3V0OiA1MDAwLFxcbiAgICAgICAgfSkpO1xcbiAgICAgICAgbGV0IGUgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgbGV0IGMgPSBlIC0gcztcXG4gICAgICAgIGlmIChvYmoudXJsLmluY2x1ZGVzKFxcXCJnaXRodWIuY29tXFxcIikgJiYgai5zdGF0dXNDb2RlID09IDIwMCkge1xcbiAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHZhciBodG1sID0gai5ib2R5O1xcbiAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShwZGZoKGh0bWwsIFxcXCIjcmVwby1jb250ZW50LXBqYXgtY29udGFpbmVyJiZzY3JpcHQmJkh0bWxcXFwiKSk7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBqc29uLnBheWxvYWQudHJlZS5pdGVtcztcXG4gICAgICAgICAgICBjb3VudCA9IGxpc3QuZmlsdGVyKHggPT4geC5uYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkubGVuZ3RoO1xcbiAgICAgICAgICB9IGNhdGNoIHsgfVxcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHRvQ29ycmVjdEpTT05TdHJpbmcoai5ib2R5KSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbi5zaXRlcykgfHwganNvbi5zaXRlcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICBjb3VudCA9IGZpbHRlck90aGVyKGpzb24uc2l0ZXMpLmxlbmd0aDtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XFxuXFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICB0aW1lOiBjLFxcbiAgICAgICAgICB1cmw6IGoudXJsLFxcbiAgICAgICAgICBjb3VudDogY291bnQsXFxuICAgICAgICAgIGNvZGU6IGouc3RhdHVzQ29kZSxcXG4gICAgICAgICAgaW5kZXg6IG9iai5pLFxcbiAgICAgICAgfVxcbiAgICAgIH07XFxuICAgICAgbGV0IHRhc2tzID0gbGlzdC5tYXAoKHgsIGkpID0+IHtcXG4gICAgICAgIGkgPSBpICsgMTtcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgIGZ1bmM6IHRhc2ssXFxuICAgICAgICAgIHBhcmFtOiB7XFxuICAgICAgICAgICAgdXJsOiB4LFxcbiAgICAgICAgICAgIGk6IGkgLSAxLFxcbiAgICAgICAgICB9LFxcbiAgICAgICAgICBpZDogJ3Rhc2tpZCcgKyBpXFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgICAgdmFyIGNvdW50ID0gc3VjY2VzcyA9IHRhc2tzLmxlbmd0aDtcXG4gICAgICBiZSh0YXNrcywge1xcbiAgICAgICAgZnVuYzogZnVuY3Rpb24gKG9iaiwgaWQsIGVycm9yLCB0YXNrUmVzdWx0KSB7XFxuICAgICAgICAgIG9iai5yZXN1bHRzLnB1c2godGFza1Jlc3VsdClcXG4gICAgICAgICAgY291bnQgPSBjb3VudCAtIDE7XFxuICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcXG4gICAgICAgICAgICBzaG93TG9hZGluZyhcXFwi5qOA5rWL5LitLi4u5Ymp5L2Z5Zyw5Z2A77yaXFxcIiArIGNvdW50KVxcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICBoaTogJ2NjYycsXFxuICAgICAgICAgIHJlc3VsdHM6IHJlc3VsdHNcXG4gICAgICAgIH1cXG4gICAgICB9LCBzdWNjZXNzKTtcXG4gICAgICAvL2xvZyhyZXN1bHRzKVxcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcihmID0+IGYpO1xcbiAgICAgIHJlc3VsdHMuZm9yRWFjaCgoeCwgaSkgPT4ge1xcbiAgICAgICAgbGV0IGl0ZW0gPSBmaW5kSXRlbShcXFwicGF0aFxcXCIgKyB4LmluZGV4KTtcXG4gICAgICAgIGxldCByZWdleCA9IC8o5ZCN56ewOi4qPykoXFxcXHMrKT9cXFxcbi9nO1xcbiAgICAgICAgbGV0IHRpdGxlID0gXFxcIuWQjeensDpcXFwiICsgcFt4LmluZGV4XS5uYW1lICsgXFxcIiBcXFwiO1xcbiAgICAgICAgbGV0IHVybCA9IHBbeC5pbmRleF0ucGF0aDtcXG4gICAgICAgIGxldCBtc2cgPSBcXFwiXFxcIjtcXG4gICAgICAgIGxldCBjb3VudCA9IHguY291bnQgIT0gMCA/IFxcXCIg5rqQ5pWw6YePOlxcXCIgKyB4LmNvdW50IDogXFxcIlxcXCI7XFxuICAgICAgICBpZiAoL25vLy50ZXN0KHguY29kZSkpIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLphY3nva7mnInor69cXFwiLmZvbnRjb2xvcihcXFwicmVkXFxcIikgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoL14oLTF8MHw0MDQpLy50ZXN0KHguY29kZSkpIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLml6Dms5Xorr/pl65cXFwiLmZvbnRjb2xvcihcXFwicmVkXFxcIikgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoL14yMDAvLnRlc3QoeC5jb2RlKSkge1xcbiAgICAgICAgICBtc2cgPSBpdGVtLnRpdGxlLnJlcGxhY2UocmVnZXgsIHRpdGxlICsgXFxcIumAmuiur+ato+W4uFxcXCIuZm9udGNvbG9yKFxcXCIjM0NCMzcxXFxcIikgKyBcXFwiICDlu7bov586XFxcIiArIHgudGltZSArIGNvdW50ICsgXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAgIC8vdXJsID0gaXRlbS51cmw7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBtc2cgPSBpdGVtLnRpdGxlLnJlcGxhY2UocmVnZXgsIHRpdGxlICsgXFxcIumFjee9ruato+ehrlxcXCIuZm9udGNvbG9yKFxcXCIjM0NCMzcxXFxcIikgKyBjb3VudCArIFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgICAvL3VybCA9IGl0ZW0udXJsO1xcbiAgICAgICAgfVxcbiAgICAgICAgdXBkYXRlSXRlbShpdGVtLmV4dHJhLmlkLCB7XFxuICAgICAgICAgIHRpdGxlOiBtc2csXFxuICAgICAgICAgIC8vdXJsOiB1cmwsXFxuICAgICAgICB9KVxcbiAgICAgIH0pO1xcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwgcGF0aGNvbmZpZ3MpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICB9KTtcXG4gIHBhdGhjb25maWdzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgbGV0IGxvbmdDID0gW3tcXG4gICAgICB0aXRsZTogXFxcIuWQjeensFxcXCIsXFxuICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0sIHAsIGMpID0+IHtcXG4gICAgICAgIGxldCBpID0gYy5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gaXRlbS5uYW1lKTtcXG4gICAgICAgIGlmIChpICE9IC0xKSB7XFxuICAgICAgICAgIHJldHVybiAkKGNbaV0ubmFtZSwgXFxcIui+k+WFpeaWsOWQjeensFxcXCIpLmlucHV0KChjLCBwLCBpKSA9PiB7XFxuICAgICAgICAgICAgY1tpXS5uYW1lID0gaW5wdXQ7XFxuICAgICAgICAgICAgc2F2ZUZpbGUocCwgSlNPTi5zdHJpbmdpZnkoYykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIH0sIGMsIHAsIGkpXFxuICAgICAgICB9XFxuICAgICAgfSwgaXRlbSwgY3BhdGgsIHBhdGhjb25maWdzKVxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6IFxcXCLot6/lvoRcXFwiLFxcbiAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtLCBwLCBjKSA9PiB7XFxuICAgICAgICBsZXQgaSA9IGMuZmluZEluZGV4KHggPT4geC5uYW1lID09IGl0ZW0ubmFtZSk7XFxuICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICByZXR1cm4gJChjW2ldLnBhdGgsIFxcXCLovpPlhaXmlrDot6/lvoRcXFwiKS5pbnB1dCgoYywgcCwgaSkgPT4ge1xcbiAgICAgICAgICAgIGNbaV0ucGF0aCA9IGlucHV0O1xcbiAgICAgICAgICAgIHNhdmVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KGMpKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICB9LCBjLCBwLCBpKVxcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0sIGNwYXRoLCBwYXRoY29uZmlncylcXG4gICAgfSwge1xcbiAgICAgIHRpdGxlOiBcXFwi5Yig6ZmkXFxcIixcXG4gICAgICBqczogJC50b1N0cmluZygoaXRlbSwgcCwgYykgPT4ge1xcbiAgICAgICAgbGV0IGkgPSBjLmZpbmRJbmRleCh4ID0+IHgubmFtZSA9PSBpdGVtLm5hbWUpO1xcbiAgICAgICAgaWYgKGkgIT0gLTEpIHtcXG4gICAgICAgICAgYy5zcGxpY2UoaSwgMSk7XFxuICAgICAgICAgIHNhdmVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KGMpKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH1cXG4gICAgICB9LCBpdGVtLCBjcGF0aCwgcGF0aGNvbmZpZ3MpXFxuICAgIH1dO1xcbiAgICBpZiAoaXRlbS5wYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgIGxvbmdDLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLorr/pl65cXFwiLFxcbiAgICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0pID0+IHtcXG4gICAgICAgICAgaWYgKGl0ZW0ucGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcIndlYjovL1xcXCIgKyBpdGVtLnBhdGg7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0sIGl0ZW0pXFxuICAgICAgfSlcXG4gICAgfVxcbiAgICBsZXQgY3VycmVudCA9IFxcXCJcXFwiO1xcbiAgICBpZiAoY3VycmVudGNvbmZpZyAmJiBjdXJyZW50Y29uZmlnLmhhc093blByb3BlcnR5KFxcXCJwYXRoXFxcIikpIHtcXG4gICAgICBpZiAoaXRlbS5wYXRoID09IGN1cnJlbnRjb25maWcucGF0aCkge1xcbiAgICAgICAgY3VycmVudCA9IFxcXCLinqHvuI9cXFwiO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgXFxcIjxzbWFsbD5cXFwiICsgY3VycmVudCArIFxcXCLlkI3np7A6XFxcIiArIGl0ZW0ubmFtZSArIFxcXCJcXFxcbui3r+W+hDpcXFwiICsgaXRlbS5wYXRoICsgXFxcIjwvc21hbGw+XFxcIixcXG4gICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoaXRlbSA9PiB7XFxuICAgICAgICBjbGVhckl0ZW0oXFxcIm5vX2xvYWRpbmdcXFwiKTtcXG4gICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICBsZXQge1xcbiAgICAgICAgICBwYXRoLFxcbiAgICAgICAgICBuYW1lXFxuICAgICAgICB9ID0gaXRlbTtcXG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5Yqg6L296YWN572uLi4uXFxcIik7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAocnVudGltZUNvbmZpZy5zZXRDdXJyZW50Q29uZmlnKHtcXG4gICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgbmFtZSxcXG4gICAgICAgIH0pKSB7XFxuXFxuICAgICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICAgICAgICAgIERycHlNYW5hZ2UuY2xlYXIoKTtcXG4gICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICAgICQucmVxdWlyZShcXFwiQ2hhbmdlU291cmNlUG9wXFxcIikuc2hvdygxMDApO1xcbiAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIh+aNouWksei0pVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgfSwgaXRlbSksXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogJ3BhdGgnICsgaSxcXG4gICAgICAgIGxvbmdDbGljazogbG9uZ0NcXG4gICAgICB9XFxuICAgIH0pO1xcbiAgfSk7XFxufVxcblxcblxcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5o2i5rqQ5by556qXXCIsXCJwYXRoXCI6XCJDaGFuZ2VTb3VyY2VQb3BcIixcInJ1bGVcIjpcIiQuZXhwb3J0cy5zaG93ID0gZnVuY3Rpb24gKHRpbWUpIHtcXG4gIGlmICh0aW1lKSB7XFxuICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAodGltZSk7XFxuICB9XFxuICBsZXQge1xcbiAgICB1aV9jb25maWcsXFxuICAgIGdldFJhbmdlQ29sb3JzLFxcbiAgfSA9ICQucmVxdWlyZShcXFwiVUlNYW5hZ2VcXFwiKTtcXG4gIHVpX2NvbmZpZyA9IHVpX2NvbmZpZy55aTtcXG5cXG4gIGxldCB7XFxuICAgIGdldExlYWNoLFxcbiAgICBsZWFjaGxpc3RcXG4gIH0gPSAkLnJlcXVpcmUoXFxcIm1ldGhvZHNcXFwiKTtcXG5cXG4gIGxldCBsZWFjaCA9IGdldExlYWNoKCk7XFxuICAvL2xvZyhsZWFjaClcXG4gIGxlYWNobGlzdChsZWFjaCk7XFxuXFxuICBjb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCkgfHwge307XFxuXFxuICBsZXQgbmFtZSA9IHNvdXJjZS5uYW1lIHx8IFxcXCJcXFwiO1xcbiAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gIGxldCBjb2xvciA9IHVpX2NvbmZpZy7mjaLmupDpopzoibI7XFxuICBpZiAoY29sb3IgPT0gXFxcInJhbmRvbVxcXCIpIHtcXG4gICAgY29sb3IgPSBnZXRSYW5nZUNvbG9ycygpO1xcbiAgfVxcblxcbiAgbGV0IHNsaXN0ID0gQXJyYXkuZnJvbShydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZSgpKTtcXG5cXG4gIGxldCBzb3VyY2VOYW1lTGlzdCA9IHNsaXN0Lm1hcCh2ID0+IHtcXG4gICAgcmV0dXJuIHYubmFtZSA9PSBuYW1lID8gYOKAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjoke2NvbG9yfVxcXCI+JHt2Lm5hbWV9PC9zcGFuPmAgOiB2Lm5hbWU7XFxuICB9KTtcXG5cXG4gIGhpa2VyUG9wLnNldFVzZVN0YXJ0QWN0aXZpdHkoZmFsc2UpO1xcblxcbiAgZnVuY3Rpb24gZGF0ZUZvcm1hdChkYXRlKSB7XFxuICAgIGxldCB0ZXh0ID0gJ00tZGQgSEg6bW0nO1xcbiAgICByZXR1cm4gJC5kYXRlRm9ybWF0KGRhdGUuZ2V0VGltZSgpLCB0ZXh0KTtcXG4gIH1cXG5cXG4gIGxldCBkYXRldGltZSA9IGRhdGVGb3JtYXQobmV3IERhdGUoKSk7XFxuICBsZXQgcHMgPSBkYXRldGltZS5zcGxpdChcXFwiIFxcXCIpWzFdLnNwbGl0KCc6JykucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgcGFyc2VJbnQodmFsLCAxMCksIDApO1xcblxcbiAgLy/mjpLluo/mlrnms5VcXG4gIGxldCB7XFxuICAgIG5hdHVyYWxTb3J0LFxcbiAgICB1c2luZ1NvcnQsXFxuICAgIHJlbW92ZUh0bWxUYWdzXFxuICB9ID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIik7XFxuXFxuICBsZXQgc3BlbiA9IDM7XFxuICBsZXQgaXRlbXMgPSBzb3VyY2VOYW1lTGlzdC5tYXAoKHgsIGkpID0+IHtcXG4gICAgcmV0dXJuIHtcXG4gICAgICB0aXRsZTogeCxcXG4gICAgICB1cmw6IGlcXG4gICAgfVxcbiAgfSlcXG5cXG4gIGxldCBuYW1lcyA9IGl0ZW1zLm1hcCh2ID0+IHYudGl0bGUpO1xcbiAgbGV0IHNuYW1lID0gbmFtZXMuc2xpY2UoKTtcXG4gIGlmIChnZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgXFxcIlxcXCIpKSB7XFxuICAgIG5hbWVzID0gbmF0dXJhbFNvcnQobmFtZXMpO1xcbiAgfVxcbiAgaWYgKGdldEl0ZW0oXFxcInVzaW5nc3RcXFwiLCBcXFwiXFxcIikpIHtcXG4gICAgbmFtZXMgPSB1c2luZ1NvcnQuZ2V0KG5hbWVzKTtcXG4gIH1cXG5cXG4gIGxldCBtYW5hZ2VfYWxsID0gbmFtZXMuc2xpY2UoKTtcXG4gIGxldCBzZWFyY2hLZXkgPSBcXFwiXFxcIjtcXG4gIGxldCBpbnB1dEJveDtcXG4gIGxldCBwb3AgPSBoaWtlclBvcC5zZWxlY3RCb3R0b21SZXMoe1xcbiAgICBvcHRpb25zOiBuYW1lcyxcXG4gICAgY29sdW1uczogc3BlbixcXG4gICAgdGl0bGU6IFxcXCLpgInmi6nop4bpopHmupAg5b2T5YmN5YWxOlxcXCIgKyBpdGVtcy5sZW5ndGggKyBcXFwi5Liq6KeG6aKR5rqQXFxcIixcXG4gICAgbm9BdXRvRGlzbWlzczogdHJ1ZSxcXG4gICAgcG9zaXRpb246IDEsXFxuICAgIGV4dHJhSW5wdXRCb3g6IChpbnB1dEJveCA9IG5ldyBoaWtlclBvcC5SZXNFeHRyYUlucHV0Qm94KHtcXG4gICAgICBoaW50OiBcXFwi5rqQ5YWz6ZSu5a2XXFxcIixcXG4gICAgICB0aXRsZTogXFxcIlRBR1xcXCIsXFxuICAgICAgb25DaGFuZ2UodGV4dCwgbWFuYWdlKSB7XFxuICAgICAgICAvL2xvZyhcXFwib25DaGFuZ2U6XFxcIit0ZXh0KVxcblxcbiAgICAgICAgaWYgKCEvXlxcXFxbLipcXFxcXSQvLnRlc3QodGV4dCkpIHtcXG4gICAgICAgICAgcHV0TXlWYXIoXFxcInNlYXJjaFNvdXJjZVRhZ1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBmbGlzdCA9IG5hbWVzLmZpbHRlcih4ID0+IHguaW5jbHVkZXModGV4dCkpO1xcbiAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgIGZsaXN0LmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICB9KTtcXG4gICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG5cXG4gICAgICB9LFxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcInNlYXJjaFNvdXJjZVRhZ1xcXCIsIFxcXCJcXFwiKSxcXG4gICAgICBjbGljayhzLCBtYW5hZ2UpIHtcXG4gICAgICAgIGxldCB0YWdDbGFzc2VzID0gcnVudGltZUNvbmZpZy5nZXRUYWdDbGFzc2VzKCk7XFxuICAgICAgICBpZiAoIXRhZ0NsYXNzZXMubGVuZ3RoKSByZXR1cm4gXFxcInRvYXN0Oi8v5b2T5YmN6YWN572u5rKh5pyJVEFH5ZOm44CCXFxcIjtcXG4gICAgICAgIHRhZ0NsYXNzZXMudW5zaGlmdChcXFwi5YWo6YOoXFxcIik7XFxuICAgICAgICBoaWtlclBvcC5zZWxlY3RDZW50ZXIoe1xcbiAgICAgICAgICBvcHRpb25zOiB0YWdDbGFzc2VzLFxcbiAgICAgICAgICBjb2x1bW5zOiAzLFxcbiAgICAgICAgICB0aXRsZTogXFxcIlRBR1tcXFwiICsgdGFnQ2xhc3Nlcy5sZW5ndGggKyBcXFwiXVxcXCIsXFxuICAgICAgICAgIGNsaWNrKGEpIHtcXG4gICAgICAgICAgICBsZXQgdGFnID0gYTtcXG4gICAgICAgICAgICBpZiAoYSA9PSBcXFwi5YWo6YOoXFxcIikge1xcbiAgICAgICAgICAgICAgdGFnID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIHRhZyA9IFxcXCJbXFxcIiArIGEgKyBcXFwiXVxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaW5wdXRCb3guc2V0RGVmYXVsdFZhbHVlKHRhZyk7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInNlYXJjaFNvdXJjZVRhZ1xcXCIsIHRhZyk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgIH0sXFxuICAgICAgdGl0bGVWaXNpYmxlOiB0cnVlXFxuICAgIH0pKSxcXG4gICAgbG9uZ0NsaWNrKHMsIGkpIHtcXG4gICAgICBzaG93U2VsZWN0T3B0aW9ucyh7XFxuICAgICAgICB0aXRsZTogXFxcIuWIhuS6q+inhumikea6kFxcXCIsXFxuICAgICAgICBvcHRpb25zOiBbXFxcIkpT5paH5Lu25YiG5LqrXFxcIl0uY29uY2F0KGdldFBhc3RlcygpKSxcXG4gICAgICAgIGNvbDogMixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKG5hbWUgPT4ge1xcbiAgICAgICAgICBjb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgIGxldCBzb3VyY2VzID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKTtcXG4gICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZXMuZmluZCh2ID0+IHYubmFtZSA9PSBuYW1lKTtcXG4gICAgICAgICAgbGV0IHBhdGggPSBydW50aW1lQ29uZmlnLmdldEFic29sdXRlUGF0aChzb3VyY2UuZXh0KTtcXG4gICAgICAgICAgbGV0IHBuYW1lID0gcGF0aC5zcGxpdChcXFwiL1xcXCIpLmF0KC0xKTtcXG4gICAgICAgICAgbGV0IHJ1bGUgPSBmZXRjaChwYXRoKTtcXG4gICAgICAgICAgbGV0IGVuY29kZU1vZGUgPSBnZXRJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgIGlmIChlbmNvZGVNb2RlICYmIC92YXIgcnVsZXxbXFxcXHU0RTAwLVxcXFx1OUZBNV0rfGZ1bmN0aW9ufGxldCB8dmFyIHxjb25zdCB8XFxcXCh8XFxcXCl8XFxcInwnLy50ZXN0KHJ1bGUpKSB7XFxuICAgICAgICAgICAgaWYgKGVuY29kZU1vZGUgPT09IFxcXCJHemlwXFxcIikge1xcbiAgICAgICAgICAgICAgbGV0IEdaSVAgPSAkLnJlcXVpcmUoXFxcIkdaSVBcXFwiKTtcXG4gICAgICAgICAgICAgIHJ1bGUgPSBHWklQLnppcChydWxlKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVuY29kZU1vZGUgPT09IFxcXCJCYXNlNjRcXFwiKSB7XFxuICAgICAgICAgICAgICBydWxlID0gYmFzZTY0RW5jb2RlKHJ1bGUpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RlTW9kZSA9PT0gXFxcIkFFU1xcXCIpIHtcXG4gICAgICAgICAgICAgIGNvbnN0IENyeXB0b1V0aWwgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vYXNzZXRzL2NyeXB0by1qYXZhLmpzXFxcIik7XFxuICAgICAgICAgICAgICBsZXQga2V5ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KFxcXCI2ODZBNjQ2ODZFNzgwQTBBMEEwQTBBMEEwQTBBMEEwQVxcXCIpO1xcbiAgICAgICAgICAgICAgbGV0IGl2ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KFxcXCI2NDdBNzk3OTY0NzMwQTBBMEEwQTBBMEEwQTBBMEEwQVxcXCIpO1xcbiAgICAgICAgICAgICAgbGV0IHRleHREYXRhID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlVVRGOChydWxlKTtcXG4gICAgICAgICAgICAgIGxldCBlbmNyeXB0ZWQwID0gQ3J5cHRvVXRpbC5BRVMuZW5jcnlwdCh0ZXh0RGF0YSwga2V5LCB7XFxuICAgICAgICAgICAgICAgIG1vZGU6IFxcXCJBRVMvQ0JDL1BLQ1M3UGFkZGluZ1xcXCIsXFxuICAgICAgICAgICAgICAgIGl2OiBpdlxcbiAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICBydWxlID0gZW5jcnlwdGVkMC50b0Jhc2U2NChfYmFzZTY0Lk5PX1dSQVApO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAoIXJ1bGUpIHJldHVybiBcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFwiO1xcbiAgICAgICAgICBpZiAoTVlfSU5ERVggPT09IDApIHtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL1xcXCIgKyBwbmFtZSwgcnVsZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJzaGFyZTovL2hpa2VyOi8vZmlsZXMvX2NhY2hlL1xcXCIgKyBwbmFtZTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gc2hhcmVQYXN0ZShiYXNlNjRFbmNvZGUocnVsZSksIGlucHV0KTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly/mtbfpmJTop4bnlYzvvIxEUlBZ6KeG6aKR5rqQ44CMXFxcIiArIG5hbWUgKyBcXFwi44CN5aSN5Yi25pW05p2h5Y+j5Luk5omT5byA6L2v5Lu25bCx5Lya6Ieq5Yqo5a+85YWlJFxcXCIgKyB1cmwgKyBcXFwiJFxcXCIgKyBwbmFtZSArIFxcXCJAaW1wb3J0PWpzOiQucmVxdWlyZSgnaW1wb3J0P3J1bGU9JytcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFwiKShpbnB1dCwgdHJ1ZSlcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LCByZW1vdmVIdG1sVGFncyhzKSlcXG4gICAgICB9KTtcXG4gICAgfSxcXG4gICAgY2xpY2socywgaSwgbWFuYWdlKSB7XFxuICAgICAgcG9wLmRpc21pc3MoKTtcXG4gICAgICBzZXRJdGVtKFxcXCJub19sb2FkaW5nXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAvLyBtYW5hZ2UubGlzdC5mb3JFYWNoKCh2LCBpaSkgPT4gKFxcbiAgICAgIC8vICAgbWFuYWdlLmxpc3RbaWldID0gaSA9PT0gaWkgPyBcXFwi4oCY4oCYXFxcIiArIG5hbWVzW2lpXSArIFxcXCLigJnigJlcXFwiIDogbmFtZXNbaWldLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKVxcbiAgICAgIC8vICkpO1xcbiAgICAgIGxldCBuYW1lID0gcmVtb3ZlSHRtbFRhZ3MobWFuYWdlLmxpc3RbaV0pO1xcblxcbiAgICAgIGlmIChuYW1lID09IHNvdXJjZS5uYW1lKSB7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuO1xcbiAgICAgIH1cXG4gICAgICBsZXQgc291cmNlcyA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxuICAgICAgbGV0IGtleSA9IHNvdXJjZXMuZmluZCh2ID0+IHYubmFtZSA9PSBuYW1lKS5rZXk7XFxuXFxuICAgICAgdXNpbmdTb3J0LnNldChuYW1lKTtcXG5cXG4gICAgICAvL21hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICBsZXQgc291cmNlTmFtZUxpc3QgPSBydW50aW1lQ29uZmlnLnNldEN1cnJlbnRTb3VyY2Uoa2V5KTtcXG5cXG4gICAgICBjbGVhck15VmFyKFxcXCJjYXRlaVxcXCIpO1xcbiAgICAgIGNsZWFyTXlWYXIoXFxcImNhdGVfb2JqXFxcIik7XFxuICAgICAgY2xlYXJNeVZhcihcXFwiaXNob21lXFxcIik7XFxuICAgICAgY2xlYXJNeVZhcihcXFwibGlua3NcXFwiKTtcXG4gICAgICByZWZyZXNoUGFnZSgpO1xcblxcbiAgICB9LFxcbiAgICBtZW51Q2xpY2sobWFuYWdlKSB7XFxuICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXG4gICAgICAgIG9wdGlvbnM6IFtcXFwi5pS55Y+Y5qC35byPXFxcIiwgXFxcIuWAkuW6j1xcXCIsIFxcXCLoh6rnhLbmjpLluo86XFxcIiArIChnZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgXFxcIlxcXCIpID09IFxcXCJcXFwiID8gXFxcIuWFs+mXrVxcXCIgOiBcXFwi5ZCv55SoXFxcIiksIFxcXCLkvb/nlKjmjpLluo86XFxcIiArIChnZXRJdGVtKFxcXCJ1c2luZ3N0XFxcIiwgXFxcIlxcXCIpID09IFxcXCJcXFwiID8gXFxcIuWFs+mXrVxcXCIgOiBcXFwi5ZCv55SoXFxcIiksIFxcXCLliLfmlrDphY3nva5cXFwiLCBcXFwi5YiG5Lqr5pe257yW56CBOlxcXCIgKyBnZXRJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiLCBcXFwi5LiN57yW56CBXFxcIiksIFxcXCLpnZLlsJHlubTmqKHlvI86XFxcIiArIChsZWFjaCA/IFxcXCLlvIDlkK9cXFwiIDogXFxcIuWFs+mXrVxcXCIpXSxcXG4gICAgICAgIGNvbHVtbnM6IDIsXFxuICAgICAgICB0aXRsZTogXFxcIuivt+mAieaLqSDml7bpl7QgXFxcIiArIGRhdGV0aW1lLFxcbiAgICAgICAgY2xpY2socywgaSkge1xcbiAgICAgICAgICBpZiAocyA9PSBcXFwi5pS55Y+Y5qC35byPXFxcIikge1xcbiAgICAgICAgICAgIHNwZW4gPSBzcGVuID09IDMgPyAxIDogKHNwZW4gPT0gMiA/IDMgOiAyKTtcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlQ29sdW1ucyhzcGVuKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChzLmluY2x1ZGVzKFxcXCLlgJLluo9cXFwiKSkge1xcbiAgICAgICAgICAgIG1hbmFnZS5saXN0LnJldmVyc2UoKTtcXG4gICAgICAgICAgICBuYW1lcy5yZXZlcnNlKCk7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKHMuaW5jbHVkZXMoXFxcIuiHqueEtuaOkuW6j1xcXCIpKSB7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBPYmplY3QuYXNzaWduKFtdLCBtYW5hZ2UubGlzdCk7XFxuICAgICAgICAgICAgbGV0IG5hdHVyYWwgPSBnZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChuYXR1cmFsID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgbmF0dXJhbFNvcnQobGlzdCkuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgc2V0SXRlbShcXFwidXNpbmdzdFxcXCIsIFxcXCJcXFwiKVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgc25hbWUuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgbmF0dXJhbCA/IFxcXCJcXFwiIDogXFxcIjFcXFwiKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChzLmluY2x1ZGVzKFxcXCLkvb/nlKjmjpLluo9cXFwiKSkge1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gT2JqZWN0LmFzc2lnbihbXSwgbWFuYWdlLmxpc3QpO1xcbiAgICAgICAgICAgIGxldCB1c2luZ3N0ID0gZ2V0SXRlbShcXFwidXNpbmdzdFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBpZiAodXNpbmdzdCA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgIHVzaW5nU29ydC5nZXQobGlzdCkuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgc2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIFxcXCJcXFwiKVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgc25hbWUuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJ1c2luZ3N0XFxcIiwgdXNpbmdzdCA/IFxcXCJcXFwiIDogXFxcIjFcXFwiKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChzID09IFxcXCLliLfmlrDphY3nva5cXFwiKSB7XFxuICAgICAgICAgICAgaGlrZXJQb3AucnVuT25OZXdUaHJlYWQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgZnVuY3Rpb24gYXJyYXlEaWZmZXJlbmNlKGFycjEsIGFycjIpIHtcXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChhcnIyLm1hcChpdGVtID0+IFtpdGVtLmtleSwgaXRlbV0pKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycjEuZmlsdGVyKGl0ZW0gPT4gIW1hcC5oYXMoaXRlbS5rZXkpKTtcXG4gICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIiwgXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgICAgIGxldCBsaXN0ID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKTtcXG4gICAgICAgICAgICAgIGlmICghcnVudGltZUNvbmZpZy5pbml0RGVmYXVsdCgpKSB7XFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLliLfmlrDlpLHotKVcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgIGxldCBuc291cmNlcyA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxuXFxuICAgICAgICAgICAgICBsZXQgYWxpc3QgPSBhcnJheURpZmZlcmVuY2UobnNvdXJjZXMsIGxpc3QpO1xcbiAgICAgICAgICAgICAgbGV0IGRsaXN0ID0gYXJyYXlEaWZmZXJlbmNlKGxpc3QsIG5zb3VyY2VzKTtcXG5cXG4gICAgICAgICAgICAgIGlmIChhbGlzdC5sZW5ndGggPiAwIHx8IGRsaXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICBpZiAoYWxpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICAgIGFsaXN0LmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgubmFtZSk7XFxuICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICBsb2coXFxcIuaWsOWinjpcXFwiICsgYWxpc3QubWFwKGsgPT4gay5uYW1lKS5qb2luKFxcXCIsXFxcIikpXFxuICAgICAgICAgICAgICAgICAgbXNnICs9IFxcXCLmlrDlop5cXFwiICsgYWxpc3QubGVuZ3RoICsgXFxcIuS4qua6kFxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKGRsaXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgICBkbGlzdC5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3Quc3BsaWNlKG1hbmFnZS5saXN0LmluZGV4T2YoeC5uYW1lKSwgMSk7XFxuICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICBsb2coXFxcIuenu+mZpDpcXFwiICsgZGxpc3QubWFwKGsgPT4gay5uYW1lKS5qb2luKFxcXCIsXFxcIikpXFxuICAgICAgICAgICAgICAgICAgbXNnICs9IFxcXCIg56e76ZmkXFxcIiArIGRsaXN0Lmxlbmd0aCArIFxcXCLkuKrmupBcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGhpa2VyUG9wLnJ1bk9uVUlUaHJlYWQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICAgICAgICBtYW5hZ2Uuc2V0VGl0bGUoXFxcIumAieaLqeinhumikea6kCDlvZPliY3lhbE6XFxcIiArIG1hbmFnZS5saXN0Lmxlbmd0aCArIFxcXCLkuKrop4bpopHmupBcXFwiKTtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHRvYXN0KG1zZyArIFxcXCIg5pu05aSa6K+m5oOF55yLbG9nXFxcIik7XFxuICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5bey5Yi35pawXFxcIik7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgIH0gZWxzZSBpZiAocy5pbmNsdWRlcyhcXFwi6Z2S5bCR5bm05qih5byPXFxcIikpIHtcXG4gICAgICAgICAgICBmdW5jdGlvbiBzZWxlY3QoKSB7XFxuICAgICAgICAgICAgICBzaG93U2VsZWN0T3B0aW9ucyh7XFxuICAgICAgICAgICAgICAgIFxcXCJ0aXRsZVxcXCI6IFxcXCLpgInmi6lcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwib3B0aW9uc1xcXCI6IFtcXFwi5Li05pe25YWz6ZetXFxcIiwgXFxcIuWFs+mXrVxcXCIsIFxcXCLorr7nva7lr4bnoIFcXFwiXSxcXG4gICAgICAgICAgICAgICAgY29sOiAxLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuXFxuICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09IFxcXCLkuLTml7blhbPpl61cXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwidGVtcExlYWNoXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gXFxcIuWFs+mXrVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNsZWFySXRlbShcXFwibGVhY2hcXFwiKTtcXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIsIFxcXCLorr7nva7lr4bnoIFcXFxcbuaMh+e6ueS4jeiDveeUqOaXtuacieaViFxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwibGVhY2hQYXNzXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySXRlbShcXFwibGVhY2hQYXNzXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S9v+eUqOm7mOiupOWvhueggVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgbGVhY2hQYXNzID0gZ2V0SXRlbShcXFwibGVhY2hQYXNzXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChzLmluY2x1ZGVzKFxcXCLlhbPpl61cXFwiKSkge1xcblxcbiAgICAgICAgICAgICAgaWYgKGhpa2VyUG9wLmNhbkJpb21ldHJpYygpICE9PSAwICYmICFsZWFjaFBhc3MpIHtcXG4gICAgICAgICAgICAgICAgaGlrZXJQb3AuaW5wdXRDb25maXJtKHtcXG4gICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuiuvue9ruWvhueggVxcXCIsXFxuICAgICAgICAgICAgICAgICAgaGludDogXFxcIuWvhueggVxcXCIsXFxuICAgICAgICAgICAgICAgICAgY29uZmlybSh0ZXh0KSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRleHQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WvhueggeS4jeiDveS4uuepulxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJsZWFjaFBhc3NcXFwiLCB0ZXh0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwibGVhY2hcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJ0ZW1wTGVhY2hcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcIuaJk+W8gOi/h+a7pFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFwibGVhY2hcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJ0ZW1wTGVhY2hcXFwiKTtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIuaJk+W8gOi/h+a7pFxcXCIpO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICBpZiAoaGlrZXJQb3AuY2FuQmlvbWV0cmljKCkgIT09IDApIHtcXG4gICAgICAgICAgICAgICAgaGlrZXJQb3AuaW5wdXRDb25maXJtKHtcXG4gICAgICAgICAgICAgICAgICBjb250ZW50OiBcXFwi6L6T5YWl5a+G56CB6L+b6KGM5YWz6ZetXFxcIixcXG4gICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIui+k+WFpeWvhueggVxcXCIsXFxuICAgICAgICAgICAgICAgICAgaGludDogXFxcIuWvhueggVxcXCIsXFxuICAgICAgICAgICAgICAgICAgY29uZmlybSh0ZXh0KSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGVhY2hQYXNzIHx8ICghbGVhY2hQYXNzICYmIHRleHQgPT09IFN0cmluZyhwcykpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCgpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WvhueggemUmeivr1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBoaWtlclBvcC5jaGVja0J5QmlvbWV0cmljKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICBoaWtlclBvcC5ydW5Pbk5ld1RocmVhZCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3QoKTtcXG4gICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHBvcC5kaXNtaXNzKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBzaG93U2VsZWN0T3B0aW9ucyh7XFxuICAgICAgICAgICAgICB0aXRsZTogXFxcIue8lueggeexu+Wei1xcXCIsXFxuICAgICAgICAgICAgICBvcHRpb25zOiBbXFxcIuS4jee8lueggVxcXCIsIFxcXCJHemlwXFxcIiwgXFxcIkJhc2U2NFxcXCIsIFxcXCJBRVNcXFwiXSxcXG4gICAgICAgICAgICAgIGNvbDogMSxcXG4gICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgaWYgKE1ZX0lOREVYID09PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBpbnB1dDtcXG4gICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgICAgfSk7XFxuICAgIH1cXG4gIH0pO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcImRycHnnrqHnkIZcIixcInBhdGhcIjpcIkRycHlNYW5hZ2VcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEpTRW5naW5lID0gY29tLmV4YW1wbGUuaGlrZXJ2aWV3LnNlcnZpY2UucGFyc2VyLkpTRW5naW5lO1xcbmNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG5jb25zdCBkcnB5TWFwID0gbmV3IE1hcCgpO1xcbmNvbnN0IEdNa2V5ID0gbW9kdWxlLmltcG9ydFBhcmFtO1xcbi8vbG9nKFxcXCLliJ3lp4vljJZEcnB5TWFuYWdlXFxcIik7XFxuY29uc3QgcHJveHlTZW1hcGhvcmUgPSBuZXcgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlKDMpO1xcbmNvbnN0IFQ0QWRhcHRlciA9ICQucmVxdWlyZShcXFwiVDRBZGFwdGVyXFxcIik7XFxuY29uc3QgVDFBZGFwdGVyID0gJC5yZXF1aXJlKFxcXCJUMUFkYXB0ZXJcXFwiKTtcXG5cXG5mdW5jdGlvbiBidWlsZEpzRW52KHRpY2tldCkge1xcbiAgICBsZXQgY29kZSA9IFN0cmluZy5yYXdgXFxuICAgIC8vIGNvbnN0IG15X3J1bGUgPSAnXFxuICAgIGNvbnN0IE1ZX1JVTEUgPSAke215X3J1bGV9O1xcbiAgICBjb25zdCBteV9ydWxlID0gSlNPTi5zdHJpbmdpZnkoTVlfUlVMRSk7XFxuICAgIGNvbnN0IE1ZX1RJQ0tFVCA9IFxcXCIke3RpY2tldCB8fCBcXFwiXFxcIn1cXFwiO1xcbiAgICBldmFsKGdldEpzUGx1Z2luKCkpO1xcbiAgICBldmFsKGdldEpzTGF6eVBsdWdpbigpKTtcXG4gICAgYDtcXG4gICAgcmV0dXJuIGNvZGU7XFxufVxcblxcbmZ1bmN0aW9uIHN5bmMoZnVuYywgc3ApIHtcXG4gICAgcmV0dXJuIG5ldyBvcmcubW96aWxsYS5qYXZhc2NyaXB0LlN5bmNocm9uaXplcihmdW5jLCBzcCB8fCB7fSk7XFxufVxcblxcbmZ1bmN0aW9uIGNyZWF0ZURycHkoa2V5KSB7XFxuICAgIEpTRW5naW5lLmdldEluc3RhbmNlKCkuZXZhbEpTKGJ1aWxkSnNFbnYoTVlfVElDS0VUKSArIFxcXCJcXFxcbiFcXFwiICsgJC50b1N0cmluZygoa2V5LCBHTWtleSwgTVlfVElDS0VUKSA9PiB7XFxuICAgICAgICBsZXQgZHJweSA9ICQucmVxdWlyZShcXFwiZHJweVxcXCIsIGtleSk7XFxuICAgICAgICBHTS5oYXMoR01rZXksIChEcnB5TWFuYWdlKSA9PiB7XFxuICAgICAgICAgICAgRHJweU1hbmFnZS5wdXQoa2V5LCBkcnB5KTtcXG4gICAgICAgIH0pO1xcbiAgICB9LCBrZXksIEdNa2V5LCBNWV9USUNLRVQpICsgXFxcIjtcXFxcblxcXCIsIFxcXCJcXFwiLCBmYWxzZSk7XFxufVxcblxcbmZ1bmN0aW9uIGNyZWF0ZVQzKHNvdXJjZSkge1xcbiAgICBsZXQga2V5ID0gc291cmNlLmtleTtcXG4gICAgY3JlYXRlRHJweShrZXkpO1xcbiAgICBsZXQgZHJweSA9IGRycHlNYXAuZ2V0KGtleSk7XFxuICAgIGRycHkuaW5pdChydW50aW1lQ29uZmlnLmdldEFic29sdXRlUGF0aChzb3VyY2UuZXh0KSk7XFxuICAgIHRyeSB7XFxuICAgICAgICBpZiAoZHJweS5nZXRSdWxlKFxcXCJwcm94eV9ydWxlXFxcIikpIHtcXG4gICAgICAgICAgICBsZXQgUHJveHkgPSAkLnJlcXVpcmUoXFxcIkxvY2FsUHJveHlcXFwiKTtcXG4gICAgICAgICAgICBsZXQgcHJveHlVcmwgPSBQcm94eS5zdGFydFByb3h5KE1ZX1JVTEUudGl0bGUsIEdNLmdldFNlbGZLZXkoKSk7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIlByb3h5X1VybFxcXCIsIHByb3h5VXJsKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkgeyB9XFxuICAgIHJldHVybiBkcnB5O1xcbn1cXG5cXG5mdW5jdGlvbiBjcmVhdGVOZXdEcnB5KHNvdXJjZSkge1xcbiAgICBpZiAoc291cmNlLnR5cGUgPT09IDQpIHtcXG4gICAgICAgIGxldCB0NCA9IG5ldyBUNEFkYXB0ZXIoc291cmNlKTtcXG4gICAgICAgIHQ0LmluaXQoKTtcXG4gICAgICAgIGRycHlNYXAuc2V0KHNvdXJjZS5rZXksIHQ0KTtcXG4gICAgICAgIHJldHVybiB0NDtcXG4gICAgfSBlbHNlIGlmIChzb3VyY2UudHlwZSA9PT0gMSkge1xcbiAgICAgICAgbGV0IHQxID0gbmV3IFQxQWRhcHRlcihzb3VyY2UpO1xcbiAgICAgICAgdDEuaW5pdCgpO1xcbiAgICAgICAgZHJweU1hcC5zZXQoc291cmNlLmtleSwgdDEpO1xcbiAgICAgICAgcmV0dXJuIHQxO1xcbiAgICB9IGVsc2UgaWYgKHNvdXJjZS50eXBlID09PSAwKSB7XFxuICAgICAgICBsZXQgVDBBZGFwdGVyID0gJC5yZXF1aXJlKFxcXCJUMEFkYXB0ZXJcXFwiKTtcXG4gICAgICAgIGxldCB0MCA9IG5ldyBUMEFkYXB0ZXIoc291cmNlKTtcXG4gICAgICAgIHQwLmluaXQoKTtcXG4gICAgICAgIGRycHlNYXAuc2V0KHNvdXJjZS5rZXksIHQwKTtcXG4gICAgICAgIHJldHVybiB0MDtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBjcmVhdGVUMyhzb3VyY2UpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdldChrZXkpIHtcXG4gICAgcmV0dXJuIHN5bmMoKCkgPT4ge1xcbiAgICAgICAgLy9sb2coZHJweU1hcC5zaXplKVxcbiAgICAgICAgaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChkcnB5TWFwLnNpemUgPj0gNSkge1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCLor7fmsYI6XFxcIiArIGtleSlcXG4gICAgICAgICAgICBkZWwoQXJyYXkuZnJvbShkcnB5TWFwLmtleXMoKSkuYXQoMCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlcygpLmZpbmQodiA9PiB2LmtleSA9PT0ga2V5KTtcXG4gICAgICAgIGxldCBkcnB5ID0gY3JlYXRlTmV3RHJweShzb3VyY2UpO1xcblxcbiAgICAgICAgcmV0dXJuIGRycHk7XFxuICAgIH0sIHRoaXMpLmNhbGwoKTtcXG59XFxuLy9zb3VyY2UuZXh05b+F6aG75Li657ud5a+56Lev5b6EXFxuZnVuY3Rpb24gZ2V0QnlTb3VyY2Uoc291cmNlKSB7XFxuICAgIHJldHVybiBzeW5jKCgpID0+IHtcXG4gICAgICAgIGxldCBrZXkgPSBzb3VyY2Uua2V5O1xcbiAgICAgICAgLy9sb2coZHJweU1hcC5zaXplKVxcbiAgICAgICAgaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChkcnB5TWFwLnNpemUgPj0gNSkge1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCLor7fmsYI6XFxcIiArIGtleSlcXG4gICAgICAgICAgICBkZWwoQXJyYXkuZnJvbShkcnB5TWFwLmtleXMoKSkuYXQoMCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGRycHkgPSBjcmVhdGVOZXdEcnB5KHNvdXJjZSk7XFxuICAgICAgICByZXR1cm4gZHJweTtcXG4gICAgfSwgdGhpcykuY2FsbCgpO1xcbn1cXG5cXG5mdW5jdGlvbiBwdXQoa2V5LCBkcnB5KSB7XFxuICAgIHN5bmMoKCkgPT4gZHJweU1hcC5zZXQoa2V5LCBkcnB5KSwgdGhpcykuY2FsbCgpO1xcbn1cXG5cXG5mdW5jdGlvbiBydW5Qcm94eShkcnB5LCBhcmdzKSB7XFxuICAgIGlmICh0eXBlb2YgZHJweS5wcm94eSA9PT0gXFxcImZ1bmN0aW9uXFxcIikge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAvL2xldCB0aW1lMSA9IERhdGUubm93KCk7XFxuICAgICAgICAgICAgcHJveHlTZW1hcGhvcmUuYWNxdWlyZSgpO1xcbiAgICAgICAgICAgIC8vbGV0IHRpbWUyID0gRGF0ZS5ub3coKTtcXG4gICAgICAgICAgICAvL2xvZyhcXFwiMeetieW+heaXtumXtDpcXFwiICsgKHRpbWUyIC0gdGltZTEpICsgXFxcIm1zXFxcIik7XFxuICAgICAgICAgICAgbGV0IHJlcyA9IGRycHkucHJveHkuYXBwbHkoZHJweSwgYXJncyk7XFxuICAgICAgICAgICAgLy9sZXQgdGltZTMgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCIy5omn6KGM5Luj55CG6ICX5pe2OlxcXCIgKyAodGltZTMgLSB0aW1lMikgKyBcXFwibXNcXFwiKTtcXG4gICAgICAgICAgICAvL2xvZyhcXFwiM+aAu+iAl+aXtuiAl+aXtjpcXFwiICsgKHRpbWUzIC0gdGltZTEpICsgXFxcIm1zXFxcIik7XFxuXFxuICAgICAgICAgICAgcmV0dXJuIHJlcztcXG4gICAgICAgIH0gZmluYWxseSB7XFxuICAgICAgICAgICAgcHJveHlTZW1hcGhvcmUucmVsZWFzZSgpO1xcbiAgICAgICAgfVxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGRlbChrZXkpIHtcXG4gICAgc3luYygoKSA9PiB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6ZmkXFxcIiArIGtleSk7XFxuICAgICAgICBkcnB5TWFwLmRlbGV0ZShrZXkpO1xcbiAgICAgICAgLyppZiAoZHJweU1hcC5oYXMoa2V5KSkge1xcbiAgICAgICAgICAgIFxcbiAgICAgICAgfSovXFxuICAgIH0sIHRoaXMpLmNhbGwoKTtcXG59XFxubGV0IGlzSW5pdEhvbWUgPSBmYWxzZTtcXG4vL2xldCBpc0luaXRTZWFyY2ggPSBmYWxzZTtcXG5sZXQgaXNJbml0RXJQYWdlID0gZmFsc2U7XFxuXFxuZnVuY3Rpb24gaW5pdFBhZ2UodHlwZSkge1xcbiAgICBzd2l0Y2ggKHR5cGUpIHtcXG4gICAgICAgIGNhc2UgXFxcImhvbWVcXFwiOlxcbiAgICAgICAgICAgIGlzSW5pdEhvbWUgPSB0cnVlO1xcbiAgICAgICAgLy9jYXNlIFxcXCJzZWFyY2hcXFwiOlxcbiAgICAgICAgLy8gICAgaXNJbml0U2VhcmNoID0gdHJ1ZTtcXG4gICAgICAgIGNhc2UgXFxcImVyXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRlclBhZ2UgPSB0cnVlO1xcbiAgICB9XFxuICAgIGFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoR01rZXksIHR5cGUpID0+IHtcXG4gICAgICAgIC8vbG9nKFxcXCJvbkNsb3NlXFxcIik7XFxuICAgICAgICBHTS5oYXMoR01rZXksIERycHlNYW5hZ2UgPT4ge1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCLmnIlHTWtleVxcXCIpO1xcbiAgICAgICAgICAgIERycHlNYW5hZ2UuY2xlYXJCeVR5cGUodHlwZSk7XFxuICAgICAgICB9KTtcXG4gICAgfSwgR01rZXksIHR5cGUpKTtcXG59XFxuXFxuZnVuY3Rpb24gY2xlYXJCeVR5cGUodHlwZSkge1xcbiAgICBzd2l0Y2ggKHR5cGUpIHtcXG4gICAgICAgIGNhc2UgXFxcImhvbWVcXFwiOlxcbiAgICAgICAgICAgIGlzSW5pdEhvbWUgPSBmYWxzZTtcXG4gICAgICAgIC8vY2FzZSBcXFwic2VhcmNoXFxcIjpcXG4gICAgICAgIC8vICAgIGlzSW5pdFNlYXJjaCA9IGZhbHNlO1xcbiAgICAgICAgY2FzZSBcXFwiZXJcXFwiOlxcbiAgICAgICAgICAgIGlzSW5pdGVyUGFnZSA9IGZhbHNlO1xcbiAgICB9XFxuXFxuICAgIGlmICghaXNJbml0SG9tZSAmJiAhaXNJbml0RXJQYWdlKSB7XFxuICAgICAgICAvL2xvZyhcXFwi5byA5aeL5riF55CGXFxcIik7XFxuICAgICAgICBkcnB5TWFwLmNsZWFyKCk7XFxuICAgICAgICBHTS5jbGVhcihHTWtleSk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gY2xlYXIoKSB7XFxuICAgIHN5bmMoKCkgPT4ge1xcbiAgICAgICAgZHJweU1hcC5jbGVhcigpO1xcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxufVxcbiQuZXhwb3J0cyA9IHtcXG4gICAgaW5pdFBhZ2UsXFxuICAgIGdldCxcXG4gICAgZ2V0QnlTb3VyY2UsXFxuICAgIGRlbCxcXG4gICAgY2xlYXIsXFxuICAgIHB1dCxcXG4gICAgcnVuUHJveHksXFxuICAgIGNsZWFyQnlUeXBlXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5oyH5a6a5pCc57Si5by556qXXCIsXCJwYXRoXCI6XCJTZWFyY2hBbGxvd1BvcFwiLFwicnVsZVwiOlwianM6XFxuJC5leHBvcnRzLnNob3cgPSBmdW5jdGlvbiAoKSB7XFxuICBjb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIiwgXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTY2XFxcIik7XFxuICBsZXQgc2VhcmNoQWxsb3cgPSBydW50aW1lQ29uZmlnLmdldFNlYXJjaEFsbG93KCk7XFxuXFxuICBsZXQgY2FuU2VhcmNoU291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDYW5TZWFyY2hTb3VyY2UoKTtcXG4gIC8vbGV0IHNvdXJjZU5hbWVMaXN0ID0gY2FuU2VhcmNoU291cmNlLm1hcCh2PT52Lm5hbWUpO1xcbiAgbGV0IGdldE5hbWVzID0gKCkgPT4gZHluYW1pY1NvdXJjZS5tYXAodiA9PiBzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArICh2Lm5hbWUgKyBcXFwiXFxcIikuZm9udGNvbG9yKFxcXCIjMDA5OTY2XFxcIikgOiB2Lm5hbWUpO1xcbiAgbGV0IHNwZW4gPSAzO1xcblxcbiAgLy9sZXQgZHluYW1pY05hbWVzID0gc291cmNlTmFtZUxpc3Quc2xpY2UoKTtcXG4gIGxldCBkeW5hbWljU291cmNlID0gY2FuU2VhcmNoU291cmNlLnNsaWNlKCk7XFxuICBsZXQgc2VhcmNob25jb3VudCA9IGR5bmFtaWNTb3VyY2UuZmlsdGVyKHYgPT4gc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpKS5sZW5ndGg7XFxuICBpZiAoc2VhcmNob25jb3VudCA9PSAwKSB7XFxuICAgIHNlYXJjaG9uY291bnQgPSBjYW5TZWFyY2hTb3VyY2UubGVuZ3RoO1xcbiAgfVxcblxcbiAgZnVuY3Rpb24gcG9wVGl0bGUoaW5wdXQpIHtcXG4gICAgbGV0IGxpc3QgPSBpbnB1dD9pbnB1dDpzZWFyY2hvbmNvdW50O1xcbiAgICByZXR1cm4gXFxcIuWQr+eUqOaQnOe0oua6kDpcXFwiICsgbGlzdCArIFxcXCLkuKog5YWxOlxcXCIgKyBjYW5TZWFyY2hTb3VyY2UubGVuZ3RoICsgXFxcIuS4quaQnOe0oua6kFxcXCJcXG4gIH1cXG5cXG4gIGxldCBzZWFyY2hLZXkgPSBcXFwiXFxcIjtcXG4gIGxldCBpbnB1dEJveDtcXG4gIGhpa2VyUG9wLnNlbGVjdEJvdHRvbVJlcyh7XFxuICAgIG9wdGlvbnM6IGdldE5hbWVzKCksXFxuICAgIGNvbHVtbnM6IHNwZW4sXFxuICAgIHRpdGxlOiBwb3BUaXRsZSgpLFxcbiAgICBub0F1dG9EaXNtaXNzOiB0cnVlLFxcbiAgICBwb3NpdGlvbjogMSxcXG4gICAgaGVpZ2h0OiAuOSxcXG4gICAgZXh0cmFJbnB1dEJveDogKGlucHV0Qm94ID0gbmV3IGhpa2VyUG9wLlJlc0V4dHJhSW5wdXRCb3goe1xcbiAgICAgIGhpbnQ6IFxcXCLmupDlhbPplK7lrZcg5aSa5Liq55SofOmalOW8gFxcXCIsXFxuICAgICAgdGl0bGU6IFxcXCJUQUdcXFwiLFxcbiAgICAgIG9uQ2hhbmdlKHRleHQsIG1hbmFnZSkge1xcbiAgICAgICAgLy9sb2coXFxcIm9uQ2hhbmdlOlxcXCIrdGV4dClcXG4gICAgICAgIHNlYXJjaEtleSA9IHRleHQ7XFxuICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgZHluYW1pY1NvdXJjZS5sZW5ndGggPSAwO1xcbiAgICAgICAgaWYgKHRleHQpIHtcXG4gICAgICAgICAgY2FuU2VhcmNoU291cmNlLmZvckVhY2goKHYsIGkpID0+IHtcXG4gICAgICAgICAgICBpZiAodGV4dC5zcGxpdCgvXFxcXHwvKS5maWx0ZXIoZiA9PiBmKS5zb21lKHggPT4gdi5uYW1lLmluY2x1ZGVzKHgpKSkge1xcbiAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5wdXNoKHYpO1xcbiAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaChzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArICh2Lm5hbWUgKyBcXFwiXFxcIikuZm9udGNvbG9yKFxcXCIjMDA5OTY2XFxcIikgOiB2Lm5hbWUpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIGR5bmFtaWNTb3VyY2UgPSBjYW5TZWFyY2hTb3VyY2Uuc2xpY2UoKTtcXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxuXFxuICAgICAgICB9XFxuICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgfSxcXG4gICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgIGNsaWNrKHMsIG1hbmFnZSkge1xcbiAgICAgICAgbGV0IHRhZ0NsYXNzZXMgPSBydW50aW1lQ29uZmlnLmdldFRhZ0NsYXNzZXMoKTtcXG4gICAgICAgIGlmICghdGFnQ2xhc3Nlcy5sZW5ndGgpIHJldHVybiBcXFwidG9hc3Q6Ly/lvZPliY3phY3nva7msqHmnIlUQUflk6bjgIJcXFwiO1xcbiAgICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXG4gICAgICAgICAgb3B0aW9uczogdGFnQ2xhc3NlcyxcXG4gICAgICAgICAgY29sdW1uczogMyxcXG4gICAgICAgICAgdGl0bGU6IFxcXCJUQUdbXFxcIiArIHRhZ0NsYXNzZXMubGVuZ3RoICsgXFxcIl1cXFwiLFxcbiAgICAgICAgICBjbGljayhhKSB7XFxuICAgICAgICAgICAgaW5wdXRCb3guc2V0RGVmYXVsdFZhbHVlKFxcXCJbXFxcIiArIGEgKyBcXFwiXVxcXCIpO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICB9LFxcbiAgICAgIHRpdGxlVmlzaWJsZTogdHJ1ZVxcbiAgICB9KSksXFxuICAgIGNsaWNrKHMsIGksIG1hbmFnZSkge1xcbiAgICAgIGxldCBrZXkgPSBkeW5hbWljU291cmNlW2ldLmtleTtcXG4gICAgICBsZXQgaW5kZXggPSAtMTtcXG4gICAgICBpZiAoKGluZGV4ID0gc2VhcmNoQWxsb3cuaW5kZXhPZihrZXkpKSAhPT0gLTEpIHtcXG4gICAgICAgIG1hbmFnZS5saXN0W2ldID0gZHluYW1pY1NvdXJjZVtpXS5uYW1lO1xcbiAgICAgICAgc2VhcmNoQWxsb3cuc3BsaWNlKGluZGV4LCAxKTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgbWFuYWdlLmxpc3RbaV0gPSBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIChkeW5hbWljU291cmNlW2ldLm5hbWUgKyBcXFwiXFxcIikuZm9udGNvbG9yKFxcXCIjMDA5OTY2XFxcIik7XFxuICAgICAgICBzZWFyY2hBbGxvdy5wdXNoKGtleSk7XFxuICAgICAgfVxcbiAgICAgIG1hbmFnZS5zZXRUaXRsZShwb3BUaXRsZShzZWFyY2hBbGxvdy5sZW5ndGgpKTtcXG4gICAgICBydW50aW1lQ29uZmlnLnNldFNlYXJjaEFsbG93KCk7XFxuICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICB9LFxcbiAgICBtZW51Q2xpY2sobWFuYWdlKSB7XFxuICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXG4gICAgICAgIG9wdGlvbnM6IFtcXFwi5pS55Y+Y5qC35byPXFxcIiwgXFxcIuetm+mAiea6kFxcXCIsIFxcXCLoh6rnhLbmjpLluo9cXFwiLCBcXFwi5YCS5bqPXFxcIiwgXFxcIuWFqOmAiVxcXCIsIFxcXCLlj43pgIlcXFwiXSxcXG4gICAgICAgIGNvbHVtbnM6IDIsXFxuICAgICAgICB0aXRsZTogXFxcIuivt+mAieaLqVxcXCIsXFxuICAgICAgICBjbGljayhzLCBpKSB7XFxuICAgICAgICAgIGlmIChpID09PSAwKSB7XFxuICAgICAgICAgICAgc3BlbiA9IHNwZW4gPT0gMyA/IDEgOiAoc3BlbiA9PSAyID8gMyA6IDIpO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2VDb2x1bW5zKHNwZW4pO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDEpIHtcXG4gICAgICAgICAgICBoaWtlclBvcC5pbnB1dENvbmZpcm0oe1xcbiAgICAgICAgICAgICAgY29udGVudDogXFxcIui+k+WFpeWFs+mUruWtlyDnqbrmmL7npLrlhajpg6hcXFwiLFxcbiAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnrZvpgInmupBcXFwiLFxcbiAgICAgICAgICAgICAgaGludDogXFxcIua6kOWFs+mUruWtlyDlpJrkuKrnlKh86ZqU5byAXFxcIixcXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogc2VhcmNoS2V5LFxcbiAgICAgICAgICAgICAgdGV4dGFyZWE6IGZhbHNlLCAvL+WkmuihjOaooeW8j1xcbiAgICAgICAgICAgICAgbWF4VGV4dGFyZWE6IHRydWUsXFxuICAgICAgICAgICAgICBub0F1dG9Tb2Z0OiBmYWxzZSxcXG4gICAgICAgICAgICAgIC8vaGlkZUNhbmNlbDogdHJ1ZSxcXG4gICAgICAgICAgICAgIGNvbmZpcm0odGV4dCkge1xcbiAgICAgICAgICAgICAgICBzZWFyY2hLZXkgPSB0ZXh0O1xcbiAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgICBkeW5hbWljU291cmNlLmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgIGlmICh0ZXh0KSB7XFxuICAgICAgICAgICAgICAgICAgY2FuU2VhcmNoU291cmNlLmZvckVhY2goKHYsIGkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0LnNwbGl0KC9cXFxcfC8pLmZpbHRlcihmID0+IGYpLnNvbWUoeCA9PiB2Lm5hbWUuaW5jbHVkZXMoeCkpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UucHVzaCh2KTtcXG4gICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaChzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArICh2Lm5hbWUgKyBcXFwiXFxcIikuZm9udGNvbG9yKFxcXCIjMDA5OTY2XFxcIikgOiB2Lm5hbWUpXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZSA9IGNhblNlYXJjaFNvdXJjZS5zbGljZSgpO1xcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcInRvYXN0Oi8v6L6T5YWl5LqGXFxcIiArIHRleHQ7XFxuICAgICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDIpIHtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IE9iamVjdC5hc3NpZ24oW10sIG1hbmFnZS5saXN0KTtcXG4gICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcblxcbiAgICAgICAgICAgIGR5bmFtaWNTb3VyY2Uuc29ydCgoYSwgYikgPT4ge1xcbiAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhhLm5hbWUpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIubmFtZSksIHVuZGVmaW5lZCwge1xcbiAgICAgICAgICAgICAgICBudW1lcmljOiB0cnVlLFxcbiAgICAgICAgICAgICAgICBzZW5zaXRpdml0eTogJ2Jhc2UnXFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAzKSB7XFxuICAgICAgICAgICAgbWFuYWdlLmxpc3QucmV2ZXJzZSgpO1xcbiAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UucmV2ZXJzZSgpO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDQpIHtcXG4gICAgICAgICAgICBkeW5hbWljU291cmNlLmZvckVhY2godiA9PiB7XFxuICAgICAgICAgICAgICBpZiAoIXNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSkge1xcbiAgICAgICAgICAgICAgICBzZWFyY2hBbGxvdy5wdXNoKHYua2V5KTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBtYW5hZ2Uuc2V0VGl0bGUocG9wVGl0bGUoc2VhcmNoQWxsb3cubGVuZ3RoKSk7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxuICAgICAgICAgICAgcnVudGltZUNvbmZpZy5zZXRTZWFyY2hBbGxvdygpO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDUpIHtcXG4gICAgICAgICAgICBsZXQgdGVtbGlzdCA9IHNlYXJjaEFsbG93LnNsaWNlKCk7XFxuICAgICAgICAgICAgc2VhcmNoQWxsb3cubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICBkeW5hbWljU291cmNlLmZvckVhY2godiA9PiB7XFxuICAgICAgICAgICAgICBpZiAodGVtbGlzdC5pbmNsdWRlcyh2LmtleSkpIHJldHVybjtcXG4gICAgICAgICAgICAgIHNlYXJjaEFsbG93LnB1c2godi5rZXkpO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIG1hbmFnZS5zZXRUaXRsZShwb3BUaXRsZShzZWFyY2hBbGxvdy5sZW5ndGgpKTtcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG4gICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldFNlYXJjaEFsbG93KCk7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgIH0pO1xcbiAgICB9XFxuICB9KTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLliIbnsbtcIixcInBhdGhcIjpcImNhdGVnb3J5c1wiLFwicnVsZVwiOlwianM6XFxubGV0IGZsID0ge307XFxubGV0IHJlc3VsdHMgPSBbXTtcXG5sZXQgaG9tZWxpc3QgPSBbXTtcXG5sZXQgY2F0ZSA9IFxcXCJcXFwiO1xcblxcbmZ1bmN0aW9uIGdldENhdGVnb3J5cyhsYXlvdXQsIGRycHksIHBhZ2UsaGFzSGFlZCkge1xcbiAgbGV0IHtcXG4gICAgdWlfY29uZmlnLFxcbiAgICBnZXRSYW5nZUNvbG9ycyxcXG4gIH0gPSAkLnJlcXVpcmUoXFxcIlVJTWFuYWdlXFxcIik7XFxuICB1aV9jb25maWcgPSB1aV9jb25maWcueWk7XFxuXFxuICBsZXQgcnVsZSA9IGRycHkuZ2V0UnVsZSgpO1xcbiAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gIGxldCBjb2RlID0gZHJweS5ydW5NYWluKFxcXCJsZXQgbWFpbj1cXFwiICsgJC50b1N0cmluZygoZXh0KSA9PiB7XFxuICAgIHJldHVybiAoKSA9PiBnZXRPcmlnaW5hbEpzKHJlcXVlc3QoZXh0LCB7XFxuICAgICAgJ21ldGhvZCc6ICdHRVQnXFxuICAgIH0pKTtcXG4gIH0sIHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZVBhdGgoKSkpO1xcbiAgXFxuICBpZiAoaGFzSGFlZCAmJiAv5qih5p2/OlxcXFxzKyfoh6rliqgnLy50ZXN0KGNvZGUpKSB7XFxuICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKHJlcXVlc3QocnVsZS5ob21lVXJsLCB7XFxuICAgICAgdGltZW91dDogcnVsZS50aW1lb3V0IHx8IDUwMDAsXFxuICAgICAgaGVhZGVyczogcnVsZS5oZWFkZXJzIHx8IHt9LFxcbiAgICAgIHdpdGhIZWFkZXJzOiB0cnVlLFxcbiAgICB9KSk7XFxuICAgIGlmICgocmVzdWx0LmJvZHkgPT0gdW5kZWZpbmVkIHx8IHJlc3VsdC5ib2R5ID09IFxcXCJcXFwiKSB8fCAocmVzdWx0LmVycm9yICE9IHVuZGVmaW5lZCkgfHwgL14oLTF8NDA0fDUwMnw1MDMpJC8udGVzdChyZXN1bHQuc3RhdHVzQ29kZSkpIHtcXG4gICAgICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgICAgIC8qbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgXFxcIue9keermeiuv+mXruW8guW4uFxcXCIgKyBcXFwi4oCd4oCdXFxcIixcXG4gICAgICAgIGRlc2M6IFxcXCIwXFxcIixcXG4gICAgICAgIHVybDogcnVsZS5ob21lVXJsLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICB0aXRsZTogXFxcIua4hemZpHVp6K6+572uXFxcIixcXG4gICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICBsZXQge1xcbiAgICAgICAgICAgICAgICB1aV9jbGVhcixcXG4gICAgICAgICAgICAgIH0gPSAkLnJlcXVpcmUoXFxcIlVJTWFuYWdlXFxcIik7XFxuICAgICAgICAgICAgICB1aV9jbGVhcihcXFwieWlcXFwiKTtcXG4gICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgfV1cXG4gICAgICAgIH1cXG4gICAgICB9KTsqL1xcbiAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi572R56uZ6K6/6Zeu5byC5bi4XFxcIik7XFxuICAgICAgLy9zZXRSZXN1bHQobGF5b3V0KTtcXG4gICAgfWVsc2V7XFxuICAgICAgbGV0IGhvbWU9SlNPTi5wYXJzZShkcnB5LmhvbWUoKSk7XFxuICAgICAgaWYoaG9tZS5jbGFzcy5sZW5ndGg9PTApe1xcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLorr/pl67mraPluLgs5YiG57G75pWw5o2u6I635Y+W5byC5bi4IOWPr+WwneivleWIt+aWsOa6kFxcXCIpO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcbiAgXFxuICBpZiAoT2JqZWN0LmtleXMocnVsZSkubGVuZ3RoID09PSAwKSB7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi6KeE5YiZ5Yqg6L295aSx6LSlXFxcIik7XFxuICB9XFxuICBcXG4gIGlmICgocnVsZS7kuIDnuqcgPT0gXFxcIlxcXCIgfHwgcnVsZS7kuIDnuqcgPT0gdW5kZWZpbmVkKSAmJiAhcnVsZS7mjqjojZApIHtcXG4gICAgY2xlYXJNeVZhcihcXFwibGlua3NcXFwiKTtcXG4gICAgbGF5b3V0Lmxlbmd0aCA9IDA7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+l5rqQ5Li65pCc57Si5rqQ77yM5LuF6IO96YCa6L+H5pCc57Si6K6/6Zeu5pWw5o2uXFxcIik7XFxuICB9XFxuXFxuICBsZXQgY2F0ZWdvcnlzID0gSlNPTi5wYXJzZShkcnB5LmhvbWUoKSk7O1xcbiAgbGV0IGZpbHRlcnMgPSBjYXRlZ29yeXMuZmlsdGVycztcXG4gIGxldCBjYXRlcyA9IGNhdGVnb3J5cy5jbGFzcyB8fCBbXTtcXG4gIGlmIChwYWdlID09IDEpIHtcXG4gICAgaG9tZWxpc3QgPSBKU09OLnBhcnNlKGRycHkuaG9tZVZvZCgpKS5saXN0O1xcbiAgICBpZiAoaG9tZWxpc3QgIT0gdW5kZWZpbmVkICYmIGhvbWVsaXN0Lmxlbmd0aCkge1xcbiAgICAgIHB1dE15VmFyKFxcXCJpc2hvbWVcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICB9XFxuICB9XFxuICBpZiAoY2F0ZXMubGVuZ3RoID09IDAgJiYgKGhvbWVsaXN0ID09IHVuZGVmaW5lZCB8fCBob21lbGlzdC5sZW5ndGggPT0gMCkpIHtcXG4gICAgY2xlYXJNeVZhcihcXFwibGlua3NcXFwiKTtcXG4gICAgbGF5b3V0Lmxlbmd0aCA9IDA7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi5YiG57G76I635Y+W5aSx6LSl5Y+v6IO9572R57uc6Zeu6aKYXFxcIik7XFxuICB9XFxuICBpZiAoZ2V0TXlWYXIoXFxcImlzaG9tZVxcXCIsIFxcXCIwXFxcIikgPT0gXFxcIjFcXFwiKSB7XFxuICAgIGNhdGVzLnVuc2hpZnQoe1xcbiAgICAgIHR5cGVfbmFtZTogJ+aOqOiNkCcsXFxuICAgICAgdHlwZV9pZDogJ2hvbWUnLFxcbiAgICB9KVxcbiAgfVxcbiAgcHV0TXlWYXIoXFxcImxpbmtzXFxcIiwgXFxcIjFcXFwiKTtcXG4gIGxldCBjYXRlaSA9IGdldE15VmFyKFxcXCJjYXRlaVxcXCIsIFxcXCIwXFxcIik7XFxuICBjYXRlID0gY2F0ZXNbY2F0ZWldLnR5cGVfaWQ7XFxuXFxuICB2YXIgZm9sZCA9IHN0b3JhZ2UwLmdldEl0ZW0oXFxcImZvbGRcXFwiLCBcXFwiMFxcXCIpO1xcbiAgbGV0IGNvbG9yID0gdWlfY29uZmlnLuWIhuexu+minOiJsjtcXG4gIGlmIChjb2xvciA9PSBcXFwicmFuZG9tXFxcIikge1xcbiAgICBjb2xvciA9IGdldFJhbmdlQ29sb3JzKCk7XFxuICB9XFxuXFxuICBpZiAocGFnZSA9PSAxKSB7XFxuICAgIGNhdGVzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgICBsZXQgdCA9IGNhdGVpID09IGkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCI8Yj5cXFwiICsgaXRlbS50eXBlX25hbWUuZm9udGNvbG9yKGNvbG9yKSArIFxcXCI8L2I+XFxcIiA6IGl0ZW0udHlwZV9uYW1lO1xcbiAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0LFxcbiAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpLCB0aWQpID0+IHtcXG4gICAgICAgICAgcHV0TXlWYXIoXFxcImNhdGVpXFxcIiwgaSk7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBpLCBpdGVtLnR5cGVfaWQpLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIHRpZDogaXRlbS50eXBlX2lkLFxcbiAgICAgICAgICBhY3RpdmU6IGNhdGVpID09IGkgPyB0cnVlIDogZmFsc2UsXFxuICAgICAgICB9XFxuICAgICAgfSlcXG4gICAgfSlcXG4gIH1cXG5cXG4gIGlmIChjYXRlICE9ICdob21lJyAmJiBwYWdlID09IDEpIHtcXG4gICAgbGV0IGhvbWVpID0gbGF5b3V0LmZpbmRJbmRleCh4ID0+IHtcXG4gICAgICByZXR1cm4geC5leHRyYSAmJiB4LmV4dHJhLnRpZCA9PSBcXFwiaG9tZVxcXCJcXG4gICAgfSk7XFxuICAgIGlmIChob21laSA9PSAtMSkge1xcbiAgICAgIGhvbWVpID0gbGF5b3V0LmZpbmRJbmRleCh4ID0+IHtcXG4gICAgICAgIHJldHVybiB4LmV4dHJhICYmIHguZXh0cmEudGlkO1xcbiAgICAgIH0pIC0gMTtcXG4gICAgfVxcbiAgICBpZiAoZmlsdGVycyAmJiBmaWx0ZXJzLmhhc093blByb3BlcnR5KGNhdGUpKSB7XFxuICAgICAgaWYgKGhvbWVpICE9IC0xKSB7XFxuICAgICAgICBsYXlvdXQuc3BsaWNlKGhvbWVpICsgMSwgMCwge1xcbiAgICAgICAgICB0aXRsZTogZm9sZCA9PSBcXFwiMFxcXCIgPyBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKdcXFwiLmZvbnRjb2xvcihcXFwiIzFhYWQxOVxcXCIpICsgXFxcIjwvYj5cXFwiIDogXFxcIuKAnOKAnOKAneKAnTxiPlxcXCIgKyBcXFwi4oioXFxcIi5mb250Y29sb3IoXFxcIiNGRjAwMDBcXFwiKSArIFxcXCI8L2I+XFxcIixcXG4gICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChmb2xkKSA9PiB7XFxuICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwiZm9sZFxcXCIsIGZvbGQgPT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgIH0sIGZvbGQpLFxcbiAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXFxuICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgICAgfVxcblxcbiAgICAgIGxldCBhY3RpdmVpID0gbGF5b3V0LmZpbmRJbmRleCh4ID0+IHguZXh0cmEgJiYgeC5leHRyYS5hY3RpdmUpO1xcbiAgICAgIGlmIChhY3RpdmVpICE9IC0xKSB7XFxuICAgICAgICBsYXlvdXQuc3BsaWNlKGFjdGl2ZWksIDAsIHtcXG4gICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgJ/CfjIAnLFxcbiAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGMpID0+IHtcXG4gICAgICAgICAgICBsZXQgY2F0ZV9vYmogPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCB7fSk7XFxuICAgICAgICAgICAgZGVsZXRlIGNhdGVfb2JqW2NdO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJjYXRlX29ialxcXCIsIGNhdGVfb2JqKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/muIXpmaTlrozmiJBcXFwiO1xcbiAgICAgICAgICB9LCBjYXRlKVxcbiAgICAgICAgfSlcXG4gICAgICB9XFxuXFxuICAgICAgbGV0IGNsYXNzaWZ5ID0gZmlsdGVyc1tjYXRlXTtcXG4gICAgICB2YXIgaW5pdF9jYXRlID0gbmV3IEFycmF5KGNsYXNzaWZ5Lmxlbmd0aCkuZmlsbChcXFwiLTFcXFwiKTtcXG4gICAgICBsZXQgY2F0ZV9vYmogPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCB7fSk7XFxuICAgICAgY2F0ZV9vYmpbY2F0ZV0gPSBjYXRlX29ialtjYXRlXSA/IGNhdGVfb2JqW2NhdGVdIDogaW5pdF9jYXRlXFxuICAgICAgdmFyIGNhdGVfdGVtcCA9IGNhdGVfb2JqW2NhdGVdO1xcbiAgICAgIC8vdmFyIGZpbHRlcl9kZWY9c3RvcmFnZTAuZ2V0SXRlbShcXFwiZmlsdGVyX2RlZlxcXCIsIHt9KTtcXG4gICAgICBjbGFzc2lmeS5mb3JFYWNoKCh4LCBpbmRleCkgPT4ge1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJ1xcbiAgICAgICAgfSlcXG4gICAgICAgIHgudmFsdWUuZm9yRWFjaCgoaXQsIGkpID0+IHtcXG4gICAgICAgICAgbGV0IHQgPSBpdC5uO1xcbiAgICAgICAgICBpZiAoY2F0ZV90ZW1wW2luZGV4XSA9PSBpKSB7XFxuICAgICAgICAgICAgdCA9IFxcXCI8Yj48Zm9udCBjb2xvcj1cXFwiICsgY29sb3IgKyBcXFwiPlxcXCIgKyB0ICsgXFxcIjwvZm9udD48L2I+XFxcIjtcXG4gICAgICAgICAgICBmbFt4LmtleV0gPSBpdC52O1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChjYXRlX3RlbXBbaW5kZXhdID09IFxcXCItMVxcXCIpIHtcXG4gICAgICAgICAgICBmbFt4LmtleV0gPSBcXFwidW5kZWZpbmVkXFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAoZm9sZCA9PSAxKSB7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgdCxcXG4gICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobykgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgaSA9IG8uaTtcXG4gICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImlzX2RlZlxcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBjYXRlX29iaiA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJjYXRlX29ialxcXCIsIHt9KTtcXG5cXG4gICAgICAgICAgICAgICAgbGV0IGNhdGVfdGVtcCA9IG8uY2F0ZV90ZW1wO1xcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZV90ZW1wLmNvbnN0cnVjdG9yICE9IEFycmF5KSB7XFxuICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wID0gW107XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gby5pbmRleDtcXG4gICAgICAgICAgICAgICAgbGV0IGMgPSBjYXRlX3RlbXBbaW5kZXhdIHx8IFxcXCItMVxcXCI7XFxuICAgICAgICAgICAgICAgIC8vbG9nKGMpXFxuICAgICAgICAgICAgICAgIGlmIChjID09IGkpIHtcXG4gICAgICAgICAgICAgICAgICBvLmNhdGVfdGVtcFtpbmRleF0gPSBcXFwiLTFcXFwiO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgIG8uY2F0ZV90ZW1wW2luZGV4XSA9IGkgKyBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBjYXRlX29ialtvLmNhdGVdID0gY2F0ZV90ZW1wO1xcbiAgICAgICAgICAgICAgICAvL2xvZyhjYXRlX3RlbXApXFxuICAgICAgICAgICAgICAgIC8vc3RvcmFnZTAucHV0TXlWYXIoXFxcImNhdGVfdGVtcFxcXCIsIGNhdGVfdGVtcCk7XFxuICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJjYXRlX29ialxcXCIsIGNhdGVfb2JqKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxcbiAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgICAgaTogaSxcXG4gICAgICAgICAgICAgICAgY2F0ZTogY2F0ZVxcbiAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgICAgfSlcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZXRGbCgpIHtcXG4gIGZsID0gT2JqZWN0LmtleXMoZmwpLmZpbHRlcihrZXkgPT4gZmxba2V5XSAhPT0gXFxcInVuZGVmaW5lZFxcXCIpLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcXG4gICAgcmVzW2tleV0gPSBmbFtrZXldO1xcbiAgICByZXR1cm4gcmVzO1xcbiAgfSwge30pO1xcbiAgcmV0dXJuIGZsXFxufVxcblxcbmZ1bmN0aW9uIGdldENhdGVMaXN0KCkge1xcbiAgcmV0dXJuIHtcXG4gICAgY2F0ZSxcXG4gICAgaG9tZWxpc3RcXG4gIH1cXG59XFxuXFxuXFxuJC5leHBvcnRzID0ge1xcbiAgZ2V0Y2F0ZWxpc3Q6IGdldENhdGVMaXN0LFxcbiAgZ2V0Y2F0ZWdvcnlzOiBnZXRDYXRlZ29yeXMsXFxuICBnZXRmbDogZ2V0RmxcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmnKzlnLDop4TliJnnrqHnkIZcIixcInBhdGhcIjpcIkxvY2FsRGlyXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuaWh+S7tueuoeeQhlxcXCIpO1xcbmxldCBwYXRoID0gZ2V0UGF0aChTdHJpbmcoTVlfUEFSQU1TLmNwYXRoKSkucmVwbGFjZShcXFwiZmlsZTovL1xcXCIsIFxcXCJcXFwiKTtcXG5sZXQgZmlsZVNlbGVjdCA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbmZpbGVTZWxlY3QuZmlsZVNlbGVjdGlvbih7XFxuICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHJldHVybiBcXFwiZWRpdEZpbGU6Ly9maWxlOi8vXFxcIiArIFBBVEg7XFxuICAgIH0pLFxcbiAgICBtZW1vcnk6IFxcXCJmaWxlcGF0aFxcXCIsXFxuICAgIGZpbGVUeXBlOiBcXFwiLmpzfC50eHR8Lmpzb25cXFwiLFxcbiAgICBleGl0U2VhcmNoUmVmcmVzaDogdHJ1ZSxcXG4gICAgcGF0dGVybjogMCxcXG4gICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbn0sIE1ZX1BBUkFNUy5uZXdXaW5kb3cgPyBbXSA6IFt7XFxuICAgIHRpdGxlOiBcXFwi5paw56qX5Y+j5omT5byAXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL0xvY2FsRGlyI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBjcGF0aDogTVlfUEFSQU1TLmNwYXRoLFxcbiAgICAgICAgbmV3V2luZG93OiB0cnVlLFxcbiAgICAgICAgd2luZG93SWQ6IE1ZX1JVTEUudGl0bGUgKyBcXFwiQGVkaXRmaWxlXFxcIixcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIHBhZ2VUaXRsZTogXFxcIuaWh+S7tueuoeeQhlxcXCJcXG4gICAgfVxcbn1dKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIum7mOiupOS/neWtmOmAieaLqVwiLFwicGF0aFwiOlwic2hhcmVkZWZhdWx0cGF0aFwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLkv53lrZjot6/lvoRcXFwiKTtcXG5sZXQgbGF5b3V0ID0gW107XFxubGV0IGYgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIik7XFxufSk7XFxuXFxubGV0IHBhdGggPSBqb2luVXJsKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIiksIFxcXCIuLi9cXFwiLnJlcGVhdCg1KSkuc2xpY2UoNyk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIpLmV4dHJhO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgICBpbml0aWFsUGF0aDogcGF0aCxcXG4gICAgICAgIHBhdHRlcm46IDFcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuWCqOWtmOi3r+W+hFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiLCBnZXRQdWJsaWNJdGVtKFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXCIsIFxcXCJcXFwiKSksXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcbiAgICAgICAgbGV0IHBhdGggPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIiwgXFxcIlxcXCIpO1xcblxcbiAgICAgICAgaWYgKCFwYXRoKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeWPr+S4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBzZXRQdWJsaWNJdGVtKFxcXCJEcnB5SGlrZXJAaW5wdXRfcGF0aFxcXCIsIHBhdGgpO1xcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlsI/or7RcIixcInBhdGhcIjpcIm5vdmVsXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZHJweSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpLmdldEJ5U291cmNlKE1ZX1BBUkFNUy5zb3VyY2UpO1xcbmxldCBwbGF5ID0gSlNPTi5wYXJzZShkcnB5LnBsYXkoTVlfUEFSQU1TLmZyb20sIE1ZX1BBUkFNUy5pZCwgW10pKTtcXG5cXG5sZXQgZGF0YSA9IEpTT04ucGFyc2UocGxheS51cmwucmVwbGFjZShcXFwibm92ZWw6Ly9cXFwiLCBcXFwiXFxcIikpO1xcbmxldCBsYXlvdXQgPSBbXTtcXG5sZXQgY29udGVudCA9IFxcXCLjgIDjgIBcXFwiICsgZGF0YS5jb250ZW50LnNwbGl0KC8oXFxcXG58XFxcXHIpKy8pLmZpbHRlcihpdCA9PiBpdC50cmltKCkubGVuZ3RoID4gMSkubWFwKGl0ID0+IGl0LnRyaW0oKSkuam9pbihcXFwiPGJyPuOAgOOAgFxcXCIpO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICB0aXRsZTogKFxcXCI8c3Ryb25nPlxcXCIgKyAoZGF0YS50aXRsZSB8fCBnZXRQYWdlVGl0bGUoKSkgKyBcXFwiPC9zdHJvbmc+XFxcIikuYmlnKCksXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogY29udGVudCxcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGV4dFNpemU6IDE4LFxcbiAgICAgICAgY2xpY2s6IHRydWVcXG4gICAgfVxcbn0pO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Li76aG1XCIsXCJwYXRoXCI6XCJtaWFuXCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBsb2FkKGQsIGRycHksIHNvdXJjZSwgaGFzSGFlZCkge1xcbiAgbGV0IHtcXG4gICAgdWlfY29uZmlnLFxcbiAgfSA9ICQucmVxdWlyZShcXFwiVUlNYW5hZ2VcXFwiKTtcXG4gIHVpX2NvbmZpZyA9IHVpX2NvbmZpZy55aTtcXG5cXG4gIGxldCBwYWdlID0gTVlfUEFHRTtcXG4gIGxldCBjYXRlZ29yeXMgPSAkLnJlcXVpcmUoXFxcImNhdGVnb3J5c1xcXCIpO1xcbiAgY2F0ZWdvcnlzLmdldGNhdGVnb3J5cyhkLCBkcnB5LCBwYWdlLCBoYXNIYWVkKTtcXG4gIGxldCB7XFxuICAgIGNhdGUsXFxuICAgIGhvbWVsaXN0XFxuICB9ID0gY2F0ZWdvcnlzLmdldGNhdGVsaXN0KCk7XFxuICBpZiAoZ2V0TXlWYXIoXFxcImxpbmtzXFxcIiwgXFxcIlxcXCIpID09IFxcXCIxXFxcIiAmJiAhaGFzSGFlZCkge1xcbiAgICBzZXRQcmVSZXN1bHQoZCk7XFxuICAgIGQubGVuZ3RoID0gMDtcXG4gIH1cXG5cXG4gIGxldCBmbCA9IGNhdGVnb3J5cy5nZXRmbCgpO1xcbiAgbGV0IHNraXBFciA9IGRycHkuZ2V0UnVsZShcXFwi5LqM57qnXFxcIikgPT09IFxcXCIqXFxcIiAmJiBnZXRJdGVtKFxcXCJza2lwRXJcXFwiLCBcXFwiXFxcIik7XFxuICBsZXQgZGVDb2wgPSBkcnB5LmdldFJ1bGUoY2F0ZSA9PSBcXFwiaG9tZVxcXCIgPyBcXFwiaGlrZXJMaXN0Q29sXFxcIiA6IFxcXCJoaWtlckNsYXNzTGlzdENvbFxcXCIpO1xcbiAgbGV0IGhvbWVMaXN0Q29sID0gZ2V0SXRlbShcXFwiaG9tZUxpc3RDb2xcXFwiLCBcXFwiXFxcIikgfHwgZGVDb2wgfHwgXFxcIm1vdmllXzNfbWFycXVlZVxcXCI7XFxuICBsZXQgc3R5cGUgPSBkcnB5LmdldFJ1bGUoXFxcIuexu+Wei1xcXCIpO1xcbiAgbGV0IGljb24gPSB1aV9jb25maWcuaWNvbnMu5b2x6KeGO1xcbiAgc3dpdGNoIChzdHlwZSkge1xcbiAgICBjYXNlICfmvKvnlLsnOlxcbiAgICAgIGljb24gPSB1aV9jb25maWcuaWNvbnMu5ryr55S7O1xcbiAgICAgIGJyZWFrO1xcbiAgICBjYXNlICflsI/or7QnOlxcbiAgICAgIGljb24gPSB1aV9jb25maWcuaWNvbnMu5bCP6K+0O1xcbiAgICAgIGJyZWFrO1xcbiAgICBkZWZhdWx0OlxcbiAgfVxcbiAgdXBkYXRlSXRlbShNWV9SVUxFLnRpdGxlICsgXFxcInNvdXJjZW5hbWVcXFwiLCB7XFxuICAgIGltZzogaWNvbixcXG4gIH0pO1xcblxcbiAgbGV0IGxpc3QgPSBbXTtcXG4gIGlmIChjYXRlID09IFxcXCJob21lXFxcIikge1xcbiAgICBpZiAocGFnZSA9PSAxKSB7XFxuICAgICAgbGlzdCA9IGhvbWVsaXN0O1xcbiAgICB9XFxuICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpIHtcXG4gICAgICBsaXN0ID0gW107XFxuICAgICAgY2xlYXJNeVZhcihcXFwiaXNob21lXFxcIik7XFxuICAgIH1cXG4gICAgaWYgKGxpc3QubGVuZ3RoID4gMCAmJiAhbGlzdC5hdCgwKS52b2RfcGljICYmICFsaXN0LmF0KC0xKS52b2RfcGljICYmICFkZUNvbCkge1xcbiAgICAgIGhvbWVMaXN0Q29sID0gXFxcInRleHRfMVxcXCI7XFxuICAgIH1cXG4gIH0gZWxzZSB7XFxuICAgIGxpc3QgPSBKU09OLnBhcnNlKGRycHkuY2F0ZWdvcnkoU3RyaW5nKGNhdGUpLCBwYWdlLCB0cnVlLCBmbCkpLmxpc3Q7XFxuICB9XFxuICBsZXQgdXJsID0gXFxcImhpa2VyOi8vcGFnZS9kZXRhaWxlZFxcXCIgKyB1aV9jb25maWcubWFyaztcXG5cXG4gIGlmIChsaXN0Lmxlbmd0aCkge1xcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgbGV0IGlkID0gU3RyaW5nKGl0LnZvZF9pZCk7XFxuICAgICAgbGV0IGNpZDtcXG4gICAgICAvL2xvZyhpdClcXG4gICAgICBsZXQgbmFtZSA9IGl0LnZvZF9uYW1lO1xcbiAgICAgIGlmIChpZCA9PT0gXFxcIm5vX2RhdGFcXFwiKSB7XFxuICAgICAgICB1cmwgPSBcXFwidG9hc3Q6Ly/msqHmnInmlbDmja5cXFwiO1xcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkID09PSBcXFwic3RyaW5nXFxcIiAmJiBpZC5pbmNsdWRlcyhcXFwibXNlYXJjaDpcXFwiKSB8fCBpZCA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgIHVybCA9ICQoXFxcIlxcXCIpLmxhenlSdWxlKChuYW1lKSA9PiB7XFxuICAgICAgICAgIHB1dE15VmFyKFxcXCJ0ZW1zbW9kZVxcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9zZWFyY2g/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCImcz1cXFwiICsgbmFtZTtcXG4gICAgICAgIH0sIG5hbWUpO1xcbiAgICAgIH0gZWxzZSBpZiAoc2tpcEVyKSB7XFxuICAgICAgICB1cmwgPSAkKCkubGF6eVJ1bGUoKHNvdXJjZSwgaWQpID0+IHtcXG4gICAgICAgICAgbGV0IHVybDtcXG4gICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICAgIGxldCBkcnB5ID0gRHJweU1hbmFnZS5nZXRCeVNvdXJjZShzb3VyY2UpO1xcbiAgICAgICAgICAgIHVybCA9IEpTT04ucGFyc2UoZHJweS5kZXRhaWwoaWQpKS5saXN0WzBdLnZvZF9wbGF5X3VybC5zcGxpdChcXFwiJFxcXCIpWzFdO1xcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgdXJsID0gaWQuc3BsaXQoXFxcIkBAXFxcIilbMF07XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwidmlkZW9VcmxcXFwiKS5wYXJzZSh1cmwsIGlkLCBzb3VyY2UpO1xcbiAgICAgICAgfSwgc291cmNlLCBpZCk7XFxuICAgICAgICBjaWQgPSBpZDtcXG4gICAgICB9XFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBuYW1lLFxcbiAgICAgICAgZGVzYzogaXQudm9kX3JlbWFya3MsXFxuICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgIGltZzogaXQudm9kX3BpYyxcXG4gICAgICAgIGNvbF90eXBlOiBob21lTGlzdENvbCxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGltZzogaXQudm9kX3BpYyxcXG4gICAgICAgICAgdm9kSWQ6IGlkLFxcbiAgICAgICAgICBzbmFtZTogc291cmNlLm5hbWUsXFxuICAgICAgICAgIHNrZXk6IHNvdXJjZS5rZXksXFxuICAgICAgICAgIGlkOiBjaWQsXFxuICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuiBmuWQiOaQnOe0olxcXCIsXFxuICAgICAgICAgICAganM6IFxcXCJwdXRNeVZhcigndGVtc21vZGUnLCAnMScpOydoaWtlcjovL3NlYXJjaD9ydWxlPScgKyBNWV9SVUxFLnRpdGxlICsgJyZzPVxcXCIgKyBuYW1lICsgXFxcIic7XFxcIlxcbiAgICAgICAgICB9XVxcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICB9XFxuICB9XFxuICBkZWxldGVJdGVtKE1ZX1JVTEUudGl0bGUgKyBcXFwibG9hZFxcXCIpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXREcnB5UGF0aChkKSB7XFxuICBkLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIue8uuWwkei/kOihjOW6k1xcXFxu6K+l5bCP56iL5bqP5LiN6IO96YCa6L+H5LqR5Ymq6LS05p2/5YiG5Lqr77yM5Y+q6IO96YCa6L+H5omT5YyF5YiG5LqrXFxcIixcXG4gICAgZGVzYzogXFxcIuWwhui/kOihjOW6k+aUvuWFpVxcXCIgKyBnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL2RhdGEvXFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiL2xpYnNfaGlrZXIvZHJweTIuanNcXFwiKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRIaWVkKGQsIG5hbWUsIGNvbmZpZykge1xcbiAgbGV0IHtcXG4gICAgdWlfY29uZmlnLFxcbiAgICB1aV9leHBhbmQsXFxuICAgIHJlb3JkZXJBcnJheUJ5T3JkZXJcXG4gIH0gPSAkLnJlcXVpcmUoXFxcIlVJTWFuYWdlXFxcIik7XFxuICB1aV9jb25maWcgPSB1aV9jb25maWcueWk7XFxuICBsZXQgdWlfaW5kZXhzID0gdWlfY29uZmlnLnVpO1xcbiAgdWlfZXhwYW5kKCk7XFxuXFxuICBsZXQgc2VsZWN0cyA9IFt7XFxuICAgIHRpdGxlOiBcXFwi5pS26JePXFxcIixcXG4gICAgaWNvbjogdWlfY29uZmlnLmljb25zLuaUtuiXj1xcbiAgfSwge1xcbiAgICB0aXRsZTogXFxcIuS5puaeti3lsI/or7RcXFwiLFxcbiAgICBpY29uOiB1aV9jb25maWcuaWNvbnMu5Lmm5p625bCP6K+0XFxuICB9LCB7XFxuICAgIHRpdGxlOiBcXFwi5Lmm5p62Lea8q+eUu1xcXCIsXFxuICAgIGljb246IHVpX2NvbmZpZy5pY29ucy7kuabmnrbmvKvnlLtcXG4gIH1dXFxuXFxuICBsZXQgZmF2aWNvbnMgPSB7XFxuICAgIGdldChzdCkge1xcbiAgICAgIHN0ID0gc3QgfHwgc2VsZWN0cztcXG4gICAgICByZXR1cm4gJChzdCwgMiwgXFxcIuaIkeeahFxcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcIuWOhuWPslxcXCIpKSB7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9oaXN0b3J5P3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGU7XFxuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCLkuabmnrYt5bCP6K+0XFxcIikpIHtcXG4gICAgICAgICAgcmV0dXJuICdoaWtlcjovL3BhZ2UvQm9va3JhY2sudmlldyNub1JlY29yZEhpc3RvcnkjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGJnR5cGU9bm92ZWwmcnVsZU5hbWU9JyArIE1ZX1JVTEUudGl0bGU7XFxuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCLkuabmnrYt5ryr55S7XFxcIikpIHtcXG4gICAgICAgICAgcmV0dXJuICdoaWtlcjovL3BhZ2UvQm9va3JhY2sudmlldyNub1JlY29yZEhpc3RvcnkjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGJnR5cGU9Y29taWMmcnVsZU5hbWU9JyArIE1ZX1JVTEUudGl0bGU7XFxuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCLmlLbol49cXFwiKSkge1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vY29sbGVjdGlvbj9ydWxlPVxcXCIgKyBNWV9SVUxFLnRpdGxlO1xcbiAgICAgICAgfVxcbiAgICAgIH0pXFxuICAgIH1cXG4gIH07XFxuXFxuXFxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmF2aWNvbnMsICdzZWxlY3QnLCB7XFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xcbiAgICAgIHJldHVybiBzZWxlY3RzO1xcbiAgICB9LFxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xcbiAgICAgIHNlbGVjdHMucHVzaCh2YWx1ZSk7XFxuICAgIH1cXG4gIH0pO1xcbiAgR00ucHV0KFxcXCJmYXZpY29uc1xcXCIsIGZhdmljb25zKTtcXG5cXG4gIGxldCBzbW9kZSA9IE51bWJlcihnZXRJdGVtKFxcXCJzbW9kZVxcXCIsIFxcXCIwXFxcIikpO1xcbiAgbGV0IHNlYXJjaHNvcnQgPSBOdW1iZXIoZ2V0SXRlbShcXFwic2VhcmNoc29ydFxcXCIsIFxcXCIwXFxcIikpO1xcbiAgbGV0IGZpbGVTZWxlY3QgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG4gIGxldCB1aW9iaiA9IFtdO1xcblxcblxcbiAgdWlvYmoucHVzaCh7XFxuICAgIGluZGV4OiAwLFxcbiAgICBrZXk6IFxcXCLmjaLmupBcXFwiLFxcbiAgICB0aXRsZTogXFxcIuaNoua6kFxcXCIsXFxuICAgIGNvbF90eXBlOiB1aV9jb25maWcuY29sLFxcbiAgICBpbWc6IHVpX2NvbmZpZy5pY29ucy7mjaLmupAsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgJC5yZXF1aXJlKFxcXCJDaGFuZ2VTb3VyY2VQb3BcXFwiKS5zaG93KCk7XFxuICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgY3BhdGg6IGNvbmZpZy5wYXRoLFxcbiAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgIHRpdGxlOiBcXFwi5pu05o2i6YWN572uXFxcIixcXG4gICAgICAgIGpzOiBKU09OLnN0cmluZ2lmeShcXFwiaGlrZXI6Ly9wYWdlL2NyZWF0ZUNvbmZpZyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiKVxcbiAgICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6/6Zeu572R56uZXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcbiAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICByZXR1cm4gXFxcIndlYjovL1xcXCIgKyBEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KS5nZXRSdWxlKFxcXCJob3N0XFxcIik7XFxuICAgICAgICAgIC8vcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0pXFxuICAgICAgfSwge1xcbiAgICAgICAgdGl0bGU6IFxcXCLliLfmlrDmupBcXFwiLFxcbiAgICAgICAganM6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XFxuICAgICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICAgICAgICAgIERycHlNYW5hZ2UuZ2V0KHNvdXJjZS5rZXkpLmluaXQocnVudGltZUNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoc291cmNlLmV4dCkpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSlcXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIumHjei9vea6kFxcXCIsXFxuICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImxpbmtzXFxcIik7XFxuICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcXG4gICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgRHJweU1hbmFnZS5kZWwoc291cmNlLmtleSk7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICB9KVxcbiAgICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5p+l55yL5rqQ5Luj56CBXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcbiAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICBsZXQgY29kZSA9IERycHlNYW5hZ2UuZ2V0KHNvdXJjZS5rZXkpLnJ1bk1haW4oXFxcImxldCBtYWluPVxcXCIgKyAkLnRvU3RyaW5nKChleHQpID0+IHtcXG4gICAgICAgICAgICByZXR1cm4gKCkgPT4gZ2V0T3JpZ2luYWxKcyhyZXF1ZXN0KGV4dCwge1xcbiAgICAgICAgICAgICAgJ21ldGhvZCc6ICdHRVQnXFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICB9LCBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2VQYXRoKCkpKTtcXG5cXG4gICAgICAgICAgbGV0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvdmlld1NvdXJjZUNvZGUuanNcXFwiO1xcbiAgICAgICAgICB3cml0ZUZpbGUocGF0aCwgY29kZSk7XFxuICAgICAgICAgIHJldHVybiBcXFwiZWRpdEZpbGU6Ly9cXFwiICsgcGF0aDtcXG4gICAgICAgIH0pXFxuICAgICAgfV0uY29uY2F0KGNvbmZpZy50eXBlID09PSBcXFwibG9jYWxEaXJcXFwiID8gW3tcXG4gICAgICAgIHRpdGxlOiBcXFwi57yW6L6R5Y+C5pWw5pig5bCE6KGoXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKChwYXRoKSA9PiB7XFxuICAgICAgICAgIHBhdGggKz0gXFxcIi8ubWFwcGluZy50eHRcXFwiO1xcbiAgICAgICAgICBpZiAoZmlsZUV4aXN0KHBhdGgpKSB7XFxuICAgICAgICAgICAgdG9hc3QoXFxcIuS/neWtmOWQjuWIt+aWsOmFjee9ruaIlumHjeWQr+aJjeS8mueUn+aViFxcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiZWRpdEZpbGU6Ly9cXFwiICsgcGF0aDtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gJChcXFwi5LiN5a2Y5Zyo5pig5bCE5paH5Lu25piv5ZCm5Yib5bu677yfXFxcIikuY29uZmlybShwYXRoID0+IHtcXG4gICAgICAgICAgICAgIHdyaXRlRmlsZShwYXRoLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICB0b2FzdChcXFwi5L+d5a2Y5ZCO5Yi35paw6YWN572u5oiW6YeN5ZCv5omN5Lya55Sf5pWIXFxcIik7XFxuICAgICAgICAgICAgICByZXR1cm4gXFxcImVkaXRGaWxlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICAgICAgfSwgcGF0aCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0sIGNvbmZpZy5wYXRoKVxcbiAgICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5pys5Zyw566h55CGXFxcIixcXG4gICAgICAgIGpzOiBcXFwiJ2hpa2VyOi8vcGFnZS9Mb2NhbERpciNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMnXFxcIlxcbiAgICAgIH1dIDogW10pXFxuICAgIH1cXG4gIH0pO1xcblxcbiAgdWlvYmoucHVzaCh7XFxuICAgIGluZGV4OiAxLFxcbiAgICBrZXk6IFxcXCLmkJzntKLmqKHlvI9cXFwiLFxcbiAgICB0aXRsZTogW1xcXCLpgInkuK1cXFwiLCBcXFwi6IGa5ZCIXFxcIiwgY29uZmlnLnNUYWcgfHwgXFxcIuaXoFRBR1xcXCJdW3Ntb2RlXSxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICBsZXQgc21vZGUgPSBOdW1iZXIoZ2V0SXRlbShcXFwic21vZGVcXFwiLCBcXFwiMFxcXCIpKTtcXG4gICAgICByZXR1cm4gJChbXFxcIumAieS4rVxcXCIsIFxcXCLogZrlkIhcXFwiLCBcXFwi5oyJVEFHXFxcIl0sIDEsIFxcXCLmkJzntKLmqKHlvI9cXFwiLCBzbW9kZSkuc2VsZWN0KCh0KSA9PiB7XFxuICAgICAgICBpZiAoTVlfSU5ERVggPT09IDIpIHtcXG4gICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgbGV0IHRhZ0NsYXNzZXMgPSBydW50aW1lQ29uZmlnLmdldFRhZ0NsYXNzZXMoKTtcXG4gICAgICAgICAgbGV0IHN0YWcgPSBydW50aW1lQ29uZmlnLmdldFNlYXJjaFRhZygpO1xcbiAgICAgICAgICBsZXQgaW5kZXggPSAwO1xcbiAgICAgICAgICBpZiAoIXRhZ0NsYXNzZXMubGVuZ3RoKSByZXR1cm4gXFxcInRvYXN0Oi8v5b2T5YmN6YWN572u5rKh5pyJVEFH5ZOm44CCXFxcIjtcXG4gICAgICAgICAgaWYgKHN0YWcpIHtcXG4gICAgICAgICAgICBpbmRleCA9IHRhZ0NsYXNzZXMuaW5kZXhPZihzdGFnKSArIDE7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgdGFnQ2xhc3Nlcy51bnNoaWZ0KFxcXCJb5pegVEFHXVxcXCIpO1xcbiAgICAgICAgICByZXR1cm4gJCh0YWdDbGFzc2VzLCAzLCBcXFwi5pCc57SiVEFHW1xcXCIgKyB0YWdDbGFzc2VzLmxlbmd0aCArIFxcXCJdXFxcIiwgaW5kZXgpLnNlbGVjdCgodCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgICAgbGV0IHRhZyA9IE1ZX0lOREVYID09PSAwID8gXFxcIlxcXCIgOiBpbnB1dDtcXG4gICAgICAgICAgICBpZiAocnVudGltZUNvbmZpZy5zZXRTZWFyY2hUYWcodGFnKSkge1xcbiAgICAgICAgICAgICAgc2V0SXRlbShcXFwic21vZGVcXFwiLCBcXFwiMlxcXCIpO1xcbiAgICAgICAgICAgICAgdXBkYXRlSXRlbSh0ICsgXFxcIkBzZWFyY2hfbW9kZVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRhZyB8fCBcXFwi5pegVEFHXFxcIixcXG4gICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcIlxcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7lpLHotKVcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfSwgdCk7XFxuICAgICAgICB9XFxuICAgICAgICBzZXRJdGVtKFxcXCJzbW9kZVxcXCIsIFxcXCJcXFwiICsgTVlfSU5ERVgpO1xcbiAgICAgICAgdXBkYXRlSXRlbSh0ICsgXFxcIkBzZWFyY2hfbW9kZVxcXCIsIHtcXG4gICAgICAgICAgdGl0bGU6IFtcXFwi6YCJ5LitXFxcIiwgXFxcIuiBmuWQiFxcXCJdW01ZX0lOREVYXSxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICB9LCBNWV9SVUxFLnRpdGxlKVxcbiAgICB9KSxcXG4gICAgaW1nOiB1aV9jb25maWcuaWNvbnMu5pCc57SiLFxcbiAgICBjb2xfdHlwZTogdWlfY29uZmlnLmNvbCxcXG4gICAgZXh0cmE6IHtcXG4gICAgICBpZDogTVlfUlVMRS50aXRsZSArIFxcXCJAc2VhcmNoX21vZGVcXFwiLFxcbiAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgIHRpdGxlOiBcXFwi5oyH5a6a5pCc57Si5rqQXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgJC5yZXF1aXJlKFxcXCJTZWFyY2hBbGxvd1BvcFxcXCIpLnNob3coKTtcXG4gICAgICAgIH0pXFxuICAgICAgfSwge1xcbiAgICAgICAgdGl0bGU6IFxcXCLmkJzntKLmjpLluo86XFxcIiArIFtcXFwi5pegXFxcIiwgXFxcIuiHqueEtlxcXCIsIFxcXCLkvb/nlKhcXFwiXVtzZWFyY2hzb3J0XSxcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKChzZWFyY2hzb3J0KSA9PiB7XFxuICAgICAgICAgIHJldHVybiAkKFtcXFwi5LiN5L2/55SoXFxcIiwgXFxcIuiHqueEtuaOkuW6j1xcXCIsIFxcXCLkvb/nlKjmjpLluo9cXFwiXSwgMSwgXFxcIuaQnOe0ouaOkuW6j1xcXCIsIHNlYXJjaHNvcnQpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwic2VhcmNoc29ydFxcXCIsIFN0cmluZyhNWV9JTkRFWCkpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIH0pXFxuICAgICAgICB9LCBzZWFyY2hzb3J0KVxcbiAgICAgIH1dXFxuICAgIH1cXG4gIH0pO1xcblxcbiAgbGV0IHNldHRpbmdzID0gW1xcXCLop6PmnpDnrqHnkIZcXFwiLCBcXFwi5a6Y5pa55by55bmVXFxcIiwgXFxcIuaUr+aMgeS9nOiAhVxcXCIsIFxcXCJVSeeuoeeQhlxcXCIsIFxcXCLosIPor5Xml6Xlv5c6XFxcIiArICghZ2V0SXRlbShcXFwidXNlTG9nXFxcIiwgXFxcIlxcXCIpID8gXFxcIuWFs+mXrVxcXCIgOiBcXFwi5byA5ZCvXFxcIiksIFxcXCLot7Pov4flvaLlvI/kuoznuqc6XFxcIiArICghZ2V0SXRlbShcXFwic2tpcEVyXFxcIiwgXFxcIlxcXCIpID8gXFxcIuWFs+mXrVxcXCIgOiBcXFwi5byA5ZCvXFxcIiksIFxcXCLliIbkuqvlr7zlhaXot6/lvoRcXFwiLCBcXFwi5Yib5bu66K6i6ZiF5Zyw5Z2AXFxcIiwgXFxcIuWIh+aNouWIl+ihqOagt+W8j1xcXCIsIFxcXCJHaXRIdWJSQVflnLDlnYBcXFwiLFxcXCLkuLvpopg6XFxcIiArIGdldEl0ZW0oXFxcInRoZW1lXFxcIiwgXFxcIum7mOiupFxcXCIpLFxcXCLmm7TmjaLphY3nva5cXFwiXTtcXG4gIGxldCBkaXNWaXNpYmxlcyA9IHVpX2luZGV4cy5maWx0ZXIoeCA9PiB4LmluZGV4ID09IC0xKTtcXG4gIGlmIChkaXNWaXNpYmxlcy5zb21lKHggPT4geC5rZXkgPT0gXFxcIuaQnOe0ouaooeW8j1xcXCIpKSB7XFxuICAgIHNldHRpbmdzLnB1c2goXFxcIuaQnOe0ouaooeW8jzpcXFwiICsgW1xcXCLpgInkuK1cXFwiLCBcXFwi6IGa5ZCIXFxcIl1bc21vZGVdKTtcXG4gICAgc2V0dGluZ3MucHVzaChcXFwi5pCc57Si5oyH5a6a5rqQXFxcIik7XFxuICAgIHNldHRpbmdzLnB1c2goXFxcIuaQnOe0ouaOkuW6jzpcXFwiICsgW1xcXCLml6BcXFwiLCBcXFwi6Ieq54S2XFxcIiwgXFxcIuS9v+eUqFxcXCJdW3NlYXJjaHNvcnRdKTtcXG4gIH1cXG4gIGlmIChkaXNWaXNpYmxlcy5zb21lKHggPT4geC5rZXkgPT0gXFxcIuaUtuiXj1xcXCIpKSB7XFxuICAgIHNldHRpbmdzLnB1c2goXFxcIuaIkeeahFxcXCIpO1xcbiAgfVxcblxcbiAgdWlvYmoucHVzaCh7XFxuICAgIGtleTogXFxcIuiuvue9rlxcXCIsXFxuICAgIGluZGV4OiAyLFxcbiAgICB0aXRsZTogXFxcIuiuvue9rlxcXCIsXFxuICAgIHVybDogJChzZXR0aW5ncywgMiwgXFxcIuiuvue9rlxcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgaWYgKFxcXCLop6PmnpDnrqHnkIZcXFwiID09IGlucHV0KSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9ydWxlTWFuYWdlI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgfSBlbHNlIGlmIChcXFwi5a6Y5pa55by55bmVXFxcIiA9PT0gaW5wdXQpIHtcXG4gICAgICAgIGxldCB1c2VEYW5tdSA9ICEhZ2V0SXRlbShcXFwidXNlRGFubXVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICByZXR1cm4gJChcXFwi5b2T5Li65a6Y5rqQ5pe25Yy56YWN5by55bmVKOmcgOimgWRhbm1155uS5a2Q5pSv5oyBKVxcXFxu5b2T5YmNOlxcXCIgKyB1c2VEYW5tdSArIFxcXCJcXFxcbueCueWHu+ehruWumuWNs+WPr1xcXCIgKyAodXNlRGFubXUgPyBcXFwi5YWz6ZetXFxcIiA6IFxcXCLlvIDlkK9cXFwiKSkuY29uZmlybSgodXNlRGFubXUpID0+IHtcXG4gICAgICAgICAgc2V0SXRlbShcXFwidXNlRGFubXVcXFwiLCB1c2VEYW5tdSA/IFxcXCJcXFwiIDogXFxcIjFcXFwiKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyAodXNlRGFubXUgPyBcXFwi5bey5YWz6ZetXFxcIiA6IFxcXCLlt7LlvIDlkK9cXFwiKTtcXG4gICAgICAgIH0sIHVzZURhbm11KTtcXG4gICAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCLosIPor5Xml6Xlv5dcXFwiKSkge1xcbiAgICAgICAgbGV0IHVzZUxvZyA9ICEhZ2V0SXRlbShcXFwidXNlTG9nXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgcmV0dXJuICQoXFxcIuW8gOWQr+aXpeW/l+i+heWKqeiwg+ivle+8jOaZrumAmuS9v+eUqOS4jemcgOimgeW8gOWQr1xcXFxu5b2T5YmNOlxcXCIgKyB1c2VMb2cgKyBcXFwiXFxcXG7ngrnlh7vnoa7lrprljbPlj69cXFwiICsgKHVzZUxvZyA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuW8gOWQr1xcXCIpKS5jb25maXJtKCh1c2VMb2cpID0+IHtcXG4gICAgICAgICAgc2V0SXRlbShcXFwidXNlTG9nXFxcIiwgdXNlTG9nID8gXFxcIlxcXCIgOiBcXFwiMVxcXCIpO1xcbiAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XFxuICAgICAgICAgIGlmIChzb3VyY2UpIHtcXG4gICAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICAgIERycHlNYW5hZ2UuZGVsKHNvdXJjZS5rZXkpO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgKHVzZUxvZyA/IFxcXCLlt7LlhbPpl61cXFwiIDogXFxcIuW3suW8gOWQr1xcXCIpO1xcbiAgICAgICAgfSwgdXNlTG9nKTtcXG4gICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5Yib5bu66K6i6ZiF5Zyw5Z2AXFxcIikge1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvY3JlYXRlU3Vic2NyaXB0aW9uI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuWIh+aNouWIl+ihqOagt+W8j1xcXCIpIHtcXG4gICAgICAgIGxldCBjb2xsaXN0ID0gW1xcXCLpu5jorqRcXFwiLCBcXFwibW92aWVfM19tYXJxdWVlXFxcIiwgXFxcIm1vdmllXzNcXFwiLCBcXFwibW92aWVfMlxcXCIsIFxcXCJtb3ZpZV8xXFxcIiwgXFxcInRleHRfMVxcXCIsIFxcXCJhdmF0YXJcXFwiLCBcXFwidGV4dF9pY29uXFxcIiwgXFxcImNhcmRfcGljXzNcXFwiLCBcXFwiY2FyZF9waWNfM19jZW50ZXJcXFwiLCBcXFwicGljXzFfY2FyZFxcXCIsIFxcXCJwaWNfMl9jYXJkXFxcIiwgXFxcIm1vdmllXzFfdmVydGljYWxfcGljXFxcIiwgXFxcIm1vdmllXzFfbGVmdF9waWNcXFwiXTtcXG4gICAgICAgIGxldCBob21lTGlzdENvbCA9IGdldEl0ZW0oXFxcImhvbWVMaXN0Q29sXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgbGV0IGluZGV4ID0gaG9tZUxpc3RDb2wgPyBjb2xsaXN0LmluZGV4T2YoaG9tZUxpc3RDb2wpIDogMDtcXG4gICAgICAgIHJldHVybiAkKGNvbGxpc3QsIDIsIFxcXCLpgInmi6nmoLflvI9cXFwiLCBpbmRleCkuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgaWYgKE1ZX0lOREVYID09PSAwKSB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwiaG9tZUxpc3RDb2xcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwiaG9tZUxpc3RDb2xcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0pO1xcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLmm7TmjaLphY3nva5cXFwiKSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9jcmVhdGVDb25maWcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICB9IGVsc2UgaWYgKFxcXCLmlK/mjIHkvZzogIVcXFwiID09IGlucHV0KSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9Eb25hdGUudiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgIH0gZWxzZSBpZiAoXFxcIlVJ566h55CGXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvVUlNYW5hZ2U/bW9kZT3kuIDnuqcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICB9IGVsc2UgaWYgKFxcXCLliIbkuqvlr7zlhaXot6/lvoRcXFwiID09IGlucHV0KSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9zaGFyZWRlZmF1bHRwYXRoI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgfSBlbHNlIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwi5pCc57Si5qih5byPXFxcIikpIHtcXG4gICAgICAgIGxldCBzbW9kZSA9IE51bWJlcihnZXRJdGVtKFxcXCJzbW9kZVxcXCIsIFxcXCIwXFxcIikpO1xcbiAgICAgICAgcmV0dXJuICQoW1xcXCLpgInkuK1cXFwiLCBcXFwi6IGa5ZCIXFxcIl0sIDEsIFxcXCLmkJzntKLmqKHlvI9cXFwiLCBzbW9kZSkuc2VsZWN0KCh0KSA9PiB7XFxuICAgICAgICAgIHNldEl0ZW0oXFxcInNtb2RlXFxcIiwgXFxcIlxcXCIgKyBNWV9JTkRFWCk7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBNWV9SVUxFLnRpdGxlKVxcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gXFxcIuaQnOe0ouaMh+Wumua6kFxcXCIpIHtcXG4gICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcIlNlYXJjaEFsbG93UG9wXFxcIikuc2hvdygpO1xcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gXFxcIuaIkeeahFxcXCIpIHtcXG4gICAgICAgIGxldCBmYXZpY29ucyA9IEdNLmdldChcXFwiZmF2aWNvbnNcXFwiKTtcXG4gICAgICAgIHJldHVybiBmYXZpY29ucy5nZXQoKTtcXG4gICAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCLmkJzntKLmjpLluo9cXFwiKSkge1xcbiAgICAgICAgbGV0IHNlYXJjaHNvcnQgPSBOdW1iZXIoZ2V0SXRlbShcXFwic2VhcmNoc29ydFxcXCIsIFxcXCIwXFxcIikpO1xcbiAgICAgICAgcmV0dXJuICQoW1xcXCLkuI3kvb/nlKhcXFwiLCBcXFwi6Ieq54S25o6S5bqPXFxcIiwgXFxcIuS9v+eUqOaOkuW6j1xcXCJdLCAxLCBcXFwi5pCc57Si5o6S5bqPXFxcIiwgc2VhcmNoc29ydCkuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgc2V0SXRlbShcXFwic2VhcmNoc29ydFxcXCIsIFN0cmluZyhNWV9JTkRFWCkpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSlcXG4gICAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCLot7Pov4flvaLlvI/kuoznuqdcXFwiKSkge1xcbiAgICAgICAgbGV0IHNraXBFciA9ICEhZ2V0SXRlbShcXFwic2tpcEVyXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgc2V0SXRlbShcXFwic2tpcEVyXFxcIiwgc2tpcEVyID8gXFxcIlxcXCIgOiBcXFwiMVxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7JcXFwiICsgKHNraXBFciA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuW8gOWQr1xcXCIpO1xcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gXFxcIkdpdEh1YlJBV+WcsOWdgFxcXCIpIHtcXG4gICAgICAgIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTY2XFxcIik7XFxuICAgICAgICBsZXQgZGVmID0gXFxcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbVxcXCI7XFxuICAgICAgICBoaWtlclBvcC5pbnB1dENvbmZpcm0oe1xcbiAgICAgICAgICB0aXRsZTogXFxcIui+k+WFpeWcsOWdgFxcXCIsXFxuICAgICAgICAgIGhpbnQ6IFxcXCLkuLrnqbrpu5jorqRcXFwiLFxcbiAgICAgICAgICBjb250ZW50OiBcXFwi6buY6K6kOlxcXCIgKyBkZWYsXFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0SXRlbShcXFwiZ2l0aHVicmF3XFxcIiwgZGVmKSxcXG4gICAgICAgICAgY29uZmlybSh0ZXh0KSB7XFxuICAgICAgICAgICAgaWYgKHRleHQgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgIHNldEl0ZW0oXFxcImdpdGh1YnJhd1xcXCIsIGRlZik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIHNldEl0ZW0oXFxcImdpdGh1YnJhd1xcXCIsIHRleHQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIsIFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgICAgaWYgKCFydW50aW1lQ29uZmlnLmluaXREZWZhdWx0KCkpIHtcXG4gICAgICAgICAgICAgIHRvYXN0KFxcXCLliLfmlrDlpLHotKVcXFwiKTtcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLlt7Lkv53lrZhcXFwiKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCLkuLvpophcXFwiKSkge1xcbiAgICAgICAgbGV0IGN0aGVtZSA9IGdldEl0ZW0oXFxcInRoZW1lXFxcIiwgXFxcIum7mOiupFxcXCIpO1xcbiAgICAgICAgbGV0IHMgPSAkLnRoZW1lcztcXG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocyk7XFxuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPCAyKSB7XFxuICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/msqHmnInlhbbku5bkuLvpophcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID09IDIpIHtcXG4gICAgICAgICAgbGV0IG5hbWUgPSBrZXlzWzBdO1xcbiAgICAgICAgICBpZiAoY3RoZW1lID09IGtleXNbMF0pIHtcXG4gICAgICAgICAgICBuYW1lID0ga2V5c1sxXTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBzZXRJdGVtKFxcXCJ0aGVtZVxcXCIsIG5hbWUpO1xcbiAgICAgICAgICBsZXQgdGhlbWUgPSAkLnRoZW1lc1tuYW1lXTtcXG4gICAgICAgICAgJC51aVRoZW1lLnNldCh0aGVtZSk7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCB0aGVtZXMgPSBPYmplY3Qua2V5cyhzKS5tYXAoeCA9PiB7XFxuICAgICAgICAgIHJldHVybiB4ID09IGN0aGVtZSA/ICfigJzigJzigJ3igJ0nICsgeC5mb250Y29sb3IoXFxcInJlZFxcXCIpIDogeDtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuICQodGhlbWVzKS5zZWxlY3QoKHRoZW1lcykgPT4ge1xcbiAgICAgICAgICBsZXQgbmFtZSA9IHRoZW1lc1tNWV9JTkRFWF07XFxuICAgICAgICAgIHNldEl0ZW0oXFxcInRoZW1lXFxcIiwgbmFtZSk7XFxuICAgICAgICAgIGxldCB0aGVtZSA9ICQudGhlbWVzW25hbWVdO1xcbiAgICAgICAgICAkLnVpVGhlbWUuc2V0KHRoZW1lKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0sIHRoZW1lcylcXG4gICAgICB9XFxuICAgIH0pLFxcbiAgICBpbWc6IHVpX2NvbmZpZy5pY29ucy7orr7nva4sXFxuICAgIGNvbF90eXBlOiB1aV9jb25maWcuY29sLFxcbiAgfSk7XFxuICB1aW9iai5wdXNoKHtcXG4gICAgaW5kZXg6IDMsXFxuICAgIGtleTogXFxcIuWOhuWPslxcXCIsXFxuICAgIHRpdGxlOiBcXFwi5Y6G5Y+yXFxcIixcXG4gICAgY29sX3R5cGU6IHVpX2NvbmZpZy5jb2wsXFxuICAgIGltZzogdWlfY29uZmlnLmljb25zLuWOhuWPsixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9oaXN0b3J5P3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUsXFxuICB9KTtcXG4gIHVpb2JqLnB1c2goe1xcbiAgICBpbmRleDogNCxcXG4gICAga2V5OiBcXFwi5oiR55qEXFxcIixcXG4gICAgdGl0bGU6IFxcXCLmlLbol49cXFwiLFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgIGxldCBmYXZpY29ucyA9IEdNLmdldChcXFwiZmF2aWNvbnNcXFwiKTtcXG4gICAgICByZXR1cm4gZmF2aWNvbnMuZ2V0KCk7XFxuICAgIH0pLFxcbiAgICBpbWc6IHVpX2NvbmZpZy5pY29ucy7miJHnmoQsXFxuICAgIGNvbF90eXBlOiB1aV9jb25maWcuY29sLFxcbiAgfSk7XFxuICB1aW9iai5wdXNoKHtcXG4gICAgaW5kZXg6IDUsXFxuICAgIGtleTogXFxcIua6kOWQjVxcXCIsXFxuICAgIHRpdGxlOiBcXFwi5b2T5YmN5rqQOlxcXCIgKyAobmFtZSB8fCBcXFwiXFxcIiksXFxuICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgaW1nOiB1aV9jb25maWcuaWNvbnMu5b2x6KeGLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+eCueS4iumdouaNoua6kFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgaWQ6IE1ZX1JVTEUudGl0bGUgKyBcXFwic291cmNlbmFtZVxcXCIsXFxuICAgIH1cXG4gIH0pO1xcbiAgdWlvYmoucHVzaCh7XFxuICAgIGluZGV4OiA2LFxcbiAgICBrZXk6IFxcXCLmkJzntKJcXFwiLFxcbiAgICB0aXRsZTogJ+aQnOe0oicsXFxuICAgIC8vZGVzYzogJycsXFxuICAgIGRlc2M6ICfopoHmkJzngrnku4DkuYgnLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgIHJldHVybiAnaGlrZXI6Ly9zZWFyY2g/cnVsZT0nICsgTVlfUlVMRS50aXRsZSArIFxcXCImcz1cXFwiICsgaW5wdXQ7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJrZXl3b3JkXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJrZXl3b3JkXFxcIiwgaW5wdXQpXFxuICAgICAgfSlcXG4gICAgfVxcbiAgfSk7XFxuICBzdG9yYWdlMC5wdXRNeVZhcihcXFwidWlvYmpcXFwiLCB1aW9iaik7XFxuXFxuICBzdWlvYmogPSB1aW9iai5zbGljZSgpO1xcbiAgdWlvYmogPSByZW9yZGVyQXJyYXlCeU9yZGVyKHVpb2JqLCB1aV9pbmRleHMpO1xcbiAgdWlfaW5kZXhzLm1hcChpdGVtID0+IHtcXG4gICAgaWYgKGl0ZW0ua2V5ID09IFxcXCLmjaLmupBcXFwiICYmIGl0ZW0uaW5kZXggPT0gLTEpIHtcXG4gICAgICBsZXQgb2JqaSA9IHN1aW9iai5maW5kSW5kZXgoeCA9PiB4LmtleSA9PSBcXFwi5o2i5rqQXFxcIik7XFxuICAgICAgbGV0IGNvYmppID0gdWlvYmouZmluZEluZGV4KHggPT4geC5rZXkgPT0gXFxcIua6kOWQjVxcXCIpO1xcbiAgICAgIGlmIChvYmppICE9IDEgJiYgY29iamkgIT0gLTEpIHtcXG4gICAgICAgIHVpb2JqW2NvYmppXS51cmwgPSBzdWlvYmpbb2JqaV0udXJsO1xcbiAgICAgICAgaWYgKHN1aW9ialtvYmppXS5oYXNPd25Qcm9wZXJ0eShcXFwiZXh0cmFcXFwiKSkge1xcbiAgICAgICAgICB1aW9ialtjb2JqaV0uZXh0cmEgPSBzdWlvYmpbb2JqaV0uZXh0cmE7XFxuICAgICAgICAgIHVpb2JqW2NvYmppXS5leHRyYS5pZCA9IE1ZX1JVTEUudGl0bGUgKyBcXFwic291cmNlbmFtZVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChpdGVtLmtleSA9PSBcXFwi5rqQ5ZCNXFxcIiAmJiBpdGVtLmluZGV4ID09IC0xKSB7XFxuICAgICAgbGV0IG9iamkgPSBzdWlvYmouZmluZEluZGV4KHggPT4geC5rZXkgPT0gXFxcIua6kOWQjVxcXCIpO1xcbiAgICAgIGxldCBjb2JqaSA9IHVpb2JqLmZpbmRJbmRleCh4ID0+IHgua2V5ID09IFxcXCLmjaLmupBcXFwiKTtcXG4gICAgICBpZiAob2JqaSAhPSAxICYmIGNvYmppICE9IC0xKSB7XFxuICAgICAgICB1aW9ialtjb2JqaV0udGl0bGUgPSBuYW1lIHx8IFxcXCLmjaLmupBcXFwiO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAoaXRlbS5rZXkgPT0gXFxcIuWOhuWPslxcXCIgJiYgaXRlbS5pbmRleCA9PSAtMSkge1xcbiAgICAgIHNlbGVjdHMudW5zaGlmdCh7XFxuICAgICAgICBcXFwidGl0bGVcXFwiOiBcXFwi5Y6G5Y+yXFxcIixcXG4gICAgICAgIFxcXCJpY29uXFxcIjogdWlfY29uZmlnLmljb25zLuWOhuWPsixcXG4gICAgICB9KVxcbiAgICB9XFxuICB9KTtcXG5cXG4gIHVpb2JqLmZvckVhY2goaXRlbSA9PiB7XFxuICAgIGQucHVzaChpdGVtKVxcbiAgfSlcXG5cXG4gIFxcblxcbn1cXG5sZXQgZCA9IFtdO1xcblxcbmxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxubGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG5EcnB5TWFuYWdlLmluaXRQYWdlKFxcXCJob21lXFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgR00uY2xlYXIoXFxcImZhdmljb25zXFxcIilcXG59KTtcXG5cXG50cnkge1xcbiAgaWYgKGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDMwICYmICFhbmRyb2lkLm9zLkVudmlyb25tZW50LmlzRXh0ZXJuYWxTdG9yYWdlTWFuYWdlcigpKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IFxcXCLigJjigJjmj5DnpLrigJnigJlcXFwiLFxcbiAgICAgIGRlc2M6IFxcXCLlvZPliY3msqHmnInmlofku7bnrqHnkIbmnYPpmZDml6Dms5XmraPluLjkvb/nlKjor7fmiZPlvIDmtbfpmJTorr7nva49PuabtOWkmuiuvue9rj0+5YaF6YOo5paH5Lu2566h55CGPT7lj7PkuIrop5JcXFwiLFxcbiAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgfSk7XFxuICB9IGVsc2UgaWYgKCFydW50aW1lQ29uZmlnLmlzUHJlcGFyZWQoKSkge1xcbiAgICBsZXQgbG9hZEVycm9yID0gcnVudGltZUNvbmZpZy5nZXRMb2FkRXJyb3IoKTtcXG4gICAgaWYgKGxvYWRFcnJvcikge1xcbiAgICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOmFjee9ruaWh+S7tuWKoOi9veWksei0peKAneKAnVxcXCIsXFxuICAgICAgICBkZXNjOiBsb2FkRXJyb3IudG9TdHJpbmcoKSxcXG4gICAgICAgIHVybDogJCgpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIikuaW5pdERlZmF1bHQoKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICB9KTtcXG4gICAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmm7TmjaLphY3nva5cXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2NyZWF0ZUNvbmZpZyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIui/mOayoeaciemFjee9ruinhumikea6kFxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvY3JlYXRlQ29uZmlnI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgIH0pO1xcbiAgICB9XFxuICB9IGVsc2UgaWYgKGZpbGVFeGlzdChcXFwiaGlrZXI6Ly9maWxlcy9kYXRhL1xcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcIi9saWJzX2hpa2VyL2RycHkyLmpzXFxcIikpIHtcXG5cXG4gICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcbiAgICBpZiAoTVlfUEFHRSA9PT0gMSkge1xcbiAgICAgIGlmIChzb3VyY2UgPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICBzZXRIaWVkKGQsIFxcXCJcXFwiLCB7fSk7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuW9k+WJjeayoeaciemAieS4reS7u+S9leinhumikea6kFxcXCIpO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBzZXRIaWVkKGQsIHNvdXJjZS5uYW1lLCBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRDb25maWcoKSB8fCB7fSk7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIC8vbG9nKERycHlNYW5hZ2UuZ2V0KHNvdXJjZS5rZXkpKVxcbiAgICBsZXQgaGFzSGFlZCA9IGZhbHNlO1xcbiAgICBpZiAoZ2V0TXlWYXIoXFxcImxpbmtzXFxcIiwgXFxcIlxcXCIpID09IFxcXCJcXFwiKSB7XFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn5Yqg6L295LitLi4uJyxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgaWQ6IE1ZX1JVTEUudGl0bGUgKyBcXFwibG9hZFxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9KTtcXG4gICAgICBzZXRQcmVSZXN1bHQoZCk7XFxuICAgICAgZC5sZW5ndGggPSAwO1xcbiAgICAgIGhhc0hhZWQgPSB0cnVlO1xcbiAgICB9XFxuICAgIGlmIChzb3VyY2UpIHtcXG4gICAgICBsb2FkKGQsIERycHlNYW5hZ2UuZ2V0KHNvdXJjZS5rZXkpLCBzb3VyY2UsIGhhc0hhZWQpO1xcbiAgICB9XFxuICB9IGVsc2Uge1xcbiAgICBzZXREcnB5UGF0aChkKTtcXG4gIH1cXG5cXG59IGNhdGNoIChlKSB7XFxuICBkLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBlLnRvU3RyaW5nKCkgKyBcXFwi4oCd4oCdXFxcIixcXG4gICAgZGVzYzogZS5saW5lTnVtYmVyLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICB0aXRsZTogXFxcIua4hemZpHVp6K6+572uXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgbGV0IHtcXG4gICAgICAgICAgICB1aV9jbGVhcixcXG4gICAgICAgICAgfSA9ICQucmVxdWlyZShcXFwiVUlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgdWlfY2xlYXIoXFxcInlpXFxcIik7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICB9KVxcbiAgICAgIH1dXFxuICAgIH1cXG4gIH0pO1xcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmm7TmjaLphY3nva5cXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvY3JlYXRlQ29uZmlnI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG4gIH0pO1xcbiAgZGVsZXRlSXRlbShNWV9SVUxFLnRpdGxlICsgXFxcImxvYWRcXFwiKTtcXG59XFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Li76aG15aSE55CGXCIsXCJwYXRoXCI6XCJNaWFuTG9hZFwiLFwicnVsZVwiOlwiaWYgKGdldEl0ZW0oXFxcImZpcnN0b3BlblxcXCIpID09IE1ZX1JVTEUudmVyc2lvbikge1xcbiAgICAkLnJlcXVpcmUoXFxcIm1pYW5cXFwiKTtcXG59IGVsc2UgaWYgKE1ZX1BBR0UgPT09IDEpIHtcXG4gICAgbGV0IGQgPSBbXVxcbiAgICBsZXQgdGltZSA9IGdldEl0ZW0oXFxcImZpcnN0b3BlblxcXCIsIFxcXCJcXFwiKSA/IDYgOiAyMDtcXG4gICAgbGV0IGlkID0gRGF0ZS5ub3coKTtcXG4gICAgbGV0IGNvbnRlbnQgPSBgXFxuICAgIDEuIOacrOWwj+eoi+W6j+aJgOacieS7o+eggeWFqOmDqOW8gOa6kO+8jOS4lOacrOinhOWImeS4uuWtpuS5oOebrueahO+8jOivt+S6juWvvOWFpTI05bCP5pe25YaF5Yig6Zmk77yB77yB77yBXFxuICAgIDIuIOacrOWwj+eoi+W6jzxiPuWujOWFqOWFjei0uTwvYj7vvIzlpoLmnpzkvaDmmK/ku5jotLnotK3kubDnmoTmga3llpzkvaDooqvpqpfkuobjgIJcXG4gICAg5b2T54S25aaC5p6c5pyJ6IO95Yqb5oOz6byT5Yqx5L2c6ICF55qE5Y+v5LulJHtcXFwi5pSv5oyB5LiA5LiLXFxcIi5iaWcoKS5saW5rKFxcXCJoaWtlcjovL3BhZ2UvRG9uYXRlLnYjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIil9PC9hPig8c21hbGw+54K55Ye75Y+v6L+b5YWl5o2Q6LWg77yM5Y+v5Zyo5Li76aG16I+c5Y2V6L+b5YWlPC9zbWFsbD4p44CCXFxuICAgIDMuIOacrOWwj+eoi+W6j+WPquaUr+aMgemBk+mVv+eahGRycHlbanNd6KeG6aKR5rqQ77yM5YW25LuW5LiA5qaC5LiN5pSv5oyB44CCXFxuICAgIFxcbiAgICA8Yj7lvIDlp4vkvb/nlKjmnKzop4TliJnljbPku6PooajpgbXlrojop4TliJnmnaHkvos8L2I+XFxuICAgIGA7XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxzdHJvbmc+5L2/55So5YmN6aG755+lPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGNvbnRlbnQudHJpbSgpLnJlcGxhY2UoL1xcXFxuXFxcXHMqPy9nLCBcXFwiPGJyPlxcXCIpLFxcbiAgICAgICAgXFxcImNvbF90eXBlXFxcIjogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSwge1xcbiAgICAgICAgdGl0bGU6IGDlvZPliY3niYjmnKzvvJoke01ZX1JVTEUudmVyc2lvbn0gJHtnZXRJdGVtKFxcXCJmaXJzdG9wZW5cXFwiLCBcXFwiXFxcIikgJiYgZ2V0SXRlbShcXFwiZmlyc3RvcGVuXFxcIiwgXFxcIlxcXCIpIDwgTVlfUlVMRS52ZXJzaW9uID8gXFxcIvCfhpVcXFwiIDogXFxcIlxcXCJ9YCxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gICAgICAgICAgICBoaWtlclBvcC51cGRhdGVSZWNvcmRzQm90dG9tKCQucmVxdWlyZShcXFwidXBkYXRlUmVjb3Jkc1xcXCIpKTtcXG5cXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSwge1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogdGltZSArIFxcXCLnp5LlkI7nu6fnu61cXFwiLFxcbiAgICAgICAgdXJsOiBcXFwidG9hc3Q6Ly/or7forqTnnJ/pmIXor7vku6XkuIrlhoXlrrlcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IGlkICsgXFxcInRpbWVyXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG4gICAgc2V0UmVzdWx0KGQpO1xcbiAgICB3aGlsZSAodGltZSAhPSAwKSB7XFxuICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDEwMDApO1xcbiAgICAgICAgdGltZSAtPSAxO1xcbiAgICAgICAgdXBkYXRlSXRlbShpZCArIFxcXCJ0aW1lclxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogdGltZSArIFxcXCLnp5LlkI7nu6fnu61cXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICB1cGRhdGVJdGVtKGlkICsgXFxcInRpbWVyXFxcIiwge1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzmiJHlkIzmhI/ku6XkuIropoHmsYLigJ3igJ1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCh2KSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwiZmlyc3RvcGVuXFxcIiwgU3RyaW5nKHYpKTtcXG4gICAgICAgICAgICBHTS5jbGVhcihcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gICAgICAgICAgICBoaWtlclBvcC51cGRhdGVSZWNvcmRzQm90dG9tKCQucmVxdWlyZShcXFwidXBkYXRlUmVjb3Jkc1xcXCIpKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oSf6LCi5oKo55qE55CG6KejXFxcIjtcXG4gICAgICAgIH0sIE1ZX1JVTEUudmVyc2lvbiksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICAgIH0pO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIlVp566h55CGXCIsXCJwYXRoXCI6XCJVSU1hbmFnZVwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gcmVvcmRlckFycmF5QnlPcmRlcihhcnJheSwgb3JkZXIpIHtcXG4gIC8vIOWIm+W7uuS4gOS4quaYoOWwhO+8jOWwhmtleeWAvOaYoOWwhOWIsOWOn+Wni+aVsOe7hOS4reeahOWvueixoVxcbiAgbGV0IG1hcCA9IG5ldyBNYXAoYXJyYXkubWFwKG9iaiA9PiBbb2JqLmtleSwgb2JqXSkpO1xcbiAgbGV0IHJlb3JkZXJlZEFycmF5ID0gW107IC8vIOmHjeaWsOaOkuW6j+WQjueahOaVsOe7hFxcbiAgbGV0IHJlbW92ZWRLZXlzID0gbmV3IFNldCgpOyAvLyDlrZjlgqjpnIDopoHnp7vpmaTnmoRrZXnlgLxcXG4gIC8vIOagueaNrm9yZGVy5pWw57uE5p2l6YeN5paw5o6S5YiXYXJyYXnmlbDnu4RcXG4gIG9yZGVyLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgaWYgKGl0ZW0uaW5kZXggPT09IC0xKSB7XFxuICAgICAgLy8g5aaC5p6caW5kZXjmmK8tMe+8jOWwhmtleea3u+WKoOWIsOenu+mZpOWIl+ihqOS4rVxcbiAgICAgIHJlbW92ZWRLZXlzLmFkZChpdGVtLmtleSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgLy8g5aaC5p6caW5kZXjkuI3mmK8tMe+8jOWImeWwhuWvueixoea3u+WKoOWIsOe7k+aenOaVsOe7hOS4reeahOaMh+WumuS9jee9rlxcbiAgICAgIGxldCBvYmogPSBtYXAuZ2V0KGl0ZW0ua2V5KTtcXG5cXG4gICAgICBpZiAob2JqICYmIGl0ZW0uaGFzT3duUHJvcGVydHkoXFxcImltZ1xcXCIpICYmIGl0ZW0uaW1nKSB7XFxuICAgICAgICBvYmouaW1nID0gaXRlbS5pbWc7XFxuICAgICAgfVxcbiAgICAgIGlmIChvYmogJiYgaXRlbS5oYXNPd25Qcm9wZXJ0eShcXFwidGl0bGVcXFwiKSAmJiBpdGVtLnRpdGxlKSB7XFxuICAgICAgICBvYmoudGl0bGUgPSBpdGVtLnRpdGxlO1xcbiAgICAgIH1cXG4gICAgICBpZiAob2JqKSB7XFxuICAgICAgICByZW9yZGVyZWRBcnJheVtpXSA9IG9iajtcXG4gICAgICB9XFxuICAgIH1cXG4gIH0pO1xcbiAgLy8g5re75Yqg6YKj5Lqb5LiN5Zyob3JkZXLmlbDnu4TkuK3nmoTlr7nosaHvvIzlubbmjpLpmaTnp7vpmaTliJfooajkuK3nmoTpoblcXG4gIGFycmF5LmZvckVhY2gob2JqID0+IHtcXG4gICAgaWYgKCFyZW1vdmVkS2V5cy5oYXMob2JqLmtleSkgJiYgIXJlb3JkZXJlZEFycmF5LmluY2x1ZGVzKG9iaikpIHtcXG4gICAgICByZW9yZGVyZWRBcnJheS5wdXNoKG9iaik7XFxuICAgIH1cXG4gIH0pO1xcbiAgLy8g6L+H5ruk5o6J57uT5p6c5pWw57uE5Lit55qEdW5kZWZpbmVk6aG577yM5bm26L+U5ZueXFxuICByZXR1cm4gcmVvcmRlcmVkQXJyYXkuZmlsdGVyKG9iaiA9PiBvYmogIT09IHVuZGVmaW5lZCk7XFxufVxcbi8qKlxcbiAqIOeUn+aIkOS4gOS4qumaj+acuuminOiJsueahOWNgeWFrei/m+WItuihqOekuuOAglxcbiAqIEByZXR1cm4ge3N0cmluZ30g6L+U5Zue5LiA5Liq5b2i5aaCICcjUlJHR0JCJyDnmoTpmo/mnLrpopzoibLlrZfnrKbkuLLjgIJcXG4gKi9cXG52YXIgZ2V0UmFuZ2VDb2xvcnMgPSBmdW5jdGlvbiAoKSB7XFxuICByZXR1cm4gJyMnICsgKCcwMDAwMCcgKyAoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMCA8PCAwKS50b1N0cmluZygxNikpLnN1YnN0cigtNik7XFxufTtcXG5cXG4vKipcXG4gKiDmt7HluqblkIjlubblpJrkuKrlr7nosaHnmoTlsZ7mgKfjgIJcXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IC0g6KKr5ZCI5bm255qE5a+56LGh77yM56ys5LiA5Liq5Y+C5pWw77yM5ZCI5bm255qE57uT5p6c5bCG5Lul5q2k5a+56LGh5Li65Z+656GA44CCXFxuICogQHJldHVybnMge09iamVjdH0gLSDlkIjlubblkI7nmoTlr7nosaHjgIJcXG4gKi9cXG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0KSB7XFxuICBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcXG4gICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xcbiAgfVxcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcXG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xcbiAgICAgIGlmIChpc09iamVjdChzb3VyY2Vba2V5XSkpIHtcXG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pIHtcXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fTtcXG4gICAgICAgIH1cXG4gICAgICAgIGRlZXBNZXJnZSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0pO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcbiAgcmV0dXJuIHRhcmdldDtcXG59XFxuXFxuLyoqXFxuICog5LuO5rqQ5a+56LGh5Lit5rex5bqm5Yig6Zmk5oyH5a6a55qE5bGe5oCn44CCXFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSAtIOimgeWkhOeQhueahOa6kOWvueixoeOAglxcbiAqIEBwYXJhbSB7T2JqZWN0fSBleGMgLSDmjIflrpropoHmjpLpmaTnmoTlsZ7mgKfvvIzku6XplK7lgLzlr7nlvaLlvI/mjIflrprjgIJcXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIOi/lOWbnuS4gOS4quaWsOeahOWvueixoe+8jOS4jeWMheWQq+aMh+WumuimgeaOkumZpOeahOWxnuaAp+OAglxcbiAqL1xcbmZ1bmN0aW9uIGRlZXBPbWl0KHNvdXJjZSwgZXhjKSB7XFxuICBjb25zdCByZXN1bHQgPSB7fTtcXG4gIC8vIOmBjeWOhumhtuWxgumUrlxcbiAgZm9yIChsZXQga2V5IGluIHNvdXJjZSkge1xcbiAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGtleSkpIHtcXG4gICAgICAvLyDmo4Dmn6XpobblsYLplK7mmK/lkKblupTor6XooqvmjpLpmaRcXG4gICAgICBpZiAoIShleGMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBleGNba2V5XSA9PT0gdHJ1ZSkpIHtcXG4gICAgICAgIC8vIOWmguaenOmhtuWxgumUruWvueW6lOeahOWAvOaYr+Wvueixoe+8jOW5tuS4lOacieWtkOaOkumZpOinhOWIme+8jOWImemAkuW9kuiwg+eUqCBkZWVwT21pdFxcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2Vba2V5XSA9PT0gJ29iamVjdCcgJiYgc291cmNlW2tleV0gIT09IG51bGwgJiYgZXhjW2tleV0pIHtcXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBkZWVwT21pdChzb3VyY2Vba2V5XSwgZXhjW2tleV0pO1xcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlW2tleV0gIT09ICdvYmplY3QnIHx8IHNvdXJjZVtrZXldID09PSBudWxsIHx8ICFleGNba2V5XSkge1xcbiAgICAgICAgICAvLyDlpoLmnpzpobblsYLplK7lr7nlupTnmoTlgLzkuI3mmK/lr7nosaHvvIzmiJbogIXmsqHmnInlrZDmjpLpmaTop4TliJnvvIznm7TmjqXlpI3liLblgLxcXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBzb3VyY2Vba2V5XTtcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG4gIHJldHVybiByZXN1bHQ7XFxufVxcblxcbi8qKlxcbiAqIOWIpOaWreS4pOS4quWvueixoeaYr+WQpuebuOetie+8jOW/veeVpeaMh+WumueahOmUruOAglxcbiAqIEBwYXJhbSB7Kn0geCAtIOesrOS4gOS4quWvueixoeOAglxcbiAqIEBwYXJhbSB7Kn0geSAtIOesrOS6jOS4quWvueixoeOAglxcbiAqIEBwYXJhbSB7QXJyYXl9IGV4Y2x1ZGVLZXlzIC0g6ZyA6KaB5b+955Wl5q+U6L6D55qE6ZSu5pWw57uE44CCXFxuICogQHJldHVybnMge2Jvb2xlYW59IC0g5aaC5p6c5Lik5Liq5a+56LGh55u4562J77yI6ICD6JmR5bWM5aWX5a+56LGh77yJ5LiU5LiN5YyF5ZCr5oyH5a6a55qE6ZSu77yM5YiZ6L+U5ZuedHJ1Ze+8m+WQpuWImei/lOWbnmZhbHNl44CCXFxuICovXFxuZnVuY3Rpb24gaXNFcXVhbCh4LCB5LCBleGNsdWRlS2V5cykge1xcbiAgZXhjbHVkZUtleXMgPSBleGNsdWRlS2V5cyAhPSB1bmRlZmluZWQgPyBleGNsdWRlS2V5cyA6IFtdO1xcbiAgY29uc3Qgb2sgPSBPYmplY3Qua2V5cztcXG4gIGNvbnN0IHR4ID0gdHlwZW9mIHg7XFxuICBjb25zdCB0eSA9IHR5cGVvZiB5O1xcbiAgaWYgKHggJiYgeSAmJiB0eCA9PT0gXFxcIm9iamVjdFxcXCIgJiYgdHggPT09IHR5KSB7XFxuICAgIGNvbnN0IGtleXNYID0gb2soeCkuZmlsdGVyKGtleSA9PiAhZXhjbHVkZUtleXMuaW5jbHVkZXMoa2V5KSk7XFxuICAgIGNvbnN0IGtleXNZID0gb2soeSkuZmlsdGVyKGtleSA9PiAhZXhjbHVkZUtleXMuaW5jbHVkZXMoa2V5KSk7XFxuICAgIGlmIChrZXlzWC5sZW5ndGggIT09IGtleXNZLmxlbmd0aCkge1xcbiAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfVxcbiAgICByZXR1cm4ga2V5c1guZXZlcnkoKGtleSkgPT4gaXNFcXVhbCh4W2tleV0sIHlba2V5XSwgZXhjbHVkZUtleXMpKTtcXG4gIH1cXG4gIHJldHVybiB4ID09PSB5O1xcbn1cXG5cXG5sZXQgdGhlbWVNYW5hZ2UgPSB7XFxuICBuYW1lOiBcXFwidGhlbWUuanNvblxcXCIsXFxuICBwYXRoOiBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9EcnB5SGlrZXIvXFxcIixcXG4gIHNhdmUoY29udGVudCkge1xcbiAgICBzYXZlRmlsZSh0aGlzLnBhdGggKyB0aGlzLm5hbWUsIGNvbnRlbnQpO1xcbiAgfSxcXG4gIGluaXQoKSB7XFxuICAgIGxldCBqc29uID0ge307XFxuICAgIGlmICghZmlsZUV4aXN0KHRoaXMucGF0aCArIHRoaXMubmFtZSkpIHtcXG4gICAgICB0aGlzLnNhdmUoXFxcInt9XFxcIik7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICBqc29uID0gSlNPTi5wYXJzZShyZWFkRmlsZSh0aGlzLnBhdGggKyB0aGlzLm5hbWUpKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgIGpzb24gPSB7fTtcXG4gICAgICB0aGlzLnNhdmUoXFxcInt9XFxcIik7XFxuICAgIH1cXG4gICAgcmV0dXJuIGpzb247XFxuICB9LFxcbiAgaGFzKHRzKSB7XFxuICAgIGxldCBqc29uID0gdGhpcy5pbml0KCk7XFxuICAgIGxldCBzanNvbiA9IGRlZXBNZXJnZSh7fSwganNvbik7XFxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXModHMpO1xcbiAgICBrZXlzLmZvckVhY2goayA9PiB7XFxuICAgICAgaWYgKCFqc29uLmhhc093blByb3BlcnR5KGspKSB7XFxuICAgICAgICBqc29uW2tdID0gdHNba107XFxuICAgICAgfVxcbiAgICB9KVxcbiAgICBpZiAoT2JqZWN0LmtleXMoc2pzb24pLmxlbmd0aCA9PSAwKSB7XFxuICAgICAganNvbiA9IGRlZXBNZXJnZShqc29uLCBzanNvbik7XFxuICAgICAgdGhpcy5zYXZlKEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG4gICAgICByZXR1cm4ganNvbjtcXG4gICAgfVxcbiAgICBpZiAoIWtleXMuZXZlcnkoa2V5ID0+IHNqc29uLmhhc093blByb3BlcnR5KGtleSkpKSB7XFxuICAgICAgdGhpcy5zYXZlKEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG4gICAgfVxcbiAgICByZXR1cm4ganNvbjtcXG4gIH0sXFxuICBnZXQoa2V5KSB7XFxuICAgIGxldCBqc29uID0gdGhpcy5pbml0KCk7XFxuICAgIGlmIChrZXkgIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgaWYgKHR5cGVvZiBrZXkgIT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgIGpzb24gPSB0aGlzLmhhcyhrZXkpO1xcbiAgICAgICAgcmV0dXJuIGpzb247XFxuICAgICAgfVxcbiAgICB9IGVsc2Uge1xcbiAgICAgIHJldHVybiBqc29uO1xcbiAgICB9XFxuICB9LFxcbiAgc2V0KGtleSwgdmFsdWUpIHtcXG4gICAgbGV0IGpzb24gPSB0aGlzLmluaXQoKTtcXG4gICAgaWYgKGtleSAhPSB1bmRlZmluZWQpIHtcXG4gICAgICBqc29uW2tleV0gPSB2YWx1ZTtcXG4gICAgfVxcbiAgICB0aGlzLnNhdmUoSlNPTi5zdHJpbmdpZnkoanNvbikpO1xcbiAgfVxcbn1cXG5cXG5sZXQgZGVmVGhlbWUgPSB7XFxuICDpu5jorqQ6IHtcXG4gICAgeWk6IHtcXG4gICAgICBtYXJrOiBcXFwiI2ltbWVyc2l2ZVRoZW1lI1xcXCIsXFxuICAgICAg5o2i5rqQ6aKc6ImyOiBcXFwiI0REOUM1QVxcXCIsIOWIhuexu+minOiJsjogXFxcInJhbmRvbVxcXCIsXFxuICAgICAgaWNvbnM6IHtcXG4gICAgICAgIOaNoua6kDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzEzMC5wbmdcXFwiLFxcbiAgICAgICAg5pCc57SiOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9zeXN0ZW0vMTQ5LnBuZ1xcXCIsXFxuICAgICAgICDorr7nva46IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3N5c3RlbS8xNTAucG5nXFxcIixcXG4gICAgICAgIOaIkeeahDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzEzOS5wbmdcXFwiLFxcbiAgICAgICAg5pS26JePOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9zeXN0ZW0vMTM5LnBuZ1xcXCIsXFxuICAgICAgICDljoblj7I6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3N5c3RlbS8xMzYucG5nXFxcIixcXG5cXG4gICAgICAgIOW9seinhjogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8va2UvMTUwLnBuZ1xcXCIsXFxuICAgICAgICDmvKvnlLs6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL2tlLzEzLnBuZ1xcXCIsXFxuICAgICAgICDlsI/or7Q6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL2tlLzM4LnBuZ1xcXCIsXFxuICAgICAgICDkuabmnrblsI/or7Q6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3EvMTMucG5nXFxcIixcXG4gICAgICAgIOS5puaetua8q+eUuzogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vcS8zNC5wbmdcXFwiLFxcbiAgICAgIH1cXG4gICAgfSxcXG4gICAgZXI6IHtcXG4gICAgICBpY29uczoge1xcbiAgICAgICAg5q2j5bqPOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tZXNzeS8xMjMuc3ZnXFxcIixcXG4gICAgICAgIOWAkuW6jzogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbWVzc3kvMTI0LnN2Z1xcXCIsXFxuICAgICAgICDop4bpopE6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL21lc3N5LzExMC5zdmdcXFwiXFxuICAgICAgfSxcXG4gICAgICDnroDku4vmoLflvI86IFxcXCIwXFxcIixcXG4gICAgICDmtYXmnaXmupDoibI6IFxcXCIjRkZGRkZGO1xcXCIsXFxuICAgICAg5rex5p2l5rqQ6ImyOiBcXFwiI0ZGRkZGRjtcXFwiLFxcbiAgICAgIOe6v+i3r+minOiJsjogXFxcIiNERDlDNUFcXFwiLFxcbiAgICAgIOe6v+i3r+aYvuekujogXFxcIuW9k+WJjee6v+i3rzoge2Zvcm19XFxcXHRcXFxcdOWFsTp7cGxheXN96ZuGXFxcXHRcXFxcdHtzcGFnZX0ve21heH1cXFwiLFxcbiAgICB9XFxuICB9LFxcbiAgXFxcIjAwN1xcXCI6IHtcXG4gICAgeWk6IHtcXG4gICAgICBtYXJrOiBcXFwiI2dhbWVUaGVtZSNcXFwiLFxcbiAgICAgIOaNoua6kOminOiJsjogXFxcIiMxOUI4OURcXFwiLCDliIbnsbvpopzoibI6IFxcXCIjMTlCODlEXFxcIixcXG4gICAgICBpY29uczoge1xcbiAgICAgICAg5o2i5rqQOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9kcnB5L3Nob3V5ZS5zdmdcXFwiLFxcbiAgICAgICAg5pCc57SiOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9kcnB5L3NvdXN1by5zdmdcXFwiLFxcbiAgICAgICAg6K6+572uOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9kcnB5L3NoZXpoaS5zdmdcXFwiLFxcbiAgICAgICAg5oiR55qEOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9kcnB5L3dvZGUuc3ZnXFxcIixcXG4gICAgICAgIOaUtuiXjzogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvZHJweS9zaG91Y2FuZy5zdmdcXFwiLFxcbiAgICAgICAg5Y6G5Y+yOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9kcnB5L2xpc2hpLnN2Z1xcXCIsXFxuXFxuICAgICAgICDlvbHop4Y6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2RycHkvc2hpcGluLnN2Z1xcXCIsXFxuICAgICAgICDmvKvnlLs6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2RycHkvbWFuaHVhLnN2Z1xcXCIsXFxuICAgICAgICDlsI/or7Q6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2RycHkveGlhb3NodW8uc3ZnXFxcIixcXG4gICAgICAgIOS5puaetuWwj+ivtDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvZHJweS94aWFvc2h1by5zdmdcXFwiLFxcbiAgICAgICAg5Lmm5p625ryr55S7OiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9kcnB5L21hbmh1YS5zdmdcXFwiLFxcbiAgICAgIH1cXG4gICAgfSxcXG4gICAgZXI6IHtcXG4gICAgICBpY29uczoge1xcbiAgICAgICAg5q2j5bqPOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9kcnB5L3JldmVyc2Uuc3ZnXFxcIixcXG4gICAgICAgIOWAkuW6jzogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvZHJweS9jb3JyZWN0LnN2Z1xcXCIsXFxuICAgICAgICDop4bpopE6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2RlZmF1bHQuc3ZnXFxcIlxcbiAgICAgIH0sXFxuICAgICAg566A5LuL5qC35byPOiBcXFwiMVxcXCIsXFxuICAgICAg5rWF5p2l5rqQ6ImyOiBcXFwiO1xcXCIsXFxuICAgICAg5rex5p2l5rqQ6ImyOiBcXFwiO1xcXCIsXFxuICAgICAg57q/6Lev6aKc6ImyOiBcXFwiIzE5Qjg5RFxcXCIsXFxuICAgICAg57q/6Lev5pi+56S6OiAn5YWxOntwbGF5c33pm4YsXFxcXHRcXFxcdDxzcGFuIHN0eWxlPVxcXCJjb2xvcjojMTlCODlEXFxcIj57c3BhZ2V9PC9zcGFuPi97bWF4femhtScsXFxuICAgIH1cXG4gIH1cXG59XFxuZGVsZXRlIGRlZlRoZW1lW1xcXCIwMDdcXFwiXTtcXG5cXG5sZXQgVGhlbWUgPSB0aGVtZU1hbmFnZS5nZXQoZGVmVGhlbWUpO1xcblxcbmxldCB0aGVtZSA9IGdldEl0ZW0oXFxcInRoZW1lXFxcIiwgXFxcIum7mOiupFxcXCIpO1xcblxcbmxldCBkZWYgPSB7XFxuICB5aTogeyBcXFwidWlcXFwiOiBbeyBcXFwia2V5XFxcIjogXFxcIuaNoua6kFxcXCIsIFxcXCJpbmRleFxcXCI6IDAgfSwgeyBcXFwia2V5XFxcIjogXFxcIuaQnOe0ouaooeW8j1xcXCIsIFxcXCJpbmRleFxcXCI6IDEgfSwgeyBcXFwia2V5XFxcIjogXFxcIuaIkeeahFxcXCIsIFxcXCJpbmRleFxcXCI6IDQsIFxcXCJ0aXRsZVxcXCI6IFxcXCLmiJHnmoRcXFwiIH0sIHsgXFxcImtleVxcXCI6IFxcXCLorr7nva5cXFwiLCBcXFwiaW5kZXhcXFwiOiAyIH0sIHsgXFxcImtleVxcXCI6IFxcXCLmkJzntKJcXFwiLCBcXFwiaW5kZXhcXFwiOiA2IH0sIHsgXFxcImtleVxcXCI6IFxcXCLmupDlkI1cXFwiLCBcXFwiaW5kZXhcXFwiOiAtMSB9LCB7IFxcXCJrZXlcXFwiOiBcXFwi5Y6G5Y+yXFxcIiwgXFxcImluZGV4XFxcIjogLTEgfV0sIFxcXCJjb2xcXFwiOiBcXFwiaWNvbl9zbWFsbF80XFxcIiB9LFxcbiAgZXI6IHsg5YiG6aG1OiA0MCwg5Y6G5Y+y6K6w5b2VOiAyMDAsIOWIhumhtemAu+i+kTogXFxcIjBcXFwiLCDliIbpobXlr7zoiKo6IGZhbHNlLCDnur/ot6/moLflvI86IFxcXCJzY3JvbGxfYnV0dG9uXFxcIiwg5LqM57qn57yT5a2YOiBmYWxzZSwg5LqM57qn5Yi35pawOiBmYWxzZSB9XFxufVxcblxcbk9iamVjdC5lbnRyaWVzKFRoZW1lKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcXG4gIFRoZW1lW2tleV0gPSBkZWVwTWVyZ2Uoe30sIFRoZW1lW1xcXCLpu5jorqRcXFwiXSwgdmFsdWUpO1xcbn0pXFxuXFxuLy/ml6fniYjlhbzlrrnlpITnkIbmm7/mjaJrZXlcXG5mdW5jdGlvbiByZXBsYWNlS2V5c0luQXJyYXkoYXJyYXksIGtleU1hcCkge1xcbiAga2V5TWFwID0ge1xcbiAgICAn5pS26JePJzogJ+aIkeeahCcsXFxuICB9O1xcbiAgYXJyYXkuZm9yRWFjaChpdGVtID0+IHtcXG4gICAgT2JqZWN0LmtleXMoaXRlbSkuZm9yRWFjaChrZXkgPT4ge1xcbiAgICAgIGlmIChrZXlNYXAuaGFzT3duUHJvcGVydHkoaXRlbVtrZXldKSkge1xcbiAgICAgICAgaXRlbVtrZXldID0ga2V5TWFwW2l0ZW1ba2V5XV07XFxuICAgICAgfVxcbiAgICB9KTtcXG4gIH0pO1xcbn1cXG5cXG5sZXQgdWlfdGhlbWUgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJ1aV90aGVtZVxcXCIsIFRoZW1lW3RoZW1lXSk7XFxuLy9jbGVhckl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIpXFxubGV0IHVpX2ZpZyA9IHN0b3JhZ2UwLmdldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIGRlZik7XFxucmVwbGFjZUtleXNJbkFycmF5KHVpX2ZpZy55aS51aSk7XFxuLy9sb2codWlfZmlnKTtcXG5sZXQgdWlfY29uZmlnID0gZGVlcE1lcmdlKHt9LCB1aV9maWcsIHVpX3RoZW1lKTtcXG4vL2xvZyh1aV9jb25maWcpXFxuXFxuZnVuY3Rpb24gdWlfY2xlYXIoa2V5KSB7XFxuICAkLnVpQ29uZmlnLnNldChkZWZba2V5XSwgXFxcInlpXFxcIik7XFxufVxcbi8vY2xlYXJJdGVtKFxcXCJ1aV9jb25maWdcXFwiKVxcblxcbmZ1bmN0aW9uIGdldExpbmVTaG93KGVmKSB7XFxuICAvL2xvZyhlZilcXG4gIGxldCBvYmogPSB7XFxuICAgIHM6IGVmLFxcbiAgICBsaW5lOiBlZi5mcm9tLmluZGV4T2YoZWYuZnJvbVtlZi5saW5lXSksXFxuICAgIGxpbmVzOiBlZi5mcm9tLmxlbmd0aCxcXG4gICAgZm9ybTogZWYuZnJvbVtlZi5saW5lXSxcXG4gICAgcGxheXM6IGVmLnBsYXlzW2VmLmxpbmVdLFxcbiAgICBzcGFnZTogZWYuc3BhZ2VudW0sXFxuICAgIG1heDogZWYubWF4W2VmLmxpbmVdXFxuICB9XFxuICBmdW5jdGlvbiBUZW1wbGF0ZSh0ZW1wbGF0ZSwgZGF0YSkge1xcbiAgICAvLyDnlKjkuo7miafooYzlrZfnrKbkuLLkuK3nmoTooajovr7lvI9cXG4gICAgZnVuY3Rpb24gZXZhbHVhdGVFeHByZXNzaW9uKGV4cHIpIHtcXG4gICAgICB0cnkge1xcbiAgICAgICAgLy8g5L2/55SoIHdpdGgg6K+t5Y+l5bCGIGRhdGEg5a+56LGh5pS+5YWl5b2T5YmN5L2c55So5Z+fXFxuICAgICAgICAvLyDov5nmoLflj6/ku6XlnKjooajovr7lvI/kuK3nm7TmjqXkvb/nlKggZGF0YSDnmoTlsZ7mgKdcXG4gICAgICAgIHdpdGggKGRhdGEpIHtcXG4gICAgICAgICAgcmV0dXJuIGV2YWwoZXhwcik7XFxuICAgICAgICB9XFxuICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgcmV0dXJuIGV4cHI7IC8vIOWmguaenOihqOi+vuW8j+aXoOazleiuoeeul++8jOWImei/lOWbnuWOn+Wni+Wtl+espuS4slxcbiAgICAgIH1cXG4gICAgfVxcbiAgICAvLyDmraPliJnooajovr7lvI/ljLnphY0geyDooajovr7lvI8gfSDmoLzlvI/nmoTljaDkvY3nrKZcXG4gICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL3soLio/KX0vZywgKG1hdGNoLCBleHByKSA9PiB7XFxuICAgICAgLy9jb25zb2xlLmxvZyhleHByKVxcbiAgICAgIC8vIOaJp+ihjOihqOi+vuW8j1xcbiAgICAgIHJldHVybiBldmFsdWF0ZUV4cHJlc3Npb24oZXhwcik7XFxuICAgIH0pO1xcbiAgfVxcbiAgbGV0IGxzaG93ID0gVGVtcGxhdGUodWlfY29uZmlnLmVyLue6v+i3r+aYvuekuiwgb2JqKTtcXG4gIHJldHVybiBsc2hvdztcXG59XFxuXFxuLyoqIFxcbiAqIHVpICTmianlsZVcXG4qL1xcbmZ1bmN0aW9uIHVpX2V4cGFuZCgpIHtcXG4gICQuZXh0ZW5kKHtcXG4gICAgZGVlcE1lcmdlLFxcbiAgICB0aGVtZXM6IFRoZW1lLFxcbiAgICBzd2FwQXJyYXlFbGVtZW50cyhhcnJheSwgaW5kZXgxLCBpbmRleDIpIHtcXG4gICAgICBsZXQgcmVzdWx0ID0gYXJyYXkuc2xpY2UoKTtcXG4gICAgICBpbmRleDEgPSBhcnJheS5maW5kSW5kZXgoeCA9PiB4LmluZGV4ID09IGluZGV4MSk7XFxuICAgICAgaW5kZXgyID0gYXJyYXkuZmluZEluZGV4KHggPT4geC5pbmRleCA9PSBpbmRleDIpO1xcbiAgICAgIC8vIOS9v+eUqOS4tOaXtuWPmOmHj+S6pOaNouS4pOS4quWFg+e0oFxcbiAgICAgIGNvbnN0IHRlbXAgPSByZXN1bHRbaW5kZXgxXTtcXG4gICAgICByZXN1bHRbaW5kZXgxXSA9IHJlc3VsdFtpbmRleDJdO1xcbiAgICAgIHJlc3VsdFtpbmRleDJdID0gdGVtcDtcXG4gICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9LFxcbiAgICB1aUNvbmZpZzoge1xcbiAgICAgIHVjOiB1aV9maWcsXFxuICAgICAgZGVmOiBkZWYsXFxuICAgICAgZGVlcE9iamVjdFByb3BlcnR5KG9iaiwgcGF0aCwgdmFsdWUpIHtcXG4gICAgICAgIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcXG4gICAgICAgIHZhciBjdXJyZW50ID0gb2JqO1xcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcXG4gICAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcXG4gICAgICAgICAgaWYgKCFjdXJyZW50W3BhcnRdKSB7XFxuICAgICAgICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xcbiAgICAgICAgfVxcbiAgICAgICAgY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcXG4gICAgICB9LFxcbiAgICAgIGdldCgpIHtcXG4gICAgICAgIGxldCB1YyA9IHN0b3JhZ2UwLmdldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIHRoaXMudWMpO1xcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHVjKS5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgICB1YyA9IHRoaXMuZGVmO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHVjO1xcbiAgICAgIH0sXFxuICAgICAgc2V0KHZhbHVlLCBrZXkpIHtcXG4gICAgICAgIGxldCB1YyA9IHRoaXMuZ2V0KCk7XFxuICAgICAgICBpZiAoa2V5KSB7XFxuICAgICAgICAgIHRoaXMuZGVlcE9iamVjdFByb3BlcnR5KHVjLCBrZXksIHZhbHVlKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHVjID0gdmFsdWU7XFxuICAgICAgICB9XFxuICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1Yyk7XFxuICAgICAgfSxcXG4gICAgICBnZXRJbmRleHMoKSB7XFxuICAgICAgICBsZXQgdWMgPSB0aGlzLmdldCgpO1xcbiAgICAgICAgaWYgKHVjLnlpLnVpLmxlbmd0aCA+IDAgJiYgdWMueWkudWkuc29tZSh4ID0+IE9iamVjdC5rZXlzKHgpLmxlbmd0aCA+IDApKSB7XFxuICAgICAgICAgIHJldHVybiB1Yy55aS51aTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHRoaXMuc2V0KHRoaXMuaXRlbXMsIFxcXCJ5aS51aVxcXCIpO1xcbiAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtcztcXG4gICAgICAgIH1cXG4gICAgICB9LFxcbiAgICB9LFxcbiAgICB1aVRoZW1lOiB7XFxuICAgICAgc2VsZjogdWlfdGhlbWUsXFxuICAgICAgZGVmOiBUaGVtZVt0aGVtZV0sXFxuICAgICAgZGVlcE9iamVjdFByb3BlcnR5KG9iaiwgcGF0aCwgdmFsdWUpIHtcXG4gICAgICAgIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcXG4gICAgICAgIHZhciBjdXJyZW50ID0gb2JqO1xcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcXG4gICAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcXG4gICAgICAgICAgaWYgKCFjdXJyZW50W3BhcnRdKSB7XFxuICAgICAgICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xcbiAgICAgICAgfVxcbiAgICAgICAgY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcXG4gICAgICB9LFxcbiAgICAgIGdldChrZXksIGRlZikge1xcbiAgICAgICAgbGV0IHV0ID0gc3RvcmFnZTAuZ2V0SXRlbShcXFwidWlfdGhlbWVcXFwiLCB0aGlzLnNlbGYpO1xcbiAgICAgICAgaWYgKGtleSAhPSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgcmV0dXJuIHV0W2tleV0gfHwgKGRlZiB8fCBcXFwiXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh1dCkubGVuZ3RoID09IDApIHtcXG4gICAgICAgICAgdWMgPSB0aGlzLmRlZjtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB1dDtcXG4gICAgICB9LFxcbiAgICAgIHNldCh2YWx1ZSwga2V5KSB7XFxuICAgICAgICBsZXQgdXQgPSB0aGlzLmdldCgpO1xcbiAgICAgICAgaWYgKGtleSkge1xcbiAgICAgICAgICB0aGlzLmRlZXBPYmplY3RQcm9wZXJ0eSh1dCwga2V5LCB2YWx1ZSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICB1dCA9IHZhbHVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwidWlfdGhlbWVcXFwiLCB1dCk7XFxuICAgICAgfSxcXG4gICAgfVxcbiAgfSlcXG59XFxuXFxuJC5leHBvcnRzID0ge1xcbiAgVGhlbWUsXFxuICBkZWVwT21pdCxcXG4gIGRlZXBNZXJnZSxcXG4gIHVpX2NsZWFyLFxcbiAgdWlfZXhwYW5kLFxcbiAgdWlfY29uZmlnLFxcbiAgZ2V0TGluZVNob3csXFxuICBnZXRSYW5nZUNvbG9ycyxcXG4gIHRoZW1lTWFuYWdlLFxcbiAgcmVvcmRlckFycmF5QnlPcmRlcixcXG59XFxuXFxuaWYgKGdldFBhcmFtKFxcXCJtb2RlXFxcIiwgXFxcIlxcXCIpICE9IFxcXCJcXFwiKSB7XFxuICBhZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCJ1aV9uYXZpXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInVpbW9kZVxcXCIpO1xcbiAgfSkpO1xcblxcbiAgZnVuY3Rpb24gdG9Cb29sZWFuKHRleHQpIHtcXG4gICAgaWYgKHRleHQgPT0gdW5kZWZpbmVkIHx8IHRleHQgPT0gbnVsbCkge1xcbiAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfVxcbiAgICBpZiAodGV4dCA9PT0gXFxcInRydWVcXFwiKSB7XFxuICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0gZWxzZSBpZiAodGV4dCA9PT0gXFxcImZhbHNlXFxcIikge1xcbiAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG4gIH1cXG5cXG4gIGZ1bmN0aW9uIGJ1dHRvbkltZyhib29sKSB7XFxuICAgIGlmICh0eXBlb2YgYm9vbCA9PSBcXFwic3RyaW5nXFxcIikge1xcbiAgICAgIGlmIChib29sID09IFxcXCJ0cnVlXFxcIiB8fCBib29sID09IFxcXCJmYWxzZVxcXCIpIHtcXG4gICAgICAgIGJvb2wgPSB0b0Jvb2xlYW4oYm9vbCk7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChib29sID09IHRydWUpIHtcXG4gICAgICByZXR1cm4gJ2h0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbWVzc3kvNTUuc3ZnJztcXG4gICAgfVxcbiAgICBpZiAoYm9vbCA9PSBmYWxzZSB8fCBib29sID09IG51bGwgfHwgYm9vbCA9PSB1bmRlZmluZWQpIHtcXG4gICAgICByZXR1cm4gJ2h0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvZHJweS9vZmYuc3ZnJztcXG4gICAgfVxcbiAgfVxcblxcbiAgc2V0UGFnZVRpdGxlKFxcXCJVSeeuoeeQhlxcXCIpO1xcbiAgbGV0IGQgPSBbXTtcXG4gIGxldCB1aV9uYXYgPSBbXFxcIuS4gOe6p1xcXCIsIFxcXCLkuoznuqdcXFwiXTtcXG4gIGxldCB1aV9uYXZpID0gZ2V0TXlWYXIoXFxcInVpX25hdmlcXFwiLCBnZXRQYXJhbShcXFwibW9kZVxcXCIsIFxcXCLkuIDnuqdcXFwiKSk7XFxuICB1aV9uYXYuZm9yRWFjaCh4ID0+IHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAoeCA9PSB1aV9uYXZpID8geC5mb250Y29sb3IoXFxcIiMyMEIyQUFcXFwiKSA6IHgpLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaXQpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJ1aV9uYXZpXFxcIiwgaXQpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgeCksXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxuICAgIH0pXFxuICB9KVxcblxcbiAgdWlfZXhwYW5kKCk7XFxuXFxuICBkLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuS4u+mimDpcXFwiICsgdGhlbWUsXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgbGV0IGN0aGVtZSA9IGdldEl0ZW0oXFxcInRoZW1lXFxcIiwgXFxcIum7mOiupFxcXCIpO1xcbiAgICAgIGxldCBzID0gJC50aGVtZXM7XFxuICAgICAgbGV0IHRoZW1lcyA9IE9iamVjdC5rZXlzKHMpLm1hcCh4ID0+IHtcXG4gICAgICAgIHJldHVybiB4ID09IGN0aGVtZSA/ICfigJzigJzigJ3igJ0nICsgeC5mb250Y29sb3IoXFxcIiMyMEIyQUFcXFwiKSA6IHg7XFxuICAgICAgfSk7XFxuICAgICAgdGhlbWVzLnVuc2hpZnQoXFxcIue8lui+keS4u+mimFxcXCIpO1xcbiAgICAgIHJldHVybiAkKHRoZW1lcykuc2VsZWN0KCh0aGVtZXMsIHMsIG4pID0+IHtcXG4gICAgICAgIGxldCBuYW1lID0gdGhlbWVzW01ZX0lOREVYXS5yZXBsYWNlKC88W14+XSo+L2csICcnKS5yZXBsYWNlKC9b4oCc4oCdJ10vZywgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKG5hbWUgPT0gbikge1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgaWYgKG5hbWUgPT0gXFxcIue8lui+keS4u+mimFxcXCIpIHtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvVGhlbWVFZGl0XFxcIlxcbiAgICAgICAgfVxcbiAgICAgICAgc2V0SXRlbShcXFwidGhlbWVcXFwiLCBuYW1lKTtcXG4gICAgICAgICQudWlUaGVtZS5zZXQoc1tuYW1lXSk7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgIH0sIHRoZW1lcywgcywgY3RoZW1lKVxcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgIHBhZ2VUaXRsZTogXFxcIuS4u+mimOe8lui+kVxcXCIsXFxuICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgdGl0bGU6IFxcXCLph43nva5cXFwiLFxcbiAgICAgICAganM6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICByZXR1cm4gJChcXFwi5riF6Zmk5omA5pyJ6K6+572uXFxcIikuY29uZmlybSgoKSA9PiB7XFxuICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJ0aGVtZVxcXCIpO1xcbiAgICAgICAgICAgIGNsZWFySXRlbShcXFwidWlfY29uZmlnXFxcIik7XFxuICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJ1aV90aGVtZVxcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liJ3lp4vljJblrozmiJBcXFwiO1xcbiAgICAgICAgICB9KVxcbiAgICAgICAgfSksXFxuICAgICAgfV1cXG4gICAgfVxcbiAgfSlcXG4gIGQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiXFxuICB9KVxcblxcblxcbiAgaWYgKHVpX25hdmkgPT0gXFxcIuS4gOe6p1xcXCIpIHtcXG4gICAgYWRkTGlzdGVuZXIoJ29uUmVmcmVzaCcsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgIGNsZWFyTXlWYXIoXFxcInVpX2N1cnJlbnRcXFwiKTtcXG4gICAgfSkpXFxuXFxuICAgIHZhciB1aW9iaiA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJ1aW9ialxcXCIsIFtdKTtcXG4gICAgdmFyIHN1aW9iaiA9IHVpb2JqLnNsaWNlKCk7XFxuICAgIGxldCBpdGVtcyA9IHVpb2JqLm1hcChpdGVtID0+IHtcXG4gICAgICByZXR1cm4ge1xcbiAgICAgICAga2V5OiBpdGVtLmtleSxcXG4gICAgICAgIGluZGV4OiBpdGVtLmluZGV4XFxuICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGV0IHVpbW9kZSA9IGdldE15VmFyKFxcXCJ1aW1vZGVcXFwiLCBcXFwiMFxcXCIpID09IFxcXCIwXFxcIiA/IGZhbHNlIDogdHJ1ZTtcXG5cXG4gICAgJC51aUNvbmZpZy5pdGVtcyA9IGl0ZW1zO1xcblxcbiAgICBsZXQgaW5kZXhzID0gJC51aUNvbmZpZy5nZXRJbmRleHMoKTtcXG5cXG4gICAgdWlvYmogPSB1aW9iai5tYXAoaXRlbSA9PiB7XFxuICAgICAgbGV0IGsgPSBpdGVtLmtleTtcXG4gICAgICBpZiAoaXRlbS5rZXkgPT0gXFxcIuaQnOe0ouaooeW8j1xcXCIpIHtcXG4gICAgICAgIGsgPSBcXFwi5pCc57SiXFxcIjtcXG4gICAgICB9XFxuICAgICAgaWYgKGl0ZW0ua2V5ID09IFxcXCLmupDlkI1cXFwiKSB7XFxuICAgICAgICBrID0gXFxcIuW9seinhlxcXCI7XFxuICAgICAgfVxcbiAgICAgIGl0ZW0uaW1nID0gJC51aVRoZW1lLmdldCgpLnlpLmljb25zW2tdO1xcbiAgICAgIGlmICghLyhpY29uXzFfc2VhcmNofGF2YXRhcnxpbnB1dCkvLnRlc3QoaXRlbS5jb2xfdHlwZSkpIHtcXG4gICAgICAgIGl0ZW0uY29sX3R5cGUgPSB1aV9jb25maWcueWkuY29sO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gaXRlbTtcXG4gICAgfSlcXG5cXG4gICAgdWlvYmogPSByZW9yZGVyQXJyYXlCeU9yZGVyKHVpb2JqLCBpbmRleHMpO1xcbiAgICAvL2xvZyh1aW9iailcXG5cXG4gICAgaWYgKHVpbW9kZSkge1xcbiAgICAgIHVpb2JqID0gdWlvYmoubWFwKChpdGVtLCBpKSA9PiB7XFxuICAgICAgICBsZXQgbG9uZ2NsaWNrcyA9IFtdO1xcbiAgICAgICAgaXRlbS50aXRsZSA9IGl0ZW0ua2V5O1xcbiAgICAgICAgaWYgKGl0ZW0uY29sX3R5cGUgPT0gXFxcImlucHV0XFxcIikge1xcbiAgICAgICAgICBpdGVtLmNvbF90eXBlID0gXFxcImljb25fMV9zZWFyY2hcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaXRlbS51cmwgPSAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpKSA9PiB7XFxuICAgICAgICAgIGxldCBpbmRleHMgPSAkLnVpQ29uZmlnLmdldEluZGV4cygpO1xcblxcbiAgICAgICAgICBsZXQgaXRlbSA9IGZpbmRJdGVtKE1ZX1JVTEUudGl0bGUgKyBcXFwiX3VpXFxcIiArIGkpO1xcbiAgICAgICAgICBpZiAoaXRlbS50aXRsZS5pbmNsdWRlcyhcXFwiZm9udFxcXCIpIHx8IGl0ZW0udGl0bGUuaW5jbHVkZXMoXFxcIuKeoe+4j1xcXCIpKSB7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbShpdGVtLmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZS5yZXBsYWNlKC/igJh84oCZfOKAnHzigJ18PFtePl0rPi9nLCBcXFwiXFxcIikucmVwbGFjZShcXFwi4p6h77iPXFxcIiwgXFxcIlxcXCIpXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwidWlfY3VycmVudFxcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgbGV0IGN1cnJlbnQgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwidWlfY3VycmVudFxcXCIsIHt9KTtcXG5cXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGN1cnJlbnQpLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKGl0ZW0uZXh0cmEuaWQsIHtcXG4gICAgICAgICAgICAgIHRpdGxlOiBjdXJyZW50LnRpdGxlLFxcbiAgICAgICAgICAgICAgcGljOiBjdXJyZW50LnBpYyB8fCBcXFwiXFxcIixcXG4gICAgICAgICAgICAgIGRlc2M6IGN1cnJlbnQuZGVzYyB8fCBcXFwiXFxcIixcXG4gICAgICAgICAgICAgIGNvbF90eXBlOiBjdXJyZW50LnR5cGUsXFxuICAgICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih7fSwgaXRlbS5leHRyYSwge1xcbiAgICAgICAgICAgICAgICBrZXk6IGN1cnJlbnQuZXh0cmEua2V5LFxcbiAgICAgICAgICAgICAgICBpbmRleDogY3VycmVudC5leHRyYS5pbmRleFxcbiAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKGN1cnJlbnQuZXh0cmEuaWQsIHtcXG4gICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgICAgcGljOiBpdGVtLnBpYyB8fCBcXFwiXFxcIixcXG4gICAgICAgICAgICAgIGRlc2M6IGl0ZW0uZGVzYyB8fCBcXFwiXFxcIixcXG4gICAgICAgICAgICAgIGNvbF90eXBlOiBpdGVtLnR5cGUsXFxuICAgICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudC5leHRyYSwge1xcbiAgICAgICAgICAgICAgICBrZXk6IGl0ZW0uZXh0cmEua2V5LFxcbiAgICAgICAgICAgICAgICBpbmRleDogaXRlbS5leHRyYS5pbmRleFxcbiAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICBsZXQgbmFyciA9ICQuc3dhcEFycmF5RWxlbWVudHMoaW5kZXhzLCBjdXJyZW50LmV4dHJhLmluZGV4LCBpdGVtLmV4dHJhLmluZGV4KTtcXG5cXG4gICAgICAgICAgICAkLnVpQ29uZmlnLnNldChuYXJyLCBcXFwieWkudWlcXFwiKTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCJ1aV9jdXJyZW50XFxcIik7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IGggPSAn4oCc4oCc4oCd4oCdJztcXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBpdGVtLnRpdGxlO1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLpgInmi6nnp7vliqjnmoTnm67moIdcXFwiKTtcXG4gICAgICAgICAgICBpZiAoL3RleHRfaWNvbnxhdmF0YXJ8aWNvbl9zbWFsbF8zLy50ZXN0KGl0ZW0udHlwZSkpIHtcXG4gICAgICAgICAgICAgIGggPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUuZm9udGNvbG9yKFxcXCIjZmZmXFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIGlmICgvaWNvbl8xX3NlYXJjaC8udGVzdChpdGVtLnR5cGUpKSB7XFxuICAgICAgICAgICAgICBoID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgICB0aXRsZSA9IFxcXCLinqHvuI9cXFwiICsgdGl0bGU7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUuZm9udGNvbG9yKFxcXCIjZmZmXFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaXRlbS5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgdGl0bGU6IGggKyB0aXRsZSxcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJ1aV9jdXJyZW50XFxcIiwgaXRlbSk7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGkpXFxuICAgICAgICBpdGVtW1xcXCJleHRyYVxcXCJdID0ge1xcbiAgICAgICAgICBrZXk6IGl0ZW0ua2V5LFxcbiAgICAgICAgICBjbHM6IE1ZX1JVTEUudGl0bGUgKyBcXFwiX3VpXFxcIixcXG4gICAgICAgICAgaWQ6IE1ZX1JVTEUudGl0bGUgKyBcXFwiX3VpXFxcIiArIGksXFxuICAgICAgICAgIGluZGV4OiBpdGVtLmluZGV4LFxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGl0ZW0ua2V5ICE9IFxcXCLorr7nva5cXFwiKSB7XFxuICAgICAgICAgIGxvbmdjbGlja3MucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLliKDpmaRcXFwiLFxcbiAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChrZXkpID0+IHtcXG4gICAgICAgICAgICAgIGxldCBpdGVtcyA9ICQudWlDb25maWcuZ2V0SW5kZXhzKCk7XFxuICAgICAgICAgICAgICBsZXQgaSA9IGl0ZW1zLmZpbmRJbmRleCh4ID0+IHgua2V5ID09IGtleSk7XFxuICAgICAgICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICBpdGVtc1tpXVtcXFwiaW5kZXhcXFwiXSA9IC0xO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgJC51aUNvbmZpZy5zZXQoaXRlbXMsIFxcXCJ5aS51aVxcXCIpO1xcbiAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICB9LCBpdGVtLmtleSlcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghL2ljb25fMV9zZWFyY2h8YXZhdGFyLy50ZXN0KGl0ZW0uY29sX3R5cGUpKSB7XFxuICAgICAgICAgIGxvbmdjbGlja3MucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmm7TmjaLlm77moIdcXFwiLFxcbiAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICByZXR1cm4gJChpdGVtLmltZykuaW5wdXQoKGl0ZW0pID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGl0ZW0ua2V5O1xcbiAgICAgICAgICAgICAgICBsZXQgaXRlbXMgPSAkLnVpQ29uZmlnLmdldEluZGV4cygpO1xcbiAgICAgICAgICAgICAgICBsZXQgaSA9IGl0ZW1zLmZpbmRJbmRleCh4ID0+IHgua2V5ID09IGtleSk7XFxuICAgICAgICAgICAgICAgIGxldCBrID0ga2V5O1xcbiAgICAgICAgICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gXFxcIuaQnOe0ouaooeW8j1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIGsgPSBcXFwi5pCc57SiXFxcIjtcXG4gICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgJC51aVRoZW1lLnNldChpbnB1dCwgXFxcInlpLmljb25zLlxcXCIgKyBrKTtcXG4gICAgICAgICAgICAgICAgICAvL2l0ZW1zW2ldW1xcXCJpbWdcXFwiXSA9IGlucHV0O1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICQudWlDb25maWcuc2V0KGl0ZW1zLCBcXFwieWkudWlcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IGlkID0gZmluZEl0ZW1zQnlDbHMoTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiKS5maWx0ZXIoeCA9PiB4LmV4dHJhLmtleSA9PSBrZXkpWzBdLmV4dHJhLmlkO1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGlkLCB7IHBpYzogaW5wdXQgfSlcXG4gICAgICAgICAgICAgIH0sIGl0ZW0pXFxuICAgICAgICAgICAgfSwgaXRlbSlcXG4gICAgICAgICAgfSlcXG4gICAgICAgICAgaWYgKGl0ZW0ua2V5ICE9IFxcXCLmjaLmupBcXFwiICYmIGl0ZW0ua2V5ICE9IFxcXCLmkJzntKLmqKHlvI9cXFwiKSB7XFxuICAgICAgICAgICAgbG9uZ2NsaWNrcy5wdXNoKHtcXG4gICAgICAgICAgICAgIHRpdGxlOiBcXFwi5L+u5pS55ZCN56ewXFxcIixcXG4gICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIpLmlucHV0KChrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgICBsZXQgaXRlbXMgPSAkLnVpQ29uZmlnLmdldEluZGV4cygpO1xcbiAgICAgICAgICAgICAgICAgIGxldCBpID0gaXRlbXMuZmluZEluZGV4KHggPT4geC5rZXkgPT0ga2V5KTtcXG4gICAgICAgICAgICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV1bXFxcInRpdGxlXFxcIl0gPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgJC51aUNvbmZpZy5zZXQoaXRlbXMsIFxcXCJ5aS51aVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgIGxldCBpZCA9IGZpbmRJdGVtc0J5Q2xzKE1ZX1JVTEUudGl0bGUgKyBcXFwiX3VpXFxcIikuZmlsdGVyKHggPT4geC5leHRyYS5rZXkgPT0ga2V5KVswXS5leHRyYS5pZDtcXG4gICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGlkLCB7IHRpdGxlOiBpbnB1dCB9KVxcbiAgICAgICAgICAgICAgICB9LCBrZXkpXFxuICAgICAgICAgICAgICB9LCBpdGVtLmtleSlcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBpdGVtLmV4dHJhLkxvbmdDbGljayA9IGxvbmdjbGlja3M7XFxuICAgICAgICByZXR1cm4gaXRlbTtcXG4gICAgICB9KVxcbiAgICB9IGVsc2Uge1xcbiAgICAgIHVpb2JqID0gdWlvYmoubWFwKChpdGVtLCBpKSA9PiB7XFxuICAgICAgICBpdGVtLmV4dHJhID0ge1xcbiAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiICsgaSxcXG4gICAgICAgICAgY2xzOiBNWV9SVUxFLnRpdGxlICsgXFxcIl91aVxcXCJcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBpdGVtO1xcbiAgICAgIH0pXFxuICAgIH1cXG4gICAgZCA9IGQuY29uY2F0KHVpb2JqKTtcXG5cXG4gICAgaWYgKGluZGV4cy5zb21lKHggPT4geC5pbmRleCA9PSAtMSkgJiYgdWltb2RlKSB7XFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5bey56e76ZmkXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgfVxcbiAgICAgIH0pXFxuICAgICAgaW5kZXhzLmZpbHRlcih4ID0+IHguaW5kZXggPT0gLTEpLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKHN1aW9iai5tYXAob2JqID0+IFtvYmoua2V5LCBvYmpdKSk7XFxuICAgICAgICBsZXQgb2JqID0gbWFwLmdldChpdGVtLmtleSk7XFxuICAgICAgICBvYmoudXJsID0gJChcXFwiXFxcIikubGF6eVJ1bGUoKGtleSwgaW5kZXgpID0+IHtcXG4gICAgICAgICAgbGV0IGl0ZW1zID0gJC51aUNvbmZpZy5nZXRJbmRleHMoKTtcXG4gICAgICAgICAgbGV0IGkgPSBpdGVtcy5maW5kSW5kZXgoeCA9PiB4LmtleSA9PSBrZXkpO1xcbiAgICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICAgIGl0ZW1zW2ldW1xcXCJpbmRleFxcXCJdID0gaW5kZXg7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgJC51aUNvbmZpZy5zZXQoaXRlbXMsIFxcXCJ5aS51aVxcXCIpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaXRlbS5rZXksIG9iai5pbmRleClcXG4gICAgICAgIG9iai50aXRsZSA9IG9iai5rZXk7XFxuICAgICAgICBpZiAob2JqLmV4dHJhID09IHVuZGVmaW5lZCkge1xcbiAgICAgICAgICBvYmouZXh0cmEgPSB7fTtcXG4gICAgICAgIH1cXG4gICAgICAgIG9iai5leHRyYS5pZCA9IE1ZX1JVTEUudGl0bGUgKyBcXFwiX3VpXFxcIiArIG9iai5rZXk7XFxuICAgICAgICBvYmouZXh0cmEuY2xzID0gTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiO1xcblxcbiAgICAgICAgaWYgKG9iai5jb2xfdHlwZSA9PSBcXFwiaW5wdXRcXFwiKSB7XFxuICAgICAgICAgIG9iai5jb2xfdHlwZSA9IFxcXCJpY29uXzFfc2VhcmNoXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGQucHVzaChvYmopXFxuICAgICAgfSlcXG4gICAgfVxcblxcbiAgICBkLnB1c2goe1xcbiAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG4gICAgfSwge1xcbiAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArICh1aW1vZGUgPyBcXFwi5L+u5pS5XFxcIi5mb250Y29sb3IoXFxcIiMyMEIyQUFcXFwiKSA6IFxcXCLkv67mlLlcXFwiKSxcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgbGV0IHVpbW9kZSA9IGdldE15VmFyKFxcXCJ1aW1vZGVcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgcHV0TXlWYXIoXFxcInVpbW9kZVxcXCIsIHVpbW9kZSA9PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLlcXFwiICsgKHVpbW9kZSA9PSBcXFwiMFxcXCIgPyBcXFwi5byA5ZCvOueCueWHu+aMiemSruS6pOaNouS9jee9rizplb/mjInmjInpkq7kv67mlLnmiJbogIXliKDpmaRcXFwiIDogXFxcIuWFs+mXrVxcXCIpO1xcbiAgICAgIH0pLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG4gICAgfSwge1xcbiAgICAgIHRpdGxlOiBcXFwi6L+Y5Y6fXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChkZWYpID0+IHtcXG4gICAgICAgIHJldHVybiAkKFxcXCLmmK/lkKbmgaLlpI3orr7nva5cXFwiKS5jb25maXJtKChkZWYpID0+IHtcXG4gICAgICAgICAgJC51aUNvbmZpZy5zZXQoZGVmLnlpLCBcXFwieWlcXFwiKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6L+Y5Y6f5a6M5oiQXFxcIjtcXG4gICAgICAgIH0sIGRlZilcXG4gICAgICB9LCBkZWYpLFxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6IFxcXCLnoa7orqRcXFwiLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgYmFjayh0cnVlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICB9KSxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgTG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICB0aXRsZTogXFxcIuWkjeWItlxcXCIsXFxuICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICB2YXIgdWMgPSAkLnVpQ29uZmlnLmdldCgpO1xcbiAgICAgICAgICAgIGNvcHkoSlNPTi5zdHJpbmdpZnkodWMueWkpKTtcXG4gICAgICAgICAgfSksXFxuICAgICAgICB9LCB7XFxuICAgICAgICAgIHRpdGxlOiBcXFwi5a+85YWlXFxcIixcXG4gICAgICAgICAganM6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHZhciB1YyA9ICQudWlDb25maWcuZ2V0KCk7XFxuICAgICAgICAgICAgcmV0dXJuICQoXFxcInt7Y2xpcGJvYXJkfX1cXFwiKS5pbnB1dCgodWMpID0+IHtcXG4gICAgICAgICAgICAgIHZhciB5aSA9IHt9O1xcbiAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgeWkgPSBKU09OLnBhcnNlKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgaWYgKHlpLmhhc093blByb3BlcnR5KFxcXCJ1aVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgdWMueWkgPSB5aTtcXG4gICAgICAgICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1Yyk7XFxuICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5qC85byP6ZSZ6K+vXFxcIilcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LCB1YylcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH1dXFxuICAgICAgfVxcbiAgICB9KVxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBcXFwi5aS06YOo57uE5Lu25qC35byPOlxcXCIgKyB1aV9jb25maWcueWkuY29sLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHVpX2NvbmZpZykgPT4ge1xcbiAgICAgICAgdWlfY29uZmlnID0gc3RvcmFnZTAuZ2V0SXRlbShcXFwidWlfY29uZmlnXFxcIiwgdWlfY29uZmlnKTtcXG4gICAgICAgIGxldCBhbGxfY29scyA9IFsnJ10uY29uY2F0KGdldENvbFR5cGVzKCkpO1xcbiAgICAgICAgYWxsX2NvbHMgPSBhbGxfY29scy5maWx0ZXIoeCA9PlxcbiAgICAgICAgICAvKGljb24pLy50ZXN0KHgpICYmIHggIT0gJ3RleHRfaWNvbicgJiZcXG4gICAgICAgICAgeCAhPSBcXFwiaWNvbl8xX3NlYXJjaFxcXCIpO1xcbiAgICAgICAgLy9sb2coYWxsX2NvbHMpXFxuICAgICAgICBsZXQgY29sID0gdWlfY29uZmlnLnlpLmNvbDtcXG4gICAgICAgIGxldCDmjInpkq7moLflvI8gPSBhbGxfY29scy5tYXAoKGl0KSA9PiB7XFxuICAgICAgICAgIHJldHVybiBpdCA9PT0gY29sID8gJ+Keoe+4jycgKyBpdCA6IGl0O1xcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgdGlwcyA9ICfor7fpgInmi6nlpLTpg6jmjInpkq7moLflvI8nO1xcbiAgICAgICAgcmV0dXJuICQo5oyJ6ZKu5qC35byPLCAyLCB0aXBzKS5zZWxlY3QoKHVpX2NvbmZpZykgPT4ge1xcbiAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoXFxcIuKeoe+4j1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgbGV0IG9ianMgPSAoZmluZEl0ZW1zQnlDbHMoTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiKSB8fCBbXSkuZmlsdGVyKHggPT4gIS8oaWNvbl8xX3NlYXJjaHxhdmF0YXJ8aW5wdXQpLy50ZXN0KHgudHlwZSkpO1xcbiAgICAgICAgICBvYmpzLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh4LmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgICBjb2xfdHlwZTogaW5wdXQsXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgICAkLnVpQ29uZmlnLnNldChpbnB1dCwgXFxcInlpLmNvbFxcXCIpXFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oTVlfUlVMRS50aXRsZSArIFxcXCJfeWljb2xcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLlpLTpg6jnu4Tku7bmoLflvI86XFxcIiArIHVpX2NvbmZpZy55aS5jb2xcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH0sIHVpX2NvbmZpZylcXG4gICAgICB9LCB1aV9jb25maWcpLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArIFxcXCJfeWljb2xcXFwiXFxuICAgICAgfVxcbiAgICB9KVxcblxcbiAgICBsZXQgZG9iaiA9IHt9O1xcbiAgICAkLnVpQ29uZmlnLmdldCgpLnlpLnVpLmZpbHRlcih4ID0+IHguaW5kZXggIT0gLTEpLm1hcChpdCA9PiB7XFxuICAgICAgZG9ialtpdC5rZXldID0gdHJ1ZVxcbiAgICB9KVxcblxcbiAgICBPYmplY3QuZW50cmllcyhkZWVwT21pdCh1aV90aGVtZS55aS5pY29ucywgZG9iaikpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xcbiAgICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZToga2V5LFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiLFxcbiAgICAgICAgaW1nOiB2YWx1ZSxcXG4gICAgICAgIHVybDogJCh2YWx1ZSkuaW5wdXQoKGspID0+IHtcXG4gICAgICAgICAgJC51aVRoZW1lLnNldChpbnB1dCwgXFxcInlpLmljb25zLlxcXCIgKyBrKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGtleSksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IHZhbHVlXFxuICAgICAgICB9XFxuICAgICAgfSlcXG4gICAgfSlcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIuWIhuexu+minOiJslxcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgdXJsOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGxldCB7IGlzVmFsaWRDb2xvciB9ID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIik7XFxuICAgICAgICBpZiAoaXNWYWxpZENvbG9yKGlucHV0KSkge1xcbiAgICAgICAgICAkLnVpVGhlbWUuc2V0KGlucHV0LCBcXFwieWku5YiG57G76aKc6ImyXFxcIik7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICB0b2FzdChcXFwi6K+36L6T5YWl5q2j56Gu55qE6aKc6Imy5YC8XFxcIik7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgIH0pLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHVpX2NvbmZpZy55aS7liIbnsbvpopzoibJcXG4gICAgICB9XFxuICAgIH0pXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IFxcXCLmjaLmupDpopzoibJcXFwiLFxcbiAgICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICAgIHVybDogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgeyBpc1ZhbGlkQ29sb3IgfSA9ICQucmVxdWlyZShcXFwibWV0aG9kc1xcXCIpO1xcbiAgICAgICAgaWYgKGlzVmFsaWRDb2xvcihpbnB1dCkpIHtcXG4gICAgICAgICAgJC51aVRoZW1lLnNldChpbnB1dCwgXFxcInlpLuaNoua6kOminOiJslxcXCIpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgdG9hc3QoXFxcIuivt+i+k+WFpeato+ehrueahOminOiJsuWAvFxcXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICB9KSxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB1aV9jb25maWcueWku5o2i5rqQ6aKc6ImyXFxuICAgICAgfVxcbiAgICB9KVxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBcXFwi5YiG57G76aKc6ImyXFxcIixcXG4gICAgICBpbWc6IHVpX2NvbmZpZy55aS7liIbnsbvpopzoibIgPT0gXFxcInJhbmRvbVxcXCIgPyBnZXRSYW5nZUNvbG9ycygpIDogdWlfY29uZmlnLnlpLuWIhuexu+minOiJsixcXG4gICAgICB1cmw6IFxcXCJ0b2FzdDovL+WIhuexu+minOiJslxcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzNfZmlsbFxcXCIsXFxuICAgIH0pXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IFxcXCLmjaLmupDpopzoibJcXFwiLFxcbiAgICAgIGltZzogdWlfY29uZmlnLnlpLuaNoua6kOminOiJsiA9PSBcXFwicmFuZG9tXFxcIiA/IGdldFJhbmdlQ29sb3JzKCkgOiB1aV9jb25maWcueWku5o2i5rqQ6aKc6ImyLFxcbiAgICAgIHVybDogXFxcInRvYXN0Oi8v5o2i5rqQ6aKc6ImyXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcImljb25fM19maWxsXFxcIixcXG4gICAgfSlcXG4gIH1cXG5cXG4gIGlmICh1aV9uYXZpID09IFxcXCLkuoznuqdcXFwiKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IFxcXCLmr4/pobXmlbDph49cXFwiLFxcbiAgICAgIGRlc2M6IFxcXCIw5YiZ6KGo56S65LiN5YiG6aG1XFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgaWYgKFN0cmluZyhpbnB1dCkubGVuZ3RoID4gMykge1xcbiAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWlM+S9jeaVsOWtl+S7peWGhVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoU3RyaW5nKGlucHV0KS5sZW5ndGggPCAyICYmIGlucHV0ICE9IDApIHtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpTLkvY3mlbDlrZfku6XkuIpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgJC51aUNvbmZpZy5zZXQoaW5wdXQsIFxcXCJlci7liIbpobVcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIChpbnB1dCA+IDAgPyBcXFwi5q+P6aG15pWw6YeP6K6+572u5Li6OlxcXCIgKyBpbnB1dCA6IFxcXCLkuI3liIbpobVcXFwiKTtcXG4gICAgICB9KSxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICBpZiAoU3RyaW5nKGlucHV0KS5sZW5ndGggPiAzKSB7XFxuICAgICAgICAgICAgdG9hc3QoXFxcIuivt+i+k+WFpTPkvY3mlbDlrZfku6XlhoVcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKFN0cmluZyhpbnB1dCkubGVuZ3RoIDwgMiAmJiBpbnB1dCAhPSAwKSB7XFxuICAgICAgICAgICAgdG9hc3QoXFxcIuivt+i+k+WFpTLkvY3mlbDlrZfku6XkuIpcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgIH1cXG4gICAgICAgICAgJC51aUNvbmZpZy5zZXQoaW5wdXQsIFxcXCJlci7liIbpobVcXFwiKTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB1aV9jb25maWcuZXIu5YiG6aG1LFxcbiAgICAgICAgdHlwZTogXFxcIm51bWJlclxcXCIsXFxuICAgICAgfVxcbiAgICB9KVxcblxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBcXFwi5Y6G5Y+y6K6w5b2VXFxcIixcXG4gICAgICBkZXNjOiBcXFwi6buY6K6kMjAwXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgaWYgKFN0cmluZyhpbnB1dCkubGVuZ3RoID4gMykge1xcbiAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWlM+S9jeaVsOWtl+S7peWGhVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoU3RyaW5nKGlucHV0KS5sZW5ndGggPCAyKSB7XFxuICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaUy5L2N5pWw5a2X5Lul5LiKXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgICQudWlDb25maWcuc2V0KGlucHV0LCBcXFwiZXIu5Y6G5Y+y6K6w5b2VXFxcIilcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Y6G5Y+y6K6w5b2V6K6+572u5Li6OlxcXCIgKyBpbnB1dDtcXG4gICAgICB9KSxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB1aV9jb25maWcuZXIu5Y6G5Y+y6K6w5b2VLFxcbiAgICAgICAgdHlwZTogXFxcIm51bWJlclxcXCIsXFxuICAgICAgfVxcbiAgICB9KVxcblxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBcXFwi57q/6Lev5qC35byPOiBcXFwiICsgdWlfY29uZmlnLmVyLue6v+i3r+agt+W8jyxcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGxldCBjb2wgPSAkLnVpQ29uZmlnLmdldCgpLmVyLue6v+i3r+agt+W8jztcXG4gICAgICAgIGxldCBjb2xzID0gW1xcXCJcXFwiXS5jb25jYXQoZ2V0Q29sVHlwZXMoKSk7XFxuICAgICAgICBjb2xzID0gY29scy5maWx0ZXIoeCA9PiAvdGV4dF98YnV0dG9ufF9maWxsfGljb24vZy50ZXN0KHgpLyomIXguaW5jbHVkZXMoXFxcImljb25cXFwiKSovKTtcXG4gICAgICAgIGNvbHMudW5zaGlmdChcXFwic2VsZWN0XFxcIik7XFxuICAgICAgICBjb2xzID0gY29scy5tYXAoeCA9PiB4ID09IGNvbCA/IFxcXCLinqHvuI9cXFwiICsgeCA6IHgpO1xcbiAgICAgICAgcmV0dXJuICQoY29scywgMikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFxcXCLinqHvuI9cXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICQudWlDb25maWcuc2V0KGlucHV0LCBcXFwiZXIu57q/6Lev5qC35byPXFxcIik7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIH0pXFxuICAgICAgfSksXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdWlfY29uZmlnLmVyLue6v+i3r+agt+W8jyxcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgIH1cXG4gICAgfSlcXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIntsaW5lc30657q/6LevXFxcXHRcXFxcdHtsaW5lfTrlvZPliY3luo/lj7dcXFxcdFxcXFx0e2Zvcm19OuW9k+WJjee6v+i3r+WQjeensFxcXFx0XFxcXHR7cGxheXN9OuaAu+aVsHtzcGFnZX065b2T5YmN57+76aG1XFxcXHRcXFxcdHttYXh9OuacgOWkp+mhteaVsFxcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICB0ZXh0U2l6ZTogXFxcIjE1XFxcIixcXG4gICAgICB9XFxuICAgIH0pXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IFxcXCLnur/ot6/mmL7npLpcXFwiLFxcbiAgICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICAgIHVybDogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAkLnVpVGhlbWUuc2V0KGlucHV0LCBcXFwiZXIu57q/6Lev5pi+56S6XFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGlucHV0O1xcbiAgICAgIH0pLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHVpX2NvbmZpZy5lci7nur/ot6/mmL7npLosXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OiAtMVxcbiAgICAgIH1cXG4gICAgfSlcXG5cXG4gICAgLy8kLmxvZyhnZXRMaW5lU2hvdylcXG5cXG4gICAgbGV0IHRlc3RvYmogPSB7IFxcXCJmcm9tXFxcIjogW1xcXCLliqjmvKvkuJPnur/ikaZcXFwiLCBcXFwi5Yqo5ryr5LiT57q/4pGkXFxcIiwgXFxcIuWKqOa8q+S4k+e6v+KRo1xcXCIsIFxcXCLliqjmvKvkuJPnur/ikaJcXFwiLCBcXFwi5Yqo5ryr5LiT57q/4pGhXFxcIiwgXFxcIuWKqOa8q+S4k+e6v+KRoFxcXCJdLCBcXFwibGluZVxcXCI6IFxcXCIxXFxcIiwgXFxcIm1heFxcXCI6IFs1LCA1LCAxLCA0LCA1LCA1XSwgXFxcInBhZ2VudW1cXFwiOiAxLCBcXFwicGxheXBcXFwiOiBbXFxcIjEtNDBcXFwiLCBcXFwiNDEtODBcXFwiLCBcXFwiODEtMTIwXFxcIiwgXFxcIjEyMS0xNjBcXFwiLCBcXFwiMTYxLTE2OVxcXCJdLCBcXFwicGxheXNcXFwiOiBbMTY5LCAxNjksIDE4LCAxNTAsIDE2OSwgMTY5XSwgXFxcInNwYWdlbnVtXFxcIjogMiB9XFxuXFxuXFxuICAgIGxldCBsc2hvdyA9IGdldExpbmVTaG93KHRlc3RvYmopO1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBsc2hvdyxcXG4gICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgICAgaW1nOiBnZXRNeVZhcihcXFwibHNob3dcXFwiLCBcXFwiMFxcXCIpID8gdWlfY29uZmlnLmVyLmljb25zLuato+W6jyA6IHVpX2NvbmZpZy5lci5pY29ucy7lgJLluo8sXFxuICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpY29uKSA9PiB7XFxuICAgICAgICBsZXQgbCA9IGdldE15VmFyKFxcXCJsc2hvd1xcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJsc2hvd1xcXCIsIHtcXG4gICAgICAgICAgaW1nOiBsID09IFxcXCIwXFxcIiA/IGljb24u5YCS5bqPIDogaWNvbi7mraPluo8sXFxuICAgICAgICB9KVxcbiAgICAgICAgcHV0TXlWYXIoXFxcImxzaG93XFxcIiwgbCA9PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIC8vcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyAobCA9PSBcXFwiMFxcXCIgPyBcXFwi5YCS5bqPXFxcIiA6IFxcXCLmraPluo9cXFwiKTtcXG4gICAgICB9LCB1aV9jb25maWcuZXIuaWNvbnMpLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogXFxcImxzaG93XFxcIlxcbiAgICAgIH1cXG4gICAgfSlcXG5cXG4gICAgT2JqZWN0LmVudHJpZXModWlfdGhlbWUuZXIuaWNvbnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xcbiAgICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZToga2V5LFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiLFxcbiAgICAgICAgaW1nOiB2YWx1ZSxcXG4gICAgICAgIHVybDogJCh2YWx1ZSkuaW5wdXQoKGspID0+IHtcXG4gICAgICAgICAgJC51aVRoZW1lLnNldChpbnB1dCwgXFxcImVyLmljb25zLlxcXCIgKyBrKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGtleSksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IHZhbHVlXFxuICAgICAgICB9XFxuICAgICAgfSlcXG4gICAgfSlcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIue6v+i3r+minOiJslxcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgdXJsOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGxldCB7IGlzVmFsaWRDb2xvciB9ID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIik7XFxuICAgICAgICBpZiAoaXNWYWxpZENvbG9yKGlucHV0KSkge1xcbiAgICAgICAgICAkLnVpVGhlbWUuc2V0KGlucHV0LCBcXFwiZXIu57q/6Lev6aKc6ImyXFxcIik7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHRvYXN0KFxcXCLor7fovpPlhaXmraPnoa7nmoTpopzoibLlgLxcXFwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSksXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdWlfY29uZmlnLmVyLue6v+i3r+minOiJslxcbiAgICAgIH1cXG4gICAgfSlcXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIua1headpea6kOiJslxcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgZGVzYzogXFxcIuWtl+S9k+minOiJsjvog4zmma/popzoibJcXFwiLFxcbiAgICAgIHVybDogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcIjtcXFwiKSkge1xcbiAgICAgICAgICAkLnVpVGhlbWUuc2V0KGlucHV0LCBcXFwiZXIu5rWF5p2l5rqQ6ImyXFxcIik7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHRvYXN0KFxcXCLor7fovpPlhaXmraPnoa7mlbDlgLxcXFwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSksXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdWlfY29uZmlnLmVyLua1headpea6kOiJslxcbiAgICAgIH1cXG4gICAgfSlcXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIua3seadpea6kOiJslxcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgZGVzYzogXFxcIuWtl+S9k+minOiJsjvog4zmma/popzoibJcXFwiLFxcbiAgICAgIHVybDogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcIjtcXFwiKSkge1xcbiAgICAgICAgICAkLnVpVGhlbWUuc2V0KGlucHV0LCBcXFwiZXIu5rex5p2l5rqQ6ImyXFxcIik7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHRvYXN0KFxcXCLor7fovpPlhaXmraPnoa7mlbDlgLxcXFwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSksXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdWlfY29uZmlnLmVyLua3seadpea6kOiJslxcbiAgICAgIH1cXG4gICAgfSlcXG5cXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIue6v+i3r+minOiJslxcXCIsXFxuICAgICAgaW1nOiB1aV9jb25maWcuZXIu57q/6Lev6aKc6ImyLFxcbiAgICAgIHVybDogXFxcInRvYXN0Oi8v57q/6Lev6aKc6ImyXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcImljb25fM19maWxsXFxcIixcXG4gICAgfSlcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIueugOS7i+agt+W8jzogXFxcIiArIHVpX2NvbmZpZy5lci7nroDku4vmoLflvI8sXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBsZXQgY29sID0gJC51aVRoZW1lLmdldCgpLmVyLueugOS7i+agt+W8jztcXG4gICAgICAgIGxldCBjb2xzID0gW1xcXCIwXFxcIiwgXFxcIjFcXFwiXTtcXG4gICAgICAgIGNvbHMgPSBjb2xzLm1hcCh4ID0+IHggPT0gY29sID8gXFxcIuKeoe+4j1xcXCIgKyB4IDogeCk7XFxuICAgICAgICByZXR1cm4gJChjb2xzLCAyKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoXFxcIuKeoe+4j1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgJC51aVRoZW1lLnNldChpbnB1dCwgXFxcImVyLueugOS7i+agt+W8j1xcXCIpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICB9KVxcbiAgICAgIH0pLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICB9XFxuICAgIH0pXFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IFxcXCLliIbpobXpgLvovpFcXFwiLFxcbiAgICAgIGltZzogYnV0dG9uSW1nKCghdWlfY29uZmlnLmVyLuWIhumhtemAu+i+kSB8fCB1aV9jb25maWcuZXIu5YiG6aG16YC76L6RID09IFxcXCIwXFxcIiA/IGZhbHNlIDogdHJ1ZSkpLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBsZXQgcGEgPSAkLnVpQ29uZmlnLmdldCgpLmVyLuWIhumhtemAu+i+kTtcXG4gICAgICAgIGlmIChwYSA9PSB1bmRlZmluZWQgfHwgcGEgPT0gXFxcIjBcXFwiKSB7XFxuICAgICAgICAgIHBhID0gXFxcIjFcXFwiO1xcbiAgICAgICAgfSBlbHNlIGlmIChwYSA9PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgcGEgPSBcXFwiMFxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAkLnVpQ29uZmlnLnNldChwYSwgXFxcImVyLuWIhumhtemAu+i+kVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICB9KSxcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfaWNvblxcXCJcXG4gICAgfSlcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIuWIhumhteWvvOiIqlxcXCIsXFxuICAgICAgaW1nOiBidXR0b25JbWcodWlfY29uZmlnLmVyLuWIhumhteWvvOiIqiksXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2ljb25cXFwiLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBsZXQgcGEgPSAkLnVpQ29uZmlnLmdldCgpLmVyLuWIhumhteWvvOiIqjtcXG4gICAgICAgIGlmIChwYSkge1xcbiAgICAgICAgICBwYSA9IGZhbHNlO1xcbiAgICAgICAgfSBlbHNlIGlmICghcGEpIHtcXG4gICAgICAgICAgcGEgPSB0cnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgJC51aUNvbmZpZy5zZXQocGEsIFxcXCJlci7liIbpobXlr7zoiKpcXFwiKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSlcXG4gICAgfSlcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIuS6jOe6p+WIt+aWsFxcXCIsXFxuICAgICAgaW1nOiBidXR0b25JbWcodWlfY29uZmlnLmVyLuS6jOe6p+WIt+aWsCksXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2ljb25cXFwiLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBsZXQgcGEgPSAkLnVpQ29uZmlnLmdldCgpLmVyLuS6jOe6p+WIt+aWsDtcXG4gICAgICAgIGlmIChwYSkge1xcbiAgICAgICAgICBwYSA9IGZhbHNlO1xcbiAgICAgICAgfSBlbHNlIGlmICghcGEpIHtcXG4gICAgICAgICAgcGEgPSB0cnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgJC51aUNvbmZpZy5zZXQocGEsIFxcXCJlci7kuoznuqfliLfmlrBcXFwiKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSlcXG4gICAgfSlcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIuS6jOe6p+e8k+WtmFxcXCIsXFxuICAgICAgaW1nOiBidXR0b25JbWcodWlfY29uZmlnLmVyLuS6jOe6p+e8k+WtmCksXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2ljb25cXFwiLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBsZXQgcGEgPSAkLnVpQ29uZmlnLmdldCgpLmVyLuS6jOe6p+e8k+WtmDtcXG4gICAgICAgIGlmIChwYSkge1xcbiAgICAgICAgICBwYSA9IGZhbHNlO1xcbiAgICAgICAgfSBlbHNlIGlmICghcGEpIHtcXG4gICAgICAgICAgcGEgPSB0cnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgJC51aUNvbmZpZy5zZXQocGEsIFxcXCJlci7kuoznuqfnvJPlrZhcXFwiKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSlcXG4gICAgfSlcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIui/mOWOn1xcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoZGVmKSA9PiB7XFxuICAgICAgICByZXR1cm4gJChcXFwi5piv5ZCm5oGi5aSN6K6+572uXFxcIikuY29uZmlybSgoZGVmKSA9PiB7XFxuICAgICAgICAgICQudWlDb25maWcuc2V0KGRlZi5lciwgXFxcImVyXFxcIik7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+i/mOWOn+WujOaIkFxcXCI7XFxuICAgICAgICB9LCBkZWYpXFxuICAgICAgfSwgZGVmKSxcXG4gICAgfSwge1xcbiAgICAgIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcInBsYXlsaXN0X3JlYWR5XFxcIik7XFxuICAgICAgICBjbGVhck15VmFyKFxcXCJub3BhZ2VcXFwiKTtcXG4gICAgICAgIGJhY2sodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgfSksXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIExvbmdDbGljazogW3tcXG4gICAgICAgICAgdGl0bGU6IFxcXCLlpI3liLZcXFwiLFxcbiAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHVjID0gJC51aUNvbmZpZy5nZXQoKTtcXG4gICAgICAgICAgICBjb3B5KEpTT04uc3RyaW5naWZ5KHVjLmVyKSk7XFxuICAgICAgICAgIH0pLFxcbiAgICAgICAgfSwge1xcbiAgICAgICAgICB0aXRsZTogXFxcIuWvvOWFpVxcXCIsXFxuICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICB2YXIgdWMgPSAkLnVpQ29uZmlnLmdldCgpO1xcbiAgICAgICAgICAgIHJldHVybiAkKFxcXCJ7e2NsaXBib2FyZH19XFxcIikuaW5wdXQoKHVjKSA9PiB7XFxuICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICB1Yy5lciA9IEpTT04ucGFyc2UoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1Yyk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIuagvOW8j+mUmeivr1xcXCIpXFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSwgdWMpXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9XVxcbiAgICAgIH1cXG4gICAgfSlcXG4gIH1cXG4gIHNldFJlc3VsdChkKTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJMb2NhbFByb3h5XCIsXCJwYXRoXCI6XCJMb2NhbFByb3h5XCIsXCJydWxlXCI6XCJmdW5jdGlvbiBwcm94eSgpIHtcXG4gICAgZnVuY3Rpb24gcGFyc2VWaWRlbyhNWV9QQVJBTVMsIHRpdGxlKSB7XFxuICAgICAgICBmdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBwYXRoID0gW107XFxuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSAnJztcXG4gICAgICAgICAgICBsZXQgaW5CcmFja2V0cyA9IGZhbHNlO1xcbiAgICAgICAgICAgIGxldCBlc2NhcGUgPSBmYWxzZTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBjaGFyID0gdmFsdWVbaV07XFxuICAgICAgICAgICAgICAgIGlmIChlc2NhcGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcXG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IGZhbHNlO1xcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICdcXFxcXFxcXCcpIHtcXG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IHRydWU7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJy4nICYmICFpbkJyYWNrZXRzKSB7XFxuICAgICAgICAgICAgICAgICAgICBwYXRoLnB1c2goY3VycmVudCk7XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gJyc7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1snKSB7XFxuICAgICAgICAgICAgICAgICAgICBpbkJyYWNrZXRzID0gdHJ1ZTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXScpIHtcXG4gICAgICAgICAgICAgICAgICAgIGluQnJhY2tldHMgPSBmYWxzZTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoY3VycmVudCkge1xcbiAgICAgICAgICAgICAgICBwYXRoLnB1c2goY3VycmVudCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgZnVuY3Rpb24gZ2V0SnNvbihvYmosIHBhdGgpIHtcXG4gICAgICAgICAgICBpZiAoIW9iaiB8fCAhQXJyYXkuaXNBcnJheShwYXRoKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBvYmo7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBwYXRoW2ldO1xcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcnVuVHlwZSA9IE1ZX1BBUkFNUy5ydW5UeXBlWzBdO1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBkZWNvZGVVUklDb21wb25lbnQoYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy51cmxbMF0pKTtcXG4gICAgICAgICAgICBpZiAocnVuVHlwZSA9PSBcXFwiSlNPTlxcXCIpIHtcXG5cXG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy5wYXJhbVswXSkpKTtcXG4gICAgICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBwYXJhbS5oZWFkZXJzIHx8IHt9LFxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBwYXJhbS5tZXRob2QgfHwgdm9pZCAwXFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDMwMixcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtLmhlYWRlcnMgfHwge30sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiTG9jYXRpb25cXFwiOiBnZXRKc29uKGpzb24sIHRvUGF0aChwYXJhbS5qc29uUGF0aCkpLFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChydW5UeXBlID09IFxcXCJKU1xcXCIpIHtcXG5cXG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlO1xcbiAgICAgICAgICAgICAgICBpZiAoTVlfUEFSQU1TLmluZGV4KSB7XFxuICAgICAgICAgICAgICAgICAgICBwYXJzZSA9ICQucmVxdWlyZShcXFwiY29uZmlncz9ydWxlPVxcXCIgKyB0aXRsZSkuZ2V0SnNvbigpW01ZX1BBUkFNUy5pbmRleFswXV07XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKGRlY29kZVVSSUNvbXBvbmVudChNWV9QQVJBTVMucGFyYW1bMF0pKSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IHJlcyA9IG5ldyBGdW5jdGlvbihcXFwidXJsXFxcIiwgXFxcInNlbGZcXFwiLCBwYXJzZS5qcykodXJsLCBwYXJzZSk7XFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzID09PSBcXFwic3RyaW5nXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAzMDIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiTG9jYXRpb25cXFwiOiByZXNcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkLnR5cGUocmVzKSA9PT0gXFxcIm9iamVjdFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMzAyLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gZG9KcyhNWV9QQVJBTVMsIHRpdGxlLCBna2V5KSB7XFxuICAgICAgICBsZXQge1xcbiAgICAgICAgICAgIEdNXFxuICAgICAgICB9ID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTE2JmF1dGg9MWQzNWU4ZjAtMjJlOC01MjcwLWE5ZDEtODI2ZjUzZjE3N2FkXFxcIik7XFxuICAgICAgICBHTS5zZXRTZWxmS2V5KGdrZXkpO1xcbiAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiLCBcXFwiRHJweU1hbmFnZT9ydWxlPVxcXCIgKyB0aXRsZSk7XFxuICAgICAgICBsZXQgZHJweSA9IERycHlNYW5hZ2UuZ2V0KGRlY29kZVVSSUNvbXBvbmVudChNWV9QQVJBTVMuaGlrZXJTa2V5WzBdKSk7XFxuICAgICAgICBsZXQgcGFyYW1zID0ge307XFxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gTVlfUEFSQU1TKSB7XFxuICAgICAgICAgICAgcGFyYW1zW2tleV0gPSBTdHJpbmcoTVlfUEFSQU1TW2tleV1bMF0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgXFxuICAgICAgICBcXG4gICAgICAgIC8vbGV0IHJlc3VsdCA9IGRycHkucHJveHkocGFyYW1zKTtcXG4gICAgICAgIGxldCByZXN1bHQgPSBEcnB5TWFuYWdlLnJ1blByb3h5KGRycHksIFtwYXJhbXNdKTtcXG4gICAgICAgXFxuICAgICAgICBsZXQgW2NvZGUsIG1lZGlhX3R5cGUsIGRhdGEsIGhlYWRlcnMsIGlzUmV0dXJuQnl0ZXNdID0gcmVzdWx0O1xcbiAgICAgICAgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHtcXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogbWVkaWFfdHlwZSxcXG4gICAgICAgIH0sIGhlYWRlcnMpO1xcbiAgICAgICAgaWYodHlwZW9mIGRhdGE9PT1cXFwic3RyaW5nXFxcIiYmZGF0YS5zdGFydHNXaXRoKFxcXCJkYXRhOlxcXCIpJiZkYXRhLmluY2x1ZGVzKFxcXCJiYXNlNjQsXFxcIikpe1xcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNwbGl0KFxcXCJiYXNlNjQsXFxcIilbMV07XFxuICAgICAgICAgICAgY29uc3QgQ3J5cHRvVXRpbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9hc3NldHMvY3J5cHRvLWphdmEuanNcXFwiKTtcXG4gICAgICAgICAgICBkYXRhID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlQmFzZTY0KGRhdGEpLnRvQnl0ZXMoKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgc3RhdHVzQ29kZTogY29kZSxcXG4gICAgICAgICAgICBib2R5OiBkYXRhLFxcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXFxuICAgICAgICB9O1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIGVudHJhbmNlKE1ZX1BBUkFNUywgdGl0bGUsIGdrZXkpIHtcXG4gICAgICAgIGlmIChNWV9QQVJBTVMuZG8gJiYgTVlfUEFSQU1TLmRvWzBdID09PSBcXFwianNcXFwiKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvSnMoTVlfUEFSQU1TLCB0aXRsZSwgZ2tleSk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVmlkZW8oTVlfUEFSQU1TLCB0aXRsZSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgdGhpcy5lbnRyYW5jZSA9IGVudHJhbmNlO1xcbn1cXG5cXG5mdW5jdGlvbiBzdGFydFByb3h5KHRpdGxlLCBna2V5KSB7XFxuICAgIHJldHVybiBzdGFydFByb3h5U2VydmVyKCQudG9TdHJpbmcoKHByb3h5LCB0aXRsZSwgZ2tleSkgPT4ge1xcbiAgICAgICAgcmV0dXJuIG5ldyBwcm94eSgpLmVudHJhbmNlKE1ZX1BBUkFNUywgdGl0bGUsIGdrZXkpO1xcbiAgICB9LCBwcm94eSwgdGl0bGUsIGdrZXkpKTtcXG59XFxuJC5leHBvcnRzLnN0YXJ0UHJveHkgPSBzdGFydFByb3h5O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiSmF2YUdaSVBcIixcInBhdGhcIjpcIkdaSVBcIixcInJ1bGVcIjpcImxldCBGaWxlVXRpbCA9IGNvbS5leGFtcGxlLmhpa2Vydmlldy51dGlscy5GaWxlVXRpbDtcXG5sZXQgamF2YVN0cmluZyA9IGphdmEubGFuZy5TdHJpbmc7XFxubGV0IEJhc2U2NCA9IGphdmEudXRpbC5CYXNlNjQ7XFxuY29uc3QgR1pJUE91dHB1dFN0cmVhbSA9IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTtcXG5jb25zdCBHWklQSW5wdXRTdHJlYW0gPSBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTtcXG5jb25zdCBEZWZsYXRlck91dHB1dFN0cmVhbSA9IGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW07XFxuY29uc3QgSW5mbGF0ZXJJbnB1dFN0cmVhbSA9IGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbTtcXG5jb25zdCBEZWZsYXRlcklucHV0U3RyZWFtID0gamF2YS51dGlsLnppcC5EZWZsYXRlcklucHV0U3RyZWFtO1xcbmNvbnN0IEJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtO1xcbmNvbnN0IEJ5dGVBcnJheUlucHV0U3RyZWFtID0gamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTtcXG5jb25zdCBEZWZsYXRlciA9IGphdmEudXRpbC56aXAuRGVmbGF0ZXI7XFxuXFxuZnVuY3Rpb24gemlwKHRleHQsIG1vZGUpIHtcXG4gICAgbW9kZSA9IG1vZGUgPyBtb2RlIDogXFxcImd6aXBcXFwiO1xcbiAgICBsZXQgYmFzZVN0ciA9IG5ldyBqYXZhU3RyaW5nKHRleHQpO1xcbiAgICAvLyDkvb/nlKggQnl0ZUFycmF5T3V0cHV0U3RyZWFtIOadpeaNleiOt+WOi+e8qeWQjueahOaVsOaNrlxcbiAgICB2YXIgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTtcXG4gICAgaWYgKG1vZGUgPT0gXFxcImRlZmxhdGVcXFwiKSB7XFxuICAgICAgICB2YXIgZGVmbGF0ZXIgPSBuZXcgamF2YS51dGlsLnppcC5EZWZsYXRlcigpO1xcbiAgICAgICAgZGVmbGF0ZXIuc2V0TGV2ZWwoamF2YS51dGlsLnppcC5EZWZsYXRlci5CRVNUX0NPTVBSRVNTSU9OKTtcXG4gICAgICAgIHZhciBkb3MgPSBuZXcgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbShiYW9zLCBkZWZsYXRlcik7XFxuICAgICAgICBkb3Mud3JpdGUoYmFzZVN0ci5nZXRCeXRlcyhcXFwiVVRGLThcXFwiKSk7XFxuICAgICAgICBkb3MuZmluaXNoKCk7IC8vIOWujOaIkOWOi+e8qVxcbiAgICAgICAgZG9zLmNsb3NlKCk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB2YXIgZ3pvcyA9IG5ldyBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW0oYmFvcyk7XFxuICAgICAgICBnem9zLndyaXRlKGJhc2VTdHIuZ2V0Qnl0ZXMoXFxcIlVURi04XFxcIikpO1xcbiAgICAgICAgZ3pvcy5jbG9zZSgpOyAvLyDlhbPpl63ljovnvKnmtYFcXG4gICAgfVxcbiAgICAvLyDlsIbljovnvKnlkI7nmoTmlbDmja7ovazmjaLkuLogQmFzZTY0IOe8lueggeeahOWtl+espuS4slxcbiAgICB2YXIgY29tcHJlc3NlZERhdGEgPSBiYW9zLnRvQnl0ZUFycmF5KCk7XFxuICAgIHZhciBiYXNlNjRTdHJpbmcgPSBqYXZhLnV0aWwuQmFzZTY0LmdldEVuY29kZXIoKS5lbmNvZGVUb1N0cmluZyhjb21wcmVzc2VkRGF0YSk7XFxuXFxuICAgIC8vIOWFs+mXrSBCeXRlQXJyYXlPdXRwdXRTdHJlYW1cXG4gICAgYmFvcy5jbG9zZSgpO1xcbiAgICByZXR1cm4gU3RyaW5nKGJhc2U2NFN0cmluZyk7XFxufVxcblxcbmZ1bmN0aW9uIHVuemlwKHRleHQsIG1vZGUpIHtcXG4gICAgbW9kZSA9IG1vZGUgPyBtb2RlIDogXFxcImd6aXBcXFwiO1xcbiAgICB2YXIgY29tcHJlc3NlZERhdGEgPSBCYXNlNjQuZ2V0RGVjb2RlcigpLmRlY29kZSh0ZXh0KTtcXG4gICAgdmFyIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29tcHJlc3NlZERhdGEpO1xcbiAgICB2YXIgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTtcXG4gICAgdmFyIGJ1ZmZlciA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGphdmEubGFuZy5CeXRlLlRZUEUsIDEwMjQpO1xcbiAgICBpZiAobW9kZSA9PSBcXFwiZ3ppcFxcXCIpIHtcXG4gICAgICAgIHZhciBnaXMgPSBuZXcgR1pJUElucHV0U3RyZWFtKGJhaXMpO1xcbiAgICAgICAgbGV0IGxlbjtcXG4gICAgICAgIHdoaWxlICgobGVuID0gZ2lzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHtcXG4gICAgICAgICAgICBiYW9zLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGdpcy5jbG9zZSgpO1xcbiAgICB9IGVsc2UgaWYgKG1vZGUgPT0gXFxcImRlZmxhdGVcXFwiKSB7XFxuICAgICAgICB2YXIgaWlzID0gbmV3IEluZmxhdGVySW5wdXRTdHJlYW0oYmFpcyk7XFxuICAgICAgICBsZXQgbGVuO1xcbiAgICAgICAgd2hpbGUgKChsZW4gPSBpaXMucmVhZChidWZmZXIpKSAhPSAtMSkge1xcbiAgICAgICAgICAgIGJhb3Mud3JpdGUoYnVmZmVyLCAwLCBsZW4pO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWlzLmNsb3NlKCk7XFxuICAgIH1cXG4gICAgYmFpcy5jbG9zZSgpO1xcbiAgICBiYW9zLmNsb3NlKCk7XFxuICAgIHZhciBkZWNvbXByZXNzZWRTdHJpbmcgPSBuZXcgamF2YVN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksIFxcXCJVVEYtOFxcXCIpO1xcbiAgICAvLyDmiZPljbDop6PljovnvKnlkI7nmoTlrZfnrKbkuLJcXG4gICAgcmV0dXJuIFN0cmluZyhkZWNvbXByZXNzZWRTdHJpbmcpO1xcbn1cXG4kLmV4cG9ydHMgPSB7XFxuICAgIHppcCxcXG4gICAgdW56aXBcXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5pSv5oyB5L2c6ICFXCIsXCJwYXRoXCI6XCJEb25hdGUudlwiLFwicnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIuaNkOi1oC/mlK/mjIFcXFwiKTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaNkOi1oC/mlK/mjIFcXFwiLFxcbiAgICBkZXNjOiBcXFwi6L+Z5Liq5o2Q6LWg5LiN6IO95Li65L2g5bim5p2l54m55p2D77yM5L2G5oKo55qE5pSv5oyB5Lya5o+Q6auY5oiR5pu05paw5Yib5L2c55qE5Yqo5Yqb44CCXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiBcXFwidG9hc3Q6Ly/mhJ/osKLmgqjnmoTmlK/mjIFcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLljYHliIbmhJ/osKLOseWkp+S9rOeahOWPguS4juW8gOWPke+8jOS7peWPiumBk+mVv+Wkp+S9rOWvueacrOeoi+W6j+W8gOWPkeS4iueahOaMh+WvvOOAglxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogXFxcInRvYXN0Oi8v5oSf6LCi5oKo55qE5pSv5oyBXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwicGljXzFfZnVsbFxcXCIsXFxuICAgIHVybDogXFxcImh0dHBzOi8vZ2l0ZWUuY29tL0xveURnSWsvTG95RGdJa19SdWxlL3Jhdy9tYXN0ZXIvNjdkOGYwMTg3ZjAxODZjMS5wbmdcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9naXRlZS5jb20vTG95RGdJay9Mb3lEZ0lrX1J1bGUvcmF3L21hc3Rlci82N2Q4ZjAxODdmMDE4NmMxLnBuZ1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5Zu+54mH5Yqg6L2957yT5oWi6K+356iN562JXFxcIi5zbWFsbCgpLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6YCa55So5pa55rOVXCIsXCJwYXRoXCI6XCJtZXRob2RzXCIsXCJydWxlXCI6XCJqczpcXG4vL+WOu+mZpGh0bWzmoIfnrb5cXG5mdW5jdGlvbiByZW1vdmVIdG1sVGFncyhzdHIpIHtcXG4gIHN0cmluZ2V4KCk7XFxuICByZXR1cm4gc3RyLnJldGFnKCk7XFxufVxcbi8vIOiHqueEtuaOkuW6j1xcbmZ1bmN0aW9uIG5hdHVyYWxTb3J0KGFyciwga2V5KSB7XFxuICBzdHJpbmdleCgpO1xcbiAgcmV0dXJuIGFyci5zb3J0KChhLCBiKSA9PiB7XFxuICAgIGxldCBhc3RyLCBic3RyO1xcbiAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiID09PSAnb2JqZWN0JyAmJiBrZXkpIHtcXG4gICAgICBhc3RyID0gYVtrZXldLnJldGFnKCk7XFxuICAgICAgYnN0ciA9IGJba2V5XS5yZXRhZygpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIGFzdHIgPSBhLnRvU3RyaW5nKCkucmV0YWcoKTtcXG4gICAgICBic3RyID0gYi50b1N0cmluZygpLnJldGFnKCk7XFxuICAgIH1cXG4gICAgcmV0dXJuIGFzdHIubG9jYWxlQ29tcGFyZShic3RyLCB1bmRlZmluZWQsIHtcXG4gICAgICBudW1lcmljOiB0cnVlLFxcbiAgICAgIHNlbnNpdGl2aXR5OiAnYmFzZSdcXG4gICAgfSk7XFxuICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0TGVhY2goKSB7XFxuICAgIGxldCBsZWFjaDtcXG4gICAgbGV0IGdsZWFjaCA9IGdldEl0ZW0oXFxcImxlYWNoXFxcIiwgXFxcIlxcXCIpO1xcbiAgICBsZXQgdGxlYWNoID0gZ2V0TXlWYXIoXFxcInRlbXBMZWFjaFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgaWYodGxlYWNoIT1cXFwiXFxcIil7XFxuICAgICAgbGVhY2g9ZmFsc2U7XFxuICAgICAgcmV0dXJuIGxlYWNoO1xcbiAgICB9XFxuICAgIGlmKGdsZWFjaCE9XFxcIlxcXCIpe1xcbiAgICAgIGxlYWNoPXRydWU7XFxuICAgIH1cXG4gICAgcmV0dXJuIGxlYWNofHxmYWxzZTtcXG59XFxuXFxuXFxuZnVuY3Rpb24gbGVhY2hsaXN0KHNob3VsZExlYWNoKSB7XFxuICBsZXQgbGVhY2hTdGF0ZSA9IHNob3VsZExlYWNoO1xcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgJ2xlYWNoTGlzdCcsIHtcXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcXG4gICAgICBsZXQgYiA9IFxcXCJLRnRjVytPQWtGMHBXK1d2aGwwb1crT0FrVnhkWFNrPVxcXCI7XFxuICAgICAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoYmFzZTY0RGVjb2RlKGIpKTtcXG4gICAgICBpZiAobGVhY2hTdGF0ZSkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHYgPT4gIXJlZy50ZXN0KHYubmFtZSkpO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgICB9XFxuICAgIH0sXFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxcbiAgICB3cml0YWJsZTogdHJ1ZSxcXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXFxuICB9KTtcXG59XFxuXFxuLy/kvb/nlKjmjpLluo9cXG5sZXQgdXNpbmdTb3J0ID0ge1xcbiAgbmFtZTogXFxcInVzaW5nU29ydC5qc29uXFxcIixcXG4gIHBhdGg6IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0RycHlIaWtlci9cXFwiLFxcbiAga2V5OiB1bmRlZmluZWQsXFxuICBzYXZlKGNvbnRlbnQpIHtcXG4gICAgc2F2ZUZpbGUodGhpcy5wYXRoICsgdGhpcy5uYW1lLCBjb250ZW50KTtcXG4gIH0sXFxuICBpbml0KCkge1xcbiAgICBsZXQganNvbiA9IHt9O1xcbiAgICBpZiAoIWZpbGVFeGlzdCh0aGlzLnBhdGggKyB0aGlzLm5hbWUpKSB7XFxuICAgICAgdGhpcy5zYXZlKFxcXCJ7fVxcXCIpO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAganNvbiA9IEpTT04ucGFyc2UocmVhZEZpbGUodGhpcy5wYXRoICsgdGhpcy5uYW1lKSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICBqc29uID0ge307XFxuICAgICAgdGhpcy5zYXZlKFxcXCJ7fVxcXCIpO1xcbiAgICB9XFxuICAgIHJldHVybiBqc29uO1xcbiAgfSxcXG4gIHNvcnQoKSB7XFxuICAgIGxldCBqc29uID0gdGhpcy5pbml0KCk7XFxuICAgIGxldCBzb3J0ZWRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoanNvbikuc29ydCgoYSwgYikgPT4gYlsxXSAtIGFbMV0pO1xcbiAgICBsZXQgc29ydGVkQXJyYXkgPSBzb3J0ZWRFbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XFxuICAgICAgbGV0IG9iaiA9IHt9O1xcbiAgICAgIG9ialtrZXldID0gdmFsdWU7XFxuICAgICAgcmV0dXJuIG9iajtcXG4gICAgfSk7XFxuICAgIHJldHVybiBzb3J0ZWRBcnJheVxcbiAgfSxcXG4gIHNvcnRLZXlzQnlVc2FnZShqc29uLCBrZXlzLCBuZXN0ZWRLZXkpIHtcXG4gICAgc3RyaW5nZXgoKTtcXG4gICAgcmV0dXJuIGtleXMuc29ydCgoYSwgYikgPT4ge1xcbiAgICAgIGxldCBrZXlBLCBrZXlCLCB2YWxBLCB2YWxCO1xcblxcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT09ICdvYmplY3QnKSB7XFxuICAgICAgICBrZXlBID0gYVtuZXN0ZWRLZXldO1xcbiAgICAgICAga2V5QiA9IGJbbmVzdGVkS2V5XTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAga2V5QSA9IGEudG9TdHJpbmcoKS5yZXRhZygpO1xcbiAgICAgICAga2V5QiA9IGIudG9TdHJpbmcoKS5yZXRhZygpO1xcbiAgICAgIH1cXG5cXG4gICAgICB2YWxBID0ganNvbltrZXlBXSB8fCAwO1xcbiAgICAgIHZhbEIgPSBqc29uW2tleUJdIHx8IDA7XFxuICAgICAgaWYgKHZhbEIgLSB2YWxBICE9PSAwKSB7XFxuICAgICAgICByZXR1cm4gdmFsQiAtIHZhbEE7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBuYXR1cmFsU29ydChba2V5QSwga2V5Ql0pWzBdID09PSBrZXlBID8gLTEgOiAxO1xcbiAgICAgIH1cXG4gICAgfSk7XFxuICB9LFxcbiAgZ2V0KGtleXMsIGtleSkge1xcbiAgICBsZXQganNvbiA9IHRoaXMuaW5pdCgpO1xcbiAgICAvL2xvZyh0aGlzLnNvcnQoKSlcXG4gICAgaWYgKGtleSA9PSB1bmRlZmluZWQpIHtcXG4gICAgICBrZXkgPSB0aGlzLmtleTtcXG4gICAgfVxcbiAgICByZXR1cm4gdGhpcy5zb3J0S2V5c0J5VXNhZ2UoanNvbiwga2V5cywga2V5KTtcXG4gIH0sXFxuICBzZXRrZXkoa2V5KSB7XFxuICAgIHRoaXMua2V5ID0ga2V5O1xcbiAgfSxcXG4gIHNldChrZXkpIHtcXG4gICAgbGV0IGpzb24gPSB0aGlzLmluaXQoKTtcXG4gICAgaWYgKGpzb24uaGFzT3duUHJvcGVydHkoa2V5KSkge1xcbiAgICAgIGpzb25ba2V5XSArPSAxO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIGpzb25ba2V5XSA9IDE7XFxuICAgIH1cXG4gICAgdGhpcy5zYXZlKEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG4gIH1cXG59XFxuXFxuZnVuY3Rpb24gaXNWYWxpZENvbG9yKGNvbG9yKSB7XFxuICAvLyDljLnphY3ljYHlha3ov5vliLbpopzoibJcXG4gIGNvbnN0IGhleFBhdHRlcm4gPSAvXiMoW0EtRmEtZjAtOV17Nn18W0EtRmEtZjAtOV17M30pJC87XFxuICBjb25zdCBuYW1lZENvbG9ycyA9IHtcXG4gICAgYmxhY2s6IHRydWUsXFxuICAgIHdoaXRlOiB0cnVlLFxcbiAgfTtcXG4gIC8vIOWmguaenOaYr+W4uOingeminOiJsuWQjeensO+8jOi/lOWbniB0cnVlXFxuICBpZiAobmFtZWRDb2xvcnNbY29sb3IudG9Mb3dlckNhc2UoKV0pIHtcXG4gICAgcmV0dXJuIHRydWU7XFxuICB9XFxuICBpZiAoY29sb3IudG9Mb3dlckNhc2UoKSA9PT0gXFxcInJhbmRvbVxcXCIpIHtcXG4gICAgcmV0dXJuIHRydWU7IC8vIOi/memHjOWPr+S7pei/m+S4gOatpeWkhOeQhu+8jOS+i+WmgueUn+aIkOS4gOS4qumaj+acuuminOiJsuWtl+espuS4slxcbiAgfVxcbiAgcmV0dXJuIGhleFBhdHRlcm4udGVzdChjb2xvcilcXG59XFxuXFxuLyoqXFxuICog5a2X5L2T5qC35byPXFxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgXFxuICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyBcXG4gKiBAcmV0dXJucyBcXG4gKi9cXG5mdW5jdGlvbiBmb250c3R5bGUodGV4dCwgcGFyYW1zLGNvbCkge1xcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHVuZGVmaW5lZDtcXG4gIHZhciBoID0gcGFyYW1zLmggIT09IGZhbHNlID8gJ+KAnOKAnOKAneKAnScgOiAnJztcXG4gIGxldCBvbnRhZz1bXFxcImljb25fc21hbGxfM1xcXCJdO1xcbiAgaWYoY29sIT11bmRlZmluZWQpe1xcbiAgICBpZihvbnRhZy5pbmNsdWRlcyhjb2wpKXtcXG4gICAgICBoPScnO1xcbiAgICB9XFxuICB9XFxuICB2YXIgdGFncyA9IHBhcmFtcy50YWdzIHx8IFxcXCJcXFwiO1xcbiAgaWYgKHBhcmFtcy5jICE9IHVuZGVmaW5lZCkge1xcbiAgICB0ZXh0ID0gdGV4dC5mb250Y29sb3IocGFyYW1zLmMpO1xcbiAgfVxcbiAgaWYgKHRhZ3MpIHtcXG4gICAgdmFyIHRhZ0FycmF5ID0gdGFncy5zcGxpdCgnfCcpLmZpbHRlcihlID0+IGUpO1xcbiAgICB2YXIgb3BlblRhZ3MgPSAnJztcXG4gICAgdmFyIGNsb3NlVGFncyA9ICcnO1xcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhZ0FycmF5Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgb3BlblRhZ3MgKz0gJzwnICsgdGFnQXJyYXlbaV0gKyAnPic7XFxuICAgICAgY2xvc2VUYWdzID0gJzwvJyArIHRhZ0FycmF5W2ldICsgJz4nICsgY2xvc2VUYWdzO1xcbiAgICB9XFxuICAgIHRleHQgPSBvcGVuVGFncyArIHRleHQgKyBjbG9zZVRhZ3M7XFxuICB9XFxuICByZXR1cm4gaCArIHRleHQ7XFxufVxcblxcbi8qKlxcbiAqIOiuoeeul+Wtl+espuS4sueahOWtl+iKguaVsFxcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFxcbiAqIEByZXR1cm5zIFxcbiAqL1xcbmZ1bmN0aW9uIGNvdW50VG90YWxCeXRlcyh0ZXh0KSB7XFxuICB2YXIgY291bnQgPSAwO1xcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XFxuICAgIHZhciBjb2RlID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xcbiAgICBpZiAoY29kZSA+PSAweDAxMDApIHsgLy8g5Y+M5a2X6IqC5a2X56ym55qEIFVuaWNvZGUg57yW56CB5aSn5LqOIDI1NVxcbiAgICAgIGNvdW50ICs9IDI7IC8vIOWPjOWtl+iKguWtl+espuiuoeaVsOS4ujJcXG4gICAgfSBlbHNlIHtcXG4gICAgICBjb3VudCArPSAxOyAvLyDljZXlrZfoioLlrZfnrKborqHmlbDkuLoxXFxuICAgIH1cXG4gIH1cXG4gIHJldHVybiBjb3VudDtcXG59XFxuXFxuLyoqXFxuICog5om+5Yiw5pWw57uE5Lit5pyA6ZW/55qE5YWD57SgXFxuICogQHBhcmFtIHthcnJheX0gYXJyIFxcbiAqIEByZXR1cm5zIFxcbiAqL1xcbmZ1bmN0aW9uIGZpbmRMb25nZXN0RWxlbWVudChhcnIpIHtcXG4gIHJldHVybiBhcnIucmVkdWNlKChhLCBiKSA9PiBhLmxlbmd0aCA+IGIubGVuZ3RoID8gYSA6IGIpO1xcbn1cXG5cXG4vKipcXG4gKiDmiKrlj5blrZfnrKbkuLJcXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFxcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhMZW5ndGggXFxuICogQHJldHVybnMgXFxuICovXFxuZnVuY3Rpb24gc3Vic3RyKHN0ciwgbWF4TGVuZ3RoKSB7XFxuICBsZXQgbGVuID0gMDtcXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XFxuICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSA+IDI1NSkge1xcbiAgICAgIGxlbiArPSAyO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIGxlbisrO1xcbiAgICB9XFxuICAgIGlmIChsZW4gPiBtYXhMZW5ndGgpIHtcXG4gICAgICByZXR1cm4gc3RyLnNsaWNlKDAsIGkpICsgJy4uLic7XFxuICAgIH1cXG4gIH1cXG4gIHJldHVybiBzdHI7XFxufVxcblxcbi8v5a2X5L2T6IOM5pmvXFxuZnVuY3Rpb24gYmFja0NvbG9yKHRpdGxlLCBjb2xvcnMpIHtcXG4gIHZhciBkZWYgPSB7XFxuICAgIGZjOiAnIzczN0E4MCcsXFxuICAgIGJjOiAnI0Y3RjhGQScsXFxuICB9XFxuICBjb2xvcnMgPSBPYmplY3QuYXNzaWduKGRlZiwgY29sb3JzKTtcXG4gIHJldHVybiAnPGZvbnQgY29sb3I9XFxcIicgKyBjb2xvcnMuZmMgKyAnXFxcIj48c3BhbiBzdHlsZT1cXFwiYmFja2dyb3VuZC1jb2xvcjogJyArIGNvbG9ycy5iYyArICdcXFwiPicgKyB0aXRsZSArICc8L3NwYW4+PC9mb250PidcXG59XFxuXFxuLyoqXFxuICog5omp5bGV5a2X56ym5Liy5pa55rOVXFxuICovXFxuZnVuY3Rpb24gc3RyaW5nZXgoKSB7XFxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhTdHJpbmcucHJvdG90eXBlLCB7XFxuICAgIHJldGFnOiB7XFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoLzxbXj5dKj4vZywgJycpLnJlcGxhY2UoL1vigJzigJ0nXS9nLCBcXFwiXFxcIik7XFxuICAgICAgfSxcXG4gICAgICB3cml0YWJsZTp0cnVlLFxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxcbiAgICB9LFxcbiAgICBTcGxpdDoge1xcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiAocywgZSkge1xcbiAgICAgICAgaWYgKGUpIHtcXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXQocykuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gJycpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXQocyk7XFxuICAgICAgICB9XFxuICAgICAgfSxcXG4gICAgICB3cml0YWJsZTp0cnVlLFxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxcbiAgICB9XFxuICB9KTtcXG59XFxuXFxuLyoqXFxuICog5omp5bGV5YiX6KGo5pa55rOVXFxuICovXFxuZnVuY3Rpb24gYXJyYXlleCgpIHtcXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFycmF5LnByb3RvdHlwZSwge1xcbiAgICBMYXN0OiB7XFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgIHJldHVybiB0aGlzW3RoaXMubGVuZ3RoIC0gMV07XFxuICAgICAgfSxcXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcXG4gICAgfSxcXG4gICAgZXhjbHVkZUtleXM6IHtcXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gKGtleXMsIGV4Y2x1ZGUsIHJlbmFtZUNhbGxiYWNrKSB7XFxuICAgICAgICAvLyDnoa7lrprmmK/mjpLpmaTov5jmmK/lj6rkv53nlZnplK5cXG4gICAgICAgIGNvbnN0IHNob3VsZEV4Y2x1ZGUgPSB0eXBlb2YgZXhjbHVkZSA9PT0gJ2Jvb2xlYW4nID8gZXhjbHVkZSA6IHRydWU7XFxuICAgICAgICBjb25zdCBrZXlzVG9IYW5kbGUgPSBBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtdO1xcblxcbiAgICAgICAgLy8g5L2/55SoQXJyYXkucHJvdG90eXBlLm1hcOmBjeWOhuaVsOe7hOS4reeahOavj+S4quWFg+e0oFxcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwKGl0ZW0gPT4ge1xcbiAgICAgICAgICAvLyDlpoLmnpzlhYPntKDmmK/kuIDkuKrmlbDnu4TvvIzpgJLlvZLosIPnlKhleGNsdWRlS2V5c1xcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmV4Y2x1ZGVLZXlzKGV4Y2x1ZGUsIGtleXMsIHJlbmFtZUNhbGxiYWNrKTtcXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkge1xcbiAgICAgICAgICAgIC8vIOWmguaenOWFg+e0oOaYr+S4gOS4quWvueixoe+8jOS9v+eUqE9iamVjdC5mcm9tRW50cmllc+WSjE9iamVjdC5lbnRyaWVz5p2l5aSE55CG6ZSuXFxuICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGl0ZW0pO1xcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZEVudHJpZXMgPSBlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XFxuICAgICAgICAgICAgICAvLyDlpoLmnpzmnInph43lkb3lkI3lm57osIPlh73mlbDvvIzliJnosIPnlKjlroNcXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVuYW1lQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtyZW5hbWVDYWxsYmFjayhrZXksIHZhbHVlKSwgdmFsdWVdO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHZhbHVlXTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEVudHJpZXMgPSBzaG91bGRFeGNsdWRlID9cXG4gICAgICAgICAgICAgIHByb2Nlc3NlZEVudHJpZXMuZmlsdGVyKChba2V5XSkgPT4gIWtleXNUb0hhbmRsZS5pbmNsdWRlcyhrZXkpKSA6XFxuICAgICAgICAgICAgICBwcm9jZXNzZWRFbnRyaWVzLmZpbHRlcigoW2tleV0pID0+IGtleXNUb0hhbmRsZS5pbmNsdWRlcyhrZXkpKTtcXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGZpbHRlcmVkRW50cmllcyk7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgLy8g5aaC5p6c5YWD57Sg5LiN5piv5a+56LGh5oiW5pWw57uE77yM55u05o6l6L+U5ZueXFxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgIH0sXFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsIC8vIOiuvue9ruS4uuS4jeWPr+aemuS4vlxcbiAgICB9LFxcbiAgICB0cmFuc2Zvcm1LZXlzOiB7XFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIChrZXlNYXBwaW5nKSB7XFxuICAgICAgICAvLyDkvb/nlKhBcnJheS5wcm90b3R5cGUubWFw6YGN5Y6G5pWw57uE5Lit55qE5q+P5Liq5YWD57SgXFxuICAgICAgICByZXR1cm4gdGhpcy5tYXAoaXRlbSA9PiB7XFxuICAgICAgICAgIC8vIOWmguaenOWFg+e0oOaYr+S4gOS4quaVsOe7hO+8jOmAkuW9kuiwg+eUqHRyYW5zZm9ybUtleXNcXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gaXRlbS50cmFuc2Zvcm1LZXlzKGtleU1hcHBpbmcpO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICE9PSBudWxsKSB7XFxuICAgICAgICAgICAgLy8g5aaC5p6c5YWD57Sg5piv5LiA5Liq5a+56LGh77yM5L2/55SoT2JqZWN0LmZyb21FbnRyaWVz5ZKMT2JqZWN0LmVudHJpZXPmnaXlpITnkIbplK5cXG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoaXRlbSk7XFxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRFbnRyaWVzID0gZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xcbiAgICAgICAgICAgICAgY29uc3QgbmV3S2V5ID0ga2V5TWFwcGluZ1trZXldIHx8IGtleTsgLy8g5aaC5p6c6ZSu5Zyo5pig5bCE5Lit77yM5L2/55So5paw6ZSu77yb5ZCm5YiZ5L2/55So5Y6f5aeL6ZSuXFxuICAgICAgICAgICAgICByZXR1cm4gW25ld0tleSwgdmFsdWVdO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModHJhbnNmb3JtZWRFbnRyaWVzKTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAvLyDlpoLmnpzlhYPntKDkuI3mmK/lr7nosaHmiJbmlbDnu4TvvIznm7TmjqXov5Tlm55cXG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgfSxcXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSwgLy8g6K6+572u5Li65LiN5Y+v5p6a5Li+XFxuICAgIH1cXG4gIH0pO1xcbn1cXG5cXG4vKipcXG4gKiDojrflj5bljoblj7LorrDlvZVcXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZSBcXG4gKiBAcGFyYW0ge3N0cmluZ30gc2tleSBcXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgXFxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlIFxcbiAqIEByZXR1cm5zIFxcbiAqL1xcbmZ1bmN0aW9uIGhpc3Rvcnlsb2cobW9kZSwgc2tleSwgaWQsIHZhbHVlKSB7XFxuICBsZXQgZXIgPSAkLnJlcXVpcmUoXFxcIlVJTWFuYWdlXFxcIikudWlfY29uZmlnLmVyO1xcbiAgdmFyIG5hbWUgPSBcXFwiaGlzdG9yeS5qc29uXFxcIjtcXG4gIGxldCBqc29uID0gW107XFxuICBpZiAoZmlsZUV4aXN0KG5hbWUpKSB7XFxuICAgIGpzb24gPSBKU09OLnBhcnNlKHJlYWRGaWxlKG5hbWUsIDApKSB8fCBbXTtcXG4gIH1cXG4gIGlmIChtb2RlID09IFxcXCJnZXRcXFwiKSB7XFxuICAgIGxldCBpbmRleCA9IGpzb24uZmluZEluZGV4KG9iaiA9PiBvYmouc2tleSA9PT0gc2tleSAmJiBvYmouaWQgPT09IGlkKTtcXG4gICAgaWYgKGluZGV4ICE9IC0xKSB7XFxuICAgICAgcmV0dXJuIFN0cmluZyhqc29uW2luZGV4XS5wYWdlKTtcXG4gICAgfVxcbiAgfVxcbiAgbGV0IG1heGNvdW50ID0gZXIu5Y6G5Y+y6K6w5b2VO1xcbiAgaWYgKG1vZGUgPT0gXFxcInNldFxcXCIpIHtcXG4gICAgaWYgKGpzb24ubGVuZ3RoID49IG1heGNvdW50KSB7XFxuICAgICAganNvbiA9IGpzb24uc2xpY2UoMCwgbWF4Y291bnQgLSAxKTtcXG4gICAgfVxcbiAgICBsZXQgaW5kZXggPSBqc29uLmZpbmRJbmRleChvYmogPT4gb2JqLnNrZXkgPT09IHNrZXkgJiYgb2JqLmlkID09PSBpZCk7XFxuICAgIGlmIChpbmRleCAhPSAtMSkge1xcbiAgICAgIGlmIChqc29uW2luZGV4XS5wYWdlICE9IHZhbHVlLnBhZ2UpIHtcXG4gICAgICAgIGpzb25baW5kZXhdLnBhZ2UgPSB2YWx1ZS5wYWdlO1xcbiAgICAgICAgc2F2ZUZpbGUobmFtZSwgSlNPTi5zdHJpbmdpZnkoanNvbiksIDApO1xcbiAgICAgIH07XFxuICAgIH0gZWxzZSB7XFxuICAgICAganNvbi5wdXNoKHtcXG4gICAgICAgIHNrZXk6IHNrZXksXFxuICAgICAgICBpZDogaWQsXFxuICAgICAgICB0aXRsZTogdmFsdWUudGl0bGUsXFxuICAgICAgICBwYWdlOiB2YWx1ZS5wYWdlLFxcbiAgICAgIH0pXFxuICAgICAgc2F2ZUZpbGUobmFtZSwgSlNPTi5zdHJpbmdpZnkoanNvbiksIDApO1xcbiAgICB9XFxuICB9XFxufVxcblxcbmZ1bmN0aW9uIGlzRGFya01vZGUoKSB7XFxuICBjb25zdCBDb25maWd1cmF0aW9uID0gYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uO1xcbiAgbGV0IGN4ID0gZ2V0Q3VycmVudEFjdGl2aXR5KCk7XFxuXFxuICBsZXQgdGhlbWUgPSBjeC5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkudWlNb2RlICYgQ29uZmlndXJhdGlvbi5VSV9NT0RFX05JR0hUX01BU0s7XFxuICByZXR1cm4gdGhlbWUgPT0gQ29uZmlndXJhdGlvbi5VSV9NT0RFX05JR0hUX1lFUztcXG5cXG59XFxuXFxuZnVuY3Rpb24gaW5zZXJ0QXJyYXlBdChhcnJheSwgaW5kZXgsIGVsZW1lbnRzVG9JbnNlcnQpIHtcXG4gIGlmICghQXJyYXkuaXNBcnJheShlbGVtZW50c1RvSW5zZXJ0KSkge1xcbiAgICBlbGVtZW50c1RvSW5zZXJ0ID0gW2VsZW1lbnRzVG9JbnNlcnRdO1xcbiAgfVxcbiAgLy8g5L2/55Soc3BsaWNl5pa55rOV5o+S5YWl5pWw57uEXFxuICBhcnJheS5zcGxpY2UuYXBwbHkoYXJyYXksIFtpbmRleCwgMF0uY29uY2F0KGVsZW1lbnRzVG9JbnNlcnQpKTtcXG59XFxuXFxubGV0IGVySW5mbyA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJlckluZm9cXFwiLCBcXFwie31cXFwiKTtcXG5cXG5mdW5jdGlvbiBnZXRFSW5mbygpIHtcXG4gIGxldCBza2V5ID0gZXJJbmZvLnNrZXk7XFxuICBsZXQgaWQgPSBlckluZm8uaWQ7XFxuICBsZXQgbGluZSA9IGdldE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgbGV0IGhpcyA9IGhpc3Rvcnlsb2coXFxcImdldFxcXCIsIHNrZXksIG1kNShpZCkpO1xcbiAgbGV0IHBhZ2VudW0gPSBOdW1iZXIoZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCAoaGlzIHx8IFxcXCIwXFxcIikpKTtcXG4gIGxldCBtYXhzID0gZXJJbmZvLnRvdGFsO1xcbiAgbGV0IHNwYWdlbnVtID0gcGFnZW51bSArIDE7XFxuICBpZiAobWF4cyAmJiBzcGFnZW51bSA+IG1heHNbbGluZV0pIHtcXG4gICAgc3BhZ2VudW0gPSBtYXhzW2xpbmVdO1xcbiAgfVxcbiAgcmV0dXJuIHtcXG4gICAgbGluZSxcXG4gICAgcGFnZW51bSxcXG4gICAgc3BhZ2VudW06IHNwYWdlbnVtLFxcbiAgICBmcm9tOiBlckluZm8uZnJvbSxcXG4gICAgbWF4OiBlckluZm8udG90YWwsXFxuICAgIHBsYXlwOiBlckluZm8ucGxheXAsXFxuICAgIHBsYXlzOiBlckluZm8ucGxheXMsXFxuICB9XFxufVxcblxcbmZ1bmN0aW9uIGVyUmVmcmVzaChpKSB7XFxuICBsZXQge1xcbiAgICB1aV9jb25maWdcXG4gIH0gPSAkLnJlcXVpcmUoXFxcIlVJTWFuYWdlXFxcIik7XFxuICBcXG4gIGxldCBlciA9IHVpX2NvbmZpZy5lcjtcXG4gIGlmIChlci7kuoznuqfliLfmlrApIHtcXG4gICAgY2xlYXJNeVZhcihcXFwicGxheWxpc3RfcmVhZHlcXFwiKTtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgfSBlbHNlIHtcXG4gICAgLy90b2FzdChpKVxcbiAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkoaSk7XFxuICB9XFxuICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbn1cXG5cXG5sZXQgY2FjaGVNYW5hZ2UgPSB7XFxuICByb290OiBcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvXFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiL1xcXCIsXFxuICBnZXROYW1lKGlkKSB7XFxuICAgIHJldHVybiB0aGlzLnJvb3QgKyBtZDUoaWQpO1xcbiAgfSxcXG4gIGdldChpZCkge1xcbiAgICBsZXQgbmFtZSA9IHRoaXMuZ2V0TmFtZShpZCk7XFxuICAgIGlmIChmaWxlRXhpc3QobmFtZSkpIHtcXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmZXRjaChuYW1lKSlcXG4gICAgfVxcbiAgICByZXR1cm4ge307XFxuICB9LFxcbiAgc2V0KGlkLCBqc29uKSB7XFxuICAgIGxldCBuYW1lID0gdGhpcy5nZXROYW1lKGlkKTtcXG4gICAgc2F2ZUZpbGUobmFtZSwgSlNPTi5zdHJpbmdpZnkoanNvbiksIDApO1xcbiAgfSxcXG4gIGRlbChpZCkge1xcbiAgICBsZXQgbmFtZSA9IHRoaXMuZ2V0TmFtZShpZCk7XFxuICAgIGRlbGV0ZUZpbGUobmFtZSk7XFxuICB9LFxcbiAgZXhpc3QoaWQpIHtcXG4gICAgbGV0IG5hbWUgPSB0aGlzLmdldE5hbWUoaWQpO1xcbiAgICBpZiAoZmlsZUV4aXN0KG5hbWUpKSB7XFxuICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxuICB9XFxufVxcblxcbmxldCBlck9wdGlvbnMgPSB7XFxuICBnZXQoa2V5LCBkZWYpIHtcXG4gICAgaWYgKGtleSA9PSB1bmRlZmluZWQpIHtcXG4gICAgICByZXR1cm4gZXJJbmZvO1xcbiAgICB9XFxuICAgIHJldHVybiBlckluZm9ba2V5XSB8fCBkZWY7XFxuICB9LFxcbiAgc2V0KGtleSwgdmFsdWUpIHtcXG4gICAgZXJJbmZvW2tleV0gPSB2YWx1ZTtcXG4gICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImVySW5mb1xcXCIsIGVySW5mbyk7XFxuICB9XFxufVxcblxcblxcbiQuZXhwb3J0cyA9IHtcXG4gIGdldExlYWNoLFxcbiAgbGVhY2hsaXN0LFxcbiAgZXJSZWZyZXNoLFxcbiAgY2FjaGVNYW5hZ2UsXFxuICBpc0RhcmtNb2RlLFxcbiAgbmF0dXJhbFNvcnQsXFxuICB1c2luZ1NvcnQsXFxuICByZW1vdmVIdG1sVGFncyxcXG4gIGZvbnRzdHlsZSxcXG4gIGJhY2tDb2xvcixcXG4gIGlzVmFsaWRDb2xvcixcXG4gIGZpbmRMb25nZXN0RWxlbWVudCxcXG4gIGNvdW50VG90YWxCeXRlcyxcXG4gIGluc2VydEFycmF5QXQsXFxuICBoaXN0b3J5bG9nLFxcbiAgZXJPcHRpb25zLFxcbiAgZ2V0RUluZm8sXFxuICBzdWJzdHIsXFxuICBzdHJpbmdleCxcXG4gIGFycmF5ZXhcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmm7TmlrDml6Xlv5dcIixcInBhdGhcIjpcInVwZGF0ZVJlY29yZHNcIixcInJ1bGVcIjpcImpzOlxcbiQuZXhwb3J0cyA9IFt7XFxuICAgIHRpdGxlOiBcXFwiMjAyNC8wNy8wOSBNYXhWZXJzaW9uIDQ5XFxcIixcXG4gICAgcmVjb3JkczogW1xcbiAgICAgICAgXFxcIuKAmOKAmG5ld+KAmeKAme+8mlVJ566h55CG5aKe5Yqg5Li76aKY566h55CG44CCXFxcIlxcbiAgICBdXFxufSx7XFxuICAgIHRpdGxlOiBcXFwiMjAyNC8wNy8wOCBNYXhWZXJzaW9uIDQ4XFxcIixcXG4gICAgcmVjb3JkczogW1xcbiAgICAgICAgXFxcIuKAmOKAmG5ld+KAmeKAme+8mlVJ566h55CG5aKe5Yqg5LqM57qn57yT5a2Y5ZKM5Yi35paw6YCJ6aG544CCXFxcIlxcbiAgICBdXFxufSx7XFxuICAgIHRpdGxlOiBcXFwiMjAyNC8wNy8wNyBNYXhWZXJzaW9uIDQ3XFxcIixcXG4gICAgcmVjb3JkczogW1xcbiAgICAgICAgXFxcIuKAmOKAmG5ld+KAmeKAme+8muaQnOe0ouaUr+aMgei3s+i/h+S6jOe6p+OAglxcXCJcXG4gICAgXVxcbn0se1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDcvMDUgTWF4VmVyc2lvbiA0NlxcXCIsXFxuICAgIHJlY29yZHM6IFtcXG4gICAgICAgIFxcXCJvcHRpbWl6Ze+8muS8mOWMluS4gOS6m+e7huiKguOAglxcXCJcXG4gICAgXVxcbn0se1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDcvMDMgTWF4VmVyc2lvbiA0NVxcXCIsXFxuICAgIHJlY29yZHM6IFtcXG4gICAgICAgIFxcXCLigJjigJhuZXfigJnigJnvvJrmlK/mjIF0MOOAgXQx5o6l5Y+j44CCXFxcIlxcbiAgICBdXFxufSx7XFxuICAgIHRpdGxlOiBcXFwiMjAyNC8wNy8wMSBNYXhWZXJzaW9uIDQ0XFxcIixcXG4gICAgcmVjb3JkczogW1xcbiAgICAgICAgXFxcIuKAmOKAmG5ld+KAmeKAme+8muaUr+aMgXQ05o6l5Y+j44CCXFxcIixcXG4gICAgXVxcbn0se1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDYvMzAgTWF4VmVyc2lvbiA0M1xcXCIsXFxuICAgIHJlY29yZHM6IFtcXG4gICAgICAgIFxcXCJvcHRpbWl6Ze+8muS8mOWMluaWh+S7tuivu+WPlumAn+eOh+OAglxcXCIsXFxuICAgICAgICBcXFwib3B0aW1pemXvvJrkvJjljJbll4XmjqLjgIJcXFwiLFxcbiAgICBdXFxufSx7XFxuICAgIHRpdGxlOiBcXFwiMjAyNC8wNi8yNyBNYXhWZXJzaW9uIDQyXFxcIixcXG4gICAgcmVjb3JkczogW1xcbiAgICAgICAgXFxcIuKAmOKAmG5ld+KAmeKAme+8muaWsOWinumdkuWwkeW5tOaooeW8j+OAglxcXCIsXFxuICAgIF1cXG59LHtcXG4gICAgdGl0bGU6IFxcXCIyMDI0LzA2LzI2IE1heFZlcnNpb24gNDFcXFwiLFxcbiAgICByZWNvcmRzOiBbXFxuICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya5paw5LqM57qn55WM6Z2i44CCXFxcIixcXG4gICAgXVxcbn0se1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDYvMjMgTWF4VmVyc2lvbiA0MFxcXCIsXFxuICAgIHJlY29yZHM6IFtcXG4gICAgICAgIFxcXCLigJzigJxmaXjigJ3igJ3vvJrkv67lpI3pmaTnrKzkuIDpm4blpJbkuI3op6PmnpDnmoTpl67popjjgIJcXFwiLFxcbiAgICBdXFxufSx7XFxuICAgIHRpdGxlOiBcXFwiMjAyNC8wNi8yMiBNYXhWZXJzaW9uIDM5XFxcIixcXG4gICAgcmVjb3JkczogW1xcbiAgICAgICAgXFxcIuKAnOKAnGZpeOKAneKAne+8muS/ruWkjei3s+i/h+S6jOe6p+eahOWXheaOoumTvuaOpeS4jeato+ehruOAglxcXCIsXFxuICAgICAgICBcXFwi4oCc4oCcZml44oCd4oCd77ya5L+u5aSN6Lez6L+H5LqM57qn55qE6ZO+5o6l5Li656m644CCXFxcIixcXG4gICAgICAgIFxcXCJvcHRpbWl6Ze+8muiHquWKqOW8ueWHuuabtOaWsOaXpeW/l1xcXCIsXFxuICAgIF1cXG59LHtcXG4gICAgdGl0bGU6IFxcXCIyMDI0LzA2LzIxIE1heFZlcnNpb24gMzdcXFwiLFxcbiAgICByZWNvcmRzOiBbXFxuICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya5pSv5oyBaW5kZXguanMo6ZyA6KaB5pys5Zyw5YyF5L2c6ICF5YW85a655oCn57yW5YaZKeOAglxcXCIsXFxuICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya5aKe5Yqg5Y+C5pWw5pig5bCE6KGo44CCXFxcIixcXG4gICAgICAgIFxcXCLigJzigJxmaXjigJ3igJ3vvJrkv67lpI3phY3nva4ubWFwcGluZy50eHTlj6/og73kvJrmiqXplJnnmoRidWfjgIJcXFwiLFxcbiAgICBdXFxufSwge1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDYvMjAgTWF4VmVyc2lvbiAzM1xcXCIsXFxuICAgIHJlY29yZHM6IFtcXG4gICAgICAgIFxcXCLigJzigJxmaXjigJ3igJ3vvJrkv67lpI3pg6jliIZidWfjgIJcXFwiLFxcbiAgICBdXFxufSwge1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDYvMTcgTWF4VmVyc2lvbiAzMlxcXCIsXFxuICAgIHJlY29yZHM6IFtcXG4gICAgICAgIFxcXCLigJjigJhuZXfigJnigJnvvJrlop7liqDmjIl0YWfmkJzntKLjgIJcXFwiLFxcbiAgICAgICAgXFxcIuKAnOKAnGZpeOKAneKAne+8muS/ruWkjemDqOWIhua6kOS7juaQnOe0oui/m+WFpeivpue7humhteaKpemUmeOAglxcXCIsXFxuICAgICAgICBcXFwi4oCc4oCcZml44oCd4oCd77ya5L+u5aSN6YOo5YiG5rqQbGF6eei/lOWbnuepunVybOaXtuaKpemUmeOAglxcXCJcXG4gICAgXVxcbn0sIHtcXG4gICAgdGl0bGU6IFxcXCIyMDI0LzA2LzE2ICBNYXhWZXJzaW9uIDI5XFxcIixcXG4gICAgcmVjb3JkczogW1xcbiAgICAgICAgXFxcIuKAnOKAnGZpeOKAneKAne+8muWNh+e6p2RycHkuanPvvIzkv67lpI1nemlw5Ye95pWw44CCXFxcIlxcbiAgICBdXFxufSwge1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDYvMTUgIE1heFZlcnNpb24gMjhcXFwiLFxcbiAgICByZWNvcmRzOiBbXFxuICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya5aKe5YqgdWnnrqHnkIbjgIJcXFwiLFxcbiAgICAgICAgXFxcIuKAmOKAmG5ld+KAmeKAme+8muS4u+mhteWinuWKoOi3s+i/h+W9ouW8jygqKeS6jOe6p+mAiemhueOAglxcXCIsXFxuICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya6Kej5p6Q566h55CG5aKe5YqgZmxhZ+WIhuexu+OAglxcXCIsXFxuICAgICAgICBcXFwib3B0aW1pemXvvJrkvJjkvJjljJborqLpmIXmm7TmlrDnrZbnlaXjgIJcXFwiLFxcbiAgICBdXFxufSwge1xcbiAgICB0aXRsZTogXFxcIjIwMjQvMDYvMTIgIE1heFZlcnNpb24gMjZcXFwiLFxcbiAgICByZWNvcmRzOiBbXFxuICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya5Zyo5o2i5rqQ55WM6Z2i55qE6I+c5Y2V5Y+v5Lul5byA5ZCv5YiG5Lqr5pe25piv5ZCm5L2/55So57yW56CB44CCXFxcIixcXG4gICAgICAgIFxcXCJvcHRpbWl6Ze+8muWcqOmAiea6kOeVjOmdouWIt+aWsOmFjee9ruWQjuS8muWQjOatpeabtOaWsOaVsOmHj+aYvuekuuOAglxcXCIsXFxuICAgIF1cXG59LCB7XFxuICAgIHRpdGxlOiBcXFwiMjAyNC8wNi8xMCAgTWF4VmVyc2lvbiAyNVxcXCIsXFxuICAgIHJlY29yZHM6IFtcXG4gICAgICAgIFxcXCLigJjigJhuZXfigJnigJnvvJrlop7liqDmm7TmlrDml6Xlv5fjgIJcXFwiLFxcbiAgICAgICAgXFxcIuKAmOKAmG5ld+KAmeKAme+8mumAiea6kOmVv+aMieiPnOWNle+8jOWinuWKoOi3s+i9rOe9kemhte+8jOafpeeci+a6kOeggeOAglxcXCIsXFxuICAgICAgICBcXFwi4oCc4oCcZml44oCd4oCd77ya5L+u5aSN57yW6L6R6Kej5p6Q55WM6Z2i5rWL6K+VanPop6PmnpDkuIDnm7TlpLHotKXjgIJcXFwiLFxcbiAgICAgICAgXFxcIuKAnOKAnGZpeOKAneKAne+8muS/ruWkjWdpdGh1YuiuoumYhe+8jOS8muWIoOmZpOWFqOmDqOinhOWImeaWh+S7tuOAglxcXCIsXFxuICAgICAgICBcXFwi4oCc4oCcZml44oCd4oCd77ya5L+u5aSN6Kej5p6Q6LCD55So5aSx6LSl44CCXFxcIixcXG4gICAgICAgIFxcXCLigJzigJxmaXjigJ3igJ3vvJrkv67lpI3mm7TmjaLphY3nva7ml7bmsqHmnInlj4rml7bmuIXnqbpkcnB557yT5a2Y44CCXFxcIixcXG4gICAgICAgIFxcXCJvcHRpbWl6Ze+8muabtOaUueiuoumYheabtOaWsOetlueVpe+8jOS8muWIoOmZpOacrOWcsOWkseaViOa6kOOAglxcXCIsXFxuICAgICAgICBcXFwib3B0aW1pemXvvJrmm7TmlrBkcnB5Mi5qc+OAglxcXCIsXFxuICAgICAgICBcXFwib3B0aW1pemXvvJrkvJjljJbop6PmnpBmbGFn5Yy56YWN44CCXFxcIixcXG5cXG4gICAgXVxcbn0sIHtcXG4gICAgdGl0bGU6IFxcXCIyMDI0LzA2LzA5IE1heFZlcnNpb24gMjBcXFwiLFxcbiAgICByZWNvcmRzOiBbXFxuICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya5pSv5oyBcHJveHlfcnVsZeS7o+eQhuOAglxcXCIsXFxuICAgICAgICBcXFwi4oCc4oCcZml44oCd4oCd77ya5L+u5aSN5LqR55uY6ZO+5o6l5LiN6LCD5Y+W5LqR55uY566A44CCXFxcIixcXG4gICAgICAgIFxcXCLigJzigJxmaXjigJ3igJ3vvJrkv67lpI3lk5Tlk6nlvbHop4bkuI3og73kvb/nlKjop6PmnpDjgIJcXFwiLFxcbiAgICBdXFxufV07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJUNOmAgumFjeWZqFwiLFwicGF0aFwiOlwiVDRBZGFwdGVyXCIsXCJydWxlXCI6XCJmdW5jdGlvbiBUNEFkYXB0ZXIoc291cmNlKSB7XFxuICAgIHRoaXMuYXBpID0gc291cmNlLmFwaTtcXG4gICAgdGhpcy5leHQgPSBzb3VyY2UuZXh0IHx8IFxcXCJcXFwiO1xcbiAgICB0aGlzLnJlZGlyZWN0ID0gISFzb3VyY2UucmVkaXJlY3Q7XFxuICAgIHRoaXMucnVsZSA9IHtcXG4gICAgICAgIG5hbWU6IHNvdXJjZS5uYW1lLFxcbiAgICAgICAgaG9zdDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAg5LiA57qnOiBcXFwidHJ1ZVxcXCIsXFxuICAgICAgICDmjqjojZA6IFxcXCJ0cnVlXFxcIixcXG4gICAgICAgIOexu+WeizogXFxcIuW9seinhlxcXCIsXFxuICAgICAgICAvL+aooeadvzogXFxcIuiHquWKqFxcXCJcXG4gICAgfTtcXG4gICAgdGhpcy5jYWNoZUNsYXNzID0gbnVsbDtcXG4gICAgdGhpcy52b2RDb3VudCA9IDA7XFxufVxcbk9iamVjdC5hc3NpZ24oVDRBZGFwdGVyLnByb3RvdHlwZSwge1xcbiAgICBpbml0KCkge1xcbiAgICAgICAgdGhpcy5jYWNoZUNsYXNzID0gbnVsbDtcXG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5nZXRIb21lRGF0YSgpO1xcbiAgICAgICAgdGhpcy5ydWxlLuexu+WeiyA9IGRhdGEudHlwZSB8fCBcXFwi5b2x6KeGXFxcIjtcXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEubGlzdCkgJiYgZGF0YS5saXN0Lmxlbmd0aCA9PT0gMSAmJiBkYXRhLmxpc3RbMF0udm9kX25hbWUgPT09IFxcXCLmtYvor5VcXFwiKSB7XFxuICAgICAgICAgICAgZGVsZXRlIHRoaXMucnVsZS7mjqjojZA7XFxuICAgICAgICAgICAgZGF0YS5saXN0ID0gW107XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIGdldEhvbWVEYXRhKCkge1xcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVDbGFzcykgcmV0dXJuIHRoaXMuY2FjaGVDbGFzcztcXG4gICAgICAgIGxldCBob21lID0gSlNPTi5wYXJzZShmZXRjaChidWlsZFVybCh0aGlzLmFwaSwge1xcbiAgICAgICAgICAgIGV4dGVuZDogdGhpcy5leHQsXFxuICAgICAgICAgICAgZmlsdGVyOiBcXFwidHJ1ZVxcXCJcXG4gICAgICAgIH0pLCB7XFxuICAgICAgICAgICAgcmVkaXJlY3Q6IHRoaXMucmVkaXJlY3RcXG4gICAgICAgIH0pKTtcXG4gICAgICAgIHRoaXMuY2FjaGVDbGFzcyA9IGhvbWU7XFxuXFxuICAgICAgICByZXR1cm4gaG9tZTtcXG4gICAgfSxcXG4gICAgaG9tZVZvZCgpIHtcXG4gICAgICAgIC8qaWYodGhpcy52b2RDb3VudCl7XFxuICAgICAgICAgICAgdGhpcy5pbml0KCk7XFxuICAgICAgICB9Ki9cXG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5nZXRIb21lRGF0YSgpO1xcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICBsaXN0OiBkYXRhLmxpc3QgfHwgW11cXG4gICAgICAgIH0pO1xcbiAgICAgICAgdGhpcy52b2RDb3VudCsrO1xcbiAgICB9LFxcbiAgICBob21lKCkge1xcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0SG9tZURhdGEoKSk7XFxuICAgIH0sXFxuICAgIGNhdGVnb3J5KHRpZCwgcGcsIGZpbHRlciwgZXh0ZW5kKSB7XFxuICAgICAgICByZXR1cm4gZmV0Y2goYnVpbGRVcmwodGhpcy5hcGksIHtcXG4gICAgICAgICAgICBhYzogXFxcInZpZGVvbGlzdFxcXCIsXFxuICAgICAgICAgICAgdDogdGlkLFxcbiAgICAgICAgICAgIHBnOiBcXFwiXFxcIiArIHBnLFxcbiAgICAgICAgICAgIGV4dGVuZDogdGhpcy5leHQsXFxuICAgICAgICAgICAgZXh0OiBleHRlbmQgPyBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZXh0ZW5kKSkgOiBcXFwiXFxcIlxcbiAgICAgICAgfSksIHtcXG4gICAgICAgICAgICByZWRpcmVjdDogdGhpcy5yZWRpcmVjdFxcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIGRldGFpbCh2b2RfdXJsKSB7XFxuICAgICAgICByZXR1cm4gZmV0Y2goYnVpbGRVcmwodGhpcy5hcGksIHtcXG4gICAgICAgICAgICBhYzogXFxcImRldGFpbFxcXCIsXFxuICAgICAgICAgICAgaWRzOiB2b2RfdXJsLFxcbiAgICAgICAgICAgIGV4dGVuZDogdGhpcy5leHQsXFxuICAgICAgICB9KSwge1xcbiAgICAgICAgICAgIHJlZGlyZWN0OiB0aGlzLnJlZGlyZWN0XFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgcGxheShmbGFnLCBpZCkge1xcbiAgICAgICAgcmV0dXJuIGZldGNoKGJ1aWxkVXJsKHRoaXMuYXBpLCB7XFxuICAgICAgICAgICAgLy9hYzogXFxcImRldGFpbFxcXCIsXFxuICAgICAgICAgICAgZmxhZzogZmxhZyxcXG4gICAgICAgICAgICBwbGF5OiBpZFxcbiAgICAgICAgfSksIHtcXG4gICAgICAgICAgICByZWRpcmVjdDogdGhpcy5yZWRpcmVjdFxcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIHNlYXJjaCh3ZCwgcXVpY2ssIHBnKSB7XFxuICAgICAgICByZXR1cm4gZmV0Y2goYnVpbGRVcmwodGhpcy5hcGksIHtcXG4gICAgICAgICAgICB3ZDogd2QsXFxuICAgICAgICAgICAgZXh0ZW5kOiB0aGlzLmV4dCxcXG4gICAgICAgICAgICBwZzogcGdcXG4gICAgICAgIH0pLCB7XFxuICAgICAgICAgICAgcmVkaXJlY3Q6IHRoaXMucmVkaXJlY3RcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcbiAgICBnZXRSdWxlKGtleSkge1xcbiAgICAgICAgcmV0dXJuIGtleSA/IHRoaXMucnVsZVtrZXldIDogdGhpcy5ydWxlO1xcbiAgICB9LFxcbiAgICBydW5NYWluKCkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJcXFwiO1xcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzID0gVDRBZGFwdGVyO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiVDDpgILphY3lmahcIixcInBhdGhcIjpcIlQwQWRhcHRlclwiLFwicnVsZVwiOlwiZnVuY3Rpb24gVDBBZGFwdGVyKHNvdXJjZSkge1xcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcXG4gICAgdGhpcy5hcGkgPSBzb3VyY2UuYXBpO1xcbiAgICB0aGlzLmNhdGVnb3J5ZmlsdGVyID0gc291cmNlLmNhdGVnb3JpZXM7XFxuICAgIHRoaXMucnVsZSA9IHtcXG4gICAgICAgIG5hbWU6IHNvdXJjZS5uYW1lLFxcbiAgICAgICAgaG9zdDogc291cmNlLmFwaSxcXG4gICAgICAgIOS4gOe6pzogXFxcInRydWVcXFwiLFxcbiAgICAgICAg5o6o6I2QOiBcXFwidHJ1ZVxcXCIsXFxuICAgICAgICDnsbvlnos6IFxcXCLlvbHop4ZcXFwiLFxcbiAgICAgICAgLy/mqKHmnb86IFxcXCLoh6rliqhcXFwiXFxuICAgIH07XFxuICAgIHRoaXMuY2FjaGVDbGFzcyA9IG51bGw7XFxufVxcbk9iamVjdC5hc3NpZ24oVDBBZGFwdGVyLnByb3RvdHlwZSwge1xcbiAgICBpbml0KCkge1xcbiAgICAgICAgdGhpcy5jYWNoZUNsYXNzID0gbnVsbDtcXG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5nZXRIb21lRGF0YSgpO1xcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEubGlzdCkgfHwgIWRhdGEubGlzdC5sZW5ndGgpIHtcXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5ydWxlLuaOqOiNkDtcXG4gICAgICAgICAgICBkYXRhLmxpc3QgPSBbXTtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgZ2V0SG9tZURhdGEoKSB7XFxuICAgICAgICBpZiAodGhpcy5jYWNoZUNsYXNzKSByZXR1cm4gdGhpcy5jYWNoZUNsYXNzO1xcbiAgICAgICAgbGV0IHhtbCA9IGZldGNoKGJ1aWxkVXJsKHRoaXMuYXBpLCB7XFxuICAgICAgICAgICAgYWM6IFxcXCJjbGFzc1xcXCJcXG4gICAgICAgIH0pKS5yZXBsYWNlKC9cXFxcPC4qP3htbC4qP1xcXFw+LywgXFxcIlxcXCIpO1xcbiAgICAgICAgbGV0IGhvbWUgPSB7XFxuICAgICAgICAgICAgbGlzdDogW10sXFxuICAgICAgICAgICAgY2xhc3M6IFtdXFxuICAgICAgICB9O1xcbiAgICAgICAgbGV0IGhvbWVYbWwgPSBuZXcgWE1MKHhtbCk7XFxuICAgICAgICBmb3IgZWFjaChsZXQgaXRlbSBpbiBob21lWG1sLmxpc3QudmlkZW8pIHtcXG4gICAgICAgICAgICBob21lLmxpc3QucHVzaCh7XFxuICAgICAgICAgICAgICAgIHZvZF9pZDogaXRlbS5pZC50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICB2b2RfbmFtZTogaXRlbS5uYW1lLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgICAgIHZvZF90aW1lOiBpdGVtLmxhc3QudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICAgICAgdHlwZV9pZDogaXRlbS50aWQudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICAgICAgdm9kX3JlbWFya3M6IGl0ZW0ubm90ZS50b1N0cmluZygpXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBmb3IgZWFjaChsZXQgaXRlbSBpbiBob21lWG1sLmNsYXNzLnR5KSB7XFxuICAgICAgICAgICAgaG9tZS5jbGFzcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdHlwZV9pZDogaXRlbS5AaWQsXFxuICAgICAgICAgICAgICAgIHR5cGVfbmFtZTogaXRlbS50b1N0cmluZygpLFxcblxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaG9tZS5jbGFzcykgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmNhdGVnb3J5ZmlsdGVyKSkge1xcbiAgICAgICAgICAgIGhvbWUuY2xhc3MgPSBob21lLmNsYXNzLmZpbHRlcih2ID0+IHRoaXMuY2F0ZWdvcnlmaWx0ZXIuaW5jbHVkZXModi50eXBlX25hbWUpKVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgdGhpcy5jYWNoZUNsYXNzID0gaG9tZTtcXG5cXG4gICAgICAgIHJldHVybiBob21lO1xcbiAgICB9LFxcbiAgICBob21lVm9kKCkge1xcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmdldEhvbWVEYXRhKCk7XFxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgIGxpc3Q6IGRhdGEubGlzdCB8fCBbXVxcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIGhvbWUoKSB7XFxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRIb21lRGF0YSgpKTtcXG4gICAgfSxcXG4gICAgY2F0ZWdvcnkodGlkLCBwZywgZmlsdGVyLCBleHRlbmQpIHtcXG4gICAgICAgIGxldCB4bWwgPSBmZXRjaChidWlsZFVybCh0aGlzLmFwaSwge1xcbiAgICAgICAgICAgIGFjOiBcXFwidmlkZW9saXN0XFxcIixcXG4gICAgICAgICAgICB0OiB0aWQsXFxuICAgICAgICAgICAgcGc6IFxcXCJcXFwiICsgcGdcXG4gICAgICAgIH0pKS5yZXBsYWNlKC9cXFxcPC4qP3htbC4qP1xcXFw+LywgXFxcIlxcXCIpO1xcbiAgICAgICAgbGV0IGhvbWVYbWwgPSBuZXcgWE1MKHhtbCk7XFxuICAgICAgICBsZXQgbGlzdCA9IFtdO1xcbiAgICAgICAgZm9yIGVhY2gobGV0IGl0ZW0gaW4gaG9tZVhtbC5saXN0LnZpZGVvKSB7XFxuICAgICAgICAgICAgbGlzdC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdm9kX2lkOiBpdGVtLmlkLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgICAgIHZvZF9uYW1lOiBpdGVtLm5hbWUudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICAgICAgdm9kX3RpbWU6IGl0ZW0ubGFzdC50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICB2b2RfcGljOiBpdGVtLnBpYy50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICB2b2RfcmVtYXJrczogaXRlbS5ub3RlLnRvU3RyaW5nKClcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgbGlzdFxcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIGRldGFpbCh2b2RfdXJsKSB7XFxuICAgICAgICBsZXQgeG1sID0gZmV0Y2goYnVpbGRVcmwodGhpcy5hcGksIHtcXG4gICAgICAgICAgICBhYzogXFxcImRldGFpbFxcXCIsXFxuICAgICAgICAgICAgaWRzOiB2b2RfdXJsLFxcbiAgICAgICAgfSkpLnJlcGxhY2UoL1xcXFw8Lio/eG1sLio/XFxcXD4vLCBcXFwiXFxcIik7XFxuICAgICAgICBsZXQgaG9tZVhtbCA9IG5ldyBYTUwoeG1sKTtcXG4gICAgICAgIGxldCBsaXN0ID0gW107XFxuICAgICAgICBmb3IgZWFjaChsZXQgaXRlbSBpbiBob21lWG1sLmxpc3QudmlkZW8pIHtcXG4gICAgICAgICAgICBsZXQgcmVzaXRlbSA9IHtcXG4gICAgICAgICAgICAgICAgdm9kX2lkOiBpdGVtLmlkLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgICAgIHZvZF9uYW1lOiBpdGVtLm5hbWUudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICAgICAgdm9kX3RpbWU6IGl0ZW0ubGFzdC50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICB2b2RfcGljOiBpdGVtLnBpYy50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICB2b2RfcmVtYXJrczogaXRlbS5ub3RlLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgICAgIHZvZF9jb250ZW50OiBpdGVtLmRlcy50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICB2b2RfYWN0b3I6IGl0ZW0uYWN0b3IudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICAgICAgdm9kX2RpcmVjdG9yOiBpdGVtLmRpcmVjdG9yLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBsZXQgZnJvbSA9IFtdO1xcbiAgICAgICAgICAgIGxldCBwbGF5ID0gW107XFxuICAgICAgICAgICAgZm9yIGVhY2gobGV0IHBsYXlMaXN0SXRlbSBpbiBpdGVtLmRsLmRkKSB7XFxuICAgICAgICAgICAgICAgIGZyb20ucHVzaChwbGF5TGlzdEl0ZW0uQGZsYWcpO1xcbiAgICAgICAgICAgICAgICBwbGF5LnB1c2gocGxheUxpc3RJdGVtLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXNpdGVtLnZvZF9wbGF5X2Zyb20gPSBmcm9tLmpvaW4oXFxcIiQkJFxcXCIpO1xcbiAgICAgICAgICAgIHJlc2l0ZW0udm9kX3BsYXlfdXJsID0gcGxheS5qb2luKFxcXCIkJCRcXFwiKTtcXG4gICAgICAgICAgICBsaXN0LnB1c2gocmVzaXRlbSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgIGxpc3RcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcbiAgICBwbGF5KGZsYWcsIGlucHV0KSB7XFxuICAgICAgICBsZXQgcGFyc2VfdXJsID0gdGhpcy5zb3VyY2UucGxheXVybCB8fCBcXFwiXFxcIjtcXG4gICAgICAgIGlmICgvXFxcXC4obTN1OHxtcDQpLy50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIHBhcnNlOiAwLFxcbiAgICAgICAgICAgICAgICB1cmw6IGlucHV0XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlmIChwYXJzZV91cmwuc3RhcnRzV2l0aCgnanNvbjonKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgcHVybCA9IHBhcnNlX3VybC5yZXBsYWNlKCdqc29uOicsICcnKSArIGlucHV0O1xcbiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QocHVybCk7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlOiAwLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogSlNPTi5wYXJzZShodG1sKS51cmxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaW5wdXRcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBwYXJzZV91cmwgKyBpbnB1dFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHNlYXJjaCh3ZCwgcXVpY2ssIHBnKSB7XFxuICAgICAgICBsZXQgeG1sID0gZmV0Y2goYnVpbGRVcmwodGhpcy5hcGksIHtcXG4gICAgICAgICAgICB3ZDogd2QsXFxuICAgICAgICAgICAgcGc6IFxcXCJcXFwiICsgcGdcXG4gICAgICAgIH0pKS5yZXBsYWNlKC9cXFxcPC4qP3htbC4qP1xcXFw+LywgXFxcIlxcXCIpO1xcbiAgICAgICAgbGV0IGhvbWVYbWwgPSBuZXcgWE1MKHhtbCk7XFxuICAgICAgICBsZXQgbGlzdCA9IFtdO1xcbiAgICAgICAgZm9yIGVhY2gobGV0IGl0ZW0gaW4gaG9tZVhtbC5saXN0LnZpZGVvKSB7XFxuICAgICAgICAgICAgbGlzdC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdm9kX2lkOiBpdGVtLmlkLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgICAgIHZvZF9uYW1lOiBpdGVtLm5hbWUudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICAgICAgdm9kX3RpbWU6IGl0ZW0ubGFzdC50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICB2b2RfcGljOiBpdGVtLnBpYy50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICB2b2RfcmVtYXJrczogaXRlbS5ub3RlLnRvU3RyaW5nKClcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgbGlzdFxcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIGdldFJ1bGUoa2V5KSB7XFxuICAgICAgICByZXR1cm4ga2V5ID8gdGhpcy5ydWxlW2tleV0gOiB0aGlzLnJ1bGU7XFxuICAgIH0sXFxuICAgIHJ1bk1haW4oKSB7XFxuICAgICAgICByZXR1cm4gXFxcIlxcXCI7XFxuICAgIH1cXG59KTtcXG4kLmV4cG9ydHMgPSBUMEFkYXB0ZXI7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJUMemAgumFjeWZqFwiLFwicGF0aFwiOlwiVDFBZGFwdGVyXCIsXCJydWxlXCI6XCJmdW5jdGlvbiBUMUFkYXB0ZXIoc291cmNlKSB7XFxuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xcbiAgICB0aGlzLmFwaSA9IHNvdXJjZS5hcGk7XFxuICAgIHRoaXMuY2F0ZWdvcnlmaWx0ZXIgPSBzb3VyY2UuY2F0ZWdvcmllcztcXG4gICAgdGhpcy5ydWxlID0ge1xcbiAgICAgICAgbmFtZTogc291cmNlLm5hbWUsXFxuICAgICAgICBob3N0OiBzb3VyY2UuYXBpLFxcbiAgICAgICAg5LiA57qnOiBcXFwidHJ1ZVxcXCIsXFxuICAgICAgICDmjqjojZA6IFxcXCJ0cnVlXFxcIixcXG4gICAgICAgIOexu+WeizogXFxcIuW9seinhlxcXCIsXFxuICAgICAgICAvL+aooeadvzogXFxcIuiHquWKqFxcXCJcXG4gICAgfTtcXG4gICAgdGhpcy5jYWNoZUNsYXNzID0gbnVsbDtcXG59XFxuT2JqZWN0LmFzc2lnbihUMUFkYXB0ZXIucHJvdG90eXBlLCB7XFxuICAgIGluaXQoKSB7XFxuICAgICAgICB0aGlzLmNhY2hlQ2xhc3MgPSBudWxsO1xcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmdldEhvbWVEYXRhKCk7XFxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5saXN0KSB8fCAhZGF0YS5saXN0Lmxlbmd0aCkge1xcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJ1bGUu5o6o6I2QO1xcbiAgICAgICAgICAgIGRhdGEubGlzdCA9IFtdO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBnZXRIb21lRGF0YSgpIHtcXG4gICAgICAgIGlmICh0aGlzLmNhY2hlQ2xhc3MpIHJldHVybiB0aGlzLmNhY2hlQ2xhc3M7XFxuICAgICAgICBsZXQgaG9tZSA9IEpTT04ucGFyc2UoZmV0Y2goYnVpbGRVcmwodGhpcy5hcGksIHtcXG4gICAgICAgICAgICBhYzogXFxcImNsYXNzXFxcIlxcbiAgICAgICAgfSkpKTtcXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhvbWUuY2xhc3MpICYmIEFycmF5LmlzQXJyYXkodGhpcy5jYXRlZ29yeWZpbHRlcikpIHtcXG4gICAgICAgICAgICBob21lLmNsYXNzID0gaG9tZS5jbGFzcy5maWx0ZXIodiA9PiB0aGlzLmNhdGVnb3J5ZmlsdGVyLmluY2x1ZGVzKHYudHlwZV9uYW1lKSlcXG4gICAgICAgIH1cXG4gICAgICAgIHRoaXMuY2FjaGVDbGFzcyA9IGhvbWU7XFxuXFxuICAgICAgICByZXR1cm4gaG9tZTtcXG4gICAgfSxcXG4gICAgaG9tZVZvZCgpIHtcXG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5nZXRIb21lRGF0YSgpO1xcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICBsaXN0OiBkYXRhLmxpc3QgfHwgW11cXG4gICAgICAgIH0pO1xcbiAgICB9LFxcbiAgICBob21lKCkge1xcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0SG9tZURhdGEoKSk7XFxuICAgIH0sXFxuICAgIGNhdGVnb3J5KHRpZCwgcGcsIGZpbHRlciwgZXh0ZW5kKSB7XFxuICAgICAgICByZXR1cm4gZmV0Y2goYnVpbGRVcmwodGhpcy5hcGksIHtcXG4gICAgICAgICAgICBhYzogXFxcInZpZGVvbGlzdFxcXCIsXFxuICAgICAgICAgICAgdDogdGlkLFxcbiAgICAgICAgICAgIHBnOiBcXFwiXFxcIiArIHBnXFxuICAgICAgICB9KSk7XFxuICAgIH0sXFxuICAgIGRldGFpbCh2b2RfdXJsKSB7XFxuICAgICAgICByZXR1cm4gZmV0Y2goYnVpbGRVcmwodGhpcy5hcGksIHtcXG4gICAgICAgICAgICBhYzogXFxcImRldGFpbFxcXCIsXFxuICAgICAgICAgICAgaWRzOiB2b2RfdXJsLFxcbiAgICAgICAgfSkpO1xcbiAgICB9LFxcbiAgICBwbGF5KGZsYWcsIGlucHV0KSB7XFxuICAgICAgICBsZXQgcGFyc2VfdXJsID0gdGhpcy5zb3VyY2UucGxheXVybCB8fCBcXFwiXFxcIjtcXG4gICAgICAgIGlmICgvXFxcXC4obTN1OHxtcDQpLy50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIHBhcnNlOiAwLFxcbiAgICAgICAgICAgICAgICB1cmw6IGlucHV0XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlmIChwYXJzZV91cmwuc3RhcnRzV2l0aCgnanNvbjonKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgcHVybCA9IHBhcnNlX3VybC5yZXBsYWNlKCdqc29uOicsICcnKSArIGlucHV0O1xcbiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QocHVybCk7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlOiAwLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogSlNPTi5wYXJzZShodG1sKS51cmxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaW5wdXRcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBwYXJzZV91cmwgKyBpbnB1dFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHNlYXJjaCh3ZCwgcXVpY2ssIHBnKSB7XFxuICAgICAgICByZXR1cm4gZmV0Y2goYnVpbGRVcmwodGhpcy5hcGksIHtcXG4gICAgICAgICAgICB3ZDogd2QsXFxuICAgICAgICAgICAgcGc6IFxcXCJcXFwiICsgcGdcXG4gICAgICAgIH0pKTtcXG4gICAgfSxcXG4gICAgZ2V0UnVsZShrZXkpIHtcXG4gICAgICAgIHJldHVybiBrZXkgPyB0aGlzLnJ1bGVba2V5XSA6IHRoaXMucnVsZTtcXG4gICAgfSxcXG4gICAgcnVuTWFpbigpIHtcXG4gICAgICAgIHJldHVybiBcXFwiXFxcIjtcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IFQxQWRhcHRlcjtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuS6jOe6p+aWueazlVwiLFwicGF0aFwiOlwibWV0aG9kc19lclwiLFwicnVsZVwiOlwianM6XFxubGV0IHtcXG4gIHVpX2NvbmZpZyxcXG59ID0gJC5yZXF1aXJlKFxcXCJVSU1hbmFnZT9ydWxlXFxcIitNWV9SVUxFLnRpdGxlKTtcXG5sZXQgZXIgPSB1aV9jb25maWcuZXI7XFxuXFxubGV0IHsgc3Vic3RyIH0gPSAkLnJlcXVpcmUoXFxcIm1ldGhvZHM/cnVsZVxcXCIrTVlfUlVMRS50aXRsZSk7XFxuXFxuZnVuY3Rpb24gcmVwbGFjZVRhZ3MoaHRtbFN0cmluZywgb2xkVGFnLCBuZXdUYWcpIHtcXG4gIC8vIOWIm+W7uuato+WImeihqOi+vuW8j++8jOWMuemFjeW8gOWktOeahDxvbGRUYWc+5ZKMPC9vbGRUYWc+5qCH562+XFxuICB2YXIgcmVnRXhwU3RhcnQgPSBuZXcgUmVnRXhwKCc8JyArIG9sZFRhZyArICdbXj5dKj4nLCAnZycpO1xcbiAgdmFyIHJlZ0V4cEVuZCA9IG5ldyBSZWdFeHAoJzxcXFxcLycgKyBvbGRUYWcgKyAnPicsICdnJyk7XFxuICAvLyDmm7/mjaLlvIDlpLTnmoQ8b2xkVGFnPuagh+etvuS4ujxuZXdUYWc+5qCH562+XFxuICB2YXIgbmV3SHRtbFN0cmluZyA9IGh0bWxTdHJpbmcucmVwbGFjZShyZWdFeHBTdGFydCwgJzwnICsgbmV3VGFnICsgJz4nKTtcXG4gIC8vIOabv+aNoumXreWQiOeahDwvb2xkVGFnPuagh+etvuS4ujwvbmV3VGFnPuagh+etvlxcbiAgbmV3SHRtbFN0cmluZyA9IG5ld0h0bWxTdHJpbmcucmVwbGFjZShyZWdFeHBFbmQsICc8LycgKyBuZXdUYWcgKyAnPicpO1xcbiAgcmV0dXJuIG5ld0h0bWxTdHJpbmc7XFxufVxcblxcbi8v6aOO5qC8Me+8mueugOS7i1xcbmZ1bmN0aW9uIHNldERlc2MxKGFyciwgZGVzYywgbnVtKSB7XFxuICAvL2xvZyhkZXNjKVxcbiAgaWYgKGRlc2MgPT0gdW5kZWZpbmVkKSB7XFxuICAgIHJldHVybjtcXG4gIH1cXG4gIGRlc2MgPSBkZXNjLmNvbnN0cnVjdG9yID09IEFycmF5ID8gZGVzYy5qb2luKCc8YnI+JykgOiBkZXNjO1xcbiAgaWYgKGRlc2MucmVwbGFjZSgvKDxicj58XFxcXHMrfDxcXFxcLz9wPnwmbmJzcDspL2csICcnKS5sZW5ndGggPT0gMCkge1xcbiAgICByZXR1cm47XFxuICB9XFxuXFxuICBjb25zdCBtYXJrID0gJ2Rlc2MnO1xcbiAgbnVtID0gdHlwZW9mIChudW0pID09ICd1bmRlZmluZWQnID8gMTAwIDogbnVtXFxuICBkZXNjID0gZGVzYy5zdGFydHNXaXRoKCfjgIDjgIAnKSA/IGRlc2MgOiAn44CA44CAJyArIGRlc2M7XFxuICBkZXNjID0gZGVzYy5yZXBsYWNlKC8nL2csIFxcXCImIzM5O1xcXCIpO1xcbiAgZGVzYyA9IGRlc2MucmVwbGFjZSgvXFxcXHJcXFxcbi9nLCBcXFwiPGJyPlxcXCIpO1xcbiAgZGVzYyA9IGRlc2MucmVwbGFjZSgvXFxcXG4vZywgXFxcIjxicj5cXFwiKTtcXG4gIGRlc2MgPSByZXBsYWNlVGFncyhkZXNjLCAncCcsICdzcGFuJyk7XFxuICBsZXQgc2Rlc2MgPSBzdWJzdHIoZGVzYywgbnVtKTtcXG5cXG4gIHZhciBjb2xvcnMgPSB7XFxuICAgIHNob3c6IFxcXCJibGFja1xcXCIsXFxuICAgIGhpZGU6IFxcXCJncmV5XFxcIlxcbiAgfVxcblxcbiAgdmFyIGxhenkgPSAkKGAjbm9Mb2FkaW5nI2ApLmxhenlSdWxlKChkYywgc2RjLCBtLCBjcykgPT4ge1xcbiAgICB2YXIgc2hvdyA9IHN0b3JhZ2UwLmdldEl0ZW0obSwgJzAnKTtcXG4gICAgdmFyIHRpdGxlID0gZmluZEl0ZW0oJ2Rlc2MnKS50aXRsZTtcXG4gICAgdmFyIHJlID0gLyg8XFxcXC9zbWFsbD48YnI+Lio/PikuKy9nO1xcbiAgICB2YXIgZXhwID0gJ+WxleW8gDonO1xcbiAgICB2YXIgcmV0ID0gJ+aUtui1tzonO1xcbiAgICBpZiAoc2hvdyA9PSAnMScpIHtcXG4gICAgICB1cGRhdGVJdGVtKCdkZXNjJywge1xcbiAgICAgICAgdGl0bGU6IHRpdGxlXFxuICAgICAgICAgIC5yZXBsYWNlKHJldCwgZXhwKVxcbiAgICAgICAgICAucmVwbGFjZShyZSwgJyQxJyArIHNkYyArICc8L3NtYWxsPicpXFxuICAgICAgICAgIC5yZXBsYWNlKC8oPFxcXFwvc21hbGw+PGJyPlxcXFw8Zm9udCBjb2xvcj1cXFwiKS4qPyhcXFwiPikvLCAnJDEnICsgY3MuaGlkZSArICckMicpXFxuXFxuICAgICAgfSlcXG4gICAgICBzdG9yYWdlMC5zZXRJdGVtKG0sICcwJyk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgdXBkYXRlSXRlbSgnZGVzYycsIHtcXG4gICAgICAgIHRpdGxlOiB0aXRsZVxcbiAgICAgICAgICAucmVwbGFjZShleHAsIHJldClcXG4gICAgICAgICAgLnJlcGxhY2UocmUsICckMScgKyBkYyArICc8L3NtYWxsPicpXFxuICAgICAgICAgIC5yZXBsYWNlKC8oPFxcXFwvc21hbGw+PGJyPlxcXFw8Zm9udCBjb2xvcj1cXFwiKS4qPyhcXFwiPikvLCAnJDEnICsgY3Muc2hvdyArICckMicpXFxuICAgICAgfSlcXG4gICAgICBzdG9yYWdlMC5zZXRJdGVtKG0sICcxJyk7XFxuICAgIH1cXG4gICAgcmV0dXJuIGBoaWtlcjovL2VtcHR5YFxcbiAgfSwgZGVzYywgc2Rlc2MsIG1hcmssIGNvbG9ycylcXG4gIHZhciBzYyA9IHN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKSA9PSAnMCcgPyAn5bGV5byAOicgOiAn5pS26LW3Oic7XFxuICB2YXIgZGMgPSBzdG9yYWdlMC5nZXRJdGVtKG1hcmssICcwJykgPT0gJzAnID8gc2Rlc2MgOiBkZXNjO1xcbiAgdmFyIGNzID0gc3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpID09ICcwJyA/IGNvbG9ycy5oaWRlIDogY29sb3JzLnNob3c7XFxuICBhcnIucHVzaCh7XFxuICAgIHRpdGxlOiAnJyArICc8Yj48Zm9udCBjb2xvcj1cXFwiIzA5OEFDMVxcXCI+4oi35Ymn5oOF566A5LuLXFx0PC9mb250PjwvYj4nICsgXFxcIjxzbWFsbD48YSBzdHlsZT0ndGV4dC1kZWNvcmF0aW9uOiBub25lOycgaHJlZj0nXFxcIiArIGxhenkgKyBcXFwiJz5cXFwiICsgc2MgKyAnPC9hPjwvc21hbGw+PGJyPjxmb250IGNvbG9yPVxcXCInICsgY3MgKyAnXFxcIj4nICsgYCR7ZGN9YCArICc8L3NtYWxsPicsXFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICBpZDogJ2Rlc2MnLFxcbiAgICAgIGxpbmVTcGFjaW5nOiA2LFxcbiAgICAgIHRleHRTaXplOiAxNSxcXG4gICAgICBsaW5lVmlzaWJsZTogdHJ1ZSxcXG4gICAgfVxcbiAgfSlcXG59XFxuLy/po47moLwy77ya566A5LuLXFxuZnVuY3Rpb24gc2V0RGVzYzIoYXJyLCBkZXNjKSB7XFxuICAvLyDlpoLmnpxkZXNj5pyq5a6a5LmJ77yM5YiZ55u05o6l6L+U5ZueXFxuICBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XFxuICAvLyDnoa7kv51kZXNj5piv5a2X56ym5Liy77yM5aaC5Li65pWw57uE5YiZ55SoPGJyPui/nuaOpVxcbiAgZGVzYyA9IEFycmF5LmlzQXJyYXkoZGVzYykgPyBkZXNjLmpvaW4oXFxcIjxicj5cXFwiKSA6IFN0cmluZyhkZXNjKTtcXG4gIC8vIOWmguaenGRlc2PljrvpmaTnqbrnmb3lkozmjaLooYzlkI7kuLrnqbrvvIzlkJFk5re75Yqg56m655m96aG55bm26L+U5ZueXFxuICBpZiAoIWRlc2MucmVwbGFjZSgvKDxicj58XFxcXHMrKS9nLCBcXFwiXFxcIikpIHtcXG4gICAgZC5wdXNoKFxcbiAgICAgIHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYmlnX2JsYW5rX2Jsb2NrXFxcIlxcbiAgICAgIH0sXFxuICAgICAge1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJiaWdfYmxhbmtfYmxvY2tcXFwiXFxuICAgICAgfVxcbiAgICApO1xcbiAgICByZXR1cm47XFxuICB9XFxuICBjb25zdCBDb2xvciA9IGVyLue6v+i3r+minOiJsjtcXG4gIGxldCBlbW9qaVJlZyA9IC9bXFxcXHVEODNDfFxcXFx1RDgzRHxcXFxcdUQ4M0VdW1xcXFx1REMwMC1cXFxcdURGRkZdW1xcXFx1MjAwRHxcXFxcdUZFMEZdfFtcXFxcdUQ4M0N8XFxcXHVEODNEfFxcXFx1RDgzRV1bXFxcXHVEQzAwLVxcXFx1REZGRl18WzAtOXwqfCNdXFxcXHVGRTBGXFxcXHUyMEUzfFswLTl8I11cXFxcdTIwRTN8W1xcXFx1MjAzQy1cXFxcdTMyOTldXFxcXHVGRTBGXFxcXHUyMDBEfFtcXFxcdTIwM0MtXFxcXHUzMjk5XVxcXFx1RkUwRnxbXFxcXHUyMTIyLVxcXFx1MkI1NV18XFxcXHUzMDNEfFtcXFxcQTl8XFxcXEFFXVxcXFx1MzAzMHxcXFxcdUE5fFxcXFx1QUV8XFxcXHUzMDMwL2dpO1xcbiAgLy8g6KeE6IyD5YyWZGVzY++8muabv+aNoueJueWumuWtl+espu+8jOenu+mZpOihqOaDheespuWPt1xcbiAgbGV0IGRlc0Rlc2MgPSBkZXNjXFxuICAgIC5yZXBsYWNlKC9zKi9nLCBcXFwiXFxcIilcXG4gICAgLnJlcGxhY2UoLyd8W1xcXFxyXFxcXG5dL2csIFxcXCI8YnI+XFxcIilcXG4gICAgLnJlcGxhY2UoLzxbXjw+XSs+fOeugOS7i++8mnzor6bmg4V8L2csIFxcXCJcXFwiKVxcbiAgICAucmVwbGFjZShlbW9qaVJlZywgXFxcIlxcXCIpO1xcbiAgLy8g5p6E5bu65bm25o6o5YWl5o+P6L+w6aG56IezZFxcbiAgYXJyLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuW9seeJh+eugOS7i1xcXCIsXFxuICAgIGRlc2M6IGA8c21hbGw+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiAke0NvbG9yfVxcXCI+5bGV5byAPj48L3NwYW4+PC9zbWFsbD5gLFxcbiAgICBpbWc6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2pqLnN2Z1xcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShcXG4gICAgICAoamppZCwgZGVjaWQsIGRlc1RleHQsIENvbG9yKSA9PiB7XFxuICAgICAgICBjb25zdCBhY3Rpb24gPSBnZXRNeVZhcihcXFwiampzXFxcIiwgXFxcIuWxleW8gFxcXCIpID09PSBcXFwi5bGV5byAXFxcIiA/IFxcXCLmlLbotbdcXFwiIDogXFxcIuWxleW8gFxcXCI7XFxuICAgICAgICBwdXRNeVZhcihcXFwiampzXFxcIiwgYWN0aW9uKTtcXG5cXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBqamlkXFxuICAgICAgICAgIH0sXFxuICAgICAgICAgIGRlc2M6IGA8c21hbGw+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiAke0NvbG9yfVxcXCI+JHthY3Rpb259Pj48L3NwYW4+PC9zbWFsbD5gXFxuICAgICAgICB9KTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXG4gICAgICAgICAgICBsaW5lU3BhY2luZzogMyxcXG4gICAgICAgICAgICBpZDogZGVjaWRcXG4gICAgICAgICAgfSxcXG4gICAgICAgICAgdGl0bGU6IGA8c3BhbiBzdHlsZT1cXFwiY29sb3I6IzgwODA4MFxcXCI+JHthY3Rpb24gPT09IFxcXCLmlLbotbdcXFwiID8gZGVzVGV4dCA6IGRlc1RleHQuc3Vic3RyKDAsIDY4KSArIFxcXCIuLi5cXFwifTwvc3Bhbj5gXFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgTVlfUlVMRSArIFxcXCJfamppZFxcXCIsIE1ZX1JVTEUgKyBcXFwiX2RlY2lkXFxcIiwgZGVzRGVzYywgQ29sb3JcXG4gICAgKSxcXG4gICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgIGlkOiBNWV9SVUxFICsgXFxcIl9qamlkXFxcIlxcbiAgICB9XFxuICB9LCB7XFxuICAgIHRpdGxlOiBgPHNwYW4gc3R5bGU9XFxcImNvbG9yOiM4MDgwODBcXFwiPiR7ZGVzRGVzYy5zdWJzdHIoMCwgNjgpICsgXFxcIi4uLlxcXCJ9PC9zcGFuPmAsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICB0ZXh0U2l6ZTogMTQsXFxuICAgICAgbGluZVNwYWNpbmc6IDMsXFxuICAgICAgaWQ6IE1ZX1JVTEUgKyBcXFwiX2RlY2lkXFxcIlxcbiAgICB9XFxuICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0RGVzYyhkLCBkZXNjLCBudW0pIHtcXG4gIHN3aXRjaCAoZXIu566A5LuL5qC35byPKSB7XFxuICAgIGNhc2UgdW5kZWZpbmVkOlxcbiAgICBjYXNlIFxcXCIwXFxcIjpcXG4gICAgICBzZXREZXNjMShkLCBkZXNjLCBudW0pXFxuICAgICAgYnJlYWs7XFxuICAgIGNhc2UgXFxcIjFcXFwiOlxcbiAgICAgIHNldERlc2MyKGQsIGRlc2MpXFxuICAgICAgYnJlYWs7XFxuICB9XFxufVxcblxcbmZ1bmN0aW9uIGZpbmRJY29uKGtleXdvcmQsIGVyX3VpKSB7XFxuICBsZXQgZSA9IHR5cGVvZiBlciAhPSBcXFwidW5kZWZpbmVkXFxcIiA/IGVyIDogZXJfdWk7XFxuICAvLyDlrprkuYnln7rnoYDln5/lkI1cXG4gIGNvbnN0IGJhc2VIb3N0ID0gXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9cXFwiO1xcbiAgLy8g5Zu+5qCH5pig5bCE5a+56LGh77yM6ZSu5Li65bmz5Y+w5ZCN56ew77yM5YC85Li65Zu+5qCHVVJMXFxuICBjb25zdCBpY29uTWFwID0ge1xcbiAgICDohb7orq9xcVRYOiBgJHtiYXNlSG9zdH1pbWcvcXEuc3ZnYCxcXG4gICAg5LyY6YW3eW91a3VZSzogYCR7YmFzZUhvc3R9aW1nL3lrLnN2Z2AsXFxuICAgIOeIseWlh+iJumlxaXlpUVk6IGAke2Jhc2VIb3N0fWltZy9hcXkuc3ZnYCxcXG4gICAg5ZOU5ZOpYmlsaWJpbGkxOiBgJHtiYXNlSG9zdH1pbWcvYmlsaS5zdmdgLFxcbiAgICDoipLmnpxtZ3R2aW1nbzogYCR7YmFzZUhvc3R9aW1nL21ndHYuc3ZnYCxcXG4gICAg5ZKq5ZKVbWlndXZpZGVvOiBgJHtiYXNlSG9zdH1pbWcvbWcuc3ZnYCxcXG4gICAg6KW/55OcaXhpZ3VheGc6IGAke2Jhc2VIb3N0fWltZy94Zy5zdmdgLFxcbiAgICDmkJzni5Bzb2h1U0g6IGAke2Jhc2VIb3N0fWltZy9zaC5zdmdgLFxcbiAgICDkuZDop4ZsZXR2bGVzaGlsZXZwOiBgJHtiYXNlSG9zdH1pbWcvbGUuc3ZnYCxcXG4gICAg6aOO6KGMRlg6IGAke2Jhc2VIb3N0fWltZy9meC5zdmdgLFxcbiAgICBQUFRWOiBgJHtiYXNlSG9zdH1pbWcvcHB0di5zdmdgLFxcbiAgICBDTlRWOiBgJHtiYXNlSG9zdH1pbWcvY250di5zdmdgLFxcbiAgICDnlLXlvbHnvZFtMTkwNTogYCR7YmFzZUhvc3R9aW1nLzE5MDUuc3ZnYCxcXG4gICAg5oqW6Z+zZG91eWluOiBgJHtiYXNlSG9zdH1pbWcvZG91eWluLnN2Z2AsXFxuICAgIGRlZmF1bHQ6IGUuaWNvbnMu6KeG6aKRXFxuICB9O1xcblxcbiAgY29uc3QgY2xlYW5lZEtleXdvcmQgPSBrZXl3b3JkLnJlcGxhY2UoL1xcXFxzKy9nLCBcXFwiXFxcIikucmVwbGFjZSgv6KeG6aKRJC8sIFxcXCJcXFwiKS5yZXBsYWNlKC9UViQvLCBcXFwiXFxcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XFxuICAvLyDlsJ3or5Xljp/lp4vlhbPplK7or43ljLnphY1cXG4gIGxldCBtYXRjaGVkS2V5ID0gT2JqZWN0LmtleXMoaWNvbk1hcCkuZmluZChrZXkgPT4gbmV3IFJlZ0V4cChjbGVhbmVkS2V5d29yZCwgXFxcImlcXFwiKS50ZXN0KGtleSkpO1xcbiAgLy8g6Iul5pyq5om+5Yiw5Yy56YWN77yM5bCd6K+V6L+e57ut5a2X56ym5Yy56YWN77yM56Gu5L+d5LiN5Lya6K+v5Yy56YWN5Yiw5YW25LuW6ZSu55qE54mH5q61XFxuICBpZiAoIW1hdGNoZWRLZXkgJiYgY2xlYW5lZEtleXdvcmQubGVuZ3RoID4gMSkge1xcbiAgICBmb3IgKGxldCBpID0gY2xlYW5lZEtleXdvcmQubGVuZ3RoOyBpID4gMDsgaS0tKSB7XFxuICAgICAgLy8g5LuO5pyA6ZW/5a2Q5Liy5byA5aeL5bCd6K+VXFxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPD0gY2xlYW5lZEtleXdvcmQubGVuZ3RoIC0gaTsgaisrKSB7XFxuICAgICAgICBjb25zdCBzdWJLZXl3b3JkID0gY2xlYW5lZEtleXdvcmQuc3Vic3RyaW5nKGosIGogKyBpKTtcXG4gICAgICAgIC8vIOehruS/neWtkOS4suS4jeaYr+WFtuS7lumUrueahOe7hOaIkOmDqOWIhlxcbiAgICAgICAgY29uc3QgaXNVbmlxdWVNYXRjaCA9ICFPYmplY3Qua2V5cyhpY29uTWFwKS5zb21lKG90aGVyS2V5ID0+IG90aGVyS2V5ICE9PSBzdWJLZXl3b3JkICYmIG90aGVyS2V5LnRvTG93ZXJDYXNlKClcXG4gICAgICAgICAgLmluY2x1ZGVzKHN1YktleXdvcmQpICYmICFuZXcgUmVnRXhwKGBeJHtzdWJLZXl3b3JkfVxcXFxcXFxcdytgKS50ZXN0KG90aGVyS2V5KSk7XFxuICAgICAgICBpZiAoaXNVbmlxdWVNYXRjaCkge1xcbiAgICAgICAgICBtYXRjaGVkS2V5ID0gc3ViS2V5d29yZDtcXG4gICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICAgIGlmIChtYXRjaGVkS2V5KSBicmVhaztcXG4gICAgfVxcbiAgICBtYXRjaGVkS2V5ID0gbWF0Y2hlZEtleSA/IE9iamVjdC5rZXlzKGljb25NYXApLmZpbmQoa2V5ID0+IGtleS5pbmNsdWRlcyhtYXRjaGVkS2V5KSkgOiBudWxsO1xcbiAgfVxcbiAgcmV0dXJuIG1hdGNoZWRLZXkgPyBpY29uTWFwW21hdGNoZWRLZXldIDogaWNvbk1hcC5kZWZhdWx0O1xcbn1cXG5cXG4kLmV4cG9ydHMgPSB7XFxuICBmaW5kSWNvbixcXG4gIHNldERlc2MsXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Li76aKY57yW6L6RXCIsXCJwYXRoXCI6XCJUaGVtZUVkaXRcIixcInJ1bGVcIjpcImpzOlxcbnZhciBkID0gW107XFxubGV0IHtcXG4gIHVpX2V4cGFuZCxcXG4gIHRoZW1lTWFuYWdlLFxcbiAgdWlfY29uZmlnXFxufSA9ICQucmVxdWlyZShcXFwiVUlNYW5hZ2VcXFwiKTtcXG5sZXQganNvbiA9IHRoZW1lTWFuYWdlLmdldCgpO1xcbnVpX2V4cGFuZCgpO1xcbmpzb25bXFxcIuW9k+WJjVxcXCJdID0gJC51aVRoZW1lLmdldCgpO1xcblxcbmxldCBuayA9IGdldE15VmFyKE1ZX1VSTCArIFxcXCJuXFxcIiwgXFxcIum7mOiupFxcXCIpO1xcbmxldCBpdGVtID0ganNvbltua107XFxuXFxuJC5leHRlbmQoe1xcbiAgbXlfdXJsOiBNWV9VUkwsXFxuICBfdGhlbWU6IHRoZW1lTWFuYWdlXFxufSlcXG5cXG5sZXQgYWN0aW9uID0gW1xcXCLlr7zlh7pcXFwiLCBcXFwi5a+85YWlXFxcIiwgXFxcIuaUueWQjVxcXCIsIFxcXCLliKDpmaRcXFwiLCBcXFwiSlNPTlxcXCJdO1xcbmFjdGlvbi5mb3JFYWNoKHggPT4ge1xcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6IHgsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF81XFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCh4LCBuaywgaXRlbSkgPT4ge1xcbiAgICAgIGlmICh4ID09IFxcXCLlr7zlh7pcXFwiKSB7XFxuICAgICAgICByZXR1cm4gJChuaykuaW5wdXQoKGl0ZW0pID0+IHtcXG4gICAgICAgICAgbGV0IG9iaiA9IHt9O1xcbiAgICAgICAgICBvYmpbaW5wdXRdID0gaXRlbTtcXG4gICAgICAgICAgY29weShKU09OLnN0cmluZ2lmeShvYmopKVxcbiAgICAgICAgfSwgaXRlbSlcXG4gICAgICB9XFxuICAgICAgaWYgKHggPT0gXFxcIuWvvOWFpVxcXCIpIHtcXG4gICAgICAgIHJldHVybiAkKFxcXCJ7e2NsaXBib2FyZH19XFxcIiwgXFxcIuivt+i+k+WFpeS4u+mimGpzb25cXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSAkLl90aGVtZS5nZXQoKTtcXG4gICAgICAgICAgICBsZXQgb2JqID0gSlNPTi5wYXJzZShpbnB1dCk7XFxuICAgICAgICAgICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhvYmopLmZvckVhY2goKFtrLCB2XSkgPT4ge1xcbiAgICAgICAgICAgICAgaWYgKCFqc29uLmhhc093blByb3BlcnR5KGspKSB7XFxuICAgICAgICAgICAgICAgICQuX3RoZW1lLnNldChrLCB2KTtcXG4gICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7XFxuICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwia2V5OlxcXCIgKyBrICsgXFxcIiDlt7Lnu4/lrZjlnKgs6Lez6L+HXFxcIik7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xcbiAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lr7zlhaXmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/moLzlvI/plJnor69cXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICAgIH1cXG4gICAgICBpZiAoeCA9PSBcXFwi5pS55ZCNXFxcIikge1xcbiAgICAgICAgaWYgKC9eKOm7mOiupHzlvZPliY0pJC8udGVzdChuaykpIHtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeiDveaUueWQjVxcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICByZXR1cm4gJChcXFwi5paw5ZCN56ewXFxcIikuaW5wdXQoKGspID0+IHtcXG4gICAgICAgICAgICBsZXQgb2JqID0gJC5fdGhlbWUuZ2V0KCk7XFxuICAgICAgICAgICAgbGV0IG5ld09iaiA9IE9iamVjdC5rZXlzKG9iaikucmVkdWNlKChhY2MsIGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgaWYgKGtleSA9PT0gaykge1xcbiAgICAgICAgICAgICAgICBhY2NbaW5wdXRdID0gb2JqW2tleV07XFxuICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBhY2Nba2V5XSA9IG9ialtrZXldO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgcmV0dXJuIGFjYztcXG4gICAgICAgICAgICB9LCB7fSk7XFxuICAgICAgICAgICAgJC5fdGhlbWUuc2F2ZShKU09OLnN0cmluZ2lmeShuZXdPYmopKTtcXG4gICAgICAgICAgICBwdXRNeVZhcigkLm15X3VybCArIFxcXCJuXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIH0sIG5rKVxcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgICBpZiAoeCA9PSBcXFwi5Yig6ZmkXFxcIikge1xcbiAgICAgICAgaWYgKC9eKOm7mOiupHzlvZPliY0pJC8udGVzdChuaykpIHtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeiDveWIoOmZpFxcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICByZXR1cm4gJChcXFwi56Gu6K6k5Yig6ZmkXFxcIikuY29uZmlybSgoaykgPT4ge1xcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIOiOt+WPluWvueixoeS4ree7meWumumUrueahOWJjeS4gOS4quaIluWQjuS4gOS4qumUruOAglxcblxcbiAgICAgICAgICAgICAqIOatpOWHveaVsOeUqOS6jumBjeWOhuWvueixoeeahOmUru+8jOagueaNrue7meWumueahOmUruaJvuWIsOWFtuWJjeS4gOS4quaIluWQjuS4gOS4qumUruOAglxcbiAgICAgICAgICAgICAqIOWmguaenOe7meWumueahOmUruS4jeWtmOWcqOS6juWvueixoeS4re+8jOWHveaVsOWwhuWwneivleaJvuWIsOWkp+S6jue7meWumumUrueahOesrOS4gOS4qumUruOAglxcbiAgICAgICAgICAgICAqIOWmguaenOWvueixoeS4reayoeacieWkp+S6jue7meWumumUrueahOmUru+8jOWImei/lOWbnuWvueixoeeahOacgOWQjuS4gOS4qumUruOAglxcbiAgICAgICAgICAgICAqIFxcbiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmog6KaB6YGN5Y6G55qE5a+56LGh44CCXFxuICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSDopoHmn6Xmib7liY3kuIDkuKrmiJblkI7kuIDkuKrplK7nmoTplK7jgIJcXG4gICAgICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSDov5Tlm57mib7liLDnmoTliY3kuIDkuKrmiJblkI7kuIDkuKrplK7jgIJcXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRQcmV2aW91c09yTmV4dEtleShvYmosIGtleSkge1xcbiAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XFxuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGtleXMuaW5kZXhPZihrZXkpO1xcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c6ZSu5a2Y5Zyo77yM6L+U5Zue5YmN5LiA5Liq6ZSuXFxuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCA+IDAgPyBrZXlzW2luZGV4IC0gMV0gOiBrZXlzW2luZGV4ICsgMV07IC8vIOWmguaenOaYr+esrOS4gOS4qumUru+8jOi/lOWbnuS4i+S4gOS4qumUrlxcbiAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c6ZSu5LiN5a2Y5Zyo77yM6L+U5Zue5LiL5LiA5Liq6ZSuXFxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGtleXMuZmluZEluZGV4KGsgPT4gayA+IGtleSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0SW5kZXggPiAtMSA/IGtleXNbbmV4dEluZGV4XSA6IGtleXNba2V5cy5sZW5ndGggLSAxXTsgLy8g5aaC5p6c5rKh5pyJ5LiL5LiA5Liq6ZSu77yM6L+U5Zue5pyA5ZCO5LiA5Liq6ZSuXFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGxldCBvYmogPSAkLl90aGVtZS5nZXQoKTtcXG4gICAgICAgICAgICBsZXQgbmFtZSA9IGdldFByZXZpb3VzT3JOZXh0S2V5KG9iaiwgayk7XFxuICAgICAgICAgICAgZGVsZXRlIG9ialtrXTtcXG4gICAgICAgICAgICAkLl90aGVtZS5zYXZlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xcblxcbiAgICAgICAgICAgIHB1dE15VmFyKCQubXlfdXJsICsgXFxcIm5cXFwiLCBuYW1lKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICB9LCBuaylcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgIH0sIHgsIG5rLCBpdGVtKVxcbiAgfSlcXG59KVxcbmQucHVzaCh7XFxuICBjb2xfdHlwZTogXFxcImJpZ19ibGFua19ibG9ja1xcXCJcXG59KVxcblxcbk9iamVjdC5rZXlzKGpzb24pLmZvckVhY2goKGssIGkpID0+IHtcXG4gIGxldCBsb25nY2xpY2tzID0gW107XFxuICBpZiAoIS9eKOm7mOiupHzlvZPliY0pJC8udGVzdChrKSkge1xcbiAgICBsb25nY2xpY2tzLnB1c2goe1xcbiAgICAgIHRpdGxlOiBcXFwi5pS55ZCNXFxcIixcXG4gICAgICBqczogJC50b1N0cmluZygoaykgPT4ge1xcbiAgICAgICAgcmV0dXJuICQoXFxcIuaWsOWQjeensFxcXCIpLmlucHV0KChrKSA9PiB7XFxuICAgICAgICAgIGxldCBvYmogPSAkLl90aGVtZS5nZXQoKTtcXG4gICAgICAgICAgbGV0IG5ld09iaiA9IE9iamVjdC5rZXlzKG9iaikucmVkdWNlKChhY2MsIGtleSkgPT4ge1xcbiAgICAgICAgICAgIGlmIChrZXkgPT09IGspIHtcXG4gICAgICAgICAgICAgIGFjY1tpbnB1dF0gPSBvYmpba2V5XTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgYWNjW2tleV0gPSBvYmpba2V5XTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGFjYztcXG4gICAgICAgICAgfSwge30pO1xcbiAgICAgICAgICAkLl90aGVtZS5zYXZlKEpTT04uc3RyaW5naWZ5KG5ld09iaikpO1xcbiAgICAgICAgICBwdXRNeVZhcigkLm15X3VybCArIFxcXCJuXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSwgaylcXG4gICAgICB9LCBrKVxcbiAgICB9KVxcbiAgfVxcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6IG5rID09IGsgPyAn4oCc4oCc4oCd4oCdJyArIGsuZm9udGNvbG9yKFxcXCJyZWRcXFwiKSA6IGssXFxuICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaykgPT4ge1xcbiAgICAgIHB1dE15VmFyKE1ZX1VSTCArIFxcXCJuXFxcIiwgayk7XFxuICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBrKSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICBMb25nQ2xpY2s6IGxvbmdjbGlja3NcXG4gICAgfVxcbiAgfSlcXG59KVxcblxcbmxldCBkaSA9IGQuZmluZEluZGV4KHggPT4geC50aXRsZSA9PSBcXFwiSlNPTlxcXCIpO1xcbmRbZGldID0gT2JqZWN0LmFzc2lnbihkW2RpXSwge1xcbiAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChjb250ZW50LCBrKSA9PiB7XFxuICAgIGxldCBvYmogPSB7fTtcXG4gICAgb2JqW2tdID0gY29udGVudDtcXG4gICAgY29udGVudCA9IG9iajtcXG4gICAgaWYgKGZldGNoKFxcXCJoaWtlcjovL2hvbWVASlNPTue8lui+keWZqFxcXCIpID09IG51bGwpIHtcXG4gICAgICByZXR1cm4gJ+a1t+mYlOinhueVjOmmlumhtemikemBk+inhOWImeOAkEpTT07nvJbovpHlmajjgJHvv6Vob21lX3J1bGVfdXJs77+laHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9MzQyNCc7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgcmV0dXJuICdoaWtlcjovL3BhZ2UvaW50ZXJmYWNlI25vUmVmcmVzaCMjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP3J1bGU9SlNPTue8lui+keWZqCZKc29uPScgKyBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoY29udGVudCkpXFxuICAgIH1cXG4gIH0sIGl0ZW0sIG5rKSxcXG59KVxcbmQuc3BsaWNlKGRpLCAxLCBkW2RpXSk7XFxuXFxuZC5wdXNoKHtcXG4gIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCI8c21hbGw+56Gu6K6kPC9zbWFsbD5cXFwiLFxcbiAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaXRlbSwgbmspID0+IHtcXG4gICAgaWYgKG5rID09IFxcXCLlvZPliY1cXFwiKSB7XFxuICAgICAgYmFjayh0cnVlKTtcXG4gICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9XFxuICAgIHNldEl0ZW0oXFxcInRoZW1lXFxcIiwgbmspO1xcbiAgICAkLnVpVGhlbWUuc2V0KGl0ZW0pO1xcbiAgICBiYWNrKHRydWUpO1xcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgfSwgaXRlbSwgbmspLFxcbiAgZXh0cmE6IHtcXG4gICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgfVxcbn0pXFxuXFxuXFxuZC5wdXNoKHtcXG4gIHRpdGxlOiBcXFwiXFxcIixcXG4gIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgZXh0cmE6IHtcXG4gICAgZGVmYXVsdFZhbHVlOiBKU09OLnN0cmluZ2lmeShpdGVtLCBudWxsLCAxKSxcXG4gICAgSGlnaGxpZ2h0OiB0cnVlLFxcbiAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICBoZWlnaHQ6IC0xXFxuICB9XFxufSlcXG5cXG5cXG5zZXRSZXN1bHQoZCk7XCJ9XSIsImljb24iOiIiLCJwcm94eSI6IiJ9
Add Comment
Please, Sign In to add comment