xiaomianao666

小程序:CliCli

Mar 25th, 2024
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@CliCli@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoiQ2xpQ2xpIiwiYXV0aG9yIjoi6JOd6I6T5p6c6YWxVVgmMTUzJueLl+a1qeWViiZ6ZXRhbHBoYSZSIiwidXJsIjoiaGlrZXI6Ly9lbXB0eSMjaHR0cHM6Ly93d3cuY2xpY2xpLndhbmcvIiwidmVyc2lvbiI6MjAyMzExMjQsImNvbF90eXBlIjoibW92aWVfMyIsImNsYXNzX25hbWUiOiIiLCJ0eXBlIjoidmlkZW8iLCJjbGFzc191cmwiOiIiLCJhcmVhX25hbWUiOiIiLCJhcmVhX3VybCI6IiIsInNvcnRfbmFtZSI6IiIsInllYXJfbmFtZSI6IiIsInNvcnRfdXJsIjoiIiwieWVhcl91cmwiOiIiLCJmaW5kX3J1bGUiOiJqczpcbnZhciBkID0gW107XG5cbk1ZX1VSTCA9IE1ZX1VSTC5yZXBsYWNlKCdoaWtlcjovL2VtcHR5IyMnLCAnJyk7XG52YXIgaHRtbCA9IGZldGNoKE1ZX1VSTCk7XG4vKlxuY29uc3QgaG9zdCA9ICdodHRwczovL3d3dy5jbGljbGkud2FuZy8nO1xudmFyIGh0bWwgPSBmZXRjaChob3N0LCB7XG4gICAgaGVhZGVyczoge1xuICAgICAgICAnVXNlci1BZ2VudCc6IE1PQklMRV9VQVxuICAgIH1cbn0pOyovXG5cbi8v5qCH6aKYLOaPj+i/sCzlm77niYcs6ZO+5o6lXG52YXIg5qCH6aKYID0gJ2EmJnRpdGxlJztcbnZhciDmj4/ov7AgPSAnLm1vZHVsZS1pdGVtLXRleHQmJlRleHQnO1xudmFyIOWbvueJhyA9ICdpbWd8fGEmJmRhdGEtc3JjfHxkYXRhLW9yaWdpbmFsJztcbnZhciDpk77mjqUgPSAnYSYmaHJlZic7XG5cbi8v6L2u5pKtXG52YXIg6L2u5pKt5YiX6KGoID0gJy5zd2lwZXItYmlnJiYuc3dpcGVyLXNsaWRlJztcbnZhciDova7mkq3moIfpopggPSAnLnYtdGl0bGUmJlRleHQnO1xudmFyIOi9ruaSreWbvueJhyA9ICdhJiZzdHlsZSc7XG52YXIg6L2u5pKt6ZO+5o6lID0gJ2EmJmhyZWYnO1xuXG5ldmFsKEpTT04ucGFyc2UoZmV0Y2goXCJoaWtlcjovL3BhZ2UveWlcIiwge30pKS5ydWxlKTtcbmV2YWwoSlNPTi5wYXJzZShmZXRjaChcImhpa2VyOi8vcGFnZS93ZWVrXCIsIHt9KSkucnVsZSk7XG5cbnZhciDmjqjojZDliJfooagxID0gJy5tb2R1bGUsMSYmLm1vZHVsZS1pdGVtLDA6MTInO1xudmFyIOaOqOiNkOWIl+ihqDIgPSAnLm1vZHVsZSwyJiYubW9kdWxlLWl0ZW0sMDoxMic7XG5cbiAgICAgICAgZXZhbChKU09OLnBhcnNlKGZldGNoKFwiaGlrZXI6Ly9wYWdlL3RqXCIsIHt9KSkucnVsZSk7XG5cbnNldFJlc3VsdChkKTsiLCJzZWFyY2hfdXJsIjoiaHR0cHM6Ly93d3cuY2xpY2xpLndhbmcvc2VhcmNoL3BhZ2UvZnlwYWdlL3dkLyoqLmh0bWwiLCJncm91cCI6IiPvuI/ig6PikaHliqjmvKsiLCJzZWFyY2hGaW5kIjoianM6XG52YXIgZCA9IFtdO1xudmFyIGh0bWwgPSBnZXRSZXNDb2RlKCk7XG52YXIgbGlzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJi5tb2R1bGUtaXRlbScpO1xuZm9yICh2YXIgaiBpbiBsaXN0KSB7XG52YXIgdGl0bGUgPSBwZGZoKGxpc3Rbal0sICcubW9kdWxlLWNhcmQtaXRlbS10aXRsZSYmVGV4dCcpO1xudmFyIGltZyA9IHBkKGxpc3Rbal0sICcubGF6eSYmZGF0YS1vcmlnaW5hbCcpO1xuICBkLnB1c2goe1xuICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICBkZXNjOiBwZGZoKGxpc3Rbal0sICcubW9kdWxlLWl0ZW0tbm90ZSYmVGV4dCcpLFxuICAgICAgIGNvbnRlbnQ6IHBkZmgobGlzdFtqXSwgJy5tb2R1bGUtaW5mby1pdGVtLWNvbnRlbnQmJlRleHQnKSxcbiAgICAgICBpbWc6IGltZyxcbiAgICAgICB1cmw6IHBkKGxpc3Rbal0sICdhLDEmJmhyZWYnKSsnI2ltbWVyc2l2ZVRoZW1lIycgKyAnQHJ1bGU9anM6JC5yZXF1aXJlKFwiZWpcIiknLFxuICAgICAgZXh0cmE6e1xuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICBpbWc6IGltZyxcbiAgICAgICAgIH1cbiAgfSk7XG59XG5zZXRSZXN1bHQoZCkiLCJkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwiZGV0YWlsX2ZpbmRfcnVsZSI6IiIsInNkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwic2RldGFpbF9maW5kX3J1bGUiOiIqIiwidWEiOiJtb2JpbGUiLCJwcmVSdWxlIjoiIiwicGFnZXMiOiJbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuKTuOmAmueUqOino+aekFwiLFwicGF0aFwiOlwibGF6eVwiLFwicnVsZVwiOlwianM6XFxudmFyIGxhenkgPSAkKCcnKS5sYXp5UnVsZSgoTVlfSE9NRSkgPT4ge1xcbiAgICB2YXIgaHRtbCA9IEpTT04ucGFyc2UocmVxdWVzdChpbnB1dCkubWF0Y2goL3IgcGxheWVyXy4qPz0oLio/KTwvKVsxXSlcXG4gICAgdmFyIHVybCA9IGh0bWwudXJsXFxuICAgIGlmIChodG1sLmVuY3J5cHQgPT0gJzEnKSB7XFxuICAgICAgICB1cmwgPSB1bmVzY2FwZSh1cmwpO1xcbiAgICB9IGVsc2UgaWYgKGh0bWwuZW5jcnlwdCA9PSAnMicpIHtcXG4gICAgICAgIHVybCA9IHVuZXNjYXBlKGJhc2U2NERlY29kZSh1cmwpKTtcXG4gICAgfVxcbiAgcmV0dXJuIHJlcXVlc3QoJ2h0dHBzOi8vd3d3LmNsaWNsaS53YW5nL2FkZG9ucy9kcC9wbGF5ZXIvZHAucGhwP2tleT0wJmZyb209JmlkPTI1MjUmYXBpPSZ1cmw9JyArIHVybCwge1xcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgJ1JlZmVyZXInOiBNWV9VUkxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KS5tYXRjaCgvdXJsXFxcIjogXFxcIiguKj8pXFxcIi8pWzFdKyBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiICsgXFxcIiMubXA0O3tSZWZlcmVyQGh0dHBzOi8vd3d3LmNsaWNsaS53YW5nLyYmVXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiXFxuICAgIFxcbn0sTVlfSE9NRSlcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuKTtuS6jOe6p+mhtemdolwiLFwicGF0aFwiOlwiZWpcIixcInJ1bGVcIjpcImpzOlxcbnZhciBkID0gW11cXG5NWV9VUkw9TVlfVVJMLnJlcGxhY2UoJ2hpa2VyOi8vZW1wdHkjIycsJycpO1xcbnZhciBodG1sID0gZmV0Y2goTVlfVVJMKTtcXG5cXG4vL3ZhciDmkJzntKLmoIfnrb4gPSAnaDEmJlRleHQnO1xcblxcbmV2YWwoSlNPTi5wYXJzZShyZXF1ZXN0KCdoaWtlcjovL3BhZ2UvZXInKSkucnVsZSk7XFxuZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvbGF6eScsIHt9KSkucnVsZSk7XFxudmFyIHBsYXlsaXN0ID0gW3tcXG4gICAgLyroh6rlrprkuYk6e1xcbiAgICAgICAg5Zu+5qCHOiAnaHR0cHM6Ly9pMi4xMDAwMjQueHl6LzIwMjMvMDYvMTAvaDR6NjI3LndlYnAnLFxcbiAgICAgICAg5q2j5bqP6aKc6ImyOiAnIzMyQ0QzMicsXFxuICAgICAgICDpgIbluo/popzoibI6ICcjRkE4MDcyJyxcXG4gICAgICAgIOe6v+i3r+mAieS4rTogJyNGRkE1MDAnLCAgICAgICBcXG4gICAgfSwqL1xcbiAgICDnsbvlnos6ICflnKjnur/op4LnnIsnLFxcbiAgICDnur/ot686ICdib2R5JiYudGFiLWl0ZW06bm90KDptYXRjaGVzKOWWnOasoikpJyxcXG4gICAg6YCJ6ZuGOiAnYm9keSYmLm1vZHVsZS1wbGF5LWxpc3Q6bm90KDptYXRjaGVzKM6xKSknLFxcbiAgICDnur/ot6/lkI3np7A6ICdzcGFuJiZUZXh0QEAucmVwbGFjZSgvzrEvLFxcXCLOslxcXCIpJyxcXG4gICAg6YCJ6ZuG5YiX6KGoOiAnYm9keSYmYTpub3QoOm1hdGNoZXMozrEpKScsXFxuICAgIOaOkumZpDogJycsXFxuICAgIOmAiembhuWQjeensDogJ1RleHQuanM6aW5wdXQucmVwbGFjZSgv56ysfOmbhnzor5185pyfL2csXFxcIlxcXCIpJyxcXG4gICAgLy/pgInpm4bpk77mjqU6ICdhJiZocmVmJyxcXG4gICAgLy/lgJLluo86dHJ1ZSxcXG4gICAg6Kej5p6QOiBsYXp5LFxcbiAgICDmjqjpgIE6IHRydWUsXFxufSwge1xcbiAgICDnsbvlnos6ICfno4HlipvkuIvovb0nLFxcbiAgICAvL+e6v+i3rzogJycsXFxuICAgIOmAiembhjogJ2JvZHkmJi5zb3J0LWl0ZW1tJyxcXG4gICAgLy/nur/ot6/lkI3np7A6ICdUZXh0QEAucmVwbGFjZShcXFwizrJcXFwiLFxcXCJcXFwiKScsXFxuICAgIC8v6YCJ6ZuG5YiX6KGoOiAndWwmJmxpJyxcXG4gICAg6YCJ6ZuG5ZCN56ewOiAnVGV4dCcsXFxuICAgIOmAiembhumTvuaOpTogJ2EmJmhyZWYnLFxcbiAgICDmoLflvI86ICdhdmF0YXInLFxcbiAgICDlm77moIc6ICdodHRwczovL2ltZy52aW51YS5jbi9pbWFnZXMvT296NFIuanBlZydcXG59XVxcblxcbnZhciBvYmogPSB7XFxuICAgIC8v5riQ5Y+YOnRydWUsXFxuICAgIHNwOiAnLCcsIC8v5YiG5YmyXFxuICAgIG1haW46IHBkZmEoaHRtbCwgJ2JvZHkmJi5tb2R1bGUtaW5mby1pdGVtOm5vdCg6bWF0Y2hlcyjliafmg4UpKScpLCBcXG4gICAgc29ydDogWyfmm7TmlrAnLCAnJywgJ+eJh+mVvycsICflr7zmvJQnLCAn57yW5YmnJywgJ+S4u+a8lCddLCAvL+aOkuW6j1xcbiAgICBpbWc6IE1ZX1BBUkFNUy5pbWcgPyBNWV9QQVJBTVMuaW1nIDogcGRmaChodG1sLCAnLmxhenkmJmRhdGEtb3JpZ2luYWwnKSwgLy/lsIHpnaLlm77niYdcXG59XFxuY3VzdG9tRGF0YSh7XFxuICAgIOagh+mimOminOiJsjogJ3JlZCcsIC8v5qCH6aKY6aKc6ImyXFxuICAgIOaPj+i/sOS4ijogJ3llbGxvdycsIC8v5o+P6L+w6aKc6Imy5LiK6YOo5YiGXFxuICAgIOaPj+i/sOS4izogJyNGRjAwRkYnLCAvL+aPj+i/sOminOiJsuS4i+mDqOWIhlxcbiAgICDnroDku4vlsZXlvIA6ICcjRkZBNTAwJywgLy8g566A5LuL5bGV5byAXFxuICAgIOeugOS7i+aUtui1tzogJyNGRjZBNkEnLCAvLyDnroDku4vmlLbotbdcXG59KVxcblxcbkVyamkuc2V0Q29udGVudChvYmopO1xcbkVyamkuc2V0RGVzYyhwZGZoKGh0bWwsICcuc2hvdy1kZXNjJiZUZXh0JykucmVwbGFjZSgv5pS26LW3LywnJykpOy8v5Ymn5oOF566A5LuLXFxuZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvdG9vbCcsIHt9KSkucnVsZSk7Ly/lpJbpg6jlv6vmjbfmkJzntKJcXG5FcmppLmdldFBsYXllcnMocGxheWxpc3QpO1xcbkVyamku5aOw5piOKCk7XFxuRXJqaS51cGRhdGEoXFxcIifmnIDmlrDvvJonK3BkZmgoaHRtbCwgJy5zb3J0LWl0ZW0mJmEsLTEmJlRleHQnKVxcXCIpO1xcblxcbnNldFJlc3VsdChkKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi4pGk5pCc57Si6aG16Z2iXCIsXCJwYXRoXCI6XCJzc1wiLFwicnVsZVwiOlwianM6XFxudmFyIGQgPSBbXTtcXG5cXG5jb25zdCBiYXNlX3VybCA9ICdodHRwOi8vcmVzb3UudG9kYXkvYXJ0LzI5Lmh0bWwnO1xcblxcbmxldCB0cnVlX3VybCA9IGdldE15VmFyKE1ZX1JVTEUudXJsLCBiYXNlX3VybCk7XFxuTVlfVVJMPXRydWVfdXJsO1xcbnZhciBodG1sID0gZmV0Y2goYmFzZV91cmwsIHtcXG4gICAgaGVhZGVyczoge1xcbiAgICAgICAgJ1VzZXItQWdlbnQnOiBNT0JJTEVfVUFcXG4gICAgfVxcbn0pO1xcblxcbnZhciBJY29uX3ByZWZpeCA9ICdodHRwczovL3Jhdy5mYXN0Z2l0Lm9yZy9sczEyNTc4MTAwMy9sbXR1Ymlhby9tYWluL21vcmUvJztcXG5cXG5kLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn6L+U5ZueJyxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7ICAgICBcXG4gICAgICAgICAgICAgICAgYmFjayhmYWxzZSlcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ov5Tlm57op4TliJnpppbpobVcXFwiICBcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBJY29uX3ByZWZpeCArICc0Ny5wbmcnKyBcXFwiQFJlZmVyZXI9XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXG4gICAgICAgIH0pO1xcblxcblxcbmQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfnrZvpgIknLFxcbiAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vcGFnZS9zaGFpP3BhZ2U9ZnlwYWdlI25vSGlzdG9yeSMnLFxcbiAgICAgICAgICAgIHBpY191cmw6IEljb25fcHJlZml4ICsgJzIxMy5wbmcnICsgXFxcIkBSZWZlcmVyPVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiXFxuICAgICAgICB9KTtcXG5cXG5kLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn5Y6G5Y+yJyxcXG4gICAgICAgICAgICB1cmw6ICdoaWtlcjovL2hpc3RvcnknLFxcbiAgICAgICAgICAgIHBpY191cmw6IEljb25fcHJlZml4ICsgJzE5Mi5wbmcnICsgXFxcIkBSZWZlcmVyPVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiXFxuICAgICAgICB9KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIvCflI1cXFwiLFxcbiAgICAvL3VybDogXFxcIidoaWtlcjovL3NlYXJjaD9zPScraW5wdXQrJyZydWxlPeWuq+S4i+WKqOa8q+KZlCdcXFwiLFxcbiAgICAgdXJsOiBcXFwiJ2hpa2VyOi8vc2VhcmNoP3J1bGU9XFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiJnM9JytpbnB1dFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5pCc57Si5L2g5oOz6KaB55qE5b2x6KeG44CB5Yqo5ryr44CB57u86Im6562JLi4uXFxcIixcXG59KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiNmZjY2MDBcXFwiPjxiPlxcXFx054Ot5pCc5qacXFxcXHRcXFxcdFxcXFx0PC9iPjwvc3Bhbj4nLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBwaWNfdXJsOiAnaHR0cHM6Ly9zczEuYmFpZHUuY29tLzZPTlhzamlwMFFJWjh0eWhucS9pdC91PTM3Nzk5OTAzMjgsMTQxNjU1MzI0MSZmbT0xNzkmYXBwPTM1JmY9UE5HP3c9NjAmaD03MCZzPUU3OTUxQjYyQTQ2MzlEMTUzMjkzQTRFOTAzMDA0MDFCJyxcXG4gICAgICAgIGNvbF90eXBlOiAnaWNvbl9zbWFsbF8zJ1xcbiAgICB9KTtcXG5cXG5cXG5jb25zdCBsaXN0ID0gcGRmYShodG1sLCAnYm9keSYmLmFydC1yZXNvdSYmbGksMjonKTtcXG5saXN0LmZvckVhY2goaXRlbSA9PiB7ICBcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBwZGZoKGl0ZW0sICdzcGFuOmVxKDApJiZUZXh0JykgKyBwZGZoKGl0ZW0sICdzcGFuOmVxKDEpJiZUZXh0JyksXFxuICAgICAgICBkZXNjOiBwZGZoKGl0ZW0sICdzcGFuOmVxKDIpJiZUZXh0JyksXFxuICAgICAgICBpbWc6ICdodHRwczovL2Nkbi1pY29ucy1wbmcuZmxhdGljb24uY29tLzEyOC80NzMvNDczNDA2LnBuZycgKyBcXFwiQFJlZmVyZXI9aHR0cHM6Ly9pbWc5LmRvdWJhbmlvLmNvbS9cXFwiLFxcbiAgICAgICAgLy91cmw6ICdoaWtlcjovL3NlYXJjaD9zPScrcGRmaChpdGVtLCAnc3BhbjplcSgxKSYmVGV4dCcpKycmcnVsZT3lrqvkuIvliqjmvKvimZQnLFxcbiAgICAgICAgICB1cmw6ICdoaWtlcjovL3NlYXJjaD9ydWxlPScgKyBNWV9SVUxFLnRpdGxlICsgJyZzPScrcGRmaChpdGVtLCAnc3BhbjplcSgxKSYmVGV4dCcpLFxcbiAgICAgICAgY29sX3R5cGU6ICdhdmF0YXInLFxcbiAgICB9KVxcbn0pXFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi4pGh5LiA57qn6L2u5pKtXCIsXCJwYXRoXCI6XCJsdW5ib1wiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gYmFubmVyKHRpdGxlLCBzdGFydCwgYXJyLCBkYXRhLCBjZmcpIHtcXG4gICAgbGV0IGlkID0gdGl0bGUgKyAnbHVuYm8nO1xcbiAgICB2YXIgcm51bSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGRhdGEubGVuZ3RoKTtcXG4gICAgdmFyIGl0ZW0gPSBkYXRhW3JudW1dO1xcbiAgICBwdXRNeVZhcigncm51bScsIHJudW0pO1xcbiAgICBsZXQgdGltZSA9IDUwMDA7XFxuICAgIGxldCBjb2xfdHlwZSA9ICdwaWNfMV9jYXJkJztcXG4gICAgbGV0IGNvbG9yID0gXFxcIndoaXRlXFxcIjtcXG4gICAgbGV0IGRlc2MgPSAnJztcXG4gICAgaWYgKGNmZyAhPSB1bmRlZmluZWQpIHtcXG4gICAgICAgIHRpbWUgPSBjZmcudGltZSA/IGNmZy50aW1lIDogdGltZTtcXG4gICAgICAgIGNvbF90eXBlID0gY2ZnLmNvbF90eXBlID8gY2ZnLmNvbF90eXBlIDogY29sX3R5cGU7XFxuICAgICAgICBkZXNjID0gY2ZnLmRlc2MgPyBjZmcuZGVzYyA6IGRlc2M7XFxuICAgIH1cXG5cXG4gICAgYXJyLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IGNvbF90eXBlLFxcbiAgICAgICAgaW1nOiBpdGVtLmltZyxcXG4gICAgICAgIGRlc2M6IGRlc2MsXFxuICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXG4gICAgICAgIHVybDogaXRlbS51cmwsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBpZCsnYmFyJyxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICBpbWc6IGl0ZW0uaW1nLFxcbiAgICAgICAgfVxcbiAgICB9KVxcblxcbiAgICBpZiAoc3RhcnQgPT0gZmFsc2UgfHwgZ2V0TXlWYXIoJ2JlbnN0YXJ0JywgJ3RydWUnKSA9PSAnZmFsc2UnKSB7XFxuICAgICAgICB1blJlZ2lzdGVyVGFzayhpZClcXG4gICAgICAgIHJldHVyblxcbiAgICB9XFxuICAgIFxcbiAgICAvL2xvZyhkYXRhKVxcblxcbiAgICBsZXQgb2JqID0ge1xcbiAgICAgICAgZGF0YTogZGF0YSxcXG4gICAgfTtcXG5cXG4gICAgcmVnaXN0ZXJUYXNrKGlkLCB0aW1lLCAkLnRvU3RyaW5nKChvYmosaWQpID0+IHtcXG4gICAgICAgIHZhciBkYXRhID0gb2JqLmRhdGE7XFxuICAgICAgICB2YXIgcnVtID0gZ2V0TXlWYXIoJ3JudW0nKTtcXG5cXG4gICAgICAgIHZhciBpID0gTnVtYmVyKGdldE15VmFyKCdiYW5uZXJpJywgJzAnKSk7XFxuICAgICAgICBpZiAocnVtICE9ICcnKSB7XFxuICAgICAgICAgICAgaSA9IE51bWJlcihydW0pICsgMVxcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoJ3JudW0nKVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBpID0gaSArIDE7XFxuICAgICAgICB9XFxuICAgICAgICAvL2xvZyhpKVxcbiAgICAgICAgLy9sb2coZGF0YS5sZW5ndGgpXFxuXFxuICAgICAgICBpZiAoaSA+IGRhdGEubGVuZ3RoIC0gMSkge1xcbiAgICAgICAgICAgIGkgPSAwXFxuICAgICAgICB9XFxuICAgICAgICB2YXIgaXRlbSA9IGRhdGFbaV07XFxuICAgICAgICAvL2xvZyhpdGVtKVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKGlkKydiYXInLCB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgICAgICBpbWc6IGl0ZW0uaW1nLFxcbiAgICAgICAgICAgICAgICB1cmw6IGl0ZW0udXJsLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBpbWc6IGl0ZW0uaW1nLFxcbiAgICAgICAgICAgICAgICAgICAgLy9uYW1lOiBpdGVtLnRpdGxlLnJlcGxhY2UoLzxbXj5dKz4vZywgJycpLFxcbiAgICAgICAgICAgICAgICAgICAgLy9zbmFtZTogaXRlbS5leHRyYS5zbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIC8vc3R5cGU6IGl0ZW0uZXh0cmEuc3R5cGUsXFxuICAgICAgICAgICAgICAgICAgICAvL3N1cmw6IGl0ZW0udXJsLFxcbiAgICAgICAgICAgICAgICAgICAgLy9pbWc6aXRlbS5pbWcsXFxuICAgICAgICAgICAgICAgICAgICAvL3BhZ2VUaXRsZTogaXRlbS50aXRsZS5yZXBsYWNlKC88W14+XSs+L2csICcnKSxcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUubWVzc2FnZSlcXG4gICAgICAgICAgICB1blJlZ2lzdGVyVGFzayhpZClcXG4gICAgICAgIH1cXG4gICAgICAgIHB1dE15VmFyKCdiYW5uZXJpJywgaSk7XFxuXFxuICAgIH0sIG9iaixpZCkpXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi4pGg5LiA57qn6aG16Z2iXCIsXCJwYXRoXCI6XCJ5aVwiLFwicnVsZVwiOlwidmFyIEljb25fcHJlZml4ID0gJ2h0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vY2lyY2xlLyc7XFxuXFxuLy/liLfmlrAgICAgICAgXFxuICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfliLfmlrAnLFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+WIt+aWsOaIkOWKnycgIFxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIHBpY191cmw6IEljb25fcHJlZml4ICsgJzE3My5wbmcnKyBcXFwiQFJlZmVyZXI9XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImljb25fNVxcXCJcXG4gICAgICAgIH0pO1xcblxcbi8v562b6YCJXFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn562b6YCJJyxcXG4gICAgICAgICAgICB1cmw6ICdoaWtlcjovL3BhZ2Uvc2hhaT9wYWdlPWZ5cGFnZSNub0hpc3RvcnkjJyxcXG4gICAgICAgICAgICBwaWNfdXJsOiBJY29uX3ByZWZpeCArICcxNTgucG5nJyArIFxcXCJAUmVmZXJlcj1cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl81XFxcIlxcbiAgICAgICAgfSk7XFxuXFxuLy/mkJzntKJcXG4gICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+aQnOe0oicsXFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL3NzJyxcXG4gICAgICAgICAgICBwaWNfdXJsOiBJY29uX3ByZWZpeCArICc0NDYucG5nJyArIFxcXCJAUmVmZXJlcj1cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl81XFxcIlxcbiAgICAgICAgfSk7XFxuXFxuLy/mm7TmlrBcXG4gIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfmm7TmlrAnLFxcbiAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vcGFnZS9neCcsXFxuICAgICAgICAgICAgcGljX3VybDogSWNvbl9wcmVmaXggKyAnMzk5LnBuZycgKyBcXFwiQFJlZmVyZXI9XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImljb25fNVxcXCJcXG4gICAgICAgIH0pO1xcblxcbi8v5YiH5o2iXFxuY29uc3QgZm9sZCA9IGdldE15VmFyKCdsaWUuZ3JvdXAnLCBcXFwiMVxcXCIpXFxuZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+WIh+aNoicsXFxuICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChmb2xkKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKCdsaWUuZ3JvdXAnLCBmb2xkID09PSAnMScgPyAnMCcgOiAnMScpO1xcblxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgIH0sIGZvbGQpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnaWNvbl81JyxcXG4gICAgICAgICAgICBwaWNfdXJsOiBJY29uX3ByZWZpeCArICc0My5wbmcnICsgXFxcIkBSZWZlcmVyPVxcXCIsXFxuICAgICAgICB9KTtcXG4vKlxcbmQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICAgICAgfSk7Ki9cXG5kLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmlnX2JsYW5rX2Jsb2NrXFxcIlxcbiAgICAgICAgfSk7XFxuXFxuLy/ova7mkq1cXG52YXIgbHVuZGF0YSA9IHBkZmEoaHRtbCwg6L2u5pKt5YiX6KGoKS5tYXAoKHgpID0+IHtcXG4gICAgLy9sb2coeClcXG4gICAgICAgIHZhciB1cmxsID0gcGQoeCwg6L2u5pKt6ZO+5o6lKSArICcjaW1tZXJzaXZlVGhlbWUjJztcXG4gICAgcmV0dXJuIHtcXG4gICAgICAgIHRpdGxlOiBwZGZoKHgsIOi9ruaSreagh+mimCksXFxuICAgICAgICBpbWc6IHBkKHgsIOi9ruaSreWbvueJhykgKyAnQFJlZmVyZXI9JyxcXG4gICAgICAgIHVybDogJ2hpa2VyOi8vcGFnZS9laj91cmw9Jyt1cmxsKycjbm9IaXN0b3J5IycsXFxuICAgIH1cXG59KTtcXG5ldmFsKEpTT04ucGFyc2UoZmV0Y2goXFxcImhpa2VyOi8vcGFnZS9sdW5ib1xcXCIsIHt9KSkucnVsZSk7XFxuYmFubmVyKE1ZX1JVTEUudGl0bGUsIHRydWUsIGQsIGx1bmRhdGEsIHtcXG4gICAgICAgIHRpbWU6IDUwMDAsXFxuICAgICAgICBjb2xfdHlwZTogJ2NhcmRfcGljXzEnLFxcbiAgICAgICAgZGVzYzogJzAnXFxuICAgIH0pXFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLikaLkuIDnuqflkajooahcIixcInBhdGhcIjpcIndlZWtcIixcInJ1bGVcIjpcIi8v5ZGo6KGoXFxuaWYgKGZvbGQgPT09IDApIHtcXG5kLnB1c2goeyBcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSBpZiAoZm9sZCA9PT0gJzEnKSB7XFxudmFyIHdlZWtzID0gbmV3IEFycmF5KFxcXCLlkajml6VcXFwiLCBcXFwi5ZGo5LiAXFxcIiwgXFxcIuWRqOS6jFxcXCIsIFxcXCLlkajkuIlcXFwiLCBcXFwi5ZGo5ZubXFxcIiwgXFxcIuWRqOS6lFxcXCIsXFxcIuWRqOWFrVxcXCIpO1xcblxcbmZ1bmN0aW9uIGdldFdlZWtEYXRlKCkge1xcbiAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcXG4gICAgdmFyIGRheSA9IG5vdy5nZXREYXkoKTtcXG4gICAgdmFyIHdlZWsgPSB3ZWVrc1tkYXldO1xcbiAgICAvL2xvZyh3ZWVrKVxcbiAgICByZXR1cm4gd2VlaztcXG59XFxubGV0IG5vd19XZWVrID0gZ2V0V2Vla0RhdGUoKTtcXG4vL2xvZyhub3dfV2Vlayk7XFxuICAgIHdlZWtzLmZvckVhY2goaXQgPT4ge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogZ2V0TXlWYXIoJ3dlZWsnLCBub3dfV2VlaykgPT09IGl0ID8gJ+KYgCcgKyAn4oCc4oCc4oCd4oCdPGI+PGZvbnQgY29sb3I9I0ZBNzI5OD4nICsgaXQgKyAnPC9mb250PjwvYj4nIDogaXQucmVwbGFjZSgn5ZGoJywnJyksXFxuICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIyNub0hpc3RvcnkjJykubGF6eVJ1bGUoKGl0KSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJ3ZWVrXFxcIiwgaXQpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgfSwgaXQpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9KVxcblxcbmxldCBjaG9zZV93ZWVrID0gZ2V0TXlWYXIoJ3dlZWsnLCBub3dfV2Vlayk7XFxudmFyIHdrVG9udW0gPSBmdW5jdGlvbih3aykge1xcbiAgICAgICAgaWYgKC/lkah85pif5pyfLy50ZXN0KHdrKSkge1xcbiAgICAgICAgICAgIHdrID0gd2sucmVwbGFjZSgv5ZGofOaYn+acny8sIFxcXCJcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIG1hcCA9IHtcXG4gICAgICAgICAgICBcXFwi5pelXFxcIjogNixcXG4gICAgICAgICAgICBcXFwi5LiAXFxcIjogMCxcXG4gICAgICAgICAgICBcXFwi5LqMXFxcIjogMSxcXG4gICAgICAgICAgICBcXFwi5LiJXFxcIjogMixcXG4gICAgICAgICAgICBcXFwi5ZubXFxcIjogMyxcXG4gICAgICAgICAgICBcXFwi5LqUXFxcIjogNCxcXG4gICAgICAgICAgICBcXFwi5YWtXFxcIjogNVxcbiAgICAgICAgfTtcXG4gICAgICAgIHJldHVybiBtYXBbd2tdXFxuICAgIH1cXG4gICAgbGV0IHdrX251bSA9IHdrVG9udW0oY2hvc2Vfd2Vlayk7XFxuLy9sb2cod2tfbnVtKVxcbmZvciAodmFyIGsgPSAwOyBrIDw9IDY7IGsrKykge1xcbiAgICBldmFsKCd2YXIgd2snICsgayArICc9cGRmYShodG1sLCBcXFwiLm1vZHVsZS1tYWluLCcgKyAoaz09MD8wOmspICsgJyYmLm1vZHVsZS1pdGVtLDA6MTJcXFwiKTsnKTsvL+aYn+acn+WIl+ihqFxcbiAgICBpZiAod2tfbnVtID09IGspIHtcXG4gICAgICAgIGV2YWwoJ3drJytrKS5mb3JFYWNoKGl0ZW0gPT4ge1xcbiAgICAgICAgICAgIHZhciB1cmxsID0gTVlfSE9NRSArIHBkZmgoaXRlbSwgJ2EmJmhyZWYnKSArICcjaW1tZXJzaXZlVGhlbWUjJztcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdGVtLCDmoIfpopgpLFxcbiAgICAgICAgICAgICAgICBkZXNjOiBwZGZoKGl0ZW0sIOaPj+i/sCksXFxuICAgICAgICAgICAgICAgIGltZzogcGRmaChpdGVtLCDlm77niYcpICsgXFxcIkBSZWZlcmVyPVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vcGFnZS9laiNub0hpc3RvcnkjI2ltbWVyc2l2ZVRoZW1lIycsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybGwsXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdGVtLCDmoIfpopgpLFxcbiAgICAgICAgICAgICAgICAgICAgaW1nOiBwZGZoKGl0ZW0sIOWbvueJhykgKyBcXFwiQFJlZmVyZXI9XFxcIixcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICdtb3ZpZV8zJyxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0pXFxuICAgIH0gICAgXFxufVxcbmQucHVzaCh7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLikaPkuIDnuqfmjqjojZBcIixcInBhdGhcIjpcInRqXCIsXCJydWxlXCI6XCJjb25zdCBmb2xkMSA9IGdldE15VmFyKCdyYi5ncm91cCcsIFxcXCIxXFxcIilcXG5kLnB1c2goe1xcbiAgICB0aXRsZTpmb2xkMSA9PT0gJzEnID8gJzxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2Y3Mzg1OVxcXCI+55Wq5YmnXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdPCfjYA8L3NwYW4+PC9iPicgOiAn55Wq5YmnXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOKYmO+4jycsXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoZm9sZDEpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoJ3JiLmdyb3VwJywgZm9sZDEgPT09ICcxJyA/ICcwJyA6ICcxJyk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgIH0sIGZvbGQxKSxcXG4gICAgcGljX3VybDogJ2h0dHBzOi8vcmF3LmZhc3RnaXQub3JnL2xzMTI1NzgxMDAzL2xtdHViaWFvL21haW4vL2tlLzEyMC5wbmcnLFxcbiAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCJcXG59KTtcXG5pZiAoZm9sZDEgPT09IDApIHtcXG5kLnB1c2goeyBcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSBpZiAoZm9sZDEgPT09ICcxJykge1xcbnZhciBqamRtPXBkZmEoaHRtbCwg5o6o6I2Q5YiX6KGoMSk7XFxuampkbS5mb3JFYWNoKGl0ZW0gPT4geyAgXFxudmFyIHVybGwgPSBwZChpdGVtLCDpk77mjqUpICsgJyNpbW1lcnNpdmVUaGVtZSMnO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHBkZmgoaXRlbSwg5qCH6aKYKSxcXG4gICAgICAgIGRlc2M6IHBkZmgoaXRlbSwg5o+P6L+wKSxcXG4gICAgICAgIGltZzogcGRmaChpdGVtLCDlm77niYcpICsgXFxcIkBSZWZlcmVyPVxcXCIsXFxuICAgICAgICB1cmw6ICdoaWtlcjovL3BhZ2UvZWojbm9IaXN0b3J5IyNpbW1lcnNpdmVUaGVtZSMnLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgdXJsOiB1cmxsLFxcbiAgICAgICAgICAgICB0aXRsZTogcGRmaChpdGVtLCDmoIfpopgpLFxcbiAgICAgICAgICAgICBpbWc6IHBkKGl0ZW0sIOWbvueJhykgKyBcXFwiQFJlZmVyZXI9XFxcIixcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgIGNvbF90eXBlOiAnbW92aWVfMycsXFxuICAgIH0pO1xcbn0pXFxufVxcblxcbmNvbnN0IGZvbGQyID0gZ2V0TXlWYXIoJ2hqLmdyb3VwJywgXFxcIjFcXFwiKVxcbmQucHVzaCh7XFxuICAgIHRpdGxlOmZvbGQyID09PSAnMScgPyAnPGI+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY4NDdjXFxcIj7liafpm4ZcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx08J+Skzwvc3Bhbj48L2I+JyA6ICfliafpm4ZcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx08J+SlycsXFxuICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoZm9sZDIpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoJ2hqLmdyb3VwJywgZm9sZDIgPT09ICcxJyA/ICcwJyA6ICcxJyk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgIH0sIGZvbGQyKSxcXG4gICAgcGljX3VybDogJ2h0dHBzOi8vcmF3LmZhc3RnaXQub3JnL2xzMTI1NzgxMDAzL2xtdHViaWFvL21haW4va2UvNDAucG5nJyArIFxcXCJAUmVmZXJlcj1cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCJcXG59KTtcXG5pZiAoZm9sZDIgPT09IDApIHtcXG5kLnB1c2goeyBcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCIsXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2UgaWYgKGZvbGQyID09PSAnMScpIHtcXG52YXIgampkbT1wZGZhKGh0bWwsIOaOqOiNkOWIl+ihqDIpO1xcbmpqZG0uZm9yRWFjaChpdGVtID0+IHsgIFxcbnZhciB1cmxsID0gcGQoaXRlbSwg6ZO+5o6lKSArICcjaW1tZXJzaXZlVGhlbWUjJztcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBwZGZoKGl0ZW0sIOagh+mimCksXFxuICAgICAgICBkZXNjOiBwZGZoKGl0ZW0sIOaPj+i/sCksXFxuICAgICAgICBpbWc6IHBkZmgoaXRlbSwg5Zu+54mHKSArIFxcXCJAUmVmZXJlcj1cXFwiLFxcbiAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2VqI25vSGlzdG9yeSMjaW1tZXJzaXZlVGhlbWUjJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgIHVybDogdXJsbCxcXG4gICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXRlbSwg5qCH6aKYKSxcXG4gICAgICAgICAgICAgaW1nOiBwZChpdGVtLCDlm77niYcpICsgXFxcIkBSZWZlcmVyPVxcXCIsXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICBjb2xfdHlwZTogJ21vdmllXzMnLFxcbiAgICB9KTtcXG59KVxcbn1cXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzFfdmVydGljYWxfcGljXCIsXCJuYW1lXCI6XCLikaXmm7TmlrDpobXpnaJcIixcInBhdGhcIjpcImd4XCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcbmNvbnN0IGJhc2VfdXJsID0gJ2h0dHBzOi8vd3d3LmNsaWNsaS53YW5nL2xhYmVsL25ldy5odG1sJztcXG5cXG5sZXQgdHJ1ZV91cmwgPSBnZXRNeVZhcihNWV9SVUxFLnVybCwgYmFzZV91cmwpO1xcbk1ZX1VSTD10cnVlX3VybDtcXG52YXIgaHRtbD1mZXRjaCh0cnVlX3VybClcXG5sb2coaHRtbClcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTonPGI+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjRkE3Mjk4XFxcIj7mnIDov5Hmm7TmlrBcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXPCfjLjwn4y48J+MuPCfjLjwn4y4PC9zcGFuPjwvYj4nLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgcGljX3VybDogJ2h0dHBzOi8vcmF3LmZhc3RnaXQub3JnL2xzMTI1NzgxMDAzL2xtdHViaWFvL21haW4va2UvNjMucG5nJyArIFxcXCJAUmVmZXJlcj1cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCJcXG59KTtcXG5cXG5jb25zdCBsaXN0ID0gcGRmYShodG1sLCAnYm9keSYmLm1vZHVsZS1jYXJkLWl0ZW0nKTtcXG5saXN0LmZvckVhY2goaXRlbSA9PiB7ICBcXG52YXIgdXJsbCA9cGQoaXRlbSwgJ2EmJmhyZWYnKSArICcjaW1tZXJzaXZlVGhlbWUjJztcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBwZGZoKGl0ZW0sICcubW9kdWxlLWNhcmQtaXRlbS10aXRsZSYmVGV4dCcpLFxcbiAgICAgICAgZGVzYzogcGRmaChpdGVtLCAnc3Ryb25nJiZUZXh0JyksXFxuICAgICAgICBpbWc6IHBkZmgoaXRlbSwgJy5sYXp5JiZkYXRhLW9yaWdpbmFsJyksXFxuICAgICAgICB1cmw6ICdoaWtlcjovL3BhZ2UvZWojbm9IaXN0b3J5IyNpbW1lcnNpdmVUaGVtZSMnLFxcbiAgICAgICAgZXh0cmE6IHt1cmw6IHVybGx9LFxcbiAgICAgICAgY29sX3R5cGU6ICdtb3ZpZV8zX21hcnF1ZWUnLFxcbiAgICB9KVxcbn0pXFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi4pO15LqM57qn5YaF5a65XCIsXCJwYXRoXCI6XCJlclwiLFwicnVsZVwiOlwianM6XFxuLyp2ZXIgMjAyMzA5MzAgMi4wXFxuICovXFxuY29uc3QgY3VzdG9tcyA9IHt9O1xcblxcbi8v6aKE6K6+XFxuZnVuY3Rpb24gY3VzdG9tRGF0YShjdXN0b20pIHtcXG4gIE9iamVjdC5rZXlzKGN1c3RvbSkuZm9yRWFjaCgoaykgPT4ge1xcbiAgICBjdXN0b21zW2tdID0gY3VzdG9tW2tdO1xcbiAgfSlcXG59XFxuXFxuXFxubGV0IEVyamkgPSB7XFxuICDpgJrlhY06ICQoJycpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgdHJ5IHtcXG4gICAgICB2YXIgaHRtbCA9IEpTT04ucGFyc2UocmVxdWVzdChpbnB1dCkubWF0Y2goL3IgcGxheWVyXy4qPz0oLio/KTwvKVsxXSlcXG4gICAgICB2YXIgdXJsID0gaHRtbC51cmxcXG4gICAgICBpZiAoaHRtbC5lbmNyeXB0ID09ICcxJykge1xcbiAgICAgICAgdXJsID0gdW5lc2NhcGUodXJsKTtcXG4gICAgICB9IGVsc2UgaWYgKGh0bWwuZW5jcnlwdCA9PSAnMicpIHtcXG4gICAgICAgIHVybCA9IHVuZXNjYXBlKGJhc2U2NERlY29kZSh1cmwpKTtcXG4gICAgICB9XFxuICAgICAgaWYgKC9tM3U4fG1wNC8udGVzdCh1cmwpKSB7XFxuICAgICAgICByZXR1cm4gdXJsXFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBcXFwidmlkZW86Ly9cXFwiICsgaW5wdXRcXG4gICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICByZXR1cm4gXFxcInZpZGVvOi8vXFxcIiArIGlucHV0XFxuICAgIH1cXG4gIH0pLFxcbiAgZXZhbEpTUnVsZTogZnVuY3Rpb24gKGl0ZW0sIGpzUnVsZSkge1xcbiAgICBsZXQgcnVsZSA9IGpzUnVsZS5yZXBsYWNlKFxcXCJAanM6XFxcIiwgXFxcIlxcXCIpO1xcbiAgICBydWxlID0gcnVsZS50cmltKCk7XFxuICAgIC8vbG9nKCQuc3RyaW5naWZ5KHJ1bGUpKVxcbiAgICBsZXQgaW5wdXQgPSBpdGVtO1xcbiAgICBpZiAocnVsZS5zdGFydHNXaXRoKFxcXCIoXFxcIikpIHtcXG4gICAgICBldmFsKFxcXCJyZXN1bHQgPSBcXFwiICsgcnVsZSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgLyoqXFxuICAgICAgKiDov5jljp/miJAgJC50b1N0cmluZyguLi4pIOeahOacgOe7iOe7k+aenO+8jOi+vuWIsOacgOe7iOWkhOeQhuaWueW8j+i3n+S4iumdoueahCBpZiDkuIDoh7TnmoTnm67nmoRcXG4gICAgICAqL1xcbiAgICAgIGV2YWwoXFxcInJlc3VsdCA9IFxcXCIgKyBcXFwiKCgpID0+IHtcXFwiICsgcnVsZSArIFxcXCJ9KSgpXFxcIik7XFxuICAgIH1cXG4gICAgcmV0dXJuIHJlc3VsdCB8fCBcXFwiXFxcIjtcXG4gIH0sXFxuICB1cGRhdGFSdWxlOiBmdW5jdGlvbiAocnVsZSwgaGVhZGVycykge1xcbiAgICBoZWFkZXJzID0gaGVhZGVycyAhPSB1bmRlZmluZWQgPyBoZWFkZXJzIDoge307XFxuICAgIHNldExhc3RDaGFwdGVyUnVsZSgnanM6JyArICQudG9TdHJpbmcoKHVybCwgcnVsZSwgaGVhZGVycykgPT4ge1xcbiAgICAgIHZhciBodG1sID0gZmV0Y2godXJsLCBoZWFkZXJzKTtcXG4gICAgICBzZXRSZXN1bHQoZXZhbChydWxlKSlcXG4gICAgfSwgTVlfVVJMLCBydWxlLCBoZWFkZXJzKSlcXG4gIH0sXFxuICB1cGRhdGFGdW46IGZ1bmN0aW9uIChtZXRob2QsIHBhcmFtcykge1xcbiAgICB2YXIgbWV0aG9kQXJncyA9IHRoaXMuZ2V0QXJncyhtZXRob2QpO1xcbiAgICB2YXIgYXJncyA9IG1ldGhvZEFyZ3MubWFwKGZ1bmN0aW9uKGFyZykge1xcbiAgICAgIHJldHVybiBwYXJhbXNbYXJnXTtcXG4gICAgfSk7XFxuICAgIC8vbWV0aG9kLmFwcGx5KG51bGwsIGFyZ3MpO1xcbiAgICBzZXRMYXN0Q2hhcHRlclJ1bGUoJ2pzOicgKyAkLnRvU3RyaW5nKChtZXRob2QsYXJncykgPT4ge1xcbiAgICAgIG1ldGhvZC5hcHBseShudWxsLCBhcmdzKTtcXG4gICAgfSwgbWV0aG9kLGFyZ3MpKVxcbiAgfSxcXG4gIHVwZGF0YTpmdW5jdGlvbihhcmdzMSxhcmdzMil7XFxuICAgICAgaWYoYXJnczEuY29uc3RydWN0b3I9PUZ1bmN0aW9uKXtcXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0YUZ1bihhcmdzMSxhcmdzMik7XFxuICAgICAgfWVsc2V7XFxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGFSdWxlKGFyZ3MxLGFyZ3MyKTtcXG4gICAgICB9XFxuICB9LFxcbiAgZ2V0QXJnczpmdW5jdGlvbihmdW5jKXtcXG4gICAgdmFyIGFyZ3MgPSBmdW5jLnRvU3RyaW5nKCkubWF0Y2goL2Z1bmN0aW9uXFxcXHMuKj9cXFxcKChbXildKilcXFxcKS8pWzFdO1xcbiAgICByZXR1cm4gYXJncy5zcGxpdChcXFwiLFxcXCIpLm1hcChmdW5jdGlvbiAoYXJnKSB7XFxuICAgICAgcmV0dXJuIGFyZy5yZXBsYWNlKC9cXFxcL1xcXFwqLipcXFxcKlxcXFwvLywgXFxcIlxcXCIpLnRyaW0oKTtcXG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChhcmdzKSB7XFxuICAgICAgcmV0dXJuIGFyZ3M7XFxuICAgIH0pO1xcbiAgfSxcXG4gIG1heExpc3Q6IChhcnIpID0+IHsgXFxuICAgIHJldHVybiBhcnIucmVkdWNlKChhY2MsIGN1cnIpID0+IChjdXJyLmxlbmd0aCA+IGFjYy5sZW5ndGggPyBjdXJyIDogYWNjKSwgW10pIFxcbiAgfSxcXG4gIGNsb3NlOiBmdW5jdGlvbiAobGlzdCwgc29ydHMpIHtcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChsaXN0LCBzb3J0cykgPT4ge1xcbiAgICAgIGxpc3QubWFwKHggPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcignZXJfJyArIHggKyAnZm9sZCcpO1xcbiAgICAgICAgY2xlYXJNeVZhcignZXJfJyArIHgpO1xcbiAgICAgIH0pXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0czsgaSsrKSB7XFxuICAgICAgICBjbGVhck15VmFyKCdwbGF5bGlzdF8nICsgaSk7XFxuICAgICAgfVxcbiAgICAgIGNsZWFyTXlWYXIoJ2VyX3BsYXlsaXN0cycpO1xcbiAgICB9LCBsaXN0LCBzb3J0cykpXFxuICB9LFxcbiAgZGF0YUNvbnZlcnQ6IGZ1bmN0aW9uIChkYXRhKSB7XFxuICAgIHZhciBuZXdjbHNsaXN0ID0gZGF0YS5tYXAoZnVuY3Rpb24gKG9iaikge1xcbiAgICAgIHZhciBuZXdPYmogPSBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xcbiAgICAgIGlmIChuZXdPYmouaGFzT3duUHJvcGVydHkoJ3R5cGUnKSkge1xcbiAgICAgICAgbmV3T2JqLmNvbF90eXBlID0gbmV3T2JqLnR5cGU7XFxuICAgICAgfVxcbiAgICAgIHJldHVybiBuZXdPYmo7XFxuICAgIH0pO1xcbiAgICByZXR1cm4gbmV3Y2xzbGlzdDtcXG4gIH0sXFxuICBwcmVMb2FkOiBmdW5jdGlvbiAoZnVuYykge1xcbiAgICBsZXQgbXlmdW5jID0gbnVsbFxcbiAgICBpZiAoZnVuYyAhPSB1bmRlZmluZWQgJiYgZnVuYy5jb25zdHJ1Y3RvciA9PSBGdW5jdGlvbikge1xcbiAgICAgIG15ZnVuYyA9IGZ1bmNcXG4gICAgfVxcbiAgICAkLmV4dGVuZCh7XFxuICAgICAgZGF0YUNvbnZlcnQ6IHRoaXMuZGF0YUNvbnZlcnQsXFxuICAgICAgbXNtOiBNZXRob2RzLk11bHRpU2VsZWN0TW9kZSxcXG4gICAgICBmdW5jOiBteWZ1bmMsXFxuICAgIH0pXFxuICB9LFxcbiAgc21hbGw6IGZ1bmN0aW9uIChzdHIsIGNvbG9yLGgpIHtcXG4gICAgaD1oPT11bmRlZmluZWQ/dHJ1ZTpoO1xcbiAgICByZXR1cm4gKGg/J+KAnOKAnOKAneKAnSc6JycpKyc8c21hbGw+PGZvbnQgY29sb3I9XFxcIicgKyAoY29sb3IgfHwgJycpICsgJ1xcXCI+JyArIHN0ciArICc8L2ZvbnQ+PC9zbWFsbD4nO1xcbiAgfSxcXG4gIOWjsOaYjjogZnVuY3Rpb24gKCkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiB0aGlzLnNtYWxsKCfku6XkuIrmlbDmja7mnaXmupDkuo7nvZHnu5zvvIzlpoLmgqjllpzmrKLvvIzor7fmlK/mjIHlrpjmlrnvvIEnLCAnIzg3MUY3OCcpLFxcbiAgICAgIGRlc2M6IHRoaXMuc21hbGwoJ+atpOinhOWImeS7hemZkOWtpuS5oOS6pOa1geS9v+eUqO+8jOivt+S6juWvvOWFpeWQjjI05bCP5pe25YaF5Yig6Zmk77yM5Lu75L2V57uE57uH5oiW5Liq5Lq65LiN5b6X5Lul5Lu75L2V5pa55byP5pa55rOV5Lyg5pKt5q2k6KeE5YiZ55qE5pW05L2T5oiW6YOo5YiG77yBJywgJyNGMjBDMDAnKSxcXG4gICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgIH0pO1xcbiAgfSxcXG4gIHN1YnN0cjogZnVuY3Rpb24gKHN0ciwgbWF4TGVuZ3RoKSB7XFxuICAgIGxldCBsZW4gPSAwO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xcbiAgICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSA+IDI1NSkge1xcbiAgICAgICAgbGVuICs9IDI7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGxlbisrO1xcbiAgICAgIH1cXG4gICAgICBpZiAobGVuID4gbWF4TGVuZ3RoKSB7XFxuICAgICAgICByZXR1cm4gc3RyLnNsaWNlKDAsIGkpICsgJy4uLic7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBzdHI7XFxuICB9LFxcblxcbi8v566A5LuLXFxuICBzZXREZXNjOiBmdW5jdGlvbiAoZGVzYywgbnVtKSB7XFxuICAgIHZhciBjdXN0b20gPSB0aGlzLmdldFByZXNldCgpO1xcbiAgICBkZXNjID0gZGVzYy5jb25zdHJ1Y3RvciA9PSBBcnJheSA/IGRlc2Muam9pbignPGJyPicpIDogZGVzYztcXG4gICAgaWYgKGRlc2MucmVwbGFjZSgvKDxicj58XFxcXHMrKS9nLCAnJykubGVuZ3RoID09IDApIHtcXG4gICAgICByZXR1cm5cXG4gICAgfVxcbiAgICB2YXIgaW5mbyA9IHN0b3JhZ2UwLmdldE15VmFyKCdlcl9pbmZvJywgJ3t9JylcXG4gICAgaWYgKGluZm9bJ2Rlc2MnXSAhPSB1bmRlZmluZWQpIHtcXG4gICAgICBpbmZvWydkZXNjJ10gPSBpbmZvWydkZXNjJ10gKyAnIOeugOS7izonICsgZGVzYztcXG4gICAgICBzdG9yYWdlMC5wdXRNeVZhcignZXJfaW5mbycsIGluZm8pO1xcbiAgICB9XFxuXFxuICAgIGNvbnN0IG1hcmsgPSAnZGVzYyc7XFxuICAgIG51bSA9IHR5cGVvZiAobnVtKSA9PSAndW5kZWZpbmVkJyA/IDkzIDogbnVtXFxuICAgIGRlc2MgPSBkZXNjLnN0YXJ0c1dpdGgoJ+OAgOOAgCcpID8gZGVzYyA6ICfjgIDjgIAnICsgZGVzYztcXG4gICAgZGVzYyA9IGRlc2MucmVwbGFjZSgvJy9nLCBcXFwiJiMzOTtcXFwiKTtcXG4gICAgZGVzYyA9IGRlc2MucmVwbGFjZSgvXFxcXHJcXFxcbi9nLCBcXFwiPGJyPlxcXCIpO1xcblxcblxcbiAgICBsZXQgc2Rlc2MgPSB0aGlzLnN1YnN0cihkZXNjLCBudW0pO1xcblxcbiAgICB2YXIgY29sb3JzID0ge1xcbiAgICAgIHNob3c6IGN1c3RvbS7nroDku4vlsZXlvIAsXFxuICAgICAgaGlkZTogY3VzdG9tLueugOS7i+aUtui1t1xcbiAgICB9XFxuXFxuICAgIHZhciBsYXp5ID0gJChgI25vTG9hZGluZyNgKS5sYXp5UnVsZSgoZGMsIHNkYywgbSwgY3MpID0+IHtcXG4gICAgICB2YXIgc2hvdyA9IHN0b3JhZ2UwLmdldEl0ZW0obSwgJzAnKTtcXG4gICAgICB2YXIgdGl0bGUgPSBmaW5kSXRlbSgnZGVzYycpLnRpdGxlO1xcbiAgICAgIHZhciByZSA9IC8oPFxcXFwvc21hbGw+PGJyPi4qPz4pLisvZztcXG4gICAgICB2YXIgZXhwID0gJ+WxleW8gDonO1xcbiAgICAgIHZhciByZXQgPSAn5pS26LW3Oic7XFxuICAgICAgaWYgKHNob3cgPT0gJzEnKSB7XFxuICAgICAgICB1cGRhdGVJdGVtKCdkZXNjJywge1xcbiAgICAgICAgICB0aXRsZTogdGl0bGVcXG4gICAgICAgICAgICAucmVwbGFjZShyZXQsIGV4cClcXG4gICAgICAgICAgICAucmVwbGFjZShyZSwgJyQxJyArIHNkYyArICc8L3NtYWxsPicpXFxuICAgICAgICAgICAgLnJlcGxhY2UoLyg8XFxcXC9zbWFsbD48YnI+XFxcXDxmb250IGNvbG9yPVxcXCIpLio/KFxcXCI+KS8sICckMScgKyBjcy5oaWRlICsgJyQyJylcXG5cXG4gICAgICAgIH0pXFxuICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKG0sICcwJyk7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oJ2Rlc2MnLCB7XFxuICAgICAgICAgIHRpdGxlOiB0aXRsZVxcbiAgICAgICAgICAgIC5yZXBsYWNlKGV4cCwgcmV0KVxcbiAgICAgICAgICAgIC5yZXBsYWNlKHJlLCAnJDEnICsgZGMgKyAnPC9zbWFsbD4nKVxcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPFxcXFwvc21hbGw+PGJyPlxcXFw8Zm9udCBjb2xvcj1cXFwiKS4qPyhcXFwiPikvLCAnJDEnICsgY3Muc2hvdyArICckMicpXFxuICAgICAgICB9KVxcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShtLCAnMScpO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gYGhpa2VyOi8vZW1wdHlgXFxuICAgIH0sIGRlc2MsIHNkZXNjLCBtYXJrLCBjb2xvcnMpXFxuICAgIHZhciBzYyA9IHN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKSA9PSAnMCcgPyAn5bGV5byAOicgOiAn5pS26LW3Oic7XFxuICAgIHZhciBkYyA9IHN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKSA9PSAnMCcgPyBzZGVzYyA6IGRlc2M7XFxuICAgIHZhciBjcyA9IHN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKSA9PSAnMCcgPyBjb2xvcnMuaGlkZSA6IGNvbG9ycy5zaG93O1xcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiAnJyArICc8Yj48Zm9udCBjb2xvcj1cXFwiIzA5OEFDMVxcXCI+4oi35Ymn5oOF566A5LuLXFx0PC9mb250PjwvYj4nICsgXFxcIjxzbWFsbD48YSBzdHlsZT0ndGV4dC1kZWNvcmF0aW9uOiBub25lOycgaHJlZj0nXFxcIiArIGxhenkgKyBcXFwiJz5cXFwiICsgc2MgKyAnPC9hPjwvc21hbGw+PGJyPjxmb250IGNvbG9yPVxcXCInICsgY3MgKyAnXFxcIj4nICsgYCR7ZGN9YCArICc8L3NtYWxsPicsXFxuICAgICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogJ2Rlc2MnLFxcbiAgICAgICAgbGluZVNwYWNpbmc6IDYsXFxuICAgICAgICB0ZXh0U2l6ZTogMTUsXFxuICAgICAgICBsaW5lVmlzaWJsZTogdHJ1ZSxcXG4gICAgICB9XFxuICAgIH0pXFxuICB9LFxcbiAgc2V0RGVzYzI6IGZ1bmN0aW9uIChkZXNjLCBudW0pIHtcXG4gICAgdmFyIGN1c3RvbSA9IHRoaXMuZ2V0UHJlc2V0KCk7XFxuICAgIGRlc2MgPSBkZXNjLmNvbnN0cnVjdG9yID09IEFycmF5ID8gZGVzYy5qb2luKCc8YnI+JykgOiBkZXNjO1xcbiAgICBpZiAoZGVzYy5yZXBsYWNlKC8oPGJyPnxcXFxccyspL2csICcnKS5sZW5ndGggPT0gMCkge1xcbiAgICAgIHJldHVyblxcbiAgICB9XFxuICAgIHZhciBpbmZvID0gc3RvcmFnZTAuZ2V0TXlWYXIoJ2VyX2luZm8nLCAne30nKVxcbiAgICBpZiAoaW5mb1snZGVzYyddICE9IHVuZGVmaW5lZCkge1xcbiAgICAgIGluZm9bJ2Rlc2MnXSA9IGluZm9bJ2Rlc2MnXSArICcg566A5LuLOicgKyBkZXNjO1xcbiAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKCdlcl9pbmZvJywgaW5mbyk7XFxuICAgIH1cXG5cXG4gICAgY29uc3QgbWFyayA9ICdkZXNjJztcXG4gICAgbnVtID0gdHlwZW9mIChudW0pID09ICd1bmRlZmluZWQnID8gMTAwIDogbnVtXFxuICAgIGRlc2MgPSBkZXNjLnN0YXJ0c1dpdGgoJ+OAgOOAgCcpID8gZGVzYyA6ICfjgIDjgIAnICsgZGVzYztcXG4gICAgZGVzYyA9IGRlc2MucmVwbGFjZSgvJy9nLCBcXFwiJiMzOTtcXFwiKTtcXG4gICAgZGVzYyA9IGRlc2MucmVwbGFjZSgvXFxcXHJcXFxcbi9nLCBcXFwiPGJyPlxcXCIpO1xcblxcbiAgICBsZXQgc2Rlc2MgPSB0aGlzLnN1YnN0cihkZXNjLCBudW0pO1xcblxcbiAgICB2YXIgY29sb3JzID0ge1xcbiAgICAgIHNob3c6IGN1c3RvbS7nroDku4vlsZXlvIAsXFxuICAgICAgaGlkZTogY3VzdG9tLueugOS7i+aUtui1t1xcbiAgICB9XFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6ICfliafmg4XnroDku4s8c3BhbiBzdHlsZT1cXFwiY29sb3I6I2ZmMDAwMDtcXFwiPjxiPjxzbWFsbD4nICsgKHN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKT09JzAnPyflsZXlvIAnOifmlLbotbcnKSArICc8L3NtYWxsPjwvYj48L3NwYW4+OicsXFxuICAgICAgY29sX3R5cGU6ICdhdmF0YXInLFxcbiAgICAgIGltZzogJ2h0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzc1LnBuZycsXFxuICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChtYXJrLGRjLCBzZGMsY3MpID0+IHtcXG4gICAgICAgIHZhciBkcyA9IHN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKTtcXG4gICAgICAgIHZhciB0aXRsZSA9IGZpbmRJdGVtKCdkc2hvdycpLnRpdGxlO1xcbiAgICAgICAgdmFyIGR0aXRsZSA9IGZpbmRJdGVtKCdkY29udGVudCcpLnRpdGxlO1xcbiAgICAgICAgaWYgKGRzID09ICcwJykge1xcbiAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKG1hcmssICcxJylcXG4gICAgICAgICAgdXBkYXRlSXRlbSgnZGNvbnRlbnQnLCB7XFxuICAgICAgICAgICAgdGl0bGU6IGR0aXRsZS5yZXBsYWNlKC9cXFxcPi4qP1xcXFw8LywnPicrZGMrJzwnKVxcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oY29sb3I9XFxcIikuKj8oXFxcIikvLCckMScrY3Muc2hvdysnJDInKVxcbiAgICAgICAgICB9KTtcXG4gICAgICAgICAgdXBkYXRlSXRlbSgnZHNob3cnLCB7XFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLnJlcGxhY2UoJ+WxleW8gCcsICfmlLbotbcnKSAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICAgICAgICB9KTtcXG5cXG5cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0obWFyaywgJzAnKVxcbiAgICAgICAgICB1cGRhdGVJdGVtKCdkY29udGVudCcsIHtcXG4gICAgICAgICAgICB0aXRsZTogZHRpdGxlLnJlcGxhY2UoL1xcXFw+Lio/XFxcXDwvLCc+JytzZGMrJzwnKVxcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oY29sb3I9XFxcIikuKj8oXFxcIikvLCckMScrY3MuaGlkZSsnJDInKVxcbiAgICAgICAgICB9KTtcXG4gICAgICAgICAgdXBkYXRlSXRlbSgnZHNob3cnLCB7XFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLnJlcGxhY2UoJ+aUtui1tycsICflsZXlvIAnKSAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICB9LG1hcmssIGRlc2MsIHNkZXNjLGNvbG9ycyksXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiAnZHNob3cnLFxcbiAgICAgIH1cXG4gICAgfSlcXG4gICAgdmFyIHNjPXN0b3JhZ2UwLmdldEl0ZW0obWFyaywgJzAnKSA9PSAnMCcgPyBzZGVzYy5mb250Y29sb3IoY29sb3JzLmhpZGUpIDogZGVzYy5mb250Y29sb3IoY29sb3JzLnNob3cpO1xcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOnNjLFxcbiAgICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6ICdkY29udGVudCcsXFxuICAgICAgICBsaW5lU3BhY2luZzogNixcXG4gICAgICAgIHRleHRTaXplOiAxNSxcXG4gICAgICAgIGxpbmVWaXNpYmxlOiB0cnVlLFxcbiAgICAgIH1cXG4gICAgfSlcXG4gIH0sXFxuICBzdHJDb252ZXJ0OmZ1bmN0aW9uKGFyciwgc3ApIHtcXG4gICAgICBzcCA9IHNwICE9IHVuZGVmaW5lZCA/IHNwIDogJy8nO1xcbiAgICAgIHZhciByZWcgPSBuZXcgUmVnRXhwKHNwKTtcXG5cXG4gICAgICByZXR1cm4gYXJyLm1hcCh4ID0+IHtcXG4gICAgICAgIHN0ciA9IHg7XFxuICAgICAgICBpZiAocmVnLnRlc3Qoc3RyKSkge1xcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoc3ApLm1hcCgodmFsLCBpbmRleCkgPT4gKGluZGV4ID09PSAwID8gJycgOiAnJykgKyB2YWwpLnNsaWNlKDAsIDUpLmpvaW4oJyAnKS5yZXBsYWNlKC8gJC8sICcnKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBzdHJcXG4gICAgICB9KVxcbiAgfSxcXG5cXG4vL+a1t+aKpVxcbiAgc2V0Q29udGVudDogZnVuY3Rpb24gKG9iaikge1xcbiAgICAvL2xvZyhvYmopXFxuICAgIHZhciBjdXN0b20gPSB0aGlzLmdldFByZXNldCgpO1xcbiAgICB2YXIgbnVtID0gb2JqLm51bSAhPSB1bmRlZmluZWQgPyBvYmoubnVtIDogMTAwO1xcbiAgICB2YXIgY29udGVudHMgPSBvYmoubWFpbjtcXG4gICAgaWYgKGNvbnRlbnRzLmNvbnN0cnVjdG9yID09IFN0cmluZykge1xcbiAgICAgIGNvbnRlbnRzID0gY29udGVudHMuc3BsaXQoJ1xcXFxuJyk7XFxuICAgIH1cXG4gICAgdmFyIHNvcnRPcmRlciA9IG9iai5zb3J0ID8gb2JqLnNvcnQgOiBbXTtcXG4gICAgdmFyIGZpbHRlcmxpc3QgPSBvYmouZmlsaXN0ID8gb2JqLmZpbGlzdCA6IFtdO1xcbiAgICB2YXIgaW1nID0gb2JqLmltZztcXG4gICAgdmFyIHRleHRzID0gY29udGVudHMubWFwKHggPT4ge1xcbiAgICAgIGlmICh4LmluY2x1ZGVzKCdocmVmJykpIHtcXG4gICAgICAgIHZhciBsaXN0ID0gcGRmYSh4LCAnYm9keSYmYScpLm1hcChrID0+IHBkZmgoaywgJ1RleHQnKSkuc2xpY2UoMCwgNSkuam9pbignICcpO1xcbiAgICAgICAgaWYgKGxpc3QgPT0gJycpIHtcXG4gICAgICAgICAgcmV0dXJuIHBkZmgoeCwgJ1RleHQnKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHJldHVybiBwZGZoKHgsICc6bWF0Y2hUZXh0JiZUZXh0JykgKyBsaXN0O1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgICByZXR1cm4gcGRmaCh4LCAnVGV4dCcpO1xcbiAgICB9KTtcXG4gICAgdmFyIGFycmF5ID0gdGV4dHMuc29ydCgoYSwgYikgPT4ge1xcbiAgICAgIGNvbnN0IGluZGV4QSA9IHNvcnRPcmRlci5pbmRleE9mKGEuc3Vic3RyKDAsIDIpKTtcXG4gICAgICBjb25zdCBpbmRleEIgPSBzb3J0T3JkZXIuaW5kZXhPZihiLnN1YnN0cigwLCAyKSk7XFxuICAgICAgcmV0dXJuIGluZGV4QSAtIGluZGV4QjtcXG4gICAgfSlcXG4gICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnKCcgKyBzb3J0T3JkZXIuam9pbignfCcpICsgJyknKTtcXG4gICAgYXJyYXkgPSBhcnJheS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcXG4gICAgICByZXR1cm4gcmVnZXgudGVzdChpdGVtKTtcXG4gICAgfSk7XFxuXFxuICAgIHZhciBmaXJlZyA9IG5ldyBSZWdFeHAoJygnICsgZmlsdGVybGlzdC5qb2luKCd8JykgKyAnKScpO1xcbiAgICBpZiAoZmlsdGVybGlzdC5sZW5ndGggPiAwKSB7XFxuICAgICAgYXJyYXkgPSBhcnJheS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcXG4gICAgICAgIHJldHVybiAhZmlyZWcudGVzdChpdGVtKTtcXG4gICAgICB9KTtcXG4gICAgfVxcbiAgICAvL2xvZyhhcnJheSlcXG5cXG4gICAgLy9hcnJheSA9IHNvcnRPcmRlci5sZW5ndGg9PTA/YXJyYXk6dGhpcy5zdHJDb252ZXJ0KGFycmF5KTtcXG4gICAgYXJyYXkgPSB0aGlzLnN0ckNvbnZlcnQoYXJyYXksIG9iai5zcCk7XFxuXFxuICAgIGlmIChhcnJheS5sZW5ndGggPiA2KSB7XFxuICAgICAgYXJyYXkgPSBhcnJheS5zbGljZSgwLCA2KTtcXG4gICAgfVxcblxcbiAgICB2YXIgdGl0bGVzID0gW107XFxuICAgIHZhciBkZXNjcyA9IFtdO1xcblxcbiAgICBzd2l0Y2ggKGFycmF5Lmxlbmd0aCkge1xcbiAgICAgIGNhc2UgMjpcXG4gICAgICAgIHRpdGxlcyA9IGFycmF5WzBdO1xcbiAgICAgICAgZGVzY3MgPSBhcnJheVsxXTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICAgIGNhc2UgMzpcXG4gICAgICAgIHRpdGxlcyA9IGFycmF5LnNsaWNlKDAsIDEpO1xcbiAgICAgICAgZGVzY3MgPSBhcnJheS5zbGljZSgxKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICAgIGNhc2UgNDpcXG4gICAgICBjYXNlIDU6XFxuICAgICAgICB0aXRsZXMgPSBhcnJheS5zbGljZSgwLCAyKTtcXG4gICAgICAgIGRlc2NzID0gYXJyYXkuc2xpY2UoMik7XFxuICAgICAgICBicmVhaztcXG4gICAgICBjYXNlIDY6XFxuICAgICAgZGVmYXVsdDpcXG4gICAgICAgIHRpdGxlcyA9IGFycmF5LnNsaWNlKDAsIDMpO1xcbiAgICAgICAgZGVzY3MgPSBhcnJheS5zbGljZSgzKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICB9XFxuICAgIHN0b3JhZ2UwLnB1dE15VmFyKCdlcl9pbmZvJywge1xcbiAgICAgIGRlc2M6IGRlc2NzLmpvaW4oJ1xcXFxuJyksXFxuICAgICAgaW1nOiBpbWcsXFxuICAgIH0pXFxuICAgIGQucHVzaCh7XFxuICAgICAvLyB0aXRsZTogdGhpcy5zbWFsbCh0aXRsZXNbMF0sY3VzdG9tLuagh+mimOminOiJsikgKyB0aGlzLnNtYWxsKCdcXFxcbicgKyB0aXRsZXMuc2xpY2UoMCwgMSkuam9pbignXFxcXG4nKSwgY3VzdG9tLuaPj+i/sOS4iiksXFxuICAgICAgLy9kZXNjOiB0aGlzLnNtYWxsKGRlc2NzLmpvaW4oJ1xcXFxuJyksIGN1c3RvbS7mj4/ov7DkuIspLFxcbiAgICAgICAgICB0aXRsZTogdGhpcy5zbWFsbChwZGZoKGh0bWwsICdoMSYmVGV4dCcpLGN1c3RvbS7moIfpopjpopzoibIpICsgIHRoaXMuc21hbGwoICdcXFxcbicgKyBwZGZoKGh0bWwsICcubW9kdWxlLWluZm8tdGFnLWxpbmssMiYmVGV4dCcpLGN1c3RvbS7mj4/ov7DkuIopLFxcbiAgICAgICAgICBkZXNjOiB0aGlzLnNtYWxsKHBkZmgoaHRtbCwgJy5tb2R1bGUtaW5mby1pdGVtLDEmJlRleHQnKSArICdcXFxcbicgKyBwZGZoKGh0bWwsICcubW9kdWxlLWluZm8taXRlbSwyJiZUZXh0JykgKyAnXFxcXG4nICsgcGRmaChodG1sLCAnLm1vZHVsZS1pbmZvLWl0ZW0sMyYmVGV4dCcpLGN1c3RvbS7mj4/ov7DkuIspLFxcbiAgICAgIHBpY191cmw6IGltZyArICdAUmVmZXJlcj0nLFxcbiAgICAgIHVybDogTVlfVVJMLFxcbiAgICAgIGNvbF90eXBlOiAnbW92aWVfMV92ZXJ0aWNhbF9waWNfYmx1cicsXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBcXFwiZGV0YWlsaWRcXFwiLFxcbiAgICAgICAgZ3JhZGllbnQ6IG9iai7muJDlj5ggPyBvYmou5riQ5Y+YIDogZmFsc2UsXFxuICAgICAgfVxcbiAgICB9KVxcbiAgICBpZiAob2JqLmRlc2MgIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgdGhpcy5zZXREZXNjKG9iai5kZXNjLCBudW0pO1xcbiAgICB9XFxuICB9LFxcbiAgc2V0Q3VzdG9tOiBmdW5jdGlvbiAob2JqLCBpbWcsY29sb3JzKSB7XFxuICAgIHZhciBhcnJheSA9IFtdO1xcbiAgICBpZiAob2JqLmNvbnN0cnVjdG9yID09IEFycmF5KSB7XFxuICAgICAgYXJyYXkgPSBvYmo7XFxuICAgIH1cXG4gICAgdmFyIHRpdGxlcyA9IFtdO1xcbiAgICB2YXIgZGVzY3MgPSBbXTtcXG4gICAgaWYoJ3RpdGxlcycgaW4gb2JqKXtcXG4gICAgICB0aXRsZXM9b2JqLnRpdGxlcztcXG4gICAgfVxcbiAgICBpZignZGVzY3MnIGluIG9iail7XFxuICAgICAgZGVzY3M9b2JqLmRlc2NzO1xcbiAgICB9XFxuICAgIFxcbiAgICBpZih0aXRsZXMubGVuZ3RoPT0wJiZkZXNjcy5sZW5ndGg9PTApe1xcbiAgICBhcnJheSA9IHRoaXMuc3RyQ29udmVydChhcnJheSk7XFxuICAgIHN3aXRjaCAoYXJyYXkubGVuZ3RoKSB7XFxuICAgICAgY2FzZSAyOlxcbiAgICAgICAgdGl0bGVzID0gYXJyYXlbMF07XFxuICAgICAgICBkZXNjcyA9IGFycmF5WzFdO1xcbiAgICAgICAgYnJlYWs7XFxuICAgICAgY2FzZSAzOlxcbiAgICAgICAgdGl0bGVzID0gYXJyYXkuc2xpY2UoMCwgMSk7XFxuICAgICAgICBkZXNjcyA9IGFycmF5LnNsaWNlKDEpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgICAgY2FzZSA0OlxcbiAgICAgIGNhc2UgNTpcXG4gICAgICAgIHRpdGxlcyA9IGFycmF5LnNsaWNlKDAsIDIpO1xcbiAgICAgICAgZGVzY3MgPSBhcnJheS5zbGljZSgyKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICAgIGNhc2UgNjpcXG4gICAgICAgIHRpdGxlcyA9IGFycmF5LnNsaWNlKDAsIDMpO1xcbiAgICAgICAgZGVzY3MgPSBhcnJheS5zbGljZSgzKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICBcXG4gICAgXFxuICAgIHN0b3JhZ2UwLnB1dE15VmFyKCdlcl9pbmZvJywge1xcbiAgICAgIGRlc2M6IGRlc2NzLmpvaW4oJ1xcXFxuJyksXFxuICAgICAgaW1nOiBpbWcsXFxuICAgIH0pXFxuICAgIGlmIChjb2xvcnMgIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgdmFyIGNvbG9yX2xpc3Q9W107XFxuXFxuICAgICAgZm9yICh2YXIga2V5IGluIGNvbG9ycykge1xcbiAgICAgIHZhciByYW5nZSA9IGtleS5zcGxpdCgnLScpO1xcbiAgICAgIHZhciBzdGFydCA9IHBhcnNlSW50KHJhbmdlWzBdKTtcXG4gICAgICB2YXIgZW5kID0gcmFuZ2VbMV0gPyBwYXJzZUludChyYW5nZVsxXSkgOiBzdGFydDtcXG4gICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcXG4gICAgICAgIGNvbG9yX2xpc3RbaS0xXSA9IGNvbG9yc1trZXldO1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG5cXG4gICAgICBcXG4gICAgICBpZihjb2xvcl9saXN0IT10aXRsZXMubGVuZ3RoK2Rlc2NzLmxlbmd0aCl7XFxuICAgICAgICBjb25zdCBmaWxsQ291bnQgPSAodGl0bGVzLmxlbmd0aCtkZXNjcy5sZW5ndGgpIC0gY29sb3JfbGlzdC5sZW5ndGg7IC8vIOmcgOimgeihpem9kOeahOS4quaVsFxcbiAgICAgICAgY29uc3QgZmlsbGVkQXJyID0gQXJyYXkoZmlsbENvdW50KS5maWxsKHt9KTsgLy8g55Sf5oiQ5aGr5YWF5pWw57uEXFxuICAgICAgICBjb2xvcl9saXN0PWNvbG9yX2xpc3QuY29uY2F0KGZpbGxlZEFycik7XFxuICAgICAgfVxcbiAgXFxuICAgICAgdmFyIG1pZEluZGV4ID0gTWF0aC5mbG9vcihjb2xvcl9saXN0Lmxlbmd0aCAvIDIpOyBcXG4gICAgICB2YXIgZmlyc3RIYWxmID0gY29sb3JfbGlzdC5zbGljZSgwLCBtaWRJbmRleCk7XFxuICAgICAgdmFyIHNlY29uZEhhbGYgPSBjb2xvcl9saXN0LnNsaWNlKG1pZEluZGV4KTtcXG4gICAgICAgICAgIFxcbiAgICAgIGZ1bmN0aW9uIHRleHRBcnJheShzdHlsZSx0ZXh0QXJyYXkpIHtcXG4gICAgICAgIHZhciBsaXN0PVtdO1xcbiAgICAgICAgc3R5bGUuZm9yRWFjaCgoeCwgaSkgPT4ge1xcbiAgICAgICAgdmFyIGxlZnQgPSBbXTtcXG4gICAgICAgIHZhciByaWdodCA9IFtdO1xcbiAgICAgICAgdmFyIHN0ciA9IHRleHRBcnJheVtpXTtcXG4gICAgICAgIE9iamVjdC5rZXlzKHgpLmZvckVhY2goayA9PiB7XFxuICAgICAgICAgICAgc3dpdGNoIChrKSB7XFxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbG9yJzpcXG4gICAgICAgICAgICAgICAgICAgIGxlZnQucHVzaCgnPGZvbnQgY29sb3I9XFxcIicgKyB4W2tdICsgJ1xcXCI+Jyk7XFxuICAgICAgICAgICAgICAgICAgICByaWdodC5wdXNoKCc8L2ZvbnQ+Jyk7XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICAgICAgICAgIGxlZnQucHVzaChgPCR7a30+YCk7XFxuICAgICAgICAgICAgICAgICAgICByaWdodC5wdXNoKGA8LyR7a30+YCk7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgbGlzdFtpXSA9IGxlZnQuam9pbignJykgKyBzdHIgKyByaWdodC5qb2luKCcnKTtcXG4gICAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gbGlzdDtcXG4gICAgICB9XFxuICAgICAgdGl0bGVzPXRleHRBcnJheShmaXJzdEhhbGYsdGl0bGVzKTtcXG4gICAgICBkZXNjcz10ZXh0QXJyYXkoc2Vjb25kSGFsZixkZXNjcyk7XFxuICAgICAgXFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifigJzigJzigJ3igJ0nK3RpdGxlc1swXSsnXFxcXG4nK3RpdGxlcy5zbGljZSgxLDMpLmpvaW4oJ1xcXFxuJyksXFxuICAgICAgICBkZXNjOifigJzigJzigJ3igJ0nK2Rlc2NzLmpvaW4oJ1xcXFxuJyksXFxuICAgICAgICBpbWc6aW1nKydAUmVmZXJlcj0nK2ltZyxcXG4gICAgICAgIHVybDpNWV9VUkwsXFxuICAgICAgICBjb2xfdHlwZTonbW92aWVfMV92ZXJ0aWNhbF9waWNfYmx1cicsXFxuICAgICAgICBleHRyYTp7XFxuICAgICAgICAgIGlkOlxcXCJkZXRhaWxpZFxcXCIsXFxuICAgICAgICB9XFxuICAgICAgfSlcXG4gICAgICBcXG4gICAgfSBlbHNlIHtcXG4gICAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHRpdGxlc1swXSArICdcXFxcbicgKyB0aGlzLnNtYWxsKHRpdGxlcy5zbGljZSgxLCAzKS5qb2luKCdcXFxcbicpKSxcXG4gICAgICAgIGRlc2M6IHRoaXMuc21hbGwoZGVzY3Muam9pbignXFxcXG4nKSksXFxuICAgICAgICBwaWNfdXJsOiBpbWcgKyAnQFJlZmVyZXI9JyxcXG4gICAgICAgIHVybDogTVlfVVJMLFxcbiAgICAgICAgY29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpY19ibHVyJyxcXG4gICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgaWQ6IFxcXCJkZXRhaWxpZFxcXCIsXFxuICAgICAgICB9XFxuICAgICAgfSlcXG4gIH1cXG4gIH0sXFxuICBpc0NvbG9yOiBmdW5jdGlvbiAodGV4dCkge1xcbiAgICBjb25zdCByZWdleCA9IC9eIyhbMC05QS1GYS1mXXszfXxbMC05QS1GYS1mXXs2fSkkfF4oW2Etel0rKSQvaTtcXG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QodGV4dCk7XFxuICB9LFxcbiAgZ2V0UHJlc2V0OiBmdW5jdGlvbiAoY3VzdG9tKSB7XFxuICAgIGlmICh0eXBlb2YgY3VzdG9tcyA9PSAnb2JqZWN0JyAmJiAhY3VzdG9tKSB7XFxuICAgICAgY3VzdG9tID0gY3VzdG9tcztcXG4gICAgfSBlbHNlIHtcXG4gICAgICBjdXN0b20gPSBjdXN0b20gPyBjdXN0b20gOiB7fVxcbiAgICB9XFxuICAgIGN1c3RvbS7mraPluo/popzoibIgPSAoY3VzdG9tLuato+W6j+minOiJsiAmJiB0aGlzLmlzQ29sb3IoY3VzdG9tLuato+W6j+minOiJsikpID8gY3VzdG9tLuato+W6j+minOiJsiA6ICcjMUFBRDE5JztcXG4gICAgY3VzdG9tLumAhuW6j+minOiJsiA9IChjdXN0b20u6YCG5bqP6aKc6ImyICYmIHRoaXMuaXNDb2xvcihjdXN0b20u6YCG5bqP6aKc6ImyKSkgPyBjdXN0b20u6YCG5bqP6aKc6ImyIDogJyNGRjAwMDAnO1xcbiAgICBjdXN0b20u5Zu+5qCHID0gY3VzdG9tLuWbvuaghyA/IGN1c3RvbS7lm77moIcgOiAnaHR0cHM6Ly9pMi4xMDAwMjQueHl6LzIwMjMvMDYvMTAvaDR6NjI3LndlYnAnO1xcbiAgICBjdXN0b20u57q/6Lev6YCJ5LitID0gY3VzdG9tLue6v+i3r+mAieS4rSA/IGN1c3RvbS7nur/ot6/pgInkuK0gOiAnIzAwOEI4Qic7XFxuICAgIGN1c3RvbS7nur/ot6/moLflvI8gPSBjdXN0b20u57q/6Lev5qC35byPID8gY3VzdG9tLue6v+i3r+agt+W8jyA6ICdzY3JvbGxfYnV0dG9uJztcXG4gICAgY3VzdG9tLuWIhuWJsuagt+W8jyA9IGN1c3RvbS7liIblibLmoLflvI8gPyBjdXN0b20u5YiG5Ymy5qC35byPIDogJ2JsYW5rX2Jsb2NrJztcXG4gICAgY3VzdG9tLueugOS7i+WxleW8gCA9IGN1c3RvbS7nroDku4vlsZXlvIAgPyBjdXN0b20u566A5LuL5bGV5byAIDogJ2JsYWNrJztcXG4gICAgY3VzdG9tLueugOS7i+aUtui1tyA9IGN1c3RvbS7nroDku4vmlLbotbcgPyBjdXN0b20u566A5LuL5pS26LW3IDogJ2dyZXknO1xcbiAgICBPYmplY3QuYXNzaWduKHt9LCBjdXN0b21zLCBjdXN0b20pO1xcbiAgICAvL2xvZyhjdXN0b20pXFxuICAgIHJldHVybiBjdXN0b207XFxuICB9LFxcbiAgY3JlYXRlUExpc3Q6IGZ1bmN0aW9uICh0YWJzLCB2YXJpLCBzaHNvcnQsIGN1c3RvbSwgcGFyc2UpIHtcXG4gICAgdmFyaSA9IFxcXCJlcl9cXFwiICsgdmFyaTtcXG4gICAgbGV0IHN0YWJzID0gdGFicztcXG4gICAgdGFicyA9IHRhYnMubWFwKHggPT4geC50aXRsZSE9dW5kZWZpbmVkP3gudGl0bGU6eCk7XFxuICAgIHZhciBpbmZvID0geyBwYXJzZTogcGFyc2UsIG1hcms6IHNoc29ydCB9O1xcbiAgICBpZiAoc3RhYnMuc29tZSh4ID0+IHguaGFzT3duUHJvcGVydHkoJ3VybCcpKSkge1xcbiAgICAgIGluZm9bJ3VybHMnXSA9IHN0YWJzLm1hcCh4ID0+IHgudXJsKTtcXG4gICAgfVxcblxcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHtcXG4gICAgICB2YXIgdXJsID0gJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgodmFyaSwgc2hzb3J0LCBpLCBsaW5lYywgaW5mbykgPT4ge1xcblxcbiAgICAgICAgdmFyIGxpc3RzID0gc3RvcmFnZTAuZ2V0TXlWYXIoc2hzb3J0ICsgJ19saXN0JywgJ1tdJyk7XFxuXFxuICAgICAgICBpZiAoZ2V0TXlWYXIodmFyaSArICdmb2xkJywgJzEnKSA9PSAnMCcpIHtcXG4gICAgICAgICAgdmFyIGJ0biA9IGZpbmRJdGVtKHNoc29ydCArICdfYnV0dG9uJyk7XFxuICAgICAgICAgIHZhciBmb2xkcyA9IFsnPGZvbnQgY29sb3I9XFxcIiNEM0QzRDNcXFwiPuKYtycsICc8Zm9udCBjb2xvcj1cXFwiI0ZGQTUwMFxcXCI+4piwJ107XFxuICAgICAgICAgIHZhciBwbGlzdCA9IHN0b3JhZ2UwLmdldE15VmFyKCdlcl9wbGF5bGlzdHMnLCAne30nKTtcXG5cXG4gICAgICAgICAgdmFyIGNvbCA9IHBsaXN0W3Noc29ydF0uY29sX3R5cGU7XFxuICAgICAgICAgIHZhciBjbHMgPSBwbGlzdFtzaHNvcnRdLmNscztcXG4gICAgICAgICAgdmFyIHBpYyA9IHBsaXN0W3Noc29ydF0ucGljO1xcbiAgICAgICAgICB2YXIgZXh0cmEgPSBwbGlzdFtzaHNvcnRdLmV4dHJhO1xcbiAgICAgICAgICAvL2xvZyhleHRyYSlcXG4gICAgICAgICAgdXBkYXRlSXRlbShidG4uZXh0cmEuaWQsIHtcXG4gICAgICAgICAgICB0aXRsZTogYnRuLnRpdGxlLnJlcGxhY2UoZm9sZHNbMF0sIGZvbGRzWzFdKSxcXG4gICAgICAgICAgfSlcXG5cXG4gICAgICAgICAgcHV0TXlWYXIodmFyaSArICdmb2xkJywgJzEnKTtcXG4gICAgICAgICAgLy9yZXR1cm4gJ3RvYXN0Oi8v5bGV5byA5omN6IO95pON5L2cJztcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHZhciBwbGlzdCA9IHN0b3JhZ2UwLmdldE15VmFyKCdlcl9wbGF5bGlzdHMnLCAne30nKTtcXG5cXG4gICAgICAgICAgdmFyIGNvbCA9IHBsaXN0W3Noc29ydF0uY29sX3R5cGU7XFxuICAgICAgICAgIHZhciBjbHMgPSBwbGlzdFtzaHNvcnRdLmNscztcXG4gICAgICAgICAgdmFyIHBpYyA9IHBsaXN0W3Noc29ydF0ucGljO1xcbiAgICAgICAgICB2YXIgZXh0cmEgPSBwbGlzdFtzaHNvcnRdLmV4dHJhO1xcbiAgICAgICAgICAvL2xvZyhleHRyYSlcXG4gICAgICAgIH1cXG4gICAgICAgIHB1dE15VmFyKHZhcmksIGkpO1xcblxcbiAgICAgICAgdmFyIHhsaXN0ID0gbGlzdHNbaV07XFxuICAgICAgICBpZiAoJC5mdW5jICE9IHVuZGVmaW5lZCAmJiAkLmZ1bmMuY29uc3RydWN0b3IgPT0gRnVuY3Rpb24pIHtcXG4gICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKHNoc29ydCk7XFxuICAgICAgICAgIGFkZEl0ZW1BZnRlcihzaHNvcnQgKyAnX2xpbmUnLCB7XFxuICAgICAgICAgICAgY29sX3R5cGU6ICdwaWNfMScsXFxuICAgICAgICAgICAgaW1nOiAnaHR0cHM6Ly9pbWcubmlja3lhbS5jb20vZmlsZS9mZTQxYTdhMTc0NGEzYTgxOTRkZjIuZ2lmJyxcXG4gICAgICAgICAgICB1cmw6ICd0b2FzdDovL2xvYWRpbmcnLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICBjbHM6IHNoc29ydFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfSlcXG4gICAgICAgICAgeGxpc3QgPSAkLmZ1bmMoaSwgaW5mbyk7XFxuICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKHNoc29ydCArICdfbGlzdCcsIHhsaXN0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIHZhciBwbGF5cyA9IHhsaXN0Lm1hcCh4ID0+IHtcXG4gICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB0aXRsZTogeC50aXRsZSxcXG4gICAgICAgICAgICB1cmw6IHgudXJsLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBjb2wsXFxuICAgICAgICAgICAgcGljOiBwaWMsXFxuICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24oe30sIGV4dHJhLCB7XFxuICAgICAgICAgICAgICBpZDogeC51cmwucmVwbGFjZSgvQGxhenlSdWxlW1xcXFxzXFxcXFNdKy9nLCAnJyksXFxuICAgICAgICAgICAgICBjbHM6IGNscyxcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICAgICAgaWYgKGdldE15VmFyKHNoc29ydCArICdfc29ydCcpID09ICcxJykge1xcbiAgICAgICAgICBwbGF5cy5yZXZlcnNlKCk7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgcGNmZyA9IHN0b3JhZ2UwLmdldE15VmFyKHNoc29ydCArICdfcHVzaGNmZycsICd7fScpO1xcbiAgICAgICAgaWYgKHBjZmdbJ+WNleaOqCddKSB7XFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oc2hzb3J0ICsgJ19wdXNoJywge1xcbiAgICAgICAgICAgIHRpdGxlOiBwY2ZnWydvYmonXVsn5Y2V5o6oJ11bMF1cXG4gICAgICAgICAgfSlcXG4gICAgICAgICAgcGNmZ1sn5Y2V5o6oJ10gPSBmYWxzZTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChwY2ZnWyfpgInmjqgnXSkge1xcbiAgICAgICAgICB1cGRhdGVJdGVtKHNoc29ydCArICdfcHVzaHMnLCB7XFxuICAgICAgICAgICAgdGl0bGU6IHBjZmdbJ29iaiddWyfpgInmjqgnXVswXVxcbiAgICAgICAgICB9KVxcbiAgICAgICAgICBwY2ZnWyfpgInmjqgnXSA9IGZhbHNlO1xcbiAgICAgICAgfVxcbiAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoc2hzb3J0ICsgJ19wdXNoY2ZnJywgcGNmZyk7XFxuICAgICAgICBkZWxldGVJdGVtQnlDbHMoc2hzb3J0KTtcXG4gICAgICAgIGFkZEl0ZW1BZnRlcihzaHNvcnQgKyAnX2xpbmUnLCBwbGF5cyk7XFxuXFxuICAgICAgICB2YXIgdGFieCA9IGZpbmRJdGVtc0J5Q2xzKHNoc29ydCArICdfdGFiJyk7XFxuICAgICAgICB0YWJ4LmZvckVhY2goKHgsIGlpKSA9PiB7XFxuICAgICAgICAgIHZhciB0aXRsZSA9IHgudGl0bGU7XFxuICAgICAgICAgIGlmIChpID09IGlpKSB7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh4LmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgICB0aXRsZTogdGl0bGUucmVwbGFjZSgvIyhcXFxcdyspPy9nLCBsaW5lYyksXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHguZXh0cmEuaWQsIHtcXG4gICAgICAgICAgICAgIHRpdGxlOiB0aXRsZS5yZXBsYWNlKC8jKFxcXFx3Kyk/L2csICcjJyksXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/liIfmjaLmiJDlip/vvIEnO1xcbiAgICAgIH0sIHZhcmksIHNoc29ydCwgaSwgY3VzdG9tLue6v+i3r+mAieS4rSwgaW5mbylcXG4gICAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgKGdldE15VmFyKHZhcmksICcwJykgPT0gaSA/IHRhYnNbaV0uZm9udGNvbG9yKGN1c3RvbS7nur/ot6/pgInkuK0pIDogdGFic1tpXS5mb250Y29sb3IoJyMnKSksXFxuICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgIGNvbF90eXBlOiBjdXN0b20u57q/6Lev5qC35byPLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgY2xzOiBzaHNvcnQgKyAnX3RhYicsXFxuICAgICAgICAgIGlkOiBzaHNvcnQgKyAnX3RhYl8nICsgaSxcXG4gICAgICAgIH1cXG4gICAgICB9KVxcbiAgICB9XFxuICAgIGQucHVzaCh7XFxuICAgICAgY29sX3R5cGU6IGN1c3RvbS7liIblibLmoLflvI8sXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBzaHNvcnQgKyAnX2xpbmUnLFxcbiAgICAgIH1cXG4gICAgfSlcXG4gIH0sXFxuICBwdXNoVGFiOiBmdW5jdGlvbiAodmFyaSwgc2hzb3J0KSB7XFxuICAgIGFkZExpc3RlbmVyKCdvblJlZnJlc2gnLCAkLnRvU3RyaW5nKChzaHNvcnQpID0+IHtcXG4gICAgICBjbGVhck15VmFyKHNoc29ydCArICdfcHVzaGNmZycpO1xcbiAgICAgIGNsZWFyTXlWYXIoc2hzb3J0ICsgJ19kdW9zZWxlY3QnKTtcXG4gICAgfSwgc2hzb3J0KSlcXG4gICAgdmFyIHBvYmogPSB7XFxuICAgICAgJ+WNleaOqCc6IFsn4qa/5Y2V5o6oJywgJzxiPuKmv+WNleaOqDwvYj4nLmZvbnRjb2xvcignIzAwRkE5QScpXSxcXG4gICAgICAn6YCJ5o6oJzogWyfimJHpgInmjqgnLCAnPGI+4piR6YCJ5o6oPC9iPicuZm9udGNvbG9yKCcjNDY4MkI0JyldLFxcbiAgICB9XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6ICfijJgnLFxcbiAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGNsczogc2hzb3J0ICsgJ19wdXNodGFiJyxcXG4gICAgICB9XFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogcG9ialsn5Y2V5o6oJ11bMF0sXFxuICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHNoc29ydCwgcG9iaiwgdmFyaSkgPT4ge1xcbiAgICAgICAgaWYgKGdldE15VmFyKHZhcmkgKyAnZm9sZCcsICcxJykgPT0gJzAnKSB7XFxuICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lsZXlvIDmiY3og73mk43kvZwnO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgdmFyIHRpdGxlcyA9IHBvYmpbJ+WNleaOqCddO1xcbiAgICAgICAgdmFyIHBjZmcgPSBzdG9yYWdlMC5nZXRNeVZhcihzaHNvcnQgKyAnX3B1c2hjZmcnLCAne30nKTtcXG4gICAgICAgIHBjZmdbJ29iaiddID0gcG9iajtcXG4gICAgICAgIHZhciDljZXmjqggPSBwY2ZnWyfljZXmjqgnXSA/IHBjZmdbJ+WNleaOqCddIDogZmFsc2U7XFxuXFxuICAgICAgICBpZiAo5Y2V5o6oKSB7XFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oc2hzb3J0ICsgJ19wdXNoJywge1xcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZXNbMF0sXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHBjZmdbJ+WNleaOqCddID0gZmFsc2U7XFxuICAgICAgICAgIHBjZmdbJ3BsYXlsaXN0J10ubWFwKCh4KSA9PiB7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh4LmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgICB1cmw6IHgudXJsLFxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICB1cGRhdGVJdGVtKHNoc29ydCArICdfcHVzaCcsIHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyB0aXRsZXNbMV0sXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oc2hzb3J0ICsgJ19wdXNocycsIHtcXG4gICAgICAgICAgICB0aXRsZTogcG9ialsn6YCJ5o6oJ11bMF0sXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHBjZmdbJ+WNleaOqCddID0gdHJ1ZTtcXG4gICAgICAgICAgcGNmZ1sn6YCJ5o6oJ10gPSBmYWxzZTtcXG4gICAgICAgICAgdmFyIHBsYXlsaXN0ID0gZmluZEl0ZW1zQnlDbHMoc2hzb3J0KTtcXG4gICAgICAgICAgcGNmZ1sncGxheWxpc3QnXSA9IHBsYXlsaXN0O1xcbiAgICAgICAgICBmaW5kSXRlbXNCeUNscyhzaHNvcnQpLm1hcCh4ID0+IHtcXG4gICAgICAgICAgICB2YXIgZHB1c2ggPSB7XFxuICAgICAgICAgICAgICBuYW1lOiBnZXRQYWdlVGl0bGUoKSxcXG4gICAgICAgICAgICAgIHVybDogeC50aXRsZSArICckJyArIHguZXh0cmEuaWRcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh4LmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgICB1cmw6ICQoJycpLmxhenlSdWxlKChkcHVzaCkgPT4ge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vcGFnZS9wdXNoP3J1bGU9WFlR5o6o6YCBJnB1c2h1cmw9JyArIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShkcHVzaCkpO1xcbiAgICAgICAgICAgICAgfSwgZHB1c2gpXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH1cXG4gICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKHNoc29ydCArICdfcHVzaGNmZycsIHBjZmcpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovLycgKyAoIeWNleaOqCA/ICfljZXmjqjlvIDlkK8nIDogJ+WNleaOqOWFs+mXrScpO1xcbiAgICAgIH0sIHNoc29ydCwgcG9iaiwgdmFyaSksXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBzaHNvcnQgKyAnX3B1c2gnLFxcbiAgICAgICAgY2xzOiBzaHNvcnQgKyAnX3B1c2h0YWInLFxcbiAgICAgIH1cXG4gICAgfSwge1xcbiAgICAgIHRpdGxlOiBwb2JqWyfpgInmjqgnXVswXSxcXG4gICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc2hzb3J0LCBwb2JqLCB2YXJpKSA9PiB7XFxuICAgICAgICBpZiAoZ2V0TXlWYXIodmFyaSArICdmb2xkJywgJzEnKSA9PSAnMCcpIHtcXG4gICAgICAgICAgcmV0dXJuICd0b2FzdDovL+WxleW8gOaJjeiDveaTjeS9nCc7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgdGl0bGVzID0gcG9ialsn6YCJ5o6oJ107XFxuICAgICAgICB2YXIgcGNmZyA9IHN0b3JhZ2UwLmdldE15VmFyKHNoc29ydCArICdfcHVzaGNmZycsICd7fScpO1xcbiAgICAgICAgcGNmZ1snb2JqJ10gPSBwb2JqO1xcbiAgICAgICAgdmFyIOmAieaOqCA9IHBjZmdbJ+mAieaOqCddID8gcGNmZ1sn6YCJ5o6oJ10gOiBmYWxzZTtcXG4gICAgICAgIGlmICjpgInmjqgpIHtcXG4gICAgICAgICAgdXBkYXRlSXRlbShzaHNvcnQgKyAnX3B1c2hzJywge1xcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZXNbMF0sXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHBjZmdbJ+mAieaOqCddID0gZmFsc2U7XFxuICAgICAgICAgIHBjZmdbJ3BsYXlsaXN0J10ubWFwKCh4KSA9PiB7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh4LmV4dHJhLmlkLCB7XFxuICAgICAgICAgICAgICB0aXRsZTogeC50aXRsZSxcXG4gICAgICAgICAgICAgIHVybDogeC51cmwsXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgfSlcXG4gICAgICAgICAgdXBkYXRlSXRlbShzaHNvcnQgKyAnX3B1c2h0bycsIHtcXG4gICAgICAgICAgICB0aXRsZTogJ+aOqOmAgeacrOmhtT0+VFZCb3gnLFxcbiAgICAgICAgICB9KTtcXG4gICAgICAgICAgY2xlYXJNeVZhcihzaHNvcnQgKyAnX2R1b3NlbGVjdCcpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgdXBkYXRlSXRlbShzaHNvcnQgKyAnX3B1c2hzJywge1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIHRpdGxlc1sxXSxcXG4gICAgICAgICAgfSlcXG4gICAgICAgICAgcGNmZ1sn6YCJ5o6oJ10gPSB0cnVlO1xcbiAgICAgICAgICBwY2ZnWyfljZXmjqgnXSA9IGZhbHNlO1xcbiAgICAgICAgICB2YXIgcGxheWxpc3QgPSBmaW5kSXRlbXNCeUNscyhzaHNvcnQpO1xcbiAgICAgICAgICBwY2ZnWydwbGF5bGlzdCddID0gcGxheWxpc3Q7XFxuICAgICAgICAgIGxldCBJZHMgPSBwbGF5bGlzdC5tYXAoaXQgPT4gaXQuZXh0cmEuaWQpO1xcbiAgICAgICAgICBJZHMuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICB2YXIgdGl0bGUgPSBmaW5kSXRlbSh4KS50aXRsZTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHgsIHtcXG4gICAgICAgICAgICAgIHVybDogJC5tc20odGl0bGUsIHgsIHNoc29ydCksXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgIH0pO1xcbiAgICAgICAgICB1cGRhdGVJdGVtKHNoc29ydCArICdfcHVzaCcsIHtcXG4gICAgICAgICAgICB0aXRsZTogcG9ialsn5Y2V5o6oJ11bMF0sXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHVwZGF0ZUl0ZW0oc2hzb3J0ICsgJ19wdXNodG8nLCB7XFxuICAgICAgICAgICAgdGl0bGU6ICfmjqjpgIHpgInkuK09PlRWQm94JyxcXG4gICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihzaHNvcnQgKyAnX3B1c2hjZmcnLCBwY2ZnKTtcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly8nICsgKCHpgInmjqggPyAn6YCJ5o6o5byA5ZCvJyA6ICfpgInmjqjlhbPpl60nKTtcXG4gICAgICB9LCBzaHNvcnQsIHBvYmosIHZhcmkpLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogc2hzb3J0ICsgJ19wdXNocycsXFxuICAgICAgICBjbHM6IHNoc29ydCArICdfcHVzaHRhYidcXG4gICAgICB9XFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogXFxcIuaOqOmAgeacrOmhtT0+VFZCb3hcXFwiLFxcbiAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChzaHNvcnQsIHZhcmkpID0+IHtcXG4gICAgICAgIHZhciBwY2ZnID0gc3RvcmFnZTAuZ2V0TXlWYXIoc2hzb3J0ICsgJ19wdXNoY2ZnJywgJ3t9Jyk7XFxuICAgICAgICB2YXIg5Y2V5o6oID0gcGNmZ1sn5Y2V5o6oJ10gPyBwY2ZnWyfljZXmjqgnXSA6IGZhbHNlO1xcbiAgICAgICAgdmFyIOmAieaOqCA9IHBjZmdbJ+mAieaOqCddID8gcGNmZ1sn6YCJ5o6oJ10gOiBmYWxzZTtcXG4gICAgICAgIGlmICgh5Y2V5o6oICYmICHpgInmjqgpIHtcXG4gICAgICAgICAgdmFyIHRhYnMgPSBzdG9yYWdlMC5nZXRNeVZhcihzaHNvcnQgKyAnX3RhYnMnLCAnW10nKTtcXG4gICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICB2YXIgcGxzID0gc3RvcmFnZTAuZ2V0TXlWYXIoc2hzb3J0ICsgJ19saXN0JywgJ1tdJykubWFwKGxpID0+IHtcXG4gICAgICAgICAgICAgIHJldHVybiBsaS5tYXAoaXRlbSA9PiBpdGVtLnRpdGxlICsgJyQnICsgaXRlbS51cmwucmVwbGFjZSgvQGxhenlSdWxlW1xcXFxzXFxcXFNdKy9nLCAnJykpLmpvaW4oJyMnKVxcbiAgICAgICAgICAgIH0pLmpvaW4oJyQkJCcpO1xcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgdmFyIHBscyA9IHN0b3JhZ2UwLmdldE15VmFyKHNoc29ydCArIFxcXCJfbGlzdFxcXCIsICdbXScpLm1hcCh4ID0+IHgudGl0bGUgKyBcXFwiJFxcXCIgKyB4LnVybC5yZXBsYWNlKC9AbGF6eVJ1bGVbXFxcXHNcXFxcU10rL2csICcnKSkuam9pbihcXFwiI1xcXCIpO1xcbiAgICAgICAgICAgIHZhciB0YWJzID0gW3RhYnNbZ2V0TXlWYXIodmFyaSwgJzAnKV1dO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIC8vbG9nKHBscylcXG4gICAgICAgICAgLy9sb2codGFicylcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICjpgInmjqgpIHtcXG4gICAgICAgICAgdmFyIHBscyA9IHN0b3JhZ2UwLmdldE15VmFyKHNoc29ydCArIFxcXCJfZHVvc2VsZWN0XFxcIiwgJ1tdJykubWFwKHggPT4geC50aXRsZSArIFxcXCIkXFxcIiArIHgudXJsKS5qb2luKFxcXCIjXFxcIik7XFxuICAgICAgICAgIGlmIChwbHMubGVuZ3RoID09IDApIHtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6YCJ5oup5Li656m6JztcXG4gICAgICAgICAgfVxcbiAgICAgICAgICB2YXIgdGFicyA9IFsn5pKt5pS+5YiX6KGoJ107XFxuICAgICAgICB9XFxuXFxuICAgICAgICB2YXIgaW5mbyA9IHN0b3JhZ2UwLmdldE15VmFyKCdlcl9pbmZvJywgJ3t9Jyk7XFxuICAgICAgICB2YXIgZGVzYyA9IGluZm9bJ2Rlc2MnXTtcXG4gICAgICAgIHZhciDmjqjpgIEgPSB7XFxuICAgICAgICAgIFxcXCJuYW1lXFxcIjogZ2V0UGFnZVRpdGxlKCksXFxuICAgICAgICAgIFxcXCJjb250ZW50XFxcIjogZGVzYyB8fCAnJyxcXG4gICAgICAgICAgXFxcInBpY1xcXCI6IGluZm9bJ2ltZyddIHx8ICcnLFxcbiAgICAgICAgICBcXFwiZnJvbVxcXCI6IHRhYnMuam9pbignJCQkJyksXFxuICAgICAgICAgIFxcXCJ1cmxcXFwiOiBwbHMsXFxuICAgICAgICB9XFxuICAgICAgICAvL2xvZyjmjqjpgIEpXFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9wdXNoP3J1bGU9WFlR5o6o6YCBJnB1c2h1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSjmjqjpgIEpKVxcbiAgICAgIH0sIHNoc29ydCwgdmFyaSksXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBzaHNvcnQgKyAnX3B1c2h0bycsXFxuICAgICAgICBjbHM6IHNoc29ydCArICdfcHVzaHRhYidcXG4gICAgICB9XFxuICAgIH0sIHtcXG4gICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJyxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgY2xzOiBzaHNvcnQgKyAnX3B1c2h0YWInLFxcbiAgICAgIH1cXG4gICAgfSlcXG4gIH0sXFxuICBzZXRMb25nY2xpY2s6IGZ1bmN0aW9uIChzaHNvcnQsIGN1c3RvbSkge1xcbiAgICByZXR1cm4gW3tcXG4gICAgICB0aXRsZTogJ+agt+W8j/CfjqgnLFxcbiAgICAgIGpzOiAkLnRvU3RyaW5nKChzaHNvcnQpID0+IHtcXG4gICAgICAgIGxldCBhbGxfY29scyA9IFsnJ10uY29uY2F0KGdldENvbFR5cGVzKCkpO1xcbiAgICAgICAgYWxsX2NvbHMgPSBhbGxfY29scy5maWx0ZXIoeCA9PlxcbiAgICAgICAgICAvKHRleHRffGZsZXgpLiovLnRlc3QoeCkgJiYgeCAhPSAndGV4dF9pY29uJyk7XFxuICAgICAgICAvL2xvZyhhbGxfY29scylcXG4gICAgICAgIGxldCBjbHMgPSBzdG9yYWdlMC5nZXRNeVZhcignZXJfcGxheWxpc3RzJywgJ3t9JykgfHxcXG4gICAgICAgICAgJyc7XFxuICAgICAgICBpZiAoY2xzW3Noc29ydF0gIT0gJycpIHtcXG4gICAgICAgICAgY29sID0gY2xzW3Noc29ydF0uY29sX3R5cGU7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQg5oyJ6ZKu5qC35byPID0gYWxsX2NvbHMubWFwKChpdCkgPT4ge1xcbiAgICAgICAgICByZXR1cm4gaXQgPT09IGNvbCA/ICfinqHvuI8nICsgaXQgOiBpdDtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGV0IHRpcHMgPSAn6K+36YCJ5oup6YCJ6ZuG5oyJ6ZKu5qC35byPJztcXG4gICAgICAgIHJldHVybiAkKOaMiemSruagt+W8jywgMiwgdGlwcykuc2VsZWN0KChzaHNvcnQsIGNscykgPT4ge1xcbiAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL+Keoe+4jy9nLCAnJyk7XFxuICAgICAgICAgIC8qc3RvcmFnZTAuc2V0SXRlbSgn5oyJ6ZKu5qC35byPJywgaW5wdXQpOyovXFxuICAgICAgICAgIGxldCBvbGRJZHMgPSAoZmluZEl0ZW1zQnlDbHMoc2hzb3J0KSB8fCBbXSkubWFwKGl0ID0+IGl0LmV4dHJhLmlkKTsgLy/ogIHlhYPntKBpZHNcXG4gICAgICAgICAgb2xkSWRzLmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh4LCB7XFxuICAgICAgICAgICAgICBjb2xfdHlwZTogaW5wdXRcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgfSk7XFxuICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7LliIfmjaLpgInpm4bmjInpkq7moLflvI/kuLo6JyArIGlucHV0O1xcbiAgICAgICAgfSwgc2hzb3J0LCBjbHMpO1xcbiAgICAgIH0sIHNoc29ydCwgY3VzdG9tKVxcbiAgICB9XVxcbiAgfSxcXG4gIHNldFRhYnM6IGZ1bmN0aW9uICh0YWJzLCB2YXJpLCBzaHNvcnQsIHBhcnNlKSB7XFxuICAgIGxldCBjdXN0b20gPSBwYXJzZS7oh6rlrprkuYk7XFxuICAgIGxldCBzdGFicyA9IHRhYnM7XFxuICAgIHRhYnMgPSB0YWJzLm1hcCh4ID0+IHgudGl0bGUhPXVuZGVmaW5lZD94LnRpdGxlOngpO1xcblxcbiAgICBjdXN0b20gPSB0aGlzLmdldFByZXNldChjdXN0b20pO1xcblxcbiAgICBzaHNvcnQgPSBzaHNvcnQgPyBzaHNvcnQgOiAnc2hzb3J0JztcXG4gICAgdmFyIHRpdGxlID0gKGdldE15VmFyKHNoc29ydCArICdfc29ydCcsICcwJykgPT0gJzEnKSA/ICc8Yj48c3BhbiBzdHlsZT1cXFwiY29sb3I6ICcgKyBjdXN0b20u6YCG5bqP6aKc6ImyICsgJ1xcXCI+6YCG5bqPPC9zcGFuPjwvYj4nIDogJzxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjogJyArIGN1c3RvbS7mraPluo/popzoibIgKyAnXFxcIj7mraPluo88L3NwYW4+PC9iPidcXG4gICAgXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6IHZhcmkgKyAnOicgKyB0aXRsZSxcXG4gICAgICBkZXNjOiAn5YWxJyArIFN0cmluZyh0YWJzLmxlbmd0aCkuZm9udGNvbG9yKCcjNDY4MkI0JykgKyAn5p2h57q/6LevJyxcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHNoc29ydCwgdmFyaSwgY3VzdG9tKSA9PiB7XFxuICAgICAgICBsZXQgY29uZiA9IGdldE15VmFyKHNoc29ydCArICdfc29ydCcsICcwJyk7XFxuICAgICAgICBpZiAoZ2V0TXlWYXIoJ2VyXycgKyB2YXJpICsgJ2ZvbGQnLCAnMScpID09ICcwJykge1xcbiAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bGV5byA5omN6IO95pON5L2cJztcXG4gICAgICAgIH1cXG4gICAgICAgIHZhciBjbHNsaXN0cyA9IGZpbmRJdGVtc0J5Q2xzKHNoc29ydCk7XFxuICAgICAgICB2YXIgbmV3Y2xzbGlzdCA9ICQuZGF0YUNvbnZlcnQoY2xzbGlzdHMpO1xcblxcbiAgICAgICAgdmFyIHRpdGxlcyA9IFtgJHtjdXN0b20u5q2j5bqP6aKc6ImyfVxcXCI+5q2j5bqPYCwgYCR7Y3VzdG9tLumAhuW6j+minOiJsn1cXFwiPumAhuW6j2BdO1xcblxcbiAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKHNoc29ydCk7XFxuICAgICAgICBuZXdjbHNsaXN0LnJldmVyc2UoKTtcXG4gICAgICAgIGFkZEl0ZW1BZnRlcihzaHNvcnQgKyAnX2xpbmUnLCBuZXdjbHNsaXN0KTtcXG5cXG4gICAgICAgIHZhciBvYmogPSBmaW5kSXRlbShzaHNvcnQgKyAnX2F2YXRhcicpXFxuXFxuICAgICAgICBpZiAoY29uZiA9PSAnMScpIHtcXG4gICAgICAgICAgdXBkYXRlSXRlbShzaHNvcnQgKyAnX2F2YXRhcicsIHtcXG4gICAgICAgICAgICB0aXRsZTogb2JqLnRpdGxlLnJlcGxhY2UodGl0bGVzWzFdLCB0aXRsZXNbMF0pLFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgICBwdXRNeVZhcihzaHNvcnQgKyAnX3NvcnQnLCAnMCcpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgdXBkYXRlSXRlbShzaHNvcnQgKyAnX2F2YXRhcicsIHtcXG4gICAgICAgICAgICB0aXRsZTogb2JqLnRpdGxlLnJlcGxhY2UodGl0bGVzWzBdLCB0aXRsZXNbMV0pLFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgICBwdXRNeVZhcihzaHNvcnQgKyAnX3NvcnQnLCAnMScpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+WIh+aNouaOkuW6j+aIkOWKnyc7XFxuICAgICAgfSwgc2hzb3J0LCB2YXJpLCBjdXN0b20pLFxcbiAgICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcXG4gICAgICBpbWc6IGN1c3RvbS7lm77moIcsXFxuICAgICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBzaHNvcnQgKyAnX2F2YXRhcicsXFxuICAgICAgICBsb25nQ2xpY2s6IHRoaXMuc2V0TG9uZ2NsaWNrKHNoc29ydCksXFxuICAgICAgfVxcbiAgICB9KVxcbiAgICB2YXIg5oqY5Y+gID0gJ+KAnOKAnOKAneKAnTxiPicgKyAn4pi3Jy5mb250Y29sb3IoXFxcIiNEM0QzRDNcXFwiKTtcXG4gICAgdmFyIOWxleW8gCA9ICfigJzigJzigJ3igJ08Yj4nICsgJ+KYsCcuZm9udGNvbG9yKFxcXCIjRkZBNTAwXFxcIik7XFxuICAgIHZhciBmb2xkbmFtZSA9ICdlcl8nICsgdmFyaSArICdmb2xkJztcXG4gICAgdmFyIGZvbGQgPSBnZXRNeVZhcihmb2xkbmFtZSwgJzEnKTtcXG4gICAgaWYgKHR5cGVvZiAocGFyc2VbJ+aOqOmAgSddKSAhPSAndW5kZWZpbmVkJyAmJiBwYXJzZVsn5o6o6YCBJ10pXFxuICAgICAgdGhpcy5wdXNoVGFiKCdlcl8nICsgdmFyaSwgc2hzb3J0KTtcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogZm9sZCA9PT0gJzAnID8g5oqY5Y+gIDog5bGV5byALFxcbiAgICAgIGNvbF90eXBlOiBjdXN0b20u57q/6Lev5qC35byPLFxcbiAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoZm9sZG5hbWUsIHNoc29ydCkgPT4ge1xcbiAgICAgICAgdmFyIGZvbGQgPSBnZXRNeVZhcihmb2xkbmFtZSwgJzEnKTtcXG4gICAgICAgIHZhciBvYmogPSBmaW5kSXRlbShzaHNvcnQgKyAnX2xpbmUnKTtcXG4gICAgICAgIHZhciBidG4gPSBmaW5kSXRlbShzaHNvcnQgKyAnX2J1dHRvbicpO1xcbiAgICAgICAgdmFyIGZvbGRzID0gWyc8Zm9udCBjb2xvcj1cXFwiI0QzRDNEM1xcXCI+4pi3JywgJzxmb250IGNvbG9yPVxcXCIjRkZBNTAwXFxcIj7imLAnXTtcXG5cXG4gICAgICAgIGlmIChmb2xkID09ICcwJykge1xcbiAgICAgICAgICBwdXRNeVZhcihmb2xkbmFtZSwgJzEnKTtcXG4gICAgICAgICAgdmFyIGNzID0gc3RvcmFnZTAuZ2V0TXlWYXIoc2hzb3J0ICsgJ19jbHMnKTtcXG4gICAgICAgICAgYWRkSXRlbUFmdGVyKG9iai5leHRyYS5pZCwgY3MpO1xcbiAgICAgICAgICB1cGRhdGVJdGVtKGJ0bi5leHRyYS5pZCwge1xcbiAgICAgICAgICAgIHRpdGxlOiBidG4udGl0bGUucmVwbGFjZShmb2xkc1swXSwgZm9sZHNbMV0pLFxcbiAgICAgICAgICB9KVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGZvbGQgPT0gJzEnKSB7XFxuICAgICAgICAgIHB1dE15VmFyKGZvbGRuYW1lLCAnMCcpO1xcbiAgICAgICAgICB2YXIgcGNscyA9IGZpbmRJdGVtc0J5Q2xzKHNoc29ydCk7XFxuICAgICAgICAgIHZhciBjeCA9ICQuZGF0YUNvbnZlcnQocGNscyk7XFxuICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKHNoc29ydCArICdfY2xzJywgY3gpO1xcbiAgICAgICAgICBkZWxldGVJdGVtQnlDbHMoc2hzb3J0KTtcXG4gICAgICAgICAgdXBkYXRlSXRlbShidG4uZXh0cmEuaWQsIHtcXG4gICAgICAgICAgICB0aXRsZTogYnRuLnRpdGxlLnJlcGxhY2UoZm9sZHNbMV0sIGZvbGRzWzBdKSxcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly8nICsgKGZvbGQgPT09ICcxJyA/ICfmlLbotbcnIDogJ+WxleW8gCcpO1xcbiAgICAgIH0sIGZvbGRuYW1lLCBzaHNvcnQpLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogc2hzb3J0ICsgJ19idXR0b24nLFxcbiAgICAgIH1cXG4gICAgfSlcXG4gICAgdGhpcy5jcmVhdGVQTGlzdChzdGFicywgdmFyaSwgc2hzb3J0LCBjdXN0b20sIHBhcnNlKTtcXG4gIH0sXFxuICBzZXRUYWJzMjogZnVuY3Rpb24gKHRhYnMsIHZhcmksIHNoc29ydCwgcGFyc2UsIGV4cCkge1xcbiAgICBsZXQgY3VzdG9tID0gcGFyc2Uu6Ieq5a6a5LmJO1xcbiAgICBsZXQgc3RhYnMgPSB0YWJzO1xcbiAgICB0YWJzID0gdGFicy5tYXAoeCA9PiB4LnRpdGxlIT11bmRlZmluZWQ/eC50aXRsZTp4KTtcXG4gICAgY3VzdG9tID0gdGhpcy5nZXRQcmVzZXQoY3VzdG9tKTtcXG4gICAgc2hzb3J0ID0gc2hzb3J0ID8gc2hzb3J0IDogJ3Noc29ydCc7XFxuICAgIHZhciB0aXRsZSA9IChnZXRNeVZhcihzaHNvcnQgKyAnX3NvcnQnLCAnMCcpID09ICcxJykgPyAnPGI+PHNwYW4gc3R5bGU9XFxcImNvbG9yOicgKyBjdXN0b20u6YCG5bqP6aKc6ImyICsgJ1xcXCI+6YCG5bqPPC9zcGFuPjwvYj4nIDogJzxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjonICsgY3VzdG9tLuato+W6j+minOiJsiArICdcXFwiPuato+W6jzwvc3Bhbj48L2I+J1xcblxcbiAgICB2YXIg5oqY5Y+gID0gJzxiPuaKmOWPoCcgKyAn4pi3Jy5mb250Y29sb3IoXFxcIiNEM0QzRDNcXFwiKTtcXG4gICAgdmFyIOWxleW8gCA9ICc8Yj7lsZXlvIAnICsgJ+KYsCcuZm9udGNvbG9yKFxcXCIjRkZBNTAwXFxcIik7XFxuICAgIHZhciBmb2xkbmFtZSA9ICdlcl8nICsgdmFyaSArICdmb2xkJztcXG4gICAgdmFyIGZvbGQgPSBnZXRNeVZhcihmb2xkbmFtZSwgJzEnKTtcXG5cXG4gICAgdmFyIHVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGZvbGRuYW1lLCBzaHNvcnQsIHB1c2gpID0+IHtcXG4gICAgICB2YXIgcGwgPSBzdG9yYWdlMC5nZXRNeVZhcignZXJfcGxheWxpc3RzJywgJ3t9Jyk7XFxuICAgICAgaWYgKE9iamVjdC5rZXlzKHBsKS5sZW5ndGggPT0gMSkge1xcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgIH1cXG5cXG4gICAgICB2YXIgZm9sZCA9IGdldE15VmFyKGZvbGRuYW1lLCAnMScpO1xcbiAgICAgIHZhciBvYmogPSBmaW5kSXRlbShzaHNvcnQgKyAnX2F2YXRhcicpXFxuICAgICAgaWYgKGZvbGQgPT0gJzEnKSB7XFxuICAgICAgICB2YXIgYmNscyA9IGZpbmRJdGVtKHNoc29ydCArICdfYnV0dG9uJyk7XFxuICAgICAgICB2YXIgdGNscyA9IGZpbmRJdGVtc0J5Q2xzKHNoc29ydCArICdfdGFiJyk7XFxuICAgICAgICB2YXIgbGNscyA9IGZpbmRJdGVtKHNoc29ydCArICdfbGluZScpO1xcblxcbiAgICAgICAgdmFyIHBjbHMgPSBmaW5kSXRlbXNCeUNscyhzaHNvcnQpO1xcbiAgICAgICAgdmFyIGNzID0gW2JjbHNdLmNvbmNhdCh0Y2xzLCBbbGNsc10sIHBjbHMpO1xcblxcbiAgICAgICAgaWYgKHB1c2gpIHtcXG4gICAgICAgICAgdmFyIHBjbHMgPSBmaW5kSXRlbXNCeUNscyhzaHNvcnQgKyAnX3B1c2h0YWInKTtcXG4gICAgICAgICAgY3MgPSBwY2xzLmNvbmNhdChjcyk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICB2YXIgY3ggPSAkLmRhdGFDb252ZXJ0KGNzKTtcXG4gICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKHNoc29ydCArICdfY2xzJywgY3gpO1xcbiAgICAgICAgaWYgKHB1c2gpIHtcXG4gICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKHNoc29ydCArICdfcHVzaHRhYicpO1xcbiAgICAgICAgfVxcbiAgICAgICAgZGVsZXRlSXRlbShiY2xzLmV4dHJhLmlkKTtcXG4gICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhzaHNvcnQgKyAnX3RhYicpO1xcbiAgICAgICAgZGVsZXRlSXRlbShzaHNvcnQgKyAnX2xpbmUnKTtcXG4gICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhzaHNvcnQpO1xcblxcbiAgICAgICAgdXBkYXRlSXRlbShvYmouZXh0cmEuaWQsIHtcXG4gICAgICAgICAgZGVzYzogb2JqLmRlc2MucmVwbGFjZSgn5bGV5byAPGZvbnQgY29sb3I9XFxcIiNGRkE1MDBcXFwiPuKYsCcsICfmipjlj6A8Zm9udCBjb2xvcj1cXFwiI0QzRDNEM1xcXCI+4pi3JyksXFxuICAgICAgICB9KVxcbiAgICAgIH1cXG4gICAgICBpZiAoZm9sZCA9PSAnMCcpIHtcXG4gICAgICAgIHZhciBjcyA9IHN0b3JhZ2UwLmdldE15VmFyKHNoc29ydCArICdfY2xzJyk7XFxuICAgICAgICBhZGRJdGVtQWZ0ZXIoc2hzb3J0ICsgJ19hdmF0YXInLCBjcyk7XFxuICAgICAgICB1cGRhdGVJdGVtKG9iai5leHRyYS5pZCwge1xcbiAgICAgICAgICBkZXNjOiBvYmouZGVzYy5yZXBsYWNlKCfmipjlj6A8Zm9udCBjb2xvcj1cXFwiI0QzRDNEM1xcXCI+4pi3JywgJ+WxleW8gDxmb250IGNvbG9yPVxcXCIjRkZBNTAwXFxcIj7imLAnKSxcXG4gICAgICAgIH0pXFxuICAgICAgfVxcbiAgICAgIHB1dE15VmFyKGZvbGRuYW1lLCBmb2xkID09PSAnMScgPyAnMCcgOiAnMScpO1xcbiAgICAgIHJldHVybiAndG9hc3Q6Ly8nICsgKGZvbGQgPT09ICcxJyA/ICfmlLbotbcnIDogJ+WxleW8gCcpO1xcbiAgICB9LCBmb2xkbmFtZSwgc2hzb3J0LCAocGFyc2VbJ+aOqOmAgSddID8gdHJ1ZSA6IGZhbHNlKSk7XFxuICAgIHZhciBkZXNjID0gKGZvbGQgPT09ICcwJyA/IOaKmOWPoCA6IOWxleW8gCkgKyAnXFxcXHQnO1xcblxcbiAgICBpZiAoZXhwLmxlbmd0aCA9PSAxKSB7XFxuICAgICAgdXJsID0gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICAgIGRlc2MgPSAnJztcXG4gICAgfVxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiB2YXJpICsgJzpcXFxcdFxcXFx0JyArICflhbEnICsgU3RyaW5nKHRhYnMubGVuZ3RoKS5mb250Y29sb3IoJyM0NjgyQjQnKSArICfmnaHnur/ot68nLFxcbiAgICAgIGRlc2M6IGRlc2MsXFxuICAgICAgY29sX3R5cGU6ICdhdmF0YXInLFxcbiAgICAgIGltZzogY3VzdG9tLuWbvuaghyxcXG4gICAgICB1cmw6IHVybCxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IHNoc29ydCArICdfYXZhdGFyJyxcXG4gICAgICAgIGxvbmdDbGljazogdGhpcy5zZXRMb25nY2xpY2soc2hzb3J0KSxcXG4gICAgICB9XFxuICAgIH0pXFxuICAgIGlmICh0eXBlb2YgKHBhcnNlWyfmjqjpgIEnXSkgIT0gJ3VuZGVmaW5lZCcgJiYgcGFyc2VbJ+aOqOmAgSddKVxcbiAgICAgIHRoaXMucHVzaFRhYignZXJfJyArIHZhcmksIHNoc29ydCk7XFxuXFxuICAgIGlmIChmb2xkID09ICcwJykge1xcbiAgICAgIHJldHVyblxcbiAgICB9XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgdGl0bGUsXFxuICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCh2YXJpLCBzaHNvcnQsIGN1c3RvbSkgPT4ge1xcbiAgICAgICAgbGV0IGNvbmYgPSBnZXRNeVZhcihzaHNvcnQgKyAnX3NvcnQnLCAnMCcpO1xcbiAgICAgICAgdmFyIGNsc2xpc3RzID0gZmluZEl0ZW1zQnlDbHMoc2hzb3J0KTtcXG4gICAgICAgIHZhciBuZXdjbHNsaXN0ID0gJC5kYXRhQ29udmVydChjbHNsaXN0cyk7XFxuICAgICAgICBkZWxldGVJdGVtQnlDbHMoc2hzb3J0KTtcXG4gICAgICAgIG5ld2Nsc2xpc3QucmV2ZXJzZSgpO1xcbiAgICAgICAgYWRkSXRlbUFmdGVyKHNoc29ydCArICdfbGluZScsIG5ld2Nsc2xpc3QpO1xcblxcbiAgICAgICAgdmFyIG9iaiA9IGZpbmRJdGVtKHNoc29ydCArICdfYnV0dG9uJylcXG4gICAgICAgIHZhciB0aXRsZXMgPSBbYCR7Y3VzdG9tLuato+W6j+minOiJsn1cXFwiPuato+W6j2AsIGAke2N1c3RvbS7pgIbluo/popzoibJ9XFxcIj7pgIbluo9gXTtcXG5cXG4gICAgICAgIGlmIChjb25mID09ICcxJykge1xcbiAgICAgICAgICB1cGRhdGVJdGVtKHNoc29ydCArICdfYnV0dG9uJywge1xcbiAgICAgICAgICAgIHRpdGxlOiBvYmoudGl0bGUucmVwbGFjZSh0aXRsZXNbMV0sIHRpdGxlc1swXSksXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHB1dE15VmFyKHNoc29ydCArICdfc29ydCcsICcwJyk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICB1cGRhdGVJdGVtKHNoc29ydCArICdfYnV0dG9uJywge1xcbiAgICAgICAgICAgIHRpdGxlOiBvYmoudGl0bGUucmVwbGFjZSh0aXRsZXNbMF0sIHRpdGxlc1sxXSksXFxuICAgICAgICAgIH0pXFxuICAgICAgICAgIHB1dE15VmFyKHNoc29ydCArICdfc29ydCcsICcxJyk7XFxuICAgICAgICB9XFxuICAgICAgICAvL3JlZnJlc2hQYWdlKClcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/liIfmjaLmjpLluo/miJDlip8nXFxuICAgICAgfSwgdmFyaSwgc2hzb3J0LCBjdXN0b20pLFxcbiAgICAgIGNvbF90eXBlOiBjdXN0b20u57q/6Lev5qC35byPLFxcbiAgICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogc2hzb3J0ICsgJ19idXR0b24nLFxcbiAgICAgIH1cXG4gICAgfSlcXG4gICAgdGhpcy5jcmVhdGVQTGlzdChzdGFicywgdmFyaSwgc2hzb3J0LCBjdXN0b20sIHBhcnNlKTtcXG4gIH0sXFxuICBzZXRMaXN0czogZnVuY3Rpb24gKGxpc3RzLCBpbmRleCwgc2hzb3J0LCBwYXJzZSkge1xcbiAgICAvL2xvZyhsaXN0cylcXG4gICAgc2hzb3J0ID0gc2hzb3J0ID8gc2hzb3J0IDogJ3Noc29ydCc7XFxuICAgIHN0b3JhZ2UwLnB1dE15VmFyKHNoc29ydCArICdfbGlzdCcsIGxpc3RzKTtcXG5cXG4gICAgcGFyc2UgPSBwYXJzZSA/IHBhcnNlIDoge307XFxuICAgIHZhciDmoLflvI8gPSBwYXJzZS7moLflvI8gPyBwYXJzZS7moLflvI8gOiAnJztcXG4gICAgdmFyIOWbvuaghyA9IHBhcnNlLuWbvuaghyA/IHBhcnNlLuWbvuaghyA6ICdodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL21vdmllLzEzLnN2Zyc7XFxuICAgIHZhciBhamF4ID0gcGFyc2Uu5Yqo5oCB5pWw5o2uID8gcGFyc2Uu5Yqo5oCB5pWw5o2uIDogZmFsc2U7XFxuXFxuICAgIGlmIChhamF4KSB7XFxuICAgICAgdmFyIGxpc3QgPSBsaXN0cztcXG4gICAgICBpZiAoZ2V0TXlWYXIoc2hzb3J0ICsgJ19zb3J0JykgPT0gJzEnICYmIGxpc3RzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgIGxpc3QgPSBsaXN0cy5yZXZlcnNlKCk7XFxuICAgICAgfVxcbiAgICB9IGVsc2Uge1xcbiAgICAgIHZhciBsaXN0ID0gbGlzdHNbaW5kZXhdO1xcbiAgICAgIGlmIChnZXRNeVZhcihzaHNvcnQgKyAnX3NvcnQnKSA9PSAnMScgJiYgbGlzdHMubGVuZ3RoID4gMCkge1xcbiAgICAgICAgbGlzdCA9IGxpc3RzW2luZGV4XS5yZXZlcnNlKCk7XFxuICAgICAgfVxcbiAgICB9XFxuXFxuXFxuXFxuICAgIGlmICjmoLflvI8gPT0gJycpIHtcXG4gICAgICDmoLflvI8gPSBsaXN0Lmxlbmd0aCA+IDQgPyAndGV4dF81JyA6ICd0ZXh0XzInXFxuICAgIH1cXG5cXG4gICAgdmFyIGV4dHJhID0gJyc7XFxuXFxuICAgIGlmIChwYXJzZS5leHRyYSAhPSB1bmRlZmluZWQpIHtcXG4gICAgICBleHRyYSA9IHBhcnNlLmV4dHJhXFxuICAgIH1cXG5cXG4gICAgaWYgKGxpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgIHZhciBwbGlzdCA9IHN0b3JhZ2UwLmdldE15VmFyKCdlcl9wbGF5bGlzdHMnLCAne30nKTtcXG4gICAgICBpZiAoIXBsaXN0Lmhhc093blByb3BlcnR5KHNoc29ydCkpIHtcXG4gICAgICAgIHBsaXN0W3Noc29ydF0gPSB7fTtcXG4gICAgICB9XFxuICAgICAgcGxpc3Rbc2hzb3J0XVsnY2xzJ10gPSBzaHNvcnQ7XFxuICAgICAgcGxpc3Rbc2hzb3J0XVsnY29sX3R5cGUnXSA9IOagt+W8jztcXG4gICAgICBwbGlzdFtzaHNvcnRdWydwaWMnXSA9IOWbvuaghztcXG4gICAgICBwbGlzdFtzaHNvcnRdWydleHRyYSddID0gZXh0cmE7XFxuICAgICAgc3RvcmFnZTAucHV0TXlWYXIoJ2VyX3BsYXlsaXN0cycsIHBsaXN0KTtcXG4gICAgfVxcblxcblxcblxcbiAgICBmb3IgKHZhciBqIGluIGxpc3QpIHtcXG5cXG4gICAgICBsZXQgbHQgPSB7XFxuICAgICAgICB0aXRsZTogbGlzdFtqXS50aXRsZSxcXG4gICAgICAgIHVybDogbGlzdFtqXS51cmwsXFxuICAgICAgICBjb2xfdHlwZTog5qC35byPLFxcbiAgICAgICAgcGljOiDlm77moIcsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBpZDogbGlzdFtqXS51cmwucmVwbGFjZSgvQGxhenlSdWxlW1xcXFxzXFxcXFNdKy9nLCAnJyksXFxuICAgICAgICAgIGNsczogc2hzb3J0LFxcbiAgICAgICAgfVxcbiAgICAgIH07XFxuICAgICAgbHRbJ2V4dHJhJ10gPSBPYmplY3QuYXNzaWduKHt9LCBsdFsnZXh0cmEnXSwgZXh0cmEpO1xcbiAgICAgIGQucHVzaChsdCk7XFxuICAgIH1cXG4gIH0sXFxuICBldmFsUmU6IGZ1bmN0aW9uIChpbnB1dCwg5Ye95pWwKSB7XFxuICAgIGxldCByZXN1bHQgPSBpbnB1dDtcXG4gICAgcmVzdWx0ID0gZXZhbCgnaW5wdXQnICsg5Ye95pWwKTtcXG4gICAgcmV0dXJuIHJlc3VsdDtcXG4gIH0sXFxuICBnZXRUYWJzOiBmdW5jdGlvbiAocGFyc2UpIHtcXG4gICAgdmFyIHRhYnMgPSBbXTtcXG4gICAgdmFyIGFydHMgPSBbXTtcXG4gICAgaWYgKHR5cGVvZiBwYXJzZS7nur/ot68gPT0gJ29iamVjdCcpIHtcXG4gICAgICBhcnRzID0gcGFyc2Uu57q/6LevO1xcbiAgICB9XFxuICAgIGlmIChhcnRzLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgYXJ0cyA9IHBkZmEoaHRtbCwgcGFyc2Uu57q/6LevKTtcXG4gICAgfVxcbiAgICB2YXIg57q/6Lev5ZCNID0gcGFyc2Uu57q/6Lev5ZCN56ewO1xcbiAgICB2YXIg57q/6Lev6ZO+5o6lID0gcGFyc2Uu57q/6Lev6ZO+5o6lID8gcGFyc2Uu57q/6Lev6ZO+5o6lIDogJyc7XFxuICAgIHZhciDmm7/mjaLlh73mlbAgPSAnJztcXG4gICAgaWYgKHBhcnNlLue6v+i3r+WQjeensC5pbmNsdWRlcygnQEAnKSkge1xcbiAgICAgIOe6v+i3r+WQjSA9IHBhcnNlLue6v+i3r+WQjeensC5zcGxpdCgnQEAnKVswXTtcXG4gICAgICDmm7/mjaLlh73mlbAgPSBwYXJzZS7nur/ot6/lkI3np7Auc3BsaXQoJ0BAJylbMV07XFxuICAgIH1cXG4gICAgZm9yICh2YXIgaSBpbiBhcnRzKSB7XFxuICAgICAgbGV0IGxpbmVuYW1lID0gJyc7XFxuICAgICAgaWYgKOe6v+i3r+WQjSA9PSAnJykge1xcbiAgICAgICAgbGluZW5hbWUgPSBhcnRzW2ldO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBsaW5lbmFtZSA9IHBkZmgoYXJ0c1tpXSwg57q/6Lev5ZCNKTtcXG4gICAgICB9XFxuICAgICAgaWYgKOabv+aNouWHveaVsCAhPSAnJykge1xcbiAgICAgICAgbGluZW5hbWUgPSB0aGlzLmV2YWxSZShsaW5lbmFtZSwg5pu/5o2i5Ye95pWwKTtcXG4gICAgICB9XFxuICAgICAgdGFicy5wdXNoKHsgdGl0bGU6IGxpbmVuYW1lIH0pO1xcbiAgICAgIGlmICjnur/ot6/pk77mjqUgIT0gJycpIHtcXG4gICAgICAgIHRhYnNbaV1bJ3VybCddID0gcGQoYXJ0c1tpXSwg57q/6Lev6ZO+5o6lKTtcXG4gICAgICB9XFxuICAgIH1cXG4gICAgLy9sb2codGFicyk7XFxuICAgIHJldHVybiB0YWJzO1xcbiAgfSxcXG4gIGdldExpc3RzOiBmdW5jdGlvbiAocGFyc2UsIHNoc29ydCwgaCkge1xcbiAgICBodG1sID0gaCB8fCBodG1sO1xcbiAgICBzaHNvcnQgPSBzaHNvcnQgPyBzaHNvcnQgOiAnc2hzb3J0JztcXG4gICAgdmFyIGxpc3RzID0gW107XFxuICAgIHZhciBjb250cyA9IFtdO1xcbiAgICBpZiAodHlwZW9mIHBhcnNlLumAiembhiA9PSAnb2JqZWN0Jykge1xcbiAgICAgIGNvbnRzID0gcGFyc2Uu6YCJ6ZuGO1xcbiAgICB9XFxuICAgIGlmIChjb250cy5sZW5ndGggPT0gMCkge1xcbiAgICAgIHRyeSB7XFxuICAgICAgICBjb250cyA9IHBkZmEoaHRtbCwgcGFyc2Uu6YCJ6ZuGKTtcXG4gICAgICB9IGNhdGNoIHtcXG4gICAgICAgIHRvYXN0KCfpgInpm4blrprkvY3mnInor68nKVxcbiAgICAgIH1cXG4gICAgfVxcblxcbiAgICBsZXQg5pu/5o2i5Ye95pWwID0gJyc7XFxuICAgIHZhciDpgInpm4blkI3np7AgPSBwYXJzZS7pgInpm4blkI3np7AgPyBwYXJzZS7pgInpm4blkI3np7AgOiAnYSYmVGV4dCc7XFxuICAgIGlmICjpgInpm4blkI3np7AuaW5jbHVkZXMoJ0BAJykpIHtcXG4gICAgICDpgInpm4blkI3np7AgPSBwYXJzZS7pgInpm4blkI3np7Auc3BsaXQoJ0BAJylbMF07XFxuICAgICAg5pu/5o2i5Ye95pWwID0gcGFyc2Uu6YCJ6ZuG5ZCN56ewLnNwbGl0KCdAQCcpWzFdO1xcbiAgICB9XFxuXFxuICAgIHZhciDpgInpm4bpk77mjqUgPSBwYXJzZS7pgInpm4bpk77mjqUgPyBwYXJzZS7pgInpm4bpk77mjqUgOiAnYSYmaHJlZic7XFxuICAgIHZhciDop6PmnpAgPSBwYXJzZS7op6PmnpAgPyBwYXJzZS7op6PmnpAgOiAnJztcXG4gICAgdmFyIHRlbXAgPSBbXTtcXG5cXG4gICAgZm9yICh2YXIgaSBpbiBjb250cykge1xcbiAgICAgIGlmIChwYXJzZS7pgInpm4bliJfooaggIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICBpZiAocGFyc2Uu6YCJ6ZuG5YiX6KGoID09ICdvYmplY3QnKSB7XFxuICAgICAgICAgIGxpc3RzLnB1c2goY29udHNbaV0ubWFwKHggPT4ge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICB0aXRsZTogeC50aXRsZSxcXG4gICAgICAgICAgICAgIHVybDogeC51cmwgKyDop6PmnpAsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9KSlcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIGxpc3RzLnB1c2gocGRmYShjb250c1tpXSwgcGFyc2Uu6YCJ6ZuG5YiX6KGoKS5tYXAoeCA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgIHRpdGxlOiBwZGZoKHgsIOmAiembhuWQjeensCksXFxuICAgICAgICAgICAgICB1cmw6IHBkKHgsIOmAiembhumTvuaOpSkgKyDop6PmnpAsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9KSlcXG4gICAgICAgIH1cXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgdmFyIHVybCA9IHBkKGNvbnRzW2ldLCDpgInpm4bpk77mjqUpO1xcbiAgICAgICAgaWYgKCHpgInpm4bpk77mjqUuaW5jbHVkZXMoJ2hyZWYnKSkge1xcbiAgICAgICAgICB1cmwgPSBwZGZoKGNvbnRzW2ldLCDpgInpm4bpk77mjqUpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHRpdGxlID0gcGRmaChjb250c1tpXSwg6YCJ6ZuG5ZCN56ewKTtcXG4gICAgICAgIHRpdGxlID0g5pu/5o2i5Ye95pWwICE9ICcnID8gdGhpcy5ldmFsUmUodGl0bGUsIOabv+aNouWHveaVsCkgOiB0aXRsZTtcXG4gICAgICAgIHRlbXAucHVzaCh7XFxuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgdXJsOiB1cmwgKyDop6PmnpAsXFxuICAgICAgICB9KVxcbiAgICAgIH1cXG4gICAgfVxcbiAgICBsZXQg5YCS5bqPID0gcGFyc2Uu5YCS5bqPID8gcGFyc2Uu5YCS5bqPIDogZmFsc2U7XFxuICAgIHZhciByZXN1bHRzID0gbGlzdHMubGVuZ3RoID8gbGlzdHMgOiBbdGVtcF07XFxuICAgIGlmICjlgJLluo8pIHtcXG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5tYXAoeCA9PiB4LnJldmVyc2UoKSk7XFxuICAgIH1cXG4gICAgdmFyIHBsaXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoJ2VyX3BsYXlsaXN0cycsICd7fScpO1xcbiAgICBpZiAocmVzdWx0cy5zb21lKHggPT4geC5sZW5ndGggPiAwKSkge1xcbiAgICAgIGlmICghcGxpc3QuaGFzT3duUHJvcGVydHkoc2hzb3J0KSkge1xcbiAgICAgICAgcGxpc3Rbc2hzb3J0XSA9IHt9O1xcbiAgICAgIH1cXG4gICAgICBwbGlzdFtzaHNvcnRdWydsZW5ndGgnXSA9IHJlc3VsdHMubGVuZ3RoO1xcbiAgICB9O1xcbiAgICBzdG9yYWdlMC5wdXRNeVZhcignZXJfcGxheWxpc3RzJywgcGxpc3QpO1xcbiAgICByZXR1cm4gcmVzdWx0cztcXG4gIH0sXFxuICBnZXRQbGF5ZXJzOiBmdW5jdGlvbiAocGFyc2UsIG1vZGUsIGZ1bmMpIHtcXG4gICAgLy9sb2cobW9kZSlcXG4gICAgdmFyIHBsYXkgPSAnZXJfcGxheWxpc3RfJztcXG4gICAgdGhpcy5wcmVMb2FkKGZ1bmMpO1xcbiAgICB0aGlzLmNsb3NlKHBhcnNlLm1hcCh4ID0+IHgu57G75Z6LKSwgcGFyc2UubGVuZ3RoKTtcXG4gICAgbW9kZSA9IG1vZGUgPyBtb2RlIDogMTtcXG5cXG4gICAgbGV0IHBlID0gWzFdO1xcbiAgICB0cnkge1xcbiAgICAgIHBlID0gcGFyc2UubWFwKHggPT4gcGRmYShodG1sLCB4Lue6v+i3rykubGVuZ3RoKS5maWx0ZXIoeSA9PiB5ID4gMCk7XFxuICAgIH0gY2F0Y2ggeyB9XFxuXFxuXFxuICAgIHBhcnNlLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgICB2YXIgdGFicyA9IFt7IHRpdGxlOiAn5Li757q/JyB9XTtcXG4gICAgICBpZiAoaXRlbS7nur/ot68gIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICB0YWJzID0gdGhpcy5nZXRUYWJzKGl0ZW0pO1xcbiAgICAgIH1cXG4gICAgICBwdXRNeVZhcihwbGF5ICsgaSArICdfdGFicycsIHRhYnMubWFwKHggPT4geC50aXRsZSkpO1xcblxcbiAgICAgIGlmIChpdGVtLuWKqOaAgeaVsOaNrikge1xcbiAgICAgICAgaWYgKG1vZGUgPT0gMSkge1xcbiAgICAgICAgICB0aGlzLnNldFRhYnModGFicywgaXRlbS7nsbvlnossIHBsYXkgKyBpLCBpdGVtKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIHRoaXMuc2V0VGFiczIodGFicywgaXRlbS7nsbvlnossIHBsYXkgKyBpLCBpdGVtLCBwZSk7XFxuICAgICAgICB9XFxuICAgICAgICBwdXRNeVZhcignZXJfaHRtbCcsIGh0bWwpO1xcbiAgICAgICAgcHV0TXlWYXIoJ2VyX3VybCcsIE1ZX1VSTCk7XFxuICAgICAgICB2YXIgaW5mbyA9IHsgcGFyc2U6IGl0ZW0sIG1hcms6IHBsYXkgKyBpLCB1cmw6IE1ZX1VSTCB9O1xcbiAgICAgICAgaWYgKHRhYnMuc29tZSh4ID0+IHgudXJsKSkge1xcbiAgICAgICAgICBpbmZvWyd1cmxzJ10gPSB0YWJzLm1hcCh4ID0+IHgudXJsKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIHZhciBsaXN0cyA9IGZ1bmMoZ2V0TXlWYXIoJ2VyXycgKyBpdGVtLuexu+WeiywgJzAnKSwgaW5mbyk7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHZhciBsaXN0cyA9IHRoaXMuZ2V0TGlzdHMoaXRlbSwgcGxheSArIGkpO1xcblxcbiAgICAgICAgaWYgKGxpc3RzLnNvbWUoeCA9PiB4Lmxlbmd0aCA+IDApKSB7XFxuICAgICAgICAgIGlmIChtb2RlID09IDEpIHtcXG4gICAgICAgICAgICB0aGlzLnNldFRhYnModGFicywgaXRlbS7nsbvlnossIHBsYXkgKyBpLCBpdGVtKTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB0aGlzLnNldFRhYnMyKHRhYnMsIGl0ZW0u57G75Z6LLCBwbGF5ICsgaSwgaXRlbSwgcGUpO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICAgIGlmIChnZXRNeVZhcignZXJfJyArIGl0ZW0u57G75Z6LICsgJ2ZvbGQnLCAnMScpID09ICcxJykge1xcbiAgICAgICAgdGhpcy5zZXRMaXN0cyhsaXN0cywgZ2V0TXlWYXIoJ2VyXycgKyBpdGVtLuexu+WeiywgJzAnKSwgcGxheSArIGksIGl0ZW0pO1xcbiAgICAgIH1cXG4gICAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdibGFua19ibG9jaydcXG4gICAgICB9KVxcbiAgICB9KVxcbiAgfVxcbn1cXG5cXG5cXG5sZXQgTWV0aG9kcyA9IHtcXG4gIC8v5aSa6YCJ5qih5Z2XXFxuICBNdWx0aVNlbGVjdE1vZGU6IGZ1bmN0aW9uIChuYW1lLCBpZCwgc2hzb3J0KSB7XFxuICAgIHJldHVybiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChkYXRhdGl0bGUsIGRhdGF1cmwsIHNoc29ydCkgPT4ge1xcbiAgICAgIGZ1bmN0aW9uIHVuaXF1ZShhcnIpIHtcXG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBNYXAoKVxcbiAgICAgICAgcmV0dXJuIGFyci5maWx0ZXIoKGEpID0+ICFyZXMuaGFzKGEudXJsKSAmJiByZXMuc2V0KGEudXJsLCAxKSlcXG4gICAgICB9XFxuICAgICAgbGV0IGR1b3NlbGVjdCA9IHN0b3JhZ2UwLmdldE15VmFyKHNoc29ydCArIFxcXCJfZHVvc2VsZWN0XFxcIikgPyBzdG9yYWdlMC5nZXRNeVZhcihzaHNvcnQgKyBcXFwiX2R1b3NlbGVjdFxcXCIpIDogW107XFxuICAgICAgaWYgKGR1b3NlbGVjdC5maW5kSW5kZXgoeCA9PiB4LnVybCA9PT0gZGF0YXVybCkgPT0gLTEpIHtcXG4gICAgICAgIGR1b3NlbGVjdC5wdXNoKHtcXG4gICAgICAgICAgdGl0bGU6IGRhdGF0aXRsZSxcXG4gICAgICAgICAgdXJsOiBkYXRhdXJsXFxuICAgICAgICB9KVxcbiAgICAgICAgZHVvc2VsZWN0ID0gdW5pcXVlKGR1b3NlbGVjdClcXG4gICAgICAgIHVwZGF0ZUl0ZW0oZGF0YXVybCwge1xcbiAgICAgICAgICB0aXRsZTogYOKAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjojRkY1NzMzXFxcIj5gICsgZGF0YXRpdGxlLFxcbiAgICAgICAgfSk7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZUJ5VmFsdWUoYXJyLCB2YWwpIHtcXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICBpZiAoYXJyW2ldWyd1cmwnXSA9PSB2YWwpIHtcXG4gICAgICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XFxuICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHJlbW92ZUJ5VmFsdWUoZHVvc2VsZWN0LCBkYXRhdXJsKVxcbiAgICAgICAgdXBkYXRlSXRlbShkYXRhdXJsLCB7XFxuICAgICAgICAgIHRpdGxlOiBkYXRhdGl0bGVcXG4gICAgICAgIH0pO1xcbiAgICAgIH1cXG4gICAgICBzdG9yYWdlMC5wdXRNeVZhcihzaHNvcnQgKyBcXFwiX2R1b3NlbGVjdFxcXCIsIGR1b3NlbGVjdCk7XFxuICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBuYW1lLCBpZCwgc2hzb3J0KVxcbiAgfSxcXG59XFxuXFxuXFxuJC5leHBvcnRzID0ge1xcbiAgRXJqaTogRXJqaSxcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLik7fkuoznuqfmkJzntKJcIixcInBhdGhcIjpcInRvb2xcIixcInJ1bGVcIjpcIi8vdmFyIHRpdGxlID0gcGFyc2VEb21Gb3JIdG1sKGh0bWwsIOaQnOe0ouagh+etvik7XFxudmFyIHRpdGxlID0gTVlfUEFSQU1TLnRpdGxlO1xcbmxvZyh0aXRsZSlcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmTxiPjxtaWRkbGU+PGZvbnQgY29sb3I9XFxcIiNGRjAwMDBcXFwiPiDkupHnm5jlkJsu5o6oPC9mb250PjwvbWlkZGxlPicsXFxuICAgIHBpY191cmw6ICdodHRwOi8vaW1hZ2UuY29vbGFway5jb20vL2Fwa19sb2dvLzIwMjIvMDUwNy8xNC8wXzM4MjhfNzI1NF82MzlAMjYweDI2MC5wbmcudC5wbmcnLFxcbiAgICB1cmw6ICdoaWtlcjovL3NlYXJjaD9zPScgKyB0aXRsZSArICcmcnVsZT3kupHnm5jlkJso5o6o6YCBKScsXFxuICAgIGNvbF90eXBlOiAnaWNvbl9zbWFsbF80JyxcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmTxiPjxtaWRkbGU+PGZvbnQgY29sb3I9XFxcIiMxRTkwRkZcXFwiPiDogZrlvbHiiJo8L2ZvbnQ+PC9taWRkbGU+JyxcXG4gICAgcGljX3VybDogJ2h0dHA6Ly9pbWFnZS5jb29sYXBrLmNvbS9hcGtfbG9nby8yMDIxLzA3MjEvMTAvYmI1YzZkNTlhOWUzNjE1OTgzNGIzZjE5ZmM3NDlkZjUtMjg1MTA3LW9fMWZiM2Z0bDNnY3N0MXNkdDFuM2IxbTJ1bmpkMTgtdWlkLTY2MjQzNUAzNjB4MzYwLnBuZycsXFxuICAgIHVybDogJ2hpa2VyOi8vc2VhcmNoP3M9JyArIHRpdGxlICsgJyZydWxlPeiBmuW9seKImicsXFxuICAgIGNvbF90eXBlOiAnaWNvbl9zbWFsbF80JyxcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmTxiPjxtaWRkbGU+PGZvbnQgY29sb3I9XFxcIiNGRjhDMDBcXFwiPiDogZrpmIXiiJo8L2ZvbnQ+PC9taWRkbGU+JyxcXG4gICAgcGljX3VybDogJ2h0dHA6Ly9zdGF0aWMueWluZ3lvbmdodWkuY29tL2ljb24vMTI4LzY4NjM0NDcucG5nJyxcXG4gICAgdXJsOiAnaGlrZXI6Ly9zZWFyY2g/cz0nICsgdGl0bGUgKyAnJnJ1bGU96IGa6ZiF4oiaJyxcXG4gICAgY29sX3R5cGU6ICdpY29uX3NtYWxsXzQnLFxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFwiIzAwRkYwMFxcXCI+IOS6keebmOWQmy7nroA8L2ZvbnQ+PC9taWRkbGU+JyxcXG4gICAgcGljX3VybDogJ2h0dHA6Ly9zdGF0aWMueWluZ3lvbmdodWkuY29tL2ljb24vMTI4LzcwMDA0NzgucG5nJyxcXG4gICAgdXJsOiAnaGlrZXI6Ly9zZWFyY2g/cz0nICsgdGl0bGUgKyAnJnJ1bGU95LqR55uY5ZCbLueugCcsXFxuICAgIGNvbF90eXBlOiAnaWNvbl9zbWFsbF80JyxcXG59KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuKRp+etm+mAiemhtemdolwiLFwicGF0aFwiOlwic2hhaVwiLFwicnVsZVwiOlwianM6XFxudmFyIGQgPSBbXTtcXG5jb25zdCBob3N0ID0gXFxcImh0dHBzOi8vd3d3LmNsaWNsaS53YW5nL3Nob3cvMS5odG1sXFxcIjtcXG5cXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBsZXQga2V5cyA9IGxpc3RNeVZhcktleXMoKTtcXG4gICAgZm9yIChsZXQgaXQgb2Yga2V5cykge1xcbiAgICAgICAgY2xlYXJNeVZhcihpdCk7XFxuICAgIH1cXG59KSk7XFxuXFxudmFyIGdldFJhbmdlQ29sb3JzID0gZnVuY3Rpb24oKSB7wqDCoMKgwqDCoMKgwqBcXG4gICAgcmV0dXJuICcjJyArICgnMDAwMDAnICsgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAgPDwgMCkudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpO8KgwqDCoMKgwqBcXG59XFxuY29uc3Qg5LiL5LiA6aG1ID0gXFxcInBkKGh0bWwsICdhOm1hdGNoZXMo5LiL5LiA6aG1KSYmaHJlZicpXFxcIjtcXG5jb25zdCBwYWdlID0gTVlfUEFHRTtcXG5ldmFsKEpTT04ucGFyc2UocmVxdWVzdCgnaGlrZXI6Ly9wYWdlL3lqJykpLnJ1bGUpXFxuXFxudmFyIOWumuS9jeS/oeaBryA9IFt7XFxuICAgIOWkp+exu+WumuS9jTogJy5zY3JvbGwtY29udGVudCcsXFxuICAgIOWwj+exuzogJ2JvZHkmJmE6bm90KDptYXRjaGVzKOmmlnzotYTorq98QVBQfOS4k+mimHznpL7nvqR854OtfOeVmeiogHznpo/liKl86LWe5YqpfOabtOaWsHzlkajooah85o6S6KGMfOaOqOiNkHzmiJDkurp8MTgpKScsXFxuICAgIC8v5qCH6aKYOiAnc3BhbiYmVGV4dCcsXFxuICAgIOmTvuaOpeWkhOeQhjogKHUpID0+IHtcXG4gICAgICAgLy9sZXQgdXJsID0gdS5yZXBsYWNlKC90eXBlKFxcXFwvXFxcXHcrKVxcXFwuaHRtbC8sICdzaG93JDEtLS0tLS0tLS0tLS5odG1sJyk7XFxuICAgICAgICBsZXQgdXJsID0gdS5yZXBsYWNlKC90eXBlLywgJ3Nob3cnKTtcXG4gICAgICAgIHJldHVybiB1cmxcXG4gICAgfVxcbn0sIHtcXG4gICAg5LiA57qn5a6a5L2NOiAnYm9keSYmLnNjcm9sbC1jb250ZW50LDE6bjpub3QoOmhhcyg6bWF0Y2hlcyjpopHpgZMpKSl8fC5zaXRlLXRhYnMnLFxcblxcbn1dXFxuXFxuTVlfVVJMPSBob3N0O1xcbmxldCB0cnVlX3VybCA9IGdldFRydWVsaW5rKE1ZX1JVTEUudXJsLCBNWV9VUkwsIHBhZ2UpO1xcbmxvZyh0cnVlX3VybClcXG5cXG52YXIgaHRtbCA9IHJlcXVlc3QodHJ1ZV91cmwpXFxuY29uc3QgZGMgPSBkeW5hbWljQ2xhc3Moe1xcbiAgICDliIbnsbvpopzoibI6IGdldFJhbmdlQ29sb3JzKClcXG59KTtcXG5kYy7lvIDlkK/mipjlj6AoZmFsc2UpXFxuZGMu5byA5ZCv5pCc57SiKClcXG5kYy7liJvlu7rliqjmgIHliIbnsbso5a6a5L2N5L+h5oGvKVxcblxcbnZhciBwYXJzZVJ1bGUgPSB7XFxuICAgIGxpc3Q6ICdib2R5JiYubW9kdWxlLWl0ZW0nLCAvL+e7n+S4gGl0ZW1cXG4gICAgdGl0bGU6ICdhJiZ0aXRsZScsXFxuICAgIGRlc2M6ICcubW9kdWxlLWl0ZW0tdGV4dCYmVGV4dCcsXFxuICAgIGltZzogJ2ltZ3x8YSYmZGF0YS1zcmN8fGRhdGEtb3JpZ2luYWwnLFxcbiAgICB1cmw6ICdhJiZocmVmJyxcXG4gICAgcmVmOiAnQFJlZmVyZXI9JyxcXG4gICAgaW10OiB0cnVlLFxcbiAgICAvL2JhY2tpbWc6IHRydWUsXFxufVxcblxcbkNyZWF0ZS5MaXN0KGQsIGh0bWwsIHBhcnNlUnVsZSk7XFxuYXV0b1BhZ2UoKTtcXG5cXG5zZXRSZXN1bHQoZClcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuKRpuetm+mAieWIhuexu1wiLFwicGF0aFwiOlwieWpcIixcInJ1bGVcIjpcImpzOlxcbi8qXFxuYnkgzrEoemV0YWxwaGEpXFxu5LiA57qn5bCB6KOFXFxu5Yqo5oCB5YiG57G7IOWIl+ihqOWIm+W7uiDoh6rliqjkuIvkuIDpobVcXG52ZXIgMjAyMzEwMTcgMS4wXFxuKi9cXG5cXG4vL+maj+acuuminOiJslxcbnZhciBnZXRSYW5nZUNvbG9ycyA9IGZ1bmN0aW9uKCkge1xcbiAgICByZXR1cm4gJyMnICsgKCcwMDAwMCcgKyAoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMCA8PCAwKS50b1N0cmluZygxNikpLnN1YnN0cigtNik7XFxufVxcblxcbi8v5Yqo5oCB5YiG57G7XFxuZnVuY3Rpb24gZHluYW1pY0NsYXNzKG9wdGlvbnMpIHtcXG4gICAgY29uc3Qgb2JqID0ge1xcbiAgICAgICAgLy/pu5jorqTlgLxcXG4gICAgICAgIGxheW91dDogXFxcInVuZGVmaW5lZFxcXCIsXFxuICAgICAgICBodG1sOiBcXFwiZW1wdHlcXFwiLFxcbiAgICAgICAgcGFnZTogMCxcXG4gICAgICAgIOWIhuexu+minOiJsjogXFxcIiNGQTcyOThcXFwiLFxcbiAgICAgICAg5oqY5Y+gOiBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKdcXFwiLmZvbnRjb2xvcihcXFwiIzFhYWQxOVxcXCIpICsgXFxcIjwvYj5cXFwiLFxcbiAgICAgICAg5bGV5byAOiBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKhcXFwiLmZvbnRjb2xvcihcXFwiI0ZGMDAwMFxcXCIpICsgXFxcIjwvYj5cXFwiLFxcbiAgICAgICAgb3BlbjogdHJ1ZSxcXG4gICAgICAgIHN0YXRlOiBNWV9SVUxFLnVybCxcXG4gICAgICAgIHNlYXJjaDogZmFsc2UsXFxuICAgICAgICBjbGVhcnM6IFtdLFxcbiAgICAgICAgY2xlYXJhbGw6IFtcXFwieWlfZmlyc3RwYWdlXFxcIl0sXFxuICAgICAgICBkZWJ1ZzogZmFsc2UsXFxuXFxuICAgICAgICDpooTorr4ocGFyYW0pIHtcXG4gICAgICAgICAgICBpZiAocGFyYW0gPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgIHBhcmFtID0gW107XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmFtKS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xcbiAgICAgICAgICAgICAgICAvLyDlr7nmr4/kuKrlsZ7mgKflkI3miafooYzmk43kvZxcXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbVtwcm9wZXJ0eV07IC8vIOiOt+WPluWxnuaAp+WAvFxcbiAgICAgICAgICAgICAgICAvLyDlnKjov5nph4zmiafooYzmgqjnmoTmk43kvZxcXG4gICAgICAgICAgICAgICAgdGhpc1twcm9wZXJ0eV0gPSB2YWx1ZTtcXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHByb3BlcnR5ICsgXFxcIjpcXFwiICsgdmFsdWUpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9LFxcbiAgICAgICAgZXZhbEpTUnVsZShpdGVtLFxcbiAgICAgICAgICAgIGpzUnVsZSkge1xcbiAgICAgICAgICAgIGxldCBydWxlID0ganNSdWxlLnJlcGxhY2UoXFxcIkBqczpcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiXFxcIik7XFxuICAgICAgICAgICAgcnVsZSA9IHJ1bGUudHJpbSgpO1xcbiAgICAgICAgICAgIC8vbG9nKCQuc3RyaW5naWZ5KHJ1bGUpKVxcbiAgICAgICAgICAgIGxldCBpbnB1dCA9IGl0ZW07XFxuICAgICAgICAgICAgaWYgKHJ1bGUuc3RhcnRzV2l0aChcXFwiKFxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGV2YWwoXFxcInJlc3VsdCA9IFxcXCIgKyBydWxlKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgICAgICog6L+Y5Y6f5oiQICQudG9TdHJpbmcoLi4uKSDnmoTmnIDnu4jnu5PmnpzvvIzovr7liLDmnIDnu4jlpITnkIbmlrnlvI/ot5/kuIrpnaLnmoQgaWYg5LiA6Ie055qE55uu55qEXFxuICAgICAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgICAgICBldmFsKFxcXCJyZXN1bHQgPSBcXFwiICsgXFxcIigoKSA9PiB7XFxcIiArIHJ1bGUgKyBcXFwifSkoKVxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0IHx8IFxcXCJcXFwiO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGdldFRpdGxlKHNyYywgY2F0ZWdvcnkpIHtcXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBsZXQgdGl0bGVSdWxlID0gY2F0ZWdvcnkgfHwgXFxcImEmJlRleHRcXFwiO1xcbiAgICAgICAgICAgIGlmICh0aXRsZVJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHRpdGxlID0gdGhpcy5ldmFsSlNSdWxlKHNyYywgdGl0bGVSdWxlKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB0aXRsZSA9IHBhcnNlRG9tRm9ySHRtbChzcmMsIHRpdGxlUnVsZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiB0aXRsZSB8fCBcXFwiXFxcIjtcXG4gICAgICAgIH0sXFxuICAgICAgICBnZXRVcmwoc3JjLCBjYXRlZ29yeSkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBsZXQgdXJsUnVsZSA9IGNhdGVnb3J5LumTvuaOpSB8fCBcXFwiYSYmaHJlZlxcXCI7XFxuICAgICAgICAgICAgaWYgKHVybFJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIHVybFJ1bGUpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHBkKHNyYywgdXJsUnVsZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2F0ZWdvcnku6ZO+5o6l5aSE55CGID09IFxcXCJmdW5jdGlvblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gY2F0ZWdvcnku6ZO+5o6l5aSE55CGKHVybCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiB1cmwgfHwgXFxcIlxcXCI7XFxuICAgICAgICB9LFxcbiAgICAgICAgaXNOdWxsKHBhcmFtKSB7XFxuICAgICAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgICAgIH0sXFxuICAgICAgICBpc0Jvb2xlYW4odmFyaWFibGUpIHtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhcmlhYmxlICE9PSBcXFwiYm9vbGVhblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLlvIDlkK/mipjlj6Dor7fkvKDlhaXluIPlsJTlgLxcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgICAg5riF6ZmkKGxpc3QpIHtcXG4gICAgICAgICAgICBpZiAodGhpcy5pc051bGwobGlzdCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChsaXN0LmNvbnN0cnVjdG9yID09IFN0cmluZykge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIua4hemZpOaKpemUmTror7fkvKDliJfooahcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdGhpcy5jbGVhcnMgPSBsaXN0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOWFqOa4hShsaXN0KSB7XFxuICAgICAgICAgICAgaWYgKHRoaXMuaXNOdWxsKGxpc3QpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB2YXIgYyA9IHRoaXMuY2xlYXJhbGw7XFxuICAgICAgICAgICAgbGlzdCA9IGMuY29uY2F0KGxpc3QpO1xcbiAgICAgICAgICAgIHRoaXMuY2xlYXJhbGwgPSBsaXN0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOa6kOeggShpbnB1dCkge1xcbiAgICAgICAgICAgIHRoaXMuaHRtbCA9IGlucHV0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOeVjOmdoihpbnB1dCkge1xcbiAgICAgICAgICAgIHRoaXMubGF5b3V0ID0gaW5wdXQ7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICB9LFxcbiAgICAgICAg6aG156CBKGlucHV0KSB7XFxuICAgICAgICAgICAgdGhpcy5wYWdlID0gaW5wdXQ7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICB9LFxcbiAgICAgICAg54q25oCBKGlucHV0KSB7XFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IGlucHV0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOW8gOWQr+aQnOe0oihpbnB1dCkge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLnNlYXJjaCA9IGlucHV0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOW8gOWQr+aKmOWPoChpbnB1dCkge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLmlzQm9vbGVhbihpbnB1dCk7XFxuICAgICAgICAgICAgdGhpcy5vcGVuID0gaW5wdXQ7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICB9LFxcbiAgICAgICAgc2V0VGl0bGUoaywgaSwgdCkge1xcbiAgICAgICAgICAgIHJldHVybiBrID09IGkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIHQuZm9udGNvbG9yKHRoaXMu5YiG57G76aKc6ImyKSA6IHQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgYWN0aW9uKG9iaikge1xcbiAgICAgICAgICAgIHJldHVybiBbe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIua4hemZpOeKtuaAgVxcXCIsXFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChvYmopID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhvYmopO1xcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihvYmouc3RhdGUpO1xcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiaGVhZC5jYXRlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKCdjYXRlX2J1dHRvbicpO1xcbiAgICAgICAgICAgICAgICAgICAgb2JqLmFsbC5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihpdGVtKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgb2JqLmNsLmZvckVhY2goKGl0ZW0pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICB9LCBvYmopLFxcbiAgICAgICAgICAgIH0sIF07XFxuICAgICAgICB9LFxcbiAgICAgICAgY2hlY2tQYXJhbSgpIHtcXG4gICAgICAgICAgICB2YXIgb2JqID0ge307XFxuICAgICAgICAgICAgaWYgKHRoaXMucGFnZSA9PSAwICYmIHR5cGVvZiBwYWdlID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35Lyg5YWl6aG156CBXFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYWdlID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmpbXFxcIumhteeggVxcXCJdID0gdGhpcy5wYWdlO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgb2JqW1xcXCLpobXnoIFcXFwiXSA9IHBhZ2U7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHRoaXMuaHRtbCA9PSBcXFwiZW1wdHlcXFwiICYmIHR5cGVvZiBodG1sID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35Lyg5YWl5rqQ56CBXFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBodG1sID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmpbXFxcIua6kOeggVxcXCJdID0gdGhpcy5odG1sO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgb2JqW1xcXCLmupDnoIFcXFwiXSA9IGh0bWw7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0ID09IFxcXCJ1bmRlZmluZWRcXFwiICYmIHR5cGVvZiBkID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35Lyg5YWl55WM6Z2iXFxcIik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkID09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmpbXFxcIueVjOmdolxcXCJdID0gdGhpcy5sYXlvdXQ7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmpbXFxcIueVjOmdolxcXCJdID0gZDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOWIm+W7uuWKqOaAgeWIhuexuyhydWxlT2JqKSB7XFxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gW107XFxuICAgICAgICAgICAgbGV0IGNhdGVzID0gW107XFxuICAgICAgICAgICAgaWYgKHJ1bGVPYmogPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVPYmogPSBbXTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy/liJ3lp4vljJblj5jph4/lvIDlp4tcXG4gICAgICAgICAgICBjb25zdCBwYXJhbSA9IHRoaXMuY2hlY2tQYXJhbSgpO1xcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBwYXJhbS7pobXnoIE7XFxuICAgICAgICAgICAgY29uc3QgaHRtbCA9IHBhcmFtLua6kOeggTtcXG4gICAgICAgICAgICBjb25zdCBkID0gcGFyYW0u55WM6Z2iO1xcbiAgICAgICAgICAgIGNvbnN0IOeKtuaAgSA9IHRoaXMuc3RhdGU7XFxuICAgICAgICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2g7XFxuICAgICAgICAgICAgY29uc3QgZW1wdHkgPSBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgY29uc3Qg5oqY5Y+g54q25oCBID0gdGhpcy5vcGVuO1xcbiAgICAgICAgICAgIHZhciDlsZXlvIAgPSB0aGlzLuWxleW8gDtcXG4gICAgICAgICAgICB2YXIg5oqY5Y+gID0gdGhpcy7mipjlj6A7XFxuICAgICAgICAgICAgdmFyIOWFqOa4hSA9IHRoaXMuY2xlYXJhbGw7XFxuICAgICAgICAgICAgdmFyIOa4hemZpCA9IHRoaXMuY2xlYXJzO1xcbiAgICAgICAgICAgIC8v5Yid5aeL5YyW5Y+Y6YeP57uT5p2fXFxuICAgICAgICAgICAgbGV0IGluaXRfY2F0ZSA9IG5ldyBBcnJheSgyMCkuZmlsbChcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIGNvbnN0IGZvbGQgPSBnZXRNeVZhcihNWV9SVUxFLmdyb3VwLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIGNvbnN0IGNhdGVfdGVtcCA9IEpTT04ucGFyc2UoXFxuICAgICAgICAgICAgICAgIGdldE15VmFyKFxcXCJoZWFkLmNhdGVcXFwiLCBKU09OLnN0cmluZ2lmeShpbml0X2NhdGUpKVxcbiAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgaWYgKHNlYXJjaCAmJiBwYWdlID09IDEpIHtcXG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCInaGlrZXI6Ly9zZWFyY2g/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCImcz0nK2lucHV0XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLmkJzntKLlhbPplK7or41cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoXFxcImtleXdvcmRcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwia2V5d29yZFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gW107XFxuICAgICAgICAgICAgcnVsZU9iai5mb3JFYWNoKCh4KSA9PiB7XFxuICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gW107XFxuICAgICAgICAgICAgICAgIC8vbG9nKHgpXFxuICAgICAgICAgICAgICAgIGlmICh4Lmpzb24gIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgICAgICB4Lmpzb24ubWFwKGsgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3JpZXMucHVzaChKU09OLnN0cmluZ2lmeShrKS5yZXBsYWNlKC9eXFxcXFt8XFxcXF0kL2csICcnKSlcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICAvL2NhdGVnb3JpZXMucHVzaCh4Lmpzb24pXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKHgu5LiA57qn5a6a5L2NKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoeC7kuIDnuqflrprkvY0uc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCA9IHRoaXMuZXZhbEpTUnVsZShodG1sLCB4LuS4gOe6p+WumuS9jSk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBwZGZhKGh0bWwsIHgu5LiA57qn5a6a5L2NKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoeC7lpKfnsbvlrprkvY0pIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh4LuWkp+exu+WumuS9jS5zdGFydHNXaXRoKFxcXCJAanM6XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ID0gdGhpcy5ldmFsSlNSdWxlKGh0bWwsIHgu5aSn57G75a6a5L2NKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCA9IFtwZGZhKGh0bWwsIHgu5aSn57G75a6a5L2NKS5qb2luKCdcXFxcbicpXTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAvLy0t6aKd5aSW5aSE55CGLS1cXG4gICAgICAgICAgICAgICAgaWYgKCgn5aKe5YqgJyBpbiB4KSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHgu5aKe5YqgLmNvbnN0cnVjdG9yID09IFN0cmluZykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHgu5aKe5YqgID0gZXZhbCh4LuWinuWKoCk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBzbGlzdCA9IHgu5aKe5YqgLmNvbmNhdChzbGlzdCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKCgn6KGl5YWFJyBpbiB4KSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHgu6KGl5YWFLmNvbnN0cnVjdG9yID09IFN0cmluZykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHgu6KGl5YWFID0gZXZhbCh4LuihpeWFhSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBzbGlzdCA9IHNsaXN0LmNvbmNhdCh4LuihpeWFhSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgLy8tLemineWkluWkhOeQhi0tXFxuICAgICAgICAgICAgICAgIHZhciDkuIDnuqcgPSBsaXN0Lm1hcCgocykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNsaXN0ID0gW107XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIShcXFwi5bCP57G7XFxcIiBpbiB4KSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHgu5bCP57G7ID0gXFxcImJvZHkmJmE6bm90KDptYXRjaGVzKOmmlumhtSkpOm5vdChhOm5vdChbaHJlZl0pKVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBpZiAoeC7lsI/nsbsuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2xpc3QgPSB0aGlzLmV2YWxKU1J1bGUocywgeC7lsI/nsbspO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlzdCA9IHBkZmEocywgeC7lsI/nsbspO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgdmFyIOWumuS9jSA9IHNsaXN0Lm1hcCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoaXRlbSwgeC7moIfpopgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLmdldFVybChpdGVtLCB4KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXJsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIOWumuS9jTtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIC8vbG9nKOS4gOe6pylcXG4gICAgICAgICAgICAgICAgLy9sb2co5LiA57qnLmxlbmd0aClcXG4gICAgICAgICAgICAgICAgaWYgKOS4gOe6py5sZW5ndGggPT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKOS4gOe6py5qb2luKFxcXCJcXFxcblxcXCIpKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIOS4gOe6py5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKGl0ZW0uam9pbihcXFwiLFxcXCIpKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIC8vbG9nKGNhdGVnb3JpZXMpXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgaWYgKOaKmOWPoOeKtuaAgSkge1xcbiAgICAgICAgICAgICAgICBpZiAocGFnZSA9PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZm9sZCA9PT0gXFxcIjFcXFwiID8g5oqY5Y+gIDog5bGV5byALFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpdGxlLCBmb2xkLCB1LCBhbGwsIGV4cHMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb2xkID0gZ2V0TXlWYXIoTVlfUlVMRS5ncm91cCwgZm9sZCk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgW+WxleW8gCwg5oqY5Y+gXSA9IGV4cHM7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZCA9PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN4ID0gZmluZEl0ZW1zQnlDbHModGl0bGUgKyAnY2F0ZV9idXR0b24nKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcignY2F0ZV9idXR0b24nLCBjeCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKHRpdGxlICsgJ2NhdGVfYnV0dG9uJyk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjeCA9IHN0b3JhZ2UwLmdldE15VmFyKCdjYXRlX2J1dHRvbicsIFtdKS5tYXAoeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhbJ2NvbF90eXBlJ10gPSB4Wydjb2xfdHlwZSddID8geFsnY29sX3R5cGUnXSA6IHhbJ3R5cGUnXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSXRlbUFmdGVyKHRpdGxlICsgJ2NhdGVfbGluZScsIGN4KVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphbGwuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ki9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0odGl0bGUgKyAnY2F0ZV9leHAnLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGZvbGQgPT0gMSA/IOWxleW8gCA6IOaKmOWPoCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihNWV9SVUxFLmdyb3VwLCBmb2xkID09PSBcXFwiMVxcXCIgPyBcXFwiMFxcXCIgOiBcXFwiMVxcXCIpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNWV9SVUxFLnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICDnirbmgIEsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWFqOa4hSwgW+WxleW8gCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOaKmOWPoFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArICdjYXRlX2V4cCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogdGhpcy5hY3Rpb24oe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IOeKtuaAgSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbDog5YWo5riFLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6IOa4hemZpCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChwYWdlID09IDEpIHtcXG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5mb3JFYWNoKChjYXRlZ29yeSwgaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKGNhdGVnb3J5KVxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1Yl9jYXRlZ29yaWVzID0gW107XFxuICAgICAgICAgICAgICAgICAgICAvKmlmICjlsI/nsbvlrprkvY0uaW5jbHVkZXMoXFxcIjtcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHBkZmEoY2F0ZWdvcnksIOWwj+exu+WumuS9jS5zcGxpdChcXFwiO1xcXCIpWzBdKTtcXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yl9jYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMgPSBwZGZhKGNhdGVnb3J5LCDlsI/nsbvlrprkvY0uc3BsaXQoXFxcIjtcXFwiKVsxXSk7XFxuICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ki9cXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKGluZGV4KVxcbiAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMgPSBKU09OLnBhcnNlKGBbJHtjYXRlZ29yeX1dYCk7XFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyhzdWJfY2F0ZWdvcmllcylcXG4gICAgICAgICAgICAgICAgICAgIC8vIHN1Yl9jYXRlZ29yaWVzID0gcGRmYShjYXRlZ29yeSwg5bCP57G75a6a5L2NKTtcXG4gICAgICAgICAgICAgICAgICAgIC8vfVxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy/lpKfnsbtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcy5mb3JFYWNoKChpdGVtLCBrZXkpID0+IHtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgdGl0bGUgPSBwZGZoKGl0ZW0sIF/lpKfnsbvmoIfpopgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBpdGVtLnRpdGxlO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIOaOkumZpCAhPSBcXFwidW5kZWZpbmVkXFxcIiAmJiDmjpLpmaQgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZShuZXdSZWdFeHAo5o6S6ZmkLCBcXFwiZ1xcXCIpLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpzb24gPSAnJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uID0gaXRlbS51cmw7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogcGFnZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyczog5riF6ZmkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbjoganNvbixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiDnirbmgIEsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxjbGVhcnM6IOWFqOa4hSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgdXJsID0gcGQoaXRlbSwgX+Wkp+exu+mTvuaOpSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBpdGVtLnVybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAo5aSn57G75aSE55CGKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0g5LiA57qn5YiG57G75aSE55CGKHVybCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0qL1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xvZyh1cmwpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuc2V0VGl0bGUoa2V5LnRvU3RyaW5nKCksIGNhdGVfdGVtcFtpbmRleF0sIHRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQoXFxcImhpa2VyOi8vZW1wdHkjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld19jYXRlID0gW107XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jbGVhcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihpdGVtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5hbGxjbGVhcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihpdGVtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ2NhdGVfYnV0dG9uJyk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXAuZm9yRWFjaCgoY2F0ZSwgaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jYXRlLnB1c2goaW5kZXggPT09IDAgPyBwYXJhbXMua2V5LnRvU3RyaW5nKCkgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImhlYWQuY2F0ZVxcXCIsIEpTT04uc3RyaW5naWZ5KG5ld19jYXRlKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuanNvbi5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiZHRfXFxcIiArIHBhcmFtcy5qc29uLnR5cGUsIHBhcmFtcy5qc29uLnZhbHVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhcmFtcy5zdGF0ZSwgcGFyYW1zLmpzb24pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX1JVTEUudGl0bGUgKyAnY2F0ZV9saW5lJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL+Wwj+exu1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXh0cmFwb3MgPSBmYWxzZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAoaXRlbS5pbmNsdWRlcygndHlwZT1cXFwiQGV4dHJhXFxcIicpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFwb3MgPSB0cnVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9nKCfpmYTliqDlrprkvY0nKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ki9cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhcG9zKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPSBwZGZoKGl0ZW0sIFxcXCJhJiZUZXh0XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIOaOkumZpCAhPSBcXFwidW5kZWZpbmVkXFxcIiAmJiDmjpLpmaQgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cCjmjpLpmaQsIFxcXCJnXFxcIiksIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqc29uID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHBkZmgoaXRlbSwgXFxcImEmJnN0YXRlXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBkZmgoaXRlbSwgXFxcImEmJnZhbHVlXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgdGl0bGUgPSBwZGZoKGl0ZW0sIOWIhuexu+agh+mimCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPSBpdGVtLnRpdGxlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiDmjpLpmaQgIT0gXFxcInVuZGVmaW5lZFxcXCIgJiYg5o6S6ZmkICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAo5o6S6ZmkLCBcXFwiZ1xcXCIpLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIganNvbiA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzd2l0Y2ggKHRydWUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSDliIbnsbvpk77mjqUuaW5jbHVkZXMoXFxcIkBAQFxcXCIpOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBwZGZoKGl0ZW0sIOWIhuexu+mTvuaOpS5zcGxpdChcXFwiQEBAXFxcIilbMF0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBkZmgoaXRlbSwg5YiG57G76ZO+5o6lLnNwbGl0KFxcXCJAQEBcXFwiKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSDliIbnsbvpk77mjqUuaW5jbHVkZXMoXFxcIkBAXFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbiA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IOWIhuexu+mTvuaOpS5zcGxpdChcXFwiQEBcXFwiKVswXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwZGZoKGl0ZW0sIOWIhuexu+mTvuaOpS5zcGxpdChcXFwiQEBcXFwiKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uID0gaXRlbS51cmw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganNvbiA9IHBkKGl0ZW0sIOWIhuexu+mTvuaOpSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ki9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSBpdGVtLnVybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdmFyIGpzb2495YiG57G76ZO+5o6lLmluY2x1ZGVzKCdAQEAnKT97XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOnBkZmgoaXRlbSzliIbnsbvpk77mjqUuc3BsaXQoJ0BAQCcpWzBdKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOnBkZmgoaXRlbSzliIbnsbvpk77mjqUuc3BsaXQoJ0BAQCcpWzFdKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTpwZChpdGVtLOWIhuexu+mTvuaOpSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb2495YiG57G76ZO+5o6lLmluY2x1ZGVzKCdAQCcpP3tcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU65YiG57G76ZO+5o6lLnNwbGl0KCdAQCcpWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6cGRmaChpdGVtLOWIhuexu+mTvuaOpS5zcGxpdCgnQEAnKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH06cGQoaXRlbSzliIbnsbvpk77mjqUpOyovXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbjoganNvbixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiDnirbmgIEsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxjbGVhcnM6IOWFqOa4hSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5zZXRUaXRsZShrZXkudG9TdHJpbmcoKSwgY2F0ZV90ZW1wW2luZGV4XSwgdGl0bGUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKFxcXCJoaWtlcjovL2VtcHR5XFxcIiArIFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFsbGNsZWFycy5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcignY2F0ZV9idXR0b24nKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcFtwYXJhbXMuaW5kZXhdID0gcGFyYW1zLmtleS50b1N0cmluZygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiaGVhZC5jYXRlXFxcIiwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLmNhdGVfdGVtcCkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmpzb24uY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImR0X1xcXCIgKyBwYXJhbXMuanNvbi50eXBlLCBwYXJhbXMuanNvbi52YWx1ZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMuc3RhdGUsIHBhcmFtcy5qc29uKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsczogTVlfUlVMRS50aXRsZSArICdjYXRlX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVzLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsczogTVlfUlVMRS50aXRsZSArICdjYXRlX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChmb2xkID09PSBcXFwiMVxcXCIgfHwg5oqY5Y+g54q25oCBID09IGZhbHNlKSB7XFxuICAgICAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGNhdGVzKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKGZvbGQgPT09IFxcXCIwXFxcIikge1xcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcignY2F0ZV9idXR0b24nLCBjYXRlcylcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXRQcmVSZXN1bHQgIT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgICAgICAgICAgICAgaXRlbXMgPSBkLmNvbmNhdChpdGVtcyk7XFxuICAgICAgICAgICAgICAgIC8v5riF56m657un5om/5pWw57uEXFxuICAgICAgICAgICAgICAgIGQubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgICAgc2V0UHJlUmVzdWx0KGl0ZW1zKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKGl0ZW0pO1xcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgIH07XFxuICAgIG9iai7pooTorr4ob3B0aW9ucyk7XFxuICAgIHJldHVybiBvYmo7XFxufVxcblxcbnZhciDnirbmgIEgPVxcbiAgICB0eXBlb2Yg54q25oCB5qCH6K6wICE9IFxcXCJ1bmRlZmluZWRcXFwiICYmIOeKtuaAgeagh+iusCAhPSBcXFwiXFxcIiA/IOeKtuaAgeagh+iusCA6IE1ZX1JVTEUudXJsO1xcblxcbmxldCBkdF9kZWJ1ZyA9IGZhbHNlO1xcblxcbmFkZExpc3RlbmVyKFxcbiAgICBcXFwib25DbG9zZVxcXCIsXFxuICAgICQudG9TdHJpbmcoKCkgPT4ge30pXFxuKTtcXG5cXG52YXIgQ3JlYXRlID0ge1xcbiAgICBuZXh0UGFnZTogZnVuY3Rpb24oKSB7XFxuICAgICAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHZhciBuZXh0ID0gZXZhbCjkuIvkuIDpobUpO1xcbiAgICAgICAgICAgIC8vbG9nKCduOicrbmV4dClcXG4gICAgICAgICAgICBpZiAobmV4dCA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ+S4i+S4gOmhtemTvuaOpeS4uuepuicpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XFxuICAgICAgICAgICAgaWYgKHRydWVfdXJsID09IG5leHQpIHtcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCLlj6/og73kuI3lrZjlnKjkuIvkuIDpobXmiJbogIXkuIvkuIDpobXlrprkvY3mnInpl67pophcXFwiKTtcXG4gICAgICAgICAgICBsb2coXFxcIumUmeivr+S/oeaBrzpcXFwiICsgZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICgobmV4dCA9PSBcXFwiXFxcIiB8fCBuZXh0ID09IHVuZGVmaW5lZCkgJiYgcGFnZSA9PSAxKSB7XFxuICAgICAgICAgICAgbmV4dCA9IHRydWVfdXJsO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAvL3Jlc3VsdD1mYWxzZTtcXG4gICAgICAgICAgICBuZXh0ID0gZ2V0TXlWYXIo54q25oCBKTtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vbG9nKCdsJyt0cnVlX3VybClcXG4gICAgICAgIC8vbG9nKCduJytuZXh0KVxcbiAgICAgICAgaWYgKHBhZ2UgIT0gMSkge1xcbiAgICAgICAgICAgIGlmICh0cnVlX3VybCA9PSBuZXh0ICYmICFyZXN1bHQpIHtcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICAgICAgLy9wdXRNeVZhcijnirbmgIEsIG5leHQpO1xcbiAgICB9LFxcbiAgICBnZXRCYWNrSW1hZ2U6IGZ1bmN0aW9uKGltZ3VybCkge1xcbiAgICAgICAgdmFyIHJlc3VsdCA9IGltZ3VybDtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgcmVzdWx0ID0gL3VybCg/OlxcXFxzKyk/XFxcXCgoLio/KVxcXFwpL2dcXG4gICAgICAgICAgICAgICAgLmV4ZWMoaW1ndXJsKVsxXVxcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKCd8XFxcInwmcXVvdDspL2dtLCBcXFwiXFxcIik7XFxuICAgICAgICB9IGNhdGNoIHt9XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9LFxcbiAgICBodHRwSGFuZGxlOiBmdW5jdGlvbihpbnB1dCkge1xcbiAgICAgICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFwiLy9cXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaHR0cHM6XFxcIiArIGlucHV0O1xcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5zdGFydHNXaXRoKFxcXCIvXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gTVlfSE9NRSArIGlucHV0O1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBpbWdIYW5kbGU6IGZ1bmN0aW9uKGl0ZW0sIHJ1bGUpIHtcXG4gICAgICAgIHZhciBpbWcgPSBcXFwiXFxcIjtcXG4gICAgICAgIGlmIChydWxlLmltZy5zdGFydHNXaXRoKFxcXCJwZFxcXCIpKSB7XFxuICAgICAgICAgICAgaW1nID0gZXZhbChydWxlLmltZyk7XFxuICAgICAgICB9IGVsc2UgaWYgKHJ1bGUuYmFja2ltZykge1xcbiAgICAgICAgICAgIGltZyA9IHBkZmgoaXRlbSwgcnVsZS5pbWcpO1xcbiAgICAgICAgICAgIGltZyA9IHRoaXMuZ2V0QmFja0ltYWdlKGltZyk7XFxuICAgICAgICAgICAgaW1nID0gdGhpcy5odHRwSGFuZGxlKGltZyk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGltZyA9IHBkZmgoaXRlbSwgcnVsZS5pbWcpO1xcbiAgICAgICAgICAgIGlmICghaW1nLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgICAgICAgICBpbWcgPSBwZChpdGVtLCBydWxlLmltZyk7XFxuICAgICAgICAgICAgICAgIGltZyA9IHRoaXMuaHR0cEhhbmRsZShpbWcpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBpbWcgKyBydWxlLnJlZjtcXG4gICAgfSxcXG4gICAgdXJsSGFuZGxlOiBmdW5jdGlvbihpdGVtLCBydWxlKSB7XFxuICAgICAgICB2YXIgaHJlZiA9IFxcXCJcXFwiO1xcbiAgICAgICAgaWYgKHJ1bGUudXJsLnN0YXJ0c1dpdGgoXFxcInBkXFxcIikpIHtcXG4gICAgICAgICAgICBocmVmID0gZXZhbChydWxlLnVybCk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGhyZWYgPSBwZChpdGVtLCBydWxlLnVybCk7XFxuICAgICAgICB9XFxuICAgICAgICBocmVmID0gcnVsZS5pbXQgPyBocmVmICsgXFxcIiNpbW1lcnNpdmVUaGVtZSNcXFwiIDogaHJlZjtcXG4gICAgICAgIHJldHVybiBocmVmO1xcbiAgICB9LFxcbiAgICBzZXRDb250ZW50OiBmdW5jdGlvbihpdGVtLCBpbnB1dCkge1xcbiAgICAgICAgbGV0IG91dHB1dCA9IFxcXCJcXFwiO1xcbiAgICAgICAgaWYgKGlucHV0ID09IHVuZGVmaW5lZCkge1xcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFwicGRcXFwiKSkge1xcbiAgICAgICAgICAgIG91dHB1dCA9IGV2YWwoaW5wdXQpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBvdXRwdXQgPSBwZGZoKGl0ZW0sIGlucHV0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XFxuICAgIH0sXFxuICAgIHJlZnJlc2g6IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgYWRkTGlzdGVuZXIoXFxuICAgICAgICAgICAgXFxcIm9uUmVmcmVzaFxcXCIsXFxuICAgICAgICAgICAgJC50b1N0cmluZygodSkgPT4ge1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJ5aWxpc3RcXFwiKTtcXG4gICAgICAgICAgICAgICAgLy92YXIgcCA9IHN0b3JhZ2UwLmdldE15VmFyKCdzcGFnZScsICcnKTtcXG4gICAgICAgICAgICAgICAgLy9wdXRNeVZhcih1LCBwKTtcXG4gICAgICAgICAgICB9LCDnirbmgIEpXFxuICAgICAgICApO1xcbiAgICB9LFxcbiAgICBnZXRCb29sZWFuVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gQm9vbGVhbih2YWx1ZSkgOiAoZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiB0cnVlKTtcXG4gICAgfSxcXG4gICAgZGVidWdsb2c6IGZ1bmN0aW9uKGksIGl0ZW0sIHJ1bGUsIG9iaikge1xcbiAgICAgICAgbG9nKCctLS0tLS0tLS0tJyArIChpICsgMSkgKyAnOuiwg+ivleW8gOWniy0tLS0tLS0tLS0nKTtcXG4gICAgICAgIGlmIChpdGVtLmNvbnN0cnVjdG9yID09IE9iamVjdCkge1xcbiAgICAgICAgICAgIGl0ZW0gPSBKU09OLnN0cmluZ2lmeShpdGVtKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxvZygnaXRlbeWGheWuuTpcXFxcclxcXFxuJyArIGl0ZW0gKyAnXFxcXHJcXFxcbicgK1xcbiAgICAgICAgICAgIGBcXFxcblxcXFx0dGl0bGXlrprkvY06ICAke3J1bGUudGl0bGV9ICAtLS0+IOe7k+aenDogICR7b2JqLnRpdGxlfWAgK1xcbiAgICAgICAgICAgIGBcXFxcblxcXFx0ZGVzY+WumuS9jTogICR7cnVsZS5kZXNjfSAgLS0tPiDnu5Pmnpw6ICAke29iai5kZXNjfWAgK1xcbiAgICAgICAgICAgIGBcXFxcblxcXFx0aW1n5a6a5L2NOiAgJHtydWxlLmltZ30gIC0tLT4g57uT5p6cOiAgJHtvYmouaW1nfWAgK1xcbiAgICAgICAgICAgIChydWxlLmNvbnRlbnQgIT0gdW5kZWZpbmVkID8gYFxcXFxuXFxcXHRjb250ZW505a6a5L2NOiAgJHtydWxlLmNvbnRlbnR9ICAtLS0+IOe7k+aenDogICR7b2JqLmNvbnRlbnR9YCA6ICcnKSArXFxuICAgICAgICAgICAgYFxcXFxuXFxcXHR1cmzlrprkvY06ICAke3J1bGUudXJsfSAgLS0tPiDnu5Pmnpw6ICAke29iai51cmx9YFxcbiAgICAgICAgKTtcXG4gICAgICAgIGxvZygnLS0tLS0tLS0tLScgKyAoaSArIDEpICsgJzrosIPor5Xnu5PmnZ8tLS0tLS0tLS0tJyk7XFxuICAgIH0sXFxuICAgIGpzb25MaXN0OiBmdW5jdGlvbihhcnIsIGpzb24sIHJ1bGUpIHtcXG4gICAgICAgIGlmIChqc29uLmNvbnN0cnVjdG9yICE9IE9iamVjdCkge1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pO1xcbiAgICAgICAgICAgIH0gY2F0Y2gge31cXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChqc29uW3J1bGUubGlzdF0gPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgYXJyLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxmb250IGNvbG9yPVxcXCJncmV5XFxcIj48c21hbGw+5peg5YaF5a65PC9zbWFsbD48L2ZvbnQ+JyxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7fSxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm47XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgZGVidWcgPSB0aGlzLmdldEJvb2xlYW5WYWx1ZShydWxlLmRlYnVnLCBmYWxzZSk7XFxuICAgICAgICB2YXIgZW1wdHkgPSB0aGlzLmdldEJvb2xlYW5WYWx1ZShydWxlLmVtcHR5KTtcXG4gICAgICAgIGlmIChkZWJ1Zykge1xcbiAgICAgICAgICAgIGxvZygn5a6a5L2N5YiX6KGoOicgKyBydWxlLmxpc3QpO1xcbiAgICAgICAgfVxcbiAgICAgICAganNvbltydWxlLmxpc3RdLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcXG4gICAgICAgICAgICB2YXIgdGl0bGUgPSBldmFsKHJ1bGUudGl0bGUpO1xcbiAgICAgICAgICAgIHZhciBkZXNjID0gZXZhbChydWxlLmRlc2MpO1xcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gZXZhbChydWxlLmNvbnRlbnQpO1xcbiAgICAgICAgICAgIHZhciBpbWcgPSBldmFsKHJ1bGUuaW1nKSArIHJ1bGUucmVmO1xcbiAgICAgICAgICAgIHZhciBocmVmID0gZXZhbChydWxlLnVybCk7XFxuICAgICAgICAgICAgdmFyIHVybCA9IHJ1bGUuaW10ID8gaHJlZiArIFxcXCIjaW1tZXJzaXZlVGhlbWUjXFxcIiA6IGhyZWY7XFxuICAgICAgICAgICAgdmFyIGxhenkgPSBydWxlLmxhenkgPyBydWxlLmxhenkgOiBcXFwiXFxcIjtcXG5cXG4gICAgICAgICAgICB2YXIgZGQgPSB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYyxcXG4gICAgICAgICAgICAgICAgY29udGVudDogY29udGVudCxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogaW1nLFxcbiAgICAgICAgICAgICAgICB1cmw6IChlbXB0eSA/IFxcXCJoaWtlcjovL2VtcHR5IyNcXFwiIDogJycpICsgdXJsLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogcnVsZS5jb2xfdHlwZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGltZzogaW1nLFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIH07XFxuXFxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XFxuICAgICAgICAgICAgICAgIHZhciByeCA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYyxcXG4gICAgICAgICAgICAgICAgICAgIGltZyxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXFxuICAgICAgICAgICAgICAgICAgICB1cmxcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z2xvZyhpLCBpdGVtLCBydWxlLCByeCk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGlmIChsYXp5ICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGRkW1xcXCJ1cmxcXFwiXSA9IGhyZWYgKyBsYXp5O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBhcnIucHVzaChkZCk7XFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgcnVsZUxpc3Q6IGZ1bmN0aW9uKGFyciwgaHRtbCwgcnVsZSkge1xcbiAgICAgICAgdmFyIGxpc3QgPSBwZGZhKGh0bWwsXFxuICAgICAgICAgICAgcnVsZS5saXN0KTtcXG4gICAgICAgIHZhciBkZWJ1ZyA9IHRoaXMuZ2V0Qm9vbGVhblZhbHVlKHJ1bGUuZGVidWcsXFxuICAgICAgICAgICAgZmFsc2UpO1xcbiAgICAgICAgdmFyIGVtcHR5ID0gdGhpcy5nZXRCb29sZWFuVmFsdWUocnVsZS5lbXB0eSk7XFxuICAgICAgICBpZiAoZGVidWcpIHtcXG4gICAgICAgICAgICBsb2coJ+WumuS9jeWIl+ihqDonICsgcnVsZS5saXN0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxpc3QuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICAgICAgICAgIHZhciB0aXRsZSA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLnRpdGxlKTtcXG4gICAgICAgICAgICB2YXIgZGVzYyA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLmRlc2MpO1xcbiAgICAgICAgICAgIHZhciBpbWcgPSB0aGlzLmltZ0hhbmRsZShpdGVtLCBydWxlKTtcXG4gICAgICAgICAgICB2YXIgdXJsID0gdGhpcy51cmxIYW5kbGUoaXRlbSwgcnVsZSk7XFxuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLnNldENvbnRlbnQoaXRlbSwgcnVsZS5jb250ZW50KTtcXG5cXG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHJ4ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjLFxcbiAgICAgICAgICAgICAgICAgICAgaW1nLFxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCxcXG4gICAgICAgICAgICAgICAgICAgIHVybFxcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnbG9nKGksIGl0ZW0sIHJ1bGUsIHJ4KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgdmFyIGxhenkgPSBydWxlLmxhenkgPyBydWxlLmxhenkgOiBcXFwiXFxcIjtcXG4gICAgICAgICAgICB2YXIgZGQgPSB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYyxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogaW1nLFxcbiAgICAgICAgICAgICAgICB1cmw6IChlbXB0eSA/IFxcXCJoaWtlcjovL2VtcHR5IyNcXFwiIDogJycpICsgdXJsLFxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogcnVsZS5jb2xfdHlwZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGltZzogaW1nLFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgaWYgKGxhenkgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgZGRbXFxcInVybFxcXCJdID0gdXJsICsgbGF6eTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgYXJyLnB1c2goZGQpO1xcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIExpc3Q6IGZ1bmN0aW9uKGFyciwgaHRtbCwgcnVsZSwgcGFyYW0pIHtcXG4gICAgICAgIHBhcmFtID0gcGFyYW0gPyBwYXJhbSA6IHt9O1xcbiAgICAgICAgdmFyIGF1dG8gPSBwYXJhbS5hdXRvID8gcGFyYW0uYXV0byA6IGZhbHNlO1xcbiAgICAgICAgdmFyIHNob3cgPSBwYXJhbS5zaG93ID8gcGFyYW0uc2hvdyA6IGZhbHNlO1xcbiAgICAgICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgICAgICAgIC8vdGhpcy5zcGFnZS5zZXQodHJ1ZV91cmwpO1xcbiAgICAgICAgfVxcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XFxuICAgICAgICB2YXIgZGVidWcgPSB0aGlzLmdldEJvb2xlYW5WYWx1ZShydWxlLmRlYnVnLCBmYWxzZSk7XFxuICAgICAgICB2YXIgZW1wdHkgPSB0aGlzLmdldEJvb2xlYW5WYWx1ZShydWxlLmVtcHR5KTtcXG4gICAgICAgIHZhciBsaXN0ID0gcGRmYShodG1sLCBydWxlLmxpc3QpO1xcbiAgICAgICAgaWYgKGRlYnVnKSB7XFxuICAgICAgICAgICAgbG9nKCflrprkvY3liJfooag6JyArIHJ1bGUubGlzdCk7XFxuICAgICAgICB9XFxuICAgICAgICAvL2xvZyh0aGlzLm5leHRQYWdlKCkpXFxuICAgICAgICBpZiAoKHN0b3JhZ2UwLmdldE15VmFyKCd5aV9pc25leHQnLCAndCcpID09ICd0JyAmJiBsaXN0Lmxlbmd0aCA+IDApIHx8IHBhZ2UgPT0gMSkge1xcbiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICAgICAgICAgICAgICBkZWxldGVJdGVtKFxcXCJwYWdlbnVtXFxcIik7XFxuICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oXFxcInBhZ2VsaW5lXFxcIik7XFxuICAgICAgICAgICAgICAgIHZhciBpZCA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICB2YXIgY2xzID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLnRpdGxlKTtcXG4gICAgICAgICAgICAgICAgdmFyIGRlc2MgPSB0aGlzLnNldENvbnRlbnQoaXRlbSwgcnVsZS5kZXNjKTtcXG4gICAgICAgICAgICAgICAgdmFyIGltZyA9IHRoaXMuaW1nSGFuZGxlKGl0ZW0sIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICB2YXIgdXJsID0gdGhpcy51cmxIYW5kbGUoaXRlbSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gdGhpcy5zZXRDb250ZW50KGl0ZW0sIHJ1bGUuY29udGVudCk7XFxuXFxuICAgICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJ4ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsXFxuICAgICAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z2xvZyhpLCBpdGVtLCBydWxlLCByeCk7XFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gbGlzdC5sZW5ndGggLSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZCA9IFxcXCJsYXN0aWRfXFxcIiArIHBhZ2U7XFxuICAgICAgICAgICAgICAgICAgICBjbHMgPSBcXFwibGFzdG1hcmtcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBkZXNjLFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogaW1nLnJlcGxhY2UoLy4qP3VybFxcXFw9KC4qPykvLFxcXCIkMVxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAoZW1wdHkgPyBcXFwiaGlrZXI6Ly9lbXB0eSMjXFxcIiA6ICcnKSArIHVybCArICdAcnVsZT1qczokLnJlcXVpcmUoXFxcImVqXFxcIiknLFxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogY29udGVudCxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBydWxlLmNvbF90eXBlLFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiBpbWcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogY2xzLFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIGlmIChpID09IGxpc3QubGVuZ3RoIC0gMSAmJiBzaG93KSB7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFxcXCJwYWdlbGluZVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxzbWFsbD7liqDovb3kuK0uLi48L3NtYWxsPlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXFxcInBhZ2VudW1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKFxcXCJwYWdlbnVtXFxcIiwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxmb250IGNvbG9yPVxcXCJncmV5XFxcIj48c21hbGw+5Yiw5bqV5LqGPC9zbWFsbD48L2ZvbnQ+JyxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogXFxcImxhc3RcXFwiLFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09IDAgJiYgcGFnZSA9PSAxKSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIixcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxmb250IGNvbG9yPVxcXCJncmV5XFxcIj48c21hbGw+5peg5YaF5a65PC9zbWFsbD48L2ZvbnQ+JyxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7fSxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh0aGlzLm5leHRQYWdlKCkpIHtcXG4gICAgICAgICAgICAvL2xvZygndCcpO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKCd5aV9pc25leHQnLCAndCcpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAvL2xvZygnZicpO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKCd5aV9pc25leHQnLCAnZicpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGF1dG8pIHtcXG4gICAgICAgICAgICAvL2NyZWF0ZU5leHRQYWdlKCk7XFxuICAgICAgICAgICAgYXV0b1BhZ2UoKTtcXG4gICAgICAgIH1cXG4gICAgfSxcXG59O1xcblxcbnZhciBleHRNZXRob2QgPSB7XFxuICAgIFRvUGFyYW1zOiBmdW5jdGlvbigpIHtcXG4gICAgICAgIHZhciBqc29uID0gYXJndW1lbnRzWzBdO1xcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGpzb24pXFxuICAgICAgICAgICAgLm1hcCgoa2V5KSA9PiBrZXkgKyBcXFwiPVxcXCIgKyBqc29uW2tleV0pXFxuICAgICAgICAgICAgLmpvaW4oXFxcIiZcXFwiKTtcXG4gICAgfSxcXG4gICAgdXJsUGFyc2U6IGZ1bmN0aW9uKHUpIHtcXG4gICAgICAgIHZhciBkaWN0ID0ge307XFxuICAgICAgICBkaWN0LlNvdXJjZSA9IHU7XFxuICAgICAgICBsZXQgcGFyYW1zID0gKHVybCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBxdWVyeVBhcmFtcyA9IHt9O1xcbiAgICAgICAgICAgIGxldCByZWcgPSAvKFtePz0mXSspPShbXj89Jl0rKS9nO1xcbiAgICAgICAgICAgIHVybC5yZXBsYWNlKHJlZywgZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zW2FyZ3VtZW50c1sxXV0gPSBhcmd1bWVudHNbMl07XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zO1xcbiAgICAgICAgfTtcXG4gICAgICAgIHZhciBqYXZhVXJsID0gSmF2YUltcG9ydGVyKGphdmEubmV0LlVSTCk7XFxuICAgICAgICB3aXRoKGphdmFVcmwpIHtcXG4gICAgICAgICAgICB2YXIgdXJsID0gbmV3IFVSTCh1KTtcXG4gICAgICAgICAgICBkaWN0LlByb3RvY29sID0gdXJsLmdldFByb3RvY29sKCk7XFxuICAgICAgICAgICAgZGljdC5Ib3N0ID0gdXJsLmdldEhvc3QoKTtcXG4gICAgICAgICAgICBkaWN0LlBvcnQgPSB1cmwuZ2V0UG9ydCgpO1xcbiAgICAgICAgICAgIGRpY3QuRmlsZSA9IHVybC5nZXRGaWxlKCk7XFxuICAgICAgICAgICAgZGljdC5QYXRoID0gdXJsLmdldFBhdGgoKTtcXG4gICAgICAgICAgICBkaWN0LlJlZiA9IHVybC5nZXRSZWYoKTtcXG4gICAgICAgICAgICBkaWN0Lkhvc3RzID0gYCR7ZGljdC5Qcm90b2NvbH06Ly8ke3VybC5nZXRIb3N0KCl9YDtcXG4gICAgICAgIH1cXG4gICAgICAgIGRpY3QuUGFyYW1zID0gcGFyYW1zKHUpO1xcbiAgICAgICAgcmV0dXJuIGRpY3Q7XFxuICAgIH0sXFxuICAgIGlzRXF1YWw6IGZ1bmN0aW9uKHgsIHkpIHtcXG4gICAgICAgIGNvbnN0IG9rID0gT2JqZWN0LmtleXMsXFxuICAgICAgICAgICAgdHggPSB0eXBlb2YgeCxcXG4gICAgICAgICAgICB0eSA9IHR5cGVvZiB5O1xcbiAgICAgICAgcmV0dXJuIHggJiYgeSAmJiB0eCA9PT0gXFxcIm9iamVjdFxcXCIgJiYgdHggPT09IHR5ID9cXG4gICAgICAgICAgICBvayh4KS5sZW5ndGggPT09IG9rKHkpLmxlbmd0aCAmJlxcbiAgICAgICAgICAgIG9rKHgpLmV2ZXJ5KChrZXkpID0+IHRoaXMuaXNFcXVhbCh4W2tleV0sIHlba2V5XSkpIDogeCA9PT0geTtcXG4gICAgfSxcXG4gICAgZmluZERpZmZlcmVudEluZGV4OiBmdW5jdGlvbihzdHIxLCBzdHIyKSB7XFxuICAgICAgICBjb25zdCBkaWZmQ2hhcnMgPSBbXTtcXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyMi5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgIGlmIChzdHIxW2ldICE9PSBzdHIyW2ldKSB7XFxuICAgICAgICAgICAgICAgIGRpZmZDaGFycy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxcbiAgICAgICAgICAgICAgICAgICAgczE6IHN0cjFbaV0sXFxuICAgICAgICAgICAgICAgICAgICBzMjogc3RyMltpXSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGRpZmZDaGFycztcXG4gICAgfSxcXG4gICAgcmVwbGFjZUNoYXJBdDogZnVuY3Rpb24oc3RyLCBpbmRleCwgcmVwbGFjZW1lbnQpIHtcXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc3RyLmxlbmd0aCkge1xcbiAgICAgICAgICAgIHJldHVybiBzdHI7XFxuICAgICAgICB9XFxuICAgICAgICAvL2xvZyhpbmRleClcXG4gICAgICAgIGNvbnN0IGFyciA9IHN0ci5zcGxpdChcXFwiXFxcIik7XFxuICAgICAgICBhcnJbaW5kZXhdID0gcmVwbGFjZW1lbnQ7XFxuICAgICAgICByZXR1cm4gYXJyLmpvaW4oXFxcIlxcXCIpO1xcbiAgICB9LFxcbiAgICBnZXRPYmplY3RLZXlzRGlmZjogZnVuY3Rpb24ob2JqMSwgb2JqMikge1xcbiAgICAgICAgY29uc3QgZGlmZmVyZW50S2V5cyA9IFtdO1xcbiAgICAgICAgZm9yIChsZXQga2V5IGluIG9iajEpIHtcXG4gICAgICAgICAgICBpZiAoIW9iajIuaGFzT3duUHJvcGVydHkoa2V5KSB8fCBvYmoxW2tleV0gIT09IG9iajJba2V5XSkge1xcbiAgICAgICAgICAgICAgICBkaWZmZXJlbnRLZXlzLnB1c2goa2V5KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gb2JqMikge1xcbiAgICAgICAgICAgIGlmICghb2JqMS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XFxuICAgICAgICAgICAgICAgIGRpZmZlcmVudEtleXMucHVzaChrZXkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBkaWZmZXJlbnRLZXlzO1xcbiAgICB9LFxcbiAgICBnZXROZXh0VXJsOiBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgcGFyYW1zKSB7XFxuICAgICAgICB2YXIgdTEgPSB0aGlzLnVybFBhcnNlKHNvdXJjZSk7XFxuICAgICAgICB2YXIgdTIgPSB0aGlzLnVybFBhcnNlKHRhcmdldCk7XFxuICAgICAgICB2YXIgcGEgPSB1bmRlZmluZWQ7XFxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PSBcXFwib2JqZWN0XFxcIikge1xcbiAgICAgICAgICAgIHBhID0gcGFyYW1zLmhhc093blByb3BlcnR5KFxcXCLnibnlvoFcXFwiKSA/IHBhcmFtcy7nibnlvoEgOiB1bmRlZmluZWQ7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgbmV4dHVybCA9IHNvdXJjZTtcXG4gICAgICAgIHZhciBjYSA9IE9iamVjdC5rZXlzKHUyLlBhcmFtcykubGVuZ3RoID09IDAgPyBcXFwiXFxcIiA6IFxcXCI/XFxcIjtcXG4gICAgICAgIGlmIChwYSAhPSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICB2YXIgcnMgPSBTdHJpbmcodTIuUGF0aCkucmVwbGFjZShuZXcgUmVnRXhwKHBhKSwgXFxcIiQxZnlwYWdlXFxcIik7XFxuICAgICAgICAgICAgbmV4dHVybCA9IHUyLkhvc3RzICsgcnMgKyBjYSArIHRoaXMuVG9QYXJhbXModTIuUGFyYW1zKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaWYgKHRoaXMuaXNFcXVhbCh1MS5QYXJhbXMsIHUyLlBhcmFtcykpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGR0X2RlYnVnKSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2codTEuUGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICBsb2codTIuUGF0aCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdmFyIGRmID0gdGhpcy5maW5kRGlmZmVyZW50SW5kZXgoU3RyaW5nKHUxLlBhdGgpLCBTdHJpbmcodTIuUGF0aCkpO1xcbiAgICAgICAgICAgICAgICBpZiAoZHRfZGVidWcpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhkZik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKGRmLmxlbmd0aCA9PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBkZlswXS5pbmRleDtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBmID0gZGYuZmlsdGVyKCh4KSA9PiAvXFxcXGQrLy50ZXN0KHguczIpKTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IGZbMF0uaW5kZXg7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdmFyIGVxID0gdGhpcy5yZXBsYWNlQ2hhckF0KFN0cmluZyh1Mi5QYXRoKSwgcmUsIFxcXCJmeXBhZ2VcXFwiKTtcXG4gICAgICAgICAgICAgICAgbmV4dHVybCA9IHUyLkhvc3RzICsgZXEgKyBjYSArIHRoaXMuVG9QYXJhbXModTIuUGFyYW1zKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB2YXIgZXAgPSB0aGlzLmdldE9iamVjdEtleXNEaWZmKHUxLlBhcmFtcywgdTIuUGFyYW1zKVxcbiAgICAgICAgICAgICAgICBpZiAoZXAubGVuZ3RoID09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHUxLlBhcmFtc1tlcFswXV0gPSAnZnlwYWdlJ1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKGVwKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB2YXIgZXEgPSBTdHJpbmcodTEuUGF0aCkucmVwbGFjZSgvXFxcXGQrLywgXFxcImZ5cGFnZVxcXCIpO1xcbiAgICAgICAgICAgICAgICBuZXh0dXJsID0gdTEuSG9zdHMgKyBlcSArIGNhICsgdGhpcy5Ub1BhcmFtcyh1MS5QYXJhbXMpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIC8vbG9nKCduZXh0OicrbmV4dHVybClcXG4gICAgICAgIHJldHVybiBuZXh0dXJsO1xcbiAgICB9LFxcbn07XFxuXFxuZnVuY3Rpb24gZ2V0VHJ1ZWxpbmsobWFyaywgdXJsLCBwYWdlKSB7XFxuICAgIHZhciBwID0gZ2V0TXlWYXIobWFyaywgdXJsKS5yZXBsYWNlKFxcXCJmeXBhZ2VcXFwiLCBwYWdlKTtcXG4gICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgICAgcmV0dXJuIGdldE15VmFyKFxcXCJ5aV9maXJzdHBhZ2VcXFwiLCBwKTtcXG4gICAgfSBlbHNlIGlmIChwICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICByZXR1cm4gcDtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiB1cmw7XFxuICAgIH1cXG59XFxuLy/mnoTlu7pcXG5mdW5jdGlvbiBjcmVhdGVOZXh0UGFnZSgpIHtcXG4gICAgbGV0IHN0YXJ0bnVtID0gMTtcXG4gICAgdmFyIG9iaiA9IGFyZ3VtZW50c1swXTtcXG4gICAgaWYgKHRydWVfdXJsICE9IGdldE15VmFyKFxcXCJ5aV9wYWdldXJsXFxcIiwgXFxcIlxcXCIpKSB7XFxuICAgICAgICBjbGVhck15VmFyKFxcXCJ5aV9wYWdldXJsXFxcIik7XFxuICAgIH1cXG4gICAgaWYgKHBhZ2UgPT0gc3RhcnRudW0gJiYgZ2V0TXlWYXIoXFxcInlpX3BhZ2V1cmxcXFwiKSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcInlpX2ZpcnN0cGFnZVxcXCIsIHRydWVfdXJsKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgdmFyIG5leHQgPSBldmFsKOS4i+S4gOmhtSk7XFxuICAgICAgICAgICAgLy9sb2coXFxcIm5leHRcXFwiKTtcXG4gICAgICAgICAgICAvL2xvZyhuZXh0KTtcXG4gICAgICAgIH0gY2F0Y2gge1xcbiAgICAgICAgICAgIGxvZyhcXFwi5Y+v6IO95LiN5a2Y5Zyo5LiL5LiA6aG15oiW6ICF5LiL5LiA6aG15a6a5L2N5pyJ6Zeu6aKYXFxcIik7XFxuICAgICAgICAgICAgbmV4dCA9IFxcXCJcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKG5leHQgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICB2YXIgbnh1cmwgPSBleHRNZXRob2QuZ2V0TmV4dFVybCh0cnVlX3VybCwgbmV4dCwgb2JqKTtcXG4gICAgICAgICAgICAvL2xvZyhcXFwibnh1cmw6XFxcIiArIG54dXJsKTtcXG4gICAgICAgICAgICBwdXRNeVZhcijnirbmgIEsIG54dXJsKTtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwieWlfcGFnZXVybFxcXCIsIG54dXJsKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBhdXRvUGFnZSgpIHtcXG4gICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcInlpX2ZpcnN0cGFnZVxcXCIsIHRydWVfdXJsKTtcXG4gICAgfVxcbiAgICB0cnkge1xcbiAgICAgICAgdmFyIG5leHQgPSBldmFsKOS4i+S4gOmhtSk7XFxuICAgICAgICAvL2xvZyhcXFwibmV4dFxcXCIpO1xcbiAgICAgICAgLy9sb2coJ25leHQ6JytuZXh0KTtcXG4gICAgfSBjYXRjaCB7XFxuICAgICAgICBsb2coXFxcIuWPr+iDveS4jeWtmOWcqOS4i+S4gOmhteaIluiAheS4i+S4gOmhteWumuS9jeaciemXrumimFxcXCIpO1xcbiAgICAgICAgbmV4dCA9IFxcXCJcXFwiO1xcbiAgICB9XFxuICAgIGlmIChuZXh0ICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICBwdXRNeVZhcijnirbmgIEsIG5leHQpO1xcbiAgICB9XFxufVwifV0iLCJpY29uIjoiaHR0cHM6Ly93d3cuY2xpY2xpLndhbmcvdXBsb2FkL214cHJvY21zLzIwMjMwNjExLTEvOGQzNjZiM2YyNTY4ODk2NmUwMjYwNGU3MTY3MjNlYmEucG5nIiwicHJveHkiOiIifQ==
Add Comment
Please, Sign In to add comment