xiaomianao666

小程序:云盘君.简

Mar 2nd, 2024
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@云盘君.简@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi5LqR55uY5ZCbLueugCIsImF1dGhvciI6IuWwj+ajieiihPCfjJ4mQExveURnSWsiLCJ1cmwiOiJoaWtlcjovL2VtcHR5IyNmeXBhZ2UiLCJ2ZXJzaW9uIjoxNDQsImNvbF90eXBlIjoibW92aWVfMyIsImNsYXNzX25hbWUiOiIiLCJ0eXBlIjoiYWxsIiwiY2xhc3NfdXJsIjoiIiwiYXJlYV9uYW1lIjoiIiwiYXJlYV91cmwiOiIiLCJzb3J0X25hbWUiOiIiLCJ5ZWFyX25hbWUiOiIiLCJzb3J0X3VybCI6IiIsInllYXJfdXJsIjoiIiwiZmluZF9ydWxlIjoianM6JC5yZXF1aXJlKFwiTWFpblwiKTsiLCJzZWFyY2hfdXJsIjoiaGlrZXI6Ly9lbXB0eT9zZWFyY2hUZXJtcz0qKiIsImdyb3VwIjoi4pGh5pCc57SiIiwic2VhcmNoRmluZCI6ImpzOlxuc2V0UmVzdWx0KFt7XG4gICAgdGl0bGU6IFwi54K55oiR5byA5aeL6IGa5ZCI5pCc57SiXCIgKyBNWV9LRVlXT1JELFxuICAgIHVybDogXCJoaWtlcjovL3BhZ2Uvc291I25vSGlzdG9yeSM/cD1meXBhZ2VcIixcbiAgICBleHRyYToge1xuICAgICAgICBwYWdlVGl0bGU6IFwi5pCc57SiXCIgKyBNWV9LRVlXT1JELFxuICAgICAgICBzZWFyY2hUZXJtczogTVlfS0VZV09SRCxcbiAgICAgICAgaGlkZVNldHRpbmc6IHRydWVcbiAgICB9XG59XSk7IiwiZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsImRldGFpbF9maW5kX3J1bGUiOiIiLCJzZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsInNkZXRhaWxfZmluZF9ydWxlIjoiIiwidWEiOiJtb2JpbGUiLCJwcmVSdWxlIjoiIiwicGFnZXMiOiJbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeWkhOeQhlwiLFwicGF0aFwiOlwiZGF0YVwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gdG9SZWRpcmVjdFRyZWF0aW5nKGNvbmZpZykge1xcbiAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJyZWRpcmVjdFxcXCIpLmRvdWJsZVRyZWF0aW5nKGNvbmZpZyk7XFxufVxcblxcbmZ1bmN0aW9uIHRvUmVkaXJlY3QoYWxpVXJsLCBzaGFyZVB3ZCkge1xcbiAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJyZWRpcmVjdFxcXCIpLmdldE1vZGVVcmwoYWxpVXJsLCBzaGFyZVB3ZCk7XFxufVxcblxcbmZ1bmN0aW9uIGdldENvbXBsZXRlUnVsZShydWxlKSB7XFxuICAgIGxldCBmaW5kID0gbmV3IEZ1bmN0aW9uKFxcXCJzXFxcIiwgXFxcInBhZ2VcXFwiLCBcXFwidXNlclxcXCIsIFxcXCJiYXNpY1VybFxcXCIsIHJ1bGUuZmluZCk7XFxuICAgIHJ1bGUuZmluZCA9IChzLCBwYWdlKSA9PiBmaW5kKHMsIHBhZ2UsIHJ1bGUudXNlciB8fCB7fSwgcnVsZS5iYXNpY1VybCB8fCBcXFwiXFxcIik7XFxuICAgIC8qaWYgKHJ1bGUuZmluZEFsaVVybCkge1xcbiAgICAgICAgcnVsZS5maW5kQWxpVXJsID0gbmV3IEZ1bmN0aW9uKFxcXCJpbnB1dFxcXCIsIFxcXCJiYXNpY1VybFxcXCIsIHJ1bGUuZmluZEFsaVVybCk7XFxuICAgIH0qL1xcbiAgICByZXR1cm4gcnVsZTtcXG59XFxuJC5leHBvcnRzLmNhcnJ5UnVsZSA9IGZ1bmN0aW9uKHJ1bGUsIHMsIHBhZ2UsIHNlYXJjaE1vZGUpIHtcXG4gICAgcnVsZSA9IGdldENvbXBsZXRlUnVsZShydWxlKTtcXG4gICAgbGV0IGxpc3QgPSBydWxlLmZpbmQocywgcGFnZSk7XFxuICAgIGlmICghbGlzdCkgcmV0dXJuIFtdO1xcblxcbiAgICBsZXQgZGVzY1RpcHMgPSBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIHJ1bGUubmFtZS5mb250Y29sb3IoXFxcIiNmMTNiNjZhXFxcIikgKyBcXFwiJm5ic3A7XFxcIjtcXG4gICAgbGV0IHJlc0xpc3QgPSBbXTtcXG5cXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgaWYgKGl0LnNraXApIHtcXG4gICAgICAgICAgICByZXNMaXN0LnB1c2goaXQpO1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHNlYXJjaE1vZGUgJiYgIXNlYXJjaENvbnRhaW5zKGl0LnRpdGxlLCBzLCB0cnVlKSkgY29udGludWU7XFxuICAgICAgICBpZiAocnVsZS5maW5kQWxpVXJsKSB7XFxuICAgICAgICAgICAgaXQudXJsID0gJChcXFwiXFxcIikubGF6eVJ1bGUodG9SZWRpcmVjdFRyZWF0aW5nLCB7XFxuICAgICAgICAgICAgICAgIGZpbmRBbGlVcmw6IHJ1bGUuZmluZEFsaVVybCxcXG4gICAgICAgICAgICAgICAgYmFzaWNVcmw6IHJ1bGUuYmFzaWNVcmwsXFxuICAgICAgICAgICAgICAgIG5hbWU6IHJ1bGUubmFtZSxcXG4gICAgICAgICAgICAgICAgYWxpVXJsOiBpdC51cmxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaXQudXJsID0gJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSh0b1JlZGlyZWN0LCBpdC51cmwsIGl0LnNoYXJlUHdkIHx8IFxcXCJcXFwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJlc0xpc3QucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlLmluY2x1ZGVzKFxcXCLigJzigJzigJ3igJ1cXFwiKSA/IGl0LnRpdGxlIDogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBpdC50aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAoXFxcIjxlbT58PC9lbT5cXFwiLCBcXFwiZ1xcXCIpLCBcXFwiXFxcIikucmVwbGFjZShuZXcgUmVnRXhwKFxcXCIoXFxcIitzK1xcXCIpXFxcIiwgXFxcImdpXFxcIiksIFxcXCI8c3Ryb25nPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICMxRTkwRkZcXFxcXFxcIj4kMTwvc3Bhbj48L3N0cm9uZz5cXFwiKSxcXG4gICAgICAgICAgICBkZXNjOiBkZXNjVGlwcyArIChpdC5kZXNjIHx8IFxcXCJcXFwiKSxcXG4gICAgICAgICAgICB1cmw6IGl0LnVybCxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdC5waWNfdXJsLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBpdC5waWNfdXJsID8gXFxcIm1vdmllXzFfdmVydGljYWxfcGljXFxcIiA6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgICAgICAgICAgaW5oZXJpdFRpdGxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgbm9QaWM6IHRydWVcXG4gICAgICAgICAgICB9LCBpdC5leHRyYSlcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIHJldHVybiByZXNMaXN0O1xcbn1cXG5sZXQgc2l6ZSA9IDEwO1xcblxcbmxldCBydWxlcztcXG5mdW5jdGlvbiBnZXRSdWxlcyhncm91cCkge1xcbiAgICBsZXQgcnVsZXNUbXA7XFxuICAgIGlmKCFydWxlcyl7XFxuICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldFVzZWZ1bEpzb24oKTtcXG4gICAgfVxcbiAgICBpZiAoZ3JvdXApIHtcXG4gICAgICAgIHJ1bGVzVG1wID0gcnVsZXMuZmlsdGVyKHYgPT4gdi5ncm91cCA9PT0gZ3JvdXApO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcnVsZXNUbXAgPSBydWxlcztcXG4gICAgfVxcbiAgICByZXR1cm4gcnVsZXNUbXA7XFxufVxcbiQuZXhwb3J0cy5nZXREYXRhID0gZnVuY3Rpb24ocGFnZSwgcnVsZSwgZ3JvdXApIHtcXG4gICAgaWYgKHJ1bGUpIHtcXG4gICAgICAgIGlmIChwYWdlICE9IG51bGwgJiYgcGFnZSA+IDEpIHtcXG4gICAgICAgICAgICByZXR1cm4gZ2V0UnVsZXMoKS5maWx0ZXIoaSA9PiBpLm5hbWUgPT0gcnVsZSAmJiBpLnBhZ2UpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGdldFJ1bGVzKCkuZmlsdGVyKGkgPT4gaS5uYW1lID09IHJ1bGUpO1xcbiAgICB9XFxuICAgIGxldCBydWxlc1RtcCA9IGdldFJ1bGVzKGdyb3VwKTtcXG4gICAgbGV0IHN0YXJ0ID0gKHBhZ2UgLSAxKSAqIHNpemU7XFxuICAgIGlmIChydWxlc1RtcC5sZW5ndGggPCBzdGFydCArIDEpIHtcXG4gICAgICAgIHJldHVybiBbXTtcXG4gICAgfVxcbiAgICBsZXQgbGVuID0gc2l6ZTtcXG4gICAgaWYgKHJ1bGVzVG1wLmxlbmd0aCA8IHBhZ2UgKiBzaXplKSB7XFxuICAgICAgICBsZW4gPSBydWxlc1RtcC5sZW5ndGggLSBzdGFydDtcXG4gICAgfVxcbiAgICByZXR1cm4gcnVsZXNUbXAuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgbGVuKTtcXG59O1xcbiQuZXhwb3J0cy5nZXROYW1lcyA9IGZ1bmN0aW9uKGdyb3VwKSB7XFxuICAgIHJldHVybiBnZXRSdWxlcyhncm91cCkubWFwKGl0ID0+IFtpdC5uYW1lLCBpdC5iYXNpY1VybF0pO1xcbn07XFxuXFxuJC5leHBvcnRzLmdldEdyb3VwTmFtZXMgPSBmdW5jdGlvbigpIHtcXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChnZXRSdWxlcygpLm1hcCh2ID0+IHYuZ3JvdXApKSkuZmlsdGVyKHYgPT4gdik7XFxufTtcXG4kLmV4cG9ydHMuZmluZE1vZHVsbyA9IGZ1bmN0aW9uKGlucHV0KSB7XFxuICAgIGxldCBvcmlNb2RzID0gWzIsIDNdO1xcbiAgICBsZXQgbW9kcyA9IG9yaU1vZHMubWFwKHY9PmlucHV0JXYpO1xcbiAgICBsZXQgemVyb01vZHMgPSBtb2RzLmluZGV4T2YoMCk7XFxuXFxuICAgIGlmICh6ZXJvTW9kcyA+IC0xKSB7XFxuICAgICAgICByZXR1cm4gb3JpTW9kc1t6ZXJvTW9kc107XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gb3JpTW9kc1ttb2RzLmluZGV4T2YoTWF0aC5tYXguYXBwbHkobnVsbCwgbW9kcykpXTtcXG4gICAgfVxcbn1cXG5cXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaQnOe0oumhtemdolwiLFwicGF0aFwiOlwic291XCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBhbGl0ZXN0ID0gJC5yZXF1aXJlKFxcXCJhbGl0ZXN0XFxcIik7XFxuXFxuZnVuY3Rpb24gc2V0Q2xpcCgpIHtcXG4gICAgZnVuY3Rpb24gZ2V0Q29weSgpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgY29uc3QgQ29udGV4dCA9IGFuZHJvaWQuY29udGVudC5Db250ZXh0O1xcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb20uZXhhbXBsZS5oaWtlcnZpZXcudWkuQXBwbGljYXRpb24oKS5nZXRDb250ZXh0KCk7XFxuICAgICAgICAgICAgLy8g6I635Y+W57O757uf5Ymq6LS05p2/XFxuICAgICAgICAgICAgbGV0IGNsaXBib2FyZCA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTtcXG4gICAgICAgICAgICAvLyDov5Tlm57mlbDmja5cXG4gICAgICAgICAgICBsZXQgY2xpcERhdGEgPSBjbGlwYm9hcmQuZ2V0UHJpbWFyeUNsaXAoKTtcXG4gICAgICAgICAgICBpZiAoY2xpcERhdGEgIT0gbnVsbCAmJiBjbGlwRGF0YS5nZXRJdGVtQ291bnQoKSA+IDApIHtcXG4gICAgICAgICAgICAgICAgLy8g5LuO5pWw5o2u6ZuG5Lit6I635Y+W77yI57KY6LS077yJ56ys5LiA5p2h5paH5pys5pWw5o2uXFxuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gY2xpcERhdGEuZ2V0SXRlbUF0KDApLmdldFRleHQoKTtcXG4gICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh0ZXh0LnRvU3RyaW5nKCkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCB0ZXh0ID0gZ2V0Q29weSgpIHx8IFxcXCJcXFwiO1xcbiAgICBsZXQgdXJsID0gYWxpdGVzdC5tYXRjaEFsaVVybCh0ZXh0KTtcXG4gICAgaWYgKHVybCkge1xcbiAgICAgICAgbGV0IGNhY2hlID0gZ2V0SXRlbShcXFwiY2xpcGJvYXJkQ2FjaGVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAodXJsICE9PSBjYWNoZSkge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9XFxcIiMxM0I2MUJcXFwiPuKWkCA8L2ZvbnQ+PGI+5rip6aao5o+Q56S6PGI+JyxcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcIuajgOa1i+WIsOWJqui0tOadv+WQq+aciemYv+mHjOmTvuaOpeaYr+WQpuaJk+W8gD9cXFxcblxcXCIgKyB1cmwsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5wdXQsIGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtKGlkICsgXFxcImNsaXBib2FyZFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuP3BhZ2U9ZnlwYWdlJnJlYWx1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCkgKyBcXFwiJnNoYXJlUHdkPVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIHVybCwgaWQpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogaWQgKyBcXFwiY2xpcGJvYXJkXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogXFxcIuaJk+W8gOmTvuaOpVxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcImNsaXBib2FyZENhY2hlXFxcIiwgdXJsKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBzZXRQcmVwb3NlKCkge1xcbiAgICBpZiAob3Blbk1vZGUgPT0gXFxcIuacrOWcsOino+aekFxcXCIpIHtcXG4gICAgICAgIGxldCBhbGlUb2tlbnNGaWxlcGF0aCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3Rva2VuUGF0aFxcXCIpLmFsaVRva2Vuc0ZpbGVwYXRoO1xcbiAgICAgICAgbGV0IGEgPSBmZXRjaChhbGlUb2tlbnNGaWxlcGF0aCk7XFxuICAgICAgICBpZiAoIWEgfHwgYSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnPGZvbnQgY29sb3I9XFxcIiMxM0I2MUJcXFwiPuKWkCA8L2ZvbnQ+PGI+5rip6aao5o+Q56S6PGI+JyxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiAkLnJlcXVpcmUoXFxcImxvZ2luTW9kZVxcXCIpKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuacquajgOa1i+WIsOeZu+W9leS/oeaBr++8jOeCueaIkei3s+i9rOeZu+W9lei0puWPt+mhtemdou+8jOeZu+W9lemYv+mHjOS6keebmOi0puWPt+WQjuaWueWPr+S9v+eUqOacrOWcsOino+aekOaooeW8j1xcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IFxcXCLnmbvlvZXpmL/ph4zkupHnm5hcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwic1xcXCIpO1xcbiAgICB9KSk7XFxuICAgIGFkZExpc3RlbmVyKFxcXCJvblJlZnJlc2hcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGlmICghZ2V0TXlWYXIoXFxcInJlZnNcXFwiLCBcXFwiXFxcIikpIHtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCJzXFxcIik7XFxuICAgICAgICB9XFxuICAgIH0pKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0SGVhZCgpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5pCc57Si77yaXFxcIiArIFtcXFwi6buY6K6kXFxcIiwgXFxcIueyvuWHhlxcXCJdW3NlYXJjaE1vZGVdLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBzZXRTZWFyY2hNb2RlKGdldFNlYXJjaE1vZGUoKSA/IDAgOiAxKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fMl9yb3VuZFxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9zZWFyY2g2XFxcIlxcbiAgICB9KTtcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6+572ufFxcXCIgKyBvcGVuTW9kZSxcXG4gICAgICAgIHVybDogJChbXFxcIuaooeW8j++8muacrOWcsOino+aekFxcXCIsIFxcXCLmqKHlvI/vvJrlrpjmlrlBUFBcXFwiLCBcXFwi55m75b2V6Zi/6YeM6LSm5Y+3XFxcIiwgXFxcIueZu+W9leS/oeaBr1xcXCIsIFxcXCLop4TliJnnrqHnkIZcXFwiLCBcXFwi5pSv5oyB5L2c6ICFXFxcIl0sIDEsIFxcXCLkupHnroDorr7nva5cXFwiKS5zZWxlY3QoKGlkcykgPT4ge1xcbiAgICAgICAgICAgIGlmIChcXFwi6KeE5YiZ566h55CGXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9ydWxlTWFuYWdlI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChcXFwi5pSv5oyB5L2c6ICFXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9Eb25hdGUudiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoXFxcIueZu+W9lemYv+mHjOi0puWPt1xcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwibG9naW5Nb2RlXFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChcXFwi55m75b2V5L+h5oGvXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICBjb25zdCB7XFxuICAgICAgICAgICAgICAgICAgICBvcGVuVG9rZW5zRmlsZXBhdGgsXFxuICAgICAgICAgICAgICAgICAgICBhbGlUb2tlbnNGaWxlcGF0aFxcbiAgICAgICAgICAgICAgICB9ID0gJC5yZXF1aXJlKFxcXCJ0b2tlblBhdGhcXFwiKTtcXG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3QoYWxpVG9rZW5zRmlsZXBhdGgpKSByZXR1cm4gXFxcInRvYXN0Oi8v6L+Y5pyq55m76ZmGXFxcIjtcXG4gICAgICAgICAgICAgICAgbGV0IGFsaSA9IHJlcXVlc3QoYWxpVG9rZW5zRmlsZXBhdGgpO1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgYWxpID0gSlNPTi5wYXJzZShhbGkpO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKGFsaVRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGNvbmZpcm0oe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfnmbvlvZXkv6Hmga8nLFxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogXFxcIueUqOaItzpcXFwiICsgKGFsaS5uaWNrX25hbWUgfHwgYWxpLnVzZXJfbmFtZSB8fCBcXFwiVG9rZW7nmbvlvZVcXFwiKSArIFxcXCJcXFxcblRva2VuOlxcXCIgKyBhbGkucmVmcmVzaF90b2tlbiArIFxcXCJcXFxcbijlj5bmtojvvJrms6jplIDnmbvlvZXvvJvnoa7lrprvvJrlpI3liLZUb2tlbilcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygodG9rZW4pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgdG9rZW47XFxuICAgICAgICAgICAgICAgICAgICB9LCBhbGkucmVmcmVzaF90b2tlbiksXFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWw6ICQudG9TdHJpbmcoKHBhdGgxLCBwYXRoMikgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLnoa7orqTms6jplIDnmbvlvZVcXFwiKS5jb25maXJtKChwYXRoMSwgcGF0aDIpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZShwYXRoMSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUocGF0aDIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5oiQ5Yqf6YCA5Ye655m76ZmGXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBwYXRoMSwgcGF0aDIpO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgYWxpVG9rZW5zRmlsZXBhdGgsIG9wZW5Ub2tlbnNGaWxlcGF0aClcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFxcXCLmqKHlvI/vvJpcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwib3Blbk1vZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbShpZHMsIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLorr7nva58XFxcIiArIGlucHV0XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgaWYgKGlucHV0ID09IFxcXCLlrpjmlrlBUFBcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip/vvIzor7fnoa7kv53miYvmnLrmnInlronoo4XpmL/ph4zkupHnm5jnrYnlrpjmlrlBUFBcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGlkICsgXFxcIm1vZGVcXFwiKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl8yX3JvdW5kXFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX21lbnU2XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IGlkICsgXFxcIm1vZGVcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfmkJzntKInLFxcbiAgICAgICAgZGVzYzogJ+ivt+i+k+WFpeWFs+mUruivjS/pk77mjqUnLFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQudHJpbSgpO1xcbiAgICAgICAgICAgIGlmICgkLnJlcXVpcmUoXFxcImFsaXRlc3RcXFwiKS50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJzXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9wYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpICsgXFxcIiZzaGFyZVB3ZD1cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwic1xcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRNeVZhcigncmVmcycsaW5wdXQpXFxcIixcXG4gICAgICAgICAgICBpZDogaWQgKyBcXFwic3NcXFwiLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcyxcXG4gICAgICAgICAgICBwYWdlVGl0bGU6IFxcXCLmiZPlvIDpk77mjqVcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRSdWxlSXRlbSgpIHtcXG4gICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJkYXRhXFxcIikuZ2V0TmFtZXMocnVsZUdyb3VwKTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+Mn1xcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2NvbGxlY3Rpb24/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+TjFxcXCIgKyBydWxlR3JvdXAsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBncm91cCA9ICQucmVxdWlyZShcXFwiZGF0YVxcXCIpLmdldEdyb3VwTmFtZXMoKTtcXG4gICAgICAgICAgICBncm91cC51bnNoaWZ0KFxcXCLwn5Kh5YWo6YOo8J+SoVxcXCIpO1xcbiAgICAgICAgICAgIGxldCBzZWxlY3ROdW0gPSAkLnJlcXVpcmUoXFxcImRhdGFcXFwiKS5maW5kTW9kdWxvKGdyb3VwLmxlbmd0aCk7XFxuICAgICAgICAgICAgcmV0dXJuICQoZ3JvdXAsIHNlbGVjdE51bSwgXFxcIuivt+mAieaLqeWIhue7hFxcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmICghTVlfSU5ERVgpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJ1bGVHcm91cFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJ1bGVHcm91cFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcInJ1bGVcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIlxcXCIgPT0gciA/IFxcXCLigJzigJzlhajpg6jigJ3igJ1cXFwiIDogXFxcIuWFqOmDqFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHMsIGlkKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHFyID0gZ2V0SXRlbShcXFwicnVsZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBjbGVhckl0ZW0oXFxcInJ1bGVcXFwiKTtcXG4gICAgICAgICAgICBpZiAocykge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcIuWFqOmDqFxcXCIgKyBpZCwge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzlhajpg6jigJ3igJ1cXFwiXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBpZiAocXIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaWQgKyBxciwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBxclxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIHMsIGlkKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBcXFwi5YWo6YOoXFxcIiArIGlkXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBmb3IgKGxldCBbaXQsIGJhc2ljVXJsXSBvZiBydWxlcykge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXQgPT0gciA/IFxcXCLigJzigJxcXFwiICsgaXQgKyBcXFwi4oCd4oCdXFxcIiA6IGl0LFxcbiAgICAgICAgICAgIHVybDogJCgoYmFzaWNVcmwgfHwgXFxcIlxcXCIpICsgXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHIsIHMsIGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBxciA9IGdldEl0ZW0oXFxcInJ1bGVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJ1bGVcXFwiLCByKTtcXG4gICAgICAgICAgICAgICAgaWYgKHMpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHFyID8gKGlkICsgcXIpIDogKFxcXCLlhajpg6hcXFwiICsgaWQpLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHFyIHx8IFxcXCLlhajpg6hcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaWQgKyByLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgciArIFxcXCLigJ3igJ1cXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH0sIGl0LCBzLCBpZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogaWQgKyBpdFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuXFxufVxcblxcbmZ1bmN0aW9uIHJlY29yZCgpIHtcXG4gICAgbGV0IGhpc3RvcnkgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgW10pO1xcbiAgICBsZXQgaWkgPSBoaXN0b3J5LmluZGV4T2Yocyk7XFxuICAgIGlmIChpaSA+IC0xKSB7XFxuICAgICAgICBoaXN0b3J5LnNwbGljZShpaSwgMSk7XFxuICAgIH1cXG4gICAgaWYgKGhpc3RvcnkubGVuZ3RoID4gMjApIHtcXG4gICAgICAgIGhpc3Rvcnkuc3BsaWNlKGhpc3RvcnkubGVuZ3RoIC0gMSwgMSk7XFxuICAgIH1cXG4gICAgaGlzdG9yeS51bnNoaWZ0KHMpO1xcbiAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgaGlzdG9yeSk7XFxufVxcblxcbmZ1bmN0aW9uIHNlYXJjaEVuZCgpIHtcXG4gICAgbGV0IHAgPSBNWV9QQUdFO1xcbiAgICBsZXQgZGF0YSA9ICQucmVxdWlyZShcXFwiZGF0YVxcXCIpLmdldERhdGEocCwgciwgcnVsZUdyb3VwKTtcXG4gICAgbGV0IHBhZ2VpZCA9IGlkICsgXFxcInlwai1wYWdlXFxcIiArIHA7XFxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLliqDovb3nrKxcXFwiICsgcCArIFxcXCLpobXkuK3vvIzov5vluqbvvJoxL1xcXCIgKyBkYXRhLmxlbmd0aCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBwYWdlaWRcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQoZCk7XFxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcXG4gICAgICAgIC8v5aSa57q/56iL5Yqg6L29ICAgICAgICBcXG4gICAgICAgIGxldCByZWFsUGFnZSA9IFxcXCJcXFwiID09IHIgPyAxIDogcDtcXG4gICAgICAgIGxldCB0YXNrcyA9IGRhdGEubWFwKGl0ID0+IHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbihydWxlKSB7XFxuICAgICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImRhdGFcXFwiKS5jYXJyeVJ1bGUocnVsZSwgcywgcmVhbFBhZ2UsIHNlYXJjaE1vZGUpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhydWxlLm5hbWUgKyBcXFwiOlxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qaWYoZGF0YS5sZW5ndGg9PT0xJiZwPT09MSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6XFxcIuKAnOKAnFxcXCIrcnVsZS5uYW1lK1xcXCIgRVJST1LigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogZS50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6XFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOlxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSovXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBydWxlLmZpbmQocywgcmVhbFBhZ2UpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBwYXJhbTogaXQsXFxuICAgICAgICAgICAgICAgIGlkOiBcXFwicnVsZUBcXFwiICsgaXQubmFtZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcblxcbiAgICAgICAgYmF0Y2hFeGVjdXRlKHRhc2tzLCB7XFxuICAgICAgICAgICAgZnVuYzogZnVuY3Rpb24ocGFyYW0sIGlkLCBlcnJvciwgcmVzdWx0KSB7XFxuICAgICAgICAgICAgICAgIHBhcmFtLmkgKz0gMTtcXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbShcXFwiX25vdGhhdmVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGFkZEl0ZW1CZWZvcmUocGFnZWlkLCByZXN1bHQpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChwYXJhbS5pID09PSBwYXJhbS5hbGwpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbShcXFwiX25vdGhhdmVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJdGVtQmVmb3JlKHBhZ2VpZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIn5+fuS7gOS5iOi1hOa6kOmDveayoeacieWTpn5+flxcXCIuZm9udGNvbG9yKFxcXCJHcmF5XFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXFxcIl9ub3RoYXZlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtKHBhZ2VpZCk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHBhZ2VpZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5Yqg6L2956ysXFxcIiArIE1ZX1BBR0UgKyBcXFwi6aG15Lit77yM6L+b5bqm77yaXFxcIiArIChwYXJhbS5pICsgMSkgKyBcXFwiL1xcXCIgKyBwYXJhbS5hbGwsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBhcmFtOiB7XFxuICAgICAgICAgICAgICAgIGFsbDogZGF0YS5sZW5ndGgsXFxuICAgICAgICAgICAgICAgIGk6IDAsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBzZXRIaXN0b3J5KCkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFwiY29sb3I6I2ZmNjYwMVxcXCI+PGI+5Y6G5Y+y6K6w5b2VPC9iPjwvc3Bhbj4nLFxcbiAgICAgICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fY2xvY2tcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgdXJsOiAkKFtcXFwi5riF6Zmk5pCc57Si6K6w5b2VXFxcIiwgXFxcIuaJk+W8gOingueci+iusOW9lVxcXCJdKS5zZWxlY3QoKGlkKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi5riF6Zmk5pCc57Si6K6w5b2VXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwi56Gu5a6a5riF6Zmk5YWo6YOo5pCc57Si6K6w5b2V77yfXFxcIikuY29uZmlybSgoaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsZWFySXRlbShcXFwic2VhcmNoSGlzdG9yeVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKGlkICsgXFxcIjprZXlcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGFkZEl0ZW1BZnRlcihpZCArIFxcXCI6c2VhcmNoSGlzdG9yeVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCJ+fn7ku4DkuYjpg73msqHmnInlk6Z+fn5cXFwiLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFwiOmtleVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9LCBpZCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2hpc3Rvcnk/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBpZCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBpZCArIFxcXCI6c2VhcmNoSGlzdG9yeVxcXCIsXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICBsZXQgaGlzdG9yeSA9IHN0b3JhZ2UwLmdldEl0ZW0oXFxcInNlYXJjaEhpc3RvcnlcXFwiLCBbXSk7XFxuICAgIGxldCBpID0gMDtcXG4gICAgZm9yIChsZXQga2V5IG9mIGhpc3RvcnkpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGtleSxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkLCBrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGV4dHJhID0gZmluZEl0ZW0oaWQgKyBcXFwic3NcXFwiKS5leHRyYTtcXG4gICAgICAgICAgICAgICAgZXh0cmEuZGVmYXVsdFZhbHVlID0ga2V5O1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiBleHRyYVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICB9LCBpZCwga2V5KSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImZsZXhfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogaWQgKyBcXFwiOmtleTpcXFwiICsga2V5LFxcbiAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIjprZXlcXFwiLFxcbiAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWIoOmZpOWFs+mUruivjTpcXFwiICsga2V5LFxcbiAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGlkLCBrZXksIGkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGlzdG9yeSA9IHN0b3JhZ2UwLmdldEl0ZW0oXFxcInNlYXJjaEhpc3RvcnlcXFwiLCBbXSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5zcGxpY2UoaSwgMSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwic2VhcmNoSGlzdG9yeVxcXCIsIGhpc3RvcnkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oaWQgKyBcXFwiOmtleTpcXFwiICsga2V5KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KCk7XFxuICAgICAgICAgICAgICAgICAgICB9LCBpZCwga2V5LCBpKVxcbiAgICAgICAgICAgICAgICB9XVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgaSsrO1xcbiAgICB9XFxuICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCJ+fn7ku4DkuYjpg73msqHmnInlk6Z+fn5cXFwiLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFwiOmtleVxcXCIsXFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHNldFRyZW5kaW5nVGFiRW5kKCkge1xcbiAgICBsZXQgaG90Q2xhc3MgPSB7XFxuICAgICAgICBcXFwi55m+5bqmXFxcIjoge1xcbiAgICAgICAgICAgIFxcXCLnlLXop4bliadcXFwiOiBcXFwidGVsZXBsYXlcXFwiLFxcbiAgICAgICAgICAgIFxcXCLnlLXlvbFcXFwiOiBcXFwibW92aWVcXFwiXFxuICAgICAgICB9LFxcbiAgICAgICAgXFxcIuWkuOWFi1xcXCI6IHtcXG4gICAgICAgICAgICBcXFwi55S16KeG5YmnXFxcIjogXFxcIueUteinhuWJp1xcXCIsXFxuICAgICAgICAgICAgXFxcIueUteW9sVxcXCI6IFxcXCLnlLXlvbFcXFwiLFxcbiAgICAgICAgICAgIFxcXCLliqjmvKtcXFwiOiBcXFwi5Yqo5ryrXFxcIixcXG4gICAgICAgICAgICBcXFwi57u86Im6XFxcIjogXFxcIue7vOiJulxcXCJcXG4gICAgICAgIH1cXG4gICAgfTtcXG4gICAgbGV0IGRhdGFTb3VyY2UgPSBPYmplY3Qua2V5cyhob3RDbGFzcyk7XFxuICAgIGxldCBzZWxlY3Rzb3VyY2UgPSBnZXRJdGVtKFxcXCJkYXRhU291cmNlXFxcIiwgZGF0YVNvdXJjZVswXSk7XFxuICAgIGxldCBob3RrZXlzID0gT2JqZWN0LmtleXMoaG90Q2xhc3Nbc2VsZWN0c291cmNlXSk7XFxuICAgIGxldCBzZWxlY3RrZXkgPSBnZXRJdGVtKFxcXCJob3RrZXlcXFwiLCBob3RrZXlzWzBdKTtcXG4gICAgbGV0IHRhYmtleSA9IGhvdENsYXNzW3NlbGVjdHNvdXJjZV1bc2VsZWN0a2V5XTtcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiNmZjY2MDFcXFwiPjxiPicgKyBzZWxlY3Rzb3VyY2UgKyBzZWxlY3RrZXkgKyAn54Ot5pCcPC9iPjwvc3Bhbj4nLFxcbiAgICAgICAgdXJsOiAkKGhvdGtleXMsIDEsIFxcXCLliIfmjaLng63mkJxcXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcImhvdGtleVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWIh+aNouS4ulxcXCIgKyBpbnB1dDtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fZmlyZVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLliIfmjaLmlbDmja7mupBcXFwiLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoZGF0YVNvdXJjZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoZGF0YVNvdXJjZSwgMSwgXFxcIuWIh+aNouaVsOaNrua6kFxcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwiZGF0YVNvdXJjZVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcImhvdGtleVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5YiH5o2i5Li6XFxcIiArIGlucHV0O1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0sIGRhdGFTb3VyY2UpXFxuICAgICAgICAgICAgfV1cXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuato+WcqOWKoOi9vS4uLlxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBpZCArIFxcXCI6aG90a2V5XFxcIixcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIHNldFJlc3VsdChkKTtcXG4gICAgbGV0IHNkID0gW107XFxuICAgIGxldCBzZXRTZWFyY2hLZXkgPSBuYW1lID0+IHtcXG4gICAgICAgIHB1dE15VmFyKCdzJywgbmFtZSk7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICB9O1xcblxcbiAgICBsZXQgZ2V0VGl0bGUgPSAoaSwgbmFtZSkgPT4ge1xcbiAgICAgICAgbGV0IGNvbG9yO1xcbiAgICAgICAgc3dpdGNoIChpKSB7XFxuICAgICAgICAgICAgY2FzZSAwOlxcbiAgICAgICAgICAgICAgICBjb2xvciA9IFxcXCIjZmYzMzAwXFxcIjtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgY2FzZSAxOlxcbiAgICAgICAgICAgICAgICBjb2xvciA9IFxcXCIjZmY2NjAwXFxcIjtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgY2FzZSAyOlxcbiAgICAgICAgICAgICAgICBjb2xvciA9IFxcXCIjZmY5OTAwXFxcIlxcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICBkZWZhdWx0OlxcbiAgICAgICAgICAgICAgICBjb2xvciA9IFxcXCJibGFja1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBTdHJpbmcoaSArIDEpLmZvbnRjb2xvcihjb2xvcikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIG5hbWU7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0c291cmNlKSB7XFxuICAgICAgICAgICAgY2FzZSBcXFwi55m+5bqmXFxcIjpcXG4gICAgICAgICAgICAgICAgdmFyIGpzb24gPSByZXF1ZXN0KCdodHRwczovL3RvcC5iYWlkdS5jb20vYXBpL2JvYXJkP3BsYXRmb3JtPXdpc2UmdGFiPScgKyB0YWJrZXkgKyAnJnRhZz0lN0IlMjJjYXRlZ29yeSUyMjolMjIlRTUlODUlQTglRTklODMlQTglRTclQjElQkIlRTUlOUUlOEIlMjIlN0QnLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMDsgTmV4dXMgNSBCdWlsZC9NUkE1OE4pIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS85OS4wLjQ4NDQuNTEgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdIb3N0JzogJ3RvcC5iYWlkdS5jb20nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzogJ3poLUNOLHpoO3E9MC45LGVuLVVTO3E9MC44LGVuO3E9MC43JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWNjZXB0LUVuY29kaW5nJzogJ2d6aXAsIGRlZmxhdGUsIGJyJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3RvcC5iYWlkdS5jb20vYm9hcmQ/dGFiPW5vdmVsJyxcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIC8vdmFyIHMgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IEpTT04ucGFyc2UoanNvbikuZGF0YS5jYXJkc1swXS5jb250ZW50O1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gbGlzdFtpXTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaXRlbS53b3JkICsgJyAoJyArIGl0ZW0uc2hvd1syXSArICcpJztcXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZXMgPSBpdGVtLmRlc2M7XFxuICAgICAgICAgICAgICAgICAgICBzZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZ2V0VGl0bGUoaSwgbmFtZSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKHNldFNlYXJjaEtleSwgaXRlbS53b3JkKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBkZXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiBpdGVtLmltZyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcIm1vdmllXzFfdmVydGljYWxfcGljXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgY2FzZSBcXFwi5aS45YWLXFxcIjpcXG4gICAgICAgICAgICAgICAgdmFyIGpzb24gPSByZXF1ZXN0KFxcXCJodHRwczovL25ld3MubXlxdWFyay5jbi92Mi90b3BsaXN0L21vdmllPyZjaGFubmVsPVxcXCIgKyB0YWJrZXkgKyBcXFwiJnJhbmtfdHlwZT0lRTYlOUMlODAlRTclODMlQURcXFwiKTtcXG4gICAgICAgICAgICAgICAgdmFyIHhtbERhdGEgPSAoSlNPTi5wYXJzZShqc29uKS5kYXRhIHx8IFxcXCJcXFwiKS5yZXBsYWNlKC90aXRsZT4vZywgXFxcImhfdGl0bGU+XFxcIikucmVwbGFjZSgvc3JjPi9nLCBcXFwiaF9zcmM+XFxcIikucmVwbGFjZSgvYXJlYT4vZywgXFxcImhfYXJlYVxcXCIpO1xcbiAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IHBkZmEoeG1sRGF0YSwgXFxcImJvZHkmJml0ZW1cXFwiKTtcXG4gICAgICAgICAgICAgICAgdmFyIGdldFRleHQgPSB0ID0+IHQ7XFxuICAgICAgICAgICAgICAgIHZhciB0cmVuZCA9IFtcXFwi44SnXFxcIiwgXFxcIuKGkVxcXCIsIFxcXCLihpNcXFwiXTtcXG4gICAgICAgICAgICAgICAgLy92YXIgcyA9IERhdGUubm93KCk7XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaXN0W2ldO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBwZGZoKGl0ZW0sIFxcXCJoX3RpdGxlJiZUZXh0XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGVzID0gXFxcIueDreW6pu+8mlxcXCIgKyBwZGZoKGl0ZW0sIFxcXCJob3Rfc2NvcmUmJlRleHRcXFwiKSArIFxcXCIgXFxcIiArIHRyZW5kLmF0KHBkZmgoaXRlbSwgXFxcImhvdF90cmVuZCYmVGV4dFxcXCIpKSArXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlxcXFxu6K+E5YiG77yaXFxcIiArIHBkZmgoaXRlbSwgXFxcInNjb3JlX2F2ZyYmVGV4dFxcXCIpLnJlcGxhY2UoL14wJC8sIFxcXCLmmoLml6Dor4TliIZcXFwiKSArXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlxcXFxuXFxcIiArIHBkZmgoaXRlbSwgXFxcInllYXImJlRleHRcXFwiKSArIFxcXCLCt1xcXCIgKyBwZGZoKGl0ZW0sIFxcXCJoX2FyZWEmJlRleHRcXFwiKSArIFxcXCLCt1xcXCIgKyBwZGZoKGl0ZW0sIFxcXCJjYXRlZ29yeSYmVGV4dFxcXCIpLnJlcGxhY2UoXFxcIixcXFwiLCBcXFwiwrdcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHNkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBnZXRUaXRsZShpLCBuYW1lKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoc2V0U2VhcmNoS2V5LCBuYW1lKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBkZXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiBwZGZoKGl0ZW0sIFxcXCJoX3NyYyYmVGV4dFxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibW92aWVfMV92ZXJ0aWNhbF9waWNcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgICAgIGFkZEl0ZW1BZnRlcihpZCArIFxcXCI6aG90a2V5XFxcIiwgc2QpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgfSBmaW5hbGx5IHtcXG4gICAgICAgIGRlbGV0ZUl0ZW0oaWQgKyBcXFwiOmhvdGtleVxcXCIpO1xcbiAgICB9XFxufVxcbmxldCByID0gZ2V0SXRlbShcXFwicnVsZVxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgaGlkZVNldHRpbmcgPSBNWV9QQVJBTVMuaGlkZVNldHRpbmcgfHwgZ2V0UGFyYW0oXFxcInNlYXJjaFRlcm1zXFxcIiwgXFxcIlxcXCIpID09PSBcXFwidHJ1ZVxcXCI7XFxubGV0IHMgPSBnZXRNeVZhcigncycsICcnKSB8fCBNWV9QQVJBTVMuc2VhcmNoVGVybXMgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJzZWFyY2hUZXJtc1xcXCIsIFxcXCJcXFwiKSk7XFxubGV0IHNlYXJjaE1vZGUgPSBnZXRTZWFyY2hNb2RlKCk7XFxubGV0IG9wZW5Nb2RlID0gZ2V0SXRlbShcXFwib3Blbk1vZGVcXFwiLCBcXFwi5pys5Zyw6Kej5p6QXFxcIik7XFxubGV0IGlkID0gRGF0ZS5ub3coKSArIE1ZX1JVTEUudGl0bGU7XFxubGV0IHJ1bGVHcm91cCA9IGdldEl0ZW0oXFxcInJ1bGVHcm91cFxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgZCA9IFtdO1xcbmlmIChNWV9QQUdFID09PSAxKSB7XFxuICAgIHNldFByZXBvc2UoKTtcXG4gICAgaWYgKCFoaWRlU2V0dGluZykge1xcbiAgICAgICAgc2V0Q2xpcCgpO1xcbiAgICAgICAgc2V0SGVhZCgpO1xcbiAgICB9XFxuICAgIHNldFJ1bGVJdGVtKCk7XFxuICAgIGlmICghcykge1xcbiAgICAgICAgc2V0SGlzdG9yeSgpO1xcbiAgICB9XFxufVxcbmlmIChzKSB7XFxuICAgIHJlY29yZCgpO1xcbiAgICBzZWFyY2hFbmQoKTtcXG59IGVsc2UgaWYgKE1ZX1BBR0UgPT09IDEpIHtcXG4gICAgc2V0VHJlbmRpbmdUYWJFbmQoKTtcXG59IGVsc2Uge1xcbiAgICBzZXRSZXN1bHQoW10pO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIue9kemhtea1j+iniFwiLFwicGF0aFwiOlwieXNmeFwiLFwicnVsZVwiOlwianM6XFxudmFyIGQgPSBbXTtcXG5cXG5sZXQgb3Blbk1vZGUgPSBnZXRJdGVtKFxcXCJvcGVuTW9kZVxcXCIpO1xcbmxldCBydWxlID0gTVlfUlVMRS50aXRsZTtcXG5sZXQgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJ3ZWJVcmxcXFwiLFxcXCJcXFwiKSk7XFxuXFxuZnVuY3Rpb24gaW50ZXJjZXB0KHJ1bGUsIG9yaWdpbiwgb3Blbk1vZGUpIHtcXG4gICAgbGV0IGhvc3QgPSBvcmlnaW4ucmVwbGFjZShuZXcgUmVnRXhwKFxcXCJodHRwOi8vfGh0dHBzOi8vXFxcIiksIFxcXCJcXFwiKS5zcGxpdChcXFwiL1xcXCIpWzBdO1xcbiAgICBsZXQgaG9zdHMgPSBob3N0LnNwbGl0KFxcXCIuXFxcIik7XFxuICAgIGlmIChob3N0cy5sZW5ndGggPiAyKSB7XFxuICAgICAgICBob3N0ID0gaG9zdHNbaG9zdHMubGVuZ3RoIC0gMl0gKyBcXFwiLlxcXCIgKyBob3N0c1tob3N0cy5sZW5ndGggLSAxXTtcXG4gICAgfVxcbiAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFwibWFnbmV0XFxcIikpIHtcXG4gICAgICAgIGNvbmZpcm0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5rip6aao5o+Q56S6XFxcIixcXG4gICAgICAgICAgICBjb250ZW50OiBcXFwi5qOA5rWL5Yiw5paw55qE56OB6ZO+5Zyw5Z2A77yM54K55Ye756Gu5a6a5oyJ6ZKu5Y2z5Y+v5pKt5pS+77yM54K55Ye75Y+W5raI5oyJ6ZKu5Y+v5Lul5aSN5Yi26ZO+5o6lXFxcIixcXG4gICAgICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKChtYWcpID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hZztcXG4gICAgICAgICAgICB9LCBpbnB1dCksXFxuICAgICAgICAgICAgY2FuY2VsOiAkLnRvU3RyaW5nKChtYWcpID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIG1hZ1xcbiAgICAgICAgICAgIH0sIGlucHV0KVxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfSBlbHNlIGlmICgkLnJlcXVpcmUoXFxcImFsaXRlc3Q/cnVsZT1cXFwiK3J1bGUpLnRlc3QoaW5wdXQpICYmIG9wZW5Nb2RlICE9IFxcXCLlrpjmlrlBUFBcXFwiKSB7XFxuICAgICAgICBsb2coaW5wdXQpO1xcbiAgICAgICAgaWYgKGlucHV0LmluY2x1ZGVzKCdjaGVja3VybD91cmw9JykgJiYgaW5wdXQuaW5jbHVkZXMoJyZ1cmxyZWZlcicpKSB7XFxuICAgICAgICAgICAgaW5wdXQgPSBkZWNvZGVVUklDb21wb25lbnQoaW5wdXQuc3BsaXQoJyZ1cmxyZWZlcicpWzBdLnNwbGl0KCdjaGVja3VybD91cmw9JylbMV0pO1xcbiAgICAgICAgICAgIC8vbG9nKCfotLTlkKcnK2lucHV0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiAkLnRvU3RyaW5nKCh1cmwsIHJ1bGUpID0+IHtcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLm9wZW4oSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIumYv+mHjOS6keebmFxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9hbGl5dW4/cGFnZT1meXBhZ2UmcmVhbHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkgKyBcXFwiJnJ1bGU9XFxcIiArIHJ1bGUsXFxuICAgICAgICAgICAgfSkpXFxuICAgICAgICB9LCBpbnB1dCwgcnVsZSk7XFxuICAgIH0gZWxzZSBpZiAoL1xcXFwuKG1wM3xmbGFjfG00YSkkLy50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgbG9nKGlucHV0KTtcXG4gICAgICAgIHJldHVybiAkLnRvU3RyaW5nKCh1cmwsIHJ1bGUpID0+IHtcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLnBsYXlWaWRlbyh1cmwpO1xcbiAgICAgICAgfSwgaW5wdXQsIHJ1bGUpO1xcbiAgICB9IGVsc2UgaWYgKCFpbnB1dC5pbmNsdWRlcyhob3N0KSAmJiBpbnB1dC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgIGxvZyhpbnB1dCk7XFxuICAgICAgICByZXR1cm4gJC50b1N0cmluZygodXJsLCBydWxlKSA9PiB7XFxuICAgICAgICAgICAgZnlfYnJpZGdlX2FwcC5vcGVuKEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLor6bmg4VcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcIitlbmNvZGVVUklDb21wb25lbnQodXJsKStcXFwiJnJ1bGU9XFxcIitydWxlLFxcbiAgICAgICAgICAgIH0pKVxcbiAgICAgICAgfSwgaW5wdXQsIHJ1bGUpO1xcbiAgICB9IGVsc2UgaWYgKCFpbnB1dC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgIGxvZyhpbnB1dCk7XFxuICAgICAgICAvL+iDveWUpOi1t0FQUOeahOeZveWQjeWNlVxcbiAgICAgICAgbGV0IHdoaXRlID0gW1xcbiAgICAgICAgICAgIFxcXCJxa2xpbmtcXFwiLFxcbiAgICAgICAgICAgIFxcXCJiZG5ldGRpc2tcXFwiLFxcbiAgICAgICAgICAgIFxcXCJ4dW5sZWlhcHBcXFwiLFxcbiAgICAgICAgICAgIFxcXCJzbWFydGRyaXZlXFxcIlxcbiAgICAgICAgXTtcXG4gICAgICAgIGxldCBpbldoaXRlID0gd2hpdGUuZmlsdGVyKGl0ID0+IGlucHV0LnN0YXJ0c1dpdGgoaXQpKS5sZW5ndGggPiAwO1xcbiAgICAgICAgaWYgKCFpbldoaXRlKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuICQudG9TdHJpbmcoKHVybCwgcnVsZSkgPT4ge1xcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAub3BlblRoaXJkQXBwICYmIGZ5X2JyaWRnZV9hcHAub3BlblRoaXJkQXBwKHVybCk7XFxuICAgICAgICB9LCBpbnB1dCwgcnVsZSk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gbG9hZEpzKCkge1xcbiAgICB0cnkge1xcbiAgICAgICAgaWYgKGRvY3VtZW50LnRpdGxlICYmIGRvY3VtZW50LnRpdGxlLmxlbmd0aCkge1xcbiAgICAgICAgICAgIGxldCByID0gJCQkKCkubGF6eVJ1bGUoKHQpID0+IHtcXG4gICAgICAgICAgICAgICAgc2V0UGFnZVRpdGxlKHQpO1xcbiAgICAgICAgICAgIH0sIGRvY3VtZW50LnRpdGxlKTtcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLnBhcnNlTGF6eVJ1bGUocik7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGZ5X2JyaWRnZV9hcHAubG9nKGUudG9TdHJpbmcoKSk7XFxuICAgIH1cXG59XFxuXFxuZC5wdXNoKHtcXG4gICAgdXJsOiB1cmwsXFxuICAgIGNvbF90eXBlOiBcXFwieDVfd2Vidmlld19zaW5nbGVcXFwiLFxcbiAgICBkZXNjOiBcXFwiMTAwJSYmZmxvYXRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdXJsSW50ZXJjZXB0b3I6ICQudG9TdHJpbmcoaW50ZXJjZXB0LCBydWxlLCBnZXRIb21lKHVybCksIG9wZW5Nb2RlKSxcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKGxvYWRKcyksXFxuICAgICAgICBjYW5CYWNrOiB0cnVlLFxcbiAgICAgICAganNMb2FkaW5nSW5qZWN0OiB0cnVlLFxcbiAgICAgICAgZmxvYXRWaWRlbzogdHJ1ZVxcbiAgICB9XFxufSk7XFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Zi/6YeMTGF6eVwiLFwicGF0aFwiOlwiYWxpbGF6eVwiLFwicnVsZVwiOlwiY29uc3QgQWxpQWNjZXNzQXBpID0gJC5yZXF1aXJlKFxcXCJhbGlQbGF5QXBpXFxcIik7XFxuY29uc3Qge1xcbiAgICBvcGVuVG9rZW5zRmlsZXBhdGgsXFxuICAgIGFsaVRva2Vuc0ZpbGVwYXRoXFxufSA9ICQucmVxdWlyZShcXFwidG9rZW5QYXRoXFxcIik7XFxuXFxuZnVuY3Rpb24gYWxpTTN1OFByb3h5KGZpbGVJZCwgc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGFsaVRva2VuLCB0aXRsZSkge1xcbiAgICAvL+i/h+acn+iOt+WPluaSreaUvuWOn+Wni+mTvuaOpVxcbiAgICBmdW5jdGlvbiBnZXRBbGlQbGF5VXJsKGZpbGVJZCwgbGluZSkge1xcbiAgICAgICAgbGV0IGFsaXVybDtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgY29uc3QgQWxpQWNjZXNzQXBpID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvYWxpUGxheUFwaT9ydWxlPVxcXCIgKyB0aXRsZSk7XFxuICAgICAgICAgICAgbGV0IGFsaUFjY2Vzc0FwaSA9IEFsaUFjY2Vzc0FwaS5jcmVhdGVEZWZhdWx0KHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbiwgbnVsbCwgdGl0bGUpO1xcbiAgICAgICAgICAgIGxldCBwbGF5VXJsTGlzdCA9IGFsaUFjY2Vzc0FwaS5nZXRTaGFyZVZpZGVvUHJldmlldyhmaWxlSWQpIHx8IFtdO1xcbiAgICAgICAgICAgIGFsaXVybCA9IHBsYXlVcmxMaXN0LmZpbmQodiA9PiB2LnRlbXBsYXRlX2lkID09IGxpbmUpLnVybDtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGFsaXVybDtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBnZXRNM3U4Q29udGVudChwbGF5dXJsKSB7XFxuXFxuICAgICAgICAvL2xvZyhcXFwi5oiR5Zyo5Luj55CGXFxcIiArIHBsYXl1cmwpO1xcbiAgICAgICAgbGV0IGhvbWUgPSBwbGF5dXJsLnNwbGl0KFxcXCJtZWRpYS5tM3U4XFxcIilbMF07XFxuICAgICAgICBsZXQgZiA9IGZldGNoKHBsYXl1cmwsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogUENfVUEsXFxuICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9cXFwiXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB0aW1lb3V0OiAzMDAwXFxuICAgICAgICB9KS5zcGxpdChcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIGxldCBmZiA9IGYubWFwKGl0ID0+IHtcXG4gICAgICAgICAgICBpZiAoaXQuc3RhcnRzV2l0aChcXFwibWVkaWEtXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCIvcHJveHk/dXJsPVxcXCIgKyBiYXNlNjRFbmNvZGUoaG9tZSArIGl0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGl0O1xcbiAgICAgICAgfSkuam9pbihcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIC8vbG9nKCd1ZmlkLScgKyBmaWxlaWQpO1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9cXFwiICsgZmlsZUlkICsgXFxcIi5tM3U4XFxcIiwgZmYpO1xcbiAgICAgICAgcmV0dXJuIGZmO1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIHVwZGF0ZVRzVXJsKHVybCkge1xcbiAgICAgICAgbGV0IGZpZCA9IHVybC5zcGxpdCgnJmY9JylbMV0uc3BsaXQoJyYnKVswXTtcXG4gICAgICAgIC8vbG9nKCdzZmlkLScgKyBmaWQpO1xcbiAgICAgICAgbGV0IGYgPSBmZXRjaCgnaGlrZXI6Ly9maWxlcy9fY2FjaGUvJyArIGZpZCArICcubTN1OCcpLnNwbGl0KFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgZi5mb3JFYWNoKGl0ID0+IHtcXG4gICAgICAgICAgICBpZiAoaXQgJiYgaXQuc3RhcnRzV2l0aCgnL3Byb3h5P3VybD0nKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgZnVybCA9IGJhc2U2NERlY29kZShpdC5yZXBsYWNlKCcvcHJveHk/dXJsPScsICcnKSk7XFxuICAgICAgICAgICAgICAgIGlmICh1cmwuc3Vic3RyKHVybC5pbmRleE9mKCcvbWVkaWEtJyksIHVybC5pbmRleE9mKCcudHMnKSkgPT0gZnVybC5zdWJzdHIoZnVybC5pbmRleE9mKCcvbWVkaWEtJyksIGZ1cmwuaW5kZXhPZignLnRzJykpKSB7XFxuICAgICAgICAgICAgICAgICAgICB1cmwgPSBmdXJsO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICAgIGxldCBleHBpcmVzID0gdXJsLnNwbGl0KCd4LW9zcy1leHBpcmVzPScpWzFdLnNwbGl0KCcmJylbMF07XFxuICAgICAgICBjb25zdCBsYXN0dGltZSA9IHBhcnNlSW50KGV4cGlyZXMpIC0gRGF0ZS5ub3coKSAvIDEwMDA7XFxuICAgICAgICBpZiAobGFzdHRpbWUgPCA2MCkge1xcbiAgICAgICAgICAgIC8vbG9nKCfov4fmnJ/mm7TmlrAnKVxcbiAgICAgICAgICAgIGxldCBsaW5lID0gdXJsLnNwbGl0KCcvbWVkaWEnKVswXTsgLy/lj5bkuYvliY3mkq3mlL7nmoR0c+autee6v+i3r1xcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcXG4gICAgICAgICAgICBsZXQgZiA9IGdldE0zdThDb250ZW50KGdldEFsaVBsYXlVcmwoZmlkLCBsaW5lKSkuc3BsaXQoXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAgICAgZi5mb3JFYWNoKGl0ID0+IHtcXG4gICAgICAgICAgICAgICAgaWYgKGl0ICYmIGl0LnN0YXJ0c1dpdGgoJy9wcm94eT91cmw9JykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBmdXJsID0gYmFzZTY0RGVjb2RlKGl0LnJlcGxhY2UoJy9wcm94eT91cmw9JywgJycpKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh1cmwuc3Vic3RyKHVybC5pbmRleE9mKCcvbWVkaWEtJyksIHVybC5pbmRleE9mKCcudHMnKSkgPT0gZnVybC5zdWJzdHIoZnVybC5pbmRleE9mKCcvbWVkaWEtJyksIGZ1cmwuaW5kZXhPZignLnRzJykpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gZnVybDtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuXFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdXJsO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgdXJsID0gYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy51cmxbMF0pO1xcbiAgICAgICAgaWYgKHVybC5pbmNsdWRlcyhcXFwiLnRzXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAzMDIsXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJMb2NhdGlvblxcXCI6IHVwZGF0ZVRzVXJsKHVybCksXFxuICAgICAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFBDX1VBLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgdGVtcGxhdGVJZCA9IE1ZX1BBUkFNUy50ZW1wbGF0ZUlkWzBdO1xcbiAgICAgICAgICAgIGxldCBmZiA9IGdldE0zdThDb250ZW50KGdldEFsaVBsYXlVcmwoZmlsZUlkLCB0ZW1wbGF0ZUlkKSk7XFxuICAgICAgICAgICAgcmV0dXJuIGZmO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coXFxcIuS7o+eQhuaSreaUvuWksei0pSNcXFxcbumUmeivr+S/oeaBrz5cXFwiICsgZS50b1N0cmluZygpICsgXFxcIlxcXFxu6ZSZ6K+v6KGMPlxcXCIgKyBlLmxpbmVOdW1iZXIpO1xcbiAgICB9XFxufVxcblxcblxcbmZ1bmN0aW9uIGdldFZpZGVvKGFsaUFjY2Vzc0FwaSwgZmlsZUlkKSB7XFxuXFxuICAgIGxldCBwbGF5VXJsTGlzdCA9IGFsaUFjY2Vzc0FwaS5nZXRTaGFyZVZpZGVvUHJldmlldyhmaWxlSWQpIHx8IFtdO1xcblxcbiAgICBsZXQgc2VydmVyQWRkcmVzcyA9IHN0YXJ0UHJveHlTZXJ2ZXIoJC50b1N0cmluZyhhbGlNM3U4UHJveHksIGZpbGVJZCwgYWxpQWNjZXNzQXBpLnNoYXJlSWQsIGFsaUFjY2Vzc0FwaS5zaGFyZVB3ZCwgYWxpQWNjZXNzQXBpLnNoYXJlVG9rZW4sIGFsaUFjY2Vzc0FwaS5hbGlUb2tlbiwgTVlfUlVMRS50aXRsZSkpO1xcbiAgICBsZXQgdHJhbnNjb2RpbmcgPSB7XFxuICAgICAgICBVSEQ6IFxcXCI0SyDotoXmuIVcXFwiLFxcbiAgICAgICAgUUhEOiBcXFwiMksg6LaF5riFXFxcIixcXG4gICAgICAgIEZIRDogXFxcIjEwODAg5YWo6auY5riFXFxcIixcXG4gICAgICAgIEhEOiBcXFwiNzIwIOmrmOa4hVxcXCIsXFxuICAgICAgICBTRDogXFxcIjU0MCDmoIfmuIVcXFwiLFxcbiAgICAgICAgTEQ6IFxcXCIzNjAg5rWB55WFXFxcIlxcbiAgICB9O1xcblxcbiAgICBpZiAocGxheVVybExpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgbGV0IHVybHMgPSBbXSxcXG4gICAgICAgICAgICBuYW1lcyA9IFtdO1xcbiAgICAgICAgcGxheVVybExpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgIHVybHMucHVzaChzZXJ2ZXJBZGRyZXNzICsgXFxcIj91cmw9XFxcIiArIGJhc2U2NEVuY29kZShpdGVtLnVybCkgKyBcXFwiJnRlbXBsYXRlSWQ9XFxcIiArIGl0ZW0udGVtcGxhdGVfaWQgKyBcXFwiIy5tM3U4XFxcIik7XFxuICAgICAgICAgICAgbmFtZXMucHVzaCh0cmFuc2NvZGluZ1tpdGVtLnRlbXBsYXRlX2lkXSA/IHRyYW5zY29kaW5nW2l0ZW0udGVtcGxhdGVfaWRdIDogaXRlbS50ZW1wbGF0ZV9oZWlnaHQpO1xcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgaGVhZHMgPSBuZXcgQXJyYXkocGxheVVybExpc3QubGVuZ3RoKS5maWxsKHtcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgIHVybHM6IHVybHMsXFxuICAgICAgICAgICAgbmFtZXM6IG5hbWVzLFxcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRzLFxcbiAgICAgICAgfTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiB7fTtcXG4gICAgfVxcblxcbn07XFxuXFxuZnVuY3Rpb24gZ2V0UGxheUZvcm1hdChwbGF5VXJsLCB0aXRsZSkge1xcbiAgICByZXR1cm4ge1xcbiAgICAgICAgbmFtZXM6IFt0aXRsZV0sXFxuICAgICAgICB1cmxzOiBbcGxheVVybCArIFxcXCIjaXNWaWRlbz10cnVlIyNpZ25vcmVNdXNpYz10cnVlI1xcXCJdLFxcbiAgICAgICAgaGVhZGVyczogW3tcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJyxcXG4gICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFxcXCJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE3LjAuMC4wIFNhZmFyaS81MzcuMzZcXFwiXFxuICAgICAgICB9XVxcbiAgICB9O1xcbn1cXG5cXG5cXG4kLmV4cG9ydHMgPSBmdW5jdGlvbihzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgZmlsZUlkLCBjYXRlLCB6aW11KSB7XFxuICAgIGlmICghZmlsZUV4aXN0KGFsaVRva2Vuc0ZpbGVwYXRoKSkge1xcbiAgICAgICAgdG9hc3QoXFxcIuivt+WFiOeZu+mZhueZu+W9lei0puWPt1xcXCIpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP25vUmVmcmVzaD0xXFxcIjtcXG4gICAgfVxcbiAgICBsZXQgYWxpVG9rZW4gPSAkLnJlcXVpcmUoYWxpVG9rZW5zRmlsZXBhdGgpO1xcbiAgICBpZiAoY2F0ZSA9PT0gXFxcInZpZGVvXFxcIikge1xcbiAgICAgICAgbGV0IHBsYXlMaXN0ID0gW107XFxuICAgICAgICBsZXQgYWxpQWNjZXNzQXBpO1xcbiAgICAgICAgbGV0IHBsYXlNb2RlID0gZ2V0SXRlbShcXFwiYWxpeXVuX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBhbGlBY2Nlc3NBcGkgPSBBbGlBY2Nlc3NBcGkuY3JlYXRlRGVmYXVsdChzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgYWxpVG9rZW4pO1xcbiAgICAgICAgICAgIGlmIChwbGF5TW9kZSA9PT0gXFxcIui9rOeggVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcGxheUxpc3QgPSBnZXRWaWRlbyhhbGlBY2Nlc3NBcGksIGZpbGVJZCkgfHwge307XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChwbGF5TW9kZSA9PT0gXFxcIuWOn+eUu1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgcGxheUxpc3QgPSBnZXRQbGF5Rm9ybWF0KGFsaUFjY2Vzc0FwaS5nZXRWaWRlb1RlbVBsYXlVcmwoZmlsZUlkKSwgcGxheU1vZGUpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGxheU1vZGUgPT09IFxcXCLmnoHpgJ/ljp/nlLtcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHBsYXlMaXN0ID0gZ2V0UGxheUZvcm1hdChhbGlBY2Nlc3NBcGkuZ2V0RmlsZVRvRG93blVybChmaWxlSWQpICsgXFxcIiNmYXN0UGxheU1vZGUjI3RocmVhZHM9XFxcIiArIGdldEl0ZW0oXFxcInNwZWVkVGhyZWFkXFxcIiwgXFxcIjIwXFxcIikgKyBcXFwiI1xcXCIsIHBsYXlNb2RlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKFxcXCIjXFxcIiArIHBsYXlNb2RlICsgXFxcIuaSreaUvuWksei0pSNcXFxcbumUmeivr+S/oeaBrz5cXFwiICsgZS50b1N0cmluZygpICsgXFxcIlxcXFxu6ZSZ6K+v6KGMPlxcXCIgKyBlLmxpbmVOdW1iZXIpO1xcbiAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFxcXCJJbnZhbGlkUGFyYW1ldGVyLlJlZnJlc2hUb2tlblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIueZu+mZhui/h+acn++8jOivt+mHjeaWsOeZu+mZhlxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/bm9SZWZyZXNoPTFcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5jb2RlID09PSBcXFwiUXVvdGFFeGhhdXN0ZWQuRHJpdmVcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nvZHnm5jnqbrpl7TkuI3otrPvvIzml6Dms5Xmkq3mlL7or7fmuIXnkIbjgIJcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pKt5pS+5aSx6LSl77yM6ZSZ6K+v5L+h5oGv5bey5omT5Y2w44CCXFxcXG7or7fmn6XnnIvml6Xlv5coTE9HKVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgbW91bnRzdWIgPSBzdG9yYWdlMC5nZXRNeVZhcignbW91bnR6aW11Jywge30pO1xcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1vdW50c3ViKS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgemltdSA9IG1vdW50c3ViO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHN1YnRpdGxlO1xcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHppbXUgfHwge30pLmxlbmd0aCA+IDAgJiYgcGxheUxpc3QgJiYgcGxheUxpc3QudXJscyAmJiBwbGF5TGlzdC51cmxzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDEwMCk7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgdmFyIHptdXJsID0gYWxpQWNjZXNzQXBpLmdldEZpbGVUb0Rvd25VcmwoemltdS5maWxlX2lkKTtcXG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSAnaGlrZXI6Ly9maWxlcy9jYWNoZS/kupHnm5jlkJsvc3ViLicgKyB6aW11LmV4dDtcXG4gICAgICAgICAgICAgICAgZG93bmxvYWRGaWxlKHptdXJsLCBwYXRoLCB7XFxuICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJ1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgc3VidGl0bGUgPSBnZXRQYXRoKHBhdGgpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIuWtl+W5leWKoOi9veWksei0pVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZG1saXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImRtbGlzdFxcXCIsIFtdKTtcXG4gICAgICAgIGxldCBkbWxpc3RfY2FjaGUgPSBnZXRNeVZhcihcXFwiZG1saXN0X2NhY2hlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKGRtbGlzdF9jYWNoZSAmJiBkbWxpc3RfY2FjaGUuc3RhcnRzV2l0aChmaWxlSWQgKyBcXFwiI1xcXCIpKSB7XFxuICAgICAgICAgICAgcGxheUxpc3QuZGFubXUgPSBkbWxpc3RfY2FjaGUucmVwbGFjZShmaWxlSWQgKyBcXFwiI1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoZG1saXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICBwbGF5TGlzdC5kYW5tdSA9IFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL2Rhbm11L1xcXCIgKyBkbWxpc3Quc3BsaWNlKDAsIDEpWzBdO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJkbWxpc3RfY2FjaGVcXFwiLCBmaWxlSWQgKyBcXFwiI1xcXCIgKyBwbGF5TGlzdC5kYW5tdSk7XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImRtbGlzdFxcXCIsIGRtbGlzdCk7XFxuICAgICAgICAgICAgaWYgKGRtbGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIuW8ueW5leWIl+ihqOW3suWFqOmDqOaMgui9vVxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcGxheUxpc3QuZGFubXUgPSBnZXRWYXIoXFxcImRtX3NoYXJlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcGxheUxpc3Quc3VidGl0bGUgPSBzdWJ0aXRsZTtcXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5TGlzdCk7XFxuICAgIH1cXG5cXG4gICAgbGV0IGFsaUFjY2Vzc0FwaSA9IEFsaUFjY2Vzc0FwaS5jcmVhdGVEZWZhdWx0KHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbiwgbnVsbCk7XFxuICAgIGxldCB1cmwgPSBhbGlBY2Nlc3NBcGkuZ2V0RmlsZVRvRG93blVybChmaWxlSWQpO1xcblxcbiAgICBpZiAoY2F0ZSA9PT0gXFxcImltYWdlXFxcIikge1xcbiAgICAgICAgcmV0dXJuIHVybCArIFxcXCIjLmpwZ1xcXCI7XFxuICAgIH0gZWxzZSBpZiAoY2F0ZSA9PT0gXFxcImF1ZGlvXFxcIikge1xcbiAgICAgICAgcmV0dXJuIHVybCArIFxcXCIjaXNNdXNpYz10cnVlI1xcXCI7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gXFxcImRvd25sb2FkOi8vXFxcIiArIHVybDtcXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumYv+mHjOWIl+ihqFwiLFwicGF0aFwiOlwiYWxpeXVuXCIsXCJydWxlXCI6XCJqczpcXG4vL0BhdXRob3IgTG95RGdJa1xcbmNvbnN0IEFsaVNoYXJlQXBpID0gJC5yZXF1aXJlKFxcXCJBbGlBcGlcXFwiKTtcXG5cXG5cXG5sZXQgb3BlbkFQSUxpc3QgPSBbXFxcImFsaXN0XFxcIiwgXFxcImRyaXZlXFxcIiwgXFxcInR2Ym94XFxcIiwgXFxcIlhCWVxcXCJdO1xcblxcbmxldCByZWFsdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJyZWFsdXJsXFxcIiwgXFxcIlxcXCIpKS5zcGxpdChcXFwiP1xcXCIpWzBdO1xcbmxldCB1cmxEYXRhID0gcmVhbHVybC5zcGxpdChcXFwiL1xcXCIpO1xcbi8vaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3Mve3NoYXJlSWR9L2ZvbGRlci97ZmlsZUlkfT87XFxuXFxubGV0IHNoYXJlSWQgPSBNWV9QQVJBTVMuc2hhcmVJZCB8fCB1cmxEYXRhWzRdO1xcbmxldCBzaGFyZVB3ZCA9IGdldFBhcmFtKFxcXCJzaGFyZVB3ZFxcXCIsIE1ZX1BBUkFNUy5zaGFyZVB3ZCB8fCBcXFwiXFxcIik7XFxubGV0IHNoYXJlVG9rZW4gPSBnZXRQYXJhbShcXFwic2hhcmVUb2tlblxcXCIsIE1ZX1BBUkFNUy5zaGFyZVRva2VuKTtcXG5cXG5sZXQgZmlsZUlkID0gKHVybERhdGFbNV0gPT09IFxcXCJmb2xkZXJcXFwiID8gdXJsRGF0YVs2XSA6IHZvaWQgMCkgfHwgTVlfUEFSQU1TLmZpbGVJZDtcXG5sZXQgc2VhcmNoS2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJzZWFyY2hLZXlcXFwiLCBcXFwiXFxcIikpIHx8IHVuZGVmaW5lZDtcXG5sZXQgaXNTZWFyY2ggPSAhIXNlYXJjaEtleTtcXG5cXG5sZXQgcGFnZUlkID0gU3RyaW5nKERhdGUubm93KCkpLnNsaWNlKDYpO1xcblxcbmZ1bmN0aW9uIGZvcm1hdERhdGUoX2RhdGUsIGZtdCkge1xcbiAgICBsZXQgZGF0ZSA9ICFpc05hTihfZGF0ZSkgPyBuZXcgRGF0ZShfZGF0ZSAqIDEwMDApIDogbmV3IERhdGUoX2RhdGUpO1xcbiAgICByZXR1cm4gJC5kYXRlRm9ybWF0KGRhdGUsIGZtdCB8fCBcXFwieXl5eS1NTS1kZCBISDptbTpzc1xcXCIpXFxufVxcblxcbmZ1bmN0aW9uIGZvcm1hdFNpemUoc2l6ZSkge1xcbiAgICBpZiAoIXNpemUpIHtcXG4gICAgICAgIHJldHVybiAnJztcXG4gICAgfVxcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xcbiAgICBsZXQgaSA9IDA7XFxuICAgIHdoaWxlIChzaXplID49IDEwMjQpIHtcXG4gICAgICAgIHNpemUgLz0gMTAyNDtcXG4gICAgICAgIGkrKztcXG4gICAgfVxcbiAgICBzaXplID0gaSA/IE51bWJlcihzaXplLnRvRml4ZWQoMikpIDogc2l6ZTtcXG4gICAgcmV0dXJuIGAke3NpemV9ICR7dW5pdHNbaV19YDtcXG59XFxuXFxuZnVuY3Rpb24gc2V0TXlQYUNhY2hlKGtleSwgdmFsdWUpIHtcXG4gICAgTVlfUEFSQU1TW2tleV0gPSB2YWx1ZTtcXG59XFxuXFxuZnVuY3Rpb24gc2F2ZU15UGFDYWNoZSgpIHtcXG4gICAgc2V0UGFnZVBhcmFtcyhNWV9QQVJBTVMpO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRNYXJrZXIobWFya2VyKSB7XFxuICAgIHNldE15UGFDYWNoZShcXFwibWFya2VyXFxcIiwgbWFya2VyKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0VG9rZW4oc2hhcmVUb2tlbikge1xcbiAgICBzZXRNeVBhQ2FjaGUoXFxcInNoYXJlVG9rZW5cXFwiLCBzaGFyZVRva2VuKTtcXG59XFxuaWYgKE1ZX1BBUkFNUy5ub1BpYykge1xcbiAgICBzZXRQYWdlUGljVXJsKCk7XFxuICAgIHNldE15UGFDYWNoZShcXFwibm9QaWNcXFwiLCBmYWxzZSk7XFxufVxcbi8qXFxuZnVuY3Rpb24gc2V0VmlkZW9JdGVtQ2FjaGUodmlkZW9JdGVtQ2FjaGUpIHtcXG4gICAgc2V0TXlQYUNhY2hlKFxcXCJ2aWRlb0l0ZW1DYWNoZVxcXCIsIHZpZGVvSXRlbUNhY2hlKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0U3VidGl0bGVDYWNoZShzdWJ0aXRsZUNhY2hlKSB7XFxuICAgIHNldE15UGFDYWNoZShcXFwic3VidGl0bGVDYWNoZVxcXCIsIHN1YnRpdGxlQ2FjaGUpO1xcbn0qL1xcblxcbmxldCBpY29uVHlwZSA9IFxcXCJhaXxhcGt8YXZpfGNzc3xkbWd8ZXhlfGZsdnxnaWZ8aGlrZXJ8aHRtbHxpc298anBnfGpzfGpzb258bG9nfG1vdnxtcDN8bXA0fG90ZnxwaHB8cG5nfHBwdHxwc2R8dGFibGV8dHh0fHdhdnx4bHN8emlwfGNzc3xkb2N8ZXB1YnxleGN8aHRtfHhsc3hcXFwiLnNwbGl0KCd8Jyk7XFxuXFxuZnVuY3Rpb24gZ2V0SWNvbihleHQsIHR5cGUpIHtcXG4gICAgbGV0IHJvb3QgPSBcXFwiaHR0cHM6Ly9naXRjb2RlLm5ldC9xcV8zMjM5NDM1MS9kci8tL3Jhdy9tYXN0ZXIvaW1nL+aWh+S7tuexu+WeizIvXFxcIjtcXG4gICAgaWYgKHR5cGUgPT09IFxcXCJmb2xkZXJcXFwiKSB7XFxuICAgICAgICByZXR1cm4gcm9vdCArIFxcXCLmlofku7blpLkuc3ZnXFxcIjtcXG4gICAgfVxcbiAgICBpZiAoaWNvblR5cGUuaW5jbHVkZXMoKGV4dCB8fCBcXFwiXFxcIikudG9Mb3dlckNhc2UoKSkpIHtcXG4gICAgICAgIHJldHVybiByb290ICsgZXh0ICsgXFxcIi5zdmdcXFwiO1xcbiAgICB9XFxuICAgIHJldHVybiByb290ICsgXFxcIuaWh+S7ti5zdmdcXFwiO1xcblxcbn1cXG5cXG5mdW5jdGlvbiBsb2FkKGl0ZW1zKSB7XFxuICAgIGxldCBhbGlTaGFyZUFwaSA9IG5ldyBBbGlTaGFyZUFwaShzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgKHNoYXJlVG9rZW4pID0+IHtcXG4gICAgICAgIHNldFRva2VuKHNoYXJlVG9rZW4pO1xcbiAgICAgICAgTVlfUEFSQU1TLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuO1xcbiAgICB9KTtcXG4gICAgbGV0IG9yZGVycyA9IHtcXG4gICAgICAgIFxcXCLlkI3np7DmraPluo9cXFwiOiBcXFwibmFtZSNBU0NcXFwiLFxcbiAgICAgICAgXFxcIuWQjeensOWAkuW6j1xcXCI6IFxcXCJuYW1lI0RFU0NcXFwiLFxcbiAgICAgICAgXFxcIuaXtumXtOato+W6j1xcXCI6IFxcXCJ1cGRhdGVkX2F0I0FTQ1xcXCIsXFxuICAgICAgICBcXFwi5pe26Ze05YCS5bqPXFxcIjogXFxcInVwZGF0ZWRfYXQjREVTQ1xcXCIsXFxuICAgICAgICBcXFwi5aSn5bCP5q2j5bqPXFxcIjogXFxcInNpemUjQVNDXFxcIixcXG4gICAgICAgIFxcXCLlpKflsI/lgJLluo9cXFwiOiBcXFwic2l6ZSNERVNDXFxcIlxcbiAgICB9O1xcbiAgICBsZXQgcGxheU1vZGUgPSBnZXRJdGVtKFxcXCJhbGl5dW5fcGxheU1vZGVcXFwiLCBcXFwi6L2s56CBXFxcIik7XFxuICAgIGxldCBvcmRlcnNLZXlzID0gT2JqZWN0LmtleXMob3JkZXJzKTtcXG4gICAgbGV0IG9yZGVyTmFtZSA9IGdldEl0ZW0oXFxcImFsaXl1bl9vcmRlclxcXCIsIG9yZGVyc0tleXNbMF0pO1xcbiAgICBsZXQgb3JkZXIgPSBvcmRlcnNbb3JkZXJOYW1lXS5zcGxpdChcXFwiI1xcXCIpO1xcbiAgICBsZXQgc3R5bGVzID0gW1xcXCJ0ZXh0XzFcXFwiLCBcXFwibW92aWVfMlxcXCIsIFxcXCJjYXJkX3BpY18zXFxcIiwgXFxcImF2YXRhclxcXCIsIFxcXCLov73liadcXFwiLCBcXFwi55yL5Zu+XFxcIl07XFxuICAgIGxldCBzdHlsZSA9IGdldEl0ZW0oXFxcImFsaXl1bl9zdHlsZVxcXCIsIHN0eWxlc1swXSk7XFxuICAgIGlmIChNWV9QQUdFID09PSAxKSB7XFxuICAgICAgICBpZiAoIWdldE15VmFyKFxcXCJtb3VudHppbXVcXFwiLCBcXFwiXFxcIikpIHtcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwibW91bnR6aW11XFxcIiwge30pO1xcbiAgICAgICAgICAgIGFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcIm1vdW50emltdVxcXCIpO1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJhbGlTaGFyZVRva2VuXFxcIik7XFxuICAgICAgICAgICAgICAgIGNsZWFyVmFyKFxcXCJkbV9zaGFyZVxcXCIpO1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJkbWxpc3RcXFwiKTtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwibGlzdFNlYXJjaEtleVxcXCIpO1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJkbV9saXN0VXJsTGlzdFxcXCIpO1xcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHNldE1hcmtlcigpO1xcbiAgICAgICAgaWYgKHJlYWx1cmwgJiYgIWlzU2VhcmNoKSB7XFxuICAgICAgICAgICAgbGV0IHNoYXJlSW5mbyA9IGFsaVNoYXJlQXBpLmdldFNoYXJlSW5mbygpO1xcbiAgICAgICAgICAgIGxldCBmaWxlSW5mbyA9IHNoYXJlSW5mby5maWxlX2luZm9zIHx8IFtdO1xcbiAgICAgICAgICAgIGlmIChmaWxlSW5mby5sZW5ndGggPT09IDEgJiYgZmlsZUluZm9bMF0udHlwZSA9PT0gXFxcImZvbGRlclxcXCIgJiYgIWZpbGVJZCkge1xcbiAgICAgICAgICAgICAgICBmaWxlSWQgPSBmaWxlSW5mb1swXS5maWxlX2lkO1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlVGl0bGUoZmlsZUluZm9bMF0uZmlsZV9uYW1lKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlVGl0bGUoc2hhcmVJbmZvLnNoYXJlX25hbWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgZGVhZGxpbmUgPSBcXFwi5rC45LmF5pyJ5pWIXFxcIjtcXG5cXG4gICAgICAgICAgICBpZiAoc2hhcmVJbmZvLmV4cGlyYXRpb24pIHtcXG4gICAgICAgICAgICAgICAgZGVhZGxpbmUgPSBcXFwi5pyJ5pWI6Iez77yaXFxcIiArIGZvcm1hdERhdGUoc2hhcmVJbmZvLmV4cGlyYXRpb24pO1xcbiAgICAgICAgICAgICAgICAvL3NoYXJlSW5mby51cGRhdGVkX2F0XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogKHNoYXJlSW5mby5jcmVhdG9yX25hbWUgfHwgc2hhcmVJbmZvLmNyZWF0b3JfcGhvbmUpICsgXFxcIiZuYnNwOyZuYnNwO1xcXCIgKyBkZWFkbGluZS5zbWFsbCgpLFxcbiAgICAgICAgICAgICAgICB1cmw6IHJlYWx1cmwgKyBcXFwiI25vSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgICAgICAgICBpbWc6IHNoYXJlSW5mby5hdmF0YXIgfHwgXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fdW5rbm93blxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIlxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCFpc1NlYXJjaCkge1xcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0LnRyaW0oKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXQpIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaXlhbPplK7or41cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuI25vSGlzdG9yeSMjZnVsbFRoZW1lIz9wYWdlPWZ5cGFnZSZzZWFyY2hLZXk9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCk7XFxuICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0TXlWYXIoJ2xpc3RTZWFyY2hLZXknLGlucHV0KVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2QsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZUlkOiBzaGFyZUlkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogc2hhcmVUb2tlblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBzZWFyY2hLZXkgKyBcXFwi4oCd4oCd55qE5pCc57Si57uT5p6cXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGZ1bmNJdGVtcyA9IFtdO1xcbiAgICAgICAgZnVuY0l0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBzdHlsZSxcXG4gICAgICAgICAgICB1cmw6ICQoc3R5bGVzLCAxLCBcXFwi5o6S5biD5qC35byPXFxcIikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFwiYWxpeXVuX3N0eWxlXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5YiH5o2iXFxcIjtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfaWNvbi5zdmdcXFwiXFxuICAgICAgICB9LCB7XFxuICAgICAgICAgICAgdGl0bGU6IG9yZGVyTmFtZSxcXG4gICAgICAgICAgICB1cmw6ICQob3JkZXJzS2V5cywgMiwgXFxcIuaOkuW6j+aWueW8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImFsaXl1bl9vcmRlclxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIh+aNouaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX3NvcnQuc3ZnXFxcIlxcbiAgICAgICAgfSwge1xcbiAgICAgICAgICAgIHRpdGxlOiBwbGF5TW9kZSxcXG4gICAgICAgICAgICB1cmw6ICQoW1xcXCLovaznoIFcXFwiLCBcXFwi5Y6f55S7XFxcIiwgXFxcIuaegemAn+WOn+eUu1xcXCJdLCAxLCBcXFwi5pKt5pS+5qih5byPXFxcIikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFwiYWxpeXVuX3BsYXlNb2RlXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfcGxheS5zdmdcXFwiLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBpZiAocGxheU1vZGUgPT09IFxcXCLljp/nlLtcXFwiKSB7XFxuICAgICAgICAgICAgZnVuY0l0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogb3BlbkFQSUxpc3RbZ2V0SXRlbShcXFwib3BlbkFwaU1vZGVcXFwiLCBcXFwiMFxcXCIpXSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKG9wZW5BUElMaXN0LCAxLCBcXFwi5Y6f55S7QVBJKOS4jeimgemikee5geWIh+aNoilcXFwiKS5zZWxlY3QoKG9wZW5BUElMaXN0KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJvcGVuQXBpTW9kZVxcXCIsIFN0cmluZyhvcGVuQVBJTGlzdC5pbmRleE9mKGlucHV0KSkpO1xcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZSgkLnJlcXVpcmUoXFxcInRva2VuUGF0aFxcXCIpLm9wZW5Ub2tlbnNGaWxlcGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5YiH5o2i5Li6XFxcIiArIGlucHV0O1xcbiAgICAgICAgICAgICAgICB9LCBvcGVuQVBJTGlzdCksXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9hcGkuc3ZnXFxcIixcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghaXNTZWFyY2gpIHtcXG4gICAgICAgICAgICBmdW5jSXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5Yqf6IO9XFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFtcXFwi6L2s5a2Y5LqR55uYXFxcIiwgXFxcIueZu+mZhui0puWPt1xcXCIsIFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFwiLCBcXFwi5p+l55yL5omL5Yqo5oyC6L295a2X5bmVXFxcIiwgXFxcIuiOt+WPluW8ueW5leaQnOe0ouinhOWImVxcXCIsIFxcXCLmibnph4/mjILovb3mnKzlnLDlvLnluZVcXFwiLCBcXFwi5o6o6YCB5YiwVFZCb3hcXFwiLCBcXFwi6K6+572u5pS26JeP5bCB6Z2iXFxcIiwgXFxcIuiOt+WPluaKleWxj0lQXFxcIiwgXFxcIuaegemAn+WOn+eUu+S4i+i9vee6v+eoi1xcXCJdLCAyLCBcXFwi5pu05aSa5Yqf6IO9XFxcIikuc2VsZWN0KChzaGFyZUlkLCBzaGFyZVB3ZCwgZmlsZUlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi6L2s5a2Y5LqR55uYXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBzbWFydGRyaXZlOi8vc2hhcmUvYnJvd3NlP3NoYXJlSWQ9JHtzaGFyZUlkfSZzaGFyZVB3ZD0ke3NoYXJlUHdkfHxcXFwiXFxcIn1gO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIueZu+mZhui0puWPt1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLlpI3liLbpk77mjqVcXFwiLCBcXFwi5aSN5Yi25rW36ZiU5Y+j5LukXFxcIl0sIDEsIFxcXCLliIbkuqvmlrnlvI9cXFwiKS5zZWxlY3QoKHVybCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi5aSN5Yi26ZO+5o6lXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyB1cmw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL+mYv+mHjOS6keebmOWIhuS6q+WPo+S7pOOAjFxcXCIgKyBnZXRQYWdlVGl0bGUoKSArIFxcXCLjgI1cXFxcblxcXCIgKyB1cmwgKyBcXFwiIEBpbXBvcnQ9anM6YGhpa2VyOi8vcGFnZS9hbGl5dW4/cmVhbHVybD0ke2lucHV0LnRyaW0oKX0mcnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCJgO1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFxcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy9cXFwiICsgc2hhcmVJZCArIChmaWxlSWQgPyBcXFwiL2ZvbGRlci9cXFwiICsgZmlsZUlkIDogXFxcIlxcXCIpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLmibnph4/mjILovb3mnKzlnLDlvLnluZVcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9kbU1vdW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi5p+l55yL5omL5Yqo5oyC6L295a2X5bmVXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHptID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcIm1vdW50emltdVxcXCIsIHt9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpcCA9IHptLm5hbWUgPyBcXFwi5b2T5YmN5a2X5bmV5paH5Lu2XFxcXG5cXFwiICsgem0ubmFtZSArIFxcXCIuXFxcIiArIHptLmV4dCA6IFxcXCLov5jmnKrmiYvliqjmjILovb3lrZfluZVcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5omL5Yqo5oyC6L295a2X5bmVJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRpcCArIFxcXCJcXFxcbijngrnlh7vlj5bmtojlj6/ku6XmuIXpmaTmjILovb3lrZfluZUpXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbDogKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcIm1vdW50emltdVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LmuIXpmaTmiYvliqjmjILovb3lrZfluZVcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuiOt+WPluW8ueW5leaQnOe0ouinhOWImVxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImpzXFxcIjogSlNPTi5zdHJpbmdpZnkoXFxcImhpa2VyOi8vcGFnZS9sb2FkRG0/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCImdGl0bGU9XFxcIikgKyBcXFwiK2VuY29kZVVSSUNvbXBvbmVudChwbGF5ZGF0YS50aXRsZS5zcGxpdCgnLScpWzBdKTtcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBNWV9SVUxFLnRpdGxlICsgXFxcIuW8ueW5leaQnOe0olxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJydWxlOi8vXFxcIiArIGJhc2U2NEVuY29kZShcXFwi77+lcHJvamVjdGlvbl9zY3JlZW7vv6VcXFwiICsgSlNPTi5zdHJpbmdpZnkocnVsZSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuaOqOmAgeWIsFRWQm94XFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvdHZib3hQdXNoI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi6K6+572u5pS26JeP5bCB6Z2iXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLorr7nva7lsIHpnaLlnLDlnYBcXFwiLCBcXFwi5pCc57Si5bCB6Z2iXFxcIl0sIDEpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLorr7nva7lsIHpnaLlnLDlnYBcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIsIFxcXCLor7fovpPlhaXlm77niYflnLDlnYBcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQudHJpbSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5Zyw5Z2AXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFnZVBpY1VybChpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9mcm9udENvdmVyI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuiOt+WPluaKleWxj0lQXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlwID0gJC5yZXF1aXJlKFxcXCJhbGlVdGlsXFxcIikuZ2V0SVB2NEFkZHJlc3MoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlwLnN0YXJ0c1dpdGgoXFxcIjE5Mi4xNjguXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKGlwICsgXFxcIlxcXFxu6K+lSVDpgILnlKjkuo7mtYHph48r54Ot54K555qE5oqV5bGPXFxcXG7or7fmm7/mjaLpk77mjqXkuK3nmoQwLjAuMC4wXFxcIikuY29uZmlybSgoaXApID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgaXA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpcCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2FzdChcXFwi6I635Y+W5aSx6LSl6Z2e56iz5a6aSVAs6K+35byA5ZCv54Ot54K55YaN5L2/55SoXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLmnoHpgJ/ljp/nlLvkuIvovb3nur/nqItcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXCJzcGVlZFRocmVhZFxcXCIsIFxcXCIyMFxcXCIpLCBcXFwi6K+36L6T5YWlMy0zMuS5i+mXtOeahOaVtOaVsFxcXCIpLmlucHV0KCgpPT57XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BlZWRUaHJlYWQ9cGFyc2VJbnQoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3BlZWRUaHJlYWQ8M3x8c3BlZWRUaHJlYWQ+MzIpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7kuI3lkIjms5VcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwic3BlZWRUaHJlYWRcXFwiLFN0cmluZyhzcGVlZFRocmVhZCkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LCBzaGFyZUlkLCBzaGFyZVB3ZCwgZmlsZUlkKSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX2ZpbGVpbnRvLnN2Z1xcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBwYWdlSWQ6IHBhZ2VJZCxcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogZmlsZUlkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZDogc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IHNoYXJlVG9rZW4sXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2QsXFxuICAgICAgICAgICAgICAgICAgICBmb2xkZXJOYW1lOiBnZXRQYWdlVGl0bGUoKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZnVuU3R5bGUgPSBbXFxcIlxcXCIsIFxcXCJcXFwiLCBcXFwiXFxcIiwgXFxcImljb25fc21hbGxfM1xcXCIsIFxcXCJpY29uX3JvdW5kX3NtYWxsXzRcXFwiLCBcXFwiaWNvbl81XFxcIl1bZnVuY0l0ZW1zLmxlbmd0aF07XFxuICAgICAgICBpdGVtcy5wdXNoLmFwcGx5KGl0ZW1zLCBmdW5jSXRlbXMubWFwKHYgPT4gKHYuY29sX3R5cGUgPSBmdW5TdHlsZSkgJiYgdikpO1xcbiAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgbGV0IHJlc2NvZCA9IHt9O1xcbiAgICBsZXQgbWFya2VyID0gTVlfUEFSQU1TLm1hcmtlcjtcXG4gICAgaWYgKGlzU2VhcmNoKSB7XFxuICAgICAgICByZXNjb2QgPSBhbGlTaGFyZUFwaS5nZXRTZWFyY2hMaXN0RmlsZShzZWFyY2hLZXksIG1hcmtlciwgb3JkZXJbMF0sIG9yZGVyWzFdKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJlc2NvZCA9IGFsaVNoYXJlQXBpLmdldExpc3RGaWxlKGZpbGVJZCwgbWFya2VyLCBvcmRlclswXSwgb3JkZXJbMV0pO1xcbiAgICB9XFxuICAgIGlmIChyZXNjb2QubmV4dF9tYXJrZXIpIHtcXG4gICAgICAgIHNldE1hcmtlcihyZXNjb2QubmV4dF9tYXJrZXIpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgc2V0TWFya2VyKCk7XFxuICAgIH1cXG5cXG4gICAgdmFyIGNvbnRzID0gcmVzY29kLml0ZW1zO1xcbiAgICAvL+Wtl+W5leWMuemFjeWHhuWkh1xcbiAgICBsZXQgc3ViRXh0cyA9IFtcXFwidnR0XFxcIiwgXFxcInNydFxcXCIsIFxcXCJhc3NcXFwiXTtcXG4gICAgdmFyIHppbXVsaXN0ID0gW107XFxuICAgIGNvbnRzLmZvckVhY2goKGl0ZW0pID0+IHtcXG4gICAgICAgIGlmIChzdWJFeHRzLmluY2x1ZGVzKGl0ZW0uZmlsZV9leHRlbnNpb24gJiYgaXRlbS5maWxlX2V4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSkge1xcbiAgICAgICAgICAgIGxldCBuYW1lID0gaXRlbS5uYW1lLnJlcGxhY2UoJy4nICsgaXRlbS5maWxlX2V4dGVuc2lvbiwgJycpO1xcbiAgICAgICAgICAgIHppbXVsaXN0LnB1c2goe1xcbiAgICAgICAgICAgICAgICBleHQ6IGl0ZW0uZmlsZV9leHRlbnNpb24sXFxuICAgICAgICAgICAgICAgIGZpbGVfaWQ6IGl0ZW0uZmlsZV9pZCxcXG4gICAgICAgICAgICAgICAgbmFtZTogbmFtZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgLy/lpITnkIblpLjpobXljLnphY3lrZfluZVcXG4gICAgLypcXG4gICAgbGV0IGhhc1N1YiA9IHppbXVsaXN0Lmxlbmd0aCA+IDA7XFxuICAgIGlmIChoYXNTdWImJnJlc2NvZC5uZXh0X21hcmtlcikge1xcbiAgICAgICAgaWYgKHppbXVsaXN0Lmxlbmd0aCA+IDQpIHtcXG4gICAgICAgICAgICBzZXRTdWJ0aXRsZUNhY2hlKHppbXVsaXN0LnNsaWNlKC00KSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNldFN1YnRpdGxlQ2FjaGUoemltdWxpc3QpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCBsYXN0SXRlbSA9IGNvbnRzLmF0KC0xKTtcXG4gICAgaWYgKGhhc1N1YiYmbGFzdEl0ZW0mJmxhc3RJdGVtLmNhdGVnb3J5ID09PSBcXFwidmlkZW9cXFwiKSB7XFxuICAgICAgICBzZXRWaWRlb0l0ZW1DYWNoZShjb250cy5zcGxpY2UoY29udHMubGVuZ3RoLTEsMSkpO1xcbiAgICB9XFxuICAgIGlmIChNWV9QQUdFID4gMSkge1xcbiAgICAgICAgbGV0IHN1YnRpdGxlQ2FjaGUgPSBNWV9QQVJBTVMuc3VidGl0bGVDYWNoZSB8fCBbXTtcXG4gICAgICAgIHppbXVsaXN0ID0gemltdWxpc3QuY29uY2F0KHN1YnRpdGxlQ2FjaGUpO1xcbiAgICAgICAgbGV0IHZpZGVvSXRlbUNhY2hlID0gTVlfUEFSQU1TLnZpZGVvSXRlbUNhY2hlIHx8IFtdO1xcbiAgICAgICAgY29udHMgPSB2aWRlb0l0ZW1DYWNoZS5jb25jYXQoY29udHMpO1xcbiAgICAgICAgc2V0U3VidGl0bGVDYWNoZSgpO1xcbiAgICAgICAgc2V0VmlkZW9JdGVtQ2FjaGUoKTtcXG4gICAgfSovXFxuICAgIC8v566A5L2T5LyY5YWIXFxuICAgIHppbXVsaXN0LnNvcnQoKGEsIGIpID0+IChiLm5hbWUuZW5kc1dpdGgoXFxcIi5zY1xcXCIpIHx8IGIubmFtZS5lbmRzV2l0aChcXFwiLmNoc1xcXCIpKSAtIChhLm5hbWUuZW5kc1dpdGgoXFxcIi5zY1xcXCIpIHx8IGEubmFtZS5lbmRzV2l0aChcXFwiLmNoc1xcXCIpKSk7XFxuICAgIC8vZW5kXFxuICAgIGxldCB0aXRsZUhlYWQgPSB7XFxuICAgICAgICB2aWRlbzogXFxcIvCfjqxcXFwiLFxcbiAgICAgICAgYXVkaW86IFxcXCLwn461XFxcIixcXG4gICAgICAgIGRvYzogXFxcIvCfk5FcXFwiLFxcbiAgICAgICAgaW1hZ2U6IFxcXCLwn5a8XFxcIixcXG4gICAgICAgIHppcDogXFxcIvCfk6ZcXFwiLFxcbiAgICAgICAgZm9sZGVyOiBcXFwi8J+TglxcXCJcXG4gICAgfTtcXG5cXG4gICAgZnVuY3Rpb24gZ2V0SGVhZCh0eXBlLCBleHQpIHtcXG4gICAgICAgIGxldCBoZWFkID0gdGl0bGVIZWFkW3R5cGVdO1xcbiAgICAgICAgaWYgKHN1YkV4dHMuaW5jbHVkZXMoZXh0KSkge1xcbiAgICAgICAgICAgIGhlYWQgPSBcXFwi8J+VuFxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gaGVhZCB8fCBcXFwi4p2TXFxcIjtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBnZXRQcmV2aWV3UGljKGZpbGVJdGVtKSB7XFxuICAgICAgICBpZiAoZmlsZUl0ZW0udGh1bWJuYWlsKSB7XFxuICAgICAgICAgICAgcmV0dXJuICQoXFxcImh0dHBzOi8vZW1wdHk/XFxcIiArIGZpbGVJdGVtLmZpbGVfaWQpLmltYWdlKChwaWMpID0+IHtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaChwaWMsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbTogdHJ1ZVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSwgZmlsZUl0ZW0udGh1bWJuYWlsKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsZXQgZm9sZGVyU3R5bGUsIGZpbGVTdHlsZTtcXG4gICAgbGV0IGZpbHRlclR5cGUgPSBbXTtcXG4gICAgaWYgKHN0eWxlID09PSBcXFwi6L+95YmnXFxcIikge1xcbiAgICAgICAgZm9sZGVyU3R5bGUgPSBcXFwiYXZhdGFyXFxcIjtcXG4gICAgICAgIGZpbGVTdHlsZSA9IFxcXCJtb3ZpZV8yXFxcIjtcXG4gICAgICAgIGZpbHRlclR5cGUucHVzaChcXFwidmlkZW9cXFwiKTtcXG4gICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLov73liafmqKHlvI/lj6rmmL7npLrmlofku7blpLnlkozop4bpopFcXFwiLnNtYWxsKCkuZm9udGNvbG9yKFxcXCJncmV5XFxcIiksXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfSBlbHNlIGlmIChzdHlsZSA9PT0gXFxcIueci+WbvlxcXCIpIHtcXG4gICAgICAgIGZvbGRlclN0eWxlID0gXFxcImF2YXRhclxcXCI7XFxuICAgICAgICBmaWxlU3R5bGUgPSBcXFwiY2FyZF9waWNfM1xcXCI7XFxuICAgICAgICBmaWx0ZXJUeXBlLnB1c2goXFxcImltYWdlXFxcIik7XFxuICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi55yL5Zu+5qih5byP5Y+q5pi+56S65paH5Lu25aS55ZKM5Zu+54mHXFxcIi5zbWFsbCgpLmZvbnRjb2xvcihcXFwiZ3JleVxcXCIpLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBmb2xkZXJTdHlsZSA9IGZpbGVTdHlsZSA9IHN0eWxlO1xcbiAgICB9XFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHMubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIGxldCBmaWxlSXRlbSA9IGNvbnRzW2ldO1xcbiAgICAgICAgbGV0IGNhdGUgPSBmaWxlSXRlbS5jYXRlZ29yeTtcXG4gICAgICAgIGxldCBkZXNjID0gZm9ybWF0RGF0ZShmaWxlSXRlbS51cGRhdGVkX2F0KTtcXG4gICAgICAgIGxldCBwaWNfdXJsID0gZ2V0SWNvbihmaWxlSXRlbS5maWxlX2V4dGVuc2lvbiwgZmlsZUl0ZW0udHlwZSk7XFxuXFxuICAgICAgICBpZiAoZmlsZUl0ZW0udHlwZSA9PT0gXFxcImZvbGRlclxcXCIpIHtcXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSAoZm9sZGVyU3R5bGUgPT09IFxcXCJ0ZXh0XzFcXFwiID8gdGl0bGVIZWFkLmZvbGRlciA6IFxcXCJcXFwiKSArIGZpbGVJdGVtLm5hbWU7XFxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2FsaXl1bj9wYWdlPWZ5cGFnZScsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBmb2xkZXJTdHlsZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogZm9ybWF0RGF0ZShmaWxlSXRlbS51cGRhdGVkX2F0KSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogcGljX3VybCxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlSWQ6IHNoYXJlSWQsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVRva2VuOiBNWV9QQVJBTVMuc2hhcmVUb2tlbixcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogZmlsZUl0ZW0uZmlsZV9pZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBzaGFyZVB3ZCxcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogZmlsZUl0ZW0ubmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIG5vUGljOiB0cnVlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaWYgKGZpbHRlclR5cGUubGVuZ3RoID4gMCAmJiAhZmlsdGVyVHlwZS5pbmNsdWRlcyhjYXRlKSkge1xcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHN1YnRpdGxlLCBsb25nYywgY2xzO1xcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGZpbGVJdGVtLm5hbWU7XFxuICAgICAgICAgICAgbGV0IG5hbWVOb3RFeHQgPSBmaWxlSXRlbS5uYW1lLnJlcGxhY2UoJy4nICsgZmlsZUl0ZW0uZmlsZV9leHRlbnNpb24sICcnKTtcXG4gICAgICAgICAgICBpZiAoc3ViRXh0cy5pbmNsdWRlcyhmaWxlSXRlbS5maWxlX2V4dGVuc2lvbikpIHtcXG4gICAgICAgICAgICAgICAgbG9uZ2MgPSBbe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLmjILovb3lrZfluZVcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHptKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoJ21vdW50emltdScsIHptKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5oyC6L295a6M5oiQ77yM5b2T5YmN5a2X5bmV5paH5Lu2OiAnICsgem0ubmFtZSArICcuJyArIHptLmV4dDtcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHQ6IGZpbGVJdGVtLmZpbGVfZXh0ZW5zaW9uLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaWQ6IGZpbGVJdGVtLmZpbGVfaWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZU5vdEV4dFxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIH1dO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoY2F0ZSA9PT0gXFxcInZpZGVvXFxcIikge1xcbiAgICAgICAgICAgICAgICBpZiAoemltdWxpc3QubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHppbXVsaXN0LmZpbmQodiA9PiB2Lm5hbWUuaW5jbHVkZXMobmFtZU5vdEV4dCkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGNscyA9IFxcXCJwbGF5bGlzdCB2XFxcIiArIHBhZ2VJZDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKGZpbGVTdHlsZSA9PT0gXFxcInRleHRfMVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgZGVzYyArPSBcXFwiXFxcXHRcXFxcdFxcXCIgKyBmb3JtYXRTaXplKGZpbGVJdGVtLnNpemUpO1xcbiAgICAgICAgICAgICAgICB0aXRsZSA9IGdldEhlYWQoY2F0ZSwgZmlsZUl0ZW0uZmlsZV9leHRlbnNpb24pICsgdGl0bGU7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChbXFxcInZpZGVvXFxcIiwgXFxcImltYWdlXFxcIl0uaW5jbHVkZXMoY2F0ZSkpIHtcXG4gICAgICAgICAgICAgICAgcGljX3VybCA9IGdldFByZXZpZXdQaWMoZmlsZUl0ZW0pIHx8IHBpY191cmw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vUHJlI1xcXCIpLmxhenlSdWxlKChzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgZmlsZUlkLCBjYXRlLCBzdWJ0aXRsZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2FsaWxhenlcXFwiKShzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgZmlsZUlkLCBjYXRlLCBzdWJ0aXRsZSk7XFxuICAgICAgICAgICAgICAgIH0sIHNoYXJlSWQsIHNoYXJlUHdkLCBNWV9QQVJBTVMuc2hhcmVUb2tlbiwgZmlsZUl0ZW0uZmlsZV9pZCwgY2F0ZSwgc3VidGl0bGUpLFxcbiAgICAgICAgICAgICAgICBkZXNjOiBkZXNjLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBwaWNfdXJsLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGZpbGVJdGVtLmZpbGVfaWQsXFxuICAgICAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IGxvbmdjLFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBjbHMsXFxuICAgICAgICAgICAgICAgICAgICAvL2luaGVyaXRUaXRsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IGZpbGVJdGVtLm5hbWVcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGZpbGVTdHlsZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChjb250cy5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIn5+fuS7gOS5iOmDveayoeacieS6huWTpn5+flxcXCIuZm9udGNvbG9yKFxcXCJHcmF5XFxcIiksXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcblxcbmxldCBpdGVtcyA9IFtdO1xcbnRyeSB7XFxuICAgIGlmIChNWV9QQUdFID4gMSAmJiAhTVlfUEFSQU1TLm1hcmtlcikge1xcbiAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwifn5+5LuA5LmI6YO95rKh5pyJ5LqG5ZOmfn5+XFxcIi5mb250Y29sb3IoXFxcIkdyYXlcXFwiKSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBsb2FkKGl0ZW1zKTtcXG4gICAgfVxcbn0gY2F0Y2ggKGUpIHtcXG4gICAgaWYgKGUubmFtZSA9PT0gXFxcIkFsaUVycm9yXFxcIikge1xcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gXFxcIkludmFsaWRSZXNvdXJjZS5TaGFyZVB3ZFxcXCIpIHtcXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLor7fovpPlhaXmj5Dlj5bnoIFcXFwiLFxcbiAgICAgICAgICAgICAgICBkZXNjOiBzaGFyZVB3ZCA/IFxcXCLigJzigJzmj5Dlj5bnoIHplJnor6/igJ3igJ1cXFwiIDogXFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJCgpLmlucHV0KChNWV9QQVJBTVMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHNldFBhZ2VQYXJhbXMoT2JqZWN0LmFzc2lnbih7fSwgTVlfUEFSQU1TLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IGlucHV0XFxuICAgICAgICAgICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICB9LCBNWV9QQVJBTVMpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlmIChlLnNpZ25pZmljYW5jZSA9PT0gMSkge1xcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIGUubWVzc2FnZS5iaWcoKS5iaWcoKS5mb250Y29sb3IoXFxcInJlZFxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGUuc2lnbmlmaWNhbmNlID09PSAzKSB7XFxuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgZS5tZXNzYWdlLmJpZygpLmZvbnRjb2xvcihcXFwiZ3JlZW5cXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBsb2coXFxcIuWIl+ihqOWKoOi9veWksei0pSNcXFxcbumUmeivr+S/oeaBrz5cXFwiICsgZS50b1N0cmluZygpICsgXFxcIlxcXFxu6ZSZ6K+v6KGMPlxcXCIgKyBlLmxpbmVOdW1iZXIpO1xcbiAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfmrKfmrKfvvIzmiqXplJnkuobjgILlnKjliLfmlrDlh6DmrKHvvJ/miJbogIXmm7TmjaLmlofku7blpLnjgIInLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIGRlc2M6IGUudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgICAgICB9KTtcXG4gICAgICAgIC8vdGhyb3cgZTtcXG4gICAgfVxcbn1cXG5zYXZlTXlQYUNhY2hlKCk7XFxuc2V0UmVzdWx0KGl0ZW1zKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIueZu+W9lei0puWPt1wiLFwicGF0aFwiOlwibG9naW5cIixcInJ1bGVcIjpcImpzOlxcbnZhciBkID0gW107XFxuc2V0UGFnZVRpdGxlKFxcXCLnmbvlvZXpmL/ph4zkupHnm5hcXFwiKTtcXG5sZXQgaW5kZXggPSBOdW1iZXIoZ2V0UGFyYW0oXFxcImluZGV4XFxcIiwgXFxcIjFcXFwiKSk7XFxuaWYgKE51bWJlci5pc05hTihpbmRleCkpIHtcXG4gICAgaW5kZXggPSAxO1xcbn1cXG5cXG5cXG5mdW5jdGlvbiBnZXRRUkNvZGUoKSB7XFxuICAgIGxldCBqc29uID0gZmV0Y2goXFxcImh0dHBzOi8vcGFzc3BvcnQuYWxpeXVuZHJpdmUuY29tL25ld2xvZ2luL3FyY29kZS9nZW5lcmF0ZS5kbz9hcHBOYW1lPWFsaXl1bl9kcml2ZSZmcm9tU2l0ZT01MiZhcHBOYW1lPWFsaXl1bl9kcml2ZSZhcHBFbnRyYW5jZT13ZWImaXNNb2JpbGU9ZmFsc2UmbGFuZz16aF9DTiZyZXR1cm5Vcmw9JmJpelBhcmFtcz0mX2J4LXY9Mi4yLjNcXFwiKTtcXG4gICAgbGV0IHFyID0gSlNPTi5wYXJzZShqc29uKTtcXG4gICAgaWYgKCFvcGVuQXBwSW50ZW50KCdjb20uYWxpY2xvdWQuZGF0YWJveCcsICdjb20udGFvYmFvLmxvZ2luNGFuZHJvaWQuc2Nhbi5RclNjYW5BY3Rpdml0eScsIHtcXG4gICAgICAgICAgICBcXFwia2V5X3NjYW5QYXJhbVxcXCI6IGpzb25cXG4gICAgICAgIH0pKSB7XFxuICAgICAgICBjcmVhdGVRUkNvZGUocXIuY29udGVudC5kYXRhLmNvZGVDb250ZW50LCBmYWxzZSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHFyO1xcbn1cXG5cXG5mdW5jdGlvbiBiYWNrSG9tZSh0LCBpKSB7XFxuICAgIGJhY2soaSk7XFxuICAgIHRvYXN0KHQpO1xcbn1cXG5cXG5mdW5jdGlvbiBmcm9tQXBwR2V0VG9rZW4ocXIpIHtcXG4gICAgbGV0IHFyID0gZ2V0UVJDb2RlKCk7XFxuICAgIGlmICghcXIpIHJldHVybiBiYWNrSG9tZShcXFwi6I635Y+W5aSx6LSlXFxcIik7XFxuICAgIGxldCBja2sgPSBxci5jb250ZW50LmRhdGE7XFxuICAgIGxldCBib2R5ID0ge1xcbiAgICAgICAgY2s6IGNray5jayxcXG4gICAgICAgIHQ6IGNray50ICsgXFxcIlxcXCIsXFxuICAgICAgICBhcHBOYW1lOiBcXFwiYWxpeXVuX2RyaXZlXFxcIixcXG4gICAgICAgIGFwcEVudHJhbmNlOiBcXFwid2ViXFxcIixcXG4gICAgICAgIGlzTW9iaWxlOiBmYWxzZSxcXG4gICAgICAgIGxhbmc6IFxcXCJ6aF9DTlxcXCIsXFxuICAgICAgICBuYXZQbGF0Zm9ybTogXFxcIk1hY0ludGVsXFxcIixcXG4gICAgICAgIHJldHVyblVybDogXFxcIlxcXCIsXFxuICAgICAgICBuYXZsYW5ndWFnZTogXFxcInpoLUNOXFxcIixcXG4gICAgICAgIGZyb21TaXRlOiA1MixcXG4gICAgICAgIGJpelBhcmFtczogXFxcIlxcXCJcXG5cXG4gICAgfTtcXG4gICAgLypcXG4gICAgIHtcXG4gICAgICAgIE5FVzogXFxcIuW+heaJq+aPj1xcXCIsXFxuICAgICAgICBDQU5DRUxFRDogXFxcIuWPlua2iFxcXCIsXFxuICAgICAgICBTQ0FORUQ6XFxcIuW3suaJq+aPj1xcXCIsXFxuICAgICAgICBDQU5DRUxFRDogXFxcIuWujOaIkFxcXCJcXG4gICAgfSovXFxuICAgIGxldCBlcnJvckNvdW50ID0gMDtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzMDsgaSsrKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKHBvc3QoXFxcImh0dHBzOi8vcGFzc3BvcnQuYWxpeXVuZHJpdmUuY29tL25ld2xvZ2luL3FyY29kZS9xdWVyeS5kbz9hcHBOYW1lPWFsaXl1bl9kcml2ZSZmcm9tU2l0ZT01MiZfYngtdj0yLjIuM1xcXCIsIHtcXG4gICAgICAgICAgICAgICAgYm9keTogYm9keVxcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICBsZXQgcXJDb2RlU3RhdHVzID0gcmVzdWx0LmNvbnRlbnQuZGF0YS5xckNvZGVTdGF0dXM7XFxuXFxuICAgICAgICAgICAgaWYgKHFyQ29kZVN0YXR1cyA9PT0gXFxcIkNPTkZJUk1FRFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jb250ZW50LmRhdGEuYml6RXh0KSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKHJlc3VsdC5jb250ZW50LmRhdGEuYml6RXh0KSk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgYWxpVG9rZW5zRmlsZXBhdGggPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS90b2tlblBhdGhcXFwiKS5hbGlUb2tlbnNGaWxlcGF0aDtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBhbGlUb2tlbiA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuOiBpbmZvLnBkc19sb2dpbl9yZXN1bHQucmVmcmVzaFRva2VuXFxuICAgICAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKGFsaVRva2Vuc0ZpbGVwYXRoLCBKU09OLnN0cmluZ2lmeShhbGlUb2tlbikpO1xcbiAgICAgICAgICAgICAgICAgICAgYWRkSXRlbUFmdGVyKFxcXCJsb2dpbnlcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnmbvlvZXmiJDlip8o54K55Ye76L+U5ZueKVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgYmFja0hvbWUoXFxcIueZu+W9leaIkOWKn1xcXCIsIHRydWUpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgYmFja0hvbWUoXFxcIueZu+W9leWksei0pSzor7flsJ3or5Xlhbbku5bnmoTmlrnms5VcXFwiKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChxckNvZGVTdGF0dXMgPT09IFxcXCJDQU5DRUxFRFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgYmFja0hvbWUoXFxcIuWPlua2iOeZu+W9leaOiOadg1xcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChbXFxcIk5FV1xcXCIsIFxcXCJTQ0FORURcXFwiXS5pbmNsdWRlcyhxckNvZGVTdGF0dXMpKSB7XFxuICAgICAgICAgICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoMjUwMCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgYmFja0hvbWUoXFxcIui2heaXtlxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGVycm9yQ291bnQrKztcXG4gICAgICAgICAgICBpZiAoZXJyb3JDb3VudCA+IDQpIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG59XFxuaWYgKGluZGV4ID4gLTEpIHtcXG4gICAgbGV0IGxvZ2luVXJscyA9IFtcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3NpZ25cXFwiLCBcXFwiaHR0cHM6Ly9hdXRoLmFsaXl1bmRyaXZlLmNvbS92Mi9vYXV0aC9hdXRob3JpemU/bG9naW5fdHlwZT1jdXN0b20mcmVzcG9uc2VfdHlwZT1jb2RlJnJlZGlyZWN0X3VyaT1odHRwcyUzQSUyRiUyRnd3dy5hbGl5dW5kcml2ZS5jb20lMkZzaWduJTJGY2FsbGJhY2smY2xpZW50X2lkPTI1ZHpYM3ZiWXFrdFZ4eVgmc3RhdGU9JTdCJTIyb3JpZ2luJTIyJTNBJTIyKiUyMiU3RCMvbG9naW5cXFwiXTtcXG4gICAgbGV0IHVybCA9IGxvZ2luVXJsc1tpbmRleF07XFxuICAgIGxldCBpc1JlZnJlc2ggPSAhZ2V0UGFyYW0oXFxcIm5vUmVmcmVzaFxcXCIpO1xcbiAgICBsZXQgYWxpVG9rZW5zRmlsZXBhdGggPSAkLnJlcXVpcmUoXFxcInRva2VuUGF0aFxcXCIpLmFsaVRva2Vuc0ZpbGVwYXRoO1xcblxcbiAgICB2YXIganMgPSAkLnRvU3RyaW5nKChpc1JlZnJlc2gsIGFsaVRva2Vuc0ZpbGVwYXRoKSA9PiB7XFxuICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XFxuICAgICAgICAgICAgdmFyIHRva2VuID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKSk7XFxuICAgICAgICAgICAgaWYgKHRva2VuICYmIHRva2VuLnVzZXJfaWQpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHRva2VuX3VybCA9IGFsaVRva2Vuc0ZpbGVwYXRoO1xcbiAgICAgICAgICAgICAgICBmeV9icmlkZ2VfYXBwLndyaXRlRmlsZSh0b2tlbl91cmwsIEpTT04uc3RyaW5naWZ5KHRva2VuKSk7XFxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpO1xcbiAgICAgICAgICAgICAgICBmeV9icmlkZ2VfYXBwLmJhY2soaXNSZWZyZXNoKTtcXG4gICAgICAgICAgICAgICAgZnlfYnJpZGdlX2FwcC50b2FzdCgnVE9LRU7ojrflj5bmiJDlip/vvIzor7fli7/ms4TmvI/kuKrkurrpmpDnp4HvvIHvvIHvvIEnKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIDMwMCk7XFxuICAgIH0sIGlzUmVmcmVzaCwgYWxpVG9rZW5zRmlsZXBhdGgpO1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdXJsOiB1cmwsXFxuICAgICAgICBjb2xfdHlwZTogJ3g1X3dlYnZpZXdfc2luZ2xlJyxcXG4gICAgICAgIGRlc2M6ICcxMDAlJiZmbG9hdCcsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGNhbkJhY2s6IGZhbHNlLFxcbiAgICAgICAgICAgIGpzOiBqcyxcXG4gICAgICAgICAgICB1cmxJbnRlcmNlcHRvcjogJC50b1N0cmluZygoKSA9PiB0cnVlKVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgc2V0UmVzdWx0KGQpO1xcbn0gZWxzZSB7XFxuICAgIFxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLnrYnlvoXmjojmnYMuLi5cXFwiLmJpZygpLmJpZygpLFxcbiAgICAgICAgZGVzYzogXFxcIuWmguaenOWNh+e6p+S6huWumOaWuUFwcO+8jOaXoOazleiHquWKqOiwg+i1t+aOiOadg++8jOivt+aJq+eggeeZu+W9lVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IFxcXCJsb2dpbnlcXFwiLFxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgc2V0UmVzdWx0KGQpO1xcbiAgICB0cnkge1xcbiAgICAgICAgZnJvbUFwcEdldFRva2VuKCk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGJhY2tIb21lKFxcXCLlhoXpg6jplJnor686XFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgIH1cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpmL/ph4zliJfooahBUElcIixcInBhdGhcIjpcIkFsaUFwaVwiLFwicnVsZVwiOlwianM6XFxuLy9AYXV0aG9yIExveURnSWtcXG5mdW5jdGlvbiBBbGlFcnJvcihlcnJvckNvZGUsIG1lc3NhZ2UsIHNpZ25pZmljYW5jZSkge1xcbiAgICBsZXQgZXJyb3JUeXBlID0gQWxpRXJyb3IuZXJyb3JDb2RlTWFwLmdldChlcnJvckNvZGUpIHx8IFtdO1xcbiAgICB0aGlzLmNvZGUgPSBlcnJvckNvZGU7XFxuICAgIHRoaXMubWVzc2FnZSA9IGVycm9yVHlwZVswXSB8fCBtZXNzYWdlIHx8IFxcXCJcXFwiO1xcbiAgICB0aGlzLm5hbWUgPSBcXFwiQWxpRXJyb3JcXFwiO1xcbiAgICB0aGlzLnNpZ25pZmljYW5jZSA9IGVycm9yVHlwZVsxXSB8fCBzaWduaWZpY2FuY2UgfHwgMTtcXG59XFxuQWxpRXJyb3IuZXJyb3JDb2RlTWFwID0gbmV3IE1hcChbXFxuICAgIFtcXFwiU2hhcmVMaW5rLkNhbmNlbGxlZFxcXCIsIFtcXFwi5YiG5Lqr6ZO+5o6l5bey5aSx5pWIXFxcIl1dLFxcbiAgICBbXFxcIlNoYXJlTGluay5Gb3JiaWRkZW5cXFwiLCBbXFxcIui/neinhOi1hOa6kOW3suiiq+WwgeemgVxcXCJdXSxcXG4gICAgW1xcXCJOb3RGb3VuZC5TaGFyZUxpbmtcXFwiLCBbXFxcIuS4jeWtmOWcqOivpemTvuaOpeivt+aguOWvuVxcXCJdXSxcXG4gICAgW1xcXCJBY2Nlc3NUb2tlbkludmFsaWRcXFwiLCBbXFxcIuiuv+mXruS7pOeJjOWkseaViO+8jOivt+mHjeaWsOeZu+mZhlxcXCJdXSxcXG4gICAgW1xcXCJTaGFyZUxpbmtUb2tlbkludmFsaWRcXFwiLCBbXFxcIuWIhuS6q+S7pOeJjOWkseaViFxcXCJdXSxcXG4gICAgW1xcXCJQYXJhbUZsb3dFeGNlcHRpb25cXFwiLCBbXFxcIuiuv+mXrui/h+S6jumikee5ge+8jOivt+eojeWQjuWGjeivlVxcXCIsIDNdXVxcbl0pO1xcblxcbkFsaUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCksIHtcXG4gICAgY29uc3RydWN0b3I6IEFsaUVycm9yXFxufSk7XFxuXFxuZnVuY3Rpb24gcG9zdEFwaShhcGksIGJvZHksIGhlYWRlcnMpIHtcXG4gICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoJ2h0dHBzOi8vYXBpLmFsaXl1bmRyaXZlLmNvbScgKyBhcGksIHtcXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXFxuICAgICAgICB9LCBoZWFkZXJzKSxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgfSk7XFxuICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXG4gICAgaWYgKHJlc3VsdC5jb2RlKSB7XFxuICAgICAgICB0aHJvdyBuZXcgQWxpRXJyb3IocmVzdWx0LmNvZGUsIHJlc3VsdC5tZXNzYWdlKTtcXG4gICAgfVxcbiAgICByZXR1cm4gcmVzdWx0O1xcbn1cXG5cXG5mdW5jdGlvbiBBbGlTaGFyZUFwaShzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgcmVmcmVzaENhbGxCYWNrKSB7XFxuICAgIHRoaXMuc2hhcmVJZCA9IHNoYXJlSWQ7XFxuICAgIHRoaXMuc2hhcmVQd2QgPSBzaGFyZVB3ZDtcXG4gICAgdGhpcy5yZWZyZXNoQ2FsbEJhY2sgPSByZWZyZXNoQ2FsbEJhY2sgfHwgKCgpID0+IHZvaWQgMCk7XFxuICAgIHRoaXMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW4gfHwgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxufVxcbk9iamVjdC5hc3NpZ24oQWxpU2hhcmVBcGkucHJvdG90eXBlLCB7XFxuICAgIGdldFNoYXJlVG9rZW4oKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcG9zdEFwaShcXFwiL3YyL3NoYXJlX2xpbmsvZ2V0X3NoYXJlX3Rva2VuXFxcIiwge1xcbiAgICAgICAgICAgIFxcXCJzaGFyZV9pZFxcXCI6IHRoaXMuc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwic2hhcmVfcHdkXFxcIjogdGhpcy5zaGFyZVB3ZCxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgdGhpcy5zaGFyZVRva2VuID0gcmVzdWx0LnNoYXJlX3Rva2VuO1xcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2FsbEJhY2socmVzdWx0LnNoYXJlX3Rva2VuLCB0aGlzKTtcXG4gICAgICAgIHJldHVybiByZXN1bHQuc2hhcmVfdG9rZW47XFxuICAgIH0sXFxuICAgIHBvc3RUb2tlbkFwaShhcGksIGJvZHksIGhlYWRlcnMsIGlzUmV0cnkpIHtcXG4gICAgICAgIGxldCByZXN1bHQ7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHJlc3VsdCA9IHBvc3RBcGkoYXBpLCBib2R5LCBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgICAgICAgICAgXFxcIlgtU2hhcmUtVG9rZW5cXFwiOiB0aGlzLnNoYXJlVG9rZW4gfHwgdGhpcy5nZXRTaGFyZVRva2VuKClcXG4gICAgICAgICAgICB9LCBoZWFkZXJzKSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgaWYgKChlLmNvZGUgPT09IFxcXCJBY2Nlc3NUb2tlbkludmFsaWRcXFwiIHx8IGUuY29kZSA9PT0gXFxcIlNoYXJlTGlua1Rva2VuSW52YWxpZFxcXCIpICYmICFpc1JldHJ5KSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0VG9rZW5BcGkoYXBpLCBib2R5LCBoZWFkZXJzLCB0cnVlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdGhyb3cgZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGdldExpc3RGaWxlKGZpbGVJZCwgbWFya2VyLCBvcmRlckJ5LCBvcmRlckRpcmVjdGlvbikge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucG9zdFRva2VuQXBpKFxcXCIvYWRyaXZlL3YzL2ZpbGUvbGlzdFxcXCIsIHtcXG4gICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiB0aGlzLnNoYXJlSWQsXFxuICAgICAgICAgICAgXFxcInBhcmVudF9maWxlX2lkXFxcIjogZmlsZUlkIHx8IFxcXCJyb290XFxcIixcXG4gICAgICAgICAgICBcXFwibGltaXRcXFwiOiAxMDAsXFxuICAgICAgICAgICAgXFxcImltYWdlX3RodW1ibmFpbF9wcm9jZXNzXFxcIjogXFxcImltYWdlL3Jlc2l6ZSx3XzE2MC9mb3JtYXQsanBlZ1xcXCIsXFxuICAgICAgICAgICAgXFxcImltYWdlX3VybF9wcm9jZXNzXFxcIjogXFxcImltYWdlXFxcXC9yZXNpemUsd18xOTIwL2Zvcm1hdCxqcGVnXFxcIixcXG4gICAgICAgICAgICBcXFwidmlkZW9fdGh1bWJuYWlsX3Byb2Nlc3NcXFwiOiBcXFwidmlkZW8vc25hcHNob3QsdF8xMDAwLGZfanBnLGFyX2F1dG8sd18zMDBcXFwiLFxcbiAgICAgICAgICAgIFxcXCJvcmRlcl9ieVxcXCI6IG9yZGVyQnkgfHwgXFxcIm5hbWVcXFwiLFxcbiAgICAgICAgICAgIFxcXCJvcmRlcl9kaXJlY3Rpb25cXFwiOiBvcmRlckRpcmVjdGlvbiB8fCBcXFwiQVNDXFxcIixcXG4gICAgICAgICAgICBcXFwibWFya2VyXFxcIjogbWFya2VyXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGdldFNoYXJlSW5mbygpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBwb3N0QXBpKFxcXCIvYWRyaXZlL3YzL3NoYXJlX2xpbmsvZ2V0X3NoYXJlX2J5X2Fub255bW91cz9zaGFyZV9pZD1cXFwiICsgdGhpcy5zaGFyZUlkLCB7XFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9LFxcbiAgICBnZXRTZWFyY2hMaXN0RmlsZShrZXksIG1hcmtlciwgb3JkZXJCeSwgb3JkZXJEaXJlY3Rpb24pIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnBvc3RUb2tlbkFwaShcXFwiL3JlY29tbWVuZC92MS9zaGFyZUxpbmsvc2VhcmNoXFxcIiwge1xcbiAgICAgICAgICAgIFxcXCJzaGFyZV9pZFxcXCI6IHRoaXMuc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwia2V5d29yZFxcXCI6IGtleSxcXG4gICAgICAgICAgICBcXFwibGltaXRcXFwiOiAxMDAsXFxuICAgICAgICAgICAgXFxcIm9yZGVyX2J5XFxcIjogb3JkZXJCeSArIFxcXCIgXFxcIiArIG9yZGVyRGlyZWN0aW9uLFxcbiAgICAgICAgICAgIFxcXCJtYXJrZXJcXFwiOiBtYXJrZXIgfHwgdW5kZWZpbmVkXFxuICAgICAgICB9KTtcXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgICAgIHJlc3VsdC5pdGVtcyA9IFtdO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IEFsaVNoYXJlQXBpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Zi/6YeM5pKt5pS+QVBJXCIsXCJwYXRoXCI6XCJhbGlQbGF5QXBpXCIsXCJydWxlXCI6XCIvL0BhdXRob3IgTG95RGdJa1xcblxcbmZ1bmN0aW9uIEFsaUFjY2Vzc0FwaSh7XFxuICAgIHNoYXJlSWQsXFxuICAgIHNoYXJlUHdkLFxcbiAgICBzaGFyZVRva2VuLFxcbiAgICBhbGlUb2tlbnMsXFxuICAgIG9wZW5Ub2tlbnNcXG59KSB7XFxuICAgIHRoaXMuc2hhcmVJZCA9IHNoYXJlSWQ7XFxuICAgIHRoaXMuc2hhcmVQd2QgPSBzaGFyZVB3ZDtcXG4gICAgdGhpcy5zaGFyZVRva2VuID0gc2hhcmVUb2tlbjtcXG4gICAgdGhpcy5yZWZyZXNoU2hhcmVDYWxsQmFjayA9ICgoKSA9PiB2b2lkIDApO1xcbiAgICB0aGlzLnJlZnJlc2hBY2Nlc3NDYWxsQmFjayA9ICgoKSA9PiB2b2lkIDApO1xcbiAgICB0aGlzLnJlZnJlc2hPcGVuQ2FsbEJhY2sgPSAoKCkgPT4gdm9pZCAwKTtcXG4gICAgdGhpcy5hbGlUb2tlbnMgPSBhbGlUb2tlbnMgfHwge307XFxuICAgIGlmICghdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbikge1xcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLmnKrnmbvpmYZcXFwiKTtcXG4gICAgfVxcbiAgICBpZiAoIXRoaXMuYWxpVG9rZW5zLmFjY2Vzc190b2tlbikge1xcbiAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXG4gICAgfVxcbiAgICB0aGlzLmRlZkRyaXZlSWQgPSB0aGlzLmFsaVRva2Vucy5yZXNvdXJjZV9kcml2ZV9pZCB8fCB0aGlzLmFsaVRva2Vucy5kZWZhdWx0X2RyaXZlX2lkO1xcbiAgICB0aGlzLnJlYWNjZXNzVGsgPSAodGhpcy5hbGlUb2tlbnMudG9rZW5fdHlwZSB8fCBcXFwiQmVhcmVyXFxcIikgKyAnICcgKyB0aGlzLmFsaVRva2Vucy5hY2Nlc3NfdG9rZW47XFxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcXFwic2hhcmVUb2tlblxcXCIsIHtcXG4gICAgICAgIGdldCgpe1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaGFyZVRva2VufHwgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxuICAgICAgICB9LFxcbiAgICAgICAgc2V0KHYpe1xcbiAgICAgICAgICAgIHRoaXMuX3NoYXJlVG9rZW49djtcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcXFwib3BlblRvb2xzXFxcIiwge1xcbiAgICAgICAgZ2V0KCl7XFxuICAgICAgICAgICAgaWYgKHRoaXMuX29wZW5Ub29scykgcmV0dXJuIF9vcGVuVG9vbHM7XFxuICAgICAgICAgICAgbGV0IE9wZW5BcGlUb29scztcXG4gICAgICAgICAgICBzd2l0Y2ggKGdldEl0ZW0oXFxcIm9wZW5BcGlNb2RlXFxcIiwgXFxcIjBcXFwiKSkge1xcbiAgICAgICAgICAgICAgICBjYXNlIFxcXCIxXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgIE9wZW5BcGlUb29scyA9ICQucmVxdWlyZShcXFwib3BlbkFwaV9hbGl5dW5kcml2ZVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgIGNhc2UgXFxcIjJcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgT3BlbkFwaVRvb2xzID0gJC5yZXF1aXJlKFxcXCJvcGVuQXBpX3R2Ym94XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSBcXFwiM1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICBPcGVuQXBpVG9vbHMgPSAkLnJlcXVpcmUoXFxcIm9wZW5BcGlfWEJZXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSBcXFwiMFxcXCI6XFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XFxuICAgICAgICAgICAgICAgICAgICBPcGVuQXBpVG9vbHMgPSAkLnJlcXVpcmUoXFxcIm9wZW5BcGlfYWxpc3RcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdGhpcy5fb3BlblRvb2xzID0gbmV3IE9wZW5BcGlUb29scyh0aGlzKTtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb3BlblRvb2xzO1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFxcXCJvcGVuVG9rZW5zXFxcIiwge1xcbiAgICAgICAgZ2V0KCl7XFxuICAgICAgICAgICAgaWYgKHRoaXMuX29wZW5Ub2tlbnMpIHJldHVybiB0aGlzLl9vcGVuVG9rZW5zO1xcbiAgICAgICAgICAgIHRoaXMuX29wZW5Ub2tlbnMgPSBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgICAgICAgICAgJ1JlZnJlc2hUb2tlbk9wZW4nOiAnJyxcXG4gICAgICAgICAgICAgICAgJ0FjY2Vzc1Rva2VuT3Blbic6ICcnLFxcbiAgICAgICAgICAgICAgICAnQmluZFJlZnJlc2hUb2tlbic6ICcnLFxcbiAgICAgICAgICAgIH0sIG9wZW5Ub2tlbnMpO1xcbiAgICAgICAgICAgIGlmIChvcGVuVG9rZW5zICE9PSBudWxsICYmICF0aGlzLl9vcGVuVG9rZW5zLkFjY2Vzc1Rva2VuT3Blbikge1xcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hPcGVuVG9rZW4oKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29wZW5Ub2tlbnM7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5PYmplY3QuYXNzaWduKEFsaUFjY2Vzc0FwaS5wcm90b3R5cGUsIHtcXG4gICAgX29wZW5Ub29sczp2b2lkIDAsXFxuICAgIF9vcGVuVG9rZW5zOnZvaWQgMCxcXG4gICAgX3NoYXJlVG9rZW46dm9pZCAwLFxcbiAgICByZWZyZXNoU2hhcmVMaXN0ZW5lcihyZWZyZXNoU2hhcmVDYWxsQmFjaykge1xcbiAgICAgICAgdGhpcy5yZWZyZXNoU2hhcmVDYWxsQmFjayA9IHJlZnJlc2hTaGFyZUNhbGxCYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHJlZnJlc2hBY2Nlc3NMaXN0ZW5lcihyZWZyZXNoQWNjZXNzQ2FsbEJhY2spIHtcXG4gICAgICAgIHRoaXMucmVmcmVzaEFjY2Vzc0NhbGxCYWNrID0gcmVmcmVzaEFjY2Vzc0NhbGxCYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHJlZnJlc2hPcGVuTGlzdGVuZXIocmVmcmVzaE9wZW5DYWxsQmFjaykge1xcbiAgICAgICAgdGhpcy5yZWZyZXNoT3BlbkNhbGxCYWNrID0gcmVmcmVzaE9wZW5DYWxsQmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICB3YWl0U2xlZXAodGltZSkge1xcbiAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCh0aW1lIHx8IDYwMCk7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgcG9zdEFwaShhcGkpIHtcXG4gICAgICAgIHJldHVybiBodHRwUmVxdWVzdC5wb3N0KGFwaS5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikgPyBhcGkgOiAnaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tJyArIGFwaSkuYm9keVRvU3RyaW5nKHRydWUpLmVycm9yKChlcnIpID0+IHtcXG4gICAgICAgICAgICB0aHJvdyBlcnI7XFxuICAgICAgICB9KS5lcnJvclR5cGUoKGVyciwgcmVzKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHt9O1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzLmJvZHkpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHJib2R5ID0gKHJlc3VsdC5jb2RlID8gcmVzdWx0IDogKHJlc3VsdCAmJiByZXN1bHQucmVzcG9uc2VzICYmIHJlc3VsdC5yZXNwb25zZXNbMF0gJiYgcmVzdWx0LnJlc3BvbnNlc1swXS5ib2R5KSkgfHwge307XFxuICAgICAgICAgICAgaWYgKHJib2R5LmNvZGUpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IHJib2R5LmRpc3BsYXlfbWVzc2FnZSB8fCByYm9keS5tZXNzYWdlO1xcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYXBpICsgXFxcIj0+XFxcIiArIHJib2R5LmNvZGUgKyBcXFwiOlxcXCIgKyBtc2cpO1xcbiAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gcmJvZHkuY29kZTtcXG4gICAgICAgICAgICAgICAgZXJyb3IuanVkZ2VNc2cgPSBtc2c7XFxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGVycjtcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcblxcbiAgICB0cnlTb2x2ZShlKSB7XFxuICAgICAgICBpZiAoZS5jb2RlID09PSBcXFwiU2hhcmVMaW5rVG9rZW5JbnZhbGlkXFxcIiB8fCBlLmNvZGUgPT09IFxcXCJJbnZhbGlkUGFyYW1ldGVyTm90TWF0Y2guU2hhcmVJZFxcXCIpIHtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSBlbHNlIGlmIChlLmNvZGUgPT09IFxcXCJBY2Nlc3NUb2tlbkludmFsaWRcXFwiIHx8IGUuY29kZSA9PT0gXFxcIkFjY2Vzc1Rva2VuRXhwaXJlZFxcXCIpIHtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkucmVmcmVzaEFjY2Vzc1Rva2VuKCk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9IGVsc2UgaWYgKGUuY29kZSA9PT0gXFxcIkZvcmJpZGRlbk5vUGVybWlzc2lvbi5GaWxlXFxcIiB8fCAoZS5jb2RlID09PSBcXFwiQmFkUmVxdWVzdFxcXCIgJiYgZS5qdWRnZU1zZyA9PT0gXFxcIuS7heWPr+S/neWtmOWIsOi9rOWtmOepuumXtFxcXCIpKSB7XFxuICAgICAgICAgICAgdGhpcy5hbGlUb2tlbnMucmVzb3VyY2VfZHJpdmVfaWQgPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9LFxcbiAgICB0cnlPcGVuQXBpU29sdmUoZSkge1xcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gXFxcIkFjY2Vzc1Rva2VuSW52YWxpZFxcXCIgfHwgZS5jb2RlID09PSBcXFwiQWNjZXNzVG9rZW5FeHBpcmVkXFxcIikge1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoT3BlblRva2VuKCk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkucmVmcmVzaE9wZW5Ub2tlbigpO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9LFxcbiAgICBnZXRTaGFyZVRva2VuKCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucG9zdEFwaShcXFwiL3YyL3NoYXJlX2xpbmsvZ2V0X3NoYXJlX3Rva2VuXFxcIikuYm9keSh7XFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJzaGFyZV9wd2RcXFwiOiB0aGlzLnNoYXJlUHdkLFxcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuc2hhcmVfdG9rZW47XFxuICAgICAgICB0aGlzLnJlZnJlc2hTaGFyZUNhbGxCYWNrKHJlc3VsdC5zaGFyZV90b2tlbiwgdGhpcyk7XFxuICAgICAgICByZXR1cm4gcmVzdWx0LnNoYXJlX3Rva2VuO1xcbiAgICB9LFxcbiAgICByZWZyZXNoQWNjZXNzVG9rZW4oKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5wb3N0QXBpKFxcXCJodHRwczovL2F1dGguYWxpeXVuZHJpdmUuY29tL3YyL2FjY291bnQvdG9rZW5cXFwiKVxcbiAgICAgICAgICAgIC5ib2R5KHtcXG4gICAgICAgICAgICAgICAgXFxcImdyYW50X3R5cGVcXFwiOiBcXFwicmVmcmVzaF90b2tlblxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJyZWZyZXNoX3Rva2VuXFxcIjogdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbixcXG4gICAgICAgICAgICB9KS5oZWFkZXJzKHtcXG4gICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBQQ19VQSxcXG4gICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXCJcXG4gICAgICAgICAgICB9KS5lcnJvcigoZSkgPT4ge1xcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcXFwiSW52YWxpZFBhcmFtZXRlci5SZWZyZXNoVG9rZW5cXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBlLm1lc3NhZ2UgPSBcXFwiI+eZu+mZhui/h+acn+ivt+mHjeaWsOeZu+mZhiNcXFxcblxcXCIgKyBlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICBkZWxldGUgcmVzdWx0LnVzZXJfZGF0YTtcXG4gICAgICAgIGxldCBvcmlnaW5EZWZkRHJpdmVJZCA9IHRoaXMuYWxpVG9rZW5zLmRlZmF1bHRfZHJpdmVfaWQ7XFxuICAgICAgICB0aGlzLmFsaVRva2VucyA9IE9iamVjdC5hc3NpZ24odGhpcy5hbGlUb2tlbnMsIHJlc3VsdCk7XFxuICAgICAgICB0aGlzLnJlYWNjZXNzVGsgPSB0aGlzLmFsaVRva2Vucy50b2tlbl90eXBlICsgJyAnICsgdGhpcy5hbGlUb2tlbnMuYWNjZXNzX3Rva2VuO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAoKG9yaWdpbkRlZmREcml2ZUlkICE9PSB0aGlzLmFsaVRva2Vucy5kZWZhdWx0X2RyaXZlX2lkKSB8fCB0aGlzLmFsaVRva2Vucy5yZXNvdXJjZV9kcml2ZV9pZCA9PT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgIGxldCByZXNvdXJjZV9kcml2ZV9pZCA9IHRoaXMuZ2V0VXNlckluZm8oKS5yZXNvdXJjZV9kcml2ZV9pZDtcXG4gICAgICAgICAgICAgICAgdGhpcy5hbGlUb2tlbnMucmVzb3VyY2VfZHJpdmVfaWQgPSByZXNvdXJjZV9kcml2ZV9pZDtcXG4gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlX2RyaXZlX2lkKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZkRyaXZlSWQgPSByZXNvdXJjZV9kcml2ZV9pZDtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmRHJpdmVJZCA9IHRoaXMuYWxpVG9rZW5zLmRlZmF1bHRfZHJpdmVfaWQ7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKFxcXCLnlKjmiLfkv6Hmga/ojrflj5blpLHotKXvvJpcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRoaXMucmVmcmVzaEFjY2Vzc0NhbGxCYWNrKHJlc3VsdCwgdGhpcyk7XFxuICAgICAgICByZXR1cm4gdGhpcy5hbGlUb2tlbnM7XFxuICAgIH0sXFxuICAgIGdldFVzZXJJbmZvKCkge1xcbiAgICAgICAgbGV0IGluZm8gPSB0aGlzLnBvc3RBcGkoXFxcImh0dHBzOi8vdXNlci5hbGl5dW5kcml2ZS5jb20vdjIvdXNlci9nZXRcXFwiKS5oZWFkZXJzKHtcXG4gICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFBDX1VBLFxcbiAgICAgICAgICAgIFxcXCJhdXRob3JpemF0aW9uXFxcIjogdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9cXFwiXFxuICAgICAgICB9KS5lcnJvcldpdGhSZXRyeSgoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gaW5mbztcXG4gICAgfSxcXG4gICAgY2FjaGVPcGVuVG9rZW4ob3BlblJlc3VsdCkge1xcbiAgICAgICAgdGhpcy5vcGVuVG9rZW5zLlJlZnJlc2hUb2tlbk9wZW4gPSBvcGVuUmVzdWx0LnJlZnJlc2hfdG9rZW47XFxuICAgICAgICB0aGlzLm9wZW5Ub2tlbnMuQWNjZXNzVG9rZW5PcGVuID0gb3BlblJlc3VsdC50b2tlbl90eXBlICsgXFxcIiBcXFwiICsgb3BlblJlc3VsdC5hY2Nlc3NfdG9rZW47XFxuICAgICAgICB0aGlzLm9wZW5Ub2tlbnMuQmluZFJlZnJlc2hUb2tlbiA9IHRoaXMuYWxpVG9rZW5zLnJlZnJlc2hfdG9rZW47XFxuICAgICAgICB0aGlzLnJlZnJlc2hPcGVuQ2FsbEJhY2sob3BlblJlc3VsdCwgdGhpcyk7XFxuICAgIH0sXFxuICAgIHJlZnJlc2hPcGVuVG9rZW4oKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBvcGVuUmVzdWx0O1xcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5Ub2tlbnMuUmVmcmVzaFRva2VuT3BlbiAmJiB0aGlzLm9wZW5Ub2tlbnMuQmluZFJlZnJlc2hUb2tlbiA9PT0gdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbikge1xcbiAgICAgICAgICAgICAgICBvcGVuUmVzdWx0ID0gdGhpcy5vcGVuVG9vbHMucmVmcmVzaE9wZW5Ub2tlbigpIHx8IHt9O1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIG9wZW5SZXN1bHQgPSB0aGlzLm9wZW5Ub29scy5nZXRPcGVuVG9rZW4oKSB8fCB7fTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKG9wZW5SZXN1bHQucmVmcmVzaF90b2tlbikge1xcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlT3BlblRva2VuKG9wZW5SZXN1bHQpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuVG9rZW5zO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6L+U5Zue57uT5p6c5pegVG9rZW5cXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCJPcGVuVG9rZW7ojrflj5blpLHotKU6XFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIF9jbG91ZEZpbGVPcGVyYXRlKGJvZHksIGNsb3VkRmlsZUlkLCBvcGVyYXRlVXJsKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5wb3N0QXBpKCdodHRwczovL2FwaS5hbGl5dW5kcml2ZS5jb20vYWRyaXZlL3YyL2JhdGNoJykuYm9keSh7XFxuICAgICAgICAgICAgXFxcInJlcXVlc3RzXFxcIjogW3tcXG4gICAgICAgICAgICAgICAgXFxcImJvZHlcXFwiOiBib2R5LFxcbiAgICAgICAgICAgICAgICBcXFwiaGVhZGVyc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJDb250ZW50LVR5cGVcXFwiOiBcXFwiYXBwbGljYXRpb24vanNvblxcXCJcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgXFxcImlkXFxcIjogY2xvdWRGaWxlSWQgfHwgXFxcIjBcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwibWV0aG9kXFxcIjogXFxcIlBPU1RcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwidXJsXFxcIjogb3BlcmF0ZVVybFxcbiAgICAgICAgICAgIH1dLFxcbiAgICAgICAgICAgIFxcXCJyZXNvdXJjZVxcXCI6IFxcXCJmaWxlXFxcIlxcbiAgICAgICAgfSkuaGVhZGVycyh7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJyxcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAvL2dldEFjY2Vzc1Rva2VuXFxuICAgICAgICAgICAgJ3gtY2FuYXJ5JzogJ2NsaWVudD13ZWIsYXBwPXNoYXJlLHZlcnNpb249djIuMy4xJyxcXG4gICAgICAgICAgICAneC1zaGFyZS10b2tlbic6IHRoaXMuc2hhcmVUb2tlblxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICBpZiAoZS5jb2RlID09PSBcXFwiUXVvdGFFeGhhdXN0ZWQuRHJpdmVcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IGU7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGlmICghdGhpcy50cnlTb2x2ZShlKSkge1xcbiAgICAgICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkucmVmcmVzaEFjY2Vzc1Rva2VuKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBib2R5ID0gaHR0cC5vcHRpb25zLmJvZHkucmVxdWVzdHNbMF0uYm9keTtcXG4gICAgICAgICAgICBpZiAoYm9keS5kcml2ZV9pZCkge1xcbiAgICAgICAgICAgICAgICBib2R5LmRyaXZlX2lkID0gdGhpcy5kZWZEcml2ZUlkXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChib2R5LnRvX2RyaXZlX2lkKSB7XFxuICAgICAgICAgICAgICAgIGJvZHkudG9fZHJpdmVfaWQgPSB0aGlzLmRlZkRyaXZlSWRcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgICAgICAneC1zaGFyZS10b2tlbic6IHRoaXMuc2hhcmVUb2tlblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGNvcHlGaWxlVG9DbG91ZEZpbGUoZmlsZUlkLCByZXRyeSkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2Nsb3VkRmlsZU9wZXJhdGUoe1xcbiAgICAgICAgICAgIFxcXCJmaWxlX2lkXFxcIjogZmlsZUlkLFxcbiAgICAgICAgICAgIFxcXCJzaGFyZV9pZFxcXCI6IHRoaXMuc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwiYXV0b19yZW5hbWVcXFwiOiB0cnVlLFxcbiAgICAgICAgICAgIFxcXCJ0b19wYXJlbnRfZmlsZV9pZFxcXCI6IFxcXCJyb290XFxcIixcXG4gICAgICAgICAgICBcXFwidG9fZHJpdmVfaWRcXFwiOiB0aGlzLmRlZkRyaXZlSWRcXG4gICAgICAgIH0sIFxcXCIwXFxcIiwgXFxcIi9maWxlL2NvcHlcXFwiKTtcXG4gICAgICAgIGxldCBib2R5ID0gcmVzdWx0ICYmIHJlc3VsdC5yZXNwb25zZXMgJiYgcmVzdWx0LnJlc3BvbnNlc1swXSAmJiByZXN1bHQucmVzcG9uc2VzWzBdLmJvZHkgfHwge307XFxuICAgICAgICBpZiAoIWJvZHkuZmlsZV9pZCAmJiAhcmV0cnkpIHtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWl0U2xlZXAoMjApLmNvcHlGaWxlVG9DbG91ZEZpbGUoZmlsZUlkLCB0cnVlKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoIWJvZHkuZmlsZV9pZCkge1xcbiAgICAgICAgICAgIGxldCBlID0gbmV3IEVycm9yKFxcXCLmlofku7blpI3liLblpLHotKU6XFxcXG5cXFwiICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XFxuICAgICAgICAgICAgZS5jb2RlID0gYm9keS5jb2RlO1xcbiAgICAgICAgICAgIHRocm93IGU7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlc1swXS5ib2R5LmZpbGVfaWQ7XFxuICAgIH0sXFxuICAgIG9wZW5DbG91ZEZpbGVUb0Rvd25VcmwoY2xvdWRGaWxlSWQpIHtcXG4gICAgICAgIGxldCBmaWxlSW5mbyA9IHRoaXMucG9zdEFwaSgnaHR0cHM6Ly9vcGVuLmFsaXl1bmRyaXZlLmNvbS9hZHJpdmUvdjEuMC9vcGVuRmlsZS9nZXREb3dubG9hZFVybCcpLmJvZHkoe1xcbiAgICAgICAgICAgICdmaWxlX2lkJzogY2xvdWRGaWxlSWQsXFxuICAgICAgICAgICAgJ2RyaXZlX2lkJzogdGhpcy5kZWZEcml2ZUlkXFxuICAgICAgICB9KS5oZWFkZXJzKHtcXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBLFxcbiAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8nLFxcbiAgICAgICAgICAgICdhdXRob3JpemF0aW9uJzogdGhpcy5vcGVuVG9rZW5zLkFjY2Vzc1Rva2VuT3BlblxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoMiwgKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICAvL3RoaXMud2FpdFNsZWVwKDMwKS50cnlTb2x2ZShlKTtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgzMCkudHJ5T3BlbkFwaVNvbHZlKGUpO1xcbiAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgICdkcml2ZV9pZCc6IHRoaXMuZGVmRHJpdmVJZCxcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLm9wZW5Ub2tlbnMuQWNjZXNzVG9rZW5PcGVuXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgaWYgKCFmaWxlSW5mby51cmwgfHwgZmlsZUluZm8uY29kZSkgdGhyb3cgbmV3IEVycm9yKFxcXCLkuIvovb3pk77mjqXojrflj5blpLHotKVcXFxcblxcXCIgKyBmaWxlSW5mby5jb2RlICsgXFxcIjpcXFwiICsgZmlsZUluZm8ubWVzc2FnZSk7XFxuICAgICAgICByZXR1cm4gZmlsZUluZm8udXJsO1xcbiAgICB9LFxcbiAgICBkZWxldGVlQ2xvdWRGaWxlKGNsb3VkRmlsZUlkKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fY2xvdWRGaWxlT3BlcmF0ZSh7XFxuICAgICAgICAgICAgXFxcImRyaXZlX2lkXFxcIjogdGhpcy5kZWZEcml2ZUlkLFxcbiAgICAgICAgICAgIFxcXCJmaWxlX2lkXFxcIjogY2xvdWRGaWxlSWRcXG4gICAgICAgIH0sIGNsb3VkRmlsZUlkLCBcXFwiL2ZpbGUvZGVsZXRlXFxcIik7XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9LFxcbiAgICBnZXRWaWRlb1RlbVBsYXlVcmwoZmlsZUlkKSB7XFxuICAgICAgICBsZXQgY2xvdWRGaWxlSWQgPSB0aGlzLmNvcHlGaWxlVG9DbG91ZEZpbGUoZmlsZUlkKTtcXG4gICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKTtcXG4gICAgICAgIGxldCBwbGF5VXJsID0gdGhpcy5vcGVuQ2xvdWRGaWxlVG9Eb3duVXJsKGNsb3VkRmlsZUlkKTtcXG4gICAgICAgIHRoaXMud2FpdFNsZWVwKDUwKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgdGhpcy5kZWxldGVlQ2xvdWRGaWxlKGNsb3VkRmlsZUlkKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIiPmlofku7bliKDpmaTlpLHotKUjXFxcXG7plJnor6/kv6Hmga8+XFxcIiArIGUudG9TdHJpbmcoKSArIFxcXCJcXFxcbumUmeivr+ihjD5cXFwiICsgZS5saW5lTnVtYmVyKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBwbGF5VXJsO1xcbiAgICB9LFxcbiAgICBnZXRGaWxlVG9Eb3duVXJsKGZpbGVJZCkge1xcbiAgICAgICAgbGV0IGRvd25sb2FkSW5mbyA9IHRoaXMucG9zdEFwaShcXFwiL3YyL2ZpbGUvZ2V0X3NoYXJlX2xpbmtfZG93bmxvYWRfdXJsXFxcIikuYm9keSh7XFxuICAgICAgICAgICAgXFxcImV4cGlyZV9zZWNcXFwiOiA2MDAsXFxuICAgICAgICAgICAgXFxcImZpbGVfaWRcXFwiOiBmaWxlSWQsXFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkXFxuICAgICAgICB9KS5oZWFkZXJzKHtcXG4gICAgICAgICAgICBcXFwiWC1TaGFyZS1Ub2tlblxcXCI6IHRoaXMuc2hhcmVUb2tlbixcXG4gICAgICAgICAgICBcXFwiYXV0aG9yaXphdGlvblxcXCI6IHRoaXMuYWxpVG9rZW5zLmFjY2Vzc190b2tlblxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICB0aGlzLnRyeVNvbHZlKGUpO1xcbiAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJYLVNoYXJlLVRva2VuXFxcIjogdGhpcy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcImF1dGhvcml6YXRpb25cXFwiOiB0aGlzLmFsaVRva2Vucy5hY2Nlc3NfdG9rZW5cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gZG93bmxvYWRJbmZvLmRvd25sb2FkX3VybDtcXG4gICAgfSxcXG4gICAgZ2V0U2lnbigpIHtcXG4gICAgICAgIGlmICghdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkKSB7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGNhbGN1bGF0ZU5ld1NpZ24gPSAoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHNpZ24gPSBqdXN0VGVzdFNpZ24oXFxcIjVkZGU0ZTFiZGY5ZTQ5NjZiMzg3YmE1OGY0YjNmZGMzXFxcIiwgdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLCB0aGlzLmFsaVRva2Vucy51c2VyX2lkKS5zcGxpdChcXFwiIyNcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBzaWduYXR1cmU6IHNpZ24uYXQoMCksXFxuICAgICAgICAgICAgICAgIHB1YktleTogc2lnbi5hdCgtMSlcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCBuZXdTaWduID0gY2FsY3VsYXRlTmV3U2lnbigpO1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucG9zdEFwaSgnL3VzZXJzL3YxL3VzZXJzL2RldmljZS9jcmVhdGVfc2Vzc2lvbicpLmJvZHkoe1xcbiAgICAgICAgICAgIFxcXCJkZXZpY2VOYW1lXFxcIjogXFxcIkVkZ2XmtY/op4jlmahcXFwiLFxcbiAgICAgICAgICAgIFxcXCJtb2RlbE5hbWVcXFwiOiBcXFwiV2luZG93c+e9kemhteeJiFxcXCIsXFxuICAgICAgICAgICAgXFxcInB1YktleVxcXCI6IG5ld1NpZ24ucHViS2V5LFxcbiAgICAgICAgfSkuaGVhZGVycyh7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20nLFxcbiAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgICdYLVNoYXJlLVRva2VuJzogdGhpcy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICd4LWRldmljZS1pZCc6IHRoaXMuYWxpVG9rZW5zLmRldmljZV9pZCxcXG4gICAgICAgICAgICAneC1zaWduYXR1cmUnOiBuZXdTaWduLnNpZ25hdHVyZVxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoMywgKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICBpZiAoZS5tZXNzYWdlID09PSBcXFwieC1kZXZpY2UtaWQgZW1wdHlcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdGhpcy50cnlTb2x2ZShlKTtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCg1MCk7XFxuICAgICAgICAgICAgbmV3U2lnbiA9IGNhbGN1bGF0ZU5ld1NpZ24oKTtcXG4gICAgICAgICAgICBodHRwLm1lcmdlSGVhZEFuZEJvZHkoe1xcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicHViS2V5XFxcIjogbmV3U2lnbi5wdWJLZXlcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgICAgICAnWC1TaGFyZS1Ub2tlbic6IHRoaXMuc2hhcmVUb2tlbixcXG4gICAgICAgICAgICAgICAgICAgICd4LWRldmljZS1pZCc6IHRoaXMuYWxpVG9rZW5zLmRldmljZV9pZCxcXG4gICAgICAgICAgICAgICAgICAgICd4LXNpZ25hdHVyZSc6IG5ld1NpZ24uc2lnbmF0dXJlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLmVycm9yKChlcnIsIHJlcykgPT4ge1xcbiAgICAgICAgICAgIHJldHVybiB7fTtcXG4gICAgICAgIH0pLnN1Y2Nlc3MoKGJvZHkpID0+IHtcXG4gICAgICAgICAgICByZXR1cm4gYm9keTtcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XFxuICAgICAgICAgICAgcmV0dXJuIG5ld1NpZ247XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwiU2lnbuiOt+WPluWksei0pe+8jOivt+mHjeivleOAglxcXFxuY29kZTpcXFwiICsgKHJlc3VsdC5jb2RlIHx8IFxcXCJcXFwiKSArIFxcXCJcXFxcbm1lc3NhZ2U6XFxcIiArIChyZXN1bHQubWVzc2FnZSB8fCBcXFwiXFxcIikpO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBnZXRTaGFyZVZpZGVvUHJldmlldyhmaWxlSWQpIHtcXG4gICAgICAgIGxldCBzaWduID0gdGhpcy5nZXRTaWduKCk7XFxuICAgICAgICBsZXQganNvbiA9IHRoaXMucG9zdEFwaSgnaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tL3YyL2ZpbGUvZ2V0X3NoYXJlX2xpbmtfdmlkZW9fcHJldmlld19wbGF5X2luZm8nKS5ib2R5KHtcXG4gICAgICAgICAgICBcXFwiY2F0ZWdvcnlcXFwiOiBcXFwibGl2ZV90cmFuc2NvZGluZ1xcXCIsXFxuICAgICAgICAgICAgXFxcImZpbGVfaWRcXFwiOiBmaWxlSWQsXFxuICAgICAgICAgICAgXFxcImdldF9wcmV2aWV3X3VybFxcXCI6IHRydWUsXFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJ0ZW1wbGF0ZV9pZFxcXCI6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIFxcXCJnZXRfc3VidGl0bGVfaW5mb1xcXCI6IHRydWVcXG4gICAgICAgIH0pLmhlYWRlcnMoe1xcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyxcXG4gICAgICAgICAgICBcXFwib3JpZ2luXFxcIjogXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbVxcXCIsXFxuICAgICAgICAgICAgXFxcInJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXCIsXFxuICAgICAgICAgICAgXFxcInVzZXItYWdlbnRcXFwiOiBcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExMC4wLjAuMCBTYWZhcmkvNTM3LjM2IEVkZy8xMTAuMC4xNTg3LjQxXFxcIixcXG4gICAgICAgICAgICBcXFwieC1jYW5hcnlcXFwiOiBcXFwiY2xpZW50PXdlYixhcHA9YWRyaXZlLHZlcnNpb249djMuMS4wXFxcIixcXG4gICAgICAgICAgICBcXFwieC1zaGFyZS10b2tlblxcXCI6IHRoaXMuc2hhcmVUb2tlbixcXG4gICAgICAgICAgICBcXFwiZmlsZWlkXFxcIjogdGhpcy5hbGlUb2tlbnMudXNlcl9pZCxcXG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAneC1kZXZpY2UtaWQnOiB0aGlzLmFsaVRva2Vucy5kZXZpY2VfaWQsXFxuICAgICAgICAgICAgJ3gtc2lnbmF0dXJlJzogc2lnbi5zaWduYXR1cmVcXG4gICAgICAgIH0pLmVycm9yV2l0aFJldHJ5KChlLCBfLCBodHRwKSA9PiB7XFxuICAgICAgICAgICAgdGhpcy50cnlTb2x2ZShlKTtcXG4gICAgICAgICAgICBodHRwLm1lcmdlSGVhZEFuZEJvZHkoe1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAgICAgICAgICdYLXNoYXJlLXRva2VuJzogdGhpcy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtZGV2aWNlLWlkJzogdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtc2lnbmF0dXJlJzogc2lnbi5zaWduYXR1cmVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICByZXR1cm4ganNvbi52aWRlb19wcmV2aWV3X3BsYXlfaW5mby5saXZlX3RyYW5zY29kaW5nX3Rhc2tfbGlzdC5yZXZlcnNlKCk7XFxuICAgIH1cXG59KTtcXG5cXG5BbGlBY2Nlc3NBcGkuY3JlYXRlRGVmYXVsdCA9IGZ1bmN0aW9uKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbiwgb3BlblRva2VuLCBNWV9USVRMRSkge1xcbiAgICBjb25zdCB7XFxuICAgICAgICBvcGVuVG9rZW5zRmlsZXBhdGgsXFxuICAgICAgICBhbGlUb2tlbnNGaWxlcGF0aFxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXCJ0b2tlblBhdGhcXFwiICsgKE1ZX1RJVExFID8gXFxcIj9ydWxlPVxcXCIgKyBNWV9USVRMRSA6IFxcXCJcXFwiKSk7XFxuICAgIGlmICghb3BlblRva2VuICYmIG9wZW5Ub2tlbiAhPT0gbnVsbCAmJiBmaWxlRXhpc3Qob3BlblRva2Vuc0ZpbGVwYXRoKSkge1xcbiAgICAgICAgb3BlblRva2VuID0gJC5yZXF1aXJlKG9wZW5Ub2tlbnNGaWxlcGF0aCk7XFxuICAgIH1cXG4gICAgaWYgKCFhbGlUb2tlbiAmJiBmaWxlRXhpc3QoYWxpVG9rZW5zRmlsZXBhdGgpKSB7XFxuICAgICAgICBhbGlUb2tlbiA9ICQucmVxdWlyZShhbGlUb2tlbnNGaWxlcGF0aCk7XFxuICAgIH1cXG4gICAgaWYgKE1ZX1RJVExFKSB7XFxuICAgICAgICBzaGFyZVRva2VuID0gZ2V0VmFyKE1ZX1RJVExFICsgXFxcIkBhbGlTaGFyZVRva2VuXFxcIiwgc2hhcmVUb2tlbik7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzaGFyZVRva2VuID0gZ2V0TXlWYXIoXFxcImFsaVNoYXJlVG9rZW5cXFwiLCBzaGFyZVRva2VuKTtcXG4gICAgfVxcbiAgICByZXR1cm4gbmV3IEFsaUFjY2Vzc0FwaSh7XFxuICAgICAgICBzaGFyZUlkLFxcbiAgICAgICAgc2hhcmVQd2QsXFxuICAgICAgICBzaGFyZVRva2VuLFxcbiAgICAgICAgYWxpVG9rZW5zOiBhbGlUb2tlbixcXG4gICAgICAgIG9wZW5Ub2tlbnM6IG9wZW5Ub2tlblxcbiAgICB9KS5yZWZyZXNoU2hhcmVMaXN0ZW5lcigocmVzdWx0KSA9PiB7XFxuICAgICAgICBpZiAoTVlfVElUTEUpIHtcXG4gICAgICAgICAgICBzaGFyZVRva2VuID0gcHV0VmFyKE1ZX1RJVExFICsgXFxcIkBcXFwiICsgXFxcImFsaVNoYXJlVG9rZW5cXFwiLCByZXN1bHQpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBzaGFyZVRva2VuID0gcHV0TXlWYXIoXFxcImFsaVNoYXJlVG9rZW5cXFwiLCByZXN1bHQpO1xcbiAgICAgICAgfVxcbiAgICB9KS5yZWZyZXNoQWNjZXNzTGlzdGVuZXIoKHJlc3VsdCwgYXBpKT0+e1xcbiAgICAgICAgd3JpdGVGaWxlKGFsaVRva2Vuc0ZpbGVwYXRoLCBKU09OLnN0cmluZ2lmeShhcGkuYWxpVG9rZW5zKSk7XFxuICAgIH0pLnJlZnJlc2hPcGVuTGlzdGVuZXIoKHJlc3VsdCwgYXBpKSA9PiB7XFxuICAgICAgICB3cml0ZUZpbGUob3BlblRva2Vuc0ZpbGVwYXRoLCBKU09OLnN0cmluZ2lmeShhcGkub3BlblRva2VucykpO1xcbiAgICB9KTtcXG59XFxuJC5leHBvcnRzID0gQWxpQWNjZXNzQXBpO1xcblxcbmZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xcbiAgICB0aGlzLnVybCA9IHVybDtcXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xcbiAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXG4gICAgfSk7XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFjayA9IChlcnIsIHJlcykgPT4ge1xcbiAgICAgICAgdGhyb3cgZXJyXFxuICAgIH07XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9IChlcnIsIHJlcywgdHJ5UmVzdGFydCkgPT4gZmFsc2U7XFxuICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrID0gKGJvZHksIHJlcykgPT4gYm9keTtcXG4gICAgdGhpcy5lcnJvclR5cGVDYWxsYmFjayA9IChlcnIsIHJlcykgPT4gZXJyO1xcbiAgICB0aGlzLnN0YXJ0UmVxdWVzdCA9IGZldGNoO1xcbiAgICB0aGlzLl9ib2R5VG9TdHJpbmcgPSBmYWxzZTtcXG59XFxuXFxuT2JqZWN0LmFzc2lnbihodHRwUmVxdWVzdC5wcm90b3R5cGUsIHtcXG4gICAgYm9keVRvU3RyaW5nKGZsYWcpIHtcXG4gICAgICAgIHRoaXMuX2JvZHlUb1N0cmluZyA9ICEhZmxhZztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBib2R5KGJvZHkpIHtcXG4gICAgICAgIHRoaXMub3B0aW9ucy5ib2R5ID0gYm9keSB8fCB2b2lkIDA7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgc2V0U3RhcnRSZXF1ZXN0RnVuYyhmdW5jKSB7XFxuICAgICAgICB0aGlzLnN0YXJ0UmVxdWVzdCA9IGZ1bmM7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgaGVhZGVycyhoZWFkZXJzKSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IGhlYWRlcnMgfHwgdm9pZCAwO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHN1Y2Nlc3Moc3VjY2Vzc0NhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIHN1Y2Nlc3NDYWxsYmFjayAhPT0gXFxcImZ1bmN0aW9uXFxcIikgcmV0dXJuIHRoaXM7XFxuICAgICAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayA9IHN1Y2Nlc3NDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvcihlcnJvckNhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIGVycm9yQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvclR5cGUoZXJyb3JUeXBlQ2FsbGJhY2spIHtcXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JUeXBlQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvclR5cGVDYWxsYmFjayA9IGVycm9yVHlwZUNhbGxiYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGVycm9yV2l0aFJldHJ5KHJldHJ5Q291bnQsIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgcmV0cnlDb3VudCA9PT0gXFxcImZ1bmN0aW9uXFxcIiAmJiB0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9PT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gcmV0cnlDb3VudDtcXG4gICAgICAgICAgICByZXRyeUNvdW50ID0gMTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSAhPT0gXFxcImZ1bmN0aW9uXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfVxcbiAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gTnVtYmVyKHJldHJ5Q291bnQpO1xcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gZXJyb3JDYWxsYmFja1dpdGhSZXRyeTtcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBzdGFydCh0b0pzb24pIHtcXG4gICAgICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5ib2R5ID09PSBcXFwib2JqZWN0XFxcIiAmJiB0aGlzLl9ib2R5VG9TdHJpbmcpIHtcXG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmJvZHkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIHJlcyA9IEpTT04ucGFyc2UodGhpcy5zdGFydFJlcXVlc3QodGhpcy51cmwsIG9wdGlvbnMpKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8PSAzMDApIHtcXG4gICAgICAgICAgICAgICAgbGV0IGJvZHkgPSByZXMuYm9keTtcXG4gICAgICAgICAgICAgICAgaWYgKHRvSnNvbikge1xcbiAgICAgICAgICAgICAgICAgICAgYm9keSA9IEpTT04ucGFyc2UoYm9keSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3VjY2Vzc0NhbGxiYWNrKGJvZHksIHJlcyk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFN0cmluZyhyZXMuc3RhdHVzQ29kZSkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGVyciA9IHRoaXMuZXJyb3JUeXBlQ2FsbGJhY2soZXJyLCByZXMpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG5cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHRoaXMucmV0cnlDb3VudCkge1xcblxcbiAgICAgICAgICAgICAgICBsZXQgdHJ5UmVzdWx0ID0gdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5KGVyciwgcmVzLCB0aGlzKTtcXG4gICAgICAgICAgICAgICAgaWYgKHRyeVJlc3VsdCkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRyeUNvdW50LS07XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydCh0b0pzb24pO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gMDtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yQ2FsbGJhY2soZXJyLCByZXMpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JDYWxsYmFjayhlcnIsIHJlcyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBzZXRPcHRpb25zKG9wdGlvbnMpIHtcXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtcXG4gICAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgbWVyZ2VIZWFkQW5kQm9keShvcHRpb25zKSB7XFxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcXG4gICAgICAgIHRoaXMub3B0aW9ucy5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMuaGVhZGVycywgb3B0aW9ucy5oZWFkZXJzKTtcXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiICYmIHR5cGVvZiBvcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmJvZHkgPSBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucy5ib2R5LCBvcHRpb25zLmJvZHkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH1cXG59KTtcXG5cXG5PYmplY3QuYXNzaWduKGh0dHBSZXF1ZXN0LCB7XFxuICAgIGZldGNoKHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpO1xcbiAgICB9LFxcbiAgICBwb3N0KHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCk7XFxuICAgIH0sXFxuICAgIHJlcXVlc3QodXJsLCBvcHRpb25zKSB7XFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhyZXF1ZXN0KTtcXG4gICAgfSxcXG4gICAgcG9zdFJlcXVlc3QodXJsLCBvcHRpb25zKSB7XFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0UmVxdWVzdCk7XFxuICAgIH0sXFxuICAgIGZldGNoQ29va2llKHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMoZmV0Y2hDb29raWUpO1xcbiAgICB9XFxufSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJUb2tlbui3r+W+hFwiLFwicGF0aFwiOlwidG9rZW5QYXRoXCIsXCJydWxlXCI6XCIkLmV4cG9ydHM9e1xcbiAgICBcXFwib3BlblRva2Vuc0ZpbGVwYXRoXFxcIjogXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9hbGlPcGVuVG9rZW4uanNvblxcXCIsXFxuICAgIFxcXCJhbGlUb2tlbnNGaWxlcGF0aFxcXCI6IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvYWxpVG9rZW4uanNvblxcXCJcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlvLnlvLlwbGF55bel5YW3XCIsXCJwYXRoXCI6XCJkYW5tdVwiLFwicnVsZVwiOlwianM6XFxubGV0IGJhc2ljVXJsID0gXFxcImh0dHBzOi8vYXBpLmRhbmRhbnBsYXkubmV0L1xcXCI7XFxubGV0IHNldmVQYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvZGFubXUvXFxcIjtcXG5cXG5mdW5jdGlvbiBnZXRSZWZyZXNoUmF0ZSgpIHtcXG4gICAgY29uc3QgQ29udGV4dCA9IGFuZHJvaWQuY29udGVudC5Db250ZXh0O1xcbiAgICBjb25zdCBEaXNwbGF5ID0gYW5kcm9pZC52aWV3LkRpc3BsYXk7XFxuICAgIGNvbnN0IFdpbmRvd01hbmFnZXIgPSBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjtcXG4gICAgY29uc3QgY29udGV4dCA9IGNvbS5leGFtcGxlLmhpa2Vydmlldy51aS5BcHBsaWNhdGlvbigpLmdldENvbnRleHQoKTtcXG5cXG4gICAgbGV0IHdpbmRvd01hbmFnZXIgPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7XFxuXFxuICAgIGxldCBkaXNwbGF5ID0gd2luZG93TWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpO1xcblxcbiAgICBsZXQgcmVmcmVzaFJhdGUgPSBkaXNwbGF5LmdldFJlZnJlc2hSYXRlKCk7XFxuICAgIHJldHVybiByZWZyZXNoUmF0ZTtcXG59XFxuJC5leHBvcnRzLmdldERhbk11ID0gZnVuY3Rpb24oa2V5KSB7XFxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlcXVlc3QoYmFzaWNVcmwgKyBcXFwiYXBpL3YyL3NlYXJjaC9lcGlzb2Rlcz9hbmltZT1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGRlY29kZVVSSUNvbXBvbmVudChrZXkpKSkpO1xcbn1cXG5cXG5mdW5jdGlvbiBlbmNvZGVIdG1sKHMpIHtcXG4gICAgbGV0IFJFR1hfSFRNTF9FTkNPREUgPSAv4oCcfCZ84oCZfFxcXFx1MDAzQ3w+fFtcXFxceDAwLVxcXFx4MjBdfFtcXFxceDdGLVxcXFx4RkZdfFtcXFxcdTAxMDAtXFxcXHUyNzAwXS9nO1xcbiAgIHJldHVybiBzLnJlcGxhY2UoUkVHWF9IVE1MX0VOQ09ERSwgZnVuY3Rpb24oJDApIHtcXG4gICAgICAgIHZhciBjID0gJDAuY2hhckNvZGVBdCgwKSxcXG4gICAgICAgICAgICByID0gW1xcXCImI1xcXCJdO1xcbiAgICAgICAgYyA9IChjID09IDB4MjApID8gMHhBMCA6IGM7XFxuICAgICAgICByLnB1c2goYyk7XFxuICAgICAgICByLnB1c2goXFxcIjtcXFwiKTtcXG4gICAgICAgIHJldHVybiByLmpvaW4oXFxcIlxcXCIpO1xcbiAgICB9KTtcXG59XFxuXFxuXFxuXFxuLy8w6buY6K6kIDHnroDkvZMgMue5geS9k1xcbiQuZXhwb3J0cy5kb3dubG9hZERhbk11ID0gZnVuY3Rpb24oZXBpc29kZUlkLCBuYW1lKSB7XFxuICAgIGxldCBkYW5NdURhdGEgPSBKU09OLnBhcnNlKHJlcXVlc3QoYnVpbGRVcmwoYmFzaWNVcmwgKyBcXFwiYXBpL3YyL2NvbW1lbnQvXFxcIiArIGVwaXNvZGVJZCwge1xcbiAgICAgICAgd2l0aFJlbGF0ZWQ6IHRydWUsXFxuICAgICAgICBjaENvbnZlcnQ6IDFcXG4gICAgfSkpKTtcXG4gICAgbGV0IGRNY29udGV4dCA9IFxcXCJcXFwiO1xcbiAgICAvL2xldCBmcHNtID0gZ2V0UmVmcmVzaFJhdGUoKS82MCowLjk1O1xcbiAgICAvL2Rhbk11RGF0YS5jb21tZW50cy5zb3J0KCh2LHgpPT52LnAuc3BsaXQoXFxcIixcXFwiKVswXS14LnAuc3BsaXQoXFxcIixcXFwiKVswXSk7XFxuICAgIGZvciAobGV0IGNvbW1lbnQgb2YgZGFuTXVEYXRhLmNvbW1lbnRzKSB7XFxuICAgICAgICAvL2RNY29udGV4dCArPSBgPGQgcD1cXFwiJHtNYXRoLnJvdW5kKHRpbWVwb2ludCl9LCR7Y3R9LCR7c2l6ZX0sJHtjb2xvcn0sMFxcXCI+JHtjb250ZW50fTwvZD5cXFxcbmA7XFxuICAgICAgICBsZXQgcGFyYW1UZXh0ID0gY29tbWVudC5wO1xcbiAgICAgICAgbGV0IGNvbW1lbnRUZXh0ID0gY29tbWVudC5tO1xcbiAgICAgICAgaWYgKHBhcmFtVGV4dCA9PSBudWxsIHx8IGNvbW1lbnRUZXh0ID09IG51bGwpIGNvbnRpbnVlO1xcbiAgICAgICAgbGV0IHBhcmFtcyA9IHBhcmFtVGV4dC5zcGxpdChcXFwiLFxcXCIpO1xcbiAgICAgICAgbGV0IHBhcmFtc1QgPSBbXTtcXG4gICAgICAgIGZvciAobGV0IGkgaW4gcGFyYW1zKSB7XFxuICAgICAgICAgICAgLyppZiAoaSA9PSAwKSB7XFxuICAgICAgICAgICAgICAgIHBhcmFtc1QucHVzaChwYXJzZUludChwYXJhbXNbaV0pKTtcXG4gICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgfSovXFxuICAgICAgICAgICAgaWYgKGkgPT0gMikge1xcbiAgICAgICAgICAgICAgICBwYXJhbXNULnB1c2goXFxcIjI1XFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChpID09IDMpIHtcXG4gICAgICAgICAgICAgICAgLy/popzoibLlgLzkuLow5pe277yM6buY6K6k6K6+572u5Li655m96ImyXFxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbaV0gPT0gXFxcIjBcXFwiIHx8IHBhcmFtc1tpXSA9PSBcXFwiLTFcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNULnB1c2goXFxcIjE2Nzc3MjE1XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBwYXJhbXNULnB1c2gocGFyYW1zW2ldKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHBhcmFtc1QucHVzaChcXFwiMFxcXCIpO1xcbiAgICAgICAgbGV0IHRpbWVzPXBhcnNlSW50KHBhcmFtc1swXS82MCkrXFxcIjpcXFwiK3BhcnNlSW50KHBhcmFtc1swXSU2MCk7XFxuICAgICAgICBkTWNvbnRleHQgKz0gYDxkIHA9XFxcIiR7cGFyYW1zVC5qb2luKCcsJyl9XFxcIj4ke2VuY29kZUh0bWwoY29tbWVudFRleHQpK1xcXCIjXFxcIit0aW1lc308L2Q+XFxcXG5gO1xcbiAgICB9XFxuICAgIGlmICghZE1jb250ZXh0KSByZXR1cm47XFxuICAgIGRNY29udGV4dCA9IGA8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiIGVuY29kaW5nPVxcXCJVVEYtOFxcXCI/PjxpPlxcXFxuJHtkTWNvbnRleHR9PC9pPmA7XFxuICAgIGxldCBwYXRoID0gc2V2ZVBhdGggKyBuYW1lLnJlcGxhY2UoL1xcXFwvL2csIFxcXCJfXFxcIikgKyBcXFwiX1xcXCIgKyBlcGlzb2RlSWQgKyBcXFwiLnhtbFxcXCI7XFxuICAgIHdyaXRlRmlsZShwYXRoLCBkTWNvbnRleHQpO1xcbiAgICByZXR1cm4gcGF0aDtcXG59XFxuJC5leHBvcnRzLmdldExvY2FsRGFuTXUgPSBmdW5jdGlvbihlcGlzb2RlSWQsIG5hbWUpIHtcXG4gICAgbGV0IHBhdGggPSBzZXZlUGF0aCArIG5hbWUucmVwbGFjZSgvXFxcXC8vZywgXFxcIl9cXFwiKSArIFxcXCJfXFxcIiArIGVwaXNvZGVJZCArIFxcXCIueG1sXFxcIjtcXG4gICAgaWYgKGZpbGVFeGlzdChwYXRoKSkge1xcbiAgICAgICAgcmV0dXJuIHBhdGg7XFxuICAgIH1cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlvLnluZXmkJzntKIm5Yqg6L29XCIsXCJwYXRoXCI6XCJsb2FkRG1cIixcInJ1bGVcIjpcImpzOlxcbmxldCBkID0gW107XFxubGV0IG9ubHlEb3dubG9hZCA9ICEhTVlfUEFSQU1TLm9ubHlEb3dubG9hZDtcXG5pZiAob25seURvd25sb2FkKSB7XFxuICAgIGFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICB9KTtcXG59XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICB0aXRsZTogXFxcIjxmb250IGNvbG9yPSdHcmF5Jz7inZflhbPkuo48YnI+PHNtYWxsPiDlhoXnva7mkJzntKJQ5pWw5o2u5p2l5rqQ5LqOW+W8ueW8uXBsYXldPC9zbWFsbD48L2ZvbnQ+XFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59KTtcXG5sZXQga2V5ID0gTVlfUEFSQU1TLm5hbWUgfHwgZ2V0TXlWYXIoXFxcInNcXFwiKSB8fCBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInRpdGxlXFxcIiwgXFxcIlxcXCIpKSB8fCBcXFwiXFxcIjtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWGhee9ruaQnOe0olBcXFwiLFxcbiAgICB1cmw6ICQoa2V5LCBcXFwi6K+35pCc57Si55Wq5Ymn5ZCN56ewXFxcIikuaW5wdXQoKE1ZX1BBUkFNUykgPT4ge1xcbiAgICAgICAgc2V0UGFnZVBhcmFtcyhPYmplY3QuYXNzaWduKE1ZX1BBUkFNUywge1xcbiAgICAgICAgICAgIG5hbWU6IGlucHV0LFxcbiAgICAgICAgfSkpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgfSwgTVlfUEFSQU1TKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLlhoXnva7mkJzntKJUXFxcIixcXG4gICAgdXJsOiAkKGtleSwgXFxcIuagvOW8j++8muaQnOe0ouWFs+mUruivjVvlm57ovaZd6ZuG5pWwXFxcIikuaW5wdXQoKG9ubHlEb3dubG9hZCkgPT4ge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5pCc57Si5bm25LiL6L29Li4uXFxcIik7XFxuICAgICAgICAgICAgbGV0IFtuYW1lLCBwb3NdID0gaW5wdXQuc3BsaXQoXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAgICAgaWYgKCFuYW1lIHx8ICFwb3MpIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgXFxcIuagvOW8j+mUmeivr1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCB1cmxJbmZvID0gZmV0Y2goYnVpbGRVcmwoXFxcImh0dHBzOi8vYXp1cmUubGV1c2UudG9wL3NlYXJjaGRtXFxcIiwge1xcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwb3NcXFwiOiBwb3NcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICB1cmxJbmZvID0gSlNPTi5wYXJzZSh1cmxJbmZvKTtcXG4gICAgICAgICAgICBpZiAoIXVybEluZm8udXJsKSB0aHJvdyBcXFwi5pqC5pe25rKh5pyJ5om+5Yiw6K+l6KeG6aKR55qE5by55bmVXFxcIjtcXG4gICAgICAgICAgICBsZXQgeG1sID0gZmV0Y2goYnVpbGRVcmwoXFxcImh0dHBzOi8vYXp1cmUubGV1c2UudG9wL2Rhbm11XFxcIiwge1xcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHVybEluZm9cXG4gICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICBpZiAoIXhtbCkge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBcXFwi6L+Y5rKh5pyJ5by55bmV5ZOfflxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvZGFubXUvXFxcIiArIHVybEluZm8ucGxhdGZvcm0gKyBcXFwiX1xcXCIgKyBuYW1lICsgXFxcIl9cXFwiICsgcG9zICsgXFxcIi54bWxcXFwiO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShwYXRoLCAnPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBlbmNvZGluZz1cXFwiVVRGLThcXFwiPz5cXFxcbicgKyB4bWwpO1xcbiAgICAgICAgICAgIGlmIChvbmx5RG93bmxvYWQpIHJldHVybiBcXFwidG9hc3Q6Ly/kuIvovb3lrozmiJBcXFwiO1xcbiAgICAgICAgICAgIHJlZnJlc2hWaWRlb1VybCh7XFxuICAgICAgICAgICAgICAgIGRhbm11OiBwYXRoXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WKoOi9veWujOaIkFxcXCI7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGUudG9TdHJpbmcoKTtcXG4gICAgICAgIH1cXG4gICAgfSwgb25seURvd25sb2FkKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCJkbeebkuWtkOaQnOe0olxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoa2V5LCBvbmx5RG93bmxvYWQpID0+IHtcXG4gICAgICAgIGxldCBkbSA9IGdldFZhcihcXFwiZG1fc2hhcmVcXFwiKTtcXG4gICAgICAgIGlmIChkbSAmJiAhb25seURvd25sb2FkKSB7XFxuICAgICAgICAgICAgY2xlYXJWYXIoXFxcImRtX3NoYXJlXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFZpZGVvVXJsKHtcXG4gICAgICAgICAgICAgICAgZGFubXU6IGRtXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WKoOi9veWujOaIkFxcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiAkKGtleSwgXFxcImRt55uS5a2Q5pCc57SiXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5LiL6L295a6M5oiQ5by55bmV5ZCO6K+36YeN5paw54K55Ye75pCc57SiXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9zZWFyY2g/cnVsZT1kbeebkuWtkCZzPVxcXCIgKyBpbnB1dDtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfSwga2V5LCBvbmx5RG93bmxvYWQpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG59KTtcXG5cXG5mdW5jdGlvbiBzZWFyY2goZCwgbmFtZSkge1xcbiAgICBjb25zdCBkYW5tdSA9ICQucmVxdWlyZShcXFwiZGFubXVcXFwiKTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICB9KTtcXG4gICAgbGV0IGRtTGlzdCA9IGRhbm11LmdldERhbk11KG5hbWUpO1xcblxcbiAgICBmb3IgKGxldCBhbmltZSBvZiBkbUxpc3QuYW5pbWVzKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBhbmltZS5hbmltZVRpdGxlLFxcbiAgICAgICAgICAgIGRlc2M6IGFuaW1lLnR5cGVEZXNjcmlwdGlvbixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCJcXFwiLCBcXFwi6K+36L6T5YWl5LiL6L296IyD5Zu0KDEsXFxcIiArIGFuaW1lLmVwaXNvZGVzLmxlbmd0aCArIFxcXCIpXFxcIikuaW5wdXQoKGFuaW1lVGl0bGUsIGVwaXNvZGVzKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBbYSwgYl0gPSBpbnB1dC5zcGxpdCgvLHzvvIwvKTtcXG4gICAgICAgICAgICAgICAgYSA9IE51bWJlcihhKSwgYiA9IE51bWJlcihiKTtcXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihhKSB8fCBOdW1iZXIuaXNOYU4oYikpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fmjInmoLzlvI/ovpPlhaXmlbDlrZdcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChhIDwgMSB8fCBiID4gZXBpc29kZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl6KeE5a6a6IyD5Zu05YaF55qE5pWw5a2XXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBjb25zdCBkYW5tdSA9ICQucmVxdWlyZShcXFwiZGFubXVcXFwiKTtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBhIC0gMSwgaiA9IDE7IGkgPCBiOyBpKyssIGorKykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcGlzb2RlID0gZXBpc29kZXNbaV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRtVGl0bGUgPSBhbmltZVRpdGxlICsgXFxcIl9cXFwiICsgZXBpc29kZS5lcGlzb2RlVGl0bGU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOS4i+i9ve+8mlxcXCIgKyBlcGlzb2RlLmVwaXNvZGVUaXRsZSArIFxcXCJcXFxcdChcXFwiICsgaiArIFxcXCIvXFxcIiArIChiIC0gYSArIDEpICsgXFxcIilcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkYW5tdS5kb3dubG9hZERhbk11KGVwaXNvZGUuZXBpc29kZUlkLCBkbVRpdGxlKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WTpuWTpuS4i+i9veWksei0pS4uLlxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4i+i9veWujOaIkFxcXCI7XFxuICAgICAgICAgICAgfSwgYW5pbWUuYW5pbWVUaXRsZSwgYW5pbWUuZXBpc29kZXMpLFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL21vdmllLzE0LnN2Z1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGZvciAobGV0IGVwaXNvZGUgb2YgYW5pbWUuZXBpc29kZXMpIHtcXG4gICAgICAgICAgICBsZXQgZG1UaXRsZSA9IGFuaW1lLmFuaW1lVGl0bGUgKyBcXFwiX1xcXCIgKyBlcGlzb2RlLmVwaXNvZGVUaXRsZTtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogZXBpc29kZS5lcGlzb2RlVGl0bGUsXFxuICAgICAgICAgICAgICAgIHVybDogJChlcGlzb2RlLmVwaXNvZGVJZCkubGF6eVJ1bGUoKHVybCwgdGl0bGUsIG9ubHlEb3dubG9hZCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGFubXUgPSAkLnJlcXVpcmUoXFxcImRhbm11XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IGRhbm11LmdldExvY2FsRGFuTXUoaW5wdXQsIHRpdGxlKSB8fCBkYW5tdS5kb3dubG9hZERhbk11KGlucHV0LCB0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAob25seURvd25sb2FkKSByZXR1cm4gXFxcInRvYXN0Oi8v5LiL6L295a6M5oiQXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYW5tdVRleHQgPSBmZXRjaChwYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghZGFubXVUZXh0KSByZXR1cm4gXFxcInRvYXN0Oi8v6L+Y5rKh5pyJ5by55bmV5ZOfflxcXCI7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoVmlkZW9Vcmwoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhbm11OiBwYXRoXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WKoOi9veWujOaIkFxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIE1ZX1BBUkFNUy5kdXJsLCBkbVRpdGxlLCBvbmx5RG93bmxvYWQpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLlvLrliLbkuIvovb1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChlcGlzb2RlVGl0bGUsIGVwaXNvZGVJZCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TG9hZGluZyhcXFwi6K+3562J5b6FXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhbm11ID0gJC5yZXF1aXJlKFxcXCJkYW5tdVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYW5tdS5kb3dubG9hZERhbk11KGVwaXNvZGVJZCwgZXBpc29kZVRpdGxlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mHjeaWsOS4i+i9veWujOaIkO+8jOWNleWHu+aMgui9veOAglxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZG1UaXRsZSwgZXBpc29kZS5lcGlzb2RlSWQpXFxuICAgICAgICAgICAgICAgICAgICB9XVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGlmICghZG1MaXN0LmFuaW1lcy5sZW5ndGgpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmsqHmnInmib7liLDkuI5bXFxcIiArIG5hbWUgKyBcXFwiXeebuOWFs+eahOW8ueW5lVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgZGVzYzogXFxcIuaQnOS4jeWIsOaAjuS5iOWKnu+8n1xcXFxu5qOA5p+l5ZCN56ew5piv5ZCm5q2j56Gu77yb5Y+v5Lul5bCd6K+V5Yig6Zmk6YOo5YiG6ZmQ5a6a6K+N77yM5aaC56ys5LiA5a2j562J77yb6ICM5LiU5Y+q6IO95pCc57Si55Wq5Ymn5ZOm77yB5YW25LuW5by55bmV5Y+v55SoZG3nm5LlrZDjgIJcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmxldCBuYW1lID0gZ2V0UGFyYW0oXFxcIm5hbWVcXFwiLCBNWV9QQVJBTVMubmFtZSk7XFxuaWYgKG5hbWUpIHtcXG4gICAgdHJ5IHtcXG4gICAgICAgIHNlYXJjaChkLCBuYW1lKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnEVSUk9S4oCd4oCdXFxcIixcXG4gICAgICAgICAgICBkZXNjOiBlLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlhazlvIDlt6XlhbdcIixcInBhdGhcIjpcImFsaVV0aWxcIixcInJ1bGVcIjpcIi8v5o+Q5L6b57uZ6KeE5YiZ5L2/55So55qE5bi455So5Ye95pWwXFxuJC5leHBvcnRzID0ge1xcbiAgICBjaGVja2FsaShyZWFsdXJsKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmIChyZWFsdXJsLmluY2x1ZGVzKFxcXCJjb20vcy9cXFwiKSAmJiByZWFsdXJsICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCBzaGFyZUlkID0gcmVhbHVybC5zcGxpdChcXFwiP1xcXCIpWzBdLnNwbGl0KFxcXCIvXFxcIilbNF07XFxuICAgICAgICAgICAgICAgIGxldCBzaGFyZSA9IGZldGNoKFxcXCJodHRwczovL2FwaS5hbGl5dW5kcml2ZS5jb20vYWRyaXZlL3YzL3NoYXJlX2xpbmsvZ2V0X3NoYXJlX2J5X2Fub255bW91c1xcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogUENfVUEsXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogc2hhcmVJZFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBpZiAoc2hhcmUuaW5jbHVkZXMoXFxcInNoYXJlX2xpbmsgaXNcXFwiKSB8fCBzaGFyZS5pbmNsdWRlcyhcXFwic2hhcmVfbGluayBjYW5ub3RcXFwiKSkgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfSxcXG4gICAgYnl0ZXNUb1NpemUoc2l6ZSkge1xcbiAgICAgICAgaWYgKCFzaXplKSB7XFxuICAgICAgICAgICAgcmV0dXJuICcwJztcXG4gICAgICAgIH1cXG4gICAgICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJywgJ1pCJywgJ1lCJ107XFxuICAgICAgICBsZXQgaSA9IDA7XFxuICAgICAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0KSB7XFxuICAgICAgICAgICAgc2l6ZSAvPSAxMDI0O1xcbiAgICAgICAgICAgIGkrKztcXG4gICAgICAgIH1cXG4gICAgICAgIHNpemUgPSBpID8gTnVtYmVyKHNpemUudG9GaXhlZCgyKSkgOiBzaXplO1xcbiAgICAgICAgcmV0dXJuIGAke3NpemV9ICR7dW5pdHNbaV19YDtcXG4gICAgfSxcXG4gICAgZ2V0Q3J5cHRvSlMoKSB7XFxuICAgICAgICBpZiAodHlwZW9mIENyeXB0b0pTID09PSBcXFwidW5kZWZpbmVkXFxcIikge1xcbiAgICAgICAgICAgIGV2YWwoZ2V0Q3J5cHRvSlMoKSk7XFxuICAgICAgICAgICAgcmV0dXJuIENyeXB0b0pTO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIENyeXB0b0pTO1xcbiAgICB9LFxcbiAgICBtYXRjaEFsaVVybCh0ZXh0LCBpc0cpIHtcXG4gICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImFsaXRlc3RcXFwiKS5tYXRjaEFsaVVybCh0ZXh0LCBpc0cpO1xcbiAgICB9LFxcbiAgICBnZXRJUHY0QWRkcmVzcygpIHtcXG4gICAgICAgIGNvbnN0IE5ldHdvcmtJbnRlcmZhY2UgPSBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBmb3IgKGxldCBlbiA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKTsgZW4uaGFzTW9yZUVsZW1lbnRzKCk7KSB7XFxuICAgICAgICAgICAgICAgIGxldCBpbnRmID0gZW4ubmV4dEVsZW1lbnQoKTtcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZW51bUlwQWRkciA9IGludGYuZ2V0SW5ldEFkZHJlc3NlcygpOyBlbnVtSXBBZGRyLmhhc01vcmVFbGVtZW50cygpOykge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZXRBZGRyZXNzID0gZW51bUlwQWRkci5uZXh0RWxlbWVudCgpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmV0QWRkcmVzcy5pc0xvb3BiYWNrQWRkcmVzcygpICYmIGluZXRBZGRyZXNzIGluc3RhbmNlb2YgamF2YS5uZXQuSW5ldDRBZGRyZXNzKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhpbmV0QWRkcmVzcy5nZXRIb3N0QWRkcmVzcygpKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XFxuICAgICAgICAgICAgbG9nKGV4LnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCIwLjAuMC4wXFxcIjtcXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW8ueW5leaJuemHj+aMgui9vVwiLFwicGF0aFwiOlwiZG1Nb3VudFwiLFwicnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcImRsbGFzdFRpbWVcXFwiKSk7XFxuc2V0UGFnZVRpdGxlKFxcXCLlvLnluZXmjILovb06XFxcIisoTVlfUEFSQU1TLmZvbGRlck5hbWV8fFxcXCI/XFxcIikpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5riF56m65oyC6L295YiX6KGoXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcImRtbGlzdFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG59KTtcXG5pZighTVlfUEFSQU1TLmF1dG9tYXRpY2FkZCl7XFxuICAgIE1ZX1BBUkFNUy5hdXRvbWF0aWNhZGQgPSBnZXRJdGVtKFxcXCJhdXRvbWF0aWNhZGRcXFwiLFxcXCIxXFxcIik7XFxuICAgIHNldFBhZ2VQYXJhbXMoTVlfUEFSQU1TKTtcXG59XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmo4DmtYvmlrDlop46XFxcIitbXFxcIuWFs+mXrVxcXCIsXFxcIuW8gOWQr1xcXCJdW01ZX1BBUkFNUy5hdXRvbWF0aWNhZGR8fFxcXCIwXFxcIl0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodikgPT4ge1xcbiAgICAgICBzZXRJdGVtKFxcXCJhdXRvbWF0aWNhZGRcXFwiLCB2LmF1dG9tYXRpY2FkZD09PVxcXCIxXFxcIj9cXFwiMFxcXCI6XFxcIjFcXFwiKTtcXG4gICAgICAgdi5hdXRvbWF0aWNhZGQgPSB1bmRlZmluZWQ7XFxuICAgICAgIHNldFBhZ2VQYXJhbXModik7XFxuICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgTVlfUEFSQU1TKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5LiL6L295by55bmVXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvbG9hZERtI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBvbmx5RG93bmxvYWQ6IHRydWVcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5bey5oyC6L29XFxcIi5iaWcoKSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcbiAgICAgICAgbGV0IEZpbGVTb3J0aW5nID0gJC5yZXF1aXJlKFxcXCJGaWxlU29ydGluZ1xcXCIpO1xcbiAgICAgICAgZG1saXN0LnNvcnQoKGEsIGIpID0+IEZpbGVTb3J0aW5nLm5hbWVDb21wYXJlKGEsIGIpKTtcXG4gICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJkbWxpc3RcXFwiLCBkbWxpc3QpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aOkuW6j+WujOaIkFxcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XFxubGV0IGZpbGUgPSAkLnJlcXVpcmUoXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS93ZWlzeXIvanMvZmlsZS5qcz92PTFcXFwiKTtcXG5sZXQgZG1saXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImRtbGlzdFxcXCIsIFtdKTtcXG5cXG5mb3IgKGxldCBpID0gMDsgaSA8IGRtbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICBsZXQgZG1uYW1lID0gZG1saXN0W2ldO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCJbXFxcIiArIChpICsgMSkgKyBcXFwiXVxcXFx0XFxcIiArIGRtbmFtZSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcbiAgICAgICAgICAgIGRtbGlzdC5zcGxpY2UoaSwgMSk7XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImRtbGlzdFxcXCIsIGRtbGlzdCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBpKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbiAgICB9KTtcXG59XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLmnKzlnLDmnKrmjILovb1cXFwiLmJpZygpLFxcbiAgICB1cmw6ICQoXFxcIuaYr+WQpua4hemZpOaJgOacieacrOWcsOW8ueW5leaWh+S7tj9cXFxcbijlvLnluZXmlofku7bmr4/kuInlpKnkvJroh6rliqjmuIXpmaQpXFxcIikuY29uZmlybSgoKSA9PiB7XFxuICAgICAgICBsZXQgZmlsZSA9ICQucmVxdWlyZShcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3dlaXN5ci9qcy9maWxlLmpzP3Y9MVxcXCIpO1xcbiAgICAgICAgZmlsZS5kZWxldGVGaWxlcyhnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL2Rhbm11L1xcXCIpLnNsaWNlKDcpKTtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcImRtbGlzdFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWIoOmZpFxcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XFxubGV0IGRtTGlzdFBhdGggPSBnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL2Rhbm11L1xcXCIpLnNsaWNlKDcpO1xcbmxldCBmaWxlTGlzdCA9IGZpbGUuZ2V0RmlsZVBhdGgoZG1MaXN0UGF0aCwgXFxcImZpbGVcXFwiLCBcXFwiLnhtbFxcXCIpO1xcbmxldCBsYXN0VGltZSA9IDA7XFxuXFxuZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICBsZXQgZG1maWxlID0gZmlsZUxpc3RbaV07XFxuICAgIGxhc3RUaW1lID0gTWF0aC5tYXgobGFzdFRpbWUsIGRtZmlsZS5sYXN0TW9kaWZpZWQpO1xcbiAgICBpZiAoZG1saXN0LmluY2x1ZGVzKGRtZmlsZS5uYW1lKSkgY29udGludWU7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogZG1maWxlLm5hbWUsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG5hbWUpID0+IHtcXG4gICAgICAgICAgICBsZXQgZG1saXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImRtbGlzdFxcXCIsIFtdKTtcXG4gICAgICAgICAgICBpZiAoIWRtbGlzdC5pbmNsdWRlcyhuYW1lKSkge1xcbiAgICAgICAgICAgICAgICBkbWxpc3QucHVzaChuYW1lKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImRtbGlzdFxcXCIsIGRtbGlzdCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBkbWZpbGUubmFtZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG4gICAgfSk7XFxufVxcbmxldCBsYXN0UmVjb3JkID0gTnVtYmVyKGdldE15VmFyKFxcXCJkbGxhc3RUaW1lXFxcIiwgXFxcIi0xXFxcIikpO1xcblxcbmlmIChNWV9QQVJBTVMuYXV0b21hdGljYWRkPT09XFxcIjFcXFwiJiZsYXN0UmVjb3JkIT0tMSYmbGFzdFJlY29yZCA8IGxhc3RUaW1lKSB7XFxuICAgIGNvbmZpcm0oe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmlrDlvLnluZXmlofku7ZcXFwiLFxcbiAgICAgICAgY29udGVudDogXFxcIuajgOafpeWIsOaWsOS4i+i9veeahOW8ueW5leaYr+WQpuWFqOmDqOaMgui9ve+8n1xcXCIsXFxuICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKChsYXN0UmVjb3JkLCBkbUxpc3RQYXRoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGZpbGUgPSAkLnJlcXVpcmUoXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS93ZWlzeXIvanMvZmlsZS5qcz92PTFcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZmlsZUxpc3QgPSBmaWxlLmdldEZpbGVQYXRoKGRtTGlzdFBhdGgsIFxcXCJmaWxlXFxcIiwgXFxcIi54bWxcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZG1saXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImRtbGlzdFxcXCIsIFtdKTtcXG4gICAgICAgICAgICBmaWxlTGlzdC5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgICAgICBpZiAoIWRtbGlzdC5pbmNsdWRlcyh2Lm5hbWUpJiZ2Lmxhc3RNb2RpZmllZCA+IGxhc3RSZWNvcmQpIHtcXG4gICAgICAgICAgICAgICAgICAgIGRtbGlzdC5wdXNoKHYubmFtZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiZG1saXN0XFxcIiwgZG1saXN0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aMgui9veaIkOWKn+OAglxcXCI7XFxuICAgICAgICB9LCBsYXN0UmVjb3JkLCBkbUxpc3RQYXRoKSxcXG4gICAgfSk7XFxufVxcbmlmKGxhc3RUaW1lPj0wKXtcXG4gICAgcHV0TXlWYXIoXFxcImRsbGFzdFRpbWVcXFwiLCBcXFwiXFxcIiArIGxhc3RUaW1lKTtcXG59XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Li76aG15aSE55CGXCIsXCJwYXRoXCI6XCJNYWluXCIsXCJydWxlXCI6XCJpZiAoZ2V0SXRlbShcXFwiZmlyc3RcXFwiKSA9PSBNWV9SVUxFLnZlcnNpb24pIHtcXG4gICAgJC5yZXF1aXJlKFxcXCJzb3VcXFwiKTtcXG59IGVsc2UgaWYgKE1ZX1BBR0UgPT09IDEpIHtcXG4gICAgbGV0IGQgPSBbXVxcbiAgICBsZXQgdGltZSA9IGdldEl0ZW0oXFxcImZpcnN0XFxcIiwgXFxcIlxcXCIpID8gNiA6IDIwO1xcbiAgICBsZXQgaWQgPSBEYXRlLm5vdygpO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08c3Ryb25nPuS9v+eUqOWJjemhu+efpTwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiMS4g5pys5bCP56iL5bqP5omA5pyJ5Luj56CB5YWo6YOo5byA5rqQ77yM5LiU5pys6KeE5YiZ5Li65a2m5Lmg55uu55qE77yM6K+35LqO5a+85YWlMjTlsI/ml7blhoXliKDpmaTvvIHvvIHvvIE8YnI+Mi4g5pys5bCP56iL5bqPPGI+5a6M5YWo5YWN6LS5PC9iPu+8jOWmguaenOS9oOaYr+S7mOi0uei0reS5sOeahOaBreWWnOS9oOiiq+mql+S6huOAgjxicj7lvZPnhLblpoLmnpzmnInog73lipvmg7PpvJPlirHkvZzogIXnmoTlj6/ku6U8YSBocmVmPSdoaWtlcjovL3BhZ2UvRG9uYXRlLnYjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjJz7mlK/mjIHkuIDkuIs8L2E+KDxzbWFsbD7ngrnlh7vlj6/ov5vlhaXmjZDotaDvvIzlj6/lnKjkuLvpobXoj5zljZXov5vlhaU8L3NtYWxsPinjgII8YnI+My4g5pys5bCP56iL5bqP5piv5Zyo5Y6f54mI44CM5LqR55uY5ZCb44CN55qE5Z+656GA6L+b6KGM55qE5LqM5qyh5L+u5pS577yM6K+35pSv5oyB5Y6f54mI44CCPGJyPjQuIOivt+OAjOS6keebmOWQmy7nroDjgI3nmoTkuozmrKHkv67mlLnlsIrph43kuIDkuIvljp/niYjvvIzosKLosKLjgII8YnI+PGJyPjxiPuW8gOWni+S9v+eUqOacrOinhOWImeWNs+S7o+ihqOmBteWuiOinhOWImeadoeS+izwvYj48YnI+5b2T5YmN54mI5pys77yaXFxcIiArIE1ZX1JVTEUudmVyc2lvbixcXG4gICAgICAgIFxcXCJjb2xfdHlwZVxcXCI6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0sIHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG4gICAgfSwge1xcbiAgICAgICAgdGl0bGU6IHRpbWUgKyBcXFwi56eS5ZCO57un57utXFxcIixcXG4gICAgICAgIHVybDogXFxcInRvYXN0Oi8v6K+36K6k55yf6ZiF6K+75Lul5LiK5YaF5a65XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBpZCArIFxcXCJ0aW1lclxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIHNldFJlc3VsdChkKTtcXG4gICAgd2hpbGUgKHRpbWUgIT0gMCkge1xcbiAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCgxMDAwKTtcXG4gICAgICAgIHRpbWUgLT0gMTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oaWQgKyBcXFwidGltZXJcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IHRpbWUgKyBcXFwi56eS5ZCO57un57utXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgdXBkYXRlSXRlbShpZCArIFxcXCJ0aW1lclxcXCIsIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc5oiR5ZCM5oSP5Lul5LiK6KaB5rGC4oCd4oCdXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodikgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcImZpcnN0XFxcIiwgU3RyaW5nKHYpKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mhJ/osKLmgqjnmoTnkIbop6NcXFwiO1xcbiAgICAgICAgfSwgTVlfUlVMRS52ZXJzaW9uKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgfSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5o2Q6LWgXCIsXCJwYXRoXCI6XCJEb25hdGUudlwiLFwicnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIuaNkOi1oC/mlK/mjIFcXFwiKTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaNkOi1oC/mlK/mjIFcXFwiLFxcbiAgICBkZXNjOiBcXFwi6L+Z5Liq5o2Q6LWg5LiN6IO95Li65L2g5bim5p2l54m55p2D77yM5L2G5oKo55qE5pSv5oyB5piv5oiR5pu05paw5Yib5L2c55qE5Yqo5Yqb44CCXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiBcXFwidG9hc3Q6Ly/mhJ/osKLmgqjnmoTmlK/mjIFcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJwaWNfMV9mdWxsXFxcIixcXG4gICAgdXJsOiBcXFwiaHR0cHM6Ly9naXRlZS5jb20vTG95RGdJay9Mb3lEZ0lrX1J1bGUvcmF3L21hc3Rlci82N2Q4ZjAxODdmMDE4NmMxLnBuZ1xcXCIsXFxuICAgIHBpY191cmw6IFxcXCJodHRwczovL2dpdGVlLmNvbS9Mb3lEZ0lrL0xveURnSWtfUnVsZS9yYXcvbWFzdGVyLzY3ZDhmMDE4N2YwMTg2YzEucG5nXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLlm77niYfliqDovb3nvJPmhaLor7fnqI3nrYlcXFwiLnNtYWxsKCkuZm9udGNvbG9yKFxcXCJHcmF5XFxcIiksXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJUVkJPWOaOqOmAgVwiLFwicGF0aFwiOlwidHZib3hQdXNoXCIsXCJydWxlXCI6XCJqczpcXG4oZnVuY3Rpb24oKSB7XFxuICAgIGxldCBkID0gW107XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIHBhZ2VJZCxcXG4gICAgICAgIHNoYXJlSWQsXFxuICAgICAgICBmb2xkZXJOYW1lLFxcbiAgICAgICAgZmlsZUlkXFxuICAgIH0gPSBNWV9QQVJBTVM7XFxuICAgIHNldFBhZ2VUaXRsZShcXFwiVFZCT1jmjqjpgIE6XFxcIiArIGZvbGRlck5hbWUpO1xcbiAgICBjb25zdCB7XFxuICAgICAgICBhbGlUb2tlbnNGaWxlcGF0aFxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXCJ0b2tlblBhdGhcXFwiKTtcXG4gICAgbGV0IHJlZnJlc2hUb2tlbiA9IFxcXCJcXFwiO1xcbiAgICBpZiAoIWZpbGVFeGlzdChhbGlUb2tlbnNGaWxlcGF0aCkpIHtcXG4gICAgICAgIHRvYXN0KFxcXCLor7flhYjnmbvpmYbnmbvlvZXotKblj7dcXFwiKTtcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmVmcmVzaFRva2VuID0gJC5yZXF1aXJlKGFsaVRva2Vuc0ZpbGVwYXRoKS5yZWZyZXNoX3Rva2VuO1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIGdldFB1c2gobmFtZSwgdXJsKSB7XFxuICAgICAgICBsZXQgcHVzaCA9IHtcXG4gICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiBzaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJyZWZyZXNoX3Rva2VuXFxcIjogcmVmcmVzaFRva2VuLFxcbiAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogbmFtZSxcXG4gICAgICAgICAgICBcXFwidXJsXFxcIjogdXJsXFxuICAgICAgICB9O1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcHVzaCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/cnVsZT1YWVHmjqjpgIEmcHVzaHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHB1c2gpKTtcXG4gICAgfVxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmjqjpgIHpmL/ph4zliIbkuqvpk77mjqVcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3B1c2gjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP3J1bGU9WFlR5o6o6YCBJnB1c2h1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXFxcIiArIHNoYXJlSWQgKyAoZmlsZUlkID8gXFxcIi9mb2xkZXIvXFxcIiArIGZpbGVJZCA6IFxcXCJcXFwiKSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxldCBhbGwgPSB7XFxuICAgICAgICB0aXRsZTogXFxcIuaOqOmAgeWFqOmDqOW3suWKoOi9veinhumikVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaW5oZXJpdFRpdGxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGQucHVzaChhbGwpO1xcbiAgICBsZXQgYWxsVXJscyA9IFtdO1xcbiAgICBsZXQgbGlzdCA9IGZpbmRJdGVtc0J5Q2xzKFxcXCJ2XFxcIiArIHBhZ2VJZCk7XFxuICAgIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSB8fCBsaXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgLyp0b2FzdChcXFwi6L+Y5rKh5pyJ5Yqg6L295a6M5oiQ55qE6KeG6aKRXFxcIik7XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIHJldHVybjsqL1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwifn5+6L+Y5pyo5pyJ6KeG6aKR5ZOmfn5+XFxcIi5mb250Y29sb3IoXFxcImdyZXlcXFwiKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgYWxsLnVybCA9IFxcXCJ0b2FzdDovL+ayoeacieinhumikeaXoOazleaOqOmAgVxcXCI7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBsaXN0LmZvckVhY2godiA9PiB7XFxuICAgICAgICAgICAgdi5jb2xfdHlwZSA9IHYudHlwZTtcXG4gICAgICAgICAgICBsZXQgbmFtZSA9IHYuZXh0cmEucGFnZVRpdGxlO1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBuYW1lLnJlcGxhY2UoL1xcXFwjL2csICdfJykucmVwbGFjZSgvXFxcXCQvZywgJ18nKSArIFxcXCIkdmlkZW98XFxcIiArIHYuZXh0cmEuaWQ7XFxuICAgICAgICAgICAgYWxsVXJscy5wdXNoKHVybCk7XFxuICAgICAgICAgICAgdi51cmwgPSBnZXRQdXNoKG5hbWUsIHVybCk7XFxuICAgICAgICAgICAgdi5leHRyYS5jbHMgPSB2LmV4dHJhLmlkID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgIGQucHVzaCh2KTtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgYWxsLnVybCA9IGdldFB1c2goZm9sZGVyTmFtZSwgYWxsVXJscy5qb2luKFxcXCIjXFxcIikpO1xcbiAgICB9XFxuICAgIHNldFJlc3VsdChkKTtcXG59KSgpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5bCB6Z2i5pCc57SiXCIsXCJwYXRoXCI6XCJmcm9udENvdmVyXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZCA9IFtdO1xcbmxldCBrZXkgPSBnZXRNeVZhcihcXFwiZnJvbnRjb3ZlcmtleVxcXCIsIFxcXCJcXFwiKTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcImZyb250Y292ZXJrZXlcXFwiLCBpbnB1dC50cmltKCkpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZToga2V5IHx8IGdldE15VmFyKFxcXCJzXFxcIiwgXFxcIlxcXCIpXFxuICAgIH1cXG59KTtcXG5pZiAoa2V5KSB7XFxuICAgIGxldCByID0gcmVxdWVzdCgnaHR0cHM6Ly9tLmRvdWJhbi5jb20vc2VhcmNoLz9xdWVyeT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGtleSkpXFxuICAgIGxldCBsaXN0ID0gcGRmYShyLCBcXFwiLnNlYXJjaC1yZXN1bHRzJiZpbWdcXFwiKTtcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgbGV0IHBpYyA9IHBkZmgoaXQsIFxcXCJpbWcmJnNyY1xcXCIpO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBwaWNfdXJsOiBwaWMsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwaWMpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImZyb250Y292ZXJwaWNcXFwiLCBwaWMpO1xcbiAgICAgICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSwgcGljKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInBpY18yX2NhcmRcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcblxcbn1cXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgbGV0IHBpYyA9IGdldE15VmFyKFxcXCJmcm9udGNvdmVycGljXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcImZyb250Y292ZXJwaWNcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiZnJvbnRjb3ZlcmtleVxcXCIpO1xcbiAgICBzZXRQYWdlUGljVXJsKHBpYyk7XFxufSk7XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ5paH5Lu2XCIsXCJwYXRoXCI6XCJjb25maWdzXCIsXCJydWxlXCI6XCJjb25zdCBwYXRoID0gXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9hbGlTaW1wbGVSdWxlcy5qc29uXFxcIjtcXG5sZXQgZGF0YTtcXG5cXG5mdW5jdGlvbiBnZXRKc29uKCkge1xcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xcbiAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlKHBhdGgpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgZGF0YSA9IFtdO1xcbiAgICB9XFxuICAgIHJldHVybiBkYXRhO1xcbn1cXG5cXG5mdW5jdGlvbiBzYXZlSnNvbihqc29uKSB7XFxuICAgIHNhdmVGaWxlKHBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0VXNlZnVsSnNvbigpIHtcXG4gICAgcmV0dXJuIGdldEpzb24oKS5maWx0ZXIodiA9PiAhdi5mb3JiaWRkZW4pO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGb3JiaWRkZW5Kc29uKCkge1xcbiAgICByZXR1cm4gZ2V0SnNvbigpLmZpbHRlcih2ID0+IHYuZm9yYmlkZGVuKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0R3JvdXBKc29uKGdyb3VwKSB7XFxuICAgIHJldHVybiBnZXRKc29uKCkuZmlsdGVyKHYgPT4gdi5ncm91cCA9PT0gZ3JvdXApO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRHcm91cE5hbWVzKCkge1xcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGdldEpzb24oKS5tYXAodiA9PiB2Lmdyb3VwKSkpLmZpbHRlcih2ID0+IHYpO1xcbn1cXG5cXG5pZiAoIWZpbGVFeGlzdChwYXRoKSAmJiBNWV9SVUxFKSB7XFxuICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwicnVsZXNcXFwiKTtcXG4gICAgJC5oaWtlci53aW5kb3cgPSB7fTtcXG4gICAgZXZhbC5jYWxsKG51bGwsIGZldGNoKCdoaWtlcjovL2Fzc2V0cy9iZWF1dGlmeS5qcycpKTtcXG4gICAgcnVsZXMgPSBydWxlcy5tYXAoKHYpID0+IHtcXG4gICAgICAgIHYuZmluZCA9IHdpbmRvdy5qc19iZWF1dGlmeSh2LmZpbmQudG9TdHJpbmcoKS5yZXBsYWNlKC9mdW5jdGlvbi4qP1xcXFwocy4qP3BhZ2VcXFxcKS4qP1xcXFx7LywgXFxcIlxcXCIpLnJlcGxhY2UoLyhcXFxcfVtcXFxcc1xcXFxTXS4qPykkLywgXFxcIlxcXCIpKTtcXG4gICAgICAgIGlmICh2LmZpbmRBbGlVcmwpIHtcXG4gICAgICAgICAgICB2LmZpbmRBbGlVcmwgPSB3aW5kb3cuanNfYmVhdXRpZnkodi5maW5kQWxpVXJsLnRvU3RyaW5nKCkucmVwbGFjZSgvZnVuY3Rpb24uKj9cXFxcKGlucHV0XFxcXCkuKj9cXFxcey8sIFxcXCJcXFwiKS5yZXBsYWNlKC8oXFxcXH1bXFxcXHNcXFxcU10uKj8pJC8sIFxcXCJcXFwiKSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdjtcXG4gICAgfSk7XFxuICAgIHNhdmVKc29uKHJ1bGVzKTtcXG4gICAgdG9hc3QoXFxcIuW3suWIneWni+WMllxcXCIpO1xcbn1cXG4kLmV4cG9ydHMgPSB7XFxuICAgIGdldEpzb24sXFxuICAgIHNhdmVKc29uLFxcbiAgICBnZXRVc2VmdWxKc29uLFxcbiAgICBnZXRGb3JiaWRkZW5Kc29uLFxcbiAgICBwYXRoLFxcbiAgICBnZXRHcm91cE5hbWVzLFxcbiAgICBnZXRHcm91cEpzb25cXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ566h55CGXCIsXCJwYXRoXCI6XCJydWxlTWFuYWdlXCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi6KeE5YiZ566h55CGXFxcIik7XFxubGV0IGNvbmZpZ3MgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKTtcXG5sZXQgYXJyID0gY29uZmlncy5nZXRKc29uKCk7XFxubGV0IGxlbmd0aCA9IGFyci5sZW5ndGg7XFxubGV0IGdyb3VwcyA9IGNvbmZpZ3MuZ2V0R3JvdXBOYW1lcygpO1xcbmxldCBncm91cCA9IGdldEl0ZW0oXFxcInJ1bGVNYW5hZ2VfZ3JvdXBcXFwiLCBcXFwiXFxcIik7XFxuaWYgKCFncm91cHMuaW5jbHVkZXMoZ3JvdXApKSB7XFxuICAgIGNsZWFySXRlbShcXFwicnVsZU1hbmFnZV9ncm91cFxcXCIpO1xcbiAgICBncm91cCA9IFxcXCJcXFwiO1xcbn1cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaWsOWinlxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9ydWxlRWRpdCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoI1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fZG9tYWluX2NvbmZpZ1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBwYWdlVGl0bGU6IFxcXCLmlrDlop7op4TliJlcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIhuS6q1xcXCIsXFxuICAgIHVybDogJChcXFwiLTFcXFwiLCBcXFwi6L6T5YWl5L2g6KaB5YiG5Lqr6KeE5YiZ55qE5bqP5Y+3XFxcXG4tMeWFqOmDqO+8jC0y5bey5ZCv55So55qE77yMLTPlt7LnpoHnlKjnmoTvvIwtNCznu4TlkI3liIbkuqvnu4TvvIzlpJrkuKrnlKgn77yMJ+malOW8gFxcXCIpLmlucHV0KChsZW5ndGgpID0+IHtcXG4gICAgICAgIGxldCBpbmRleGMgPSBpbnB1dC5zcGxpdCgvLHzvvIwvKTtcXG4gICAgICAgIGxldCBpbmRleHMgPSBbXTtcXG4gICAgICAgIGxldCBtbyA9IHBhcnNlSW50KGluZGV4Y1swXSk7XFxuICAgICAgICBpZiAoIShpbmRleGMubGVuZ3RoICE9PSAwICYmIG1vIDwgMCAmJiBtbyA+IC01KSkge1xcbiAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGluZGV4Yykge1xcbiAgICAgICAgICAgICAgICBsZXQgbnVtID0gcGFyc2VJbnQoaXQpO1xcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG51bSkgfHwgbnVtID49IGxlbmd0aCB8fCBudW0gPCAwKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pWw5a2X5LiN5ZCI5rOVXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpbmRleHMucHVzaChudW0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiAkKFtcXFwiSElLRVJcXFwiLCBcXFwiVFhUXFxcIl0uY29uY2F0KGdldFBhc3RlcygpKSwgMiwgXFxcIuWIhuS6q+aWueW8j1xcXCIpLnNlbGVjdCgobW8sIGluZGV4cywgZXh0KSA9PiB7XFxuICAgICAgICAgICAgZnVuY3Rpb24gdXAocnVsZXMpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGViNjQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkocnVsZXMpKTtcXG4gICAgICAgICAgICAgICAgbGV0IGdldFBhc3MgPSAobGVuZ3RoLCBydWxlLCB0eXBlKSA9PiBcXFwi5rW36ZiU6KeG55WM5LqR566A5pCc57Si5byV5pOO77yM5YWx44CMXFxcIiArIGxlbmd0aCArIFxcXCLjgI3mnaHvvIzlpI3liLbmlbTmnaHlj6Pku6TmiZPlvIDova/ku7blsLHkvJroh6rliqjlr7zlhaUkXFxcIiArIHJ1bGUgKyBcXFwiJFxcXCIgKyB0eXBlICsgXFxcIkBpbXBvcnQ9anM6JC5yZXF1aXJlKCdpbXBvcnQ/cnVsZT0nK1xcXCIgKyBKU09OLnN0cmluZ2lmeShNWV9SVUxFLnRpdGxlKSArIFxcXCIpKGlucHV0KVxcXCI7XFxuICAgICAgICAgICAgICAgIGlmIChnZXRQYXN0ZXMoKS5pbmNsdWRlcyhpbnB1dCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gc2hhcmVQYXN0ZShydWxlYjY0LCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlcy5sZW5ndGgsIHUsIFxcXCJiXFxcIik7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvc2hhcmUv5LqR566A5pCc57Si5byV5pOO6KeE5YiZ44CMXFxcIiArIHJ1bGVzLmxlbmd0aCArIFxcXCLjgI3mnaEuXFxcIiArIChpbnB1dCA9PT0gXFxcIkhJS0VSXFxcIiA/IFxcXCJoaWtlclxcXCIgOiBcXFwidHh0XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUocGF0aCwgZ2V0UGFzcyhydWxlcy5sZW5ndGgsIHJ1bGViNjQsIFxcXCJhXFxcIikpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJzaGFyZTovL1xcXCIgKyBwYXRoO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBydWxlcztcXG4gICAgICAgICAgICBpZiAobW8gPT09IC0xKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW8gPT09IC0yKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0VXNlZnVsSnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW8gPT09IC0zKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0Rm9yYmlkZGVuSnNvbigpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW8gPT09IC00KSB7XFxuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGV4dDtcXG4gICAgICAgICAgICAgICAgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRHcm91cEpzb24oZXh0KTtcXG4gICAgICAgICAgICAgICAgaWYgKCFydWxlcy5sZW5ndGgpIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3lrZjlnKjor6Xnu4RcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpLmZpbHRlcigodiwgaSkgPT4gaW5kZXhzLmluY2x1ZGVzKGkpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcnVsZXMgPSBydWxlcy5tYXAoKHYpID0+IHtcXG4gICAgICAgICAgICAgICAgdi51c2VyID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICB2LmZvcmJpZGRlbiA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHVwKHJ1bGVzKTtcXG4gICAgICAgIH0sIG1vLCBpbmRleHMsIGluZGV4Y1sxXSk7XFxuXFxuICAgIH0sIGxlbmd0aCksXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fc2hhcmVfZ3JlZW5cXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLph43nva5cXFwiLFxcbiAgICB1cmw6ICQoXFxcIuS9oOehruWumumHjee9ru+8n1xcXFxu6K+l5pON5L2c5Lya5Yig6Zmk546w5pyJ6KeE5YiZ77yM5oGi5aSN6Ieq5bim6KeE5YiZ44CCXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcbiAgICAgICAgZGVsZXRlRmlsZShwYXRoKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnBhdGgpLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3JlZnJlc2hcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmuIXnqbpcXFwiLFxcbiAgICB1cmw6ICQoXFxcIuS9oOehruWumuWFqOmDqOWIoOmZpO+8n1xcXFxu6K+l5pON5L2c5Lya5Yig6Zmk546w5pyJ6KeE5YiZ44CCXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcbiAgICAgICAgd3JpdGVGaWxlKHBhdGgsIFxcXCJbXVxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikucGF0aCksXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fY29kZV92aWV3XFxcIlxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIC8vdGl0bGU6ICc8Zm9udCBjb2xvcj1cXFwiIzEzQjYxQlxcXCI+4paQIDwvZm9udD48Yj7op4TliJnliJfooag8Yj4gKCcgKyBTdHJpbmcobGVuZ3RoKS5mb250Y29sb3IoXFxcIiNmZjY2MDFcXFwiKSArIFxcXCIpXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbn0pO1xcbmxldCBjb3VudFRpdGxlID0gZC5hdCgtMSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IGdyb3VwID8gXFxcIuWFqOmDqFxcXCIgOiBcXFwi4oCc4oCc5YWo6YOo4oCd4oCdXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChncm91cCwgbGVuZ3RoKSA9PiB7XFxuICAgICAgICBpZiAoZ3JvdXApIHtcXG4gICAgICAgICAgICBjbGVhckl0ZW0oXFxcInJ1bGVNYW5hZ2VfZ3JvdXBcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIsIFxcXCLmibnph4/liKDpmaRcXFxcbuagvOW8jzrlvIDlp4vkvY3nva7vvIznu5PmnZ/kvY3nva4o5Yy66Ze0WzAsXFxcIiArIChsZW5ndGggLSAxKSArIFxcXCJdKVxcXCIpLmlucHV0KChsZW5ndGgpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IGlucHV0LnNwbGl0KC8sfO+8jC8pO1xcbiAgICAgICAgICAgICAgICBzdGFydCA9IHBhcnNlSW50KHN0YXJ0KSwgZW5kID0gcGFyc2VJbnQoZW5kKTtcXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihzdGFydCkgfHwgTnVtYmVyLmlzTmFOKGVuZCkgfHwgc3RhcnQgPCAwIHx8IGVuZCA+IGxlbmd0aCAtIDEgfHwgc3RhcnQgPiBlbmQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mlbDlrZfkuI3lkIjms5VcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCBudW1iZXIgPSBlbmQgLSBzdGFydCArIDE7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLnoa7orqTliKDpmaTvvJpbXFxcIiArIHN0YXJ0ICsgXFxcIixcXFwiICsgZW5kICsgXFxcIl1cXFxcbuWFsVxcXCIgKyBudW1iZXIgKyBcXFwi5p2h5pCc57Si5byV5pOOXFxcIikuY29uZmlybSgoc3RhcnQsIG51bWJlcikgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKHN0YXJ0LCBudW1iZXIpO1xcbiAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24ocnVsZXMpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICB9LCBzdGFydCwgbnVtYmVyKTtcXG4gICAgICAgICAgICB9LCBsZW5ndGgpO1xcbiAgICAgICAgfVxcbiAgICB9LCBncm91cCwgbGVuZ3RoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbn0pO1xcbmZvciAobGV0IGl0IG9mIGdyb3Vwcykge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGl0ID09PSBncm91cCA/IFxcXCLigJzigJxcXFwiICsgaXQgKyBcXFwi4oCd4oCdXFxcIiA6IGl0LFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpdCwgZ3JvdXApID0+IHtcXG4gICAgICAgICAgICBpZiAoZ3JvdXAgIT09IGl0KSB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJ1bGVNYW5hZ2VfZ3JvdXBcXFwiLCBpdCk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLnva7pobZcXFwiLCBcXFwi572u5bqVXFxcIiwgXFxcIuaUueWQjVxcXCIsIFxcXCLliKDpmaRcXFwiXSkuc2VsZWN0KChpdCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxcXCLmlLnlkI1cXFwiID09PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKGl0LCBcXFwi6K+36L6T5YWl5paw5ZCN56ewXFxcIikuaW5wdXQoKGl0KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMuZm9yRWFjaCh2ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdCA9PT0gdi5ncm91cCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuZ3JvdXAgPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJydWxlTWFuYWdlX2dyb3VwXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBpdCk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxcXCLliKDpmaRcXFwiID09PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLmmK/lkKbliKDpmaTor6Xnu4TmkJzntKLlvJXmk47vvJpcXFwiICsgaXQpLmNvbmZpcm0oKGl0KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMgPSBydWxlcy5maWx0ZXIodiA9PiB2Lmdyb3VwICE9PSBpdCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJydWxlTWFuYWdlX2dyb3VwXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBpdCk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGdSdWxlcyA9IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR4UnVsZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzLmZvckVhY2goKHYpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgPT09IHYuZ3JvdXApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGdSdWxlcy5wdXNoKHYpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4UnVsZXMucHVzaCh2KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIue9rumhtlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0Z1J1bGVzID0gdGdSdWxlcy5jb25jYXQodHhSdWxlcyk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRnUnVsZXMgPSB0eFJ1bGVzLmNvbmNhdCh0Z1J1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHRnUnVsZXMpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICB9LCBpdCk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgfSwgaXQsIGdyb3VwKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgfSk7XFxufVxcblxcbmxldCBjb3VudCA9IGQubGVuZ3RoO1xcblxcbmZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcXG4gICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAgIT09IGl0Lmdyb3VwKSBjb250aW51ZTtcXG4gICAgbGV0IHVzZXIgPSBpdC51c2VyIHx8IHt9O1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ1bJyArIGkgKyAnXTxiPiAgJyArIGl0Lm5hbWUgKyAoaXQuZ3JvdXAgPyBcXFwifFxcXCIgKyBpdC5ncm91cC5zbWFsbCgpIDogXFxcIlxcXCIpICsgJzxiPicgKyAoaXQuZm9yYmlkZGVuID8gXFxcIiAj4oCc4oCc56aB55So4oCd4oCdXFxcIi5zbWFsbCgpIDogXFxcIlxcXCIpICsgKGl0LnJlZ2lzdGVyVXJsICYmICEodXNlci5wYXNzd29yZCB8fCB1c2VyLmFjY291bnQgfHwgdXNlci5leHRyYSkgPyBcXFwiICPpnIDopoHnmbvlvZVcXFwiLnNtYWxsKCkgOiBcXFwiXFxcIiksXFxuICAgICAgICB1cmw6ICQoW1xcXCLnvJbovpFcXFwiLCBcXFwi6LSm5Y+3XFxcIiwgXFxcIuWIhuS6q1xcXCIsIFxcXCLnpoHnlKgv5ZCv55SoXFxcIiwgXFxcIuenu+WKqFxcXCIsIFxcXCLnva7pobZcXFwiXSwgMSwgXFxcIuaTjeS9nO+8mlxcXCIgKyBpdC5uYW1lKS5zZWxlY3QoKGluZGV4LCBsZW5ndGgsIGdyb3VwKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi57yW6L6RXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9ydWxlRWRpdCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoI1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIui0puWPt1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcGFzc3dvcmQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCNcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLliIbkuqtcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCBvcHMgPSBnZXRQYXN0ZXMoKTtcXG4gICAgICAgICAgICAgICAgb3BzLnVuc2hpZnQoXFxcIuWujOaVtOWPo+S7pFxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChvcHMsIDIsIFxcXCLliIbkuqvmlrnlvI9cXFwiKS5zZWxlY3QoKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKVtpbmRleF07XFxuICAgICAgICAgICAgICAgICAgICBydWxlLnVzZXIgPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgICAgICAgICBydWxlLmZvcmJpZGRlbiA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlYjY0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHJ1bGUpKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBnZXRQYXNzID0gKG5hbWUsIHJ1bGUsIHR5cGUpID0+IFxcXCLmtbfpmJTop4bnlYzvvIzjgIxcXFwiICsgbmFtZSArIFxcXCLjgI3kupHnroDmkJzntKLlvJXmk47vvIzlpI3liLbmlbTmnaHlj6Pku6TmiZPlvIDova/ku7blsLHkvJroh6rliqjlr7zlhaUkXFxcIiArIHJ1bGUgKyBcXFwiJFxcXCIgKyB0eXBlICsgXFxcIkBpbXBvcnQ9anM6JC5yZXF1aXJlKCdpbXBvcnQ/cnVsZT0nK1xcXCIgKyBKU09OLnN0cmluZ2lmeShNWV9SVUxFLnRpdGxlKSArIFxcXCIpKGlucHV0KVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gXFxcIuWujOaVtOWPo+S7pFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlLm5hbWUsIHJ1bGViNjQsIFxcXCJhXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1ID0gc2hhcmVQYXN0ZShydWxlYjY0LCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGdldFBhc3MocnVsZS5uYW1lLCB1LCBcXFwiYlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LCBpbmRleCk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuenu+WKqFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoaW5kZXggKyBcXFwiXFxcIiwgXFxcIui+k+WFpeS9jee9rlxcXCIpLmlucHV0KChpbmRleCwgbGVuZ3RoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SW5kZXggPSBOdW1iZXIoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihuZXdJbmRleCkgfHwgbmV3SW5kZXggPj0gbGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4jeWSjOinhOeahOS9jee9rlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzLnNwbGljZShpbmRleCwgMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICBydWxlcy5zcGxpY2UobmV3SW5kZXgsIDAsIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24ocnVsZXMpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICB9LCBpbmRleCwgbGVuZ3RoKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi572u6aG2XFxcIikge1xcbiAgICAgICAgICAgICAgICBsZXQgbmV3SW5kZXggPSAwO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGlmIChncm91cCkge1xcbiAgICAgICAgICAgICAgICAgICAgbmV3SW5kZXggPSBydWxlcy5maW5kSW5kZXgodiA9PiB2Lmdyb3VwID09PSBncm91cCk7XFxuICAgICAgICAgICAgICAgICAgICBuZXdJbmRleCA9IG5ld0luZGV4ID09PSAtMSA/IDAgOiBuZXdJbmRleDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzLnNwbGljZShpbmRleCwgMSlbMF07XFxuICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShuZXdJbmRleCwgMCwgcnVsZSk7XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlID0gYXJyW2luZGV4XTtcXG4gICAgICAgICAgICAgICAgcnVsZS5mb3JiaWRkZW4gPSAhcnVsZS5mb3JiaWRkZW47XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKGFycik7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIChydWxlLmZvcmJpZGRlbiA/IFxcXCLnpoHnlKhcXFwiIDogXFxcIuWQr+eUqFxcXCIpICsgcnVsZS5uYW1lO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGksIGxlbmd0aCwgZ3JvdXApLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpOiBpLFxcbiAgICAgICAgICAgIHBhZ2VUaXRsZTogaXQubmFtZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuY291bnRUaXRsZS50aXRsZSA9ICc8Zm9udCBjb2xvcj1cXFwiIzEzQjYxQlxcXCI+4paQIDwvZm9udD48Yj7op4TliJnliJfooag8Yj4gKCcgKyAoKGQubGVuZ3RoIC0gY291bnQpICsgXFxcIi9cXFwiICsgbGVuZ3RoKS5mb250Y29sb3IoXFxcIiNmZjY2MDFcXFwiKSArIFxcXCIpXFxcIjtcXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnnvJbovpFcIixcInBhdGhcIjpcInJ1bGVFZGl0XCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX25hbWVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfZmluZFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19maW5kQWxpVXJsXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX3BhZ2VcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfcmVnaXN0ZXJVcmxcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfYmFzaWNVcmxcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfZ3JvdXBcXFwiKTtcXG59KSk7XFxubGV0IHVybEluZGV4ID0gcGFyc2VJbnQoZ2V0UGFyYW0oXFxcImluZGV4XFxcIiwgXFxcIlxcXCIpKTtcXG51cmxJbmRleCA9IE51bWJlci5pc05hTih1cmxJbmRleCkgPyB2b2lkKDApIDogdXJsSW5kZXg7XFxubGV0IGluZGV4ID0gdm9pZCgwKSA9PT0gdXJsSW5kZXggPyBNWV9QQVJBTVMuaSA6IHVybEluZGV4O1xcbmxldCBpc0ltcG9ydD0hIWdldFBhcmFtKFxcXCJpc0ltcG9ydFxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbmxldCBvYmo7XFxuaWYgKGlzSW1wb3J0KSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBvYmogPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL3l1blNpbXBsZUltcG9ydC5qc29uXFxcIik7XFxuICAgICAgICBsZXQgdGlwID0gaW5kZXggIT09IHZvaWQoMCkgPyBcXFwi5pu05paw6KeE5YiZXFxcIiA6IFxcXCLlr7zlhaXop4TliJlcXFwiO1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKHRpcCArIFxcXCI6XFxcIiArIG9iai5uYW1lKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJjigJhcXFwiICsgdGlwICsgXFxcIuKAmeKAmVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgb2JqID0ge307XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl6ZSZ6K+vXFxcIik7XFxuICAgIH1cXG59IGVsc2UgaWYgKGluZGV4ICE9PSB2b2lkKDApKSB7XFxuICAgIG9iaiA9IGFycltpbmRleF07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi57yW6L6R6KeE5YiZOlxcXCIgKyBvYmoubmFtZSk7XFxuICAgIGlmIChvYmoubGFzdE1vZGlmeSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuS4iuasoeS/ruaUue+8mlxcXCIgKyAkLmRhdGVGb3JtYXQob2JqLmxhc3RNb2RpZnksIFxcXCJ5eXl5LU1NLWRkwqBISDptbTpzc1xcXCIpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59IGVsc2Uge1xcbiAgICBvYmogPSB7XFxuICAgICAgICBwYWdlOiB0cnVlXFxuICAgIH07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi5paw5bu66KeE5YiZXFxcIik7XFxufVxcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5ZCN5a2XKOW/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19uYW1lXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5uYW1lLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIumAieaLqVxcXCIsICAgIFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuWIhue7hCjpgInloaspXFxcIixcXG4gICAgdXJsOiQudG9TdHJpbmcoKCk9PntcXG4gICAgICAgIGxldCBncm91cCA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEdyb3VwTmFtZXMoKTtcXG4gICAgICAgIGlmKCFncm91cC5sZW5ndGgpe1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiAkKGdyb3VwKS5zZWxlY3QoKCk9PntcXG4gICAgICAgICAgICBsZXQgZXh0cmE9ZmluZEl0ZW0oXFxcInJ1bGVFZGl0R3JvdXBcXFwiKS5leHRyYTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKFxcXCJydWxlRWRpdEdyb3VwXFxcIix7XFxuICAgICAgICAgICAgICAgIGV4dHJhOk9iamVjdC5hc3NpZ24oZXh0cmEsIHtcXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogaW5wdXRcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0pO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfZ3JvdXBcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGlkOiBcXFwicnVsZUVkaXRHcm91cFxcXCIsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5ncm91cCxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5pCc57Si6KeE5YiZKOW/heWhqylcXFxcbuWGhee9ruWPmOmHj++8mnPmkJzntKLlhbPplK7or43vvIxwYWdl6aG15pWw77yMYmFzaWNVcmzln7rmnKzpk77mjqXvvIx1c2Vy55So5oi36LSm5Y+35L+h5oGvKHVzZXIuYWNjb3VudCx1c2VyLnBhc3N3b3JkKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OiAzLFxcbiAgICAgICAgaGlnaGxpZ2h0OiB0cnVlLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19maW5kXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5maW5kLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwiVVJM6KeE5YiZKOmAieWhqylcXFxcbuWGhee9ruWPmOmHj++8mmlucHV06ZO+5o6l77yMYmFzaWNVcmzln7rmnKzpk77mjqVcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogMyxcXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfZmluZEFsaVVybFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmouZmluZEFsaVVybCxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuWfuuacrOmTvuaOpSjpgInloaspIOS7o+eggeS4reeUqGJhc2ljVXJs5byV55SoXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfYmFzaWNVcmxcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmJhc2ljVXJsLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5rOo5YaM5Zyw5Z2AKOmAieWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19yZWdpc3RlclVybFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmoucmVnaXN0ZXJVcmwsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmmK/lkKblj6/ku6Xnv7vpobXvvJpcXFwiICsgb2JqLnBhZ2UsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYWdlKSA9PiB7XFxuICAgICAgICBsZXQgaXNQYWdlID0gISFnZXRNeVZhcihcXFwicHNfcGFnZVxcXCIsIHBhZ2UgPyBcXFwiMVxcXCIgOiBcXFwiXFxcIik7XFxuICAgICAgICBwdXRNeVZhcihcXFwicHNfcGFnZVxcXCIsIGlzUGFnZSA/IFxcXCJcXFwiIDogXFxcIjFcXFwiKTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcInJ1bGVlZHBzX3BhZ2VcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmmK/lkKblj6/ku6Xnv7vpobXvvJpcXFwiICsgIWlzUGFnZVxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBvYmoucGFnZSksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogXFxcInJ1bGVlZHBzX3BhZ2VcXFwiXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5kZXgsIHVybEluZGV4KSA9PiB7XFxuICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5q2k6aG55peg5rOV5Yig6ZmkXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh1cmxJbmRleCAhPT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjmm7TmlrDop4TliJnvvIzliKDpmaTor7fku47op4TliJnnrqHnkIbov5vlhaVcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmuKnppqjmj5DnpLpcXFwiLFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLnoa7lrpropoHliKDpmaTmraTop4TliJnlkJfvvJ/ms6jmhI/liKDpmaTlkI7ml6Dms5XmgaLlpI1cXFwiLFxcbiAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9LCBpbmRleClcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBpbmRleCwgdXJsSW5kZXgpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmtYvor5VcXFwiLFxcbiAgICB1cmw6ICQoXFxcIlxcXCIsXFxcIuivt+i+k+WFpeWFs+mUruivjVxcXCIpLmlucHV0KChwYWdlKSA9PiB7XFxuICAgICAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJwc19uYW1lXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgbGV0IGZpbmQgPSBnZXRNeVZhcihcXFwicHNfZmluZFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICghZmluZCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mkJzntKLop4TliJnkuI3og73kuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgIGxldCB0ZXN0UnVsZSA9IHtcXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxcbiAgICAgICAgICAgIGZpbmQ6IGZpbmQsXFxuICAgICAgICAgICAgYmFzaWNVcmw6IGdldE15VmFyKFxcXCJwc19iYXNpY1VybFxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBmaW5kQWxpVXJsOiBnZXRNeVZhcihcXFwicHNfZmluZEFsaVVybFxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBwYWdlOiAhIWdldE15VmFyKFxcXCJwc19wYWdlXFxcIiwgcGFnZSA/IFxcXCIxXFxcIiA6IFxcXCJcXFwiKSxcXG4gICAgICAgIH07XFxuICAgICAgICByZXR1cm4gJChcXFwiaGlrZXI6Ly9lbXB0eSNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/ZnlwYWdlXFxcIikucnVsZSgodGVzdFJ1bGUsIGtleSk9PntcXG4gICAgICAgICAgICBpZihNWV9QQUdFPjEmJiF0ZXN0UnVsZS5wYWdlKSBzZXRSZXN1bHQoW10pO1xcbiAgICAgICAgICAgIHNldFJlc3VsdCgkLnJlcXVpcmUoXFxcImRhdGFcXFwiKS5jYXJyeVJ1bGUodGVzdFJ1bGUsIGtleSwgTVlfUEFHRSwgMCkpO1xcbiAgICAgICAgfSwgdGVzdFJ1bGUsIGlucHV0KTtcXG4gICAgfSwgb2JqLnBhZ2UpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGluZGV4LCBwYWdlLCBpc0ltcG9ydCkgPT4ge1xcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRNeVZhcihcXFwicHNfbmFtZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICghbmFtZSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lkI3lrZflvpfmnInkuIDkuKrlkKdcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGZpbmQgPSBnZXRNeVZhcihcXFwicHNfZmluZFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICghZmluZCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mkJzntKLop4TliJnkuI3og73kuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgIGxldCBvYmoxID0ge1xcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXFxuICAgICAgICAgICAgZmluZDogZmluZCxcXG4gICAgICAgICAgICBiYXNpY1VybDogZ2V0TXlWYXIoXFxcInBzX2Jhc2ljVXJsXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIGZpbmRBbGlVcmw6IGdldE15VmFyKFxcXCJwc19maW5kQWxpVXJsXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIHBhZ2U6ICEhZ2V0TXlWYXIoXFxcInBzX3BhZ2VcXFwiLCBwYWdlID8gXFxcIjFcXFwiIDogXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIHJlZ2lzdGVyVXJsOiBnZXRNeVZhcihcXFwicHNfcmVnaXN0ZXJVcmxcXFwiLCBcXFwiXFxcIikgfHwgdW5kZWZpbmVkLFxcbiAgICAgICAgICAgIGxhc3RNb2RpZnk6IERhdGUubm93KCksXFxuICAgICAgICAgICAgZ3JvdXA6IGdldE15VmFyKFxcXCJwc19ncm91cFxcXCIsIFxcXCJcXFwiKVxcbiAgICAgICAgfTtcXG4gICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgIGlmIChhcnIuc29tZSh2ID0+IHYubmFtZSA9PT0gbmFtZSkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+WtmOWcqOivpeinhOWImVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmKGlzSW1wb3J0KXtcXG4gICAgICAgICAgICAgICAgYXJyLnB1c2gob2JqMSk7XFxuICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgIGFyci51bnNoaWZ0KG9iajEpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IG5hbWV5ID0gYXJyW2luZGV4XS5uYW1lO1xcbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBuYW1leSkge1xcbiAgICAgICAgICAgICAgICBpZiAoYXJyLnNvbWUodiA9PiB2Lm5hbWUgPT09IG5hbWUpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5a2Y5Zyo6K+l6KeE5YiZXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBvYmoxID0gT2JqZWN0LmFzc2lnbihhcnJbaW5kZXhdLCBvYmoxKTtcXG4gICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxLCBvYmoxKTtcXG4gICAgICAgIH1cXG4gICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKGFycik7XFxuICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/neWtmOaIkOWKn1xcXCI7XFxuICAgIH0sIGluZGV4LCBvYmoucGFnZSwgaXNJbXBvcnQpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuXFxuc2V0UmVzdWx0KGQpO1xcblwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ6LSm5Y+3XCIsXCJwYXRoXCI6XCJwYXNzd29yZFwiLFwicnVsZVwiOlwianM6XFxuKGZ1bmN0aW9uKCkge1xcbiAgICB2YXIgZCA9IFtdO1xcbiAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwicHNfYWNjb3VudFxcXCIpO1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwicHNfcGFzc3dvcmRcXFwiKTtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcInBzX2V4dHJhXFxcIik7XFxuICAgIH0pKTtcXG4gICAgbGV0IGluZGV4ID0gTVlfUEFSQU1TLmk7XFxuICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgIGxldCBvYmogPSBhcnJbaW5kZXhdIHx8IHt9O1xcbiAgICBzZXRQYWdlVGl0bGUoXFxcIuiuvue9rui0puWPtzpcXFwiICsgb2JqLm5hbWUpO1xcbiAgICBsZXQgcmVnaXN0ZXJVcmwgPSBvYmoucmVnaXN0ZXJVcmw7XFxuICAgIGlmIChyZWdpc3RlclVybCkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5YmN5b6A5rOo5YaMXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoXFxcImhpa2VyOi8vZW1wdHkjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIikucnVsZSgocmVnaXN0ZXJVcmwpPT57XFxuICAgICAgICAgICAgICAgIHNldFJlc3VsdChbe1xcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6XFxcIng1X3dlYnZpZXdfc2luZ2xlXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIHVybDpyZWdpc3RlclVybCxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6XFxcImZsb2F0JiYxMDAlXFxcIlxcbiAgICAgICAgICAgICAgICB9XSk7XFxuICAgICAgICAgICAgfSwgcmVnaXN0ZXJVcmwpLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBcXFwi5rOo5YaM6LSm5Y+3OlxcXCIgKyBvYmoubmFtZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIG9iaiA9IG9iai51c2VyIHx8IHt9O1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi55So5oi35ZCNXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfYWNjb3VudFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5hY2NvdW50LFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgIGRlc2M6IFxcXCLlr4bnoIFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0eXBlOiBcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX3Bhc3N3b3JkXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLnBhc3N3b3JkLFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi6aKd5aSWXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19leHRyYVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5leHRyYSxcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIGhlaWdodDogLTFcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgbGV0IGFjY291bnQgPSBnZXRNeVZhcihcXFwicHNfYWNjb3VudFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgcGFzc3dvcmQgPSBnZXRNeVZhcihcXFwicHNfcGFzc3dvcmRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgbGV0IGV4dHJhID0gZ2V0TXlWYXIoXFxcInBzX2V4dHJhXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIC8qaWYgKCEoYWNjb3VudHx8cGFzc3dvcmR8fGV4dHJhKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN6IO95YWo6YOo5Li656m6XFxcIjtcXG4gICAgICAgICAgICB9Ki9cXG4gICAgICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgIGxldCBpdGVtID0gYXJyW2luZGV4XTtcXG4gICAgICAgICAgICBpdGVtLnVzZXIgPSB7fTtcXG4gICAgICAgICAgICBpdGVtLnVzZXIuYWNjb3VudCA9IGFjY291bnRcXG4gICAgICAgICAgICBpdGVtLnVzZXIucGFzc3dvcmQgPSBwYXNzd29yZDtcXG4gICAgICAgICAgICBpdGVtLnVzZXIuZXh0cmEgPSBleHRyYTtcXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL2lk6ZSZ6K+vXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxLCBpdGVtKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv53lrZjmiJDlip9cXFwiO1xcbiAgICAgICAgfSwgaW5kZXgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgfSk7XFxuICAgIHNldFJlc3VsdChkKTtcXG59KSgpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnlr7zlhaVcIixcInBhdGhcIjpcImltcG9ydFwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gc2F2ZUNhY2hlKGpzb24pIHtcXG4gICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS95dW5TaW1wbGVJbXBvcnQuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG59XFxuJC5leHBvcnRzID0gZnVuY3Rpb24ocGFzcykge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IFtfLCBydWxlLCB0eXBlXSA9IHBhc3Muc3BsaXQoXFxcIiRcXFwiKTtcXG4gICAgICAgIGlmICh0eXBlID09PSBcXFwiYlxcXCIpIHtcXG4gICAgICAgICAgICBydWxlID0gcGFyc2VQYXN0ZShydWxlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKHJ1bGUpKTtcXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpIHtcXG4gICAgICAgICAgICBydWxlcyA9IFtydWxlc107XFxuICAgICAgICB9XFxuICAgICAgICAvL3J1bGVzLnJldmVyc2UoKTtcXG4gICAgICAgIE1ZX1VSTCA9IG1vZHVsZS5pZDtcXG4gICAgICAgIGxldCBydWxlVGl0bGUgPSBnZXRQYXJhbShcXFwicnVsZVxcXCIpO1xcbiAgICAgICAgbG9nKHJ1bGVUaXRsZSlcXG4gICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3M/cnVsZT1cXFwiICsgcnVsZVRpdGxlKS5nZXRKc29uKCk7XFxuICAgICAgICBsZXQgbmV3SSA9IDA7XFxuICAgICAgICBmb3IgKGxldCBydWxlIG9mIHJ1bGVzKSB7XFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gYXJyLmZpbmRJbmRleCh2ID0+IHYubmFtZSA9PT0gcnVsZS5uYW1lKTtcXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xcbiAgICAgICAgICAgICAgICBydWxlID0gT2JqZWN0LmFzc2lnbihhcnJbaW5kZXhdLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgIGlmIChydWxlcy5sZW5ndGggPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVDYWNoZShydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9pc0ltcG9ydD10cnVlJmluZGV4PVxcXCIgKyBpbmRleCArIFxcXCImcnVsZT1cXFwiICsgcnVsZVRpdGxlO1xcbiAgICAgICAgICAgICAgICAgICAgLy90b2FzdChcXFwi5bey5pu05paw6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2coXFxcIuW3suabtOaWsOinhOWIme+8mlxcXCIgKyBydWxlLm5hbWUpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBuZXdJKys7XFxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBpZiAocnVsZXMubGVuZ3RoID09PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBzYXZlQ2FjaGUocnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9ydWxlRWRpdCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/aXNJbXBvcnQ9dHJ1ZSZydWxlPVxcXCIgKyBydWxlVGl0bGU7XFxuICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KFxcXCLlt7Llr7zlhaXop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi5bey5a+85YWl6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChydWxlcy5sZW5ndGggPiAxKSB7XFxuICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzP3J1bGU9XFxcIiArIHJ1bGVUaXRsZSkuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICB0b2FzdChcXFwi5paw5aKe77yaXFxcIiArIG5ld0kgKyBcXFwiIOimhuebluabtOaWsO+8mlxcXCIgKyAocnVsZXMubGVuZ3RoIC0gbmV3SSkpO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIHRvYXN0KFxcXCLlr7zlhaXlpLHotKVcXFwiKTtcXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeWIl+ihqFwiLFwicGF0aFwiOlwicnVsZXNcIixcInJ1bGVcIjpcImpzOlxcbiQuZXhwb3J0cyA9IFt7XFxuICAgICAgICBuYW1lOiBcXFwi5bCP5LqRXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgYmFzaWNVcmwgPSBcXFwiaHR0cHM6Ly93d3cueXVuc28ubmV0XFxcIjtcXG4gICAgICAgICAgICBsZXQgYXBpID0gXFxcIi9hcGkvdmFsaWRhdGUvc2VhcmNoP3dkPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocykgKyBcXFwiJm1vZGU9OTAwMDEmc3R5cGU9MjAxMDAmdWs9JnBhZ2U9XFxcIiArIHBhZ2UgKyBcXFwiJmxpbWl0PTIwJnNjcmVlbl9maWxldHlwZT11bmRlZmluZWRcXFwiO1xcbiAgICAgICAgICAgIGxldCBqc29uID0gcG9zdChiYXNpY1VybCArIGFwaSwge1xcbiAgICAgICAgICAgICAgICBib2R5OiBcXFwiZGF0YT1cXFwiICsgYXBpLFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBSZWZlcmVyOiBcXFwiaHR0cHM6Ly93d3cueXVuc28ubmV0L2luZGV4L3VzZXIvcz93ZD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHMpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IEpTT04ucGFyc2UoanNvbikuZGF0YTtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IHBkZmEoaHRtbCwgXFxcImJvZHkmJi5sYXl1aS1jYXJkOmhhcyhhKVxcXCIpO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBsaXN0KSB7XFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHBkZmgoaXRlbSwgXFxcImEmJlRleHRcXFwiKS5yZXBsYWNlKFxcXCIj5paH5Lu25aS5IFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgLy9sZXQgdGltZSA9IC9cXFxcZHs0fSgtXFxcXGR7Mn0pezJ9IFxcXFxkezJ9KFxcXFw6XFxcXGR7Mn0pezJ9Ly5leGVjKHBkZmgoaXRlbSwgXFxcIi5sYXl1aS1jYXJkLWJvZHkmJlRleHRcXFwiKSkgfHwgW107XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAvL2Rlc2M6IHRpbWVbMF0sXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGJhc2U2NERlY29kZShwZGZoKGl0ZW0sIFxcXCJhJiZ1cmxcXFwiKSlcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LCB7XFxuICAgICAgICBuYW1lOiBcXFwi5re35ZCI55uYXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcImh0dHBzOi8vYXBpLmh1bmhlcGFuLmNvbS92MS9zZWFyY2hcXFwiO1xcbiAgICAgICAgICAgIGxldCBqc29uID0gcG9zdCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgUmVmZXJlcjogXFxcImh0dHBzOi8vaHVuaGVwYW4uY29tL1xcXCJcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInFcXFwiOiBzLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhZ2VcXFwiOiBwYWdlLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInNpemVcXFwiOiAxNVxcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0ganNvbi5kYXRhLmxpc3Q7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gbGlzdFtpXTtcXG4gICAgICAgICAgICAgICAgaWYgKGl0LmRpc2tfdHlwZSAhPT0gXFxcIkFMWVxcXCIgfHwgaXQuc2hhcmVfdXNlciA9PT0gXFxcIuS4tioqKuS4tlxcXCIpIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0LmRpc2tfbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIHBpY191cmw6IHBkKGl0LCBcXFwiaW1nJiZzcmNcXFwiLCB1cmwpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBpdC5saW5rLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogaXQudXBkYXRlX3RpbWUgKyBcXFwiXFxcXG5cXFwiICsgaXQubGluayxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LCB7XFxuICAgICAgICBuYW1lOiBcXFwi6LWE5rqQ5biuXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBmdW5jdGlvbiBzZWFyY2goKSB7XFxuICAgICAgICAgICAgICAgIGxldCBydG5MaXN0ID0gW107XFxuICAgICAgICAgICAgICAgIGxldCByZXNwID0gcmVxdWVzdChcXFwiaHR0cHM6Ly96eWIudXB5dW5zby5jb20vdjE1L3NlYXJjaD9rZXl3b3JkPVxcXCIgKyBlbl9hZXMocykgKyBcXFwiJnNfdHlwZT0yJnBhZ2U9XFxcIiArIHBhZ2UgKyBcXFwiJmF0az0mZGlkPVxcXCIgKyBnZW5lcmF0ZVJhbmRvbUhleFN0cmluZyg2NCksIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwidXNlci1hZ2VudFxcXCI6IFxcXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IFJlZG1pIE5vdGUgNyBCdWlsZC9RS1ExLjE5MDkxMC4wMDI7IHd2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvODEuMC40MDQ0LjEzOCBNb2JpbGUgU2FmYXJpLzUzNy4zNiB1bmktYXBwIEh0bWw1UGx1cy8xLjAgKEltbWVyc2VkLzI5LjA5MDkxKVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3BEYXRhID0gZGVfYWVzKHJlc3ApO1xcbiAgICAgICAgICAgICAgICBsZXQganNvbkRhdGEgPSBKU09OLnBhcnNlKHJlc3BEYXRhKSB8fCB7fTtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGpzb25EYXRhLnJlc3VsdCB8fCB7fTtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gcmVzdWx0Lml0ZW1zIHx8IFtdO1xcblxcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBpdGVtLmNvbnRlbnQgfHwgW107XFxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPT0gMCB8fCAhaXRlbS5wYWdlX3VybCkgY29udGludWU7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gZGVfYWVzKGl0ZW0ucGFnZV91cmwpIHx8IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF1cmwpIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICAgICAgcnRuTGlzdC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogKGl0ZW0udGl0bGUubGVuZ3RoID4gMzAgPyBpdGVtLnRpdGxlLnNsaWNlKDAsIDI3KSArIFxcXCIuLi5cXFwiIDogaXRlbS50aXRsZSkgfHwgXFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcIuWIhuS6q+aXtumXtO+8mlxcXCIgKyBpdGVtLmluc2VydF90aW1lLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXJsXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICByZXR1cm4gcnRuTGlzdDtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21IZXhTdHJpbmcobGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgICAgY29uc3QgY2hhcmFjdGVycyA9IFxcXCIwMTIzNDU2Nzg5YWJjZGVmXFxcIjtcXG4gICAgICAgICAgICAgICAgY29uc3QgY2hhcmFjdGVyc0xlbmd0aCA9IGNoYXJhY3RlcnMubGVuZ3RoO1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcmFjdGVyc0xlbmd0aCkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBhbGlVdGlsID0gJC5yZXF1aXJlKFxcXCJhbGlVdGlsXFxcIik7XFxuICAgICAgICAgICAgbGV0IENyeXB0b0pTID0gYWxpVXRpbC5nZXRDcnlwdG9KUygpO1xcblxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGVuX2FlcyhlKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpID0gXFxcInFxMTkyMDUyMDQ2MHFxenpcXFwiO1xcbiAgICAgICAgICAgICAgICAvLyBlbl9hZXNcXG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKGkpO1xcbiAgICAgICAgICAgICAgICB2YXIgdCA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKGUpLFxcbiAgICAgICAgICAgICAgICAgICAgciA9IENyeXB0b0pTLkFFUy5lbmNyeXB0KHQsIGtleSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGl2OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5DQkMsXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHIuY2lwaGVydGV4dC50b1N0cmluZygpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBkZV9hZXModnYpIHtcXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBcXFwicXExOTIwNTIwNDYwcXF6elxcXCI7XFxuICAgICAgICAgICAgICAgIC8vIGRlX2Flc1xcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoaSk7XFxuICAgICAgICAgICAgICAgIGxldCBoZXhWYWwgPSBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHZ2KSxcXG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IENyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KGhleFZhbCksXFxuICAgICAgICAgICAgICAgICAgICBkZWNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdCh2YWwsIGtleSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGl2OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5DQkMsXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlY3J5cHRlZC50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBzZWFyY2goKTtcXG4gICAgICAgIH1cXG4gICAgfSwge1xcbiAgICAgICAgbmFtZTogXFxcIuS6keebmOi1hOa6kFxcXCIsXFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiaHR0cHM6Ly9yZXMueXVucGFuLndpbi8/UGFnZUluZGV4PVxcXCIgKyBwYWdlICsgXFxcIiZQYWdlU2l6ZT0xMiZLZXl3b3JkPVxcXCIgKyBzICsgXFxcIiZUeXBlPSZUYWc9XFxcIjtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vcmVzLnl1bnBhbi53aW4vXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgbGV0IGFyciA9IHBkZmEoaHRtbCwgXFxcIm1haW4mJi5jYXJkXFxcIik7XFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwZGZoKGl0LCBcXFwiLmNhcmQtbGluaywxJiZvbmNsaWNrXFxcIikubWF0Y2goL2h0dHBzOlxcXFwvXFxcXC8od3d3XFxcXC5hbGl5dW5kcml2ZVxcXFwuY29tXFxcXC9zfGFseXdwXFxcXC5uZXQpXFxcXC9cXFxcdyovZykgfHwgW107XFxuICAgICAgICAgICAgICAgIHUgPSB1Lmxlbmd0aCA+IDAgPyB1WzBdIDogdXJsO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXQsIFxcXCIuY2FyZC10aXRsZSYmVGV4dFxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogcGQoaXQsIFxcXCJpbWcmJnNyY1xcXCIsIHVybCksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBwZGZoKGl0LCBcXFwiLmNhcmQtdGV4dCwtMSYmVGV4dFxcXCIpICsgXFxcIlxcXFxuXFxcIiArIHUsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogXFxcIlVQ5LqR5pCcXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXCJodHRwczovL2FwaS51cHl1bnNvMi5jb20vc2VhcmNoP2tleXdvcmQ9XFxcIiArIHMgKyBcXFwiJnBhZ2U9XFxcIiArIHBhZ2UgKyBcXFwiJnNfdHlwZT0xXFxcIjtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vd3d3LnVweXVuc28uY29tXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJDb29raWVcXFwiOiBcXFwiY29kZT0xOTE5XFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgLy9sb2coYmFzZTY0RGVjb2RlKGh0bWwpKTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUoaHRtbCkpLnJlc3VsdC5pdGVtcztcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgaWYgKCFhcnIpIHJldHVybiBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gaXQucGFnZV91cmw7XFxuICAgICAgICAgICAgICAgIC8vdSA9IHUubGVuZ3RoID4gMCA/IHVbMF0gOiB1cmw7XFxuICAgICAgICAgICAgICAgIGlmICghdS5pbmNsdWRlcyhcXFwiYWxpeXVuZHJpdmVcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdC50aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IFxcXCJcXFxcblxcXCIgKyAodSksXFxuICAgICAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogXFxcIueMq+eLuOebmOaQnFxcXCIsXFxuICAgICAgICBwYWdlOiBmYWxzZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoXFxcImh0dHBzOi8vd3d3LmFsaXBhbnNvdS5jb20vc2VhcmNoP2s9XFxcIiArIHMsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpcGFuc291LmNvbS9zZWFyY2g/az1cXFwiICsgc1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGV0IGFyciA9IHBkZmEoaHRtbCwgXFxcIiNhcHAmJmFcXFwiKTtcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gXFxcIjxkaXY+XFxcIiArIGFycltpXSArIFxcXCI8L2Rpdj5cXFwiO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBkZmgoaXQsIFxcXCJhJiZocmVmXFxcIik7XFxuICAgICAgICAgICAgICAgIC8vbG9nKHUpO1xcbiAgICAgICAgICAgICAgICBpZiAoIXUuaW5jbHVkZXMoXFxcIi9zL1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB1ID0gXFxcImh0dHBzOi8vd3d3LmFsaXBhbnNvdS5jb21cXFwiICsgdS5yZXBsYWNlKFxcXCIvcy9cXFwiLCBcXFwiL2N2L1xcXCIpO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXQsIFxcXCJ0ZW1wbGF0ZSYmVGV4dFxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogcGRmaChpdCwgXFxcInRlbXBsYXRlLDEmJlRleHRcXFwiKSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoaW5wdXQsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIkNvb2tpZVxcXCI6IFxcXCJub19zaG93X2RvbmF0ZT0xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogaW5wdXQucmVwbGFjZShcXFwiL2N2L1xcXCIsIFxcXCIvcy9cXFwiKVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogZmFsc2VcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBodG1sID0gcGFyc2VEb21Gb3JIdG1sKGh0bWwsICdhJiZocmVmJyk7XFxuICAgICAgICAgICAgaWYgKGh0bWwubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi5piT5pCcXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICByZWdpc3RlclVybDogXFxcImh0dHBzOi8veWlzby5mdW5cXFwiLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBhbGlVdGlsID0gJC5yZXF1aXJlKFxcXCJhbGlVdGlsXFxcIik7XFxuICAgICAgICAgICAgbGV0IENyeXB0b0pTID0gYWxpVXRpbC5nZXRDcnlwdG9KUygpO1xcblxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGtleWVuKHN0cikge1xcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoXFxcIjRPVG9TY1VGT2FlVlRySEVcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgIGl2ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoXFxcIjlDTEdhbzF2SEtxbTE3T3pcXFwiKTtcXG4gICAgICAgICAgICAgICAgdmFyIGVuY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHtcXG4gICAgICAgICAgICAgICAgICAgIGNpcGhlcnRleHQ6IENyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2Uoc3RyKVxcbiAgICAgICAgICAgICAgICB9LCBrZXksIHtcXG4gICAgICAgICAgICAgICAgICAgIGl2OiBpdixcXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLFxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XFxuICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3J5cHRlZDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KFxcXCJodHRwczovL3lpc28uZnVuL2FwaS9zZWFyY2g/bmFtZT1cXFwiICsgcyArIFxcXCImcGFnZU5vPVxcXCIgKyBwYWdlLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8veWlzby5mdW4vaW5mbz9zZWFyY2hLZXk9XFxcIiArIHMsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiQ29va2llXFxcIjogZ2V0SXRlbSgneWlzb3Vjb29rZScsICcnKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgLy9sb2coaHRtbCk7XFxuICAgICAgICAgICAgaWYgKGh0bWwuaW5jbHVkZXMoJ+eZu+W9leeUqOaIt+aXoOmZkOWIticpKSB7XFxuICAgICAgICAgICAgICAgIHZhciBpID0gMDtcXG4gICAgICAgICAgICAgICAgZG8ge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5aW1nbGluID0gJ2h0dHBzOi8veWlzby5mdW4vYXBpL3VzZXIvbG9naW4vY2FwdGNoYT90PScgKyBwYXJzZUludChuZXcgRGF0ZSgpLmdldFRpbWUoKSkgKyAnJztcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbWcgPSBjb252ZXJ0QmFzZTY0SW1hZ2UodHlpbWdsaW4pLnNwbGl0KCcsJylbMV07XFxuICAgICAgICAgICAgICAgICAgICBsZXQgY29kID0gcmVxdWVzdCgnaHR0cHM6Ly9hcGkueGhvZmUudG9wL29jci9iNjQvdGV4dCcsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbidcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IGltZyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgdmVyID0gSlNPTi5wYXJzZShyZXF1ZXN0KCdodHRwczovL3lpc28uZnVuL2FwaS91c2VyL2xvZ2luJywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmVyZXInOiAnaHR0cHM6Ly95aXNvLmZ1bi9sb2dpbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb29raWUnOiBnZXRDb29raWUodHlpbWdsaW4pXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VyTmFtZVxcXCI6IHVzZXIuYWNjb3VudCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogdXNlci5wYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImNvZGVcXFwiOiBjb2RcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodmVyLmNvZGUgPT0gMjAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCfmmJPmkJznmbvlhaXpqozor4HmiJDlip8nKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKCd5aXNvdWNvb2tlJywgZ2V0Q29va2llKCdodHRwczovL3lpc28uZnVuJykpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgPSByZXF1ZXN0KFxcXCJodHRwczovL3lpc28uZnVuL2FwaS9zZWFyY2g/bmFtZT1cXFwiICsgcyArIFxcXCImcGFnZU5vPVxcXCIgKyBwYWdlLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8veWlzby5mdW4vaW5mbz9zZWFyY2hLZXk9XFxcIiArIHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiQ29va2llXFxcIjogZ2V0SXRlbSgneWlzb3Vjb29rZScsICcnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBpKys7XFxuICAgICAgICAgICAgICAgIH0gd2hpbGUgKGkgPCA0KTtcXG5cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGFyciA9IEpTT04ucGFyc2UoaHRtbCkuZGF0YS5saXN0O1xcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1ID0ga2V5ZW4oaXQudXJsKTtcXG4gICAgICAgICAgICAgICAgLy9sb2codSk7XFxuICAgICAgICAgICAgICAgIGlmICh1ID09IG51bGwgfHwgIXUuaW5jbHVkZXMoXFxcImFsaXl1blxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0Lm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiAoaXQuZ210U2hhcmUgfHwgaXQuZ210Q3JlYXRlKSArIFxcXCJcXFxcblxcXCIgKyAodSksXFxuICAgICAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogXFxcIuWwj+e6uOadoVxcXCIsXFxuICAgICAgICBwYWdlOiBmYWxzZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgYWxpVXRpbCA9ICQucmVxdWlyZShcXFwiYWxpVXRpbFxcXCIpO1xcblxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldHRva2VuKCkge1xcbiAgICAgICAgICAgICAgICBpZiAoZ2V0TXlWYXIoJ3h6eXRva2VuJywgJycpLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdG9rZW4gPSBKU09OLnBhcnNlKHBvc3QoJ2h0dHBzOi8vZ2l0Y2FmZS5uZXQvdG9vbC9hbGlwYXBlci8nLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3UuZ2l0Y2FmZS5pbmsvJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdnZXRfdG9rZW4nXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSkpLmRhdGE7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcigneHp0dG9rZW4nLCB0b2tlbik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE15VmFyKCd4enR0b2tlbicsICcnKTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gY2F0X2NvZGUoYSkge1xcbiAgICAgICAgICAgICAgICB2YXIgZCwgZSwgYiA9IFtcXFwi5Y2O6K+t55S16KeGXFxcIiwgXFxcIuaXpemfqeeUteinhlxcXCIsIFxcXCLmrKfnvo7nlLXop4ZcXFwiLCBcXFwi5YW25LuW55S16KeGXFxcIiwgXFxcIuWNjuivreeUteW9sVxcXCIsIFxcXCLml6Xpn6nnlLXlvbFcXFwiLCBcXFwi5qyn576O55S15b2xXFxcIiwgXFxcIuWFtuS7lueUteW9sVxcXCIsIFxcXCLljY7or63liqjmvKtcXFwiLCBcXFwi5pel6Z+p5Yqo5ryrXFxcIiwgXFxcIuasp+e+juWKqOa8q1xcXCIsIFxcXCLnuqrlvZXniYdcXFwiLCBcXFwi57u86Im654mHXFxcIiwgXFxcIuaVmeiCsuWfueiurVxcXCIsIFxcXCLlhbbku5bop4bpopFcXFwiLCBcXFwi5Y2O6K+t6Z+z5LmQXFxcIiwgXFxcIuaXpemfqemfs+S5kFxcXCIsIFxcXCLmrKfnvo7pn7PkuZBcXFwiLCBcXFwi5YW25LuW6Z+z5LmQXFxcIiwgXFxcIuWoseS5kOi9r+S7tlxcXCIsIFxcXCLns7vnu5/ova/ku7ZcXFwiLCBcXFwi572R57uc6L2v5Lu2XFxcIiwgXFxcIuWKnuWFrOi9r+S7tlxcXCIsIFxcXCLlhbbku5bova/ku7ZcXFwiLCBcXFwi5ryr55S7XFxcIiwgXFxcIuWwj+ivtFxcXCIsIFxcXCLlh7rniYjkuaZcXFwiLCBcXFwi55+l6K+G5Z+56K6tXFxcIiwgXFxcIuWFtuS7luaWh+aho1xcXCIsIFxcXCLlo4HnurhcXFwiLCBcXFwi5Lq654mpXFxcIiwgXFxcIumjjuaZr1xcXCIsIFxcXCLlhbbku5blm77niYdcXFwiLCBcXFwi5YW25LuWXFxcIl0sXFxuICAgICAgICAgICAgICAgICAgICBjID0gW1xcXCJoeWRzXFxcIiwgXFxcInJoZHNcXFwiLCBcXFwib21kc1xcXCIsIFxcXCJxdGRzXFxcIiwgXFxcImh5ZHlcXFwiLCBcXFwicmhkeVxcXCIsIFxcXCJvbWR5XFxcIiwgXFxcInF0ZHlcXFwiLCBcXFwiaHlkbVxcXCIsIFxcXCJyaGRtXFxcIiwgXFxcIm9tZG1cXFwiLCBcXFwiamxwXFxcIiwgXFxcInp5cFxcXCIsIFxcXCJqeXB4XFxcIiwgXFxcInF0c3BcXFwiLCBcXFwiaHl5eVxcXCIsIFxcXCJyaHl5XFxcIiwgXFxcIm9teXlcXFwiLCBcXFwicXR5eVxcXCIsIFxcXCJrZnJqXFxcIiwgXFxcInh0cmpcXFwiLCBcXFwid2xyalxcXCIsIFxcXCJiZ3JqXFxcIiwgXFxcInF0cmpcXFwiLCBcXFwibWhcXFwiLCBcXFwieHNcXFwiLCBcXFwiY2JzXFxcIiwgXFxcInpzcHhcXFwiLCBcXFwicXR3ZFxcXCIsIFxcXCJielxcXCIsIFxcXCJyd1xcXCIsIFxcXCJmalxcXCIsIFxcXCJxdHRwXFxcIiwgXFxcInF0XFxcIl07XFxuICAgICAgICAgICAgICAgIGZvciAoZCA9IDAsIGUgPSBjLmxlbmd0aDsgZSA+IGQ7IGQrKylcXG4gICAgICAgICAgICAgICAgICAgIGlmIChjW2RdID09IGEpIHJldHVybiBiW2RdO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcG9zdChcXFwiaHR0cHM6Ly9naXRjYWZlLm5ldC90b29sL2FsaXBhcGVyL1xcXCIsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly91LmdpdGNhZmUuaW5rLydcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcXFwic2VhcmNoXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGZyb206IFxcXCJ3ZWJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW46IGdldHRva2VuKCksXFxuICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiBzXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIGxldCBsaXN0ID0gSlNPTi5wYXJzZShodG1sKTtcXG4gICAgICAgICAgICBpZiAobGlzdC5kYXRhKSB7XFxuICAgICAgICAgICAgICAgIGxpc3QgPSBsaXN0LmRhdGE7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBsaXN0W2ldXFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0LnRpdGxlO1xcbiAgICAgICAgICAgICAgICBsZXQgbXVybCA9ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy8nICsgaXQuYWxpa2V5XFxuICAgICAgICAgICAgICAgIGlmICghYWxpVXRpbC5jaGVja2FsaShtdXJsKSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlLmluY2x1ZGVzKHMpKSB7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oiaIFxcXCIgKyB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBjYXRfY29kZShpdC5jYXQpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlczogaXQuZGVzXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG11cmxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi546p5YG25ZOl5ZOlXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBiYXNpY1VybDogXFxcImh0dHA6Ly93b2dnLnh5elxcXCIsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IGJhc2ljVXJsICsgXFxcIi9pbmRleC5waHAvdm9kc2VhcmNoL1xcXCIgKyBzICsgXFxcIi0tLS0tLS0tLS1cXFwiICsgcGFnZSArIFxcXCItLS0uaHRtbFxcXCI7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KHVybCk7XFxuICAgICAgICAgICAgbGV0IGFyciA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgXFxcIi5tb2R1bGUtaXRlbXMmJi5tb2R1bGUtc2VhcmNoLWl0ZW1cXFwiKTtcXG5cXG4gICAgICAgICAgICBsZXQgYmV0ID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdXRpdGxlID0gcGRmaChpdCwgXFxcImgzJiZhJiZUZXh0XFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCB1c2VyaWFsID0gcGRmaChpdCwgXFxcIi52aWRlby1zZXJpYWwmJlRleHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVpbWFnZSA9IHBkZmgoaXQsIFxcXCJpbWcmJmRhdGEtc3JjXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGQoaXQsIFxcXCJoMyYmYSYmaHJlZlxcXCIsIGJhc2ljVXJsKTtcXG4gICAgICAgICAgICAgICAgYmV0LnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHV0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIHBpY191cmw6IHVpbWFnZSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHVzZXJpYWxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIHJldHVybiBiZXQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIHJldHVybiBwZGZhKHJlcXVlc3QoaW5wdXQpLCBcXFwiYm9keSYmLm1vZHVsZS1yb3ctdGV4dC5jb3B5XFxcIikubWFwKHYgPT4gcGRmaCh2LCBcXFwiYSYmZGF0YS1jbGlwYm9hcmQtdGV4dFxcXCIpKTtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogXFxcIumYv+mHjOS6keebmOe9kVxcXCIsXFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgYmFzaWNVcmw6IFxcXCJodHRwczovL3d3dy5hbHlwdy5jblxcXCIsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IGJhc2ljVXJsICsgXFxcIi9zZWFyY2gucGhwP3E9XFxcIiArIHMgKyBcXFwiJnBhZ2U9XFxcIiArIHBhZ2U7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KHVybCwge30pO1xcbiAgICAgICAgICAgIGxldCBhcnIgPSBwZGZhKGh0bWwsIFxcXCIubGlzdCYmbGlcXFwiKTtcXG4gICAgICAgICAgICBsZXQgYmV0ID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdXRpdGxlID0gcGRmaChpdCwgXFxcImEmJnRpdGxlXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCB1c2VyaWFsID0gcGRmaChpdCwgXFxcIi5mYS1jbG9jay1vJiZUZXh0XFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCB1aW1hZ2UgPSBwZGZoKGl0LCBcXFwiaW1nJiZzcmNcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwZChpdCwgXFxcImEmJmhyZWZcXFwiLCBiYXNpY1VybCk7XFxuICAgICAgICAgICAgICAgIGlmICghdXRpdGxlLmluY2x1ZGVzKHMpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBiZXQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdXRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogdWltYWdlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogdXNlcmlhbFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgcmV0dXJuIGJldDtcXG4gICAgICAgIH0sXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxuICAgICAgICAgICAgcmV0dXJuIHBkZmEocmVxdWVzdChpbnB1dCksIFxcXCJib2R5JiZhW2hyZWZePWh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL11cXFwiKS5tYXAodiA9PiBwZGZoKHYsIFxcXCJhJiZocmVmXFxcIikpO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi5Zyf5ouo6bygXFxcIixcXG4gICAgICAgIHBhZ2U6IGZhbHNlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBodG1sID0gZmV0Y2goJ2h0dHBzOi8vd3d3LnRic2R5LmNvbS9zZWFyY2guaHRtbD9rZXl3b3JkPScgKyBzICsgJyZjYXRlZ29yeT05ODM5MjAmZGF0YV90eXBlPTk4NzkxMCcsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgbGV0IGFyciA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgJy5zZWFyY2hfcmVzdWx0X25ldGRpc2tfbGlzdCYmYScpO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICAvL2xvZyhpdCk7XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGFyc2VEb21Gb3JIdG1sKGl0LCAnYSYmaHJlZicpO1xcbiAgICAgICAgICAgICAgICBsZXQgdGl0ID0gcGFyc2VEb21Gb3JIdG1sKGl0LCAnLm5ldGRpc2tfaXRlbV9kZXRhaWxfbmFtZSYmVGV4dCcpO1xcbiAgICAgICAgICAgICAgICBpZiAoIXRpdC5pbmNsdWRlcyhzKSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgLy9sb2codSk7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0LFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcIlxcXFxuXFxcIiArIHUsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogXFxcIumYv+mHjOaQnFxcXCIsXFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KCdodHRwczovL2FsaXNvLmNjL3MvJyArIHMgKyAnLScgKyBwYWdlICsgJy0wLmh0bWwnLCB7fSk7XFxuXFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBwYXJzZURvbUZvckFycmF5KGh0bWwsICcuc2VhcmNoLXJlc3VsdCYmLnJlc291cmNlLWl0ZW0nKTtcXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpc3QubGVuZ3RoOyBqKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBsaXN0W2pdO1xcbiAgICAgICAgICAgICAgICBsZXQgdGl0ID0gcGFyc2VEb21Gb3JIdG1sKHUsICdoMyYmVGV4dCcpO1xcbiAgICAgICAgICAgICAgICBpZiAoIXRpdC5pbmNsdWRlcyhzKSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXQsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHBhcnNlRG9tKHUsICdoMyYmYSYmaHJlZicsICdodHRwczovL2FsaXNvLmNjLycpLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogcGFyc2VEb21Gb3JIdG1sKHUsICcudGltZSYmVGV4dCcpLFxcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIGV2YWwoZ2V0Q3J5cHRvSlMoKSk7XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gZGVjcnkoc3RyKSB7XFxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShcXFwiOUVCMjBEREZENkFGQkQ2OFxcXCIpO1xcbiAgICAgICAgICAgICAgICB2YXIgZW5jcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoc3RyLCBrZXksIHtcXG4gICAgICAgICAgICAgICAgICAgIGl2OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzN1xcbiAgICAgICAgICAgICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBlbmNyeXB0ZWQ7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICAgICAgbGV0IGJ1dCA9IHBhcnNlRG9tKGh0bWwsICcuYnV0dG9uJiZocmVmJywgJ2h0dHBzOi8vYWxpc28uY2MvJyk7XFxuICAgICAgICAgICAgLy9sb2coYnV0KTtcXG4gICAgICAgICAgICBsZXQgZ290ID0gcmVxdWVzdChidXQpO1xcbiAgICAgICAgICAgIC8vbG9nKGdvdCk7XFxuICAgICAgICAgICAgZXZhbChwYXJzZURvbUZvckh0bWwoZ290LCAnaGVhZCYmc2NyaXB0LDEmJkh0bWwnKSk7XFxuICAgICAgICAgICAgcmV0dXJuIGRlY3J5KGJhc2U2NC5zcGxpdCgnIScpWzBdKTtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogXFxcIuS6keebmOWIhuS6q+ekvlxcXCIsXFxuICAgICAgICBwYWdlOiBmYWxzZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgYWxpVXRpbCA9ICQucmVxdWlyZShcXFwiYWxpVXRpbFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBDcnlwdG9KUyA9IGFsaVV0aWwuZ2V0Q3J5cHRvSlMoKTtcXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBkZWNyeShzdHIpIHtcXG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKFxcXCI1RjZCMkFLMzNEQVNEMTIzXFxcIik7XFxuICAgICAgICAgICAgICAgIHZhciBlbmNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdChzdHIsIGtleSwge1xcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5FQ0IsXFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczdcXG4gICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jcnlwdGVkO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoXFxcImh0dHBzOi8vd3d3Lnl1bnBhbmZlbnhpYW5nLmNuL2FwaS9iYnMvYXBpL2dldGRhdGE/a2V5PVxcXCIgKyBzICsgXFxcIiZ0eXBlPXZpZGVvXFxcIiwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy55dW5wYW5mZW54aWFuZy5jbi9cXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsZXQganNvbiA9IGRlY3J5KEpTT04ucGFyc2UoaHRtbCkuZGF0YSk7XFxuICAgICAgICAgICAgbGV0IGFyciA9IEpTT04ucGFyc2UoanNvbik7XFxuXFxuICAgICAgICAgICAgbGV0IGJldCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGl0LnBpZDtcXG4gICAgICAgICAgICAgICAgYmV0LnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaHR0cHM6Ly93d3cueXVucGFuZmVueGlhbmcuY24vYXBpL2Jicy9hcGkvZ2V0YXJ0aWNsZT9pZD1cXFwiICsgdXJsLFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogaXQuY3JlYXRldGltZVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgcmV0dXJuIGJldDtcXG4gICAgICAgIH0sXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoaW5wdXQsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cueXVucGFuZmVueGlhbmcuY24vXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSkpLmRhdGE7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBqc29uLmRvd25sb2FkLnNwbGl0KFxcXCJAXFxcIik7XFxuICAgICAgICAgICAgbGV0IGFsaXN0ID0gbmV3IFNldCgpO1xcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGlzdC5sZW5ndGg7IGorKykge1xcbiAgICAgICAgICAgICAgICBhbGlzdC5hZGQoXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL1xcXCIgKyBsaXN0W2pdKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oYWxpc3QpO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi55uY5pCcXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgcGFnZSA9IChwYWdlIC0gMSkgKiAxMDtcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcImh0dHBzOi8vd3d3LnBhbnNlYXJjaC5tZS9zZWFyY2g/a2V5d29yZD1cXFwiICsgcyArIFxcXCImb2Zmc2V0PVxcXCIgKyBwYWdlICsgXFxcIiZwYW49YWxpeXVuZHJpdmVcXFwiO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwsIHt9KTtcXG5cXG4gICAgICAgICAgICBsZXQgYXJyID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnLmdyaWQmJi5zaGFkb3c6aGFzKGFbaHJlZl49aHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXSknKTtcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBhcnNlRG9tRm9ySHRtbChpdCwgJ2FbaHJlZl49aHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXSYmaHJlZicpO1xcbiAgICAgICAgICAgICAgICBsZXQgcGljX3VybCA9IHBhcnNlRG9tRm9ySHRtbChpdCwgJ2ltZyYmc3JjJyk7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGFyc2VEb21Gb3JIdG1sKGl0LCAnLmJyZWFrLWFsbCYmVGV4dCcpLnNwbGl0KCdodHRwJylbMF0sXFxuICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBwaWNfdXJsID09PSBcXFwiL2Zhdmljb24ucG5nXFxcIiA/IFxcXCJodHRwczovL3d3dy5wYW5zZWFyY2gubWUvXFxcIiArIHBpY191cmwgOiBwaWNfdXJsLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogcGFyc2VEb21Gb3JIdG1sKGl0LCAncCYmVGV4dCcpICsgXFxcIlxcXFxuXFxcIiArIHUsXFxuICAgICAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogXFxcIkRPVljmkJxcXFwiLFxcbiAgICAgICAgcGFnZTogZmFsc2UsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXCJodHRwczovL2FwaS5kb3Z4LnRrL2FsaS9zZWFyY2g/d2Q9XFxcIiArIHM7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KHVybCk7XFxuICAgICAgICAgICAgbGV0IGFyciA9IEpTT04ucGFyc2UoaHRtbCkubGlzdDtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGxldCBhbGlVdGlsID0gJC5yZXF1aXJlKFxcXCJhbGlVdGlsXFxcIik7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IGl0LnZvZF9jb250ZW50O1xcbiAgICAgICAgICAgICAgICBpZiAoIXUuaW5jbHVkZXMoXFxcImFsaXl1bmRyaXZlXFxcIikgfHwgIWFsaVV0aWwuY2hlY2thbGkodSkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKImiBcXFwiICsgaXQudm9kX25hbWUsXFxuICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBpdC52b2RfcGljLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcIlxcXFxuXFxcIiArIHUsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogXFxcIuW/heW6lFxcXCIsXFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiaHR0cHM6Ly9jbi5iaW5nLmNvbS9zZWFyY2g/cT1cXFwiICsgcyArIFxcXCIrYWxpeXVuZHJpdmUmcXM9ZHMmZm9ybT1RQlJFXFxcIjtcXG4gICAgICAgICAgICBpZiAocGFnZSAhPSAxKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IGdldE15VmFyKFxcXCJiaW5nXFxcIiwgdXJsKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KHVybCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL2NuLmJpbmcuY29tL1xcXCIsXFxuICAgICAgICAgICAgICAgICAgICAvL1xcXCJYLVJlcXVlc3RlZC1XaXRoXFxcIjogXFxcImNvbS5leGFtcGxlLmhpa2Vydmlld1xcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiQWNjZXB0XFxcIjogXFxcInRleHQvaHRtbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsYXBwbGljYXRpb24veG1sO3E9MC45LGltYWdlL2F2aWYsaW1hZ2Uvd2VicCxpbWFnZS9hcG5nLCovKjtxPTAuOCxhcHBsaWNhdGlvbi9zaWduZWQtZXhjaGFuZ2U7dj1iMztxPTAuOVxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxldCBhcnIgPSBwZGZhKGh0bWwsIFxcXCJib2R5JiZhXFxcIik7XFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwZChpdCwgXFxcImEmJmhyZWZcXFwiLCB1cmwpO1xcbiAgICAgICAgICAgICAgICBsZXQgdCA9IHBkZmgoaXQsIFxcXCJhJiZUZXh0XFxcIik7XFxuICAgICAgICAgICAgICAgIGlmIChpdC5pbmNsdWRlcyhcXFwiTmV4dCBwYWdlXFxcIikgfHwgaXQuaW5jbHVkZXMoXFxcIuS4i+S4gOmhtVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdTIgPSBwZChpdCwgXFxcImEmJmhyZWZcXFwiLCB1cmwpO1xcbiAgICAgICAgICAgICAgICAgICAgLy9sb2coXFxcIm5leHQgcGFnZVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgLy9sb2codTIpO1xcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImJpbmdcXFwiLCB1Mik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKHUgPT0gbnVsbCB8fCB0ID09IG51bGwgfHwgIWl0LmluY2x1ZGVzKHMpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoIWl0LmluY2x1ZGVzKFxcXCLnvZHnm5hcXFwiKSAmJiAhaXQuaW5jbHVkZXMoXFxcIuS6keebmFxcXCIpICYmXFxuICAgICAgICAgICAgICAgICAgICAhaXQuaW5jbHVkZXMoXFxcImFsaXl1bmRyaXZlXFxcIikgJiYgIWl0LmluY2x1ZGVzKFxcXCJ5dW5wYW5cXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKHUuc3RhcnRzV2l0aChcXFwiaHR0cHM6Ly9jbi5iaW5nLmNvbS9cXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IGRvbSA9IGdldEhvbWUodSkucmVwbGFjZShcXFwiaHR0cDovL1xcXCIsIFxcXCJcXFwiKS5yZXBsYWNlKFxcXCJodHRwczovL1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IF9saW5rcyA9IHQubWF0Y2goL2h0dHBzOlxcXFwvXFxcXC8od3d3XFxcXC5hbGl5dW5kcml2ZVxcXFwuY29tXFxcXC9zfGFseXdwXFxcXC5uZXQpXFxcXC9cXFxcdyovZykgfHwgW107XFxuICAgICAgICAgICAgICAgIGxldCBjID0gbnVsbDtcXG4gICAgICAgICAgICAgICAgaWYgKF9saW5rcy5sZW5ndGggPiAxICYmIF9saW5rc1sxXS5yZXBsYWNlKF9saW5rc1swXSwgXFxcIlxcXCIpLnJlcGxhY2UoL1thLXpBLVowLTldKy9nLCBcXFwiXFxcIikgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIGMgPSBfbGlua3NbMV07XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2xpbmtzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIGMgPSBfbGlua3NbMF07XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0LFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogZG9tLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBjICE9IG51bGwgPyBjIDogdSxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIui/m+WFpee9keermVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzOiBKU09OLnN0cmluZ2lmeShcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQodSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXG4gICAgICAgICAgICBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcImFsaXl1bmRyaXZlXFxcIikpIHJldHVybiBpbnB1dDtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgIHZhciBfbGlua3MgPSBodG1sLm1hdGNoKC9odHRwczpcXFxcL1xcXFwvKHd3d1xcXFwuYWxpeXVuZHJpdmVcXFxcLmNvbVxcXFwvc3xhbHl3cFxcXFwubmV0KVxcXFwvXFxcXHcqL2cpIHx8IFtdO1xcbiAgICAgICAgICAgIGlmIChfbGlua3MubGVuZ3RoID4gMSAmJiBfbGlua3NbMV0ucmVwbGFjZShfbGlua3NbMF0sIFxcXCJcXFwiKS5yZXBsYWNlKC9bYS16QS1aMC05XSsvZywgXFxcIlxcXCIpID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBfbGlua3NbMV07XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChfbGlua3MubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtzWzBdO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogJ0NDT0YnLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdXFxuICAgICAgICAgICAgbGV0IGFsaVV0aWwgPSAkLnJlcXVpcmUoXFxcImFsaVV0aWxcXFwiKTtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IGZldGNoKCdodHRwczovL3Bhbi5jY29mLmNjL2FwaS9zZWFyY2gnLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJjb250ZW50LXR5cGVcXFwiOiAnYXBwbGljYXRpb24vanNvbicsXFxuICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3Bhbi5jY29mLmNjL3NlYXJjaD9rZXl3b3JkPScgKyBzXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYWdlU2l6ZVxcXCI6IDIwLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhZ2VOdW1cXFwiOiBwYWdlLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcImtleXdvcmRcXFwiOiBzLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcImZyb21Nb2JpbGVcXFwiOiB0cnVlXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IEpTT04ucGFyc2UoaHRtbClcXG4gICAgICAgICAgICAgICAgLmRhdGEucm93c1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBsaXN0W2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBpdC5maWxlTmFtZVxcbiAgICAgICAgICAgICAgICBsZXQgbXVybCA9IGl0LnVybFxcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGl0LnR5cGUucmVwbGFjZSgvZm9sZGVyLywgJ+aWh+S7tuWkuScpLnJlcGxhY2UoL2ZpbGUvLCAn5paH5Lu2JylcXG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlLmluY2x1ZGVzKHMpKSB7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiAn5paH5Lu257G75Z6L77yaJyArIHR5cGUgKyAn77yM5paH5Lu25aSn5bCP77yaJyArIGFsaVV0aWwuYnl0ZXNUb1NpemUoaXQuc2l6ZSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBtdXJsXFxuICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkXFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6ICfpmL/ph4zlsI/nq5knLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgaG9tZSA9IFxcXCJodHRwczovL3BhbjY2Ni5uZXRcXFwiO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KGJ1aWxkVXJsKGhvbWUgKyBcXFwiL2FwaS9kaXNjdXNzaW9uc1xcXCIsIHtcXG4gICAgICAgICAgICAgICAgXFxcImluY2x1ZGVcXFwiOiBcXFwidXNlcixsYXN0UG9zdGVkVXNlcixtb3N0UmVsZXZhbnRQb3N0LG1vc3RSZWxldmFudFBvc3QudXNlcix0YWdzLHRhZ3MucGFyZW50LGZpcnN0UG9zdFxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJmaWx0ZXJbcV1cXFwiOiBzIC8qICsgXFxcIiB0YWc6dmlkZW8sY29taWNcXFwiKi8gLFxcbiAgICAgICAgICAgICAgICAvL1xcXCJmaWx0ZXJbdGFnXVxcXCI6IFxcXCJ2aWRlbyxjb21pY1xcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJwYWdlW29mZnNldF1cXFwiOiAyMCAqIChwYWdlIC0gMSlcXG4gICAgICAgICAgICB9KSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiY29udGVudC10eXBlXFxcIjogXFxcImFwcGxpY2F0aW9uL2pzb25cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly9wYW42NjYubmV0Lz9xPVxcXCIgKyBzXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IEpTT04ucGFyc2UoaHRtbCkuZGF0YTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaXN0W2ldLmF0dHJpYnV0ZXM7XFxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBob21lICsgXFxcIi9kL1xcXCIgKyBpdGVtLnNsdWc7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6ICflj5HluIPml7bpl7TvvJonICsgJC5kYXRlRm9ybWF0KG5ldyBEYXRlKGl0ZW0uY3JlYXRlZEF0KSwgXFxcInl5eXktTU0tZGQgSEg6bW06c3NcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6L+b5YWl5biW5a2QXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganM6IEpTT04uc3RyaW5naWZ5KFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH0sXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSBwZGZoKHJlcXVlc3QoaW5wdXQpLCBcXFwiVGV4dFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBfbGlua3MgPSBodG1sLm1hdGNoKC9odHRwczpcXFxcL1xcXFwvKHd3d1xcXFwuYWxpeXVuZHJpdmVcXFxcLmNvbVxcXFwvc3xhbHl3cFxcXFwubmV0KVxcXFwvXFxcXHcqL2cpIHx8IFtdO1xcbiAgICAgICAgICAgIGxldCBzaGFyZVB3ZCA9IGh0bWwubWF0Y2goL+aPkOWPlueggVs677yaXVxcXFxzKj8oXFxcXHd7NH0pLyk7XFxuICAgICAgICAgICAgc2hhcmVQd2QgPSBBcnJheS5pc0FycmF5KHNoYXJlUHdkKSAmJiBzaGFyZVB3ZC5sZW5ndGggPiAwID8gc2hhcmVQd2RbMV0gOiBcXFwiXFxcIjtcXG4gICAgICAgICAgICBpZiAoX2xpbmtzLmxlbmd0aCA+IDEgJiYgX2xpbmtzWzFdLnJlcGxhY2UoX2xpbmtzWzBdLCBcXFwiXFxcIikucmVwbGFjZSgvW2EtekEtWjAtOV0rL2csIFxcXCJcXFwiKSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICAgICAgYWxpVXJsOiBfbGlua3NbMV0sXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2RcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKF9saW5rcy5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgICAgICBhbGlVcmw6IF9saW5rc1swXSxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBzaGFyZVB3ZFxcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogJ+S6keebmOWIhuS6q+ekvuWMuicsXFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBob21lID0gXFxcImh0dHBzOi8veXVucGFuMS5jY1xcXCI7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoYnVpbGRVcmwoaG9tZSArIFxcXCIvYXBpL2Rpc2N1c3Npb25zXFxcIiwge1xcbiAgICAgICAgICAgICAgICBcXFwiaW5jbHVkZVxcXCI6IFxcXCJ1c2VyLGxhc3RQb3N0ZWRVc2VyLG1vc3RSZWxldmFudFBvc3QsbW9zdFJlbGV2YW50UG9zdC51c2VyLHRhZ3MsdGFncy5wYXJlbnQsZmlyc3RQb3N0XFxcIixcXG4gICAgICAgICAgICAgICAgXFxcImZpbHRlcltxXVxcXCI6IHMgLyogKyBcXFwiIHRhZzp2aWRlbyxjb21pY1xcXCIqLyAsXFxuICAgICAgICAgICAgICAgIC8vXFxcImZpbHRlclt0YWddXFxcIjogXFxcInZpZGVvLGNvbWljXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcInBhZ2Vbb2Zmc2V0XVxcXCI6IDIwICogKHBhZ2UgLSAxKVxcbiAgICAgICAgICAgIH0pLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJjb250ZW50LXR5cGVcXFwiOiBcXFwiYXBwbGljYXRpb24vanNvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3BhbjY2Ni5uZXQvP3E9XFxcIiArIHNcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gSlNPTi5wYXJzZShodG1sKS5kYXRhO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGxpc3RbaV0uYXR0cmlidXRlcztcXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGhvbWUgKyBcXFwiL2QvXFxcIiArIGl0ZW0uc2x1ZztcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogJ+WPkeW4g+aXtumXtO+8micgKyAkLmRhdGVGb3JtYXQobmV3IERhdGUoaXRlbS5jcmVhdGVkQXQpLCBcXFwieXl5eS1NTS1kZCBISDptbTpzc1xcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLov5vlhaXluJblrZBcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqczogSlNPTi5zdHJpbmdpZnkoXFxcImhpa2VyOi8vcGFnZS95c2Z4P3dlYlVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHBkZmgocmVxdWVzdChpbnB1dCksIFxcXCJUZXh0XFxcIik7XFxuICAgICAgICAgICAgbGV0IF9saW5rcyA9IGh0bWwubWF0Y2goL2h0dHBzOlxcXFwvXFxcXC8od3d3XFxcXC5hbGl5dW5kcml2ZVxcXFwuY29tXFxcXC9zfGFseXdwXFxcXC5uZXQpXFxcXC9cXFxcdyovZykgfHwgW107XFxuICAgICAgICAgICAgbGV0IHNoYXJlUHdkID0gaHRtbC5tYXRjaCgv5o+Q5Y+W56CBWzrvvJpdXFxcXHMqPyhcXFxcd3s0fSkvKTtcXG4gICAgICAgICAgICBzaGFyZVB3ZCA9IEFycmF5LmlzQXJyYXkoc2hhcmVQd2QpICYmIHNoYXJlUHdkLmxlbmd0aCA+IDAgPyBzaGFyZVB3ZFsxXSA6IFxcXCJcXFwiO1xcbiAgICAgICAgICAgIGlmIChfbGlua3MubGVuZ3RoID4gMSAmJiBfbGlua3NbMV0ucmVwbGFjZShfbGlua3NbMF0sIFxcXCJcXFwiKS5yZXBsYWNlKC9bYS16QS1aMC05XSsvZywgXFxcIlxcXCIpID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgICAgICBhbGlVcmw6IF9saW5rc1sxXSxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBzaGFyZVB3ZFxcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX2xpbmtzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgICAgIGFsaVVybDogX2xpbmtzWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9LCB7XFxuICAgICAgICBuYW1lOiBcXFwi54ix55yL576O5YmnXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXCJodHRwczovL3d3dy4ya21qLmNuL3NlYXJjaC5waHA/cT1cXFwiICsgcyArIFxcXCImcGFnZS9cXFwiICsgcGFnZSArIFxcXCIvXFxcIjtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsKTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCBcXFwiLmxpc3QtaXQmJmxpXFxcIik7XFxuXFxuICAgICAgICAgICAgbGV0IGJldCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHV0aXRsZSA9IHBhcnNlRG9tRm9ySHRtbChpdCwgXFxcImEmJnRpdGxlXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCB1c2VyaWFsID0gcGFyc2VEb21Gb3JIdG1sKGl0LCBcXFwiLmluZm8mJnNwYW46bm90KDpoYXMoYSkpLS1pJiZUZXh0XFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCB1aW1hZ2UgPSBwYXJzZURvbShpdCwgXFxcImltZyYmc3JjXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGFyc2VEb20oaXQsIFxcXCJhJiZocmVmXFxcIik7XFxuICAgICAgICAgICAgICAgIGJldC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB1dGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiB1aW1hZ2UsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiB1c2VyaWFsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICByZXR1cm4gYmV0O1xcblxcbiAgICAgICAgfSxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXG4gICAgICAgICAgICByZXR1cm4gcGRmYShyZXF1ZXN0KGlucHV0KSwgXFxcImJvZHkmJiNkb3dubG9hZFxcXCIpLm1hcCh2ID0+IHBkZmgodiwgXFxcIi5kb3duJiZocmVmXFxcIikpO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi5aWH5aaZ5pCc57SiXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsO1xcbiAgICAgICAgICAgIGlmIChwYWdlID09PSAxKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IGJ1aWxkVXJsKFxcXCJodHRwczovL3d3dy5tYWdpY2Fsc2VhcmNoLnRvcC9hcGkvcHNob3UvZ2V0RGF0YVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgIHdvcmQ6IHMsXFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcXFwi6Zi/6YeM572R55uYXFxcIlxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB1cmwgPSBidWlsZFVybChcXFwiaHR0cHM6Ly93d3cubWFnaWNhbHNlYXJjaC50b3AvYXBpL3BzaG91L2dldE5leHRQYWdlXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaHR0cHM6Ly9hcGkudXB5dW5zbzIuY29tL3NlYXJjaD9zX3R5cGU9MkBwYWdlPVxcXCIgKyBwYWdlICsgXFxcIkBrZXl3b3JkPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocyksXFxuICAgICAgICAgICAgICAgICAgICB3ZWJzaXRlOiBcXFwi6Zi/6YeM572R55uYXFxcIlxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFJlZmVyZXI6IGJ1aWxkVXJsKFxcXCJodHRwczovL3d3dy5tYWdpY2Fsc2VhcmNoLnRvcC9zZWFyY2hcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgd29yZDogcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjcGFnZTogMFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXN1bHQpKTtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IHJlc3VsdC5yZXN1bHQuaXRlbXM7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgICAgICAgICAgIGlmIChpdC5pZCA9PSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdC50aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLml6XmnJ/vvJpcXFwiICsgaXQuaW5zZXJ0X3RpbWUgKyBcXFwiXFxcXG7ot6/lvoTvvJpcXFwiICsgaXQucGF0aCxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogaXQucGFnZV91cmxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaWh+S7tuaOkuW6j1wiLFwicGF0aFwiOlwiRmlsZVNvcnRpbmdcIixcInJ1bGVcIjpcImxldCBjaG5OdW1DaGFyID0ge1xcbiAgICDpm7Y6IDAsXFxuICAgIOS4gDogMSxcXG4gICAg5LqMOiAyLFxcbiAgICDkuIk6IDMsXFxuICAgIOWbmzogNCxcXG4gICAg5LqUOiA1LFxcbiAgICDlha06IDYsXFxuICAgIOS4gzogNyxcXG4gICAg5YWrOiA4LFxcbiAgICDkuZ06IDlcXG59O1xcblxcbmxldCBjaG5OYW1lVmFsdWUgPSB7XFxuICAgIOWNgToge1xcbiAgICAgICAgdmFsdWU6IDEwLFxcbiAgICAgICAgc2VjVW5pdDogZmFsc2VcXG4gICAgfSxcXG4gICAg55m+OiB7XFxuICAgICAgICB2YWx1ZTogMTAwLFxcbiAgICAgICAgc2VjVW5pdDogZmFsc2VcXG4gICAgfSxcXG4gICAg5Y2DOiB7XFxuICAgICAgICB2YWx1ZTogMTAwMCxcXG4gICAgICAgIHNlY1VuaXQ6IGZhbHNlXFxuICAgIH0sXFxuICAgIOS4hzoge1xcbiAgICAgICAgdmFsdWU6IDEwMDAwLFxcbiAgICAgICAgc2VjVW5pdDogdHJ1ZVxcbiAgICB9LFxcbiAgICDkur86IHtcXG4gICAgICAgIHZhbHVlOiAxMDAwMDAwMDAsXFxuICAgICAgICBzZWNVbml0OiB0cnVlXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gQ2hpbmVzZVRvTnVtYmVyKGNoblN0cikge1xcbiAgICBsZXQgcnRuID0gMDtcXG4gICAgbGV0IHNlY3Rpb24gPSAwO1xcbiAgICBsZXQgbnVtYmVyID0gMDtcXG4gICAgbGV0IHNlY1VuaXQgPSBmYWxzZTtcXG4gICAgbGV0IHN0ciA9IGNoblN0ci5zcGxpdCgnJyk7XFxuXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgbnVtID0gY2huTnVtQ2hhcltzdHJbaV1dO1xcbiAgICAgICAgaWYgKHR5cGVvZiBudW0gIT09ICd1bmRlZmluZWQnKSB7XFxuICAgICAgICAgICAgbnVtYmVyID0gbnVtO1xcbiAgICAgICAgICAgIGlmIChpID09PSBzdHIubGVuZ3RoIC0gMSkge1xcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9IG51bWJlcjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCB1bml0ID0gY2huTmFtZVZhbHVlW3N0cltpXV0udmFsdWU7XFxuICAgICAgICAgICAgc2VjVW5pdCA9IGNobk5hbWVWYWx1ZVtzdHJbaV1dLnNlY1VuaXQ7XFxuICAgICAgICAgICAgaWYgKHNlY1VuaXQpIHtcXG4gICAgICAgICAgICAgICAgc2VjdGlvbiA9IChzZWN0aW9uICsgbnVtYmVyKSAqIHVuaXQ7XFxuICAgICAgICAgICAgICAgIHJ0biArPSBzZWN0aW9uO1xcbiAgICAgICAgICAgICAgICBzZWN0aW9uID0gMDtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9IChudW1iZXIgKiB1bml0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbnVtYmVyID0gMDtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gcnRuICsgc2VjdGlvbjtcXG59XFxuXFxuZnVuY3Rpb24gbmFtZUNvbXBhcmUoYSwgYikge1xcbiAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbClcXG4gICAgICAgIHJldHVybiBhID09IG51bGwgPyBiID09IG51bGwgPyAwIDogLTEgOiAxO1xcblxcbiAgICBhID0gYS5yZXBsYWNlKC8oW+mbtuS4gOS6jOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+S6v10pL2csIGZ1bmN0aW9uKG1hdGNoLCBwMSwgcDIsIHAzLCBvZmZzZXQsIHN0cmluZykge1xcbiAgICAgICAgLy8gcDEgaXMgbm9uZGlnaXRzLCBwMiBkaWdpdHMsIGFuZCBwMyBub24tYWxwaGFudW1lcmljc1xcbiAgICAgICAgcmV0dXJuIENoaW5lc2VUb051bWJlcihwMSk7XFxuICAgIH0pXFxuICAgIGIgPSBiLnJlcGxhY2UoLyhb6Zu25LiA5LqM5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5Lq/XSkvZywgZnVuY3Rpb24obWF0Y2gsIHAxLCBwMiwgcDMsIG9mZnNldCwgc3RyaW5nKSB7XFxuICAgICAgICAvLyBwMSBpcyBub25kaWdpdHMsIHAyIGRpZ2l0cywgYW5kIHAzIG5vbi1hbHBoYW51bWVyaWNzXFxuICAgICAgICByZXR1cm4gQ2hpbmVzZVRvTnVtYmVyKHAxKTtcXG4gICAgfSlcXG5cXG4gICAgbGV0IE5VTUJFUlMgPSBqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKFxcXCIoPzw9XFxcXFxcXFxEKSg/PVxcXFxcXFxcZCl8KD88PVxcXFxcXFxcZCkoPz1cXFxcXFxcXEQpXFxcIilcXG4gICAgbGV0IHNwbGl0MSA9IE5VTUJFUlMuc3BsaXQobmV3IGphdmEubGFuZy5TdHJpbmcoYSkpO1xcbiAgICBsZXQgc3BsaXQyID0gTlVNQkVSUy5zcGxpdChuZXcgamF2YS5sYW5nLlN0cmluZyhiKSk7XFxuXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oc3BsaXQxLmxlbmd0aCwgc3BsaXQyLmxlbmd0aCk7IGkrKykge1xcbiAgICAgICAgbGV0IGMxID0gc3BsaXQxW2ldLmNoYXJDb2RlQXQoMCk7XFxuICAgICAgICBsZXQgYzIgPSBzcGxpdDJbaV0uY2hhckNvZGVBdCgwKTtcXG4gICAgICAgIGxldCBjbXAgPSAwO1xcbiAgICAgICAgbGV0IHplcm9DaGFyQ29kZSA9ICcwJy5jaGFyQ29kZUF0KDApO1xcbiAgICAgICAgbGV0IG5pbmVDaGFyQ29kZSA9ICc5Jy5jaGFyQ29kZUF0KDApO1xcblxcbiAgICAgICAgaWYgKGMxID49IHplcm9DaGFyQ29kZSAmJiBjMSA8PSBuaW5lQ2hhckNvZGUgJiYgYzIgPj0gemVyb0NoYXJDb2RlICYmIGMyIDw9IG5pbmVDaGFyQ29kZSkge1xcbiAgICAgICAgICAgIGNtcCA9IG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcihzcGxpdDFbaV0pLmNvbXBhcmVUbyhuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoc3BsaXQyW2ldKSk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBpZiAoY21wID09PSAwKSB7XFxuICAgICAgICAgICAgbGV0IHJlZ2V4ID0gL1thLXpBLVowLTldL1xcbiAgICAgICAgICAgIGxldCBzMSA9IFN0cmluZyhzcGxpdDFbaV0pXFxuICAgICAgICAgICAgbGV0IHMyID0gU3RyaW5nKHNwbGl0MltpXSlcXG4gICAgICAgICAgICBpZiAocmVnZXgudGVzdChzMSkgfHwgcmVnZXgudGVzdChzMikpIHtcXG4gICAgICAgICAgICAgICAgY21wID0gbmV3IGphdmEubGFuZy5TdHJpbmcoc3BsaXQxW2ldKS5jb21wYXJlVG8obmV3IGphdmEubGFuZy5TdHJpbmcoc3BsaXQyW2ldKSk7XFxuICAgICAgICAgICAgICAgIC8vIGNtcCA9IHMxLmxvY2FsZUNvbXBhcmUoczIsICdlbicpXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgY21wID0gczEubG9jYWxlQ29tcGFyZShzMiwgJ3poJylcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuXFxuICAgICAgICBpZiAoY21wICE9PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGNtcDtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsZXQgbGVuZ3RoQ21wID0gc3BsaXQxLmxlbmd0aCAtIHNwbGl0Mi5sZW5ndGg7XFxuICAgIC8vIGlmIChsZW5ndGhDbXAgIT09IDApIGxlbmd0aENtcCA9IGxlbmd0aENtcCA+IDAgPyAtMSA6IDE7XFxuICAgIHJldHVybiBsZW5ndGhDbXA7XFxufVxcbiQuZXhwb3J0cy5uYW1lQ29tcGFyZSA9IG5hbWVDb21wYXJlO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi55m75b2V5pa55byPXCIsXCJwYXRoXCI6XCJsb2dpbk1vZGVcIixcInJ1bGVcIjpcIiQuZXhwb3J0cyA9ICQoW1xcXCJBUFDmjojmnYPnmbvlvZVcXFwiLCBcXFwi572R6aG155m75b2V4pGgXFxcIiwgXFxcIue9kemhteeZu+W9leKRoVxcXCIsIFxcXCJUT0tFTueZu+W9lVxcXCJdLCAxLCBcXFwi55m75b2V5pa55byPXFxcIikuc2VsZWN0KCgpID0+IHtcXG4gICAgaWYgKFxcXCLnvZHpobXnmbvlvZXikaBcXFwiID09IGlucHV0KSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/cGFnZVRpdGxlPeeZu+W9lemYv+mHjOS6keebmFxcXCJcXG4gICAgfVxcbiAgICBpZiAoXFxcIue9kemhteeZu+W9leKRoVxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9pbmRleD0wJnBhZ2VUaXRsZT3nmbvlvZXpmL/ph4zkupHnm5hcXFwiXFxuICAgIH1cXG4gICAgaWYgKFxcXCJBUFDmjojmnYPnmbvlvZVcXFwiID09IGlucHV0KSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9pbmRleD0tMSZwYWdlVGl0bGU955m75b2V6Zi/6YeM5LqR55uYXFxcIlxcbiAgICB9XFxuICAgIGlmIChcXFwiVE9LRU7nmbvlvZVcXFwiID09IGlucHV0KSB7XFxuICAgICAgICByZXR1cm4gJChcXFwiXFxcIiwgXFxcIui+k+WFpVRPS0VOXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBhbGlUb2tlbnNGaWxlcGF0aCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3Rva2VuUGF0aFxcXCIpLmFsaVRva2Vuc0ZpbGVwYXRoO1xcbiAgICAgICAgICAgIGxldCBhbGlUb2tlbiA9IHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogaW5wdXQudHJpbSgpXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoYWxpVG9rZW5zRmlsZXBhdGgsIEpTT04uc3RyaW5naWZ5KGFsaVRva2VuKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGlmIChcXFwi5Y6f55S755m75b2VXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2Uvb3BlbkFwaUxvZ2luI25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgfVxcbn0pO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Zi/6YeM6ZO+5o6l5Yy56YWNXCIsXCJwYXRoXCI6XCJhbGl0ZXN0XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgbWF0Y2hSZWcgPSAvaHR0cHM/OlxcXFwvXFxcXC93d3cuYWxpKHBhbnx5dW5kcml2ZSkuY29tXFxcXC9zXFxcXC9bYS16QS1aMC05XXsxMX0oXFxcXC9mb2xkZXJcXFxcL1thLXowLTldezQwfSk/LztcXG5sZXQgbWF0Y2hSZWdHID0gL2h0dHBzPzpcXFxcL1xcXFwvd3d3LmFsaShwYW58eXVuZHJpdmUpLmNvbVxcXFwvc1xcXFwvW2EtekEtWjAtOV17MTF9KFxcXFwvZm9sZGVyXFxcXC9bYS16MC05XXs0MH0pPy9nO1xcbmxldCB0ZXN0UmVnID0gL3d3dy5hbGkocGFufHl1bmRyaXZlKS5jb21cXFxcL3NcXFxcLy87XFxuJC5leHBvcnRzID0ge1xcbiAgICBtYXRjaEFsaVVybCh0ZXh0LCBpc0cpIHtcXG4gICAgICAgIGlmIChpc0cpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gdGV4dC5tYXRjaChtYXRjaFJlZ0cpO1xcbiAgICAgICAgICAgIGlmICh1cmwpIHJldHVybiB1cmw7XFxuICAgICAgICAgICAgZWxzZSByZXR1cm4gW107XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSB0ZXh0Lm1hdGNoKG1hdGNoUmVnKTtcXG4gICAgICAgICAgICByZXR1cm4gdXJsID0gdXJsICYmIHVybFswXSB8fCBcXFwiXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgdGVzdCh0ZXh0KXtcXG4gICAgICAgIHJldHVybiB0ZXN0UmVnLnRlc3QodGV4dCk7XFxuICAgIH1cXG59XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJvcGVuQXBp55m75b2VLeW6n+W8g1wiLFwicGF0aFwiOlwib3BlbkFwaUxvZ2luXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIm9wZW5BcGnnmbvlvZVcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcIkxvZ2dpbmdpblxcXCIpKTtcXG5cXG5sZXQgZCA9IFtdO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi54K55Ye76I635Y+W5omr56CB55m75b2V5LqM57u056CBXFxcIixcXG4gICAgZGVzYzogXFxcIueCueWHu+WbvueJh+WPr+S7peS/neWtmFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBjbHM6IFxcXCJsb2dpblxcXCIsXFxuICAgICAgICBpZDpcXFwiZ2V0UUNcXFwiXFxuICAgIH0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiTG9nZ2luZ2luXFxcIiwgXFxcInRydWVcXFwiKTtcXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjojrflj5bkuoznu7TnoIFcXFwiKTtcXG5cXG4gICAgICAgIGZ1bmN0aW9uIGdldF9xcmNvZGVfc3RhdHVzKHNpZCkge1xcbiAgICAgICAgICAgIGxldCByZXMgPSBmZXRjaChcXFwiaHR0cHM6Ly9vcGVuYXBpLmFsaXl1bmRyaXZlLmNvbS9vYXV0aC9xcmNvZGUvXFxcIiArIHNpZCArIFxcXCIvc3RhdHVzXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGZ1bmN0aW9uIGdldF9yZWZyZXNoX3Rva2VuKGNvZGUpIHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gcG9zdChcXFwiaHR0cHM6Ly9hbGl5dW5kcml2ZS1vYXV0aC5tZXNzZW5zZS5tZS9vYXV0aC9hY2Nlc3NfdG9rZW5cXFwiLCB7XFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJncmFudF90eXBlXFxcIjogXFxcImF1dGhvcml6YXRpb25fY29kZVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiY29kZVxcXCI6IGNvZGUsXFxuICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXMpO1xcbiAgICAgICAgICAgIHJldHVybiBkYXRhW1xcXCJyZWZyZXNoX3Rva2VuXFxcIl07XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcmVzID0gcG9zdChcXFwiaHR0cHM6Ly9hbGl5dW5kcml2ZS1vYXV0aC5tZXNzZW5zZS5tZS9vYXV0aC9hdXRob3JpemUvcXJjb2RlXFxcIiwge1xcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInNjb3Blc1xcXCI6IFtcXFwidXNlcjpiYXNlXFxcIiwgXFxcImZpbGU6YWxsOnJlYWRcXFwiLCBcXFwiZmlsZTphbGw6d3JpdGVcXFwiXSxcXG4gICAgICAgICAgICAgICAgXFxcIndpZHRoXFxcIjogMzAwLFxcbiAgICAgICAgICAgICAgICBcXFwiaGVpZ2h0XFxcIjogMzAwLFxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzKTtcXG4gICAgICAgIGxldCBzaWQgPSBkYXRhW1xcXCJzaWRcXFwiXTtcXG4gICAgICAgIGxldCBxcmNvZGVfdXJsID0gZGF0YVtcXFwicXJDb2RlVXJsXFxcIl07XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJpbmZvT3V0cHV0XFxcIiwge1xcbiAgICAgICAgICAgIHBpY191cmw6IHFyY29kZV91cmwsXFxuICAgICAgICAgICAgdXJsOiBxcmNvZGVfdXJsICsgXFxcIiMuanBnXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInBpY18xX2Z1bGxcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGFkZEl0ZW1BZnRlcihcXFwiaW5mb091dHB1dFxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAmOKAmOKAmeKAmVxcXCIgKyBcXFwi5L2/55So6Zi/6YeM5LqR55uYIEFwcCDmiavnoIFcXFwiLmZvbnRjb2xvcihcXFwiZ3JleVxcXCIpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgY2xzOiBcXFwibG9naW5cXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBkZWxldGVJdGVtKFxcXCJnZXRRQ1xcXCIpO1xcbiAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgIGxldCByZWZyZXNoX3Rva2VuO1xcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcXG4gICAgICAgICAgICBsZXQgZGF0YTtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBkYXRhID0gZ2V0X3FyY29kZV9zdGF0dXMoc2lkKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mn6Xor6LmiavnoIHnu5PmnpzotoXml7YsIOWPr+iDveaYr+inpuWPkeS6humYv+mHjOS6keebmOaOpeWPo+mZkOWItiwg6K+356iN5ZCO5YaN6K+VLlxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBzdGF0dXMgPSBkYXRhW1xcXCJzdGF0dXNcXFwiXTtcXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09IFxcXCJMb2dpblN1Y2Nlc3NcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW4gPSBnZXRfcmVmcmVzaF90b2tlbihkYXRhW1xcXCJhdXRoQ29kZVxcXCJdKTtcXG4gICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBcXFwiUVJDb2RlRXhwaXJlZFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S6jOe7tOeggeW3sui/h+acnywg6K+35Yi35paw6aG16Z2i5ZCO6YeN6K+VXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKCFnZXRNeVZhcihcXFwiTG9nZ2luZ2luXFxcIiwgXFxcIlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9jYW5jZWxcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDE1MDApO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHJlZnJlc2hfdG9rZW4pIHtcXG4gICAgICAgICAgICBjb25zdCB7XFxuICAgICAgICAgICAgICAgIG9wZW5Ub2tlbnNGaWxlcGF0aCxcXG4gICAgICAgICAgICB9ID0gJC5yZXF1aXJlKFxcXCJ0b2tlblBhdGhcXFwiKTtcXG4gICAgICAgICAgICBsZXQgb3BlbiA9IHtcXG4gICAgICAgICAgICAgICAgUmVmcmVzaFRva2VuT3BlbjogcmVmcmVzaF90b2tlbixcXG4gICAgICAgICAgICAgICAgaXNWMjogdHJ1ZVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgd3JpdGVGaWxlKG9wZW5Ub2tlbnNGaWxlcGF0aCwgSlNPTi5zdHJpbmdpZnkob3BlbikpO1xcbiAgICAgICAgICAgIGFkZEl0ZW1BZnRlcihcXFwiaW5mb091dHB1dFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnmbvlvZXmiJDlip8o54K55Ye76L+U5ZueKVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDokKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICAgICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFwibG9naW5cXFwiKTtcXG5cXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vc3VjY2Vzc1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vZmFpbFxcXCI7XFxuICAgIH0pXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogXFxcImluZm9PdXRwdXRcXFwiLFxcbiAgICAgICAgY2xzOiBcXFwibG9naW5cXFwiXFxuICAgIH1cXG59KTtcXG5cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJvcGVuQXBpOmFsaXN0XCIsXCJwYXRoXCI6XCJvcGVuQXBpX2FsaXN0XCIsXCJydWxlXCI6XCJcXG5mdW5jdGlvbiBPcGVuQXBpQWxpc3QoJHRoaXMpIHtcXG4gICAgdGhpcy4kdGhpcyA9ICR0aGlzO1xcbn1cXG5PYmplY3QuYXNzaWduKE9wZW5BcGlBbGlzdC5wcm90b3R5cGUsIHtcXG4gICAgZ2V0T3BlblRva2VuQ29kZSgpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLiR0aGlzLnBvc3RBcGkoJ2h0dHBzOi8vb3Blbi5hbGl5dW5kcml2ZS5jb20vb2F1dGgvdXNlcnMvYXV0aG9yaXplP2NsaWVudF9pZD0nICsgJzc2OTE3Y2NjY2Q0NDQxYzM5NDU3YTA0ZjYwODRmYjJmJyArICcmcmVkaXJlY3RfdXJpPWh0dHBzOi8vYWxpc3Qubm4uY2kvdG9vbC9hbGl5dW5kcml2ZS9jYWxsYmFjaycgKyAnJnNjb3BlPXVzZXI6YmFzZSxmaWxlOmFsbDpyZWFkLGZpbGU6YWxsOndyaXRlJnN0YXRlPScpLmJvZHkoe1xcbiAgICAgICAgICAgIFxcXCJhdXRob3JpemVcXFwiOiAxLFxcbiAgICAgICAgICAgIFxcXCJzY29wZVxcXCI6IFxcXCJ1c2VyOmJhc2UsZmlsZTphbGw6cmVhZCxmaWxlOmFsbDp3cml0ZVxcXCJcXG4gICAgICAgIH0pLmhlYWRlcnMoe1xcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogUENfVUEsXFxuICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLycsXFxuICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGssIC8vZ2V0QWNjZXNzVG9rZW5cXG4gICAgICAgICAgICAneC1jYW5hcnknOiAnY2xpZW50PXdlYixhcHA9c2hhcmUsdmVyc2lvbj12Mi4zLjEnLFxcbiAgICAgICAgICAgICd4LXNoYXJlLXRva2VuJzogdGhpcy4kdGhpcy5zaGFyZVRva2VuXFxuICAgICAgICB9KS5lcnJvcldpdGhSZXRyeSgoZSxfLGh0dHApID0+IHtcXG4gICAgICAgICAgICB0aGlzLiR0aGlzLnRyeVNvbHZlKGUpO1xcbiAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdhdXRob3JpemF0aW9uJzogdGhpcy4kdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtc2hhcmUtdG9rZW4nOiB0aGlzLiR0aGlzLnNoYXJlVG9rZW5cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICBsZXQgY29kZSA9IHJlc3VsdC5yZWRpcmVjdFVyaS5zcGxpdChcXFwiY29kZT1cXFwiKVsxXTtcXG4gICAgICAgIHJldHVybiBjb2RlO1xcbiAgICB9LFxcbiAgICBnZXRUb2tlbihib2R5KSB7XFxuICAgICAgICBsZXQganNvbiA9IHBvc3QoJ2h0dHBzOi8vYXBpLnhob2ZlLnRvcC9hbGlzdC9hbGlfb3Blbi9jb2RlJywge1xcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXG4gICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLydcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBpZiAoIWpzb24pIHtcXG4gICAgICAgICAgICBqc29uID0gcG9zdCgnaHR0cHM6Ly9hcGktY2Yubm4uY2kvYWxpc3QvYWxpX29wZW4vY29kZScsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoanNvbi5pbmNsdWRlcygnVG9vIE1hbnkgUmVxdWVzdHMnKSB8fCBqc29uLmluY2x1ZGVzKFxcXCI1MDIgQmFkIEdhdGV3YXlcXFwiKSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6aKR57mB6K+35rGC5pqC5pe26KKr5bCB56aBXFxcXG5cXFwiICsganNvbik7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCBvcGVuUmVzdWx0ID0gSlNPTi5wYXJzZShqc29uKTtcXG4gICAgICAgICAgICByZXR1cm4gb3BlblJlc3VsdDtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgZ2V0T3BlblRva2VuKCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW4oe1xcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuZ2V0T3BlblRva2VuQ29kZSgpLFxcbiAgICAgICAgICAgIGdyYW50X3R5cGU6IFxcXCJhdXRob3JpemF0aW9uX2NvZGVcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgcmVmcmVzaE9wZW5Ub2tlbigpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKHtcXG4gICAgICAgICAgICBncmFudF90eXBlOiBcXFwicmVmcmVzaF90b2tlblxcXCIsXFxuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogdGhpcy4kdGhpcy5vcGVuVG9rZW5zLlJlZnJlc2hUb2tlbk9wZW4sXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IE9wZW5BcGlBbGlzdDtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIm9wZW5BcGk6YWxpeXVuZHJpdmVcIixcInBhdGhcIjpcIm9wZW5BcGlfYWxpeXVuZHJpdmVcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIE9wZW5BcGkoJHRoaXMsIHBvc3RBcGkpIHtcXG4gICAgdGhpcy4kdGhpcyA9ICR0aGlzO1xcbn1cXG5cXG5PYmplY3QuYXNzaWduKE9wZW5BcGkucHJvdG90eXBlLCB7XFxuICAgIGdldE9wZW5Ub2tlbkNvZGUoKSB7XFxuICAgICAgICBmdW5jdGlvbiBnZXRfcXJjb2RlX2NvZGUoc2lkKSB7XFxuICAgICAgICAgICAgbGV0IHJlcyA9IGZldGNoKFxcXCJodHRwczovL29wZW5hcGkuYWxpeXVuZHJpdmUuY29tL29hdXRoL3FyY29kZS9cXFwiICsgc2lkICsgXFxcIi9zdGF0dXNcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXMpLmF1dGhDb2RlO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgbGV0IHJlcyA9IHBvc3QoXFxcImh0dHBzOi8vYWxpeXVuZHJpdmUtb2F1dGgubWVzc2Vuc2UubWUvb2F1dGgvYXV0aG9yaXplL3FyY29kZVxcXCIsIHtcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJzY29wZXNcXFwiOiBbXFxcInVzZXI6YmFzZVxcXCIsIFxcXCJmaWxlOmFsbDpyZWFkXFxcIiwgXFxcImZpbGU6YWxsOndyaXRlXFxcIl0sXFxuICAgICAgICAgICAgICAgIFxcXCJ3aWR0aFxcXCI6IDMwMCxcXG4gICAgICAgICAgICAgICAgXFxcImhlaWdodFxcXCI6IDMwMCxcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlcyk7XFxuICAgICAgICBsZXQgc2lkID0gZGF0YVtcXFwic2lkXFxcIl07XFxuICAgICAgICBsZXQgYm9keSA9IHtcXG4gICAgICAgICAgICBcXFwiYXV0aG9yaXplXFxcIjogMSxcXG4gICAgICAgICAgICBcXFwic2NvcGVcXFwiOiBcXFwidXNlcjpiYXNlLGZpbGU6YWxsOnJlYWQsZmlsZTphbGw6d3JpdGVcXFwiLFxcbiAgICAgICAgICAgIFxcXCJkcml2ZXNcXFwiOiBbXFxcImJhY2t1cFxcXCIsIFxcXCJyZXNvdXJjZVxcXCJdLFxcbiAgICAgICAgICAgIFxcXCJzY29wZXNcXFwiOiBbXFxcInVzZXI6YmFzZVxcXCIsIFxcXCJmaWxlOmFsbDpyZWFkXFxcIiwgXFxcImZpbGU6YWxsOndyaXRlXFxcIl0sXFxuICAgICAgICAgICAgXFxcInNpZFxcXCI6IHNpZFxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB7XFxuICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGtcXG4gICAgICAgIH07XFxuICAgICAgICBsZXQgcmVzMiA9IHRoaXMuJHRoaXMucG9zdEFwaShcXFwiaHR0cHM6Ly9vcGVuLmFsaXl1bmRyaXZlLmNvbS9vYXV0aC91c2Vycy9xcmNvZGUvYXV0aG9yaXplP3NpZD1cXFwiICsgc2lkKS5ib2R5KGJvZHkpLmhlYWRlcnMoaGVhZGVycykuZXJyb3JXaXRoUmV0cnkoKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICB0aGlzLiR0aGlzLnRyeVNvbHZlKGUpO1xcbiAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdhdXRob3JpemF0aW9uJzogdGhpcy4kdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIHJldHVybiBnZXRfcXJjb2RlX2NvZGUoc2lkKTtcXG4gICAgfSxcXG4gICAgZ2V0VG9rZW4oYm9keSkge1xcbiAgICAgICAgbGV0IHJlcyA9IHBvc3QoXFxcImh0dHBzOi8vYWxpeXVuZHJpdmUtb2F1dGgubWVzc2Vuc2UubWUvb2F1dGgvYWNjZXNzX3Rva2VuXFxcIiwge1xcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzKTtcXG5cXG4gICAgICAgIHJldHVybiBkYXRhO1xcbiAgICB9LFxcbiAgICBnZXRPcGVuVG9rZW4oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbih7XFxuICAgICAgICAgICAgY29kZTogdGhpcy5nZXRPcGVuVG9rZW5Db2RlKCksXFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogXFxcImF1dGhvcml6YXRpb25fY29kZVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcbiAgICByZWZyZXNoT3BlblRva2VuKCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW4oe1xcbiAgICAgICAgICAgIGdyYW50X3R5cGU6IFxcXCJyZWZyZXNoX3Rva2VuXFxcIixcXG4gICAgICAgICAgICByZWZyZXNoX3Rva2VuOiB0aGlzLiR0aGlzLm9wZW5Ub2tlbnMuUmVmcmVzaFRva2VuT3BlbixcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzID0gT3BlbkFwaTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIm9wZW5BcGk6dHZib3hcIixcInBhdGhcIjpcIm9wZW5BcGlfdHZib3hcIixcInJ1bGVcIjpcImZ1bmN0aW9uIE9wZW5BcGkoJHRoaXMpIHtcXG4gICAgdGhpcy4kdGhpcyA9ICR0aGlzO1xcbn1cXG5cXG5PYmplY3QuYXNzaWduKE9wZW5BcGkucHJvdG90eXBlLCB7XFxuICAgIGdldE9wZW5Ub2tlbkNvZGUoKSB7XFxuICAgICAgICBmdW5jdGlvbiBnZXRfcXJjb2RlX2NvZGUoc2lkKSB7XFxuICAgICAgICAgICAgbGV0IHJlcyA9IGZldGNoKFxcXCJodHRwczovL29wZW5hcGkuYWxpeXVuZHJpdmUuY29tL29hdXRoL3FyY29kZS9cXFwiICsgc2lkICsgXFxcIi9zdGF0dXNcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXMpLmF1dGhDb2RlO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgbGV0IHJlcyA9IGZldGNoKFxcXCJodHRwOi8vMTU5Ljc1LjIwOC40Ny9jbG91ZGlzay9hcGkvb2F1dGgvYXV0aG9yaXplL3FyY29kZVxcXCIpO1xcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlcyk7XFxuICAgICAgICBsZXQgc2lkID0gZGF0YVtcXFwic2lkXFxcIl07XFxuICAgICAgICBsZXQgYm9keSA9IHtcXG4gICAgICAgICAgICBcXFwiYXV0aG9yaXplXFxcIjogMSxcXG4gICAgICAgICAgICBcXFwic2NvcGVcXFwiOiBcXFwidXNlcjpiYXNlLGZpbGU6YWxsOnJlYWQsZmlsZTphbGw6d3JpdGVcXFwiLFxcbiAgICAgICAgICAgIFxcXCJkcml2ZXNcXFwiOiBbXFxcImJhY2t1cFxcXCIsIFxcXCJyZXNvdXJjZVxcXCJdLFxcbiAgICAgICAgICAgIFxcXCJzY29wZXNcXFwiOiBbXFxcInVzZXI6YmFzZVxcXCIsIFxcXCJmaWxlOmFsbDpyZWFkXFxcIiwgXFxcImZpbGU6YWxsOndyaXRlXFxcIl0sXFxuICAgICAgICAgICAgXFxcInNpZFxcXCI6IHNpZFxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB7XFxuICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGtcXG4gICAgICAgIH07XFxuICAgICAgICBsZXQgcmVzMiA9IHRoaXMuJHRoaXMucG9zdEFwaShcXFwiaHR0cHM6Ly9vcGVuLmFsaXl1bmRyaXZlLmNvbS9vYXV0aC91c2Vycy9xcmNvZGUvYXV0aG9yaXplP3NpZD1cXFwiICsgc2lkKS5ib2R5KGJvZHkpLmhlYWRlcnMoaGVhZGVycykuZXJyb3JXaXRoUmV0cnkoKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICB0aGlzLiR0aGlzLnRyeVNvbHZlKGUpO1xcbiAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdhdXRob3JpemF0aW9uJzogdGhpcy4kdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIHJldHVybiBnZXRfcXJjb2RlX2NvZGUoc2lkKTtcXG4gICAgfSxcXG4gICAgZ2V0VG9rZW4oYm9keSkge1xcbiAgICAgICAgbGV0IHVybCA9IFxcXCJcXFwiO1xcbiAgICAgICAgaWYgKGJvZHkuY29kZSkge1xcbiAgICAgICAgICAgIHVybCA9IGJ1aWxkVXJsKFxcXCJodHRwOi8vMTU5Ljc1LjIwOC40Ny9jbG91ZGlzay9hcGkvb2F1dGgvYWNjZXNzVG9rZW5cXFwiLCB7XFxuICAgICAgICAgICAgICAgIGF1dGhDb2RlOiBib2R5LmNvZGVcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdXJsID0gYnVpbGRVcmwoXFxcImh0dHA6Ly8xNTkuNzUuMjA4LjQ3L2Nsb3VkaXNrL2FwaS9vYXV0aC9hY2Nlc3NUb2tlblxcXCIsIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFRva2VuOiBib2R5LnJlZnJlc2hfdG9rZW5cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXMgPSBmZXRjaCh1cmwpO1xcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlcyk7XFxuICAgICAgICBsZXQgcmV0ID0ge1xcbiAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IGRhdGEucmVmcmVzaFRva2VuLFxcbiAgICAgICAgICAgIHRva2VuX3R5cGU6IGRhdGEudG9rZW5UeXBlLFxcbiAgICAgICAgICAgIGFjY2Vzc190b2tlbjogZGF0YS5hY2Nlc3NUb2tlblxcbiAgICAgICAgfTtcXG4gICAgICAgIHJldHVybiByZXQ7XFxuICAgIH0sXFxuICAgIGdldE9wZW5Ub2tlbigpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKHtcXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmdldE9wZW5Ub2tlbkNvZGUoKSxcXG4gICAgICAgICAgICBncmFudF90eXBlOiBcXFwiYXV0aG9yaXphdGlvbl9jb2RlXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIHJlZnJlc2hPcGVuVG9rZW4oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbih7XFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogXFxcInJlZnJlc2hfdG9rZW5cXFwiLFxcbiAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHRoaXMuJHRoaXMub3BlblRva2Vucy5SZWZyZXNoVG9rZW5PcGVuLFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59KTtcXG4kLmV4cG9ydHMgPSBPcGVuQXBpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwib3BlbkFwaTpYQllcIixcInBhdGhcIjpcIm9wZW5BcGlfWEJZXCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBPcGVuQXBpKCR0aGlzLCBwb3N0QXBpKSB7XFxuICAgIHRoaXMuJHRoaXMgPSAkdGhpcztcXG59XFxuXFxuT2JqZWN0LmFzc2lnbihPcGVuQXBpLnByb3RvdHlwZSwge1xcbiAgICBjbGllbnRfc2VjcmV0OiBcXFwiNjNmMDZjM2M1YzVkNGUxMTk2ZTJjMTNlODU4OGFlMjlcXFwiLFxcbiAgICBjbGllbnRfaWQ6IFxcXCJkZjQzZTIyZjAyMmQ0YzA0YjZlMjk5NjRmM2I4YjQ2ZFxcXCIsXFxuICAgIGdldE9wZW5Ub2tlbkNvZGUoKSB7XFxuICAgICAgICBmdW5jdGlvbiBnZXRfcXJjb2RlX2NvZGUoc2lkKSB7XFxuICAgICAgICAgICAgbGV0IHJlcyA9IGZldGNoKFxcXCJodHRwczovL29wZW5hcGkuYWxpeXVuZHJpdmUuY29tL29hdXRoL3FyY29kZS9cXFwiICsgc2lkICsgXFxcIi9zdGF0dXNcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXMpLmF1dGhDb2RlO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgbGV0IHJlcyA9IHBvc3QoXFxcImh0dHBzOi8vb3BlbmFwaS5hbGl5dW5kcml2ZS5jb20vb2F1dGgvYXV0aG9yaXplL3FyY29kZVxcXCIsIHtcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJzY29wZXNcXFwiOiBbXFxcInVzZXI6YmFzZVxcXCIsIFxcXCJmaWxlOmFsbDpyZWFkXFxcIiwgXFxcImZpbGU6YWxsOndyaXRlXFxcIl0sXFxuICAgICAgICAgICAgICAgIFxcXCJjbGllbnRfc2VjcmV0XFxcIjogdGhpcy5jbGllbnRfc2VjcmV0LFxcbiAgICAgICAgICAgICAgICBcXFwiY2xpZW50X2lkXFxcIjogdGhpcy5jbGllbnRfaWQsXFxuICAgICAgICAgICAgICAgIFxcXCJ3aWR0aFxcXCI6IDM1MCxcXG4gICAgICAgICAgICAgICAgXFxcImhlaWdodFxcXCI6IDM1MCxcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlcyk7XFxuICAgICAgICBsZXQgc2lkID0gZGF0YVtcXFwic2lkXFxcIl07XFxuICAgICAgICBsZXQgYm9keSA9IHtcXG4gICAgICAgICAgICBcXFwiYXV0aG9yaXplXFxcIjogMSxcXG4gICAgICAgICAgICBcXFwic2NvcGVcXFwiOiBcXFwidXNlcjpiYXNlLGZpbGU6YWxsOnJlYWQsZmlsZTphbGw6d3JpdGVcXFwiLFxcbiAgICAgICAgICAgIFxcXCJkcml2ZXNcXFwiOiBbXFxcImJhY2t1cFxcXCIsIFxcXCJyZXNvdXJjZVxcXCJdLFxcbiAgICAgICAgICAgIFxcXCJzY29wZXNcXFwiOiBbXFxcInVzZXI6YmFzZVxcXCIsIFxcXCJmaWxlOmFsbDpyZWFkXFxcIiwgXFxcImZpbGU6YWxsOndyaXRlXFxcIl0sXFxuICAgICAgICAgICAgXFxcInNpZFxcXCI6IHNpZFxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB7XFxuICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGtcXG4gICAgICAgIH07XFxuICAgICAgICBsZXQgcmVzMiA9IHRoaXMuJHRoaXMucG9zdEFwaShcXFwiaHR0cHM6Ly9vcGVuLmFsaXl1bmRyaXZlLmNvbS9vYXV0aC91c2Vycy9xcmNvZGUvYXV0aG9yaXplP3NpZD1cXFwiICsgc2lkKS5ib2R5KGJvZHkpLmhlYWRlcnMoaGVhZGVycykuZXJyb3JXaXRoUmV0cnkoKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICB0aGlzLiR0aGlzLnRyeVNvbHZlKGUpO1xcbiAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdhdXRob3JpemF0aW9uJzogdGhpcy4kdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIHJldHVybiBnZXRfcXJjb2RlX2NvZGUoc2lkKTtcXG4gICAgfSxcXG4gICAgZ2V0VG9rZW4oYm9keSkge1xcbiAgICAgICAgbGV0IHJlcyA9IHBvc3QoXFxcImh0dHBzOi8vb3BlbmFwaS5hbGl5dW5kcml2ZS5jb20vb2F1dGgvYWNjZXNzX3Rva2VuXFxcIiwge1xcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzKTtcXG5cXG4gICAgICAgIHJldHVybiBkYXRhO1xcbiAgICB9LFxcbiAgICBnZXRPcGVuVG9rZW4oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbih7XFxuICAgICAgICAgICAgY29kZTogdGhpcy5nZXRPcGVuVG9rZW5Db2RlKCksXFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogXFxcImF1dGhvcml6YXRpb25fY29kZVxcXCIsXFxuICAgICAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jbGllbnRfc2VjcmV0LFxcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRfaWQsXFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgcmVmcmVzaE9wZW5Ub2tlbigpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKHtcXG4gICAgICAgICAgICBncmFudF90eXBlOiBcXFwicmVmcmVzaF90b2tlblxcXCIsXFxuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogdGhpcy4kdGhpcy5vcGVuVG9rZW5zLlJlZnJlc2hUb2tlbk9wZW4sXFxuICAgICAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jbGllbnRfc2VjcmV0LFxcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRfaWQsXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IE9wZW5BcGk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpk77mjqXlrprlkJFcIixcInBhdGhcIjpcInJlZGlyZWN0XCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBvcGVuTW9kZSA9IGdldEl0ZW0oXFxcIm9wZW5Nb2RlXFxcIiwgXFxcIuacrOWcsOino+aekFxcXCIpO1xcblxcbmZ1bmN0aW9uIGRlYWxBcnJheShhcnJheSkge1xcbiAgICBsZXQgaXNTdHJpbmcgPSB0eXBlb2YgYXJyYXlbMF0gPT09IFxcXCJzdHJpbmdcXFwiO1xcbiAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XFxuICAgICAgICByZXR1cm4gZGVhbFJlc3VsdChhcnJheVswXSk7XFxuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcpIHtcXG4gICAgICAgIGFycmF5ID0gYXJyYXkubWFwKGFsaVVybCA9PiAoe1xcbiAgICAgICAgICAgIGFsaVVybFxcbiAgICAgICAgfSkpO1xcbiAgICB9XFxuICAgIGxldCBzZWxlY3QgPSBhcnJheS5tYXAoKHYsIGkpID0+IHYudGl0bGUgfHwgdi5hbGlVcmwucmVwbGFjZSgvaHR0cC4qP1xcXFwvc1xcXFwvLywgXFxcIlxcXCIpKTtcXG4gICAgcmV0dXJuICQoc2VsZWN0KS5zZWxlY3QoKHJlc3VsdCkgPT4ge1xcbiAgICAgICAgbGV0IGluZGV4ID0gTVlfSU5ERVg7XFxuICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJyZWRpcmVjdFxcXCIpLmRlYWxSZXN1bHQocmVzdWx0W2luZGV4XSk7XFxuICAgIH0sIGFycmF5KTtcXG59XFxuXFxuZnVuY3Rpb24gZGVhbFJlc3VsdChyZXN1bHQpIHtcXG4gICAgbGV0IHJlc3VsdFR5cGUgPSB0eXBlb2YgcmVzdWx0O1xcbiAgICBpZiAocmVzdWx0VHlwZSA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgIHJldHVybiBnZXRNb2RlVXJsKHJlc3VsdCk7XFxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XFxuICAgICAgICByZXR1cm4gZGVhbEFycmF5KHJlc3VsdCk7XFxuICAgIH0gZWxzZSBpZihyZXN1bHQgaW5zdGFuY2VvZiBFYXN5TmV4dFBhZ2Upe1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdC50b05leHRQYWdlKCk7XFxuICAgIH1lbHNlIGlmIChyZXN1bHRUeXBlID09PSBcXFwib2JqZWN0XFxcIikge1xcbiAgICAgICAgcmV0dXJuIGdldE1vZGVVcmwocmVzdWx0LmFsaVVybCwgcmVzdWx0LnNoYXJlUHdkKTtcXG4gICAgfVxcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8v6ZSZ6K+v57G75Z6L77yaXFxcIiArIHJlc3VsdFR5cGU7XFxufVxcblxcbmZ1bmN0aW9uIEVhc3lOZXh0UGFnZShsaXN0LCBjb2wpIHtcXG4gICAgLy90aGlzLmxpc3QgPSBsaXN0O1xcbiAgICBjb2wgPSBjb2x8fFxcXCJ0ZXh0XzNcXFwiO1xcbiAgICB0aGlzLnRvTmV4dFBhZ2UgPSBmdW5jdGlvbigpe1xcbiAgICAgICAgcmV0dXJuICQoKS5ydWxlKChsaXN0LCBjb2xfdHlwZSk9PntcXG4gICAgICAgICAgICBzZXRSZXN1bHQobGlzdC5tYXAodj0+KHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGUsXFxuICAgICAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKHY9PiQucmVxdWlyZShcXFwicmVkaXJlY3RcXFwiKS5kZWFsUmVzdWx0KHYpLCB2KSxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHYudGl0bGUgfHwgdi5hbGlVcmwucmVwbGFjZSgvaHR0cC4qP1xcXFwvc1xcXFwvLywgXFxcIlxcXCIpXFxuICAgICAgICAgICAgfSkpKTtcXG4gICAgICAgIH0sIGxpc3QsIGNvbCk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gc2V0RXJyb3JQb3AobmFtZSkge1xcbiAgICByZXR1cm4gJChcXFwi5pCc57Si5byV5pOO44CMXFxcIiArIG5hbWUgKyBcXFwi44CN5aSx5pWI6K+36IGU57O75pCc57Si5byV5pOO5L2c6ICF5L+u5aSN5oiW5Yig6ZmkXFxcXG5cXFxcbuW8leaTjuS9nOiAheWPr+S7peWOu+WumOaWuemikemBk+ivoumXrlxcXFxu54K55Ye756Gu5a6a5b+r6YCf5Yig6ZmkXFxcIikuY29uZmlybSgobmFtZSkgPT4ge1xcbiAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmuKnppqjmj5DnpLpcXFwiLFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLnoa7lrpropoHliKDpmaRcXFwiICsgbmFtZSArIFxcXCLlkJfvvJ/ms6jmhI/liKDpmaTlkI7ml6Dms5XmgaLlpI1cXFwiLFxcbiAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKG5hbWUpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gYXJyLmZpbmRJbmRleCh2ID0+IHYubmFtZSA9PT0gbmFtZSk7XFxuICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcInJ1bGVcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0sIG5hbWUpXFxuICAgICAgICB9KTtcXG4gICAgfSwgbmFtZSk7XFxufVxcblxcbmZ1bmN0aW9uIGRvdWJsZVRyZWF0aW5nKHtcXG4gICAgZmluZEFsaVVybCxcXG4gICAgYmFzaWNVcmwsXFxuICAgIG5hbWUsXFxuICAgIGFsaVVybFxcbn0pIHtcXG4gICAgaWYgKCFmaW5kQWxpVXJsKSByZXR1cm4gZ2V0TW9kZVVybChhbGlVcmwpO1xcbiAgICBmaW5kQWxpVXJsID0gbmV3IEZ1bmN0aW9uKFxcXCJpbnB1dFxcXCIsIFxcXCJiYXNpY1VybFxcXCIsIFxcXCJFYXN5TmV4dFBhZ2VcXFwiLCBmaW5kQWxpVXJsKTtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBmaW5kQWxpVXJsKGFsaVVybCwgYmFzaWNVcmwsIEVhc3lOZXh0UGFnZSk7XFxuICAgICAgICByZXR1cm4gZGVhbFJlc3VsdChyZXN1bHQpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIHJldHVybiBzZXRFcnJvclBvcChuYW1lKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZXRNb2RlVXJsKGFsaVVybCwgc2hhcmVQd2QpIHtcXG4gICAgaWYgKCQucmVxdWlyZShcXFwiYWxpdGVzdFxcXCIpLnRlc3QoYWxpVXJsKSkge1xcbiAgICAgICAgaWYgKG9wZW5Nb2RlID09PSBcXFwi5pys5Zyw6Kej5p6QXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9wYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYWxpVXJsKSArIFxcXCImc2hhcmVQd2Q9XFxcIiArIChzaGFyZVB3ZCB8fCBcXFwiXFxcIik7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNoYXJlSWQgPSBhbGlVcmwuc3BsaXQoXFxcIi9cXFwiKVs0XTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInNtYXJ0ZHJpdmU6Ly9zaGFyZS9icm93c2U/c2hhcmVJZD1cXFwiICsgc2hhcmVJZCArIFxcXCImc2hhcmVQd2Q9XFxcIiArIChzaGFyZVB3ZCB8fCBcXFwiXFxcIik7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoYWxpVXJsLmluY2x1ZGVzKFxcXCJwYW4ucXVhcmsuY24vcy9cXFwiKSkge1xcbiAgICAgICAgaWYgKG9wZW5Nb2RlID09PSBcXFwi5pys5Zyw6Kej5p6QXFxcIikge1xcbiAgICAgICAgICAgIGxldCBoYXMgPSBmZXRjaChcXFwiaGlrZXI6Ly9ob21lQFF1YXJrLueugFxcXCIpICE9IFxcXCJudWxsXFxcIjtcXG4gICAgICAgICAgICBpZiAoaGFzKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3F1YXJrTGlzdD9ydWxlPVF1YXJrLueugCZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYWxpVXJsKSArIFxcXCImc2hhcmVQd2Q9XFxcIiArIChzaGFyZVB3ZCB8fCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsaVVybDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwicWtsaW5rOi8vd3d3LnVjLmNuL2IyMGI4NGZkNzM1YThkZDNmNzU0MTEyOWJhY2M0ZTlhP2FjdGlvbj1vcGVuX3VybCZ1cmw9XFxcIiArIGFsaVVybDtcXG4gICAgICAgIH1cXG4gICAgfSBlbHNlIGlmIChhbGlVcmwuc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICByZXR1cm4gXFxcIndlYjovL1xcXCIgKyBhbGlVcmw7XFxuICAgIH0gZWxzZSBpZiAoYWxpVXJsLnN0YXJ0c1dpdGgoXFxcIm1hZ25ldFxcXCIpKSB7XFxuICAgICAgICBpZiAob3Blbk1vZGUgPT09IFxcXCLmnKzlnLDop6PmnpBcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGFsaVVybDtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJkb3dubG9hZDovL1xcXCIgKyBhbGlVcmw7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gYWxpVXJsO1xcbiAgICB9XFxufVxcbiQuZXhwb3J0cy5nZXRNb2RlVXJsID0gZ2V0TW9kZVVybDtcXG4kLmV4cG9ydHMuZG91YmxlVHJlYXRpbmcgPSBkb3VibGVUcmVhdGluZztcXG4kLmV4cG9ydHMuZGVhbFJlc3VsdCA9IGRlYWxSZXN1bHQ7XCJ9XSIsImljb24iOiIiLCJwcm94eSI6IiJ9
Add Comment
Please, Sign In to add comment