@jumio/websdk 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/fonts/jumio-sdk-icomoon.svg +3 -1
- package/assets/fonts/jumio-sdk-icomoon.ttf +0 -0
- package/assets/fonts/jumio-sdk-icomoon.woff +0 -0
- package/assets/style.css +11 -4
- package/assets_da_1_2_2.tar-DLMc-Zr7.js +5 -0
- package/dac-CX1lWyJ4.js +5 -0
- package/dac_simd-DrhDxU1t.js +5 -0
- package/index.js +41754 -42449
- package/package.json +1 -1
- package/third-party-licenses.txt +61 -62
- package/assets/da_object-Dmvt-Ksj.js +0 -2
- package/assets/da_system_worker-ZGTOZ8Bz.js +0 -2
- package/assets_da_1_2_1.tar-CezVOOjH.js +0 -5
- package/dac-CokYN9l5.js +0 -5
- package/dac-GA_h4b2-.js +0 -5
- package/dac_simd-6C-KoVW4.js +0 -5
- package/dac_simd-DMVKk3l2.js +0 -5
package/dac-GA_h4b2-.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
const I = "data:text/javascript;base64,dmFyIE1vZHVsZSA9ICgoKSA9PiB7CiAgdmFyIF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDsKCiAgcmV0dXJuIGZ1bmN0aW9uIChtb2R1bGVBcmcgPSB7fSkgewogICAgdmFyIE1vZHVsZSA9IG1vZHVsZUFyZzsKICAgIHZhciByZWFkeVByb21pc2VSZXNvbHZlLCByZWFkeVByb21pc2VSZWplY3Q7CiAgICBNb2R1bGVbJ3JlYWR5J10gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUgPSByZXNvbHZlOwogICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICB9KTsKICAgIHZhciBtb2R1bGVPdmVycmlkZXMgPSBPYmplY3QuYXNzaWduKHt9LCBNb2R1bGUpOwogICAgdmFyIGFyZ3VtZW50c18gPSBbXTsKICAgIHZhciB0aGlzUHJvZ3JhbSA9ICcuL3RoaXMucHJvZ3JhbSc7CiAgICB2YXIgcXVpdF8gPSAoc3RhdHVzLCB0b1Rocm93KSA9PiB7CiAgICAgIHRocm93IHRvVGhyb3c7CiAgICB9OwogICAgdmFyIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCc7CiAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSID0gdHlwZW9mIGltcG9ydFNjcmlwdHMgPT0gJ2Z1bmN0aW9uJzsKICAgIHZhciBFTlZJUk9OTUVOVF9JU19OT0RFID0KICAgICAgdHlwZW9mIHByb2Nlc3MgPT0gJ29iamVjdCcgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMgPT0gJ29iamVjdCcgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PSAnc3RyaW5nJzsKICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAnJzsKICAgIGZ1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCkgewogICAgICBpZiAoTW9kdWxlWydsb2NhdGVGaWxlJ10pIHsKICAgICAgICByZXR1cm4gTW9kdWxlWydsb2NhdGVGaWxlJ10ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgfQogICAgICByZXR1cm4gc2NyaXB0RGlyZWN0b3J5ICsgcGF0aDsKICAgIH0KICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgaWYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgaWYgKEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IHNlbGYubG9jYXRpb24uaHJlZjsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCkgewogICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOwogICAgICB9CiAgICAgIGlmIChfc2NyaXB0RGlyKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdERpcjsKICAgICAgfQogICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LnN0YXJ0c1dpdGgoJ2Jsb2I6JykpIHsKICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAnJzsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5yZXBsYWNlKC9bPyNdLiovLCAnJykubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgICB9CiAgICAgIHsKICAgICAgICByZWFkXyA9ICh1cmwpID0+IHsKICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIGZhbHNlKTsKICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVRleHQ7CiAgICAgICAgfTsKICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICByZWFkQmluYXJ5ID0gKHVybCkgPT4gewogICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7CiAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJlYWRBc3luYyA9ICh1cmwsIG9ubG9hZCwgb25lcnJvcikgPT4gewogICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7CiAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJzsKICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCB8fCAoeGhyLnN0YXR1cyA9PSAwICYmIHhoci5yZXNwb25zZSkpIHsKICAgICAgICAgICAgICBvbmxvYWQoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb25lcnJvcigpOwogICAgICAgICAgfTsKICAgICAgICAgIHhoci5vbmVycm9yID0gb25lcnJvcjsKICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgIH07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICB9CiAgICB2YXIgb3V0ID0gTW9kdWxlWydwcmludCddIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICB2YXIgZXJyID0gTW9kdWxlWydwcmludEVyciddIHx8IGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTsKICAgIE9iamVjdC5hc3NpZ24oTW9kdWxlLCBtb2R1bGVPdmVycmlkZXMpOwogICAgbW9kdWxlT3ZlcnJpZGVzID0gbnVsbDsKICAgIGlmIChNb2R1bGVbJ2FyZ3VtZW50cyddKSB7CiAgICAgIGFyZ3VtZW50c18gPSBNb2R1bGVbJ2FyZ3VtZW50cyddOwogICAgfQogICAgaWYgKE1vZHVsZVsndGhpc1Byb2dyYW0nXSkgewogICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsndGhpc1Byb2dyYW0nXTsKICAgIH0KICAgIGlmIChNb2R1bGVbJ3F1aXQnXSkgewogICAgICBxdWl0XyA9IE1vZHVsZVsncXVpdCddOwogICAgfQogICAgdmFyIHdhc21CaW5hcnk7CiAgICBpZiAoTW9kdWxlWyd3YXNtQmluYXJ5J10pIHsKICAgICAgd2FzbUJpbmFyeSA9IE1vZHVsZVsnd2FzbUJpbmFyeSddOwogICAgfQogICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPSAnb2JqZWN0JykgewogICAgICBhYm9ydCgnbm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCcpOwogICAgfQogICAgdmFyIHdhc21NZW1vcnk7CiAgICB2YXIgQUJPUlQgPSBmYWxzZTsKICAgIHZhciBFWElUU1RBVFVTOwogICAgdmFyIEhFQVA4LCBIRUFQVTgsIEhFQVAxNiwgSEVBUFUxNiwgSEVBUDMyLCBIRUFQVTMyLCBIRUFQRjMyLCBIRUFQRjY0OwogICAgZnVuY3Rpb24gdXBkYXRlTWVtb3J5Vmlld3MoKSB7CiAgICAgIHZhciBiID0gd2FzbU1lbW9yeS5idWZmZXI7CiAgICAgIE1vZHVsZVsnSEVBUDgnXSA9IEhFQVA4ID0gbmV3IEludDhBcnJheShiKTsKICAgICAgTW9kdWxlWydIRUFQMTYnXSA9IEhFQVAxNiA9IG5ldyBJbnQxNkFycmF5KGIpOwogICAgICBNb2R1bGVbJ0hFQVBVOCddID0gSEVBUFU4ID0gbmV3IFVpbnQ4QXJyYXkoYik7CiAgICAgIE1vZHVsZVsnSEVBUFUxNiddID0gSEVBUFUxNiA9IG5ldyBVaW50MTZBcnJheShiKTsKICAgICAgTW9kdWxlWydIRUFQMzInXSA9IEhFQVAzMiA9IG5ldyBJbnQzMkFycmF5KGIpOwogICAgICBNb2R1bGVbJ0hFQVBVMzInXSA9IEhFQVBVMzIgPSBuZXcgVWludDMyQXJyYXkoYik7CiAgICAgIE1vZHVsZVsnSEVBUEYzMiddID0gSEVBUEYzMiA9IG5ldyBGbG9hdDMyQXJyYXkoYik7CiAgICAgIE1vZHVsZVsnSEVBUEY2NCddID0gSEVBUEY2NCA9IG5ldyBGbG9hdDY0QXJyYXkoYik7CiAgICB9CiAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICB2YXIgX19BVElOSVRfXyA9IFtdOwogICAgdmFyIF9fQVRNQUlOX18gPSBbXTsKICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICB2YXIgcnVudGltZUluaXRpYWxpemVkID0gZmFsc2U7CiAgICBmdW5jdGlvbiBwcmVSdW4oKSB7CiAgICAgIGlmIChNb2R1bGVbJ3ByZVJ1biddKSB7CiAgICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbJ3ByZVJ1biddID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIE1vZHVsZVsncHJlUnVuJ10gPSBbTW9kdWxlWydwcmVSdW4nXV07CiAgICAgICAgfQogICAgICAgIHdoaWxlIChNb2R1bGVbJ3ByZVJ1biddLmxlbmd0aCkgewogICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWydwcmVSdW4nXS5zaGlmdCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBSRVJVTl9fKTsKICAgIH0KICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICBydW50aW1lSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICBpZiAoIU1vZHVsZVsnbm9GU0luaXQnXSAmJiAhRlMuaW5pdC5pbml0aWFsaXplZCkgewogICAgICAgIEZTLmluaXQoKTsKICAgICAgfQogICAgICBGUy5pZ25vcmVQZXJtaXNzaW9ucyA9IGZhbHNlOwogICAgICBUVFkuaW5pdCgpOwogICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKTsKICAgIH0KICAgIGZ1bmN0aW9uIHByZU1haW4oKSB7CiAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgfQogICAgZnVuY3Rpb24gcG9zdFJ1bigpIHsKICAgICAgaWYgKE1vZHVsZVsncG9zdFJ1biddKSB7CiAgICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbJ3Bvc3RSdW4nXSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBNb2R1bGVbJ3Bvc3RSdW4nXSA9IFtNb2R1bGVbJ3Bvc3RSdW4nXV07CiAgICAgICAgfQogICAgICAgIHdoaWxlIChNb2R1bGVbJ3Bvc3RSdW4nXS5sZW5ndGgpIHsKICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbJ3Bvc3RSdW4nXS5zaGlmdCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyk7CiAgICB9CiAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICBfX0FUUFJFUlVOX18udW5zaGlmdChjYik7CiAgICB9CiAgICBmdW5jdGlvbiBhZGRPbkluaXQoY2IpIHsKICAgICAgX19BVElOSVRfXy51bnNoaWZ0KGNiKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICBfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpOwogICAgfQogICAgdmFyIHJ1bkRlcGVuZGVuY2llcyA9IDA7CiAgICB2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXIgPSBudWxsOwogICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICBmdW5jdGlvbiBnZXRVbmlxdWVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgIHJldHVybiBpZDsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgcnVuRGVwZW5kZW5jaWVzKys7CiAgICAgIE1vZHVsZVsnbW9uaXRvclJ1bkRlcGVuZGVuY2llcyddPy4ocnVuRGVwZW5kZW5jaWVzKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgcnVuRGVwZW5kZW5jaWVzLS07CiAgICAgIE1vZHVsZVsnbW9uaXRvclJ1bkRlcGVuZGVuY2llcyddPy4ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA9PSAwKSB7CiAgICAgICAgaWYgKHJ1bkRlcGVuZGVuY3lXYXRjaGVyICE9PSBudWxsKSB7CiAgICAgICAgICBjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTsKICAgICAgICAgIHJ1bkRlcGVuZGVuY3lXYXRjaGVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlcGVuZGVuY2llc0Z1bGZpbGxlZCkgewogICAgICAgICAgdmFyIGNhbGxiYWNrID0gZGVwZW5kZW5jaWVzRnVsZmlsbGVkOwogICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBhYm9ydCh3aGF0KSB7CiAgICAgIE1vZHVsZVsnb25BYm9ydCddPy4od2hhdCk7CiAgICAgIHdoYXQgPSAnQWJvcnRlZCgnICsgd2hhdCArICcpJzsKICAgICAgZXJyKHdoYXQpOwogICAgICBBQk9SVCA9IHRydWU7CiAgICAgIEVYSVRTVEFUVVMgPSAxOwogICAgICB3aGF0ICs9ICcuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uJzsKICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICByZWFkeVByb21pc2VSZWplY3QoZSk7CiAgICAgIHRocm93IGU7CiAgICB9CiAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICdkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsJzsKICAgIHZhciBpc0RhdGFVUkkgPSAoZmlsZW5hbWUpID0+IGZpbGVuYW1lLnN0YXJ0c1dpdGgoZGF0YVVSSVByZWZpeCk7CiAgICB2YXIgd2FzbUJpbmFyeUZpbGU7CiAgICB3YXNtQmluYXJ5RmlsZSA9ICdkYWMud2FzbSc7CiAgICBpZiAoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgd2FzbUJpbmFyeUZpbGUgPSBsb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEJpbmFyeVN5bmMoZmlsZSkgewogICAgICBpZiAoZmlsZSA9PSB3YXNtQmluYXJ5RmlsZSAmJiB3YXNtQmluYXJ5KSB7CiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpOwogICAgICB9CiAgICAgIGlmIChyZWFkQmluYXJ5KSB7CiAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoZmlsZSk7CiAgICAgIH0KICAgICAgdGhyb3cgJ3N5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkOiB5b3UgY2FuIHByZWxvYWQgaXQgdG8gTW9kdWxlWyJ3YXNtQmluYXJ5Il0gbWFudWFsbHksIG9yIGVtY2MucHkgd2lsbCBkbyB0aGF0IGZvciB5b3Ugd2hlbiBnZW5lcmF0aW5nIEhUTUwgKGJ1dCBub3QgSlMpJzsKICAgIH0KICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlU3luYyhmaWxlLCBpbmZvKSB7CiAgICAgIHZhciBtb2R1bGU7CiAgICAgIHZhciBiaW5hcnkgPSBnZXRCaW5hcnlTeW5jKGZpbGUpOwogICAgICBtb2R1bGUgPSBuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKGJpbmFyeSk7CiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIGluZm8pOwogICAgICByZXR1cm4gW2luc3RhbmNlLCBtb2R1bGVdOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlV2FzbSgpIHsKICAgICAgdmFyIGluZm8gPSB7IGVudjogd2FzbUltcG9ydHMsIHdhc2lfc25hcHNob3RfcHJldmlldzE6IHdhc21JbXBvcnRzIH07CiAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgd2FzbUV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgIHdhc21NZW1vcnkgPSB3YXNtRXhwb3J0c1snbWVtb3J5J107CiAgICAgICAgdXBkYXRlTWVtb3J5Vmlld3MoKTsKICAgICAgICB3YXNtVGFibGUgPSB3YXNtRXhwb3J0c1snX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZSddOwogICAgICAgIGFkZE9uSW5pdCh3YXNtRXhwb3J0c1snX193YXNtX2NhbGxfY3RvcnMnXSk7CiAgICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeSgnd2FzbS1pbnN0YW50aWF0ZScpOwogICAgICAgIHJldHVybiB3YXNtRXhwb3J0czsKICAgICAgfQogICAgICBhZGRSdW5EZXBlbmRlbmN5KCd3YXNtLWluc3RhbnRpYXRlJyk7CiAgICAgIGlmIChNb2R1bGVbJ2luc3RhbnRpYXRlV2FzbSddKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBNb2R1bGVbJ2luc3RhbnRpYXRlV2FzbSddKGluZm8sIHJlY2VpdmVJbnN0YW5jZSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgZXJyKGBNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAke2V9YCk7CiAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QoZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciByZXN1bHQgPSBpbnN0YW50aWF0ZVN5bmMod2FzbUJpbmFyeUZpbGUsIGluZm8pOwogICAgICByZXR1cm4gcmVjZWl2ZUluc3RhbmNlKHJlc3VsdFswXSk7CiAgICB9CiAgICB2YXIgdGVtcERvdWJsZTsKICAgIHZhciB0ZW1wSTY0OwogICAgZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpIHsKICAgICAgdGhpcy5uYW1lID0gJ0V4aXRTdGF0dXMnOwogICAgICB0aGlzLm1lc3NhZ2UgPSBgUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgke3N0YXR1c30pYDsKICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICB9CiAgICB2YXIgY2FsbFJ1bnRpbWVDYWxsYmFja3MgPSAoY2FsbGJhY2tzKSA9PiB7CiAgICAgIHdoaWxlIChjYWxsYmFja3MubGVuZ3RoID4gMCkgewogICAgICAgIGNhbGxiYWNrcy5zaGlmdCgpKE1vZHVsZSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgbm9FeGl0UnVudGltZSA9IE1vZHVsZVsnbm9FeGl0UnVudGltZSddIHx8IHRydWU7CiAgICBjbGFzcyBFeGNlcHRpb25JbmZvIHsKICAgICAgY29uc3RydWN0b3IoZXhjUHRyKSB7CiAgICAgICAgdGhpcy5leGNQdHIgPSBleGNQdHI7CiAgICAgICAgdGhpcy5wdHIgPSBleGNQdHIgLSAyNDsKICAgICAgfQogICAgICBzZXRfdHlwZSh0eXBlKSB7CiAgICAgICAgSEVBUFUzMlsodGhpcy5wdHIgKyA0KSA+PiAyXSA9IHR5cGU7CiAgICAgIH0KICAgICAgZ2V0X3R5cGUoKSB7CiAgICAgICAgcmV0dXJuIEhFQVBVMzJbKHRoaXMucHRyICsgNCkgPj4gMl07CiAgICAgIH0KICAgICAgc2V0X2Rlc3RydWN0b3IoZGVzdHJ1Y3RvcikgewogICAgICAgIEhFQVBVMzJbKHRoaXMucHRyICsgOCkgPj4gMl0gPSBkZXN0cnVjdG9yOwogICAgICB9CiAgICAgIGdldF9kZXN0cnVjdG9yKCkgewogICAgICAgIHJldHVybiBIRUFQVTMyWyh0aGlzLnB0ciArIDgpID4+IDJdOwogICAgICB9CiAgICAgIHNldF9jYXVnaHQoY2F1Z2h0KSB7CiAgICAgICAgY2F1Z2h0ID0gY2F1Z2h0ID8gMSA6IDA7CiAgICAgICAgSEVBUDhbKHRoaXMucHRyICsgMTIpID4+IDBdID0gY2F1Z2h0OwogICAgICB9CiAgICAgIGdldF9jYXVnaHQoKSB7CiAgICAgICAgcmV0dXJuIEhFQVA4Wyh0aGlzLnB0ciArIDEyKSA+PiAwXSAhPSAwOwogICAgICB9CiAgICAgIHNldF9yZXRocm93bihyZXRocm93bikgewogICAgICAgIHJldGhyb3duID0gcmV0aHJvd24gPyAxIDogMDsKICAgICAgICBIRUFQOFsodGhpcy5wdHIgKyAxMykgPj4gMF0gPSByZXRocm93bjsKICAgICAgfQogICAgICBnZXRfcmV0aHJvd24oKSB7CiAgICAgICAgcmV0dXJuIEhFQVA4Wyh0aGlzLnB0ciArIDEzKSA+PiAwXSAhPSAwOwogICAgICB9CiAgICAgIGluaXQodHlwZSwgZGVzdHJ1Y3RvcikgewogICAgICAgIHRoaXMuc2V0X2FkanVzdGVkX3B0cigwKTsKICAgICAgICB0aGlzLnNldF90eXBlKHR5cGUpOwogICAgICAgIHRoaXMuc2V0X2Rlc3RydWN0b3IoZGVzdHJ1Y3Rvcik7CiAgICAgIH0KICAgICAgc2V0X2FkanVzdGVkX3B0cihhZGp1c3RlZFB0cikgewogICAgICAgIEhFQVBVMzJbKHRoaXMucHRyICsgMTYpID4+IDJdID0gYWRqdXN0ZWRQdHI7CiAgICAgIH0KICAgICAgZ2V0X2FkanVzdGVkX3B0cigpIHsKICAgICAgICByZXR1cm4gSEVBUFUzMlsodGhpcy5wdHIgKyAxNikgPj4gMl07CiAgICAgIH0KICAgICAgZ2V0X2V4Y2VwdGlvbl9wdHIoKSB7CiAgICAgICAgdmFyIGlzUG9pbnRlciA9IF9fX2N4YV9pc19wb2ludGVyX3R5cGUodGhpcy5nZXRfdHlwZSgpKTsKICAgICAgICBpZiAoaXNQb2ludGVyKSB7CiAgICAgICAgICByZXR1cm4gSEVBUFUzMlt0aGlzLmV4Y1B0ciA+PiAyXTsKICAgICAgICB9CiAgICAgICAgdmFyIGFkanVzdGVkID0gdGhpcy5nZXRfYWRqdXN0ZWRfcHRyKCk7CiAgICAgICAgaWYgKGFkanVzdGVkICE9PSAwKSB7CiAgICAgICAgICByZXR1cm4gYWRqdXN0ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmV4Y1B0cjsKICAgICAgfQogICAgfQogICAgdmFyIGV4Y2VwdGlvbkxhc3QgPSAwOwogICAgdmFyIHVuY2F1Z2h0RXhjZXB0aW9uQ291bnQgPSAwOwogICAgdmFyIF9fX2N4YV90aHJvdyA9IChwdHIsIHR5cGUsIGRlc3RydWN0b3IpID0+IHsKICAgICAgdmFyIGluZm8gPSBuZXcgRXhjZXB0aW9uSW5mbyhwdHIpOwogICAgICBpbmZvLmluaXQodHlwZSwgZGVzdHJ1Y3Rvcik7CiAgICAgIGV4Y2VwdGlvbkxhc3QgPSBwdHI7CiAgICAgIHVuY2F1Z2h0RXhjZXB0aW9uQ291bnQrKzsKICAgICAgdGhyb3cgZXhjZXB0aW9uTGFzdDsKICAgIH07CiAgICB2YXIgUEFUSCA9IHsKICAgICAgaXNBYnM6IChwYXRoKSA9PiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nLAogICAgICBzcGxpdFBhdGg6IChmaWxlbmFtZSkgPT4gewogICAgICAgIHZhciBzcGxpdFBhdGhSZSA9IC9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLzsKICAgICAgICByZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7CiAgICAgIH0sCiAgICAgIG5vcm1hbGl6ZUFycmF5OiAocGFydHMsIGFsbG93QWJvdmVSb290KSA9PiB7CiAgICAgICAgdmFyIHVwID0gMDsKICAgICAgICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIHZhciBsYXN0ID0gcGFydHNbaV07CiAgICAgICAgICBpZiAobGFzdCA9PT0gJy4nKSB7CiAgICAgICAgICAgIHBhcnRzLnNwbGljZShpLCAxKTsKICAgICAgICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykgewogICAgICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgIHVwKys7CiAgICAgICAgICB9IGVsc2UgaWYgKHVwKSB7CiAgICAgICAgICAgIHBhcnRzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgdXAtLTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7CiAgICAgICAgICBmb3IgKDsgdXA7IHVwLS0pIHsKICAgICAgICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcnRzOwogICAgICB9LAogICAgICBub3JtYWxpemU6IChwYXRoKSA9PiB7CiAgICAgICAgdmFyIGlzQWJzb2x1dGUgPSBQQVRILmlzQWJzKHBhdGgpLAogICAgICAgICAgdHJhaWxpbmdTbGFzaCA9IHBhdGguc3Vic3RyKC0xKSA9PT0gJy8nOwogICAgICAgIHBhdGggPSBQQVRILm5vcm1hbGl6ZUFycmF5KAogICAgICAgICAgcGF0aC5zcGxpdCgnLycpLmZpbHRlcigocCkgPT4gISFwKSwKICAgICAgICAgICFpc0Fic29sdXRlCiAgICAgICAgKS5qb2luKCcvJyk7CiAgICAgICAgaWYgKCFwYXRoICYmICFpc0Fic29sdXRlKSB7CiAgICAgICAgICBwYXRoID0gJy4nOwogICAgICAgIH0KICAgICAgICBpZiAocGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7CiAgICAgICAgICBwYXRoICs9ICcvJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDsKICAgICAgfSwKICAgICAgZGlybmFtZTogKHBhdGgpID0+IHsKICAgICAgICB2YXIgcmVzdWx0ID0gUEFUSC5zcGxpdFBhdGgocGF0aCksCiAgICAgICAgICByb290ID0gcmVzdWx0WzBdLAogICAgICAgICAgZGlyID0gcmVzdWx0WzFdOwogICAgICAgIGlmICghcm9vdCAmJiAhZGlyKSB7CiAgICAgICAgICByZXR1cm4gJy4nOwogICAgICAgIH0KICAgICAgICBpZiAoZGlyKSB7CiAgICAgICAgICBkaXIgPSBkaXIuc3Vic3RyKDAsIGRpci5sZW5ndGggLSAxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJvb3QgKyBkaXI7CiAgICAgIH0sCiAgICAgIGJhc2VuYW1lOiAocGF0aCkgPT4gewogICAgICAgIGlmIChwYXRoID09PSAnLycpIHsKICAgICAgICAgIHJldHVybiAnLyc7CiAgICAgICAgfQogICAgICAgIHBhdGggPSBQQVRILm5vcm1hbGl6ZShwYXRoKTsKICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cLyQvLCAnJyk7CiAgICAgICAgdmFyIGxhc3RTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICBpZiAobGFzdFNsYXNoID09PSAtMSkgewogICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXRoLnN1YnN0cihsYXN0U2xhc2ggKyAxKTsKICAgICAgfSwKICAgICAgam9pbjogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBwYXRocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgcmV0dXJuIFBBVEgubm9ybWFsaXplKHBhdGhzLmpvaW4oJy8nKSk7CiAgICAgIH0sCiAgICAgIGpvaW4yOiAobCwgcikgPT4gUEFUSC5ub3JtYWxpemUobCArICcvJyArIHIpCiAgICB9OwogICAgdmFyIGluaXRSYW5kb21GaWxsID0gKCkgPT4gewogICAgICBpZiAodHlwZW9mIGNyeXB0byA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgY3J5cHRvWydnZXRSYW5kb21WYWx1ZXMnXSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuICh2aWV3KSA9PiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHZpZXcpOwogICAgICB9IGVsc2UgewogICAgICAgIGFib3J0KCdpbml0UmFuZG9tRGV2aWNlJyk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgcmFuZG9tRmlsbCA9ICh2aWV3KSA9PiAocmFuZG9tRmlsbCA9IGluaXRSYW5kb21GaWxsKCkpKHZpZXcpOwogICAgdmFyIFBBVEhfRlMgPSB7CiAgICAgIHJlc29sdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsCiAgICAgICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHsKICAgICAgICAgIHZhciBwYXRoID0gaSA+PSAwID8gYXJndW1lbnRzW2ldIDogRlMuY3dkKCk7CiAgICAgICAgICBpZiAodHlwZW9mIHBhdGggIT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MnKTsKICAgICAgICAgIH0gZWxzZSBpZiAoIXBhdGgpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgfQogICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDsKICAgICAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBQQVRILmlzQWJzKHBhdGgpOwogICAgICAgIH0KICAgICAgICByZXNvbHZlZFBhdGggPSBQQVRILm5vcm1hbGl6ZUFycmF5KAogICAgICAgICAgcmVzb2x2ZWRQYXRoLnNwbGl0KCcvJykuZmlsdGVyKChwKSA9PiAhIXApLAogICAgICAgICAgIXJlc29sdmVkQWJzb2x1dGUKICAgICAgICApLmpvaW4oJy8nKTsKICAgICAgICByZXR1cm4gKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGggfHwgJy4nOwogICAgICB9LAogICAgICByZWxhdGl2ZTogKGZyb20sIHRvKSA9PiB7CiAgICAgICAgZnJvbSA9IFBBVEhfRlMucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7CiAgICAgICAgdG8gPSBQQVRIX0ZTLnJlc29sdmUodG8pLnN1YnN0cigxKTsKICAgICAgICBmdW5jdGlvbiB0cmltKGFycikgewogICAgICAgICAgdmFyIHN0YXJ0ID0gMDsKICAgICAgICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHsKICAgICAgICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHZhciBlbmQgPSBhcnIubGVuZ3RoIC0gMTsKICAgICAgICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHsKICAgICAgICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3RhcnQgPiBlbmQpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKICAgICAgICB9CiAgICAgICAgdmFyIGZyb21QYXJ0cyA9IHRyaW0oZnJvbS5zcGxpdCgnLycpKTsKICAgICAgICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7CiAgICAgICAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTsKICAgICAgICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHsKICAgICAgICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBvdXRwdXRQYXJ0cyA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSBzYW1lUGFydHNMZW5ndGg7IGkgPCBmcm9tUGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7CiAgICAgICAgfQogICAgICAgIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7CiAgICAgICAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTsKICAgICAgfQogICAgfTsKICAgIHZhciBVVEY4RGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciAhPSAndW5kZWZpbmVkJyA/IG5ldyBUZXh0RGVjb2RlcigndXRmOCcpIDogdW5kZWZpbmVkOwogICAgdmFyIFVURjhBcnJheVRvU3RyaW5nID0gKGhlYXBPckFycmF5LCBpZHgsIG1heEJ5dGVzVG9SZWFkKSA9PiB7CiAgICAgIHZhciBlbmRJZHggPSBpZHggKyBtYXhCeXRlc1RvUmVhZDsKICAgICAgdmFyIGVuZFB0ciA9IGlkeDsKICAgICAgd2hpbGUgKGhlYXBPckFycmF5W2VuZFB0cl0gJiYgIShlbmRQdHIgPj0gZW5kSWR4KSkgewogICAgICAgICsrZW5kUHRyOwogICAgICB9CiAgICAgIGlmIChlbmRQdHIgLSBpZHggPiAxNiAmJiBoZWFwT3JBcnJheS5idWZmZXIgJiYgVVRGOERlY29kZXIpIHsKICAgICAgICByZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXBPckFycmF5LnN1YmFycmF5KGlkeCwgZW5kUHRyKSk7CiAgICAgIH0KICAgICAgdmFyIHN0ciA9ICcnOwogICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgdmFyIHUwID0gaGVhcE9yQXJyYXlbaWR4KytdOwogICAgICAgIGlmICghKHUwICYgMTI4KSkgewogICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHZhciB1MSA9IGhlYXBPckFycmF5W2lkeCsrXSAmIDYzOwogICAgICAgIGlmICgodTAgJiAyMjQpID09IDE5MikgewogICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB2YXIgdTIgPSBoZWFwT3JBcnJheVtpZHgrK10gJiA2MzsKICAgICAgICBpZiAoKHUwICYgMjQwKSA9PSAyMjQpIHsKICAgICAgICAgIHUwID0gKCh1MCAmIDE1KSA8PCAxMikgfCAodTEgPDwgNikgfCB1MjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwT3JBcnJheVtpZHgrK10gJiA2Myk7CiAgICAgICAgfQogICAgICAgIGlmICh1MCA8IDY1NTM2KSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBjaCA9IHUwIC0gNjU1MzY7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NiB8IChjaCA+PiAxMCksIDU2MzIwIHwgKGNoICYgMTAyMykpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3RyOwogICAgfTsKICAgIHZhciBGU19zdGRpbl9nZXRDaGFyX2J1ZmZlciA9IFtdOwogICAgdmFyIGxlbmd0aEJ5dGVzVVRGOCA9IChzdHIpID0+IHsKICAgICAgdmFyIGxlbiA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoYyA8PSAxMjcpIHsKICAgICAgICAgIGxlbisrOwogICAgICAgIH0gZWxzZSBpZiAoYyA8PSAyMDQ3KSB7CiAgICAgICAgICBsZW4gKz0gMjsKICAgICAgICB9IGVsc2UgaWYgKGMgPj0gNTUyOTYgJiYgYyA8PSA1NzM0MykgewogICAgICAgICAgbGVuICs9IDQ7CiAgICAgICAgICArK2k7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxlbiArPSAzOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbGVuOwogICAgfTsKICAgIHZhciBzdHJpbmdUb1VURjhBcnJheSA9IChzdHIsIGhlYXAsIG91dElkeCwgbWF4Qnl0ZXNUb1dyaXRlKSA9PiB7CiAgICAgIGlmICghKG1heEJ5dGVzVG9Xcml0ZSA+IDApKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgdmFyIHN0YXJ0SWR4ID0gb3V0SWR4OwogICAgICB2YXIgZW5kSWR4ID0gb3V0SWR4ICsgbWF4Qnl0ZXNUb1dyaXRlIC0gMTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgdSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgIGlmICh1ID49IDU1Mjk2ICYmIHUgPD0gNTczNDMpIHsKICAgICAgICAgIHZhciB1MSA9IHN0ci5jaGFyQ29kZUF0KCsraSk7CiAgICAgICAgICB1ID0gKDY1NTM2ICsgKCh1ICYgMTAyMykgPDwgMTApKSB8ICh1MSAmIDEwMjMpOwogICAgICAgIH0KICAgICAgICBpZiAodSA8PSAxMjcpIHsKICAgICAgICAgIGlmIChvdXRJZHggPj0gZW5kSWR4KSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSB1OwogICAgICAgIH0gZWxzZSBpZiAodSA8PSAyMDQ3KSB7CiAgICAgICAgICBpZiAob3V0SWR4ICsgMSA+PSBlbmRJZHgpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDE5MiB8ICh1ID4+IDYpOwogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCAodSAmIDYzKTsKICAgICAgICB9IGVsc2UgaWYgKHUgPD0gNjU1MzUpIHsKICAgICAgICAgIGlmIChvdXRJZHggKyAyID49IGVuZElkeCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGhlYXBbb3V0SWR4KytdID0gMjI0IHwgKHUgPj4gMTIpOwogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCAoKHUgPj4gNikgJiA2Myk7CiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDEyOCB8ICh1ICYgNjMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAob3V0SWR4ICsgMyA+PSBlbmRJZHgpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDI0MCB8ICh1ID4+IDE4KTsKICAgICAgICAgIGhlYXBbb3V0SWR4KytdID0gMTI4IHwgKCh1ID4+IDEyKSAmIDYzKTsKICAgICAgICAgIGhlYXBbb3V0SWR4KytdID0gMTI4IHwgKCh1ID4+IDYpICYgNjMpOwogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCAodSAmIDYzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaGVhcFtvdXRJZHhdID0gMDsKICAgICAgcmV0dXJuIG91dElkeCAtIHN0YXJ0SWR4OwogICAgfTsKICAgIGZ1bmN0aW9uIGludEFycmF5RnJvbVN0cmluZyhzdHJpbmd5LCBkb250QWRkTnVsbCwgbGVuZ3RoKSB7CiAgICAgIHZhciBsZW4gPSBsZW5ndGggPiAwID8gbGVuZ3RoIDogbGVuZ3RoQnl0ZXNVVEY4KHN0cmluZ3kpICsgMTsKICAgICAgdmFyIHU4YXJyYXkgPSBuZXcgQXJyYXkobGVuKTsKICAgICAgdmFyIG51bUJ5dGVzV3JpdHRlbiA9IHN0cmluZ1RvVVRGOEFycmF5KHN0cmluZ3ksIHU4YXJyYXksIDAsIHU4YXJyYXkubGVuZ3RoKTsKICAgICAgaWYgKGRvbnRBZGROdWxsKSB7CiAgICAgICAgdThhcnJheS5sZW5ndGggPSBudW1CeXRlc1dyaXR0ZW47CiAgICAgIH0KICAgICAgcmV0dXJuIHU4YXJyYXk7CiAgICB9CiAgICB2YXIgRlNfc3RkaW5fZ2V0Q2hhciA9ICgpID0+IHsKICAgICAgaWYgKCFGU19zdGRpbl9nZXRDaGFyX2J1ZmZlci5sZW5ndGgpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDsKICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LnByb21wdCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICByZXN1bHQgPSB3aW5kb3cucHJvbXB0KCdJbnB1dDogJyk7CiAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAnXG4nOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlYWRsaW5lID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIHJlc3VsdCA9IHJlYWRsaW5lKCk7CiAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAnXG4nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIEZTX3N0ZGluX2dldENoYXJfYnVmZmVyID0gaW50QXJyYXlGcm9tU3RyaW5nKHJlc3VsdCwgdHJ1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIEZTX3N0ZGluX2dldENoYXJfYnVmZmVyLnNoaWZ0KCk7CiAgICB9OwogICAgdmFyIFRUWSA9IHsKICAgICAgdHR5czogW10sCiAgICAgIGluaXQoKSB7fSwKICAgICAgc2h1dGRvd24oKSB7fSwKICAgICAgcmVnaXN0ZXIoZGV2LCBvcHMpIHsKICAgICAgICBUVFkudHR5c1tkZXZdID0geyBpbnB1dDogW10sIG91dHB1dDogW10sIG9wczogb3BzIH07CiAgICAgICAgRlMucmVnaXN0ZXJEZXZpY2UoZGV2LCBUVFkuc3RyZWFtX29wcyk7CiAgICAgIH0sCiAgICAgIHN0cmVhbV9vcHM6IHsKICAgICAgICBvcGVuKHN0cmVhbSkgewogICAgICAgICAgdmFyIHR0eSA9IFRUWS50dHlzW3N0cmVhbS5ub2RlLnJkZXZdOwogICAgICAgICAgaWYgKCF0dHkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDMpOwogICAgICAgICAgfQogICAgICAgICAgc3RyZWFtLnR0eSA9IHR0eTsKICAgICAgICAgIHN0cmVhbS5zZWVrYWJsZSA9IGZhbHNlOwogICAgICAgIH0sCiAgICAgICAgY2xvc2Uoc3RyZWFtKSB7CiAgICAgICAgICBzdHJlYW0udHR5Lm9wcy5mc3luYyhzdHJlYW0udHR5KTsKICAgICAgICB9LAogICAgICAgIGZzeW5jKHN0cmVhbSkgewogICAgICAgICAgc3RyZWFtLnR0eS5vcHMuZnN5bmMoc3RyZWFtLnR0eSk7CiAgICAgICAgfSwKICAgICAgICByZWFkKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zKSB7CiAgICAgICAgICBpZiAoIXN0cmVhbS50dHkgfHwgIXN0cmVhbS50dHkub3BzLmdldF9jaGFyKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYwKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBieXRlc1JlYWQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmVhbS50dHkub3BzLmdldF9jaGFyKHN0cmVhbS50dHkpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCAmJiBieXRlc1JlYWQgPT09IDApIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnl0ZXNSZWFkKys7CiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IHJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChieXRlc1JlYWQpIHsKICAgICAgICAgICAgc3RyZWFtLm5vZGUudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7CiAgICAgICAgfSwKICAgICAgICB3cml0ZShzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvcykgewogICAgICAgICAgaWYgKCFzdHJlYW0udHR5IHx8ICFzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcikgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2MCk7CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgc3RyZWFtLnR0eS5vcHMucHV0X2NoYXIoc3RyZWFtLnR0eSwgYnVmZmVyW29mZnNldCArIGldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobGVuZ3RoKSB7CiAgICAgICAgICAgIHN0cmVhbS5ub2RlLnRpbWVzdGFtcCA9IERhdGUubm93KCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRlZmF1bHRfdHR5X29wczogewogICAgICAgIGdldF9jaGFyKHR0eSkgewogICAgICAgICAgcmV0dXJuIEZTX3N0ZGluX2dldENoYXIoKTsKICAgICAgICB9LAogICAgICAgIHB1dF9jaGFyKHR0eSwgdmFsKSB7CiAgICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gMTApIHsKICAgICAgICAgICAgb3V0KFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsIDApKTsKICAgICAgICAgICAgdHR5Lm91dHB1dCA9IFtdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHZhbCAhPSAwKSB7CiAgICAgICAgICAgICAgdHR5Lm91dHB1dC5wdXNoKHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGZzeW5jKHR0eSkgewogICAgICAgICAgaWYgKHR0eS5vdXRwdXQgJiYgdHR5Lm91dHB1dC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIG91dChVVEY4QXJyYXlUb1N0cmluZyh0dHkub3V0cHV0LCAwKSk7CiAgICAgICAgICAgIHR0eS5vdXRwdXQgPSBbXTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGlvY3RsX3RjZ2V0cyh0dHkpIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGNfaWZsYWc6IDI1ODU2LAogICAgICAgICAgICBjX29mbGFnOiA1LAogICAgICAgICAgICBjX2NmbGFnOiAxOTEsCiAgICAgICAgICAgIGNfbGZsYWc6IDM1Mzg3LAogICAgICAgICAgICBjX2NjOiBbCiAgICAgICAgICAgICAgMywgMjgsIDEyNywgMjEsIDQsIDAsIDEsIDAsIDE3LCAxOSwgMjYsIDAsIDE4LCAxNSwgMjMsIDIyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCiAgICAgICAgICAgIF0KICAgICAgICAgIH07CiAgICAgICAgfSwKICAgICAgICBpb2N0bF90Y3NldHModHR5LCBvcHRpb25hbF9hY3Rpb25zLCBkYXRhKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9LAogICAgICAgIGlvY3RsX3Rpb2Nnd2luc3oodHR5KSB7CiAgICAgICAgICByZXR1cm4gWzI0LCA4MF07CiAgICAgICAgfQogICAgICB9LAogICAgICBkZWZhdWx0X3R0eTFfb3BzOiB7CiAgICAgICAgcHV0X2NoYXIodHR5LCB2YWwpIHsKICAgICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSAxMCkgewogICAgICAgICAgICBlcnIoVVRGOEFycmF5VG9TdHJpbmcodHR5Lm91dHB1dCwgMCkpOwogICAgICAgICAgICB0dHkub3V0cHV0ID0gW107CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAodmFsICE9IDApIHsKICAgICAgICAgICAgICB0dHkub3V0cHV0LnB1c2godmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZnN5bmModHR5KSB7CiAgICAgICAgICBpZiAodHR5Lm91dHB1dCAmJiB0dHkub3V0cHV0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgZXJyKFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsIDApKTsKICAgICAgICAgICAgdHR5Lm91dHB1dCA9IFtdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIHZhciB6ZXJvTWVtb3J5ID0gKGFkZHJlc3MsIHNpemUpID0+IHsKICAgICAgSEVBUFU4LmZpbGwoMCwgYWRkcmVzcywgYWRkcmVzcyArIHNpemUpOwogICAgICByZXR1cm4gYWRkcmVzczsKICAgIH07CiAgICB2YXIgYWxpZ25NZW1vcnkgPSAoc2l6ZSwgYWxpZ25tZW50KSA9PiBNYXRoLmNlaWwoc2l6ZSAvIGFsaWdubWVudCkgKiBhbGlnbm1lbnQ7CiAgICB2YXIgbW1hcEFsbG9jID0gKHNpemUpID0+IHsKICAgICAgc2l6ZSA9IGFsaWduTWVtb3J5KHNpemUsIDY1NTM2KTsKICAgICAgdmFyIHB0ciA9IF9lbXNjcmlwdGVuX2J1aWx0aW5fbWVtYWxpZ24oNjU1MzYsIHNpemUpOwogICAgICBpZiAoIXB0cikgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHJldHVybiB6ZXJvTWVtb3J5KHB0ciwgc2l6ZSk7CiAgICB9OwogICAgdmFyIE1FTUZTID0gewogICAgICBvcHNfdGFibGU6IG51bGwsCiAgICAgIG1vdW50KG1vdW50KSB7CiAgICAgICAgcmV0dXJuIE1FTUZTLmNyZWF0ZU5vZGUobnVsbCwgJy8nLCAxNjM4NCB8IDUxMSwgMCk7CiAgICAgIH0sCiAgICAgIGNyZWF0ZU5vZGUocGFyZW50LCBuYW1lLCBtb2RlLCBkZXYpIHsKICAgICAgICBpZiAoRlMuaXNCbGtkZXYobW9kZSkgfHwgRlMuaXNGSUZPKG1vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgICAgfQogICAgICAgIE1FTUZTLm9wc190YWJsZSB8fD0gewogICAgICAgICAgZGlyOiB7CiAgICAgICAgICAgIG5vZGU6IHsKICAgICAgICAgICAgICBnZXRhdHRyOiBNRU1GUy5ub2RlX29wcy5nZXRhdHRyLAogICAgICAgICAgICAgIHNldGF0dHI6IE1FTUZTLm5vZGVfb3BzLnNldGF0dHIsCiAgICAgICAgICAgICAgbG9va3VwOiBNRU1GUy5ub2RlX29wcy5sb29rdXAsCiAgICAgICAgICAgICAgbWtub2Q6IE1FTUZTLm5vZGVfb3BzLm1rbm9kLAogICAgICAgICAgICAgIHJlbmFtZTogTUVNRlMubm9kZV9vcHMucmVuYW1lLAogICAgICAgICAgICAgIHVubGluazogTUVNRlMubm9kZV9vcHMudW5saW5rLAogICAgICAgICAgICAgIHJtZGlyOiBNRU1GUy5ub2RlX29wcy5ybWRpciwKICAgICAgICAgICAgICByZWFkZGlyOiBNRU1GUy5ub2RlX29wcy5yZWFkZGlyLAogICAgICAgICAgICAgIHN5bWxpbms6IE1FTUZTLm5vZGVfb3BzLnN5bWxpbmsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3RyZWFtOiB7IGxsc2VlazogTUVNRlMuc3RyZWFtX29wcy5sbHNlZWsgfQogICAgICAgICAgfSwKICAgICAgICAgIGZpbGU6IHsKICAgICAgICAgICAgbm9kZTogeyBnZXRhdHRyOiBNRU1GUy5ub2RlX29wcy5nZXRhdHRyLCBzZXRhdHRyOiBNRU1GUy5ub2RlX29wcy5zZXRhdHRyIH0sCiAgICAgICAgICAgIHN0cmVhbTogewogICAgICAgICAgICAgIGxsc2VlazogTUVNRlMuc3RyZWFtX29wcy5sbHNlZWssCiAgICAgICAgICAgICAgcmVhZDogTUVNRlMuc3RyZWFtX29wcy5yZWFkLAogICAgICAgICAgICAgIHdyaXRlOiBNRU1GUy5zdHJlYW1fb3BzLndyaXRlLAogICAgICAgICAgICAgIGFsbG9jYXRlOiBNRU1GUy5zdHJlYW1fb3BzLmFsbG9jYXRlLAogICAgICAgICAgICAgIG1tYXA6IE1FTUZTLnN0cmVhbV9vcHMubW1hcCwKICAgICAgICAgICAgICBtc3luYzogTUVNRlMuc3RyZWFtX29wcy5tc3luYwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgbGluazogewogICAgICAgICAgICBub2RlOiB7CiAgICAgICAgICAgICAgZ2V0YXR0cjogTUVNRlMubm9kZV9vcHMuZ2V0YXR0ciwKICAgICAgICAgICAgICBzZXRhdHRyOiBNRU1GUy5ub2RlX29wcy5zZXRhdHRyLAogICAgICAgICAgICAgIHJlYWRsaW5rOiBNRU1GUy5ub2RlX29wcy5yZWFkbGluawogICAgICAgICAgICB9LAogICAgICAgICAgICBzdHJlYW06IHt9CiAgICAgICAgICB9LAogICAgICAgICAgY2hyZGV2OiB7CiAgICAgICAgICAgIG5vZGU6IHsgZ2V0YXR0cjogTUVNRlMubm9kZV9vcHMuZ2V0YXR0ciwgc2V0YXR0cjogTUVNRlMubm9kZV9vcHMuc2V0YXR0ciB9LAogICAgICAgICAgICBzdHJlYW06IEZTLmNocmRldl9zdHJlYW1fb3BzCiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgbm9kZSA9IEZTLmNyZWF0ZU5vZGUocGFyZW50LCBuYW1lLCBtb2RlLCBkZXYpOwogICAgICAgIGlmIChGUy5pc0Rpcihub2RlLm1vZGUpKSB7CiAgICAgICAgICBub2RlLm5vZGVfb3BzID0gTUVNRlMub3BzX3RhYmxlLmRpci5ub2RlOwogICAgICAgICAgbm9kZS5zdHJlYW1fb3BzID0gTUVNRlMub3BzX3RhYmxlLmRpci5zdHJlYW07CiAgICAgICAgICBub2RlLmNvbnRlbnRzID0ge307CiAgICAgICAgfSBlbHNlIGlmIChGUy5pc0ZpbGUobm9kZS5tb2RlKSkgewogICAgICAgICAgbm9kZS5ub2RlX29wcyA9IE1FTUZTLm9wc190YWJsZS5maWxlLm5vZGU7CiAgICAgICAgICBub2RlLnN0cmVhbV9vcHMgPSBNRU1GUy5vcHNfdGFibGUuZmlsZS5zdHJlYW07CiAgICAgICAgICBub2RlLnVzZWRCeXRlcyA9IDA7CiAgICAgICAgICBub2RlLmNvbnRlbnRzID0gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKEZTLmlzTGluayhub2RlLm1vZGUpKSB7CiAgICAgICAgICBub2RlLm5vZGVfb3BzID0gTUVNRlMub3BzX3RhYmxlLmxpbmsubm9kZTsKICAgICAgICAgIG5vZGUuc3RyZWFtX29wcyA9IE1FTUZTLm9wc190YWJsZS5saW5rLnN0cmVhbTsKICAgICAgICB9IGVsc2UgaWYgKEZTLmlzQ2hyZGV2KG5vZGUubW9kZSkpIHsKICAgICAgICAgIG5vZGUubm9kZV9vcHMgPSBNRU1GUy5vcHNfdGFibGUuY2hyZGV2Lm5vZGU7CiAgICAgICAgICBub2RlLnN0cmVhbV9vcHMgPSBNRU1GUy5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbTsKICAgICAgICB9CiAgICAgICAgbm9kZS50aW1lc3RhbXAgPSBEYXRlLm5vdygpOwogICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgIHBhcmVudC5jb250ZW50c1tuYW1lXSA9IG5vZGU7CiAgICAgICAgICBwYXJlbnQudGltZXN0YW1wID0gbm9kZS50aW1lc3RhbXA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub2RlOwogICAgICB9LAogICAgICBnZXRGaWxlRGF0YUFzVHlwZWRBcnJheShub2RlKSB7CiAgICAgICAgaWYgKCFub2RlLmNvbnRlbnRzKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlLmNvbnRlbnRzLnN1YmFycmF5KSB7CiAgICAgICAgICByZXR1cm4gbm9kZS5jb250ZW50cy5zdWJhcnJheSgwLCBub2RlLnVzZWRCeXRlcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShub2RlLmNvbnRlbnRzKTsKICAgICAgfSwKICAgICAgZXhwYW5kRmlsZVN0b3JhZ2Uobm9kZSwgbmV3Q2FwYWNpdHkpIHsKICAgICAgICB2YXIgcHJldkNhcGFjaXR5ID0gbm9kZS5jb250ZW50cyA/IG5vZGUuY29udGVudHMubGVuZ3RoIDogMDsKICAgICAgICBpZiAocHJldkNhcGFjaXR5ID49IG5ld0NhcGFjaXR5KSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBDQVBBQ0lUWV9ET1VCTElOR19NQVggPSAxMDI0ICogMTAyNDsKICAgICAgICBuZXdDYXBhY2l0eSA9IE1hdGgubWF4KG5ld0NhcGFjaXR5LCAocHJldkNhcGFjaXR5ICogKHByZXZDYXBhY2l0eSA8IENBUEFDSVRZX0RPVUJMSU5HX01BWCA/IDIgOiAxLjEyNSkpID4+PiAwKTsKICAgICAgICBpZiAocHJldkNhcGFjaXR5ICE9IDApIHsKICAgICAgICAgIG5ld0NhcGFjaXR5ID0gTWF0aC5tYXgobmV3Q2FwYWNpdHksIDI1Nik7CiAgICAgICAgfQogICAgICAgIHZhciBvbGRDb250ZW50cyA9IG5vZGUuY29udGVudHM7CiAgICAgICAgbm9kZS5jb250ZW50cyA9IG5ldyBVaW50OEFycmF5KG5ld0NhcGFjaXR5KTsKICAgICAgICBpZiAobm9kZS51c2VkQnl0ZXMgPiAwKSB7CiAgICAgICAgICBub2RlLmNvbnRlbnRzLnNldChvbGRDb250ZW50cy5zdWJhcnJheSgwLCBub2RlLnVzZWRCeXRlcyksIDApOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmVzaXplRmlsZVN0b3JhZ2Uobm9kZSwgbmV3U2l6ZSkgewogICAgICAgIGlmIChub2RlLnVzZWRCeXRlcyA9PSBuZXdTaXplKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChuZXdTaXplID09IDApIHsKICAgICAgICAgIG5vZGUuY29udGVudHMgPSBudWxsOwogICAgICAgICAgbm9kZS51c2VkQnl0ZXMgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgb2xkQ29udGVudHMgPSBub2RlLmNvbnRlbnRzOwogICAgICAgICAgbm9kZS5jb250ZW50cyA9IG5ldyBVaW50OEFycmF5KG5ld1NpemUpOwogICAgICAgICAgaWYgKG9sZENvbnRlbnRzKSB7CiAgICAgICAgICAgIG5vZGUuY29udGVudHMuc2V0KG9sZENvbnRlbnRzLnN1YmFycmF5KDAsIE1hdGgubWluKG5ld1NpemUsIG5vZGUudXNlZEJ5dGVzKSkpOwogICAgICAgICAgfQogICAgICAgICAgbm9kZS51c2VkQnl0ZXMgPSBuZXdTaXplOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbm9kZV9vcHM6IHsKICAgICAgICBnZXRhdHRyKG5vZGUpIHsKICAgICAgICAgIHZhciBhdHRyID0ge307CiAgICAgICAgICBhdHRyLmRldiA9IEZTLmlzQ2hyZGV2KG5vZGUubW9kZSkgPyBub2RlLmlkIDogMTsKICAgICAgICAgIGF0dHIuaW5vID0gbm9kZS5pZDsKICAgICAgICAgIGF0dHIubW9kZSA9IG5vZGUubW9kZTsKICAgICAgICAgIGF0dHIubmxpbmsgPSAxOwogICAgICAgICAgYXR0ci51aWQgPSAwOwogICAgICAgICAgYXR0ci5naWQgPSAwOwogICAgICAgICAgYXR0ci5yZGV2ID0gbm9kZS5yZGV2OwogICAgICAgICAgaWYgKEZTLmlzRGlyKG5vZGUubW9kZSkpIHsKICAgICAgICAgICAgYXR0ci5zaXplID0gNDA5NjsKICAgICAgICAgIH0gZWxzZSBpZiAoRlMuaXNGaWxlKG5vZGUubW9kZSkpIHsKICAgICAgICAgICAgYXR0ci5zaXplID0gbm9kZS51c2VkQnl0ZXM7CiAgICAgICAgICB9IGVsc2UgaWYgKEZTLmlzTGluayhub2RlLm1vZGUpKSB7CiAgICAgICAgICAgIGF0dHIuc2l6ZSA9IG5vZGUubGluay5sZW5ndGg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhdHRyLnNpemUgPSAwOwogICAgICAgICAgfQogICAgICAgICAgYXR0ci5hdGltZSA9IG5ldyBEYXRlKG5vZGUudGltZXN0YW1wKTsKICAgICAgICAgIGF0dHIubXRpbWUgPSBuZXcgRGF0ZShub2RlLnRpbWVzdGFtcCk7CiAgICAgICAgICBhdHRyLmN0aW1lID0gbmV3IERhdGUobm9kZS50aW1lc3RhbXApOwogICAgICAgICAgYXR0ci5ibGtzaXplID0gNDA5NjsKICAgICAgICAgIGF0dHIuYmxvY2tzID0gTWF0aC5jZWlsKGF0dHIuc2l6ZSAvIGF0dHIuYmxrc2l6ZSk7CiAgICAgICAgICByZXR1cm4gYXR0cjsKICAgICAgICB9LAogICAgICAgIHNldGF0dHIobm9kZSwgYXR0cikgewogICAgICAgICAgaWYgKGF0dHIubW9kZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5vZGUubW9kZSA9IGF0dHIubW9kZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhdHRyLnRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5vZGUudGltZXN0YW1wID0gYXR0ci50aW1lc3RhbXA7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYXR0ci5zaXplICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgTUVNRlMucmVzaXplRmlsZVN0b3JhZ2Uobm9kZSwgYXR0ci5zaXplKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGxvb2t1cChwYXJlbnQsIG5hbWUpIHsKICAgICAgICAgIHRocm93IEZTLmdlbmVyaWNFcnJvcnNbNDRdOwogICAgICAgIH0sCiAgICAgICAgbWtub2QocGFyZW50LCBuYW1lLCBtb2RlLCBkZXYpIHsKICAgICAgICAgIHJldHVybiBNRU1GUy5jcmVhdGVOb2RlKHBhcmVudCwgbmFtZSwgbW9kZSwgZGV2KTsKICAgICAgICB9LAogICAgICAgIHJlbmFtZShvbGRfbm9kZSwgbmV3X2RpciwgbmV3X25hbWUpIHsKICAgICAgICAgIGlmIChGUy5pc0RpcihvbGRfbm9kZS5tb2RlKSkgewogICAgICAgICAgICB2YXIgbmV3X25vZGU7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgbmV3X25vZGUgPSBGUy5sb29rdXBOb2RlKG5ld19kaXIsIG5ld19uYW1lKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICAgICAgaWYgKG5ld19ub2RlKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBuZXdfbm9kZS5jb250ZW50cykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZGVsZXRlIG9sZF9ub2RlLnBhcmVudC5jb250ZW50c1tvbGRfbm9kZS5uYW1lXTsKICAgICAgICAgIG9sZF9ub2RlLnBhcmVudC50aW1lc3RhbXAgPSBEYXRlLm5vdygpOwogICAgICAgICAgb2xkX25vZGUubmFtZSA9IG5ld19uYW1lOwogICAgICAgICAgbmV3X2Rpci5jb250ZW50c1tuZXdfbmFtZV0gPSBvbGRfbm9kZTsKICAgICAgICAgIG5ld19kaXIudGltZXN0YW1wID0gb2xkX25vZGUucGFyZW50LnRpbWVzdGFtcDsKICAgICAgICAgIG9sZF9ub2RlLnBhcmVudCA9IG5ld19kaXI7CiAgICAgICAgfSwKICAgICAgICB1bmxpbmsocGFyZW50LCBuYW1lKSB7CiAgICAgICAgICBkZWxldGUgcGFyZW50LmNvbnRlbnRzW25hbWVdOwogICAgICAgICAgcGFyZW50LnRpbWVzdGFtcCA9IERhdGUubm93KCk7CiAgICAgICAgfSwKICAgICAgICBybWRpcihwYXJlbnQsIG5hbWUpIHsKICAgICAgICAgIHZhciBub2RlID0gRlMubG9va3VwTm9kZShwYXJlbnQsIG5hbWUpOwogICAgICAgICAgZm9yICh2YXIgaSBpbiBub2RlLmNvbnRlbnRzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDU1KTsKICAgICAgICAgIH0KICAgICAgICAgIGRlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV07CiAgICAgICAgICBwYXJlbnQudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgICAgICB9LAogICAgICAgIHJlYWRkaXIobm9kZSkgewogICAgICAgICAgdmFyIGVudHJpZXMgPSBbJy4nLCAnLi4nXTsKICAgICAgICAgIGZvciAodmFyIGtleSBvZiBPYmplY3Qua2V5cyhub2RlLmNvbnRlbnRzKSkgewogICAgICAgICAgICBlbnRyaWVzLnB1c2goa2V5KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBlbnRyaWVzOwogICAgICAgIH0sCiAgICAgICAgc3ltbGluayhwYXJlbnQsIG5ld25hbWUsIG9sZHBhdGgpIHsKICAgICAgICAgIHZhciBub2RlID0gTUVNRlMuY3JlYXRlTm9kZShwYXJlbnQsIG5ld25hbWUsIDUxMSB8IDQwOTYwLCAwKTsKICAgICAgICAgIG5vZGUubGluayA9IG9sZHBhdGg7CiAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICB9LAogICAgICAgIHJlYWRsaW5rKG5vZGUpIHsKICAgICAgICAgIGlmICghRlMuaXNMaW5rKG5vZGUubW9kZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5vZGUubGluazsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHN0cmVhbV9vcHM6IHsKICAgICAgICByZWFkKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pIHsKICAgICAgICAgIHZhciBjb250ZW50cyA9IHN0cmVhbS5ub2RlLmNvbnRlbnRzOwogICAgICAgICAgaWYgKHBvc2l0aW9uID49IHN0cmVhbS5ub2RlLnVzZWRCeXRlcykgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBzaXplID0gTWF0aC5taW4oc3RyZWFtLm5vZGUudXNlZEJ5dGVzIC0gcG9zaXRpb24sIGxlbmd0aCk7CiAgICAgICAgICBpZiAoc2l6ZSA+IDggJiYgY29udGVudHMuc3ViYXJyYXkpIHsKICAgICAgICAgICAgYnVmZmVyLnNldChjb250ZW50cy5zdWJhcnJheShwb3NpdGlvbiwgcG9zaXRpb24gKyBzaXplKSwgb2Zmc2V0KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCArIGldID0gY29udGVudHNbcG9zaXRpb24gKyBpXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHNpemU7CiAgICAgICAgfSwKICAgICAgICB3cml0ZShzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYW5Pd24pIHsKICAgICAgICAgIGlmIChidWZmZXIuYnVmZmVyID09PSBIRUFQOC5idWZmZXIpIHsKICAgICAgICAgICAgY2FuT3duID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBub2RlID0gc3RyZWFtLm5vZGU7CiAgICAgICAgICBub2RlLnRpbWVzdGFtcCA9IERhdGUubm93KCk7CiAgICAgICAgICBpZiAoYnVmZmVyLnN1YmFycmF5ICYmICghbm9kZS5jb250ZW50cyB8fCBub2RlLmNvbnRlbnRzLnN1YmFycmF5KSkgewogICAgICAgICAgICBpZiAoY2FuT3duKSB7CiAgICAgICAgICAgICAgbm9kZS5jb250ZW50cyA9IGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7CiAgICAgICAgICAgICAgbm9kZS51c2VkQnl0ZXMgPSBsZW5ndGg7CiAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLnVzZWRCeXRlcyA9PT0gMCAmJiBwb3NpdGlvbiA9PT0gMCkgewogICAgICAgICAgICAgIG5vZGUuY29udGVudHMgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwogICAgICAgICAgICAgIG5vZGUudXNlZEJ5dGVzID0gbGVuZ3RoOwogICAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gKyBsZW5ndGggPD0gbm9kZS51c2VkQnl0ZXMpIHsKICAgICAgICAgICAgICBub2RlLmNvbnRlbnRzLnNldChidWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpLCBwb3NpdGlvbik7CiAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgTUVNRlMuZXhwYW5kRmlsZVN0b3JhZ2Uobm9kZSwgcG9zaXRpb24gKyBsZW5ndGgpOwogICAgICAgICAgaWYgKG5vZGUuY29udGVudHMuc3ViYXJyYXkgJiYgYnVmZmVyLnN1YmFycmF5KSB7CiAgICAgICAgICAgIG5vZGUuY29udGVudHMuc2V0KGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCksIHBvc2l0aW9uKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBub2RlLmNvbnRlbnRzW3Bvc2l0aW9uICsgaV0gPSBidWZmZXJbb2Zmc2V0ICsgaV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG5vZGUudXNlZEJ5dGVzID0gTWF0aC5tYXgobm9kZS51c2VkQnl0ZXMsIHBvc2l0aW9uICsgbGVuZ3RoKTsKICAgICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgICAgfSwKICAgICAgICBsbHNlZWsoc3RyZWFtLCBvZmZzZXQsIHdoZW5jZSkgewogICAgICAgICAgdmFyIHBvc2l0aW9uID0gb2Zmc2V0OwogICAgICAgICAgaWYgKHdoZW5jZSA9PT0gMSkgewogICAgICAgICAgICBwb3NpdGlvbiArPSBzdHJlYW0ucG9zaXRpb247CiAgICAgICAgICB9IGVsc2UgaWYgKHdoZW5jZSA9PT0gMikgewogICAgICAgICAgICBpZiAoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKSB7CiAgICAgICAgICAgICAgcG9zaXRpb24gKz0gc3RyZWFtLm5vZGUudXNlZEJ5dGVzOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICB9LAogICAgICAgIGFsbG9jYXRlKHN0cmVhbSwgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgICAgIE1FTUZTLmV4cGFuZEZpbGVTdG9yYWdlKHN0cmVhbS5ub2RlLCBvZmZzZXQgKyBsZW5ndGgpOwogICAgICAgICAgc3RyZWFtLm5vZGUudXNlZEJ5dGVzID0gTWF0aC5tYXgoc3RyZWFtLm5vZGUudXNlZEJ5dGVzLCBvZmZzZXQgKyBsZW5ndGgpOwogICAgICAgIH0sCiAgICAgICAgbW1hcChzdHJlYW0sIGxlbmd0aCwgcG9zaXRpb24sIHByb3QsIGZsYWdzKSB7CiAgICAgICAgICBpZiAoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0Myk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcHRyOwogICAgICAgICAgdmFyIGFsbG9jYXRlZDsKICAgICAgICAgIHZhciBjb250ZW50cyA9IHN0cmVhbS5ub2RlLmNvbnRlbnRzOwogICAgICAgICAgaWYgKCEoZmxhZ3MgJiAyKSAmJiBjb250ZW50cy5idWZmZXIgPT09IEhFQVA4LmJ1ZmZlcikgewogICAgICAgICAgICBhbGxvY2F0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgcHRyID0gY29udGVudHMuYnl0ZU9mZnNldDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+IDAgfHwgcG9zaXRpb24gKyBsZW5ndGggPCBjb250ZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgICBpZiAoY29udGVudHMuc3ViYXJyYXkpIHsKICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gY29udGVudHMuc3ViYXJyYXkocG9zaXRpb24sIHBvc2l0aW9uICsgbGVuZ3RoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29udGVudHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjb250ZW50cywgcG9zaXRpb24sIHBvc2l0aW9uICsgbGVuZ3RoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWxsb2NhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgcHRyID0gbW1hcEFsbG9jKGxlbmd0aCk7CiAgICAgICAgICAgIGlmICghcHRyKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEhFQVA4LnNldChjb250ZW50cywgcHRyKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB7IHB0cjogcHRyLCBhbGxvY2F0ZWQ6IGFsbG9jYXRlZCB9OwogICAgICAgIH0sCiAgICAgICAgbXN5bmMoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBtbWFwRmxhZ3MpIHsKICAgICAgICAgIE1FTUZTLnN0cmVhbV9vcHMud3JpdGUoc3RyZWFtLCBidWZmZXIsIDAsIGxlbmd0aCwgb2Zmc2V0LCBmYWxzZSk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICB2YXIgYXN5bmNMb2FkID0gKHVybCwgb25sb2FkLCBvbmVycm9yLCBub1J1bkRlcCkgPT4gewogICAgICB2YXIgZGVwID0gIW5vUnVuRGVwID8gZ2V0VW5pcXVlUnVuRGVwZW5kZW5jeShgYWwgJHt1cmx9YCkgOiAnJzsKICAgICAgcmVhZEFzeW5jKAogICAgICAgIHVybCwKICAgICAgICAoYXJyYXlCdWZmZXIpID0+IHsKICAgICAgICAgIG9ubG9hZChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpOwogICAgICAgICAgaWYgKGRlcCkgewogICAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KGRlcCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAoZXZlbnQpID0+IHsKICAgICAgICAgIGlmIChvbmVycm9yKSB7CiAgICAgICAgICAgIG9uZXJyb3IoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IGBMb2FkaW5nIGRhdGEgZmlsZSAiJHt1cmx9IiBmYWlsZWQuYDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICk7CiAgICAgIGlmIChkZXApIHsKICAgICAgICBhZGRSdW5EZXBlbmRlbmN5KGRlcCk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgRlNfY3JlYXRlRGF0YUZpbGUgPSAocGFyZW50LCBuYW1lLCBmaWxlRGF0YSwgY2FuUmVhZCwgY2FuV3JpdGUsIGNhbk93bikgPT4gewogICAgICBGUy5jcmVhdGVEYXRhRmlsZShwYXJlbnQsIG5hbWUsIGZpbGVEYXRhLCBjYW5SZWFkLCBjYW5Xcml0ZSwgY2FuT3duKTsKICAgIH07CiAgICB2YXIgcHJlbG9hZFBsdWdpbnMgPSBNb2R1bGVbJ3ByZWxvYWRQbHVnaW5zJ10gfHwgW107CiAgICB2YXIgRlNfaGFuZGxlZEJ5UHJlbG9hZFBsdWdpbiA9IChieXRlQXJyYXksIGZ1bGxuYW1lLCBmaW5pc2gsIG9uZXJyb3IpID0+IHsKICAgICAgaWYgKHR5cGVvZiBCcm93c2VyICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgQnJvd3Nlci5pbml0KCk7CiAgICAgIH0KICAgICAgdmFyIGhhbmRsZWQgPSBmYWxzZTsKICAgICAgcHJlbG9hZFBsdWdpbnMuZm9yRWFjaCgocGx1Z2luKSA9PiB7CiAgICAgICAgaWYgKGhhbmRsZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHBsdWdpblsnY2FuSGFuZGxlJ10oZnVsbG5hbWUpKSB7CiAgICAgICAgICBwbHVnaW5bJ2hhbmRsZSddKGJ5dGVBcnJheSwgZnVsbG5hbWUsIGZpbmlzaCwgb25lcnJvcik7CiAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gaGFuZGxlZDsKICAgIH07CiAgICB2YXIgRlNfY3JlYXRlUHJlbG9hZGVkRmlsZSA9ICgKICAgICAgcGFyZW50LAogICAgICBuYW1lLAogICAgICB1cmwsCiAgICAgIGNhblJlYWQsCiAgICAgIGNhbldyaXRlLAogICAgICBvbmxvYWQsCiAgICAgIG9uZXJyb3IsCiAgICAgIGRvbnRDcmVhdGVGaWxlLAogICAgICBjYW5Pd24sCiAgICAgIHByZUZpbmlzaAogICAgKSA9PiB7CiAgICAgIHZhciBmdWxsbmFtZSA9IG5hbWUgPyBQQVRIX0ZTLnJlc29sdmUoUEFUSC5qb2luMihwYXJlbnQsIG5hbWUpKSA6IHBhcmVudDsKICAgICAgdmFyIGRlcCA9IGdldFVuaXF1ZVJ1bkRlcGVuZGVuY3koYGNwICR7ZnVsbG5hbWV9YCk7CiAgICAgIGZ1bmN0aW9uIHByb2Nlc3NEYXRhKGJ5dGVBcnJheSkgewogICAgICAgIGZ1bmN0aW9uIGZpbmlzaChieXRlQXJyYXkpIHsKICAgICAgICAgIHByZUZpbmlzaD8uKCk7CiAgICAgICAgICBpZiAoIWRvbnRDcmVhdGVGaWxlKSB7CiAgICAgICAgICAgIEZTX2NyZWF0ZURhdGFGaWxlKHBhcmVudCwgbmFtZSwgYnl0ZUFycmF5LCBjYW5SZWFkLCBjYW5Xcml0ZSwgY2FuT3duKTsKICAgICAgICAgIH0KICAgICAgICAgIG9ubG9hZD8uKCk7CiAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KGRlcCk7CiAgICAgICAgfQogICAgICAgIGlmICgKICAgICAgICAgIEZTX2hhbmRsZWRCeVByZWxvYWRQbHVnaW4oYnl0ZUFycmF5LCBmdWxsbmFtZSwgZmluaXNoLCAoKSA9PiB7CiAgICAgICAgICAgIG9uZXJyb3I/LigpOwogICAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KGRlcCk7CiAgICAgICAgICB9KQogICAgICAgICkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmaW5pc2goYnl0ZUFycmF5KTsKICAgICAgfQogICAgICBhZGRSdW5EZXBlbmRlbmN5KGRlcCk7CiAgICAgIGlmICh0eXBlb2YgdXJsID09ICdzdHJpbmcnKSB7CiAgICAgICAgYXN5bmNMb2FkKHVybCwgcHJvY2Vzc0RhdGEsIG9uZXJyb3IpOwogICAgICB9IGVsc2UgewogICAgICAgIHByb2Nlc3NEYXRhKHVybCk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgRlNfbW9kZVN0cmluZ1RvRmxhZ3MgPSAoc3RyKSA9PiB7CiAgICAgIHZhciBmbGFnTW9kZXMgPSB7IHI6IDAsICdyKyc6IDIsIHc6IDUxMiB8IDY0IHwgMSwgJ3crJzogNTEyIHwgNjQgfCAyLCBhOiAxMDI0IHwgNjQgfCAxLCAnYSsnOiAxMDI0IHwgNjQgfCAyIH07CiAgICAgIHZhciBmbGFncyA9IGZsYWdNb2Rlc1tzdHJdOwogICAgICBpZiAodHlwZW9mIGZsYWdzID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAke3N0cn1gKTsKICAgICAgfQogICAgICByZXR1cm4gZmxhZ3M7CiAgICB9OwogICAgdmFyIEZTX2dldE1vZGUgPSAoY2FuUmVhZCwgY2FuV3JpdGUpID0+IHsKICAgICAgdmFyIG1vZGUgPSAwOwogICAgICBpZiAoY2FuUmVhZCkgewogICAgICAgIG1vZGUgfD0gMjkyIHwgNzM7CiAgICAgIH0KICAgICAgaWYgKGNhbldyaXRlKSB7CiAgICAgICAgbW9kZSB8PSAxNDY7CiAgICAgIH0KICAgICAgcmV0dXJuIG1vZGU7CiAgICB9OwogICAgdmFyIEZTID0gewogICAgICByb290OiBudWxsLAogICAgICBtb3VudHM6IFtdLAogICAgICBkZXZpY2VzOiB7fSwKICAgICAgc3RyZWFtczogW10sCiAgICAgIG5leHRJbm9kZTogMSwKICAgICAgbmFtZVRhYmxlOiBudWxsLAogICAgICBjdXJyZW50UGF0aDogJy8nLAogICAgICBpbml0aWFsaXplZDogZmFsc2UsCiAgICAgIGlnbm9yZVBlcm1pc3Npb25zOiB0cnVlLAogICAgICBFcnJub0Vycm9yOiBjbGFzcyB7CiAgICAgICAgY29uc3RydWN0b3IoZXJybm8pIHsKICAgICAgICAgIHRoaXMubmFtZSA9ICdFcnJub0Vycm9yJzsKICAgICAgICAgIHRoaXMuZXJybm8gPSBlcnJubzsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGdlbmVyaWNFcnJvcnM6IHt9LAogICAgICBmaWxlc3lzdGVtczogbnVsbCwKICAgICAgc3luY0ZTUmVxdWVzdHM6IDAsCiAgICAgIGxvb2t1cFBhdGgocGF0aCwgb3B0cyA9IHt9KSB7CiAgICAgICAgcGF0aCA9IFBBVEhfRlMucmVzb2x2ZShwYXRoKTsKICAgICAgICBpZiAoIXBhdGgpIHsKICAgICAgICAgIHJldHVybiB7IHBhdGg6ICcnLCBub2RlOiBudWxsIH07CiAgICAgICAgfQogICAgICAgIHZhciBkZWZhdWx0cyA9IHsgZm9sbG93X21vdW50OiB0cnVlLCByZWN1cnNlX2NvdW50OiAwIH07CiAgICAgICAgb3B0cyA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdHMsIG9wdHMpOwogICAgICAgIGlmIChvcHRzLnJlY3Vyc2VfY291bnQgPiA4KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigzMik7CiAgICAgICAgfQogICAgICAgIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKS5maWx0ZXIoKHApID0+ICEhcCk7CiAgICAgICAgdmFyIGN1cnJlbnQgPSBGUy5yb290OwogICAgICAgIHZhciBjdXJyZW50X3BhdGggPSAnLyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGlzbGFzdCA9IGkgPT09IHBhcnRzLmxlbmd0aCAtIDE7CiAgICAgICAgICBpZiAoaXNsYXN0ICYmIG9wdHMucGFyZW50KSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudCA9IEZTLmxvb2t1cE5vZGUoY3VycmVudCwgcGFydHNbaV0pOwogICAgICAgICAgY3VycmVudF9wYXRoID0gUEFUSC5qb2luMihjdXJyZW50X3BhdGgsIHBhcnRzW2ldKTsKICAgICAgICAgIGlmIChGUy5pc01vdW50cG9pbnQoY3VycmVudCkpIHsKICAgICAgICAgICAgaWYgKCFpc2xhc3QgfHwgKGlzbGFzdCAmJiBvcHRzLmZvbGxvd19tb3VudCkpIHsKICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5tb3VudGVkLnJvb3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICghaXNsYXN0IHx8IG9wdHMuZm9sbG93KSB7CiAgICAgICAgICAgIHZhciBjb3VudCA9IDA7CiAgICAgICAgICAgIHdoaWxlIChGUy5pc0xpbmsoY3VycmVudC5tb2RlKSkgewogICAgICAgICAgICAgIHZhciBsaW5rID0gRlMucmVhZGxpbmsoY3VycmVudF9wYXRoKTsKICAgICAgICAgICAgICBjdXJyZW50X3BhdGggPSBQQVRIX0ZTLnJlc29sdmUoUEFUSC5kaXJuYW1lKGN1cnJlbnRfcGF0aCksIGxpbmspOwogICAgICAgICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKGN1cnJlbnRfcGF0aCwgeyByZWN1cnNlX2NvdW50OiBvcHRzLnJlY3Vyc2VfY291bnQgKyAxIH0pOwogICAgICAgICAgICAgIGN1cnJlbnQgPSBsb29rdXAubm9kZTsKICAgICAgICAgICAgICBpZiAoY291bnQrKyA+IDQwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigzMik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHBhdGg6IGN1cnJlbnRfcGF0aCwgbm9kZTogY3VycmVudCB9OwogICAgICB9LAogICAgICBnZXRQYXRoKG5vZGUpIHsKICAgICAgICB2YXIgcGF0aDsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgaWYgKEZTLmlzUm9vdChub2RlKSkgewogICAgICAgICAgICB2YXIgbW91bnQgPSBub2RlLm1vdW50Lm1vdW50cG9pbnQ7CiAgICAgICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgICAgIHJldHVybiBtb3VudDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbW91bnRbbW91bnQubGVuZ3RoIC0gMV0gIT09ICcvJyA/IGAke21vdW50fS8ke3BhdGh9YCA6IG1vdW50ICsgcGF0aDsKICAgICAgICAgIH0KICAgICAgICAgIHBhdGggPSBwYXRoID8gYCR7bm9kZS5uYW1lfS8ke3BhdGh9YCA6IG5vZGUubmFtZTsKICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGhhc2hOYW1lKHBhcmVudGlkLCBuYW1lKSB7CiAgICAgICAgdmFyIGhhc2ggPSAwOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2ggKyBuYW1lLmNoYXJDb2RlQXQoaSkpIHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgocGFyZW50aWQgKyBoYXNoKSA+Pj4gMCkgJSBGUy5uYW1lVGFibGUubGVuZ3RoOwogICAgICB9LAogICAgICBoYXNoQWRkTm9kZShub2RlKSB7CiAgICAgICAgdmFyIGhhc2ggPSBGUy5oYXNoTmFtZShub2RlLnBhcmVudC5pZCwgbm9kZS5uYW1lKTsKICAgICAgICBub2RlLm5hbWVfbmV4dCA9IEZTLm5hbWVUYWJsZVtoYXNoXTsKICAgICAgICBGUy5uYW1lVGFibGVbaGFzaF0gPSBub2RlOwogICAgICB9LAogICAgICBoYXNoUmVtb3ZlTm9kZShub2RlKSB7CiAgICAgICAgdmFyIGhhc2ggPSBGUy5oYXNoTmFtZShub2RlLnBhcmVudC5pZCwgbm9kZS5uYW1lKTsKICAgICAgICBpZiAoRlMubmFtZVRhYmxlW2hhc2hdID09PSBub2RlKSB7CiAgICAgICAgICBGUy5uYW1lVGFibGVbaGFzaF0gPSBub2RlLm5hbWVfbmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGN1cnJlbnQgPSBGUy5uYW1lVGFibGVbaGFzaF07CiAgICAgICAgICB3aGlsZSAoY3VycmVudCkgewogICAgICAgICAgICBpZiAoY3VycmVudC5uYW1lX25leHQgPT09IG5vZGUpIHsKICAgICAgICAgICAgICBjdXJyZW50Lm5hbWVfbmV4dCA9IG5vZGUubmFtZV9uZXh0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5hbWVfbmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGxvb2t1cE5vZGUocGFyZW50LCBuYW1lKSB7CiAgICAgICAgdmFyIGVyckNvZGUgPSBGUy5tYXlMb29rdXAocGFyZW50KTsKICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSk7CiAgICAgICAgfQogICAgICAgIHZhciBoYXNoID0gRlMuaGFzaE5hbWUocGFyZW50LmlkLCBuYW1lKTsKICAgICAgICBmb3IgKHZhciBub2RlID0gRlMubmFtZVRhYmxlW2hhc2hdOyBub2RlOyBub2RlID0gbm9kZS5uYW1lX25leHQpIHsKICAgICAgICAgIHZhciBub2RlTmFtZSA9IG5vZGUubmFtZTsKICAgICAgICAgIGlmIChub2RlLnBhcmVudC5pZCA9PT0gcGFyZW50LmlkICYmIG5vZGVOYW1lID09PSBuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gRlMubG9va3VwKHBhcmVudCwgbmFtZSk7CiAgICAgIH0sCiAgICAgIGNyZWF0ZU5vZGUocGFyZW50LCBuYW1lLCBtb2RlLCByZGV2KSB7CiAgICAgICAgdmFyIG5vZGUgPSBuZXcgRlMuRlNOb2RlKHBhcmVudCwgbmFtZSwgbW9kZSwgcmRldik7CiAgICAgICAgRlMuaGFzaEFkZE5vZGUobm9kZSk7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0sCiAgICAgIGRlc3Ryb3lOb2RlKG5vZGUpIHsKICAgICAgICBGUy5oYXNoUmVtb3ZlTm9kZShub2RlKTsKICAgICAgfSwKICAgICAgaXNSb290KG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZSA9PT0gbm9kZS5wYXJlbnQ7CiAgICAgIH0sCiAgICAgIGlzTW91bnRwb2ludChub2RlKSB7CiAgICAgICAgcmV0dXJuICEhbm9kZS5tb3VudGVkOwogICAgICB9LAogICAgICBpc0ZpbGUobW9kZSkgewogICAgICAgIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gMzI3Njg7CiAgICAgIH0sCiAgICAgIGlzRGlyKG1vZGUpIHsKICAgICAgICByZXR1cm4gKG1vZGUgJiA2MTQ0MCkgPT09IDE2Mzg0OwogICAgICB9LAogICAgICBpc0xpbmsobW9kZSkgewogICAgICAgIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gNDA5NjA7CiAgICAgIH0sCiAgICAgIGlzQ2hyZGV2KG1vZGUpIHsKICAgICAgICByZXR1cm4gKG1vZGUgJiA2MTQ0MCkgPT09IDgxOTI7CiAgICAgIH0sCiAgICAgIGlzQmxrZGV2KG1vZGUpIHsKICAgICAgICByZXR1cm4gKG1vZGUgJiA2MTQ0MCkgPT09IDI0NTc2OwogICAgICB9LAogICAgICBpc0ZJRk8obW9kZSkgewogICAgICAgIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gNDA5NjsKICAgICAgfSwKICAgICAgaXNTb2NrZXQobW9kZSkgewogICAgICAgIHJldHVybiAobW9kZSAmIDQ5MTUyKSA9PT0gNDkxNTI7CiAgICAgIH0sCiAgICAgIGZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKGZsYWcpIHsKICAgICAgICB2YXIgcGVybXMgPSBbJ3InLCAndycsICdydyddW2ZsYWcgJiAzXTsKICAgICAgICBpZiAoZmxhZyAmIDUxMikgewogICAgICAgICAgcGVybXMgKz0gJ3cnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGVybXM7CiAgICAgIH0sCiAgICAgIG5vZGVQZXJtaXNzaW9ucyhub2RlLCBwZXJtcykgewogICAgICAgIGlmIChGUy5pZ25vcmVQZXJtaXNzaW9ucykgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmIChwZXJtcy5pbmNsdWRlcygncicpICYmICEobm9kZS5tb2RlICYgMjkyKSkgewogICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfSBlbHNlIGlmIChwZXJtcy5pbmNsdWRlcygndycpICYmICEobm9kZS5tb2RlICYgMTQ2KSkgewogICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfSBlbHNlIGlmIChwZXJtcy5pbmNsdWRlcygneCcpICYmICEobm9kZS5tb2RlICYgNzMpKSB7CiAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0sCiAgICAgIG1heUxvb2t1cChkaXIpIHsKICAgICAgICBpZiAoIUZTLmlzRGlyKGRpci5tb2RlKSkgewogICAgICAgICAgcmV0dXJuIDU0OwogICAgICAgIH0KICAgICAgICB2YXIgZXJyQ29kZSA9IEZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsICd4Jyk7CiAgICAgICAgaWYgKGVyckNvZGUpIHsKICAgICAgICAgIHJldHVybiBlcnJDb2RlOwogICAgICAgIH0KICAgICAgICBpZiAoIWRpci5ub2RlX29wcy5sb29rdXApIHsKICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgICAgfSwKICAgICAgbWF5Q3JlYXRlKGRpciwgbmFtZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgbm9kZSA9IEZTLmxvb2t1cE5vZGUoZGlyLCBuYW1lKTsKICAgICAgICAgIHJldHVybiAyMDsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIHJldHVybiBGUy5ub2RlUGVybWlzc2lvbnMoZGlyLCAnd3gnKTsKICAgICAgfSwKICAgICAgbWF5RGVsZXRlKGRpciwgbmFtZSwgaXNkaXIpIHsKICAgICAgICB2YXIgbm9kZTsKICAgICAgICB0cnkgewogICAgICAgICAgbm9kZSA9IEZTLmxvb2t1cE5vZGUoZGlyLCBuYW1lKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICByZXR1cm4gZS5lcnJubzsKICAgICAgICB9CiAgICAgICAgdmFyIGVyckNvZGUgPSBGUy5ub2RlUGVybWlzc2lvbnMoZGlyLCAnd3gnKTsKICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgcmV0dXJuIGVyckNvZGU7CiAgICAgICAgfQogICAgICAgIGlmIChpc2RpcikgewogICAgICAgICAgaWYgKCFGUy5pc0Rpcihub2RlLm1vZGUpKSB7CiAgICAgICAgICAgIHJldHVybiA1NDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChGUy5pc1Jvb3Qobm9kZSkgfHwgRlMuZ2V0UGF0aChub2RlKSA9PT0gRlMuY3dkKCkpIHsKICAgICAgICAgICAgcmV0dXJuIDEwOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoRlMuaXNEaXIobm9kZS5tb2RlKSkgewogICAgICAgICAgICByZXR1cm4gMzE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgICB9LAogICAgICBtYXlPcGVuKG5vZGUsIGZsYWdzKSB7CiAgICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgICByZXR1cm4gNDQ7CiAgICAgICAgfQogICAgICAgIGlmIChGUy5pc0xpbmsobm9kZS5tb2RlKSkgewogICAgICAgICAgcmV0dXJuIDMyOwogICAgICAgIH0gZWxzZSBpZiAoRlMuaXNEaXIobm9kZS5tb2RlKSkgewogICAgICAgICAgaWYgKEZTLmZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKGZsYWdzKSAhPT0gJ3InIHx8IGZsYWdzICYgNTEyKSB7CiAgICAgICAgICAgIHJldHVybiAzMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIEZTLm5vZGVQZXJtaXNzaW9ucyhub2RlLCBGUy5mbGFnc1RvUGVybWlzc2lvblN0cmluZyhmbGFncykpOwogICAgICB9LAogICAgICBNQVhfT1BFTl9GRFM6IDQwOTYsCiAgICAgIG5leHRmZCgpIHsKICAgICAgICBmb3IgKHZhciBmZCA9IDA7IGZkIDw9IEZTLk1BWF9PUEVOX0ZEUzsgZmQrKykgewogICAgICAgICAgaWYgKCFGUy5zdHJlYW1zW2ZkXSkgewogICAgICAgICAgICByZXR1cm4gZmQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDMzKTsKICAgICAgfSwKICAgICAgZ2V0U3RyZWFtQ2hlY2tlZChmZCkgewogICAgICAgIHZhciBzdHJlYW0gPSBGUy5nZXRTdHJlYW0oZmQpOwogICAgICAgIGlmICghc3RyZWFtKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cmVhbTsKICAgICAgfSwKICAgICAgZ2V0U3RyZWFtOiAoZmQpID0+IEZTLnN0cmVhbXNbZmRdLAogICAgICBjcmVhdGVTdHJlYW0oc3RyZWFtLCBmZCA9IC0xKSB7CiAgICAgICAgaWYgKCFGUy5GU1N0cmVhbSkgewogICAgICAgICAgRlMuRlNTdHJlYW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuc2hhcmVkID0ge307CiAgICAgICAgICB9OwogICAgICAgICAgRlMuRlNTdHJlYW0ucHJvdG90eXBlID0ge307CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGUy5GU1N0cmVhbS5wcm90b3R5cGUsIHsKICAgICAgICAgICAgb2JqZWN0OiB7CiAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZTsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHNldCh2YWwpIHsKICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHZhbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGlzUmVhZDogewogICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5mbGFncyAmIDIwOTcxNTUpICE9PSAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgaXNXcml0ZTogewogICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5mbGFncyAmIDIwOTcxNTUpICE9PSAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgaXNBcHBlbmQ6IHsKICAgICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mbGFncyAmIDEwMjQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmbGFnczogewogICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYXJlZC5mbGFnczsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHNldCh2YWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2hhcmVkLmZsYWdzID0gdmFsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgcG9zaXRpb246IHsKICAgICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaGFyZWQucG9zaXRpb247CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBzZXQodmFsKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNoYXJlZC5wb3NpdGlvbiA9IHZhbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBzdHJlYW0gPSBPYmplY3QuYXNzaWduKG5ldyBGUy5GU1N0cmVhbSgpLCBzdHJlYW0pOwogICAgICAgIGlmIChmZCA9PSAtMSkgewogICAgICAgICAgZmQgPSBGUy5uZXh0ZmQoKTsKICAgICAgICB9CiAgICAgICAgc3RyZWFtLmZkID0gZmQ7CiAgICAgICAgRlMuc3RyZWFtc1tmZF0gPSBzdHJlYW07CiAgICAgICAgcmV0dXJuIHN0cmVhbTsKICAgICAgfSwKICAgICAgY2xvc2VTdHJlYW0oZmQpIHsKICAgICAgICBGUy5zdHJlYW1zW2ZkXSA9IG51bGw7CiAgICAgIH0sCiAgICAgIGNocmRldl9zdHJlYW1fb3BzOiB7CiAgICAgICAgb3BlbihzdHJlYW0pIHsKICAgICAgICAgIHZhciBkZXZpY2UgPSBGUy5nZXREZXZpY2Uoc3RyZWFtLm5vZGUucmRldik7CiAgICAgICAgICBzdHJlYW0uc3RyZWFtX29wcyA9IGRldmljZS5zdHJlYW1fb3BzOwogICAgICAgICAgc3RyZWFtLnN0cmVhbV9vcHMub3Blbj8uKHN0cmVhbSk7CiAgICAgICAgfSwKICAgICAgICBsbHNlZWsoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig3MCk7CiAgICAgICAgfQogICAgICB9LAogICAgICBtYWpvcjogKGRldikgPT4gZGV2ID4+IDgsCiAgICAgIG1pbm9yOiAoZGV2KSA9PiBkZXYgJiAyNTUsCiAgICAgIG1ha2VkZXY6IChtYSwgbWkpID0+IChtYSA8PCA4KSB8IG1pLAogICAgICByZWdpc3RlckRldmljZShkZXYsIG9wcykgewogICAgICAgIEZTLmRldmljZXNbZGV2XSA9IHsgc3RyZWFtX29wczogb3BzIH07CiAgICAgIH0sCiAgICAgIGdldERldmljZTogKGRldikgPT4gRlMuZGV2aWNlc1tkZXZdLAogICAgICBnZXRNb3VudHMobW91bnQpIHsKICAgICAgICB2YXIgbW91bnRzID0gW107CiAgICAgICAgdmFyIGNoZWNrID0gW21vdW50XTsKICAgICAgICB3aGlsZSAoY2hlY2subGVuZ3RoKSB7CiAgICAgICAgICB2YXIgbSA9IGNoZWNrLnBvcCgpOwogICAgICAgICAgbW91bnRzLnB1c2gobSk7CiAgICAgICAgICBjaGVjay5wdXNoLmFwcGx5KGNoZWNrLCBtLm1vdW50cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtb3VudHM7CiAgICAgIH0sCiAgICAgIHN5bmNmcyhwb3B1bGF0ZSwgY2FsbGJhY2spIHsKICAgICAgICBpZiAodHlwZW9mIHBvcHVsYXRlID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGNhbGxiYWNrID0gcG9wdWxhdGU7CiAgICAgICAgICBwb3B1bGF0ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBGUy5zeW5jRlNSZXF1ZXN0cysrOwogICAgICAgIGlmIChGUy5zeW5jRlNSZXF1ZXN0cyA+IDEpIHsKICAgICAgICAgIGVycihgd2FybmluZzogJHtGUy5zeW5jRlNSZXF1ZXN0c30gRlMuc3luY2ZzIG9wZXJhdGlvbnMgaW4gZmxpZ2h0IGF0IG9uY2UsIHByb2JhYmx5IGp1c3QgZG9pbmcgZXh0cmEgd29ya2ApOwogICAgICAgIH0KICAgICAgICB2YXIgbW91bnRzID0gRlMuZ2V0TW91bnRzKEZTLnJvb3QubW91bnQpOwogICAgICAgIHZhciBjb21wbGV0ZWQgPSAwOwogICAgICAgIGZ1bmN0aW9uIGRvQ2FsbGJhY2soZXJyQ29kZSkgewogICAgICAgICAgRlMuc3luY0ZTUmVxdWVzdHMtLTsKICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnJDb2RlKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZG9uZShlcnJDb2RlKSB7CiAgICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgICBpZiAoIWRvbmUuZXJyb3JlZCkgewogICAgICAgICAgICAgIGRvbmUuZXJyb3JlZCA9IHRydWU7CiAgICAgICAgICAgICAgcmV0dXJuIGRvQ2FsbGJhY2soZXJyQ29kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCsrY29tcGxldGVkID49IG1vdW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgZG9DYWxsYmFjayhudWxsKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbW91bnRzLmZvckVhY2goKG1vdW50KSA9PiB7CiAgICAgICAgICBpZiAoIW1vdW50LnR5cGUuc3luY2ZzKSB7CiAgICAgICAgICAgIHJldHVybiBkb25lKG51bGwpOwogICAgICAgICAgfQogICAgICAgICAgbW91bnQudHlwZS5zeW5jZnMobW91bnQsIHBvcHVsYXRlLCBkb25lKTsKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgbW91bnQodHlwZSwgb3B0cywgbW91bnRwb2ludCkgewogICAgICAgIHZhciByb290ID0gbW91bnRwb2ludCA9PT0gJy8nOwogICAgICAgIHZhciBwc2V1ZG8gPSAhbW91bnRwb2ludDsKICAgICAgICB2YXIgbm9kZTsKICAgICAgICBpZiAocm9vdCAmJiBGUy5yb290KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCk7CiAgICAgICAgfSBlbHNlIGlmICghcm9vdCAmJiAhcHNldWRvKSB7CiAgICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChtb3VudHBvaW50LCB7IGZvbGxvd19tb3VudDogZmFsc2UgfSk7CiAgICAgICAgICBtb3VudHBvaW50ID0gbG9va3VwLnBhdGg7CiAgICAgICAgICBub2RlID0gbG9va3VwLm5vZGU7CiAgICAgICAgICBpZiAoRlMuaXNNb3VudHBvaW50KG5vZGUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDEwKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghRlMuaXNEaXIobm9kZS5tb2RlKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBtb3VudCA9IHsgdHlwZTogdHlwZSwgb3B0czogb3B0cywgbW91bnRwb2ludDogbW91bnRwb2ludCwgbW91bnRzOiBbXSB9OwogICAgICAgIHZhciBtb3VudFJvb3QgPSB0eXBlLm1vdW50KG1vdW50KTsKICAgICAgICBtb3VudFJvb3QubW91bnQgPSBtb3VudDsKICAgICAgICBtb3VudC5yb290ID0gbW91bnRSb290OwogICAgICAgIGlmIChyb290KSB7CiAgICAgICAgICBGUy5yb290ID0gbW91bnRSb290OwogICAgICAgIH0gZWxzZSBpZiAobm9kZSkgewogICAgICAgICAgbm9kZS5tb3VudGVkID0gbW91bnQ7CiAgICAgICAgICBpZiAobm9kZS5tb3VudCkgewogICAgICAgICAgICBub2RlLm1vdW50Lm1vdW50cy5wdXNoKG1vdW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1vdW50Um9vdDsKICAgICAgfSwKICAgICAgdW5tb3VudChtb3VudHBvaW50KSB7CiAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgobW91bnRwb2ludCwgeyBmb2xsb3dfbW91bnQ6IGZhbHNlIH0pOwogICAgICAgIGlmICghRlMuaXNNb3VudHBvaW50KGxvb2t1cC5ub2RlKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICAgIH0KICAgICAgICB2YXIgbm9kZSA9IGxvb2t1cC5ub2RlOwogICAgICAgIHZhciBtb3VudCA9IG5vZGUubW91bnRlZDsKICAgICAgICB2YXIgbW91bnRzID0gRlMuZ2V0TW91bnRzKG1vdW50KTsKICAgICAgICBPYmplY3Qua2V5cyhGUy5uYW1lVGFibGUpLmZvckVhY2goKGhhc2gpID0+IHsKICAgICAgICAgIHZhciBjdXJyZW50ID0gRlMubmFtZVRhYmxlW2hhc2hdOwogICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgdmFyIG5leHQgPSBjdXJyZW50Lm5hbWVfbmV4dDsKICAgICAgICAgICAgaWYgKG1vdW50cy5pbmNsdWRlcyhjdXJyZW50Lm1vdW50KSkgewogICAgICAgICAgICAgIEZTLmRlc3Ryb3lOb2RlKGN1cnJlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIG5vZGUubW91bnRlZCA9IG51bGw7CiAgICAgICAgdmFyIGlkeCA9IG5vZGUubW91bnQubW91bnRzLmluZGV4T2YobW91bnQpOwogICAgICAgIG5vZGUubW91bnQubW91bnRzLnNwbGljZShpZHgsIDEpOwogICAgICB9LAogICAgICBsb29rdXAocGFyZW50LCBuYW1lKSB7CiAgICAgICAgcmV0dXJuIHBhcmVudC5ub2RlX29wcy5sb29rdXAocGFyZW50LCBuYW1lKTsKICAgICAgfSwKICAgICAgbWtub2QocGF0aCwgbW9kZSwgZGV2KSB7CiAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBwYXJlbnQ6IHRydWUgfSk7CiAgICAgICAgdmFyIHBhcmVudCA9IGxvb2t1cC5ub2RlOwogICAgICAgIHZhciBuYW1lID0gUEFUSC5iYXNlbmFtZShwYXRoKTsKICAgICAgICBpZiAoIW5hbWUgfHwgbmFtZSA9PT0gJy4nIHx8IG5hbWUgPT09ICcuLicpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgICB9CiAgICAgICAgdmFyIGVyckNvZGUgPSBGUy5tYXlDcmVhdGUocGFyZW50LCBuYW1lKTsKICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSk7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyZW50Lm5vZGVfb3BzLm1rbm9kKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJlbnQubm9kZV9vcHMubWtub2QocGFyZW50LCBuYW1lLCBtb2RlLCBkZXYpOwogICAgICB9LAogICAgICBjcmVhdGUocGF0aCwgbW9kZSkgewogICAgICAgIG1vZGUgPSBtb2RlICE9PSB1bmRlZmluZWQgPyBtb2RlIDogNDM4OwogICAgICAgIG1vZGUgJj0gNDA5NTsKICAgICAgICBtb2RlIHw9IDMyNzY4OwogICAgICAgIHJldHVybiBGUy5ta25vZChwYXRoLCBtb2RlLCAwKTsKICAgICAgfSwKICAgICAgbWtkaXIocGF0aCwgbW9kZSkgewogICAgICAgIG1vZGUgPSBtb2RlICE9PSB1bmRlZmluZWQgPyBtb2RlIDogNTExOwogICAgICAgIG1vZGUgJj0gNTExIHwgNTEyOwogICAgICAgIG1vZGUgfD0gMTYzODQ7CiAgICAgICAgcmV0dXJuIEZTLm1rbm9kKHBhdGgsIG1vZGUsIDApOwogICAgICB9LAogICAgICBta2RpclRyZWUocGF0aCwgbW9kZSkgewogICAgICAgIHZhciBkaXJzID0gcGF0aC5zcGxpdCgnLycpOwogICAgICAgIHZhciBkID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBpZiAoIWRpcnNbaV0pIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBkICs9ICcvJyArIGRpcnNbaV07CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBGUy5ta2RpcihkLCBtb2RlKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaWYgKGUuZXJybm8gIT0gMjApIHsKICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBta2RldihwYXRoLCBtb2RlLCBkZXYpIHsKICAgICAgICBpZiAodHlwZW9mIGRldiA9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgZGV2ID0gbW9kZTsKICAgICAgICAgIG1vZGUgPSA0Mzg7CiAgICAgICAgfQogICAgICAgIG1vZGUgfD0gODE5MjsKICAgICAgICByZXR1cm4gRlMubWtub2QocGF0aCwgbW9kZSwgZGV2KTsKICAgICAgfSwKICAgICAgc3ltbGluayhvbGRwYXRoLCBuZXdwYXRoKSB7CiAgICAgICAgaWYgKCFQQVRIX0ZTLnJlc29sdmUob2xkcGF0aCkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTsKICAgICAgICB9CiAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgobmV3cGF0aCwgeyBwYXJlbnQ6IHRydWUgfSk7CiAgICAgICAgdmFyIHBhcmVudCA9IGxvb2t1cC5ub2RlOwogICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgICAgfQogICAgICAgIHZhciBuZXduYW1lID0gUEFUSC5iYXNlbmFtZShuZXdwYXRoKTsKICAgICAgICB2YXIgZXJyQ29kZSA9IEZTLm1heUNyZWF0ZShwYXJlbnQsIG5ld25hbWUpOwogICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFwYXJlbnQubm9kZV9vcHMuc3ltbGluaykgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyZW50Lm5vZGVfb3BzLnN5bWxpbmsocGFyZW50LCBuZXduYW1lLCBvbGRwYXRoKTsKICAgICAgfSwKICAgICAgcmVuYW1lKG9sZF9wYXRoLCBuZXdfcGF0aCkgewogICAgICAgIHZhciBvbGRfZGlybmFtZSA9IFBBVEguZGlybmFtZShvbGRfcGF0aCk7CiAgICAgICAgdmFyIG5ld19kaXJuYW1lID0gUEFUSC5kaXJuYW1lKG5ld19wYXRoKTsKICAgICAgICB2YXIgb2xkX25hbWUgPSBQQVRILmJhc2VuYW1lKG9sZF9wYXRoKTsKICAgICAgICB2YXIgbmV3X25hbWUgPSBQQVRILmJhc2VuYW1lKG5ld19wYXRoKTsKICAgICAgICB2YXIgbG9va3VwLCBvbGRfZGlyLCBuZXdfZGlyOwogICAgICAgIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgob2xkX3BhdGgsIHsgcGFyZW50OiB0cnVlIH0pOwogICAgICAgIG9sZF9kaXIgPSBsb29rdXAubm9kZTsKICAgICAgICBsb29rdXAgPSBGUy5sb29rdXBQYXRoKG5ld19wYXRoLCB7IHBhcmVudDogdHJ1ZSB9KTsKICAgICAgICBuZXdfZGlyID0gbG9va3VwLm5vZGU7CiAgICAgICAgaWYgKCFvbGRfZGlyIHx8ICFuZXdfZGlyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgICAgfQogICAgICAgIGlmIChvbGRfZGlyLm1vdW50ICE9PSBuZXdfZGlyLm1vdW50KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig3NSk7CiAgICAgICAgfQogICAgICAgIHZhciBvbGRfbm9kZSA9IEZTLmxvb2t1cE5vZGUob2xkX2Rpciwgb2xkX25hbWUpOwogICAgICAgIHZhciByZWxhdGl2ZSA9IFBBVEhfRlMucmVsYXRpdmUob2xkX3BhdGgsIG5ld19kaXJuYW1lKTsKICAgICAgICBpZiAocmVsYXRpdmUuY2hhckF0KDApICE9PSAnLicpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgICB9CiAgICAgICAgcmVsYXRpdmUgPSBQQVRIX0ZTLnJlbGF0aXZlKG5ld19wYXRoLCBvbGRfZGlybmFtZSk7CiAgICAgICAgaWYgKHJlbGF0aXZlLmNoYXJBdCgwKSAhPT0gJy4nKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NSk7CiAgICAgICAgfQogICAgICAgIHZhciBuZXdfbm9kZTsKICAgICAgICB0cnkgewogICAgICAgICAgbmV3X25vZGUgPSBGUy5sb29rdXBOb2RlKG5ld19kaXIsIG5ld19uYW1lKTsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIGlmIChvbGRfbm9kZSA9PT0gbmV3X25vZGUpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGlzZGlyID0gRlMuaXNEaXIob2xkX25vZGUubW9kZSk7CiAgICAgICAgdmFyIGVyckNvZGUgPSBGUy5tYXlEZWxldGUob2xkX2Rpciwgb2xkX25hbWUsIGlzZGlyKTsKICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSk7CiAgICAgICAgfQogICAgICAgIGVyckNvZGUgPSBuZXdfbm9kZSA/IEZTLm1heURlbGV0ZShuZXdfZGlyLCBuZXdfbmFtZSwgaXNkaXIpIDogRlMubWF5Q3JlYXRlKG5ld19kaXIsIG5ld19uYW1lKTsKICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSk7CiAgICAgICAgfQogICAgICAgIGlmICghb2xkX2Rpci5ub2RlX29wcy5yZW5hbWUpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKTsKICAgICAgICB9CiAgICAgICAgaWYgKEZTLmlzTW91bnRwb2ludChvbGRfbm9kZSkgfHwgKG5ld19ub2RlICYmIEZTLmlzTW91bnRwb2ludChuZXdfbm9kZSkpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCk7CiAgICAgICAgfQogICAgICAgIGlmIChuZXdfZGlyICE9PSBvbGRfZGlyKSB7CiAgICAgICAgICBlcnJDb2RlID0gRlMubm9kZVBlcm1pc3Npb25zKG9sZF9kaXIsICd3Jyk7CiAgICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgRlMuaGFzaFJlbW92ZU5vZGUob2xkX25vZGUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBvbGRfZGlyLm5vZGVfb3BzLnJlbmFtZShvbGRfbm9kZSwgbmV3X2RpciwgbmV3X25hbWUpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIEZTLmhhc2hBZGROb2RlKG9sZF9ub2RlKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJtZGlyKHBhdGgpIHsKICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IHBhcmVudDogdHJ1ZSB9KTsKICAgICAgICB2YXIgcGFyZW50ID0gbG9va3VwLm5vZGU7CiAgICAgICAgdmFyIG5hbWUgPSBQQVRILmJhc2VuYW1lKHBhdGgpOwogICAgICAgIHZhciBub2RlID0gRlMubG9va3VwTm9kZShwYXJlbnQsIG5hbWUpOwogICAgICAgIHZhciBlcnJDb2RlID0gRlMubWF5RGVsZXRlKHBhcmVudCwgbmFtZSwgdHJ1ZSk7CiAgICAgICAgaWYgKGVyckNvZGUpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpOwogICAgICAgIH0KICAgICAgICBpZiAoIXBhcmVudC5ub2RlX29wcy5ybWRpcikgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpOwogICAgICAgIH0KICAgICAgICBpZiAoRlMuaXNNb3VudHBvaW50KG5vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCk7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5ub2RlX29wcy5ybWRpcihwYXJlbnQsIG5hbWUpOwogICAgICAgIEZTLmRlc3Ryb3lOb2RlKG5vZGUpOwogICAgICB9LAogICAgICByZWFkZGlyKHBhdGgpIHsKICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IGZvbGxvdzogdHJ1ZSB9KTsKICAgICAgICB2YXIgbm9kZSA9IGxvb2t1cC5ub2RlOwogICAgICAgIGlmICghbm9kZS5ub2RlX29wcy5yZWFkZGlyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub2RlLm5vZGVfb3BzLnJlYWRkaXIobm9kZSk7CiAgICAgIH0sCiAgICAgIHVubGluayhwYXRoKSB7CiAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBwYXJlbnQ6IHRydWUgfSk7CiAgICAgICAgdmFyIHBhcmVudCA9IGxvb2t1cC5ub2RlOwogICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgICAgfQogICAgICAgIHZhciBuYW1lID0gUEFUSC5iYXNlbmFtZShwYXRoKTsKICAgICAgICB2YXIgbm9kZSA9IEZTLmxvb2t1cE5vZGUocGFyZW50LCBuYW1lKTsKICAgICAgICB2YXIgZXJyQ29kZSA9IEZTLm1heURlbGV0ZShwYXJlbnQsIG5hbWUsIGZhbHNlKTsKICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSk7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyZW50Lm5vZGVfb3BzLnVubGluaykgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpOwogICAgICAgIH0KICAgICAgICBpZiAoRlMuaXNNb3VudHBvaW50KG5vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCk7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5ub2RlX29wcy51bmxpbmsocGFyZW50LCBuYW1lKTsKICAgICAgICBGUy5kZXN0cm95Tm9kZShub2RlKTsKICAgICAgfSwKICAgICAgcmVhZGxpbmsocGF0aCkgewogICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgpOwogICAgICAgIHZhciBsaW5rID0gbG9va3VwLm5vZGU7CiAgICAgICAgaWYgKCFsaW5rKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgICAgfQogICAgICAgIGlmICghbGluay5ub2RlX29wcy5yZWFkbGluaykgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUEFUSF9GUy5yZXNvbHZlKEZTLmdldFBhdGgobGluay5wYXJlbnQpLCBsaW5rLm5vZGVfb3BzLnJlYWRsaW5rKGxpbmspKTsKICAgICAgfSwKICAgICAgc3RhdChwYXRoLCBkb250Rm9sbG93KSB7CiAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBmb2xsb3c6ICFkb250Rm9sbG93IH0pOwogICAgICAgIHZhciBub2RlID0gbG9va3VwLm5vZGU7CiAgICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgICAgfQogICAgICAgIGlmICghbm9kZS5ub2RlX29wcy5nZXRhdHRyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub2RlLm5vZGVfb3BzLmdldGF0dHIobm9kZSk7CiAgICAgIH0sCiAgICAgIGxzdGF0KHBhdGgpIHsKICAgICAgICByZXR1cm4gRlMuc3RhdChwYXRoLCB0cnVlKTsKICAgICAgfSwKICAgICAgY2htb2QocGF0aCwgbW9kZSwgZG9udEZvbGxvdykgewogICAgICAgIHZhciBub2RlOwogICAgICAgIGlmICh0eXBlb2YgcGF0aCA9PSAnc3RyaW5nJykgewogICAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBmb2xsb3c6ICFkb250Rm9sbG93IH0pOwogICAgICAgICAgbm9kZSA9IGxvb2t1cC5ub2RlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlID0gcGF0aDsKICAgICAgICB9CiAgICAgICAgaWYgKCFub2RlLm5vZGVfb3BzLnNldGF0dHIpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKTsKICAgICAgICB9CiAgICAgICAgbm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUsIHsgbW9kZTogKG1vZGUgJiA0MDk1KSB8IChub2RlLm1vZGUgJiB+NDA5NSksIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9KTsKICAgICAgfSwKICAgICAgbGNobW9kKHBhdGgsIG1vZGUpIHsKICAgICAgICBGUy5jaG1vZChwYXRoLCBtb2RlLCB0cnVlKTsKICAgICAgfSwKICAgICAgZmNobW9kKGZkLCBtb2RlKSB7CiAgICAgICAgdmFyIHN0cmVhbSA9IEZTLmdldFN0cmVhbUNoZWNrZWQoZmQpOwogICAgICAgIEZTLmNobW9kKHN0cmVhbS5ub2RlLCBtb2RlKTsKICAgICAgfSwKICAgICAgY2hvd24ocGF0aCwgdWlkLCBnaWQsIGRvbnRGb2xsb3cpIHsKICAgICAgICB2YXIgbm9kZTsKICAgICAgICBpZiAodHlwZW9mIHBhdGggPT0gJ3N0cmluZycpIHsKICAgICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgZm9sbG93OiAhZG9udEZvbGxvdyB9KTsKICAgICAgICAgIG5vZGUgPSBsb29rdXAubm9kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZSA9IHBhdGg7CiAgICAgICAgfQogICAgICAgIGlmICghbm9kZS5ub2RlX29wcy5zZXRhdHRyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgICAgfQogICAgICAgIG5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLCB7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9KTsKICAgICAgfSwKICAgICAgbGNob3duKHBhdGgsIHVpZCwgZ2lkKSB7CiAgICAgICAgRlMuY2hvd24ocGF0aCwgdWlkLCBnaWQsIHRydWUpOwogICAgICB9LAogICAgICBmY2hvd24oZmQsIHVpZCwgZ2lkKSB7CiAgICAgICAgdmFyIHN0cmVhbSA9IEZTLmdldFN0cmVhbUNoZWNrZWQoZmQpOwogICAgICAgIEZTLmNob3duKHN0cmVhbS5ub2RlLCB1aWQsIGdpZCk7CiAgICAgIH0sCiAgICAgIHRydW5jYXRlKHBhdGgsIGxlbikgewogICAgICAgIGlmIChsZW4gPCAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgICAgfQogICAgICAgIHZhciBub2RlOwogICAgICAgIGlmICh0eXBlb2YgcGF0aCA9PSAnc3RyaW5nJykgewogICAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBmb2xsb3c6IHRydWUgfSk7CiAgICAgICAgICBub2RlID0gbG9va3VwLm5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5vZGUgPSBwYXRoOwogICAgICAgIH0KICAgICAgICBpZiAoIW5vZGUubm9kZV9vcHMuc2V0YXR0cikgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpOwogICAgICAgIH0KICAgICAgICBpZiAoRlMuaXNEaXIobm9kZS5tb2RlKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMzEpOwogICAgICAgIH0KICAgICAgICBpZiAoIUZTLmlzRmlsZShub2RlLm1vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgICAgfQogICAgICAgIHZhciBlcnJDb2RlID0gRlMubm9kZVBlcm1pc3Npb25zKG5vZGUsICd3Jyk7CiAgICAgICAgaWYgKGVyckNvZGUpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpOwogICAgICAgIH0KICAgICAgICBub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSwgeyBzaXplOiBsZW4sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9KTsKICAgICAgfSwKICAgICAgZnRydW5jYXRlKGZkLCBsZW4pIHsKICAgICAgICB2YXIgc3RyZWFtID0gRlMuZ2V0U3RyZWFtQ2hlY2tlZChmZCk7CiAgICAgICAgaWYgKChzdHJlYW0uZmxhZ3MgJiAyMDk3MTU1KSA9PT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICAgIH0KICAgICAgICBGUy50cnVuY2F0ZShzdHJlYW0ubm9kZSwgbGVuKTsKICAgICAgfSwKICAgICAgdXRpbWUocGF0aCwgYXRpbWUsIG10aW1lKSB7CiAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBmb2xsb3c6IHRydWUgfSk7CiAgICAgICAgdmFyIG5vZGUgPSBsb29rdXAubm9kZTsKICAgICAgICBub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSwgeyB0aW1lc3RhbXA6IE1hdGgubWF4KGF0aW1lLCBtdGltZSkgfSk7CiAgICAgIH0sCiAgICAgIG9wZW4ocGF0aCwgZmxhZ3MsIG1vZGUpIHsKICAgICAgICBpZiAocGF0aCA9PT0gJycpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTsKICAgICAgICB9CiAgICAgICAgZmxhZ3MgPSB0eXBlb2YgZmxhZ3MgPT0gJ3N0cmluZycgPyBGU19tb2RlU3RyaW5nVG9GbGFncyhmbGFncykgOiBmbGFnczsKICAgICAgICBtb2RlID0gdHlwZW9mIG1vZGUgPT0gJ3VuZGVmaW5lZCcgPyA0MzggOiBtb2RlOwogICAgICAgIGlmIChmbGFncyAmIDY0KSB7CiAgICAgICAgICBtb2RlID0gKG1vZGUgJiA0MDk1KSB8IDMyNzY4OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtb2RlID0gMDsKICAgICAgICB9CiAgICAgICAgdmFyIG5vZGU7CiAgICAgICAgaWYgKHR5cGVvZiBwYXRoID09ICdvYmplY3QnKSB7CiAgICAgICAgICBub2RlID0gcGF0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcGF0aCA9IFBBVEgubm9ybWFsaXplKHBhdGgpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBmb2xsb3c6ICEoZmxhZ3MgJiAxMzEwNzIpIH0pOwogICAgICAgICAgICBub2RlID0gbG9va3VwLm5vZGU7CiAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIH0KICAgICAgICB2YXIgY3JlYXRlZCA9IGZhbHNlOwogICAgICAgIGlmIChmbGFncyAmIDY0KSB7CiAgICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgICBpZiAoZmxhZ3MgJiAxMjgpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vZGUgPSBGUy5ta25vZChwYXRoLCBtb2RlLCAwKTsKICAgICAgICAgICAgY3JlYXRlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpOwogICAgICAgIH0KICAgICAgICBpZiAoRlMuaXNDaHJkZXYobm9kZS5tb2RlKSkgewogICAgICAgICAgZmxhZ3MgJj0gfjUxMjsKICAgICAgICB9CiAgICAgICAgaWYgKGZsYWdzICYgNjU1MzYgJiYgIUZTLmlzRGlyKG5vZGUubW9kZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDU0KTsKICAgICAgICB9CiAgICAgICAgaWYgKCFjcmVhdGVkKSB7CiAgICAgICAgICB2YXIgZXJyQ29kZSA9IEZTLm1heU9wZW4obm9kZSwgZmxhZ3MpOwogICAgICAgICAgaWYgKGVyckNvZGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChmbGFncyAmIDUxMiAmJiAhY3JlYXRlZCkgewogICAgICAgICAgRlMudHJ1bmNhdGUobm9kZSwgMCk7CiAgICAgICAgfQogICAgICAgIGZsYWdzICY9IH4oMTI4IHwgNTEyIHwgMTMxMDcyKTsKICAgICAgICB2YXIgc3RyZWFtID0gRlMuY3JlYXRlU3RyZWFtKHsKICAgICAgICAgIG5vZGU6IG5vZGUsCiAgICAgICAgICBwYXRoOiBGUy5nZXRQYXRoKG5vZGUpLAogICAgICAgICAgZmxhZ3M6IGZsYWdzLAogICAgICAgICAgc2Vla2FibGU6IHRydWUsCiAgICAgICAgICBwb3NpdGlvbjogMCwKICAgICAgICAgIHN0cmVhbV9vcHM6IG5vZGUuc3RyZWFtX29wcywKICAgICAgICAgIHVuZ290dGVuOiBbXSwKICAgICAgICAgIGVycm9yOiBmYWxzZQogICAgICAgIH0pOwogICAgICAgIGlmIChzdHJlYW0uc3RyZWFtX29wcy5vcGVuKSB7CiAgICAgICAgICBzdHJlYW0uc3RyZWFtX29wcy5vcGVuKHN0cmVhbSk7CiAgICAgICAgfQogICAgICAgIGlmIChNb2R1bGVbJ2xvZ1JlYWRGaWxlcyddICYmICEoZmxhZ3MgJiAxKSkgewogICAgICAgICAgaWYgKCFGUy5yZWFkRmlsZXMpIHsKICAgICAgICAgICAgRlMucmVhZEZpbGVzID0ge307CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIShwYXRoIGluIEZTLnJlYWRGaWxlcykpIHsKICAgICAgICAgICAgRlMucmVhZEZpbGVzW3BhdGhdID0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cmVhbTsKICAgICAgfSwKICAgICAgY2xvc2Uoc3RyZWFtKSB7CiAgICAgICAgaWYgKEZTLmlzQ2xvc2VkKHN0cmVhbSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLmdldGRlbnRzKSB7CiAgICAgICAgICBzdHJlYW0uZ2V0ZGVudHMgPSBudWxsOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgaWYgKHN0cmVhbS5zdHJlYW1fb3BzLmNsb3NlKSB7CiAgICAgICAgICAgIHN0cmVhbS5zdHJlYW1fb3BzLmNsb3NlKHN0cmVhbSk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgRlMuY2xvc2VTdHJlYW0oc3RyZWFtLmZkKTsKICAgICAgICB9CiAgICAgICAgc3RyZWFtLmZkID0gbnVsbDsKICAgICAgfSwKICAgICAgaXNDbG9zZWQoc3RyZWFtKSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbS5mZCA9PT0gbnVsbDsKICAgICAgfSwKICAgICAgbGxzZWVrKHN0cmVhbSwgb2Zmc2V0LCB3aGVuY2UpIHsKICAgICAgICBpZiAoRlMuaXNDbG9zZWQoc3RyZWFtKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7CiAgICAgICAgfQogICAgICAgIGlmICghc3RyZWFtLnNlZWthYmxlIHx8ICFzdHJlYW0uc3RyZWFtX29wcy5sbHNlZWspIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDcwKTsKICAgICAgICB9CiAgICAgICAgaWYgKHdoZW5jZSAhPSAwICYmIHdoZW5jZSAhPSAxICYmIHdoZW5jZSAhPSAyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5wb3NpdGlvbiA9IHN0cmVhbS5zdHJlYW1fb3BzLmxsc2VlayhzdHJlYW0sIG9mZnNldCwgd2hlbmNlKTsKICAgICAgICBzdHJlYW0udW5nb3R0ZW4gPSBbXTsKICAgICAgICByZXR1cm4gc3RyZWFtLnBvc2l0aW9uOwogICAgICB9LAogICAgICByZWFkKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pIHsKICAgICAgICBpZiAobGVuZ3RoIDwgMCB8fCBwb3NpdGlvbiA8IDApIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgICB9CiAgICAgICAgaWYgKEZTLmlzQ2xvc2VkKHN0cmVhbSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpOwogICAgICAgIH0KICAgICAgICBpZiAoKHN0cmVhbS5mbGFncyAmIDIwOTcxNTUpID09PSAxKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KTsKICAgICAgICB9CiAgICAgICAgaWYgKEZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigzMSk7CiAgICAgICAgfQogICAgICAgIGlmICghc3RyZWFtLnN0cmVhbV9vcHMucmVhZCkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICAgIH0KICAgICAgICB2YXIgc2Vla2luZyA9IHR5cGVvZiBwb3NpdGlvbiAhPSAndW5kZWZpbmVkJzsKICAgICAgICBpZiAoIXNlZWtpbmcpIHsKICAgICAgICAgIHBvc2l0aW9uID0gc3RyZWFtLnBvc2l0aW9uOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmVhbS5zZWVrYWJsZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNzApOwogICAgICAgIH0KICAgICAgICB2YXIgYnl0ZXNSZWFkID0gc3RyZWFtLnN0cmVhbV9vcHMucmVhZChzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKTsKICAgICAgICBpZiAoIXNlZWtpbmcpIHsKICAgICAgICAgIHN0cmVhbS5wb3NpdGlvbiArPSBieXRlc1JlYWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBieXRlc1JlYWQ7CiAgICAgIH0sCiAgICAgIHdyaXRlKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbk93bikgewogICAgICAgIGlmIChsZW5ndGggPCAwIHx8IHBvc2l0aW9uIDwgMCkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICAgIH0KICAgICAgICBpZiAoRlMuaXNDbG9zZWQoc3RyZWFtKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7CiAgICAgICAgfQogICAgICAgIGlmICgoc3RyZWFtLmZsYWdzICYgMjA5NzE1NSkgPT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpOwogICAgICAgIH0KICAgICAgICBpZiAoRlMuaXNEaXIoc3RyZWFtLm5vZGUubW9kZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDMxKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdHJlYW0uc3RyZWFtX29wcy53cml0ZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLnNlZWthYmxlICYmIHN0cmVhbS5mbGFncyAmIDEwMjQpIHsKICAgICAgICAgIEZTLmxsc2VlayhzdHJlYW0sIDAsIDIpOwogICAgICAgIH0KICAgICAgICB2YXIgc2Vla2luZyA9IHR5cGVvZiBwb3NpdGlvbiAhPSAndW5kZWZpbmVkJzsKICAgICAgICBpZiAoIXNlZWtpbmcpIHsKICAgICAgICAgIHBvc2l0aW9uID0gc3RyZWFtLnBvc2l0aW9uOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmVhbS5zZWVrYWJsZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNzApOwogICAgICAgIH0KICAgICAgICB2YXIgYnl0ZXNXcml0dGVuID0gc3RyZWFtLnN0cmVhbV9vcHMud3JpdGUoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FuT3duKTsKICAgICAgICBpZiAoIXNlZWtpbmcpIHsKICAgICAgICAgIHN0cmVhbS5wb3NpdGlvbiArPSBieXRlc1dyaXR0ZW47CiAgICAgICAgfQogICAgICAgIHJldHVybiBieXRlc1dyaXR0ZW47CiAgICAgIH0sCiAgICAgIGFsbG9jYXRlKHN0cmVhbSwgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgICBpZiAoRlMuaXNDbG9zZWQoc3RyZWFtKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7CiAgICAgICAgfQogICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IGxlbmd0aCA8PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgICAgfQogICAgICAgIGlmICgoc3RyZWFtLmZsYWdzICYgMjA5NzE1NSkgPT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpOwogICAgICAgIH0KICAgICAgICBpZiAoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSAmJiAhRlMuaXNEaXIoc3RyZWFtLm5vZGUubW9kZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQzKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdHJlYW0uc3RyZWFtX29wcy5hbGxvY2F0ZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMTM4KTsKICAgICAgICB9CiAgICAgICAgc3RyZWFtLnN0cmVhbV9vcHMuYWxsb2NhdGUoc3RyZWFtLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgIH0sCiAgICAgIG1tYXAoc3RyZWFtLCBsZW5ndGgsIHBvc2l0aW9uLCBwcm90LCBmbGFncykgewogICAgICAgIGlmICgocHJvdCAmIDIpICE9PSAwICYmIChmbGFncyAmIDIpID09PSAwICYmIChzdHJlYW0uZmxhZ3MgJiAyMDk3MTU1KSAhPT0gMikgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMik7CiAgICAgICAgfQogICAgICAgIGlmICgoc3RyZWFtLmZsYWdzICYgMjA5NzE1NSkgPT09IDEpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIpOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbS5zdHJlYW1fb3BzLm1tYXApIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLm1tYXAoc3RyZWFtLCBsZW5ndGgsIHBvc2l0aW9uLCBwcm90LCBmbGFncyk7CiAgICAgIH0sCiAgICAgIG1zeW5jKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgbW1hcEZsYWdzKSB7CiAgICAgICAgaWYgKCFzdHJlYW0uc3RyZWFtX29wcy5tc3luYykgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHJlYW0uc3RyZWFtX29wcy5tc3luYyhzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIG1tYXBGbGFncyk7CiAgICAgIH0sCiAgICAgIG11bm1hcDogKHN0cmVhbSkgPT4gMCwKICAgICAgaW9jdGwoc3RyZWFtLCBjbWQsIGFyZykgewogICAgICAgIGlmICghc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDU5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLmlvY3RsKHN0cmVhbSwgY21kLCBhcmcpOwogICAgICB9LAogICAgICByZWFkRmlsZShwYXRoLCBvcHRzID0ge30pIHsKICAgICAgICBvcHRzLmZsYWdzID0gb3B0cy5mbGFncyB8fCAwOwogICAgICAgIG9wdHMuZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nIHx8ICdiaW5hcnknOwogICAgICAgIGlmIChvcHRzLmVuY29kaW5nICE9PSAndXRmOCcgJiYgb3B0cy5lbmNvZGluZyAhPT0gJ2JpbmFyeScpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbmNvZGluZyB0eXBlICIke29wdHMuZW5jb2Rpbmd9ImApOwogICAgICAgIH0KICAgICAgICB2YXIgcmV0OwogICAgICAgIHZhciBzdHJlYW0gPSBGUy5vcGVuKHBhdGgsIG9wdHMuZmxhZ3MpOwogICAgICAgIHZhciBzdGF0ID0gRlMuc3RhdChwYXRoKTsKICAgICAgICB2YXIgbGVuZ3RoID0gc3RhdC5zaXplOwogICAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogICAgICAgIEZTLnJlYWQoc3RyZWFtLCBidWYsIDAsIGxlbmd0aCwgMCk7CiAgICAgICAgaWYgKG9wdHMuZW5jb2RpbmcgPT09ICd1dGY4JykgewogICAgICAgICAgcmV0ID0gVVRGOEFycmF5VG9TdHJpbmcoYnVmLCAwKTsKICAgICAgICB9IGVsc2UgaWYgKG9wdHMuZW5jb2RpbmcgPT09ICdiaW5hcnknKSB7CiAgICAgICAgICByZXQgPSBidWY7CiAgICAgICAgfQogICAgICAgIEZTLmNsb3NlKHN0cmVhbSk7CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfSwKICAgICAgd3JpdGVGaWxlKHBhdGgsIGRhdGEsIG9wdHMgPSB7fSkgewogICAgICAgIG9wdHMuZmxhZ3MgPSBvcHRzLmZsYWdzIHx8IDU3NzsKICAgICAgICB2YXIgc3RyZWFtID0gRlMub3BlbihwYXRoLCBvcHRzLmZsYWdzLCBvcHRzLm1vZGUpOwogICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnc3RyaW5nJykgewogICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aEJ5dGVzVVRGOChkYXRhKSArIDEpOwogICAgICAgICAgdmFyIGFjdHVhbE51bUJ5dGVzID0gc3RyaW5nVG9VVEY4QXJyYXkoZGF0YSwgYnVmLCAwLCBidWYubGVuZ3RoKTsKICAgICAgICAgIEZTLndyaXRlKHN0cmVhbSwgYnVmLCAwLCBhY3R1YWxOdW1CeXRlcywgdW5kZWZpbmVkLCBvcHRzLmNhbk93bik7CiAgICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSkpIHsKICAgICAgICAgIEZTLndyaXRlKHN0cmVhbSwgZGF0YSwgMCwgZGF0YS5ieXRlTGVuZ3RoLCB1bmRlZmluZWQsIG9wdHMuY2FuT3duKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhIHR5cGUnKTsKICAgICAgICB9CiAgICAgICAgRlMuY2xvc2Uoc3RyZWFtKTsKICAgICAgfSwKICAgICAgY3dkOiAoKSA9PiBGUy5jdXJyZW50UGF0aCwKICAgICAgY2hkaXIocGF0aCkgewogICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgZm9sbG93OiB0cnVlIH0pOwogICAgICAgIGlmIChsb29rdXAubm9kZSA9PT0gbnVsbCkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpOwogICAgICAgIH0KICAgICAgICBpZiAoIUZTLmlzRGlyKGxvb2t1cC5ub2RlLm1vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NCk7CiAgICAgICAgfQogICAgICAgIHZhciBlcnJDb2RlID0gRlMubm9kZVBlcm1pc3Npb25zKGxvb2t1cC5ub2RlLCAneCcpOwogICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgICB9CiAgICAgICAgRlMuY3VycmVudFBhdGggPSBsb29rdXAucGF0aDsKICAgICAgfSwKICAgICAgY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCkgewogICAgICAgIEZTLm1rZGlyKCcvdG1wJyk7CiAgICAgICAgRlMubWtkaXIoJy9ob21lJyk7CiAgICAgICAgRlMubWtkaXIoJy9ob21lL3dlYl91c2VyJyk7CiAgICAgIH0sCiAgICAgIGNyZWF0ZURlZmF1bHREZXZpY2VzKCkgewogICAgICAgIEZTLm1rZGlyKCcvZGV2Jyk7CiAgICAgICAgRlMucmVnaXN0ZXJEZXZpY2UoRlMubWFrZWRldigxLCAzKSwgeyByZWFkOiAoKSA9PiAwLCB3cml0ZTogKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zKSA9PiBsZW5ndGggfSk7CiAgICAgICAgRlMubWtkZXYoJy9kZXYvbnVsbCcsIEZTLm1ha2VkZXYoMSwgMykpOwogICAgICAgIFRUWS5yZWdpc3RlcihGUy5tYWtlZGV2KDUsIDApLCBUVFkuZGVmYXVsdF90dHlfb3BzKTsKICAgICAgICBUVFkucmVnaXN0ZXIoRlMubWFrZWRldig2LCAwKSwgVFRZLmRlZmF1bHRfdHR5MV9vcHMpOwogICAgICAgIEZTLm1rZGV2KCcvZGV2L3R0eScsIEZTLm1ha2VkZXYoNSwgMCkpOwogICAgICAgIEZTLm1rZGV2KCcvZGV2L3R0eTEnLCBGUy5tYWtlZGV2KDYsIDApKTsKICAgICAgICB2YXIgcmFuZG9tQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTAyNCksCiAgICAgICAgICByYW5kb21MZWZ0ID0gMDsKICAgICAgICB2YXIgcmFuZG9tQnl0ZSA9ICgpID0+IHsKICAgICAgICAgIGlmIChyYW5kb21MZWZ0ID09PSAwKSB7CiAgICAgICAgICAgIHJhbmRvbUxlZnQgPSByYW5kb21GaWxsKHJhbmRvbUJ1ZmZlcikuYnl0ZUxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByYW5kb21CdWZmZXJbLS1yYW5kb21MZWZ0XTsKICAgICAgICB9OwogICAgICAgIEZTLmNyZWF0ZURldmljZSgnL2RldicsICdyYW5kb20nLCByYW5kb21CeXRlKTsKICAgICAgICBGUy5jcmVhdGVEZXZpY2UoJy9kZXYnLCAndXJhbmRvbScsIHJhbmRvbUJ5dGUpOwogICAgICAgIEZTLm1rZGlyKCcvZGV2L3NobScpOwogICAgICAgIEZTLm1rZGlyKCcvZGV2L3NobS90bXAnKTsKICAgICAgfSwKICAgICAgY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCkgewogICAgICAgIEZTLm1rZGlyKCcvcHJvYycpOwogICAgICAgIHZhciBwcm9jX3NlbGYgPSBGUy5ta2RpcignL3Byb2Mvc2VsZicpOwogICAgICAgIEZTLm1rZGlyKCcvcHJvYy9zZWxmL2ZkJyk7CiAgICAgICAgRlMubW91bnQoCiAgICAgICAgICB7CiAgICAgICAgICAgIG1vdW50KCkgewogICAgICAgICAgICAgIHZhciBub2RlID0gRlMuY3JlYXRlTm9kZShwcm9jX3NlbGYsICdmZCcsIDE2Mzg0IHwgNTExLCA3Myk7CiAgICAgICAgICAgICAgbm9kZS5ub2RlX29wcyA9IHsKICAgICAgICAgICAgICAgIGxvb2t1cChwYXJlbnQsIG5hbWUpIHsKICAgICAgICAgICAgICAgICAgdmFyIGZkID0gK25hbWU7CiAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBGUy5nZXRTdHJlYW1DaGVja2VkKGZkKTsKICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IHsgcGFyZW50OiBudWxsLCBtb3VudDogeyBtb3VudHBvaW50OiAnZmFrZScgfSwgbm9kZV9vcHM6IHsgcmVhZGxpbms6ICgpID0+IHN0cmVhbS5wYXRoIH0gfTsKICAgICAgICAgICAgICAgICAgcmV0LnBhcmVudCA9IHJldDsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAge30sCiAgICAgICAgICAnL3Byb2Mvc2VsZi9mZCcKICAgICAgICApOwogICAgICB9LAogICAgICBjcmVhdGVTdGFuZGFyZFN0cmVhbXMoKSB7CiAgICAgICAgaWYgKE1vZHVsZVsnc3RkaW4nXSkgewogICAgICAgICAgRlMuY3JlYXRlRGV2aWNlKCcvZGV2JywgJ3N0ZGluJywgTW9kdWxlWydzdGRpbiddKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgRlMuc3ltbGluaygnL2Rldi90dHknLCAnL2Rldi9zdGRpbicpOwogICAgICAgIH0KICAgICAgICBpZiAoTW9kdWxlWydzdGRvdXQnXSkgewogICAgICAgICAgRlMuY3JlYXRlRGV2aWNlKCcvZGV2JywgJ3N0ZG91dCcsIG51bGwsIE1vZHVsZVsnc3Rkb3V0J10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBGUy5zeW1saW5rKCcvZGV2L3R0eScsICcvZGV2L3N0ZG91dCcpOwogICAgICAgIH0KICAgICAgICBpZiAoTW9kdWxlWydzdGRlcnInXSkgewogICAgICAgICAgRlMuY3JlYXRlRGV2aWNlKCcvZGV2JywgJ3N0ZGVycicsIG51bGwsIE1vZHVsZVsnc3RkZXJyJ10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBGUy5zeW1saW5rKCcvZGV2L3R0eTEnLCAnL2Rldi9zdGRlcnInKTsKICAgICAgICB9CiAgICAgICAgdmFyIHN0ZGluID0gRlMub3BlbignL2Rldi9zdGRpbicsIDApOwogICAgICAgIHZhciBzdGRvdXQgPSBGUy5vcGVuKCcvZGV2L3N0ZG91dCcsIDEpOwogICAgICAgIHZhciBzdGRlcnIgPSBGUy5vcGVuKCcvZGV2L3N0ZGVycicsIDEpOwogICAgICB9LAogICAgICBzdGF0aWNJbml0KCkgewogICAgICAgIFs0NF0uZm9yRWFjaCgoY29kZSkgPT4gewogICAgICAgICAgRlMuZ2VuZXJpY0Vycm9yc1tjb2RlXSA9IG5ldyBGUy5FcnJub0Vycm9yKGNvZGUpOwogICAgICAgICAgRlMuZ2VuZXJpY0Vycm9yc1tjb2RlXS5zdGFjayA9ICc8Z2VuZXJpYyBlcnJvciwgbm8gc3RhY2s+JzsKICAgICAgICB9KTsKICAgICAgICBGUy5uYW1lVGFibGUgPSBuZXcgQXJyYXkoNDA5Nik7CiAgICAgICAgRlMubW91bnQoTUVNRlMsIHt9LCAnLycpOwogICAgICAgIEZTLmNyZWF0ZURlZmF1bHREaXJlY3RvcmllcygpOwogICAgICAgIEZTLmNyZWF0ZURlZmF1bHREZXZpY2VzKCk7CiAgICAgICAgRlMuY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCk7CiAgICAgICAgRlMuZmlsZXN5c3RlbXMgPSB7IE1FTUZTOiBNRU1GUyB9OwogICAgICB9LAogICAgICBpbml0KGlucHV0LCBvdXRwdXQsIGVycm9yKSB7CiAgICAgICAgRlMuaW5pdC5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgTW9kdWxlWydzdGRpbiddID0gaW5wdXQgfHwgTW9kdWxlWydzdGRpbiddOwogICAgICAgIE1vZHVsZVsnc3Rkb3V0J10gPSBvdXRwdXQgfHwgTW9kdWxlWydzdGRvdXQnXTsKICAgICAgICBNb2R1bGVbJ3N0ZGVyciddID0gZXJyb3IgfHwgTW9kdWxlWydzdGRlcnInXTsKICAgICAgICBGUy5jcmVhdGVTdGFuZGFyZFN0cmVhbXMoKTsKICAgICAgfSwKICAgICAgcXVpdCgpIHsKICAgICAgICBGUy5pbml0LmluaXRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBGUy5zdHJlYW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgc3RyZWFtID0gRlMuc3RyZWFtc1tpXTsKICAgICAgICAgIGlmICghc3RyZWFtKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgRlMuY2xvc2Uoc3RyZWFtKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGZpbmRPYmplY3QocGF0aCwgZG9udFJlc29sdmVMYXN0TGluaykgewogICAgICAgIHZhciByZXQgPSBGUy5hbmFseXplUGF0aChwYXRoLCBkb250UmVzb2x2ZUxhc3RMaW5rKTsKICAgICAgICBpZiAoIXJldC5leGlzdHMpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0Lm9iamVjdDsKICAgICAgfSwKICAgICAgYW5hbHl6ZVBhdGgocGF0aCwgZG9udFJlc29sdmVMYXN0TGluaykgewogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IGZvbGxvdzogIWRvbnRSZXNvbHZlTGFzdExpbmsgfSk7CiAgICAgICAgICBwYXRoID0gbG9va3VwLnBhdGg7CiAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICB2YXIgcmV0ID0gewogICAgICAgICAgaXNSb290OiBmYWxzZSwKICAgICAgICAgIGV4aXN0czogZmFsc2UsCiAgICAgICAgICBlcnJvcjogMCwKICAgICAgICAgIG5hbWU6IG51bGwsCiAgICAgICAgICBwYXRoOiBudWxsLAogICAgICAgICAgb2JqZWN0OiBudWxsLAogICAgICAgICAgcGFyZW50RXhpc3RzOiBmYWxzZSwKICAgICAgICAgIHBhcmVudFBhdGg6IG51bGwsCiAgICAgICAgICBwYXJlbnRPYmplY3Q6IG51bGwKICAgICAgICB9OwogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IHBhcmVudDogdHJ1ZSB9KTsKICAgICAgICAgIHJldC5wYXJlbnRFeGlzdHMgPSB0cnVlOwogICAgICAgICAgcmV0LnBhcmVudFBhdGggPSBsb29rdXAucGF0aDsKICAgICAgICAgIHJldC5wYXJlbnRPYmplY3QgPSBsb29rdXAubm9kZTsKICAgICAgICAgIHJldC5uYW1lID0gUEFUSC5iYXNlbmFtZShwYXRoKTsKICAgICAgICAgIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBmb2xsb3c6ICFkb250UmVzb2x2ZUxhc3RMaW5rIH0pOwogICAgICAgICAgcmV0LmV4aXN0cyA9IHRydWU7CiAgICAgICAgICByZXQucGF0aCA9IGxvb2t1cC5wYXRoOwogICAgICAgICAgcmV0Lm9iamVjdCA9IGxvb2t1cC5ub2RlOwogICAgICAgICAgcmV0Lm5hbWUgPSBsb29rdXAubm9kZS5uYW1lOwogICAgICAgICAgcmV0LmlzUm9vdCA9IGxvb2t1cC5wYXRoID09PSAnLyc7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgcmV0LmVycm9yID0gZS5lcnJubzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfSwKICAgICAgY3JlYXRlUGF0aChwYXJlbnQsIHBhdGgsIGNhblJlYWQsIGNhbldyaXRlKSB7CiAgICAgICAgcGFyZW50ID0gdHlwZW9mIHBhcmVudCA9PSAnc3RyaW5nJyA/IHBhcmVudCA6IEZTLmdldFBhdGgocGFyZW50KTsKICAgICAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcvJykucmV2ZXJzZSgpOwogICAgICAgIHdoaWxlIChwYXJ0cy5sZW5ndGgpIHsKICAgICAgICAgIHZhciBwYXJ0ID0gcGFydHMucG9wKCk7CiAgICAgICAgICBpZiAoIXBhcnQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgY3VycmVudCA9IFBBVEguam9pbjIocGFyZW50LCBwYXJ0KTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIEZTLm1rZGlyKGN1cnJlbnQpOwogICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICAgIHBhcmVudCA9IGN1cnJlbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjdXJyZW50OwogICAgICB9LAogICAgICBjcmVhdGVGaWxlKHBhcmVudCwgbmFtZSwgcHJvcGVydGllcywgY2FuUmVhZCwgY2FuV3JpdGUpIHsKICAgICAgICB2YXIgcGF0aCA9IFBBVEguam9pbjIodHlwZW9mIHBhcmVudCA9PSAnc3RyaW5nJyA/IHBhcmVudCA6IEZTLmdldFBhdGgocGFyZW50KSwgbmFtZSk7CiAgICAgICAgdmFyIG1vZGUgPSBGU19nZXRNb2RlKGNhblJlYWQsIGNhbldyaXRlKTsKICAgICAgICByZXR1cm4gRlMuY3JlYXRlKHBhdGgsIG1vZGUpOwogICAgICB9LAogICAgICBjcmVhdGVEYXRhRmlsZShwYXJlbnQsIG5hbWUsIGRhdGEsIGNhblJlYWQsIGNhbldyaXRlLCBjYW5Pd24pIHsKICAgICAgICB2YXIgcGF0aCA9IG5hbWU7CiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgcGFyZW50ID0gdHlwZW9mIHBhcmVudCA9PSAnc3RyaW5nJyA/IHBhcmVudCA6IEZTLmdldFBhdGgocGFyZW50KTsKICAgICAgICAgIHBhdGggPSBuYW1lID8gUEFUSC5qb2luMihwYXJlbnQsIG5hbWUpIDogcGFyZW50OwogICAgICAgIH0KICAgICAgICB2YXIgbW9kZSA9IEZTX2dldE1vZGUoY2FuUmVhZCwgY2FuV3JpdGUpOwogICAgICAgIHZhciBub2RlID0gRlMuY3JlYXRlKHBhdGgsIG1vZGUpOwogICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgdmFyIGFyciA9IG5ldyBBcnJheShkYXRhLmxlbmd0aCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkYXRhLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgICAgICAgYXJyW2ldID0gZGF0YS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGEgPSBhcnI7CiAgICAgICAgICB9CiAgICAgICAgICBGUy5jaG1vZChub2RlLCBtb2RlIHwgMTQ2KTsKICAgICAgICAgIHZhciBzdHJlYW0gPSBGUy5vcGVuKG5vZGUsIDU3Nyk7CiAgICAgICAgICBGUy53cml0ZShzdHJlYW0sIGRhdGEsIDAsIGRhdGEubGVuZ3RoLCAwLCBjYW5Pd24pOwogICAgICAgICAgRlMuY2xvc2Uoc3RyZWFtKTsKICAgICAgICAgIEZTLmNobW9kKG5vZGUsIG1vZGUpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgY3JlYXRlRGV2aWNlKHBhcmVudCwgbmFtZSwgaW5wdXQsIG91dHB1dCkgewogICAgICAgIHZhciBwYXRoID0gUEFUSC5qb2luMih0eXBlb2YgcGFyZW50ID09ICdzdHJpbmcnID8gcGFyZW50IDogRlMuZ2V0UGF0aChwYXJlbnQpLCBuYW1lKTsKICAgICAgICB2YXIgbW9kZSA9IEZTX2dldE1vZGUoISFpbnB1dCwgISFvdXRwdXQpOwogICAgICAgIGlmICghRlMuY3JlYXRlRGV2aWNlLm1ham9yKSB7CiAgICAgICAgICBGUy5jcmVhdGVEZXZpY2UubWFqb3IgPSA2NDsKICAgICAgICB9CiAgICAgICAgdmFyIGRldiA9IEZTLm1ha2VkZXYoRlMuY3JlYXRlRGV2aWNlLm1ham9yKyssIDApOwogICAgICAgIEZTLnJlZ2lzdGVyRGV2aWNlKGRldiwgewogICAgICAgICAgb3BlbihzdHJlYW0pIHsKICAgICAgICAgICAgc3RyZWFtLnNlZWthYmxlID0gZmFsc2U7CiAgICAgICAgICB9LAogICAgICAgICAgY2xvc2Uoc3RyZWFtKSB7CiAgICAgICAgICAgIGlmIChvdXRwdXQ/LmJ1ZmZlcj8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgb3V0cHV0KDEwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHJlYWQoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3MpIHsKICAgICAgICAgICAgdmFyIGJ5dGVzUmVhZCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBpbnB1dCgpOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI5KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkICYmIGJ5dGVzUmVhZCA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBieXRlc1JlYWQrKzsKICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSByZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCkgewogICAgICAgICAgICAgIHN0cmVhbS5ub2RlLnRpbWVzdGFtcCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGJ5dGVzUmVhZDsKICAgICAgICAgIH0sCiAgICAgICAgICB3cml0ZShzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvcykgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIG91dHB1dChidWZmZXJbb2Zmc2V0ICsgaV0pOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI5KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxlbmd0aCkgewogICAgICAgICAgICAgIHN0cmVhbS5ub2RlLnRpbWVzdGFtcCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIEZTLm1rZGV2KHBhdGgsIG1vZGUsIGRldik7CiAgICAgIH0sCiAgICAgIGZvcmNlTG9hZEZpbGUob2JqKSB7CiAgICAgICAgaWYgKG9iai5pc0RldmljZSB8fCBvYmouaXNGb2xkZXIgfHwgb2JqLmxpbmsgfHwgb2JqLmNvbnRlbnRzKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICAgICAnTGF6eSBsb2FkaW5nIHNob3VsZCBoYXZlIGJlZW4gcGVyZm9ybWVkIChjb250ZW50cyBzZXQpIGluIGNyZWF0ZUxhenlGaWxlLCBidXQgaXQgd2FzIG5vdC4gTGF6eSBsb2FkaW5nIG9ubHkgd29ya3MgaW4gd2ViIHdvcmtlcnMuIFVzZSAtLWVtYmVkLWZpbGUgb3IgLS1wcmVsb2FkLWZpbGUgaW4gZW1jYyBvbiB0aGUgbWFpbiB0aHJlYWQuJwogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgaWYgKHJlYWRfKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBvYmouY29udGVudHMgPSBpbnRBcnJheUZyb21TdHJpbmcocmVhZF8ob2JqLnVybCksIHRydWUpOwogICAgICAgICAgICBvYmoudXNlZEJ5dGVzID0gb2JqLmNvbnRlbnRzLmxlbmd0aDsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjkpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LicpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgY3JlYXRlTGF6eUZpbGUocGFyZW50LCBuYW1lLCB1cmwsIGNhblJlYWQsIGNhbldyaXRlKSB7CiAgICAgICAgZnVuY3Rpb24gTGF6eVVpbnQ4QXJyYXkoKSB7CiAgICAgICAgICB0aGlzLmxlbmd0aEtub3duID0gZmFsc2U7CiAgICAgICAgICB0aGlzLmNodW5rcyA9IFtdOwogICAgICAgIH0KICAgICAgICBMYXp5VWludDhBcnJheS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gTGF6eVVpbnQ4QXJyYXlfZ2V0KGlkeCkgewogICAgICAgICAgaWYgKGlkeCA+IHRoaXMubGVuZ3RoIC0gMSB8fCBpZHggPCAwKSB7CiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgY2h1bmtPZmZzZXQgPSBpZHggJSB0aGlzLmNodW5rU2l6ZTsKICAgICAgICAgIHZhciBjaHVua051bSA9IChpZHggLyB0aGlzLmNodW5rU2l6ZSkgfCAwOwogICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0dGVyKGNodW5rTnVtKVtjaHVua09mZnNldF07CiAgICAgICAgfTsKICAgICAgICBMYXp5VWludDhBcnJheS5wcm90b3R5cGUuc2V0RGF0YUdldHRlciA9IGZ1bmN0aW9uIExhenlVaW50OEFycmF5X3NldERhdGFHZXR0ZXIoZ2V0dGVyKSB7CiAgICAgICAgICB0aGlzLmdldHRlciA9IGdldHRlcjsKICAgICAgICB9OwogICAgICAgIExhenlVaW50OEFycmF5LnByb3RvdHlwZS5jYWNoZUxlbmd0aCA9IGZ1bmN0aW9uIExhenlVaW50OEFycmF5X2NhY2hlTGVuZ3RoKCkgewogICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgeGhyLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKTsKICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgaWYgKCEoKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHx8IHhoci5zdGF0dXMgPT09IDMwNCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIgKyB1cmwgKyAnLiBTdGF0dXM6ICcgKyB4aHIuc3RhdHVzKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBkYXRhbGVuZ3RoID0gTnVtYmVyKHhoci5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1sZW5ndGgnKSk7CiAgICAgICAgICB2YXIgaGVhZGVyOwogICAgICAgICAgdmFyIGhhc0J5dGVTZXJ2aW5nID0gKGhlYWRlciA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignQWNjZXB0LVJhbmdlcycpKSAmJiBoZWFkZXIgPT09ICdieXRlcyc7CiAgICAgICAgICB2YXIgdXNlc0d6aXAgPSAoaGVhZGVyID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LUVuY29kaW5nJykpICYmIGhlYWRlciA9PT0gJ2d6aXAnOwogICAgICAgICAgdmFyIGNodW5rU2l6ZSA9IDEwMjQgKiAxMDI0OwogICAgICAgICAgaWYgKCFoYXNCeXRlU2VydmluZykgewogICAgICAgICAgICBjaHVua1NpemUgPSBkYXRhbGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGRvWEhSID0gKGZyb20sIHRvKSA9PiB7CiAgICAgICAgICAgIGlmIChmcm9tID4gdG8pIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmFuZ2UgKCcgKyBmcm9tICsgJywgJyArIHRvICsgJykgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkIScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0byA+IGRhdGFsZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbmx5ICcgKyBkYXRhbGVuZ3RoICsgJyBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICB4aHIub3BlbignR0VUJywgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgIGlmIChkYXRhbGVuZ3RoICE9PSBjaHVua1NpemUpIHsKICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignUmFuZ2UnLCAnYnl0ZXM9JyArIGZyb20gKyAnLScgKyB0byk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7CiAgICAgICAgICAgIGlmICh4aHIub3ZlcnJpZGVNaW1lVHlwZSkgewogICAgICAgICAgICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L3BsYWluOyBjaGFyc2V0PXgtdXNlci1kZWZpbmVkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgIGlmICghKCh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwKSB8fCB4aHIuc3RhdHVzID09PSAzMDQpKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIgKyB1cmwgKyAnLiBTdGF0dXM6ICcgKyB4aHIuc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoeGhyLnJlc3BvbnNlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlIHx8IFtdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaW50QXJyYXlGcm9tU3RyaW5nKHhoci5yZXNwb25zZVRleHQgfHwgJycsIHRydWUpOwogICAgICAgICAgfTsKICAgICAgICAgIHZhciBsYXp5QXJyYXkgPSB0aGlzOwogICAgICAgICAgbGF6eUFycmF5LnNldERhdGFHZXR0ZXIoKGNodW5rTnVtKSA9PiB7CiAgICAgICAgICAgIHZhciBzdGFydCA9IGNodW5rTnVtICogY2h1bmtTaXplOwogICAgICAgICAgICB2YXIgZW5kID0gKGNodW5rTnVtICsgMSkgKiBjaHVua1NpemUgLSAxOwogICAgICAgICAgICBlbmQgPSBNYXRoLm1pbihlbmQsIGRhdGFsZW5ndGggLSAxKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBsYXp5QXJyYXkuY2h1bmtzW2NodW5rTnVtXSA9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dID0gZG9YSFIoc3RhcnQsIGVuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBsYXp5QXJyYXkuY2h1bmtzW2NodW5rTnVtXSA9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9YSFIgZmFpbGVkIScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBsYXp5QXJyYXkuY2h1bmtzW2NodW5rTnVtXTsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHVzZXNHemlwIHx8ICFkYXRhbGVuZ3RoKSB7CiAgICAgICAgICAgIGNodW5rU2l6ZSA9IGRhdGFsZW5ndGggPSAxOwogICAgICAgICAgICBkYXRhbGVuZ3RoID0gdGhpcy5nZXR0ZXIoMCkubGVuZ3RoOwogICAgICAgICAgICBjaHVua1NpemUgPSBkYXRhbGVuZ3RoOwogICAgICAgICAgICBvdXQoJ0xhenlGaWxlcyBvbiBnemlwIGZvcmNlcyBkb3dubG9hZCBvZiB0aGUgd2hvbGUgZmlsZSB3aGVuIGxlbmd0aCBpcyBhY2Nlc3NlZCcpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fbGVuZ3RoID0gZGF0YWxlbmd0aDsKICAgICAgICAgIHRoaXMuX2NodW5rU2l6ZSA9IGNodW5rU2l6ZTsKICAgICAgICAgIHRoaXMubGVuZ3RoS25vd24gPSB0cnVlOwogICAgICAgIH07CiAgICAgICAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgaWYgKCFFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgdGhyb3cgJ0Nhbm5vdCBkbyBzeW5jaHJvbm91cyBiaW5hcnkgWEhScyBvdXRzaWRlIHdlYndvcmtlcnMgaW4gbW9kZXJuIGJyb3dzZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2MnOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGxhenlBcnJheSA9IG5ldyBMYXp5VWludDhBcnJheSgpOwogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGF6eUFycmF5LCB7CiAgICAgICAgICAgIGxlbmd0aDogewogICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmxlbmd0aEtub3duKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVMZW5ndGgoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9sZW5ndGg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBjaHVua1NpemU6IHsKICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5sZW5ndGhLbm93bikgewogICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlTGVuZ3RoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2h1bmtTaXplOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsgaXNEZXZpY2U6IGZhbHNlLCBjb250ZW50czogbGF6eUFycmF5IH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0geyBpc0RldmljZTogZmFsc2UsIHVybDogdXJsIH07CiAgICAgICAgfQogICAgICAgIHZhciBub2RlID0gRlMuY3JlYXRlRmlsZShwYXJlbnQsIG5hbWUsIHByb3BlcnRpZXMsIGNhblJlYWQsIGNhbldyaXRlKTsKICAgICAgICBpZiAocHJvcGVydGllcy5jb250ZW50cykgewogICAgICAgICAgbm9kZS5jb250ZW50cyA9IHByb3BlcnRpZXMuY29udGVudHM7CiAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0aWVzLnVybCkgewogICAgICAgICAgbm9kZS5jb250ZW50cyA9IG51bGw7CiAgICAgICAgICBub2RlLnVybCA9IHByb3BlcnRpZXMudXJsOwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhub2RlLCB7CiAgICAgICAgICB1c2VkQnl0ZXM6IHsKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdmFyIHN0cmVhbV9vcHMgPSB7fTsKICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG5vZGUuc3RyZWFtX29wcyk7CiAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHsKICAgICAgICAgIHZhciBmbiA9IG5vZGUuc3RyZWFtX29wc1trZXldOwogICAgICAgICAgc3RyZWFtX29wc1trZXldID0gZnVuY3Rpb24gZm9yY2VMb2FkTGF6eUZpbGUoKSB7CiAgICAgICAgICAgIEZTLmZvcmNlTG9hZEZpbGUobm9kZSk7CiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgfTsKICAgICAgICB9KTsKICAgICAgICBmdW5jdGlvbiB3cml0ZUNodW5rcyhzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKSB7CiAgICAgICAgICB2YXIgY29udGVudHMgPSBzdHJlYW0ubm9kZS5jb250ZW50czsKICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBjb250ZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgc2l6ZSA9IE1hdGgubWluKGNvbnRlbnRzLmxlbmd0aCAtIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgICAgICAgaWYgKGNvbnRlbnRzLnNsaWNlKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCArIGldID0gY29udGVudHNbcG9zaXRpb24gKyBpXTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBjb250ZW50cy5nZXQocG9zaXRpb24gKyBpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHNpemU7CiAgICAgICAgfQogICAgICAgIHN0cmVhbV9vcHMucmVhZCA9IChzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKSA9PiB7CiAgICAgICAgICBGUy5mb3JjZUxvYWRGaWxlKG5vZGUpOwogICAgICAgICAgcmV0dXJuIHdyaXRlQ2h1bmtzKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pOwogICAgICAgIH07CiAgICAgICAgc3RyZWFtX29wcy5tbWFwID0gKHN0cmVhbSwgbGVuZ3RoLCBwb3NpdGlvbiwgcHJvdCwgZmxhZ3MpID0+IHsKICAgICAgICAgIEZTLmZvcmNlTG9hZEZpbGUobm9kZSk7CiAgICAgICAgICB2YXIgcHRyID0gbW1hcEFsbG9jKGxlbmd0aCk7CiAgICAgICAgICBpZiAoIXB0cikgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0OCk7CiAgICAgICAgICB9CiAgICAgICAgICB3cml0ZUNodW5rcyhzdHJlYW0sIEhFQVA4LCBwdHIsIGxlbmd0aCwgcG9zaXRpb24pOwogICAgICAgICAgcmV0dXJuIHsgcHRyOiBwdHIsIGFsbG9jYXRlZDogdHJ1ZSB9OwogICAgICAgIH07CiAgICAgICAgbm9kZS5zdHJlYW1fb3BzID0gc3RyZWFtX29wczsKICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgfTsKICAgIHZhciBVVEY4VG9TdHJpbmcgPSAocHRyLCBtYXhCeXRlc1RvUmVhZCkgPT4gKHB0ciA/IFVURjhBcnJheVRvU3RyaW5nKEhFQVBVOCwgcHRyLCBtYXhCeXRlc1RvUmVhZCkgOiAnJyk7CiAgICB2YXIgU1lTQ0FMTFMgPSB7CiAgICAgIERFRkFVTFRfUE9MTE1BU0s6IDUsCiAgICAgIGNhbGN1bGF0ZUF0KGRpcmZkLCBwYXRoLCBhbGxvd0VtcHR5KSB7CiAgICAgICAgaWYgKFBBVEguaXNBYnMocGF0aCkpIHsKICAgICAgICAgIHJldHVybiBwYXRoOwogICAgICAgIH0KICAgICAgICB2YXIgZGlyOwogICAgICAgIGlmIChkaXJmZCA9PT0gLTEwMCkgewogICAgICAgICAgZGlyID0gRlMuY3dkKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBkaXJzdHJlYW0gPSBTWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoZGlyZmQpOwogICAgICAgICAgZGlyID0gZGlyc3RyZWFtLnBhdGg7CiAgICAgICAgfQogICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICBpZiAoIWFsbG93RW1wdHkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGRpcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFBBVEguam9pbjIoZGlyLCBwYXRoKTsKICAgICAgfSwKICAgICAgZG9TdGF0KGZ1bmMsIHBhdGgsIGJ1ZikgewogICAgICAgIHZhciBzdGF0ID0gZnVuYyhwYXRoKTsKICAgICAgICBIRUFQMzJbYnVmID4+IDJdID0gc3RhdC5kZXY7CiAgICAgICAgSEVBUDMyWyhidWYgKyA0KSA+PiAyXSA9IHN0YXQubW9kZTsKICAgICAgICBIRUFQVTMyWyhidWYgKyA4KSA+PiAyXSA9IHN0YXQubmxpbms7CiAgICAgICAgSEVBUDMyWyhidWYgKyAxMikgPj4gMl0gPSBzdGF0LnVpZDsKICAgICAgICBIRUFQMzJbKGJ1ZiArIDE2KSA+PiAyXSA9IHN0YXQuZ2lkOwogICAgICAgIEhFQVAzMlsoYnVmICsgMjApID4+IDJdID0gc3RhdC5yZGV2OwogICAgICAgICh0ZW1wSTY0ID0gWwogICAgICAgICAgc3RhdC5zaXplID4+PiAwLAogICAgICAgICAgKCh0ZW1wRG91YmxlID0gc3RhdC5zaXplKSwKICAgICAgICAgICtNYXRoLmFicyh0ZW1wRG91YmxlKSA+PSAxCiAgICAgICAgICAgID8gdGVtcERvdWJsZSA+IDAKICAgICAgICAgICAgICA/ICtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSA+Pj4gMAogICAgICAgICAgICAgIDogfn4rTWF0aC5jZWlsKCh0ZW1wRG91YmxlIC0gKyh+fnRlbXBEb3VibGUgPj4+IDApKSAvIDQyOTQ5NjcyOTYpID4+PiAwCiAgICAgICAgICAgIDogMCkKICAgICAgICBdKSwKICAgICAgICAgIChIRUFQMzJbKGJ1ZiArIDI0KSA+PiAyXSA9IHRlbXBJNjRbMF0pLAogICAgICAgICAgKEhFQVAzMlsoYnVmICsgMjgpID4+IDJdID0gdGVtcEk2NFsxXSk7CiAgICAgICAgSEVBUDMyWyhidWYgKyAzMikgPj4gMl0gPSA0MDk2OwogICAgICAgIEhFQVAzMlsoYnVmICsgMzYpID4+IDJdID0gc3RhdC5ibG9ja3M7CiAgICAgICAgdmFyIGF0aW1lID0gc3RhdC5hdGltZS5nZXRUaW1lKCk7CiAgICAgICAgdmFyIG10aW1lID0gc3RhdC5tdGltZS5nZXRUaW1lKCk7CiAgICAgICAgdmFyIGN0aW1lID0gc3RhdC5jdGltZS5nZXRUaW1lKCk7CiAgICAgICAgKHRlbXBJNjQgPSBbCiAgICAgICAgICBNYXRoLmZsb29yKGF0aW1lIC8gMWUzKSA+Pj4gMCwKICAgICAgICAgICgodGVtcERvdWJsZSA9IE1hdGguZmxvb3IoYXRpbWUgLyAxZTMpKSwKICAgICAgICAgICtNYXRoLmFicyh0ZW1wRG91YmxlKSA+PSAxCiAgICAgICAgICAgID8gdGVtcERvdWJsZSA+IDAKICAgICAgICAgICAgICA/ICtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSA+Pj4gMAogICAgICAgICAgICAgIDogfn4rTWF0aC5jZWlsKCh0ZW1wRG91YmxlIC0gKyh+fnRlbXBEb3VibGUgPj4+IDApKSAvIDQyOTQ5NjcyOTYpID4+PiAwCiAgICAgICAgICAgIDogMCkKICAgICAgICBdKSwKICAgICAgICAgIChIRUFQMzJbKGJ1ZiArIDQwKSA+PiAyXSA9IHRlbXBJNjRbMF0pLAogICAgICAgICAgKEhFQVAzMlsoYnVmICsgNDQpID4+IDJdID0gdGVtcEk2NFsxXSk7CiAgICAgICAgSEVBUFUzMlsoYnVmICsgNDgpID4+IDJdID0gKGF0aW1lICUgMWUzKSAqIDFlMzsKICAgICAgICAodGVtcEk2NCA9IFsKICAgICAgICAgIE1hdGguZmxvb3IobXRpbWUgLyAxZTMpID4+PiAwLAogICAgICAgICAgKCh0ZW1wRG91YmxlID0gTWF0aC5mbG9vcihtdGltZSAvIDFlMykpLAogICAgICAgICAgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEKICAgICAgICAgICAgPyB0ZW1wRG91YmxlID4gMAogICAgICAgICAgICAgID8gK01hdGguZmxvb3IodGVtcERvdWJsZSAvIDQyOTQ5NjcyOTYpID4+PiAwCiAgICAgICAgICAgICAgOiB+fitNYXRoLmNlaWwoKHRlbXBEb3VibGUgLSArKH5+dGVtcERvdWJsZSA+Pj4gMCkpIC8gNDI5NDk2NzI5NikgPj4+IDAKICAgICAgICAgICAgOiAwKQogICAgICAgIF0pLAogICAgICAgICAgKEhFQVAzMlsoYnVmICsgNTYpID4+IDJdID0gdGVtcEk2NFswXSksCiAgICAgICAgICAoSEVBUDMyWyhidWYgKyA2MCkgPj4gMl0gPSB0ZW1wSTY0WzFdKTsKICAgICAgICBIRUFQVTMyWyhidWYgKyA2NCkgPj4gMl0gPSAobXRpbWUgJSAxZTMpICogMWUzOwogICAgICAgICh0ZW1wSTY0ID0gWwogICAgICAgICAgTWF0aC5mbG9vcihjdGltZSAvIDFlMykgPj4+IDAsCiAgICAgICAgICAoKHRlbXBEb3VibGUgPSBNYXRoLmZsb29yKGN0aW1lIC8gMWUzKSksCiAgICAgICAgICArTWF0aC5hYnModGVtcERvdWJsZSkgPj0gMQogICAgICAgICAgICA/IHRlbXBEb3VibGUgPiAwCiAgICAgICAgICAgICAgPyArTWF0aC5mbG9vcih0ZW1wRG91YmxlIC8gNDI5NDk2NzI5NikgPj4+IDAKICAgICAgICAgICAgICA6IH5+K01hdGguY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMAogICAgICAgICAgICA6IDApCiAgICAgICAgXSksCiAgICAgICAgICAoSEVBUDMyWyhidWYgKyA3MikgPj4gMl0gPSB0ZW1wSTY0WzBdKSwKICAgICAgICAgIChIRUFQMzJbKGJ1ZiArIDc2KSA+PiAyXSA9IHRlbXBJNjRbMV0pOwogICAgICAgIEhFQVBVMzJbKGJ1ZiArIDgwKSA+PiAyXSA9IChjdGltZSAlIDFlMykgKiAxZTM7CiAgICAgICAgKHRlbXBJNjQgPSBbCiAgICAgICAgICBzdGF0LmlubyA+Pj4gMCwKICAgICAgICAgICgodGVtcERvdWJsZSA9IHN0YXQuaW5vKSwKICAgICAgICAgICtNYXRoLmFicyh0ZW1wRG91YmxlKSA+PSAxCiAgICAgICAgICAgID8gdGVtcERvdWJsZSA+IDAKICAgICAgICAgICAgICA/ICtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSA+Pj4gMAogICAgICAgICAgICAgIDogfn4rTWF0aC5jZWlsKCh0ZW1wRG91YmxlIC0gKyh+fnRlbXBEb3VibGUgPj4+IDApKSAvIDQyOTQ5NjcyOTYpID4+PiAwCiAgICAgICAgICAgIDogMCkKICAgICAgICBdKSwKICAgICAgICAgIChIRUFQMzJbKGJ1ZiArIDg4KSA+PiAyXSA9IHRlbXBJNjRbMF0pLAogICAgICAgICAgKEhFQVAzMlsoYnVmICsgOTIpID4+IDJdID0gdGVtcEk2NFsxXSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0sCiAgICAgIGRvTXN5bmMoYWRkciwgc3RyZWFtLCBsZW4sIGZsYWdzLCBvZmZzZXQpIHsKICAgICAgICBpZiAoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDMpOwogICAgICAgIH0KICAgICAgICBpZiAoZmxhZ3MgJiAyKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgdmFyIGJ1ZmZlciA9IEhFQVBVOC5zbGljZShhZGRyLCBhZGRyICsgbGVuKTsKICAgICAgICBGUy5tc3luYyhzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW4sIGZsYWdzKTsKICAgICAgfSwKICAgICAgdmFyYXJnczogdW5kZWZpbmVkLAogICAgICBnZXQoKSB7CiAgICAgICAgdmFyIHJldCA9IEhFQVAzMlsrU1lTQ0FMTFMudmFyYXJncyA+PiAyXTsKICAgICAgICBTWVNDQUxMUy52YXJhcmdzICs9IDQ7CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfSwKICAgICAgZ2V0cCgpIHsKICAgICAgICByZXR1cm4gU1lTQ0FMTFMuZ2V0KCk7CiAgICAgIH0sCiAgICAgIGdldFN0cihwdHIpIHsKICAgICAgICB2YXIgcmV0ID0gVVRGOFRvU3RyaW5nKHB0cik7CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfSwKICAgICAgZ2V0U3RyZWFtRnJvbUZEKGZkKSB7CiAgICAgICAgdmFyIHN0cmVhbSA9IEZTLmdldFN0cmVhbUNoZWNrZWQoZmQpOwogICAgICAgIHJldHVybiBzdHJlYW07CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBfX19zeXNjYWxsX2ZjbnRsNjQoZmQsIGNtZCwgdmFyYXJncykgewogICAgICBTWVNDQUxMUy52YXJhcmdzID0gdmFyYXJnczsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgc3RyZWFtID0gU1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTsKICAgICAgICBzd2l0Y2ggKGNtZCkgewogICAgICAgICAgY2FzZSAwOiB7CiAgICAgICAgICAgIHZhciBhcmcgPSBTWVNDQUxMUy5nZXQoKTsKICAgICAgICAgICAgaWYgKGFyZyA8IDApIHsKICAgICAgICAgICAgICByZXR1cm4gLTI4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChGUy5zdHJlYW1zW2FyZ10pIHsKICAgICAgICAgICAgICBhcmcrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbmV3U3RyZWFtOwogICAgICAgICAgICBuZXdTdHJlYW0gPSBGUy5jcmVhdGVTdHJlYW0oc3RyZWFtLCBhcmcpOwogICAgICAgICAgICByZXR1cm4gbmV3U3RyZWFtLmZkOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5mbGFnczsKICAgICAgICAgIGNhc2UgNDogewogICAgICAgICAgICB2YXIgYXJnID0gU1lTQ0FMTFMuZ2V0KCk7CiAgICAgICAgICAgIHN0cmVhbS5mbGFncyB8PSBhcmc7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAxMjogewogICAgICAgICAgICB2YXIgYXJnID0gU1lTQ0FMTFMuZ2V0cCgpOwogICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDsKICAgICAgICAgICAgSEVBUDE2WyhhcmcgKyBvZmZzZXQpID4+IDFdID0gMjsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMjg7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAodHlwZW9mIEZTID09ICd1bmRlZmluZWQnIHx8ICEoZS5uYW1lID09PSAnRXJybm9FcnJvcicpKSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLWUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9fX3N5c2NhbGxfZnN0YXQ2NChmZCwgYnVmKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHN0cmVhbSA9IFNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7CiAgICAgICAgcmV0dXJuIFNZU0NBTExTLmRvU3RhdChGUy5zdGF0LCBzdHJlYW0ucGF0aCwgYnVmKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gJ3VuZGVmaW5lZCcgfHwgIShlLm5hbWUgPT09ICdFcnJub0Vycm9yJykpIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtZS5lcnJubzsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gX19fc3lzY2FsbF9pb2N0bChmZCwgb3AsIHZhcmFyZ3MpIHsKICAgICAgU1lTQ0FMTFMudmFyYXJncyA9IHZhcmFyZ3M7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHN0cmVhbSA9IFNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7CiAgICAgICAgc3dpdGNoIChvcCkgewogICAgICAgICAgY2FzZSAyMTUwOTogewogICAgICAgICAgICBpZiAoIXN0cmVhbS50dHkpIHsKICAgICAgICAgICAgICByZXR1cm4gLTU5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyMTUwNTogewogICAgICAgICAgICBpZiAoIXN0cmVhbS50dHkpIHsKICAgICAgICAgICAgICByZXR1cm4gLTU5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW0udHR5Lm9wcy5pb2N0bF90Y2dldHMpIHsKICAgICAgICAgICAgICB2YXIgdGVybWlvcyA9IHN0cmVhbS50dHkub3BzLmlvY3RsX3RjZ2V0cyhzdHJlYW0pOwogICAgICAgICAgICAgIHZhciBhcmdwID0gU1lTQ0FMTFMuZ2V0cCgpOwogICAgICAgICAgICAgIEhFQVAzMlthcmdwID4+IDJdID0gdGVybWlvcy5jX2lmbGFnIHx8IDA7CiAgICAgICAgICAgICAgSEVBUDMyWyhhcmdwICsgNCkgPj4gMl0gPSB0ZXJtaW9zLmNfb2ZsYWcgfHwgMDsKICAgICAgICAgICAgICBIRUFQMzJbKGFyZ3AgKyA4KSA+PiAyXSA9IHRlcm1pb3MuY19jZmxhZyB8fCAwOwogICAgICAgICAgICAgIEhFQVAzMlsoYXJncCArIDEyKSA+PiAyXSA9IHRlcm1pb3MuY19sZmxhZyB8fCAwOwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKykgewogICAgICAgICAgICAgICAgSEVBUDhbKGFyZ3AgKyBpICsgMTcpID4+IDBdID0gdGVybWlvcy5jX2NjW2ldIHx8IDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyMTUxMDoKICAgICAgICAgIGNhc2UgMjE1MTE6CiAgICAgICAgICBjYXNlIDIxNTEyOiB7CiAgICAgICAgICAgIGlmICghc3RyZWFtLnR0eSkgewogICAgICAgICAgICAgIHJldHVybiAtNTk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDIxNTA2OgogICAgICAgICAgY2FzZSAyMTUwNzoKICAgICAgICAgIGNhc2UgMjE1MDg6IHsKICAgICAgICAgICAgaWYgKCFzdHJlYW0udHR5KSB7CiAgICAgICAgICAgICAgcmV0dXJuIC01OTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyZWFtLnR0eS5vcHMuaW9jdGxfdGNzZXRzKSB7CiAgICAgICAgICAgICAgdmFyIGFyZ3AgPSBTWVNDQUxMUy5nZXRwKCk7CiAgICAgICAgICAgICAgdmFyIGNfaWZsYWcgPSBIRUFQMzJbYXJncCA+PiAyXTsKICAgICAgICAgICAgICB2YXIgY19vZmxhZyA9IEhFQVAzMlsoYXJncCArIDQpID4+IDJdOwogICAgICAgICAgICAgIHZhciBjX2NmbGFnID0gSEVBUDMyWyhhcmdwICsgOCkgPj4gMl07CiAgICAgICAgICAgICAgdmFyIGNfbGZsYWcgPSBIRUFQMzJbKGFyZ3AgKyAxMikgPj4gMl07CiAgICAgICAgICAgICAgdmFyIGNfY2MgPSBbXTsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDMyOyBpKyspIHsKICAgICAgICAgICAgICAgIGNfY2MucHVzaChIRUFQOFsoYXJncCArIGkgKyAxNykgPj4gMF0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtLnR0eS5vcHMuaW9jdGxfdGNzZXRzKHN0cmVhbS50dHksIG9wLCB7CiAgICAgICAgICAgICAgICBjX2lmbGFnOiBjX2lmbGFnLAogICAgICAgICAgICAgICAgY19vZmxhZzogY19vZmxhZywKICAgICAgICAgICAgICAgIGNfY2ZsYWc6IGNfY2ZsYWcsCiAgICAgICAgICAgICAgICBjX2xmbGFnOiBjX2xmbGFnLAogICAgICAgICAgICAgICAgY19jYzogY19jYwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyMTUxOTogewogICAgICAgICAgICBpZiAoIXN0cmVhbS50dHkpIHsKICAgICAgICAgICAgICByZXR1cm4gLTU5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhcmdwID0gU1lTQ0FMTFMuZ2V0cCgpOwogICAgICAgICAgICBIRUFQMzJbYXJncCA+PiAyXSA9IDA7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyMTUyMDogewogICAgICAgICAgICBpZiAoIXN0cmVhbS50dHkpIHsKICAgICAgICAgICAgICByZXR1cm4gLTU5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAtMjg7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDIxNTMxOiB7CiAgICAgICAgICAgIHZhciBhcmdwID0gU1lTQ0FMTFMuZ2V0cCgpOwogICAgICAgICAgICByZXR1cm4gRlMuaW9jdGwoc3RyZWFtLCBvcCwgYXJncCk7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDIxNTIzOiB7CiAgICAgICAgICAgIGlmICghc3RyZWFtLnR0eSkgewogICAgICAgICAgICAgIHJldHVybiAtNTk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cmVhbS50dHkub3BzLmlvY3RsX3Rpb2Nnd2luc3opIHsKICAgICAgICAgICAgICB2YXIgd2luc2l6ZSA9IHN0cmVhbS50dHkub3BzLmlvY3RsX3Rpb2Nnd2luc3ooc3RyZWFtLnR0eSk7CiAgICAgICAgICAgICAgdmFyIGFyZ3AgPSBTWVNDQUxMUy5nZXRwKCk7CiAgICAgICAgICAgICAgSEVBUDE2W2FyZ3AgPj4gMV0gPSB3aW5zaXplWzBdOwogICAgICAgICAgICAgIEhFQVAxNlsoYXJncCArIDIpID4+IDFdID0gd2luc2l6ZVsxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMjE1MjQ6IHsKICAgICAgICAgICAgaWYgKCFzdHJlYW0udHR5KSB7CiAgICAgICAgICAgICAgcmV0dXJuIC01OTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMjE1MTU6IHsKICAgICAgICAgICAgaWYgKCFzdHJlYW0udHR5KSB7CiAgICAgICAgICAgICAgcmV0dXJuIC01OTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAtMjg7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAndW5kZWZpbmVkJyB8fCAhKGUubmFtZSA9PT0gJ0Vycm5vRXJyb3InKSkgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC1lLmVycm5vOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfX19zeXNjYWxsX2xzdGF0NjQocGF0aCwgYnVmKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcGF0aCA9IFNZU0NBTExTLmdldFN0cihwYXRoKTsKICAgICAgICByZXR1cm4gU1lTQ0FMTFMuZG9TdGF0KEZTLmxzdGF0LCBwYXRoLCBidWYpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAndW5kZWZpbmVkJyB8fCAhKGUubmFtZSA9PT0gJ0Vycm5vRXJyb3InKSkgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC1lLmVycm5vOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfX19zeXNjYWxsX25ld2ZzdGF0YXQoZGlyZmQsIHBhdGgsIGJ1ZiwgZmxhZ3MpIHsKICAgICAgdHJ5IHsKICAgICAgICBwYXRoID0gU1lTQ0FMTFMuZ2V0U3RyKHBhdGgpOwogICAgICAgIHZhciBub2ZvbGxvdyA9IGZsYWdzICYgMjU2OwogICAgICAgIHZhciBhbGxvd0VtcHR5ID0gZmxhZ3MgJiA0MDk2OwogICAgICAgIGZsYWdzID0gZmxhZ3MgJiB+NjQwMDsKICAgICAgICBwYXRoID0gU1lTQ0FMTFMuY2FsY3VsYXRlQXQoZGlyZmQsIHBhdGgsIGFsbG93RW1wdHkpOwogICAgICAgIHJldHVybiBTWVNDQUxMUy5kb1N0YXQobm9mb2xsb3cgPyBGUy5sc3RhdCA6IEZTLnN0YXQsIHBhdGgsIGJ1Zik7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAodHlwZW9mIEZTID09ICd1bmRlZmluZWQnIHx8ICEoZS5uYW1lID09PSAnRXJybm9FcnJvcicpKSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLWUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9fX3N5c2NhbGxfb3BlbmF0KGRpcmZkLCBwYXRoLCBmbGFncywgdmFyYXJncykgewogICAgICBTWVNDQUxMUy52YXJhcmdzID0gdmFyYXJnczsKICAgICAgdHJ5IHsKICAgICAgICBwYXRoID0gU1lTQ0FMTFMuZ2V0U3RyKHBhdGgpOwogICAgICAgIHBhdGggPSBTWVNDQUxMUy5jYWxjdWxhdGVBdChkaXJmZCwgcGF0aCk7CiAgICAgICAgdmFyIG1vZGUgPSB2YXJhcmdzID8gU1lTQ0FMTFMuZ2V0KCkgOiAwOwogICAgICAgIHJldHVybiBGUy5vcGVuKHBhdGgsIGZsYWdzLCBtb2RlKS5mZDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gJ3VuZGVmaW5lZCcgfHwgIShlLm5hbWUgPT09ICdFcnJub0Vycm9yJykpIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtZS5lcnJubzsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gX19fc3lzY2FsbF9zdGF0NjQocGF0aCwgYnVmKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcGF0aCA9IFNZU0NBTExTLmdldFN0cihwYXRoKTsKICAgICAgICByZXR1cm4gU1lTQ0FMTFMuZG9TdGF0KEZTLnN0YXQsIHBhdGgsIGJ1Zik7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAodHlwZW9mIEZTID09ICd1bmRlZmluZWQnIHx8ICEoZS5uYW1lID09PSAnRXJybm9FcnJvcicpKSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLWUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIHZhciBub3dJc01vbm90b25pYyA9IDE7CiAgICB2YXIgX19lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljID0gKCkgPT4gbm93SXNNb25vdG9uaWM7CiAgICB2YXIgX19lbXNjcmlwdGVuX3Rocm93X2xvbmdqbXAgPSAoKSA9PiB7CiAgICAgIHRocm93IEluZmluaXR5OwogICAgfTsKICAgIHZhciBfYWJvcnQgPSAoKSA9PiB7CiAgICAgIGFib3J0KCcnKTsKICAgIH07CiAgICB2YXIgX2Vtc2NyaXB0ZW5fZGF0ZV9ub3cgPSAoKSA9PiBEYXRlLm5vdygpOwogICAgdmFyIGdldEhlYXBNYXggPSAoKSA9PiAyMTQ3NDgzNjQ4OwogICAgdmFyIF9lbXNjcmlwdGVuX2dldF9oZWFwX21heCA9ICgpID0+IGdldEhlYXBNYXgoKTsKICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93OwogICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9ICgpID0+IHBlcmZvcm1hbmNlLm5vdygpOwogICAgdmFyIF9lbXNjcmlwdGVuX21lbWNweV9qcyA9IChkZXN0LCBzcmMsIG51bSkgPT4gSEVBUFU4LmNvcHlXaXRoaW4oZGVzdCwgc3JjLCBzcmMgKyBudW0pOwogICAgdmFyIGdyb3dNZW1vcnkgPSAoc2l6ZSkgPT4gewogICAgICB2YXIgYiA9IHdhc21NZW1vcnkuYnVmZmVyOwogICAgICB2YXIgcGFnZXMgPSAoc2l6ZSAtIGIuYnl0ZUxlbmd0aCArIDY1NTM1KSAvIDY1NTM2OwogICAgICB0cnkgewogICAgICAgIHdhc21NZW1vcnkuZ3JvdyhwYWdlcyk7CiAgICAgICAgdXBkYXRlTWVtb3J5Vmlld3MoKTsKICAgICAgICByZXR1cm4gMTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgIH07CiAgICB2YXIgX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAgPSAocmVxdWVzdGVkU2l6ZSkgPT4gewogICAgICB2YXIgb2xkU2l6ZSA9IEhFQVBVOC5sZW5ndGg7CiAgICAgIHJlcXVlc3RlZFNpemUgPj4+PSAwOwogICAgICB2YXIgbWF4SGVhcFNpemUgPSBnZXRIZWFwTWF4KCk7CiAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGFsaWduVXAgPSAoeCwgbXVsdGlwbGUpID0+IHggKyAoKG11bHRpcGxlIC0gKHggJSBtdWx0aXBsZSkpICUgbXVsdGlwbGUpOwogICAgICBmb3IgKHZhciBjdXREb3duID0gMTsgY3V0RG93biA8PSA0OyBjdXREb3duICo9IDIpIHsKICAgICAgICB2YXIgb3Zlckdyb3duSGVhcFNpemUgPSBvbGRTaXplICsgNDE5NDMwNCAvIGN1dERvd247CiAgICAgICAgdmFyIG5ld1NpemUgPSBNYXRoLm1pbihtYXhIZWFwU2l6ZSwgYWxpZ25VcChNYXRoLm1heChyZXF1ZXN0ZWRTaXplLCBvdmVyR3Jvd25IZWFwU2l6ZSksIDY1NTM2KSk7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZ3Jvd01lbW9yeShuZXdTaXplKTsKICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgdmFyIEVOViA9IHt9OwogICAgdmFyIGdldEV4ZWN1dGFibGVOYW1lID0gKCkgPT4gdGhpc1Byb2dyYW0gfHwgJy4vdGhpcy5wcm9ncmFtJzsKICAgIHZhciBnZXRFbnZTdHJpbmdzID0gKCkgPT4gewogICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgIHZhciBsYW5nID0KICAgICAgICAgICgodHlwZW9mIG5hdmlnYXRvciA9PSAnb2JqZWN0JyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0pIHx8ICdDJykucmVwbGFjZSgnLScsICdfJykgKwogICAgICAgICAgJy5VVEYtOCc7CiAgICAgICAgdmFyIGVudiA9IHsKICAgICAgICAgIFVTRVI6ICd3ZWJfdXNlcicsCiAgICAgICAgICBMT0dOQU1FOiAnd2ViX3VzZXInLAogICAgICAgICAgUEFUSDogJy8nLAogICAgICAgICAgUFdEOiAnLycsCiAgICAgICAgICBIT01FOiAnL2hvbWUvd2ViX3VzZXInLAogICAgICAgICAgTEFORzogbGFuZywKICAgICAgICAgIF86IGdldEV4ZWN1dGFibGVOYW1lKCkKICAgICAgICB9OwogICAgICAgIGZvciAodmFyIHggaW4gRU5WKSB7CiAgICAgICAgICBpZiAoRU5WW3hdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgZGVsZXRlIGVudlt4XTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVudlt4XSA9IEVOVlt4XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHN0cmluZ3MgPSBbXTsKICAgICAgICBmb3IgKHZhciB4IGluIGVudikgewogICAgICAgICAgc3RyaW5ncy5wdXNoKGAke3h9PSR7ZW52W3hdfWApOwogICAgICAgIH0KICAgICAgICBnZXRFbnZTdHJpbmdzLnN0cmluZ3MgPSBzdHJpbmdzOwogICAgICB9CiAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICB9OwogICAgdmFyIHN0cmluZ1RvQXNjaWkgPSAoc3RyLCBidWZmZXIpID0+IHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICBIRUFQOFtidWZmZXIrKyA+PiAwXSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICB9CiAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICB9OwogICAgdmFyIF9lbnZpcm9uX2dldCA9IChfX2Vudmlyb24sIGVudmlyb25fYnVmKSA9PiB7CiAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgZ2V0RW52U3RyaW5ncygpLmZvckVhY2goKHN0cmluZywgaSkgPT4gewogICAgICAgIHZhciBwdHIgPSBlbnZpcm9uX2J1ZiArIGJ1ZlNpemU7CiAgICAgICAgSEVBUFUzMlsoX19lbnZpcm9uICsgaSAqIDQpID4+IDJdID0gcHRyOwogICAgICAgIHN0cmluZ1RvQXNjaWkoc3RyaW5nLCBwdHIpOwogICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgIH0pOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICB2YXIgX2Vudmlyb25fc2l6ZXNfZ2V0ID0gKHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgPT4gewogICAgICB2YXIgc3RyaW5ncyA9IGdldEVudlN0cmluZ3MoKTsKICAgICAgSEVBUFUzMltwZW52aXJvbl9jb3VudCA+PiAyXSA9IHN0cmluZ3MubGVuZ3RoOwogICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgIHN0cmluZ3MuZm9yRWFjaCgoc3RyaW5nKSA9PiAoYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMSkpOwogICAgICBIRUFQVTMyW3BlbnZpcm9uX2J1Zl9zaXplID4+IDJdID0gYnVmU2l6ZTsKICAgICAgcmV0dXJuIDA7CiAgICB9OwogICAgdmFyIHJ1bnRpbWVLZWVwYWxpdmVDb3VudGVyID0gMDsKICAgIHZhciBrZWVwUnVudGltZUFsaXZlID0gKCkgPT4gbm9FeGl0UnVudGltZSB8fCBydW50aW1lS2VlcGFsaXZlQ291bnRlciA+IDA7CiAgICB2YXIgX3Byb2NfZXhpdCA9IChjb2RlKSA9PiB7CiAgICAgIEVYSVRTVEFUVVMgPSBjb2RlOwogICAgICBpZiAoIWtlZXBSdW50aW1lQWxpdmUoKSkgewogICAgICAgIE1vZHVsZVsnb25FeGl0J10/Lihjb2RlKTsKICAgICAgICBBQk9SVCA9IHRydWU7CiAgICAgIH0KICAgICAgcXVpdF8oY29kZSwgbmV3IEV4aXRTdGF0dXMoY29kZSkpOwogICAgfTsKICAgIHZhciBleGl0SlMgPSAoc3RhdHVzLCBpbXBsaWNpdCkgPT4gewogICAgICBFWElUU1RBVFVTID0gc3RhdHVzOwogICAgICBfcHJvY19leGl0KHN0YXR1cyk7CiAgICB9OwogICAgdmFyIF9leGl0ID0gZXhpdEpTOwogICAgZnVuY3Rpb24gX2ZkX2Nsb3NlKGZkKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHN0cmVhbSA9IFNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7CiAgICAgICAgRlMuY2xvc2Uoc3RyZWFtKTsKICAgICAgICByZXR1cm4gMDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gJ3VuZGVmaW5lZCcgfHwgIShlLm5hbWUgPT09ICdFcnJub0Vycm9yJykpIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlLmVycm5vOwogICAgICB9CiAgICB9CiAgICB2YXIgZG9SZWFkdiA9IChzdHJlYW0sIGlvdiwgaW92Y250LCBvZmZzZXQpID0+IHsKICAgICAgdmFyIHJldCA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKICAgICAgICB2YXIgcHRyID0gSEVBUFUzMltpb3YgPj4gMl07CiAgICAgICAgdmFyIGxlbiA9IEhFQVBVMzJbKGlvdiArIDQpID4+IDJdOwogICAgICAgIGlvdiArPSA4OwogICAgICAgIHZhciBjdXJyID0gRlMucmVhZChzdHJlYW0sIEhFQVA4LCBwdHIsIGxlbiwgb2Zmc2V0KTsKICAgICAgICBpZiAoY3VyciA8IDApIHsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgcmV0ICs9IGN1cnI7CiAgICAgICAgaWYgKGN1cnIgPCBsZW4pIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIG9mZnNldCArPSBjdXJyOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfTsKICAgIGZ1bmN0aW9uIF9mZF9yZWFkKGZkLCBpb3YsIGlvdmNudCwgcG51bSkgewogICAgICB0cnkgewogICAgICAgIHZhciBzdHJlYW0gPSBTWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoZmQpOwogICAgICAgIHZhciBudW0gPSBkb1JlYWR2KHN0cmVhbSwgaW92LCBpb3ZjbnQpOwogICAgICAgIEhFQVBVMzJbcG51bSA+PiAyXSA9IG51bTsKICAgICAgICByZXR1cm4gMDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gJ3VuZGVmaW5lZCcgfHwgIShlLm5hbWUgPT09ICdFcnJub0Vycm9yJykpIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlLmVycm5vOwogICAgICB9CiAgICB9CiAgICB2YXIgY29udmVydEkzMlBhaXJUb0k1M0NoZWNrZWQgPSAobG8sIGhpKSA9PgogICAgICAoaGkgKyAyMDk3MTUyKSA+Pj4gMCA8IDQxOTQzMDUgLSAhIWxvID8gKGxvID4+PiAwKSArIGhpICogNDI5NDk2NzI5NiA6IE5hTjsKICAgIGZ1bmN0aW9uIF9mZF9zZWVrKGZkLCBvZmZzZXRfbG93LCBvZmZzZXRfaGlnaCwgd2hlbmNlLCBuZXdPZmZzZXQpIHsKICAgICAgdmFyIG9mZnNldCA9IGNvbnZlcnRJMzJQYWlyVG9JNTNDaGVja2VkKG9mZnNldF9sb3csIG9mZnNldF9oaWdoKTsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoaXNOYU4ob2Zmc2V0KSkgewogICAgICAgICAgcmV0dXJuIDYxOwogICAgICAgIH0KICAgICAgICB2YXIgc3RyZWFtID0gU1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTsKICAgICAgICBGUy5sbHNlZWsoc3RyZWFtLCBvZmZzZXQsIHdoZW5jZSk7CiAgICAgICAgKHRlbXBJNjQgPSBbCiAgICAgICAgICBzdHJlYW0ucG9zaXRpb24gPj4+IDAsCiAgICAgICAgICAoKHRlbXBEb3VibGUgPSBzdHJlYW0ucG9zaXRpb24pLAogICAgICAgICAgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEKICAgICAgICAgICAgPyB0ZW1wRG91YmxlID4gMAogICAgICAgICAgICAgID8gK01hdGguZmxvb3IodGVtcERvdWJsZSAvIDQyOTQ5NjcyOTYpID4+PiAwCiAgICAgICAgICAgICAgOiB+fitNYXRoLmNlaWwoKHRlbXBEb3VibGUgLSArKH5+dGVtcERvdWJsZSA+Pj4gMCkpIC8gNDI5NDk2NzI5NikgPj4+IDAKICAgICAgICAgICAgOiAwKQogICAgICAgIF0pLAogICAgICAgICAgKEhFQVAzMltuZXdPZmZzZXQgPj4gMl0gPSB0ZW1wSTY0WzBdKSwKICAgICAgICAgIChIRUFQMzJbKG5ld09mZnNldCArIDQpID4+IDJdID0gdGVtcEk2NFsxXSk7CiAgICAgICAgaWYgKHN0cmVhbS5nZXRkZW50cyAmJiBvZmZzZXQgPT09IDAgJiYgd2hlbmNlID09PSAwKSB7CiAgICAgICAgICBzdHJlYW0uZ2V0ZGVudHMgPSBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gJ3VuZGVmaW5lZCcgfHwgIShlLm5hbWUgPT09ICdFcnJub0Vycm9yJykpIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlLmVycm5vOwogICAgICB9CiAgICB9CiAgICB2YXIgZG9Xcml0ZXYgPSAoc3RyZWFtLCBpb3YsIGlvdmNudCwgb2Zmc2V0KSA9PiB7CiAgICAgIHZhciByZXQgPSAwOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvdmNudDsgaSsrKSB7CiAgICAgICAgdmFyIHB0ciA9IEhFQVBVMzJbaW92ID4+IDJdOwogICAgICAgIHZhciBsZW4gPSBIRUFQVTMyWyhpb3YgKyA0KSA+PiAyXTsKICAgICAgICBpb3YgKz0gODsKICAgICAgICB2YXIgY3VyciA9IEZTLndyaXRlKHN0cmVhbSwgSEVBUDgsIHB0ciwgbGVuLCBvZmZzZXQpOwogICAgICAgIGlmIChjdXJyIDwgMCkgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICByZXQgKz0gY3VycjsKICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIG9mZnNldCArPSBjdXJyOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfTsKICAgIGZ1bmN0aW9uIF9mZF93cml0ZShmZCwgaW92LCBpb3ZjbnQsIHBudW0pIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgc3RyZWFtID0gU1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTsKICAgICAgICB2YXIgbnVtID0gZG9Xcml0ZXYoc3RyZWFtLCBpb3YsIGlvdmNudCk7CiAgICAgICAgSEVBUFUzMltwbnVtID4+IDJdID0gbnVtOwogICAgICAgIHJldHVybiAwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAndW5kZWZpbmVkJyB8fCAhKGUubmFtZSA9PT0gJ0Vycm5vRXJyb3InKSkgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIHZhciBpc0xlYXBZZWFyID0gKHllYXIpID0+IHllYXIgJSA0ID09PSAwICYmICh5ZWFyICUgMTAwICE9PSAwIHx8IHllYXIgJSA0MDAgPT09IDApOwogICAgdmFyIGFycmF5U3VtID0gKGFycmF5LCBpbmRleCkgPT4gewogICAgICB2YXIgc3VtID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gaW5kZXg7IHN1bSArPSBhcnJheVtpKytdKSB7fQogICAgICByZXR1cm4gc3VtOwogICAgfTsKICAgIHZhciBNT05USF9EQVlTX0xFQVAgPSBbMzEsIDI5LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07CiAgICB2YXIgTU9OVEhfREFZU19SRUdVTEFSID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdOwogICAgdmFyIGFkZERheXMgPSAoZGF0ZSwgZGF5cykgPT4gewogICAgICB2YXIgbmV3RGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTsKICAgICAgd2hpbGUgKGRheXMgPiAwKSB7CiAgICAgICAgdmFyIGxlYXAgPSBpc0xlYXBZZWFyKG5ld0RhdGUuZ2V0RnVsbFllYXIoKSk7CiAgICAgICAgdmFyIGN1cnJlbnRNb250aCA9IG5ld0RhdGUuZ2V0TW9udGgoKTsKICAgICAgICB2YXIgZGF5c0luQ3VycmVudE1vbnRoID0gKGxlYXAgPyBNT05USF9EQVlTX0xFQVAgOiBNT05USF9EQVlTX1JFR1VMQVIpW2N1cnJlbnRNb250aF07CiAgICAgICAgaWYgKGRheXMgPiBkYXlzSW5DdXJyZW50TW9udGggLSBuZXdEYXRlLmdldERhdGUoKSkgewogICAgICAgICAgZGF5cyAtPSBkYXlzSW5DdXJyZW50TW9udGggLSBuZXdEYXRlLmdldERhdGUoKSArIDE7CiAgICAgICAgICBuZXdEYXRlLnNldERhdGUoMSk7CiAgICAgICAgICBpZiAoY3VycmVudE1vbnRoIDwgMTEpIHsKICAgICAgICAgICAgbmV3RGF0ZS5zZXRNb250aChjdXJyZW50TW9udGggKyAxKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld0RhdGUuc2V0TW9udGgoMCk7CiAgICAgICAgICAgIG5ld0RhdGUuc2V0RnVsbFllYXIobmV3RGF0ZS5nZXRGdWxsWWVhcigpICsgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5ld0RhdGUuc2V0RGF0ZShuZXdEYXRlLmdldERhdGUoKSArIGRheXMpOwogICAgICAgICAgcmV0dXJuIG5ld0RhdGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBuZXdEYXRlOwogICAgfTsKICAgIHZhciB3cml0ZUFycmF5VG9NZW1vcnkgPSAoYXJyYXksIGJ1ZmZlcikgPT4gewogICAgICBIRUFQOC5zZXQoYXJyYXksIGJ1ZmZlcik7CiAgICB9OwogICAgdmFyIF9zdHJmdGltZSA9IChzLCBtYXhzaXplLCBmb3JtYXQsIHRtKSA9PiB7CiAgICAgIHZhciB0bV96b25lID0gSEVBUFUzMlsodG0gKyA0MCkgPj4gMl07CiAgICAgIHZhciBkYXRlID0gewogICAgICAgIHRtX3NlYzogSEVBUDMyW3RtID4+IDJdLAogICAgICAgIHRtX21pbjogSEVBUDMyWyh0bSArIDQpID4+IDJdLAogICAgICAgIHRtX2hvdXI6IEhFQVAzMlsodG0gKyA4KSA+PiAyXSwKICAgICAgICB0bV9tZGF5OiBIRUFQMzJbKHRtICsgMTIpID4+IDJdLAogICAgICAgIHRtX21vbjogSEVBUDMyWyh0bSArIDE2KSA+PiAyXSwKICAgICAgICB0bV95ZWFyOiBIRUFQMzJbKHRtICsgMjApID4+IDJdLAogICAgICAgIHRtX3dkYXk6IEhFQVAzMlsodG0gKyAyNCkgPj4gMl0sCiAgICAgICAgdG1feWRheTogSEVBUDMyWyh0bSArIDI4KSA+PiAyXSwKICAgICAgICB0bV9pc2RzdDogSEVBUDMyWyh0bSArIDMyKSA+PiAyXSwKICAgICAgICB0bV9nbXRvZmY6IEhFQVAzMlsodG0gKyAzNikgPj4gMl0sCiAgICAgICAgdG1fem9uZTogdG1fem9uZSA/IFVURjhUb1N0cmluZyh0bV96b25lKSA6ICcnCiAgICAgIH07CiAgICAgIHZhciBwYXR0ZXJuID0gVVRGOFRvU3RyaW5nKGZvcm1hdCk7CiAgICAgIHZhciBFWFBBTlNJT05fUlVMRVNfMSA9IHsKICAgICAgICAnJWMnOiAnJWEgJWIgJWQgJUg6JU06JVMgJVknLAogICAgICAgICclRCc6ICclbS8lZC8leScsCiAgICAgICAgJyVGJzogJyVZLSVtLSVkJywKICAgICAgICAnJWgnOiAnJWInLAogICAgICAgICclcic6ICclSTolTTolUyAlcCcsCiAgICAgICAgJyVSJzogJyVIOiVNJywKICAgICAgICAnJVQnOiAnJUg6JU06JVMnLAogICAgICAgICcleCc6ICclbS8lZC8leScsCiAgICAgICAgJyVYJzogJyVIOiVNOiVTJywKICAgICAgICAnJUVjJzogJyVjJywKICAgICAgICAnJUVDJzogJyVDJywKICAgICAgICAnJUV4JzogJyVtLyVkLyV5JywKICAgICAgICAnJUVYJzogJyVIOiVNOiVTJywKICAgICAgICAnJUV5JzogJyV5JywKICAgICAgICAnJUVZJzogJyVZJywKICAgICAgICAnJU9kJzogJyVkJywKICAgICAgICAnJU9lJzogJyVlJywKICAgICAgICAnJU9IJzogJyVIJywKICAgICAgICAnJU9JJzogJyVJJywKICAgICAgICAnJU9tJzogJyVtJywKICAgICAgICAnJU9NJzogJyVNJywKICAgICAgICAnJU9TJzogJyVTJywKICAgICAgICAnJU91JzogJyV1JywKICAgICAgICAnJU9VJzogJyVVJywKICAgICAgICAnJU9WJzogJyVWJywKICAgICAgICAnJU93JzogJyV3JywKICAgICAgICAnJU9XJzogJyVXJywKICAgICAgICAnJU95JzogJyV5JwogICAgICB9OwogICAgICBmb3IgKHZhciBydWxlIGluIEVYUEFOU0lPTl9SVUxFU18xKSB7CiAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZShuZXcgUmVnRXhwKHJ1bGUsICdnJyksIEVYUEFOU0lPTl9SVUxFU18xW3J1bGVdKTsKICAgICAgfQogICAgICB2YXIgV0VFS0RBWVMgPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107CiAgICAgIHZhciBNT05USFMgPSBbCiAgICAgICAgJ0phbnVhcnknLAogICAgICAgICdGZWJydWFyeScsCiAgICAgICAgJ01hcmNoJywKICAgICAgICAnQXByaWwnLAogICAgICAgICdNYXknLAogICAgICAgICdKdW5lJywKICAgICAgICAnSnVseScsCiAgICAgICAgJ0F1Z3VzdCcsCiAgICAgICAgJ1NlcHRlbWJlcicsCiAgICAgICAgJ09jdG9iZXInLAogICAgICAgICdOb3ZlbWJlcicsCiAgICAgICAgJ0RlY2VtYmVyJwogICAgICBdOwogICAgICBmdW5jdGlvbiBsZWFkaW5nU29tZXRoaW5nKHZhbHVlLCBkaWdpdHMsIGNoYXJhY3RlcikgewogICAgICAgIHZhciBzdHIgPSB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgPyB2YWx1ZS50b1N0cmluZygpIDogdmFsdWUgfHwgJyc7CiAgICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBkaWdpdHMpIHsKICAgICAgICAgIHN0ciA9IGNoYXJhY3RlclswXSArIHN0cjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgfQogICAgICBmdW5jdGlvbiBsZWFkaW5nTnVsbHModmFsdWUsIGRpZ2l0cykgewogICAgICAgIHJldHVybiBsZWFkaW5nU29tZXRoaW5nKHZhbHVlLCBkaWdpdHMsICcwJyk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gY29tcGFyZUJ5RGF5KGRhdGUxLCBkYXRlMikgewogICAgICAgIGZ1bmN0aW9uIHNnbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlIDwgMCA/IC0xIDogdmFsdWUgPiAwID8gMSA6IDA7CiAgICAgICAgfQogICAgICAgIHZhciBjb21wYXJlOwogICAgICAgIGlmICgoY29tcGFyZSA9IHNnbihkYXRlMS5nZXRGdWxsWWVhcigpIC0gZGF0ZTIuZ2V0RnVsbFllYXIoKSkpID09PSAwKSB7CiAgICAgICAgICBpZiAoKGNvbXBhcmUgPSBzZ24oZGF0ZTEuZ2V0TW9udGgoKSAtIGRhdGUyLmdldE1vbnRoKCkpKSA9PT0gMCkgewogICAgICAgICAgICBjb21wYXJlID0gc2duKGRhdGUxLmdldERhdGUoKSAtIGRhdGUyLmdldERhdGUoKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb21wYXJlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGgpIHsKICAgICAgICBzd2l0Y2ggKGphbkZvdXJ0aC5nZXREYXkoKSkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCkgLSAxLCAxMSwgMjkpOwogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICByZXR1cm4gamFuRm91cnRoOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCksIDAsIDMpOwogICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCksIDAsIDIpOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCksIDAsIDEpOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCkgLSAxLCAxMSwgMzEpOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCkgLSAxLCAxMSwgMzApOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBnZXRXZWVrQmFzZWRZZWFyKGRhdGUpIHsKICAgICAgICB2YXIgdGhpc0RhdGUgPSBhZGREYXlzKG5ldyBEYXRlKGRhdGUudG1feWVhciArIDE5MDAsIDAsIDEpLCBkYXRlLnRtX3lkYXkpOwogICAgICAgIHZhciBqYW5Gb3VydGhUaGlzWWVhciA9IG5ldyBEYXRlKHRoaXNEYXRlLmdldEZ1bGxZZWFyKCksIDAsIDQpOwogICAgICAgIHZhciBqYW5Gb3VydGhOZXh0WWVhciA9IG5ldyBEYXRlKHRoaXNEYXRlLmdldEZ1bGxZZWFyKCkgKyAxLCAwLCA0KTsKICAgICAgICB2YXIgZmlyc3RXZWVrU3RhcnRUaGlzWWVhciA9IGdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGhUaGlzWWVhcik7CiAgICAgICAgdmFyIGZpcnN0V2Vla1N0YXJ0TmV4dFllYXIgPSBnZXRGaXJzdFdlZWtTdGFydERhdGUoamFuRm91cnRoTmV4dFllYXIpOwogICAgICAgIGlmIChjb21wYXJlQnlEYXkoZmlyc3RXZWVrU3RhcnRUaGlzWWVhciwgdGhpc0RhdGUpIDw9IDApIHsKICAgICAgICAgIGlmIChjb21wYXJlQnlEYXkoZmlyc3RXZWVrU3RhcnROZXh0WWVhciwgdGhpc0RhdGUpIDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXNEYXRlLmdldEZ1bGxZZWFyKCkgKyAxOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXNEYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzRGF0ZS5nZXRGdWxsWWVhcigpIC0gMTsKICAgICAgfQogICAgICB2YXIgRVhQQU5TSU9OX1JVTEVTXzIgPSB7CiAgICAgICAgJyVhJzogKGRhdGUpID0+IFdFRUtEQVlTW2RhdGUudG1fd2RheV0uc3Vic3RyaW5nKDAsIDMpLAogICAgICAgICclQSc6IChkYXRlKSA9PiBXRUVLREFZU1tkYXRlLnRtX3dkYXldLAogICAgICAgICclYic6IChkYXRlKSA9PiBNT05USFNbZGF0ZS50bV9tb25dLnN1YnN0cmluZygwLCAzKSwKICAgICAgICAnJUInOiAoZGF0ZSkgPT4gTU9OVEhTW2RhdGUudG1fbW9uXSwKICAgICAgICAnJUMnOiAoZGF0ZSkgPT4gewogICAgICAgICAgdmFyIHllYXIgPSBkYXRlLnRtX3llYXIgKyAxOTAwOwogICAgICAgICAgcmV0dXJuIGxlYWRpbmdOdWxscygoeWVhciAvIDEwMCkgfCAwLCAyKTsKICAgICAgICB9LAogICAgICAgICclZCc6IChkYXRlKSA9PiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9tZGF5LCAyKSwKICAgICAgICAnJWUnOiAoZGF0ZSkgPT4gbGVhZGluZ1NvbWV0aGluZyhkYXRlLnRtX21kYXksIDIsICcgJyksCiAgICAgICAgJyVnJzogKGRhdGUpID0+IGdldFdlZWtCYXNlZFllYXIoZGF0ZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksCiAgICAgICAgJyVHJzogZ2V0V2Vla0Jhc2VkWWVhciwKICAgICAgICAnJUgnOiAoZGF0ZSkgPT4gbGVhZGluZ051bGxzKGRhdGUudG1faG91ciwgMiksCiAgICAgICAgJyVJJzogKGRhdGUpID0+IHsKICAgICAgICAgIHZhciB0d2VsdmVIb3VyID0gZGF0ZS50bV9ob3VyOwogICAgICAgICAgaWYgKHR3ZWx2ZUhvdXIgPT0gMCkgewogICAgICAgICAgICB0d2VsdmVIb3VyID0gMTI7CiAgICAgICAgICB9IGVsc2UgaWYgKHR3ZWx2ZUhvdXIgPiAxMikgewogICAgICAgICAgICB0d2VsdmVIb3VyIC09IDEyOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGxlYWRpbmdOdWxscyh0d2VsdmVIb3VyLCAyKTsKICAgICAgICB9LAogICAgICAgICclaic6IChkYXRlKSA9PgogICAgICAgICAgbGVhZGluZ051bGxzKAogICAgICAgICAgICBkYXRlLnRtX21kYXkgKwogICAgICAgICAgICAgIGFycmF5U3VtKGlzTGVhcFllYXIoZGF0ZS50bV95ZWFyICsgMTkwMCkgPyBNT05USF9EQVlTX0xFQVAgOiBNT05USF9EQVlTX1JFR1VMQVIsIGRhdGUudG1fbW9uIC0gMSksCiAgICAgICAgICAgIDMKICAgICAgICAgICksCiAgICAgICAgJyVtJzogKGRhdGUpID0+IGxlYWRpbmdOdWxscyhkYXRlLnRtX21vbiArIDEsIDIpLAogICAgICAgICclTSc6IChkYXRlKSA9PiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9taW4sIDIpLAogICAgICAgICclbic6ICgpID0+ICdcbicsCiAgICAgICAgJyVwJzogKGRhdGUpID0+IHsKICAgICAgICAgIGlmIChkYXRlLnRtX2hvdXIgPj0gMCAmJiBkYXRlLnRtX2hvdXIgPCAxMikgewogICAgICAgICAgICByZXR1cm4gJ0FNJzsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAnUE0nOwogICAgICAgIH0sCiAgICAgICAgJyVTJzogKGRhdGUpID0+IGxlYWRpbmdOdWxscyhkYXRlLnRtX3NlYywgMiksCiAgICAgICAgJyV0JzogKCkgPT4gJ1x0JywKICAgICAgICAnJXUnOiAoZGF0ZSkgPT4gZGF0ZS50bV93ZGF5IHx8IDcsCiAgICAgICAgJyVVJzogKGRhdGUpID0+IHsKICAgICAgICAgIHZhciBkYXlzID0gZGF0ZS50bV95ZGF5ICsgNyAtIGRhdGUudG1fd2RheTsKICAgICAgICAgIHJldHVybiBsZWFkaW5nTnVsbHMoTWF0aC5mbG9vcihkYXlzIC8gNyksIDIpOwogICAgICAgIH0sCiAgICAgICAgJyVWJzogKGRhdGUpID0+IHsKICAgICAgICAgIHZhciB2YWwgPSBNYXRoLmZsb29yKChkYXRlLnRtX3lkYXkgKyA3IC0gKChkYXRlLnRtX3dkYXkgKyA2KSAlIDcpKSAvIDcpOwogICAgICAgICAgaWYgKChkYXRlLnRtX3dkYXkgKyAzNzEgLSBkYXRlLnRtX3lkYXkgLSAyKSAlIDcgPD0gMikgewogICAgICAgICAgICB2YWwrKzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdmFsKSB7CiAgICAgICAgICAgIHZhbCA9IDUyOwogICAgICAgICAgICB2YXIgZGVjMzEgPSAoZGF0ZS50bV93ZGF5ICsgNyAtIGRhdGUudG1feWRheSAtIDEpICUgNzsKICAgICAgICAgICAgaWYgKGRlYzMxID09IDQgfHwgKGRlYzMxID09IDUgJiYgaXNMZWFwWWVhcigoZGF0ZS50bV95ZWFyICUgNDAwKSAtIDEpKSkgewogICAgICAgICAgICAgIHZhbCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHZhbCA9PSA1MykgewogICAgICAgICAgICB2YXIgamFuMSA9IChkYXRlLnRtX3dkYXkgKyAzNzEgLSBkYXRlLnRtX3lkYXkpICUgNzsKICAgICAgICAgICAgaWYgKGphbjEgIT0gNCAmJiAoamFuMSAhPSAzIHx8ICFpc0xlYXBZZWFyKGRhdGUudG1feWVhcikpKSB7CiAgICAgICAgICAgICAgdmFsID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGxlYWRpbmdOdWxscyh2YWwsIDIpOwogICAgICAgIH0sCiAgICAgICAgJyV3JzogKGRhdGUpID0+IGRhdGUudG1fd2RheSwKICAgICAgICAnJVcnOiAoZGF0ZSkgPT4gewogICAgICAgICAgdmFyIGRheXMgPSBkYXRlLnRtX3lkYXkgKyA3IC0gKChkYXRlLnRtX3dkYXkgKyA2KSAlIDcpOwogICAgICAgICAgcmV0dXJuIGxlYWRpbmdOdWxscyhNYXRoLmZsb29yKGRheXMgLyA3KSwgMik7CiAgICAgICAgfSwKICAgICAgICAnJXknOiAoZGF0ZSkgPT4gKGRhdGUudG1feWVhciArIDE5MDApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLAogICAgICAgICclWSc6IChkYXRlKSA9PiBkYXRlLnRtX3llYXIgKyAxOTAwLAogICAgICAgICcleic6IChkYXRlKSA9PiB7CiAgICAgICAgICB2YXIgb2ZmID0gZGF0ZS50bV9nbXRvZmY7CiAgICAgICAgICB2YXIgYWhlYWQgPSBvZmYgPj0gMDsKICAgICAgICAgIG9mZiA9IE1hdGguYWJzKG9mZikgLyA2MDsKICAgICAgICAgIG9mZiA9IChvZmYgLyA2MCkgKiAxMDAgKyAob2ZmICUgNjApOwogICAgICAgICAgcmV0dXJuIChhaGVhZCA/ICcrJyA6ICctJykgKyBTdHJpbmcoJzAwMDAnICsgb2ZmKS5zbGljZSgtNCk7CiAgICAgICAgfSwKICAgICAgICAnJVonOiAoZGF0ZSkgPT4gZGF0ZS50bV96b25lLAogICAgICAgICclJSc6ICgpID0+ICclJwogICAgICB9OwogICAgICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKC8lJS9nLCAnXDBcMCcpOwogICAgICBmb3IgKHZhciBydWxlIGluIEVYUEFOU0lPTl9SVUxFU18yKSB7CiAgICAgICAgaWYgKHBhdHRlcm4uaW5jbHVkZXMocnVsZSkpIHsKICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UobmV3IFJlZ0V4cChydWxlLCAnZycpLCBFWFBBTlNJT05fUlVMRVNfMltydWxlXShkYXRlKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoL1wwXDAvZywgJyUnKTsKICAgICAgdmFyIGJ5dGVzID0gaW50QXJyYXlGcm9tU3RyaW5nKHBhdHRlcm4sIGZhbHNlKTsKICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA+IG1heHNpemUpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICB3cml0ZUFycmF5VG9NZW1vcnkoYnl0ZXMsIHMpOwogICAgICByZXR1cm4gYnl0ZXMubGVuZ3RoIC0gMTsKICAgIH07CiAgICB2YXIgX3N0cmZ0aW1lX2wgPSAocywgbWF4c2l6ZSwgZm9ybWF0LCB0bSwgbG9jKSA9PiBfc3RyZnRpbWUocywgbWF4c2l6ZSwgZm9ybWF0LCB0bSk7CiAgICB2YXIgaGFuZGxlRXhjZXB0aW9uID0gKGUpID0+IHsKICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFeGl0U3RhdHVzIHx8IGUgPT0gJ3Vud2luZCcpIHsKICAgICAgICByZXR1cm4gRVhJVFNUQVRVUzsKICAgICAgfQogICAgICBxdWl0XygxLCBlKTsKICAgIH07CiAgICB2YXIgd2FzbVRhYmxlTWlycm9yID0gW107CiAgICB2YXIgd2FzbVRhYmxlOwogICAgdmFyIGdldFdhc21UYWJsZUVudHJ5ID0gKGZ1bmNQdHIpID0+IHsKICAgICAgdmFyIGZ1bmMgPSB3YXNtVGFibGVNaXJyb3JbZnVuY1B0cl07CiAgICAgIGlmICghZnVuYykgewogICAgICAgIGlmIChmdW5jUHRyID49IHdhc21UYWJsZU1pcnJvci5sZW5ndGgpIHsKICAgICAgICAgIHdhc21UYWJsZU1pcnJvci5sZW5ndGggPSBmdW5jUHRyICsgMTsKICAgICAgICB9CiAgICAgICAgd2FzbVRhYmxlTWlycm9yW2Z1bmNQdHJdID0gZnVuYyA9IHdhc21UYWJsZS5nZXQoZnVuY1B0cik7CiAgICAgIH0KICAgICAgcmV0dXJuIGZ1bmM7CiAgICB9OwogICAgdmFyIEZTTm9kZSA9IGZ1bmN0aW9uIChwYXJlbnQsIG5hbWUsIG1vZGUsIHJkZXYpIHsKICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICBwYXJlbnQgPSB0aGlzOwogICAgICB9CiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogICAgICB0aGlzLm1vdW50ID0gcGFyZW50Lm1vdW50OwogICAgICB0aGlzLm1vdW50ZWQgPSBudWxsOwogICAgICB0aGlzLmlkID0gRlMubmV4dElub2RlKys7CiAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgIHRoaXMubW9kZSA9IG1vZGU7CiAgICAgIHRoaXMubm9kZV9vcHMgPSB7fTsKICAgICAgdGhpcy5zdHJlYW1fb3BzID0ge307CiAgICAgIHRoaXMucmRldiA9IHJkZXY7CiAgICB9OwogICAgdmFyIHJlYWRNb2RlID0gMjkyIHwgNzM7CiAgICB2YXIgd3JpdGVNb2RlID0gMTQ2OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRlNOb2RlLnByb3RvdHlwZSwgewogICAgICByZWFkOiB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gKHRoaXMubW9kZSAmIHJlYWRNb2RlKSA9PT0gcmVhZE1vZGU7CiAgICAgICAgfSwKICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgIHZhbCA/ICh0aGlzLm1vZGUgfD0gcmVhZE1vZGUpIDogKHRoaXMubW9kZSAmPSB+cmVhZE1vZGUpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgd3JpdGU6IHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiAodGhpcy5tb2RlICYgd3JpdGVNb2RlKSA9PT0gd3JpdGVNb2RlOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7CiAgICAgICAgICB2YWwgPyAodGhpcy5tb2RlIHw9IHdyaXRlTW9kZSkgOiAodGhpcy5tb2RlICY9IH53cml0ZU1vZGUpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgaXNGb2xkZXI6IHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBGUy5pc0Rpcih0aGlzLm1vZGUpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgaXNEZXZpY2U6IHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBGUy5pc0NocmRldih0aGlzLm1vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBGUy5GU05vZGUgPSBGU05vZGU7CiAgICBGUy5jcmVhdGVQcmVsb2FkZWRGaWxlID0gRlNfY3JlYXRlUHJlbG9hZGVkRmlsZTsKICAgIEZTLnN0YXRpY0luaXQoKTsKICAgIHZhciB3YXNtSW1wb3J0cyA9IHsKICAgICAgX19jeGFfdGhyb3c6IF9fX2N4YV90aHJvdywKICAgICAgX19zeXNjYWxsX2ZjbnRsNjQ6IF9fX3N5c2NhbGxfZmNudGw2NCwKICAgICAgX19zeXNjYWxsX2ZzdGF0NjQ6IF9fX3N5c2NhbGxfZnN0YXQ2NCwKICAgICAgX19zeXNjYWxsX2lvY3RsOiBfX19zeXNjYWxsX2lvY3RsLAogICAgICBfX3N5c2NhbGxfbHN0YXQ2NDogX19fc3lzY2FsbF9sc3RhdDY0LAogICAgICBfX3N5c2NhbGxfbmV3ZnN0YXRhdDogX19fc3lzY2FsbF9uZXdmc3RhdGF0LAogICAgICBfX3N5c2NhbGxfb3BlbmF0OiBfX19zeXNjYWxsX29wZW5hdCwKICAgICAgX19zeXNjYWxsX3N0YXQ2NDogX19fc3lzY2FsbF9zdGF0NjQsCiAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljOiBfX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWMsCiAgICAgIF9lbXNjcmlwdGVuX3Rocm93X2xvbmdqbXA6IF9fZW1zY3JpcHRlbl90aHJvd19sb25nam1wLAogICAgICBhYm9ydDogX2Fib3J0LAogICAgICBlbXNjcmlwdGVuX2RhdGVfbm93OiBfZW1zY3JpcHRlbl9kYXRlX25vdywKICAgICAgZW1zY3JpcHRlbl9nZXRfaGVhcF9tYXg6IF9lbXNjcmlwdGVuX2dldF9oZWFwX21heCwKICAgICAgZW1zY3JpcHRlbl9nZXRfbm93OiBfZW1zY3JpcHRlbl9nZXRfbm93LAogICAgICBlbXNjcmlwdGVuX21lbWNweV9qczogX2Vtc2NyaXB0ZW5fbWVtY3B5X2pzLAogICAgICBlbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwOiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCwKICAgICAgZW52aXJvbl9nZXQ6IF9lbnZpcm9uX2dldCwKICAgICAgZW52aXJvbl9zaXplc19nZXQ6IF9lbnZpcm9uX3NpemVzX2dldCwKICAgICAgZXhpdDogX2V4aXQsCiAgICAgIGZkX2Nsb3NlOiBfZmRfY2xvc2UsCiAgICAgIGZkX3JlYWQ6IF9mZF9yZWFkLAogICAgICBmZF9zZWVrOiBfZmRfc2VlaywKICAgICAgZmRfd3JpdGU6IF9mZF93cml0ZSwKICAgICAgaW52b2tlX3ZpaTogaW52b2tlX3ZpaSwKICAgICAgc3RyZnRpbWVfbDogX3N0cmZ0aW1lX2wKICAgIH07CiAgICB2YXIgd2FzbUV4cG9ydHMgPSBjcmVhdGVXYXNtKCk7CiAgICB2YXIgX19fd2FzbV9jYWxsX2N0b3JzID0gd2FzbUV4cG9ydHNbJ19fd2FzbV9jYWxsX2N0b3JzJ107CiAgICB2YXIgX25ld19tZW1vcnkgPSAoTW9kdWxlWydfbmV3X21lbW9yeSddID0gd2FzbUV4cG9ydHNbJ25ld19tZW1vcnknXSk7CiAgICB2YXIgX2ZyZWVfbWVtb3J5ID0gKE1vZHVsZVsnX2ZyZWVfbWVtb3J5J10gPSB3YXNtRXhwb3J0c1snZnJlZV9tZW1vcnknXSk7CiAgICB2YXIgX2dldF9yZXR1cm5fbl9wYWNrZXRzID0gKE1vZHVsZVsnX2dldF9yZXR1cm5fbl9wYWNrZXRzJ10gPSB3YXNtRXhwb3J0c1snZ2V0X3JldHVybl9uX3BhY2tldHMnXSk7CiAgICB2YXIgX2dldF9yZXR1cm5fcGFja2V0X2xlbiA9IChNb2R1bGVbJ19nZXRfcmV0dXJuX3BhY2tldF9sZW4nXSA9IHdhc21FeHBvcnRzWydnZXRfcmV0dXJuX3BhY2tldF9sZW4nXSk7CiAgICB2YXIgX2dldF9yZXR1cm5fcGFja2V0ID0gKE1vZHVsZVsnX2dldF9yZXR1cm5fcGFja2V0J10gPSB3YXNtRXhwb3J0c1snZ2V0X3JldHVybl9wYWNrZXQnXSk7CiAgICB2YXIgX2NsZWFyX3JldHVybl9wYWNrZXRzID0gKE1vZHVsZVsnX2NsZWFyX3JldHVybl9wYWNrZXRzJ10gPSB3YXNtRXhwb3J0c1snY2xlYXJfcmV0dXJuX3BhY2tldHMnXSk7CiAgICB2YXIgX3Byb2Nlc3NfZXZlbnRfZGF0YSA9IChNb2R1bGVbJ19wcm9jZXNzX2V2ZW50X2RhdGEnXSA9IHdhc21FeHBvcnRzWydwcm9jZXNzX2V2ZW50X2RhdGEnXSk7CiAgICB2YXIgX21haW4gPSAoTW9kdWxlWydfbWFpbiddID0gd2FzbUV4cG9ydHNbJ21haW4nXSk7CiAgICB2YXIgX21hbGxvYyA9IHdhc21FeHBvcnRzWydtYWxsb2MnXTsKICAgIHZhciBfZW1zY3JpcHRlbl9idWlsdGluX21lbWFsaWduID0gd2FzbUV4cG9ydHNbJ2Vtc2NyaXB0ZW5fYnVpbHRpbl9tZW1hbGlnbiddOwogICAgdmFyIF9zZXRUaHJldyA9IHdhc21FeHBvcnRzWydzZXRUaHJldyddOwogICAgdmFyIHNldFRlbXBSZXQwID0gd2FzbUV4cG9ydHNbJ3NldFRlbXBSZXQwJ107CiAgICB2YXIgc3RhY2tTYXZlID0gd2FzbUV4cG9ydHNbJ3N0YWNrU2F2ZSddOwogICAgdmFyIHN0YWNrUmVzdG9yZSA9IHdhc21FeHBvcnRzWydzdGFja1Jlc3RvcmUnXTsKICAgIHZhciBzdGFja0FsbG9jID0gd2FzbUV4cG9ydHNbJ3N0YWNrQWxsb2MnXTsKICAgIHZhciBfX19jeGFfaW5jcmVtZW50X2V4Y2VwdGlvbl9yZWZjb3VudCA9IHdhc21FeHBvcnRzWydfX2N4YV9pbmNyZW1lbnRfZXhjZXB0aW9uX3JlZmNvdW50J107CiAgICB2YXIgX19fY3hhX2lzX3BvaW50ZXJfdHlwZSA9IHdhc21FeHBvcnRzWydfX2N4YV9pc19wb2ludGVyX3R5cGUnXTsKICAgIHZhciBkeW5DYWxsX2ppamkgPSAoTW9kdWxlWydkeW5DYWxsX2ppamknXSA9IHdhc21FeHBvcnRzWydkeW5DYWxsX2ppamknXSk7CiAgICB2YXIgZHluQ2FsbF9paWlqID0gKE1vZHVsZVsnZHluQ2FsbF9paWlqJ10gPSB3YXNtRXhwb3J0c1snZHluQ2FsbF9paWlqJ10pOwogICAgdmFyIGR5bkNhbGxfaWlpamkgPSAoTW9kdWxlWydkeW5DYWxsX2lpaWppJ10gPSB3YXNtRXhwb3J0c1snZHluQ2FsbF9paWlqaSddKTsKICAgIHZhciBkeW5DYWxsX2lpaWlqID0gKE1vZHVsZVsnZHluQ2FsbF9paWlpaiddID0gd2FzbUV4cG9ydHNbJ2R5bkNhbGxfaWlpaWonXSk7CiAgICB2YXIgZHluQ2FsbF9paWlpamogPSAoTW9kdWxlWydkeW5DYWxsX2lpaWlqaiddID0gd2FzbUV4cG9ydHNbJ2R5bkNhbGxfaWlpaWpqJ10pOwogICAgdmFyIGR5bkNhbGxfdmlpamogPSAoTW9kdWxlWydkeW5DYWxsX3ZpaWpqJ10gPSB3YXNtRXhwb3J0c1snZHluQ2FsbF92aWlqaiddKTsKICAgIHZhciBkeW5DYWxsX3ZpaWlqampqID0gKE1vZHVsZVsnZHluQ2FsbF92aWlpampqaiddID0gd2FzbUV4cG9ydHNbJ2R5bkNhbGxfdmlpaWpqamonXSk7CiAgICB2YXIgZHluQ2FsbF92aWlqaWkgPSAoTW9kdWxlWydkeW5DYWxsX3ZpaWppaSddID0gd2FzbUV4cG9ydHNbJ2R5bkNhbGxfdmlpamlpJ10pOwogICAgdmFyIGR5bkNhbGxfaWlpaWlqID0gKE1vZHVsZVsnZHluQ2FsbF9paWlpaWonXSA9IHdhc21FeHBvcnRzWydkeW5DYWxsX2lpaWlpaiddKTsKICAgIHZhciBkeW5DYWxsX2lpaWlpamogPSAoTW9kdWxlWydkeW5DYWxsX2lpaWlpamonXSA9IHdhc21FeHBvcnRzWydkeW5DYWxsX2lpaWlpamonXSk7CiAgICB2YXIgZHluQ2FsbF9paWlpaWlqaiA9IChNb2R1bGVbJ2R5bkNhbGxfaWlpaWlpamonXSA9IHdhc21FeHBvcnRzWydkeW5DYWxsX2lpaWlpaWpqJ10pOwogICAgZnVuY3Rpb24gaW52b2tlX3ZpaShpbmRleCwgYTEsIGEyKSB7CiAgICAgIHZhciBzcCA9IHN0YWNrU2F2ZSgpOwogICAgICB0cnkgewogICAgICAgIGdldFdhc21UYWJsZUVudHJ5KGluZGV4KShhMSwgYTIpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgc3RhY2tSZXN0b3JlKHNwKTsKICAgICAgICBpZiAoZSAhPT0gZSArIDApIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIF9zZXRUaHJldygxLCAwKTsKICAgICAgfQogICAgfQogICAgdmFyIGNhbGxlZFJ1bjsKICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IGZ1bmN0aW9uIHJ1bkNhbGxlcigpIHsKICAgICAgaWYgKCFjYWxsZWRSdW4pIHsKICAgICAgICBydW4oKTsKICAgICAgfQogICAgICBpZiAoIWNhbGxlZFJ1bikgewogICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bkNhbGxlcjsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGNhbGxNYWluKCkgewogICAgICB2YXIgZW50cnlGdW5jdGlvbiA9IF9tYWluOwogICAgICB2YXIgYXJnYyA9IDA7CiAgICAgIHZhciBhcmd2ID0gMDsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmV0ID0gZW50cnlGdW5jdGlvbihhcmdjLCBhcmd2KTsKICAgICAgICBleGl0SlMocmV0LCB0cnVlKTsKICAgICAgICByZXR1cm4gcmV0OwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIGhhbmRsZUV4Y2VwdGlvbihlKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcnVuKCkgewogICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBwcmVSdW4oKTsKICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZG9SdW4oKSB7CiAgICAgICAgaWYgKGNhbGxlZFJ1bikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjYWxsZWRSdW4gPSB0cnVlOwogICAgICAgIE1vZHVsZVsnY2FsbGVkUnVuJ10gPSB0cnVlOwogICAgICAgIGlmIChBQk9SVCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpbml0UnVudGltZSgpOwogICAgICAgIHByZU1haW4oKTsKICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7CiAgICAgICAgaWYgKE1vZHVsZVsnb25SdW50aW1lSW5pdGlhbGl6ZWQnXSkgewogICAgICAgICAgTW9kdWxlWydvblJ1bnRpbWVJbml0aWFsaXplZCddKCk7CiAgICAgICAgfQogICAgICAgIGlmIChzaG91bGRSdW5Ob3cpIHsKICAgICAgICAgIGNhbGxNYWluKCk7CiAgICAgICAgfQogICAgICAgIHBvc3RSdW4oKTsKICAgICAgfQogICAgICBpZiAoTW9kdWxlWydzZXRTdGF0dXMnXSkgewogICAgICAgIE1vZHVsZVsnc2V0U3RhdHVzJ10oJ1J1bm5pbmcuLi4nKTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBNb2R1bGVbJ3NldFN0YXR1cyddKCcnKTsKICAgICAgICAgIH0sIDEpOwogICAgICAgICAgZG9SdW4oKTsKICAgICAgICB9LCAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb1J1bigpOwogICAgICB9CiAgICB9CiAgICBpZiAoTW9kdWxlWydwcmVJbml0J10pIHsKICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbJ3ByZUluaXQnXSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgTW9kdWxlWydwcmVJbml0J10gPSBbTW9kdWxlWydwcmVJbml0J11dOwogICAgICB9CiAgICAgIHdoaWxlIChNb2R1bGVbJ3ByZUluaXQnXS5sZW5ndGggPiAwKSB7CiAgICAgICAgTW9kdWxlWydwcmVJbml0J10ucG9wKCkoKTsKICAgICAgfQogICAgfQogICAgdmFyIHNob3VsZFJ1bk5vdyA9IHRydWU7CiAgICBpZiAoTW9kdWxlWydub0luaXRpYWxSdW4nXSkgewogICAgICBzaG91bGRSdW5Ob3cgPSBmYWxzZTsKICAgIH0KICAgIHJ1bigpOwoKICAgIHJldHVybiBtb2R1bGVBcmc7CiAgfTsKfSkoKTsKZXhwb3J0IGRlZmF1bHQgTW9kdWxlOwo=";
|
|
2
|
-
export {
|
|
3
|
-
I as default
|
|
4
|
-
};
|
|
5
|
-
//# sourceMappingURL=dac-GA_h4b2-.js.map
|