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Ii9qcy9tRGlhbG9nTWluLmpzIj48L3NjcmlwdD4KICAKPC9oZWFkPgo8Ym9keT4KICAgPGRpdiBzdHlsZT0icG9zaXRpb246IGZpeGVkOyB0b3A6IDVweDsgcmlnaHQ6IDVweDsgd2lkdGg6IDEyMHB4OyB6LWluZGV4OiA5OTsgcGFkZGluZzogMTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNik7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGJvcmRlci1yYWRpdXM6IDVweDtkaXNwbGF5Om5vbmU7IiBpZD0icXJjb2RlYm94Ij48ZGl2IGlkPSJxcmNvZGUiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAwIGF1dG87Ij48L2Rpdj7miYvmnLrmiavmj4/kuIvovb08L2Rpdj4KICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgaWQ9IngiIG9uY2xpY2s9IiQoJyNxcmNvZGVib3gnKS5oaWRlKCk7JCh0aGlzKS5oaWRlKCk7IiBzdHlsZT0icG9zaXRpb246IGZpeGVkO3RvcDogMTcwcHg7cmlnaHQ6IDY1cHg7Ym9yZGVyOiAxcHggc29saWQgcmdiKDI1NSwgMjU1LCAyNTUpO2JvcmRlci1yYWRpdXM6IDUwJTtjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO3dpZHRoOiAyMHB4O2hlaWdodDogMjBweDt0ZXh0LWRlY29yYXRpb246IG5vbmU7Zm9udC1mYW1pbHk6IEFyaWFsO2xpbmUtaGVpZ2h0OiAyMnB4O2ZvbnQtd2VpZ2h0OiBub3JtYWw7Zm9udC1zaXplOiAxMnB4O3RleHQtYWxpZ246IGNlbnRlcjt6LWluZGV4Ojk7ZGlzcGxheTpub25lOyI+WDwvYT4KPGRpdiBjbGFzcz0id2FycCI+CiAgICA8IS0t5a6i5pyNLS0+CiAgICA8YSBpZD0ia2VmdSIgaHJlZj0iaHR0cDovL2x2bXEuZGZkcnBqZy54eXovZGlzdC9jaGF0bGluay5odG1sPyIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgIDxkaXYgc3R5bGU9InBvc2l0aW9uOiBmaXhlZDsgdG9wOiAyODlweDsgcmlnaHQ6IDVweDsgd2lkdGg6IDgwcHg7IHotaW5kZXg6IDk5OTk7IHBhZGRpbmc6IDEwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgIGNvbG9yOiByZ2IoMCwgMCwgMCk7IGJvcmRlci1yYWRpdXM6IDVweDsiPgogICAgICAgICAgICA8aW1nIHN0eWxlPSJ3aWR0aDoxMDAlO2hlaWdodDoxMDAlOyIgc3JjPSIvaW1ncy9rZi5wbmciLz4KICAgICAgICA8L2Rpdj4KICAgIDwvYT4KICAgIDwhLS0g5LiL6L295Yy6IC0tPgogICAgCiAgICA8ZGl2IGNsYXNzPSJmb290ZXIiIHN0eWxlPSJkaXNwbGF5OiBub25lIiBpZD0iZG93bmxvYWRfYnV0dG9uIj4KICAgICAgIAogICAgPC9kaXY+CiAgICAKICA8ZGl2IGlkPSJhbmRyb2lkX2Rvd25sb2FkIiBkYXRhLWNsaXBib2FyZC10ZXh0PSJIRUlKSU46Ly9jb20uYWNqZC5hb2NodWFuZ2ppbmdkaWFubGEuYTAwMT9leHQ9Ij4KICAJCTxkaXYgY2xhc3M9ImhlYWRlciIgaWQ9ImhlYWRlci1hbmRyb2lkIj4KCSAgICAgICAgPGltZyBzcmM9IiI+CgkgICAgPC9kaXY+CgkgICA8ZGl2IGNsYXNzPSJmb290ZXIiIGlkPSJmb290ZXItYW5kcm9pZCI+CiAgICAgICAgICAgICA8IS0t5o6o5bm/5ZGYaWQtLT4KICAgICAgICAgICAgPGRpdiBpZD0icHJvbW90ZXJfaWQiIHN0eWxlPSJtYXJnaW46IDEwcHggYXV0bzsgd2lkdGg6IDEyMHB4OyB6LWluZGV4OiA5OTsgcGFkZGluZzogMTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVlNjA2OyBvcGFjaXR5OiAwLjk7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGJvcmRlci1yYWRpdXM6IDEycHg7IGRpc3BsYXk6IG5vbmU7Zm9udC13ZWlnaHQ6IDkwMDsiPgogICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAg6YKA6K+356CB77yaPHNwYW4+PC9zcGFuPgogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIDwvZGl2PgoJICAgICAgICA8aW1nIGlkPSJmb290ZXIiIHNyYz0iL2ltZ3Mvc3R5bGVfMS9mb290ZXIucG5nIj4KCSAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJpbWdkd1AiPgogICAgICAgICAgICA8YSBjbGFzcz0iZG9ud2xvYWQiIGhyZWY9ImphdmFzY3JpcHQ6Ij4KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIiPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDxpbWcgaWQ9ImJnMSIgc3JjPSIvaW1ncy9zdHlsZV8xL2JnMS5qcGciPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImltZ2R3UCI+CiAgICAgICAgICAgIDxpbWcgaWQ9ImJnMiIgc3JjPSIvaW1ncy9zdHlsZV8xL2JnMi5qcGciPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImltZ2R3UCI+CiAgICAgICAgICAgIDxpbWcgaWQ9ImJnMyIgc3JjPSIvaW1ncy9zdHlsZV8xL2JnMy5qcGciPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJub3RfZG93bl9ib2R5Ij4KCSAgICA8ZGl2IGNsYXNzPSJub3RfZG93biI+CgkgICAgPC9kaXY+CgkgICAgPGRpdiBjbGFzcz0ibm90X2Rvd25faW1nIj4KCSAgICAJPGltZyBzcmM9Ii9pbWdzL25vX2Rvd25fY29weS5wbmciPgoJICAgIDwvZGl2PgoJPC9kaXY+Cgk8ZGl2IGlkPSJwb3N0ZXJfaW9zX2d1aWRlIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CgkgICAgPGRpdj4KICAgIAkgICAgPGltZyBzdHlsZT0iZGlzcGxheTpibG9jazsgd2lkdGg6IDEwMCUiIHNyYz0iL2ltZ3MvMl8wMS5qcGciPgoJICAgIDwvZGl2PgoJICAgIDxkaXYgaWQ9ImRvbndsb2FkX3RmIj4KICAgIAkgICAgPGltZyBzdHlsZT0iZGlzcGxheTpibG9jazsgd2lkdGg6IDEwMCUiIHNyYz0iL2ltZ3MvMl8wMi5qcGciPgoJICAgIDwvZGl2PgoJICAgIDxkaXYgaWQ9ImRvbndsb2FkX2NvbXAiPgoJICAgICAgICA8aW1nIHN0eWxlPSJkaXNwbGF5OmJsb2NrOyB3aWR0aDogMTAwJSIgc3JjPSIvaW1ncy8yXzAzLmpwZyI+CgkgICAgPC9kaXY+CgkgICAgPGRpdj4KCSAgICAgICAgPGltZyBzdHlsZT0iZGlzcGxheTpibG9jazsgd2lkdGg6IDEwMCUiIHNyYz0iL2ltZ3MvMl8wNC5qcGciPgoJICAgIDwvZGl2PgoJPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJzaGFkb3ctYm94Ij4KCTxpbWcgc3JjPSIvaW1ncy9ndWlkZV93ZWl4aW4ucG5nIj4KPC9kaXY+CjxkaXYgaWQ9Imluc3RhbGxJbmZvIj4KICAgIDxpbWcgc3JjPSIiIGFsdD0iIiBpZD0iaW1nSW5mbyI+CiAgICA8ZGl2IGlkPSJjbG9zZUJ0biI+54K55Ye75YWz6ZetPC9kaXY+CjwvZGl2PgoKCjxkaXYgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIGNsYXNzPSJzb3JjZSI+5pWw5o2u5bqTPC9kaXY+Cgo8aWZyYW1lIGlkPSJpZnJhbWUxIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIiPjwvc2NyaXB0Pgo8L2lmcmFtZT4KCiAgICA8ZGl2IGlkPSdjb3B5X2RpdicgY2xhc3M9Im9wYWNpdHkiPgogICAgICAgIDxwPuWmguaenOWPs+S4iuinki4uLuaXoOazleeCueWHuzwvcD4KICAgICAgICA8dWw+CiAgICAgICAgICAgIDxsaSBzdHlsZT0ibWFyZ2luOiAwIDE1cHggNDVweCAxNXB4OyI+CiAgICAgICAgICAgICAgICA8aW1nIGlkPSdpZV9pY29uJyBzcmM9Ii9pbWdzL2llLnBuZyIgLz4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIHN0eWxlPSJtYXJnaW46IDE2cHggMDsiPgogICAgICAgICAgICAgICAg6K+35aSN5Yi26ZO+5o6l5Yiw5rWP6KeI5Zmo5omT5byACiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBzdHlsZT0ibWFyZ2luOiAxM3B4IDIzcHggMCAwO2Zsb2F0OnJpZ2h0Ij4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJjb3B5VGV4dChsb2NhdGlvbi5ocmVmKTsiPuWkjeWItjwvYnV0dG9uPgogICAgICAgICAgICA8L2xpPgogICAgICAgIDwvdWw+CiAgICA8L2Rpdj4KCiAgPHNjcmlwdCBzcmM9Ii9hc3NldHMvbGliL2pxdWVyeS9qcXVlcnktMS4xMS4zLm1pbi5qcyIgcmVsPSJwcmVsb2FkIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSJodHRwczovL3d3dy5kc3lsLnd1MzZ1LmNjL3N0YXRpYy9qcy9kc3lsLnNkay52LjEuMC4wLmpzIj48L3NjcmlwdD4KICAgPHNjcmlwdCBzcmM9Ii9qcy9xcmNvZGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgIDxzY3JpcHQgc3JjPSIvanMvZGV2aWNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii9qcy9yZWdpcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgPHNjcmlwdCBzcmM9Ii9qcy9sYXllcl92My4xLjEvbW9iaWxlL2xheWVyLmpzIj48L3NjcmlwdD4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgIGRvY3VtZW50LndyaXRlKCI8c2NyaXB0IHNyYz0nL2pzL3psdmlmei5qcz9hY3Rpb249bW9uaXRvciZyYW5kb209IisgTWF0aC5yYW5kb20oKSsiJz48XC9zY3JpcHQ+Iik7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgIHZhciBwcm9tb3Rlcl9pZCA9ICcnOwogICAgICBpZiAocHJvbW90ZXJfaWQpIHsKICAgICAgICAgICQoJyNwcm9tb3Rlcl9pZCcpLnNob3coKTsKICAgICAgfQogICAgICAKICAgICAgdmFyIG9zID0gMTsgLy8gMSDlronljZMgMiBpb3MKICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1woaVteO10rOyggVTspPyBDUFUuK01hYyBPUyBYLykpIHsKICAgICAgICAgIG9zID0gMjsKICAgICAgfQoJZnVuY3Rpb24gY2hlY2tfc2FmYXJpKCkgewogICAgCWlmICghIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1woaVteO10rOyggVTspPyBDUFUuK01hYyBPUyBYLykpIHsKCQkJdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOwoJCSAgICAvL+WIpOaWreaYr+S4jeaYr+WcqGlQaG9uZeeahFNhZmFpcua1j+iniOWZqOaJk+W8gOeahOacrOmhtemdogoJCSAgICBpZiAodWEuaW5kZXhPZignYXBwbGV3ZWJraXQnKSA+IC0xICYmIHVhLmluZGV4T2YoJ21vYmlsZScpID4gLTEgJiYgdWEuaW5kZXhPZignc2FmYXJpJykgPiAtMSAmJgoJCSAgICAgICAgdWEuaW5kZXhPZignbGludXgnKSA9PT0gLTEgJiYgdWEuaW5kZXhPZignYW5kcm9pZCcpID09PSAtMSAmJiB1YS5pbmRleE9mKCdjaHJvbWUnKSA9PT0gLTEgJiYKCQkgICAgICAgIHVhLmluZGV4T2YoJ2lvcycpID09PSAtMSAmJiB1YS5pbmRleE9mKCdicm93c2VyJykgPT09IC0xKSB7CgkJICAgICAgICByZXR1cm4gdHJ1ZTsKCQkgICAgfQoJCSAgICBlbHNlIHsKCQkgICAgICAgIC8vYWxlcnQoIuivt+S9v+eUqGlQaG9uZeS4reeahFNhZmFyaea1j+iniOWZqOaJk+W8gOacrOmhtemdou+8gSIpOwoJCSAgICAgICAgLy8gYWxlcnQoIuivt+aCqOS9v+eUqHNhZmFyaea1j+iniOWZqOaJk+W8gOacrOe9kemhtX4iKTsKCSAgICAgICAgICAgICQoJy5ub3RfZG93bl9ib2R5Jykuc2hvdygpOwoJCSAgICAgICAgcmV0dXJuIGZhbHNlOwoJCSAgICB9CiAgICAJfQoJfQogIHdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7Ci8vICAgCSQoJyNpZnJhbWUxJykubG9hZCgKLy8gICAJCWZ1bmN0aW9uKCl7Ci8vICAgCQkJd2luZG93LmxvY2F0aW9uLmhyZWY9J2h0dHA6Ly9hY2owOC50b3AvaW5zdGFsbF9jb25maWcucGhwJzsKLy8gICAJCX0KLy8gICAJKTsKICAJCiAgCQogICAgCiAgfQogIAoJJChmdW5jdGlvbigpIHsvLyDliJ3lp4vljJblhoXlrrkKICAgICAgICAvLyDpmo/mnLrojrflj5blm77niYcKICAgICAgICAvLyBsZXQgbWF4ID0gMzsKICAgICAgICAvLyBsZXQgcmFuZG9tID0gcGFyc2VJbnQoTWF0aC5yYW5kb20oKSoobWF4KzEpLDEwKTsKICAgICAgICAvLyBsZXQgdXJsID0gJy9pbWdzL3N0eWxlXycgKyByYW5kb20gKyAnLyc7CiAgICAgICAgLy8gJCgnI2Zvb3RlcicpLmF0dHIoJ3NyYycsIHVybCArICdmb290ZXIucG5nJyk7CiAgICAgICAgLy8gJCgnI2JnMScpLmF0dHIoJ3NyYycsIHVybCArICdiZzEuanBnJyk7CiAgICAgICAgLy8gJCgnI2JnMicpLmF0dHIoJ3NyYycsIHVybCArICdiZzIuanBnJyk7CiAgICAgICAgLy8gJCgnI2JnMycpLmF0dHIoJ3NyYycsIHVybCArICdiZzMuanBnJyk7CgkKCSAgICBpZigiIiA9PSAiIil7CgkJJCgiLmhlYWRlciIpLmhpZGUoKTsKCX0KCWlmKCIvaW1ncy9zdHlsZV8xL2Zvb3Rlci5wbmciID09ICIiKXsKCQkkKCIuZm9vdGVyIikuaGlkZSgpOwoJfQoJaWYoIiIgPT0gIiIpewoJCSQoIi5kajEiKS5oaWRlKCk7Cgl9CglpZigiL2ltZ3Mvc3R5bGVfMS9iZzIuanBnIiA9PSAiIil7CgkJJCgiLmJnMiIpLmhpZGUoKTsKCX0KCWlmKCIiID09ICIiKXsKCQkkKCIuZGoyIikuaGlkZSgpOwoJfQoJaWYoIiIgPT0gIiIpewoJCSQoIi5pY29fZG93bmxvYWQiKS5oaWRlKCk7Cgl9CgkKCWlmKCJodHRwczovL2FvZHVva2YuY24vZGlzdC9jaGF0bGluay5odG1sIj09IiIpewoJICAgIAkkKCIja2VmdSIpLmhpZGUoKTsKCX1lbHNlewoJICAgICQoIiNrZWZ1IikuYXR0cigiaHJlZiIsJ2h0dHBzOi8vYW9kdW9rZi5jbi9kaXN0L2NoYXRsaW5rLmh0bWwnKTsKCX0KCQoJdmFyIHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKCWlmKDAgPT0gMSAmJiB1YS5tYXRjaCgvTWljcm9NZXNzZW5nZXIvaSkgIT0gJ21pY3JvbWVzc2VuZ2VyJyl7CgkJJCgiI3FyY29kZWJveCIpLnNob3coKTsKCQkkKCIjeCIpLnNob3coKTsKCX0KCXZhciB3ZWJ1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgIHZhciBxcmNvZGUgPSBuZXcgUVJDb2RlKCdxcmNvZGUnLCB7CiAgICAgIHRleHQ6IHdlYnVybCwKICAgICAgd2lkdGg6IDEyMCwKICAgICAgaGVpZ2h0OiAxMjAsCiAgICAgIGNvbG9yRGFyazogJyMwMDAwMDAnLAogICAgICBjb2xvckxpZ2h0OiAnI2ZmZmZmZicsCiAgICAgIGNvcnJlY3RMZXZlbDogUVJDb2RlLkNvcnJlY3RMZXZlbC5ICiAgICB9KTsKICAgIHZhciBwYWNrYWdldGFnID0gImNvbS5hY2pkLmFvY2h1YW5namluZ2RpYW5sYS5hMDAxIjsKICAJdmFyIHByb21vdGVyX3RyZWUgPSAiIjsKICAJdmFyIHByb21vdGVyID0gIiI7CiAgCXZhciBzcHJlYWRfc25pZCA9ICIiOwogIAl2YXIgc3ByZWFkID0gIjEiOwogIAl2YXIgd2VpeGluID0gIjAiOwogIAkKICAJCiAgCQogIAl0cnkgewogICAgICAvL29wZW5pbnN0YWxs5Yid5aeL5YyW5pe25bCG5LiOb3Blbmluc3RhbGzmnI3liqHlmajkuqTkupLvvIzlupTlsL3lj6/og73ml6nnmoTosIPnlKgKICAgICAgICAvL3ZhciBkYXRhID0gT3Blbkluc3RhbGwucGFyc2VVcmxQYXJhbXMoKTsvL29wZW5pbnN0YWxsLmpz5Lit5o+Q5L6b55qE5bel5YW35Ye95pWw77yM6Kej5p6QdXJs5Lit55qE5omA5pyJ5p+l6K+i5Y+C5pWwCiAgICAgIHZhciBkYXRhID0geyJwYWNrYWdlVGFnIjpwYWNrYWdldGFnLCJwcm9tb3Rlcl90cmVlIjpwcm9tb3Rlcl90cmVlLCJwcm9tb3RlciI6cHJvbW90ZXIsInNwcmVhZCI6c3ByZWFkLCJ3ZWl4aW4iOndlaXhpbiwic3ByZWFkX3NuaWQiOnNwcmVhZF9zbmlkfTsKICAgICAgICB2YXIgaXNfc3VsaWFuID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgKiDnrKzkuIDkuKrlj4LmlbDmmK/nu5HlrprnmoTkuIvovb3mjInpkq7nmoRpZOaIluiAhURPTQogICAgICAgICog56ys5LqM5Liq5Y+C5pWw5pivU3VMaW5rZXLnmoTphY3nva4KICAgICAgICAqLwogICAgICAgIGNvbnNvbGUubG9nKCdvcz0nK29zKTsKICAgICAgICB2YXIgc3VubGlua19vYmogPSAnI2Rvd25sb2FkX2J1dHRvbic7CiAgICAgICAgaWYgKG9zID09IDIpIHsKICAgICAgICAgICAgc3VubGlua19vYmogPSAnI2Rvbndsb2FkX3RmJzsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIFN1TGlua2VyKHN1bmxpbmtfb2JqLHsKICAgICAgICAgICAgLy8o5b+F5aGrKSDns7vnu5/liIbphY1hcHBLZXkKICAgICAgICAgICAgYXBwS2V5OiJ6bHZpZmoiLCAKICAgICAgICAgICAgLy8o6YCJ5aGrKSDoh6rlrprkuYnpmYTluKblj4LmlbAs5Lya6YCP5Lyg5Yiw5YmN56uvCiAgICAgICAgICAgIHBhcmFtczogZGF0YSwKICAgICAgICAgICAgLy8o6YCJ5aGrKSDph43lrprlkJHlj4LmlbDvvIxTREvlm57osIPkuK3kvJrov5Tlm57or6XlgLwKICAgICAgICAgICAgcmVkaXJlY3Q6IiIgLAogICAgICAgICAgICAvLyjpgInloaspIOaOqOW5v+a4oOmBkyzkuI3loavnmoTor53orqTkuLrmmK/pu5jorqTmuKDpgZMKICAgICAgICAgICAgY2hhbm5lbDoiIiwKICAgICAgICAgICAgLy8gKOmAieWhqykg5Yid5aeL5YyW5a6M5q+V5Zue6LCDCiAgICAgICAgICAgIG9uUmVhZHk6IGZ1bmN0aW9uIChzdWxpbmtlcikgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuWIneWni+WMlue7k+adnyIpOwogICAgICAgICAgICAgICAgaXNfc3VsaWFuID0gdHJ1ZTsKICAgICAgICAgICAgICAgIC8vIOWIneWni+WMluWujOWQjuWPr+S7peWwneivleWUpOmGkuS4gOasoTsKICAgICAgICAgICAgICAgIC8vIHN1bGlua2VyLndha2V1cCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyAo6YCJ5aGrKSDlvIDlp4vllKTphpJBcHAKICAgICAgICAgICAgb25XYWtldXA6IGZ1bmN0aW9uIChpc01hbnVhbCkgewogICAgICAgICAgICAgICAgLy8g5Y+v5Lul5byA5ZCv5by556qX77yM5bu66K6uMjAwMG1zLOWPr+S7peS9v+eUqGlzTWFudWFs5p2l5Yik5pat5b2T5YmN5piv5ZCm5omL5Yqo5ZSk6YaS77yM5p+Q5Lqb5oOF5Ya15LiL5omL5Yqo5ZSk6YaS5LiN6ZyA6KaB5pi+56S65by556qX5o+Q56S6CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5byA5aeL5ZSk6YaS5bqU55SoIiwi5omL5Yqo5ZSk6YaSIixpc01hbnVhbCk7CiAgICAgICAgICAgICAgICBEaWFsb2cuaW5pdCgn5q2j5Zyo5Yqg6L295Lit77yM6K+356iN5ZCOLi4uJywgMzAwMDApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyAo6YCJ5aGrKSDlvIDlp4vkuIvovb1BcHAKICAgICAgICAgICAgb25Eb3dubG9hZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuW8gOWni+S4i+i9veW6lOeUqCIpOwogICAgICAgICAgICAgICAgRGlhbG9nLmNsb3NlKCk7CiAgICAgICAgICAgICAgICBpZiAob3MgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmICghbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvXChpW147XSs7KCBVOyk/IENQVS4rTWFjIE9TIFgvKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzaG93R3VpZGUoKTsKICAgICAgICAgICAgICAgIAl9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYW5kcm9pZF9kb3dubG9hZCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicG9zdGVyX2lvc19ndWlkZSIpLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI7CiAgICAgICAgICAgICAgICAJfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyAo6YCJ5aGrKSDpgYfliLDkuI3mlK/mjIHnmoTmtY/op4jlmajlm57osIMKICAgICAgICAgICAgb25Ccm93c2VyTm90U3VwcG9ydDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8g5Y+v5Lul5YWz6Zet5by556qXCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5LiN5pSv5oyB55qE5rWP6KeI5ZmoIik7CiAgICAgICAgICAgIH0sCiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgJCgnI2Rvbndsb2FkX2NvbXAnKS5jbGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYob3M9PTIpewogICAgICAgICAgICAvL3ZhciB1cmwgPSAnaXRtcy1zZXJ2aWNlczovLz9hY3Rpb249ZG93bmxvYWQtbWFuaWZlc3QmdXJsPWh0dHBzOi8vMjI2LXl1ZWh1YS5vc3MtY24tc2hlbnpoZW4uYWxpeXVuY3MuY29tL2Rvd25sb2FkL2Rvd25pb3MucGxpc3QnOwogICAgICAgICAgICAgICAgaWYoImh0dHBzOi8vdHFlcHZhay52eGNjdXh0ZHZhYi5jb20vaW1hZ2UvNHZtbGN0eiIhPSIiKXsKICAgICAgICAgICAgICAgICAgICAgRGlhbG9nLmluaXQoJ+ato+WcqOWKoOi9veS4re+8jOivt+eojeWQji4uLicsIDMwMDApOwogICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnaHR0cHM6Ly90cWVwdmFrLnZ4Y2N1eHRkdmFiLmNvbS9pbWFnZS80dm1sY3R6JzsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDsKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIERpYWxvZy5pbml0KCfmmoLml6DkvIHkuJrnrb4uLi4nLCAzMDAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9KTsKICAgIH0gY2F0Y2goZXJyKXsKICAgICAgY29uc29sZS5sb2coZXJyKTsKICAgIH0KICAgIAogICAgICAgIGlmIChvcyA9PSAyKSB7CiAgICAgICAgICAgIC8vICQoJyNkb3dubG9hZF9idXR0b24nKS5jbGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKCdjbGljaycpCiAgICAgICAgICAgIC8vICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYW5kcm9pZF9kb3dubG9hZCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiOwogICAgICAgICAgICAvLyAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBvc3Rlcl9pb3NfZ3VpZGUiKS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIH0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09PumAn+mTvuacjeWKoeeKtuaAge+8micraXNfc3VsaWFuKTsKICAgICAgICAgICAgaWYgKCFpc19zdWxpYW4pIHsKICAgICAgICAgICAgICAgIGlmIChvcyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2J1dHRvbicpLmNsaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBEaWFsb2cuaW5pdCgn5q2j5Zyo5Yqg6L295Lit77yM6K+356iN5ZCOLi4uJywgMzAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGRlZmF1bHRVcmwgIT09ICd1bmRlZmluZWQnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRlZmF1bHRVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1woaVteO10rOyggVTspPyBDUFUuK01hYyBPUyBYLykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGRlZmF1bHRVcmwuaW9zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBkZWZhdWx0VXJsLmFuZHJvaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwgNTAwMCApOwogICAgICAgIAogICAgICAgIAogICAgICAgIHZhciB1ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKICAgICAgICB2YXIgaXNBbmRyb2lkID0gdS5pbmRleE9mKCdBbmRyb2lkJykgPiAtMSB8fCB1LmluZGV4T2YoJ0FkcicpID4gLTE7IC8vYW5kcm9pZOe7iOerrwogICAgICAgIHZhciBpc2lPUyA9ICEhdS5tYXRjaCgvXChpW147XSs7KCBVOyk/IENQVS4rTWFjIE9TIFgvKTsgLy9pb3Pnu4jnq68KICAgICAgICBpZihpc2lPUyl7CiAgICAgICAgICAgICQoJyNpZV9pY29uJykuYXR0cignc3JjJywnL2ltZ3Mvc2FmYXJpLnBuZycpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICAvL+WmguaenOaYr+WcqFFR5YaF572u5rWP6KeI5Zmo5oiW5b6u5L+h6YeMCiAgICAgICAgaWYoCiAgICAgICAgICAgIC9NaWNyb01lc3Nlbmdlci9pLnRlc3QodSkKICAgICAgICAgICAgfHwgKGlzaU9TICYmIC8gUVEvaS50ZXN0KHUpKQogICAgICAgICAgICB8fCAoaXNBbmRyb2lkICYmIC9NUVFCcm93c2VyL2kudGVzdCh1KSAmJiAvUVEvaS50ZXN0KHUuc3BsaXQoJ01RUUJyb3dzZXInKSkpCiAgICAgICAgICAgIC8vIHx8IHRydWUKICAgICAgICAgICAgKXsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJCgnLnNoYWRvdy1ib3gnKS5zaG93KCk7CiAgICAJICAgIAlkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PSdoaWRkZW4nOyAgICAKCSAgICAJICAgIGRvY3VtZW50LnRpdGxlID0gJ+a4qemmqOaPkOekuic7CiAgICAJICAgIAl2YXIgbW89ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpO307ICAgIAogICAgICAgICAgICAJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixtbyx7cGFzc2l2ZTpmYWxzZX0pOy8v56aB5q2i6aG16Z2i5ruR5YqoCiAgICAgICAgICAgIAkKICAgICAgICAgICAgCSQoJyNjb3B5X2RpdicpLnNob3coKTsKICAgICAgICAgICAgCWlmKGlzQW5kcm9pZCl7CiAgICAgICAgICAgIAkgICAgbG9jYXRpb24uaHJlZiA9ICdtdHRicm93c2VyOi8vdXJsPScrbG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgCX0KICAgICAgICAgICAgICAgIAogICAgICAgIH1lbHNlewogICAgICAgICAgICAKCQkgICAgJCgnI2FuZHJvaWRfZG93bmxvYWQnKS5zaG93KCk7CgkJCWNoZWNrX3NhZmFyaSgpOwoJCSAgICAkKCcubm90X2Rvd25faW1nJykuY2xpY2soZnVuY3Rpb24oKSB7CgkJICAgICAgICB2YXIgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgkJICAgICAgICBjb3B5VGV4dCh1cmwpOwoJCSAgICB9KTsKCQkgICAgCiAgICAgICAgfQogIAoJfSk7IAogIAogICAgZnVuY3Rpb24gY29weVRleHQodGV4dCkgewogICAgICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbnB1dCk7CiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHRleHQpOwogICAgICAgIGlucHV0LnNlbGVjdCgpOwogICAgICAgIHZhciBvbGRDb250ZW50RWRpdGFibGUgPSBpbnB1dC5jb250ZW50RWRpdGFibGU7CiAgICAgICAgdmFyIG9sZFJlYWRPbmx5ID0gaW5wdXQucmVhZE9ubHk7CiAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICBpbnB1dC5jb250ZW50RWRpdGFibGUgPSB0cnVlOwogICAgICAgIGlucHV0LnJlYWRPbmx5ID0gZmFsc2U7CiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGlucHV0KTsKICAgICAgICB2YXIgcyA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICBzLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIHMuYWRkUmFuZ2UocmFuZ2UpOwogICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDAsIDk5OTk5OSk7IC8vIEEgYmlnIG51bWJlciwgdG8gY292ZXIgYW55dGhpbmcgdGhhdCBjb3VsZCBiZSBpbnNpZGUgdGhlIGVsZW1lbnQuCiAgICAgICAgaW5wdXQuY29udGVudEVkaXRhYmxlID0gb2xkQ29udGVudEVkaXRhYmxlOwogICAgICAgIGlucHV0LnJlYWRPbmx5ID0gb2xkUmVhZE9ubHk7CiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5JykpIHsKICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICAgICAgICAgICAgY29uc29sZS5sb2coZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKSk7CgkJICAgIERpYWxvZy5pbml0KCflpI3liLbmiJDlip8nLCAyMDAwKTsKICAgICAgICAgICAgLy8gJCgnLm5vdF9kb3duX2JvZHknKS5oaWRlKCk7CiAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaW5wdXQpOwogICAgfQo8L3NjcmlwdD4KPGRpdiBzdHlsZT0iZGlzcGxheTpibG9jazsiPjwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBpZD0id2luZG93QkciPgogICAgPCEtLSDlvLnlh7rmoYYgLS0+CgogICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGRpdiBhY3Rpb249IiIgY2xhc3M9ImxvZ2luLWZvcm0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtaWNvbiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InVzZXJuYW1lIiB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0i5omL5py65Y+3Ii8+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InVzZXJuYW1lIiBzdHlsZT0iY29sb3I6IHJlZDtkaXNwbGF5OiBub25lIj48L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgcGFzc3dkIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWljb24iIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iY29kZSIgdHlwZT0idGV4dCIgIGNsYXNzPSJmb3JtLWNvbnRyb2wgcGxhY2Vob2xkZXItbm8tZml4IiBwbGFjZWhvbGRlcj0i6aqM6K+B56CBIi8+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuYW1lPSJidG5jb2RlIiBvbmNsaWNrPSJzZW5kVmVyaWZ5Q29kZSgpIiB0eXBlPSJidXR0b24iPuiOt+WPlumqjOivgeeggTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImNvZGUiIHN0eWxlPSJjb2xvcjogcmVkO2Rpc3BsYXk6IG5vbmUiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWljb24iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlr4bnoIEiLz4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0icGFzc3dvcmQiIHN0eWxlPSJjb2xvcjogcmVkO2Rpc3BsYXk6IG5vbmUiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1pY29uIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icmVwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSLor7flho3ovpPlhaXlr4bnoIEiLz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1pY29uIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iaW52aXRlciIgdHlwZT0iaGlkZGVuIiByZWFkb25seSBjbGFzcz0iZm9ybS1jb250cm9sIiB2YWx1ZT0iMCIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iaW52aXRlX2lkIiAgdHlwZT0idGV4dCIgcmVhZG9ubHkgIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSLmjqjojZDkurpJRO+8miIvPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJpbnZpdGVyIiBzdHlsZT0iY29sb3I6IHJlZDtkaXNwbGF5OiBub25lIj48L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtaWNvbiI+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuYW1lPSJzdWJtaXQiICB0eXBlPSJzdWJtaXQiIG9uY2xpY2s9InJlZ2lzdGVyKCkiIGNsYXNzPSJmb3JtLWNvbnRyb2wgc3ViIj7ms6jlhow8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtaWNvbiBkb3duX2FwayI+CiAgICAgICAgICAgICAgICAgICAgPGEgc3R5bGU9ImNvbG9yOiBncmVlbiIgaWQ9ImNsaWNrc3VsaWFuIiAgb25jbGljaz0nY2xpY2tTdW5saWFuKCknPuW3suaciei0puWPt+eOqeWutuivt+eCueWHu+i/memHjCA8L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAkKCcjYW5kcm9pZF9kb3dubG9hZCcpLmNsaWNrKGZ1bmN0aW9uICgpewogICAgICAgIGxheWVyLm9wZW4oewogICAgICAgICAgICB0eXBlOjEsCiAgICAgICAgICAgIHRpdGxlOifms6jlhozpgIE4LTg4OCcsCiAgICAgICAgICAgIGJ0bjon5YWz6ZetJywKICAgICAgICAgICAgbWF4bWluOnRydWUsCiAgICAgICAgICAgIGNvbnRlbnQ6JCgnI3dpbmRvd0JHJykuaHRtbCgpLAogICAgICAgIH0pCiAgICAgICAgaWYocmVnaXMudHlwZT09J3MnKXsKICAgICAgICAgICAgaWYocmVnaXMucGFja2FnZWlkKXsKICAgICAgICAgICAgICAgICQoJyNpbnZpdGVfaWQnKS5hdHRyKCdwbGFjZWhvbGRlcicsICfmjqjojZDkurpJRO+8micgKyByZWdpcy5wYWNrYWdlaWQpOwogICAgICAgICAgICB9CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGlmKHJlZ2lzLmludml0ZXIpewogICAgICAgICAgICAgJCgnI2ludml0ZV9pZCcpLmF0dHIoJ3BsYWNlaG9sZGVyJywgJ+aOqOiNkOS6uklE77yaJyArIHJlZ2lzLmludml0ZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgfSkKICAgIAogICAgZnVuY3Rpb24gY2xpY2tTdW5saWFuICgpIHsKICAgICAgICBsYXllci5jbG9zZUFsbCgpOwogICAgICAgIGlmIChvcyA9PSAxKSB7CiAgICAgICAgICAgICQoJyNkb3dubG9hZF9idXR0b24nKS5jbGljaygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vJCgnI2Rvbndsb2FkX3RmJykuY2xpY2soKTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFuZHJvaWRfZG93bmxvYWQiKS5zdHlsZS5kaXNwbGF5PSJub25lIjsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBvc3Rlcl9pb3NfZ3VpZGUiKS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOwogICAgICAgICAgICAvLyAkKCcjZG93bmxvYWRfYnV0dG9uJykuY2xpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnY2xpY2snKQogICAgICAgICAgICAvLyAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFuZHJvaWRfZG93bmxvYWQiKS5zdHlsZS5kaXNwbGF5PSJub25lIjsKICAgICAgICAgICAgLy8gICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwb3N0ZXJfaW9zX2d1aWRlIikuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAvLyB9KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgICAgICB2YXIgZG93bmxvYWRfdXJsID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7Ci8vICAgICAgICB2YXIgc21zX2xpbWl0ID0gNjA7Ci8vICAgICAgICB2YXIgaXNfY2FwdGNoYSA9IDE7CgogICAgICAgIHZhciB1ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKICAgICAgICAvLyBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ21pY3JvbWVzc2VuZ2VyJykgIT09IC0xCiAgICAgICAgLy8gfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3FxJykgIT09IC0xKQogICAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignbWljcm9tZXNzZW5nZXInKSAhPT0gLTEKICAgICAgICAgICAgfHwgaXNRUUFQUCgpKQogICAgICAgIHsKICAgICAgICAgICAgJCgnLnNoYWRvdy1ib3gnKS5zaG93KCk7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9J2hpZGRlbic7CiAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gJ+a4qemmqOaPkOekuic7CiAgICAgICAgICAgIHZhciBtbz1mdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCk7fTsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixtbyx7cGFzc2l2ZTpmYWxzZX0pOy8v56aB5q2i6aG16Z2i5ruR5YqoCgogICAgICAgICAgICAkKCcjY29weV9kaXYnKS5zaG93KCk7CiAgICAgICAgICAgIGlmKGlzQW5kcm9pZCl7CiAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gJ210dGJyb3dzZXI6Ly91cmw9Jytsb2NhdGlvbi5ocmVmOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJCgnLmNvbnRlbnQnKS5zaG93KCk7CiAgICAgICAgfQoKICAgICAgICAvL+WIpOaWreaYr+WQplFR5YaF572u5rWP6KeI5Zmo77yI5ZCrSU9T5ZKMQW5kcmlvZO+8iQogICAgICAgIGZ1bmN0aW9uIGlzUVFBUFAoKXsKICAgICAgICAgICAgdmFyIGlzSW9zUVEgPSAoIC8oaVBob25lfGlQYWR8aVBvZHxpT1MpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAvXHNRUS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpOwogICAgICAgICAgICB2YXIgaXNBbmRyb2lkUVEgPSAoIC8oQW5kcm9pZCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmIC9NUVFCcm93c2VyL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAvXHNRUS9pLnRlc3QoKG5hdmlnYXRvci51c2VyQWdlbnQpLnNwbGl0KCdNUVFCcm93c2VyJykpKTsKICAgICAgICAgICAgcmV0dXJuIGlzSW9zUVEgfHwgaXNBbmRyb2lkUVE7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRRdWVyeVZhcmlhYmxlKHZhcmlhYmxlKQogICAgICAgIHsKICAgICAgICAgICAgbGV0IHF1ZXJ5ID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgIGxldCB2YXJzID0gcXVlcnkuc3BsaXQoIiYiKTsKICAgICAgICAgICAgZm9yIChsZXQgaT0wO2k8dmFycy5sZW5ndGg7aSsrKSB7CiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IHZhcnNbaV0uc3BsaXQoIj0iKTsKICAgICAgICAgICAgICAgIGlmKHBhaXJbMF0gPT0gdmFyaWFibGUpe3JldHVybiBwYWlyWzFdO30KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGxldCBmcm9tID0gZ2V0UXVlcnlWYXJpYWJsZSgnZnJvbScpOwogICAgICAvLyAgdmFyIHBsYXRmb3JtID0gMTg4OwogICAgICAgLy8gdmFyIGludml0ZXIgPSAnJzsKICAgICAgLy8gIHZhciBwYWNrYWdlaWQgPSAnJzsKICAgICAgIC8vIHZhciB0eXBlID0gJ3MnOwogICAgICAgIC8vIOiuvue9riDpgoDor7fnoIHvvIjlhajmsJFpZO+8iQogICAgICAgIHJlZ2lzLnBsYXRmb3JtPTE5NgogICAgICAgIHJlZ2lzLnNldEludml0ZXIoZnJvbSkKCiAgICAgICAgLy8kKCcjZG93bmxvYWRfYnV0dG9uJykuYXR0cignaHJlZicsIGRvd25sb2FkX3VybCArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwoKICAgICAgICBmdW5jdGlvbiByZWdpc3RlcigpewogICAgICAgICAgICBpZihyZWdpcy5pbnZpdGVyPT0nJyl7CiAgICAgICAgICAgICAgICByZWdpcy5pbnZpdGVyPSIiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYocmVnaXMucGFja2FnZWlkPT0nJyl7CiAgICAgICAgICAgICAgICByZWdpcy5wYWNrYWdlaWQ9IjQzODYxIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZ2lzLnJlZ2lzdGVyKCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHNlbmRWZXJpZnlDb2RlKCl7CiAgICAgICAgICAgIHJlZ2lzLmlzRmlyc3QgPSAwOwogICAgICAgICAgICByZWdpcy5jb3VudGRvd24gPSA2MDsKICAgICAgICAgICAgcmVnaXMuc2VuZFZlcmlmeUNvZGUoKTsKICAgICAgICB9Cjwvc2NyaXB0Pgo8L2JvZHk+CgoKPC9odG1sPg==