Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@DrpyHiker@eyJmaXJzdEhlYWRlciI6ImNsYXNzIiwibGFzdF9jaGFwdGVyX3J1bGUiOiIiLCJ0aXRsZSI6IkRycHlIaWtlciIsImF1dGhvciI6IkBMb3lEZ0lrJnpldGFscGhhIiwidXJsIjoiaGlrZXI6Ly9lbXB0eSMjZnlwYWdlIiwidmVyc2lvbiI6NDksImNvbF90eXBlIjoibW92aWVfMyIsImNsYXNzX25hbWUiOiIiLCJ0eXBlIjoidmlkZW8iLCJjbGFzc191cmwiOiIiLCJhcmVhX25hbWUiOiIiLCJhcmVhX3VybCI6IiIsInNvcnRfbmFtZSI6IiIsInllYXJfbmFtZSI6IiIsInNvcnRfdXJsIjoiIiwieWVhcl91cmwiOiIiLCJmaW5kX3J1bGUiOiJqczokLnJlcXVpcmUoXCJNaWFuTG9hZFwiKTsiLCJzZWFyY2hfdXJsIjoiaGlrZXI6Ly9lbXB0eT9zPSoqJnBhZ2U9ZnlwYWdlIiwiZ3JvdXAiOiLlvIDlj5HkuK3lv4MiLCJzZWFyY2hGaW5kIjoianM6XG4oZnVuY3Rpb24gKCkge1xuICBsZXQge1xuICAgIHVpX2NvbmZpZyxcbiAgfSA9ICQucmVxdWlyZShcIlVJTWFuYWdlXCIpO1xuICB1aV9jb25maWc9dWlfY29uZmlnLnlpO1xuXG4gIGxldCBzbW9kZSA9IE51bWJlcihnZXRJdGVtKFwic21vZGVcIiwgXCIwXCIpKTtcbiAgbGV0IHRlbXNtb2RlID0gZ2V0TXlWYXIoXCJ0ZW1zbW9kZVwiLCBcIlwiKTtcbiAgaWYgKHRlbXNtb2RlKSB7XG4gICAgc21vZGUgPSBOdW1iZXIodGVtc21vZGUpO1xuICAgIGNsZWFyTXlWYXIoXCJ0ZW1zbW9kZVwiKTtcbiAgfVxuICBpZiAoIWZpbGVFeGlzdChcImhpa2VyOi8vZmlsZXMvZGF0YS9cIiArIE1ZX1JVTEUudGl0bGUgKyBcIi9saWJzX2hpa2VyL2RycHkyLmpzXCIpKSByZXR1cm4gc2V0UmVzdWx0KFt7XG4gICAgdGl0bGU6IFwi6K+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+IHtcXG4gICAgICAgICAgbGV0IGxvY2F0aW9uID0gZ2V0TXlWYXIoaWQgKyBcXFwic291cmNlaVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgIGxldCBwYWdlbnVtID0gZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBwYWdlbnVtKTtcXG4gICAgICAgICAgbGV0IGVmID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIikuZ2V0RUluZm8oKTtcXG4gICAgICAgICAgbGV0IHBjb3VudCA9IGVmLm1heFtsb2NhdGlvbl07XFxuICAgICAgICAgIGlmIChwY291bnQgPT0gMSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgbGV0IHBsYXlwID0gZWYucGxheXA7XFxuICAgICAgICAgIGxldCBlciA9ICQucmVxdWlyZShcXFwiVUlNYW5hZ2VcXFwiKS51aV9jb25maWcuZXI7XFxuICAgICAgICAgIGxldCBwYWdlYXJyID0gcGxheXAubWFwKCh4LCBpKSA9PiBpID09IHBhZ2VudW0gPyAn4oCc4oCc4oCd4oCdJyArIHguZm9udGNvbG9yKGVyLue6v+i3r+minOiJsikgOiB4KTtcXG4gICAgICAgICAgcmV0dXJuICQocGFnZWFyciwgMykuc2VsZWN0KChsb2NhdGlvbiwgZXIpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFN0cmluZyhNWV9JTkRFWCkpO1xcbiAgICAgICAgICAgIGlmIChlci7kuoznuqfliLfmlrApIHtcXG4gICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcInBsYXlsaXN0X3JlYWR5XFxcIik7XFxuICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIEdNLmdldChcXFwicmVub3ZhdGVMaXN0XFxcIiwgKCkgPT4geyB9KShsb2NhdGlvbik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgIH0sIGxvY2F0aW9uLCBlcilcXG4gICAgICAgIH0sIGlkLCBwYWdlbnVtKSxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGNsczogXFxcInBsYXlwYWdlXFxcIixcXG4gICAgICAgICAgaWQ6IFxcXCJwbGF5cGFnZUBwYWdlYXJyXFxcIixcXG4gICAgICAgIH1cXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogZm9udHN0eWxlKCfkuIvkuIDpobUnLCB7XFxuICAgICAgICAgIGM6IGZjXFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF80XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQpID0+IHtcXG4gICAgICAgICAgbGV0IGxvY2F0aW9uID0gZ2V0TXlWYXIoaWQgKyBcXFwic291cmNlaVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgIGxldCBlZiA9ICQucmVxdWlyZShcXFwibWV0aG9kc1xcXCIpLmdldEVJbmZvKCk7XFxuICAgICAgICAgIGxldCBwY291bnQgPSBlZi5tYXhbbG9jYXRpb25dO1xcbiAgICAgICAgICBsZXQgcGFnZW51bSA9IGVmLnBhZ2VudW07XFxuICAgICAgICAgIGlmIChwY291bnQgPT0gMSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgaWYgKHBhZ2VudW0gPj0gcGNvdW50IC0gMSkge1xcbiAgICAgICAgICAgIHBhZ2VudW0gPSAwO1xcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHBhZ2VudW0rKztcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBwdXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFN0cmluZyhwYWdlbnVtKSk7XFxuICAgICAgICAgIGxldCBlcnIgPSAkLnJlcXVpcmUoXFxcIm1ldGhvZHNcXFwiKS5lclJlZnJlc2g7XFxuICAgICAgICAgIHJldHVybiBlcnIobG9jYXRpb24pO1xcbiAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgY2xzOiBcXFwicGxheXBhZ2VcXFwiLFxcbiAgICAgICAgICBpZDogXFxcInBsYXlwYWdlQG5leHRcXFwiXFxuICAgICAgICB9XFxuICAgICAgfV1cXG5cXG4gICAgICBpZiAoZXIu5YiG6aG15a+86IiqKSB7XFxuICAgICAgICBwYWdlb2JqID0gcGFnZW9iai5jb25jYXQodHBsYXkpO1xcbiAgICAgIH1cXG5cXG4gICAgICBsZXQgcGxpbmUgPSBkLmZpbmRJbmRleCh4ID0+IHguZXh0cmEgJiYgeC5leHRyYS5pZCA9PSBcXFwicGxheXBhZ2VsaW5lXFxcIik7XFxuXFxuICAgICAgaWYgKGdldE15VmFyKFxcXCJwbGF5bGlzdF9yZWFkeVxcXCIsIFxcXCIwXFxcIikgPT0gXFxcIjBcXFwiKSB7XFxuICAgICAgICBpZiAocGxpbmUgPiAtMSkge1xcbiAgICAgICAgICBpbnNlcnRBcnJheUF0KGQsIHBsaW5lICsgMSwgcGFnZW9iaik7XFxuICAgICAgICB9XFxuICAgICAgICAvL0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQscGFnZW9iaik7XFxuICAgICAgICAvL2FkZEl0ZW1BZnRlcihcXFwicGxheXBhZ2VsaW5lXFxcIiwgcGFnZW9iaik7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGlmIChnZXRNeVZhcihcXFwibm9wYWdlXFxcIiwgXFxcIjBcXFwiKSA9PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgYWRkSXRlbUFmdGVyKFxcXCJwbGF5cGFnZWxpbmVcXFwiLCBwYWdlb2JqKTtcXG4gICAgICAgICAgY2xlYXJNeVZhcihcXFwibm9wYWdlXFxcIik7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIWVyLuS6jOe6p+WIt+aWsCkge1xcbiAgICAgICAgICB1cGRhdGVJdGVtKFxcXCJwbGF5cGFnZUB1cFxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogcGFnZW9ialswXS50aXRsZSxcXG4gICAgICAgICAgfSlcXG4gICAgICAgICAgdXBkYXRlSXRlbShcXFwicGxheXBhZ2VAcGFnZWFyclxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogcGFnZW9ialsxXS50aXRsZSxcXG4gICAgICAgICAgfSlcXG4gICAgICAgICAgdXBkYXRlSXRlbShcXFwicGxheXBhZ2VAbmV4dFxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogcGFnZW9ialsyXS50aXRsZSxcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChlci7liIbpobXlr7zoiKopIHtcXG4gICAgICAgICAgaWYgKCFlci7kuoznuqfliLfmlrApIHtcXG4gICAgICAgICAgICBsZXQgcG4gPSBmaW5kSXRlbXNCeUNscyhcXFwicGFnZW5hdlxcXCIpXFxuICAgICAgICAgICAgaWYgKHBuLmxlbmd0aCA+IHBsYXlwLmxlbmd0aCkge1xcbiAgICAgICAgICAgICAgcG4gPSBwbi5zbGljZShwbGF5cC5sZW5ndGgpXFxuICAgICAgICAgICAgICBwbi5tYXAoeCA9PiB7XFxuICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oeC5leHRyYS5pZClcXG4gICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChwbi5sZW5ndGggPCBwbGF5cC5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgIGxldCBwaWQgPSBwbi5hdCgtMSk7XFxuICAgICAgICAgICAgICBsZXQgYWRkID0gdHBsYXkuc2xpY2UocG4ubGVuZ3RoKTtcXG4gICAgICAgICAgICAgIGFkZEl0ZW1BZnRlcihwaWQuZXh0cmEuaWQsIGFkZCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHRwbGF5LmZvckVhY2goKHgsIGkpID0+IHtcXG4gICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcInBhZ2VudW1cXFwiICsgaSwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogeC50aXRsZSxcXG4gICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgIH1cXG5cXG4gICAgICAvLyBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlwYWdlbGluZVxcXCIsIFt7XFxuICAgICAgLy8gICB0aXRsZTogJ+S4iuS4gOmhtScsXFxuICAgICAgLy8gICBjb2xfdHlwZTogXFxcInRleHRfNFxcXCIsXFxuICAgICAgLy8gICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGxvY2F0aW9uLCBwY291bnQpID0+IHtcXG4gICAgICAvLyAgICAgbGV0IHBhZ2VudW0gPSBnZXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgLy8gICAgIGlmIChwYWdlbnVtID09IDApIHtcXG4gICAgICAvLyAgICAgICBwYWdlbnVtID0gcGNvdW50IC0gMTtcXG4gICAgICAvLyAgICAgfSBlbHNlIHtcXG4gICAgICAvLyAgICAgICBwYWdlbnVtLS07XFxuICAgICAgLy8gICAgIH1cXG4gICAgICAvLyAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcocGFnZW51bSkpO1xcbiAgICAgIC8vICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgIC8vICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgIC8vICAgfSwgbG9jYXRpb24sIHBjb3VudCksXFxuICAgICAgLy8gICBleHRyYToge1xcbiAgICAgIC8vICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAvLyAgIH1cXG4gICAgICAvLyB9LCB7XFxuICAgICAgLy8gICB0aXRsZTogcGxheXBbcGFnZW51bV0sXFxuICAgICAgLy8gICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgLy8gICB1cmw6ICQocGFnZWFyciwgMykuc2VsZWN0KChsb2NhdGlvbikgPT4ge1xcbiAgICAgIC8vICAgICBwdXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFN0cmluZyhNWV9JTkRFWCkpO1xcbiAgICAgIC8vICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgIC8vICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgLy8gICB9LCBsb2NhdGlvbiksXFxuICAgICAgLy8gICBleHRyYToge1xcbiAgICAgIC8vICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAvLyAgIH1cXG4gICAgICAvLyB9LCB7XFxuICAgICAgLy8gICB0aXRsZTogJ+S4i+S4gOmhtScsXFxuICAgICAgLy8gICBjb2xfdHlwZTogXFxcInRleHRfNFxcXCIsXFxuICAgICAgLy8gICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGxvY2F0aW9uLCBwY291bnQpID0+IHtcXG4gICAgICAvLyAgICAgbGV0IHBhZ2VudW0gPSBnZXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgLy8gICAgIGlmIChwYWdlbnVtID49IHBjb3VudCAtIDEpIHtcXG4gICAgICAvLyAgICAgICBwYWdlbnVtID0gMDtcXG4gICAgICAvLyAgICAgfSBlbHNlIHtcXG4gICAgICAvLyAgICAgICBwYWdlbnVtKys7XFxuICAgICAgLy8gICAgIH1cXG4gICAgICAvLyAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcocGFnZW51bSkpO1xcbiAgICAgIC8vICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgIC8vICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgIC8vICAgfSwgbG9jYXRpb24sIHBjb3VudCksXFxuICAgICAgLy8gICBleHRyYToge1xcbiAgICAgIC8vICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAvLyAgIH1cXG4gICAgICAvLyB9XSlcXG4gICAgICAvKnBsYXlwID0gcGxheXAubWFwKCh4LCBpKSA9PiB7XFxuICAgICAgICAgbGV0IG9iaiA9IE9iamVjdC5hc3NpZ24oe30sIHRlbXAsIHtcXG4gICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChwYWdlbnVtID09IGkgPyB4LmZvbnRjb2xvcihcXFwicmVkXFxcIikgOiB4KSxcXG4gICAgICAgICAgIGNvbF90eXBlOlxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcbiAgICAgICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiKSA9PSBpKSB7XFxuICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgU3RyaW5nKGkpKTtcXG4gICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5bGlzdFxcXCIpO1xcbiAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsICQudGVtcF9saXN0W2ldKTtcXG4gICAgICAgICAgICAgZmluZEl0ZW1zQnlDbHMoXFxcInBsYXlwYWdlXFxcIikuZm9yRWFjaCgoeCwgaWkpID0+IHtcXG4gICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB4LnRpdGxlLnJlcGxhY2UoL+KAmHzigJl84oCcfOKAnXw8W14+XSs+L2csIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICBpZiAoaWkgPT0gaSkge1xcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSAn4oCc4oCc4oCd4oCdJyArIHRpdGxlLmZvbnRjb2xvcihcXFwicmVkXFxcIik7XFxuICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oeC5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICB9LCBpKSxcXG4gICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCB0ZW1wLmV4dHJhLCB7XFxuICAgICAgICAgICAgIGlkOiBcXFwicGFnZW51bVxcXCIgKyBpLFxcbiAgICAgICAgICAgfSlcXG4gICAgICAgICB9KVxcbiAgICAgICAgIHJldHVybiBvYmo7XFxuICAgICAgIH0pXFxuICAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheXBhZ2VsaW5lXFxcIiwgcGxheXApKi9cXG4gICAgfSBlbHNlIHtcXG4gICAgICBkZWxldGVJdGVtQnlDbHMoXFxcInBhZ2VuYXZcXFwiKTtcXG4gICAgICBkZWxldGVJdGVtQnlDbHMoXFxcInBsYXlwYWdlXFxcIik7XFxuICAgICAgcHV0TXlWYXIoXFxcIm5vcGFnZVxcXCIsIFxcXCIxXFxcIik7XFxuICAgIH1cXG5cXG4gICAgaWYgKGdldE15VmFyKFxcXCJwbGF5bGlzdF9yZWFkeVxcXCIsIFxcXCIwXFxcIikgPT0gXFxcIjFcXFwiKSB7XFxuICAgICAgbGV0IG9sZElkcyA9IChmaW5kSXRlbXNCeUNscygncGxheWxpc3QnKSB8fCBbXSkubWFwKGl0ID0+IGl0LmV4dHJhLmlkKTtcXG4gICAgICBsZXQgdG9EZWxldGVJZHMgPSBbXTsgLy/lvoXliKDpmaTnmoTml6dpZFxcbiAgICAgIGxldCB0b0FkZERhdGFzID0gW107IC8v5b6F5paw5aKe55qE5paw5pWw5o2uXFxuICAgICAgaWYgKG9sZElkcy5sZW5ndGggPiBsaXN0Lmxlbmd0aCkge1xcbiAgICAgICAgdG9EZWxldGVJZHMgPSBvbGRJZHMuc2xpY2UobGlzdC5sZW5ndGgpO1xcbiAgICAgIH0gZWxzZSBpZiAob2xkSWRzLmxlbmd0aCA8IGxpc3QubGVuZ3RoKSB7XFxuICAgICAgICB0b0FkZERhdGFzID0gbGlzdC5zbGljZShvbGRJZHMubGVuZ3RoKVxcbiAgICAgIH1cXG4gICAgICBsZXQgY250ID0gTWF0aC5taW4ob2xkSWRzLmxlbmd0aCwgbGlzdC5sZW5ndGgpO1xcbiAgICAgIGlmICh0b0RlbGV0ZUlkcy5sZW5ndGggPiAwKSB7XFxuICAgICAgICAvL+acieWIoOmZpOeahOWFiOWIoOmZpFxcbiAgICAgICAgZGVsZXRlSXRlbSh0b0RlbGV0ZUlkcyk7XFxuICAgICAgICAvKnRvRGVsZXRlSWRzLmZvckVhY2goaWQ9PntcXG4gICAgICAgICAgZGVsZXRlSXRlbShpZCk7XFxuICAgICAgICB9KSovXFxuICAgICAgfVxcbiAgICAgIGlmICh0b0FkZERhdGFzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgIC8v5pyJ5paw5aKe55qE5YWI5paw5aKeXFxuICAgICAgICBhZGRJdGVtQWZ0ZXIob2xkSWRzW2NudCAtIDFdLCB0b0FkZERhdGFzKTtcXG4gICAgICB9XFxuICAgICAgLy9zaG93TG9hZGluZygn5Yqg6L295LitJylcXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNudDsgaSsrKSB7XFxuICAgICAgICAvL+acgOWQjumhuuW6j+abtOaWsFxcbiAgICAgICAgdXBkYXRlSXRlbShvbGRJZHNbaV0sIGxpc3RbaV0pO1xcbiAgICAgIH1cXG4gICAgfSBlbHNlIHtcXG5cXG4gICAgICAvL2xvZyhsaXN0Lmxlbmd0aClcXG4gICAgICBpZiAobGlzdCkge1xcbiAgICAgICAgbGV0IHBscyA9IGQuZmluZEluZGV4KHggPT4geC5leHRyYSAmJiB4LmV4dHJhLmlkID09IFxcXCJwbGF5bGlzdHNcXFwiKTtcXG4gICAgICAgIGlmIChwbHMgPiAtMSkge1xcbiAgICAgICAgICBpbnNlcnRBcnJheUF0KGQsIHBscyArIDEsIGxpc3QpO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy9BcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkLGxpc3QpO1xcbiAgICAgICAgLy9hZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsIGxpc3QpO1xcbiAgICAgICAgcHV0TXlWYXIoXFxcInBsYXlsaXN0X3JlYWR5XFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICB9XFxuICAgIH1cXG5cXG4gICAgLypsZXQgcGFnZWxpbmVzID0gZmluZEl0ZW1zQnlDbHMoXFxcImxvY2F0aW9uQFxcXCIpO1xcbiAgICBpZiAoZ2V0TXlWYXIoXFxcInBsYXlsaXN0X3JlYWR5XFxcIiwgXFxcIjBcXFwiKSA9PSBcXFwiMVxcXCIpIHtcXG4gICAgICBwYWdlbGluZXM9cGFnZWxpbmVzLm1hcCh4PT57XFxuICAgICAgICB4LmNvbF90eXBlPXgudHlwZTtcXG4gICAgICAgIHJldHVybiB4O1xcbiAgICAgIH0pXFxuICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJsb2NhdGlvbkBcXFwiKTtcXG4gICAgICBhZGRJdGVtQmVmb3JlKFxcXCJwbGF5cGFnZWxpbmVcXFwiLCBwYWdlbGluZXMpO1xcbiAgICB9Ki9cXG5cXG4gICAgLyppZiAobGlzdCkge1xcbiAgICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFwicGxheWxpc3RcXFwiKTtcXG4gICAgICBsZXQgcGxzID0gZC5maW5kSW5kZXgoeCA9PiB4LmV4dHJhICYmIHguZXh0cmEuaWQgPT0gXFxcInBsYXlsaXN0c1xcXCIpO1xcbiAgICAgIGlmIChwbHMgPiAtMSkge1xcbiAgICAgICAgaW5zZXJ0QXJyYXlBdChkLCBwbHMgKyAxLCBsaXN0KTtcXG4gICAgICB9XFxuICAgICAgLy9BcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkLGxpc3QpO1xcbiAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheWxpc3RzXFxcIiwgbGlzdCk7XFxuICAgICAgcHV0TXlWYXIoXFxcInBsYXlsaXN0X3JlYWR5XFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgfSovXFxuICAgIGlmICghZXIu5LqM57qn5Yi35pawKSB7XFxuICAgICAgdXBkYXRlSXRlbShcXFwibG9jYXRpb25AXFxcIiArIGN1cnJlbnRMb2NhdGlvbiwge1xcbiAgICAgICAgdGl0bGU6IGZvbnRzdHlsZShmcm9tW2N1cnJlbnRMb2NhdGlvbl0sIHtcXG4gICAgICAgICAgdGFnczogXFxcInNtYWxsXFxcIlxcbiAgICAgICAgfSwgZXIu57q/6Lev5qC35byPKSxcXG4gICAgICB9KTtcXG5cXG4gICAgICB1cGRhdGVJdGVtKFxcXCJsb2NhdGlvbkBcXFwiICsgbG9jYXRpb24sIHtcXG4gICAgICAgIHRpdGxlOiBmb250c3R5bGUoZnJvbVtsb2NhdGlvbl0sIHtcXG4gICAgICAgICAgYzogZXIu57q/6Lev6aKc6ImyLFxcbiAgICAgICAgICB0YWdzOiBcXFwic21hbGxcXFwiXFxuICAgICAgICB9LCBlci7nur/ot6/moLflvI8pXFxuICAgICAgfSk7XFxuICAgIH1cXG5cXG4gICAgbGV0IGVmID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIikuZ2V0RUluZm8oKTtcXG4gICAgaWYgKCFlci7kuoznuqfliLfmlrApIHtcXG4gICAgICB1cGRhdGVJdGVtKFxcXCJAc29ydFxcXCIsIHtcXG4gICAgICAgIHRpdGxlOiBnZXRMaW5lU2hvdyhlZiksXFxuICAgICAgICBkZXNjOiBgPHNtYWxsPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjoke2VyLue6v+i3r+minOiJsn1cXFwiPiR7ZWYuZnJvbVtlZi5saW5lXX08L3NwYW4+PC9zbWFsbD5gXFxuICAgICAgfSlcXG4gICAgfVxcblxcbiAgICBjdXJyZW50TG9jYXRpb24gPSBsb2NhdGlvbjtcXG4gIH1cXG5cXG4gIEdNLnB1dChcXFwicmVub3ZhdGVMaXN0XFxcIiwgcmVub3ZhdGVMaXN0KTtcXG5cXG4gIGlmIChmcm9tLmxlbmd0aCkge1xcbiAgICBsZXQgZWYgPSBnZXRFSW5mbygpO1xcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBnZXRMaW5lU2hvdyhlZiksXFxuICAgICAgLy9kZXNjOiBzb3J0b2JqW3NvcnRpXS50aXRsZSxcXG4gICAgICBkZXNjOiBgPHNtYWxsPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjoke2VyLue6v+i3r+minOiJsn1cXFwiPiR7ZWYuZnJvbVtlZi5saW5lXX08L3NwYW4+PC9zbWFsbD5gLFxcbiAgICAgIGltZzogc29ydG9ialtzb3J0aV0uaW1nLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc28pID0+IHtcXG4gICAgICAgIGxldCBlZiA9ICQucmVxdWlyZShcXFwibWV0aG9kc1xcXCIpLmdldEVJbmZvKCk7XFxuXFxuICAgICAgICBsZXQgc2kgPSBnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgbGV0IGlpID0gKHNpID09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJAc29ydFxcXCIsIHtcXG4gICAgICAgICAgZGVzYzogc29baWldLnRpdGxlLFxcbiAgICAgICAgICBpbWc6IHNvW2lpXS5pbWcsXFxuICAgICAgICB9KVxcblxcbiAgICAgICAgLy8gdXBkYXRlSXRlbShcXFwiQHNvcnRcXFwiLCB7XFxuICAgICAgICAvLyAgIHRpdGxlOiBcXFwiXFxcIitcXFwi5b2T5YmN57q/6LevOlxcXCIgKyBlZi5mcm9tW2VmLmxpbmVdICsgXFxcIlxcXFx0XFxcXHTlhbE6XFxcIiArIGVmLnBsYXlzW2VmLmxpbmVdICsgXFxcIumbhlxcXFx0XFxcXHRcXFwiICsgZWYuc3BhZ2VudW0gKyBcXFwiL1xcXCIgKyBlZi5tYXhbZWYubGluZV0sXFxuICAgICAgICAvLyB9KVxcblxcbiAgICAgICAgdmFyIHBsYXlzID0gZmluZEl0ZW1zQnlDbHMoXFxcInBsYXlsaXN0XFxcIikucmV2ZXJzZSgpLm1hcCh4ID0+IHtcXG4gICAgICAgICAgeC5jb2xfdHlwZSA9IHgudHlwZTtcXG4gICAgICAgICAgeC5leHRyYS5pZCA9IHguZXh0cmEuaWQuZW5kc1dpdGgoXFxcIuKHhVxcXCIpID8geC5leHRyYS5pZC5yZXBsYWNlKC/ih4UkLywgXFxcIlxcXCIpIDogeC5leHRyYS5pZCArIFxcXCLih4VcXFwiO1xcbiAgICAgICAgICByZXR1cm4geDtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGV0IG9sZElkcyA9IChmaW5kSXRlbXNCeUNscygncGxheWxpc3QnKSB8fCBbXSkubWFwKGl0ID0+IGl0LmV4dHJhLmlkKTtcXG5cXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2xkSWRzLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgIC8v5pyA5ZCO6aG65bqP5pu05pawXFxuICAgICAgICAgIHVwZGF0ZUl0ZW0ob2xkSWRzW2ldLCBwbGF5c1tpXSk7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgbmV3SXRlbSA9IChmaW5kSXRlbXNCeUNscygncGxheWxpc3QnKSB8fCBbXSk7XFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0l0ZW0ubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgLy/mnIDlkI7pobrluo/mm7TmlrBcXG4gICAgICAgICAgdXBkYXRlSXRlbShuZXdJdGVtW2ldLmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24oe30sIG5ld0l0ZW1baV0uZXh0cmEsIHtcXG4gICAgICAgICAgICAgIGlkOiBuZXdJdGVtW2ldLmV4dHJhLmlkLnJlcGxhY2UoL+KHhSQvLCBcXFwiXFxcIilcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIC8vIGRlbGV0ZUl0ZW1CeUNscyhcXFwicGxheWxpc3RcXFwiKTtcXG4gICAgICAgIC8vIGFkZEl0ZW1BZnRlcihcXFwicGxheWxpc3RzXFxcIiwgcGxheXMpO1xcblxcbiAgICAgICAgcHV0TXlWYXIoXFxcInNvcnRpXFxcIiwgaWkpO1xcbiAgICAgICAgLy9yZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIChpaSA9PSBcXFwiMFxcXCIgPyBcXFwi5q2j5bqPXFxcIiA6IFxcXCLlgJLluo9cXFwiKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgc29ydG9iaiksXFxuICAgICAgY29sX3R5cGU6ICdhdmF0YXInLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogXFxcIkBzb3J0XFxcIixcXG4gICAgICB9XFxuICAgIH0pXFxuICAgIGlmIChmcm9tLmxlbmd0aCA+IDEpIHtcXG4gICAgICBsZXQgY2kgPSBnZXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICBpZiAoZXIu57q/6Lev5qC35byPICE9IFxcXCJzZWxlY3RcXFwiKSB7XFxuICAgICAgICBmb3IgKGxldCBpIGluIGZyb20pIHtcXG4gICAgICAgICAgbGV0IGljb25pbWcgPSBlci7nur/ot6/moLflvI8uaW5jbHVkZXMoXFxcImljb25cXFwiKSA/IGZpbmRJY29uKGZyb21baV0pIDogXFxcIlxcXCI7XFxuICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IChpID09IGNpID8gZm9udHN0eWxlKGZyb21baV0sIHtcXG4gICAgICAgICAgICAgIGM6IGVyLue6v+i3r+minOiJsixcXG4gICAgICAgICAgICAgIHRhZ3M6IFxcXCJzbWFsbFxcXCJcXG4gICAgICAgICAgICB9LCBlci7nur/ot6/moLflvI8pIDogZm9udHN0eWxlKGZyb21baV0sIHtcXG4gICAgICAgICAgICAgIHRhZ3M6IFxcXCJzbWFsbFxcXCJcXG4gICAgICAgICAgICB9LCBlci7nur/ot6/moLflvI8pKSxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGksIGlkKSA9PiB7XFxuICAgICAgICAgICAgICBpZiAoZ2V0TXlWYXIoaWQgKyBcXFwic291cmNlaVxcXCIsIFxcXCIwXFxcIikgPT0gaSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgcHV0TXlWYXIoaWQgKyBcXFwic291cmNlaVxcXCIsIFN0cmluZyhpKSk7XFxuICAgICAgICAgICAgICBsZXQgZXJyID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIikuZXJSZWZyZXNoO1xcbiAgICAgICAgICAgICAgZXJyKGkpO1xcbiAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICB9LCBpLCBpZCksXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgIGNsczogXFxcImxvY2F0aW9uQFxcXCIsXFxuICAgICAgICAgICAgICBpZDogXFxcImxvY2F0aW9uQFxcXCIgKyBpXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBpbWc6IGljb25pbWcsXFxuICAgICAgICAgICAgY29sX3R5cGU6IGVyLue6v+i3r+agt+W8j1xcbiAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgdGl0bGU6IGZyb21bY2ldLFxcbiAgICAgICAgICBkZXNjOiBmcm9tLmxlbmd0aCArIFxcXCLmnaHnur/ot69cXFwiLFxcbiAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHtcXG4gICAgICAgICAgICAgIGZvbnRzdHlsZSxcXG4gICAgICAgICAgICAgIGdldEVJbmZvLFxcbiAgICAgICAgICAgIH0gPSAkLnJlcXVpcmUoXFxcIm1ldGhvZHNcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZWYgPSBnZXRFSW5mbygpO1xcblxcbiAgICAgICAgICAgIGxldCBmcm9tID0gZWYuZnJvbTtcXG4gICAgICAgICAgICBsZXQgbWF4ID0gZWYucGxheXM7XFxuXFxuICAgICAgICAgICAgbGV0IGNpID0gZ2V0TXlWYXIoaWQgKyBcXFwic291cmNlaVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgbGV0IHNob3dpID0gZ2V0TXlWYXIoXFxcInNob3dpXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCB0ZnJvbSA9IGZyb20ubWFwKCh4LCBpKSA9PiB7XFxuICAgICAgICAgICAgICByZXR1cm4gY2kgPT0gaSA/IGZvbnRzdHlsZSh4ICsgXFxcIltcXFwiICsgbWF4W2ldICsgXFxcIl1cXFwiLCB7XFxuICAgICAgICAgICAgICAgIGM6ICQuZXJfdWku57q/6Lev6aKc6ImyLFxcbiAgICAgICAgICAgICAgICB0YWdzOiBcXFwic21hbGxcXFwiXFxuICAgICAgICAgICAgICB9KSA6IGZvbnRzdHlsZSh4ICsgXFxcIltcXFwiICsgbWF4W2ldICsgXFxcIl1cXFwiLCB7XFxuICAgICAgICAgICAgICAgIHRhZ3M6IFxcXCJzbWFsbFxcXCJcXG4gICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICBpZiAoc2hvd2kgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJzaG93aVxcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICBsZXQgc2hvdyA9IDE7XFxuICAgICAgICAgICAgICBsZXQgbnVtID0gdGZyb20ubGVuZ3RoO1xcbiAgICAgICAgICAgICAgaWYgKG51bSA8IDgpIHtcXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtID4gOCAmJiBudW0gPD0gMTIpIHtcXG4gICAgICAgICAgICAgICAgc2hvdyA9IDI7XFxuICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBzaG93ID0gMztcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgcmV0dXJuICQodGZyb20sIHNob3cpLnNlbGVjdCgoY2ksIGYsIGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgIE1ZX1VSTD1cXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIGxldCB7XFxuICAgICAgICAgICAgICAgICAgZXJSZWZyZXNoXFxuICAgICAgICAgICAgICAgIH09JC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIik7XFxuICAgICAgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgICBsZXQge1xcbiAgICAgICAgICAgICAgICAgIGZpbmRJY29uXFxuICAgICAgICAgICAgICAgIH0gPSAkLnJlcXVpcmUoXFxcIm1ldGhvZHNfZXJcXFwiKTtcXG4gICAgICAgICAgICAgICAgXFxuICAgICAgICAgICAgICAgIGxldCBpID0gTVlfSU5ERVg7XFxuICAgICAgICAgICAgICAgIGlmIChpID09IGNpKSB7XFxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGZbaV07XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBTdHJpbmcoaSkpO1xcbiAgICAgICAgICAgICAgICBlclJlZnJlc2goaSk7XFxuXFxuICAgICAgICAgICAgICAgIGxldCBpY29uaW1nID0gZmluZEljb24obmFtZSwgJC5lcl91aSk7XFxuXFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcImxvY2F0aW9uQFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICB0aXRsZTogbmFtZSxcXG4gICAgICAgICAgICAgICAgICBpbWc6IGljb25pbWcsXFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcInNob3dpXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICB9LCBjaSwgZnJvbSwgaWQpXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcInNob3dpXFxcIik7XFxuICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgICBpbWc6IGVyLue6v+i3r+agt+W8jy5pbmNsdWRlcyhcXFwic2VsZWN0XFxcIikgPyBmaW5kSWNvbihmcm9tW2NpXSkgOiBcXFwiXFxcIixcXG4gICAgICAgICAgY29sX3R5cGU6ICdhdmF0YXInLFxcbiAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBcXFwibG9jYXRpb25AXFxcIlxcbiAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICAgIH1cXG4gICAgfVxcbiAgfVxcblxcbiAgZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgaWQ6IFxcXCJwbGF5cGFnZWxpbmVcXFwiXFxuICAgIH1cXG4gIH0pXFxuXFxuICBkLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgIGlkOiBcXFwicGxheWxpc3RzXFxcIlxcbiAgICB9XFxuICB9KTtcXG5cXG4gIGQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgIGNsczogXFxcInBsYXlsaXN0MlxcXCIsXFxuICAgICAgaWQ6IFxcXCJwbGF5bGlzdHNFTkRcXFwiXFxuICAgIH1cXG4gIH0pO1xcblxcbiAgbGV0IG1lcyA9IFtmb250c3R5bGUoJ+S7peS4iuaVsOaNruadpea6kOS6jue9kee7nO+8jOWmguaCqOWWnOasou+8jOivt+aUr+aMgeWumOaWue+8gScsIHsgYzogXFxcImdyZXlcXFwiLCB0YWdzOiBcXFwic21hbGxcXFwiIH0pXTtcXG5cXG4gIGlmIChjYWNoZU1hbmFnZS5leGlzdChNWV9QQVJBTVMuc25hbWUgKyBpZCkpIHtcXG4gICAgbWVzLnVuc2hpZnQoZm9udHN0eWxlKFxcXCLlvZPliY3kuLrnvJPlrZgs54K55oiR5Yi35pawXFxcIiwge1xcbiAgICAgIGM6IGVyLue6v+i3r+minOiJsiwgdGFnczogXFxcInNtYWxsXFxcIlxcbiAgICB9KSlcXG4gIH1cXG5cXG4gIGQucHVzaCh7XFxuICAgIHRpdGxlOiBtZXMuam9pbihcXFwiXFxcXG5cXFwiKSxcXG4gICAgLy9kZXNjOiBmb250c3R5bGUoJ+atpOinhOWImeS7hemZkOWtpuS5oOS6pOa1geS9v+eUqO+8jOivt+S6juWvvOWFpeWQjjI05bCP5pe25YaF5Yig6Zmk77yM5Lu75L2V57uE57uH5oiW5Liq5Lq65LiN5b6X5Lul5Lu75L2V5pa55byP5pa55rOV5Lyg5pKt5q2k6KeE5YiZ55qE5pW05L2T5oiW6YOo5YiG77yBJywgeyBjOiBcXFwiI0YyMEMwMFxcXCIsIHRhZ3M6IFxcXCJzbWFsbFxcXCIgfSksXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQsIG1zKSA9PiB7XFxuICAgICAgbGV0IGVyID0gJC5yZXF1aXJlKFxcXCJVSU1hbmFnZVxcXCIpLnVpX2NvbmZpZy5lcjtcXG4gICAgICBsZXQge1xcbiAgICAgICAgY2FjaGVNYW5hZ2VcXG4gICAgICB9ID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIik7XFxuICAgICAgbGV0IGNhID0gY2FjaGVNYW5hZ2UuZXhpc3QobXMuc25hbWUgKyBpZCk7XFxuICAgICAgaWYgKGNhKSB7XFxuICAgICAgICBjYWNoZU1hbmFnZS5kZWwobXMuc25hbWUgKyBpZCk7XFxuICAgICAgfVxcbiAgICAgIGNsZWFyTXlWYXIoXFxcInBsYXlsaXN0X3JlYWR5XFxcIik7XFxuICAgICAgaWYgKGVyLuS6jOe6p+WIt+aWsCB8fCBjYSkge1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBpZCwgTVlfUEFSQU1TKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICBjbHM6IFxcXCJwbGF5bGlzdDJcXFwiLFxcbiAgICB9XFxuICB9KVxcblxcbiAgcmVub3ZhdGVMaXN0KGdldE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBcXFwiMFxcXCIpKTtcXG4gIHNldFJlc3VsdChkKTtcXG59KSgpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDmlofku7ZcIixcInBhdGhcIjpcImNvbmZpZ3NcIixcInJ1bGVcIjpcImNvbnN0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9EcnB5SGlrZXIvcGFyc2VzLmpzb25cXFwiO1xcbmNvbnN0IG9sZHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL3BhcnNlcy5qc29uXFxcIjtcXG5sZXQgZGF0YTtcXG5cXG5mdW5jdGlvbiBnZXRKc29uKCkge1xcbiAgICBpZiAoIWZpbGVFeGlzdChwYXRoKSAmJiBmaWxlRXhpc3Qob2xkcGF0aCkpIHtcXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlKG9sZHBhdGgpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgc2F2ZUZpbGUocGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xcbiAgICAgICAgLy9kZWxldGVGaWxlKG9sZHBhdGgpO1xcbiAgICB9XFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XFxuICAgICAgICByZXR1cm4gZGF0YTtcXG4gICAgfVxcbiAgICB0cnkge1xcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UocmVhZEZpbGUocGF0aCkgfHwgXFxcIltdXFxcIik7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGRlbGV0ZUZpbGUocGF0aCk7XFxuICAgICAgICBkYXRhID0gW107XFxuICAgIH1cXG4gICAgcmV0dXJuIGRhdGE7XFxufVxcblxcbmZ1bmN0aW9uIHNhdmVKc29uKGpzb24pIHtcXG4gICAgc2F2ZUZpbGUocGF0aCwgSlNPTi5zdHJpbmdpZnkoanNvbikpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRVc2VmdWxKc29uKCkge1xcbiAgICByZXR1cm4gZ2V0SnNvbigpLmZpbHRlcih2ID0+ICF2LmZvcmJpZGRlbik7XFxufVxcblxcbmZ1bmN0aW9uIGdldEZvcmJpZGRlbkpzb24oKSB7XFxuICAgIHJldHVybiBnZXRKc29uKCkuZmlsdGVyKHYgPT4gdi5mb3JiaWRkZW4pO1xcbn1cXG5cXG4kLmV4cG9ydHMgPSB7XFxuICAgIGdldEpzb24sXFxuICAgIHNhdmVKc29uLFxcbiAgICBnZXRVc2VmdWxKc29uLFxcbiAgICBnZXRGb3JiaWRkZW5Kc29uLFxcbiAgICBwYXRoLFxcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDnrqHnkIZcIixcInBhdGhcIjpcInJ1bGVNYW5hZ2VcIixcInJ1bGVcIjpcImpzOlxcbnZhciBkID0gW107XFxuc2V0UGFnZVRpdGxlKFxcXCLop6PmnpDnrqHnkIZcXFwiKTtcXG5sZXQgY29uZmlncyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpO1xcbmxldCBhcnIgPSBjb25maWdzLmdldEpzb24oKTtcXG5sZXQgbGVuZ3RoID0gYXJyLmxlbmd0aDtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgIHRpdGxlOiBcXFwi5o+Q56S6XFxcIixcXG4gICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzI3LnBuZ1xcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBjb25zdCBoaWtlclBvcCA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Njk2NlxcXCIpO1xcbiAgICAgICAgbGV0IHBvcCA9IGhpa2VyUG9wLmluZm9Cb3R0b20oe1xcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcXG4gICAgICAgICAgICAgICAgXFxcIlvlu7rorq5d77ya6Kej5p6Q5Y+q6ZyA6KaB5L+d5a2Y5bCR6YeP5aW955So55qE5Y2z5Y+v77yM5LiN6ZyA6KaB5aSq5aSa44CCXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcIlvmj5DnpLpd77ya6Kej5p6Q5pyJ5pe25pWI5oiW6YeN5a6a5ZCR55qEJ+mrmOe6pyfop6PmnpDvvIzmnKznqIvluo/kuI3mlK/mjIHvvIzlu7rorq7liKDpmaTjgIJcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiW1EmQV3vvJrkuLrllaXlnKjnvJbovpHpobXpnaLmtYvor5Xop6PmnpDml7bog73nlKjvvIzkv53lrZjlkI7lho3op4bpopHmupDkuK3ljbTop6PmnpDkuI3lh7rmnaXvvJ9cXFxcbuS4jeefpemBk++8jOaIkeeahOino+WGs+WKnuazleaYr+W7uuiuruWIoOmZpOOAglxcXCJcXG4gICAgICAgICAgICBdLFxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaWsOWinlxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9ydWxlRWRpdCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoI1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fZG9tYWluX2NvbmZpZ1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBwYWdlVGl0bGU6IFxcXCLmlrDlop7op6PmnpBcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIhuS6q1xcXCIsXFxuICAgIHVybDogJChcXFwiLTFcXFwiLCBcXFwi6L6T5YWl5L2g6KaB5YiG5Lqr6Kej5p6Q55qE5bqP5Y+3XFxcXG4tMeWFqOmDqO+8jC0y5bey5ZCv55So55qE77yMLTPlt7LnpoHnlKjnmoRcXFwiKS5pbnB1dCgobGVuZ3RoKSA9PiB7XFxuICAgICAgICBsZXQgaW5kZXhjID0gaW5wdXQuc3BsaXQoLyx877yMLyk7XFxuICAgICAgICBsZXQgaW5kZXhzID0gW107XFxuICAgICAgICBsZXQgbW8gPSBwYXJzZUludChpbmRleGNbMF0pO1xcbiAgICAgICAgaWYgKCEoaW5kZXhjLmxlbmd0aCAhPT0gMCAmJiBtbyA8IDAgJiYgbW8gPiAtNSkpIHtcXG4gICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBpbmRleGMpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KGl0KTtcXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihudW0pIHx8IG51bSA+PSBsZW5ndGggfHwgbnVtIDwgMCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aVsOWtl+S4jeWQiOazlVxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaW5kZXhzLnB1c2gobnVtKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuXFxuICAgICAgICByZXR1cm4gJChbXFxcIkhJS0VSXFxcIiwgXFxcIlRYVFxcXCJdLmNvbmNhdChnZXRQYXN0ZXMoKSksIDIsIFxcXCLliIbkuqvmlrnlvI9cXFwiKS5zZWxlY3QoKG1vLCBpbmRleHMsIGV4dCkgPT4ge1xcbiAgICAgICAgICAgIGZ1bmN0aW9uIHVwKHJ1bGVzKSB7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlYjY0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHJ1bGVzKSk7XFxuICAgICAgICAgICAgICAgIGxldCBnZXRQYXNzID0gKGxlbmd0aCwgcnVsZSwgdHlwZSkgPT4gXFxcIua1t+mYlOinhueVjO+8jERSUFnop6PmnpDvvIzlhbHjgIxcXFwiICsgbGVuZ3RoICsgXFxcIuOAjeadoe+8jOWkjeWItuaVtOadoeWPo+S7pOaJk+W8gOi9r+S7tuWwseS8muiHquWKqOWvvOWFpSRcXFwiICsgcnVsZSArIFxcXCIkXFxcIiArIHR5cGUgKyBcXFwiQGltcG9ydD1qczokLnJlcXVpcmUoJ2ltcG9ydD9ydWxlPScrXFxcIiArIEpTT04uc3RyaW5naWZ5KE1ZX1JVTEUudGl0bGUpICsgXFxcIikoaW5wdXQpXFxcIjtcXG4gICAgICAgICAgICAgICAgaWYgKGdldFBhc3RlcygpLmluY2x1ZGVzKGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBzaGFyZVBhc3RlKHJ1bGViNjQsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBnZXRQYXNzKHJ1bGVzLmxlbmd0aCwgdSwgXFxcImJcXFwiKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9zaGFyZS9kcnB56Kej5p6Q44CMXFxcIiArIHJ1bGVzLmxlbmd0aCArIFxcXCLjgI3mnaEuXFxcIiArIChpbnB1dCA9PT0gXFxcIkhJS0VSXFxcIiA/IFxcXCJoaWtlclxcXCIgOiBcXFwidHh0XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUocGF0aCwgZ2V0UGFzcyhydWxlcy5sZW5ndGgsIHJ1bGViNjQsIFxcXCJhXFxcIikpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJzaGFyZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBydWxlcztcXG4gICAgICAgICAgICBpZiAobW8gPT09IC0xKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW8gPT09IC0yKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0VXNlZnVsSnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW8gPT09IC0zKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0Rm9yYmlkZGVuSnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpLmZpbHRlcigodiwgaSkgPT4gaW5kZXhzLmluY2x1ZGVzKGkpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcnVsZXMgPSBydWxlcy5tYXAoKHYpID0+IHtcXG4gICAgICAgICAgICAgICAgdi5mb3JiaWRkZW4gPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgICAgIHJldHVybiB2O1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB1cChydWxlcyk7XFxuICAgICAgICB9LCBtbywgaW5kZXhzLCBpbmRleGNbMV0pO1xcblxcbiAgICB9LCBsZW5ndGgpLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3NoYXJlX2dyZWVuXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YeN572uXFxcIixcXG4gICAgdXJsOiAkKFxcXCLkvaDnoa7lrprph43nva7vvJ9cXFxcbuivpeaTjeS9nOS8muWIoOmZpOeOsOacieino+aekO+8jOaBouWkjeiHquW4puino+aekOOAglxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgIGRlbGV0ZUZpbGUocGF0aCk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5wYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9yZWZyZXNoXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5riF56m6XFxcIixcXG4gICAgdXJsOiAkKFxcXCLkvaDnoa7lrprlhajpg6jliKDpmaTvvJ9cXFxcbuivpeaTjeS9nOS8muWIoOmZpOeOsOacieino+aekOOAglxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgIHdyaXRlRmlsZShwYXRoLCBcXFwiW11cXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnBhdGgpLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2NvZGVfdmlld1xcXCJcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICAvL3RpdGxlOiAnPGZvbnQgY29sb3I9XFxcIiMxM0I2MUJcXFwiPuKWkCA8L2ZvbnQ+PGI+6Kej5p6Q5YiX6KGoPGI+ICgnICsgU3RyaW5nKGxlbmd0aCkuZm9udGNvbG9yKFxcXCIjZmY2NjAxXFxcIikgKyBcXFwiKVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG59KTtcXG5sZXQgY291bnRUaXRsZSA9IGQuYXQoLTEpO1xcblxcbmZ1bmN0aW9uIHVuaXF1ZU5lc3RlZChhcnIpIHtcXG4gICAgcmV0dXJuIGFyci5tYXAoaXRlbSA9PiB7XFxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xcbiAgICAgICAgICAgIHJldHVybiB1bmlxdWVOZXN0ZWQoaXRlbSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gaXRlbTtcXG4gICAgfSkuZmxhdChJbmZpbml0eSkuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4KTtcXG59XFxudmFyIGl0cyA9IFtdXFxubGV0IGZsYWdpID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImZsYWdpXFxcIiwgW1xcXCLlhajpg6hcXFwiXSk7XFxubGV0IGNvdW50ID0gaXRzLmxlbmd0aDtcXG5sZXQgZmxhZ3MgPSB1bmlxdWVOZXN0ZWQoYXJyLm1hcCh4ID0+IHguZmxhZy5zcGxpdChcXFwifFxcXCIpKSk7XFxuZmxhZ3MudW5zaGlmdChcXFwi5bey56aB55SoXFxcIik7XFxuZmxhZ3MudW5zaGlmdChcXFwi5YWo6YOoXFxcIik7XFxuXFxubGV0IHNob3cgPSBnZXRNeVZhcihcXFwiZmxhZ3Nob3dcXFwiLCBcXFwiXFxcIik7XFxubGV0IGNvbCA9IHNob3cgPT0gXFxcIuWxleW8gFxcXCIgPyBcXFwiZmxleF9idXR0b25cXFwiIDogXFxcInNjcm9sbF9idXR0b25cXFwiO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBzaG93ID09IFxcXCLlsZXlvIBcXFwiID8gXFxcIuKAnOKAnOKAneKAnTxiPlxcXCIgKyBcXFwi4oinXFxcIi5mb250Y29sb3IoXFxcIiMxYWFkMTlcXFwiKSArIFxcXCI8L2I+XFxcIiA6IFxcXCLigJzigJzigJ3igJ08Yj5cXFwiICsgXFxcIuKIqFxcXCIuZm9udGNvbG9yKFxcXCIjRkYwMDAwXFxcIikgKyBcXFwiPC9iPlxcXCIsXFxuICAgIGNvbF90eXBlOiBjb2wsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBsZXQgc2hvdyA9IGdldE15VmFyKFxcXCJmbGFnc2hvd1xcXCIsIFxcXCLlsZXlvIBcXFwiKTtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJmbGFnc2hvd1xcXCIsIHNob3cgPT0gXFxcIuWxleW8gFxcXCIgPyBcXFwi5pS26LW3XFxcIiA6IFxcXCLlsZXlvIBcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KVxcbn0pXFxuXFxuXFxuZmxhZ3MuZm9yRWFjaChmID0+IHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChmbGFnaS5pbmNsdWRlcyhmKSA/IGYuZm9udGNvbG9yKFxcXCIjMTNCNjFCXFxcIikgOiBmKSxcXG4gICAgICAgIGNvbF90eXBlOiBjb2wsXFxuICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGYpID0+IHtcXG4gICAgICAgICAgICBsZXQgZmxhZ2kgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZmxhZ2lcXFwiLCBbXFxcIuWFqOmDqFxcXCJdKTtcXG4gICAgICAgICAgICBpZiAoLyjlhajpg6h85bey56aB55SoKS8udGVzdChmKSkge1xcbiAgICAgICAgICAgICAgICBmbGFnaSA9IFtmXVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGZsYWdpID0gZmxhZ2kuZmlsdGVyKHggPT4gIS8o5YWo6YOofOW3suemgeeUqCkvLnRlc3QoeCkpO1xcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ2kuaW5jbHVkZXMoZikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGZsYWdpID0gZmxhZ2kuZmlsdGVyKHggPT4geCAhPSBmKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChmbGFnaS5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdpID0gW1xcXCLlhajpg6hcXFwiXVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgZmxhZ2kucHVzaChmKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJmbGFnaVxcXCIsIGZsYWdpKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBmKVxcbiAgICB9KVxcbn0pXFxuZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xcbiAgICBsZXQgaXQgPSBhcnJbaV07XFxuXFxuICAgIGxldCBmbGFnID0gaXQuZmxhZy5zcGxpdChcXFwifFxcXCIpO1xcbiAgICBpZiAoZmxhZ2kubGVuZ3RoID4gMCAmJiAhW1xcXCLlhajpg6hcXFwiLCBcXFwi5bey56aB55SoXFxcIl0uaW5jbHVkZXMoZmxhZ2lbMF0pKSB7XFxuICAgICAgICBpZiAoIWZsYWdpLmV2ZXJ5KGYgPT4gZmxhZy5pbmNsdWRlcyhmKSkpIHtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAoW1xcXCLlt7LnpoHnlKhcXFwiXS5pbmNsdWRlcyhmbGFnaVswXSkpIHtcXG4gICAgICAgIGlmICghaXQuaGFzT3duUHJvcGVydHkoXFxcImZvcmJpZGRlblxcXCIpIHx8ICFpdC5mb3JiaWRkZW4pIHtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBpdHMucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnVsnICsgaSArICddPGI+ICAnICsgaXQubmFtZSArIChpdC5mb3JiaWRkZW4gPyBcXFwiICPigJzigJznpoHnlKjigJ3igJ1cXFwiLnNtYWxsKCkgOiBcXFwiXFxcIiksXFxuICAgICAgICBkZXNjOiBpdC51cmwsXFxuICAgICAgICBmb3JiaWRkZW46IGl0LmZvcmJpZGRlbixcXG4gICAgICAgIHVybDogJChbXFxcIue8lui+kVxcXCIsIFxcXCLliIbkuqtcXFwiLCBcXFwi56aB55SoL+WQr+eUqFxcXCIsIFxcXCLnp7vliqhcXFwiLCBcXFwi572u6aG2XFxcIiwgXFxcIuWIoOmZpFxcXCJdLCAxLCBcXFwi5pON5L2c77yaXFxcIiArIGl0Lm5hbWUpLnNlbGVjdCgoaW5kZXgsIGxlbmd0aCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIue8lui+kVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCNcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLliIbkuqtcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCBvcHMgPSBnZXRQYXN0ZXMoKTtcXG4gICAgICAgICAgICAgICAgb3BzLnVuc2hpZnQoXFxcIuWujOaVtOWPo+S7pFxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChvcHMsIDIsIFxcXCLliIbkuqvmlrnlvI9cXFwiKS5zZWxlY3QoKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKVtpbmRleF07XFxuICAgICAgICAgICAgICAgICAgICBydWxlLnVzZXIgPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgICAgICAgICBydWxlLmZvcmJpZGRlbiA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlYjY0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHJ1bGUpKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBnZXRQYXNzID0gKG5hbWUsIHJ1bGUsIHR5cGUpID0+IFxcXCLmtbfpmJTop4bnlYzvvIzjgIxcXFwiICsgbmFtZSArIFxcXCLjgI1EUlBZ6Kej5p6Q77yM5aSN5Yi25pW05p2h5Y+j5Luk5omT5byA6L2v5Lu25bCx5Lya6Ieq5Yqo5a+85YWlJFxcXCIgKyBydWxlICsgXFxcIiRcXFwiICsgdHlwZSArIFxcXCJAaW1wb3J0PWpzOiQucmVxdWlyZSgnaW1wb3J0P3J1bGU9JytcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFwiKShpbnB1dClcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09IFxcXCLlrozmlbTlj6Pku6RcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGdldFBhc3MocnVsZS5uYW1lLCBydWxlYjY0LCBcXFwiYVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IHNoYXJlUGFzdGUocnVsZWI2NCwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBnZXRQYXNzKHJ1bGUubmFtZSwgdSwgXFxcImJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSwgaW5kZXgpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLnp7vliqhcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKGluZGV4ICsgXFxcIlxcXCIsIFxcXCLovpPlhaXkvY3nva5cXFwiKS5pbnB1dCgoaW5kZXgsIGxlbmd0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0luZGV4ID0gTnVtYmVyKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obmV3SW5kZXgpIHx8IG5ld0luZGV4ID49IGxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3lkozop4TnmoTkvY3nva5cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBydWxlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKG5ld0luZGV4LCAwLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgfSwgaW5kZXgsIGxlbmd0aCk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIue9rumhtlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzLnNwbGljZShpbmRleCwgMSlbMF07XFxuICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShuZXdJbmRleCwgMCwgcnVsZSk7XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLliKDpmaRcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLnoa7orqTliKDpmaTvvJ9cXFwiKS5jb25maXJtKChpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBydWxlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24ocnVsZXMpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWIoOmZpFxcXCIgKyBydWxlLm5hbWU7XFxuICAgICAgICAgICAgICAgIH0sIGluZGV4KTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IGFycltpbmRleF07XFxuICAgICAgICAgICAgICAgIHJ1bGUuZm9yYmlkZGVuID0gIXJ1bGUuZm9yYmlkZGVuO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyAocnVsZS5mb3JiaWRkZW4gPyBcXFwi56aB55SoXFxcIiA6IFxcXCLlkK/nlKhcXFwiKSArIHJ1bGUubmFtZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBpLCBsZW5ndGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpOiBpLFxcbiAgICAgICAgICAgIHBhZ2VUaXRsZTogaXQubmFtZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuXFxuY291bnRUaXRsZS50aXRsZSA9ICc8Zm9udCBjb2xvcj1cXFwiIzEzQjYxQlxcXCI+4paQIDwvZm9udD48Yj7op6PmnpDliJfooag8Yj4gKCcgKyAoKGl0cy5sZW5ndGggLSBjb3VudCkgKyBcXFwiL1xcXCIgKyBsZW5ndGgpLmZvbnRjb2xvcihcXFwiI2ZmNjYwMVxcXCIpICsgXFxcIilcXFwiO1xcblxcbmQgPSBkLmNvbmNhdChpdHMpO1xcblxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuino+aekOe8lui+kVwiLFwicGF0aFwiOlwicnVsZUVkaXRcIixcInJ1bGVcIjpcImpzOlxcbnZhciBkID0gW107XFxuXFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfbmFtZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc191cmxcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfZmxhZ1xcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19oZWFkZXJzXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX21ldGhvZFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19ydW5UeXBlXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX2pzb25QYXRoXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX2pzXFxcIik7XFxufSkpO1xcbmxldCB1cmxJbmRleCA9IHBhcnNlSW50KGdldFBhcmFtKFxcXCJpbmRleFxcXCIsIFxcXCJcXFwiKSk7XFxudXJsSW5kZXggPSBOdW1iZXIuaXNOYU4odXJsSW5kZXgpID8gdm9pZCgwKSA6IHVybEluZGV4O1xcbmxldCBpbmRleCA9IHZvaWQoMCkgPT09IHVybEluZGV4ID8gTVlfUEFSQU1TLmkgOiB1cmxJbmRleDtcXG5sZXQgaXNJbXBvcnQgPSAhIWdldFBhcmFtKFxcXCJpc0ltcG9ydFxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbmxldCBvYmo7XFxuaWYgKGlzSW1wb3J0KSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBvYmogPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL2ppZXhpU2ltcGxlSW1wb3J0Lmpzb25cXFwiKTtcXG4gICAgICAgIGxldCB0aXAgPSBpbmRleCAhPT0gdm9pZCgwKSA/IFxcXCLmm7TmlrDop6PmnpBcXFwiIDogXFxcIuWvvOWFpeino+aekFxcXCI7XFxuICAgICAgICBzZXRQYWdlVGl0bGUodGlwICsgXFxcIjpcXFwiICsgb2JqLm5hbWUpO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAmOKAmFxcXCIgKyB0aXAgKyBcXFwi4oCZ4oCZXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcblxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBvYmogPSB7fTtcXG4gICAgICAgIGJhY2soKTtcXG4gICAgICAgIHRvYXN0KFxcXCLlr7zlhaXplJnor69cXFwiKTtcXG4gICAgfVxcbn0gZWxzZSBpZiAoaW5kZXggIT09IHZvaWQoMCkpIHtcXG4gICAgb2JqID0gYXJyW2luZGV4XTtcXG4gICAgc2V0UGFnZVRpdGxlKFxcXCLnvJbovpHop6PmnpA6XFxcIiArIG9iai5uYW1lKTtcXG59IGVsc2Uge1xcbiAgICBvYmogPSB7XFxuICAgICAgICBydW5UeXBlOiBcXFwiV0VCXFxcIixcXG4gICAgICAgIG1ldGhvZDogXFxcIkdFVFxcXCJcXG4gICAgfTtcXG4gICAgc2V0UGFnZVRpdGxlKFxcXCLmlrDlu7rop6PmnpBcXFwiKTtcXG59XFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLlkI3lrZco5b+F5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX25hbWVcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLm5hbWUsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5cXG5cXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuino+aekHVybCjlv4XloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfdXJsXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai51cmwsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCJmbGFnKOW/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogMixcXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfZmxhZ1xcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwicHNfZmxhZ1xcXCIsb2JqLmZsYWd8fFxcXCJxaXlpfGltZ29854ix5aWH6Im6fOWlh+iJunxxcXxxcSDpooTlkYrlj4roirHnta586IW+6K6vfHlvdWt1fOS8mOmFt3xwcHR2fFBQVFZ8bGV0dnzkuZDop4Z8bGVzaGl8bWd0dnzoipLmnpx8c29odXx4aWd1YXxmdW586aOO6KGMXFxcIiksXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCJoZWFkZXJzKOmAieWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogMixcXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfaGVhZGVyc1xcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmouaGVhZGVycyxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5cXG5wdXRNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIsIG9iai5ydW5UeXBlIHx8IFxcXCJcXFwiKTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuino+aekOaooeW8j++8mlxcXCIgKyAob2JqLnJ1blR5cGUgfHwgXFxcIldFQlxcXCIpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6ICQoW1xcXCJXRUJcXFwiLCBcXFwiSlNPTlxcXCIsIFxcXCJKU1xcXCJdKS5zZWxlY3QoKCkgPT4ge1xcblxcbiAgICAgICAgcHV0TXlWYXIoXFxcInBzX3J1blR5cGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJwc19ydW5UeXBlXFxcIiwge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi6Kej5p6Q5qih5byP77yaXFxcIiArIGlucHV0XFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IFxcXCJwc19ydW5UeXBlXFxcIixcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuXFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwianNvblBhdGgoSlNPTuino+aekOaooeW8j+W/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19qc29uUGF0aFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmouanNvblBhdGgsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxucHV0TXlWYXIoXFxcInBzX21ldGhvZFxcXCIsIG9iai5tZXRob2QgfHwgXFxcIlxcXCIpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiSlNPTuivt+axguaooeW8j++8mlxcXCIgKyAob2JqLm1ldGhvZCB8fCBcXFwiR0VUXFxcIiksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiAkKFtcXFwiR0VUXFxcIiwgXFxcIlBPU1RcXFwiXSkuc2VsZWN0KCgpID0+IHtcXG5cXG4gICAgICAgIHB1dE15VmFyKFxcXCJwc19tZXRob2RcXFwiLCBpbnB1dCk7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJwc19tZXRob2RcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCJKU09O6K+35rGC5qih5byP77yaXFxcIiArIGlucHV0XFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IFxcXCJwc19tZXRob2RcXFwiLFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCJqcyhKU+aooeW8j+W/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogMyxcXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfanNcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmpzLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5kZXgsIHVybEluZGV4KSA9PiB7XFxuICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5q2k6aG55peg5rOV5Yig6ZmkXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh1cmxJbmRleCAhPT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjmm7TmlrDop6PmnpDvvIzliKDpmaTor7fku47op6PmnpDnrqHnkIbov5vlhaVcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmuKnppqjmj5DnpLpcXFwiLFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLnoa7lrpropoHliKDpmaTmraTop6PmnpDlkJfvvJ/ms6jmhI/liKDpmaTlkI7ml6Dms5XmgaLlpI1cXFwiLFxcbiAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9LCBpbmRleClcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBpbmRleCwgdXJsSW5kZXgpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmtYvor5VcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgbGV0IHRlc3RLZXl3b3JkID0gZ2V0SXRlbShcXFwidGVzdFVybFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIHJldHVybiAkKHRlc3RLZXl3b3JkLCBcXFwi6K+36L6T5YWl5b2x6KeG572R56uZ5Zyw5Z2AXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInRlc3RVcmxcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKFxcXCJwc191cmxcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBnZXRNeVZhcihcXFwicHNfbmFtZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZmxhZyA9IGdldE15VmFyKFxcXCJwc19mbGFnXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0gZ2V0TXlWYXIoXFxcInBzX2hlYWRlcnNcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgbGV0IHJ1blR5cGUgPSBnZXRNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIsIFxcXCJXRUJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgbWV0aG9kID0gZ2V0TXlWYXIoXFxcInBzX21ldGhvZFxcXCIsIFxcXCJHRVRcXFwiKTtcXG4gICAgICAgICAgICBsZXQganNvblBhdGggPSBnZXRNeVZhcihcXFwicHNfanNvblBhdGhcXFwiLCBcXFwiXFxcIikudHJpbSgpIHx8IHZvaWQgMDtcXG4gICAgICAgICAgICBsZXQganMgPSBnZXRNeVZhcihcXFwicHNfanNcXFwiLCBcXFwiXFxcIikgfHwgdm9pZCAwO1xcbiAgICAgICAgICAgIGlmIChoZWFkZXJzKSB7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gSlNPTi5wYXJzZShoZWFkZXJzKTtcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoZWFkZXJz5qC85byP6ZSZ6K+vOlxcXCIgKyBlLnRvU3RyaW5nKCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwidmlkZW9VcmxcXFwiKS5wcmVwYXJlUGFyc2VzKFt7XFxuICAgICAgICAgICAgICAgIG5hbWUsXFxuICAgICAgICAgICAgICAgIHVybCxcXG4gICAgICAgICAgICAgICAgZmxhZyxcXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcXG4gICAgICAgICAgICAgICAgcnVuVHlwZSxcXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxcbiAgICAgICAgICAgICAgICBqc29uUGF0aCxcXG4gICAgICAgICAgICAgICAganNcXG4gICAgICAgICAgICB9XSwgaW5wdXQsbnVsbCwgdHJ1ZSk7XFxuICAgICAgICB9KTtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5kZXgsIGlzSW1wb3J0KSA9PiB7XFxuICAgICAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJwc19uYW1lXFxcIiwgXFxcIlxcXCIpLnRyaW0oKTtcXG4gICAgICAgIGlmICghbmFtZSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lkI3lrZflvpfmnInkuIDkuKrlkKdcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKFxcXCJwc191cmxcXFwiLCBcXFwiXFxcIikudHJpbSgpO1xcbiAgICAgICAgaWYgKCF1cmwpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6Kej5p6Q5Zyw5Z2A5LiN6IO95Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBmbGFnID0gZ2V0TXlWYXIoXFxcInBzX2ZsYWdcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoIWZsYWcpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6Kej5p6Q5Zyw5Z2A5qCH6K+G5LiN6IO95Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBoZWFkZXJzID0gZ2V0TXlWYXIoXFxcInBzX2hlYWRlcnNcXFwiLCBcXFwiXFxcIikudHJpbSgpO1xcbiAgICAgICAgaWYgKGhlYWRlcnMpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gSlNPTi5wYXJzZShoZWFkZXJzKTtcXG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIGhlYWRlcnMhPT1cXFwib2JqZWN0XFxcIikgdGhyb3cgbmV3IEVycm9yKFxcXCLplJnor6/nsbvlnovvvIzlv4XpobvkuLpPYmplY3RcXFwiKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGVhZGVyc+agvOW8j+mUmeivrzpcXFwiICsgZS50b1N0cmluZygpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydW5UeXBlID0gZ2V0TXlWYXIoXFxcInBzX3J1blR5cGVcXFwiLCBcXFwiV0VCXFxcIik7XFxuICAgICAgICBsZXQgbWV0aG9kID0gZ2V0TXlWYXIoXFxcInBzX21ldGhvZFxcXCIsIFxcXCJHRVRcXFwiKTtcXG4gICAgICAgIGxldCBqc29uUGF0aCA9IGdldE15VmFyKFxcXCJwc19qc29uUGF0aFxcXCIsIFxcXCJcXFwiKS50cmltKCkgfHwgdm9pZCAwO1xcbiAgICAgICAgbGV0IGpzID0gZ2V0TXlWYXIoXFxcInBzX2pzXFxcIiwgXFxcIlxcXCIpIHx8IHZvaWQgMDtcXG4gICAgICAgIGlmIChydW5UeXBlID09PSBcXFwiSlNPTlxcXCIgJiYgIWpzb25QYXRoKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL0pTT07mqKHlvI/kuIvlv4Xpobvloatqc29uUGF0aFxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKHJ1blR5cGUgPT09IFxcXCJKU1xcXCIgJiYgIWpzKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL0pT5qih5byP5LiL5b+F6aG75aGranNcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgIGxldCBvYmoxID0ge1xcbiAgICAgICAgICAgIG5hbWUsXFxuICAgICAgICAgICAgdXJsLFxcbiAgICAgICAgICAgIGZsYWcsXFxuICAgICAgICAgICAgaGVhZGVycyxcXG4gICAgICAgICAgICBydW5UeXBlLFxcbiAgICAgICAgICAgIG1ldGhvZCxcXG4gICAgICAgICAgICBqc29uUGF0aCxcXG4gICAgICAgICAgICBqc1xcbiAgICAgICAgfTtcXG4gICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgIGlmIChhcnIuc29tZSh2ID0+IHYubmFtZSA9PT0gbmFtZSkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+WtmOWcqOivpeino+aekFxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChvYmoxLmdyb3VwKSB7XFxuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IG9iajEuZ3JvdXA7XFxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGFyci5maW5kSW5kZXgodiA9PiB2Lmdyb3VwID09PSBncm91cCk7XFxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgIGFyci51bnNoaWZ0KG9iajEpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMCwgb2JqMSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpZiAoaXNJbXBvcnQpIHtcXG4gICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKG9iajEpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgYXJyLnVuc2hpZnQob2JqMSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCBuYW1leSA9IGFycltpbmRleF0ubmFtZTtcXG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gbmFtZXkpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGFyci5zb21lKHYgPT4gdi5uYW1lID09PSBuYW1lKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+WtmOWcqOivpeino+aekFxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgb2JqMSA9IE9iamVjdC5hc3NpZ24oYXJyW2luZGV4XSwgb2JqMSk7XFxuICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMSwgb2JqMSk7XFxuICAgICAgICB9XFxuICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgYmFjayh0cnVlKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv53lrZjmiJDlip9cXFwiO1xcbiAgICB9LCBpbmRleCwgaXNJbXBvcnQpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6Q5a+85YWlXCIsXCJwYXRoXCI6XCJpbXBvcnRcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIHNhdmVDYWNoZShqc29uKSB7XFxuICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvamlleGlTaW1wbGVJbXBvcnQuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG59XFxuXFxuZnVuY3Rpb24gaW1wb3J0UGFyc2UocGFzcykge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IFtfLCBydWxlLCB0eXBlXSA9IHBhc3Muc3BsaXQoXFxcIiRcXFwiKTtcXG4gICAgICAgIGlmICh0eXBlID09PSBcXFwiYlxcXCIpIHtcXG4gICAgICAgICAgICBydWxlID0gcGFyc2VQYXN0ZShydWxlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKHJ1bGUpKTtcXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpIHtcXG4gICAgICAgICAgICBydWxlcyA9IFtydWxlc107XFxuICAgICAgICB9XFxuICAgICAgICAvL3J1bGVzLnJldmVyc2UoKTtcXG4gICAgICAgIE1ZX1VSTCA9IG1vZHVsZS5pZDtcXG4gICAgICAgIGxldCBydWxlVGl0bGUgPSBnZXRQYXJhbShcXFwicnVsZVxcXCIpO1xcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlncz9ydWxlPVxcXCIgKyBydWxlVGl0bGUpLmdldEpzb24oKTtcXG4gICAgICAgIGxldCBuZXdJID0gMDtcXG4gICAgICAgIGZvciAobGV0IHJ1bGUgb2YgcnVsZXMpIHtcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBhcnIuZmluZEluZGV4KHYgPT4gdi5uYW1lID09PSBydWxlLm5hbWUpO1xcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGUgPSBPYmplY3QuYXNzaWduKGFycltpbmRleF0sIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUNhY2hlKHJ1bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP2lzSW1wb3J0PXRydWUmaW5kZXg9XFxcIiArIGluZGV4ICsgXFxcIiZydWxlPVxcXCIgKyBydWxlVGl0bGU7XFxuICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KFxcXCLlt7Lmm7TmlrDop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi5bey5pu05paw6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIG5ld0krKztcXG4gICAgICAgICAgICAgICAgYXJyLnB1c2gocnVsZSk7XFxuICAgICAgICAgICAgICAgIGlmIChydWxlcy5sZW5ndGggPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVDYWNoZShydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9pc0ltcG9ydD10cnVlJnJ1bGU9XFxcIiArIHJ1bGVUaXRsZTtcXG4gICAgICAgICAgICAgICAgICAgIC8vdG9hc3QoXFxcIuW3suWvvOWFpeinhOWIme+8mlxcXCIgKyBydWxlLm5hbWUpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKFxcXCLlt7Llr7zlhaXop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3M/cnVsZT1cXFwiICsgcnVsZVRpdGxlKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLmlrDlop7vvJpcXFwiICsgbmV3SSArIFxcXCIg6KaG55uW5pu05paw77yaXFxcIiArIChydWxlcy5sZW5ndGggLSBuZXdJKSk7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgdG9hc3QoXFxcIuWvvOWFpeWksei0pVxcXCIpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGltcG9ydFJ1bGUocGFzcykge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IFtfLCBydWxlLCBwbmFtZV0gPSBwYXNzLnNwbGl0KFxcXCIkXFxcIik7XFxuICAgICAgICBsZXQgcGF0aCA9IGdldFB1YmxpY0l0ZW0oXFxcIkRycHlIaWtlckBpbnB1dF9wYXRoXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKCFwYXRoKSB7XFxuICAgICAgICAgICAgTVlfVVJMID0gbW9kdWxlLmlkO1xcbiAgICAgICAgICAgIGxldCBydWxlVGl0bGUgPSBnZXRQYXJhbShcXFwicnVsZVxcXCIpO1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLmnKrmjIflrprpu5jorqTkv53lrZjnm67lvZXvvIzor7flhYjorr7nva7kv53lrZjnm67lvZVcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9zaGFyZWRlZmF1bHRwYXRoI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9ydWxlPVxcXCIrcnVsZVRpdGxlO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJ1bGVzID0gYmFzZTY0RGVjb2RlKHBhcnNlUGFzdGUocnVsZSkpO1xcbiAgICAgICAgaWYgKCFydWxlcykgdG9hc3QoXFxcIuWGheWuueS4uuepuu+8jOWvvOWFpeWksei0pVxcXCIpO1xcbiAgICAgICAgcGF0aCA9IHBhdGguZW5kc1dpdGgoXFxcIi9cXFwiKSA/IHBhdGggOiAocGF0aCArIFxcXCIvXFxcIik7XFxuICAgICAgICB3cml0ZUZpbGUocGF0aCArIHBuYW1lLCBydWxlcyk7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl5oiQ5Yqf6K+35Yi35paw6YWN572uXFxcIik7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHRvYXN0KFxcXCLlr7zlhaXlpLHotKU6XFxcIiArIGUudG9TdHJpbmcoKSlcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMgPSBmdW5jdGlvbihwYXNzLCBtb2RlKSB7XFxuICAgIGlmIChtb2RlKSB7XFxuICAgICAgICByZXR1cm4gaW1wb3J0UnVsZShwYXNzKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBpbXBvcnRQYXJzZShwYXNzKTtcXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhumikeino+aekFwiLFwicGF0aFwiOlwidmlkZW9VcmxcIixcInJ1bGVcIjpcImZ1bmN0aW9uIGlzb2ZmaWNpYWwodXJsKSB7XFxuICBsZXQgZmxhZyA9IG5ldyBSZWdFeHAoJ3FxXFxcXC5jb218aXFpeWlcXFxcLmNvbXx5b3VrdVxcXFwuY29tfG1ndHZcXFxcLmNvbXxiaWxpYmlsaVxcXFwuY29tfHNvaHVcXFxcLmNvbXxpeGlndWFcXFxcLmNvbXxwcHR2XFxcXC5jb218bWlndXZpZGVvXFxcXC5jb218bGVcXFxcLmNvbXwxOTA1XFxcXC5jb218ZnVuXFxcXC50dicpO1xcbiAgcmV0dXJuIGZsYWcudGVzdCh1cmwpO1xcbn1cXG5cXG5cXG5mdW5jdGlvbiBwcmVwYXJlUGFyc2VzKHBhcnNlcywgdXJsLCBwbGF5bGlzdCwgaXNUZXN0LCBmbGFnKSB7XFxuICBwbGF5bGlzdCA9IHBsYXlsaXN0IHx8IHtcXG4gICAgdXJsczogW10sXFxuICAgIG5hbWVzOiBbXSxcXG4gICAgaGVhZGVyczogW10sXFxuICAgIGlzOiBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiLFxcbiAgfTtcXG4gIGxldCBQcm94eSA9ICQucmVxdWlyZShcXFwiTG9jYWxQcm94eVxcXCIpO1xcbiAgbGV0IHByb3h5VXJsID0gUHJveHkuc3RhcnRQcm94eShNWV9SVUxFLnRpdGxlLCBHTS5nZXRTZWxmS2V5KCkpO1xcbiAgcGFyc2VzLmZvckVhY2goKHYsIGkpID0+IHtcXG4gICAgaWYgKCFpc1Rlc3QgJiYgKHYuZm9yYmlkZGVuIHx8ICFTdHJpbmcodi5mbGFnKS5zcGxpdChcXFwifFxcXCIpLmluY2x1ZGVzKGZsYWcpKSkgcmV0dXJuO1xcbiAgICBwbGF5bGlzdC5uYW1lcy5wdXNoKHYubmFtZSk7XFxuICAgIGlmICh2LmhlYWRlcnMpIHtcXG4gICAgICBwbGF5bGlzdC5oZWFkZXJzLnB1c2godi5oZWFkZXJzKTtcXG4gICAgfVxcbiAgICBpZiAodi5ydW5UeXBlID09PSBcXFwiSlNPTlxcXCIpIHtcXG4gICAgICBsZXQgcGFyYW0gPSB7XFxuICAgICAgICAvL3VybDogdi51cmwsXFxuICAgICAgICBtZXRob2Q6IHYubWV0aG9kLFxcbiAgICAgICAgaGVhZGVyczogdi5oZWFkZXJzLFxcbiAgICAgICAganNvblBhdGg6IHYuanNvblBhdGhcXG4gICAgICB9O1xcbiAgICAgIHBsYXlsaXN0LnVybHMucHVzaChwcm94eVVybCArIFxcXCI/cnVuVHlwZT1KU09OJnVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZSh2LnVybCArIHVybCkpICsgXFxcIiZwYXJhbT1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShwYXJhbSkpKSk7XFxuICAgIH0gZWxzZSBpZiAodi5ydW5UeXBlID09PSBcXFwiSlNcXFwiKSB7XFxuICAgICAgcGxheWxpc3QudXJscy5wdXNoKHByb3h5VXJsICsgXFxcIj9ydW5UeXBlPUpTJnVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZSh1cmwpKSArIChpc1Rlc3QgPyBcXFwiJnBhcmFtPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHYpKSkgOiBcXFwiJmluZGV4PVxcXCIgKyBpKSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgcGxheWxpc3QudXJscy5wdXNoKFxcXCJ2aWRlbzovL1xcXCIgKyB2LnVybCArIHVybCk7XFxuICAgIH1cXG4gIH0pO1xcbiAgaWYgKCFwbGF5bGlzdC51cmxzLmxlbmd0aCkgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgdXJsO1xcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlsaXN0KTtcXG59XFxuXFxuZnVuY3Rpb24gdXNlUGFyc2VzKHVybCwgZmxhZykge1xcbiAgbGV0IHBhcnNlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG5cXG4gIGlmICghcGFyc2VzLmxlbmd0aCkgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgdXJsO1xcbiAgbGV0IHBsYXlsaXN0ID0ge1xcbiAgICB1cmxzOiBbXSxcXG4gICAgbmFtZXM6IFtdLFxcbiAgICBoZWFkZXJzOiBbXSxcXG4gICAgaXM6IFxcXCIjaXNWaWRlbz10cnVlI1xcXCIsXFxuICB9O1xcbiAgdHJ5IHtcXG4gICAgbGV0IHVzZURhbm11ID0gISFnZXRJdGVtKFxcXCJ1c2VEYW5tdVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgaWYgKHVzZURhbm11KSB7XFxuICAgICAgcGxheWxpc3QuZGFubXUgPSAkLnJlcXVpcmUoJ2RtRnVuP3J1bGU9ZG3nm5LlrZAnKS5kbVJvdXRlKHVybCk7XFxuICAgIH1cXG4gIH0gY2F0Y2ggeyB9XFxuICBmbGFnID0gU3RyaW5nKGZsYWcpLnJlcGxhY2UoL1xcXFxzL2csIFxcXCJcXFwiKTtcXG4gIHJldHVybiBwcmVwYXJlUGFyc2VzKHBhcnNlcywgdXJsLCBwbGF5bGlzdCwgZmFsc2UsIGZsYWcpO1xcbn1cXG5cXG5mdW5jdGlvbiBjYXJyeUpzKHBsYXksIGlkKSB7XFxuICB2YXIgZXh0cmEgPSB7XFxuICAgIFxcXCJ1YVxcXCI6IE1PQklMRV9VQVxcbiAgfVxcbiAgbGV0IHBhcnNlID0gcGxheTtcXG4gIGxldCBwYXJzZV9vYmogPSB7XFxuICAgIGRlZlJ1bGVzOiBbXFxcIioubXA0XFxcIiwgXFxcIioubTN1OFxcXCJdLFxcbiAgfTtcXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwicGFyc2VfZXh0cmFcXFwiKSkge1xcbiAgICBsZXQgcGFyc2VfZXh0cmEgPSBkZWNvZGVVUklDb21wb25lbnQocGFyc2UucGFyc2VfZXh0cmEpO1xcbiAgICBwYXJzZV9vYmogPSBPYmplY3QuYXNzaWduKHBhcnNlX29iaiwgcGFyc2VRdWVyeShwYXJzZV9leHRyYSkpO1xcbiAgICBpZiAocGFyc2Vfb2JqLmhhc093blByb3BlcnR5KFxcXCJpbml0X3NjcmlwdFxcXCIpKSB7XFxuICAgICAgcGFyc2Vfb2JqW1xcXCJpbml0X3NjcmlwdFxcXCJdID0gYmFzZTY0RGVjb2RlKHBhcnNlX29ialtcXFwiaW5pdF9zY3JpcHRcXFwiXSk7XFxuICAgIH1cXG4gIH1cXG4gIGlmIChwYXJzZV9vYmouaGFzT3duUHJvcGVydHkoXFxcImlzX3BjXFxcIikgJiYgcGFyc2Vfb2JqW1xcXCJpc19wY1xcXCJdID09IFxcXCIxXFxcIikge1xcbiAgICBleHRyYVtcXFwidWFcXFwiXSA9IFBDX1VBO1xcbiAgfVxcbiAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXCJoZWFkZXJcXFwiKSkge1xcbiAgICBleHRyYVtcXFwidWFcXFwiXSA9IHBhcnNlW1xcXCJoZWFkZXJcXFwiXVtcXFwiVXNlci1BZ2VudFxcXCJdO1xcbiAgICBleHRyYVtcXFwiUmVmZXJlclxcXCJdID0gcGFyc2VbXFxcImhlYWRlclxcXCJdW1xcXCJSZWZlcmVyXFxcIl07XFxuICAgIC8vZXh0cmFbXFxcInJlZGlyZWN0XFxcIl09ZmFsc2U7XFxuICAgIC8qZXh0cmFbXFxcImpzXFxcIl0gPSAkLnRvU3RyaW5nKChqcykgPT4ge1xcbiAgICAgIGV2YWwoanMpXFxuICAgICAgZmJhLmxvZyhuYXZpZ2F0b3IudXNlckFnZW50KVxcbiAgICAgIGZiYS5sb2cobG9jYXRpb24uaHJlZilcXG4gICAgfSwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5hdmlnYXRvciwgJ3VzZXJBZ2VudCcsIHtcXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICByZXR1cm4gJ015LUN1c3RvbS1VQS1TdHJpbmcnO1xcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICB9KSkqL1xcbiAgfVxcbiAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFwiY3VzdG9tX3JlZ2V4XFxcIikpIHtcXG4gICAgbGV0IGN1cnJlbnQgPSBwYXJzZV9vYmpbXFxcImRlZlJ1bGVzXFxcIl07XFxuICAgIGV4dHJhW1xcXCJ2aWRlb1J1bGVzXFxcIl0gPSBjdXJyZW50LmNvbmNhdChwYXJzZV9vYmouY3VzdG9tX3JlZ2V4LnNwbGl0KC9cXFxcfC9nKS5maWx0ZXIoZSA9PiBlKSlcXG4gIH1cXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwianNcXFwiKSAmJiBwYXJzZS5qcyAhPSBcXFwiXFxcIikge1xcbiAgICBleHRyYVtcXFwianNcXFwiXSA9ICQudG9TdHJpbmcoKGpzLCBwYXJzZSwgdCkgPT4ge1xcbiAgICAgIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwiaW5pdF9zY3JpcHRcXFwiKSkge1xcbiAgICAgICAgLy9mYmEubG9nKHQgKyBcXFwiOuaJp+ihjGluaXRfc2NyaXB0XFxcIik7XFxuICAgICAgICBldmFsKHBhcnNlLmluaXRfc2NyaXB0KTtcXG4gICAgICB9XFxuICAgICAgLy9mYmEubG9nKG5hdmlnYXRvci5wbGF0Zm9ybSk7XFxuICAgICAgaWYgKGpzLmluY2x1ZGVzKFxcXCJjbGljaygpXFxcIikpIHtcXG4gICAgICAgIC8vZmJhLmxvZyh0ICsgXFxcIjrmiafooYxqc+eCueWHu1xcXCIpXFxuICAgICAgfVxcbiAgICAgIGV2YWwoanMpXFxuICAgIH0sIHBhcnNlLmpzLCBwYXJzZV9vYmosIE1ZX1JVTEUudGl0bGUpXFxuICB9XFxuICB0cnkge1xcbiAgICBsZXQgaXRlbSA9IGZpbmRJdGVtKGlkKTtcXG4gICAgdXBkYXRlSXRlbShpZCwge1xcbiAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLmV4dHJhLCBleHRyYSlcXG4gICAgfSk7XFxuICB9IGNhdGNoIChlKSB7IH1cXG59XFxuXFxuZnVuY3Rpb24gcGFyc2VRdWVyeShxdWVyeSkge1xcbiAgdmFyIG9iaiA9IHt9O1xcbiAgcXVlcnkuc3BsaXQoXFxcIiZcXFwiKS5maWx0ZXIoZSA9PiBlKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XFxuICAgIHZhciBwYXJ0cyA9IGl0ZW0uc3BsaXQoXFxcIj1cXFwiKTtcXG4gICAgb2JqW3BhcnRzWzBdXSA9IHBhcnRzWzFdO1xcbiAgfSk7XFxuICByZXR1cm4gb2JqO1xcbn1cXG5cXG4kLmV4cG9ydHMucGFyc2UgPSBmdW5jdGlvbiAoaW5wdXQsIGlkLCBzb3VyY2UpIHtcXG4gIGxldCBkcnB5ID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIikuZ2V0QnlTb3VyY2Uoc291cmNlKTtcXG4gIGlucHV0ID0gaW5wdXQuc3BsaXQoXFxcIiNcXFwiKTtcXG4gIGxldCBzcGxheSA9IEpTT04ucGFyc2UoZHJweS5wbGF5KGlucHV0WzFdLCBpbnB1dFswXS5yZXBsYWNlKFxcXCJ0dmJveC14ZzpcXFwiLCBcXFwiXFxcIiksIFtdKSk7XFxuICBsZXQgcGxheSA9IHNwbGF5O1xcblxcbiAgbGV0IG1hcmsgPSBkcnB5LmdldFJ1bGUoXFxcIuexu+Wei1xcXCIpID09PSBcXFwi5ZCs5LmmXFxcIiA/IFxcXCIjaXNNdXNpYz10cnVlI1xcXCIgOiBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiO1xcbiAgaWYgKHR5cGVvZiBwbGF5ICE9PSBcXFwib2JqZWN0XFxcIiB8fCAhcGxheS51cmwpIHtcXG4gICAgcGxheSA9IHtcXG4gICAgICB1cmw6IGlucHV0WzBdLFxcbiAgICAgIHBhcnNlOiAxXFxuICAgIH07XFxuICAgIGlmICghcGxheS51cmwuc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+i/nuaOpeS4uuepulxcXCI7XFxuICAgIH1cXG4gIH1cXG4gIHBsYXkgPSBPYmplY3QuYXNzaWduKHBsYXksIHNwbGF5KTtcXG5cXG4gIHBsYXkudXJsID0gU3RyaW5nKHBsYXkudXJsKTtcXG4gIGlmIChwbGF5LnVybC5pbmNsdWRlcyhcXFwicHJveHk/ZG9cXFwiKSB8fCBwbGF5LnVybC5pbmNsdWRlcyhcXFwicHJveHk/aGlrZXJTa2V5XFxcIikpIHtcXG4gICAgTVlfVVJMID0gcGxheS51cmw7XFxuICAgIHBsYXkudXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJ1cmxcXFwiLCBcXFwiXFxcIikpO1xcbiAgfVxcbiAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcInB1c2g6Ly9cXFwiKSkge1xcbiAgICBwbGF5LnVybCA9IHBsYXkudXJsLnJlcGxhY2UoXFxcInB1c2g6Ly9cXFwiLCBcXFwiXFxcIik7XFxuICB9XFxuICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY24vXFxcIikpIHtcXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3J1bGU9UXVhcmsu566AJnJlYWx1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChwbGF5LnVybCkgKyBcXFwiJnNoYXJlUHdkPVxcXCI7XFxuICB9XFxuICBpZiAocGxheS51cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvJykgfHwgcGxheS51cmwuc3RhcnRzV2l0aChcXFwiaHR0cHM6Ly93d3cuYWxpcGFuLmNvbS9zL1xcXCIpKSB7XFxuICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9ydWxlPeS6keebmOWQmy7nroAmcGFnZT1meXBhZ2UmcmVhbHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBsYXkudXJsKTtcXG4gIH1cXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJwaWNzOi8vXFxcIikpIHtcXG4gICAgcmV0dXJuIHBsYXkudXJsO1xcbiAgfVxcbiAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcIm5vdmVsOi8vXFxcIikpIHtcXG4gICAgcmV0dXJuICQoXFxcImhpa2VyOi8vZW1wdHkjcmVhZFRoZW1lI1xcXCIpLnJ1bGUoKGRhdGEpID0+IHtcXG4gICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XFxuICAgICAgbGV0IGxheW91dCA9IFtdO1xcbiAgICAgIGxldCBjb250ZW50ID0gXFxcIuOAgOOAgFxcXCIgKyBkYXRhLmNvbnRlbnQuc3BsaXQoLyhcXFxcbnxcXFxccikrLykuZmlsdGVyKGl0ID0+IGl0LnRyaW0oKS5sZW5ndGggPiAxKS5tYXAoaXQgPT4gaXQudHJpbSgpKS5qb2luKFxcXCI8YnI+44CA44CAXFxcIik7XFxuICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgdGl0bGU6IChcXFwiPHN0cm9uZz5cXFwiICsgZGF0YS50aXRsZSArIFxcXCI8L3N0cm9uZz5cXFwiKS5iaWcoKSxcXG4gICAgICB9KTtcXG5cXG4gICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogY29udGVudCxcXG4gICAgICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIHRleHRTaXplOiAxOCxcXG4gICAgICAgICAgY2xpY2s6IHRydWVcXG4gICAgICAgIH1cXG4gICAgICB9KTtcXG4gICAgICBzZXRSZXN1bHQobGF5b3V0KTtcXG4gICAgfSwgcGxheS51cmwucmVwbGFjZShcXFwibm92ZWw6Ly9cXFwiLCBcXFwiXFxcIikpO1xcbiAgfVxcbiAgLy9sb2cocGxheSk7XFxuICBpZiAocGxheS5wYXJzZSA9PT0gMSB8fCBwbGF5Lmp4ID09PSAxKSB7XFxuICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJtYWduZXQ6XFxcIikpIHtcXG4gICAgICByZXR1cm4gcGxheS51cmw7XFxuICAgIH1cXG4gICAgaWQgJiYgY2FycnlKcyhwbGF5LCBpZCk7XFxuICAgIGlmIChwbGF5Lmp4ID09PSAxIHx8IChpc29mZmljaWFsKHBsYXkudXJsKSAmJiAocGxheS5mbGFnIHx8IGlucHV0WzFdKSkpIHtcXG4gICAgICByZXR1cm4gdXNlUGFyc2VzKHBsYXkudXJsLCBwbGF5LmZsYWcgfHwgaW5wdXRbMV0pO1xcbiAgICB9XFxuICAgIHJldHVybiBcXFwidmlkZW86Ly9cXFwiICsgcGxheS51cmw7XFxuXFxuICB9IGVsc2UgaWYgKHBsYXkucGFyc2UgPT09IDApIHtcXG4gICAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcIm1hZ25ldDpcXFwiKSkge1xcbiAgICAgIHJldHVybiBwbGF5LnVybDtcXG4gICAgfVxcbiAgICAvL2xvZyhwbGF5KVxcbiAgICB2YXIgcGxheW9iaiA9IHt9O1xcbiAgICBwbGF5b2JqLnVybHMgPSBbcGxheS51cmwgKyBtYXJrXTtcXG4gICAgaWYgKHBsYXkuaGFzT3duUHJvcGVydHkoXFxcImhlYWRlclxcXCIpKSB7XFxuICAgICAgcGxheW9ialtcXFwiaGVhZGVyc1xcXCJdID0gcGxheS5oZWFkZXI7XFxuICAgIH1cXG4gICAgaWYgKHBsYXkuaGFzT3duUHJvcGVydHkoXFxcImRhbm1ha3VcXFwiKSkge1xcbiAgICAgIHBsYXlvYmpbXFxcImRhbm11XFxcIl0gPSBwbGF5LmRhbm1ha3U7XFxuICAgIH1cXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlvYmopO1xcbiAgfSBlbHNlIHtcXG4gICAgcmV0dXJuIHBsYXkudXJsO1xcbiAgfVxcbn1cXG4kLmV4cG9ydHMucHJlcGFyZVBhcnNlcyA9IHByZXBhcmVQYXJzZXM7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLliJvlu7rorqLpmIVcIixcInBhdGhcIjpcImNyZWF0ZVN1YnNjcmlwdGlvblwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLliJvlu7rorqLpmIVcXFwiKTtcXG5sZXQgbGF5b3V0ID0gW107XFxubGV0IGYgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfc3VidXJsX2lucHV0XFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9zdWJuYW1lX2lucHV0XFxcIik7XFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuiuoumYheWQjeensFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX3N1Ym5hbWVfaW5wdXRcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGlkOiBcXFwiZHJweUhpa2VyX3N1Ym5hbWVfaW5wdXRcXFwiXFxuICAgIH1cXG59KTtcXG5sZXQgcGF0aCA9IGpvaW5VcmwoZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9cXFwiKSwgXFxcIi4uL1xcXCIucmVwZWF0KDUpKS5zbGljZSg3KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCJ5oupXFxcIixcXG4gICAgdXJsOiBKU09OLnN0cmluZ2lmeShmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIpLmV4dHJhO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiLCB7XFxuICAgICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KSxcXG4gICAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxuICAgICAgICBwYXR0ZXJuOiAxXFxuICAgIH0pKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLlgqjlrZjot6/lvoRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIlxcbiAgICB9XFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuiuoumYheWcsOWdgFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX3N1YnVybF9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc3VidXJsX2lucHV0XFxcIlxcbiAgICB9XFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuehruiupFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQpID0+IHtcXG4gICAgICAgIGxldCBwYXRoID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBsZXQgdXJsID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJ1cmxfaW5wdXRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc3VibmFtZV9pbnB1dFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICghKHBhdGggJiYgdXJsICYmIG5hbWUpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeWPr+S4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcnVsZSA9IGJhc2U2NEVuY29kZShcXFwi5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya5ZCI6ZuG6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6VcXFwiICsgbmFtZSArIFxcXCJAQFxcXCIgKyB1cmwrYEBqcz0kLnJlcXVpcmUoJ3N1YnNjcmliZT9ydWxlPSR7TVlfUlVMRS50aXRsZX0nKS5wYXJzZVVybChpbnB1dCwgJyR7YmFzZTY0RW5jb2RlKHBhdGgpfScpYCk7XFxuICAgICAgICByZXR1cm4gXFxcInJ1bGU6Ly9cXFwiICsgcnVsZTtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDorqLpmIVcIixcInBhdGhcIjpcInN1YnNjcmliZVwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gZ2VuZXJhdGVDb25maWdCeUdpdGh1Yih1cmwsIHBhdGgpIHtcXG4gICAgbGV0IHJvcGUgPSB1cmwuc3BsaXQoXFxcIi9cXFwiKS5zbGljZSgzLCA1KS5qb2luKFxcXCIvXFxcIik7XFxuICAgIGxldCBodG1sID0gZmV0Y2godXJsKTtcXG4gICAgXFxuICAgIGxldCBqc29uVGV4dCA9IHBkZmgoaHRtbCwgXFxcIiNyZXBvLWNvbnRlbnQtcGpheC1jb250YWluZXImJnNjcmlwdCYmSHRtbFxcXCIpO1xcbiAgICBcXG4gICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcXG4gICAgbGV0IGxpc3QgPSBqc29uLnBheWxvYWQudHJlZS5pdGVtcztcXG4gICAgbGV0IHJ1bGVzID0gW107XFxuICAgIGxldCBjb3VudCA9IDA7XFxuICAgIGxldCBuYW1lcyA9IFtdO1xcbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIHJldHVybiBcXFwidG9hc3Q6Ly/lj6/og73liKDlupPkuoZcXFwiO1xcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBuYW1lID0gaXQubmFtZTtcXG4gICAgICAgICAgICBsZXQgc3BhdGggPSBpdC5wYXRoO1xcbiAgICAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikpIGNvbnRpbnVlO1xcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXFxcIi5cXFwiKSk7XFxuICAgICAgICAgICAgbGV0IHJ1bGUgPSBmZXRjaChgaHR0cHM6Ly9yYXcuZ2l0bWlycm9yLmNvbS8ke3JvcGV9L21hc3Rlci8ke3NwYXRofWApO1xcbiAgICAgICAgICAgIGlmICghKCghcnVsZSB8fCAhcnVsZS5pbmNsdWRlcyhcXFwicnVsZVxcXCIpKSAmJiAhZmlsZUV4aXN0KHBhdGggKyBpdC5uYW1lKSkpIHtcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBpdC5uYW1lLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgcnVsZXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtuYW1lfWAsXFxuICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IGAke25hbWV9YCxcXG4gICAgICAgICAgICAgICAgICAgICd0eXBlJzogMyxcXG4gICAgICAgICAgICAgICAgICAgICdhcGknOiAnLi4vbGlicy9kcnB5Mi5qcycsXFxuICAgICAgICAgICAgICAgICAgICAnc2VhcmNoYWJsZSc6IDEsXFxuICAgICAgICAgICAgICAgICAgICAncXVpY2tTZWFyY2gnOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgJ2ZpbHRlcmFibGUnOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgJ2V4dCc6IFxcXCIuL1xcXCIgKyBpdC5uYW1lLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgY291bnQrKztcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgICAgICBuYW1lcy5wdXNoKGl0Lm5hbWUpO1xcbiAgICB9XFxuICAgIGRlbGV0ZWxvc2UobmFtZXMsIHBhdGgpXFxuICAgIHdyaXRlRmlsZShwYXRoICsgXFxcImluZGV4Lmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICBzaXRlczogcnVsZXNcXG4gICAgfSkpO1xcblxcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oiQ5Yqf5pu05pawXFxcIiArIGNvdW50ICsgXFxcIuS4qlxcXCI7O1xcbn1cXG5cXG5mdW5jdGlvbiBkZWxldGVsb3NlKG5hbWVzLCBwYXRoKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgcGF0aEZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgpO1xcbiAgICAgICAgaWYgKCFwYXRoRmlsZS5pc0RpcmVjdG9yeSgpKSByZXR1cm47XFxuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIHBhdGhGaWxlLmxpc3RGaWxlcygpKSB7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBTdHJpbmcoZmlsZS5nZXROYW1lKCkpO1xcbiAgICAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikgfHwgbmFtZXMuaW5jbHVkZXMobmFtZSkpIGNvbnRpbnVlO1xcbiAgICAgICAgICAgIGRlbGV0ZUZpbGUoZmlsZS5nZXRQYXRoKCkpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB0b2FzdChcXFwi5riF55CG5aSx5pWI5rqQ5aSx6LSlOlxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlJbmRleCh1cmwsIHBhdGgpIHtcXG4gICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHRvQ29ycmVjdEpTT05TdHJpbmcocmVxdWVzdCh1cmwpKSk7XFxuICAgIGxldCBhcnIgPSBqc29uLnNpdGVzO1xcbiAgICBsZXQgY291bnQgPSAwO1xcbiAgICBsZXQgaSA9IDA7XFxuICAgIGxldCBuYW1lcyA9IFtdO1xcbiAgICBmb3IgKGxldCBpdCBvZiBhcnIpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKChTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIubWluLmpzXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLmpzXFxcIikpKSB7XFxuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaXQuZXh0LmVuZHNXaXRoKFxcXCIuanNcXFwiKSA/IGRlY29kZVVSSUNvbXBvbmVudChpdC5leHQuc3BsaXQoXFxcIi9cXFwiKS5hdCgtMSkpIDogKGl0Lm5hbWUgKyBcXFwiLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlO1xcbiAgICAgICAgICAgICAgICBpZiAoU3RyaW5nKGl0LmV4dCkuc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBydWxlID0gcmVxdWVzdChpdC5leHQpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZSA9IHJlcXVlc3Qoam9pblVybCh1cmwsIGl0LmV4dCkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGl0LmV4dCA9IFxcXCIuL1xcXCIgKyBuYW1lO1xcbiAgICAgICAgICAgICAgICBpZiAoIXJ1bGUgfHwgIXJ1bGUuaW5jbHVkZXMoXFxcInJ1bGVcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3QocGF0aCArIG5hbWUpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGggKyBuYW1lLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgbmFtZXMucHVzaChuYW1lKTtcXG4gICAgICAgICAgICAgICAgY291bnQrKztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgICAgICBpKys7XFxuICAgIH1cXG4gICAgZGVsZXRlbG9zZShuYW1lcywgcGF0aCk7XFxuICAgIHdyaXRlRmlsZShwYXRoICsgXFxcImluZGV4Lmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShqc29uKSk7XFxuICAgIHJldHVybiBcXFwidG9hc3Q6Ly/miJDlip/mm7TmlrBcXFwiICsgY291bnQgKyBcXFwi5LiqXFxcIjtcXG59XFxuJC5leHBvcnRzLnBhcnNlVXJsID0gZnVuY3Rpb24gKHVybCwgcGF0aCkge1xcbiAgICBwYXRoID0gYmFzZTY0RGVjb2RlKHBhdGgpO1xcbiAgICBwYXRoID0gcGF0aC5lbmRzV2l0aChcXFwiL1xcXCIpID8gcGF0aCA6IHBhdGggKyBcXFwiL1xcXCI7XFxuICAgIHRyeSB7XFxuICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXFxcImh0dHBzOi8vZ2l0aHViLmNvbS9oamRobngvXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWdCeUdpdGh1Yih1cmwsIHBhdGgpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWdCeUluZGV4KHVybCwgcGF0aCk7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJlcnJvcjpcXFwiICsgZS50b1N0cmluZygpO1xcbiAgICB9XFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIui/kOihjOaXtumFjee9rueuoeeQhlwiLFwicGF0aFwiOlwicnVudGltZUNvbmZpZ1wiLFwicnVsZVwiOlwianM6XFxuY29uc3Qgc2VhcmNoQWxsb3dQYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvRHJweUhpa2VyL3NlYXJjaEFsbG93Lmpzb25cXFwiO1xcbmxldCBpc1ByZXBhcmUgPSBmYWxzZTtcXG5sZXQgY29uZmlncywgY3VycmVudENvbmZpZyA9IHt9LFxcbiAgICBzb3VyY2VMaXN0LCBjdXJyZW50U291cmNlLCBzZWFyY2hBbGxvdyA9IFtdO1xcbmxldCB0YWdDbGFzc2VzO1xcbmxldCBzVGFnID0gXFxcIlxcXCI7XFxubGV0IGxvYWRFcnJvcjtcXG5cXG5mdW5jdGlvbiBpbml0KGNvbmZpZykge1xcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIG51bGw7XFxuICAgIGlmICghY29uZmlnLnBhdGgpIHJldHVybiBudWxsO1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IGZpbGU7XFxuICAgICAgICBsZXQgc291cmNlTGlzdCA9IFtdO1xcbiAgICAgICAgaWYgKGNvbmZpZy5wYXRoLnN0YXJ0c1dpdGgoXFxcImZpbGU6Ly9cXFwiKSAmJiAoZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoY29uZmlnLnBhdGgucmVwbGFjZShcXFwiZmlsZTovL1xcXCIsIFxcXCJcXFwiKSkpLmlzRGlyZWN0b3J5KCkpIHtcXG4gICAgICAgICAgICBzb3VyY2VMaXN0ID0gZ2VuZXJhdGVDb25maWdCeUxvY2FsKGZpbGUpO1xcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gXFxcImxvY2FsRGlyXFxcIjtcXG4gICAgICAgICAgICAvL3NvdXJjZUxpc3Q9W107XFxuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5wYXRoLnN0YXJ0c1dpdGgoXFxcImZpbGU6Ly9cXFwiKSAmJiBjb25maWcucGF0aC5lbmRzV2l0aChcXFwiLmpzXFxcIikgJiYgZmlsZSAmJiBmaWxlLmlzRmlsZSgpKSB7XFxuICAgICAgICAgICAgc291cmNlTGlzdCA9IGdlbmVyYXRlQ29uZmlnQnlKcyhjb25maWcucGF0aCk7XFxuICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBcXFwiaW5kZXhqc1xcXCI7XFxuICAgICAgICAgICAgLy9zb3VyY2VMaXN0PVtdO1xcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcucGF0aC5zdGFydHNXaXRoKFxcXCJodHRwczovL2dpdGh1Yi5jb21cXFwiKSkge1xcbiAgICAgICAgICAgIHNvdXJjZUxpc3QgPSBnZW5lcmF0ZUNvbmZpZ0J5R2l0aHViKGNvbmZpZy5wYXRoKTtcXG4gICAgICAgICAgICBjb25maWcudHlwZSA9IFxcXCJnaXRodWJEaXJcXFwiO1xcbiAgICAgICAgICAgIC8vc291cmNlTGlzdD1bXTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHRvQ29ycmVjdEpTT05TdHJpbmcoZmV0Y2goY29uZmlnLnBhdGgpIHx8IFxcXCJ7fVxcXCIpKTtcXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbi5zaXRlcykgfHwgIWpzb24uc2l0ZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIGlmIChqc29uLmhhc093blByb3BlcnR5KFxcXCJzaXRlc1xcXCIpICYmIGpzb24uc2l0ZXMuaGFzT3duUHJvcGVydHkoXFxcImRhdGFcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAganNvbi5zaXRlcyA9IGpzb24uc2l0ZXMuZGF0YTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5LuO572R57uc6I635Y+W55qE6YWN572u5paH5Lu25Li656m677yM6K+35qOA5p+l572R57ucXFxcIik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgc291cmNlTGlzdCA9IGZpbHRlck90aGVyKGpzb24uc2l0ZXMpO1xcbiAgICAgICAgICAgIGlmIChzb3VyY2VMaXN0WzBdLmhhc093blByb3BlcnR5KFxcXCJpZFxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHNvdXJjZUxpc3QgPSBzb3VyY2VMaXN0Lm1hcChpdGVtID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmhhc093blByb3BlcnR5KFxcXCJpZFxcXCIpICYmICFpdGVtLmhhc093blByb3BlcnR5KFxcXCJrZXlcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bXFxcImtleVxcXCJdID0gaXRlbVtcXFwiaWRcXFwiXTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBjb25maWcudHlwZSA9IFxcXCJpbmRleFxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBmaWxlID0gdm9pZCAwO1xcbiAgICAgICAgbGV0IGN1cnJlbnRTb3VyY2UsIHNlYXJjaEFsbG93O1xcbiAgICAgICAgaWYgKGNvbmZpZy5jS2V5KSB7XFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZUxpc3QuZmluZCh2ID0+IHYua2V5ID09PSBjb25maWcuY0tleSk7XFxuICAgICAgICAgICAgaWYgKCFjdXJyZW50U291cmNlKSB7XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VMaXN0WzBdO1xcbiAgICAgICAgICAgICAgICAvL2N1cnJlbnRDb25maWcuY0tleSA9IHNvdXJjZUxpc3RbMF0ua2V5O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZUxpc3RbMF07XFxuICAgICAgICAgICAgLy9jb25maWcuY0tleSA9IHNvdXJjZUxpc3RbMF0ua2V5O1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdyA9IEpTT04ucGFyc2UoZmV0Y2goc2VhcmNoQWxsb3dQYXRoKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBkZWxldGVGaWxlKHNlYXJjaEFsbG93UGF0aCk7XFxuICAgICAgICAgICAgc2VhcmNoQWxsb3cgPSBbXTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxvYWRFcnJvciA9IHZvaWQgMDtcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZSxcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdyxcXG4gICAgICAgICAgICBzb3VyY2VMaXN0XFxuICAgICAgICB9O1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIGxvYWRFcnJvciA9IGU7XFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIG51bGw7XFxufVxcblxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlMb2NhbChkaXJGaWxlKSB7XFxuICAgIGxldCBsaXN0ID0gZGlyRmlsZS5saXN0RmlsZXMoKTtcXG4gICAgbGV0IHJ1bGVzID0gW107XFxuXFxuICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgIGxldCBuYW1lID0gU3RyaW5nKGl0LmdldE5hbWUoKSk7XFxuICAgICAgICBsZXQgcGF0aCA9IGl0LmdldFBhdGgoKTtcXG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikgfHwgaXQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XFxuICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIikpO1xcbiAgICAgICAgcnVsZXMucHVzaCh7XFxuICAgICAgICAgICAgJ2tleSc6IGBoaXB5X2pzXyR7bmFtZX1gLFxcbiAgICAgICAgICAgICduYW1lJzogYCR7bmFtZX1gLFxcbiAgICAgICAgICAgICd0eXBlJzogMyxcXG4gICAgICAgICAgICAnc2VhcmNoYWJsZSc6IDEsXFxuICAgICAgICAgICAgJ3F1aWNrU2VhcmNoJzogMSxcXG4gICAgICAgICAgICAnZmlsdGVyYWJsZSc6IDEsXFxuICAgICAgICAgICAgJ2V4dCc6IGAke3BhdGh9YCxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgbWFwcGluZyA9IGdldExvYWNsTWFwcGluZyhTdHJpbmcoZGlyRmlsZS5nZXRQYXRoKCkpKTtcXG5cXG4gICAgICAgIGlmIChtYXBwaW5nLmxlbmd0aCkge1xcbiAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIG1hcHBpbmcpIHtcXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gcnVsZXMuZmluZEluZGV4KHYgPT4gdi5uYW1lID09PSBpdC5rZXkpO1xcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBydWxlc1tpbmRleF07XFxuICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShpbmRleCwgMCwgT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwge1xcbiAgICAgICAgICAgICAgICAgICAgJ2tleSc6IGBoaXB5X2pzXyR7aXQudG9rZXl9YCxcXG4gICAgICAgICAgICAgICAgICAgICduYW1lJzogYCR7aXQudG9rZXl9YCxcXG4gICAgICAgICAgICAgICAgICAgICdleHQnOiBpdGVtLmV4dCArIFxcXCI/XFxcIiArIGl0LnBhcmFtcyxcXG4gICAgICAgICAgICAgICAgICAgIGRlbDogdm9pZCAwXFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgaXRlbS5kZWwgPSB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBydWxlcyA9IHJ1bGVzLmZpbHRlcih2ID0+ICF2LmRlbCk7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG5cXG4gICAgfVxcbiAgICByZXR1cm4gcnVsZXM7XFxufVxcblxcbmZ1bmN0aW9uIGdldExvYWNsTWFwcGluZyhkaXJGaWxlKSB7XFxuICAgIC8va2V5QHBhcmFtc0B0eXBlXFxuICAgIGxldCBtYXBwaW5nUGF0aCA9IFxcXCJmaWxlOi8vXFxcIiArIGpvaW5VcmwoZGlyRmlsZSwgXFxcIi4vXFxcIikgKyBcXFwiLy5tYXBwaW5nLnR4dFxcXCI7XFxuICAgIGxldCBtYXBwaW5nID0gW107XFxuICAgIGlmICghZmlsZUV4aXN0KG1hcHBpbmdQYXRoKSkgcmV0dXJuIG1hcHBpbmc7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgbWFwcGluZ1R4dCA9IGZldGNoKG1hcHBpbmdQYXRoKTtcXG4gICAgICAgIG1hcHBpbmdUeHQuc3BsaXQoXFxcIlxcXFxuXFxcIikuZm9yRWFjaCh2ID0+IHtcXG4gICAgICAgICAgICBsZXQgW2tleSwgcGFyYW1zLCB0b2tleSwgdHlwZV0gPSB2LnNwbGl0KFxcXCJAXFxcIik7XFxuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFxcXCJiYXNlNjRcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHBhcmFtcyA9IGJhc2U2NERlY29kZShwYXJhbXMpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXFxcInVyaVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcGFyYW1zID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtcyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIG1hcHBpbmcucHVzaCh7XFxuICAgICAgICAgICAgICAgIGtleSxcXG4gICAgICAgICAgICAgICAgcGFyYW1zLFxcbiAgICAgICAgICAgICAgICB0b2tleTogdG9rZXkgfHwga2V5XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9KTtcXG5cXG4gICAgfSBjYXRjaCAoZSkgeyB9XFxuICAgIHJldHVybiBtYXBwaW5nO1xcbn1cXG5mdW5jdGlvbiBldmFsSnMoY29kZSwgZ2xvYmFsKSB7XFxuICAgIGxldCBDb250ZXh0ID0gb3JnLm1vemlsbGEuamF2YXNjcmlwdC5Db250ZXh0O1xcbiAgICBsZXQgY3ggPSBDb250ZXh0LmdldEN1cnJlbnRDb250ZXh0KCk7XFxuICAgIC8vbGV0IGdsb2JhbCA9IG9yZy5tb3ppbGxhLmphdmFzY3JpcHQuU2NyaXB0YWJsZU9iamVjdC5nZXRUb3BMZXZlbFNjb3BlKHRoaXMpO1xcbiAgICAvKmlmKCFjeC5nZXRMYW5ndWFnZVZlcnNpb24oKSl7XFxuICAgICAgICBjeC5zZXRMYW5ndWFnZVZlcnNpb24oQ29udGV4dC5WRVJTSU9OX0VTNik7XFxuICAgIH0qL1xcbiAgICBnbG9iYWwgPSBnbG9iYWwgfHwge307XFxuICAgIHJldHVybiBvcmcubW96aWxsYS5qYXZhc2NyaXB0LlNjcmlwdFJ1bnRpbWUuZXZhbFNwZWNpYWwoY3gsIGdsb2JhbCwgZ2xvYmFsLCBbU3RyaW5nKGNvZGUpXSwgXFxcImV2YWwgY29kZVxcXCIsIDEpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0J5SnMoanNQYXRoKSB7XFxuXFxuICAgIGxldCBtYWluID0gZXZhbEpzKHJlcXVlc3QoanNQYXRoKS5yZXBsYWNlKC9hc3luY1xcXFxzKj9mdW5jdGlvblxcXFxzKj9tYWluL2csIFxcXCJmdW5jdGlvbiBtYWluXFxcIikgKyBcXFwiXFxcXG47bWFpbjtcXFwiLCB7XFxuICAgICAgICBwYXRoTGliOiB7XFxuICAgICAgICAgICAgam9pbjogam9pblVybCxcXG4gICAgICAgICAgICByZWFkRmlsZShwYXRoKSB7XFxuICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXFxcImZpbGU6Ly9cXFwiKSA/IHBhdGggOiAoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCk7XFxuXFxuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaChwYXRoKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHJlYWREaXIocGF0aCkge1xcbiAgICAgICAgICAgICAgICBsZXQgbmFtZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgucmVwbGFjZShcXFwiZmlsZTovL1xcXCIsIFxcXCJcXFwiKSk7XFxuXFxuICAgICAgICAgICAgICAgIGlmICghKGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKSkgcmV0dXJuIG5hbWVzO1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBmaWxlLmxpc3RGaWxlcygpKSB7XFxuICAgICAgICAgICAgICAgICAgICBuYW1lcy5wdXNoKFN0cmluZyhpdC5nZXROYW1lKCkpKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXM7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBkaXJuYW1lKHBhKSB7XFxuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gam9pblVybChqc1BhdGgsIHBhKTtcXG4gICAgICAgICAgICAgICAgbGV0IG5hbWVzID0gW107XFxuICAgICAgICAgICAgICAgIGxldCBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoKTtcXG5cXG4gICAgICAgICAgICAgICAgaWYgKCEoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRGlyZWN0b3J5KCkpKSByZXR1cm4gbmFtZXM7XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGRpckZpbGUubGlzdEZpbGVzKCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC5pc0RpcmVjdG9yeSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLnB1c2goU3RyaW5nKGl0LmdldE5hbWUoKSkpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiBwYXRocztcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHN0YXQoKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgICAgICBsb2c6IGxvZyxcXG4gICAgICAgIHBhdGg6IGpzUGF0aCxcXG4gICAgICAgIHBhdGhfZGlyOiBqb2luVXJsKGpzUGF0aCwgXFxcIi4vXFxcIilcXG4gICAgfSk7XFxuICAgIGxldCBqc29uVGV4dCA9IG1haW4oKTtcXG4gICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcXG5cXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikpIHtcXG4gICAgICAgIHJldHVybiBmaWx0ZXJPdGhlcihqc29uKTtcXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpICYmIGpzb24uc2l0ZXMubGVuZ3RoKSB7XFxuICAgICAgICB3cml0ZUZpbGUoam9pblVybChqc1BhdGgsIFxcXCIuL2luZGV4Lmpzb25cXFwiKSwganNvblRleHQpO1xcbiAgICAgICAgcmV0dXJuIGZpbHRlck90aGVyKGpzb24uc2l0ZXMgfHwgW10pO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlHaXRodWIodXJsKSB7XFxuICAgIC8vdXJsPXVybC5yZXBsYWNlKC8oI0dJVEhVQiMpJC8sXFxcIlxcXCIpO1xcbiAgICBsZXQgcHJlZml4ID0gZ2V0SXRlbShcXFwiZ2l0aHVicmF3XFxcIiwgXFxcImh0dHBzOi8vcmF3LmdpdG1pcnJvci5jb21cXFwiKTtcXG4gICAgbGV0IHJvcGUgPSB1cmwuc3BsaXQoXFxcIi9cXFwiKS5zbGljZSgzLCA1KS5qb2luKFxcXCIvXFxcIik7XFxuICAgIGxldCBodG1sID0gZmV0Y2godXJsKTtcXG4gICAgbGV0IGpzb25UZXh0ID0gcGRmaChodG1sLCBcXFwiI3JlcG8tY29udGVudC1wamF4LWNvbnRhaW5lciYmc2NyaXB0JiZIdG1sXFxcIik7XFxuICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XFxuICAgIGxldCBsaXN0ID0ganNvbi5wYXlsb2FkLnRyZWUuaXRlbXM7XFxuICAgIGxldCBydWxlcyA9IFtdO1xcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgICBsZXQgbmFtZSA9IGl0Lm5hbWU7XFxuICAgICAgICBsZXQgcGF0aCA9IGl0LnBhdGg7XFxuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXFxcIi5qc1xcXCIpKSBjb250aW51ZTtcXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXFxcIi5cXFwiKSk7XFxuICAgICAgICBydWxlcy5wdXNoKHtcXG4gICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ25hbWUnOiBgJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ3R5cGUnOiAzLFxcbiAgICAgICAgICAgICdzZWFyY2hhYmxlJzogMSxcXG4gICAgICAgICAgICAncXVpY2tTZWFyY2gnOiAxLFxcbiAgICAgICAgICAgICdmaWx0ZXJhYmxlJzogMSxcXG4gICAgICAgICAgICAnZXh0JzogYCR7cHJlZml4fS8ke3JvcGV9L21hc3Rlci8ke3BhdGh9YCxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgLypcXG4gICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9oamRobngvaGlweS1zZXJ2ZXIvdHJlZS9tYXN0ZXIvYXBwL3Q0L2ZpbGVzL2RycHlfanNcXG4gICAgICAgIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9oamRobngvaGlweS1zZXJ2ZXIvbWFzdGVyL2FwcC90NC9maWxlcy9kcnB5X2pzLzM2MCVFNSVCRCVCMSVFOCVBNyU4NiU1QiVFNSVBRSU5OCU1RC5qcyovXFxuICAgIH1cXG4gICAgcmV0dXJuIHJ1bGVzO1xcbn1cXG5cXG5mdW5jdGlvbiBwcmVwYXJlKGNvbmZpZykge1xcbiAgICBsZXQgZGF0YSA9IGluaXQoY29uZmlnKTtcXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gZmFsc2U7XFxuICAgIGN1cnJlbnRTb3VyY2UgPSBkYXRhLmN1cnJlbnRTb3VyY2U7XFxuICAgIHNlYXJjaEFsbG93ID0gZGF0YS5zZWFyY2hBbGxvdztcXG4gICAgc291cmNlTGlzdCA9IGRhdGEuc291cmNlTGlzdDtcXG4gICAgY3VycmVudENvbmZpZyA9IGNvbmZpZztcXG4gICAgc1RhZyA9IGNvbmZpZy5zVGFnIHx8IFxcXCJcXFwiO1xcbiAgICByZXR1cm4gdHJ1ZTtcXG59XFxuXFxuZnVuY3Rpb24gZmlsdGVyT3RoZXIobGlzdCkge1xcbiAgICBsZXQgc3VwcG9ydFR5cGUgPSBbMCwgMSwgNF07XFxuICAgIHJldHVybiBsaXN0LmZpbHRlcihpdCA9PiBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIubWluLmpzXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLmpzXFxcIikgfHwgc3VwcG9ydFR5cGUuaW5jbHVkZXMoaXQudHlwZSkpO1xcbn1cXG5cXG5cXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29uZmlnKCkge1xcbiAgICByZXR1cm4gY3VycmVudENvbmZpZyB8fCB7fTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0Q3VycmVudENvbmZpZyhjb25maWcpIHtcXG4gICAgbGV0IGNwYXRoID0gKGN1cnJlbnRDb25maWcgfHwge30pLnBhdGg7XFxuICAgIGlmIChwcmVwYXJlKGNvbmZpZykpIHtcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcImN1cnJlbnRDb25maWdcXFwiLCBjb25maWcpO1xcbiAgICAgICAgaWYgKGNwYXRoICE9IGNvbmZpZy5wYXRoKSB7XFxuICAgICAgICAgICAgZGVsZXRlRmlsZShzZWFyY2hBbGxvd1BhdGgpO1xcbiAgICAgICAgICAgIHNlYXJjaEFsbG93ID0gW107XFxuICAgICAgICAgICAgdGFnQ2xhc3NlcyA9IHZvaWQgMDtcXG4gICAgICAgIH1cXG4gICAgICAgIGlzUHJlcGFyZSA9IHRydWU7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBmaW5kU291cmNlKGtleSkge1xcbiAgICBsZXQgcyA9IHNvdXJjZUxpc3QuZmluZCh2ID0+IHYua2V5ID09PSBrZXkpO1xcbiAgICBpZiAocykge1xcbiAgICAgICAgcy5leHQgPSBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nKHMuZXh0KSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHM7XFxufVxcblxcbmZ1bmN0aW9uIGdldEN1cnJlbnRTb3VyY2UoKSB7XFxuICAgIHJldHVybiBjdXJyZW50U291cmNlO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRDdXJyZW50U291cmNlUGF0aCgpIHtcXG4gICAgbGV0IHBhdGggPSBTdHJpbmcoY3VycmVudFNvdXJjZS5leHQpO1xcbiAgICByZXR1cm4gZ2V0QWJzb2x1dGVQYXRoKHBhdGgpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRBYnNvbHV0ZVBhdGgocGF0aCkge1xcbiAgICBwYXRoID0gU3RyaW5nKHBhdGgpO1xcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikgfHwgcGF0aC5zdGFydHNXaXRoKFxcXCJmaWxlOi8vXFxcIikpIHtcXG4gICAgICAgIHJldHVybiBwYXRoO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIGpvaW5VcmwoY3VycmVudENvbmZpZy5wYXRoLCBwYXRoKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBzZXRDdXJyZW50U291cmNlKGtleSkge1xcbiAgICBsZXQgc291cmNlID0gc291cmNlTGlzdC5maW5kKHYgPT4gdi5rZXkgPT09IGtleSk7XFxuICAgIGlmIChzb3VyY2UpIHtcXG4gICAgICAgIGN1cnJlbnRDb25maWcuY0tleSA9IGtleTtcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcImN1cnJlbnRDb25maWdcXFwiLCBjdXJyZW50Q29uZmlnKTtcXG4gICAgICAgIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2U7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfVxcbiAgICByZXR1cm4gZmFsc2U7XFxufVxcblxcbmZ1bmN0aW9uIGdldENhblNlYXJjaFNvdXJjZSgpIHtcXG4gICAgbGV0IGxpc3QgPSBzb3VyY2VMaXN0LmZpbHRlcih2ID0+IHYuc2VhcmNoYWJsZSA9PT0gdW5kZWZpbmVkIHx8IHYuc2VhcmNoYWJsZSk7XFxuICAgIGlmIChnZXRMZWFjaCgpKSB7XFxuICAgICAgICBsaXN0ID0gbGVhY2hMaXN0KGxpc3QpO1xcbiAgICB9XFxuICAgIHJldHVybiBsaXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRMZWFjaCgpIHtcXG4gICAgbGV0IGxlYWNoO1xcbiAgICBsZXQgZ2xlYWNoID0gZ2V0SXRlbShcXFwibGVhY2hcXFwiLCBcXFwiXFxcIik7XFxuICAgIGxldCB0bGVhY2ggPSBnZXRNeVZhcihcXFwidGVtcExlYWNoXFxcIiwgXFxcIlxcXCIpO1xcbiAgICBpZih0bGVhY2ghPVxcXCJcXFwiKXtcXG4gICAgICBsZWFjaD1mYWxzZTtcXG4gICAgICByZXR1cm4gbGVhY2g7XFxuICAgIH1cXG4gICAgaWYoZ2xlYWNoIT1cXFwiXFxcIil7XFxuICAgICAgbGVhY2g9dHJ1ZTtcXG4gICAgfVxcbiAgICByZXR1cm4gbGVhY2h8fGZhbHNlO1xcbn1cXG5cXG5mdW5jdGlvbiBsZWFjaExpc3QobGlzdCkge1xcbiAgICB2YXIgcmVnID0gLyhbXFxcXFvjgJBdKVvlr4ZdKFvjgJFcXFxcXV0pLztcXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKHYgPT4gIXJlZy50ZXN0KHYubmFtZSkpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRBbGxTb3VyY2UoKSB7XFxuICAgIGxldCBsaXN0ID0gc291cmNlTGlzdC5zbGljZSgpO1xcbiAgICBpZiAoZ2V0TGVhY2goKSkge1xcbiAgICAgICAgbGlzdCA9IGxlYWNoTGlzdChsaXN0KTtcXG4gICAgfVxcbiAgICByZXR1cm4gbGlzdDtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0QWxsU291cmNlcygpIHtcXG4gICAgcmV0dXJuIHNvdXJjZUxpc3Q7XFxufVxcblxcbmZ1bmN0aW9uIGdldFNlYXJjaEFsbG93KCkge1xcbiAgICByZXR1cm4gc2VhcmNoQWxsb3c7XFxufVxcblxcbmZ1bmN0aW9uIHNldFNlYXJjaEFsbG93KCkge1xcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWFyY2hBbGxvdykpIHtcXG4gICAgICAgIHNhdmVGaWxlKHNlYXJjaEFsbG93UGF0aCwgSlNPTi5zdHJpbmdpZnkoc2VhcmNoQWxsb3cpKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZXRUYWdDbGFzc2VzKCkge1xcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWdDbGFzc2VzKSkgcmV0dXJuIHRhZ0NsYXNzZXMuc2xpY2UoKTtcXG4gICAgdGFnQ2xhc3NlcyA9IFtdO1xcbiAgICBpZiAoaXNQcmVwYXJlICYmIHNvdXJjZUxpc3QpIHtcXG4gICAgICAgIHNvdXJjZUxpc3QuZm9yRWFjaCgodikgPT4ge1xcbiAgICAgICAgICAgIGxldCB0YWcgPSBTdHJpbmcodi5uYW1lKS5zcGxpdChcXFwiXVxcXCIpWzBdLnNwbGl0KFxcXCJbXFxcIilbMV07XFxuICAgICAgICAgICAgaWYgKHRhZyAmJiAhdGFnQ2xhc3Nlcy5pbmNsdWRlcyh0YWcpKSB7XFxuICAgICAgICAgICAgICAgIHRhZ0NsYXNzZXMucHVzaCh0YWcpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIHJldHVybiB0YWdDbGFzc2VzLnNsaWNlKCk7XFxufVxcblxcbmZ1bmN0aW9uIHNldFNlYXJjaFRhZyh0YWcpIHtcXG5cXG4gICAgaWYgKHRhZ0NsYXNzZXMgJiYgdGFnQ2xhc3Nlcy5pbmNsdWRlcyh0YWcpIHx8ICh0eXBlb2YgdGFnID09PSBcXFwic3RyaW5nXFxcIiAmJiAhdGFnKSkge1xcbiAgICAgICAgY3VycmVudENvbmZpZy5zVGFnID0gdGFnO1xcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwiY3VycmVudENvbmZpZ1xcXCIsIGN1cnJlbnRDb25maWcpO1xcbiAgICAgICAgc1RhZyA9IHRhZztcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9XFxuICAgIHJldHVybiBmYWxzZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0U2VhcmNoVGFnKCkge1xcbiAgICByZXR1cm4gc1RhZztcXG59XFxuXFxuXFxuXFxuXFxuZnVuY3Rpb24gZ2V0QWxsb3dTZWFyY2hTb3VyY2UodXNlU1RhZykge1xcbiAgICBsZXQgc2xpc3Q7XFxuICAgIGlmIChzZWFyY2hBbGxvdy5sZW5ndGggJiYgIXVzZVNUYWcpIHtcXG4gICAgICAgIHNsaXN0ID0gc291cmNlTGlzdC5maWx0ZXIodiA9PiBzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgc2xpc3QgPSBzb3VyY2VMaXN0LmZpbHRlcih2ID0+IHYuc2VhcmNoYWJsZSk7XFxuICAgIH1cXG4gICAgaWYgKHVzZVNUYWcpIHtcXG4gICAgICAgIGlmIChzVGFnKSB7XFxuICAgICAgICAgICAgc2xpc3QgPSBzbGlzdC5maWx0ZXIodiA9PiBTdHJpbmcodi5uYW1lKS5pbmNsdWRlcyhcXFwiW1xcXCIgKyBzVGFnICsgXFxcIl1cXFwiKSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNsaXN0ID0gc2xpc3QuZmlsdGVyKHYgPT4gIS9cXFxcWy4qP1xcXFxdLy50ZXN0KFN0cmluZyh2Lm5hbWUpKSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKHNsaXN0Lmxlbmd0aCA9PSAwKSB7XFxuICAgICAgICBzbGlzdCA9IHNvdXJjZUxpc3Quc2xpY2UoKTtcXG4gICAgfVxcbiAgICBpZiAoZ2V0TGVhY2goKSkge1xcbiAgICAgICAgc2xpc3QgPSBsZWFjaExpc3Qoc2xpc3QpO1xcbiAgICB9XFxuICAgIHJldHVybiBzbGlzdDtcXG59XFxuXFxuZnVuY3Rpb24gaXNQcmVwYXJlZCgpIHtcXG4gICAgcmV0dXJuIGlzUHJlcGFyZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0TG9hZEVycm9yKCkge1xcbiAgICByZXR1cm4gbG9hZEVycm9yO1xcbn1cXG5cXG5mdW5jdGlvbiBpbml0RGVmYXVsdCgpIHtcXG4gICAgcmV0dXJuIHByZXBhcmUoY3VycmVudENvbmZpZy5wYXRoID8gY3VycmVudENvbmZpZyA6IHN0b3JhZ2UwLmdldEl0ZW0oXFxcImN1cnJlbnRDb25maWdcXFwiLCB7fSkpO1xcbn1cXG5cXG5cXG5mdW5jdGlvbiBpbml0QW5kRmlsdGVyKCkge1xcbiAgICBpc1ByZXBhcmUgPSBpbml0RGVmYXVsdCgpO1xcbiAgICBpZiAoIWdldE15VmFyKFxcXCJ0ZW1wTGVhY2hcXFwiLCBcXFwiXFxcIikgJiYgZ2V0SXRlbShcXFwibGVhY2hcXFwiLCBcXFwiXFxcIikgJiYgY3VycmVudFNvdXJjZSkge1xcbiAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2UubmFtZS5pbmNsdWRlcyhcXFwiW+Wvhl1cXFwiKSkge1xcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBudWxsO1xcbiAgICAgICAgfVxcbiAgICB9XFxufVxcbmluaXRBbmRGaWx0ZXIoKTtcXG4kLmV4cG9ydHMgPSB7XFxuICAgIGluaXQsXFxuICAgIHByZXBhcmUsXFxuICAgIGdldEN1cnJlbnRDb25maWcsXFxuICAgIHNldEN1cnJlbnRDb25maWcsXFxuICAgIGdldEN1cnJlbnRTb3VyY2UsXFxuICAgIGdldEN1cnJlbnRTb3VyY2VQYXRoLFxcbiAgICBzZXRDdXJyZW50U291cmNlLFxcbiAgICBnZXRDYW5TZWFyY2hTb3VyY2UsXFxuICAgIGdldFNlYXJjaEFsbG93LFxcbiAgICBzZXRTZWFyY2hBbGxvdyxcXG4gICAgZ2V0QWxsU291cmNlLFxcbiAgICBnZXRBbGxvd1NlYXJjaFNvdXJjZSxcXG4gICAgaXNQcmVwYXJlZCxcXG4gICAgZ2V0QWJzb2x1dGVQYXRoLFxcbiAgICBnZXRBbGxTb3VyY2VzLFxcbiAgICBmaW5kU291cmNlLFxcbiAgICBnZXRUYWdDbGFzc2VzLFxcbiAgICBzZXRTZWFyY2hUYWcsXFxuICAgIGdldFNlYXJjaFRhZyxcXG4gICAgZ2V0TG9hZEVycm9yLFxcbiAgICBpbml0RGVmYXVsdFxcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnvJbovpHphY3nva5cIixcInBhdGhcIjpcImNyZWF0ZUNvbmZpZ1wiLFwicnVsZVwiOlwianM6XFxubGV0IGxheW91dCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi5Yib5bu66YWN572uXFxcIik7XFxubGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG5sZXQgY3VycmVudGNvbmZpZyA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudENvbmZpZygpO1xcbmxldCBmID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiKTtcXG4gIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIpO1xcbn0pO1xcblxcbi8v5Y6G5Y+y6YWN572u6K6w5b2VXFxuZnVuY3Rpb24gdW5pcXVlQXJyYXlCeVByb3BlcnR5KGFycmF5LCBwcm9wZXJ0eSkge1xcbiAgbGV0IHVuaXF1ZSA9IFtdO1xcbiAgbGV0IG1hcCA9IG5ldyBNYXAoKTtcXG4gIGZvciAobGV0IGl0ZW0gb2YgYXJyYXkpIHtcXG4gICAgbGV0IGtleSA9IGl0ZW1bcHJvcGVydHldO1xcbiAgICBpZiAoIW1hcC5oYXMoa2V5KSkge1xcbiAgICAgIG1hcC5zZXQoa2V5LCB0cnVlKTtcXG4gICAgICB1bmlxdWUucHVzaChpdGVtKTtcXG4gICAgfVxcbiAgfVxcbiAgcmV0dXJuIHVuaXF1ZTtcXG59XFxubGV0IGNwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvRHJweUhpa2VyL1xcXCIgKyBcXFwiZHJweWNvbmZpZy5qc29uXFxcIjtcXG5sZXQgb2xkcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL1xcXCIgKyBcXFwiZHJweWNvbmZpZy5qc29uXFxcIlxcbmlmICghZmlsZUV4aXN0KGNwYXRoKSAmJiBmaWxlRXhpc3Qob2xkcGF0aCkpIHtcXG4gIGxldCBjb250ZW50ID0gSlNPTi5wYXJzZShyZWFkRmlsZShvbGRwYXRoKSkgfHwgW107XFxuICBzYXZlRmlsZShjcGF0aCwgSlNPTi5zdHJpbmdpZnkoY29udGVudCkpO1xcbn1cXG5sZXQgcGF0aGNvbmZpZ3MgPSBbXTtcXG50cnkge1xcbiAgcGF0aGNvbmZpZ3MgPSBKU09OLnBhcnNlKHJlYWRGaWxlKGNwYXRoKSkgfHwgW107XFxuICAvL3B1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnc1xcXCIscGF0aGNvbmZpZ3MpO1xcbn0gY2F0Y2ggKGUpIHtcXG4gIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7XFxufVxcbnBhdGhjb25maWdzID0gdW5pcXVlQXJyYXlCeVByb3BlcnR5KHBhdGhjb25maWdzLCBcXFwicGF0aFxcXCIpO1xcbi8vbG9nKHBhdGhjb25maWdzKVxcblxcbmxldCBjb25maWdzX29iaiA9IHtcXG4gIHBhdGg6IGNwYXRoLFxcbiAgY29uZmlnczogcGF0aGNvbmZpZ3NcXG59XFxuLy/ljoblj7LphY3nva7orrDlvZVcXG5cXG5sYXlvdXQucHVzaCh7XFxuICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICB0aXRsZTogXFxcIuaPkOekulxcXCIsXFxuICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9zeXN0ZW0vMjcucG5nXFxcIixcXG4gIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTY2XFxcIik7XFxuICAgIGxldCBwb3AgPSBoaWtlclBvcC5pbmZvQm90dG9tKHtcXG4gICAgICBjb250ZW50OiBcXFwi6K+m57uGXFxcIixcXG4gICAgICBvcHRpb25zOiBbXFxuICAgICAgICBcXFwi56ys5LiA56m6KOWQjeensCk65pa55L6/5LiL5qyh5om+5YiwXFxcIixcXG4gICAgICAgIFxcXCLnrKzkuoznqboo6Lev5b6EKVvloavmnKzlnLDntKLlvJXlnLDlnYBdOumAieaLqUpTT04vVVJM6YCJ6aG577yM54K55Ye75peB6L6555qE6YCJ5oup5Y+v5Lul5rWP6KeI5pys5Zyw5paH5Lu26YCJ5oup5pys5Zyw5YyF55qELmpzb27ntKLlvJXmlofku7bljbPlj6/jgIJcXFxcbijms6jmhI/vvJrkvb/nlKjmraTnp43mlrnlvI/vvIzlnKjmnKzlnLDmlofku7blpLnlhoXmlrDlop7miJbliKDpmaQuanPmupDml7bpnIDopoHoh6rooYzphY3nva4uanNvbuaWh+S7tilcXFwiLFxcbiAgICAgICAgXFxcIuesrOS6jOepuijot6/lvoQpW+Whq+acrOWhq+i/nOeoi+WcsOWdgF0655u05o6l5aGr5YaZ6L+c56iL6ZO+5o6l5Y2z5Y+v5LiA6Iis5piv5LulaHR0cOW8gOWktC5qc29u57uT5bC+77yM5Lmf5Y+v5Y+v5Lul6L6T5YWlZ2l0aHVi5LuT5bqT55qE5paH5Lu25aS55Zyw5Z2A44CC5q2k56eN5pa55byP5Y+v5Lul5L+d5oyB5LiO6L+c56iL6YWN572u6ICF5ZCM5q2l5pu05paw77yM5L2G5LiN5aaC5pys5Zyw5b+r44CCXFxcIixcXG4gICAgICAgIFxcXCLnrKzkuoznqboo6Lev5b6EKVvloavmnKzlnLDmlofku7blpLnlnLDlnYBdOumAieaLqeaWh+S7tuWkuemAiemhue+8jOWPr+S7peebtOaOpei+k+WFpWpz5rqQ5omA5ZyoI+aWh+S7tuWkuSEhISPnmoTot6/lvoTvvIzkuZ/lj6/ku6Xngrnlh7vml4HovrnpgInmi6nmtY/op4jmnKzlnLDot6/lvoTpgInmi6kj5paH5Lu25aS5ISEhI++8jOS9v+eUqOivpeenjeaWueazle+8jOWcqOaWh+S7tuWkueaWsOWinuaIluWIoOmZpOa6kOaXtu+8jOS4jeeUqOaJi+WKqOmFjee9ri5qc29u5paH5Lu277yM6Ieq5Yqo6K+75Y+W44CCKOazqOaEj++8mumcgOimgeWIt+aWsOmFjee9ruaIlumHjeWQr+i9r+S7tuaJjeiDveivu+WPlilcXFwiLFxcbiAgICAgICAgXFxcIltRJkFd5Li65LuA5LmI6K6i6ZiF6ZO+5o6l5pyJ5b6I5aSa5rqQ77yM5Y205Y+q6K+G5Yir5Yiw5LqG5Yeg5Liq5rqQ77yfXFxcXG7mnKzlsI/nqIvluo/lj6rmlK/mjIHpgZPplb/nmoRkcnB5W2pzXeinhumikea6kO+8jOWFtuS7luS4gOamguS4jeaUr+aMgeOAguWboOatpOS8muiHquWKqOi/h+a7pOWFtuS7lua6kFxcXCIsXFxuICAgICAgICBcXFwiW1EmQV3miZPnrpfmlK/mjIHlhbbku5Z0dmJveOeahOa6kOWQl++8n+S4jeaUr+aMgeS4jeiAg+iZkeOAguivt+eci+WQjeWtl0RycHlIaWtlcu+8jOWPquaUr+aMgWRycHnvvIzopoHnlKjlhbbku5bmupDvvIzlu7rorq7liKDpmaTmnKzlsI/nqIvluo/vvIzljrvnlKjlkITnp43lo7PlrZDjgIJcXFwiXFxuICAgICAgXVxcbiAgICB9KTtcXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gIH0pLFxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgZGVzYzogXFxcIuWQjeensCjlv4XloaspXFxcIixcXG4gIGV4dHJhOiB7XFxuICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCIsIFxcXCJcXFwiKSxcXG4gICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiLCBpbnB1dCk7XFxuICAgIH0pLFxcbiAgICBpZDogXFxcImRycHlIaWtlcl9jb25maWdfbmFtZVxcXCJcXG4gIH1cXG59KTtcXG4vL2xldCBzZWxlY3RfbW9kZT1cXFwiMFxcXCI7XFxuXFxubGV0IHNlbGVjdF9tb2RlID0gZ2V0SXRlbShcXFwic2VsZWN0X2NvbmZpZ19tb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgbmF2ID0gW1xcXCJKU09OL1VSTC9KU1xcXCIsIFxcXCLmlofku7blpLlcXFwiXTtcXG5cXG5uYXYuZm9yRWFjaCgoeCwgaSkgPT4ge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAoaSA9PSBzZWxlY3RfbW9kZSA/IHguZm9udGNvbG9yKFxcXCIjMTVCNzZDXFxcIikgOiB4KSxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpKSA9PiB7XFxuICAgICAgc2V0SXRlbShcXFwic2VsZWN0X2NvbmZpZ19tb2RlXFxcIiwgaSArIFxcXCJcXFwiKTtcXG4gICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIGkpLFxcbiAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgfSlcXG59KVxcblxcblxcbmxldCBwYXRoID0gam9pblVybChnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpLCBcXFwiLi4vXFxcIi5yZXBlYXQoNSkpLnNsaWNlKDcpO1xcblxcbmlmIChzZWxlY3RfbW9kZSA9PSBcXFwiMFxcXCIpIHtcXG4gIGxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpgInmi6lcXFwiLFxcbiAgICB1cmw6IEpTT04uc3RyaW5naWZ5KGYuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiKS5leHRyYTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIsIHtcXG4gICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgIH0pLFxcbiAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbiAgICAgIHBhdHRlcm46IDAsXFxuICAgICAgZmlsZVR5cGU6IFxcXCIuanNvbnwuanNcXFwiLFxcbiAgICB9KSksXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi6Lev5b6EKFVSTC9KU09OL0pTL0dpdGh1YilcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIsIGlucHV0KTtcXG4gICAgICB9KSxcXG4gICAgICBpZDogXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCJcXG4gICAgfVxcbiAgfSk7XFxufVxcbmlmIChzZWxlY3RfbW9kZSA9PSBcXFwiMVxcXCIpIHtcXG4gIGxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpgInmi6lcXFwiLFxcbiAgICB1cmw6IEpTT04uc3RyaW5naWZ5KGYuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXCJkcnB5SGlrZXJfY29uZmlnX2ZvbGRlclxcXCIpLmV4dHJhO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwiZHJweUhpa2VyX2NvbmZpZ19mb2xkZXJcXFwiLCB7XFxuICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICB9KSxcXG4gICAgICByb290RGlyUGF0aDogcGF0aCxcXG4gICAgICBpbml0aWFsUGF0aDogcGF0aCxcXG4gICAgICBwYXR0ZXJuOiAxLFxcbiAgICAgIC8vZmlsZVR5cGU6IFxcXCIuanNvblxcXCIsXFxuICAgIH0pKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLot6/lvoQo5paH5Lu25aS5KVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwgaW5wdXQpO1xcbiAgICAgIH0pLFxcbiAgICAgIGlkOiBcXFwiZHJweUhpa2VyX2NvbmZpZ19mb2xkZXJcXFwiXFxuICAgIH1cXG4gIH0pO1xcbn1cXG5sYXlvdXQucHVzaCh7XFxuICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgdGl0bGU6IFxcXCLnoa7orqRcXFwiLFxcbiAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChjb2JqKSA9PiB7XFxuICAgIGxldCBwYXRoID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgbGV0IG5hbWUgPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIiwgXFxcIlxcXCIpO1xcbiAgICBpZiAoIShwYXRoICYmIG5hbWUpKSB7XFxuICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeWPr+S4uuepulxcXCI7XFxuICAgIH1cXG4gICAgcGF0aCA9IHBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpID8gcGF0aCA6IHBhdGguc3RhcnRzV2l0aChcXFwiL1xcXCIpID8gKFxcXCJmaWxlOi8vXFxcIiArIHBhdGgpIDogcGF0aDtcXG4gICAgLy9sb2cocGF0aClcXG4gICAgdHJ5IHtcXG4gICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOWKoOi9vemFjee9ri4uLlxcXCIpO1xcbiAgICAgIH1cXG4gICAgICBsZXQgY29uZmlnYyA9IHtcXG4gICAgICAgIHBhdGgsXFxuICAgICAgICBuYW1lLFxcbiAgICAgIH07XFxuICAgICAgaWYgKHJ1bnRpbWVDb25maWcuc2V0Q3VycmVudENvbmZpZyhjb25maWdjKSkge1xcbiAgICAgICAgY29iai5jb25maWdzLnB1c2goe1xcbiAgICAgICAgICBwYXRoLFxcbiAgICAgICAgICBuYW1lLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBjbGVhckl0ZW0oXFxcIm5vX2xvYWRpbmdcXFwiKTtcXG4gICAgICAgIHNhdmVGaWxlKGNvYmoucGF0aCwgSlNPTi5zdHJpbmdpZnkoY29iai5jb25maWdzKSk7XFxuXFxuICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgRHJweU1hbmFnZS5jbGVhcigpO1xcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICAkLnJlcXVpcmUoXFxcIkNoYW5nZVNvdXJjZVBvcFxcXCIpLnNob3coMTAwKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YWN572u5paH5Lu25pyJ6K+vXFxcIjtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgZS50b1N0cmluZygpO1xcbiAgICB9IGZpbmFsbHkge1xcbiAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgIH1cXG4gIH0sIGNvbmZpZ3Nfb2JqKSxcXG4gIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuXFxuaWYgKHBhdGhjb25maWdzLmxlbmd0aCkge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyBcXFwiPHNtYWxsPuWOhuWPsumFjee9ruiusOW9lSDngrnmiJHov5vooYzphY3nva7mo4Dpqow8L3NtYWxsPlxcXCIsXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgocCkgPT4ge1xcbiAgICAgIC8vbG9nKHApXFxuICAgICAgZnVuY3Rpb24gdW5pcXVlKGFycikge1xcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IE1hcCgpO1xcbiAgICAgICAgcmV0dXJuIGFyci5maWx0ZXIoKGEpID0+ICFyZXMuaGFzKGEpICYmIHJlcy5zZXQoYSwgMSkpXFxuICAgICAgfVxcbiAgICAgIHZhciByZXN1bHRzID0gW107XFxuICAgICAgaWYgKHAubGVuZ3RoID09IDApIHtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ml6DlnLDlnYBcXFwiO1xcbiAgICAgIH1cXG4gICAgICBsaXN0ID0gcC5tYXAoeCA9PiB4LnBhdGgpO1xcbiAgICAgIHZhciB0YXNrID0gZnVuY3Rpb24gKG9iaikge1xcbiAgICAgICAgbGV0IHMgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgbGV0IGpzRmlsZXMgPSBbXTtcXG4gICAgICAgIGxldCBjb3VudCA9IDA7XFxuXFxuICAgICAgICBmdW5jdGlvbiBmaWx0ZXJPdGhlcihsaXN0KSB7XFxuICAgICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihpdCA9PiBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIubWluLmpzXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLmpzXFxcIikpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAob2JqLnVybC5zdGFydHNXaXRoKFxcXCJmaWxlOlxcXCIpKSB7XFxuICAgICAgICAgIGxldCBjb2RlID0gXFxcIm5vXFxcIjtcXG4gICAgICAgICAgbGV0IHBhdGggPSBvYmoudXJsLnJlcGxhY2UoXFxcImZpbGU6Ly9cXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgIGxldCBkaXIgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgpO1xcbiAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHtcXG4gICAgICAgICAgICBsZXQgZmxpc3QgPSBkaXIubGlzdEZpbGVzKCk7XFxuICAgICAgICAgICAgZm9yICh2YXIgZiBvZiBmbGlzdCkge1xcbiAgICAgICAgICAgICAgLy8g5qOA5p+l5paH5Lu25ZCN5piv5ZCm5LulLmpz57uT5bC+XFxuICAgICAgICAgICAgICBpZiAoZi5pc0ZpbGUoKSAmJiBmLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkge1xcbiAgICAgICAgICAgICAgICBqc0ZpbGVzLnB1c2goZik7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChkaXIuaXNGaWxlKCkgJiYgZmlsZUV4aXN0KG9iai51cmwpKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgIGpzb24gPSBKU09OLnBhcnNlKHJlYWRGaWxlKG9iai51cmwpKTtcXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpIHx8IGpzb24uc2l0ZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIGNvdW50ID0gZmlsdGVyT3RoZXIoanNvbi5zaXRlcykubGVuZ3RoO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxcbiAgICAgICAgICAgIGNvZGUgPSBcXFwib2tcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChqc0ZpbGVzLmxlbmd0aCA+PSA1KSB7XFxuICAgICAgICAgICAgY291bnQgPSBqc0ZpbGVzLmxlbmd0aDtcXG4gICAgICAgICAgICBjb2RlID0gXFxcIm9rXFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgIHRpbWU6IChEYXRlLm5vdygpIC0gcyksXFxuICAgICAgICAgICAgdXJsOiBvYmoudXJsLFxcbiAgICAgICAgICAgIGNvdW50OiBjb3VudCxcXG4gICAgICAgICAgICBjb2RlOiBjb2RlLFxcbiAgICAgICAgICAgIGluZGV4OiBvYmouaVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgaiA9IEpTT04ucGFyc2UoZmV0Y2gob2JqLnVybCwge1xcbiAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZSxcXG4gICAgICAgICAgdGltZW91dDogNTAwMCxcXG4gICAgICAgIH0pKTtcXG4gICAgICAgIGxldCBlID0gRGF0ZS5ub3coKTtcXG4gICAgICAgIGxldCBjID0gZSAtIHM7XFxuICAgICAgICBpZiAob2JqLnVybC5pbmNsdWRlcyhcXFwiZ2l0aHViLmNvbVxcXCIpICYmIGouc3RhdHVzQ29kZSA9PSAyMDApIHtcXG4gICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICB2YXIgaHRtbCA9IGouYm9keTtcXG4gICAgICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2UocGRmaChodG1sLCBcXFwiI3JlcG8tY29udGVudC1wamF4LWNvbnRhaW5lciYmc2NyaXB0JiZIdG1sXFxcIikpO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0ganNvbi5wYXlsb2FkLnRyZWUuaXRlbXM7XFxuICAgICAgICAgICAgY291bnQgPSBsaXN0LmZpbHRlcih4ID0+IHgubmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikpLmxlbmd0aDtcXG4gICAgICAgICAgfSBjYXRjaCB7IH1cXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZSh0b0NvcnJlY3RKU09OU3RyaW5nKGouYm9keSkgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpIHx8IGpzb24uc2l0ZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgY291bnQgPSBmaWx0ZXJPdGhlcihqc29uLnNpdGVzKS5sZW5ndGg7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxcblxcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgdGltZTogYyxcXG4gICAgICAgICAgdXJsOiBqLnVybCxcXG4gICAgICAgICAgY291bnQ6IGNvdW50LFxcbiAgICAgICAgICBjb2RlOiBqLnN0YXR1c0NvZGUsXFxuICAgICAgICAgIGluZGV4OiBvYmouaSxcXG4gICAgICAgIH1cXG4gICAgICB9O1xcbiAgICAgIGxldCB0YXNrcyA9IGxpc3QubWFwKCh4LCBpKSA9PiB7XFxuICAgICAgICBpID0gaSArIDE7XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICBmdW5jOiB0YXNrLFxcbiAgICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICAgIHVybDogeCxcXG4gICAgICAgICAgICBpOiBpIC0gMSxcXG4gICAgICAgICAgfSxcXG4gICAgICAgICAgaWQ6ICd0YXNraWQnICsgaVxcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICAgIHZhciBjb3VudCA9IHN1Y2Nlc3MgPSB0YXNrcy5sZW5ndGg7XFxuICAgICAgYmUodGFza3MsIHtcXG4gICAgICAgIGZ1bmM6IGZ1bmN0aW9uIChvYmosIGlkLCBlcnJvciwgdGFza1Jlc3VsdCkge1xcbiAgICAgICAgICBvYmoucmVzdWx0cy5wdXNoKHRhc2tSZXN1bHQpXFxuICAgICAgICAgIGNvdW50ID0gY291bnQgLSAxO1xcbiAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XFxuICAgICAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuajgOa1i+S4rS4uLuWJqeS9meWcsOWdgO+8mlxcXCIgKyBjb3VudClcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgICAgcGFyYW06IHtcXG4gICAgICAgICAgaGk6ICdjY2MnLFxcbiAgICAgICAgICByZXN1bHRzOiByZXN1bHRzXFxuICAgICAgICB9XFxuICAgICAgfSwgc3VjY2Vzcyk7XFxuICAgICAgLy9sb2cocmVzdWx0cylcXG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoZiA9PiBmKTtcXG4gICAgICByZXN1bHRzLmZvckVhY2goKHgsIGkpID0+IHtcXG4gICAgICAgIGxldCBpdGVtID0gZmluZEl0ZW0oXFxcInBhdGhcXFwiICsgeC5pbmRleCk7XFxuICAgICAgICBsZXQgcmVnZXggPSAvKOWQjeensDouKj8pKFxcXFxzKyk/XFxcXG4vZztcXG4gICAgICAgIGxldCB0aXRsZSA9IFxcXCLlkI3np7A6XFxcIiArIHBbeC5pbmRleF0ubmFtZSArIFxcXCIgXFxcIjtcXG4gICAgICAgIGxldCB1cmwgPSBwW3guaW5kZXhdLnBhdGg7XFxuICAgICAgICBsZXQgbXNnID0gXFxcIlxcXCI7XFxuICAgICAgICBsZXQgY291bnQgPSB4LmNvdW50ICE9IDAgPyBcXFwiIOa6kOaVsOmHjzpcXFwiICsgeC5jb3VudCA6IFxcXCJcXFwiO1xcbiAgICAgICAgaWYgKC9uby8udGVzdCh4LmNvZGUpKSB7XFxuICAgICAgICAgIG1zZyA9IGl0ZW0udGl0bGUucmVwbGFjZShyZWdleCwgdGl0bGUgKyBcXFwi6YWN572u5pyJ6K+vXFxcIi5mb250Y29sb3IoXFxcInJlZFxcXCIpICsgXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICB9IGVsc2UgaWYgKC9eKC0xfDB8NDA0KS8udGVzdCh4LmNvZGUpKSB7XFxuICAgICAgICAgIG1zZyA9IGl0ZW0udGl0bGUucmVwbGFjZShyZWdleCwgdGl0bGUgKyBcXFwi5peg5rOV6K6/6ZeuXFxcIi5mb250Y29sb3IoXFxcInJlZFxcXCIpICsgXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICB9IGVsc2UgaWYgKC9eMjAwLy50ZXN0KHguY29kZSkpIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLpgJrorq/mraPluLhcXFwiLmZvbnRjb2xvcihcXFwiIzNDQjM3MVxcXCIpICsgXFxcIiAg5bu26L+fOlxcXCIgKyB4LnRpbWUgKyBjb3VudCArIFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgICAvL3VybCA9IGl0ZW0udXJsO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLphY3nva7mraPnoa5cXFwiLmZvbnRjb2xvcihcXFwiIzNDQjM3MVxcXCIpICsgY291bnQgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgICAgLy91cmwgPSBpdGVtLnVybDtcXG4gICAgICAgIH1cXG4gICAgICAgIHVwZGF0ZUl0ZW0oaXRlbS5leHRyYS5pZCwge1xcbiAgICAgICAgICB0aXRsZTogbXNnLFxcbiAgICAgICAgICAvL3VybDogdXJsLFxcbiAgICAgICAgfSlcXG4gICAgICB9KTtcXG4gICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgIH0sIHBhdGhjb25maWdzKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgfSk7XFxuICBwYXRoY29uZmlncy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XFxuICAgIGxldCBsb25nQyA9IFt7XFxuICAgICAgdGl0bGU6IFxcXCLlkI3np7BcXFwiLFxcbiAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtLCBwLCBjKSA9PiB7XFxuICAgICAgICBsZXQgaSA9IGMuZmluZEluZGV4KHggPT4geC5uYW1lID09IGl0ZW0ubmFtZSk7XFxuICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICByZXR1cm4gJChjW2ldLm5hbWUsIFxcXCLovpPlhaXmlrDlkI3np7BcXFwiKS5pbnB1dCgoYywgcCwgaSkgPT4ge1xcbiAgICAgICAgICAgIGNbaV0ubmFtZSA9IGlucHV0O1xcbiAgICAgICAgICAgIHNhdmVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KGMpKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICB9LCBjLCBwLCBpKVxcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0sIGNwYXRoLCBwYXRoY29uZmlncylcXG4gICAgfSwge1xcbiAgICAgIHRpdGxlOiBcXFwi6Lev5b6EXFxcIixcXG4gICAgICBqczogJC50b1N0cmluZygoaXRlbSwgcCwgYykgPT4ge1xcbiAgICAgICAgbGV0IGkgPSBjLmZpbmRJbmRleCh4ID0+IHgubmFtZSA9PSBpdGVtLm5hbWUpO1xcbiAgICAgICAgaWYgKGkgIT0gLTEpIHtcXG4gICAgICAgICAgcmV0dXJuICQoY1tpXS5wYXRoLCBcXFwi6L6T5YWl5paw6Lev5b6EXFxcIikuaW5wdXQoKGMsIHAsIGkpID0+IHtcXG4gICAgICAgICAgICBjW2ldLnBhdGggPSBpbnB1dDtcXG4gICAgICAgICAgICBzYXZlRmlsZShwLCBKU09OLnN0cmluZ2lmeShjKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgfSwgYywgcCwgaSlcXG4gICAgICAgIH1cXG4gICAgICB9LCBpdGVtLCBjcGF0aCwgcGF0aGNvbmZpZ3MpXFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0sIHAsIGMpID0+IHtcXG4gICAgICAgIGxldCBpID0gYy5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gaXRlbS5uYW1lKTtcXG4gICAgICAgIGlmIChpICE9IC0xKSB7XFxuICAgICAgICAgIGMuc3BsaWNlKGksIDEpO1xcbiAgICAgICAgICBzYXZlRmlsZShwLCBKU09OLnN0cmluZ2lmeShjKSk7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICB9XFxuICAgICAgfSwgaXRlbSwgY3BhdGgsIHBhdGhjb25maWdzKVxcbiAgICB9XTtcXG4gICAgaWYgKGl0ZW0ucGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICBsb25nQy5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6/6ZeuXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtKSA9PiB7XFxuICAgICAgICAgIGlmIChpdGVtLnBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgaXRlbS5wYXRoO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LCBpdGVtKVxcbiAgICAgIH0pXFxuICAgIH1cXG4gICAgbGV0IGN1cnJlbnQgPSBcXFwiXFxcIjtcXG4gICAgaWYgKGN1cnJlbnRjb25maWcgJiYgY3VycmVudGNvbmZpZy5oYXNPd25Qcm9wZXJ0eShcXFwicGF0aFxcXCIpKSB7XFxuICAgICAgaWYgKGl0ZW0ucGF0aCA9PSBjdXJyZW50Y29uZmlnLnBhdGgpIHtcXG4gICAgICAgIGN1cnJlbnQgPSBcXFwi4p6h77iPXFxcIjtcXG4gICAgICB9XFxuICAgIH1cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIFxcXCI8c21hbGw+XFxcIiArIGN1cnJlbnQgKyBcXFwi5ZCN56ewOlxcXCIgKyBpdGVtLm5hbWUgKyBcXFwiXFxcXG7ot6/lvoQ6XFxcIiArIGl0ZW0ucGF0aCArIFxcXCI8L3NtYWxsPlxcXCIsXFxuICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKGl0ZW0gPT4ge1xcbiAgICAgICAgY2xlYXJJdGVtKFxcXCJub19sb2FkaW5nXFxcIik7XFxuICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgbGV0IHtcXG4gICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgbmFtZVxcbiAgICAgICAgfSA9IGl0ZW07XFxuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOWKoOi9vemFjee9ri4uLlxcXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHJ1bnRpbWVDb25maWcuc2V0Q3VycmVudENvbmZpZyh7XFxuICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgIG5hbWUsXFxuICAgICAgICB9KSkge1xcblxcbiAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICBEcnB5TWFuYWdlLmNsZWFyKCk7XFxuICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgICAkLnJlcXVpcmUoXFxcIkNoYW5nZVNvdXJjZVBvcFxcXCIpLnNob3coMTAwKTtcXG4gICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liIfmjaLlpLHotKVcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0pLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6ICdwYXRoJyArIGksXFxuICAgICAgICBsb25nQ2xpY2s6IGxvbmdDXFxuICAgICAgfVxcbiAgICB9KTtcXG4gIH0pO1xcbn1cXG5cXG5cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaNoua6kOW8ueeql1wiLFwicGF0aFwiOlwiQ2hhbmdlU291cmNlUG9wXCIsXCJydWxlXCI6XCIkLmV4cG9ydHMuc2hvdyA9IGZ1bmN0aW9uICh0aW1lKSB7XFxuICBpZiAodGltZSkge1xcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWUpO1xcbiAgfVxcbiAgbGV0IHtcXG4gICAgdWlfY29uZmlnLFxcbiAgICBnZXRSYW5nZUNvbG9ycyxcXG4gIH0gPSAkLnJlcXVpcmUoXFxcIlVJTWFuYWdlXFxcIik7XFxuICB1aV9jb25maWcgPSB1aV9jb25maWcueWk7XFxuXFxuICBsZXQge1xcbiAgICBnZXRMZWFjaCxcXG4gICAgbGVhY2hsaXN0XFxuICB9ID0gJC5yZXF1aXJlKFxcXCJtZXRob2RzXFxcIik7XFxuXFxuICBsZXQgbGVhY2ggPSBnZXRMZWFjaCgpO1xcbiAgLy9sb2cobGVhY2gpXFxuICBsZWFjaGxpc3QobGVhY2gpO1xcblxcbiAgY29uc3QgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpIHx8IHt9O1xcblxcbiAgbGV0IG5hbWUgPSBzb3VyY2UubmFtZSB8fCBcXFwiXFxcIjtcXG4gIGNvbnN0IGhpa2VyUG9wID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTY2XFxcIik7XFxuICBsZXQgY29sb3IgPSB1aV9jb25maWcu5o2i5rqQ6aKc6ImyO1xcbiAgaWYgKGNvbG9yID09IFxcXCJyYW5kb21cXFwiKSB7XFxuICAgIGNvbG9yID0gZ2V0UmFuZ2VDb2xvcnMoKTtcXG4gIH1cXG5cXG4gIGxldCBzbGlzdCA9IEFycmF5LmZyb20ocnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKSk7XFxuXFxuICBsZXQgc291cmNlTmFtZUxpc3QgPSBzbGlzdC5tYXAodiA9PiB7XFxuICAgIHJldHVybiB2Lm5hbWUgPT0gbmFtZSA/IGDigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6JHtjb2xvcn1cXFwiPiR7di5uYW1lfTwvc3Bhbj5gIDogdi5uYW1lO1xcbiAgfSk7XFxuXFxuICBoaWtlclBvcC5zZXRVc2VTdGFydEFjdGl2aXR5KGZhbHNlKTtcXG5cXG4gIGZ1bmN0aW9uIGRhdGVGb3JtYXQoZGF0ZSkge1xcbiAgICBsZXQgdGV4dCA9ICdNLWRkIEhIOm1tJztcXG4gICAgcmV0dXJuICQuZGF0ZUZvcm1hdChkYXRlLmdldFRpbWUoKSwgdGV4dCk7XFxuICB9XFxuXFxuICBsZXQgZGF0ZXRpbWUgPSBkYXRlRm9ybWF0KG5ldyBEYXRlKCkpO1xcbiAgbGV0IHBzID0gZGF0ZXRpbWUuc3BsaXQoXFxcIiBcXFwiKVsxXS5zcGxpdCgnOicpLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHBhcnNlSW50KHZhbCwgMTApLCAwKTtcXG5cXG4gIC8v5o6S5bqP5pa55rOVXFxuICBsZXQge1xcbiAgICBuYXR1cmFsU29ydCxcXG4gICAgdXNpbmdTb3J0LFxcbiAgICByZW1vdmVIdG1sVGFnc1xcbiAgfSA9ICQucmVxdWlyZShcXFwibWV0aG9kc1xcXCIpO1xcblxcbiAgbGV0IHNwZW4gPSAzO1xcbiAgbGV0IGl0ZW1zID0gc291cmNlTmFtZUxpc3QubWFwKCh4LCBpKSA9PiB7XFxuICAgIHJldHVybiB7XFxuICAgICAgdGl0bGU6IHgsXFxuICAgICAgdXJsOiBpXFxuICAgIH1cXG4gIH0pXFxuXFxuICBsZXQgbmFtZXMgPSBpdGVtcy5tYXAodiA9PiB2LnRpdGxlKTtcXG4gIGxldCBzbmFtZSA9IG5hbWVzLnNsaWNlKCk7XFxuICBpZiAoZ2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIFxcXCJcXFwiKSkge1xcbiAgICBuYW1lcyA9IG5hdHVyYWxTb3J0KG5hbWVzKTtcXG4gIH1cXG4gIGlmIChnZXRJdGVtKFxcXCJ1c2luZ3N0XFxcIiwgXFxcIlxcXCIpKSB7XFxuICAgIG5hbWVzID0gdXNpbmdTb3J0LmdldChuYW1lcyk7XFxuICB9XFxuXFxuICBsZXQgbWFuYWdlX2FsbCA9IG5hbWVzLnNsaWNlKCk7XFxuICBsZXQgc2VhcmNoS2V5ID0gXFxcIlxcXCI7XFxuICBsZXQgaW5wdXRCb3g7XFxuICBsZXQgcG9wID0gaGlrZXJQb3Auc2VsZWN0Qm90dG9tUmVzKHtcXG4gICAgb3B0aW9uczogbmFtZXMsXFxuICAgIGNvbHVtbnM6IHNwZW4sXFxuICAgIHRpdGxlOiBcXFwi6YCJ5oup6KeG6aKR5rqQIOW9k+WJjeWFsTpcXFwiICsgaXRlbXMubGVuZ3RoICsgXFxcIuS4quinhumikea6kFxcXCIsXFxuICAgIG5vQXV0b0Rpc21pc3M6IHRydWUsXFxuICAgIHBvc2l0aW9uOiAxLFxcbiAgICBleHRyYUlucHV0Qm94OiAoaW5wdXRCb3ggPSBuZXcgaGlrZXJQb3AuUmVzRXh0cmFJbnB1dEJveCh7XFxuICAgICAgaGludDogXFxcIua6kOWFs+mUruWtl1xcXCIsXFxuICAgICAgdGl0bGU6IFxcXCJUQUdcXFwiLFxcbiAgICAgIG9uQ2hhbmdlKHRleHQsIG1hbmFnZSkge1xcbiAgICAgICAgLy9sb2coXFxcIm9uQ2hhbmdlOlxcXCIrdGV4dClcXG5cXG4gICAgICAgIGlmICghL15cXFxcWy4qXFxcXF0kLy50ZXN0KHRleHQpKSB7XFxuICAgICAgICAgIHB1dE15VmFyKFxcXCJzZWFyY2hTb3VyY2VUYWdcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZmxpc3QgPSBuYW1lcy5maWx0ZXIoeCA9PiB4LmluY2x1ZGVzKHRleHQpKTtcXG4gICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICBmbGlzdC5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgpO1xcbiAgICAgICAgfSk7XFxuICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuXFxuICAgICAgfSxcXG4gICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJzZWFyY2hTb3VyY2VUYWdcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgY2xpY2socywgbWFuYWdlKSB7XFxuICAgICAgICBsZXQgdGFnQ2xhc3NlcyA9IHJ1bnRpbWVDb25maWcuZ2V0VGFnQ2xhc3NlcygpO1xcbiAgICAgICAgaWYgKCF0YWdDbGFzc2VzLmxlbmd0aCkgcmV0dXJuIFxcXCJ0b2FzdDovL+W9k+WJjemFjee9ruayoeaciVRBR+WTpuOAglxcXCI7XFxuICAgICAgICB0YWdDbGFzc2VzLnVuc2hpZnQoXFxcIuWFqOmDqFxcXCIpO1xcbiAgICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXG4gICAgICAgICAgb3B0aW9uczogdGFnQ2xhc3NlcyxcXG4gICAgICAgICAgY29sdW1uczogMyxcXG4gICAgICAgICAgdGl0bGU6IFxcXCJUQUdbXFxcIiArIHRhZ0NsYXNzZXMubGVuZ3RoICsgXFxcIl1cXFwiLFxcbiAgICAgICAgICBjbGljayhhKSB7XFxuICAgICAgICAgICAgbGV0IHRhZyA9IGE7XFxuICAgICAgICAgICAgaWYgKGEgPT0gXFxcIuWFqOmDqFxcXCIpIHtcXG4gICAgICAgICAgICAgIHRhZyA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICB0YWcgPSBcXFwiW1xcXCIgKyBhICsgXFxcIl1cXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlucHV0Qm94LnNldERlZmF1bHRWYWx1ZSh0YWcpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJzZWFyY2hTb3VyY2VUYWdcXFwiLCB0YWcpO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICB9LFxcbiAgICAgIHRpdGxlVmlzaWJsZTogdHJ1ZVxcbiAgICB9KSksXFxuICAgIGxvbmdDbGljayhzLCBpKSB7XFxuICAgICAgc2hvd1NlbGVjdE9wdGlvbnMoe1xcbiAgICAgICAgdGl0bGU6IFxcXCLliIbkuqvop4bpopHmupBcXFwiLFxcbiAgICAgICAgb3B0aW9uczogW1xcXCJKU+aWh+S7tuWIhuS6q1xcXCJdLmNvbmNhdChnZXRQYXN0ZXMoKSksXFxuICAgICAgICBjb2w6IDIsXFxuICAgICAgICBqczogJC50b1N0cmluZyhuYW1lID0+IHtcXG4gICAgICAgICAgY29uc3QgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICBsZXQgc291cmNlcyA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxuICAgICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VzLmZpbmQodiA9PiB2Lm5hbWUgPT0gbmFtZSk7XFxuICAgICAgICAgIGxldCBwYXRoID0gcnVudGltZUNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoc291cmNlLmV4dCk7XFxuICAgICAgICAgIGxldCBwbmFtZSA9IHBhdGguc3BsaXQoXFxcIi9cXFwiKS5hdCgtMSk7XFxuICAgICAgICAgIGxldCBydWxlID0gZmV0Y2gocGF0aCk7XFxuICAgICAgICAgIGxldCBlbmNvZGVNb2RlID0gZ2V0SXRlbShcXFwic2hhcmVfZW5jb2RlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICBpZiAoZW5jb2RlTW9kZSAmJiAvdmFyIHJ1bGV8W1xcXFx1NEUwMC1cXFxcdTlGQTVdK3xmdW5jdGlvbnxsZXQgfHZhciB8Y29uc3QgfFxcXFwofFxcXFwpfFxcXCJ8Jy8udGVzdChydWxlKSkge1xcbiAgICAgICAgICAgIGlmIChlbmNvZGVNb2RlID09PSBcXFwiR3ppcFxcXCIpIHtcXG4gICAgICAgICAgICAgIGxldCBHWklQID0gJC5yZXF1aXJlKFxcXCJHWklQXFxcIik7XFxuICAgICAgICAgICAgICBydWxlID0gR1pJUC56aXAocnVsZSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGVNb2RlID09PSBcXFwiQmFzZTY0XFxcIikge1xcbiAgICAgICAgICAgICAgcnVsZSA9IGJhc2U2NEVuY29kZShydWxlKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVuY29kZU1vZGUgPT09IFxcXCJBRVNcXFwiKSB7XFxuICAgICAgICAgICAgICBjb25zdCBDcnlwdG9VdGlsID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2Fzc2V0cy9jcnlwdG8tamF2YS5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgbGV0IGtleSA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZUhleChcXFwiNjg2QTY0Njg2RTc4MEEwQTBBMEEwQTBBMEEwQTBBMEFcXFwiKTtcXG4gICAgICAgICAgICAgIGxldCBpdiA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZUhleChcXFwiNjQ3QTc5Nzk2NDczMEEwQTBBMEEwQTBBMEEwQTBBMEFcXFwiKTtcXG4gICAgICAgICAgICAgIGxldCB0ZXh0RGF0YSA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZVVURjgocnVsZSk7XFxuICAgICAgICAgICAgICBsZXQgZW5jcnlwdGVkMCA9IENyeXB0b1V0aWwuQUVTLmVuY3J5cHQodGV4dERhdGEsIGtleSwge1xcbiAgICAgICAgICAgICAgICBtb2RlOiBcXFwiQUVTL0NCQy9QS0NTN1BhZGRpbmdcXFwiLFxcbiAgICAgICAgICAgICAgICBpdjogaXZcXG4gICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgcnVsZSA9IGVuY3J5cHRlZDAudG9CYXNlNjQoX2Jhc2U2NC5OT19XUkFQKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKCFydWxlKSByZXR1cm4gXFxcInRvYXN0Oi8v6I635Y+W5aSx6LSlXFxcIjtcXG4gICAgICAgICAgaWYgKE1ZX0lOREVYID09PSAwKSB7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9cXFwiICsgcG5hbWUsIHJ1bGUpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwic2hhcmU6Ly9oaWtlcjovL2ZpbGVzL19jYWNoZS9cXFwiICsgcG5hbWU7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IHNoYXJlUGFzdGUoYmFzZTY0RW5jb2RlKHJ1bGUpLCBpbnB1dCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8v5rW36ZiU6KeG55WM77yMRFJQWeinhumikea6kOOAjFxcXCIgKyBuYW1lICsgXFxcIuOAjeWkjeWItuaVtOadoeWPo+S7pOaJk+W8gOi9r+S7tuWwseS8muiHquWKqOWvvOWFpSRcXFwiICsgdXJsICsgXFxcIiRcXFwiICsgcG5hbWUgKyBcXFwiQGltcG9ydD1qczokLnJlcXVpcmUoJ2ltcG9ydD9ydWxlPScrXFxcIiArIEpTT04uc3RyaW5naWZ5KE1ZX1JVTEUudGl0bGUpICsgXFxcIikoaW5wdXQsIHRydWUpXFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSwgcmVtb3ZlSHRtbFRhZ3MocykpXFxuICAgICAgfSk7XFxuICAgIH0sXFxuICAgIGNsaWNrKHMsIGksIG1hbmFnZSkge1xcbiAgICAgIHBvcC5kaXNtaXNzKCk7XFxuICAgICAgc2V0SXRlbShcXFwibm9fbG9hZGluZ1xcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgLy8gbWFuYWdlLmxpc3QuZm9yRWFjaCgodiwgaWkpID0+IChcXG4gICAgICAvLyAgIG1hbmFnZS5saXN0W2lpXSA9IGkgPT09IGlpID8gXFxcIuKAmOKAmFxcXCIgKyBuYW1lc1tpaV0gKyBcXFwi4oCZ4oCZXFxcIiA6IG5hbWVzW2lpXS5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIilcXG4gICAgICAvLyApKTtcXG4gICAgICBsZXQgbmFtZSA9IHJlbW92ZUh0bWxUYWdzKG1hbmFnZS5saXN0W2ldKTtcXG5cXG4gICAgICBpZiAobmFtZSA9PSBzb3VyY2UubmFtZSkge1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybjtcXG4gICAgICB9XFxuICAgICAgbGV0IHNvdXJjZXMgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZSgpO1xcbiAgICAgIGxldCBrZXkgPSBzb3VyY2VzLmZpbmQodiA9PiB2Lm5hbWUgPT0gbmFtZSkua2V5O1xcblxcbiAgICAgIHVzaW5nU29ydC5zZXQobmFtZSk7XFxuXFxuICAgICAgLy9tYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgbGV0IHNvdXJjZU5hbWVMaXN0ID0gcnVudGltZUNvbmZpZy5zZXRDdXJyZW50U291cmNlKGtleSk7XFxuXFxuICAgICAgY2xlYXJNeVZhcihcXFwiY2F0ZWlcXFwiKTtcXG4gICAgICBjbGVhck15VmFyKFxcXCJjYXRlX29ialxcXCIpO1xcbiAgICAgIGNsZWFyTXlWYXIoXFxcImlzaG9tZVxcXCIpO1xcbiAgICAgIGNsZWFyTXlWYXIoXFxcImxpbmtzXFxcIik7XFxuICAgICAgcmVmcmVzaFBhZ2UoKTtcXG5cXG4gICAgfSxcXG4gICAgbWVudUNsaWNrKG1hbmFnZSkge1xcbiAgICAgIGhpa2VyUG9wLnNlbGVjdENlbnRlcih7XFxuICAgICAgICBvcHRpb25zOiBbXFxcIuaUueWPmOagt+W8j1xcXCIsIFxcXCLlgJLluo9cXFwiLCBcXFwi6Ieq54S25o6S5bqPOlxcXCIgKyAoZ2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIFxcXCJcXFwiKSA9PSBcXFwiXFxcIiA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuWQr+eUqFxcXCIpLCBcXFwi5L2/55So5o6S5bqPOlxcXCIgKyAoZ2V0SXRlbShcXFwidXNpbmdzdFxcXCIsIFxcXCJcXFwiKSA9PSBcXFwiXFxcIiA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuWQr+eUqFxcXCIpLCBcXFwi5Yi35paw6YWN572uXFxcIiwgXFxcIuWIhuS6q+aXtue8lueggTpcXFwiICsgZ2V0SXRlbShcXFwic2hhcmVfZW5jb2RlXFxcIiwgXFxcIuS4jee8lueggVxcXCIpLCBcXFwi6Z2S5bCR5bm05qih5byPOlxcXCIgKyAobGVhY2ggPyBcXFwi5byA5ZCvXFxcIiA6IFxcXCLlhbPpl61cXFwiKV0sXFxuICAgICAgICBjb2x1bW5zOiAyLFxcbiAgICAgICAgdGl0bGU6IFxcXCLor7fpgInmi6kg5pe26Ze0IFxcXCIgKyBkYXRldGltZSxcXG4gICAgICAgIGNsaWNrKHMsIGkpIHtcXG4gICAgICAgICAgaWYgKHMgPT0gXFxcIuaUueWPmOagt+W8j1xcXCIpIHtcXG4gICAgICAgICAgICBzcGVuID0gc3BlbiA9PSAzID8gMSA6IChzcGVuID09IDIgPyAzIDogMik7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZUNvbHVtbnMoc3Blbik7XFxuICAgICAgICAgIH0gZWxzZSBpZiAocy5pbmNsdWRlcyhcXFwi5YCS5bqPXFxcIikpIHtcXG4gICAgICAgICAgICBtYW5hZ2UubGlzdC5yZXZlcnNlKCk7XFxuICAgICAgICAgICAgbmFtZXMucmV2ZXJzZSgpO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChzLmluY2x1ZGVzKFxcXCLoh6rnhLbmjpLluo9cXFwiKSkge1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gT2JqZWN0LmFzc2lnbihbXSwgbWFuYWdlLmxpc3QpO1xcbiAgICAgICAgICAgIGxldCBuYXR1cmFsID0gZ2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBpZiAobmF0dXJhbCA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgIG5hdHVyYWxTb3J0KGxpc3QpLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgIHNldEl0ZW0oXFxcInVzaW5nc3RcXFwiLCBcXFwiXFxcIilcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgIHNuYW1lLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIG5hdHVyYWwgPyBcXFwiXFxcIiA6IFxcXCIxXFxcIik7XFxuICAgICAgICAgIH0gZWxzZSBpZiAocy5pbmNsdWRlcyhcXFwi5L2/55So5o6S5bqPXFxcIikpIHtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IE9iamVjdC5hc3NpZ24oW10sIG1hbmFnZS5saXN0KTtcXG4gICAgICAgICAgICBsZXQgdXNpbmdzdCA9IGdldEl0ZW0oXFxcInVzaW5nc3RcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgaWYgKHVzaW5nc3QgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICB1c2luZ1NvcnQuZ2V0KGxpc3QpLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgIHNldEl0ZW0oXFxcIm5hdHVyYWxcXFwiLCBcXFwiXFxcIilcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgIHNuYW1lLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwidXNpbmdzdFxcXCIsIHVzaW5nc3QgPyBcXFwiXFxcIiA6IFxcXCIxXFxcIik7XFxuICAgICAgICAgIH0gZWxzZSBpZiAocyA9PSBcXFwi5Yi35paw6YWN572uXFxcIikge1xcbiAgICAgICAgICAgIGhpa2VyUG9wLnJ1bk9uTmV3VGhyZWFkKCgpID0+IHtcXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGFycmF5RGlmZmVyZW5jZShhcnIxLCBhcnIyKSB7XFxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoYXJyMi5tYXAoaXRlbSA9PiBbaXRlbS5rZXksIGl0ZW1dKSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBhcnIxLmZpbHRlcihpdGVtID0+ICFtYXAuaGFzKGl0ZW0ua2V5KSk7XFxuICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIsIFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgICAgICBsZXQgbGlzdCA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxuICAgICAgICAgICAgICBpZiAoIXJ1bnRpbWVDb25maWcuaW5pdERlZmF1bHQoKSkge1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5Yi35paw5aSx6LSlXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICBsZXQgbnNvdXJjZXMgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZSgpO1xcblxcbiAgICAgICAgICAgICAgbGV0IGFsaXN0ID0gYXJyYXlEaWZmZXJlbmNlKG5zb3VyY2VzLCBsaXN0KTtcXG4gICAgICAgICAgICAgIGxldCBkbGlzdCA9IGFycmF5RGlmZmVyZW5jZShsaXN0LCBuc291cmNlcyk7XFxuXFxuICAgICAgICAgICAgICBpZiAoYWxpc3QubGVuZ3RoID4gMCB8fCBkbGlzdC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgICAgaWYgKGFsaXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgICBhbGlzdC5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4Lm5hbWUpO1xcbiAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgbG9nKFxcXCLmlrDlop46XFxcIiArIGFsaXN0Lm1hcChrID0+IGsubmFtZSkuam9pbihcXFwiLFxcXCIpKVxcbiAgICAgICAgICAgICAgICAgIG1zZyArPSBcXFwi5paw5aKeXFxcIiArIGFsaXN0Lmxlbmd0aCArIFxcXCLkuKrmupBcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChkbGlzdC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgICAgZGxpc3QuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnNwbGljZShtYW5hZ2UubGlzdC5pbmRleE9mKHgubmFtZSksIDEpO1xcbiAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgbG9nKFxcXCLnp7vpmaQ6XFxcIiArIGRsaXN0Lm1hcChrID0+IGsubmFtZSkuam9pbihcXFwiLFxcXCIpKVxcbiAgICAgICAgICAgICAgICAgIG1zZyArPSBcXFwiIOenu+mZpFxcXCIgKyBkbGlzdC5sZW5ndGggKyBcXFwi5Liq5rqQXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBoaWtlclBvcC5ydW5PblVJVGhyZWFkKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgICAgbWFuYWdlLnNldFRpdGxlKFxcXCLpgInmi6nop4bpopHmupAg5b2T5YmN5YWxOlxcXCIgKyBtYW5hZ2UubGlzdC5sZW5ndGggKyBcXFwi5Liq6KeG6aKR5rqQXFxcIik7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB0b2FzdChtc2cgKyBcXFwiIOabtOWkmuivpuaDheeci2xvZ1xcXCIpO1xcbiAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIuW3suWIt+aWsFxcXCIpO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICB9IGVsc2UgaWYgKHMuaW5jbHVkZXMoXFxcIumdkuWwkeW5tOaooeW8j1xcXCIpKSB7XFxuICAgICAgICAgICAgZnVuY3Rpb24gc2VsZWN0KCkge1xcbiAgICAgICAgICAgICAgc2hvd1NlbGVjdE9wdGlvbnMoe1xcbiAgICAgICAgICAgICAgICBcXFwidGl0bGVcXFwiOiBcXFwi6YCJ5oupXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcIm9wdGlvbnNcXFwiOiBbXFxcIuS4tOaXtuWFs+mXrVxcXCIsIFxcXCLlhbPpl61cXFwiLCBcXFwi6K6+572u5a+G56CBXFxcIl0sXFxuICAgICAgICAgICAgICAgIGNvbDogMSxcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKCkgPT4ge1xcblxcbiAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBcXFwi5Li05pe25YWz6ZetXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcInRlbXBMZWFjaFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09IFxcXCLlhbPpl61cXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcImxlYWNoXFxcIik7XFxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6K6+572u5a+G56CBXFxcXG7mjIfnurnkuI3og73nlKjml7bmnInmlYhcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImxlYWNoUGFzc1xcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcImxlYWNoUGFzc1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvb/nlKjpu5jorqTlr4bnoIFcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGxlYWNoUGFzcyA9IGdldEl0ZW0oXFxcImxlYWNoUGFzc1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBpZiAocy5pbmNsdWRlcyhcXFwi5YWz6ZetXFxcIikpIHtcXG5cXG4gICAgICAgICAgICAgIGlmIChoaWtlclBvcC5jYW5CaW9tZXRyaWMoKSAhPT0gMCAmJiAhbGVhY2hQYXNzKSB7XFxuICAgICAgICAgICAgICAgIGhpa2VyUG9wLmlucHV0Q29uZmlybSh7XFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLorr7nva7lr4bnoIFcXFwiLFxcbiAgICAgICAgICAgICAgICAgIGhpbnQ6IFxcXCLlr4bnoIFcXFwiLFxcbiAgICAgICAgICAgICAgICAgIGNvbmZpcm0odGV4dCkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lr4bnoIHkuI3og73kuLrnqbpcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwibGVhY2hQYXNzXFxcIiwgdGV4dCk7XFxuICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImxlYWNoXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwidGVtcExlYWNoXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLmiZPlvIDov4fmu6RcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImxlYWNoXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwidGVtcExlYWNoXFxcIik7XFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLmiZPlvIDov4fmu6RcXFwiKTtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgaWYgKGhpa2VyUG9wLmNhbkJpb21ldHJpYygpICE9PSAwKSB7XFxuICAgICAgICAgICAgICAgIGhpa2VyUG9wLmlucHV0Q29uZmlybSh7XFxuICAgICAgICAgICAgICAgICAgY29udGVudDogXFxcIui+k+WFpeWvhueggei/m+ihjOWFs+mXrVxcXCIsXFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLovpPlhaXlr4bnoIFcXFwiLFxcbiAgICAgICAgICAgICAgICAgIGhpbnQ6IFxcXCLlr4bnoIFcXFwiLFxcbiAgICAgICAgICAgICAgICAgIGNvbmZpcm0odGV4dCkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgPT09IGxlYWNoUGFzcyB8fCAoIWxlYWNoUGFzcyAmJiB0ZXh0ID09PSBTdHJpbmcocHMpKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lr4bnoIHplJnor69cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgaGlrZXJQb3AuY2hlY2tCeUJpb21ldHJpYygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgaGlrZXJQb3AucnVuT25OZXdUaHJlYWQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0KCk7XFxuICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBwb3AuZGlzbWlzcygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgc2hvd1NlbGVjdE9wdGlvbnMoe1xcbiAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnvJbnoIHnsbvlnotcXFwiLFxcbiAgICAgICAgICAgICAgb3B0aW9uczogW1xcXCLkuI3nvJbnoIFcXFwiLCBcXFwiR3ppcFxcXCIsIFxcXCJCYXNlNjRcXFwiLCBcXFwiQUVTXFxcIl0sXFxuICAgICAgICAgICAgICBjb2w6IDEsXFxuICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmIChNWV9JTkRFWCA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICAgIGNsZWFySXRlbShcXFwic2hhcmVfZW5jb2RlXFxcIik7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwic2hhcmVfZW5jb2RlXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgaW5wdXQ7XFxuICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgIH0pO1xcbiAgICB9XFxuICB9KTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJkcnB5566h55CGXCIsXCJwYXRoXCI6XCJEcnB5TWFuYWdlXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBKU0VuZ2luZSA9IGNvbS5leGFtcGxlLmhpa2Vydmlldy5zZXJ2aWNlLnBhcnNlci5KU0VuZ2luZTtcXG5jb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuY29uc3QgZHJweU1hcCA9IG5ldyBNYXAoKTtcXG5jb25zdCBHTWtleSA9IG1vZHVsZS5pbXBvcnRQYXJhbTtcXG4vL2xvZyhcXFwi5Yid5aeL5YyWRHJweU1hbmFnZVxcXCIpO1xcbmNvbnN0IHByb3h5U2VtYXBob3JlID0gbmV3IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZSgzKTtcXG5jb25zdCBUNEFkYXB0ZXIgPSAkLnJlcXVpcmUoXFxcIlQ0QWRhcHRlclxcXCIpO1xcbmNvbnN0IFQxQWRhcHRlciA9ICQucmVxdWlyZShcXFwiVDFBZGFwdGVyXFxcIik7XFxuXFxuZnVuY3Rpb24gYnVpbGRKc0Vudih0aWNrZXQpIHtcXG4gICAgbGV0IGNvZGUgPSBTdHJpbmcucmF3YFxcbiAgICAvLyBjb25zdCBteV9ydWxlID0gJ1xcbiAgICBjb25zdCBNWV9SVUxFID0gJHtteV9ydWxlfTtcXG4gICAgY29uc3QgbXlfcnVsZSA9IEpTT04uc3RyaW5naWZ5KE1ZX1JVTEUpO1xcbiAgICBjb25zdCBNWV9USUNLRVQgPSBcXFwiJHt0aWNrZXQgfHwgXFxcIlxcXCJ9XFxcIjtcXG4gICAgZXZhbChnZXRKc1BsdWdpbigpKTtcXG4gICAgZXZhbChnZXRKc0xhenlQbHVnaW4oKSk7XFxuICAgIGA7XFxuICAgIHJldHVybiBjb2RlO1xcbn1cXG5cXG5mdW5jdGlvbiBzeW5jKGZ1bmMsIHNwKSB7XFxuICAgIHJldHVybiBuZXcgb3JnLm1vemlsbGEuamF2YXNjcmlwdC5TeW5jaHJvbml6ZXIoZnVuYywgc3AgfHwge30pO1xcbn1cXG5cXG5mdW5jdGlvbiBjcmVhdGVEcnB5KGtleSkge1xcbiAgICBKU0VuZ2luZS5nZXRJbnN0YW5jZSgpLmV2YWxKUyhidWlsZEpzRW52KE1ZX1RJQ0tFVCkgKyBcXFwiXFxcXG4hXFxcIiArICQudG9TdHJpbmcoKGtleSwgR01rZXksIE1ZX1RJQ0tFVCkgPT4ge1xcbiAgICAgICAgbGV0IGRycHkgPSAkLnJlcXVpcmUoXFxcImRycHlcXFwiLCBrZXkpO1xcbiAgICAgICAgR00uaGFzKEdNa2V5LCAoRHJweU1hbmFnZSkgPT4ge1xcbiAgICAgICAgICAgIERycHlNYW5hZ2UucHV0KGtleSwgZHJweSk7XFxuICAgICAgICB9KTtcXG4gICAgfSwga2V5LCBHTWtleSwgTVlfVElDS0VUKSArIFxcXCI7XFxcXG5cXFwiLCBcXFwiXFxcIiwgZmFsc2UpO1xcbn1cXG5cXG5mdW5jdGlvbiBjcmVhdGVUMyhzb3VyY2UpIHtcXG4gICAgbGV0IGtleSA9IHNvdXJjZS5rZXk7XFxuICAgIGNyZWF0ZURycHkoa2V5KTtcXG4gICAgbGV0IGRycHkgPSBkcnB5TWFwLmdldChrZXkpO1xcbiAgICBkcnB5LmluaXQocnVudGltZUNvbmZpZy5nZXRBYnNvbHV0ZVBhdGgoc291cmNlLmV4dCkpO1xcbiAgICB0cnkge1xcbiAgICAgICAgaWYgKGRycHkuZ2V0UnVsZShcXFwicHJveHlfcnVsZVxcXCIpKSB7XFxuICAgICAgICAgICAgbGV0IFByb3h5ID0gJC5yZXF1aXJlKFxcXCJMb2NhbFByb3h5XFxcIik7XFxuICAgICAgICAgICAgbGV0IHByb3h5VXJsID0gUHJveHkuc3RhcnRQcm94eShNWV9SVUxFLnRpdGxlLCBHTS5nZXRTZWxmS2V5KCkpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJQcm94eV9VcmxcXFwiLCBwcm94eVVybCk7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHsgfVxcbiAgICByZXR1cm4gZHJweTtcXG59XFxuXFxuZnVuY3Rpb24gY3JlYXRlTmV3RHJweShzb3VyY2UpIHtcXG4gICAgaWYgKHNvdXJjZS50eXBlID09PSA0KSB7XFxuICAgICAgICBsZXQgdDQgPSBuZXcgVDRBZGFwdGVyKHNvdXJjZSk7XFxuICAgICAgICB0NC5pbml0KCk7XFxuICAgICAgICBkcnB5TWFwLnNldChzb3VyY2Uua2V5LCB0NCk7XFxuICAgICAgICByZXR1cm4gdDQ7XFxuICAgIH0gZWxzZSBpZiAoc291cmNlLnR5cGUgPT09IDEpIHtcXG4gICAgICAgIGxldCB0MSA9IG5ldyBUMUFkYXB0ZXIoc291cmNlKTtcXG4gICAgICAgIHQxLmluaXQoKTtcXG4gICAgICAgIGRycHlNYXAuc2V0KHNvdXJjZS5rZXksIHQxKTtcXG4gICAgICAgIHJldHVybiB0MTtcXG4gICAgfSBlbHNlIGlmIChzb3VyY2UudHlwZSA9PT0gMCkge1xcbiAgICAgICAgbGV0IFQwQWRhcHRlciA9ICQucmVxdWlyZShcXFwiVDBBZGFwdGVyXFxcIik7XFxuICAgICAgICBsZXQgdDAgPSBuZXcgVDBBZGFwdGVyKHNvdXJjZSk7XFxuICAgICAgICB0MC5pbml0KCk7XFxuICAgICAgICBkcnB5TWFwLnNldChzb3VyY2Uua2V5LCB0MCk7XFxuICAgICAgICByZXR1cm4gdDA7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gY3JlYXRlVDMoc291cmNlKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZXQoa2V5KSB7XFxuICAgIHJldHVybiBzeW5jKCgpID0+IHtcXG4gICAgICAgIC8vbG9nKGRycHlNYXAuc2l6ZSlcXG4gICAgICAgIGlmIChkcnB5TWFwLmhhcyhrZXkpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGRycHlNYXAuZ2V0KGtleSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoZHJweU1hcC5zaXplID49IDUpIHtcXG4gICAgICAgICAgICAvL2xvZyhcXFwi6K+35rGCOlxcXCIgKyBrZXkpXFxuICAgICAgICAgICAgZGVsKEFycmF5LmZyb20oZHJweU1hcC5rZXlzKCkpLmF0KDApKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZXMoKS5maW5kKHYgPT4gdi5rZXkgPT09IGtleSk7XFxuICAgICAgICBsZXQgZHJweSA9IGNyZWF0ZU5ld0RycHkoc291cmNlKTtcXG5cXG4gICAgICAgIHJldHVybiBkcnB5O1xcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxufVxcbi8vc291cmNlLmV4dOW/hemhu+S4uue7neWvuei3r+W+hFxcbmZ1bmN0aW9uIGdldEJ5U291cmNlKHNvdXJjZSkge1xcbiAgICByZXR1cm4gc3luYygoKSA9PiB7XFxuICAgICAgICBsZXQga2V5ID0gc291cmNlLmtleTtcXG4gICAgICAgIC8vbG9nKGRycHlNYXAuc2l6ZSlcXG4gICAgICAgIGlmIChkcnB5TWFwLmhhcyhrZXkpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGRycHlNYXAuZ2V0KGtleSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoZHJweU1hcC5zaXplID49IDUpIHtcXG4gICAgICAgICAgICAvL2xvZyhcXFwi6K+35rGCOlxcXCIgKyBrZXkpXFxuICAgICAgICAgICAgZGVsKEFycmF5LmZyb20oZHJweU1hcC5rZXlzKCkpLmF0KDApKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBkcnB5ID0gY3JlYXRlTmV3RHJweShzb3VyY2UpO1xcbiAgICAgICAgcmV0dXJuIGRycHk7XFxuICAgIH0sIHRoaXMpLmNhbGwoKTtcXG59XFxuXFxuZnVuY3Rpb24gcHV0KGtleSwgZHJweSkge1xcbiAgICBzeW5jKCgpID0+IGRycHlNYXAuc2V0KGtleSwgZHJweSksIHRoaXMpLmNhbGwoKTtcXG59XFxuXFxuZnVuY3Rpb24gcnVuUHJveHkoZHJweSwgYXJncykge1xcbiAgICBpZiAodHlwZW9mIGRycHkucHJveHkgPT09IFxcXCJmdW5jdGlvblxcXCIpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgLy9sZXQgdGltZTEgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgICAgIHByb3h5U2VtYXBob3JlLmFjcXVpcmUoKTtcXG4gICAgICAgICAgICAvL2xldCB0aW1lMiA9IERhdGUubm93KCk7XFxuICAgICAgICAgICAgLy9sb2coXFxcIjHnrYnlvoXml7bpl7Q6XFxcIiArICh0aW1lMiAtIHRpbWUxKSArIFxcXCJtc1xcXCIpO1xcbiAgICAgICAgICAgIGxldCByZXMgPSBkcnB5LnByb3h5LmFwcGx5KGRycHksIGFyZ3MpO1xcbiAgICAgICAgICAgIC8vbGV0IHRpbWUzID0gRGF0ZS5ub3coKTtcXG4gICAgICAgICAgICAvL2xvZyhcXFwiMuaJp+ihjOS7o+eQhuiAl+aXtjpcXFwiICsgKHRpbWUzIC0gdGltZTIpICsgXFxcIm1zXFxcIik7XFxuICAgICAgICAgICAgLy9sb2coXFxcIjPmgLvogJfml7bogJfml7Y6XFxcIiArICh0aW1lMyAtIHRpbWUxKSArIFxcXCJtc1xcXCIpO1xcblxcbiAgICAgICAgICAgIHJldHVybiByZXM7XFxuICAgICAgICB9IGZpbmFsbHkge1xcbiAgICAgICAgICAgIHByb3h5U2VtYXBob3JlLnJlbGVhc2UoKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBkZWwoa2V5KSB7XFxuICAgIHN5bmMoKCkgPT4ge1xcbiAgICAgICAgLy9sb2coXFxcIuWIoOmZpFxcXCIgKyBrZXkpO1xcbiAgICAgICAgZHJweU1hcC5kZWxldGUoa2V5KTtcXG4gICAgICAgIC8qaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXG4gICAgICAgICAgICBcXG4gICAgICAgIH0qL1xcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxufVxcbmxldCBpc0luaXRIb21lID0gZmFsc2U7XFxuLy9sZXQgaXNJbml0U2VhcmNoID0gZmFsc2U7XFxubGV0IGlzSW5pdEVyUGFnZSA9IGZhbHNlO1xcblxcbmZ1bmN0aW9uIGluaXRQYWdlKHR5cGUpIHtcXG4gICAgc3dpdGNoICh0eXBlKSB7XFxuICAgICAgICBjYXNlIFxcXCJob21lXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRIb21lID0gdHJ1ZTtcXG4gICAgICAgIC8vY2FzZSBcXFwic2VhcmNoXFxcIjpcXG4gICAgICAgIC8vICAgIGlzSW5pdFNlYXJjaCA9IHRydWU7XFxuICAgICAgICBjYXNlIFxcXCJlclxcXCI6XFxuICAgICAgICAgICAgaXNJbml0ZXJQYWdlID0gdHJ1ZTtcXG4gICAgfVxcbiAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKEdNa2V5LCB0eXBlKSA9PiB7XFxuICAgICAgICAvL2xvZyhcXFwib25DbG9zZVxcXCIpO1xcbiAgICAgICAgR00uaGFzKEdNa2V5LCBEcnB5TWFuYWdlID0+IHtcXG4gICAgICAgICAgICAvL2xvZyhcXFwi5pyJR01rZXlcXFwiKTtcXG4gICAgICAgICAgICBEcnB5TWFuYWdlLmNsZWFyQnlUeXBlKHR5cGUpO1xcbiAgICAgICAgfSk7XFxuICAgIH0sIEdNa2V5LCB0eXBlKSk7XFxufVxcblxcbmZ1bmN0aW9uIGNsZWFyQnlUeXBlKHR5cGUpIHtcXG4gICAgc3dpdGNoICh0eXBlKSB7XFxuICAgICAgICBjYXNlIFxcXCJob21lXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRIb21lID0gZmFsc2U7XFxuICAgICAgICAvL2Nhc2UgXFxcInNlYXJjaFxcXCI6XFxuICAgICAgICAvLyAgICBpc0luaXRTZWFyY2ggPSBmYWxzZTtcXG4gICAgICAgIGNhc2UgXFxcImVyXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRlclBhZ2UgPSBmYWxzZTtcXG4gICAgfVxcblxcbiAgICBpZiAoIWlzSW5pdEhvbWUgJiYgIWlzSW5pdEVyUGFnZSkge1xcbiAgICAgICAgLy9sb2coXFxcIuW8gOWni+a4heeQhlxcXCIpO1xcbiAgICAgICAgZHJweU1hcC5jbGVhcigpO1xcbiAgICAgICAgR00uY2xlYXIoR01rZXkpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGNsZWFyKCkge1xcbiAgICBzeW5jKCgpID0+IHtcXG4gICAgICAgIGRycHlNYXAuY2xlYXIoKTtcXG4gICAgfSwgdGhpcykuY2FsbCgpO1xcbn1cXG4kLmV4cG9ydHMgPSB7XFxuICAgIGluaXRQYWdlLFxcbiAgICBnZXQsXFxuICAgIGdldEJ5U291cmNlLFxcbiAgICBkZWwsXFxuICAgIGNsZWFyLFxcbiAgICBwdXQsXFxuICAgIHJ1blByb3h5LFxcbiAgICBjbGVhckJ5VHlwZVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaMh+WumuaQnOe0ouW8ueeql1wiLFwicGF0aFwiOlwiU2VhcmNoQWxsb3dQb3BcIixcInJ1bGVcIjpcImpzOlxcbiQuZXhwb3J0cy5zaG93ID0gZnVuY3Rpb24gKCkge1xcbiAgY29uc3QgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIsIFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICBjb25zdCBoaWtlclBvcCA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Njk2NlxcXCIpO1xcbiAgbGV0IHNlYXJjaEFsbG93ID0gcnVudGltZUNvbmZpZy5nZXRTZWFyY2hBbGxvdygpO1xcblxcbiAgbGV0IGNhblNlYXJjaFNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q2FuU2VhcmNoU291cmNlKCk7XFxuICAvL2xldCBzb3VyY2VOYW1lTGlzdCA9IGNhblNlYXJjaFNvdXJjZS5tYXAodj0+di5uYW1lKTtcXG4gIGxldCBnZXROYW1lcyA9ICgpID0+IGR5bmFtaWNTb3VyY2UubWFwKHYgPT4gc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAodi5uYW1lICsgXFxcIlxcXCIpLmZvbnRjb2xvcihcXFwiIzAwOTk2NlxcXCIpIDogdi5uYW1lKTtcXG4gIGxldCBzcGVuID0gMztcXG5cXG4gIC8vbGV0IGR5bmFtaWNOYW1lcyA9IHNvdXJjZU5hbWVMaXN0LnNsaWNlKCk7XFxuICBsZXQgZHluYW1pY1NvdXJjZSA9IGNhblNlYXJjaFNvdXJjZS5zbGljZSgpO1xcbiAgbGV0IHNlYXJjaG9uY291bnQgPSBkeW5hbWljU291cmNlLmZpbHRlcih2ID0+IHNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSkubGVuZ3RoO1xcbiAgaWYgKHNlYXJjaG9uY291bnQgPT0gMCkge1xcbiAgICBzZWFyY2hvbmNvdW50ID0gY2FuU2VhcmNoU291cmNlLmxlbmd0aDtcXG4gIH1cXG5cXG4gIGZ1bmN0aW9uIHBvcFRpdGxlKGlucHV0KSB7XFxuICAgIGxldCBsaXN0ID0gaW5wdXQ/aW5wdXQ6c2VhcmNob25jb3VudDtcXG4gICAgcmV0dXJuIFxcXCLlkK/nlKjmkJzntKLmupA6XFxcIiArIGxpc3QgKyBcXFwi5LiqIOWFsTpcXFwiICsgY2FuU2VhcmNoU291cmNlLmxlbmd0aCArIFxcXCLkuKrmkJzntKLmupBcXFwiXFxuICB9XFxuXFxuICBsZXQgc2VhcmNoS2V5ID0gXFxcIlxcXCI7XFxuICBsZXQgaW5wdXRCb3g7XFxuICBoaWtlclBvcC5zZWxlY3RCb3R0b21SZXMoe1xcbiAgICBvcHRpb25zOiBnZXROYW1lcygpLFxcbiAgICBjb2x1bW5zOiBzcGVuLFxcbiAgICB0aXRsZTogcG9wVGl0bGUoKSxcXG4gICAgbm9BdXRvRGlzbWlzczogdHJ1ZSxcXG4gICAgcG9zaXRpb246IDEsXFxuICAgIGhlaWdodDogLjksXFxuICAgIGV4dHJhSW5wdXRCb3g6IChpbnB1dEJveCA9IG5ldyBoaWtlclBvcC5SZXNFeHRyYUlucHV0Qm94KHtcXG4gICAgICBoaW50OiBcXFwi5rqQ5YWz6ZSu5a2XIOWkmuS4queUqHzpmpTlvIBcXFwiLFxcbiAgICAgIHRpdGxlOiBcXFwiVEFHXFxcIixcXG4gICAgICBvbkNoYW5nZSh0ZXh0LCBtYW5hZ2UpIHtcXG4gICAgICAgIC8vbG9nKFxcXCJvbkNoYW5nZTpcXFwiK3RleHQpXFxuICAgICAgICBzZWFyY2hLZXkgPSB0ZXh0O1xcbiAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgIGR5bmFtaWNTb3VyY2UubGVuZ3RoID0gMDtcXG4gICAgICAgIGlmICh0ZXh0KSB7XFxuICAgICAgICAgIGNhblNlYXJjaFNvdXJjZS5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgaWYgKHRleHQuc3BsaXQoL1xcXFx8LykuZmlsdGVyKGYgPT4gZikuc29tZSh4ID0+IHYubmFtZS5pbmNsdWRlcyh4KSkpIHtcXG4gICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UucHVzaCh2KTtcXG4gICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAodi5uYW1lICsgXFxcIlxcXCIpLmZvbnRjb2xvcihcXFwiIzAwOTk2NlxcXCIpIDogdi5uYW1lKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBkeW5hbWljU291cmNlID0gY2FuU2VhcmNoU291cmNlLnNsaWNlKCk7XFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcblxcbiAgICAgICAgfVxcbiAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgIH0sXFxuICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICBjbGljayhzLCBtYW5hZ2UpIHtcXG4gICAgICAgIGxldCB0YWdDbGFzc2VzID0gcnVudGltZUNvbmZpZy5nZXRUYWdDbGFzc2VzKCk7XFxuICAgICAgICBpZiAoIXRhZ0NsYXNzZXMubGVuZ3RoKSByZXR1cm4gXFxcInRvYXN0Oi8v5b2T5YmN6YWN572u5rKh5pyJVEFH5ZOm44CCXFxcIjtcXG4gICAgICAgIGhpa2VyUG9wLnNlbGVjdENlbnRlcih7XFxuICAgICAgICAgIG9wdGlvbnM6IHRhZ0NsYXNzZXMsXFxuICAgICAgICAgIGNvbHVtbnM6IDMsXFxuICAgICAgICAgIHRpdGxlOiBcXFwiVEFHW1xcXCIgKyB0YWdDbGFzc2VzLmxlbmd0aCArIFxcXCJdXFxcIixcXG4gICAgICAgICAgY2xpY2soYSkge1xcbiAgICAgICAgICAgIGlucHV0Qm94LnNldERlZmF1bHRWYWx1ZShcXFwiW1xcXCIgKyBhICsgXFxcIl1cXFwiKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgfSxcXG4gICAgICB0aXRsZVZpc2libGU6IHRydWVcXG4gICAgfSkpLFxcbiAgICBjbGljayhzLCBpLCBtYW5hZ2UpIHtcXG4gICAgICBsZXQga2V5ID0gZHluYW1pY1NvdXJjZVtpXS5rZXk7XFxuICAgICAgbGV0IGluZGV4ID0gLTE7XFxuICAgICAgaWYgKChpbmRleCA9IHNlYXJjaEFsbG93LmluZGV4T2Yoa2V5KSkgIT09IC0xKSB7XFxuICAgICAgICBtYW5hZ2UubGlzdFtpXSA9IGR5bmFtaWNTb3VyY2VbaV0ubmFtZTtcXG4gICAgICAgIHNlYXJjaEFsbG93LnNwbGljZShpbmRleCwgMSk7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIG1hbmFnZS5saXN0W2ldID0gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAoZHluYW1pY1NvdXJjZVtpXS5uYW1lICsgXFxcIlxcXCIpLmZvbnRjb2xvcihcXFwiIzAwOTk2NlxcXCIpO1xcbiAgICAgICAgc2VhcmNoQWxsb3cucHVzaChrZXkpO1xcbiAgICAgIH1cXG4gICAgICBtYW5hZ2Uuc2V0VGl0bGUocG9wVGl0bGUoc2VhcmNoQWxsb3cubGVuZ3RoKSk7XFxuICAgICAgcnVudGltZUNvbmZpZy5zZXRTZWFyY2hBbGxvdygpO1xcbiAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgfSxcXG4gICAgbWVudUNsaWNrKG1hbmFnZSkge1xcbiAgICAgIGhpa2VyUG9wLnNlbGVjdENlbnRlcih7XFxuICAgICAgICBvcHRpb25zOiBbXFxcIuaUueWPmOagt+W8j1xcXCIsIFxcXCLnrZvpgInmupBcXFwiLCBcXFwi6Ieq54S25o6S5bqPXFxcIiwgXFxcIuWAkuW6j1xcXCIsIFxcXCLlhajpgIlcXFwiLCBcXFwi5Y+N6YCJXFxcIl0sXFxuICAgICAgICBjb2x1bW5zOiAyLFxcbiAgICAgICAgdGl0bGU6IFxcXCLor7fpgInmi6lcXFwiLFxcbiAgICAgICAgY2xpY2socywgaSkge1xcbiAgICAgICAgICBpZiAoaSA9PT0gMCkge1xcbiAgICAgICAgICAgIHNwZW4gPSBzcGVuID09IDMgPyAxIDogKHNwZW4gPT0gMiA/IDMgOiAyKTtcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlQ29sdW1ucyhzcGVuKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSAxKSB7XFxuICAgICAgICAgICAgaGlrZXJQb3AuaW5wdXRDb25maXJtKHtcXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLovpPlhaXlhbPplK7lrZcg56m65pi+56S65YWo6YOoXFxcIixcXG4gICAgICAgICAgICAgIHRpdGxlOiBcXFwi562b6YCJ5rqQXFxcIixcXG4gICAgICAgICAgICAgIGhpbnQ6IFxcXCLmupDlhbPplK7lrZcg5aSa5Liq55SofOmalOW8gFxcXCIsXFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHNlYXJjaEtleSxcXG4gICAgICAgICAgICAgIHRleHRhcmVhOiBmYWxzZSwgLy/lpJrooYzmqKHlvI9cXG4gICAgICAgICAgICAgIG1heFRleHRhcmVhOiB0cnVlLFxcbiAgICAgICAgICAgICAgbm9BdXRvU29mdDogZmFsc2UsXFxuICAgICAgICAgICAgICAvL2hpZGVDYW5jZWw6IHRydWUsXFxuICAgICAgICAgICAgICBjb25maXJtKHRleHQpIHtcXG4gICAgICAgICAgICAgICAgc2VhcmNoS2V5ID0gdGV4dDtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgICBpZiAodGV4dCkge1xcbiAgICAgICAgICAgICAgICAgIGNhblNlYXJjaFNvdXJjZS5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dC5zcGxpdCgvXFxcXHwvKS5maWx0ZXIoZiA9PiBmKS5zb21lKHggPT4gdi5uYW1lLmluY2x1ZGVzKHgpKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljU291cmNlLnB1c2godik7XFxuICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAodi5uYW1lICsgXFxcIlxcXCIpLmZvbnRjb2xvcihcXFwiIzAwOTk2NlxcXCIpIDogdi5uYW1lKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UgPSBjYW5TZWFyY2hTb3VyY2Uuc2xpY2UoKTtcXG4gICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG5cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJ0b2FzdDovL+i+k+WFpeS6hlxcXCIgKyB0ZXh0O1xcbiAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSAyKSB7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBPYmplY3QuYXNzaWduKFtdLCBtYW5hZ2UubGlzdCk7XFxuICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG5cXG4gICAgICAgICAgICBkeW5hbWljU291cmNlLnNvcnQoKGEsIGIpID0+IHtcXG4gICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoYS5uYW1lKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiLm5hbWUpLCB1bmRlZmluZWQsIHtcXG4gICAgICAgICAgICAgICAgbnVtZXJpYzogdHJ1ZSxcXG4gICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHk6ICdiYXNlJ1xcbiAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMykge1xcbiAgICAgICAgICAgIG1hbmFnZS5saXN0LnJldmVyc2UoKTtcXG4gICAgICAgICAgICBkeW5hbWljU291cmNlLnJldmVyc2UoKTtcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSA0KSB7XFxuICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgICAgaWYgKCFzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkpIHtcXG4gICAgICAgICAgICAgICAgc2VhcmNoQWxsb3cucHVzaCh2LmtleSk7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbWFuYWdlLnNldFRpdGxlKHBvcFRpdGxlKHNlYXJjaEFsbG93Lmxlbmd0aCkpO1xcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcbiAgICAgICAgICAgIHJ1bnRpbWVDb25maWcuc2V0U2VhcmNoQWxsb3coKTtcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSA1KSB7XFxuICAgICAgICAgICAgbGV0IHRlbWxpc3QgPSBzZWFyY2hBbGxvdy5zbGljZSgpO1xcbiAgICAgICAgICAgIHNlYXJjaEFsbG93Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgICAgaWYgKHRlbWxpc3QuaW5jbHVkZXModi5rZXkpKSByZXR1cm47XFxuICAgICAgICAgICAgICBzZWFyY2hBbGxvdy5wdXNoKHYua2V5KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBtYW5hZ2Uuc2V0VGl0bGUocG9wVGl0bGUoc2VhcmNoQWxsb3cubGVuZ3RoKSk7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYW5hZ2UubGlzdCwgZ2V0TmFtZXMoKSk7XFxuICAgICAgICAgICAgcnVudGltZUNvbmZpZy5zZXRTZWFyY2hBbGxvdygpO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICB9KTtcXG4gICAgfVxcbiAgfSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5YiG57G7XCIsXCJwYXRoXCI6XCJjYXRlZ29yeXNcIixcInJ1bGVcIjpcImpzOlxcbmxldCBmbCA9IHt9O1xcbmxldCByZXN1bHRzID0gW107XFxubGV0IGhvbWVsaXN0ID0gW107XFxubGV0IGNhdGUgPSBcXFwiXFxcIjtcXG5cXG5mdW5jdGlvbiBnZXRDYXRlZ29yeXMobGF5b3V0LCBkcnB5LCBwYWdlLGhhc0hhZWQpIHtcXG4gIGxldCB7XFxuICAgIHVpX2NvbmZpZyxcXG4gICAgZ2V0UmFuZ2VDb2xvcnMsXFxuICB9ID0gJC5yZXF1aXJlKFxcXCJVSU1hbmFnZVxcXCIpO1xcbiAgdWlfY29uZmlnID0gdWlfY29uZmlnLnlpO1xcblxcbiAgbGV0IHJ1bGUgPSBkcnB5LmdldFJ1bGUoKTtcXG4gIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICBsZXQgY29kZSA9IGRycHkucnVuTWFpbihcXFwibGV0IG1haW49XFxcIiArICQudG9TdHJpbmcoKGV4dCkgPT4ge1xcbiAgICByZXR1cm4gKCkgPT4gZ2V0T3JpZ2luYWxKcyhyZXF1ZXN0KGV4dCwge1xcbiAgICAgICdtZXRob2QnOiAnR0VUJ1xcbiAgICB9KSk7XFxuICB9LCBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2VQYXRoKCkpKTtcXG4gIFxcbiAgaWYgKGhhc0hhZWQgJiYgL+aooeadvzpcXFxccysn6Ieq5YqoJy8udGVzdChjb2RlKSkge1xcbiAgICBsZXQgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KHJ1bGUuaG9tZVVybCwge1xcbiAgICAgIHRpbWVvdXQ6IHJ1bGUudGltZW91dCB8fCA1MDAwLFxcbiAgICAgIGhlYWRlcnM6IHJ1bGUuaGVhZGVycyB8fCB7fSxcXG4gICAgICB3aXRoSGVhZGVyczogdHJ1ZSxcXG4gICAgfSkpO1xcbiAgICBpZiAoKHJlc3VsdC5ib2R5ID09IHVuZGVmaW5lZCB8fCByZXN1bHQuYm9keSA9PSBcXFwiXFxcIikgfHwgKHJlc3VsdC5lcnJvciAhPSB1bmRlZmluZWQpIHx8IC9eKC0xfDQwNHw1MDJ8NTAzKSQvLnRlc3QocmVzdWx0LnN0YXR1c0NvZGUpKSB7XFxuICAgICAgY2xlYXJNeVZhcihcXFwibGlua3NcXFwiKTtcXG4gICAgICAvKmxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIFxcXCLnvZHnq5norr/pl67lvILluLhcXFwiICsgXFxcIuKAneKAnVxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwiMFxcXCIsXFxuICAgICAgICB1cmw6IHJ1bGUuaG9tZVVybCxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmuIXpmaR1aeiuvue9rlxcXCIsXFxuICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgbGV0IHtcXG4gICAgICAgICAgICAgICAgdWlfY2xlYXIsXFxuICAgICAgICAgICAgICB9ID0gJC5yZXF1aXJlKFxcXCJVSU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICAgICAgdWlfY2xlYXIoXFxcInlpXFxcIik7XFxuICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgIH1dXFxuICAgICAgICB9XFxuICAgICAgfSk7Ki9cXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIue9keermeiuv+mXruW8guW4uFxcXCIpO1xcbiAgICAgIC8vc2V0UmVzdWx0KGxheW91dCk7XFxuICAgIH1lbHNle1xcbiAgICAgIGxldCBob21lPUpTT04ucGFyc2UoZHJweS5ob21lKCkpO1xcbiAgICAgIGlmKGhvbWUuY2xhc3MubGVuZ3RoPT0wKXtcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K6/6Zeu5q2j5bi4LOWIhuexu+aVsOaNruiOt+WPluW8guW4uCDlj6/lsJ3or5XliLfmlrDmupBcXFwiKTtcXG4gICAgICB9XFxuICAgIH1cXG4gIH1cXG4gIFxcbiAgaWYgKE9iamVjdC5rZXlzKHJ1bGUpLmxlbmd0aCA9PT0gMCkge1xcbiAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuinhOWImeWKoOi9veWksei0pVxcXCIpO1xcbiAgfVxcbiAgXFxuICBpZiAoKHJ1bGUu5LiA57qnID09IFxcXCJcXFwiIHx8IHJ1bGUu5LiA57qnID09IHVuZGVmaW5lZCkgJiYgIXJ1bGUu5o6o6I2QKSB7XFxuICAgIGNsZWFyTXlWYXIoXFxcImxpbmtzXFxcIik7XFxuICAgIGxheW91dC5sZW5ndGggPSAwO1xcbiAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivpea6kOS4uuaQnOe0oua6kO+8jOS7heiDvemAmui/h+aQnOe0ouiuv+mXruaVsOaNrlxcXCIpO1xcbiAgfVxcblxcbiAgbGV0IGNhdGVnb3J5cyA9IEpTT04ucGFyc2UoZHJweS5ob21lKCkpOztcXG4gIGxldCBmaWx0ZXJzID0gY2F0ZWdvcnlzLmZpbHRlcnM7XFxuICBsZXQgY2F0ZXMgPSBjYXRlZ29yeXMuY2xhc3MgfHwgW107XFxuICBpZiAocGFnZSA9PSAxKSB7XFxuICAgIGhvbWVsaXN0ID0gSlNPTi5wYXJzZShkcnB5LmhvbWVWb2QoKSkubGlzdDtcXG4gICAgaWYgKGhvbWVsaXN0ICE9IHVuZGVmaW5lZCAmJiBob21lbGlzdC5sZW5ndGgpIHtcXG4gICAgICBwdXRNeVZhcihcXFwiaXNob21lXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgfVxcbiAgfVxcbiAgaWYgKGNhdGVzLmxlbmd0aCA9PSAwICYmIChob21lbGlzdCA9PSB1bmRlZmluZWQgfHwgaG9tZWxpc3QubGVuZ3RoID09IDApKSB7XFxuICAgIGNsZWFyTXlWYXIoXFxcImxpbmtzXFxcIik7XFxuICAgIGxheW91dC5sZW5ndGggPSAwO1xcbiAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuWIhuexu+iOt+WPluWksei0peWPr+iDvee9kee7nOmXrumimFxcXCIpO1xcbiAgfVxcbiAgaWYgKGdldE15VmFyKFxcXCJpc2hvbWVcXFwiLCBcXFwiMFxcXCIpID09IFxcXCIxXFxcIikge1xcbiAgICBjYXRlcy51bnNoaWZ0KHtcXG4gICAgICB0eXBlX25hbWU6ICfmjqjojZAnLFxcbiAgICAgIHR5cGVfaWQ6ICdob21lJyxcXG4gICAgfSlcXG4gIH1cXG4gIHB1dE15VmFyKFxcXCJsaW5rc1xcXCIsIFxcXCIxXFxcIik7XFxuICBsZXQgY2F0ZWkgPSBnZXRNeVZhcihcXFwiY2F0ZWlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgY2F0ZSA9IGNhdGVzW2NhdGVpXS50eXBlX2lkO1xcblxcbiAgdmFyIGZvbGQgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJmb2xkXFxcIiwgXFxcIjBcXFwiKTtcXG4gIGxldCBjb2xvciA9IHVpX2NvbmZpZy7liIbnsbvpopzoibI7XFxuICBpZiAoY29sb3IgPT0gXFxcInJhbmRvbVxcXCIpIHtcXG4gICAgY29sb3IgPSBnZXRSYW5nZUNvbG9ycygpO1xcbiAgfVxcblxcbiAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICBjYXRlcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XFxuICAgICAgbGV0IHQgPSBjYXRlaSA9PSBpID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwiPGI+XFxcIiArIGl0ZW0udHlwZV9uYW1lLmZvbnRjb2xvcihjb2xvcikgKyBcXFwiPC9iPlxcXCIgOiBpdGVtLnR5cGVfbmFtZTtcXG4gICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogdCxcXG4gICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSwgdGlkKSA9PiB7XFxuICAgICAgICAgIHB1dE15VmFyKFxcXCJjYXRlaVxcXCIsIGkpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaSwgaXRlbS50eXBlX2lkKSxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICB0aWQ6IGl0ZW0udHlwZV9pZCxcXG4gICAgICAgICAgYWN0aXZlOiBjYXRlaSA9PSBpID8gdHJ1ZSA6IGZhbHNlLFxcbiAgICAgICAgfVxcbiAgICAgIH0pXFxuICAgIH0pXFxuICB9XFxuXFxuICBpZiAoY2F0ZSAhPSAnaG9tZScgJiYgcGFnZSA9PSAxKSB7XFxuICAgIGxldCBob21laSA9IGxheW91dC5maW5kSW5kZXgoeCA9PiB7XFxuICAgICAgcmV0dXJuIHguZXh0cmEgJiYgeC5leHRyYS50aWQgPT0gXFxcImhvbWVcXFwiXFxuICAgIH0pO1xcbiAgICBpZiAoaG9tZWkgPT0gLTEpIHtcXG4gICAgICBob21laSA9IGxheW91dC5maW5kSW5kZXgoeCA9PiB7XFxuICAgICAgICByZXR1cm4geC5leHRyYSAmJiB4LmV4dHJhLnRpZDtcXG4gICAgICB9KSAtIDE7XFxuICAgIH1cXG4gICAgaWYgKGZpbHRlcnMgJiYgZmlsdGVycy5oYXNPd25Qcm9wZXJ0eShjYXRlKSkge1xcbiAgICAgIGlmIChob21laSAhPSAtMSkge1xcbiAgICAgICAgbGF5b3V0LnNwbGljZShob21laSArIDEsIDAsIHtcXG4gICAgICAgICAgdGl0bGU6IGZvbGQgPT0gXFxcIjBcXFwiID8gXFxcIuKAnOKAnOKAneKAnTxiPlxcXCIgKyBcXFwi4oinXFxcIi5mb250Y29sb3IoXFxcIiMxYWFkMTlcXFwiKSArIFxcXCI8L2I+XFxcIiA6IFxcXCLigJzigJzigJ3igJ08Yj5cXFwiICsgXFxcIuKIqFxcXCIuZm9udGNvbG9yKFxcXCIjRkYwMDAwXFxcIikgKyBcXFwiPC9iPlxcXCIsXFxuICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoZm9sZCkgPT4ge1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcImZvbGRcXFwiLCBmb2xkID09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICB9LCBmb2xkKSxcXG4gICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxcbiAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICAgIH1cXG5cXG4gICAgICBsZXQgYWN0aXZlaSA9IGxheW91dC5maW5kSW5kZXgoeCA9PiB4LmV4dHJhICYmIHguZXh0cmEuYWN0aXZlKTtcXG4gICAgICBpZiAoYWN0aXZlaSAhPSAtMSkge1xcbiAgICAgICAgbGF5b3V0LnNwbGljZShhY3RpdmVpLCAwLCB7XFxuICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArICfwn4yAJyxcXG4gICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChjKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGNhdGVfb2JqID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImNhdGVfb2JqXFxcIiwge30pO1xcbiAgICAgICAgICAgIGRlbGV0ZSBjYXRlX29ialtjXTtcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCBjYXRlX29iaik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5a6M5oiQXFxcIjtcXG4gICAgICAgICAgfSwgY2F0ZSlcXG4gICAgICAgIH0pXFxuICAgICAgfVxcblxcbiAgICAgIGxldCBjbGFzc2lmeSA9IGZpbHRlcnNbY2F0ZV07XFxuICAgICAgdmFyIGluaXRfY2F0ZSA9IG5ldyBBcnJheShjbGFzc2lmeS5sZW5ndGgpLmZpbGwoXFxcIi0xXFxcIik7XFxuICAgICAgbGV0IGNhdGVfb2JqID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImNhdGVfb2JqXFxcIiwge30pO1xcbiAgICAgIGNhdGVfb2JqW2NhdGVdID0gY2F0ZV9vYmpbY2F0ZV0gPyBjYXRlX29ialtjYXRlXSA6IGluaXRfY2F0ZVxcbiAgICAgIHZhciBjYXRlX3RlbXAgPSBjYXRlX29ialtjYXRlXTtcXG4gICAgICAvL3ZhciBmaWx0ZXJfZGVmPXN0b3JhZ2UwLmdldEl0ZW0oXFxcImZpbHRlcl9kZWZcXFwiLCB7fSk7XFxuICAgICAgY2xhc3NpZnkuZm9yRWFjaCgoeCwgaW5kZXgpID0+IHtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgY29sX3R5cGU6ICdibGFua19ibG9jaydcXG4gICAgICAgIH0pXFxuICAgICAgICB4LnZhbHVlLmZvckVhY2goKGl0LCBpKSA9PiB7XFxuICAgICAgICAgIGxldCB0ID0gaXQubjtcXG4gICAgICAgICAgaWYgKGNhdGVfdGVtcFtpbmRleF0gPT0gaSkge1xcbiAgICAgICAgICAgIHQgPSBcXFwiPGI+PGZvbnQgY29sb3I9XFxcIiArIGNvbG9yICsgXFxcIj5cXFwiICsgdCArIFxcXCI8L2ZvbnQ+PC9iPlxcXCI7XFxuICAgICAgICAgICAgZmxbeC5rZXldID0gaXQudjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAoY2F0ZV90ZW1wW2luZGV4XSA9PSBcXFwiLTFcXFwiKSB7XFxuICAgICAgICAgICAgZmxbeC5rZXldID0gXFxcInVuZGVmaW5lZFxcXCI7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGZvbGQgPT0gMSkge1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIHQsXFxuICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG8pID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBvLmk7XFxuICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJpc19kZWZcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZV9vYmogPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCB7fSk7XFxuXFxuICAgICAgICAgICAgICAgIGxldCBjYXRlX3RlbXAgPSBvLmNhdGVfdGVtcDtcXG4gICAgICAgICAgICAgICAgaWYgKGNhdGVfdGVtcC5jb25zdHJ1Y3RvciAhPSBBcnJheSkge1xcbiAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcCA9IFtdO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG8uaW5kZXg7XFxuICAgICAgICAgICAgICAgIGxldCBjID0gY2F0ZV90ZW1wW2luZGV4XSB8fCBcXFwiLTFcXFwiO1xcbiAgICAgICAgICAgICAgICAvL2xvZyhjKVxcbiAgICAgICAgICAgICAgICBpZiAoYyA9PSBpKSB7XFxuICAgICAgICAgICAgICAgICAgby5jYXRlX3RlbXBbaW5kZXhdID0gXFxcIi0xXFxcIjtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICBvLmNhdGVfdGVtcFtpbmRleF0gPSBpICsgXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgY2F0ZV9vYmpbby5jYXRlXSA9IGNhdGVfdGVtcDtcXG4gICAgICAgICAgICAgICAgLy9sb2coY2F0ZV90ZW1wKVxcbiAgICAgICAgICAgICAgICAvL3N0b3JhZ2UwLnB1dE15VmFyKFxcXCJjYXRlX3RlbXBcXFwiLCBjYXRlX3RlbXApO1xcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCBjYXRlX29iaik7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcXG4gICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsXFxuICAgICAgICAgICAgICAgIGk6IGksXFxuICAgICAgICAgICAgICAgIGNhdGU6IGNhdGVcXG4gICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICAgIH0pXFxuICAgIH1cXG4gIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2V0RmwoKSB7XFxuICBmbCA9IE9iamVjdC5rZXlzKGZsKS5maWx0ZXIoa2V5ID0+IGZsW2tleV0gIT09IFxcXCJ1bmRlZmluZWRcXFwiKS5yZWR1Y2UoKHJlcywga2V5KSA9PiB7XFxuICAgIHJlc1trZXldID0gZmxba2V5XTtcXG4gICAgcmV0dXJuIHJlcztcXG4gIH0sIHt9KTtcXG4gIHJldHVybiBmbFxcbn1cXG5cXG5mdW5jdGlvbiBnZXRDYXRlTGlzdCgpIHtcXG4gIHJldHVybiB7XFxuICAgIGNhdGUsXFxuICAgIGhvbWVsaXN0XFxuICB9XFxufVxcblxcblxcbiQuZXhwb3J0cyA9IHtcXG4gIGdldGNhdGVsaXN0OiBnZXRDYXRlTGlzdCxcXG4gIGdldGNhdGVnb3J5czogZ2V0Q2F0ZWdvcnlzLFxcbiAgZ2V0Zmw6IGdldEZsXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5pys5Zyw6KeE5YiZ566h55CGXCIsXCJwYXRoXCI6XCJMb2NhbERpclwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLmlofku7bnrqHnkIZcXFwiKTtcXG5sZXQgcGF0aCA9IGdldFBhdGgoU3RyaW5nKE1ZX1BBUkFNUy5jcGF0aCkpLnJlcGxhY2UoXFxcImZpbGU6Ly9cXFwiLCBcXFwiXFxcIik7XFxubGV0IGZpbGVTZWxlY3QgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG5maWxlU2VsZWN0LmZpbGVTZWxlY3Rpb24oe1xcbiAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICByZXR1cm4gXFxcImVkaXRGaWxlOi8vZmlsZTovL1xcXCIgKyBQQVRIO1xcbiAgICB9KSxcXG4gICAgbWVtb3J5OiBcXFwiZmlsZXBhdGhcXFwiLFxcbiAgICBmaWxlVHlwZTogXFxcIi5qc3wudHh0fC5qc29uXFxcIixcXG4gICAgZXhpdFNlYXJjaFJlZnJlc2g6IHRydWUsXFxuICAgIHBhdHRlcm46IDAsXFxuICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICBpbml0aWFsUGF0aDogcGF0aCxcXG59LCBNWV9QQVJBTVMubmV3V2luZG93ID8gW10gOiBbe1xcbiAgICB0aXRsZTogXFxcIuaWsOeql+WPo+aJk+W8gFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Mb2NhbERpciNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgY3BhdGg6IE1ZX1BBUkFNUy5jcGF0aCxcXG4gICAgICAgIG5ld1dpbmRvdzogdHJ1ZSxcXG4gICAgICAgIHdpbmRvd0lkOiBNWV9SVUxFLnRpdGxlICsgXFxcIkBlZGl0ZmlsZVxcXCIsXFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBwYWdlVGl0bGU6IFxcXCLmlofku7bnrqHnkIZcXFwiXFxuICAgIH1cXG59XSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpu5jorqTkv53lrZjpgInmi6lcIixcInBhdGhcIjpcInNoYXJlZGVmYXVsdHBhdGhcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5L+d5a2Y6Lev5b6EXFxcIik7XFxubGV0IGxheW91dCA9IFtdO1xcbmxldCBmID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIpO1xcbn0pO1xcblxcbmxldCBwYXRoID0gam9pblVybChnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpLCBcXFwiLi4vXFxcIi5yZXBlYXQoNSkpLnNsaWNlKDcpO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpgInmi6lcXFwiLFxcbiAgICB1cmw6IEpTT04uc3RyaW5naWZ5KGYuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiKS5leHRyYTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiLCB7XFxuICAgICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KSxcXG4gICAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxuICAgICAgICBwYXR0ZXJuOiAxXFxuICAgIH0pKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLlgqjlrZjot6/lvoRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIiwgZ2V0UHVibGljSXRlbShcXFwiRHJweUhpa2VyQGlucHV0X3BhdGhcXFwiLCBcXFwiXFxcIikpLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGlkOiBcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIlxcbiAgICB9XFxufSk7XFxuXFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuehruiupFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQpID0+IHtcXG4gICAgICAgIGxldCBwYXRoID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIsIFxcXCJcXFwiKTtcXG5cXG4gICAgICAgIGlmICghcGF0aCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3lj6/kuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2V0UHVibGljSXRlbShcXFwiRHJweUhpa2VyQGlucHV0X3BhdGhcXFwiLCBwYXRoKTtcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbn0pO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5bCP6K+0XCIsXCJwYXRoXCI6XCJub3ZlbFwiLFwicnVsZVwiOlwianM6XFxubGV0IGRycHkgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKS5nZXRCeVNvdXJjZShNWV9QQVJBTVMuc291cmNlKTtcXG5sZXQgcGxheSA9IEpTT04ucGFyc2UoZHJweS5wbGF5KE1ZX1BBUkFNUy5mcm9tLCBNWV9QQVJBTVMuaWQsIFtdKSk7XFxuXFxubGV0IGRhdGEgPSBKU09OLnBhcnNlKHBsYXkudXJsLnJlcGxhY2UoXFxcIm5vdmVsOi8vXFxcIiwgXFxcIlxcXCIpKTtcXG5sZXQgbGF5b3V0ID0gW107XFxubGV0IGNvbnRlbnQgPSBcXFwi44CA44CAXFxcIiArIGRhdGEuY29udGVudC5zcGxpdCgvKFxcXFxufFxcXFxyKSsvKS5maWx0ZXIoaXQgPT4gaXQudHJpbSgpLmxlbmd0aCA+IDEpLm1hcChpdCA9PiBpdC50cmltKCkpLmpvaW4oXFxcIjxicj7jgIDjgIBcXFwiKTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG4gICAgdGl0bGU6IChcXFwiPHN0cm9uZz5cXFwiICsgKGRhdGEudGl0bGUgfHwgZ2V0UGFnZVRpdGxlKCkpICsgXFxcIjwvc3Ryb25nPlxcXCIpLmJpZygpLFxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IGNvbnRlbnQsXFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRleHRTaXplOiAxOCxcXG4gICAgICAgIGNsaWNrOiB0cnVlXFxuICAgIH1cXG59KTtcXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuS4u+mhtVwiLFwicGF0aFwiOlwibWlhblwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gbG9hZChkLCBkcnB5LCBzb3VyY2UsIGhhc0hhZWQpIHtcXG4gIGxldCB7XFxuICAgIHVpX2NvbmZpZyxcXG4gIH0gPSAkLnJlcXVpcmUoXFxcIlVJTWFuYWdlXFxcIik7XFxuICB1aV9jb25maWcgPSB1aV9jb25maWcueWk7XFxuXFxuICBsZXQgcGFnZSA9IE1ZX1BBR0U7XFxuICBsZXQgY2F0ZWdvcnlzID0gJC5yZXF1aXJlKFxcXCJjYXRlZ29yeXNcXFwiKTtcXG4gIGNhdGVnb3J5cy5nZXRjYXRlZ29yeXMoZCwgZHJweSwgcGFnZSwgaGFzSGFlZCk7XFxuICBsZXQge1xcbiAgICBjYXRlLFxcbiAgICBob21lbGlzdFxcbiAgfSA9IGNhdGVnb3J5cy5nZXRjYXRlbGlzdCgpO1xcbiAgaWYgKGdldE15VmFyKFxcXCJsaW5rc1xcXCIsIFxcXCJcXFwiKSA9PSBcXFwiMVxcXCIgJiYgIWhhc0hhZWQpIHtcXG4gICAgc2V0UHJlUmVzdWx0KGQpO1xcbiAgICBkLmxlbmd0aCA9IDA7XFxuICB9XFxuXFxuICBsZXQgZmwgPSBjYXRlZ29yeXMuZ2V0ZmwoKTtcXG4gIGxldCBza2lwRXIgPSBkcnB5LmdldFJ1bGUoXFxcIuS6jOe6p1xcXCIpID09PSBcXFwiKlxcXCIgJiYgZ2V0SXRlbShcXFwic2tpcEVyXFxcIiwgXFxcIlxcXCIpO1xcbiAgbGV0IGRlQ29sID0gZHJweS5nZXRSdWxlKGNhdGUgPT0gXFxcImhvbWVcXFwiID8gXFxcImhpa2VyTGlzdENvbFxcXCIgOiBcXFwiaGlrZXJDbGFzc0xpc3RDb2xcXFwiKTtcXG4gIGxldCBob21lTGlzdENvbCA9IGdldEl0ZW0oXFxcImhvbWVMaXN0Q29sXFxcIiwgXFxcIlxcXCIpIHx8IGRlQ29sIHx8IFxcXCJtb3ZpZV8zX21hcnF1ZWVcXFwiO1xcbiAgbGV0IHN0eXBlID0gZHJweS5nZXRSdWxlKFxcXCLnsbvlnotcXFwiKTtcXG4gIGxldCBpY29uID0gdWlfY29uZmlnLmljb25zLuW9seinhjtcXG4gIHN3aXRjaCAoc3R5cGUpIHtcXG4gICAgY2FzZSAn5ryr55S7JzpcXG4gICAgICBpY29uID0gdWlfY29uZmlnLmljb25zLua8q+eUuztcXG4gICAgICBicmVhaztcXG4gICAgY2FzZSAn5bCP6K+0JzpcXG4gICAgICBpY29uID0gdWlfY29uZmlnLmljb25zLuWwj+ivtDtcXG4gICAgICBicmVhaztcXG4gICAgZGVmYXVsdDpcXG4gIH1cXG4gIHVwZGF0ZUl0ZW0oTVlfUlVMRS50aXRsZSArIFxcXCJzb3VyY2VuYW1lXFxcIiwge1xcbiAgICBpbWc6IGljb24sXFxuICB9KTtcXG5cXG4gIGxldCBsaXN0ID0gW107XFxuICBpZiAoY2F0ZSA9PSBcXFwiaG9tZVxcXCIpIHtcXG4gICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgIGxpc3QgPSBob21lbGlzdDtcXG4gICAgfVxcbiAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKSB7XFxuICAgICAgbGlzdCA9IFtdO1xcbiAgICAgIGNsZWFyTXlWYXIoXFxcImlzaG9tZVxcXCIpO1xcbiAgICB9XFxuICAgIGlmIChsaXN0Lmxlbmd0aCA+IDAgJiYgIWxpc3QuYXQoMCkudm9kX3BpYyAmJiAhbGlzdC5hdCgtMSkudm9kX3BpYyAmJiAhZGVDb2wpIHtcXG4gICAgICBob21lTGlzdENvbCA9IFxcXCJ0ZXh0XzFcXFwiO1xcbiAgICB9XFxuICB9IGVsc2Uge1xcbiAgICBsaXN0ID0gSlNPTi5wYXJzZShkcnB5LmNhdGVnb3J5KFN0cmluZyhjYXRlKSwgcGFnZSwgdHJ1ZSwgZmwpKS5saXN0O1xcbiAgfVxcbiAgbGV0IHVybCA9IFxcXCJoaWtlcjovL3BhZ2UvZGV0YWlsZWRcXFwiICsgdWlfY29uZmlnLm1hcms7XFxuXFxuICBpZiAobGlzdC5sZW5ndGgpIHtcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgIGxldCBpZCA9IFN0cmluZyhpdC52b2RfaWQpO1xcbiAgICAgIGxldCBjaWQ7XFxuICAgICAgLy9sb2coaXQpXFxuICAgICAgbGV0IG5hbWUgPSBpdC52b2RfbmFtZTtcXG4gICAgICBpZiAoaWQgPT09IFxcXCJub19kYXRhXFxcIikge1xcbiAgICAgICAgdXJsID0gXFxcInRvYXN0Oi8v5rKh5pyJ5pWw5o2uXFxcIjtcXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZCA9PT0gXFxcInN0cmluZ1xcXCIgJiYgaWQuaW5jbHVkZXMoXFxcIm1zZWFyY2g6XFxcIikgfHwgaWQgPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICB1cmwgPSAkKFxcXCJcXFwiKS5sYXp5UnVsZSgobmFtZSkgPT4ge1xcbiAgICAgICAgICBwdXRNeVZhcihcXFwidGVtc21vZGVcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vc2VhcmNoP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiJnM9XFxcIiArIG5hbWU7XFxuICAgICAgICB9LCBuYW1lKTtcXG4gICAgICB9IGVsc2UgaWYgKHNraXBFcikge1xcbiAgICAgICAgdXJsID0gJCgpLmxhenlSdWxlKChzb3VyY2UsIGlkKSA9PiB7XFxuICAgICAgICAgIGxldCB1cmw7XFxuICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZHJweSA9IERycHlNYW5hZ2UuZ2V0QnlTb3VyY2Uoc291cmNlKTtcXG4gICAgICAgICAgICB1cmwgPSBKU09OLnBhcnNlKGRycHkuZGV0YWlsKGlkKSkubGlzdFswXS52b2RfcGxheV91cmwuc3BsaXQoXFxcIiRcXFwiKVsxXTtcXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHVybCA9IGlkLnNwbGl0KFxcXCJAQFxcXCIpWzBdO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcInZpZGVvVXJsXFxcIikucGFyc2UodXJsLCBpZCwgc291cmNlKTtcXG4gICAgICAgIH0sIHNvdXJjZSwgaWQpO1xcbiAgICAgICAgY2lkID0gaWQ7XFxuICAgICAgfVxcbiAgICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogbmFtZSxcXG4gICAgICAgIGRlc2M6IGl0LnZvZF9yZW1hcmtzLFxcbiAgICAgICAgdXJsOiB1cmwsXFxuICAgICAgICBpbWc6IGl0LnZvZF9waWMsXFxuICAgICAgICBjb2xfdHlwZTogaG9tZUxpc3RDb2wsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBpbWc6IGl0LnZvZF9waWMsXFxuICAgICAgICAgIHZvZElkOiBpZCxcXG4gICAgICAgICAgc25hbWU6IHNvdXJjZS5uYW1lLFxcbiAgICAgICAgICBza2V5OiBzb3VyY2Uua2V5LFxcbiAgICAgICAgICBpZDogY2lkLFxcbiAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLogZrlkIjmkJzntKJcXFwiLFxcbiAgICAgICAgICAgIGpzOiBcXFwicHV0TXlWYXIoJ3RlbXNtb2RlJywgJzEnKTsnaGlrZXI6Ly9zZWFyY2g/cnVsZT0nICsgTVlfUlVMRS50aXRsZSArICcmcz1cXFwiICsgbmFtZSArIFxcXCInO1xcXCJcXG4gICAgICAgICAgfV1cXG4gICAgICAgIH1cXG4gICAgICB9KTtcXG4gICAgfVxcbiAgfVxcbiAgZGVsZXRlSXRlbShNWV9SVUxFLnRpdGxlICsgXFxcImxvYWRcXFwiKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0RHJweVBhdGgoZCkge1xcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLnvLrlsJHov5DooYzlupNcXFxcbuivpeWwj+eoi+W6j+S4jeiDvemAmui/h+S6keWJqui0tOadv+WIhuS6q++8jOWPquiDvemAmui/h+aJk+WMheWIhuS6q1xcXCIsXFxuICAgIGRlc2M6IFxcXCLlsIbov5DooYzlupPmlL7lhaVcXFwiICsgZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9kYXRhL1xcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcIi9saWJzX2hpa2VyL2RycHkyLmpzXFxcIiksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0SGllZChkLCBuYW1lLCBjb25maWcpIHtcXG4gIGxldCB7XFxuICAgIHVpX2NvbmZpZyxcXG4gICAgdWlfZXhwYW5kLFxcbiAgICByZW9yZGVyQXJyYXlCeU9yZGVyXFxuICB9ID0gJC5yZXF1aXJlKFxcXCJVSU1hbmFnZVxcXCIpO1xcbiAgdWlfY29uZmlnID0gdWlfY29uZmlnLnlpO1xcbiAgbGV0IHVpX2luZGV4cyA9IHVpX2NvbmZpZy51aTtcXG4gIHVpX2V4cGFuZCgpO1xcblxcbiAgbGV0IHNlbGVjdHMgPSBbe1xcbiAgICB0aXRsZTogXFxcIuaUtuiXj1xcXCIsXFxuICAgIGljb246IHVpX2NvbmZpZy5pY29ucy7mlLbol49cXG4gIH0sIHtcXG4gICAgdGl0bGU6IFxcXCLkuabmnrYt5bCP6K+0XFxcIixcXG4gICAgaWNvbjogdWlfY29uZmlnLmljb25zLuS5puaetuWwj+ivtFxcbiAgfSwge1xcbiAgICB0aXRsZTogXFxcIuS5puaeti3mvKvnlLtcXFwiLFxcbiAgICBpY29uOiB1aV9jb25maWcuaWNvbnMu5Lmm5p625ryr55S7XFxuICB9XVxcblxcbiAgbGV0IGZhdmljb25zID0ge1xcbiAgICBnZXQoc3QpIHtcXG4gICAgICBzdCA9IHN0IHx8IHNlbGVjdHM7XFxuICAgICAgcmV0dXJuICQoc3QsIDIsIFxcXCLmiJHnmoRcXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCLljoblj7JcXFwiKSkge1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vaGlzdG9yeT9ydWxlPVxcXCIgKyBNWV9SVUxFLnRpdGxlO1xcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwi5Lmm5p62LeWwj+ivtFxcXCIpKSB7XFxuICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9wYWdlL0Jvb2tyYWNrLnZpZXcjbm9SZWNvcmRIaXN0b3J5Iz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhiZ0eXBlPW5vdmVsJnJ1bGVOYW1lPScgKyBNWV9SVUxFLnRpdGxlO1xcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwi5Lmm5p62Lea8q+eUu1xcXCIpKSB7XFxuICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9wYWdlL0Jvb2tyYWNrLnZpZXcjbm9SZWNvcmRIaXN0b3J5Iz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhiZ0eXBlPWNvbWljJnJ1bGVOYW1lPScgKyBNWV9SVUxFLnRpdGxlO1xcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwi5pS26JePXFxcIikpIHtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2NvbGxlY3Rpb24/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZTtcXG4gICAgICAgIH1cXG4gICAgICB9KVxcbiAgICB9XFxuICB9O1xcblxcblxcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZhdmljb25zLCAnc2VsZWN0Jywge1xcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcXG4gICAgICByZXR1cm4gc2VsZWN0cztcXG4gICAgfSxcXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcXG4gICAgICBzZWxlY3RzLnB1c2godmFsdWUpO1xcbiAgICB9XFxuICB9KTtcXG4gIEdNLnB1dChcXFwiZmF2aWNvbnNcXFwiLCBmYXZpY29ucyk7XFxuXFxuICBsZXQgc21vZGUgPSBOdW1iZXIoZ2V0SXRlbShcXFwic21vZGVcXFwiLCBcXFwiMFxcXCIpKTtcXG4gIGxldCBzZWFyY2hzb3J0ID0gTnVtYmVyKGdldEl0ZW0oXFxcInNlYXJjaHNvcnRcXFwiLCBcXFwiMFxcXCIpKTtcXG4gIGxldCBmaWxlU2VsZWN0ID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIik7XFxuICBsZXQgdWlvYmogPSBbXTtcXG5cXG5cXG4gIHVpb2JqLnB1c2goe1xcbiAgICBpbmRleDogMCxcXG4gICAga2V5OiBcXFwi5o2i5rqQXFxcIixcXG4gICAgdGl0bGU6IFxcXCLmjaLmupBcXFwiLFxcbiAgICBjb2xfdHlwZTogdWlfY29uZmlnLmNvbCxcXG4gICAgaW1nOiB1aV9jb25maWcuaWNvbnMu5o2i5rqQLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICQucmVxdWlyZShcXFwiQ2hhbmdlU291cmNlUG9wXFxcIikuc2hvdygpO1xcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBleHRyYToge1xcbiAgICAgIGNwYXRoOiBjb25maWcucGF0aCxcXG4gICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICB0aXRsZTogXFxcIuabtOaNoumFjee9rlxcXCIsXFxuICAgICAgICBqczogSlNPTi5zdHJpbmdpZnkoXFxcImhpa2VyOi8vcGFnZS9jcmVhdGVDb25maWcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIilcXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIuiuv+mXrue9keermVxcXCIsXFxuICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcXG4gICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgRHJweU1hbmFnZS5nZXQoc291cmNlLmtleSkuZ2V0UnVsZShcXFwiaG9zdFxcXCIpO1xcbiAgICAgICAgICAvL3JlZnJlc2hQYWdlKCk7XFxuICAgICAgICB9KVxcbiAgICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Yi35paw5rqQXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgY2xlYXJNeVZhcihcXFwibGlua3NcXFwiKTtcXG4gICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcbiAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICBEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KS5pbml0KHJ1bnRpbWVDb25maWcuZ2V0QWJzb2x1dGVQYXRoKHNvdXJjZS5leHQpKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0pXFxuICAgICAgfSwge1xcbiAgICAgICAgdGl0bGU6IFxcXCLph43ovb3mupBcXFwiLFxcbiAgICAgICAganM6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XFxuICAgICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICAgICAgICAgIERycHlNYW5hZ2UuZGVsKHNvdXJjZS5rZXkpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSlcXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIuafpeeci+a6kOS7o+eggVxcXCIsXFxuICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcXG4gICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgbGV0IGNvZGUgPSBEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KS5ydW5NYWluKFxcXCJsZXQgbWFpbj1cXFwiICsgJC50b1N0cmluZygoZXh0KSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuICgpID0+IGdldE9yaWdpbmFsSnMocmVxdWVzdChleHQsIHtcXG4gICAgICAgICAgICAgICdtZXRob2QnOiAnR0VUJ1xcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgfSwgcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlUGF0aCgpKSk7XFxuXFxuICAgICAgICAgIGxldCBwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL3ZpZXdTb3VyY2VDb2RlLmpzXFxcIjtcXG4gICAgICAgICAgd3JpdGVGaWxlKHBhdGgsIGNvZGUpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImVkaXRGaWxlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICB9KVxcbiAgICAgIH1dLmNvbmNhdChjb25maWcudHlwZSA9PT0gXFxcImxvY2FsRGlyXFxcIiA/IFt7XFxuICAgICAgICB0aXRsZTogXFxcIue8lui+keWPguaVsOaYoOWwhOihqFxcXCIsXFxuICAgICAgICBqczogJC50b1N0cmluZygocGF0aCkgPT4ge1xcbiAgICAgICAgICBwYXRoICs9IFxcXCIvLm1hcHBpbmcudHh0XFxcIjtcXG4gICAgICAgICAgaWYgKGZpbGVFeGlzdChwYXRoKSkge1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLkv53lrZjlkI7liLfmlrDphY3nva7miJbph43lkK/miY3kvJrnlJ/mlYhcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImVkaXRGaWxlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuICQoXFxcIuS4jeWtmOWcqOaYoOWwhOaWh+S7tuaYr+WQpuWIm+W7uu+8n1xcXCIpLmNvbmZpcm0ocGF0aCA9PiB7XFxuICAgICAgICAgICAgICB3cml0ZUZpbGUocGF0aCwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgdG9hc3QoXFxcIuS/neWtmOWQjuWIt+aWsOmFjee9ruaIlumHjeWQr+aJjeS8mueUn+aViFxcXCIpO1xcbiAgICAgICAgICAgICAgcmV0dXJuIFxcXCJlZGl0RmlsZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgIH0sIHBhdGgpO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LCBjb25maWcucGF0aClcXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIuacrOWcsOeuoeeQhlxcXCIsXFxuICAgICAgICBqczogXFxcIidoaWtlcjovL3BhZ2UvTG9jYWxEaXIjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjJ1xcXCJcXG4gICAgICB9XSA6IFtdKVxcbiAgICB9XFxuICB9KTtcXG5cXG4gIHVpb2JqLnB1c2goe1xcbiAgICBpbmRleDogMSxcXG4gICAga2V5OiBcXFwi5pCc57Si5qih5byPXFxcIixcXG4gICAgdGl0bGU6IFtcXFwi6YCJ5LitXFxcIiwgXFxcIuiBmuWQiFxcXCIsIGNvbmZpZy5zVGFnIHx8IFxcXCLml6BUQUdcXFwiXVtzbW9kZV0sXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgbGV0IHNtb2RlID0gTnVtYmVyKGdldEl0ZW0oXFxcInNtb2RlXFxcIiwgXFxcIjBcXFwiKSk7XFxuICAgICAgcmV0dXJuICQoW1xcXCLpgInkuK1cXFwiLCBcXFwi6IGa5ZCIXFxcIiwgXFxcIuaMiVRBR1xcXCJdLCAxLCBcXFwi5pCc57Si5qih5byPXFxcIiwgc21vZGUpLnNlbGVjdCgodCkgPT4ge1xcbiAgICAgICAgaWYgKE1ZX0lOREVYID09PSAyKSB7XFxuICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgIGxldCB0YWdDbGFzc2VzID0gcnVudGltZUNvbmZpZy5nZXRUYWdDbGFzc2VzKCk7XFxuICAgICAgICAgIGxldCBzdGFnID0gcnVudGltZUNvbmZpZy5nZXRTZWFyY2hUYWcoKTtcXG4gICAgICAgICAgbGV0IGluZGV4ID0gMDtcXG4gICAgICAgICAgaWYgKCF0YWdDbGFzc2VzLmxlbmd0aCkgcmV0dXJuIFxcXCJ0b2FzdDovL+W9k+WJjemFjee9ruayoeaciVRBR+WTpuOAglxcXCI7XFxuICAgICAgICAgIGlmIChzdGFnKSB7XFxuICAgICAgICAgICAgaW5kZXggPSB0YWdDbGFzc2VzLmluZGV4T2Yoc3RhZykgKyAxO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHRhZ0NsYXNzZXMudW5zaGlmdChcXFwiW+aXoFRBR11cXFwiKTtcXG4gICAgICAgICAgcmV0dXJuICQodGFnQ2xhc3NlcywgMywgXFxcIuaQnOe0olRBR1tcXFwiICsgdGFnQ2xhc3Nlcy5sZW5ndGggKyBcXFwiXVxcXCIsIGluZGV4KS5zZWxlY3QoKHQpID0+IHtcXG4gICAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICAgIGxldCB0YWcgPSBNWV9JTkRFWCA9PT0gMCA/IFxcXCJcXFwiIDogaW5wdXQ7XFxuICAgICAgICAgICAgaWYgKHJ1bnRpbWVDb25maWcuc2V0U2VhcmNoVGFnKHRhZykpIHtcXG4gICAgICAgICAgICAgIHNldEl0ZW0oXFxcInNtb2RlXFxcIiwgXFxcIjJcXFwiKTtcXG4gICAgICAgICAgICAgIHVwZGF0ZUl0ZW0odCArIFxcXCJAc2VhcmNoX21vZGVcXFwiLCB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0YWcgfHwgXFxcIuaXoFRBR1xcXCIsXFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH0sIHQpO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2V0SXRlbShcXFwic21vZGVcXFwiLCBcXFwiXFxcIiArIE1ZX0lOREVYKTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0odCArIFxcXCJAc2VhcmNoX21vZGVcXFwiLCB7XFxuICAgICAgICAgIHRpdGxlOiBbXFxcIumAieS4rVxcXCIsIFxcXCLogZrlkIhcXFwiXVtNWV9JTkRFWF0sXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgTVlfUlVMRS50aXRsZSlcXG4gICAgfSksXFxuICAgIGltZzogdWlfY29uZmlnLmljb25zLuaQnOe0oixcXG4gICAgY29sX3R5cGU6IHVpX2NvbmZpZy5jb2wsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgaWQ6IE1ZX1JVTEUudGl0bGUgKyBcXFwiQHNlYXJjaF9tb2RlXFxcIixcXG4gICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICB0aXRsZTogXFxcIuaMh+WumuaQnOe0oua6kFxcXCIsXFxuICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICQucmVxdWlyZShcXFwiU2VhcmNoQWxsb3dQb3BcXFwiKS5zaG93KCk7XFxuICAgICAgICB9KVxcbiAgICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5pCc57Si5o6S5bqPOlxcXCIgKyBbXFxcIuaXoFxcXCIsIFxcXCLoh6rnhLZcXFwiLCBcXFwi5L2/55SoXFxcIl1bc2VhcmNoc29ydF0sXFxuICAgICAgICBqczogJC50b1N0cmluZygoc2VhcmNoc29ydCkgPT4ge1xcbiAgICAgICAgICByZXR1cm4gJChbXFxcIuS4jeS9v+eUqFxcXCIsIFxcXCLoh6rnhLbmjpLluo9cXFwiLCBcXFwi5L2/55So5o6S5bqPXFxcIl0sIDEsIFxcXCLmkJzntKLmjpLluo9cXFwiLCBzZWFyY2hzb3J0KS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInNlYXJjaHNvcnRcXFwiLCBTdHJpbmcoTVlfSU5ERVgpKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICB9KVxcbiAgICAgICAgfSwgc2VhcmNoc29ydClcXG4gICAgICB9XVxcbiAgICB9XFxuICB9KTtcXG5cXG4gIGxldCBzZXR0aW5ncyA9IFtcXFwi6Kej5p6Q566h55CGXFxcIiwgXFxcIuWumOaWueW8ueW5lVxcXCIsIFxcXCLmlK/mjIHkvZzogIVcXFwiLCBcXFwiVUnnrqHnkIZcXFwiLCBcXFwi6LCD6K+V5pel5b+XOlxcXCIgKyAoIWdldEl0ZW0oXFxcInVzZUxvZ1xcXCIsIFxcXCJcXFwiKSA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuW8gOWQr1xcXCIpLCBcXFwi6Lez6L+H5b2i5byP5LqM57qnOlxcXCIgKyAoIWdldEl0ZW0oXFxcInNraXBFclxcXCIsIFxcXCJcXFwiKSA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuW8gOWQr1xcXCIpLCBcXFwi5YiG5Lqr5a+85YWl6Lev5b6EXFxcIiwgXFxcIuWIm+W7uuiuoumYheWcsOWdgFxcXCIsIFxcXCLliIfmjaLliJfooajmoLflvI9cXFwiLCBcXFwiR2l0SHViUkFX5Zyw5Z2AXFxcIiwgXFxcIuabtOaNoumFjee9rlxcXCIsIFxcXCLkuLvpopg6XFxcIiArIGdldEl0ZW0oXFxcInRoZW1lXFxcIiwgXFxcIum7mOiupFxcXCIpXTtcXG4gIGxldCBkaXNWaXNpYmxlcyA9IHVpX2luZGV4cy5maWx0ZXIoeCA9PiB4LmluZGV4ID09IC0xKTtcXG4gIGlmIChkaXNWaXNpYmxlcy5zb21lKHggPT4geC5rZXkgPT0gXFxcIuaQnOe0ouaooeW8j1xcXCIpKSB7XFxuICAgIHNldHRpbmdzLnB1c2goXFxcIuaQnOe0ouaooeW8jzpcXFwiICsgW1xcXCLpgInkuK1cXFwiLCBcXFwi6IGa5ZCIXFxcIl1bc21vZGVdKTtcXG4gICAgc2V0dGluZ3MucHVzaChcXFwi5pCc57Si5oyH5a6a5rqQXFxcIik7XFxuICAgIHNldHRpbmdzLnB1c2goXFxcIuaQnOe0ouaOkuW6jzpcXFwiICsgW1xcXCLml6BcXFwiLCBcXFwi6Ieq54S2XFxcIiwgXFxcIuS9v+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