Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@DrpyHiker@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoiRHJweUhpa2VyIiwiYXV0aG9yIjoiQExveURnSWsmemV0YWxwaGEiLCJ1cmwiOiJoaWtlcjovL2VtcHR5IyNmeXBhZ2UiLCJ2ZXJzaW9uIjoyNywiY29sX3R5cGUiOiJtb3ZpZV8zIiwiY2xhc3NfbmFtZSI6IiIsInR5cGUiOiJ2aWRlbyIsImNsYXNzX3VybCI6IiIsImFyZWFfbmFtZSI6IiIsImFyZWFfdXJsIjoiIiwic29ydF9uYW1lIjoiIiwieWVhcl9uYW1lIjoiIiwic29ydF91cmwiOiIiLCJ5ZWFyX3VybCI6IiIsImZpbmRfcnVsZSI6ImpzOiQucmVxdWlyZShcIk1pYW5Mb2FkXCIpOyIsInNlYXJjaF91cmwiOiJoaWtlcjovL2VtcHR5P3M9KiomcGFnZT1meXBhZ2UiLCJncm91cCI6IuKRoOW4uOeUqCIsInNlYXJjaEZpbmQiOiJqczpcbihmdW5jdGlvbiAoKSB7XG4gIGxldCBzbW9kZSA9IE51bWJlcihnZXRJdGVtKFwic21vZGVcIiwgXCIwXCIpKTtcbiAgbGV0IHRlbXNtb2RlID0gZ2V0TXlWYXIoXCJ0ZW1zbW9kZVwiLCBcIlwiKTtcbiAgaWYgKHRlbXNtb2RlKSB7XG4gICAgc21vZGUgPSBOdW1iZXIodGVtc21vZGUpO1xuICAgIGNsZWFyTXlWYXIoXCJ0ZW1zbW9kZVwiKTtcbiAgfVxuICBpZiAoIWZpbGVFeGlzdChcImhpa2VyOi8vZmlsZXMvZGF0YS9cIiArIE1ZX1JVTEUudGl0bGUgKyBcIi9saWJzX2hpa2VyL2RycHkyLmpzXCIpKSByZXR1cm4gc2V0UmVzdWx0KFt7XG4gICAgdGl0bGU6IFwi6K+35YmN5b6A5bCP56iL5bqP5Li76aG16K6+572uZHJweVBhdGhcIixcbiAgICB1cmw6IFwiaGlrZXI6Ly9ob21lQFwiICsgTVlfUlVMRS50aXRsZVxuICB9XSk7XG4gIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFwicnVudGltZUNvbmZpZ1wiKTtcbiAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXCJEcnB5TWFuYWdlXCIpO1xuICBpZiAoIXJ1bnRpbWVDb25maWcuaXNQcmVwYXJlZCgpKSByZXR1cm4gc2V0UmVzdWx0KFt7XG4gICAgdGl0bGU6IFwi6K+35YmN5b6A5bCP56iL5bqP5Li76aG16K6+572u5rqQXCIsXG4gICAgdXJsOiBcImhpa2VyOi8vaG9tZUBcIiArIE1ZX1JVTEUudGl0bGVcbiAgfV0pO1xuXG4gIGlmIChzbW9kZSA9PT0gMCkge1xuICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcbiAgICBpZiAoIXNvdXJjZS5zZWFyY2hhYmxlKSByZXR1cm4gc2V0UmVzdWx0KFt7XG4gICAgICB0aXRsZTogXCLlvZPliY3mupDkuI3mlK/mjIHmkJzntKJcIixcbiAgICAgIHVybDogXCJoaWtlcjovL2VtcHR5XCJcbiAgICB9XSk7XG4gICAgbGV0IGRycHkgPSBEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KTtcblxuICAgIGxldCBob21lTGlzdCA9IFtdXG4gICAgdHJ5IHtcbiAgICAgIGhvbWVMaXN0ID0gSlNPTi5wYXJzZShkcnB5LnNlYXJjaChNWV9LRVlXT1JELCBmYWxzZSwgTVlfUEFHRSkpLmxpc3QgfHwgW107XG4gICAgfSBjYXRjaCB7IH1cbiAgICBsZXQgZCA9IFtdO1xuICAgIGZvciAobGV0IGl0IG9mIGhvbWVMaXN0KSB7XG4gICAgICBkLnB1c2goe1xuICAgICAgICB0aXRsZTogaXQudm9kX25hbWUsXG4gICAgICAgIGRlc2M6IGl0LnZvZF9yZW1hcmtzICsgXCLCt1wiICsgc291cmNlLm5hbWUsXG4gICAgICAgIGNvbnRlbnQ6IGl0LnZvZF9jb250ZW50LFxuICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL2RldGFpbGVkI2ltbWVyc2l2ZVRoZW1lI1wiLFxuICAgICAgICBwaWNfdXJsOiBpdC52b2RfcGljLFxuICAgICAgICBjb2xfdHlwZTogXCJtb3ZpZV8zXCIsXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgdm9kSWQ6IGl0LnZvZF9pZCxcbiAgICAgICAgICBpbWc6IGl0LnZvZF9waWMsXG4gICAgICAgICAgc25hbWU6IHNvdXJjZS5uYW1lLFxuICAgICAgICAgIHNrZXk6IHNvdXJjZS5rZXlcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHNldFJlc3VsdChkKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRSZXN1bHQoW3tcbiAgICAgIHRpdGxlOiBcIueCueaIkeW8gOWni+iBmuWQiOaQnOe0olwiICsgTVlfS0VZV09SRCxcbiAgICAgIHVybDogXCJoaWtlcjovL3NlYXJjaD9zPVwiICsgTVlfS0VZV09SRCxcbiAgICAgIGV4dHJhOiB7XG4gICAgICAgIGRlbGVnYXRlT25seVNlYXJjaDogdHJ1ZSxcbiAgICAgICAgcnVsZXM6ICQudG9TdHJpbmcoKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcInJ1bnRpbWVDb25maWdcIiwgXCJydW50aW1lQ29uZmlnXCIpO1xuICAgICAgICAgICAgbGV0IGxpc3QgPSBydW50aW1lQ29uZmlnLmdldEFsbG93U2VhcmNoU291cmNlKCk7XG5cbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcblxuICAgICAgICAgICAgbGV0IGxpc3RpID0gbGlzdC5maW5kSW5kZXgoeCA9PiB4LmtleSA9PSBzb3VyY2Uua2V5KTtcblxuICAgICAgICAgICAgaWYgKHNvdXJjZS5zZWFyY2hhYmxlICYmIGxpc3RpICE9IC0xKSB7XG4gICAgICAgICAgICAgIGxpc3Quc3BsaWNlKGxpc3QuaW5kZXhPZihzb3VyY2UpLCAxKTtcbiAgICAgICAgICAgICAgbGlzdC51bnNoaWZ0KHNvdXJjZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBydWxlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xuICAgICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogaXQubmFtZSxcbiAgICAgICAgICAgICAgICBzZWFyY2hfdXJsOiBcImhpa2VyOi8vZW1wdHk/cGFnZT1meXBhZ2Umc2VhcmNoVGVybXM9KipcIixcbiAgICAgICAgICAgICAgICBzZWFyY2hGaW5kOiBcImpzOlwiICsgJC50b1N0cmluZygoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IGRycHkgPSBHTS5kZWZpbmVNb2R1bGUoXCJEcnB5TWFuYWdlXCIpLmdldChpdGVtLmtleSk7XG5cbiAgICAgICAgICAgICAgICAgIGxldCBob21lTGlzdCA9IEpTT04ucGFyc2UoZHJweS5zZWFyY2goTVlfS0VZV09SRCwgZmFsc2UsIE1ZX1BBR0UpKS5saXN0IHx8IFtdO1xuICAgICAgICAgICAgICAgICAgbGV0IGQgPSBbXTtcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGhvbWVMaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0LnZvZF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IGl0LnZvZF9yZW1hcmtzLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGl0LnZvZF9jb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvZGV0YWlsZWQjaW1tZXJzaXZlVGhlbWUjXCIsXG4gICAgICAgICAgICAgICAgICAgICAgcGljX3VybDogaXQudm9kX3BpYyxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXCJtb3ZpZV8zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvZElkOiBpdC52b2RfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1BvbHltZXJpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWc6IGl0LnZvZF9waWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzbmFtZTogaXRlbS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2tleTogaXRlbS5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChkKTtcbiAgICAgICAgICAgICAgICB9LCBpdClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocnVsZXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XSk7XG4gIH1cbn0pKCkiLCJkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwiZGV0YWlsX2ZpbmRfcnVsZSI6IiIsInNkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwic2RldGFpbF9maW5kX3J1bGUiOiIiLCJ1YSI6Im1vYmlsZSIsInByZVJ1bGUiOiIvKjwkPlxuQGluY2x1ZGUgc3RhcnRcbmh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5MTYmYXV0aD0xZDM1ZThmMC0yMmU4LTUyNzAtYTlkMS04MjZmNTNmMTc3YWRcbkBpbmNsdWRlIGVuZFxuPCQ+Ki9cbiIsInBhZ2VzIjoiW3tcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJkcnB5XCIsXCJwYXRoXCI6XCJkcnB5XCIsXCJydWxlXCI6XCJjb25zdCBza2V5ID0gbW9kdWxlLmltcG9ydFBhcmFtO1xcblxcbmZ1bmN0aW9uIGluaXRIaWtlcigpIHtcXG4gICAgY29uc3QgaXNDbG9zZUxvZyA9ICFnZXRJdGVtKFxcXCJ1c2VMb2dcXFwiLCBcXFwiXFxcIik7XFxuICAgIGNvbnN0IGxvY2FsS2V5ID0gXFxcImRycHlcXFwiO1xcbiAgICBjb25zdCBDcnlwdG9VdGlsID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2Fzc2V0cy9jcnlwdG8tamF2YS5qc1xcXCIpO1xcbiAgICBnbG9iYWxUaGlzLmxvY2FsID0ge1xcbiAgICAgICAgc2V0KHJ1bGVrZXksIGssIHYpIHtcXG4gICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKGxvY2FsS2V5ICsgXFxcIkBcXFwiICsgcnVsZWtleSArIFxcXCJAXFxcIiArIGssIHYpO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGdldChydWxla2V5LCBrLCB2KSB7XFxuICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2UwLmdldEl0ZW0obG9jYWxLZXkgKyBcXFwiQFxcXCIgKyBydWxla2V5ICsgXFxcIkBcXFwiICsgaywgXFxcIlxcXCIpIHx8IHY7XFxuICAgICAgICB9LFxcbiAgICAgICAgZGVsZXRlKHJ1bGVrZXksIGspIHtcXG4gICAgICAgICAgICBzdG9yYWdlMC5jbGVhckl0ZW0obG9jYWxLZXkgKyBcXFwiQFxcXCIgKyBydWxla2V5ICsgXFxcIkBcXFwiICsgayk7XFxuICAgICAgICB9XFxuICAgIH07XFxuICAgIGdsb2JhbFRoaXMuZ2V0UHJveHkgPSBmdW5jdGlvbiAoKSB7XFxuICAgICAgICByZXR1cm4gZ2V0TXlWYXIoXFxcIlByb3h5X1VybFxcXCIsIFxcXCJodHRwOi8vMTI3LjAuMC4xOjUyMDIwL3Byb3h5XFxcIikgKyBcXFwiP2hpa2VyU2tleT1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHNrZXkpICsgXFxcIiZkbz1qc1xcXCI7XFxuICAgIH1cXG4gICAgZXZhbChnZXRDcnlwdG9KUygpKTtcXG4gICAgZ2xvYmFsVGhpcy5DcnlwdG9KUyA9IENyeXB0b0pTO1xcblxcbiAgICBsZXQgJHJlcXVlc3QgPSByZXF1ZXN0O1xcbiAgICBsZXQgJHBvc3QgPSBwb3N0O1xcbiAgICBnbG9iYWxUaGlzLnJlcSA9IGZ1bmN0aW9uICh1cmwsIGNvYmopIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHJlcyA9IHt9O1xcbiAgICAgICAgICAgIGxldCBvYmogPSBPYmplY3QuYXNzaWduKHt9LCBjb2JqKTtcXG4gICAgICAgICAgICBpZiAob2JqLmRhdGEpIHtcXG4gICAgICAgICAgICAgICAgb2JqLmJvZHkgPSBvYmouZGF0YTtcXG4gICAgICAgICAgICAgICAgZGVsZXRlIG9iai5kYXRhO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KFxcXCJyZWRpcmVjdFxcXCIpKSBvYmoucmVkaXJlY3QgPSAhIW9iai5yZWRpcmVjdDtcXG4gICAgICAgICAgICBpZiAob2JqLmJ1ZmZlciA9PT0gMikge1xcbiAgICAgICAgICAgICAgICBvYmoudG9IZXggPSB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBvYmouaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgICAgICAgICBDb29raWU6IFxcXCIjbm9Db29raWUjXFxcIlxcbiAgICAgICAgICAgIH0sIG9iai5oZWFkZXJzKTtcXG4gICAgICAgICAgICBpZiAodXJsID09PSBcXFwiaHR0cHM6Ly9hcGkubm4uY2kvb2NyL2I2NC90ZXh0XFxcIiAmJiBvYmouaGVhZGVycykge1xcbiAgICAgICAgICAgICAgICBvYmouaGVhZGVyc1tcXFwiQ29udGVudC1UeXBlXFxcIl0gPSBcXFwidGV4dC9wbGFpblxcXCI7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpICYmICh1cmwuaW5jbHVkZXMoXFxcIj90eXBlPVxcXCIpIHx8IHVybC5pbmNsdWRlcyhcXFwiP3BhcmFtcz1cXFwiKSkpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIHVybC5sYXN0SW5kZXhPZihcXFwiP1xcXCIpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIG9iai5oZWFkZXJzKSB7XFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqLmhlYWRlcnNba2V5XSAhPT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIG9iai5oZWFkZXJzW2tleV0gPSBTdHJpbmcob2JqLmhlYWRlcnNba2V5XSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHIgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICAvKiBpZiAoU3RyaW5nKG9iai5tZXRob2QpLnRvTG93ZXJDYXNlKCkgPT09IFxcXCJwb3N0XFxcIikge1xcbiAgICAgICAgICAgICAgICAgciA9ICRwb3N0KHVybCwgb2JqKTtcXG4gICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgIHIgPSAkcmVxdWVzdCh1cmwsIG9iaik7XFxuICAgICAgICAgICAgIH0qL1xcbiAgICAgICAgICAgIHIgPSAkcmVxdWVzdCh1cmwsIG9iaik7XFxuICAgICAgICAgICAgaWYgKG9iai53aXRoSGVhZGVycykge1xcbiAgICAgICAgICAgICAgICByID0gSlNPTi5wYXJzZShyKTtcXG4gICAgICAgICAgICAgICAgcmVzLmNvbnRlbnQgPSByLmJvZHk7XFxuICAgICAgICAgICAgICAgIHJlcy5oZWFkZXJzID0ge307XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhyLmhlYWRlcnMgfHwge30pKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXMuaGVhZGVyc1trXSA9IHZbMF07XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXMuY29udGVudCA9IHI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChvYmouYnVmZmVyID09PSAyKSB7XFxuICAgICAgICAgICAgICAgIHJlcy5jb250ZW50ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KHJlcy5jb250ZW50KS50b0Jhc2U2NChfYmFzZTY0Lk5PX1dSQVApO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwiRXJyb3JcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICAvKlxcbiAgICBjb25zdCBKaW5KYSA9ICQucmVxdWlyZShcXFwiaHR0cHM6Ly9jZG4uYm9vdGNkbi5uZXQvYWpheC9saWJzL211c3RhY2hlLmpzLzQuMS4wL211c3RhY2hlLmpzXFxcIik7XFxuICBcXG4gICAgY29uc3QgSlAgPSAkLnJlcXVpcmUoXFxcImh0dHBzOi8vanNvbnBhdGgtcGx1cy5naXRodWIuaW8vSlNPTlBhdGgvZGlzdC9pbmRleC1icm93c2VyLXVtZC5janNcXFwiKTtcXG4gICAgZ2xvYmFsVGhpcy5jaGVlcmlvID0ge1xcbiAgICAgICAgamluamEyKHRlbXBsYXRlLCBvYmopIHtcXG4gICAgICAgICAgICBcXG4gICAgICAgICAgICByZXR1cm4gJC5sb2coSmluSmEucmVuZGVyKHRlbXBsYXRlLCBvYmopKTtcXG4gICAgICAgIH0sXFxuICAgICAgICBqcChwYXRoLCBqc29uKSB7XFxuICAgICAgICAgICAgcmV0dXJuIEpQLkpTT05QYXRoKHtcXG4gICAgICAgICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgICAgICAganNvblxcbiAgICAgICAgICAgIH0pWzBdO1xcbiAgICAgICAgfVxcbiAgICB9Ki9cXG4gICAgZ2xvYmFsVGhpcy5wZGZhID0gX3BkZmE7XFxuICAgIGdsb2JhbFRoaXMucGQgPSBfcGQ7XFxuICAgIGdsb2JhbFRoaXMucGRmaCA9IF9wZGZoO1xcbiAgICBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGwgPSBmdW5jdGlvbiAoc2VhcmNoLCByZXBsYWNlbWVudCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXQoc2VhcmNoKS5qb2luKHJlcGxhY2VtZW50KTtcXG4gICAgfTtcXG4gICAgbGV0ICR0b1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xcbiAgICAgICAgcmV0dXJuICR0b1N0cmluZy5hcHBseSh0aGlzKS50cmltKCk7XFxuICAgIH07XFxuICAgIGlmIChpc0Nsb3NlTG9nKSB7XFxuICAgICAgICAvLyDph43lhpljb25zb2xlLmxvZ+WHveaVsFxcbiAgICAgICAgY29uc29sZS5sb2cgPSBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgLy8g5qOA5p+l5Lyg5YWl5Y+C5pWw55qE5pWw6YePXFxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XFxuICAgICAgICAgICAgICAgIC8vIOWmguaenOWPguaVsOaVsOmHj+Wkp+S6jjHvvIzosIPnlKjljp/lp4vnmoRjb25zb2xlLmxvZ+WHveaVsFxcbiAgICAgICAgICAgICAgICAvL29yaWdpbmFsTG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cyk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvLyDlpoLmnpzlj4LmlbDlj6rmnInkuIDkuKrvvIzliJnkuI3lgZrku7vkvZXmk43kvZxcXG4gICAgICAgIH07XFxuICAgIH1cXG59XFxuaW5pdEhpa2VyKCk7XFxuY29uc3QgZHJweVBhdGggPSBnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL2RhdGEvXFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiL2xpYnNfaGlrZXIvZHJweTIuanNcXFwiKTtcXG5cXG5pZiAoIWZpbGVFeGlzdChkcnB5UGF0aCkpIHtcXG4gICAgdGhyb3cgbmV3IEVycm9yKFxcXCLnvLrlsJFkcnB5Lmpz6L+Q6KGM5bqTXFxcIik7XFxufVxcbmxldCBkcnB5ID0gJC5yZXF1aXJlKGRycHlQYXRoKTtcXG4vKlxcbmxldCBjdXJyZW50UGF0aCA9IFxcXCJcXFwiO1xcbmxldCAkaW5pdCA9IGRycHkuaW5pdDtcXG5kcnB5LmluaXQgPSBmdW5jdGlvbihleHQpIHtcXG4gICAgaWYgKGV4dCA9PT0gY3VycmVudFBhdGgpIHJldHVybjtcXG4gICAgJGluaXQuY2FsbCh0aGlzLCBleHQpO1xcbiAgICBjdXJyZW50UGF0aCA9IGV4dDtcXG59Ki9cXG5mdW5jdGlvbiBzeW5jKGZ1bmMsIHNwKSB7XFxuICAgIHJldHVybiBuZXcgb3JnLm1vemlsbGEuamF2YXNjcmlwdC5TeW5jaHJvbml6ZXIoZnVuYywgc3AgfHwge30pO1xcbn1cXG4vL2RycHkucHJveHkgPSBzeW5jKGRycHkucHJveHksIGRycHkpO1xcbiQuZXhwb3J0cyA9IGRycHk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8xX3ZlcnRpY2FsX3BpY19ibHVyXCIsXCJuYW1lXCI6XCLor6bnu4bpobXpnaJcIixcInBhdGhcIjpcImRldGFpbGVkXCIsXCJydWxlXCI6XCJqczpcXG4oZnVuY3Rpb24gKCkge1xcbiAgbGV0IGlkID0gTVlfUEFSQU1TLnZvZElkO1xcbiAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICAgIEdNLmNsZWFyKFxcXCJyZW5vdmF0ZUxpc3RcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwic29ydGlcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicGFnZW51bVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwbGF5bGlzdF9yZWFkeVxcXCIpO1xcbiAgfSk7XFxuICBhZGRMaXN0ZW5lcignb25SZWZyZXNoJywgJC50b1N0cmluZygoaWQpID0+IHtcXG4gICAgLy9jbGVhck15VmFyKGlkICsgXFxcImVyaW5mb1xcXCIpXFxuICAgIGNsZWFyTXlWYXIoXFxcInBsYXlsaXN0X3JlYWR5XFxcIik7XFxuICB9LCBpZCkpXFxuXFxuICBsZXQgZXIgPSAkLnJlcXVpcmUoXFxcIlVJTWFuYWdlXFxcIikudWlfY29uZmlnLmVyO1xcblxcbiAgZnVuY3Rpb24gaGlzdG9yeWxvZyhtb2RlLCBza2V5LCBpZCwgdmFsdWUpIHtcXG4gICAgdmFyIG5hbWUgPSBcXFwiaGlzdG9yeS5qc29uXFxcIjtcXG4gICAgbGV0IGpzb24gPSBbXTtcXG4gICAgaWYgKGZpbGVFeGlzdChuYW1lKSkge1xcbiAgICAgIGpzb24gPSBKU09OLnBhcnNlKHJlYWRGaWxlKG5hbWUsIDApKSB8fCBbXTtcXG4gICAgfVxcbiAgICBpZiAobW9kZSA9PSBcXFwiZ2V0XFxcIikge1xcbiAgICAgIGxldCBpbmRleCA9IGpzb24uZmluZEluZGV4KG9iaiA9PiBvYmouc2tleSA9PT0gc2tleSAmJiBvYmouaWQgPT09IGlkKTtcXG4gICAgICBpZiAoaW5kZXggIT0gLTEpIHtcXG4gICAgICAgIHJldHVybiBqc29uW2luZGV4XS5wYWdlO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICBsZXQgbWF4Y291bnQgPSBlci7ljoblj7LorrDlvZU7XFxuICAgIGlmIChtb2RlID09IFxcXCJzZXRcXFwiKSB7XFxuICAgICAgaWYgKGpzb24ubGVuZ3RoID49IG1heGNvdW50KSB7XFxuICAgICAgICBqc29uID0ganNvbi5zbGljZSgwLCBtYXhjb3VudCAtIDEpO1xcbiAgICAgIH1cXG4gICAgICBsZXQgaW5kZXggPSBqc29uLmZpbmRJbmRleChvYmogPT4gb2JqLnNrZXkgPT09IHNrZXkgJiYgb2JqLmlkID09PSBpZCk7XFxuICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XFxuICAgICAgICBpZiAoanNvbltpbmRleF0ucGFnZSAhPSB2YWx1ZS5wYWdlKSB7XFxuICAgICAgICAgIGpzb25baW5kZXhdLnBhZ2UgPSB2YWx1ZS5wYWdlO1xcbiAgICAgICAgICBzYXZlRmlsZShuYW1lLCBKU09OLnN0cmluZ2lmeShqc29uKSwgMCk7XFxuICAgICAgICB9O1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBqc29uLnB1c2goe1xcbiAgICAgICAgICBza2V5OiBza2V5LFxcbiAgICAgICAgICBpZDogaWQsXFxuICAgICAgICAgIHRpdGxlOiB2YWx1ZS50aXRsZSxcXG4gICAgICAgICAgcGFnZTogdmFsdWUucGFnZSxcXG4gICAgICAgIH0pXFxuICAgICAgICBzYXZlRmlsZShuYW1lLCBKU09OLnN0cmluZ2lmeShqc29uKSwgMCk7XFxuICAgICAgfVxcbiAgICB9XFxuICB9XFxuXFxuICAvL+aWueazlVxcbiAgZnVuY3Rpb24gZm9udHN0eWxlKHRleHQsIHBhcmFtcykge1xcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwgdW5kZWZpbmVkO1xcbiAgICB2YXIgaCA9IHBhcmFtcy5oICE9PSBmYWxzZSA/ICfigJzigJzigJ3igJ0nIDogJyc7XFxuICAgIHZhciB0YWdzID0gcGFyYW1zLnRhZ3MgfHwgXFxcIlxcXCI7XFxuICAgIGlmIChwYXJhbXMuYyAhPSB1bmRlZmluZWQpIHtcXG4gICAgICB0ZXh0ID0gdGV4dC5mb250Y29sb3IocGFyYW1zLmMpO1xcbiAgICB9XFxuICAgIGlmICh0YWdzKSB7XFxuICAgICAgdmFyIHRhZ0FycmF5ID0gdGFncy5zcGxpdCgnfCcpLmZpbHRlcihlID0+IGUpO1xcbiAgICAgIHZhciBvcGVuVGFncyA9ICcnO1xcbiAgICAgIHZhciBjbG9zZVRhZ3MgPSAnJztcXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhZ0FycmF5Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBvcGVuVGFncyArPSAnPCcgKyB0YWdBcnJheVtpXSArICc+JztcXG4gICAgICAgIGNsb3NlVGFncyA9ICc8LycgKyB0YWdBcnJheVtpXSArICc+JyArIGNsb3NlVGFncztcXG4gICAgICB9XFxuICAgICAgdGV4dCA9IG9wZW5UYWdzICsgdGV4dCArIGNsb3NlVGFncztcXG4gICAgfVxcbiAgICByZXR1cm4gaCArIHRleHQ7XFxuICB9XFxuXFxuICBmdW5jdGlvbiBmaW5kTG9uZ2VzdEVsZW1lbnQoYXJyKSB7XFxuICAgIHJldHVybiBhcnIucmVkdWNlKChhLCBiKSA9PiBhLmxlbmd0aCA+IGIubGVuZ3RoID8gYSA6IGIpO1xcbiAgfVxcblxcbiAgZnVuY3Rpb24gY291bnRUb3RhbEJ5dGVzKHRleHQpIHtcXG4gICAgdmFyIGNvdW50ID0gMDtcXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgdmFyIGNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XFxuICAgICAgaWYgKGNvZGUgPj0gMHgwMTAwKSB7IC8vIOWPjOWtl+iKguWtl+espueahCBVbmljb2RlIOe8lueggeWkp+S6jiAyNTVcXG4gICAgICAgIGNvdW50ICs9IDI7IC8vIOWPjOWtl+iKguWtl+espuiuoeaVsOS4ujJcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgY291bnQgKz0gMTsgLy8g5Y2V5a2X6IqC5a2X56ym6K6h5pWw5Li6MVxcbiAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gY291bnQ7XFxuICB9XFxuXFxuICBmdW5jdGlvbiBjYWNoZVNob3dUaXBzKCkge1xcbiAgICAvKmlmIChzdG9yYWdlMC5nZXRNeVZhcihpZCArIFxcXCJlcmluZm9cXFwiKSkge1xcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6IGZvbnRzdHlsZShcXFwi5b2T5YmN5Li657yT5a2YLOeCueaIkeWIt+aWsFxcXCIsIHtcXG4gICAgICBjOiBcXFwiZ3JleVxcXCIsXFxuICAgICAgdGFnczogXFxcInNtYWxsXFxcIlxcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpZCkgPT4ge1xcbiAgICAgIGNsZWFyTXlWYXIoaWQgKyBcXFwiZXJpbmZvXFxcIilcXG4gICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgaWQpLFxcbiAgICBleHRyYToge1xcbiAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxuICB9KVxcbiAgICB9Ki9cXG4gIH1cXG5cXG4gIGZ1bmN0aW9uIHN1YnN0cihzdHIsIG1heExlbmd0aCkge1xcbiAgICBsZXQgbGVuID0gMDtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcXG4gICAgICBpZiAoc3RyLmNoYXJDb2RlQXQoaSkgPiAyNTUpIHtcXG4gICAgICAgIGxlbiArPSAyO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBsZW4rKztcXG4gICAgICB9XFxuICAgICAgaWYgKGxlbiA+IG1heExlbmd0aCkge1xcbiAgICAgICAgcmV0dXJuIHN0ci5zbGljZSgwLCBpKSArICcuLi4nO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gc3RyO1xcbiAgfVxcblxcbiAgZnVuY3Rpb24gc2V0RGVzYyhkZXNjLCBudW0pIHtcXG4gICAgaWYgKGRlc2MgPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgcmV0dXJuO1xcbiAgICB9XFxuICAgIGRlc2MgPSBkZXNjLmNvbnN0cnVjdG9yID09IEFycmF5ID8gZGVzYy5qb2luKCc8YnI+JykgOiBkZXNjO1xcbiAgICBpZiAoZGVzYy5yZXBsYWNlKC8oPGJyPnxcXFxccyspL2csICcnKS5sZW5ndGggPT0gMCkge1xcbiAgICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogJ2JpZ19ibGFua19ibG9jaydcXG4gICAgICB9KVxcbiAgICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogJ2JpZ19ibGFua19ibG9jaydcXG4gICAgICB9KVxcbiAgICAgIHJldHVybjtcXG4gICAgfVxcblxcbiAgICBjb25zdCBtYXJrID0gJ2Rlc2MnO1xcbiAgICBudW0gPSB0eXBlb2YgKG51bSkgPT0gJ3VuZGVmaW5lZCcgPyAxMDAgOiBudW1cXG4gICAgZGVzYyA9IGRlc2Muc3RhcnRzV2l0aCgn44CA44CAJykgPyBkZXNjIDogJ+OAgOOAgCcgKyBkZXNjO1xcbiAgICBkZXNjID0gZGVzYy5yZXBsYWNlKC8nL2csIFxcXCImIzM5O1xcXCIpO1xcbiAgICBkZXNjID0gZGVzYy5yZXBsYWNlKC9cXFxcclxcXFxuL2csIFxcXCI8YnI+XFxcIik7XFxuICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UoL1xcXFxuL2csIFxcXCI8YnI+XFxcIik7XFxuICAgIGxldCBzZGVzYyA9IHN1YnN0cihkZXNjLCBudW0pO1xcblxcbiAgICB2YXIgY29sb3JzID0ge1xcbiAgICAgIHNob3c6IFxcXCJibGFja1xcXCIsXFxuICAgICAgaGlkZTogXFxcImdyZXlcXFwiXFxuICAgIH1cXG5cXG4gICAgdmFyIGxhenkgPSAkKGAjbm9Mb2FkaW5nI2ApLmxhenlSdWxlKChkYywgc2RjLCBtLCBjcykgPT4ge1xcbiAgICAgIHZhciBzaG93ID0gc3RvcmFnZTAuZ2V0SXRlbShtLCAnMCcpO1xcbiAgICAgIHZhciB0aXRsZSA9IGZpbmRJdGVtKCdkZXNjJykudGl0bGU7XFxuICAgICAgdmFyIHJlID0gLyg8XFxcXC9zbWFsbD48YnI+Lio/PikuKy9nO1xcbiAgICAgIHZhciBleHAgPSAn5bGV5byAOic7XFxuICAgICAgdmFyIHJldCA9ICfmlLbotbc6JztcXG4gICAgICBpZiAoc2hvdyA9PSAnMScpIHtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oJ2Rlc2MnLCB7XFxuICAgICAgICAgIHRpdGxlOiB0aXRsZVxcbiAgICAgICAgICAgIC5yZXBsYWNlKHJldCwgZXhwKVxcbiAgICAgICAgICAgIC5yZXBsYWNlKHJlLCAnJDEnICsgc2RjICsgJzwvc21hbGw+JylcXG4gICAgICAgICAgICAucmVwbGFjZSgvKDxcXFxcL3NtYWxsPjxicj5cXFxcPGZvbnQgY29sb3I9XFxcIikuKj8oXFxcIj4pLywgJyQxJyArIGNzLmhpZGUgKyAnJDInKVxcblxcbiAgICAgICAgfSlcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0obSwgJzAnKTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgdXBkYXRlSXRlbSgnZGVzYycsIHtcXG4gICAgICAgICAgdGl0bGU6IHRpdGxlXFxuICAgICAgICAgICAgLnJlcGxhY2UoZXhwLCByZXQpXFxuICAgICAgICAgICAgLnJlcGxhY2UocmUsICckMScgKyBkYyArICc8L3NtYWxsPicpXFxuICAgICAgICAgICAgLnJlcGxhY2UoLyg8XFxcXC9zbWFsbD48YnI+XFxcXDxmb250IGNvbG9yPVxcXCIpLio/KFxcXCI+KS8sICckMScgKyBjcy5zaG93ICsgJyQyJylcXG4gICAgICAgIH0pXFxuICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKG0sICcxJyk7XFxuICAgICAgfVxcbiAgICAgIHJldHVybiBgaGlrZXI6Ly9lbXB0eWBcXG4gICAgfSwgZGVzYywgc2Rlc2MsIG1hcmssIGNvbG9ycylcXG4gICAgdmFyIHNjID0gc3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpID09ICcwJyA/ICflsZXlvIA6JyA6ICfmlLbotbc6JztcXG4gICAgdmFyIGRjID0gc3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpID09ICcwJyA/IHNkZXNjIDogZGVzYztcXG4gICAgdmFyIGNzID0gc3RvcmFnZTAuZ2V0SXRlbShtYXJrLCAnMCcpID09ICcwJyA/IGNvbG9ycy5oaWRlIDogY29sb3JzLnNob3c7XFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6ICcnICsgJzxiPjxmb250IGNvbG9yPVxcXCIjMDk4QUMxXFxcIj7iiLfliafmg4XnroDku4tcXHQ8L2ZvbnQ+PC9iPicgKyBcXFwiPHNtYWxsPjxhIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG5vbmU7JyBocmVmPSdcXFwiICsgbGF6eSArIFxcXCInPlxcXCIgKyBzYyArICc8L2E+PC9zbWFsbD48YnI+PGZvbnQgY29sb3I9XFxcIicgKyBjcyArICdcXFwiPicgKyBgJHtkY31gICsgJzwvc21hbGw+JyxcXG4gICAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiAnZGVzYycsXFxuICAgICAgICBsaW5lU3BhY2luZzogNixcXG4gICAgICAgIHRleHRTaXplOiAxNSxcXG4gICAgICAgIGxpbmVWaXNpYmxlOiB0cnVlLFxcbiAgICAgIH1cXG4gICAgfSlcXG4gIH1cXG5cXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCAnU3BsaXQnLCB7XFxuICAgIHZhbHVlOiBmdW5jdGlvbiAocywgZSkge1xcbiAgICAgIGlmIChlKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5zcGxpdChzKS5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSAnJyk7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KHMpO1xcbiAgICAgIH1cXG4gICAgfSxcXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXFxuICB9KTtcXG5cXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFycmF5LnByb3RvdHlwZSwge1xcbiAgICBleGNsdWRlS2V5czoge1xcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoa2V5cywgZXhjbHVkZSwgcmVuYW1lQ2FsbGJhY2spIHtcXG4gICAgICAgIC8vIOehruWumuaYr+aOkumZpOi/mOaYr+WPquS/neeVmemUrlxcbiAgICAgICAgY29uc3Qgc2hvdWxkRXhjbHVkZSA9IHR5cGVvZiBleGNsdWRlID09PSAnYm9vbGVhbicgPyBleGNsdWRlIDogdHJ1ZTtcXG4gICAgICAgIGNvbnN0IGtleXNUb0hhbmRsZSA9IEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW107XFxuXFxuICAgICAgICAvLyDkvb/nlKhBcnJheS5wcm90b3R5cGUubWFw6YGN5Y6G5pWw57uE5Lit55qE5q+P5Liq5YWD57SgXFxuICAgICAgICByZXR1cm4gdGhpcy5tYXAoaXRlbSA9PiB7XFxuICAgICAgICAgIC8vIOWmguaenOWFg+e0oOaYr+S4gOS4quaVsOe7hO+8jOmAkuW9kuiwg+eUqGV4Y2x1ZGVLZXlzXFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZXhjbHVkZUtleXMoZXhjbHVkZSwga2V5cywgcmVuYW1lQ2FsbGJhY2spO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICE9PSBudWxsKSB7XFxuICAgICAgICAgICAgLy8g5aaC5p6c5YWD57Sg5piv5LiA5Liq5a+56LGh77yM5L2/55SoT2JqZWN0LmZyb21FbnRyaWVz5ZKMT2JqZWN0LmVudHJpZXPmnaXlpITnkIbplK5cXG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoaXRlbSk7XFxuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRW50cmllcyA9IGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcXG4gICAgICAgICAgICAgIC8vIOWmguaenOaciemHjeWRveWQjeWbnuiwg+WHveaVsO+8jOWImeiwg+eUqOWug1xcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZW5hbWVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gW3JlbmFtZUNhbGxiYWNrKGtleSwgdmFsdWUpLCB2YWx1ZV07XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRW50cmllcyA9IHNob3VsZEV4Y2x1ZGUgP1xcbiAgICAgICAgICAgICAgcHJvY2Vzc2VkRW50cmllcy5maWx0ZXIoKFtrZXldKSA9PiAha2V5c1RvSGFuZGxlLmluY2x1ZGVzKGtleSkpIDpcXG4gICAgICAgICAgICAgIHByb2Nlc3NlZEVudHJpZXMuZmlsdGVyKChba2V5XSkgPT4ga2V5c1RvSGFuZGxlLmluY2x1ZGVzKGtleSkpO1xcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZmlsdGVyZWRFbnRyaWVzKTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAvLyDlpoLmnpzlhYPntKDkuI3mmK/lr7nosaHmiJbmlbDnu4TvvIznm7TmjqXov5Tlm55cXG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgfSxcXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSwgLy8g6K6+572u5Li65LiN5Y+v5p6a5Li+XFxuICAgIH0sXFxuICAgIHRyYW5zZm9ybUtleXM6IHtcXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gKGtleU1hcHBpbmcpIHtcXG4gICAgICAgIC8vIOS9v+eUqEFycmF5LnByb3RvdHlwZS5tYXDpgY3ljobmlbDnu4TkuK3nmoTmr4/kuKrlhYPntKBcXG4gICAgICAgIHJldHVybiB0aGlzLm1hcChpdGVtID0+IHtcXG4gICAgICAgICAgLy8g5aaC5p6c5YWD57Sg5piv5LiA5Liq5pWw57uE77yM6YCS5b2S6LCD55SodHJhbnNmb3JtS2V5c1xcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xcbiAgICAgICAgICAgIHJldHVybiBpdGVtLnRyYW5zZm9ybUtleXMoa2V5TWFwcGluZyk7XFxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gIT09IG51bGwpIHtcXG4gICAgICAgICAgICAvLyDlpoLmnpzlhYPntKDmmK/kuIDkuKrlr7nosaHvvIzkvb/nlKhPYmplY3QuZnJvbUVudHJpZXPlkoxPYmplY3QuZW50cmllc+adpeWkhOeQhumUrlxcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhpdGVtKTtcXG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZEVudHJpZXMgPSBlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XFxuICAgICAgICAgICAgICBjb25zdCBuZXdLZXkgPSBrZXlNYXBwaW5nW2tleV0gfHwga2V5OyAvLyDlpoLmnpzplK7lnKjmmKDlsITkuK3vvIzkvb/nlKjmlrDplK7vvJvlkKbliJnkvb/nlKjljp/lp4vplK5cXG4gICAgICAgICAgICAgIHJldHVybiBbbmV3S2V5LCB2YWx1ZV07XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh0cmFuc2Zvcm1lZEVudHJpZXMpO1xcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIC8vIOWmguaenOWFg+e0oOS4jeaYr+WvueixoeaIluaVsOe7hO+8jOebtOaOpei/lOWbnlxcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICB9LFxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLCAvLyDorr7nva7kuLrkuI3lj6/mnprkuL5cXG4gICAgfVxcbiAgfSk7XFxuXFxuICBsZXQgc29ydG9iaiA9IFtcXG4gICAgZm9udHN0eWxlKFxcXCLmraPluo9cXFwiLCB7XFxuICAgICAgYzogXFxcIiMxQUFEMTlcXFwiLFxcbiAgICAgIHRhZ3M6IFxcXCJiXFxcIlxcbiAgICB9KSxcXG4gICAgZm9udHN0eWxlKFxcXCLpgIbluo9cXFwiLCB7XFxuICAgICAgYzogXFxcIiNGRjAwMDBcXFwiLFxcbiAgICAgIHRhZ3M6IFxcXCJiXFxcIlxcbiAgICB9KVxcbiAgXVxcbiAgLy/mlrnms5VcXG5cXG4gIHZhciBzb3J0aSA9IGdldE15VmFyKFxcXCJzb3J0aVxcXCIsIFxcXCIwXFxcIik7XFxuXFxuICAvL2xvZyhzb3J0b2JqKVxcbiAgJC5leHRlbmQoe1xcbiAgICBzcGxpdFBhZ2UodG90YWxJdGVtcywgcGFnZVNpemUpIHtcXG4gICAgICBwYWdlU2l6ZSA9IE51bWJlcihwYWdlU2l6ZSkgfHwgNTA7XFxuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xcbiAgICAgIGlmIChwYWdlU2l6ZSA9PSAwKSB7XFxuICAgICAgICByZXR1cm4gW2AxLSR7dG90YWxJdGVtc31gXVxcbiAgICAgIH1cXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0b3RhbEl0ZW1zOyBpICs9IHBhZ2VTaXplKSB7XFxuICAgICAgICBsZXQgZW5kID0gaSArIHBhZ2VTaXplIC0gMTtcXG4gICAgICAgIGlmIChlbmQgPiB0b3RhbEl0ZW1zKSB7XFxuICAgICAgICAgIGVuZCA9IHRvdGFsSXRlbXM7XFxuICAgICAgICB9XFxuICAgICAgICByZXN1bHQucHVzaChgJHtpfS0ke2VuZH1gKTtcXG4gICAgICB9XFxuICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgc3BsaXRBcnJheUJ5UmFuZ2VzKGFycmF5LCByYW5nZXMpIHtcXG4gICAgICAvLyDmoLnmja7ojIPlm7Tmi4bliIbmlbDnu4RcXG4gICAgICB2YXIgcmVzdWx0ID0gcmFuZ2VzLm1hcChmdW5jdGlvbiAocmFuZ2UpIHtcXG4gICAgICAgIHZhciBwYXJ0cyA9IHJhbmdlLnNwbGl0KCctJykubWFwKE51bWJlcik7XFxuICAgICAgICB2YXIgc3RhcnQgPSBwYXJ0c1swXSAtIDE7IC8vIOWHjzHmmK/lm6DkuLrmlbDnu4TntKLlvJXku44w5byA5aeLXFxuICAgICAgICB2YXIgZW5kID0gcGFydHNbMV0gLSAxO1xcbiAgICAgICAgLy8g5L2/55SoQXJyYXkucHJvdG90eXBlLnNsaWNl5p2l6I635Y+W5a2Q5pWw57uEXFxuICAgICAgICByZXR1cm4gYXJyYXkuc2xpY2Uoc3RhcnQsIGVuZCArIDEpOyAvLyDljIXmi6znu5PmnZ/ntKLlvJXvvIzmiYDku6XliqAxXFxuICAgICAgfSk7XFxuICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gIH0pXFxuXFxuICBsZXQgc291cmNlID0ge307XFxuICBpZiAoTVlfUEFSQU1TLnNvdXJjZSkge1xcbiAgICBzb3VyY2UgPSBNWV9QQVJBTVMuc291cmNlO1xcbiAgfSBlbHNlIHtcXG4gICAgY29uc3QgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmZpbmRTb3VyY2UoTVlfUEFSQU1TLnNrZXkpO1xcbiAgICBNWV9QQVJBTVMuc291cmNlID0gc291cmNlO1xcbiAgICBzZXRQYWdlUGFyYW1zKE1ZX1BBUkFNUyk7XFxuICB9XFxuXFxuICBjb25zdCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuXFxuICBEcnB5TWFuYWdlLmluaXRQYWdlKFxcXCJlclxcXCIpO1xcblxcbiAgbGV0IGRycHkgPSBEcnB5TWFuYWdlLmdldEJ5U291cmNlKHNvdXJjZSk7XFxuICBsZXQgc3R5cGUgPSBkcnB5LmdldFJ1bGUoXFxcIuexu+Wei1xcXCIpO1xcbiAgLypcXG5sZXQgaW5mbyA9IHN0b3JhZ2UwLmdldE15VmFyKGlkICsgXFxcImVyaW5mb1xcXCIsIFxcXCJcXFwiKTtcXG5cXG5pZiAoaW5mbyA9PSBcXFwiXFxcIikge1xcbiAgaW5mbyA9IEpTT04ucGFyc2UoZHJweS5kZXRhaWwoU3RyaW5nKGlkKSkpLmxpc3RbMF07XFxuICAgIHN0b3JhZ2UwLnB1dE15VmFyKGlkICsgXFxcImVyaW5mb1xcXCIsIGluZm8pXFxuICB9XFxuICAqL1xcbiAgbGV0IGluZm8gPSBKU09OLnBhcnNlKGRycHkuZGV0YWlsKFN0cmluZyhpZCkpKS5saXN0WzBdO1xcbiAgbGV0IFvlr7zmvJQsIOS4u+a8lF0gPSBbaW5mby52b2RfZGlyZWN0b3IsIGluZm8udm9kX2FjdG9yXVxcbiAgaWYgKE1ZX1BBUkFNUy5pbWcgPT0gdW5kZWZpbmVkIHx8IE1ZX1BBUkFNUy5pbWcgPT0gXFxcIlxcXCIpIHtcXG4gICAgaWYgKGluZm8udm9kX3BpYyAhPSBcXFwiXFxcIikge1xcbiAgICAgIHNldFBhZ2VQaWNVcmwoaW5mby52b2RfcGljKVxcbiAgICB9XFxuICB9XFxuXFxuICBpZiAo5a+85ryUICE9IHVuZGVmaW5lZCAmJiDlr7zmvJQgIT0gXFxcIlxcXCIpIHtcXG4gICAg5a+85ryUID0g5a+85ryULlNwbGl0KC9cXFxcLy9nLCB0cnVlKS5qb2luKFxcXCIgXFxcIik7XFxuICAgIOWvvOa8lCA9IC9bOu+8ml0vLnRlc3Qo5a+85ryUKSA/IOWvvOa8lCA6IFxcXCLlr7zmvJQ6XFxcIiArIOWvvOa8lFxcbiAgfVxcbiAgaWYgKOS4u+a8lCAhPSB1bmRlZmluZWQgJiYg5Li75ryUICE9IFxcXCJcXFwiKSB7XFxuICAgIOS4u+a8lCA9IOS4u+a8lC5TcGxpdCgvXFxcXC8vZywgdHJ1ZSkuam9pbihcXFwiIFxcXCIpO1xcbiAgICDkuLvmvJQgPSAvWzrvvJpdLy50ZXN0KOS4u+a8lCkgPyDkuLvmvJQgOiBcXFwi5Li75ryUOlxcXCIgKyDkuLvmvJRcXG4gIH1cXG4gIGxldCBb5ZCN56ewLCDlpIfms6hdID0gW2luZm8udm9kX25hbWUsIGluZm8udm9kX3JlbWFya3NdXFxuICBpZiAo5aSH5rOoICE9IHVuZGVmaW5lZCAmJiDlpIfms6ggIT0gXFxcIlxcXCIpIHtcXG4gICAg5aSH5rOoID0g5aSH5rOoLlNwbGl0KC9cXFxcLy9nLCB0cnVlKS5qb2luKFxcXCIgXFxcIik7XFxuICAgIOWkh+azqCA9IC9bOu+8ml0vLnRlc3Qo5aSH5rOoKSA/IOWkh+azqCA6IFxcXCLlpIfms6g6XFxcIiArIOWkh+azqDtcXG4gIH1cXG4gIGxldCB0aXRsZXMgPSBb5ZCN56ewLCDlpIfms6hdO1xcbiAgbGV0IGRlc2NzID0gW+WvvOa8lCwg5Li75ryULCBpbmZvLnZvZF9hcmVhLCBpbmZvLnZvZF95ZWFyXVxcblxcbiAgbGV0IGQgPSBbXTtcXG4gIGQucHVzaCh7XFxuICAgIHRpdGxlOiB0aXRsZXMuZmlsdGVyKGUgPT4gZSkubWFwKCh4LCBpKSA9PiBpID09IDEgPyBmb250c3R5bGUoeCwge1xcbiAgICAgIHRhZ3M6IFxcXCJzbWFsbFxcXCJcXG4gICAgfSkgOiB4KS5qb2luKFxcXCJcXFxcblxcXCIpLFxcbiAgICBkZXNjOiBkZXNjcy5maWx0ZXIoZSA9PiBlKS5qb2luKFxcXCJcXFxcblxcXCIpLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgcGljX3VybDogaW5mby52b2RfcGljIHx8IE1ZX1BBUkFNUy5pbWcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgZ3JhZGllbnQ6IGZhbHNlLFxcbiAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgIHRpdGxlOiBcXFwi5LqM57qn6K6+572uXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvVUlNYW5hZ2U/bW9kZT3kuoznuqcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICAgIH0pXFxuICAgICAgfV1cXG4gICAgfVxcbiAgfSk7XFxuICBkLnB1c2goe1xcbiAgICB0aXRsZTogJ+aVsOaNruadpea6kDonICsgTVlfUEFSQU1TLnNuYW1lLFxcbiAgICAvL2Rlc2M6XFxcIlxcXCIrTVlfUEFSQU1TLnNrZXkrXFxcIlxcXFx0XFxcIixcXG4gICAgaW1nOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tZXNzeS83OC5zdmdcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiXFxuICB9KVxcbiAgc2V0RGVzYyhpbmZvLnZvZF9jb250ZW50KVxcblxcbiAgbGV0IGZyb20gPSBbXTtcXG4gIGlmIChpbmZvLnZvZF9wbGF5X2Zyb20gIT0gdW5kZWZpbmVkKSB7XFxuICAgIGZyb20gPSBpbmZvLnZvZF9wbGF5X2Zyb20uc3BsaXQoXFxcIiQkJFxcXCIpO1xcbiAgfVxcblxcbiAgbGV0IHBsYXlMYXp5ID0gJChcXFwiXFxcIikubGF6eVJ1bGUoKGlkLCBzb3VyY2UpID0+IHtcXG4gICAgcmV0dXJuICQucmVxdWlyZShcXFwidmlkZW9VcmxcXFwiKS5wYXJzZShpbnB1dCwgaWQsIHNvdXJjZSk7XFxuICB9LCBcXFwiaWRcXFwiLCBzb3VyY2UpO1xcblxcbiAgbGV0IHBhZ2VzemllID0gZXIu5YiG6aG1O1xcblxcbiAgbGV0IHBsYXlVcmxMaXN0ID0gW107XFxuICAvL2NvbnNvbGUubG9nKGluZm8udm9kX3BsYXlfdXJsKTtcXG4gIGxldCBpc05vdmVsID0gc3R5cGUgPT09IFxcXCLlsI/or7RcXFwiO1xcbiAgbGV0IHBsYXlwYWdlcyA9IFtdO1xcbiAgaWYgKGluZm8udm9kX3BsYXlfdXJsICYmIGluZm8udm9kX3BsYXlfdXJsICE9IFxcXCJcXFwiKSB7XFxuICAgIGxldCBjb2wgPSBcXFwidGV4dF80XFxcIjtcXG4gICAgbGV0IHRleHRhbGlnbiA9IFxcXCJcXFwiO1xcbiAgICBwbGF5VXJsTGlzdCA9IGluZm8udm9kX3BsYXlfdXJsLnNwbGl0KFxcXCIkJCRcXFwiKS5tYXAoKHQsIGkpID0+IHtcXG4gICAgICBsZXQgaW1nID0gXFxcIlxcXCI7XFxuICAgICAgbGV0IHRzID0gdC5zcGxpdChcXFwiI1xcXCIpLm1hcCgoaykgPT4gay5zcGxpdChcXFwiJFxcXCIpWzBdKTtcXG4gICAgICBsZXQgcGFnZXMgPSAkLnNwbGl0UGFnZSh0cy5sZW5ndGgsIHBhZ2VzemllKTtcXG4gICAgICBsZXQgdGMgPSBjb3VudFRvdGFsQnl0ZXMoZmluZExvbmdlc3RFbGVtZW50KHRzKSk7XFxuICAgICAgaWYgKHRzLmZpbHRlcihlID0+IGUgIT0gXFxcIlxcXCIpLmxlbmd0aCkge1xcbiAgICAgICAgcGxheXBhZ2VzW2ldID0gcGFnZXM7XFxuICAgICAgfVxcbiAgICAgIGlmICh0YyA+IDI0KSB7XFxuICAgICAgICBjb2wgPSBcXFwidGV4dF8xXFxcIjtcXG4gICAgICAgIGltZyA9IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL21vdmllLzE0Ni5zdmdcXFwiO1xcbiAgICAgIH0gZWxzZSBpZiAodGMgPj0gMTIgJiYgdGMgPCAxNSkge1xcbiAgICAgICAgY29sID0gXFxcInRleHRfM1xcXCI7XFxuICAgICAgfSBlbHNlIGlmICh0YyA+PSAxNSkge1xcbiAgICAgICAgY29sID0gXFxcInRleHRfMlxcXCI7XFxuICAgICAgICB0ZXh0YWxpZ24gPSBcXFwibGVmdFxcXCI7XFxuICAgICAgfVxcbiAgICAgIGxldCBwbGF5b2JqID0gdC5zcGxpdChcXFwiI1xcXCIpLm1hcCgoaikgPT4ge1xcbiAgICAgICAgbGV0IGsgPSBqLnNwbGl0KFxcXCIkXFxcIik7XFxuICAgICAgICBsZXQgdCA9IGtbMF07XFxuICAgICAgICBsZXQgdWlkID0gKGtbMV0gfHwga1swXSk7XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICBzdGl0bGU6IHQsXFxuICAgICAgICAgIHRpdGxlOiBmb250c3R5bGUodCwge1xcbiAgICAgICAgICAgIHRhZ3M6IFxcXCJzbWFsbFxcXCJcXG4gICAgICAgICAgfSksXFxuICAgICAgICAgIHN1cmw6IHVpZCArIFxcXCIjXFxcIiArIGZyb21baV0sXFxuICAgICAgICAgIHVybDogaXNOb3ZlbCA/IFxcXCJoaWtlcjovL3BhZ2Uvbm92ZWwjYXV0b1BhZ2UjI3JlYWRUaGVtZSNcXFwiIDogKHVpZCArIFxcXCIjXFxcIiArIGZyb21baV0gKyBwbGF5TGF6eS5yZXBsYWNlKCdcXFwiaWRcXFwiJywgJ1xcXCInICsgdWlkICsgJ1xcXCInKSksXFxuICAgICAgICAgIGNvbF90eXBlOiBjb2wsXFxuICAgICAgICAgIGltZzogaW1nLFxcbiAgICAgICAgICAvKmV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCBleHRyYSwge1xcbiAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogZGVjb2RlVVJJQ29tcG9uZW50KGtbMV0pLFxcbiAgICAgICAgICAgIGlkOiBrWzFdLFxcbiAgICAgICAgICAgIC8vbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIHRleHRBbGlnbjogdGV4dGFsaWduLFxcbiAgICAgICAgICAgIGNsczogXFxcInBsYXlsaXN0XFxcIixcXG4gICAgICAgICAgfSkqL1xcbiAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGZyb206IGZyb21baV0sXFxuICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXFxuICAgICAgICAgICAgaWQ6IHVpZCxcXG4gICAgICAgICAgICBibG9ja1J1bGVzOiBbJ2JiLioucG5nJywgJy5qcGcnLCBcXFwiaG1cXFxcLmJhaWR1XFxcXC5jb21cXFxcL2htLmpzXFxcIl0sXFxuICAgICAgICAgICAgdmlkZW9FeGNsdWRlUnVsZXM6IFsnP3VybD0nXSxcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgdGV4dEFsaWduOiB0ZXh0YWxpZ24sXFxuICAgICAgICAgICAgY2xzOiBcXFwicGxheWxpc3RcXFwiLFxcbiAgICAgICAgICB9XFxuICAgICAgICB9O1xcbiAgICAgIH0pO1xcblxcbiAgICAgIGlmIChzdHlwZSA9PSBcXFwi5ryr55S7XFxcIiB8fCBzdHlwZSA9PSBcXFwi5bCP6K+0XFxcIikge1xcblxcbiAgICAgICAgdmFyIGRvd25sb2FkbGF6eSA9ICQudG9TdHJpbmcoKGtleSwgc2tleSwgdGl0bGUpID0+IHtcXG4gICAgICAgICAgbGV0IHtcXG4gICAgICAgICAgICBHTVxcbiAgICAgICAgICB9ID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTE2JmF1dGg9MWQzNWU4ZjAtMjJlOC01MjcwLWE5ZDEtODI2ZjUzZjE3N2FkXFxcIik7XFxuICAgICAgICAgIEdNLnNldFNlbGZLZXkoa2V5KTtcXG4gICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiLCBcXFwiRHJweU1hbmFnZT9ydWxlPVxcXCIgKyB0aXRsZSk7XFxuICAgICAgICAgIGxldCBkcnB5ID0gRHJweU1hbmFnZS5nZXQoc2tleSk7XFxuICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3BsaXQoXFxcIiNcXFwiKTtcXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoZHJweS5wbGF5KGlucHV0WzFdLCBpbnB1dFswXSkpO1xcbiAgICAgICAgICBpZiAocmVzdWx0LnVybC5zdGFydHNXaXRoKFxcXCJwaWNzOi8vXFxcIikpIHJldHVybiByZXN1bHQudXJsO1xcbiAgICAgICAgICBlbHNlIGlmIChyZXN1bHQudXJsLnN0YXJ0c1dpdGgoXFxcIm5vdmVsOi8vXFxcIikpIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdC51cmwucmVwbGFjZShcXFwibm92ZWw6Ly9cXFwiLCBcXFwiXFxcIikpLmNvbnRlbnQ7XFxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5ryr55S75oiW5q2j5paH6I635Y+W5aSx6LSlXFxcIik7XFxuICAgICAgICB9LCBHTS5nZXRTZWxmS2V5KCksIE1ZX1BBUkFNUy5za2V5LCBNWV9SVUxFLnRpdGxlKTtcXG5cXG4gICAgICAgIGxldCBjaGFwdGVyTGlzdCA9IHBsYXlvYmouZXhjbHVkZUtleXMoW1xcXCJzdXJsXFxcIiwgXFxcInN0aXRsZVxcXCJdLCBmYWxzZSkudHJhbnNmb3JtS2V5cyh7XFxuICAgICAgICAgIFxcXCJzdXJsXFxcIjogXFxcInVybFxcXCIsXFxuICAgICAgICAgIFxcXCJzdGl0bGVcXFwiOiBcXFwidGl0bGVcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvZHJfZG93X2xpc3QuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGNoYXB0ZXJMaXN0KSk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICB0aXRsZTogXFxcIuS4i+i9vVxcXCIgKyBzdHlwZSxcXG4gICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2Rvd25sb2FkLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub1JlZnJlc2gjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGJyxcXG4gICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBjaGFwdGVyTGlzdDogXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL2RyX2Rvd19saXN0Lmpzb25cXFwiLFxcbiAgICAgICAgICAgIGluZm86IHtcXG4gICAgICAgICAgICAgIGJvb2tOYW1lOiBpbmZvLnZvZF9uYW1lLCAvL+a8q+eUu+WQjeensCxcXG4gICAgICAgICAgICAgIHJ1bGVOYW1lOiBNWV9SVUxFLnRpdGxlLFxcbiAgICAgICAgICAgICAgYm9va1RvcFBpYzogaW5mby52b2RfcGljLFxcbiAgICAgICAgICAgICAgcGFyc2VDb2RlOiBkb3dubG9hZGxhenksXFxuICAgICAgICAgICAgICBib29rSWQ6IE1ZX1BBUkFNUy5zbmFtZSxcXG4gICAgICAgICAgICAgIHR5cGU6IHN0eXBlID09PSBcXFwi5ryr55S7XFxcIiA/IFxcXCJjb21pY1xcXCIgOiBcXFwibm92ZWxcXFwiLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgZGVmYXVsdFZpZXc6IFxcXCIxXFxcIlxcbiAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgIHRpdGxlOiBcXFwi5pys5Zyw5Lmm5p62XFxcIixcXG4gICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL0Jvb2tyYWNrLnZpZXcjbm9SZWNvcmRIaXN0b3J5Iz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhiZydWxlTmFtZT0nICsgTVlfUlVMRS50aXRsZSxcXG4gICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0eXBlOiBzdHlwZSA9PT0gXFxcIua8q+eUu1xcXCIgPyBcXFwiY29taWNcXFwiIDogXFxcIm5vdmVsXFxcIixcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSwge1xcbiAgICAgICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJ1xcbiAgICAgICAgfSk7XFxuICAgICAgfVxcblxcbiAgICAgIHBsYXlvYmogPSAkLnNwbGl0QXJyYXlCeVJhbmdlcyhwbGF5b2JqLCBwYWdlcyk7XFxuICAgICAgcmV0dXJuIHBsYXlvYmo7XFxuICAgIH0pO1xcbiAgfSBlbHNlIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogXFxcIuaaguaXoOaSreaUvua6kOaIluaSreaUvuWIl+ihqOWumuS9jemUmeivr1xcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICB1cmw6IE1ZX1BBUkFNUy52b2RJZCxcXG4gICAgfSk7XFxuICAgIGNhY2hlU2hvd1RpcHMoKTtcXG4gICAgc2V0UmVzdWx0KGQpO1xcbiAgfVxcblxcblxcbiAgbGV0IGN1cnJlbnRMb2NhdGlvbiA9IDA7XFxuXFxuICBmdW5jdGlvbiByZW5vdmF0ZUxpc3QobG9jYXRpb24pIHtcXG4gICAgLy9kZWxldGVJdGVtQnlDbHMoXFxcInBsYXlwYWdlXFxcIik7XFxuICAgIC8vZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5bGlzdFxcXCIpO1xcbiAgICBpZiAocGxheVVybExpc3QubGVuZ3RoID09IDApIHtcXG4gICAgICByZXR1cm47XFxuICAgIH1cXG4gICAgbGV0IGhpcyA9IGhpc3Rvcnlsb2coXFxcImdldFxcXCIsIE1ZX1BBUkFNUy5za2V5LCBtZDUoTVlfUEFSQU1TLnZvZElkKSk7XFxuICAgIGxldCBwYWdlbnVtID0gZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCAoaGlzIHx8IFxcXCIwXFxcIikpO1xcblxcbiAgICBsZXQgcGNvdW50ID0gcGxheVVybExpc3RbbG9jYXRpb25dLmxlbmd0aDtcXG4gICAgbGV0IGxpc3QgPSBwbGF5VXJsTGlzdFtsb2NhdGlvbl1bcGFnZW51bV07XFxuICAgIGlmICghbGlzdCkge1xcbiAgICAgIGZvciAobGV0IGkgPSBwYWdlbnVtOyBpID49IDA7IGktLSkge1xcbiAgICAgICAgbGlzdCA9IHBsYXlVcmxMaXN0W2xvY2F0aW9uXVtpXTtcXG4gICAgICAgIGlmIChsaXN0KSB7XFxuICAgICAgICAgIHBhZ2VudW0gPSBpO1xcbiAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgIH1cXG4gICAgaWYgKGdldE15VmFyKFxcXCJzb3J0aVxcXCIsIFxcXCIwXFxcIikgPT0gMSkge1xcbiAgICAgIGxpc3QucmV2ZXJzZSgpO1xcbiAgICB9XFxuICAgICQuZXh0ZW5kKHtcXG4gICAgICB0ZW1wX2xpc3Q6IHBsYXlVcmxMaXN0W2xvY2F0aW9uXSxcXG4gICAgfSlcXG4gICAgbGV0IHBsYXlwID0gcGxheXBhZ2VzW2xvY2F0aW9uXTtcXG4gICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5cGFnZVxcXCIpXFxuICAgIGlmIChwbGF5cCAmJiBwbGF5cC5sZW5ndGggPiAxKSB7XFxuICAgICAgaGlzdG9yeWxvZyhcXFwic2V0XFxcIiwgTVlfUEFSQU1TLnNrZXksIG1kNShNWV9QQVJBTVMudm9kSWQpLCB7IHRpdGxlOiBpbmZvLnZvZF9uYW1lLCBwYWdlOiBwYWdlbnVtLCBkYXRlOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSB9KTtcXG4gICAgICBsZXQgdGVtcCA9IHtcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGNsczogXFxcInBsYXlwYWdlXFxcIlxcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgICBsZXQgcGFnZWFyciA9IHBsYXlwLm1hcCgoeCwgaSkgPT4gaSA9PSBwYWdlbnVtID8gJ+KAnOKAnOKAneKAnScgKyB4LmZvbnRjb2xvcihcXFwicmVkXFxcIikgOiB4KTtcXG4gICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlwYWdlbGluZVxcXCIsIFt7XFxuICAgICAgICB0aXRsZTogJ+S4iuS4gOmhtScsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGxvY2F0aW9uLCBwY291bnQpID0+IHtcXG4gICAgICAgICAgbGV0IHBhZ2VudW0gPSBnZXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgIGlmIChwYWdlbnVtID09IDApIHtcXG4gICAgICAgICAgICBwYWdlbnVtID0gcGNvdW50IC0gMTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwYWdlbnVtLS07XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcocGFnZW51bSkpO1xcbiAgICAgICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgbG9jYXRpb24sIHBjb3VudCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogcGxheXBbcGFnZW51bV0sXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICB1cmw6ICQocGFnZWFyciwgMykuc2VsZWN0KChsb2NhdGlvbikgPT4ge1xcbiAgICAgICAgICBwdXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFN0cmluZyhNWV9JTkRFWCkpO1xcbiAgICAgICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBsb2NhdGlvbiksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogJ+S4i+S4gOmhtScsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGxvY2F0aW9uLCBwY291bnQpID0+IHtcXG4gICAgICAgICAgbGV0IHBhZ2VudW0gPSBnZXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgIGlmIChwYWdlbnVtID49IHBjb3VudCAtIDEpIHtcXG4gICAgICAgICAgICBwYWdlbnVtID0gMDtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwYWdlbnVtKys7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcocGFnZW51bSkpO1xcbiAgICAgICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgbG9jYXRpb24sIHBjb3VudCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9XSlcXG4gICAgICAvKnBsYXlwID0gcGxheXAubWFwKCh4LCBpKSA9PiB7XFxuICAgICAgICAgbGV0IG9iaiA9IE9iamVjdC5hc3NpZ24oe30sIHRlbXAsIHtcXG4gICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChwYWdlbnVtID09IGkgPyB4LmZvbnRjb2xvcihcXFwicmVkXFxcIikgOiB4KSxcXG4gICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcbiAgICAgICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiKSA9PSBpKSB7XFxuICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgU3RyaW5nKGkpKTtcXG4gICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5bGlzdFxcXCIpO1xcbiAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsICQudGVtcF9saXN0W2ldKTtcXG4gICAgICAgICAgICAgZmluZEl0ZW1zQnlDbHMoXFxcInBsYXlwYWdlXFxcIikuZm9yRWFjaCgoeCwgaWkpID0+IHtcXG4gICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB4LnRpdGxlLnJlcGxhY2UoL+KAmHzigJl84oCcfOKAnXw8W14+XSs+L2csIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICBpZiAoaWkgPT0gaSkge1xcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSAn4oCc4oCc4oCd4oCdJyArIHRpdGxlLmZvbnRjb2xvcihcXFwicmVkXFxcIik7XFxuICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oeC5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICB9LCBpKSxcXG4gICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCB0ZW1wLmV4dHJhLCB7XFxuICAgICAgICAgICAgIGlkOiBcXFwicGFnZW51bVxcXCIgKyBpLFxcbiAgICAgICAgICAgfSlcXG4gICAgICAgICB9KVxcbiAgICAgICAgIHJldHVybiBvYmo7XFxuICAgICAgIH0pXFxuICAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheXBhZ2VsaW5lXFxcIiwgcGxheXApKi9cXG4gICAgICAgXFxuICAgIH1cXG4gICAgaWYoZ2V0TXlWYXIoXFxcInBsYXlsaXN0X3JlYWR5XFxcIixcXFwiMFxcXCIpPT1cXFwiMVxcXCIpe1xcbiAgICAgIGxldCBvbGRJZHMgPSAoZmluZEl0ZW1zQnlDbHMoJ3BsYXlsaXN0JykgfHwgW10pLm1hcChpdCA9PiBpdC5leHRyYS5pZCk7XFxuICAgICAgbGV0IHRvRGVsZXRlSWRzID0gW107IC8v5b6F5Yig6Zmk55qE5penaWRcXG4gICAgICBsZXQgdG9BZGREYXRhcyA9IFtdOyAvL+W+heaWsOWinueahOaWsOaVsOaNrlxcbiAgICAgIGlmIChvbGRJZHMubGVuZ3RoID4gbGlzdC5sZW5ndGgpIHtcXG4gICAgICAgIHRvRGVsZXRlSWRzID0gb2xkSWRzLnNsaWNlKGxpc3QubGVuZ3RoKTtcXG4gICAgICB9IGVsc2UgaWYgKG9sZElkcy5sZW5ndGggPCBsaXN0Lmxlbmd0aCkge1xcbiAgICAgICAgdG9BZGREYXRhcyA9IGxpc3Quc2xpY2Uob2xkSWRzLmxlbmd0aClcXG4gICAgICB9XFxuICAgICAgbGV0IGNudCA9IE1hdGgubWluKG9sZElkcy5sZW5ndGgsIGxpc3QubGVuZ3RoKTtcXG4gICAgICBpZiAodG9EZWxldGVJZHMubGVuZ3RoID4gMCkge1xcbiAgICAgICAgLy/mnInliKDpmaTnmoTlhYjliKDpmaRcXG4gICAgICAgIGRlbGV0ZUl0ZW0odG9EZWxldGVJZHMpO1xcbiAgICAgIH1cXG4gICAgICBpZiAodG9BZGREYXRhcy5sZW5ndGggPiAwKSB7XFxuICAgICAgICAvL+acieaWsOWinueahOWFiOaWsOWinlxcbiAgICAgICAgYWRkSXRlbUFmdGVyKG9sZElkc1tjbnQgLSAxXSwgdG9BZGREYXRhcyk7XFxuICAgICAgfVxcbiAgICAgIC8vc2hvd0xvYWRpbmcoJ+WKoOi9veS4rScpXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbnQ7IGkrKykge1xcbiAgICAgICAgLy/mnIDlkI7pobrluo/mm7TmlrBcXG4gICAgICAgIHVwZGF0ZUl0ZW0ob2xkSWRzW2ldLCBsaXN0W2ldKTtcXG4gICAgICB9XFxuICAgIH0gZWxzZSB7XFxuICAgICAgLy9sb2cobGlzdC5sZW5ndGgpXFxuICAgICAgaWYgKGxpc3QpIHtcXG4gICAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheWxpc3RzXFxcIiwgbGlzdCk7XFxuICAgICAgICBwdXRNeVZhcihcXFwicGxheWxpc3RfcmVhZHlcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICB1cGRhdGVJdGVtKFxcXCJsb2NhdGlvbkBcXFwiICsgY3VycmVudExvY2F0aW9uLCB7XFxuICAgICAgdGl0bGU6IGZyb21bY3VycmVudExvY2F0aW9uXSxcXG4gICAgfSk7XFxuICAgIHVwZGF0ZUl0ZW0oXFxcImxvY2F0aW9uQFxcXCIgKyBsb2NhdGlvbiwge1xcbiAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIGZyb21bbG9jYXRpb25dICsgXFxcIuKAneKAnVxcXCIsXFxuICAgIH0pO1xcbiAgICBjdXJyZW50TG9jYXRpb24gPSBsb2NhdGlvbjtcXG4gIH1cXG5cXG4gIEdNLnB1dChcXFwicmVub3ZhdGVMaXN0XFxcIiwgcmVub3ZhdGVMaXN0KTtcXG4gIGQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiYmlnX2JsYW5rX2Jsb2NrXFxcIlxcbiAgfSk7XFxuICBpZiAoZnJvbS5sZW5ndGgpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICBjb2xfdHlwZTogXFxcImJpZ19ibGFua19ibG9ja1xcXCIsXFxuICAgIH0pXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IHNvcnRvYmpbc29ydGldLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc28pID0+IHtcXG4gICAgICAgIGxldCBzaSA9IGdldE15VmFyKFxcXCJzb3J0aVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICBsZXQgaWkgPSAoc2kgPT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcIkBzb3J0XFxcIiwge1xcbiAgICAgICAgICB0aXRsZTogc29baWldXFxuICAgICAgICB9KVxcbiAgICAgICAgdmFyIHBsYXlzID0gZmluZEl0ZW1zQnlDbHMoXFxcInBsYXlsaXN0XFxcIikucmV2ZXJzZSgpLm1hcCh4ID0+IHtcXG4gICAgICAgICAgeC5jb2xfdHlwZSA9IHgudHlwZTtcXG4gICAgICAgICAgcmV0dXJuIHg7XFxuICAgICAgICB9KTtcXG4gICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFwicGxheWxpc3RcXFwiKTtcXG4gICAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheWxpc3RzXFxcIiwgcGxheXMpO1xcblxcbiAgICAgICAgcHV0TXlWYXIoXFxcInNvcnRpXFxcIiwgaWkpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICB9LCBzb3J0b2JqKSxcXG4gICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogXFxcIkBzb3J0XFxcIixcXG4gICAgICB9XFxuICAgIH0pXFxuICAgIGZvciAobGV0IGkgaW4gZnJvbSkge1xcbiAgICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogZnJvbVtpXSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaSwgaWQpID0+IHtcXG4gICAgICAgICAgaWYgKGdldE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBcXFwiMFxcXCIpID09IGkpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHB1dE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBTdHJpbmcoaSkpO1xcbiAgICAgICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkoaSk7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBpLCBpZCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBpZDogXFxcImxvY2F0aW9uQFxcXCIgKyBpXFxuICAgICAgICB9LFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICAgIH0pO1xcbiAgICB9XFxuICB9XFxuICAvL2NvbnNvbGUubG9nKHBsYXlVcmxMaXN0KTtcXG4gIC8qaWYgKHBsYXlVcmxMaXN0Lmxlbmd0aCkge1xcbiAgICB2YXIgZWpvYmogPSB7XFxuICAgICAgXFxcImxpc3RcXFwiOiBwbGF5VXJsTGlzdCxcXG4gICAgICBcXFwidGFiXFxcIjogZnJvbS5tYXAoKHgsIGkpID0+IGZyb21baV0pXFxuICAgIH07XFxuICAgIOWIneWni+WMlihkLCBlam9iailcXG4gIH0gZWxzZSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IFxcXCLmmoLml6Dmkq3mlL7mupBcXFwiLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG4gICAgICB1cmw6IE1ZX1BBUkFNUy52b2RJZCxcXG4gICAgfSk7XFxuICB9Ki9cXG5cXG4gIGQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgIGlkOiBcXFwicGxheXBhZ2VsaW5lXFxcIlxcbiAgICB9XFxuICB9KVxcblxcblxcbiAgZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBpZDogXFxcInBsYXlsaXN0c1xcXCJcXG4gICAgfVxcbiAgfSk7XFxuXFxuICBkLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBpZDogXFxcInBsYXlsaXN0c0VORFxcXCJcXG4gICAgfVxcbiAgfSk7XFxuICBjYWNoZVNob3dUaXBzKCk7XFxuICBzZXRSZXN1bHQoZCk7XFxuICByZW5vdmF0ZUxpc3QoZ2V0TXlWYXIoaWQgKyBcXFwic291cmNlaVxcXCIsIFxcXCIwXFxcIikpO1xcbn0pKClcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuino+aekOaWh+S7tlwiLFwicGF0aFwiOlwiY29uZmlnc1wiLFwicnVsZVwiOlwiY29uc3QgcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0RycHlIaWtlci9wYXJzZXMuanNvblxcXCI7XFxuY29uc3Qgb2xkcGF0aD0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9wYXJzZXMuanNvblxcXCI7XFxubGV0IGRhdGE7XFxuXFxuZnVuY3Rpb24gZ2V0SnNvbigpIHtcXG4gICAgaWYoIWZpbGVFeGlzdChwYXRoKSYmZmlsZUV4aXN0KG9sZHBhdGgpKXtcXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlKG9sZHBhdGgpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgc2F2ZUZpbGUocGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xcbiAgICAgICAgLy9kZWxldGVGaWxlKG9sZHBhdGgpO1xcbiAgICB9XFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XFxuICAgICAgICByZXR1cm4gZGF0YTtcXG4gICAgfVxcbiAgICB0cnkge1xcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UocmVhZEZpbGUocGF0aCkgfHwgXFxcIltdXFxcIik7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGRlbGV0ZUZpbGUocGF0aCk7XFxuICAgICAgICBkYXRhID0gW107XFxuICAgIH1cXG4gICAgcmV0dXJuIGRhdGE7XFxufVxcblxcbmZ1bmN0aW9uIHNhdmVKc29uKGpzb24pIHtcXG4gICAgc2F2ZUZpbGUocGF0aCwgSlNPTi5zdHJpbmdpZnkoanNvbikpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRVc2VmdWxKc29uKCkge1xcbiAgICByZXR1cm4gZ2V0SnNvbigpLmZpbHRlcih2ID0+ICF2LmZvcmJpZGRlbik7XFxufVxcblxcbmZ1bmN0aW9uIGdldEZvcmJpZGRlbkpzb24oKSB7XFxuICAgIHJldHVybiBnZXRKc29uKCkuZmlsdGVyKHYgPT4gdi5mb3JiaWRkZW4pO1xcbn1cXG5cXG4kLmV4cG9ydHMgPSB7XFxuICAgIGdldEpzb24sXFxuICAgIHNhdmVKc29uLFxcbiAgICBnZXRVc2VmdWxKc29uLFxcbiAgICBnZXRGb3JiaWRkZW5Kc29uLFxcbiAgICBwYXRoLFxcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDnrqHnkIZcIixcInBhdGhcIjpcInJ1bGVNYW5hZ2VcIixcInJ1bGVcIjpcImpzOlxcbnZhciBkID0gW107XFxuc2V0UGFnZVRpdGxlKFxcXCLop6PmnpDnrqHnkIZcXFwiKTtcXG5sZXQgY29uZmlncyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpO1xcbmxldCBhcnIgPSBjb25maWdzLmdldEpzb24oKTtcXG5sZXQgbGVuZ3RoID0gYXJyLmxlbmd0aDtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgIHRpdGxlOiBcXFwi5o+Q56S6XFxcIixcXG4gICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzI3LnBuZ1xcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBjb25zdCBoaWtlclBvcCA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Njk2NlxcXCIpO1xcbiAgICAgICAgbGV0IHBvcCA9IGhpa2VyUG9wLmluZm9Cb3R0b20oe1xcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcXG4gICAgICAgICAgICAgICAgXFxcIlvlu7rorq5d77ya6Kej5p6Q5Y+q6ZyA6KaB5L+d5a2Y5bCR6YeP5aW955So55qE5Y2z5Y+v77yM5LiN6ZyA6KaB5aSq5aSa44CCXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcIlvmj5DnpLpd77ya6Kej5p6Q5pyJ5pe25pWI5oiW6YeN5a6a5ZCR55qEJ+mrmOe6pyfop6PmnpDvvIzmnKznqIvluo/kuI3mlK/mjIHvvIzlu7rorq7liKDpmaTjgIJcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiW1EmQV3vvJrkuLrllaXlnKjnvJbovpHpobXpnaLmtYvor5Xop6PmnpDml7bog73nlKjvvIzkv53lrZjlkI7lho3op4bpopHmupDkuK3ljbTop6PmnpDkuI3lh7rmnaXvvJ9cXFxcbuS4jeefpemBk++8jOaIkeeahOino+WGs+WKnuazleaYr+W7uuiuruWIoOmZpOOAglxcXCJcXG4gICAgICAgICAgICBdLFxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaWsOWinlxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9ydWxlRWRpdCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoI1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fZG9tYWluX2NvbmZpZ1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBwYWdlVGl0bGU6IFxcXCLmlrDlop7op6PmnpBcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIhuS6q1xcXCIsXFxuICAgIHVybDogJChcXFwiLTFcXFwiLCBcXFwi6L6T5YWl5L2g6KaB5YiG5Lqr6Kej5p6Q55qE5bqP5Y+3XFxcXG4tMeWFqOmDqO+8jC0y5bey5ZCv55So55qE77yMLTPlt7LnpoHnlKjnmoRcXFwiKS5pbnB1dCgobGVuZ3RoKSA9PiB7XFxuICAgICAgICBsZXQgaW5kZXhjID0gaW5wdXQuc3BsaXQoLyx877yMLyk7XFxuICAgICAgICBsZXQgaW5kZXhzID0gW107XFxuICAgICAgICBsZXQgbW8gPSBwYXJzZUludChpbmRleGNbMF0pO1xcbiAgICAgICAgaWYgKCEoaW5kZXhjLmxlbmd0aCAhPT0gMCAmJiBtbyA8IDAgJiYgbW8gPiAtNSkpIHtcXG4gICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBpbmRleGMpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KGl0KTtcXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihudW0pIHx8IG51bSA+PSBsZW5ndGggfHwgbnVtIDwgMCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aVsOWtl+S4jeWQiOazlVxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaW5kZXhzLnB1c2gobnVtKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gJChbXFxcIkhJS0VSXFxcIiwgXFxcIlRYVFxcXCJdLmNvbmNhdChnZXRQYXN0ZXMoKSksIDIsIFxcXCLliIbkuqvmlrnlvI9cXFwiKS5zZWxlY3QoKG1vLCBpbmRleHMsIGV4dCkgPT4ge1xcbiAgICAgICAgICAgIGZ1bmN0aW9uIHVwKHJ1bGVzKSB7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlYjY0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHJ1bGVzKSk7XFxuICAgICAgICAgICAgICAgIGxldCBnZXRQYXNzID0gKGxlbmd0aCwgcnVsZSwgdHlwZSkgPT4gXFxcIua1t+mYlOinhueVjO+8jERSUFnop6PmnpDvvIzlhbHjgIxcXFwiICsgbGVuZ3RoICsgXFxcIuOAjeadoe+8jOWkjeWItuaVtOadoeWPo+S7pOaJk+W8gOi9r+S7tuWwseS8muiHquWKqOWvvOWFpSRcXFwiICsgcnVsZSArIFxcXCIkXFxcIiArIHR5cGUgKyBcXFwiQGltcG9ydD1qczokLnJlcXVpcmUoJ2ltcG9ydD9ydWxlPScrXFxcIiArIEpTT04uc3RyaW5naWZ5KE1ZX1JVTEUudGl0bGUpICsgXFxcIikoaW5wdXQpXFxcIjtcXG4gICAgICAgICAgICAgICAgaWYgKGdldFBhc3RlcygpLmluY2x1ZGVzKGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBzaGFyZVBhc3RlKHJ1bGViNjQsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBnZXRQYXNzKHJ1bGVzLmxlbmd0aCwgdSwgXFxcImJcXFwiKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9zaGFyZS9kcnB56Kej5p6Q44CMXFxcIiArIHJ1bGVzLmxlbmd0aCArIFxcXCLjgI3mnaEuXFxcIiArIChpbnB1dCA9PT0gXFxcIkhJS0VSXFxcIiA/IFxcXCJoaWtlclxcXCIgOiBcXFwidHh0XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUocGF0aCwgZ2V0UGFzcyhydWxlcy5sZW5ndGgsIHJ1bGViNjQsIFxcXCJhXFxcIikpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJzaGFyZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBydWxlcztcXG4gICAgICAgICAgICBpZiAobW8gPT09IC0xKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW8gPT09IC0yKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0VXNlZnVsSnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW8gPT09IC0zKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0Rm9yYmlkZGVuSnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpLmZpbHRlcigodiwgaSkgPT4gaW5kZXhzLmluY2x1ZGVzKGkpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcnVsZXMgPSBydWxlcy5tYXAoKHYpID0+IHtcXG4gICAgICAgICAgICAgICAgdi5mb3JiaWRkZW4gPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgICAgIHJldHVybiB2O1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB1cChydWxlcyk7XFxuICAgICAgICB9LCBtbywgaW5kZXhzLCBpbmRleGNbMV0pO1xcblxcbiAgICB9LCBsZW5ndGgpLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3NoYXJlX2dyZWVuXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YeN572uXFxcIixcXG4gICAgdXJsOiAkKFxcXCLkvaDnoa7lrprph43nva7vvJ9cXFxcbuivpeaTjeS9nOS8muWIoOmZpOeOsOacieino+aekO+8jOaBouWkjeiHquW4puino+aekOOAglxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgIGRlbGV0ZUZpbGUocGF0aCk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5wYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9yZWZyZXNoXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5riF56m6XFxcIixcXG4gICAgdXJsOiAkKFxcXCLkvaDnoa7lrprlhajpg6jliKDpmaTvvJ9cXFxcbuivpeaTjeS9nOS8muWIoOmZpOeOsOacieino+aekOOAglxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgIHdyaXRlRmlsZShwYXRoLCBcXFwiW11cXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnBhdGgpLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2NvZGVfdmlld1xcXCJcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICAvL3RpdGxlOiAnPGZvbnQgY29sb3I9XFxcIiMxM0I2MUJcXFwiPuKWkCA8L2ZvbnQ+PGI+6Kej5p6Q5YiX6KGoPGI+ICgnICsgU3RyaW5nKGxlbmd0aCkuZm9udGNvbG9yKFxcXCIjZmY2NjAxXFxcIikgKyBcXFwiKVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG59KTtcXG5sZXQgY291bnRUaXRsZSA9IGQuYXQoLTEpO1xcblxcblxcbmxldCBjb3VudCA9IGQubGVuZ3RoO1xcblxcbmZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcXG4gICAgbGV0IGl0ID0gYXJyW2ldO1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ1bJyArIGkgKyAnXTxiPiAgJyArIGl0Lm5hbWUgKyAoaXQuZm9yYmlkZGVuID8gXFxcIiAj4oCc4oCc56aB55So4oCd4oCdXFxcIi5zbWFsbCgpIDogXFxcIlxcXCIpLFxcbiAgICAgICAgZGVzYzogaXQudXJsLFxcbiAgICAgICAgdXJsOiAkKFtcXFwi57yW6L6RXFxcIiwgXFxcIuWIhuS6q1xcXCIsIFxcXCLnpoHnlKgv5ZCv55SoXFxcIiwgXFxcIuenu+WKqFxcXCIsIFxcXCLnva7pobZcXFwiLCBcXFwi5Yig6ZmkXFxcIl0sIDEsIFxcXCLmk43kvZzvvJpcXFwiICsgaXQubmFtZSkuc2VsZWN0KChpbmRleCwgbGVuZ3RoKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi57yW6L6RXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9ydWxlRWRpdCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoI1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuWIhuS6q1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG9wcyA9IGdldFBhc3RlcygpO1xcbiAgICAgICAgICAgICAgICBvcHMudW5zaGlmdChcXFwi5a6M5pW05Y+j5LukXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKG9wcywgMiwgXFxcIuWIhuS6q+aWueW8j1xcXCIpLnNlbGVjdCgoaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpW2luZGV4XTtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGUudXNlciA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGUuZm9yYmlkZGVuID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGViNjQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkocnVsZSkpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdldFBhc3MgPSAobmFtZSwgcnVsZSwgdHlwZSkgPT4gXFxcIua1t+mYlOinhueVjO+8jOOAjFxcXCIgKyBuYW1lICsgXFxcIuOAjURSUFnop6PmnpDvvIzlpI3liLbmlbTmnaHlj6Pku6TmiZPlvIDova/ku7blsLHkvJroh6rliqjlr7zlhaUkXFxcIiArIHJ1bGUgKyBcXFwiJFxcXCIgKyB0eXBlICsgXFxcIkBpbXBvcnQ9anM6JC5yZXF1aXJlKCdpbXBvcnQ/cnVsZT0nK1xcXCIgKyBKU09OLnN0cmluZ2lmeShNWV9SVUxFLnRpdGxlKSArIFxcXCIpKGlucHV0KVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gXFxcIuWujOaVtOWPo+S7pFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlLm5hbWUsIHJ1bGViNjQsIFxcXCJhXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1ID0gc2hhcmVQYXN0ZShydWxlYjY0LCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGdldFBhc3MocnVsZS5uYW1lLCB1LCBcXFwiYlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LCBpbmRleCk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuenu+WKqFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoaW5kZXggKyBcXFwiXFxcIiwgXFxcIui+k+WFpeS9jee9rlxcXCIpLmlucHV0KChpbmRleCwgbGVuZ3RoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SW5kZXggPSBOdW1iZXIoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihuZXdJbmRleCkgfHwgbmV3SW5kZXggPj0gbGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeWSjOinhOeahOS9jee9rlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzLnNwbGljZShpbmRleCwgMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICBydWxlcy5zcGxpY2UobmV3SW5kZXgsIDAsIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24ocnVsZXMpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICB9LCBpbmRleCwgbGVuZ3RoKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi572u6aG2XFxcIikge1xcbiAgICAgICAgICAgICAgICBsZXQgbmV3SW5kZXggPSAwO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlID0gcnVsZXMuc3BsaWNlKGluZGV4LCAxKVswXTtcXG4gICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKG5ld0luZGV4LCAwLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24ocnVsZXMpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuWIoOmZpFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIuehruiupOWIoOmZpO+8n1xcXCIpLmNvbmZpcm0oKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzLnNwbGljZShpbmRleCwgMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5Yig6ZmkXFxcIiArIHJ1bGUubmFtZTtcXG4gICAgICAgICAgICAgICAgfSwgaW5kZXgpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlID0gYXJyW2luZGV4XTtcXG4gICAgICAgICAgICAgICAgcnVsZS5mb3JiaWRkZW4gPSAhcnVsZS5mb3JiaWRkZW47XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKGFycik7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIChydWxlLmZvcmJpZGRlbiA/IFxcXCLnpoHnlKhcXFwiIDogXFxcIuWQr+eUqFxcXCIpICsgcnVsZS5uYW1lO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGksIGxlbmd0aCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGk6IGksXFxuICAgICAgICAgICAgcGFnZVRpdGxlOiBpdC5uYW1lXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5jb3VudFRpdGxlLnRpdGxlID0gJzxmb250IGNvbG9yPVxcXCIjMTNCNjFCXFxcIj7ilpAgPC9mb250PjxiPuino+aekOWIl+ihqDxiPiAoJyArICgoZC5sZW5ndGggLSBjb3VudCkgKyBcXFwiL1xcXCIgKyBsZW5ndGgpLmZvbnRjb2xvcihcXFwiI2ZmNjYwMVxcXCIpICsgXFxcIilcXFwiO1xcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuino+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/cnVuVHlwZT1KU09OJnVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZSh2LnVybCArIHVybCkpICsgXFxcIiZwYXJhbT1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShwYXJhbSkpKSk7XFxuICAgIH0gZWxzZSBpZiAodi5ydW5UeXBlID09PSBcXFwiSlNcXFwiKSB7XFxuICAgICAgcGxheWxpc3QudXJscy5wdXNoKHByb3h5VXJsICsgXFxcIj9ydW5UeXBlPUpTJnVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJhc2U2NEVuY29kZSh1cmwpKSArIChpc1Rlc3QgPyBcXFwiJnBhcmFtPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHYpKSkgOiBcXFwiJmluZGV4PVxcXCIgKyBpKSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgcGxheWxpc3QudXJscy5wdXNoKFxcXCJ2aWRlbzovL1xcXCIgKyB2LnVybCArIHVybCk7XFxuICAgIH1cXG4gIH0pO1xcbiAgaWYgKCFwbGF5bGlzdC51cmxzLmxlbmd0aCkgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgdXJsO1xcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlsaXN0KTtcXG59XFxuXFxuZnVuY3Rpb24gdXNlUGFyc2VzKHVybCwgZmxhZykge1xcbiAgbGV0IHBhcnNlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG5cXG4gIGlmICghcGFyc2VzLmxlbmd0aCkgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgdXJsO1xcbiAgbGV0IHBsYXlsaXN0ID0ge1xcbiAgICB1cmxzOiBbXSxcXG4gICAgbmFtZXM6IFtdLFxcbiAgICBoZWFkZXJzOiBbXSxcXG4gICAgaXM6IFxcXCIjaXNWaWRlbz10cnVlI1xcXCIsXFxuICB9O1xcbiAgdHJ5IHtcXG4gICAgbGV0IHVzZURhbm11ID0gISFnZXRJdGVtKFxcXCJ1c2VEYW5tdVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgaWYgKHVzZURhbm11KSB7XFxuICAgICAgcGxheWxpc3QuZGFubXUgPSAkLnJlcXVpcmUoJ2RtRnVuP3J1bGU9ZG3nm5LlrZAnKS5kbVJvdXRlKHVybCk7XFxuICAgIH1cXG4gIH0gY2F0Y2ggeyB9XFxuICBmbGFnID0gU3RyaW5nKGZsYWcpLnJlcGxhY2UoL1xcXFxzL2csIFxcXCJcXFwiKTtcXG4gIHJldHVybiBwcmVwYXJlUGFyc2VzKHBhcnNlcywgdXJsLCBwbGF5bGlzdCwgZmFsc2UsIGZsYWcpO1xcbn1cXG5cXG5mdW5jdGlvbiBjYXJyeUpzKHBsYXksIGlkKSB7XFxuICB2YXIgZXh0cmEgPSB7XFxuICAgIFxcXCJ1YVxcXCI6IE1PQklMRV9VQVxcbiAgfVxcbiAgbGV0IHBhcnNlID0gcGxheTtcXG4gIGxldCBwYXJzZV9vYmogPSB7XFxuICAgIGRlZlJ1bGVzOiBbXFxcIioubXA0XFxcIiwgXFxcIioubTN1OFxcXCJdLFxcbiAgfTtcXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwicGFyc2VfZXh0cmFcXFwiKSkge1xcbiAgICBsZXQgcGFyc2VfZXh0cmEgPSBkZWNvZGVVUklDb21wb25lbnQocGFyc2UucGFyc2VfZXh0cmEpO1xcbiAgICBwYXJzZV9vYmogPSBPYmplY3QuYXNzaWduKHBhcnNlX29iaiwgcGFyc2VRdWVyeShwYXJzZV9leHRyYSkpO1xcbiAgICBpZiAocGFyc2Vfb2JqLmhhc093blByb3BlcnR5KFxcXCJpbml0X3NjcmlwdFxcXCIpKSB7XFxuICAgICAgcGFyc2Vfb2JqW1xcXCJpbml0X3NjcmlwdFxcXCJdID0gYmFzZTY0RGVjb2RlKHBhcnNlX29ialtcXFwiaW5pdF9zY3JpcHRcXFwiXSk7XFxuICAgIH1cXG4gIH1cXG4gIGlmIChwYXJzZV9vYmouaGFzT3duUHJvcGVydHkoXFxcImlzX3BjXFxcIikgJiYgcGFyc2Vfb2JqW1xcXCJpc19wY1xcXCJdID09IFxcXCIxXFxcIikge1xcbiAgICBleHRyYVtcXFwidWFcXFwiXSA9IFBDX1VBO1xcbiAgfVxcbiAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXCJoZWFkZXJcXFwiKSkge1xcbiAgICBleHRyYVtcXFwidWFcXFwiXSA9IHBhcnNlW1xcXCJoZWFkZXJcXFwiXVtcXFwiVXNlci1BZ2VudFxcXCJdO1xcbiAgICAvL2V4dHJhW1xcXCJyZWRpcmVjdFxcXCJdPWZhbHNlO1xcbiAgICAvKmV4dHJhW1xcXCJqc1xcXCJdID0gJC50b1N0cmluZygoanMpID0+IHtcXG4gICAgICBldmFsKGpzKVxcbiAgICAgIGZiYS5sb2cobmF2aWdhdG9yLnVzZXJBZ2VudClcXG4gICAgICBmYmEubG9nKGxvY2F0aW9uLmhyZWYpXFxuICAgIH0sICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuYXZpZ2F0b3IsICd1c2VyQWdlbnQnLCB7XFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgcmV0dXJuICdNeS1DdXN0b20tVUEtU3RyaW5nJztcXG4gICAgICAgIH1cXG4gICAgICB9KTtcXG4gICAgfSkpKi9cXG4gIH1cXG4gIGlmIChwYXJzZV9vYmouaGFzT3duUHJvcGVydHkoXFxcImN1c3RvbV9yZWdleFxcXCIpKSB7XFxuICAgIGxldCBjdXJyZW50ID0gcGFyc2Vfb2JqW1xcXCJkZWZSdWxlc1xcXCJdO1xcbiAgICBleHRyYVtcXFwidmlkZW9SdWxlc1xcXCJdID0gY3VycmVudC5jb25jYXQocGFyc2Vfb2JqLmN1c3RvbV9yZWdleC5zcGxpdCgvXFxcXHwvZykuZmlsdGVyKGUgPT4gZSkpXFxuICB9XFxuICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcImpzXFxcIikgJiYgcGFyc2UuanMgIT0gXFxcIlxcXCIpIHtcXG4gICAgZXh0cmFbXFxcImpzXFxcIl0gPSAkLnRvU3RyaW5nKChqcywgcGFyc2UsIHQpID0+IHtcXG4gICAgICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcImluaXRfc2NyaXB0XFxcIikpIHtcXG4gICAgICAgIGZiYS5sb2codCArIFxcXCI65omn6KGMaW5pdF9zY3JpcHRcXFwiKTtcXG4gICAgICAgIGV2YWwocGFyc2UuaW5pdF9zY3JpcHQpO1xcbiAgICAgIH1cXG4gICAgICBmYmEubG9nKG5hdmlnYXRvci5wbGF0Zm9ybSk7XFxuICAgICAgZmJhLmxvZyh0ICsgXFxcIjrmiafooYxqc+eCueWHu1xcXCIpXFxuICAgICAgZXZhbChqcylcXG4gICAgfSwgcGFyc2UuanMsIHBhcnNlX29iaiwgTVlfUlVMRS50aXRsZSlcXG4gIH1cXG4gIHRyeSB7XFxuICAgIGxldCBpdGVtID0gZmluZEl0ZW0oaWQpO1xcbiAgICB1cGRhdGVJdGVtKGlkLCB7XFxuICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0uZXh0cmEsIGV4dHJhKVxcbiAgICB9KTtcXG4gIH0gY2F0Y2ggKGUpIHsgfVxcbn1cXG5cXG5mdW5jdGlvbiBwYXJzZVF1ZXJ5KHF1ZXJ5KSB7XFxuICB2YXIgb2JqID0ge307XFxuICBxdWVyeS5zcGxpdChcXFwiJlxcXCIpLmZpbHRlcihlID0+IGUpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcXG4gICAgdmFyIHBhcnRzID0gaXRlbS5zcGxpdChcXFwiPVxcXCIpO1xcbiAgICBvYmpbcGFydHNbMF1dID0gcGFydHNbMV07XFxuICB9KTtcXG4gIHJldHVybiBvYmo7XFxufVxcblxcbiQuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIChpbnB1dCwgaWQsIHNvdXJjZSkge1xcbiAgbGV0IGRycHkgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKS5nZXRCeVNvdXJjZShzb3VyY2UpO1xcbiAgaW5wdXQgPSBpbnB1dC5zcGxpdChcXFwiI1xcXCIpO1xcbiAgbGV0IHBsYXkgPSBKU09OLnBhcnNlKGRycHkucGxheShpbnB1dFsxXSwgaW5wdXRbMF0ucmVwbGFjZShcXFwidHZib3gteGc6XFxcIiwgXFxcIlxcXCIpLCBbXSkpO1xcbiAgbGV0IG1hcmsgPSBkcnB5LmdldFJ1bGUoXFxcIuexu+Wei1xcXCIpID09PSBcXFwi5ZCs5LmmXFxcIiA/IFxcXCIjaXNNdXNpYz10cnVlI1xcXCIgOiBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiO1xcblxcbiAgaWYgKHBsYXkudXJsLmluY2x1ZGVzKFxcXCJwcm94eT9kb1xcXCIpIHx8IHBsYXkudXJsLmluY2x1ZGVzKFxcXCJwcm94eT9oaWtlclNrZXlcXFwiKSkge1xcbiAgICBNWV9VUkwgPSBwbGF5LnVybDtcXG4gICAgcGxheS51cmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInVybFxcXCIsIFxcXCJcXFwiKSk7XFxuICB9XFxuICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwicHVzaDovL1xcXCIpKSB7XFxuICAgIHBsYXkudXJsID0gcGxheS51cmwucmVwbGFjZShcXFwicHVzaDovL1xcXCIsIFxcXCJcXFwiKTtcXG4gIH1cXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9cXFwiKSkge1xcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9xdWFya0xpc3Q/cnVsZT1RdWFyay7nroAmcmVhbHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBsYXkudXJsKSArIFxcXCImc2hhcmVQd2Q9XFxcIjtcXG4gIH1cXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKCdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy8nKSB8fCBwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3d3dy5hbGlwYW4uY29tL3MvXFxcIikpIHtcXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuP3J1bGU95LqR55uY5ZCbLueugCZwYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocGxheS51cmwpO1xcbiAgfVxcbiAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcInBpY3M6Ly9cXFwiKSkge1xcbiAgICByZXR1cm4gcGxheS51cmw7XFxuICB9XFxuICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwibm92ZWw6Ly9cXFwiKSkge1xcbiAgICByZXR1cm4gJChcXFwiaGlrZXI6Ly9lbXB0eSNyZWFkVGhlbWUjXFxcIikucnVsZSgoZGF0YSkgPT4ge1xcbiAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcXG4gICAgICBsZXQgbGF5b3V0ID0gW107XFxuICAgICAgbGV0IGNvbnRlbnQgPSBcXFwi44CA44CAXFxcIiArIGRhdGEuY29udGVudC5zcGxpdCgvKFxcXFxufFxcXFxyKSsvKS5maWx0ZXIoaXQgPT4gaXQudHJpbSgpLmxlbmd0aCA+IDEpLm1hcChpdCA9PiBpdC50cmltKCkpLmpvaW4oXFxcIjxicj7jgIDjgIBcXFwiKTtcXG4gICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgICAgICB0aXRsZTogKFxcXCI8c3Ryb25nPlxcXCIgKyBkYXRhLnRpdGxlICsgXFxcIjwvc3Ryb25nPlxcXCIpLmJpZygpLFxcbiAgICAgIH0pO1xcblxcbiAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBjb250ZW50LFxcbiAgICAgICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgdGV4dFNpemU6IDE4LFxcbiAgICAgICAgICBjbGljazogdHJ1ZVxcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICAgIHNldFJlc3VsdChsYXlvdXQpO1xcbiAgICB9LCBwbGF5LnVybC5yZXBsYWNlKFxcXCJub3ZlbDovL1xcXCIsIFxcXCJcXFwiKSk7XFxuICB9XFxuICAvL2xvZyhwbGF5KTtcXG4gIGlmIChwbGF5LnBhcnNlID09PSAxIHx8IHBsYXkuanggPT09IDEpIHtcXG4gICAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcIm1hZ25ldDpcXFwiKSkge1xcbiAgICAgIHJldHVybiBwbGF5LnVybDtcXG4gICAgfVxcbiAgICBjYXJyeUpzKHBsYXksIGlkKTtcXG4gICAgaWYgKHBsYXkuanggPT09IDEgfHwgKGlzb2ZmaWNpYWwocGxheS51cmwpICYmIChwbGF5LmZsYWcgfHwgaW5wdXRbMV0pKSkge1xcbiAgICAgIHJldHVybiB1c2VQYXJzZXMocGxheS51cmwsIHBsYXkuZmxhZyB8fCBpbnB1dFsxXSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIFxcXCJ2aWRlbzovL1xcXCIgKyBwbGF5LnVybDtcXG4gIH0gZWxzZSBpZiAocGxheS5wYXJzZSA9PT0gMCkge1xcbiAgICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwibWFnbmV0OlxcXCIpKSB7XFxuICAgICAgcmV0dXJuIHBsYXkudXJsO1xcbiAgICB9XFxuICAgIC8vbG9nKHBsYXkpXFxuICAgIHZhciBwbGF5b2JqID0ge307XFxuICAgIHBsYXlvYmoudXJscyA9IFtwbGF5LnVybCArIG1hcmtdO1xcbiAgICBpZiAocGxheS5oYXNPd25Qcm9wZXJ0eShcXFwiaGVhZGVyXFxcIikpIHtcXG4gICAgICBwbGF5b2JqW1xcXCJoZWFkZXJzXFxcIl0gPSBwbGF5LmhlYWRlcjtcXG4gICAgfVxcbiAgICBpZiAocGxheS5oYXNPd25Qcm9wZXJ0eShcXFwiZGFubWFrdVxcXCIpKSB7XFxuICAgICAgcGxheW9ialtcXFwiZGFubXVcXFwiXSA9IHBsYXkuZGFubWFrdTtcXG4gICAgfVxcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGxheW9iaik7XFxuICB9IGVsc2Uge1xcbiAgICByZXR1cm4gcGxheS51cmw7XFxuICB9XFxufVxcbiQuZXhwb3J0cy5wcmVwYXJlUGFyc2VzID0gcHJlcGFyZVBhcnNlcztcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWIm+W7uuiuoumYhVwiLFwicGF0aFwiOlwiY3JlYXRlU3Vic2NyaXB0aW9uXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuWIm+W7uuiuoumYhVxcXCIpO1xcbmxldCBsYXlvdXQgPSBbXTtcXG5sZXQgZiA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9zdWJ1cmxfaW5wdXRcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX3N1Ym5hbWVfaW5wdXRcXFwiKTtcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi6K6i6ZiF5ZCN56ewXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfc3VibmFtZV9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc3VibmFtZV9pbnB1dFxcXCJcXG4gICAgfVxcbn0pO1xcbmxldCBwYXRoID0gam9pblVybChnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpLCBcXFwiLi4vXFxcIi5yZXBlYXQoNSkpLnNsaWNlKDcpO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpgInmi6lcXFwiLFxcbiAgICB1cmw6IEpTT04uc3RyaW5naWZ5KGYuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIikuZXh0cmE7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbShcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgICBpbml0aWFsUGF0aDogcGF0aCxcXG4gICAgICAgIHBhdHRlcm46IDFcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuWCqOWtmOi3r+W+hFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBpZDogXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi6K6i6ZiF5Zyw5Z2AXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfc3VidXJsX2lucHV0XFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBpZDogXFxcImRycHlIaWtlcl9zdWJ1cmxfaW5wdXRcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcbiAgICAgICAgbGV0IHBhdGggPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGxldCB1cmwgPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX3N1YnVybF9pbnB1dFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJuYW1lX2lucHV0XFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKCEocGF0aCAmJiB1cmwgJiYgbmFtZSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5Y+v5Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydWxlID0gYmFzZTY0RW5jb2RlKFxcXCLmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pVxcXCIgKyBuYW1lICsgXFxcIkBAXFxcIiArIHVybCtgQGpzPSQucmVxdWlyZSgnc3Vic2NyaWJlP3J1bGU9JHtNWV9SVUxFLnRpdGxlfScpLnBhcnNlVXJsKGlucHV0LCAnJHtiYXNlNjRFbmNvZGUocGF0aCl9JylgKTtcXG4gICAgICAgIHJldHVybiBcXFwicnVsZTovL1xcXCIgKyBydWxlO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuino+aekOiuoumYhVwiLFwicGF0aFwiOlwic3Vic2NyaWJlXCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0J5R2l0aHViKHVybCwgcGF0aCkge1xcbiAgICBsZXQgcm9wZSA9IHVybC5zcGxpdChcXFwiL1xcXCIpLnNsaWNlKDMsIDUpLmpvaW4oXFxcIi9cXFwiKTtcXG4gICAgbGV0IGh0bWwgPSBmZXRjaCh1cmwpO1xcbiAgICBcXG4gICAgbGV0IGpzb25UZXh0ID0gcGRmaChodG1sLCBcXFwiI3JlcG8tY29udGVudC1wamF4LWNvbnRhaW5lciYmc2NyaXB0JiZIdG1sXFxcIik7XFxuICAgIFxcbiAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpO1xcbiAgICBsZXQgbGlzdCA9IGpzb24ucGF5bG9hZC50cmVlLml0ZW1zO1xcbiAgICBsZXQgcnVsZXMgPSBbXTtcXG4gICAgbGV0IGNvdW50ID0gMDtcXG4gICAgbGV0IG5hbWVzID0gW107XFxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIFxcXCJ0b2FzdDovL+WPr+iDveWIoOW6k+S6hlxcXCI7XFxuICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBpdC5uYW1lO1xcbiAgICAgICAgICAgIGxldCBzcGF0aCA9IGl0LnBhdGg7XFxuICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkgY29udGludWU7XFxuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKTtcXG4gICAgICAgICAgICBsZXQgcnVsZSA9IGZldGNoKGBodHRwczovL3Jhdy5naXRtaXJyb3IuY29tLyR7cm9wZX0vbWFzdGVyLyR7c3BhdGh9YCk7XFxuICAgICAgICAgICAgaWYgKCEoKCFydWxlIHx8ICFydWxlLmluY2x1ZGVzKFxcXCJydWxlXFxcIikpICYmICFmaWxlRXhpc3QocGF0aCArIGl0Lm5hbWUpKSkge1xcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUocGF0aCArIGl0Lm5hbWUsIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBydWxlcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICdrZXknOiBgaGlweV9qc18ke25hbWV9YCxcXG4gICAgICAgICAgICAgICAgICAgICduYW1lJzogYCR7bmFtZX1gLFxcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAzLFxcbiAgICAgICAgICAgICAgICAgICAgJ2FwaSc6ICcuLi9saWJzL2RycHkyLmpzJyxcXG4gICAgICAgICAgICAgICAgICAgICdzZWFyY2hhYmxlJzogMSxcXG4gICAgICAgICAgICAgICAgICAgICdxdWlja1NlYXJjaCc6IDEsXFxuICAgICAgICAgICAgICAgICAgICAnZmlsdGVyYWJsZSc6IDEsXFxuICAgICAgICAgICAgICAgICAgICAnZXh0JzogXFxcIi4vXFxcIiArIGl0Lm5hbWUsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xcbiAgICAgICAgICAgICAgICBuYW1lcy5wdXNoKGl0Lm5hbWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBkZWxldGVsb3NlKG5hbWVzLCBwYXRoKVxcbiAgICB3cml0ZUZpbGUocGF0aCArIFxcXCJpbmRleC5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgc2l0ZXM6IHJ1bGVzXFxuICAgIH0pKTtcXG5cXG4gICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aIkOWKn+abtOaWsFxcXCIgKyBjb3VudCArIFxcXCLkuKpcXFwiOztcXG59XFxuXFxuZnVuY3Rpb24gZGVsZXRlbG9zZShuYW1lcywgcGF0aCkge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IHBhdGhGaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoKTtcXG4gICAgICAgIGlmICghcGF0aEZpbGUuaXNEaXJlY3RvcnkoKSkgcmV0dXJuO1xcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBwYXRoRmlsZS5saXN0RmlsZXMoKSkge1xcbiAgICAgICAgICAgIGxldCBuYW1lID0gU3RyaW5nKGZpbGUuZ2V0TmFtZSgpKTtcXG4gICAgICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXFxcIi5qc1xcXCIpIHx8IG5hbWVzLmluY2x1ZGVzKG5hbWUpKSBjb250aW51ZTtcXG4gICAgICAgICAgICBkZWxldGVGaWxlKGZpbGUuZ2V0UGF0aCgpKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgdG9hc3QoXFxcIua4heeQhuWkseaViOa6kOWksei0pTpcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0J5SW5kZXgodXJsLCBwYXRoKSB7XFxuICAgIGxldCBqc29uID0gSlNPTi5wYXJzZSh0b0NvcnJlY3RKU09OU3RyaW5nKHJlcXVlc3QodXJsKSkpO1xcbiAgICBsZXQgYXJyID0ganNvbi5zaXRlcztcXG4gICAgbGV0IGNvdW50ID0gMDtcXG4gICAgbGV0IGkgPSAwO1xcbiAgICBsZXQgbmFtZXMgPSBbXTtcXG4gICAgZm9yIChsZXQgaXQgb2YgYXJyKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmICgoU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLm1pbi5qc1xcXCIpIHx8IFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXCJkcnB5Mi5qc1xcXCIpKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGl0LmV4dC5lbmRzV2l0aChcXFwiLmpzXFxcIikgPyBkZWNvZGVVUklDb21wb25lbnQoaXQuZXh0LnNwbGl0KFxcXCIvXFxcIikuYXQoLTEpKSA6IChpdC5uYW1lICsgXFxcIi5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZTtcXG4gICAgICAgICAgICAgICAgaWYgKFN0cmluZyhpdC5leHQpLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZSA9IHJlcXVlc3QoaXQuZXh0KTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGUgPSByZXF1ZXN0KGpvaW5VcmwodXJsLCBpdC5leHQpKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpdC5leHQgPSBcXFwiLi9cXFwiICsgbmFtZTtcXG4gICAgICAgICAgICAgICAgaWYgKCFydWxlIHx8ICFydWxlLmluY2x1ZGVzKFxcXCJydWxlXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlsZUV4aXN0KHBhdGggKyBuYW1lKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGksIDEpO1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShwYXRoICsgbmFtZSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgIG5hbWVzLnB1c2gobmFtZSk7XFxuICAgICAgICAgICAgICAgIGNvdW50Kys7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaSsrO1xcbiAgICB9XFxuICAgIGRlbGV0ZWxvc2UobmFtZXMsIHBhdGgpO1xcbiAgICB3cml0ZUZpbGUocGF0aCArIFxcXCJpbmRleC5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoanNvbikpO1xcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oiQ5Yqf5pu05pawXFxcIiArIGNvdW50ICsgXFxcIuS4qlxcXCI7XFxufVxcbiQuZXhwb3J0cy5wYXJzZVVybCA9IGZ1bmN0aW9uICh1cmwsIHBhdGgpIHtcXG4gICAgcGF0aCA9IGJhc2U2NERlY29kZShwYXRoKTtcXG4gICAgcGF0aCA9IHBhdGguZW5kc1dpdGgoXFxcIi9cXFwiKSA/IHBhdGggOiBwYXRoICsgXFxcIi9cXFwiO1xcbiAgICB0cnkge1xcbiAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL2dpdGh1Yi5jb20vaGpkaG54L1xcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnQnlHaXRodWIodXJsLCBwYXRoKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnQnlJbmRleCh1cmwsIHBhdGgpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIHJldHVybiBcXFwiZXJyb3I6XFxcIiArIGUudG9TdHJpbmcoKTtcXG4gICAgfVxcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLov5DooYzml7bphY3nva7nrqHnkIZcIixcInBhdGhcIjpcInJ1bnRpbWVDb25maWdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHNlYXJjaEFsbG93UGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0RycHlIaWtlci9zZWFyY2hBbGxvdy5qc29uXFxcIjtcXG5sZXQgaXNQcmVwYXJlID0gZmFsc2U7XFxubGV0IGNvbmZpZ3MsIGN1cnJlbnRDb25maWcgPSB7fSxcXG4gICAgc291cmNlTGlzdCwgY3VycmVudFNvdXJjZSwgc2VhcmNoQWxsb3cgPSBbXTtcXG5cXG5mdW5jdGlvbiBpbml0KGNvbmZpZykge1xcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIG51bGw7XFxuICAgIGlmICghY29uZmlnLnBhdGgpIHJldHVybiBudWxsO1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IGZpbGU7XFxuICAgICAgICBsZXQgc291cmNlTGlzdCA9IFtdO1xcbiAgICAgICAgaWYgKGNvbmZpZy5wYXRoLnN0YXJ0c1dpdGgoXFxcImZpbGU6Ly9cXFwiKSAmJiAoZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoY29uZmlnLnBhdGgucmVwbGFjZShcXFwiZmlsZTovL1xcXCIsIFxcXCJcXFwiKSkpLmlzRGlyZWN0b3J5KCkpIHtcXG4gICAgICAgICAgICBzb3VyY2VMaXN0ID0gZ2VuZXJhdGVDb25maWdCeUxvY2FsKGZpbGUpO1xcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gXFxcImxvY2FsRGlyXFxcIjtcXG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhdGguc3RhcnRzV2l0aChcXFwiaHR0cHM6Ly9naXRodWIuY29tXFxcIikpIHtcXG4gICAgICAgICAgICBzb3VyY2VMaXN0ID0gZ2VuZXJhdGVDb25maWdCeUdpdGh1Yihjb25maWcucGF0aCk7XFxuICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBcXFwiZ2l0aHViRGlyXFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHRvQ29ycmVjdEpTT05TdHJpbmcoZmV0Y2goY29uZmlnLnBhdGgpIHx8IFxcXCJ7fVxcXCIpKTtcXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbi5zaXRlcykgfHwgIWpzb24uc2l0ZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBzb3VyY2VMaXN0ID0gZmlsdGVyT3RoZXIoanNvbi5zaXRlcyk7XFxuICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBcXFwiaW5kZXhcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgZmlsZSA9IHZvaWQgMDtcXG4gICAgICAgIGxldCBjdXJyZW50U291cmNlLCBzZWFyY2hBbGxvdztcXG4gICAgICAgIGlmIChjb25maWcuY0tleSkge1xcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VMaXN0LmZpbmQodiA9PiB2LmtleSA9PT0gY29uZmlnLmNLZXkpO1xcbiAgICAgICAgICAgIGlmICghY3VycmVudFNvdXJjZSkge1xcbiAgICAgICAgICAgICAgICBjdXJyZW50U291cmNlID0gc291cmNlTGlzdFswXTtcXG4gICAgICAgICAgICAgICAgLy9jdXJyZW50Q29uZmlnLmNLZXkgPSBzb3VyY2VMaXN0WzBdLmtleTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VMaXN0WzBdO1xcbiAgICAgICAgICAgIC8vY29uZmlnLmNLZXkgPSBzb3VyY2VMaXN0WzBdLmtleTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgc2VhcmNoQWxsb3cgPSBKU09OLnBhcnNlKGZldGNoKHNlYXJjaEFsbG93UGF0aCkgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgZGVsZXRlRmlsZShzZWFyY2hBbGxvd1BhdGgpO1xcbiAgICAgICAgICAgIHNlYXJjaEFsbG93ID0gW107XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UsXFxuICAgICAgICAgICAgc2VhcmNoQWxsb3csXFxuICAgICAgICAgICAgc291cmNlTGlzdFxcbiAgICAgICAgfTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIG51bGw7XFxufVxcblxcbmZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnQnlMb2NhbChkaXJGaWxlKSB7XFxuICAgIGxldCBsaXN0ID0gZGlyRmlsZS5saXN0RmlsZXMoKTtcXG4gICAgbGV0IHJ1bGVzID0gW107XFxuICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgIGxldCBuYW1lID0gU3RyaW5nKGl0LmdldE5hbWUoKSk7XFxuICAgICAgICBsZXQgcGF0aCA9IGl0LmdldFBhdGgoKTtcXG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikgfHwgaXQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XFxuICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIikpO1xcbiAgICAgICAgcnVsZXMucHVzaCh7XFxuICAgICAgICAgICAgJ2tleSc6IGBoaXB5X2pzXyR7bmFtZX1gLFxcbiAgICAgICAgICAgICduYW1lJzogYCR7bmFtZX1gLFxcbiAgICAgICAgICAgICd0eXBlJzogMyxcXG4gICAgICAgICAgICAnc2VhcmNoYWJsZSc6IDEsXFxuICAgICAgICAgICAgJ3F1aWNrU2VhcmNoJzogMSxcXG4gICAgICAgICAgICAnZmlsdGVyYWJsZSc6IDEsXFxuICAgICAgICAgICAgJ2V4dCc6IGAke3BhdGh9YCxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIHJldHVybiBydWxlcztcXG59XFxuXFxuZnVuY3Rpb24gZ2VuZXJhdGVDb25maWdCeUdpdGh1Yih1cmwpIHtcXG4gICAgLy91cmw9dXJsLnJlcGxhY2UoLygjR0lUSFVCIykkLyxcXFwiXFxcIik7XFxuICAgIGxldCByb3BlID0gdXJsLnNwbGl0KFxcXCIvXFxcIikuc2xpY2UoMywgNSkuam9pbihcXFwiL1xcXCIpO1xcbiAgICBsZXQgaHRtbCA9IGZldGNoKHVybCk7XFxuICAgIGxldCBqc29uVGV4dCA9IHBkZmgoaHRtbCwgXFxcIiNyZXBvLWNvbnRlbnQtcGpheC1jb250YWluZXImJnNjcmlwdCYmSHRtbFxcXCIpO1xcbiAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpO1xcbiAgICBsZXQgbGlzdCA9IGpzb24ucGF5bG9hZC50cmVlLml0ZW1zO1xcbiAgICBsZXQgcnVsZXMgPSBbXTtcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgbGV0IG5hbWUgPSBpdC5uYW1lO1xcbiAgICAgICAgbGV0IHBhdGggPSBpdC5wYXRoO1xcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkgY29udGludWU7XFxuICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIikpO1xcbiAgICAgICAgcnVsZXMucHVzaCh7XFxuICAgICAgICAgICAgJ2tleSc6IGBoaXB5X2pzXyR7bmFtZX1gLFxcbiAgICAgICAgICAgICduYW1lJzogYCR7bmFtZX1gLFxcbiAgICAgICAgICAgICd0eXBlJzogMyxcXG4gICAgICAgICAgICAnc2VhcmNoYWJsZSc6IDEsXFxuICAgICAgICAgICAgJ3F1aWNrU2VhcmNoJzogMSxcXG4gICAgICAgICAgICAnZmlsdGVyYWJsZSc6IDEsXFxuICAgICAgICAgICAgJ2V4dCc6IGBodHRwczovL3Jhdy5naXRtaXJyb3IuY29tLyR7cm9wZX0vbWFzdGVyLyR7cGF0aH1gLFxcbiAgICAgICAgfSk7XFxuICAgICAgICAvKlxcbiAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2hqZGhueC9oaXB5LXNlcnZlci90cmVlL21hc3Rlci9hcHAvdDQvZmlsZXMvZHJweV9qc1xcbiAgICAgICAgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2hqZGhueC9oaXB5LXNlcnZlci9tYXN0ZXIvYXBwL3Q0L2ZpbGVzL2RycHlfanMvMzYwJUU1JUJEJUIxJUU4JUE3JTg2JTVCJUU1JUFFJTk4JTVELmpzKi9cXG4gICAgfVxcbiAgICByZXR1cm4gcnVsZXM7XFxufVxcblxcbmZ1bmN0aW9uIHByZXBhcmUoY29uZmlnKSB7XFxuICAgIGxldCBkYXRhID0gaW5pdChjb25maWcpO1xcbiAgICBpZiAoIWRhdGEpIHJldHVybiBmYWxzZTtcXG4gICAgY3VycmVudFNvdXJjZSA9IGRhdGEuY3VycmVudFNvdXJjZTtcXG4gICAgc2VhcmNoQWxsb3cgPSBkYXRhLnNlYXJjaEFsbG93O1xcbiAgICBzb3VyY2VMaXN0ID0gZGF0YS5zb3VyY2VMaXN0O1xcbiAgICBjdXJyZW50Q29uZmlnID0gY29uZmlnO1xcbiAgICByZXR1cm4gdHJ1ZTtcXG59XFxuXFxuZnVuY3Rpb24gZmlsdGVyT3RoZXIobGlzdCkge1xcbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoaXQgPT4gU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLm1pbi5qc1xcXCIpIHx8IFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXCJkcnB5Mi5qc1xcXCIpKVxcbn1cXG5cXG5cXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29uZmlnKCkge1xcbiAgICByZXR1cm4gY3VycmVudENvbmZpZyB8fCB7fTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0Q3VycmVudENvbmZpZyhjb25maWcpIHtcXG4gICAgbGV0IGNwYXRoID0gKGN1cnJlbnRDb25maWcgfHwge30pLnBhdGg7XFxuICAgIGlmIChwcmVwYXJlKGNvbmZpZykpIHtcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcImN1cnJlbnRDb25maWdcXFwiLCBjb25maWcpO1xcbiAgICAgICAgaWYgKGNwYXRoICE9IGNvbmZpZy5wYXRoKSB7XFxuICAgICAgICAgICAgZGVsZXRlRmlsZShzZWFyY2hBbGxvd1BhdGgpO1xcbiAgICAgICAgICAgIHNlYXJjaEFsbG93ID0gW107XFxuICAgICAgICB9XFxuICAgICAgICBpc1ByZXBhcmUgPSB0cnVlO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZmluZFNvdXJjZShrZXkpIHtcXG4gICAgbGV0IHMgPSBzb3VyY2VMaXN0LmZpbmQodiA9PiB2LmtleSA9PT0ga2V5KTtcXG4gICAgaWYgKHMpIHtcXG4gICAgICAgIHMuZXh0ID0gZ2V0QWJzb2x1dGVQYXRoKFN0cmluZyhzLmV4dCkpO1xcbiAgICB9XFxuICAgIHJldHVybiBzO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRDdXJyZW50U291cmNlKCkge1xcbiAgICByZXR1cm4gY3VycmVudFNvdXJjZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Q3VycmVudFNvdXJjZVBhdGgoKSB7XFxuICAgIGxldCBwYXRoID0gU3RyaW5nKGN1cnJlbnRTb3VyY2UuZXh0KTtcXG4gICAgcmV0dXJuIGdldEFic29sdXRlUGF0aChwYXRoKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0QWJzb2x1dGVQYXRoKHBhdGgpIHtcXG4gICAgcGF0aCA9IFN0cmluZyhwYXRoKTtcXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpKSB7XFxuICAgICAgICByZXR1cm4gcGF0aDtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBqb2luVXJsKGN1cnJlbnRDb25maWcucGF0aCwgcGF0aCk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gc2V0Q3VycmVudFNvdXJjZShrZXkpIHtcXG4gICAgbGV0IHNvdXJjZSA9IHNvdXJjZUxpc3QuZmluZCh2ID0+IHYua2V5ID09PSBrZXkpO1xcbiAgICBpZiAoc291cmNlKSB7XFxuICAgICAgICBjdXJyZW50Q29uZmlnLmNLZXkgPSBrZXk7XFxuICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJjdXJyZW50Q29uZmlnXFxcIiwgY3VycmVudENvbmZpZyk7XFxuICAgICAgICBjdXJyZW50U291cmNlID0gc291cmNlO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH1cXG4gICAgcmV0dXJuIGZhbHNlO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRDYW5TZWFyY2hTb3VyY2UoKSB7XFxuICAgIHJldHVybiBzb3VyY2VMaXN0LmZpbHRlcih2ID0+IHYuc2VhcmNoYWJsZSA9PT0gdW5kZWZpbmVkIHx8IHYuc2VhcmNoYWJsZSk7XFxufVxcblxcbmZ1bmN0aW9uIGdldEFsbFNvdXJjZSgpIHtcXG4gICAgcmV0dXJuIHNvdXJjZUxpc3Quc2xpY2UoKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0QWxsU291cmNlcygpIHtcXG4gICAgcmV0dXJuIHNvdXJjZUxpc3Q7XFxufVxcblxcbmZ1bmN0aW9uIGdldFNlYXJjaEFsbG93KCkge1xcbiAgICByZXR1cm4gc2VhcmNoQWxsb3c7XFxufVxcblxcbmZ1bmN0aW9uIHNldFNlYXJjaEFsbG93KCkge1xcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWFyY2hBbGxvdykpIHtcXG4gICAgICAgIHNhdmVGaWxlKHNlYXJjaEFsbG93UGF0aCwgSlNPTi5zdHJpbmdpZnkoc2VhcmNoQWxsb3cpKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZXRBbGxvd1NlYXJjaFNvdXJjZSgpIHtcXG4gICAgbGV0IHNsaXN0O1xcbiAgICBpZiAoc2VhcmNoQWxsb3cubGVuZ3RoKSB7XFxuICAgICAgICBzbGlzdCA9IHNvdXJjZUxpc3QuZmlsdGVyKHYgPT4gc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHNsaXN0ID0gc291cmNlTGlzdC5maWx0ZXIodiA9PiB2LnNlYXJjaGFibGUpO1xcbiAgICB9XFxuICAgIGlmIChzbGlzdC5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgc2xpc3QgPSBzb3VyY2VMaXN0LnNsaWNlKCk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHNsaXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBpc1ByZXBhcmVkKCkge1xcbiAgICByZXR1cm4gaXNQcmVwYXJlO1xcbn1cXG5cXG5pc1ByZXBhcmUgPSBwcmVwYXJlKHN0b3JhZ2UwLmdldEl0ZW0oXFxcImN1cnJlbnRDb25maWdcXFwiLCB7fSkpO1xcbiQuZXhwb3J0cyA9IHtcXG4gICAgcHJlcGFyZSxcXG4gICAgZ2V0Q3VycmVudENvbmZpZyxcXG4gICAgc2V0Q3VycmVudENvbmZpZyxcXG4gICAgZ2V0Q3VycmVudFNvdXJjZSxcXG4gICAgZ2V0Q3VycmVudFNvdXJjZVBhdGgsXFxuICAgIHNldEN1cnJlbnRTb3VyY2UsXFxuICAgIGdldENhblNlYXJjaFNvdXJjZSxcXG4gICAgZ2V0U2VhcmNoQWxsb3csXFxuICAgIHNldFNlYXJjaEFsbG93LFxcbiAgICBnZXRBbGxTb3VyY2UsXFxuICAgIGdldEFsbG93U2VhcmNoU291cmNlLFxcbiAgICBpc1ByZXBhcmVkLFxcbiAgICBnZXRBYnNvbHV0ZVBhdGgsXFxuICAgIGdldEFsbFNvdXJjZXMsXFxuICAgIGZpbmRTb3VyY2VcXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi57yW6L6R6YWN572uXCIsXCJwYXRoXCI6XCJjcmVhdGVDb25maWdcIixcInJ1bGVcIjpcImpzOlxcbmxldCBsYXlvdXQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIuWIm+W7uumFjee9rlxcXCIpO1xcbmxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxubGV0IGN1cnJlbnRjb25maWcgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRDb25maWcoKTtcXG5sZXQgZiA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIik7XFxuICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiKTtcXG59KTtcXG5cXG4vL+WOhuWPsumFjee9ruiusOW9lVxcbmZ1bmN0aW9uIHVuaXF1ZUFycmF5QnlQcm9wZXJ0eShhcnJheSwgcHJvcGVydHkpIHtcXG4gIGxldCB1bmlxdWUgPSBbXTtcXG4gIGxldCBtYXAgPSBuZXcgTWFwKCk7XFxuICBmb3IgKGxldCBpdGVtIG9mIGFycmF5KSB7XFxuICAgIGxldCBrZXkgPSBpdGVtW3Byb3BlcnR5XTtcXG4gICAgaWYgKCFtYXAuaGFzKGtleSkpIHtcXG4gICAgICBtYXAuc2V0KGtleSwgdHJ1ZSk7XFxuICAgICAgdW5pcXVlLnB1c2goaXRlbSk7XFxuICAgIH1cXG4gIH1cXG4gIHJldHVybiB1bmlxdWU7XFxufVxcbmxldCBjcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0RycHlIaWtlci9cXFwiK1xcXCJkcnB5Y29uZmlnLmpzb25cXFwiO1xcbmxldCBvbGRwYXRoPVxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL1xcXCIgKyBcXFwiZHJweWNvbmZpZy5qc29uXFxcIlxcbmlmKCFmaWxlRXhpc3QoY3BhdGgpJiZmaWxlRXhpc3Qob2xkcGF0aCkpe1xcbiAgbGV0IGNvbnRlbnQgPSBKU09OLnBhcnNlKHJlYWRGaWxlKG9sZHBhdGgpKSB8fCBbXTtcXG4gIHNhdmVGaWxlKGNwYXRoLEpTT04uc3RyaW5naWZ5KGNvbnRlbnQpKTtcXG59XFxubGV0IHBhdGhjb25maWdzID0gW107XFxudHJ5IHtcXG4gIHBhdGhjb25maWdzID0gSlNPTi5wYXJzZShyZWFkRmlsZShjcGF0aCkpIHx8IFtdO1xcbiAgLy9wdXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ3NcXFwiLHBhdGhjb25maWdzKTtcXG59IGNhdGNoIChlKSB7XFxuICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpO1xcbn1cXG5wYXRoY29uZmlncyA9IHVuaXF1ZUFycmF5QnlQcm9wZXJ0eShwYXRoY29uZmlncywgXFxcInBhdGhcXFwiKTtcXG4vL2xvZyhwYXRoY29uZmlncylcXG5cXG5sZXQgY29uZmlnc19vYmogPSB7XFxuICBwYXRoOiBjcGF0aCxcXG4gIGNvbmZpZ3M6IHBhdGhjb25maWdzXFxufVxcbi8v5Y6G5Y+y6YWN572u6K6w5b2VXFxubGF5b3V0LnB1c2goe1xcbiAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgdGl0bGU6IFxcXCLmj5DnpLpcXFwiLFxcbiAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzI3LnBuZ1xcXCIsXFxuICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICBjb25zdCBoaWtlclBvcCA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Njk2NlxcXCIpO1xcbiAgICBsZXQgcG9wID0gaGlrZXJQb3AuaW5mb0JvdHRvbSh7XFxuICAgICAgY29udGVudDogXFxcIuivpue7hlxcXCIsXFxuICAgICAgb3B0aW9uczogW1xcbiAgICAgICAgXFxcIuesrOS4gOepuijlkI3np7ApOuaWueS+v+S4i+asoeaJvuWIsFxcXCIsXFxuICAgICAgICBcXFwi56ys5LqM56m6KOi3r+W+hClb5aGr5pys5Zyw57Si5byV5Zyw5Z2AXTrpgInmi6lKU09OL1VSTOmAiemhue+8jOeCueWHu+aXgei+ueeahOmAieaLqeWPr+S7pea1j+iniOacrOWcsOaWh+S7tumAieaLqeacrOWcsOWMheeahC5qc29u57Si5byV5paH5Lu25Y2z5Y+v44CCXFxcXG4o5rOo5oSP77ya5L2/55So5q2k56eN5pa55byP77yM5Zyo5pys5Zyw5paH5Lu25aS55YaF5paw5aKe5oiW5Yig6ZmkLmpz5rqQ5pe26ZyA6KaB6Ieq6KGM5Yia5YiaLmpzb27phY3nva7mlofku7YpXFxcIixcXG4gICAgICAgIFxcXCLnrKzkuoznqboo6Lev5b6EKVvloavmnKzloavov5znqIvlnLDlnYBdOuebtOaOpeWhq+WGmei/nOeoi+mTvuaOpeWNs+WPr+S4gOiIrOaYr+S7pWh0dHDlvIDlpLQuanNvbue7k+Wwvu+8jOS5n+WPr+WPr+S7pei+k+WFpWdpdGh1YuS7k+W6k+eahOaWh+S7tuWkueWcsOWdgOOAguatpOenjeaWueW8j+WPr+S7peS/neaMgeS4jui/nOeoi+mFjee9ruiAheWQjOatpeabtOaWsO+8jOS9huS4jeWmguacrOWcsOW/q+OAglxcXCIsXFxuICAgICAgICBcXFwi56ys5LqM56m6KOi3r+W+hClb5aGr5pys5Zyw5paH5Lu25aS55Zyw5Z2AXTrpgInmi6nmlofku7blpLnpgInpobnvvIzlj6/ku6Xnm7TmjqXovpPlhaVqc+a6kOaJgOWcqCPmlofku7blpLkhISEj55qE6Lev5b6E77yM5Lmf5Y+v5Lul54K55Ye75peB6L656YCJ5oup5rWP6KeI5pys5Zyw6Lev5b6E6YCJ5oupI+aWh+S7tuWkuSEhISPvvIzkvb/nlKjor6Xnp43mlrnms5XvvIzlnKjmlofku7blpLnmlrDlop7miJbliKDpmaTmupDml7bvvIzkuI3nlKjmiYvliqjphY3nva4uanNvbuaWh+S7tu+8jOiHquWKqOivu+WPluOAgijms6jmhI/vvJrpnIDopoHliLfmlrDphY3nva7miJbph43lkK/ova/ku7bmiY3og73or7vlj5YpXFxcIixcXG4gICAgICAgIFxcXCJbUSZBXeS4uuS7gOS5iOiuoumYhemTvuaOpeacieW+iOWkmua6kO+8jOWNtOWPquivhuWIq+WIsOS6huWHoOS4qua6kO+8n1xcXFxu5pys5bCP56iL5bqP5Y+q5pSv5oyB6YGT6ZW/55qEZHJweVtqc13op4bpopHmupDvvIzlhbbku5bkuIDmpoLkuI3mlK/mjIHjgILlm6DmraTkvJroh6rliqjov4fmu6Tlhbbku5bmupBcXFwiLFxcbiAgICAgICAgXFxcIltRJkFd5omT566X5pSv5oyB5YW25LuWdHZib3jnmoTmupDlkJfvvJ/kuI3mlK/mjIHkuI3ogIPomZHjgILor7fnnIvlkI3lrZdEcnB5SGlrZXLvvIzlj6rmlK/mjIFkcnB577yM6KaB55So5YW25LuW5rqQ77yM5bu66K6u5Yig6Zmk5pys5bCP56iL5bqP77yM5Y6755So5ZCE56eN5aOz5a2Q44CCXFxcIlxcbiAgICAgIF1cXG4gICAgfSk7XFxuICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICB9KSxcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gIGRlc2M6IFxcXCLlkI3np7Ao5b+F5aGrKVxcXCIsXFxuICBleHRyYToge1xcbiAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiLCBcXFwiXFxcIiksXFxuICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIiwgaW5wdXQpO1xcbiAgICB9KSxcXG4gICAgaWQ6IFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiXFxuICB9XFxufSk7XFxuXFxubGV0IHNlbGVjdF9tb2RlID0gZ2V0SXRlbShcXFwic2VsZWN0X2NvbmZpZ19tb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgbmF2ID0gW1xcXCJKU09OL1VSTFxcXCIsIFxcXCLmlofku7blpLlcXFwiXTtcXG5cXG5uYXYuZm9yRWFjaCgoeCwgaSkgPT4ge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAoaSA9PSBzZWxlY3RfbW9kZSA/IHguZm9udGNvbG9yKFxcXCIjMTVCNzZDXFxcIikgOiB4KSxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpKSA9PiB7XFxuICAgICAgc2V0SXRlbShcXFwic2VsZWN0X2NvbmZpZ19tb2RlXFxcIiwgaSArIFxcXCJcXFwiKTtcXG4gICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIGkpLFxcbiAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgfSlcXG59KVxcblxcblxcbmxldCBwYXRoID0gam9pblVybChnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpLCBcXFwiLi4vXFxcIi5yZXBlYXQoNSkpLnNsaWNlKDcpO1xcblxcbmlmIChzZWxlY3RfbW9kZSA9PSBcXFwiMFxcXCIpIHtcXG4gIGxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpgInmi6lcXFwiLFxcbiAgICB1cmw6IEpTT04uc3RyaW5naWZ5KGYuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiKS5leHRyYTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIsIHtcXG4gICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgIH0pLFxcbiAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbiAgICAgIHBhdHRlcm46IDAsXFxuICAgICAgZmlsZVR5cGU6IFxcXCIuanNvblxcXCIsXFxuICAgIH0pKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLot6/lvoQoVVJML0pTT04vZ2l0aHViKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwgaW5wdXQpO1xcbiAgICAgIH0pLFxcbiAgICAgIGlkOiBcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIlxcbiAgICB9XFxuICB9KTtcXG59XFxuaWYgKHNlbGVjdF9tb2RlID09IFxcXCIxXFxcIikge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfZm9sZGVyXFxcIikuZXh0cmE7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJkcnB5SGlrZXJfY29uZmlnX2ZvbGRlclxcXCIsIHtcXG4gICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgIH0pLFxcbiAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbiAgICAgIHBhdHRlcm46IDEsXFxuICAgICAgLy9maWxlVHlwZTogXFxcIi5qc29uXFxcIixcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIui3r+W+hCjmlofku7blpLkpXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiLCBpbnB1dCk7XFxuICAgICAgfSksXFxuICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfY29uZmlnX2ZvbGRlclxcXCJcXG4gICAgfVxcbiAgfSk7XFxufVxcbmxheW91dC5wdXNoKHtcXG4gIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICB0aXRsZTogXFxcIuehruiupFxcXCIsXFxuICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGNvYmopID0+IHtcXG4gICAgbGV0IHBhdGggPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwgXFxcIlxcXCIpO1xcbiAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiLCBcXFwiXFxcIik7XFxuICAgIGlmICghKHBhdGggJiYgbmFtZSkpIHtcXG4gICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5Y+v5Li656m6XFxcIjtcXG4gICAgfVxcbiAgICBwYXRoID0gcGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikgPyBwYXRoIDogcGF0aC5zdGFydHNXaXRoKFxcXCIvXFxcIikgPyAoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCkgOiBwYXRoO1xcbiAgICAvL2xvZyhwYXRoKVxcbiAgICB0cnkge1xcbiAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5Yqg6L296YWN572uLi4uXFxcIik7XFxuICAgICAgfVxcblxcbiAgICAgIGlmIChydW50aW1lQ29uZmlnLnNldEN1cnJlbnRDb25maWcoe1xcbiAgICAgICAgcGF0aCxcXG4gICAgICAgIG5hbWUsXFxuICAgICAgfSkpIHtcXG4gICAgICAgIGNvYmouY29uZmlncy5wdXNoKHtcXG4gICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgbmFtZSxcXG4gICAgICAgIH0pXFxuICAgICAgICBjbGVhckl0ZW0oXFxcIm5vX2xvYWRpbmdcXFwiKTtcXG4gICAgICAgIHNhdmVGaWxlKGNvYmoucGF0aCwgSlNPTi5zdHJpbmdpZnkoY29iai5jb25maWdzKSk7XFxuXFxuICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgRHJweU1hbmFnZS5jbGVhcigpO1xcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICAkLnJlcXVpcmUoXFxcIkNoYW5nZVNvdXJjZVBvcFxcXCIpLnNob3coMTAwKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YWN572u5paH5Lu25pyJ6K+vXFxcIjtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgZS50b1N0cmluZygpO1xcbiAgICB9IGZpbmFsbHkge1xcbiAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgIH1cXG4gIH0sIGNvbmZpZ3Nfb2JqKSxcXG4gIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxufSk7XFxuXFxuaWYgKHBhdGhjb25maWdzLmxlbmd0aCkge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyBcXFwiPHNtYWxsPuWOhuWPsumFjee9ruiusOW9lSDngrnmiJHov5vooYzphY3nva7mo4Dpqow8L3NtYWxsPlxcXCIsXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgocCkgPT4ge1xcbiAgICAgIC8vbG9nKHApXFxuICAgICAgZnVuY3Rpb24gdW5pcXVlKGFycikge1xcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IE1hcCgpO1xcbiAgICAgICAgcmV0dXJuIGFyci5maWx0ZXIoKGEpID0+ICFyZXMuaGFzKGEpICYmIHJlcy5zZXQoYSwgMSkpXFxuICAgICAgfVxcbiAgICAgIHZhciByZXN1bHRzID0gW107XFxuICAgICAgaWYgKHAubGVuZ3RoID09IDApIHtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ml6DlnLDlnYBcXFwiO1xcbiAgICAgIH1cXG4gICAgICBsaXN0ID0gcC5tYXAoeCA9PiB4LnBhdGgpO1xcbiAgICAgIHZhciB0YXNrID0gZnVuY3Rpb24gKG9iaikge1xcbiAgICAgICAgbGV0IHMgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgbGV0IGpzRmlsZXMgPSBbXTtcXG4gICAgICAgIGxldCBjb3VudCA9IDA7XFxuXFxuICAgICAgICBmdW5jdGlvbiBmaWx0ZXJPdGhlcihsaXN0KSB7XFxuICAgICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihpdCA9PiBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIubWluLmpzXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLmpzXFxcIikpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAob2JqLnVybC5zdGFydHNXaXRoKFxcXCJmaWxlOlxcXCIpKSB7XFxuICAgICAgICAgIGxldCBjb2RlID0gXFxcIm5vXFxcIjtcXG4gICAgICAgICAgbGV0IHBhdGggPSBvYmoudXJsLnJlcGxhY2UoXFxcImZpbGU6Ly9cXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgIGxldCBkaXIgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgpO1xcbiAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHtcXG4gICAgICAgICAgICBsZXQgZmxpc3QgPSBkaXIubGlzdEZpbGVzKCk7XFxuICAgICAgICAgICAgZm9yICh2YXIgZiBvZiBmbGlzdCkge1xcbiAgICAgICAgICAgICAgLy8g5qOA5p+l5paH5Lu25ZCN5piv5ZCm5LulLmpz57uT5bC+XFxuICAgICAgICAgICAgICBpZiAoZi5pc0ZpbGUoKSAmJiBmLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkge1xcbiAgICAgICAgICAgICAgICBqc0ZpbGVzLnB1c2goZik7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChkaXIuaXNGaWxlKCkgJiYgZmlsZUV4aXN0KG9iai51cmwpKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgIGpzb24gPSBKU09OLnBhcnNlKHJlYWRGaWxlKG9iai51cmwpKTtcXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpIHx8IGpzb24uc2l0ZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIGNvdW50ID0gZmlsdGVyT3RoZXIoanNvbi5zaXRlcykubGVuZ3RoO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxcbiAgICAgICAgICAgIGNvZGUgPSBcXFwib2tcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChqc0ZpbGVzLmxlbmd0aCA+PSA1KSB7XFxuICAgICAgICAgICAgY291bnQgPSBqc0ZpbGVzLmxlbmd0aDtcXG4gICAgICAgICAgICBjb2RlID0gXFxcIm9rXFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgIHRpbWU6IChEYXRlLm5vdygpIC0gcyksXFxuICAgICAgICAgICAgdXJsOiBvYmoudXJsLFxcbiAgICAgICAgICAgIGNvdW50OiBjb3VudCxcXG4gICAgICAgICAgICBjb2RlOiBjb2RlLFxcbiAgICAgICAgICAgIGluZGV4OiBvYmouaVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgaiA9IEpTT04ucGFyc2UoZmV0Y2gob2JqLnVybCwge1xcbiAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZSxcXG4gICAgICAgICAgdGltZW91dDogNTAwMCxcXG4gICAgICAgIH0pKTtcXG4gICAgICAgIGxldCBlID0gRGF0ZS5ub3coKTtcXG4gICAgICAgIGxldCBjID0gZSAtIHM7XFxuICAgICAgICBpZiAob2JqLnVybC5pbmNsdWRlcyhcXFwiZ2l0aHViLmNvbVxcXCIpICYmIGouc3RhdHVzQ29kZSA9PSAyMDApIHtcXG4gICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICB2YXIgaHRtbCA9IGouYm9keTtcXG4gICAgICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2UocGRmaChodG1sLCBcXFwiI3JlcG8tY29udGVudC1wamF4LWNvbnRhaW5lciYmc2NyaXB0JiZIdG1sXFxcIikpO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0ganNvbi5wYXlsb2FkLnRyZWUuaXRlbXM7XFxuICAgICAgICAgICAgY291bnQgPSBsaXN0LmZpbHRlcih4ID0+IHgubmFtZS5lbmRzV2l0aChcXFwiLmpzXFxcIikpLmxlbmd0aDtcXG4gICAgICAgICAgfSBjYXRjaCB7IH1cXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZSh0b0NvcnJlY3RKU09OU3RyaW5nKGouYm9keSkgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpIHx8IGpzb24uc2l0ZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgY291bnQgPSBmaWx0ZXJPdGhlcihqc29uLnNpdGVzKS5sZW5ndGg7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxcblxcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgdGltZTogYyxcXG4gICAgICAgICAgdXJsOiBqLnVybCxcXG4gICAgICAgICAgY291bnQ6IGNvdW50LFxcbiAgICAgICAgICBjb2RlOiBqLnN0YXR1c0NvZGUsXFxuICAgICAgICAgIGluZGV4OiBvYmouaSxcXG4gICAgICAgIH1cXG4gICAgICB9O1xcbiAgICAgIGxldCB0YXNrcyA9IGxpc3QubWFwKCh4LCBpKSA9PiB7XFxuICAgICAgICBpID0gaSArIDE7XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICBmdW5jOiB0YXNrLFxcbiAgICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICAgIHVybDogeCxcXG4gICAgICAgICAgICBpOiBpIC0gMSxcXG4gICAgICAgICAgfSxcXG4gICAgICAgICAgaWQ6ICd0YXNraWQnICsgaVxcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICAgIHZhciBjb3VudCA9IHN1Y2Nlc3MgPSB0YXNrcy5sZW5ndGg7XFxuICAgICAgYmUodGFza3MsIHtcXG4gICAgICAgIGZ1bmM6IGZ1bmN0aW9uIChvYmosIGlkLCBlcnJvciwgdGFza1Jlc3VsdCkge1xcbiAgICAgICAgICBvYmoucmVzdWx0cy5wdXNoKHRhc2tSZXN1bHQpXFxuICAgICAgICAgIGNvdW50ID0gY291bnQgLSAxO1xcbiAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XFxuICAgICAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuajgOa1i+S4rS4uLuWJqeS9meWcsOWdgO+8mlxcXCIgKyBjb3VudClcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgICAgcGFyYW06IHtcXG4gICAgICAgICAgaGk6ICdjY2MnLFxcbiAgICAgICAgICByZXN1bHRzOiByZXN1bHRzXFxuICAgICAgICB9XFxuICAgICAgfSwgc3VjY2Vzcyk7XFxuICAgICAgLy9sb2cocmVzdWx0cylcXG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoZiA9PiBmKTtcXG4gICAgICByZXN1bHRzLmZvckVhY2goKHgsIGkpID0+IHtcXG4gICAgICAgIGxldCBpdGVtID0gZmluZEl0ZW0oXFxcInBhdGhcXFwiICsgeC5pbmRleCk7XFxuICAgICAgICBsZXQgcmVnZXggPSAvKOWQjeensDouKj8pKFxcXFxzKyk/XFxcXG4vZztcXG4gICAgICAgIGxldCB0aXRsZSA9IFxcXCLlkI3np7A6XFxcIiArIHBbeC5pbmRleF0ubmFtZSArIFxcXCIgXFxcIjtcXG4gICAgICAgIGxldCB1cmwgPSBwW3guaW5kZXhdLnBhdGg7XFxuICAgICAgICBsZXQgbXNnID0gXFxcIlxcXCI7XFxuICAgICAgICBsZXQgY291bnQgPSB4LmNvdW50ICE9IDAgPyBcXFwiIOa6kOaVsOmHjzpcXFwiICsgeC5jb3VudCA6IFxcXCJcXFwiO1xcbiAgICAgICAgaWYgKC9uby8udGVzdCh4LmNvZGUpKSB7XFxuICAgICAgICAgIG1zZyA9IGl0ZW0udGl0bGUucmVwbGFjZShyZWdleCwgdGl0bGUgKyBcXFwi6YWN572u5pyJ6K+vXFxcIi5mb250Y29sb3IoXFxcInJlZFxcXCIpICsgXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICB9IGVsc2UgaWYgKC9eKC0xfDB8NDA0KS8udGVzdCh4LmNvZGUpKSB7XFxuICAgICAgICAgIG1zZyA9IGl0ZW0udGl0bGUucmVwbGFjZShyZWdleCwgdGl0bGUgKyBcXFwi5peg5rOV6K6/6ZeuXFxcIi5mb250Y29sb3IoXFxcInJlZFxcXCIpICsgXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICB9IGVsc2UgaWYgKC9eMjAwLy50ZXN0KHguY29kZSkpIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLpgJrorq/mraPluLhcXFwiLmZvbnRjb2xvcihcXFwiIzNDQjM3MVxcXCIpICsgXFxcIiAg5bu26L+fOlxcXCIgKyB4LnRpbWUgKyBjb3VudCArIFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgICAvL3VybCA9IGl0ZW0udXJsO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLphY3nva7mraPnoa5cXFwiLmZvbnRjb2xvcihcXFwiIzNDQjM3MVxcXCIpICsgY291bnQgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgICAgLy91cmwgPSBpdGVtLnVybDtcXG4gICAgICAgIH1cXG4gICAgICAgIHVwZGF0ZUl0ZW0oaXRlbS5leHRyYS5pZCwge1xcbiAgICAgICAgICB0aXRsZTogbXNnLFxcbiAgICAgICAgICAvL3VybDogdXJsLFxcbiAgICAgICAgfSlcXG4gICAgICB9KTtcXG4gICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgIH0sIHBhdGhjb25maWdzKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgfSlcXG4gIHBhdGhjb25maWdzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgbGV0IGxvbmdDID0gW3tcXG4gICAgICB0aXRsZTogXFxcIuWQjeensFxcXCIsXFxuICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0sIHAsIGMpID0+IHtcXG4gICAgICAgIGxldCBpID0gYy5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gaXRlbS5uYW1lKTtcXG4gICAgICAgIGlmIChpICE9IC0xKSB7XFxuICAgICAgICAgIHJldHVybiAkKGNbaV0ubmFtZSwgXFxcIui+k+WFpeaWsOWQjeensFxcXCIpLmlucHV0KChjLCBwLCBpKSA9PiB7XFxuICAgICAgICAgICAgY1tpXS5uYW1lID0gaW5wdXQ7XFxuICAgICAgICAgICAgc2F2ZUZpbGUocCwgSlNPTi5zdHJpbmdpZnkoYykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIH0sIGMsIHAsIGkpXFxuICAgICAgICB9XFxuICAgICAgfSwgaXRlbSwgY3BhdGgsIHBhdGhjb25maWdzKVxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6IFxcXCLot6/lvoRcXFwiLFxcbiAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtLCBwLCBjKSA9PiB7XFxuICAgICAgICBsZXQgaSA9IGMuZmluZEluZGV4KHggPT4geC5uYW1lID09IGl0ZW0ubmFtZSk7XFxuICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICByZXR1cm4gJChjW2ldLnBhdGgsIFxcXCLovpPlhaXmlrDot6/lvoRcXFwiKS5pbnB1dCgoYywgcCwgaSkgPT4ge1xcbiAgICAgICAgICAgIGNbaV0ucGF0aCA9IGlucHV0O1xcbiAgICAgICAgICAgIHNhdmVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KGMpKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICB9LCBjLCBwLCBpKVxcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0sIGNwYXRoLCBwYXRoY29uZmlncylcXG4gICAgfSwge1xcbiAgICAgIHRpdGxlOiBcXFwi5Yig6ZmkXFxcIixcXG4gICAgICBqczogJC50b1N0cmluZygoaXRlbSwgcCwgYykgPT4ge1xcbiAgICAgICAgbGV0IGkgPSBjLmZpbmRJbmRleCh4ID0+IHgubmFtZSA9PSBpdGVtLm5hbWUpO1xcbiAgICAgICAgaWYgKGkgIT0gLTEpIHtcXG4gICAgICAgICAgYy5zcGxpY2UoaSwgMSk7XFxuICAgICAgICAgIHNhdmVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KGMpKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH1cXG4gICAgICB9LCBpdGVtLCBjcGF0aCwgcGF0aGNvbmZpZ3MpXFxuICAgIH1dXFxuICAgIGlmIChpdGVtLnBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgbG9uZ0MucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuiuv+mXrlxcXCIsXFxuICAgICAgICBqczogJC50b1N0cmluZygoaXRlbSkgPT4ge1xcbiAgICAgICAgICBpZiAoaXRlbS5wYXRoLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwid2ViOi8vXFxcIiArIGl0ZW0ucGF0aDtcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSwgaXRlbSlcXG4gICAgICB9KVxcbiAgICB9XFxuICAgIGxldCBjdXJyZW50ID0gXFxcIlxcXCI7XFxuICAgIGlmIChjdXJyZW50Y29uZmlnICYmIGN1cnJlbnRjb25maWcuaGFzT3duUHJvcGVydHkoXFxcInBhdGhcXFwiKSkge1xcbiAgICAgIGlmIChpdGVtLnBhdGggPT0gY3VycmVudGNvbmZpZy5wYXRoKSB7XFxuICAgICAgICBjdXJyZW50ID0gXFxcIuKeoe+4j1xcXCI7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyBcXFwiPHNtYWxsPlxcXCIgKyBjdXJyZW50ICsgXFxcIuWQjeensDpcXFwiICsgaXRlbS5uYW1lICsgXFxcIlxcXFxu6Lev5b6EOlxcXCIgKyBpdGVtLnBhdGggKyBcXFwiPC9zbWFsbD5cXFwiLFxcbiAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShpdGVtID0+IHtcXG4gICAgICAgIGNsZWFySXRlbShcXFwibm9fbG9hZGluZ1xcXCIpO1xcbiAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgIGxldCB7XFxuICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgIG5hbWVcXG4gICAgICAgIH0gPSBpdGVtO1xcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjliqDovb3phY3nva4uLi5cXFwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChydW50aW1lQ29uZmlnLnNldEN1cnJlbnRDb25maWcoe1xcbiAgICAgICAgICBwYXRoLFxcbiAgICAgICAgICBuYW1lLFxcbiAgICAgICAgfSkpIHtcXG5cXG4gICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgRHJweU1hbmFnZS5jbGVhcigpO1xcbiAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgJC5yZXF1aXJlKFxcXCJDaGFuZ2VTb3VyY2VQb3BcXFwiKS5zaG93KDEwMCk7XFxuICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5YiH5o2i5aSx6LSlXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICB9LCBpdGVtKSxcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiAncGF0aCcgKyBpLFxcbiAgICAgICAgbG9uZ0NsaWNrOiBsb25nQ1xcbiAgICAgIH1cXG4gICAgfSlcXG4gIH0pXFxufVxcblxcblxcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5o2i5rqQ5by556qXXCIsXCJwYXRoXCI6XCJDaGFuZ2VTb3VyY2VQb3BcIixcInJ1bGVcIjpcIiQuZXhwb3J0cy5zaG93ID0gZnVuY3Rpb24gKHRpbWUpIHtcXG4gIGlmICh0aW1lKSB7XFxuICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAodGltZSk7XFxuICB9XFxuICBjb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XFxuICBsZXQgbmFtZSA9IHNvdXJjZSA/IHNvdXJjZS5uYW1lIDogXFxcIlxcXCI7XFxuICBjb25zdCBoaWtlclBvcCA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Njk2NlxcXCIpO1xcbiAgbGV0IHNvdXJjZU5hbWVMaXN0ID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKS5tYXAodiA9PiB7XFxuICAgIHJldHVybiB2Lm5hbWUgPT0gbmFtZSA/IFxcXCLigJjigJhcXFwiICsgdi5uYW1lICsgXFxcIuKAmeKAmVxcXCIgOiB2Lm5hbWU7XFxuICB9KTtcXG4gIGhpa2VyUG9wLnNldFVzZVN0YXJ0QWN0aXZpdHkoZmFsc2UpO1xcblxcbiAgZnVuY3Rpb24gbmF0dXJhbFNvcnQoYSwgYikge1xcbiAgICBhID0gYS5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIik7XFxuICAgIGIgPSBiLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKTtcXG4gICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiLCB1bmRlZmluZWQsIHtcXG4gICAgICBudW1lcmljOiB0cnVlLFxcbiAgICAgIHNlbnNpdGl2aXR5OiAnYmFzZSdcXG4gICAgfSk7XFxuICB9XFxuICAvL+S9v+eUqOaOkuW6j1xcbiAgbGV0IHVzaW5nU29ydCA9IHtcXG4gICAgbmFtZTogXFxcInVzaW5nU29ydC5qc29uXFxcIixcXG4gICAgcGF0aDogXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvRHJweUhpa2VyL1xcXCIsXFxuICAgIHNhdmUoY29udGVudCkge1xcbiAgICAgIHNhdmVGaWxlKHRoaXMucGF0aCArIHRoaXMubmFtZSwgY29udGVudCk7XFxuICAgIH0sXFxuICAgIGluaXQoKSB7XFxuICAgICAgbGV0IGpzb24gPSB7fTtcXG4gICAgICBpZiAoIWZpbGVFeGlzdCh0aGlzLnBhdGggKyB0aGlzLm5hbWUpKSB7XFxuICAgICAgICB0aGlzLnNhdmUoXFxcInt9XFxcIik7XFxuICAgICAgfVxcbiAgICAgIHRyeSB7XFxuICAgICAgICBqc29uID0gSlNPTi5wYXJzZShyZWFkRmlsZSh0aGlzLnBhdGggKyB0aGlzLm5hbWUpKTtcXG4gICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBqc29uID0ge307XFxuICAgICAgICB0aGlzLnNhdmUoXFxcInt9XFxcIik7XFxuICAgICAgfVxcbiAgICAgIHJldHVybiBqc29uO1xcbiAgICB9LFxcbiAgICBzb3J0S2V5c0J5VXNhZ2UoanNvbiwga2V5cykge1xcbiAgICAgIHJldHVybiBrZXlzLnNvcnQoKGEsIGIpID0+IHtcXG4gICAgICAgIGEgPSBhLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKTtcXG4gICAgICAgIGIgPSBiLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKTtcXG4gICAgICAgIGxldCBBID0ganNvblthXSB8fCAwO1xcbiAgICAgICAgbGV0IEIgPSBqc29uW2JdIHx8IDA7XFxuICAgICAgICBpZiAoQiAtIEEgIT0gMCkge1xcbiAgICAgICAgICByZXR1cm4gQiAtIEE7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICByZXR1cm4gbmF0dXJhbFNvcnQoYSwgYik7XFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgIH0sXFxuICAgIGdldChrZXlzKSB7XFxuICAgICAgbGV0IGpzb24gPSB0aGlzLmluaXQoKTtcXG4gICAgICByZXR1cm4gdGhpcy5zb3J0S2V5c0J5VXNhZ2UoanNvbiwga2V5cyk7XFxuICAgIH0sXFxuICAgIHNldChrZXkpIHtcXG4gICAgICBsZXQganNvbiA9IHRoaXMuaW5pdCgpO1xcbiAgICAgIGlmIChqc29uLmhhc093blByb3BlcnR5KGtleSkpIHtcXG4gICAgICAgIGpzb25ba2V5XSArPSAxO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBqc29uW2tleV0gPSAxO1xcbiAgICAgIH1cXG4gICAgICB0aGlzLnNhdmUoSlNPTi5zdHJpbmdpZnkoanNvbikpO1xcbiAgICB9XFxuICB9XFxuXFxuICBsZXQgc3BlbiA9IDM7XFxuICBsZXQgaXRlbXMgPSBzb3VyY2VOYW1lTGlzdC5tYXAoKHgsIGkpID0+IHtcXG4gICAgcmV0dXJuIHtcXG4gICAgICB0aXRsZTogeCxcXG4gICAgICB1cmw6IGlcXG4gICAgfVxcbiAgfSlcXG5cXG4gIGxldCBuYW1lcyA9IGl0ZW1zLm1hcCh2ID0+IHYudGl0bGUpO1xcbiAgbGV0IHNuYW1lID0gbmFtZXMuc2xpY2UoKTtcXG4gIGlmIChnZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgXFxcIlxcXCIpKSB7XFxuICAgIG5hbWVzID0gbmFtZXMuc29ydChuYXR1cmFsU29ydCk7XFxuICB9XFxuICBpZiAoZ2V0SXRlbShcXFwidXNpbmdzdFxcXCIsIFxcXCJcXFwiKSkge1xcbiAgICBuYW1lcyA9IHVzaW5nU29ydC5nZXQobmFtZXMpO1xcbiAgfVxcblxcbiAgbGV0IG1hbmFnZV9hbGwgPSBuYW1lcy5zbGljZSgpO1xcbiAgbGV0IHNlYXJjaEtleSA9IFxcXCJcXFwiO1xcbiAgbGV0IHBvcCA9IGhpa2VyUG9wLnNlbGVjdEJvdHRvbVJlcyh7XFxuICAgIG9wdGlvbnM6IG5hbWVzLFxcbiAgICBjb2x1bW5zOiBzcGVuLFxcbiAgICB0aXRsZTogXFxcIumAieaLqeinhumikea6kCDlvZPliY3lhbE6XFxcIiArIGl0ZW1zLmxlbmd0aCArIFxcXCLkuKrop4bpopHmupBcXFwiLFxcbiAgICBub0F1dG9EaXNtaXNzOiB0cnVlLFxcbiAgICBwb3NpdGlvbjogMSxcXG4gICAgZXh0cmFJbnB1dEJveDogbmV3IGhpa2VyUG9wLlJlc0V4dHJhSW5wdXRCb3goe1xcbiAgICAgIGhpbnQ6IFxcXCLmupDlhbPplK7lrZdcXFwiLFxcbiAgICAgIHRpdGxlOiBcXFwib2tcXFwiLFxcbiAgICAgIG9uQ2hhbmdlKHRleHQsIG1hbmFnZSkge1xcbiAgICAgICAgLy9sb2coXFxcIm9uQ2hhbmdlOlxcXCIrdGV4dClcXG4gICAgICAgIGxldCBmbGlzdCA9IG5hbWVzLmZpbHRlcih4ID0+IHguaW5jbHVkZXModGV4dCkpO1xcbiAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgIGZsaXN0LmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICB9KTtcXG4gICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICB9LFxcbiAgICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgICAgY2xpY2socywgbWFuYWdlKSB7XFxuICAgICAgICAvL3RvYXN0KHMpO1xcbiAgICAgICAgLy9sb2cobWFuYWdlLmxpc3QpO1xcbiAgICAgIH0sXFxuICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICB9KSxcXG4gICAgbG9uZ0NsaWNrKHMsIGkpIHtcXG4gICAgICBzaG93U2VsZWN0T3B0aW9ucyh7XFxuICAgICAgICB0aXRsZTogXFxcIuWIhuS6q+inhumikea6kFxcXCIsXFxuICAgICAgICBvcHRpb25zOiBbXFxcIkpT5paH5Lu25YiG5LqrXFxcIl0uY29uY2F0KGdldFBhc3RlcygpKSxcXG4gICAgICAgIGNvbDogMixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKG5hbWUgPT4ge1xcbiAgICAgICAgICBjb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgIGxldCBzb3VyY2VzID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKTtcXG4gICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZXMuZmluZCh2ID0+IHYubmFtZSA9PSBuYW1lKTtcXG4gICAgICAgICAgbGV0IHBhdGggPSBydW50aW1lQ29uZmlnLmdldEFic29sdXRlUGF0aChzb3VyY2UuZXh0KTtcXG4gICAgICAgICAgbGV0IHBuYW1lID0gcGF0aC5zcGxpdChcXFwiL1xcXCIpLmF0KC0xKTtcXG4gICAgICAgICAgbGV0IHJ1bGUgPSBmZXRjaChwYXRoKTtcXG4gICAgICAgICAgbGV0IGVuY29kZU1vZGUgPSBnZXRJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgIGlmIChlbmNvZGVNb2RlICYmIC92YXIgcnVsZXxbXFxcXHU0RTAwLVxcXFx1OUZBNV0rfGZ1bmN0aW9ufGxldCB8dmFyIHxjb25zdCB8XFxcXCh8XFxcXCl8XFxcInwnLy50ZXN0KHJ1bGUpKSB7XFxuICAgICAgICAgICAgaWYgKGVuY29kZU1vZGUgPT09IFxcXCJHemlwXFxcIikge1xcbiAgICAgICAgICAgICAgbGV0IEdaSVAgPSAkLnJlcXVpcmUoXFxcIkdaSVBcXFwiKTtcXG4gICAgICAgICAgICAgIHJ1bGUgPSBHWklQLnppcChydWxlKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVuY29kZU1vZGUgPT09IFxcXCJCYXNlNjRcXFwiKSB7XFxuICAgICAgICAgICAgICBydWxlID0gYmFzZTY0RW5jb2RlKHJ1bGUpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RlTW9kZSA9PT0gXFxcIkFFU1xcXCIpIHtcXG4gICAgICAgICAgICAgIGNvbnN0IENyeXB0b1V0aWwgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vYXNzZXRzL2NyeXB0by1qYXZhLmpzXFxcIik7XFxuICAgICAgICAgICAgICBsZXQga2V5ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KFxcXCI2ODZBNjQ2ODZFNzgwQTBBMEEwQTBBMEEwQTBBMEEwQVxcXCIpO1xcbiAgICAgICAgICAgICAgbGV0IGl2ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KFxcXCI2NDdBNzk3OTY0NzMwQTBBMEEwQTBBMEEwQTBBMEEwQVxcXCIpO1xcbiAgICAgICAgICAgICAgbGV0IHRleHREYXRhID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlVVRGOChydWxlKTtcXG4gICAgICAgICAgICAgIGxldCBlbmNyeXB0ZWQwID0gQ3J5cHRvVXRpbC5BRVMuZW5jcnlwdCh0ZXh0RGF0YSwga2V5LCB7XFxuICAgICAgICAgICAgICAgIG1vZGU6IFxcXCJBRVMvQ0JDL1BLQ1M3UGFkZGluZ1xcXCIsXFxuICAgICAgICAgICAgICAgIGl2OiBpdlxcbiAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICBydWxlID0gZW5jcnlwdGVkMC50b0Jhc2U2NChfYmFzZTY0Lk5PX1dSQVApO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAoIXJ1bGUpIHJldHVybiBcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFwiO1xcbiAgICAgICAgICBpZiAoTVlfSU5ERVggPT09IDApIHtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL1xcXCIgKyBwbmFtZSwgcnVsZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJzaGFyZTovL2hpa2VyOi8vZmlsZXMvX2NhY2hlL1xcXCIgKyBwbmFtZTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gc2hhcmVQYXN0ZShiYXNlNjRFbmNvZGUocnVsZSksIGlucHV0KTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly/mtbfpmJTop4bnlYzvvIxEUlBZ6KeG6aKR5rqQ44CMXFxcIiArIG5hbWUgKyBcXFwi44CN5aSN5Yi25pW05p2h5Y+j5Luk5omT5byA6L2v5Lu25bCx5Lya6Ieq5Yqo5a+85YWlJFxcXCIgKyB1cmwgKyBcXFwiJFxcXCIgKyBwbmFtZSArIFxcXCJAaW1wb3J0PWpzOiQucmVxdWlyZSgnaW1wb3J0P3J1bGU9JytcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFwiKShpbnB1dCwgdHJ1ZSlcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LCBzLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKSlcXG4gICAgICB9KTtcXG4gICAgfSxcXG4gICAgY2xpY2socywgaSwgbWFuYWdlKSB7XFxuICAgICAgcG9wLmRpc21pc3MoKTtcXG4gICAgICBzZXRJdGVtKFxcXCJub19sb2FkaW5nXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAvLyBtYW5hZ2UubGlzdC5mb3JFYWNoKCh2LCBpaSkgPT4gKFxcbiAgICAgIC8vICAgbWFuYWdlLmxpc3RbaWldID0gaSA9PT0gaWkgPyBcXFwi4oCY4oCYXFxcIiArIG5hbWVzW2lpXSArIFxcXCLigJnigJlcXFwiIDogbmFtZXNbaWldLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKVxcbiAgICAgIC8vICkpO1xcbiAgICAgIGxldCBuYW1lID0gbWFuYWdlLmxpc3RbaV0ucmVwbGFjZSgvW+KAmeKAmF0vZywgXFxcIlxcXCIpO1xcbiAgICAgIGlmIChuYW1lID09IHNvdXJjZS5uYW1lKSB7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuO1xcbiAgICAgIH1cXG4gICAgICBsZXQgc291cmNlcyA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxuICAgICAgbGV0IGtleSA9IHNvdXJjZXMuZmluZCh2ID0+IHYubmFtZSA9PSBuYW1lKS5rZXk7XFxuXFxuICAgICAgdXNpbmdTb3J0LnNldChuYW1lKTtcXG5cXG4gICAgICAvL21hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICBsZXQgc291cmNlTmFtZUxpc3QgPSBydW50aW1lQ29uZmlnLnNldEN1cnJlbnRTb3VyY2Uoa2V5KTtcXG5cXG4gICAgICBjbGVhck15VmFyKFxcXCJjYXRlaVxcXCIpO1xcbiAgICAgIGNsZWFyTXlWYXIoXFxcImNhdGVfb2JqXFxcIik7XFxuICAgICAgY2xlYXJNeVZhcihcXFwiaXNob21lXFxcIik7XFxuICAgICAgY2xlYXJNeVZhcihcXFwibGlua3NcXFwiKTtcXG4gICAgICByZWZyZXNoUGFnZSgpO1xcblxcbiAgICB9LFxcbiAgICBtZW51Q2xpY2sobWFuYWdlKSB7XFxuICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXG4gICAgICAgIG9wdGlvbnM6IFtcXFwi5pS55Y+Y5qC35byPXFxcIiwgXFxcIuWAkuW6j1xcXCIsIFxcXCLoh6rnhLbmjpLluo86XFxcIiArIChnZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgXFxcIlxcXCIpID09IFxcXCJcXFwiID8gXFxcIuWFs+mXrVxcXCIgOiBcXFwi5ZCv55SoXFxcIiksIFxcXCLkvb/nlKjmjpLluo86XFxcIiArIChnZXRJdGVtKFxcXCJ1c2luZ3N0XFxcIiwgXFxcIlxcXCIpID09IFxcXCJcXFwiID8gXFxcIuWFs+mXrVxcXCIgOiBcXFwi5ZCv55SoXFxcIiksIFxcXCLliLfmlrDphY3nva5cXFwiLCBcXFwi5YiG5Lqr5pe257yW56CBOlxcXCIgKyBnZXRJdGVtKFxcXCJzaGFyZV9lbmNvZGVcXFwiLCBcXFwi5LiN57yW56CBXFxcIildLFxcbiAgICAgICAgY29sdW1uczogMixcXG4gICAgICAgIHRpdGxlOiBcXFwi6K+36YCJ5oupXFxcIixcXG4gICAgICAgIGNsaWNrKHMsIGkpIHtcXG4gICAgICAgICAgaWYgKHMgPT0gXFxcIuaUueWPmOagt+W8j1xcXCIpIHtcXG4gICAgICAgICAgICBzcGVuID0gc3BlbiA9PSAzID8gMSA6IDM7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZUNvbHVtbnMoc3Blbik7XFxuICAgICAgICAgIH0gZWxzZSBpZiAocy5pbmNsdWRlcyhcXFwi5YCS5bqPXFxcIikpIHtcXG4gICAgICAgICAgICBtYW5hZ2UubGlzdC5yZXZlcnNlKCk7XFxuICAgICAgICAgICAgbmFtZXMucmV2ZXJzZSgpO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChzLmluY2x1ZGVzKFxcXCLoh6rnhLbmjpLluo9cXFwiKSkge1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gT2JqZWN0LmFzc2lnbihbXSwgbWFuYWdlLmxpc3QpO1xcbiAgICAgICAgICAgIGxldCBuYXR1cmFsID0gZ2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBpZiAobmF0dXJhbCA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgIGxpc3Quc29ydChuYXR1cmFsU29ydCkuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgc2V0SXRlbShcXFwidXNpbmdzdFxcXCIsIFxcXCJcXFwiKVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgc25hbWUuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgbmF0dXJhbCA/IFxcXCJcXFwiIDogXFxcIjFcXFwiKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChzLmluY2x1ZGVzKFxcXCLkvb/nlKjmjpLluo9cXFwiKSkge1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gT2JqZWN0LmFzc2lnbihbXSwgbWFuYWdlLmxpc3QpO1xcbiAgICAgICAgICAgIGxldCB1c2luZ3N0ID0gZ2V0SXRlbShcXFwidXNpbmdzdFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBpZiAodXNpbmdzdCA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgIHVzaW5nU29ydC5nZXQobGlzdCkuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgc2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIFxcXCJcXFwiKVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgc25hbWUuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJ1c2luZ3N0XFxcIiwgdXNpbmdzdCA/IFxcXCJcXFwiIDogXFxcIjFcXFwiKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChzID09IFxcXCLliLfmlrDphY3nva5cXFwiKSB7XFxuICAgICAgICAgICAgZnVuY3Rpb24gYXJyYXlEaWZmZXJlbmNlKGFycjEsIGFycjIpIHtcXG4gICAgICAgICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoYXJyMi5tYXAoaXRlbSA9PiBbaXRlbS5rZXksIGl0ZW1dKSk7XFxuICAgICAgICAgICAgICByZXR1cm4gYXJyMS5maWx0ZXIoaXRlbSA9PiAhbWFwLmhhcyhpdGVtLmtleSkpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIsIFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZSgpO1xcbiAgICAgICAgICAgIGxldCBDa2V5ID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCkua2V5O1xcbiAgICAgICAgICAgIC8vbG9nKENrZXkpXFxuICAgICAgICAgICAgbGV0IGNmZyA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudENvbmZpZygpXFxuICAgICAgICAgICAgbGV0IHtcXG4gICAgICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgICAgICBuYW1lXFxuICAgICAgICAgICAgfSA9IGNmZztcXG4gICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldEN1cnJlbnRDb25maWcoe1xcbiAgICAgICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgICAgIG5hbWUsXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcnVudGltZUNvbmZpZy5zZXRDdXJyZW50U291cmNlKENrZXkpO1xcbiAgICAgICAgICAgIGxldCBuc291cmNlcyA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxuXFxuICAgICAgICAgICAgbGV0IGFsaXN0ID0gYXJyYXlEaWZmZXJlbmNlKG5zb3VyY2VzLCBsaXN0KTtcXG4gICAgICAgICAgICBsZXQgZGxpc3QgPSBhcnJheURpZmZlcmVuY2UobGlzdCwgbnNvdXJjZXMpO1xcblxcbiAgICAgICAgICAgIGlmIChhbGlzdC5sZW5ndGggPiAwIHx8IGRsaXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgIGxldCBtc2cgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgIGlmIChhbGlzdC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIGFsaXN0LmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4Lm5hbWUpO1xcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICBsb2coXFxcIuaWsOWinjpcXFwiICsgYWxpc3QubWFwKGsgPT4gay5uYW1lKS5qb2luKFxcXCIsXFxcIikpXFxuICAgICAgICAgICAgICAgIG1zZyArPSBcXFwi5paw5aKeXFxcIiArIGFsaXN0Lmxlbmd0aCArIFxcXCLkuKrmupBcXFwiO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgaWYgKGRsaXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgZGxpc3QuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5zcGxpY2UobWFuYWdlLmxpc3QuaW5kZXhPZih4Lm5hbWUpLCAxKTtcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgbG9nKFxcXCLnp7vpmaQ6XFxcIiArIGRsaXN0Lm1hcChrID0+IGsubmFtZSkuam9pbihcXFwiLFxcXCIpKVxcbiAgICAgICAgICAgICAgICBtc2cgKz0gXFxcIiDnp7vpmaRcXFwiICsgZGxpc3QubGVuZ3RoICsgXFxcIuS4qua6kFxcXCI7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICBtYW5hZ2Uuc2V0VGl0bGUoXFxcIumAieaLqeinhumikea6kCDlvZPliY3lhbE6XFxcIiArIG1hbmFnZS5saXN0Lmxlbmd0aCArIFxcXCLkuKrop4bpopHmupBcXFwiKTtcXG4gICAgICAgICAgICAgIHRvYXN0KG1zZyArIFxcXCIg5pu05aSa6K+m5oOF55yLbG9nXFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIHRvYXN0KFxcXCLlt7LliLfmlrBcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgc2hvd1NlbGVjdE9wdGlvbnMoe1xcbiAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnvJbnoIHnsbvlnotcXFwiLFxcbiAgICAgICAgICAgICAgb3B0aW9uczogW1xcXCLkuI3nvJbnoIFcXFwiLCBcXFwiR3ppcFxcXCIsIFxcXCJCYXNlNjRcXFwiLCBcXFwiQUVTXFxcIl0sXFxuICAgICAgICAgICAgICBjb2w6IDEsXFxuICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmIChNWV9JTkRFWCA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICAgIGNsZWFySXRlbShcXFwic2hhcmVfZW5jb2RlXFxcIik7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwic2hhcmVfZW5jb2RlXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgaW5wdXQ7XFxuICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgIH0pO1xcbiAgICB9XFxuICB9KTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJkcnB5566h55CGXCIsXCJwYXRoXCI6XCJEcnB5TWFuYWdlXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBKU0VuZ2luZSA9IGNvbS5leGFtcGxlLmhpa2Vydmlldy5zZXJ2aWNlLnBhcnNlci5KU0VuZ2luZTtcXG5jb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuY29uc3QgZHJweU1hcCA9IG5ldyBNYXAoKTtcXG5jb25zdCBHTWtleSA9IG1vZHVsZS5pbXBvcnRQYXJhbTtcXG4vL2xvZyhcXFwi5Yid5aeL5YyWRHJweU1hbmFnZVxcXCIpO1xcbmNvbnN0IHByb3h5U2VtYXBob3JlID0gbmV3IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZSgzKTtcXG5cXG5mdW5jdGlvbiBidWlsZEpzRW52KHRpY2tldCkge1xcbiAgICBsZXQgY29kZSA9IFN0cmluZy5yYXdgXFxuICAgIC8vIGNvbnN0IG15X3J1bGUgPSAnXFxuICAgIGNvbnN0IE1ZX1JVTEUgPSAke215X3J1bGV9O1xcbiAgICBjb25zdCBteV9ydWxlID0gSlNPTi5zdHJpbmdpZnkoTVlfUlVMRSk7XFxuICAgIGNvbnN0IE1ZX1RJQ0tFVCA9IFxcXCIke3RpY2tldCB8fCBcXFwiXFxcIn1cXFwiO1xcbiAgICBldmFsKGdldEpzUGx1Z2luKCkpO1xcbiAgICBldmFsKGdldEpzTGF6eVBsdWdpbigpKTtcXG4gICAgYDtcXG4gICAgcmV0dXJuIGNvZGU7XFxufVxcblxcbmZ1bmN0aW9uIHN5bmMoZnVuYywgc3ApIHtcXG4gICAgcmV0dXJuIG5ldyBvcmcubW96aWxsYS5qYXZhc2NyaXB0LlN5bmNocm9uaXplcihmdW5jLCBzcCB8fCB7fSk7XFxufVxcblxcbmZ1bmN0aW9uIGNyZWF0ZURycHkoa2V5KSB7XFxuICAgIEpTRW5naW5lLmdldEluc3RhbmNlKCkuZXZhbEpTKGJ1aWxkSnNFbnYoTVlfVElDS0VUKSArIFxcXCJcXFxcbiFcXFwiICsgJC50b1N0cmluZygoa2V5LCBHTWtleSwgTVlfVElDS0VUKSA9PiB7XFxuICAgICAgICBsZXQgZHJweSA9ICQucmVxdWlyZShcXFwiZHJweVxcXCIsIGtleSk7XFxuICAgICAgICBHTS5oYXMoR01rZXksIChEcnB5TWFuYWdlKSA9PiB7XFxuICAgICAgICAgICAgRHJweU1hbmFnZS5wdXQoa2V5LCBkcnB5KTtcXG4gICAgICAgIH0pO1xcbiAgICB9LCBrZXksIEdNa2V5LCBNWV9USUNLRVQpICsgXFxcIjtcXFxcblxcXCIsIFxcXCJcXFwiLCBmYWxzZSk7XFxufVxcblxcbmZ1bmN0aW9uIGdldChrZXkpIHtcXG4gICAgcmV0dXJuIHN5bmMoKCkgPT4ge1xcbiAgICAgICAgLy9sb2coZHJweU1hcC5zaXplKVxcbiAgICAgICAgaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChkcnB5TWFwLnNpemUgPj0gNSkge1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCLor7fmsYI6XFxcIiArIGtleSlcXG4gICAgICAgICAgICBkZWwoQXJyYXkuZnJvbShkcnB5TWFwLmtleXMoKSkuYXQoMCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlcygpLmZpbmQodiA9PiB2LmtleSA9PT0ga2V5KTtcXG4gICAgICAgIGNyZWF0ZURycHkoa2V5KTtcXG4gICAgICAgIGxldCBkcnB5ID0gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIGRycHkuaW5pdChydW50aW1lQ29uZmlnLmdldEFic29sdXRlUGF0aChzb3VyY2UuZXh0KSk7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmIChkcnB5LmdldFJ1bGUoXFxcInByb3h5X3J1bGVcXFwiKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgUHJveHkgPSAkLnJlcXVpcmUoXFxcIkxvY2FsUHJveHlcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHByb3h5VXJsID0gUHJveHkuc3RhcnRQcm94eShNWV9SVUxFLnRpdGxlLCBHTS5nZXRTZWxmS2V5KCkpO1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiUHJveHlfVXJsXFxcIiwgcHJveHlVcmwpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG5cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBkcnB5O1xcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxufVxcbi8vc291cmNlLmV4dOW/hemhu+S4uue7neWvuei3r+W+hFxcbmZ1bmN0aW9uIGdldEJ5U291cmNlKHNvdXJjZSkge1xcbiAgICByZXR1cm4gc3luYygoKSA9PiB7XFxuICAgICAgICBsZXQga2V5ID0gc291cmNlLmtleTtcXG4gICAgICAgIC8vbG9nKGRycHlNYXAuc2l6ZSlcXG4gICAgICAgIGlmIChkcnB5TWFwLmhhcyhrZXkpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGRycHlNYXAuZ2V0KGtleSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoZHJweU1hcC5zaXplID49IDUpIHtcXG4gICAgICAgICAgICAvL2xvZyhcXFwi6K+35rGCOlxcXCIgKyBrZXkpXFxuICAgICAgICAgICAgZGVsKEFycmF5LmZyb20oZHJweU1hcC5rZXlzKCkpLmF0KDApKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGNyZWF0ZURycHkoa2V5KTtcXG4gICAgICAgIGxldCBkcnB5ID0gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgICAgIGRycHkuaW5pdChzb3VyY2UuZXh0KTtcXG4gICAgICAgIHJldHVybiBkcnB5O1xcbiAgICB9LCB0aGlzKS5jYWxsKCk7XFxufVxcblxcbmZ1bmN0aW9uIHB1dChrZXksIGRycHkpIHtcXG4gICAgc3luYygoKSA9PiBkcnB5TWFwLnNldChrZXksIGRycHkpLCB0aGlzKS5jYWxsKCk7XFxufVxcblxcbmZ1bmN0aW9uIHJ1blByb3h5KGRycHksIGFyZ3MpIHtcXG4gICAgaWYgKHR5cGVvZiBkcnB5LnByb3h5ID09PSBcXFwiZnVuY3Rpb25cXFwiKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIC8vbGV0IHRpbWUxID0gRGF0ZS5ub3coKTtcXG4gICAgICAgICAgICBwcm94eVNlbWFwaG9yZS5hY3F1aXJlKCk7XFxuICAgICAgICAgICAgLy9sZXQgdGltZTIgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCIx562J5b6F5pe26Ze0OlxcXCIgKyAodGltZTIgLSB0aW1lMSkgKyBcXFwibXNcXFwiKTtcXG4gICAgICAgICAgICBsZXQgcmVzID0gZHJweS5wcm94eS5hcHBseShkcnB5LCBhcmdzKTtcXG4gICAgICAgICAgICAvL2xldCB0aW1lMyA9IERhdGUubm93KCk7XFxuICAgICAgICAgICAgLy9sb2coXFxcIjLmiafooYzku6PnkIbogJfml7Y6XFxcIiArICh0aW1lMyAtIHRpbWUyKSArIFxcXCJtc1xcXCIpO1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCIz5oC76ICX5pe26ICX5pe2OlxcXCIgKyAodGltZTMgLSB0aW1lMSkgKyBcXFwibXNcXFwiKTtcXG5cXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xcbiAgICAgICAgfSBmaW5hbGx5IHtcXG4gICAgICAgICAgICBwcm94eVNlbWFwaG9yZS5yZWxlYXNlKCk7XFxuICAgICAgICB9XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZGVsKGtleSkge1xcbiAgICBzeW5jKCgpID0+IHtcXG4gICAgICAgIC8vbG9nKFxcXCLliKDpmaRcXFwiICsga2V5KTtcXG4gICAgICAgIGlmIChkcnB5TWFwLmhhcyhrZXkpKSB7XFxuICAgICAgICAgICAgZHJweU1hcC5kZWxldGUoa2V5KTtcXG4gICAgICAgIH1cXG4gICAgfSwgdGhpcykuY2FsbCgpO1xcbn1cXG5sZXQgaXNJbml0SG9tZSA9IGZhbHNlO1xcbi8vbGV0IGlzSW5pdFNlYXJjaCA9IGZhbHNlO1xcbmxldCBpc0luaXRFclBhZ2UgPSBmYWxzZTtcXG5cXG5mdW5jdGlvbiBpbml0UGFnZSh0eXBlKSB7XFxuICAgIHN3aXRjaCAodHlwZSkge1xcbiAgICAgICAgY2FzZSBcXFwiaG9tZVxcXCI6XFxuICAgICAgICAgICAgaXNJbml0SG9tZSA9IHRydWU7XFxuICAgICAgICAvL2Nhc2UgXFxcInNlYXJjaFxcXCI6XFxuICAgICAgICAvLyAgICBpc0luaXRTZWFyY2ggPSB0cnVlO1xcbiAgICAgICAgY2FzZSBcXFwiZXJcXFwiOlxcbiAgICAgICAgICAgIGlzSW5pdGVyUGFnZSA9IHRydWU7XFxuICAgIH1cXG4gICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKChHTWtleSwgdHlwZSkgPT4ge1xcbiAgICAgICAgLy9sb2coXFxcIm9uQ2xvc2VcXFwiKTtcXG4gICAgICAgIEdNLmhhcyhHTWtleSwgRHJweU1hbmFnZSA9PiB7XFxuICAgICAgICAgICAgLy9sb2coXFxcIuaciUdNa2V5XFxcIik7XFxuICAgICAgICAgICAgRHJweU1hbmFnZS5jbGVhckJ5VHlwZSh0eXBlKTtcXG4gICAgICAgIH0pO1xcbiAgICB9LCBHTWtleSwgdHlwZSkpO1xcbn1cXG5cXG5mdW5jdGlvbiBjbGVhckJ5VHlwZSh0eXBlKSB7XFxuICAgIHN3aXRjaCAodHlwZSkge1xcbiAgICAgICAgY2FzZSBcXFwiaG9tZVxcXCI6XFxuICAgICAgICAgICAgaXNJbml0SG9tZSA9IGZhbHNlO1xcbiAgICAgICAgLy9jYXNlIFxcXCJzZWFyY2hcXFwiOlxcbiAgICAgICAgLy8gICAgaXNJbml0U2VhcmNoID0gZmFsc2U7XFxuICAgICAgICBjYXNlIFxcXCJlclxcXCI6XFxuICAgICAgICAgICAgaXNJbml0ZXJQYWdlID0gZmFsc2U7XFxuICAgIH1cXG5cXG4gICAgaWYgKCFpc0luaXRIb21lICYmICFpc0luaXRFclBhZ2UpIHtcXG4gICAgICAgIC8vbG9nKFxcXCLlvIDlp4vmuIXnkIZcXFwiKTtcXG4gICAgICAgIGRycHlNYXAuY2xlYXIoKTtcXG4gICAgICAgIEdNLmNsZWFyKEdNa2V5KTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBjbGVhcigpIHtcXG4gICAgc3luYygoKSA9PiB7XFxuICAgICAgICBkcnB5TWFwLmNsZWFyKCk7XFxuICAgIH0sIHRoaXMpLmNhbGwoKTtcXG59XFxuJC5leHBvcnRzID0ge1xcbiAgICBpbml0UGFnZSxcXG4gICAgZ2V0LFxcbiAgICBnZXRCeVNvdXJjZSxcXG4gICAgZGVsLFxcbiAgICBjbGVhcixcXG4gICAgcHV0LFxcbiAgICBydW5Qcm94eSxcXG4gICAgY2xlYXJCeVR5cGVcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmjIflrprmkJzntKLlvLnnqpdcIixcInBhdGhcIjpcIlNlYXJjaEFsbG93UG9wXCIsXCJydWxlXCI6XCJqczpcXG4kLmV4cG9ydHMuc2hvdyA9IGZ1bmN0aW9uICgpIHtcXG4gIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiLCBcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gIGxldCBzZWFyY2hBbGxvdyA9IHJ1bnRpbWVDb25maWcuZ2V0U2VhcmNoQWxsb3coKTtcXG5cXG4gIGxldCBjYW5TZWFyY2hTb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldENhblNlYXJjaFNvdXJjZSgpO1xcbiAgLy9sZXQgc291cmNlTmFtZUxpc3QgPSBjYW5TZWFyY2hTb3VyY2UubWFwKHY9PnYubmFtZSk7XFxuICBsZXQgZ2V0TmFtZXMgPSAoKSA9PiBkeW5hbWljU291cmNlLm1hcCh2ID0+IHNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgKHYubmFtZSArIFxcXCJcXFwiKS5mb250Y29sb3IoXFxcIiMwMDk5NjZcXFwiKSA6IHYubmFtZSk7XFxuICBsZXQgc3BlbiA9IDM7XFxuXFxuICAvL2xldCBkeW5hbWljTmFtZXMgPSBzb3VyY2VOYW1lTGlzdC5zbGljZSgpO1xcbiAgbGV0IGR5bmFtaWNTb3VyY2UgPSBjYW5TZWFyY2hTb3VyY2Uuc2xpY2UoKTtcXG4gIGxldCBzZWFyY2hvbmNvdW50ID0gZHluYW1pY1NvdXJjZS5maWx0ZXIodiA9PiBzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkpLmxlbmd0aDtcXG4gIGlmIChzZWFyY2hvbmNvdW50ID09IDApIHtcXG4gICAgc2VhcmNob25jb3VudCA9IGNhblNlYXJjaFNvdXJjZS5sZW5ndGg7XFxuICB9XFxuXFxuICBsZXQgc2VhcmNoS2V5ID0gXFxcIlxcXCI7XFxuICBoaWtlclBvcC5zZWxlY3RCb3R0b21SZXMoe1xcbiAgICBvcHRpb25zOiBnZXROYW1lcygpLFxcbiAgICBjb2x1bW5zOiBzcGVuLFxcbiAgICB0aXRsZTogXFxcIuWQr+eUqOaQnOe0oua6kDpcXFwiICsgc2VhcmNob25jb3VudCArIFxcXCLkuKog5YWxOlxcXCIgKyBjYW5TZWFyY2hTb3VyY2UubGVuZ3RoICsgXFxcIuS4quaQnOe0oua6kFxcXCIsXFxuICAgIG5vQXV0b0Rpc21pc3M6IHRydWUsXFxuICAgIHBvc2l0aW9uOiAxLFxcbiAgICBoZWlnaHQ6IC45LFxcbiAgICBleHRyYUlucHV0Qm94OiBuZXcgaGlrZXJQb3AuUmVzRXh0cmFJbnB1dEJveCh7XFxuICAgICAgaGludDogXFxcIua6kOWFs+mUruWtlyDlpJrkuKrnlKh86ZqU5byAXFxcIixcXG4gICAgICB0aXRsZTogXFxcIm9rXFxcIixcXG4gICAgICBvbkNoYW5nZSh0ZXh0LCBtYW5hZ2UpIHtcXG4gICAgICAgIC8vbG9nKFxcXCJvbkNoYW5nZTpcXFwiK3RleHQpXFxuICAgICAgICBzZWFyY2hLZXkgPSB0ZXh0O1xcbiAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgIGR5bmFtaWNTb3VyY2UubGVuZ3RoID0gMDtcXG4gICAgICAgIGlmICh0ZXh0KSB7XFxuICAgICAgICAgIGNhblNlYXJjaFNvdXJjZS5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgaWYgKHRleHQuc3BsaXQoL1xcXFx8LykuZmlsdGVyKGYgPT4gZikuc29tZSh4ID0+IHYubmFtZS5pbmNsdWRlcyh4KSkpIHtcXG4gICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UucHVzaCh2KTtcXG4gICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAodi5uYW1lICsgXFxcIlxcXCIpLmZvbnRjb2xvcihcXFwiIzAwOTk2NlxcXCIpIDogdi5uYW1lKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBkeW5hbWljU291cmNlID0gY2FuU2VhcmNoU291cmNlLnNsaWNlKCk7XFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcblxcbiAgICAgICAgfVxcbiAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgIH0sXFxuICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICBjbGljayhzLCBtYW5hZ2UpIHtcXG4gICAgICAgIC8vdG9hc3Qocyk7XFxuICAgICAgICAvL2xvZyhtYW5hZ2UubGlzdCk7XFxuICAgICAgfSxcXG4gICAgICB0aXRsZVZpc2libGU6IGZhbHNlXFxuICAgIH0pLFxcbiAgICBjbGljayhzLCBpLCBtYW5hZ2UpIHtcXG5cXG4gICAgICBsZXQga2V5ID0gZHluYW1pY1NvdXJjZVtpXS5rZXk7XFxuICAgICAgbGV0IGluZGV4ID0gLTE7XFxuICAgICAgaWYgKChpbmRleCA9IHNlYXJjaEFsbG93LmluZGV4T2Yoa2V5KSkgIT09IC0xKSB7XFxuICAgICAgICBtYW5hZ2UubGlzdFtpXSA9IGR5bmFtaWNTb3VyY2VbaV0ubmFtZTtcXG4gICAgICAgIHNlYXJjaEFsbG93LnNwbGljZShpbmRleCwgMSk7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIG1hbmFnZS5saXN0W2ldID0gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAoZHluYW1pY1NvdXJjZVtpXS5uYW1lICsgXFxcIlxcXCIpLmZvbnRjb2xvcihcXFwiIzAwOTk2NlxcXCIpO1xcbiAgICAgICAgc2VhcmNoQWxsb3cucHVzaChrZXkpO1xcbiAgICAgIH1cXG5cXG4gICAgICBydW50aW1lQ29uZmlnLnNldFNlYXJjaEFsbG93KCk7XFxuICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICB9LFxcbiAgICBtZW51Q2xpY2sobWFuYWdlKSB7XFxuICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXG4gICAgICAgIG9wdGlvbnM6IFtcXFwi5pS55Y+Y5qC35byPXFxcIiwgXFxcIuetm+mAiea6kFxcXCIsIFxcXCLoh6rnhLbmjpLluo9cXFwiLCBcXFwi5YCS5bqPXFxcIiwgXFxcIuWFqOmAiVxcXCIsIFxcXCLlj43pgIlcXFwiXSxcXG4gICAgICAgIGNvbHVtbnM6IDIsXFxuICAgICAgICB0aXRsZTogXFxcIuivt+mAieaLqVxcXCIsXFxuICAgICAgICBjbGljayhzLCBpKSB7XFxuICAgICAgICAgIGlmIChpID09PSAwKSB7XFxuICAgICAgICAgICAgc3BlbiA9IHNwZW4gPT0gMyA/IDEgOiAzO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2VDb2x1bW5zKHNwZW4pO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDEpIHtcXG4gICAgICAgICAgICBoaWtlclBvcC5pbnB1dENvbmZpcm0oe1xcbiAgICAgICAgICAgICAgY29udGVudDogXFxcIui+k+WFpeWFs+mUruWtlyDnqbrmmL7npLrlhajpg6hcXFwiLFxcbiAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnrZvpgInmupBcXFwiLFxcbiAgICAgICAgICAgICAgaGludDogXFxcIua6kOWFs+mUruWtlyDlpJrkuKrnlKh86ZqU5byAXFxcIixcXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogc2VhcmNoS2V5LFxcbiAgICAgICAgICAgICAgdGV4dGFyZWE6IGZhbHNlLCAvL+WkmuihjOaooeW8j1xcbiAgICAgICAgICAgICAgbWF4VGV4dGFyZWE6IHRydWUsXFxuICAgICAgICAgICAgICBub0F1dG9Tb2Z0OiBmYWxzZSxcXG4gICAgICAgICAgICAgIC8vaGlkZUNhbmNlbDogdHJ1ZSxcXG4gICAgICAgICAgICAgIGNvbmZpcm0odGV4dCkge1xcbiAgICAgICAgICAgICAgICBzZWFyY2hLZXkgPSB0ZXh0O1xcbiAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgICBkeW5hbWljU291cmNlLmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgIGlmICh0ZXh0KSB7XFxuICAgICAgICAgICAgICAgICAgY2FuU2VhcmNoU291cmNlLmZvckVhY2goKHYsIGkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0LnNwbGl0KC9cXFxcfC8pLmZpbHRlcihmID0+IGYpLnNvbWUoeCA9PiB2Lm5hbWUuaW5jbHVkZXMoeCkpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UucHVzaCh2KTtcXG4gICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaChzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArICh2Lm5hbWUgKyBcXFwiXFxcIikuZm9udGNvbG9yKFxcXCIjMDA5OTY2XFxcIikgOiB2Lm5hbWUpXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZSA9IGNhblNlYXJjaFNvdXJjZS5zbGljZSgpO1xcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcInRvYXN0Oi8v6L6T5YWl5LqGXFxcIiArIHRleHQ7XFxuICAgICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDIpIHtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IE9iamVjdC5hc3NpZ24oW10sIG1hbmFnZS5saXN0KTtcXG4gICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcblxcblxcbiAgICAgICAgICAgIGR5bmFtaWNTb3VyY2Uuc29ydCgoYSwgYikgPT4ge1xcbiAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhhLm5hbWUpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIubmFtZSksIHVuZGVmaW5lZCwge1xcbiAgICAgICAgICAgICAgICBudW1lcmljOiB0cnVlLFxcbiAgICAgICAgICAgICAgICBzZW5zaXRpdml0eTogJ2Jhc2UnXFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAzKSB7XFxuICAgICAgICAgICAgbWFuYWdlLmxpc3QucmV2ZXJzZSgpO1xcbiAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UucmV2ZXJzZSgpO1xcblxcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDQpIHtcXG4gICAgICAgICAgICBkeW5hbWljU291cmNlLmZvckVhY2godiA9PiB7XFxuICAgICAgICAgICAgICBpZiAoIXNlYXJjaEFsbG93LmluY2x1ZGVzKHYpKSB7XFxuICAgICAgICAgICAgICAgIHNlYXJjaEFsbG93LnB1c2godi5rZXkpO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcbiAgICAgICAgICAgIHJ1bnRpbWVDb25maWcuc2V0U2VhcmNoQWxsb3coKTtcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSA1KSB7XFxuICAgICAgICAgICAgbGV0IHRlbWxpc3QgPSBzZWFyY2hBbGxvdy5zbGljZSgpO1xcbiAgICAgICAgICAgIHNlYXJjaEFsbG93Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgICAgaWYgKHRlbWxpc3QuaW5jbHVkZXModi5rZXkpKSByZXR1cm47XFxuICAgICAgICAgICAgICBzZWFyY2hBbGxvdy5wdXNoKHYua2V5KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG4gICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldFNlYXJjaEFsbG93KCk7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgIH0pO1xcbiAgICB9XFxuICB9KTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLliIbnsbtcIixcInBhdGhcIjpcImNhdGVnb3J5c1wiLFwicnVsZVwiOlwianM6XFxubGV0IGZsID0ge307XFxubGV0IHJlc3VsdHMgPSBbXTtcXG5sZXQgaG9tZWxpc3QgPSBbXTtcXG5sZXQgY2F0ZSA9IFxcXCJcXFwiO1xcblxcbmZ1bmN0aW9uIGdldENhdGVnb3J5cyhsYXlvdXQsIGRycHksIHBhZ2UpIHtcXG4gIGxldCBydWxlID0gZHJweS5ydW5NYWluKCdmdW5jdGlvbiBtYWluKCl7cmV0dXJuIHJ1bGV9Jyk7XFxuICBsZXQgbG9hZGkgPSBsYXlvdXQuZmluZEluZGV4KHggPT4geC5leHRyYSAmJiB4LmV4dHJhLmlkID09IE1ZX1JVTEUudGl0bGUgKyBcXFwibG9hZFxcXCIpO1xcbiAgaWYgKHJ1bGUu5LiA57qnID09IFxcXCJcXFwiIHx8IHJ1bGUu5LiA57qnID09IHVuZGVmaW5lZCkge1xcbiAgICBpZiAobG9hZGkgIT0gLTEpIHtcXG4gICAgICBsYXlvdXQuc3BsaWNlKGxvYWRpLCAxKVxcbiAgICB9XFxuICAgIGNsZWFyTXlWYXIoXFxcImxpbmtzXFxcIik7XFxuICAgIGxheW91dC5sZW5ndGggPSAwO1xcbiAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivpea6kOS4uuaQnOe0oua6kO+8jOS7heiDvemAmui/h+aQnOe0ouiuv+mXruaVsOaNrlxcXCIpXFxuICB9XFxuICB2YXIgZ2V0UmFuZ2VDb2xvcnMgPSBmdW5jdGlvbiAoKSB7XFxuICAgIHJldHVybiAnIycgKyAoJzAwMDAwJyArIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwIDw8IDApLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KTtcXG4gIH1cXG4gIGxldCBjYXRlZ29yeXMgPSBKU09OLnBhcnNlKGRycHkuaG9tZSgpKTtcXG4gIGxldCBmaWx0ZXJzID0gY2F0ZWdvcnlzLmZpbHRlcnM7XFxuICBsZXQgY2F0ZXMgPSBjYXRlZ29yeXMuY2xhc3MgfHwgW107XFxuICBpZiAocGFnZSA9PSAxKSB7XFxuICAgIGhvbWVsaXN0ID0gSlNPTi5wYXJzZShkcnB5LmhvbWVWb2QoKSkubGlzdDtcXG4gICAgaWYgKGhvbWVsaXN0ICE9IHVuZGVmaW5lZCAmJiBob21lbGlzdC5sZW5ndGgpIHtcXG4gICAgICBwdXRNeVZhcihcXFwiaXNob21lXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgfVxcbiAgfVxcbiAgaWYgKGNhdGVzLmxlbmd0aCA9PSAwICYmIChob21lbGlzdCA9PSB1bmRlZmluZWQgfHwgaG9tZWxpc3QubGVuZ3RoID09IDApKSB7XFxuICAgIGlmIChsb2FkaSAhPSAtMSkge1xcbiAgICAgIGxheW91dC5zcGxpY2UobG9hZGksIDEpXFxuICAgIH1cXG4gICAgY2xlYXJNeVZhcihcXFwibGlua3NcXFwiKTtcXG4gICAgbGF5b3V0Lmxlbmd0aCA9IDA7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi5YiG57G76I635Y+W5aSx6LSl5Y+v6IO9572R57uc6Zeu6aKYXFxcIik7XFxuICB9XFxuICBpZiAoZ2V0TXlWYXIoXFxcImlzaG9tZVxcXCIsIFxcXCIwXFxcIikgPT0gXFxcIjFcXFwiKSB7XFxuICAgIGNhdGVzLnVuc2hpZnQoe1xcbiAgICAgIHR5cGVfbmFtZTogJ+aOqOiNkCcsXFxuICAgICAgdHlwZV9pZDogJ2hvbWUnLFxcbiAgICB9KVxcbiAgfVxcbiAgaWYgKGxvYWRpICE9IC0xKSB7XFxuICAgIGxheW91dC5zcGxpY2UobG9hZGksIDEpXFxuICB9XFxuICBwdXRNeVZhcihcXFwibGlua3NcXFwiLCBcXFwiMVxcXCIpO1xcbiAgbGV0IGNhdGVpID0gZ2V0TXlWYXIoXFxcImNhdGVpXFxcIiwgXFxcIjBcXFwiKTtcXG4gIGNhdGUgPSBjYXRlc1tjYXRlaV0udHlwZV9pZDtcXG5cXG4gIHZhciBmb2xkID0gc3RvcmFnZTAuZ2V0SXRlbShcXFwiZm9sZFxcXCIsIFxcXCIwXFxcIik7XFxuICBsZXQgY29sb3IgPSBnZXRSYW5nZUNvbG9ycygpO1xcblxcbiAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICBjYXRlcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XFxuICAgICAgbGV0IHQgPSBjYXRlaSA9PSBpID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwiPGI+XFxcIiArIGl0ZW0udHlwZV9uYW1lLmZvbnRjb2xvcihjb2xvcikgKyBcXFwiPC9iPlxcXCIgOiBpdGVtLnR5cGVfbmFtZTtcXG4gICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogdCxcXG4gICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSwgdGlkKSA9PiB7XFxuICAgICAgICAgIHB1dE15VmFyKFxcXCJjYXRlaVxcXCIsIGkpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaSwgaXRlbS50eXBlX2lkKSxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICB0aWQ6IGl0ZW0udHlwZV9pZCxcXG4gICAgICAgICAgYWN0aXZlOiBjYXRlaSA9PSBpID8gdHJ1ZSA6IGZhbHNlLFxcbiAgICAgICAgfVxcbiAgICAgIH0pXFxuICAgIH0pXFxuICB9XFxuXFxuICBpZiAoY2F0ZSAhPSAnaG9tZScgJiYgcGFnZSA9PSAxKSB7XFxuICAgIGxldCBob21laSA9IGxheW91dC5maW5kSW5kZXgoeCA9PiB7XFxuICAgICAgcmV0dXJuIHguZXh0cmEgJiYgeC5leHRyYS50aWQgPT0gXFxcImhvbWVcXFwiXFxuICAgIH0pO1xcbiAgICBpZiAoaG9tZWkgPT0gLTEpIHtcXG4gICAgICBob21laSA9IGxheW91dC5maW5kSW5kZXgoeCA9PiB7XFxuICAgICAgICByZXR1cm4geC5leHRyYSAmJiB4LmV4dHJhLnRpZDtcXG4gICAgICB9KSAtIDE7XFxuICAgIH1cXG4gICAgaWYgKGZpbHRlcnMgJiYgZmlsdGVycy5oYXNPd25Qcm9wZXJ0eShjYXRlKSkge1xcbiAgICAgIGlmIChob21laSAhPSAtMSkge1xcbiAgICAgICAgbGF5b3V0LnNwbGljZShob21laSArIDEsIDAsIHtcXG4gICAgICAgICAgdGl0bGU6IGZvbGQgPT0gXFxcIjBcXFwiID8gXFxcIuKAnOKAnOKAneKAnTxiPlxcXCIgKyBcXFwi4oinXFxcIi5mb250Y29sb3IoXFxcIiMxYWFkMTlcXFwiKSArIFxcXCI8L2I+XFxcIiA6IFxcXCLigJzigJzigJ3igJ08Yj5cXFwiICsgXFxcIuKIqFxcXCIuZm9udGNvbG9yKFxcXCIjRkYwMDAwXFxcIikgKyBcXFwiPC9iPlxcXCIsXFxuICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoZm9sZCkgPT4ge1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcImZvbGRcXFwiLCBmb2xkID09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICB9LCBmb2xkKSxcXG4gICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxcbiAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICAgIH1cXG5cXG4gICAgICBsZXQgYWN0aXZlaSA9IGxheW91dC5maW5kSW5kZXgoeCA9PiB4LmV4dHJhICYmIHguZXh0cmEuYWN0aXZlKTtcXG4gICAgICBpZiAoYWN0aXZlaSAhPSAtMSkge1xcbiAgICAgICAgbGF5b3V0LnNwbGljZShhY3RpdmVpLCAwLCB7XFxuICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArICfwn4yAJyxcXG4gICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChjKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGNhdGVfb2JqID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImNhdGVfb2JqXFxcIiwge30pO1xcbiAgICAgICAgICAgIGRlbGV0ZSBjYXRlX29ialtjXTtcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCBjYXRlX29iaik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5a6M5oiQXFxcIjtcXG4gICAgICAgICAgfSwgY2F0ZSlcXG4gICAgICAgIH0pXFxuICAgICAgfVxcblxcbiAgICAgIGxldCBjbGFzc2lmeSA9IGZpbHRlcnNbY2F0ZV07XFxuICAgICAgdmFyIGluaXRfY2F0ZSA9IG5ldyBBcnJheShjbGFzc2lmeS5sZW5ndGgpLmZpbGwoXFxcIi0xXFxcIik7XFxuICAgICAgbGV0IGNhdGVfb2JqID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImNhdGVfb2JqXFxcIiwge30pO1xcbiAgICAgIGNhdGVfb2JqW2NhdGVdID0gY2F0ZV9vYmpbY2F0ZV0gPyBjYXRlX29ialtjYXRlXSA6IGluaXRfY2F0ZVxcbiAgICAgIHZhciBjYXRlX3RlbXAgPSBjYXRlX29ialtjYXRlXTtcXG4gICAgICAvL3ZhciBmaWx0ZXJfZGVmPXN0b3JhZ2UwLmdldEl0ZW0oXFxcImZpbHRlcl9kZWZcXFwiLCB7fSk7XFxuICAgICAgY2xhc3NpZnkuZm9yRWFjaCgoeCwgaW5kZXgpID0+IHtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgY29sX3R5cGU6ICdibGFua19ibG9jaydcXG4gICAgICAgIH0pXFxuICAgICAgICB4LnZhbHVlLmZvckVhY2goKGl0LCBpKSA9PiB7XFxuICAgICAgICAgIGxldCB0ID0gaXQubjtcXG4gICAgICAgICAgaWYgKGNhdGVfdGVtcFtpbmRleF0gPT0gaSkge1xcbiAgICAgICAgICAgIHQgPSBcXFwiPGI+PGZvbnQgY29sb3I9XFxcIiArIGNvbG9yICsgXFxcIj5cXFwiICsgdCArIFxcXCI8L2ZvbnQ+PC9iPlxcXCI7XFxuICAgICAgICAgICAgZmxbeC5rZXldID0gaXQudjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAoY2F0ZV90ZW1wW2luZGV4XSA9PSBcXFwiLTFcXFwiKSB7XFxuICAgICAgICAgICAgZmxbeC5rZXldID0gXFxcInVuZGVmaW5lZFxcXCI7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGZvbGQgPT0gMSkge1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIHQsXFxuICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG8pID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBvLmk7XFxuICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJpc19kZWZcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZV9vYmogPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCB7fSk7XFxuXFxuICAgICAgICAgICAgICAgIGxldCBjYXRlX3RlbXAgPSBvLmNhdGVfdGVtcDtcXG4gICAgICAgICAgICAgICAgaWYgKGNhdGVfdGVtcC5jb25zdHJ1Y3RvciAhPSBBcnJheSkge1xcbiAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcCA9IFtdO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG8uaW5kZXg7XFxuICAgICAgICAgICAgICAgIGxldCBjID0gY2F0ZV90ZW1wW2luZGV4XSB8fCBcXFwiLTFcXFwiO1xcbiAgICAgICAgICAgICAgICAvL2xvZyhjKVxcbiAgICAgICAgICAgICAgICBpZiAoYyA9PSBpKSB7XFxuICAgICAgICAgICAgICAgICAgby5jYXRlX3RlbXBbaW5kZXhdID0gXFxcIi0xXFxcIjtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICBvLmNhdGVfdGVtcFtpbmRleF0gPSBpICsgXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgY2F0ZV9vYmpbby5jYXRlXSA9IGNhdGVfdGVtcDtcXG4gICAgICAgICAgICAgICAgLy9sb2coY2F0ZV90ZW1wKVxcbiAgICAgICAgICAgICAgICAvL3N0b3JhZ2UwLnB1dE15VmFyKFxcXCJjYXRlX3RlbXBcXFwiLCBjYXRlX3RlbXApO1xcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCBjYXRlX29iaik7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcXG4gICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsXFxuICAgICAgICAgICAgICAgIGk6IGksXFxuICAgICAgICAgICAgICAgIGNhdGU6IGNhdGVcXG4gICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICAgIH0pXFxuICAgIH1cXG4gIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2V0RmwoKSB7XFxuICBmbCA9IE9iamVjdC5rZXlzKGZsKS5maWx0ZXIoa2V5ID0+IGZsW2tleV0gIT09IFxcXCJ1bmRlZmluZWRcXFwiKS5yZWR1Y2UoKHJlcywga2V5KSA9PiB7XFxuICAgIHJlc1trZXldID0gZmxba2V5XTtcXG4gICAgcmV0dXJuIHJlcztcXG4gIH0sIHt9KTtcXG4gIHJldHVybiBmbFxcbn1cXG5cXG5mdW5jdGlvbiBnZXRDYXRlTGlzdCgpIHtcXG4gIHJldHVybiB7XFxuICAgIGNhdGUsXFxuICAgIGhvbWVsaXN0XFxuICB9XFxufVxcblxcblxcbiQuZXhwb3J0cyA9IHtcXG4gIGdldGNhdGVsaXN0OiBnZXRDYXRlTGlzdCxcXG4gIGdldGNhdGVnb3J5czogZ2V0Q2F0ZWdvcnlzLFxcbiAgZ2V0Zmw6IGdldEZsXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5pys5Zyw6KeE5YiZ566h55CGXCIsXCJwYXRoXCI6XCJMb2NhbERpclwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLmlofku7bnrqHnkIZcXFwiKTtcXG5sZXQgcGF0aCA9IGdldFBhdGgoU3RyaW5nKE1ZX1BBUkFNUy5jcGF0aCkpLnJlcGxhY2UoXFxcImZpbGU6Ly9cXFwiLCBcXFwiXFxcIik7XFxubGV0IGZpbGVTZWxlY3QgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiKTtcXG5maWxlU2VsZWN0LmZpbGVTZWxlY3Rpb24oe1xcbiAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICByZXR1cm4gXFxcImVkaXRGaWxlOi8vZmlsZTovL1xcXCIgKyBQQVRIO1xcbiAgICB9KSxcXG4gICAgbWVtb3J5OiBcXFwiZmlsZXBhdGhcXFwiLFxcbiAgICBmaWxlVHlwZTogXFxcIi5qc1xcXCIsXFxuICAgIGV4aXRTZWFyY2hSZWZyZXNoOiB0cnVlLFxcbiAgICBwYXR0ZXJuOiAwLFxcbiAgICByb290RGlyUGF0aDogcGF0aCxcXG4gICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxufSwgTVlfUEFSQU1TLm5ld1dpbmRvdyA/IFtdIDogW3tcXG4gICAgdGl0bGU6IFxcXCLmlrDnqpflj6PmiZPlvIBcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTG9jYWxEaXIjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGNwYXRoOiBNWV9QQVJBTVMuY3BhdGgsXFxuICAgICAgICBuZXdXaW5kb3c6IHRydWUsXFxuICAgICAgICB3aW5kb3dJZDogTVlfUlVMRS50aXRsZSArIFxcXCJAZWRpdGZpbGVcXFwiLFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgcGFnZVRpdGxlOiBcXFwi5paH5Lu2566h55CGXFxcIlxcbiAgICB9XFxufV0pO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6buY6K6k5L+d5a2Y6YCJ5oupXCIsXCJwYXRoXCI6XCJzaGFyZWRlZmF1bHRwYXRoXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuS/neWtmOi3r+W+hFxcXCIpO1xcbmxldCBsYXlvdXQgPSBbXTtcXG5sZXQgZiA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiKTtcXG59KTtcXG5cXG5sZXQgcGF0aCA9IGpvaW5VcmwoZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9cXFwiKSwgXFxcIi4uL1xcXCIucmVwZWF0KDUpKS5zbGljZSg3KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCJ5oupXFxcIixcXG4gICAgdXJsOiBKU09OLnN0cmluZ2lmeShmLmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIikuZXh0cmE7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbShcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIiwge1xcbiAgICAgICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSksXFxuICAgICAgICByb290RGlyUGF0aDogcGF0aCxcXG4gICAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbiAgICAgICAgcGF0dGVybjogMVxcbiAgICB9KSksXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5YKo5a2Y6Lev5b6EXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCIsIGdldFB1YmxpY0l0ZW0oXFxcIkRycHlIaWtlckBpbnB1dF9wYXRoXFxcIiwgXFxcIlxcXCIpKSxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX3NoYXJlX2lucHV0XFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBpZDogXFxcImRycHlIaWtlcl9zaGFyZV9pbnB1dFxcXCJcXG4gICAgfVxcbn0pO1xcblxcblxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLnoa7orqRcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkKSA9PiB7XFxuICAgICAgICBsZXQgcGF0aCA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfc2hhcmVfaW5wdXRcXFwiLCBcXFwiXFxcIik7XFxuXFxuICAgICAgICBpZiAoIXBhdGgpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5Y+v5Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHNldFB1YmxpY0l0ZW0oXFxcIkRycHlIaWtlckBpbnB1dF9wYXRoXFxcIiwgcGF0aCk7XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWwj+ivtFwiLFwicGF0aFwiOlwibm92ZWxcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkcnB5ID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIikuZ2V0QnlTb3VyY2UoTVlfUEFSQU1TLnNvdXJjZSk7XFxubGV0IHBsYXkgPSBKU09OLnBhcnNlKGRycHkucGxheShNWV9QQVJBTVMuZnJvbSwgTVlfUEFSQU1TLmlkLCBbXSkpO1xcblxcbmxldCBkYXRhID0gSlNPTi5wYXJzZShwbGF5LnVybC5yZXBsYWNlKFxcXCJub3ZlbDovL1xcXCIsIFxcXCJcXFwiKSk7XFxubGV0IGxheW91dCA9IFtdO1xcbmxldCBjb250ZW50ID0gXFxcIuOAgOOAgFxcXCIgKyBkYXRhLmNvbnRlbnQuc3BsaXQoLyhcXFxcbnxcXFxccikrLykuZmlsdGVyKGl0ID0+IGl0LnRyaW0oKS5sZW5ndGggPiAxKS5tYXAoaXQgPT4gaXQudHJpbSgpKS5qb2luKFxcXCI8YnI+44CA44CAXFxcIik7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgIHRpdGxlOiAoXFxcIjxzdHJvbmc+XFxcIiArIChkYXRhLnRpdGxlIHx8IGdldFBhZ2VUaXRsZSgpKSArIFxcXCI8L3N0cm9uZz5cXFwiKS5iaWcoKSxcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBjb250ZW50LFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0ZXh0U2l6ZTogMTgsXFxuICAgICAgICBjbGljazogdHJ1ZVxcbiAgICB9XFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuLvpobVcIixcInBhdGhcIjpcIm1pYW5cIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIGxvYWQoZCwgZHJweSwgc291cmNlLCBoYXNIYWVkKSB7XFxuICBsZXQgcGFnZSA9IE1ZX1BBR0U7XFxuICBsZXQgY2F0ZWdvcnlzID0gJC5yZXF1aXJlKFxcXCJjYXRlZ29yeXNcXFwiKTtcXG4gIGNhdGVnb3J5cy5nZXRjYXRlZ29yeXMoZCwgZHJweSwgcGFnZSwgaGFzSGFlZCk7XFxuICBsZXQge1xcbiAgICBjYXRlLFxcbiAgICBob21lbGlzdFxcbiAgfSA9IGNhdGVnb3J5cy5nZXRjYXRlbGlzdCgpO1xcbiAgaWYgKGdldE15VmFyKFxcXCJsaW5rc1xcXCIsIFxcXCJcXFwiKSA9PSBcXFwiMVxcXCIgJiYgIWhhc0hhZWQpIHtcXG4gICAgc2V0UHJlUmVzdWx0KGQpO1xcbiAgICBkLmxlbmd0aCA9IDA7XFxuICB9XFxuICBsZXQgZmwgPSBjYXRlZ29yeXMuZ2V0ZmwoKTtcXG4gIGxldCBkZUNvbCA9IGRycHkuZ2V0UnVsZShjYXRlID09IFxcXCJob21lXFxcIiA/IFxcXCJoaWtlckxpc3RDb2xcXFwiIDogXFxcImhpa2VyQ2xhc3NMaXN0Q29sXFxcIik7XFxuICBsZXQgaG9tZUxpc3RDb2wgPSBnZXRJdGVtKFxcXCJob21lTGlzdENvbFxcXCIsIFxcXCJcXFwiKSB8fCBkZUNvbCB8fCBcXFwibW92aWVfM19tYXJxdWVlXFxcIjtcXG4gIGxldCBzdHlwZSA9IGRycHkuZ2V0UnVsZShcXFwi57G75Z6LXFxcIik7XFxuICBsZXQgaWNvbiA9IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL2tlLzE1MC5wbmdcXFwiO1xcbiAgc3dpdGNoIChzdHlwZSkge1xcbiAgICBjYXNlICfmvKvnlLsnOlxcbiAgICAgIGljb24gPSBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9rZS8xMy5wbmdcXFwiO1xcbiAgICAgIGJyZWFrO1xcbiAgICBjYXNlICflsI/or7QnOlxcbiAgICAgIGljb24gPSBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9rZS8zOC5wbmdcXFwiO1xcbiAgICAgIGJyZWFrO1xcbiAgICBkZWZhdWx0OlxcbiAgfVxcbiAgdXBkYXRlSXRlbShNWV9SVUxFLnRpdGxlICsgXFxcInNvdXJjZW5hbWVcXFwiLCB7XFxuICAgIGltZzogaWNvbixcXG4gIH0pXFxuXFxuICBsZXQgbGlzdCA9IFtdO1xcbiAgaWYgKGNhdGUgPT0gXFxcImhvbWVcXFwiKSB7XFxuICAgIGlmIChwYWdlID09IDEpIHtcXG4gICAgICBsaXN0ID0gaG9tZWxpc3Q7XFxuICAgIH1cXG4gICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZCkge1xcbiAgICAgIGxpc3QgPSBbXTtcXG4gICAgICBjbGVhck15VmFyKFxcXCJpc2hvbWVcXFwiKTtcXG4gICAgfVxcbiAgICBpZiAobGlzdC5sZW5ndGggPiAwICYmICFsaXN0LmF0KDApLnZvZF9waWMgJiYgIWxpc3QuYXQoLTEpLnZvZF9waWMgJiYgIWRlQ29sKSB7XFxuICAgICAgaG9tZUxpc3RDb2wgPSBcXFwidGV4dF8xXFxcIjtcXG4gICAgfVxcbiAgfSBlbHNlIHtcXG4gICAgbGlzdCA9IEpTT04ucGFyc2UoZHJweS5jYXRlZ29yeShTdHJpbmcoY2F0ZSksIHBhZ2UsIHRydWUsIGZsKSkubGlzdDtcXG4gIH1cXG5cXG4gIGlmIChsaXN0Lmxlbmd0aCkge1xcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgbGV0IGlkID0gU3RyaW5nKGl0LnZvZF9pZCk7XFxuICAgICAgLy9sb2coaXQpXFxuICAgICAgbGV0IG5hbWUgPSBpdC52b2RfbmFtZTtcXG4gICAgICB1cmwgPSBcXFwiaGlrZXI6Ly9wYWdlL2RldGFpbGVkI2ltbWVyc2l2ZVRoZW1lI1xcXCI7XFxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXFxcInN0cmluZ1xcXCIgJiYgaWQuaW5jbHVkZXMoXFxcIm1zZWFyY2g6XFxcIikgfHwgaWQgPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICB1cmwgPSAkKFxcXCJcXFwiKS5sYXp5UnVsZSgobmFtZSkgPT4ge1xcbiAgICAgICAgICBwdXRNeVZhcihcXFwidGVtc21vZGVcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vc2VhcmNoP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiJnM9XFxcIiArIG5hbWU7XFxuICAgICAgICB9LCBuYW1lKVxcbiAgICAgIH1cXG4gICAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IG5hbWUsXFxuICAgICAgICBkZXNjOiBpdC52b2RfcmVtYXJrcyxcXG4gICAgICAgIHVybDogdXJsLFxcbiAgICAgICAgcGljX3VybDogaXQudm9kX3BpYyxcXG4gICAgICAgIGNvbF90eXBlOiBob21lTGlzdENvbCxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGltZzogaXQudm9kX3BpYyxcXG4gICAgICAgICAgdm9kSWQ6IGlkLFxcbiAgICAgICAgICBzbmFtZTogc291cmNlLm5hbWUsXFxuICAgICAgICAgIHNrZXk6IHNvdXJjZS5rZXksXFxuICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuiBmuWQiOaQnOe0olxcXCIsXFxuICAgICAgICAgICAganM6IFxcXCJwdXRNeVZhcigndGVtc21vZGUnLCAnMScpOydoaWtlcjovL3NlYXJjaD9ydWxlPScgKyBNWV9SVUxFLnRpdGxlICsgJyZzPVxcXCIgKyBuYW1lICsgXFxcIic7XFxcIlxcbiAgICAgICAgICB9XVxcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICB9XFxuICB9XFxuICBkZWxldGVJdGVtKE1ZX1JVTEUudGl0bGUgKyBcXFwibG9hZFxcXCIpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXREcnB5UGF0aChkKSB7XFxuICBkLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIue8uuWwkei/kOihjOW6k1xcXFxu6K+l5bCP56iL5bqP5LiN6IO96YCa6L+H5LqR5Ymq6LS05p2/5YiG5Lqr77yM5Y+q6IO96YCa6L+H5omT5YyF5YiG5LqrXFxcIixcXG4gICAgZGVzYzogXFxcIuWwhui/kOihjOW6k+aUvuWFpVxcXCIgKyBnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL2RhdGEvXFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiL2xpYnNfaGlrZXIvZHJweTIuanNcXFwiKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRIaWVkKGQsIG5hbWUsIGNvbmZpZykge1xcbiAgbGV0IHtcXG4gICAgdWlfY29uZmlnLFxcbiAgICByZW9yZGVyQXJyYXlCeU9yZGVyXFxuICB9ID0gJC5yZXF1aXJlKFxcXCJVSU1hbmFnZVxcXCIpO1xcbiAgdWlfY29uZmlnID0gdWlfY29uZmlnLnlpO1xcbiAgbGV0IHVpX2luZGV4cyA9IHVpX2NvbmZpZy51aTtcXG5cXG4gIGxldCBzZWxlY3RzID0gW3tcXG4gICAgdGl0bGU6IFxcXCLmlLbol49cXFwiLFxcbiAgICBpY29uOiAnaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9zeXN0ZW0vMTM5LnBuZydcXG4gIH0sIHtcXG4gICAgdGl0bGU6IFxcXCLkuabmnrYt5bCP6K+0XFxcIixcXG4gICAgaWNvbjogJ2h0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vcS8xMy5wbmcnXFxuICB9LCB7XFxuICAgIHRpdGxlOiBcXFwi5Lmm5p62Lea8q+eUu1xcXCIsXFxuICAgIGljb246ICdodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3EvMzQucG5nJ1xcbiAgfV1cXG5cXG4gIGxldCBmYXZpY29ucyA9IHtcXG4gICAgZ2V0KHN0KSB7XFxuICAgICAgc3QgPSBzdCB8fCBzZWxlY3RzO1xcbiAgICAgIHJldHVybiAkKHN0LCAyLCBcXFwi5oiR55qEXFxcIikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwi5Y6G5Y+yXFxcIikpIHtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2hpc3Rvcnk/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZTtcXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcIuS5puaeti3lsI/or7RcXFwiKSkge1xcbiAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vcGFnZS9Cb29rcmFjay52aWV3I25vUmVjb3JkSGlzdG9yeSM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIYmdHlwZT1ub3ZlbCZydWxlTmFtZT0nICsgTVlfUlVMRS50aXRsZTtcXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcIuS5puaeti3mvKvnlLtcXFwiKSkge1xcbiAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vcGFnZS9Cb29rcmFjay52aWV3I25vUmVjb3JkSGlzdG9yeSM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIYmdHlwZT1jb21pYyZydWxlTmFtZT0nICsgTVlfUlVMRS50aXRsZTtcXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcIuaUtuiXj1xcXCIpKSB7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9jb2xsZWN0aW9uP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGU7XFxuICAgICAgICB9XFxuICAgICAgfSlcXG4gICAgfVxcbiAgfTtcXG5cXG5cXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYXZpY29ucywgJ3NlbGVjdCcsIHtcXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XFxuICAgICAgcmV0dXJuIHNlbGVjdHM7XFxuICAgIH0sXFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XFxuICAgICAgc2VsZWN0cy5wdXNoKHZhbHVlKTtcXG4gICAgfVxcbiAgfSk7XFxuICBHTS5wdXQoXFxcImZhdmljb25zXFxcIiwgZmF2aWNvbnMpO1xcblxcbiAgbGV0IHNtb2RlID0gTnVtYmVyKGdldEl0ZW0oXFxcInNtb2RlXFxcIiwgXFxcIjBcXFwiKSk7XFxuICBsZXQgZmlsZVNlbGVjdCA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbiAgbGV0IHVpb2JqID0gW107XFxuXFxuXFxuICB1aW9iai5wdXNoKHtcXG4gICAgaW5kZXg6IDAsXFxuICAgIGtleTogXFxcIuaNoua6kFxcXCIsXFxuICAgIHRpdGxlOiBcXFwi5o2i5rqQXFxcIixcXG4gICAgY29sX3R5cGU6IHVpX2NvbmZpZy5jb2wsXFxuICAgIGltZzogJ2h0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzEzMC5wbmcnLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICQucmVxdWlyZShcXFwiQ2hhbmdlU291cmNlUG9wXFxcIikuc2hvdygpO1xcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBleHRyYToge1xcbiAgICAgIGNwYXRoOiBjb25maWcucGF0aCxcXG4gICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICB0aXRsZTogXFxcIuabtOaNoumFjee9rlxcXCIsXFxuICAgICAgICBqczogSlNPTi5zdHJpbmdpZnkoXFxcImhpa2VyOi8vcGFnZS9jcmVhdGVDb25maWcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIilcXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIuiuv+mXrue9keermVxcXCIsXFxuICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcXG4gICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgRHJweU1hbmFnZS5nZXQoc291cmNlLmtleSkuZ2V0UnVsZShcXFwiaG9zdFxcXCIpO1xcbiAgICAgICAgICAvL3JlZnJlc2hQYWdlKCk7XFxuICAgICAgICB9KVxcbiAgICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Yi35paw5rqQXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiKTtcXG4gICAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcbiAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICBEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KS5pbml0KHJ1bnRpbWVDb25maWcuZ2V0QWJzb2x1dGVQYXRoKHNvdXJjZS5leHQpKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0pXFxuICAgICAgfSwge1xcbiAgICAgICAgdGl0bGU6IFxcXCLph43ovb3mupBcXFwiLFxcbiAgICAgICAganM6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XFxuICAgICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICAgICAgICAgIERycHlNYW5hZ2UuZGVsKHNvdXJjZS5rZXkpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSlcXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIuafpeeci+a6kOS7o+eggVxcXCIsXFxuICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcXG4gICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgbGV0IGNvZGUgPSBEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KS5ydW5NYWluKFxcXCJsZXQgbWFpbj1cXFwiICsgJC50b1N0cmluZygoZXh0KSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuICgpID0+IGdldE9yaWdpbmFsSnMocmVxdWVzdChleHQsIHtcXG4gICAgICAgICAgICAgICdtZXRob2QnOiAnR0VUJ1xcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgfSwgcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlUGF0aCgpKSk7XFxuXFxuICAgICAgICAgIGxldCBwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL3ZpZXdTb3VyY2VDb2RlLmpzXFxcIjtcXG4gICAgICAgICAgd3JpdGVGaWxlKHBhdGgsIGNvZGUpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImVkaXRGaWxlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICB9KVxcbiAgICAgIH1dLmNvbmNhdChjb25maWcudHlwZSA9PT0gXFxcImxvY2FsRGlyXFxcIiA/IFt7XFxuICAgICAgICB0aXRsZTogXFxcIuacrOWcsOeuoeeQhlxcXCIsXFxuICAgICAgICBqczogXFxcIidoaWtlcjovL3BhZ2UvTG9jYWxEaXIjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjJ1xcXCJcXG4gICAgICB9XSA6IFtdKVxcbiAgICB9XFxuICB9KTtcXG5cXG4gIHVpb2JqLnB1c2goe1xcbiAgICBpbmRleDogMSxcXG4gICAga2V5OiBcXFwi5pCc57Si5qih5byPXFxcIixcXG4gICAgdGl0bGU6IFtcXFwi6YCJ5LitXFxcIiwgXFxcIuiBmuWQiFxcXCJdW3Ntb2RlXSxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICBsZXQgc21vZGUgPSBOdW1iZXIoZ2V0SXRlbShcXFwic21vZGVcXFwiLCBcXFwiMFxcXCIpKTtcXG4gICAgICByZXR1cm4gJChbXFxcIumAieS4rVxcXCIsIFxcXCLogZrlkIhcXFwiXSwgMSwgXFxcIuaQnOe0ouaooeW8j1xcXCIsIHNtb2RlKS5zZWxlY3QoKHQpID0+IHtcXG4gICAgICAgIHNldEl0ZW0oXFxcInNtb2RlXFxcIiwgXFxcIlxcXCIgKyBNWV9JTkRFWCk7XFxuICAgICAgICB1cGRhdGVJdGVtKHQgKyBcXFwiQHNlYXJjaF9tb2RlXFxcIiwge1xcbiAgICAgICAgICB0aXRsZTogW1xcXCLpgInkuK1cXFwiLCBcXFwi6IGa5ZCIXFxcIl1bTVlfSU5ERVhdLFxcbiAgICAgICAgfSlcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgTVlfUlVMRS50aXRsZSlcXG4gICAgfSksXFxuICAgIGltZzogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzE0OS5wbmdcXFwiLFxcbiAgICBjb2xfdHlwZTogdWlfY29uZmlnLmNvbCxcXG4gICAgZXh0cmE6IHtcXG4gICAgICBpZDogTVlfUlVMRS50aXRsZSArIFxcXCJAc2VhcmNoX21vZGVcXFwiLFxcbiAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgIHRpdGxlOiBcXFwi5oyH5a6a5pCc57Si5rqQXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgJC5yZXF1aXJlKFxcXCJTZWFyY2hBbGxvd1BvcFxcXCIpLnNob3coKTtcXG4gICAgICAgIH0pXFxuICAgICAgfV1cXG4gICAgfVxcbiAgfSk7XFxuXFxuICBsZXQgc2V0dGluZ3MgPSBbXFxcIuino+aekOeuoeeQhlxcXCIsIFxcXCLlrpjmlrnlvLnluZVcXFwiLCBcXFwi5pSv5oyB5L2c6ICFXFxcIiwgXFxcIuiwg+ivleaXpeW/lzpcXFwiICsgKGdldEl0ZW0oXFxcInVzZUxvZ1xcXCIsIFxcXCJcXFwiKSA9PSBcXFwiXFxcIiA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuW8gOWQr1xcXCIpLCBcXFwi5YiG5Lqr5a+85YWl6Lev5b6EXFxcIiwgXFxcIuWIm+W7uuiuoumYheWcsOWdgFxcXCIsIFxcXCLliIfmjaLliJfooajmoLflvI9cXFwiLCBcXFwiVUnnrqHnkIZcXFwiLCBcXFwi5pu05o2i6YWN572uXFxcIl07XFxuICBsZXQgZGlzVmlzaWJsZXMgPSB1aV9pbmRleHMuZmlsdGVyKHggPT4geC5pbmRleCA9PSAtMSk7XFxuICBpZiAoZGlzVmlzaWJsZXMuc29tZSh4ID0+IHgua2V5ID09IFxcXCLmkJzntKLmqKHlvI9cXFwiKSkge1xcbiAgICBzZXR0aW5ncy5wdXNoKFxcXCLmkJzntKLmqKHlvI86XFxcIiArIFtcXFwi6YCJ5LitXFxcIiwgXFxcIuiBmuWQiFxcXCJdW3Ntb2RlXSlcXG4gICAgc2V0dGluZ3MucHVzaChcXFwi5pCc57Si5oyH5a6a5rqQXFxcIilcXG4gIH1cXG4gIGlmIChkaXNWaXNpYmxlcy5zb21lKHggPT4geC5rZXkgPT0gXFxcIuaUtuiXj1xcXCIpKSB7XFxuICAgIHNldHRpbmdzLnB1c2goXFxcIuaIkeeahFxcXCIpO1xcbiAgfVxcblxcbiAgdWlvYmoucHVzaCh7XFxuICAgIGtleTogXFxcIuiuvue9rlxcXCIsXFxuICAgIGluZGV4OiAyLFxcbiAgICB0aXRsZTogXFxcIuiuvue9rlxcXCIsXFxuICAgIHVybDogJChzZXR0aW5ncywgMiwgXFxcIuiuvue9rlxcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgaWYgKFxcXCLop6PmnpDnrqHnkIZcXFwiID09IGlucHV0KSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9ydWxlTWFuYWdlI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgfSBlbHNlIGlmIChcXFwi5a6Y5pa55by55bmVXFxcIiA9PT0gaW5wdXQpIHtcXG4gICAgICAgIGxldCB1c2VEYW5tdSA9ICEhZ2V0SXRlbShcXFwidXNlRGFubXVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICByZXR1cm4gJChcXFwi5b2T5Li65a6Y5rqQ5pe25Yy56YWN5by55bmVKOmcgOimgWRhbm1155uS5a2Q5pSv5oyBKVxcXFxu5b2T5YmNOlxcXCIgKyB1c2VEYW5tdSArIFxcXCJcXFxcbueCueWHu+ehruWumuWNs+WPr1xcXCIgKyAodXNlRGFubXUgPyBcXFwi5YWz6ZetXFxcIiA6IFxcXCLlvIDlkK9cXFwiKSkuY29uZmlybSgodXNlRGFubXUpID0+IHtcXG4gICAgICAgICAgc2V0SXRlbShcXFwidXNlRGFubXVcXFwiLCB1c2VEYW5tdSA/IFxcXCJcXFwiIDogXFxcIjFcXFwiKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyAodXNlRGFubXUgPyBcXFwi5bey5YWz6ZetXFxcIiA6IFxcXCLlt7LlvIDlkK9cXFwiKTtcXG4gICAgICAgIH0sIHVzZURhbm11KTtcXG4gICAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCLosIPor5Xml6Xlv5dcXFwiKSkge1xcbiAgICAgICAgbGV0IHVzZUxvZyA9ICEhZ2V0SXRlbShcXFwidXNlTG9nXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgcmV0dXJuICQoXFxcIuW8gOWQr+aXpeW/l+i+heWKqeiwg+ivle+8jOaZrumAmuS9v+eUqOS4jemcgOimgeW8gOWQr1xcXFxu5b2T5YmNOlxcXCIgKyB1c2VMb2cgKyBcXFwiXFxcXG7ngrnlh7vnoa7lrprljbPlj69cXFwiICsgKHVzZUxvZyA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuW8gOWQr1xcXCIpKS5jb25maXJtKCh1c2VMb2cpID0+IHtcXG4gICAgICAgICAgc2V0SXRlbShcXFwidXNlTG9nXFxcIiwgdXNlTG9nID8gXFxcIlxcXCIgOiBcXFwiMVxcXCIpO1xcbiAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XFxuICAgICAgICAgIGlmIChzb3VyY2UpIHtcXG4gICAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcXFwiRHJweU1hbmFnZVxcXCIpO1xcbiAgICAgICAgICAgIERycHlNYW5hZ2UuZGVsKHNvdXJjZS5rZXkpO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgKHVzZUxvZyA/IFxcXCLlt7LlhbPpl61cXFwiIDogXFxcIuW3suW8gOWQr1xcXCIpO1xcbiAgICAgICAgfSwgdXNlTG9nKTtcXG4gICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5Yib5bu66K6i6ZiF5Zyw5Z2AXFxcIikge1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvY3JlYXRlU3Vic2NyaXB0aW9uI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuWIh+aNouWIl+ihqOagt+W8j1xcXCIpIHtcXG4gICAgICAgIGxldCBjb2xsaXN0ID0gW1xcXCLpu5jorqRcXFwiLCBcXFwibW92aWVfM19tYXJxdWVlXFxcIiwgXFxcIm1vdmllXzNcXFwiLCBcXFwibW92aWVfMlxcXCIsIFxcXCJtb3ZpZV8xXFxcIiwgXFxcInRleHRfMVxcXCJdO1xcbiAgICAgICAgbGV0IGhvbWVMaXN0Q29sID0gZ2V0SXRlbShcXFwiaG9tZUxpc3RDb2xcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBsZXQgaW5kZXggPSBob21lTGlzdENvbCA/IGNvbGxpc3QuaW5kZXhPZihob21lTGlzdENvbCkgOiAwO1xcbiAgICAgICAgcmV0dXJuICQoY29sbGlzdCwgMSwgXFxcIumAieaLqeagt+W8j1xcXCIsIGluZGV4KS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICBpZiAoTVlfSU5ERVggPT09IDApIHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJob21lTGlzdENvbFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJob21lTGlzdENvbFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSk7XFxuICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuabtOaNoumFjee9rlxcXCIpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2NyZWF0ZUNvbmZpZyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgIH0gZWxzZSBpZiAoXFxcIuaUr+aMgeS9nOiAhVxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL0RvbmF0ZS52I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgfSBlbHNlIGlmIChcXFwiVUnnrqHnkIZcXFwiID09IGlucHV0KSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9VSU1hbmFnZT9tb2RlPeS4gOe6pyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgIH0gZWxzZSBpZiAoXFxcIuWIhuS6q+WvvOWFpei3r+W+hFxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3NoYXJlZGVmYXVsdHBhdGgjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICB9IGVsc2UgaWYgKGlucHV0LmluY2x1ZGVzKFxcXCLmkJzntKLmqKHlvI9cXFwiKSkge1xcbiAgICAgICAgbGV0IHNtb2RlID0gTnVtYmVyKGdldEl0ZW0oXFxcInNtb2RlXFxcIiwgXFxcIjBcXFwiKSk7XFxuICAgICAgICByZXR1cm4gJChbXFxcIumAieS4rVxcXCIsIFxcXCLogZrlkIhcXFwiXSwgMSwgXFxcIuaQnOe0ouaooeW8j1xcXCIsIHNtb2RlKS5zZWxlY3QoKHQpID0+IHtcXG4gICAgICAgICAgc2V0SXRlbShcXFwic21vZGVcXFwiLCBcXFwiXFxcIiArIE1ZX0lOREVYKTtcXG4gICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIE1ZX1JVTEUudGl0bGUpXFxuICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PSBcXFwi5pCc57Si5oyH5a6a5rqQXFxcIikge1xcbiAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiU2VhcmNoQWxsb3dQb3BcXFwiKS5zaG93KCk7XFxuICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PSBcXFwi5oiR55qEXFxcIikge1xcbiAgICAgICAgbGV0IGZhdmljb25zID0gR00uZ2V0KFxcXCJmYXZpY29uc1xcXCIpO1xcbiAgICAgICAgcmV0dXJuIGZhdmljb25zLmdldCgpO1xcbiAgICAgIH1cXG4gICAgfSksXFxuICAgIGltZzogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzE1MC5wbmdcXFwiLFxcbiAgICBjb2xfdHlwZTogdWlfY29uZmlnLmNvbCxcXG4gIH0pO1xcbiAgdWlvYmoucHVzaCh7XFxuICAgIGluZGV4OiAzLFxcbiAgICBrZXk6IFxcXCLljoblj7JcXFwiLFxcbiAgICB0aXRsZTogXFxcIuWOhuWPslxcXCIsXFxuICAgIGNvbF90eXBlOiB1aV9jb25maWcuY29sLFxcbiAgICBpbWc6ICdodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3N5c3RlbS8xMzYucG5nJyxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9oaXN0b3J5P3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUsXFxuICB9KTtcXG4gIHVpb2JqLnB1c2goe1xcbiAgICBpbmRleDogNCxcXG4gICAga2V5OiBcXFwi5pS26JePXFxcIixcXG4gICAgdGl0bGU6IFxcXCLmlLbol49cXFwiLFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgIGxldCBmYXZpY29ucyA9IEdNLmdldChcXFwiZmF2aWNvbnNcXFwiKTtcXG4gICAgICByZXR1cm4gZmF2aWNvbnMuZ2V0KCk7XFxuICAgIH0pLFxcbiAgICBpbWc6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3N5c3RlbS8xMzkucG5nXFxcIixcXG4gICAgY29sX3R5cGU6IHVpX2NvbmZpZy5jb2wsXFxuICB9KTtcXG4gIHVpb2JqLnB1c2goe1xcbiAgICBpbmRleDogNSxcXG4gICAga2V5OiBcXFwi5rqQ5ZCNXFxcIixcXG4gICAgdGl0bGU6IFxcXCLlvZPliY3mupA6XFxcIiArIChuYW1lIHx8IFxcXCJcXFwiKSxcXG4gICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICBpbWc6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL2tlLzE1MC5wbmdcXFwiLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+eCueS4iumdouaNoua6kFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgaWQ6IE1ZX1JVTEUudGl0bGUgKyBcXFwic291cmNlbmFtZVxcXCIsXFxuICAgIH1cXG4gIH0pO1xcbiAgdWlvYmoucHVzaCh7XFxuICAgIGluZGV4OiA2LFxcbiAgICBrZXk6IFxcXCLmkJzntKJcXFwiLFxcbiAgICB0aXRsZTogJ+aQnOe0oicsXFxuICAgIC8vZGVzYzogJycsXFxuICAgIGRlc2M6ICfopoHmkJzngrnku4DkuYgnLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgIHJldHVybiAnaGlrZXI6Ly9zZWFyY2g/cnVsZT0nICsgTVlfUlVMRS50aXRsZSArIFxcXCImcz1cXFwiICsgaW5wdXQ7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJrZXl3b3JkXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJrZXl3b3JkXFxcIiwgaW5wdXQpXFxuICAgICAgfSlcXG4gICAgfVxcbiAgfSk7XFxuICBzdG9yYWdlMC5wdXRNeVZhcihcXFwidWlvYmpcXFwiLCB1aW9iaik7XFxuXFxuICBzdWlvYmogPSB1aW9iai5zbGljZSgpO1xcbiAgdWlvYmogPSByZW9yZGVyQXJyYXlCeU9yZGVyKHVpb2JqLCB1aV9pbmRleHMpO1xcbiAgdWlfaW5kZXhzLm1hcChpdGVtID0+IHtcXG4gICAgaWYgKGl0ZW0ua2V5ID09IFxcXCLmjaLmupBcXFwiICYmIGl0ZW0uaW5kZXggPT0gLTEpIHtcXG4gICAgICBsZXQgb2JqaSA9IHN1aW9iai5maW5kSW5kZXgoeCA9PiB4LmtleSA9PSBcXFwi5o2i5rqQXFxcIik7XFxuICAgICAgbGV0IGNvYmppID0gdWlvYmouZmluZEluZGV4KHggPT4geC5rZXkgPT0gXFxcIua6kOWQjVxcXCIpO1xcbiAgICAgIGlmIChvYmppICE9IDEgJiYgY29iamkgIT0gLTEpIHtcXG4gICAgICAgIHVpb2JqW2NvYmppXS51cmwgPSBzdWlvYmpbb2JqaV0udXJsO1xcbiAgICAgICAgaWYgKHN1aW9ialtvYmppXS5oYXNPd25Qcm9wZXJ0eShcXFwiZXh0cmFcXFwiKSkge1xcbiAgICAgICAgICB1aW9ialtjb2JqaV0uZXh0cmEgPSBzdWlvYmpbb2JqaV0uZXh0cmE7XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChpdGVtLmtleSA9PSBcXFwi5rqQ5ZCNXFxcIiAmJiBpdGVtLmluZGV4ID09IC0xKSB7XFxuICAgICAgbGV0IG9iamkgPSBzdWlvYmouZmluZEluZGV4KHggPT4geC5rZXkgPT0gXFxcIua6kOWQjVxcXCIpO1xcbiAgICAgIGxldCBjb2JqaSA9IHVpb2JqLmZpbmRJbmRleCh4ID0+IHgua2V5ID09IFxcXCLmjaLmupBcXFwiKTtcXG4gICAgICBpZiAob2JqaSAhPSAxICYmIGNvYmppICE9IC0xKSB7XFxuICAgICAgICB1aW9ialtjb2JqaV0udGl0bGUgPSBuYW1lIHx8IFxcXCLmjaLmupBcXFwiO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAoaXRlbS5rZXkgPT0gXFxcIuWOhuWPslxcXCIgJiYgaXRlbS5pbmRleCA9PSAtMSkge1xcbiAgICAgIHNlbGVjdHMudW5zaGlmdCh7IFxcXCJ0aXRsZVxcXCI6IFxcXCLljoblj7JcXFwiLCBcXFwiaWNvblxcXCI6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL3N5c3RlbS8xMzYucG5nXFxcIiB9KVxcbiAgICB9XFxuICB9KTtcXG5cXG4gIHVpb2JqLmZvckVhY2goaXRlbSA9PiB7XFxuICAgIGQucHVzaChpdGVtKVxcbiAgfSlcXG5cXG4gIFxcblxcbn1cXG5sZXQgZCA9IFtdO1xcblxcbmxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxubGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG5EcnB5TWFuYWdlLmluaXRQYWdlKFxcXCJob21lXFxcIik7XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbn0pO1xcbnRyeSB7XFxuICBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMzAgJiYgIWFuZHJvaWQub3MuRW52aXJvbm1lbnQuaXNFeHRlcm5hbFN0b3JhZ2VNYW5hZ2VyKCkpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogXFxcIuKAmOKAmOaPkOekuuKAmeKAmVxcXCIsXFxuICAgICAgZGVzYzogXFxcIuW9k+WJjeayoeacieaWh+S7tueuoeeQhuadg+mZkOaXoOazleato+W4uOS9v+eUqOivt+aJk+W8gOa1t+mYlOiuvue9rj0+5pu05aSa6K6+572uPT7lhoXpg6jmlofku7bnrqHnkIY9PuWPs+S4iuinklxcXCIsXFxuICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICB9KTtcXG4gIH0gZWxzZSBpZiAoIXJ1bnRpbWVDb25maWcuaXNQcmVwYXJlZCgpKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IFxcXCLov5jmsqHmnInphY3nva7op4bpopHmupBcXFwiLFxcbiAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9jcmVhdGVDb25maWcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB9KTtcXG4gIH0gZWxzZSBpZiAoZmlsZUV4aXN0KFxcXCJoaWtlcjovL2ZpbGVzL2RhdGEvXFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiL2xpYnNfaGlrZXIvZHJweTIuanNcXFwiKSkge1xcbiAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XFxuICAgIGlmIChNWV9QQUdFID09PSAxKSB7XFxuICAgICAgaWYgKHNvdXJjZSA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgIHNldEhpZWQoZClcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgc2V0SGllZChkLCBzb3VyY2UubmFtZSwgcnVudGltZUNvbmZpZy5nZXRDdXJyZW50Q29uZmlnKCkgfHwge30pO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICAvL2xvZyhEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KSlcXG4gICAgbGV0IGhhc0hhZWQgPSBmYWxzZTtcXG4gICAgaWYgKGdldE15VmFyKFxcXCJsaW5rc1xcXCIsIFxcXCJcXFwiKSA9PSBcXFwiXFxcIikge1xcbiAgICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+WKoOi9veS4rS4uLicsXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgIGlkOiBNWV9SVUxFLnRpdGxlICsgXFxcImxvYWRcXFwiXFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgICAgc2V0UHJlUmVzdWx0KGQpO1xcbiAgICAgIGQubGVuZ3RoID0gMDtcXG4gICAgICBoYXNIYWVkID0gdHJ1ZTtcXG4gICAgfVxcbiAgICBpZiAoc291cmNlKSB7XFxuICAgICAgbG9hZChkLCBEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KSwgc291cmNlLCBoYXNIYWVkKTtcXG4gICAgfVxcbiAgfSBlbHNlIHtcXG4gICAgc2V0RHJweVBhdGgoZCk7XFxuICB9XFxuXFxufSBjYXRjaCAoZSkge1xcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgZS50b1N0cmluZygpICsgXFxcIuKAneKAnVxcXCIsXFxuICAgIGRlc2M6IGUubGluZU51bWJlcixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmuIXpmaR1aeiuvue9rlxcXCIsIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgbGV0IHtcXG4gICAgICAgICAgICB1aV9jbGVhcixcXG4gICAgICAgICAgfSA9ICQucmVxdWlyZShcXFwiVUlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgdWlfY2xlYXIoXFxcInlpXFxcIik7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICB9KVxcbiAgICAgIH1dXFxuICAgIH1cXG4gIH0pO1xcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmm7TmjaLphY3nva5cXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvY3JlYXRlQ29uZmlnI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG4gIH0pO1xcbiAgZGVsZXRlSXRlbShNWV9SVUxFLnRpdGxlICsgXFxcImxvYWRcXFwiKTtcXG59XFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Li76aG15aSE55CGXCIsXCJwYXRoXCI6XCJNaWFuTG9hZFwiLFwicnVsZVwiOlwiaWYgKGdldEl0ZW0oXFxcImZpcnN0b3BlblxcXCIpID09IE1ZX1JVTEUudmVyc2lvbikge1xcbiAgICAkLnJlcXVpcmUoXFxcIm1pYW5cXFwiKTtcXG59IGVsc2UgaWYgKE1ZX1BBR0UgPT09IDEpIHtcXG4gICAgbGV0IGQgPSBbXVxcbiAgICBsZXQgdGltZSA9IGdldEl0ZW0oXFxcImZpcnN0b3BlblxcXCIsIFxcXCJcXFwiKSA/IDYgOiAyMDtcXG4gICAgbGV0IGlkID0gRGF0ZS5ub3coKTtcXG4gICAgbGV0IGNvbnRlbnQgPSBgXFxuICAgIDEuIOacrOWwj+eoi+W6j+aJgOacieS7o+eggeWFqOmDqOW8gOa6kO+8jOS4lOacrOinhOWImeS4uuWtpuS5oOebrueahO+8jOivt+S6juWvvOWFpTI05bCP5pe25YaF5Yig6Zmk77yB77yB77yBXFxuICAgIDIuIOacrOWwj+eoi+W6jzxiPuWujOWFqOWFjei0uTwvYj7vvIzlpoLmnpzkvaDmmK/ku5jotLnotK3kubDnmoTmga3llpzkvaDooqvpqpfkuobjgIJcXG4gICAg5b2T54S25aaC5p6c5pyJ6IO95Yqb5oOz6byT5Yqx5L2c6ICF55qE5Y+v5LulJHtcXFwi5pSv5oyB5LiA5LiLXFxcIi5saW5rKFxcXCJoaWtlcjovL3BhZ2UvRG9uYXRlLnYjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIil9PC9hPig8c21hbGw+54K55Ye75Y+v6L+b5YWl5o2Q6LWg77yM5Y+v5Zyo5Li76aG16I+c5Y2V6L+b5YWlPC9zbWFsbD4p44CCXFxuICAgIDMuIOacrOWwj+eoi+W6j+WPquaUr+aMgemBk+mVv+eahGRycHlbanNd6KeG6aKR5rqQ77yM5YW25LuW5LiA5qaC5LiN5pSv5oyB44CCXFxuICAgIFxcbiAgICA8Yj7lvIDlp4vkvb/nlKjmnKzop4TliJnljbPku6PooajpgbXlrojop4TliJnmnaHkvos8L2I+XFxuICAgIGA7XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxzdHJvbmc+5L2/55So5YmN6aG755+lPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGNvbnRlbnQudHJpbSgpLnJlcGxhY2UoL1xcXFxuXFxcXHMqPy9nLCBcXFwiPGJyPlxcXCIpLFxcbiAgICAgICAgXFxcImNvbF90eXBlXFxcIjogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSwge1xcbiAgICAgICAgdGl0bGU6IGDlvZPliY3niYjmnKzvvJoke01ZX1JVTEUudmVyc2lvbn0gJHtnZXRJdGVtKFxcXCJmaXJzdG9wZW5cXFwiLCBcXFwiXFxcIikgJiYgZ2V0SXRlbShcXFwiZmlyc3RvcGVuXFxcIiwgXFxcIlxcXCIpIDwgTVlfUlVMRS52ZXJzaW9uID8gXFxcIvCfhpVcXFwiIDogXFxcIlxcXCJ9YCxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gICAgICAgICAgICBoaWtlclBvcC51cGRhdGVSZWNvcmRzQm90dG9tKFt7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwiMjAyNC8wNi8xMiAgTWF4VmVyc2lvbiAyNlxcXCIsXFxuICAgICAgICAgICAgICAgIHJlY29yZHM6IFtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCLigJjigJhuZXfigJnigJnvvJrlnKjmjaLmupDnlYzpnaLnmoToj5zljZXlj6/ku6XlvIDlkK/liIbkuqvml7bmmK/lkKbkvb/nlKjnvJbnoIHjgIJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIm9wdGltaXpl77ya5Zyo6YCJ5rqQ55WM6Z2i5Yi35paw6YWN572u5ZCO5Lya5ZCM5q2l5pu05paw5pWw6YeP5pi+56S644CCXFxcIixcXG4gICAgICAgICAgICAgICAgXVxcbiAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCIyMDI0LzA2LzEwICBNYXhWZXJzaW9uIDI1XFxcIixcXG4gICAgICAgICAgICAgICAgcmVjb3JkczogW1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIuKAmOKAmG5ld+KAmeKAme+8muWinuWKoOabtOaWsOaXpeW/l+OAglxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwi4oCY4oCYbmV34oCZ4oCZ77ya6YCJ5rqQ6ZW/5oyJ6I+c5Y2V77yM5aKe5Yqg6Lez6L2s572R6aG177yM5p+l55yL5rqQ56CB44CCXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCLigJzigJxmaXjigJ3igJ3vvJrkv67lpI3nvJbovpHop6PmnpDnlYzpnaLmtYvor5Vqc+ino+aekOS4gOebtOWksei0peOAglxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwi4oCc4oCcZml44oCd4oCd77ya5L+u5aSNZ2l0aHVi6K6i6ZiF77yM5Lya5Yig6Zmk5YWo6YOo6KeE5YiZ5paH5Lu244CCXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCLigJzigJxmaXjigJ3igJ3vvJrkv67lpI3op6PmnpDosIPnlKjlpLHotKXjgIJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIuKAnOKAnGZpeOKAneKAne+8muS/ruWkjeabtOaNoumFjee9ruaXtuayoeacieWPiuaXtua4heepumRycHnnvJPlrZjjgIJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIm9wdGltaXpl77ya5pu05pS56K6i6ZiF5pu05paw562W55Wl77yM5Lya5Yig6Zmk5pys5Zyw5aSx5pWI5rqQ44CCXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJvcHRpbWl6Ze+8muabtOaWsGRycHkyLmpz44CCXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJvcHRpbWl6Ze+8muS8mOWMluino+aekGZsYWfljLnphY3jgIJcXFwiLFxcblxcbiAgICAgICAgICAgICAgICBdXFxuICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIjIwMjQvMDYvMDkgTWF4VmVyc2lvbiAyMFxcXCIsXFxuICAgICAgICAgICAgICAgIHJlY29yZHM6IFtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCLigJjigJhuZXfigJnigJnvvJrmlK/mjIFwcm94eV9ydWxl5Luj55CG44CCXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCLigJzigJxmaXjigJ3igJ3vvJrkv67lpI3kupHnm5jpk77mjqXkuI3osIPlj5bkupHnm5jnroDjgIJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIuKAnOKAnGZpeOKAneKAne+8muS/ruWkjeWTlOWTqeW9seinhuS4jeiDveS9v+eUqOino+aekOOAglxcXCIsXFxuICAgICAgICAgICAgICAgIF1cXG4gICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwiMjAyNC8wNi8wOCBNYXhWZXJzaW9uIDE4XFxcIixcXG4gICAgICAgICAgICAgICAgcmVjb3JkczogW1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIm9wdGltaXpl77ya5LyY5YyW6K6+572u6I+c5Y2V5o6S54mI77yM6YOo5YiG55WM6Z2i5aKe5Yqg5o+Q56S644CCXFxcIixcXG4gICAgICAgICAgICAgICAgXVxcbiAgICAgICAgICAgIH1dKTtcXG5cXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSwge1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogdGltZSArIFxcXCLnp5LlkI7nu6fnu61cXFwiLFxcbiAgICAgICAgdXJsOiBcXFwidG9hc3Q6Ly/or7forqTnnJ/pmIXor7vku6XkuIrlhoXlrrlcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IGlkICsgXFxcInRpbWVyXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG4gICAgc2V0UmVzdWx0KGQpO1xcbiAgICB3aGlsZSAodGltZSAhPSAwKSB7XFxuICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDEwMDApO1xcbiAgICAgICAgdGltZSAtPSAxO1xcbiAgICAgICAgdXBkYXRlSXRlbShpZCArIFxcXCJ0aW1lclxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogdGltZSArIFxcXCLnp5LlkI7nu6fnu61cXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICB1cGRhdGVJdGVtKGlkICsgXFxcInRpbWVyXFxcIiwge1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzmiJHlkIzmhI/ku6XkuIropoHmsYLigJ3igJ1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCh2KSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwiZmlyc3RvcGVuXFxcIiwgU3RyaW5nKHYpKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mhJ/osKLmgqjnmoTnkIbop6NcXFwiO1xcbiAgICAgICAgfSwgTVlfUlVMRS52ZXJzaW9uKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgfSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiVWnnrqHnkIZcIixcInBhdGhcIjpcIlVJTWFuYWdlXCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiByZW9yZGVyQXJyYXlCeU9yZGVyKGFycmF5LCBvcmRlcikge1xcbiAgICAvLyDliJvlu7rkuIDkuKrmmKDlsITvvIzlsIZrZXnlgLzmmKDlsITliLDljp/lp4vmlbDnu4TkuK3nmoTlr7nosaFcXG4gICAgbGV0IG1hcCA9IG5ldyBNYXAoYXJyYXkubWFwKG9iaiA9PiBbb2JqLmtleSwgb2JqXSkpO1xcbiAgICBsZXQgcmVvcmRlcmVkQXJyYXkgPSBbXTsgLy8g6YeN5paw5o6S5bqP5ZCO55qE5pWw57uEXFxuICAgIGxldCByZW1vdmVkS2V5cyA9IG5ldyBTZXQoKTsgLy8g5a2Y5YKo6ZyA6KaB56e76Zmk55qEa2V55YC8XFxuICAgIC8vIOagueaNrm9yZGVy5pWw57uE5p2l6YeN5paw5o6S5YiXYXJyYXnmlbDnu4RcXG4gICAgb3JkZXIuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICAgICAgaWYgKGl0ZW0uaW5kZXggPT09IC0xKSB7XFxuICAgICAgICAgICAgLy8g5aaC5p6caW5kZXjmmK8tMe+8jOWwhmtleea3u+WKoOWIsOenu+mZpOWIl+ihqOS4rVxcbiAgICAgICAgICAgIHJlbW92ZWRLZXlzLmFkZChpdGVtLmtleSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIC8vIOWmguaenGluZGV45LiN5pivLTHvvIzliJnlsIblr7nosaHmt7vliqDliLDnu5PmnpzmlbDnu4TkuK3nmoTmjIflrprkvY3nva5cXG4gICAgICAgICAgICBsZXQgb2JqID0gbWFwLmdldChpdGVtLmtleSk7XFxuXFxuICAgICAgICAgICAgaWYgKGl0ZW0uaGFzT3duUHJvcGVydHkoXFxcImltZ1xcXCIpICYmIGl0ZW0uaW1nKSB7XFxuICAgICAgICAgICAgICAgIG9iai5pbWcgPSBpdGVtLmltZ1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoaXRlbS5oYXNPd25Qcm9wZXJ0eShcXFwidGl0bGVcXFwiKSAmJiBpdGVtLnRpdGxlKSB7XFxuICAgICAgICAgICAgICAgIG9iai50aXRsZSA9IGl0ZW0udGl0bGU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChvYmopIHtcXG4gICAgICAgICAgICAgICAgcmVvcmRlcmVkQXJyYXlbaV0gPSBvYmo7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgLy8g5re75Yqg6YKj5Lqb5LiN5Zyob3JkZXLmlbDnu4TkuK3nmoTlr7nosaHvvIzlubbmjpLpmaTnp7vpmaTliJfooajkuK3nmoTpoblcXG4gICAgYXJyYXkuZm9yRWFjaChvYmogPT4ge1xcbiAgICAgICAgaWYgKCFyZW1vdmVkS2V5cy5oYXMob2JqLmtleSkgJiYgIXJlb3JkZXJlZEFycmF5LmluY2x1ZGVzKG9iaikpIHtcXG4gICAgICAgICAgICByZW9yZGVyZWRBcnJheS5wdXNoKG9iaik7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICAvLyDov4fmu6Tmjonnu5PmnpzmlbDnu4TkuK3nmoR1bmRlZmluZWTpobnvvIzlubbov5Tlm55cXG4gICAgcmV0dXJuIHJlb3JkZXJlZEFycmF5LmZpbHRlcihvYmogPT4gb2JqICE9PSB1bmRlZmluZWQpO1xcbn1cXG5cXG5cXG5cXG4kLmV4dGVuZCh7XFxuICAgIHN3YXBBcnJheUVsZW1lbnRzKGFycmF5LCBpbmRleDEsIGluZGV4Mikge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IGFycmF5LnNsaWNlKCk7XFxuICAgICAgICBpbmRleDEgPSBhcnJheS5maW5kSW5kZXgoeCA9PiB4LmluZGV4ID09IGluZGV4MSk7XFxuICAgICAgICBpbmRleDIgPSBhcnJheS5maW5kSW5kZXgoeCA9PiB4LmluZGV4ID09IGluZGV4Mik7XFxuICAgICAgICAvLyDkvb/nlKjkuLTml7blj5jph4/kuqTmjaLkuKTkuKrlhYPntKBcXG4gICAgICAgIGNvbnN0IHRlbXAgPSByZXN1bHRbaW5kZXgxXTtcXG4gICAgICAgIHJlc3VsdFtpbmRleDFdID0gcmVzdWx0W2luZGV4Ml07XFxuICAgICAgICByZXN1bHRbaW5kZXgyXSA9IHRlbXA7XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9XFxufSlcXG5cXG5sZXQgZGVmID0ge1xcbiAgICB5aToge1xcbiAgICAgICAgdWk6IFtdLFxcbiAgICAgICAgY29sOiBcXFwiaWNvbl81XFxcIlxcbiAgICB9LFxcbiAgICBlcjoge1xcbiAgICAgICAg5YiG6aG1OiA1MCxcXG4gICAgICAgIOWOhuWPsuiusOW9lTogMjAwXFxuICAgIH1cXG59XFxubGV0IHVpX2NvbmZpZyA9IHN0b3JhZ2UwLmdldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIGRlZik7XFxudWlfY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmLCB1aV9jb25maWcpO1xcblxcbmZ1bmN0aW9uIHVpX2NsZWFyKGtleSkge1xcbiAgICB1aV9jb25maWdba2V5XSA9IGRlZltrZXldO1xcbiAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1aV9jb25maWcpO1xcbn1cXG5cXG4kLmV4cG9ydHMgPSB7XFxuICAgIHVpX2NsZWFyLFxcbiAgICB1aV9jb25maWcsXFxuICAgIHJlb3JkZXJBcnJheUJ5T3JkZXIsXFxufVxcblxcbmlmIChnZXRQYXJhbShcXFwibW9kZVxcXCIsIFxcXCJcXFwiKSAhPSBcXFwiXFxcIikge1xcbiAgICBhZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwidWlfbmF2aVxcXCIpO1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwidWltb2RlXFxcIik7XFxuICAgIH0pKVxcblxcbiAgICBzZXRQYWdlVGl0bGUoXFxcIlVJ566h55CGXFxcIik7XFxuICAgIGxldCBkID0gW107XFxuICAgIGxldCB1aV9uYXYgPSBbXFxcIuS4gOe6p1xcXCIsIFxcXCLkuoznuqdcXFwiXTtcXG4gICAgbGV0IHVpX25hdmkgPSBnZXRNeVZhcihcXFwidWlfbmF2aVxcXCIsIGdldFBhcmFtKFxcXCJtb2RlXFxcIiwgXFxcIuS4gOe6p1xcXCIpKTtcXG4gICAgdWlfbmF2LmZvckVhY2goeCA9PiB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArICh4ID09IHVpX25hdmkgPyB4LmZvbnRjb2xvcihcXFwicmVkXFxcIikgOiB4KSxcXG4gICAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGl0KSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJ1aV9uYXZpXFxcIiwgaXQpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH0sIHgpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgfSlcXG4gICAgfSlcXG5cXG4gICAgaWYgKHVpX25hdmkgPT0gXFxcIuS4gOe6p1xcXCIpIHtcXG4gICAgICAgIHZhciB1aW9iaiA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJ1aW9ialxcXCIsIFtdKTtcXG4gICAgICAgIHZhciBzdWlvYmogPSB1aW9iai5zbGljZSgpO1xcbiAgICAgICAgbGV0IGl0ZW1zID0gdWlvYmoubWFwKGl0ZW0gPT4ge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGtleTogaXRlbS5rZXksXFxuICAgICAgICAgICAgICAgIGluZGV4OiBpdGVtLmluZGV4XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgdWltb2RlID0gZ2V0TXlWYXIoXFxcInVpbW9kZVxcXCIsIFxcXCIwXFxcIikgPT0gXFxcIjBcXFwiID8gZmFsc2UgOiB0cnVlO1xcbiAgICAgICAgaWYgKHVpX2NvbmZpZy55aS51aS5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgICAgIHVpX2NvbmZpZy55aS51aSA9IGl0ZW1zXFxuICAgICAgICB9XFxuXFxuICAgICAgICBsZXQgaW5kZXhzID0gdWlfY29uZmlnLnlpLnVpO1xcblxcbiAgICAgICAgdWlvYmogPSB1aW9iai5tYXAoaXRlbSA9PiB7XFxuICAgICAgICAgICAgaWYgKCEvKGljb25fMV9zZWFyY2h8YXZhdGFyfGlucHV0KS8udGVzdChpdGVtLmNvbF90eXBlKSkge1xcbiAgICAgICAgICAgICAgICBpdGVtLmNvbF90eXBlID0gdWlfY29uZmlnLnlpLmNvbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XFxuICAgICAgICB9KVxcblxcbiAgICAgICAgdWlvYmogPSByZW9yZGVyQXJyYXlCeU9yZGVyKHVpb2JqLCBpbmRleHMpO1xcblxcbiAgICAgICAgaWYgKHVpbW9kZSkge1xcbiAgICAgICAgICAgIHVpb2JqID0gdWlvYmoubWFwKChpdGVtLCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBsb25nY2xpY2tzID0gW107XFxuICAgICAgICAgICAgICAgIGl0ZW0udGl0bGUgPSBpdGVtLmtleTtcXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29sX3R5cGUgPT0gXFxcImlucHV0XFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jb2xfdHlwZSA9IFxcXCJpY29uXzFfc2VhcmNoXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpdGVtLnVybCA9ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGksIHVpX2NvbmZpZywgaW5kZXhzKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICB1aV9jb25maWcgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1aV9jb25maWcpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVpX2NvbmZpZy55aS51aS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhzID0gdWlfY29uZmlnLnlpLnVpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBmaW5kSXRlbShNWV9SVUxFLnRpdGxlICsgXFxcIl91aVxcXCIgKyBpKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnRpdGxlLmluY2x1ZGVzKFxcXCJmb250XFxcIikgfHwgaXRlbS50aXRsZS5pbmNsdWRlcyhcXFwi4p6h77iPXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGl0ZW0uZXh0cmEuaWQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUucmVwbGFjZSgv4oCYfOKAmXzigJx84oCdfDxbXj5dKz4vZywgXFxcIlxcXCIpLnJlcGxhY2UoXFxcIuKeoe+4j1xcXCIsIFxcXCJcXFwiKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcInVpX2N1cnJlbnRcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwidWlfY3VycmVudFxcXCIsIHt9KTtcXG5cXG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjdXJyZW50KS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpdGVtLmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBjdXJyZW50LnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWM6IGN1cnJlbnQucGljIHx8IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBjdXJyZW50LmRlc2MgfHwgXFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBjdXJyZW50LnR5cGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLmV4dHJhLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGN1cnJlbnQuZXh0cmEua2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGN1cnJlbnQuZXh0cmEuaW5kZXhcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKGN1cnJlbnQuZXh0cmEuaWQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYzogaXRlbS5waWMgfHwgXFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IGl0ZW0uZGVzYyB8fCBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IGl0ZW0udHlwZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnQuZXh0cmEsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogaXRlbS5leHRyYS5rZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaXRlbS5leHRyYS5pbmRleFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYXJyID0gJC5zd2FwQXJyYXlFbGVtZW50cyhpbmRleHMsIGN1cnJlbnQuZXh0cmEuaW5kZXgsIGl0ZW0uZXh0cmEuaW5kZXgpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpX2NvbmZpZy55aS51aSA9IG5hcnI7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwidWlfY29uZmlnXFxcIiwgdWlfY29uZmlnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJ1aV9jdXJyZW50XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoID0gJ+KAnOKAnOKAneKAnSc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS50aXRsZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdChcXFwi6YCJ5oup56e75Yqo55qE55uu5qCHXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC90ZXh0X2ljb258YXZhdGFyfGljb25fc21hbGxfMy8udGVzdChpdGVtLnR5cGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5mb250Y29sb3IoXFxcIiNmZmZcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKC9pY29uXzFfc2VhcmNoLy50ZXN0KGl0ZW0udHlwZSkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IFxcXCLinqHvuI9cXFwiICsgdGl0bGU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5mb250Y29sb3IoXFxcIiNmZmZcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpdGVtLmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBoICsgdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwidWlfY3VycmVudFxcXCIsIGl0ZW0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgfSwgaSwgdWlfY29uZmlnLCBpbmRleHMpXFxuICAgICAgICAgICAgICAgIGl0ZW1bXFxcImV4dHJhXFxcIl0gPSB7XFxuICAgICAgICAgICAgICAgICAgICBrZXk6IGl0ZW0ua2V5LFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBNWV9SVUxFLnRpdGxlICsgXFxcIl91aVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiICsgaSxcXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBpdGVtLmluZGV4LFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmtleSAhPSBcXFwi6K6+572uXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgbG9uZ2NsaWNrcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGtleSwgdWlfY29uZmlnKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IHVpX2NvbmZpZy55aS51aTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSBpdGVtcy5maW5kSW5kZXgoeCA9PiB4LmtleSA9PSBrZXkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV1bXFxcImluZGV4XFxcIl0gPSAtMTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aV9jb25maWcueWkudWkgPSBpdGVtcztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwidWlfY29uZmlnXFxcIiwgdWlfY29uZmlnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBpdGVtLmtleSwgdWlfY29uZmlnKVxcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoIS9pY29uXzFfc2VhcmNofGF2YXRhci8udGVzdChpdGVtLmNvbF90eXBlKSkge1xcbiAgICAgICAgICAgICAgICAgICAgbG9uZ2NsaWNrcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuabtOaNouWbvuagh1xcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGtleSwgdWlfY29uZmlnLCBpbmRleHMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIpLmlucHV0KChrZXksIHVpX2NvbmZpZywgaW5kZXhzKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aV9jb25maWcgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1aV9jb25maWcpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVpX2NvbmZpZy55aS51aS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhzID0gdWlfY29uZmlnLnlpLnVpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gaW5kZXhzO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSBpdGVtcy5maW5kSW5kZXgoeCA9PiB4LmtleSA9PSBrZXkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXVtcXFwiaW1nXFxcIl0gPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpX2NvbmZpZy55aS51aSA9IGl0ZW1zO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwidWlfY29uZmlnXFxcIiwgdWlfY29uZmlnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZCA9IGZpbmRJdGVtc0J5Q2xzKE1ZX1JVTEUudGl0bGUgKyBcXFwiX3VpXFxcIikuZmlsdGVyKHggPT4geC5leHRyYS5rZXkgPT0ga2V5KVswXS5leHRyYS5pZDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaWQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWM6IGlucHV0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBrZXksIHVpX2NvbmZpZywgaW5kZXhzKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGl0ZW0ua2V5LCB1aV9jb25maWcsIGluZGV4cylcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5rZXkgIT0gXFxcIuaNoua6kFxcXCIgJiYgaXRlbS5rZXkgIT0gXFxcIuaQnOe0ouaooeW8j1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb25nY2xpY2tzLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuS/ruaUueWQjeensFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChrZXksIHVpX2NvbmZpZywgaW5kZXhzKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwiXFxcIikuaW5wdXQoKGtleSwgdWlfY29uZmlnLCBpbmRleHMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aV9jb25maWcgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1aV9jb25maWcpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1aV9jb25maWcueWkudWkubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleHMgPSB1aV9jb25maWcueWkudWk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IGluZGV4cztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IGl0ZW1zLmZpbmRJbmRleCh4ID0+IHgua2V5ID09IGtleSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV1bXFxcInRpdGxlXFxcIl0gPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlfY29uZmlnLnlpLnVpID0gaXRlbXM7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwidWlfY29uZmlnXFxcIiwgdWlfY29uZmlnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBmaW5kSXRlbXNCeUNscyhNWV9SVUxFLnRpdGxlICsgXFxcIl91aVxcXCIpLmZpbHRlcih4ID0+IHguZXh0cmEua2V5ID09IGtleSlbMF0uZXh0cmEuaWQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogaW5wdXRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwga2V5LCB1aV9jb25maWcsIGluZGV4cylcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXRlbS5rZXksIHVpX2NvbmZpZywgaW5kZXhzKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaXRlbS5leHRyYS5Mb25nQ2xpY2sgPSBsb25nY2xpY2tzO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB1aW9iaiA9IHVpb2JqLm1hcCgoaXRlbSwgaSkgPT4ge1xcbiAgICAgICAgICAgICAgICBpdGVtLmV4dHJhID0ge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX1JVTEUudGl0bGUgKyBcXFwiX3VpXFxcIiArIGksXFxuICAgICAgICAgICAgICAgICAgICBjbHM6IE1ZX1JVTEUudGl0bGUgKyBcXFwiX3VpXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9XFxuICAgICAgICBkID0gZC5jb25jYXQodWlvYmopO1xcblxcbiAgICAgICAgaWYgKGluZGV4cy5zb21lKHggPT4geC5pbmRleCA9PSAtMSkgJiYgdWltb2RlKSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLlt7Lnp7vpmaRcXFwiLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICBpbmRleHMuZmlsdGVyKHggPT4geC5pbmRleCA9PSAtMSkuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgbWFwID0gbmV3IE1hcChzdWlvYmoubWFwKG9iaiA9PiBbb2JqLmtleSwgb2JqXSkpO1xcbiAgICAgICAgICAgICAgICBsZXQgb2JqID0gbWFwLmdldChpdGVtLmtleSk7XFxuICAgICAgICAgICAgICAgIG9iai51cmwgPSAkKFxcXCJcXFwiKS5sYXp5UnVsZSgoa2V5LCB1aV9jb25maWcsIGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbXMgPSB1aV9jb25maWcueWkudWk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IGl0ZW1zLmZpbmRJbmRleCh4ID0+IHgua2V5ID09IGtleSk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldW1xcXCJpbmRleFxcXCJdID0gaW5kZXg7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1aV9jb25maWcpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIGl0ZW0ua2V5LCB1aV9jb25maWcsIG9iai5pbmRleClcXG4gICAgICAgICAgICAgICAgb2JqLnRpdGxlID0gb2JqLmtleTtcXG4gICAgICAgICAgICAgICAgaWYgKG9iai5leHRyYSA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgICAgIG9iai5leHRyYSA9IHt9O1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIG9iai5leHRyYS5pZCA9IE1ZX1JVTEUudGl0bGUgKyBcXFwiX3VpXFxcIiArIG9iai5rZXk7XFxuICAgICAgICAgICAgICAgIG9iai5leHRyYS5jbHMgPSBNWV9SVUxFLnRpdGxlICsgXFxcIl91aVxcXCI7XFxuXFxuICAgICAgICAgICAgICAgIGlmIChvYmouY29sX3R5cGUgPT0gXFxcImlucHV0XFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgb2JqLmNvbF90eXBlID0gXFxcImljb25fMV9zZWFyY2hcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGQucHVzaChvYmopXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICAgICAgfSwge1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArICh1aW1vZGUgPyBcXFwi5L+u5pS5XFxcIi5mb250Y29sb3IoXFxcInJlZFxcXCIpIDogXFxcIuS/ruaUuVxcXCIpLFxcbiAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCB1aW1vZGUgPSBnZXRNeVZhcihcXFwidWltb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcInVpbW9kZVxcXCIsIHVpbW9kZSA9PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS5XFxcIiArICh1aW1vZGUgPT0gXFxcIjBcXFwiID8gXFxcIuW8gOWQrzrngrnlh7vmjInpkq7kuqTmjaLkvY3nva4s6ZW/5oyJ5oyJ6ZKu5L+u5pS55oiW6ICF5Yig6ZmkXFxcIiA6IFxcXCLlhbPpl61cXFwiKTtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgICAgICB9LCB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLov5jljp9cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHVpX2NvbmZpZywgZGVmKSA9PiB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLmmK/lkKbmgaLlpI3orr7nva5cXFwiKS5jb25maXJtKCh1aV9jb25maWcsIGRlZikgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdWlfY29uZmlnLnlpID0gZGVmLnlpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIHVpX2NvbmZpZyk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6L+Y5Y6f5a6M5oiQXFxcIjtcXG4gICAgICAgICAgICAgICAgfSwgdWlfY29uZmlnLCBkZWYpXFxuICAgICAgICAgICAgfSwgdWlfY29uZmlnLCBkZWYpLFxcbiAgICAgICAgfSwge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgYmFjayh0cnVlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIExvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5aSN5Yi2XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCh1aV9jb25maWcpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5KEpTT04uc3RyaW5naWZ5KHVpX2NvbmZpZy55aSkpO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgdWlfY29uZmlnKSxcXG4gICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLlr7zlhaVcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHVpX2NvbmZpZykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1YyA9IHN0b3JhZ2UwLmdldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIHVpX2NvbmZpZyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcInt7Y2xpcGJvYXJkfX1cXFwiKS5pbnB1dCgodWMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHlpID0ge307XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aSA9IEpTT04ucGFyc2UoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHlpLmhhc093blByb3BlcnR5KFxcXCJ1aVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWMueWkgPSB5aTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1Yyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcIuagvOW8j+mUmeivr1xcXCIpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB1YylcXG4gICAgICAgICAgICAgICAgICAgIH0sIHVpX2NvbmZpZylcXG4gICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuWktOmDqOe7hOS7tuagt+W8jzpcXFwiICsgdWlfY29uZmlnLnlpLmNvbCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCh1aV9jb25maWcpID0+IHtcXG4gICAgICAgICAgICAgICAgdWlfY29uZmlnID0gc3RvcmFnZTAuZ2V0SXRlbShcXFwidWlfY29uZmlnXFxcIiwgdWlfY29uZmlnKTtcXG4gICAgICAgICAgICAgICAgbGV0IGFsbF9jb2xzID0gWycnXS5jb25jYXQoZ2V0Q29sVHlwZXMoKSk7XFxuICAgICAgICAgICAgICAgIGFsbF9jb2xzID0gYWxsX2NvbHMuZmlsdGVyKHggPT5cXG4gICAgICAgICAgICAgICAgICAgIC8oaWNvbikvLnRlc3QoeCkgJiYgeCAhPSAndGV4dF9pY29uJyAmJlxcbiAgICAgICAgICAgICAgICAgICAgeCAhPSBcXFwiaWNvbl8xX3NlYXJjaFxcXCIpO1xcbiAgICAgICAgICAgICAgICAvL2xvZyhhbGxfY29scylcXG4gICAgICAgICAgICAgICAgbGV0IGNvbCA9IHVpX2NvbmZpZy55aS5jb2w7XFxuICAgICAgICAgICAgICAgIGxldCDmjInpkq7moLflvI8gPSBhbGxfY29scy5tYXAoKGl0KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQgPT09IGNvbCA/ICfinqHvuI8nICsgaXQgOiBpdDtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIGxldCB0aXBzID0gJ+ivt+mAieaLqeWktOmDqOaMiemSruagt+W8jyc7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKOaMiemSruagt+W8jywgMiwgdGlwcykuc2VsZWN0KCh1aV9jb25maWcpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZShcXFwi4p6h77iPXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9ianMgPSAoZmluZEl0ZW1zQnlDbHMoTVlfUlVMRS50aXRsZSArIFxcXCJfdWlcXFwiKSB8fCBbXSkuZmlsdGVyKHggPT4gIS8oaWNvbl8xX3NlYXJjaHxhdmF0YXJ8aW5wdXQpLy50ZXN0KHgudHlwZSkpO1xcbiAgICAgICAgICAgICAgICAgICAgb2Jqcy5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oeC5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogaW5wdXQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHVpX2NvbmZpZy55aS5jb2wgPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIHVpX2NvbmZpZyk7XFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKE1ZX1JVTEUudGl0bGUgKyBcXFwiX3lpY29sXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5aS06YOo57uE5Lu25qC35byPOlxcXCIgKyB1aV9jb25maWcueWkuY29sXFxuICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICB9LCB1aV9jb25maWcpXFxuICAgICAgICAgICAgfSwgdWlfY29uZmlnKSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9SVUxFLnRpdGxlICsgXFxcIl95aWNvbFxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICB9XFxuXFxuICAgIGlmICh1aV9uYXZpID09IFxcXCLkuoznuqdcXFwiKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5q+P6aG15pWw6YePXFxcIixcXG4gICAgICAgICAgICBkZXNjOiBcXFwiMOWImeihqOekuuS4jeWIhumhtVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkLnRvU3RyaW5nKCh1aV9jb25maWcpID0+IHtcXG4gICAgICAgICAgICAgICAgaWYgKFN0cmluZyhpbnB1dCkubGVuZ3RoID4gMykge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpTPkvY3mlbDlrZfku6XlhoVcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoaW5wdXQpLmxlbmd0aCA8IDIgJiYgaW5wdXQgIT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpTLkvY3mlbDlrZfku6XkuIpcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHVpX2NvbmZpZy5lci7liIbpobUgPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwidWlfY29uZmlnXFxcIiwgdWlfY29uZmlnKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyAoaW5wdXQgPiAwID8gXFxcIuavj+mhteaVsOmHj+iuvue9ruS4ujpcXFwiICsgaW5wdXQgOiBcXFwi5LiN5YiG6aG1XFxcIik7XFxuICAgICAgICAgICAgfSwgdWlfY29uZmlnKSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygodWlfY29uZmlnKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoU3RyaW5nKGlucHV0KS5sZW5ndGggPiAzKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcIuivt+i+k+WFpTPkvY3mlbDlrZfku6XlhoVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBpZiAoU3RyaW5nKGlucHV0KS5sZW5ndGggPCAyICYmIGlucHV0ICE9IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdChcXFwi6K+36L6T5YWlMuS9jeaVsOWtl+S7peS4ilxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHVpX2NvbmZpZy5lci7liIbpobUgPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIHVpX2NvbmZpZyk7XFxuICAgICAgICAgICAgICAgIH0sIHVpX2NvbmZpZyksXFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogdWlfY29uZmlnLmVyLuWIhumhtSxcXG4gICAgICAgICAgICAgICAgdHlwZTogXFxcIm51bWJlclxcXCIsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG5cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLljoblj7LorrDlvZVcXFwiLFxcbiAgICAgICAgICAgIGRlc2M6IFxcXCLpu5jorqQyMDBcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICAgICAgICAgIHVybDogJC50b1N0cmluZygodWlfY29uZmlnKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmIChTdHJpbmcoaW5wdXQpLmxlbmd0aCA+IDMpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaUz5L2N5pWw5a2X5Lul5YaFXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoU3RyaW5nKGlucHV0KS5sZW5ndGggPCAyKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWlMuS9jeaVsOWtl+S7peS4ilxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdWlfY29uZmlnLmVyLuWOhuWPsuiusOW9lSA9IGlucHV0O1xcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJ1aV9jb25maWdcXFwiLCB1aV9jb25maWcpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Y6G5Y+y6K6w5b2V6K6+572u5Li6OlxcXCIgKyBpbnB1dDtcXG4gICAgICAgICAgICB9LCB1aV9jb25maWcpLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogdWlfY29uZmlnLmVyLuWOhuWPsuiusOW9lSxcXG4gICAgICAgICAgICAgICAgdHlwZTogXFxcIm51bWJlclxcXCIsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLov5jljp9cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHVpX2NvbmZpZywgZGVmKSA9PiB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLmmK/lkKbmgaLlpI3orr7nva5cXFwiKS5jb25maXJtKCh1aV9jb25maWcsIGRlZikgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdWlfY29uZmlnLmVyID0gZGVmLmVyO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcInVpX2NvbmZpZ1xcXCIsIHVpX2NvbmZpZyk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6L+Y5Y6f5a6M5oiQXFxcIjtcXG4gICAgICAgICAgICAgICAgfSwgdWlfY29uZmlnLCBkZWYpXFxuICAgICAgICAgICAgfSwgdWlfY29uZmlnLCBkZWYpLFxcbiAgICAgICAgfSwge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwicGxheWxpc3RfcmVhZHlcXFwiKTtcXG4gICAgICAgICAgICAgICAgYmFjayh0cnVlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9KVxcbiAgICB9XFxuICAgIHNldFJlc3VsdChkKTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJMb2NhbFByb3h5XCIsXCJwYXRoXCI6XCJMb2NhbFByb3h5XCIsXCJydWxlXCI6XCJmdW5jdGlvbiBwcm94eSgpIHtcXG4gICAgZnVuY3Rpb24gcGFyc2VWaWRlbyhNWV9QQVJBTVMsIHRpdGxlKSB7XFxuICAgICAgICBmdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBwYXRoID0gW107XFxuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSAnJztcXG4gICAgICAgICAgICBsZXQgaW5CcmFja2V0cyA9IGZhbHNlO1xcbiAgICAgICAgICAgIGxldCBlc2NhcGUgPSBmYWxzZTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBjaGFyID0gdmFsdWVbaV07XFxuICAgICAgICAgICAgICAgIGlmIChlc2NhcGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcXG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IGZhbHNlO1xcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICdcXFxcXFxcXCcpIHtcXG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IHRydWU7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJy4nICYmICFpbkJyYWNrZXRzKSB7XFxuICAgICAgICAgICAgICAgICAgICBwYXRoLnB1c2goY3VycmVudCk7XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gJyc7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1snKSB7XFxuICAgICAgICAgICAgICAgICAgICBpbkJyYWNrZXRzID0gdHJ1ZTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXScpIHtcXG4gICAgICAgICAgICAgICAgICAgIGluQnJhY2tldHMgPSBmYWxzZTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoY3VycmVudCkge1xcbiAgICAgICAgICAgICAgICBwYXRoLnB1c2goY3VycmVudCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgZnVuY3Rpb24gZ2V0SnNvbihvYmosIHBhdGgpIHtcXG4gICAgICAgICAgICBpZiAoIW9iaiB8fCAhQXJyYXkuaXNBcnJheShwYXRoKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBvYmo7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBwYXRoW2ldO1xcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcnVuVHlwZSA9IE1ZX1BBUkFNUy5ydW5UeXBlWzBdO1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBkZWNvZGVVUklDb21wb25lbnQoYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy51cmxbMF0pKTtcXG4gICAgICAgICAgICBpZiAocnVuVHlwZSA9PSBcXFwiSlNPTlxcXCIpIHtcXG5cXG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy5wYXJhbVswXSkpKTtcXG4gICAgICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBwYXJhbS5oZWFkZXJzIHx8IHt9LFxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBwYXJhbS5tZXRob2QgfHwgdm9pZCAwXFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDMwMixcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtLmhlYWRlcnMgfHwge30sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiTG9jYXRpb25cXFwiOiBnZXRKc29uKGpzb24sIHRvUGF0aChwYXJhbS5qc29uUGF0aCkpLFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChydW5UeXBlID09IFxcXCJKU1xcXCIpIHtcXG5cXG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlO1xcbiAgICAgICAgICAgICAgICBpZiAoTVlfUEFSQU1TLmluZGV4KSB7XFxuICAgICAgICAgICAgICAgICAgICBwYXJzZSA9ICQucmVxdWlyZShcXFwiY29uZmlncz9ydWxlPVxcXCIgKyB0aXRsZSkuZ2V0SnNvbigpW01ZX1BBUkFNUy5pbmRleFswXV07XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKGRlY29kZVVSSUNvbXBvbmVudChNWV9QQVJBTVMucGFyYW1bMF0pKSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IHJlcyA9IG5ldyBGdW5jdGlvbihcXFwidXJsXFxcIiwgXFxcInNlbGZcXFwiLCBwYXJzZS5qcykodXJsLCBwYXJzZSk7XFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzID09PSBcXFwic3RyaW5nXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAzMDIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiTG9jYXRpb25cXFwiOiByZXNcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkLnR5cGUocmVzKSA9PT0gXFxcIm9iamVjdFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMzAyLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gZG9KcyhNWV9QQVJBTVMsIHRpdGxlLCBna2V5KSB7XFxuICAgICAgICBsZXQge1xcbiAgICAgICAgICAgIEdNXFxuICAgICAgICB9ID0gJC5yZXF1aXJlKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTE2JmF1dGg9MWQzNWU4ZjAtMjJlOC01MjcwLWE5ZDEtODI2ZjUzZjE3N2FkXFxcIik7XFxuICAgICAgICBHTS5zZXRTZWxmS2V5KGdrZXkpO1xcbiAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiLCBcXFwiRHJweU1hbmFnZT9ydWxlPVxcXCIgKyB0aXRsZSk7XFxuICAgICAgICBsZXQgZHJweSA9IERycHlNYW5hZ2UuZ2V0KGRlY29kZVVSSUNvbXBvbmVudChNWV9QQVJBTVMuaGlrZXJTa2V5WzBdKSk7XFxuICAgICAgICBsZXQgcGFyYW1zID0ge307XFxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gTVlfUEFSQU1TKSB7XFxuICAgICAgICAgICAgcGFyYW1zW2tleV0gPSBTdHJpbmcoTVlfUEFSQU1TW2tleV1bMF0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgXFxuICAgICAgICBcXG4gICAgICAgIC8vbGV0IHJlc3VsdCA9IGRycHkucHJveHkocGFyYW1zKTtcXG4gICAgICAgIGxldCByZXN1bHQgPSBEcnB5TWFuYWdlLnJ1blByb3h5KGRycHksIFtwYXJhbXNdKTtcXG4gICAgICAgXFxuICAgICAgICBsZXQgW2NvZGUsIG1lZGlhX3R5cGUsIGRhdGEsIGhlYWRlcnMsIGlzUmV0dXJuQnl0ZXNdID0gcmVzdWx0O1xcbiAgICAgICAgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHtcXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogbWVkaWFfdHlwZSxcXG4gICAgICAgIH0sIGhlYWRlcnMpO1xcbiAgICAgICAgaWYodHlwZW9mIGRhdGE9PT1cXFwic3RyaW5nXFxcIiYmZGF0YS5zdGFydHNXaXRoKFxcXCJkYXRhOlxcXCIpJiZkYXRhLmluY2x1ZGVzKFxcXCJiYXNlNjQsXFxcIikpe1xcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNwbGl0KFxcXCJiYXNlNjQsXFxcIilbMV07XFxuICAgICAgICAgICAgY29uc3QgQ3J5cHRvVXRpbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9hc3NldHMvY3J5cHRvLWphdmEuanNcXFwiKTtcXG4gICAgICAgICAgICBkYXRhID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlQmFzZTY0KGRhdGEpLnRvQnl0ZXMoKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgc3RhdHVzQ29kZTogY29kZSxcXG4gICAgICAgICAgICBib2R5OiBkYXRhLFxcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXFxuICAgICAgICB9O1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIGVudHJhbmNlKE1ZX1BBUkFNUywgdGl0bGUsIGdrZXkpIHtcXG4gICAgICAgIGlmIChNWV9QQVJBTVMuZG8gJiYgTVlfUEFSQU1TLmRvWzBdID09PSBcXFwianNcXFwiKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvSnMoTVlfUEFSQU1TLCB0aXRsZSwgZ2tleSk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVmlkZW8oTVlfUEFSQU1TLCB0aXRsZSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgdGhpcy5lbnRyYW5jZSA9IGVudHJhbmNlO1xcbn1cXG5cXG5mdW5jdGlvbiBzdGFydFByb3h5KHRpdGxlLCBna2V5KSB7XFxuICAgIHJldHVybiBzdGFydFByb3h5U2VydmVyKCQudG9TdHJpbmcoKHByb3h5LCB0aXRsZSwgZ2tleSkgPT4ge1xcbiAgICAgICAgcmV0dXJuIG5ldyBwcm94eSgpLmVudHJhbmNlKE1ZX1BBUkFNUywgdGl0bGUsIGdrZXkpO1xcbiAgICB9LCBwcm94eSwgdGl0bGUsIGdrZXkpKTtcXG59XFxuJC5leHBvcnRzLnN0YXJ0UHJveHkgPSBzdGFydFByb3h5O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiSmF2YUdaSVBcIixcInBhdGhcIjpcIkdaSVBcIixcInJ1bGVcIjpcImxldCBGaWxlVXRpbCA9IGNvbS5leGFtcGxlLmhpa2Vydmlldy51dGlscy5GaWxlVXRpbDtcXG5sZXQgamF2YVN0cmluZyA9IGphdmEubGFuZy5TdHJpbmc7XFxubGV0IEJhc2U2NCA9IGphdmEudXRpbC5CYXNlNjQ7XFxuY29uc3QgR1pJUE91dHB1dFN0cmVhbSA9IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTtcXG5jb25zdCBHWklQSW5wdXRTdHJlYW0gPSBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTtcXG5jb25zdCBEZWZsYXRlck91dHB1dFN0cmVhbSA9IGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW07XFxuY29uc3QgSW5mbGF0ZXJJbnB1dFN0cmVhbSA9IGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbTtcXG5jb25zdCBEZWZsYXRlcklucHV0U3RyZWFtID0gamF2YS51dGlsLnppcC5EZWZsYXRlcklucHV0U3RyZWFtO1xcbmNvbnN0IEJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtO1xcbmNvbnN0IEJ5dGVBcnJheUlucHV0U3RyZWFtID0gamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTtcXG5jb25zdCBEZWZsYXRlciA9IGphdmEudXRpbC56aXAuRGVmbGF0ZXI7XFxuXFxuZnVuY3Rpb24gemlwKHRleHQsIG1vZGUpIHtcXG4gICAgbW9kZSA9IG1vZGUgPyBtb2RlIDogXFxcImd6aXBcXFwiO1xcbiAgICBsZXQgYmFzZVN0ciA9IG5ldyBqYXZhU3RyaW5nKHRleHQpO1xcbiAgICAvLyDkvb/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+356iN562JXFxcIi5zbWFsbCgpLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuc2V0UmVzdWx0KGQpO1wifV0iLCJpY29uIjoiIiwicHJveHkiOiIifQ==
Add Comment
Please, Sign In to add comment