diff --git a/dashcaddy-api/.eslintignore b/dashcaddy-api/.eslintignore index 3063216..10a4929 100644 --- a/dashcaddy-api/.eslintignore +++ b/dashcaddy-api/.eslintignore @@ -3,3 +3,4 @@ coverage/ dist/ build/ *.min.js +static-sites/ diff --git a/dashcaddy-api/package-lock.json b/dashcaddy-api/package-lock.json index 3b962a5..aaa4e26 100644 --- a/dashcaddy-api/package-lock.json +++ b/dashcaddy-api/package-lock.json @@ -19,13 +19,13 @@ "js-yaml": "^4.1.1", "jsonwebtoken": "^9.0.2", "lru-cache": "^10.4.3", - "nodemailer": "^8.0.4", + "nodemailer": "^9.0.5", "otplib": "^12.0.1", "pdfkit": "^0.15.2", "png-to-ico": "^2.1.8", "proper-lockfile": "^4.1.2", "qrcode": "^1.5.3", - "sharp": "^0.33.5", + "sharp": "^0.35.3", "ssh2-sftp-client": "^11.0.0", "validator": "^13.11.0", "webdav": "^5.7.1", @@ -564,9 +564,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "license": "MIT", "optional": true, "dependencies": { @@ -771,10 +771,19 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.3.tgz", + "integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==", "cpu": [ "arm64" ], @@ -784,19 +793,19 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" + "@img/sharp-libvips-darwin-arm64": "1.3.2" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.3.tgz", + "integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==", "cpu": [ "x64" ], @@ -806,19 +815,38 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" + "@img/sharp-libvips-darwin-x64": "1.3.2" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.3.tgz", + "integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.2.tgz", + "integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==", "cpu": [ "arm64" ], @@ -832,9 +860,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.2.tgz", + "integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==", "cpu": [ "x64" ], @@ -848,9 +876,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.2.tgz", + "integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==", "cpu": [ "arm" ], @@ -864,9 +892,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.2.tgz", + "integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==", "cpu": [ "arm64" ], @@ -879,10 +907,42 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.2.tgz", + "integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.2.tgz", + "integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.2.tgz", + "integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==", "cpu": [ "s390x" ], @@ -896,9 +956,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.2.tgz", + "integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==", "cpu": [ "x64" ], @@ -912,9 +972,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.2.tgz", + "integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==", "cpu": [ "arm64" ], @@ -928,9 +988,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.2.tgz", + "integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==", "cpu": [ "x64" ], @@ -944,9 +1004,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.3.tgz", + "integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==", "cpu": [ "arm" ], @@ -956,19 +1016,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" + "@img/sharp-libvips-linux-arm": "1.3.2" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.3.tgz", + "integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==", "cpu": [ "arm64" ], @@ -978,19 +1038,63 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" + "@img/sharp-libvips-linux-arm64": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.3.tgz", + "integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.3.tgz", + "integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.2" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.3.tgz", + "integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==", "cpu": [ "s390x" ], @@ -1000,19 +1104,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" + "@img/sharp-libvips-linux-s390x": "1.3.2" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.3.tgz", + "integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==", "cpu": [ "x64" ], @@ -1022,19 +1126,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" + "@img/sharp-libvips-linux-x64": "1.3.2" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.3.tgz", + "integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==", "cpu": [ "arm64" ], @@ -1044,19 +1148,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.3.tgz", + "integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==", "cpu": [ "x64" ], @@ -1066,38 +1170,73 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + "@img/sharp-libvips-linuxmusl-x64": "1.3.2" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", + "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.2.0" + "@emnapi/runtime": "^1.11.1" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.3.tgz", + "integrity": "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.3.tgz", + "integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.3.tgz", + "integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==", "cpu": [ "ia32" ], @@ -1107,16 +1246,16 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.3.tgz", + "integrity": "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==", "cpu": [ "x64" ], @@ -1126,7 +1265,7 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" @@ -2623,19 +2762,6 @@ "dev": true, "license": "MIT" }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2654,16 +2780,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -6002,9 +6118,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -6127,9 +6243,9 @@ } }, "node_modules/nodemailer": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.11.tgz", - "integrity": "sha512-nrO/pDAUKl+wXX+lx16tDLbnm0fW6sK/x8mgohaCpg+CdCEl482bD4tCuAZk2DyliruiNTIZxRCoWkDqJEnAiA==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-9.0.5.tgz", + "integrity": "sha512-wvjiKvjczmsN7U/8006JOdXubgBk2XFAbioDMbT+sM7cPs0QrhJTa6KBRX7P5REGGkDcLUz/EarWidb8G8C1jQ==", "license": "MIT-0", "engines": { "node": ">=6.0.0" @@ -7242,48 +7358,58 @@ "license": "ISC" }, "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "hasInstallScript": true, + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.3.tgz", + "integrity": "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==", "license": "Apache-2.0", "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" + "@img/sharp-darwin-arm64": "0.35.3", + "@img/sharp-darwin-x64": "0.35.3", + "@img/sharp-freebsd-wasm32": "0.35.3", + "@img/sharp-libvips-darwin-arm64": "1.3.2", + "@img/sharp-libvips-darwin-x64": "1.3.2", + "@img/sharp-libvips-linux-arm": "1.3.2", + "@img/sharp-libvips-linux-arm64": "1.3.2", + "@img/sharp-libvips-linux-ppc64": "1.3.2", + "@img/sharp-libvips-linux-riscv64": "1.3.2", + "@img/sharp-libvips-linux-s390x": "1.3.2", + "@img/sharp-libvips-linux-x64": "1.3.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", + "@img/sharp-libvips-linuxmusl-x64": "1.3.2", + "@img/sharp-linux-arm": "0.35.3", + "@img/sharp-linux-arm64": "0.35.3", + "@img/sharp-linux-ppc64": "0.35.3", + "@img/sharp-linux-riscv64": "0.35.3", + "@img/sharp-linux-s390x": "0.35.3", + "@img/sharp-linux-x64": "0.35.3", + "@img/sharp-linuxmusl-arm64": "0.35.3", + "@img/sharp-linuxmusl-x64": "0.35.3", + "@img/sharp-webcontainers-wasm32": "0.35.3", + "@img/sharp-win32-arm64": "0.35.3", + "@img/sharp-win32-ia32": "0.35.3", + "@img/sharp-win32-x64": "0.35.3" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/sharp/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7393,21 +7519,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT" - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", diff --git a/dashcaddy-api/package.json b/dashcaddy-api/package.json index 38726aa..2c47ec6 100644 --- a/dashcaddy-api/package.json +++ b/dashcaddy-api/package.json @@ -33,13 +33,13 @@ "js-yaml": "^4.1.1", "jsonwebtoken": "^9.0.2", "lru-cache": "^10.4.3", - "nodemailer": "^8.0.4", + "nodemailer": "^9.0.5", "otplib": "^12.0.1", "pdfkit": "^0.15.2", "png-to-ico": "^2.1.8", "proper-lockfile": "^4.1.2", "qrcode": "^1.5.3", - "sharp": "^0.33.5", + "sharp": "^0.35.3", "ssh2-sftp-client": "^11.0.0", "validator": "^13.11.0", "webdav": "^5.7.1", diff --git a/dashcaddy-api/routes/apps/deploy.js b/dashcaddy-api/routes/apps/deploy.js index e35fb94..eb100af 100644 --- a/dashcaddy-api/routes/apps/deploy.js +++ b/dashcaddy-api/routes/apps/deploy.js @@ -95,7 +95,7 @@ module.exports = function({ docker, caddy, credentialManager, servicesStateManag log.info('deploy', 'DashCA: For full features, copy certificate files to ' + destPath); log.info('deploy', 'DashCA: Static site deployment completed successfully'); } catch (error) { - log.error('deploy', 'DashCA deployment error', { error: error.message }); + log.error('deploy', error, null, { note: 'DashCA deployment error' }); throw new Error(`DashCA deployment failed: ${error.message}`); } } @@ -231,7 +231,7 @@ module.exports = function({ docker, caddy, credentialManager, servicesStateManag await portLockManager.releasePorts(lockId); log.info('deploy', 'Port locks released after error', { lockId }); } catch (releaseError) { - log.error('deploy', 'Failed to release port locks', { lockId, error: releaseError.message }); + log.error('deploy', releaseError, null, { note: 'Failed to release port locks', lockId }); } } throw deployError; @@ -425,7 +425,7 @@ module.exports = function({ docker, caddy, credentialManager, servicesStateManag } catch (error) { try { await logError('app-deploy', error, { appId, config }); } catch (_) { /* logError failure should not mask original error */ } const msg = error?.message || String(error || 'Unknown error'); - log.error('deploy', 'Deployment failed', { appId, error: msg }); + log.error('deploy', error, null, { note: 'Deployment failed', appId }); const template = ctx.APP_TEMPLATES[appId]; try { ctx.notification.send('deploymentFailed', 'Deployment Failed', `Failed to deploy **${template?.name || appId}**.\nError: ${msg}`, 'error'); } catch (_) {} errorResponse(res, 500, ctx.safeErrorMessage(error)); diff --git a/dashcaddy-api/routes/apps/restore.js b/dashcaddy-api/routes/apps/restore.js index 6f3b536..c9d5ea6 100644 --- a/dashcaddy-api/routes/apps/restore.js +++ b/dashcaddy-api/routes/apps/restore.js @@ -297,7 +297,7 @@ module.exports = function({ docker, caddy, servicesStateManager, asyncHandler, e // P0-5 fix: was `errorResponse(res, 500, err.message)` which leaks internal // error details (paths, stack traces, library error codes) to the client. // Log the actual error server-side and return a generic message. - log.error('apps-revert', 'Revert failed', { error: err.message, stack: err.stack }); + log.error('apps-revert', err, null, { note: 'Revert failed', stack: err.stack }); errorResponse(res, 500, 'Revert failed'); } }, 'apps-revert')); diff --git a/dashcaddy-api/routes/apps/templates.js b/dashcaddy-api/routes/apps/templates.js index fb5cafd..df152b2 100644 --- a/dashcaddy-api/routes/apps/templates.js +++ b/dashcaddy-api/routes/apps/templates.js @@ -148,7 +148,7 @@ module.exports = function({ } } catch (error) { results.caddy = `failed: ${error.message}`; - log.error('caddy', 'Caddy update error', { error: error.message }); + log.error('caddy', error, null, { note: 'Caddy update error' }); } try { diff --git a/dashcaddy-api/routes/arr/helpers.js b/dashcaddy-api/routes/arr/helpers.js index 7354ef8..244e61d 100644 --- a/dashcaddy-api/routes/arr/helpers.js +++ b/dashcaddy-api/routes/arr/helpers.js @@ -37,7 +37,7 @@ module.exports = function({ docker, credentialManager, fetchT, log }) { stream.on('error', () => resolve(null)); }); } catch (error) { - log.error('docker', 'Failed to get API key', { containerName, error: error.message }); + log.error('docker', error, null, { note: 'Failed to get API key', containerName }); return null; } } @@ -71,7 +71,7 @@ module.exports = function({ docker, credentialManager, fetchT, log }) { stream.on('error', () => resolve(null)); }); } catch (error) { - log.error('docker', 'Failed to get Plex token', { error: error.message }); + log.error('docker', error, null, { note: 'Failed to get Plex token' }); return null; } } @@ -123,7 +123,7 @@ module.exports = function({ docker, credentialManager, fetchT, log }) { const sessionCookie = setCookie.split(';')[0]; return { cookie: sessionCookie, plexToken }; } catch (e) { - log.error('arr', 'Could not get Seerr session', { error: e.message }); + log.error('arr', e, null, { note: 'Could not get Seerr session' }); return null; } } diff --git a/dashcaddy-api/routes/containers.js b/dashcaddy-api/routes/containers.js index 95ebd97..35ecb3c 100644 --- a/dashcaddy-api/routes/containers.js +++ b/dashcaddy-api/routes/containers.js @@ -162,7 +162,7 @@ module.exports = function({ docker, log, asyncHandler, workflowEngine }) { await newContainer.start(); } catch (startError) { // Clean up the failed container so it doesn't block future attempts - log.error('docker', 'Failed to start new container', { containerName, error: startError.message }); + log.error('docker', startError, null, { note: 'Failed to start new container', containerName }); if (newContainer) { try { await newContainer.remove({ force: true }); } catch (e) { /* already gone */ } } diff --git a/dashcaddy-api/routes/dns.js b/dashcaddy-api/routes/dns.js index ed1528c..ba907be 100644 --- a/dashcaddy-api/routes/dns.js +++ b/dashcaddy-api/routes/dns.js @@ -110,7 +110,7 @@ module.exports = function({ ...(result.instructions ? { manual: true, instructions: result.instructions } : {}) }); } catch (error) { - log.error('dns', 'Universal DNS record creation error', { error: error.message }); + log.error('dns', error, null, { note: 'Universal DNS record creation error' }); errorResponse(res, safeErrorMessage(error), 500); } }, 'dns-universal-create')); @@ -136,7 +136,7 @@ module.exports = function({ ...(result.instructions ? { manual: true, instructions: result.instructions } : {}) }); } catch (error) { - log.error('dns', 'Universal DNS record deletion error', { error: error.message }); + log.error('dns', error, null, { note: 'Universal DNS record deletion error' }); errorResponse(res, safeErrorMessage(error), 500); } }, 'dns-universal-delete')); @@ -167,7 +167,7 @@ module.exports = function({ throw new NotFoundError('No records found for domain'); } } catch (error) { - log.error('dns', 'Universal DNS resolve error', { error: error.message }); + log.error('dns', error, null, { note: 'Universal DNS resolve error' }); errorResponse(res, safeErrorMessage(error), error.statusCode || 500); } }, 'dns-universal-resolve')); @@ -283,7 +283,7 @@ module.exports = function({ // Error handled by middleware } } catch (error) { - log.error('dns', 'DNS record creation error', { error: error.message }); + log.error('dns', error, null, { note: 'DNS record creation error' }); errorResponse(res, safeErrorMessage(error), 500, { details: error.cause?.code || 'fetch failed' }); } }, 'dns-create-record')); @@ -328,7 +328,7 @@ module.exports = function({ // Error handled by middleware } } catch (error) { - log.error('dns', 'DNS resolve error', { error: error.message }); + log.error('dns', error, null, { note: 'DNS resolve error' }); // Error handled by middleware } }, 'dns-resolve')); @@ -465,7 +465,7 @@ module.exports = function({ }); } catch (error) { - log.error('dns', 'DNS logs proxy error', { error: error.message }); + log.error('dns', error, null, { note: 'DNS logs proxy error' }); // Error handled by middleware } }, 'dns-logs')); @@ -723,7 +723,7 @@ module.exports = function({ // Error handled by middleware } } catch (error) { - log.error('dns', 'DNS update check error', { error: error.message }); + log.error('dns', error, null, { note: 'DNS update check error' }); // Error handled by middleware } }, 'dns-check-update')); @@ -791,7 +791,7 @@ module.exports = function({ manualUpdateRequired: true }); } catch (error) { - log.error('dns', 'DNS update error', { error: error.message }); + log.error('dns', error, null, { note: 'DNS update error' }); // Error handled by middleware } }, 'dns-update')); diff --git a/dashcaddy-api/routes/exec.js b/dashcaddy-api/routes/exec.js index 034a04b..8069f4c 100644 --- a/dashcaddy-api/routes/exec.js +++ b/dashcaddy-api/routes/exec.js @@ -165,7 +165,7 @@ async function handleExec(ws, containerId, log, auth) { }); } catch (err) { - log.error('exec', 'Failed to start exec session', { containerId, error: err.message }); + log.error('exec', err, null, { note: 'Failed to start exec session', containerId }); if (ws.readyState === ws.OPEN) { ws.send(JSON.stringify({ type: 'error', message: err.message })); ws.close(); diff --git a/dashcaddy-api/routes/recipes/deploy.js b/dashcaddy-api/routes/recipes/deploy.js index 46b063c..e4b4b22 100644 --- a/dashcaddy-api/routes/recipes/deploy.js +++ b/dashcaddy-api/routes/recipes/deploy.js @@ -149,7 +149,7 @@ module.exports = function({ docker, credentialManager: _credentialManager, servi ok(res, response); } catch (error) { - log.error('recipe', 'Recipe deployment failed', { recipeId, error: error.message }); + log.error('recipe', error, null, { note: 'Recipe deployment failed', recipeId }); // Cleanup: remove partially deployed containers for (const deployed of deployedComponents) { diff --git a/dashcaddy-api/routes/services.js b/dashcaddy-api/routes/services.js index 0015dab..36cd69b 100644 --- a/dashcaddy-api/routes/services.js +++ b/dashcaddy-api/routes/services.js @@ -421,7 +421,7 @@ module.exports = function({ resyncHealthChecker?.().catch(() => {}); success(res, { message: `Service "${name}" added to dashboard` }); } catch (error) { - log.error('deploy', 'Error adding service', { error: error.message }); + log.error('deploy', error, null, { note: 'Error adding service' }); if (error.message.includes('already exists')) { errorResponse(res, safeErrorMessage(error), 409); } else { diff --git a/dashcaddy-api/routes/sites.js b/dashcaddy-api/routes/sites.js index 50f2672..cd80b65 100644 --- a/dashcaddy-api/routes/sites.js +++ b/dashcaddy-api/routes/sites.js @@ -46,7 +46,7 @@ module.exports = function({ asyncHandler, ok, caddy, dns, fetchT, buildDomain, a if (!response.ok) { const errorText = await response.text(); - log.error('caddy', 'Caddy reload failed', { error: errorText }); + log.error('caddy', new Error(`Caddy reload failed: ${errorText.slice(0, 500)}`)); throw new Error('Caddy reload failed. Check server logs for details.'); } diff --git a/dashcaddy-api/routes/themes.js b/dashcaddy-api/routes/themes.js index 073a238..338dbc4 100644 --- a/dashcaddy-api/routes/themes.js +++ b/dashcaddy-api/routes/themes.js @@ -31,7 +31,7 @@ module.exports = function({ asyncHandler, log }) { themes[slug] = data; } } catch (e) { - log.error('themes', 'Failed to read themes', { error: e.message }); + log.error('themes', e, null, { note: 'Failed to read themes' }); } return themes; } diff --git a/dashcaddy-api/server.js b/dashcaddy-api/server.js index 2fefd29..986908f 100644 --- a/dashcaddy-api/server.js +++ b/dashcaddy-api/server.js @@ -68,30 +68,29 @@ process.on('uncaughtException', (error) => { attachExecWS(server, log, authManager); log.info('server', 'WebSocket exec handler attached (auth enforced)'); - // DC-076: Attach dashboard WebSocket for real-time updates + // DC-076: Attach dashboard WebSocket for real-time updates. + // createApp() returns the live manager instances — use those instead + // of re-requiring the modules (which yields singletons for some + // managers and raw classes / namespace objects for others; calling + // .on() on a class threw on every boot and silently killed the WS). try { + const { ctx } = app.locals; const createDashboardWS = require('./src/websocket/dashboard-ws'); - const resourceMonitor = require('./src/managers/resource-monitor'); - const healthChecker = require('./src/monitoring/health-checker'); - const updateManager = require('./src/managers/update-manager'); - const dependencyManager = require('./src/managers/dependency-manager'); - const autoRestartManager = require('./src/managers/auto-restart-manager'); - const configDriftDetector = require('./src/managers/config-drift-detector'); - const sslMonitor = require('./src/monitoring/ssl-monitor'); createDashboardWS(server, { - resourceMonitor, - healthChecker, - updateManager, - dependencyManager, - autoRestartManager, - driftDetector: configDriftDetector, - sslMonitor, + resourceMonitor: ctx.resourceMonitor, + healthChecker: ctx.healthChecker, + updateManager: ctx.updateManager, + dependencyManager: ctx.dependencyManager, + autoRestartManager: ctx.autoRestartManager, + driftDetector: ctx.driftDetector, + sslMonitor: ctx.sslMonitor, + dnsPropagationChecker: ctx.dnsPropagationChecker, log, }); log.info('server', 'Dashboard WebSocket attached at /api/v1/ws'); } catch (err) { - log.error('server', 'Dashboard WebSocket failed to attach', { error: err.message }); + log.error('server', err, null, { feature: 'dashboard-ws' }); } // Start feature modules @@ -136,7 +135,7 @@ process.on('uncaughtException', (error) => { workflowEngine = new WorkflowEngine(workflowCtx); log.info('server', 'Workflow engine initialized'); } catch (err) { - log.error('server', 'Workflow engine failed to initialize', { error: err.message }); + log.error('server', err, null, { note: 'Workflow engine failed to initialize' }); } } @@ -145,7 +144,7 @@ process.on('uncaughtException', (error) => { // Clean up stale port locks portLockManager.cleanupStaleLocks() .then(() => log.info('server', 'Port lock cleanup completed')) - .catch(err => log.error('server', 'Port lock cleanup failed', { error: err.message })); + .catch(err => log.error('server', err, null, { note: 'Port lock cleanup failed' })); // Resource monitoring try { @@ -156,7 +155,7 @@ process.on('uncaughtException', (error) => { } log.info('server', 'Resource monitoring started'); } catch (err) { - log.error('server', 'Resource monitoring failed to start', { error: err.message }); + log.error('server', err, null, { note: 'Resource monitoring failed to start' }); } // Backup manager @@ -164,7 +163,7 @@ process.on('uncaughtException', (error) => { backupManager.start(); log.info('server', 'Backup manager started'); } catch (err) { - log.error('server', 'Backup manager failed to start', { error: err.message }); + log.error('server', err, null, { note: 'Backup manager failed to start' }); } // Security event workers (Caddy access log, fail2ban, shared_bans) @@ -175,7 +174,7 @@ process.on('uncaughtException', (error) => { startSecurityWorkers({ log }); log.info('server', 'Security event workers started'); } catch (err) { - log.error('server', 'Security event workers failed to start', { error: err.message }); + log.error('server', err, null, { note: 'Security event workers failed to start' }); } // Connect workflow engine to update manager for pre-update events @@ -206,7 +205,7 @@ process.on('uncaughtException', (error) => { healthChecker.start(); log.info('server', 'Health checker started'); } catch (err) { - log.error('server', 'Health checker failed to start', { error: err.message }); + log.error('server', err, null, { note: 'Health checker failed to start' }); } })(); @@ -215,7 +214,7 @@ process.on('uncaughtException', (error) => { updateManager.start(); log.info('server', 'Update manager started'); } catch (err) { - log.error('server', 'Update manager failed to start', { error: err.message }); + log.error('server', err, null, { note: 'Update manager failed to start' }); } // Self-updater @@ -234,7 +233,7 @@ process.on('uncaughtException', (error) => { }) .catch(() => {}); } catch (err) { - log.error('server', 'Self-updater failed to start', { error: err.message }); + log.error('server', err, null, { note: 'Self-updater failed to start' }); } // Docker maintenance (optional) @@ -257,7 +256,7 @@ process.on('uncaughtException', (error) => { } }); } catch (err) { - log.error('server', 'Docker maintenance failed to start', { error: err.message }); + log.error('server', err, null, { note: 'Docker maintenance failed to start' }); } } @@ -271,7 +270,7 @@ process.on('uncaughtException', (error) => { log.info('digest', `Daily digest generated for ${date}`); }); } catch (err) { - log.error('server', 'Log digest failed to start', { error: err.message }); + log.error('server', err, null, { note: 'Log digest failed to start' }); } } diff --git a/dashcaddy-api/src/app.js b/dashcaddy-api/src/app.js index d943994..8d9e66f 100644 --- a/dashcaddy-api/src/app.js +++ b/dashcaddy-api/src/app.js @@ -318,7 +318,7 @@ async function createApp() { const { writeJsonFile } = require('./utilities/fs-helpers'); await writeJsonFile(config.TOTP_CONFIG_FILE, totpConfig); } catch (e) { - log.error('config', 'Could not save TOTP config', { error: e.message }); + log.error('config', e, null, { note: 'Could not save TOTP config' }); } } @@ -437,7 +437,7 @@ async function createApp() { ctx.workflowEngine = workflowEngine; log.info('app', 'Workflow engine initialized'); } catch (err) { - log.error('app', 'Failed to initialize workflow engine', { error: err.message }); + log.error('app', err, null, { note: 'Failed to initialize workflow engine' }); } } @@ -501,12 +501,12 @@ async function createApp() { if (ctx.notification && ctx.resourceMonitor) { ctx.resourceMonitor.on('alert', (alertData) => { ctx.notification.sendAlert(alertData).catch(err => { - log.error('notification', 'Failed to send alert', { error: err.message }); + log.error('notification', err, null, { note: 'Failed to send alert' }); }); }); ctx.resourceMonitor.on('auto-restart', (data) => { ctx.notification.sendServiceEvent('auto-restart', data).catch(err => { - log.error('notification', 'Failed to send auto-restart notification', { error: err.message }); + log.error('notification', err, null, { note: 'Failed to send auto-restart notification' }); }); }); } @@ -514,12 +514,12 @@ async function createApp() { if (ctx.notification && ctx.backupManager) { ctx.backupManager.on('backup-complete', (data) => { ctx.notification.send('backup-complete', data).catch(err => { - log.error('notification', 'Failed to send backup-complete', { error: err.message }); + log.error('notification', err, null, { note: 'Failed to send backup-complete' }); }); }); ctx.backupManager.on('backup-failed', (data) => { ctx.notification.send('backup-failed', data).catch(err => { - log.error('notification', 'Failed to send backup-failed', { error: err.message }); + log.error('notification', err, null, { note: 'Failed to send backup-failed' }); }); }); } @@ -1097,6 +1097,10 @@ async function createApp() { app.use('/api', notFoundHandler); app.use(errorMiddleware); + // Expose ctx on the app for entry points (server.js dashboard-WS wiring) + // without changing the returned shape for existing callers/tests. + app.locals.ctx = ctx; + return { app, log, config: config.siteConfig, licenseManager }; } diff --git a/dashcaddy-api/src/config/migrations.js b/dashcaddy-api/src/config/migrations.js index 81952a0..9882d92 100644 --- a/dashcaddy-api/src/config/migrations.js +++ b/dashcaddy-api/src/config/migrations.js @@ -97,7 +97,7 @@ function loadAndMigrate(configFile, log) { raw = JSON.parse(fs.readFileSync(configFile, 'utf8')); } catch (e) { if (log && log.error) { - log.error('config-migration', 'Failed to parse config.json, using defaults', { error: e.message }); + log.error('config-migration', e, null, { note: 'Failed to parse config.json, using defaults' }); } raw = null; } diff --git a/dashcaddy-api/src/config/site.js b/dashcaddy-api/src/config/site.js index 43e11aa..b8bac9a 100644 --- a/dashcaddy-api/src/config/site.js +++ b/dashcaddy-api/src/config/site.js @@ -62,7 +62,7 @@ function loadSiteConfig(CONFIG_FILE, log) { } } catch (e) { if (log && log.error) { - log.error('config', 'Failed to load site config', { error: e.message }); + log.error('config', e, null, { note: 'Failed to load site config' }); } } } diff --git a/dashcaddy-api/src/context/dns.js b/dashcaddy-api/src/context/dns.js index 0ee966f..c8eae23 100644 --- a/dashcaddy-api/src/context/dns.js +++ b/dashcaddy-api/src/context/dns.js @@ -74,7 +74,7 @@ async function refreshDnsToken(username, password, server, fetchT, log) { return { success: false, error: result.errorMessage || 'Login failed' }; } catch (error) { - log.error('dns', 'DNS token refresh error', { error: error.message }); + log.error('dns', error, null, { note: 'DNS token refresh error' }); return { success: false, error: error.message }; } } @@ -141,7 +141,7 @@ async function ensureValidDnsToken(siteConfig, credentialManager, fetchT, log) { return await refreshDnsToken(username, password, server || primaryIp, fetchT, log); } } catch (err) { - log.error('dns', 'Credential manager error', { error: err.message }); + log.error('dns', err, null, { note: 'Credential manager error' }); } return { @@ -237,7 +237,7 @@ async function getTokenForServer(targetServer, siteConfig, credentialManager, fe return await authenticateToServer(username, password); } } catch (err) { - log.error('dns', 'Credential manager error', { server: targetServer, error: err.message }); + log.error('dns', err, null, { note: 'Credential manager error', server: targetServer }); } return { success: false, error: 'No DNS credentials configured' }; diff --git a/dashcaddy-api/src/context/index.js b/dashcaddy-api/src/context/index.js index 5ef0ff9..de535c6 100644 --- a/dashcaddy-api/src/context/index.js +++ b/dashcaddy-api/src/context/index.js @@ -121,7 +121,7 @@ function assembleContext({ try { fs.writeFileSync(TAILSCALE_CONFIG_FILE, JSON.stringify(meta, null, 2), 'utf8'); } catch (e) { - log.error('tailscale-coord', 'Failed to write tailscale-config.json', { error: e.message }); + log.error('tailscale-coord', e, null, { note: 'Failed to write tailscale-config.json' }); } } async function getCoordClient() { diff --git a/dashcaddy-api/src/context/provider-dns.js b/dashcaddy-api/src/context/provider-dns.js index 6f3d073..57cedd5 100644 --- a/dashcaddy-api/src/context/provider-dns.js +++ b/dashcaddy-api/src/context/provider-dns.js @@ -103,7 +103,7 @@ function createProviderDnsContext(siteConfig, buildDomain, credentialManager, fe } return { success: false, error: result.errorMessage || 'Login failed' }; } catch (error) { - log.error('dns', 'DNS token refresh error', { error: error.message }); + log.error('dns', error, null, { note: 'DNS token refresh error' }); return { success: false, error: error.message }; } } diff --git a/dashcaddy-api/src/dns/dns-propagation.js b/dashcaddy-api/src/dns/dns-propagation.js index f00416b..92307af 100644 --- a/dashcaddy-api/src/dns/dns-propagation.js +++ b/dashcaddy-api/src/dns/dns-propagation.js @@ -172,9 +172,7 @@ class DNSPropagationChecker extends EventEmitter { expectedIp, totalTime: result.totalTime }, 'success').catch(err => { - this.log.error('dns-propagation', 'Failed to send propagation notification', { - error: err.message - }); + this.log.error('dns-propagation', err, null, { note: 'Failed to send propagation notification' }); }); } } else { @@ -187,9 +185,7 @@ class DNSPropagationChecker extends EventEmitter { expectedIp, totalTime: result.totalTime }, 'warning').catch(err => { - this.log.error('dns-propagation', 'Failed to send timeout notification', { - error: err.message - }); + this.log.error('dns-propagation', err, null, { note: 'Failed to send timeout notification' }); }); } } diff --git a/dashcaddy-api/src/dns/dns-providers/technitium.js b/dashcaddy-api/src/dns/dns-providers/technitium.js index 7f519cb..f2e5c5a 100644 --- a/dashcaddy-api/src/dns/dns-providers/technitium.js +++ b/dashcaddy-api/src/dns/dns-providers/technitium.js @@ -118,7 +118,7 @@ class TechnitiumDNSProvider extends BaseDNSProvider { return await this._doLogin(username, password); } } catch (err) { - log.error('technitium', 'Global credential error', { error: err.message }); + log.error('technitium', err, null, { note: 'Global credential error' }); } return { @@ -164,7 +164,7 @@ class TechnitiumDNSProvider extends BaseDNSProvider { return { success: false, error: result.errorMessage || 'Login failed' }; } catch (error) { - log.error('technitium', 'Login error', { error: error.message }); + log.error('technitium', error, null, { note: 'Login error' }); return { success: false, error: error.message }; } } @@ -363,7 +363,7 @@ class TechnitiumDNSProvider extends BaseDNSProvider { const parsed = this._parseLogText(logText, limit); return { success: true, logs: parsed }; } catch (error) { - log.error('technitium', 'Failed to fetch DNS logs', { error: error.message }); + log.error('technitium', error, null, { note: 'Failed to fetch DNS logs' }); throw new Error(`Failed to get DNS logs: ${error.message}`); } } @@ -449,7 +449,7 @@ class TechnitiumDNSProvider extends BaseDNSProvider { throw new Error(result.errorMessage || 'Restart failed'); } catch (error) { - log.error('technitium', 'DNS restart error', { error: error.message }); + log.error('technitium', error, null, { note: 'DNS restart error' }); throw new Error(`Failed to restart DNS server: ${error.message}`); } } @@ -483,7 +483,7 @@ class TechnitiumDNSProvider extends BaseDNSProvider { throw new Error(result.errorMessage || 'Update check failed'); } catch (error) { - log.error('technitium', 'Update check error', { error: error.message }); + log.error('technitium', error, null, { note: 'Update check error' }); throw new Error(`Failed to check for updates: ${error.message}`); } } diff --git a/dashcaddy-api/src/managers/auto-restart-manager.js b/dashcaddy-api/src/managers/auto-restart-manager.js index 04663c3..c70b607 100644 --- a/dashcaddy-api/src/managers/auto-restart-manager.js +++ b/dashcaddy-api/src/managers/auto-restart-manager.js @@ -86,7 +86,7 @@ class AutoRestartManager extends EventEmitter { } this.log.info('auto-restart', 'Policies loaded', { count: this.policies.size }); } catch (err) { - this.log.error('auto-restart', 'Failed to load policies', { error: err.message }); + this.log.error('auto-restart', err, null, { note: 'Failed to load policies' }); } // Listen to health checker status transitions @@ -246,7 +246,7 @@ class AutoRestartManager extends EventEmitter { ...eventData, }); } catch (notifErr) { - this.log.error('auto-restart', 'Notification failed', { error: notifErr.message }); + this.log.error('auto-restart', notifErr, null, { note: 'Notification failed' }); } return { action: 'max-reached', ...eventData }; @@ -312,7 +312,7 @@ class AutoRestartManager extends EventEmitter { ...successData, }); } catch (notifErr) { - this.log.error('auto-restart', 'Notification failed', { error: notifErr.message }); + this.log.error('auto-restart', notifErr, null, { note: 'Notification failed' }); } this.log.info('auto-restart', 'Container restarted', { @@ -349,7 +349,7 @@ class AutoRestartManager extends EventEmitter { ...failData, }); } catch (notifErr) { - this.log.error('auto-restart', 'Notification failed', { error: notifErr.message }); + this.log.error('auto-restart', notifErr, null, { note: 'Notification failed' }); } this.log.error('auto-restart', 'Restart failed', { @@ -478,7 +478,7 @@ class AutoRestartManager extends EventEmitter { } await writeJsonFile(this.policiesFile, obj); } catch (err) { - this.log.error('auto-restart', 'Failed to save policies', { error: err.message }); + this.log.error('auto-restart', err, null, { note: 'Failed to save policies' }); } } diff --git a/dashcaddy-api/src/managers/config-drift-detector.js b/dashcaddy-api/src/managers/config-drift-detector.js index 899fc7e..bb6ff12 100644 --- a/dashcaddy-api/src/managers/config-drift-detector.js +++ b/dashcaddy-api/src/managers/config-drift-detector.js @@ -75,7 +75,7 @@ class ConfigDriftDetector extends EventEmitter { const data = await this.servicesStateManager.read(); services = Array.isArray(data) ? data : (data.services || []); } catch (err) { - this.log.error('drift', 'Failed to read services', { error: err.message }); + this.log.error('drift', err, null, { note: 'Failed to read services' }); } // Gather live Docker containers @@ -83,7 +83,7 @@ class ConfigDriftDetector extends EventEmitter { try { containers = await this.docker.client.listContainers({ all: true }); } catch (err) { - this.log.error('drift', 'Failed to list containers', { error: err.message }); + this.log.error('drift', err, null, { note: 'Failed to list containers' }); } // Build lookup maps diff --git a/dashcaddy-api/src/managers/notification-manager.js b/dashcaddy-api/src/managers/notification-manager.js index d5a3f0f..aa0050d 100644 --- a/dashcaddy-api/src/managers/notification-manager.js +++ b/dashcaddy-api/src/managers/notification-manager.js @@ -51,7 +51,7 @@ class NotificationManager extends EventEmitter { this.config = this._mergeConfig(DEFAULT_CONFIG, data); } } catch (error) { - this.log.error('notification', 'Failed to load config', { error: error.message }); + this.log.error('notification', error, null, { note: 'Failed to load config' }); } } @@ -89,7 +89,7 @@ class NotificationManager extends EventEmitter { fs.writeFileSync(this.NOTIFICATIONS_FILE, JSON.stringify(this.config, null, 2)); return true; } catch (error) { - this.log.error('notification', 'Failed to save config', { error: error.message }); + this.log.error('notification', error, null, { note: 'Failed to save config' }); throw error; } } @@ -429,7 +429,7 @@ class NotificationManager extends EventEmitter { const interval = (this.config.healthCheck?.intervalMinutes || 5) * 60 * 1000; this.healthDaemonInterval = setInterval(() => { this.checkHealth().catch(err => { - this.log.error('notification', 'Health check failed', { error: err.message }); + this.log.error('notification', err, null, { note: 'Health check failed' }); }); }, interval); @@ -488,7 +488,7 @@ class NotificationManager extends EventEmitter { lastCheck: this.config.healthCheck.lastCheck }; } catch (error) { - this.log.error('notification', 'Health check error', { error: error.message }); + this.log.error('notification', error, null, { note: 'Health check error' }); throw error; } } diff --git a/dashcaddy-api/src/monitoring/disk-space-monitor.js b/dashcaddy-api/src/monitoring/disk-space-monitor.js index e685301..962204b 100644 --- a/dashcaddy-api/src/monitoring/disk-space-monitor.js +++ b/dashcaddy-api/src/monitoring/disk-space-monitor.js @@ -331,7 +331,7 @@ class DiskSpaceMonitor extends EventEmitter { result.error = err.message; result.completedAt = new Date().toISOString(); if (this.log) { - this.log.error('disk', 'Disk cleanup failed', { error: err.message, level }); + this.log.error('disk', err, null, { note: 'Disk cleanup failed', level }); } return result; } diff --git a/dashcaddy-api/src/monitoring/ssl-monitor.js b/dashcaddy-api/src/monitoring/ssl-monitor.js index 6935482..15bff9b 100644 --- a/dashcaddy-api/src/monitoring/ssl-monitor.js +++ b/dashcaddy-api/src/monitoring/ssl-monitor.js @@ -143,7 +143,7 @@ class SSLMonitor extends EventEmitter { try { servicesData = await this.ctx.servicesStateManager.read(); } catch (err) { - this.log.error('ssl-monitor', 'Failed to read services', { error: err.message }); + this.log.error('ssl-monitor', err, null, { note: 'Failed to read services' }); return this.getStatus(); } @@ -212,13 +212,13 @@ class SSLMonitor extends EventEmitter { // Initial check (non-blocking) this.checkAll().catch(err => { - this.log.error('ssl-monitor', 'Initial SSL check failed', { error: err.message }); + this.log.error('ssl-monitor', err, null, { note: 'Initial SSL check failed' }); }); // Schedule periodic checks this.intervalHandle = setInterval(() => { this.checkAll().catch(err => { - this.log.error('ssl-monitor', 'Periodic SSL check failed', { error: err.message }); + this.log.error('ssl-monitor', err, null, { note: 'Periodic SSL check failed' }); }); }, this.config.intervalMs); @@ -299,7 +299,7 @@ class SSLMonitor extends EventEmitter { clearInterval(this.intervalHandle); this.intervalHandle = setInterval(() => { this.checkAll().catch(err => { - this.log.error('ssl-monitor', 'Periodic SSL check failed', { error: err.message }); + this.log.error('ssl-monitor', err, null, { note: 'Periodic SSL check failed' }); }); }, this.config.intervalMs); } @@ -355,7 +355,7 @@ class SSLMonitor extends EventEmitter { validTo: certResult.validTo }, level <= THRESHOLDS.CRITICAL ? 'error' : 'warning'); } catch (err) { - this.log.error('ssl-monitor', 'Failed to send SSL notification', { error: err.message }); + this.log.error('ssl-monitor', err, null, { note: 'Failed to send SSL notification' }); } } } else if (level === null) { diff --git a/dashcaddy-api/src/plugins/plugin-manager.js b/dashcaddy-api/src/plugins/plugin-manager.js index 5d081ca..31a7f43 100644 --- a/dashcaddy-api/src/plugins/plugin-manager.js +++ b/dashcaddy-api/src/plugins/plugin-manager.js @@ -81,7 +81,7 @@ class PluginManager extends EventEmitter { workflowActions: [...this.workflowActions.keys()], }); } catch (err) { - this.log.error('plugins', 'Failed to scan plugin directory', { error: err.message }); + this.log.error('plugins', err, null, { note: 'Failed to scan plugin directory' }); this.loaded = true; // Don't crash — just run without plugins } } diff --git a/dashcaddy-api/src/utilities/error-handler.js b/dashcaddy-api/src/utilities/error-handler.js index 790bd81..37a5419 100644 --- a/dashcaddy-api/src/utilities/error-handler.js +++ b/dashcaddy-api/src/utilities/error-handler.js @@ -7,15 +7,9 @@ * ./error-logger.js and its ./error.log file have been retired. */ -const path = require('path'); const { AppError } = require('./errors'); -const { LIMITS } = require('./constants'); const { logError: unifiedLogError, safeErrorMessage } = require('../utils/logging'); const { errorResponse } = require('../utils/responses'); -const platformPaths = require('../../platform-paths'); - -const ERROR_LOG_FILE = process.env.ERROR_LOG_FILE || path.join(platformPaths.dataDir, 'error.log'); -const MAX_ERROR_LOG_SIZE = LIMITS.ERROR_LOG_SIZE; /** * Global error handling middleware @@ -24,11 +18,10 @@ const MAX_ERROR_LOG_SIZE = LIMITS.ERROR_LOG_SIZE; function errorMiddleware(err, req, res, next) { // Log all errors with request context (unified, same file the rest of the app uses) unifiedLogError( - ERROR_LOG_FILE, - MAX_ERROR_LOG_SIZE, req.path, err, { + req, method: req.method, ip: req.ip, userId: req.user?.id, diff --git a/dashcaddy-api/src/utilities/startup-validator.js b/dashcaddy-api/src/utilities/startup-validator.js index 5215abd..7c73c97 100644 --- a/dashcaddy-api/src/utilities/startup-validator.js +++ b/dashcaddy-api/src/utilities/startup-validator.js @@ -228,7 +228,7 @@ async function syncHealthCheckerServices({ log, SERVICES_FILE, servicesStateMana log.info('health', 'Health checker synced', { added, updated, removed }); } } catch (error) { - log.error('health', 'Error syncing health checker', { error: error.message }); + log.error('health', error, null, { note: 'Error syncing health checker' }); } } diff --git a/dashcaddy-api/src/utils/logging.js b/dashcaddy-api/src/utils/logging.js index 85d0bc9..df67c88 100644 --- a/dashcaddy-api/src/utils/logging.js +++ b/dashcaddy-api/src/utils/logging.js @@ -417,6 +417,14 @@ function safeErrorMessage(error) { // Supports: logError(context, error, extra) → existing route call pattern async function logErrorWrapper(ctx, err, extra) { + // Guard against legacy call shapes that used to corrupt error.log: + // the old 5-arg form logError(file, maxSize, path, err, meta) made ctx + // a file path and turned maxSize (a number) into the "error". Detect and + // normalize so the real error always reaches error.log. + if (typeof ctx === 'string' && /^\/.*\.(log|json)$/.test(ctx) && typeof err === 'number') { + // Legacy shape: (file, size, reqPath, error, meta) → shift args. + [ctx, err, extra] = [arguments[2], arguments[3], { ...arguments[4], req: undefined }]; + } const req = extra?.req; const payload = extra ? { ...extra } : {}; if (payload.req) delete payload.req; diff --git a/status/dist/core.js b/status/dist/core.js index a0b71f4..0197537 100644 --- a/status/dist/core.js +++ b/status/dist/core.js @@ -1,4 +1,4 @@ -(function(l){"use strict";class a{constructor(){this.errors=[],this.maxErrors=50}logError(b,h,u={}){const y={timestamp:new Date().toISOString(),context:b,message:h instanceof Error?h.message:h,stack:h instanceof Error?h.stack:null,metadata:u};this.errors.push(y),this.errors.length>this.maxErrors&&this.errors.shift(),console.error(`[Onboarding Error] ${b}:`,h,u)}recoverFromError(b,h){switch(this.classifyError(b)){case"ELEMENT_NOT_FOUND":return this.logError("Element Not Found",b,{currentStep:h}),{action:"SKIP_STEP",nextStep:h+1,message:"Target element not found, skipping to next step"};case"STORAGE_UNAVAILABLE":return this.logError("Storage Unavailable",b),{action:"USE_MEMORY_STORAGE",message:"Local storage unavailable, using in-memory storage"};case"DRIVER_NOT_LOADED":return this.logError("Driver.js Not Loaded",b),{action:"ABORT_TOUR",message:"Driver.js library not loaded, cannot start tour"};case"INVALID_TOOLTIP":return this.logError("Invalid Tooltip Configuration",b,{currentStep:h}),{action:"SKIP_STEP",nextStep:h+1,message:"Invalid tooltip configuration, skipping"};case"THEME_DETECTION_FAILED":return this.logError("Theme Detection Failed",b),{action:"USE_DEFAULT_THEME",message:"Using default dark theme"};default:return this.logError("Unknown Error",b,{currentStep:h}),{action:"ABORT_TOUR",message:"Unexpected error occurred, aborting tour"}}}classifyError(b){const h=b.message||b.toString();return h.includes("element")&&h.includes("not found")?"ELEMENT_NOT_FOUND":h.includes("storage")||h.includes("quota")?"STORAGE_UNAVAILABLE":h.includes("driver")||h.includes("undefined")?"DRIVER_NOT_LOADED":h.includes("invalid")||h.includes("validation")?"INVALID_TOOLTIP":h.includes("theme")?"THEME_DETECTION_FAILED":"UNKNOWN"}getErrors(){return[...this.errors]}clearErrors(){this.errors=[]}getStatistics(){const b={total:this.errors.length,byContext:{},byType:{},recent:this.errors.slice(-10)};return this.errors.forEach(h=>{b.byContext[h.context]=(b.byContext[h.context]||0)+1;const u=this.classifyError({message:h.message});b.byType[u]=(b.byType[u]||0)+1}),b}handleDriverLoadFailure(){this.logError("Driver.js Load Failure","Driver.js library failed to load");const b=document.createElement("div");return b.id="onboarding-fallback",b.style.cssText=` +(function(c){"use strict";class s{constructor(){this.errors=[],this.maxErrors=50}logError(h,b,y={}){const v={timestamp:new Date().toISOString(),context:h,message:b instanceof Error?b.message:b,stack:b instanceof Error?b.stack:null,metadata:y};this.errors.push(v),this.errors.length>this.maxErrors&&this.errors.shift(),console.error(`[Onboarding Error] ${h}:`,b,y)}recoverFromError(h,b){switch(this.classifyError(h)){case"ELEMENT_NOT_FOUND":return this.logError("Element Not Found",h,{currentStep:b}),{action:"SKIP_STEP",nextStep:b+1,message:"Target element not found, skipping to next step"};case"STORAGE_UNAVAILABLE":return this.logError("Storage Unavailable",h),{action:"USE_MEMORY_STORAGE",message:"Local storage unavailable, using in-memory storage"};case"DRIVER_NOT_LOADED":return this.logError("Driver.js Not Loaded",h),{action:"ABORT_TOUR",message:"Driver.js library not loaded, cannot start tour"};case"INVALID_TOOLTIP":return this.logError("Invalid Tooltip Configuration",h,{currentStep:b}),{action:"SKIP_STEP",nextStep:b+1,message:"Invalid tooltip configuration, skipping"};case"THEME_DETECTION_FAILED":return this.logError("Theme Detection Failed",h),{action:"USE_DEFAULT_THEME",message:"Using default dark theme"};default:return this.logError("Unknown Error",h,{currentStep:b}),{action:"ABORT_TOUR",message:"Unexpected error occurred, aborting tour"}}}classifyError(h){const b=h.message||h.toString();return b.includes("element")&&b.includes("not found")?"ELEMENT_NOT_FOUND":b.includes("storage")||b.includes("quota")?"STORAGE_UNAVAILABLE":b.includes("driver")||b.includes("undefined")?"DRIVER_NOT_LOADED":b.includes("invalid")||b.includes("validation")?"INVALID_TOOLTIP":b.includes("theme")?"THEME_DETECTION_FAILED":"UNKNOWN"}getErrors(){return[...this.errors]}clearErrors(){this.errors=[]}getStatistics(){const h={total:this.errors.length,byContext:{},byType:{},recent:this.errors.slice(-10)};return this.errors.forEach(b=>{h.byContext[b.context]=(h.byContext[b.context]||0)+1;const y=this.classifyError({message:b.message});h.byType[y]=(h.byType[y]||0)+1}),h}handleDriverLoadFailure(){this.logError("Driver.js Load Failure","Driver.js library failed to load");const h=document.createElement("div");return h.id="onboarding-fallback",h.style.cssText=` position: fixed; bottom: 20px; right: 20px; @@ -10,32 +10,32 @@ z-index: 9999; max-width: 300px; font-size: 14px; - `,b.innerHTML=` + `,h.innerHTML=` Welcome to DashCaddy!

The interactive tour is unavailable, but you can explore the dashboard freely. Check the documentation for help getting started.

- `,document.body.appendChild(b),setTimeout(()=>{b.parentNode&&b.parentNode.removeChild(b)},1e4),!0}handleStorageUnavailable(){this.logError("Storage Unavailable","Local storage is not available");const b={data:{},getItem(h){return this.data[h]||null},setItem(h,u){this.data[h]=u},removeItem(h){delete this.data[h]},clear(){this.data={}}};return console.warn("[ErrorHandler] Using in-memory storage - progress will not persist"),b}sendToErrorTracking(b){}}l.ErrorHandler=a,console.log("[ErrorHandler] Module loaded")})(window),(function(){try{var a=typeof localStorage<"u"&&localStorage.getItem("dashcaddy-health-settings")||null;if(a){var f=JSON.parse(a);f.statsPollingInterval&&f.statsPollingInterval>=5&&f.statsPollingInterval<=3600&&(window.__DC_STATS_OVERRIDE=f.statsPollingInterval*1e3)}}catch{}})();const DC={NAME:"DashCaddy",POLL:{DASHBOARD:1e4,LOGS:3e3,STATS:typeof window<"u"&&window.__DC_STATS_OVERRIDE||5e3,WEATHER:6e5,HEALTH:1e3,DEPLOY_SSL:5e3},DELAYS:{BTN_RESET:2e3,RELOAD:5e3,MODAL_CLOSE:500,PORT_CHECK:500,DEPLOY_INIT:3e3},DEFAULTS:{DNS_PORT:"5380",SERVICE_PORT:"8080",TTL:300,CADDYFILE:"C:\\caddy\\Caddyfile"}},errorHandler=new ErrorHandler,_cachedCfg=JSON.parse(localStorage.getItem("dashcaddy_site_config")||"null"),SITE={tld:_cachedCfg&&_cachedCfg.tld||".home",dnsIp:"",dnsPort:DC.DEFAULTS.DNS_PORT,dnsServers:{},configurationType:_cachedCfg&&_cachedCfg.configurationType||"homelab",domain:_cachedCfg&&_cachedCfg.domain||"",defaults:_cachedCfg&&_cachedCfg.defaults||{},routingMode:_cachedCfg&&_cachedCfg.routingMode||"subdomain",onboardingCompleted:!1};window.__dashcaddySiteConfigLoaded=(async function(){try{const b=await fetch("/api/v1/config");if(b.ok){const h=await b.json();if(h.tld&&(SITE.tld=h.tld.startsWith(".")?h.tld:"."+h.tld),h.dns&&(SITE.dnsIp=h.dns.ip||"",SITE.dnsPort=h.dns.port||DC.DEFAULTS.DNS_PORT),h.dnsServers&&typeof h.dnsServers=="object")for(const[y,c]of Object.entries(h.dnsServers))y!=="__proto__"&&y!=="constructor"&&y!=="prototype"&&(SITE.dnsServers[y]=c);h.configurationType&&(SITE.configurationType=h.configurationType),h.domain&&(SITE.domain=h.domain),h.defaults&&(SITE.defaults=h.defaults),h.routingMode&&(SITE.routingMode=h.routingMode),SITE.onboardingCompleted=h.onboardingCompleted===!0,localStorage.setItem("dashcaddy_site_config",JSON.stringify({tld:SITE.tld,configurationType:SITE.configurationType,domain:SITE.domain,routingMode:SITE.routingMode})),renderDnsCards();const u=document.getElementById("manage-tokens");u&&(u.style.display=Object.keys(SITE.dnsServers).length?"":"none")}}catch{}document.querySelectorAll("[data-tld]").forEach(b=>b.textContent=SITE.tld);const a=document.getElementById("edit-tld-suffix");a&&(a.textContent=SITE.tld);const f=document.getElementById("external-proxy-ip");f&&SITE.dnsIp&&(f.value=SITE.dnsIp,f.placeholder=SITE.dnsIp)})();function buildDomain(l){return l+SITE.tld}function buildServiceUrl(l){return SITE.routingMode==="subdirectory"&&SITE.domain?"https://"+SITE.domain+"/"+l:SITE.configurationType==="public"&&SITE.domain?"https://"+l+"."+SITE.domain:"https://"+buildDomain(l)}function getDnsServerAddr(l){const a=SITE.dnsServers[l];return a?`${a.ip}:${a.port}`:buildDomain(l)}function getPrimaryDnsId(){if(!SITE.dnsIp)return null;for(const[l,a]of Object.entries(SITE.dnsServers))if(a.ip===SITE.dnsIp)return l;return null}function renderDnsCards(){const l=document.querySelector(".top");if(!l)return;const a=Object.keys(SITE.dnsServers);if(!a.length)return;const f='',b=l.firstElementChild;a.forEach(h=>{const u=escapeHtml(h),y=escapeHtml((SITE.dnsServers[h].name||h).toUpperCase()),c=document.createElement("div");c.className="card",c.setAttribute("data-app",h),c.setAttribute("data-status","off"),c.innerHTML=`
${f}
${y}OFF
--
--
`,l.insertBefore(c,b)}),window.DCI18n&&window.DCI18n.isLoaded()&&window.DCI18n.applyTranslations()}window.renderDnsCards=renderDnsCards;let csrfToken=null;async function getCSRFToken(){if(csrfToken)return csrfToken;try{const l=await fetch("/api/v1/csrf-token");if(!l.ok)throw new Error("Failed to fetch CSRF token");return csrfToken=(await l.json()).token,csrfToken}catch(l){throw errorHandler.logError("[CSRF] Get Token",l,{function:"getCSRFToken"}),l}}async function secureFetch(l,a={}){const f=(a.method||"GET").toUpperCase(),b=!["GET","HEAD","OPTIONS"].includes(f);if(b)try{const u=await getCSRFToken();a.headers={...a.headers,"X-CSRF-Token":u}}catch(u){errorHandler.logError("[CSRF] Add to Request",u,{function:"secureFetch"})}a.signal||(a={...a,signal:AbortSignal.timeout(15e3)}),a.credentials=a.credentials||"same-origin";const h=await fetch(l,a);if(b&&h.status===403)try{const u=await h.clone().json();if(u.error&&(u.error.includes("DC-100")||u.error.includes("DC-101"))){csrfToken=null;const y=await getCSRFToken();return a.headers={...a.headers,"X-CSRF-Token":y},a.signal=AbortSignal.timeout(15e3),fetch(l,a)}}catch{}return h}async function postJSON(l,a){const f=await secureFetch(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),b=await f.json();if(!f.ok||b.success===!1)throw new Error(b.error||`Request failed (${f.status})`);return b}async function getJSON(l){const a=await secureFetch(l);if(!a.ok){let f=`Request failed (${a.status})`;try{f=(await a.json()).error||f}catch{}throw new Error(f)}return a.json()}async function deleteAPI(l){const a=await secureFetch(l,{method:"DELETE"}),f=await a.json();if(!a.ok||f.success===!1)throw new Error(f.error||`Delete failed (${a.status})`);return f}async function withButton(l,a,f,b={}){const h=l.innerHTML,{successText:u="\u2705",resetDelay:y=DC.DELAYS.BTN_RESET}=b;l.disabled=!0,l.innerHTML=a;try{const c=await f();return l.innerHTML=u,setTimeout(()=>{l.innerHTML=h,l.disabled=!1},y),c}catch(c){throw l.innerHTML=h,l.disabled=!1,c}}function openModal(l){document.getElementById(l)?.classList.add("show")}function closeModal(l){document.getElementById(l)?.classList.remove("show")}function wireModal(l,...a){l&&(l.addEventListener("click",f=>{f.target===l&&l.classList.remove("show")}),a.forEach(f=>{f&&typeof f.addEventListener=="function"&&f.addEventListener("click",()=>l.classList.remove("show"))}))}function showNotification(l,a="info",f=3e3){const b=document.querySelector(".deploy-notification");b&&b.remove();const h={info:{bg:"#2196F3",fg:"#fff"},success:{bg:"var(--ok-bg)",fg:"var(--ok-fg)"},error:{bg:"#f44336",fg:"#fff"},warning:{bg:"#ff9800",fg:"#fff"}},u=h[a]||h.info,y=document.createElement("div");y.className="deploy-notification",y.textContent=l,y.style.cssText=` + `,document.body.appendChild(h),setTimeout(()=>{h.parentNode&&h.parentNode.removeChild(h)},1e4),!0}handleStorageUnavailable(){this.logError("Storage Unavailable","Local storage is not available");const h={data:{},getItem(b){return this.data[b]||null},setItem(b,y){this.data[b]=y},removeItem(b){delete this.data[b]},clear(){this.data={}}};return console.warn("[ErrorHandler] Using in-memory storage - progress will not persist"),h}sendToErrorTracking(h){}}c.ErrorHandler=s,console.log("[ErrorHandler] Module loaded")})(window),(function(){try{var s=typeof localStorage<"u"&&localStorage.getItem("dashcaddy-health-settings")||null;if(s){var m=JSON.parse(s);m.statsPollingInterval&&m.statsPollingInterval>=5&&m.statsPollingInterval<=3600&&(window.__DC_STATS_OVERRIDE=m.statsPollingInterval*1e3)}}catch{}})();const DC={NAME:"DashCaddy",POLL:{DASHBOARD:1e4,LOGS:3e3,STATS:typeof window<"u"&&window.__DC_STATS_OVERRIDE||5e3,WEATHER:6e5,HEALTH:1e3,DEPLOY_SSL:5e3},DELAYS:{BTN_RESET:2e3,RELOAD:5e3,MODAL_CLOSE:500,PORT_CHECK:500,DEPLOY_INIT:3e3},DEFAULTS:{DNS_PORT:"5380",SERVICE_PORT:"8080",TTL:300,CADDYFILE:"C:\\caddy\\Caddyfile"}},errorHandler=new ErrorHandler,_cachedCfg=JSON.parse(localStorage.getItem("dashcaddy_site_config")||"null"),SITE={tld:_cachedCfg&&_cachedCfg.tld||".home",dnsIp:"",dnsPort:DC.DEFAULTS.DNS_PORT,dnsServers:{},configurationType:_cachedCfg&&_cachedCfg.configurationType||"homelab",domain:_cachedCfg&&_cachedCfg.domain||"",defaults:_cachedCfg&&_cachedCfg.defaults||{},routingMode:_cachedCfg&&_cachedCfg.routingMode||"subdomain",onboardingCompleted:!1};window.__dashcaddySiteConfigLoaded=(async function(){try{const h=await fetch("/api/v1/config");if(h.ok){const b=await h.json();if(b.tld&&(SITE.tld=b.tld.startsWith(".")?b.tld:"."+b.tld),b.dns&&(SITE.dnsIp=b.dns.ip||"",SITE.dnsPort=b.dns.port||DC.DEFAULTS.DNS_PORT),b.dnsServers&&typeof b.dnsServers=="object")for(const[v,u]of Object.entries(b.dnsServers))v!=="__proto__"&&v!=="constructor"&&v!=="prototype"&&(SITE.dnsServers[v]=u);b.configurationType&&(SITE.configurationType=b.configurationType),b.domain&&(SITE.domain=b.domain),b.defaults&&(SITE.defaults=b.defaults),b.routingMode&&(SITE.routingMode=b.routingMode),SITE.onboardingCompleted=b.onboardingCompleted===!0,localStorage.setItem("dashcaddy_site_config",JSON.stringify({tld:SITE.tld,configurationType:SITE.configurationType,domain:SITE.domain,routingMode:SITE.routingMode})),renderDnsCards();const y=document.getElementById("manage-tokens");y&&(y.style.display=Object.keys(SITE.dnsServers).length?"":"none")}}catch{}document.querySelectorAll("[data-tld]").forEach(h=>h.textContent=SITE.tld);const s=document.getElementById("edit-tld-suffix");s&&(s.textContent=SITE.tld);const m=document.getElementById("external-proxy-ip");m&&SITE.dnsIp&&(m.value=SITE.dnsIp,m.placeholder=SITE.dnsIp)})();function buildDomain(c){return c+SITE.tld}function buildServiceUrl(c){return SITE.routingMode==="subdirectory"&&SITE.domain?"https://"+SITE.domain+"/"+c:SITE.configurationType==="public"&&SITE.domain?"https://"+c+"."+SITE.domain:"https://"+buildDomain(c)}function getDnsServerAddr(c){const s=SITE.dnsServers[c];return s?`${s.ip}:${s.port}`:buildDomain(c)}function getPrimaryDnsId(){if(!SITE.dnsIp)return null;for(const[c,s]of Object.entries(SITE.dnsServers))if(s.ip===SITE.dnsIp)return c;return null}function renderDnsCards(){const c=document.querySelector(".top");if(!c)return;const s=Object.keys(SITE.dnsServers);if(!s.length)return;const m='',h=c.firstElementChild;s.forEach(b=>{const y=escapeHtml(b),v=escapeHtml((SITE.dnsServers[b].name||b).toUpperCase()),u=document.createElement("div");u.className="card",u.setAttribute("data-app",b),u.setAttribute("data-status","off"),u.innerHTML=`
${m}
${v}OFF
--
--
`,c.insertBefore(u,h)}),window.DCI18n&&window.DCI18n.isLoaded()&&window.DCI18n.applyTranslations()}window.renderDnsCards=renderDnsCards;let csrfToken=null;async function getCSRFToken(){if(csrfToken)return csrfToken;try{const c=await fetch("/api/v1/csrf-token");if(!c.ok)throw new Error("Failed to fetch CSRF token");return csrfToken=(await c.json()).token,csrfToken}catch(c){throw errorHandler.logError("[CSRF] Get Token",c,{function:"getCSRFToken"}),c}}async function secureFetch(c,s={}){const m=(s.method||"GET").toUpperCase(),h=!["GET","HEAD","OPTIONS"].includes(m);if(h)try{const y=await getCSRFToken();s.headers={...s.headers,"X-CSRF-Token":y}}catch(y){errorHandler.logError("[CSRF] Add to Request",y,{function:"secureFetch"})}s.signal||(s={...s,signal:AbortSignal.timeout(15e3)}),s.credentials=s.credentials||"same-origin";const b=await fetch(c,s);if(h&&b.status===403)try{const y=await b.clone().json();if(y.error&&(y.error.includes("DC-100")||y.error.includes("DC-101"))){csrfToken=null;const v=await getCSRFToken();return s.headers={...s.headers,"X-CSRF-Token":v},s.signal=AbortSignal.timeout(15e3),fetch(c,s)}}catch{}return b}async function postJSON(c,s){const m=await secureFetch(c,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),h=await m.json();if(!m.ok||h.success===!1)throw new Error(h.error||`Request failed (${m.status})`);return h}async function getJSON(c){const s=await secureFetch(c);if(!s.ok){let m=`Request failed (${s.status})`;try{m=(await s.json()).error||m}catch{}throw new Error(m)}return s.json()}async function deleteAPI(c){const s=await secureFetch(c,{method:"DELETE"}),m=await s.json();if(!s.ok||m.success===!1)throw new Error(m.error||`Delete failed (${s.status})`);return m}async function withButton(c,s,m,h={}){const b=c.innerHTML,{successText:y="\u2705",resetDelay:v=DC.DELAYS.BTN_RESET}=h;c.disabled=!0,c.innerHTML=s;try{const u=await m();return c.innerHTML=y,setTimeout(()=>{c.innerHTML=b,c.disabled=!1},v),u}catch(u){throw c.innerHTML=b,c.disabled=!1,u}}function openModal(c){document.getElementById(c)?.classList.add("show")}function closeModal(c){document.getElementById(c)?.classList.remove("show")}function wireModal(c,...s){c&&(c.addEventListener("click",m=>{m.target===c&&c.classList.remove("show")}),s.forEach(m=>{m&&typeof m.addEventListener=="function"&&m.addEventListener("click",()=>c.classList.remove("show"))}))}function showNotification(c,s="info",m=3e3){const h=document.querySelector(".deploy-notification");h&&h.remove();const b={info:{bg:"#2196F3",fg:"#fff"},success:{bg:"var(--ok-bg)",fg:"var(--ok-fg)"},error:{bg:"#f44336",fg:"#fff"},warning:{bg:"#ff9800",fg:"#fff"}},y=b[s]||b.info,v=document.createElement("div");v.className="deploy-notification",v.textContent=c,v.style.cssText=` position: fixed; top: 20px; right: 20px; - background: ${u.bg}; color: ${u.fg}; + background: ${y.bg}; color: ${y.fg}; padding: 16px 24px; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,.3); z-index: 10000; animation: slideIn 0.3s ease-out; max-width: 400px; white-space: pre-line; font-size: 14px; - `,document.body.appendChild(y),f>0&&setTimeout(()=>y.remove(),f)}function timeAgo(l){const a=Date.now()-new Date(l).getTime();return a<6e4?"just now":a<36e5?Math.floor(a/6e4)+"m ago":a<864e5?Math.floor(a/36e5)+"h ago":Math.floor(a/864e5)+"d ago"}function safeGet(l,a=null){try{const f=localStorage.getItem(l);return f!==null?f:a}catch{return a}}function safeSet(l,a){try{localStorage.setItem(l,a)}catch{}}function safeRemove(l){try{localStorage.removeItem(l)}catch{}}function safeSessionGet(l,a=null){try{const f=sessionStorage.getItem(l);return f!==null?f:a}catch{return a}}function safeSessionSet(l,a){try{sessionStorage.setItem(l,a)}catch{}}function safeGetJSON(l,a=null){try{const f=localStorage.getItem(l);return f?JSON.parse(f):a}catch{return a}}function escapeHtml(l){return String(l??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function injectModal(l,a){document.getElementById(l)||document.body.insertAdjacentHTML("beforeend",a)}const DC_BUS={_handlers:{},on(l,a){var f;((f=this._handlers)[l]||(f[l]=[])).push(a)},off(l,a){this._handlers[l]=this._handlers[l]?.filter(f=>f!==a)},emit(l,a){this._handlers[l]?.forEach(f=>f(a))}},AppState={_apps:[],getApps(){return this._apps},setApps(l){this._apps=l,window.APPS=l,DC_BUS.emit("apps:changed",l)},findApp(l){return this._apps.find(a=>a.id===l)},addApp(l){this._apps.push(l),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)},removeApp(l){const a=this._apps.findIndex(f=>f.id===l);return a>-1&&(this._apps.splice(a,1),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)),a>-1},updateApp(l,a){const f=this._apps.find(b=>b.id===l);if(f){for(const[b,h]of Object.entries(a))b!=="__proto__"&&b!=="constructor"&&b!=="prototype"&&(f[b]=h);DC_BUS.emit("apps:changed",this._apps)}return f}};(function(){function l(){const b=document.createElement("div");return b.className="skeleton-card",b.innerHTML='
',b}function a(b){const h=document.getElementById("cards");if(!(!h||h.querySelector(".card"))){b=b||6;for(let u=0;u.4,A={};return A.hover=k?v(w,B,.35):v(w,$,.08),A["card-hover"]=v(w,A.hover,.5),A.base=v(B,w,.6),A["fg-muted"]=v(E,B,.35),A.success=S,A.error=T,A.warning=k?"#d68a00":"#f39c12",A}function e(C,B){var $=B.lightBg||B.bg&&i(B.bg)>.4,E=B.accent||B["accent-strong"]||"#888888",w=d(E);return $?":root."+C+` body { + `,document.body.appendChild(v),m>0&&setTimeout(()=>v.remove(),m)}function timeAgo(c){const s=Date.now()-new Date(c).getTime();return s<6e4?"just now":s<36e5?Math.floor(s/6e4)+"m ago":s<864e5?Math.floor(s/36e5)+"h ago":Math.floor(s/864e5)+"d ago"}function safeGet(c,s=null){try{const m=localStorage.getItem(c);return m!==null?m:s}catch{return s}}function safeSet(c,s){try{localStorage.setItem(c,s)}catch{}}function safeRemove(c){try{localStorage.removeItem(c)}catch{}}function safeSessionGet(c,s=null){try{const m=sessionStorage.getItem(c);return m!==null?m:s}catch{return s}}function safeSessionSet(c,s){try{sessionStorage.setItem(c,s)}catch{}}function safeGetJSON(c,s=null){try{const m=localStorage.getItem(c);return m?JSON.parse(m):s}catch{return s}}function escapeHtml(c){return String(c??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function injectModal(c,s){document.getElementById(c)||document.body.insertAdjacentHTML("beforeend",s)}const DC_BUS={_handlers:{},on(c,s){var m;((m=this._handlers)[c]||(m[c]=[])).push(s)},off(c,s){this._handlers[c]=this._handlers[c]?.filter(m=>m!==s)},emit(c,s){this._handlers[c]?.forEach(m=>m(s))}},AppState={_apps:[],getApps(){return this._apps},setApps(c){this._apps=c,window.APPS=c,DC_BUS.emit("apps:changed",c)},findApp(c){return this._apps.find(s=>s.id===c)},addApp(c){this._apps.push(c),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)},removeApp(c){const s=this._apps.findIndex(m=>m.id===c);return s>-1&&(this._apps.splice(s,1),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)),s>-1},updateApp(c,s){const m=this._apps.find(h=>h.id===c);if(m){for(const[h,b]of Object.entries(s))h!=="__proto__"&&h!=="constructor"&&h!=="prototype"&&(m[h]=b);DC_BUS.emit("apps:changed",this._apps)}return m}};(function(){function c(){const h=document.createElement("div");return h.className="skeleton-card",h.innerHTML='
',h}function s(h){const b=document.getElementById("cards");if(!(!b||b.querySelector(".card"))){h=h||6;for(let y=0;y.4,A={};return A.hover=k?g(x,B,.35):g(x,$,.08),A["card-hover"]=g(x,A.hover,.5),A.base=g(B,x,.6),A["fg-muted"]=g(E,B,.35),A.success=S,A.error=T,A.warning=k?"#d68a00":"#f39c12",A}function e(C,B){var $=B.lightBg||B.bg&&d(B.bg)>.4,E=B.accent||B["accent-strong"]||"#888888",x=a(E);return $?":root."+C+` body { background: - radial-gradient(1200px 800px at 10% -10%, rgba(`+w.r+","+w.g+","+w.b+`, .08), transparent 60%), - radial-gradient(1000px 700px at 110% 10%, rgba(`+w.r+","+w.g+","+w.b+`, .05), transparent 55%), + radial-gradient(1200px 800px at 10% -10%, rgba(`+x.r+","+x.g+","+x.b+`, .08), transparent 60%), + radial-gradient(1000px 700px at 110% 10%, rgba(`+x.r+","+x.g+","+x.b+`, .05), transparent 55%), var(--bg); } `:":root."+C+` body { background: - radial-gradient(1200px 900px at 8% -12%, rgba(`+w.r+","+w.g+","+w.b+`, .10), transparent 60%), - radial-gradient(1000px 700px at 110% -10%, rgba(`+w.r+","+w.g+","+w.b+`, .07), transparent 55%), + radial-gradient(1200px 900px at 8% -12%, rgba(`+x.r+","+x.g+","+x.b+`, .10), transparent 60%), + radial-gradient(1000px 700px at 110% -10%, rgba(`+x.r+","+x.g+","+x.b+`, .07), transparent 55%), var(--bg); } -`}function s(C,B){var $=B.lightBg||B.bg&&i(B.bg)>.4;return $?":root."+C+` button:hover { +`}function i(C,B){var $=B.lightBg||B.bg&&d(B.bg)>.4;return $?":root."+C+` button:hover { background: color-mix(in srgb, var(--accent-strong) 12%, white 88%); border-color: rgba(0, 0, 0, .15); box-shadow: 0 1px 6px rgba(0, 0, 0, .08), inset 0 1px 0 rgba(255, 255, 255, .8); @@ -44,20 +44,20 @@ background: color-mix(in srgb, var(--accent) 18%, transparent); border-color: color-mix(in srgb, var(--accent) 35%, var(--border)); } -`}function n(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function r(){u.forEach(function(C){document.documentElement.style.removeProperty("--"+C)})}function g(C,B){var $=C.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");$||($="custom"),b.indexOf($)!==-1&&($=$+"-custom");for(var E=safeGetJSON(a,{}),w=$,S=2;E[$]&&$!==B;)$=w+"-"+S++;return $}function m(C){var B=document.getElementById("user-theme-styles");B&&B.remove(),h.length=b.length,Object.keys(p).forEach(function(T){b.indexOf(T)===-1&&delete p[T]});var $=C||safeGetJSON(a,{}),E=Object.keys($);if(E=E.filter(function(T){return b.indexOf(T)===-1}),!!E.length){var w="";E.forEach(function(T){var k=$[T];h.indexOf(T)===-1&&h.push(T);var A={};u.forEach(function(O){k[O]&&(A[O]=k[O])}),A["card-bg"]=k["card-base"]||k.bg,k.lightBg&&(A.lightBg=!0);var D=t(A);c.forEach(function(O){!A[O]&&D[O]&&(A[O]=D[O])}),p[T]=A,w+=":root."+T+` { -`,u.forEach(function(O){A[O]&&(w+=" --"+O+": "+A[O]+`; -`)}),w+=`} -`,w+=e(T,A),w+=s(T,A)});var S=document.createElement("style");S.id="user-theme-styles",S.textContent=w,document.head.appendChild(S)}}function x(){secureFetch("/api/v1/themes").then(function(C){return C.json()}).then(function(C){if(!(!C.success||!C.themes)){var B=C.themes,$=safeGetJSON(a,{});if(JSON.stringify(B)!==JSON.stringify($)){safeSet(a,JSON.stringify(B)),m(B);var E=safeGet(l);E&&h.indexOf(E)!==-1&&L(E)}}}).catch(function(){})}function I(){var C=safeGetJSON(f);if(C){var B=C.name||"Custom",$=g(B),E={name:B};u.forEach(function(T){C[T]&&(E[T]=C[T])});var w=safeGetJSON(a,{});w[$]=E,safeSet(a,JSON.stringify(w)),safeGet(l)==="custom"&&safeSet(l,$),safeRemove(f);var S={};u.forEach(function(T){E[T]&&(S[T]=E[T])}),fetch("/api/v1/themes/"+$,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:B,colors:S})}).catch(function(){})}}function L(C){document.documentElement.classList.add("theme-transitioning"),h.forEach(function(w){w!=="dark"&&document.documentElement.classList.remove(w)}),r(),C!=="dark"&&document.documentElement.classList.add(C),safeSet(l,C);var B=p[C],$=document.querySelector('meta[name="theme-color"]');$&&B&&$.setAttribute("content",B.bg);var E=B&&B.lightBg;!E&&B&&B.bg&&(E=i(B.bg)>.4),E?document.documentElement.classList.add("light-bg"):document.documentElement.classList.remove("light-bg"),setTimeout(function(){document.documentElement.classList.remove("theme-transitioning")},300)}I(),m();var P=safeGet(l);P==="red"&&(P="black",safeSet(l,"black")),P&&P!=="dark"&&h.indexOf(P)===-1&&(P=null),L(P||n()),x(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",function(C){safeGet(l)||L(C.matches?"dark":"light")}),window.THEMES=h,window.BUILTIN_THEMES=b,window.THEME_COLORS=p,window.THEME_PROPS=u,window.BASE_PROPS=y,window.DERIVED_PROPS=c,window.USER_THEMES_KEY=a,window.applyTheme=L,window.clearCustomProperties=r,window.injectUserThemeStyles=m,window.syncThemesFromServer=x,window.slugifyThemeName=g,window.getActiveTheme=function(){return safeGet(l)||n()},window.deriveExtendedColors=t,window.hexToRgb=d,window.rgbToHex=o,window.blendColors=v})(),(function(){let l=null;async function a(){if(l)return l;try{const d=await fetch("/api/v1/auth/login/methods",{cache:"no-store"});if(!d.ok)throw new Error(`methods HTTP ${d.status}`);const o=await d.json();return l=Array.isArray(o.providers)?o.providers:[],l}catch(d){return console.warn("[auth-gate] methods fetch failed; falling back to TOTP-only",d),[]}}function f(d){const o=document.getElementById("totp-overlay");if(!o)return;const v=o.querySelector(".totp-card");if(!v)return;const i=v.innerHTML;v.dataset.originalBody||(v.dataset.originalBody=i);const t=d.map(e=>{const s=e.config&&(e.config.label||e.name)||e.name;return``}).join(` -`);v.innerHTML=` +`);g.innerHTML=`

Choose how to sign in

${t}
- `,o.classList.add("show"),v.querySelectorAll(".provider-btn").forEach(e=>{e.addEventListener("click",()=>{const s=e.dataset.provider,n=d.find(r=>r.name===s);h(n)})})}function b(){const d=document.getElementById("totp-overlay");if(!d)return;const o=d.querySelector(".totp-card");!o||!o.dataset.originalBody||(o.innerHTML=o.dataset.originalBody,window.location.reload())}function h(d){const o=document.getElementById("totp-overlay");if(!o)return;const v=o.querySelector(".totp-card");if(v){if(d.name==="totp"){window.location.reload();return}if(d.name==="email"){v.innerHTML=` + `,o.classList.add("show"),g.querySelectorAll(".provider-btn").forEach(e=>{e.addEventListener("click",()=>{const i=e.dataset.provider,n=a.find(r=>r.name===i);b(n)})})}function h(){const a=document.getElementById("totp-overlay");if(!a)return;const o=a.querySelector(".totp-card");!o||!o.dataset.originalBody||(o.innerHTML=o.dataset.originalBody,window.location.reload())}function b(a){const o=document.getElementById("totp-overlay");if(!o)return;const g=o.querySelector(".totp-card");if(g){if(a.name==="totp"){window.location.reload();return}if(a.name==="email"){g.innerHTML=`

Sign in with email

@@ -75,13 +75,13 @@
\u2190 Back
- `,o.classList.add("show");const i=v.querySelector("#auth-gate-email-input"),t=v.querySelector("#auth-gate-email-submit"),e=v.querySelector("#auth-gate-email-status"),s=v.querySelector("#auth-gate-back");t.addEventListener("click",async()=>{const n=(i.value||"").trim();if(!n||!n.includes("@")){e.textContent="Enter a valid email address.",e.style.color="var(--error, #d33)";return}t.disabled=!0,e.textContent="Sending\u2026",e.style.color="";try{const g=await(await fetch("/api/v1/auth/login/email/initiate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:n})})).json();if(g.success){const m=g.deliveredVia||"email",x=g.maskedEmail||n;m==="dev-console"?e.innerHTML=` + `,o.classList.add("show");const d=g.querySelector("#auth-gate-email-input"),t=g.querySelector("#auth-gate-email-submit"),e=g.querySelector("#auth-gate-email-status"),i=g.querySelector("#auth-gate-back");t.addEventListener("click",async()=>{const n=(d.value||"").trim();if(!n||!n.includes("@")){e.textContent="Enter a valid email address.",e.style.color="var(--error, #d33)";return}t.disabled=!0,e.textContent="Sending\u2026",e.style.color="";try{const f=await(await fetch("/api/v1/auth/login/email/initiate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:n})})).json();if(f.success){const p=f.deliveredVia||"email",w=f.maskedEmail||n;p==="dev-console"?e.innerHTML=` Check the server logs for your one-time link. - (Dev mode: no SMTP configured. In production this would email ${x}.)`:e.innerHTML=`Sign-in link sent to ${x}. - Check your inbox (and spam folder).`,e.style.color="var(--success, #2a7)"}else e.textContent=g.error||"Could not send link.",e.style.color="var(--error, #d33)",t.disabled=!1}catch{e.textContent="Connection error. Try again.",e.style.color="var(--error, #d33)",t.disabled=!1}}),i.addEventListener("keydown",n=>{n.key==="Enter"&&t.click()}),s.addEventListener("click",n=>{n.preventDefault(),f(providers)});return}console.warn("[auth-gate] unknown provider",d.name),window.location.reload()}}async function u(){if(!document.getElementById("totp-overlay"))return;const o=await a();if(o.length===0){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}if(o.length===1&&o[0].name==="totp"){y(o[0]);return}f(o)}function y(d){const o=l&&l.find(e=>e.name==="email");if(!o){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}const v=document.getElementById("totp-overlay"),i=v.querySelector(".totp-card");if(!i)return;if(i.dataset.originalBody||(i.dataset.originalBody=i.innerHTML),!i.querySelector("#auth-gate-email-alt")){const e=document.createElement("div");e.id="auth-gate-email-alt",e.style.cssText="margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--border); font-size: 0.85rem;",e.innerHTML=`${w}.)`:e.innerHTML=`Sign-in link sent to ${w}. + Check your inbox (and spam folder).`,e.style.color="var(--success, #2a7)"}else e.textContent=f.error||"Could not send link.",e.style.color="var(--error, #d33)",t.disabled=!1}catch{e.textContent="Connection error. Try again.",e.style.color="var(--error, #d33)",t.disabled=!1}}),d.addEventListener("keydown",n=>{n.key==="Enter"&&t.click()}),i.addEventListener("click",n=>{n.preventDefault(),m(providers)});return}console.warn("[auth-gate] unknown provider",a.name),window.location.reload()}}async function y(){if(!document.getElementById("totp-overlay"))return;const o=await s();if(o.length===0){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}if(o.length===1&&o[0].name==="totp"){v(o[0]);return}m(o)}function v(a){const o=c&&c.find(e=>e.name==="email");if(!o){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}const g=document.getElementById("totp-overlay"),d=g.querySelector(".totp-card");if(!d)return;if(d.dataset.originalBody||(d.dataset.originalBody=d.innerHTML),!d.querySelector("#auth-gate-email-alt")){const e=document.createElement("div");e.id="auth-gate-email-alt",e.style.cssText="margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--border); font-size: 0.85rem;",e.innerHTML=` Or sign in with email instead \u2192 - `,i.appendChild(e),e.querySelector("#auth-gate-email-alt-link").addEventListener("click",s=>{s.preventDefault(),h(o)})}v.classList.add("show")}window.__dc_049_handled=!0;function c(d){try{const o=new URL(d,window.location.origin);if(!["http:","https:"].includes(o.protocol))return!1;if(o.origin===window.location.origin)return!0;if(o.protocol!=="https:")return!1;const v=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`;return o.hostname===v.slice(1)||o.hostname.endsWith(v)}catch{return!1}}const p=new URLSearchParams(window.location.search);if(p.get("auth")==="required"){const d=p.get("return");if(d&&c(d))try{sessionStorage.setItem("totp_redirect",d)}catch{}window.history.replaceState({},"",window.location.pathname),setTimeout(u,0)}window._showAuthGate=u,window._authGateMethods=a})(),(function(){function l(){const c=document.querySelector(".totp-card");if(!c)return;const d=getComputedStyle(c).backgroundColor.match(/\d+/g);if(!d)return;const o=(.299*+d[0]+.587*+d[1]+.114*+d[2])/255,v=c.querySelector(".totp-logo-dark"),i=c.querySelector(".totp-logo-light");v&&(v.style.display=o>.5?"none":""),i&&(i.style.display=o>.5?"":"none")}function a(){const c=document.getElementById("totp-overlay");if(c){c.classList.add("show"),setTimeout(l,50);const p=c.querySelector(".totp-digits input");p&&setTimeout(()=>p.focus(),100)}typeof window._refreshRecoveryLink=="function"&&window._refreshRecoveryLink()}function f(){const c=document.getElementById("totp-overlay");c&&c.classList.remove("show")}function b(c,p){const d=new URL(c,window.location.origin);if(d.origin===window.location.origin)return d.toString();const o=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,v=d.hostname===o.slice(1)||d.hostname.endsWith(o);if(d.protocol!=="https:"||!v)return null;if(!p)return d.toString();const i=`${d.pathname}${d.search}${d.hash}`;return d.pathname="/dashcaddy-sso",d.search="",d.hash="",d.searchParams.set("token",p),d.searchParams.set("return",i),d.toString()}const h=document.getElementById("totp-digits");if(h){const c=h.querySelectorAll("input");c.forEach((p,d)=>{p.addEventListener("input",o=>{const v=o.target.value.replace(/\D/g,"");o.target.value=v.slice(0,1),v&&dt.value).join("");i.length===6&&u(i)}),p.addEventListener("keydown",o=>{o.key==="Backspace"&&!o.target.value&&d>0&&(c[d-1].focus(),c[d-1].value="")}),p.addEventListener("paste",o=>{o.preventDefault();const v=(o.clipboardData.getData("text")||"").replace(/\D/g,"");v.length>=6&&(c.forEach((i,t)=>{i.value=v[t]||""}),c[5].focus(),u(v.slice(0,6)))})})}async function u(c){const p=document.getElementById("totp-error");p.textContent="Verifying...",p.className="totp-error verifying";try{const o=await(await secureFetch("/api/v1/totp/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:c})})).json();if(o.success){p.textContent="",o.csrfToken&&(csrfToken=o.csrfToken),f();const v=safeSessionGet("totp_redirect");if(v){try{sessionStorage.removeItem("totp_redirect")}catch{}const i=b(v,o.ssoToken);if(!i)return;window.location.href=i;return}typeof window.initializeDashboard=="function"&&window.initializeDashboard()}else{p.textContent=o.error||"Invalid code",p.className="totp-error";const v=document.querySelectorAll("#totp-digits input");v.forEach(i=>{i.value=""}),v[0]?.focus()}}catch{p.textContent="Connection error",p.className="totp-error"}}if(!!!window.__dc_049_handled&&urlParams.get("auth")==="required"){const c=urlParams.get("return");if(c)try{const p=new URL(c,window.location.origin),d=p.hostname,o=p.origin===window.location.origin,v=SITE.tld.startsWith(".")?SITE.tld:"."+SITE.tld,i=d.endsWith(v)||d===v.substring(1);(o||i)&&safeSessionSet("totp_redirect",c)}catch{}window.history.replaceState({},"",window.location.pathname)}window._showTotpOverlay=a})(),(function(){"use strict";async function l(){try{return await(await fetch("/api/v1/totp/recovery-info",{cache:"no-store"})).json()}catch{return{success:!1,status:"unknown",hint:"Could not contact server"}}}function a(y){const c=document.getElementById("totp-recovery-link");c&&(c.style.display=y?"":"none")}function f(){const y=document.getElementById("totp-recovery-panel");y&&(y.style.display="");const c=document.getElementById("totp-recovery-status"),p=document.getElementById("totp-recovery-import"),d=document.getElementById("totp-recovery-verify");p&&(p.style.display=""),d&&(d.style.display="none"),document.getElementById("totp-recovery-error").textContent="",document.getElementById("totp-recovery-confirm-error").textContent="",document.getElementById("totp-recovery-secret").value="",document.getElementById("totp-recovery-code").value="",l().then(o=>{c.textContent=o.hint||"",o.status==="healthy"?c.style.borderColor="var(--ok-fg, #7ef2ff)":o.status==="unreadable"?(c.style.borderColor="var(--bad-fg, #ff9aa3)",c.style.background="color-mix(in srgb, var(--bad-fg) 6%, transparent)"):o.status==="not_configured"?c.style.borderColor="var(--muted)":c.style.borderColor="var(--border)"}),setTimeout(()=>{document.getElementById("totp-recovery-secret")?.focus()},100)}function b(){const y=document.getElementById("totp-recovery-panel");y&&(y.style.display="none")}async function h(){const y=document.getElementById("totp-recovery-secret").value.trim(),c=document.getElementById("totp-recovery-error");if(c.textContent="",!y){c.textContent="Paste your Base32 key first";return}if(!/^[A-Za-z2-7\s]+=*$/.test(y)){c.textContent="Invalid Base32 format \u2014 should be letters A-Z and digits 2-7 only";return}try{const p=await fetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:y})}),d=await p.json();if(!p.ok||!d.success){c.textContent=d.error||d.message||"Restore failed";return}document.getElementById("totp-recovery-import").style.display="none",document.getElementById("totp-recovery-verify").style.display="",setTimeout(()=>document.getElementById("totp-recovery-code")?.focus(),100)}catch{c.textContent="Network error \u2014 try again"}}async function u(){const y=document.getElementById("totp-recovery-code").value.trim(),c=document.getElementById("totp-recovery-confirm-error");if(c.textContent="",!/^\d{6}$/.test(y)){c.textContent="Enter a 6-digit code";return}try{const p=await fetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:y})}),d=await p.json();if(!p.ok||!d.success){c.textContent=d.error||d.message||"Invalid code",document.getElementById("totp-recovery-code").value="",document.getElementById("totp-recovery-code")?.focus();return}b();const o=document.getElementById("totp-overlay");o&&o.classList.remove("show"),typeof window.initializeDashboard=="function"&&window.initializeDashboard()}catch{c.textContent="Network error \u2014 try again"}}document.getElementById("totp-show-recovery")?.addEventListener("click",y=>{y.preventDefault(),f()}),document.getElementById("totp-recovery-close")?.addEventListener("click",b),document.getElementById("totp-recovery-submit")?.addEventListener("click",h),document.getElementById("totp-recovery-confirm")?.addEventListener("click",u),document.getElementById("totp-recovery-secret")?.addEventListener("keydown",y=>{y.key==="Enter"&&(y.preventDefault(),h())}),document.getElementById("totp-recovery-code")?.addEventListener("keydown",y=>{y.key==="Enter"&&(y.preventDefault(),u())}),window._refreshRecoveryLink=async function(){const y=await l();return y&&y.success&&y.status&&y.status!=="healthy"?a(!0):a(!1),y}})(),(function(){const l=new ErrorHandler;injectModal("folder-browser-modal",`
+ `,d.appendChild(e),e.querySelector("#auth-gate-email-alt-link").addEventListener("click",i=>{i.preventDefault(),b(o)})}g.classList.add("show")}window.__dc_049_handled=!0;function u(a){try{const o=new URL(a,window.location.origin);if(!["http:","https:"].includes(o.protocol))return!1;if(o.origin===window.location.origin)return!0;if(o.protocol!=="https:")return!1;const g=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`;return o.hostname===g.slice(1)||o.hostname.endsWith(g)}catch{return!1}}const l=new URLSearchParams(window.location.search);if(l.get("auth")==="required"){const a=l.get("return");if(a&&u(a))try{sessionStorage.setItem("totp_redirect",a)}catch{}window.history.replaceState({},"",window.location.pathname),setTimeout(y,0)}window._showAuthGate=y,window._authGateMethods=s})(),(function(){function c(){const u=document.querySelector(".totp-card");if(!u)return;const a=getComputedStyle(u).backgroundColor.match(/\d+/g);if(!a)return;const o=(.299*+a[0]+.587*+a[1]+.114*+a[2])/255,g=u.querySelector(".totp-logo-dark"),d=u.querySelector(".totp-logo-light");g&&(g.style.display=o>.5?"none":""),d&&(d.style.display=o>.5?"":"none")}function s(){const u=document.getElementById("totp-overlay");if(u){u.classList.add("show"),setTimeout(c,50);const l=u.querySelector(".totp-digits input");l&&setTimeout(()=>l.focus(),100)}typeof window._refreshRecoveryLink=="function"&&window._refreshRecoveryLink()}function m(){const u=document.getElementById("totp-overlay");u&&u.classList.remove("show")}function h(u,l){const a=new URL(u,window.location.origin);if(a.origin===window.location.origin)return a.toString();const o=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,g=a.hostname===o.slice(1)||a.hostname.endsWith(o);if(a.protocol!=="https:"||!g)return null;if(!l)return a.toString();const d=`${a.pathname}${a.search}${a.hash}`;return a.pathname="/dashcaddy-sso",a.search="",a.hash="",a.searchParams.set("token",l),a.searchParams.set("return",d),a.toString()}const b=document.getElementById("totp-digits");if(b){const u=b.querySelectorAll("input");u.forEach((l,a)=>{l.addEventListener("input",o=>{const g=o.target.value.replace(/\D/g,"");o.target.value=g.slice(0,1),g&&at.value).join("");d.length===6&&y(d)}),l.addEventListener("keydown",o=>{o.key==="Backspace"&&!o.target.value&&a>0&&(u[a-1].focus(),u[a-1].value="")}),l.addEventListener("paste",o=>{o.preventDefault();const g=(o.clipboardData.getData("text")||"").replace(/\D/g,"");g.length>=6&&(u.forEach((d,t)=>{d.value=g[t]||""}),u[5].focus(),y(g.slice(0,6)))})})}async function y(u){const l=document.getElementById("totp-error");l.textContent="Verifying...",l.className="totp-error verifying";try{const o=await(await secureFetch("/api/v1/totp/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:u})})).json();if(o.success){l.textContent="",o.csrfToken&&(csrfToken=o.csrfToken),m();const g=safeSessionGet("totp_redirect");if(g){try{sessionStorage.removeItem("totp_redirect")}catch{}const d=h(g,o.ssoToken);if(!d)return;window.location.href=d;return}typeof window.initializeDashboard=="function"&&window.initializeDashboard(),window._dcAuthLost=!1,typeof window._sseResume=="function"?window._sseResume():typeof window._sseReconnect=="function"&&window._sseReconnect(),typeof window.refreshAll=="function"&&window.refreshAll()}else{l.textContent=o.error||"Invalid code",l.className="totp-error";const g=document.querySelectorAll("#totp-digits input");g.forEach(d=>{d.value=""}),g[0]?.focus()}}catch{l.textContent="Connection error",l.className="totp-error"}}if(!!!window.__dc_049_handled&&urlParams.get("auth")==="required"){const u=urlParams.get("return");if(u)try{const l=new URL(u,window.location.origin),a=l.hostname,o=l.origin===window.location.origin,g=SITE.tld.startsWith(".")?SITE.tld:"."+SITE.tld,d=a.endsWith(g)||a===g.substring(1);(o||d)&&safeSessionSet("totp_redirect",u)}catch{}window.history.replaceState({},"",window.location.pathname)}window._showTotpOverlay=s})(),(function(){"use strict";async function c(){try{return await(await fetch("/api/v1/totp/recovery-info",{cache:"no-store"})).json()}catch{return{success:!1,status:"unknown",hint:"Could not contact server"}}}function s(v){const u=document.getElementById("totp-recovery-link");u&&(u.style.display=v?"":"none")}function m(){const v=document.getElementById("totp-recovery-panel");v&&(v.style.display="");const u=document.getElementById("totp-recovery-status"),l=document.getElementById("totp-recovery-import"),a=document.getElementById("totp-recovery-verify");l&&(l.style.display=""),a&&(a.style.display="none"),document.getElementById("totp-recovery-error").textContent="",document.getElementById("totp-recovery-confirm-error").textContent="",document.getElementById("totp-recovery-secret").value="",document.getElementById("totp-recovery-code").value="",c().then(o=>{u.textContent=o.hint||"",o.status==="healthy"?u.style.borderColor="var(--ok-fg, #7ef2ff)":o.status==="unreadable"?(u.style.borderColor="var(--bad-fg, #ff9aa3)",u.style.background="color-mix(in srgb, var(--bad-fg) 6%, transparent)"):o.status==="not_configured"?u.style.borderColor="var(--muted)":u.style.borderColor="var(--border)"}),setTimeout(()=>{document.getElementById("totp-recovery-secret")?.focus()},100)}function h(){const v=document.getElementById("totp-recovery-panel");v&&(v.style.display="none")}async function b(){const v=document.getElementById("totp-recovery-secret").value.trim(),u=document.getElementById("totp-recovery-error");if(u.textContent="",!v){u.textContent="Paste your Base32 key first";return}if(!/^[A-Za-z2-7\s]+=*$/.test(v)){u.textContent="Invalid Base32 format \u2014 should be letters A-Z and digits 2-7 only";return}try{const l=await fetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:v})}),a=await l.json();if(!l.ok||!a.success){u.textContent=a.error||a.message||"Restore failed";return}document.getElementById("totp-recovery-import").style.display="none",document.getElementById("totp-recovery-verify").style.display="",setTimeout(()=>document.getElementById("totp-recovery-code")?.focus(),100)}catch{u.textContent="Network error \u2014 try again"}}async function y(){const v=document.getElementById("totp-recovery-code").value.trim(),u=document.getElementById("totp-recovery-confirm-error");if(u.textContent="",!/^\d{6}$/.test(v)){u.textContent="Enter a 6-digit code";return}try{const l=await fetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:v})}),a=await l.json();if(!l.ok||!a.success){u.textContent=a.error||a.message||"Invalid code",document.getElementById("totp-recovery-code").value="",document.getElementById("totp-recovery-code")?.focus();return}h();const o=document.getElementById("totp-overlay");o&&o.classList.remove("show"),typeof window.initializeDashboard=="function"&&window.initializeDashboard()}catch{u.textContent="Network error \u2014 try again"}}document.getElementById("totp-show-recovery")?.addEventListener("click",v=>{v.preventDefault(),m()}),document.getElementById("totp-recovery-close")?.addEventListener("click",h),document.getElementById("totp-recovery-submit")?.addEventListener("click",b),document.getElementById("totp-recovery-confirm")?.addEventListener("click",y),document.getElementById("totp-recovery-secret")?.addEventListener("keydown",v=>{v.key==="Enter"&&(v.preventDefault(),b())}),document.getElementById("totp-recovery-code")?.addEventListener("keydown",v=>{v.key==="Enter"&&(v.preventDefault(),y())}),window._refreshRecoveryLink=async function(){const v=await c();return v&&v.success&&v.status&&v.status!=="healthy"?s(!0):s(!1),v}})(),(function(){const c=new ErrorHandler;injectModal("folder-browser-modal",`

\u{1F4C2} Browse for Media Folders

@@ -179,7 +179,7 @@
-
`);const a=document.getElementById("service-creds-modal");let f=null;const b=["sonarr","radarr","prowlarr","overseerr"],h=["sonarr","radarr"];function u(o){return o.externalUrl||o.url||""}function y(o){const v=document.getElementById("svc-creds-error");v.textContent=o,v.style.display=""}function c(){const o=document.getElementById("svc-creds-error");o.textContent="",o.style.display="none"}window.openServiceCredsModal=async function(o){f=o,c();const v=document.getElementById("svc-creds-title"),i=document.getElementById("svc-creds-desc"),t=document.getElementById("svc-creds-seedhost"),e=document.getElementById("svc-creds-apikey"),s=document.getElementById("svc-creds-basic"),n=document.getElementById("svc-creds-quality");v.textContent=o.name+" Credentials";const r=!!o.isExternal,g=b.includes(o.id)||b.includes(o.appTemplate),m=h.includes(o.id)||h.includes(o.appTemplate);t.style.display=r?"":"none",e.style.display=g?"":"none",n.style.display=m?"":"none",s.style.display=r?"none":"";const x=document.getElementById("svc-quality-select");x.innerHTML='',document.getElementById("svc-quality-status").textContent="",r?(i.textContent="Seedhost credentials auto-login past the HTTP prompt. API key bypasses the app login.",document.getElementById("svc-seedhost-pass").placeholder=`Password for ${o.name}`):g?i.textContent="API key bypasses the app login screen automatically.":i.textContent="Credentials are injected automatically when accessing this service.",await p(o),a.classList.add("show")};async function p(o){const v=document.getElementById("svc-creds-dot"),i=document.getElementById("svc-creds-status"),t=document.getElementById("svc-creds-clear");let e=!1;if(o.isExternal){try{const r=await(await fetch(`/api/v1/seedhost-creds?serviceId=${o.id}`)).json();r.success?(document.getElementById("svc-seedhost-user").value=r.username||"",r.hasCredentials&&(e=!0)):document.getElementById("svc-seedhost-user").value=""}catch{}document.getElementById("svc-seedhost-pass").value=""}try{const r=await(await fetch(`/api/v1/services/${o.id}/credentials`)).json();r.success&&(r.hasApiKey?(document.getElementById("svc-apikey-input").value="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",e=!0):document.getElementById("svc-apikey-input").value="",r.hasBasicAuth&&!o.isExternal?(document.getElementById("svc-basic-user").value=r.username||"",e=!0):document.getElementById("svc-basic-user").value="")}catch{}document.getElementById("svc-basic-pass")&&(document.getElementById("svc-basic-pass").value="");const s=o.id||o.appTemplate;if(h.includes(s)&&await d(o),e){v.style.background="var(--ok-fg, #74dfc4)",i.style.color="var(--ok-fg, #74dfc4)",i.textContent="Credentials stored",t.style.display="";const n=document.getElementById(`creds-btn-${o.id}`);n&&n.classList.add("has-creds")}else v.style.background="var(--muted)",i.style.color="var(--muted)",i.textContent="No credentials stored",t.style.display="none"}async function d(o){const v=document.getElementById("svc-quality-select"),i=document.getElementById("svc-quality-status"),t=o.id||o.appTemplate,e=u(o);if(!e){v.innerHTML='';return}v.innerHTML='',i.textContent="";try{const s=new URLSearchParams({service:t,url:e}),r=await(await fetch(`/api/v1/arr/quality-profiles?${s}`)).json();if(!r.success||!r.profiles?.length){v.innerHTML='';return}v.innerHTML="";for(const g of r.profiles){const m=document.createElement("option");m.value=g.id,m.textContent=g.name,v.appendChild(m)}if(r.storedProfileId&&(v.value=String(r.storedProfileId)),!v.value){const g=r.profiles.find(m=>/720/i.test(m.name));g&&(v.value=String(g.id))}!v.value&&r.profiles.length&&(v.value=String(r.profiles[0].id)),i.innerHTML=`${r.profiles.length} profiles loaded`}catch(s){v.innerHTML='',i.innerHTML=`Error: ${s.message}`}}document.getElementById("svc-quality-fetch")?.addEventListener("click",async()=>{if(!f)return;const o=f.id||f.appTemplate,v=u(f),t=document.getElementById("svc-apikey-input")?.value.trim(),e=document.getElementById("svc-quality-select"),s=document.getElementById("svc-quality-status");if(!v){s.innerHTML='No service URL available';return}if(!t||t==="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"){s.innerHTML='Enter an API key first';return}e.innerHTML='',s.textContent="";try{const n=new URLSearchParams({service:o,url:v,apiKey:t}),g=await(await fetch(`/api/v1/arr/quality-profiles?${n}`)).json();if(!g.success){e.innerHTML='',s.innerHTML=`${g.error||"Failed to fetch profiles"}`;return}if(!g.profiles?.length){e.innerHTML='';return}e.innerHTML="";for(const x of g.profiles){const I=document.createElement("option");I.value=x.id,I.textContent=x.name,e.appendChild(I)}const m=g.profiles.find(x=>/720/i.test(x.name));m?e.value=String(m.id):g.profiles.length&&(e.value=String(g.profiles[0].id)),s.innerHTML=`${g.profiles.length} profiles loaded`}catch(n){e.innerHTML='',s.innerHTML=`${n.message}`}}),document.getElementById("svc-creds-save")?.addEventListener("click",async()=>{if(!f)return;const o=document.getElementById("svc-creds-save");o.textContent="Saving...",o.disabled=!0,c();try{const v=b.includes(f.id)||b.includes(f.appTemplate),i=f.id||f.appTemplate;if(f.isExternal){const s=document.getElementById("svc-seedhost-user").value.trim(),n=document.getElementById("svc-seedhost-pass").value;s&&await secureFetch("/api/v1/seedhost-creds",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:s,password:n||void 0,serviceId:f.id})})}const e=document.getElementById("svc-apikey-input")?.value.trim();if(e&&e!=="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022")if(v){const s=u(f),n=document.getElementById("svc-quality-select"),r=n?.value?parseInt(n.value):void 0,g=n?.selectedOptions?.[0]?.textContent||void 0,x=await(await secureFetch("/api/v1/arr/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:i,apiKey:e,url:s||void 0,qualityProfileId:r||void 0,qualityProfileName:g||void 0})})).json();if(!x.success){y(x.error||"Failed to save API key"),o.textContent="Save",o.disabled=!1;return}x.connectionTest&&!x.connectionTest.success&&y(`API key saved but connection test failed: ${x.connectionTest.error}`)}else await secureFetch(`/api/v1/services/${f.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e})});else if(v&&h.includes(i)){const s=document.getElementById("svc-quality-select"),n=s?.value?parseInt(s.value):void 0,r=s?.selectedOptions?.[0]?.textContent||void 0;n&&await secureFetch("/api/v1/arr/quality-profiles",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:i,qualityProfileId:n,qualityProfileName:r})})}if(!f.isExternal){const s=document.getElementById("svc-basic-user").value.trim(),n=document.getElementById("svc-basic-pass").value;s&&n&&await secureFetch(`/api/v1/services/${f.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:s,password:n})})}await p(f)}catch(v){l.logError("[ServiceCredentials] Save",v,{function:"saveCredentials"}),y("Failed to save: "+(v.message||"Unknown error"))}o.textContent="Save",o.disabled=!1}),document.getElementById("svc-creds-clear")?.addEventListener("click",async()=>{if(f&&confirm(`Remove stored credentials for ${f.name}?`)){c();try{const o=f.id||f.appTemplate,v=b.includes(o);f.isExternal&&await secureFetch(`/api/v1/seedhost-creds?serviceId=${f.id}`,{method:"DELETE"}),await secureFetch(`/api/v1/services/${f.id}/credentials`,{method:"DELETE"}),v&&await secureFetch(`/api/v1/arr/credentials/${o}`,{method:"DELETE"});const i=document.getElementById(`creds-btn-${f.id}`);i&&i.classList.remove("has-creds"),await p(f)}catch(o){l.logError("[ServiceCredentials] Clear",o,{function:"clearCredentials"}),y("Failed to clear: "+(o.message||"Unknown error"))}}}),document.getElementById("svc-creds-close")?.addEventListener("click",()=>{a.classList.remove("show"),f=null}),a?.addEventListener("click",o=>{o.target===a&&(a.classList.remove("show"),f=null)}),window.refreshCredsButtons=async function(){try{for(const o of window.APPS||[]){if(!o.isExternal&&!o.appTemplate&&!o.url)continue;let v=!1;if(o.isExternal)try{const e=await(await fetch(`/api/v1/seedhost-creds?serviceId=${o.id}`)).json();e.success&&e.hasCredentials&&(v=!0)}catch{}try{const e=await(await fetch(`/api/v1/services/${o.id}/credentials`)).json();e.success&&(e.hasApiKey||e.hasBasicAuth)&&(v=!0)}catch{}const i=document.getElementById(`creds-btn-${o.id}`);i&&i.classList.toggle("has-creds",v)}}catch{}}})(),(function(){const l=new ErrorHandler;injectModal("totp-settings-modal",`
+
`);const s=document.getElementById("service-creds-modal");let m=null;const h=["sonarr","radarr","prowlarr","overseerr"],b=["sonarr","radarr"];function y(o){return o.externalUrl||o.url||""}function v(o){const g=document.getElementById("svc-creds-error");g.textContent=o,g.style.display=""}function u(){const o=document.getElementById("svc-creds-error");o.textContent="",o.style.display="none"}window.openServiceCredsModal=async function(o){m=o,u();const g=document.getElementById("svc-creds-title"),d=document.getElementById("svc-creds-desc"),t=document.getElementById("svc-creds-seedhost"),e=document.getElementById("svc-creds-apikey"),i=document.getElementById("svc-creds-basic"),n=document.getElementById("svc-creds-quality");g.textContent=o.name+" Credentials";const r=!!o.isExternal,f=h.includes(o.id)||h.includes(o.appTemplate),p=b.includes(o.id)||b.includes(o.appTemplate);t.style.display=r?"":"none",e.style.display=f?"":"none",n.style.display=p?"":"none",i.style.display=r?"none":"";const w=document.getElementById("svc-quality-select");w.innerHTML='',document.getElementById("svc-quality-status").textContent="",r?(d.textContent="Seedhost credentials auto-login past the HTTP prompt. API key bypasses the app login.",document.getElementById("svc-seedhost-pass").placeholder=`Password for ${o.name}`):f?d.textContent="API key bypasses the app login screen automatically.":d.textContent="Credentials are injected automatically when accessing this service.",await l(o),s.classList.add("show")};async function l(o){const g=document.getElementById("svc-creds-dot"),d=document.getElementById("svc-creds-status"),t=document.getElementById("svc-creds-clear");let e=!1;if(o.isExternal){try{const r=await(await fetch(`/api/v1/seedhost-creds?serviceId=${o.id}`)).json();r.success?(document.getElementById("svc-seedhost-user").value=r.username||"",r.hasCredentials&&(e=!0)):document.getElementById("svc-seedhost-user").value=""}catch{}document.getElementById("svc-seedhost-pass").value=""}try{const r=await(await fetch(`/api/v1/services/${o.id}/credentials`)).json();r.success&&(r.hasApiKey?(document.getElementById("svc-apikey-input").value="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",e=!0):document.getElementById("svc-apikey-input").value="",r.hasBasicAuth&&!o.isExternal?(document.getElementById("svc-basic-user").value=r.username||"",e=!0):document.getElementById("svc-basic-user").value="")}catch{}document.getElementById("svc-basic-pass")&&(document.getElementById("svc-basic-pass").value="");const i=o.id||o.appTemplate;if(b.includes(i)&&await a(o),e){g.style.background="var(--ok-fg, #74dfc4)",d.style.color="var(--ok-fg, #74dfc4)",d.textContent="Credentials stored",t.style.display="";const n=document.getElementById(`creds-btn-${o.id}`);n&&n.classList.add("has-creds")}else g.style.background="var(--muted)",d.style.color="var(--muted)",d.textContent="No credentials stored",t.style.display="none"}async function a(o){const g=document.getElementById("svc-quality-select"),d=document.getElementById("svc-quality-status"),t=o.id||o.appTemplate,e=y(o);if(!e){g.innerHTML='';return}g.innerHTML='',d.textContent="";try{const i=new URLSearchParams({service:t,url:e}),r=await(await fetch(`/api/v1/arr/quality-profiles?${i}`)).json();if(!r.success||!r.profiles?.length){g.innerHTML='';return}g.innerHTML="";for(const f of r.profiles){const p=document.createElement("option");p.value=f.id,p.textContent=f.name,g.appendChild(p)}if(r.storedProfileId&&(g.value=String(r.storedProfileId)),!g.value){const f=r.profiles.find(p=>/720/i.test(p.name));f&&(g.value=String(f.id))}!g.value&&r.profiles.length&&(g.value=String(r.profiles[0].id)),d.innerHTML=`${r.profiles.length} profiles loaded`}catch(i){g.innerHTML='',d.innerHTML=`Error: ${i.message}`}}document.getElementById("svc-quality-fetch")?.addEventListener("click",async()=>{if(!m)return;const o=m.id||m.appTemplate,g=y(m),t=document.getElementById("svc-apikey-input")?.value.trim(),e=document.getElementById("svc-quality-select"),i=document.getElementById("svc-quality-status");if(!g){i.innerHTML='No service URL available';return}if(!t||t==="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"){i.innerHTML='Enter an API key first';return}e.innerHTML='',i.textContent="";try{const n=new URLSearchParams({service:o,url:g,apiKey:t}),f=await(await fetch(`/api/v1/arr/quality-profiles?${n}`)).json();if(!f.success){e.innerHTML='',i.innerHTML=`${f.error||"Failed to fetch profiles"}`;return}if(!f.profiles?.length){e.innerHTML='';return}e.innerHTML="";for(const w of f.profiles){const I=document.createElement("option");I.value=w.id,I.textContent=w.name,e.appendChild(I)}const p=f.profiles.find(w=>/720/i.test(w.name));p?e.value=String(p.id):f.profiles.length&&(e.value=String(f.profiles[0].id)),i.innerHTML=`${f.profiles.length} profiles loaded`}catch(n){e.innerHTML='',i.innerHTML=`${n.message}`}}),document.getElementById("svc-creds-save")?.addEventListener("click",async()=>{if(!m)return;const o=document.getElementById("svc-creds-save");o.textContent="Saving...",o.disabled=!0,u();try{const g=h.includes(m.id)||h.includes(m.appTemplate),d=m.id||m.appTemplate;if(m.isExternal){const i=document.getElementById("svc-seedhost-user").value.trim(),n=document.getElementById("svc-seedhost-pass").value;i&&await secureFetch("/api/v1/seedhost-creds",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:i,password:n||void 0,serviceId:m.id})})}const e=document.getElementById("svc-apikey-input")?.value.trim();if(e&&e!=="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022")if(g){const i=y(m),n=document.getElementById("svc-quality-select"),r=n?.value?parseInt(n.value):void 0,f=n?.selectedOptions?.[0]?.textContent||void 0,w=await(await secureFetch("/api/v1/arr/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:d,apiKey:e,url:i||void 0,qualityProfileId:r||void 0,qualityProfileName:f||void 0})})).json();if(!w.success){v(w.error||"Failed to save API key"),o.textContent="Save",o.disabled=!1;return}w.connectionTest&&!w.connectionTest.success&&v(`API key saved but connection test failed: ${w.connectionTest.error}`)}else await secureFetch(`/api/v1/services/${m.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e})});else if(g&&b.includes(d)){const i=document.getElementById("svc-quality-select"),n=i?.value?parseInt(i.value):void 0,r=i?.selectedOptions?.[0]?.textContent||void 0;n&&await secureFetch("/api/v1/arr/quality-profiles",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:d,qualityProfileId:n,qualityProfileName:r})})}if(!m.isExternal){const i=document.getElementById("svc-basic-user").value.trim(),n=document.getElementById("svc-basic-pass").value;i&&n&&await secureFetch(`/api/v1/services/${m.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:i,password:n})})}await l(m)}catch(g){c.logError("[ServiceCredentials] Save",g,{function:"saveCredentials"}),v("Failed to save: "+(g.message||"Unknown error"))}o.textContent="Save",o.disabled=!1}),document.getElementById("svc-creds-clear")?.addEventListener("click",async()=>{if(m&&confirm(`Remove stored credentials for ${m.name}?`)){u();try{const o=m.id||m.appTemplate,g=h.includes(o);m.isExternal&&await secureFetch(`/api/v1/seedhost-creds?serviceId=${m.id}`,{method:"DELETE"}),await secureFetch(`/api/v1/services/${m.id}/credentials`,{method:"DELETE"}),g&&await secureFetch(`/api/v1/arr/credentials/${o}`,{method:"DELETE"});const d=document.getElementById(`creds-btn-${m.id}`);d&&d.classList.remove("has-creds"),await l(m)}catch(o){c.logError("[ServiceCredentials] Clear",o,{function:"clearCredentials"}),v("Failed to clear: "+(o.message||"Unknown error"))}}}),document.getElementById("svc-creds-close")?.addEventListener("click",()=>{s.classList.remove("show"),m=null}),s?.addEventListener("click",o=>{o.target===s&&(s.classList.remove("show"),m=null)}),window.refreshCredsButtons=async function(){try{for(const o of window.APPS||[]){if(!o.isExternal&&!o.appTemplate&&!o.url)continue;let g=!1;if(o.isExternal)try{const e=await(await fetch(`/api/v1/seedhost-creds?serviceId=${o.id}`)).json();e.success&&e.hasCredentials&&(g=!0)}catch{}try{const e=await(await fetch(`/api/v1/services/${o.id}/credentials`)).json();e.success&&(e.hasApiKey||e.hasBasicAuth)&&(g=!0)}catch{}const d=document.getElementById(`creds-btn-${o.id}`);d&&d.classList.toggle("has-creds",g)}}catch{}}})(),(function(){const c=new ErrorHandler;injectModal("totp-settings-modal",`

Authentication Settings

@@ -288,7 +288,7 @@
- `);async function a(){try{const y=await(await fetch("/api/v1/totp/config")).json();if(!y.success)return;const{enabled:c,sessionDuration:p,isSetUp:d}=y.config,o=document.getElementById("totp-status-dot"),v=document.getElementById("totp-status-text"),i=document.getElementById("totp-status-banner"),t=document.getElementById("totp-setup-section"),e=document.getElementById("totp-qr-section"),s=document.getElementById("totp-duration-section"),n=document.getElementById("totp-disable-section");if(c&&d){o.style.background="var(--ok-fg, #7ef2ff)",i.style.borderColor="var(--ok-fg, #7ef2ff)",i.style.background="color-mix(in srgb, var(--ok-fg) 8%, transparent)",v.textContent="TOTP is active",v.style.color="var(--ok-fg, #7ef2ff)",t.style.display="block";const r=document.getElementById("totp-setup-btn");r&&(r.textContent="Generate New Secret"),e.style.display="none",s.style.display="block",n.style.display="block",document.getElementById("totp-duration-select").value=p}else o.style.background="var(--muted)",i.style.borderColor="var(--border)",i.style.background="transparent",v.textContent="TOTP is not configured",v.style.color="var(--muted)",t.style.display="block",e.style.display="none",s.style.display="none",n.style.display="none";h(c&&d,p)}catch(u){console.warn("Failed to load TOTP settings:",u)}}const f={"15m":"15 min","30m":"30 min","1h":"1 hour","2h":"2 hours","4h":"4 hours","8h":"8 hours","12h":"12 hours","24h":"24 hours",never:"Disabled"};function b(u,y){const c=window.DCI18n;return c&&c.isLoaded()?c.t(u):y}function h(u,y){const c=document.getElementById("auth-card"),p=document.getElementById("auth-pill"),d=document.getElementById("auth-dot"),o=document.getElementById("auth-status-text");c&&(u?(c.setAttribute("data-status","on"),p.className="badge on",p.textContent=b("card.status.yes","YES"),d.className="dot ok at-bl",o.textContent="Session: "+(f[y]||y)):(c.setAttribute("data-status","off"),p.className="badge off",p.textContent=b("card.status.no","NO"),d.className="dot bad at-bl",o.textContent=b("card.auth.not_configured","Not configured")))}document.getElementById("totp-setup-btn")?.addEventListener("click",async()=>{try{const y=await(await secureFetch("/api/v1/totp/setup",{method:"POST"})).json();y.success&&(document.getElementById("totp-qr-image").src=y.qrCode,document.getElementById("totp-manual-key").textContent=y.manualKey,document.getElementById("totp-setup-section").style.display="none",document.getElementById("totp-qr-section").style.display="block",document.getElementById("totp-setup-code").value="",document.getElementById("totp-setup-error").textContent="",document.getElementById("totp-setup-code").focus())}catch(u){l.logError("[TOTP] Setup Failed",u,{function:"setupTOTP"})}}),document.getElementById("totp-import-btn")?.addEventListener("click",async()=>{const u=document.getElementById("totp-import-key").value.trim(),y=document.getElementById("totp-import-error");if(y.textContent="",!u){y.textContent="Paste a Base32 secret key first";return}try{const p=await(await secureFetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:u})})).json();p.success?(y.textContent="",document.getElementById("totp-qr-image").src=p.qrCode,document.getElementById("totp-manual-key").textContent=p.manualKey,document.getElementById("totp-setup-section").style.display="none",document.getElementById("totp-qr-section").style.display="block",document.getElementById("totp-setup-code").value="",document.getElementById("totp-setup-error").textContent="",document.getElementById("totp-setup-code").focus()):y.textContent=p.error||p.message||"Import failed"}catch{y.textContent="Connection error \u2014 try refreshing the page"}}),document.getElementById("totp-copy-key")?.addEventListener("click",()=>{const u=document.getElementById("totp-manual-key").textContent;navigator.clipboard.writeText(u).then(()=>{const y=document.getElementById("totp-copy-key");y.textContent="\u2705",setTimeout(()=>{y.textContent="\u{1F4CB}"},2e3)})}),document.getElementById("totp-download-backup")?.addEventListener("click",()=>{const u=document.getElementById("totp-manual-key").textContent.trim();if(!u)return;const y={service:"DashCaddy",type:"totp-secret",secret:u,issuer:"DashCaddy",algorithm:"SHA1",digits:6,period:30,issued:new Date().toISOString(),recovery_url:`${window.location.origin}/ (login screen \u2192 "Lost access?")`,note:'Keep this file somewhere safe. Anyone with this secret can generate your login codes. Use it ONLY to recover TOTP access via the "Lost access?" link on the DashCaddy login screen.'},c=new Blob([JSON.stringify(y,null,2)],{type:"application/json"}),p=URL.createObjectURL(c),d=document.createElement("a");d.href=p,d.download=`dashcaddy-totp-backup-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(d),d.click(),document.body.removeChild(d),URL.revokeObjectURL(p);const o=document.getElementById("totp-download-backup");o.textContent="\u2705 Saved",setTimeout(()=>{o.textContent="\u2B07 Download"},2e3)}),document.getElementById("totp-confirm-setup")?.addEventListener("click",async()=>{const u=document.getElementById("totp-setup-code").value,y=document.getElementById("totp-setup-error");if(!/^\d{6}$/.test(u)){y.textContent="Enter a 6-digit code";return}try{const p=await(await secureFetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:u})})).json();p.success?(y.textContent="",a()):y.textContent=p.error||"Invalid code"}catch{y.textContent="Connection error"}}),document.getElementById("totp-setup-code")?.addEventListener("keydown",u=>{u.key==="Enter"&&document.getElementById("totp-confirm-setup")?.click()}),document.getElementById("totp-duration-select")?.addEventListener("change",async u=>{try{await secureFetch("/api/v1/totp/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionDuration:u.target.value})}),a()}catch(y){l.logError("[TOTP] Update Session Duration",y,{function:"updateSessionDuration"})}}),document.getElementById("totp-disable-btn")?.addEventListener("click",async()=>{if(confirm("Disable TOTP authentication? All services will be accessible without a code."))try{(await(await secureFetch("/api/v1/totp/disable",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"})).json()).success&&a()}catch(u){l.logError("[TOTP] Disable Failed",u,{function:"disableTOTP"})}}),document.getElementById("auth-settings-btn")?.addEventListener("click",()=>{a(),openModal("totp-settings-modal")}),document.getElementById("totp-modal-close")?.addEventListener("click",()=>{closeModal("totp-settings-modal")}),document.getElementById("totp-settings-modal")?.addEventListener("click",u=>{u.target.id==="totp-settings-modal"&&closeModal("totp-settings-modal")}),window._updateAuthCard=h,(async()=>{try{const y=await(await fetch("/api/v1/totp/config")).json();if(y.success){const c=y.config.enabled&&y.config.isSetUp;h(c,y.config.sessionDuration)}}catch(u){l.logError("[TOTP] AuthCard Update",u,{function:"authCardUpdate"})}})()})(),(function(){"use strict";const l={me:"/api/v1/auth/me",users:"/api/v1/auth/admin/users",allowlist:"/api/v1/auth/admin/allowlist",invites:"/api/v1/auth/admin/invites"};function a(i,t,...e){const s=document.createElement(i);if(t)for(const n of Object.keys(t)){const r=t[n];r==null||r===!1||(n==="class"?s.className=r:n==="text"?s.textContent=r:n==="html"?s.innerHTML=r:n.startsWith("on")&&typeof r=="function"?s.addEventListener(n.slice(2).toLowerCase(),r):s.setAttribute(n,r))}for(const n of e)n==null||n===!1||(typeof n=="string"?s.appendChild(document.createTextNode(n)):s.appendChild(n));return s}async function f(i,t){const e=window.SITE&&window.SITE.csrfToken||"";t=t||{},t.headers=Object.assign({"Content-Type":"application/json"},t.headers||{},e?{"X-CSRF-Token":e}:{}),t.body&&typeof t.body!="string"&&(t.body=JSON.stringify(t.body));const s=await fetch(i,t),n=await s.json().catch(()=>({}));if(!s.ok){const r=n&&(n.message||n.error)||"HTTP "+s.status,g=new Error(r);throw g.status=s.status,g}return n}function b(i){const t={admin:"background:#7c3aed;color:#fff",operator:"background:#2563eb;color:#fff",viewer:"background:#6b7280;color:#fff"};return a("span",{class:"role-badge",style:"display:inline-block;padding:2px 8px;border-radius:4px;font-size:0.75rem;font-weight:600;text-transform:uppercase;"+(t[i]||t.viewer),text:i})}function h(i,t,e){if(i.innerHTML="",!t||t.length===0){i.appendChild(a("p",{style:"color:var(--muted)",text:"No users yet."}));return}const s=a("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});s.appendChild(a("thead",null,a("tr",{style:"border-bottom:1px solid var(--border)"},a("th",{style:"text-align:left;padding:8px",text:"Email"}),a("th",{style:"text-align:left;padding:8px",text:"Role"}),a("th",{style:"text-align:left;padding:8px",text:"Created"}),a("th",{style:"text-align:left;padding:8px",text:"Last login"}),a("th",{style:"text-align:right;padding:8px",text:"Actions"}))));const n=a("tbody");for(const r of t){const g=a("tr",{style:"border-bottom:1px solid var(--border)"}),m=a("td",{style:"padding:8px"});m.appendChild(a("span",{text:r.email||"(no email)"})),r.displayName&&r.displayName!==(r.email||"").split("@")[0]&&(m.appendChild(a("br")),m.appendChild(a("small",{style:"color:var(--muted)",text:r.displayName}))),g.appendChild(m);const x=a("td",{style:"padding:8px"});x.appendChild(b(r.role)),g.appendChild(x),g.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:r.createdAt?new Date(r.createdAt).toLocaleDateString():"\u2014"})),g.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:r.lastLoginAt?new Date(r.lastLoginAt).toLocaleString():"\u2014"}));const I=a("td",{style:"padding:8px;text-align:right"}),L=a("select",{style:"padding:2px 6px;margin-right:6px",onchange:async C=>{try{await f(l.users+"/"+encodeURIComponent(r.id),{method:"PATCH",body:{role:C.target.value}}),e&&e()}catch(B){window.errorHandler&&window.errorHandler.show("Role update failed: "+B.message),C.target.value=r.role}}});for(const C of["admin","operator","viewer"]){const B=a("option",{value:C,text:C});C===r.role&&(B.selected=!0),L.appendChild(B)}I.appendChild(L);const P=a("button",{class:"btn-sm",style:"padding:2px 8px",text:"Delete",onclick:async()=>{if(confirm("Delete user "+(r.email||r.id)+"? This cannot be undone."))try{await f(l.users+"/"+encodeURIComponent(r.id),{method:"DELETE"}),e&&e()}catch(C){window.errorHandler&&window.errorHandler.show("Delete failed: "+C.message)}}});I.appendChild(P),g.appendChild(I),n.appendChild(g)}s.appendChild(n),i.appendChild(s)}function u(i,t){const e=a("form",{style:"display:flex;gap:8px;flex-wrap:wrap;align-items:end",onsubmit:async n=>{n.preventDefault();const r=new FormData(n.target),g={email:r.get("email"),role:r.get("role"),ttlHours:parseInt(r.get("ttlHours"),10)||24,sendEmail:r.get("sendEmail")==="on"};try{const m=await f(l.invites,{method:"POST",body:g});n.target.reset(),t&&t(m)}catch(m){window.errorHandler&&window.errorHandler.show("Invite failed: "+m.message)}}});e.appendChild(a("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},a("span",{text:"Email"}),a("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})));const s=a("select",{name:"role",style:"padding:6px"});for(const n of["operator","viewer","admin"])s.appendChild(a("option",{value:n,text:n}));e.appendChild(a("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},a("span",{text:"Role"}),s)),e.appendChild(a("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},a("span",{text:"TTL (hours)"}),a("input",{name:"ttlHours",type:"number",min:"1",max:"168",value:"24",style:"padding:6px;width:80px"}))),e.appendChild(a("label",{style:"display:flex;gap:4px;align-items:center;font-size:0.85rem"},a("input",{name:"sendEmail",type:"checkbox",checked:!0}),a("span",{text:"Send email"}))),e.appendChild(a("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Issue invite"})),i.appendChild(e)}function y(i,t,e){if(i.innerHTML="",!t||t.length===0){i.appendChild(a("p",{style:"color:var(--muted)",text:"No outstanding invites."}));return}const s=a("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});s.appendChild(a("thead",null,a("tr",{style:"border-bottom:1px solid var(--border)"},a("th",{style:"text-align:left;padding:8px",text:"Email"}),a("th",{style:"text-align:left;padding:8px",text:"Role"}),a("th",{style:"text-align:left;padding:8px",text:"Invited by"}),a("th",{style:"text-align:left;padding:8px",text:"Expires"}),a("th",{style:"text-align:right;padding:8px",text:"Actions"}))));const n=a("tbody");for(const r of t){const g=a("tr",{style:"border-bottom:1px solid var(--border)"});g.appendChild(a("td",{style:"padding:8px",text:r.email})),g.appendChild(a("td",{style:"padding:8px"},b(r.role))),g.appendChild(a("td",{style:"padding:8px;color:var(--muted)",text:r.invitedBy||"\u2014"})),g.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:r.expiresAt?new Date(r.expiresAt).toLocaleString():"\u2014"}));const m=a("td",{style:"padding:8px;text-align:right"});m.appendChild(a("button",{class:"btn-sm",style:"padding:2px 8px",text:"Revoke",onclick:async()=>{if(confirm("Revoke invite for "+r.email+"?"))try{await f(l.invites+"/"+encodeURIComponent(r.id),{method:"DELETE"}),e&&e()}catch(x){window.errorHandler&&window.errorHandler.show("Revoke failed: "+x.message)}}})),g.appendChild(m),n.appendChild(g)}s.appendChild(n),i.appendChild(s)}function c(i,t){const e=a("div",{style:"margin-top:12px;padding:12px;border:1px solid #16a34a;border-radius:6px;background:#052e1a;color:#bbf7d0;font-size:0.85rem"});e.appendChild(a("strong",{text:"Invite issued \u2014 copy the link below. It will not be shown again."})),e.appendChild(a("br")),e.appendChild(a("code",{style:"display:block;margin-top:8px;padding:8px;background:#000;border-radius:4px;word-break:break-all;color:#d1fae5",text:i.acceptUrl}));const s=a("button",{class:"btn-sm",style:"margin-top:8px;padding:4px 10px",text:"Copy link",onclick:async()=>{try{await navigator.clipboard.writeText(i.acceptUrl),s.textContent="Copied!",setTimeout(()=>{s.textContent="Copy link"},2e3)}catch{window.errorHandler&&window.errorHandler.show("Clipboard blocked: select the link manually.")}}});e.appendChild(s),i.deliveredVia==="dev-console"?e.appendChild(a("p",{style:"margin-top:8px;color:#fbbf24;font-size:0.8rem",text:"SMTP not configured \u2014 the invite was logged to the server console (search for [DC-048-DEV-INVITE-LINK])."})):i.deliveredVia==="email"&&e.appendChild(a("p",{style:"margin-top:8px;color:#86efac;font-size:0.8rem",text:"Email sent to "+i.email+"."})),t.appendChild(e)}async function p(i){i.innerHTML="",i.appendChild(a("h2",{style:"margin:0 0 16px",text:"Admin \xB7 Users & Invites"}));const t=await f(l.me).catch(()=>({}));if(!t||!t.user||t.user.role!=="admin"){i.appendChild(a("p",{style:"color:var(--muted)",text:"Admin role required to view this panel. If multi-user mode is enabled and you should have access, check /api/v1/auth/me."}));return}const e=a("button",{class:"btn-sm",style:"float:right;padding:4px 10px",text:"Refresh",onclick:()=>p(i)});i.appendChild(e);const s=a("h3",{style:"margin:24px 0 8px;clear:both",text:"Users"});i.appendChild(s);const n=a("div",{id:"admin-users-list"});i.appendChild(n);const r=await f(l.users).catch(()=>({users:[]}));h(n,r.users,()=>p(i)),i.appendChild(a("h4",{style:"margin:24px 0 8px;font-size:0.95rem",text:"Pre-authorize email"}));const g=a("form",{style:"display:flex;gap:8px;align-items:end",onsubmit:async L=>{L.preventDefault();const P=L.target.email.value.trim();if(P)try{await f(l.users,{method:"POST",body:{email:P}}),L.target.reset(),p(i)}catch(C){window.errorHandler&&window.errorHandler.show("Add failed: "+C.message)}}});g.appendChild(a("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})),g.appendChild(a("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Add to allowlist"})),i.appendChild(g),i.appendChild(a("h3",{style:"margin:24px 0 8px",text:"Issue invite"}));const m=a("div");i.appendChild(m);const x=a("div",{id:"admin-invites-list",style:"margin-top:16px"});i.appendChild(x);const I=await f(l.invites).catch(()=>({invites:[]}));y(x,I.invites,()=>p(i)),u(m,L=>{c(L,m),p(i)})}async function d(){if(document.getElementById("admin-panel-root"))return;const t=a("div",{id:"admin-panel-root",style:"position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:1000;display:flex;align-items:center;justify-content:center;",onclick:n=>{n.target===t&&o()}}),e=a("div",{style:"background:var(--card-base,#1f2937);color:var(--text,#f3f4f6);border-radius:8px;padding:24px;max-width:900px;width:90%;max-height:85vh;overflow:auto;position:relative;box-shadow:0 10px 30px rgba(0,0,0,0.3)"});e.appendChild(a("button",{class:"btn-sm",style:"position:absolute;top:12px;right:12px;padding:4px 10px",text:"Close",onclick:o}));const s=a("div",{id:"admin-panel-body"});e.appendChild(s),t.appendChild(e),document.body.appendChild(t);try{await p(s)}catch(n){s.innerHTML='

Failed to load admin panel: '+(n.message||n)+"

"}}function o(){const i=document.getElementById("admin-panel-root");i&&i.remove()}async function v(i){async function t(){const e=await f(l.me).catch(()=>({})),s=document.getElementById("admin-trigger-btn");if(e&&e.user&&e.user.role==="admin"){if(s)return;const n=a("button",{id:"admin-trigger-btn",class:"btn-sm",style:"margin-left:8px;padding:6px 12px",text:"Admin",onclick:d});i?i.appendChild(n):document.body&&document.body.appendChild(n)}else s&&s.remove()}await t(),setInterval(t,6e4)}window.AdminPanel={open:d,close:o,attachTrigger:v}})(),(function(){injectModal("token-management-modal",` + `);async function s(){try{const v=await(await fetch("/api/v1/totp/config")).json();if(!v.success)return;const{enabled:u,sessionDuration:l,isSetUp:a}=v.config,o=document.getElementById("totp-status-dot"),g=document.getElementById("totp-status-text"),d=document.getElementById("totp-status-banner"),t=document.getElementById("totp-setup-section"),e=document.getElementById("totp-qr-section"),i=document.getElementById("totp-duration-section"),n=document.getElementById("totp-disable-section");if(u&&a){o.style.background="var(--ok-fg, #7ef2ff)",d.style.borderColor="var(--ok-fg, #7ef2ff)",d.style.background="color-mix(in srgb, var(--ok-fg) 8%, transparent)",g.textContent="TOTP is active",g.style.color="var(--ok-fg, #7ef2ff)",t.style.display="block";const r=document.getElementById("totp-setup-btn");r&&(r.textContent="Generate New Secret"),e.style.display="none",i.style.display="block",n.style.display="block",document.getElementById("totp-duration-select").value=l}else o.style.background="var(--muted)",d.style.borderColor="var(--border)",d.style.background="transparent",g.textContent="TOTP is not configured",g.style.color="var(--muted)",t.style.display="block",e.style.display="none",i.style.display="none",n.style.display="none";b(u&&a,l)}catch(y){console.warn("Failed to load TOTP settings:",y)}}const m={"15m":"15 min","30m":"30 min","1h":"1 hour","2h":"2 hours","4h":"4 hours","8h":"8 hours","12h":"12 hours","24h":"24 hours",never:"Disabled"};function h(y,v){const u=window.DCI18n;return u&&u.isLoaded()?u.t(y):v}function b(y,v){const u=document.getElementById("auth-card"),l=document.getElementById("auth-pill"),a=document.getElementById("auth-dot"),o=document.getElementById("auth-status-text");u&&(y?(u.setAttribute("data-status","on"),l.className="badge on",l.textContent=h("card.status.yes","YES"),a.className="dot ok at-bl",o.textContent="Session: "+(m[v]||v)):(u.setAttribute("data-status","off"),l.className="badge off",l.textContent=h("card.status.no","NO"),a.className="dot bad at-bl",o.textContent=h("card.auth.not_configured","Not configured")))}document.getElementById("totp-setup-btn")?.addEventListener("click",async()=>{try{const v=await(await secureFetch("/api/v1/totp/setup",{method:"POST"})).json();v.success&&(document.getElementById("totp-qr-image").src=v.qrCode,document.getElementById("totp-manual-key").textContent=v.manualKey,document.getElementById("totp-setup-section").style.display="none",document.getElementById("totp-qr-section").style.display="block",document.getElementById("totp-setup-code").value="",document.getElementById("totp-setup-error").textContent="",document.getElementById("totp-setup-code").focus())}catch(y){c.logError("[TOTP] Setup Failed",y,{function:"setupTOTP"})}}),document.getElementById("totp-import-btn")?.addEventListener("click",async()=>{const y=document.getElementById("totp-import-key").value.trim(),v=document.getElementById("totp-import-error");if(v.textContent="",!y){v.textContent="Paste a Base32 secret key first";return}try{const l=await(await secureFetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:y})})).json();l.success?(v.textContent="",document.getElementById("totp-qr-image").src=l.qrCode,document.getElementById("totp-manual-key").textContent=l.manualKey,document.getElementById("totp-setup-section").style.display="none",document.getElementById("totp-qr-section").style.display="block",document.getElementById("totp-setup-code").value="",document.getElementById("totp-setup-error").textContent="",document.getElementById("totp-setup-code").focus()):v.textContent=l.error||l.message||"Import failed"}catch{v.textContent="Connection error \u2014 try refreshing the page"}}),document.getElementById("totp-copy-key")?.addEventListener("click",()=>{const y=document.getElementById("totp-manual-key").textContent;navigator.clipboard.writeText(y).then(()=>{const v=document.getElementById("totp-copy-key");v.textContent="\u2705",setTimeout(()=>{v.textContent="\u{1F4CB}"},2e3)})}),document.getElementById("totp-download-backup")?.addEventListener("click",()=>{const y=document.getElementById("totp-manual-key").textContent.trim();if(!y)return;const v={service:"DashCaddy",type:"totp-secret",secret:y,issuer:"DashCaddy",algorithm:"SHA1",digits:6,period:30,issued:new Date().toISOString(),recovery_url:`${window.location.origin}/ (login screen \u2192 "Lost access?")`,note:'Keep this file somewhere safe. Anyone with this secret can generate your login codes. Use it ONLY to recover TOTP access via the "Lost access?" link on the DashCaddy login screen.'},u=new Blob([JSON.stringify(v,null,2)],{type:"application/json"}),l=URL.createObjectURL(u),a=document.createElement("a");a.href=l,a.download=`dashcaddy-totp-backup-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(l);const o=document.getElementById("totp-download-backup");o.textContent="\u2705 Saved",setTimeout(()=>{o.textContent="\u2B07 Download"},2e3)}),document.getElementById("totp-confirm-setup")?.addEventListener("click",async()=>{const y=document.getElementById("totp-setup-code").value,v=document.getElementById("totp-setup-error");if(!/^\d{6}$/.test(y)){v.textContent="Enter a 6-digit code";return}try{const l=await(await secureFetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:y})})).json();l.success?(v.textContent="",s()):v.textContent=l.error||"Invalid code"}catch{v.textContent="Connection error"}}),document.getElementById("totp-setup-code")?.addEventListener("keydown",y=>{y.key==="Enter"&&document.getElementById("totp-confirm-setup")?.click()}),document.getElementById("totp-duration-select")?.addEventListener("change",async y=>{try{await secureFetch("/api/v1/totp/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionDuration:y.target.value})}),s()}catch(v){c.logError("[TOTP] Update Session Duration",v,{function:"updateSessionDuration"})}}),document.getElementById("totp-disable-btn")?.addEventListener("click",async()=>{if(confirm("Disable TOTP authentication? All services will be accessible without a code."))try{(await(await secureFetch("/api/v1/totp/disable",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"})).json()).success&&s()}catch(y){c.logError("[TOTP] Disable Failed",y,{function:"disableTOTP"})}}),document.getElementById("auth-settings-btn")?.addEventListener("click",()=>{s(),openModal("totp-settings-modal")}),document.getElementById("totp-modal-close")?.addEventListener("click",()=>{closeModal("totp-settings-modal")}),document.getElementById("totp-settings-modal")?.addEventListener("click",y=>{y.target.id==="totp-settings-modal"&&closeModal("totp-settings-modal")}),window._updateAuthCard=b,(async()=>{try{const v=await(await fetch("/api/v1/totp/config")).json();if(v.success){const u=v.config.enabled&&v.config.isSetUp;b(u,v.config.sessionDuration)}}catch(y){c.logError("[TOTP] AuthCard Update",y,{function:"authCardUpdate"})}})()})(),(function(){"use strict";const c={me:"/api/v1/auth/me",users:"/api/v1/auth/admin/users",allowlist:"/api/v1/auth/admin/allowlist",invites:"/api/v1/auth/admin/invites"};function s(d,t,...e){const i=document.createElement(d);if(t)for(const n of Object.keys(t)){const r=t[n];r==null||r===!1||(n==="class"?i.className=r:n==="text"?i.textContent=r:n==="html"?i.innerHTML=r:n.startsWith("on")&&typeof r=="function"?i.addEventListener(n.slice(2).toLowerCase(),r):i.setAttribute(n,r))}for(const n of e)n==null||n===!1||(typeof n=="string"?i.appendChild(document.createTextNode(n)):i.appendChild(n));return i}async function m(d,t){const e=window.SITE&&window.SITE.csrfToken||"";t=t||{},t.headers=Object.assign({"Content-Type":"application/json"},t.headers||{},e?{"X-CSRF-Token":e}:{}),t.body&&typeof t.body!="string"&&(t.body=JSON.stringify(t.body));const i=await fetch(d,t),n=await i.json().catch(()=>({}));if(!i.ok){const r=n&&(n.message||n.error)||"HTTP "+i.status,f=new Error(r);throw f.status=i.status,f}return n}function h(d){const t={admin:"background:#7c3aed;color:#fff",operator:"background:#2563eb;color:#fff",viewer:"background:#6b7280;color:#fff"};return s("span",{class:"role-badge",style:"display:inline-block;padding:2px 8px;border-radius:4px;font-size:0.75rem;font-weight:600;text-transform:uppercase;"+(t[d]||t.viewer),text:d})}function b(d,t,e){if(d.innerHTML="",!t||t.length===0){d.appendChild(s("p",{style:"color:var(--muted)",text:"No users yet."}));return}const i=s("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});i.appendChild(s("thead",null,s("tr",{style:"border-bottom:1px solid var(--border)"},s("th",{style:"text-align:left;padding:8px",text:"Email"}),s("th",{style:"text-align:left;padding:8px",text:"Role"}),s("th",{style:"text-align:left;padding:8px",text:"Created"}),s("th",{style:"text-align:left;padding:8px",text:"Last login"}),s("th",{style:"text-align:right;padding:8px",text:"Actions"}))));const n=s("tbody");for(const r of t){const f=s("tr",{style:"border-bottom:1px solid var(--border)"}),p=s("td",{style:"padding:8px"});p.appendChild(s("span",{text:r.email||"(no email)"})),r.displayName&&r.displayName!==(r.email||"").split("@")[0]&&(p.appendChild(s("br")),p.appendChild(s("small",{style:"color:var(--muted)",text:r.displayName}))),f.appendChild(p);const w=s("td",{style:"padding:8px"});w.appendChild(h(r.role)),f.appendChild(w),f.appendChild(s("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:r.createdAt?new Date(r.createdAt).toLocaleDateString():"\u2014"})),f.appendChild(s("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:r.lastLoginAt?new Date(r.lastLoginAt).toLocaleString():"\u2014"}));const I=s("td",{style:"padding:8px;text-align:right"}),L=s("select",{style:"padding:2px 6px;margin-right:6px",onchange:async C=>{try{await m(c.users+"/"+encodeURIComponent(r.id),{method:"PATCH",body:{role:C.target.value}}),e&&e()}catch(B){window.errorHandler&&window.errorHandler.show("Role update failed: "+B.message),C.target.value=r.role}}});for(const C of["admin","operator","viewer"]){const B=s("option",{value:C,text:C});C===r.role&&(B.selected=!0),L.appendChild(B)}I.appendChild(L);const P=s("button",{class:"btn-sm",style:"padding:2px 8px",text:"Delete",onclick:async()=>{if(confirm("Delete user "+(r.email||r.id)+"? This cannot be undone."))try{await m(c.users+"/"+encodeURIComponent(r.id),{method:"DELETE"}),e&&e()}catch(C){window.errorHandler&&window.errorHandler.show("Delete failed: "+C.message)}}});I.appendChild(P),f.appendChild(I),n.appendChild(f)}i.appendChild(n),d.appendChild(i)}function y(d,t){const e=s("form",{style:"display:flex;gap:8px;flex-wrap:wrap;align-items:end",onsubmit:async n=>{n.preventDefault();const r=new FormData(n.target),f={email:r.get("email"),role:r.get("role"),ttlHours:parseInt(r.get("ttlHours"),10)||24,sendEmail:r.get("sendEmail")==="on"};try{const p=await m(c.invites,{method:"POST",body:f});n.target.reset(),t&&t(p)}catch(p){window.errorHandler&&window.errorHandler.show("Invite failed: "+p.message)}}});e.appendChild(s("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},s("span",{text:"Email"}),s("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})));const i=s("select",{name:"role",style:"padding:6px"});for(const n of["operator","viewer","admin"])i.appendChild(s("option",{value:n,text:n}));e.appendChild(s("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},s("span",{text:"Role"}),i)),e.appendChild(s("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},s("span",{text:"TTL (hours)"}),s("input",{name:"ttlHours",type:"number",min:"1",max:"168",value:"24",style:"padding:6px;width:80px"}))),e.appendChild(s("label",{style:"display:flex;gap:4px;align-items:center;font-size:0.85rem"},s("input",{name:"sendEmail",type:"checkbox",checked:!0}),s("span",{text:"Send email"}))),e.appendChild(s("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Issue invite"})),d.appendChild(e)}function v(d,t,e){if(d.innerHTML="",!t||t.length===0){d.appendChild(s("p",{style:"color:var(--muted)",text:"No outstanding invites."}));return}const i=s("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});i.appendChild(s("thead",null,s("tr",{style:"border-bottom:1px solid var(--border)"},s("th",{style:"text-align:left;padding:8px",text:"Email"}),s("th",{style:"text-align:left;padding:8px",text:"Role"}),s("th",{style:"text-align:left;padding:8px",text:"Invited by"}),s("th",{style:"text-align:left;padding:8px",text:"Expires"}),s("th",{style:"text-align:right;padding:8px",text:"Actions"}))));const n=s("tbody");for(const r of t){const f=s("tr",{style:"border-bottom:1px solid var(--border)"});f.appendChild(s("td",{style:"padding:8px",text:r.email})),f.appendChild(s("td",{style:"padding:8px"},h(r.role))),f.appendChild(s("td",{style:"padding:8px;color:var(--muted)",text:r.invitedBy||"\u2014"})),f.appendChild(s("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:r.expiresAt?new Date(r.expiresAt).toLocaleString():"\u2014"}));const p=s("td",{style:"padding:8px;text-align:right"});p.appendChild(s("button",{class:"btn-sm",style:"padding:2px 8px",text:"Revoke",onclick:async()=>{if(confirm("Revoke invite for "+r.email+"?"))try{await m(c.invites+"/"+encodeURIComponent(r.id),{method:"DELETE"}),e&&e()}catch(w){window.errorHandler&&window.errorHandler.show("Revoke failed: "+w.message)}}})),f.appendChild(p),n.appendChild(f)}i.appendChild(n),d.appendChild(i)}function u(d,t){const e=s("div",{style:"margin-top:12px;padding:12px;border:1px solid #16a34a;border-radius:6px;background:#052e1a;color:#bbf7d0;font-size:0.85rem"});e.appendChild(s("strong",{text:"Invite issued \u2014 copy the link below. It will not be shown again."})),e.appendChild(s("br")),e.appendChild(s("code",{style:"display:block;margin-top:8px;padding:8px;background:#000;border-radius:4px;word-break:break-all;color:#d1fae5",text:d.acceptUrl}));const i=s("button",{class:"btn-sm",style:"margin-top:8px;padding:4px 10px",text:"Copy link",onclick:async()=>{try{await navigator.clipboard.writeText(d.acceptUrl),i.textContent="Copied!",setTimeout(()=>{i.textContent="Copy link"},2e3)}catch{window.errorHandler&&window.errorHandler.show("Clipboard blocked: select the link manually.")}}});e.appendChild(i),d.deliveredVia==="dev-console"?e.appendChild(s("p",{style:"margin-top:8px;color:#fbbf24;font-size:0.8rem",text:"SMTP not configured \u2014 the invite was logged to the server console (search for [DC-048-DEV-INVITE-LINK])."})):d.deliveredVia==="email"&&e.appendChild(s("p",{style:"margin-top:8px;color:#86efac;font-size:0.8rem",text:"Email sent to "+d.email+"."})),t.appendChild(e)}async function l(d){d.innerHTML="",d.appendChild(s("h2",{style:"margin:0 0 16px",text:"Admin \xB7 Users & Invites"}));const t=await m(c.me).catch(()=>({}));if(!t||!t.user||t.user.role!=="admin"){d.appendChild(s("p",{style:"color:var(--muted)",text:"Admin role required to view this panel. If multi-user mode is enabled and you should have access, check /api/v1/auth/me."}));return}const e=s("button",{class:"btn-sm",style:"float:right;padding:4px 10px",text:"Refresh",onclick:()=>l(d)});d.appendChild(e);const i=s("h3",{style:"margin:24px 0 8px;clear:both",text:"Users"});d.appendChild(i);const n=s("div",{id:"admin-users-list"});d.appendChild(n);const r=await m(c.users).catch(()=>({users:[]}));b(n,r.users,()=>l(d)),d.appendChild(s("h4",{style:"margin:24px 0 8px;font-size:0.95rem",text:"Pre-authorize email"}));const f=s("form",{style:"display:flex;gap:8px;align-items:end",onsubmit:async L=>{L.preventDefault();const P=L.target.email.value.trim();if(P)try{await m(c.users,{method:"POST",body:{email:P}}),L.target.reset(),l(d)}catch(C){window.errorHandler&&window.errorHandler.show("Add failed: "+C.message)}}});f.appendChild(s("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})),f.appendChild(s("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Add to allowlist"})),d.appendChild(f),d.appendChild(s("h3",{style:"margin:24px 0 8px",text:"Issue invite"}));const p=s("div");d.appendChild(p);const w=s("div",{id:"admin-invites-list",style:"margin-top:16px"});d.appendChild(w);const I=await m(c.invites).catch(()=>({invites:[]}));v(w,I.invites,()=>l(d)),y(p,L=>{u(L,p),l(d)})}async function a(){if(document.getElementById("admin-panel-root"))return;const t=s("div",{id:"admin-panel-root",style:"position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:1000;display:flex;align-items:center;justify-content:center;",onclick:n=>{n.target===t&&o()}}),e=s("div",{style:"background:var(--card-base,#1f2937);color:var(--text,#f3f4f6);border-radius:8px;padding:24px;max-width:900px;width:90%;max-height:85vh;overflow:auto;position:relative;box-shadow:0 10px 30px rgba(0,0,0,0.3)"});e.appendChild(s("button",{class:"btn-sm",style:"position:absolute;top:12px;right:12px;padding:4px 10px",text:"Close",onclick:o}));const i=s("div",{id:"admin-panel-body"});e.appendChild(i),t.appendChild(e),document.body.appendChild(t);try{await l(i)}catch(n){i.innerHTML='

Failed to load admin panel: '+(n.message||n)+"

"}}function o(){const d=document.getElementById("admin-panel-root");d&&d.remove()}async function g(d){async function t(){const e=await m(c.me).catch(()=>({})),i=document.getElementById("admin-trigger-btn");if(e&&e.user&&e.user.role==="admin"){if(i)return;const n=s("button",{id:"admin-trigger-btn",class:"btn-sm",style:"margin-left:8px;padding:6px 12px",text:"Admin",onclick:a});d?d.appendChild(n):document.body&&document.body.appendChild(n)}else i&&i.remove()}await t(),setInterval(t,6e4)}window.AdminPanel={open:a,close:o,attachTrigger:g}})(),(function(){injectModal("token-management-modal",`

\u{1F511} DNS Credentials

@@ -306,40 +306,40 @@
- `);function l(){return Object.keys(SITE.dnsServers||{})}function a(n){return(SITE.dnsServers||{})[n]?.name||n.toUpperCase()}function f(){const n=document.getElementById("dns-cred-sections");if(!n)return;n.innerHTML="";const r=l();if(r.length===0){n.innerHTML='

No DNS servers configured.

';return}for(const g of r)n.insertAdjacentHTML("beforeend",` + `);function c(){return Object.keys(SITE.dnsServers||{})}function s(n){return(SITE.dnsServers||{})[n]?.name||n.toUpperCase()}function m(){const n=document.getElementById("dns-cred-sections");if(!n)return;n.innerHTML="";const r=c();if(r.length===0){n.innerHTML='

No DNS servers configured.

';return}for(const f of r)n.insertAdjacentHTML("beforeend",`
-

${a(g)}

+

${s(f)}

- - + +
- - + +
- - + +
- - + +
-
+
- `)}function b(){let n=safeSessionGet("dashcaddy-encryption-key");if(n)return n;const r=safeGet("dashcaddy-encryption-key");if(r)return safeSessionSet("dashcaddy-encryption-key",r),safeRemove("dashcaddy-encryption-key"),r;const g=new Uint8Array(32);return crypto.getRandomValues(g),n=Array.from(g,m=>m.toString(16).padStart(2,"0")).join(""),safeSessionSet("dashcaddy-encryption-key",n),n}const h=b();function u(n,r){if(!n)return"";const g=crypto.getRandomValues(new Uint8Array(8)),m=Array.from(g,L=>L.toString(16).padStart(2,"0")).join(""),x=new TextEncoder().encode(r+m);let I="";for(let L=0;LparseInt($,16))),P=atob(n.substring(17)),C=new TextEncoder().encode(r+I);let B="";for(let $=0;${["readonly","admin"].forEach(r=>{["token","username"].forEach(g=>{safeRemove(`${n}-${r}-${g}-enc`)})}),safeRemove(`${n}-token-enc`),safeRemove(`${n}-username-enc`)})}function s(n){const r=d(n,"readonly"),g=o(n,"readonly"),m=d(n,"admin"),x=o(n,"admin"),I=y(safeGet(`${n}-token-enc`),h),L=y(safeGet(`${n}-username-enc`),h);return{username:x||g||L,token:m||r||I,readonlyToken:r||I,readonlyUsername:g||L,adminToken:m||I,adminUsername:x||L}}document.getElementById("manage-tokens")?.addEventListener("click",()=>{f();const n=document.getElementById("token-management-modal"),r=t();l().forEach(g=>{const m=r[g];document.getElementById(`${g}-readonly-username`).value=m.readonly.username,document.getElementById(`${g}-readonly-token`).value=m.readonly.token,document.getElementById(`${g}-admin-username`).value=m.admin.username,document.getElementById(`${g}-admin-token`).value=m.admin.token,document.getElementById(`${g}-token-status`).textContent=""}),n.classList.add("show")}),document.getElementById("token-management-modal")?.addEventListener("click",n=>{const r=n.target.closest(".token-toggle");if(r){const g=r.dataset.target,m=document.getElementById(g);m.type==="password"?(m.type="text",r.textContent="\u{1F648}"):(m.type="password",r.textContent="\u{1F441}");return}n.target.id==="token-management-modal"&&n.target.classList.remove("show")}),document.getElementById("token-save")?.addEventListener("click",async()=>{const n=l();n.forEach(m=>{i(m,"readonly",document.getElementById(`${m}-readonly-username`).value.trim()),v(m,"readonly",document.getElementById(`${m}-readonly-token`).value.trim()),i(m,"admin",document.getElementById(`${m}-admin-username`).value.trim()),v(m,"admin",document.getElementById(`${m}-admin-token`).value.trim())});const r={};let g=!1;if(n.forEach(m=>{const x={},I=document.getElementById(`${m}-readonly-username`).value.trim(),L=document.getElementById(`${m}-readonly-token`).value.trim(),P=document.getElementById(`${m}-admin-username`).value.trim(),C=document.getElementById(`${m}-admin-token`).value.trim();I&&L&&(x.readonly={username:I,password:L},g=!0),P&&C&&(x.admin={username:P,password:C},g=!0),Object.keys(x).length>0&&(r[m]=x)}),g){n.forEach(m=>{r[m]&&(document.getElementById(`${m}-token-status`).textContent="Verifying...",document.getElementById(`${m}-token-status`).className="token-status")});try{const x=await(await secureFetch("/api/v1/dns/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({servers:r})})).json();x.results?n.forEach(I=>{const L=document.getElementById(`${I}-token-status`);if(!r[I]){L.textContent="";return}const P=x.results[I];P?.success?(L.textContent="\u2713 Verified & saved",L.className="token-status success"):P?.partial?(L.textContent="\u2713 "+P.partial,L.className="token-status success"):(L.textContent="\u2717 "+(P?.error||"Login failed"),L.className="token-status error")}):x.success?n.forEach(I=>{r[I]&&(document.getElementById(`${I}-token-status`).textContent="\u2713 Saved",document.getElementById(`${I}-token-status`).className="token-status success")}):n.forEach(I=>{r[I]&&(document.getElementById(`${I}-token-status`).textContent="\u2717 "+(x.error||"Failed"),document.getElementById(`${I}-token-status`).className="token-status error")})}catch(m){console.error("Failed to sync DNS credentials to backend:",m),n.forEach(x=>{r[x]&&(document.getElementById(`${x}-token-status`).textContent="\u2713 Saved locally (sync failed)",document.getElementById(`${x}-token-status`).className="token-status")})}}else n.forEach(m=>{document.getElementById(`${m}-token-status`).textContent=""});setTimeout(()=>{n.every(x=>{const I=document.getElementById(`${x}-token-status`)?.textContent;return!I||I.includes("\u2713")})&&closeModal("token-management-modal")},1500)}),document.getElementById("token-cancel")?.addEventListener("click",()=>{closeModal("token-management-modal")}),document.getElementById("token-clear-all")?.addEventListener("click",async()=>{if(confirm("Clear all stored DNS credentials? This cannot be undone.")){e(),l().forEach(n=>{document.getElementById(`${n}-readonly-username`).value="",document.getElementById(`${n}-readonly-token`).value="",document.getElementById(`${n}-admin-username`).value="",document.getElementById(`${n}-admin-token`).value="",document.getElementById(`${n}-token-status`).textContent="\u2713 Cleared",document.getElementById(`${n}-token-status`).className="token-status success"});try{await secureFetch("/api/v1/dns/credentials",{method:"DELETE"})}catch{}}}),window.getToken=d,window.getUsername=o,window.setToken=v,window.setUsername=i,window.getAllCredentials=t,window.getCredential=c,window.setCredential=p,window.getEncryptionKey=b,window.getDnsIds=l,window.getDnsDisplayName=a})(),(function(){function l(i){const t=window.DCI18n;return!t||!t.isLoaded()?i?"ON":"OFF":t.t(i?"card.status.on":"card.status.off")}function a(i,t,e=null){const s=document.getElementById(i+"-dot"),n=document.getElementById(i+"-pill"),r=document.getElementById(i+"-time"),g=document.querySelector(`[data-app="${i}"]`);s&&(s.classList.toggle("ok",t),s.classList.toggle("bad",!t)),n&&(n.textContent=l(t),n.classList.toggle("on",t),n.classList.toggle("off",!t)),r&&e!==null&&(r.textContent=t?`${e}ms`:"timeout",r.className=`response-time ${f(e,t)}`),g&&g.setAttribute("data-status",t?"on":"off")}function f(i,t){return t?i<200?"excellent":i<500?"good":i<1e3?"fair":"slow":"timeout"}async function b(i){const t=performance.now();try{const e=await fetch("/probe/"+i,{cache:"no-store"}),s=performance.now(),n=Math.round(s-t);return{isUp:e.status>=200&&e.status<400||e.status===401||e.status===403,responseTime:n}}catch{const e=performance.now();return{isUp:!1,responseTime:Math.round(e-t)}}}window.APPS=[];let h=null,u=!1;async function y(){try{window.SkeletonLoader&&window.SkeletonLoader.show(6);const i=await fetch("/api/v1/services",{cache:"no-store"});if(i.ok){const t=await i.json();window.APPS=t.services||[],window.SkeletonLoader&&window.SkeletonLoader.hide()}else console.error("Failed to load services:",i.status),window.SkeletonLoader&&window.SkeletonLoader.hide()}catch(i){console.error("Failed to load services:",i),window.SkeletonLoader&&window.SkeletonLoader.hide()}}function c(i){const t=window.APPS?.find(s=>s.id===i);if(t?.url)return t.url.startsWith("http")?t.url:"https://"+t.url;if(t?.isExternal&&t.externalUrl)return t.externalUrl;const e=SITE.dnsServers?.[i];return e?"http://"+e.ip+":"+(e.port||5380):buildServiceUrl(i)}function p(i,t,e){const s=document.createElement(i);return t&&(s.className=t),e&&(s.textContent=e),s}function d(){const i=document.getElementById("cards");i.innerHTML="";for(let t=0;t{O.stopPropagation(),window.openContainerLogsModal(e.containerId,e.name)},S.appendChild(k);const A=p("button","update-btn","\u2B06\uFE0F");A.title="Update container to latest version",A.id=`update-btn-${e.id}`,A.onclick=O=>{O.stopPropagation(),window.updateContainer(e.containerId,e.name,e.id)},S.appendChild(A);const D=p("button","exec-btn",">_");D.title="Open terminal",D.onclick=O=>{O.stopPropagation(),window.openExecModal&&window.openExecModal(e.containerId,e.name)},S.appendChild(D)}if(e.logPath&&!e.containerId){const k=p("button","logs-btn","\u{1F4CB}");k.title="View application logs",k.onclick=A=>{A.stopPropagation(),window.openFileLogsModal(e.logPath,e.name)},S.appendChild(k)}if(e.isExternal||e.appTemplate||e.url){const k=p("button","creds-btn","\u{1F511}");k.title="Auto-login credentials",k.id=`creds-btn-${e.id}`,k.onclick=A=>{A.stopPropagation(),window.openServiceCredsModal(e)},S.appendChild(k)}if(e.id!=="internet"){const k=p("button","options-btn","\u2699\uFE0F");k.title="Edit service settings",k.onclick=A=>{A.stopPropagation(),window.openServiceEditModal(e)},S.appendChild(k)}if(e.id!=="internet"){const k=p("button","share-btn","\u{1F517}");k.title="Share this service (Pro)",k.onclick=A=>{A.stopPropagation(),typeof window.openShareModal=="function"?window.openShareModal(e):typeof window.showNotification=="function"&&window.showNotification("Share modal not loaded. Refresh the page.","error")},S.appendChild(k)}if(e.id!=="internet"){const k=p("button","delete-btn","\u{1F5D1}\uFE0F");k.title="Delete this service",k.onclick=A=>{A.stopPropagation(),window.deleteService(e.id,e.name)},S.appendChild(k)}const T=p("button",null,"Open");T.setAttribute("data-i18n","action.open"),T.onclick=()=>window.open(c(e.id),"_blank","noopener"),S.appendChild(T),s.appendChild(S),s.style.transitionDelay=`${Math.min(t*45,270)}ms`,i.appendChild(s)}window.DCI18n&&window.DCI18n.isLoaded()&&window.DCI18n.applyTranslations(),requestAnimationFrame(()=>{i.querySelectorAll(".card").forEach(t=>t.classList.add("loaded"))}),window.groupRecipeCards&&requestAnimationFrame(()=>window.groupRecipeCards()),window.refreshServiceFilter&&window.refreshServiceFilter()}function o(i,t,e=null){const s=document.getElementById("dot-"+i+"-grid"),n=document.getElementById("badge-"+i),r=document.getElementById("time-"+i),g=document.querySelector(`[data-app="${i}"]`);s&&(s.classList.toggle("ok",t),s.classList.toggle("bad",!t)),n&&(n.textContent=l(t),n.classList.toggle("on",t),n.classList.toggle("off",!t)),r&&e!==null&&(r.textContent=t?`${e}ms`:"timeout",r.className=`response-time ${f(e,t)}`),g&&g.setAttribute("data-status",t?"on":"off")}async function v(){if(h)return u=!0,h;function i(s,n=new Date){const r=document.getElementById("stamp");r&&(r.textContent=`${s}: ${new Date(n).toLocaleTimeString()}`)}function t(s){Object.keys(SITE.dnsServers).forEach(r=>{const g=s[r];g&&a(r,g.isUp,g.responseTime)}),s.internet&&a("internet",s.internet.isUp,s.internet.responseTime),window.APPS.forEach(r=>{const g=s[r.id];g&&o(r.id,g.isUp,g.responseTime)})}async function e(){const s=Object.keys(SITE.dnsServers),n=s.map(x=>b(x));n.push(b("internet"));const r=await Promise.all(n);s.forEach((x,I)=>a(x,r[I].isUp,r[I].responseTime));const g=r[r.length-1];a("internet",g.isUp,g.responseTime),(await Promise.all(window.APPS.map(async x=>{const I=await b(x.id);return{id:x.id,...I}}))).forEach(x=>{o(x.id,x.isUp,x.responseTime)})}return h=(async()=>{try{const s=await fetch("/api/v1/services/status",{cache:"no-store"});if(!s.ok)throw new Error(`Status refresh failed (${s.status})`);const n=await s.json();t(n.statuses||{}),i("last check",n.checkedAt||new Date)}catch(s){console.warn("Batched status refresh failed, falling back to direct probes:",s);try{await e(),i("last check")}catch(n){console.error("Dashboard refresh failed:",n),i("last failed")}}finally{h=null,u&&(u=!1,setTimeout(()=>{window.refreshAll()},0))}})(),h}document.querySelector(".top")?.addEventListener("click",i=>{const t=i.target.closest('[id$="-open"]');if(!t)return;const e=t.id.replace("-open","");SITE.dnsServers[e]&&window.open(c(e),"_blank","noopener")}),document.getElementById("ca-open")?.addEventListener("click",()=>window.open(c("ca"),"_blank","noopener")),document.getElementById("creds-btn-ca")?.addEventListener("click",i=>{i.stopPropagation();const t=window.APPS.find(e=>e.id==="ca");t&&window.openServiceCredsModal&&window.openServiceCredsModal(t)}),document.getElementById("options-btn-ca")?.addEventListener("click",i=>{i.stopPropagation();const t=window.APPS.find(e=>e.id==="ca");t&&window.openServiceEditModal&&window.openServiceEditModal(t)}),document.getElementById("delete-btn-ca")?.addEventListener("click",i=>{i.stopPropagation(),window.deleteService&&window.deleteService("ca","DashCA")}),window.loadServices=y,window.buildGrid=d,window.refreshAll=v,window.setQuick=a,window.setBadge=o,window.getResponseTimeClass=f,window.checkServiceWithTiming=b,window.serviceUrl=c,window.el=p})(),(function(){async function l(c){const d=await(await secureFetch(`/api/v1/dns/restart/${c}`,{method:"POST"})).json();if(!d.success)throw new Error(d.error||"Restart failed");return d}document.querySelector(".top")?.addEventListener("click",async c=>{const p=c.target.closest('[id$="-restart"]');if(!p)return;const d=p.id.replace("-restart","");if(SITE.dnsServers[d]&&confirm(`Restart ${d.toUpperCase()} service?`))try{await withButton(p,"...",()=>l(d)),setTimeout(window.refreshAll,DC.DELAYS.RELOAD)}catch(o){showNotification("Restart failed: "+o.message,"error")}});async function a(c,p){const d=document.getElementById(`${c}-update`),o=d?.textContent||"\u2B06\uFE0F";try{d.textContent="\u{1F50D}",d.disabled=!0,d.title="Checking for updates...";const i=await(await fetch(`/api/v1/dns/check-update?server=${encodeURIComponent(p)}`)).json();if(!i.success)throw new Error(i.error||"Failed to check for updates");if(!i.updateAvailable){d.textContent="\u2705",d.title=`Already on latest version (${i.currentVersion})`,showNotification(`${c.toUpperCase()} is already up to date! Current version: ${i.currentVersion}`,"info"),setTimeout(()=>{d.textContent=o,d.disabled=!1,d.title="Update DNS server"},3e3);return}if(!confirm(`Update available for ${c.toUpperCase()}! + `)}function h(){let n=safeSessionGet("dashcaddy-encryption-key");if(n)return n;const r=safeGet("dashcaddy-encryption-key");if(r)return safeSessionSet("dashcaddy-encryption-key",r),safeRemove("dashcaddy-encryption-key"),r;const f=new Uint8Array(32);return crypto.getRandomValues(f),n=Array.from(f,p=>p.toString(16).padStart(2,"0")).join(""),safeSessionSet("dashcaddy-encryption-key",n),n}const b=h();function y(n,r){if(!n)return"";const f=crypto.getRandomValues(new Uint8Array(8)),p=Array.from(f,L=>L.toString(16).padStart(2,"0")).join(""),w=new TextEncoder().encode(r+p);let I="";for(let L=0;LparseInt($,16))),P=atob(n.substring(17)),C=new TextEncoder().encode(r+I);let B="";for(let $=0;${["readonly","admin"].forEach(r=>{["token","username"].forEach(f=>{safeRemove(`${n}-${r}-${f}-enc`)})}),safeRemove(`${n}-token-enc`),safeRemove(`${n}-username-enc`)})}function i(n){const r=a(n,"readonly"),f=o(n,"readonly"),p=a(n,"admin"),w=o(n,"admin"),I=v(safeGet(`${n}-token-enc`),b),L=v(safeGet(`${n}-username-enc`),b);return{username:w||f||L,token:p||r||I,readonlyToken:r||I,readonlyUsername:f||L,adminToken:p||I,adminUsername:w||L}}document.getElementById("manage-tokens")?.addEventListener("click",()=>{m();const n=document.getElementById("token-management-modal"),r=t();c().forEach(f=>{const p=r[f];document.getElementById(`${f}-readonly-username`).value=p.readonly.username,document.getElementById(`${f}-readonly-token`).value=p.readonly.token,document.getElementById(`${f}-admin-username`).value=p.admin.username,document.getElementById(`${f}-admin-token`).value=p.admin.token,document.getElementById(`${f}-token-status`).textContent=""}),n.classList.add("show")}),document.getElementById("token-management-modal")?.addEventListener("click",n=>{const r=n.target.closest(".token-toggle");if(r){const f=r.dataset.target,p=document.getElementById(f);p.type==="password"?(p.type="text",r.textContent="\u{1F648}"):(p.type="password",r.textContent="\u{1F441}");return}n.target.id==="token-management-modal"&&n.target.classList.remove("show")}),document.getElementById("token-save")?.addEventListener("click",async()=>{const n=c();n.forEach(p=>{d(p,"readonly",document.getElementById(`${p}-readonly-username`).value.trim()),g(p,"readonly",document.getElementById(`${p}-readonly-token`).value.trim()),d(p,"admin",document.getElementById(`${p}-admin-username`).value.trim()),g(p,"admin",document.getElementById(`${p}-admin-token`).value.trim())});const r={};let f=!1;if(n.forEach(p=>{const w={},I=document.getElementById(`${p}-readonly-username`).value.trim(),L=document.getElementById(`${p}-readonly-token`).value.trim(),P=document.getElementById(`${p}-admin-username`).value.trim(),C=document.getElementById(`${p}-admin-token`).value.trim();I&&L&&(w.readonly={username:I,password:L},f=!0),P&&C&&(w.admin={username:P,password:C},f=!0),Object.keys(w).length>0&&(r[p]=w)}),f){n.forEach(p=>{r[p]&&(document.getElementById(`${p}-token-status`).textContent="Verifying...",document.getElementById(`${p}-token-status`).className="token-status")});try{const w=await(await secureFetch("/api/v1/dns/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({servers:r})})).json();w.results?n.forEach(I=>{const L=document.getElementById(`${I}-token-status`);if(!r[I]){L.textContent="";return}const P=w.results[I];P?.success?(L.textContent="\u2713 Verified & saved",L.className="token-status success"):P?.partial?(L.textContent="\u2713 "+P.partial,L.className="token-status success"):(L.textContent="\u2717 "+(P?.error||"Login failed"),L.className="token-status error")}):w.success?n.forEach(I=>{r[I]&&(document.getElementById(`${I}-token-status`).textContent="\u2713 Saved",document.getElementById(`${I}-token-status`).className="token-status success")}):n.forEach(I=>{r[I]&&(document.getElementById(`${I}-token-status`).textContent="\u2717 "+(w.error||"Failed"),document.getElementById(`${I}-token-status`).className="token-status error")})}catch(p){console.error("Failed to sync DNS credentials to backend:",p),n.forEach(w=>{r[w]&&(document.getElementById(`${w}-token-status`).textContent="\u2713 Saved locally (sync failed)",document.getElementById(`${w}-token-status`).className="token-status")})}}else n.forEach(p=>{document.getElementById(`${p}-token-status`).textContent=""});setTimeout(()=>{n.every(w=>{const I=document.getElementById(`${w}-token-status`)?.textContent;return!I||I.includes("\u2713")})&&closeModal("token-management-modal")},1500)}),document.getElementById("token-cancel")?.addEventListener("click",()=>{closeModal("token-management-modal")}),document.getElementById("token-clear-all")?.addEventListener("click",async()=>{if(confirm("Clear all stored DNS credentials? This cannot be undone.")){e(),c().forEach(n=>{document.getElementById(`${n}-readonly-username`).value="",document.getElementById(`${n}-readonly-token`).value="",document.getElementById(`${n}-admin-username`).value="",document.getElementById(`${n}-admin-token`).value="",document.getElementById(`${n}-token-status`).textContent="\u2713 Cleared",document.getElementById(`${n}-token-status`).className="token-status success"});try{await secureFetch("/api/v1/dns/credentials",{method:"DELETE"})}catch{}}}),window.getToken=a,window.getUsername=o,window.setToken=g,window.setUsername=d,window.getAllCredentials=t,window.getCredential=u,window.setCredential=l,window.getEncryptionKey=h,window.getDnsIds=c,window.getDnsDisplayName=s})(),(function(){function c(d){const t=window.DCI18n;return!t||!t.isLoaded()?d?"ON":"OFF":t.t(d?"card.status.on":"card.status.off")}function s(d,t,e=null){const i=document.getElementById(d+"-dot"),n=document.getElementById(d+"-pill"),r=document.getElementById(d+"-time"),f=document.querySelector(`[data-app="${d}"]`);i&&(i.classList.toggle("ok",t),i.classList.toggle("bad",!t)),n&&(n.textContent=c(t),n.classList.toggle("on",t),n.classList.toggle("off",!t)),r&&e!==null&&(r.textContent=t?`${e}ms`:"timeout",r.className=`response-time ${m(e,t)}`),f&&f.setAttribute("data-status",t?"on":"off")}function m(d,t){return t?d<200?"excellent":d<500?"good":d<1e3?"fair":"slow":"timeout"}async function h(d){const t=performance.now();try{const e=await fetch("/probe/"+d,{cache:"no-store"}),i=performance.now(),n=Math.round(i-t);return{isUp:e.status>=200&&e.status<400||e.status===401||e.status===403,responseTime:n}}catch{const e=performance.now();return{isUp:!1,responseTime:Math.round(e-t)}}}window.APPS=[];let b=null,y=!1;async function v(){try{window.SkeletonLoader&&window.SkeletonLoader.show(6);const d=await fetch("/api/v1/services",{cache:"no-store"});if(d.ok){const t=await d.json();window.APPS=t.services||[],window.SkeletonLoader&&window.SkeletonLoader.hide()}else console.error("Failed to load services:",d.status),window.SkeletonLoader&&window.SkeletonLoader.hide()}catch(d){console.error("Failed to load services:",d),window.SkeletonLoader&&window.SkeletonLoader.hide()}}function u(d){const t=window.APPS?.find(i=>i.id===d);if(t?.url)return t.url.startsWith("http")?t.url:"https://"+t.url;if(t?.isExternal&&t.externalUrl)return t.externalUrl;const e=SITE.dnsServers?.[d];return e?"http://"+e.ip+":"+(e.port||5380):buildServiceUrl(d)}function l(d,t,e){const i=document.createElement(d);return t&&(i.className=t),e&&(i.textContent=e),i}function a(){const d=document.getElementById("cards");d.innerHTML="";for(let t=0;t{O.stopPropagation(),window.openContainerLogsModal(e.containerId,e.name)},S.appendChild(k);const A=l("button","update-btn","\u2B06\uFE0F");A.title="Update container to latest version",A.id=`update-btn-${e.id}`,A.onclick=O=>{O.stopPropagation(),window.updateContainer(e.containerId,e.name,e.id)},S.appendChild(A);const D=l("button","exec-btn",">_");D.title="Open terminal",D.onclick=O=>{O.stopPropagation(),window.openExecModal&&window.openExecModal(e.containerId,e.name)},S.appendChild(D)}if(e.logPath&&!e.containerId){const k=l("button","logs-btn","\u{1F4CB}");k.title="View application logs",k.onclick=A=>{A.stopPropagation(),window.openFileLogsModal(e.logPath,e.name)},S.appendChild(k)}if(e.isExternal||e.appTemplate||e.url){const k=l("button","creds-btn","\u{1F511}");k.title="Auto-login credentials",k.id=`creds-btn-${e.id}`,k.onclick=A=>{A.stopPropagation(),window.openServiceCredsModal(e)},S.appendChild(k)}if(e.id!=="internet"){const k=l("button","options-btn","\u2699\uFE0F");k.title="Edit service settings",k.onclick=A=>{A.stopPropagation(),window.openServiceEditModal(e)},S.appendChild(k)}if(e.id!=="internet"){const k=l("button","share-btn","\u{1F517}");k.title="Share this service (Pro)",k.onclick=A=>{A.stopPropagation(),typeof window.openShareModal=="function"?window.openShareModal(e):typeof window.showNotification=="function"&&window.showNotification("Share modal not loaded. Refresh the page.","error")},S.appendChild(k)}if(e.id!=="internet"){const k=l("button","delete-btn","\u{1F5D1}\uFE0F");k.title="Delete this service",k.onclick=A=>{A.stopPropagation(),window.deleteService(e.id,e.name)},S.appendChild(k)}const T=l("button",null,"Open");T.setAttribute("data-i18n","action.open"),T.onclick=()=>window.open(u(e.id),"_blank","noopener"),S.appendChild(T),i.appendChild(S),i.style.transitionDelay=`${Math.min(t*45,270)}ms`,d.appendChild(i)}window.DCI18n&&window.DCI18n.isLoaded()&&window.DCI18n.applyTranslations(),requestAnimationFrame(()=>{d.querySelectorAll(".card").forEach(t=>t.classList.add("loaded"))}),window.groupRecipeCards&&requestAnimationFrame(()=>window.groupRecipeCards()),window.refreshServiceFilter&&window.refreshServiceFilter()}function o(d,t,e=null){const i=document.getElementById("dot-"+d+"-grid"),n=document.getElementById("badge-"+d),r=document.getElementById("time-"+d),f=document.querySelector(`[data-app="${d}"]`);i&&(i.classList.toggle("ok",t),i.classList.toggle("bad",!t)),n&&(n.textContent=c(t),n.classList.toggle("on",t),n.classList.toggle("off",!t)),r&&e!==null&&(r.textContent=t?`${e}ms`:"timeout",r.className=`response-time ${m(e,t)}`),f&&f.setAttribute("data-status",t?"on":"off")}async function g(){if(window._dcAuthLost)return;if(b)return y=!0,b;function d(i,n=new Date){const r=document.getElementById("stamp");r&&(r.textContent=`${i}: ${new Date(n).toLocaleTimeString()}`)}function t(i){Object.keys(SITE.dnsServers).forEach(r=>{const f=i[r];f&&s(r,f.isUp,f.responseTime)}),i.internet&&s("internet",i.internet.isUp,i.internet.responseTime),window.APPS.forEach(r=>{const f=i[r.id];f&&o(r.id,f.isUp,f.responseTime)})}async function e(){const i=Object.keys(SITE.dnsServers),n=i.map(w=>h(w));n.push(h("internet"));const r=await Promise.all(n);i.forEach((w,I)=>s(w,r[I].isUp,r[I].responseTime));const f=r[r.length-1];s("internet",f.isUp,f.responseTime),(await Promise.all(window.APPS.map(async w=>{const I=await h(w.id);return{id:w.id,...I}}))).forEach(w=>{o(w.id,w.isUp,w.responseTime)})}return b=(async()=>{try{const i=await fetch("/api/v1/services/status",{cache:"no-store"});if(i.status===401||i.status===403){window._dcAuthLost=!0,window._sseReconnect&&window._sseClose&&window._sseClose(),d("auth required");return}if(!i.ok)throw new Error(`Status refresh failed (${i.status})`);window._dcAuthLost=!1;const n=await i.json();t(n.statuses||{}),d("last check",n.checkedAt||new Date)}catch(i){console.warn("Batched status refresh failed, falling back to direct probes:",i);try{await e(),d("last check")}catch(n){console.error("Dashboard refresh failed:",n),d("last failed")}}finally{b=null,y&&!window._dcAuthLost?(y=!1,setTimeout(()=>{window.refreshAll()},0)):y=!1}})(),b}document.querySelector(".top")?.addEventListener("click",d=>{const t=d.target.closest('[id$="-open"]');if(!t)return;const e=t.id.replace("-open","");SITE.dnsServers[e]&&window.open(u(e),"_blank","noopener")}),document.getElementById("ca-open")?.addEventListener("click",()=>window.open(u("ca"),"_blank","noopener")),document.getElementById("creds-btn-ca")?.addEventListener("click",d=>{d.stopPropagation();const t=window.APPS.find(e=>e.id==="ca");t&&window.openServiceCredsModal&&window.openServiceCredsModal(t)}),document.getElementById("options-btn-ca")?.addEventListener("click",d=>{d.stopPropagation();const t=window.APPS.find(e=>e.id==="ca");t&&window.openServiceEditModal&&window.openServiceEditModal(t)}),document.getElementById("delete-btn-ca")?.addEventListener("click",d=>{d.stopPropagation(),window.deleteService&&window.deleteService("ca","DashCA")}),window.loadServices=v,window.buildGrid=a,window.refreshAll=g,window.setQuick=s,window.setBadge=o,window.getResponseTimeClass=m,window.checkServiceWithTiming=h,window.serviceUrl=u,window.el=l})(),(function(){async function c(u){const a=await(await secureFetch(`/api/v1/dns/restart/${u}`,{method:"POST"})).json();if(!a.success)throw new Error(a.error||"Restart failed");return a}document.querySelector(".top")?.addEventListener("click",async u=>{const l=u.target.closest('[id$="-restart"]');if(!l)return;const a=l.id.replace("-restart","");if(SITE.dnsServers[a]&&confirm(`Restart ${a.toUpperCase()} service?`))try{await withButton(l,"...",()=>c(a)),setTimeout(window.refreshAll,DC.DELAYS.RELOAD)}catch(o){showNotification("Restart failed: "+o.message,"error")}});async function s(u,l){const a=document.getElementById(`${u}-update`),o=a?.textContent||"\u2B06\uFE0F";try{a.textContent="\u{1F50D}",a.disabled=!0,a.title="Checking for updates...";const d=await(await fetch(`/api/v1/dns/check-update?server=${encodeURIComponent(l)}`)).json();if(!d.success)throw new Error(d.error||"Failed to check for updates");if(!d.updateAvailable){a.textContent="\u2705",a.title=`Already on latest version (${d.currentVersion})`,showNotification(`${u.toUpperCase()} is already up to date! Current version: ${d.currentVersion}`,"info"),setTimeout(()=>{a.textContent=o,a.disabled=!1,a.title="Update DNS server"},3e3);return}if(!confirm(`Update available for ${u.toUpperCase()}! -Current: ${i.currentVersion} -New: ${i.updateVersion} +Current: ${d.currentVersion} +New: ${d.updateVersion} -`+(i.updateTitle?`${i.updateTitle} +`+(d.updateTitle?`${d.updateTitle} `:"")+`The DNS server will restart during the update. -Proceed?`)){d.textContent=o,d.disabled=!1,d.title="Update DNS server";return}d.textContent="\u{1F504}",d.title="Updating...";const s=await(await secureFetch(`/api/v1/dns/update?server=${encodeURIComponent(p)}`,{method:"POST"})).json();if(!s.success)throw new Error(s.error||"Update failed");if(s.manualUpdateRequired){d.textContent="\u2B06\uFE0F",d.title=`Update available: ${s.newVersion}`;const n=s.downloadLink?` -Download: ${s.downloadLink}`:"",r=s.instructionsLink?` -Instructions: ${s.instructionsLink}`:"";showNotification(`${c.toUpperCase()} update requires manual installation. Current: ${s.previousVersion} \u2192 ${s.newVersion}. Please update manually on the host machine.`,"warning",8e3),d.disabled=!1;return}d.textContent="\u2705",d.title="Updated successfully!",showNotification(`${c.toUpperCase()} updated successfully! ${s.previousVersion} \u2192 ${s.newVersion}. Server is restarting...`,"success"),setTimeout(()=>{d.textContent=o,d.disabled=!1,d.title="Update DNS server",window.refreshAll()},1e4)}catch(v){console.error("DNS update error:",v),d.textContent="\u274C",d.title="Update failed",showNotification(`Failed to update ${c.toUpperCase()}: ${v.message}`,"error"),setTimeout(()=>{d.textContent=o,d.disabled=!1,d.title="Update DNS server"},3e3)}}document.querySelector(".top")?.addEventListener("click",c=>{const p=c.target.closest('[id$="-update"]');if(!p)return;const d=p.id.replace("-update","");SITE.dnsServers[d]&&a(d,SITE.dnsServers[d]?.ip)}),injectModal("dns-settings-modal",` +Proceed?`)){a.textContent=o,a.disabled=!1,a.title="Update DNS server";return}a.textContent="\u{1F504}",a.title="Updating...";const i=await(await secureFetch(`/api/v1/dns/update?server=${encodeURIComponent(l)}`,{method:"POST"})).json();if(!i.success)throw new Error(i.error||"Update failed");if(i.manualUpdateRequired){a.textContent="\u2B06\uFE0F",a.title=`Update available: ${i.newVersion}`;const n=i.downloadLink?` +Download: ${i.downloadLink}`:"",r=i.instructionsLink?` +Instructions: ${i.instructionsLink}`:"";showNotification(`${u.toUpperCase()} update requires manual installation. Current: ${i.previousVersion} \u2192 ${i.newVersion}. Please update manually on the host machine.`,"warning",8e3),a.disabled=!1;return}a.textContent="\u2705",a.title="Updated successfully!",showNotification(`${u.toUpperCase()} updated successfully! ${i.previousVersion} \u2192 ${i.newVersion}. Server is restarting...`,"success"),setTimeout(()=>{a.textContent=o,a.disabled=!1,a.title="Update DNS server",window.refreshAll()},1e4)}catch(g){console.error("DNS update error:",g),a.textContent="\u274C",a.title="Update failed",showNotification(`Failed to update ${u.toUpperCase()}: ${g.message}`,"error"),setTimeout(()=>{a.textContent=o,a.disabled=!1,a.title="Update DNS server"},3e3)}}document.querySelector(".top")?.addEventListener("click",u=>{const l=u.target.closest('[id$="-update"]');if(!l)return;const a=l.id.replace("-update","");SITE.dnsServers[a]&&s(a,SITE.dnsServers[a]?.ip)}),injectModal("dns-settings-modal",`

DNS Settings

@@ -366,7 +366,7 @@ Instructions: ${s.instructionsLink}`:"";showNotification(`${c.toUpperCase()} upd
- `);let f=null;function b(c){f=c;const p=SITE.dnsServers[c]||{},d=document.getElementById("dns-settings-modal");document.getElementById("dns-settings-title").textContent=`${(p.name||c).toUpperCase()} Settings`,document.getElementById("dns-edit-ip").value=p.ip||"",document.getElementById("dns-edit-port").value=p.port||DC.DEFAULTS.DNS_PORT,document.getElementById("dns-edit-name").value=p.name||"",d.classList.add("show")}async function h(){if(!f)return;const c=document.getElementById("dns-edit-ip").value.trim(),p=document.getElementById("dns-edit-port").value.trim()||DC.DEFAULTS.DNS_PORT,d=document.getElementById("dns-edit-name").value.trim();if(!c){showNotification("Server IP is required","warning");return}const o={dnsServers:{}};o.dnsServers[f]={ip:c,port:String(p)},d&&(o.dnsServers[f].name=d);try{const i=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})).json();i.success?(SITE.dnsServers[f]=o.dnsServers[f],showNotification(`${f.toUpperCase()} settings saved`,"success"),y(),window.refreshAll()):showNotification(i.error||"Failed to save settings","error")}catch(v){showNotification("Failed to save: "+v.message,"error")}}async function u(){if(f&&confirm(`Remove ${f.toUpperCase()} from dashboard? This won't affect the actual DNS server.`))try{const p=await(await secureFetch("/api/v1/config")).json();p.dnsServers&&delete p.dnsServers[f];const o=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dnsServers:p.dnsServers||{}})})).json();if(o.success){delete SITE.dnsServers[f];const v=document.querySelector(`.top [data-app="${f}"]`);v&&v.remove(),showNotification(`${f.toUpperCase()} removed from dashboard`,"success"),y()}else showNotification(o.error||"Failed to remove","error")}catch(c){showNotification("Failed to remove: "+c.message,"error")}}function y(){closeModal("dns-settings-modal"),f=null}document.getElementById("dns-settings-cancel")?.addEventListener("click",y),document.getElementById("dns-settings-save")?.addEventListener("click",h),document.getElementById("dns-settings-delete")?.addEventListener("click",u),document.getElementById("dns-settings-modal")?.addEventListener("click",c=>{c.target.id==="dns-settings-modal"&&y()}),document.querySelector(".top")?.addEventListener("click",c=>{const p=c.target.closest('[id$="-settings"]');if(!p)return;const d=p.id.replace("-settings","");SITE.dnsServers[d]&&(c.stopPropagation(),b(d))}),document.getElementById("refresh")?.addEventListener("click",window.refreshAll)})(),(function(){injectModal("logs-modal",` + `);let m=null;function h(u){m=u;const l=SITE.dnsServers[u]||{},a=document.getElementById("dns-settings-modal");document.getElementById("dns-settings-title").textContent=`${(l.name||u).toUpperCase()} Settings`,document.getElementById("dns-edit-ip").value=l.ip||"",document.getElementById("dns-edit-port").value=l.port||DC.DEFAULTS.DNS_PORT,document.getElementById("dns-edit-name").value=l.name||"",a.classList.add("show")}async function b(){if(!m)return;const u=document.getElementById("dns-edit-ip").value.trim(),l=document.getElementById("dns-edit-port").value.trim()||DC.DEFAULTS.DNS_PORT,a=document.getElementById("dns-edit-name").value.trim();if(!u){showNotification("Server IP is required","warning");return}const o={dnsServers:{}};o.dnsServers[m]={ip:u,port:String(l)},a&&(o.dnsServers[m].name=a);try{const d=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})).json();d.success?(SITE.dnsServers[m]=o.dnsServers[m],showNotification(`${m.toUpperCase()} settings saved`,"success"),v(),window.refreshAll()):showNotification(d.error||"Failed to save settings","error")}catch(g){showNotification("Failed to save: "+g.message,"error")}}async function y(){if(m&&confirm(`Remove ${m.toUpperCase()} from dashboard? This won't affect the actual DNS server.`))try{const l=await(await secureFetch("/api/v1/config")).json();l.dnsServers&&delete l.dnsServers[m];const o=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dnsServers:l.dnsServers||{}})})).json();if(o.success){delete SITE.dnsServers[m];const g=document.querySelector(`.top [data-app="${m}"]`);g&&g.remove(),showNotification(`${m.toUpperCase()} removed from dashboard`,"success"),v()}else showNotification(o.error||"Failed to remove","error")}catch(u){showNotification("Failed to remove: "+u.message,"error")}}function v(){closeModal("dns-settings-modal"),m=null}document.getElementById("dns-settings-cancel")?.addEventListener("click",v),document.getElementById("dns-settings-save")?.addEventListener("click",b),document.getElementById("dns-settings-delete")?.addEventListener("click",y),document.getElementById("dns-settings-modal")?.addEventListener("click",u=>{u.target.id==="dns-settings-modal"&&v()}),document.querySelector(".top")?.addEventListener("click",u=>{const l=u.target.closest('[id$="-settings"]');if(!l)return;const a=l.id.replace("-settings","");SITE.dnsServers[a]&&(u.stopPropagation(),h(a))}),document.getElementById("refresh")?.addEventListener("click",window.refreshAll)})(),(function(){injectModal("logs-modal",`
@@ -390,66 +390,66 @@ Instructions: ${s.instructionsLink}`:"";showNotification(`${c.toUpperCase()} upd
- `);let l=null,a=null,f=!1,b=null,h=null,u=!1,y=null,c=null,p=!1,d=null,o=!1;async function v(E,w=25){try{const S=getDnsServerAddr(E),T=await fetch(`/api/v1/dns/logs?server=${S}&limit=${w}`,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(T.ok){const k=await T.json();return k.success&&k.logs?{logs:k.logs,count:k.count,server:k.server}:{error:k.error||"Failed to fetch logs"}}else return T.status===401?{error:"DNS auto-auth failed - check credentials in settings"}:{error:`HTTP ${T.status}`}}catch(S){return console.error("DNS logs fetch failed:",S),{error:S.message}}}function i(E){return{NoError:"var(--ok-fg)",NOERROR:"var(--ok-fg)",NxDomain:"var(--muted)",NXDOMAIN:"var(--muted)",Refused:"var(--bad-fg)",REFUSED:"var(--bad-fg)",ServerFailure:"#f39c12",SERVFAIL:"#f39c12"}[E]||"var(--fg)"}function t(E){const w=document.createElement("div");if(w.className="log-entry",w.style.cssText="display: grid; grid-template-columns: 140px 110px 1fr 70px 80px; gap: 8px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: center;",E.parsed===!1)return w.style.gridTemplateColumns="1fr",w.innerHTML=`${escapeHtml(E.raw)}`,w;const S=i(E.rcode),T=E.rcode==="Refused"||E.rcode==="REFUSED";return w.innerHTML=` + `);let c=null,s=null,m=!1,h=null,b=null,y=!1,v=null,u=null,l=!1,a=null,o=!1;async function g(E,x=25){try{const S=getDnsServerAddr(E),T=await fetch(`/api/v1/dns/logs?server=${S}&limit=${x}`,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(T.ok){const k=await T.json();return k.success&&k.logs?{logs:k.logs,count:k.count,server:k.server}:{error:k.error||"Failed to fetch logs"}}else return T.status===401?{error:"DNS auto-auth failed - check credentials in settings"}:{error:`HTTP ${T.status}`}}catch(S){return console.error("DNS logs fetch failed:",S),{error:S.message}}}function d(E){return{NoError:"var(--ok-fg)",NOERROR:"var(--ok-fg)",NxDomain:"var(--muted)",NXDOMAIN:"var(--muted)",Refused:"var(--bad-fg)",REFUSED:"var(--bad-fg)",ServerFailure:"#f39c12",SERVFAIL:"#f39c12"}[E]||"var(--fg)"}function t(E){const x=document.createElement("div");if(x.className="log-entry",x.style.cssText="display: grid; grid-template-columns: 140px 110px 1fr 70px 80px; gap: 8px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: center;",E.parsed===!1)return x.style.gridTemplateColumns="1fr",x.innerHTML=`${escapeHtml(E.raw)}`,x;const S=d(E.rcode),T=E.rcode==="Refused"||E.rcode==="REFUSED";return x.innerHTML=` ${escapeHtml(E.timestamp)} ${escapeHtml(E.client)} ${escapeHtml(E.domain)} ${escapeHtml(E.type)} ${escapeHtml(E.rcode)} - `,w}async function e(){if(p){await B();return}if(u){await I();return}if(f||!l)return;const E=parseInt(document.getElementById("log-lines").value),w=document.getElementById("logs-content");try{const S=await v(l,E);if(S.error){w.innerHTML=` + `,x}async function e(){if(l){await B();return}if(y){await I();return}if(m||!c)return;const E=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const S=await g(c,E);if(S.error){x.innerHTML=`
\u26A0\uFE0F Error
${escapeHtml(S.error)}
-
`;return}w.innerHTML=` + `;return}x.innerHTML=`
Time Client Domain Type Status -
`,S.logs&&S.logs.length>0?S.logs.forEach(T=>{const k=t(T);w.appendChild(k)}):w.innerHTML+=` + `,S.logs&&S.logs.length>0?S.logs.forEach(T=>{const k=t(T);x.appendChild(k)}):x.innerHTML+=`
No DNS queries logged yet -
`}catch(S){w.innerHTML=` + `}catch(S){x.innerHTML=`
Failed to fetch logs: ${escapeHtml(S.message)} -
`}}function s(E){l=E,f=!1,u=!1;const w=document.getElementById("logs-modal"),S=document.getElementById("logs-title"),T=document.getElementById("logs-pause"),k=document.getElementById("logs-stream");S.textContent=`${E.toUpperCase()} DNS Logs`,T.textContent="\u23F8\uFE0F Pause",T.classList.remove("paused"),k&&(k.style.display="none"),w.classList.add("show"),e(),a=setInterval(e,DC.POLL.LOGS)}function n(){document.getElementById("logs-modal").classList.remove("show"),a&&(clearInterval(a),a=null),g(),l=null,u=!1,b=null,h=null,p=!1,y=null,c=null,f=!1}function r(E){d&&g();const w=document.getElementById("logs-stream"),S=document.getElementById("logs-pause"),T=document.getElementById("logs-content");a&&(clearInterval(a),a=null);try{d=new EventSource(`/api/v1/logs/stream/${E}`),o=!0,w.classList.add("active"),w.textContent="\u{1F534} Live",w.title="Streaming - click to stop",S.style.display="none";const k=document.getElementById("logs-title");k.textContent.includes("\u{1F534}")||(k.innerHTML=k.textContent.replace("\u{1F4CB}","\u{1F4CB} \u{1F534}")),d.onmessage=A=>{try{const D=JSON.parse(A.data);if(D.error){console.error("Stream error:",D.error),g();return}const O=document.createElement("div");O.className="log-entry",O.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const U=(D.stream||"stdout")==="stderr",N=U?"var(--bad-fg)":"var(--fg)",M=`${U?"STDERR":"STDOUT"}`;for(O.innerHTML=` + `}}function i(E){c=E,m=!1,y=!1;const x=document.getElementById("logs-modal"),S=document.getElementById("logs-title"),T=document.getElementById("logs-pause"),k=document.getElementById("logs-stream");S.textContent=`${E.toUpperCase()} DNS Logs`,T.textContent="\u23F8\uFE0F Pause",T.classList.remove("paused"),k&&(k.style.display="none"),x.classList.add("show"),e(),s=setInterval(e,DC.POLL.LOGS)}function n(){document.getElementById("logs-modal").classList.remove("show"),s&&(clearInterval(s),s=null),f(),c=null,y=!1,h=null,b=null,l=!1,v=null,u=null,m=!1}function r(E){a&&f();const x=document.getElementById("logs-stream"),S=document.getElementById("logs-pause"),T=document.getElementById("logs-content");s&&(clearInterval(s),s=null);try{a=new EventSource(`/api/v1/logs/stream/${E}`),o=!0,x.classList.add("active"),x.textContent="\u{1F534} Live",x.title="Streaming - click to stop",S.style.display="none";const k=document.getElementById("logs-title");k.textContent.includes("\u{1F534}")||(k.innerHTML=k.textContent.replace("\u{1F4CB}","\u{1F4CB} \u{1F534}")),a.onmessage=A=>{try{const D=JSON.parse(A.data);if(D.error){console.error("Stream error:",D.error),f();return}const O=document.createElement("div");O.className="log-entry",O.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const _=(D.stream||"stdout")==="stderr",N=_?"var(--bad-fg)":"var(--fg)",M=`${_?"STDERR":"STDOUT"}`;for(O.innerHTML=`
${M}
${escapeHtml(D.text)}
- `,T.appendChild(O),T.scrollTop=T.scrollHeight;T.children.length>500;)T.removeChild(T.firstChild)}catch(D){console.error("Error parsing stream data:",D)}},d.onerror=A=>{console.error("EventSource error:",A),g()}}catch(k){console.error("Failed to start streaming:",k),g()}}function g(){d&&(d.close(),d=null),o=!1;const E=document.getElementById("logs-stream"),w=document.getElementById("logs-pause"),S=document.getElementById("logs-title");E&&(E.classList.remove("active"),E.textContent="\u{1F4E1} Live",E.title="Enable real-time streaming"),w&&(w.style.display=""),S&&(S.textContent=S.textContent.replace(" \u{1F534}","")),u&&b&&!a&&(a=setInterval(I,DC.POLL.LOGS))}async function m(E,w=100){try{const S=`/api/v1/logs/container/${E}?tail=${w}×tamps=true`,T=await fetch(S,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(T.ok){const k=await T.json();return k.success&&k.logs?{logs:k.logs,count:k.count,containerName:k.containerName,containerId:k.containerId}:{error:k.error||"Failed to fetch container logs"}}else return{error:`HTTP ${T.status}: ${T.statusText}`}}catch(S){return console.error("Container logs fetch failed:",S),{error:S.message}}}function x(E){const w=document.createElement("div");w.className="log-entry",w.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const S=E.stream==="stderr"?"var(--bad-fg)":"var(--fg)",T=E.stream==="stderr"?'STDERR':'STDOUT';return w.innerHTML=` + `,T.appendChild(O),T.scrollTop=T.scrollHeight;T.children.length>500;)T.removeChild(T.firstChild)}catch(D){console.error("Error parsing stream data:",D)}},a.onerror=A=>{console.error("EventSource error:",A),f()}}catch(k){console.error("Failed to start streaming:",k),f()}}function f(){a&&(a.close(),a=null),o=!1;const E=document.getElementById("logs-stream"),x=document.getElementById("logs-pause"),S=document.getElementById("logs-title");E&&(E.classList.remove("active"),E.textContent="\u{1F4E1} Live",E.title="Enable real-time streaming"),x&&(x.style.display=""),S&&(S.textContent=S.textContent.replace(" \u{1F534}","")),y&&h&&!s&&(s=setInterval(I,DC.POLL.LOGS))}async function p(E,x=100){try{const S=`/api/v1/logs/container/${E}?tail=${x}×tamps=true`,T=await fetch(S,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(T.ok){const k=await T.json();return k.success&&k.logs?{logs:k.logs,count:k.count,containerName:k.containerName,containerId:k.containerId}:{error:k.error||"Failed to fetch container logs"}}else return{error:`HTTP ${T.status}: ${T.statusText}`}}catch(S){return console.error("Container logs fetch failed:",S),{error:S.message}}}function w(E){const x=document.createElement("div");x.className="log-entry",x.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const S=E.stream==="stderr"?"var(--bad-fg)":"var(--fg)",T=E.stream==="stderr"?'STDERR':'STDOUT';return x.innerHTML=`
${T}
${escapeHtml(E.text)}
- `,w}async function I(){if(f||!b||!u)return;const E=parseInt(document.getElementById("log-lines").value),w=document.getElementById("logs-content");try{const S=await m(b,E);if(S.error){w.innerHTML=` + `,x}async function I(){if(m||!h||!y)return;const E=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const S=await p(h,E);if(S.error){x.innerHTML=`
\u26A0\uFE0F Error
${escapeHtml(S.error)}
-
`;return}w.innerHTML=` + `;return}x.innerHTML=`
Stream Log Output -
`,S.logs&&S.logs.length>0?(S.logs.forEach(T=>{const k=x(T);w.appendChild(k)}),w.scrollTop=w.scrollHeight):w.innerHTML+=` + `,S.logs&&S.logs.length>0?(S.logs.forEach(T=>{const k=w(T);x.appendChild(k)}),x.scrollTop=x.scrollHeight):x.innerHTML+=`
No logs available for this container -
`}catch(S){w.innerHTML=` + `}catch(S){x.innerHTML=`
Failed to fetch logs: ${escapeHtml(S.message)} -
`}}function L(E,w){b=E,h=w,u=!0,p=!1,f=!1,g();const S=document.getElementById("logs-modal"),T=document.getElementById("logs-title"),k=document.getElementById("logs-pause"),A=document.getElementById("logs-stream");T.textContent=`\u{1F4CB} ${w} - Container Logs`,k.textContent="\u23F8\uFE0F Pause",k.classList.remove("paused"),A&&(A.style.display=""),S.classList.add("show"),I(),a=setInterval(I,DC.POLL.LOGS)}async function P(E,w=100){try{const S=`/api/v1/logs/file?path=${encodeURIComponent(E)}&tail=${w}`,T=await fetch(S,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(T.ok){const k=await T.json();return k.success&&k.logs?{logs:k.logs,count:k.count,logPath:k.logPath,totalLines:k.totalLines}:{error:k.error||"Failed to fetch file logs"}}else return{error:(await T.json().catch(()=>({}))).error||`HTTP ${T.status}`}}catch(S){return console.error("File logs fetch failed:",S),{error:S.message}}}function C(E){const w=document.createElement("div");w.className="log-entry",w.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const S=E.text;let T="INFO",k="var(--fg)";S.match(/ERROR|FATAL|CRITICAL/i)?(T="ERROR",k="var(--bad-fg)"):S.match(/WARN|WARNING/i)?(T="WARN",k="#f39c12"):S.match(/DEBUG/i)&&(T="DEBUG",k="var(--muted)");const D=`${T}`;return w.innerHTML=` + `}}function L(E,x){h=E,b=x,y=!0,l=!1,m=!1,f();const S=document.getElementById("logs-modal"),T=document.getElementById("logs-title"),k=document.getElementById("logs-pause"),A=document.getElementById("logs-stream");T.textContent=`\u{1F4CB} ${x} - Container Logs`,k.textContent="\u23F8\uFE0F Pause",k.classList.remove("paused"),A&&(A.style.display=""),S.classList.add("show"),I(),s=setInterval(I,DC.POLL.LOGS)}async function P(E,x=100){try{const S=`/api/v1/logs/file?path=${encodeURIComponent(E)}&tail=${x}`,T=await fetch(S,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(T.ok){const k=await T.json();return k.success&&k.logs?{logs:k.logs,count:k.count,logPath:k.logPath,totalLines:k.totalLines}:{error:k.error||"Failed to fetch file logs"}}else return{error:(await T.json().catch(()=>({}))).error||`HTTP ${T.status}`}}catch(S){return console.error("File logs fetch failed:",S),{error:S.message}}}function C(E){const x=document.createElement("div");x.className="log-entry",x.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const S=E.text;let T="INFO",k="var(--fg)";S.match(/ERROR|FATAL|CRITICAL/i)?(T="ERROR",k="var(--bad-fg)"):S.match(/WARN|WARNING/i)?(T="WARN",k="#f39c12"):S.match(/DEBUG/i)&&(T="DEBUG",k="var(--muted)");const D=`${T}`;return x.innerHTML=`
${D}
${escapeHtml(S)}
- `,w}async function B(){if(f||!y||!p)return;const E=parseInt(document.getElementById("log-lines").value),w=document.getElementById("logs-content");try{const S=await P(y,E);if(S.error){w.innerHTML=` + `,x}async function B(){if(m||!v||!l)return;const E=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const S=await P(v,E);if(S.error){x.innerHTML=`
\u26A0\uFE0F Error
${escapeHtml(S.error)}
-
`;return}w.innerHTML=` + `;return}x.innerHTML=`
Log Output (${S.count} of ${S.totalLines} lines) -
`,S.logs&&S.logs.length>0?(S.logs.forEach(T=>{const k=C(T);w.appendChild(k)}),w.scrollTop=w.scrollHeight):w.innerHTML+=` + `,S.logs&&S.logs.length>0?(S.logs.forEach(T=>{const k=C(T);x.appendChild(k)}),x.scrollTop=x.scrollHeight):x.innerHTML+=`
No logs available in this file -
`}catch(S){w.innerHTML=` + `}catch(S){x.innerHTML=`
Failed to fetch logs: ${escapeHtml(S.message)} -
`}}function $(E,w){y=E,c=w,p=!0,u=!1,f=!1;const S=document.getElementById("logs-modal"),T=document.getElementById("logs-title"),k=document.getElementById("logs-pause"),A=document.getElementById("logs-stream");T.textContent=`\u{1F4CB} ${w} - Application Logs`,k.textContent="\u23F8\uFE0F Pause",k.classList.remove("paused"),A&&(A.style.display="none"),S.classList.add("show"),B(),a=setInterval(B,DC.POLL.LOGS)}document.querySelector(".top")?.addEventListener("click",E=>{const w=E.target.closest('[id$="-logs"]');if(!w)return;const S=w.id.replace("-logs","");SITE.dnsServers[S]&&s(S)}),document.getElementById("logs-close")?.addEventListener("click",n),document.getElementById("logs-pause")?.addEventListener("click",()=>{f=!f;const E=document.getElementById("logs-pause");f?(E.textContent="\u25B6\uFE0F Resume",E.classList.add("paused")):(E.textContent="\u23F8\uFE0F Pause",E.classList.remove("paused"),e())}),document.getElementById("log-lines")?.addEventListener("change",()=>{f||e()}),document.getElementById("logs-stream")?.addEventListener("click",()=>{!u||!b||(o?g():r(b))}),document.getElementById("logs-modal")?.addEventListener("click",E=>{E.target.id==="logs-modal"&&n()}),document.addEventListener("keydown",E=>{E.key==="Escape"&&document.getElementById("logs-modal")?.classList.contains("show")&&n()}),window.openContainerLogsModal=L,window.openFileLogsModal=$,window.openLogsModal=s})(),(function(){injectModal("service-edit-modal",` + `}}function $(E,x){v=E,u=x,l=!0,y=!1,m=!1;const S=document.getElementById("logs-modal"),T=document.getElementById("logs-title"),k=document.getElementById("logs-pause"),A=document.getElementById("logs-stream");T.textContent=`\u{1F4CB} ${x} - Application Logs`,k.textContent="\u23F8\uFE0F Pause",k.classList.remove("paused"),A&&(A.style.display="none"),S.classList.add("show"),B(),s=setInterval(B,DC.POLL.LOGS)}document.querySelector(".top")?.addEventListener("click",E=>{const x=E.target.closest('[id$="-logs"]');if(!x)return;const S=x.id.replace("-logs","");SITE.dnsServers[S]&&i(S)}),document.getElementById("logs-close")?.addEventListener("click",n),document.getElementById("logs-pause")?.addEventListener("click",()=>{m=!m;const E=document.getElementById("logs-pause");m?(E.textContent="\u25B6\uFE0F Resume",E.classList.add("paused")):(E.textContent="\u23F8\uFE0F Pause",E.classList.remove("paused"),e())}),document.getElementById("log-lines")?.addEventListener("change",()=>{m||e()}),document.getElementById("logs-stream")?.addEventListener("click",()=>{!y||!h||(o?f():r(h))}),document.getElementById("logs-modal")?.addEventListener("click",E=>{E.target.id==="logs-modal"&&n()}),document.addEventListener("keydown",E=>{E.key==="Escape"&&document.getElementById("logs-modal")?.classList.contains("show")&&n()}),window.openContainerLogsModal=L,window.openFileLogsModal=$,window.openLogsModal=i})(),(function(){injectModal("service-edit-modal",`

Edit Service

@@ -805,45 +805,45 @@ Instructions: ${s.instructionsLink}`:"";showNotification(`${c.toUpperCase()} upd
- `)})(),(function(){async function l(u){try{const y=await fetch(`/api/v1/caddy/cas?caddyfilePath=${encodeURIComponent(u)}`);if(!y.ok)throw new Error(`Failed to load CAs: ${y.status}`);const c=await y.json();if(c.success){const p=document.getElementById("existing-ca-select");return p.innerHTML="",c.cas.length===0?p.innerHTML='':(p.innerHTML='',c.cas.forEach(d=>{const o=document.createElement("option");typeof d=="object"?(o.value=d.id,o.textContent=d.displayName||d.name):(o.value=d,o.textContent=d),p.appendChild(o)})),c.data.cas}else throw new Error(c.message)}catch(y){console.error("Error loading CAs:",y);const c=document.getElementById("existing-ca-select");return c.innerHTML='',[]}}function a(u){const{subdomain:y,port:c,ip:p,sslType:d,caName:o,existingCa:v,enableAuth:i,enableCors:t,customHeaders:e,upstreamPath:s,healthCheck:n,timeout:r,tailscaleOnly:g}=u;let m=`${buildDomain(y)} { -`;switch(g&&(m+=` @blocked not remote_ip 100.64.0.0/10 -`,m+=` respond @blocked "Access denied. Tailscale connection required." 403 -`),d){case"letsencrypt":break;case"caddy-managed":m+=` tls internal -`;break;case"existing-ca":v&&(m+=` tls { - ca ${v} + `)})(),(function(){async function c(y){try{const v=await fetch(`/api/v1/caddy/cas?caddyfilePath=${encodeURIComponent(y)}`);if(!v.ok)throw new Error(`Failed to load CAs: ${v.status}`);const u=await v.json();if(u.success){const l=document.getElementById("existing-ca-select");return l.innerHTML="",u.cas.length===0?l.innerHTML='':(l.innerHTML='',u.cas.forEach(a=>{const o=document.createElement("option");typeof a=="object"?(o.value=a.id,o.textContent=a.displayName||a.name):(o.value=a,o.textContent=a),l.appendChild(o)})),u.data.cas}else throw new Error(u.message)}catch(v){console.error("Error loading CAs:",v);const u=document.getElementById("existing-ca-select");return u.innerHTML='',[]}}function s(y){const{subdomain:v,port:u,ip:l,sslType:a,caName:o,existingCa:g,enableAuth:d,enableCors:t,customHeaders:e,upstreamPath:i,healthCheck:n,timeout:r,tailscaleOnly:f}=y;let p=`${buildDomain(v)} { +`;switch(f&&(p+=` @blocked not remote_ip 100.64.0.0/10 +`,p+=` respond @blocked "Access denied. Tailscale connection required." 403 +`),a){case"letsencrypt":break;case"caddy-managed":p+=` tls internal +`;break;case"existing-ca":g&&(p+=` tls { + ca ${g} } -`);break;case"custom-ca":o&&(m+=` tls { +`);break;case"custom-ca":o&&(p+=` tls { ca ${o} } -`);break}if(i&&(m+=` basicauth { +`);break}if(d&&(p+=` basicauth { admin $2a$14$hashed_password_here } -`),t&&(m+=` header { -`,m+=` Access-Control-Allow-Origin "*" -`,m+=` Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" -`,m+=` Access-Control-Allow-Headers "Content-Type, Authorization" -`,m+=` } -`),e)try{const x=JSON.parse(e);m+=` header { -`,Object.entries(x).forEach(([I,L])=>{m+=` ${I} "${L}" -`}),m+=` } -`}catch{console.warn("Invalid JSON in custom headers")}return n&&(m+=` health_uri ${n} -`),m+=` reverse_proxy ${p}:${c} { -`,s&&s!=="/"&&(m+=` rewrite ${s} -`),r&&r!==30&&(m+=` transport http { -`,m+=` dial_timeout ${r}s -`,m+=` response_header_timeout ${r}s -`,m+=` } -`),m+=` } -`,m+=`} -`,m}async function f(u,y,c=DC.DEFAULTS.TTL){const p=window.getToken(getPrimaryDnsId(),"admin");if(!p)throw new Error("DNS admin token not configured. Please set it in the Tokens menu.");const d=buildDomain(u),o=await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:d,ip:y,ttl:c,token:p,server:SITE.dnsIp})});if(!o.ok){const i=await o.text();throw new Error(`DNS API Error: ${o.status} - ${i}`)}const v=await o.json();if(!v.success)throw new Error(`DNS Error: ${v.error||"Unknown error"}`);return v}async function b(u){const y={id:u.subdomain,name:u.name,logo:u.logo||`/assets/${u.subdomain}.png`};u.category&&(y.category=u.category),u.containerId&&(y.containerId=u.containerId);try{const c=await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(y)});if(!c.ok){const p=await c.json();throw new Error(p.error||"Failed to save service")}return await window.loadServices(),window.buildGrid(),y}catch(c){throw console.error("Failed to add service to config:",c),c}}async function h(u){const y=document.getElementById("service-subdomain-input").value.trim(),c=document.getElementById("service-ip-input").value.trim()||"localhost",p=document.getElementById("service-port-input").value.trim()||"80",d=await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(y),upstream:`${c}:${p}`,config:u})}),o=await d.json();if(!d.ok||!o.success)throw new Error(o.error||`Caddy API Error: ${d.status}`);return o}window.loadExistingCAs=l,window.generateCaddyConfig=a,window.createDnsRecord=f,window.addServiceToConfig=b,window.addToCaddyfile=h})(),(function(){let l=null;function a(c){l=c;const p=document.getElementById("service-edit-modal");document.getElementById("service-edit-title").textContent=`Edit ${c.name}`,document.getElementById("edit-service-name").value=c.name,document.getElementById("edit-service-url-display").textContent=c.url||buildServiceUrl(c.id),document.getElementById("edit-service-logo-preview").src=c.logo||`/assets/${c.id}.png`,document.getElementById("edit-subdomain").value=c.id,document.getElementById("edit-port").value=c.port||"",document.getElementById("edit-ip").value=c.ip||"localhost",document.getElementById("edit-tailscale-only").checked=c.tailscaleOnly||!1,document.getElementById("edit-logo-url").value=c.logo||"";const d=document.getElementById("edit-service-category");d&&(d.dataset.current=c.category||"",typeof window.populateCategorySelects=="function"&&window.populateCategorySelects()),p.classList.add("show")}function f(){closeModal("service-edit-modal"),l=null}async function b(){if(!l)return;const c=document.getElementById("edit-subdomain").value.trim().toLowerCase(),p=document.getElementById("edit-service-name").value.trim(),d=document.getElementById("edit-port").value.trim(),o=document.getElementById("edit-ip").value.trim()||"localhost",v=document.getElementById("edit-tailscale-only").checked,i=document.getElementById("edit-logo-url").value.trim(),t=document.getElementById("edit-service-category")?.value||"";if(!c){showNotification("Subdomain is required","warning");return}const e=l.id,s=[];if(c!==e&&s.push("subdomain"),p&&p!==l.name&&s.push("name"),d&&d!==String(l.port)&&s.push("port"),o!==l.ip&&s.push("ip"),v!==(l.tailscaleOnly||!1)&&s.push("tailscale"),i&&i!==l.logo&&s.push("logo"),t!==(l.category||"")&&s.push("category"),s.length===0){f();return}const n=document.getElementById("service-edit-save");n.textContent="Saving...",n.disabled=!0;try{const g=await(await secureFetch("/api/v1/services/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubdomain:e,newSubdomain:c,name:p||l.name,port:d||l.port,ip:o,tailscaleOnly:v,logo:i||void 0,category:t})})).json();if(!g.success)throw new Error(g.error||"Failed to update service");const m=window.APPS.findIndex(x=>x.id===e);m!==-1&&(window.APPS[m]={...window.APPS[m],id:c,name:p||window.APPS[m].name,port:d||window.APPS[m].port,ip:o,tailscaleOnly:v,logo:i||window.APPS[m].logo,category:t||void 0}),f(),window.buildGrid(),window.refreshAll()}catch(r){console.error("Error saving service changes:",r),showNotification(`Error saving changes: ${r.message}`,"error")}finally{n.textContent="Save Changes",n.disabled=!1}}document.getElementById("edit-logo-file")?.addEventListener("change",async c=>{const p=c.target.files[0];if(!p)return;if(!p.type.startsWith("image/")){showNotification("Please select an image file","warning");return}const d=new FileReader;d.onload=async o=>{const v=o.target.result;if(document.getElementById("edit-service-logo-preview").src=v,document.getElementById("edit-logo-url").value=v,l)try{const t=await(await secureFetch("/api/v1/assets/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filename:`${l.id}.png`,data:v})})).json();t.success&&t.path&&(document.getElementById("edit-logo-url").value=t.path)}catch{}},d.readAsDataURL(p)}),document.getElementById("service-edit-cancel")?.addEventListener("click",f),document.getElementById("service-edit-save")?.addEventListener("click",b),document.getElementById("service-edit-modal")?.addEventListener("click",c=>{c.target.id==="service-edit-modal"&&f()});function h(c,p,d){return new Promise(o=>{const v=document.getElementById("delete-service-modal"),i=document.getElementById("delete-modal-title"),t=document.getElementById("delete-modal-message"),e=document.getElementById("delete-modal-container-info"),s=document.getElementById("delete-modal-container-name"),n=document.getElementById("delete-modal-help"),r=document.getElementById("delete-modal-cancel"),g=document.getElementById("delete-modal-remove"),m=document.getElementById("delete-modal-delete");i.textContent=`Delete "${c}"`,p?(t.innerHTML="This service has an associated Docker container.
Choose how to proceed:",e.style.display="block",s.textContent=`Container ID: ${d?.slice(0,12)||"Unknown"}`,n.style.display="block",m.style.display="block"):(t.textContent="Remove this service from the dashboard?",e.style.display="none",n.style.display="none",m.style.display="none");const x=()=>{v.classList.remove("show"),r.removeEventListener("click",I),g.removeEventListener("click",L),m.removeEventListener("click",P),v.removeEventListener("click",C)},I=()=>{x(),o(null)},L=()=>{x(),o(!1)},P=()=>{x(),o(!0)},C=B=>{B.target===v&&(x(),o(null))};r.addEventListener("click",I),g.addEventListener("click",L),m.addEventListener("click",P),v.addEventListener("click",C),v.classList.add("show")})}async function u(c,p,d){const o=document.getElementById(`update-btn-${d}`),v=o?.textContent;if(confirm(`Update ${p} to the latest version? +`),t&&(p+=` header { +`,p+=` Access-Control-Allow-Origin "*" +`,p+=` Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" +`,p+=` Access-Control-Allow-Headers "Content-Type, Authorization" +`,p+=` } +`),e)try{const w=JSON.parse(e);p+=` header { +`,Object.entries(w).forEach(([I,L])=>{p+=` ${I} "${L}" +`}),p+=` } +`}catch{console.warn("Invalid JSON in custom headers")}return n&&(p+=` health_uri ${n} +`),p+=` reverse_proxy ${l}:${u} { +`,i&&i!=="/"&&(p+=` rewrite ${i} +`),r&&r!==30&&(p+=` transport http { +`,p+=` dial_timeout ${r}s +`,p+=` response_header_timeout ${r}s +`,p+=` } +`),p+=` } +`,p+=`} +`,p}async function m(y,v,u=DC.DEFAULTS.TTL){const l=window.getToken(getPrimaryDnsId(),"admin");if(!l)throw new Error("DNS admin token not configured. Please set it in the Tokens menu.");const a=buildDomain(y),o=await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:a,ip:v,ttl:u,token:l,server:SITE.dnsIp})});if(!o.ok){const d=await o.text();throw new Error(`DNS API Error: ${o.status} - ${d}`)}const g=await o.json();if(!g.success)throw new Error(`DNS Error: ${g.error||"Unknown error"}`);return g}async function h(y){const v={id:y.subdomain,name:y.name,logo:y.logo||`/assets/${y.subdomain}.png`};y.category&&(v.category=y.category),y.containerId&&(v.containerId=y.containerId);try{const u=await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(v)});if(!u.ok){const l=await u.json();throw new Error(l.error||"Failed to save service")}return await window.loadServices(),window.buildGrid(),v}catch(u){throw console.error("Failed to add service to config:",u),u}}async function b(y){const v=document.getElementById("service-subdomain-input").value.trim(),u=document.getElementById("service-ip-input").value.trim()||"localhost",l=document.getElementById("service-port-input").value.trim()||"80",a=await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(v),upstream:`${u}:${l}`,config:y})}),o=await a.json();if(!a.ok||!o.success)throw new Error(o.error||`Caddy API Error: ${a.status}`);return o}window.loadExistingCAs=c,window.generateCaddyConfig=s,window.createDnsRecord=m,window.addServiceToConfig=h,window.addToCaddyfile=b})(),(function(){let c=null;function s(u){c=u;const l=document.getElementById("service-edit-modal");document.getElementById("service-edit-title").textContent=`Edit ${u.name}`,document.getElementById("edit-service-name").value=u.name,document.getElementById("edit-service-url-display").textContent=u.url||buildServiceUrl(u.id),document.getElementById("edit-service-logo-preview").src=u.logo||`/assets/${u.id}.png`,document.getElementById("edit-subdomain").value=u.id,document.getElementById("edit-port").value=u.port||"",document.getElementById("edit-ip").value=u.ip||"localhost",document.getElementById("edit-tailscale-only").checked=u.tailscaleOnly||!1,document.getElementById("edit-logo-url").value=u.logo||"";const a=document.getElementById("edit-service-category");a&&(a.dataset.current=u.category||"",typeof window.populateCategorySelects=="function"&&window.populateCategorySelects()),l.classList.add("show")}function m(){closeModal("service-edit-modal"),c=null}async function h(){if(!c)return;const u=document.getElementById("edit-subdomain").value.trim().toLowerCase(),l=document.getElementById("edit-service-name").value.trim(),a=document.getElementById("edit-port").value.trim(),o=document.getElementById("edit-ip").value.trim()||"localhost",g=document.getElementById("edit-tailscale-only").checked,d=document.getElementById("edit-logo-url").value.trim(),t=document.getElementById("edit-service-category")?.value||"";if(!u){showNotification("Subdomain is required","warning");return}const e=c.id,i=[];if(u!==e&&i.push("subdomain"),l&&l!==c.name&&i.push("name"),a&&a!==String(c.port)&&i.push("port"),o!==c.ip&&i.push("ip"),g!==(c.tailscaleOnly||!1)&&i.push("tailscale"),d&&d!==c.logo&&i.push("logo"),t!==(c.category||"")&&i.push("category"),i.length===0){m();return}const n=document.getElementById("service-edit-save");n.textContent="Saving...",n.disabled=!0;try{const f=await(await secureFetch("/api/v1/services/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubdomain:e,newSubdomain:u,name:l||c.name,port:a||c.port,ip:o,tailscaleOnly:g,logo:d||void 0,category:t})})).json();if(!f.success)throw new Error(f.error||"Failed to update service");const p=window.APPS.findIndex(w=>w.id===e);p!==-1&&(window.APPS[p]={...window.APPS[p],id:u,name:l||window.APPS[p].name,port:a||window.APPS[p].port,ip:o,tailscaleOnly:g,logo:d||window.APPS[p].logo,category:t||void 0}),m(),window.buildGrid(),window.refreshAll()}catch(r){console.error("Error saving service changes:",r),showNotification(`Error saving changes: ${r.message}`,"error")}finally{n.textContent="Save Changes",n.disabled=!1}}document.getElementById("edit-logo-file")?.addEventListener("change",async u=>{const l=u.target.files[0];if(!l)return;if(!l.type.startsWith("image/")){showNotification("Please select an image file","warning");return}const a=new FileReader;a.onload=async o=>{const g=o.target.result;if(document.getElementById("edit-service-logo-preview").src=g,document.getElementById("edit-logo-url").value=g,c)try{const t=await(await secureFetch("/api/v1/assets/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filename:`${c.id}.png`,data:g})})).json();t.success&&t.path&&(document.getElementById("edit-logo-url").value=t.path)}catch{}},a.readAsDataURL(l)}),document.getElementById("service-edit-cancel")?.addEventListener("click",m),document.getElementById("service-edit-save")?.addEventListener("click",h),document.getElementById("service-edit-modal")?.addEventListener("click",u=>{u.target.id==="service-edit-modal"&&m()});function b(u,l,a){return new Promise(o=>{const g=document.getElementById("delete-service-modal"),d=document.getElementById("delete-modal-title"),t=document.getElementById("delete-modal-message"),e=document.getElementById("delete-modal-container-info"),i=document.getElementById("delete-modal-container-name"),n=document.getElementById("delete-modal-help"),r=document.getElementById("delete-modal-cancel"),f=document.getElementById("delete-modal-remove"),p=document.getElementById("delete-modal-delete");d.textContent=`Delete "${u}"`,l?(t.innerHTML="This service has an associated Docker container.
Choose how to proceed:",e.style.display="block",i.textContent=`Container ID: ${a?.slice(0,12)||"Unknown"}`,n.style.display="block",p.style.display="block"):(t.textContent="Remove this service from the dashboard?",e.style.display="none",n.style.display="none",p.style.display="none");const w=()=>{g.classList.remove("show"),r.removeEventListener("click",I),f.removeEventListener("click",L),p.removeEventListener("click",P),g.removeEventListener("click",C)},I=()=>{w(),o(null)},L=()=>{w(),o(!1)},P=()=>{w(),o(!0)},C=B=>{B.target===g&&(w(),o(null))};r.addEventListener("click",I),f.addEventListener("click",L),p.addEventListener("click",P),g.addEventListener("click",C),g.classList.add("show")})}async function y(u,l,a){const o=document.getElementById(`update-btn-${a}`),g=o?.textContent;if(confirm(`Update ${l} to the latest version? This will: 1. Pull the latest image 2. Stop the container 3. Recreate with same settings -The service will be briefly unavailable.`))try{o&&(o.textContent="\u{1F504}",o.disabled=!0,o.title="Updating...");const t=await(await secureFetch(`/api/v1/containers/${c}/update`,{method:"POST"})).json();if(t.success){const e=window.APPS.find(s=>s.id===d);e&&t.newContainerId&&(e.containerId=t.newContainerId),o&&(o.textContent="\u2705",o.title="Updated successfully!",setTimeout(()=>{o.textContent=v,o.disabled=!1,o.title="Update container to latest version"},3e3)),setTimeout(()=>window.refreshAll(),2e3),showNotification(`${p} updated successfully!`,"success")}else throw new Error(t.error||"Update failed")}catch(i){console.error("Update error:",i),o&&(o.textContent="\u274C",o.title="Update failed",setTimeout(()=>{o.textContent=v,o.disabled=!1,o.title="Update container to latest version"},3e3)),showNotification(`Failed to update ${p}: ${i.message}`,"error")}}async function y(c,p){const d=window.APPS.find(m=>m.id===c),o=d?buildDomain(d.id):null,v=d?.containerId,i=await h(p||c,v,d?.containerId);if(i===null)return;let t={dashboard:!1,container:null,dns:null,caddy:null,service:null};if(i&&v)try{const m=new URLSearchParams({containerId:d.containerId,subdomain:d.id,ip:d.ip||"localhost",deleteContainer:"true"}),I=await(await secureFetch(`/api/v1/apps/${encodeURIComponent(d.id)}?${m.toString()}`,{method:"DELETE"})).json();I.success?t={...t,...I.results,dashboard:!1}:console.error("App removal failed:",I.error)}catch(m){console.error("App removal error:",m)}else if(i&&o){try{const m=d?.ip||"localhost",I=await(await secureFetch(`/api/v1/dns/record?domain=${encodeURIComponent(o)}&type=A&ipAddress=${encodeURIComponent(m)}&server=${SITE.dnsIp}`,{method:"DELETE"})).json();t.dns=I.success?"deleted":I.error||"failed"}catch(m){t.dns=m.message}try{const x=await(await secureFetch(`/api/v1/site/${encodeURIComponent(o)}`,{method:"DELETE"})).json();t.caddy=x.success||x.error&&x.error.includes("not found")?"removed":x.error||"failed"}catch(m){t.caddy=m.message}}const e=window.APPS.findIndex(m=>m.id===c);e>-1&&(window.APPS.splice(e,1),t.dashboard=!0);try{const m=safeGetJSON("custom-apps",[]),x=m.findIndex(I=>I.id===c);x>-1&&(m.splice(x,1),safeSet("custom-apps",JSON.stringify(m)))}catch{}try{const x=await(await secureFetch(`/api/v1/services/${encodeURIComponent(c)}`,{method:"DELETE"})).json();t.service=x.success?"removed":x.error||"failed"}catch(m){t.service=m.message}window.buildGrid(),window.refreshAll();let s=!1,n=[];t.dashboard||(s=!0,n.push("\u2717 Failed to remove from dashboard"));const r=["removed","already removed","not found","deleted","kept (user choice)","skipped","no such record","does not exist"],g=m=>!m||r.some(x=>m.toLowerCase().includes(x.toLowerCase()));t.container&&!g(t.container)&&(s=!0,n.push(`\u26A0 Container: ${t.container}`)),t.dns&&!g(t.dns)&&(s=!0,n.push(`\u26A0 DNS Record: ${t.dns}`)),t.caddy&&!g(t.caddy)&&(s=!0,n.push(`\u26A0 Caddy Config: ${t.caddy}`)),t.service&&!g(t.service)&&(s=!0,n.push(`\u26A0 Service File: ${t.service}`)),s&&showNotification(`Error deleting "${p||c}": ${n.join(", ")}`,"error",6e3)}window.openServiceEditModal=a,window.showDeleteModal=h,window.updateContainer=u,window.deleteService=y})(),(function(){function l(t){return t.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"")}function a(){return SITE.defaults?.sslType||(SITE.configurationType==="public"?"letsencrypt":"caddy-managed")}function f(){const t=document.getElementById("service-subdomain-input").value||"subdomain",e=document.getElementById("service-ip-input").value||b.lan||"localhost",s=document.getElementById("service-port-input").value||DC.DEFAULTS.SERVICE_PORT,n=document.getElementById("ssl-type-select").value,r=document.getElementById("ca-name-input").value||"sami-ca",g=document.getElementById("existing-ca-select").value,m=document.getElementById("enable-auth").checked,x=document.getElementById("enable-cors").checked,I=document.getElementById("custom-headers-input").value,L=document.getElementById("upstream-path-input").value||"/",P=document.getElementById("health-check-input").value,C=document.getElementById("timeout-input").value||30,B=document.getElementById("dns-preview");B&&(B.textContent=`${buildDomain(t)} \u2192 ${e}`);const $=document.getElementById("url-preview");$&&($.textContent=buildServiceUrl(t));const E={subdomain:t,port:s,ip:e,sslType:n,caName:r,existingCa:g,enableAuth:m,enableCors:x,customHeaders:I,upstreamPath:L,healthCheck:P,timeout:C},w=window.generateCaddyConfig(E),S=document.getElementById("caddy-config-preview");S&&(S.value=w)}const b={localhost:"127.0.0.1",lan:"",tailscale:""};async function h(){try{const n=await fetch("/api/v1/network/ips",{signal:AbortSignal.timeout(2e3)});if(n.ok){const r=await n.json();r.lan&&(b.lan=r.lan),r.tailscale&&(b.tailscale=r.tailscale)}}catch{}const t=document.getElementById("quick-ip-lan"),e=document.getElementById("quick-ip-tailscale");t&&(b.lan?(t.dataset.ip=b.lan,t.textContent=`LAN (${b.lan})`,t.title=`LAN IP: ${b.lan}`):t.style.display="none"),e&&(b.tailscale?(e.dataset.ip=b.tailscale,e.textContent=`Tailscale (${b.tailscale})`,e.title=`Tailscale IP: ${b.tailscale}`):e.style.display="none");const s=document.getElementById("service-ip-input");s&&!s.value&&b.lan&&(s.value=b.lan)}function u(){document.querySelectorAll(".quick-ip-btn").forEach(t=>{t.addEventListener("click",()=>{const e=t.dataset.ip;e&&(document.getElementById("service-ip-input").value=e,document.querySelectorAll(".quick-ip-btn").forEach(s=>s.classList.remove("active")),t.classList.add("active"),f())})}),document.getElementById("service-ip-input")?.addEventListener("input",t=>{const e=t.target.value;document.querySelectorAll(".quick-ip-btn").forEach(s=>{s.classList.toggle("active",s.dataset.ip===e)})})}async function y(){const t=document.getElementById("add-service-modal");t.classList.add("show");const e=t.querySelector(".weather-modal-content");e&&(e.scrollTop=0),document.body.style.overflow="hidden";const s=document.getElementById("ssl-type-select");s&&(s.value=a()),await h();const n=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(n);const r=document.getElementById("manual-tailscale-status"),g=document.getElementById("manual-tailscale-only");try{const x=await(await fetch("/api/v1/tailscale/status")).json();x.success&&x.installed&&x.connected?(r.innerHTML=` +The service will be briefly unavailable.`))try{o&&(o.textContent="\u{1F504}",o.disabled=!0,o.title="Updating...");const t=await(await secureFetch(`/api/v1/containers/${u}/update`,{method:"POST"})).json();if(t.success){const e=window.APPS.find(i=>i.id===a);e&&t.newContainerId&&(e.containerId=t.newContainerId),o&&(o.textContent="\u2705",o.title="Updated successfully!",setTimeout(()=>{o.textContent=g,o.disabled=!1,o.title="Update container to latest version"},3e3)),setTimeout(()=>window.refreshAll(),2e3),showNotification(`${l} updated successfully!`,"success")}else throw new Error(t.error||"Update failed")}catch(d){console.error("Update error:",d),o&&(o.textContent="\u274C",o.title="Update failed",setTimeout(()=>{o.textContent=g,o.disabled=!1,o.title="Update container to latest version"},3e3)),showNotification(`Failed to update ${l}: ${d.message}`,"error")}}async function v(u,l){const a=window.APPS.find(p=>p.id===u),o=a?buildDomain(a.id):null,g=a?.containerId,d=await b(l||u,g,a?.containerId);if(d===null)return;let t={dashboard:!1,container:null,dns:null,caddy:null,service:null};if(d&&g)try{const p=new URLSearchParams({containerId:a.containerId,subdomain:a.id,ip:a.ip||"localhost",deleteContainer:"true"}),I=await(await secureFetch(`/api/v1/apps/${encodeURIComponent(a.id)}?${p.toString()}`,{method:"DELETE"})).json();I.success?t={...t,...I.results,dashboard:!1}:console.error("App removal failed:",I.error)}catch(p){console.error("App removal error:",p)}else if(d&&o){try{const p=a?.ip||"localhost",I=await(await secureFetch(`/api/v1/dns/record?domain=${encodeURIComponent(o)}&type=A&ipAddress=${encodeURIComponent(p)}&server=${SITE.dnsIp}`,{method:"DELETE"})).json();t.dns=I.success?"deleted":I.error||"failed"}catch(p){t.dns=p.message}try{const w=await(await secureFetch(`/api/v1/site/${encodeURIComponent(o)}`,{method:"DELETE"})).json();t.caddy=w.success||w.error&&w.error.includes("not found")?"removed":w.error||"failed"}catch(p){t.caddy=p.message}}const e=window.APPS.findIndex(p=>p.id===u);e>-1&&(window.APPS.splice(e,1),t.dashboard=!0);try{const p=safeGetJSON("custom-apps",[]),w=p.findIndex(I=>I.id===u);w>-1&&(p.splice(w,1),safeSet("custom-apps",JSON.stringify(p)))}catch{}try{const w=await(await secureFetch(`/api/v1/services/${encodeURIComponent(u)}`,{method:"DELETE"})).json();t.service=w.success?"removed":w.error||"failed"}catch(p){t.service=p.message}window.buildGrid(),window.refreshAll();let i=!1,n=[];t.dashboard||(i=!0,n.push("\u2717 Failed to remove from dashboard"));const r=["removed","already removed","not found","deleted","kept (user choice)","skipped","no such record","does not exist"],f=p=>!p||r.some(w=>p.toLowerCase().includes(w.toLowerCase()));t.container&&!f(t.container)&&(i=!0,n.push(`\u26A0 Container: ${t.container}`)),t.dns&&!f(t.dns)&&(i=!0,n.push(`\u26A0 DNS Record: ${t.dns}`)),t.caddy&&!f(t.caddy)&&(i=!0,n.push(`\u26A0 Caddy Config: ${t.caddy}`)),t.service&&!f(t.service)&&(i=!0,n.push(`\u26A0 Service File: ${t.service}`)),i&&showNotification(`Error deleting "${l||u}": ${n.join(", ")}`,"error",6e3)}window.openServiceEditModal=s,window.showDeleteModal=b,window.updateContainer=y,window.deleteService=v})(),(function(){function c(t){return t.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"")}function s(){return SITE.defaults?.sslType||(SITE.configurationType==="public"?"letsencrypt":"caddy-managed")}function m(){const t=document.getElementById("service-subdomain-input").value||"subdomain",e=document.getElementById("service-ip-input").value||h.lan||"localhost",i=document.getElementById("service-port-input").value||DC.DEFAULTS.SERVICE_PORT,n=document.getElementById("ssl-type-select").value,r=document.getElementById("ca-name-input").value||"sami-ca",f=document.getElementById("existing-ca-select").value,p=document.getElementById("enable-auth").checked,w=document.getElementById("enable-cors").checked,I=document.getElementById("custom-headers-input").value,L=document.getElementById("upstream-path-input").value||"/",P=document.getElementById("health-check-input").value,C=document.getElementById("timeout-input").value||30,B=document.getElementById("dns-preview");B&&(B.textContent=`${buildDomain(t)} \u2192 ${e}`);const $=document.getElementById("url-preview");$&&($.textContent=buildServiceUrl(t));const E={subdomain:t,port:i,ip:e,sslType:n,caName:r,existingCa:f,enableAuth:p,enableCors:w,customHeaders:I,upstreamPath:L,healthCheck:P,timeout:C},x=window.generateCaddyConfig(E),S=document.getElementById("caddy-config-preview");S&&(S.value=x)}const h={localhost:"127.0.0.1",lan:"",tailscale:""};async function b(){try{const n=await fetch("/api/v1/network/ips",{signal:AbortSignal.timeout(2e3)});if(n.ok){const r=await n.json();r.lan&&(h.lan=r.lan),r.tailscale&&(h.tailscale=r.tailscale)}}catch{}const t=document.getElementById("quick-ip-lan"),e=document.getElementById("quick-ip-tailscale");t&&(h.lan?(t.dataset.ip=h.lan,t.textContent=`LAN (${h.lan})`,t.title=`LAN IP: ${h.lan}`):t.style.display="none"),e&&(h.tailscale?(e.dataset.ip=h.tailscale,e.textContent=`Tailscale (${h.tailscale})`,e.title=`Tailscale IP: ${h.tailscale}`):e.style.display="none");const i=document.getElementById("service-ip-input");i&&!i.value&&h.lan&&(i.value=h.lan)}function y(){document.querySelectorAll(".quick-ip-btn").forEach(t=>{t.addEventListener("click",()=>{const e=t.dataset.ip;e&&(document.getElementById("service-ip-input").value=e,document.querySelectorAll(".quick-ip-btn").forEach(i=>i.classList.remove("active")),t.classList.add("active"),m())})}),document.getElementById("service-ip-input")?.addEventListener("input",t=>{const e=t.target.value;document.querySelectorAll(".quick-ip-btn").forEach(i=>{i.classList.toggle("active",i.dataset.ip===e)})})}async function v(){const t=document.getElementById("add-service-modal");t.classList.add("show");const e=t.querySelector(".weather-modal-content");e&&(e.scrollTop=0),document.body.style.overflow="hidden";const i=document.getElementById("ssl-type-select");i&&(i.value=s()),await b();const n=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(n);const r=document.getElementById("manual-tailscale-status"),f=document.getElementById("manual-tailscale-only");try{const w=await(await fetch("/api/v1/tailscale/status")).json();w.success&&w.installed&&w.connected?(r.innerHTML=` \u2713 Connected - ${x.self?.hostname} (${x.self?.ip}) - `,g.disabled=!1):x.installed?(r.innerHTML='\u26A0 Not connected',g.disabled=!0):(r.innerHTML='Not available',g.disabled=!0)}catch{r.innerHTML='Could not check',g.disabled=!0}g.checked=!1,f()}function c(){const t=document.getElementById("service-type-local"),e=document.getElementById("service-type-external"),s=document.getElementById("local-service-config"),n=document.getElementById("external-service-config"),r=document.getElementById("tab-local"),g=document.getElementById("tab-external");function m(){t.checked?(s.style.display="grid",n.style.display="none",r&&(r.style.background="var(--accent)",r.style.color="var(--bg)"),g&&(g.style.background="transparent",g.style.color="var(--muted)")):(s.style.display="none",n.style.display="block",g&&(g.style.background="var(--accent)",g.style.color="var(--bg)"),r&&(r.style.background="transparent",r.style.color="var(--muted)"))}t?.addEventListener("change",m),e?.addEventListener("change",m)}function p(){const t=document.getElementById("service-name-input"),e=document.getElementById("service-subdomain-input"),s=document.getElementById("subdomain-preview");let n=!1;t?.addEventListener("input",()=>{const L=l(t.value);!n&&e&&(e.value=L),s&&(s.textContent=L?`\u2192 ${buildDomain(L)}`:""),f()}),e?.addEventListener("input",()=>{n=e.value!==l(t?.value||"");const L=e.value.trim()||l(t?.value||"");s&&(s.textContent=L?`\u2192 ${buildDomain(L)}`:""),f()});const r=document.getElementById("external-service-name"),g=document.getElementById("external-service-subdomain"),m=document.getElementById("external-subdomain-preview"),x=document.getElementById("external-domain-preview");let I=!1;r?.addEventListener("input",()=>{const L=l(r.value);!I&&g&&(g.value=L);const P=g?.value||L;m&&(m.textContent=P?`\u2192 ${buildDomain(P)}`:""),x&&(x.textContent=P?buildDomain(P):"")}),g?.addEventListener("input",()=>{I=g.value!==l(r?.value||"");const L=g.value.trim()||l(r?.value||"");m&&(m.textContent=L?`\u2192 ${buildDomain(L)}`:""),x&&(x.textContent=L?buildDomain(L):"")})}async function d(){const t=document.getElementById("external-service-name").value.trim(),e=document.getElementById("external-service-url").value.trim(),s=(document.getElementById("external-service-subdomain").value.trim()||l(t)).toLowerCase(),n=document.getElementById("external-service-logo").value.trim(),r=document.getElementById("external-service-icon").value.trim(),g=document.getElementById("external-create-dns").checked,m=document.getElementById("external-create-caddy").checked,x=document.getElementById("external-proxy-ip").value.trim()||SITE.dnsIp||"localhost",I=document.getElementById("external-preserve-host").checked,L=document.getElementById("external-follow-redirects").checked,P=document.getElementById("external-service-category")?.value||"";if(!t||!e){showNotification("Please fill in Name and External URL","warning");return}if(!s){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(!e.startsWith("http://")&&!e.startsWith("https://")){showNotification("External URL must start with http:// or https://","warning");return}const C=buildDomain(s);try{const B={dns:null,caddy:null,dashboard:!1};if(g)if(window.getToken(getPrimaryDnsId(),"admin"))try{const A=await(await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:C,ip:x,ttl:DC.DEFAULTS.TTL,server:SITE.dnsIp})})).json();B.dns=A.success?"created":A.error||"failed"}catch(k){B.dns=k.message}else B.dns="no admin token (configure in \u{1F511} Tokens)";if(m)try{const T={subdomain:s,externalUrl:e,preserveHost:I,followRedirects:L,sslType:"caddy-managed",caddyfilePath:DC.DEFAULTS.CADDYFILE,reloadCaddy:!0},A=await(await secureFetch("/api/v1/site/external",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(T)})).json();B.caddy=A.success?"created":A.error||"failed"}catch(T){B.caddy=T.message}const $={id:s,name:t,url:`https://${C}`,externalUrl:e,logo:n||r||"\u{1F310}",isExternal:!0,isCustom:!0};P&&($.category=P),window.APPS.push($),B.dashboard=!0;const E=["plex","router","chat","sync","torrent","radarr","sonarr","prowlarr","portainer","requests","jellyfin","emby"],w=window.APPS.filter(T=>!E.includes(T.id));safeSet("custom-services",JSON.stringify(w));try{await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(window.APPS)})}catch(T){console.warn("Failed to save to services.json:",T)}window.buildGrid(),window.refreshAll(),o();const S=[`External service "${t}" added!`];g&&S.push(`DNS: ${B.dns==="created"?"\u2713":"\u26A0 "+B.dns}`),m&&S.push(`Caddy: ${B.caddy==="created"?"\u2713":"\u26A0 "+B.caddy}`),S.push(`Access at: https://${C}`),showNotification(S.join(" | "),"success",6e3)}catch(B){console.error("Failed to create external service:",B),showNotification(`Failed to create external service: ${B.message}`,"error")}}function o(){closeModal("add-service-modal"),document.body.style.overflow="",document.getElementById("service-name-input").value="",document.getElementById("service-subdomain-input").value="",document.getElementById("service-port-input").value="",document.getElementById("service-ip-input").value=b.lan||"",document.getElementById("service-logo-input").value="",document.getElementById("dns-ttl-input").value=DC.DEFAULTS.TTL,document.getElementById("ssl-type-select").value=a(),document.getElementById("ca-name-input").value="",document.getElementById("enable-auth").checked=!1,document.getElementById("enable-cors").checked=!1,document.getElementById("custom-headers-input").value="",document.getElementById("upstream-path-input").value="/",document.getElementById("health-check-input").value="",document.getElementById("timeout-input").value="30";const t=document.getElementById("subdomain-preview");t&&(t.textContent="");const e=document.getElementById("external-subdomain-preview");e&&(e.textContent="");const s=document.getElementById("external-service-name");s&&(s.value="");const n=document.getElementById("external-service-subdomain");n&&(n.value="");const r=document.getElementById("external-service-url");r&&(r.value="");const g=document.getElementById("external-service-logo");g&&(g.value="");const m=document.getElementById("external-service-icon");m&&(m.value="");const x=document.getElementById("local-advanced-options");x&&x.removeAttribute("open");const I=document.getElementById("external-advanced-options");I&&I.removeAttribute("open");const L=document.getElementById("service-type-local");L&&(L.checked=!0);const P=document.getElementById("local-service-config"),C=document.getElementById("external-service-config");P&&(P.style.display="grid"),C&&(C.style.display="none");const B=document.getElementById("tab-local"),$=document.getElementById("tab-external");B&&(B.style.background="var(--accent)",B.style.color="var(--bg)"),$&&($.style.background="transparent",$.style.color="var(--muted)")}async function v(){const t=document.getElementById("service-name-input").value.trim(),e=(document.getElementById("service-subdomain-input").value.trim()||l(t)).toLowerCase(),s=document.getElementById("service-port-input").value.trim(),n=document.getElementById("service-ip-input").value.trim(),r=document.getElementById("service-logo-input").value.trim(),g=document.getElementById("create-dns-record").checked,m=parseInt(document.getElementById("dns-ttl-input").value)||DC.DEFAULTS.TTL,x=document.getElementById("manual-tailscale-only")?.checked||!1,I=document.getElementById("ssl-type-select")?.value||"caddy-managed",L=document.getElementById("ca-name-input")?.value||"",P=document.getElementById("existing-ca-select")?.value||"",C=document.getElementById("enable-auth")?.checked||!1,B=document.getElementById("enable-cors")?.checked||!1,$=document.getElementById("custom-headers-input")?.value||"",E=document.getElementById("upstream-path-input")?.value||"/",w=document.getElementById("health-check-input")?.value||"",S=document.getElementById("timeout-input")?.value||30,k=(document.getElementById("service-category-input")||document.getElementById("external-service-category"))?.value||"",A=window.getToken(getPrimaryDnsId(),"admin");if(!t||!s||!n){showNotification("Please fill in Name, Port, and IP Address","warning");return}if(!e){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(g&&!A){showNotification("DNS Admin token required. Configure it in the Tokens menu first.","warning");return}const D={dns:null,caddy:null,dashboard:!1};try{if(g)try{await window.createDnsRecord(e,n,m),D.dns="created"}catch(N){throw console.error("DNS creation failed:",N),D.dns=N.message,new Error(`DNS creation failed: ${N.message}`)}else D.dns="skipped";const O=window.generateCaddyConfig({subdomain:e,port:s,ip:n,sslType:I,caName:L,existingCa:P,enableAuth:C,enableCors:B,customHeaders:$,upstreamPath:E,healthCheck:w,timeout:S,tailscaleOnly:x});try{const _=await(await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(e),upstream:`${n}:${s}`,config:O})})).json();if(_.success)D.caddy="added & reloaded";else throw console.error("Caddy configuration failed:",_.error),D.caddy=_.error||"failed",new Error(`Caddy configuration failed: ${_.error}`)}catch(N){throw console.error("Caddy API error:",N),D.caddy=N.message,new Error(`Caddy API error: ${N.message}`)}const R={name:t,subdomain:e,port:s,ip:n,logo:r||`/assets/${e}.png`,tailscaleOnly:x||!1};k&&(R.category=k),await window.addServiceToConfig(R),D.dashboard=!0;const U=[`DNS: ${D.dns==="created"?"\u2713":D.dns==="skipped"?"\u25CB":"\u2717"}`,`Caddy: ${D.caddy==="added & reloaded"?"\u2713":"\u2717"}`,`Dashboard: ${D.dashboard?"\u2713":"\u2717"}`];showNotification(`Service "${t}" created! ${U.join(" | ")} \u2014 ${buildServiceUrl(e)}${x?" (Tailscale)":""}`,"success",6e3),o(),window.buildGrid(),window.refreshAll()}catch(O){console.error("Error creating service:",O),showNotification(`Error creating "${t}": ${O.message}`,"error",6e3)}}document.getElementById("add-service")?.addEventListener("click",y),document.getElementById("add-service-cancel")?.addEventListener("click",o),document.getElementById("add-service-create")?.addEventListener("click",()=>{document.querySelector('input[name="service-type"]:checked')?.value==="external"?d():v()}),c(),p(),u(),document.getElementById("ssl-type-select")?.addEventListener("change",t=>{const e=document.getElementById("existing-ca-config"),s=document.getElementById("custom-ca-config");e.style.display="none",s.style.display="none",t.target.value==="existing-ca"?e.style.display="block":t.target.value==="custom-ca"&&(s.style.display="block"),f()}),document.getElementById("refresh-cas")?.addEventListener("click",async()=>{const t=document.getElementById("refresh-cas"),e=t.textContent;t.textContent="\u231B Loading...",t.disabled=!0;try{const s=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(s),t.textContent="\u2705 Refreshed"}catch(s){t.textContent="\u274C Failed",console.error("Failed to refresh CAs:",s)}setTimeout(()=>{t.textContent=e,t.disabled=!1},2e3)}),document.getElementById("create-dns-record")?.addEventListener("change",t=>{const e=document.getElementById("dns-config");e.style.display=t.target.checked?"block":"none"}),["service-subdomain-input","service-ip-input","service-port-input","ca-name-input","existing-ca-select","enable-auth","enable-cors","custom-headers-input","upstream-path-input","health-check-input","timeout-input"].forEach(t=>{const e=document.getElementById(t);e&&(e.addEventListener("input",f),e.addEventListener("change",f))});function i(){const t=safeGet("custom-services");if(t)try{JSON.parse(t).forEach(s=>{window.APPS.find(n=>n.id===s.id)||window.APPS.push(s)})}catch(e){console.warn("Failed to load custom services:",e)}}i(),window.openAddServiceModal=y,window.closeAddServiceModal=o})(),(function(){let l=null,a=1e3;const f=3e4;function b(){if(l)try{l.close()}catch{}l=new EventSource("/api/v1/events/stream"),l.addEventListener("connected",()=>{a=1e3,debug("[SSE] Connected to event stream")}),l.addEventListener("status-change",h=>{try{const u=JSON.parse(h.data);if(u.serviceId&&typeof window.setBadge=="function"){const y=u.status==="up"||u.status==="healthy";window.setBadge(u.serviceId,y,u.responseTime||null)}}catch{}}),l.addEventListener("resource-alert",h=>{try{const u=JSON.parse(h.data),y=`${u.containerName||u.containerId}: ${u.metric} at ${u.value}% (threshold: ${u.threshold}%)`;typeof showNotification=="function"&&showNotification(y,"warning")}catch{}}),l.addEventListener("auto-restart",h=>{try{const u=JSON.parse(h.data);typeof showNotification=="function"&&showNotification(`Container "${u.containerName}" was auto-restarted`,"info")}catch{}}),l.addEventListener("update-available",h=>{try{const u=JSON.parse(h.data),y=document.getElementById("updates-btn");if(y&&!y.querySelector(".sse-dot")){const c=document.createElement("span");c.className="sse-dot",c.style.cssText="display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);margin-left:6px;vertical-align:middle;",y.appendChild(c)}typeof showNotification=="function"&&showNotification(`Update available for ${u.containerName||u.containerId}`,"info")}catch{}}),l.addEventListener("update-complete",h=>{try{const u=JSON.parse(h.data);typeof showNotification=="function"&&showNotification(`Update completed: ${u.containerName||u.containerId}`,"success"),typeof window.refreshAll=="function"&&window.refreshAll()}catch{}}),l.addEventListener("update-failed",h=>{try{const u=JSON.parse(h.data);typeof showNotification=="function"&&showNotification(`Update failed: ${u.containerName||u.containerId} \u2014 ${u.error||"unknown error"}`,"error")}catch{}}),l.addEventListener("incident",h=>{try{const u=JSON.parse(h.data);typeof showNotification=="function"&&(u.type==="created"?showNotification(`Incident: ${u.message||u.serviceId}`,"error"):u.type==="resolved"&&showNotification(`Resolved: ${u.serviceId||"incident"}`,"success"))}catch{}}),l.onerror=()=>{l.close(),console.warn(`[SSE] Disconnected, reconnecting in ${a/1e3}s...`),setTimeout(b,a),a=Math.min(a*2,f)}}b(),window._sseReconnect=b})(),(function(){const l=document.getElementById("service-filter-search"),a=document.getElementById("service-filter-status"),f=document.getElementById("service-filter-category"),b=document.getElementById("service-filter-count");function h(){const p=new Set,d=new Set;document.querySelectorAll("#cards .card[data-category]").forEach(i=>{const t=i.dataset.category.trim();t&&d.add(t)});const o=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES||{};return Object.keys(o).concat([...d].filter(i=>!o[i])).forEach(i=>p.add(i)),{list:[...p],apiCats:o}}function u(){if(!f)return;const{list:p,apiCats:d}=h(),o=f.value;f.innerHTML='',p.sort().forEach(v=>{const i=d[v],t=document.createElement("option");t.value=v,t.textContent=i?`${i.icon||""} ${v}`.trim():v,f.appendChild(t)}),o&&[...f.options].some(v=>v.value===o)?f.value=o:f.value="all"}function y(){u();const p=l.value.toLowerCase().trim(),d=a.value,o=f?f.value:"all",v=document.querySelectorAll("#cards .card");let i=0;if(v.forEach(t=>{const e=t.querySelector(".name")?.textContent?.toLowerCase()||"",s=t.dataset.app?.toLowerCase()||"",n=t.dataset.status||"off",r=t.dataset.category||"";(!p||e.includes(p)||s.includes(p))&&(d==="all"||n===d)&&(o==="all"||r===o)?(t.style.display="",i++):t.style.display="none"}),b){const t=v.length;b.textContent=`${i} of ${t} services`}}function c(p,d){let o;return function(...v){clearTimeout(o),o=setTimeout(()=>p.apply(this,v),d)}}l?.addEventListener("input",c(y,200)),a?.addEventListener("change",y),f?.addEventListener("change",y),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>setTimeout(y,500)):setTimeout(y,500),window.refreshServiceFilter=y,window.refreshCategoryDropdown=u})(),(function(){const l=document.getElementById("batch-operations-btn"),a=document.getElementById("batch-action-bar"),f=document.getElementById("batch-selected-count"),b=document.getElementById("batch-start-btn"),h=document.getElementById("batch-stop-btn"),u=document.getElementById("batch-restart-btn"),y=document.getElementById("batch-cancel-btn");let c=!1,p=new Set;function d(){c=!0,p.clear(),a.style.display="",l.textContent="\u2713 Exit Batch Mode",v(),document.querySelectorAll("#cards .card[data-app]").forEach(e=>{const s=e.dataset.containerId;if(!s)return;const n=e.querySelector(".batch-checkbox");n&&n.remove();const r=document.createElement("input");r.type="checkbox",r.className="batch-checkbox",r.dataset.containerId=s,r.dataset.serviceName=e.querySelector(".name")?.textContent||s,r.style.cssText="position: absolute; top: 8px; left: 8px; z-index: 10; width: 18px; height: 18px; cursor: pointer;",r.addEventListener("change",g=>{g.stopPropagation(),r.checked?p.add(s):p.delete(s),v()}),e.style.position="relative",e.insertBefore(r,e.firstChild)})}function o(){c=!1,p.clear(),a.style.display="none",l.textContent="\u2630 Batch Operations",document.querySelectorAll(".batch-checkbox").forEach(t=>t.remove())}function v(){const t=p.size;f.textContent=`${t} selected`,b.disabled=t===0,h.disabled=t===0,u.disabled=t===0}async function i(t){if(p.size===0)return;const e=Array.from(p),s={start:"Starting",stop:"Stopping",restart:"Restarting"}[t];if(!confirm(`${s} ${e.length} container(s)? This cannot be undone.`))return;const n=[b,h,u];n.forEach(x=>{x.disabled=!0,x.textContent="..."});let r=0,g=0;const m=[];for(const x of e)try{const I=await fetch(`/api/v1/containers/${encodeURIComponent(x)}/${t}`,{method:"POST"});if(I.ok)r++;else{g++;const L=await I.json().catch(()=>({}));m.push(`${x}: ${L.error||I.statusText}`)}}catch(I){g++,m.push(`${x}: ${I.message}`)}n[0].textContent="\u25B6 Start All",n[1].textContent="\u2B1B Stop All",n[2].textContent="\u{1F504} Restart All",v(),g===0?typeof showNotification=="function"&&showNotification(`${s} completed: ${r} container(s)`,"success"):(typeof showNotification=="function"&&showNotification(`${s}: ${r} succeeded, ${g} failed`,"warning"),console.error("Batch operation errors:",m)),setTimeout(()=>{typeof refreshAll=="function"&&refreshAll()},1500)}l?.addEventListener("click",()=>{c?o():d()}),b?.addEventListener("click",()=>i("start")),h?.addEventListener("click",()=>i("stop")),u?.addEventListener("click",()=>i("restart")),y?.addEventListener("click",o)})(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBFcnJvciBIYW5kbGVyXG4gKiBIYW5kbGVzIGVycm9ycyBncmFjZWZ1bGx5IHdpdGhvdXQgYnJlYWtpbmcgdGhlIG9uYm9hcmRpbmcgdG91clxuICovXG5cbihmdW5jdGlvbih3aW5kb3cpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIEVycm9ySGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgdGhpcy5tYXhFcnJvcnMgPSA1MDsgLy8gS2VlcCBsYXN0IDUwIGVycm9yc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhbiBlcnJvciB3aXRob3V0IGJyZWFraW5nIHRoZSB0b3VyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgLSBDb250ZXh0IHdoZXJlIGVycm9yIG9jY3VycmVkXG4gICAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1ldGFkYXRhIC0gQWRkaXRpb25hbCBtZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ0Vycm9yKGNvbnRleHQsIGVycm9yLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgICBjb25zdCBlcnJvckVudHJ5ID0ge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IG51bGwsXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgdG8gZXJyb3JzIGFycmF5XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yRW50cnkpO1xuXG4gICAgICAvLyBLZWVwIG9ubHkgbGFzdCBtYXhFcnJvcnNcbiAgICAgIGlmICh0aGlzLmVycm9ycy5sZW5ndGggPiB0aGlzLm1heEVycm9ycykge1xuICAgICAgICB0aGlzLmVycm9ycy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgdG8gY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihgW09uYm9hcmRpbmcgRXJyb3JdICR7Y29udGV4dH06YCwgZXJyb3IsIG1ldGFkYXRhKTtcblxuICAgICAgLy8gT3B0aW9uYWxseSBzZW5kIHRvIGVycm9yIHRyYWNraW5nIHNlcnZpY2VcbiAgICAgIC8vIHRoaXMuc2VuZFRvRXJyb3JUcmFja2luZyhlcnJvckVudHJ5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBhbiBlcnJvciBhbmQgY29udGludWUgdG91clxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RlcCAtIEN1cnJlbnQgc3RlcCBpbmRleFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJlY292ZXJ5IGFjdGlvblxuICAgICAqL1xuICAgIHJlY292ZXJGcm9tRXJyb3IoZXJyb3IsIGN1cnJlbnRTdGVwKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB0aGlzLmNsYXNzaWZ5RXJyb3IoZXJyb3IpO1xuXG4gICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICBjYXNlICdFTEVNRU5UX05PVF9GT1VORCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignRWxlbWVudCBOb3QgRm91bmQnLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIGFjdGlvbjogJ1NLSVBfU1RFUCcsIFxuICAgICAgICAgICAgbmV4dFN0ZXA6IGN1cnJlbnRTdGVwICsgMSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUYXJnZXQgZWxlbWVudCBub3QgZm91bmQsIHNraXBwaW5nIHRvIG5leHQgc3RlcCdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ1NUT1JBR0VfVU5BVkFJTEFCTEUnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBhY3Rpb246ICdVU0VfTUVNT1JZX1NUT1JBR0UnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0xvY2FsIHN0b3JhZ2UgdW5hdmFpbGFibGUsIHVzaW5nIGluLW1lbW9yeSBzdG9yYWdlJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnRFJJVkVSX05PVF9MT0FERUQnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ0RyaXZlci5qcyBOb3QgTG9hZGVkJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdEcml2ZXIuanMgbGlicmFyeSBub3QgbG9hZGVkLCBjYW5ub3Qgc3RhcnQgdG91cidcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ0lOVkFMSURfVE9PTFRJUCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignSW52YWxpZCBUb29sdGlwIENvbmZpZ3VyYXRpb24nLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnU0tJUF9TVEVQJyxcbiAgICAgICAgICAgIG5leHRTdGVwOiBjdXJyZW50U3RlcCArIDEsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b29sdGlwIGNvbmZpZ3VyYXRpb24sIHNraXBwaW5nJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVGhlbWUgRGV0ZWN0aW9uIEZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnVVNFX0RFRkFVTFRfVEhFTUUnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1VzaW5nIGRlZmF1bHQgZGFyayB0aGVtZSdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVW5rbm93biBFcnJvcicsIGVycm9yLCB7IGN1cnJlbnRTdGVwIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLCBhYm9ydGluZyB0b3VyJ1xuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xhc3NpZnkgZXJyb3IgdHlwZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBUaGUgZXJyb3Igb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ30gRXJyb3IgdHlwZVxuICAgICAqL1xuICAgIGNsYXNzaWZ5RXJyb3IoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IGVycm9yLnRvU3RyaW5nKCk7XG5cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdlbGVtZW50JykgJiYgbWVzc2FnZS5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgcmV0dXJuICdFTEVNRU5UX05PVF9GT1VORCc7XG4gICAgICB9XG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcygnc3RvcmFnZScpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ3F1b3RhJykpIHtcbiAgICAgICAgcmV0dXJuICdTVE9SQUdFX1VOQVZBSUxBQkxFJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdkcml2ZXInKSB8fCBtZXNzYWdlLmluY2x1ZGVzKCd1bmRlZmluZWQnKSkge1xuICAgICAgICByZXR1cm4gJ0RSSVZFUl9OT1RfTE9BREVEJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkJykgfHwgbWVzc2FnZS5pbmNsdWRlcygndmFsaWRhdGlvbicpKSB7XG4gICAgICAgIHJldHVybiAnSU5WQUxJRF9UT09MVElQJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCd0aGVtZScpKSB7XG4gICAgICAgIHJldHVybiAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnVU5LTk9XTic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBsb2dnZWQgZXJyb3JzXG4gICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiBlcnJvciBlbnRyaWVzXG4gICAgICovXG4gICAgZ2V0RXJyb3JzKCkge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLmVycm9yc107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIGxvZ2dlZCBlcnJvcnNcbiAgICAgKi9cbiAgICBjbGVhckVycm9ycygpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGVycm9yIHN0YXRpc3RpY3NcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBFcnJvciBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgZ2V0U3RhdGlzdGljcygpIHtcbiAgICAgIGNvbnN0IHN0YXRzID0ge1xuICAgICAgICB0b3RhbDogdGhpcy5lcnJvcnMubGVuZ3RoLFxuICAgICAgICBieUNvbnRleHQ6IHt9LFxuICAgICAgICBieVR5cGU6IHt9LFxuICAgICAgICByZWNlbnQ6IHRoaXMuZXJyb3JzLnNsaWNlKC0xMClcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZXJyb3JzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICAvLyBDb3VudCBieSBjb250ZXh0XG4gICAgICAgIHN0YXRzLmJ5Q29udGV4dFtlcnJvci5jb250ZXh0XSA9IChzdGF0cy5ieUNvbnRleHRbZXJyb3IuY29udGV4dF0gfHwgMCkgKyAxO1xuXG4gICAgICAgIC8vIENvdW50IGJ5IHR5cGVcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY2xhc3NpZnlFcnJvcih7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICAgIHN0YXRzLmJ5VHlwZVt0eXBlXSA9IChzdGF0cy5ieVR5cGVbdHlwZV0gfHwgMCkgKyAxO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzdGF0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZ3JhY2VmdWwgZGVncmFkYXRpb24gd2hlbiBEcml2ZXIuanMgZmFpbHMgdG8gbG9hZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGZhbGxiYWNrIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgaGFuZGxlRHJpdmVyTG9hZEZhaWx1cmUoKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKCdEcml2ZXIuanMgTG9hZCBGYWlsdXJlJywgJ0RyaXZlci5qcyBsaWJyYXJ5IGZhaWxlZCB0byBsb2FkJyk7XG5cbiAgICAgIC8vIFNob3cgZmFsbGJhY2sgbWVzc2FnZVxuICAgICAgY29uc3QgZmFsbGJhY2tNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaWQgPSAnb25ib2FyZGluZy1mYWxsYmFjayc7XG4gICAgICBmYWxsYmFja01lc3NhZ2Uuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBib3R0b206IDIwcHg7XG4gICAgICAgIHJpZ2h0OiAyMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMyYTJhMmEpO1xuICAgICAgICBjb2xvcjogdmFyKC0tZmcsICNmZmZmZmYpO1xuICAgICAgICBwYWRkaW5nOiAxNXB4IDIwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMyk7XG4gICAgICAgIHotaW5kZXg6IDk5OTk7XG4gICAgICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGA7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaW5uZXJIVE1MID0gYFxuICAgICAgICA8c3Ryb25nPldlbGNvbWUgdG8gRGFzaENhZGR5ITwvc3Ryb25nPjxicj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDEwcHggMCAwIDA7IGZvbnQtc2l6ZTogMTJweDtcIj5cbiAgICAgICAgICBUaGUgaW50ZXJhY3RpdmUgdG91ciBpcyB1bmF2YWlsYWJsZSwgYnV0IHlvdSBjYW4gZXhwbG9yZSB0aGUgZGFzaGJvYXJkIGZyZWVseS5cbiAgICAgICAgICBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaGVscCBnZXR0aW5nIHN0YXJ0ZWQuXG4gICAgICAgIDwvcD5cbiAgICAgIGA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZmFsbGJhY2tNZXNzYWdlKTtcblxuICAgICAgLy8gQXV0by1yZW1vdmUgYWZ0ZXIgMTAgc2Vjb25kc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChmYWxsYmFja01lc3NhZ2UucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGZhbGxiYWNrTWVzc2FnZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZhbGxiYWNrTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMDAwKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN0b3JhZ2UgdW5hdmFpbGFibGUgc2NlbmFyaW9cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBJbi1tZW1vcnkgc3RvcmFnZSBmYWxsYmFja1xuICAgICAqL1xuICAgIGhhbmRsZVN0b3JhZ2VVbmF2YWlsYWJsZSgpIHtcbiAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCAnTG9jYWwgc3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgICAgY29uc3QgbWVtb3J5U3RvcmFnZSA9IHtcbiAgICAgICAgZGF0YToge30sXG4gICAgICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtrZXldO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc29sZS53YXJuKCdbRXJyb3JIYW5kbGVyXSBVc2luZyBpbi1tZW1vcnkgc3RvcmFnZSAtIHByb2dyZXNzIHdpbGwgbm90IHBlcnNpc3QnKTtcbiAgICAgIHJldHVybiBtZW1vcnlTdG9yYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgZXJyb3IgdG8gdHJhY2tpbmcgc2VydmljZSAocGxhY2Vob2xkZXIpXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JFbnRyeSAtIEVycm9yIGVudHJ5IHRvIHNlbmRcbiAgICAgKi9cbiAgICBzZW5kVG9FcnJvclRyYWNraW5nKGVycm9yRW50cnkpIHtcbiAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciBlcnJvciB0cmFja2luZyBpbnRlZ3JhdGlvblxuICAgICAgLy8gQ291bGQgaW50ZWdyYXRlIHdpdGggU2VudHJ5LCBMb2dSb2NrZXQsIGV0Yy5cbiAgICAgIC8vIEV4YW1wbGU6XG4gICAgICAvLyBpZiAod2luZG93LlNlbnRyeSkge1xuICAgICAgLy8gICBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihuZXcgRXJyb3IoZXJyb3JFbnRyeS5tZXNzYWdlKSwge1xuICAgICAgLy8gICAgIGV4dHJhOiBlcnJvckVudHJ5Lm1ldGFkYXRhXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5FcnJvckhhbmRsZXIgPSBFcnJvckhhbmRsZXI7XG4gIGNvbnNvbGUubG9nKCdbRXJyb3JIYW5kbGVyXSBNb2R1bGUgbG9hZGVkJyk7XG5cbn0pKHdpbmRvdyk7XG47XG4vLyA9PT09PSBEQVNIQk9BUkQgQ09OU1RBTlRTID09PT09XG4vLyBIb25vciBwZXJzaXN0ZWQgaGVhbHRoIHJldGVudGlvbiBzZXR0aW5ncyBmb3IgcG9sbGluZyBjYWRlbmNlcyBzbyB0aGVcbi8vIFNldHRpbmdzIFx1MjE5MiBIZWFsdGggXHUyMTkyIEdsb2JhbCBTZXR0aW5ncyBwYW5lbCBhY3R1YWxseSB0YWtlcyBlZmZlY3QuIFRoZVxuLy8gU1RBVFMgaW50ZXJ2YWwgKHJlc291cmNlL2NvbnRhaW5lciBzdGF0IHNhbXBsaW5nKSBpcyBkcml2ZW4gZnJvbSB0aGVcbi8vIHVzZXItY29uZmlndXJhYmxlIHN0YXRzUG9sbGluZ0ludGVydmFsLiBIRUFMVEggaXMgdGhlIGxpZ2h0d2VpZ2h0IGNhcmRcbi8vIGJhZGdlIHJlZnJlc2ggYW5kIHN0YXlzIGF0IGl0cyBmYXN0IGRlZmF1bHQgdW5sZXNzIG92ZXJyaWRkZW4uXG4oZnVuY3Rpb24gYXBwbHlIZWFsdGhQb2xsaW5nU2V0dGluZ3MoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHJhdyA9ICh0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJyAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5LWhlYWx0aC1zZXR0aW5ncycpKSB8fCBudWxsO1xuICAgIGlmIChyYXcpIHtcbiAgICAgIHZhciBzID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgLy8gdmFsdWVzIGFyZSBzdG9yZWQgaW4gc2Vjb25kczsgREMuUE9MTCBleHBlY3RzIG1pbGxpc2Vjb25kc1xuICAgICAgaWYgKHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgJiYgcy5zdGF0c1BvbGxpbmdJbnRlcnZhbCA+PSA1ICYmIHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgPD0gMzYwMCkge1xuICAgICAgICB3aW5kb3cuX19EQ19TVEFUU19PVkVSUklERSA9IHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgKiAxMDAwO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgXHUyMDE0IGZhbGwgYmFjayB0byBkZWZhdWx0cyBiZWxvdyAqLyB9XG59KSgpO1xuXG5jb25zdCBEQyA9IHtcbiAgTkFNRTogJ0Rhc2hDYWRkeScsXG4gIFBPTEw6IHtcbiAgICBEQVNIQk9BUkQ6ICAxMDAwMCwgICAvLyAxMHMgXHUyMDE0IG1haW4gcmVmcmVzaEFsbCBpbnRlcnZhbFxuICAgIExPR1M6ICAgICAgIDMwMDAsICAgIC8vIDNzICBcdTIwMTQgbG9nIHZpZXdlciB1cGRhdGVzXG4gICAgU1RBVFM6ICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5fX0RDX1NUQVRTX09WRVJSSURFKSB8fCA1MDAwLCAgIC8vIDVzIGRlZmF1bHQgXHUyMDE0IHJlc291cmNlIG1vbml0b3IgcmVmcmVzaCAob3ZlcnJpZGFibGUgdmlhIFNldHRpbmdzIFx1MjE5MiBIZWFsdGgpXG4gICAgV0VBVEhFUjogICAgNjAwMDAwLCAgLy8gMTBtIFx1MjAxNCB3ZWF0aGVyIHdpZGdldCByZWZyZXNoXG4gICAgSEVBTFRIOiAgICAgMTAwMCwgICAgLy8gMXMgIFx1MjAxNCBjYXJkIGhlYWx0aCBiYWRnZSByZWZyZXNoXG4gICAgREVQTE9ZX1NTTDogNTAwMCwgICAgLy8gNXMgIFx1MjAxNCBTU0wgY2VydCBjaGVjayBkdXJpbmcgZGVwbG95XG4gIH0sXG4gIERFTEFZUzoge1xuICAgIEJUTl9SRVNFVDogIDIwMDAsICAgIC8vIEJ1dHRvbiB0ZXh0IHJlc2V0IGFmdGVyIGFjdGlvblxuICAgIFJFTE9BRDogICAgIDUwMDAsICAgIC8vIFBhZ2UgcmVsb2FkIGFmdGVyIHJlc3RhcnRcbiAgICBNT0RBTF9DTE9TRTogNTAwLCAgICAvLyBNb2RhbCBjbG9zZSBhbmltYXRpb25cbiAgICBQT1JUX0NIRUNLOiA1MDAsICAgICAvLyBEZWJvdW5jZSBmb3IgcG9ydCBhdmFpbGFiaWxpdHkgY2hlY2tcbiAgICBERVBMT1lfSU5JVDogMzAwMCwgICAvLyBJbml0aWFsIGRlcGxveSBjZXJ0IGNoZWNrIGRlbGF5XG4gIH0sXG4gIERFRkFVTFRTOiB7XG4gICAgRE5TX1BPUlQ6ICAgICc1MzgwJyxcbiAgICBTRVJWSUNFX1BPUlQ6ICc4MDgwJyxcbiAgICBUVEw6ICAgICAgICAgMzAwLFxuICAgIENBRERZRklMRTogICAnQzpcXFxcY2FkZHlcXFxcQ2FkZHlmaWxlJyxcbiAgfSxcbn07XG5cbi8vIEVycm9yIGhhbmRsZXIgZm9yIHRyYWNraW5nIGlzc3Vlc1xuY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuXG4vLyA9PT09PSBHTE9CQUwgU0lURSBDT05GSUcgKGxvYWRlZCBmcm9tIHNlcnZlciwgY2FjaGVkIGluIGxvY2FsU3RvcmFnZSkgPT09PT1cbi8vIE9ubHkgbm9uLXNlbnNpdGl2ZSBkaXNwbGF5IHByZWZlcmVuY2VzIGFyZSBjYWNoZWQ7IEROUyBJUHMvdG9wb2xvZ3kgYXJlIGZldGNoZWQgZnJvbSBBUElcbmNvbnN0IF9jYWNoZWRDZmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXNoY2FkZHlfc2l0ZV9jb25maWcnKSB8fCAnbnVsbCcpO1xuY29uc3QgU0lURSA9IHtcbiAgdGxkOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnRsZCkgfHwgJy5ob21lJyxcbiAgZG5zSXA6ICcnLFxuICBkbnNQb3J0OiBEQy5ERUZBVUxUUy5ETlNfUE9SVCxcbiAgZG5zU2VydmVyczoge30sXG4gIGNvbmZpZ3VyYXRpb25UeXBlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLmNvbmZpZ3VyYXRpb25UeXBlKSB8fCAnaG9tZWxhYicsXG4gIGRvbWFpbjogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kb21haW4pIHx8ICcnLFxuICBkZWZhdWx0czogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kZWZhdWx0cykgfHwge30sXG4gIHJvdXRpbmdNb2RlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnJvdXRpbmdNb2RlKSB8fCAnc3ViZG9tYWluJyxcbiAgb25ib2FyZGluZ0NvbXBsZXRlZDogZmFsc2Vcbn07XG53aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkID0gKGFzeW5jIGZ1bmN0aW9uIGxvYWRTaXRlQ29uZmlnKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICBpZiAoci5vaykge1xuICAgICAgY29uc3QgYyA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGMudGxkKSBTSVRFLnRsZCA9IGMudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IGMudGxkIDogJy4nICsgYy50bGQ7XG4gICAgICBpZiAoYy5kbnMpIHtcbiAgICAgICAgU0lURS5kbnNJcCA9IGMuZG5zLmlwIHx8ICcnO1xuICAgICAgICBTSVRFLmRuc1BvcnQgPSBjLmRucy5wb3J0IHx8IERDLkRFRkFVTFRTLkROU19QT1JUO1xuICAgICAgfVxuICAgICAgaWYgKGMuZG5zU2VydmVycyAmJiB0eXBlb2YgYy5kbnNTZXJ2ZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhjLmRuc1NlcnZlcnMpKSB7XG4gICAgICAgICAgaWYgKGsgIT09ICdfX3Byb3RvX18nICYmIGsgIT09ICdjb25zdHJ1Y3RvcicgJiYgayAhPT0gJ3Byb3RvdHlwZScpIFNJVEUuZG5zU2VydmVyc1trXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjLmNvbmZpZ3VyYXRpb25UeXBlKSBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID0gYy5jb25maWd1cmF0aW9uVHlwZTtcbiAgICAgIGlmIChjLmRvbWFpbikgU0lURS5kb21haW4gPSBjLmRvbWFpbjtcbiAgICAgIGlmIChjLmRlZmF1bHRzKSBTSVRFLmRlZmF1bHRzID0gYy5kZWZhdWx0cztcbiAgICAgIGlmIChjLnJvdXRpbmdNb2RlKSBTSVRFLnJvdXRpbmdNb2RlID0gYy5yb3V0aW5nTW9kZTtcbiAgICAgIFNJVEUub25ib2FyZGluZ0NvbXBsZXRlZCA9IGMub25ib2FyZGluZ0NvbXBsZXRlZCA9PT0gdHJ1ZTtcbiAgICAgIC8vIENhY2hlIG9ubHkgbm9uLXNlbnNpdGl2ZSBkaXNwbGF5IGNvbmZpZyAoVExELCBkb21haW4sIHJvdXRpbmcgbW9kZSlcbiAgICAgIC8vIEROUyBJUHMgYW5kIHNlcnZlciB0b3BvbG9neSBhcmUgTk9UIGNhY2hlZCBcdTIwMTQgZmV0Y2hlZCBmcm9tIEFQSSBlYWNoIGxvYWRcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdkYXNoY2FkZHlfc2l0ZV9jb25maWcnLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRsZDogU0lURS50bGQsIGNvbmZpZ3VyYXRpb25UeXBlOiBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlLFxuICAgICAgICBkb21haW46IFNJVEUuZG9tYWluLCByb3V0aW5nTW9kZTogU0lURS5yb3V0aW5nTW9kZVxuICAgICAgfSkpO1xuICAgICAgLy8gUmVuZGVyIEROUyBjYXJkcyBkeW5hbWljYWxseSBiYXNlZCBvbiBjb25maWd1cmVkIHNlcnZlcnNcbiAgICAgIHJlbmRlckRuc0NhcmRzKCk7XG4gICAgICAvLyBIaWRlIFRva2VucyBidXR0b24gaWYgbm8gRE5TIHNlcnZlcnMgY29uZmlndXJlZFxuICAgICAgY29uc3QgdG9rZW5zQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS10b2tlbnMnKTtcbiAgICAgIGlmICh0b2tlbnNCdG4pIHRva2Vuc0J0bi5zdHlsZS5kaXNwbGF5ID0gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzKS5sZW5ndGggPyAnJyA6ICdub25lJztcbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG4gIC8vIFVwZGF0ZSBzdGF0aWMgSFRNTCBlbGVtZW50cyB3aXRoIGNvbmZpZ3VyZWQgVExEXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRsZF0nKS5mb3JFYWNoKGVsID0+IGVsLnRleHRDb250ZW50ID0gU0lURS50bGQpO1xuICBjb25zdCB0bGRTdWZmaXggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC10bGQtc3VmZml4Jyk7XG4gIGlmICh0bGRTdWZmaXgpIHRsZFN1ZmZpeC50ZXh0Q29udGVudCA9IFNJVEUudGxkO1xuICBjb25zdCBwcm94eUlwSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtcHJveHktaXAnKTtcbiAgaWYgKHByb3h5SXBJbnB1dCAmJiBTSVRFLmRuc0lwKSB7IHByb3h5SXBJbnB1dC52YWx1ZSA9IFNJVEUuZG5zSXA7IHByb3h5SXBJbnB1dC5wbGFjZWhvbGRlciA9IFNJVEUuZG5zSXA7IH1cbn0pKCk7XG5mdW5jdGlvbiBidWlsZERvbWFpbihzdWIpIHsgcmV0dXJuIHN1YiArIFNJVEUudGxkOyB9XG5mdW5jdGlvbiBidWlsZFNlcnZpY2VVcmwoc3ViKSB7XG4gIGlmIChTSVRFLnJvdXRpbmdNb2RlID09PSAnc3ViZGlyZWN0b3J5JyAmJiBTSVRFLmRvbWFpbikgcmV0dXJuICdodHRwczovLycgKyBTSVRFLmRvbWFpbiArICcvJyArIHN1YjtcbiAgaWYgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnICYmIFNJVEUuZG9tYWluKSByZXR1cm4gJ2h0dHBzOi8vJyArIHN1YiArICcuJyArIFNJVEUuZG9tYWluO1xuICByZXR1cm4gJ2h0dHBzOi8vJyArIGJ1aWxkRG9tYWluKHN1Yik7XG59XG5mdW5jdGlvbiBnZXREbnNTZXJ2ZXJBZGRyKGRuc0lkKSB7XG4gIGNvbnN0IHMgPSBTSVRFLmRuc1NlcnZlcnNbZG5zSWRdO1xuICByZXR1cm4gcyA/IGAke3MuaXB9OiR7cy5wb3J0fWAgOiBidWlsZERvbWFpbihkbnNJZCk7XG59XG4vKiogR2V0IHRoZSBETlMgSUQgd2hvc2UgSVAgbWF0Y2hlcyB0aGUgcHJpbWFyeSBETlMgY29uZmlnIChkbnMuaXApICovXG5mdW5jdGlvbiBnZXRQcmltYXJ5RG5zSWQoKSB7XG4gIGlmICghU0lURS5kbnNJcCkgcmV0dXJuIG51bGw7XG4gIGZvciAoY29uc3QgW2lkLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyhTSVRFLmRuc1NlcnZlcnMpKSB7XG4gICAgaWYgKGluZm8uaXAgPT09IFNJVEUuZG5zSXApIHJldHVybiBpZDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gPT09PT0gRFlOQU1JQyBETlMgQ0FSRCBSRU5ERVJFUiA9PT09PVxuZnVuY3Rpb24gcmVuZGVyRG5zQ2FyZHMoKSB7XG4gIGNvbnN0IHRvcFJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKTtcbiAgaWYgKCF0b3BSb3cpIHJldHVybjtcbiAgY29uc3QgZG5zSWRzID0gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzKTtcbiAgaWYgKCFkbnNJZHMubGVuZ3RoKSByZXR1cm47IC8vIE5vIEROUyBzZXJ2ZXJzIGNvbmZpZ3VyZWQgXHUyMDE0IHNob3cgbm90aGluZ1xuXG4gIGNvbnN0IHN2Z0ljb24gPSAnPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJzZXJ2aWNlLWljb25cIj4nXG4gICAgKyAnPHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxNlwiIHJ4PVwiMlwiIGZpbGw9XCIjMzQ0OTVlXCIvPidcbiAgICArICc8cmVjdCB4PVwiNVwiIHk9XCI2XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjJcIiByeD1cIjFcIiBmaWxsPVwiIzM0OThkYlwiLz4nXG4gICAgKyAnPHJlY3QgeD1cIjVcIiB5PVwiOVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxXCIgZmlsbD1cIiNlY2YwZjFcIi8+J1xuICAgICsgJzxyZWN0IHg9XCI1XCIgeT1cIjExXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjFcIiBmaWxsPVwiI2VjZjBmMVwiLz4nXG4gICAgKyAnPHJlY3QgeD1cIjVcIiB5PVwiMTNcIiB3aWR0aD1cIjhcIiBoZWlnaHQ9XCIxXCIgZmlsbD1cIiNlY2YwZjFcIi8+J1xuICAgICsgJzxyZWN0IHg9XCI1XCIgeT1cIjE1XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjFcIiBmaWxsPVwiI2VjZjBmMVwiLz4nXG4gICAgKyAnPGNpcmNsZSBjeD1cIjE3XCIgY3k9XCIxMVwiIHI9XCIyXCIgZmlsbD1cIiNlNzRjM2NcIi8+J1xuICAgICsgJzxwYXRoIGQ9XCJNMTcgOXY0TTE1IDExaDRcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjFcIi8+PC9zdmc+JztcblxuICBjb25zdCBmaXJzdENoaWxkID0gdG9wUm93LmZpcnN0RWxlbWVudENoaWxkO1xuICBkbnNJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3Qgc2FmZUlkID0gZXNjYXBlSHRtbChpZCk7XG4gICAgY29uc3QgbGFiZWwgPSBlc2NhcGVIdG1sKChTSVRFLmRuc1NlcnZlcnNbaWRdLm5hbWUgfHwgaWQpLnRvVXBwZXJDYXNlKCkpO1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjYXJkLmNsYXNzTmFtZSA9ICdjYXJkJztcbiAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHAnLCBpZCk7XG4gICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ29mZicpO1xuICAgIGNhcmQuaW5uZXJIVE1MID1cbiAgICAgIGA8c3BhbiBpZD1cIiR7c2FmZUlkfS1kb3RcIiBjbGFzcz1cImRvdCBiYWQgYXQtYmxcIj48L3NwYW4+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cInJvd1wiPjxkaXYgY2xhc3M9XCJsb2dvLXdyYXBcIj4ke3N2Z0ljb259PC9kaXY+YFxuICAgICAgKyBgPHNwYW4gY2xhc3M9XCJuYW1lXCI+JHtsYWJlbH08L3NwYW4+PHNwYW4gY2xhc3M9XCJzcGFjZXJcIj48L3NwYW4+YFxuICAgICAgKyBgPHNwYW4gaWQ9XCIke3NhZmVJZH0tcGlsbFwiIGNsYXNzPVwiYmFkZ2Ugb2ZmXCIgZGF0YS1pMThuLWxpdmUtc3RhdHVzPVwiYmluYXJ5XCI+T0ZGPC9zcGFuPjwvZGl2PmBcbiAgICAgICsgYDxkaXYgY2xhc3M9XCJyZXNwb25zZS1yb3dcIj48c3BhbiBpZD1cIiR7c2FmZUlkfS10aW1lXCIgY2xhc3M9XCJyZXNwb25zZS10aW1lXCI+LS08L3NwYW4+PC9kaXY+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cImhlYWx0aC1yb3dcIiBpZD1cImhlYWx0aC0ke3NhZmVJZH1cIj48c3BhbiBpZD1cInVwdGltZS0ke3NhZmVJZH1cIiBjbGFzcz1cInVwdGltZS1jaGlwXCI+LS08L3NwYW4+PGRpdiBjbGFzcz1cInVwdGltZS1taW5pLWJhclwiPjxkaXYgY2xhc3M9XCJmaWxsXCIgaWQ9XCJ1cHRpbWUtYmFyLSR7c2FmZUlkfVwiIHN0eWxlPVwid2lkdGg6IDAlXCI+PC9kaXY+PC9kaXY+PC9kaXY+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cImJ0bi1yb3dcIj5gXG4gICAgICArIGA8YnV0dG9uIGlkPVwiJHtzYWZlSWR9LXJlc3RhcnRcIiBjbGFzcz1cInJlc3RhcnQtYnRuXCIgZGF0YS1pMThuPVwiYWN0aW9uLnJlc3RhcnRcIj5SZXN0YXJ0PC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS11cGRhdGVcIiBjbGFzcz1cInVwZGF0ZS1idG5cIiB0aXRsZT1cIlVwZGF0ZSBETlMgc2VydmVyXCI+XHUyQjA2XHVGRTBGPC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS1vcGVuXCIgZGF0YS1pMThuPVwiYWN0aW9uLm9wZW5cIj5PcGVuPC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS1sb2dzXCIgY2xhc3M9XCJsb2dzLWJ0blwiIGRhdGEtaTE4bj1cImFjdGlvbi5sb2dzXCI+TG9nczwvYnV0dG9uPmBcbiAgICAgICsgYDxidXR0b24gaWQ9XCIke3NhZmVJZH0tc2V0dGluZ3NcIiBjbGFzcz1cInNldHRpbmdzLWJ0blwiPlx1MjY5OVx1RkUwRjwvYnV0dG9uPmBcbiAgICAgICsgYDwvZGl2PmA7XG4gICAgdG9wUm93Lmluc2VydEJlZm9yZShjYXJkLCBmaXJzdENoaWxkKTtcbiAgfSk7XG4gIGlmICh3aW5kb3cuRENJMThuICYmIHdpbmRvdy5EQ0kxOG4uaXNMb2FkZWQoKSkge1xuICAgIHdpbmRvdy5EQ0kxOG4uYXBwbHlUcmFuc2xhdGlvbnMoKTtcbiAgfVxufVxud2luZG93LnJlbmRlckRuc0NhcmRzID0gcmVuZGVyRG5zQ2FyZHM7XG5cbi8vID09PT09IENTUkYgUFJPVEVDVElPTiA9PT09PVxubGV0IGNzcmZUb2tlbiA9IG51bGw7XG5cbi8qKlxuICogR2V0IENTUkYgdG9rZW4gZnJvbSBzZXJ2ZXIgKGNhY2hlZClcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IENTUkYgdG9rZW5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q1NSRlRva2VuKCkge1xuICBpZiAoY3NyZlRva2VuKSByZXR1cm4gY3NyZlRva2VuO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jc3JmLXRva2VuJyk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggQ1NSRiB0b2tlbicpO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGNzcmZUb2tlbiA9IGRhdGEudG9rZW47XG4gICAgcmV0dXJuIGNzcmZUb2tlbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tDU1JGXSBHZXQgVG9rZW4nLCBlcnJvciwgeyBmdW5jdGlvbjogJ2dldENTUkZUb2tlbicgfSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWN1cmUgZmV0Y2ggd3JhcHBlciB0aGF0IGF1dG9tYXRpY2FsbHkgYWRkcyBDU1JGIHRva2VuIHRvIHN0YXRlLWNoYW5naW5nIHJlcXVlc3RzLlxuICogSWYgdGhlIHNlcnZlciByZXR1cm5zIGEgQ1NSRiBlcnJvciAoNDAzIHdpdGggREMtMTAwL0RDLTEwMSksIGF1dG9tYXRpY2FsbHlcbiAqIHJlZnJlc2hlcyB0aGUgdG9rZW4gYW5kIHJldHJpZXMgb25jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBVUkwgdG8gZmV0Y2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gRmV0Y2ggb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8UmVzcG9uc2U+fSBGZXRjaCByZXNwb25zZVxuICovXG5hc3luYyBmdW5jdGlvbiBzZWN1cmVGZXRjaCh1cmwsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBtZXRob2QgPSAob3B0aW9ucy5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IG5lZWRzQ3NyZiA9ICFbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnXS5pbmNsdWRlcyhtZXRob2QpO1xuXG4gIGlmIChuZWVkc0NzcmYpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRDU1JGVG9rZW4oKTtcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAnWC1DU1JGLVRva2VuJzogdG9rZW5cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW0NTUkZdIEFkZCB0byBSZXF1ZXN0JywgZXJyb3IsIHsgZnVuY3Rpb246ICdzZWN1cmVGZXRjaCcgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVmYXVsdCAxNXMgdGltZW91dCBpZiBubyBzaWduYWwgcHJvdmlkZWQgKHByZXZlbnRzIGhhbmdpbmcgcmVxdWVzdHMpXG4gIGlmICghb3B0aW9ucy5zaWduYWwpIHtcbiAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTUwMDApIH07XG4gIH1cblxuICBvcHRpb25zLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCAnc2FtZS1vcmlnaW4nO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG5cbiAgLy8gQXV0by1yZXRyeSBvbmNlIG9uIENTUkYgZmFpbHVyZSAodG9rZW4gbWF5IGhhdmUgYmVlbiByb3RhdGVkIGJ5IFRPVFAgcmUtYXV0aClcbiAgaWYgKG5lZWRzQ3NyZiAmJiByZXNwb25zZS5zdGF0dXMgPT09IDQwMykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UuY2xvbmUoKS5qc29uKCk7XG4gICAgICBpZiAoYm9keS5lcnJvciAmJiAoYm9keS5lcnJvci5pbmNsdWRlcygnREMtMTAwJykgfHwgYm9keS5lcnJvci5pbmNsdWRlcygnREMtMTAxJykpKSB7XG4gICAgICAgIGNzcmZUb2tlbiA9IG51bGw7IC8vIENsZWFyIGNhY2hlZCB0b2tlblxuICAgICAgICBjb25zdCBmcmVzaFRva2VuID0gYXdhaXQgZ2V0Q1NSRlRva2VuKCk7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHsgLi4ub3B0aW9ucy5oZWFkZXJzLCAnWC1DU1JGLVRva2VuJzogZnJlc2hUb2tlbiB9O1xuICAgICAgICAvLyBOZXcgc2lnbmFsIGZvciByZXRyeSAob2xkIG9uZSBtYXkgaGF2ZSBiZWVuIGNvbnN1bWVkKVxuICAgICAgICBvcHRpb25zLnNpZ25hbCA9IEFib3J0U2lnbmFsLnRpbWVvdXQoMTUwMDApO1xuICAgICAgICByZXR1cm4gZmV0Y2godXJsLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAvLyBJZiBjbG9uZS9qc29uIGZhaWxzLCByZXR1cm4gb3JpZ2luYWwgcmVzcG9uc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8vID09PT09IEFQSSBDQUxMIEhFTFBFUlMgPT09PT1cblxuLyoqIFBPU1QgSlNPTiBhbmQgcmV0dXJuIHBhcnNlZCByZXNwb25zZS4gVGhyb3dzIG9uIEhUVFAgb3IgQVBJIGVycm9yLiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9zdEpTT04odXJsLCBkYXRhKSB7XG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3AuanNvbigpO1xuICBpZiAoIXJlc3Aub2sgfHwgcmVzdWx0LnN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCBgUmVxdWVzdCBmYWlsZWQgKCR7cmVzcC5zdGF0dXN9KWApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBHRVQgSlNPTiBhbmQgcmV0dXJuIHBhcnNlZCByZXNwb25zZS4gVGhyb3dzIG9uIEhUVFAgZXJyb3Igd2l0aCBzZXJ2ZXIgbWVzc2FnZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwpO1xuICBpZiAoIXJlc3Aub2spIHtcbiAgICBsZXQgbXNnID0gYFJlcXVlc3QgZmFpbGVkICgke3Jlc3Auc3RhdHVzfSlgO1xuICAgIHRyeSB7IGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLmpzb24oKTsgbXNnID0gYm9keS5lcnJvciB8fCBtc2c7IH0gY2F0Y2ggKF8pIHt9XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gIH1cbiAgcmV0dXJuIHJlc3AuanNvbigpO1xufVxuXG4vKiogREVMRVRFIHJlcXVlc3QuIFJldHVybnMgcGFyc2VkIEpTT04gcmVzcG9uc2UuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVBUEkodXJsKSB7XG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gIGlmICghcmVzcC5vayB8fCByZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8IGBEZWxldGUgZmFpbGVkICgke3Jlc3Auc3RhdHVzfSlgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJ1biBhbiBhc3luYyBvcGVyYXRpb24gd2l0aCBidXR0b24gbG9hZGluZyBzdGF0ZS5cbiAqIERpc2FibGVzIHRoZSBidXR0b24sIHNob3dzIGxvYWRpbmcgdGV4dCwgcmVzdG9yZXMgb24gY29tcGxldGUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBidG4gLSBCdXR0b24gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IGxvYWRpbmdUZXh0IC0gVGV4dCB0byBzaG93IHdoaWxlIGxvYWRpbmcgKGUuZy4gJ1NhdmluZy4uLicpXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBhc3luY0ZuIC0gQXN5bmMgZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBPcHRpb25zOiB7IHN1Y2Nlc3NUZXh0LCByZXNldERlbGF5IH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aEJ1dHRvbihidG4sIGxvYWRpbmdUZXh0LCBhc3luY0ZuLCBvcHRzID0ge30pIHtcbiAgY29uc3Qgb3JpZ2luYWwgPSBidG4uaW5uZXJIVE1MO1xuICBjb25zdCB7IHN1Y2Nlc3NUZXh0ID0gJ1x1MjcwNScsIHJlc2V0RGVsYXkgPSBEQy5ERUxBWVMuQlROX1JFU0VUIH0gPSBvcHRzO1xuICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICBidG4uaW5uZXJIVE1MID0gbG9hZGluZ1RleHQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXN5bmNGbigpO1xuICAgIGJ0bi5pbm5lckhUTUwgPSBzdWNjZXNzVGV4dDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLmlubmVySFRNTCA9IG9yaWdpbmFsOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgfSwgcmVzZXREZWxheSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGJ0bi5pbm5lckhUTUwgPSBvcmlnaW5hbDtcbiAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbi8qKiBTaG93L2hpZGUgYSBtb2RhbCBieSBJRCAqL1xuZnVuY3Rpb24gb3Blbk1vZGFsKGlkKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKT8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xufVxuZnVuY3Rpb24gY2xvc2VNb2RhbChpZCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk/LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbn1cblxuLyoqIFdpcmUgYmFja2Ryb3AtY2xpY2sgY2xvc2UgKyBvcHRpb25hbCBjbG9zZSBidXR0b25zIGZvciBhIG1vZGFsIGVsZW1lbnQgKi9cbmZ1bmN0aW9uIHdpcmVNb2RhbChtb2RhbCwgLi4uY2xvc2VCdG5zKSB7XG4gIGlmICghbW9kYWwpIHJldHVybjtcbiAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7IH0pO1xuICAvLyBTa2lwIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSByZWFsIGxpc3RlbmVyIHRhcmdldC4gV2l0aG91dCB0aGlzIGd1YXJkLCBhXG4gIC8vIHNpbmdsZSB0eXBvIChlLmcuIHBhc3NpbmcgYSBmdW5jdGlvbiBvciBudWxsIGluc3RlYWQgb2YgYSBidXR0b24gZWxlbWVudClcbiAgLy8gdGhyb3dzIGFuZCBhYm9ydHMgdGhlIHJlc3Qgb2YgdGhlIGNhbGxpbmcgbW9kdWxlJ3MgaW5pdCBcdTIwMTQgd2hpY2ggY2FuIHRha2VcbiAgLy8gZG93biBsaWNlbnNlLmpzIChGUkVFIFRJRVIgYmFkZ2UpLCBUT1RQIHdpcmluZywgZXRjLlxuICBjbG9zZUJ0bnMuZm9yRWFjaChidG4gPT4ge1xuICAgIGlmIChidG4gJiYgdHlwZW9mIGJ0bi5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKiBUb2FzdC1zdHlsZSBub3RpZmljYXRpb24gKHJlcGxhY2VzIGFsbCBhbGVydCgpIHVzYWdlKSAqL1xuZnVuY3Rpb24gc2hvd05vdGlmaWNhdGlvbih0ZXh0LCB0eXBlID0gJ2luZm8nLCBkdXJhdGlvbiA9IDMwMDApIHtcbiAgY29uc3QgZXhpc3RpbmdOb3RpZiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kZXBsb3ktbm90aWZpY2F0aW9uJyk7XG4gIGlmIChleGlzdGluZ05vdGlmKSBleGlzdGluZ05vdGlmLnJlbW92ZSgpO1xuXG4gIGNvbnN0IGNvbG9ycyA9IHtcbiAgICBpbmZvOiAgICB7IGJnOiAnIzIxOTZGMycsICAgICAgIGZnOiAnI2ZmZicgfSxcbiAgICBzdWNjZXNzOiB7IGJnOiAndmFyKC0tb2stYmcpJywgIGZnOiAndmFyKC0tb2stZmcpJyB9LFxuICAgIGVycm9yOiAgIHsgYmc6ICcjZjQ0MzM2JywgICAgICAgZmc6ICcjZmZmJyB9LFxuICAgIHdhcm5pbmc6IHsgYmc6ICcjZmY5ODAwJywgICAgICAgZmc6ICcjZmZmJyB9XG4gIH07XG5cbiAgY29uc3QgYyA9IGNvbG9yc1t0eXBlXSB8fCBjb2xvcnMuaW5mbztcbiAgY29uc3QgbXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1zZy5jbGFzc05hbWUgPSAnZGVwbG95LW5vdGlmaWNhdGlvbic7XG4gIG1zZy50ZXh0Q29udGVudCA9IHRleHQ7XG4gIG1zZy5zdHlsZS5jc3NUZXh0ID0gYFxuICAgIHBvc2l0aW9uOiBmaXhlZDsgdG9wOiAyMHB4OyByaWdodDogMjBweDtcbiAgICBiYWNrZ3JvdW5kOiAke2MuYmd9OyBjb2xvcjogJHtjLmZnfTtcbiAgICBwYWRkaW5nOiAxNnB4IDI0cHg7IGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwwLDAsLjMpO1xuICAgIHotaW5kZXg6IDEwMDAwOyBhbmltYXRpb246IHNsaWRlSW4gMC4zcyBlYXNlLW91dDtcbiAgICBtYXgtd2lkdGg6IDQwMHB4OyB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7IGZvbnQtc2l6ZTogMTRweDtcbiAgYDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtc2cpO1xuICBpZiAoZHVyYXRpb24gPiAwKSBzZXRUaW1lb3V0KCgpID0+IG1zZy5yZW1vdmUoKSwgZHVyYXRpb24pO1xufVxuXG4vKiogUmVsYXRpdmUgdGltZSBkaXNwbGF5IChlLmcuIFwiNW0gYWdvXCIsIFwiMmggYWdvXCIpICovXG5mdW5jdGlvbiB0aW1lQWdvKHRzKSB7XG4gIGNvbnN0IGRpZmYgPSBEYXRlLm5vdygpIC0gbmV3IERhdGUodHMpLmdldFRpbWUoKTtcbiAgaWYgKGRpZmYgPCA2MDAwMCkgcmV0dXJuICdqdXN0IG5vdyc7XG4gIGlmIChkaWZmIDwgMzYwMDAwMCkgcmV0dXJuIE1hdGguZmxvb3IoZGlmZiAvIDYwMDAwKSArICdtIGFnbyc7XG4gIGlmIChkaWZmIDwgODY0MDAwMDApIHJldHVybiBNYXRoLmZsb29yKGRpZmYgLyAzNjAwMDAwKSArICdoIGFnbyc7XG4gIHJldHVybiBNYXRoLmZsb29yKGRpZmYgLyA4NjQwMDAwMCkgKyAnZCBhZ28nO1xufVxuXG4vLyA9PT09PSBTQUZFIFNUT1JBR0UgV1JBUFBFUlMgPT09PT1cbi8vIFByZXZlbnRzIGNyYXNoZXMgaW4gU2FmYXJpIHByaXZhdGUgYnJvd3NpbmcsIHF1b3RhIGV4Y2VlZGVkLCBvciByZXN0cmljdGVkIGVudmlyb25tZW50c1xuZnVuY3Rpb24gc2FmZUdldChrZXksIGZhbGxiYWNrID0gbnVsbCkge1xuICB0cnkgeyBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsgcmV0dXJuIHYgIT09IG51bGwgPyB2IDogZmFsbGJhY2s7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuIGZhbGxiYWNrOyB9XG59XG5mdW5jdGlvbiBzYWZlU2V0KGtleSwgdmFsdWUpIHtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7IH0gY2F0Y2ggKF8pIHsgLyogcXVvdGEgZXhjZWVkZWQgb3IgcHJpdmF0ZSBtb2RlICovIH1cbn1cbmZ1bmN0aW9uIHNhZmVSZW1vdmUoa2V5KSB7XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5mdW5jdGlvbiBzYWZlU2Vzc2lvbkdldChrZXksIGZhbGxiYWNrID0gbnVsbCkge1xuICB0cnkgeyBjb25zdCB2ID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrZXkpOyByZXR1cm4gdiAhPT0gbnVsbCA/IHYgOiBmYWxsYmFjazsgfSBjYXRjaCAoXykgeyByZXR1cm4gZmFsbGJhY2s7IH1cbn1cbmZ1bmN0aW9uIHNhZmVTZXNzaW9uU2V0KGtleSwgdmFsdWUpIHtcbiAgdHJ5IHsgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTsgfSBjYXRjaCAoXykge31cbn1cbi8qKiBQYXJzZSBKU09OIGZyb20gbG9jYWxTdG9yYWdlIHdpdGggZmFsbGJhY2sgXHUyMDE0IGF2b2lkcyB0cnkvY2F0Y2ggYXQgZXZlcnkgY2FsbCBzaXRlICovXG5mdW5jdGlvbiBzYWZlR2V0SlNPTihrZXksIGZhbGxiYWNrID0gbnVsbCkge1xuICB0cnkgeyBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsgcmV0dXJuIHYgPyBKU09OLnBhcnNlKHYpIDogZmFsbGJhY2s7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuIGZhbGxiYWNrOyB9XG59XG5cbi8qKiBFc2NhcGUgSFRNTCBlbnRpdGllcyBmb3Igc2FmZSBpbm5lckhUTUwgaW5zZXJ0aW9uIChoYW5kbGVzIGJvdGggY29udGVudCBhbmQgYXR0cmlidXRlcykgKi9cbmZ1bmN0aW9uIGVzY2FwZUh0bWwodGV4dCkge1xuICByZXR1cm4gU3RyaW5nKHRleHQgPz8gJycpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JykucmVwbGFjZSgvJy9nLCAnJiMzOTsnKTtcbn1cblxuLyoqIEluamVjdCBtb2RhbCBIVE1MIGludG8gRE9NIChpZGVtcG90ZW50IFx1MjAxNCBza2lwcyBpZiBlbGVtZW50IGFscmVhZHkgZXhpc3RzKSAqL1xuZnVuY3Rpb24gaW5qZWN0TW9kYWwoaWQsIGh0bWwpIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSkgcmV0dXJuO1xuICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG59XG5cbi8vID09PT09IEVWRU5UIEJVUyA9PT09PVxuLy8gTGlnaHR3ZWlnaHQgcHViL3N1YiBmb3IgY3Jvc3MtbW9kdWxlIGNvbW11bmljYXRpb24gd2l0aG91dCB3aW5kb3cgZ2xvYmFscy5cbi8vIFVzYWdlOiBEQ19CVVMub24oJ3NlcnZpY2VzOmxvYWRlZCcsIGhhbmRsZXIpOyBEQ19CVVMuZW1pdCgnc2VydmljZXM6bG9hZGVkJywgZGF0YSk7XG5jb25zdCBEQ19CVVMgPSB7XG4gIF9oYW5kbGVyczoge30sXG4gIG9uKGV2ZW50LCBmbikgeyAodGhpcy5faGFuZGxlcnNbZXZlbnRdIHx8PSBbXSkucHVzaChmbik7IH0sXG4gIG9mZihldmVudCwgZm4pIHsgdGhpcy5faGFuZGxlcnNbZXZlbnRdID0gdGhpcy5faGFuZGxlcnNbZXZlbnRdPy5maWx0ZXIoaCA9PiBoICE9PSBmbik7IH0sXG4gIGVtaXQoZXZlbnQsIGRhdGEpIHsgdGhpcy5faGFuZGxlcnNbZXZlbnRdPy5mb3JFYWNoKGZuID0+IGZuKGRhdGEpKTsgfVxufTtcblxuLy8gPT09PT0gQ0VOVFJBTElaRUQgQVBQIFNUQVRFID09PT09XG4vLyBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgc2VydmljZXMgYXJyYXkuIE1vZHVsZXMgc2hvdWxkIHVzZSBBcHBTdGF0ZVxuLy8gaW5zdGVhZCBvZiBtdXRhdGluZyB3aW5kb3cuQVBQUyBkaXJlY3RseS4gRW1pdHMgJ2FwcHM6Y2hhbmdlZCcgb24gdXBkYXRlcy5cbmNvbnN0IEFwcFN0YXRlID0ge1xuICBfYXBwczogW10sXG4gIGdldEFwcHMoKSB7IHJldHVybiB0aGlzLl9hcHBzOyB9LFxuICBzZXRBcHBzKGFwcHMpIHsgdGhpcy5fYXBwcyA9IGFwcHM7IHdpbmRvdy5BUFBTID0gYXBwczsgRENfQlVTLmVtaXQoJ2FwcHM6Y2hhbmdlZCcsIGFwcHMpOyB9LFxuICBmaW5kQXBwKGlkKSB7IHJldHVybiB0aGlzLl9hcHBzLmZpbmQoYSA9PiBhLmlkID09PSBpZCk7IH0sXG4gIGFkZEFwcChhcHApIHsgdGhpcy5fYXBwcy5wdXNoKGFwcCk7IHdpbmRvdy5BUFBTID0gdGhpcy5fYXBwczsgRENfQlVTLmVtaXQoJ2FwcHM6Y2hhbmdlZCcsIHRoaXMuX2FwcHMpOyB9LFxuICByZW1vdmVBcHAoaWQpIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLl9hcHBzLmZpbmRJbmRleChhID0+IGEuaWQgPT09IGlkKTtcbiAgICBpZiAoaWR4ID4gLTEpIHsgdGhpcy5fYXBwcy5zcGxpY2UoaWR4LCAxKTsgd2luZG93LkFQUFMgPSB0aGlzLl9hcHBzOyBEQ19CVVMuZW1pdCgnYXBwczpjaGFuZ2VkJywgdGhpcy5fYXBwcyk7IH1cbiAgICByZXR1cm4gaWR4ID4gLTE7XG4gIH0sXG4gIHVwZGF0ZUFwcChpZCwgY2hhbmdlcykge1xuICAgIGNvbnN0IGFwcCA9IHRoaXMuX2FwcHMuZmluZChhID0+IGEuaWQgPT09IGlkKTtcbiAgICBpZiAoYXBwKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhjaGFuZ2VzKSkge1xuICAgICAgICBpZiAoayAhPT0gJ19fcHJvdG9fXycgJiYgayAhPT0gJ2NvbnN0cnVjdG9yJyAmJiBrICE9PSAncHJvdG90eXBlJykgYXBwW2tdID0gdjtcbiAgICAgIH1cbiAgICAgIERDX0JVUy5lbWl0KCdhcHBzOmNoYW5nZWQnLCB0aGlzLl9hcHBzKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcDtcbiAgfVxufTtcbjtcbi8vID09PT09PT09PT0gU0tFTEVUT04gTE9BRElORyBQTEFDRUhPTERFUlMgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBjcmVhdGVTa2VsZXRvbkNhcmQoKSB7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNhcmQuY2xhc3NOYW1lID0gJ3NrZWxldG9uLWNhcmQnO1xuICAgIGNhcmQuaW5uZXJIVE1MID1cbiAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHhcIj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjQ4cHg7aGVpZ2h0OjQ4cHg7Ym9yZGVyLXJhZGl1czo4cHg7ZmxleC1zaHJpbms6MFwiPjwvZGl2PicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImZsZXg6MVwiPicgK1xuICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2tlbGV0b24tYmFyXCIgc3R5bGU9XCJ3aWR0aDo2MCU7aGVpZ2h0OjE0cHg7bWFyZ2luLWJvdHRvbTo2cHhcIj48L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cInNrZWxldG9uLWJhclwiIHN0eWxlPVwid2lkdGg6MzUlO2hlaWdodDoxMHB4XCI+PC9kaXY+JyArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjQycHg7aGVpZ2h0OjIycHg7Ym9yZGVyLXJhZGl1czoxMXB4XCI+PC9kaXY+JyArXG4gICAgICAnPC9kaXY+JyArXG4gICAgICAnPGRpdiBjbGFzcz1cInNrZWxldG9uLWJhclwiIHN0eWxlPVwid2lkdGg6NDUlO2hlaWdodDoxMnB4O21hcmdpbi1ib3R0b206MTBweFwiPjwvZGl2PicgK1xuICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOmF1dG9cIj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjY0cHg7aGVpZ2h0OjI4cHg7Ym9yZGVyLXJhZGl1czo4cHhcIj48L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjY0cHg7aGVpZ2h0OjI4cHg7Ym9yZGVyLXJhZGl1czo4cHhcIj48L2Rpdj4nICtcbiAgICAgICc8L2Rpdj4nO1xuICAgIHJldHVybiBjYXJkO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1NrZWxldG9ucyhjb3VudCkge1xuICAgIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZHMnKTtcbiAgICBpZiAoIWdyaWQgfHwgZ3JpZC5xdWVyeVNlbGVjdG9yKCcuY2FyZCcpKSByZXR1cm47IC8vIERvbid0IHNob3cgaWYgcmVhbCBjYXJkcyBleGlzdFxuICAgIGNvdW50ID0gY291bnQgfHwgNjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgc2sgPSBjcmVhdGVTa2VsZXRvbkNhcmQoKTtcbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoc2spO1xuICAgICAgLy8gU3RhZ2dlciBmYWRlLWluXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgc2suY2xhc3NMaXN0LmFkZCgnbG9hZGVkJyk7IH0sIGkgKiA2MCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGlkZVNrZWxldG9ucygpIHtcbiAgICBjb25zdCBncmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmRzJyk7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG4gICAgdmFyIHNrZWxldG9ucyA9IGdyaWQucXVlcnlTZWxlY3RvckFsbCgnLnNrZWxldG9uLWNhcmQnKTtcbiAgICBpZiAoIXNrZWxldG9ucy5sZW5ndGgpIHJldHVybjtcblxuICAgIHNrZWxldG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzaywgaSkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNrLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHNrLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC0xMHB4KSc7XG4gICAgICB9LCBpICogMjUpO1xuICAgIH0pO1xuICAgIC8vIFJlbW92ZSBhZnRlciBhbmltYXRpb25cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNrZWxldG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzaykgeyBpZiAoc2sucGFyZW50Tm9kZSkgc2sucmVtb3ZlKCk7IH0pO1xuICAgIH0sIHNrZWxldG9ucy5sZW5ndGggKiAyNSArIDMwMCk7XG4gIH1cblxuICB3aW5kb3cuU2tlbGV0b25Mb2FkZXIgPSB7IHNob3c6IHNob3dTa2VsZXRvbnMsIGhpZGU6IGhpZGVTa2VsZXRvbnMgfTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFRIRU1FIENPTlRST0xMRVIgPT09PT09PT09PVxuLy8gVXNlci1jcmVhdGVkIHRoZW1lcyBhcmUgc3RvcmVkIHNlcnZlci1zaWRlIGFzIGluZGl2aWR1YWwgSlNPTiBmaWxlcy5cbi8vIGxvY2FsU3RvcmFnZSBjYWNoZXMgdGhlbSBmb3IgaW5zdGFudCBsb2FkOyBzZXJ2ZXIgaXMgc291cmNlIG9mIHRydXRoLlxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFRIRU1FX0tFWSA9ICd0aGVtZSc7XG4gIHZhciBVU0VSX1RIRU1FU19LRVkgPSAndXNlci10aGVtZXMnO1xuICB2YXIgTEVHQUNZX0NVU1RPTV9LRVkgPSAnY3VzdG9tLXRoZW1lJztcblxuICB2YXIgQlVJTFRJTl9USEVNRVMgPSBbJ2RhcmsnLCAnbGlnaHQnLCAnYmx1ZScsICdibGFjaycsICdub3JkJywgJ2RyYWN1bGEnLCAnc29sYXJpemVkLWRhcmsnLCAnc29sYXJpemVkLWxpZ2h0JywgJ3RheGknLCAnb2NlYW4nXTtcbiAgdmFyIFRIRU1FUyA9IEJVSUxUSU5fVEhFTUVTLnNsaWNlKCk7XG5cbiAgdmFyIFRIRU1FX1BST1BTID0gW1xuICAgICdiZycsICdmZycsICdtdXRlZCcsICdmZy1tdXRlZCcsICdjYXJkLWJhc2UnLCAnY2FyZC1iZycsICdib3JkZXInLFxuICAgICdob3ZlcicsICdjYXJkLWhvdmVyJywgJ2Jhc2UnLFxuICAgICdvay1iZycsICdvay1mZycsICdiYWQtYmcnLCAnYmFkLWZnJywgJ2RvdC1vaycsICdkb3QtYmFkJywgJ3VwdGltZScsXG4gICAgJ3N1Y2Nlc3MnLCAnZXJyb3InLCAnd2FybmluZycsXG4gICAgJ2FjY2VudCcsICdhY2NlbnQtc3Ryb25nJ1xuICBdO1xuXG4gIC8vIEJhc2UgcHJvcHMgdGhlIHVzZXIgcGlja3MgaW4gdGhlIGJ1aWxkZXIgKHN1YnNldCBvZiBUSEVNRV9QUk9QUylcbiAgdmFyIEJBU0VfUFJPUFMgPSBbXG4gICAgJ2JnJywgJ2ZnJywgJ211dGVkJywgJ2NhcmQtYmFzZScsICdjYXJkLWJnJywgJ2JvcmRlcicsXG4gICAgJ29rLWJnJywgJ29rLWZnJywgJ2JhZC1iZycsICdiYWQtZmcnLCAnZG90LW9rJywgJ2RvdC1iYWQnLCAndXB0aW1lJyxcbiAgICAnYWNjZW50JywgJ2FjY2VudC1zdHJvbmcnXG4gIF07XG5cbiAgLy8gUHJvcHMgdGhhdCBhcmUgYXV0by1kZXJpdmVkIGlmIG5vdCBleHBsaWNpdGx5IHNldFxuICB2YXIgREVSSVZFRF9QUk9QUyA9IFsnZmctbXV0ZWQnLCAnaG92ZXInLCAnY2FyZC1ob3ZlcicsICdiYXNlJywgJ3N1Y2Nlc3MnLCAnZXJyb3InLCAnd2FybmluZyddO1xuXG4gIHZhciBUSEVNRV9DT0xPUlMgPSB7XG4gICAgZGFyazogICAgICAgICAgICAgeyBiZzogJyMwYjBmMWEnLCBmZzogJyNlOGVjZjUnLCBtdXRlZDogJyM5YWE2YmYnLCAnZmctbXV0ZWQnOiAnIzZiN2E5NCcsICdjYXJkLWJhc2UnOiAnIzEyMTgyNicsICdjYXJkLWJnJzogJyMxMjE4MjYnLCBib3JkZXI6ICcjMjYzNTUyJywgaG92ZXI6ICcjMWEyMjM1JywgJ2NhcmQtaG92ZXInOiAnIzE2MWUyZScsIGJhc2U6ICcjMTUxYzJiJywgJ29rLWJnJzogJyMwYzI0MzAnLCAnb2stZmcnOiAnIzdlZjJmZicsICdiYWQtYmcnOiAnIzJhMTIxYScsICdiYWQtZmcnOiAnI2ZmOWFhMycsICdkb3Qtb2snOiAnIzM1ZDFmZicsICdkb3QtYmFkJzogJyNmZjVmN2EnLCB1cHRpbWU6ICcjMzVkMWZmJywgc3VjY2VzczogJyM0Y2FmNTAnLCBlcnJvcjogJyNlNzRjM2MnLCB3YXJuaW5nOiAnI2YzOWMxMicsIGFjY2VudDogJyM4RkQ2RkYnLCAnYWNjZW50LXN0cm9uZyc6ICcjMUY3QkZGJyB9LFxuICAgIGxpZ2h0OiAgICAgICAgICAgIHsgYmc6ICcjZjZmN2ZiJywgZmc6ICcjMGYxMTE1JywgbXV0ZWQ6ICcjNWY2YjdhJywgJ2ZnLW11dGVkJzogJyM4OTkzYTQnLCAnY2FyZC1iYXNlJzogJyNmZmZmZmYnLCAnY2FyZC1iZyc6ICcjZmZmZmZmJywgYm9yZGVyOiAnI2UyZTdlZicsIGhvdmVyOiAnI2VlZjFmNicsICdjYXJkLWhvdmVyJzogJyNmNWY2ZmEnLCBiYXNlOiAnI2ViZWVmMycsICdvay1iZyc6ICcjZWFmZmYxJywgJ29rLWZnJzogJyMwYTdjM2EnLCAnYmFkLWJnJzogJyNmZmVmZWYnLCAnYmFkLWZnJzogJyNiMDAwMjAnLCAnZG90LW9rJzogJyMwZmIxNWEnLCAnZG90LWJhZCc6ICcjZDkzYjNiJywgdXB0aW1lOiAnIzBmYjE1YScsIHN1Y2Nlc3M6ICcjMGE3YzNhJywgZXJyb3I6ICcjYjAwMDIwJywgd2FybmluZzogJyNkNjhhMDAnLCBhY2NlbnQ6ICcjNGE5MGQ5JywgJ2FjY2VudC1zdHJvbmcnOiAnIzI1NjNlYicsIGxpZ2h0Qmc6IHRydWUgfSxcbiAgICBibHVlOiAgICAgICAgICAgICB7IGJnOiAnIzE5MDhBQycsIGZnOiAnI2U4ZjFmZicsIG11dGVkOiAnI2Q2ZTJmZicsICdmZy1tdXRlZCc6ICcjOWVhZmRiJywgJ2NhcmQtYmFzZSc6ICcjMGQxNTMzJywgJ2NhcmQtYmcnOiAnIzBkMTUzMycsIGJvcmRlcjogJyMxYzJkNmEnLCBob3ZlcjogJyMxNDFmNGEnLCAnY2FyZC1ob3Zlcic6ICcjMTExYTNlJywgYmFzZTogJyMwZjE4NDAnLCAnb2stYmcnOiAnIzE2MjA0MCcsICdvay1mZyc6ICcjZWRmZmZmJywgJ2JhZC1iZyc6ICcjMGEwZTI0JywgJ2JhZC1mZyc6ICcjZmZiM2MwJywgJ2RvdC1vayc6ICcjYzdlNWZmJywgJ2RvdC1iYWQnOiAnI2ZmZDZkYycsIHVwdGltZTogJyM3ZWM4ZmYnLCBzdWNjZXNzOiAnIzdlYzhmZicsIGVycm9yOiAnI2ZmYjNjMCcsIHdhcm5pbmc6ICcjZmZkMDgwJywgYWNjZW50OiAnIzljZDRmZicsICdhY2NlbnQtc3Ryb25nJzogJyM2ZmIyZmYnIH0sXG4gICAgYmxhY2s6ICAgICAgICAgICAgeyBiZzogJyMwZTBlMGUnLCBmZzogJyNmNWY1ZjUnLCBtdXRlZDogJyM5OTk5OTknLCAnZmctbXV0ZWQnOiAnIzY2NjY2NicsICdjYXJkLWJhc2UnOiAnIzFhMWExYScsICdjYXJkLWJnJzogJyMxYTFhMWEnLCBib3JkZXI6ICcjMmUyZTJlJywgaG92ZXI6ICcjMjQyNDI0JywgJ2NhcmQtaG92ZXInOiAnIzIwMjAyMCcsIGJhc2U6ICcjMTYxNjE2JywgJ29rLWJnJzogJyMwZjJhMTInLCAnb2stZmcnOiAnIzY2ZmY3YScsICdiYWQtYmcnOiAnIzJhMGYwZicsICdiYWQtZmcnOiAnI2ZmNmI2YicsICdkb3Qtb2snOiAnIzRjYWY1MCcsICdkb3QtYmFkJzogJyNmZjQ0NDQnLCB1cHRpbWU6ICcjZTBlMGUwJywgc3VjY2VzczogJyM0Y2FmNTAnLCBlcnJvcjogJyNmZjQ0NDQnLCB3YXJuaW5nOiAnI2ZmOTgwMCcsIGFjY2VudDogJyNFNjM5NDYnLCAnYWNjZW50LXN0cm9uZyc6ICcjQzYyODI4JyB9LFxuICAgIG5vcmQ6ICAgICAgICAgICAgIHsgYmc6ICcjMmUzNDQwJywgZmc6ICcjZWNlZmY0JywgbXV0ZWQ6ICcjODFhMWMxJywgJ2ZnLW11dGVkJzogJyM2ODgyYTAnLCAnY2FyZC1iYXNlJzogJyMzYjQyNTInLCAnY2FyZC1iZyc6ICcjM2I0MjUyJywgYm9yZGVyOiAnIzRjNTY2YScsIGhvdmVyOiAnIzQzNGM1ZScsICdjYXJkLWhvdmVyJzogJyMzZjQ4NTgnLCBiYXNlOiAnIzM1M2M0YScsICdvay1iZyc6ICcjMmQ0ZjNlJywgJ29rLWZnJzogJyNhM2JlOGMnLCAnYmFkLWJnJzogJyM0YTJjMmEnLCAnYmFkLWZnJzogJyNiZjYxNmEnLCAnZG90LW9rJzogJyNhM2JlOGMnLCAnZG90LWJhZCc6ICcjYmY2MTZhJywgdXB0aW1lOiAnI2EzYmU4YycsIHN1Y2Nlc3M6ICcjYTNiZThjJywgZXJyb3I6ICcjYmY2MTZhJywgd2FybmluZzogJyNlYmNiOGInLCBhY2NlbnQ6ICcjODhjMGQwJywgJ2FjY2VudC1zdHJvbmcnOiAnIzVlODFhYycgfSxcbiAgICBkcmFjdWxhOiAgICAgICAgICB7IGJnOiAnIzI4MmEzNicsIGZnOiAnI2Y4ZjhmMicsIG11dGVkOiAnIzYyNzJhNCcsICdmZy1tdXRlZCc6ICcjNTE1ZDg1JywgJ2NhcmQtYmFzZSc6ICcjNDQ0NzVhJywgJ2NhcmQtYmcnOiAnIzQ0NDc1YScsIGJvcmRlcjogJyM2MjcyYTQnLCBob3ZlcjogJyM0ZTUxNzAnLCAnY2FyZC1ob3Zlcic6ICcjNDk0YzYzJywgYmFzZTogJyMzNjM4NDgnLCAnb2stYmcnOiAnIzFlM2EyZScsICdvay1mZyc6ICcjNTBmYTdiJywgJ2JhZC1iZyc6ICcjM2QxYTFhJywgJ2JhZC1mZyc6ICcjZmY1NTU1JywgJ2RvdC1vayc6ICcjNTBmYTdiJywgJ2RvdC1iYWQnOiAnI2ZmNTU1NScsIHVwdGltZTogJyM1MGZhN2InLCBzdWNjZXNzOiAnIzUwZmE3YicsIGVycm9yOiAnI2ZmNTU1NScsIHdhcm5pbmc6ICcjZjFmYThjJywgYWNjZW50OiAnI2JkOTNmOScsICdhY2NlbnQtc3Ryb25nJzogJyM4YmU5ZmQnIH0sXG4gICAgJ3NvbGFyaXplZC1kYXJrJzogeyBiZzogJyMwMDJiMzYnLCBmZzogJyM4Mzk0OTYnLCBtdXRlZDogJyM1ODZlNzUnLCAnZmctbXV0ZWQnOiAnIzRhNWY2NScsICdjYXJkLWJhc2UnOiAnIzA3MzY0MicsICdjYXJkLWJnJzogJyMwNzM2NDInLCBib3JkZXI6ICcjNTg2ZTc1JywgaG92ZXI6ICcjMGQ0MDUwJywgJ2NhcmQtaG92ZXInOiAnIzBhM2E0OCcsIGJhc2U6ICcjMDUzMzQwJywgJ29rLWJnJzogJyMwZDNkMmMnLCAnb2stZmcnOiAnIzg1OTkwMCcsICdiYWQtYmcnOiAnIzNkMWExYScsICdiYWQtZmcnOiAnI2RjMzIyZicsICdkb3Qtb2snOiAnIzg1OTkwMCcsICdkb3QtYmFkJzogJyNkYzMyMmYnLCB1cHRpbWU6ICcjYjViZDY4Jywgc3VjY2VzczogJyM4NTk5MDAnLCBlcnJvcjogJyNkYzMyMmYnLCB3YXJuaW5nOiAnI2I1ODkwMCcsIGFjY2VudDogJyMyNjhiZDInLCAnYWNjZW50LXN0cm9uZyc6ICcjMmFhMTk4JyB9LFxuICAgICdzb2xhcml6ZWQtbGlnaHQnOnsgYmc6ICcjZmRmNmUzJywgZmc6ICcjNjU3YjgzJywgbXV0ZWQ6ICcjOTNhMWExJywgJ2ZnLW11dGVkJzogJyNhZGI4YjgnLCAnY2FyZC1iYXNlJzogJyNlZWU4ZDUnLCAnY2FyZC1iZyc6ICcjZWVlOGQ1JywgYm9yZGVyOiAnIzkzYTFhMScsIGhvdmVyOiAnI2U2ZGZjYicsICdjYXJkLWhvdmVyJzogJyNlYWUzY2YnLCBiYXNlOiAnI2U4ZTFjZCcsICdvay1iZyc6ICcjZThmNWU4JywgJ29rLWZnJzogJyM4NTk5MDAnLCAnYmFkLWJnJzogJyNmZGYyZjInLCAnYmFkLWZnJzogJyNkYzMyMmYnLCAnZG90LW9rJzogJyM4NTk5MDAnLCAnZG90LWJhZCc6ICcjZGMzMjJmJywgdXB0aW1lOiAnIzg1OTkwMCcsIHN1Y2Nlc3M6ICcjODU5OTAwJywgZXJyb3I6ICcjZGMzMjJmJywgd2FybmluZzogJyNiNTg5MDAnLCBhY2NlbnQ6ICcjMjY4YmQyJywgJ2FjY2VudC1zdHJvbmcnOiAnIzJhYTE5OCcsIGxpZ2h0Qmc6IHRydWUgfSxcbiAgICB0YXhpOiAgICAgICAgICAgICB7IGJnOiAnI2YzZDMyMScsIGZnOiAnIzBlMGUwMCcsIG11dGVkOiAnIzRhNGExMCcsICdmZy1tdXRlZCc6ICcjNmI2YjMwJywgJ2NhcmQtYmFzZSc6ICcjZmZkNzAwJywgJ2NhcmQtYmcnOiAnI2ZmZDcwMCcsIGJvcmRlcjogJyNiOGE4NDAnLCBob3ZlcjogJyNmZmU4NGQnLCAnY2FyZC1ob3Zlcic6ICcjZmZlMDMzJywgYmFzZTogJyNmMGQwMDAnLCAnb2stYmcnOiAnI2Q0ZmZkOScsICdvay1mZyc6ICcjMGYyYTBmJywgJ2JhZC1iZyc6ICcjZmZkNGQ0JywgJ2JhZC1mZyc6ICcjMmEwZjBmJywgJ2RvdC1vayc6ICcjNGNhZjUwJywgJ2RvdC1iYWQnOiAnI2ZmNDQ0NCcsIHVwdGltZTogJyMwZTBlMDAnLCBzdWNjZXNzOiAnIzJlN2QzMicsIGVycm9yOiAnI2M2MjgyOCcsIHdhcm5pbmc6ICcjZTY1MTAwJywgYWNjZW50OiAnIzdhNGEwMCcsICdhY2NlbnQtc3Ryb25nJzogJyM1YzM4MDAnLCBsaWdodEJnOiB0cnVlIH0sXG4gICAgb2NlYW46ICAgICAgICAgICAgeyBiZzogJyMyMDYwYjAnLCBmZzogJyNmYWY1ZWInLCBtdXRlZDogJyNkY2QyYzAnLCAnZmctbXV0ZWQnOiAnI2IwYTg5MCcsICdjYXJkLWJhc2UnOiAnIzdhOTRlZCcsICdjYXJkLWJnJzogJyM3YTk0ZWQnLCBib3JkZXI6ICcjZGViNjdhJywgaG92ZXI6ICcjOGFhMGYwJywgJ2NhcmQtaG92ZXInOiAnIzgyOThlOCcsIGJhc2U6ICcjNjg4OGUwJywgJ29rLWJnJzogJyM0ZjViYjAnLCAnb2stZmcnOiAnI2M3ZDdlYicsICdiYWQtYmcnOiAnI2Y0MWEzYScsICdiYWQtZmcnOiAnIzZhMTgxOCcsICdkb3Qtb2snOiAnIzMwYTA1MCcsICdkb3QtYmFkJzogJyNkMDQwNDAnLCB1cHRpbWU6ICcjMmQzMmYyJywgc3VjY2VzczogJyMzMGEwNTAnLCBlcnJvcjogJyNkMDQwNDAnLCB3YXJuaW5nOiAnI2U2YTAzMCcsIGFjY2VudDogJyMxODYwYTAnLCAnYWNjZW50LXN0cm9uZyc6ICcjMTA0MDgwJyB9LFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb2xvciBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGhleFRvUmdiKGhleCkge1xuICAgIGlmICghaGV4IHx8IHR5cGVvZiBoZXggIT09ICdzdHJpbmcnKSByZXR1cm4geyByOiAwLCBnOiAwLCBiOiAwIH07XG4gICAgaGV4ID0gaGV4LnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDMpIGhleCA9IGhleFswXStoZXhbMF0raGV4WzFdK2hleFsxXStoZXhbMl0raGV4WzJdO1xuICAgIHJldHVybiB7XG4gICAgICByOiBwYXJzZUludChoZXguc3Vic3RyKDAsIDIpLCAxNikgfHwgMCxcbiAgICAgIGc6IHBhcnNlSW50KGhleC5zdWJzdHIoMiwgMiksIDE2KSB8fCAwLFxuICAgICAgYjogcGFyc2VJbnQoaGV4LnN1YnN0cig0LCAyKSwgMTYpIHx8IDBcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcmdiVG9IZXgociwgZywgYikge1xuICAgIHJldHVybiAnIycgKyBbciwgZywgYl0ubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICB2YXIgaCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh4KSkpLnRvU3RyaW5nKDE2KTtcbiAgICAgIHJldHVybiBoLmxlbmd0aCA9PT0gMSA/ICcwJyArIGggOiBoO1xuICAgIH0pLmpvaW4oJycpO1xuICB9XG5cbiAgZnVuY3Rpb24gYmxlbmRDb2xvcnMoaGV4MSwgaGV4MiwgcmF0aW8pIHtcbiAgICB2YXIgYzEgPSBoZXhUb1JnYihoZXgxKTtcbiAgICB2YXIgYzIgPSBoZXhUb1JnYihoZXgyKTtcbiAgICByZXR1cm4gcmdiVG9IZXgoXG4gICAgICBjMS5yICsgKGMyLnIgLSBjMS5yKSAqIHJhdGlvLFxuICAgICAgYzEuZyArIChjMi5nIC0gYzEuZykgKiByYXRpbyxcbiAgICAgIGMxLmIgKyAoYzIuYiAtIGMxLmIpICogcmF0aW9cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gaGV4THVtaW5hbmNlKGhleCkge1xuICAgIGhleCA9IGhleC5yZXBsYWNlKCcjJywgJycpO1xuICAgIGlmIChoZXgubGVuZ3RoID09PSAzKSBoZXggPSBoZXhbMF0raGV4WzBdK2hleFsxXStoZXhbMV0raGV4WzJdK2hleFsyXTtcbiAgICB2YXIgciA9IHBhcnNlSW50KGhleC5zdWJzdHIoMCwgMiksIDE2KSAvIDI1NTtcbiAgICB2YXIgZyA9IHBhcnNlSW50KGhleC5zdWJzdHIoMiwgMiksIDE2KSAvIDI1NTtcbiAgICB2YXIgYiA9IHBhcnNlSW50KGhleC5zdWJzdHIoNCwgMiksIDE2KSAvIDI1NTtcbiAgICByID0gciA8PSAwLjAzOTI4ID8gciAvIDEyLjkyIDogTWF0aC5wb3coKHIgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBnID0gZyA8PSAwLjAzOTI4ID8gZyAvIDEyLjkyIDogTWF0aC5wb3coKGcgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBiID0gYiA8PSAwLjAzOTI4ID8gYiAvIDEyLjkyIDogTWF0aC5wb3coKGIgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gMC4yMTI2ICogciArIDAuNzE1MiAqIGcgKyAwLjA3MjIgKiBiO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEF1dG8tZGVyaXZlIGV4dGVuZGVkIGNvbG9ycyBmcm9tIGJhc2UgcGFsZXR0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBkZXJpdmVFeHRlbmRlZENvbG9ycyhjb2xvcnMpIHtcbiAgICB2YXIgYmcgPSBjb2xvcnMuYmcgfHwgJyMwYjBmMWEnO1xuICAgIHZhciBmZyA9IGNvbG9ycy5mZyB8fCAnI2U4ZWNmNSc7XG4gICAgdmFyIG11dGVkID0gY29sb3JzLm11dGVkIHx8ICcjOWFhNmJmJztcbiAgICB2YXIgY2FyZEJhc2UgPSBjb2xvcnNbJ2NhcmQtYmFzZSddIHx8IGNvbG9ycy5iZyB8fCAnIzEyMTgyNic7XG4gICAgdmFyIGRvdE9rID0gY29sb3JzWydkb3Qtb2snXSB8fCAnIzRjYWY1MCc7XG4gICAgdmFyIGRvdEJhZCA9IGNvbG9yc1snZG90LWJhZCddIHx8ICcjZTc0YzNjJztcbiAgICB2YXIgaXNMaWdodCA9IGNvbG9ycy5saWdodEJnIHx8IChiZyAmJiBoZXhMdW1pbmFuY2UoYmcpID4gMC40KTtcblxuICAgIHZhciBkZXJpdmVkID0ge307XG5cbiAgICAvLyBob3Zlcjogc3VidGxlIHNoaWZ0IG9mIGNhcmQtYmFzZSB0b3dhcmQgZmcgKGRhcmspIG9yIHRvd2FyZCBiZyAobGlnaHQpXG4gICAgZGVyaXZlZC5ob3ZlciA9IGlzTGlnaHRcbiAgICAgID8gYmxlbmRDb2xvcnMoY2FyZEJhc2UsIGJnLCAwLjM1KVxuICAgICAgOiBibGVuZENvbG9ycyhjYXJkQmFzZSwgZmcsIDAuMDgpO1xuXG4gICAgLy8gY2FyZC1ob3ZlcjogbWlkcG9pbnQgYmV0d2VlbiBjYXJkLWJhc2UgYW5kIGhvdmVyXG4gICAgZGVyaXZlZFsnY2FyZC1ob3ZlciddID0gYmxlbmRDb2xvcnMoY2FyZEJhc2UsIGRlcml2ZWQuaG92ZXIsIDAuNSk7XG5cbiAgICAvLyBiYXNlOiBzdWJkdWVkIGJhY2tncm91bmQgYmV0d2VlbiBiZyBhbmQgY2FyZC1iYXNlXG4gICAgZGVyaXZlZC5iYXNlID0gYmxlbmRDb2xvcnMoYmcsIGNhcmRCYXNlLCAwLjYpO1xuXG4gICAgLy8gZmctbXV0ZWQ6IGRpbW1lciB0aGFuIG11dGVkLCBibGVuZCB0b3dhcmQgYmdcbiAgICBkZXJpdmVkWydmZy1tdXRlZCddID0gYmxlbmRDb2xvcnMobXV0ZWQsIGJnLCAwLjM1KTtcblxuICAgIC8vIHN1Y2Nlc3M6IHJldXNlIGRvdC1vayAodGhlIGdyZWVuIG9mIHRoaXMgdGhlbWUpXG4gICAgZGVyaXZlZC5zdWNjZXNzID0gZG90T2s7XG5cbiAgICAvLyBlcnJvcjogcmV1c2UgZG90LWJhZCAodGhlIHJlZCBvZiB0aGlzIHRoZW1lKVxuICAgIGRlcml2ZWQuZXJyb3IgPSBkb3RCYWQ7XG5cbiAgICAvLyB3YXJuaW5nOiB3YXJtIGFtYmVyLCBhZGp1c3RlZCBmb3IgY29udHJhc3RcbiAgICBkZXJpdmVkLndhcm5pbmcgPSBpc0xpZ2h0ID8gJyNkNjhhMDAnIDogJyNmMzljMTInO1xuXG4gICAgcmV0dXJuIGRlcml2ZWQ7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgYm9keSBiYWNrZ3JvdW5kIENTUyBmb3IgdXNlciB0aGVtZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVCb2R5QmFja2dyb3VuZENTUyhzbHVnLCBjb2xvcnMpIHtcbiAgICB2YXIgaXNMaWdodCA9IGNvbG9ycy5saWdodEJnIHx8IChjb2xvcnMuYmcgJiYgaGV4THVtaW5hbmNlKGNvbG9ycy5iZykgPiAwLjQpO1xuICAgIHZhciBhY2NlbnQgPSBjb2xvcnMuYWNjZW50IHx8IGNvbG9yc1snYWNjZW50LXN0cm9uZyddIHx8ICcjODg4ODg4JztcbiAgICB2YXIgYWNjZW50UmdiID0gaGV4VG9SZ2IoYWNjZW50KTtcblxuICAgIGlmIChpc0xpZ2h0KSB7XG4gICAgICByZXR1cm4gJzpyb290LicgKyBzbHVnICsgJyBib2R5IHtcXG4nICtcbiAgICAgICAgJyAgYmFja2dyb3VuZDpcXG4nICtcbiAgICAgICAgJyAgICByYWRpYWwtZ3JhZGllbnQoMTIwMHB4IDgwMHB4IGF0IDEwJSAtMTAlLCByZ2JhKCcgKyBhY2NlbnRSZ2IuciArICcsJyArIGFjY2VudFJnYi5nICsgJywnICsgYWNjZW50UmdiLmIgKyAnLCAuMDgpLCB0cmFuc3BhcmVudCA2MCUpLFxcbicgK1xuICAgICAgICAnICAgIHJhZGlhbC1ncmFkaWVudCgxMDAwcHggNzAwcHggYXQgMTEwJSAxMCUsIHJnYmEoJyArIGFjY2VudFJnYi5yICsgJywnICsgYWNjZW50UmdiLmcgKyAnLCcgKyBhY2NlbnRSZ2IuYiArICcsIC4wNSksIHRyYW5zcGFyZW50IDU1JSksXFxuJyArXG4gICAgICAgICcgICAgdmFyKC0tYmcpO1xcbicgK1xuICAgICAgICAnfVxcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnOnJvb3QuJyArIHNsdWcgKyAnIGJvZHkge1xcbicgK1xuICAgICAgICAnICBiYWNrZ3JvdW5kOlxcbicgK1xuICAgICAgICAnICAgIHJhZGlhbC1ncmFkaWVudCgxMjAwcHggOTAwcHggYXQgOCUgLTEyJSwgcmdiYSgnICsgYWNjZW50UmdiLnIgKyAnLCcgKyBhY2NlbnRSZ2IuZyArICcsJyArIGFjY2VudFJnYi5iICsgJywgLjEwKSwgdHJhbnNwYXJlbnQgNjAlKSxcXG4nICtcbiAgICAgICAgJyAgICByYWRpYWwtZ3JhZGllbnQoMTAwMHB4IDcwMHB4IGF0IDExMCUgLTEwJSwgcmdiYSgnICsgYWNjZW50UmdiLnIgKyAnLCcgKyBhY2NlbnRSZ2IuZyArICcsJyArIGFjY2VudFJnYi5iICsgJywgLjA3KSwgdHJhbnNwYXJlbnQgNTUlKSxcXG4nICtcbiAgICAgICAgJyAgICB2YXIoLS1iZyk7XFxuJyArXG4gICAgICAgICd9XFxuJztcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgYnV0dG9uIGhvdmVyIENTUyBmb3IgdXNlciB0aGVtZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVCdXR0b25Ib3ZlckNTUyhzbHVnLCBjb2xvcnMpIHtcbiAgICB2YXIgaXNMaWdodCA9IGNvbG9ycy5saWdodEJnIHx8IChjb2xvcnMuYmcgJiYgaGV4THVtaW5hbmNlKGNvbG9ycy5iZykgPiAwLjQpO1xuXG4gICAgaWYgKGlzTGlnaHQpIHtcbiAgICAgIHJldHVybiAnOnJvb3QuJyArIHNsdWcgKyAnIGJ1dHRvbjpob3ZlciB7XFxuJyArXG4gICAgICAgICcgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQtc3Ryb25nKSAxMiUsIHdoaXRlIDg4JSk7XFxuJyArXG4gICAgICAgICcgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAuMTUpO1xcbicgK1xuICAgICAgICAnICBib3gtc2hhZG93OiAwIDFweCA2cHggcmdiYSgwLCAwLCAwLCAuMDgpLCBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgLjgpO1xcbicgK1xuICAgICAgICAnfVxcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnOnJvb3QuJyArIHNsdWcgKyAnIGJ1dHRvbjpob3ZlciB7XFxuJyArXG4gICAgICAgICcgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpO1xcbicgK1xuICAgICAgICAnICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDM1JSwgdmFyKC0tYm9yZGVyKSk7XFxuJyArXG4gICAgICAgICd9XFxuJztcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ29yZSB0aGVtZSBmdW5jdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2V0U3lzdGVtVGhlbWUoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCc7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckN1c3RvbVByb3BlcnRpZXMoKSB7XG4gICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCctLScgKyBwcm9wKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNsdWdpZnkobmFtZSwgY3VycmVudFNsdWcpIHtcbiAgICB2YXIgc2x1ZyA9IG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgIGlmICghc2x1Zykgc2x1ZyA9ICdjdXN0b20nO1xuICAgIGlmIChCVUlMVElOX1RIRU1FUy5pbmRleE9mKHNsdWcpICE9PSAtMSkgc2x1ZyA9IHNsdWcgKyAnLWN1c3RvbSc7XG4gICAgdmFyIGNhY2hlZCA9IHNhZmVHZXRKU09OKFVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIHZhciBiYXNlID0gc2x1ZztcbiAgICB2YXIgY291bnRlciA9IDI7XG4gICAgd2hpbGUgKGNhY2hlZFtzbHVnXSAmJiBzbHVnICE9PSBjdXJyZW50U2x1Zykge1xuICAgICAgc2x1ZyA9IGJhc2UgKyAnLScgKyBjb3VudGVyKys7XG4gICAgfVxuICAgIHJldHVybiBzbHVnO1xuICB9XG5cbiAgLy8gSW5qZWN0IHVzZXIgdGhlbWVzIGZyb20gYSB0aGVtZXMgb2JqZWN0IGludG8gRE9NICsgcnVudGltZVxuICBmdW5jdGlvbiBpbmplY3RVc2VyVGhlbWVTdHlsZXModGhlbWVzRGF0YSkge1xuICAgIHZhciBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1c2VyLXRoZW1lLXN0eWxlcycpO1xuICAgIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG5cbiAgICBUSEVNRVMubGVuZ3RoID0gQlVJTFRJTl9USEVNRVMubGVuZ3RoO1xuICAgIE9iamVjdC5rZXlzKFRIRU1FX0NPTE9SUykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgaWYgKEJVSUxUSU5fVEhFTUVTLmluZGV4T2YoaykgPT09IC0xKSBkZWxldGUgVEhFTUVfQ09MT1JTW2tdO1xuICAgIH0pO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGRhdGEsIG9yIGZhbGwgYmFjayB0byBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICB2YXIgdXNlclRoZW1lcyA9IHRoZW1lc0RhdGEgfHwgc2FmZUdldEpTT04oVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIHNsdWdzID0gT2JqZWN0LmtleXModXNlclRoZW1lcyk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFueSB1c2VyIHRoZW1lcyB0aGF0IGNvbGxpZGUgd2l0aCBidWlsdC1pbiBzbHVnc1xuICAgIHNsdWdzID0gc2x1Z3MuZmlsdGVyKGZ1bmN0aW9uIChzKSB7IHJldHVybiBCVUlMVElOX1RIRU1FUy5pbmRleE9mKHMpID09PSAtMTsgfSk7XG5cbiAgICBpZiAoIXNsdWdzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdmFyIGNzcyA9ICcnO1xuICAgIHNsdWdzLmZvckVhY2goZnVuY3Rpb24gKHNsdWcpIHtcbiAgICAgIHZhciB0aGVtZSA9IHVzZXJUaGVtZXNbc2x1Z107XG4gICAgICBpZiAoVEhFTUVTLmluZGV4T2Yoc2x1ZykgPT09IC0xKSBUSEVNRVMucHVzaChzbHVnKTtcblxuICAgICAgLy8gQnVpbGQgY29sb3IgbWFwIGZyb20gc2F2ZWQgZGF0YVxuICAgICAgdmFyIGNvbG9yTWFwID0ge307XG4gICAgICBUSEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGlmICh0aGVtZVtwXSkgY29sb3JNYXBbcF0gPSB0aGVtZVtwXTsgfSk7XG4gICAgICBjb2xvck1hcFsnY2FyZC1iZyddID0gdGhlbWVbJ2NhcmQtYmFzZSddIHx8IHRoZW1lLmJnO1xuICAgICAgaWYgKHRoZW1lLmxpZ2h0QmcpIGNvbG9yTWFwLmxpZ2h0QmcgPSB0cnVlO1xuXG4gICAgICAvLyBBdXRvLWRlcml2ZSBhbnkgbWlzc2luZyBleHRlbmRlZCBjb2xvcnNcbiAgICAgIHZhciBkZXJpdmVkID0gZGVyaXZlRXh0ZW5kZWRDb2xvcnMoY29sb3JNYXApO1xuICAgICAgREVSSVZFRF9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIGlmICghY29sb3JNYXBbcF0gJiYgZGVyaXZlZFtwXSkgY29sb3JNYXBbcF0gPSBkZXJpdmVkW3BdO1xuICAgICAgfSk7XG5cbiAgICAgIFRIRU1FX0NPTE9SU1tzbHVnXSA9IGNvbG9yTWFwO1xuXG4gICAgICAvLyBFbWl0IG1haW4gdmFyaWFibGUgYmxvY2tcbiAgICAgIGNzcyArPSAnOnJvb3QuJyArIHNsdWcgKyAnIHtcXG4nO1xuICAgICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgICBpZiAoY29sb3JNYXBbcF0pIGNzcyArPSAnICAtLScgKyBwICsgJzogJyArIGNvbG9yTWFwW3BdICsgJztcXG4nO1xuICAgICAgfSk7XG4gICAgICBjc3MgKz0gJ31cXG4nO1xuXG4gICAgICAvLyBFbWl0IGJvZHkgYmFja2dyb3VuZCBncmFkaWVudFxuICAgICAgY3NzICs9IGdlbmVyYXRlQm9keUJhY2tncm91bmRDU1Moc2x1ZywgY29sb3JNYXApO1xuXG4gICAgICAvLyBFbWl0IGJ1dHRvbiBob3ZlciBvdmVycmlkZVxuICAgICAgY3NzICs9IGdlbmVyYXRlQnV0dG9uSG92ZXJDU1Moc2x1ZywgY29sb3JNYXApO1xuICAgIH0pO1xuXG4gICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS5pZCA9ICd1c2VyLXRoZW1lLXN0eWxlcyc7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIH1cblxuICAvLyBGZXRjaCB0aGVtZXMgZnJvbSBzZXJ2ZXIsIHVwZGF0ZSBjYWNoZSwgcmUtaW5qZWN0IGlmIGNoYW5nZWRcbiAgZnVuY3Rpb24gc3luY1RoZW1lc0Zyb21TZXJ2ZXIoKSB7XG4gICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdGhlbWVzJykudGhlbihmdW5jdGlvbiAocikgeyByZXR1cm4gci5qc29uKCk7IH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLnRoZW1lcykgcmV0dXJuO1xuICAgICAgdmFyIHNlcnZlclRoZW1lcyA9IGRhdGEudGhlbWVzO1xuICAgICAgdmFyIGNhY2hlZCA9IHNhZmVHZXRKU09OKFVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgICAgLy8gT25seSB1cGRhdGUgaWYgZGlmZmVyZW50XG4gICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc2VydmVyVGhlbWVzKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2FjaGVkKSkge1xuICAgICAgICBzYWZlU2V0KFVTRVJfVEhFTUVTX0tFWSwgSlNPTi5zdHJpbmdpZnkoc2VydmVyVGhlbWVzKSk7XG4gICAgICAgIGluamVjdFVzZXJUaGVtZVN0eWxlcyhzZXJ2ZXJUaGVtZXMpO1xuICAgICAgICAvLyBSZS1hcHBseSBjdXJyZW50IHRoZW1lIGluIGNhc2UgaXQgd2FzIGp1c3Qgc3luY2VkXG4gICAgICAgIHZhciBjdXJyZW50ID0gc2FmZUdldChUSEVNRV9LRVkpO1xuICAgICAgICBpZiAoY3VycmVudCAmJiBUSEVNRVMuaW5kZXhPZihjdXJyZW50KSAhPT0gLTEpIHtcbiAgICAgICAgICBhcHBseVRoZW1lKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICB9XG5cbiAgLy8gTWlncmF0ZSBsZWdhY3kgY3VzdG9tLXRoZW1lIHRvIHNlcnZlclxuICBmdW5jdGlvbiBtaWdyYXRlTGVnYWN5Q3VzdG9tVGhlbWUoKSB7XG4gICAgdmFyIGxlZ2FjeSA9IHNhZmVHZXRKU09OKExFR0FDWV9DVVNUT01fS0VZKTtcbiAgICBpZiAoIWxlZ2FjeSkgcmV0dXJuO1xuXG4gICAgdmFyIG5hbWUgPSBsZWdhY3kubmFtZSB8fCAnQ3VzdG9tJztcbiAgICB2YXIgc2x1ZyA9IHNsdWdpZnkobmFtZSk7XG5cbiAgICB2YXIgdGhlbWVEYXRhID0geyBuYW1lOiBuYW1lIH07XG4gICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKGxlZ2FjeVtwXSkgdGhlbWVEYXRhW3BdID0gbGVnYWN5W3BdO1xuICAgIH0pO1xuXG4gICAgLy8gU2F2ZSB0byBsb2NhbFN0b3JhZ2UgY2FjaGUgaW1tZWRpYXRlbHlcbiAgICB2YXIgY2FjaGVkID0gc2FmZUdldEpTT04oVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgY2FjaGVkW3NsdWddID0gdGhlbWVEYXRhO1xuICAgIHNhZmVTZXQoVVNFUl9USEVNRVNfS0VZLCBKU09OLnN0cmluZ2lmeShjYWNoZWQpKTtcblxuICAgIC8vIFVwZGF0ZSBhY3RpdmUgdGhlbWUgcmVmZXJlbmNlXG4gICAgaWYgKHNhZmVHZXQoVEhFTUVfS0VZKSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgIHNhZmVTZXQoVEhFTUVfS0VZLCBzbHVnKTtcbiAgICB9XG5cbiAgICBzYWZlUmVtb3ZlKExFR0FDWV9DVVNUT01fS0VZKTtcblxuICAgIC8vIEFsc28gcHVzaCB0byBzZXJ2ZXJcbiAgICB2YXIgY29sb3JzID0ge307XG4gICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAodGhlbWVEYXRhW3BdKSBjb2xvcnNbcF0gPSB0aGVtZURhdGFbcF07IH0pO1xuICAgIGZldGNoKCcvYXBpL3YxL3RoZW1lcy8nICsgc2x1Zywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZTogbmFtZSwgY29sb3JzOiBjb2xvcnMgfSlcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVRoZW1lKG1vZGUpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGhlbWUtdHJhbnNpdGlvbmluZycpO1xuXG4gICAgVEhFTUVTLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0ICE9PSAnZGFyaycpIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHQpO1xuICAgIH0pO1xuXG4gICAgY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAobW9kZSAhPT0gJ2RhcmsnKSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChtb2RlKTtcbiAgICB9XG5cbiAgICBzYWZlU2V0KFRIRU1FX0tFWSwgbW9kZSk7XG5cbiAgICB2YXIgY29sb3JzID0gVEhFTUVfQ09MT1JTW21vZGVdO1xuICAgIHZhciBtZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidGhlbWUtY29sb3JcIl0nKTtcbiAgICBpZiAobWV0YSAmJiBjb2xvcnMpIG1ldGEuc2V0QXR0cmlidXRlKCdjb250ZW50JywgY29sb3JzLmJnKTtcblxuICAgIC8vIFRvZ2dsZSBsaWdodC1iZyBjbGFzczogZXhwbGljaXQgZmxhZyBmaXJzdCwgdGhlbiBhdXRvLWRldGVjdCBmcm9tIGx1bWluYW5jZVxuICAgIHZhciBpc0xpZ2h0ID0gY29sb3JzICYmIGNvbG9ycy5saWdodEJnO1xuICAgIGlmICghaXNMaWdodCAmJiBjb2xvcnMgJiYgY29sb3JzLmJnKSBpc0xpZ2h0ID0gaGV4THVtaW5hbmNlKGNvbG9ycy5iZykgPiAwLjQ7XG4gICAgaWYgKGlzTGlnaHQpIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaWdodC1iZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbGlnaHQtYmcnKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0aGVtZS10cmFuc2l0aW9uaW5nJyk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIC8vIC0tLSBJbml0aWFsaXphdGlvbiAtLS1cbiAgbWlncmF0ZUxlZ2FjeUN1c3RvbVRoZW1lKCk7XG4gIC8vIEluc3RhbnQgbG9hZCBmcm9tIGNhY2hlXG4gIGluamVjdFVzZXJUaGVtZVN0eWxlcygpO1xuXG4gIHZhciBzYXZlZFRoZW1lID0gc2FmZUdldChUSEVNRV9LRVkpO1xuICBpZiAoc2F2ZWRUaGVtZSA9PT0gJ3JlZCcpIHsgc2F2ZWRUaGVtZSA9ICdibGFjayc7IHNhZmVTZXQoVEhFTUVfS0VZLCAnYmxhY2snKTsgfVxuICBpZiAoc2F2ZWRUaGVtZSAmJiBzYXZlZFRoZW1lICE9PSAnZGFyaycgJiYgVEhFTUVTLmluZGV4T2Yoc2F2ZWRUaGVtZSkgPT09IC0xKSB7XG4gICAgc2F2ZWRUaGVtZSA9IG51bGw7XG4gIH1cbiAgYXBwbHlUaGVtZShzYXZlZFRoZW1lIHx8IGdldFN5c3RlbVRoZW1lKCkpO1xuXG4gIC8vIFN5bmMgZnJvbSBzZXJ2ZXIgaW4gYmFja2dyb3VuZCAodXBkYXRlcyBjYWNoZSBpZiBzZXJ2ZXIgaGFzIG5ld2VyIGRhdGEpXG4gIHN5bmNUaGVtZXNGcm9tU2VydmVyKCk7XG5cbiAgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghc2FmZUdldChUSEVNRV9LRVkpKSB7XG4gICAgICBhcHBseVRoZW1lKGUubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCcpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gRXhwb3NlIEFQSVxuICB3aW5kb3cuVEhFTUVTID0gVEhFTUVTO1xuICB3aW5kb3cuQlVJTFRJTl9USEVNRVMgPSBCVUlMVElOX1RIRU1FUztcbiAgd2luZG93LlRIRU1FX0NPTE9SUyA9IFRIRU1FX0NPTE9SUztcbiAgd2luZG93LlRIRU1FX1BST1BTID0gVEhFTUVfUFJPUFM7XG4gIHdpbmRvdy5CQVNFX1BST1BTID0gQkFTRV9QUk9QUztcbiAgd2luZG93LkRFUklWRURfUFJPUFMgPSBERVJJVkVEX1BST1BTO1xuICB3aW5kb3cuVVNFUl9USEVNRVNfS0VZID0gVVNFUl9USEVNRVNfS0VZO1xuICB3aW5kb3cuYXBwbHlUaGVtZSA9IGFwcGx5VGhlbWU7XG4gIHdpbmRvdy5jbGVhckN1c3RvbVByb3BlcnRpZXMgPSBjbGVhckN1c3RvbVByb3BlcnRpZXM7XG4gIHdpbmRvdy5pbmplY3RVc2VyVGhlbWVTdHlsZXMgPSBpbmplY3RVc2VyVGhlbWVTdHlsZXM7XG4gIHdpbmRvdy5zeW5jVGhlbWVzRnJvbVNlcnZlciA9IHN5bmNUaGVtZXNGcm9tU2VydmVyO1xuICB3aW5kb3cuc2x1Z2lmeVRoZW1lTmFtZSA9IHNsdWdpZnk7XG4gIHdpbmRvdy5nZXRBY3RpdmVUaGVtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNhZmVHZXQoVEhFTUVfS0VZKSB8fCBnZXRTeXN0ZW1UaGVtZSgpOyB9O1xuICB3aW5kb3cuZGVyaXZlRXh0ZW5kZWRDb2xvcnMgPSBkZXJpdmVFeHRlbmRlZENvbG9ycztcbiAgd2luZG93LmhleFRvUmdiID0gaGV4VG9SZ2I7XG4gIHdpbmRvdy5yZ2JUb0hleCA9IHJnYlRvSGV4O1xuICB3aW5kb3cuYmxlbmRDb2xvcnMgPSBibGVuZENvbG9ycztcbn0pKCk7XG47XG4vLyA9PT09PSBQTFVHR0FCTEUgQVVUSCBHQVRFIChEQy0wNDkpID09PT09XG4vL1xuLy8gT24gQ2FkZHkgcmVkaXJlY3QgdG8gP2F1dGg9cmVxdWlyZWQsIHRoaXMgbW9kdWxlIHF1ZXJpZXNcbi8vIEdFVCAvYXBpL3YxL2F1dGgvbG9naW4vbWV0aG9kcyB0byBkaXNjb3ZlciB3aGljaCBBdXRoUHJvdmlkZXJzIGFyZSBlbmFibGVkLlxuLy8gSWYgb25seSBvbmUgcHJvdmlkZXIgaXMgZW5hYmxlZCwganVtcCBzdHJhaWdodCB0byBpdHMgY2hhbGxlbmdlIFVJXG4vLyAoVE9UUC1vbmx5IGluc3RhbGxhdGlvbnMgdG9kYXkpLiBJZiBtdWx0aXBsZSBwcm92aWRlcnMgZXhpc3QsIHJlbmRlciBhXG4vLyBzZWxlY3RvciBmaXJzdCBzbyB0aGUgdXNlciBwaWNrcyBob3cgdG8gc2lnbiBpbi5cbi8vXG4vLyBUb2RheTpcbi8vICAgLSB0b3RwOiAgICBjaGFsbGVuZ2UgaXMgNi1kaWdpdCBjb2RlIHZpYSB0aGUgZXhpc3RpbmcgVE9UUCBvdmVybGF5XG4vLyAgIC0gZW1haWw6ICAgY2hhbGxlbmdlIGlzIGVtYWlsIGFkZHJlc3MgXHUyMTkyIFBPU1QgL2FwaS92MS9hdXRoL2xvZ2luL2VtYWlsL2luaXRpYXRlXG4vLyAgICAgICAgICAgICAgXHUyMTkyIHNlcnZlciBlbWFpbHMgbWFnaWMgbGluayAob3IgbG9ncyBpdCB0byBjb25zb2xlIGluIGRldikgXHUyMTkyXG4vLyAgICAgICAgICAgICAgd2FpdGluZyBmb3IgdmVyaWZpY2F0aW9uIChubyBhdXRvLXByb21vdGlvbjsgdXNlciByZWxvYWRzIHZpYVxuLy8gICAgICAgICAgICAgIGVtYWlsIGxpbmssIHdoaWNoIHJvdXRlcyB0aHJvdWdoIC9hcGkvdjEvYXV0aC9sb2dpbi9lbWFpbC92ZXJpZnkpXG4vL1xuLy8gVGhpcyBtb2R1bGUgd2lyZXMgaW50byB0aGUgZXhpc3RpbmcgdG90cC1hdXRoLmpzIHN1Ym1pdFRvdHBDb2RlKCkgZmxvdyBzb1xuLy8gdGhlIGxlZ2FjeSBUT1RQIGhhcHB5LXBhdGggaXMgdW5jaGFuZ2VkOiB3aGVuIG1ldGhvZHMgcmV0dXJucyBvbmx5XG4vLyBgdG90cGAsIHRoaXMgbW9kdWxlIGp1c3Qgc2hvd3MgdGhlIFRPVFAgb3ZlcmxheSBhbmQgZXhpdHMuXG5cbihmdW5jdGlvbigpIHtcbiAgLy8gLS0tLSBET00gcmVmcyAoY3JlYXRlZCBsYXppbHkgYmVsb3c7IGV4aXN0aW5nIFRPVFAgbWFya3VwIHN1cHBsaWVzIHRoZW0pIC0tLS1cbiAgbGV0IG1ldGhvZHNDYWNoZSA9IG51bGw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNZXRob2RzKCkge1xuICAgIGlmIChtZXRob2RzQ2FjaGUpIHJldHVybiBtZXRob2RzQ2FjaGU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2F1dGgvbG9naW4vbWV0aG9kcycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGBtZXRob2RzIEhUVFAgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBtZXRob2RzQ2FjaGUgPSBBcnJheS5pc0FycmF5KGRhdGEucHJvdmlkZXJzKSA/IGRhdGEucHJvdmlkZXJzIDogW107XG4gICAgICByZXR1cm4gbWV0aG9kc0NhY2hlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFB1YmxpYyBlbmRwb2ludCBcdTIwMTQgaWYgaXQgZmFpbHMsIGZhbGwgdGhyb3VnaCB0byBsZWdhY3kgVE9UUCBwYXRoLlxuICAgICAgY29uc29sZS53YXJuKCdbYXV0aC1nYXRlXSBtZXRob2RzIGZldGNoIGZhaWxlZDsgZmFsbGluZyBiYWNrIHRvIFRPVFAtb25seScsIGUpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dQcm92aWRlclNlbGVjdG9yKHByb3ZpZGVycykge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtY2FyZCcpO1xuICAgIGlmICghY2FyZCkgcmV0dXJuO1xuXG4gICAgLy8gU2F2ZSB0aGUgZXhpc3RpbmcgVE9UUC1jaGFsbGVuZ2UgYm9keSBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBvbiBjYW5jZWwuXG4gICAgY29uc3Qgb3JpZ2luYWxCb2R5ID0gY2FyZC5pbm5lckhUTUw7XG4gICAgaWYgKCFjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5KSBjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5ID0gb3JpZ2luYWxCb2R5O1xuXG4gICAgY29uc3QgcHJvdmlkZXJCdXR0b25zID0gcHJvdmlkZXJzLm1hcChwID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gKHAuY29uZmlnICYmIChwLmNvbmZpZy5sYWJlbCB8fCBwLm5hbWUpKSB8fCBwLm5hbWU7XG4gICAgICBjb25zdCBidG4gPSBgPGJ1dHRvbiBjbGFzcz1cInByb3ZpZGVyLWJ0blwiIGRhdGEtcHJvdmlkZXI9XCIke3AubmFtZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogNnB4IDRweDsgcGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgU2lnbiBpbiB3aXRoICR7bGFiZWx9XG4gICAgICA8L2J1dHRvbj5gO1xuICAgICAgcmV0dXJuIGJ0bjtcbiAgICB9KS5qb2luKCdcXG4nKTtcblxuICAgIGNhcmQuaW5uZXJIVE1MID0gYFxuICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tZGFya1wiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tZGFyay5wbmdcIiBhbHQ9XCJEYXNoQ2FkZHlcIiBvbmVycm9yPVwidGhpcy5zdHlsZS5kaXNwbGF5PSdub25lJ1wiPlxuICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tbGlnaHRcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZ1wiIGFsdD1cIkRhc2hDYWRkeVwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XG4gICAgICA8cCBjbGFzcz1cInN1YnRpdGxlXCI+Q2hvb3NlIGhvdyB0byBzaWduIGluPC9wPlxuICAgICAgPGRpdiBpZD1cImF1dGgtZ2F0ZS1wcm92aWRlcnNcIiBzdHlsZT1cIm1hcmdpbjogMTRweCAwIDEwcHg7XCI+JHtwcm92aWRlckJ1dHRvbnN9PC9kaXY+XG4gICAgICA8ZGl2IGlkPVwiYXV0aC1nYXRlLW1lc3NhZ2VcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+PC9kaXY+XG4gICAgYDtcblxuICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgLy8gV2lyZSBlYWNoIGJ1dHRvblxuICAgIGNhcmQucXVlcnlTZWxlY3RvckFsbCgnLnByb3ZpZGVyLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGJ0bi5kYXRhc2V0LnByb3ZpZGVyO1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IHByb3ZpZGVycy5maW5kKHAgPT4gcC5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgcmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UocHJvdmlkZXIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXN0b3JlT3JpZ2luYWxCb2R5KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtY2FyZCcpO1xuICAgIGlmICghY2FyZCB8fCAhY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keSkgcmV0dXJuO1xuICAgIGNhcmQuaW5uZXJIVE1MID0gY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keTtcbiAgICAvLyBSZS1iaW5kIHRoZSBvcmlnaW5hbCBkaWdpdCBpbnB1dCBoYW5kbGVycyBieSByZS1ydW5uaW5nIHRoZSB0b3RwLWF1dGhcbiAgICAvLyBib290c3RyYXAuIFRoZSBzaW1wbGVzdCBwYXRoOiByZWxvYWQgdGhlIHBhZ2UsIHdoaWNoIHJlLXJ1bnMgYWxsIElJRkVzLlxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlclByb3ZpZGVyQ2hhbGxlbmdlKHByb3ZpZGVyKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgICBjb25zdCBjYXJkID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcudG90cC1jYXJkJyk7XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBpZiAocHJvdmlkZXIubmFtZSA9PT0gJ3RvdHAnKSB7XG4gICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBUT1RQIG1hcmt1cCBcdTIxOTIgZXhpc3RpbmcgdG90cC1hdXRoLmpzIHN1Ym1pdFRvdHBDb2RlXG4gICAgICAvLyBwYXRoIGhhbmRsZXMgdGhlIHJlc3QuIChSZWxvYWQgaXMgdGhlIGNsZWFuZXN0IHBhdGggYmVjYXVzZVxuICAgICAgLy8gdG90cC1hdXRoLmpzIHdpcmVzIGl0cyBpbnB1dCBoYW5kbGVycyBhdCB0b3AtbGV2ZWwgSUlGRSB0aW1lLilcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvdmlkZXIubmFtZSA9PT0gJ2VtYWlsJykge1xuICAgICAgY2FyZC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxpbWcgY2xhc3M9XCJ0b3RwLWxvZ28gdG90cC1sb2dvLWRhcmtcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWRhcmsucG5nXCIgYWx0PVwiRGFzaENhZGR5XCIgb25lcnJvcj1cInRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSdcIj5cbiAgICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tbGlnaHRcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZ1wiIGFsdD1cIkRhc2hDYWRkeVwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XG4gICAgICAgIDxwIGNsYXNzPVwic3VidGl0bGVcIj5TaWduIGluIHdpdGggZW1haWw8L3A+XG4gICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOiA2cHggMCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgV2UnbGwgZW1haWwgeW91IGEgb25lLXRpbWUgc2lnbi1pbiBsaW5rLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxpbnB1dCBpZD1cImF1dGgtZ2F0ZS1lbWFpbC1pbnB1dFwiIHR5cGU9XCJlbWFpbFwiIGlucHV0bW9kZT1cImVtYWlsXCIgYXV0b2NvbXBsZXRlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ5b3VAZXhhbXBsZS5jb21cIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBmb250LXNpemU6IDFyZW07IGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJnKTsgY29sb3I6IHZhcigtLXRleHQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdXRoLWdhdGUtZW1haWwtc3VibWl0XCIgY2xhc3M9XCJwcm92aWRlci1idG5cIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogMTRweDsgcGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45NXJlbTsgd2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgU2VuZCBzaWduLWluIGxpbmtcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgaWQ9XCJhdXRoLWdhdGUtZW1haWwtc3RhdHVzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBmb250LXNpemU6IDAuODVyZW07IGxpbmUtaGVpZ2h0OiAxLjQ7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgaWQ9XCJhdXRoLWdhdGUtYmFja1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+XHUyMTkwIEJhY2s8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgICAgY29uc3QgaW5wdXQgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtZW1haWwtaW5wdXQnKTtcbiAgICAgIGNvbnN0IHN1Ym1pdCA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1zdWJtaXQnKTtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGJhY2sgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtYmFjaycpO1xuXG4gICAgICBzdWJtaXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVtYWlsID0gKGlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnRW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLic7XG4gICAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWVycm9yLCAjZDMzKSc7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1Ym1pdC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdTZW5kaW5nXHUyMDI2JztcbiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYXV0aC9sb2dpbi9lbWFpbC9pbml0aWF0ZScsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVtYWlsIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpYSA9IGRhdGEuZGVsaXZlcmVkVmlhIHx8ICdlbWFpbCc7XG4gICAgICAgICAgICBjb25zdCBtYXNrZWQgPSBkYXRhLm1hc2tlZEVtYWlsIHx8IGVtYWlsO1xuICAgICAgICAgICAgaWYgKHZpYSA9PT0gJ2Rldi1jb25zb2xlJykge1xuICAgICAgICAgICAgICBzdGF0dXMuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgIENoZWNrIHRoZSBzZXJ2ZXIgbG9ncyBmb3IgeW91ciBvbmUtdGltZSBsaW5rLlxuICAgICAgICAgICAgICAgIChEZXYgbW9kZTogbm8gU01UUCBjb25maWd1cmVkLiBJbiBwcm9kdWN0aW9uIHRoaXMgd291bGQgZW1haWwgPHN0cm9uZz4ke21hc2tlZH08L3N0cm9uZz4uKWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGF0dXMuaW5uZXJIVE1MID0gYFNpZ24taW4gbGluayBzZW50IHRvIDxzdHJvbmc+JHttYXNrZWR9PC9zdHJvbmc+LlxuICAgICAgICAgICAgICAgIENoZWNrIHlvdXIgaW5ib3ggKGFuZCBzcGFtIGZvbGRlcikuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1zdWNjZXNzLCAjMmE3KSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgJ0NvdWxkIG5vdCBzZW5kIGxpbmsuJztcbiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1lcnJvciwgI2QzMyknO1xuICAgICAgICAgICAgc3VibWl0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ0Nvbm5lY3Rpb24gZXJyb3IuIFRyeSBhZ2Fpbi4nO1xuICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1lcnJvciwgI2QzMyknO1xuICAgICAgICAgIHN1Ym1pdC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHN1Ym1pdC5jbGljaygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJhY2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzaG93UHJvdmlkZXJTZWxlY3Rvcihwcm92aWRlcnMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVW5rbm93biBwcm92aWRlciBcdTIxOTIgcmVzdG9yZSBUT1RQIHBhdGggYXMgYSBsYXN0IHJlc29ydFxuICAgIGNvbnNvbGUud2FybignW2F1dGgtZ2F0ZV0gdW5rbm93biBwcm92aWRlcicsIHByb3ZpZGVyLm5hbWUpO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNob3coKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHJldHVybjsgLy8gVE9UUC1vbmx5IGJ1aWxkIHdpdGhvdXQgb3VyIG92ZXJsYXkgY2hhbmdlc1xuXG4gICAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgZmV0Y2hNZXRob2RzKCk7XG4gICAgaWYgKHByb3ZpZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEVpdGhlciB0aGUgZW5kcG9pbnQgaXNuJ3QgcmVhY2hhYmxlIE9SIG5vIHByb3ZpZGVyIHJlcG9ydHMgZW5hYmxlZC5cbiAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgbGVnYWN5IFRPVFAgb3ZlcmxheSBcdTIwMTQgZXhpc3RpbmcgdG90cC1hdXRoLmpzIGhhbmRsZXMgaXQuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5ID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocHJvdmlkZXJzLmxlbmd0aCA9PT0gMSAmJiBwcm92aWRlcnNbMF0ubmFtZSA9PT0gJ3RvdHAnKSB7XG4gICAgICAvLyBTaW5nbGUgVE9UUCBwcm92aWRlciBcdTIxOTIgc2hvdyB0aGUgb3JpZ2luYWwgVE9UUCBvdmVybGF5IHVuY2hhbmdlZCxcbiAgICAgIC8vIGJ1dCB3aXRoIGFuIFwiT3Igc2lnbiBpbiB3aXRoIGVtYWlsXCIgbGluayBiZWxvdyBzbyB0aGUgZW1haWwgcGF0aFxuICAgICAgLy8gaXMgcmVhY2hhYmxlIGFzIHRoZSByZWNvdmVyeSAvIHBob25lLWZyaWVuZGx5IGFsdGVybmF0aXZlLiBNb3N0XG4gICAgICAvLyB1c2VycyBzdGlsbCB3YW50IHRoZWlyIHByaW1hcnkgbWV0aG9kIChUT1RQKSBmcm9udC1hbmQtY2VudGVyLlxuICAgICAgc2hvd1RvdHBXaXRoRW1haWxGYWxsYmFjayhwcm92aWRlcnNbMF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzaG93UHJvdmlkZXJTZWxlY3Rvcihwcm92aWRlcnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1RvdHBXaXRoRW1haWxGYWxsYmFjayh0b3RwUHJvdmlkZXIpIHtcbiAgICBjb25zdCBlbWFpbEVuYWJsZWQgPSBtZXRob2RzQ2FjaGUgJiYgbWV0aG9kc0NhY2hlLmZpbmQocCA9PiBwLm5hbWUgPT09ICdlbWFpbCcpO1xuICAgIGlmICghZW1haWxFbmFibGVkKSB7XG4gICAgICAvLyBUcnVseSBzaW5nbGUtcHJvdmlkZXIgcGF0aDogbGVnYWN5IFRPVFAgb3ZlcmxheSwgbm8gYWx0IGxpbmsuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5ID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGNvbnN0IGNhcmQgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcblxuICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIFRPVFAgbWFya3VwIHNvIHdlIGNhbiByZXN0b3JlIG9uIGFsdC1saW5rIGNsaWNrIG9mZi5cbiAgICBpZiAoIWNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHkpIGNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHkgPSBjYXJkLmlubmVySFRNTDtcblxuICAgIC8vIEFkZCBhIHNtYWxsIFwib3JcIiBsaW5rIGF0IHRoZSBib3R0b20gb2YgdGhlIGV4aXN0aW5nIGNhcmQgV0lUSE9VVFxuICAgIC8vIHRvdWNoaW5nIHRoZSBUT1RQIGlucHV0IG1hcmt1cCBcdTIwMTQga2VlcHMgdG90cC1hdXRoLmpzJ3Mgc3VibWl0VG90cENvZGVcbiAgICAvLyBiaW5kaW5nIGludGFjdC5cbiAgICBsZXQgYWx0ID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcjYXV0aC1nYXRlLWVtYWlsLWFsdCcpO1xuICAgIGlmICghYWx0KSB7XG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpdi5pZCA9ICdhdXRoLWdhdGUtZW1haWwtYWx0JztcbiAgICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6IDE4cHg7IHBhZGRpbmctdG9wOiAxNHB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtOyc7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gYDxhIGhyZWY9XCIjXCIgaWQ9XCJhdXRoLWdhdGUtZW1haWwtYWx0LWxpbmtcIlxuICAgICAgICBzdHlsZT1cImNvbG9yOiB2YXIoLS1hY2NlbnQpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7XCI+XG4gICAgICAgIE9yIHNpZ24gaW4gd2l0aCBlbWFpbCBpbnN0ZWFkIFx1MjE5MlxuICAgICAgPC9hPmA7XG4gICAgICBjYXJkLmFwcGVuZENoaWxkKGRpdik7XG4gICAgICBkaXYucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1hbHQtbGluaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UoZW1haWxFbmFibGVkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfVxuXG4gIC8vIC0tLS0gVHJpZ2dlciBwb2ludHMgLS0tLVxuICAvLyAxLiBTU08gcmVkaXJlY3QgZnJvbSBDYWRkeTogP2F1dGg9cmVxdWlyZWRcbiAgLy8gICAgV2UgY2xhaW0gb3duZXJzaGlwIGhlcmUgKHNldCB3aW5kb3cuX19kY18wNDlfaGFuZGxlZCA9IHRydWUpXG4gIC8vICAgIEJFRk9SRSB0b3RwLWF1dGguanMncyBvd24gP2F1dGg9cmVxdWlyZWQgY2hlY2sgcnVucywgc28gdGhlIGxlZ2FjeVxuICAvLyAgICBUT1RQLW9ubHkgb3ZlcmxheSBkb2Vzbid0IGZsaWNrZXIgaW4gZm9yIG11bHRpLXByb3ZpZGVyIGluc3RhbGxzLlxuICAvLyAgICBTaW5nbGUtcHJvdmlkZXIgVE9UUC1vbmx5IGluc3RhbGxzIHdvcmsgYmVjYXVzZSB3ZSBzdGlsbCBkZWxlZ2F0ZVxuICAvLyAgICBiYWNrIHRvIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5KCkgaW4gYHNob3coKWAgYmVsb3cuXG4gIHdpbmRvdy5fX2RjXzA0OV9oYW5kbGVkID0gdHJ1ZTtcblxuICBmdW5jdGlvbiBpc0FsbG93ZWRSZXR1cm5VcmwocmV0dXJuVXJsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmV0dXJuVXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgIGlmICghWydodHRwOicsICdodHRwczonXS5pbmNsdWRlcyhwYXJzZWQucHJvdG9jb2wpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocGFyc2VkLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAocGFyc2VkLnByb3RvY29sICE9PSAnaHR0cHM6JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBnbG9iYWxzLmpzIGlzIGNvbmNhdGVuYXRlZCBiZWZvcmUgdGhpcyBtb2R1bGUgaW4gY29yZS5qcywgc28gU0lURSBpc1xuICAgICAgLy8gYXZhaWxhYmxlIGhlcmUuIFBlcm1pdCBleGFjdCBob3N0cyBhbmQgc3ViZG9tYWlucyB1bmRlciB0aGUgY29uZmlndXJlZFxuICAgICAgLy8gcHJpdmF0ZSBUTEQgKGZvciBleGFtcGxlIHBsZXguc2FtaSksIHdoaWxlIHJlamVjdGluZyBsb29rYWxpa2VzIHN1Y2ggYXNcbiAgICAgIC8vIHBsZXguc2FtaS5ldmlsLmV4YW1wbGUuXG4gICAgICBjb25zdCBzdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6IGAuJHtTSVRFLnRsZH1gO1xuICAgICAgcmV0dXJuIHBhcnNlZC5ob3N0bmFtZSA9PT0gc3VmZml4LnNsaWNlKDEpIHx8IHBhcnNlZC5ob3N0bmFtZS5lbmRzV2l0aChzdWZmaXgpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICBpZiAodXJsUGFyYW1zLmdldCgnYXV0aCcpID09PSAncmVxdWlyZWQnKSB7XG4gICAgLy8gUHJlc2VydmUgdGhlIGdhdGVkIHNlcnZpY2UgZGVzdGluYXRpb24gc28gc3VibWl0VG90cENvZGUoKSBjYW4gYXBwZW5kXG4gICAgLy8gdGhlIG9uZS10aW1lIFNTTyBoYW5kb2ZmIHRva2VuIGFuZCByZXR1cm4gdGhlIGJyb3dzZXIgdG8gdGhhdCBob3N0LlxuICAgIGNvbnN0IHJldHVyblVybCA9IHVybFBhcmFtcy5nZXQoJ3JldHVybicpO1xuICAgIGlmIChyZXR1cm5VcmwgJiYgaXNBbGxvd2VkUmV0dXJuVXJsKHJldHVyblVybCkpIHtcbiAgICAgIHRyeSB7IHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3RvdHBfcmVkaXJlY3QnLCByZXR1cm5VcmwpOyB9IGNhdGNoIChfKSB7fVxuICAgIH1cbiAgICAvLyBDbGVhbiBVUkwgXHUyMDE0IGhhcHBlbnMgYWZ0ZXIgd2UndmUgY2FwdHVyZWQgdGhlIHJlZGlyZWN0XG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCAnJywgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAvLyBTaG93IG9uIG5leHQgdGljayBzbyB0aGUgRE9NICh0aGUgLnRvdHAtY2FyZCkgaXMgcmVhZHlcbiAgICBzZXRUaW1lb3V0KHNob3csIDApO1xuICB9XG5cbiAgLy8gRXhwb3NlIGZvciBob3QtdHJpZ2dlciBmcm9tIG90aGVyIG1vZHVsZXMgKGUuZy4gbG9nb3V0KVxuICB3aW5kb3cuX3Nob3dBdXRoR2F0ZSA9IHNob3c7XG4gIHdpbmRvdy5fYXV0aEdhdGVNZXRob2RzID0gZmV0Y2hNZXRob2RzO1xufSkoKTtcbjtcbi8vID09PT09IFRPVFAgQVVUSEVOVElDQVRJT04gR0FURSA9PT09PVxuKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiB1cGRhdGVUb3RwTG9nbygpIHtcbiAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvdHAtY2FyZCcpO1xuICAgIGlmICghY2FyZCkgcmV0dXJuO1xuICAgIGNvbnN0IGJnID0gZ2V0Q29tcHV0ZWRTdHlsZShjYXJkKS5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgY29uc3QgbSA9IGJnLm1hdGNoKC9cXGQrL2cpO1xuICAgIGlmICghbSkgcmV0dXJuO1xuICAgIGNvbnN0IGx1bSA9ICgwLjI5OSAqICttWzBdICsgMC41ODcgKiArbVsxXSArIDAuMTE0ICogK21bMl0pIC8gMjU1O1xuICAgIGNvbnN0IGRhcmsgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWxvZ28tZGFyaycpO1xuICAgIGNvbnN0IGxpZ2h0ID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcudG90cC1sb2dvLWxpZ2h0Jyk7XG4gICAgaWYgKGRhcmspIGRhcmsuc3R5bGUuZGlzcGxheSA9IGx1bSA+IDAuNSA/ICdub25lJyA6ICcnO1xuICAgIGlmIChsaWdodCkgbGlnaHQuc3R5bGUuZGlzcGxheSA9IGx1bSA+IDAuNSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1RvdHBPdmVybGF5KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgICAgc2V0VGltZW91dCh1cGRhdGVUb3RwTG9nbywgNTApO1xuICAgICAgY29uc3QgZmlyc3RJbnB1dCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtZGlnaXRzIGlucHV0Jyk7XG4gICAgICBpZiAoZmlyc3RJbnB1dCkgc2V0VGltZW91dCgoKSA9PiBmaXJzdElucHV0LmZvY3VzKCksIDEwMCk7XG4gICAgfVxuICAgIC8vIFJlZnJlc2ggdGhlIFwiTG9zdCBhY2Nlc3M/XCIgcmVjb3ZlcnkgbGluayB2aXNpYmlsaXR5IGJhc2VkIG9uIHNlcnZlciBzdGF0ZS5cbiAgICAvLyBIaWRlcyBpdHNlbGYgaWYgVE9UUCBpcyBoZWFsdGh5OyBzaG93cyBpZiB1bnJlYWRhYmxlL2NvcnJ1cHQuIFRoZSB1c2VyXG4gICAgLy8gY2FuIHN0aWxsIGNsaWNrIGl0IGV2ZW4gd2hlbiBoZWFsdGh5IFx1MjAxNCBidXQgdGhlIHBhbmVsIHdpbGwgZXhwbGFpbiB0aGVyZSdzXG4gICAgLy8gbm8gcmVjb3ZlcnkgbmVlZGVkLiBDaGVhcGVyIHRoYW4gZ2F0aW5nIGl0LlxuICAgIGlmICh0eXBlb2Ygd2luZG93Ll9yZWZyZXNoUmVjb3ZlcnlMaW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3aW5kb3cuX3JlZnJlc2hSZWNvdmVyeUxpbmsoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlVG90cE92ZXJsYXkoKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAob3ZlcmxheSkgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFNzb0hhbmRvZmZUYXJnZXQocmVkaXJlY3QsIHRva2VuKSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChyZWRpcmVjdCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgaWYgKHBhcnNlZC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IHN1ZmZpeCA9IFNJVEUudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IFNJVEUudGxkIDogYC4ke1NJVEUudGxkfWA7XG4gICAgY29uc3QgaXNQcml2YXRlSG9zdCA9IHBhcnNlZC5ob3N0bmFtZSA9PT0gc3VmZml4LnNsaWNlKDEpIHx8IHBhcnNlZC5ob3N0bmFtZS5lbmRzV2l0aChzdWZmaXgpO1xuICAgIGlmIChwYXJzZWQucHJvdG9jb2wgIT09ICdodHRwczonIHx8ICFpc1ByaXZhdGVIb3N0KSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRva2VuKSByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCByZXR1cm5QYXRoID0gYCR7cGFyc2VkLnBhdGhuYW1lfSR7cGFyc2VkLnNlYXJjaH0ke3BhcnNlZC5oYXNofWA7XG4gICAgcGFyc2VkLnBhdGhuYW1lID0gJy9kYXNoY2FkZHktc3NvJztcbiAgICBwYXJzZWQuc2VhcmNoID0gJyc7XG4gICAgcGFyc2VkLmhhc2ggPSAnJztcbiAgICBwYXJzZWQuc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCB0b2tlbik7XG4gICAgcGFyc2VkLnNlYXJjaFBhcmFtcy5zZXQoJ3JldHVybicsIHJldHVyblBhdGgpO1xuICAgIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8vIFNldHVwIGRpZ2l0IGlucHV0IFVYXG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWRpZ2l0cycpO1xuICBpZiAoY29udGFpbmVyKSB7XG4gICAgY29uc3QgaW5wdXRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Jyk7XG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0LCBpZHgpID0+IHtcbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHtcbiAgICAgICAgY29uc3QgdmFsID0gZS50YXJnZXQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICAgICAgZS50YXJnZXQudmFsdWUgPSB2YWwuc2xpY2UoMCwgMSk7XG4gICAgICAgIGlmICh2YWwgJiYgaWR4IDwgaW5wdXRzLmxlbmd0aCAtIDEpIGlucHV0c1tpZHggKyAxXS5mb2N1cygpO1xuICAgICAgICBjb25zdCBjb2RlID0gQXJyYXkuZnJvbShpbnB1dHMpLm1hcChpID0+IGkudmFsdWUpLmpvaW4oJycpO1xuICAgICAgICBpZiAoY29kZS5sZW5ndGggPT09IDYpIHN1Ym1pdFRvdHBDb2RlKGNvZGUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnICYmICFlLnRhcmdldC52YWx1ZSAmJiBpZHggPiAwKSB7XG4gICAgICAgICAgaW5wdXRzW2lkeCAtIDFdLmZvY3VzKCk7XG4gICAgICAgICAgaW5wdXRzW2lkeCAtIDFdLnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgcGFzdGVkID0gKGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0JykgfHwgJycpLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICAgIGlmIChwYXN0ZWQubGVuZ3RoID49IDYpIHtcbiAgICAgICAgICBpbnB1dHMuZm9yRWFjaCgoaW5wLCBpKSA9PiB7IGlucC52YWx1ZSA9IHBhc3RlZFtpXSB8fCAnJzsgfSk7XG4gICAgICAgICAgaW5wdXRzWzVdLmZvY3VzKCk7XG4gICAgICAgICAgc3VibWl0VG90cENvZGUocGFzdGVkLnNsaWNlKDAsIDYpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdWJtaXRUb3RwQ29kZShjb2RlKSB7XG4gICAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWVycm9yJyk7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdWZXJpZnlpbmcuLi4nO1xuICAgIGVycm9yRWwuY2xhc3NOYW1lID0gJ3RvdHAtZXJyb3IgdmVyaWZ5aW5nJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL3ZlcmlmeScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvZGUgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAvLyBVcGRhdGUgY2FjaGVkIENTUkYgdG9rZW4gZnJvbSBUT1RQIHJlc3BvbnNlIChzZXJ2ZXIgcm90YXRlcyBpdCBvbiBsb2dpbilcbiAgICAgICAgaWYgKGRhdGEuY3NyZlRva2VuKSB7XG4gICAgICAgICAgY3NyZlRva2VuID0gZGF0YS5jc3JmVG9rZW47XG4gICAgICAgIH1cbiAgICAgICAgaGlkZVRvdHBPdmVybGF5KCk7XG4gICAgICAgIC8vIENoZWNrIGlmIHJlZGlyZWN0ZWQgaGVyZSBmcm9tIGFub3RoZXIgc2VydmljZVxuICAgICAgICBjb25zdCByZWRpcmVjdCA9IHNhZmVTZXNzaW9uR2V0KCd0b3RwX3JlZGlyZWN0Jyk7XG4gICAgICAgIGlmIChyZWRpcmVjdCkge1xuICAgICAgICAgIHRyeSB7IHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvdHBfcmVkaXJlY3QnKTsgfSBjYXRjaCAoXykge31cbiAgICAgICAgICAvLyAuc2FtaSBpcyBhbiB1bnJlZ2lzdGVyZWQgVExELCBzbyBicm93c2VycyBzaWxlbnRseSBkcm9wIHRoZVxuICAgICAgICAgIC8vIERvbWFpbj0uc2FtaSBzZXNzaW9uIGNvb2tpZSBvbiBhbnkgT1RIRVIgKi5zYW1pIHN1YmRvbWFpbiAodGhleVxuICAgICAgICAgIC8vIHRyZWF0IFwic2FtaVwiIGFzIHRoZSBlZmZlY3RpdmUgcHVibGljIHN1ZmZpeCwgc2FtZSBwcm90ZWN0aW9uXG4gICAgICAgICAgLy8gdGhhdCBibG9ja3MgYSBEb21haW49LmNvbSBzdXBlcmNvb2tpZSkuIFRoZSB0YXJnZXQgc2VydmljZSBjYW4ndFxuICAgICAgICAgIC8vIHNlZSBvdXIgc2Vzc2lvbiBjb29raWUgbm8gbWF0dGVyIGhvdyBpdCdzIGJ1aWx0LCBzbyBpbnN0ZWFkIHdlXG4gICAgICAgICAgLy8gaGFuZCBpdCBhIG9uZS10aW1lIHRva2VuIGluIHRoZSBVUkw7IGl0cyBsb2dpbiBwYWdlIGV4Y2hhbmdlc1xuICAgICAgICAgIC8vIHRoYXQgZm9yIGl0cyBvd24gaG9zdC1vbmx5IGNvb2tpZSB2aWEgL2F1dGgvc3NvLWV4Y2hhbmdlLlxuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGJ1aWxkU3NvSGFuZG9mZlRhcmdldChyZWRpcmVjdCwgZGF0YS5zc29Ub2tlbik7XG4gICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRhcmdldDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBkYXNoYm9hcmRcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8ICdJbnZhbGlkIGNvZGUnO1xuICAgICAgICBlcnJvckVsLmNsYXNzTmFtZSA9ICd0b3RwLWVycm9yJztcbiAgICAgICAgY29uc3QgaW5wdXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3RvdHAtZGlnaXRzIGlucHV0Jyk7XG4gICAgICAgIGlucHV0cy5mb3JFYWNoKGkgPT4geyBpLnZhbHVlID0gJyc7IH0pO1xuICAgICAgICBpbnB1dHNbMF0/LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW9uIGVycm9yJztcbiAgICAgIGVycm9yRWwuY2xhc3NOYW1lID0gJ3RvdHAtZXJyb3InO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSA/YXV0aD1yZXF1aXJlZCByZWRpcmVjdCBmcm9tIENhZGR5IFNTTy5cbiAgLy8gREMtMDQ5OiBpZiB0aGUgYXV0aC1nYXRlIG1vZHVsZSB3aWxsIGhhbmRsZSB0aGlzIChtdWx0aS1wcm92aWRlclxuICAvLyBpbnN0YWxscyksIHNraXAgb3VyIFRPVFAtb25seSBicmFuY2ggZW50aXJlbHkuIFNpbmdsZS1wcm92aWRlclxuICAvLyBUT1RQLW9ubHkgaW5zdGFsbHMgY29udGludWUgdG8gdXNlIHRoaXMgcGF0aCBiZWNhdXNlIGF1dGgtZ2F0ZS5qc1xuICAvLyBkZWxlZ2F0ZXMgYmFjayB0byB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpLlxuICBjb25zdCBfX2RjXzA0OV9za2lwID0gISEod2luZG93Ll9fZGNfMDQ5X2hhbmRsZWQpO1xuICBpZiAoIV9fZGNfMDQ5X3NraXAgJiYgdXJsUGFyYW1zLmdldCgnYXV0aCcpID09PSAncmVxdWlyZWQnKSB7XG4gICAgY29uc3QgcmV0dXJuVXJsID0gdXJsUGFyYW1zLmdldCgncmV0dXJuJyk7XG4gICAgaWYgKHJldHVyblVybCkge1xuICAgICAgLy8gVmFsaWRhdGUgcmVkaXJlY3QgVVJMOiBtdXN0IGJlIHNhbWUtb3JpZ2luIG9yIGhvc3RuYW1lIG11c3QgZW5kIHdpdGggb3VyIFRMRFxuICAgICAgLy8gKHByZXZlbnRzIG9wZW4gcmVkaXJlY3QgdmlhIGluY2x1ZGVzKCkgYnlwYXNzIGxpa2UgZXZpbC5jb20/cT0uc2FtaSlcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmV0dXJuVXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBwYXJzZWQuaG9zdG5hbWU7XG4gICAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IHBhcnNlZC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgICAgIGNvbnN0IHRsZFN1ZmZpeCA9IFNJVEUudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IFNJVEUudGxkIDogJy4nICsgU0lURS50bGQ7XG4gICAgICAgIGNvbnN0IGlzT3VyVGxkID0gaG9zdG5hbWUuZW5kc1dpdGgodGxkU3VmZml4KSB8fCBob3N0bmFtZSA9PT0gdGxkU3VmZml4LnN1YnN0cmluZygxKTtcbiAgICAgICAgaWYgKGlzU2FtZU9yaWdpbiB8fCBpc091clRsZCkge1xuICAgICAgICAgIHNhZmVTZXNzaW9uU2V0KCd0b3RwX3JlZGlyZWN0JywgcmV0dXJuVXJsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAvLyBJbnZhbGlkIFVSTCBcdTIwMTQgcmVqZWN0IHJlZGlyZWN0XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENsZWFuIFVSTFxuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgJycsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gIH1cblxuICB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSA9IHNob3dUb3RwT3ZlcmxheTtcbn0pKCk7XG47XG4vLyA9PT09PSBUT1RQIFJFQ09WRVJZIEZMT1cgPT09PT1cbi8vIFB1YmxpYywgdW5hdXRoZW50aWNhdGVkIHJlY292ZXJ5IHBhdGggZm9yIHVzZXJzIHdobyBjYW4ndCBsb2cgaW4uXG4vLyBEZXNpZ25lZCBmb3IgdGhlIFwiZW5jcnlwdGlvbiBrZXkgcm90YXRlZCBhbmQgbG9zdCBteSBhdXRoZW50aWNhdG9yXCIgY2FzZS5cbi8vIFRoZSBmbG93IGlzOlxuLy9cbi8vICAxLiBPbiBUT1RQIG92ZXJsYXkgc2hvdywgY2FsbCAvYXBpL3YxL3RvdHAvcmVjb3ZlcnktaW5mbyAocHVibGljKS5cbi8vICAgICBJZiBzdGF0dXMgPT09ICd1bnJlYWRhYmxlJywgc2hvdyB0aGUgXCJMb3N0IGFjY2Vzcz9cIiBsaW5rIG9uIHRoZSBvdmVybGF5LlxuLy8gIDIuIFVzZXIgY2xpY2tzIGxpbmsgXHUyMTkyIG9wZW5zIHJlY292ZXJ5IHBhbmVsLlxuLy8gIDMuIFVzZXIgcGFzdGVzIEJhc2UzMiBzZWNyZXQgXHUyMTkyIFBPU1QgL2FwaS92MS90b3RwL3NldHVwIHdpdGgge3NlY3JldDogLi4ufS5cbi8vICAgICBCYWNrZW5kIHN0b3JlcyBhcyB0b3RwLnBlbmRpbmdfc2VjcmV0IChlbmNyeXB0ZWQgd2l0aCBjdXJyZW50IGtleSkuXG4vLyAgNC4gUGFuZWwgc3dpdGNoZXMgdG8gXCJ2ZXJpZnlcIiBtb2RlLiBVc2VyIGVudGVycyBhIGNvZGUgZnJvbSB0aGVcbi8vICAgICBuZXdseS1hZGRlZCBhdXRoZW50aWNhdG9yIGVudHJ5LiBQT1NUIC9hcGkvdjEvdG90cC92ZXJpZnktc2V0dXBcbi8vICAgICBwcm9tb3RlcyBwZW5kaW5nIFx1MjE5MiBhY3RpdmUgYW5kIHN0YXJ0cyBhIHNlc3Npb24uXG4vLyAgNS4gaGlkZVRvdHBPdmVybGF5KCkgYW5kIGluaXRpYWxpemVEYXNoYm9hcmQoKSBcdTIwMTQgc2FtZSBhcyBub3JtYWwgbG9naW4uXG4vL1xuLy8gVGhlIHJlY292ZXJ5IGZsb3cgbmV2ZXIgcmVxdWlyZXMgdGhlIHVzZXIgdG8gYmUgbG9nZ2VkIGluLiBJdCBkb2VzIHJlcXVpcmVcbi8vIHRoZW0gdG8gaGF2ZSB0aGVpciBCYXNlMzIgc2VjcmV0IHNhdmVkIChlLmcuIHBhc3N3b3JkIG1hbmFnZXIsIHNjcmVlbnNob3QsXG4vLyB0aGUgXCJEb3dubG9hZCBiYWNrdXAgZmlsZVwiIHdlIG9mZmVyIGF0IHNldHVwIHRpbWUgXHUyMDE0IHNlZSB0b3RwLXNldHRpbmdzLmpzKS5cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIEhlbHBlcnMgXHUyNTAwXHUyNTAwXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoUmVjb3ZlcnlJbmZvKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9yZWNvdmVyeS1pbmZvJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIHJldHVybiBhd2FpdCByLmpzb24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgc3RhdHVzOiAndW5rbm93bicsIGhpbnQ6ICdDb3VsZCBub3QgY29udGFjdCBzZXJ2ZXInIH07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1JlY292ZXJ5TGluayhzaG93KSB7XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWxpbmsnKTtcbiAgICBpZiAobGluaykgbGluay5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgZnVuY3Rpb24gb3BlblJlY292ZXJ5UGFuZWwoKSB7XG4gICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1wYW5lbCcpO1xuICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc3RhdHVzJyk7XG4gICAgY29uc3QgaW1wb3J0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1pbXBvcnQnKTtcbiAgICBjb25zdCB2ZXJpZnlFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXZlcmlmeScpO1xuICAgIGlmIChpbXBvcnRFbCkgaW1wb3J0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGlmICh2ZXJpZnlFbCkgdmVyaWZ5RWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAvLyBSZXNldCBzdGF0ZVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWVycm9yJykudGV4dENvbnRlbnQgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb25maXJtLWVycm9yJykudGV4dENvbnRlbnQgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zZWNyZXQnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKS52YWx1ZSA9ICcnO1xuICAgIC8vIFNob3cgY3VycmVudCBzdGF0dXNcbiAgICBmZXRjaFJlY292ZXJ5SW5mbygpLnRoZW4oaW5mbyA9PiB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGluZm8uaGludCB8fCAnJztcbiAgICAgIC8vIENvbG9yLWNvZGUgdGhlIHN0YXR1cyBiYW5uZXJcbiAgICAgIGlmIChpbmZvLnN0YXR1cyA9PT0gJ2hlYWx0aHknKSB7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLW9rLWZnLCAjN2VmMmZmKSc7XG4gICAgICB9IGVsc2UgaWYgKGluZm8uc3RhdHVzID09PSAndW5yZWFkYWJsZScpIHtcbiAgICAgICAgc3RhdHVzRWwuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tYmFkLWZnLCAjZmY5YWEzKSc7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWJhZC1mZykgNiUsIHRyYW5zcGFyZW50KSc7XG4gICAgICB9IGVsc2UgaWYgKGluZm8uc3RhdHVzID09PSAnbm90X2NvbmZpZ3VyZWQnKSB7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNFbC5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1ib3JkZXIpJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXNlY3JldCcpPy5mb2N1cygpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVJlY292ZXJ5UGFuZWwoKSB7XG4gICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1wYW5lbCcpO1xuICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFJlY292ZXJ5U2VjcmV0KCkge1xuICAgIGNvbnN0IHNlY3JldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXNlY3JldCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktZXJyb3InKTtcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICBpZiAoIXNlY3JldCkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdQYXN0ZSB5b3VyIEJhc2UzMiBrZXkgZmlyc3QnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIS9eW0EtWmEtejItN1xcc10rPSokLy50ZXN0KHNlY3JldCkpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnSW52YWxpZCBCYXNlMzIgZm9ybWF0IFx1MjAxNCBzaG91bGQgYmUgbGV0dGVycyBBLVogYW5kIGRpZ2l0cyAyLTcgb25seSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUE9TVCAvYXBpL3YxL3RvdHAvc2V0dXAgd2l0aCB7c2VjcmV0fSBcdTIwMTQgYmFja2VuZCBzdG9yZXMgYXMgcGVuZGluZ1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9zZXR1cCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlY3JldCB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgci5qc29uKCk7XG4gICAgICBpZiAoIXIub2sgfHwgIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCBkYXRhLm1lc3NhZ2UgfHwgJ1Jlc3RvcmUgZmFpbGVkJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU3dpdGNoIHBhbmVsIHRvIHZlcmlmeSBtb2RlXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1pbXBvcnQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktdmVyaWZ5Jykuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJyk/LmZvY3VzKCksIDEwMCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdOZXR3b3JrIGVycm9yIFx1MjAxNCB0cnkgYWdhaW4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFJlY292ZXJ5Q29kZSgpIHtcbiAgICBjb25zdCBjb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29uZmlybS1lcnJvcicpO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmICghL15cXGR7Nn0kLy50ZXN0KGNvZGUpKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0VudGVyIGEgNi1kaWdpdCBjb2RlJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQT1NUIC9hcGkvdjEvdG90cC92ZXJpZnktc2V0dXAgXHUyMDE0IHByb21vdGVzIHBlbmRpbmcgXHUyMTkyIGFjdGl2ZSArIHN0YXJ0cyBzZXNzaW9uXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL3ZlcmlmeS1zZXR1cCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvZGUgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKCFyLm9rIHx8ICFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgZGF0YS5tZXNzYWdlIHx8ICdJbnZhbGlkIGNvZGUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJykudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpPy5mb2N1cygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTdWNjZXNzIFx1MjAxNCBoaWRlIGV2ZXJ5dGhpbmcgYW5kIGluaXRpYWxpemUgZGFzaGJvYXJkXG4gICAgICBjbG9zZVJlY292ZXJ5UGFuZWwoKTtcbiAgICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgICBpZiAob3ZlcmxheSkgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdOZXR3b3JrIGVycm9yIFx1MjAxNCB0cnkgYWdhaW4nO1xuICAgIH1cbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBXaXJlIHVwIGhhbmRsZXJzIFx1MjUwMFx1MjUwMFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zaG93LXJlY292ZXJ5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgb3BlblJlY292ZXJ5UGFuZWwoKTtcbiAgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNsb3NlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VSZWNvdmVyeVBhbmVsKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc3VibWl0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0UmVjb3ZlcnlTZWNyZXQpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb25maXJtJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0UmVjb3ZlcnlDb2RlKTtcblxuICAvLyBFbnRlciBrZXkgc3VibWl0cyBpbiBzZWNyZXQgZmllbGRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc2VjcmV0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN1Ym1pdFJlY292ZXJ5U2VjcmV0KCk7IH1cbiAgfSk7XG4gIC8vIEVudGVyIGtleSBzdWJtaXRzIGluIGNvZGUgZmllbGRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpPy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzdWJtaXRSZWNvdmVyeUNvZGUoKTsgfVxuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUHVibGljIEFQSSBcdTI1MDBcdTI1MDBcbiAgLy8gQ2FsbGVkIGJ5IHRvdHAtYXV0aC5qcyBhZnRlciBzaG93aW5nIHRoZSBvdmVybGF5LCBzbyB3ZSBjYW4gZGVjaWRlIHdoZXRoZXJcbiAgLy8gdG8gc2hvdyB0aGUgcmVjb3ZlcnkgbGluay4gV2UgZG8gdGhpcyB3aXRoIGEgcHVibGljIGVuZHBvaW50IHRoYXQgZG9lc24ndFxuICAvLyByZXF1aXJlIGF1dGggXHUyMDE0IHBlcmZlY3QgZm9yIHRoZSBsb2NrZWQtb3V0IHN0YXRlLlxuICB3aW5kb3cuX3JlZnJlc2hSZWNvdmVyeUxpbmsgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgZmV0Y2hSZWNvdmVyeUluZm8oKTtcbiAgICAvLyBTaG93IHRoZSBsaW5rIGluIGFueSBub24taGVhbHRoeSBzdGF0ZSAodW5yZWFkYWJsZSAvIGNvcnJ1cHQgLyB1bmtub3duKS5cbiAgICAvLyBUaGUgaGludCBpbnNpZGUgdGhlIHBhbmVsIHRlbGxzIHRoZSB1c2VyIHdoYXQgdGhlIGFjdHVhbCBpc3N1ZSBpcy5cbiAgICBpZiAoaW5mbyAmJiBpbmZvLnN1Y2Nlc3MgJiYgaW5mby5zdGF0dXMgJiYgaW5mby5zdGF0dXMgIT09ICdoZWFsdGh5Jykge1xuICAgICAgc2hvd1JlY292ZXJ5TGluayh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1JlY292ZXJ5TGluayhmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9O1xufSkoKTtcbjtcbi8vID09PT09IFNFUlZJQ0UgQ1JFREVOVElBTFMgPT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuICBpbmplY3RNb2RhbCgnZm9sZGVyLWJyb3dzZXItbW9kYWwnLCBgPGRpdiBpZD1cImZvbGRlci1icm93c2VyLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA1MDBweDsgbWF4LXdpZHRoOiA3MDBweDsgbWF4LWhlaWdodDogODB2aDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQzIgQnJvd3NlIGZvciBNZWRpYSBGb2xkZXJzPC9oMz5cblxuICAgICAgPGRpdiBpZD1cImZvbGRlci1icm93c2VyLXBhdGhcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiA2cHg7IG1hcmdpbi1ib3R0b206IDEycHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC45cmVtOyB3b3JkLWJyZWFrOiBicmVhay1hbGw7XCI+XG4gICAgICAgIC9cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItbGlzdFwiIHN0eWxlPVwibWF4LWhlaWdodDogNDAwcHg7IG92ZXJmbG93LXk6IGF1dG87IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Mb2FkaW5nLi4uPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImZvbGRlci1icm93c2VyLXNlbGVjdGVkXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMTAlLCB0cmFuc3BhcmVudCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXN1Y2Nlc3MpOyBib3JkZXItcmFkaXVzOiA2cHg7IGRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPlNlbGVjdGVkIGZvbGRlcnM6PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJmb2xkZXItYnJvd3Nlci1zZWxlY3RlZC1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJmb2xkZXItYnJvd3Nlci1zZWxlY3QtY3VycmVudFwiIGNsYXNzPVwiYnRuLWFjY2VudFwiPlxuICAgICAgICAgICsgQWRkIEN1cnJlbnQgRm9sZGVyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3ctZ2FwXCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImZvbGRlci1icm93c2VyLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJmb2xkZXItYnJvd3Nlci1kb25lXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMjAlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1jb2xvcjogdmFyKC0tc3VjY2Vzcyk7IGNvbG9yOiB2YXIoLS1zdWNjZXNzKTtcIj5Eb25lPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGluamVjdE1vZGFsKCdzZXJ2aWNlLWNyZWRzLW1vZGFsJywgYDxkaXYgaWQ9XCJzZXJ2aWNlLWNyZWRzLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY3JlZHMtY29udGVudFwiPlxuICAgICAgPGgzIGlkPVwic3ZjLWNyZWRzLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46IDAgMCA0cHg7IGZvbnQtc2l6ZTogMS4wNXJlbTtcIj5TZXJ2aWNlIENyZWRlbnRpYWxzPC9oMz5cbiAgICAgIDxwIGlkPVwic3ZjLWNyZWRzLWRlc2NcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTRweDtcIj5DcmVkZW50aWFscyBhcmUgaW5qZWN0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFjY2Vzc2luZyB0aGlzIHNlcnZpY2UuPC9wPlxuXG4gICAgICA8IS0tIFN0YXR1cyBpbmRpY2F0b3IgLS0+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwic3ZjLWNyZWRzLWRvdFwiIGNsYXNzPVwic3RhdHVzLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJzdmMtY3JlZHMtc3RhdHVzXCIgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+Tm8gY3JlZGVudGlhbHMgc3RvcmVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VlZGhvc3QgY3JlZGVudGlhbHMgKHNob3duIGZvciBleHRlcm5hbCBzZXJ2aWNlcykgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLXNlZWRob3N0XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1ib2xkXCI+U2VlZGhvc3QgTG9naW48L2xhYmVsPlxuICAgICAgICA8cCBjbGFzcz1cImhpbnQtbWljcm9cIj5Vc2VybmFtZSBzaGFyZWQgYWNyb3NzIGFsbCBzZXJ2aWNlcy4gUGFzc3dvcmQgaXMgcGVyLXNlcnZpY2UuPC9wPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInN2Yy1zZWVkaG9zdC11c2VyXCIgcGxhY2Vob2xkZXI9XCJVc2VybmFtZSAoc2hhcmVkKVwiIGF1dG9jb21wbGV0ZT1cInVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBtYXJnaW4tYm90dG9tOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIgLz5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwic3ZjLXNlZWRob3N0LXBhc3NcIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwiY3VycmVudC1wYXNzd29yZFwiXG4gICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWNyZWRzXCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEFQSSBLZXkgKHNob3duIGZvciBhcnIgc2VydmljZXMgb3Igc2VydmljZXMgd2l0aCBBUEkga2V5IHN1cHBvcnQpIC0tPlxuICAgICAgPGRpdiBpZD1cInN2Yy1jcmVkcy1hcGlrZXlcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLWJvbGRcIj5BUEkgS2V5PC9sYWJlbD5cbiAgICAgICAgPHAgY2xhc3M9XCJoaW50LW1pY3JvXCI+QnlwYXNzZXMgdGhlIGFwcCdzIG93biBsb2dpbiBzY3JlZW48L3A+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3ZjLWFwaWtleS1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiQVBJIGtleVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUXVhbGl0eSBQcm9maWxlIChzaG93biBmb3IgcmFkYXJyL3NvbmFyciBvbmx5KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdmMtY3JlZHMtcXVhbGl0eVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtYm9sZFwiPlF1YWxpdHkgUHJvZmlsZTwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwiaGludC1taWNyb1wiPlVzZWQgd2hlbiByZXF1ZXN0aW5nIHZpYSBTZWVycjwvcD5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzdmMtcXVhbGl0eS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBFbnRlciBBUEkga2V5IGZpcnN0IC0tPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInN2Yy1xdWFsaXR5LWZldGNoXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBmb250LXNpemU6IDAuNzVyZW07IGN1cnNvcjogcG9pbnRlcjsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAgIEZldGNoXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic3ZjLXF1YWxpdHktc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IG1hcmdpbi10b3A6IDRweDsgbWluLWhlaWdodDogMWVtO1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGVyLXNlcnZpY2UgQmFzaWMgQXV0aCAoc2hvd24gZm9yIG5vbi1leHRlcm5hbCBzZXJ2aWNlcykgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLWJhc2ljXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1ib2xkXCI+U2VydmljZSBMb2dpbjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3ZjLWJhc2ljLXVzZXJcIiBwbGFjZWhvbGRlcj1cIlVzZXJuYW1lXCIgYXV0b2NvbXBsZXRlPVwidXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEwcHg7IG1hcmdpbi10b3A6IDZweDsgbWFyZ2luLWJvdHRvbTogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiIC8+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cInN2Yy1iYXNpYy1wYXNzXCIgcGxhY2Vob2xkZXI9XCJQYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cImN1cnJlbnQtcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1jcmVkc1wiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFcnJvciBtZXNzYWdlIC0tPlxuICAgICAgPGRpdiBpZD1cInN2Yy1jcmVkcy1lcnJvclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogOHB4IDEwcHg7IG1hcmdpbi1ib3R0b206IDEwcHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1lcnJvciwgI2M2MjgyOCkgMTIlLCB0cmFuc3BhcmVudCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWVycm9yLCAjYzYyODI4KTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj48L2Rpdj5cblxuICAgICAgPCEtLSBCdXR0b25zIC0tPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW4tdG9wOiAxNHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic3ZjLWNyZWRzLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDlweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIFNhdmVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdmMtY3JlZHMtY2xlYXJcIiBzdHlsZT1cInBhZGRpbmc6IDlweCAxNHB4OyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuODVyZW07IGRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgQ2xlYXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdmMtY3JlZHMtY2xvc2VcIiBzdHlsZT1cInBhZGRpbmc6IDlweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWNyZWRzLW1vZGFsJyk7XG4gIGxldCBjdXJyZW50U2VydmljZSA9IG51bGw7XG4gIGNvbnN0IGFyclNlcnZpY2VzID0gWydzb25hcnInLCAncmFkYXJyJywgJ3Byb3dsYXJyJywgJ292ZXJzZWVyciddO1xuICBjb25zdCBxdWFsaXR5UHJvZmlsZVNlcnZpY2VzID0gWydzb25hcnInLCAncmFkYXJyJ107XG5cbiAgZnVuY3Rpb24gZ2V0U2VydmljZVVybChzZXJ2aWNlKSB7XG4gICAgcmV0dXJuIHNlcnZpY2UuZXh0ZXJuYWxVcmwgfHwgc2VydmljZS51cmwgfHwgJyc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93RXJyb3IobXNnKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWVycm9yJyk7XG4gICAgZWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlkZUVycm9yKCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1lcnJvcicpO1xuICAgIGVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwgPSBhc3luYyBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgY3VycmVudFNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIGhpZGVFcnJvcigpO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy10aXRsZScpO1xuICAgIGNvbnN0IGRlc2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWRlc2MnKTtcbiAgICBjb25zdCBzZWVkaG9zdFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXNlZWRob3N0Jyk7XG4gICAgY29uc3QgYXBpa2V5U2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtYXBpa2V5Jyk7XG4gICAgY29uc3QgYmFzaWNTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1iYXNpYycpO1xuICAgIGNvbnN0IHF1YWxpdHlTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1xdWFsaXR5Jyk7XG5cbiAgICB0aXRsZS50ZXh0Q29udGVudCA9IHNlcnZpY2UubmFtZSArICcgQ3JlZGVudGlhbHMnO1xuICAgIC8vIERldGVybWluZSB3aGljaCBzZWN0aW9ucyB0byBzaG93XG4gICAgY29uc3QgaXNFeHQgPSAhIXNlcnZpY2UuaXNFeHRlcm5hbDtcbiAgICBjb25zdCBpc0FyciA9IGFyclNlcnZpY2VzLmluY2x1ZGVzKHNlcnZpY2UuaWQpIHx8IGFyclNlcnZpY2VzLmluY2x1ZGVzKHNlcnZpY2UuYXBwVGVtcGxhdGUpO1xuICAgIGNvbnN0IGhhc1F1YWxpdHkgPSBxdWFsaXR5UHJvZmlsZVNlcnZpY2VzLmluY2x1ZGVzKHNlcnZpY2UuaWQpIHx8IHF1YWxpdHlQcm9maWxlU2VydmljZXMuaW5jbHVkZXMoc2VydmljZS5hcHBUZW1wbGF0ZSk7XG5cbiAgICBzZWVkaG9zdFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9IGlzRXh0ID8gJycgOiAnbm9uZSc7XG4gICAgYXBpa2V5U2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gaXNBcnIgPyAnJyA6ICdub25lJztcbiAgICBxdWFsaXR5U2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gaGFzUXVhbGl0eSA/ICcnIDogJ25vbmUnO1xuICAgIGJhc2ljU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gIWlzRXh0ID8gJycgOiAnbm9uZSc7XG5cbiAgICAvLyBSZXNldCBxdWFsaXR5IGRyb3Bkb3duXG4gICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gRW50ZXIgQVBJIGtleSBmaXJzdCAtLTwvb3B0aW9uPic7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXN0YXR1cycpLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICBpZiAoaXNFeHQpIHtcbiAgICAgIGRlc2MudGV4dENvbnRlbnQgPSAnU2VlZGhvc3QgY3JlZGVudGlhbHMgYXV0by1sb2dpbiBwYXN0IHRoZSBIVFRQIHByb21wdC4gQVBJIGtleSBieXBhc3NlcyB0aGUgYXBwIGxvZ2luLic7XG4gICAgICAvLyBVcGRhdGUgcGFzc3dvcmQgcGxhY2Vob2xkZXIgd2l0aCBzZXJ2aWNlIG5hbWVcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtcGFzcycpLnBsYWNlaG9sZGVyID0gYFBhc3N3b3JkIGZvciAke3NlcnZpY2UubmFtZX1gO1xuICAgIH0gZWxzZSBpZiAoaXNBcnIpIHtcbiAgICAgIGRlc2MudGV4dENvbnRlbnQgPSAnQVBJIGtleSBieXBhc3NlcyB0aGUgYXBwIGxvZ2luIHNjcmVlbiBhdXRvbWF0aWNhbGx5Lic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc2MudGV4dENvbnRlbnQgPSAnQ3JlZGVudGlhbHMgYXJlIGluamVjdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhY2Nlc3NpbmcgdGhpcyBzZXJ2aWNlLic7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBleGlzdGluZyBjcmVkZW50aWFsc1xuICAgIGF3YWl0IGxvYWRTZXJ2aWNlQ3JlZHMoc2VydmljZSk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTZXJ2aWNlQ3JlZHMoc2VydmljZSkge1xuICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtZG90Jyk7XG4gICAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1zdGF0dXMnKTtcbiAgICBjb25zdCBjbGVhckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtY2xlYXInKTtcbiAgICBsZXQgaGFzQ3JlZHMgPSBmYWxzZTtcblxuICAgIC8vIExvYWQgc2VlZGhvc3QgY3JlZHMgKHNoYXJlZCB1c2VybmFtZSArIHBlci1zZXJ2aWNlIHBhc3N3b3JkKVxuICAgIGlmIChzZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlZWRob3N0LWNyZWRzP3NlcnZpY2VJZD0ke3NlcnZpY2UuaWR9YCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC11c2VyJykudmFsdWUgPSBkYXRhLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgICAgIGlmIChkYXRhLmhhc0NyZWRlbnRpYWxzKSBoYXNDcmVkcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC11c2VyJykudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC1wYXNzJykudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICAvLyBMb2FkIHBlci1zZXJ2aWNlIGNyZWRzXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7c2VydmljZS5pZH0vY3JlZGVudGlhbHNgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBpZiAoZGF0YS5oYXNBcGlLZXkpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWFwaWtleS1pbnB1dCcpLnZhbHVlID0gJ1x1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMic7XG4gICAgICAgICAgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYXBpa2V5LWlucHV0JykudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5oYXNCYXNpY0F1dGggJiYgIXNlcnZpY2UuaXNFeHRlcm5hbCkge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtdXNlcicpLnZhbHVlID0gZGF0YS51c2VybmFtZSB8fCAnJztcbiAgICAgICAgICBoYXNDcmVkcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy11c2VyJykudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy1wYXNzJykpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtcGFzcycpLnZhbHVlID0gJyc7XG5cbiAgICAvLyBMb2FkIHF1YWxpdHkgcHJvZmlsZSBmb3IgYXJyIHNlcnZpY2VzXG4gICAgY29uc3Qgc3ZjSWQgPSBzZXJ2aWNlLmlkIHx8IHNlcnZpY2UuYXBwVGVtcGxhdGU7XG4gICAgaWYgKHF1YWxpdHlQcm9maWxlU2VydmljZXMuaW5jbHVkZXMoc3ZjSWQpKSB7XG4gICAgICBhd2FpdCBsb2FkUXVhbGl0eVByb2ZpbGVzKHNlcnZpY2UpO1xuICAgIH1cblxuICAgIGlmIChoYXNDcmVkcykge1xuICAgICAgZG90LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tb2stZmcsICM3NGRmYzQpJztcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZywgIzc0ZGZjNCknO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ0NyZWRlbnRpYWxzIHN0b3JlZCc7XG4gICAgICBjbGVhckJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAvLyBVcGRhdGUgdGhlIGNhcmQgYnV0dG9uXG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY3JlZHMtYnRuLSR7c2VydmljZS5pZH1gKTtcbiAgICAgIGlmIChidG4pIGJ0bi5jbGFzc0xpc3QuYWRkKCdoYXMtY3JlZHMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG90LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ05vIGNyZWRlbnRpYWxzIHN0b3JlZCc7XG4gICAgICBjbGVhckJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZldGNoIGFuZCBwb3B1bGF0ZSBxdWFsaXR5IHByb2ZpbGVzIGRyb3Bkb3duXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRRdWFsaXR5UHJvZmlsZXMoc2VydmljZSkge1xuICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgY29uc3QgcXVhbFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zdGF0dXMnKTtcbiAgICBjb25zdCBzdmNJZCA9IHNlcnZpY2UuaWQgfHwgc2VydmljZS5hcHBUZW1wbGF0ZTtcbiAgICBjb25zdCBzdmNVcmwgPSBnZXRTZXJ2aWNlVXJsKHNlcnZpY2UpO1xuXG4gICAgaWYgKCFzdmNVcmwpIHtcbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBObyBzZXJ2aWNlIFVSTCAtLTwvb3B0aW9uPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkxvYWRpbmcuLi48L29wdGlvbj4nO1xuICAgIHF1YWxTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgc2VydmljZTogc3ZjSWQsIHVybDogc3ZjVXJsIH0pO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvYXJyL3F1YWxpdHktcHJvZmlsZXM/JHtwYXJhbXN9YCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEucHJvZmlsZXM/Lmxlbmd0aCkge1xuICAgICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gTm8gcHJvZmlsZXMgZm91bmQgKGVudGVyIEFQSSBrZXkgYW5kIGNsaWNrIEZldGNoKSAtLTwvb3B0aW9uPic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnJztcbiAgICAgIGZvciAoY29uc3QgcCBvZiBkYXRhLnByb2ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBwLmlkO1xuICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBwLm5hbWU7XG4gICAgICAgIHF1YWxTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJlLXNlbGVjdCBzdG9yZWQgcHJvZmlsZSBvciBiZXN0IG1hdGNoIGZvciBcIjcyMFwiXG4gICAgICBpZiAoZGF0YS5zdG9yZWRQcm9maWxlSWQpIHtcbiAgICAgICAgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhkYXRhLnN0b3JlZFByb2ZpbGVJZCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1YWxTZWxlY3QudmFsdWUpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSA3MjBwLWlzaCBwcm9maWxlXG4gICAgICAgIGNvbnN0IG1hdGNoNzIwID0gZGF0YS5wcm9maWxlcy5maW5kKHAgPT4gLzcyMC9pLnRlc3QocC5uYW1lKSk7XG4gICAgICAgIGlmIChtYXRjaDcyMCkgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhtYXRjaDcyMC5pZCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1YWxTZWxlY3QudmFsdWUgJiYgZGF0YS5wcm9maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhkYXRhLnByb2ZpbGVzWzBdLmlkKTtcbiAgICAgIH1cblxuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiR7ZGF0YS5wcm9maWxlcy5sZW5ndGh9IHByb2ZpbGVzIGxvYWRlZDwvc3Bhbj5gO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBGYWlsZWQgdG8gbG9hZCAtLTwvb3B0aW9uPic7XG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+RXJyb3I6ICR7ZS5tZXNzYWdlfTwvc3Bhbj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZldGNoIGJ1dHRvbiBmb3IgcXVhbGl0eSBwcm9maWxlc1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktZmV0Y2gnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGNvbnN0IHN2Y0lkID0gY3VycmVudFNlcnZpY2UuaWQgfHwgY3VycmVudFNlcnZpY2UuYXBwVGVtcGxhdGU7XG4gICAgY29uc3Qgc3ZjVXJsID0gZ2V0U2VydmljZVVybChjdXJyZW50U2VydmljZSk7XG4gICAgY29uc3QgYXBpS2V5SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWFwaWtleS1pbnB1dCcpO1xuICAgIGNvbnN0IGFwaUtleSA9IGFwaUtleUlucHV0Py52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICBjb25zdCBxdWFsU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXN0YXR1cycpO1xuXG4gICAgaWYgKCFzdmNVcmwpIHtcbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj5ObyBzZXJ2aWNlIFVSTCBhdmFpbGFibGU8L3NwYW4+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFhcGlLZXkgfHwgYXBpS2V5ID09PSAnXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyJykge1xuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPkVudGVyIGFuIEFQSSBrZXkgZmlyc3Q8L3NwYW4+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+RmV0Y2hpbmcuLi48L29wdGlvbj4nO1xuICAgIHF1YWxTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgc2VydmljZTogc3ZjSWQsIHVybDogc3ZjVXJsLCBhcGlLZXkgfSk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcnIvcXVhbGl0eS1wcm9maWxlcz8ke3BhcmFtc31gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gRXJyb3IgLS08L29wdGlvbj4nO1xuICAgICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+JHtkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gZmV0Y2ggcHJvZmlsZXMnfTwvc3Bhbj5gO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghZGF0YS5wcm9maWxlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBObyBwcm9maWxlcyBmb3VuZCAtLTwvb3B0aW9uPic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnJztcbiAgICAgIGZvciAoY29uc3QgcCBvZiBkYXRhLnByb2ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBwLmlkO1xuICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBwLm5hbWU7XG4gICAgICAgIHF1YWxTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJlLXNlbGVjdCA3MjBwIG1hdGNoXG4gICAgICBjb25zdCBtYXRjaDcyMCA9IGRhdGEucHJvZmlsZXMuZmluZChwID0+IC83MjAvaS50ZXN0KHAubmFtZSkpO1xuICAgICAgaWYgKG1hdGNoNzIwKSBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKG1hdGNoNzIwLmlkKTtcbiAgICAgIGVsc2UgaWYgKGRhdGEucHJvZmlsZXMubGVuZ3RoKSBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKGRhdGEucHJvZmlsZXNbMF0uaWQpO1xuXG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1vay1mZyk7XCI+JHtkYXRhLnByb2ZpbGVzLmxlbmd0aH0gcHJvZmlsZXMgbG9hZGVkPC9zcGFuPmA7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEVycm9yIC0tPC9vcHRpb24+JztcbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj4ke2UubWVzc2FnZX08L3NwYW4+YDtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFNhdmUgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlKSByZXR1cm47XG4gICAgY29uc3Qgc2F2ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc2F2ZScpO1xuICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2aW5nLi4uJztcbiAgICBzYXZlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBoaWRlRXJyb3IoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpc0FyciA9IGFyclNlcnZpY2VzLmluY2x1ZGVzKGN1cnJlbnRTZXJ2aWNlLmlkKSB8fCBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhjdXJyZW50U2VydmljZS5hcHBUZW1wbGF0ZSk7XG4gICAgICBjb25zdCBzdmNJZCA9IGN1cnJlbnRTZXJ2aWNlLmlkIHx8IGN1cnJlbnRTZXJ2aWNlLmFwcFRlbXBsYXRlO1xuXG4gICAgICAvLyBTYXZlIHNlZWRob3N0IGNyZWRzIChzaGFyZWQgdXNlcm5hbWUgKyBwZXItc2VydmljZSBwYXNzd29yZClcbiAgICAgIGlmIChjdXJyZW50U2VydmljZS5pc0V4dGVybmFsKSB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXVzZXInKS52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IHBhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXBhc3MnKS52YWx1ZTtcbiAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zZWVkaG9zdC1jcmVkcycsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVzZXJuYW1lOiB1c2VyLCBwYXNzd29yZDogcGFzcyB8fCB1bmRlZmluZWQsIHNlcnZpY2VJZDogY3VycmVudFNlcnZpY2UuaWQgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTYXZlIEFQSSBrZXkgXHUyMDE0IGZvciBhcnIgc2VydmljZXMsIHVzZSB0aGUgYXJyIGNyZWRlbnRpYWxzIGVuZHBvaW50IChjb3JyZWN0IG5hbWVzcGFjZSlcbiAgICAgIGNvbnN0IGFwaUtleUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1hcGlrZXktaW5wdXQnKTtcbiAgICAgIGNvbnN0IGFwaUtleSA9IGFwaUtleUlucHV0Py52YWx1ZS50cmltKCk7XG4gICAgICBpZiAoYXBpS2V5ICYmIGFwaUtleSAhPT0gJ1x1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMicpIHtcbiAgICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgICAgLy8gVXNlIGFyciBjcmVkZW50aWFscyBlbmRwb2ludCBcdTIwMTQgdmFsaWRhdGVzIGtleSwgdGVzdHMgY29ubmVjdGlvbiwgc3RvcmVzIGluIGFyci4qIG5hbWVzcGFjZVxuICAgICAgICAgIGNvbnN0IHN2Y1VybCA9IGdldFNlcnZpY2VVcmwoY3VycmVudFNlcnZpY2UpO1xuICAgICAgICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgICAgICAgY29uc3QgcXVhbGl0eVByb2ZpbGVJZCA9IHF1YWxTZWxlY3Q/LnZhbHVlID8gcGFyc2VJbnQocXVhbFNlbGVjdC52YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgcXVhbGl0eVByb2ZpbGVOYW1lID0gcXVhbFNlbGVjdD8uc2VsZWN0ZWRPcHRpb25zPy5bMF0/LnRleHRDb250ZW50IHx8IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Fyci9jcmVkZW50aWFscycsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHNlcnZpY2U6IHN2Y0lkLFxuICAgICAgICAgICAgICBhcGlLZXksXG4gICAgICAgICAgICAgIHVybDogc3ZjVXJsIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcXVhbGl0eVByb2ZpbGVJZDogcXVhbGl0eVByb2ZpbGVJZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHF1YWxpdHlQcm9maWxlTmFtZTogcXVhbGl0eVByb2ZpbGVOYW1lIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgc2hvd0Vycm9yKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIEFQSSBrZXknKTtcbiAgICAgICAgICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2ZSc7XG4gICAgICAgICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLmNvbm5lY3Rpb25UZXN0ICYmICFkYXRhLmNvbm5lY3Rpb25UZXN0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHNob3dFcnJvcihgQVBJIGtleSBzYXZlZCBidXQgY29ubmVjdGlvbiB0ZXN0IGZhaWxlZDogJHtkYXRhLmNvbm5lY3Rpb25UZXN0LmVycm9yfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb24tYXJyIHNlcnZpY2VzIHVzZSB0aGUgZ2VuZXJpYyBlbmRwb2ludFxuICAgICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7Y3VycmVudFNlcnZpY2UuaWR9L2NyZWRlbnRpYWxzYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYXBpS2V5IH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNBcnIgJiYgcXVhbGl0eVByb2ZpbGVTZXJ2aWNlcy5pbmNsdWRlcyhzdmNJZCkpIHtcbiAgICAgICAgLy8gQVBJIGtleSB1bmNoYW5nZWQgYnV0IHVzZXIgbWF5IGhhdmUgY2hhbmdlZCBxdWFsaXR5IHByb2ZpbGUgXHUyMDE0IHNhdmUgcHJvZmlsZSBvbmx5XG4gICAgICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgICAgIGNvbnN0IHF1YWxpdHlQcm9maWxlSWQgPSBxdWFsU2VsZWN0Py52YWx1ZSA/IHBhcnNlSW50KHF1YWxTZWxlY3QudmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBxdWFsaXR5UHJvZmlsZU5hbWUgPSBxdWFsU2VsZWN0Py5zZWxlY3RlZE9wdGlvbnM/LlswXT8udGV4dENvbnRlbnQgfHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAocXVhbGl0eVByb2ZpbGVJZCkge1xuICAgICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Fyci9xdWFsaXR5LXByb2ZpbGVzJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmljZTogc3ZjSWQsIHF1YWxpdHlQcm9maWxlSWQsIHF1YWxpdHlQcm9maWxlTmFtZSB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgcGVyLXNlcnZpY2UgYmFzaWMgYXV0aFxuICAgICAgaWYgKCFjdXJyZW50U2VydmljZS5pc0V4dGVybmFsKSB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXVzZXInKS52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IHBhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXBhc3MnKS52YWx1ZTtcbiAgICAgICAgaWYgKHVzZXIgJiYgcGFzcykge1xuICAgICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7Y3VycmVudFNlcnZpY2UuaWR9L2NyZWRlbnRpYWxzYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdXNlcm5hbWU6IHVzZXIsIHBhc3N3b3JkOiBwYXNzIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgbG9hZFNlcnZpY2VDcmVkcyhjdXJyZW50U2VydmljZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbU2VydmljZUNyZWRlbnRpYWxzXSBTYXZlJywgZSwgeyBmdW5jdGlvbjogJ3NhdmVDcmVkZW50aWFscycgfSk7XG4gICAgICBzaG93RXJyb3IoJ0ZhaWxlZCB0byBzYXZlOiAnICsgKGUubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcicpKTtcbiAgICB9XG4gICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZlJztcbiAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gIH0pO1xuXG4gIC8vIENsZWFyIGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWNsZWFyJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY3VycmVudFNlcnZpY2UpIHJldHVybjtcbiAgICBpZiAoIWNvbmZpcm0oYFJlbW92ZSBzdG9yZWQgY3JlZGVudGlhbHMgZm9yICR7Y3VycmVudFNlcnZpY2UubmFtZX0/YCkpIHJldHVybjtcbiAgICBoaWRlRXJyb3IoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3ZjSWQgPSBjdXJyZW50U2VydmljZS5pZCB8fCBjdXJyZW50U2VydmljZS5hcHBUZW1wbGF0ZTtcbiAgICAgIGNvbnN0IGlzQXJyID0gYXJyU2VydmljZXMuaW5jbHVkZXMoc3ZjSWQpO1xuICAgICAgaWYgKGN1cnJlbnRTZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvc2VlZGhvc3QtY3JlZHM/c2VydmljZUlkPSR7Y3VycmVudFNlcnZpY2UuaWR9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgfVxuICAgICAgLy8gRGVsZXRlIGZyb20gYm90aCBuYW1lc3BhY2VzXG4gICAgICBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke2N1cnJlbnRTZXJ2aWNlLmlkfS9jcmVkZW50aWFsc2AsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGlmIChpc0Fycikge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9hcnIvY3JlZGVudGlhbHMvJHtzdmNJZH1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY3JlZHMtYnRuLSR7Y3VycmVudFNlcnZpY2UuaWR9YCk7XG4gICAgICBpZiAoYnRuKSBidG4uY2xhc3NMaXN0LnJlbW92ZSgnaGFzLWNyZWRzJyk7XG4gICAgICBhd2FpdCBsb2FkU2VydmljZUNyZWRzKGN1cnJlbnRTZXJ2aWNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tTZXJ2aWNlQ3JlZGVudGlhbHNdIENsZWFyJywgZSwgeyBmdW5jdGlvbjogJ2NsZWFyQ3JlZGVudGlhbHMnIH0pO1xuICAgICAgc2hvd0Vycm9yKCdGYWlsZWQgdG8gY2xlYXI6ICcgKyAoZS5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJykpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ2xvc2UgYnV0dG9uIC8gYmFja2Ryb3BcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1jbG9zZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgY3VycmVudFNlcnZpY2UgPSBudWxsO1xuICB9KTtcbiAgbW9kYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBjdXJyZW50U2VydmljZSA9IG51bGw7XG4gICAgfVxuICB9KTtcblxuICAvLyBDaGVjayBjcmVkZW50aWFsIHN0YXR1cyBmb3IgYWxsIHNlcnZpY2VzIG9uIHBhZ2UgbG9hZCAodXBkYXRlIGtleSBidXR0b24gaGlnaGxpZ2h0cylcbiAgd2luZG93LnJlZnJlc2hDcmVkc0J1dHRvbnMgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBhcHAgb2YgKHdpbmRvdy5BUFBTIHx8IFtdKSkge1xuICAgICAgICBpZiAoIWFwcC5pc0V4dGVybmFsICYmICFhcHAuYXBwVGVtcGxhdGUgJiYgIWFwcC51cmwpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgaGFzQ3JlZHMgPSBmYWxzZTtcbiAgICAgICAgaWYgKGFwcC5pc0V4dGVybmFsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNlZWRSZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZWVkaG9zdC1jcmVkcz9zZXJ2aWNlSWQ9JHthcHAuaWR9YCk7XG4gICAgICAgICAgICBjb25zdCBzZWVkRGF0YSA9IGF3YWl0IHNlZWRSZXMuanNvbigpO1xuICAgICAgICAgICAgaWYgKHNlZWREYXRhLnN1Y2Nlc3MgJiYgc2VlZERhdGEuaGFzQ3JlZGVudGlhbHMpIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHthcHAuaWR9L2NyZWRlbnRpYWxzYCk7XG4gICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgIGlmIChkLnN1Y2Nlc3MgJiYgKGQuaGFzQXBpS2V5IHx8IGQuaGFzQmFzaWNBdXRoKSkgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBjcmVkcy1idG4tJHthcHAuaWR9YCk7XG4gICAgICAgIGlmIChidG4pIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdoYXMtY3JlZHMnLCBoYXNDcmVkcyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICB9O1xufSkoKTtcbjtcbi8vID09PT09IFRPVFAgU0VUVElOR1MgPT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuICBpbmplY3RNb2RhbCgndG90cC1zZXR0aW5ncy1tb2RhbCcsIGA8ZGl2IGlkPVwidG90cC1zZXR0aW5ncy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDIwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46IDAgMCAxNnB4OyBmb250LXNpemU6IDEuMXJlbTtcIj5BdXRoZW50aWNhdGlvbiBTZXR0aW5nczwvaDM+XG5cbiAgICAgIDwhLS0gU3RhdHVzIEJhbm5lciAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ0b3RwLXN0YXR1cy1iYW5uZXJcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEycHggMTZweDsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJ0b3RwLXN0YXR1cy1kb3RcIiBjbGFzcz1cInN0YXR1cy1kb3RcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGlkPVwidG90cC1zdGF0dXMtdGV4dFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjlyZW07XCI+VE9UUCBpcyBub3QgY29uZmlndXJlZDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNldHVwIEJ1dHRvbiAobm90IGNvbmZpZ3VyZWQgc3RhdGUpIC0tPlxuICAgICAgPGRpdiBpZD1cInRvdHAtc2V0dXAtc2VjdGlvblwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1zZXR1cC1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMnB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOTVyZW07XCI+XG4gICAgICAgICAgR2VuZXJhdGUgTmV3IFNlY3JldFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBtYXJnaW46IDEwcHggMCAwO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyLWxpbmVcIj48L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPm9yPC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyLWxpbmVcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtaGludFwiPkltcG9ydCBhbiBleGlzdGluZyBzZWNyZXQga2V5OjwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW4tdG9wOiA2cHg7XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRvdHAtaW1wb3J0LWtleVwiIHBsYWNlaG9sZGVyPVwiUGFzdGUgeW91ciBCYXNlMzIga2V5XCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuOXJlbTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IDFweDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcIiAvPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtaW1wb3J0LWJ0blwiIHN0eWxlPVwicGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICBJbXBvcnRcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJ0b3RwLWltcG9ydC1lcnJvclwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGZvbnQtc2l6ZTogMC44cmVtOyBtaW4taGVpZ2h0OiAxLjJlbTsgbWFyZ2luLXRvcDogNnB4O1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNlY3JldCBEaXNwbGF5IChzZXR1cCBmbG93KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ0b3RwLXFyLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDwhLS0gTWFudWFsIEtleSAocHJpbWFyeSAtIGZvciBXaW5BdXRoL2Rlc2t0b3AgYXV0aGVudGljYXRvcnMpIC0tPlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgOHB4O1wiPkNvcHkgdGhpcyBrZXkgaW50byB5b3VyIGF1dGhlbnRpY2F0b3IgYXBwOjwvcD5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgPGNvZGUgaWQ9XCJ0b3RwLW1hbnVhbC1rZXlcIiBzdHlsZT1cImZsZXg6IDE7IGRpc3BsYXk6IGJsb2NrOyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZywgIzBiMGYxYSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAxcmVtOyBmb250LWZhbWlseTogJ1NhbWkgR3JvdGVzaycsIG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IDJweDsgd29yZC1icmVhazogYnJlYWstYWxsOyB1c2VyLXNlbGVjdDogYWxsOyBjb2xvcjogdmFyKC0tZmcpO1wiPjwvY29kZT5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1jb3B5LWtleVwiIHN0eWxlPVwicGFkZGluZzogMTBweCAxNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAxcmVtOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBjb2xvcjogdmFyKC0tZmcpO1wiIHRpdGxlPVwiQ29weSB0byBjbGlwYm9hcmRcIj5cdUQ4M0RcdURDQ0I8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBEb3dubG9hZCBiYWNrdXAgZmlsZSAocmVjb3ZlcnkgYWlkKSAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEwcHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tYmcsICMwYjBmMWEpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgZmxleDogMTtcIj5cbiAgICAgICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiB2YXIoLS1mZyk7XCI+U2F2ZSBhIGJhY2t1cCBmaWxlPC9zdHJvbmc+IFx1MjAxNCBpZiB5b3UgZXZlciBsb3NlIHlvdXIgYXV0aGVudGljYXRvcixcbiAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gcmVjb3ZlciB3aXRob3V0IFNTSCBhY2Nlc3MgdG8gdGhlIHNlcnZlci5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLWRvd25sb2FkLWJhY2t1cFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICBcdTJCMDcgRG93bmxvYWRcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFFSIENvZGUgKHNlY29uZGFyeSAtIGZvciBtb2JpbGUgYXBwcykgLS0+XG4gICAgICAgIDxkZXRhaWxzIGNsYXNzPVwibWItMTZcIj5cbiAgICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+U2hvdyBRUiBjb2RlIChmb3IgbW9iaWxlIGF1dGhlbnRpY2F0b3IgYXBwcyk8L3N1bW1hcnk+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgPGltZyBpZD1cInRvdHAtcXItaW1hZ2VcIiBzdHlsZT1cIndpZHRoOiAxODBweDsgaGVpZ2h0OiAxODBweDsgYm9yZGVyLXJhZGl1czogOHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGV0YWlscz5cblxuICAgICAgICA8IS0tIFZlcmlmeSBGaXJzdCBDb2RlIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IHBhZGRpbmctdG9wOiAxNnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvbnQtYm9sZC1zbVwiPkVudGVyIGNvZGUgdG8gY29uZmlybSBzZXR1cDo8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ0b3RwLXNldHVwLWNvZGVcIiBtYXhsZW5ndGg9XCI2XCIgaW5wdXRtb2RlPVwibnVtZXJpY1wiIHBhdHRlcm49XCJbMC05XXs2fVwiIHBsYWNlaG9sZGVyPVwiMDAwMDAwXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxLjNyZW07IHBhZGRpbmc6IDEwcHg7IGZvbnQtZmFtaWx5OiAnU2FtaSBHcm90ZXNrJywgbW9ub3NwYWNlOyBsZXR0ZXItc3BhY2luZzogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDhweDsgb3V0bGluZTogbm9uZTtcIiAvPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtY29uZmlybS1zZXR1cFwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogMTBweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwO1wiPlxuICAgICAgICAgICAgICBDb25maXJtXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwidG90cC1zZXR1cC1lcnJvclwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGZvbnQtc2l6ZTogMC44cmVtOyBtaW4taGVpZ2h0OiAxLjJlbTsgbWFyZ2luLXRvcDogNnB4O1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNlc3Npb24gRHVyYXRpb24gKGFjdGl2ZSBzdGF0ZSkgLS0+XG4gICAgICA8ZGl2IGlkPVwidG90cC1kdXJhdGlvbi1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxMnB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb250LWJvbGQtc21cIj5TZXNzaW9uIER1cmF0aW9uOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJ0b3RwLWR1cmF0aW9uLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbi10b3A6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcsICMwYjBmMWEpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC45cmVtOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE1bVwiPjE1IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMzBtXCI+MzAgbWludXRlczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxaFwiPjEgaG91cjwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIyaFwiPjIgaG91cnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNGhcIj40IGhvdXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjhoXCI+OCBob3Vyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMmhcIj4xMiBob3Vyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIyNGhcIj4yNCBob3Vyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJuZXZlclwiPk5ldmVyIChkaXNhYmxlIFRPVFApPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiA0cHggMCAwO1wiPkhvdyBsb25nIGJlZm9yZSB5b3UgbmVlZCB0byByZS1lbnRlciB5b3VyIGNvZGU8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBEaXNhYmxlIEJ1dHRvbiAoYWN0aXZlIHN0YXRlKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ0b3RwLWRpc2FibGUtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZy10b3A6IDE2cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1kaXNhYmxlLWJ0blwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlxuICAgICAgICAgIERpc2FibGUgVE9UUFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIC0tPlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1tb2RhbC1jbG9zZVwiIHN0eWxlPVwicGFkZGluZzogOHB4IDIwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIENsb3NlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRUb3RwU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvY29uZmlnJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHsgZW5hYmxlZCwgc2Vzc2lvbkR1cmF0aW9uLCBpc1NldFVwIH0gPSBkYXRhLmNvbmZpZztcbiAgICAgIGNvbnN0IHN0YXR1c0RvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXN0YXR1cy1kb3QnKTtcbiAgICAgIGNvbnN0IHN0YXR1c1RleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zdGF0dXMtdGV4dCcpO1xuICAgICAgY29uc3Qgc3RhdHVzQmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc3RhdHVzLWJhbm5lcicpO1xuICAgICAgY29uc3Qgc2V0dXBTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtc2VjdGlvbicpO1xuICAgICAgY29uc3QgcXJTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcXItc2VjdGlvbicpO1xuICAgICAgY29uc3QgZHVyYXRpb25TZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZHVyYXRpb24tc2VjdGlvbicpO1xuICAgICAgY29uc3QgZGlzYWJsZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kaXNhYmxlLXNlY3Rpb24nKTtcblxuICAgICAgaWYgKGVuYWJsZWQgJiYgaXNTZXRVcCkge1xuICAgICAgICBzdGF0dXNEb3Quc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1vay1mZywgIzdlZjJmZiknO1xuICAgICAgICBzdGF0dXNCYW5uZXIuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tb2stZmcsICM3ZWYyZmYpJztcbiAgICAgICAgc3RhdHVzQmFubmVyLnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW9rLWZnKSA4JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgc3RhdHVzVGV4dC50ZXh0Q29udGVudCA9ICdUT1RQIGlzIGFjdGl2ZSc7XG4gICAgICAgIHN0YXR1c1RleHQuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcsICM3ZWYyZmYpJztcbiAgICAgICAgLy8gS2VlcCB0aGUgc2V0dXAgc2VjdGlvbiB2aXNpYmxlIChjb2xsYXBzZWQpIHNvIHRoZSBcIkltcG9ydCBleGlzdGluZ1xuICAgICAgICAvLyBzZWNyZXRcIiBvcHRpb24gaXMgYWx3YXlzIHJlYWNoYWJsZSBcdTIwMTQgdXNlcnMgbWF5IG5lZWQgdG8gcmUtZW5yb2xsXG4gICAgICAgIC8vIHRoZWlyIGF1dGhlbnRpY2F0b3Igd2l0aCB0aGUgc2FtZSBzZWNyZXQgZnJvbSBhIGJhY2t1cCBmaWxlLlxuICAgICAgICBzZXR1cFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGNvbnN0IHNldHVwQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtYnRuJyk7XG4gICAgICAgIGlmIChzZXR1cEJ0bikgc2V0dXBCdG4udGV4dENvbnRlbnQgPSAnR2VuZXJhdGUgTmV3IFNlY3JldCc7XG4gICAgICAgIC8vIEhpZGUgdGhlIFFSIHNlY3Rpb24gYnkgZGVmYXVsdCBpbiB0aGUgYWN0aXZlIHN0YXRlIFx1MjAxNCBzZXR1cEJ0biBjbGljayBzaG93cyBpdFxuICAgICAgICBxclNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZHVyYXRpb25TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkaXNhYmxlU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZHVyYXRpb24tc2VsZWN0JykudmFsdWUgPSBzZXNzaW9uRHVyYXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNEb3Quc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgICBzdGF0dXNCYW5uZXIuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tYm9yZGVyKSc7XG4gICAgICAgIHN0YXR1c0Jhbm5lci5zdHlsZS5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgc3RhdHVzVGV4dC50ZXh0Q29udGVudCA9ICdUT1RQIGlzIG5vdCBjb25maWd1cmVkJztcbiAgICAgICAgc3RhdHVzVGV4dC5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgICBzZXR1cFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIHFyU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkdXJhdGlvblNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZGlzYWJsZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSBBdXRoIGNhcmQgaW4gdGhlIHRvcCByb3dcbiAgICAgIHVwZGF0ZUF1dGhDYXJkKGVuYWJsZWQgJiYgaXNTZXRVcCwgc2Vzc2lvbkR1cmF0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBsb2FkIFRPVFAgc2V0dGluZ3M6JywgZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRHVyYXRpb24gbGFiZWwgaGVscGVyXG4gIGNvbnN0IERVUkFUSU9OX0xBQkVMUyA9IHtcbiAgICAnMTVtJzogJzE1IG1pbicsICczMG0nOiAnMzAgbWluJywgJzFoJzogJzEgaG91cicsICcyaCc6ICcyIGhvdXJzJyxcbiAgICAnNGgnOiAnNCBob3VycycsICc4aCc6ICc4IGhvdXJzJywgJzEyaCc6ICcxMiBob3VycycsICcyNGgnOiAnMjQgaG91cnMnLCAnbmV2ZXInOiAnRGlzYWJsZWQnXG4gIH07XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlZChrZXksIGZhbGxiYWNrKSB7XG4gICAgY29uc3QgaTE4biA9IHdpbmRvdy5EQ0kxOG47XG4gICAgcmV0dXJuIGkxOG4gJiYgaTE4bi5pc0xvYWRlZCgpID8gaTE4bi50KGtleSkgOiBmYWxsYmFjaztcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUF1dGhDYXJkKGFjdGl2ZSwgZHVyYXRpb24pIHtcbiAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtY2FyZCcpO1xuICAgIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1waWxsJyk7XG4gICAgY29uc3QgZG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtZG90Jyk7XG4gICAgY29uc3Qgc3RhdHVzVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXN0YXR1cy10ZXh0Jyk7XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnLCAnb24nKTtcbiAgICAgIHBpbGwuY2xhc3NOYW1lID0gJ2JhZGdlIG9uJztcbiAgICAgIHBpbGwudGV4dENvbnRlbnQgPSB0cmFuc2xhdGVkKCdjYXJkLnN0YXR1cy55ZXMnLCAnWUVTJyk7XG4gICAgICBkb3QuY2xhc3NOYW1lID0gJ2RvdCBvayBhdC1ibCc7XG4gICAgICBzdGF0dXNUZXh0LnRleHRDb250ZW50ID0gJ1Nlc3Npb246ICcgKyAoRFVSQVRJT05fTEFCRUxTW2R1cmF0aW9uXSB8fCBkdXJhdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLXN0YXR1cycsICdvZmYnKTtcbiAgICAgIHBpbGwuY2xhc3NOYW1lID0gJ2JhZGdlIG9mZic7XG4gICAgICBwaWxsLnRleHRDb250ZW50ID0gdHJhbnNsYXRlZCgnY2FyZC5zdGF0dXMubm8nLCAnTk8nKTtcbiAgICAgIGRvdC5jbGFzc05hbWUgPSAnZG90IGJhZCBhdC1ibCc7XG4gICAgICBzdGF0dXNUZXh0LnRleHRDb250ZW50ID0gdHJhbnNsYXRlZCgnY2FyZC5hdXRoLm5vdF9jb25maWd1cmVkJywgJ05vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgYnV0dG9uIChnZW5lcmF0ZSBuZXcgc2VjcmV0KVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvc2V0dXAnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXFyLWltYWdlJykuc3JjID0gZGF0YS5xckNvZGU7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW1hbnVhbC1rZXknKS50ZXh0Q29udGVudCA9IGRhdGEubWFudWFsS2V5O1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1zZWN0aW9uJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcXItc2VjdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJykudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtZXJyb3InKS50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJykuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tUT1RQXSBTZXR1cCBGYWlsZWQnLCBlLCB7IGZ1bmN0aW9uOiAnc2V0dXBUT1RQJyB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEltcG9ydCBleGlzdGluZyBzZWNyZXQgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWltcG9ydC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2VjcmV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtaW1wb3J0LWtleScpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtaW1wb3J0LWVycm9yJyk7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgIGlmICghc2VjcmV0KSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ1Bhc3RlIGEgQmFzZTMyIHNlY3JldCBrZXkgZmlyc3QnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC9zZXR1cCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlY3JldCB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1xci1pbWFnZScpLnNyYyA9IGRhdGEucXJDb2RlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1tYW51YWwta2V5JykudGV4dENvbnRlbnQgPSBkYXRhLm1hbnVhbEtleTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtc2VjdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXFyLXNlY3Rpb24nKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWVycm9yJykudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCBkYXRhLm1lc3NhZ2UgfHwgJ0ltcG9ydCBmYWlsZWQnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnQ29ubmVjdGlvbiBlcnJvciBcdTIwMTQgdHJ5IHJlZnJlc2hpbmcgdGhlIHBhZ2UnO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ29weSBrZXkgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWNvcHkta2V5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW1hbnVhbC1rZXknKS50ZXh0Q29udGVudDtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChrZXkpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtY29weS1rZXknKTtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQ0InOyB9LCAyMDAwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gRG93bmxvYWQgYmFja3VwIGZpbGUgXHUyMDE0IHBsYWluIEpTT04gc28gaXQgcm91bmQtdHJpcHMgdGhyb3VnaCBhbnkgcGFzc3dvcmRcbiAgLy8gbWFuYWdlciwgY2xvdWQgYmFja3VwLCBvciBwcmludGVkIHBhcGVyLiBUaGUgc2VjcmV0IElTIHJlY292ZXJhYmxlIHBsYWludGV4dFxuICAvLyAodGhhdCdzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgYmFja3VwKSwgc28gd2FybiB0aGUgdXNlciBhbmQgcmVseSBvblxuICAvLyB0aGVtIHRvIGtlZXAgaXQgc2FmZS5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZG93bmxvYWQtYmFja3VwJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHNlY3JldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW1hbnVhbC1rZXknKS50ZXh0Q29udGVudC50cmltKCk7XG4gICAgaWYgKCFzZWNyZXQpIHJldHVybjtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgc2VydmljZTogJ0Rhc2hDYWRkeScsXG4gICAgICB0eXBlOiAndG90cC1zZWNyZXQnLFxuICAgICAgc2VjcmV0OiBzZWNyZXQsXG4gICAgICBpc3N1ZXI6ICdEYXNoQ2FkZHknLFxuICAgICAgYWxnb3JpdGhtOiAnU0hBMScsXG4gICAgICBkaWdpdHM6IDYsXG4gICAgICBwZXJpb2Q6IDMwLFxuICAgICAgaXNzdWVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAvLyBSZWNvdmVyeSBpbnN0cnVjdGlvbnMgYmFrZWQgaW50byB0aGUgZmlsZSBzbyBhIHllYXIgZnJvbSBub3cgdGhlXG4gICAgICAvLyB1c2VyIChvciB0aGVpciBmdXR1cmUgc2VsZikga25vd3Mgd2hhdCB0aGlzIGZpbGUgaXMgYW5kIGhvdyB0byB1c2UgaXQuXG4gICAgICByZWNvdmVyeV91cmw6IGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59LyAgKGxvZ2luIHNjcmVlbiBcdTIxOTIgXCJMb3N0IGFjY2Vzcz9cIilgLFxuICAgICAgbm90ZTogJ0tlZXAgdGhpcyBmaWxlIHNvbWV3aGVyZSBzYWZlLiBBbnlvbmUgd2l0aCB0aGlzIHNlY3JldCBjYW4gZ2VuZXJhdGUgeW91ciBsb2dpbiBjb2Rlcy4gVXNlIGl0IE9OTFkgdG8gcmVjb3ZlciBUT1RQIGFjY2VzcyB2aWEgdGhlIFwiTG9zdCBhY2Nlc3M/XCIgbGluayBvbiB0aGUgRGFzaENhZGR5IGxvZ2luIHNjcmVlbi4nXG4gICAgfTtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDIpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICBhLmRvd25sb2FkID0gYGRhc2hjYWRkeS10b3RwLWJhY2t1cC0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCl9Lmpzb25gO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgYS5jbGljaygpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWRvd25sb2FkLWJhY2t1cCcpO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgU2F2ZWQnO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnXHUyQjA3IERvd25sb2FkJzsgfSwgMjAwMCk7XG4gIH0pO1xuXG4gIC8vIENvbmZpcm0gc2V0dXBcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtY29uZmlybS1zZXR1cCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpLnZhbHVlO1xuICAgIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1lcnJvcicpO1xuICAgIGlmICghL15cXGR7Nn0kLy50ZXN0KGNvZGUpKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0VudGVyIGEgNi1kaWdpdCBjb2RlJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC92ZXJpZnktc2V0dXAnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb2RlIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIGxvYWRUb3RwU2V0dGluZ3MoKTsgLy8gVXBkYXRlcyBib3RoIG1vZGFsIGFuZCBjYXJkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCAnSW52YWxpZCBjb2RlJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0Nvbm5lY3Rpb24gZXJyb3InO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWxsb3cgRW50ZXIga2V5IG9uIHNldHVwIGNvZGUgaW5wdXRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpPy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWNvbmZpcm0tc2V0dXAnKT8uY2xpY2soKTtcbiAgfSk7XG5cbiAgLy8gRHVyYXRpb24gY2hhbmdlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWR1cmF0aW9uLXNlbGVjdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBhc3luYyAoZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlc3Npb25EdXJhdGlvbjogZS50YXJnZXQudmFsdWUgfSlcbiAgICAgIH0pO1xuICAgICAgbG9hZFRvdHBTZXR0aW5ncygpOyAvLyBSZWZyZXNoIG1vZGFsICsgY2FyZCAoaGFuZGxlcyBcIm5ldmVyXCIgZGlzYWJsaW5nIFRPVFApXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tUT1RQXSBVcGRhdGUgU2Vzc2lvbiBEdXJhdGlvbicsIGVyciwgeyBmdW5jdGlvbjogJ3VwZGF0ZVNlc3Npb25EdXJhdGlvbicgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBEaXNhYmxlIFRPVFBcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZGlzYWJsZS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maXJtKCdEaXNhYmxlIFRPVFAgYXV0aGVudGljYXRpb24/IEFsbCBzZXJ2aWNlcyB3aWxsIGJlIGFjY2Vzc2libGUgd2l0aG91dCBhIGNvZGUuJykpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC9kaXNhYmxlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6ICd7fSdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSBsb2FkVG90cFNldHRpbmdzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbVE9UUF0gRGlzYWJsZSBGYWlsZWQnLCBlLCB7IGZ1bmN0aW9uOiAnZGlzYWJsZVRPVFAnIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gT3BlbiBzZXR0aW5ncyBtb2RhbCBmcm9tIEF1dGggY2FyZFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1zZXR0aW5ncy1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9hZFRvdHBTZXR0aW5ncygpO1xuICAgIG9wZW5Nb2RhbCgndG90cC1zZXR0aW5ncy1tb2RhbCcpO1xuICB9KTtcblxuICAvLyBDbG9zZSBzZXR0aW5ncyBtb2RhbFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1tb2RhbC1jbG9zZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjbG9zZU1vZGFsKCd0b3RwLXNldHRpbmdzLW1vZGFsJyk7XG4gIH0pO1xuXG4gIC8vIEJhY2tkcm9wIGNsaWNrIHRvIGNsb3NlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHRpbmdzLW1vZGFsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQuaWQgPT09ICd0b3RwLXNldHRpbmdzLW1vZGFsJykge1xuICAgICAgY2xvc2VNb2RhbCgndG90cC1zZXR0aW5ncy1tb2RhbCcpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gVXBkYXRlIGF1dGggY2FyZCBvbiBwYWdlIGxvYWRcbiAgd2luZG93Ll91cGRhdGVBdXRoQ2FyZCA9IHVwZGF0ZUF1dGhDYXJkO1xuICAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL2NvbmZpZycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IGRhdGEuY29uZmlnLmVuYWJsZWQgJiYgZGF0YS5jb25maWcuaXNTZXRVcDtcbiAgICAgICAgdXBkYXRlQXV0aENhcmQoYWN0aXZlLCBkYXRhLmNvbmZpZy5zZXNzaW9uRHVyYXRpb24pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbVE9UUF0gQXV0aENhcmQgVXBkYXRlJywgZSwgeyBmdW5jdGlvbjogJ2F1dGhDYXJkVXBkYXRlJyB9KTsgfVxuICB9KSgpO1xuXG59KSgpO1xuO1xuLyoqXG4gKiBBZG1pbiBwYW5lbCBcdTIwMTQgREMtMDQ4LlxuICpcbiAqIE1pbmltYWwgYWRtaW4gVUkgZm9yIG1hbmFnaW5nIHVzZXJzICsgaW52aXRlcy4gUmVuZGVyZWQgYXMgYSBtb2RhbCBvdmVybGF5XG4gKiB0cmlnZ2VyZWQgYnkgYW4gXCJBZG1pblwiIGJ1dHRvbiBpbiB0aGUgdG9wIGJhciB0aGF0IG9ubHkgYXBwZWFycyB3aGVuXG4gKiAvYXBpL3YxL2F1dGgvbWUgcmV0dXJucyBpc0FkbWluPXRydWUuIFRoZSBwYW5lbCByZW5kZXJzIHRocmVlIHNlY3Rpb25zOlxuICpcbiAqICAgMS4gVXNlcnMgXHUyMDE0IGxpc3Qgb2YgYXV0aG9yaXplZCB1c2VycyB3aXRoIHJvbGUgYmFkZ2VzLCByb2xlLWVkaXQsXG4gKiAgICAgIGRlbGV0ZSBhY3Rpb25zLlxuICogICAyLiBJbnZpdGUgYSB1c2VyIFx1MjAxNCBmb3JtIHRvIGlzc3VlIGEgc2luZ2xlLXVzZSBpbnZpdGUgKGVtYWlsLCByb2xlLFxuICogICAgICBUVEwpLiBUaGUgYWNjZXB0LWxpbmsgaXMgc2hvd24gcG9zdC1pc3N1ZSBzbyB0aGUgYWRtaW4gY2FuIGNvcHkgaXQuXG4gKiAgIDMuIE91dHN0YW5kaW5nIGludml0ZXMgXHUyMDE0IGxpc3Qgb2YgaXNzdWVkLW5vdC15ZXQtYWNjZXB0ZWQgaW52aXRlc1xuICogICAgICB3aXRoIGEgcmV2b2tlIGJ1dHRvbi5cbiAqXG4gKiBUaGUgcGFuZWwgZG9lcyBOT1QgYWRkIGEgdGFiIHRvIHRoZSBkYXNoYm9hcmQgbmF2IFx1MjAxNCBpdCBsaXZlcyBhcyBhIG1vZGFsXG4gKiB0byBrZWVwIERDLTA0OCBzdXJnaWNhbC4gRnV0dXJlIERDLTA0OSB3b3JrIGNhbiBwcm9tb3RlIGl0IHRvIGEgdGFiLlxuICpcbiAqIEJlaGF2aW91cjpcbiAqICAgLSBPbiBsb2FkOiBHRVQgL21lOyBpZiAhaXNBZG1pbiBcdTIxOTIgc2hvdyBcImFkbWluIG9ubHlcIiBwbGFjZWhvbGRlclxuICogICAtIFRoZW4gR0VUIC9hZG1pbi91c2VycyArIC9hZG1pbi9pbnZpdGVzIGluIHBhcmFsbGVsXG4gKiAgIC0gRm9ybXMgUE9TVCB0byB0aGUgYWRtaW4gZW5kcG9pbnRzLCByZWZyZXNoIGxpc3RzIG9uIHN1Y2Nlc3NcbiAqICAgLSBcIkNvcHkgbGlua1wiIGJ1dHRvbiB3cml0ZXMgdGhlIGFjY2VwdFVybCB0byB0aGUgY2xpcGJvYXJkXG4gKlxuICogV2lyZXMgaW50byB0aGUgZ2xvYmFsIGVycm9yLWhhbmRsZXIgKHdpbmRvdy5lcnJvckhhbmRsZXIpIGZvciBmYWlsdXJlXG4gKiBzdXJmYWNlcy4gVXNlcyB3aW5kb3cuU0lURSBmb3IgYW55IFVJIGNvbnN0YW50cyAobm9uZSBjdXJyZW50bHkpLlxuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBBUEkgPSB7XG4gICAgbWU6ICcvYXBpL3YxL2F1dGgvbWUnLFxuICAgIHVzZXJzOiAnL2FwaS92MS9hdXRoL2FkbWluL3VzZXJzJyxcbiAgICBhbGxvd2xpc3Q6ICcvYXBpL3YxL2F1dGgvYWRtaW4vYWxsb3dsaXN0JyxcbiAgICBpbnZpdGVzOiAnL2FwaS92MS9hdXRoL2FkbWluL2ludml0ZXMnLFxuICB9O1xuXG4gIGZ1bmN0aW9uIF9lbCh0YWcsIGF0dHJzLCAuLi5jaGlsZHJlbikge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgaWYgKGF0dHJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoYXR0cnMpKSB7XG4gICAgICAgIGNvbnN0IHYgPSBhdHRyc1trXTtcbiAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IGZhbHNlKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGsgPT09ICdjbGFzcycpIG5vZGUuY2xhc3NOYW1lID0gdjtcbiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3RleHQnKSBub2RlLnRleHRDb250ZW50ID0gdjtcbiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ2h0bWwnKSBub2RlLmlubmVySFRNTCA9IHY7XG4gICAgICAgIGVsc2UgaWYgKGsuc3RhcnRzV2l0aCgnb24nKSAmJiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJykgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdik7XG4gICAgICAgIGVsc2Ugbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgYyBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKGMgPT09IG51bGwgfHwgYyA9PT0gdW5kZWZpbmVkIHx8IGMgPT09IGZhbHNlKSBjb250aW51ZTtcbiAgICAgIGlmICh0eXBlb2YgYyA9PT0gJ3N0cmluZycpIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYykpO1xuICAgICAgZWxzZSBub2RlLmFwcGVuZENoaWxkKGMpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIF9mZXRjaEpTT04odXJsLCBvcHRzKSB7XG4gICAgY29uc3QgY3NyZiA9ICh3aW5kb3cuU0lURSAmJiB3aW5kb3cuU0lURS5jc3JmVG9rZW4pIHx8ICcnO1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIG9wdHMuaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIG9wdHMuaGVhZGVycyB8fCB7fSxcbiAgICAgIGNzcmYgPyB7ICdYLUNTUkYtVG9rZW4nOiBjc3JmIH0gOiB7fVxuICAgICk7XG4gICAgaWYgKG9wdHMuYm9keSAmJiB0eXBlb2Ygb3B0cy5ib2R5ICE9PSAnc3RyaW5nJykgb3B0cy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5ib2R5KTtcbiAgICBjb25zdCByID0gYXdhaXQgZmV0Y2godXJsLCBvcHRzKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgci5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgaWYgKCFyLm9rKSB7XG4gICAgICBjb25zdCBtc2cgPSAoZGF0YSAmJiAoZGF0YS5tZXNzYWdlIHx8IGRhdGEuZXJyb3IpKSB8fCAoJ0hUVFAgJyArIHIuc3RhdHVzKTtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICAgICAgZXJyLnN0YXR1cyA9IHIuc3RhdHVzO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJCYWRnZShyb2xlKSB7XG4gICAgY29uc3QgY29sb3JzID0ge1xuICAgICAgYWRtaW46ICdiYWNrZ3JvdW5kOiM3YzNhZWQ7Y29sb3I6I2ZmZicsXG4gICAgICBvcGVyYXRvcjogJ2JhY2tncm91bmQ6IzI1NjNlYjtjb2xvcjojZmZmJyxcbiAgICAgIHZpZXdlcjogJ2JhY2tncm91bmQ6IzZiNzI4MDtjb2xvcjojZmZmJyxcbiAgICB9O1xuICAgIHJldHVybiBfZWwoJ3NwYW4nLCB7XG4gICAgICBjbGFzczogJ3JvbGUtYmFkZ2UnLFxuICAgICAgc3R5bGU6ICdkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuNzVyZW07Zm9udC13ZWlnaHQ6NjAwO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsnICtcbiAgICAgICAgKGNvbG9yc1tyb2xlXSB8fCBjb2xvcnMudmlld2VyKSxcbiAgICAgIHRleHQ6IHJvbGUsXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBfcmVuZGVyVXNlcnNMaXN0KGNvbnRhaW5lciwgdXNlcnMsIG9uQ2hhbmdlKSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGlmICghdXNlcnMgfHwgdXNlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywgeyBzdHlsZTogJ2NvbG9yOnZhcigtLW11dGVkKScsIHRleHQ6ICdObyB1c2VycyB5ZXQuJyB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gX2VsKCd0YWJsZScsIHtcbiAgICAgIHN0eWxlOiAnd2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1zaXplOjAuOXJlbScsXG4gICAgfSk7XG4gICAgdGFibGUuYXBwZW5kQ2hpbGQoX2VsKCd0aGVhZCcsIG51bGwsXG4gICAgICBfZWwoJ3RyJywgeyBzdHlsZTogJ2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlciknIH0sXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0VtYWlsJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnUm9sZScgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0NyZWF0ZWQnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdMYXN0IGxvZ2luJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOnJpZ2h0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0FjdGlvbnMnIH0pLFxuICAgICAgKSxcbiAgICApKTtcbiAgICBjb25zdCB0Ym9keSA9IF9lbCgndGJvZHknKTtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdXNlcnMpIHtcbiAgICAgIGNvbnN0IHJvdyA9IF9lbCgndHInLCB7IHN0eWxlOiAnYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKScgfSk7XG5cbiAgICAgIGNvbnN0IGVtYWlsQ2VsbCA9IF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHgnIH0pO1xuICAgICAgZW1haWxDZWxsLmFwcGVuZENoaWxkKF9lbCgnc3BhbicsIHsgdGV4dDogdS5lbWFpbCB8fCAnKG5vIGVtYWlsKScgfSkpO1xuICAgICAgaWYgKHUuZGlzcGxheU5hbWUgJiYgdS5kaXNwbGF5TmFtZSAhPT0gKHUuZW1haWwgfHwgJycpLnNwbGl0KCdAJylbMF0pIHtcbiAgICAgICAgZW1haWxDZWxsLmFwcGVuZENoaWxkKF9lbCgnYnInKSk7XG4gICAgICAgIGVtYWlsQ2VsbC5hcHBlbmRDaGlsZChfZWwoJ3NtYWxsJywge1xuICAgICAgICAgIHN0eWxlOiAnY29sb3I6dmFyKC0tbXV0ZWQpJywgdGV4dDogdS5kaXNwbGF5TmFtZSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgcm93LmFwcGVuZENoaWxkKGVtYWlsQ2VsbCk7XG5cbiAgICAgIGNvbnN0IHJvbGVDZWxsID0gX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweCcgfSk7XG4gICAgICByb2xlQ2VsbC5hcHBlbmRDaGlsZChfcmVuZGVyQmFkZ2UodS5yb2xlKSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQocm9sZUNlbGwpO1xuXG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHtcbiAgICAgICAgc3R5bGU6ICdwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuODVyZW0nLFxuICAgICAgICB0ZXh0OiB1LmNyZWF0ZWRBdCA/IG5ldyBEYXRlKHUuY3JlYXRlZEF0KS50b0xvY2FsZURhdGVTdHJpbmcoKSA6ICdcdTIwMTQnLFxuICAgICAgfSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7XG4gICAgICAgIHN0eWxlOiAncGFkZGluZzo4cHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjg1cmVtJyxcbiAgICAgICAgdGV4dDogdS5sYXN0TG9naW5BdCA/IG5ldyBEYXRlKHUubGFzdExvZ2luQXQpLnRvTG9jYWxlU3RyaW5nKCkgOiAnXHUyMDE0JyxcbiAgICAgIH0pKTtcblxuICAgICAgY29uc3QgYWN0aW9uc0NlbGwgPSBfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4O3RleHQtYWxpZ246cmlnaHQnIH0pO1xuICAgICAgY29uc3Qgcm9sZVNlbGVjdCA9IF9lbCgnc2VsZWN0Jywge1xuICAgICAgICBzdHlsZTogJ3BhZGRpbmc6MnB4IDZweDttYXJnaW4tcmlnaHQ6NnB4JyxcbiAgICAgICAgb25jaGFuZ2U6IGFzeW5jIChldikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfZmV0Y2hKU09OKEFQSS51c2VycyArICcvJyArIGVuY29kZVVSSUNvbXBvbmVudCh1LmlkKSwge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQQVRDSCcsIGJvZHk6IHsgcm9sZTogZXYudGFyZ2V0LnZhbHVlIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uQ2hhbmdlICYmIG9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ1JvbGUgdXBkYXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgICAgICBldi50YXJnZXQudmFsdWUgPSB1LnJvbGU7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgWydhZG1pbicsICdvcGVyYXRvcicsICd2aWV3ZXInXSkge1xuICAgICAgICBjb25zdCBvcHQgPSBfZWwoJ29wdGlvbicsIHsgdmFsdWU6IHIsIHRleHQ6IHIgfSk7XG4gICAgICAgIGlmIChyID09PSB1LnJvbGUpIG9wdC5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHJvbGVTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbnNDZWxsLmFwcGVuZENoaWxkKHJvbGVTZWxlY3QpO1xuXG4gICAgICBjb25zdCBkZWxCdG4gPSBfZWwoJ2J1dHRvbicsIHtcbiAgICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6MnB4IDhweCcsXG4gICAgICAgIHRleHQ6ICdEZWxldGUnLFxuICAgICAgICBvbmNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKCdEZWxldGUgdXNlciAnICsgKHUuZW1haWwgfHwgdS5pZCkgKyAnPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJykpIHJldHVybjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgX2ZldGNoSlNPTihBUEkudXNlcnMgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQodS5pZCksIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgICAgICAgIG9uQ2hhbmdlICYmIG9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ0RlbGV0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYWN0aW9uc0NlbGwuYXBwZW5kQ2hpbGQoZGVsQnRuKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChhY3Rpb25zQ2VsbCk7XG5cbiAgICAgIHRib2R5LmFwcGVuZENoaWxkKHJvdyk7XG4gICAgfVxuICAgIHRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlckludml0ZUZvcm0oY29udGFpbmVyLCBvbklzc3VlZCkge1xuICAgIGNvbnN0IGZvcm0gPSBfZWwoJ2Zvcm0nLCB7XG4gICAgICBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmVuZCcsXG4gICAgICBvbnN1Ym1pdDogYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGZkID0gbmV3IEZvcm1EYXRhKGV2LnRhcmdldCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgZW1haWw6IGZkLmdldCgnZW1haWwnKSxcbiAgICAgICAgICByb2xlOiBmZC5nZXQoJ3JvbGUnKSxcbiAgICAgICAgICB0dGxIb3VyczogcGFyc2VJbnQoZmQuZ2V0KCd0dGxIb3VycycpLCAxMCkgfHwgMjQsXG4gICAgICAgICAgc2VuZEVtYWlsOiBmZC5nZXQoJ3NlbmRFbWFpbCcpID09PSAnb24nLFxuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS5pbnZpdGVzLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5IH0pO1xuICAgICAgICAgIGV2LnRhcmdldC5yZXNldCgpO1xuICAgICAgICAgIG9uSXNzdWVkICYmIG9uSXNzdWVkKHIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ0ludml0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdsYWJlbCcsIHsgc3R5bGU6ICdkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoycHg7Zm9udC1zaXplOjAuODVyZW0nIH0sXG4gICAgICBfZWwoJ3NwYW4nLCB7IHRleHQ6ICdFbWFpbCcgfSksXG4gICAgICBfZWwoJ2lucHV0JywgeyBuYW1lOiAnZW1haWwnLCB0eXBlOiAnZW1haWwnLCByZXF1aXJlZDogdHJ1ZSwgcGxhY2Vob2xkZXI6ICd1c2VyQGV4YW1wbGUuY29tJywgc3R5bGU6ICdwYWRkaW5nOjZweCcgfSksXG4gICAgKSk7XG4gICAgY29uc3Qgcm9sZVNlbCA9IF9lbCgnc2VsZWN0JywgeyBuYW1lOiAncm9sZScsIHN0eWxlOiAncGFkZGluZzo2cHgnIH0pO1xuICAgIGZvciAoY29uc3QgciBvZiBbJ29wZXJhdG9yJywgJ3ZpZXdlcicsICdhZG1pbiddKSB7XG4gICAgICByb2xlU2VsLmFwcGVuZENoaWxkKF9lbCgnb3B0aW9uJywgeyB2YWx1ZTogciwgdGV4dDogciB9KSk7XG4gICAgfVxuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdsYWJlbCcsIHsgc3R5bGU6ICdkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoycHg7Zm9udC1zaXplOjAuODVyZW0nIH0sXG4gICAgICBfZWwoJ3NwYW4nLCB7IHRleHQ6ICdSb2xlJyB9KSwgcm9sZVNlbCxcbiAgICApKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnbGFiZWwnLCB7IHN0eWxlOiAnZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZvbnQtc2l6ZTowLjg1cmVtJyB9LFxuICAgICAgX2VsKCdzcGFuJywgeyB0ZXh0OiAnVFRMIChob3VycyknIH0pLFxuICAgICAgX2VsKCdpbnB1dCcsIHsgbmFtZTogJ3R0bEhvdXJzJywgdHlwZTogJ251bWJlcicsIG1pbjogJzEnLCBtYXg6ICcxNjgnLCB2YWx1ZTogJzI0Jywgc3R5bGU6ICdwYWRkaW5nOjZweDt3aWR0aDo4MHB4JyB9KSxcbiAgICApKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnbGFiZWwnLCB7IHN0eWxlOiAnZGlzcGxheTpmbGV4O2dhcDo0cHg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTowLjg1cmVtJyB9LFxuICAgICAgX2VsKCdpbnB1dCcsIHsgbmFtZTogJ3NlbmRFbWFpbCcsIHR5cGU6ICdjaGVja2JveCcsIGNoZWNrZWQ6IHRydWUgfSksXG4gICAgICBfZWwoJ3NwYW4nLCB7IHRleHQ6ICdTZW5kIGVtYWlsJyB9KSxcbiAgICApKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnYnV0dG9uJywgeyB0eXBlOiAnc3VibWl0JywgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6NnB4IDEycHgnLCB0ZXh0OiAnSXNzdWUgaW52aXRlJyB9KSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZvcm0pO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlckludml0ZXNMaXN0KGNvbnRhaW5lciwgaW52aXRlcywgb25DaGFuZ2UpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgaWYgKCFpbnZpdGVzIHx8IGludml0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywgeyBzdHlsZTogJ2NvbG9yOnZhcigtLW11dGVkKScsIHRleHQ6ICdObyBvdXRzdGFuZGluZyBpbnZpdGVzLicgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IF9lbCgndGFibGUnLCB7XG4gICAgICBzdHlsZTogJ3dpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjlyZW0nLFxuICAgIH0pO1xuICAgIHRhYmxlLmFwcGVuZENoaWxkKF9lbCgndGhlYWQnLCBudWxsLFxuICAgICAgX2VsKCd0cicsIHsgc3R5bGU6ICdib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpJyB9LFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdFbWFpbCcgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ1JvbGUnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdJbnZpdGVkIGJ5JyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnRXhwaXJlcycgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpyaWdodDtwYWRkaW5nOjhweCcsIHRleHQ6ICdBY3Rpb25zJyB9KSxcbiAgICAgICksXG4gICAgKSk7XG4gICAgY29uc3QgdGJvZHkgPSBfZWwoJ3Rib2R5Jyk7XG4gICAgZm9yIChjb25zdCBpbnYgb2YgaW52aXRlcykge1xuICAgICAgY29uc3Qgcm93ID0gX2VsKCd0cicsIHsgc3R5bGU6ICdib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpJyB9KTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4JywgdGV4dDogaW52LmVtYWlsIH0pKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4JyB9LCBfcmVuZGVyQmFkZ2UoaW52LnJvbGUpKSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS1tdXRlZCknLCB0ZXh0OiBpbnYuaW52aXRlZEJ5IHx8ICdcdTIwMTQnIH0pKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywge1xuICAgICAgICBzdHlsZTogJ3BhZGRpbmc6OHB4O2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MC44NXJlbScsXG4gICAgICAgIHRleHQ6IGludi5leHBpcmVzQXQgPyBuZXcgRGF0ZShpbnYuZXhwaXJlc0F0KS50b0xvY2FsZVN0cmluZygpIDogJ1x1MjAxNCcsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBhY3Rpb25zQ2VsbCA9IF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHg7dGV4dC1hbGlnbjpyaWdodCcgfSk7XG4gICAgICBhY3Rpb25zQ2VsbC5hcHBlbmRDaGlsZChfZWwoJ2J1dHRvbicsIHtcbiAgICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6MnB4IDhweCcsXG4gICAgICAgIHRleHQ6ICdSZXZva2UnLFxuICAgICAgICBvbmNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKCdSZXZva2UgaW52aXRlIGZvciAnICsgaW52LmVtYWlsICsgJz8nKSkgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfZmV0Y2hKU09OKEFQSS5pbnZpdGVzICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGludi5pZCksIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgICAgICAgIG9uQ2hhbmdlICYmIG9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ1Jldm9rZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChhY3Rpb25zQ2VsbCk7XG4gICAgICB0Ym9keS5hcHBlbmRDaGlsZChyb3cpO1xuICAgIH1cbiAgICB0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJJc3N1ZWRJbnZpdGVCYW5uZXIoaW52aXRlLCBwYXJlbnQpIHtcbiAgICBjb25zdCBiYW5uZXIgPSBfZWwoJ2RpdicsIHtcbiAgICAgIHN0eWxlOiAnbWFyZ2luLXRvcDoxMnB4O3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICMxNmEzNGE7Ym9yZGVyLXJhZGl1czo2cHg7YmFja2dyb3VuZDojMDUyZTFhO2NvbG9yOiNiYmY3ZDA7Zm9udC1zaXplOjAuODVyZW0nLFxuICAgIH0pO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ3N0cm9uZycsIHsgdGV4dDogJ0ludml0ZSBpc3N1ZWQgXHUyMDE0IGNvcHkgdGhlIGxpbmsgYmVsb3cuICcgK1xuICAgICAgJ0l0IHdpbGwgbm90IGJlIHNob3duIGFnYWluLicgfSkpO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ2JyJykpO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ2NvZGUnLCB7XG4gICAgICBzdHlsZTogJ2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo4cHg7cGFkZGluZzo4cHg7YmFja2dyb3VuZDojMDAwO2JvcmRlci1yYWRpdXM6NHB4O3dvcmQtYnJlYWs6YnJlYWstYWxsO2NvbG9yOiNkMWZhZTUnLFxuICAgICAgdGV4dDogaW52aXRlLmFjY2VwdFVybCxcbiAgICB9KSk7XG4gICAgY29uc3QgY29weUJ0biA9IF9lbCgnYnV0dG9uJywge1xuICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ21hcmdpbi10b3A6OHB4O3BhZGRpbmc6NHB4IDEwcHgnLFxuICAgICAgdGV4dDogJ0NvcHkgbGluaycsXG4gICAgICBvbmNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoaW52aXRlLmFjY2VwdFVybCk7XG4gICAgICAgICAgY29weUJ0bi50ZXh0Q29udGVudCA9ICdDb3BpZWQhJztcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgY29weUJ0bi50ZXh0Q29udGVudCA9ICdDb3B5IGxpbmsnOyB9LCAyMDAwKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdDbGlwYm9hcmQgYmxvY2tlZDogc2VsZWN0IHRoZSBsaW5rIG1hbnVhbGx5LicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChjb3B5QnRuKTtcbiAgICBpZiAoaW52aXRlLmRlbGl2ZXJlZFZpYSA9PT0gJ2Rldi1jb25zb2xlJykge1xuICAgICAgYmFubmVyLmFwcGVuZENoaWxkKF9lbCgncCcsIHtcbiAgICAgICAgc3R5bGU6ICdtYXJnaW4tdG9wOjhweDtjb2xvcjojZmJiZjI0O2ZvbnQtc2l6ZTowLjhyZW0nLFxuICAgICAgICB0ZXh0OiAnU01UUCBub3QgY29uZmlndXJlZCBcdTIwMTQgdGhlIGludml0ZSB3YXMgbG9nZ2VkIHRvIHRoZSBzZXJ2ZXIgY29uc29sZSAoc2VhcmNoIGZvciBbREMtMDQ4LURFVi1JTlZJVEUtTElOS10pLicsXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIGlmIChpbnZpdGUuZGVsaXZlcmVkVmlhID09PSAnZW1haWwnKSB7XG4gICAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywge1xuICAgICAgICBzdHlsZTogJ21hcmdpbi10b3A6OHB4O2NvbG9yOiM4NmVmYWM7Zm9udC1zaXplOjAuOHJlbScsXG4gICAgICAgIHRleHQ6ICdFbWFpbCBzZW50IHRvICcgKyBpbnZpdGUuZW1haWwgKyAnLicsXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHBhcmVudC5hcHBlbmRDaGlsZChiYW5uZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBhZG1pbiBwYW5lbC4gQ2FsbGVkIGJ5IHRoZSBvcGVuIHRyaWdnZXI7IHNhZmUgdG8gY2FsbCBtdWx0aXBsZVxuICAgKiB0aW1lcyAocmUtcmVuZGVycyBpbnRvIHRoZSBzYW1lIGNvbnRhaW5lcikuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBtb3VudChjb250YWluZXIpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgnaDInLCB7IHN0eWxlOiAnbWFyZ2luOjAgMCAxNnB4JywgdGV4dDogJ0FkbWluIFx1MDBCNyBVc2VycyAmIEludml0ZXMnIH0pKTtcblxuICAgIGNvbnN0IG1lRGF0YSA9IGF3YWl0IF9mZXRjaEpTT04oQVBJLm1lKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICBpZiAoIW1lRGF0YSB8fCAhbWVEYXRhLnVzZXIgfHwgbWVEYXRhLnVzZXIucm9sZSAhPT0gJ2FkbWluJykge1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgncCcsIHtcbiAgICAgICAgc3R5bGU6ICdjb2xvcjp2YXIoLS1tdXRlZCknLFxuICAgICAgICB0ZXh0OiAnQWRtaW4gcm9sZSByZXF1aXJlZCB0byB2aWV3IHRoaXMgcGFuZWwuIElmIG11bHRpLXVzZXIgbW9kZSBpcyBlbmFibGVkIGFuZCB5b3Ugc2hvdWxkIGhhdmUgYWNjZXNzLCBjaGVjayAvYXBpL3YxL2F1dGgvbWUuJyxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWZyZXNoIGJ1dHRvblxuICAgIGNvbnN0IHJlZnJlc2hCdG4gPSBfZWwoJ2J1dHRvbicsIHtcbiAgICAgIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdmbG9hdDpyaWdodDtwYWRkaW5nOjRweCAxMHB4JyxcbiAgICAgIHRleHQ6ICdSZWZyZXNoJyxcbiAgICAgIG9uY2xpY2s6ICgpID0+IG1vdW50KGNvbnRhaW5lciksXG4gICAgfSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHJlZnJlc2hCdG4pO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFVzZXJzIHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgdXNlcnNIZWFkZXIgPSBfZWwoJ2gzJywgeyBzdHlsZTogJ21hcmdpbjoyNHB4IDAgOHB4O2NsZWFyOmJvdGgnLCB0ZXh0OiAnVXNlcnMnIH0pO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh1c2Vyc0hlYWRlcik7XG5cbiAgICBjb25zdCB1c2Vyc0xpc3QgPSBfZWwoJ2RpdicsIHsgaWQ6ICdhZG1pbi11c2Vycy1saXN0JyB9KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodXNlcnNMaXN0KTtcblxuICAgIGNvbnN0IHVzZXJzRGF0YSA9IGF3YWl0IF9mZXRjaEpTT04oQVBJLnVzZXJzKS5jYXRjaCgoKSA9PiAoeyB1c2VyczogW10gfSkpO1xuICAgIF9yZW5kZXJVc2Vyc0xpc3QodXNlcnNMaXN0LCB1c2Vyc0RhdGEudXNlcnMsICgpID0+IG1vdW50KGNvbnRhaW5lcikpO1xuXG4gICAgLy8gQWRkIHVzZXIgZm9ybSAocHJlLWF1dGhvcml6ZSBhbiBlbWFpbCB3aXRob3V0IGlzc3VpbmcgYW4gaW52aXRlKS5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdoNCcsIHsgc3R5bGU6ICdtYXJnaW46MjRweCAwIDhweDtmb250LXNpemU6MC45NXJlbScsIHRleHQ6ICdQcmUtYXV0aG9yaXplIGVtYWlsJyB9KSk7XG4gICAgY29uc3QgYWRkVXNlckZvcm0gPSBfZWwoJ2Zvcm0nLCB7XG4gICAgICBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmVuZCcsXG4gICAgICBvbnN1Ym1pdDogYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGVtYWlsID0gZXYudGFyZ2V0LmVtYWlsLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgaWYgKCFlbWFpbCkgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IF9mZXRjaEpTT04oQVBJLnVzZXJzLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiB7IGVtYWlsIH0gfSk7XG4gICAgICAgICAgZXYudGFyZ2V0LnJlc2V0KCk7XG4gICAgICAgICAgbW91bnQoY29udGFpbmVyKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdBZGQgZmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgICBhZGRVc2VyRm9ybS5hcHBlbmRDaGlsZChfZWwoJ2lucHV0JywgeyBuYW1lOiAnZW1haWwnLCB0eXBlOiAnZW1haWwnLCByZXF1aXJlZDogdHJ1ZSwgcGxhY2Vob2xkZXI6ICd1c2VyQGV4YW1wbGUuY29tJywgc3R5bGU6ICdwYWRkaW5nOjZweCcgfSkpO1xuICAgIGFkZFVzZXJGb3JtLmFwcGVuZENoaWxkKF9lbCgnYnV0dG9uJywgeyB0eXBlOiAnc3VibWl0JywgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6NnB4IDEycHgnLCB0ZXh0OiAnQWRkIHRvIGFsbG93bGlzdCcgfSkpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChhZGRVc2VyRm9ybSk7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSW52aXRlcyBzZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ2gzJywgeyBzdHlsZTogJ21hcmdpbjoyNHB4IDAgOHB4JywgdGV4dDogJ0lzc3VlIGludml0ZScgfSkpO1xuICAgIGNvbnN0IGludml0ZUZvcm1Db250YWluZXIgPSBfZWwoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpbnZpdGVGb3JtQ29udGFpbmVyKTtcblxuICAgIGNvbnN0IGludml0ZXNMaXN0ID0gX2VsKCdkaXYnLCB7IGlkOiAnYWRtaW4taW52aXRlcy1saXN0Jywgc3R5bGU6ICdtYXJnaW4tdG9wOjE2cHgnIH0pO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpbnZpdGVzTGlzdCk7XG5cbiAgICBjb25zdCBpbnZpdGVzRGF0YSA9IGF3YWl0IF9mZXRjaEpTT04oQVBJLmludml0ZXMpLmNhdGNoKCgpID0+ICh7IGludml0ZXM6IFtdIH0pKTtcbiAgICBfcmVuZGVySW52aXRlc0xpc3QoaW52aXRlc0xpc3QsIGludml0ZXNEYXRhLmludml0ZXMsICgpID0+IG1vdW50KGNvbnRhaW5lcikpO1xuXG4gICAgX3JlbmRlckludml0ZUZvcm0oaW52aXRlRm9ybUNvbnRhaW5lciwgKGlzc3VlZCkgPT4ge1xuICAgICAgX3JlbmRlcklzc3VlZEludml0ZUJhbm5lcihpc3N1ZWQsIGludml0ZUZvcm1Db250YWluZXIpO1xuICAgICAgbW91bnQoY29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBQdWJsaWMgQVBJIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBhZG1pbiBwYW5lbCBhcyBhIG1vZGFsIG92ZXJsYXkuIENsb3NlcyBvbiBiYWNrZHJvcCBjbGljayBvclxuICAgKiB0aGUgY2xvc2UgYnV0dG9uLiBSZW5kZXJzIGludG8gZG9jdW1lbnQuYm9keSBzbyBpdCBmbG9hdHMgYWJvdmUgdGhlXG4gICAqIGRhc2hib2FyZCBjaHJvbWUuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBvcGVuKCkge1xuICAgIC8vIElmIGFscmVhZHkgb3BlbiwganVzdCBmb2N1cy5cbiAgICBjb25zdCBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbi1wYW5lbC1yb290Jyk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm47XG5cbiAgICBjb25zdCBiYWNrZHJvcCA9IF9lbCgnZGl2Jywge1xuICAgICAgaWQ6ICdhZG1pbi1wYW5lbC1yb290JyxcbiAgICAgIHN0eWxlOiAncG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOycsXG4gICAgICBvbmNsaWNrOiAoZXYpID0+IHtcbiAgICAgICAgaWYgKGV2LnRhcmdldCA9PT0gYmFja2Ryb3ApIGNsb3NlKCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgY2FyZCA9IF9lbCgnZGl2Jywge1xuICAgICAgc3R5bGU6ICdiYWNrZ3JvdW5kOnZhcigtLWNhcmQtYmFzZSwjMWYyOTM3KTtjb2xvcjp2YXIoLS10ZXh0LCNmM2Y0ZjYpO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MjRweDttYXgtd2lkdGg6OTAwcHg7d2lkdGg6OTAlO21heC1oZWlnaHQ6ODV2aDtvdmVyZmxvdzphdXRvO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaGFkb3c6MCAxMHB4IDMwcHggcmdiYSgwLDAsMCwwLjMpJyxcbiAgICB9KTtcbiAgICBjYXJkLmFwcGVuZENoaWxkKF9lbCgnYnV0dG9uJywge1xuICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMnB4O3JpZ2h0OjEycHg7cGFkZGluZzo0cHggMTBweCcsXG4gICAgICB0ZXh0OiAnQ2xvc2UnLCBvbmNsaWNrOiBjbG9zZSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBib2R5ID0gX2VsKCdkaXYnLCB7IGlkOiAnYWRtaW4tcGFuZWwtYm9keScgfSk7XG4gICAgY2FyZC5hcHBlbmRDaGlsZChib2R5KTtcbiAgICBiYWNrZHJvcC5hcHBlbmRDaGlsZChjYXJkKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhY2tkcm9wKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBtb3VudChib2R5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBib2R5LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiNmODcxNzFcIj5GYWlsZWQgdG8gbG9hZCBhZG1pbiBwYW5lbDogJyArIChlLm1lc3NhZ2UgfHwgZSkgKyAnPC9wPic7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW4tcGFuZWwtcm9vdCcpO1xuICAgIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IGFuIFwiQWRtaW5cIiBidXR0b24gaW50byB0aGUgdG9wIGJhci4gT25seSByZW5kZXJzIHdoZW4gdGhlXG4gICAqIGN1cnJlbnQgL21lIHJlc3BvbnNlIHNheXMgaXNBZG1pbj10cnVlLiBSZS1jaGVja3MgcGVyaW9kaWNhbGx5XG4gICAqIChldmVyeSA2MHMpIHNvIGEgcGVybWlzc2lvbiBkb3duZ3JhZGUgdGFrZXMgZWZmZWN0IHdpdGhvdXQgYSByZWxvYWQuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBhdHRhY2hUcmlnZ2VyKGJhckNvbnRhaW5lcikge1xuICAgIGFzeW5jIGZ1bmN0aW9uIF9tYXliZVNob3coKSB7XG4gICAgICBjb25zdCBtZSA9IGF3YWl0IF9mZXRjaEpTT04oQVBJLm1lKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluLXRyaWdnZXItYnRuJyk7XG4gICAgICBpZiAobWUgJiYgbWUudXNlciAmJiBtZS51c2VyLnJvbGUgPT09ICdhZG1pbicpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGJ0biA9IF9lbCgnYnV0dG9uJywge1xuICAgICAgICAgIGlkOiAnYWRtaW4tdHJpZ2dlci1idG4nLFxuICAgICAgICAgIGNsYXNzOiAnYnRuLXNtJyxcbiAgICAgICAgICBzdHlsZTogJ21hcmdpbi1sZWZ0OjhweDtwYWRkaW5nOjZweCAxMnB4JyxcbiAgICAgICAgICB0ZXh0OiAnQWRtaW4nLFxuICAgICAgICAgIG9uY2xpY2s6IG9wZW4sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYmFyQ29udGFpbmVyKSBiYXJDb250YWluZXIuYXBwZW5kQ2hpbGQoYnRuKTtcbiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQuYm9keSkgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChidG4pO1xuICAgICAgfSBlbHNlIGlmIChleGlzdGluZykge1xuICAgICAgICBleGlzdGluZy5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgX21heWJlU2hvdygpO1xuICAgIHNldEludGVydmFsKF9tYXliZVNob3csIDYwXzAwMCk7XG4gIH1cblxuICB3aW5kb3cuQWRtaW5QYW5lbCA9IHsgb3BlbiwgY2xvc2UsIGF0dGFjaFRyaWdnZXIgfTtcbn0pKCk7O1xuLy8gPT09PT09PT09PSBDUkVERU5USUFMIE1BTkFHRU1FTlQgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyBJbmplY3Qgc2tlbGV0b24gbW9kYWwgXHUyMDE0IGNyZWRlbnRpYWwgc2VjdGlvbnMgYXJlIGJ1aWx0IGR5bmFtaWNhbGx5IHdoZW4gb3BlbmVkXG4gIGluamVjdE1vZGFsKCd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJywgYFxuICA8ZGl2IGlkPVwidG9rZW4tbWFuYWdlbWVudC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNTAwcHg7IG1heC13aWR0aDogNjAwcHg7XCI+XG4gICAgICA8aDM+XFx1ezFGNTExfSBETlMgQ3JlZGVudGlhbHM8L2gzPlxuXG4gICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDtcIj5cbiAgICAgICAgRW50ZXIgVGVjaG5pdGl1bSBETlMgbG9naW4gY3JlZGVudGlhbHMuIFJlYWQtb25seSBhY2NvdW50cyBhcmUgdXNlZCBmb3IgbG9nczsgYWRtaW4gYWNjb3VudHMgZm9yIHJlc3RhcnRzLCByZWNvcmRzLCBhbmQgdXBkYXRlcy5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBpZD1cImRucy1jcmVkLXNlY3Rpb25zXCI+PC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG9rZW4tY2xlYXItYWxsXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IGF1dG87IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1iYWQtZmcpIDE1JSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6IHZhcigtLWJhZC1mZyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkNsZWFyIEFsbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG9rZW4tY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b2tlbi1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICBgKTtcblxuICAvLyBcdTI1MDBcdTI1MDAgSGVscGVycyBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZXREbnNJZHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFNJVEUuZG5zU2VydmVycyB8fCB7fSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREbnNEaXNwbGF5TmFtZShkbnNJZCkge1xuICAgIGNvbnN0IHNlcnZlciA9IChTSVRFLmRuc1NlcnZlcnMgfHwge30pW2Ruc0lkXTtcbiAgICByZXR1cm4gc2VydmVyPy5uYW1lIHx8IGRuc0lkLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICAvKiogQnVpbGQgcGVyLXNlcnZlciBjcmVkZW50aWFsIGZvcm0gc2VjdGlvbnMgZnJvbSBTSVRFLmRuc1NlcnZlcnMgKi9cbiAgZnVuY3Rpb24gYnVpbGRDcmVkZW50aWFsU2VjdGlvbnMoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1jcmVkLXNlY3Rpb25zJyk7XG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBkbnNJZHMgPSBnZXREbnNJZHMoKTtcbiAgICBpZiAoZG5zSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj5ObyBETlMgc2VydmVycyBjb25maWd1cmVkLjwvcD4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaWQgb2YgZG5zSWRzKSB7XG4gICAgICBjb250YWluZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBgXG4gICAgICA8ZGl2IGNsYXNzPVwidG9rZW4tc2VjdGlvblwiPlxuICAgICAgICA8aDQgY2xhc3M9XCJ0b2tlbi1zZWN0aW9uLXRpdGxlXCI+JHtnZXREbnNEaXNwbGF5TmFtZShpZCl9PC9oND5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLWdyaWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4tZmllbGRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCIke2lkfS1yZWFkb25seS11c2VybmFtZVwiPlxcdXsxRjRENn0gUmVhZC1Pbmx5IChMb2dzKTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIke2lkfS1yZWFkb25seS11c2VybmFtZVwiIHBsYWNlaG9sZGVyPVwiVXNlcm5hbWVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDRweDtcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLWlucHV0LXJvd1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCIke2lkfS1yZWFkb25seS10b2tlblwiIHBsYWNlaG9sZGVyPVwiUGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRva2VuLXRvZ2dsZVwiIGRhdGEtdGFyZ2V0PVwiJHtpZH0tcmVhZG9ubHktdG9rZW5cIj5cXHV7MUY0NDF9PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4tZmllbGRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCIke2lkfS1hZG1pbi11c2VybmFtZVwiPlxcdXsxRjUyN30gQWRtaW46PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiJHtpZH0tYWRtaW4tdXNlcm5hbWVcIiBwbGFjZWhvbGRlcj1cIlVzZXJuYW1lXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA0cHg7XCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1pbnB1dC1yb3dcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiJHtpZH0tYWRtaW4tdG9rZW5cIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0b2tlbi10b2dnbGVcIiBkYXRhLXRhcmdldD1cIiR7aWR9LWFkbWluLXRva2VuXCI+XFx1ezFGNDQxfTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4tc3RhdHVzXCIgaWQ9XCIke2lkfS10b2tlbi1zdGF0dXNcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIENyZWRlbnRpYWwgZW5jcnlwdGlvbiBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZXRFbmNyeXB0aW9uS2V5KCkge1xuICAgIGxldCBrZXkgPSBzYWZlU2Vzc2lvbkdldCgnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5Jyk7XG4gICAgaWYgKGtleSkgcmV0dXJuIGtleTtcblxuICAgIGNvbnN0IG9sZEtleSA9IHNhZmVHZXQoJ2Rhc2hjYWRkeS1lbmNyeXB0aW9uLWtleScpO1xuICAgIGlmIChvbGRLZXkpIHtcbiAgICAgIHNhZmVTZXNzaW9uU2V0KCdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknLCBvbGRLZXkpO1xuICAgICAgc2FmZVJlbW92ZSgnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5Jyk7XG4gICAgICByZXR1cm4gb2xkS2V5O1xuICAgIH1cblxuICAgIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuICAgIGtleSA9IEFycmF5LmZyb20oYXJyYXksIGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgc2FmZVNlc3Npb25TZXQoJ2Rhc2hjYWRkeS1lbmNyeXB0aW9uLWtleScsIGtleSk7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuICBjb25zdCBFTkNSWVBUSU9OX0tFWSA9IGdldEVuY3J5cHRpb25LZXkoKTtcblxuICBmdW5jdGlvbiBjcmVkZW50aWFsRW5jcnlwdCh0ZXh0LCBrZXkpIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcbiAgICBjb25zdCBpdiA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoOCkpO1xuICAgIGNvbnN0IGl2SGV4ID0gQXJyYXkuZnJvbShpdiwgYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICBjb25zdCBrZXlCeXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShrZXkgKyBpdkhleCk7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hhckNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSlcbiAgICAgICAgXiBrZXlCeXRlc1tpICUga2V5Qnl0ZXMubGVuZ3RoXVxuICAgICAgICBeIGl2W2kgJSBpdi5sZW5ndGhdXG4gICAgICAgIF4gKChpICogMzEgKyAxNykgJiAweEZGKTtcbiAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIGl2SGV4ICsgJzonICsgYnRvYShyZXN1bHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlZGVudGlhbERlY3J5cHQoZW5jcnlwdGVkVGV4dCwga2V5KSB7XG4gICAgaWYgKCFlbmNyeXB0ZWRUZXh0KSByZXR1cm4gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbG9uSWR4ID0gZW5jcnlwdGVkVGV4dC5pbmRleE9mKCc6Jyk7XG4gICAgICBpZiAoY29sb25JZHggPT09IDE2KSB7XG4gICAgICAgIGNvbnN0IGl2SGV4ID0gZW5jcnlwdGVkVGV4dC5zdWJzdHJpbmcoMCwgMTYpO1xuICAgICAgICBjb25zdCBpdiA9IG5ldyBVaW50OEFycmF5KGl2SGV4Lm1hdGNoKC8uezJ9L2cpLm1hcChoID0+IHBhcnNlSW50KGgsIDE2KSkpO1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gYXRvYihlbmNyeXB0ZWRUZXh0LnN1YnN0cmluZygxNykpO1xuICAgICAgICBjb25zdCBrZXlCeXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShrZXkgKyBpdkhleCk7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2hhckNvZGUgPSBkZWNvZGVkLmNoYXJDb2RlQXQoaSlcbiAgICAgICAgICAgIF4ga2V5Qnl0ZXNbaSAlIGtleUJ5dGVzLmxlbmd0aF1cbiAgICAgICAgICAgIF4gaXZbaSAlIGl2Lmxlbmd0aF1cbiAgICAgICAgICAgIF4gKChpICogMzEgKyAxNykgJiAweEZGKTtcbiAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY29kZWQgPSBhdG9iKGVuY3J5cHRlZFRleHQpO1xuICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoYXJDb2RlID0gZGVjb2RlZC5jaGFyQ29kZUF0KGkpIF4ga2V5LmNoYXJDb2RlQXQoaSAlIGtleS5sZW5ndGgpO1xuICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgQ3JlZGVudGlhbCBzdG9yYWdlIFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGdldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgY3JlZFR5cGUpIHtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSBzYWZlR2V0KGAke2Ruc0lkfS0ke3Rva2VuVHlwZX0tJHtjcmVkVHlwZX0tZW5jYCk7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxEZWNyeXB0KGVuY3J5cHRlZCwgRU5DUllQVElPTl9LRVkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCBjcmVkVHlwZSwgdmFsdWUpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtkbnNJZH0tJHt0b2tlblR5cGV9LSR7Y3JlZFR5cGV9LWVuY2A7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzYWZlU2V0KGtleSwgY3JlZGVudGlhbEVuY3J5cHQodmFsdWUsIEVOQ1JZUFRJT05fS0VZKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNhZmVSZW1vdmUoa2V5KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUb2tlbihkbnNJZCwgdG9rZW5UeXBlKSB7XG4gICAgcmV0dXJuIGdldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgJ3Rva2VuJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRVc2VybmFtZShkbnNJZCwgdG9rZW5UeXBlKSB7XG4gICAgcmV0dXJuIGdldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgJ3VzZXJuYW1lJyk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRUb2tlbihkbnNJZCwgdG9rZW5UeXBlLCB0b2tlbikge1xuICAgIHNldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgJ3Rva2VuJywgdG9rZW4pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0VXNlcm5hbWUoZG5zSWQsIHRva2VuVHlwZSwgdXNlcm5hbWUpIHtcbiAgICBzZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsICd1c2VybmFtZScsIHVzZXJuYW1lKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEFsbENyZWRlbnRpYWxzKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgZG5zSWQgb2YgZ2V0RG5zSWRzKCkpIHtcbiAgICAgIHJlc3VsdFtkbnNJZF0gPSB7XG4gICAgICAgIHJlYWRvbmx5OiB7IHVzZXJuYW1lOiBnZXRVc2VybmFtZShkbnNJZCwgJ3JlYWRvbmx5JyksIHRva2VuOiBnZXRUb2tlbihkbnNJZCwgJ3JlYWRvbmx5JykgfSxcbiAgICAgICAgYWRtaW46IHsgdXNlcm5hbWU6IGdldFVzZXJuYW1lKGRuc0lkLCAnYWRtaW4nKSwgdG9rZW46IGdldFRva2VuKGRuc0lkLCAnYWRtaW4nKSB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJBbGxDcmVkZW50aWFscygpIHtcbiAgICBnZXREbnNJZHMoKS5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgIFsncmVhZG9ubHknLCAnYWRtaW4nXS5mb3JFYWNoKHRva2VuVHlwZSA9PiB7XG4gICAgICAgIFsndG9rZW4nLCAndXNlcm5hbWUnXS5mb3JFYWNoKGNyZWRUeXBlID0+IHtcbiAgICAgICAgICBzYWZlUmVtb3ZlKGAke2Ruc0lkfS0ke3Rva2VuVHlwZX0tJHtjcmVkVHlwZX0tZW5jYCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBzYWZlUmVtb3ZlKGAke2Ruc0lkfS10b2tlbi1lbmNgKTtcbiAgICAgIHNhZmVSZW1vdmUoYCR7ZG5zSWR9LXVzZXJuYW1lLWVuY2ApO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3RvcmVkQ3JlZGVudGlhbHMoZG5zSWQpIHtcbiAgICBjb25zdCByZWFkb25seVRva2VuID0gZ2V0VG9rZW4oZG5zSWQsICdyZWFkb25seScpO1xuICAgIGNvbnN0IHJlYWRvbmx5VXNlcm5hbWUgPSBnZXRVc2VybmFtZShkbnNJZCwgJ3JlYWRvbmx5Jyk7XG4gICAgY29uc3QgYWRtaW5Ub2tlbiA9IGdldFRva2VuKGRuc0lkLCAnYWRtaW4nKTtcbiAgICBjb25zdCBhZG1pblVzZXJuYW1lID0gZ2V0VXNlcm5hbWUoZG5zSWQsICdhZG1pbicpO1xuICAgIGNvbnN0IG9sZFRva2VuID0gY3JlZGVudGlhbERlY3J5cHQoc2FmZUdldChgJHtkbnNJZH0tdG9rZW4tZW5jYCksIEVOQ1JZUFRJT05fS0VZKTtcbiAgICBjb25zdCBvbGRVc2VybmFtZSA9IGNyZWRlbnRpYWxEZWNyeXB0KHNhZmVHZXQoYCR7ZG5zSWR9LXVzZXJuYW1lLWVuY2ApLCBFTkNSWVBUSU9OX0tFWSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdXNlcm5hbWU6IGFkbWluVXNlcm5hbWUgfHwgcmVhZG9ubHlVc2VybmFtZSB8fCBvbGRVc2VybmFtZSxcbiAgICAgIHRva2VuOiBhZG1pblRva2VuIHx8IHJlYWRvbmx5VG9rZW4gfHwgb2xkVG9rZW4sXG4gICAgICByZWFkb25seVRva2VuOiByZWFkb25seVRva2VuIHx8IG9sZFRva2VuLFxuICAgICAgcmVhZG9ubHlVc2VybmFtZTogcmVhZG9ubHlVc2VybmFtZSB8fCBvbGRVc2VybmFtZSxcbiAgICAgIGFkbWluVG9rZW46IGFkbWluVG9rZW4gfHwgb2xkVG9rZW4sXG4gICAgICBhZG1pblVzZXJuYW1lOiBhZG1pblVzZXJuYW1lIHx8IG9sZFVzZXJuYW1lXG4gICAgfTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBNb2RhbCBoYW5kbGVycyBcdTI1MDBcdTI1MDBcblxuICAvLyBPcGVuIG1vZGFsIFx1MjAxNCBidWlsZCBzZWN0aW9ucyBkeW5hbWljYWxseSwgcG9wdWxhdGUgZnJvbSBzdG9yZWQgY3JlZHNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS10b2tlbnMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgYnVpbGRDcmVkZW50aWFsU2VjdGlvbnMoKTtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyk7XG4gICAgY29uc3QgY3JlZHMgPSBnZXRBbGxDcmVkZW50aWFscygpO1xuXG4gICAgZ2V0RG5zSWRzKCkuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICBjb25zdCBjID0gY3JlZHNbZG5zSWRdO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXVzZXJuYW1lYCkudmFsdWUgPSBjLnJlYWRvbmx5LnVzZXJuYW1lO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXRva2VuYCkudmFsdWUgPSBjLnJlYWRvbmx5LnRva2VuO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXVzZXJuYW1lYCkudmFsdWUgPSBjLmFkbWluLnVzZXJuYW1lO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXRva2VuYCkudmFsdWUgPSBjLmFkbWluLnRva2VuO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJyc7XG4gICAgfSk7XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH0pO1xuXG4gIC8vIFRvZ2dsZSBwYXNzd29yZCB2aXNpYmlsaXR5ICsgYmFja2Ryb3AgY2xvc2UgKGV2ZW50IGRlbGVnYXRpb24gZm9yIGR5bmFtaWMgZWxlbWVudHMpXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcudG9rZW4tdG9nZ2xlJyk7XG4gICAgaWYgKGJ0bikge1xuICAgICAgY29uc3QgdGFyZ2V0SWQgPSBidG4uZGF0YXNldC50YXJnZXQ7XG4gICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldElkKTtcbiAgICAgIGlmIChpbnB1dC50eXBlID09PSAncGFzc3dvcmQnKSB7XG4gICAgICAgIGlucHV0LnR5cGUgPSAndGV4dCc7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcXHV7MUY2NDh9JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0LnR5cGUgPSAncGFzc3dvcmQnO1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXFx1ezFGNDQxfSc7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlLnRhcmdldC5pZCA9PT0gJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnKSB7XG4gICAgICBlLnRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBTYXZlIGNyZWRlbnRpYWxzXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbi1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRuc0lkcyA9IGdldERuc0lkcygpO1xuXG4gICAgLy8gU2F2ZSBhbGwgdG8gbG9jYWxTdG9yYWdlXG4gICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgc2V0VXNlcm5hbWUoZG5zSWQsICdyZWFkb25seScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS11c2VybmFtZWApLnZhbHVlLnRyaW0oKSk7XG4gICAgICBzZXRUb2tlbihkbnNJZCwgJ3JlYWRvbmx5JywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXRva2VuYCkudmFsdWUudHJpbSgpKTtcbiAgICAgIHNldFVzZXJuYW1lKGRuc0lkLCAnYWRtaW4nLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdXNlcm5hbWVgKS52YWx1ZS50cmltKCkpO1xuICAgICAgc2V0VG9rZW4oZG5zSWQsICdhZG1pbicsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi10b2tlbmApLnZhbHVlLnRyaW0oKSk7XG4gICAgfSk7XG5cbiAgICAvLyBCdWlsZCBwZXItc2VydmVyIGNyZWRlbnRpYWxzIHBheWxvYWQgZm9yIGJhY2tlbmQgc3luY1xuICAgIGNvbnN0IHNlcnZlcnMgPSB7fTtcbiAgICBsZXQgaGFzQW55Q3JlZHMgPSBmYWxzZTtcblxuICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0ge307XG4gICAgICBjb25zdCByb1VzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdXNlcm5hbWVgKS52YWx1ZS50cmltKCk7XG4gICAgICBjb25zdCByb1Bhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdG9rZW5gKS52YWx1ZS50cmltKCk7XG4gICAgICBjb25zdCBhZG1pblVzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdXNlcm5hbWVgKS52YWx1ZS50cmltKCk7XG4gICAgICBjb25zdCBhZG1pblBhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdG9rZW5gKS52YWx1ZS50cmltKCk7XG5cbiAgICAgIGlmIChyb1VzZXIgJiYgcm9QYXNzKSB7XG4gICAgICAgIGVudHJ5LnJlYWRvbmx5ID0geyB1c2VybmFtZTogcm9Vc2VyLCBwYXNzd29yZDogcm9QYXNzIH07XG4gICAgICAgIGhhc0FueUNyZWRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhZG1pblVzZXIgJiYgYWRtaW5QYXNzKSB7XG4gICAgICAgIGVudHJ5LmFkbWluID0geyB1c2VybmFtZTogYWRtaW5Vc2VyLCBwYXNzd29yZDogYWRtaW5QYXNzIH07XG4gICAgICAgIGhhc0FueUNyZWRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3Qua2V5cyhlbnRyeSkubGVuZ3RoID4gMCkge1xuICAgICAgICBzZXJ2ZXJzW2Ruc0lkXSA9IGVudHJ5O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGhhc0FueUNyZWRzKSB7XG4gICAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgIGlmIChzZXJ2ZXJzW2Ruc0lkXSkge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICdWZXJpZnlpbmcuLi4nO1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzJztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Rucy9jcmVkZW50aWFscycsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlcnZlcnMgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgIGlmIChkYXRhLnJlc3VsdHMpIHtcbiAgICAgICAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKTtcbiAgICAgICAgICAgIGlmICghc2VydmVyc1tkbnNJZF0pIHsgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgcmV0dXJuOyB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkYXRhLnJlc3VsdHNbZG5zSWRdO1xuICAgICAgICAgICAgaWYgKHJlc3VsdD8uc3VjY2Vzcykge1xuICAgICAgICAgICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcXHUyNzEzIFZlcmlmaWVkICYgc2F2ZWQnO1xuICAgICAgICAgICAgICBzdGF0dXNFbC5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzIHN1Y2Nlc3MnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQ/LnBhcnRpYWwpIHtcbiAgICAgICAgICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXFx1MjcxMyAnICsgcmVzdWx0LnBhcnRpYWw7XG4gICAgICAgICAgICAgIHN0YXR1c0VsLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgc3VjY2Vzcyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcXHUyNzE3ICcgKyAocmVzdWx0Py5lcnJvciB8fCAnTG9naW4gZmFpbGVkJyk7XG4gICAgICAgICAgICAgIHN0YXR1c0VsLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgZXJyb3InO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgICAgIGlmIChzZXJ2ZXJzW2Ruc0lkXSkge1xuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnXFx1MjcxMyBTYXZlZCc7XG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzIHN1Y2Nlc3MnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgICAgIGlmIChzZXJ2ZXJzW2Ruc0lkXSkge1xuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnXFx1MjcxNyAnICsgKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCcpO1xuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyBlcnJvcic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN5bmMgRE5TIGNyZWRlbnRpYWxzIHRvIGJhY2tlbmQ6JywgZSk7XG4gICAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgICBpZiAoc2VydmVyc1tkbnNJZF0pIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICdcXHUyNzEzIFNhdmVkIGxvY2FsbHkgKHN5bmMgZmFpbGVkKSc7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEF1dG8tY2xvc2UgYWZ0ZXIgZGVsYXkgaWYgYWxsIHN1Y2NlZWRlZFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgYWxsR29vZCA9IGRuc0lkcy5ldmVyeShkbnNJZCA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKT8udGV4dENvbnRlbnQ7XG4gICAgICAgIHJldHVybiAhc3RhdHVzIHx8IHN0YXR1cy5pbmNsdWRlcygnXFx1MjcxMycpO1xuICAgICAgfSk7XG4gICAgICBpZiAoYWxsR29vZCkgY2xvc2VNb2RhbCgndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcpO1xuICAgIH0sIDE1MDApO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW4tY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNsb3NlTW9kYWwoJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuLWNsZWFyLWFsbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlybSgnQ2xlYXIgYWxsIHN0b3JlZCBETlMgY3JlZGVudGlhbHM/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkge1xuICAgICAgY2xlYXJBbGxDcmVkZW50aWFscygpO1xuICAgICAgZ2V0RG5zSWRzKCkuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS11c2VybmFtZWApLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS10b2tlbmApLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi11c2VybmFtZWApLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi10b2tlbmApLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICdcXHUyNzEzIENsZWFyZWQnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyBzdWNjZXNzJztcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZG5zL2NyZWRlbnRpYWxzJywgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBXaW5kb3cgZXhwb3J0cyBcdTI1MDBcdTI1MDBcbiAgd2luZG93LmdldFRva2VuID0gZ2V0VG9rZW47XG4gIHdpbmRvdy5nZXRVc2VybmFtZSA9IGdldFVzZXJuYW1lO1xuICB3aW5kb3cuc2V0VG9rZW4gPSBzZXRUb2tlbjtcbiAgd2luZG93LnNldFVzZXJuYW1lID0gc2V0VXNlcm5hbWU7XG4gIHdpbmRvdy5nZXRBbGxDcmVkZW50aWFscyA9IGdldEFsbENyZWRlbnRpYWxzO1xuICB3aW5kb3cuZ2V0Q3JlZGVudGlhbCA9IGdldENyZWRlbnRpYWw7XG4gIHdpbmRvdy5zZXRDcmVkZW50aWFsID0gc2V0Q3JlZGVudGlhbDtcbiAgd2luZG93LmdldEVuY3J5cHRpb25LZXkgPSBnZXRFbmNyeXB0aW9uS2V5O1xuICB3aW5kb3cuZ2V0RG5zSWRzID0gZ2V0RG5zSWRzO1xuICB3aW5kb3cuZ2V0RG5zRGlzcGxheU5hbWUgPSBnZXREbnNEaXNwbGF5TmFtZTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gR1JJRCAmIFNUQVRVUyBIRUxQRVJTID09PT09PT09PT1cbihmdW5jdGlvbiAoKSB7XG5cbiAgZnVuY3Rpb24gc3RhdHVzTGFiZWwodXApIHtcbiAgICBjb25zdCBpMThuID0gd2luZG93LkRDSTE4bjtcbiAgICBpZiAoIWkxOG4gfHwgIWkxOG4uaXNMb2FkZWQoKSkgcmV0dXJuIHVwID8gJ09OJyA6ICdPRkYnO1xuICAgIHJldHVybiBpMThuLnQodXAgPyAnY2FyZC5zdGF0dXMub24nIDogJ2NhcmQuc3RhdHVzLm9mZicpO1xuICB9XG5cbiAgLyogRW5oYW5jZWQgc3RhdHVzIGhlbHBlcnMgd2l0aCByZXNwb25zZSB0aW1lIHRyYWNraW5nICovXG4gIGZ1bmN0aW9uIHNldFF1aWNrKGlkLCB1cCwgcmVzcG9uc2VUaW1lID0gbnVsbCkge1xuICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgJy1kb3QnKTtcbiAgICBjb25zdCBwaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAnLXBpbGwnKTtcbiAgICBjb25zdCB0aW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCArICctdGltZScpO1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHA9XCIke2lkfVwiXWApO1xuXG4gICAgaWYgKGRvdCkge1xuICAgICAgZG90LmNsYXNzTGlzdC50b2dnbGUoJ29rJywgdXApO1xuICAgICAgZG90LmNsYXNzTGlzdC50b2dnbGUoJ2JhZCcsICF1cCk7XG4gICAgfVxuXG4gICAgaWYgKHBpbGwpIHtcbiAgICAgIHBpbGwudGV4dENvbnRlbnQgPSBzdGF0dXNMYWJlbCh1cCk7XG4gICAgICBwaWxsLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgdXApO1xuICAgICAgcGlsbC5jbGFzc0xpc3QudG9nZ2xlKCdvZmYnLCAhdXApO1xuICAgIH1cblxuICAgIGlmICh0aW1lRWwgJiYgcmVzcG9uc2VUaW1lICE9PSBudWxsKSB7XG4gICAgICB0aW1lRWwudGV4dENvbnRlbnQgPSB1cCA/IGAke3Jlc3BvbnNlVGltZX1tc2AgOiAndGltZW91dCc7XG4gICAgICB0aW1lRWwuY2xhc3NOYW1lID0gYHJlc3BvbnNlLXRpbWUgJHtnZXRSZXNwb25zZVRpbWVDbGFzcyhyZXNwb25zZVRpbWUsIHVwKX1gO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjYXJkIHN0YXR1cyBmb3IgaWNvbiBjb2xvcmluZ1xuICAgIGlmIChjYXJkKSB7XG4gICAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnLCB1cCA/ICdvbicgOiAnb2ZmJyk7XG4gICAgfVxuXG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZXNwb25zZVRpbWVDbGFzcyh0aW1lLCBpc1VwKSB7XG4gICAgaWYgKCFpc1VwKSByZXR1cm4gJ3RpbWVvdXQnO1xuICAgIGlmICh0aW1lIDwgMjAwKSByZXR1cm4gJ2V4Y2VsbGVudCc7XG4gICAgaWYgKHRpbWUgPCA1MDApIHJldHVybiAnZ29vZCc7XG4gICAgaWYgKHRpbWUgPCAxMDAwKSByZXR1cm4gJ2ZhaXInO1xuICAgIHJldHVybiAnc2xvdyc7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjaGVja1NlcnZpY2VXaXRoVGltaW5nKGlkKSB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL3Byb2JlLycgKyBpZCwgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlVGltZSA9IE1hdGgucm91bmQoZW5kVGltZSAtIHN0YXJ0VGltZSk7XG4gICAgICBjb25zdCBpc1VwID0gKHIuc3RhdHVzID49IDIwMCAmJiByLnN0YXR1cyA8IDQwMCkgfHwgci5zdGF0dXMgPT09IDQwMSB8fCByLnN0YXR1cyA9PT0gNDAzO1xuICAgICAgcmV0dXJuIHsgaXNVcCwgcmVzcG9uc2VUaW1lIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zdCBlbmRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBjb25zdCByZXNwb25zZVRpbWUgPSBNYXRoLnJvdW5kKGVuZFRpbWUgLSBzdGFydFRpbWUpO1xuICAgICAgcmV0dXJuIHsgaXNVcDogZmFsc2UsIHJlc3BvbnNlVGltZSB9O1xuICAgIH1cbiAgfVxuXG4gIC8qIEFwcCBncmlkIC0gbG9hZGVkIGZyb20gQVBJICovXG4gIHdpbmRvdy5BUFBTID0gW107IC8vIFVzZSB3aW5kb3cuQVBQUyBhcyB0aGUgbWFpbiBhcnJheVxuICBsZXQgcmVmcmVzaEluRmxpZ2h0ID0gbnVsbDtcbiAgbGV0IHJlZnJlc2hRdWV1ZWQgPSBmYWxzZTtcblxuICAvLyBMb2FkIHNlcnZpY2VzIGZyb20gQVBJXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTZXJ2aWNlcygpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHdpbmRvdy5Ta2VsZXRvbkxvYWRlcikgd2luZG93LlNrZWxldG9uTG9hZGVyLnNob3coNik7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIC8vIFN0YW5kYXJkIGVudmVsb3BlOiB7IHN1Y2Nlc3M6IHRydWUsIHNlcnZpY2VzOiBbLi4uXSwgcGFnaW5hdGlvbj86IHsuLi59IH1cbiAgICAgICAgd2luZG93LkFQUFMgPSByZXN1bHQuc2VydmljZXMgfHwgW107XG4gICAgICAgIGlmICh3aW5kb3cuU2tlbGV0b25Mb2FkZXIpIHdpbmRvdy5Ta2VsZXRvbkxvYWRlci5oaWRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZXJ2aWNlczonLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICBpZiAod2luZG93LlNrZWxldG9uTG9hZGVyKSB3aW5kb3cuU2tlbGV0b25Mb2FkZXIuaGlkZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZXJ2aWNlczonLCBlcnJvcik7XG4gICAgICBpZiAod2luZG93LlNrZWxldG9uTG9hZGVyKSB3aW5kb3cuU2tlbGV0b25Mb2FkZXIuaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNlcnZpY2VVcmwoaWQpIHtcbiAgICBjb25zdCBzdmMgPSB3aW5kb3cuQVBQUz8uZmluZChhID0+IGEuaWQgPT09IGlkKTtcbiAgICBpZiAoc3ZjPy51cmwpIHJldHVybiBzdmMudXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IHN2Yy51cmwgOiAnaHR0cHM6Ly8nICsgc3ZjLnVybDtcbiAgICBpZiAoc3ZjPy5pc0V4dGVybmFsICYmIHN2Yy5leHRlcm5hbFVybCkgcmV0dXJuIHN2Yy5leHRlcm5hbFVybDtcbiAgICBjb25zdCBkbnMgPSBTSVRFLmRuc1NlcnZlcnM/LltpZF07XG4gICAgaWYgKGRucykgcmV0dXJuICdodHRwOi8vJyArIGRucy5pcCArICc6JyArIChkbnMucG9ydCB8fCA1MzgwKTtcbiAgICByZXR1cm4gYnVpbGRTZXJ2aWNlVXJsKGlkKTtcbiAgfVxuICBmdW5jdGlvbiBlbCh0YWcsIGNscywgdHh0KSB7IGNvbnN0IG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7IGlmIChjbHMpIG4uY2xhc3NOYW1lID0gY2xzOyBpZiAodHh0KSBuLnRleHRDb250ZW50ID0gdHh0OyByZXR1cm4gbjsgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkR3JpZCgpIHtcbiAgICBjb25zdCByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmRzJyk7IHJvb3QuaW5uZXJIVE1MID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aW5kb3cuQVBQUy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcyA9IHdpbmRvdy5BUFBTW2ldO1xuICAgICAgaWYgKHMuaWQgPT09ICdjYScpIGNvbnRpbnVlOyAvLyBEYXNoQ0EgbGl2ZXMgaW4gdG9wIGFuY2hvciByb3dcbiAgICAgIGNvbnN0IGNhcmQgPSBlbCgnZGl2JywgJ2NhcmQnKTtcbiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWFwcCcsIHMuaWQpO1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ29mZicpOyAvLyBJbml0aWFsIHN0YXR1c1xuICAgICAgaWYgKHMuY29udGFpbmVySWQpIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRhaW5lci1pZCcsIHMuY29udGFpbmVySWQpO1xuICAgICAgaWYgKHMuY2F0ZWdvcnkpIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWNhdGVnb3J5Jywgcy5jYXRlZ29yeSk7XG4gICAgICBpZiAocy5yZWNpcGVJZCkgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVjaXBlLWlkJywgcy5yZWNpcGVJZCk7XG5cbiAgICAgIGNvbnN0IGRvdCA9IGVsKCdzcGFuJywgJ2RvdCBiYWQgYXQtYmwnKTsgZG90LmlkID0gJ2RvdC0nICsgcy5pZCArICctZ3JpZCc7IGNhcmQuYXBwZW5kQ2hpbGQoZG90KTtcblxuICAgICAgY29uc3Qgcm93ID0gZWwoJ2RpdicsICdyb3cnKTtcbiAgICAgIGNvbnN0IHdyYXAgPSBlbCgnZGl2JywgJ2xvZ28td3JhcCcpO1xuXG4gICAgICAvLyBVc2UgcmVsaWFibGUgUE5HIGltYWdlcyB3aXRoIGF1dG9tYXRpYyBDRE4gZmFsbGJhY2tcbiAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgaW1nLnNyYyA9IHMubG9nbztcbiAgICAgIGltZy5hbHQgPSBzLm5hbWU7XG4gICAgICBpbWcuY2xhc3NOYW1lID0gJ2xvZ28taW1nJztcbiAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFRyeSBDRE4gZmFsbGJhY2sgd2l0aCBtdWx0aXBsZSBuYW1pbmcgc3RyYXRlZ2llc1xuICAgICAgICAvLyBVc2UgaWQsIGFwcFRlbXBsYXRlLCBvciBkZXJpdmUgZnJvbSBuYW1lXG4gICAgICAgIGxldCBhcHBJZCA9IHMuaWQgfHwgcy5hcHBUZW1wbGF0ZTtcbiAgICAgICAgaWYgKCFhcHBJZCAmJiBzLm5hbWUpIHtcbiAgICAgICAgICAvLyBEZXJpdmUgSUQgZnJvbSBuYW1lIChsb3dlcmNhc2UsIHJlbW92ZSBzcGFjZXMpXG4gICAgICAgICAgYXBwSWQgPSBzLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXBwSWQpIHtcbiAgICAgICAgICAvLyBUcnkgZGlmZmVyZW50IENETiBVUkwgZm9ybWF0c1xuICAgICAgICAgIGNvbnN0IGNkblVybHMgPSBbXG4gICAgICAgICAgICBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3dhbGt4Y29kZS9kYXNoYm9hcmQtaWNvbnMvcG5nLyR7YXBwSWR9LnBuZ2AsXG4gICAgICAgICAgICBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3dhbGt4Y29kZS9kYXNoYm9hcmQtaWNvbnMvcG5nLyR7YXBwSWQudG9Mb3dlckNhc2UoKX0ucG5nYCxcbiAgICAgICAgICAgIGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvd2Fsa3hjb2RlL2Rhc2hib2FyZC1pY29ucy9wbmcvJHthcHBJZC5yZXBsYWNlKC8tL2csICcnKX0ucG5nYCxcbiAgICAgICAgICAgIGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvd2Fsa3hjb2RlL2Rhc2hib2FyZC1pY29ucy9wbmcvJHtzLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJyl9LnBuZ2BcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZXNcbiAgICAgICAgICBjb25zdCB1bmlxdWVVcmxzID0gWy4uLm5ldyBTZXQoY2RuVXJscyldO1xuXG4gICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCBVUkwgdG8gdHJ5XG4gICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdW5pcXVlVXJscy5pbmRleE9mKHRoaXMuc3JjKTtcbiAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuXG4gICAgICAgICAgaWYgKG5leHRJbmRleCA8IHVuaXF1ZVVybHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNyYyA9IHVuaXF1ZVVybHNbbmV4dEluZGV4XTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoaW1nKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZCh3cmFwKTtcblxuICAgICAgY29uc3QgbmFtZVNwYW4gPSBlbCgnc3BhbicsICduYW1lJywgcy5uYW1lKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChuYW1lU3Bhbik7XG5cbiAgICAgIC8vIEFkZCBUYWlsc2NhbGUgYmFkZ2UgaWYgc2VydmljZSBpcyBwcm90ZWN0ZWRcbiAgICAgIGlmIChzLnRhaWxzY2FsZU9ubHkpIHtcbiAgICAgICAgY29uc3QgdHNCYWRnZSA9IGVsKCdzcGFuJywgJ3RzLWJhZGdlJywgJ1x1RDgzRFx1REQxMCcpO1xuICAgICAgICB0c0JhZGdlLnRpdGxlID0gJ1RhaWxzY2FsZS1vbmx5IGFjY2Vzcyc7XG4gICAgICAgIHRzQmFkZ2Uuc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tbGVmdDogNnB4OyBmb250LXNpemU6IDAuNzVyZW07IG9wYWNpdHk6IDAuODsnO1xuICAgICAgICBuYW1lU3Bhbi5hcHBlbmRDaGlsZCh0c0JhZGdlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIENhdGVnb3J5IGJhZGdlIGlmIHNlcnZpY2UgaGFzIG9uZSAoY29sb3JlZCBwaWxsIHdpdGggaWNvbilcbiAgICAgIGlmIChzLmNhdGVnb3J5KSB7XG4gICAgICAgIGNvbnN0IGNhdHMgPSAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5DQVRFR09SSUVTKSB8fCB3aW5kb3cuRENfQ0FURUdPUklFUyB8fCB7fTtcbiAgICAgICAgY29uc3QgY2F0SW5mbyA9IGNhdHNbcy5jYXRlZ29yeV0gfHwge307XG4gICAgICAgIGNvbnN0IGNhdEJhZGdlID0gZWwoJ3NwYW4nLCAnY2F0LWJhZGdlJywgYCR7Y2F0SW5mby5pY29uIHx8ICcnfSAke3MuY2F0ZWdvcnl9YC50cmltKCkpO1xuICAgICAgICBjYXRCYWRnZS50aXRsZSA9IGBDYXRlZ29yeTogJHtzLmNhdGVnb3J5fWA7XG4gICAgICAgIGNhdEJhZGdlLnN0eWxlLmNzc1RleHQgPSBgbWFyZ2luLWxlZnQ6IDZweDsgZm9udC1zaXplOiAwLjY1cmVtOyBwYWRkaW5nOiAxcHggNnB4OyBib3JkZXItcmFkaXVzOiA5OTlweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7Y2F0SW5mby5jb2xvciB8fCAnIzdmOGM4ZCd9IDI1JSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogJHtjYXRJbmZvLmNvbG9yIHx8ICcjN2Y4YzhkJ307IGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAke2NhdEluZm8uY29sb3IgfHwgJyM3ZjhjOGQnfSA1MCUsIHRyYW5zcGFyZW50KTsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgZm9udC13ZWlnaHQ6IDUwMDtgO1xuICAgICAgICBuYW1lU3Bhbi5hcHBlbmRDaGlsZChjYXRCYWRnZSk7XG4gICAgICB9XG5cbiAgICAgIHJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsICdzcGFjZXInKSk7XG5cbiAgICAgIGNvbnN0IHBpbGwgPSBlbCgnc3BhbicsICdiYWRnZSBvZmYnLCAnT0ZGJyk7XG4gICAgICBwaWxsLmlkID0gJ2JhZGdlLScgKyBzLmlkO1xuICAgICAgcGlsbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaTE4bi1saXZlLXN0YXR1cycsICdiaW5hcnknKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChwaWxsKTtcblxuICAgICAgLy8gVXBkYXRlIGF2YWlsYWJsZSBiYWRnZSAoaGlkZGVuIGJ5IGRlZmF1bHQsIHNob3duIHdoZW4gdXBkYXRlIGRldGVjdGVkKVxuICAgICAgY29uc3QgdXBkYXRlQmFkZ2UgPSBlbCgnc3BhbicsICd1cGRhdGUtYXZhaWxhYmxlLWJhZGdlJywgJ1VQREFURScpO1xuICAgICAgdXBkYXRlQmFkZ2UuaWQgPSAndXBkYXRlLWJhZGdlLScgKyBzLmlkO1xuICAgICAgdXBkYXRlQmFkZ2UudGl0bGUgPSAnVXBkYXRlIGF2YWlsYWJsZSc7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQodXBkYXRlQmFkZ2UpO1xuXG4gICAgICBjYXJkLmFwcGVuZENoaWxkKHJvdyk7XG5cbiAgICAgIC8vIEFkZCByZXNwb25zZSB0aW1lIHJvd1xuICAgICAgY29uc3QgcmVzcG9uc2VSb3cgPSBlbCgnZGl2JywgJ3Jlc3BvbnNlLXJvdycpO1xuICAgICAgY29uc3QgdGltZVNwYW4gPSBlbCgnc3BhbicsICdyZXNwb25zZS10aW1lJywgJy0tJyk7IHRpbWVTcGFuLmlkID0gJ3RpbWUtJyArIHMuaWQ7XG4gICAgICByZXNwb25zZVJvdy5hcHBlbmRDaGlsZCh0aW1lU3Bhbik7XG4gICAgICBjYXJkLmFwcGVuZENoaWxkKHJlc3BvbnNlUm93KTtcblxuICAgICAgLy8gQWRkIGhlYWx0aC91cHRpbWUgcm93XG4gICAgICBjb25zdCBoZWFsdGhSb3cgPSBlbCgnZGl2JywgJ2hlYWx0aC1yb3cnKTtcbiAgICAgIGhlYWx0aFJvdy5pZCA9ICdoZWFsdGgtJyArIHMuaWQ7XG4gICAgICBjb25zdCB1cHRpbWVDaGlwID0gZWwoJ3NwYW4nLCAndXB0aW1lLWNoaXAnLCAnLS0nKTtcbiAgICAgIHVwdGltZUNoaXAuaWQgPSAndXB0aW1lLScgKyBzLmlkO1xuICAgICAgaGVhbHRoUm93LmFwcGVuZENoaWxkKHVwdGltZUNoaXApO1xuICAgICAgY29uc3QgdXB0aW1lTWluaUJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdXB0aW1lTWluaUJhci5jbGFzc05hbWUgPSAndXB0aW1lLW1pbmktYmFyJztcbiAgICAgIGNvbnN0IHVwdGltZUZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHVwdGltZUZpbGwuY2xhc3NOYW1lID0gJ2ZpbGwnO1xuICAgICAgdXB0aW1lRmlsbC5pZCA9ICd1cHRpbWUtYmFyLScgKyBzLmlkO1xuICAgICAgdXB0aW1lRmlsbC5zdHlsZS53aWR0aCA9ICcwJSc7XG4gICAgICB1cHRpbWVNaW5pQmFyLmFwcGVuZENoaWxkKHVwdGltZUZpbGwpO1xuICAgICAgaGVhbHRoUm93LmFwcGVuZENoaWxkKHVwdGltZU1pbmlCYXIpO1xuICAgICAgY2FyZC5hcHBlbmRDaGlsZChoZWFsdGhSb3cpO1xuXG4gICAgICBjb25zdCBidG5Sb3cgPSBlbCgnZGl2JywgJ2J0bi1yb3cnKTtcblxuICAgICAgLy8gQWRkIGxvZ3MgYnV0dG9uIGZvciBzZXJ2aWNlcyB3aXRoIGNvbnRhaW5lcklkc1xuICAgICAgaWYgKHMuY29udGFpbmVySWQpIHtcbiAgICAgICAgY29uc3QgbG9nc0J0biA9IGVsKCdidXR0b24nLCAnbG9ncy1idG4nLCAnXHVEODNEXHVEQ0NCJyk7XG4gICAgICAgIGxvZ3NCdG4udGl0bGUgPSAnVmlldyBjb250YWluZXIgbG9ncyc7XG4gICAgICAgIGxvZ3NCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB3aW5kb3cub3BlbkNvbnRhaW5lckxvZ3NNb2RhbChzLmNvbnRhaW5lcklkLCBzLm5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQobG9nc0J0bik7XG5cbiAgICAgICAgLy8gQWRkIHVwZGF0ZSBidXR0b24gZm9yIERvY2tlciBjb250YWluZXJzXG4gICAgICAgIGNvbnN0IHVwZGF0ZUJ0biA9IGVsKCdidXR0b24nLCAndXBkYXRlLWJ0bicsICdcdTJCMDZcdUZFMEYnKTtcbiAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBjb250YWluZXIgdG8gbGF0ZXN0IHZlcnNpb24nO1xuICAgICAgICB1cGRhdGVCdG4uaWQgPSBgdXBkYXRlLWJ0bi0ke3MuaWR9YDtcbiAgICAgICAgdXBkYXRlQnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgd2luZG93LnVwZGF0ZUNvbnRhaW5lcihzLmNvbnRhaW5lcklkLCBzLm5hbWUsIHMuaWQpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQodXBkYXRlQnRuKTtcblxuICAgICAgICAvLyBUZXJtaW5hbCBleGVjIGJ1dHRvbiAoc3VidGxlIFx1MjAxNCB2aXNpYmxlIG9uIGhvdmVyKVxuICAgICAgICBjb25zdCBleGVjQnRuID0gZWwoJ2J1dHRvbicsICdleGVjLWJ0bicsICc+XycpO1xuICAgICAgICBleGVjQnRuLnRpdGxlID0gJ09wZW4gdGVybWluYWwnO1xuICAgICAgICBleGVjQnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgaWYgKHdpbmRvdy5vcGVuRXhlY01vZGFsKSB3aW5kb3cub3BlbkV4ZWNNb2RhbChzLmNvbnRhaW5lcklkLCBzLm5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQoZXhlY0J0bik7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBsb2dzIGJ1dHRvbiBmb3Igc2VydmljZXMgd2l0aCBsb2dQYXRoIChuYXRpdmUgYXBwcylcbiAgICAgIGlmIChzLmxvZ1BhdGggJiYgIXMuY29udGFpbmVySWQpIHtcbiAgICAgICAgY29uc3QgbG9nc0J0biA9IGVsKCdidXR0b24nLCAnbG9ncy1idG4nLCAnXHVEODNEXHVEQ0NCJyk7XG4gICAgICAgIGxvZ3NCdG4udGl0bGUgPSAnVmlldyBhcHBsaWNhdGlvbiBsb2dzJztcbiAgICAgICAgbG9nc0J0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy5vcGVuRmlsZUxvZ3NNb2RhbChzLmxvZ1BhdGgsIHMubmFtZSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChsb2dzQnRuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGNyZWRlbnRpYWxzIGJ1dHRvbiBmb3Igc2VydmljZXMgdGhhdCBzdXBwb3J0IGF1dG8tbG9naW5cbiAgICAgIGlmIChzLmlzRXh0ZXJuYWwgfHwgcy5hcHBUZW1wbGF0ZSB8fCBzLnVybCkge1xuICAgICAgICBjb25zdCBjcmVkc0J0biA9IGVsKCdidXR0b24nLCAnY3JlZHMtYnRuJywgJ1x1RDgzRFx1REQxMScpO1xuICAgICAgICBjcmVkc0J0bi50aXRsZSA9ICdBdXRvLWxvZ2luIGNyZWRlbnRpYWxzJztcbiAgICAgICAgY3JlZHNCdG4uaWQgPSBgY3JlZHMtYnRuLSR7cy5pZH1gO1xuICAgICAgICBjcmVkc0J0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwocyk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChjcmVkc0J0bik7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBvcHRpb25zIGJ1dHRvbiBmb3IgYWxsIHNlcnZpY2VzIGV4Y2VwdCAnaW50ZXJuZXQnXG4gICAgICBpZiAocy5pZCAhPT0gJ2ludGVybmV0Jykge1xuICAgICAgICBjb25zdCBvcHRCdG4gPSBlbCgnYnV0dG9uJywgJ29wdGlvbnMtYnRuJywgJ1x1MjY5OVx1RkUwRicpO1xuICAgICAgICBvcHRCdG4udGl0bGUgPSAnRWRpdCBzZXJ2aWNlIHNldHRpbmdzJztcbiAgICAgICAgb3B0QnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgd2luZG93Lm9wZW5TZXJ2aWNlRWRpdE1vZGFsKHMpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQob3B0QnRuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHNoYXJlIGJ1dHRvbiBmb3IgYWxsIHNlcnZpY2VzIGV4Y2VwdCAnaW50ZXJuZXQnIChEQy0wNTgpLlxuICAgICAgLy8gQ2FsbHMgaW50byB0aGUgc2hhcmUtbW9kYWwgbW9kdWxlIHJlZ2lzdGVyZWQgb24gd2luZG93LiBXZSBkb24ndFxuICAgICAgLy8gaGFyZC1yZXF1aXJlIHRoZSBtb2R1bGUgXHUyMDE0IGlmIHNoYXJlLW1vZGFsLmpzIHdhcyBleGNsdWRlZCBmcm9tIHRoZVxuICAgICAgLy8gYnVuZGxlLCB0aGUgYnV0dG9uIHN0aWxsIHJlbmRlcnMgYnV0IGNsaWNraW5nIGl0IHN1cmZhY2VzIGEgY2xlYXJcbiAgICAgIC8vIGVycm9yIHRvYXN0IGluc3RlYWQgb2YgYSBzaWxlbnQgbm8tb3AuXG4gICAgICBpZiAocy5pZCAhPT0gJ2ludGVybmV0Jykge1xuICAgICAgICBjb25zdCBzaGFyZUJ0biA9IGVsKCdidXR0b24nLCAnc2hhcmUtYnRuJywgJ1x1RDgzRFx1REQxNycpO1xuICAgICAgICBzaGFyZUJ0bi50aXRsZSA9ICdTaGFyZSB0aGlzIHNlcnZpY2UgKFBybyknO1xuICAgICAgICBzaGFyZUJ0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm9wZW5TaGFyZU1vZGFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB3aW5kb3cub3BlblNoYXJlTW9kYWwocyk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93LnNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHdpbmRvdy5zaG93Tm90aWZpY2F0aW9uKCdTaGFyZSBtb2RhbCBub3QgbG9hZGVkLiBSZWZyZXNoIHRoZSBwYWdlLicsICdlcnJvcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYnRuUm93LmFwcGVuZENoaWxkKHNoYXJlQnRuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGRlbGV0ZSBidXR0b24gZm9yIGFsbCBzZXJ2aWNlcyBleGNlcHQgSW50ZXJuZXRcbiAgICAgIGlmIChzLmlkICE9PSAnaW50ZXJuZXQnKSB7XG4gICAgICAgIGNvbnN0IGRlbEJ0biA9IGVsKCdidXR0b24nLCAnZGVsZXRlLWJ0bicsICdcdUQ4M0RcdURERDFcdUZFMEYnKTtcbiAgICAgICAgZGVsQnRuLnRpdGxlID0gJ0RlbGV0ZSB0aGlzIHNlcnZpY2UnO1xuICAgICAgICBkZWxCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB3aW5kb3cuZGVsZXRlU2VydmljZShzLmlkLCBzLm5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQoZGVsQnRuKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnRuID0gZWwoJ2J1dHRvbicsIG51bGwsICdPcGVuJyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWkxOG4nLCAnYWN0aW9uLm9wZW4nKTtcbiAgICAgIGJ0bi5vbmNsaWNrID0gKCkgPT4gd2luZG93Lm9wZW4oc2VydmljZVVybChzLmlkKSwgJ19ibGFuaycsICdub29wZW5lcicpO1xuICAgICAgYnRuUm93LmFwcGVuZENoaWxkKGJ0bik7XG4gICAgICBjYXJkLmFwcGVuZENoaWxkKGJ0blJvdyk7XG4gICAgICBjYXJkLnN0eWxlLnRyYW5zaXRpb25EZWxheSA9IGAke01hdGgubWluKGkgKiA0NSwgMjcwKX1tc2A7XG5cbiAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoY2FyZCk7XG4gICAgfVxuXG4gICAgLy8gQ2FyZHMgY2FuIGJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIGluaXRpYWwgbGFuZ3VhZ2UgcGFzcy4gVHJhbnNsYXRlIHRoZWlyXG4gICAgLy8gaW5pdGlhbCBsaXZlIHN0YXRlIGFuZCBjb250cm9scyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHBvbGwuXG4gICAgaWYgKHdpbmRvdy5EQ0kxOG4gJiYgd2luZG93LkRDSTE4bi5pc0xvYWRlZCgpKSB7XG4gICAgICB3aW5kb3cuRENJMThuLmFwcGx5VHJhbnNsYXRpb25zKCk7XG4gICAgfVxuXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLmNhcmQnKS5mb3JFYWNoKGNhcmQgPT4gY2FyZC5jbGFzc0xpc3QuYWRkKCdsb2FkZWQnKSk7XG4gICAgfSk7XG5cbiAgICAvLyBHcm91cCByZWNpcGUgY2FyZHMgdmlzdWFsbHkgYWZ0ZXIgZ3JpZCBpcyBidWlsdFxuICAgIGlmICh3aW5kb3cuZ3JvdXBSZWNpcGVDYXJkcykgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHdpbmRvdy5ncm91cFJlY2lwZUNhcmRzKCkpO1xuXG4gICAgLy8gUmVmcmVzaCB0aGUgc2VydmljZSBmaWx0ZXIgc28gdGhlIGNhdGVnb3J5IGRyb3Bkb3duIHJlZmxlY3RzIG5ldyBzZXJ2aWNlc1xuICAgIGlmICh3aW5kb3cucmVmcmVzaFNlcnZpY2VGaWx0ZXIpIHdpbmRvdy5yZWZyZXNoU2VydmljZUZpbHRlcigpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0QmFkZ2UoaWQsIHVwLCByZXNwb25zZVRpbWUgPSBudWxsKSB7XG4gICAgY29uc3QgZG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvdC0nICsgaWQgKyAnLWdyaWQnKTtcbiAgICBjb25zdCBwaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhZGdlLScgKyBpZCk7XG4gICAgY29uc3QgdGltZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpbWUtJyArIGlkKTtcbiAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwPVwiJHtpZH1cIl1gKTtcblxuICAgIGlmIChkb3QpIHtcbiAgICAgIGRvdC5jbGFzc0xpc3QudG9nZ2xlKCdvaycsIHVwKTtcbiAgICAgIGRvdC5jbGFzc0xpc3QudG9nZ2xlKCdiYWQnLCAhdXApO1xuICAgIH1cblxuICAgIGlmIChwaWxsKSB7XG4gICAgICBwaWxsLnRleHRDb250ZW50ID0gc3RhdHVzTGFiZWwodXApO1xuICAgICAgcGlsbC5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIHVwKTtcbiAgICAgIHBpbGwuY2xhc3NMaXN0LnRvZ2dsZSgnb2ZmJywgIXVwKTtcbiAgICB9XG5cbiAgICBpZiAodGltZUVsICYmIHJlc3BvbnNlVGltZSAhPT0gbnVsbCkge1xuICAgICAgdGltZUVsLnRleHRDb250ZW50ID0gdXAgPyBgJHtyZXNwb25zZVRpbWV9bXNgIDogJ3RpbWVvdXQnO1xuICAgICAgdGltZUVsLmNsYXNzTmFtZSA9IGByZXNwb25zZS10aW1lICR7Z2V0UmVzcG9uc2VUaW1lQ2xhc3MocmVzcG9uc2VUaW1lLCB1cCl9YDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY2FyZCBzdGF0dXMgZm9yIGljb24gY29sb3JpbmdcbiAgICBpZiAoY2FyZCkge1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgdXAgPyAnb24nIDogJ29mZicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hBbGwoKSB7XG4gICAgaWYgKHJlZnJlc2hJbkZsaWdodCkge1xuICAgICAgcmVmcmVzaFF1ZXVlZCA9IHRydWU7XG4gICAgICByZXR1cm4gcmVmcmVzaEluRmxpZ2h0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVN0YW1wKGxhYmVsLCBjaGVja2VkQXQgPSBuZXcgRGF0ZSgpKSB7XG4gICAgICBjb25zdCBzdGFtcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGFtcCcpO1xuICAgICAgaWYgKHN0YW1wKSBzdGFtcC50ZXh0Q29udGVudCA9IGAke2xhYmVsfTogJHtuZXcgRGF0ZShjaGVja2VkQXQpLnRvTG9jYWxlVGltZVN0cmluZygpfWA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXBwbHlCYXRjaFJlc3VsdHMoc3RhdHVzZXMpIHtcbiAgICAgIGNvbnN0IGRuc0lkcyA9IE9iamVjdC5rZXlzKFNJVEUuZG5zU2VydmVycyk7XG4gICAgICBkbnNJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3RhdHVzZXNbaWRdO1xuICAgICAgICBpZiAocmVzdWx0KSBzZXRRdWljayhpZCwgcmVzdWx0LmlzVXAsIHJlc3VsdC5yZXNwb25zZVRpbWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChzdGF0dXNlcy5pbnRlcm5ldCkge1xuICAgICAgICBzZXRRdWljaygnaW50ZXJuZXQnLCBzdGF0dXNlcy5pbnRlcm5ldC5pc1VwLCBzdGF0dXNlcy5pbnRlcm5ldC5yZXNwb25zZVRpbWUpO1xuICAgICAgfVxuXG4gICAgICB3aW5kb3cuQVBQUy5mb3JFYWNoKChzZXJ2aWNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHN0YXR1c2VzW3NlcnZpY2UuaWRdO1xuICAgICAgICBpZiAocmVzdWx0KSBzZXRCYWRnZShzZXJ2aWNlLmlkLCByZXN1bHQuaXNVcCwgcmVzdWx0LnJlc3BvbnNlVGltZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiByZWZyZXNoRmFsbGJhY2soKSB7XG4gICAgICBjb25zdCBkbnNJZHMgPSBPYmplY3Qua2V5cyhTSVRFLmRuc1NlcnZlcnMpO1xuICAgICAgY29uc3QgdG9wQ2hlY2tzID0gZG5zSWRzLm1hcChpZCA9PiBjaGVja1NlcnZpY2VXaXRoVGltaW5nKGlkKSk7XG4gICAgICB0b3BDaGVja3MucHVzaChjaGVja1NlcnZpY2VXaXRoVGltaW5nKCdpbnRlcm5ldCcpKTtcbiAgICAgIGNvbnN0IHRvcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCh0b3BDaGVja3MpO1xuXG4gICAgICBkbnNJZHMuZm9yRWFjaCgoaWQsIGkpID0+IHNldFF1aWNrKGlkLCB0b3BSZXN1bHRzW2ldLmlzVXAsIHRvcFJlc3VsdHNbaV0ucmVzcG9uc2VUaW1lKSk7XG4gICAgICBjb25zdCBpbnRlcm5ldFJlc3VsdCA9IHRvcFJlc3VsdHNbdG9wUmVzdWx0cy5sZW5ndGggLSAxXTtcbiAgICAgIHNldFF1aWNrKCdpbnRlcm5ldCcsIGludGVybmV0UmVzdWx0LmlzVXAsIGludGVybmV0UmVzdWx0LnJlc3BvbnNlVGltZSk7XG5cbiAgICAgIGNvbnN0IGFwcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgd2luZG93LkFQUFMubWFwKGFzeW5jIHMgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrU2VydmljZVdpdGhUaW1pbmcocy5pZCk7XG4gICAgICAgICAgcmV0dXJuIHsgaWQ6IHMuaWQsIC4uLnJlc3VsdCB9O1xuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgYXBwUmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgIHNldEJhZGdlKHJlc3VsdC5pZCwgcmVzdWx0LmlzVXAsIHJlc3VsdC5yZXNwb25zZVRpbWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaEluRmxpZ2h0ID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VydmljZXMvc3RhdHVzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdHVzIHJlZnJlc2ggZmFpbGVkICgke3Jlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgYXBwbHlCYXRjaFJlc3VsdHMoZGF0YS5zdGF0dXNlcyB8fCB7fSk7XG4gICAgICAgIHVwZGF0ZVN0YW1wKCdsYXN0IGNoZWNrJywgZGF0YS5jaGVja2VkQXQgfHwgbmV3IERhdGUoKSk7XG4gICAgICB9IGNhdGNoIChiYXRjaEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQmF0Y2hlZCBzdGF0dXMgcmVmcmVzaCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBkaXJlY3QgcHJvYmVzOicsIGJhdGNoRXJyb3IpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJlZnJlc2hGYWxsYmFjaygpO1xuICAgICAgICAgIHVwZGF0ZVN0YW1wKCdsYXN0IGNoZWNrJyk7XG4gICAgICAgIH0gY2F0Y2ggKGZhbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdEYXNoYm9hcmQgcmVmcmVzaCBmYWlsZWQ6JywgZmFsbGJhY2tFcnJvcik7XG4gICAgICAgICAgdXBkYXRlU3RhbXAoJ2xhc3QgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlZnJlc2hJbkZsaWdodCA9IG51bGw7XG4gICAgICAgIGlmIChyZWZyZXNoUXVldWVkKSB7XG4gICAgICAgICAgcmVmcmVzaFF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB3aW5kb3cucmVmcmVzaEFsbCgpOyB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICByZXR1cm4gcmVmcmVzaEluRmxpZ2h0O1xuICB9XG5cbiAgLy8gRE5TIG9wZW4gYnV0dG9ucyBcdTIwMTQgdXNlIGV2ZW50IGRlbGVnYXRpb24gb24gLnRvcCBjb250YWluZXJcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgY29uc3Qgb3BlbkJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJ1tpZCQ9XCItb3BlblwiXScpO1xuICAgIGlmICghb3BlbkJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IGlkID0gb3BlbkJ0bi5pZC5yZXBsYWNlKCctb3BlbicsICcnKTtcbiAgICBpZiAoU0lURS5kbnNTZXJ2ZXJzW2lkXSkgd2luZG93Lm9wZW4oc2VydmljZVVybChpZCksICdfYmxhbmsnLCAnbm9vcGVuZXInKTtcbiAgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYS1vcGVuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gd2luZG93Lm9wZW4oc2VydmljZVVybCgnY2EnKSwgJ19ibGFuaycsICdub29wZW5lcicpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NyZWRzLWJ0bi1jYScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGNvbnN0IHMgPSB3aW5kb3cuQVBQUy5maW5kKGEgPT4gYS5pZCA9PT0gJ2NhJyk7IGlmIChzICYmIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwpIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwocyk7IH0pO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B0aW9ucy1idG4tY2EnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBlLnN0b3BQcm9wYWdhdGlvbigpOyBjb25zdCBzID0gd2luZG93LkFQUFMuZmluZChhID0+IGEuaWQgPT09ICdjYScpOyBpZiAocyAmJiB3aW5kb3cub3BlblNlcnZpY2VFZGl0TW9kYWwpIHdpbmRvdy5vcGVuU2VydmljZUVkaXRNb2RhbChzKTsgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtYnRuLWNhJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgaWYgKHdpbmRvdy5kZWxldGVTZXJ2aWNlKSB3aW5kb3cuZGVsZXRlU2VydmljZSgnY2EnLCAnRGFzaENBJyk7IH0pO1xuXG4gIC8vIFdpbmRvdyBleHBvcnRzXG4gIHdpbmRvdy5sb2FkU2VydmljZXMgPSBsb2FkU2VydmljZXM7XG4gIHdpbmRvdy5idWlsZEdyaWQgPSBidWlsZEdyaWQ7XG4gIHdpbmRvdy5yZWZyZXNoQWxsID0gcmVmcmVzaEFsbDtcbiAgd2luZG93LnNldFF1aWNrID0gc2V0UXVpY2s7XG4gIHdpbmRvdy5zZXRCYWRnZSA9IHNldEJhZGdlO1xuICB3aW5kb3cuZ2V0UmVzcG9uc2VUaW1lQ2xhc3MgPSBnZXRSZXNwb25zZVRpbWVDbGFzcztcbiAgd2luZG93LmNoZWNrU2VydmljZVdpdGhUaW1pbmcgPSBjaGVja1NlcnZpY2VXaXRoVGltaW5nO1xuICB3aW5kb3cuc2VydmljZVVybCA9IHNlcnZpY2VVcmw7XG4gIHdpbmRvdy5lbCA9IGVsO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBETlMgTUFOQUdFTUVOVCA9PT09PT09PT09XG4oZnVuY3Rpb24gKCkge1xuICAvLyBSZXN0YXJ0IEROUyBzZXJ2aWNlIHZpYSBiYWNrZW5kIHByb3h5IChiYWNrZW5kIGhhbmRsZXMgYXV0aCBhdXRvbWF0aWNhbGx5KVxuICBhc3luYyBmdW5jdGlvbiByZXN0YXJ0RG5zU2VydmljZShkbnNJZCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvZG5zL3Jlc3RhcnQvJHtkbnNJZH1gLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdSZXN0YXJ0IGZhaWxlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gRXZlbnQgZGVsZWdhdGlvbiBmb3IgRE5TIHJlc3RhcnQgYnV0dG9ucyAoZHluYW1pYyBjYXJkcylcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChlKSA9PiB7XG4gICAgY29uc3QgcmVzdGFydEJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJ1tpZCQ9XCItcmVzdGFydFwiXScpO1xuICAgIGlmICghcmVzdGFydEJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IGRuc0lkID0gcmVzdGFydEJ0bi5pZC5yZXBsYWNlKCctcmVzdGFydCcsICcnKTtcbiAgICBpZiAoIVNJVEUuZG5zU2VydmVyc1tkbnNJZF0pIHJldHVybjtcbiAgICBpZiAoIWNvbmZpcm0oYFJlc3RhcnQgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfSBzZXJ2aWNlP2ApKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhCdXR0b24ocmVzdGFydEJ0biwgJy4uLicsICgpID0+IHJlc3RhcnREbnNTZXJ2aWNlKGRuc0lkKSk7XG4gICAgICBzZXRUaW1lb3V0KHdpbmRvdy5yZWZyZXNoQWxsLCBEQy5ERUxBWVMuUkVMT0FEKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZXN0YXJ0IGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBETlMgVXBkYXRlIGJ1dHRvbnNcbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRG5zU2VydmVyKGRuc0lkLCBzZXJ2ZXJJcCkge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS11cGRhdGVgKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidG4/LnRleHRDb250ZW50IHx8ICdcdTJCMDZcdUZFMEYnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpcnN0IGNoZWNrIGZvciB1cGRhdGVzXG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDBEJztcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBidG4udGl0bGUgPSAnQ2hlY2tpbmcgZm9yIHVwZGF0ZXMuLi4nO1xuXG4gICAgICBjb25zdCBjaGVja1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvZG5zL2NoZWNrLXVwZGF0ZT9zZXJ2ZXI9JHtlbmNvZGVVUklDb21wb25lbnQoc2VydmVySXApfWApO1xuICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCBjaGVja1Jlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKCFjaGVja1Jlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjaGVja1Jlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGNoZWNrIGZvciB1cGRhdGVzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hlY2tSZXN1bHQudXBkYXRlQXZhaWxhYmxlKSB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUnO1xuICAgICAgICBidG4udGl0bGUgPSBgQWxyZWFkeSBvbiBsYXRlc3QgdmVyc2lvbiAoJHtjaGVja1Jlc3VsdC5jdXJyZW50VmVyc2lvbn0pYDtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUhIEN1cnJlbnQgdmVyc2lvbjogJHtjaGVja1Jlc3VsdC5jdXJyZW50VmVyc2lvbn1gLCAnaW5mbycpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgYnRuLnRpdGxlID0gJ1VwZGF0ZSBETlMgc2VydmVyJztcbiAgICAgICAgfSwgMzAwMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGF2YWlsYWJsZSAtIGNvbmZpcm0gd2l0aCB1c2VyXG4gICAgICBjb25zdCBjb25maXJtVXBkYXRlID0gY29uZmlybShcbiAgICAgICAgYFVwZGF0ZSBhdmFpbGFibGUgZm9yICR7ZG5zSWQudG9VcHBlckNhc2UoKX0hXFxuXFxuYCArXG4gICAgICAgIGBDdXJyZW50OiAke2NoZWNrUmVzdWx0LmN1cnJlbnRWZXJzaW9ufVxcbmAgK1xuICAgICAgICBgTmV3OiAke2NoZWNrUmVzdWx0LnVwZGF0ZVZlcnNpb259XFxuXFxuYCArXG4gICAgICAgIChjaGVja1Jlc3VsdC51cGRhdGVUaXRsZSA/IGAke2NoZWNrUmVzdWx0LnVwZGF0ZVRpdGxlfVxcblxcbmAgOiAnJykgK1xuICAgICAgICBgVGhlIEROUyBzZXJ2ZXIgd2lsbCByZXN0YXJ0IGR1cmluZyB0aGUgdXBkYXRlLlxcblByb2NlZWQ/YFxuICAgICAgKTtcblxuICAgICAgaWYgKCFjb25maXJtVXBkYXRlKSB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgRE5TIHNlcnZlcic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUGVyZm9ybSB0aGUgdXBkYXRlXG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDA0JztcbiAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGluZy4uLic7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZVJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvZG5zL3VwZGF0ZT9zZXJ2ZXI9JHtlbmNvZGVVUklDb21wb25lbnQoc2VydmVySXApfWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgdXBkYXRlUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAoIXVwZGF0ZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih1cGRhdGVSZXN1bHQuZXJyb3IgfHwgJ1VwZGF0ZSBmYWlsZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwZGF0ZVJlc3VsdC5tYW51YWxVcGRhdGVSZXF1aXJlZCkge1xuICAgICAgICAvLyBUZWNobml0aXVtIHYxNCsgZG9lc24ndCBzdXBwb3J0IGF1dG8taW5zdGFsbCB2aWEgQVBJXG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTJCMDZcdUZFMEYnO1xuICAgICAgICBidG4udGl0bGUgPSBgVXBkYXRlIGF2YWlsYWJsZTogJHt1cGRhdGVSZXN1bHQubmV3VmVyc2lvbn1gO1xuICAgICAgICBjb25zdCBkb3dubG9hZEluZm8gPSB1cGRhdGVSZXN1bHQuZG93bmxvYWRMaW5rXG4gICAgICAgICAgPyBgXFxuRG93bmxvYWQ6ICR7dXBkYXRlUmVzdWx0LmRvd25sb2FkTGlua31gXG4gICAgICAgICAgOiAnJztcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zSW5mbyA9IHVwZGF0ZVJlc3VsdC5pbnN0cnVjdGlvbnNMaW5rXG4gICAgICAgICAgPyBgXFxuSW5zdHJ1Y3Rpb25zOiAke3VwZGF0ZVJlc3VsdC5pbnN0cnVjdGlvbnNMaW5rfWBcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IHVwZGF0ZSByZXF1aXJlcyBtYW51YWwgaW5zdGFsbGF0aW9uLiBDdXJyZW50OiAke3VwZGF0ZVJlc3VsdC5wcmV2aW91c1ZlcnNpb259IFx1MjE5MiAke3VwZGF0ZVJlc3VsdC5uZXdWZXJzaW9ufS4gUGxlYXNlIHVwZGF0ZSBtYW51YWxseSBvbiB0aGUgaG9zdCBtYWNoaW5lLmAsICd3YXJuaW5nJywgODAwMCk7XG4gICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUnO1xuICAgICAgYnRuLnRpdGxlID0gJ1VwZGF0ZWQgc3VjY2Vzc2Z1bGx5ISc7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ISAke3VwZGF0ZVJlc3VsdC5wcmV2aW91c1ZlcnNpb259IFx1MjE5MiAke3VwZGF0ZVJlc3VsdC5uZXdWZXJzaW9ufS4gU2VydmVyIGlzIHJlc3RhcnRpbmcuLi5gLCAnc3VjY2VzcycpO1xuXG4gICAgICAvLyBSZWZyZXNoIGFmdGVyIGRlbGF5IGZvciBzZXJ2ZXIgcmVzdGFydFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgRE5TIHNlcnZlcic7XG4gICAgICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG4gICAgICB9LCAxMDAwMCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRE5TIHVwZGF0ZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzRDJztcbiAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgZmFpbGVkJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEZhaWxlZCB0byB1cGRhdGUgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgRE5TIHNlcnZlcic7XG4gICAgICB9LCAzMDAwKTtcbiAgICB9XG4gIH1cblxuICAvLyBFdmVudCBkZWxlZ2F0aW9uIGZvciBETlMgdXBkYXRlIGJ1dHRvbnMgKGR5bmFtaWMgY2FyZHMpXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJ1tpZCQ9XCItdXBkYXRlXCJdJyk7XG4gICAgaWYgKCF1cGRhdGVCdG4pIHJldHVybjtcbiAgICBjb25zdCBkbnNJZCA9IHVwZGF0ZUJ0bi5pZC5yZXBsYWNlKCctdXBkYXRlJywgJycpO1xuICAgIGlmICghU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXSkgcmV0dXJuO1xuICAgIHVwZGF0ZURuc1NlcnZlcihkbnNJZCwgU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXT8uaXApO1xuICB9KTtcblxuICAvLyA9PT09PSBETlMgU0VUVElOR1MgTU9EQUwgPT09PT1cblxuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnZG5zLXNldHRpbmdzLW1vZGFsJywgYFxuICA8ZGl2IGlkPVwiZG5zLXNldHRpbmdzLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0MjBweDsgbWF4LXdpZHRoOiA1MjBweDtcIj5cbiAgICAgIDxoMyBpZD1cImRucy1zZXR0aW5ncy10aXRsZVwiPkROUyBTZXR0aW5nczwvaDM+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImRucy1lZGl0LWlwXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlNlcnZlciBJUDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkbnMtZWRpdC1pcFwiIGNsYXNzPVwiZm9ybS1pbnB1dC1tZFwiIHBsYWNlaG9sZGVyPVwiMTkyLjE2OC4xLjFcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZG5zLWVkaXQtcG9ydFwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5Qb3J0PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZG5zLWVkaXQtcG9ydFwiIGNsYXNzPVwiZm9ybS1pbnB1dC1tZFwiIHBsYWNlaG9sZGVyPVwiNTM4MFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJkbnMtZWRpdC1uYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPkRpc3BsYXkgTmFtZSAob3B0aW9uYWwpPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRucy1lZGl0LW5hbWVcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiBwbGFjZWhvbGRlcj1cImUuZy4gUHJpbWFyeSBETlNcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGludC1zbVwiPk1hbmFnZSBjcmVkZW50aWFscyB2aWEgVG9rZW5zIGluIHRoZSB0b29sYmFyPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRucy1zZXR0aW5ncy1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRucy1zZXR0aW5ncy1kZWxldGVcIiBzdHlsZT1cImJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZTc0YzNjIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6ICNlNzRjM2M7IGNvbG9yOiAjZTc0YzNjO1wiPlJlbW92ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZG5zLXNldHRpbmdzLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5TYXZlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgbGV0IGN1cnJlbnREbnNJZCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gb3BlbkRuc1NldHRpbmdzKGRuc0lkKSB7XG4gICAgY3VycmVudERuc0lkID0gZG5zSWQ7XG4gICAgY29uc3Qgc2VydmVyID0gU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXSB8fCB7fTtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtbW9kYWwnKTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtdGl0bGUnKS50ZXh0Q29udGVudCA9IGAkeyhzZXJ2ZXIubmFtZSB8fCBkbnNJZCkudG9VcHBlckNhc2UoKX0gU2V0dGluZ3NgO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1pcCcpLnZhbHVlID0gc2VydmVyLmlwIHx8ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1wb3J0JykudmFsdWUgPSBzZXJ2ZXIucG9ydCB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWVkaXQtbmFtZScpLnZhbHVlID0gc2VydmVyLm5hbWUgfHwgJyc7XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzYXZlRG5zU2V0dGluZ3MoKSB7XG4gICAgaWYgKCFjdXJyZW50RG5zSWQpIHJldHVybjtcbiAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1pcCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBwb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1lZGl0LXBvcnQnKS52YWx1ZS50cmltKCkgfHwgREMuREVGQVVMVFMuRE5TX1BPUlQ7XG4gICAgY29uc3QgbmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1uYW1lJykudmFsdWUudHJpbSgpO1xuXG4gICAgaWYgKCFpcCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignU2VydmVyIElQIGlzIHJlcXVpcmVkJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGUgPSB7IGRuc1NlcnZlcnM6IHt9IH07XG4gICAgdXBkYXRlLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXSA9IHsgaXAsIHBvcnQ6IFN0cmluZyhwb3J0KSB9O1xuICAgIGlmIChuYW1lKSB1cGRhdGUuZG5zU2VydmVyc1tjdXJyZW50RG5zSWRdLm5hbWUgPSBuYW1lO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHVwZGF0ZSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIFNJVEUuZG5zU2VydmVyc1tjdXJyZW50RG5zSWRdID0gdXBkYXRlLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtjdXJyZW50RG5zSWQudG9VcHBlckNhc2UoKX0gc2V0dGluZ3Mgc2F2ZWRgLCAnc3VjY2VzcycpO1xuICAgICAgICBjbG9zZURuc1NldHRpbmdzKCk7XG4gICAgICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKHJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2V0dGluZ3MnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlbW92ZURuc1NlcnZlcigpIHtcbiAgICBpZiAoIWN1cnJlbnREbnNJZCkgcmV0dXJuO1xuICAgIGlmICghY29uZmlybShgUmVtb3ZlICR7Y3VycmVudERuc0lkLnRvVXBwZXJDYXNlKCl9IGZyb20gZGFzaGJvYXJkPyBUaGlzIHdvbid0IGFmZmVjdCB0aGUgYWN0dWFsIEROUyBzZXJ2ZXIuYCkpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSBieSBzZXR0aW5nIHRvIG51bGwgaW4gZG5zU2VydmVyc1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJyk7XG4gICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmIChjb25maWcuZG5zU2VydmVycykge1xuICAgICAgICBkZWxldGUgY29uZmlnLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhdmVSZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZG5zU2VydmVyczogY29uZmlnLmRuc1NlcnZlcnMgfHwge30gfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2F2ZVJlc3AuanNvbigpO1xuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGRlbGV0ZSBTSVRFLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXTtcbiAgICAgICAgLy8gUmVtb3ZlIGNhcmQgZnJvbSBET01cbiAgICAgICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC50b3AgW2RhdGEtYXBwPVwiJHtjdXJyZW50RG5zSWR9XCJdYCk7XG4gICAgICAgIGlmIChjYXJkKSBjYXJkLnJlbW92ZSgpO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2N1cnJlbnREbnNJZC50b1VwcGVyQ2FzZSgpfSByZW1vdmVkIGZyb20gZGFzaGJvYXJkYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgY2xvc2VEbnNTZXR0aW5ncygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihyZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byByZW1vdmUnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byByZW1vdmU6ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VEbnNTZXR0aW5ncygpIHtcbiAgICBjbG9zZU1vZGFsKCdkbnMtc2V0dGluZ3MtbW9kYWwnKTtcbiAgICBjdXJyZW50RG5zSWQgPSBudWxsO1xuICB9XG5cbiAgLy8gRXZlbnQgbGlzdGVuZXJzIGZvciBtb2RhbCBidXR0b25zXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VEbnNTZXR0aW5ncyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3Mtc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVEbnNTZXR0aW5ncyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtZGVsZXRlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVtb3ZlRG5zU2VydmVyKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1zZXR0aW5ncy1tb2RhbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0LmlkID09PSAnZG5zLXNldHRpbmdzLW1vZGFsJykgY2xvc2VEbnNTZXR0aW5ncygpO1xuICB9KTtcbiAgLy8gRXZlbnQgZGVsZWdhdGlvbiBmb3IgRE5TIHNldHRpbmdzIGJ1dHRvbnMgKGR5bmFtaWMgY2FyZHMpXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IHNldHRpbmdzQnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2lkJD1cIi1zZXR0aW5nc1wiXScpO1xuICAgIGlmICghc2V0dGluZ3NCdG4pIHJldHVybjtcbiAgICBjb25zdCBkbnNJZCA9IHNldHRpbmdzQnRuLmlkLnJlcGxhY2UoJy1zZXR0aW5ncycsICcnKTtcbiAgICBpZiAoIVNJVEUuZG5zU2VydmVyc1tkbnNJZF0pIHJldHVybjtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIG9wZW5EbnNTZXR0aW5ncyhkbnNJZCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgd2luZG93LnJlZnJlc2hBbGwpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gTE9HIFZJRVdFUlMgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyBJbmplY3QgbG9ncy1tb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdsb2dzLW1vZGFsJywgYFxuICA8ZGl2IGlkPVwibG9ncy1tb2RhbFwiIGNsYXNzPVwibG9ncy1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJsb2dzLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogODAwcHg7IG1heC13aWR0aDogMTAwMHB4O1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtaGVhZGVyXCI+XG4gICAgICAgIDxoMyBpZD1cImxvZ3MtdGl0bGVcIj5ETlMgTG9nczwvaDM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWNvbnRyb2xzXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImxvZy1saW5lc1wiPlNob3c6PC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwibG9nLWxpbmVzXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMjVcIiBzZWxlY3RlZD4yNTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwXCI+NTA8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMDBcIj4xMDA8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIyMDBcIj4yMDA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwibG9ncy1zdHJlYW1cIiBjbGFzcz1cInN0cmVhbS1idG5cIiB0aXRsZT1cIkVuYWJsZSByZWFsLXRpbWUgc3RyZWFtaW5nXCI+XHVEODNEXHVEQ0UxIExpdmU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwibG9ncy1wYXVzZVwiIGNsYXNzPVwicGF1c2UtYnRuXCI+XHUyM0Y4XHVGRTBGIFBhdXNlPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImxvZ3MtY2xvc2VcIiBjbGFzcz1cImNsb3NlLWJ0blwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtY29udGFpbmVyIHNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBpZD1cImxvZ3MtY29udGVudFwiIGNsYXNzPVwibG9ncy1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiPkxvYWRpbmcgbG9ncy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICAvLyA9PT09PSBTdGF0ZSA9PT09PVxuICBsZXQgY3VycmVudERuc1NlcnZpY2UgPSBudWxsO1xuICBsZXQgbG9nc0ludGVydmFsID0gbnVsbDtcbiAgbGV0IGxvZ3NQYXVzZWQgPSBmYWxzZTtcblxuICBsZXQgY3VycmVudENvbnRhaW5lcklkID0gbnVsbDtcbiAgbGV0IGN1cnJlbnRDb250YWluZXJOYW1lID0gbnVsbDtcbiAgbGV0IGNvbnRhaW5lckxvZ3NNb2RlID0gZmFsc2U7XG5cbiAgbGV0IGN1cnJlbnRMb2dQYXRoID0gbnVsbDtcbiAgbGV0IGN1cnJlbnRMb2dTZXJ2aWNlTmFtZSA9IG51bGw7XG4gIGxldCBmaWxlTG9nc01vZGUgPSBmYWxzZTtcblxuICBsZXQgbG9nRXZlbnRTb3VyY2UgPSBudWxsO1xuICBsZXQgaXNTdHJlYW1pbmcgPSBmYWxzZTtcblxuICAvLyA9PT09PSBETlMgTE9HUyA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoRG5zTG9ncyhkbnNJZCwgbGluZXMgPSAyNSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXJ2ZXJJUCA9IGdldERuc1NlcnZlckFkZHIoZG5zSWQpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9kbnMvbG9ncz9zZXJ2ZXI9JHtzZXJ2ZXJJUH0mbGltaXQ9JHtsaW5lc31gLCB7XG4gICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsICdDYWNoZS1Db250cm9sJzogJ25vLWNhY2hlJyB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5sb2dzKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbG9nczogcmVzdWx0LmxvZ3MsIGNvdW50OiByZXN1bHQuY291bnQsIHNlcnZlcjogcmVzdWx0LnNlcnZlciB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiByZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBsb2dzJyB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiAnRE5TIGF1dG8tYXV0aCBmYWlsZWQgLSBjaGVjayBjcmVkZW50aWFscyBpbiBzZXR0aW5ncycgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ROUyBsb2dzIGZldGNoIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4geyBlcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJjb2RlQ29sb3IocmNvZGUpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB7XG4gICAgICAnTm9FcnJvcic6ICd2YXIoLS1vay1mZyknLFxuICAgICAgJ05PRVJST1InOiAndmFyKC0tb2stZmcpJyxcbiAgICAgICdOeERvbWFpbic6ICd2YXIoLS1tdXRlZCknLFxuICAgICAgJ05YRE9NQUlOJzogJ3ZhcigtLW11dGVkKScsXG4gICAgICAnUmVmdXNlZCc6ICd2YXIoLS1iYWQtZmcpJyxcbiAgICAgICdSRUZVU0VEJzogJ3ZhcigtLWJhZC1mZyknLFxuICAgICAgJ1NlcnZlckZhaWx1cmUnOiAnI2YzOWMxMicsXG4gICAgICAnU0VSVkZBSUwnOiAnI2YzOWMxMidcbiAgICB9O1xuICAgIHJldHVybiBjb2xvcnNbcmNvZGVdIHx8ICd2YXIoLS1mZyknO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyRG5zTG9nRW50cnkobG9nKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMTQwcHggMTEwcHggMWZyIDcwcHggODBweDsgZ2FwOiA4cHg7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjhyZW07IGFsaWduLWl0ZW1zOiBjZW50ZXI7JztcblxuICAgIC8vIElmIHVucGFyc2VkIHJhdyBsb2dcbiAgICBpZiAobG9nLnBhcnNlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGRpdi5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID0gJzFmcic7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChsb2cucmF3KX08L3NwYW4+YDtcbiAgICAgIHJldHVybiBkaXY7XG4gICAgfVxuXG4gICAgY29uc3QgcmNvZGVDb2xvciA9IGdldFJjb2RlQ29sb3IobG9nLnJjb2RlKTtcbiAgICBjb25zdCBpc0Jsb2NrZWQgPSBsb2cucmNvZGUgPT09ICdSZWZ1c2VkJyB8fCBsb2cucmNvZGUgPT09ICdSRUZVU0VEJztcblxuICAgIGRpdi5pbm5lckhUTUwgPSBgXG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj4ke2VzY2FwZUh0bWwobG9nLnRpbWVzdGFtcCl9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC1zaXplOiAwLjc1cmVtO1wiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGxvZy5jbGllbnQpfVwiPiR7ZXNjYXBlSHRtbChsb2cuY2xpZW50KX08L3NwYW4+XG4gICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwOyAke2lzQmxvY2tlZCA/ICd0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsgb3BhY2l0eTogMC42OycgOiAnJ31cIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChsb2cuZG9tYWluKX1cIj4ke2VzY2FwZUh0bWwobG9nLmRvbWFpbil9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKGxvZy50eXBlKX08L3NwYW4+XG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAke3Jjb2RlQ29sb3J9OyBmb250LXdlaWdodDogNTAwOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKGxvZy5yY29kZSl9PC9zcGFuPlxuICAgIGA7XG5cbiAgICByZXR1cm4gZGl2O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTG9nc0Rpc3BsYXkoKSB7XG4gICAgLy8gSGFuZGxlIGZpbGUgbG9ncyBtb2RlXG4gICAgaWYgKGZpbGVMb2dzTW9kZSkge1xuICAgICAgYXdhaXQgdXBkYXRlRmlsZUxvZ3NEaXNwbGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNvbnRhaW5lciBsb2dzIG1vZGVcbiAgICBpZiAoY29udGFpbmVyTG9nc01vZGUpIHtcbiAgICAgIGF3YWl0IHVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEROUyBsb2dzIG1vZGVcbiAgICBpZiAobG9nc1BhdXNlZCB8fCAhY3VycmVudERuc1NlcnZpY2UpIHJldHVybjtcblxuICAgIGNvbnN0IGxpbmVzID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZy1saW5lcycpLnZhbHVlKTtcbiAgICBjb25zdCBsb2dzQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLWNvbnRlbnQnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaERuc0xvZ3MoY3VycmVudERuc1NlcnZpY2UsIGxpbmVzKTtcblxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjJyZW07IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2QTBcdUZFMEYgRXJyb3I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+JHtlc2NhcGVIdG1sKHJlc3VsdC5lcnJvcil9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgaGVhZGVyIHJvd1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxNDBweCAxMTBweCAxZnIgNzBweCA4MHB4OyBnYXA6IDhweDsgcGFkZGluZzogOHB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuNzVyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBvc2l0aW9uOiBzdGlja3k7IHRvcDogMDtcIj5cbiAgICAgICAgICA8c3Bhbj5UaW1lPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPkNsaWVudDwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj5Eb21haW48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+VHlwZTwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj5TdGF0dXM8L3NwYW4+XG4gICAgICAgIDwvZGl2PmA7XG5cbiAgICAgIGlmIChyZXN1bHQubG9ncyAmJiByZXN1bHQubG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5sb2dzLmZvckVhY2gobG9nID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dFbGVtZW50ID0gcmVuZGVyRG5zTG9nRW50cnkobG9nKTtcbiAgICAgICAgICBsb2dzQ29udGVudC5hcHBlbmRDaGlsZChsb2dFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgKz0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICBObyBETlMgcXVlcmllcyBsb2dnZWQgeWV0XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cbiAgICAgICAgICBGYWlsZWQgdG8gZmV0Y2ggbG9nczogJHtlc2NhcGVIdG1sKGVycm9yLm1lc3NhZ2UpfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5Mb2dzTW9kYWwoZG5zSWQpIHtcbiAgICBjdXJyZW50RG5zU2VydmljZSA9IGRuc0lkO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcbiAgICBjb250YWluZXJMb2dzTW9kZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1tb2RhbCcpO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtdGl0bGUnKTtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG4gICAgY29uc3Qgc3RyZWFtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3Mtc3RyZWFtJyk7XG5cbiAgICB0aXRsZS50ZXh0Q29udGVudCA9IGAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IEROUyBMb2dzYDtcbiAgICBwYXVzZUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjhcdUZFMEYgUGF1c2UnO1xuICAgIHBhdXNlQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3BhdXNlZCcpO1xuXG4gICAgLy8gSGlkZSBzdHJlYW0gYnV0dG9uIGZvciBETlMgbG9ncyAob25seSBhdmFpbGFibGUgZm9yIGNvbnRhaW5lciBsb2dzKVxuICAgIGlmIChzdHJlYW1CdG4pIHtcbiAgICAgIHN0cmVhbUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIEluaXRpYWwgbG9hZFxuICAgIHVwZGF0ZUxvZ3NEaXNwbGF5KCk7XG5cbiAgICAvLyBTdGFydCBhdXRvLXJlZnJlc2ggZXZlcnkgMyBzZWNvbmRzXG4gICAgbG9nc0ludGVydmFsID0gc2V0SW50ZXJ2YWwodXBkYXRlTG9nc0Rpc3BsYXksIERDLlBPTEwuTE9HUyk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZUxvZ3NNb2RhbCgpIHtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLW1vZGFsJyk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgaWYgKGxvZ3NJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChsb2dzSW50ZXJ2YWwpO1xuICAgICAgbG9nc0ludGVydmFsID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTdG9wIFNTRSBzdHJlYW1pbmcgaWYgYWN0aXZlXG4gICAgc3RvcExvZ1N0cmVhbWluZygpO1xuXG4gICAgLy8gUmVzZXQgYWxsIGxvZyBtb2Rlc1xuICAgIGN1cnJlbnREbnNTZXJ2aWNlID0gbnVsbDtcbiAgICBjb250YWluZXJMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG4gICAgY3VycmVudENvbnRhaW5lck5hbWUgPSBudWxsO1xuICAgIGZpbGVMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGN1cnJlbnRMb2dQYXRoID0gbnVsbDtcbiAgICBjdXJyZW50TG9nU2VydmljZU5hbWUgPSBudWxsO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vID09PT09IFNTRSBMT0cgU1RSRUFNSU5HID09PT09XG5cbiAgZnVuY3Rpb24gc3RhcnRMb2dTdHJlYW1pbmcoY29udGFpbmVySWQpIHtcbiAgICBpZiAobG9nRXZlbnRTb3VyY2UpIHtcbiAgICAgIHN0b3BMb2dTdHJlYW1pbmcoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKTtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG4gICAgY29uc3QgbG9nc0NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1jb250ZW50Jyk7XG5cbiAgICAvLyBTdG9wIGludGVydmFsLWJhc2VkIHJlZnJlc2hcbiAgICBpZiAobG9nc0ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKGxvZ3NJbnRlcnZhbCk7XG4gICAgICBsb2dzSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsb2dFdmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZShgL2FwaS92MS9sb2dzL3N0cmVhbS8ke2NvbnRhaW5lcklkfWApO1xuICAgICAgaXNTdHJlYW1pbmcgPSB0cnVlO1xuXG4gICAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBzdHJlYW1CdG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDM0IExpdmUnO1xuICAgICAgc3RyZWFtQnRuLnRpdGxlID0gJ1N0cmVhbWluZyAtIGNsaWNrIHRvIHN0b3AnO1xuICAgICAgcGF1c2VCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgLy8gQWRkIHN0cmVhbWluZyBpbmRpY2F0b3IgdG8gaGVhZGVyXG4gICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXRpdGxlJyk7XG4gICAgICBpZiAoIXRpdGxlLnRleHRDb250ZW50LmluY2x1ZGVzKCdcdUQ4M0RcdUREMzQnKSkge1xuICAgICAgICB0aXRsZS5pbm5lckhUTUwgPSB0aXRsZS50ZXh0Q29udGVudC5yZXBsYWNlKCdcdUQ4M0RcdURDQ0InLCAnXHVEODNEXHVEQ0NCIFx1RDgzRFx1REQzNCcpO1xuICAgICAgfVxuXG4gICAgICBsb2dFdmVudFNvdXJjZS5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTtcblxuICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTdHJlYW0gZXJyb3I6JywgZGF0YS5lcnJvcik7XG4gICAgICAgICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQXBwZW5kIG5ldyBsb2cgZW50cnlcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGVudHJ5LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgICAgICAgIGVudHJ5LnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44cmVtOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsnO1xuXG4gICAgICAgICAgY29uc3Qgc3RyZWFtVHlwZSA9IGRhdGEuc3RyZWFtIHx8ICdzdGRvdXQnO1xuICAgICAgICAgIGNvbnN0IGlzRXJyb3IgPSBzdHJlYW1UeXBlID09PSAnc3RkZXJyJztcbiAgICAgICAgICBjb25zdCBsZXZlbENvbG9yID0gaXNFcnJvciA/ICd2YXIoLS1iYWQtZmcpJyA6ICd2YXIoLS1mZyknO1xuICAgICAgICAgIGNvbnN0IGJnQ29sb3IgPSBpc0Vycm9yID8gJ3ZhcigtLWJhZC1iZyknIDogJ3ZhcigtLW9rLWJnKSc7XG4gICAgICAgICAgY29uc3QgbGV2ZWxCYWRnZSA9IGA8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6ICR7YmdDb2xvcn07IGNvbG9yOiAke2xldmVsQ29sb3J9OyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43cmVtOyBmb250LXdlaWdodDogNjAwOyBtaW4td2lkdGg6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4ke2lzRXJyb3IgPyAnU1RERVJSJyA6ICdTVERPVVQnfTwvc3Bhbj5gO1xuXG4gICAgICAgICAgZW50cnkuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPiR7bGV2ZWxCYWRnZX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBjb2xvcjogJHtsZXZlbENvbG9yfTsgd29yZC1icmVhazogYnJlYWstYWxsOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XCI+JHtlc2NhcGVIdG1sKGRhdGEudGV4dCl9PC9kaXY+XG4gICAgICAgICAgYDtcblxuICAgICAgICAgIGxvZ3NDb250ZW50LmFwcGVuZENoaWxkKGVudHJ5KTtcblxuICAgICAgICAgIC8vIEF1dG8tc2Nyb2xsIHRvIGJvdHRvbVxuICAgICAgICAgIGxvZ3NDb250ZW50LnNjcm9sbFRvcCA9IGxvZ3NDb250ZW50LnNjcm9sbEhlaWdodDtcblxuICAgICAgICAgIC8vIExpbWl0IGVudHJpZXMgdG8gcHJldmVudCBtZW1vcnkgaXNzdWVzIChrZWVwIGxhc3QgNTAwKVxuICAgICAgICAgIHdoaWxlIChsb2dzQ29udGVudC5jaGlsZHJlbi5sZW5ndGggPiA1MDApIHtcbiAgICAgICAgICAgIGxvZ3NDb250ZW50LnJlbW92ZUNoaWxkKGxvZ3NDb250ZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzdHJlYW0gZGF0YTonLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBsb2dFdmVudFNvdXJjZS5vbmVycm9yID0gKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnIpO1xuICAgICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgc3RyZWFtaW5nOicsIGVycik7XG4gICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcExvZ1N0cmVhbWluZygpIHtcbiAgICBpZiAobG9nRXZlbnRTb3VyY2UpIHtcbiAgICAgIGxvZ0V2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICBsb2dFdmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIGlzU3RyZWFtaW5nID0gZmFsc2U7XG5cbiAgICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKTtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy10aXRsZScpO1xuXG4gICAgaWYgKHN0cmVhbUJ0bikge1xuICAgICAgc3RyZWFtQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENFMSBMaXZlJztcbiAgICAgIHN0cmVhbUJ0bi50aXRsZSA9ICdFbmFibGUgcmVhbC10aW1lIHN0cmVhbWluZyc7XG4gICAgfVxuXG4gICAgaWYgKHBhdXNlQnRuKSB7XG4gICAgICBwYXVzZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICB0aXRsZS50ZXh0Q29udGVudCA9IHRpdGxlLnRleHRDb250ZW50LnJlcGxhY2UoJyBcdUQ4M0RcdUREMzQnLCAnJyk7XG4gICAgfVxuXG4gICAgLy8gUmVzdGFydCBpbnRlcnZhbC1iYXNlZCByZWZyZXNoIGlmIGNvbnRhaW5lciBsb2dzIG1vZGFsIGlzIG9wZW5cbiAgICBpZiAoY29udGFpbmVyTG9nc01vZGUgJiYgY3VycmVudENvbnRhaW5lcklkICYmICFsb2dzSW50ZXJ2YWwpIHtcbiAgICAgIGxvZ3NJbnRlcnZhbCA9IHNldEludGVydmFsKHVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5LCBEQy5QT0xMLkxPR1MpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IENPTlRBSU5FUiBMT0dTID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDb250YWluZXJMb2dzKGNvbnRhaW5lcklkLCBsaW5lcyA9IDEwMCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IGAvYXBpL3YxL2xvZ3MvY29udGFpbmVyLyR7Y29udGFpbmVySWR9P3RhaWw9JHtsaW5lc30mdGltZXN0YW1wcz10cnVlYDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChlbmRwb2ludCwge1xuICAgICAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICAgICAgaGVhZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQ2FjaGUtQ29udHJvbCc6ICduby1jYWNoZScgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQubG9ncykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2dzOiByZXN1bHQubG9ncyxcbiAgICAgICAgICAgIGNvdW50OiByZXN1bHQuY291bnQsXG4gICAgICAgICAgICBjb250YWluZXJOYW1lOiByZXN1bHQuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcklkOiByZXN1bHQuY29udGFpbmVySWRcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiByZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBjb250YWluZXIgbG9ncycgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQ29udGFpbmVyIGxvZ3MgZmV0Y2ggZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQ29udGFpbmVyTG9nRW50cnkobG9nKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgcGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuOHJlbTsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7JztcblxuICAgIGNvbnN0IHN0cmVhbUNvbG9yID0gbG9nLnN0cmVhbSA9PT0gJ3N0ZGVycicgPyAndmFyKC0tYmFkLWZnKScgOiAndmFyKC0tZmcpJztcbiAgICBjb25zdCBzdHJlYW1CYWRnZSA9IGxvZy5zdHJlYW0gPT09ICdzdGRlcnInID9cbiAgICAgICc8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLWJhZC1iZyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43cmVtOyBmb250LXdlaWdodDogNjAwO1wiPlNUREVSUjwvc3Bhbj4nIDpcbiAgICAgICc8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLW9rLWJnKTsgY29sb3I6IHZhcigtLW9rLWZnKTsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuN3JlbTsgZm9udC13ZWlnaHQ6IDYwMDtcIj5TVERPVVQ8L3NwYW4+JztcblxuICAgIGRpdi5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleC1zaHJpbms6IDA7XCI+JHtzdHJlYW1CYWRnZX08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBjb2xvcjogJHtzdHJlYW1Db2xvcn07IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgd2hpdGUtc3BhY2U6IHByZS13cmFwO1wiPiR7ZXNjYXBlSHRtbChsb2cudGV4dCl9PC9kaXY+XG4gICAgYDtcblxuICAgIHJldHVybiBkaXY7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVDb250YWluZXJMb2dzRGlzcGxheSgpIHtcbiAgICBpZiAobG9nc1BhdXNlZCB8fCAhY3VycmVudENvbnRhaW5lcklkIHx8ICFjb250YWluZXJMb2dzTW9kZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbGluZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nLWxpbmVzJykudmFsdWUpO1xuICAgIGNvbnN0IGxvZ3NDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtY29udGVudCcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoQ29udGFpbmVyTG9ncyhjdXJyZW50Q29udGFpbmVySWQsIGxpbmVzKTtcblxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjJyZW07IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2QTBcdUZFMEYgRXJyb3I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+JHtlc2NhcGVIdG1sKHJlc3VsdC5lcnJvcil9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgaGVhZGVyIHJvd1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC43NXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLW11dGVkKTsgcG9zaXRpb246IHN0aWNreTsgdG9wOiAwO1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleC1zaHJpbms6IDA7IHdpZHRoOiA4MHB4O1wiPlN0cmVhbTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+TG9nIE91dHB1dDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcblxuICAgICAgaWYgKHJlc3VsdC5sb2dzICYmIHJlc3VsdC5sb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LmxvZ3MuZm9yRWFjaChsb2cgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvZ0VsZW1lbnQgPSByZW5kZXJDb250YWluZXJMb2dFbnRyeShsb2cpO1xuICAgICAgICAgIGxvZ3NDb250ZW50LmFwcGVuZENoaWxkKGxvZ0VsZW1lbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBdXRvLXNjcm9sbCB0byBib3R0b21cbiAgICAgICAgbG9nc0NvbnRlbnQuc2Nyb2xsVG9wID0gbG9nc0NvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MICs9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgICAgTm8gbG9ncyBhdmFpbGFibGUgZm9yIHRoaXMgY29udGFpbmVyXG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cbiAgICAgICAgICBGYWlsZWQgdG8gZmV0Y2ggbG9nczogJHtlc2NhcGVIdG1sKGVycm9yLm1lc3NhZ2UpfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5Db250YWluZXJMb2dzTW9kYWwoY29udGFpbmVySWQsIGNvbnRhaW5lck5hbWUpIHtcbiAgICBjdXJyZW50Q29udGFpbmVySWQgPSBjb250YWluZXJJZDtcbiAgICBjdXJyZW50Q29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7XG4gICAgY29udGFpbmVyTG9nc01vZGUgPSB0cnVlO1xuICAgIGZpbGVMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcblxuICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIHN0cmVhbWluZ1xuICAgIHN0b3BMb2dTdHJlYW1pbmcoKTtcblxuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXRpdGxlJyk7XG4gICAgY29uc3QgcGF1c2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1wYXVzZScpO1xuICAgIGNvbnN0IHN0cmVhbUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXN0cmVhbScpO1xuXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgXHVEODNEXHVEQ0NCICR7Y29udGFpbmVyTmFtZX0gLSBDb250YWluZXIgTG9nc2A7XG4gICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyM0Y4XHVGRTBGIFBhdXNlJztcbiAgICBwYXVzZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdwYXVzZWQnKTtcblxuICAgIC8vIFNob3cgc3RyZWFtIGJ1dHRvbiBmb3IgY29udGFpbmVyIGxvZ3NcbiAgICBpZiAoc3RyZWFtQnRuKSB7XG4gICAgICBzdHJlYW1CdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIEluaXRpYWwgbG9hZFxuICAgIHVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5KCk7XG5cbiAgICAvLyBTdGFydCBhdXRvLXJlZnJlc2ggZXZlcnkgMyBzZWNvbmRzXG4gICAgbG9nc0ludGVydmFsID0gc2V0SW50ZXJ2YWwodXBkYXRlQ29udGFpbmVyTG9nc0Rpc3BsYXksIERDLlBPTEwuTE9HUyk7XG4gIH1cblxuICAvLyA9PT09PSBGSUxFLUJBU0VEIExPR1MgKGZvciBuYXRpdmUgYXBwcykgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaEZpbGVMb2dzKGxvZ1BhdGgsIGxpbmVzID0gMTAwKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gYC9hcGkvdjEvbG9ncy9maWxlP3BhdGg9JHtlbmNvZGVVUklDb21wb25lbnQobG9nUGF0aCl9JnRhaWw9JHtsaW5lc31gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGVuZHBvaW50LCB7XG4gICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsICdDYWNoZS1Db250cm9sJzogJ25vLWNhY2hlJyB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5sb2dzKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvZ3M6IHJlc3VsdC5sb2dzLFxuICAgICAgICAgICAgY291bnQ6IHJlc3VsdC5jb3VudCxcbiAgICAgICAgICAgIGxvZ1BhdGg6IHJlc3VsdC5sb2dQYXRoLFxuICAgICAgICAgICAgdG90YWxMaW5lczogcmVzdWx0LnRvdGFsTGluZXNcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiByZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBmaWxlIGxvZ3MnIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHJlc3VsdC5lcnJvciB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZpbGUgbG9ncyBmZXRjaCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJGaWxlTG9nRW50cnkobG9nKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgcGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuOHJlbTsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7JztcblxuICAgIGNvbnN0IHRleHQgPSBsb2cudGV4dDtcbiAgICBsZXQgbG9nTGV2ZWwgPSAnSU5GTyc7XG4gICAgbGV0IGxldmVsQ29sb3IgPSAndmFyKC0tZmcpJztcblxuICAgIGlmICh0ZXh0Lm1hdGNoKC9FUlJPUnxGQVRBTHxDUklUSUNBTC9pKSkge1xuICAgICAgbG9nTGV2ZWwgPSAnRVJST1InO1xuICAgICAgbGV2ZWxDb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICB9IGVsc2UgaWYgKHRleHQubWF0Y2goL1dBUk58V0FSTklORy9pKSkge1xuICAgICAgbG9nTGV2ZWwgPSAnV0FSTic7XG4gICAgICBsZXZlbENvbG9yID0gJyNmMzljMTInO1xuICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaCgvREVCVUcvaSkpIHtcbiAgICAgIGxvZ0xldmVsID0gJ0RFQlVHJztcbiAgICAgIGxldmVsQ29sb3IgPSAndmFyKC0tbXV0ZWQpJztcbiAgICB9XG5cbiAgICBjb25zdCBiZ0NvbG9yID0gbGV2ZWxDb2xvciA9PT0gJ3ZhcigtLWJhZC1mZyknID8gJ3ZhcigtLWJhZC1iZyknIDogJ3ZhcigtLW9rLWJnKSc7XG4gICAgY29uc3QgbGV2ZWxCYWRnZSA9IGA8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6ICR7YmdDb2xvcn07IGNvbG9yOiAke2xldmVsQ29sb3J9OyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43cmVtOyBmb250LXdlaWdodDogNjAwOyBtaW4td2lkdGg6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4ke2xvZ0xldmVsfTwvc3Bhbj5gO1xuXG4gICAgZGl2LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj4ke2xldmVsQmFkZ2V9PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgY29sb3I6ICR7bGV2ZWxDb2xvcn07IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgd2hpdGUtc3BhY2U6IHByZS13cmFwO1wiPiR7ZXNjYXBlSHRtbCh0ZXh0KX08L2Rpdj5cbiAgICBgO1xuXG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVMb2dzRGlzcGxheSgpIHtcbiAgICBpZiAobG9nc1BhdXNlZCB8fCAhY3VycmVudExvZ1BhdGggfHwgIWZpbGVMb2dzTW9kZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbGluZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nLWxpbmVzJykudmFsdWUpO1xuICAgIGNvbnN0IGxvZ3NDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtY29udGVudCcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoRmlsZUxvZ3MoY3VycmVudExvZ1BhdGgsIGxpbmVzKTtcblxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjJyZW07IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2QTBcdUZFMEYgRXJyb3I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+JHtlc2NhcGVIdG1sKHJlc3VsdC5lcnJvcil9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjc1cmVtOyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwb3NpdGlvbjogc3RpY2t5OyB0b3A6IDA7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OiAxO1wiPkxvZyBPdXRwdXQgKCR7cmVzdWx0LmNvdW50fSBvZiAke3Jlc3VsdC50b3RhbExpbmVzfSBsaW5lcyk8L3NwYW4+XG4gICAgICAgIDwvZGl2PmA7XG5cbiAgICAgIGlmIChyZXN1bHQubG9ncyAmJiByZXN1bHQubG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5sb2dzLmZvckVhY2gobG9nID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dFbGVtZW50ID0gcmVuZGVyRmlsZUxvZ0VudHJ5KGxvZyk7XG4gICAgICAgICAgbG9nc0NvbnRlbnQuYXBwZW5kQ2hpbGQobG9nRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBsb2dzQ29udGVudC5zY3JvbGxUb3AgPSBsb2dzQ29udGVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgKz0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICBObyBsb2dzIGF2YWlsYWJsZSBpbiB0aGlzIGZpbGVcbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICAgIEZhaWxlZCB0byBmZXRjaCBsb2dzOiAke2VzY2FwZUh0bWwoZXJyb3IubWVzc2FnZSl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbkZpbGVMb2dzTW9kYWwobG9nUGF0aCwgc2VydmljZU5hbWUpIHtcbiAgICBjdXJyZW50TG9nUGF0aCA9IGxvZ1BhdGg7XG4gICAgY3VycmVudExvZ1NlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7XG4gICAgZmlsZUxvZ3NNb2RlID0gdHJ1ZTtcbiAgICBjb250YWluZXJMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXRpdGxlJyk7XG4gICAgY29uc3QgcGF1c2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1wYXVzZScpO1xuICAgIGNvbnN0IHN0cmVhbUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXN0cmVhbScpO1xuXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgXHVEODNEXHVEQ0NCICR7c2VydmljZU5hbWV9IC0gQXBwbGljYXRpb24gTG9nc2A7XG4gICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyM0Y4XHVGRTBGIFBhdXNlJztcbiAgICBwYXVzZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdwYXVzZWQnKTtcblxuICAgIC8vIEhpZGUgc3RyZWFtIGJ1dHRvbiBmb3IgZmlsZSBsb2dzIChvbmx5IGF2YWlsYWJsZSBmb3IgY29udGFpbmVyIGxvZ3MpXG4gICAgaWYgKHN0cmVhbUJ0bikge1xuICAgICAgc3RyZWFtQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgdXBkYXRlRmlsZUxvZ3NEaXNwbGF5KCk7XG4gICAgbG9nc0ludGVydmFsID0gc2V0SW50ZXJ2YWwodXBkYXRlRmlsZUxvZ3NEaXNwbGF5LCBEQy5QT0xMLkxPR1MpO1xuICB9XG5cbiAgLy8gPT09PT0gRVZFTlQgTElTVEVORVJTID09PT09XG5cbiAgLy8gRE5TIGxvZyBidXR0b25zIFx1MjAxNCBldmVudCBkZWxlZ2F0aW9uIGZvciBkeW5hbWljIGNhcmRzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IGxvZ3NCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbaWQkPVwiLWxvZ3NcIl0nKTtcbiAgICBpZiAoIWxvZ3NCdG4pIHJldHVybjtcbiAgICBjb25zdCBkbnNJZCA9IGxvZ3NCdG4uaWQucmVwbGFjZSgnLWxvZ3MnLCAnJyk7XG4gICAgaWYgKCFTSVRFLmRuc1NlcnZlcnNbZG5zSWRdKSByZXR1cm47XG4gICAgb3BlbkxvZ3NNb2RhbChkbnNJZCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLWNsb3NlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VMb2dzTW9kYWwpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvZ3NQYXVzZWQgPSAhbG9nc1BhdXNlZDtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG5cbiAgICBpZiAobG9nc1BhdXNlZCkge1xuICAgICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyNUI2XHVGRTBGIFJlc3VtZSc7XG4gICAgICBwYXVzZUJ0bi5jbGFzc0xpc3QuYWRkKCdwYXVzZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyM0Y4XHVGRTBGIFBhdXNlJztcbiAgICAgIHBhdXNlQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3BhdXNlZCcpO1xuICAgICAgdXBkYXRlTG9nc0Rpc3BsYXkoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2ctbGluZXMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGlmICghbG9nc1BhdXNlZCkge1xuICAgICAgdXBkYXRlTG9nc0Rpc3BsYXkoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFN0cmVhbSBidXR0b24gZm9yIHJlYWwtdGltZSBTU0UgbG9ncyAob25seSB3b3JrcyB3aXRoIGNvbnRhaW5lciBsb2dzKVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKCFjb250YWluZXJMb2dzTW9kZSB8fCAhY3VycmVudENvbnRhaW5lcklkKSB7XG4gICAgICAvLyBTdHJlYW1pbmcgb25seSBhdmFpbGFibGUgZm9yIGNvbnRhaW5lciBsb2dzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyZWFtaW5nKSB7XG4gICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0TG9nU3RyZWFtaW5nKGN1cnJlbnRDb250YWluZXJJZCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDbG9zZSBtb2RhbCBvbiBvdXRzaWRlIGNsaWNrXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLW1vZGFsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQuaWQgPT09ICdsb2dzLW1vZGFsJykge1xuICAgICAgY2xvc2VMb2dzTW9kYWwoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsb3NlIGxvZ3MtbW9kYWwgb24gRXNjYXBlIGtleVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKT8uY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgICAgY2xvc2VMb2dzTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PT09IEVYUE9SVFMgPT09PT1cbiAgd2luZG93Lm9wZW5Db250YWluZXJMb2dzTW9kYWwgPSBvcGVuQ29udGFpbmVyTG9nc01vZGFsO1xuICB3aW5kb3cub3BlbkZpbGVMb2dzTW9kYWwgPSBvcGVuRmlsZUxvZ3NNb2RhbDtcbiAgd2luZG93Lm9wZW5Mb2dzTW9kYWwgPSBvcGVuTG9nc01vZGFsO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIE1PREFMIFRFTVBMQVRFUyA9PT09PT09PT09XG4vLyBJbmplY3RzIHRoZSBIVE1MIGZvciBzZXJ2aWNlIGVkaXQsIGRlbGV0ZSwgYW5kIGFkZCBtb2RhbHMgaW50byB0aGUgRE9NLlxuLy8gTXVzdCBsb2FkIGJlZm9yZSBzZXJ2aWNlLWNydWQuanMgYW5kIHNlcnZpY2UtY3JlYXRlLmpzLlxuKGZ1bmN0aW9uICgpIHtcblxuICBpbmplY3RNb2RhbCgnc2VydmljZS1lZGl0LW1vZGFsJywgYFxuICA8ZGl2IGlkPVwic2VydmljZS1lZGl0LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA1MDBweDsgbWF4LXdpZHRoOiA2MDBweDtcIj5cbiAgICAgIDxoMyBpZD1cInNlcnZpY2UtZWRpdC10aXRsZVwiPkVkaXQgU2VydmljZTwvaDM+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDwhLS0gU2VydmljZSBJbmZvIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMnB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogOHB4O1wiPlxuICAgICAgICAgIDxpbWcgaWQ9XCJlZGl0LXNlcnZpY2UtbG9nby1wcmV2aWV3XCIgc3JjPVwiXCIgYWx0PVwiXCIgc3R5bGU9XCJ3aWR0aDogNDhweDsgaGVpZ2h0OiA0OHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IG9iamVjdC1maXQ6IGNvbnRhaW47IGJhY2tncm91bmQ6IHZhcigtLWJnKTtcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgICAgPGRpdiBpZD1cImVkaXQtc2VydmljZS11cmwtZGlzcGxheVwiIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERpc3BsYXkgTmFtZSAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdC1zZXJ2aWNlLW5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBEaXNwbGF5IE5hbWVcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWRpdC1zZXJ2aWNlLW5hbWVcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiBwbGFjZWhvbGRlcj1cIlNlcnZpY2UgbmFtZSBzaG93biBvbiBkYXNoYm9hcmRcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFN1YmRvbWFpbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdC1zdWJkb21haW5cIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBTdWJkb21haW5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy1nYXAtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkaXQtc3ViZG9tYWluXCIgY2xhc3M9XCJpbnB1dC1mbGV4XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiZWRpdC10bGQtc3VmZml4XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPi5ob21lPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBvcnQgLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImVkaXQtcG9ydFwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIFBvcnRcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJlZGl0LXBvcnRcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhpbnQtc21cIj5cbiAgICAgICAgICAgIFRoZSBwb3J0IENhZGR5IHdpbGwgcHJveHkgdG8gKGNvbnRhaW5lcidzIGV4cG9zZWQgcG9ydClcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBJUCBBZGRyZXNzIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZGl0LWlwXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlxuICAgICAgICAgICAgSVAgQWRkcmVzc1xuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZGl0LWlwXCIgY2xhc3M9XCJmb3JtLWlucHV0LW1kXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWlsc2NhbGUgUHJvdGVjdGlvbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImVkaXQtdGFpbHNjYWxlLW9ubHlcIiBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgLz5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy01MDBcIj5UYWlsc2NhbGUtT25seSBBY2Nlc3M8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlJlc3RyaWN0IHRoaXMgc2VydmljZSB0byBUYWlsc2NhbGUgdXNlcnMgb25seTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBMb2dvIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBTZXJ2aWNlIExvZ29cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy1nYXAtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkaXQtbG9nby11cmxcIiBwbGFjZWhvbGRlcj1cIi9hc3NldHMvc2VydmljZS5wbmcgb3IgaHR0cHM6Ly8uLi5cIiBjbGFzcz1cImlucHV0LWZsZXhcIiAvPlxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwicGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiZWRpdC1sb2dvLWZpbGVcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgICAgIFVwbG9hZFxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+XG4gICAgICAgICAgICBFbnRlciBhIFVSTCBvciB1cGxvYWQgYW4gaW1hZ2UgZmlsZSAoUE5HLCBKUEcsIFNWRylcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBDYXRlZ29yeSAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdC1zZXJ2aWNlLWNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlxuICAgICAgICAgICAgQ2F0ZWdvcnlcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJlZGl0LXNlcnZpY2UtY2F0ZWdvcnlcIiBkYXRhLXJvbGU9XCJzZXJ2aWNlLWNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWlucHV0LW1kXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5vIGNhdGVnb3J5IFx1MjAxNDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAyNHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic2VydmljZS1lZGl0LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwic2VydmljZS1lZGl0LXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5cbiAgICAgICAgICBTYXZlIENoYW5nZXNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgaW5qZWN0TW9kYWwoJ2RlbGV0ZS1zZXJ2aWNlLW1vZGFsJywgYFxuICA8ZGl2IGlkPVwiZGVsZXRlLXNlcnZpY2UtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDQwMHB4OyBtYXgtd2lkdGg6IDUwMHB4O1wiPlxuICAgICAgPGgzIGlkPVwiZGVsZXRlLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtYi0xNlwiPkRlbGV0ZSBTZXJ2aWNlPC9oMz5cblxuICAgICAgPGRpdiBpZD1cImRlbGV0ZS1tb2RhbC1tZXNzYWdlXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4OyBsaW5lLWhlaWdodDogMS41O1wiPlxuICAgICAgICA8IS0tIER5bmFtaWMgY29udGVudCAtLT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwiZGVsZXRlLW1vZGFsLWNvbnRhaW5lci1pbmZvXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAyMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPkRvY2tlciBDb250YWluZXI8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRlbGV0ZS1tb2RhbC1jb250YWluZXItbmFtZVwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjlyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkZWxldGUtbW9kYWwtY2FuY2VsXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDIwcHg7XCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkZWxldGUtbW9kYWwtcmVtb3ZlXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDIwcHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPlxuICAgICAgICAgIFJlbW92ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRlbGV0ZS1tb2RhbC1kZWxldGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDEwcHggMjBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNlNzRjM2MgMjAlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1jb2xvcjogI2U3NGMzYzsgY29sb3I6ICNlNzRjM2M7XCI+XG4gICAgICAgICAgRGVsZXRlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJkZWxldGUtbW9kYWwtaGVscFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW11dGVkKSAxMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogOHB4OyBmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgIDxkaXY+PHN0cm9uZz5SZW1vdmU6PC9zdHJvbmc+IFJlbW92ZSBmcm9tIGRhc2hib2FyZCBvbmx5IChjb250YWluZXIga2VlcHMgcnVubmluZyk8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDZweDtcIj48c3Ryb25nPkRlbGV0ZTo8L3N0cm9uZz4gRnVsbCByZW1vdmFsIC0gc3RvcHMgY29udGFpbmVyLCByZW1vdmVzIEROUyAmIENhZGR5IGNvbmZpZzwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGluamVjdE1vZGFsKCdhZGQtc2VydmljZS1tb2RhbCcsIGBcbiAgPGRpdiBpZD1cImFkZC1zZXJ2aWNlLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0MjBweDsgbWF4LXdpZHRoOiA1MjBweDtcIj5cbiAgICAgIDxoMz5BZGQgU2VydmljZTwvaDM+XG5cbiAgICAgIDwhLS0gU2VydmljZSBUeXBlIFRhYnMgLS0+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycHg7IG1hcmdpbi1ib3R0b206IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiA4cHg7IHBhZGRpbmc6IDNweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGxhYmVsIGlkPVwidGFiLWxvY2FsXCIgc3R5bGU9XCJmbGV4OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC13ZWlnaHQ6IDUwMDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJnKTsgdHJhbnNpdGlvbjogYWxsIDAuMTVzO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic2VydmljZS10eXBlXCIgdmFsdWU9XCJsb2NhbFwiIGlkPVwic2VydmljZS10eXBlLWxvY2FsXCIgY2hlY2tlZCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICBMb2NhbFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgaWQ9XCJ0YWItZXh0ZXJuYWxcIiBzdHlsZT1cImZsZXg6IDE7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtOyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzZXJ2aWNlLXR5cGVcIiB2YWx1ZT1cImV4dGVybmFsXCIgaWQ9XCJzZXJ2aWNlLXR5cGUtZXh0ZXJuYWxcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICBFeHRlcm5hbFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBpZD1cInNlcnZpY2UtdHlwZS1kZXNjcmlwdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L3NwYW4+XG5cbiAgICAgIDwhLS0gTE9DQUwgU0VSVklDRSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJsb2NhbC1zZXJ2aWNlLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZXJ2aWNlLW5hbWUtaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPk5hbWU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic2VydmljZS1uYW1lLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBKZWxseWZpblwiIHN0eWxlPVwiZm9udC1zaXplOiAxcmVtO1wiIC8+XG4gICAgICAgICAgPGRpdiBpZD1cInN1YmRvbWFpbi1wcmV2aWV3XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tdG9wOiA0cHg7IG1pbi1oZWlnaHQ6IDFlbTtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtMmNvbFwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1wb3J0LWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4OyBkaXNwbGF5OiBibG9jaztcIj5Qb3J0PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJzZXJ2aWNlLXBvcnQtaW5wdXRcIiBwbGFjZWhvbGRlcj1cImUuZy4sIDgwOTZcIiBzdHlsZT1cImZvbnQtc2l6ZTogMXJlbTtcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1pcC1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDsgZGlzcGxheTogYmxvY2s7XCI+SVAgQWRkcmVzczwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNlcnZpY2UtaXAtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIkF1dG8tZGV0ZWN0ZWRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMXJlbTtcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLWlwLWJ1dHRvbnNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyBtYXJnaW4tdG9wOiA0cHg7IGZsZXgtd3JhcDogd3JhcDtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJxdWljay1pcC1idG5cIiBkYXRhLWlwPVwiMTI3LjAuMC4xXCIgdGl0bGU9XCJMb2NhbGhvc3RcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBwYWRkaW5nOiAycHggNnB4O1wiPmxvY2FsaG9zdDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInF1aWNrLWlwLWJ0blwiIGRhdGEtaXA9XCJcIiBpZD1cInF1aWNrLWlwLWxhblwiIHRpdGxlPVwiTEFOIElQXCIgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgcGFkZGluZzogMnB4IDZweDtcIj5MQU48L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJxdWljay1pcC1idG5cIiBkYXRhLWlwPVwiXCIgaWQ9XCJxdWljay1pcC10YWlsc2NhbGVcIiB0aXRsZT1cIlRhaWxzY2FsZSBJUFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IHBhZGRpbmc6IDJweCA2cHg7XCI+VGFpbHNjYWxlPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBPcHRpb25zIChjb2xsYXBzZWQgYnkgZGVmYXVsdCkgLS0+XG4gICAgICAgIDxkZXRhaWxzIGlkPVwibG9jYWwtYWR2YW5jZWQtb3B0aW9uc1wiPlxuICAgICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC1zaXplOiAwLjhyZW07IHVzZXItc2VsZWN0OiBub25lO1wiPk9wdGlvbnM8L3N1bW1hcnk+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7IGRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgZm9udC1zaXplOiAwLjhyZW07XCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLTJjb2xcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1zdWJkb21haW4taW5wdXRcIj5TdWJkb21haW46PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNlcnZpY2Utc3ViZG9tYWluLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJhdXRvLWRlcml2ZWQgZnJvbSBuYW1lXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlcnZpY2UtbG9nby1pbnB1dFwiPkxvZ28gVVJMOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzZXJ2aWNlLWxvZ28taW5wdXRcIiBwbGFjZWhvbGRlcj1cIi9hc3NldHMvbmFtZS5wbmdcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IHN0YXJ0O1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImNyZWF0ZS1kbnMtcmVjb3JkXCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICAgIENyZWF0ZSBETlMgUmVjb3JkXG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNzbC10eXBlLXNlbGVjdFwiPlNTTDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzc2wtdHlwZS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNhZGR5LW1hbmFnZWRcIj5DYWRkeSBNYW5hZ2VkIChJbnRlcm5hbCk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJsZXRzZW5jcnlwdFwiPkxldCdzIEVuY3J5cHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJleGlzdGluZy1jYVwiPkV4aXN0aW5nIENBPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3VzdG9tLWNhXCI+Q3VzdG9tIENBPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJkbnMtY29uZmlnXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLTJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRucy10dGwtaW5wdXRcIj5ETlMgVFRMOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZG5zLXR0bC1pbnB1dFwiIHZhbHVlPVwiMzAwXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNhZGR5ZmlsZS1wYXRoLWlucHV0XCI+Q2FkZHlmaWxlIFBhdGg6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2FkZHlmaWxlLXBhdGgtaW5wdXRcIiB2YWx1ZT1cIkM6XFxcXGNhZGR5XFxcXENhZGR5ZmlsZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJleGlzdGluZy1jYS1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleGlzdGluZy1jYS1zZWxlY3RcIj5FeGlzdGluZyBDQTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3ctZ2FwXCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV4aXN0aW5nLWNhLXNlbGVjdFwiIHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5Mb2FkaW5nIENBcy4uLjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwicmVmcmVzaC1jYXNcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj5cXHV7MUY1MDR9PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJjdXN0b20tY2EtY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2EtbmFtZS1pbnB1dFwiPkNBIE5hbWU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjYS1uYW1lLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBzYW1pLWNhXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGlkPVwibWFudWFsLXRhaWxzY2FsZS1zdGF0dXNcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuNzVyZW07XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBUYWlsc2NhbGUuLi48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hbnVhbC10YWlsc2NhbGUtb25seVwiIC8+XG4gICAgICAgICAgICAgIFRhaWxzY2FsZS1Pbmx5IEFjY2Vzc1xuICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwicmVsb2FkLWNhZGR5XCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICBSZWxvYWQgQ2FkZHkgYWZ0ZXIgYWRkaW5nXG4gICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICA8IS0tIENhdGVnb3J5IC0tPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlcnZpY2UtY2F0ZWdvcnktaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPkNhdGVnb3J5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInNlcnZpY2UtY2F0ZWdvcnktaW5wdXRcIiBkYXRhLXJvbGU9XCJzZXJ2aWNlLWNhdGVnb3J5XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5vIGNhdGVnb3J5IFx1MjAxNDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAzcHg7XCI+R3JvdXAgc2VydmljZXMgb24gdGhlIGRhc2hib2FyZCBieSBwdXJwb3NlIChNZWRpYSwgUHJvZHVjdGl2aXR5LCBldGMuKTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxociBzdHlsZT1cImJvcmRlcjogbm9uZTsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IG1hcmdpbjogNHB4IDA7XCIgLz5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtMmNvbFwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlbmFibGUtYXV0aFwiIC8+XG4gICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImVuYWJsZS1jb3JzXCIgLz5cbiAgICAgICAgICAgICAgICAgIENPUlMgSGVhZGVyc1xuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVwc3RyZWFtLXBhdGgtaW5wdXRcIj5VcHN0cmVhbSBQYXRoOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ1cHN0cmVhbS1wYXRoLWlucHV0XCIgdmFsdWU9XCIvXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImhlYWx0aC1jaGVjay1pbnB1dFwiPkhlYWx0aCBDaGVjazo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVhbHRoLWNoZWNrLWlucHV0XCIgcGxhY2Vob2xkZXI9XCIvaGVhbHRoXCIgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGltZW91dC1pbnB1dFwiPlRpbWVvdXQgKHMpOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInRpbWVvdXQtaW5wdXRcIiB2YWx1ZT1cIjMwXCIgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY3VzdG9tLWhlYWRlcnMtaW5wdXRcIj5IZWFkZXJzIChKU09OKTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImN1c3RvbS1oZWFkZXJzLWlucHV0XCIgcGxhY2Vob2xkZXI9J3tcIlgtQ3VzdG9tXCI6IFwidmFsdWVcIn0nIHJvd3M9XCIyXCIgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTtcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGV0YWlscz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVYVEVSTkFMIFNFUlZJQ0UgLS0+XG4gICAgICA8ZGl2IGlkPVwiZXh0ZXJuYWwtc2VydmljZS1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEycHg7XCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHRlcm5hbC1zZXJ2aWNlLW5hbWVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPk5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLW5hbWVcIiBwbGFjZWhvbGRlcj1cImUuZy4sIFJhZGFyciAoU2VlZGhvc3QpXCIgc3R5bGU9XCJmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJleHRlcm5hbC1zdWJkb21haW4tcHJldmlld1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgbWFyZ2luLXRvcDogNHB4OyBtaW4taGVpZ2h0OiAxZW07XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4dGVybmFsLXNlcnZpY2UtdXJsXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4OyBkaXNwbGF5OiBibG9jaztcIj5FeHRlcm5hbCBVUkw8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cImV4dGVybmFsLXNlcnZpY2UtdXJsXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL3VzZXJuYW1lLnNlZWRob3N0LmV1L3JhZGFyclwiIHN0eWxlPVwiZm9udC1zaXplOiAxcmVtO1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIE9wdGlvbnMgKGNvbGxhcHNlZCBieSBkZWZhdWx0KSAtLT5cbiAgICAgICAgICA8ZGV0YWlscyBpZD1cImV4dGVybmFsLWFkdmFuY2VkLW9wdGlvbnNcIj5cbiAgICAgICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC1zaXplOiAwLjhyZW07IHVzZXItc2VsZWN0OiBub25lO1wiPk9wdGlvbnM8L3N1bW1hcnk+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDsgZGlzcGxheTogZ3JpZDsgZ2FwOiAxMHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpblwiPlN1YmRvbWFpbjo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpblwiIHBsYWNlaG9sZGVyPVwiYXV0by1kZXJpdmVkIGZyb20gbmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBpZD1cImV4dGVybmFsLWRvbWFpbi1wcmV2aWV3XCIgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS1sb2dvXCI+TG9nbyBVUkw6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXh0ZXJuYWwtc2VydmljZS1sb2dvXCIgcGxhY2Vob2xkZXI9XCIvYXNzZXRzL25hbWUucG5nXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS1pY29uXCI+SWNvbiBFbW9qaTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXh0ZXJuYWwtc2VydmljZS1pY29uXCIgcGxhY2Vob2xkZXI9XCJcXHV7MUYzQUN9XCIgbWF4bGVuZ3RoPVwiMlwiIHN0eWxlPVwid2lkdGg6IDYwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJleHRlcm5hbC1jcmVhdGUtZG5zXCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICAgIENyZWF0ZSBETlMgUmVjb3JkXG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXh0ZXJuYWwtY3JlYXRlLWNhZGR5XCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICAgIENyZWF0ZSBDYWRkeSBSZXZlcnNlIFByb3h5XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtcHJveHktaXBcIj5Qcm94eSBTZXJ2ZXIgSVA6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4dGVybmFsLXByb3h5LWlwXCIgcGxhY2Vob2xkZXI9XCJBdXRvLWRldGVjdGVkXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXh0ZXJuYWwtcHJlc2VydmUtaG9zdFwiIGNoZWNrZWQgLz5cbiAgICAgICAgICAgICAgICBQcmVzZXJ2ZSBIb3N0IEhlYWRlclxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV4dGVybmFsLWZvbGxvdy1yZWRpcmVjdHNcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICAgICAgRm9sbG93IFJlZGlyZWN0c1xuICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgIDwhLS0gQ2F0ZWdvcnkgKGV4dGVybmFsKSAtLT5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS1jYXRlZ29yeVwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDsgZGlzcGxheTogYmxvY2s7XCI+Q2F0ZWdvcnk8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLWNhdGVnb3J5XCIgZGF0YS1yb2xlPVwic2VydmljZS1jYXRlZ29yeVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5vIGNhdGVnb3J5IFx1MjAxNDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFkZC1zZXJ2aWNlLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYWRkLXNlcnZpY2UtY3JlYXRlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+Q3JlYXRlIFNlcnZpY2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gU0VSVklDRSBJTkZSQVNUUlVDVFVSRSA9PT09PT09PT09XG4vLyBDYWRkeSBjb25maWcgZ2VuZXJhdGlvbiwgRE5TIHJlY29yZCBjcmVhdGlvbiwgYW5kIHNlcnZpY2UgcmVnaXN0cmF0aW9uLlxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyA9PT09PSBMT0FEIEVYSVNUSU5HIENBcyA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRFeGlzdGluZ0NBcyhjYWRkeWZpbGVQYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY2FkZHkvY2FzP2NhZGR5ZmlsZVBhdGg9JHtlbmNvZGVVUklDb21wb25lbnQoY2FkZHlmaWxlUGF0aCl9YCk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBDQXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhpc3RpbmctY2Etc2VsZWN0Jyk7XG4gICAgICAgIHNlbGVjdC5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICBpZiAocmVzdWx0LmNhcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5ObyBDQXMgZm91bmQgaW4gQ2FkZHlmaWxlPC9vcHRpb24+JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgZXhpc3RpbmcgQ0EuLi48L29wdGlvbj4nO1xuICAgICAgICAgIHJlc3VsdC5jYXMuZm9yRWFjaChjYSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2EgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIG9wdGlvbi52YWx1ZSA9IGNhLmlkO1xuICAgICAgICAgICAgICBvcHRpb24udGV4dENvbnRlbnQgPSBjYS5kaXNwbGF5TmFtZSB8fCBjYS5uYW1lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3B0aW9uLnZhbHVlID0gY2E7XG4gICAgICAgICAgICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IGNhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhLmNhcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgQ0FzOicsIGVycm9yKTtcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGlzdGluZy1jYS1zZWxlY3QnKTtcbiAgICAgIHNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkVycm9yIGxvYWRpbmcgQ0FzPC9vcHRpb24+JztcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBHRU5FUkFURSBDQUREWSBDT05GSUcgPT09PT1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZUNhZGR5Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIHN1YmRvbWFpbixcbiAgICAgIHBvcnQsXG4gICAgICBpcCxcbiAgICAgIHNzbFR5cGUsXG4gICAgICBjYU5hbWUsXG4gICAgICBleGlzdGluZ0NhLFxuICAgICAgZW5hYmxlQXV0aCxcbiAgICAgIGVuYWJsZUNvcnMsXG4gICAgICBjdXN0b21IZWFkZXJzLFxuICAgICAgdXBzdHJlYW1QYXRoLFxuICAgICAgaGVhbHRoQ2hlY2ssXG4gICAgICB0aW1lb3V0LFxuICAgICAgdGFpbHNjYWxlT25seVxuICAgIH0gPSBjb25maWc7XG5cbiAgICBsZXQgY2FkZHlDb25maWcgPSBgJHtidWlsZERvbWFpbihzdWJkb21haW4pfSB7XFxuYDtcblxuICAgIC8vIFRhaWxzY2FsZS1vbmx5IGFjY2VzcyByZXN0cmljdGlvblxuICAgIGlmICh0YWlsc2NhbGVPbmx5KSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICBAYmxvY2tlZCBub3QgcmVtb3RlX2lwIDEwMC42NC4wLjAvMTBcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgcmVzcG9uZCBAYmxvY2tlZCBcIkFjY2VzcyBkZW5pZWQuIFRhaWxzY2FsZSBjb25uZWN0aW9uIHJlcXVpcmVkLlwiIDQwM1xcbmA7XG4gICAgfVxuXG4gICAgLy8gU1NMIENvbmZpZ3VyYXRpb25cbiAgICBzd2l0Y2ggKHNzbFR5cGUpIHtcbiAgICAgIGNhc2UgJ2xldHNlbmNyeXB0JzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjYWRkeS1tYW5hZ2VkJzpcbiAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgdGxzIGludGVybmFsXFxuYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdleGlzdGluZy1jYSc6XG4gICAgICAgIGlmIChleGlzdGluZ0NhKSB7XG4gICAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgdGxzIHtcXG4gICAgY2EgJHtleGlzdGluZ0NhfVxcbiAgfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjdXN0b20tY2EnOlxuICAgICAgICBpZiAoY2FOYW1lKSB7XG4gICAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgdGxzIHtcXG4gICAgY2EgJHtjYU5hbWV9XFxuICB9XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBBdXRoZW50aWNhdGlvblxuICAgIGlmIChlbmFibGVBdXRoKSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICBiYXNpY2F1dGgge1xcbiAgICBhZG1pbiAkMmEkMTQkaGFzaGVkX3Bhc3N3b3JkX2hlcmVcXG4gIH1cXG5gO1xuICAgIH1cblxuICAgIC8vIENPUlMgSGVhZGVyc1xuICAgIGlmIChlbmFibGVDb3JzKSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICBoZWFkZXIge1xcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiBcIipcIlxcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIEFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMgXCJHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBPUFRJT05TXCJcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgICBBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzIFwiQ29udGVudC1UeXBlLCBBdXRob3JpemF0aW9uXCJcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgfVxcbmA7XG4gICAgfVxuXG4gICAgLy8gQ3VzdG9tIEhlYWRlcnNcbiAgICBpZiAoY3VzdG9tSGVhZGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IEpTT04ucGFyc2UoY3VzdG9tSGVhZGVycyk7XG4gICAgICAgIGNhZGR5Q29uZmlnICs9IGAgIGhlYWRlciB7XFxuYDtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgICAke2tleX0gXCIke3ZhbHVlfVwiXFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhZGR5Q29uZmlnICs9IGAgIH1cXG5gO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgSlNPTiBpbiBjdXN0b20gaGVhZGVycycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhlYWx0aCBDaGVja1xuICAgIGlmIChoZWFsdGhDaGVjaykge1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgaGVhbHRoX3VyaSAke2hlYWx0aENoZWNrfVxcbmA7XG4gICAgfVxuXG4gICAgLy8gUmV2ZXJzZSBQcm94eVxuICAgIGNhZGR5Q29uZmlnICs9IGAgIHJldmVyc2VfcHJveHkgJHtpcH06JHtwb3J0fSB7XFxuYDtcbiAgICBpZiAodXBzdHJlYW1QYXRoICYmIHVwc3RyZWFtUGF0aCAhPT0gJy8nKSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIHJld3JpdGUgJHt1cHN0cmVhbVBhdGh9XFxuYDtcbiAgICB9XG4gICAgaWYgKHRpbWVvdXQgJiYgdGltZW91dCAhPT0gMzApIHtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgdHJhbnNwb3J0IGh0dHAge1xcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgICAgZGlhbF90aW1lb3V0ICR7dGltZW91dH1zXFxuYDtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgICByZXNwb25zZV9oZWFkZXJfdGltZW91dCAke3RpbWVvdXR9c1xcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIH1cXG5gO1xuICAgIH1cbiAgICBjYWRkeUNvbmZpZyArPSBgICB9XFxuYDtcblxuICAgIGNhZGR5Q29uZmlnICs9IGB9XFxuYDtcblxuICAgIHJldHVybiBjYWRkeUNvbmZpZztcbiAgfVxuXG4gIC8vID09PT09IENSRUFURSBETlMgUkVDT1JEID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRG5zUmVjb3JkKHN1YmRvbWFpbiwgaXAsIHR0bCA9IERDLkRFRkFVTFRTLlRUTCkge1xuICAgIGNvbnN0IGRuc1Rva2VuID0gd2luZG93LmdldFRva2VuKGdldFByaW1hcnlEbnNJZCgpLCAnYWRtaW4nKTtcblxuICAgIGlmICghZG5zVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRE5TIGFkbWluIHRva2VuIG5vdCBjb25maWd1cmVkLiBQbGVhc2Ugc2V0IGl0IGluIHRoZSBUb2tlbnMgbWVudS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkb21haW4gPSBidWlsZERvbWFpbihzdWJkb21haW4pO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9kbnMvcmVjb3JkJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZG9tYWluOiBkb21haW4sXG4gICAgICAgIGlwOiBpcCxcbiAgICAgICAgdHRsOiB0dGwsXG4gICAgICAgIHRva2VuOiBkbnNUb2tlbixcbiAgICAgICAgc2VydmVyOiBTSVRFLmRuc0lwXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBETlMgQVBJIEVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke2Vycm9yVGV4dH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBETlMgRXJyb3I6ICR7cmVzdWx0LmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gPT09PT0gQUREIFNFUlZJQ0UgVE8gQ09ORklHID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gYWRkU2VydmljZVRvQ29uZmlnKHNlcnZpY2VDb25maWcpIHtcbiAgICBjb25zdCBuZXdTZXJ2aWNlID0ge1xuICAgICAgaWQ6IHNlcnZpY2VDb25maWcuc3ViZG9tYWluLFxuICAgICAgbmFtZTogc2VydmljZUNvbmZpZy5uYW1lLFxuICAgICAgbG9nbzogc2VydmljZUNvbmZpZy5sb2dvIHx8IGAvYXNzZXRzLyR7c2VydmljZUNvbmZpZy5zdWJkb21haW59LnBuZ2BcbiAgICB9O1xuICAgIC8vIEZvcndhcmQgb3B0aW9uYWwgbWV0YWRhdGEgZmllbGRzIGlmIHByb3ZpZGVkXG4gICAgaWYgKHNlcnZpY2VDb25maWcuY2F0ZWdvcnkpIG5ld1NlcnZpY2UuY2F0ZWdvcnkgPSBzZXJ2aWNlQ29uZmlnLmNhdGVnb3J5O1xuICAgIGlmIChzZXJ2aWNlQ29uZmlnLmNvbnRhaW5lcklkKSBuZXdTZXJ2aWNlLmNvbnRhaW5lcklkID0gc2VydmljZUNvbmZpZy5jb250YWluZXJJZDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG5ld1NlcnZpY2UpXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBzZXJ2aWNlJyk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHdpbmRvdy5sb2FkU2VydmljZXMoKTtcbiAgICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcblxuICAgICAgcmV0dXJuIG5ld1NlcnZpY2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBhZGQgc2VydmljZSB0byBjb25maWc6JywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gQUREIFRPIENBRERZRklMRSA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFkZFRvQ2FkZHlmaWxlKGNvbmZpZykge1xuICAgIGNvbnN0IHN1YmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWlwLWlucHV0JykudmFsdWUudHJpbSgpIHx8ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUudHJpbSgpIHx8ICc4MCc7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NpdGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBkb21haW46IGJ1aWxkRG9tYWluKHN1YmRvbWFpbiksXG4gICAgICAgIHVwc3RyZWFtOiBgJHtpcH06JHtwb3J0fWAsXG4gICAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmICghcmVzcG9uc2Uub2sgfHwgIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8IGBDYWRkeSBBUEkgRXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gPT09PT0gV0lORE9XIEVYUE9SVFMgPT09PT1cblxuICB3aW5kb3cubG9hZEV4aXN0aW5nQ0FzID0gbG9hZEV4aXN0aW5nQ0FzO1xuICB3aW5kb3cuZ2VuZXJhdGVDYWRkeUNvbmZpZyA9IGdlbmVyYXRlQ2FkZHlDb25maWc7XG4gIHdpbmRvdy5jcmVhdGVEbnNSZWNvcmQgPSBjcmVhdGVEbnNSZWNvcmQ7XG4gIHdpbmRvdy5hZGRTZXJ2aWNlVG9Db25maWcgPSBhZGRTZXJ2aWNlVG9Db25maWc7XG4gIHdpbmRvdy5hZGRUb0NhZGR5ZmlsZSA9IGFkZFRvQ2FkZHlmaWxlO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIENSVUQgPT09PT09PT09PVxuLy8gRWRpdCwgZGVsZXRlLCBhbmQgdXBkYXRlIG9wZXJhdGlvbnMgZm9yIGV4aXN0aW5nIHNlcnZpY2VzLlxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyA9PT09PSBTRVJWSUNFIEVESVQgTU9EQUwgPT09PT1cbiAgbGV0IGN1cnJlbnRFZGl0U2VydmljZSA9IG51bGw7XG5cbiAgZnVuY3Rpb24gb3BlblNlcnZpY2VFZGl0TW9kYWwoc2VydmljZSkge1xuICAgIGN1cnJlbnRFZGl0U2VydmljZSA9IHNlcnZpY2U7XG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LW1vZGFsJyk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LXRpdGxlJykudGV4dENvbnRlbnQgPSBgRWRpdCAke3NlcnZpY2UubmFtZX1gO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtbmFtZScpLnZhbHVlID0gc2VydmljZS5uYW1lO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtdXJsLWRpc3BsYXknKS50ZXh0Q29udGVudCA9IHNlcnZpY2UudXJsIHx8IGJ1aWxkU2VydmljZVVybChzZXJ2aWNlLmlkKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zZXJ2aWNlLWxvZ28tcHJldmlldycpLnNyYyA9IHNlcnZpY2UubG9nbyB8fCBgL2Fzc2V0cy8ke3NlcnZpY2UuaWR9LnBuZ2A7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc3ViZG9tYWluJykudmFsdWUgPSBzZXJ2aWNlLmlkO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXBvcnQnKS52YWx1ZSA9IHNlcnZpY2UucG9ydCB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1pcCcpLnZhbHVlID0gc2VydmljZS5pcCB8fCAnbG9jYWxob3N0JztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC10YWlsc2NhbGUtb25seScpLmNoZWNrZWQgPSBzZXJ2aWNlLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2U7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtbG9nby11cmwnKS52YWx1ZSA9IHNlcnZpY2UubG9nbyB8fCAnJztcblxuICAgIC8vIFBvcHVsYXRlIHRoZSBjYXRlZ29yeSBzZWxlY3QgZm9yIHRoaXMgc2VydmljZSwgdGhlbiBzZXQgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgLy8gcG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMoKSB1c2VzIGRhdGEtY3VycmVudCBzbyB3ZSBzZXQgaXQgZmlyc3QsIHRoZW4gY2FsbC5cbiAgICBjb25zdCBjYXRlZ29yeVNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtY2F0ZWdvcnknKTtcbiAgICBpZiAoY2F0ZWdvcnlTZWxlY3QpIHtcbiAgICAgIGNhdGVnb3J5U2VsZWN0LmRhdGFzZXQuY3VycmVudCA9IHNlcnZpY2UuY2F0ZWdvcnkgfHwgJyc7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5wb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cucG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVNlcnZpY2VFZGl0TW9kYWwoKSB7XG4gICAgY2xvc2VNb2RhbCgnc2VydmljZS1lZGl0LW1vZGFsJyk7XG4gICAgY3VycmVudEVkaXRTZXJ2aWNlID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmVTZXJ2aWNlQ2hhbmdlcygpIHtcbiAgICBpZiAoIWN1cnJlbnRFZGl0U2VydmljZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3U3ViZG9tYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc3ViZG9tYWluJykudmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbmV3TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBuZXdQb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtcG9ydCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBuZXdJcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LWlwJykudmFsdWUudHJpbSgpIHx8ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHRhaWxzY2FsZU9ubHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC10YWlsc2NhbGUtb25seScpLmNoZWNrZWQ7XG4gICAgY29uc3QgbmV3TG9nbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LWxvZ28tdXJsJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IG5ld0NhdGVnb3J5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc2VydmljZS1jYXRlZ29yeScpPy52YWx1ZSB8fCAnJztcblxuICAgIGlmICghbmV3U3ViZG9tYWluKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdTdWJkb21haW4gaXMgcmVxdWlyZWQnLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFN1YmRvbWFpbiA9IGN1cnJlbnRFZGl0U2VydmljZS5pZDtcbiAgICBjb25zdCBjaGFuZ2VzID0gW107XG5cbiAgICBpZiAobmV3U3ViZG9tYWluICE9PSBvbGRTdWJkb21haW4pIGNoYW5nZXMucHVzaCgnc3ViZG9tYWluJyk7XG4gICAgaWYgKG5ld05hbWUgJiYgbmV3TmFtZSAhPT0gY3VycmVudEVkaXRTZXJ2aWNlLm5hbWUpIGNoYW5nZXMucHVzaCgnbmFtZScpO1xuICAgIGlmIChuZXdQb3J0ICYmIG5ld1BvcnQgIT09IFN0cmluZyhjdXJyZW50RWRpdFNlcnZpY2UucG9ydCkpIGNoYW5nZXMucHVzaCgncG9ydCcpO1xuICAgIGlmIChuZXdJcCAhPT0gY3VycmVudEVkaXRTZXJ2aWNlLmlwKSBjaGFuZ2VzLnB1c2goJ2lwJyk7XG4gICAgaWYgKHRhaWxzY2FsZU9ubHkgIT09IChjdXJyZW50RWRpdFNlcnZpY2UudGFpbHNjYWxlT25seSB8fCBmYWxzZSkpIGNoYW5nZXMucHVzaCgndGFpbHNjYWxlJyk7XG4gICAgaWYgKG5ld0xvZ28gJiYgbmV3TG9nbyAhPT0gY3VycmVudEVkaXRTZXJ2aWNlLmxvZ28pIGNoYW5nZXMucHVzaCgnbG9nbycpO1xuICAgIGlmIChuZXdDYXRlZ29yeSAhPT0gKGN1cnJlbnRFZGl0U2VydmljZS5jYXRlZ29yeSB8fCAnJykpIGNoYW5nZXMucHVzaCgnY2F0ZWdvcnknKTtcblxuICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2xvc2VTZXJ2aWNlRWRpdE1vZGFsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2F2ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWVkaXQtc2F2ZScpO1xuICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2aW5nLi4uJztcbiAgICBzYXZlQnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlcnZpY2VzL3VwZGF0ZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgb2xkU3ViZG9tYWluLFxuICAgICAgICAgIG5ld1N1YmRvbWFpbixcbiAgICAgICAgICBuYW1lOiBuZXdOYW1lIHx8IGN1cnJlbnRFZGl0U2VydmljZS5uYW1lLFxuICAgICAgICAgIHBvcnQ6IG5ld1BvcnQgfHwgY3VycmVudEVkaXRTZXJ2aWNlLnBvcnQsXG4gICAgICAgICAgaXA6IG5ld0lwLFxuICAgICAgICAgIHRhaWxzY2FsZU9ubHksXG4gICAgICAgICAgbG9nbzogbmV3TG9nbyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgY2F0ZWdvcnk6IG5ld0NhdGVnb3J5XG4gICAgICAgIH0pXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gdXBkYXRlIHNlcnZpY2UnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGxvY2FsIEFQUFMgYXJyYXkgdG8gbWF0Y2hcbiAgICAgIGNvbnN0IGFwcEluZGV4ID0gd2luZG93LkFQUFMuZmluZEluZGV4KGEgPT4gYS5pZCA9PT0gb2xkU3ViZG9tYWluKTtcbiAgICAgIGlmIChhcHBJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgd2luZG93LkFQUFNbYXBwSW5kZXhdID0ge1xuICAgICAgICAgIC4uLndpbmRvdy5BUFBTW2FwcEluZGV4XSxcbiAgICAgICAgICBpZDogbmV3U3ViZG9tYWluLFxuICAgICAgICAgIG5hbWU6IG5ld05hbWUgfHwgd2luZG93LkFQUFNbYXBwSW5kZXhdLm5hbWUsXG4gICAgICAgICAgcG9ydDogbmV3UG9ydCB8fCB3aW5kb3cuQVBQU1thcHBJbmRleF0ucG9ydCxcbiAgICAgICAgICBpcDogbmV3SXAsXG4gICAgICAgICAgdGFpbHNjYWxlT25seSxcbiAgICAgICAgICBsb2dvOiBuZXdMb2dvIHx8IHdpbmRvdy5BUFBTW2FwcEluZGV4XS5sb2dvLFxuICAgICAgICAgIGNhdGVnb3J5OiBuZXdDYXRlZ29yeSB8fCB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2xvc2VTZXJ2aWNlRWRpdE1vZGFsKCk7XG4gICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNhdmluZyBzZXJ2aWNlIGNoYW5nZXM6JywgZXJyb3IpO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3Igc2F2aW5nIGNoYW5nZXM6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZlIENoYW5nZXMnO1xuICAgICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIExvZ28gZmlsZSB1cGxvYWQgaGFuZGxlclxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1sb2dvLWZpbGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXN5bmMgKGUpID0+IHtcbiAgICBjb25zdCBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG5cbiAgICBpZiAoIWZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIHNlbGVjdCBhbiBpbWFnZSBmaWxlJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFVcmwgPSBldmVudC50YXJnZXQucmVzdWx0O1xuXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zZXJ2aWNlLWxvZ28tcHJldmlldycpLnNyYyA9IGRhdGFVcmw7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1sb2dvLXVybCcpLnZhbHVlID0gZGF0YVVybDtcblxuICAgICAgaWYgKGN1cnJlbnRFZGl0U2VydmljZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXNzZXRzL3VwbG9hZCcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGZpbGVuYW1lOiBgJHtjdXJyZW50RWRpdFNlcnZpY2UuaWR9LnBuZ2AsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFVcmxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQucGF0aCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtbG9nby11cmwnKS52YWx1ZSA9IHJlc3VsdC5wYXRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGF0YSBVUkxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gIH0pO1xuXG4gIC8vIFNlcnZpY2UgZWRpdCBtb2RhbCBldmVudCBsaXN0ZW5lcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZWRpdC1jYW5jZWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZVNlcnZpY2VFZGl0TW9kYWwpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlU2VydmljZUNoYW5nZXMpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LW1vZGFsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQuaWQgPT09ICdzZXJ2aWNlLWVkaXQtbW9kYWwnKSBjbG9zZVNlcnZpY2VFZGl0TW9kYWwoKTtcbiAgfSk7XG5cbiAgLy8gPT09PT0gREVMRVRFIFNFUlZJQ0UgTU9EQUwgPT09PT1cblxuICBmdW5jdGlvbiBzaG93RGVsZXRlTW9kYWwoc2VydmljZU5hbWUsIGhhc0NvbnRhaW5lciwgY29udGFpbmVySWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1zZXJ2aWNlLW1vZGFsJyk7XG4gICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtdGl0bGUnKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLW1lc3NhZ2UnKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckluZm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLWNvbnRhaW5lci1pbmZvJyk7XG4gICAgICBjb25zdCBjb250YWluZXJOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC1jb250YWluZXItbmFtZScpO1xuICAgICAgY29uc3QgaGVscCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtaGVscCcpO1xuICAgICAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC1jYW5jZWwnKTtcbiAgICAgIGNvbnN0IHJlbW92ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtcmVtb3ZlJyk7XG4gICAgICBjb25zdCBkZWxldGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLWRlbGV0ZScpO1xuXG4gICAgICB0aXRsZS50ZXh0Q29udGVudCA9IGBEZWxldGUgXCIke3NlcnZpY2VOYW1lfVwiYDtcblxuICAgICAgaWYgKGhhc0NvbnRhaW5lcikge1xuICAgICAgICBtZXNzYWdlLmlubmVySFRNTCA9ICdUaGlzIHNlcnZpY2UgaGFzIGFuIGFzc29jaWF0ZWQgRG9ja2VyIGNvbnRhaW5lci48YnI+Q2hvb3NlIGhvdyB0byBwcm9jZWVkOic7XG4gICAgICAgIGNvbnRhaW5lckluZm8uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGNvbnRhaW5lck5hbWUudGV4dENvbnRlbnQgPSBgQ29udGFpbmVyIElEOiAke2NvbnRhaW5lcklkPy5zbGljZSgwLCAxMikgfHwgJ1Vua25vd24nfWA7XG4gICAgICAgIGhlbHAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRlbGV0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UudGV4dENvbnRlbnQgPSAnUmVtb3ZlIHRoaXMgc2VydmljZSBmcm9tIHRoZSBkYXNoYm9hcmQ/JztcbiAgICAgICAgY29udGFpbmVySW5mby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBoZWxwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRlbGV0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICAgIGNhbmNlbEJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNhbmNlbCk7XG4gICAgICAgIHJlbW92ZUJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVJlbW92ZSk7XG4gICAgICAgIGRlbGV0ZUJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZURlbGV0ZSk7XG4gICAgICAgIG1vZGFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQmFja2Ryb3ApO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4geyBjbGVhbnVwKCk7IHJlc29sdmUobnVsbCk7IH07XG4gICAgICBjb25zdCBoYW5kbGVSZW1vdmUgPSAoKSA9PiB7IGNsZWFudXAoKTsgcmVzb2x2ZShmYWxzZSk7IH07XG4gICAgICBjb25zdCBoYW5kbGVEZWxldGUgPSAoKSA9PiB7IGNsZWFudXAoKTsgcmVzb2x2ZSh0cnVlKTsgfTtcbiAgICAgIGNvbnN0IGhhbmRsZUJhY2tkcm9wID0gKGUpID0+IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgeyBjbGVhbnVwKCk7IHJlc29sdmUobnVsbCk7IH0gfTtcblxuICAgICAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQ2FuY2VsKTtcbiAgICAgIHJlbW92ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVJlbW92ZSk7XG4gICAgICBkZWxldGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVEZWxldGUpO1xuICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVCYWNrZHJvcCk7XG5cbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09IFVQREFURSBDT05UQUlORVIgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVDb250YWluZXIoY29udGFpbmVySWQsIHNlcnZpY2VOYW1lLCBzZXJ2aWNlSWQpIHtcbiAgICBjb25zdCB1cGRhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdXBkYXRlLWJ0bi0ke3NlcnZpY2VJZH1gKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSB1cGRhdGVCdG4/LnRleHRDb250ZW50O1xuXG4gICAgaWYgKCFjb25maXJtKGBVcGRhdGUgJHtzZXJ2aWNlTmFtZX0gdG8gdGhlIGxhdGVzdCB2ZXJzaW9uP1xcblxcblRoaXMgd2lsbDpcXG4xLiBQdWxsIHRoZSBsYXRlc3QgaW1hZ2VcXG4yLiBTdG9wIHRoZSBjb250YWluZXJcXG4zLiBSZWNyZWF0ZSB3aXRoIHNhbWUgc2V0dGluZ3NcXG5cXG5UaGUgc2VydmljZSB3aWxsIGJlIGJyaWVmbHkgdW5hdmFpbGFibGUuYCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHVwZGF0ZUJ0bikge1xuICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSAnXFx1ezFGNTA0fSc7XG4gICAgICAgIHVwZGF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHVwZGF0ZUJ0bi50aXRsZSA9ICdVcGRhdGluZy4uLic7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2NvbnRhaW5lcklkfS91cGRhdGVgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHdpbmRvdy5BUFBTLmZpbmQoYXBwID0+IGFwcC5pZCA9PT0gc2VydmljZUlkKTtcbiAgICAgICAgaWYgKHNlcnZpY2UgJiYgcmVzdWx0Lm5ld0NvbnRhaW5lcklkKSB7XG4gICAgICAgICAgc2VydmljZS5jb250YWluZXJJZCA9IHJlc3VsdC5uZXdDb250YWluZXJJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGVCdG4pIHtcbiAgICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSAnXFx1ezI3MDV9JztcbiAgICAgICAgICB1cGRhdGVCdG4udGl0bGUgPSAnVXBkYXRlZCBzdWNjZXNzZnVsbHkhJztcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgICAgIHVwZGF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBjb250YWluZXIgdG8gbGF0ZXN0IHZlcnNpb24nO1xuICAgICAgICAgIH0sIDMwMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB3aW5kb3cucmVmcmVzaEFsbCgpLCAyMDAwKTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtzZXJ2aWNlTmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkhYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ1VwZGF0ZSBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVXBkYXRlIGVycm9yOicsIGVycm9yKTtcblxuICAgICAgaWYgKHVwZGF0ZUJ0bikge1xuICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSAnXFx1ezI3NEN9JztcbiAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBmYWlsZWQnO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICAgICAgdXBkYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBjb250YWluZXIgdG8gbGF0ZXN0IHZlcnNpb24nO1xuICAgICAgICB9LCAzMDAwKTtcbiAgICAgIH1cblxuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHVwZGF0ZSAke3NlcnZpY2VOYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IERFTEVURSBTRVJWSUNFID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGVsZXRlU2VydmljZShzZXJ2aWNlSWQsIHNlcnZpY2VOYW1lKSB7XG4gICAgY29uc3Qgc2VydmljZSA9IHdpbmRvdy5BUFBTLmZpbmQoYXBwID0+IGFwcC5pZCA9PT0gc2VydmljZUlkKTtcbiAgICBjb25zdCBkb21haW4gPSBzZXJ2aWNlID8gYnVpbGREb21haW4oc2VydmljZS5pZCkgOiBudWxsO1xuICAgIGNvbnN0IGhhc0NvbnRhaW5lciA9IHNlcnZpY2U/LmNvbnRhaW5lcklkO1xuXG4gICAgY29uc3QgZGVsZXRlQ29udGFpbmVyID0gYXdhaXQgc2hvd0RlbGV0ZU1vZGFsKHNlcnZpY2VOYW1lIHx8IHNlcnZpY2VJZCwgaGFzQ29udGFpbmVyLCBzZXJ2aWNlPy5jb250YWluZXJJZCk7XG5cbiAgICBpZiAoZGVsZXRlQ29udGFpbmVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm47IC8vIFVzZXIgY2FuY2VsbGVkXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdHMgPSB7XG4gICAgICBkYXNoYm9hcmQ6IGZhbHNlLFxuICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgZG5zOiBudWxsLFxuICAgICAgY2FkZHk6IG51bGwsXG4gICAgICBzZXJ2aWNlOiBudWxsXG4gICAgfTtcblxuICAgIC8vIEZ1bGwgcmVtb3ZhbCB3aXRoIGNvbnRhaW5lclxuICAgIGlmIChkZWxldGVDb250YWluZXIgJiYgaGFzQ29udGFpbmVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICBjb250YWluZXJJZDogc2VydmljZS5jb250YWluZXJJZCxcbiAgICAgICAgICBzdWJkb21haW46IHNlcnZpY2UuaWQsXG4gICAgICAgICAgaXA6IHNlcnZpY2UuaXAgfHwgJ2xvY2FsaG9zdCcsXG4gICAgICAgICAgZGVsZXRlQ29udGFpbmVyOiAndHJ1ZSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9hcHBzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2UuaWQpfT8ke3BhcmFtcy50b1N0cmluZygpfWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cyA9IHsgLi4ucmVzdWx0cywgLi4ucmVzdWx0LnJlc3VsdHMsIGRhc2hib2FyZDogZmFsc2UgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBcHAgcmVtb3ZhbCBmYWlsZWQ6JywgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXBwIHJlbW92YWwgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVsZXRlQ29udGFpbmVyICYmIGRvbWFpbikge1xuICAgICAgLy8gRmFsbGJhY2sgZm9yIG1hbnVhbGx5IGFkZGVkIHNlcnZpY2VzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlSVAgPSBzZXJ2aWNlPy5pcCB8fCAnbG9jYWxob3N0JztcbiAgICAgICAgY29uc3QgZG5zUmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9kbnMvcmVjb3JkP2RvbWFpbj0ke2VuY29kZVVSSUNvbXBvbmVudChkb21haW4pfSZ0eXBlPUEmaXBBZGRyZXNzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2VJUCl9JnNlcnZlcj0ke1NJVEUuZG5zSXB9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ0RFTEVURSdcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRuc1Jlc3VsdCA9IGF3YWl0IGRuc1Jlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmVzdWx0cy5kbnMgPSBkbnNSZXN1bHQuc3VjY2VzcyA/ICdkZWxldGVkJyA6IChkbnNSZXN1bHQuZXJyb3IgfHwgJ2ZhaWxlZCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXN1bHRzLmRucyA9IGUubWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2FkZHlSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NpdGUvJHtlbmNvZGVVUklDb21wb25lbnQoZG9tYWluKX1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnREVMRVRFJ1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2FkZHlSZXN1bHQgPSBhd2FpdCBjYWRkeVJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmVzdWx0cy5jYWRkeSA9IChjYWRkeVJlc3VsdC5zdWNjZXNzIHx8IChjYWRkeVJlc3VsdC5lcnJvciAmJiBjYWRkeVJlc3VsdC5lcnJvci5pbmNsdWRlcygnbm90IGZvdW5kJykpKSA/ICdyZW1vdmVkJyA6IChjYWRkeVJlc3VsdC5lcnJvciB8fCAnZmFpbGVkJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlc3VsdHMuY2FkZHkgPSBlLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gQVBQUyBhcnJheVxuICAgIGNvbnN0IGluZGV4ID0gd2luZG93LkFQUFMuZmluZEluZGV4KGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2VJZCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHdpbmRvdy5BUFBTLnNwbGljZShpbmRleCwgMSk7XG4gICAgICByZXN1bHRzLmRhc2hib2FyZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gbG9jYWxTdG9yYWdlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1c3RvbUFwcHMgPSBzYWZlR2V0SlNPTignY3VzdG9tLWFwcHMnLCBbXSk7XG4gICAgICBjb25zdCBsb2NhbEluZGV4ID0gY3VzdG9tQXBwcy5maW5kSW5kZXgoYXBwID0+IGFwcC5pZCA9PT0gc2VydmljZUlkKTtcbiAgICAgIGlmIChsb2NhbEluZGV4ID4gLTEpIHtcbiAgICAgICAgY3VzdG9tQXBwcy5zcGxpY2UobG9jYWxJbmRleCwgMSk7XG4gICAgICAgIHNhZmVTZXQoJ2N1c3RvbS1hcHBzJywgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElnbm9yZSBsb2NhbFN0b3JhZ2UgZXJyb3JzXG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gc2VydmljZXMuanNvbiB2aWEgQVBJXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNlcnZpY2VSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2VJZCl9YCwge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNlcnZpY2VSZXN1bHQgPSBhd2FpdCBzZXJ2aWNlUmVzcG9uc2UuanNvbigpO1xuICAgICAgcmVzdWx0cy5zZXJ2aWNlID0gc2VydmljZVJlc3VsdC5zdWNjZXNzID8gJ3JlbW92ZWQnIDogKHNlcnZpY2VSZXN1bHQuZXJyb3IgfHwgJ2ZhaWxlZCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlc3VsdHMuc2VydmljZSA9IGUubWVzc2FnZTtcbiAgICB9XG5cbiAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgd2luZG93LnJlZnJlc2hBbGwoKTtcblxuICAgIC8vIE9ubHkgc2hvdyBhbGVydCBpZiB0aGVyZSBhcmUgYWN0dWFsIGVycm9yc1xuICAgIGxldCBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBsZXQgZXJyb3JNZXNzYWdlcyA9IFtdO1xuXG4gICAgaWYgKCFyZXN1bHRzLmRhc2hib2FyZCkge1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaCgnXFx1ezI3MTd9IEZhaWxlZCB0byByZW1vdmUgZnJvbSBkYXNoYm9hcmQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWNjZXNzU3RhdGVzID0gWydyZW1vdmVkJywgJ2FscmVhZHkgcmVtb3ZlZCcsICdub3QgZm91bmQnLCAnZGVsZXRlZCcsICdrZXB0ICh1c2VyIGNob2ljZSknLCAnc2tpcHBlZCcsICdubyBzdWNoIHJlY29yZCcsICdkb2VzIG5vdCBleGlzdCddO1xuICAgIGNvbnN0IGlzU3VjY2VzcyA9ICh2YWwpID0+ICF2YWwgfHwgc3VjY2Vzc1N0YXRlcy5zb21lKHMgPT4gdmFsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocy50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICBpZiAocmVzdWx0cy5jb250YWluZXIgJiYgIWlzU3VjY2VzcyhyZXN1bHRzLmNvbnRhaW5lcikpIHtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFxcdXsyNkEwfSBDb250YWluZXI6ICR7cmVzdWx0cy5jb250YWluZXJ9YCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHRzLmRucyAmJiAhaXNTdWNjZXNzKHJlc3VsdHMuZG5zKSkge1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaChgXFx1ezI2QTB9IEROUyBSZWNvcmQ6ICR7cmVzdWx0cy5kbnN9YCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHRzLmNhZGR5ICYmICFpc1N1Y2Nlc3MocmVzdWx0cy5jYWRkeSkpIHtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFxcdXsyNkEwfSBDYWRkeSBDb25maWc6ICR7cmVzdWx0cy5jYWRkeX1gKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdHMuc2VydmljZSAmJiAhaXNTdWNjZXNzKHJlc3VsdHMuc2VydmljZSkpIHtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFxcdXsyNkEwfSBTZXJ2aWNlIEZpbGU6ICR7cmVzdWx0cy5zZXJ2aWNlfWApO1xuICAgIH1cblxuICAgIGlmIChoYXNFcnJvcnMpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yIGRlbGV0aW5nIFwiJHtzZXJ2aWNlTmFtZSB8fCBzZXJ2aWNlSWR9XCI6ICR7ZXJyb3JNZXNzYWdlcy5qb2luKCcsICcpfWAsICdlcnJvcicsIDYwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IFdJTkRPVyBFWFBPUlRTID09PT09XG5cbiAgd2luZG93Lm9wZW5TZXJ2aWNlRWRpdE1vZGFsID0gb3BlblNlcnZpY2VFZGl0TW9kYWw7XG4gIHdpbmRvdy5zaG93RGVsZXRlTW9kYWwgPSBzaG93RGVsZXRlTW9kYWw7XG4gIHdpbmRvdy51cGRhdGVDb250YWluZXIgPSB1cGRhdGVDb250YWluZXI7XG4gIHdpbmRvdy5kZWxldGVTZXJ2aWNlID0gZGVsZXRlU2VydmljZTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gU0VSVklDRSBDUkVBVElPTiA9PT09PT09PT09XG4vLyBBZGQgc2VydmljZSBtb2RhbCwgbG9jYWwvZXh0ZXJuYWwgc2VydmljZSBjcmVhdGlvbiBmbG93cywgYW5kIGV2ZW50IHdpcmluZy5cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gPT09PT0gU1VCRE9NQUlOIEFVVE8tREVSSVZFID09PT09XG5cbiAgZnVuY3Rpb24gZGVyaXZlU3ViZG9tYWluKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICcnKS5yZXBsYWNlKC8tKy9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNtYXJ0U3NsRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gU0lURS5kZWZhdWx0cz8uc3NsVHlwZSB8fCAoU0lURS5jb25maWd1cmF0aW9uVHlwZSA9PT0gJ3B1YmxpYycgPyAnbGV0c2VuY3J5cHQnIDogJ2NhZGR5LW1hbmFnZWQnKTtcbiAgfVxuXG4gIC8vID09PT09IFNFUlZJQ0UgUFJFVklFVyA9PT09PVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KCkge1xuICAgIGNvbnN0IHN1YmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcpLnZhbHVlIHx8ICdzdWJkb21haW4nO1xuICAgIGNvbnN0IGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKS52YWx1ZSB8fCBRVUlDS19JUFMubGFuIHx8ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUgfHwgREMuREVGQVVMVFMuU0VSVklDRV9QT1JUO1xuICAgIGNvbnN0IHNzbFR5cGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3NsLXR5cGUtc2VsZWN0JykudmFsdWU7XG4gICAgY29uc3QgY2FOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhLW5hbWUtaW5wdXQnKS52YWx1ZSB8fCAnc2FtaS1jYSc7XG4gICAgY29uc3QgZXhpc3RpbmdDYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGlzdGluZy1jYS1zZWxlY3QnKS52YWx1ZTtcbiAgICBjb25zdCBlbmFibGVBdXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1hdXRoJykuY2hlY2tlZDtcbiAgICBjb25zdCBlbmFibGVDb3JzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1jb3JzJykuY2hlY2tlZDtcbiAgICBjb25zdCBjdXN0b21IZWFkZXJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1c3RvbS1oZWFkZXJzLWlucHV0JykudmFsdWU7XG4gICAgY29uc3QgdXBzdHJlYW1QYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Vwc3RyZWFtLXBhdGgtaW5wdXQnKS52YWx1ZSB8fCAnLyc7XG4gICAgY29uc3QgaGVhbHRoQ2hlY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWlucHV0JykudmFsdWU7XG4gICAgY29uc3QgdGltZW91dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aW1lb3V0LWlucHV0JykudmFsdWUgfHwgMzA7XG5cbiAgICBjb25zdCBkbnNQcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1wcmV2aWV3Jyk7XG4gICAgaWYgKGRuc1ByZXZpZXcpIGRuc1ByZXZpZXcudGV4dENvbnRlbnQgPSBgJHtidWlsZERvbWFpbihzdWJkb21haW4pfSBcXHUyMTkyICR7aXB9YDtcblxuICAgIGNvbnN0IHVybFByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsLXByZXZpZXcnKTtcbiAgICBpZiAodXJsUHJldmlldykgdXJsUHJldmlldy50ZXh0Q29udGVudCA9IGJ1aWxkU2VydmljZVVybChzdWJkb21haW4pO1xuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgc3ViZG9tYWluLCBwb3J0LCBpcCwgc3NsVHlwZSwgY2FOYW1lLCBleGlzdGluZ0NhLFxuICAgICAgZW5hYmxlQXV0aCwgZW5hYmxlQ29ycywgY3VzdG9tSGVhZGVycywgdXBzdHJlYW1QYXRoLCBoZWFsdGhDaGVjaywgdGltZW91dFxuICAgIH07XG5cbiAgICBjb25zdCBjYWRkeUNvbmZpZyA9IHdpbmRvdy5nZW5lcmF0ZUNhZGR5Q29uZmlnKGNvbmZpZyk7XG4gICAgY29uc3QgY29uZmlnUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWRkeS1jb25maWctcHJldmlldycpO1xuICAgIGlmIChjb25maWdQcmV2aWV3KSBjb25maWdQcmV2aWV3LnZhbHVlID0gY2FkZHlDb25maWc7XG4gIH1cblxuICAvLyA9PT09PSBRVUlDSyBJUCBDT05GSUdVUkFUSU9OID09PT09XG5cbiAgY29uc3QgUVVJQ0tfSVBTID0ge1xuICAgIGxvY2FsaG9zdDogJzEyNy4wLjAuMScsXG4gICAgbGFuOiAnJyxcbiAgICB0YWlsc2NhbGU6ICcnXG4gIH07XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGV0ZWN0TmV0d29ya0lQcygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9uZXR3b3JrL2lwcycsIHtcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDIwMDApXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5sYW4pIFFVSUNLX0lQUy5sYW4gPSBkYXRhLmxhbjtcbiAgICAgICAgaWYgKGRhdGEudGFpbHNjYWxlKSBRVUlDS19JUFMudGFpbHNjYWxlID0gZGF0YS50YWlsc2NhbGU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQVBJIG5vdCBhdmFpbGFibGVcbiAgICB9XG5cbiAgICBjb25zdCBsYW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2staXAtbGFuJyk7XG4gICAgY29uc3QgdHNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2staXAtdGFpbHNjYWxlJyk7XG4gICAgaWYgKGxhbkJ0bikge1xuICAgICAgaWYgKFFVSUNLX0lQUy5sYW4pIHtcbiAgICAgICAgbGFuQnRuLmRhdGFzZXQuaXAgPSBRVUlDS19JUFMubGFuO1xuICAgICAgICBsYW5CdG4udGV4dENvbnRlbnQgPSBgTEFOICgke1FVSUNLX0lQUy5sYW59KWA7XG4gICAgICAgIGxhbkJ0bi50aXRsZSA9IGBMQU4gSVA6ICR7UVVJQ0tfSVBTLmxhbn1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFuQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0c0J0bikge1xuICAgICAgaWYgKFFVSUNLX0lQUy50YWlsc2NhbGUpIHtcbiAgICAgICAgdHNCdG4uZGF0YXNldC5pcCA9IFFVSUNLX0lQUy50YWlsc2NhbGU7XG4gICAgICAgIHRzQnRuLnRleHRDb250ZW50ID0gYFRhaWxzY2FsZSAoJHtRVUlDS19JUFMudGFpbHNjYWxlfSlgO1xuICAgICAgICB0c0J0bi50aXRsZSA9IGBUYWlsc2NhbGUgSVA6ICR7UVVJQ0tfSVBTLnRhaWxzY2FsZX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHNCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWlwLWlucHV0Jyk7XG4gICAgaWYgKGlwSW5wdXQgJiYgIWlwSW5wdXQudmFsdWUgJiYgUVVJQ0tfSVBTLmxhbikgaXBJbnB1dC52YWx1ZSA9IFFVSUNLX0lQUy5sYW47XG4gIH1cblxuICBmdW5jdGlvbiBpbml0UXVpY2tJUEJ1dHRvbnMoKSB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnF1aWNrLWlwLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgaXAgPSBidG4uZGF0YXNldC5pcDtcbiAgICAgICAgaWYgKGlwKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKS52YWx1ZSA9IGlwO1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1pcC1idG4nKS5mb3JFYWNoKGIgPT4gYi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICAgICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICAgIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKT8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudElQID0gZS50YXJnZXQudmFsdWU7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucXVpY2staXAtYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYnRuLmRhdGFzZXQuaXAgPT09IGN1cnJlbnRJUCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09IEFERCBTRVJWSUNFIE1PREFMID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gb3BlbkFkZFNlcnZpY2VNb2RhbCgpIHtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZS1tb2RhbCcpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIGNvbnN0IG1vZGFsQ29udGVudCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJy53ZWF0aGVyLW1vZGFsLWNvbnRlbnQnKTtcbiAgICBpZiAobW9kYWxDb250ZW50KSBtb2RhbENvbnRlbnQuc2Nyb2xsVG9wID0gMDtcblxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgIC8vIFNldCBzbWFydCBTU0wgZGVmYXVsdFxuICAgIGNvbnN0IHNzbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzc2wtdHlwZS1zZWxlY3QnKTtcbiAgICBpZiAoc3NsU2VsZWN0KSBzc2xTZWxlY3QudmFsdWUgPSBnZXRTbWFydFNzbERlZmF1bHQoKTtcblxuICAgIGF3YWl0IGRldGVjdE5ldHdvcmtJUHMoKTtcblxuICAgIGNvbnN0IGNhZGR5ZmlsZVBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FkZHlmaWxlLXBhdGgtaW5wdXQnKS52YWx1ZSB8fCBEQy5ERUZBVUxUUy5DQUREWUZJTEU7XG4gICAgYXdhaXQgd2luZG93LmxvYWRFeGlzdGluZ0NBcyhjYWRkeWZpbGVQYXRoKTtcblxuICAgIC8vIENoZWNrIFRhaWxzY2FsZSBzdGF0dXNcbiAgICBjb25zdCB0YWlsc2NhbGVTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFudWFsLXRhaWxzY2FsZS1zdGF0dXMnKTtcbiAgICBjb25zdCB0YWlsc2NhbGVDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW51YWwtdGFpbHNjYWxlLW9ubHknKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90YWlsc2NhbGUvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmluc3RhbGxlZCAmJiBkYXRhLmNvbm5lY3RlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICM0Y2FmNTA7XCI+XFx1MjcxMyBDb25uZWN0ZWQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPiR7ZGF0YS5zZWxmPy5ob3N0bmFtZX0gKCR7ZGF0YS5zZWxmPy5pcH0pPC9zcGFuPlxuICAgICAgICBgO1xuICAgICAgICB0YWlsc2NhbGVDaGVja2JveC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmluc3RhbGxlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+XFx1MjZBMCBOb3QgY29ubmVjdGVkPC9zcGFuPmA7XG4gICAgICAgIHRhaWxzY2FsZUNoZWNrYm94LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhaWxzY2FsZVN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5vdCBhdmFpbGFibGU8L3NwYW4+YDtcbiAgICAgICAgdGFpbHNjYWxlQ2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRhaWxzY2FsZVN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvdWxkIG5vdCBjaGVjazwvc3Bhbj5gO1xuICAgICAgdGFpbHNjYWxlQ2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0YWlsc2NhbGVDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG5cbiAgICB1cGRhdGVTZXJ2aWNlUHJldmlldygpO1xuICB9XG5cbiAgLy8gPT09PT0gU0VSVklDRSBUWVBFIFNXSVRDSElORyAoVEFCIFNUWUxFKSA9PT09PVxuXG4gIGZ1bmN0aW9uIHNldHVwU2VydmljZVR5cGVTd2l0Y2hpbmcoKSB7XG4gICAgY29uc3QgbG9jYWxSYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXR5cGUtbG9jYWwnKTtcbiAgICBjb25zdCBleHRlcm5hbFJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtdHlwZS1leHRlcm5hbCcpO1xuICAgIGNvbnN0IGxvY2FsQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2FsLXNlcnZpY2UtY29uZmlnJyk7XG4gICAgY29uc3QgZXh0ZXJuYWxDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1jb25maWcnKTtcbiAgICBjb25zdCB0YWJMb2NhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItbG9jYWwnKTtcbiAgICBjb25zdCB0YWJFeHRlcm5hbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItZXh0ZXJuYWwnKTtcblxuICAgIGZ1bmN0aW9uIHN3aXRjaFNlcnZpY2VUeXBlKCkge1xuICAgICAgaWYgKGxvY2FsUmFkaW8uY2hlY2tlZCkge1xuICAgICAgICBsb2NhbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ2dyaWQnO1xuICAgICAgICBleHRlcm5hbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBpZiAodGFiTG9jYWwpIHsgdGFiTG9jYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1hY2NlbnQpJzsgdGFiTG9jYWwuc3R5bGUuY29sb3IgPSAndmFyKC0tYmcpJzsgfVxuICAgICAgICBpZiAodGFiRXh0ZXJuYWwpIHsgdGFiRXh0ZXJuYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7IHRhYkV4dGVybmFsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGV4dGVybmFsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBpZiAodGFiRXh0ZXJuYWwpIHsgdGFiRXh0ZXJuYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1hY2NlbnQpJzsgdGFiRXh0ZXJuYWwuc3R5bGUuY29sb3IgPSAndmFyKC0tYmcpJzsgfVxuICAgICAgICBpZiAodGFiTG9jYWwpIHsgdGFiTG9jYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7IHRhYkxvY2FsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7IH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2NhbFJhZGlvPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBzd2l0Y2hTZXJ2aWNlVHlwZSk7XG4gICAgZXh0ZXJuYWxSYWRpbz8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgc3dpdGNoU2VydmljZVR5cGUpO1xuICB9XG5cbiAgLy8gPT09PT0gQVVUTy1ERVJJVkUgU1VCRE9NQUlOIEZST00gTkFNRSA9PT09PVxuXG4gIGZ1bmN0aW9uIHNldHVwQXV0b1N1YmRvbWFpbigpIHtcbiAgICAvLyBMb2NhbCBzZXJ2aWNlOiBuYW1lIFx1MjE5MiBzdWJkb21haW4gKyBwcmV2aWV3XG4gICAgY29uc3QgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtbmFtZS1pbnB1dCcpO1xuICAgIGNvbnN0IHN1YmRvbWFpbklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2Utc3ViZG9tYWluLWlucHV0Jyk7XG4gICAgY29uc3Qgc3ViZG9tYWluUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJkb21haW4tcHJldmlldycpO1xuICAgIGxldCB1c2VyRWRpdGVkU3ViZG9tYWluID0gZmFsc2U7XG5cbiAgICBuYW1lSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZVN1YmRvbWFpbihuYW1lSW5wdXQudmFsdWUpO1xuICAgICAgaWYgKCF1c2VyRWRpdGVkU3ViZG9tYWluICYmIHN1YmRvbWFpbklucHV0KSB7XG4gICAgICAgIHN1YmRvbWFpbklucHV0LnZhbHVlID0gZGVyaXZlZDtcbiAgICAgIH1cbiAgICAgIGlmIChzdWJkb21haW5QcmV2aWV3KSB7XG4gICAgICAgIHN1YmRvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBkZXJpdmVkID8gYFxcdTIxOTIgJHtidWlsZERvbWFpbihkZXJpdmVkKX1gIDogJyc7XG4gICAgICB9XG4gICAgICB1cGRhdGVTZXJ2aWNlUHJldmlldygpO1xuICAgIH0pO1xuXG4gICAgc3ViZG9tYWluSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgdXNlckVkaXRlZFN1YmRvbWFpbiA9IHN1YmRvbWFpbklucHV0LnZhbHVlICE9PSBkZXJpdmVTdWJkb21haW4obmFtZUlucHV0Py52YWx1ZSB8fCAnJyk7XG4gICAgICBjb25zdCBzdWIgPSBzdWJkb21haW5JbnB1dC52YWx1ZS50cmltKCkgfHwgZGVyaXZlU3ViZG9tYWluKG5hbWVJbnB1dD8udmFsdWUgfHwgJycpO1xuICAgICAgaWYgKHN1YmRvbWFpblByZXZpZXcpIHtcbiAgICAgICAgc3ViZG9tYWluUHJldmlldy50ZXh0Q29udGVudCA9IHN1YiA/IGBcXHUyMTkyICR7YnVpbGREb21haW4oc3ViKX1gIDogJyc7XG4gICAgICB9XG4gICAgICB1cGRhdGVTZXJ2aWNlUHJldmlldygpO1xuICAgIH0pO1xuXG4gICAgLy8gRXh0ZXJuYWwgc2VydmljZTogbmFtZSBcdTIxOTIgc3ViZG9tYWluICsgcHJldmlld1xuICAgIGNvbnN0IGV4dE5hbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLW5hbWUnKTtcbiAgICBjb25zdCBleHRTdWJkb21haW5JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpbicpO1xuICAgIGNvbnN0IGV4dFN1YmRvbWFpblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc3ViZG9tYWluLXByZXZpZXcnKTtcbiAgICBjb25zdCBleHREb21haW5QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLWRvbWFpbi1wcmV2aWV3Jyk7XG4gICAgbGV0IHVzZXJFZGl0ZWRFeHRTdWJkb21haW4gPSBmYWxzZTtcblxuICAgIGV4dE5hbWVJbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXJpdmVkID0gZGVyaXZlU3ViZG9tYWluKGV4dE5hbWVJbnB1dC52YWx1ZSk7XG4gICAgICBpZiAoIXVzZXJFZGl0ZWRFeHRTdWJkb21haW4gJiYgZXh0U3ViZG9tYWluSW5wdXQpIHtcbiAgICAgICAgZXh0U3ViZG9tYWluSW5wdXQudmFsdWUgPSBkZXJpdmVkO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3ViID0gZXh0U3ViZG9tYWluSW5wdXQ/LnZhbHVlIHx8IGRlcml2ZWQ7XG4gICAgICBpZiAoZXh0U3ViZG9tYWluUHJldmlldykge1xuICAgICAgICBleHRTdWJkb21haW5QcmV2aWV3LnRleHRDb250ZW50ID0gc3ViID8gYFxcdTIxOTIgJHtidWlsZERvbWFpbihzdWIpfWAgOiAnJztcbiAgICAgIH1cbiAgICAgIGlmIChleHREb21haW5QcmV2aWV3KSB7XG4gICAgICAgIGV4dERvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBzdWIgPyBidWlsZERvbWFpbihzdWIpIDogJyc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBleHRTdWJkb21haW5JbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICB1c2VyRWRpdGVkRXh0U3ViZG9tYWluID0gZXh0U3ViZG9tYWluSW5wdXQudmFsdWUgIT09IGRlcml2ZVN1YmRvbWFpbihleHROYW1lSW5wdXQ/LnZhbHVlIHx8ICcnKTtcbiAgICAgIGNvbnN0IHN1YiA9IGV4dFN1YmRvbWFpbklucHV0LnZhbHVlLnRyaW0oKSB8fCBkZXJpdmVTdWJkb21haW4oZXh0TmFtZUlucHV0Py52YWx1ZSB8fCAnJyk7XG4gICAgICBpZiAoZXh0U3ViZG9tYWluUHJldmlldykge1xuICAgICAgICBleHRTdWJkb21haW5QcmV2aWV3LnRleHRDb250ZW50ID0gc3ViID8gYFxcdTIxOTIgJHtidWlsZERvbWFpbihzdWIpfWAgOiAnJztcbiAgICAgIH1cbiAgICAgIGlmIChleHREb21haW5QcmV2aWV3KSB7XG4gICAgICAgIGV4dERvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBzdWIgPyBidWlsZERvbWFpbihzdWIpIDogJyc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PSBDUkVBVEUgRVhURVJOQUwgU0VSVklDRSA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUV4dGVybmFsU2VydmljZSgpIHtcbiAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBleHRlcm5hbFVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXVybCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBzdWJkb21haW4gPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2Utc3ViZG9tYWluJykudmFsdWUudHJpbSgpIHx8IGRlcml2ZVN1YmRvbWFpbihuYW1lKSkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtbG9nbycpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtaWNvbicpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBjcmVhdGVEbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtY3JlYXRlLWRucycpLmNoZWNrZWQ7XG4gICAgY29uc3QgY3JlYXRlQ2FkZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtY3JlYXRlLWNhZGR5JykuY2hlY2tlZDtcbiAgICBjb25zdCBwcm94eUlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXByb3h5LWlwJykudmFsdWUudHJpbSgpIHx8IFNJVEUuZG5zSXAgfHwgJ2xvY2FsaG9zdCc7XG4gICAgY29uc3QgcHJlc2VydmVIb3N0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXByZXNlcnZlLWhvc3QnKS5jaGVja2VkO1xuICAgIGNvbnN0IGZvbGxvd1JlZGlyZWN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1mb2xsb3ctcmVkaXJlY3RzJykuY2hlY2tlZDtcbiAgICBjb25zdCBjYXRlZ29yeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWNhdGVnb3J5Jyk/LnZhbHVlIHx8ICcnO1xuXG4gICAgaWYgKCFuYW1lIHx8ICFleHRlcm5hbFVybCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGZpbGwgaW4gTmFtZSBhbmQgRXh0ZXJuYWwgVVJMJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXN1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ291bGQgbm90IGRlcml2ZSBzdWJkb21haW4gZnJvbSBuYW1lLiBQbGVhc2Ugc2V0IG9uZSBpbiBPcHRpb25zLicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFleHRlcm5hbFVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIWV4dGVybmFsVXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0V4dGVybmFsIFVSTCBtdXN0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovLycsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZG9tYWluID0gYnVpbGREb21haW4oc3ViZG9tYWluKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHRzID0geyBkbnM6IG51bGwsIGNhZGR5OiBudWxsLCBkYXNoYm9hcmQ6IGZhbHNlIH07XG5cbiAgICAgIGlmIChjcmVhdGVEbnMpIHtcbiAgICAgICAgY29uc3QgYWRtaW5Ub2tlbiA9IHdpbmRvdy5nZXRUb2tlbihnZXRQcmltYXJ5RG5zSWQoKSwgJ2FkbWluJyk7XG4gICAgICAgIGlmIChhZG1pblRva2VuKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRuc1Jlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZG5zL3JlY29yZCcsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZG9tYWluOiBkb21haW4sXG4gICAgICAgICAgICAgICAgaXA6IHByb3h5SXAsXG4gICAgICAgICAgICAgICAgdHRsOiBEQy5ERUZBVUxUUy5UVEwsXG4gICAgICAgICAgICAgICAgc2VydmVyOiBTSVRFLmRuc0lwXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGRuc1Jlc3VsdCA9IGF3YWl0IGRuc1Jlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHJlc3VsdHMuZG5zID0gZG5zUmVzdWx0LnN1Y2Nlc3MgPyAnY3JlYXRlZCcgOiAoZG5zUmVzdWx0LmVycm9yIHx8ICdmYWlsZWQnKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXN1bHRzLmRucyA9IGUubWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0cy5kbnMgPSAnbm8gYWRtaW4gdG9rZW4gKGNvbmZpZ3VyZSBpbiBcXHVEODNEXFx1REQxMSBUb2tlbnMpJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3JlYXRlQ2FkZHkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjYWRkeUNvbmZpZyA9IHtcbiAgICAgICAgICAgIHN1YmRvbWFpbjogc3ViZG9tYWluLFxuICAgICAgICAgICAgZXh0ZXJuYWxVcmw6IGV4dGVybmFsVXJsLFxuICAgICAgICAgICAgcHJlc2VydmVIb3N0OiBwcmVzZXJ2ZUhvc3QsXG4gICAgICAgICAgICBmb2xsb3dSZWRpcmVjdHM6IGZvbGxvd1JlZGlyZWN0cyxcbiAgICAgICAgICAgIHNzbFR5cGU6ICdjYWRkeS1tYW5hZ2VkJyxcbiAgICAgICAgICAgIGNhZGR5ZmlsZVBhdGg6IERDLkRFRkFVTFRTLkNBRERZRklMRSxcbiAgICAgICAgICAgIHJlbG9hZENhZGR5OiB0cnVlXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNhZGR5UmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zaXRlL2V4dGVybmFsJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNhZGR5Q29uZmlnKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgY2FkZHlSZXN1bHQgPSBhd2FpdCBjYWRkeVJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICByZXN1bHRzLmNhZGR5ID0gY2FkZHlSZXN1bHQuc3VjY2VzcyA/ICdjcmVhdGVkJyA6IChjYWRkeVJlc3VsdC5lcnJvciB8fCAnZmFpbGVkJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXN1bHRzLmNhZGR5ID0gZS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1NlcnZpY2UgPSB7XG4gICAgICAgIGlkOiBzdWJkb21haW4sXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHVybDogYGh0dHBzOi8vJHtkb21haW59YCxcbiAgICAgICAgZXh0ZXJuYWxVcmw6IGV4dGVybmFsVXJsLFxuICAgICAgICBsb2dvOiBsb2dvIHx8IGljb24gfHwgJ1xcdUQ4M0NcXHVERjEwJyxcbiAgICAgICAgaXNFeHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgaXNDdXN0b206IHRydWVcbiAgICAgIH07XG4gICAgICAvLyBPbmx5IGF0dGFjaCBjYXRlZ29yeSBpZiB1c2VyIGFjdHVhbGx5IHBpY2tlZCBvbmVcbiAgICAgIGlmIChjYXRlZ29yeSkgbmV3U2VydmljZS5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuXG4gICAgICB3aW5kb3cuQVBQUy5wdXNoKG5ld1NlcnZpY2UpO1xuICAgICAgcmVzdWx0cy5kYXNoYm9hcmQgPSB0cnVlO1xuXG4gICAgICBjb25zdCBkZWZhdWx0U2VydmljZXMgPSBbJ3BsZXgnLCAncm91dGVyJywgJ2NoYXQnLCAnc3luYycsICd0b3JyZW50JywgJ3JhZGFycicsICdzb25hcnInLCAncHJvd2xhcnInLCAncG9ydGFpbmVyJywgJ3JlcXVlc3RzJywgJ2plbGx5ZmluJywgJ2VtYnknXTtcbiAgICAgIGNvbnN0IGN1c3RvbVNlcnZpY2VzID0gd2luZG93LkFQUFMuZmlsdGVyKGFwcCA9PiAhZGVmYXVsdFNlcnZpY2VzLmluY2x1ZGVzKGFwcC5pZCkpO1xuICAgICAgc2FmZVNldCgnY3VzdG9tLXNlcnZpY2VzJywgSlNPTi5zdHJpbmdpZnkoY3VzdG9tU2VydmljZXMpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2VydmljZXMnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkod2luZG93LkFQUFMpXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzYXZlIHRvIHNlcnZpY2VzLmpzb246JywgZSk7XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG5cbiAgICAgIGNsb3NlQWRkU2VydmljZU1vZGFsKCk7XG5cbiAgICAgIGNvbnN0IHBhcnRzID0gW2BFeHRlcm5hbCBzZXJ2aWNlIFwiJHtuYW1lfVwiIGFkZGVkIWBdO1xuICAgICAgaWYgKGNyZWF0ZURucykgcGFydHMucHVzaChgRE5TOiAke3Jlc3VsdHMuZG5zID09PSAnY3JlYXRlZCcgPyAnXFx1MjcxMycgOiAnXFx1MjZBMCAnICsgcmVzdWx0cy5kbnN9YCk7XG4gICAgICBpZiAoY3JlYXRlQ2FkZHkpIHBhcnRzLnB1c2goYENhZGR5OiAke3Jlc3VsdHMuY2FkZHkgPT09ICdjcmVhdGVkJyA/ICdcXHUyNzEzJyA6ICdcXHUyNkEwICcgKyByZXN1bHRzLmNhZGR5fWApO1xuICAgICAgcGFydHMucHVzaChgQWNjZXNzIGF0OiBodHRwczovLyR7ZG9tYWlufWApO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihwYXJ0cy5qb2luKCcgfCAnKSwgJ3N1Y2Nlc3MnLCA2MDAwKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGV4dGVybmFsIHNlcnZpY2U6JywgZXJyb3IpO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIGNyZWF0ZSBleHRlcm5hbCBzZXJ2aWNlOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gQ0xPU0UgQUREIFNFUlZJQ0UgTU9EQUwgPT09PT1cblxuICBmdW5jdGlvbiBjbG9zZUFkZFNlcnZpY2VNb2RhbCgpIHtcbiAgICBjbG9zZU1vZGFsKCdhZGQtc2VydmljZS1tb2RhbCcpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtbmFtZS1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2Utc3ViZG9tYWluLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1pcC1pbnB1dCcpLnZhbHVlID0gUVVJQ0tfSVBTLmxhbiB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1sb2dvLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXR0bC1pbnB1dCcpLnZhbHVlID0gREMuREVGQVVMVFMuVFRMO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzc2wtdHlwZS1zZWxlY3QnKS52YWx1ZSA9IGdldFNtYXJ0U3NsRGVmYXVsdCgpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYS1uYW1lLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5hYmxlLWF1dGgnKS5jaGVja2VkID0gZmFsc2U7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1jb3JzJykuY2hlY2tlZCA9IGZhbHNlO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20taGVhZGVycy1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Vwc3RyZWFtLXBhdGgtaW5wdXQnKS52YWx1ZSA9ICcvJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltZW91dC1pbnB1dCcpLnZhbHVlID0gJzMwJztcblxuICAgIC8vIENsZWFyIHN1YmRvbWFpbiBwcmV2aWV3c1xuICAgIGNvbnN0IHN1YlByZXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViZG9tYWluLXByZXZpZXcnKTtcbiAgICBpZiAoc3ViUHJldikgc3ViUHJldi50ZXh0Q29udGVudCA9ICcnO1xuICAgIGNvbnN0IGV4dFN1YlByZXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc3ViZG9tYWluLXByZXZpZXcnKTtcbiAgICBpZiAoZXh0U3ViUHJldikgZXh0U3ViUHJldi50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgLy8gQ2xlYXIgZXh0ZXJuYWwgZmllbGRzXG4gICAgY29uc3QgZXh0TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLW5hbWUnKTtcbiAgICBpZiAoZXh0TmFtZSkgZXh0TmFtZS52YWx1ZSA9ICcnO1xuICAgIGNvbnN0IGV4dFN1YiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpbicpO1xuICAgIGlmIChleHRTdWIpIGV4dFN1Yi52YWx1ZSA9ICcnO1xuICAgIGNvbnN0IGV4dFVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXVybCcpO1xuICAgIGlmIChleHRVcmwpIGV4dFVybC52YWx1ZSA9ICcnO1xuICAgIGNvbnN0IGV4dExvZ28gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1sb2dvJyk7XG4gICAgaWYgKGV4dExvZ28pIGV4dExvZ28udmFsdWUgPSAnJztcbiAgICBjb25zdCBleHRJY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtaWNvbicpO1xuICAgIGlmIChleHRJY29uKSBleHRJY29uLnZhbHVlID0gJyc7XG5cbiAgICAvLyBDb2xsYXBzZSBvcHRpb25zXG4gICAgY29uc3QgbG9jYWxPcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2FsLWFkdmFuY2VkLW9wdGlvbnMnKTtcbiAgICBpZiAobG9jYWxPcHRzKSBsb2NhbE9wdHMucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7XG4gICAgY29uc3QgZXh0T3B0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1hZHZhbmNlZC1vcHRpb25zJyk7XG4gICAgaWYgKGV4dE9wdHMpIGV4dE9wdHMucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7XG5cbiAgICAvLyBSZXNldCB0byBsb2NhbCB0YWJcbiAgICBjb25zdCBsb2NhbFJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtdHlwZS1sb2NhbCcpO1xuICAgIGlmIChsb2NhbFJhZGlvKSBsb2NhbFJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgIGNvbnN0IGxvY2FsQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2FsLXNlcnZpY2UtY29uZmlnJyk7XG4gICAgY29uc3QgZXh0ZXJuYWxDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1jb25maWcnKTtcbiAgICBpZiAobG9jYWxDb25maWcpIGxvY2FsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc7XG4gICAgaWYgKGV4dGVybmFsQ29uZmlnKSBleHRlcm5hbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGNvbnN0IHRhYkxvY2FsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1sb2NhbCcpO1xuICAgIGNvbnN0IHRhYkV4dGVybmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1leHRlcm5hbCcpO1xuICAgIGlmICh0YWJMb2NhbCkgeyB0YWJMb2NhbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWFjY2VudCknOyB0YWJMb2NhbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1iZyknOyB9XG4gICAgaWYgKHRhYkV4dGVybmFsKSB7IHRhYkV4dGVybmFsLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnOyB0YWJFeHRlcm5hbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknOyB9XG4gIH1cblxuICAvLyA9PT09PSBDUkVBVEUgTkVXIFNFUlZJQ0UgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdTZXJ2aWNlKCkge1xuICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1uYW1lLWlucHV0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IHN1YmRvbWFpbiA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1zdWJkb21haW4taW5wdXQnKS52YWx1ZS50cmltKCkgfHwgZGVyaXZlU3ViZG9tYWluKG5hbWUpKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgbG9nbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWxvZ28taW5wdXQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgY3JlYXRlRG5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NyZWF0ZS1kbnMtcmVjb3JkJykuY2hlY2tlZDtcbiAgICBjb25zdCB0dGwgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXR0bC1pbnB1dCcpLnZhbHVlKSB8fCBEQy5ERUZBVUxUUy5UVEw7XG4gICAgY29uc3QgdGFpbHNjYWxlT25seSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW51YWwtdGFpbHNjYWxlLW9ubHknKT8uY2hlY2tlZCB8fCBmYWxzZTtcblxuICAgIGNvbnN0IHNzbFR5cGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3NsLXR5cGUtc2VsZWN0Jyk/LnZhbHVlIHx8ICdjYWRkeS1tYW5hZ2VkJztcbiAgICBjb25zdCBjYU5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2EtbmFtZS1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCBleGlzdGluZ0NhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4aXN0aW5nLWNhLXNlbGVjdCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCBlbmFibGVBdXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1hdXRoJyk/LmNoZWNrZWQgfHwgZmFsc2U7XG4gICAgY29uc3QgZW5hYmxlQ29ycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmFibGUtY29ycycpPy5jaGVja2VkIHx8IGZhbHNlO1xuICAgIGNvbnN0IGN1c3RvbUhlYWRlcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3VzdG9tLWhlYWRlcnMtaW5wdXQnKT8udmFsdWUgfHwgJyc7XG4gICAgY29uc3QgdXBzdHJlYW1QYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Vwc3RyZWFtLXBhdGgtaW5wdXQnKT8udmFsdWUgfHwgJy8nO1xuICAgIGNvbnN0IGhlYWx0aENoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCB0aW1lb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpbWVvdXQtaW5wdXQnKT8udmFsdWUgfHwgMzA7XG5cbiAgICAvLyBDYXRlZ29yeSBpcyBvcHRpb25hbCBcdTIwMTQgcHVsbGVkIGZyb20gZWl0aGVyIGxvY2FsIG9yIGV4dGVybmFsIHNlbGVjdCBieSB0aGVcbiAgICAvLyBvcGVuQWRkU2VydmljZU1vZGFsIHJlc2V0LiBJZiB1c2VyIGRvZXNuJ3QgY2hvb3NlIG9uZSwgaXQgc3RheXMgdW5kZWZpbmVkXG4gICAgLy8gYW5kIHdlIGRvbid0IHNlbmQgaXQgKHNvIHRoZSBiYWNrZW5kIGtlZXBzIHRoZSBleGlzdGluZyBiZWhhdmlvcikuXG4gICAgY29uc3QgY2F0ZWdvcnlFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWNhdGVnb3J5LWlucHV0JylcbiAgICAgIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWNhdGVnb3J5Jyk7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBjYXRlZ29yeUVsPy52YWx1ZSB8fCAnJztcblxuICAgIGNvbnN0IGRuc1Rva2VuID0gd2luZG93LmdldFRva2VuKGdldFByaW1hcnlEbnNJZCgpLCAnYWRtaW4nKTtcblxuICAgIGlmICghbmFtZSB8fCAhcG9ydCB8fCAhaXApIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBmaWxsIGluIE5hbWUsIFBvcnQsIGFuZCBJUCBBZGRyZXNzJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXN1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ291bGQgbm90IGRlcml2ZSBzdWJkb21haW4gZnJvbSBuYW1lLiBQbGVhc2Ugc2V0IG9uZSBpbiBPcHRpb25zLicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZURucyAmJiAhZG5zVG9rZW4pIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ROUyBBZG1pbiB0b2tlbiByZXF1aXJlZC4gQ29uZmlndXJlIGl0IGluIHRoZSBUb2tlbnMgbWVudSBmaXJzdC4nLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHMgPSB7IGRuczogbnVsbCwgY2FkZHk6IG51bGwsIGRhc2hib2FyZDogZmFsc2UgfTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoY3JlYXRlRG5zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd2luZG93LmNyZWF0ZURuc1JlY29yZChzdWJkb21haW4sIGlwLCB0dGwpO1xuICAgICAgICAgIHJlc3VsdHMuZG5zID0gJ2NyZWF0ZWQnO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ROUyBjcmVhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICAgIHJlc3VsdHMuZG5zID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEROUyBjcmVhdGlvbiBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0cy5kbnMgPSAnc2tpcHBlZCc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhZGR5Q29uZmlnID0gd2luZG93LmdlbmVyYXRlQ2FkZHlDb25maWcoe1xuICAgICAgICBzdWJkb21haW4sIHBvcnQsIGlwLCBzc2xUeXBlLCBjYU5hbWUsIGV4aXN0aW5nQ2EsXG4gICAgICAgIGVuYWJsZUF1dGgsIGVuYWJsZUNvcnMsIGN1c3RvbUhlYWRlcnMsIHVwc3RyZWFtUGF0aCwgaGVhbHRoQ2hlY2ssIHRpbWVvdXQsIHRhaWxzY2FsZU9ubHlcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjYWRkeVJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2l0ZScsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBkb21haW46IGJ1aWxkRG9tYWluKHN1YmRvbWFpbiksXG4gICAgICAgICAgICB1cHN0cmVhbTogYCR7aXB9OiR7cG9ydH1gLFxuICAgICAgICAgICAgY29uZmlnOiBjYWRkeUNvbmZpZ1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNhZGR5UmVzdWx0ID0gYXdhaXQgY2FkZHlSZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChjYWRkeVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cy5jYWRkeSA9ICdhZGRlZCAmIHJlbG9hZGVkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYWRkeSBjb25maWd1cmF0aW9uIGZhaWxlZDonLCBjYWRkeVJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgcmVzdWx0cy5jYWRkeSA9IGNhZGR5UmVzdWx0LmVycm9yIHx8ICdmYWlsZWQnO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FkZHkgY29uZmlndXJhdGlvbiBmYWlsZWQ6ICR7Y2FkZHlSZXN1bHQuZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NhZGR5IEFQSSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIHJlc3VsdHMuY2FkZHkgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhZGR5IEFQSSBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXJ2aWNlQ29uZmlnID0ge1xuICAgICAgICBuYW1lLCBzdWJkb21haW4sIHBvcnQsIGlwLFxuICAgICAgICBsb2dvOiBsb2dvIHx8IGAvYXNzZXRzLyR7c3ViZG9tYWlufS5wbmdgLFxuICAgICAgICB0YWlsc2NhbGVPbmx5OiB0YWlsc2NhbGVPbmx5IHx8IGZhbHNlXG4gICAgICB9O1xuICAgICAgLy8gT25seSBpbmNsdWRlIGNhdGVnb3J5IGlmIHVzZXIgYWN0dWFsbHkgcGlja2VkIG9uZVxuICAgICAgaWYgKGNhdGVnb3J5KSBzZXJ2aWNlQ29uZmlnLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG5cbiAgICAgIGF3YWl0IHdpbmRvdy5hZGRTZXJ2aWNlVG9Db25maWcoc2VydmljZUNvbmZpZyk7XG4gICAgICByZXN1bHRzLmRhc2hib2FyZCA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHN0YXR1c1BhcnRzID0gW1xuICAgICAgICBgRE5TOiAke3Jlc3VsdHMuZG5zID09PSAnY3JlYXRlZCcgPyAnXFx1MjcxMycgOiByZXN1bHRzLmRucyA9PT0gJ3NraXBwZWQnID8gJ1xcdTI1Q0InIDogJ1xcdTI3MTcnfWAsXG4gICAgICAgIGBDYWRkeTogJHtyZXN1bHRzLmNhZGR5ID09PSAnYWRkZWQgJiByZWxvYWRlZCcgPyAnXFx1MjcxMycgOiAnXFx1MjcxNyd9YCxcbiAgICAgICAgYERhc2hib2FyZDogJHtyZXN1bHRzLmRhc2hib2FyZCA/ICdcXHUyNzEzJyA6ICdcXHUyNzE3J31gXG4gICAgICBdO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgU2VydmljZSBcIiR7bmFtZX1cIiBjcmVhdGVkISAke3N0YXR1c1BhcnRzLmpvaW4oJyB8ICcpfSBcXHUyMDE0ICR7YnVpbGRTZXJ2aWNlVXJsKHN1YmRvbWFpbil9JHt0YWlsc2NhbGVPbmx5ID8gJyAoVGFpbHNjYWxlKScgOiAnJ31gLCAnc3VjY2VzcycsIDYwMDApO1xuXG4gICAgICBjbG9zZUFkZFNlcnZpY2VNb2RhbCgpO1xuXG4gICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIHNlcnZpY2U6JywgZXJyb3IpO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3IgY3JlYXRpbmcgXCIke25hbWV9XCI6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCA2MDAwKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBFVkVOVCBMSVNURU5FUlMgPT09PT1cblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXNlcnZpY2UnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuQWRkU2VydmljZU1vZGFsKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlQWRkU2VydmljZU1vZGFsKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWNyZWF0ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBzZXJ2aWNlVHlwZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzZXJ2aWNlLXR5cGVcIl06Y2hlY2tlZCcpPy52YWx1ZTtcbiAgICBpZiAoc2VydmljZVR5cGUgPT09ICdleHRlcm5hbCcpIHtcbiAgICAgIGNyZWF0ZUV4dGVybmFsU2VydmljZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjcmVhdGVOZXdTZXJ2aWNlKCk7XG4gICAgfVxuICB9KTtcblxuICBzZXR1cFNlcnZpY2VUeXBlU3dpdGNoaW5nKCk7XG4gIHNldHVwQXV0b1N1YmRvbWFpbigpO1xuICBpbml0UXVpY2tJUEJ1dHRvbnMoKTtcblxuICAvLyBTU0wgdHlwZSBjaGFuZ2UgaGFuZGxlclxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3NsLXR5cGUtc2VsZWN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgY29uc3QgZXhpc3RpbmdDYUNvbmZpZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGlzdGluZy1jYS1jb25maWcnKTtcbiAgICBjb25zdCBjdXN0b21DYUNvbmZpZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20tY2EtY29uZmlnJyk7XG5cbiAgICBleGlzdGluZ0NhQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgY3VzdG9tQ2FDb25maWcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIGlmIChlLnRhcmdldC52YWx1ZSA9PT0gJ2V4aXN0aW5nLWNhJykge1xuICAgICAgZXhpc3RpbmdDYUNvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9IGVsc2UgaWYgKGUudGFyZ2V0LnZhbHVlID09PSAnY3VzdG9tLWNhJykge1xuICAgICAgY3VzdG9tQ2FDb25maWcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuXG4gICAgdXBkYXRlU2VydmljZVByZXZpZXcoKTtcbiAgfSk7XG5cbiAgLy8gUmVmcmVzaCBDQXMgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoLWNhcycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmcmVzaC1jYXMnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidXR0b24udGV4dENvbnRlbnQ7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1xcdTIzMUIgTG9hZGluZy4uLic7XG4gICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWRkeWZpbGVQYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhZGR5ZmlsZS1wYXRoLWlucHV0JykudmFsdWUgfHwgREMuREVGQVVMVFMuQ0FERFlGSUxFO1xuICAgICAgYXdhaXQgd2luZG93LmxvYWRFeGlzdGluZ0NBcyhjYWRkeWZpbGVQYXRoKTtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcXHUyNzA1IFJlZnJlc2hlZCc7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcXHUyNzRDIEZhaWxlZCc7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCBDQXM6JywgZXJyb3IpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfSwgMjAwMCk7XG4gIH0pO1xuXG4gIC8vIEROUyByZWNvcmQgY2hlY2tib3ggaGFuZGxlclxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3JlYXRlLWRucy1yZWNvcmQnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICBjb25zdCBkbnNDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWNvbmZpZycpO1xuICAgIGRuc0NvbmZpZy5zdHlsZS5kaXNwbGF5ID0gZS50YXJnZXQuY2hlY2tlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH0pO1xuXG4gIC8vIFJlYWwtdGltZSBwcmV2aWV3IHVwZGF0ZXNcbiAgWydzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcsICdzZXJ2aWNlLWlwLWlucHV0JywgJ3NlcnZpY2UtcG9ydC1pbnB1dCcsICdjYS1uYW1lLWlucHV0JyxcbiAgICdleGlzdGluZy1jYS1zZWxlY3QnLCAnZW5hYmxlLWF1dGgnLCAnZW5hYmxlLWNvcnMnLCAnY3VzdG9tLWhlYWRlcnMtaW5wdXQnLCAndXBzdHJlYW0tcGF0aC1pbnB1dCcsXG4gICAnaGVhbHRoLWNoZWNrLWlucHV0JywgJ3RpbWVvdXQtaW5wdXQnXS5mb3JFYWNoKGlkID0+IHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdXBkYXRlU2VydmljZVByZXZpZXcpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVTZXJ2aWNlUHJldmlldyk7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT09PSBDVVNUT00gU0VSVklDRVMgRlJPTSBMT0NBTFNUT1JBR0UgPT09PT1cblxuICBmdW5jdGlvbiBsb2FkQ3VzdG9tU2VydmljZXMoKSB7XG4gICAgY29uc3QgY3VzdG9tU2VydmljZXMgPSBzYWZlR2V0KCdjdXN0b20tc2VydmljZXMnKTtcbiAgICBpZiAoY3VzdG9tU2VydmljZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gSlNPTi5wYXJzZShjdXN0b21TZXJ2aWNlcyk7XG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgaWYgKCF3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2UuaWQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKHNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgY3VzdG9tIHNlcnZpY2VzOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvYWRDdXN0b21TZXJ2aWNlcygpO1xuXG4gIC8vID09PT09IFdJTkRPVyBFWFBPUlRTID09PT09XG5cbiAgd2luZG93Lm9wZW5BZGRTZXJ2aWNlTW9kYWwgPSBvcGVuQWRkU2VydmljZU1vZGFsO1xuICB3aW5kb3cuY2xvc2VBZGRTZXJ2aWNlTW9kYWwgPSBjbG9zZUFkZFNlcnZpY2VNb2RhbDtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gTElWRSBEQVNIQk9BUkQgRVZFTlRTIChTU0UpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgbGV0IGVzID0gbnVsbDtcbiAgbGV0IHJlY29ubmVjdERlbGF5ID0gMTAwMDtcbiAgY29uc3QgTUFYX1JFQ09OTkVDVCA9IDMwMDAwO1xuXG4gIGZ1bmN0aW9uIGNvbm5lY3QoKSB7XG4gICAgaWYgKGVzKSB7IHRyeSB7IGVzLmNsb3NlKCk7IH0gY2F0Y2ggKF8pIHt9IH1cblxuICAgIGVzID0gbmV3IEV2ZW50U291cmNlKCcvYXBpL3YxL2V2ZW50cy9zdHJlYW0nKTtcblxuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nvbm5lY3RlZCcsICgpID0+IHtcbiAgICAgIHJlY29ubmVjdERlbGF5ID0gMTAwMDsgLy8gcmVzZXQgYmFja29mZlxuICAgICAgZGVidWcoJ1tTU0VdIENvbm5lY3RlZCB0byBldmVudCBzdHJlYW0nKTtcbiAgICB9KTtcblxuICAgIC8vIEhlYWx0aCBzdGF0dXMgY2hhbmdlcyBcdTIxOTIgdXBkYXRlIGNhcmQgZG90cy9iYWRnZXMgaW4gcmVhbCB0aW1lXG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcignc3RhdHVzLWNoYW5nZScsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBpZiAoZC5zZXJ2aWNlSWQgJiYgdHlwZW9mIHdpbmRvdy5zZXRCYWRnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IHVwID0gZC5zdGF0dXMgPT09ICd1cCcgfHwgZC5zdGF0dXMgPT09ICdoZWFsdGh5JztcbiAgICAgICAgICB3aW5kb3cuc2V0QmFkZ2UoZC5zZXJ2aWNlSWQsIHVwLCBkLnJlc3BvbnNlVGltZSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIFJlc291cmNlIGFsZXJ0cyBcdTIxOTIgdG9hc3Qgbm90aWZpY2F0aW9uXG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcigncmVzb3VyY2UtYWxlcnQnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgY29uc3QgbXNnID0gYCR7ZC5jb250YWluZXJOYW1lIHx8IGQuY29udGFpbmVySWR9OiAke2QubWV0cmljfSBhdCAke2QudmFsdWV9JSAodGhyZXNob2xkOiAke2QudGhyZXNob2xkfSUpYDtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihtc2csICd3YXJuaW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfSk7XG5cbiAgICAvLyBDb250YWluZXIgYXV0by1yZXN0YXJ0XG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcignYXV0by1yZXN0YXJ0JywgKGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGQgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oYENvbnRhaW5lciBcIiR7ZC5jb250YWluZXJOYW1lfVwiIHdhcyBhdXRvLXJlc3RhcnRlZGAsICdpbmZvJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgYXZhaWxhYmxlIFx1MjE5MiBzaG93IG5vdGlmaWNhdGlvbiBkb3Qgb24gVXBkYXRlcyBidXR0b25cbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCd1cGRhdGUtYXZhaWxhYmxlJywgKGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGQgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZXNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1idG4nKTtcbiAgICAgICAgaWYgKHVwZGF0ZXNCdG4gJiYgIXVwZGF0ZXNCdG4ucXVlcnlTZWxlY3RvcignLnNzZS1kb3QnKSkge1xuICAgICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ3NzZS1kb3QnO1xuICAgICAgICAgIGRvdC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjhweDtoZWlnaHQ6OHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6dmFyKC0tYWNjZW50KTttYXJnaW4tbGVmdDo2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlOyc7XG4gICAgICAgICAgdXBkYXRlc0J0bi5hcHBlbmRDaGlsZChkb3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oYFVwZGF0ZSBhdmFpbGFibGUgZm9yICR7ZC5jb250YWluZXJOYW1lIHx8IGQuY29udGFpbmVySWR9YCwgJ2luZm8nKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBzdGFydC9jb21wbGV0ZS9mYWlsZWRcbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCd1cGRhdGUtY29tcGxldGUnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgVXBkYXRlIGNvbXBsZXRlZDogJHtkLmNvbnRhaW5lck5hbWUgfHwgZC5jb250YWluZXJJZH1gLCAnc3VjY2VzcycpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyaWdnZXIgYSBkYXNoYm9hcmQgcmVmcmVzaFxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoQWxsID09PSAnZnVuY3Rpb24nKSB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZS1mYWlsZWQnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgVXBkYXRlIGZhaWxlZDogJHtkLmNvbnRhaW5lck5hbWUgfHwgZC5jb250YWluZXJJZH0gXHUyMDE0ICR7ZC5lcnJvciB8fCAndW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfSk7XG5cbiAgICAvLyBJbmNpZGVudHNcbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCdpbmNpZGVudCcsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAoZC50eXBlID09PSAnY3JlYXRlZCcpIHtcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oYEluY2lkZW50OiAke2QubWVzc2FnZSB8fCBkLnNlcnZpY2VJZH1gLCAnZXJyb3InKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ3Jlc29sdmVkJykge1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVzb2x2ZWQ6ICR7ZC5zZXJ2aWNlSWQgfHwgJ2luY2lkZW50J31gLCAnc3VjY2VzcycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIFJlY29ubmVjdCBvbiBlcnJvclxuICAgIGVzLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICBlcy5jbG9zZSgpO1xuICAgICAgY29uc29sZS53YXJuKGBbU1NFXSBEaXNjb25uZWN0ZWQsIHJlY29ubmVjdGluZyBpbiAke3JlY29ubmVjdERlbGF5IC8gMTAwMH1zLi4uYCk7XG4gICAgICBzZXRUaW1lb3V0KGNvbm5lY3QsIHJlY29ubmVjdERlbGF5KTtcbiAgICAgIHJlY29ubmVjdERlbGF5ID0gTWF0aC5taW4ocmVjb25uZWN0RGVsYXkgKiAyLCBNQVhfUkVDT05ORUNUKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gU3RhcnQgb24gcGFnZSBsb2FkXG4gIGNvbm5lY3QoKTtcblxuICAvLyBFeHBvc2UgZm9yIGRlYnVnZ2luZ1xuICB3aW5kb3cuX3NzZVJlY29ubmVjdCA9IGNvbm5lY3Q7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIEZJTFRFUiA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLXNlYXJjaCcpO1xuICBjb25zdCBzdGF0dXNTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1maWx0ZXItc3RhdHVzJyk7XG4gIGNvbnN0IGNhdGVnb3J5U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLWNhdGVnb3J5Jyk7XG4gIGNvbnN0IGNvdW50U3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWZpbHRlci1jb3VudCcpO1xuXG4gIC8vIEJ1aWxkIGEgc2luZ2xlIGNhdGVnb3J5IGxpc3QgZnJvbSBib3RoIHRoZSBBUEkgY2F0ZWdvcmllcyBhbmQgYW55XG4gIC8vIGNhdGVnb3JpZXMgcHJlc2VudCBvbiB0aGUgYWN0dWFsIHJlbmRlcmVkIGNhcmRzIChjb3ZlcnMgY3VzdG9tIHNlcnZpY2VzXG4gIC8vIHdob3NlIGNhdGVnb3J5IGlzbid0IGluIFRFTVBMQVRFX0NBVEVHT1JJRVMpLlxuICBmdW5jdGlvbiBnZXRDYXRlZ29yeUxpc3QoKSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBmcm9tQ2FyZHMgPSBuZXcgU2V0KCk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NhcmRzIC5jYXJkW2RhdGEtY2F0ZWdvcnldJykuZm9yRWFjaChjID0+IHtcbiAgICAgIGNvbnN0IGNhdCA9IGMuZGF0YXNldC5jYXRlZ29yeS50cmltKCk7XG4gICAgICBpZiAoY2F0KSBmcm9tQ2FyZHMuYWRkKGNhdCk7XG4gICAgfSk7XG4gICAgY29uc3QgYXBpQ2F0cyA9ICh3aW5kb3cuRENfQ0FURUdPUklFUyB8fCAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5DQVRFR09SSUVTKSkgfHwge307XG4gICAgY29uc3QgYWxsID0gT2JqZWN0LmtleXMoYXBpQ2F0cykuY29uY2F0KFsuLi5mcm9tQ2FyZHNdLmZpbHRlcihjID0+ICFhcGlDYXRzW2NdKSk7XG4gICAgYWxsLmZvckVhY2goYyA9PiBzZWVuLmFkZChjKSk7XG4gICAgcmV0dXJuIHsgbGlzdDogWy4uLnNlZW5dLCBhcGlDYXRzIH07XG4gIH1cblxuICBmdW5jdGlvbiByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bigpIHtcbiAgICBpZiAoIWNhdGVnb3J5U2VsZWN0KSByZXR1cm47XG4gICAgY29uc3QgeyBsaXN0LCBhcGlDYXRzIH0gPSBnZXRDYXRlZ29yeUxpc3QoKTtcbiAgICBjb25zdCBjdXJyZW50ID0gY2F0ZWdvcnlTZWxlY3QudmFsdWU7XG4gICAgY2F0ZWdvcnlTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJhbGxcIj5BbGwgQ2F0ZWdvcmllczwvb3B0aW9uPic7XG4gICAgbGlzdC5zb3J0KCkuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IGluZm8gPSBhcGlDYXRzW25hbWVdO1xuICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICBvcHQudmFsdWUgPSBuYW1lO1xuICAgICAgb3B0LnRleHRDb250ZW50ID0gaW5mbyA/IGAke2luZm8uaWNvbiB8fCAnJ30gJHtuYW1lfWAudHJpbSgpIDogbmFtZTtcbiAgICAgIGNhdGVnb3J5U2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgfSk7XG4gICAgLy8gUmVzdG9yZSBzZWxlY3Rpb24gaWYgaXQgc3RpbGwgZXhpc3RzXG4gICAgaWYgKGN1cnJlbnQgJiYgWy4uLmNhdGVnb3J5U2VsZWN0Lm9wdGlvbnNdLnNvbWUobyA9PiBvLnZhbHVlID09PSBjdXJyZW50KSkge1xuICAgICAgY2F0ZWdvcnlTZWxlY3QudmFsdWUgPSBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXRlZ29yeVNlbGVjdC52YWx1ZSA9ICdhbGwnO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZpbHRlcigpIHtcbiAgICByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bigpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gc2VhcmNoSW5wdXQudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3Qgc3RhdHVzRmlsdGVyID0gc3RhdHVzU2VsZWN0LnZhbHVlOyAvLyAnYWxsJywgJ29uJywgb3IgJ29mZidcbiAgICBjb25zdCBjYXRlZ29yeUZpbHRlciA9IGNhdGVnb3J5U2VsZWN0ID8gY2F0ZWdvcnlTZWxlY3QudmFsdWUgOiAnYWxsJztcblxuICAgIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NhcmRzIC5jYXJkJyk7XG4gICAgbGV0IHZpc2libGVDb3VudCA9IDA7XG5cbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBjb25zdCBhcHAgPSBjYXJkLmRhdGFzZXQuYXBwPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5kYXRhc2V0LnN0YXR1cyB8fCAnb2ZmJzsgLy8gJ29uJyBvciAnb2ZmJ1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBjYXJkLmRhdGFzZXQuY2F0ZWdvcnkgfHwgJyc7XG5cbiAgICAgIGNvbnN0IG1hdGNoZXNTZWFyY2ggPSAhcXVlcnkgfHwgbmFtZS5pbmNsdWRlcyhxdWVyeSkgfHwgYXBwLmluY2x1ZGVzKHF1ZXJ5KTtcbiAgICAgIGNvbnN0IG1hdGNoZXNTdGF0dXMgPSBzdGF0dXNGaWx0ZXIgPT09ICdhbGwnIHx8IHN0YXR1cyA9PT0gc3RhdHVzRmlsdGVyO1xuICAgICAgY29uc3QgbWF0Y2hlc0NhdGVnb3J5ID0gY2F0ZWdvcnlGaWx0ZXIgPT09ICdhbGwnIHx8IGNhdGVnb3J5ID09PSBjYXRlZ29yeUZpbHRlcjtcblxuICAgICAgaWYgKG1hdGNoZXNTZWFyY2ggJiYgbWF0Y2hlc1N0YXR1cyAmJiBtYXRjaGVzQ2F0ZWdvcnkpIHtcbiAgICAgICAgY2FyZC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHZpc2libGVDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FyZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGNvdW50U3Bhbikge1xuICAgICAgY29uc3QgdG90YWwgPSBjYXJkcy5sZW5ndGg7XG4gICAgICBjb3VudFNwYW4udGV4dENvbnRlbnQgPSBgJHt2aXNpYmxlQ291bnR9IG9mICR7dG90YWx9IHNlcnZpY2VzYDtcbiAgICB9XG4gIH1cblxuICAvLyBEZWJvdW5jZSBoZWxwZXJcbiAgZnVuY3Rpb24gZGVib3VuY2UoZm4sIGRlbGF5KSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGZuLmFwcGx5KHRoaXMsIGFyZ3MpLCBkZWxheSk7XG4gICAgfTtcbiAgfVxuXG4gIHNlYXJjaElucHV0Py5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGRlYm91bmNlKHVwZGF0ZUZpbHRlciwgMjAwKSk7XG4gIHN0YXR1c1NlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlRmlsdGVyKTtcbiAgY2F0ZWdvcnlTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZUZpbHRlcik7XG5cbiAgLy8gSW5pdGlhbCBjb3VudCBvbiBwYWdlIGxvYWRcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiBzZXRUaW1lb3V0KHVwZGF0ZUZpbHRlciwgNTAwKSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGltZW91dCh1cGRhdGVGaWx0ZXIsIDUwMCk7XG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIGV4dGVybmFsIHRyaWdnZXJzIChjYWxsZWQgYWZ0ZXIgYnVpbGRHcmlkIHRvIHJlcG9wdWxhdGUgY2F0ZWdvcmllcylcbiAgd2luZG93LnJlZnJlc2hTZXJ2aWNlRmlsdGVyID0gdXBkYXRlRmlsdGVyO1xuICB3aW5kb3cucmVmcmVzaENhdGVnb3J5RHJvcGRvd24gPSByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bjtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IEJBVENIIENPTlRBSU5FUiBPUEVSQVRJT05TID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgYmF0Y2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtb3BlcmF0aW9ucy1idG4nKTtcbiAgY29uc3QgYmF0Y2hCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtYWN0aW9uLWJhcicpO1xuICBjb25zdCBiYXRjaENvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXNlbGVjdGVkLWNvdW50Jyk7XG4gIGNvbnN0IHN0YXJ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXN0YXJ0LWJ0bicpO1xuICBjb25zdCBzdG9wQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXN0b3AtYnRuJyk7XG4gIGNvbnN0IHJlc3RhcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtcmVzdGFydC1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLWNhbmNlbC1idG4nKTtcblxuICBsZXQgYmF0Y2hNb2RlID0gZmFsc2U7XG4gIGxldCBzZWxlY3RlZENvbnRhaW5lcnMgPSBuZXcgU2V0KCk7XG5cbiAgZnVuY3Rpb24gZW50ZXJCYXRjaE1vZGUoKSB7XG4gICAgYmF0Y2hNb2RlID0gdHJ1ZTtcbiAgICBzZWxlY3RlZENvbnRhaW5lcnMuY2xlYXIoKTtcbiAgICBiYXRjaEJhci5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgYmF0Y2hCdG4udGV4dENvbnRlbnQgPSAnXHUyNzEzIEV4aXQgQmF0Y2ggTW9kZSc7XG4gICAgdXBkYXRlU2VsZWN0ZWRDb3VudCgpO1xuICAgIFxuICAgIC8vIEFkZCBjaGVja2JveGVzIHRvIGFsbCBjYXJkcyB3aXRoIGNvbnRhaW5lcklkXG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2FyZHMgLmNhcmRbZGF0YS1hcHBdJyk7XG4gICAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcklkID0gY2FyZC5kYXRhc2V0LmNvbnRhaW5lcklkO1xuICAgICAgaWYgKCFjb250YWluZXJJZCkgcmV0dXJuO1xuICAgICAgXG4gICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgY2hlY2tib3ggaWYgYW55XG4gICAgICBjb25zdCBleGlzdGluZyA9IGNhcmQucXVlcnlTZWxlY3RvcignLmJhdGNoLWNoZWNrYm94Jyk7XG4gICAgICBpZiAoZXhpc3RpbmcpIGV4aXN0aW5nLnJlbW92ZSgpO1xuICAgICAgXG4gICAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICAgIGNoZWNrYm94LmNsYXNzTmFtZSA9ICdiYXRjaC1jaGVja2JveCc7XG4gICAgICBjaGVja2JveC5kYXRhc2V0LmNvbnRhaW5lcklkID0gY29udGFpbmVySWQ7XG4gICAgICBjaGVja2JveC5kYXRhc2V0LnNlcnZpY2VOYW1lID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcubmFtZScpPy50ZXh0Q29udGVudCB8fCBjb250YWluZXJJZDtcbiAgICAgIGNoZWNrYm94LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246IGFic29sdXRlOyB0b3A6IDhweDsgbGVmdDogOHB4OyB6LWluZGV4OiAxMDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY3Vyc29yOiBwb2ludGVyOyc7XG4gICAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgICAgIHNlbGVjdGVkQ29udGFpbmVycy5hZGQoY29udGFpbmVySWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdGVkQ29udGFpbmVycy5kZWxldGUoY29udGFpbmVySWQpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVNlbGVjdGVkQ291bnQoKTtcbiAgICAgIH0pO1xuICAgICAgY2FyZC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICBjYXJkLmluc2VydEJlZm9yZShjaGVja2JveCwgY2FyZC5maXJzdENoaWxkKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4aXRCYXRjaE1vZGUoKSB7XG4gICAgYmF0Y2hNb2RlID0gZmFsc2U7XG4gICAgc2VsZWN0ZWRDb250YWluZXJzLmNsZWFyKCk7XG4gICAgYmF0Y2hCYXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBiYXRjaEJ0bi50ZXh0Q29udGVudCA9ICdcdTI2MzAgQmF0Y2ggT3BlcmF0aW9ucyc7XG4gICAgXG4gICAgLy8gUmVtb3ZlIGFsbCBjaGVja2JveGVzXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmJhdGNoLWNoZWNrYm94JykuZm9yRWFjaChjYiA9PiBjYi5yZW1vdmUoKSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTZWxlY3RlZENvdW50KCkge1xuICAgIGNvbnN0IGNvdW50ID0gc2VsZWN0ZWRDb250YWluZXJzLnNpemU7XG4gICAgYmF0Y2hDb3VudC50ZXh0Q29udGVudCA9IGAke2NvdW50fSBzZWxlY3RlZGA7XG4gICAgc3RhcnRCdG4uZGlzYWJsZWQgPSBjb3VudCA9PT0gMDtcbiAgICBzdG9wQnRuLmRpc2FibGVkID0gY291bnQgPT09IDA7XG4gICAgcmVzdGFydEJ0bi5kaXNhYmxlZCA9IGNvdW50ID09PSAwO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYmF0Y2hBY3Rpb24oYWN0aW9uKSB7XG4gICAgaWYgKHNlbGVjdGVkQ29udGFpbmVycy5zaXplID09PSAwKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgY29udGFpbmVycyA9IEFycmF5LmZyb20oc2VsZWN0ZWRDb250YWluZXJzKTtcbiAgICBjb25zdCBhY3Rpb25MYWJlbCA9IHsgc3RhcnQ6ICdTdGFydGluZycsIHN0b3A6ICdTdG9wcGluZycsIHJlc3RhcnQ6ICdSZXN0YXJ0aW5nJyB9W2FjdGlvbl07XG4gICAgXG4gICAgaWYgKCFjb25maXJtKGAke2FjdGlvbkxhYmVsfSAke2NvbnRhaW5lcnMubGVuZ3RofSBjb250YWluZXIocyk/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gKSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGJ0bnMgPSBbc3RhcnRCdG4sIHN0b3BCdG4sIHJlc3RhcnRCdG5dO1xuICAgIGJ0bnMuZm9yRWFjaChiID0+IHsgYi5kaXNhYmxlZCA9IHRydWU7IGIudGV4dENvbnRlbnQgPSAnLi4uJzsgfSk7XG4gICAgXG4gICAgbGV0IHN1Y2Nlc3MgPSAwO1xuICAgIGxldCBmYWlsZWQgPSAwO1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIFxuICAgIGZvciAoY29uc3QgY29udGFpbmVySWQgb2YgY29udGFpbmVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJJZCl9LyR7YWN0aW9ufWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgIHN1Y2Nlc3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgICAgICBlcnJvcnMucHVzaChgJHtjb250YWluZXJJZH06ICR7ZGF0YS5lcnJvciB8fCByZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgZXJyb3JzLnB1c2goYCR7Y29udGFpbmVySWR9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gUmVzdG9yZSBidXR0b25zXG4gICAgYnRuc1swXS50ZXh0Q29udGVudCA9ICdcdTI1QjYgU3RhcnQgQWxsJztcbiAgICBidG5zWzFdLnRleHRDb250ZW50ID0gJ1x1MkIxQiBTdG9wIEFsbCc7XG4gICAgYnRuc1syXS50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMDQgUmVzdGFydCBBbGwnO1xuICAgIHVwZGF0ZVNlbGVjdGVkQ291bnQoKTtcbiAgICBcbiAgICAvLyBTaG93IHJlc3VsdHNcbiAgICBpZiAoZmFpbGVkID09PSAwKSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHthY3Rpb25MYWJlbH0gY29tcGxldGVkOiAke3N1Y2Nlc3N9IGNvbnRhaW5lcihzKWAsICdzdWNjZXNzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2FjdGlvbkxhYmVsfTogJHtzdWNjZXNzfSBzdWNjZWVkZWQsICR7ZmFpbGVkfSBmYWlsZWRgLCAnd2FybmluZycpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcignQmF0Y2ggb3BlcmF0aW9uIGVycm9yczonLCBlcnJvcnMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBSZWZyZXNoIGRhc2hib2FyZCBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHJlZnJlc2hBbGwoKTtcbiAgICB9LCAxNTAwKTtcbiAgfVxuXG4gIGJhdGNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoYmF0Y2hNb2RlKSB7XG4gICAgICBleGl0QmF0Y2hNb2RlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyQmF0Y2hNb2RlKCk7XG4gICAgfVxuICB9KTtcblxuICBzdGFydEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBiYXRjaEFjdGlvbignc3RhcnQnKSk7XG4gIHN0b3BCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gYmF0Y2hBY3Rpb24oJ3N0b3AnKSk7XG4gIHJlc3RhcnRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gYmF0Y2hBY3Rpb24oJ3Jlc3RhcnQnKSk7XG4gIGNhbmNlbEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBleGl0QmF0Y2hNb2RlKTtcbn0pKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiQ0FLQyxTQUFTQSxFQUFRLENBQ2hCLGFBRUEsTUFBTUMsQ0FBYSxDQUNqQixhQUFjLENBQ1osS0FBSyxPQUFTLENBQUMsRUFDZixLQUFLLFVBQVksRUFDbkIsQ0FRQSxTQUFTQyxFQUFTQyxFQUFPQyxFQUFXLENBQUMsRUFBRyxDQUN0QyxNQUFNQyxFQUFhLENBQ2pCLFVBQVcsSUFBSSxLQUFLLEVBQUUsWUFBWSxFQUNsQyxRQUFBSCxFQUNBLFFBQVNDLGFBQWlCLE1BQVFBLEVBQU0sUUFBVUEsRUFDbEQsTUFBT0EsYUFBaUIsTUFBUUEsRUFBTSxNQUFRLEtBQzlDLFNBQUFDLENBQ0YsRUFHQSxLQUFLLE9BQU8sS0FBS0MsQ0FBVSxFQUd2QixLQUFLLE9BQU8sT0FBUyxLQUFLLFdBQzVCLEtBQUssT0FBTyxNQUFNLEVBSXBCLFFBQVEsTUFBTSxzQkFBc0JILENBQU8sSUFBS0MsRUFBT0MsQ0FBUSxDQUlqRSxDQVFBLGlCQUFpQkQsRUFBT0csRUFBYSxDQUduQyxPQUZrQixLQUFLLGNBQWNILENBQUssRUFFdkIsQ0FDakIsSUFBSyxvQkFDSCxZQUFLLFNBQVMsb0JBQXFCQSxFQUFPLENBQUUsWUFBQUcsQ0FBWSxDQUFDLEVBQ2xELENBQ0wsT0FBUSxZQUNSLFNBQVVBLEVBQWMsRUFDeEIsUUFBUyxpREFDWCxFQUVGLElBQUssc0JBQ0gsWUFBSyxTQUFTLHNCQUF1QkgsQ0FBSyxFQUNuQyxDQUNMLE9BQVEscUJBQ1IsUUFBUyxvREFDWCxFQUVGLElBQUssb0JBQ0gsWUFBSyxTQUFTLHVCQUF3QkEsQ0FBSyxFQUNwQyxDQUNMLE9BQVEs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LFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFNBQVUsRUFDaGQsaUJBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFNBQVUsRUFDaGQsa0JBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFVBQVcsUUFBUyxFQUFLLEVBQy9kLEtBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFVBQVcsUUFBUyxFQUFLLEVBQy9kLE1BQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxN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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQWtHM0IsRUFFUCxZQUFZLHVCQUF3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0E2QjdCLEVBRVAsWUFBWSxvQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQXFPMUIsQ0FFVCxHQUFHLEdBSUYsVUFBWSxDQUlYLGVBQWV1QixFQUFnQkMsRUFBZSxDQUM1QyxHQUFJLENBQ0YsTUFBTTdjLEVBQVcsTUFBTSxNQUFN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QixFQUFLLENBQUMsRUFBRSxZQUFjLG1CQUN0QkEsRUFBSyxDQUFDLEVBQUUsWUFBYyxrQkFDdEJBLEVBQUssQ0FBQyxFQUFFLFlBQWMsd0JBQ3RCUixFQUFvQixFQUdoQlUsSUFBVyxFQUNULE9BQU8sa0JBQXFCLFlBQzlCLGlCQUFpQixHQUFHSCxDQUFXLGVBQWVFLENBQU8sZ0JBQWlCLFNBQVMsR0FHN0UsT0FBTyxrQkFBcUIsWUFDOUIsaUJBQWlCLEdBQUdGLENBQVcsS0FBS0UsQ0FBTyxlQUFlQyxDQUFNLFVBQVcsU0FBUyxFQUV0RixRQUFRLE1BQU0sMEJBQTJCQyxDQUFNLEdBSWpELFdBQVcsSUFBTSxDQUNYLE9BQU8sWUFBZSxZQUFZLFdBQVcsQ0FDbkQsRUFBRyxJQUFJLENBQ1QsQ0FFQW5CLEdBQVUsaUJBQWlCLFFBQVMsSUFBTSxDQUNwQ0ssRUFDRkssRUFBYyxFQUVkSCxFQUFlLENBRW5CLENBQUMsRUFFREosR0FBVSxpQkFBaUIsUUFBUyxJQUFNUyxFQUFZLE9BQU8sQ0FBQyxFQUM5RFIsR0FBUyxpQkFBaUIsUUFBUyxJQUFNUSxFQUFZLE1BQU0sQ0FBQyxFQUM1RHJQLEdBQVksaUJBQWlCLFFBQVMsSUFBTXFQLEVBQVksU0FBUyxDQUFDLEVBQ2xFakksR0FBVyxpQkFBaUIsUUFBUytILENBQWEsQ0FDcEQsR0FBRyIsCiAgIm5hbWVzIjogWyJ3aW5kb3ciLCAiRXJyb3JIYW5kbGVyIiwgImNvbnRleHQiLCAiZXJyb3IiLCAibWV0YWRhdGEiLCAiZXJyb3JFbnRyeSIsICJjdXJyZW50U3RlcCIsICJtZXNzYWdlIiwgInN0YXRzIiwgInR5cGUiLCAiZmFsbGJhY2tNZXNzYWdlIiwgIm1lbW9yeVN0b3JhZ2UiLCAia2V5IiwgInZhbHVlIiwgInJhdyIsICJzIiwgInIiLCAiYyIsICJrIiwgInYiLCAidG9rZW5zQnRuIiwgImVsIiwgInRsZFN1ZmZpeCIsICJwcm94eUlwSW5wdXQiLCAic3ViIiwgImRuc0lkIiwgImlkIiwgImluZm8iLCAidG9wUm93IiwgImRuc0lkcyIsICJzdmdJY29uIiwgImZpcnN0Q2hpbGQiLCAic2FmZUlkIiwgImxhYmVsIiwgImNhcmQiLCAicmVzcG9uc2UiLCAidXJsIiwgIm9wdGlvbnMiLCAibWV0aG9kIiwgIm5lZWRzQ3NyZiIsICJ0b2tlbiIsICJib2R5IiwgImZyZXNoVG9rZW4iLCAiZGF0YSIsICJyZXNwIiwgInJlc3VsdCIsICJtc2ciLCAiYnRuIiwgImxvYWRpbmdUZXh0IiwgImFzeW5jRm4iLCAib3B0cyIsICJvcmlnaW5hbCIsICJzdWNjZXNzVGV4dCIsICJyZXNldERlbGF5IiwgImUiLCAibW9kYWwiLCAiY2xvc2VCdG5zIiwgInRleHQiLCAiZHVyYXRpb24iLCAiZXhpc3RpbmdOb3RpZiIsICJjb2xvcnMiLCAidHMiLCAiZGlmZiIsICJmYWxsYmFjayIsICJodG1sIiwgImV2ZW50IiwgImZuIiwgIl9hIiwgImgiLCAiYXBwcyIsICJhcHAiLCAiaWR4IiwgImEiLCAiY2hhbmdlcyIsICJjcmVhdGVTa2VsZXRvbkNhcmQiLCAic2hvd1NrZWxldG9ucyIsICJjb3VudCIsICJncmlkIiwgImkiLCAic2siLCAiaGlkZVNrZWxldG9ucyIsICJza2VsZXRvbnMiLCAiVEhFTUVfS0VZIiwgIlVTRVJfVEhFTUVTX0tFWSIsICJMRUdBQ1lfQ1VTVE9NX0tFWSIsICJCVUlMVElOX1RIRU1FUyIsICJUSEVNRVMiLCAiVEhFTUVfUFJPUFMiLCAiQkFTRV9QUk9QUyIsICJERVJJVkVEX1BST1BTIiwgIlRIRU1FX0NPTE9SUyIsICJoZXhUb1JnYiIsICJoZXgiLCAicmdiVG9IZXgiLCAiZyIsICJiIiwgIngiLCAiYmxlbmRDb2xvcnMiLCAiaGV4MSIsICJoZXgyIiwgInJhdGlvIiwgImMxIiwgImMyIiwgImhleEx1bWluYW5jZSIsICJkZXJpdmVFeHRlbmRlZENvbG9ycyIsICJiZyIsICJmZyIsICJtdXRlZCIsICJjYXJkQmFzZSIsICJkb3RPayIsICJkb3RCYWQiLCAiaXNMaWdodCIsICJkZXJpdmVkIiwgImdlbmVyYXRlQm9keUJhY2tncm91bmRDU1MiLCAic2x1ZyIsICJhY2NlbnQiLCAiYWNjZW50UmdiIiwgImdlbmVyYXRlQnV0dG9uSG92ZXJDU1MiLCAiZ2V0U3lzdGVtVGhlbWUiLCAiY2xlYXJDdXN0b21Qcm9wZXJ0aWVzIiwgInByb3AiLCAic2x1Z2lmeSIsICJuYW1lIiwgImN1cnJlbnRTbHVnIiwgImNhY2hlZCIsICJiYXNlIiwgImNvdW50ZXIiLCAiaW5qZWN0VXNlclRoZW1lU3R5bGVzIiwgInRoZW1lc0RhdGEiLCAiZXhpc3RpbmciLCAidXNlclRoZW1lcyIsICJzbHVncyIsICJjc3MiLCAidGhlbWUiLCAiY29sb3JNYXAiLCAicCIsICJzdHlsZSIsICJzeW5jVGhlbWVzRnJvbVNlcnZlciIsICJzZXJ2ZXJUaGVtZXMiLCAiY3VycmVudCIsICJhcHBseVRoZW1lIiwgIm1pZ3JhdGVMZWdhY3lDdXN0b21UaGVtZSIsICJsZWdhY3kiLCAidGhlbWVEYXRhIiwgIm1vZGUiLCAidCIsICJtZXRhIiwgInNhdmVkVGhlbWUiLCAibWV0aG9kc0NhY2hlIiwgImZldGNoTWV0aG9kcyIsICJyZXMiLCAic2hvd1Byb3ZpZGVyU2VsZWN0b3IiLCAicHJvdmlkZXJzIiwgIm92ZXJsYXkiLCAib3JpZ2luYWxCb2R5IiwgInByb3ZpZGVyQnV0dG9ucyIsICJwcm92aWRlciIsICJyZW5kZXJQcm92aWRlckNoYWxsZW5nZSIsICJyZXN0b3JlT3JpZ2luYWxCb2R5IiwgImlucHV0IiwgInN1Ym1pdCIsICJzdGF0dXMiLCAiYmFjayIsICJlbWFpbCIsICJ2aWEiLCAibWFza2VkIiwgInNob3ciLCAic2hvd1RvdHBXaXRoRW1haWxGYWxsYmFjayIsICJ0b3RwUHJvdmlkZXIiLCAiZW1haWxFbmFibGVkIiwgImRpdiIsICJpc0FsbG93ZWRSZXR1cm5VcmwiLCAicmV0dXJuVXJsIiwgInBhcnNlZCIsICJzdWZmaXgiLCAidXJsUGFyYW1zIiwgInVwZGF0ZVRvdHBMb2dvIiwgIm0iLCAibHVtIiwgImRhcmsiLCAibGlnaHQiLCAic2hvd1RvdHBPdmVybGF5IiwgImZpcnN0SW5wdXQiLCAiaGlkZVRvdHBPdmVybGF5IiwgImJ1aWxkU3NvSGFuZG9mZlRhcmdldCIsICJyZWRpcmVjdCIsICJpc1ByaXZhdGVIb3N0IiwgInJldHVyblBhdGgiLCAiY29udGFpbmVyIiwgImlucHV0cyIsICJ2YWwiLCAiY29kZSIsICJzdWJtaXRUb3RwQ29kZSIsICJwYXN0ZWQiLCAiaW5wIiwgImVycm9yRWwiLCAidGFyZ2V0IiwgImhvc3RuYW1lIiwgImlzU2FtZU9yaWdpbiIsICJpc091clRsZCIsICJmZXRjaFJlY292ZXJ5SW5mbyIsICJzaG93UmVjb3ZlcnlMaW5rIiwgImxpbmsiLCAib3BlblJlY292ZXJ5UGFuZWwiLCAicGFuZWwiLCAic3RhdHVzRWwiLCAiaW1wb3J0RWwiLCAidmVyaWZ5RWwiLCAiY2xvc2VSZWNvdmVyeVBhbmVsIiwgInN1Ym1pdFJlY292ZXJ5U2VjcmV0IiwgInNlY3JldCIsICJzdWJtaXRSZWNvdmVyeUNvZGUiLCAiZXJyb3JIYW5kbGVyIiwgImN1cnJlbnRTZXJ2aWNlIiwgImFyclNlcnZpY2VzIiwgInF1YWxpdHlQcm9maWxlU2VydmljZXMiLCAiZ2V0U2VydmljZVVybCIsICJzZXJ2aWNlIiwgInNob3dFcnJvciIsICJoaWRlRXJyb3IiLCAidGl0bGUiLCAiZGVzYyIsICJzZWVkaG9zdFNlY3Rpb24iLCAiYXBpa2V5U2VjdGlvbiIsICJiYXNpY1NlY3Rpb24iLCAicXVhbGl0eVNlY3Rpb24iLCAiaXNFeHQiLCAiaXNBcnIiLCAiaGFzUXVhbGl0eSIsICJxdWFsU2VsZWN0IiwgImxvYWRTZXJ2aWNlQ3JlZHMiLCAiZG90IiwgImNsZWFyQnRuIiwgImhhc0NyZWRzIiwgInN2Y0lkIiwgImxvYWRRdWFsaXR5UHJvZmlsZXMiLCAicXVhbFN0YXR1cyIsICJzdmNVcmwiLCAicGFyYW1zIiwgIm9wdCIsICJtYXRjaDcyMCIsICJhcGlLZXkiLCAic2F2ZUJ0biIsICJ1c2VyIiwgInBhc3MiLCAicXVhbGl0eVByb2ZpbGVJZCIsICJxdWFsaXR5UHJvZmlsZU5hbWUiLCAic2VlZERhdGEiLCAiZCIsICJsb2FkVG90cFNldHRpbmdzIiwgImVuYWJsZWQiLCAic2Vzc2lvbkR1cmF0aW9uIiwgImlzU2V0VXAiLCAic3RhdHVzRG90IiwgInN0YXR1c1RleHQiLCAic3RhdHVzQmFubmVyIiwgInNldHVwU2VjdGlvbiIsICJxclNlY3Rpb24iLCAiZHVyYXRpb25TZWN0aW9uIiwgImRpc2FibGVTZWN0aW9uIiwgInNldHVwQnRuIiwgInVwZGF0ZUF1dGhDYXJkIiwgIkRVUkFUSU9OX0xBQkVMUyIsICJ0cmFuc2xhdGVkIiwgImkxOG4iLCAiYWN0aXZlIiwgInBpbGwiLCAicGF5bG9hZCIsICJibG9iIiwgImVyciIsICJBUEkiLCAiX2VsIiwgInRhZyIsICJhdHRycyIsICJjaGlsZHJlbiIsICJub2RlIiwgIl9mZXRjaEpTT04iLCAiY3NyZiIsICJfcmVuZGVyQmFkZ2UiLCAicm9sZSIsICJfcmVuZGVyVXNlcnNMaXN0IiwgInVzZXJzIiwgIm9uQ2hhbmdlIiwgInRhYmxlIiwgInRib2R5IiwgInUiLCAicm93IiwgImVtYWlsQ2VsbCIsICJyb2xlQ2VsbCIsICJhY3Rpb25zQ2VsbCIsICJyb2xlU2VsZWN0IiwgImV2IiwgImRlbEJ0biIsICJfcmVuZGVySW52aXRlRm9ybSIsICJvbklzc3VlZCIsICJmb3JtIiwgImZkIiwgInJvbGVTZWwiLCAiX3JlbmRlckludml0ZXNMaXN0IiwgImludml0ZXMiLCAiaW52IiwgIl9yZW5kZXJJc3N1ZWRJbnZpdGVCYW5uZXIiLCAiaW52aXRlIiwgInBhcmVudCIsICJiYW5uZXIiLCAiY29weUJ0biIsICJtb3VudCIsICJtZURhdGEiLCAicmVmcmVzaEJ0biIsICJ1c2Vyc0hlYWRlciIsICJ1c2Vyc0xpc3QiLCAidXNlcnNEYXRhIiwgImFkZFVzZXJGb3JtIiwgImludml0ZUZvcm1Db250YWluZXIiLCAiaW52aXRlc0xpc3QiLCAiaW52aXRlc0RhdGEiLCAiaXNzdWVkIiwgIm9wZW4iLCAiYmFja2Ryb3AiLCAiY2xvc2UiLCAiYXR0YWNoVHJpZ2dlciIsICJiYXJDb250YWluZXIiLCAiX21heWJlU2hvdyIsICJtZSIsICJnZXREbnNJZHMiLCAiZ2V0RG5zRGlzcGxheU5hbWUiLCAiYnVpbGRDcmVkZW50aWFsU2VjdGlvbnMiLCAiZ2V0RW5jcnlwdGlvbktleSIsICJvbGRLZXkiLCAiYXJyYXkiLCAiRU5DUllQVElPTl9LRVkiLCAiY3JlZGVudGlhbEVuY3J5cHQiLCAiaXYiLCAiaXZIZXgiLCAia2V5Qnl0ZXMiLCAiY2hhckNvZGUiLCAiY3JlZGVudGlhbERlY3J5cHQiLCAiZW5jcnlwdGVkVGV4dCIsICJkZWNvZGVkIiwgImdldENyZWRlbnRpYWwiLCAidG9rZW5UeXBlIiwgImNyZWRUeXBlIiwgImVuY3J5cHRlZCIsICJzZXRDcmVkZW50aWFsIiwgImdldFRva2VuIiwgImdldFVzZXJuYW1lIiwgInNldFRva2VuIiwgInNldFVzZXJuYW1lIiwgInVzZXJuYW1lIiwgImdldEFsbENyZWRlbnRpYWxzIiwgImNsZWFyQWxsQ3JlZGVudGlhbHMiLCAiZ2V0U3RvcmVkQ3JlZGVudGlhbHMiLCAicmVhZG9ubHlUb2tlbiIsICJyZWFkb25seVVzZXJuYW1lIiwgImFkbWluVG9rZW4iLCAiYWRtaW5Vc2VybmFtZSIsICJvbGRUb2tlbiIsICJvbGRVc2VybmFtZSIsICJjcmVkcyIsICJ0YXJnZXRJZCIsICJzZXJ2ZXJzIiwgImhhc0FueUNyZWRzIiwgImVudHJ5IiwgInJvVXNlciIsICJyb1Bhc3MiLCAiYWRtaW5Vc2VyIiwgImFkbWluUGFzcyIsICJzdGF0dXNMYWJlbCIsICJ1cCIsICJzZXRRdWljayIsICJyZXNwb25zZVRpbWUiLCAidGltZUVsIiwgImdldFJlc3BvbnNlVGltZUNsYXNzIiwgInRpbWUiLCAiaXNVcCIsICJjaGVja1NlcnZpY2VXaXRoVGltaW5nIiwgInN0YXJ0VGltZSIsICJlbmRUaW1lIiwgInJlZnJlc2hJbkZsaWdodCIsICJyZWZyZXNoUXVldWVkIiwgImxvYWRTZXJ2aWNlcyIsICJzZXJ2aWNlVXJsIiwgInN2YyIsICJkbnMiLCAiY2xzIiwgInR4dCIsICJuIiwgImJ1aWxkR3JpZCIsICJyb290IiwgIndyYXAiLCAiaW1nIiwgImFwcElkIiwgImNkblVybHMiLCAidW5pcXVlVXJscyIsICJuZXh0SW5kZXgiLCAibmFtZVNwYW4iLCAidHNCYWRnZSIsICJjYXRJbmZvIiwgImNhdEJhZGdlIiwgInVwZGF0ZUJhZGdlIiwgInJlc3BvbnNlUm93IiwgInRpbWVTcGFuIiwgImhlYWx0aFJvdyIsICJ1cHRpbWVDaGlwIiwgInVwdGltZU1pbmlCYXIiLCAidXB0aW1lRmlsbCIsICJidG5Sb3ciLCAibG9nc0J0biIsICJ1cGRhdGVCdG4iLCAiZXhlY0J0biIsICJjcmVkc0J0biIsICJvcHRCdG4iLCAic2hhcmVCdG4iLCAic2V0QmFkZ2UiLCAicmVmcmVzaEFsbCIsICJ1cGRhdGVTdGFtcCIsICJjaGVja2VkQXQiLCAic3RhbXAiLCAiYXBwbHlCYXRjaFJlc3VsdHMiLCAic3RhdHVzZXMiLCAicmVmcmVzaEZhbGxiYWNrIiwgInRvcENoZWNrcyIsICJ0b3BSZXN1bHRzIiwgImludGVybmV0UmVzdWx0IiwgImJhdGNoRXJyb3IiLCAiZmFsbGJhY2tFcnJvciIsICJvcGVuQnRuIiwgInJlc3RhcnREbnNTZXJ2aWNlIiwgInJlc3RhcnRCdG4iLCAidXBkYXRlRG5zU2VydmVyIiwgInNlcnZlcklwIiwgIm9yaWdpbmFsVGV4dCIsICJjaGVja1Jlc3VsdCIsICJ1cGRhdGVSZXN1bHQiLCAiZG93bmxvYWRJbmZvIiwgImluc3RydWN0aW9uc0luZm8iLCAiY3VycmVudERuc0lkIiwgIm9wZW5EbnNTZXR0aW5ncyIsICJzZXJ2ZXIiLCAic2F2ZURuc1NldHRpbmdzIiwgImlwIiwgInBvcnQiLCAidXBkYXRlIiwgImNsb3NlRG5zU2V0dGluZ3MiLCAicmVtb3ZlRG5zU2VydmVyIiwgImNvbmZpZyIsICJzZXR0aW5nc0J0biIsICJjdXJyZW50RG5zU2VydmljZSIsICJsb2dzSW50ZXJ2YWwiLCAibG9nc1BhdXNlZCIsICJjdXJyZW50Q29udGFpbmVySWQiLCAiY3VycmVudENvbnRhaW5lck5hbWUiLCAiY29udGFpbmVyTG9nc01vZGUiLCAiY3VycmVudExvZ1BhdGgiLCAiY3VycmVudExvZ1NlcnZpY2VOYW1lIiwgImZpbGVMb2dzTW9kZSIsICJsb2dFdmVudFNvdXJjZSIsICJpc1N0cmVhbWluZyIsICJmZXRjaERuc0xvZ3MiLCAibGluZXMiLCAic2VydmVySVAiLCAiZ2V0UmNvZGVDb2xvciIsICJyY29kZSIsICJyZW5kZXJEbnNMb2dFbnRyeSIsICJsb2ciLCAicmNvZGVDb2xvciIsICJpc0Jsb2NrZWQiLCAidXBkYXRlTG9nc0Rpc3BsYXkiLCAidXBkYXRlRmlsZUxvZ3NEaXNwbGF5IiwgInVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5IiwgImxvZ3NDb250ZW50IiwgImxvZ0VsZW1lbnQiLCAib3BlbkxvZ3NNb2RhbCIsICJwYXVzZUJ0biIsICJzdHJlYW1CdG4iLCAiY2xvc2VMb2dzTW9kYWwiLCAic3RvcExvZ1N0cmVhbWluZyIsICJzdGFydExvZ1N0cmVhbWluZyIsICJjb250YWluZXJJZCIsICJpc0Vycm9yIiwgImxldmVsQ29sb3IiLCAibGV2ZWxCYWRnZSIsICJmZXRjaENvbnRhaW5lckxvZ3MiLCAiZW5kcG9pbnQiLCAicmVuZGVyQ29udGFpbmVyTG9nRW50cnkiLCAic3RyZWFtQ29sb3IiLCAic3RyZWFtQmFkZ2UiLCAib3BlbkNvbnRhaW5lckxvZ3NNb2RhbCIsICJjb250YWluZXJOYW1lIiwgImZldGNoRmlsZUxvZ3MiLCAibG9nUGF0aCIsICJyZW5kZXJGaWxlTG9nRW50cnkiLCAibG9nTGV2ZWwiLCAib3BlbkZpbGVMb2dzTW9kYWwiLCAic2VydmljZU5hbWUiLCAibG9hZEV4aXN0aW5nQ0FzIiwgImNhZGR5ZmlsZVBhdGgiLCAic2VsZWN0IiwgImNhIiwgIm9wdGlvbiIsICJnZW5lcmF0ZUNhZGR5Q29uZmlnIiwgInN1YmRvbWFpbiIsICJzc2xUeXBlIiwgImNhTmFtZSIsICJleGlzdGluZ0NhIiwgImVuYWJsZUF1dGgiLCAiZW5hYmxlQ29ycyIsICJjdXN0b21IZWFkZXJzIiwgInVwc3RyZWFtUGF0aCIsICJoZWFsdGhDaGVjayIsICJ0aW1lb3V0IiwgInRhaWxzY2FsZU9ubHkiLCAiY2FkZHlDb25maWciLCAiaGVhZGVycyIsICJjcmVhdGVEbnNSZWNvcmQiLCAidHRsIiwgImRuc1Rva2VuIiwgImRvbWFpbiIsICJlcnJvclRleHQiLCAiYWRkU2VydmljZVRvQ29uZmlnIiwgInNlcnZpY2VDb25maWciLCAibmV3U2VydmljZSIsICJhZGRUb0NhZGR5ZmlsZSIsICJjdXJyZW50RWRpdFNlcnZpY2UiLCAib3BlblNlcnZpY2VFZGl0TW9kYWwiLCAiY2F0ZWdvcnlTZWxlY3QiLCAiY2xvc2VTZXJ2aWNlRWRpdE1vZGFsIiwgInNhdmVTZXJ2aWNlQ2hhbmdlcyIsICJuZXdTdWJkb21haW4iLCAibmV3TmFtZSIsICJuZXdQb3J0IiwgIm5ld0lwIiwgIm5ld0xvZ28iLCAibmV3Q2F0ZWdvcnkiLCAib2xkU3ViZG9tYWluIiwgImFwcEluZGV4IiwgImZpbGUiLCAicmVhZGVyIiwgImRhdGFVcmwiLCAic2hvd0RlbGV0ZU1vZGFsIiwgImhhc0NvbnRhaW5lciIsICJyZXNvbHZlIiwgImNvbnRhaW5lckluZm8iLCAiaGVscCIsICJjYW5jZWxCdG4iLCAicmVtb3ZlQnRuIiwgImRlbGV0ZUJ0biIsICJjbGVhbnVwIiwgImhhbmRsZUNhbmNlbCIsICJoYW5kbGVSZW1vdmUiLCAiaGFuZGxlRGVsZXRlIiwgImhhbmRsZUJhY2tkcm9wIiwgInVwZGF0ZUNvbnRhaW5lciIsICJzZXJ2aWNlSWQiLCAiZGVsZXRlU2VydmljZSIsICJkZWxldGVDb250YWluZXIiLCAicmVzdWx0cyIsICJzZXJ2aWNlSVAiLCAiZG5zUmVzdWx0IiwgImNhZGR5UmVzdWx0IiwgImluZGV4IiwgImN1c3RvbUFwcHMiLCAibG9jYWxJbmRleCIsICJzZXJ2aWNlUmVzdWx0IiwgImhhc0Vycm9ycyIsICJlcnJvck1lc3NhZ2VzIiwgInN1Y2Nlc3NTdGF0ZXMiLCAiaXNTdWNjZXNzIiwgImRlcml2ZVN1YmRvbWFpbiIsICJnZXRTbWFydFNzbERlZmF1bHQiLCAidXBkYXRlU2VydmljZVByZXZpZXciLCAiUVVJQ0tfSVBTIiwgImRuc1ByZXZpZXciLCAidXJsUHJldmlldyIsICJjb25maWdQcmV2aWV3IiwgImRldGVjdE5ldHdvcmtJUHMiLCAibGFuQnRuIiwgInRzQnRuIiwgImlwSW5wdXQiLCAiaW5pdFF1aWNrSVBCdXR0b25zIiwgImN1cnJlbnRJUCIsICJvcGVuQWRkU2VydmljZU1vZGFsIiwgIm1vZGFsQ29udGVudCIsICJzc2xTZWxlY3QiLCAidGFpbHNjYWxlU3RhdHVzIiwgInRhaWxzY2FsZUNoZWNrYm94IiwgInNldHVwU2VydmljZVR5cGVTd2l0Y2hpbmciLCAibG9jYWxSYWRpbyIsICJleHRlcm5hbFJhZGlvIiwgImxvY2FsQ29uZmlnIiwgImV4dGVybmFsQ29uZmlnIiwgInRhYkxvY2FsIiwgInRhYkV4dGVybmFsIiwgInN3aXRjaFNlcnZpY2VUeXBlIiwgInNldHVwQXV0b1N1YmRvbWFpbiIsICJuYW1lSW5wdXQiLCAic3ViZG9tYWluSW5wdXQiLCAic3ViZG9tYWluUHJldmlldyIsICJ1c2VyRWRpdGVkU3ViZG9tYWluIiwgImV4dE5hbWVJbnB1dCIsICJleHRTdWJkb21haW5JbnB1dCIsICJleHRTdWJkb21haW5QcmV2aWV3IiwgImV4dERvbWFpblByZXZpZXciLCAidXNlckVkaXRlZEV4dFN1YmRvbWFpbiIsICJjcmVhdGVFeHRlcm5hbFNlcnZpY2UiLCAiZXh0ZXJuYWxVcmwiLCAibG9nbyIsICJpY29uIiwgImNyZWF0ZURucyIsICJjcmVhdGVDYWRkeSIsICJwcm94eUlwIiwgInByZXNlcnZlSG9zdCIsICJmb2xsb3dSZWRpcmVjdHMiLCAiY2F0ZWdvcnkiLCAiZGVmYXVsdFNlcnZpY2VzIiwgImN1c3RvbVNlcnZpY2VzIiwgImNsb3NlQWRkU2VydmljZU1vZGFsIiwgInBhcnRzIiwgInN1YlByZXYiLCAiZXh0U3ViUHJldiIsICJleHROYW1lIiwgImV4dFN1YiIsICJleHRVcmwiLCAiZXh0TG9nbyIsICJleHRJY29uIiwgImxvY2FsT3B0cyIsICJleHRPcHRzIiwgImNyZWF0ZU5ld1NlcnZpY2UiLCAic3RhdHVzUGFydHMiLCAiZXhpc3RpbmdDYUNvbmZpZyIsICJjdXN0b21DYUNvbmZpZyIsICJidXR0b24iLCAiZG5zQ29uZmlnIiwgImVsZW1lbnQiLCAibG9hZEN1c3RvbVNlcnZpY2VzIiwgImVzIiwgInJlY29ubmVjdERlbGF5IiwgIk1BWF9SRUNPTk5FQ1QiLCAiY29ubmVjdCIsICJ1cGRhdGVzQnRuIiwgInNlYXJjaElucHV0IiwgInN0YXR1c1NlbGVjdCIsICJjb3VudFNwYW4iLCAiZ2V0Q2F0ZWdvcnlMaXN0IiwgInNlZW4iLCAiZnJvbUNhcmRzIiwgImNhdCIsICJhcGlDYXRzIiwgInJlZnJlc2hDYXRlZ29yeURyb3Bkb3duIiwgImxpc3QiLCAibyIsICJ1cGRhdGVGaWx0ZXIiLCAicXVlcnkiLCAic3RhdHVzRmlsdGVyIiwgImNhdGVnb3J5RmlsdGVyIiwgImNhcmRzIiwgInZpc2libGVDb3VudCIsICJ0b3RhbCIsICJkZWJvdW5jZSIsICJkZWxheSIsICJhcmdzIiwgImJhdGNoQnRuIiwgImJhdGNoQmFyIiwgImJhdGNoQ291bnQiLCAic3RhcnRCdG4iLCAic3RvcEJ0biIsICJiYXRjaE1vZGUiLCAic2VsZWN0ZWRDb250YWluZXJzIiwgImVudGVyQmF0Y2hNb2RlIiwgInVwZGF0ZVNlbGVjdGVkQ291bnQiLCAiY2hlY2tib3giLCAiZXhpdEJhdGNoTW9kZSIsICJjYiIsICJiYXRjaEFjdGlvbiIsICJhY3Rpb24iLCAiY29udGFpbmVycyIsICJhY3Rpb25MYWJlbCIsICJidG5zIiwgInN1Y2Nlc3MiLCAiZmFpbGVkIiwgImVycm9ycyJdCn0K + ${w.self?.hostname} (${w.self?.ip}) + `,f.disabled=!1):w.installed?(r.innerHTML='\u26A0 Not connected',f.disabled=!0):(r.innerHTML='Not available',f.disabled=!0)}catch{r.innerHTML='Could not check',f.disabled=!0}f.checked=!1,m()}function u(){const t=document.getElementById("service-type-local"),e=document.getElementById("service-type-external"),i=document.getElementById("local-service-config"),n=document.getElementById("external-service-config"),r=document.getElementById("tab-local"),f=document.getElementById("tab-external");function p(){t.checked?(i.style.display="grid",n.style.display="none",r&&(r.style.background="var(--accent)",r.style.color="var(--bg)"),f&&(f.style.background="transparent",f.style.color="var(--muted)")):(i.style.display="none",n.style.display="block",f&&(f.style.background="var(--accent)",f.style.color="var(--bg)"),r&&(r.style.background="transparent",r.style.color="var(--muted)"))}t?.addEventListener("change",p),e?.addEventListener("change",p)}function l(){const t=document.getElementById("service-name-input"),e=document.getElementById("service-subdomain-input"),i=document.getElementById("subdomain-preview");let n=!1;t?.addEventListener("input",()=>{const L=c(t.value);!n&&e&&(e.value=L),i&&(i.textContent=L?`\u2192 ${buildDomain(L)}`:""),m()}),e?.addEventListener("input",()=>{n=e.value!==c(t?.value||"");const L=e.value.trim()||c(t?.value||"");i&&(i.textContent=L?`\u2192 ${buildDomain(L)}`:""),m()});const r=document.getElementById("external-service-name"),f=document.getElementById("external-service-subdomain"),p=document.getElementById("external-subdomain-preview"),w=document.getElementById("external-domain-preview");let I=!1;r?.addEventListener("input",()=>{const L=c(r.value);!I&&f&&(f.value=L);const P=f?.value||L;p&&(p.textContent=P?`\u2192 ${buildDomain(P)}`:""),w&&(w.textContent=P?buildDomain(P):"")}),f?.addEventListener("input",()=>{I=f.value!==c(r?.value||"");const L=f.value.trim()||c(r?.value||"");p&&(p.textContent=L?`\u2192 ${buildDomain(L)}`:""),w&&(w.textContent=L?buildDomain(L):"")})}async function a(){const t=document.getElementById("external-service-name").value.trim(),e=document.getElementById("external-service-url").value.trim(),i=(document.getElementById("external-service-subdomain").value.trim()||c(t)).toLowerCase(),n=document.getElementById("external-service-logo").value.trim(),r=document.getElementById("external-service-icon").value.trim(),f=document.getElementById("external-create-dns").checked,p=document.getElementById("external-create-caddy").checked,w=document.getElementById("external-proxy-ip").value.trim()||SITE.dnsIp||"localhost",I=document.getElementById("external-preserve-host").checked,L=document.getElementById("external-follow-redirects").checked,P=document.getElementById("external-service-category")?.value||"";if(!t||!e){showNotification("Please fill in Name and External URL","warning");return}if(!i){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(!e.startsWith("http://")&&!e.startsWith("https://")){showNotification("External URL must start with http:// or https://","warning");return}const C=buildDomain(i);try{const B={dns:null,caddy:null,dashboard:!1};if(f)if(window.getToken(getPrimaryDnsId(),"admin"))try{const A=await(await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:C,ip:w,ttl:DC.DEFAULTS.TTL,server:SITE.dnsIp})})).json();B.dns=A.success?"created":A.error||"failed"}catch(k){B.dns=k.message}else B.dns="no admin token (configure in \u{1F511} Tokens)";if(p)try{const T={subdomain:i,externalUrl:e,preserveHost:I,followRedirects:L,sslType:"caddy-managed",caddyfilePath:DC.DEFAULTS.CADDYFILE,reloadCaddy:!0},A=await(await secureFetch("/api/v1/site/external",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(T)})).json();B.caddy=A.success?"created":A.error||"failed"}catch(T){B.caddy=T.message}const $={id:i,name:t,url:`https://${C}`,externalUrl:e,logo:n||r||"\u{1F310}",isExternal:!0,isCustom:!0};P&&($.category=P),window.APPS.push($),B.dashboard=!0;const E=["plex","router","chat","sync","torrent","radarr","sonarr","prowlarr","portainer","requests","jellyfin","emby"],x=window.APPS.filter(T=>!E.includes(T.id));safeSet("custom-services",JSON.stringify(x));try{await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(window.APPS)})}catch(T){console.warn("Failed to save to services.json:",T)}window.buildGrid(),window.refreshAll(),o();const S=[`External service "${t}" added!`];f&&S.push(`DNS: ${B.dns==="created"?"\u2713":"\u26A0 "+B.dns}`),p&&S.push(`Caddy: ${B.caddy==="created"?"\u2713":"\u26A0 "+B.caddy}`),S.push(`Access at: https://${C}`),showNotification(S.join(" | "),"success",6e3)}catch(B){console.error("Failed to create external service:",B),showNotification(`Failed to create external service: ${B.message}`,"error")}}function o(){closeModal("add-service-modal"),document.body.style.overflow="",document.getElementById("service-name-input").value="",document.getElementById("service-subdomain-input").value="",document.getElementById("service-port-input").value="",document.getElementById("service-ip-input").value=h.lan||"",document.getElementById("service-logo-input").value="",document.getElementById("dns-ttl-input").value=DC.DEFAULTS.TTL,document.getElementById("ssl-type-select").value=s(),document.getElementById("ca-name-input").value="",document.getElementById("enable-auth").checked=!1,document.getElementById("enable-cors").checked=!1,document.getElementById("custom-headers-input").value="",document.getElementById("upstream-path-input").value="/",document.getElementById("health-check-input").value="",document.getElementById("timeout-input").value="30";const t=document.getElementById("subdomain-preview");t&&(t.textContent="");const e=document.getElementById("external-subdomain-preview");e&&(e.textContent="");const i=document.getElementById("external-service-name");i&&(i.value="");const n=document.getElementById("external-service-subdomain");n&&(n.value="");const r=document.getElementById("external-service-url");r&&(r.value="");const f=document.getElementById("external-service-logo");f&&(f.value="");const p=document.getElementById("external-service-icon");p&&(p.value="");const w=document.getElementById("local-advanced-options");w&&w.removeAttribute("open");const I=document.getElementById("external-advanced-options");I&&I.removeAttribute("open");const L=document.getElementById("service-type-local");L&&(L.checked=!0);const P=document.getElementById("local-service-config"),C=document.getElementById("external-service-config");P&&(P.style.display="grid"),C&&(C.style.display="none");const B=document.getElementById("tab-local"),$=document.getElementById("tab-external");B&&(B.style.background="var(--accent)",B.style.color="var(--bg)"),$&&($.style.background="transparent",$.style.color="var(--muted)")}async function g(){const t=document.getElementById("service-name-input").value.trim(),e=(document.getElementById("service-subdomain-input").value.trim()||c(t)).toLowerCase(),i=document.getElementById("service-port-input").value.trim(),n=document.getElementById("service-ip-input").value.trim(),r=document.getElementById("service-logo-input").value.trim(),f=document.getElementById("create-dns-record").checked,p=parseInt(document.getElementById("dns-ttl-input").value)||DC.DEFAULTS.TTL,w=document.getElementById("manual-tailscale-only")?.checked||!1,I=document.getElementById("ssl-type-select")?.value||"caddy-managed",L=document.getElementById("ca-name-input")?.value||"",P=document.getElementById("existing-ca-select")?.value||"",C=document.getElementById("enable-auth")?.checked||!1,B=document.getElementById("enable-cors")?.checked||!1,$=document.getElementById("custom-headers-input")?.value||"",E=document.getElementById("upstream-path-input")?.value||"/",x=document.getElementById("health-check-input")?.value||"",S=document.getElementById("timeout-input")?.value||30,k=(document.getElementById("service-category-input")||document.getElementById("external-service-category"))?.value||"",A=window.getToken(getPrimaryDnsId(),"admin");if(!t||!i||!n){showNotification("Please fill in Name, Port, and IP Address","warning");return}if(!e){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(f&&!A){showNotification("DNS Admin token required. Configure it in the Tokens menu first.","warning");return}const D={dns:null,caddy:null,dashboard:!1};try{if(f)try{await window.createDnsRecord(e,n,p),D.dns="created"}catch(N){throw console.error("DNS creation failed:",N),D.dns=N.message,new Error(`DNS creation failed: ${N.message}`)}else D.dns="skipped";const O=window.generateCaddyConfig({subdomain:e,port:i,ip:n,sslType:I,caName:L,existingCa:P,enableAuth:C,enableCors:B,customHeaders:$,upstreamPath:E,healthCheck:x,timeout:S,tailscaleOnly:w});try{const U=await(await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(e),upstream:`${n}:${i}`,config:O})})).json();if(U.success)D.caddy="added & reloaded";else throw console.error("Caddy configuration failed:",U.error),D.caddy=U.error||"failed",new Error(`Caddy configuration failed: ${U.error}`)}catch(N){throw console.error("Caddy API error:",N),D.caddy=N.message,new Error(`Caddy API error: ${N.message}`)}const R={name:t,subdomain:e,port:i,ip:n,logo:r||`/assets/${e}.png`,tailscaleOnly:w||!1};k&&(R.category=k),await window.addServiceToConfig(R),D.dashboard=!0;const _=[`DNS: ${D.dns==="created"?"\u2713":D.dns==="skipped"?"\u25CB":"\u2717"}`,`Caddy: ${D.caddy==="added & reloaded"?"\u2713":"\u2717"}`,`Dashboard: ${D.dashboard?"\u2713":"\u2717"}`];showNotification(`Service "${t}" created! ${_.join(" | ")} \u2014 ${buildServiceUrl(e)}${w?" (Tailscale)":""}`,"success",6e3),o(),window.buildGrid(),window.refreshAll()}catch(O){console.error("Error creating service:",O),showNotification(`Error creating "${t}": ${O.message}`,"error",6e3)}}document.getElementById("add-service")?.addEventListener("click",v),document.getElementById("add-service-cancel")?.addEventListener("click",o),document.getElementById("add-service-create")?.addEventListener("click",()=>{document.querySelector('input[name="service-type"]:checked')?.value==="external"?a():g()}),u(),l(),y(),document.getElementById("ssl-type-select")?.addEventListener("change",t=>{const e=document.getElementById("existing-ca-config"),i=document.getElementById("custom-ca-config");e.style.display="none",i.style.display="none",t.target.value==="existing-ca"?e.style.display="block":t.target.value==="custom-ca"&&(i.style.display="block"),m()}),document.getElementById("refresh-cas")?.addEventListener("click",async()=>{const t=document.getElementById("refresh-cas"),e=t.textContent;t.textContent="\u231B Loading...",t.disabled=!0;try{const i=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(i),t.textContent="\u2705 Refreshed"}catch(i){t.textContent="\u274C Failed",console.error("Failed to refresh CAs:",i)}setTimeout(()=>{t.textContent=e,t.disabled=!1},2e3)}),document.getElementById("create-dns-record")?.addEventListener("change",t=>{const e=document.getElementById("dns-config");e.style.display=t.target.checked?"block":"none"}),["service-subdomain-input","service-ip-input","service-port-input","ca-name-input","existing-ca-select","enable-auth","enable-cors","custom-headers-input","upstream-path-input","health-check-input","timeout-input"].forEach(t=>{const e=document.getElementById(t);e&&(e.addEventListener("input",m),e.addEventListener("change",m))});function d(){const t=safeGet("custom-services");if(t)try{JSON.parse(t).forEach(i=>{window.APPS.find(n=>n.id===i.id)||window.APPS.push(i)})}catch(e){console.warn("Failed to load custom services:",e)}}d(),window.openAddServiceModal=v,window.closeAddServiceModal=o})(),(function(){let c=null,s=1e3;const m=3e4;let h=0,b=!1;function y(){if(c)try{c.close()}catch{}b||(c=new EventSource("/api/v1/events/stream"),c.addEventListener("connected",()=>{s=1e3,h=0,debug("[SSE] Connected to event stream")}),c.addEventListener("status-change",l=>{try{const a=JSON.parse(l.data);if(a.serviceId&&typeof window.setBadge=="function"){const o=a.status==="up"||a.status==="healthy";window.setBadge(a.serviceId,o,a.responseTime||null)}}catch{}}),c.addEventListener("resource-alert",l=>{try{const a=JSON.parse(l.data),o=`${a.containerName||a.containerId}: ${a.metric} at ${a.value}% (threshold: ${a.threshold}%)`;typeof showNotification=="function"&&showNotification(o,"warning")}catch{}}),c.addEventListener("auto-restart",l=>{try{const a=JSON.parse(l.data);typeof showNotification=="function"&&showNotification(`Container "${a.containerName}" was auto-restarted`,"info")}catch{}}),c.addEventListener("update-available",l=>{try{const a=JSON.parse(l.data),o=document.getElementById("updates-btn");if(o&&!o.querySelector(".sse-dot")){const g=document.createElement("span");g.className="sse-dot",g.style.cssText="display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);margin-left:6px;vertical-align:middle;",o.appendChild(g)}typeof showNotification=="function"&&showNotification(`Update available for ${a.containerName||a.containerId}`,"info")}catch{}}),c.addEventListener("update-complete",l=>{try{const a=JSON.parse(l.data);typeof showNotification=="function"&&showNotification(`Update completed: ${a.containerName||a.containerId}`,"success"),typeof window.refreshAll=="function"&&window.refreshAll()}catch{}}),c.addEventListener("update-failed",l=>{try{const a=JSON.parse(l.data);typeof showNotification=="function"&&showNotification(`Update failed: ${a.containerName||a.containerId} \u2014 ${a.error||"unknown error"}`,"error")}catch{}}),c.addEventListener("incident",l=>{try{const a=JSON.parse(l.data);typeof showNotification=="function"&&(a.type==="created"?showNotification(`Incident: ${a.message||a.serviceId}`,"error"):a.type==="resolved"&&showNotification(`Resolved: ${a.serviceId||"incident"}`,"success"))}catch{}}),c.onerror=()=>{if(c.close(),window._dcAuthLost||b){console.warn("[SSE] Auth lost \u2014 stopping reconnection");return}if(h++,h>5){console.warn("[SSE] Max reconnect attempts reached \u2014 stopping (server unreachable)");return}console.warn(`[SSE] Disconnected, reconnecting in ${s/1e3}s...`),setTimeout(y,s),s=Math.min(s*2,m)})}function v(){if(b=!0,c)try{c.close()}catch{}}function u(){b=!1,h=0,s=1e3,y()}y(),window._sseReconnect=y,window._sseClose=v,window._sseResume=u})(),(function(){const c=document.getElementById("service-filter-search"),s=document.getElementById("service-filter-status"),m=document.getElementById("service-filter-category"),h=document.getElementById("service-filter-count");function b(){const l=new Set,a=new Set;document.querySelectorAll("#cards .card[data-category]").forEach(d=>{const t=d.dataset.category.trim();t&&a.add(t)});const o=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES||{};return Object.keys(o).concat([...a].filter(d=>!o[d])).forEach(d=>l.add(d)),{list:[...l],apiCats:o}}function y(){if(!m)return;const{list:l,apiCats:a}=b(),o=m.value;m.innerHTML='',l.sort().forEach(g=>{const d=a[g],t=document.createElement("option");t.value=g,t.textContent=d?`${d.icon||""} ${g}`.trim():g,m.appendChild(t)}),o&&[...m.options].some(g=>g.value===o)?m.value=o:m.value="all"}function v(){y();const l=c.value.toLowerCase().trim(),a=s.value,o=m?m.value:"all",g=document.querySelectorAll("#cards .card");let d=0;if(g.forEach(t=>{const e=t.querySelector(".name")?.textContent?.toLowerCase()||"",i=t.dataset.app?.toLowerCase()||"",n=t.dataset.status||"off",r=t.dataset.category||"";(!l||e.includes(l)||i.includes(l))&&(a==="all"||n===a)&&(o==="all"||r===o)?(t.style.display="",d++):t.style.display="none"}),h){const t=g.length;h.textContent=`${d} of ${t} services`}}function u(l,a){let o;return function(...g){clearTimeout(o),o=setTimeout(()=>l.apply(this,g),a)}}c?.addEventListener("input",u(v,200)),s?.addEventListener("change",v),m?.addEventListener("change",v),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>setTimeout(v,500)):setTimeout(v,500),window.refreshServiceFilter=v,window.refreshCategoryDropdown=y})(),(function(){const c=document.getElementById("batch-operations-btn"),s=document.getElementById("batch-action-bar"),m=document.getElementById("batch-selected-count"),h=document.getElementById("batch-start-btn"),b=document.getElementById("batch-stop-btn"),y=document.getElementById("batch-restart-btn"),v=document.getElementById("batch-cancel-btn");let u=!1,l=new Set;function a(){u=!0,l.clear(),s.style.display="",c.textContent="\u2713 Exit Batch Mode",g(),document.querySelectorAll("#cards .card[data-app]").forEach(e=>{const i=e.dataset.containerId;if(!i)return;const n=e.querySelector(".batch-checkbox");n&&n.remove();const r=document.createElement("input");r.type="checkbox",r.className="batch-checkbox",r.dataset.containerId=i,r.dataset.serviceName=e.querySelector(".name")?.textContent||i,r.style.cssText="position: absolute; top: 8px; left: 8px; z-index: 10; width: 18px; height: 18px; cursor: pointer;",r.addEventListener("change",f=>{f.stopPropagation(),r.checked?l.add(i):l.delete(i),g()}),e.style.position="relative",e.insertBefore(r,e.firstChild)})}function o(){u=!1,l.clear(),s.style.display="none",c.textContent="\u2630 Batch Operations",document.querySelectorAll(".batch-checkbox").forEach(t=>t.remove())}function g(){const t=l.size;m.textContent=`${t} selected`,h.disabled=t===0,b.disabled=t===0,y.disabled=t===0}async function d(t){if(l.size===0)return;const e=Array.from(l),i={start:"Starting",stop:"Stopping",restart:"Restarting"}[t];if(!confirm(`${i} ${e.length} container(s)? This cannot be undone.`))return;const n=[h,b,y];n.forEach(w=>{w.disabled=!0,w.textContent="..."});let r=0,f=0;const p=[];for(const w of e)try{const I=await fetch(`/api/v1/containers/${encodeURIComponent(w)}/${t}`,{method:"POST"});if(I.ok)r++;else{f++;const L=await I.json().catch(()=>({}));p.push(`${w}: ${L.error||I.statusText}`)}}catch(I){f++,p.push(`${w}: ${I.message}`)}n[0].textContent="\u25B6 Start All",n[1].textContent="\u2B1B Stop All",n[2].textContent="\u{1F504} Restart All",g(),f===0?typeof showNotification=="function"&&showNotification(`${i} completed: ${r} container(s)`,"success"):(typeof showNotification=="function"&&showNotification(`${i}: ${r} succeeded, ${f} failed`,"warning"),console.error("Batch operation errors:",p)),setTimeout(()=>{typeof refreshAll=="function"&&refreshAll()},1500)}c?.addEventListener("click",()=>{u?o():a()}),h?.addEventListener("click",()=>d("start")),b?.addEventListener("click",()=>d("stop")),y?.addEventListener("click",()=>d("restart")),v?.addEventListener("click",o)})(); +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBFcnJvciBIYW5kbGVyXG4gKiBIYW5kbGVzIGVycm9ycyBncmFjZWZ1bGx5IHdpdGhvdXQgYnJlYWtpbmcgdGhlIG9uYm9hcmRpbmcgdG91clxuICovXG5cbihmdW5jdGlvbih3aW5kb3cpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIEVycm9ySGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgdGhpcy5tYXhFcnJvcnMgPSA1MDsgLy8gS2VlcCBsYXN0IDUwIGVycm9yc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhbiBlcnJvciB3aXRob3V0IGJyZWFraW5nIHRoZSB0b3VyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgLSBDb250ZXh0IHdoZXJlIGVycm9yIG9jY3VycmVkXG4gICAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1ldGFkYXRhIC0gQWRkaXRpb25hbCBtZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ0Vycm9yKGNvbnRleHQsIGVycm9yLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgICBjb25zdCBlcnJvckVudHJ5ID0ge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IG51bGwsXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgdG8gZXJyb3JzIGFycmF5XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yRW50cnkpO1xuXG4gICAgICAvLyBLZWVwIG9ubHkgbGFzdCBtYXhFcnJvcnNcbiAgICAgIGlmICh0aGlzLmVycm9ycy5sZW5ndGggPiB0aGlzLm1heEVycm9ycykge1xuICAgICAgICB0aGlzLmVycm9ycy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgdG8gY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihgW09uYm9hcmRpbmcgRXJyb3JdICR7Y29udGV4dH06YCwgZXJyb3IsIG1ldGFkYXRhKTtcblxuICAgICAgLy8gT3B0aW9uYWxseSBzZW5kIHRvIGVycm9yIHRyYWNraW5nIHNlcnZpY2VcbiAgICAgIC8vIHRoaXMuc2VuZFRvRXJyb3JUcmFja2luZyhlcnJvckVudHJ5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBhbiBlcnJvciBhbmQgY29udGludWUgdG91clxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RlcCAtIEN1cnJlbnQgc3RlcCBpbmRleFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJlY292ZXJ5IGFjdGlvblxuICAgICAqL1xuICAgIHJlY292ZXJGcm9tRXJyb3IoZXJyb3IsIGN1cnJlbnRTdGVwKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB0aGlzLmNsYXNzaWZ5RXJyb3IoZXJyb3IpO1xuXG4gICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICBjYXNlICdFTEVNRU5UX05PVF9GT1VORCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignRWxlbWVudCBOb3QgRm91bmQnLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIGFjdGlvbjogJ1NLSVBfU1RFUCcsIFxuICAgICAgICAgICAgbmV4dFN0ZXA6IGN1cnJlbnRTdGVwICsgMSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUYXJnZXQgZWxlbWVudCBub3QgZm91bmQsIHNraXBwaW5nIHRvIG5leHQgc3RlcCdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ1NUT1JBR0VfVU5BVkFJTEFCTEUnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBhY3Rpb246ICdVU0VfTUVNT1JZX1NUT1JBR0UnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0xvY2FsIHN0b3JhZ2UgdW5hdmFpbGFibGUsIHVzaW5nIGluLW1lbW9yeSBzdG9yYWdlJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnRFJJVkVSX05PVF9MT0FERUQnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ0RyaXZlci5qcyBOb3QgTG9hZGVkJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdEcml2ZXIuanMgbGlicmFyeSBub3QgbG9hZGVkLCBjYW5ub3Qgc3RhcnQgdG91cidcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ0lOVkFMSURfVE9PTFRJUCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignSW52YWxpZCBUb29sdGlwIENvbmZpZ3VyYXRpb24nLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnU0tJUF9TVEVQJyxcbiAgICAgICAgICAgIG5leHRTdGVwOiBjdXJyZW50U3RlcCArIDEsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b29sdGlwIGNvbmZpZ3VyYXRpb24sIHNraXBwaW5nJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVGhlbWUgRGV0ZWN0aW9uIEZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnVVNFX0RFRkFVTFRfVEhFTUUnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1VzaW5nIGRlZmF1bHQgZGFyayB0aGVtZSdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVW5rbm93biBFcnJvcicsIGVycm9yLCB7IGN1cnJlbnRTdGVwIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLCBhYm9ydGluZyB0b3VyJ1xuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xhc3NpZnkgZXJyb3IgdHlwZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBUaGUgZXJyb3Igb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ30gRXJyb3IgdHlwZVxuICAgICAqL1xuICAgIGNsYXNzaWZ5RXJyb3IoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IGVycm9yLnRvU3RyaW5nKCk7XG5cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdlbGVtZW50JykgJiYgbWVzc2FnZS5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgcmV0dXJuICdFTEVNRU5UX05PVF9GT1VORCc7XG4gICAgICB9XG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcygnc3RvcmFnZScpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ3F1b3RhJykpIHtcbiAgICAgICAgcmV0dXJuICdTVE9SQUdFX1VOQVZBSUxBQkxFJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdkcml2ZXInKSB8fCBtZXNzYWdlLmluY2x1ZGVzKCd1bmRlZmluZWQnKSkge1xuICAgICAgICByZXR1cm4gJ0RSSVZFUl9OT1RfTE9BREVEJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkJykgfHwgbWVzc2FnZS5pbmNsdWRlcygndmFsaWRhdGlvbicpKSB7XG4gICAgICAgIHJldHVybiAnSU5WQUxJRF9UT09MVElQJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCd0aGVtZScpKSB7XG4gICAgICAgIHJldHVybiAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnVU5LTk9XTic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBsb2dnZWQgZXJyb3JzXG4gICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiBlcnJvciBlbnRyaWVzXG4gICAgICovXG4gICAgZ2V0RXJyb3JzKCkge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLmVycm9yc107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIGxvZ2dlZCBlcnJvcnNcbiAgICAgKi9cbiAgICBjbGVhckVycm9ycygpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGVycm9yIHN0YXRpc3RpY3NcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBFcnJvciBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgZ2V0U3RhdGlzdGljcygpIHtcbiAgICAgIGNvbnN0IHN0YXRzID0ge1xuICAgICAgICB0b3RhbDogdGhpcy5lcnJvcnMubGVuZ3RoLFxuICAgICAgICBieUNvbnRleHQ6IHt9LFxuICAgICAgICBieVR5cGU6IHt9LFxuICAgICAgICByZWNlbnQ6IHRoaXMuZXJyb3JzLnNsaWNlKC0xMClcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZXJyb3JzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICAvLyBDb3VudCBieSBjb250ZXh0XG4gICAgICAgIHN0YXRzLmJ5Q29udGV4dFtlcnJvci5jb250ZXh0XSA9IChzdGF0cy5ieUNvbnRleHRbZXJyb3IuY29udGV4dF0gfHwgMCkgKyAxO1xuXG4gICAgICAgIC8vIENvdW50IGJ5IHR5cGVcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY2xhc3NpZnlFcnJvcih7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICAgIHN0YXRzLmJ5VHlwZVt0eXBlXSA9IChzdGF0cy5ieVR5cGVbdHlwZV0gfHwgMCkgKyAxO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzdGF0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZ3JhY2VmdWwgZGVncmFkYXRpb24gd2hlbiBEcml2ZXIuanMgZmFpbHMgdG8gbG9hZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGZhbGxiYWNrIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgaGFuZGxlRHJpdmVyTG9hZEZhaWx1cmUoKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKCdEcml2ZXIuanMgTG9hZCBGYWlsdXJlJywgJ0RyaXZlci5qcyBsaWJyYXJ5IGZhaWxlZCB0byBsb2FkJyk7XG5cbiAgICAgIC8vIFNob3cgZmFsbGJhY2sgbWVzc2FnZVxuICAgICAgY29uc3QgZmFsbGJhY2tNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaWQgPSAnb25ib2FyZGluZy1mYWxsYmFjayc7XG4gICAgICBmYWxsYmFja01lc3NhZ2Uuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBib3R0b206IDIwcHg7XG4gICAgICAgIHJpZ2h0OiAyMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMyYTJhMmEpO1xuICAgICAgICBjb2xvcjogdmFyKC0tZmcsICNmZmZmZmYpO1xuICAgICAgICBwYWRkaW5nOiAxNXB4IDIwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMyk7XG4gICAgICAgIHotaW5kZXg6IDk5OTk7XG4gICAgICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGA7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaW5uZXJIVE1MID0gYFxuICAgICAgICA8c3Ryb25nPldlbGNvbWUgdG8gRGFzaENhZGR5ITwvc3Ryb25nPjxicj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDEwcHggMCAwIDA7IGZvbnQtc2l6ZTogMTJweDtcIj5cbiAgICAgICAgICBUaGUgaW50ZXJhY3RpdmUgdG91ciBpcyB1bmF2YWlsYWJsZSwgYnV0IHlvdSBjYW4gZXhwbG9yZSB0aGUgZGFzaGJvYXJkIGZyZWVseS5cbiAgICAgICAgICBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaGVscCBnZXR0aW5nIHN0YXJ0ZWQuXG4gICAgICAgIDwvcD5cbiAgICAgIGA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZmFsbGJhY2tNZXNzYWdlKTtcblxuICAgICAgLy8gQXV0by1yZW1vdmUgYWZ0ZXIgMTAgc2Vjb25kc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChmYWxsYmFja01lc3NhZ2UucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGZhbGxiYWNrTWVzc2FnZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZhbGxiYWNrTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMDAwKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN0b3JhZ2UgdW5hdmFpbGFibGUgc2NlbmFyaW9cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBJbi1tZW1vcnkgc3RvcmFnZSBmYWxsYmFja1xuICAgICAqL1xuICAgIGhhbmRsZVN0b3JhZ2VVbmF2YWlsYWJsZSgpIHtcbiAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCAnTG9jYWwgc3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgICAgY29uc3QgbWVtb3J5U3RvcmFnZSA9IHtcbiAgICAgICAgZGF0YToge30sXG4gICAgICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtrZXldO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc29sZS53YXJuKCdbRXJyb3JIYW5kbGVyXSBVc2luZyBpbi1tZW1vcnkgc3RvcmFnZSAtIHByb2dyZXNzIHdpbGwgbm90IHBlcnNpc3QnKTtcbiAgICAgIHJldHVybiBtZW1vcnlTdG9yYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgZXJyb3IgdG8gdHJhY2tpbmcgc2VydmljZSAocGxhY2Vob2xkZXIpXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JFbnRyeSAtIEVycm9yIGVudHJ5IHRvIHNlbmRcbiAgICAgKi9cbiAgICBzZW5kVG9FcnJvclRyYWNraW5nKGVycm9yRW50cnkpIHtcbiAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciBlcnJvciB0cmFja2luZyBpbnRlZ3JhdGlvblxuICAgICAgLy8gQ291bGQgaW50ZWdyYXRlIHdpdGggU2VudHJ5LCBMb2dSb2NrZXQsIGV0Yy5cbiAgICAgIC8vIEV4YW1wbGU6XG4gICAgICAvLyBpZiAod2luZG93LlNlbnRyeSkge1xuICAgICAgLy8gICBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihuZXcgRXJyb3IoZXJyb3JFbnRyeS5tZXNzYWdlKSwge1xuICAgICAgLy8gICAgIGV4dHJhOiBlcnJvckVudHJ5Lm1ldGFkYXRhXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5FcnJvckhhbmRsZXIgPSBFcnJvckhhbmRsZXI7XG4gIGNvbnNvbGUubG9nKCdbRXJyb3JIYW5kbGVyXSBNb2R1bGUgbG9hZGVkJyk7XG5cbn0pKHdpbmRvdyk7XG47XG4vLyA9PT09PSBEQVNIQk9BUkQgQ09OU1RBTlRTID09PT09XG4vLyBIb25vciBwZXJzaXN0ZWQgaGVhbHRoIHJldGVudGlvbiBzZXR0aW5ncyBmb3IgcG9sbGluZyBjYWRlbmNlcyBzbyB0aGVcbi8vIFNldHRpbmdzIFx1MjE5MiBIZWFsdGggXHUyMTkyIEdsb2JhbCBTZXR0aW5ncyBwYW5lbCBhY3R1YWxseSB0YWtlcyBlZmZlY3QuIFRoZVxuLy8gU1RBVFMgaW50ZXJ2YWwgKHJlc291cmNlL2NvbnRhaW5lciBzdGF0IHNhbXBsaW5nKSBpcyBkcml2ZW4gZnJvbSB0aGVcbi8vIHVzZXItY29uZmlndXJhYmxlIHN0YXRzUG9sbGluZ0ludGVydmFsLiBIRUFMVEggaXMgdGhlIGxpZ2h0d2VpZ2h0IGNhcmRcbi8vIGJhZGdlIHJlZnJlc2ggYW5kIHN0YXlzIGF0IGl0cyBmYXN0IGRlZmF1bHQgdW5sZXNzIG92ZXJyaWRkZW4uXG4oZnVuY3Rpb24gYXBwbHlIZWFsdGhQb2xsaW5nU2V0dGluZ3MoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHJhdyA9ICh0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJyAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5LWhlYWx0aC1zZXR0aW5ncycpKSB8fCBudWxsO1xuICAgIGlmIChyYXcpIHtcbiAgICAgIHZhciBzID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgLy8gdmFsdWVzIGFyZSBzdG9yZWQgaW4gc2Vjb25kczsgREMuUE9MTCBleHBlY3RzIG1pbGxpc2Vjb25kc1xuICAgICAgaWYgKHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgJiYgcy5zdGF0c1BvbGxpbmdJbnRlcnZhbCA+PSA1ICYmIHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgPD0gMzYwMCkge1xuICAgICAgICB3aW5kb3cuX19EQ19TVEFUU19PVkVSUklERSA9IHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgKiAxMDAwO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgXHUyMDE0IGZhbGwgYmFjayB0byBkZWZhdWx0cyBiZWxvdyAqLyB9XG59KSgpO1xuXG5jb25zdCBEQyA9IHtcbiAgTkFNRTogJ0Rhc2hDYWRkeScsXG4gIFBPTEw6IHtcbiAgICBEQVNIQk9BUkQ6ICAxMDAwMCwgICAvLyAxMHMgXHUyMDE0IG1haW4gcmVmcmVzaEFsbCBpbnRlcnZhbFxuICAgIExPR1M6ICAgICAgIDMwMDAsICAgIC8vIDNzICBcdTIwMTQgbG9nIHZpZXdlciB1cGRhdGVzXG4gICAgU1RBVFM6ICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5fX0RDX1NUQVRTX09WRVJSSURFKSB8fCA1MDAwLCAgIC8vIDVzIGRlZmF1bHQgXHUyMDE0IHJlc291cmNlIG1vbml0b3IgcmVmcmVzaCAob3ZlcnJpZGFibGUgdmlhIFNldHRpbmdzIFx1MjE5MiBIZWFsdGgpXG4gICAgV0VBVEhFUjogICAgNjAwMDAwLCAgLy8gMTBtIFx1MjAxNCB3ZWF0aGVyIHdpZGdldCByZWZyZXNoXG4gICAgSEVBTFRIOiAgICAgMTAwMCwgICAgLy8gMXMgIFx1MjAxNCBjYXJkIGhlYWx0aCBiYWRnZSByZWZyZXNoXG4gICAgREVQTE9ZX1NTTDogNTAwMCwgICAgLy8gNXMgIFx1MjAxNCBTU0wgY2VydCBjaGVjayBkdXJpbmcgZGVwbG95XG4gIH0sXG4gIERFTEFZUzoge1xuICAgIEJUTl9SRVNFVDogIDIwMDAsICAgIC8vIEJ1dHRvbiB0ZXh0IHJlc2V0IGFmdGVyIGFjdGlvblxuICAgIFJFTE9BRDogICAgIDUwMDAsICAgIC8vIFBhZ2UgcmVsb2FkIGFmdGVyIHJlc3RhcnRcbiAgICBNT0RBTF9DTE9TRTogNTAwLCAgICAvLyBNb2RhbCBjbG9zZSBhbmltYXRpb25cbiAgICBQT1JUX0NIRUNLOiA1MDAsICAgICAvLyBEZWJvdW5jZSBmb3IgcG9ydCBhdmFpbGFiaWxpdHkgY2hlY2tcbiAgICBERVBMT1lfSU5JVDogMzAwMCwgICAvLyBJbml0aWFsIGRlcGxveSBjZXJ0IGNoZWNrIGRlbGF5XG4gIH0sXG4gIERFRkFVTFRTOiB7XG4gICAgRE5TX1BPUlQ6ICAgICc1MzgwJyxcbiAgICBTRVJWSUNFX1BPUlQ6ICc4MDgwJyxcbiAgICBUVEw6ICAgICAgICAgMzAwLFxuICAgIENBRERZRklMRTogICAnQzpcXFxcY2FkZHlcXFxcQ2FkZHlmaWxlJyxcbiAgfSxcbn07XG5cbi8vIEVycm9yIGhhbmRsZXIgZm9yIHRyYWNraW5nIGlzc3Vlc1xuY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuXG4vLyA9PT09PSBHTE9CQUwgU0lURSBDT05GSUcgKGxvYWRlZCBmcm9tIHNlcnZlciwgY2FjaGVkIGluIGxvY2FsU3RvcmFnZSkgPT09PT1cbi8vIE9ubHkgbm9uLXNlbnNpdGl2ZSBkaXNwbGF5IHByZWZlcmVuY2VzIGFyZSBjYWNoZWQ7IEROUyBJUHMvdG9wb2xvZ3kgYXJlIGZldGNoZWQgZnJvbSBBUElcbmNvbnN0IF9jYWNoZWRDZmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXNoY2FkZHlfc2l0ZV9jb25maWcnKSB8fCAnbnVsbCcpO1xuY29uc3QgU0lURSA9IHtcbiAgdGxkOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnRsZCkgfHwgJy5ob21lJyxcbiAgZG5zSXA6ICcnLFxuICBkbnNQb3J0OiBEQy5ERUZBVUxUUy5ETlNfUE9SVCxcbiAgZG5zU2VydmVyczoge30sXG4gIGNvbmZpZ3VyYXRpb25UeXBlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLmNvbmZpZ3VyYXRpb25UeXBlKSB8fCAnaG9tZWxhYicsXG4gIGRvbWFpbjogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kb21haW4pIHx8ICcnLFxuICBkZWZhdWx0czogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kZWZhdWx0cykgfHwge30sXG4gIHJvdXRpbmdNb2RlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnJvdXRpbmdNb2RlKSB8fCAnc3ViZG9tYWluJyxcbiAgb25ib2FyZGluZ0NvbXBsZXRlZDogZmFsc2Vcbn07XG53aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkID0gKGFzeW5jIGZ1bmN0aW9uIGxvYWRTaXRlQ29uZmlnKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICBpZiAoci5vaykge1xuICAgICAgY29uc3QgYyA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGMudGxkKSBTSVRFLnRsZCA9IGMudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IGMudGxkIDogJy4nICsgYy50bGQ7XG4gICAgICBpZiAoYy5kbnMpIHtcbiAgICAgICAgU0lURS5kbnNJcCA9IGMuZG5zLmlwIHx8ICcnO1xuICAgICAgICBTSVRFLmRuc1BvcnQgPSBjLmRucy5wb3J0IHx8IERDLkRFRkFVTFRTLkROU19QT1JUO1xuICAgICAgfVxuICAgICAgaWYgKGMuZG5zU2VydmVycyAmJiB0eXBlb2YgYy5kbnNTZXJ2ZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhjLmRuc1NlcnZlcnMpKSB7XG4gICAgICAgICAgaWYgKGsgIT09ICdfX3Byb3RvX18nICYmIGsgIT09ICdjb25zdHJ1Y3RvcicgJiYgayAhPT0gJ3Byb3RvdHlwZScpIFNJVEUuZG5zU2VydmVyc1trXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjLmNvbmZpZ3VyYXRpb25UeXBlKSBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID0gYy5jb25maWd1cmF0aW9uVHlwZTtcbiAgICAgIGlmIChjLmRvbWFpbikgU0lURS5kb21haW4gPSBjLmRvbWFpbjtcbiAgICAgIGlmIChjLmRlZmF1bHRzKSBTSVRFLmRlZmF1bHRzID0gYy5kZWZhdWx0cztcbiAgICAgIGlmIChjLnJvdXRpbmdNb2RlKSBTSVRFLnJvdXRpbmdNb2RlID0gYy5yb3V0aW5nTW9kZTtcbiAgICAgIFNJVEUub25ib2FyZGluZ0NvbXBsZXRlZCA9IGMub25ib2FyZGluZ0NvbXBsZXRlZCA9PT0gdHJ1ZTtcbiAgICAgIC8vIENhY2hlIG9ubHkgbm9uLXNlbnNpdGl2ZSBkaXNwbGF5IGNvbmZpZyAoVExELCBkb21haW4sIHJvdXRpbmcgbW9kZSlcbiAgICAgIC8vIEROUyBJUHMgYW5kIHNlcnZlciB0b3BvbG9neSBhcmUgTk9UIGNhY2hlZCBcdTIwMTQgZmV0Y2hlZCBmcm9tIEFQSSBlYWNoIGxvYWRcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdkYXNoY2FkZHlfc2l0ZV9jb25maWcnLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRsZDogU0lURS50bGQsIGNvbmZpZ3VyYXRpb25UeXBlOiBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlLFxuICAgICAgICBkb21haW46IFNJVEUuZG9tYWluLCByb3V0aW5nTW9kZTogU0lURS5yb3V0aW5nTW9kZVxuICAgICAgfSkpO1xuICAgICAgLy8gUmVuZGVyIEROUyBjYXJkcyBkeW5hbWljYWxseSBiYXNlZCBvbiBjb25maWd1cmVkIHNlcnZlcnNcbiAgICAgIHJlbmRlckRuc0NhcmRzKCk7XG4gICAgICAvLyBIaWRlIFRva2VucyBidXR0b24gaWYgbm8gRE5TIHNlcnZlcnMgY29uZmlndXJlZFxuICAgICAgY29uc3QgdG9rZW5zQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS10b2tlbnMnKTtcbiAgICAgIGlmICh0b2tlbnNCdG4pIHRva2Vuc0J0bi5zdHlsZS5kaXNwbGF5ID0gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzKS5sZW5ndGggPyAnJyA6ICdub25lJztcbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG4gIC8vIFVwZGF0ZSBzdGF0aWMgSFRNTCBlbGVtZW50cyB3aXRoIGNvbmZpZ3VyZWQgVExEXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRsZF0nKS5mb3JFYWNoKGVsID0+IGVsLnRleHRDb250ZW50ID0gU0lURS50bGQpO1xuICBjb25zdCB0bGRTdWZmaXggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC10bGQtc3VmZml4Jyk7XG4gIGlmICh0bGRTdWZmaXgpIHRsZFN1ZmZpeC50ZXh0Q29udGVudCA9IFNJVEUudGxkO1xuICBjb25zdCBwcm94eUlwSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtcHJveHktaXAnKTtcbiAgaWYgKHByb3h5SXBJbnB1dCAmJiBTSVRFLmRuc0lwKSB7IHByb3h5SXBJbnB1dC52YWx1ZSA9IFNJVEUuZG5zSXA7IHByb3h5SXBJbnB1dC5wbGFjZWhvbGRlciA9IFNJVEUuZG5zSXA7IH1cbn0pKCk7XG5mdW5jdGlvbiBidWlsZERvbWFpbihzdWIpIHsgcmV0dXJuIHN1YiArIFNJVEUudGxkOyB9XG5mdW5jdGlvbiBidWlsZFNlcnZpY2VVcmwoc3ViKSB7XG4gIGlmIChTSVRFLnJvdXRpbmdNb2RlID09PSAnc3ViZGlyZWN0b3J5JyAmJiBTSVRFLmRvbWFpbikgcmV0dXJuICdodHRwczovLycgKyBTSVRFLmRvbWFpbiArICcvJyArIHN1YjtcbiAgaWYgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnICYmIFNJVEUuZG9tYWluKSByZXR1cm4gJ2h0dHBzOi8vJyArIHN1YiArICcuJyArIFNJVEUuZG9tYWluO1xuICByZXR1cm4gJ2h0dHBzOi8vJyArIGJ1aWxkRG9tYWluKHN1Yik7XG59XG5mdW5jdGlvbiBnZXREbnNTZXJ2ZXJBZGRyKGRuc0lkKSB7XG4gIGNvbnN0IHMgPSBTSVRFLmRuc1NlcnZlcnNbZG5zSWRdO1xuICByZXR1cm4gcyA/IGAke3MuaXB9OiR7cy5wb3J0fWAgOiBidWlsZERvbWFpbihkbnNJZCk7XG59XG4vKiogR2V0IHRoZSBETlMgSUQgd2hvc2UgSVAgbWF0Y2hlcyB0aGUgcHJpbWFyeSBETlMgY29uZmlnIChkbnMuaXApICovXG5mdW5jdGlvbiBnZXRQcmltYXJ5RG5zSWQoKSB7XG4gIGlmICghU0lURS5kbnNJcCkgcmV0dXJuIG51bGw7XG4gIGZvciAoY29uc3QgW2lkLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyhTSVRFLmRuc1NlcnZlcnMpKSB7XG4gICAgaWYgKGluZm8uaXAgPT09IFNJVEUuZG5zSXApIHJldHVybiBpZDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gPT09PT0gRFlOQU1JQyBETlMgQ0FSRCBSRU5ERVJFUiA9PT09PVxuZnVuY3Rpb24gcmVuZGVyRG5zQ2FyZHMoKSB7XG4gIGNvbnN0IHRvcFJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKTtcbiAgaWYgKCF0b3BSb3cpIHJldHVybjtcbiAgY29uc3QgZG5zSWRzID0gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzKTtcbiAgaWYgKCFkbnNJZHMubGVuZ3RoKSByZXR1cm47IC8vIE5vIEROUyBzZXJ2ZXJzIGNvbmZpZ3VyZWQgXHUyMDE0IHNob3cgbm90aGluZ1xuXG4gIGNvbnN0IHN2Z0ljb24gPSAnPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJzZXJ2aWNlLWljb25cIj4nXG4gICAgKyAnPHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxNlwiIHJ4PVwiMlwiIGZpbGw9XCIjMzQ0OTVlXCIvPidcbiAgICArICc8cmVjdCB4PVwiNVwiIHk9XCI2XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjJcIiByeD1cIjFcIiBmaWxsPVwiIzM0OThkYlwiLz4nXG4gICAgKyAnPHJlY3QgeD1cIjVcIiB5PVwiOVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxXCIgZmlsbD1cIiNlY2YwZjFcIi8+J1xuICAgICsgJzxyZWN0IHg9XCI1XCIgeT1cIjExXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjFcIiBmaWxsPVwiI2VjZjBmMVwiLz4nXG4gICAgKyAnPHJlY3QgeD1cIjVcIiB5PVwiMTNcIiB3aWR0aD1cIjhcIiBoZWlnaHQ9XCIxXCIgZmlsbD1cIiNlY2YwZjFcIi8+J1xuICAgICsgJzxyZWN0IHg9XCI1XCIgeT1cIjE1XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjFcIiBmaWxsPVwiI2VjZjBmMVwiLz4nXG4gICAgKyAnPGNpcmNsZSBjeD1cIjE3XCIgY3k9XCIxMVwiIHI9XCIyXCIgZmlsbD1cIiNlNzRjM2NcIi8+J1xuICAgICsgJzxwYXRoIGQ9XCJNMTcgOXY0TTE1IDExaDRcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjFcIi8+PC9zdmc+JztcblxuICBjb25zdCBmaXJzdENoaWxkID0gdG9wUm93LmZpcnN0RWxlbWVudENoaWxkO1xuICBkbnNJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3Qgc2FmZUlkID0gZXNjYXBlSHRtbChpZCk7XG4gICAgY29uc3QgbGFiZWwgPSBlc2NhcGVIdG1sKChTSVRFLmRuc1NlcnZlcnNbaWRdLm5hbWUgfHwgaWQpLnRvVXBwZXJDYXNlKCkpO1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjYXJkLmNsYXNzTmFtZSA9ICdjYXJkJztcbiAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHAnLCBpZCk7XG4gICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ29mZicpO1xuICAgIGNhcmQuaW5uZXJIVE1MID1cbiAgICAgIGA8c3BhbiBpZD1cIiR7c2FmZUlkfS1kb3RcIiBjbGFzcz1cImRvdCBiYWQgYXQtYmxcIj48L3NwYW4+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cInJvd1wiPjxkaXYgY2xhc3M9XCJsb2dvLXdyYXBcIj4ke3N2Z0ljb259PC9kaXY+YFxuICAgICAgKyBgPHNwYW4gY2xhc3M9XCJuYW1lXCI+JHtsYWJlbH08L3NwYW4+PHNwYW4gY2xhc3M9XCJzcGFjZXJcIj48L3NwYW4+YFxuICAgICAgKyBgPHNwYW4gaWQ9XCIke3NhZmVJZH0tcGlsbFwiIGNsYXNzPVwiYmFkZ2Ugb2ZmXCIgZGF0YS1pMThuLWxpdmUtc3RhdHVzPVwiYmluYXJ5XCI+T0ZGPC9zcGFuPjwvZGl2PmBcbiAgICAgICsgYDxkaXYgY2xhc3M9XCJyZXNwb25zZS1yb3dcIj48c3BhbiBpZD1cIiR7c2FmZUlkfS10aW1lXCIgY2xhc3M9XCJyZXNwb25zZS10aW1lXCI+LS08L3NwYW4+PC9kaXY+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cImhlYWx0aC1yb3dcIiBpZD1cImhlYWx0aC0ke3NhZmVJZH1cIj48c3BhbiBpZD1cInVwdGltZS0ke3NhZmVJZH1cIiBjbGFzcz1cInVwdGltZS1jaGlwXCI+LS08L3NwYW4+PGRpdiBjbGFzcz1cInVwdGltZS1taW5pLWJhclwiPjxkaXYgY2xhc3M9XCJmaWxsXCIgaWQ9XCJ1cHRpbWUtYmFyLSR7c2FmZUlkfVwiIHN0eWxlPVwid2lkdGg6IDAlXCI+PC9kaXY+PC9kaXY+PC9kaXY+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cImJ0bi1yb3dcIj5gXG4gICAgICArIGA8YnV0dG9uIGlkPVwiJHtzYWZlSWR9LXJlc3RhcnRcIiBjbGFzcz1cInJlc3RhcnQtYnRuXCIgZGF0YS1pMThuPVwiYWN0aW9uLnJlc3RhcnRcIj5SZXN0YXJ0PC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS11cGRhdGVcIiBjbGFzcz1cInVwZGF0ZS1idG5cIiB0aXRsZT1cIlVwZGF0ZSBETlMgc2VydmVyXCI+XHUyQjA2XHVGRTBGPC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS1vcGVuXCIgZGF0YS1pMThuPVwiYWN0aW9uLm9wZW5cIj5PcGVuPC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS1sb2dzXCIgY2xhc3M9XCJsb2dzLWJ0blwiIGRhdGEtaTE4bj1cImFjdGlvbi5sb2dzXCI+TG9nczwvYnV0dG9uPmBcbiAgICAgICsgYDxidXR0b24gaWQ9XCIke3NhZmVJZH0tc2V0dGluZ3NcIiBjbGFzcz1cInNldHRpbmdzLWJ0blwiPlx1MjY5OVx1RkUwRjwvYnV0dG9uPmBcbiAgICAgICsgYDwvZGl2PmA7XG4gICAgdG9wUm93Lmluc2VydEJlZm9yZShjYXJkLCBmaXJzdENoaWxkKTtcbiAgfSk7XG4gIGlmICh3aW5kb3cuRENJMThuICYmIHdpbmRvdy5EQ0kxOG4uaXNMb2FkZWQoKSkge1xuICAgIHdpbmRvdy5EQ0kxOG4uYXBwbHlUcmFuc2xhdGlvbnMoKTtcbiAgfVxufVxud2luZG93LnJlbmRlckRuc0NhcmRzID0gcmVuZGVyRG5zQ2FyZHM7XG5cbi8vID09PT09IENTUkYgUFJPVEVDVElPTiA9PT09PVxubGV0IGNzcmZUb2tlbiA9IG51bGw7XG5cbi8qKlxuICogR2V0IENTUkYgdG9rZW4gZnJvbSBzZXJ2ZXIgKGNhY2hlZClcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IENTUkYgdG9rZW5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q1NSRlRva2VuKCkge1xuICBpZiAoY3NyZlRva2VuKSByZXR1cm4gY3NyZlRva2VuO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jc3JmLXRva2VuJyk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggQ1NSRiB0b2tlbicpO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGNzcmZUb2tlbiA9IGRhdGEudG9rZW47XG4gICAgcmV0dXJuIGNzcmZUb2tlbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tDU1JGXSBHZXQgVG9rZW4nLCBlcnJvciwgeyBmdW5jdGlvbjogJ2dldENTUkZUb2tlbicgfSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWN1cmUgZmV0Y2ggd3JhcHBlciB0aGF0IGF1dG9tYXRpY2FsbHkgYWRkcyBDU1JGIHRva2VuIHRvIHN0YXRlLWNoYW5naW5nIHJlcXVlc3RzLlxuICogSWYgdGhlIHNlcnZlciByZXR1cm5zIGEgQ1NSRiBlcnJvciAoNDAzIHdpdGggREMtMTAwL0RDLTEwMSksIGF1dG9tYXRpY2FsbHlcbiAqIHJlZnJlc2hlcyB0aGUgdG9rZW4gYW5kIHJldHJpZXMgb25jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBVUkwgdG8gZmV0Y2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gRmV0Y2ggb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8UmVzcG9uc2U+fSBGZXRjaCByZXNwb25zZVxuICovXG5hc3luYyBmdW5jdGlvbiBzZWN1cmVGZXRjaCh1cmwsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBtZXRob2QgPSAob3B0aW9ucy5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IG5lZWRzQ3NyZiA9ICFbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnXS5pbmNsdWRlcyhtZXRob2QpO1xuXG4gIGlmIChuZWVkc0NzcmYpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRDU1JGVG9rZW4oKTtcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAnWC1DU1JGLVRva2VuJzogdG9rZW5cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW0NTUkZdIEFkZCB0byBSZXF1ZXN0JywgZXJyb3IsIHsgZnVuY3Rpb246ICdzZWN1cmVGZXRjaCcgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVmYXVsdCAxNXMgdGltZW91dCBpZiBubyBzaWduYWwgcHJvdmlkZWQgKHByZXZlbnRzIGhhbmdpbmcgcmVxdWVzdHMpXG4gIGlmICghb3B0aW9ucy5zaWduYWwpIHtcbiAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTUwMDApIH07XG4gIH1cblxuICBvcHRpb25zLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCAnc2FtZS1vcmlnaW4nO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG5cbiAgLy8gQXV0by1yZXRyeSBvbmNlIG9uIENTUkYgZmFpbHVyZSAodG9rZW4gbWF5IGhhdmUgYmVlbiByb3RhdGVkIGJ5IFRPVFAgcmUtYXV0aClcbiAgaWYgKG5lZWRzQ3NyZiAmJiByZXNwb25zZS5zdGF0dXMgPT09IDQwMykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UuY2xvbmUoKS5qc29uKCk7XG4gICAgICBpZiAoYm9keS5lcnJvciAmJiAoYm9keS5lcnJvci5pbmNsdWRlcygnREMtMTAwJykgfHwgYm9keS5lcnJvci5pbmNsdWRlcygnREMtMTAxJykpKSB7XG4gICAgICAgIGNzcmZUb2tlbiA9IG51bGw7IC8vIENsZWFyIGNhY2hlZCB0b2tlblxuICAgICAgICBjb25zdCBmcmVzaFRva2VuID0gYXdhaXQgZ2V0Q1NSRlRva2VuKCk7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHsgLi4ub3B0aW9ucy5oZWFkZXJzLCAnWC1DU1JGLVRva2VuJzogZnJlc2hUb2tlbiB9O1xuICAgICAgICAvLyBOZXcgc2lnbmFsIGZvciByZXRyeSAob2xkIG9uZSBtYXkgaGF2ZSBiZWVuIGNvbnN1bWVkKVxuICAgICAgICBvcHRpb25zLnNpZ25hbCA9IEFib3J0U2lnbmFsLnRpbWVvdXQoMTUwMDApO1xuICAgICAgICByZXR1cm4gZmV0Y2godXJsLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAvLyBJZiBjbG9uZS9qc29uIGZhaWxzLCByZXR1cm4gb3JpZ2luYWwgcmVzcG9uc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8vID09PT09IEFQSSBDQUxMIEhFTFBFUlMgPT09PT1cblxuLyoqIFBPU1QgSlNPTiBhbmQgcmV0dXJuIHBhcnNlZCByZXNwb25zZS4gVGhyb3dzIG9uIEhUVFAgb3IgQVBJIGVycm9yLiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9zdEpTT04odXJsLCBkYXRhKSB7XG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3AuanNvbigpO1xuICBpZiAoIXJlc3Aub2sgfHwgcmVzdWx0LnN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCBgUmVxdWVzdCBmYWlsZWQgKCR7cmVzcC5zdGF0dXN9KWApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBHRVQgSlNPTiBhbmQgcmV0dXJuIHBhcnNlZCByZXNwb25zZS4gVGhyb3dzIG9uIEhUVFAgZXJyb3Igd2l0aCBzZXJ2ZXIgbWVzc2FnZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwpO1xuICBpZiAoIXJlc3Aub2spIHtcbiAgICBsZXQgbXNnID0gYFJlcXVlc3QgZmFpbGVkICgke3Jlc3Auc3RhdHVzfSlgO1xuICAgIHRyeSB7IGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLmpzb24oKTsgbXNnID0gYm9keS5lcnJvciB8fCBtc2c7IH0gY2F0Y2ggKF8pIHt9XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gIH1cbiAgcmV0dXJuIHJlc3AuanNvbigpO1xufVxuXG4vKiogREVMRVRFIHJlcXVlc3QuIFJldHVybnMgcGFyc2VkIEpTT04gcmVzcG9uc2UuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVBUEkodXJsKSB7XG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gIGlmICghcmVzcC5vayB8fCByZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8IGBEZWxldGUgZmFpbGVkICgke3Jlc3Auc3RhdHVzfSlgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJ1biBhbiBhc3luYyBvcGVyYXRpb24gd2l0aCBidXR0b24gbG9hZGluZyBzdGF0ZS5cbiAqIERpc2FibGVzIHRoZSBidXR0b24sIHNob3dzIGxvYWRpbmcgdGV4dCwgcmVzdG9yZXMgb24gY29tcGxldGUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBidG4gLSBCdXR0b24gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IGxvYWRpbmdUZXh0IC0gVGV4dCB0byBzaG93IHdoaWxlIGxvYWRpbmcgKGUuZy4gJ1NhdmluZy4uLicpXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBhc3luY0ZuIC0gQXN5bmMgZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBPcHRpb25zOiB7IHN1Y2Nlc3NUZXh0LCByZXNldERlbGF5IH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aEJ1dHRvbihidG4sIGxvYWRpbmdUZXh0LCBhc3luY0ZuLCBvcHRzID0ge30pIHtcbiAgY29uc3Qgb3JpZ2luYWwgPSBidG4uaW5uZXJIVE1MO1xuICBjb25zdCB7IHN1Y2Nlc3NUZXh0ID0gJ1x1MjcwNScsIHJlc2V0RGVsYXkgPSBEQy5ERUxBWVMuQlROX1JFU0VUIH0gPSBvcHRzO1xuICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICBidG4uaW5uZXJIVE1MID0gbG9hZGluZ1RleHQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXN5bmNGbigpO1xuICAgIGJ0bi5pbm5lckhUTUwgPSBzdWNjZXNzVGV4dDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLmlubmVySFRNTCA9IG9yaWdpbmFsOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgfSwgcmVzZXREZWxheSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGJ0bi5pbm5lckhUTUwgPSBvcmlnaW5hbDtcbiAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbi8qKiBTaG93L2hpZGUgYSBtb2RhbCBieSBJRCAqL1xuZnVuY3Rpb24gb3Blbk1vZGFsKGlkKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKT8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xufVxuZnVuY3Rpb24gY2xvc2VNb2RhbChpZCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk/LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbn1cblxuLyoqIFdpcmUgYmFja2Ryb3AtY2xpY2sgY2xvc2UgKyBvcHRpb25hbCBjbG9zZSBidXR0b25zIGZvciBhIG1vZGFsIGVsZW1lbnQgKi9cbmZ1bmN0aW9uIHdpcmVNb2RhbChtb2RhbCwgLi4uY2xvc2VCdG5zKSB7XG4gIGlmICghbW9kYWwpIHJldHVybjtcbiAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7IH0pO1xuICAvLyBTa2lwIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSByZWFsIGxpc3RlbmVyIHRhcmdldC4gV2l0aG91dCB0aGlzIGd1YXJkLCBhXG4gIC8vIHNpbmdsZSB0eXBvIChlLmcuIHBhc3NpbmcgYSBmdW5jdGlvbiBvciBudWxsIGluc3RlYWQgb2YgYSBidXR0b24gZWxlbWVudClcbiAgLy8gdGhyb3dzIGFuZCBhYm9ydHMgdGhlIHJlc3Qgb2YgdGhlIGNhbGxpbmcgbW9kdWxlJ3MgaW5pdCBcdTIwMTQgd2hpY2ggY2FuIHRha2VcbiAgLy8gZG93biBsaWNlbnNlLmpzIChGUkVFIFRJRVIgYmFkZ2UpLCBUT1RQIHdpcmluZywgZXRjLlxuICBjbG9zZUJ0bnMuZm9yRWFjaChidG4gPT4ge1xuICAgIGlmIChidG4gJiYgdHlwZW9mIGJ0bi5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKiBUb2FzdC1zdHlsZSBub3RpZmljYXRpb24gKHJlcGxhY2VzIGFsbCBhbGVydCgpIHVzYWdlKSAqL1xuZnVuY3Rpb24gc2hvd05vdGlmaWNhdGlvbih0ZXh0LCB0eXBlID0gJ2luZm8nLCBkdXJhdGlvbiA9IDMwMDApIHtcbiAgY29uc3QgZXhpc3RpbmdOb3RpZiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kZXBsb3ktbm90aWZpY2F0aW9uJyk7XG4gIGlmIChleGlzdGluZ05vdGlmKSBleGlzdGluZ05vdGlmLnJlbW92ZSgpO1xuXG4gIGNvbnN0IGNvbG9ycyA9IHtcbiAgICBpbmZvOiAgICB7IGJnOiAnIzIxOTZGMycsICAgICAgIGZnOiAnI2ZmZicgfSxcbiAgICBzdWNjZXNzOiB7IGJnOiAndmFyKC0tb2stYmcpJywgIGZnOiAndmFyKC0tb2stZmcpJyB9LFxuICAgIGVycm9yOiAgIHsgYmc6ICcjZjQ0MzM2JywgICAgICAgZmc6ICcjZmZmJyB9LFxuICAgIHdhcm5pbmc6IHsgYmc6ICcjZmY5ODAwJywgICAgICAgZmc6ICcjZmZmJyB9XG4gIH07XG5cbiAgY29uc3QgYyA9IGNvbG9yc1t0eXBlXSB8fCBjb2xvcnMuaW5mbztcbiAgY29uc3QgbXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1zZy5jbGFzc05hbWUgPSAnZGVwbG95LW5vdGlmaWNhdGlvbic7XG4gIG1zZy50ZXh0Q29udGVudCA9IHRleHQ7XG4gIG1zZy5zdHlsZS5jc3NUZXh0ID0gYFxuICAgIHBvc2l0aW9uOiBmaXhlZDsgdG9wOiAyMHB4OyByaWdodDogMjBweDtcbiAgICBiYWNrZ3JvdW5kOiAke2MuYmd9OyBjb2xvcjogJHtjLmZnfTtcbiAgICBwYWRkaW5nOiAxNnB4IDI0cHg7IGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwwLDAsLjMpO1xuICAgIHotaW5kZXg6IDEwMDAwOyBhbmltYXRpb246IHNsaWRlSW4gMC4zcyBlYXNlLW91dDtcbiAgICBtYXgtd2lkdGg6IDQwMHB4OyB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7IGZvbnQtc2l6ZTogMTRweDtcbiAgYDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtc2cpO1xuICBpZiAoZHVyYXRpb24gPiAwKSBzZXRUaW1lb3V0KCgpID0+IG1zZy5yZW1vdmUoKSwgZHVyYXRpb24pO1xufVxuXG4vKiogUmVsYXRpdmUgdGltZSBkaXNwbGF5IChlLmcuIFwiNW0gYWdvXCIsIFwiMmggYWdvXCIpICovXG5mdW5jdGlvbiB0aW1lQWdvKHRzKSB7XG4gIGNvbnN0IGRpZmYgPSBEYXRlLm5vdygpIC0gbmV3IERhdGUodHMpLmdldFRpbWUoKTtcbiAgaWYgKGRpZmYgPCA2MDAwMCkgcmV0dXJuICdqdXN0IG5vdyc7XG4gIGlmIChkaWZmIDwgMzYwMDAwMCkgcmV0dXJuIE1hdGguZmxvb3IoZGlmZiAvIDYwMDAwKSArICdtIGFnbyc7XG4gIGlmIChkaWZmIDwgODY0MDAwMDApIHJldHVybiBNYXRoLmZsb29yKGRpZmYgLyAzNjAwMDAwKSArICdoIGFnbyc7XG4gIHJldHVybiBNYXRoLmZsb29yKGRpZmYgLyA4NjQwMDAwMCkgKyAnZCBhZ28nO1xufVxuXG4vLyA9PT09PSBTQUZFIFNUT1JBR0UgV1JBUFBFUlMgPT09PT1cbi8vIFByZXZlbnRzIGNyYXNoZXMgaW4gU2FmYXJpIHByaXZhdGUgYnJvd3NpbmcsIHF1b3RhIGV4Y2VlZGVkLCBvciByZXN0cmljdGVkIGVudmlyb25tZW50c1xuZnVuY3Rpb24gc2FmZUdldChrZXksIGZhbGxiYWNrID0gbnVsbCkge1xuICB0cnkgeyBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsgcmV0dXJuIHYgIT09IG51bGwgPyB2IDogZmFsbGJhY2s7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuIGZhbGxiYWNrOyB9XG59XG5mdW5jdGlvbiBzYWZlU2V0KGtleSwgdmFsdWUpIHtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7IH0gY2F0Y2ggKF8pIHsgLyogcXVvdGEgZXhjZWVkZWQgb3IgcHJpdmF0ZSBtb2RlICovIH1cbn1cbmZ1bmN0aW9uIHNhZmVSZW1vdmUoa2V5KSB7XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5mdW5jdGlvbiBzYWZlU2Vzc2lvbkdldChrZXksIGZhbGxiYWNrID0gbnVsbCkge1xuICB0cnkgeyBjb25zdCB2ID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrZXkpOyByZXR1cm4gdiAhPT0gbnVsbCA/IHYgOiBmYWxsYmFjazsgfSBjYXRjaCAoXykgeyByZXR1cm4gZmFsbGJhY2s7IH1cbn1cbmZ1bmN0aW9uIHNhZmVTZXNzaW9uU2V0KGtleSwgdmFsdWUpIHtcbiAgdHJ5IHsgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTsgfSBjYXRjaCAoXykge31cbn1cbi8qKiBQYXJzZSBKU09OIGZyb20gbG9jYWxTdG9yYWdlIHdpdGggZmFsbGJhY2sgXHUyMDE0IGF2b2lkcyB0cnkvY2F0Y2ggYXQgZXZlcnkgY2FsbCBzaXRlICovXG5mdW5jdGlvbiBzYWZlR2V0SlNPTihrZXksIGZhbGxiYWNrID0gbnVsbCkge1xuICB0cnkgeyBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsgcmV0dXJuIHYgPyBKU09OLnBhcnNlKHYpIDogZmFsbGJhY2s7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuIGZhbGxiYWNrOyB9XG59XG5cbi8qKiBFc2NhcGUgSFRNTCBlbnRpdGllcyBmb3Igc2FmZSBpbm5lckhUTUwgaW5zZXJ0aW9uIChoYW5kbGVzIGJvdGggY29udGVudCBhbmQgYXR0cmlidXRlcykgKi9cbmZ1bmN0aW9uIGVzY2FwZUh0bWwodGV4dCkge1xuICByZXR1cm4gU3RyaW5nKHRleHQgPz8gJycpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JykucmVwbGFjZSgvJy9nLCAnJiMzOTsnKTtcbn1cblxuLyoqIEluamVjdCBtb2RhbCBIVE1MIGludG8gRE9NIChpZGVtcG90ZW50IFx1MjAxNCBza2lwcyBpZiBlbGVtZW50IGFscmVhZHkgZXhpc3RzKSAqL1xuZnVuY3Rpb24gaW5qZWN0TW9kYWwoaWQsIGh0bWwpIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSkgcmV0dXJuO1xuICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG59XG5cbi8vID09PT09IEVWRU5UIEJVUyA9PT09PVxuLy8gTGlnaHR3ZWlnaHQgcHViL3N1YiBmb3IgY3Jvc3MtbW9kdWxlIGNvbW11bmljYXRpb24gd2l0aG91dCB3aW5kb3cgZ2xvYmFscy5cbi8vIFVzYWdlOiBEQ19CVVMub24oJ3NlcnZpY2VzOmxvYWRlZCcsIGhhbmRsZXIpOyBEQ19CVVMuZW1pdCgnc2VydmljZXM6bG9hZGVkJywgZGF0YSk7XG5jb25zdCBEQ19CVVMgPSB7XG4gIF9oYW5kbGVyczoge30sXG4gIG9uKGV2ZW50LCBmbikgeyAodGhpcy5faGFuZGxlcnNbZXZlbnRdIHx8PSBbXSkucHVzaChmbik7IH0sXG4gIG9mZihldmVudCwgZm4pIHsgdGhpcy5faGFuZGxlcnNbZXZlbnRdID0gdGhpcy5faGFuZGxlcnNbZXZlbnRdPy5maWx0ZXIoaCA9PiBoICE9PSBmbik7IH0sXG4gIGVtaXQoZXZlbnQsIGRhdGEpIHsgdGhpcy5faGFuZGxlcnNbZXZlbnRdPy5mb3JFYWNoKGZuID0+IGZuKGRhdGEpKTsgfVxufTtcblxuLy8gPT09PT0gQ0VOVFJBTElaRUQgQVBQIFNUQVRFID09PT09XG4vLyBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgc2VydmljZXMgYXJyYXkuIE1vZHVsZXMgc2hvdWxkIHVzZSBBcHBTdGF0ZVxuLy8gaW5zdGVhZCBvZiBtdXRhdGluZyB3aW5kb3cuQVBQUyBkaXJlY3RseS4gRW1pdHMgJ2FwcHM6Y2hhbmdlZCcgb24gdXBkYXRlcy5cbmNvbnN0IEFwcFN0YXRlID0ge1xuICBfYXBwczogW10sXG4gIGdldEFwcHMoKSB7IHJldHVybiB0aGlzLl9hcHBzOyB9LFxuICBzZXRBcHBzKGFwcHMpIHsgdGhpcy5fYXBwcyA9IGFwcHM7IHdpbmRvdy5BUFBTID0gYXBwczsgRENfQlVTLmVtaXQoJ2FwcHM6Y2hhbmdlZCcsIGFwcHMpOyB9LFxuICBmaW5kQXBwKGlkKSB7IHJldHVybiB0aGlzLl9hcHBzLmZpbmQoYSA9PiBhLmlkID09PSBpZCk7IH0sXG4gIGFkZEFwcChhcHApIHsgdGhpcy5fYXBwcy5wdXNoKGFwcCk7IHdpbmRvdy5BUFBTID0gdGhpcy5fYXBwczsgRENfQlVTLmVtaXQoJ2FwcHM6Y2hhbmdlZCcsIHRoaXMuX2FwcHMpOyB9LFxuICByZW1vdmVBcHAoaWQpIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLl9hcHBzLmZpbmRJbmRleChhID0+IGEuaWQgPT09IGlkKTtcbiAgICBpZiAoaWR4ID4gLTEpIHsgdGhpcy5fYXBwcy5zcGxpY2UoaWR4LCAxKTsgd2luZG93LkFQUFMgPSB0aGlzLl9hcHBzOyBEQ19CVVMuZW1pdCgnYXBwczpjaGFuZ2VkJywgdGhpcy5fYXBwcyk7IH1cbiAgICByZXR1cm4gaWR4ID4gLTE7XG4gIH0sXG4gIHVwZGF0ZUFwcChpZCwgY2hhbmdlcykge1xuICAgIGNvbnN0IGFwcCA9IHRoaXMuX2FwcHMuZmluZChhID0+IGEuaWQgPT09IGlkKTtcbiAgICBpZiAoYXBwKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhjaGFuZ2VzKSkge1xuICAgICAgICBpZiAoayAhPT0gJ19fcHJvdG9fXycgJiYgayAhPT0gJ2NvbnN0cnVjdG9yJyAmJiBrICE9PSAncHJvdG90eXBlJykgYXBwW2tdID0gdjtcbiAgICAgIH1cbiAgICAgIERDX0JVUy5lbWl0KCdhcHBzOmNoYW5nZWQnLCB0aGlzLl9hcHBzKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcDtcbiAgfVxufTtcbjtcbi8vID09PT09PT09PT0gU0tFTEVUT04gTE9BRElORyBQTEFDRUhPTERFUlMgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBjcmVhdGVTa2VsZXRvbkNhcmQoKSB7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNhcmQuY2xhc3NOYW1lID0gJ3NrZWxldG9uLWNhcmQnO1xuICAgIGNhcmQuaW5uZXJIVE1MID1cbiAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHhcIj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjQ4cHg7aGVpZ2h0OjQ4cHg7Ym9yZGVyLXJhZGl1czo4cHg7ZmxleC1zaHJpbms6MFwiPjwvZGl2PicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImZsZXg6MVwiPicgK1xuICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2tlbGV0b24tYmFyXCIgc3R5bGU9XCJ3aWR0aDo2MCU7aGVpZ2h0OjE0cHg7bWFyZ2luLWJvdHRvbTo2cHhcIj48L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cInNrZWxldG9uLWJhclwiIHN0eWxlPVwid2lkdGg6MzUlO2hlaWdodDoxMHB4XCI+PC9kaXY+JyArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjQycHg7aGVpZ2h0OjIycHg7Ym9yZGVyLXJhZGl1czoxMXB4XCI+PC9kaXY+JyArXG4gICAgICAnPC9kaXY+JyArXG4gICAgICAnPGRpdiBjbGFzcz1cInNrZWxldG9uLWJhclwiIHN0eWxlPVwid2lkdGg6NDUlO2hlaWdodDoxMnB4O21hcmdpbi1ib3R0b206MTBweFwiPjwvZGl2PicgK1xuICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOmF1dG9cIj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjY0cHg7aGVpZ2h0OjI4cHg7Ym9yZGVyLXJhZGl1czo4cHhcIj48L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjY0cHg7aGVpZ2h0OjI4cHg7Ym9yZGVyLXJhZGl1czo4cHhcIj48L2Rpdj4nICtcbiAgICAgICc8L2Rpdj4nO1xuICAgIHJldHVybiBjYXJkO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1NrZWxldG9ucyhjb3VudCkge1xuICAgIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZHMnKTtcbiAgICBpZiAoIWdyaWQgfHwgZ3JpZC5xdWVyeVNlbGVjdG9yKCcuY2FyZCcpKSByZXR1cm47IC8vIERvbid0IHNob3cgaWYgcmVhbCBjYXJkcyBleGlzdFxuICAgIGNvdW50ID0gY291bnQgfHwgNjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgc2sgPSBjcmVhdGVTa2VsZXRvbkNhcmQoKTtcbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoc2spO1xuICAgICAgLy8gU3RhZ2dlciBmYWRlLWluXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgc2suY2xhc3NMaXN0LmFkZCgnbG9hZGVkJyk7IH0sIGkgKiA2MCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGlkZVNrZWxldG9ucygpIHtcbiAgICBjb25zdCBncmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmRzJyk7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG4gICAgdmFyIHNrZWxldG9ucyA9IGdyaWQucXVlcnlTZWxlY3RvckFsbCgnLnNrZWxldG9uLWNhcmQnKTtcbiAgICBpZiAoIXNrZWxldG9ucy5sZW5ndGgpIHJldHVybjtcblxuICAgIHNrZWxldG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzaywgaSkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNrLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHNrLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC0xMHB4KSc7XG4gICAgICB9LCBpICogMjUpO1xuICAgIH0pO1xuICAgIC8vIFJlbW92ZSBhZnRlciBhbmltYXRpb25cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNrZWxldG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzaykgeyBpZiAoc2sucGFyZW50Tm9kZSkgc2sucmVtb3ZlKCk7IH0pO1xuICAgIH0sIHNrZWxldG9ucy5sZW5ndGggKiAyNSArIDMwMCk7XG4gIH1cblxuICB3aW5kb3cuU2tlbGV0b25Mb2FkZXIgPSB7IHNob3c6IHNob3dTa2VsZXRvbnMsIGhpZGU6IGhpZGVTa2VsZXRvbnMgfTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFRIRU1FIENPTlRST0xMRVIgPT09PT09PT09PVxuLy8gVXNlci1jcmVhdGVkIHRoZW1lcyBhcmUgc3RvcmVkIHNlcnZlci1zaWRlIGFzIGluZGl2aWR1YWwgSlNPTiBmaWxlcy5cbi8vIGxvY2FsU3RvcmFnZSBjYWNoZXMgdGhlbSBmb3IgaW5zdGFudCBsb2FkOyBzZXJ2ZXIgaXMgc291cmNlIG9mIHRydXRoLlxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFRIRU1FX0tFWSA9ICd0aGVtZSc7XG4gIHZhciBVU0VSX1RIRU1FU19LRVkgPSAndXNlci10aGVtZXMnO1xuICB2YXIgTEVHQUNZX0NVU1RPTV9LRVkgPSAnY3VzdG9tLXRoZW1lJztcblxuICB2YXIgQlVJTFRJTl9USEVNRVMgPSBbJ2RhcmsnLCAnbGlnaHQnLCAnYmx1ZScsICdibGFjaycsICdub3JkJywgJ2RyYWN1bGEnLCAnc29sYXJpemVkLWRhcmsnLCAnc29sYXJpemVkLWxpZ2h0JywgJ3RheGknLCAnb2NlYW4nXTtcbiAgdmFyIFRIRU1FUyA9IEJVSUxUSU5fVEhFTUVTLnNsaWNlKCk7XG5cbiAgdmFyIFRIRU1FX1BST1BTID0gW1xuICAgICdiZycsICdmZycsICdtdXRlZCcsICdmZy1tdXRlZCcsICdjYXJkLWJhc2UnLCAnY2FyZC1iZycsICdib3JkZXInLFxuICAgICdob3ZlcicsICdjYXJkLWhvdmVyJywgJ2Jhc2UnLFxuICAgICdvay1iZycsICdvay1mZycsICdiYWQtYmcnLCAnYmFkLWZnJywgJ2RvdC1vaycsICdkb3QtYmFkJywgJ3VwdGltZScsXG4gICAgJ3N1Y2Nlc3MnLCAnZXJyb3InLCAnd2FybmluZycsXG4gICAgJ2FjY2VudCcsICdhY2NlbnQtc3Ryb25nJ1xuICBdO1xuXG4gIC8vIEJhc2UgcHJvcHMgdGhlIHVzZXIgcGlja3MgaW4gdGhlIGJ1aWxkZXIgKHN1YnNldCBvZiBUSEVNRV9QUk9QUylcbiAgdmFyIEJBU0VfUFJPUFMgPSBbXG4gICAgJ2JnJywgJ2ZnJywgJ211dGVkJywgJ2NhcmQtYmFzZScsICdjYXJkLWJnJywgJ2JvcmRlcicsXG4gICAgJ29rLWJnJywgJ29rLWZnJywgJ2JhZC1iZycsICdiYWQtZmcnLCAnZG90LW9rJywgJ2RvdC1iYWQnLCAndXB0aW1lJyxcbiAgICAnYWNjZW50JywgJ2FjY2VudC1zdHJvbmcnXG4gIF07XG5cbiAgLy8gUHJvcHMgdGhhdCBhcmUgYXV0by1kZXJpdmVkIGlmIG5vdCBleHBsaWNpdGx5IHNldFxuICB2YXIgREVSSVZFRF9QUk9QUyA9IFsnZmctbXV0ZWQnLCAnaG92ZXInLCAnY2FyZC1ob3ZlcicsICdiYXNlJywgJ3N1Y2Nlc3MnLCAnZXJyb3InLCAnd2FybmluZyddO1xuXG4gIHZhciBUSEVNRV9DT0xPUlMgPSB7XG4gICAgZGFyazogICAgICAgICAgICAgeyBiZzogJyMwYjBmMWEnLCBmZzogJyNlOGVjZjUnLCBtdXRlZDogJyM5YWE2YmYnLCAnZmctbXV0ZWQnOiAnIzZiN2E5NCcsICdjYXJkLWJhc2UnOiAnIzEyMTgyNicsICdjYXJkLWJnJzogJyMxMjE4MjYnLCBib3JkZXI6ICcjMjYzNTUyJywgaG92ZXI6ICcjMWEyMjM1JywgJ2NhcmQtaG92ZXInOiAnIzE2MWUyZScsIGJhc2U6ICcjMTUxYzJiJywgJ29rLWJnJzogJyMwYzI0MzAnLCAnb2stZmcnOiAnIzdlZjJmZicsICdiYWQtYmcnOiAnIzJhMTIxYScsICdiYWQtZmcnOiAnI2ZmOWFhMycsICdkb3Qtb2snOiAnIzM1ZDFmZicsICdkb3QtYmFkJzogJyNmZjVmN2EnLCB1cHRpbWU6ICcjMzVkMWZmJywgc3VjY2VzczogJyM0Y2FmNTAnLCBlcnJvcjogJyNlNzRjM2MnLCB3YXJuaW5nOiAnI2YzOWMxMicsIGFjY2VudDogJyM4RkQ2RkYnLCAnYWNjZW50LXN0cm9uZyc6ICcjMUY3QkZGJyB9LFxuICAgIGxpZ2h0OiAgICAgICAgICAgIHsgYmc6ICcjZjZmN2ZiJywgZmc6ICcjMGYxMTE1JywgbXV0ZWQ6ICcjNWY2YjdhJywgJ2ZnLW11dGVkJzogJyM4OTkzYTQnLCAnY2FyZC1iYXNlJzogJyNmZmZmZmYnLCAnY2FyZC1iZyc6ICcjZmZmZmZmJywgYm9yZGVyOiAnI2UyZTdlZicsIGhvdmVyOiAnI2VlZjFmNicsICdjYXJkLWhvdmVyJzogJyNmNWY2ZmEnLCBiYXNlOiAnI2ViZWVmMycsICdvay1iZyc6ICcjZWFmZmYxJywgJ29rLWZnJzogJyMwYTdjM2EnLCAnYmFkLWJnJzogJyNmZmVmZWYnLCAnYmFkLWZnJzogJyNiMDAwMjAnLCAnZG90LW9rJzogJyMwZmIxNWEnLCAnZG90LWJhZCc6ICcjZDkzYjNiJywgdXB0aW1lOiAnIzBmYjE1YScsIHN1Y2Nlc3M6ICcjMGE3YzNhJywgZXJyb3I6ICcjYjAwMDIwJywgd2FybmluZzogJyNkNjhhMDAnLCBhY2NlbnQ6ICcjNGE5MGQ5JywgJ2FjY2VudC1zdHJvbmcnOiAnIzI1NjNlYicsIGxpZ2h0Qmc6IHRydWUgfSxcbiAgICBibHVlOiAgICAgICAgICAgICB7IGJnOiAnIzE5MDhBQycsIGZnOiAnI2U4ZjFmZicsIG11dGVkOiAnI2Q2ZTJmZicsICdmZy1tdXRlZCc6ICcjOWVhZmRiJywgJ2NhcmQtYmFzZSc6ICcjMGQxNTMzJywgJ2NhcmQtYmcnOiAnIzBkMTUzMycsIGJvcmRlcjogJyMxYzJkNmEnLCBob3ZlcjogJyMxNDFmNGEnLCAnY2FyZC1ob3Zlcic6ICcjMTExYTNlJywgYmFzZTogJyMwZjE4NDAnLCAnb2stYmcnOiAnIzE2MjA0MCcsICdvay1mZyc6ICcjZWRmZmZmJywgJ2JhZC1iZyc6ICcjMGEwZTI0JywgJ2JhZC1mZyc6ICcjZmZiM2MwJywgJ2RvdC1vayc6ICcjYzdlNWZmJywgJ2RvdC1iYWQnOiAnI2ZmZDZkYycsIHVwdGltZTogJyM3ZWM4ZmYnLCBzdWNjZXNzOiAnIzdlYzhmZicsIGVycm9yOiAnI2ZmYjNjMCcsIHdhcm5pbmc6ICcjZmZkMDgwJywgYWNjZW50OiAnIzljZDRmZicsICdhY2NlbnQtc3Ryb25nJzogJyM2ZmIyZmYnIH0sXG4gICAgYmxhY2s6ICAgICAgICAgICAgeyBiZzogJyMwZTBlMGUnLCBmZzogJyNmNWY1ZjUnLCBtdXRlZDogJyM5OTk5OTknLCAnZmctbXV0ZWQnOiAnIzY2NjY2NicsICdjYXJkLWJhc2UnOiAnIzFhMWExYScsICdjYXJkLWJnJzogJyMxYTFhMWEnLCBib3JkZXI6ICcjMmUyZTJlJywgaG92ZXI6ICcjMjQyNDI0JywgJ2NhcmQtaG92ZXInOiAnIzIwMjAyMCcsIGJhc2U6ICcjMTYxNjE2JywgJ29rLWJnJzogJyMwZjJhMTInLCAnb2stZmcnOiAnIzY2ZmY3YScsICdiYWQtYmcnOiAnIzJhMGYwZicsICdiYWQtZmcnOiAnI2ZmNmI2YicsICdkb3Qtb2snOiAnIzRjYWY1MCcsICdkb3QtYmFkJzogJyNmZjQ0NDQnLCB1cHRpbWU6ICcjZTBlMGUwJywgc3VjY2VzczogJyM0Y2FmNTAnLCBlcnJvcjogJyNmZjQ0NDQnLCB3YXJuaW5nOiAnI2ZmOTgwMCcsIGFjY2VudDogJyNFNjM5NDYnLCAnYWNjZW50LXN0cm9uZyc6ICcjQzYyODI4JyB9LFxuICAgIG5vcmQ6ICAgICAgICAgICAgIHsgYmc6ICcjMmUzNDQwJywgZmc6ICcjZWNlZmY0JywgbXV0ZWQ6ICcjODFhMWMxJywgJ2ZnLW11dGVkJzogJyM2ODgyYTAnLCAnY2FyZC1iYXNlJzogJyMzYjQyNTInLCAnY2FyZC1iZyc6ICcjM2I0MjUyJywgYm9yZGVyOiAnIzRjNTY2YScsIGhvdmVyOiAnIzQzNGM1ZScsICdjYXJkLWhvdmVyJzogJyMzZjQ4NTgnLCBiYXNlOiAnIzM1M2M0YScsICdvay1iZyc6ICcjMmQ0ZjNlJywgJ29rLWZnJzogJyNhM2JlOGMnLCAnYmFkLWJnJzogJyM0YTJjMmEnLCAnYmFkLWZnJzogJyNiZjYxNmEnLCAnZG90LW9rJzogJyNhM2JlOGMnLCAnZG90LWJhZCc6ICcjYmY2MTZhJywgdXB0aW1lOiAnI2EzYmU4YycsIHN1Y2Nlc3M6ICcjYTNiZThjJywgZXJyb3I6ICcjYmY2MTZhJywgd2FybmluZzogJyNlYmNiOGInLCBhY2NlbnQ6ICcjODhjMGQwJywgJ2FjY2VudC1zdHJvbmcnOiAnIzVlODFhYycgfSxcbiAgICBkcmFjdWxhOiAgICAgICAgICB7IGJnOiAnIzI4MmEzNicsIGZnOiAnI2Y4ZjhmMicsIG11dGVkOiAnIzYyNzJhNCcsICdmZy1tdXRlZCc6ICcjNTE1ZDg1JywgJ2NhcmQtYmFzZSc6ICcjNDQ0NzVhJywgJ2NhcmQtYmcnOiAnIzQ0NDc1YScsIGJvcmRlcjogJyM2MjcyYTQnLCBob3ZlcjogJyM0ZTUxNzAnLCAnY2FyZC1ob3Zlcic6ICcjNDk0YzYzJywgYmFzZTogJyMzNjM4NDgnLCAnb2stYmcnOiAnIzFlM2EyZScsICdvay1mZyc6ICcjNTBmYTdiJywgJ2JhZC1iZyc6ICcjM2QxYTFhJywgJ2JhZC1mZyc6ICcjZmY1NTU1JywgJ2RvdC1vayc6ICcjNTBmYTdiJywgJ2RvdC1iYWQnOiAnI2ZmNTU1NScsIHVwdGltZTogJyM1MGZhN2InLCBzdWNjZXNzOiAnIzUwZmE3YicsIGVycm9yOiAnI2ZmNTU1NScsIHdhcm5pbmc6ICcjZjFmYThjJywgYWNjZW50OiAnI2JkOTNmOScsICdhY2NlbnQtc3Ryb25nJzogJyM4YmU5ZmQnIH0sXG4gICAgJ3NvbGFyaXplZC1kYXJrJzogeyBiZzogJyMwMDJiMzYnLCBmZzogJyM4Mzk0OTYnLCBtdXRlZDogJyM1ODZlNzUnLCAnZmctbXV0ZWQnOiAnIzRhNWY2NScsICdjYXJkLWJhc2UnOiAnIzA3MzY0MicsICdjYXJkLWJnJzogJyMwNzM2NDInLCBib3JkZXI6ICcjNTg2ZTc1JywgaG92ZXI6ICcjMGQ0MDUwJywgJ2NhcmQtaG92ZXInOiAnIzBhM2E0OCcsIGJhc2U6ICcjMDUzMzQwJywgJ29rLWJnJzogJyMwZDNkMmMnLCAnb2stZmcnOiAnIzg1OTkwMCcsICdiYWQtYmcnOiAnIzNkMWExYScsICdiYWQtZmcnOiAnI2RjMzIyZicsICdkb3Qtb2snOiAnIzg1OTkwMCcsICdkb3QtYmFkJzogJyNkYzMyMmYnLCB1cHRpbWU6ICcjYjViZDY4Jywgc3VjY2VzczogJyM4NTk5MDAnLCBlcnJvcjogJyNkYzMyMmYnLCB3YXJuaW5nOiAnI2I1ODkwMCcsIGFjY2VudDogJyMyNjhiZDInLCAnYWNjZW50LXN0cm9uZyc6ICcjMmFhMTk4JyB9LFxuICAgICdzb2xhcml6ZWQtbGlnaHQnOnsgYmc6ICcjZmRmNmUzJywgZmc6ICcjNjU3YjgzJywgbXV0ZWQ6ICcjOTNhMWExJywgJ2ZnLW11dGVkJzogJyNhZGI4YjgnLCAnY2FyZC1iYXNlJzogJyNlZWU4ZDUnLCAnY2FyZC1iZyc6ICcjZWVlOGQ1JywgYm9yZGVyOiAnIzkzYTFhMScsIGhvdmVyOiAnI2U2ZGZjYicsICdjYXJkLWhvdmVyJzogJyNlYWUzY2YnLCBiYXNlOiAnI2U4ZTFjZCcsICdvay1iZyc6ICcjZThmNWU4JywgJ29rLWZnJzogJyM4NTk5MDAnLCAnYmFkLWJnJzogJyNmZGYyZjInLCAnYmFkLWZnJzogJyNkYzMyMmYnLCAnZG90LW9rJzogJyM4NTk5MDAnLCAnZG90LWJhZCc6ICcjZGMzMjJmJywgdXB0aW1lOiAnIzg1OTkwMCcsIHN1Y2Nlc3M6ICcjODU5OTAwJywgZXJyb3I6ICcjZGMzMjJmJywgd2FybmluZzogJyNiNTg5MDAnLCBhY2NlbnQ6ICcjMjY4YmQyJywgJ2FjY2VudC1zdHJvbmcnOiAnIzJhYTE5OCcsIGxpZ2h0Qmc6IHRydWUgfSxcbiAgICB0YXhpOiAgICAgICAgICAgICB7IGJnOiAnI2YzZDMyMScsIGZnOiAnIzBlMGUwMCcsIG11dGVkOiAnIzRhNGExMCcsICdmZy1tdXRlZCc6ICcjNmI2YjMwJywgJ2NhcmQtYmFzZSc6ICcjZmZkNzAwJywgJ2NhcmQtYmcnOiAnI2ZmZDcwMCcsIGJvcmRlcjogJyNiOGE4NDAnLCBob3ZlcjogJyNmZmU4NGQnLCAnY2FyZC1ob3Zlcic6ICcjZmZlMDMzJywgYmFzZTogJyNmMGQwMDAnLCAnb2stYmcnOiAnI2Q0ZmZkOScsICdvay1mZyc6ICcjMGYyYTBmJywgJ2JhZC1iZyc6ICcjZmZkNGQ0JywgJ2JhZC1mZyc6ICcjMmEwZjBmJywgJ2RvdC1vayc6ICcjNGNhZjUwJywgJ2RvdC1iYWQnOiAnI2ZmNDQ0NCcsIHVwdGltZTogJyMwZTBlMDAnLCBzdWNjZXNzOiAnIzJlN2QzMicsIGVycm9yOiAnI2M2MjgyOCcsIHdhcm5pbmc6ICcjZTY1MTAwJywgYWNjZW50OiAnIzdhNGEwMCcsICdhY2NlbnQtc3Ryb25nJzogJyM1YzM4MDAnLCBsaWdodEJnOiB0cnVlIH0sXG4gICAgb2NlYW46ICAgICAgICAgICAgeyBiZzogJyMyMDYwYjAnLCBmZzogJyNmYWY1ZWInLCBtdXRlZDogJyNkY2QyYzAnLCAnZmctbXV0ZWQnOiAnI2IwYTg5MCcsICdjYXJkLWJhc2UnOiAnIzdhOTRlZCcsICdjYXJkLWJnJzogJyM3YTk0ZWQnLCBib3JkZXI6ICcjZGViNjdhJywgaG92ZXI6ICcjOGFhMGYwJywgJ2NhcmQtaG92ZXInOiAnIzgyOThlOCcsIGJhc2U6ICcjNjg4OGUwJywgJ29rLWJnJzogJyM0ZjViYjAnLCAnb2stZmcnOiAnI2M3ZDdlYicsICdiYWQtYmcnOiAnI2Y0MWEzYScsICdiYWQtZmcnOiAnIzZhMTgxOCcsICdkb3Qtb2snOiAnIzMwYTA1MCcsICdkb3QtYmFkJzogJyNkMDQwNDAnLCB1cHRpbWU6ICcjMmQzMmYyJywgc3VjY2VzczogJyMzMGEwNTAnLCBlcnJvcjogJyNkMDQwNDAnLCB3YXJuaW5nOiAnI2U2YTAzMCcsIGFjY2VudDogJyMxODYwYTAnLCAnYWNjZW50LXN0cm9uZyc6ICcjMTA0MDgwJyB9LFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb2xvciBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGhleFRvUmdiKGhleCkge1xuICAgIGlmICghaGV4IHx8IHR5cGVvZiBoZXggIT09ICdzdHJpbmcnKSByZXR1cm4geyByOiAwLCBnOiAwLCBiOiAwIH07XG4gICAgaGV4ID0gaGV4LnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDMpIGhleCA9IGhleFswXStoZXhbMF0raGV4WzFdK2hleFsxXStoZXhbMl0raGV4WzJdO1xuICAgIHJldHVybiB7XG4gICAgICByOiBwYXJzZUludChoZXguc3Vic3RyKDAsIDIpLCAxNikgfHwgMCxcbiAgICAgIGc6IHBhcnNlSW50KGhleC5zdWJzdHIoMiwgMiksIDE2KSB8fCAwLFxuICAgICAgYjogcGFyc2VJbnQoaGV4LnN1YnN0cig0LCAyKSwgMTYpIHx8IDBcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcmdiVG9IZXgociwgZywgYikge1xuICAgIHJldHVybiAnIycgKyBbciwgZywgYl0ubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICB2YXIgaCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh4KSkpLnRvU3RyaW5nKDE2KTtcbiAgICAgIHJldHVybiBoLmxlbmd0aCA9PT0gMSA/ICcwJyArIGggOiBoO1xuICAgIH0pLmpvaW4oJycpO1xuICB9XG5cbiAgZnVuY3Rpb24gYmxlbmRDb2xvcnMoaGV4MSwgaGV4MiwgcmF0aW8pIHtcbiAgICB2YXIgYzEgPSBoZXhUb1JnYihoZXgxKTtcbiAgICB2YXIgYzIgPSBoZXhUb1JnYihoZXgyKTtcbiAgICByZXR1cm4gcmdiVG9IZXgoXG4gICAgICBjMS5yICsgKGMyLnIgLSBjMS5yKSAqIHJhdGlvLFxuICAgICAgYzEuZyArIChjMi5nIC0gYzEuZykgKiByYXRpbyxcbiAgICAgIGMxLmIgKyAoYzIuYiAtIGMxLmIpICogcmF0aW9cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gaGV4THVtaW5hbmNlKGhleCkge1xuICAgIGhleCA9IGhleC5yZXBsYWNlKCcjJywgJycpO1xuICAgIGlmIChoZXgubGVuZ3RoID09PSAzKSBoZXggPSBoZXhbMF0raGV4WzBdK2hleFsxXStoZXhbMV0raGV4WzJdK2hleFsyXTtcbiAgICB2YXIgciA9IHBhcnNlSW50KGhleC5zdWJzdHIoMCwgMiksIDE2KSAvIDI1NTtcbiAgICB2YXIgZyA9IHBhcnNlSW50KGhleC5zdWJzdHIoMiwgMiksIDE2KSAvIDI1NTtcbiAgICB2YXIgYiA9IHBhcnNlSW50KGhleC5zdWJzdHIoNCwgMiksIDE2KSAvIDI1NTtcbiAgICByID0gciA8PSAwLjAzOTI4ID8gciAvIDEyLjkyIDogTWF0aC5wb3coKHIgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBnID0gZyA8PSAwLjAzOTI4ID8gZyAvIDEyLjkyIDogTWF0aC5wb3coKGcgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBiID0gYiA8PSAwLjAzOTI4ID8gYiAvIDEyLjkyIDogTWF0aC5wb3coKGIgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gMC4yMTI2ICogciArIDAuNzE1MiAqIGcgKyAwLjA3MjIgKiBiO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEF1dG8tZGVyaXZlIGV4dGVuZGVkIGNvbG9ycyBmcm9tIGJhc2UgcGFsZXR0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBkZXJpdmVFeHRlbmRlZENvbG9ycyhjb2xvcnMpIHtcbiAgICB2YXIgYmcgPSBjb2xvcnMuYmcgfHwgJyMwYjBmMWEnO1xuICAgIHZhciBmZyA9IGNvbG9ycy5mZyB8fCAnI2U4ZWNmNSc7XG4gICAgdmFyIG11dGVkID0gY29sb3JzLm11dGVkIHx8ICcjOWFhNmJmJztcbiAgICB2YXIgY2FyZEJhc2UgPSBjb2xvcnNbJ2NhcmQtYmFzZSddIHx8IGNvbG9ycy5iZyB8fCAnIzEyMTgyNic7XG4gICAgdmFyIGRvdE9rID0gY29sb3JzWydkb3Qtb2snXSB8fCAnIzRjYWY1MCc7XG4gICAgdmFyIGRvdEJhZCA9IGNvbG9yc1snZG90LWJhZCddIHx8ICcjZTc0YzNjJztcbiAgICB2YXIgaXNMaWdodCA9IGNvbG9ycy5saWdodEJnIHx8IChiZyAmJiBoZXhMdW1pbmFuY2UoYmcpID4gMC40KTtcblxuICAgIHZhciBkZXJpdmVkID0ge307XG5cbiAgICAvLyBob3Zlcjogc3VidGxlIHNoaWZ0IG9mIGNhcmQtYmFzZSB0b3dhcmQgZmcgKGRhcmspIG9yIHRvd2FyZCBiZyAobGlnaHQpXG4gICAgZGVyaXZlZC5ob3ZlciA9IGlzTGlnaHRcbiAgICAgID8gYmxlbmRDb2xvcnMoY2FyZEJhc2UsIGJnLCAwLjM1KVxuICAgICAgOiBibGVuZENvbG9ycyhjYXJkQmFzZSwgZmcsIDAuMDgpO1xuXG4gICAgLy8gY2FyZC1ob3ZlcjogbWlkcG9pbnQgYmV0d2VlbiBjYXJkLWJhc2UgYW5kIGhvdmVyXG4gICAgZGVyaXZlZFsnY2FyZC1ob3ZlciddID0gYmxlbmRDb2xvcnMoY2FyZEJhc2UsIGRlcml2ZWQuaG92ZXIsIDAuNSk7XG5cbiAgICAvLyBiYXNlOiBzdWJkdWVkIGJhY2tncm91bmQgYmV0d2VlbiBiZyBhbmQgY2FyZC1iYXNlXG4gICAgZGVyaXZlZC5iYXNlID0gYmxlbmRDb2xvcnMoYmcsIGNhcmRCYXNlLCAwLjYpO1xuXG4gICAgLy8gZmctbXV0ZWQ6IGRpbW1lciB0aGFuIG11dGVkLCBibGVuZCB0b3dhcmQgYmdcbiAgICBkZXJpdmVkWydmZy1tdXRlZCddID0gYmxlbmRDb2xvcnMobXV0ZWQsIGJnLCAwLjM1KTtcblxuICAgIC8vIHN1Y2Nlc3M6IHJldXNlIGRvdC1vayAodGhlIGdyZWVuIG9mIHRoaXMgdGhlbWUpXG4gICAgZGVyaXZlZC5zdWNjZXNzID0gZG90T2s7XG5cbiAgICAvLyBlcnJvcjogcmV1c2UgZG90LWJhZCAodGhlIHJlZCBvZiB0aGlzIHRoZW1lKVxuICAgIGRlcml2ZWQuZXJyb3IgPSBkb3RCYWQ7XG5cbiAgICAvLyB3YXJuaW5nOiB3YXJtIGFtYmVyLCBhZGp1c3RlZCBmb3IgY29udHJhc3RcbiAgICBkZXJpdmVkLndhcm5pbmcgPSBpc0xpZ2h0ID8gJyNkNjhhMDAnIDogJyNmMzljMTInO1xuXG4gICAgcmV0dXJuIGRlcml2ZWQ7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgYm9keSBiYWNrZ3JvdW5kIENTUyBmb3IgdXNlciB0aGVtZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVCb2R5QmFja2dyb3VuZENTUyhzbHVnLCBjb2xvcnMpIHtcbiAgICB2YXIgaXNMaWdodCA9IGNvbG9ycy5saWdodEJnIHx8IChjb2xvcnMuYmcgJiYgaGV4THVtaW5hbmNlKGNvbG9ycy5iZykgPiAwLjQpO1xuICAgIHZhciBhY2NlbnQgPSBjb2xvcnMuYWNjZW50IHx8IGNvbG9yc1snYWNjZW50LXN0cm9uZyddIHx8ICcjODg4ODg4JztcbiAgICB2YXIgYWNjZW50UmdiID0gaGV4VG9SZ2IoYWNjZW50KTtcblxuICAgIGlmIChpc0xpZ2h0KSB7XG4gICAgICByZXR1cm4gJzpyb290LicgKyBzbHVnICsgJyBib2R5IHtcXG4nICtcbiAgICAgICAgJyAgYmFja2dyb3VuZDpcXG4nICtcbiAgICAgICAgJyAgICByYWRpYWwtZ3JhZGllbnQoMTIwMHB4IDgwMHB4IGF0IDEwJSAtMTAlLCByZ2JhKCcgKyBhY2NlbnRSZ2IuciArICcsJyArIGFjY2VudFJnYi5nICsgJywnICsgYWNjZW50UmdiLmIgKyAnLCAuMDgpLCB0cmFuc3BhcmVudCA2MCUpLFxcbicgK1xuICAgICAgICAnICAgIHJhZGlhbC1ncmFkaWVudCgxMDAwcHggNzAwcHggYXQgMTEwJSAxMCUsIHJnYmEoJyArIGFjY2VudFJnYi5yICsgJywnICsgYWNjZW50UmdiLmcgKyAnLCcgKyBhY2NlbnRSZ2IuYiArICcsIC4wNSksIHRyYW5zcGFyZW50IDU1JSksXFxuJyArXG4gICAgICAgICcgICAgdmFyKC0tYmcpO1xcbicgK1xuICAgICAgICAnfVxcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnOnJvb3QuJyArIHNsdWcgKyAnIGJvZHkge1xcbicgK1xuICAgICAgICAnICBiYWNrZ3JvdW5kOlxcbicgK1xuICAgICAgICAnICAgIHJhZGlhbC1ncmFkaWVudCgxMjAwcHggOTAwcHggYXQgOCUgLTEyJSwgcmdiYSgnICsgYWNjZW50UmdiLnIgKyAnLCcgKyBhY2NlbnRSZ2IuZyArICcsJyArIGFjY2VudFJnYi5iICsgJywgLjEwKSwgdHJhbnNwYXJlbnQgNjAlKSxcXG4nICtcbiAgICAgICAgJyAgICByYWRpYWwtZ3JhZGllbnQoMTAwMHB4IDcwMHB4IGF0IDExMCUgLTEwJSwgcmdiYSgnICsgYWNjZW50UmdiLnIgKyAnLCcgKyBhY2NlbnRSZ2IuZyArICcsJyArIGFjY2VudFJnYi5iICsgJywgLjA3KSwgdHJhbnNwYXJlbnQgNTUlKSxcXG4nICtcbiAgICAgICAgJyAgICB2YXIoLS1iZyk7XFxuJyArXG4gICAgICAgICd9XFxuJztcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgYnV0dG9uIGhvdmVyIENTUyBmb3IgdXNlciB0aGVtZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVCdXR0b25Ib3ZlckNTUyhzbHVnLCBjb2xvcnMpIHtcbiAgICB2YXIgaXNMaWdodCA9IGNvbG9ycy5saWdodEJnIHx8IChjb2xvcnMuYmcgJiYgaGV4THVtaW5hbmNlKGNvbG9ycy5iZykgPiAwLjQpO1xuXG4gICAgaWYgKGlzTGlnaHQpIHtcbiAgICAgIHJldHVybiAnOnJvb3QuJyArIHNsdWcgKyAnIGJ1dHRvbjpob3ZlciB7XFxuJyArXG4gICAgICAgICcgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQtc3Ryb25nKSAxMiUsIHdoaXRlIDg4JSk7XFxuJyArXG4gICAgICAgICcgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAuMTUpO1xcbicgK1xuICAgICAgICAnICBib3gtc2hhZG93OiAwIDFweCA2cHggcmdiYSgwLCAwLCAwLCAuMDgpLCBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgLjgpO1xcbicgK1xuICAgICAgICAnfVxcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnOnJvb3QuJyArIHNsdWcgKyAnIGJ1dHRvbjpob3ZlciB7XFxuJyArXG4gICAgICAgICcgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpO1xcbicgK1xuICAgICAgICAnICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDM1JSwgdmFyKC0tYm9yZGVyKSk7XFxuJyArXG4gICAgICAgICd9XFxuJztcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ29yZSB0aGVtZSBmdW5jdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2V0U3lzdGVtVGhlbWUoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCc7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckN1c3RvbVByb3BlcnRpZXMoKSB7XG4gICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCctLScgKyBwcm9wKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNsdWdpZnkobmFtZSwgY3VycmVudFNsdWcpIHtcbiAgICB2YXIgc2x1ZyA9IG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgIGlmICghc2x1Zykgc2x1ZyA9ICdjdXN0b20nO1xuICAgIGlmIChCVUlMVElOX1RIRU1FUy5pbmRleE9mKHNsdWcpICE9PSAtMSkgc2x1ZyA9IHNsdWcgKyAnLWN1c3RvbSc7XG4gICAgdmFyIGNhY2hlZCA9IHNhZmVHZXRKU09OKFVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIHZhciBiYXNlID0gc2x1ZztcbiAgICB2YXIgY291bnRlciA9IDI7XG4gICAgd2hpbGUgKGNhY2hlZFtzbHVnXSAmJiBzbHVnICE9PSBjdXJyZW50U2x1Zykge1xuICAgICAgc2x1ZyA9IGJhc2UgKyAnLScgKyBjb3VudGVyKys7XG4gICAgfVxuICAgIHJldHVybiBzbHVnO1xuICB9XG5cbiAgLy8gSW5qZWN0IHVzZXIgdGhlbWVzIGZyb20gYSB0aGVtZXMgb2JqZWN0IGludG8gRE9NICsgcnVudGltZVxuICBmdW5jdGlvbiBpbmplY3RVc2VyVGhlbWVTdHlsZXModGhlbWVzRGF0YSkge1xuICAgIHZhciBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1c2VyLXRoZW1lLXN0eWxlcycpO1xuICAgIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG5cbiAgICBUSEVNRVMubGVuZ3RoID0gQlVJTFRJTl9USEVNRVMubGVuZ3RoO1xuICAgIE9iamVjdC5rZXlzKFRIRU1FX0NPTE9SUykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgaWYgKEJVSUxUSU5fVEhFTUVTLmluZGV4T2YoaykgPT09IC0xKSBkZWxldGUgVEhFTUVfQ09MT1JTW2tdO1xuICAgIH0pO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGRhdGEsIG9yIGZhbGwgYmFjayB0byBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICB2YXIgdXNlclRoZW1lcyA9IHRoZW1lc0RhdGEgfHwgc2FmZUdldEpTT04oVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIHNsdWdzID0gT2JqZWN0LmtleXModXNlclRoZW1lcyk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFueSB1c2VyIHRoZW1lcyB0aGF0IGNvbGxpZGUgd2l0aCBidWlsdC1pbiBzbHVnc1xuICAgIHNsdWdzID0gc2x1Z3MuZmlsdGVyKGZ1bmN0aW9uIChzKSB7IHJldHVybiBCVUlMVElOX1RIRU1FUy5pbmRleE9mKHMpID09PSAtMTsgfSk7XG5cbiAgICBpZiAoIXNsdWdzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdmFyIGNzcyA9ICcnO1xuICAgIHNsdWdzLmZvckVhY2goZnVuY3Rpb24gKHNsdWcpIHtcbiAgICAgIHZhciB0aGVtZSA9IHVzZXJUaGVtZXNbc2x1Z107XG4gICAgICBpZiAoVEhFTUVTLmluZGV4T2Yoc2x1ZykgPT09IC0xKSBUSEVNRVMucHVzaChzbHVnKTtcblxuICAgICAgLy8gQnVpbGQgY29sb3IgbWFwIGZyb20gc2F2ZWQgZGF0YVxuICAgICAgdmFyIGNvbG9yTWFwID0ge307XG4gICAgICBUSEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGlmICh0aGVtZVtwXSkgY29sb3JNYXBbcF0gPSB0aGVtZVtwXTsgfSk7XG4gICAgICBjb2xvck1hcFsnY2FyZC1iZyddID0gdGhlbWVbJ2NhcmQtYmFzZSddIHx8IHRoZW1lLmJnO1xuICAgICAgaWYgKHRoZW1lLmxpZ2h0QmcpIGNvbG9yTWFwLmxpZ2h0QmcgPSB0cnVlO1xuXG4gICAgICAvLyBBdXRvLWRlcml2ZSBhbnkgbWlzc2luZyBleHRlbmRlZCBjb2xvcnNcbiAgICAgIHZhciBkZXJpdmVkID0gZGVyaXZlRXh0ZW5kZWRDb2xvcnMoY29sb3JNYXApO1xuICAgICAgREVSSVZFRF9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIGlmICghY29sb3JNYXBbcF0gJiYgZGVyaXZlZFtwXSkgY29sb3JNYXBbcF0gPSBkZXJpdmVkW3BdO1xuICAgICAgfSk7XG5cbiAgICAgIFRIRU1FX0NPTE9SU1tzbHVnXSA9IGNvbG9yTWFwO1xuXG4gICAgICAvLyBFbWl0IG1haW4gdmFyaWFibGUgYmxvY2tcbiAgICAgIGNzcyArPSAnOnJvb3QuJyArIHNsdWcgKyAnIHtcXG4nO1xuICAgICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgICBpZiAoY29sb3JNYXBbcF0pIGNzcyArPSAnICAtLScgKyBwICsgJzogJyArIGNvbG9yTWFwW3BdICsgJztcXG4nO1xuICAgICAgfSk7XG4gICAgICBjc3MgKz0gJ31cXG4nO1xuXG4gICAgICAvLyBFbWl0IGJvZHkgYmFja2dyb3VuZCBncmFkaWVudFxuICAgICAgY3NzICs9IGdlbmVyYXRlQm9keUJhY2tncm91bmRDU1Moc2x1ZywgY29sb3JNYXApO1xuXG4gICAgICAvLyBFbWl0IGJ1dHRvbiBob3ZlciBvdmVycmlkZVxuICAgICAgY3NzICs9IGdlbmVyYXRlQnV0dG9uSG92ZXJDU1Moc2x1ZywgY29sb3JNYXApO1xuICAgIH0pO1xuXG4gICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS5pZCA9ICd1c2VyLXRoZW1lLXN0eWxlcyc7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIH1cblxuICAvLyBGZXRjaCB0aGVtZXMgZnJvbSBzZXJ2ZXIsIHVwZGF0ZSBjYWNoZSwgcmUtaW5qZWN0IGlmIGNoYW5nZWRcbiAgZnVuY3Rpb24gc3luY1RoZW1lc0Zyb21TZXJ2ZXIoKSB7XG4gICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdGhlbWVzJykudGhlbihmdW5jdGlvbiAocikgeyByZXR1cm4gci5qc29uKCk7IH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLnRoZW1lcykgcmV0dXJuO1xuICAgICAgdmFyIHNlcnZlclRoZW1lcyA9IGRhdGEudGhlbWVzO1xuICAgICAgdmFyIGNhY2hlZCA9IHNhZmVHZXRKU09OKFVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgICAgLy8gT25seSB1cGRhdGUgaWYgZGlmZmVyZW50XG4gICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc2VydmVyVGhlbWVzKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2FjaGVkKSkge1xuICAgICAgICBzYWZlU2V0KFVTRVJfVEhFTUVTX0tFWSwgSlNPTi5zdHJpbmdpZnkoc2VydmVyVGhlbWVzKSk7XG4gICAgICAgIGluamVjdFVzZXJUaGVtZVN0eWxlcyhzZXJ2ZXJUaGVtZXMpO1xuICAgICAgICAvLyBSZS1hcHBseSBjdXJyZW50IHRoZW1lIGluIGNhc2UgaXQgd2FzIGp1c3Qgc3luY2VkXG4gICAgICAgIHZhciBjdXJyZW50ID0gc2FmZUdldChUSEVNRV9LRVkpO1xuICAgICAgICBpZiAoY3VycmVudCAmJiBUSEVNRVMuaW5kZXhPZihjdXJyZW50KSAhPT0gLTEpIHtcbiAgICAgICAgICBhcHBseVRoZW1lKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICB9XG5cbiAgLy8gTWlncmF0ZSBsZWdhY3kgY3VzdG9tLXRoZW1lIHRvIHNlcnZlclxuICBmdW5jdGlvbiBtaWdyYXRlTGVnYWN5Q3VzdG9tVGhlbWUoKSB7XG4gICAgdmFyIGxlZ2FjeSA9IHNhZmVHZXRKU09OKExFR0FDWV9DVVNUT01fS0VZKTtcbiAgICBpZiAoIWxlZ2FjeSkgcmV0dXJuO1xuXG4gICAgdmFyIG5hbWUgPSBsZWdhY3kubmFtZSB8fCAnQ3VzdG9tJztcbiAgICB2YXIgc2x1ZyA9IHNsdWdpZnkobmFtZSk7XG5cbiAgICB2YXIgdGhlbWVEYXRhID0geyBuYW1lOiBuYW1lIH07XG4gICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKGxlZ2FjeVtwXSkgdGhlbWVEYXRhW3BdID0gbGVnYWN5W3BdO1xuICAgIH0pO1xuXG4gICAgLy8gU2F2ZSB0byBsb2NhbFN0b3JhZ2UgY2FjaGUgaW1tZWRpYXRlbHlcbiAgICB2YXIgY2FjaGVkID0gc2FmZUdldEpTT04oVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgY2FjaGVkW3NsdWddID0gdGhlbWVEYXRhO1xuICAgIHNhZmVTZXQoVVNFUl9USEVNRVNfS0VZLCBKU09OLnN0cmluZ2lmeShjYWNoZWQpKTtcblxuICAgIC8vIFVwZGF0ZSBhY3RpdmUgdGhlbWUgcmVmZXJlbmNlXG4gICAgaWYgKHNhZmVHZXQoVEhFTUVfS0VZKSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgIHNhZmVTZXQoVEhFTUVfS0VZLCBzbHVnKTtcbiAgICB9XG5cbiAgICBzYWZlUmVtb3ZlKExFR0FDWV9DVVNUT01fS0VZKTtcblxuICAgIC8vIEFsc28gcHVzaCB0byBzZXJ2ZXJcbiAgICB2YXIgY29sb3JzID0ge307XG4gICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAodGhlbWVEYXRhW3BdKSBjb2xvcnNbcF0gPSB0aGVtZURhdGFbcF07IH0pO1xuICAgIGZldGNoKCcvYXBpL3YxL3RoZW1lcy8nICsgc2x1Zywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZTogbmFtZSwgY29sb3JzOiBjb2xvcnMgfSlcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVRoZW1lKG1vZGUpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGhlbWUtdHJhbnNpdGlvbmluZycpO1xuXG4gICAgVEhFTUVTLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0ICE9PSAnZGFyaycpIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHQpO1xuICAgIH0pO1xuXG4gICAgY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAobW9kZSAhPT0gJ2RhcmsnKSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChtb2RlKTtcbiAgICB9XG5cbiAgICBzYWZlU2V0KFRIRU1FX0tFWSwgbW9kZSk7XG5cbiAgICB2YXIgY29sb3JzID0gVEhFTUVfQ09MT1JTW21vZGVdO1xuICAgIHZhciBtZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidGhlbWUtY29sb3JcIl0nKTtcbiAgICBpZiAobWV0YSAmJiBjb2xvcnMpIG1ldGEuc2V0QXR0cmlidXRlKCdjb250ZW50JywgY29sb3JzLmJnKTtcblxuICAgIC8vIFRvZ2dsZSBsaWdodC1iZyBjbGFzczogZXhwbGljaXQgZmxhZyBmaXJzdCwgdGhlbiBhdXRvLWRldGVjdCBmcm9tIGx1bWluYW5jZVxuICAgIHZhciBpc0xpZ2h0ID0gY29sb3JzICYmIGNvbG9ycy5saWdodEJnO1xuICAgIGlmICghaXNMaWdodCAmJiBjb2xvcnMgJiYgY29sb3JzLmJnKSBpc0xpZ2h0ID0gaGV4THVtaW5hbmNlKGNvbG9ycy5iZykgPiAwLjQ7XG4gICAgaWYgKGlzTGlnaHQpIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaWdodC1iZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbGlnaHQtYmcnKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0aGVtZS10cmFuc2l0aW9uaW5nJyk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIC8vIC0tLSBJbml0aWFsaXphdGlvbiAtLS1cbiAgbWlncmF0ZUxlZ2FjeUN1c3RvbVRoZW1lKCk7XG4gIC8vIEluc3RhbnQgbG9hZCBmcm9tIGNhY2hlXG4gIGluamVjdFVzZXJUaGVtZVN0eWxlcygpO1xuXG4gIHZhciBzYXZlZFRoZW1lID0gc2FmZUdldChUSEVNRV9LRVkpO1xuICBpZiAoc2F2ZWRUaGVtZSA9PT0gJ3JlZCcpIHsgc2F2ZWRUaGVtZSA9ICdibGFjayc7IHNhZmVTZXQoVEhFTUVfS0VZLCAnYmxhY2snKTsgfVxuICBpZiAoc2F2ZWRUaGVtZSAmJiBzYXZlZFRoZW1lICE9PSAnZGFyaycgJiYgVEhFTUVTLmluZGV4T2Yoc2F2ZWRUaGVtZSkgPT09IC0xKSB7XG4gICAgc2F2ZWRUaGVtZSA9IG51bGw7XG4gIH1cbiAgYXBwbHlUaGVtZShzYXZlZFRoZW1lIHx8IGdldFN5c3RlbVRoZW1lKCkpO1xuXG4gIC8vIFN5bmMgZnJvbSBzZXJ2ZXIgaW4gYmFja2dyb3VuZCAodXBkYXRlcyBjYWNoZSBpZiBzZXJ2ZXIgaGFzIG5ld2VyIGRhdGEpXG4gIHN5bmNUaGVtZXNGcm9tU2VydmVyKCk7XG5cbiAgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghc2FmZUdldChUSEVNRV9LRVkpKSB7XG4gICAgICBhcHBseVRoZW1lKGUubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCcpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gRXhwb3NlIEFQSVxuICB3aW5kb3cuVEhFTUVTID0gVEhFTUVTO1xuICB3aW5kb3cuQlVJTFRJTl9USEVNRVMgPSBCVUlMVElOX1RIRU1FUztcbiAgd2luZG93LlRIRU1FX0NPTE9SUyA9IFRIRU1FX0NPTE9SUztcbiAgd2luZG93LlRIRU1FX1BST1BTID0gVEhFTUVfUFJPUFM7XG4gIHdpbmRvdy5CQVNFX1BST1BTID0gQkFTRV9QUk9QUztcbiAgd2luZG93LkRFUklWRURfUFJPUFMgPSBERVJJVkVEX1BST1BTO1xuICB3aW5kb3cuVVNFUl9USEVNRVNfS0VZID0gVVNFUl9USEVNRVNfS0VZO1xuICB3aW5kb3cuYXBwbHlUaGVtZSA9IGFwcGx5VGhlbWU7XG4gIHdpbmRvdy5jbGVhckN1c3RvbVByb3BlcnRpZXMgPSBjbGVhckN1c3RvbVByb3BlcnRpZXM7XG4gIHdpbmRvdy5pbmplY3RVc2VyVGhlbWVTdHlsZXMgPSBpbmplY3RVc2VyVGhlbWVTdHlsZXM7XG4gIHdpbmRvdy5zeW5jVGhlbWVzRnJvbVNlcnZlciA9IHN5bmNUaGVtZXNGcm9tU2VydmVyO1xuICB3aW5kb3cuc2x1Z2lmeVRoZW1lTmFtZSA9IHNsdWdpZnk7XG4gIHdpbmRvdy5nZXRBY3RpdmVUaGVtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNhZmVHZXQoVEhFTUVfS0VZKSB8fCBnZXRTeXN0ZW1UaGVtZSgpOyB9O1xuICB3aW5kb3cuZGVyaXZlRXh0ZW5kZWRDb2xvcnMgPSBkZXJpdmVFeHRlbmRlZENvbG9ycztcbiAgd2luZG93LmhleFRvUmdiID0gaGV4VG9SZ2I7XG4gIHdpbmRvdy5yZ2JUb0hleCA9IHJnYlRvSGV4O1xuICB3aW5kb3cuYmxlbmRDb2xvcnMgPSBibGVuZENvbG9ycztcbn0pKCk7XG47XG4vLyA9PT09PSBQTFVHR0FCTEUgQVVUSCBHQVRFIChEQy0wNDkpID09PT09XG4vL1xuLy8gT24gQ2FkZHkgcmVkaXJlY3QgdG8gP2F1dGg9cmVxdWlyZWQsIHRoaXMgbW9kdWxlIHF1ZXJpZXNcbi8vIEdFVCAvYXBpL3YxL2F1dGgvbG9naW4vbWV0aG9kcyB0byBkaXNjb3ZlciB3aGljaCBBdXRoUHJvdmlkZXJzIGFyZSBlbmFibGVkLlxuLy8gSWYgb25seSBvbmUgcHJvdmlkZXIgaXMgZW5hYmxlZCwganVtcCBzdHJhaWdodCB0byBpdHMgY2hhbGxlbmdlIFVJXG4vLyAoVE9UUC1vbmx5IGluc3RhbGxhdGlvbnMgdG9kYXkpLiBJZiBtdWx0aXBsZSBwcm92aWRlcnMgZXhpc3QsIHJlbmRlciBhXG4vLyBzZWxlY3RvciBmaXJzdCBzbyB0aGUgdXNlciBwaWNrcyBob3cgdG8gc2lnbiBpbi5cbi8vXG4vLyBUb2RheTpcbi8vICAgLSB0b3RwOiAgICBjaGFsbGVuZ2UgaXMgNi1kaWdpdCBjb2RlIHZpYSB0aGUgZXhpc3RpbmcgVE9UUCBvdmVybGF5XG4vLyAgIC0gZW1haWw6ICAgY2hhbGxlbmdlIGlzIGVtYWlsIGFkZHJlc3MgXHUyMTkyIFBPU1QgL2FwaS92MS9hdXRoL2xvZ2luL2VtYWlsL2luaXRpYXRlXG4vLyAgICAgICAgICAgICAgXHUyMTkyIHNlcnZlciBlbWFpbHMgbWFnaWMgbGluayAob3IgbG9ncyBpdCB0byBjb25zb2xlIGluIGRldikgXHUyMTkyXG4vLyAgICAgICAgICAgICAgd2FpdGluZyBmb3IgdmVyaWZpY2F0aW9uIChubyBhdXRvLXByb21vdGlvbjsgdXNlciByZWxvYWRzIHZpYVxuLy8gICAgICAgICAgICAgIGVtYWlsIGxpbmssIHdoaWNoIHJvdXRlcyB0aHJvdWdoIC9hcGkvdjEvYXV0aC9sb2dpbi9lbWFpbC92ZXJpZnkpXG4vL1xuLy8gVGhpcyBtb2R1bGUgd2lyZXMgaW50byB0aGUgZXhpc3RpbmcgdG90cC1hdXRoLmpzIHN1Ym1pdFRvdHBDb2RlKCkgZmxvdyBzb1xuLy8gdGhlIGxlZ2FjeSBUT1RQIGhhcHB5LXBhdGggaXMgdW5jaGFuZ2VkOiB3aGVuIG1ldGhvZHMgcmV0dXJucyBvbmx5XG4vLyBgdG90cGAsIHRoaXMgbW9kdWxlIGp1c3Qgc2hvd3MgdGhlIFRPVFAgb3ZlcmxheSBhbmQgZXhpdHMuXG5cbihmdW5jdGlvbigpIHtcbiAgLy8gLS0tLSBET00gcmVmcyAoY3JlYXRlZCBsYXppbHkgYmVsb3c7IGV4aXN0aW5nIFRPVFAgbWFya3VwIHN1cHBsaWVzIHRoZW0pIC0tLS1cbiAgbGV0IG1ldGhvZHNDYWNoZSA9IG51bGw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNZXRob2RzKCkge1xuICAgIGlmIChtZXRob2RzQ2FjaGUpIHJldHVybiBtZXRob2RzQ2FjaGU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2F1dGgvbG9naW4vbWV0aG9kcycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGBtZXRob2RzIEhUVFAgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBtZXRob2RzQ2FjaGUgPSBBcnJheS5pc0FycmF5KGRhdGEucHJvdmlkZXJzKSA/IGRhdGEucHJvdmlkZXJzIDogW107XG4gICAgICByZXR1cm4gbWV0aG9kc0NhY2hlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFB1YmxpYyBlbmRwb2ludCBcdTIwMTQgaWYgaXQgZmFpbHMsIGZhbGwgdGhyb3VnaCB0byBsZWdhY3kgVE9UUCBwYXRoLlxuICAgICAgY29uc29sZS53YXJuKCdbYXV0aC1nYXRlXSBtZXRob2RzIGZldGNoIGZhaWxlZDsgZmFsbGluZyBiYWNrIHRvIFRPVFAtb25seScsIGUpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dQcm92aWRlclNlbGVjdG9yKHByb3ZpZGVycykge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtY2FyZCcpO1xuICAgIGlmICghY2FyZCkgcmV0dXJuO1xuXG4gICAgLy8gU2F2ZSB0aGUgZXhpc3RpbmcgVE9UUC1jaGFsbGVuZ2UgYm9keSBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBvbiBjYW5jZWwuXG4gICAgY29uc3Qgb3JpZ2luYWxCb2R5ID0gY2FyZC5pbm5lckhUTUw7XG4gICAgaWYgKCFjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5KSBjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5ID0gb3JpZ2luYWxCb2R5O1xuXG4gICAgY29uc3QgcHJvdmlkZXJCdXR0b25zID0gcHJvdmlkZXJzLm1hcChwID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gKHAuY29uZmlnICYmIChwLmNvbmZpZy5sYWJlbCB8fCBwLm5hbWUpKSB8fCBwLm5hbWU7XG4gICAgICBjb25zdCBidG4gPSBgPGJ1dHRvbiBjbGFzcz1cInByb3ZpZGVyLWJ0blwiIGRhdGEtcHJvdmlkZXI9XCIke3AubmFtZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogNnB4IDRweDsgcGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgU2lnbiBpbiB3aXRoICR7bGFiZWx9XG4gICAgICA8L2J1dHRvbj5gO1xuICAgICAgcmV0dXJuIGJ0bjtcbiAgICB9KS5qb2luKCdcXG4nKTtcblxuICAgIGNhcmQuaW5uZXJIVE1MID0gYFxuICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tZGFya1wiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tZGFyay5wbmdcIiBhbHQ9XCJEYXNoQ2FkZHlcIiBvbmVycm9yPVwidGhpcy5zdHlsZS5kaXNwbGF5PSdub25lJ1wiPlxuICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tbGlnaHRcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZ1wiIGFsdD1cIkRhc2hDYWRkeVwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XG4gICAgICA8cCBjbGFzcz1cInN1YnRpdGxlXCI+Q2hvb3NlIGhvdyB0byBzaWduIGluPC9wPlxuICAgICAgPGRpdiBpZD1cImF1dGgtZ2F0ZS1wcm92aWRlcnNcIiBzdHlsZT1cIm1hcmdpbjogMTRweCAwIDEwcHg7XCI+JHtwcm92aWRlckJ1dHRvbnN9PC9kaXY+XG4gICAgICA8ZGl2IGlkPVwiYXV0aC1nYXRlLW1lc3NhZ2VcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+PC9kaXY+XG4gICAgYDtcblxuICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgLy8gV2lyZSBlYWNoIGJ1dHRvblxuICAgIGNhcmQucXVlcnlTZWxlY3RvckFsbCgnLnByb3ZpZGVyLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGJ0bi5kYXRhc2V0LnByb3ZpZGVyO1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IHByb3ZpZGVycy5maW5kKHAgPT4gcC5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgcmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UocHJvdmlkZXIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXN0b3JlT3JpZ2luYWxCb2R5KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtY2FyZCcpO1xuICAgIGlmICghY2FyZCB8fCAhY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keSkgcmV0dXJuO1xuICAgIGNhcmQuaW5uZXJIVE1MID0gY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keTtcbiAgICAvLyBSZS1iaW5kIHRoZSBvcmlnaW5hbCBkaWdpdCBpbnB1dCBoYW5kbGVycyBieSByZS1ydW5uaW5nIHRoZSB0b3RwLWF1dGhcbiAgICAvLyBib290c3RyYXAuIFRoZSBzaW1wbGVzdCBwYXRoOiByZWxvYWQgdGhlIHBhZ2UsIHdoaWNoIHJlLXJ1bnMgYWxsIElJRkVzLlxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlclByb3ZpZGVyQ2hhbGxlbmdlKHByb3ZpZGVyKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgICBjb25zdCBjYXJkID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcudG90cC1jYXJkJyk7XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBpZiAocHJvdmlkZXIubmFtZSA9PT0gJ3RvdHAnKSB7XG4gICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBUT1RQIG1hcmt1cCBcdTIxOTIgZXhpc3RpbmcgdG90cC1hdXRoLmpzIHN1Ym1pdFRvdHBDb2RlXG4gICAgICAvLyBwYXRoIGhhbmRsZXMgdGhlIHJlc3QuIChSZWxvYWQgaXMgdGhlIGNsZWFuZXN0IHBhdGggYmVjYXVzZVxuICAgICAgLy8gdG90cC1hdXRoLmpzIHdpcmVzIGl0cyBpbnB1dCBoYW5kbGVycyBhdCB0b3AtbGV2ZWwgSUlGRSB0aW1lLilcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvdmlkZXIubmFtZSA9PT0gJ2VtYWlsJykge1xuICAgICAgY2FyZC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxpbWcgY2xhc3M9XCJ0b3RwLWxvZ28gdG90cC1sb2dvLWRhcmtcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWRhcmsucG5nXCIgYWx0PVwiRGFzaENhZGR5XCIgb25lcnJvcj1cInRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSdcIj5cbiAgICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tbGlnaHRcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZ1wiIGFsdD1cIkRhc2hDYWRkeVwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XG4gICAgICAgIDxwIGNsYXNzPVwic3VidGl0bGVcIj5TaWduIGluIHdpdGggZW1haWw8L3A+XG4gICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOiA2cHggMCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgV2UnbGwgZW1haWwgeW91IGEgb25lLXRpbWUgc2lnbi1pbiBsaW5rLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxpbnB1dCBpZD1cImF1dGgtZ2F0ZS1lbWFpbC1pbnB1dFwiIHR5cGU9XCJlbWFpbFwiIGlucHV0bW9kZT1cImVtYWlsXCIgYXV0b2NvbXBsZXRlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ5b3VAZXhhbXBsZS5jb21cIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBmb250LXNpemU6IDFyZW07IGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJnKTsgY29sb3I6IHZhcigtLXRleHQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdXRoLWdhdGUtZW1haWwtc3VibWl0XCIgY2xhc3M9XCJwcm92aWRlci1idG5cIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogMTRweDsgcGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45NXJlbTsgd2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgU2VuZCBzaWduLWluIGxpbmtcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgaWQ9XCJhdXRoLWdhdGUtZW1haWwtc3RhdHVzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBmb250LXNpemU6IDAuODVyZW07IGxpbmUtaGVpZ2h0OiAxLjQ7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgaWQ9XCJhdXRoLWdhdGUtYmFja1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+XHUyMTkwIEJhY2s8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgICAgY29uc3QgaW5wdXQgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtZW1haWwtaW5wdXQnKTtcbiAgICAgIGNvbnN0IHN1Ym1pdCA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1zdWJtaXQnKTtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGJhY2sgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtYmFjaycpO1xuXG4gICAgICBzdWJtaXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVtYWlsID0gKGlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnRW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLic7XG4gICAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWVycm9yLCAjZDMzKSc7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1Ym1pdC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdTZW5kaW5nXHUyMDI2JztcbiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYXV0aC9sb2dpbi9lbWFpbC9pbml0aWF0ZScsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVtYWlsIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpYSA9IGRhdGEuZGVsaXZlcmVkVmlhIHx8ICdlbWFpbCc7XG4gICAgICAgICAgICBjb25zdCBtYXNrZWQgPSBkYXRhLm1hc2tlZEVtYWlsIHx8IGVtYWlsO1xuICAgICAgICAgICAgaWYgKHZpYSA9PT0gJ2Rldi1jb25zb2xlJykge1xuICAgICAgICAgICAgICBzdGF0dXMuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgIENoZWNrIHRoZSBzZXJ2ZXIgbG9ncyBmb3IgeW91ciBvbmUtdGltZSBsaW5rLlxuICAgICAgICAgICAgICAgIChEZXYgbW9kZTogbm8gU01UUCBjb25maWd1cmVkLiBJbiBwcm9kdWN0aW9uIHRoaXMgd291bGQgZW1haWwgPHN0cm9uZz4ke21hc2tlZH08L3N0cm9uZz4uKWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGF0dXMuaW5uZXJIVE1MID0gYFNpZ24taW4gbGluayBzZW50IHRvIDxzdHJvbmc+JHttYXNrZWR9PC9zdHJvbmc+LlxuICAgICAgICAgICAgICAgIENoZWNrIHlvdXIgaW5ib3ggKGFuZCBzcGFtIGZvbGRlcikuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1zdWNjZXNzLCAjMmE3KSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgJ0NvdWxkIG5vdCBzZW5kIGxpbmsuJztcbiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1lcnJvciwgI2QzMyknO1xuICAgICAgICAgICAgc3VibWl0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ0Nvbm5lY3Rpb24gZXJyb3IuIFRyeSBhZ2Fpbi4nO1xuICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1lcnJvciwgI2QzMyknO1xuICAgICAgICAgIHN1Ym1pdC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHN1Ym1pdC5jbGljaygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJhY2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzaG93UHJvdmlkZXJTZWxlY3Rvcihwcm92aWRlcnMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVW5rbm93biBwcm92aWRlciBcdTIxOTIgcmVzdG9yZSBUT1RQIHBhdGggYXMgYSBsYXN0IHJlc29ydFxuICAgIGNvbnNvbGUud2FybignW2F1dGgtZ2F0ZV0gdW5rbm93biBwcm92aWRlcicsIHByb3ZpZGVyLm5hbWUpO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNob3coKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHJldHVybjsgLy8gVE9UUC1vbmx5IGJ1aWxkIHdpdGhvdXQgb3VyIG92ZXJsYXkgY2hhbmdlc1xuXG4gICAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgZmV0Y2hNZXRob2RzKCk7XG4gICAgaWYgKHByb3ZpZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEVpdGhlciB0aGUgZW5kcG9pbnQgaXNuJ3QgcmVhY2hhYmxlIE9SIG5vIHByb3ZpZGVyIHJlcG9ydHMgZW5hYmxlZC5cbiAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgbGVnYWN5IFRPVFAgb3ZlcmxheSBcdTIwMTQgZXhpc3RpbmcgdG90cC1hdXRoLmpzIGhhbmRsZXMgaXQuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5ID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocHJvdmlkZXJzLmxlbmd0aCA9PT0gMSAmJiBwcm92aWRlcnNbMF0ubmFtZSA9PT0gJ3RvdHAnKSB7XG4gICAgICAvLyBTaW5nbGUgVE9UUCBwcm92aWRlciBcdTIxOTIgc2hvdyB0aGUgb3JpZ2luYWwgVE9UUCBvdmVybGF5IHVuY2hhbmdlZCxcbiAgICAgIC8vIGJ1dCB3aXRoIGFuIFwiT3Igc2lnbiBpbiB3aXRoIGVtYWlsXCIgbGluayBiZWxvdyBzbyB0aGUgZW1haWwgcGF0aFxuICAgICAgLy8gaXMgcmVhY2hhYmxlIGFzIHRoZSByZWNvdmVyeSAvIHBob25lLWZyaWVuZGx5IGFsdGVybmF0aXZlLiBNb3N0XG4gICAgICAvLyB1c2VycyBzdGlsbCB3YW50IHRoZWlyIHByaW1hcnkgbWV0aG9kIChUT1RQKSBmcm9udC1hbmQtY2VudGVyLlxuICAgICAgc2hvd1RvdHBXaXRoRW1haWxGYWxsYmFjayhwcm92aWRlcnNbMF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzaG93UHJvdmlkZXJTZWxlY3Rvcihwcm92aWRlcnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1RvdHBXaXRoRW1haWxGYWxsYmFjayh0b3RwUHJvdmlkZXIpIHtcbiAgICBjb25zdCBlbWFpbEVuYWJsZWQgPSBtZXRob2RzQ2FjaGUgJiYgbWV0aG9kc0NhY2hlLmZpbmQocCA9PiBwLm5hbWUgPT09ICdlbWFpbCcpO1xuICAgIGlmICghZW1haWxFbmFibGVkKSB7XG4gICAgICAvLyBUcnVseSBzaW5nbGUtcHJvdmlkZXIgcGF0aDogbGVnYWN5IFRPVFAgb3ZlcmxheSwgbm8gYWx0IGxpbmsuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5ID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGNvbnN0IGNhcmQgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcblxuICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIFRPVFAgbWFya3VwIHNvIHdlIGNhbiByZXN0b3JlIG9uIGFsdC1saW5rIGNsaWNrIG9mZi5cbiAgICBpZiAoIWNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHkpIGNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHkgPSBjYXJkLmlubmVySFRNTDtcblxuICAgIC8vIEFkZCBhIHNtYWxsIFwib3JcIiBsaW5rIGF0IHRoZSBib3R0b20gb2YgdGhlIGV4aXN0aW5nIGNhcmQgV0lUSE9VVFxuICAgIC8vIHRvdWNoaW5nIHRoZSBUT1RQIGlucHV0IG1hcmt1cCBcdTIwMTQga2VlcHMgdG90cC1hdXRoLmpzJ3Mgc3VibWl0VG90cENvZGVcbiAgICAvLyBiaW5kaW5nIGludGFjdC5cbiAgICBsZXQgYWx0ID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcjYXV0aC1nYXRlLWVtYWlsLWFsdCcpO1xuICAgIGlmICghYWx0KSB7XG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpdi5pZCA9ICdhdXRoLWdhdGUtZW1haWwtYWx0JztcbiAgICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6IDE4cHg7IHBhZGRpbmctdG9wOiAxNHB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtOyc7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gYDxhIGhyZWY9XCIjXCIgaWQ9XCJhdXRoLWdhdGUtZW1haWwtYWx0LWxpbmtcIlxuICAgICAgICBzdHlsZT1cImNvbG9yOiB2YXIoLS1hY2NlbnQpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7XCI+XG4gICAgICAgIE9yIHNpZ24gaW4gd2l0aCBlbWFpbCBpbnN0ZWFkIFx1MjE5MlxuICAgICAgPC9hPmA7XG4gICAgICBjYXJkLmFwcGVuZENoaWxkKGRpdik7XG4gICAgICBkaXYucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1hbHQtbGluaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UoZW1haWxFbmFibGVkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfVxuXG4gIC8vIC0tLS0gVHJpZ2dlciBwb2ludHMgLS0tLVxuICAvLyAxLiBTU08gcmVkaXJlY3QgZnJvbSBDYWRkeTogP2F1dGg9cmVxdWlyZWRcbiAgLy8gICAgV2UgY2xhaW0gb3duZXJzaGlwIGhlcmUgKHNldCB3aW5kb3cuX19kY18wNDlfaGFuZGxlZCA9IHRydWUpXG4gIC8vICAgIEJFRk9SRSB0b3RwLWF1dGguanMncyBvd24gP2F1dGg9cmVxdWlyZWQgY2hlY2sgcnVucywgc28gdGhlIGxlZ2FjeVxuICAvLyAgICBUT1RQLW9ubHkgb3ZlcmxheSBkb2Vzbid0IGZsaWNrZXIgaW4gZm9yIG11bHRpLXByb3ZpZGVyIGluc3RhbGxzLlxuICAvLyAgICBTaW5nbGUtcHJvdmlkZXIgVE9UUC1vbmx5IGluc3RhbGxzIHdvcmsgYmVjYXVzZSB3ZSBzdGlsbCBkZWxlZ2F0ZVxuICAvLyAgICBiYWNrIHRvIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5KCkgaW4gYHNob3coKWAgYmVsb3cuXG4gIHdpbmRvdy5fX2RjXzA0OV9oYW5kbGVkID0gdHJ1ZTtcblxuICBmdW5jdGlvbiBpc0FsbG93ZWRSZXR1cm5VcmwocmV0dXJuVXJsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmV0dXJuVXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgIGlmICghWydodHRwOicsICdodHRwczonXS5pbmNsdWRlcyhwYXJzZWQucHJvdG9jb2wpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocGFyc2VkLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAocGFyc2VkLnByb3RvY29sICE9PSAnaHR0cHM6JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBnbG9iYWxzLmpzIGlzIGNvbmNhdGVuYXRlZCBiZWZvcmUgdGhpcyBtb2R1bGUgaW4gY29yZS5qcywgc28gU0lURSBpc1xuICAgICAgLy8gYXZhaWxhYmxlIGhlcmUuIFBlcm1pdCBleGFjdCBob3N0cyBhbmQgc3ViZG9tYWlucyB1bmRlciB0aGUgY29uZmlndXJlZFxuICAgICAgLy8gcHJpdmF0ZSBUTEQgKGZvciBleGFtcGxlIHBsZXguc2FtaSksIHdoaWxlIHJlamVjdGluZyBsb29rYWxpa2VzIHN1Y2ggYXNcbiAgICAgIC8vIHBsZXguc2FtaS5ldmlsLmV4YW1wbGUuXG4gICAgICBjb25zdCBzdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6IGAuJHtTSVRFLnRsZH1gO1xuICAgICAgcmV0dXJuIHBhcnNlZC5ob3N0bmFtZSA9PT0gc3VmZml4LnNsaWNlKDEpIHx8IHBhcnNlZC5ob3N0bmFtZS5lbmRzV2l0aChzdWZmaXgpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICBpZiAodXJsUGFyYW1zLmdldCgnYXV0aCcpID09PSAncmVxdWlyZWQnKSB7XG4gICAgLy8gUHJlc2VydmUgdGhlIGdhdGVkIHNlcnZpY2UgZGVzdGluYXRpb24gc28gc3VibWl0VG90cENvZGUoKSBjYW4gYXBwZW5kXG4gICAgLy8gdGhlIG9uZS10aW1lIFNTTyBoYW5kb2ZmIHRva2VuIGFuZCByZXR1cm4gdGhlIGJyb3dzZXIgdG8gdGhhdCBob3N0LlxuICAgIGNvbnN0IHJldHVyblVybCA9IHVybFBhcmFtcy5nZXQoJ3JldHVybicpO1xuICAgIGlmIChyZXR1cm5VcmwgJiYgaXNBbGxvd2VkUmV0dXJuVXJsKHJldHVyblVybCkpIHtcbiAgICAgIHRyeSB7IHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3RvdHBfcmVkaXJlY3QnLCByZXR1cm5VcmwpOyB9IGNhdGNoIChfKSB7fVxuICAgIH1cbiAgICAvLyBDbGVhbiBVUkwgXHUyMDE0IGhhcHBlbnMgYWZ0ZXIgd2UndmUgY2FwdHVyZWQgdGhlIHJlZGlyZWN0XG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCAnJywgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAvLyBTaG93IG9uIG5leHQgdGljayBzbyB0aGUgRE9NICh0aGUgLnRvdHAtY2FyZCkgaXMgcmVhZHlcbiAgICBzZXRUaW1lb3V0KHNob3csIDApO1xuICB9XG5cbiAgLy8gRXhwb3NlIGZvciBob3QtdHJpZ2dlciBmcm9tIG90aGVyIG1vZHVsZXMgKGUuZy4gbG9nb3V0KVxuICB3aW5kb3cuX3Nob3dBdXRoR2F0ZSA9IHNob3c7XG4gIHdpbmRvdy5fYXV0aEdhdGVNZXRob2RzID0gZmV0Y2hNZXRob2RzO1xufSkoKTtcbjtcbi8vID09PT09IFRPVFAgQVVUSEVOVElDQVRJT04gR0FURSA9PT09PVxuKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiB1cGRhdGVUb3RwTG9nbygpIHtcbiAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvdHAtY2FyZCcpO1xuICAgIGlmICghY2FyZCkgcmV0dXJuO1xuICAgIGNvbnN0IGJnID0gZ2V0Q29tcHV0ZWRTdHlsZShjYXJkKS5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgY29uc3QgbSA9IGJnLm1hdGNoKC9cXGQrL2cpO1xuICAgIGlmICghbSkgcmV0dXJuO1xuICAgIGNvbnN0IGx1bSA9ICgwLjI5OSAqICttWzBdICsgMC41ODcgKiArbVsxXSArIDAuMTE0ICogK21bMl0pIC8gMjU1O1xuICAgIGNvbnN0IGRhcmsgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWxvZ28tZGFyaycpO1xuICAgIGNvbnN0IGxpZ2h0ID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcudG90cC1sb2dvLWxpZ2h0Jyk7XG4gICAgaWYgKGRhcmspIGRhcmsuc3R5bGUuZGlzcGxheSA9IGx1bSA+IDAuNSA/ICdub25lJyA6ICcnO1xuICAgIGlmIChsaWdodCkgbGlnaHQuc3R5bGUuZGlzcGxheSA9IGx1bSA+IDAuNSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1RvdHBPdmVybGF5KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgICAgc2V0VGltZW91dCh1cGRhdGVUb3RwTG9nbywgNTApO1xuICAgICAgY29uc3QgZmlyc3RJbnB1dCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtZGlnaXRzIGlucHV0Jyk7XG4gICAgICBpZiAoZmlyc3RJbnB1dCkgc2V0VGltZW91dCgoKSA9PiBmaXJzdElucHV0LmZvY3VzKCksIDEwMCk7XG4gICAgfVxuICAgIC8vIFJlZnJlc2ggdGhlIFwiTG9zdCBhY2Nlc3M/XCIgcmVjb3ZlcnkgbGluayB2aXNpYmlsaXR5IGJhc2VkIG9uIHNlcnZlciBzdGF0ZS5cbiAgICAvLyBIaWRlcyBpdHNlbGYgaWYgVE9UUCBpcyBoZWFsdGh5OyBzaG93cyBpZiB1bnJlYWRhYmxlL2NvcnJ1cHQuIFRoZSB1c2VyXG4gICAgLy8gY2FuIHN0aWxsIGNsaWNrIGl0IGV2ZW4gd2hlbiBoZWFsdGh5IFx1MjAxNCBidXQgdGhlIHBhbmVsIHdpbGwgZXhwbGFpbiB0aGVyZSdzXG4gICAgLy8gbm8gcmVjb3ZlcnkgbmVlZGVkLiBDaGVhcGVyIHRoYW4gZ2F0aW5nIGl0LlxuICAgIGlmICh0eXBlb2Ygd2luZG93Ll9yZWZyZXNoUmVjb3ZlcnlMaW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3aW5kb3cuX3JlZnJlc2hSZWNvdmVyeUxpbmsoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlVG90cE92ZXJsYXkoKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAob3ZlcmxheSkgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFNzb0hhbmRvZmZUYXJnZXQocmVkaXJlY3QsIHRva2VuKSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChyZWRpcmVjdCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgaWYgKHBhcnNlZC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IHN1ZmZpeCA9IFNJVEUudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IFNJVEUudGxkIDogYC4ke1NJVEUudGxkfWA7XG4gICAgY29uc3QgaXNQcml2YXRlSG9zdCA9IHBhcnNlZC5ob3N0bmFtZSA9PT0gc3VmZml4LnNsaWNlKDEpIHx8IHBhcnNlZC5ob3N0bmFtZS5lbmRzV2l0aChzdWZmaXgpO1xuICAgIGlmIChwYXJzZWQucHJvdG9jb2wgIT09ICdodHRwczonIHx8ICFpc1ByaXZhdGVIb3N0KSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRva2VuKSByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCByZXR1cm5QYXRoID0gYCR7cGFyc2VkLnBhdGhuYW1lfSR7cGFyc2VkLnNlYXJjaH0ke3BhcnNlZC5oYXNofWA7XG4gICAgcGFyc2VkLnBhdGhuYW1lID0gJy9kYXNoY2FkZHktc3NvJztcbiAgICBwYXJzZWQuc2VhcmNoID0gJyc7XG4gICAgcGFyc2VkLmhhc2ggPSAnJztcbiAgICBwYXJzZWQuc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCB0b2tlbik7XG4gICAgcGFyc2VkLnNlYXJjaFBhcmFtcy5zZXQoJ3JldHVybicsIHJldHVyblBhdGgpO1xuICAgIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8vIFNldHVwIGRpZ2l0IGlucHV0IFVYXG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWRpZ2l0cycpO1xuICBpZiAoY29udGFpbmVyKSB7XG4gICAgY29uc3QgaW5wdXRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Jyk7XG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0LCBpZHgpID0+IHtcbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHtcbiAgICAgICAgY29uc3QgdmFsID0gZS50YXJnZXQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICAgICAgZS50YXJnZXQudmFsdWUgPSB2YWwuc2xpY2UoMCwgMSk7XG4gICAgICAgIGlmICh2YWwgJiYgaWR4IDwgaW5wdXRzLmxlbmd0aCAtIDEpIGlucHV0c1tpZHggKyAxXS5mb2N1cygpO1xuICAgICAgICBjb25zdCBjb2RlID0gQXJyYXkuZnJvbShpbnB1dHMpLm1hcChpID0+IGkudmFsdWUpLmpvaW4oJycpO1xuICAgICAgICBpZiAoY29kZS5sZW5ndGggPT09IDYpIHN1Ym1pdFRvdHBDb2RlKGNvZGUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnICYmICFlLnRhcmdldC52YWx1ZSAmJiBpZHggPiAwKSB7XG4gICAgICAgICAgaW5wdXRzW2lkeCAtIDFdLmZvY3VzKCk7XG4gICAgICAgICAgaW5wdXRzW2lkeCAtIDFdLnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgcGFzdGVkID0gKGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0JykgfHwgJycpLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICAgIGlmIChwYXN0ZWQubGVuZ3RoID49IDYpIHtcbiAgICAgICAgICBpbnB1dHMuZm9yRWFjaCgoaW5wLCBpKSA9PiB7IGlucC52YWx1ZSA9IHBhc3RlZFtpXSB8fCAnJzsgfSk7XG4gICAgICAgICAgaW5wdXRzWzVdLmZvY3VzKCk7XG4gICAgICAgICAgc3VibWl0VG90cENvZGUocGFzdGVkLnNsaWNlKDAsIDYpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdWJtaXRUb3RwQ29kZShjb2RlKSB7XG4gICAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWVycm9yJyk7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdWZXJpZnlpbmcuLi4nO1xuICAgIGVycm9yRWwuY2xhc3NOYW1lID0gJ3RvdHAtZXJyb3IgdmVyaWZ5aW5nJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL3ZlcmlmeScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvZGUgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAvLyBVcGRhdGUgY2FjaGVkIENTUkYgdG9rZW4gZnJvbSBUT1RQIHJlc3BvbnNlIChzZXJ2ZXIgcm90YXRlcyBpdCBvbiBsb2dpbilcbiAgICAgICAgaWYgKGRhdGEuY3NyZlRva2VuKSB7XG4gICAgICAgICAgY3NyZlRva2VuID0gZGF0YS5jc3JmVG9rZW47XG4gICAgICAgIH1cbiAgICAgICAgaGlkZVRvdHBPdmVybGF5KCk7XG4gICAgICAgIC8vIENoZWNrIGlmIHJlZGlyZWN0ZWQgaGVyZSBmcm9tIGFub3RoZXIgc2VydmljZVxuICAgICAgICBjb25zdCByZWRpcmVjdCA9IHNhZmVTZXNzaW9uR2V0KCd0b3RwX3JlZGlyZWN0Jyk7XG4gICAgICAgIGlmIChyZWRpcmVjdCkge1xuICAgICAgICAgIHRyeSB7IHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvdHBfcmVkaXJlY3QnKTsgfSBjYXRjaCAoXykge31cbiAgICAgICAgICAvLyAuc2FtaSBpcyBhbiB1bnJlZ2lzdGVyZWQgVExELCBzbyBicm93c2VycyBzaWxlbnRseSBkcm9wIHRoZVxuICAgICAgICAgIC8vIERvbWFpbj0uc2FtaSBzZXNzaW9uIGNvb2tpZSBvbiBhbnkgT1RIRVIgKi5zYW1pIHN1YmRvbWFpbiAodGhleVxuICAgICAgICAgIC8vIHRyZWF0IFwic2FtaVwiIGFzIHRoZSBlZmZlY3RpdmUgcHVibGljIHN1ZmZpeCwgc2FtZSBwcm90ZWN0aW9uXG4gICAgICAgICAgLy8gdGhhdCBibG9ja3MgYSBEb21haW49LmNvbSBzdXBlcmNvb2tpZSkuIFRoZSB0YXJnZXQgc2VydmljZSBjYW4ndFxuICAgICAgICAgIC8vIHNlZSBvdXIgc2Vzc2lvbiBjb29raWUgbm8gbWF0dGVyIGhvdyBpdCdzIGJ1aWx0LCBzbyBpbnN0ZWFkIHdlXG4gICAgICAgICAgLy8gaGFuZCBpdCBhIG9uZS10aW1lIHRva2VuIGluIHRoZSBVUkw7IGl0cyBsb2dpbiBwYWdlIGV4Y2hhbmdlc1xuICAgICAgICAgIC8vIHRoYXQgZm9yIGl0cyBvd24gaG9zdC1vbmx5IGNvb2tpZSB2aWEgL2F1dGgvc3NvLWV4Y2hhbmdlLlxuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGJ1aWxkU3NvSGFuZG9mZlRhcmdldChyZWRpcmVjdCwgZGF0YS5zc29Ub2tlbik7XG4gICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRhcmdldDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBkYXNoYm9hcmRcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVzdW1lIGxpdmUgdXBkYXRlcyBhZnRlciBtaWQtc2Vzc2lvbiByZS1hdXRoLiBUaGUgYXV0aC1sb3NzXG4gICAgICAgIC8vIGhhbmRsZXJzIGxhdGNoZWQgcG9sbGluZyArIFNTRSBvZmYgd2hlbiB0aGUgc2Vzc2lvbiBleHBpcmVkXG4gICAgICAgIC8vIChncmlkLmpzIHNldHMgX2RjQXV0aExvc3QsIGxpdmUtZXZlbnRzLmpzIGxhdGNoZXMgdGhlIHN0cmVhbVxuICAgICAgICAvLyBjbG9zZWQpOyBhIGZyZXNoIGxvZ2luIG11c3QgY2xlYXIgYm90aCBhbmQgcmVjb25uZWN0LCBvciB0aGVcbiAgICAgICAgLy8gZGFzaGJvYXJkIHN0YXlzIGZyb3plbiBvbiBzdGFsZSBkYXRhIHVudGlsIGEgbWFudWFsIEY1LlxuICAgICAgICB3aW5kb3cuX2RjQXV0aExvc3QgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuX3NzZVJlc3VtZSA9PT0gJ2Z1bmN0aW9uJykgd2luZG93Ll9zc2VSZXN1bWUoKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdy5fc3NlUmVjb25uZWN0ID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuX3NzZVJlY29ubmVjdCgpO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoQWxsID09PSAnZnVuY3Rpb24nKSB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgJ0ludmFsaWQgY29kZSc7XG4gICAgICAgIGVycm9yRWwuY2xhc3NOYW1lID0gJ3RvdHAtZXJyb3InO1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjdG90cC1kaWdpdHMgaW5wdXQnKTtcbiAgICAgICAgaW5wdXRzLmZvckVhY2goaSA9PiB7IGkudmFsdWUgPSAnJzsgfSk7XG4gICAgICAgIGlucHV0c1swXT8uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0Nvbm5lY3Rpb24gZXJyb3InO1xuICAgICAgZXJyb3JFbC5jbGFzc05hbWUgPSAndG90cC1lcnJvcic7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlID9hdXRoPXJlcXVpcmVkIHJlZGlyZWN0IGZyb20gQ2FkZHkgU1NPLlxuICAvLyBEQy0wNDk6IGlmIHRoZSBhdXRoLWdhdGUgbW9kdWxlIHdpbGwgaGFuZGxlIHRoaXMgKG11bHRpLXByb3ZpZGVyXG4gIC8vIGluc3RhbGxzKSwgc2tpcCBvdXIgVE9UUC1vbmx5IGJyYW5jaCBlbnRpcmVseS4gU2luZ2xlLXByb3ZpZGVyXG4gIC8vIFRPVFAtb25seSBpbnN0YWxscyBjb250aW51ZSB0byB1c2UgdGhpcyBwYXRoIGJlY2F1c2UgYXV0aC1nYXRlLmpzXG4gIC8vIGRlbGVnYXRlcyBiYWNrIHRvIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5KCkuXG4gIGNvbnN0IF9fZGNfMDQ5X3NraXAgPSAhISh3aW5kb3cuX19kY18wNDlfaGFuZGxlZCk7XG4gIGlmICghX19kY18wNDlfc2tpcCAmJiB1cmxQYXJhbXMuZ2V0KCdhdXRoJykgPT09ICdyZXF1aXJlZCcpIHtcbiAgICBjb25zdCByZXR1cm5VcmwgPSB1cmxQYXJhbXMuZ2V0KCdyZXR1cm4nKTtcbiAgICBpZiAocmV0dXJuVXJsKSB7XG4gICAgICAvLyBWYWxpZGF0ZSByZWRpcmVjdCBVUkw6IG11c3QgYmUgc2FtZS1vcmlnaW4gb3IgaG9zdG5hbWUgbXVzdCBlbmQgd2l0aCBvdXIgVExEXG4gICAgICAvLyAocHJldmVudHMgb3BlbiByZWRpcmVjdCB2aWEgaW5jbHVkZXMoKSBieXBhc3MgbGlrZSBldmlsLmNvbT9xPS5zYW1pKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChyZXR1cm5VcmwsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHBhcnNlZC5ob3N0bmFtZTtcbiAgICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gcGFyc2VkLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgICAgY29uc3QgdGxkU3VmZml4ID0gU0lURS50bGQuc3RhcnRzV2l0aCgnLicpID8gU0lURS50bGQgOiAnLicgKyBTSVRFLnRsZDtcbiAgICAgICAgY29uc3QgaXNPdXJUbGQgPSBob3N0bmFtZS5lbmRzV2l0aCh0bGRTdWZmaXgpIHx8IGhvc3RuYW1lID09PSB0bGRTdWZmaXguc3Vic3RyaW5nKDEpO1xuICAgICAgICBpZiAoaXNTYW1lT3JpZ2luIHx8IGlzT3VyVGxkKSB7XG4gICAgICAgICAgc2FmZVNlc3Npb25TZXQoJ3RvdHBfcmVkaXJlY3QnLCByZXR1cm5VcmwpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIC8vIEludmFsaWQgVVJMIFx1MjAxNCByZWplY3QgcmVkaXJlY3RcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2xlYW4gVVJMXG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCAnJywgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgfVxuXG4gIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5ID0gc2hvd1RvdHBPdmVybGF5O1xufSkoKTtcbjtcbi8vID09PT09IFRPVFAgUkVDT1ZFUlkgRkxPVyA9PT09PVxuLy8gUHVibGljLCB1bmF1dGhlbnRpY2F0ZWQgcmVjb3ZlcnkgcGF0aCBmb3IgdXNlcnMgd2hvIGNhbid0IGxvZyBpbi5cbi8vIERlc2lnbmVkIGZvciB0aGUgXCJlbmNyeXB0aW9uIGtleSByb3RhdGVkIGFuZCBsb3N0IG15IGF1dGhlbnRpY2F0b3JcIiBjYXNlLlxuLy8gVGhlIGZsb3cgaXM6XG4vL1xuLy8gIDEuIE9uIFRPVFAgb3ZlcmxheSBzaG93LCBjYWxsIC9hcGkvdjEvdG90cC9yZWNvdmVyeS1pbmZvIChwdWJsaWMpLlxuLy8gICAgIElmIHN0YXR1cyA9PT0gJ3VucmVhZGFibGUnLCBzaG93IHRoZSBcIkxvc3QgYWNjZXNzP1wiIGxpbmsgb24gdGhlIG92ZXJsYXkuXG4vLyAgMi4gVXNlciBjbGlja3MgbGluayBcdTIxOTIgb3BlbnMgcmVjb3ZlcnkgcGFuZWwuXG4vLyAgMy4gVXNlciBwYXN0ZXMgQmFzZTMyIHNlY3JldCBcdTIxOTIgUE9TVCAvYXBpL3YxL3RvdHAvc2V0dXAgd2l0aCB7c2VjcmV0OiAuLi59LlxuLy8gICAgIEJhY2tlbmQgc3RvcmVzIGFzIHRvdHAucGVuZGluZ19zZWNyZXQgKGVuY3J5cHRlZCB3aXRoIGN1cnJlbnQga2V5KS5cbi8vICA0LiBQYW5lbCBzd2l0Y2hlcyB0byBcInZlcmlmeVwiIG1vZGUuIFVzZXIgZW50ZXJzIGEgY29kZSBmcm9tIHRoZVxuLy8gICAgIG5ld2x5LWFkZGVkIGF1dGhlbnRpY2F0b3IgZW50cnkuIFBPU1QgL2FwaS92MS90b3RwL3ZlcmlmeS1zZXR1cFxuLy8gICAgIHByb21vdGVzIHBlbmRpbmcgXHUyMTkyIGFjdGl2ZSBhbmQgc3RhcnRzIGEgc2Vzc2lvbi5cbi8vICA1LiBoaWRlVG90cE92ZXJsYXkoKSBhbmQgaW5pdGlhbGl6ZURhc2hib2FyZCgpIFx1MjAxNCBzYW1lIGFzIG5vcm1hbCBsb2dpbi5cbi8vXG4vLyBUaGUgcmVjb3ZlcnkgZmxvdyBuZXZlciByZXF1aXJlcyB0aGUgdXNlciB0byBiZSBsb2dnZWQgaW4uIEl0IGRvZXMgcmVxdWlyZVxuLy8gdGhlbSB0byBoYXZlIHRoZWlyIEJhc2UzMiBzZWNyZXQgc2F2ZWQgKGUuZy4gcGFzc3dvcmQgbWFuYWdlciwgc2NyZWVuc2hvdCxcbi8vIHRoZSBcIkRvd25sb2FkIGJhY2t1cCBmaWxlXCIgd2Ugb2ZmZXIgYXQgc2V0dXAgdGltZSBcdTIwMTQgc2VlIHRvdHAtc2V0dGluZ3MuanMpLlxuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBcdTI1MDBcdTI1MDAgSGVscGVycyBcdTI1MDBcdTI1MDBcbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWNvdmVyeUluZm8oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL3JlY292ZXJ5LWluZm8nLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgcmV0dXJuIGF3YWl0IHIuanNvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBzdGF0dXM6ICd1bmtub3duJywgaGludDogJ0NvdWxkIG5vdCBjb250YWN0IHNlcnZlcicgfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG93UmVjb3ZlcnlMaW5rKHNob3cpIHtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktbGluaycpO1xuICAgIGlmIChsaW5rKSBsaW5rLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuUmVjb3ZlcnlQYW5lbCgpIHtcbiAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXBhbmVsJyk7XG4gICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zdGF0dXMnKTtcbiAgICBjb25zdCBpbXBvcnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWltcG9ydCcpO1xuICAgIGNvbnN0IHZlcmlmeUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktdmVyaWZ5Jyk7XG4gICAgaWYgKGltcG9ydEVsKSBpbXBvcnRFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgaWYgKHZlcmlmeUVsKSB2ZXJpZnlFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktZXJyb3InKS50ZXh0Q29udGVudCA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvbmZpcm0tZXJyb3InKS50ZXh0Q29udGVudCA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXNlY3JldCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpLnZhbHVlID0gJyc7XG4gICAgLy8gU2hvdyBjdXJyZW50IHN0YXR1c1xuICAgIGZldGNoUmVjb3ZlcnlJbmZvKCkudGhlbihpbmZvID0+IHtcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gaW5mby5oaW50IHx8ICcnO1xuICAgICAgLy8gQ29sb3ItY29kZSB0aGUgc3RhdHVzIGJhbm5lclxuICAgICAgaWYgKGluZm8uc3RhdHVzID09PSAnaGVhbHRoeScpIHtcbiAgICAgICAgc3RhdHVzRWwuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tb2stZmcsICM3ZWYyZmYpJztcbiAgICAgIH0gZWxzZSBpZiAoaW5mby5zdGF0dXMgPT09ICd1bnJlYWRhYmxlJykge1xuICAgICAgICBzdGF0dXNFbC5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1iYWQtZmcsICNmZjlhYTMpJztcbiAgICAgICAgc3RhdHVzRWwuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYmFkLWZnKSA2JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIH0gZWxzZSBpZiAoaW5mby5zdGF0dXMgPT09ICdub3RfY29uZmlndXJlZCcpIHtcbiAgICAgICAgc3RhdHVzRWwuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLWJvcmRlciknO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc2VjcmV0Jyk/LmZvY3VzKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlUmVjb3ZlcnlQYW5lbCgpIHtcbiAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXBhbmVsJyk7XG4gICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3VibWl0UmVjb3ZlcnlTZWNyZXQoKSB7XG4gICAgY29uc3Qgc2VjcmV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc2VjcmV0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1lcnJvcicpO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmICghc2VjcmV0KSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ1Bhc3RlIHlvdXIgQmFzZTMyIGtleSBmaXJzdCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghL15bQS1aYS16Mi03XFxzXSs9KiQvLnRlc3Qoc2VjcmV0KSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdJbnZhbGlkIEJhc2UzMiBmb3JtYXQgXHUyMDE0IHNob3VsZCBiZSBsZXR0ZXJzIEEtWiBhbmQgZGlnaXRzIDItNyBvbmx5JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQT1NUIC9hcGkvdjEvdG90cC9zZXR1cCB3aXRoIHtzZWNyZXR9IFx1MjAxNCBiYWNrZW5kIHN0b3JlcyBhcyBwZW5kaW5nXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL3NldHVwJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VjcmV0IH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgIGlmICghci5vayB8fCAhZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8IGRhdGEubWVzc2FnZSB8fCAnUmVzdG9yZSBmYWlsZWQnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTd2l0Y2ggcGFuZWwgdG8gdmVyaWZ5IG1vZGVcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWltcG9ydCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS12ZXJpZnknKS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKT8uZm9jdXMoKSwgMTAwKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ05ldHdvcmsgZXJyb3IgXHUyMDE0IHRyeSBhZ2Fpbic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3VibWl0UmVjb3ZlcnlDb2RlKCkge1xuICAgIGNvbnN0IGNvZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb25maXJtLWVycm9yJyk7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKCEvXlxcZHs2fSQvLnRlc3QoY29kZSkpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnRW50ZXIgYSA2LWRpZ2l0IGNvZGUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFBPU1QgL2FwaS92MS90b3RwL3ZlcmlmeS1zZXR1cCBcdTIwMTQgcHJvbW90ZXMgcGVuZGluZyBcdTIxOTIgYWN0aXZlICsgc3RhcnRzIHNlc3Npb25cbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvdmVyaWZ5LXNldHVwJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY29kZSB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgci5qc29uKCk7XG4gICAgICBpZiAoIXIub2sgfHwgIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCBkYXRhLm1lc3NhZ2UgfHwgJ0ludmFsaWQgY29kZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKS52YWx1ZSA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJyk/LmZvY3VzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFN1Y2Nlc3MgXHUyMDE0IGhpZGUgZXZlcnl0aGluZyBhbmQgaW5pdGlhbGl6ZSBkYXNoYm9hcmRcbiAgICAgIGNsb3NlUmVjb3ZlcnlQYW5lbCgpO1xuICAgICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICAgIGlmIChvdmVybGF5KSBvdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93LmluaXRpYWxpemVEYXNoYm9hcmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2luZG93LmluaXRpYWxpemVEYXNoYm9hcmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ05ldHdvcmsgZXJyb3IgXHUyMDE0IHRyeSBhZ2Fpbic7XG4gICAgfVxuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFdpcmUgdXAgaGFuZGxlcnMgXHUyNTAwXHUyNTAwXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNob3ctcmVjb3ZlcnknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBvcGVuUmVjb3ZlcnlQYW5lbCgpO1xuICB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY2xvc2UnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZVJlY292ZXJ5UGFuZWwpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zdWJtaXQnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdWJtaXRSZWNvdmVyeVNlY3JldCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvbmZpcm0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdWJtaXRSZWNvdmVyeUNvZGUpO1xuXG4gIC8vIEVudGVyIGtleSBzdWJtaXRzIGluIHNlY3JldCBmaWVsZFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zZWNyZXQnKT8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7IGUucHJldmVudERlZmF1bHQoKTsgc3VibWl0UmVjb3ZlcnlTZWNyZXQoKTsgfVxuICB9KTtcbiAgLy8gRW50ZXIga2V5IHN1Ym1pdHMgaW4gY29kZSBmaWVsZFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN1Ym1pdFJlY292ZXJ5Q29kZSgpOyB9XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBQdWJsaWMgQVBJIFx1MjUwMFx1MjUwMFxuICAvLyBDYWxsZWQgYnkgdG90cC1hdXRoLmpzIGFmdGVyIHNob3dpbmcgdGhlIG92ZXJsYXksIHNvIHdlIGNhbiBkZWNpZGUgd2hldGhlclxuICAvLyB0byBzaG93IHRoZSByZWNvdmVyeSBsaW5rLiBXZSBkbyB0aGlzIHdpdGggYSBwdWJsaWMgZW5kcG9pbnQgdGhhdCBkb2Vzbid0XG4gIC8vIHJlcXVpcmUgYXV0aCBcdTIwMTQgcGVyZmVjdCBmb3IgdGhlIGxvY2tlZC1vdXQgc3RhdGUuXG4gIHdpbmRvdy5fcmVmcmVzaFJlY292ZXJ5TGluayA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCBmZXRjaFJlY292ZXJ5SW5mbygpO1xuICAgIC8vIFNob3cgdGhlIGxpbmsgaW4gYW55IG5vbi1oZWFsdGh5IHN0YXRlICh1bnJlYWRhYmxlIC8gY29ycnVwdCAvIHVua25vd24pLlxuICAgIC8vIFRoZSBoaW50IGluc2lkZSB0aGUgcGFuZWwgdGVsbHMgdGhlIHVzZXIgd2hhdCB0aGUgYWN0dWFsIGlzc3VlIGlzLlxuICAgIGlmIChpbmZvICYmIGluZm8uc3VjY2VzcyAmJiBpbmZvLnN0YXR1cyAmJiBpbmZvLnN0YXR1cyAhPT0gJ2hlYWx0aHknKSB7XG4gICAgICBzaG93UmVjb3ZlcnlMaW5rKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93UmVjb3ZlcnlMaW5rKGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH07XG59KSgpO1xuO1xuLy8gPT09PT0gU0VSVklDRSBDUkVERU5USUFMUyA9PT09PVxuKGZ1bmN0aW9uKCkge1xuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG4gIGluamVjdE1vZGFsKCdmb2xkZXItYnJvd3Nlci1tb2RhbCcsIGA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDUwMHB4OyBtYXgtd2lkdGg6IDcwMHB4OyBtYXgtaGVpZ2h0OiA4MHZoO1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDMiBCcm93c2UgZm9yIE1lZGlhIEZvbGRlcnM8L2gzPlxuXG4gICAgICA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItcGF0aFwiIHN0eWxlPVwicGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlci1yYWRpdXM6IDZweDsgbWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjlyZW07IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcIj5cbiAgICAgICAgL1xuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJmb2xkZXItYnJvd3Nlci1saXN0XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDsgb3ZlcmZsb3cteTogYXV0bzsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxvYWRpbmcuLi48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItc2VsZWN0ZWRcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAxMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tc3VjY2Vzcyk7IGJvcmRlci1yYWRpdXM6IDZweDsgZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+U2VsZWN0ZWQgZm9sZGVyczo8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImZvbGRlci1icm93c2VyLXNlbGVjdGVkLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA2cHg7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImZvbGRlci1icm93c2VyLXNlbGVjdC1jdXJyZW50XCIgY2xhc3M9XCJidG4tYWNjZW50XCI+XG4gICAgICAgICAgKyBBZGQgQ3VycmVudCBGb2xkZXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy1nYXBcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZm9sZGVyLWJyb3dzZXItY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImZvbGRlci1icm93c2VyLWRvbmVcIiBzdHlsZT1cImJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1zdWNjZXNzKTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpO1wiPkRvbmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgaW5qZWN0TW9kYWwoJ3NlcnZpY2UtY3JlZHMtbW9kYWwnLCBgPGRpdiBpZD1cInNlcnZpY2UtY3JlZHMtbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jcmVkcy1jb250ZW50XCI+XG4gICAgICA8aDMgaWQ9XCJzdmMtY3JlZHMtdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjogMCAwIDRweDsgZm9udC1zaXplOiAxLjA1cmVtO1wiPlNlcnZpY2UgQ3JlZGVudGlhbHM8L2gzPlxuICAgICAgPHAgaWQ9XCJzdmMtY3JlZHMtZGVzY1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNHB4O1wiPkNyZWRlbnRpYWxzIGFyZSBpbmplY3RlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYWNjZXNzaW5nIHRoaXMgc2VydmljZS48L3A+XG5cbiAgICAgIDwhLS0gU3RhdHVzIGluZGljYXRvciAtLT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJzdmMtY3JlZHMtZG90XCIgY2xhc3M9XCJzdGF0dXMtZG90XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBpZD1cInN2Yy1jcmVkcy1zdGF0dXNcIiBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5ObyBjcmVkZW50aWFscyBzdG9yZWQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZWVkaG9zdCBjcmVkZW50aWFscyAoc2hvd24gZm9yIGV4dGVybmFsIHNlcnZpY2VzKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdmMtY3JlZHMtc2VlZGhvc3RcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLWJvbGRcIj5TZWVkaG9zdCBMb2dpbjwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwiaGludC1taWNyb1wiPlVzZXJuYW1lIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcnZpY2VzLiBQYXNzd29yZCBpcyBwZXItc2VydmljZS48L3A+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3ZjLXNlZWRob3N0LXVzZXJcIiBwbGFjZWhvbGRlcj1cIlVzZXJuYW1lIChzaGFyZWQpXCIgYXV0b2NvbXBsZXRlPVwidXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEwcHg7IG1hcmdpbi1ib3R0b206IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJzdmMtc2VlZGhvc3QtcGFzc1wiIHBsYWNlaG9sZGVyPVwiUGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJjdXJyZW50LXBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtY3JlZHNcIiAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQVBJIEtleSAoc2hvd24gZm9yIGFyciBzZXJ2aWNlcyBvciBzZXJ2aWNlcyB3aXRoIEFQSSBrZXkgc3VwcG9ydCkgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLWFwaWtleVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtYm9sZFwiPkFQSSBLZXk8L2xhYmVsPlxuICAgICAgICA8cCBjbGFzcz1cImhpbnQtbWljcm9cIj5CeXBhc3NlcyB0aGUgYXBwJ3Mgb3duIGxvZ2luIHNjcmVlbjwvcD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzdmMtYXBpa2V5LWlucHV0XCIgcGxhY2Vob2xkZXI9XCJBUEkga2V5XCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBRdWFsaXR5IFByb2ZpbGUgKHNob3duIGZvciByYWRhcnIvc29uYXJyIG9ubHkpIC0tPlxuICAgICAgPGRpdiBpZD1cInN2Yy1jcmVkcy1xdWFsaXR5XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1ib2xkXCI+UXVhbGl0eSBQcm9maWxlPC9sYWJlbD5cbiAgICAgICAgPHAgY2xhc3M9XCJoaW50LW1pY3JvXCI+VXNlZCB3aGVuIHJlcXVlc3RpbmcgdmlhIFNlZXJyPC9wPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInN2Yy1xdWFsaXR5LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEVudGVyIEFQSSBrZXkgZmlyc3QgLS08L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic3ZjLXF1YWxpdHktZmV0Y2hcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDEycHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY3Vyc29yOiBwb2ludGVyOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgRmV0Y2hcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzdmMtcXVhbGl0eS1zdGF0dXNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgbWFyZ2luLXRvcDogNHB4OyBtaW4taGVpZ2h0OiAxZW07XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQZXItc2VydmljZSBCYXNpYyBBdXRoIChzaG93biBmb3Igbm9uLWV4dGVybmFsIHNlcnZpY2VzKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdmMtY3JlZHMtYmFzaWNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLWJvbGRcIj5TZXJ2aWNlIExvZ2luPC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzdmMtYmFzaWMtdXNlclwiIHBsYWNlaG9sZGVyPVwiVXNlcm5hbWVcIiBhdXRvY29tcGxldGU9XCJ1c2VybmFtZVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTBweDsgbWFyZ2luLXRvcDogNnB4OyBtYXJnaW4tYm90dG9tOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIgLz5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwic3ZjLWJhc2ljLXBhc3NcIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwiY3VycmVudC1wYXNzd29yZFwiXG4gICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWNyZWRzXCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVycm9yIG1lc3NhZ2UgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLWVycm9yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA4cHggMTBweDsgbWFyZ2luLWJvdHRvbTogMTBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWVycm9yLCAjYzYyODI4KSAxMiUsIHRyYW5zcGFyZW50KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZXJyb3IsICNjNjI4MjgpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPjwvZGl2PlxuXG4gICAgICA8IS0tIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi10b3A6IDE0cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdmMtY3JlZHMtc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogOXB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgU2F2ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInN2Yy1jcmVkcy1jbGVhclwiIHN0eWxlPVwicGFkZGluZzogOXB4IDE0cHg7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44NXJlbTsgZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICBDbGVhclxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInN2Yy1jcmVkcy1jbG9zZVwiIHN0eWxlPVwicGFkZGluZzogOXB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgQ2FuY2VsXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtY3JlZHMtbW9kYWwnKTtcbiAgbGV0IGN1cnJlbnRTZXJ2aWNlID0gbnVsbDtcbiAgY29uc3QgYXJyU2VydmljZXMgPSBbJ3NvbmFycicsICdyYWRhcnInLCAncHJvd2xhcnInLCAnb3ZlcnNlZXJyJ107XG4gIGNvbnN0IHF1YWxpdHlQcm9maWxlU2VydmljZXMgPSBbJ3NvbmFycicsICdyYWRhcnInXTtcblxuICBmdW5jdGlvbiBnZXRTZXJ2aWNlVXJsKHNlcnZpY2UpIHtcbiAgICByZXR1cm4gc2VydmljZS5leHRlcm5hbFVybCB8fCBzZXJ2aWNlLnVybCB8fCAnJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dFcnJvcihtc2cpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtZXJyb3InKTtcbiAgICBlbC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlRXJyb3IoKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWVycm9yJyk7XG4gICAgZWwudGV4dENvbnRlbnQgPSAnJztcbiAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgd2luZG93Lm9wZW5TZXJ2aWNlQ3JlZHNNb2RhbCA9IGFzeW5jIGZ1bmN0aW9uKHNlcnZpY2UpIHtcbiAgICBjdXJyZW50U2VydmljZSA9IHNlcnZpY2U7XG4gICAgaGlkZUVycm9yKCk7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXRpdGxlJyk7XG4gICAgY29uc3QgZGVzYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtZGVzYycpO1xuICAgIGNvbnN0IHNlZWRob3N0U2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc2VlZGhvc3QnKTtcbiAgICBjb25zdCBhcGlrZXlTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1hcGlrZXknKTtcbiAgICBjb25zdCBiYXNpY1NlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWJhc2ljJyk7XG4gICAgY29uc3QgcXVhbGl0eVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXF1YWxpdHknKTtcblxuICAgIHRpdGxlLnRleHRDb250ZW50ID0gc2VydmljZS5uYW1lICsgJyBDcmVkZW50aWFscyc7XG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHNlY3Rpb25zIHRvIHNob3dcbiAgICBjb25zdCBpc0V4dCA9ICEhc2VydmljZS5pc0V4dGVybmFsO1xuICAgIGNvbnN0IGlzQXJyID0gYXJyU2VydmljZXMuaW5jbHVkZXMoc2VydmljZS5pZCkgfHwgYXJyU2VydmljZXMuaW5jbHVkZXMoc2VydmljZS5hcHBUZW1wbGF0ZSk7XG4gICAgY29uc3QgaGFzUXVhbGl0eSA9IHF1YWxpdHlQcm9maWxlU2VydmljZXMuaW5jbHVkZXMoc2VydmljZS5pZCkgfHwgcXVhbGl0eVByb2ZpbGVTZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlLmFwcFRlbXBsYXRlKTtcblxuICAgIHNlZWRob3N0U2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gaXNFeHQgPyAnJyA6ICdub25lJztcbiAgICBhcGlrZXlTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBpc0FyciA/ICcnIDogJ25vbmUnO1xuICAgIHF1YWxpdHlTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBoYXNRdWFsaXR5ID8gJycgOiAnbm9uZSc7XG4gICAgYmFzaWNTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAhaXNFeHQgPyAnJyA6ICdub25lJztcblxuICAgIC8vIFJlc2V0IHF1YWxpdHkgZHJvcGRvd25cbiAgICBjb25zdCBxdWFsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXNlbGVjdCcpO1xuICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBFbnRlciBBUEkga2V5IGZpcnN0IC0tPC9vcHRpb24+JztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc3RhdHVzJykudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmIChpc0V4dCkge1xuICAgICAgZGVzYy50ZXh0Q29udGVudCA9ICdTZWVkaG9zdCBjcmVkZW50aWFscyBhdXRvLWxvZ2luIHBhc3QgdGhlIEhUVFAgcHJvbXB0LiBBUEkga2V5IGJ5cGFzc2VzIHRoZSBhcHAgbG9naW4uJztcbiAgICAgIC8vIFVwZGF0ZSBwYXNzd29yZCBwbGFjZWhvbGRlciB3aXRoIHNlcnZpY2UgbmFtZVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC1wYXNzJykucGxhY2Vob2xkZXIgPSBgUGFzc3dvcmQgZm9yICR7c2VydmljZS5uYW1lfWA7XG4gICAgfSBlbHNlIGlmIChpc0Fycikge1xuICAgICAgZGVzYy50ZXh0Q29udGVudCA9ICdBUEkga2V5IGJ5cGFzc2VzIHRoZSBhcHAgbG9naW4gc2NyZWVuIGF1dG9tYXRpY2FsbHkuJztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzYy50ZXh0Q29udGVudCA9ICdDcmVkZW50aWFscyBhcmUgaW5qZWN0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFjY2Vzc2luZyB0aGlzIHNlcnZpY2UuJztcbiAgICB9XG5cbiAgICAvLyBMb2FkIGV4aXN0aW5nIGNyZWRlbnRpYWxzXG4gICAgYXdhaXQgbG9hZFNlcnZpY2VDcmVkcyhzZXJ2aWNlKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH07XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFNlcnZpY2VDcmVkcyhzZXJ2aWNlKSB7XG4gICAgY29uc3QgZG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1kb3QnKTtcbiAgICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXN0YXR1cycpO1xuICAgIGNvbnN0IGNsZWFyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1jbGVhcicpO1xuICAgIGxldCBoYXNDcmVkcyA9IGZhbHNlO1xuXG4gICAgLy8gTG9hZCBzZWVkaG9zdCBjcmVkcyAoc2hhcmVkIHVzZXJuYW1lICsgcGVyLXNlcnZpY2UgcGFzc3dvcmQpXG4gICAgaWYgKHNlcnZpY2UuaXNFeHRlcm5hbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VlZGhvc3QtY3JlZHM/c2VydmljZUlkPSR7c2VydmljZS5pZH1gKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXVzZXInKS52YWx1ZSA9IGRhdGEudXNlcm5hbWUgfHwgJyc7XG4gICAgICAgICAgaWYgKGRhdGEuaGFzQ3JlZGVudGlhbHMpIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXVzZXInKS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXBhc3MnKS52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIC8vIExvYWQgcGVyLXNlcnZpY2UgY3JlZHNcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHtzZXJ2aWNlLmlkfS9jcmVkZW50aWFsc2ApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGlmIChkYXRhLmhhc0FwaUtleSkge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYXBpa2V5LWlucHV0JykudmFsdWUgPSAnXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyJztcbiAgICAgICAgICBoYXNDcmVkcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1hcGlrZXktaW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmhhc0Jhc2ljQXV0aCAmJiAhc2VydmljZS5pc0V4dGVybmFsKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy11c2VyJykudmFsdWUgPSBkYXRhLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgICAgIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXVzZXInKS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXBhc3MnKSkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy1wYXNzJykudmFsdWUgPSAnJztcblxuICAgIC8vIExvYWQgcXVhbGl0eSBwcm9maWxlIGZvciBhcnIgc2VydmljZXNcbiAgICBjb25zdCBzdmNJZCA9IHNlcnZpY2UuaWQgfHwgc2VydmljZS5hcHBUZW1wbGF0ZTtcbiAgICBpZiAocXVhbGl0eVByb2ZpbGVTZXJ2aWNlcy5pbmNsdWRlcyhzdmNJZCkpIHtcbiAgICAgIGF3YWl0IGxvYWRRdWFsaXR5UHJvZmlsZXMoc2VydmljZSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0NyZWRzKSB7XG4gICAgICBkb3Quc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1vay1mZywgIzc0ZGZjNCknO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnLCAjNzRkZmM0KSc7XG4gICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnQ3JlZGVudGlhbHMgc3RvcmVkJztcbiAgICAgIGNsZWFyQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIC8vIFVwZGF0ZSB0aGUgY2FyZCBidXR0b25cbiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBjcmVkcy1idG4tJHtzZXJ2aWNlLmlkfWApO1xuICAgICAgaWYgKGJ0bikgYnRuLmNsYXNzTGlzdC5hZGQoJ2hhcy1jcmVkcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb3Quc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnTm8gY3JlZGVudGlhbHMgc3RvcmVkJztcbiAgICAgIGNsZWFyQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgLy8gRmV0Y2ggYW5kIHBvcHVsYXRlIHF1YWxpdHkgcHJvZmlsZXMgZHJvcGRvd25cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFF1YWxpdHlQcm9maWxlcyhzZXJ2aWNlKSB7XG4gICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICBjb25zdCBxdWFsU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXN0YXR1cycpO1xuICAgIGNvbnN0IHN2Y0lkID0gc2VydmljZS5pZCB8fCBzZXJ2aWNlLmFwcFRlbXBsYXRlO1xuICAgIGNvbnN0IHN2Y1VybCA9IGdldFNlcnZpY2VVcmwoc2VydmljZSk7XG5cbiAgICBpZiAoIXN2Y1VybCkge1xuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIE5vIHNlcnZpY2UgVVJMIC0tPC9vcHRpb24+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+TG9hZGluZy4uLjwvb3B0aW9uPic7XG4gICAgcXVhbFN0YXR1cy50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBzZXJ2aWNlOiBzdmNJZCwgdXJsOiBzdmNVcmwgfSk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcnIvcXVhbGl0eS1wcm9maWxlcz8ke3BhcmFtc31gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5wcm9maWxlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBObyBwcm9maWxlcyBmb3VuZCAoZW50ZXIgQVBJIGtleSBhbmQgY2xpY2sgRmV0Y2gpIC0tPC9vcHRpb24+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgICAgZm9yIChjb25zdCBwIG9mIGRhdGEucHJvZmlsZXMpIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgIG9wdC52YWx1ZSA9IHAuaWQ7XG4gICAgICAgIG9wdC50ZXh0Q29udGVudCA9IHAubmFtZTtcbiAgICAgICAgcXVhbFNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmUtc2VsZWN0IHN0b3JlZCBwcm9maWxlIG9yIGJlc3QgbWF0Y2ggZm9yIFwiNzIwXCJcbiAgICAgIGlmIChkYXRhLnN0b3JlZFByb2ZpbGVJZCkge1xuICAgICAgICBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKGRhdGEuc3RvcmVkUHJvZmlsZUlkKTtcbiAgICAgIH1cbiAgICAgIGlmICghcXVhbFNlbGVjdC52YWx1ZSkge1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIDcyMHAtaXNoIHByb2ZpbGVcbiAgICAgICAgY29uc3QgbWF0Y2g3MjAgPSBkYXRhLnByb2ZpbGVzLmZpbmQocCA9PiAvNzIwL2kudGVzdChwLm5hbWUpKTtcbiAgICAgICAgaWYgKG1hdGNoNzIwKSBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKG1hdGNoNzIwLmlkKTtcbiAgICAgIH1cbiAgICAgIGlmICghcXVhbFNlbGVjdC52YWx1ZSAmJiBkYXRhLnByb2ZpbGVzLmxlbmd0aCkge1xuICAgICAgICBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKGRhdGEucHJvZmlsZXNbMF0uaWQpO1xuICAgICAgfVxuXG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1vay1mZyk7XCI+JHtkYXRhLnByb2ZpbGVzLmxlbmd0aH0gcHJvZmlsZXMgbG9hZGVkPC9zcGFuPmA7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEZhaWxlZCB0byBsb2FkIC0tPC9vcHRpb24+JztcbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj5FcnJvcjogJHtlLm1lc3NhZ2V9PC9zcGFuPmA7XG4gICAgfVxuICB9XG5cbiAgLy8gRmV0Y2ggYnV0dG9uIGZvciBxdWFsaXR5IHByb2ZpbGVzXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1mZXRjaCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlKSByZXR1cm47XG4gICAgY29uc3Qgc3ZjSWQgPSBjdXJyZW50U2VydmljZS5pZCB8fCBjdXJyZW50U2VydmljZS5hcHBUZW1wbGF0ZTtcbiAgICBjb25zdCBzdmNVcmwgPSBnZXRTZXJ2aWNlVXJsKGN1cnJlbnRTZXJ2aWNlKTtcbiAgICBjb25zdCBhcGlLZXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYXBpa2V5LWlucHV0Jyk7XG4gICAgY29uc3QgYXBpS2V5ID0gYXBpS2V5SW5wdXQ/LnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBxdWFsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXNlbGVjdCcpO1xuICAgIGNvbnN0IHF1YWxTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc3RhdHVzJyk7XG5cbiAgICBpZiAoIXN2Y1VybCkge1xuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPk5vIHNlcnZpY2UgVVJMIGF2YWlsYWJsZTwvc3Bhbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWFwaUtleSB8fCBhcGlLZXkgPT09ICdcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjInKSB7XG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+RW50ZXIgYW4gQVBJIGtleSBmaXJzdDwvc3Bhbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5GZXRjaGluZy4uLjwvb3B0aW9uPic7XG4gICAgcXVhbFN0YXR1cy50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBzZXJ2aWNlOiBzdmNJZCwgdXJsOiBzdmNVcmwsIGFwaUtleSB9KTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2Fyci9xdWFsaXR5LXByb2ZpbGVzPyR7cGFyYW1zfWApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBFcnJvciAtLTwvb3B0aW9uPic7XG4gICAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj4ke2RhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBwcm9maWxlcyd9PC9zcGFuPmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkYXRhLnByb2ZpbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIE5vIHByb2ZpbGVzIGZvdW5kIC0tPC9vcHRpb24+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgICAgZm9yIChjb25zdCBwIG9mIGRhdGEucHJvZmlsZXMpIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgIG9wdC52YWx1ZSA9IHAuaWQ7XG4gICAgICAgIG9wdC50ZXh0Q29udGVudCA9IHAubmFtZTtcbiAgICAgICAgcXVhbFNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmUtc2VsZWN0IDcyMHAgbWF0Y2hcbiAgICAgIGNvbnN0IG1hdGNoNzIwID0gZGF0YS5wcm9maWxlcy5maW5kKHAgPT4gLzcyMC9pLnRlc3QocC5uYW1lKSk7XG4gICAgICBpZiAobWF0Y2g3MjApIHF1YWxTZWxlY3QudmFsdWUgPSBTdHJpbmcobWF0Y2g3MjAuaWQpO1xuICAgICAgZWxzZSBpZiAoZGF0YS5wcm9maWxlcy5sZW5ndGgpIHF1YWxTZWxlY3QudmFsdWUgPSBTdHJpbmcoZGF0YS5wcm9maWxlc1swXS5pZCk7XG5cbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW9rLWZnKTtcIj4ke2RhdGEucHJvZmlsZXMubGVuZ3RofSBwcm9maWxlcyBsb2FkZWQ8L3NwYW4+YDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gRXJyb3IgLS08L29wdGlvbj4nO1xuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPiR7ZS5tZXNzYWdlfTwvc3Bhbj5gO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gU2F2ZSBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY3VycmVudFNlcnZpY2UpIHJldHVybjtcbiAgICBjb25zdCBzYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1zYXZlJyk7XG4gICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgIHNhdmVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGhpZGVFcnJvcigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzQXJyID0gYXJyU2VydmljZXMuaW5jbHVkZXMoY3VycmVudFNlcnZpY2UuaWQpIHx8IGFyclNlcnZpY2VzLmluY2x1ZGVzKGN1cnJlbnRTZXJ2aWNlLmFwcFRlbXBsYXRlKTtcbiAgICAgIGNvbnN0IHN2Y0lkID0gY3VycmVudFNlcnZpY2UuaWQgfHwgY3VycmVudFNlcnZpY2UuYXBwVGVtcGxhdGU7XG5cbiAgICAgIC8vIFNhdmUgc2VlZGhvc3QgY3JlZHMgKHNoYXJlZCB1c2VybmFtZSArIHBlci1zZXJ2aWNlIHBhc3N3b3JkKVxuICAgICAgaWYgKGN1cnJlbnRTZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgY29uc3QgdXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtdXNlcicpLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgY29uc3QgcGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtcGFzcycpLnZhbHVlO1xuICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlZWRob3N0LWNyZWRzJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdXNlcm5hbWU6IHVzZXIsIHBhc3N3b3JkOiBwYXNzIHx8IHVuZGVmaW5lZCwgc2VydmljZUlkOiBjdXJyZW50U2VydmljZS5pZCB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgQVBJIGtleSBcdTIwMTQgZm9yIGFyciBzZXJ2aWNlcywgdXNlIHRoZSBhcnIgY3JlZGVudGlhbHMgZW5kcG9pbnQgKGNvcnJlY3QgbmFtZXNwYWNlKVxuICAgICAgY29uc3QgYXBpS2V5SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWFwaWtleS1pbnB1dCcpO1xuICAgICAgY29uc3QgYXBpS2V5ID0gYXBpS2V5SW5wdXQ/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGlmIChhcGlLZXkgJiYgYXBpS2V5ICE9PSAnXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyJykge1xuICAgICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgICAvLyBVc2UgYXJyIGNyZWRlbnRpYWxzIGVuZHBvaW50IFx1MjAxNCB2YWxpZGF0ZXMga2V5LCB0ZXN0cyBjb25uZWN0aW9uLCBzdG9yZXMgaW4gYXJyLiogbmFtZXNwYWNlXG4gICAgICAgICAgY29uc3Qgc3ZjVXJsID0gZ2V0U2VydmljZVVybChjdXJyZW50U2VydmljZSk7XG4gICAgICAgICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICAgICAgICBjb25zdCBxdWFsaXR5UHJvZmlsZUlkID0gcXVhbFNlbGVjdD8udmFsdWUgPyBwYXJzZUludChxdWFsU2VsZWN0LnZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBxdWFsaXR5UHJvZmlsZU5hbWUgPSBxdWFsU2VsZWN0Py5zZWxlY3RlZE9wdGlvbnM/LlswXT8udGV4dENvbnRlbnQgfHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXJyL2NyZWRlbnRpYWxzJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgc2VydmljZTogc3ZjSWQsXG4gICAgICAgICAgICAgIGFwaUtleSxcbiAgICAgICAgICAgICAgdXJsOiBzdmNVcmwgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBxdWFsaXR5UHJvZmlsZUlkOiBxdWFsaXR5UHJvZmlsZUlkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcXVhbGl0eVByb2ZpbGVOYW1lOiBxdWFsaXR5UHJvZmlsZU5hbWUgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICBzaG93RXJyb3IoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgQVBJIGtleScpO1xuICAgICAgICAgICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZlJztcbiAgICAgICAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRhdGEuY29ubmVjdGlvblRlc3QgJiYgIWRhdGEuY29ubmVjdGlvblRlc3Quc3VjY2Vzcykge1xuICAgICAgICAgICAgc2hvd0Vycm9yKGBBUEkga2V5IHNhdmVkIGJ1dCBjb25uZWN0aW9uIHRlc3QgZmFpbGVkOiAke2RhdGEuY29ubmVjdGlvblRlc3QuZXJyb3J9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vbi1hcnIgc2VydmljZXMgdXNlIHRoZSBnZW5lcmljIGVuZHBvaW50XG4gICAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHtjdXJyZW50U2VydmljZS5pZH0vY3JlZGVudGlhbHNgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcGlLZXkgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0FyciAmJiBxdWFsaXR5UHJvZmlsZVNlcnZpY2VzLmluY2x1ZGVzKHN2Y0lkKSkge1xuICAgICAgICAvLyBBUEkga2V5IHVuY2hhbmdlZCBidXQgdXNlciBtYXkgaGF2ZSBjaGFuZ2VkIHF1YWxpdHkgcHJvZmlsZSBcdTIwMTQgc2F2ZSBwcm9maWxlIG9ubHlcbiAgICAgICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICAgICAgY29uc3QgcXVhbGl0eVByb2ZpbGVJZCA9IHF1YWxTZWxlY3Q/LnZhbHVlID8gcGFyc2VJbnQocXVhbFNlbGVjdC52YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHF1YWxpdHlQcm9maWxlTmFtZSA9IHF1YWxTZWxlY3Q/LnNlbGVjdGVkT3B0aW9ucz8uWzBdPy50ZXh0Q29udGVudCB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChxdWFsaXR5UHJvZmlsZUlkKSB7XG4gICAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXJyL3F1YWxpdHktcHJvZmlsZXMnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXJ2aWNlOiBzdmNJZCwgcXVhbGl0eVByb2ZpbGVJZCwgcXVhbGl0eVByb2ZpbGVOYW1lIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSBwZXItc2VydmljZSBiYXNpYyBhdXRoXG4gICAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgY29uc3QgdXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtdXNlcicpLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgY29uc3QgcGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtcGFzcycpLnZhbHVlO1xuICAgICAgICBpZiAodXNlciAmJiBwYXNzKSB7XG4gICAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHtjdXJyZW50U2VydmljZS5pZH0vY3JlZGVudGlhbHNgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1c2VybmFtZTogdXNlciwgcGFzc3dvcmQ6IHBhc3MgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBsb2FkU2VydmljZUNyZWRzKGN1cnJlbnRTZXJ2aWNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tTZXJ2aWNlQ3JlZGVudGlhbHNdIFNhdmUnLCBlLCB7IGZ1bmN0aW9uOiAnc2F2ZUNyZWRlbnRpYWxzJyB9KTtcbiAgICAgIHNob3dFcnJvcignRmFpbGVkIHRvIHNhdmU6ICcgKyAoZS5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJykpO1xuICAgIH1cbiAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmUnO1xuICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgfSk7XG5cbiAgLy8gQ2xlYXIgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtY2xlYXInKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGlmICghY29uZmlybShgUmVtb3ZlIHN0b3JlZCBjcmVkZW50aWFscyBmb3IgJHtjdXJyZW50U2VydmljZS5uYW1lfT9gKSkgcmV0dXJuO1xuICAgIGhpZGVFcnJvcigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdmNJZCA9IGN1cnJlbnRTZXJ2aWNlLmlkIHx8IGN1cnJlbnRTZXJ2aWNlLmFwcFRlbXBsYXRlO1xuICAgICAgY29uc3QgaXNBcnIgPSBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhzdmNJZCk7XG4gICAgICBpZiAoY3VycmVudFNlcnZpY2UuaXNFeHRlcm5hbCkge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9zZWVkaG9zdC1jcmVkcz9zZXJ2aWNlSWQ9JHtjdXJyZW50U2VydmljZS5pZH1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgZnJvbSBib3RoIG5hbWVzcGFjZXNcbiAgICAgIGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7Y3VycmVudFNlcnZpY2UuaWR9L2NyZWRlbnRpYWxzYCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL2Fyci9jcmVkZW50aWFscy8ke3N2Y0lkfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBjcmVkcy1idG4tJHtjdXJyZW50U2VydmljZS5pZH1gKTtcbiAgICAgIGlmIChidG4pIGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtY3JlZHMnKTtcbiAgICAgIGF3YWl0IGxvYWRTZXJ2aWNlQ3JlZHMoY3VycmVudFNlcnZpY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1NlcnZpY2VDcmVkZW50aWFsc10gQ2xlYXInLCBlLCB7IGZ1bmN0aW9uOiAnY2xlYXJDcmVkZW50aWFscycgfSk7XG4gICAgICBzaG93RXJyb3IoJ0ZhaWxlZCB0byBjbGVhcjogJyArIChlLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InKSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDbG9zZSBidXR0b24gLyBiYWNrZHJvcFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWNsb3NlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBjdXJyZW50U2VydmljZSA9IG51bGw7XG4gIH0pO1xuICBtb2RhbD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIGN1cnJlbnRTZXJ2aWNlID0gbnVsbDtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENoZWNrIGNyZWRlbnRpYWwgc3RhdHVzIGZvciBhbGwgc2VydmljZXMgb24gcGFnZSBsb2FkICh1cGRhdGUga2V5IGJ1dHRvbiBoaWdobGlnaHRzKVxuICB3aW5kb3cucmVmcmVzaENyZWRzQnV0dG9ucyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGFwcCBvZiAod2luZG93LkFQUFMgfHwgW10pKSB7XG4gICAgICAgIGlmICghYXBwLmlzRXh0ZXJuYWwgJiYgIWFwcC5hcHBUZW1wbGF0ZSAmJiAhYXBwLnVybCkgY29udGludWU7XG4gICAgICAgIGxldCBoYXNDcmVkcyA9IGZhbHNlO1xuICAgICAgICBpZiAoYXBwLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc2VlZFJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlZWRob3N0LWNyZWRzP3NlcnZpY2VJZD0ke2FwcC5pZH1gKTtcbiAgICAgICAgICAgIGNvbnN0IHNlZWREYXRhID0gYXdhaXQgc2VlZFJlcy5qc29uKCk7XG4gICAgICAgICAgICBpZiAoc2VlZERhdGEuc3VjY2VzcyAmJiBzZWVkRGF0YS5oYXNDcmVkZW50aWFscykgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke2FwcC5pZH0vY3JlZGVudGlhbHNgKTtcbiAgICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgICAgaWYgKGQuc3VjY2VzcyAmJiAoZC5oYXNBcGlLZXkgfHwgZC5oYXNCYXNpY0F1dGgpKSBoYXNDcmVkcyA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGNyZWRzLWJ0bi0ke2FwcC5pZH1gKTtcbiAgICAgICAgaWYgKGJ0bikgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2hhcy1jcmVkcycsIGhhc0NyZWRzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gIH07XG59KSgpO1xuO1xuLy8gPT09PT0gVE9UUCBTRVRUSU5HUyA9PT09PVxuKGZ1bmN0aW9uKCkge1xuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG4gIGluamVjdE1vZGFsKCd0b3RwLXNldHRpbmdzLW1vZGFsJywgYDxkaXYgaWQ9XCJ0b3RwLXNldHRpbmdzLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0MjBweDsgbWF4LXdpZHRoOiA1MjBweDtcIj5cbiAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjogMCAwIDE2cHg7IGZvbnQtc2l6ZTogMS4xcmVtO1wiPkF1dGhlbnRpY2F0aW9uIFNldHRpbmdzPC9oMz5cblxuICAgICAgPCEtLSBTdGF0dXMgQmFubmVyIC0tPlxuICAgICAgPGRpdiBpZD1cInRvdHAtc3RhdHVzLWJhbm5lclwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZzogMTJweCAxNnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICA8c3BhbiBpZD1cInRvdHAtc3RhdHVzLWRvdFwiIGNsYXNzPVwic3RhdHVzLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJ0b3RwLXN0YXR1cy10ZXh0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOXJlbTtcIj5UT1RQIGlzIG5vdCBjb25maWd1cmVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2V0dXAgQnV0dG9uIChub3QgY29uZmlndXJlZCBzdGF0ZSkgLS0+XG4gICAgICA8ZGl2IGlkPVwidG90cC1zZXR1cC1zZWN0aW9uXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLXNldHVwLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEycHg7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgICBHZW5lcmF0ZSBOZXcgU2VjcmV0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IG1hcmdpbjogMTBweCAwIDA7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXItbGluZVwiPjwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC10aW55LW11dGVkXCI+b3I8L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXItbGluZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1oaW50XCI+SW1wb3J0IGFuIGV4aXN0aW5nIHNlY3JldCBrZXk6PC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi10b3A6IDZweDtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwidG90cC1pbXBvcnQta2V5XCIgcGxhY2Vob2xkZXI9XCJQYXN0ZSB5b3VyIEJhc2UzMiBrZXlcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC45cmVtOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBsZXR0ZXItc3BhY2luZzogMXB4OyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1wiIC8+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1pbXBvcnQtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XG4gICAgICAgICAgICAgIEltcG9ydFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInRvdHAtaW1wb3J0LWVycm9yXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgZm9udC1zaXplOiAwLjhyZW07IG1pbi1oZWlnaHQ6IDEuMmVtOyBtYXJnaW4tdG9wOiA2cHg7XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VjcmV0IERpc3BsYXkgKHNldHVwIGZsb3cpIC0tPlxuICAgICAgPGRpdiBpZD1cInRvdHAtcXItc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPCEtLSBNYW51YWwgS2V5IChwcmltYXJ5IC0gZm9yIFdpbkF1dGgvZGVza3RvcCBhdXRoZW50aWNhdG9ycykgLS0+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCA4cHg7XCI+Q29weSB0aGlzIGtleSBpbnRvIHlvdXIgYXV0aGVudGljYXRvciBhcHA6PC9wPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICA8Y29kZSBpZD1cInRvdHAtbWFudWFsLWtleVwiIHN0eWxlPVwiZmxleDogMTsgZGlzcGxheTogYmxvY2s7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLCAjMGIwZjFhKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDFyZW07IGZvbnQtZmFtaWx5OiAnU2FtaSBHcm90ZXNrJywgbW9ub3NwYWNlOyBsZXR0ZXItc3BhY2luZzogMnB4OyB3b3JkLWJyZWFrOiBicmVhay1hbGw7IHVzZXItc2VsZWN0OiBhbGw7IGNvbG9yOiB2YXIoLS1mZyk7XCI+PC9jb2RlPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLWNvcHkta2V5XCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDFyZW07IHdoaXRlLXNwYWNlOiBub3dyYXA7IGNvbG9yOiB2YXIoLS1mZyk7XCIgdGl0bGU9XCJDb3B5IHRvIGNsaXBib2FyZFwiPlx1RDgzRFx1RENDQjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERvd25sb2FkIGJhY2t1cCBmaWxlIChyZWNvdmVyeSBhaWQpIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZywgIzBiMGYxYSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmbGV4OiAxO1wiPlxuICAgICAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6IHZhcigtLWZnKTtcIj5TYXZlIGEgYmFja3VwIGZpbGU8L3N0cm9uZz4gXHUyMDE0IGlmIHlvdSBldmVyIGxvc2UgeW91ciBhdXRoZW50aWNhdG9yLFxuICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byByZWNvdmVyIHdpdGhvdXQgU1NIIGFjY2VzcyB0byB0aGUgc2VydmVyLlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtZG93bmxvYWQtYmFja3VwXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDE0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XG4gICAgICAgICAgICAgIFx1MkIwNyBEb3dubG9hZFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUVIgQ29kZSAoc2Vjb25kYXJ5IC0gZm9yIG1vYmlsZSBhcHBzKSAtLT5cbiAgICAgICAgPGRldGFpbHMgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuOHJlbTtcIj5TaG93IFFSIGNvZGUgKGZvciBtb2JpbGUgYXV0aGVudGljYXRvciBhcHBzKTwvc3VtbWFyeT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tdG9wOiA4cHg7XCI+XG4gICAgICAgICAgICA8aW1nIGlkPVwidG90cC1xci1pbWFnZVwiIHN0eWxlPVwid2lkdGg6IDE4MHB4OyBoZWlnaHQ6IDE4MHB4OyBib3JkZXItcmFkaXVzOiA4cHg7XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kZXRhaWxzPlxuXG4gICAgICAgIDwhLS0gVmVyaWZ5IEZpcnN0IENvZGUgLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgcGFkZGluZy10b3A6IDE2cHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9udC1ib2xkLXNtXCI+RW50ZXIgY29kZSB0byBjb25maXJtIHNldHVwOjwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW4tdG9wOiA4cHg7XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRvdHAtc2V0dXAtY29kZVwiIG1heGxlbmd0aD1cIjZcIiBpbnB1dG1vZGU9XCJudW1lcmljXCIgcGF0dGVybj1cIlswLTldezZ9XCIgcGxhY2Vob2xkZXI9XCIwMDAwMDBcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDEuM3JlbTsgcGFkZGluZzogMTBweDsgZm9udC1mYW1pbHk6ICdTYW1pIEdyb3Rlc2snLCBtb25vc3BhY2U7IGxldHRlci1zcGFjaW5nOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogOHB4OyBvdXRsaW5lOiBub25lO1wiIC8+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1jb25maXJtLXNldHVwXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDIwcHg7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+XG4gICAgICAgICAgICAgIENvbmZpcm1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJ0b3RwLXNldHVwLWVycm9yXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgZm9udC1zaXplOiAwLjhyZW07IG1pbi1oZWlnaHQ6IDEuMmVtOyBtYXJnaW4tdG9wOiA2cHg7XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2Vzc2lvbiBEdXJhdGlvbiAoYWN0aXZlIHN0YXRlKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ0b3RwLWR1cmF0aW9uLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvbnQtYm9sZC1zbVwiPlNlc3Npb24gRHVyYXRpb246PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cInRvdHAtZHVyYXRpb24tc2VsZWN0XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgbWFyZ2luLXRvcDogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZywgIzBiMGYxYSk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDhweDsgZm9udC1zaXplOiAwLjlyZW07IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMTVtXCI+MTUgbWludXRlczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIzMG1cIj4zMCBtaW51dGVzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFoXCI+MSBob3VyPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjJoXCI+MiBob3Vyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI0aFwiPjQgaG91cnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiOGhcIj44IGhvdXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEyaFwiPjEyIGhvdXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjI0aFwiPjI0IGhvdXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5ldmVyXCI+TmV2ZXIgKGRpc2FibGUgVE9UUCk8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDRweCAwIDA7XCI+SG93IGxvbmcgYmVmb3JlIHlvdSBuZWVkIHRvIHJlLWVudGVyIHlvdXIgY29kZTwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIERpc2FibGUgQnV0dG9uIChhY3RpdmUgc3RhdGUpIC0tPlxuICAgICAgPGRpdiBpZD1cInRvdHAtZGlzYWJsZS1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nLXRvcDogMTZweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLWRpc2FibGUtYnRuXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGNvbG9yOiB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjlyZW07XCI+XG4gICAgICAgICAgRGlzYWJsZSBUT1RQXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2xvc2UgLS0+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLW1vZGFsLWNsb3NlXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMjBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgQ2xvc2VcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFRvdHBTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHJldHVybjtcblxuICAgICAgY29uc3QgeyBlbmFibGVkLCBzZXNzaW9uRHVyYXRpb24sIGlzU2V0VXAgfSA9IGRhdGEuY29uZmlnO1xuICAgICAgY29uc3Qgc3RhdHVzRG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc3RhdHVzLWRvdCcpO1xuICAgICAgY29uc3Qgc3RhdHVzVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXN0YXR1cy10ZXh0Jyk7XG4gICAgICBjb25zdCBzdGF0dXNCYW5uZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zdGF0dXMtYmFubmVyJyk7XG4gICAgICBjb25zdCBzZXR1cFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1zZWN0aW9uJyk7XG4gICAgICBjb25zdCBxclNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1xci1zZWN0aW9uJyk7XG4gICAgICBjb25zdCBkdXJhdGlvblNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kdXJhdGlvbi1zZWN0aW9uJyk7XG4gICAgICBjb25zdCBkaXNhYmxlU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWRpc2FibGUtc2VjdGlvbicpO1xuXG4gICAgICBpZiAoZW5hYmxlZCAmJiBpc1NldFVwKSB7XG4gICAgICAgIHN0YXR1c0RvdC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLW9rLWZnLCAjN2VmMmZmKSc7XG4gICAgICAgIHN0YXR1c0Jhbm5lci5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1vay1mZywgIzdlZjJmZiknO1xuICAgICAgICBzdGF0dXNCYW5uZXIuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDglLCB0cmFuc3BhcmVudCknO1xuICAgICAgICBzdGF0dXNUZXh0LnRleHRDb250ZW50ID0gJ1RPVFAgaXMgYWN0aXZlJztcbiAgICAgICAgc3RhdHVzVGV4dC5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZywgIzdlZjJmZiknO1xuICAgICAgICAvLyBLZWVwIHRoZSBzZXR1cCBzZWN0aW9uIHZpc2libGUgKGNvbGxhcHNlZCkgc28gdGhlIFwiSW1wb3J0IGV4aXN0aW5nXG4gICAgICAgIC8vIHNlY3JldFwiIG9wdGlvbiBpcyBhbHdheXMgcmVhY2hhYmxlIFx1MjAxNCB1c2VycyBtYXkgbmVlZCB0byByZS1lbnJvbGxcbiAgICAgICAgLy8gdGhlaXIgYXV0aGVudGljYXRvciB3aXRoIHRoZSBzYW1lIHNlY3JldCBmcm9tIGEgYmFja3VwIGZpbGUuXG4gICAgICAgIHNldHVwU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgY29uc3Qgc2V0dXBCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1idG4nKTtcbiAgICAgICAgaWYgKHNldHVwQnRuKSBzZXR1cEJ0bi50ZXh0Q29udGVudCA9ICdHZW5lcmF0ZSBOZXcgU2VjcmV0JztcbiAgICAgICAgLy8gSGlkZSB0aGUgUVIgc2VjdGlvbiBieSBkZWZhdWx0IGluIHRoZSBhY3RpdmUgc3RhdGUgXHUyMDE0IHNldHVwQnRuIGNsaWNrIHNob3dzIGl0XG4gICAgICAgIHFyU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkdXJhdGlvblNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRpc2FibGVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kdXJhdGlvbi1zZWxlY3QnKS52YWx1ZSA9IHNlc3Npb25EdXJhdGlvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1c0RvdC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICAgIHN0YXR1c0Jhbm5lci5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1ib3JkZXIpJztcbiAgICAgICAgc3RhdHVzQmFubmVyLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICBzdGF0dXNUZXh0LnRleHRDb250ZW50ID0gJ1RPVFAgaXMgbm90IGNvbmZpZ3VyZWQnO1xuICAgICAgICBzdGF0dXNUZXh0LnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICAgIHNldHVwU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcXJTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGR1cmF0aW9uU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkaXNhYmxlU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGhlIEF1dGggY2FyZCBpbiB0aGUgdG9wIHJvd1xuICAgICAgdXBkYXRlQXV0aENhcmQoZW5hYmxlZCAmJiBpc1NldFVwLCBzZXNzaW9uRHVyYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgVE9UUCBzZXR0aW5nczonLCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyBEdXJhdGlvbiBsYWJlbCBoZWxwZXJcbiAgY29uc3QgRFVSQVRJT05fTEFCRUxTID0ge1xuICAgICcxNW0nOiAnMTUgbWluJywgJzMwbSc6ICczMCBtaW4nLCAnMWgnOiAnMSBob3VyJywgJzJoJzogJzIgaG91cnMnLFxuICAgICc0aCc6ICc0IGhvdXJzJywgJzhoJzogJzggaG91cnMnLCAnMTJoJzogJzEyIGhvdXJzJywgJzI0aCc6ICcyNCBob3VycycsICduZXZlcic6ICdEaXNhYmxlZCdcbiAgfTtcblxuICBmdW5jdGlvbiB0cmFuc2xhdGVkKGtleSwgZmFsbGJhY2spIHtcbiAgICBjb25zdCBpMThuID0gd2luZG93LkRDSTE4bjtcbiAgICByZXR1cm4gaTE4biAmJiBpMThuLmlzTG9hZGVkKCkgPyBpMThuLnQoa2V5KSA6IGZhbGxiYWNrO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlQXV0aENhcmQoYWN0aXZlLCBkdXJhdGlvbikge1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1jYXJkJyk7XG4gICAgY29uc3QgcGlsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXBpbGwnKTtcbiAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1kb3QnKTtcbiAgICBjb25zdCBzdGF0dXNUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtc3RhdHVzLXRleHQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcblxuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLXN0YXR1cycsICdvbicpO1xuICAgICAgcGlsbC5jbGFzc05hbWUgPSAnYmFkZ2Ugb24nO1xuICAgICAgcGlsbC50ZXh0Q29udGVudCA9IHRyYW5zbGF0ZWQoJ2NhcmQuc3RhdHVzLnllcycsICdZRVMnKTtcbiAgICAgIGRvdC5jbGFzc05hbWUgPSAnZG90IG9rIGF0LWJsJztcbiAgICAgIHN0YXR1c1RleHQudGV4dENvbnRlbnQgPSAnU2Vzc2lvbjogJyArIChEVVJBVElPTl9MQUJFTFNbZHVyYXRpb25dIHx8IGR1cmF0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ29mZicpO1xuICAgICAgcGlsbC5jbGFzc05hbWUgPSAnYmFkZ2Ugb2ZmJztcbiAgICAgIHBpbGwudGV4dENvbnRlbnQgPSB0cmFuc2xhdGVkKCdjYXJkLnN0YXR1cy5ubycsICdOTycpO1xuICAgICAgZG90LmNsYXNzTmFtZSA9ICdkb3QgYmFkIGF0LWJsJztcbiAgICAgIHN0YXR1c1RleHQudGV4dENvbnRlbnQgPSB0cmFuc2xhdGVkKCdjYXJkLmF1dGgubm90X2NvbmZpZ3VyZWQnLCAnTm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXR1cCBidXR0b24gKGdlbmVyYXRlIG5ldyBzZWNyZXQpXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC9zZXR1cCcsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcXItaW1hZ2UnKS5zcmMgPSBkYXRhLnFyQ29kZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtbWFudWFsLWtleScpLnRleHRDb250ZW50ID0gZGF0YS5tYW51YWxLZXk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLXNlY3Rpb24nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1xci1zZWN0aW9uJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKS52YWx1ZSA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1lcnJvcicpLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1RPVFBdIFNldHVwIEZhaWxlZCcsIGUsIHsgZnVuY3Rpb246ICdzZXR1cFRPVFAnIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gSW1wb3J0IGV4aXN0aW5nIHNlY3JldCBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtaW1wb3J0LWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZWNyZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1pbXBvcnQta2V5JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1pbXBvcnQtZXJyb3InKTtcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgaWYgKCFzZWNyZXQpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnUGFzdGUgYSBCYXNlMzIgc2VjcmV0IGtleSBmaXJzdCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL3NldHVwJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VjcmV0IH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXFyLWltYWdlJykuc3JjID0gZGF0YS5xckNvZGU7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW1hbnVhbC1rZXknKS50ZXh0Q29udGVudCA9IGRhdGEubWFudWFsS2V5O1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1zZWN0aW9uJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcXItc2VjdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJykudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtZXJyb3InKS50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJykuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8IGRhdGEubWVzc2FnZSB8fCAnSW1wb3J0IGZhaWxlZCc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW9uIGVycm9yIFx1MjAxNCB0cnkgcmVmcmVzaGluZyB0aGUgcGFnZSc7XG4gICAgfVxuICB9KTtcblxuICAvLyBDb3B5IGtleSBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtY29weS1rZXknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtbWFudWFsLWtleScpLnRleHRDb250ZW50O1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGtleSkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1jb3B5LWtleScpO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENDQic7IH0sIDIwMDApO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBEb3dubG9hZCBiYWNrdXAgZmlsZSBcdTIwMTQgcGxhaW4gSlNPTiBzbyBpdCByb3VuZC10cmlwcyB0aHJvdWdoIGFueSBwYXNzd29yZFxuICAvLyBtYW5hZ2VyLCBjbG91ZCBiYWNrdXAsIG9yIHByaW50ZWQgcGFwZXIuIFRoZSBzZWNyZXQgSVMgcmVjb3ZlcmFibGUgcGxhaW50ZXh0XG4gIC8vICh0aGF0J3MgdGhlIHdob2xlIHBvaW50IG9mIHRoZSBiYWNrdXApLCBzbyB3YXJuIHRoZSB1c2VyIGFuZCByZWx5IG9uXG4gIC8vIHRoZW0gdG8ga2VlcCBpdCBzYWZlLlxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kb3dubG9hZC1iYWNrdXAnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3Qgc2VjcmV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtbWFudWFsLWtleScpLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBpZiAoIXNlY3JldCkgcmV0dXJuO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBzZXJ2aWNlOiAnRGFzaENhZGR5JyxcbiAgICAgIHR5cGU6ICd0b3RwLXNlY3JldCcsXG4gICAgICBzZWNyZXQ6IHNlY3JldCxcbiAgICAgIGlzc3VlcjogJ0Rhc2hDYWRkeScsXG4gICAgICBhbGdvcml0aG06ICdTSEExJyxcbiAgICAgIGRpZ2l0czogNixcbiAgICAgIHBlcmlvZDogMzAsXG4gICAgICBpc3N1ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC8vIFJlY292ZXJ5IGluc3RydWN0aW9ucyBiYWtlZCBpbnRvIHRoZSBmaWxlIHNvIGEgeWVhciBmcm9tIG5vdyB0aGVcbiAgICAgIC8vIHVzZXIgKG9yIHRoZWlyIGZ1dHVyZSBzZWxmKSBrbm93cyB3aGF0IHRoaXMgZmlsZSBpcyBhbmQgaG93IHRvIHVzZSBpdC5cbiAgICAgIHJlY292ZXJ5X3VybDogYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vICAobG9naW4gc2NyZWVuIFx1MjE5MiBcIkxvc3QgYWNjZXNzP1wiKWAsXG4gICAgICBub3RlOiAnS2VlcCB0aGlzIGZpbGUgc29tZXdoZXJlIHNhZmUuIEFueW9uZSB3aXRoIHRoaXMgc2VjcmV0IGNhbiBnZW5lcmF0ZSB5b3VyIGxvZ2luIGNvZGVzLiBVc2UgaXQgT05MWSB0byByZWNvdmVyIFRPVFAgYWNjZXNzIHZpYSB0aGUgXCJMb3N0IGFjY2Vzcz9cIiBsaW5rIG9uIHRoZSBEYXNoQ2FkZHkgbG9naW4gc2NyZWVuLidcbiAgICB9O1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBgZGFzaGNhZGR5LXRvdHAtYmFja3VwLSR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKX0uanNvbmA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICBhLmNsaWNrKCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZG93bmxvYWQtYmFja3VwJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBTYXZlZCc7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdcdTJCMDcgRG93bmxvYWQnOyB9LCAyMDAwKTtcbiAgfSk7XG5cbiAgLy8gQ29uZmlybSBzZXR1cFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1jb25maXJtLXNldHVwJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNvZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJykudmFsdWU7XG4gICAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWVycm9yJyk7XG4gICAgaWYgKCEvXlxcZHs2fSQvLnRlc3QoY29kZSkpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnRW50ZXIgYSA2LWRpZ2l0IGNvZGUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL3ZlcmlmeS1zZXR1cCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvZGUgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgbG9hZFRvdHBTZXR0aW5ncygpOyAvLyBVcGRhdGVzIGJvdGggbW9kYWwgYW5kIGNhcmRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8ICdJbnZhbGlkIGNvZGUnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnQ29ubmVjdGlvbiBlcnJvcic7XG4gICAgfVxuICB9KTtcblxuICAvLyBBbGxvdyBFbnRlciBrZXkgb24gc2V0dXAgY29kZSBpbnB1dFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtY29uZmlybS1zZXR1cCcpPy5jbGljaygpO1xuICB9KTtcblxuICAvLyBEdXJhdGlvbiBjaGFuZ2VcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZHVyYXRpb24tc2VsZWN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIChlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2Vzc2lvbkR1cmF0aW9uOiBlLnRhcmdldC52YWx1ZSB9KVxuICAgICAgfSk7XG4gICAgICBsb2FkVG90cFNldHRpbmdzKCk7IC8vIFJlZnJlc2ggbW9kYWwgKyBjYXJkIChoYW5kbGVzIFwibmV2ZXJcIiBkaXNhYmxpbmcgVE9UUClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1RPVFBdIFVwZGF0ZSBTZXNzaW9uIER1cmF0aW9uJywgZXJyLCB7IGZ1bmN0aW9uOiAndXBkYXRlU2Vzc2lvbkR1cmF0aW9uJyB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIERpc2FibGUgVE9UUFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kaXNhYmxlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpcm0oJ0Rpc2FibGUgVE9UUCBhdXRoZW50aWNhdGlvbj8gQWxsIHNlcnZpY2VzIHdpbGwgYmUgYWNjZXNzaWJsZSB3aXRob3V0IGEgY29kZS4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL2Rpc2FibGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogJ3t9J1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIGxvYWRUb3RwU2V0dGluZ3MoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tUT1RQXSBEaXNhYmxlIEZhaWxlZCcsIGUsIHsgZnVuY3Rpb246ICdkaXNhYmxlVE9UUCcgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBPcGVuIHNldHRpbmdzIG1vZGFsIGZyb20gQXV0aCBjYXJkXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXNldHRpbmdzLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBsb2FkVG90cFNldHRpbmdzKCk7XG4gICAgb3Blbk1vZGFsKCd0b3RwLXNldHRpbmdzLW1vZGFsJyk7XG4gIH0pO1xuXG4gIC8vIENsb3NlIHNldHRpbmdzIG1vZGFsXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW1vZGFsLWNsb3NlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNsb3NlTW9kYWwoJ3RvdHAtc2V0dGluZ3MtbW9kYWwnKTtcbiAgfSk7XG5cbiAgLy8gQmFja2Ryb3AgY2xpY2sgdG8gY2xvc2VcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dGluZ3MtbW9kYWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldC5pZCA9PT0gJ3RvdHAtc2V0dGluZ3MtbW9kYWwnKSB7XG4gICAgICBjbG9zZU1vZGFsKCd0b3RwLXNldHRpbmdzLW1vZGFsJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBVcGRhdGUgYXV0aCBjYXJkIG9uIHBhZ2UgbG9hZFxuICB3aW5kb3cuX3VwZGF0ZUF1dGhDYXJkID0gdXBkYXRlQXV0aENhcmQ7XG4gIChhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvY29uZmlnJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgYWN0aXZlID0gZGF0YS5jb25maWcuZW5hYmxlZCAmJiBkYXRhLmNvbmZpZy5pc1NldFVwO1xuICAgICAgICB1cGRhdGVBdXRoQ2FyZChhY3RpdmUsIGRhdGEuY29uZmlnLnNlc3Npb25EdXJhdGlvbik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tUT1RQXSBBdXRoQ2FyZCBVcGRhdGUnLCBlLCB7IGZ1bmN0aW9uOiAnYXV0aENhcmRVcGRhdGUnIH0pOyB9XG4gIH0pKCk7XG5cbn0pKCk7XG47XG4vKipcbiAqIEFkbWluIHBhbmVsIFx1MjAxNCBEQy0wNDguXG4gKlxuICogTWluaW1hbCBhZG1pbiBVSSBmb3IgbWFuYWdpbmcgdXNlcnMgKyBpbnZpdGVzLiBSZW5kZXJlZCBhcyBhIG1vZGFsIG92ZXJsYXlcbiAqIHRyaWdnZXJlZCBieSBhbiBcIkFkbWluXCIgYnV0dG9uIGluIHRoZSB0b3AgYmFyIHRoYXQgb25seSBhcHBlYXJzIHdoZW5cbiAqIC9hcGkvdjEvYXV0aC9tZSByZXR1cm5zIGlzQWRtaW49dHJ1ZS4gVGhlIHBhbmVsIHJlbmRlcnMgdGhyZWUgc2VjdGlvbnM6XG4gKlxuICogICAxLiBVc2VycyBcdTIwMTQgbGlzdCBvZiBhdXRob3JpemVkIHVzZXJzIHdpdGggcm9sZSBiYWRnZXMsIHJvbGUtZWRpdCxcbiAqICAgICAgZGVsZXRlIGFjdGlvbnMuXG4gKiAgIDIuIEludml0ZSBhIHVzZXIgXHUyMDE0IGZvcm0gdG8gaXNzdWUgYSBzaW5nbGUtdXNlIGludml0ZSAoZW1haWwsIHJvbGUsXG4gKiAgICAgIFRUTCkuIFRoZSBhY2NlcHQtbGluayBpcyBzaG93biBwb3N0LWlzc3VlIHNvIHRoZSBhZG1pbiBjYW4gY29weSBpdC5cbiAqICAgMy4gT3V0c3RhbmRpbmcgaW52aXRlcyBcdTIwMTQgbGlzdCBvZiBpc3N1ZWQtbm90LXlldC1hY2NlcHRlZCBpbnZpdGVzXG4gKiAgICAgIHdpdGggYSByZXZva2UgYnV0dG9uLlxuICpcbiAqIFRoZSBwYW5lbCBkb2VzIE5PVCBhZGQgYSB0YWIgdG8gdGhlIGRhc2hib2FyZCBuYXYgXHUyMDE0IGl0IGxpdmVzIGFzIGEgbW9kYWxcbiAqIHRvIGtlZXAgREMtMDQ4IHN1cmdpY2FsLiBGdXR1cmUgREMtMDQ5IHdvcmsgY2FuIHByb21vdGUgaXQgdG8gYSB0YWIuXG4gKlxuICogQmVoYXZpb3VyOlxuICogICAtIE9uIGxvYWQ6IEdFVCAvbWU7IGlmICFpc0FkbWluIFx1MjE5MiBzaG93IFwiYWRtaW4gb25seVwiIHBsYWNlaG9sZGVyXG4gKiAgIC0gVGhlbiBHRVQgL2FkbWluL3VzZXJzICsgL2FkbWluL2ludml0ZXMgaW4gcGFyYWxsZWxcbiAqICAgLSBGb3JtcyBQT1NUIHRvIHRoZSBhZG1pbiBlbmRwb2ludHMsIHJlZnJlc2ggbGlzdHMgb24gc3VjY2Vzc1xuICogICAtIFwiQ29weSBsaW5rXCIgYnV0dG9uIHdyaXRlcyB0aGUgYWNjZXB0VXJsIHRvIHRoZSBjbGlwYm9hcmRcbiAqXG4gKiBXaXJlcyBpbnRvIHRoZSBnbG9iYWwgZXJyb3ItaGFuZGxlciAod2luZG93LmVycm9ySGFuZGxlcikgZm9yIGZhaWx1cmVcbiAqIHN1cmZhY2VzLiBVc2VzIHdpbmRvdy5TSVRFIGZvciBhbnkgVUkgY29uc3RhbnRzIChub25lIGN1cnJlbnRseSkuXG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IEFQSSA9IHtcbiAgICBtZTogJy9hcGkvdjEvYXV0aC9tZScsXG4gICAgdXNlcnM6ICcvYXBpL3YxL2F1dGgvYWRtaW4vdXNlcnMnLFxuICAgIGFsbG93bGlzdDogJy9hcGkvdjEvYXV0aC9hZG1pbi9hbGxvd2xpc3QnLFxuICAgIGludml0ZXM6ICcvYXBpL3YxL2F1dGgvYWRtaW4vaW52aXRlcycsXG4gIH07XG5cbiAgZnVuY3Rpb24gX2VsKHRhZywgYXR0cnMsIC4uLmNoaWxkcmVuKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICBpZiAoYXR0cnMpIHtcbiAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhhdHRycykpIHtcbiAgICAgICAgY29uc3QgdiA9IGF0dHJzW2tdO1xuICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gZmFsc2UpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoayA9PT0gJ2NsYXNzJykgbm9kZS5jbGFzc05hbWUgPSB2O1xuICAgICAgICBlbHNlIGlmIChrID09PSAndGV4dCcpIG5vZGUudGV4dENvbnRlbnQgPSB2O1xuICAgICAgICBlbHNlIGlmIChrID09PSAnaHRtbCcpIG5vZGUuaW5uZXJIVE1MID0gdjtcbiAgICAgICAgZWxzZSBpZiAoay5zdGFydHNXaXRoKCdvbicpICYmIHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2KTtcbiAgICAgICAgZWxzZSBub2RlLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoYyA9PT0gbnVsbCB8fCBjID09PSB1bmRlZmluZWQgfHwgYyA9PT0gZmFsc2UpIGNvbnRpbnVlO1xuICAgICAgaWYgKHR5cGVvZiBjID09PSAnc3RyaW5nJykgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKSk7XG4gICAgICBlbHNlIG5vZGUuYXBwZW5kQ2hpbGQoYyk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gX2ZldGNoSlNPTih1cmwsIG9wdHMpIHtcbiAgICBjb25zdCBjc3JmID0gKHdpbmRvdy5TSVRFICYmIHdpbmRvdy5TSVRFLmNzcmZUb2tlbikgfHwgJyc7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgb3B0cy5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgb3B0cy5oZWFkZXJzIHx8IHt9LFxuICAgICAgY3NyZiA/IHsgJ1gtQ1NSRi1Ub2tlbic6IGNzcmYgfSA6IHt9XG4gICAgKTtcbiAgICBpZiAob3B0cy5ib2R5ICYmIHR5cGVvZiBvcHRzLmJvZHkgIT09ICdzdHJpbmcnKSBvcHRzLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRzLmJvZHkpO1xuICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdHMpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICBpZiAoIXIub2spIHtcbiAgICAgIGNvbnN0IG1zZyA9IChkYXRhICYmIChkYXRhLm1lc3NhZ2UgfHwgZGF0YS5lcnJvcikpIHx8ICgnSFRUUCAnICsgci5zdGF0dXMpO1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1zZyk7XG4gICAgICBlcnIuc3RhdHVzID0gci5zdGF0dXM7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlckJhZGdlKHJvbGUpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB7XG4gICAgICBhZG1pbjogJ2JhY2tncm91bmQ6IzdjM2FlZDtjb2xvcjojZmZmJyxcbiAgICAgIG9wZXJhdG9yOiAnYmFja2dyb3VuZDojMjU2M2ViO2NvbG9yOiNmZmYnLFxuICAgICAgdmlld2VyOiAnYmFja2dyb3VuZDojNmI3MjgwO2NvbG9yOiNmZmYnLFxuICAgIH07XG4gICAgcmV0dXJuIF9lbCgnc3BhbicsIHtcbiAgICAgIGNsYXNzOiAncm9sZS1iYWRnZScsXG4gICAgICBzdHlsZTogJ2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MC43NXJlbTtmb250LXdlaWdodDo2MDA7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOycgK1xuICAgICAgICAoY29sb3JzW3JvbGVdIHx8IGNvbG9ycy52aWV3ZXIpLFxuICAgICAgdGV4dDogcm9sZSxcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJVc2Vyc0xpc3QoY29udGFpbmVyLCB1c2Vycywgb25DaGFuZ2UpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgaWYgKCF1c2VycyB8fCB1c2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7IHN0eWxlOiAnY29sb3I6dmFyKC0tbXV0ZWQpJywgdGV4dDogJ05vIHVzZXJzIHlldC4nIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFibGUgPSBfZWwoJ3RhYmxlJywge1xuICAgICAgc3R5bGU6ICd3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC45cmVtJyxcbiAgICB9KTtcbiAgICB0YWJsZS5hcHBlbmRDaGlsZChfZWwoJ3RoZWFkJywgbnVsbCxcbiAgICAgIF9lbCgndHInLCB7IHN0eWxlOiAnYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKScgfSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnRW1haWwnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdSb2xlJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnQ3JlYXRlZCcgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0xhc3QgbG9naW4nIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246cmlnaHQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnQWN0aW9ucycgfSksXG4gICAgICApLFxuICAgICkpO1xuICAgIGNvbnN0IHRib2R5ID0gX2VsKCd0Ym9keScpO1xuICAgIGZvciAoY29uc3QgdSBvZiB1c2Vycykge1xuICAgICAgY29uc3Qgcm93ID0gX2VsKCd0cicsIHsgc3R5bGU6ICdib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpJyB9KTtcblxuICAgICAgY29uc3QgZW1haWxDZWxsID0gX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweCcgfSk7XG4gICAgICBlbWFpbENlbGwuYXBwZW5kQ2hpbGQoX2VsKCdzcGFuJywgeyB0ZXh0OiB1LmVtYWlsIHx8ICcobm8gZW1haWwpJyB9KSk7XG4gICAgICBpZiAodS5kaXNwbGF5TmFtZSAmJiB1LmRpc3BsYXlOYW1lICE9PSAodS5lbWFpbCB8fCAnJykuc3BsaXQoJ0AnKVswXSkge1xuICAgICAgICBlbWFpbENlbGwuYXBwZW5kQ2hpbGQoX2VsKCdicicpKTtcbiAgICAgICAgZW1haWxDZWxsLmFwcGVuZENoaWxkKF9lbCgnc21hbGwnLCB7XG4gICAgICAgICAgc3R5bGU6ICdjb2xvcjp2YXIoLS1tdXRlZCknLCB0ZXh0OiB1LmRpc3BsYXlOYW1lLFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoZW1haWxDZWxsKTtcblxuICAgICAgY29uc3Qgcm9sZUNlbGwgPSBfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4JyB9KTtcbiAgICAgIHJvbGVDZWxsLmFwcGVuZENoaWxkKF9yZW5kZXJCYWRnZSh1LnJvbGUpKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChyb2xlQ2VsbCk7XG5cbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywge1xuICAgICAgICBzdHlsZTogJ3BhZGRpbmc6OHB4O2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MC44NXJlbScsXG4gICAgICAgIHRleHQ6IHUuY3JlYXRlZEF0ID8gbmV3IERhdGUodS5jcmVhdGVkQXQpLnRvTG9jYWxlRGF0ZVN0cmluZygpIDogJ1x1MjAxNCcsXG4gICAgICB9KSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHtcbiAgICAgICAgc3R5bGU6ICdwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuODVyZW0nLFxuICAgICAgICB0ZXh0OiB1Lmxhc3RMb2dpbkF0ID8gbmV3IERhdGUodS5sYXN0TG9naW5BdCkudG9Mb2NhbGVTdHJpbmcoKSA6ICdcdTIwMTQnLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBhY3Rpb25zQ2VsbCA9IF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHg7dGV4dC1hbGlnbjpyaWdodCcgfSk7XG4gICAgICBjb25zdCByb2xlU2VsZWN0ID0gX2VsKCdzZWxlY3QnLCB7XG4gICAgICAgIHN0eWxlOiAncGFkZGluZzoycHggNnB4O21hcmdpbi1yaWdodDo2cHgnLFxuICAgICAgICBvbmNoYW5nZTogYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IF9mZXRjaEpTT04oQVBJLnVzZXJzICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHUuaWQpLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJywgYm9keTogeyByb2xlOiBldi50YXJnZXQudmFsdWUgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb25DaGFuZ2UgJiYgb25DaGFuZ2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnUm9sZSB1cGRhdGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIGV2LnRhcmdldC52YWx1ZSA9IHUucm9sZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgciBvZiBbJ2FkbWluJywgJ29wZXJhdG9yJywgJ3ZpZXdlciddKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IF9lbCgnb3B0aW9uJywgeyB2YWx1ZTogciwgdGV4dDogciB9KTtcbiAgICAgICAgaWYgKHIgPT09IHUucm9sZSkgb3B0LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgcm9sZVNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfVxuICAgICAgYWN0aW9uc0NlbGwuYXBwZW5kQ2hpbGQocm9sZVNlbGVjdCk7XG5cbiAgICAgIGNvbnN0IGRlbEJ0biA9IF9lbCgnYnV0dG9uJywge1xuICAgICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAncGFkZGluZzoycHggOHB4JyxcbiAgICAgICAgdGV4dDogJ0RlbGV0ZScsXG4gICAgICAgIG9uY2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oJ0RlbGV0ZSB1c2VyICcgKyAodS5lbWFpbCB8fCB1LmlkKSArICc/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfZmV0Y2hKU09OKEFQSS51c2VycyArICcvJyArIGVuY29kZVVSSUNvbXBvbmVudCh1LmlkKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgICAgICAgb25DaGFuZ2UgJiYgb25DaGFuZ2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnRGVsZXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhY3Rpb25zQ2VsbC5hcHBlbmRDaGlsZChkZWxCdG4pO1xuICAgICAgcm93LmFwcGVuZENoaWxkKGFjdGlvbnNDZWxsKTtcblxuICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcbiAgICB9XG4gICAgdGFibGUuYXBwZW5kQ2hpbGQodGJvZHkpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBfcmVuZGVySW52aXRlRm9ybShjb250YWluZXIsIG9uSXNzdWVkKSB7XG4gICAgY29uc3QgZm9ybSA9IF9lbCgnZm9ybScsIHtcbiAgICAgIHN0eWxlOiAnZGlzcGxheTpmbGV4O2dhcDo4cHg7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6ZW5kJyxcbiAgICAgIG9uc3VibWl0OiBhc3luYyAoZXYpID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZmQgPSBuZXcgRm9ybURhdGEoZXYudGFyZ2V0KTtcbiAgICAgICAgY29uc3QgYm9keSA9IHtcbiAgICAgICAgICBlbWFpbDogZmQuZ2V0KCdlbWFpbCcpLFxuICAgICAgICAgIHJvbGU6IGZkLmdldCgncm9sZScpLFxuICAgICAgICAgIHR0bEhvdXJzOiBwYXJzZUludChmZC5nZXQoJ3R0bEhvdXJzJyksIDEwKSB8fCAyNCxcbiAgICAgICAgICBzZW5kRW1haWw6IGZkLmdldCgnc2VuZEVtYWlsJykgPT09ICdvbicsXG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgciA9IGF3YWl0IF9mZXRjaEpTT04oQVBJLmludml0ZXMsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHkgfSk7XG4gICAgICAgICAgZXYudGFyZ2V0LnJlc2V0KCk7XG4gICAgICAgICAgb25Jc3N1ZWQgJiYgb25Jc3N1ZWQocik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnSW52aXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChfZWwoJ2xhYmVsJywgeyBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjJweDtmb250LXNpemU6MC44NXJlbScgfSxcbiAgICAgIF9lbCgnc3BhbicsIHsgdGV4dDogJ0VtYWlsJyB9KSxcbiAgICAgIF9lbCgnaW5wdXQnLCB7IG5hbWU6ICdlbWFpbCcsIHR5cGU6ICdlbWFpbCcsIHJlcXVpcmVkOiB0cnVlLCBwbGFjZWhvbGRlcjogJ3VzZXJAZXhhbXBsZS5jb20nLCBzdHlsZTogJ3BhZGRpbmc6NnB4JyB9KSxcbiAgICApKTtcbiAgICBjb25zdCByb2xlU2VsID0gX2VsKCdzZWxlY3QnLCB7IG5hbWU6ICdyb2xlJywgc3R5bGU6ICdwYWRkaW5nOjZweCcgfSk7XG4gICAgZm9yIChjb25zdCByIG9mIFsnb3BlcmF0b3InLCAndmlld2VyJywgJ2FkbWluJ10pIHtcbiAgICAgIHJvbGVTZWwuYXBwZW5kQ2hpbGQoX2VsKCdvcHRpb24nLCB7IHZhbHVlOiByLCB0ZXh0OiByIH0pKTtcbiAgICB9XG4gICAgZm9ybS5hcHBlbmRDaGlsZChfZWwoJ2xhYmVsJywgeyBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjJweDtmb250LXNpemU6MC44NXJlbScgfSxcbiAgICAgIF9lbCgnc3BhbicsIHsgdGV4dDogJ1JvbGUnIH0pLCByb2xlU2VsLFxuICAgICkpO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdsYWJlbCcsIHsgc3R5bGU6ICdkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoycHg7Zm9udC1zaXplOjAuODVyZW0nIH0sXG4gICAgICBfZWwoJ3NwYW4nLCB7IHRleHQ6ICdUVEwgKGhvdXJzKScgfSksXG4gICAgICBfZWwoJ2lucHV0JywgeyBuYW1lOiAndHRsSG91cnMnLCB0eXBlOiAnbnVtYmVyJywgbWluOiAnMScsIG1heDogJzE2OCcsIHZhbHVlOiAnMjQnLCBzdHlsZTogJ3BhZGRpbmc6NnB4O3dpZHRoOjgwcHgnIH0pLFxuICAgICkpO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdsYWJlbCcsIHsgc3R5bGU6ICdkaXNwbGF5OmZsZXg7Z2FwOjRweDthbGlnbi1pdGVtczpjZW50ZXI7Zm9udC1zaXplOjAuODVyZW0nIH0sXG4gICAgICBfZWwoJ2lucHV0JywgeyBuYW1lOiAnc2VuZEVtYWlsJywgdHlwZTogJ2NoZWNrYm94JywgY2hlY2tlZDogdHJ1ZSB9KSxcbiAgICAgIF9lbCgnc3BhbicsIHsgdGV4dDogJ1NlbmQgZW1haWwnIH0pLFxuICAgICkpO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdidXR0b24nLCB7IHR5cGU6ICdzdWJtaXQnLCBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAncGFkZGluZzo2cHggMTJweCcsIHRleHQ6ICdJc3N1ZSBpbnZpdGUnIH0pKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZm9ybSk7XG4gIH1cblxuICBmdW5jdGlvbiBfcmVuZGVySW52aXRlc0xpc3QoY29udGFpbmVyLCBpbnZpdGVzLCBvbkNoYW5nZSkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBpZiAoIWludml0ZXMgfHwgaW52aXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7IHN0eWxlOiAnY29sb3I6dmFyKC0tbXV0ZWQpJywgdGV4dDogJ05vIG91dHN0YW5kaW5nIGludml0ZXMuJyB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gX2VsKCd0YWJsZScsIHtcbiAgICAgIHN0eWxlOiAnd2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1zaXplOjAuOXJlbScsXG4gICAgfSk7XG4gICAgdGFibGUuYXBwZW5kQ2hpbGQoX2VsKCd0aGVhZCcsIG51bGwsXG4gICAgICBfZWwoJ3RyJywgeyBzdHlsZTogJ2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlciknIH0sXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0VtYWlsJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnUm9sZScgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0ludml0ZWQgYnknIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdFeHBpcmVzJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOnJpZ2h0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0FjdGlvbnMnIH0pLFxuICAgICAgKSxcbiAgICApKTtcbiAgICBjb25zdCB0Ym9keSA9IF9lbCgndGJvZHknKTtcbiAgICBmb3IgKGNvbnN0IGludiBvZiBpbnZpdGVzKSB7XG4gICAgICBjb25zdCByb3cgPSBfZWwoJ3RyJywgeyBzdHlsZTogJ2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlciknIH0pO1xuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHgnLCB0ZXh0OiBpbnYuZW1haWwgfSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHgnIH0sIF9yZW5kZXJCYWRnZShpbnYucm9sZSkpKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4O2NvbG9yOnZhcigtLW11dGVkKScsIHRleHQ6IGludi5pbnZpdGVkQnkgfHwgJ1x1MjAxNCcgfSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7XG4gICAgICAgIHN0eWxlOiAncGFkZGluZzo4cHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjg1cmVtJyxcbiAgICAgICAgdGV4dDogaW52LmV4cGlyZXNBdCA/IG5ldyBEYXRlKGludi5leHBpcmVzQXQpLnRvTG9jYWxlU3RyaW5nKCkgOiAnXHUyMDE0JyxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGFjdGlvbnNDZWxsID0gX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweDt0ZXh0LWFsaWduOnJpZ2h0JyB9KTtcbiAgICAgIGFjdGlvbnNDZWxsLmFwcGVuZENoaWxkKF9lbCgnYnV0dG9uJywge1xuICAgICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAncGFkZGluZzoycHggOHB4JyxcbiAgICAgICAgdGV4dDogJ1Jldm9rZScsXG4gICAgICAgIG9uY2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oJ1Jldm9rZSBpbnZpdGUgZm9yICcgKyBpbnYuZW1haWwgKyAnPycpKSByZXR1cm47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IF9mZXRjaEpTT04oQVBJLmludml0ZXMgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQoaW52LmlkKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgICAgICAgb25DaGFuZ2UgJiYgb25DaGFuZ2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnUmV2b2tlIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKGFjdGlvbnNDZWxsKTtcbiAgICAgIHRib2R5LmFwcGVuZENoaWxkKHJvdyk7XG4gICAgfVxuICAgIHRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlcklzc3VlZEludml0ZUJhbm5lcihpbnZpdGUsIHBhcmVudCkge1xuICAgIGNvbnN0IGJhbm5lciA9IF9lbCgnZGl2Jywge1xuICAgICAgc3R5bGU6ICdtYXJnaW4tdG9wOjEycHg7cGFkZGluZzoxMnB4O2JvcmRlcjoxcHggc29saWQgIzE2YTM0YTtib3JkZXItcmFkaXVzOjZweDtiYWNrZ3JvdW5kOiMwNTJlMWE7Y29sb3I6I2JiZjdkMDtmb250LXNpemU6MC44NXJlbScsXG4gICAgfSk7XG4gICAgYmFubmVyLmFwcGVuZENoaWxkKF9lbCgnc3Ryb25nJywgeyB0ZXh0OiAnSW52aXRlIGlzc3VlZCBcdTIwMTQgY29weSB0aGUgbGluayBiZWxvdy4gJyArXG4gICAgICAnSXQgd2lsbCBub3QgYmUgc2hvd24gYWdhaW4uJyB9KSk7XG4gICAgYmFubmVyLmFwcGVuZENoaWxkKF9lbCgnYnInKSk7XG4gICAgYmFubmVyLmFwcGVuZENoaWxkKF9lbCgnY29kZScsIHtcbiAgICAgIHN0eWxlOiAnZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjhweDtwYWRkaW5nOjhweDtiYWNrZ3JvdW5kOiMwMDA7Ym9yZGVyLXJhZGl1czo0cHg7d29yZC1icmVhazpicmVhay1hbGw7Y29sb3I6I2QxZmFlNScsXG4gICAgICB0ZXh0OiBpbnZpdGUuYWNjZXB0VXJsLFxuICAgIH0pKTtcbiAgICBjb25zdCBjb3B5QnRuID0gX2VsKCdidXR0b24nLCB7XG4gICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAnbWFyZ2luLXRvcDo4cHg7cGFkZGluZzo0cHggMTBweCcsXG4gICAgICB0ZXh0OiAnQ29weSBsaW5rJyxcbiAgICAgIG9uY2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChpbnZpdGUuYWNjZXB0VXJsKTtcbiAgICAgICAgICBjb3B5QnRuLnRleHRDb250ZW50ID0gJ0NvcGllZCEnO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBjb3B5QnRuLnRleHRDb250ZW50ID0gJ0NvcHkgbGluayc7IH0sIDIwMDApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ0NsaXBib2FyZCBibG9ja2VkOiBzZWxlY3QgdGhlIGxpbmsgbWFudWFsbHkuJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgYmFubmVyLmFwcGVuZENoaWxkKGNvcHlCdG4pO1xuICAgIGlmIChpbnZpdGUuZGVsaXZlcmVkVmlhID09PSAnZGV2LWNvbnNvbGUnKSB7XG4gICAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywge1xuICAgICAgICBzdHlsZTogJ21hcmdpbi10b3A6OHB4O2NvbG9yOiNmYmJmMjQ7Zm9udC1zaXplOjAuOHJlbScsXG4gICAgICAgIHRleHQ6ICdTTVRQIG5vdCBjb25maWd1cmVkIFx1MjAxNCB0aGUgaW52aXRlIHdhcyBsb2dnZWQgdG8gdGhlIHNlcnZlciBjb25zb2xlIChzZWFyY2ggZm9yIFtEQy0wNDgtREVWLUlOVklURS1MSU5LXSkuJyxcbiAgICAgIH0pKTtcbiAgICB9IGVsc2UgaWYgKGludml0ZS5kZWxpdmVyZWRWaWEgPT09ICdlbWFpbCcpIHtcbiAgICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7XG4gICAgICAgIHN0eWxlOiAnbWFyZ2luLXRvcDo4cHg7Y29sb3I6Izg2ZWZhYztmb250LXNpemU6MC44cmVtJyxcbiAgICAgICAgdGV4dDogJ0VtYWlsIHNlbnQgdG8gJyArIGludml0ZS5lbWFpbCArICcuJyxcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKGJhbm5lcik7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIGFkbWluIHBhbmVsLiBDYWxsZWQgYnkgdGhlIG9wZW4gdHJpZ2dlcjsgc2FmZSB0byBjYWxsIG11bHRpcGxlXG4gICAqIHRpbWVzIChyZS1yZW5kZXJzIGludG8gdGhlIHNhbWUgY29udGFpbmVyKS5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIG1vdW50KGNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdoMicsIHsgc3R5bGU6ICdtYXJnaW46MCAwIDE2cHgnLCB0ZXh0OiAnQWRtaW4gXHUwMEI3IFVzZXJzICYgSW52aXRlcycgfSkpO1xuXG4gICAgY29uc3QgbWVEYXRhID0gYXdhaXQgX2ZldGNoSlNPTihBUEkubWUpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIGlmICghbWVEYXRhIHx8ICFtZURhdGEudXNlciB8fCBtZURhdGEudXNlci5yb2xlICE9PSAnYWRtaW4nKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywge1xuICAgICAgICBzdHlsZTogJ2NvbG9yOnZhcigtLW11dGVkKScsXG4gICAgICAgIHRleHQ6ICdBZG1pbiByb2xlIHJlcXVpcmVkIHRvIHZpZXcgdGhpcyBwYW5lbC4gSWYgbXVsdGktdXNlciBtb2RlIGlzIGVuYWJsZWQgYW5kIHlvdSBzaG91bGQgaGF2ZSBhY2Nlc3MsIGNoZWNrIC9hcGkvdjEvYXV0aC9tZS4nLFxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlZnJlc2ggYnV0dG9uXG4gICAgY29uc3QgcmVmcmVzaEJ0biA9IF9lbCgnYnV0dG9uJywge1xuICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ2Zsb2F0OnJpZ2h0O3BhZGRpbmc6NHB4IDEwcHgnLFxuICAgICAgdGV4dDogJ1JlZnJlc2gnLFxuICAgICAgb25jbGljazogKCkgPT4gbW91bnQoY29udGFpbmVyKSxcbiAgICB9KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocmVmcmVzaEJ0bik7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgVXNlcnMgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb25zdCB1c2Vyc0hlYWRlciA9IF9lbCgnaDMnLCB7IHN0eWxlOiAnbWFyZ2luOjI0cHggMCA4cHg7Y2xlYXI6Ym90aCcsIHRleHQ6ICdVc2VycycgfSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJzSGVhZGVyKTtcblxuICAgIGNvbnN0IHVzZXJzTGlzdCA9IF9lbCgnZGl2JywgeyBpZDogJ2FkbWluLXVzZXJzLWxpc3QnIH0pO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh1c2Vyc0xpc3QpO1xuXG4gICAgY29uc3QgdXNlcnNEYXRhID0gYXdhaXQgX2ZldGNoSlNPTihBUEkudXNlcnMpLmNhdGNoKCgpID0+ICh7IHVzZXJzOiBbXSB9KSk7XG4gICAgX3JlbmRlclVzZXJzTGlzdCh1c2Vyc0xpc3QsIHVzZXJzRGF0YS51c2VycywgKCkgPT4gbW91bnQoY29udGFpbmVyKSk7XG5cbiAgICAvLyBBZGQgdXNlciBmb3JtIChwcmUtYXV0aG9yaXplIGFuIGVtYWlsIHdpdGhvdXQgaXNzdWluZyBhbiBpbnZpdGUpLlxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ2g0JywgeyBzdHlsZTogJ21hcmdpbjoyNHB4IDAgOHB4O2ZvbnQtc2l6ZTowLjk1cmVtJywgdGV4dDogJ1ByZS1hdXRob3JpemUgZW1haWwnIH0pKTtcbiAgICBjb25zdCBhZGRVc2VyRm9ybSA9IF9lbCgnZm9ybScsIHtcbiAgICAgIHN0eWxlOiAnZGlzcGxheTpmbGV4O2dhcDo4cHg7YWxpZ24taXRlbXM6ZW5kJyxcbiAgICAgIG9uc3VibWl0OiBhc3luYyAoZXYpID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZW1haWwgPSBldi50YXJnZXQuZW1haWwudmFsdWUudHJpbSgpO1xuICAgICAgICBpZiAoIWVtYWlsKSByZXR1cm47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgX2ZldGNoSlNPTihBUEkudXNlcnMsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IHsgZW1haWwgfSB9KTtcbiAgICAgICAgICBldi50YXJnZXQucmVzZXQoKTtcbiAgICAgICAgICBtb3VudChjb250YWluZXIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ0FkZCBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGFkZFVzZXJGb3JtLmFwcGVuZENoaWxkKF9lbCgnaW5wdXQnLCB7IG5hbWU6ICdlbWFpbCcsIHR5cGU6ICdlbWFpbCcsIHJlcXVpcmVkOiB0cnVlLCBwbGFjZWhvbGRlcjogJ3VzZXJAZXhhbXBsZS5jb20nLCBzdHlsZTogJ3BhZGRpbmc6NnB4JyB9KSk7XG4gICAgYWRkVXNlckZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdidXR0b24nLCB7IHR5cGU6ICdzdWJtaXQnLCBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAncGFkZGluZzo2cHggMTJweCcsIHRleHQ6ICdBZGQgdG8gYWxsb3dsaXN0JyB9KSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGFkZFVzZXJGb3JtKTtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBJbnZpdGVzIHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgnaDMnLCB7IHN0eWxlOiAnbWFyZ2luOjI0cHggMCA4cHgnLCB0ZXh0OiAnSXNzdWUgaW52aXRlJyB9KSk7XG4gICAgY29uc3QgaW52aXRlRm9ybUNvbnRhaW5lciA9IF9lbCgnZGl2Jyk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGludml0ZUZvcm1Db250YWluZXIpO1xuXG4gICAgY29uc3QgaW52aXRlc0xpc3QgPSBfZWwoJ2RpdicsIHsgaWQ6ICdhZG1pbi1pbnZpdGVzLWxpc3QnLCBzdHlsZTogJ21hcmdpbi10b3A6MTZweCcgfSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGludml0ZXNMaXN0KTtcblxuICAgIGNvbnN0IGludml0ZXNEYXRhID0gYXdhaXQgX2ZldGNoSlNPTihBUEkuaW52aXRlcykuY2F0Y2goKCkgPT4gKHsgaW52aXRlczogW10gfSkpO1xuICAgIF9yZW5kZXJJbnZpdGVzTGlzdChpbnZpdGVzTGlzdCwgaW52aXRlc0RhdGEuaW52aXRlcywgKCkgPT4gbW91bnQoY29udGFpbmVyKSk7XG5cbiAgICBfcmVuZGVySW52aXRlRm9ybShpbnZpdGVGb3JtQ29udGFpbmVyLCAoaXNzdWVkKSA9PiB7XG4gICAgICBfcmVuZGVySXNzdWVkSW52aXRlQmFubmVyKGlzc3VlZCwgaW52aXRlRm9ybUNvbnRhaW5lcik7XG4gICAgICBtb3VudChjb250YWluZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFB1YmxpYyBBUEkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGFkbWluIHBhbmVsIGFzIGEgbW9kYWwgb3ZlcmxheS4gQ2xvc2VzIG9uIGJhY2tkcm9wIGNsaWNrIG9yXG4gICAqIHRoZSBjbG9zZSBidXR0b24uIFJlbmRlcnMgaW50byBkb2N1bWVudC5ib2R5IHNvIGl0IGZsb2F0cyBhYm92ZSB0aGVcbiAgICogZGFzaGJvYXJkIGNocm9tZS5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIG9wZW4oKSB7XG4gICAgLy8gSWYgYWxyZWFkeSBvcGVuLCBqdXN0IGZvY3VzLlxuICAgIGNvbnN0IGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluLXBhbmVsLXJvb3QnKTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybjtcblxuICAgIGNvbnN0IGJhY2tkcm9wID0gX2VsKCdkaXYnLCB7XG4gICAgICBpZDogJ2FkbWluLXBhbmVsLXJvb3QnLFxuICAgICAgc3R5bGU6ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7JyxcbiAgICAgIG9uY2xpY2s6IChldikgPT4ge1xuICAgICAgICBpZiAoZXYudGFyZ2V0ID09PSBiYWNrZHJvcCkgY2xvc2UoKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBjYXJkID0gX2VsKCdkaXYnLCB7XG4gICAgICBzdHlsZTogJ2JhY2tncm91bmQ6dmFyKC0tY2FyZC1iYXNlLCMxZjI5MzcpO2NvbG9yOnZhcigtLXRleHQsI2YzZjRmNik7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoyNHB4O21heC13aWR0aDo5MDBweDt3aWR0aDo5MCU7bWF4LWhlaWdodDo4NXZoO292ZXJmbG93OmF1dG87cG9zaXRpb246cmVsYXRpdmU7Ym94LXNoYWRvdzowIDEwcHggMzBweCByZ2JhKDAsMCwwLDAuMyknLFxuICAgIH0pO1xuICAgIGNhcmQuYXBwZW5kQ2hpbGQoX2VsKCdidXR0b24nLCB7XG4gICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAncG9zaXRpb246YWJzb2x1dGU7dG9wOjEycHg7cmlnaHQ6MTJweDtwYWRkaW5nOjRweCAxMHB4JyxcbiAgICAgIHRleHQ6ICdDbG9zZScsIG9uY2xpY2s6IGNsb3NlLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGJvZHkgPSBfZWwoJ2RpdicsIHsgaWQ6ICdhZG1pbi1wYW5lbC1ib2R5JyB9KTtcbiAgICBjYXJkLmFwcGVuZENoaWxkKGJvZHkpO1xuICAgIGJhY2tkcm9wLmFwcGVuZENoaWxkKGNhcmQpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYmFja2Ryb3ApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1vdW50KGJvZHkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGJvZHkuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6I2Y4NzE3MVwiPkZhaWxlZCB0byBsb2FkIGFkbWluIHBhbmVsOiAnICsgKGUubWVzc2FnZSB8fCBlKSArICc8L3A+JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbi1wYW5lbC1yb290Jyk7XG4gICAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmplY3QgYW4gXCJBZG1pblwiIGJ1dHRvbiBpbnRvIHRoZSB0b3AgYmFyLiBPbmx5IHJlbmRlcnMgd2hlbiB0aGVcbiAgICogY3VycmVudCAvbWUgcmVzcG9uc2Ugc2F5cyBpc0FkbWluPXRydWUuIFJlLWNoZWNrcyBwZXJpb2RpY2FsbHlcbiAgICogKGV2ZXJ5IDYwcykgc28gYSBwZXJtaXNzaW9uIGRvd25ncmFkZSB0YWtlcyBlZmZlY3Qgd2l0aG91dCBhIHJlbG9hZC5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGF0dGFjaFRyaWdnZXIoYmFyQ29udGFpbmVyKSB7XG4gICAgYXN5bmMgZnVuY3Rpb24gX21heWJlU2hvdygpIHtcbiAgICAgIGNvbnN0IG1lID0gYXdhaXQgX2ZldGNoSlNPTihBUEkubWUpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW4tdHJpZ2dlci1idG4nKTtcbiAgICAgIGlmIChtZSAmJiBtZS51c2VyICYmIG1lLnVzZXIucm9sZSA9PT0gJ2FkbWluJykge1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHJldHVybjtcbiAgICAgICAgY29uc3QgYnRuID0gX2VsKCdidXR0b24nLCB7XG4gICAgICAgICAgaWQ6ICdhZG1pbi10cmlnZ2VyLWJ0bicsXG4gICAgICAgICAgY2xhc3M6ICdidG4tc20nLFxuICAgICAgICAgIHN0eWxlOiAnbWFyZ2luLWxlZnQ6OHB4O3BhZGRpbmc6NnB4IDEycHgnLFxuICAgICAgICAgIHRleHQ6ICdBZG1pbicsXG4gICAgICAgICAgb25jbGljazogb3BlbixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChiYXJDb250YWluZXIpIGJhckNvbnRhaW5lci5hcHBlbmRDaGlsZChidG4pO1xuICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5ib2R5KSBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJ0bik7XG4gICAgICB9IGVsc2UgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIGV4aXN0aW5nLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBfbWF5YmVTaG93KCk7XG4gICAgc2V0SW50ZXJ2YWwoX21heWJlU2hvdywgNjBfMDAwKTtcbiAgfVxuXG4gIHdpbmRvdy5BZG1pblBhbmVsID0geyBvcGVuLCBjbG9zZSwgYXR0YWNoVHJpZ2dlciB9O1xufSkoKTs7XG4vLyA9PT09PT09PT09IENSRURFTlRJQUwgTUFOQUdFTUVOVCA9PT09PT09PT09XG4oZnVuY3Rpb24gKCkge1xuXG4gIC8vIEluamVjdCBza2VsZXRvbiBtb2RhbCBcdTIwMTQgY3JlZGVudGlhbCBzZWN0aW9ucyBhcmUgYnVpbHQgZHluYW1pY2FsbHkgd2hlbiBvcGVuZWRcbiAgaW5qZWN0TW9kYWwoJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnLCBgXG4gIDxkaXYgaWQ9XCJ0b2tlbi1tYW5hZ2VtZW50LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA1MDBweDsgbWF4LXdpZHRoOiA2MDBweDtcIj5cbiAgICAgIDxoMz5cXHV7MUY1MTF9IEROUyBDcmVkZW50aWFsczwvaDM+XG5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICBFbnRlciBUZWNobml0aXVtIEROUyBsb2dpbiBjcmVkZW50aWFscy4gUmVhZC1vbmx5IGFjY291bnRzIGFyZSB1c2VkIGZvciBsb2dzOyBhZG1pbiBhY2NvdW50cyBmb3IgcmVzdGFydHMsIHJlY29yZHMsIGFuZCB1cGRhdGVzLlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IGlkPVwiZG5zLWNyZWQtc2VjdGlvbnNcIj48L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b2tlbi1jbGVhci1hbGxcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogYXV0bzsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWJhZC1mZykgMTUlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+Q2xlYXIgQWxsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b2tlbi1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRva2VuLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5TYXZlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIGApO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBIZWxwZXJzIFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGdldERuc0lkcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzIHx8IHt9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERuc0Rpc3BsYXlOYW1lKGRuc0lkKSB7XG4gICAgY29uc3Qgc2VydmVyID0gKFNJVEUuZG5zU2VydmVycyB8fCB7fSlbZG5zSWRdO1xuICAgIHJldHVybiBzZXJ2ZXI/Lm5hbWUgfHwgZG5zSWQudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBwZXItc2VydmVyIGNyZWRlbnRpYWwgZm9ybSBzZWN0aW9ucyBmcm9tIFNJVEUuZG5zU2VydmVycyAqL1xuICBmdW5jdGlvbiBidWlsZENyZWRlbnRpYWxTZWN0aW9ucygpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWNyZWQtc2VjdGlvbnMnKTtcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgIGNvbnN0IGRuc0lkcyA9IGdldERuc0lkcygpO1xuICAgIGlmIChkbnNJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxwIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPk5vIEROUyBzZXJ2ZXJzIGNvbmZpZ3VyZWQuPC9wPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpZCBvZiBkbnNJZHMpIHtcbiAgICAgIGNvbnRhaW5lci5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1zZWN0aW9uXCI+XG4gICAgICAgIDxoNCBjbGFzcz1cInRva2VuLXNlY3Rpb24tdGl0bGVcIj4ke2dldERuc0Rpc3BsYXlOYW1lKGlkKX08L2g0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4tZ3JpZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1maWVsZFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cIiR7aWR9LXJlYWRvbmx5LXVzZXJuYW1lXCI+XFx1ezFGNEQ2fSBSZWFkLU9ubHkgKExvZ3MpOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIiR7aWR9LXJlYWRvbmx5LXVzZXJuYW1lXCIgcGxhY2Vob2xkZXI9XCJVc2VybmFtZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNHB4O1wiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4taW5wdXQtcm93XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiR7aWR9LXJlYWRvbmx5LXRva2VuXCIgcGxhY2Vob2xkZXI9XCJQYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidG9rZW4tdG9nZ2xlXCIgZGF0YS10YXJnZXQ9XCIke2lkfS1yZWFkb25seS10b2tlblwiPlxcdXsxRjQ0MX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1maWVsZFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cIiR7aWR9LWFkbWluLXVzZXJuYW1lXCI+XFx1ezFGNTI3fSBBZG1pbjo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIke2lkfS1hZG1pbi11c2VybmFtZVwiIHBsYWNlaG9sZGVyPVwiVXNlcm5hbWVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDRweDtcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLWlucHV0LXJvd1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCIke2lkfS1hZG1pbi10b2tlblwiIHBsYWNlaG9sZGVyPVwiUGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRva2VuLXRvZ2dsZVwiIGRhdGEtdGFyZ2V0PVwiJHtpZH0tYWRtaW4tdG9rZW5cIj5cXHV7MUY0NDF9PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1zdGF0dXNcIiBpZD1cIiR7aWR9LXRva2VuLXN0YXR1c1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICBgKTtcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgQ3JlZGVudGlhbCBlbmNyeXB0aW9uIFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGdldEVuY3J5cHRpb25LZXkoKSB7XG4gICAgbGV0IGtleSA9IHNhZmVTZXNzaW9uR2V0KCdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknKTtcbiAgICBpZiAoa2V5KSByZXR1cm4ga2V5O1xuXG4gICAgY29uc3Qgb2xkS2V5ID0gc2FmZUdldCgnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5Jyk7XG4gICAgaWYgKG9sZEtleSkge1xuICAgICAgc2FmZVNlc3Npb25TZXQoJ2Rhc2hjYWRkeS1lbmNyeXB0aW9uLWtleScsIG9sZEtleSk7XG4gICAgICBzYWZlUmVtb3ZlKCdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknKTtcbiAgICAgIHJldHVybiBvbGRLZXk7XG4gICAgfVxuXG4gICAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheSgzMik7XG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAga2V5ID0gQXJyYXkuZnJvbShhcnJheSwgYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICBzYWZlU2Vzc2lvblNldCgnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5Jywga2V5KTtcbiAgICByZXR1cm4ga2V5O1xuICB9XG4gIGNvbnN0IEVOQ1JZUFRJT05fS0VZID0gZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gIGZ1bmN0aW9uIGNyZWRlbnRpYWxFbmNyeXB0KHRleHQsIGtleSkge1xuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGl2ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSg4KSk7XG4gICAgY29uc3QgaXZIZXggPSBBcnJheS5mcm9tKGl2LCBiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIGNvbnN0IGtleUJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGtleSArIGl2SGV4KTtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGFyQ29kZSA9IHRleHQuY2hhckNvZGVBdChpKVxuICAgICAgICBeIGtleUJ5dGVzW2kgJSBrZXlCeXRlcy5sZW5ndGhdXG4gICAgICAgIF4gaXZbaSAlIGl2Lmxlbmd0aF1cbiAgICAgICAgXiAoKGkgKiAzMSArIDE3KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgIH1cbiAgICByZXR1cm4gaXZIZXggKyAnOicgKyBidG9hKHJlc3VsdCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVkZW50aWFsRGVjcnlwdChlbmNyeXB0ZWRUZXh0LCBrZXkpIHtcbiAgICBpZiAoIWVuY3J5cHRlZFRleHQpIHJldHVybiAnJztcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29sb25JZHggPSBlbmNyeXB0ZWRUZXh0LmluZGV4T2YoJzonKTtcbiAgICAgIGlmIChjb2xvbklkeCA9PT0gMTYpIHtcbiAgICAgICAgY29uc3QgaXZIZXggPSBlbmNyeXB0ZWRUZXh0LnN1YnN0cmluZygwLCAxNik7XG4gICAgICAgIGNvbnN0IGl2ID0gbmV3IFVpbnQ4QXJyYXkoaXZIZXgubWF0Y2goLy57Mn0vZykubWFwKGggPT4gcGFyc2VJbnQoaCwgMTYpKSk7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBhdG9iKGVuY3J5cHRlZFRleHQuc3Vic3RyaW5nKDE3KSk7XG4gICAgICAgIGNvbnN0IGtleUJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGtleSArIGl2SGV4KTtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlY29kZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGRlY29kZWQuY2hhckNvZGVBdChpKVxuICAgICAgICAgICAgXiBrZXlCeXRlc1tpICUga2V5Qnl0ZXMubGVuZ3RoXVxuICAgICAgICAgICAgXiBpdltpICUgaXYubGVuZ3RoXVxuICAgICAgICAgICAgXiAoKGkgKiAzMSArIDE3KSAmIDB4RkYpO1xuICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgY29uc3QgZGVjb2RlZCA9IGF0b2IoZW5jcnlwdGVkVGV4dCk7XG4gICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlY29kZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBkZWNvZGVkLmNoYXJDb2RlQXQoaSkgXiBrZXkuY2hhckNvZGVBdChpICUga2V5Lmxlbmd0aCk7XG4gICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBDcmVkZW50aWFsIHN0b3JhZ2UgXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCBjcmVkVHlwZSkge1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IHNhZmVHZXQoYCR7ZG5zSWR9LSR7dG9rZW5UeXBlfS0ke2NyZWRUeXBlfS1lbmNgKTtcbiAgICByZXR1cm4gY3JlZGVudGlhbERlY3J5cHQoZW5jcnlwdGVkLCBFTkNSWVBUSU9OX0tFWSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsIGNyZWRUeXBlLCB2YWx1ZSkge1xuICAgIGNvbnN0IGtleSA9IGAke2Ruc0lkfS0ke3Rva2VuVHlwZX0tJHtjcmVkVHlwZX0tZW5jYDtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHNhZmVTZXQoa2V5LCBjcmVkZW50aWFsRW5jcnlwdCh2YWx1ZSwgRU5DUllQVElPTl9LRVkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2FmZVJlbW92ZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRva2VuKGRuc0lkLCB0b2tlblR5cGUpIHtcbiAgICByZXR1cm4gZ2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCAndG9rZW4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFVzZXJuYW1lKGRuc0lkLCB0b2tlblR5cGUpIHtcbiAgICByZXR1cm4gZ2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCAndXNlcm5hbWUnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFRva2VuKGRuc0lkLCB0b2tlblR5cGUsIHRva2VuKSB7XG4gICAgc2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCAndG9rZW4nLCB0b2tlbik7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRVc2VybmFtZShkbnNJZCwgdG9rZW5UeXBlLCB1c2VybmFtZSkge1xuICAgIHNldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgJ3VzZXJuYW1lJywgdXNlcm5hbWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QWxsQ3JlZGVudGlhbHMoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBkbnNJZCBvZiBnZXREbnNJZHMoKSkge1xuICAgICAgcmVzdWx0W2Ruc0lkXSA9IHtcbiAgICAgICAgcmVhZG9ubHk6IHsgdXNlcm5hbWU6IGdldFVzZXJuYW1lKGRuc0lkLCAncmVhZG9ubHknKSwgdG9rZW46IGdldFRva2VuKGRuc0lkLCAncmVhZG9ubHknKSB9LFxuICAgICAgICBhZG1pbjogeyB1c2VybmFtZTogZ2V0VXNlcm5hbWUoZG5zSWQsICdhZG1pbicpLCB0b2tlbjogZ2V0VG9rZW4oZG5zSWQsICdhZG1pbicpIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckFsbENyZWRlbnRpYWxzKCkge1xuICAgIGdldERuc0lkcygpLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgWydyZWFkb25seScsICdhZG1pbiddLmZvckVhY2godG9rZW5UeXBlID0+IHtcbiAgICAgICAgWyd0b2tlbicsICd1c2VybmFtZSddLmZvckVhY2goY3JlZFR5cGUgPT4ge1xuICAgICAgICAgIHNhZmVSZW1vdmUoYCR7ZG5zSWR9LSR7dG9rZW5UeXBlfS0ke2NyZWRUeXBlfS1lbmNgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHNhZmVSZW1vdmUoYCR7ZG5zSWR9LXRva2VuLWVuY2ApO1xuICAgICAgc2FmZVJlbW92ZShgJHtkbnNJZH0tdXNlcm5hbWUtZW5jYCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTdG9yZWRDcmVkZW50aWFscyhkbnNJZCkge1xuICAgIGNvbnN0IHJlYWRvbmx5VG9rZW4gPSBnZXRUb2tlbihkbnNJZCwgJ3JlYWRvbmx5Jyk7XG4gICAgY29uc3QgcmVhZG9ubHlVc2VybmFtZSA9IGdldFVzZXJuYW1lKGRuc0lkLCAncmVhZG9ubHknKTtcbiAgICBjb25zdCBhZG1pblRva2VuID0gZ2V0VG9rZW4oZG5zSWQsICdhZG1pbicpO1xuICAgIGNvbnN0IGFkbWluVXNlcm5hbWUgPSBnZXRVc2VybmFtZShkbnNJZCwgJ2FkbWluJyk7XG4gICAgY29uc3Qgb2xkVG9rZW4gPSBjcmVkZW50aWFsRGVjcnlwdChzYWZlR2V0KGAke2Ruc0lkfS10b2tlbi1lbmNgKSwgRU5DUllQVElPTl9LRVkpO1xuICAgIGNvbnN0IG9sZFVzZXJuYW1lID0gY3JlZGVudGlhbERlY3J5cHQoc2FmZUdldChgJHtkbnNJZH0tdXNlcm5hbWUtZW5jYCksIEVOQ1JZUFRJT05fS0VZKTtcblxuICAgIHJldHVybiB7XG4gICAgICB1c2VybmFtZTogYWRtaW5Vc2VybmFtZSB8fCByZWFkb25seVVzZXJuYW1lIHx8IG9sZFVzZXJuYW1lLFxuICAgICAgdG9rZW46IGFkbWluVG9rZW4gfHwgcmVhZG9ubHlUb2tlbiB8fCBvbGRUb2tlbixcbiAgICAgIHJlYWRvbmx5VG9rZW46IHJlYWRvbmx5VG9rZW4gfHwgb2xkVG9rZW4sXG4gICAgICByZWFkb25seVVzZXJuYW1lOiByZWFkb25seVVzZXJuYW1lIHx8IG9sZFVzZXJuYW1lLFxuICAgICAgYWRtaW5Ub2tlbjogYWRtaW5Ub2tlbiB8fCBvbGRUb2tlbixcbiAgICAgIGFkbWluVXNlcm5hbWU6IGFkbWluVXNlcm5hbWUgfHwgb2xkVXNlcm5hbWVcbiAgICB9O1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIE1vZGFsIGhhbmRsZXJzIFx1MjUwMFx1MjUwMFxuXG4gIC8vIE9wZW4gbW9kYWwgXHUyMDE0IGJ1aWxkIHNlY3Rpb25zIGR5bmFtaWNhbGx5LCBwb3B1bGF0ZSBmcm9tIHN0b3JlZCBjcmVkc1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFuYWdlLXRva2VucycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBidWlsZENyZWRlbnRpYWxTZWN0aW9ucygpO1xuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnKTtcbiAgICBjb25zdCBjcmVkcyA9IGdldEFsbENyZWRlbnRpYWxzKCk7XG5cbiAgICBnZXREbnNJZHMoKS5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgIGNvbnN0IGMgPSBjcmVkc1tkbnNJZF07XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdXNlcm5hbWVgKS52YWx1ZSA9IGMucmVhZG9ubHkudXNlcm5hbWU7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdG9rZW5gKS52YWx1ZSA9IGMucmVhZG9ubHkudG9rZW47XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdXNlcm5hbWVgKS52YWx1ZSA9IGMuYWRtaW4udXNlcm5hbWU7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdG9rZW5gKS52YWx1ZSA9IGMuYWRtaW4udG9rZW47XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnJztcbiAgICB9KTtcblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gVG9nZ2xlIHBhc3N3b3JkIHZpc2liaWxpdHkgKyBiYWNrZHJvcCBjbG9zZSAoZXZlbnQgZGVsZWdhdGlvbiBmb3IgZHluYW1pYyBlbGVtZW50cylcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy50b2tlbi10b2dnbGUnKTtcbiAgICBpZiAoYnRuKSB7XG4gICAgICBjb25zdCB0YXJnZXRJZCA9IGJ0bi5kYXRhc2V0LnRhcmdldDtcbiAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0SWQpO1xuICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgaW5wdXQudHlwZSA9ICd0ZXh0JztcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1xcdXsxRjY0OH0nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXQudHlwZSA9ICdwYXNzd29yZCc7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcXHV7MUY0NDF9JztcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGUudGFyZ2V0LmlkID09PSAndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcpIHtcbiAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFNhdmUgY3JlZGVudGlhbHNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZG5zSWRzID0gZ2V0RG5zSWRzKCk7XG5cbiAgICAvLyBTYXZlIGFsbCB0byBsb2NhbFN0b3JhZ2VcbiAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICBzZXRVc2VybmFtZShkbnNJZCwgJ3JlYWRvbmx5JywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXVzZXJuYW1lYCkudmFsdWUudHJpbSgpKTtcbiAgICAgIHNldFRva2VuKGRuc0lkLCAncmVhZG9ubHknLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdG9rZW5gKS52YWx1ZS50cmltKCkpO1xuICAgICAgc2V0VXNlcm5hbWUoZG5zSWQsICdhZG1pbicsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi11c2VybmFtZWApLnZhbHVlLnRyaW0oKSk7XG4gICAgICBzZXRUb2tlbihkbnNJZCwgJ2FkbWluJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXRva2VuYCkudmFsdWUudHJpbSgpKTtcbiAgICB9KTtcblxuICAgIC8vIEJ1aWxkIHBlci1zZXJ2ZXIgY3JlZGVudGlhbHMgcGF5bG9hZCBmb3IgYmFja2VuZCBzeW5jXG4gICAgY29uc3Qgc2VydmVycyA9IHt9O1xuICAgIGxldCBoYXNBbnlDcmVkcyA9IGZhbHNlO1xuXG4gICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSB7fTtcbiAgICAgIGNvbnN0IHJvVXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS11c2VybmFtZWApLnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IHJvUGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS10b2tlbmApLnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IGFkbWluVXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi11c2VybmFtZWApLnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IGFkbWluUGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi10b2tlbmApLnZhbHVlLnRyaW0oKTtcblxuICAgICAgaWYgKHJvVXNlciAmJiByb1Bhc3MpIHtcbiAgICAgICAgZW50cnkucmVhZG9ubHkgPSB7IHVzZXJuYW1lOiByb1VzZXIsIHBhc3N3b3JkOiByb1Bhc3MgfTtcbiAgICAgICAgaGFzQW55Q3JlZHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFkbWluVXNlciAmJiBhZG1pblBhc3MpIHtcbiAgICAgICAgZW50cnkuYWRtaW4gPSB7IHVzZXJuYW1lOiBhZG1pblVzZXIsIHBhc3N3b3JkOiBhZG1pblBhc3MgfTtcbiAgICAgICAgaGFzQW55Q3JlZHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKE9iamVjdC5rZXlzKGVudHJ5KS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNlcnZlcnNbZG5zSWRdID0gZW50cnk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaGFzQW55Q3JlZHMpIHtcbiAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgaWYgKHNlcnZlcnNbZG5zSWRdKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJ1ZlcmlmeWluZy4uLic7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMnO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZG5zL2NyZWRlbnRpYWxzJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmVycyB9KVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgaWYgKGRhdGEucmVzdWx0cykge1xuICAgICAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApO1xuICAgICAgICAgICAgaWYgKCFzZXJ2ZXJzW2Ruc0lkXSkgeyBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnOyByZXR1cm47IH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRhdGEucmVzdWx0c1tkbnNJZF07XG4gICAgICAgICAgICBpZiAocmVzdWx0Py5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1xcdTI3MTMgVmVyaWZpZWQgJiBzYXZlZCc7XG4gICAgICAgICAgICAgIHN0YXR1c0VsLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgc3VjY2Vzcyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdD8ucGFydGlhbCkge1xuICAgICAgICAgICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcXHUyNzEzICcgKyByZXN1bHQucGFydGlhbDtcbiAgICAgICAgICAgICAgc3RhdHVzRWwuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyBzdWNjZXNzJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1xcdTI3MTcgJyArIChyZXN1bHQ/LmVycm9yIHx8ICdMb2dpbiBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgc3RhdHVzRWwuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyBlcnJvcic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICAgICAgaWYgKHNlcnZlcnNbZG5zSWRdKSB7XG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICdcXHUyNzEzIFNhdmVkJztcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgc3VjY2Vzcyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICAgICAgaWYgKHNlcnZlcnNbZG5zSWRdKSB7XG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICdcXHUyNzE3ICcgKyAoZGF0YS5lcnJvciB8fCAnRmFpbGVkJyk7XG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzIGVycm9yJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3luYyBETlMgY3JlZGVudGlhbHMgdG8gYmFja2VuZDonLCBlKTtcbiAgICAgICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICAgIGlmIChzZXJ2ZXJzW2Ruc0lkXSkge1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJ1xcdTI3MTMgU2F2ZWQgbG9jYWxseSAoc3luYyBmYWlsZWQpJztcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXV0by1jbG9zZSBhZnRlciBkZWxheSBpZiBhbGwgc3VjY2VlZGVkXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBhbGxHb29kID0gZG5zSWRzLmV2ZXJ5KGRuc0lkID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApPy50ZXh0Q29udGVudDtcbiAgICAgICAgcmV0dXJuICFzdGF0dXMgfHwgc3RhdHVzLmluY2x1ZGVzKCdcXHUyNzEzJyk7XG4gICAgICB9KTtcbiAgICAgIGlmIChhbGxHb29kKSBjbG9zZU1vZGFsKCd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyk7XG4gICAgfSwgMTUwMCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbi1jYW5jZWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY2xvc2VNb2RhbCgndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcpO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW4tY2xlYXItYWxsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maXJtKCdDbGVhciBhbGwgc3RvcmVkIEROUyBjcmVkZW50aWFscz8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicpKSB7XG4gICAgICBjbGVhckFsbENyZWRlbnRpYWxzKCk7XG4gICAgICBnZXREbnNJZHMoKS5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXVzZXJuYW1lYCkudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXRva2VuYCkudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXVzZXJuYW1lYCkudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXRva2VuYCkudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJ1xcdTI3MTMgQ2xlYXJlZCc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzIHN1Y2Nlc3MnO1xuICAgICAgfSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9kbnMvY3JlZGVudGlhbHMnLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFdpbmRvdyBleHBvcnRzIFx1MjUwMFx1MjUwMFxuICB3aW5kb3cuZ2V0VG9rZW4gPSBnZXRUb2tlbjtcbiAgd2luZG93LmdldFVzZXJuYW1lID0gZ2V0VXNlcm5hbWU7XG4gIHdpbmRvdy5zZXRUb2tlbiA9IHNldFRva2VuO1xuICB3aW5kb3cuc2V0VXNlcm5hbWUgPSBzZXRVc2VybmFtZTtcbiAgd2luZG93LmdldEFsbENyZWRlbnRpYWxzID0gZ2V0QWxsQ3JlZGVudGlhbHM7XG4gIHdpbmRvdy5nZXRDcmVkZW50aWFsID0gZ2V0Q3JlZGVudGlhbDtcbiAgd2luZG93LnNldENyZWRlbnRpYWwgPSBzZXRDcmVkZW50aWFsO1xuICB3aW5kb3cuZ2V0RW5jcnlwdGlvbktleSA9IGdldEVuY3J5cHRpb25LZXk7XG4gIHdpbmRvdy5nZXREbnNJZHMgPSBnZXREbnNJZHM7XG4gIHdpbmRvdy5nZXREbnNEaXNwbGF5TmFtZSA9IGdldERuc0Rpc3BsYXlOYW1lO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBHUklEICYgU1RBVFVTIEhFTFBFUlMgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBzdGF0dXNMYWJlbCh1cCkge1xuICAgIGNvbnN0IGkxOG4gPSB3aW5kb3cuRENJMThuO1xuICAgIGlmICghaTE4biB8fCAhaTE4bi5pc0xvYWRlZCgpKSByZXR1cm4gdXAgPyAnT04nIDogJ09GRic7XG4gICAgcmV0dXJuIGkxOG4udCh1cCA/ICdjYXJkLnN0YXR1cy5vbicgOiAnY2FyZC5zdGF0dXMub2ZmJyk7XG4gIH1cblxuICAvKiBFbmhhbmNlZCBzdGF0dXMgaGVscGVycyB3aXRoIHJlc3BvbnNlIHRpbWUgdHJhY2tpbmcgKi9cbiAgZnVuY3Rpb24gc2V0UXVpY2soaWQsIHVwLCByZXNwb25zZVRpbWUgPSBudWxsKSB7XG4gICAgY29uc3QgZG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAnLWRvdCcpO1xuICAgIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCArICctcGlsbCcpO1xuICAgIGNvbnN0IHRpbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgJy10aW1lJyk7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFwcD1cIiR7aWR9XCJdYCk7XG5cbiAgICBpZiAoZG90KSB7XG4gICAgICBkb3QuY2xhc3NMaXN0LnRvZ2dsZSgnb2snLCB1cCk7XG4gICAgICBkb3QuY2xhc3NMaXN0LnRvZ2dsZSgnYmFkJywgIXVwKTtcbiAgICB9XG5cbiAgICBpZiAocGlsbCkge1xuICAgICAgcGlsbC50ZXh0Q29udGVudCA9IHN0YXR1c0xhYmVsKHVwKTtcbiAgICAgIHBpbGwuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCB1cCk7XG4gICAgICBwaWxsLmNsYXNzTGlzdC50b2dnbGUoJ29mZicsICF1cCk7XG4gICAgfVxuXG4gICAgaWYgKHRpbWVFbCAmJiByZXNwb25zZVRpbWUgIT09IG51bGwpIHtcbiAgICAgIHRpbWVFbC50ZXh0Q29udGVudCA9IHVwID8gYCR7cmVzcG9uc2VUaW1lfW1zYCA6ICd0aW1lb3V0JztcbiAgICAgIHRpbWVFbC5jbGFzc05hbWUgPSBgcmVzcG9uc2UtdGltZSAke2dldFJlc3BvbnNlVGltZUNsYXNzKHJlc3BvbnNlVGltZSwgdXApfWA7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGNhcmQgc3RhdHVzIGZvciBpY29uIGNvbG9yaW5nXG4gICAgaWYgKGNhcmQpIHtcbiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLXN0YXR1cycsIHVwID8gJ29uJyA6ICdvZmYnKTtcbiAgICB9XG5cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJlc3BvbnNlVGltZUNsYXNzKHRpbWUsIGlzVXApIHtcbiAgICBpZiAoIWlzVXApIHJldHVybiAndGltZW91dCc7XG4gICAgaWYgKHRpbWUgPCAyMDApIHJldHVybiAnZXhjZWxsZW50JztcbiAgICBpZiAodGltZSA8IDUwMCkgcmV0dXJuICdnb29kJztcbiAgICBpZiAodGltZSA8IDEwMDApIHJldHVybiAnZmFpcic7XG4gICAgcmV0dXJuICdzbG93JztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrU2VydmljZVdpdGhUaW1pbmcoaWQpIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvcHJvYmUvJyArIGlkLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgY29uc3QgZW5kVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgY29uc3QgcmVzcG9uc2VUaW1lID0gTWF0aC5yb3VuZChlbmRUaW1lIC0gc3RhcnRUaW1lKTtcbiAgICAgIGNvbnN0IGlzVXAgPSAoci5zdGF0dXMgPj0gMjAwICYmIHIuc3RhdHVzIDwgNDAwKSB8fCByLnN0YXR1cyA9PT0gNDAxIHx8IHIuc3RhdHVzID09PSA0MDM7XG4gICAgICByZXR1cm4geyBpc1VwLCByZXNwb25zZVRpbWUgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlVGltZSA9IE1hdGgucm91bmQoZW5kVGltZSAtIHN0YXJ0VGltZSk7XG4gICAgICByZXR1cm4geyBpc1VwOiBmYWxzZSwgcmVzcG9uc2VUaW1lIH07XG4gICAgfVxuICB9XG5cbiAgLyogQXBwIGdyaWQgLSBsb2FkZWQgZnJvbSBBUEkgKi9cbiAgd2luZG93LkFQUFMgPSBbXTsgLy8gVXNlIHdpbmRvdy5BUFBTIGFzIHRoZSBtYWluIGFycmF5XG4gIGxldCByZWZyZXNoSW5GbGlnaHQgPSBudWxsO1xuICBsZXQgcmVmcmVzaFF1ZXVlZCA9IGZhbHNlO1xuXG4gIC8vIExvYWQgc2VydmljZXMgZnJvbSBBUElcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFNlcnZpY2VzKCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAod2luZG93LlNrZWxldG9uTG9hZGVyKSB3aW5kb3cuU2tlbGV0b25Mb2FkZXIuc2hvdyg2KTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VydmljZXMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgLy8gU3RhbmRhcmQgZW52ZWxvcGU6IHsgc3VjY2VzczogdHJ1ZSwgc2VydmljZXM6IFsuLi5dLCBwYWdpbmF0aW9uPzogey4uLn0gfVxuICAgICAgICB3aW5kb3cuQVBQUyA9IHJlc3VsdC5zZXJ2aWNlcyB8fCBbXTtcbiAgICAgICAgaWYgKHdpbmRvdy5Ta2VsZXRvbkxvYWRlcikgd2luZG93LlNrZWxldG9uTG9hZGVyLmhpZGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHNlcnZpY2VzOicsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgIGlmICh3aW5kb3cuU2tlbGV0b25Mb2FkZXIpIHdpbmRvdy5Ta2VsZXRvbkxvYWRlci5oaWRlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHNlcnZpY2VzOicsIGVycm9yKTtcbiAgICAgIGlmICh3aW5kb3cuU2tlbGV0b25Mb2FkZXIpIHdpbmRvdy5Ta2VsZXRvbkxvYWRlci5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2VydmljZVVybChpZCkge1xuICAgIGNvbnN0IHN2YyA9IHdpbmRvdy5BUFBTPy5maW5kKGEgPT4gYS5pZCA9PT0gaWQpO1xuICAgIGlmIChzdmM/LnVybCkgcmV0dXJuIHN2Yy51cmwuc3RhcnRzV2l0aCgnaHR0cCcpID8gc3ZjLnVybCA6ICdodHRwczovLycgKyBzdmMudXJsO1xuICAgIGlmIChzdmM/LmlzRXh0ZXJuYWwgJiYgc3ZjLmV4dGVybmFsVXJsKSByZXR1cm4gc3ZjLmV4dGVybmFsVXJsO1xuICAgIGNvbnN0IGRucyA9IFNJVEUuZG5zU2VydmVycz8uW2lkXTtcbiAgICBpZiAoZG5zKSByZXR1cm4gJ2h0dHA6Ly8nICsgZG5zLmlwICsgJzonICsgKGRucy5wb3J0IHx8IDUzODApO1xuICAgIHJldHVybiBidWlsZFNlcnZpY2VVcmwoaWQpO1xuICB9XG4gIGZ1bmN0aW9uIGVsKHRhZywgY2xzLCB0eHQpIHsgY29uc3QgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsgaWYgKGNscykgbi5jbGFzc05hbWUgPSBjbHM7IGlmICh0eHQpIG4udGV4dENvbnRlbnQgPSB0eHQ7IHJldHVybiBuOyB9XG5cbiAgZnVuY3Rpb24gYnVpbGRHcmlkKCkge1xuICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZHMnKTsgcm9vdC5pbm5lckhUTUwgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpbmRvdy5BUFBTLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzID0gd2luZG93LkFQUFNbaV07XG4gICAgICBpZiAocy5pZCA9PT0gJ2NhJykgY29udGludWU7IC8vIERhc2hDQSBsaXZlcyBpbiB0b3AgYW5jaG9yIHJvd1xuICAgICAgY29uc3QgY2FyZCA9IGVsKCdkaXYnLCAnY2FyZCcpO1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXBwJywgcy5pZCk7XG4gICAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnLCAnb2ZmJyk7IC8vIEluaXRpYWwgc3RhdHVzXG4gICAgICBpZiAocy5jb250YWluZXJJZCkgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGFpbmVyLWlkJywgcy5jb250YWluZXJJZCk7XG4gICAgICBpZiAocy5jYXRlZ29yeSkgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2F0ZWdvcnknLCBzLmNhdGVnb3J5KTtcbiAgICAgIGlmIChzLnJlY2lwZUlkKSBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1yZWNpcGUtaWQnLCBzLnJlY2lwZUlkKTtcblxuICAgICAgY29uc3QgZG90ID0gZWwoJ3NwYW4nLCAnZG90IGJhZCBhdC1ibCcpOyBkb3QuaWQgPSAnZG90LScgKyBzLmlkICsgJy1ncmlkJzsgY2FyZC5hcHBlbmRDaGlsZChkb3QpO1xuXG4gICAgICBjb25zdCByb3cgPSBlbCgnZGl2JywgJ3JvdycpO1xuICAgICAgY29uc3Qgd3JhcCA9IGVsKCdkaXYnLCAnbG9nby13cmFwJyk7XG5cbiAgICAgIC8vIFVzZSByZWxpYWJsZSBQTkcgaW1hZ2VzIHdpdGggYXV0b21hdGljIENETiBmYWxsYmFja1xuICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICBpbWcuc3JjID0gcy5sb2dvO1xuICAgICAgaW1nLmFsdCA9IHMubmFtZTtcbiAgICAgIGltZy5jbGFzc05hbWUgPSAnbG9nby1pbWcnO1xuICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gVHJ5IENETiBmYWxsYmFjayB3aXRoIG11bHRpcGxlIG5hbWluZyBzdHJhdGVnaWVzXG4gICAgICAgIC8vIFVzZSBpZCwgYXBwVGVtcGxhdGUsIG9yIGRlcml2ZSBmcm9tIG5hbWVcbiAgICAgICAgbGV0IGFwcElkID0gcy5pZCB8fCBzLmFwcFRlbXBsYXRlO1xuICAgICAgICBpZiAoIWFwcElkICYmIHMubmFtZSkge1xuICAgICAgICAgIC8vIERlcml2ZSBJRCBmcm9tIG5hbWUgKGxvd2VyY2FzZSwgcmVtb3ZlIHNwYWNlcylcbiAgICAgICAgICBhcHBJZCA9IHMubmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcHBJZCkge1xuICAgICAgICAgIC8vIFRyeSBkaWZmZXJlbnQgQ0ROIFVSTCBmb3JtYXRzXG4gICAgICAgICAgY29uc3QgY2RuVXJscyA9IFtcbiAgICAgICAgICAgIGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvd2Fsa3hjb2RlL2Rhc2hib2FyZC1pY29ucy9wbmcvJHthcHBJZH0ucG5nYCxcbiAgICAgICAgICAgIGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvd2Fsa3hjb2RlL2Rhc2hib2FyZC1pY29ucy9wbmcvJHthcHBJZC50b0xvd2VyQ2FzZSgpfS5wbmdgLFxuICAgICAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC93YWxreGNvZGUvZGFzaGJvYXJkLWljb25zL3BuZy8ke2FwcElkLnJlcGxhY2UoLy0vZywgJycpfS5wbmdgLFxuICAgICAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC93YWxreGNvZGUvZGFzaGJvYXJkLWljb25zL3BuZy8ke3MubmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKX0ucG5nYFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICAvLyBSZW1vdmUgZHVwbGljYXRlc1xuICAgICAgICAgIGNvbnN0IHVuaXF1ZVVybHMgPSBbLi4ubmV3IFNldChjZG5VcmxzKV07XG5cbiAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IFVSTCB0byB0cnlcbiAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSB1bmlxdWVVcmxzLmluZGV4T2YodGhpcy5zcmMpO1xuICAgICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG5cbiAgICAgICAgICBpZiAobmV4dEluZGV4IDwgdW5pcXVlVXJscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc3JjID0gdW5pcXVlVXJsc1tuZXh0SW5kZXhdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgd3JhcC5hcHBlbmRDaGlsZChpbWcpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKHdyYXApO1xuXG4gICAgICBjb25zdCBuYW1lU3BhbiA9IGVsKCdzcGFuJywgJ25hbWUnLCBzLm5hbWUpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKG5hbWVTcGFuKTtcblxuICAgICAgLy8gQWRkIFRhaWxzY2FsZSBiYWRnZSBpZiBzZXJ2aWNlIGlzIHByb3RlY3RlZFxuICAgICAgaWYgKHMudGFpbHNjYWxlT25seSkge1xuICAgICAgICBjb25zdCB0c0JhZGdlID0gZWwoJ3NwYW4nLCAndHMtYmFkZ2UnLCAnXHVEODNEXHVERDEwJyk7XG4gICAgICAgIHRzQmFkZ2UudGl0bGUgPSAnVGFpbHNjYWxlLW9ubHkgYWNjZXNzJztcbiAgICAgICAgdHNCYWRnZS5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi1sZWZ0OiA2cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgb3BhY2l0eTogMC44Oyc7XG4gICAgICAgIG5hbWVTcGFuLmFwcGVuZENoaWxkKHRzQmFkZ2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgQ2F0ZWdvcnkgYmFkZ2UgaWYgc2VydmljZSBoYXMgb25lIChjb2xvcmVkIHBpbGwgd2l0aCBpY29uKVxuICAgICAgaWYgKHMuY2F0ZWdvcnkpIHtcbiAgICAgICAgY29uc3QgY2F0cyA9ICh0eXBlb2YgREMgIT09ICd1bmRlZmluZWQnICYmIERDLkNBVEVHT1JJRVMpIHx8IHdpbmRvdy5EQ19DQVRFR09SSUVTIHx8IHt9O1xuICAgICAgICBjb25zdCBjYXRJbmZvID0gY2F0c1tzLmNhdGVnb3J5XSB8fCB7fTtcbiAgICAgICAgY29uc3QgY2F0QmFkZ2UgPSBlbCgnc3BhbicsICdjYXQtYmFkZ2UnLCBgJHtjYXRJbmZvLmljb24gfHwgJyd9ICR7cy5jYXRlZ29yeX1gLnRyaW0oKSk7XG4gICAgICAgIGNhdEJhZGdlLnRpdGxlID0gYENhdGVnb3J5OiAke3MuY2F0ZWdvcnl9YDtcbiAgICAgICAgY2F0QmFkZ2Uuc3R5bGUuY3NzVGV4dCA9IGBtYXJnaW4tbGVmdDogNnB4OyBmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDFweCA2cHg7IGJvcmRlci1yYWRpdXM6IDk5OXB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgJHtjYXRJbmZvLmNvbG9yIHx8ICcjN2Y4YzhkJ30gMjUlLCB0cmFuc3BhcmVudCk7IGNvbG9yOiAke2NhdEluZm8uY29sb3IgfHwgJyM3ZjhjOGQnfTsgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsICR7Y2F0SW5mby5jb2xvciB8fCAnIzdmOGM4ZCd9IDUwJSwgdHJhbnNwYXJlbnQpOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBmb250LXdlaWdodDogNTAwO2A7XG4gICAgICAgIG5hbWVTcGFuLmFwcGVuZENoaWxkKGNhdEJhZGdlKTtcbiAgICAgIH1cblxuICAgICAgcm93LmFwcGVuZENoaWxkKGVsKCdzcGFuJywgJ3NwYWNlcicpKTtcblxuICAgICAgY29uc3QgcGlsbCA9IGVsKCdzcGFuJywgJ2JhZGdlIG9mZicsICdPRkYnKTtcbiAgICAgIHBpbGwuaWQgPSAnYmFkZ2UtJyArIHMuaWQ7XG4gICAgICBwaWxsLnNldEF0dHJpYnV0ZSgnZGF0YS1pMThuLWxpdmUtc3RhdHVzJywgJ2JpbmFyeScpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKHBpbGwpO1xuXG4gICAgICAvLyBVcGRhdGUgYXZhaWxhYmxlIGJhZGdlIChoaWRkZW4gYnkgZGVmYXVsdCwgc2hvd24gd2hlbiB1cGRhdGUgZGV0ZWN0ZWQpXG4gICAgICBjb25zdCB1cGRhdGVCYWRnZSA9IGVsKCdzcGFuJywgJ3VwZGF0ZS1hdmFpbGFibGUtYmFkZ2UnLCAnVVBEQVRFJyk7XG4gICAgICB1cGRhdGVCYWRnZS5pZCA9ICd1cGRhdGUtYmFkZ2UtJyArIHMuaWQ7XG4gICAgICB1cGRhdGVCYWRnZS50aXRsZSA9ICdVcGRhdGUgYXZhaWxhYmxlJztcbiAgICAgIHJvdy5hcHBlbmRDaGlsZCh1cGRhdGVCYWRnZSk7XG5cbiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQocm93KTtcblxuICAgICAgLy8gQWRkIHJlc3BvbnNlIHRpbWUgcm93XG4gICAgICBjb25zdCByZXNwb25zZVJvdyA9IGVsKCdkaXYnLCAncmVzcG9uc2Utcm93Jyk7XG4gICAgICBjb25zdCB0aW1lU3BhbiA9IGVsKCdzcGFuJywgJ3Jlc3BvbnNlLXRpbWUnLCAnLS0nKTsgdGltZVNwYW4uaWQgPSAndGltZS0nICsgcy5pZDtcbiAgICAgIHJlc3BvbnNlUm93LmFwcGVuZENoaWxkKHRpbWVTcGFuKTtcbiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQocmVzcG9uc2VSb3cpO1xuXG4gICAgICAvLyBBZGQgaGVhbHRoL3VwdGltZSByb3dcbiAgICAgIGNvbnN0IGhlYWx0aFJvdyA9IGVsKCdkaXYnLCAnaGVhbHRoLXJvdycpO1xuICAgICAgaGVhbHRoUm93LmlkID0gJ2hlYWx0aC0nICsgcy5pZDtcbiAgICAgIGNvbnN0IHVwdGltZUNoaXAgPSBlbCgnc3BhbicsICd1cHRpbWUtY2hpcCcsICctLScpO1xuICAgICAgdXB0aW1lQ2hpcC5pZCA9ICd1cHRpbWUtJyArIHMuaWQ7XG4gICAgICBoZWFsdGhSb3cuYXBwZW5kQ2hpbGQodXB0aW1lQ2hpcCk7XG4gICAgICBjb25zdCB1cHRpbWVNaW5pQmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB1cHRpbWVNaW5pQmFyLmNsYXNzTmFtZSA9ICd1cHRpbWUtbWluaS1iYXInO1xuICAgICAgY29uc3QgdXB0aW1lRmlsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdXB0aW1lRmlsbC5jbGFzc05hbWUgPSAnZmlsbCc7XG4gICAgICB1cHRpbWVGaWxsLmlkID0gJ3VwdGltZS1iYXItJyArIHMuaWQ7XG4gICAgICB1cHRpbWVGaWxsLnN0eWxlLndpZHRoID0gJzAlJztcbiAgICAgIHVwdGltZU1pbmlCYXIuYXBwZW5kQ2hpbGQodXB0aW1lRmlsbCk7XG4gICAgICBoZWFsdGhSb3cuYXBwZW5kQ2hpbGQodXB0aW1lTWluaUJhcik7XG4gICAgICBjYXJkLmFwcGVuZENoaWxkKGhlYWx0aFJvdyk7XG5cbiAgICAgIGNvbnN0IGJ0blJvdyA9IGVsKCdkaXYnLCAnYnRuLXJvdycpO1xuXG4gICAgICAvLyBBZGQgbG9ncyBidXR0b24gZm9yIHNlcnZpY2VzIHdpdGggY29udGFpbmVySWRzXG4gICAgICBpZiAocy5jb250YWluZXJJZCkge1xuICAgICAgICBjb25zdCBsb2dzQnRuID0gZWwoJ2J1dHRvbicsICdsb2dzLWJ0bicsICdcdUQ4M0RcdURDQ0InKTtcbiAgICAgICAgbG9nc0J0bi50aXRsZSA9ICdWaWV3IGNvbnRhaW5lciBsb2dzJztcbiAgICAgICAgbG9nc0J0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy5vcGVuQ29udGFpbmVyTG9nc01vZGFsKHMuY29udGFpbmVySWQsIHMubmFtZSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChsb2dzQnRuKTtcblxuICAgICAgICAvLyBBZGQgdXBkYXRlIGJ1dHRvbiBmb3IgRG9ja2VyIGNvbnRhaW5lcnNcbiAgICAgICAgY29uc3QgdXBkYXRlQnRuID0gZWwoJ2J1dHRvbicsICd1cGRhdGUtYnRuJywgJ1x1MkIwNlx1RkUwRicpO1xuICAgICAgICB1cGRhdGVCdG4udGl0bGUgPSAnVXBkYXRlIGNvbnRhaW5lciB0byBsYXRlc3QgdmVyc2lvbic7XG4gICAgICAgIHVwZGF0ZUJ0bi5pZCA9IGB1cGRhdGUtYnRuLSR7cy5pZH1gO1xuICAgICAgICB1cGRhdGVCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB3aW5kb3cudXBkYXRlQ29udGFpbmVyKHMuY29udGFpbmVySWQsIHMubmFtZSwgcy5pZCk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZCh1cGRhdGVCdG4pO1xuXG4gICAgICAgIC8vIFRlcm1pbmFsIGV4ZWMgYnV0dG9uIChzdWJ0bGUgXHUyMDE0IHZpc2libGUgb24gaG92ZXIpXG4gICAgICAgIGNvbnN0IGV4ZWNCdG4gPSBlbCgnYnV0dG9uJywgJ2V4ZWMtYnRuJywgJz5fJyk7XG4gICAgICAgIGV4ZWNCdG4udGl0bGUgPSAnT3BlbiB0ZXJtaW5hbCc7XG4gICAgICAgIGV4ZWNCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBpZiAod2luZG93Lm9wZW5FeGVjTW9kYWwpIHdpbmRvdy5vcGVuRXhlY01vZGFsKHMuY29udGFpbmVySWQsIHMubmFtZSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChleGVjQnRuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGxvZ3MgYnV0dG9uIGZvciBzZXJ2aWNlcyB3aXRoIGxvZ1BhdGggKG5hdGl2ZSBhcHBzKVxuICAgICAgaWYgKHMubG9nUGF0aCAmJiAhcy5jb250YWluZXJJZCkge1xuICAgICAgICBjb25zdCBsb2dzQnRuID0gZWwoJ2J1dHRvbicsICdsb2dzLWJ0bicsICdcdUQ4M0RcdURDQ0InKTtcbiAgICAgICAgbG9nc0J0bi50aXRsZSA9ICdWaWV3IGFwcGxpY2F0aW9uIGxvZ3MnO1xuICAgICAgICBsb2dzQnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgd2luZG93Lm9wZW5GaWxlTG9nc01vZGFsKHMubG9nUGF0aCwgcy5uYW1lKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRuUm93LmFwcGVuZENoaWxkKGxvZ3NCdG4pO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgY3JlZGVudGlhbHMgYnV0dG9uIGZvciBzZXJ2aWNlcyB0aGF0IHN1cHBvcnQgYXV0by1sb2dpblxuICAgICAgaWYgKHMuaXNFeHRlcm5hbCB8fCBzLmFwcFRlbXBsYXRlIHx8IHMudXJsKSB7XG4gICAgICAgIGNvbnN0IGNyZWRzQnRuID0gZWwoJ2J1dHRvbicsICdjcmVkcy1idG4nLCAnXHVEODNEXHVERDExJyk7XG4gICAgICAgIGNyZWRzQnRuLnRpdGxlID0gJ0F1dG8tbG9naW4gY3JlZGVudGlhbHMnO1xuICAgICAgICBjcmVkc0J0bi5pZCA9IGBjcmVkcy1idG4tJHtzLmlkfWA7XG4gICAgICAgIGNyZWRzQnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgd2luZG93Lm9wZW5TZXJ2aWNlQ3JlZHNNb2RhbChzKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRuUm93LmFwcGVuZENoaWxkKGNyZWRzQnRuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIG9wdGlvbnMgYnV0dG9uIGZvciBhbGwgc2VydmljZXMgZXhjZXB0ICdpbnRlcm5ldCdcbiAgICAgIGlmIChzLmlkICE9PSAnaW50ZXJuZXQnKSB7XG4gICAgICAgIGNvbnN0IG9wdEJ0biA9IGVsKCdidXR0b24nLCAnb3B0aW9ucy1idG4nLCAnXHUyNjk5XHVGRTBGJyk7XG4gICAgICAgIG9wdEJ0bi50aXRsZSA9ICdFZGl0IHNlcnZpY2Ugc2V0dGluZ3MnO1xuICAgICAgICBvcHRCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB3aW5kb3cub3BlblNlcnZpY2VFZGl0TW9kYWwocyk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChvcHRCdG4pO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgc2hhcmUgYnV0dG9uIGZvciBhbGwgc2VydmljZXMgZXhjZXB0ICdpbnRlcm5ldCcgKERDLTA1OCkuXG4gICAgICAvLyBDYWxscyBpbnRvIHRoZSBzaGFyZS1tb2RhbCBtb2R1bGUgcmVnaXN0ZXJlZCBvbiB3aW5kb3cuIFdlIGRvbid0XG4gICAgICAvLyBoYXJkLXJlcXVpcmUgdGhlIG1vZHVsZSBcdTIwMTQgaWYgc2hhcmUtbW9kYWwuanMgd2FzIGV4Y2x1ZGVkIGZyb20gdGhlXG4gICAgICAvLyBidW5kbGUsIHRoZSBidXR0b24gc3RpbGwgcmVuZGVycyBidXQgY2xpY2tpbmcgaXQgc3VyZmFjZXMgYSBjbGVhclxuICAgICAgLy8gZXJyb3IgdG9hc3QgaW5zdGVhZCBvZiBhIHNpbGVudCBuby1vcC5cbiAgICAgIGlmIChzLmlkICE9PSAnaW50ZXJuZXQnKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlQnRuID0gZWwoJ2J1dHRvbicsICdzaGFyZS1idG4nLCAnXHVEODNEXHVERDE3Jyk7XG4gICAgICAgIHNoYXJlQnRuLnRpdGxlID0gJ1NoYXJlIHRoaXMgc2VydmljZSAoUHJvKSc7XG4gICAgICAgIHNoYXJlQnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cub3BlblNoYXJlTW9kYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuU2hhcmVNb2RhbChzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cuc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgd2luZG93LnNob3dOb3RpZmljYXRpb24oJ1NoYXJlIG1vZGFsIG5vdCBsb2FkZWQuIFJlZnJlc2ggdGhlIHBhZ2UuJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQoc2hhcmVCdG4pO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgZGVsZXRlIGJ1dHRvbiBmb3IgYWxsIHNlcnZpY2VzIGV4Y2VwdCBJbnRlcm5ldFxuICAgICAgaWYgKHMuaWQgIT09ICdpbnRlcm5ldCcpIHtcbiAgICAgICAgY29uc3QgZGVsQnRuID0gZWwoJ2J1dHRvbicsICdkZWxldGUtYnRuJywgJ1x1RDgzRFx1REREMVx1RkUwRicpO1xuICAgICAgICBkZWxCdG4udGl0bGUgPSAnRGVsZXRlIHRoaXMgc2VydmljZSc7XG4gICAgICAgIGRlbEJ0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy5kZWxldGVTZXJ2aWNlKHMuaWQsIHMubmFtZSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChkZWxCdG4pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidG4gPSBlbCgnYnV0dG9uJywgbnVsbCwgJ09wZW4nKTtcbiAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtaTE4bicsICdhY3Rpb24ub3BlbicpO1xuICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB3aW5kb3cub3BlbihzZXJ2aWNlVXJsKHMuaWQpLCAnX2JsYW5rJywgJ25vb3BlbmVyJyk7XG4gICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQoYnRuKTtcbiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQoYnRuUm93KTtcbiAgICAgIGNhcmQuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gYCR7TWF0aC5taW4oaSAqIDQ1LCAyNzApfW1zYDtcblxuICAgICAgcm9vdC5hcHBlbmRDaGlsZChjYXJkKTtcbiAgICB9XG5cbiAgICAvLyBDYXJkcyBjYW4gYmUgY3JlYXRlZCBhZnRlciB0aGUgaW5pdGlhbCBsYW5ndWFnZSBwYXNzLiBUcmFuc2xhdGUgdGhlaXJcbiAgICAvLyBpbml0aWFsIGxpdmUgc3RhdGUgYW5kIGNvbnRyb2xzIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgcG9sbC5cbiAgICBpZiAod2luZG93LkRDSTE4biAmJiB3aW5kb3cuRENJMThuLmlzTG9hZGVkKCkpIHtcbiAgICAgIHdpbmRvdy5EQ0kxOG4uYXBwbHlUcmFuc2xhdGlvbnMoKTtcbiAgICB9XG5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyZCcpLmZvckVhY2goY2FyZCA9PiBjYXJkLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpKTtcbiAgICB9KTtcblxuICAgIC8vIEdyb3VwIHJlY2lwZSBjYXJkcyB2aXN1YWxseSBhZnRlciBncmlkIGlzIGJ1aWx0XG4gICAgaWYgKHdpbmRvdy5ncm91cFJlY2lwZUNhcmRzKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gd2luZG93Lmdyb3VwUmVjaXBlQ2FyZHMoKSk7XG5cbiAgICAvLyBSZWZyZXNoIHRoZSBzZXJ2aWNlIGZpbHRlciBzbyB0aGUgY2F0ZWdvcnkgZHJvcGRvd24gcmVmbGVjdHMgbmV3IHNlcnZpY2VzXG4gICAgaWYgKHdpbmRvdy5yZWZyZXNoU2VydmljZUZpbHRlcikgd2luZG93LnJlZnJlc2hTZXJ2aWNlRmlsdGVyKCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRCYWRnZShpZCwgdXAsIHJlc3BvbnNlVGltZSA9IG51bGwpIHtcbiAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG90LScgKyBpZCArICctZ3JpZCcpO1xuICAgIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFkZ2UtJyArIGlkKTtcbiAgICBjb25zdCB0aW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltZS0nICsgaWQpO1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHA9XCIke2lkfVwiXWApO1xuXG4gICAgaWYgKGRvdCkge1xuICAgICAgZG90LmNsYXNzTGlzdC50b2dnbGUoJ29rJywgdXApO1xuICAgICAgZG90LmNsYXNzTGlzdC50b2dnbGUoJ2JhZCcsICF1cCk7XG4gICAgfVxuXG4gICAgaWYgKHBpbGwpIHtcbiAgICAgIHBpbGwudGV4dENvbnRlbnQgPSBzdGF0dXNMYWJlbCh1cCk7XG4gICAgICBwaWxsLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgdXApO1xuICAgICAgcGlsbC5jbGFzc0xpc3QudG9nZ2xlKCdvZmYnLCAhdXApO1xuICAgIH1cblxuICAgIGlmICh0aW1lRWwgJiYgcmVzcG9uc2VUaW1lICE9PSBudWxsKSB7XG4gICAgICB0aW1lRWwudGV4dENvbnRlbnQgPSB1cCA/IGAke3Jlc3BvbnNlVGltZX1tc2AgOiAndGltZW91dCc7XG4gICAgICB0aW1lRWwuY2xhc3NOYW1lID0gYHJlc3BvbnNlLXRpbWUgJHtnZXRSZXNwb25zZVRpbWVDbGFzcyhyZXNwb25zZVRpbWUsIHVwKX1gO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjYXJkIHN0YXR1cyBmb3IgaWNvbiBjb2xvcmluZ1xuICAgIGlmIChjYXJkKSB7XG4gICAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnLCB1cCA/ICdvbicgOiAnb2ZmJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEFsbCgpIHtcbiAgICAvLyBTa2lwIGlmIGF1dGggaGFzIGJlZW4gbG9zdCAoZS5nLiBUT1RQIGdhdGUgYWN0aXZhdGVkIGV4dGVybmFsbHkpLlxuICAgIC8vIFRoZSBwb2xsaW5nIGludGVydmFsIGluIGluaXQuanMgYWxzbyBjaGVja3MgdGhpcyBmbGFnLlxuICAgIGlmICh3aW5kb3cuX2RjQXV0aExvc3QpIHJldHVybjtcbiAgICBpZiAocmVmcmVzaEluRmxpZ2h0KSB7XG4gICAgICByZWZyZXNoUXVldWVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZWZyZXNoSW5GbGlnaHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlU3RhbXAobGFiZWwsIGNoZWNrZWRBdCA9IG5ldyBEYXRlKCkpIHtcbiAgICAgIGNvbnN0IHN0YW1wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YW1wJyk7XG4gICAgICBpZiAoc3RhbXApIHN0YW1wLnRleHRDb250ZW50ID0gYCR7bGFiZWx9OiAke25ldyBEYXRlKGNoZWNrZWRBdCkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseUJhdGNoUmVzdWx0cyhzdGF0dXNlcykge1xuICAgICAgY29uc3QgZG5zSWRzID0gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzKTtcbiAgICAgIGRuc0lkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzdGF0dXNlc1tpZF07XG4gICAgICAgIGlmIChyZXN1bHQpIHNldFF1aWNrKGlkLCByZXN1bHQuaXNVcCwgcmVzdWx0LnJlc3BvbnNlVGltZSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHN0YXR1c2VzLmludGVybmV0KSB7XG4gICAgICAgIHNldFF1aWNrKCdpbnRlcm5ldCcsIHN0YXR1c2VzLmludGVybmV0LmlzVXAsIHN0YXR1c2VzLmludGVybmV0LnJlc3BvbnNlVGltZSk7XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5BUFBTLmZvckVhY2goKHNlcnZpY2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3RhdHVzZXNbc2VydmljZS5pZF07XG4gICAgICAgIGlmIChyZXN1bHQpIHNldEJhZGdlKHNlcnZpY2UuaWQsIHJlc3VsdC5pc1VwLCByZXN1bHQucmVzcG9uc2VUaW1lKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hGYWxsYmFjaygpIHtcbiAgICAgIGNvbnN0IGRuc0lkcyA9IE9iamVjdC5rZXlzKFNJVEUuZG5zU2VydmVycyk7XG4gICAgICBjb25zdCB0b3BDaGVja3MgPSBkbnNJZHMubWFwKGlkID0+IGNoZWNrU2VydmljZVdpdGhUaW1pbmcoaWQpKTtcbiAgICAgIHRvcENoZWNrcy5wdXNoKGNoZWNrU2VydmljZVdpdGhUaW1pbmcoJ2ludGVybmV0JykpO1xuICAgICAgY29uc3QgdG9wUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHRvcENoZWNrcyk7XG5cbiAgICAgIGRuc0lkcy5mb3JFYWNoKChpZCwgaSkgPT4gc2V0UXVpY2soaWQsIHRvcFJlc3VsdHNbaV0uaXNVcCwgdG9wUmVzdWx0c1tpXS5yZXNwb25zZVRpbWUpKTtcbiAgICAgIGNvbnN0IGludGVybmV0UmVzdWx0ID0gdG9wUmVzdWx0c1t0b3BSZXN1bHRzLmxlbmd0aCAtIDFdO1xuICAgICAgc2V0UXVpY2soJ2ludGVybmV0JywgaW50ZXJuZXRSZXN1bHQuaXNVcCwgaW50ZXJuZXRSZXN1bHQucmVzcG9uc2VUaW1lKTtcblxuICAgICAgY29uc3QgYXBwUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB3aW5kb3cuQVBQUy5tYXAoYXN5bmMgcyA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tTZXJ2aWNlV2l0aFRpbWluZyhzLmlkKTtcbiAgICAgICAgICByZXR1cm4geyBpZDogcy5pZCwgLi4ucmVzdWx0IH07XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBhcHBSZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgc2V0QmFkZ2UocmVzdWx0LmlkLCByZXN1bHQuaXNVcCwgcmVzdWx0LnJlc3BvbnNlVGltZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZWZyZXNoSW5GbGlnaHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zZXJ2aWNlcy9zdGF0dXMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAvLyBBdXRoIGxvc3QgXHUyMDE0IHN0b3AgdGhlIHBvbGxpbmcgbG9vcCBhbmQgY2xvc2UgU1NFOyBkbyBOT1QgZmFsbFxuICAgICAgICAgIC8vIHRocm91Z2ggdG8gZGlyZWN0IHByb2JlcyAodGhvc2Ugd291bGQgbWlzbGVhZGluZ2x5IG1hcmtcbiAgICAgICAgICAvLyBzZXJ2aWNlcyBhcyBoZWFsdGh5IHNpbmNlIC9wcm9iZS8gdHJlYXRzIDQwMS80MDMgYXMgXCJ1cFwiKS5cbiAgICAgICAgICB3aW5kb3cuX2RjQXV0aExvc3QgPSB0cnVlO1xuICAgICAgICAgIGlmICh3aW5kb3cuX3NzZVJlY29ubmVjdCAmJiB3aW5kb3cuX3NzZUNsb3NlKSB7XG4gICAgICAgICAgICB3aW5kb3cuX3NzZUNsb3NlKCk7IC8vIHRlbGwgU1NFIHRvIHN0b3AgcmVjb25uZWN0aW5nXG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZVN0YW1wKCdhdXRoIHJlcXVpcmVkJyk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBza2lwIHRoZSBmYWxsYmFjayBlbnRpcmVseVxuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyByZWZyZXNoIGZhaWxlZCAoJHtyZXNwb25zZS5zdGF0dXN9KWApO1xuICAgICAgICB9XG4gICAgICAgIHdpbmRvdy5fZGNBdXRoTG9zdCA9IGZhbHNlOyAvLyBhdXRoIHdvcmtpbmcgYWdhaW5cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgYXBwbHlCYXRjaFJlc3VsdHMoZGF0YS5zdGF0dXNlcyB8fCB7fSk7XG4gICAgICAgIHVwZGF0ZVN0YW1wKCdsYXN0IGNoZWNrJywgZGF0YS5jaGVja2VkQXQgfHwgbmV3IERhdGUoKSk7XG4gICAgICB9IGNhdGNoIChiYXRjaEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQmF0Y2hlZCBzdGF0dXMgcmVmcmVzaCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBkaXJlY3QgcHJvYmVzOicsIGJhdGNoRXJyb3IpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJlZnJlc2hGYWxsYmFjaygpO1xuICAgICAgICAgIHVwZGF0ZVN0YW1wKCdsYXN0IGNoZWNrJyk7XG4gICAgICAgIH0gY2F0Y2ggKGZhbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdEYXNoYm9hcmQgcmVmcmVzaCBmYWlsZWQ6JywgZmFsbGJhY2tFcnJvcik7XG4gICAgICAgICAgdXBkYXRlU3RhbXAoJ2xhc3QgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlZnJlc2hJbkZsaWdodCA9IG51bGw7XG4gICAgICAgIGlmIChyZWZyZXNoUXVldWVkICYmICF3aW5kb3cuX2RjQXV0aExvc3QpIHtcbiAgICAgICAgICByZWZyZXNoUXVldWVkID0gZmFsc2U7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHdpbmRvdy5yZWZyZXNoQWxsKCk7IH0sIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZnJlc2hRdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICByZXR1cm4gcmVmcmVzaEluRmxpZ2h0O1xuICB9XG5cbiAgLy8gRE5TIG9wZW4gYnV0dG9ucyBcdTIwMTQgdXNlIGV2ZW50IGRlbGVnYXRpb24gb24gLnRvcCBjb250YWluZXJcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgY29uc3Qgb3BlbkJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJ1tpZCQ9XCItb3BlblwiXScpO1xuICAgIGlmICghb3BlbkJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IGlkID0gb3BlbkJ0bi5pZC5yZXBsYWNlKCctb3BlbicsICcnKTtcbiAgICBpZiAoU0lURS5kbnNTZXJ2ZXJzW2lkXSkgd2luZG93Lm9wZW4oc2VydmljZVVybChpZCksICdfYmxhbmsnLCAnbm9vcGVuZXInKTtcbiAgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYS1vcGVuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gd2luZG93Lm9wZW4oc2VydmljZVVybCgnY2EnKSwgJ19ibGFuaycsICdub29wZW5lcicpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NyZWRzLWJ0bi1jYScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGNvbnN0IHMgPSB3aW5kb3cuQVBQUy5maW5kKGEgPT4gYS5pZCA9PT0gJ2NhJyk7IGlmIChzICYmIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwpIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwocyk7IH0pO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B0aW9ucy1idG4tY2EnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBlLnN0b3BQcm9wYWdhdGlvbigpOyBjb25zdCBzID0gd2luZG93LkFQUFMuZmluZChhID0+IGEuaWQgPT09ICdjYScpOyBpZiAocyAmJiB3aW5kb3cub3BlblNlcnZpY2VFZGl0TW9kYWwpIHdpbmRvdy5vcGVuU2VydmljZUVkaXRNb2RhbChzKTsgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtYnRuLWNhJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgaWYgKHdpbmRvdy5kZWxldGVTZXJ2aWNlKSB3aW5kb3cuZGVsZXRlU2VydmljZSgnY2EnLCAnRGFzaENBJyk7IH0pO1xuXG4gIC8vIFdpbmRvdyBleHBvcnRzXG4gIHdpbmRvdy5sb2FkU2VydmljZXMgPSBsb2FkU2VydmljZXM7XG4gIHdpbmRvdy5idWlsZEdyaWQgPSBidWlsZEdyaWQ7XG4gIHdpbmRvdy5yZWZyZXNoQWxsID0gcmVmcmVzaEFsbDtcbiAgd2luZG93LnNldFF1aWNrID0gc2V0UXVpY2s7XG4gIHdpbmRvdy5zZXRCYWRnZSA9IHNldEJhZGdlO1xuICB3aW5kb3cuZ2V0UmVzcG9uc2VUaW1lQ2xhc3MgPSBnZXRSZXNwb25zZVRpbWVDbGFzcztcbiAgd2luZG93LmNoZWNrU2VydmljZVdpdGhUaW1pbmcgPSBjaGVja1NlcnZpY2VXaXRoVGltaW5nO1xuICB3aW5kb3cuc2VydmljZVVybCA9IHNlcnZpY2VVcmw7XG4gIHdpbmRvdy5lbCA9IGVsO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBETlMgTUFOQUdFTUVOVCA9PT09PT09PT09XG4oZnVuY3Rpb24gKCkge1xuICAvLyBSZXN0YXJ0IEROUyBzZXJ2aWNlIHZpYSBiYWNrZW5kIHByb3h5IChiYWNrZW5kIGhhbmRsZXMgYXV0aCBhdXRvbWF0aWNhbGx5KVxuICBhc3luYyBmdW5jdGlvbiByZXN0YXJ0RG5zU2VydmljZShkbnNJZCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvZG5zL3Jlc3RhcnQvJHtkbnNJZH1gLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdSZXN0YXJ0IGZhaWxlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gRXZlbnQgZGVsZWdhdGlvbiBmb3IgRE5TIHJlc3RhcnQgYnV0dG9ucyAoZHluYW1pYyBjYXJkcylcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChlKSA9PiB7XG4gICAgY29uc3QgcmVzdGFydEJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJ1tpZCQ9XCItcmVzdGFydFwiXScpO1xuICAgIGlmICghcmVzdGFydEJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IGRuc0lkID0gcmVzdGFydEJ0bi5pZC5yZXBsYWNlKCctcmVzdGFydCcsICcnKTtcbiAgICBpZiAoIVNJVEUuZG5zU2VydmVyc1tkbnNJZF0pIHJldHVybjtcbiAgICBpZiAoIWNvbmZpcm0oYFJlc3RhcnQgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfSBzZXJ2aWNlP2ApKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhCdXR0b24ocmVzdGFydEJ0biwgJy4uLicsICgpID0+IHJlc3RhcnREbnNTZXJ2aWNlKGRuc0lkKSk7XG4gICAgICBzZXRUaW1lb3V0KHdpbmRvdy5yZWZyZXNoQWxsLCBEQy5ERUxBWVMuUkVMT0FEKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZXN0YXJ0IGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBETlMgVXBkYXRlIGJ1dHRvbnNcbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRG5zU2VydmVyKGRuc0lkLCBzZXJ2ZXJJcCkge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS11cGRhdGVgKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidG4/LnRleHRDb250ZW50IHx8ICdcdTJCMDZcdUZFMEYnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpcnN0IGNoZWNrIGZvciB1cGRhdGVzXG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDBEJztcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBidG4udGl0bGUgPSAnQ2hlY2tpbmcgZm9yIHVwZGF0ZXMuLi4nO1xuXG4gICAgICBjb25zdCBjaGVja1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvZG5zL2NoZWNrLXVwZGF0ZT9zZXJ2ZXI9JHtlbmNvZGVVUklDb21wb25lbnQoc2VydmVySXApfWApO1xuICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCBjaGVja1Jlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKCFjaGVja1Jlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjaGVja1Jlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGNoZWNrIGZvciB1cGRhdGVzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hlY2tSZXN1bHQudXBkYXRlQXZhaWxhYmxlKSB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUnO1xuICAgICAgICBidG4udGl0bGUgPSBgQWxyZWFkeSBvbiBsYXRlc3QgdmVyc2lvbiAoJHtjaGVja1Jlc3VsdC5jdXJyZW50VmVyc2lvbn0pYDtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUhIEN1cnJlbnQgdmVyc2lvbjogJHtjaGVja1Jlc3VsdC5jdXJyZW50VmVyc2lvbn1gLCAnaW5mbycpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgYnRuLnRpdGxlID0gJ1VwZGF0ZSBETlMgc2VydmVyJztcbiAgICAgICAgfSwgMzAwMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGF2YWlsYWJsZSAtIGNvbmZpcm0gd2l0aCB1c2VyXG4gICAgICBjb25zdCBjb25maXJtVXBkYXRlID0gY29uZmlybShcbiAgICAgICAgYFVwZGF0ZSBhdmFpbGFibGUgZm9yICR7ZG5zSWQudG9VcHBlckNhc2UoKX0hXFxuXFxuYCArXG4gICAgICAgIGBDdXJyZW50OiAke2NoZWNrUmVzdWx0LmN1cnJlbnRWZXJzaW9ufVxcbmAgK1xuICAgICAgICBgTmV3OiAke2NoZWNrUmVzdWx0LnVwZGF0ZVZlcnNpb259XFxuXFxuYCArXG4gICAgICAgIChjaGVja1Jlc3VsdC51cGRhdGVUaXRsZSA/IGAke2NoZWNrUmVzdWx0LnVwZGF0ZVRpdGxlfVxcblxcbmAgOiAnJykgK1xuICAgICAgICBgVGhlIEROUyBzZXJ2ZXIgd2lsbCByZXN0YXJ0IGR1cmluZyB0aGUgdXBkYXRlLlxcblByb2NlZWQ/YFxuICAgICAgKTtcblxuICAgICAgaWYgKCFjb25maXJtVXBkYXRlKSB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgRE5TIHNlcnZlcic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUGVyZm9ybSB0aGUgdXBkYXRlXG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDA0JztcbiAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGluZy4uLic7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZVJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvZG5zL3VwZGF0ZT9zZXJ2ZXI9JHtlbmNvZGVVUklDb21wb25lbnQoc2VydmVySXApfWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgdXBkYXRlUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAoIXVwZGF0ZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih1cGRhdGVSZXN1bHQuZXJyb3IgfHwgJ1VwZGF0ZSBmYWlsZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwZGF0ZVJlc3VsdC5tYW51YWxVcGRhdGVSZXF1aXJlZCkge1xuICAgICAgICAvLyBUZWNobml0aXVtIHYxNCsgZG9lc24ndCBzdXBwb3J0IGF1dG8taW5zdGFsbCB2aWEgQVBJXG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTJCMDZcdUZFMEYnO1xuICAgICAgICBidG4udGl0bGUgPSBgVXBkYXRlIGF2YWlsYWJsZTogJHt1cGRhdGVSZXN1bHQubmV3VmVyc2lvbn1gO1xuICAgICAgICBjb25zdCBkb3dubG9hZEluZm8gPSB1cGRhdGVSZXN1bHQuZG93bmxvYWRMaW5rXG4gICAgICAgICAgPyBgXFxuRG93bmxvYWQ6ICR7dXBkYXRlUmVzdWx0LmRvd25sb2FkTGlua31gXG4gICAgICAgICAgOiAnJztcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zSW5mbyA9IHVwZGF0ZVJlc3VsdC5pbnN0cnVjdGlvbnNMaW5rXG4gICAgICAgICAgPyBgXFxuSW5zdHJ1Y3Rpb25zOiAke3VwZGF0ZVJlc3VsdC5pbnN0cnVjdGlvbnNMaW5rfWBcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IHVwZGF0ZSByZXF1aXJlcyBtYW51YWwgaW5zdGFsbGF0aW9uLiBDdXJyZW50OiAke3VwZGF0ZVJlc3VsdC5wcmV2aW91c1ZlcnNpb259IFx1MjE5MiAke3VwZGF0ZVJlc3VsdC5uZXdWZXJzaW9ufS4gUGxlYXNlIHVwZGF0ZSBtYW51YWxseSBvbiB0aGUgaG9zdCBtYWNoaW5lLmAsICd3YXJuaW5nJywgODAwMCk7XG4gICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUnO1xuICAgICAgYnRuLnRpdGxlID0gJ1VwZGF0ZWQgc3VjY2Vzc2Z1bGx5ISc7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ISAke3VwZGF0ZVJlc3VsdC5wcmV2aW91c1ZlcnNpb259IFx1MjE5MiAke3VwZGF0ZVJlc3VsdC5uZXdWZXJzaW9ufS4gU2VydmVyIGlzIHJlc3RhcnRpbmcuLi5gLCAnc3VjY2VzcycpO1xuXG4gICAgICAvLyBSZWZyZXNoIGFmdGVyIGRlbGF5IGZvciBzZXJ2ZXIgcmVzdGFydFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgRE5TIHNlcnZlcic7XG4gICAgICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG4gICAgICB9LCAxMDAwMCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRE5TIHVwZGF0ZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzRDJztcbiAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgZmFpbGVkJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEZhaWxlZCB0byB1cGRhdGUgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgRE5TIHNlcnZlcic7XG4gICAgICB9LCAzMDAwKTtcbiAgICB9XG4gIH1cblxuICAvLyBFdmVudCBkZWxlZ2F0aW9uIGZvciBETlMgdXBkYXRlIGJ1dHRvbnMgKGR5bmFtaWMgY2FyZHMpXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJ1tpZCQ9XCItdXBkYXRlXCJdJyk7XG4gICAgaWYgKCF1cGRhdGVCdG4pIHJldHVybjtcbiAgICBjb25zdCBkbnNJZCA9IHVwZGF0ZUJ0bi5pZC5yZXBsYWNlKCctdXBkYXRlJywgJycpO1xuICAgIGlmICghU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXSkgcmV0dXJuO1xuICAgIHVwZGF0ZURuc1NlcnZlcihkbnNJZCwgU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXT8uaXApO1xuICB9KTtcblxuICAvLyA9PT09PSBETlMgU0VUVElOR1MgTU9EQUwgPT09PT1cblxuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnZG5zLXNldHRpbmdzLW1vZGFsJywgYFxuICA8ZGl2IGlkPVwiZG5zLXNldHRpbmdzLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0MjBweDsgbWF4LXdpZHRoOiA1MjBweDtcIj5cbiAgICAgIDxoMyBpZD1cImRucy1zZXR0aW5ncy10aXRsZVwiPkROUyBTZXR0aW5nczwvaDM+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImRucy1lZGl0LWlwXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlNlcnZlciBJUDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkbnMtZWRpdC1pcFwiIGNsYXNzPVwiZm9ybS1pbnB1dC1tZFwiIHBsYWNlaG9sZGVyPVwiMTkyLjE2OC4xLjFcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZG5zLWVkaXQtcG9ydFwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5Qb3J0PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZG5zLWVkaXQtcG9ydFwiIGNsYXNzPVwiZm9ybS1pbnB1dC1tZFwiIHBsYWNlaG9sZGVyPVwiNTM4MFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJkbnMtZWRpdC1uYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPkRpc3BsYXkgTmFtZSAob3B0aW9uYWwpPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRucy1lZGl0LW5hbWVcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiBwbGFjZWhvbGRlcj1cImUuZy4gUHJpbWFyeSBETlNcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGludC1zbVwiPk1hbmFnZSBjcmVkZW50aWFscyB2aWEgVG9rZW5zIGluIHRoZSB0b29sYmFyPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRucy1zZXR0aW5ncy1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRucy1zZXR0aW5ncy1kZWxldGVcIiBzdHlsZT1cImJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZTc0YzNjIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6ICNlNzRjM2M7IGNvbG9yOiAjZTc0YzNjO1wiPlJlbW92ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZG5zLXNldHRpbmdzLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5TYXZlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgbGV0IGN1cnJlbnREbnNJZCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gb3BlbkRuc1NldHRpbmdzKGRuc0lkKSB7XG4gICAgY3VycmVudERuc0lkID0gZG5zSWQ7XG4gICAgY29uc3Qgc2VydmVyID0gU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXSB8fCB7fTtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtbW9kYWwnKTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtdGl0bGUnKS50ZXh0Q29udGVudCA9IGAkeyhzZXJ2ZXIubmFtZSB8fCBkbnNJZCkudG9VcHBlckNhc2UoKX0gU2V0dGluZ3NgO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1pcCcpLnZhbHVlID0gc2VydmVyLmlwIHx8ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1wb3J0JykudmFsdWUgPSBzZXJ2ZXIucG9ydCB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWVkaXQtbmFtZScpLnZhbHVlID0gc2VydmVyLm5hbWUgfHwgJyc7XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzYXZlRG5zU2V0dGluZ3MoKSB7XG4gICAgaWYgKCFjdXJyZW50RG5zSWQpIHJldHVybjtcbiAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1pcCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBwb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1lZGl0LXBvcnQnKS52YWx1ZS50cmltKCkgfHwgREMuREVGQVVMVFMuRE5TX1BPUlQ7XG4gICAgY29uc3QgbmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1uYW1lJykudmFsdWUudHJpbSgpO1xuXG4gICAgaWYgKCFpcCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignU2VydmVyIElQIGlzIHJlcXVpcmVkJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGUgPSB7IGRuc1NlcnZlcnM6IHt9IH07XG4gICAgdXBkYXRlLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXSA9IHsgaXAsIHBvcnQ6IFN0cmluZyhwb3J0KSB9O1xuICAgIGlmIChuYW1lKSB1cGRhdGUuZG5zU2VydmVyc1tjdXJyZW50RG5zSWRdLm5hbWUgPSBuYW1lO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHVwZGF0ZSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIFNJVEUuZG5zU2VydmVyc1tjdXJyZW50RG5zSWRdID0gdXBkYXRlLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtjdXJyZW50RG5zSWQudG9VcHBlckNhc2UoKX0gc2V0dGluZ3Mgc2F2ZWRgLCAnc3VjY2VzcycpO1xuICAgICAgICBjbG9zZURuc1NldHRpbmdzKCk7XG4gICAgICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKHJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2V0dGluZ3MnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlbW92ZURuc1NlcnZlcigpIHtcbiAgICBpZiAoIWN1cnJlbnREbnNJZCkgcmV0dXJuO1xuICAgIGlmICghY29uZmlybShgUmVtb3ZlICR7Y3VycmVudERuc0lkLnRvVXBwZXJDYXNlKCl9IGZyb20gZGFzaGJvYXJkPyBUaGlzIHdvbid0IGFmZmVjdCB0aGUgYWN0dWFsIEROUyBzZXJ2ZXIuYCkpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSBieSBzZXR0aW5nIHRvIG51bGwgaW4gZG5zU2VydmVyc1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJyk7XG4gICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmIChjb25maWcuZG5zU2VydmVycykge1xuICAgICAgICBkZWxldGUgY29uZmlnLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhdmVSZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZG5zU2VydmVyczogY29uZmlnLmRuc1NlcnZlcnMgfHwge30gfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2F2ZVJlc3AuanNvbigpO1xuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGRlbGV0ZSBTSVRFLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXTtcbiAgICAgICAgLy8gUmVtb3ZlIGNhcmQgZnJvbSBET01cbiAgICAgICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC50b3AgW2RhdGEtYXBwPVwiJHtjdXJyZW50RG5zSWR9XCJdYCk7XG4gICAgICAgIGlmIChjYXJkKSBjYXJkLnJlbW92ZSgpO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2N1cnJlbnREbnNJZC50b1VwcGVyQ2FzZSgpfSByZW1vdmVkIGZyb20gZGFzaGJvYXJkYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgY2xvc2VEbnNTZXR0aW5ncygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihyZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byByZW1vdmUnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byByZW1vdmU6ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VEbnNTZXR0aW5ncygpIHtcbiAgICBjbG9zZU1vZGFsKCdkbnMtc2V0dGluZ3MtbW9kYWwnKTtcbiAgICBjdXJyZW50RG5zSWQgPSBudWxsO1xuICB9XG5cbiAgLy8gRXZlbnQgbGlzdGVuZXJzIGZvciBtb2RhbCBidXR0b25zXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VEbnNTZXR0aW5ncyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3Mtc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVEbnNTZXR0aW5ncyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtZGVsZXRlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVtb3ZlRG5zU2VydmVyKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1zZXR0aW5ncy1tb2RhbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0LmlkID09PSAnZG5zLXNldHRpbmdzLW1vZGFsJykgY2xvc2VEbnNTZXR0aW5ncygpO1xuICB9KTtcbiAgLy8gRXZlbnQgZGVsZWdhdGlvbiBmb3IgRE5TIHNldHRpbmdzIGJ1dHRvbnMgKGR5bmFtaWMgY2FyZHMpXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IHNldHRpbmdzQnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2lkJD1cIi1zZXR0aW5nc1wiXScpO1xuICAgIGlmICghc2V0dGluZ3NCdG4pIHJldHVybjtcbiAgICBjb25zdCBkbnNJZCA9IHNldHRpbmdzQnRuLmlkLnJlcGxhY2UoJy1zZXR0aW5ncycsICcnKTtcbiAgICBpZiAoIVNJVEUuZG5zU2VydmVyc1tkbnNJZF0pIHJldHVybjtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIG9wZW5EbnNTZXR0aW5ncyhkbnNJZCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgd2luZG93LnJlZnJlc2hBbGwpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gTE9HIFZJRVdFUlMgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyBJbmplY3QgbG9ncy1tb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdsb2dzLW1vZGFsJywgYFxuICA8ZGl2IGlkPVwibG9ncy1tb2RhbFwiIGNsYXNzPVwibG9ncy1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJsb2dzLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogODAwcHg7IG1heC13aWR0aDogMTAwMHB4O1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtaGVhZGVyXCI+XG4gICAgICAgIDxoMyBpZD1cImxvZ3MtdGl0bGVcIj5ETlMgTG9nczwvaDM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWNvbnRyb2xzXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImxvZy1saW5lc1wiPlNob3c6PC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwibG9nLWxpbmVzXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMjVcIiBzZWxlY3RlZD4yNTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwXCI+NTA8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMDBcIj4xMDA8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIyMDBcIj4yMDA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwibG9ncy1zdHJlYW1cIiBjbGFzcz1cInN0cmVhbS1idG5cIiB0aXRsZT1cIkVuYWJsZSByZWFsLXRpbWUgc3RyZWFtaW5nXCI+XHVEODNEXHVEQ0UxIExpdmU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwibG9ncy1wYXVzZVwiIGNsYXNzPVwicGF1c2UtYnRuXCI+XHUyM0Y4XHVGRTBGIFBhdXNlPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImxvZ3MtY2xvc2VcIiBjbGFzcz1cImNsb3NlLWJ0blwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtY29udGFpbmVyIHNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBpZD1cImxvZ3MtY29udGVudFwiIGNsYXNzPVwibG9ncy1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiPkxvYWRpbmcgbG9ncy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICAvLyA9PT09PSBTdGF0ZSA9PT09PVxuICBsZXQgY3VycmVudERuc1NlcnZpY2UgPSBudWxsO1xuICBsZXQgbG9nc0ludGVydmFsID0gbnVsbDtcbiAgbGV0IGxvZ3NQYXVzZWQgPSBmYWxzZTtcblxuICBsZXQgY3VycmVudENvbnRhaW5lcklkID0gbnVsbDtcbiAgbGV0IGN1cnJlbnRDb250YWluZXJOYW1lID0gbnVsbDtcbiAgbGV0IGNvbnRhaW5lckxvZ3NNb2RlID0gZmFsc2U7XG5cbiAgbGV0IGN1cnJlbnRMb2dQYXRoID0gbnVsbDtcbiAgbGV0IGN1cnJlbnRMb2dTZXJ2aWNlTmFtZSA9IG51bGw7XG4gIGxldCBmaWxlTG9nc01vZGUgPSBmYWxzZTtcblxuICBsZXQgbG9nRXZlbnRTb3VyY2UgPSBudWxsO1xuICBsZXQgaXNTdHJlYW1pbmcgPSBmYWxzZTtcblxuICAvLyA9PT09PSBETlMgTE9HUyA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoRG5zTG9ncyhkbnNJZCwgbGluZXMgPSAyNSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXJ2ZXJJUCA9IGdldERuc1NlcnZlckFkZHIoZG5zSWQpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9kbnMvbG9ncz9zZXJ2ZXI9JHtzZXJ2ZXJJUH0mbGltaXQ9JHtsaW5lc31gLCB7XG4gICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsICdDYWNoZS1Db250cm9sJzogJ25vLWNhY2hlJyB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5sb2dzKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbG9nczogcmVzdWx0LmxvZ3MsIGNvdW50OiByZXN1bHQuY291bnQsIHNlcnZlcjogcmVzdWx0LnNlcnZlciB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiByZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBsb2dzJyB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiAnRE5TIGF1dG8tYXV0aCBmYWlsZWQgLSBjaGVjayBjcmVkZW50aWFscyBpbiBzZXR0aW5ncycgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ROUyBsb2dzIGZldGNoIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4geyBlcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJjb2RlQ29sb3IocmNvZGUpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB7XG4gICAgICAnTm9FcnJvcic6ICd2YXIoLS1vay1mZyknLFxuICAgICAgJ05PRVJST1InOiAndmFyKC0tb2stZmcpJyxcbiAgICAgICdOeERvbWFpbic6ICd2YXIoLS1tdXRlZCknLFxuICAgICAgJ05YRE9NQUlOJzogJ3ZhcigtLW11dGVkKScsXG4gICAgICAnUmVmdXNlZCc6ICd2YXIoLS1iYWQtZmcpJyxcbiAgICAgICdSRUZVU0VEJzogJ3ZhcigtLWJhZC1mZyknLFxuICAgICAgJ1NlcnZlckZhaWx1cmUnOiAnI2YzOWMxMicsXG4gICAgICAnU0VSVkZBSUwnOiAnI2YzOWMxMidcbiAgICB9O1xuICAgIHJldHVybiBjb2xvcnNbcmNvZGVdIHx8ICd2YXIoLS1mZyknO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyRG5zTG9nRW50cnkobG9nKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMTQwcHggMTEwcHggMWZyIDcwcHggODBweDsgZ2FwOiA4cHg7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjhyZW07IGFsaWduLWl0ZW1zOiBjZW50ZXI7JztcblxuICAgIC8vIElmIHVucGFyc2VkIHJhdyBsb2dcbiAgICBpZiAobG9nLnBhcnNlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGRpdi5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID0gJzFmcic7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChsb2cucmF3KX08L3NwYW4+YDtcbiAgICAgIHJldHVybiBkaXY7XG4gICAgfVxuXG4gICAgY29uc3QgcmNvZGVDb2xvciA9IGdldFJjb2RlQ29sb3IobG9nLnJjb2RlKTtcbiAgICBjb25zdCBpc0Jsb2NrZWQgPSBsb2cucmNvZGUgPT09ICdSZWZ1c2VkJyB8fCBsb2cucmNvZGUgPT09ICdSRUZVU0VEJztcblxuICAgIGRpdi5pbm5lckhUTUwgPSBgXG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj4ke2VzY2FwZUh0bWwobG9nLnRpbWVzdGFtcCl9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC1zaXplOiAwLjc1cmVtO1wiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGxvZy5jbGllbnQpfVwiPiR7ZXNjYXBlSHRtbChsb2cuY2xpZW50KX08L3NwYW4+XG4gICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwOyAke2lzQmxvY2tlZCA/ICd0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsgb3BhY2l0eTogMC42OycgOiAnJ31cIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChsb2cuZG9tYWluKX1cIj4ke2VzY2FwZUh0bWwobG9nLmRvbWFpbil9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKGxvZy50eXBlKX08L3NwYW4+XG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAke3Jjb2RlQ29sb3J9OyBmb250LXdlaWdodDogNTAwOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKGxvZy5yY29kZSl9PC9zcGFuPlxuICAgIGA7XG5cbiAgICByZXR1cm4gZGl2O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTG9nc0Rpc3BsYXkoKSB7XG4gICAgLy8gSGFuZGxlIGZpbGUgbG9ncyBtb2RlXG4gICAgaWYgKGZpbGVMb2dzTW9kZSkge1xuICAgICAgYXdhaXQgdXBkYXRlRmlsZUxvZ3NEaXNwbGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNvbnRhaW5lciBsb2dzIG1vZGVcbiAgICBpZiAoY29udGFpbmVyTG9nc01vZGUpIHtcbiAgICAgIGF3YWl0IHVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEROUyBsb2dzIG1vZGVcbiAgICBpZiAobG9nc1BhdXNlZCB8fCAhY3VycmVudERuc1NlcnZpY2UpIHJldHVybjtcblxuICAgIGNvbnN0IGxpbmVzID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZy1saW5lcycpLnZhbHVlKTtcbiAgICBjb25zdCBsb2dzQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLWNvbnRlbnQnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaERuc0xvZ3MoY3VycmVudERuc1NlcnZpY2UsIGxpbmVzKTtcblxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjJyZW07IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2QTBcdUZFMEYgRXJyb3I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+JHtlc2NhcGVIdG1sKHJlc3VsdC5lcnJvcil9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgaGVhZGVyIHJvd1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxNDBweCAxMTBweCAxZnIgNzBweCA4MHB4OyBnYXA6IDhweDsgcGFkZGluZzogOHB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuNzVyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBvc2l0aW9uOiBzdGlja3k7IHRvcDogMDtcIj5cbiAgICAgICAgICA8c3Bhbj5UaW1lPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPkNsaWVudDwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj5Eb21haW48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+VHlwZTwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj5TdGF0dXM8L3NwYW4+XG4gICAgICAgIDwvZGl2PmA7XG5cbiAgICAgIGlmIChyZXN1bHQubG9ncyAmJiByZXN1bHQubG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5sb2dzLmZvckVhY2gobG9nID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dFbGVtZW50ID0gcmVuZGVyRG5zTG9nRW50cnkobG9nKTtcbiAgICAgICAgICBsb2dzQ29udGVudC5hcHBlbmRDaGlsZChsb2dFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgKz0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICBObyBETlMgcXVlcmllcyBsb2dnZWQgeWV0XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cbiAgICAgICAgICBGYWlsZWQgdG8gZmV0Y2ggbG9nczogJHtlc2NhcGVIdG1sKGVycm9yLm1lc3NhZ2UpfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5Mb2dzTW9kYWwoZG5zSWQpIHtcbiAgICBjdXJyZW50RG5zU2VydmljZSA9IGRuc0lkO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcbiAgICBjb250YWluZXJMb2dzTW9kZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1tb2RhbCcpO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtdGl0bGUnKTtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG4gICAgY29uc3Qgc3RyZWFtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3Mtc3RyZWFtJyk7XG5cbiAgICB0aXRsZS50ZXh0Q29udGVudCA9IGAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IEROUyBMb2dzYDtcbiAgICBwYXVzZUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjhcdUZFMEYgUGF1c2UnO1xuICAgIHBhdXNlQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3BhdXNlZCcpO1xuXG4gICAgLy8gSGlkZSBzdHJlYW0gYnV0dG9uIGZvciBETlMgbG9ncyAob25seSBhdmFpbGFibGUgZm9yIGNvbnRhaW5lciBsb2dzKVxuICAgIGlmIChzdHJlYW1CdG4pIHtcbiAgICAgIHN0cmVhbUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIEluaXRpYWwgbG9hZFxuICAgIHVwZGF0ZUxvZ3NEaXNwbGF5KCk7XG5cbiAgICAvLyBTdGFydCBhdXRvLXJlZnJlc2ggZXZlcnkgMyBzZWNvbmRzXG4gICAgbG9nc0ludGVydmFsID0gc2V0SW50ZXJ2YWwodXBkYXRlTG9nc0Rpc3BsYXksIERDLlBPTEwuTE9HUyk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZUxvZ3NNb2RhbCgpIHtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLW1vZGFsJyk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgaWYgKGxvZ3NJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChsb2dzSW50ZXJ2YWwpO1xuICAgICAgbG9nc0ludGVydmFsID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTdG9wIFNTRSBzdHJlYW1pbmcgaWYgYWN0aXZlXG4gICAgc3RvcExvZ1N0cmVhbWluZygpO1xuXG4gICAgLy8gUmVzZXQgYWxsIGxvZyBtb2Rlc1xuICAgIGN1cnJlbnREbnNTZXJ2aWNlID0gbnVsbDtcbiAgICBjb250YWluZXJMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG4gICAgY3VycmVudENvbnRhaW5lck5hbWUgPSBudWxsO1xuICAgIGZpbGVMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGN1cnJlbnRMb2dQYXRoID0gbnVsbDtcbiAgICBjdXJyZW50TG9nU2VydmljZU5hbWUgPSBudWxsO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vID09PT09IFNTRSBMT0cgU1RSRUFNSU5HID09PT09XG5cbiAgZnVuY3Rpb24gc3RhcnRMb2dTdHJlYW1pbmcoY29udGFpbmVySWQpIHtcbiAgICBpZiAobG9nRXZlbnRTb3VyY2UpIHtcbiAgICAgIHN0b3BMb2dTdHJlYW1pbmcoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKTtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG4gICAgY29uc3QgbG9nc0NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1jb250ZW50Jyk7XG5cbiAgICAvLyBTdG9wIGludGVydmFsLWJhc2VkIHJlZnJlc2hcbiAgICBpZiAobG9nc0ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKGxvZ3NJbnRlcnZhbCk7XG4gICAgICBsb2dzSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsb2dFdmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZShgL2FwaS92MS9sb2dzL3N0cmVhbS8ke2NvbnRhaW5lcklkfWApO1xuICAgICAgaXNTdHJlYW1pbmcgPSB0cnVlO1xuXG4gICAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBzdHJlYW1CdG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDM0IExpdmUnO1xuICAgICAgc3RyZWFtQnRuLnRpdGxlID0gJ1N0cmVhbWluZyAtIGNsaWNrIHRvIHN0b3AnO1xuICAgICAgcGF1c2VCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgLy8gQWRkIHN0cmVhbWluZyBpbmRpY2F0b3IgdG8gaGVhZGVyXG4gICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXRpdGxlJyk7XG4gICAgICBpZiAoIXRpdGxlLnRleHRDb250ZW50LmluY2x1ZGVzKCdcdUQ4M0RcdUREMzQnKSkge1xuICAgICAgICB0aXRsZS5pbm5lckhUTUwgPSB0aXRsZS50ZXh0Q29udGVudC5yZXBsYWNlKCdcdUQ4M0RcdURDQ0InLCAnXHVEODNEXHVEQ0NCIFx1RDgzRFx1REQzNCcpO1xuICAgICAgfVxuXG4gICAgICBsb2dFdmVudFNvdXJjZS5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTtcblxuICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTdHJlYW0gZXJyb3I6JywgZGF0YS5lcnJvcik7XG4gICAgICAgICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQXBwZW5kIG5ldyBsb2cgZW50cnlcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGVudHJ5LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgICAgICAgIGVudHJ5LnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44cmVtOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsnO1xuXG4gICAgICAgICAgY29uc3Qgc3RyZWFtVHlwZSA9IGRhdGEuc3RyZWFtIHx8ICdzdGRvdXQnO1xuICAgICAgICAgIGNvbnN0IGlzRXJyb3IgPSBzdHJlYW1UeXBlID09PSAnc3RkZXJyJztcbiAgICAgICAgICBjb25zdCBsZXZlbENvbG9yID0gaXNFcnJvciA/ICd2YXIoLS1iYWQtZmcpJyA6ICd2YXIoLS1mZyknO1xuICAgICAgICAgIGNvbnN0IGJnQ29sb3IgPSBpc0Vycm9yID8gJ3ZhcigtLWJhZC1iZyknIDogJ3ZhcigtLW9rLWJnKSc7XG4gICAgICAgICAgY29uc3QgbGV2ZWxCYWRnZSA9IGA8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6ICR7YmdDb2xvcn07IGNvbG9yOiAke2xldmVsQ29sb3J9OyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43cmVtOyBmb250LXdlaWdodDogNjAwOyBtaW4td2lkdGg6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4ke2lzRXJyb3IgPyAnU1RERVJSJyA6ICdTVERPVVQnfTwvc3Bhbj5gO1xuXG4gICAgICAgICAgZW50cnkuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPiR7bGV2ZWxCYWRnZX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBjb2xvcjogJHtsZXZlbENvbG9yfTsgd29yZC1icmVhazogYnJlYWstYWxsOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XCI+JHtlc2NhcGVIdG1sKGRhdGEudGV4dCl9PC9kaXY+XG4gICAgICAgICAgYDtcblxuICAgICAgICAgIGxvZ3NDb250ZW50LmFwcGVuZENoaWxkKGVudHJ5KTtcblxuICAgICAgICAgIC8vIEF1dG8tc2Nyb2xsIHRvIGJvdHRvbVxuICAgICAgICAgIGxvZ3NDb250ZW50LnNjcm9sbFRvcCA9IGxvZ3NDb250ZW50LnNjcm9sbEhlaWdodDtcblxuICAgICAgICAgIC8vIExpbWl0IGVudHJpZXMgdG8gcHJldmVudCBtZW1vcnkgaXNzdWVzIChrZWVwIGxhc3QgNTAwKVxuICAgICAgICAgIHdoaWxlIChsb2dzQ29udGVudC5jaGlsZHJlbi5sZW5ndGggPiA1MDApIHtcbiAgICAgICAgICAgIGxvZ3NDb250ZW50LnJlbW92ZUNoaWxkKGxvZ3NDb250ZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzdHJlYW0gZGF0YTonLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBsb2dFdmVudFNvdXJjZS5vbmVycm9yID0gKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnIpO1xuICAgICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgc3RyZWFtaW5nOicsIGVycik7XG4gICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcExvZ1N0cmVhbWluZygpIHtcbiAgICBpZiAobG9nRXZlbnRTb3VyY2UpIHtcbiAgICAgIGxvZ0V2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICBsb2dFdmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIGlzU3RyZWFtaW5nID0gZmFsc2U7XG5cbiAgICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKTtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy10aXRsZScpO1xuXG4gICAgaWYgKHN0cmVhbUJ0bikge1xuICAgICAgc3RyZWFtQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENFMSBMaXZlJztcbiAgICAgIHN0cmVhbUJ0bi50aXRsZSA9ICdFbmFibGUgcmVhbC10aW1lIHN0cmVhbWluZyc7XG4gICAgfVxuXG4gICAgaWYgKHBhdXNlQnRuKSB7XG4gICAgICBwYXVzZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICB0aXRsZS50ZXh0Q29udGVudCA9IHRpdGxlLnRleHRDb250ZW50LnJlcGxhY2UoJyBcdUQ4M0RcdUREMzQnLCAnJyk7XG4gICAgfVxuXG4gICAgLy8gUmVzdGFydCBpbnRlcnZhbC1iYXNlZCByZWZyZXNoIGlmIGNvbnRhaW5lciBsb2dzIG1vZGFsIGlzIG9wZW5cbiAgICBpZiAoY29udGFpbmVyTG9nc01vZGUgJiYgY3VycmVudENvbnRhaW5lcklkICYmICFsb2dzSW50ZXJ2YWwpIHtcbiAgICAgIGxvZ3NJbnRlcnZhbCA9IHNldEludGVydmFsKHVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5LCBEQy5QT0xMLkxPR1MpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IENPTlRBSU5FUiBMT0dTID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDb250YWluZXJMb2dzKGNvbnRhaW5lcklkLCBsaW5lcyA9IDEwMCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IGAvYXBpL3YxL2xvZ3MvY29udGFpbmVyLyR7Y29udGFpbmVySWR9P3RhaWw9JHtsaW5lc30mdGltZXN0YW1wcz10cnVlYDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChlbmRwb2ludCwge1xuICAgICAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICAgICAgaGVhZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQ2FjaGUtQ29udHJvbCc6ICduby1jYWNoZScgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQubG9ncykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2dzOiByZXN1bHQubG9ncyxcbiAgICAgICAgICAgIGNvdW50OiByZXN1bHQuY291bnQsXG4gICAgICAgICAgICBjb250YWluZXJOYW1lOiByZXN1bHQuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcklkOiByZXN1bHQuY29udGFpbmVySWRcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiByZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBjb250YWluZXIgbG9ncycgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQ29udGFpbmVyIGxvZ3MgZmV0Y2ggZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQ29udGFpbmVyTG9nRW50cnkobG9nKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgcGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuOHJlbTsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7JztcblxuICAgIGNvbnN0IHN0cmVhbUNvbG9yID0gbG9nLnN0cmVhbSA9PT0gJ3N0ZGVycicgPyAndmFyKC0tYmFkLWZnKScgOiAndmFyKC0tZmcpJztcbiAgICBjb25zdCBzdHJlYW1CYWRnZSA9IGxvZy5zdHJlYW0gPT09ICdzdGRlcnInID9cbiAgICAgICc8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLWJhZC1iZyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43cmVtOyBmb250LXdlaWdodDogNjAwO1wiPlNUREVSUjwvc3Bhbj4nIDpcbiAgICAgICc8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLW9rLWJnKTsgY29sb3I6IHZhcigtLW9rLWZnKTsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuN3JlbTsgZm9udC13ZWlnaHQ6IDYwMDtcIj5TVERPVVQ8L3NwYW4+JztcblxuICAgIGRpdi5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleC1zaHJpbms6IDA7XCI+JHtzdHJlYW1CYWRnZX08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBjb2xvcjogJHtzdHJlYW1Db2xvcn07IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgd2hpdGUtc3BhY2U6IHByZS13cmFwO1wiPiR7ZXNjYXBlSHRtbChsb2cudGV4dCl9PC9kaXY+XG4gICAgYDtcblxuICAgIHJldHVybiBkaXY7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVDb250YWluZXJMb2dzRGlzcGxheSgpIHtcbiAgICBpZiAobG9nc1BhdXNlZCB8fCAhY3VycmVudENvbnRhaW5lcklkIHx8ICFjb250YWluZXJMb2dzTW9kZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbGluZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nLWxpbmVzJykudmFsdWUpO1xuICAgIGNvbnN0IGxvZ3NDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtY29udGVudCcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoQ29udGFpbmVyTG9ncyhjdXJyZW50Q29udGFpbmVySWQsIGxpbmVzKTtcblxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjJyZW07IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2QTBcdUZFMEYgRXJyb3I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+JHtlc2NhcGVIdG1sKHJlc3VsdC5lcnJvcil9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgaGVhZGVyIHJvd1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC43NXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLW11dGVkKTsgcG9zaXRpb246IHN0aWNreTsgdG9wOiAwO1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleC1zaHJpbms6IDA7IHdpZHRoOiA4MHB4O1wiPlN0cmVhbTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+TG9nIE91dHB1dDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcblxuICAgICAgaWYgKHJlc3VsdC5sb2dzICYmIHJlc3VsdC5sb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LmxvZ3MuZm9yRWFjaChsb2cgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvZ0VsZW1lbnQgPSByZW5kZXJDb250YWluZXJMb2dFbnRyeShsb2cpO1xuICAgICAgICAgIGxvZ3NDb250ZW50LmFwcGVuZENoaWxkKGxvZ0VsZW1lbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBdXRvLXNjcm9sbCB0byBib3R0b21cbiAgICAgICAgbG9nc0NvbnRlbnQuc2Nyb2xsVG9wID0gbG9nc0NvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MICs9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgICAgTm8gbG9ncyBhdmFpbGFibGUgZm9yIHRoaXMgY29udGFpbmVyXG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cbiAgICAgICAgICBGYWlsZWQgdG8gZmV0Y2ggbG9nczogJHtlc2NhcGVIdG1sKGVycm9yLm1lc3NhZ2UpfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5Db250YWluZXJMb2dzTW9kYWwoY29udGFpbmVySWQsIGNvbnRhaW5lck5hbWUpIHtcbiAgICBjdXJyZW50Q29udGFpbmVySWQgPSBjb250YWluZXJJZDtcbiAgICBjdXJyZW50Q29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7XG4gICAgY29udGFpbmVyTG9nc01vZGUgPSB0cnVlO1xuICAgIGZpbGVMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcblxuICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIHN0cmVhbWluZ1xuICAgIHN0b3BMb2dTdHJlYW1pbmcoKTtcblxuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXRpdGxlJyk7XG4gICAgY29uc3QgcGF1c2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1wYXVzZScpO1xuICAgIGNvbnN0IHN0cmVhbUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXN0cmVhbScpO1xuXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgXHVEODNEXHVEQ0NCICR7Y29udGFpbmVyTmFtZX0gLSBDb250YWluZXIgTG9nc2A7XG4gICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyM0Y4XHVGRTBGIFBhdXNlJztcbiAgICBwYXVzZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdwYXVzZWQnKTtcblxuICAgIC8vIFNob3cgc3RyZWFtIGJ1dHRvbiBmb3IgY29udGFpbmVyIGxvZ3NcbiAgICBpZiAoc3RyZWFtQnRuKSB7XG4gICAgICBzdHJlYW1CdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIEluaXRpYWwgbG9hZFxuICAgIHVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5KCk7XG5cbiAgICAvLyBTdGFydCBhdXRvLXJlZnJlc2ggZXZlcnkgMyBzZWNvbmRzXG4gICAgbG9nc0ludGVydmFsID0gc2V0SW50ZXJ2YWwodXBkYXRlQ29udGFpbmVyTG9nc0Rpc3BsYXksIERDLlBPTEwuTE9HUyk7XG4gIH1cblxuICAvLyA9PT09PSBGSUxFLUJBU0VEIExPR1MgKGZvciBuYXRpdmUgYXBwcykgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaEZpbGVMb2dzKGxvZ1BhdGgsIGxpbmVzID0gMTAwKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gYC9hcGkvdjEvbG9ncy9maWxlP3BhdGg9JHtlbmNvZGVVUklDb21wb25lbnQobG9nUGF0aCl9JnRhaWw9JHtsaW5lc31gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGVuZHBvaW50LCB7XG4gICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsICdDYWNoZS1Db250cm9sJzogJ25vLWNhY2hlJyB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5sb2dzKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvZ3M6IHJlc3VsdC5sb2dzLFxuICAgICAgICAgICAgY291bnQ6IHJlc3VsdC5jb3VudCxcbiAgICAgICAgICAgIGxvZ1BhdGg6IHJlc3VsdC5sb2dQYXRoLFxuICAgICAgICAgICAgdG90YWxMaW5lczogcmVzdWx0LnRvdGFsTGluZXNcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiByZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBmaWxlIGxvZ3MnIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHJlc3VsdC5lcnJvciB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZpbGUgbG9ncyBmZXRjaCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJGaWxlTG9nRW50cnkobG9nKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgcGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuOHJlbTsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7JztcblxuICAgIGNvbnN0IHRleHQgPSBsb2cudGV4dDtcbiAgICBsZXQgbG9nTGV2ZWwgPSAnSU5GTyc7XG4gICAgbGV0IGxldmVsQ29sb3IgPSAndmFyKC0tZmcpJztcblxuICAgIGlmICh0ZXh0Lm1hdGNoKC9FUlJPUnxGQVRBTHxDUklUSUNBTC9pKSkge1xuICAgICAgbG9nTGV2ZWwgPSAnRVJST1InO1xuICAgICAgbGV2ZWxDb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICB9IGVsc2UgaWYgKHRleHQubWF0Y2goL1dBUk58V0FSTklORy9pKSkge1xuICAgICAgbG9nTGV2ZWwgPSAnV0FSTic7XG4gICAgICBsZXZlbENvbG9yID0gJyNmMzljMTInO1xuICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaCgvREVCVUcvaSkpIHtcbiAgICAgIGxvZ0xldmVsID0gJ0RFQlVHJztcbiAgICAgIGxldmVsQ29sb3IgPSAndmFyKC0tbXV0ZWQpJztcbiAgICB9XG5cbiAgICBjb25zdCBiZ0NvbG9yID0gbGV2ZWxDb2xvciA9PT0gJ3ZhcigtLWJhZC1mZyknID8gJ3ZhcigtLWJhZC1iZyknIDogJ3ZhcigtLW9rLWJnKSc7XG4gICAgY29uc3QgbGV2ZWxCYWRnZSA9IGA8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6ICR7YmdDb2xvcn07IGNvbG9yOiAke2xldmVsQ29sb3J9OyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43cmVtOyBmb250LXdlaWdodDogNjAwOyBtaW4td2lkdGg6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4ke2xvZ0xldmVsfTwvc3Bhbj5gO1xuXG4gICAgZGl2LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj4ke2xldmVsQmFkZ2V9PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgY29sb3I6ICR7bGV2ZWxDb2xvcn07IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgd2hpdGUtc3BhY2U6IHByZS13cmFwO1wiPiR7ZXNjYXBlSHRtbCh0ZXh0KX08L2Rpdj5cbiAgICBgO1xuXG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVMb2dzRGlzcGxheSgpIHtcbiAgICBpZiAobG9nc1BhdXNlZCB8fCAhY3VycmVudExvZ1BhdGggfHwgIWZpbGVMb2dzTW9kZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbGluZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nLWxpbmVzJykudmFsdWUpO1xuICAgIGNvbnN0IGxvZ3NDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtY29udGVudCcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoRmlsZUxvZ3MoY3VycmVudExvZ1BhdGgsIGxpbmVzKTtcblxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjJyZW07IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2QTBcdUZFMEYgRXJyb3I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+JHtlc2NhcGVIdG1sKHJlc3VsdC5lcnJvcil9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjc1cmVtOyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwb3NpdGlvbjogc3RpY2t5OyB0b3A6IDA7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OiAxO1wiPkxvZyBPdXRwdXQgKCR7cmVzdWx0LmNvdW50fSBvZiAke3Jlc3VsdC50b3RhbExpbmVzfSBsaW5lcyk8L3NwYW4+XG4gICAgICAgIDwvZGl2PmA7XG5cbiAgICAgIGlmIChyZXN1bHQubG9ncyAmJiByZXN1bHQubG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5sb2dzLmZvckVhY2gobG9nID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dFbGVtZW50ID0gcmVuZGVyRmlsZUxvZ0VudHJ5KGxvZyk7XG4gICAgICAgICAgbG9nc0NvbnRlbnQuYXBwZW5kQ2hpbGQobG9nRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBsb2dzQ29udGVudC5zY3JvbGxUb3AgPSBsb2dzQ29udGVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgKz0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICBObyBsb2dzIGF2YWlsYWJsZSBpbiB0aGlzIGZpbGVcbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICAgIEZhaWxlZCB0byBmZXRjaCBsb2dzOiAke2VzY2FwZUh0bWwoZXJyb3IubWVzc2FnZSl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbkZpbGVMb2dzTW9kYWwobG9nUGF0aCwgc2VydmljZU5hbWUpIHtcbiAgICBjdXJyZW50TG9nUGF0aCA9IGxvZ1BhdGg7XG4gICAgY3VycmVudExvZ1NlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7XG4gICAgZmlsZUxvZ3NNb2RlID0gdHJ1ZTtcbiAgICBjb250YWluZXJMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXRpdGxlJyk7XG4gICAgY29uc3QgcGF1c2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1wYXVzZScpO1xuICAgIGNvbnN0IHN0cmVhbUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXN0cmVhbScpO1xuXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgXHVEODNEXHVEQ0NCICR7c2VydmljZU5hbWV9IC0gQXBwbGljYXRpb24gTG9nc2A7XG4gICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyM0Y4XHVGRTBGIFBhdXNlJztcbiAgICBwYXVzZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdwYXVzZWQnKTtcblxuICAgIC8vIEhpZGUgc3RyZWFtIGJ1dHRvbiBmb3IgZmlsZSBsb2dzIChvbmx5IGF2YWlsYWJsZSBmb3IgY29udGFpbmVyIGxvZ3MpXG4gICAgaWYgKHN0cmVhbUJ0bikge1xuICAgICAgc3RyZWFtQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgdXBkYXRlRmlsZUxvZ3NEaXNwbGF5KCk7XG4gICAgbG9nc0ludGVydmFsID0gc2V0SW50ZXJ2YWwodXBkYXRlRmlsZUxvZ3NEaXNwbGF5LCBEQy5QT0xMLkxPR1MpO1xuICB9XG5cbiAgLy8gPT09PT0gRVZFTlQgTElTVEVORVJTID09PT09XG5cbiAgLy8gRE5TIGxvZyBidXR0b25zIFx1MjAxNCBldmVudCBkZWxlZ2F0aW9uIGZvciBkeW5hbWljIGNhcmRzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IGxvZ3NCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbaWQkPVwiLWxvZ3NcIl0nKTtcbiAgICBpZiAoIWxvZ3NCdG4pIHJldHVybjtcbiAgICBjb25zdCBkbnNJZCA9IGxvZ3NCdG4uaWQucmVwbGFjZSgnLWxvZ3MnLCAnJyk7XG4gICAgaWYgKCFTSVRFLmRuc1NlcnZlcnNbZG5zSWRdKSByZXR1cm47XG4gICAgb3BlbkxvZ3NNb2RhbChkbnNJZCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLWNsb3NlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VMb2dzTW9kYWwpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvZ3NQYXVzZWQgPSAhbG9nc1BhdXNlZDtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG5cbiAgICBpZiAobG9nc1BhdXNlZCkge1xuICAgICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyNUI2XHVGRTBGIFJlc3VtZSc7XG4gICAgICBwYXVzZUJ0bi5jbGFzc0xpc3QuYWRkKCdwYXVzZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyM0Y4XHVGRTBGIFBhdXNlJztcbiAgICAgIHBhdXNlQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3BhdXNlZCcpO1xuICAgICAgdXBkYXRlTG9nc0Rpc3BsYXkoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2ctbGluZXMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGlmICghbG9nc1BhdXNlZCkge1xuICAgICAgdXBkYXRlTG9nc0Rpc3BsYXkoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFN0cmVhbSBidXR0b24gZm9yIHJlYWwtdGltZSBTU0UgbG9ncyAob25seSB3b3JrcyB3aXRoIGNvbnRhaW5lciBsb2dzKVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKCFjb250YWluZXJMb2dzTW9kZSB8fCAhY3VycmVudENvbnRhaW5lcklkKSB7XG4gICAgICAvLyBTdHJlYW1pbmcgb25seSBhdmFpbGFibGUgZm9yIGNvbnRhaW5lciBsb2dzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyZWFtaW5nKSB7XG4gICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0TG9nU3RyZWFtaW5nKGN1cnJlbnRDb250YWluZXJJZCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDbG9zZSBtb2RhbCBvbiBvdXRzaWRlIGNsaWNrXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLW1vZGFsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQuaWQgPT09ICdsb2dzLW1vZGFsJykge1xuICAgICAgY2xvc2VMb2dzTW9kYWwoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsb3NlIGxvZ3MtbW9kYWwgb24gRXNjYXBlIGtleVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKT8uY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgICAgY2xvc2VMb2dzTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PT09IEVYUE9SVFMgPT09PT1cbiAgd2luZG93Lm9wZW5Db250YWluZXJMb2dzTW9kYWwgPSBvcGVuQ29udGFpbmVyTG9nc01vZGFsO1xuICB3aW5kb3cub3BlbkZpbGVMb2dzTW9kYWwgPSBvcGVuRmlsZUxvZ3NNb2RhbDtcbiAgd2luZG93Lm9wZW5Mb2dzTW9kYWwgPSBvcGVuTG9nc01vZGFsO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIE1PREFMIFRFTVBMQVRFUyA9PT09PT09PT09XG4vLyBJbmplY3RzIHRoZSBIVE1MIGZvciBzZXJ2aWNlIGVkaXQsIGRlbGV0ZSwgYW5kIGFkZCBtb2RhbHMgaW50byB0aGUgRE9NLlxuLy8gTXVzdCBsb2FkIGJlZm9yZSBzZXJ2aWNlLWNydWQuanMgYW5kIHNlcnZpY2UtY3JlYXRlLmpzLlxuKGZ1bmN0aW9uICgpIHtcblxuICBpbmplY3RNb2RhbCgnc2VydmljZS1lZGl0LW1vZGFsJywgYFxuICA8ZGl2IGlkPVwic2VydmljZS1lZGl0LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA1MDBweDsgbWF4LXdpZHRoOiA2MDBweDtcIj5cbiAgICAgIDxoMyBpZD1cInNlcnZpY2UtZWRpdC10aXRsZVwiPkVkaXQgU2VydmljZTwvaDM+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDwhLS0gU2VydmljZSBJbmZvIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMnB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogOHB4O1wiPlxuICAgICAgICAgIDxpbWcgaWQ9XCJlZGl0LXNlcnZpY2UtbG9nby1wcmV2aWV3XCIgc3JjPVwiXCIgYWx0PVwiXCIgc3R5bGU9XCJ3aWR0aDogNDhweDsgaGVpZ2h0OiA0OHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IG9iamVjdC1maXQ6IGNvbnRhaW47IGJhY2tncm91bmQ6IHZhcigtLWJnKTtcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgICAgPGRpdiBpZD1cImVkaXQtc2VydmljZS11cmwtZGlzcGxheVwiIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERpc3BsYXkgTmFtZSAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdC1zZXJ2aWNlLW5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBEaXNwbGF5IE5hbWVcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWRpdC1zZXJ2aWNlLW5hbWVcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiBwbGFjZWhvbGRlcj1cIlNlcnZpY2UgbmFtZSBzaG93biBvbiBkYXNoYm9hcmRcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFN1YmRvbWFpbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdC1zdWJkb21haW5cIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBTdWJkb21haW5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy1nYXAtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkaXQtc3ViZG9tYWluXCIgY2xhc3M9XCJpbnB1dC1mbGV4XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiZWRpdC10bGQtc3VmZml4XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPi5ob21lPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBvcnQgLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImVkaXQtcG9ydFwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIFBvcnRcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJlZGl0LXBvcnRcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhpbnQtc21cIj5cbiAgICAgICAgICAgIFRoZSBwb3J0IENhZGR5IHdpbGwgcHJveHkgdG8gKGNvbnRhaW5lcidzIGV4cG9zZWQgcG9ydClcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBJUCBBZGRyZXNzIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZGl0LWlwXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlxuICAgICAgICAgICAgSVAgQWRkcmVzc1xuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZGl0LWlwXCIgY2xhc3M9XCJmb3JtLWlucHV0LW1kXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWlsc2NhbGUgUHJvdGVjdGlvbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImVkaXQtdGFpbHNjYWxlLW9ubHlcIiBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgLz5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy01MDBcIj5UYWlsc2NhbGUtT25seSBBY2Nlc3M8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlJlc3RyaWN0IHRoaXMgc2VydmljZSB0byBUYWlsc2NhbGUgdXNlcnMgb25seTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBMb2dvIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBTZXJ2aWNlIExvZ29cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy1nYXAtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkaXQtbG9nby11cmxcIiBwbGFjZWhvbGRlcj1cIi9hc3NldHMvc2VydmljZS5wbmcgb3IgaHR0cHM6Ly8uLi5cIiBjbGFzcz1cImlucHV0LWZsZXhcIiAvPlxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwicGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiZWRpdC1sb2dvLWZpbGVcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgICAgIFVwbG9hZFxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+XG4gICAgICAgICAgICBFbnRlciBhIFVSTCBvciB1cGxvYWQgYW4gaW1hZ2UgZmlsZSAoUE5HLCBKUEcsIFNWRylcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBDYXRlZ29yeSAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdC1zZXJ2aWNlLWNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlxuICAgICAgICAgICAgQ2F0ZWdvcnlcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJlZGl0LXNlcnZpY2UtY2F0ZWdvcnlcIiBkYXRhLXJvbGU9XCJzZXJ2aWNlLWNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWlucHV0LW1kXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5vIGNhdGVnb3J5IFx1MjAxNDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAyNHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic2VydmljZS1lZGl0LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwic2VydmljZS1lZGl0LXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5cbiAgICAgICAgICBTYXZlIENoYW5nZXNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgaW5qZWN0TW9kYWwoJ2RlbGV0ZS1zZXJ2aWNlLW1vZGFsJywgYFxuICA8ZGl2IGlkPVwiZGVsZXRlLXNlcnZpY2UtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDQwMHB4OyBtYXgtd2lkdGg6IDUwMHB4O1wiPlxuICAgICAgPGgzIGlkPVwiZGVsZXRlLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtYi0xNlwiPkRlbGV0ZSBTZXJ2aWNlPC9oMz5cblxuICAgICAgPGRpdiBpZD1cImRlbGV0ZS1tb2RhbC1tZXNzYWdlXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4OyBsaW5lLWhlaWdodDogMS41O1wiPlxuICAgICAgICA8IS0tIER5bmFtaWMgY29udGVudCAtLT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwiZGVsZXRlLW1vZGFsLWNvbnRhaW5lci1pbmZvXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAyMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPkRvY2tlciBDb250YWluZXI8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRlbGV0ZS1tb2RhbC1jb250YWluZXItbmFtZVwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjlyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkZWxldGUtbW9kYWwtY2FuY2VsXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDIwcHg7XCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkZWxldGUtbW9kYWwtcmVtb3ZlXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDIwcHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPlxuICAgICAgICAgIFJlbW92ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRlbGV0ZS1tb2RhbC1kZWxldGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDEwcHggMjBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNlNzRjM2MgMjAlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1jb2xvcjogI2U3NGMzYzsgY29sb3I6ICNlNzRjM2M7XCI+XG4gICAgICAgICAgRGVsZXRlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJkZWxldGUtbW9kYWwtaGVscFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW11dGVkKSAxMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogOHB4OyBmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgIDxkaXY+PHN0cm9uZz5SZW1vdmU6PC9zdHJvbmc+IFJlbW92ZSBmcm9tIGRhc2hib2FyZCBvbmx5IChjb250YWluZXIga2VlcHMgcnVubmluZyk8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDZweDtcIj48c3Ryb25nPkRlbGV0ZTo8L3N0cm9uZz4gRnVsbCByZW1vdmFsIC0gc3RvcHMgY29udGFpbmVyLCByZW1vdmVzIEROUyAmIENhZGR5IGNvbmZpZzwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGluamVjdE1vZGFsKCdhZGQtc2VydmljZS1tb2RhbCcsIGBcbiAgPGRpdiBpZD1cImFkZC1zZXJ2aWNlLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0MjBweDsgbWF4LXdpZHRoOiA1MjBweDtcIj5cbiAgICAgIDxoMz5BZGQgU2VydmljZTwvaDM+XG5cbiAgICAgIDwhLS0gU2VydmljZSBUeXBlIFRhYnMgLS0+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycHg7IG1hcmdpbi1ib3R0b206IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiA4cHg7IHBhZGRpbmc6IDNweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGxhYmVsIGlkPVwidGFiLWxvY2FsXCIgc3R5bGU9XCJmbGV4OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC13ZWlnaHQ6IDUwMDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJnKTsgdHJhbnNpdGlvbjogYWxsIDAuMTVzO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic2VydmljZS10eXBlXCIgdmFsdWU9XCJsb2NhbFwiIGlkPVwic2VydmljZS10eXBlLWxvY2FsXCIgY2hlY2tlZCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICBMb2NhbFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgaWQ9XCJ0YWItZXh0ZXJuYWxcIiBzdHlsZT1cImZsZXg6IDE7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtOyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzZXJ2aWNlLXR5cGVcIiB2YWx1ZT1cImV4dGVybmFsXCIgaWQ9XCJzZXJ2aWNlLXR5cGUtZXh0ZXJuYWxcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICBFeHRlcm5hbFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBpZD1cInNlcnZpY2UtdHlwZS1kZXNjcmlwdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L3NwYW4+XG5cbiAgICAgIDwhLS0gTE9DQUwgU0VSVklDRSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJsb2NhbC1zZXJ2aWNlLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZXJ2aWNlLW5hbWUtaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPk5hbWU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic2VydmljZS1uYW1lLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBKZWxseWZpblwiIHN0eWxlPVwiZm9udC1zaXplOiAxcmVtO1wiIC8+XG4gICAgICAgICAgPGRpdiBpZD1cInN1YmRvbWFpbi1wcmV2aWV3XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tdG9wOiA0cHg7IG1pbi1oZWlnaHQ6IDFlbTtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtMmNvbFwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1wb3J0LWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4OyBkaXNwbGF5OiBibG9jaztcIj5Qb3J0PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJzZXJ2aWNlLXBvcnQtaW5wdXRcIiBwbGFjZWhvbGRlcj1cImUuZy4sIDgwOTZcIiBzdHlsZT1cImZvbnQtc2l6ZTogMXJlbTtcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1pcC1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDsgZGlzcGxheTogYmxvY2s7XCI+SVAgQWRkcmVzczwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNlcnZpY2UtaXAtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIkF1dG8tZGV0ZWN0ZWRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMXJlbTtcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLWlwLWJ1dHRvbnNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyBtYXJnaW4tdG9wOiA0cHg7IGZsZXgtd3JhcDogd3JhcDtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJxdWljay1pcC1idG5cIiBkYXRhLWlwPVwiMTI3LjAuMC4xXCIgdGl0bGU9XCJMb2NhbGhvc3RcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBwYWRkaW5nOiAycHggNnB4O1wiPmxvY2FsaG9zdDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInF1aWNrLWlwLWJ0blwiIGRhdGEtaXA9XCJcIiBpZD1cInF1aWNrLWlwLWxhblwiIHRpdGxlPVwiTEFOIElQXCIgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgcGFkZGluZzogMnB4IDZweDtcIj5MQU48L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJxdWljay1pcC1idG5cIiBkYXRhLWlwPVwiXCIgaWQ9XCJxdWljay1pcC10YWlsc2NhbGVcIiB0aXRsZT1cIlRhaWxzY2FsZSBJUFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IHBhZGRpbmc6IDJweCA2cHg7XCI+VGFpbHNjYWxlPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBPcHRpb25zIChjb2xsYXBzZWQgYnkgZGVmYXVsdCkgLS0+XG4gICAgICAgIDxkZXRhaWxzIGlkPVwibG9jYWwtYWR2YW5jZWQtb3B0aW9uc1wiPlxuICAgICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC1zaXplOiAwLjhyZW07IHVzZXItc2VsZWN0OiBub25lO1wiPk9wdGlvbnM8L3N1bW1hcnk+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7IGRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgZm9udC1zaXplOiAwLjhyZW07XCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLTJjb2xcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1zdWJkb21haW4taW5wdXRcIj5TdWJkb21haW46PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNlcnZpY2Utc3ViZG9tYWluLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJhdXRvLWRlcml2ZWQgZnJvbSBuYW1lXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlcnZpY2UtbG9nby1pbnB1dFwiPkxvZ28gVVJMOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzZXJ2aWNlLWxvZ28taW5wdXRcIiBwbGFjZWhvbGRlcj1cIi9hc3NldHMvbmFtZS5wbmdcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IHN0YXJ0O1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImNyZWF0ZS1kbnMtcmVjb3JkXCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICAgIENyZWF0ZSBETlMgUmVjb3JkXG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNzbC10eXBlLXNlbGVjdFwiPlNTTDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzc2wtdHlwZS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNhZGR5LW1hbmFnZWRcIj5DYWRkeSBNYW5hZ2VkIChJbnRlcm5hbCk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJsZXRzZW5jcnlwdFwiPkxldCdzIEVuY3J5cHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJleGlzdGluZy1jYVwiPkV4aXN0aW5nIENBPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3VzdG9tLWNhXCI+Q3VzdG9tIENBPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJkbnMtY29uZmlnXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLTJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRucy10dGwtaW5wdXRcIj5ETlMgVFRMOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZG5zLXR0bC1pbnB1dFwiIHZhbHVlPVwiMzAwXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNhZGR5ZmlsZS1wYXRoLWlucHV0XCI+Q2FkZHlmaWxlIFBhdGg6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2FkZHlmaWxlLXBhdGgtaW5wdXRcIiB2YWx1ZT1cIkM6XFxcXGNhZGR5XFxcXENhZGR5ZmlsZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJleGlzdGluZy1jYS1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleGlzdGluZy1jYS1zZWxlY3RcIj5FeGlzdGluZyBDQTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3ctZ2FwXCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV4aXN0aW5nLWNhLXNlbGVjdFwiIHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5Mb2FkaW5nIENBcy4uLjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwicmVmcmVzaC1jYXNcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj5cXHV7MUY1MDR9PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJjdXN0b20tY2EtY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2EtbmFtZS1pbnB1dFwiPkNBIE5hbWU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjYS1uYW1lLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBzYW1pLWNhXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGlkPVwibWFudWFsLXRhaWxzY2FsZS1zdGF0dXNcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuNzVyZW07XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBUYWlsc2NhbGUuLi48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hbnVhbC10YWlsc2NhbGUtb25seVwiIC8+XG4gICAgICAgICAgICAgIFRhaWxzY2FsZS1Pbmx5IEFjY2Vzc1xuICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwicmVsb2FkLWNhZGR5XCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICBSZWxvYWQgQ2FkZHkgYWZ0ZXIgYWRkaW5nXG4gICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICA8IS0tIENhdGVnb3J5IC0tPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlcnZpY2UtY2F0ZWdvcnktaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPkNhdGVnb3J5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInNlcnZpY2UtY2F0ZWdvcnktaW5wdXRcIiBkYXRhLXJvbGU9XCJzZXJ2aWNlLWNhdGVnb3J5XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5vIGNhdGVnb3J5IFx1MjAxNDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAzcHg7XCI+R3JvdXAgc2VydmljZXMgb24gdGhlIGRhc2hib2FyZCBieSBwdXJwb3NlIChNZWRpYSwgUHJvZHVjdGl2aXR5LCBldGMuKTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxociBzdHlsZT1cImJvcmRlcjogbm9uZTsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IG1hcmdpbjogNHB4IDA7XCIgLz5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtMmNvbFwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlbmFibGUtYXV0aFwiIC8+XG4gICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImVuYWJsZS1jb3JzXCIgLz5cbiAgICAgICAgICAgICAgICAgIENPUlMgSGVhZGVyc1xuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVwc3RyZWFtLXBhdGgtaW5wdXRcIj5VcHN0cmVhbSBQYXRoOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ1cHN0cmVhbS1wYXRoLWlucHV0XCIgdmFsdWU9XCIvXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImhlYWx0aC1jaGVjay1pbnB1dFwiPkhlYWx0aCBDaGVjazo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVhbHRoLWNoZWNrLWlucHV0XCIgcGxhY2Vob2xkZXI9XCIvaGVhbHRoXCIgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGltZW91dC1pbnB1dFwiPlRpbWVvdXQgKHMpOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInRpbWVvdXQtaW5wdXRcIiB2YWx1ZT1cIjMwXCIgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY3VzdG9tLWhlYWRlcnMtaW5wdXRcIj5IZWFkZXJzIChKU09OKTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImN1c3RvbS1oZWFkZXJzLWlucHV0XCIgcGxhY2Vob2xkZXI9J3tcIlgtQ3VzdG9tXCI6IFwidmFsdWVcIn0nIHJvd3M9XCIyXCIgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTtcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGV0YWlscz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVYVEVSTkFMIFNFUlZJQ0UgLS0+XG4gICAgICA8ZGl2IGlkPVwiZXh0ZXJuYWwtc2VydmljZS1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEycHg7XCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHRlcm5hbC1zZXJ2aWNlLW5hbWVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPk5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLW5hbWVcIiBwbGFjZWhvbGRlcj1cImUuZy4sIFJhZGFyciAoU2VlZGhvc3QpXCIgc3R5bGU9XCJmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJleHRlcm5hbC1zdWJkb21haW4tcHJldmlld1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgbWFyZ2luLXRvcDogNHB4OyBtaW4taGVpZ2h0OiAxZW07XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4dGVybmFsLXNlcnZpY2UtdXJsXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4OyBkaXNwbGF5OiBibG9jaztcIj5FeHRlcm5hbCBVUkw8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cImV4dGVybmFsLXNlcnZpY2UtdXJsXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL3VzZXJuYW1lLnNlZWRob3N0LmV1L3JhZGFyclwiIHN0eWxlPVwiZm9udC1zaXplOiAxcmVtO1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIE9wdGlvbnMgKGNvbGxhcHNlZCBieSBkZWZhdWx0KSAtLT5cbiAgICAgICAgICA8ZGV0YWlscyBpZD1cImV4dGVybmFsLWFkdmFuY2VkLW9wdGlvbnNcIj5cbiAgICAgICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC1zaXplOiAwLjhyZW07IHVzZXItc2VsZWN0OiBub25lO1wiPk9wdGlvbnM8L3N1bW1hcnk+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDsgZGlzcGxheTogZ3JpZDsgZ2FwOiAxMHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpblwiPlN1YmRvbWFpbjo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpblwiIHBsYWNlaG9sZGVyPVwiYXV0by1kZXJpdmVkIGZyb20gbmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBpZD1cImV4dGVybmFsLWRvbWFpbi1wcmV2aWV3XCIgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS1sb2dvXCI+TG9nbyBVUkw6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXh0ZXJuYWwtc2VydmljZS1sb2dvXCIgcGxhY2Vob2xkZXI9XCIvYXNzZXRzL25hbWUucG5nXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS1pY29uXCI+SWNvbiBFbW9qaTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXh0ZXJuYWwtc2VydmljZS1pY29uXCIgcGxhY2Vob2xkZXI9XCJcXHV7MUYzQUN9XCIgbWF4bGVuZ3RoPVwiMlwiIHN0eWxlPVwid2lkdGg6IDYwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJleHRlcm5hbC1jcmVhdGUtZG5zXCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICAgIENyZWF0ZSBETlMgUmVjb3JkXG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXh0ZXJuYWwtY3JlYXRlLWNhZGR5XCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICAgIENyZWF0ZSBDYWRkeSBSZXZlcnNlIFByb3h5XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtcHJveHktaXBcIj5Qcm94eSBTZXJ2ZXIgSVA6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4dGVybmFsLXByb3h5LWlwXCIgcGxhY2Vob2xkZXI9XCJBdXRvLWRldGVjdGVkXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXh0ZXJuYWwtcHJlc2VydmUtaG9zdFwiIGNoZWNrZWQgLz5cbiAgICAgICAgICAgICAgICBQcmVzZXJ2ZSBIb3N0IEhlYWRlclxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV4dGVybmFsLWZvbGxvdy1yZWRpcmVjdHNcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICAgICAgRm9sbG93IFJlZGlyZWN0c1xuICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgIDwhLS0gQ2F0ZWdvcnkgKGV4dGVybmFsKSAtLT5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS1jYXRlZ29yeVwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDsgZGlzcGxheTogYmxvY2s7XCI+Q2F0ZWdvcnk8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLWNhdGVnb3J5XCIgZGF0YS1yb2xlPVwic2VydmljZS1jYXRlZ29yeVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5vIGNhdGVnb3J5IFx1MjAxNDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFkZC1zZXJ2aWNlLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYWRkLXNlcnZpY2UtY3JlYXRlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+Q3JlYXRlIFNlcnZpY2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gU0VSVklDRSBJTkZSQVNUUlVDVFVSRSA9PT09PT09PT09XG4vLyBDYWRkeSBjb25maWcgZ2VuZXJhdGlvbiwgRE5TIHJlY29yZCBjcmVhdGlvbiwgYW5kIHNlcnZpY2UgcmVnaXN0cmF0aW9uLlxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyA9PT09PSBMT0FEIEVYSVNUSU5HIENBcyA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRFeGlzdGluZ0NBcyhjYWRkeWZpbGVQYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY2FkZHkvY2FzP2NhZGR5ZmlsZVBhdGg9JHtlbmNvZGVVUklDb21wb25lbnQoY2FkZHlmaWxlUGF0aCl9YCk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBDQXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhpc3RpbmctY2Etc2VsZWN0Jyk7XG4gICAgICAgIHNlbGVjdC5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICBpZiAocmVzdWx0LmNhcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5ObyBDQXMgZm91bmQgaW4gQ2FkZHlmaWxlPC9vcHRpb24+JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgZXhpc3RpbmcgQ0EuLi48L29wdGlvbj4nO1xuICAgICAgICAgIHJlc3VsdC5jYXMuZm9yRWFjaChjYSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2EgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIG9wdGlvbi52YWx1ZSA9IGNhLmlkO1xuICAgICAgICAgICAgICBvcHRpb24udGV4dENvbnRlbnQgPSBjYS5kaXNwbGF5TmFtZSB8fCBjYS5uYW1lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3B0aW9uLnZhbHVlID0gY2E7XG4gICAgICAgICAgICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IGNhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhLmNhcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgQ0FzOicsIGVycm9yKTtcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGlzdGluZy1jYS1zZWxlY3QnKTtcbiAgICAgIHNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkVycm9yIGxvYWRpbmcgQ0FzPC9vcHRpb24+JztcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBHRU5FUkFURSBDQUREWSBDT05GSUcgPT09PT1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZUNhZGR5Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIHN1YmRvbWFpbixcbiAgICAgIHBvcnQsXG4gICAgICBpcCxcbiAgICAgIHNzbFR5cGUsXG4gICAgICBjYU5hbWUsXG4gICAgICBleGlzdGluZ0NhLFxuICAgICAgZW5hYmxlQXV0aCxcbiAgICAgIGVuYWJsZUNvcnMsXG4gICAgICBjdXN0b21IZWFkZXJzLFxuICAgICAgdXBzdHJlYW1QYXRoLFxuICAgICAgaGVhbHRoQ2hlY2ssXG4gICAgICB0aW1lb3V0LFxuICAgICAgdGFpbHNjYWxlT25seVxuICAgIH0gPSBjb25maWc7XG5cbiAgICBsZXQgY2FkZHlDb25maWcgPSBgJHtidWlsZERvbWFpbihzdWJkb21haW4pfSB7XFxuYDtcblxuICAgIC8vIFRhaWxzY2FsZS1vbmx5IGFjY2VzcyByZXN0cmljdGlvblxuICAgIGlmICh0YWlsc2NhbGVPbmx5KSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICBAYmxvY2tlZCBub3QgcmVtb3RlX2lwIDEwMC42NC4wLjAvMTBcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgcmVzcG9uZCBAYmxvY2tlZCBcIkFjY2VzcyBkZW5pZWQuIFRhaWxzY2FsZSBjb25uZWN0aW9uIHJlcXVpcmVkLlwiIDQwM1xcbmA7XG4gICAgfVxuXG4gICAgLy8gU1NMIENvbmZpZ3VyYXRpb25cbiAgICBzd2l0Y2ggKHNzbFR5cGUpIHtcbiAgICAgIGNhc2UgJ2xldHNlbmNyeXB0JzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjYWRkeS1tYW5hZ2VkJzpcbiAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgdGxzIGludGVybmFsXFxuYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdleGlzdGluZy1jYSc6XG4gICAgICAgIGlmIChleGlzdGluZ0NhKSB7XG4gICAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgdGxzIHtcXG4gICAgY2EgJHtleGlzdGluZ0NhfVxcbiAgfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjdXN0b20tY2EnOlxuICAgICAgICBpZiAoY2FOYW1lKSB7XG4gICAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgdGxzIHtcXG4gICAgY2EgJHtjYU5hbWV9XFxuICB9XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBBdXRoZW50aWNhdGlvblxuICAgIGlmIChlbmFibGVBdXRoKSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICBiYXNpY2F1dGgge1xcbiAgICBhZG1pbiAkMmEkMTQkaGFzaGVkX3Bhc3N3b3JkX2hlcmVcXG4gIH1cXG5gO1xuICAgIH1cblxuICAgIC8vIENPUlMgSGVhZGVyc1xuICAgIGlmIChlbmFibGVDb3JzKSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICBoZWFkZXIge1xcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiBcIipcIlxcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIEFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMgXCJHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBPUFRJT05TXCJcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgICBBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzIFwiQ29udGVudC1UeXBlLCBBdXRob3JpemF0aW9uXCJcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgfVxcbmA7XG4gICAgfVxuXG4gICAgLy8gQ3VzdG9tIEhlYWRlcnNcbiAgICBpZiAoY3VzdG9tSGVhZGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IEpTT04ucGFyc2UoY3VzdG9tSGVhZGVycyk7XG4gICAgICAgIGNhZGR5Q29uZmlnICs9IGAgIGhlYWRlciB7XFxuYDtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgICAke2tleX0gXCIke3ZhbHVlfVwiXFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhZGR5Q29uZmlnICs9IGAgIH1cXG5gO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgSlNPTiBpbiBjdXN0b20gaGVhZGVycycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhlYWx0aCBDaGVja1xuICAgIGlmIChoZWFsdGhDaGVjaykge1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgaGVhbHRoX3VyaSAke2hlYWx0aENoZWNrfVxcbmA7XG4gICAgfVxuXG4gICAgLy8gUmV2ZXJzZSBQcm94eVxuICAgIGNhZGR5Q29uZmlnICs9IGAgIHJldmVyc2VfcHJveHkgJHtpcH06JHtwb3J0fSB7XFxuYDtcbiAgICBpZiAodXBzdHJlYW1QYXRoICYmIHVwc3RyZWFtUGF0aCAhPT0gJy8nKSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIHJld3JpdGUgJHt1cHN0cmVhbVBhdGh9XFxuYDtcbiAgICB9XG4gICAgaWYgKHRpbWVvdXQgJiYgdGltZW91dCAhPT0gMzApIHtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgdHJhbnNwb3J0IGh0dHAge1xcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgICAgZGlhbF90aW1lb3V0ICR7dGltZW91dH1zXFxuYDtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgICByZXNwb25zZV9oZWFkZXJfdGltZW91dCAke3RpbWVvdXR9c1xcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIH1cXG5gO1xuICAgIH1cbiAgICBjYWRkeUNvbmZpZyArPSBgICB9XFxuYDtcblxuICAgIGNhZGR5Q29uZmlnICs9IGB9XFxuYDtcblxuICAgIHJldHVybiBjYWRkeUNvbmZpZztcbiAgfVxuXG4gIC8vID09PT09IENSRUFURSBETlMgUkVDT1JEID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRG5zUmVjb3JkKHN1YmRvbWFpbiwgaXAsIHR0bCA9IERDLkRFRkFVTFRTLlRUTCkge1xuICAgIGNvbnN0IGRuc1Rva2VuID0gd2luZG93LmdldFRva2VuKGdldFByaW1hcnlEbnNJZCgpLCAnYWRtaW4nKTtcblxuICAgIGlmICghZG5zVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRE5TIGFkbWluIHRva2VuIG5vdCBjb25maWd1cmVkLiBQbGVhc2Ugc2V0IGl0IGluIHRoZSBUb2tlbnMgbWVudS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkb21haW4gPSBidWlsZERvbWFpbihzdWJkb21haW4pO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9kbnMvcmVjb3JkJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZG9tYWluOiBkb21haW4sXG4gICAgICAgIGlwOiBpcCxcbiAgICAgICAgdHRsOiB0dGwsXG4gICAgICAgIHRva2VuOiBkbnNUb2tlbixcbiAgICAgICAgc2VydmVyOiBTSVRFLmRuc0lwXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBETlMgQVBJIEVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke2Vycm9yVGV4dH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBETlMgRXJyb3I6ICR7cmVzdWx0LmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gPT09PT0gQUREIFNFUlZJQ0UgVE8gQ09ORklHID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gYWRkU2VydmljZVRvQ29uZmlnKHNlcnZpY2VDb25maWcpIHtcbiAgICBjb25zdCBuZXdTZXJ2aWNlID0ge1xuICAgICAgaWQ6IHNlcnZpY2VDb25maWcuc3ViZG9tYWluLFxuICAgICAgbmFtZTogc2VydmljZUNvbmZpZy5uYW1lLFxuICAgICAgbG9nbzogc2VydmljZUNvbmZpZy5sb2dvIHx8IGAvYXNzZXRzLyR7c2VydmljZUNvbmZpZy5zdWJkb21haW59LnBuZ2BcbiAgICB9O1xuICAgIC8vIEZvcndhcmQgb3B0aW9uYWwgbWV0YWRhdGEgZmllbGRzIGlmIHByb3ZpZGVkXG4gICAgaWYgKHNlcnZpY2VDb25maWcuY2F0ZWdvcnkpIG5ld1NlcnZpY2UuY2F0ZWdvcnkgPSBzZXJ2aWNlQ29uZmlnLmNhdGVnb3J5O1xuICAgIGlmIChzZXJ2aWNlQ29uZmlnLmNvbnRhaW5lcklkKSBuZXdTZXJ2aWNlLmNvbnRhaW5lcklkID0gc2VydmljZUNvbmZpZy5jb250YWluZXJJZDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG5ld1NlcnZpY2UpXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBzZXJ2aWNlJyk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHdpbmRvdy5sb2FkU2VydmljZXMoKTtcbiAgICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcblxuICAgICAgcmV0dXJuIG5ld1NlcnZpY2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBhZGQgc2VydmljZSB0byBjb25maWc6JywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gQUREIFRPIENBRERZRklMRSA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFkZFRvQ2FkZHlmaWxlKGNvbmZpZykge1xuICAgIGNvbnN0IHN1YmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWlwLWlucHV0JykudmFsdWUudHJpbSgpIHx8ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUudHJpbSgpIHx8ICc4MCc7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NpdGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBkb21haW46IGJ1aWxkRG9tYWluKHN1YmRvbWFpbiksXG4gICAgICAgIHVwc3RyZWFtOiBgJHtpcH06JHtwb3J0fWAsXG4gICAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmICghcmVzcG9uc2Uub2sgfHwgIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8IGBDYWRkeSBBUEkgRXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gPT09PT0gV0lORE9XIEVYUE9SVFMgPT09PT1cblxuICB3aW5kb3cubG9hZEV4aXN0aW5nQ0FzID0gbG9hZEV4aXN0aW5nQ0FzO1xuICB3aW5kb3cuZ2VuZXJhdGVDYWRkeUNvbmZpZyA9IGdlbmVyYXRlQ2FkZHlDb25maWc7XG4gIHdpbmRvdy5jcmVhdGVEbnNSZWNvcmQgPSBjcmVhdGVEbnNSZWNvcmQ7XG4gIHdpbmRvdy5hZGRTZXJ2aWNlVG9Db25maWcgPSBhZGRTZXJ2aWNlVG9Db25maWc7XG4gIHdpbmRvdy5hZGRUb0NhZGR5ZmlsZSA9IGFkZFRvQ2FkZHlmaWxlO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIENSVUQgPT09PT09PT09PVxuLy8gRWRpdCwgZGVsZXRlLCBhbmQgdXBkYXRlIG9wZXJhdGlvbnMgZm9yIGV4aXN0aW5nIHNlcnZpY2VzLlxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyA9PT09PSBTRVJWSUNFIEVESVQgTU9EQUwgPT09PT1cbiAgbGV0IGN1cnJlbnRFZGl0U2VydmljZSA9IG51bGw7XG5cbiAgZnVuY3Rpb24gb3BlblNlcnZpY2VFZGl0TW9kYWwoc2VydmljZSkge1xuICAgIGN1cnJlbnRFZGl0U2VydmljZSA9IHNlcnZpY2U7XG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LW1vZGFsJyk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LXRpdGxlJykudGV4dENvbnRlbnQgPSBgRWRpdCAke3NlcnZpY2UubmFtZX1gO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtbmFtZScpLnZhbHVlID0gc2VydmljZS5uYW1lO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtdXJsLWRpc3BsYXknKS50ZXh0Q29udGVudCA9IHNlcnZpY2UudXJsIHx8IGJ1aWxkU2VydmljZVVybChzZXJ2aWNlLmlkKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zZXJ2aWNlLWxvZ28tcHJldmlldycpLnNyYyA9IHNlcnZpY2UubG9nbyB8fCBgL2Fzc2V0cy8ke3NlcnZpY2UuaWR9LnBuZ2A7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc3ViZG9tYWluJykudmFsdWUgPSBzZXJ2aWNlLmlkO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXBvcnQnKS52YWx1ZSA9IHNlcnZpY2UucG9ydCB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1pcCcpLnZhbHVlID0gc2VydmljZS5pcCB8fCAnbG9jYWxob3N0JztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC10YWlsc2NhbGUtb25seScpLmNoZWNrZWQgPSBzZXJ2aWNlLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2U7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtbG9nby11cmwnKS52YWx1ZSA9IHNlcnZpY2UubG9nbyB8fCAnJztcblxuICAgIC8vIFBvcHVsYXRlIHRoZSBjYXRlZ29yeSBzZWxlY3QgZm9yIHRoaXMgc2VydmljZSwgdGhlbiBzZXQgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgLy8gcG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMoKSB1c2VzIGRhdGEtY3VycmVudCBzbyB3ZSBzZXQgaXQgZmlyc3QsIHRoZW4gY2FsbC5cbiAgICBjb25zdCBjYXRlZ29yeVNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtY2F0ZWdvcnknKTtcbiAgICBpZiAoY2F0ZWdvcnlTZWxlY3QpIHtcbiAgICAgIGNhdGVnb3J5U2VsZWN0LmRhdGFzZXQuY3VycmVudCA9IHNlcnZpY2UuY2F0ZWdvcnkgfHwgJyc7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5wb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cucG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVNlcnZpY2VFZGl0TW9kYWwoKSB7XG4gICAgY2xvc2VNb2RhbCgnc2VydmljZS1lZGl0LW1vZGFsJyk7XG4gICAgY3VycmVudEVkaXRTZXJ2aWNlID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmVTZXJ2aWNlQ2hhbmdlcygpIHtcbiAgICBpZiAoIWN1cnJlbnRFZGl0U2VydmljZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3U3ViZG9tYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc3ViZG9tYWluJykudmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbmV3TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBuZXdQb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtcG9ydCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBuZXdJcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LWlwJykudmFsdWUudHJpbSgpIHx8ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHRhaWxzY2FsZU9ubHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC10YWlsc2NhbGUtb25seScpLmNoZWNrZWQ7XG4gICAgY29uc3QgbmV3TG9nbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LWxvZ28tdXJsJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IG5ld0NhdGVnb3J5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc2VydmljZS1jYXRlZ29yeScpPy52YWx1ZSB8fCAnJztcblxuICAgIGlmICghbmV3U3ViZG9tYWluKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdTdWJkb21haW4gaXMgcmVxdWlyZWQnLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFN1YmRvbWFpbiA9IGN1cnJlbnRFZGl0U2VydmljZS5pZDtcbiAgICBjb25zdCBjaGFuZ2VzID0gW107XG5cbiAgICBpZiAobmV3U3ViZG9tYWluICE9PSBvbGRTdWJkb21haW4pIGNoYW5nZXMucHVzaCgnc3ViZG9tYWluJyk7XG4gICAgaWYgKG5ld05hbWUgJiYgbmV3TmFtZSAhPT0gY3VycmVudEVkaXRTZXJ2aWNlLm5hbWUpIGNoYW5nZXMucHVzaCgnbmFtZScpO1xuICAgIGlmIChuZXdQb3J0ICYmIG5ld1BvcnQgIT09IFN0cmluZyhjdXJyZW50RWRpdFNlcnZpY2UucG9ydCkpIGNoYW5nZXMucHVzaCgncG9ydCcpO1xuICAgIGlmIChuZXdJcCAhPT0gY3VycmVudEVkaXRTZXJ2aWNlLmlwKSBjaGFuZ2VzLnB1c2goJ2lwJyk7XG4gICAgaWYgKHRhaWxzY2FsZU9ubHkgIT09IChjdXJyZW50RWRpdFNlcnZpY2UudGFpbHNjYWxlT25seSB8fCBmYWxzZSkpIGNoYW5nZXMucHVzaCgndGFpbHNjYWxlJyk7XG4gICAgaWYgKG5ld0xvZ28gJiYgbmV3TG9nbyAhPT0gY3VycmVudEVkaXRTZXJ2aWNlLmxvZ28pIGNoYW5nZXMucHVzaCgnbG9nbycpO1xuICAgIGlmIChuZXdDYXRlZ29yeSAhPT0gKGN1cnJlbnRFZGl0U2VydmljZS5jYXRlZ29yeSB8fCAnJykpIGNoYW5nZXMucHVzaCgnY2F0ZWdvcnknKTtcblxuICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2xvc2VTZXJ2aWNlRWRpdE1vZGFsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2F2ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWVkaXQtc2F2ZScpO1xuICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2aW5nLi4uJztcbiAgICBzYXZlQnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlcnZpY2VzL3VwZGF0ZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgb2xkU3ViZG9tYWluLFxuICAgICAgICAgIG5ld1N1YmRvbWFpbixcbiAgICAgICAgICBuYW1lOiBuZXdOYW1lIHx8IGN1cnJlbnRFZGl0U2VydmljZS5uYW1lLFxuICAgICAgICAgIHBvcnQ6IG5ld1BvcnQgfHwgY3VycmVudEVkaXRTZXJ2aWNlLnBvcnQsXG4gICAgICAgICAgaXA6IG5ld0lwLFxuICAgICAgICAgIHRhaWxzY2FsZU9ubHksXG4gICAgICAgICAgbG9nbzogbmV3TG9nbyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgY2F0ZWdvcnk6IG5ld0NhdGVnb3J5XG4gICAgICAgIH0pXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gdXBkYXRlIHNlcnZpY2UnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGxvY2FsIEFQUFMgYXJyYXkgdG8gbWF0Y2hcbiAgICAgIGNvbnN0IGFwcEluZGV4ID0gd2luZG93LkFQUFMuZmluZEluZGV4KGEgPT4gYS5pZCA9PT0gb2xkU3ViZG9tYWluKTtcbiAgICAgIGlmIChhcHBJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgd2luZG93LkFQUFNbYXBwSW5kZXhdID0ge1xuICAgICAgICAgIC4uLndpbmRvdy5BUFBTW2FwcEluZGV4XSxcbiAgICAgICAgICBpZDogbmV3U3ViZG9tYWluLFxuICAgICAgICAgIG5hbWU6IG5ld05hbWUgfHwgd2luZG93LkFQUFNbYXBwSW5kZXhdLm5hbWUsXG4gICAgICAgICAgcG9ydDogbmV3UG9ydCB8fCB3aW5kb3cuQVBQU1thcHBJbmRleF0ucG9ydCxcbiAgICAgICAgICBpcDogbmV3SXAsXG4gICAgICAgICAgdGFpbHNjYWxlT25seSxcbiAgICAgICAgICBsb2dvOiBuZXdMb2dvIHx8IHdpbmRvdy5BUFBTW2FwcEluZGV4XS5sb2dvLFxuICAgICAgICAgIGNhdGVnb3J5OiBuZXdDYXRlZ29yeSB8fCB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2xvc2VTZXJ2aWNlRWRpdE1vZGFsKCk7XG4gICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNhdmluZyBzZXJ2aWNlIGNoYW5nZXM6JywgZXJyb3IpO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3Igc2F2aW5nIGNoYW5nZXM6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZlIENoYW5nZXMnO1xuICAgICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIExvZ28gZmlsZSB1cGxvYWQgaGFuZGxlclxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1sb2dvLWZpbGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXN5bmMgKGUpID0+IHtcbiAgICBjb25zdCBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG5cbiAgICBpZiAoIWZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIHNlbGVjdCBhbiBpbWFnZSBmaWxlJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFVcmwgPSBldmVudC50YXJnZXQucmVzdWx0O1xuXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zZXJ2aWNlLWxvZ28tcHJldmlldycpLnNyYyA9IGRhdGFVcmw7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1sb2dvLXVybCcpLnZhbHVlID0gZGF0YVVybDtcblxuICAgICAgaWYgKGN1cnJlbnRFZGl0U2VydmljZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXNzZXRzL3VwbG9hZCcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGZpbGVuYW1lOiBgJHtjdXJyZW50RWRpdFNlcnZpY2UuaWR9LnBuZ2AsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFVcmxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQucGF0aCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtbG9nby11cmwnKS52YWx1ZSA9IHJlc3VsdC5wYXRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGF0YSBVUkxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gIH0pO1xuXG4gIC8vIFNlcnZpY2UgZWRpdCBtb2RhbCBldmVudCBsaXN0ZW5lcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZWRpdC1jYW5jZWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZVNlcnZpY2VFZGl0TW9kYWwpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlU2VydmljZUNoYW5nZXMpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LW1vZGFsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQuaWQgPT09ICdzZXJ2aWNlLWVkaXQtbW9kYWwnKSBjbG9zZVNlcnZpY2VFZGl0TW9kYWwoKTtcbiAgfSk7XG5cbiAgLy8gPT09PT0gREVMRVRFIFNFUlZJQ0UgTU9EQUwgPT09PT1cblxuICBmdW5jdGlvbiBzaG93RGVsZXRlTW9kYWwoc2VydmljZU5hbWUsIGhhc0NvbnRhaW5lciwgY29udGFpbmVySWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1zZXJ2aWNlLW1vZGFsJyk7XG4gICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtdGl0bGUnKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLW1lc3NhZ2UnKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckluZm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLWNvbnRhaW5lci1pbmZvJyk7XG4gICAgICBjb25zdCBjb250YWluZXJOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC1jb250YWluZXItbmFtZScpO1xuICAgICAgY29uc3QgaGVscCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtaGVscCcpO1xuICAgICAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC1jYW5jZWwnKTtcbiAgICAgIGNvbnN0IHJlbW92ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtcmVtb3ZlJyk7XG4gICAgICBjb25zdCBkZWxldGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLWRlbGV0ZScpO1xuXG4gICAgICB0aXRsZS50ZXh0Q29udGVudCA9IGBEZWxldGUgXCIke3NlcnZpY2VOYW1lfVwiYDtcblxuICAgICAgaWYgKGhhc0NvbnRhaW5lcikge1xuICAgICAgICBtZXNzYWdlLmlubmVySFRNTCA9ICdUaGlzIHNlcnZpY2UgaGFzIGFuIGFzc29jaWF0ZWQgRG9ja2VyIGNvbnRhaW5lci48YnI+Q2hvb3NlIGhvdyB0byBwcm9jZWVkOic7XG4gICAgICAgIGNvbnRhaW5lckluZm8uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGNvbnRhaW5lck5hbWUudGV4dENvbnRlbnQgPSBgQ29udGFpbmVyIElEOiAke2NvbnRhaW5lcklkPy5zbGljZSgwLCAxMikgfHwgJ1Vua25vd24nfWA7XG4gICAgICAgIGhlbHAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRlbGV0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UudGV4dENvbnRlbnQgPSAnUmVtb3ZlIHRoaXMgc2VydmljZSBmcm9tIHRoZSBkYXNoYm9hcmQ/JztcbiAgICAgICAgY29udGFpbmVySW5mby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBoZWxwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRlbGV0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICAgIGNhbmNlbEJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNhbmNlbCk7XG4gICAgICAgIHJlbW92ZUJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVJlbW92ZSk7XG4gICAgICAgIGRlbGV0ZUJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZURlbGV0ZSk7XG4gICAgICAgIG1vZGFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQmFja2Ryb3ApO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4geyBjbGVhbnVwKCk7IHJlc29sdmUobnVsbCk7IH07XG4gICAgICBjb25zdCBoYW5kbGVSZW1vdmUgPSAoKSA9PiB7IGNsZWFudXAoKTsgcmVzb2x2ZShmYWxzZSk7IH07XG4gICAgICBjb25zdCBoYW5kbGVEZWxldGUgPSAoKSA9PiB7IGNsZWFudXAoKTsgcmVzb2x2ZSh0cnVlKTsgfTtcbiAgICAgIGNvbnN0IGhhbmRsZUJhY2tkcm9wID0gKGUpID0+IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgeyBjbGVhbnVwKCk7IHJlc29sdmUobnVsbCk7IH0gfTtcblxuICAgICAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQ2FuY2VsKTtcbiAgICAgIHJlbW92ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVJlbW92ZSk7XG4gICAgICBkZWxldGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVEZWxldGUpO1xuICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVCYWNrZHJvcCk7XG5cbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09IFVQREFURSBDT05UQUlORVIgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVDb250YWluZXIoY29udGFpbmVySWQsIHNlcnZpY2VOYW1lLCBzZXJ2aWNlSWQpIHtcbiAgICBjb25zdCB1cGRhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdXBkYXRlLWJ0bi0ke3NlcnZpY2VJZH1gKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSB1cGRhdGVCdG4/LnRleHRDb250ZW50O1xuXG4gICAgaWYgKCFjb25maXJtKGBVcGRhdGUgJHtzZXJ2aWNlTmFtZX0gdG8gdGhlIGxhdGVzdCB2ZXJzaW9uP1xcblxcblRoaXMgd2lsbDpcXG4xLiBQdWxsIHRoZSBsYXRlc3QgaW1hZ2VcXG4yLiBTdG9wIHRoZSBjb250YWluZXJcXG4zLiBSZWNyZWF0ZSB3aXRoIHNhbWUgc2V0dGluZ3NcXG5cXG5UaGUgc2VydmljZSB3aWxsIGJlIGJyaWVmbHkgdW5hdmFpbGFibGUuYCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHVwZGF0ZUJ0bikge1xuICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSAnXFx1ezFGNTA0fSc7XG4gICAgICAgIHVwZGF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHVwZGF0ZUJ0bi50aXRsZSA9ICdVcGRhdGluZy4uLic7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2NvbnRhaW5lcklkfS91cGRhdGVgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHdpbmRvdy5BUFBTLmZpbmQoYXBwID0+IGFwcC5pZCA9PT0gc2VydmljZUlkKTtcbiAgICAgICAgaWYgKHNlcnZpY2UgJiYgcmVzdWx0Lm5ld0NvbnRhaW5lcklkKSB7XG4gICAgICAgICAgc2VydmljZS5jb250YWluZXJJZCA9IHJlc3VsdC5uZXdDb250YWluZXJJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGVCdG4pIHtcbiAgICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSAnXFx1ezI3MDV9JztcbiAgICAgICAgICB1cGRhdGVCdG4udGl0bGUgPSAnVXBkYXRlZCBzdWNjZXNzZnVsbHkhJztcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgICAgIHVwZGF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBjb250YWluZXIgdG8gbGF0ZXN0IHZlcnNpb24nO1xuICAgICAgICAgIH0sIDMwMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB3aW5kb3cucmVmcmVzaEFsbCgpLCAyMDAwKTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtzZXJ2aWNlTmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkhYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ1VwZGF0ZSBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVXBkYXRlIGVycm9yOicsIGVycm9yKTtcblxuICAgICAgaWYgKHVwZGF0ZUJ0bikge1xuICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSAnXFx1ezI3NEN9JztcbiAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBmYWlsZWQnO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICAgICAgdXBkYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBjb250YWluZXIgdG8gbGF0ZXN0IHZlcnNpb24nO1xuICAgICAgICB9LCAzMDAwKTtcbiAgICAgIH1cblxuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHVwZGF0ZSAke3NlcnZpY2VOYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IERFTEVURSBTRVJWSUNFID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGVsZXRlU2VydmljZShzZXJ2aWNlSWQsIHNlcnZpY2VOYW1lKSB7XG4gICAgY29uc3Qgc2VydmljZSA9IHdpbmRvdy5BUFBTLmZpbmQoYXBwID0+IGFwcC5pZCA9PT0gc2VydmljZUlkKTtcbiAgICBjb25zdCBkb21haW4gPSBzZXJ2aWNlID8gYnVpbGREb21haW4oc2VydmljZS5pZCkgOiBudWxsO1xuICAgIGNvbnN0IGhhc0NvbnRhaW5lciA9IHNlcnZpY2U/LmNvbnRhaW5lcklkO1xuXG4gICAgY29uc3QgZGVsZXRlQ29udGFpbmVyID0gYXdhaXQgc2hvd0RlbGV0ZU1vZGFsKHNlcnZpY2VOYW1lIHx8IHNlcnZpY2VJZCwgaGFzQ29udGFpbmVyLCBzZXJ2aWNlPy5jb250YWluZXJJZCk7XG5cbiAgICBpZiAoZGVsZXRlQ29udGFpbmVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm47IC8vIFVzZXIgY2FuY2VsbGVkXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdHMgPSB7XG4gICAgICBkYXNoYm9hcmQ6IGZhbHNlLFxuICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgZG5zOiBudWxsLFxuICAgICAgY2FkZHk6IG51bGwsXG4gICAgICBzZXJ2aWNlOiBudWxsXG4gICAgfTtcblxuICAgIC8vIEZ1bGwgcmVtb3ZhbCB3aXRoIGNvbnRhaW5lclxuICAgIGlmIChkZWxldGVDb250YWluZXIgJiYgaGFzQ29udGFpbmVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICBjb250YWluZXJJZDogc2VydmljZS5jb250YWluZXJJZCxcbiAgICAgICAgICBzdWJkb21haW46IHNlcnZpY2UuaWQsXG4gICAgICAgICAgaXA6IHNlcnZpY2UuaXAgfHwgJ2xvY2FsaG9zdCcsXG4gICAgICAgICAgZGVsZXRlQ29udGFpbmVyOiAndHJ1ZSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9hcHBzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2UuaWQpfT8ke3BhcmFtcy50b1N0cmluZygpfWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cyA9IHsgLi4ucmVzdWx0cywgLi4ucmVzdWx0LnJlc3VsdHMsIGRhc2hib2FyZDogZmFsc2UgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBcHAgcmVtb3ZhbCBmYWlsZWQ6JywgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXBwIHJlbW92YWwgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVsZXRlQ29udGFpbmVyICYmIGRvbWFpbikge1xuICAgICAgLy8gRmFsbGJhY2sgZm9yIG1hbnVhbGx5IGFkZGVkIHNlcnZpY2VzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlSVAgPSBzZXJ2aWNlPy5pcCB8fCAnbG9jYWxob3N0JztcbiAgICAgICAgY29uc3QgZG5zUmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9kbnMvcmVjb3JkP2RvbWFpbj0ke2VuY29kZVVSSUNvbXBvbmVudChkb21haW4pfSZ0eXBlPUEmaXBBZGRyZXNzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2VJUCl9JnNlcnZlcj0ke1NJVEUuZG5zSXB9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ0RFTEVURSdcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRuc1Jlc3VsdCA9IGF3YWl0IGRuc1Jlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmVzdWx0cy5kbnMgPSBkbnNSZXN1bHQuc3VjY2VzcyA/ICdkZWxldGVkJyA6IChkbnNSZXN1bHQuZXJyb3IgfHwgJ2ZhaWxlZCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXN1bHRzLmRucyA9IGUubWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2FkZHlSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NpdGUvJHtlbmNvZGVVUklDb21wb25lbnQoZG9tYWluKX1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnREVMRVRFJ1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2FkZHlSZXN1bHQgPSBhd2FpdCBjYWRkeVJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmVzdWx0cy5jYWRkeSA9IChjYWRkeVJlc3VsdC5zdWNjZXNzIHx8IChjYWRkeVJlc3VsdC5lcnJvciAmJiBjYWRkeVJlc3VsdC5lcnJvci5pbmNsdWRlcygnbm90IGZvdW5kJykpKSA/ICdyZW1vdmVkJyA6IChjYWRkeVJlc3VsdC5lcnJvciB8fCAnZmFpbGVkJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlc3VsdHMuY2FkZHkgPSBlLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gQVBQUyBhcnJheVxuICAgIGNvbnN0IGluZGV4ID0gd2luZG93LkFQUFMuZmluZEluZGV4KGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2VJZCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHdpbmRvdy5BUFBTLnNwbGljZShpbmRleCwgMSk7XG4gICAgICByZXN1bHRzLmRhc2hib2FyZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gbG9jYWxTdG9yYWdlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1c3RvbUFwcHMgPSBzYWZlR2V0SlNPTignY3VzdG9tLWFwcHMnLCBbXSk7XG4gICAgICBjb25zdCBsb2NhbEluZGV4ID0gY3VzdG9tQXBwcy5maW5kSW5kZXgoYXBwID0+IGFwcC5pZCA9PT0gc2VydmljZUlkKTtcbiAgICAgIGlmIChsb2NhbEluZGV4ID4gLTEpIHtcbiAgICAgICAgY3VzdG9tQXBwcy5zcGxpY2UobG9jYWxJbmRleCwgMSk7XG4gICAgICAgIHNhZmVTZXQoJ2N1c3RvbS1hcHBzJywgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElnbm9yZSBsb2NhbFN0b3JhZ2UgZXJyb3JzXG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gc2VydmljZXMuanNvbiB2aWEgQVBJXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNlcnZpY2VSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2VJZCl9YCwge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNlcnZpY2VSZXN1bHQgPSBhd2FpdCBzZXJ2aWNlUmVzcG9uc2UuanNvbigpO1xuICAgICAgcmVzdWx0cy5zZXJ2aWNlID0gc2VydmljZVJlc3VsdC5zdWNjZXNzID8gJ3JlbW92ZWQnIDogKHNlcnZpY2VSZXN1bHQuZXJyb3IgfHwgJ2ZhaWxlZCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlc3VsdHMuc2VydmljZSA9IGUubWVzc2FnZTtcbiAgICB9XG5cbiAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgd2luZG93LnJlZnJlc2hBbGwoKTtcblxuICAgIC8vIE9ubHkgc2hvdyBhbGVydCBpZiB0aGVyZSBhcmUgYWN0dWFsIGVycm9yc1xuICAgIGxldCBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBsZXQgZXJyb3JNZXNzYWdlcyA9IFtdO1xuXG4gICAgaWYgKCFyZXN1bHRzLmRhc2hib2FyZCkge1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaCgnXFx1ezI3MTd9IEZhaWxlZCB0byByZW1vdmUgZnJvbSBkYXNoYm9hcmQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWNjZXNzU3RhdGVzID0gWydyZW1vdmVkJywgJ2FscmVhZHkgcmVtb3ZlZCcsICdub3QgZm91bmQnLCAnZGVsZXRlZCcsICdrZXB0ICh1c2VyIGNob2ljZSknLCAnc2tpcHBlZCcsICdubyBzdWNoIHJlY29yZCcsICdkb2VzIG5vdCBleGlzdCddO1xuICAgIGNvbnN0IGlzU3VjY2VzcyA9ICh2YWwpID0+ICF2YWwgfHwgc3VjY2Vzc1N0YXRlcy5zb21lKHMgPT4gdmFsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocy50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICBpZiAocmVzdWx0cy5jb250YWluZXIgJiYgIWlzU3VjY2VzcyhyZXN1bHRzLmNvbnRhaW5lcikpIHtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFxcdXsyNkEwfSBDb250YWluZXI6ICR7cmVzdWx0cy5jb250YWluZXJ9YCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHRzLmRucyAmJiAhaXNTdWNjZXNzKHJlc3VsdHMuZG5zKSkge1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaChgXFx1ezI2QTB9IEROUyBSZWNvcmQ6ICR7cmVzdWx0cy5kbnN9YCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHRzLmNhZGR5ICYmICFpc1N1Y2Nlc3MocmVzdWx0cy5jYWRkeSkpIHtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFxcdXsyNkEwfSBDYWRkeSBDb25maWc6ICR7cmVzdWx0cy5jYWRkeX1gKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdHMuc2VydmljZSAmJiAhaXNTdWNjZXNzKHJlc3VsdHMuc2VydmljZSkpIHtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFxcdXsyNkEwfSBTZXJ2aWNlIEZpbGU6ICR7cmVzdWx0cy5zZXJ2aWNlfWApO1xuICAgIH1cblxuICAgIGlmIChoYXNFcnJvcnMpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yIGRlbGV0aW5nIFwiJHtzZXJ2aWNlTmFtZSB8fCBzZXJ2aWNlSWR9XCI6ICR7ZXJyb3JNZXNzYWdlcy5qb2luKCcsICcpfWAsICdlcnJvcicsIDYwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IFdJTkRPVyBFWFBPUlRTID09PT09XG5cbiAgd2luZG93Lm9wZW5TZXJ2aWNlRWRpdE1vZGFsID0gb3BlblNlcnZpY2VFZGl0TW9kYWw7XG4gIHdpbmRvdy5zaG93RGVsZXRlTW9kYWwgPSBzaG93RGVsZXRlTW9kYWw7XG4gIHdpbmRvdy51cGRhdGVDb250YWluZXIgPSB1cGRhdGVDb250YWluZXI7XG4gIHdpbmRvdy5kZWxldGVTZXJ2aWNlID0gZGVsZXRlU2VydmljZTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gU0VSVklDRSBDUkVBVElPTiA9PT09PT09PT09XG4vLyBBZGQgc2VydmljZSBtb2RhbCwgbG9jYWwvZXh0ZXJuYWwgc2VydmljZSBjcmVhdGlvbiBmbG93cywgYW5kIGV2ZW50IHdpcmluZy5cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gPT09PT0gU1VCRE9NQUlOIEFVVE8tREVSSVZFID09PT09XG5cbiAgZnVuY3Rpb24gZGVyaXZlU3ViZG9tYWluKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICcnKS5yZXBsYWNlKC8tKy9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNtYXJ0U3NsRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gU0lURS5kZWZhdWx0cz8uc3NsVHlwZSB8fCAoU0lURS5jb25maWd1cmF0aW9uVHlwZSA9PT0gJ3B1YmxpYycgPyAnbGV0c2VuY3J5cHQnIDogJ2NhZGR5LW1hbmFnZWQnKTtcbiAgfVxuXG4gIC8vID09PT09IFNFUlZJQ0UgUFJFVklFVyA9PT09PVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KCkge1xuICAgIGNvbnN0IHN1YmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcpLnZhbHVlIHx8ICdzdWJkb21haW4nO1xuICAgIGNvbnN0IGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKS52YWx1ZSB8fCBRVUlDS19JUFMubGFuIHx8ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUgfHwgREMuREVGQVVMVFMuU0VSVklDRV9QT1JUO1xuICAgIGNvbnN0IHNzbFR5cGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3NsLXR5cGUtc2VsZWN0JykudmFsdWU7XG4gICAgY29uc3QgY2FOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhLW5hbWUtaW5wdXQnKS52YWx1ZSB8fCAnc2FtaS1jYSc7XG4gICAgY29uc3QgZXhpc3RpbmdDYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGlzdGluZy1jYS1zZWxlY3QnKS52YWx1ZTtcbiAgICBjb25zdCBlbmFibGVBdXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1hdXRoJykuY2hlY2tlZDtcbiAgICBjb25zdCBlbmFibGVDb3JzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1jb3JzJykuY2hlY2tlZDtcbiAgICBjb25zdCBjdXN0b21IZWFkZXJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1c3RvbS1oZWFkZXJzLWlucHV0JykudmFsdWU7XG4gICAgY29uc3QgdXBzdHJlYW1QYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Vwc3RyZWFtLXBhdGgtaW5wdXQnKS52YWx1ZSB8fCAnLyc7XG4gICAgY29uc3QgaGVhbHRoQ2hlY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWlucHV0JykudmFsdWU7XG4gICAgY29uc3QgdGltZW91dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aW1lb3V0LWlucHV0JykudmFsdWUgfHwgMzA7XG5cbiAgICBjb25zdCBkbnNQcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1wcmV2aWV3Jyk7XG4gICAgaWYgKGRuc1ByZXZpZXcpIGRuc1ByZXZpZXcudGV4dENvbnRlbnQgPSBgJHtidWlsZERvbWFpbihzdWJkb21haW4pfSBcXHUyMTkyICR7aXB9YDtcblxuICAgIGNvbnN0IHVybFByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsLXByZXZpZXcnKTtcbiAgICBpZiAodXJsUHJldmlldykgdXJsUHJldmlldy50ZXh0Q29udGVudCA9IGJ1aWxkU2VydmljZVVybChzdWJkb21haW4pO1xuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgc3ViZG9tYWluLCBwb3J0LCBpcCwgc3NsVHlwZSwgY2FOYW1lLCBleGlzdGluZ0NhLFxuICAgICAgZW5hYmxlQXV0aCwgZW5hYmxlQ29ycywgY3VzdG9tSGVhZGVycywgdXBzdHJlYW1QYXRoLCBoZWFsdGhDaGVjaywgdGltZW91dFxuICAgIH07XG5cbiAgICBjb25zdCBjYWRkeUNvbmZpZyA9IHdpbmRvdy5nZW5lcmF0ZUNhZGR5Q29uZmlnKGNvbmZpZyk7XG4gICAgY29uc3QgY29uZmlnUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWRkeS1jb25maWctcHJldmlldycpO1xuICAgIGlmIChjb25maWdQcmV2aWV3KSBjb25maWdQcmV2aWV3LnZhbHVlID0gY2FkZHlDb25maWc7XG4gIH1cblxuICAvLyA9PT09PSBRVUlDSyBJUCBDT05GSUdVUkFUSU9OID09PT09XG5cbiAgY29uc3QgUVVJQ0tfSVBTID0ge1xuICAgIGxvY2FsaG9zdDogJzEyNy4wLjAuMScsXG4gICAgbGFuOiAnJyxcbiAgICB0YWlsc2NhbGU6ICcnXG4gIH07XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGV0ZWN0TmV0d29ya0lQcygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9uZXR3b3JrL2lwcycsIHtcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDIwMDApXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5sYW4pIFFVSUNLX0lQUy5sYW4gPSBkYXRhLmxhbjtcbiAgICAgICAgaWYgKGRhdGEudGFpbHNjYWxlKSBRVUlDS19JUFMudGFpbHNjYWxlID0gZGF0YS50YWlsc2NhbGU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQVBJIG5vdCBhdmFpbGFibGVcbiAgICB9XG5cbiAgICBjb25zdCBsYW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2staXAtbGFuJyk7XG4gICAgY29uc3QgdHNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2staXAtdGFpbHNjYWxlJyk7XG4gICAgaWYgKGxhbkJ0bikge1xuICAgICAgaWYgKFFVSUNLX0lQUy5sYW4pIHtcbiAgICAgICAgbGFuQnRuLmRhdGFzZXQuaXAgPSBRVUlDS19JUFMubGFuO1xuICAgICAgICBsYW5CdG4udGV4dENvbnRlbnQgPSBgTEFOICgke1FVSUNLX0lQUy5sYW59KWA7XG4gICAgICAgIGxhbkJ0bi50aXRsZSA9IGBMQU4gSVA6ICR7UVVJQ0tfSVBTLmxhbn1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFuQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0c0J0bikge1xuICAgICAgaWYgKFFVSUNLX0lQUy50YWlsc2NhbGUpIHtcbiAgICAgICAgdHNCdG4uZGF0YXNldC5pcCA9IFFVSUNLX0lQUy50YWlsc2NhbGU7XG4gICAgICAgIHRzQnRuLnRleHRDb250ZW50ID0gYFRhaWxzY2FsZSAoJHtRVUlDS19JUFMudGFpbHNjYWxlfSlgO1xuICAgICAgICB0c0J0bi50aXRsZSA9IGBUYWlsc2NhbGUgSVA6ICR7UVVJQ0tfSVBTLnRhaWxzY2FsZX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHNCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWlwLWlucHV0Jyk7XG4gICAgaWYgKGlwSW5wdXQgJiYgIWlwSW5wdXQudmFsdWUgJiYgUVVJQ0tfSVBTLmxhbikgaXBJbnB1dC52YWx1ZSA9IFFVSUNLX0lQUy5sYW47XG4gIH1cblxuICBmdW5jdGlvbiBpbml0UXVpY2tJUEJ1dHRvbnMoKSB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnF1aWNrLWlwLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgaXAgPSBidG4uZGF0YXNldC5pcDtcbiAgICAgICAgaWYgKGlwKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKS52YWx1ZSA9IGlwO1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1pcC1idG4nKS5mb3JFYWNoKGIgPT4gYi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICAgICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICAgIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKT8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudElQID0gZS50YXJnZXQudmFsdWU7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucXVpY2staXAtYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYnRuLmRhdGFzZXQuaXAgPT09IGN1cnJlbnRJUCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09IEFERCBTRVJWSUNFIE1PREFMID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gb3BlbkFkZFNlcnZpY2VNb2RhbCgpIHtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZS1tb2RhbCcpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIGNvbnN0IG1vZGFsQ29udGVudCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJy53ZWF0aGVyLW1vZGFsLWNvbnRlbnQnKTtcbiAgICBpZiAobW9kYWxDb250ZW50KSBtb2RhbENvbnRlbnQuc2Nyb2xsVG9wID0gMDtcblxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgIC8vIFNldCBzbWFydCBTU0wgZGVmYXVsdFxuICAgIGNvbnN0IHNzbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzc2wtdHlwZS1zZWxlY3QnKTtcbiAgICBpZiAoc3NsU2VsZWN0KSBzc2xTZWxlY3QudmFsdWUgPSBnZXRTbWFydFNzbERlZmF1bHQoKTtcblxuICAgIGF3YWl0IGRldGVjdE5ldHdvcmtJUHMoKTtcblxuICAgIGNvbnN0IGNhZGR5ZmlsZVBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FkZHlmaWxlLXBhdGgtaW5wdXQnKS52YWx1ZSB8fCBEQy5ERUZBVUxUUy5DQUREWUZJTEU7XG4gICAgYXdhaXQgd2luZG93LmxvYWRFeGlzdGluZ0NBcyhjYWRkeWZpbGVQYXRoKTtcblxuICAgIC8vIENoZWNrIFRhaWxzY2FsZSBzdGF0dXNcbiAgICBjb25zdCB0YWlsc2NhbGVTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFudWFsLXRhaWxzY2FsZS1zdGF0dXMnKTtcbiAgICBjb25zdCB0YWlsc2NhbGVDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW51YWwtdGFpbHNjYWxlLW9ubHknKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90YWlsc2NhbGUvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmluc3RhbGxlZCAmJiBkYXRhLmNvbm5lY3RlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICM0Y2FmNTA7XCI+XFx1MjcxMyBDb25uZWN0ZWQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPiR7ZGF0YS5zZWxmPy5ob3N0bmFtZX0gKCR7ZGF0YS5zZWxmPy5pcH0pPC9zcGFuPlxuICAgICAgICBgO1xuICAgICAgICB0YWlsc2NhbGVDaGVja2JveC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmluc3RhbGxlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+XFx1MjZBMCBOb3QgY29ubmVjdGVkPC9zcGFuPmA7XG4gICAgICAgIHRhaWxzY2FsZUNoZWNrYm94LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhaWxzY2FsZVN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5vdCBhdmFpbGFibGU8L3NwYW4+YDtcbiAgICAgICAgdGFpbHNjYWxlQ2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRhaWxzY2FsZVN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvdWxkIG5vdCBjaGVjazwvc3Bhbj5gO1xuICAgICAgdGFpbHNjYWxlQ2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0YWlsc2NhbGVDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG5cbiAgICB1cGRhdGVTZXJ2aWNlUHJldmlldygpO1xuICB9XG5cbiAgLy8gPT09PT0gU0VSVklDRSBUWVBFIFNXSVRDSElORyAoVEFCIFNUWUxFKSA9PT09PVxuXG4gIGZ1bmN0aW9uIHNldHVwU2VydmljZVR5cGVTd2l0Y2hpbmcoKSB7XG4gICAgY29uc3QgbG9jYWxSYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXR5cGUtbG9jYWwnKTtcbiAgICBjb25zdCBleHRlcm5hbFJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtdHlwZS1leHRlcm5hbCcpO1xuICAgIGNvbnN0IGxvY2FsQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2FsLXNlcnZpY2UtY29uZmlnJyk7XG4gICAgY29uc3QgZXh0ZXJuYWxDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1jb25maWcnKTtcbiAgICBjb25zdCB0YWJMb2NhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItbG9jYWwnKTtcbiAgICBjb25zdCB0YWJFeHRlcm5hbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItZXh0ZXJuYWwnKTtcblxuICAgIGZ1bmN0aW9uIHN3aXRjaFNlcnZpY2VUeXBlKCkge1xuICAgICAgaWYgKGxvY2FsUmFkaW8uY2hlY2tlZCkge1xuICAgICAgICBsb2NhbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ2dyaWQnO1xuICAgICAgICBleHRlcm5hbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBpZiAodGFiTG9jYWwpIHsgdGFiTG9jYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1hY2NlbnQpJzsgdGFiTG9jYWwuc3R5bGUuY29sb3IgPSAndmFyKC0tYmcpJzsgfVxuICAgICAgICBpZiAodGFiRXh0ZXJuYWwpIHsgdGFiRXh0ZXJuYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7IHRhYkV4dGVybmFsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGV4dGVybmFsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBpZiAodGFiRXh0ZXJuYWwpIHsgdGFiRXh0ZXJuYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1hY2NlbnQpJzsgdGFiRXh0ZXJuYWwuc3R5bGUuY29sb3IgPSAndmFyKC0tYmcpJzsgfVxuICAgICAgICBpZiAodGFiTG9jYWwpIHsgdGFiTG9jYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7IHRhYkxvY2FsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7IH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2NhbFJhZGlvPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBzd2l0Y2hTZXJ2aWNlVHlwZSk7XG4gICAgZXh0ZXJuYWxSYWRpbz8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgc3dpdGNoU2VydmljZVR5cGUpO1xuICB9XG5cbiAgLy8gPT09PT0gQVVUTy1ERVJJVkUgU1VCRE9NQUlOIEZST00gTkFNRSA9PT09PVxuXG4gIGZ1bmN0aW9uIHNldHVwQXV0b1N1YmRvbWFpbigpIHtcbiAgICAvLyBMb2NhbCBzZXJ2aWNlOiBuYW1lIFx1MjE5MiBzdWJkb21haW4gKyBwcmV2aWV3XG4gICAgY29uc3QgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtbmFtZS1pbnB1dCcpO1xuICAgIGNvbnN0IHN1YmRvbWFpbklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2Utc3ViZG9tYWluLWlucHV0Jyk7XG4gICAgY29uc3Qgc3ViZG9tYWluUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJkb21haW4tcHJldmlldycpO1xuICAgIGxldCB1c2VyRWRpdGVkU3ViZG9tYWluID0gZmFsc2U7XG5cbiAgICBuYW1lSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZVN1YmRvbWFpbihuYW1lSW5wdXQudmFsdWUpO1xuICAgICAgaWYgKCF1c2VyRWRpdGVkU3ViZG9tYWluICYmIHN1YmRvbWFpbklucHV0KSB7XG4gICAgICAgIHN1YmRvbWFpbklucHV0LnZhbHVlID0gZGVyaXZlZDtcbiAgICAgIH1cbiAgICAgIGlmIChzdWJkb21haW5QcmV2aWV3KSB7XG4gICAgICAgIHN1YmRvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBkZXJpdmVkID8gYFxcdTIxOTIgJHtidWlsZERvbWFpbihkZXJpdmVkKX1gIDogJyc7XG4gICAgICB9XG4gICAgICB1cGRhdGVTZXJ2aWNlUHJldmlldygpO1xuICAgIH0pO1xuXG4gICAgc3ViZG9tYWluSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgdXNlckVkaXRlZFN1YmRvbWFpbiA9IHN1YmRvbWFpbklucHV0LnZhbHVlICE9PSBkZXJpdmVTdWJkb21haW4obmFtZUlucHV0Py52YWx1ZSB8fCAnJyk7XG4gICAgICBjb25zdCBzdWIgPSBzdWJkb21haW5JbnB1dC52YWx1ZS50cmltKCkgfHwgZGVyaXZlU3ViZG9tYWluKG5hbWVJbnB1dD8udmFsdWUgfHwgJycpO1xuICAgICAgaWYgKHN1YmRvbWFpblByZXZpZXcpIHtcbiAgICAgICAgc3ViZG9tYWluUHJldmlldy50ZXh0Q29udGVudCA9IHN1YiA/IGBcXHUyMTkyICR7YnVpbGREb21haW4oc3ViKX1gIDogJyc7XG4gICAgICB9XG4gICAgICB1cGRhdGVTZXJ2aWNlUHJldmlldygpO1xuICAgIH0pO1xuXG4gICAgLy8gRXh0ZXJuYWwgc2VydmljZTogbmFtZSBcdTIxOTIgc3ViZG9tYWluICsgcHJldmlld1xuICAgIGNvbnN0IGV4dE5hbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLW5hbWUnKTtcbiAgICBjb25zdCBleHRTdWJkb21haW5JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpbicpO1xuICAgIGNvbnN0IGV4dFN1YmRvbWFpblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc3ViZG9tYWluLXByZXZpZXcnKTtcbiAgICBjb25zdCBleHREb21haW5QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLWRvbWFpbi1wcmV2aWV3Jyk7XG4gICAgbGV0IHVzZXJFZGl0ZWRFeHRTdWJkb21haW4gPSBmYWxzZTtcblxuICAgIGV4dE5hbWVJbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXJpdmVkID0gZGVyaXZlU3ViZG9tYWluKGV4dE5hbWVJbnB1dC52YWx1ZSk7XG4gICAgICBpZiAoIXVzZXJFZGl0ZWRFeHRTdWJkb21haW4gJiYgZXh0U3ViZG9tYWluSW5wdXQpIHtcbiAgICAgICAgZXh0U3ViZG9tYWluSW5wdXQudmFsdWUgPSBkZXJpdmVkO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3ViID0gZXh0U3ViZG9tYWluSW5wdXQ/LnZhbHVlIHx8IGRlcml2ZWQ7XG4gICAgICBpZiAoZXh0U3ViZG9tYWluUHJldmlldykge1xuICAgICAgICBleHRTdWJkb21haW5QcmV2aWV3LnRleHRDb250ZW50ID0gc3ViID8gYFxcdTIxOTIgJHtidWlsZERvbWFpbihzdWIpfWAgOiAnJztcbiAgICAgIH1cbiAgICAgIGlmIChleHREb21haW5QcmV2aWV3KSB7XG4gICAgICAgIGV4dERvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBzdWIgPyBidWlsZERvbWFpbihzdWIpIDogJyc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBleHRTdWJkb21haW5JbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICB1c2VyRWRpdGVkRXh0U3ViZG9tYWluID0gZXh0U3ViZG9tYWluSW5wdXQudmFsdWUgIT09IGRlcml2ZVN1YmRvbWFpbihleHROYW1lSW5wdXQ/LnZhbHVlIHx8ICcnKTtcbiAgICAgIGNvbnN0IHN1YiA9IGV4dFN1YmRvbWFpbklucHV0LnZhbHVlLnRyaW0oKSB8fCBkZXJpdmVTdWJkb21haW4oZXh0TmFtZUlucHV0Py52YWx1ZSB8fCAnJyk7XG4gICAgICBpZiAoZXh0U3ViZG9tYWluUHJldmlldykge1xuICAgICAgICBleHRTdWJkb21haW5QcmV2aWV3LnRleHRDb250ZW50ID0gc3ViID8gYFxcdTIxOTIgJHtidWlsZERvbWFpbihzdWIpfWAgOiAnJztcbiAgICAgIH1cbiAgICAgIGlmIChleHREb21haW5QcmV2aWV3KSB7XG4gICAgICAgIGV4dERvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBzdWIgPyBidWlsZERvbWFpbihzdWIpIDogJyc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PSBDUkVBVEUgRVhURVJOQUwgU0VSVklDRSA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUV4dGVybmFsU2VydmljZSgpIHtcbiAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBleHRlcm5hbFVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXVybCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBzdWJkb21haW4gPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2Utc3ViZG9tYWluJykudmFsdWUudHJpbSgpIHx8IGRlcml2ZVN1YmRvbWFpbihuYW1lKSkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtbG9nbycpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtaWNvbicpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBjcmVhdGVEbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtY3JlYXRlLWRucycpLmNoZWNrZWQ7XG4gICAgY29uc3QgY3JlYXRlQ2FkZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtY3JlYXRlLWNhZGR5JykuY2hlY2tlZDtcbiAgICBjb25zdCBwcm94eUlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXByb3h5LWlwJykudmFsdWUudHJpbSgpIHx8IFNJVEUuZG5zSXAgfHwgJ2xvY2FsaG9zdCc7XG4gICAgY29uc3QgcHJlc2VydmVIb3N0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXByZXNlcnZlLWhvc3QnKS5jaGVja2VkO1xuICAgIGNvbnN0IGZvbGxvd1JlZGlyZWN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1mb2xsb3ctcmVkaXJlY3RzJykuY2hlY2tlZDtcbiAgICBjb25zdCBjYXRlZ29yeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWNhdGVnb3J5Jyk/LnZhbHVlIHx8ICcnO1xuXG4gICAgaWYgKCFuYW1lIHx8ICFleHRlcm5hbFVybCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGZpbGwgaW4gTmFtZSBhbmQgRXh0ZXJuYWwgVVJMJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXN1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ291bGQgbm90IGRlcml2ZSBzdWJkb21haW4gZnJvbSBuYW1lLiBQbGVhc2Ugc2V0IG9uZSBpbiBPcHRpb25zLicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFleHRlcm5hbFVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIWV4dGVybmFsVXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0V4dGVybmFsIFVSTCBtdXN0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovLycsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZG9tYWluID0gYnVpbGREb21haW4oc3ViZG9tYWluKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHRzID0geyBkbnM6IG51bGwsIGNhZGR5OiBudWxsLCBkYXNoYm9hcmQ6IGZhbHNlIH07XG5cbiAgICAgIGlmIChjcmVhdGVEbnMpIHtcbiAgICAgICAgY29uc3QgYWRtaW5Ub2tlbiA9IHdpbmRvdy5nZXRUb2tlbihnZXRQcmltYXJ5RG5zSWQoKSwgJ2FkbWluJyk7XG4gICAgICAgIGlmIChhZG1pblRva2VuKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRuc1Jlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZG5zL3JlY29yZCcsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZG9tYWluOiBkb21haW4sXG4gICAgICAgICAgICAgICAgaXA6IHByb3h5SXAsXG4gICAgICAgICAgICAgICAgdHRsOiBEQy5ERUZBVUxUUy5UVEwsXG4gICAgICAgICAgICAgICAgc2VydmVyOiBTSVRFLmRuc0lwXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGRuc1Jlc3VsdCA9IGF3YWl0IGRuc1Jlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHJlc3VsdHMuZG5zID0gZG5zUmVzdWx0LnN1Y2Nlc3MgPyAnY3JlYXRlZCcgOiAoZG5zUmVzdWx0LmVycm9yIHx8ICdmYWlsZWQnKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXN1bHRzLmRucyA9IGUubWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0cy5kbnMgPSAnbm8gYWRtaW4gdG9rZW4gKGNvbmZpZ3VyZSBpbiBcXHVEODNEXFx1REQxMSBUb2tlbnMpJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3JlYXRlQ2FkZHkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjYWRkeUNvbmZpZyA9IHtcbiAgICAgICAgICAgIHN1YmRvbWFpbjogc3ViZG9tYWluLFxuICAgICAgICAgICAgZXh0ZXJuYWxVcmw6IGV4dGVybmFsVXJsLFxuICAgICAgICAgICAgcHJlc2VydmVIb3N0OiBwcmVzZXJ2ZUhvc3QsXG4gICAgICAgICAgICBmb2xsb3dSZWRpcmVjdHM6IGZvbGxvd1JlZGlyZWN0cyxcbiAgICAgICAgICAgIHNzbFR5cGU6ICdjYWRkeS1tYW5hZ2VkJyxcbiAgICAgICAgICAgIGNhZGR5ZmlsZVBhdGg6IERDLkRFRkFVTFRTLkNBRERZRklMRSxcbiAgICAgICAgICAgIHJlbG9hZENhZGR5OiB0cnVlXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNhZGR5UmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zaXRlL2V4dGVybmFsJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNhZGR5Q29uZmlnKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgY2FkZHlSZXN1bHQgPSBhd2FpdCBjYWRkeVJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICByZXN1bHRzLmNhZGR5ID0gY2FkZHlSZXN1bHQuc3VjY2VzcyA/ICdjcmVhdGVkJyA6IChjYWRkeVJlc3VsdC5lcnJvciB8fCAnZmFpbGVkJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXN1bHRzLmNhZGR5ID0gZS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1NlcnZpY2UgPSB7XG4gICAgICAgIGlkOiBzdWJkb21haW4sXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHVybDogYGh0dHBzOi8vJHtkb21haW59YCxcbiAgICAgICAgZXh0ZXJuYWxVcmw6IGV4dGVybmFsVXJsLFxuICAgICAgICBsb2dvOiBsb2dvIHx8IGljb24gfHwgJ1xcdUQ4M0NcXHVERjEwJyxcbiAgICAgICAgaXNFeHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgaXNDdXN0b206IHRydWVcbiAgICAgIH07XG4gICAgICAvLyBPbmx5IGF0dGFjaCBjYXRlZ29yeSBpZiB1c2VyIGFjdHVhbGx5IHBpY2tlZCBvbmVcbiAgICAgIGlmIChjYXRlZ29yeSkgbmV3U2VydmljZS5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuXG4gICAgICB3aW5kb3cuQVBQUy5wdXNoKG5ld1NlcnZpY2UpO1xuICAgICAgcmVzdWx0cy5kYXNoYm9hcmQgPSB0cnVlO1xuXG4gICAgICBjb25zdCBkZWZhdWx0U2VydmljZXMgPSBbJ3BsZXgnLCAncm91dGVyJywgJ2NoYXQnLCAnc3luYycsICd0b3JyZW50JywgJ3JhZGFycicsICdzb25hcnInLCAncHJvd2xhcnInLCAncG9ydGFpbmVyJywgJ3JlcXVlc3RzJywgJ2plbGx5ZmluJywgJ2VtYnknXTtcbiAgICAgIGNvbnN0IGN1c3RvbVNlcnZpY2VzID0gd2luZG93LkFQUFMuZmlsdGVyKGFwcCA9PiAhZGVmYXVsdFNlcnZpY2VzLmluY2x1ZGVzKGFwcC5pZCkpO1xuICAgICAgc2FmZVNldCgnY3VzdG9tLXNlcnZpY2VzJywgSlNPTi5zdHJpbmdpZnkoY3VzdG9tU2VydmljZXMpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2VydmljZXMnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkod2luZG93LkFQUFMpXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzYXZlIHRvIHNlcnZpY2VzLmpzb246JywgZSk7XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG5cbiAgICAgIGNsb3NlQWRkU2VydmljZU1vZGFsKCk7XG5cbiAgICAgIGNvbnN0IHBhcnRzID0gW2BFeHRlcm5hbCBzZXJ2aWNlIFwiJHtuYW1lfVwiIGFkZGVkIWBdO1xuICAgICAgaWYgKGNyZWF0ZURucykgcGFydHMucHVzaChgRE5TOiAke3Jlc3VsdHMuZG5zID09PSAnY3JlYXRlZCcgPyAnXFx1MjcxMycgOiAnXFx1MjZBMCAnICsgcmVzdWx0cy5kbnN9YCk7XG4gICAgICBpZiAoY3JlYXRlQ2FkZHkpIHBhcnRzLnB1c2goYENhZGR5OiAke3Jlc3VsdHMuY2FkZHkgPT09ICdjcmVhdGVkJyA/ICdcXHUyNzEzJyA6ICdcXHUyNkEwICcgKyByZXN1bHRzLmNhZGR5fWApO1xuICAgICAgcGFydHMucHVzaChgQWNjZXNzIGF0OiBodHRwczovLyR7ZG9tYWlufWApO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihwYXJ0cy5qb2luKCcgfCAnKSwgJ3N1Y2Nlc3MnLCA2MDAwKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGV4dGVybmFsIHNlcnZpY2U6JywgZXJyb3IpO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIGNyZWF0ZSBleHRlcm5hbCBzZXJ2aWNlOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gQ0xPU0UgQUREIFNFUlZJQ0UgTU9EQUwgPT09PT1cblxuICBmdW5jdGlvbiBjbG9zZUFkZFNlcnZpY2VNb2RhbCgpIHtcbiAgICBjbG9zZU1vZGFsKCdhZGQtc2VydmljZS1tb2RhbCcpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtbmFtZS1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2Utc3ViZG9tYWluLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1pcC1pbnB1dCcpLnZhbHVlID0gUVVJQ0tfSVBTLmxhbiB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1sb2dvLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXR0bC1pbnB1dCcpLnZhbHVlID0gREMuREVGQVVMVFMuVFRMO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzc2wtdHlwZS1zZWxlY3QnKS52YWx1ZSA9IGdldFNtYXJ0U3NsRGVmYXVsdCgpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYS1uYW1lLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5hYmxlLWF1dGgnKS5jaGVja2VkID0gZmFsc2U7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1jb3JzJykuY2hlY2tlZCA9IGZhbHNlO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20taGVhZGVycy1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Vwc3RyZWFtLXBhdGgtaW5wdXQnKS52YWx1ZSA9ICcvJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltZW91dC1pbnB1dCcpLnZhbHVlID0gJzMwJztcblxuICAgIC8vIENsZWFyIHN1YmRvbWFpbiBwcmV2aWV3c1xuICAgIGNvbnN0IHN1YlByZXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViZG9tYWluLXByZXZpZXcnKTtcbiAgICBpZiAoc3ViUHJldikgc3ViUHJldi50ZXh0Q29udGVudCA9ICcnO1xuICAgIGNvbnN0IGV4dFN1YlByZXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc3ViZG9tYWluLXByZXZpZXcnKTtcbiAgICBpZiAoZXh0U3ViUHJldikgZXh0U3ViUHJldi50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgLy8gQ2xlYXIgZXh0ZXJuYWwgZmllbGRzXG4gICAgY29uc3QgZXh0TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLW5hbWUnKTtcbiAgICBpZiAoZXh0TmFtZSkgZXh0TmFtZS52YWx1ZSA9ICcnO1xuICAgIGNvbnN0IGV4dFN1YiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpbicpO1xuICAgIGlmIChleHRTdWIpIGV4dFN1Yi52YWx1ZSA9ICcnO1xuICAgIGNvbnN0IGV4dFVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXVybCcpO1xuICAgIGlmIChleHRVcmwpIGV4dFVybC52YWx1ZSA9ICcnO1xuICAgIGNvbnN0IGV4dExvZ28gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1sb2dvJyk7XG4gICAgaWYgKGV4dExvZ28pIGV4dExvZ28udmFsdWUgPSAnJztcbiAgICBjb25zdCBleHRJY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtaWNvbicpO1xuICAgIGlmIChleHRJY29uKSBleHRJY29uLnZhbHVlID0gJyc7XG5cbiAgICAvLyBDb2xsYXBzZSBvcHRpb25zXG4gICAgY29uc3QgbG9jYWxPcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2FsLWFkdmFuY2VkLW9wdGlvbnMnKTtcbiAgICBpZiAobG9jYWxPcHRzKSBsb2NhbE9wdHMucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7XG4gICAgY29uc3QgZXh0T3B0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1hZHZhbmNlZC1vcHRpb25zJyk7XG4gICAgaWYgKGV4dE9wdHMpIGV4dE9wdHMucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7XG5cbiAgICAvLyBSZXNldCB0byBsb2NhbCB0YWJcbiAgICBjb25zdCBsb2NhbFJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtdHlwZS1sb2NhbCcpO1xuICAgIGlmIChsb2NhbFJhZGlvKSBsb2NhbFJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgIGNvbnN0IGxvY2FsQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2FsLXNlcnZpY2UtY29uZmlnJyk7XG4gICAgY29uc3QgZXh0ZXJuYWxDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1jb25maWcnKTtcbiAgICBpZiAobG9jYWxDb25maWcpIGxvY2FsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc7XG4gICAgaWYgKGV4dGVybmFsQ29uZmlnKSBleHRlcm5hbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGNvbnN0IHRhYkxvY2FsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1sb2NhbCcpO1xuICAgIGNvbnN0IHRhYkV4dGVybmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1leHRlcm5hbCcpO1xuICAgIGlmICh0YWJMb2NhbCkgeyB0YWJMb2NhbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWFjY2VudCknOyB0YWJMb2NhbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1iZyknOyB9XG4gICAgaWYgKHRhYkV4dGVybmFsKSB7IHRhYkV4dGVybmFsLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnOyB0YWJFeHRlcm5hbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknOyB9XG4gIH1cblxuICAvLyA9PT09PSBDUkVBVEUgTkVXIFNFUlZJQ0UgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdTZXJ2aWNlKCkge1xuICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1uYW1lLWlucHV0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IHN1YmRvbWFpbiA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1zdWJkb21haW4taW5wdXQnKS52YWx1ZS50cmltKCkgfHwgZGVyaXZlU3ViZG9tYWluKG5hbWUpKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgbG9nbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWxvZ28taW5wdXQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgY3JlYXRlRG5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NyZWF0ZS1kbnMtcmVjb3JkJykuY2hlY2tlZDtcbiAgICBjb25zdCB0dGwgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXR0bC1pbnB1dCcpLnZhbHVlKSB8fCBEQy5ERUZBVUxUUy5UVEw7XG4gICAgY29uc3QgdGFpbHNjYWxlT25seSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW51YWwtdGFpbHNjYWxlLW9ubHknKT8uY2hlY2tlZCB8fCBmYWxzZTtcblxuICAgIGNvbnN0IHNzbFR5cGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3NsLXR5cGUtc2VsZWN0Jyk/LnZhbHVlIHx8ICdjYWRkeS1tYW5hZ2VkJztcbiAgICBjb25zdCBjYU5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2EtbmFtZS1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCBleGlzdGluZ0NhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4aXN0aW5nLWNhLXNlbGVjdCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCBlbmFibGVBdXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1hdXRoJyk/LmNoZWNrZWQgfHwgZmFsc2U7XG4gICAgY29uc3QgZW5hYmxlQ29ycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmFibGUtY29ycycpPy5jaGVja2VkIHx8IGZhbHNlO1xuICAgIGNvbnN0IGN1c3RvbUhlYWRlcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3VzdG9tLWhlYWRlcnMtaW5wdXQnKT8udmFsdWUgfHwgJyc7XG4gICAgY29uc3QgdXBzdHJlYW1QYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Vwc3RyZWFtLXBhdGgtaW5wdXQnKT8udmFsdWUgfHwgJy8nO1xuICAgIGNvbnN0IGhlYWx0aENoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCB0aW1lb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpbWVvdXQtaW5wdXQnKT8udmFsdWUgfHwgMzA7XG5cbiAgICAvLyBDYXRlZ29yeSBpcyBvcHRpb25hbCBcdTIwMTQgcHVsbGVkIGZyb20gZWl0aGVyIGxvY2FsIG9yIGV4dGVybmFsIHNlbGVjdCBieSB0aGVcbiAgICAvLyBvcGVuQWRkU2VydmljZU1vZGFsIHJlc2V0LiBJZiB1c2VyIGRvZXNuJ3QgY2hvb3NlIG9uZSwgaXQgc3RheXMgdW5kZWZpbmVkXG4gICAgLy8gYW5kIHdlIGRvbid0IHNlbmQgaXQgKHNvIHRoZSBiYWNrZW5kIGtlZXBzIHRoZSBleGlzdGluZyBiZWhhdmlvcikuXG4gICAgY29uc3QgY2F0ZWdvcnlFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWNhdGVnb3J5LWlucHV0JylcbiAgICAgIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWNhdGVnb3J5Jyk7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBjYXRlZ29yeUVsPy52YWx1ZSB8fCAnJztcblxuICAgIGNvbnN0IGRuc1Rva2VuID0gd2luZG93LmdldFRva2VuKGdldFByaW1hcnlEbnNJZCgpLCAnYWRtaW4nKTtcblxuICAgIGlmICghbmFtZSB8fCAhcG9ydCB8fCAhaXApIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBmaWxsIGluIE5hbWUsIFBvcnQsIGFuZCBJUCBBZGRyZXNzJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXN1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ291bGQgbm90IGRlcml2ZSBzdWJkb21haW4gZnJvbSBuYW1lLiBQbGVhc2Ugc2V0IG9uZSBpbiBPcHRpb25zLicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZURucyAmJiAhZG5zVG9rZW4pIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ROUyBBZG1pbiB0b2tlbiByZXF1aXJlZC4gQ29uZmlndXJlIGl0IGluIHRoZSBUb2tlbnMgbWVudSBmaXJzdC4nLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHMgPSB7IGRuczogbnVsbCwgY2FkZHk6IG51bGwsIGRhc2hib2FyZDogZmFsc2UgfTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoY3JlYXRlRG5zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd2luZG93LmNyZWF0ZURuc1JlY29yZChzdWJkb21haW4sIGlwLCB0dGwpO1xuICAgICAgICAgIHJlc3VsdHMuZG5zID0gJ2NyZWF0ZWQnO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ROUyBjcmVhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICAgIHJlc3VsdHMuZG5zID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEROUyBjcmVhdGlvbiBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0cy5kbnMgPSAnc2tpcHBlZCc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhZGR5Q29uZmlnID0gd2luZG93LmdlbmVyYXRlQ2FkZHlDb25maWcoe1xuICAgICAgICBzdWJkb21haW4sIHBvcnQsIGlwLCBzc2xUeXBlLCBjYU5hbWUsIGV4aXN0aW5nQ2EsXG4gICAgICAgIGVuYWJsZUF1dGgsIGVuYWJsZUNvcnMsIGN1c3RvbUhlYWRlcnMsIHVwc3RyZWFtUGF0aCwgaGVhbHRoQ2hlY2ssIHRpbWVvdXQsIHRhaWxzY2FsZU9ubHlcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjYWRkeVJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2l0ZScsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBkb21haW46IGJ1aWxkRG9tYWluKHN1YmRvbWFpbiksXG4gICAgICAgICAgICB1cHN0cmVhbTogYCR7aXB9OiR7cG9ydH1gLFxuICAgICAgICAgICAgY29uZmlnOiBjYWRkeUNvbmZpZ1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNhZGR5UmVzdWx0ID0gYXdhaXQgY2FkZHlSZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChjYWRkeVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cy5jYWRkeSA9ICdhZGRlZCAmIHJlbG9hZGVkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYWRkeSBjb25maWd1cmF0aW9uIGZhaWxlZDonLCBjYWRkeVJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgcmVzdWx0cy5jYWRkeSA9IGNhZGR5UmVzdWx0LmVycm9yIHx8ICdmYWlsZWQnO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FkZHkgY29uZmlndXJhdGlvbiBmYWlsZWQ6ICR7Y2FkZHlSZXN1bHQuZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NhZGR5IEFQSSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIHJlc3VsdHMuY2FkZHkgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhZGR5IEFQSSBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXJ2aWNlQ29uZmlnID0ge1xuICAgICAgICBuYW1lLCBzdWJkb21haW4sIHBvcnQsIGlwLFxuICAgICAgICBsb2dvOiBsb2dvIHx8IGAvYXNzZXRzLyR7c3ViZG9tYWlufS5wbmdgLFxuICAgICAgICB0YWlsc2NhbGVPbmx5OiB0YWlsc2NhbGVPbmx5IHx8IGZhbHNlXG4gICAgICB9O1xuICAgICAgLy8gT25seSBpbmNsdWRlIGNhdGVnb3J5IGlmIHVzZXIgYWN0dWFsbHkgcGlja2VkIG9uZVxuICAgICAgaWYgKGNhdGVnb3J5KSBzZXJ2aWNlQ29uZmlnLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG5cbiAgICAgIGF3YWl0IHdpbmRvdy5hZGRTZXJ2aWNlVG9Db25maWcoc2VydmljZUNvbmZpZyk7XG4gICAgICByZXN1bHRzLmRhc2hib2FyZCA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHN0YXR1c1BhcnRzID0gW1xuICAgICAgICBgRE5TOiAke3Jlc3VsdHMuZG5zID09PSAnY3JlYXRlZCcgPyAnXFx1MjcxMycgOiByZXN1bHRzLmRucyA9PT0gJ3NraXBwZWQnID8gJ1xcdTI1Q0InIDogJ1xcdTI3MTcnfWAsXG4gICAgICAgIGBDYWRkeTogJHtyZXN1bHRzLmNhZGR5ID09PSAnYWRkZWQgJiByZWxvYWRlZCcgPyAnXFx1MjcxMycgOiAnXFx1MjcxNyd9YCxcbiAgICAgICAgYERhc2hib2FyZDogJHtyZXN1bHRzLmRhc2hib2FyZCA/ICdcXHUyNzEzJyA6ICdcXHUyNzE3J31gXG4gICAgICBdO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgU2VydmljZSBcIiR7bmFtZX1cIiBjcmVhdGVkISAke3N0YXR1c1BhcnRzLmpvaW4oJyB8ICcpfSBcXHUyMDE0ICR7YnVpbGRTZXJ2aWNlVXJsKHN1YmRvbWFpbil9JHt0YWlsc2NhbGVPbmx5ID8gJyAoVGFpbHNjYWxlKScgOiAnJ31gLCAnc3VjY2VzcycsIDYwMDApO1xuXG4gICAgICBjbG9zZUFkZFNlcnZpY2VNb2RhbCgpO1xuXG4gICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIHNlcnZpY2U6JywgZXJyb3IpO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3IgY3JlYXRpbmcgXCIke25hbWV9XCI6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCA2MDAwKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBFVkVOVCBMSVNURU5FUlMgPT09PT1cblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXNlcnZpY2UnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuQWRkU2VydmljZU1vZGFsKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlQWRkU2VydmljZU1vZGFsKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWNyZWF0ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBzZXJ2aWNlVHlwZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzZXJ2aWNlLXR5cGVcIl06Y2hlY2tlZCcpPy52YWx1ZTtcbiAgICBpZiAoc2VydmljZVR5cGUgPT09ICdleHRlcm5hbCcpIHtcbiAgICAgIGNyZWF0ZUV4dGVybmFsU2VydmljZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjcmVhdGVOZXdTZXJ2aWNlKCk7XG4gICAgfVxuICB9KTtcblxuICBzZXR1cFNlcnZpY2VUeXBlU3dpdGNoaW5nKCk7XG4gIHNldHVwQXV0b1N1YmRvbWFpbigpO1xuICBpbml0UXVpY2tJUEJ1dHRvbnMoKTtcblxuICAvLyBTU0wgdHlwZSBjaGFuZ2UgaGFuZGxlclxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3NsLXR5cGUtc2VsZWN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgY29uc3QgZXhpc3RpbmdDYUNvbmZpZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGlzdGluZy1jYS1jb25maWcnKTtcbiAgICBjb25zdCBjdXN0b21DYUNvbmZpZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20tY2EtY29uZmlnJyk7XG5cbiAgICBleGlzdGluZ0NhQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgY3VzdG9tQ2FDb25maWcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIGlmIChlLnRhcmdldC52YWx1ZSA9PT0gJ2V4aXN0aW5nLWNhJykge1xuICAgICAgZXhpc3RpbmdDYUNvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9IGVsc2UgaWYgKGUudGFyZ2V0LnZhbHVlID09PSAnY3VzdG9tLWNhJykge1xuICAgICAgY3VzdG9tQ2FDb25maWcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuXG4gICAgdXBkYXRlU2VydmljZVByZXZpZXcoKTtcbiAgfSk7XG5cbiAgLy8gUmVmcmVzaCBDQXMgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoLWNhcycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmcmVzaC1jYXMnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidXR0b24udGV4dENvbnRlbnQ7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1xcdTIzMUIgTG9hZGluZy4uLic7XG4gICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWRkeWZpbGVQYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhZGR5ZmlsZS1wYXRoLWlucHV0JykudmFsdWUgfHwgREMuREVGQVVMVFMuQ0FERFlGSUxFO1xuICAgICAgYXdhaXQgd2luZG93LmxvYWRFeGlzdGluZ0NBcyhjYWRkeWZpbGVQYXRoKTtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcXHUyNzA1IFJlZnJlc2hlZCc7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcXHUyNzRDIEZhaWxlZCc7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCBDQXM6JywgZXJyb3IpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfSwgMjAwMCk7XG4gIH0pO1xuXG4gIC8vIEROUyByZWNvcmQgY2hlY2tib3ggaGFuZGxlclxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3JlYXRlLWRucy1yZWNvcmQnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICBjb25zdCBkbnNDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWNvbmZpZycpO1xuICAgIGRuc0NvbmZpZy5zdHlsZS5kaXNwbGF5ID0gZS50YXJnZXQuY2hlY2tlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH0pO1xuXG4gIC8vIFJlYWwtdGltZSBwcmV2aWV3IHVwZGF0ZXNcbiAgWydzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcsICdzZXJ2aWNlLWlwLWlucHV0JywgJ3NlcnZpY2UtcG9ydC1pbnB1dCcsICdjYS1uYW1lLWlucHV0JyxcbiAgICdleGlzdGluZy1jYS1zZWxlY3QnLCAnZW5hYmxlLWF1dGgnLCAnZW5hYmxlLWNvcnMnLCAnY3VzdG9tLWhlYWRlcnMtaW5wdXQnLCAndXBzdHJlYW0tcGF0aC1pbnB1dCcsXG4gICAnaGVhbHRoLWNoZWNrLWlucHV0JywgJ3RpbWVvdXQtaW5wdXQnXS5mb3JFYWNoKGlkID0+IHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdXBkYXRlU2VydmljZVByZXZpZXcpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVTZXJ2aWNlUHJldmlldyk7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT09PSBDVVNUT00gU0VSVklDRVMgRlJPTSBMT0NBTFNUT1JBR0UgPT09PT1cblxuICBmdW5jdGlvbiBsb2FkQ3VzdG9tU2VydmljZXMoKSB7XG4gICAgY29uc3QgY3VzdG9tU2VydmljZXMgPSBzYWZlR2V0KCdjdXN0b20tc2VydmljZXMnKTtcbiAgICBpZiAoY3VzdG9tU2VydmljZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gSlNPTi5wYXJzZShjdXN0b21TZXJ2aWNlcyk7XG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgaWYgKCF3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2UuaWQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKHNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgY3VzdG9tIHNlcnZpY2VzOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvYWRDdXN0b21TZXJ2aWNlcygpO1xuXG4gIC8vID09PT09IFdJTkRPVyBFWFBPUlRTID09PT09XG5cbiAgd2luZG93Lm9wZW5BZGRTZXJ2aWNlTW9kYWwgPSBvcGVuQWRkU2VydmljZU1vZGFsO1xuICB3aW5kb3cuY2xvc2VBZGRTZXJ2aWNlTW9kYWwgPSBjbG9zZUFkZFNlcnZpY2VNb2RhbDtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gTElWRSBEQVNIQk9BUkQgRVZFTlRTIChTU0UpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgbGV0IGVzID0gbnVsbDtcbiAgbGV0IHJlY29ubmVjdERlbGF5ID0gMTAwMDtcbiAgY29uc3QgTUFYX1JFQ09OTkVDVCA9IDMwMDAwO1xuICBsZXQgX3NzZUZhaWxDb3VudCA9IDA7XG4gIGxldCBfc3NlTWFudWFsbHlDbG9zZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBjb25uZWN0KCkge1xuICAgIGlmIChlcykgeyB0cnkgeyBlcy5jbG9zZSgpOyB9IGNhdGNoIChfKSB7fSB9XG4gICAgaWYgKF9zc2VNYW51YWxseUNsb3NlZCkgcmV0dXJuOyAvLyBhdXRoLWxvc3Q6IGRvbid0IHJlY29ubmVjdFxuXG4gICAgZXMgPSBuZXcgRXZlbnRTb3VyY2UoJy9hcGkvdjEvZXZlbnRzL3N0cmVhbScpO1xuXG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcignY29ubmVjdGVkJywgKCkgPT4ge1xuICAgICAgcmVjb25uZWN0RGVsYXkgPSAxMDAwOyAvLyByZXNldCBiYWNrb2ZmXG4gICAgICBfc3NlRmFpbENvdW50ID0gMDsgLy8gcmVzZXQgZmFpbHVyZSBjb3VudGVyXG4gICAgICBkZWJ1ZygnW1NTRV0gQ29ubmVjdGVkIHRvIGV2ZW50IHN0cmVhbScpO1xuICAgIH0pO1xuXG4gICAgLy8gSGVhbHRoIHN0YXR1cyBjaGFuZ2VzIFx1MjE5MiB1cGRhdGUgY2FyZCBkb3RzL2JhZGdlcyBpbiByZWFsIHRpbWVcbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCdzdGF0dXMtY2hhbmdlJywgKGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGQgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGlmIChkLnNlcnZpY2VJZCAmJiB0eXBlb2Ygd2luZG93LnNldEJhZGdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgdXAgPSBkLnN0YXR1cyA9PT0gJ3VwJyB8fCBkLnN0YXR1cyA9PT0gJ2hlYWx0aHknO1xuICAgICAgICAgIHdpbmRvdy5zZXRCYWRnZShkLnNlcnZpY2VJZCwgdXAsIGQucmVzcG9uc2VUaW1lIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH0pO1xuXG4gICAgLy8gUmVzb3VyY2UgYWxlcnRzIFx1MjE5MiB0b2FzdCBub3RpZmljYXRpb25cbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCdyZXNvdXJjZS1hbGVydCcsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBjb25zdCBtc2cgPSBgJHtkLmNvbnRhaW5lck5hbWUgfHwgZC5jb250YWluZXJJZH06ICR7ZC5tZXRyaWN9IGF0ICR7ZC52YWx1ZX0lICh0aHJlc2hvbGQ6ICR7ZC50aHJlc2hvbGR9JSlgO1xuICAgICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKG1zZywgJ3dhcm5pbmcnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIENvbnRhaW5lciBhdXRvLXJlc3RhcnRcbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCdhdXRvLXJlc3RhcnQnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgQ29udGFpbmVyIFwiJHtkLmNvbnRhaW5lck5hbWV9XCIgd2FzIGF1dG8tcmVzdGFydGVkYCwgJ2luZm8nKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBhdmFpbGFibGUgXHUyMTkyIHNob3cgbm90aWZpY2F0aW9uIGRvdCBvbiBVcGRhdGVzIGJ1dHRvblxuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZS1hdmFpbGFibGUnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgY29uc3QgdXBkYXRlc0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWJ0bicpO1xuICAgICAgICBpZiAodXBkYXRlc0J0biAmJiAhdXBkYXRlc0J0bi5xdWVyeVNlbGVjdG9yKCcuc3NlLWRvdCcpKSB7XG4gICAgICAgICAgY29uc3QgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIGRvdC5jbGFzc05hbWUgPSAnc3NlLWRvdCc7XG4gICAgICAgICAgZG90LnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6OHB4O2hlaWdodDo4cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQpO21hcmdpbi1sZWZ0OjZweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7JztcbiAgICAgICAgICB1cGRhdGVzQnRuLmFwcGVuZENoaWxkKGRvdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgVXBkYXRlIGF2YWlsYWJsZSBmb3IgJHtkLmNvbnRhaW5lck5hbWUgfHwgZC5jb250YWluZXJJZH1gLCAnaW5mbycpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHN0YXJ0L2NvbXBsZXRlL2ZhaWxlZFxuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZS1jb21wbGV0ZScsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBVcGRhdGUgY29tcGxldGVkOiAke2QuY29udGFpbmVyTmFtZSB8fCBkLmNvbnRhaW5lcklkfWAsICdzdWNjZXNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJpZ2dlciBhIGRhc2hib2FyZCByZWZyZXNoXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LnJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH0pO1xuXG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcigndXBkYXRlLWZhaWxlZCcsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBVcGRhdGUgZmFpbGVkOiAke2QuY29udGFpbmVyTmFtZSB8fCBkLmNvbnRhaW5lcklkfSBcdTIwMTQgJHtkLmVycm9yIHx8ICd1bmtub3duIGVycm9yJ31gLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIEluY2lkZW50c1xuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ2luY2lkZW50JywgKGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGQgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlmIChkLnR5cGUgPT09ICdjcmVhdGVkJykge1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgSW5jaWRlbnQ6ICR7ZC5tZXNzYWdlIHx8IGQuc2VydmljZUlkfWAsICdlcnJvcicpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZC50eXBlID09PSAncmVzb2x2ZWQnKSB7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBSZXNvbHZlZDogJHtkLnNlcnZpY2VJZCB8fCAnaW5jaWRlbnQnfWAsICdzdWNjZXNzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH0pO1xuXG4gICAgLy8gUmVjb25uZWN0IG9uIGVycm9yXG4gICAgZXMub25lcnJvciA9ICgpID0+IHtcbiAgICAgIGVzLmNsb3NlKCk7XG4gICAgICAvLyBJZiBhdXRoIHdhcyBleHBsaWNpdGx5IGxvc3QgKDQwMS80MDMgZnJvbSB0aGUgcG9sbGluZyBsb29wKSxcbiAgICAgIC8vIGRvbid0IGF0dGVtcHQgcmVjb25uZWN0aW9uIGF0IGFsbC5cbiAgICAgIGlmICh3aW5kb3cuX2RjQXV0aExvc3QgfHwgX3NzZU1hbnVhbGx5Q2xvc2VkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NTRV0gQXV0aCBsb3N0IFx1MjAxNCBzdG9wcGluZyByZWNvbm5lY3Rpb24nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVHJhbnNpZW50IGZhaWx1cmVzOiByZXRyeSB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYsIHN0b3AgYWZ0ZXIgNVxuICAgICAgX3NzZUZhaWxDb3VudCsrO1xuICAgICAgaWYgKF9zc2VGYWlsQ291bnQgPiA1KSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NTRV0gTWF4IHJlY29ubmVjdCBhdHRlbXB0cyByZWFjaGVkIFx1MjAxNCBzdG9wcGluZyAoc2VydmVyIHVucmVhY2hhYmxlKScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oYFtTU0VdIERpc2Nvbm5lY3RlZCwgcmVjb25uZWN0aW5nIGluICR7cmVjb25uZWN0RGVsYXkgLyAxMDAwfXMuLi5gKTtcbiAgICAgIHNldFRpbWVvdXQoY29ubmVjdCwgcmVjb25uZWN0RGVsYXkpO1xuICAgICAgcmVjb25uZWN0RGVsYXkgPSBNYXRoLm1pbihyZWNvbm5lY3REZWxheSAqIDIsIE1BWF9SRUNPTk5FQ1QpO1xuICAgIH07XG4gIH1cblxuICAvLyBDYWxsZWQgYnkgZ3JpZC5qcyB3aGVuIHRoZSBwb2xsaW5nIGxvb3AgZGV0ZWN0cyBhdXRoIGxvc3MgKDQwMS80MDMpXG4gIGZ1bmN0aW9uIGNsb3NlQW5kU3RvcCgpIHtcbiAgICBfc3NlTWFudWFsbHlDbG9zZWQgPSB0cnVlO1xuICAgIGlmIChlcykgeyB0cnkgeyBlcy5jbG9zZSgpOyB9IGNhdGNoIChfKSB7fSB9XG4gIH1cblxuICAvLyBDYWxsZWQgYnkgdG90cC1hdXRoLmpzIGFmdGVyIGEgc3VjY2Vzc2Z1bCBtaWQtc2Vzc2lvbiByZS1hdXRoOlxuICAvLyBjbGVhcnMgdGhlIGxhdGNoIHNvIGNvbm5lY3QoKSBjYW4gcHJvY2VlZCBhZ2FpbiBhbmQgcmVzZXRzIHRoZVxuICAvLyBmYWlsdXJlIGJhY2tvZmYuIChQbGFpbiBfc3NlUmVjb25uZWN0L2Nvbm5lY3QoKSB3b3VsZCBlYXJseS1yZXR1cm5cbiAgLy8gb24gdGhlIGxhdGNoIGZvcmV2ZXIgXHUyMDE0IHRoZSB1c2VyIHdvdWxkIG5lZWQgYSBtYW51YWwgRjUuKVxuICBmdW5jdGlvbiByZXN1bWVBZnRlclJlYXV0aCgpIHtcbiAgICBfc3NlTWFudWFsbHlDbG9zZWQgPSBmYWxzZTtcbiAgICBfc3NlRmFpbENvdW50ID0gMDtcbiAgICByZWNvbm5lY3REZWxheSA9IDEwMDA7XG4gICAgY29ubmVjdCgpO1xuICB9XG5cbiAgLy8gU3RhcnQgb24gcGFnZSBsb2FkXG4gIGNvbm5lY3QoKTtcblxuICAvLyBFeHBvc2UgZm9yIGRlYnVnZ2luZyBhbmQgY3Jvc3MtbW9kdWxlIGNvb3JkaW5hdGlvblxuICB3aW5kb3cuX3NzZVJlY29ubmVjdCA9IGNvbm5lY3Q7XG4gIHdpbmRvdy5fc3NlQ2xvc2UgPSBjbG9zZUFuZFN0b3A7XG4gIHdpbmRvdy5fc3NlUmVzdW1lID0gcmVzdW1lQWZ0ZXJSZWF1dGg7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIEZJTFRFUiA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLXNlYXJjaCcpO1xuICBjb25zdCBzdGF0dXNTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1maWx0ZXItc3RhdHVzJyk7XG4gIGNvbnN0IGNhdGVnb3J5U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLWNhdGVnb3J5Jyk7XG4gIGNvbnN0IGNvdW50U3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWZpbHRlci1jb3VudCcpO1xuXG4gIC8vIEJ1aWxkIGEgc2luZ2xlIGNhdGVnb3J5IGxpc3QgZnJvbSBib3RoIHRoZSBBUEkgY2F0ZWdvcmllcyBhbmQgYW55XG4gIC8vIGNhdGVnb3JpZXMgcHJlc2VudCBvbiB0aGUgYWN0dWFsIHJlbmRlcmVkIGNhcmRzIChjb3ZlcnMgY3VzdG9tIHNlcnZpY2VzXG4gIC8vIHdob3NlIGNhdGVnb3J5IGlzbid0IGluIFRFTVBMQVRFX0NBVEVHT1JJRVMpLlxuICBmdW5jdGlvbiBnZXRDYXRlZ29yeUxpc3QoKSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBmcm9tQ2FyZHMgPSBuZXcgU2V0KCk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NhcmRzIC5jYXJkW2RhdGEtY2F0ZWdvcnldJykuZm9yRWFjaChjID0+IHtcbiAgICAgIGNvbnN0IGNhdCA9IGMuZGF0YXNldC5jYXRlZ29yeS50cmltKCk7XG4gICAgICBpZiAoY2F0KSBmcm9tQ2FyZHMuYWRkKGNhdCk7XG4gICAgfSk7XG4gICAgY29uc3QgYXBpQ2F0cyA9ICh3aW5kb3cuRENfQ0FURUdPUklFUyB8fCAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5DQVRFR09SSUVTKSkgfHwge307XG4gICAgY29uc3QgYWxsID0gT2JqZWN0LmtleXMoYXBpQ2F0cykuY29uY2F0KFsuLi5mcm9tQ2FyZHNdLmZpbHRlcihjID0+ICFhcGlDYXRzW2NdKSk7XG4gICAgYWxsLmZvckVhY2goYyA9PiBzZWVuLmFkZChjKSk7XG4gICAgcmV0dXJuIHsgbGlzdDogWy4uLnNlZW5dLCBhcGlDYXRzIH07XG4gIH1cblxuICBmdW5jdGlvbiByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bigpIHtcbiAgICBpZiAoIWNhdGVnb3J5U2VsZWN0KSByZXR1cm47XG4gICAgY29uc3QgeyBsaXN0LCBhcGlDYXRzIH0gPSBnZXRDYXRlZ29yeUxpc3QoKTtcbiAgICBjb25zdCBjdXJyZW50ID0gY2F0ZWdvcnlTZWxlY3QudmFsdWU7XG4gICAgY2F0ZWdvcnlTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJhbGxcIj5BbGwgQ2F0ZWdvcmllczwvb3B0aW9uPic7XG4gICAgbGlzdC5zb3J0KCkuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IGluZm8gPSBhcGlDYXRzW25hbWVdO1xuICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICBvcHQudmFsdWUgPSBuYW1lO1xuICAgICAgb3B0LnRleHRDb250ZW50ID0gaW5mbyA/IGAke2luZm8uaWNvbiB8fCAnJ30gJHtuYW1lfWAudHJpbSgpIDogbmFtZTtcbiAgICAgIGNhdGVnb3J5U2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgfSk7XG4gICAgLy8gUmVzdG9yZSBzZWxlY3Rpb24gaWYgaXQgc3RpbGwgZXhpc3RzXG4gICAgaWYgKGN1cnJlbnQgJiYgWy4uLmNhdGVnb3J5U2VsZWN0Lm9wdGlvbnNdLnNvbWUobyA9PiBvLnZhbHVlID09PSBjdXJyZW50KSkge1xuICAgICAgY2F0ZWdvcnlTZWxlY3QudmFsdWUgPSBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXRlZ29yeVNlbGVjdC52YWx1ZSA9ICdhbGwnO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZpbHRlcigpIHtcbiAgICByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bigpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gc2VhcmNoSW5wdXQudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3Qgc3RhdHVzRmlsdGVyID0gc3RhdHVzU2VsZWN0LnZhbHVlOyAvLyAnYWxsJywgJ29uJywgb3IgJ29mZidcbiAgICBjb25zdCBjYXRlZ29yeUZpbHRlciA9IGNhdGVnb3J5U2VsZWN0ID8gY2F0ZWdvcnlTZWxlY3QudmFsdWUgOiAnYWxsJztcblxuICAgIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NhcmRzIC5jYXJkJyk7XG4gICAgbGV0IHZpc2libGVDb3VudCA9IDA7XG5cbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBjb25zdCBhcHAgPSBjYXJkLmRhdGFzZXQuYXBwPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5kYXRhc2V0LnN0YXR1cyB8fCAnb2ZmJzsgLy8gJ29uJyBvciAnb2ZmJ1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBjYXJkLmRhdGFzZXQuY2F0ZWdvcnkgfHwgJyc7XG5cbiAgICAgIGNvbnN0IG1hdGNoZXNTZWFyY2ggPSAhcXVlcnkgfHwgbmFtZS5pbmNsdWRlcyhxdWVyeSkgfHwgYXBwLmluY2x1ZGVzKHF1ZXJ5KTtcbiAgICAgIGNvbnN0IG1hdGNoZXNTdGF0dXMgPSBzdGF0dXNGaWx0ZXIgPT09ICdhbGwnIHx8IHN0YXR1cyA9PT0gc3RhdHVzRmlsdGVyO1xuICAgICAgY29uc3QgbWF0Y2hlc0NhdGVnb3J5ID0gY2F0ZWdvcnlGaWx0ZXIgPT09ICdhbGwnIHx8IGNhdGVnb3J5ID09PSBjYXRlZ29yeUZpbHRlcjtcblxuICAgICAgaWYgKG1hdGNoZXNTZWFyY2ggJiYgbWF0Y2hlc1N0YXR1cyAmJiBtYXRjaGVzQ2F0ZWdvcnkpIHtcbiAgICAgICAgY2FyZC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHZpc2libGVDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FyZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGNvdW50U3Bhbikge1xuICAgICAgY29uc3QgdG90YWwgPSBjYXJkcy5sZW5ndGg7XG4gICAgICBjb3VudFNwYW4udGV4dENvbnRlbnQgPSBgJHt2aXNpYmxlQ291bnR9IG9mICR7dG90YWx9IHNlcnZpY2VzYDtcbiAgICB9XG4gIH1cblxuICAvLyBEZWJvdW5jZSBoZWxwZXJcbiAgZnVuY3Rpb24gZGVib3VuY2UoZm4sIGRlbGF5KSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGZuLmFwcGx5KHRoaXMsIGFyZ3MpLCBkZWxheSk7XG4gICAgfTtcbiAgfVxuXG4gIHNlYXJjaElucHV0Py5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGRlYm91bmNlKHVwZGF0ZUZpbHRlciwgMjAwKSk7XG4gIHN0YXR1c1NlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlRmlsdGVyKTtcbiAgY2F0ZWdvcnlTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZUZpbHRlcik7XG5cbiAgLy8gSW5pdGlhbCBjb3VudCBvbiBwYWdlIGxvYWRcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiBzZXRUaW1lb3V0KHVwZGF0ZUZpbHRlciwgNTAwKSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGltZW91dCh1cGRhdGVGaWx0ZXIsIDUwMCk7XG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIGV4dGVybmFsIHRyaWdnZXJzIChjYWxsZWQgYWZ0ZXIgYnVpbGRHcmlkIHRvIHJlcG9wdWxhdGUgY2F0ZWdvcmllcylcbiAgd2luZG93LnJlZnJlc2hTZXJ2aWNlRmlsdGVyID0gdXBkYXRlRmlsdGVyO1xuICB3aW5kb3cucmVmcmVzaENhdGVnb3J5RHJvcGRvd24gPSByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bjtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IEJBVENIIENPTlRBSU5FUiBPUEVSQVRJT05TID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgYmF0Y2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtb3BlcmF0aW9ucy1idG4nKTtcbiAgY29uc3QgYmF0Y2hCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtYWN0aW9uLWJhcicpO1xuICBjb25zdCBiYXRjaENvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXNlbGVjdGVkLWNvdW50Jyk7XG4gIGNvbnN0IHN0YXJ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXN0YXJ0LWJ0bicpO1xuICBjb25zdCBzdG9wQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXN0b3AtYnRuJyk7XG4gIGNvbnN0IHJlc3RhcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtcmVzdGFydC1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLWNhbmNlbC1idG4nKTtcblxuICBsZXQgYmF0Y2hNb2RlID0gZmFsc2U7XG4gIGxldCBzZWxlY3RlZENvbnRhaW5lcnMgPSBuZXcgU2V0KCk7XG5cbiAgZnVuY3Rpb24gZW50ZXJCYXRjaE1vZGUoKSB7XG4gICAgYmF0Y2hNb2RlID0gdHJ1ZTtcbiAgICBzZWxlY3RlZENvbnRhaW5lcnMuY2xlYXIoKTtcbiAgICBiYXRjaEJhci5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgYmF0Y2hCdG4udGV4dENvbnRlbnQgPSAnXHUyNzEzIEV4aXQgQmF0Y2ggTW9kZSc7XG4gICAgdXBkYXRlU2VsZWN0ZWRDb3VudCgpO1xuICAgIFxuICAgIC8vIEFkZCBjaGVja2JveGVzIHRvIGFsbCBjYXJkcyB3aXRoIGNvbnRhaW5lcklkXG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2FyZHMgLmNhcmRbZGF0YS1hcHBdJyk7XG4gICAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcklkID0gY2FyZC5kYXRhc2V0LmNvbnRhaW5lcklkO1xuICAgICAgaWYgKCFjb250YWluZXJJZCkgcmV0dXJuO1xuICAgICAgXG4gICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgY2hlY2tib3ggaWYgYW55XG4gICAgICBjb25zdCBleGlzdGluZyA9IGNhcmQucXVlcnlTZWxlY3RvcignLmJhdGNoLWNoZWNrYm94Jyk7XG4gICAgICBpZiAoZXhpc3RpbmcpIGV4aXN0aW5nLnJlbW92ZSgpO1xuICAgICAgXG4gICAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICAgIGNoZWNrYm94LmNsYXNzTmFtZSA9ICdiYXRjaC1jaGVja2JveCc7XG4gICAgICBjaGVja2JveC5kYXRhc2V0LmNvbnRhaW5lcklkID0gY29udGFpbmVySWQ7XG4gICAgICBjaGVja2JveC5kYXRhc2V0LnNlcnZpY2VOYW1lID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcubmFtZScpPy50ZXh0Q29udGVudCB8fCBjb250YWluZXJJZDtcbiAgICAgIGNoZWNrYm94LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246IGFic29sdXRlOyB0b3A6IDhweDsgbGVmdDogOHB4OyB6LWluZGV4OiAxMDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY3Vyc29yOiBwb2ludGVyOyc7XG4gICAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgICAgIHNlbGVjdGVkQ29udGFpbmVycy5hZGQoY29udGFpbmVySWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdGVkQ29udGFpbmVycy5kZWxldGUoY29udGFpbmVySWQpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVNlbGVjdGVkQ291bnQoKTtcbiAgICAgIH0pO1xuICAgICAgY2FyZC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICBjYXJkLmluc2VydEJlZm9yZShjaGVja2JveCwgY2FyZC5maXJzdENoaWxkKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4aXRCYXRjaE1vZGUoKSB7XG4gICAgYmF0Y2hNb2RlID0gZmFsc2U7XG4gICAgc2VsZWN0ZWRDb250YWluZXJzLmNsZWFyKCk7XG4gICAgYmF0Y2hCYXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBiYXRjaEJ0bi50ZXh0Q29udGVudCA9ICdcdTI2MzAgQmF0Y2ggT3BlcmF0aW9ucyc7XG4gICAgXG4gICAgLy8gUmVtb3ZlIGFsbCBjaGVja2JveGVzXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmJhdGNoLWNoZWNrYm94JykuZm9yRWFjaChjYiA9PiBjYi5yZW1vdmUoKSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTZWxlY3RlZENvdW50KCkge1xuICAgIGNvbnN0IGNvdW50ID0gc2VsZWN0ZWRDb250YWluZXJzLnNpemU7XG4gICAgYmF0Y2hDb3VudC50ZXh0Q29udGVudCA9IGAke2NvdW50fSBzZWxlY3RlZGA7XG4gICAgc3RhcnRCdG4uZGlzYWJsZWQgPSBjb3VudCA9PT0gMDtcbiAgICBzdG9wQnRuLmRpc2FibGVkID0gY291bnQgPT09IDA7XG4gICAgcmVzdGFydEJ0bi5kaXNhYmxlZCA9IGNvdW50ID09PSAwO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYmF0Y2hBY3Rpb24oYWN0aW9uKSB7XG4gICAgaWYgKHNlbGVjdGVkQ29udGFpbmVycy5zaXplID09PSAwKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgY29udGFpbmVycyA9IEFycmF5LmZyb20oc2VsZWN0ZWRDb250YWluZXJzKTtcbiAgICBjb25zdCBhY3Rpb25MYWJlbCA9IHsgc3RhcnQ6ICdTdGFydGluZycsIHN0b3A6ICdTdG9wcGluZycsIHJlc3RhcnQ6ICdSZXN0YXJ0aW5nJyB9W2FjdGlvbl07XG4gICAgXG4gICAgaWYgKCFjb25maXJtKGAke2FjdGlvbkxhYmVsfSAke2NvbnRhaW5lcnMubGVuZ3RofSBjb250YWluZXIocyk/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gKSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGJ0bnMgPSBbc3RhcnRCdG4sIHN0b3BCdG4sIHJlc3RhcnRCdG5dO1xuICAgIGJ0bnMuZm9yRWFjaChiID0+IHsgYi5kaXNhYmxlZCA9IHRydWU7IGIudGV4dENvbnRlbnQgPSAnLi4uJzsgfSk7XG4gICAgXG4gICAgbGV0IHN1Y2Nlc3MgPSAwO1xuICAgIGxldCBmYWlsZWQgPSAwO1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIFxuICAgIGZvciAoY29uc3QgY29udGFpbmVySWQgb2YgY29udGFpbmVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJJZCl9LyR7YWN0aW9ufWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgIHN1Y2Nlc3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgICAgICBlcnJvcnMucHVzaChgJHtjb250YWluZXJJZH06ICR7ZGF0YS5lcnJvciB8fCByZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgZXJyb3JzLnB1c2goYCR7Y29udGFpbmVySWR9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gUmVzdG9yZSBidXR0b25zXG4gICAgYnRuc1swXS50ZXh0Q29udGVudCA9ICdcdTI1QjYgU3RhcnQgQWxsJztcbiAgICBidG5zWzFdLnRleHRDb250ZW50ID0gJ1x1MkIxQiBTdG9wIEFsbCc7XG4gICAgYnRuc1syXS50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMDQgUmVzdGFydCBBbGwnO1xuICAgIHVwZGF0ZVNlbGVjdGVkQ291bnQoKTtcbiAgICBcbiAgICAvLyBTaG93IHJlc3VsdHNcbiAgICBpZiAoZmFpbGVkID09PSAwKSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHthY3Rpb25MYWJlbH0gY29tcGxldGVkOiAke3N1Y2Nlc3N9IGNvbnRhaW5lcihzKWAsICdzdWNjZXNzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2FjdGlvbkxhYmVsfTogJHtzdWNjZXNzfSBzdWNjZWVkZWQsICR7ZmFpbGVkfSBmYWlsZWRgLCAnd2FybmluZycpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcignQmF0Y2ggb3BlcmF0aW9uIGVycm9yczonLCBlcnJvcnMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBSZWZyZXNoIGRhc2hib2FyZCBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHJlZnJlc2hBbGwoKTtcbiAgICB9LCAxNTAwKTtcbiAgfVxuXG4gIGJhdGNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoYmF0Y2hNb2RlKSB7XG4gICAgICBleGl0QmF0Y2hNb2RlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyQmF0Y2hNb2RlKCk7XG4gICAgfVxuICB9KTtcblxuICBzdGFydEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBiYXRjaEFjdGlvbignc3RhcnQnKSk7XG4gIHN0b3BCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gYmF0Y2hBY3Rpb24oJ3N0b3AnKSk7XG4gIHJlc3RhcnRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gYmF0Y2hBY3Rpb24oJ3Jlc3RhcnQnKSk7XG4gIGNhbmNlbEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBleGl0QmF0Y2hNb2RlKTtcbn0pKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiQ0FLQyxTQUFTQSxFQUFRLENBQ2hCLGFBRUEsTUFBTUMsQ0FBYSxDQUNqQixhQUFjLENBQ1osS0FBSyxPQUFTLENBQUMsRUFDZixLQUFLLFVBQVksRUFDbkIsQ0FRQSxTQUFTQyxFQUFTQyxFQUFPQyxFQUFXLENBQUMsRUFBRyxDQUN0QyxNQUFNQyxFQUFhLENBQ2pCLFVBQVcsSUFBSSxLQUFLLEVBQUUsWUFBWSxFQUNsQyxRQUFBSCxFQUNBLFFBQVNDLGFBQWlCLE1BQVFBLEVBQU0sUUFBVUEsRUFDbEQsTUFBT0EsYUFBaUIsTUFBUUEsRUFBTSxNQUFRLEtBQzlDLFNBQUFDLENBQ0YsRUFHQSxLQUFLLE9BQU8sS0FBS0MsQ0FBVSxFQUd2QixLQUFLLE9BQU8sT0FBUyxLQUFLLFdBQzVCLEtBQUssT0FBTyxNQUFNLEVBSXBCLFFBQVEsTUFBTSxzQkFBc0JILENBQU8sSUFBS0MsRUFBT0MsQ0FBUSxDQUlqRSxDQVFBLGlCQUFpQkQsRUFBT0csRUFBYSxDQUduQyxPQUZrQixLQUFLLGNBQWNILENBQUssRUFFdkIsQ0FD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LFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixTQUFVLEVBQ2hkLFFBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFNBQVUsRUFDaGQsaUJBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFNBQVUsRUFDaGQsa0JBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFVBQVcsUUFBUyxFQUFLLEVBQy9kLEtBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFVBQVcsUUFBUyxFQUFLLEVBQy9kLE1BQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFNBQVUsQ0FDbGQsRUFJQSxTQUFTQyxFQUFTQyxFQUFLLENBQ3JCLE1BQUksQ0FBQ0EsR0FBTyxPQUFPQSxHQUFRLFNBQWlCLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsR0FDL0RBLEVBQU1BLEVBQUksUUFBUSxJQUFLLEVBQUUsRUFDckJBLEVBQUksU0FBVyxJQUFHQSxFQUFNQSxFQUFJLENBQUMsRUFBRUEsRUFBSSxDQUFDLEVBQUVBLEVBQUksQ0FBQyxFQUFFQSxFQUFJLENBQUMsRUFBRUEsRUFBSSxDQUFDLEVBQUVBLEVBQUksQ0FBQyxHQUM3RCxDQUNMLEVBQUcsU0FBU0EsRUFBSSxPQUFPLEVBQUcsQ0FBQyxFQUFHLEVBQUUsR0FBSyxFQUNyQyxFQUFHLFNBQVNBLEVBQUksT0FBTyxFQUFHLENBQUMsRUFBRyxFQUFFLEdBQUssRUFDckMsRUFBRyxTQUFTQSxFQUFJLE9BQU8sRUFBRyxDQUFDLEVBQUcsRUFBRSxHQUFLLENBQ3ZDLEVBQ0YsQ0FFQSxTQUFTQyxFQUFTN0UsRUFBRzhFLEVBQUdDLEVBQUcsQ0FD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QUE7QUFBQTtBQUFBO0FBQUEsU0FrRzNCLEVBRVAsWUFBWSx1QkFBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBNkI3QixFQUVQLFlBQVksb0JBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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LENBQzVDLENBSUZtbkIsRUFBSyxDQUFDLEVBQUUsWUFBYyxtQkFDdEJBLEVBQUssQ0FBQyxFQUFFLFlBQWMsa0JBQ3RCQSxFQUFLLENBQUMsRUFBRSxZQUFjLHdCQUN0QlIsRUFBb0IsRUFHaEJVLElBQVcsRUFDVCxPQUFPLGtCQUFxQixZQUM5QixpQkFBaUIsR0FBR0gsQ0FBVyxlQUFlRSxDQUFPLGdCQUFpQixTQUFTLEdBRzdFLE9BQU8sa0JBQXFCLFlBQzlCLGlCQUFpQixHQUFHRixDQUFXLEtBQUtFLENBQU8sZUFBZUMsQ0FBTSxVQUFXLFNBQVMsRUFFdEYsUUFBUSxNQUFNLDBCQUEyQkMsQ0FBTSxHQUlqRCxXQUFXLElBQU0sQ0FDWCxPQUFPLFlBQWUsWUFBWSxXQUFXLENBQ25ELEVBQUcsSUFBSSxDQUNULENBRUFuQixHQUFVLGlCQUFpQixRQUFTLElBQU0sQ0FDcENLLEVBQ0ZLLEVBQWMsRUFFZEgsRUFBZSxDQUVuQixDQUFDLEVBRURKLEdBQVUsaUJBQWlCLFFBQVMsSUFBTVMsRUFBWSxPQUFPLENBQUMsRUFDOURSLEdBQVMsaUJBQWlCLFFBQVMsSUFBTVEsRUFBWSxNQUFNLENBQUMsRUFDNUR6UCxHQUFZLGlCQUFpQixRQUFTLElBQU15UCxFQUFZLFNBQVMsQ0FBQyxFQUNsRXJJLEdBQVcsaUJBQWlCLFFBQVNtSSxDQUFhLENBQ3BELEdBQUciLAogICJuYW1lcyI6IFsid2luZG93IiwgIkVycm9ySGFuZGxlciIsICJjb250ZXh0IiwgImVycm9yIiwgIm1ldGFkYXRhIiwgImVycm9yRW50cnkiLCAiY3VycmVudFN0ZXAiLCAibWVzc2FnZSIsICJzdGF0cyIsICJ0eXBlIiwgImZhbGxiYWNrTWVzc2FnZSIsICJtZW1vcnlTdG9yYWdlIiwgImtleSIsICJ2YWx1ZSIsICJyYXciLCAicyIsICJyIiwgImMiLCAiayIsICJ2IiwgInRva2Vuc0J0biIsICJlbCIsICJ0bGRTdWZmaXgiLCAicHJveHlJcElucHV0IiwgInN1YiIsICJkbnNJZCIsICJpZCIsICJpbmZvIiwgInRvcFJvdyIsICJkbnNJZHMiLCAic3ZnSWNvbiIsICJmaXJzdENoaWxkIiwgInNhZmVJZCIsICJsYWJlbCIsICJjYXJkIiwgInJlc3BvbnNlIiwgInVybCIsICJvcHRpb25zIiwgIm1ldGhvZCIsICJuZWVkc0NzcmYiLCAidG9rZW4iLCAiYm9keSIsICJmcmVzaFRva2VuIiwgImRhdGEiLCAicmVzcCIsICJyZXN1bHQiLCAibXNnIiwgImJ0biIsICJsb2FkaW5nVGV4dCIsICJhc3luY0ZuIiwgIm9wdHMiLCAib3JpZ2luYWwiLCAic3VjY2Vzc1RleHQiLCAicmVzZXREZWxheSIsICJlIiwgIm1vZGFsIiwgImNsb3NlQnRucyIsICJ0ZXh0IiwgImR1cmF0aW9uIiwgImV4aXN0aW5nTm90aWYiLCAiY29sb3JzIiwgInRzIiwgImRpZmYiLCAiZmFsbGJhY2siLCAiaHRtbCIsICJldmVudCIsICJmbiIsICJfYSIsICJoIiwgImFwcHMiLCAiYSIsICJhcHAiLCAiaWR4IiwgImNoYW5nZXMiLCAiY3JlYXRlU2tlbGV0b25DYXJkIiwgInNob3dTa2VsZXRvbnMiLCAiY291bnQiLCAiZ3JpZCIsICJpIiwgInNrIiwgImhpZGVTa2VsZXRvbnMiLCAic2tlbGV0b25zIiwgIlRIRU1FX0tFWSIsICJVU0VSX1RIRU1FU19LRVkiLCAiTEVHQUNZX0NVU1RPTV9LRVkiLCAiQlVJTFRJTl9USEVNRVMiLCAiVEhFTUVTIiwgIlRIRU1FX1BST1BTIiwgIkJBU0VfUFJPUFMiLCAiREVSSVZFRF9QUk9QUyIsICJUSEVNRV9DT0xPUlMiLCAiaGV4VG9SZ2IiLCAiaGV4IiwgInJnYlRvSGV4IiwgImciLCAiYiIsICJ4IiwgImJsZW5kQ29sb3JzIiwgImhleDEiLCAiaGV4MiIsICJyYXRpbyIsICJjMSIsICJjMiIsICJoZXhMdW1pbmFuY2UiLCAiZGVyaXZlRXh0ZW5kZWRDb2xvcnMiLCAiYmciLCAiZmciLCAibXV0ZWQiLCAiY2FyZEJhc2UiLCAiZG90T2siLCAiZG90QmFkIiwgImlzTGlnaHQiLCAiZGVyaXZlZCIsICJnZW5lcmF0ZUJvZHlCYWNrZ3JvdW5kQ1NTIiwgInNsdWciLCAiYWNjZW50IiwgImFjY2VudFJnYiIsICJnZW5lcmF0ZUJ1dHRvbkhvdmVyQ1NTIiwgImdldFN5c3RlbVRoZW1lIiwgImNsZWFyQ3VzdG9tUHJvcGVydGllcyIsICJwcm9wIiwgInNsdWdpZnkiLCAibmFtZSIsICJjdXJyZW50U2x1ZyIsICJjYWNoZWQiLCAiYmFzZSIsICJjb3VudGVyIiwgImluamVjdFVzZXJUaGVtZVN0eWxlcyIsICJ0aGVtZXNEYXRhIiwgImV4aXN0aW5nIiwgInVzZXJUaGVtZXMiLCAic2x1Z3MiLCAiY3NzIiwgInRoZW1lIiwgImNvbG9yTWFwIiwgInAiLCAic3R5bGUiLCAic3luY1RoZW1lc0Zyb21TZXJ2ZXIiLCAic2VydmVyVGhlbWVzIiwgImN1cnJlbnQiLCAiYXBwbHlUaGVtZSIsICJtaWdyYXRlTGVnYWN5Q3VzdG9tVGhlbWUiLCAibGVnYWN5IiwgInRoZW1lRGF0YSIsICJtb2RlIiwgInQiLCAibWV0YSIsICJzYXZlZFRoZW1lIiwgIm1ldGhvZHNDYWNoZSIsICJmZXRjaE1ldGhvZHMiLCAicmVzIiwgInNob3dQcm92aWRlclNlbGVjdG9yIiwgInByb3ZpZGVycyIsICJvdmVybGF5IiwgIm9yaWdpbmFsQm9keSIsICJwcm92aWRlckJ1dHRvbnMiLCAicHJvdmlkZXIiLCAicmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UiLCAicmVzdG9yZU9yaWdpbmFsQm9keSIsICJpbnB1dCIsICJzdWJtaXQiLCAic3RhdHVzIiwgImJhY2siLCAiZW1haWwiLCAidmlhIiwgIm1hc2tlZCIsICJzaG93IiwgInNob3dUb3RwV2l0aEVtYWlsRmFsbGJhY2siLCAidG90cFByb3ZpZGVyIiwgImVtYWlsRW5hYmxlZCIsICJkaXYiLCAiaXNBbGxvd2VkUmV0dXJuVXJsIiwgInJldHVyblVybCIsICJwYXJzZWQiLCAic3VmZml4IiwgInVybFBhcmFtcyIsICJ1cGRhdGVUb3RwTG9nbyIsICJtIiwgImx1bSIsICJkYXJrIiwgImxpZ2h0IiwgInNob3dUb3RwT3ZlcmxheSIsICJmaXJzdElucHV0IiwgImhpZGVUb3RwT3ZlcmxheSIsICJidWlsZFNzb0hhbmRvZmZUYXJnZXQiLCAicmVkaXJlY3QiLCAiaXNQcml2YXRlSG9zdCIsICJyZXR1cm5QYXRoIiwgImNvbnRhaW5lciIsICJpbnB1dHMiLCAidmFsIiwgImNvZGUiLCAic3VibWl0VG90cENvZGUiLCAicGFzdGVkIiwgImlucCIsICJlcnJvckVsIiwgInRhcmdldCIsICJob3N0bmFtZSIsICJpc1NhbWVPcmlnaW4iLCAiaXNPdXJUbGQiLCAiZmV0Y2hSZWNvdmVyeUluZm8iLCAic2hvd1JlY292ZXJ5TGluayIsICJsaW5rIiwgIm9wZW5SZWNvdmVyeVBhbmVsIiwgInBhbmVsIiwgInN0YXR1c0VsIiwgImltcG9ydEVsIiwgInZlcmlmeUVsIiwgImNsb3NlUmVjb3ZlcnlQYW5lbCIsICJzdWJtaXRSZWNvdmVyeVNlY3JldCIsICJzZWNyZXQiLCAic3VibWl0UmVjb3ZlcnlDb2RlIiwgImVycm9ySGFuZGxlciIsICJjdXJyZW50U2VydmljZSIsICJhcnJTZXJ2aWNlcyIsICJxdWFsaXR5UHJvZmlsZVNlcnZpY2VzIiwgImdldFNlcnZpY2VVcmwiLCAic2VydmljZSIsICJzaG93RXJyb3IiLCAiaGlkZUVycm9yIiwgInRpdGxlIiwgImRlc2MiLCAic2VlZGhvc3RTZWN0aW9uIiwgImFwaWtleVNlY3Rpb24iLCAiYmFzaWNTZWN0aW9uIiwgInF1YWxpdHlTZWN0aW9uIiwgImlzRXh0IiwgImlzQXJyIiwgImhhc1F1YWxpdHkiLCAicXVhbFNlbGVjdCIsICJsb2FkU2VydmljZUNyZWRzIiwgImRvdCIsICJjbGVhckJ0biIsICJoYXNDcmVkcyIsICJzdmNJZCIsICJsb2FkUXVhbGl0eVByb2ZpbGVzIiwgInF1YWxTdGF0dXMiLCAic3ZjVXJsIiwgInBhcmFtcyIsICJvcHQiLCAibWF0Y2g3MjAiLCAiYXBpS2V5IiwgInNhdmVCdG4iLCAidXNlciIsICJwYXNzIiwgInF1YWxpdHlQcm9maWxlSWQiLCAicXVhbGl0eVByb2ZpbGVOYW1lIiwgInNlZWREYXRhIiwgImQiLCAibG9hZFRvdHBTZXR0aW5ncyIsICJlbmFibGVkIiwgInNlc3Npb25EdXJhdGlvbiIsICJpc1NldFVwIiwgInN0YXR1c0RvdCIsICJzdGF0dXNUZXh0IiwgInN0YXR1c0Jhbm5lciIsICJzZXR1cFNlY3Rpb24iLCAicXJTZWN0aW9uIiwgImR1cmF0aW9uU2VjdGlvbiIsICJkaXNhYmxlU2VjdGlvbiIsICJzZXR1cEJ0biIsICJ1cGRhdGVBdXRoQ2FyZCIsICJEVVJBVElPTl9MQUJFTFMiLCAidHJhbnNsYXRlZCIsICJpMThuIiwgImFjdGl2ZSIsICJwaWxsIiwgInBheWxvYWQiLCAiYmxvYiIsICJlcnIiLCAiQVBJIiwgIl9lbCIsICJ0YWciLCAiYXR0cnMiLCAiY2hpbGRyZW4iLCAibm9kZSIsICJfZmV0Y2hKU09OIiwgImNzcmYiLCAiX3JlbmRlckJhZGdlIiwgInJvbGUiLCAiX3JlbmRlclVzZXJzTGlzdCIsICJ1c2VycyIsICJvbkNoYW5nZSIsICJ0YWJsZSIsICJ0Ym9keSIsICJ1IiwgInJvdyIsICJlbWFpbENlbGwiLCAicm9sZUNlbGwiLCAiYWN0aW9uc0NlbGwiLCAicm9sZVNlbGVjdCIsICJldiIsICJkZWxCdG4iLCAiX3JlbmRlckludml0ZUZvcm0iLCAib25Jc3N1ZWQiLCAiZm9ybSIsICJmZCIsICJyb2xlU2VsIiwgIl9yZW5kZXJJbnZpdGVzTGlzdCIsICJpbnZpdGVzIiwgImludiIsICJfcmVuZGVySXNzdWVkSW52aXRlQmFubmVyIiwgImludml0ZSIsICJwYXJlbnQiLCAiYmFubmVyIiwgImNvcHlCdG4iLCAibW91bnQiLCAibWVEYXRhIiwgInJlZnJlc2hCdG4iLCAidXNlcnNIZWFkZXIiLCAidXNlcnNMaXN0IiwgInVzZXJzRGF0YSIsICJhZGRVc2VyRm9ybSIsICJpbnZpdGVGb3JtQ29udGFpbmVyIiwgImludml0ZXNMaXN0IiwgImludml0ZXNEYXRhIiwgImlzc3VlZCIsICJvcGVuIiwgImJhY2tkcm9wIiwgImNsb3NlIiwgImF0dGFjaFRyaWdnZXIiLCAiYmFyQ29udGFpbmVyIiwgIl9tYXliZVNob3ciLCAibWUiLCAiZ2V0RG5zSWRzIiwgImdldERuc0Rpc3BsYXlOYW1lIiwgImJ1aWxkQ3JlZGVudGlhbFNlY3Rpb25zIiwgImdldEVuY3J5cHRpb25LZXkiLCAib2xkS2V5IiwgImFycmF5IiwgIkVOQ1JZUFRJT05fS0VZIiwgImNyZWRlbnRpYWxFbmNyeXB0IiwgIml2IiwgIml2SGV4IiwgImtleUJ5dGVzIiwgImNoYXJDb2RlIiwgImNyZWRlbnRpYWxEZWNyeXB0IiwgImVuY3J5cHRlZFRleHQiLCAiZGVjb2RlZCIsICJnZXRDcmVkZW50aWFsIiwgInRva2VuVHlwZSIsICJjcmVkVHlwZSIsICJlbmNyeXB0ZWQiLCAic2V0Q3JlZGVudGlhbCIsICJnZXRUb2tlbiIsICJnZXRVc2VybmFtZSIsICJzZXRUb2tlbiIsICJzZXRVc2VybmFtZSIsICJ1c2VybmFtZSIsICJnZXRBbGxDcmVkZW50aWFscyIsICJjbGVhckFsbENyZWRlbnRpYWxzIiwgImdldFN0b3JlZENyZWRlbnRpYWxzIiwgInJlYWRvbmx5VG9rZW4iLCAicmVhZG9ubHlVc2VybmFtZSIsICJhZG1pblRva2VuIiwgImFkbWluVXNlcm5hbWUiLCAib2xkVG9rZW4iLCAib2xkVXNlcm5hbWUiLCAiY3JlZHMiLCAidGFyZ2V0SWQiLCAic2VydmVycyIsICJoYXNBbnlDcmVkcyIsICJlbnRyeSIsICJyb1VzZXIiLCAicm9QYXNzIiwgImFkbWluVXNlciIsICJhZG1pblBhc3MiLCAic3RhdHVzTGFiZWwiLCAidXAiLCAic2V0UXVpY2siLCAicmVzcG9uc2VUaW1lIiwgInRpbWVFbCIsICJnZXRSZXNwb25zZVRpbWVDbGFzcyIsICJ0aW1lIiwgImlzVXAiLCAiY2hlY2tTZXJ2aWNlV2l0aFRpbWluZyIsICJzdGFydFRpbWUiLCAiZW5kVGltZSIsICJyZWZyZXNoSW5GbGlnaHQiLCAicmVmcmVzaFF1ZXVlZCIsICJsb2FkU2VydmljZXMiLCAic2VydmljZVVybCIsICJzdmMiLCAiZG5zIiwgImNscyIsICJ0eHQiLCAibiIsICJidWlsZEdyaWQiLCAicm9vdCIsICJ3cmFwIiwgImltZyIsICJhcHBJZCIsICJjZG5VcmxzIiwgInVuaXF1ZVVybHMiLCAibmV4dEluZGV4IiwgIm5hbWVTcGFuIiwgInRzQmFkZ2UiLCAiY2F0SW5mbyIsICJjYXRCYWRnZSIsICJ1cGRhdGVCYWRnZSIsICJyZXNwb25zZVJvdyIsICJ0aW1lU3BhbiIsICJoZWFsdGhSb3ciLCAidXB0aW1lQ2hpcCIsICJ1cHRpbWVNaW5pQmFyIiwgInVwdGltZUZpbGwiLCAiYnRuUm93IiwgImxvZ3NCdG4iLCAidXBkYXRlQnRuIiwgImV4ZWNCdG4iLCAiY3JlZHNCdG4iLCAib3B0QnRuIiwgInNoYXJlQnRuIiwgInNldEJhZGdlIiwgInJlZnJlc2hBbGwiLCAidXBkYXRlU3RhbXAiLCAiY2hlY2tlZEF0IiwgInN0YW1wIiwgImFwcGx5QmF0Y2hSZXN1bHRzIiwgInN0YXR1c2VzIiwgInJlZnJlc2hGYWxsYmFjayIsICJ0b3BDaGVja3MiLCAidG9wUmVzdWx0cyIsICJpbnRlcm5ldFJlc3VsdCIsICJiYXRjaEVycm9yIiwgImZhbGxiYWNrRXJyb3IiLCAib3BlbkJ0biIsICJyZXN0YXJ0RG5zU2VydmljZSIsICJyZXN0YXJ0QnRuIiwgInVwZGF0ZURuc1NlcnZlciIsICJzZXJ2ZXJJcCIsICJvcmlnaW5hbFRleHQiLCAiY2hlY2tSZXN1bHQiLCAidXBkYXRlUmVzdWx0IiwgImRvd25sb2FkSW5mbyIsICJpbnN0cnVjdGlvbnNJbmZvIiwgImN1cnJlbnREbnNJZCIsICJvcGVuRG5zU2V0dGluZ3MiLCAic2VydmVyIiwgInNhdmVEbnNTZXR0aW5ncyIsICJpcCIsICJwb3J0IiwgInVwZGF0ZSIsICJjbG9zZURuc1NldHRpbmdzIiwgInJlbW92ZURuc1NlcnZlciIsICJjb25maWciLCAic2V0dGluZ3NCdG4iLCAiY3VycmVudERuc1NlcnZpY2UiLCAibG9nc0ludGVydmFsIiwgImxvZ3NQYXVzZWQiLCAiY3VycmVudENvbnRhaW5lcklkIiwgImN1cnJlbnRDb250YWluZXJOYW1lIiwgImNvbnRhaW5lckxvZ3NNb2RlIiwgImN1cnJlbnRMb2dQYXRoIiwgImN1cnJlbnRMb2dTZXJ2aWNlTmFtZSIsICJmaWxlTG9nc01vZGUiLCAibG9nRXZlbnRTb3VyY2UiLCAiaXNTdHJlYW1pbmciLCAiZmV0Y2hEbnNMb2dzIiwgImxpbmVzIiwgInNlcnZlcklQIiwgImdldFJjb2RlQ29sb3IiLCAicmNvZGUiLCAicmVuZGVyRG5zTG9nRW50cnkiLCAibG9nIiwgInJjb2RlQ29sb3IiLCAiaXNCbG9ja2VkIiwgInVwZGF0ZUxvZ3NEaXNwbGF5IiwgInVwZGF0ZUZpbGVMb2dzRGlzcGxheSIsICJ1cGRhdGVDb250YWluZXJMb2dzRGlzcGxheSIsICJsb2dzQ29udGVudCIsICJsb2dFbGVtZW50IiwgIm9wZW5Mb2dzTW9kYWwiLCAicGF1c2VCdG4iLCAic3RyZWFtQnRuIiwgImNsb3NlTG9nc01vZGFsIiwgInN0b3BMb2dTdHJlYW1pbmciLCAic3RhcnRMb2dTdHJlYW1pbmciLCAiY29udGFpbmVySWQiLCAiaXNFcnJvciIsICJsZXZlbENvbG9yIiwgImxldmVsQmFkZ2UiLCAiZmV0Y2hDb250YWluZXJMb2dzIiwgImVuZHBvaW50IiwgInJlbmRlckNvbnRhaW5lckxvZ0VudHJ5IiwgInN0cmVhbUNvbG9yIiwgInN0cmVhbUJhZGdlIiwgIm9wZW5Db250YWluZXJMb2dzTW9kYWwiLCAiY29udGFpbmVyTmFtZSIsICJmZXRjaEZpbGVMb2dzIiwgImxvZ1BhdGgiLCAicmVuZGVyRmlsZUxvZ0VudHJ5IiwgImxvZ0xldmVsIiwgIm9wZW5GaWxlTG9nc01vZGFsIiwgInNlcnZpY2VOYW1lIiwgImxvYWRFeGlzdGluZ0NBcyIsICJjYWRkeWZpbGVQYXRoIiwgInNlbGVjdCIsICJjYSIsICJvcHRpb24iLCAiZ2VuZXJhdGVDYWRkeUNvbmZpZyIsICJzdWJkb21haW4iLCAic3NsVHlwZSIsICJjYU5hbWUiLCAiZXhpc3RpbmdDYSIsICJlbmFibGVBdXRoIiwgImVuYWJsZUNvcnMiLCAiY3VzdG9tSGVhZGVycyIsICJ1cHN0cmVhbVBhdGgiLCAiaGVhbHRoQ2hlY2siLCAidGltZW91dCIsICJ0YWlsc2NhbGVPbmx5IiwgImNhZGR5Q29uZmlnIiwgImhlYWRlcnMiLCAiY3JlYXRlRG5zUmVjb3JkIiwgInR0bCIsICJkbnNUb2tlbiIsICJkb21haW4iLCAiZXJyb3JUZXh0IiwgImFkZFNlcnZpY2VUb0NvbmZpZyIsICJzZXJ2aWNlQ29uZmlnIiwgIm5ld1NlcnZpY2UiLCAiYWRkVG9DYWRkeWZpbGUiLCAiY3VycmVudEVkaXRTZXJ2aWNlIiwgIm9wZW5TZXJ2aWNlRWRpdE1vZGFsIiwgImNhdGVnb3J5U2VsZWN0IiwgImNsb3NlU2VydmljZUVkaXRNb2RhbCIsICJzYXZlU2VydmljZUNoYW5nZXMiLCAibmV3U3ViZG9tYWluIiwgIm5ld05hbWUiLCAibmV3UG9ydCIsICJuZXdJcCIsICJuZXdMb2dvIiwgIm5ld0NhdGVnb3J5IiwgIm9sZFN1YmRvbWFpbiIsICJhcHBJbmRleCIsICJmaWxlIiwgInJlYWRlciIsICJkYXRhVXJsIiwgInNob3dEZWxldGVNb2RhbCIsICJoYXNDb250YWluZXIiLCAicmVzb2x2ZSIsICJjb250YWluZXJJbmZvIiwgImhlbHAiLCAiY2FuY2VsQnRuIiwgInJlbW92ZUJ0biIsICJkZWxldGVCdG4iLCAiY2xlYW51cCIsICJoYW5kbGVDYW5jZWwiLCAiaGFuZGxlUmVtb3ZlIiwgImhhbmRsZURlbGV0ZSIsICJoYW5kbGVCYWNrZHJvcCIsICJ1cGRhdGVDb250YWluZXIiLCAic2VydmljZUlkIiwgImRlbGV0ZVNlcnZpY2UiLCAiZGVsZXRlQ29udGFpbmVyIiwgInJlc3VsdHMiLCAic2VydmljZUlQIiwgImRuc1Jlc3VsdCIsICJjYWRkeVJlc3VsdCIsICJpbmRleCIsICJjdXN0b21BcHBzIiwgImxvY2FsSW5kZXgiLCAic2VydmljZVJlc3VsdCIsICJoYXNFcnJvcnMiLCAiZXJyb3JNZXNzYWdlcyIsICJzdWNjZXNzU3RhdGVzIiwgImlzU3VjY2VzcyIsICJkZXJpdmVTdWJkb21haW4iLCAiZ2V0U21hcnRTc2xEZWZhdWx0IiwgInVwZGF0ZVNlcnZpY2VQcmV2aWV3IiwgIlFVSUNLX0lQUyIsICJkbnNQcmV2aWV3IiwgInVybFByZXZpZXciLCAiY29uZmlnUHJldmlldyIsICJkZXRlY3ROZXR3b3JrSVBzIiwgImxhbkJ0biIsICJ0c0J0biIsICJpcElucHV0IiwgImluaXRRdWlja0lQQnV0dG9ucyIsICJjdXJyZW50SVAiLCAib3BlbkFkZFNlcnZpY2VNb2RhbCIsICJtb2RhbENvbnRlbnQiLCAic3NsU2VsZWN0IiwgInRhaWxzY2FsZVN0YXR1cyIsICJ0YWlsc2NhbGVDaGVja2JveCIsICJzZXR1cFNlcnZpY2VUeXBlU3dpdGNoaW5nIiwgImxvY2FsUmFkaW8iLCAiZXh0ZXJuYWxSYWRpbyIsICJsb2NhbENvbmZpZyIsICJleHRlcm5hbENvbmZpZyIsICJ0YWJMb2NhbCIsICJ0YWJFeHRlcm5hbCIsICJzd2l0Y2hTZXJ2aWNlVHlwZSIsICJzZXR1cEF1dG9TdWJkb21haW4iLCAibmFtZUlucHV0IiwgInN1YmRvbWFpbklucHV0IiwgInN1YmRvbWFpblByZXZpZXciLCAidXNlckVkaXRlZFN1YmRvbWFpbiIsICJleHROYW1lSW5wdXQiLCAiZXh0U3ViZG9tYWluSW5wdXQiLCAiZXh0U3ViZG9tYWluUHJldmlldyIsICJleHREb21haW5QcmV2aWV3IiwgInVzZXJFZGl0ZWRFeHRTdWJkb21haW4iLCAiY3JlYXRlRXh0ZXJuYWxTZXJ2aWNlIiwgImV4dGVybmFsVXJsIiwgImxvZ28iLCAiaWNvbiIsICJjcmVhdGVEbnMiLCAiY3JlYXRlQ2FkZHkiLCAicHJveHlJcCIsICJwcmVzZXJ2ZUhvc3QiLCAiZm9sbG93UmVkaXJlY3RzIiwgImNhdGVnb3J5IiwgImRlZmF1bHRTZXJ2aWNlcyIsICJjdXN0b21TZXJ2aWNlcyIsICJjbG9zZUFkZFNlcnZpY2VNb2RhbCIsICJwYXJ0cyIsICJzdWJQcmV2IiwgImV4dFN1YlByZXYiLCAiZXh0TmFtZSIsICJleHRTdWIiLCAiZXh0VXJsIiwgImV4dExvZ28iLCAiZXh0SWNvbiIsICJsb2NhbE9wdHMiLCAiZXh0T3B0cyIsICJjcmVhdGVOZXdTZXJ2aWNlIiwgInN0YXR1c1BhcnRzIiwgImV4aXN0aW5nQ2FDb25maWciLCAiY3VzdG9tQ2FDb25maWciLCAiYnV0dG9uIiwgImRuc0NvbmZpZyIsICJlbGVtZW50IiwgImxvYWRDdXN0b21TZXJ2aWNlcyIsICJlcyIsICJyZWNvbm5lY3REZWxheSIsICJNQVhfUkVDT05ORUNUIiwgIl9zc2VGYWlsQ291bnQiLCAiX3NzZU1hbnVhbGx5Q2xvc2VkIiwgImNvbm5lY3QiLCAidXBkYXRlc0J0biIsICJjbG9zZUFuZFN0b3AiLCAicmVzdW1lQWZ0ZXJSZWF1dGgiLCAic2VhcmNoSW5wdXQiLCAic3RhdHVzU2VsZWN0IiwgImNvdW50U3BhbiIsICJnZXRDYXRlZ29yeUxpc3QiLCAic2VlbiIsICJmcm9tQ2FyZHMiLCAiY2F0IiwgImFwaUNhdHMiLCAicmVmcmVzaENhdGVnb3J5RHJvcGRvd24iLCAibGlzdCIsICJvIiwgInVwZGF0ZUZpbHRlciIsICJxdWVyeSIsICJzdGF0dXNGaWx0ZXIiLCAiY2F0ZWdvcnlGaWx0ZXIiLCAiY2FyZHMiLCAidmlzaWJsZUNvdW50IiwgInRvdGFsIiwgImRlYm91bmNlIiwgImRlbGF5IiwgImFyZ3MiLCAiYmF0Y2hCdG4iLCAiYmF0Y2hCYXIiLCAiYmF0Y2hDb3VudCIsICJzdGFydEJ0biIsICJzdG9wQnRuIiwgImJhdGNoTW9kZSIsICJzZWxlY3RlZENvbnRhaW5lcnMiLCAiZW50ZXJCYXRjaE1vZGUiLCAidXBkYXRlU2VsZWN0ZWRDb3VudCIsICJjaGVja2JveCIsICJleGl0QmF0Y2hNb2RlIiwgImNiIiwgImJhdGNoQWN0aW9uIiwgImFjdGlvbiIsICJjb250YWluZXJzIiwgImFjdGlvbkxhYmVsIiwgImJ0bnMiLCAic3VjY2VzcyIsICJmYWlsZWQiLCAiZXJyb3JzIl0KfQo= diff --git a/status/dist/init.js b/status/dist/init.js index 95daff4..6eacd0d 100644 --- a/status/dist/init.js +++ b/status/dist/init.js @@ -1,4 +1,4 @@ -(function(){function v(){const i=safeGet("custom-services");if(i)try{JSON.parse(i).forEach(e=>{window.APPS.find(a=>a.id===e.id)||window.APPS.push(e)})}catch(n){console.warn("Failed to load custom services:",n)}}v();function k(){const i=document.querySelectorAll(".top .card");i.forEach((n,e)=>{n.style.transitionDelay=`${Math.min(e*60,300)}ms`}),requestAnimationFrame(()=>{i.forEach(n=>n.classList.add("loaded"))})}function u(){if(!("serviceWorker"in navigator)||!window.isSecureContext&&location.hostname!=="localhost"&&location.hostname!=="127.0.0.1")return;const i=()=>{navigator.serviceWorker.register("/sw.js",{updateViaCache:"none"}).catch(n=>{console.warn("[init] Service worker registration failed:",n)})};document.readyState==="complete"?i():window.addEventListener("load",i,{once:!0})}let h=!1;async function f(){if(h){console.warn("[init] initializeDashboard called again, skipping duplicate");return}if(h=!0,await window.loadServices(),await y(),window.buildGrid(),k(),window.refreshAll(),setInterval(window.refreshAll,DC.POLL.DASHBOARD),typeof window.refreshCredsButtons=="function"&&window.refreshCredsButtons(),typeof window.refreshMonitoringWidgets=="function"&&window.refreshMonitoringWidgets(),typeof window._updateAuthCard=="function")try{const n=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();n.success&&window._updateAuthCard(n.config.enabled&&n.config.isSetUp,n.config.sessionDuration)}catch{}if(window.__dashcaddySiteConfigLoaded)try{await window.__dashcaddySiteConfigLoaded}catch{}if(S(),C()&&b(),window.AdminPanel&&typeof window.AdminPanel.attachTrigger=="function")try{await window.AdminPanel.attachTrigger(document.body)}catch(i){console.warn("[init] AdminPanel attachTrigger failed:",i)}}function b(){if(document.querySelector('script[src="/dist/onboarding.js"]'))return;const i=document.createElement("script");if(i.src="/dist/onboarding.js",i.defer=!0,document.head.appendChild(i),!document.querySelector('link[href="/css/driver.min.css"]')){const n=document.createElement("link");n.rel="stylesheet",n.href="/css/driver.min.css",document.head.appendChild(n)}if(!document.querySelector('link[href="/css/onboarding.css"]')){const n=document.createElement("link");n.rel="stylesheet",n.href="/css/onboarding.css",document.head.appendChild(n)}}function C(){if(typeof SITE<"u"&&SITE.onboardingCompleted)return!1;try{const i=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));return!i||!i.tourCompleted&&i.currentStep===0}catch{return!0}}function E(){const i=document.querySelectorAll(".tools-section");if(!i.length)return;let n={};try{n=JSON.parse(localStorage.getItem("toolbar-sections")||"{}")}catch{}i.forEach(e=>{const a=e.dataset.section,c=e.querySelector(".tools-section-header");c&&(n[a]&&(e.classList.add("open"),c.setAttribute("aria-expanded","true")),c.addEventListener("click",s=>{s.preventDefault();const l=e.classList.toggle("open");c.setAttribute("aria-expanded",l?"true":"false");const m={};document.querySelectorAll(".tools-section").forEach(t=>{m[t.dataset.section]=t.classList.contains("open")}),localStorage.setItem("toolbar-sections",JSON.stringify(m))}))})}E();function S(){if(document.getElementById("restart-tour-btn"))return;let i=typeof SITE<"u"&&SITE.onboardingCompleted;try{const a=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));i=i||!!(a&&a.tourCompleted)}catch{}const n=i?document.querySelector('.tools-section[data-section="admin"] .tools-section-items'):document.querySelector(".tools-primary");if(!n)return;const e=document.createElement("button");e.id="restart-tour-btn",e.textContent=i?"Help Tour":"\u{1F393} Help Tour",e.title="Restart the onboarding tour",e.onclick=()=>{if(window.DashCaddyOnboarding)window.DashCaddyOnboarding.restartTour();else{b();const a=setInterval(()=>{window.DashCaddyOnboarding&&(clearInterval(a),window.DashCaddyOnboarding.restartTour())},100);setTimeout(()=>clearInterval(a),5e3)}},n.appendChild(e)}window.initializeDashboard=f,window.loadCustomServices=v,u();async function y(){try{const i=await fetch("/api/v1/templates",{cache:"no-store"});if(!i.ok)return;const n=await i.json();n&&n.categories&&(window.DC_CATEGORIES=n.categories,typeof DC<"u"&&(DC.CATEGORIES=n.categories),q())}catch(i){console.warn("[init] Failed to load template categories:",i)}}function q(){const i=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES;i&&document.querySelectorAll('select[data-role="service-category"]').forEach(n=>{const e=n.dataset.current||"",a=n.querySelector('option[value=""]');if(n.innerHTML="",a)n.appendChild(a);else{const c=document.createElement("option");c.value="",c.textContent="\u2014 Select category \u2014",n.appendChild(c)}Object.entries(i).forEach(([c,s])=>{const l=document.createElement("option");l.value=c,l.textContent=`${s.icon||""} ${c}`.trim(),c===e&&(l.selected=!0),n.appendChild(l)})})}window.populateCategorySelects=q,window.loadTemplateCategories=y,(async()=>{try{const n=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();if(n.success&&n.config.enabled&&(await fetch("/api/v1/totp/check-session",{cache:"no-store"})).status===401){window._showTotpOverlay();return}}catch(i){console.warn("TOTP check failed, proceeding normally:",i)}f()})()})(),(function(){const v=document.createElement("style");v.textContent=` +(function(){function v(){const i=safeGet("custom-services");if(i)try{JSON.parse(i).forEach(e=>{window.APPS.find(a=>a.id===e.id)||window.APPS.push(e)})}catch(n){console.warn("Failed to load custom services:",n)}}v();function k(){const i=document.querySelectorAll(".top .card");i.forEach((n,e)=>{n.style.transitionDelay=`${Math.min(e*60,300)}ms`}),requestAnimationFrame(()=>{i.forEach(n=>n.classList.add("loaded"))})}function u(){if(!("serviceWorker"in navigator)||!window.isSecureContext&&location.hostname!=="localhost"&&location.hostname!=="127.0.0.1")return;const i=()=>{navigator.serviceWorker.register("/sw.js",{updateViaCache:"none"}).catch(n=>{console.warn("[init] Service worker registration failed:",n)})};document.readyState==="complete"?i():window.addEventListener("load",i,{once:!0})}let h=!1;async function f(){if(h){console.warn("[init] initializeDashboard called again, skipping duplicate");return}if(h=!0,await window.loadServices(),await y(),window.buildGrid(),k(),window.refreshAll(),setInterval(()=>{window._dcAuthLost||window.refreshAll()},DC.POLL.DASHBOARD),typeof window.refreshCredsButtons=="function"&&window.refreshCredsButtons(),typeof window.refreshMonitoringWidgets=="function"&&window.refreshMonitoringWidgets(),typeof window._updateAuthCard=="function")try{const n=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();n.success&&window._updateAuthCard(n.config.enabled&&n.config.isSetUp,n.config.sessionDuration)}catch{}if(window.__dashcaddySiteConfigLoaded)try{await window.__dashcaddySiteConfigLoaded}catch{}if(S(),C()&&b(),window.AdminPanel&&typeof window.AdminPanel.attachTrigger=="function")try{await window.AdminPanel.attachTrigger(document.body)}catch(i){console.warn("[init] AdminPanel attachTrigger failed:",i)}}function b(){if(document.querySelector('script[src="/dist/onboarding.js"]'))return;const i=document.createElement("script");if(i.src="/dist/onboarding.js",i.defer=!0,document.head.appendChild(i),!document.querySelector('link[href="/css/driver.min.css"]')){const n=document.createElement("link");n.rel="stylesheet",n.href="/css/driver.min.css",document.head.appendChild(n)}if(!document.querySelector('link[href="/css/onboarding.css"]')){const n=document.createElement("link");n.rel="stylesheet",n.href="/css/onboarding.css",document.head.appendChild(n)}}function C(){if(typeof SITE<"u"&&SITE.onboardingCompleted)return!1;try{const i=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));return!i||!i.tourCompleted&&i.currentStep===0}catch{return!0}}function E(){const i=document.querySelectorAll(".tools-section");if(!i.length)return;let n={};try{n=JSON.parse(localStorage.getItem("toolbar-sections")||"{}")}catch{}i.forEach(e=>{const a=e.dataset.section,c=e.querySelector(".tools-section-header");c&&(n[a]&&(e.classList.add("open"),c.setAttribute("aria-expanded","true")),c.addEventListener("click",s=>{s.preventDefault();const l=e.classList.toggle("open");c.setAttribute("aria-expanded",l?"true":"false");const m={};document.querySelectorAll(".tools-section").forEach(t=>{m[t.dataset.section]=t.classList.contains("open")}),localStorage.setItem("toolbar-sections",JSON.stringify(m))}))})}E();function S(){if(document.getElementById("restart-tour-btn"))return;let i=typeof SITE<"u"&&SITE.onboardingCompleted;try{const a=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));i=i||!!(a&&a.tourCompleted)}catch{}const n=i?document.querySelector('.tools-section[data-section="admin"] .tools-section-items'):document.querySelector(".tools-primary");if(!n)return;const e=document.createElement("button");e.id="restart-tour-btn",e.textContent=i?"Help Tour":"\u{1F393} Help Tour",e.title="Restart the onboarding tour",e.onclick=()=>{if(window.DashCaddyOnboarding)window.DashCaddyOnboarding.restartTour();else{b();const a=setInterval(()=>{window.DashCaddyOnboarding&&(clearInterval(a),window.DashCaddyOnboarding.restartTour())},100);setTimeout(()=>clearInterval(a),5e3)}},n.appendChild(e)}window.initializeDashboard=f,window.loadCustomServices=v,u();async function y(){try{const i=await fetch("/api/v1/templates",{cache:"no-store"});if(!i.ok)return;const n=await i.json();n&&n.categories&&(window.DC_CATEGORIES=n.categories,typeof DC<"u"&&(DC.CATEGORIES=n.categories),q())}catch(i){console.warn("[init] Failed to load template categories:",i)}}function q(){const i=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES;i&&document.querySelectorAll('select[data-role="service-category"]').forEach(n=>{const e=n.dataset.current||"",a=n.querySelector('option[value=""]');if(n.innerHTML="",a)n.appendChild(a);else{const c=document.createElement("option");c.value="",c.textContent="\u2014 Select category \u2014",n.appendChild(c)}Object.entries(i).forEach(([c,s])=>{const l=document.createElement("option");l.value=c,l.textContent=`${s.icon||""} ${c}`.trim(),c===e&&(l.selected=!0),n.appendChild(l)})})}window.populateCategorySelects=q,window.loadTemplateCategories=y,(async()=>{try{const n=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();if(n.success&&n.config.enabled&&(await fetch("/api/v1/totp/check-session",{cache:"no-store"})).status===401){window._showTotpOverlay();return}}catch(i){console.warn("TOTP check failed, proceeding normally:",i)}f()})()})(),(function(){const v=document.createElement("style");v.textContent=` .dc-monitor { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); @@ -329,4 +329,4 @@ ${r.status.toUpperCase()} `})),o||(o='
No results found
'),f.innerHTML=o,s()}function s(){f.querySelectorAll(".quick-search-item").forEach((o,r)=>{o.addEventListener("click",()=>m(o)),r===0&&o.classList.add("selected")})}function l(t){try{const o=f.querySelectorAll(".quick-search-item"),r=f.querySelector(".quick-search-item.selected"),p=Array.from(o).indexOf(r);if(t.key==="ArrowDown"){t.preventDefault(),r&&r.classList.remove("selected");const d=(p+1)%o.length;o[d]?.classList.add("selected"),o[d]?.scrollIntoView({block:"nearest"})}else if(t.key==="ArrowUp"){t.preventDefault(),r&&r.classList.remove("selected");const d=p<=0?o.length-1:p-1;o[d]?.classList.add("selected"),o[d]?.scrollIntoView({block:"nearest"})}else t.key==="Enter"&&(t.preventDefault(),r&&m(r))}catch(o){console.warn("[Keyboard Shortcuts] Error handling search navigation:",o.message)}}function m(t){try{const o=t.dataset.action,r=t.dataset.service;switch(y(),o){case"refresh":document.getElementById("refresh")?.click();break;case"reload-caddy":document.getElementById("reload-caddy-top")?.click();break;case"add-service":document.getElementById("add-service")?.click();break;case"app-selector":document.getElementById("add-service-btn")?.click();break;case"backup":document.getElementById("backup-restore-btn")?.click();break;case"stats":document.getElementById("container-stats-btn")?.click();break;case"logs":document.getElementById("view-error-logs")?.click();break;case"tokens":document.getElementById("manage-tokens")?.click();break;case"notifications":document.getElementById("manage-notifications")?.click();break;case"theme":document.getElementById("theme")?.click();break;case"tour":document.getElementById("restart-tour-btn")?.click();break;case"open-service":if(r){const p=document.querySelector(`[data-app="${r}"] [id$="-open"], [data-app="${r}"] button:not(.restart-btn):not(.logs-btn):not(.settings-btn)`);if(p)p.click();else{const d=document.querySelector(`[data-app="${r}"]`);d&&d.click()}}break;default:v("[Keyboard Shortcuts] Unknown action:",o)}}catch(o){console.warn("[Keyboard Shortcuts] Error executing action:",o.message)}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",b):b(),window.DashCaddyKeyboardShortcuts={openQuickSearch:S,closeQuickSearch:y}})(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gPT09PT09PT09PSBEQVNIQk9BUkQgSU5JVElBTElaQVRJT04gPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBsb2FkQ3VzdG9tU2VydmljZXMoKSB7XG4gICAgY29uc3QgY3VzdG9tU2VydmljZXMgPSBzYWZlR2V0KCdjdXN0b20tc2VydmljZXMnKTtcbiAgICBpZiAoY3VzdG9tU2VydmljZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gSlNPTi5wYXJzZShjdXN0b21TZXJ2aWNlcyk7XG4gICAgICAgIC8vIE1lcmdlIHdpdGggZGVmYXVsdCBBUFBTLCBhdm9pZGluZyBkdXBsaWNhdGVzXG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgaWYgKCF3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2UuaWQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKHNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgY3VzdG9tIHNlcnZpY2VzOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgY3VzdG9tIHNlcnZpY2VzIGltbWVkaWF0ZWx5IHNvIHdpbmRvdy5BUFBTIGlzIHBvcHVsYXRlZCBiZWZvcmUgYnVpbGRHcmlkIHJ1bnNcbiAgbG9hZEN1c3RvbVNlcnZpY2VzKCk7XG5cbiAgLy8gU3RhZ2dlcmVkIGFuaW1hdGlvbiBmb3IgdG9wIGNhcmRzIHRvb1xuICBmdW5jdGlvbiBhbmltYXRlVG9wQ2FyZHMoKSB7XG4gICAgY29uc3QgdG9wQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG9wIC5jYXJkJyk7XG4gICAgdG9wQ2FyZHMuZm9yRWFjaCgoY2FyZCwgaW5kZXgpID0+IHtcbiAgICAgIGNhcmQuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gYCR7TWF0aC5taW4oaW5kZXggKiA2MCwgMzAwKX1tc2A7XG4gICAgfSk7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRvcENhcmRzLmZvckVhY2goY2FyZCA9PiBjYXJkLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpIHtcbiAgICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkgcmV0dXJuO1xuICAgIGlmICghd2luZG93LmlzU2VjdXJlQ29udGV4dCAmJiBsb2NhdGlvbi5ob3N0bmFtZSAhPT0gJ2xvY2FsaG9zdCcgJiYgbG9jYXRpb24uaG9zdG5hbWUgIT09ICcxMjcuMC4wLjEnKSByZXR1cm47XG5cbiAgICBjb25zdCByZWdpc3RlciA9ICgpID0+IHtcbiAgICAgIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKCcvc3cuanMnLCB7IHVwZGF0ZVZpYUNhY2hlOiAnbm9uZScgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2luaXRdIFNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICByZWdpc3RlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlZ2lzdGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBkYXNoYm9hcmQgKGNhbGxlZCBhZnRlciBUT1RQIGdhdGUgY2hlY2sgb3IgZGlyZWN0bHkgaWYgVE9UUCBkaXNhYmxlZClcbiAgLy8gTk9URTogbG9hZFNlcnZpY2VzIGNvbWVzIGZyb20gd2luZG93LmxvYWRTZXJ2aWNlcyAoZXhwb3J0ZWQgYnkgZ3JpZC5qcylcbiAgbGV0IF9kYXNoYm9hcmRJbml0aWFsaXplZCA9IGZhbHNlO1xuICBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplRGFzaGJvYXJkKCkge1xuICAgIGlmIChfZGFzaGJvYXJkSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2luaXRdIGluaXRpYWxpemVEYXNoYm9hcmQgY2FsbGVkIGFnYWluLCBza2lwcGluZyBkdXBsaWNhdGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX2Rhc2hib2FyZEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBhd2FpdCB3aW5kb3cubG9hZFNlcnZpY2VzKCk7XG4gICAgYXdhaXQgbG9hZFRlbXBsYXRlQ2F0ZWdvcmllcygpO1xuICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICBhbmltYXRlVG9wQ2FyZHMoKTtcbiAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgIHNldEludGVydmFsKHdpbmRvdy5yZWZyZXNoQWxsLCBEQy5QT0xMLkRBU0hCT0FSRCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cucmVmcmVzaENyZWRzQnV0dG9ucyA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LnJlZnJlc2hDcmVkc0J1dHRvbnMoKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoTW9uaXRvcmluZ1dpZGdldHMgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5yZWZyZXNoTW9uaXRvcmluZ1dpZGdldHMoKTtcbiAgICAvLyBVcGRhdGUgYXV0aCBjYXJkIChtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gdXBkYXRlZCBieSB0aGUgYXV0by1sb2FkIElJRkUgYnV0IGVuc3VyZSBpdCdzIGNvcnJlY3QpXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuX3VwZGF0ZUF1dGhDYXJkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgIGlmIChkLnN1Y2Nlc3MpIHdpbmRvdy5fdXBkYXRlQXV0aENhcmQoZC5jb25maWcuZW5hYmxlZCAmJiBkLmNvbmZpZy5pc1NldFVwLCBkLmNvbmZpZy5zZXNzaW9uRHVyYXRpb24pO1xuICAgICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgIH1cbiAgICBpZiAod2luZG93Ll9fZGFzaGNhZGR5U2l0ZUNvbmZpZ0xvYWRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2luZG93Ll9fZGFzaGNhZGR5U2l0ZUNvbmZpZ0xvYWRlZDtcbiAgICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICB9XG4gICAgLy8gTGF6eS1sb2FkIG9uYm9hcmRpbmcgb25seSBvbmNlIHBlciBpbnN0YWxsLCBvdGhlcndpc2UganVzdCBhZGQgdGhlIHRvdXIgYnV0dG9uXG4gICAgYWRkVG91ckJ1dHRvbigpO1xuICAgIGlmIChzaG91bGRMb2FkT25ib2FyZGluZygpKSB7XG4gICAgICBsb2FkT25ib2FyZGluZygpO1xuICAgIH1cblxuICAgIC8vIERDLTA0ODogaW5qZWN0IHRoZSBcIkFkbWluXCIgdHJpZ2dlciBidXR0b24gaW50byB0aGUgdG9wIGJhci4gVGhlXG4gICAgLy8gYnV0dG9uIG9ubHkgcmVuZGVycyB3aGVuIC9tZSByZXR1cm5zIGlzQWRtaW49dHJ1ZTsgdGhlIG1vZHVsZVxuICAgIC8vIHJlLWNoZWNrcyBldmVyeSA2MHMgc28gYSBwZXJtaXNzaW9uIGRvd25ncmFkZSB0YWtlcyBlZmZlY3QuXG4gICAgaWYgKHdpbmRvdy5BZG1pblBhbmVsICYmIHR5cGVvZiB3aW5kb3cuQWRtaW5QYW5lbC5hdHRhY2hUcmlnZ2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3aW5kb3cuQWRtaW5QYW5lbC5hdHRhY2hUcmlnZ2VyKGRvY3VtZW50LmJvZHkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tpbml0XSBBZG1pblBhbmVsIGF0dGFjaFRyaWdnZXIgZmFpbGVkOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIExhenktbG9hZCBvbmJvYXJkaW5nIGJ1bmRsZSAoNTIgS0IpIFx1MjAxNCBvbmx5IGxvYWRlZCB3aGVuIG5lZWRlZFxuICBmdW5jdGlvbiBsb2FkT25ib2FyZGluZygpIHtcbiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYz1cIi9kaXN0L29uYm9hcmRpbmcuanNcIl0nKSkgcmV0dXJuOyAvLyBhbHJlYWR5IGxvYWRpbmcvbG9hZGVkXG4gICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHMuc3JjID0gJy9kaXN0L29uYm9hcmRpbmcuanMnO1xuICAgIHMuZGVmZXIgPSB0cnVlO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyk7XG4gICAgLy8gQWxzbyBsb2FkIG9uYm9hcmRpbmcgQ1NTIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj1cIi9jc3MvZHJpdmVyLm1pbi5jc3NcIl0nKSkge1xuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgbGluay5ocmVmID0gJy9jc3MvZHJpdmVyLm1pbi5jc3MnO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICB9XG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW2hyZWY9XCIvY3NzL29uYm9hcmRpbmcuY3NzXCJdJykpIHtcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgIGxpbmsuaHJlZiA9ICcvY3NzL29uYm9hcmRpbmcuY3NzJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgb25ib2FyZGluZyBzaG91bGQgYXV0by1zdGFydCAoZmlyc3QtdGltZSB1c2VyKVxuICBmdW5jdGlvbiBzaG91bGRMb2FkT25ib2FyZGluZygpIHtcbiAgICBpZiAodHlwZW9mIFNJVEUgIT09ICd1bmRlZmluZWQnICYmIFNJVEUub25ib2FyZGluZ0NvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Rhc2hjYWRkeV9vbmJvYXJkaW5nJykpO1xuICAgICAgcmV0dXJuICFkYXRhIHx8ICghZGF0YS50b3VyQ29tcGxldGVkICYmIGRhdGEuY3VycmVudFN0ZXAgPT09IDApO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBObyBkYXRhIG1lYW5zIGZpcnN0LXRpbWUgdXNlclxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IENvbGxhcHNpYmxlIHRvb2xiYXIgc2VjdGlvbnMgPT09PT1cbiAgZnVuY3Rpb24gaW5pdFRvb2xiYXJTZWN0aW9ucygpIHtcbiAgICBjb25zdCBzZWN0aW9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50b29scy1zZWN0aW9uJyk7XG4gICAgaWYgKCFzZWN0aW9ucy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIFJlc3RvcmUgc2F2ZWQgc3RhdGUgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICBsZXQgc2F2ZWQgPSB7fTtcbiAgICB0cnkgeyBzYXZlZCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Rvb2xiYXItc2VjdGlvbnMnKSB8fCAne30nKTsgfSBjYXRjaCAoXykge31cblxuICAgIHNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBzZWN0aW9uLmRhdGFzZXQuc2VjdGlvbjtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHNlY3Rpb24ucXVlcnlTZWxlY3RvcignLnRvb2xzLXNlY3Rpb24taGVhZGVyJyk7XG4gICAgICBpZiAoIWhlYWRlcikgcmV0dXJuO1xuXG4gICAgICAvLyBSZXN0b3JlIHN0YXRlIChkZWZhdWx0OiBjb2xsYXBzZWQpXG4gICAgICBpZiAoc2F2ZWRba2V5XSkge1xuICAgICAgICBzZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTtcbiAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgICB9XG5cbiAgICAgIGhlYWRlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgaXNPcGVuID0gc2VjdGlvbi5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG4gICAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4gPyAndHJ1ZScgOiAnZmFsc2UnKTtcblxuICAgICAgICAvLyBTYXZlIHN0YXRlXG4gICAgICAgIGNvbnN0IHN0YXRlID0ge307XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50b29scy1zZWN0aW9uJykuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICBzdGF0ZVtzLmRhdGFzZXQuc2VjdGlvbl0gPSBzLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpO1xuICAgICAgICB9KTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Rvb2xiYXItc2VjdGlvbnMnLCBKU09OLnN0cmluZ2lmeShzdGF0ZSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIHRvb2xiYXIgc2VjdGlvbnMgb24gRE9NIHJlYWR5XG4gIGluaXRUb29sYmFyU2VjdGlvbnMoKTtcblxuICAvLyBBZGQgcmVzdGFydCB0b3VyIGJ1dHRvbiAobG9hZHMgYnVuZGxlIG9uIGNsaWNrIGlmIG5vdCBsb2FkZWQpXG4gIC8vIFZpc2libGUgaW4gcHJpbWFyeSB0b29sYmFyIHVudGlsIHRvdXIgY29tcGxldGVkIG9uY2UsIHRoZW4gbW92ZXMgdG8gQWRtaW4gc2VjdGlvblxuICBmdW5jdGlvbiBhZGRUb3VyQnV0dG9uKCkge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdGFydC10b3VyLWJ0bicpKSByZXR1cm47XG5cbiAgICBsZXQgdG91ckRvbmUgPSB0eXBlb2YgU0lURSAhPT0gJ3VuZGVmaW5lZCcgJiYgU0lURS5vbmJvYXJkaW5nQ29tcGxldGVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5X29uYm9hcmRpbmcnKSk7XG4gICAgICB0b3VyRG9uZSA9IHRvdXJEb25lIHx8ICEhKGRhdGEgJiYgZGF0YS50b3VyQ29tcGxldGVkKTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgLy8gQmVmb3JlIGZpcnN0IGNvbXBsZXRpb246IHNob3cgaW4gcHJpbWFyeSB0b29sYmFyLiBBZnRlcjogdHVjayBpbnRvIEFkbWluIHNlY3Rpb24uXG4gICAgY29uc3QgdGFyZ2V0ID0gdG91ckRvbmVcbiAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvb2xzLXNlY3Rpb25bZGF0YS1zZWN0aW9uPVwiYWRtaW5cIl0gLnRvb2xzLXNlY3Rpb24taXRlbXMnKVxuICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9vbHMtcHJpbWFyeScpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG5cbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBidXR0b24uaWQgPSAncmVzdGFydC10b3VyLWJ0bic7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gdG91ckRvbmUgPyAnSGVscCBUb3VyJyA6ICdcdUQ4M0NcdURGOTMgSGVscCBUb3VyJztcbiAgICBidXR0b24udGl0bGUgPSAnUmVzdGFydCB0aGUgb25ib2FyZGluZyB0b3VyJztcbiAgICBidXR0b24ub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmICh3aW5kb3cuRGFzaENhZGR5T25ib2FyZGluZykge1xuICAgICAgICB3aW5kb3cuRGFzaENhZGR5T25ib2FyZGluZy5yZXN0YXJ0VG91cigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZE9uYm9hcmRpbmcoKTtcbiAgICAgICAgLy8gV2FpdCBmb3IgYnVuZGxlIHRvIGxvYWQsIHRoZW4gc3RhcnRcbiAgICAgICAgY29uc3QgY2hlY2sgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGNoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nLnJlc3RhcnRUb3VyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGNsZWFySW50ZXJ2YWwoY2hlY2spLCA1MDAwKTsgLy8gZ2l2ZSB1cCBhZnRlciA1c1xuICAgICAgfVxuICAgIH07XG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gIH1cblxuICB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCA9IGluaXRpYWxpemVEYXNoYm9hcmQ7XG4gIHdpbmRvdy5sb2FkQ3VzdG9tU2VydmljZXMgPSBsb2FkQ3VzdG9tU2VydmljZXM7XG4gIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpO1xuXG4gIC8vID09PT09IFRFTVBMQVRFIENBVEVHT1JJRVMgPT09PT1cbiAgLy8gQ2FjaGVkIHRlbXBsYXRlIGNhdGVnb3JpZXMgZnJvbSAvYXBpL3YxL3RlbXBsYXRlcyBmb3IgdXNlIGFjcm9zcyB0aGUgVUlcbiAgLy8gKHNlcnZpY2UgY3JlYXRlL2VkaXQsIGZpbHRlciBkcm9wZG93biwgY2F0ZWdvcnkgYmFkZ2VzLCBldGMuKVxuICBhc3luYyBmdW5jdGlvbiBsb2FkVGVtcGxhdGVDYXRlZ29yaWVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdGVtcGxhdGVzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGlmICghci5vaykgcmV0dXJuO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5jYXRlZ29yaWVzKSB7XG4gICAgICAgIHdpbmRvdy5EQ19DQVRFR09SSUVTID0gZGF0YS5jYXRlZ29yaWVzO1xuICAgICAgICAvLyBBbHNvIGV4cG9zZSB2aWEgZ2xvYmFscy5qcyBjb25zdGFudCBmb3IgY29udmVuaWVuY2VcbiAgICAgICAgaWYgKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcpIERDLkNBVEVHT1JJRVMgPSBkYXRhLmNhdGVnb3JpZXM7XG4gICAgICAgIC8vIFBvcHVsYXRlIGFueSBjYXRlZ29yeSA8c2VsZWN0PiB0aGF0J3MgYWxyZWFkeSBpbiB0aGUgRE9NXG4gICAgICAgIHBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbaW5pdF0gRmFpbGVkIHRvIGxvYWQgdGVtcGxhdGUgY2F0ZWdvcmllczonLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cygpIHtcbiAgICBjb25zdCBjYXRzID0gd2luZG93LkRDX0NBVEVHT1JJRVMgfHwgKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcgJiYgREMuQ0FURUdPUklFUyk7XG4gICAgaWYgKCFjYXRzKSByZXR1cm47XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc2VsZWN0W2RhdGEtcm9sZT1cInNlcnZpY2UtY2F0ZWdvcnlcIl0nKS5mb3JFYWNoKHNlbGVjdCA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gc2VsZWN0LmRhdGFzZXQuY3VycmVudCB8fCAnJztcbiAgICAgIC8vIENsZWFyIG9wdGlvbnMgYnV0IGtlZXAgdGhlIGZpcnN0IChwbGFjZWhvbGRlcilcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gc2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJ29wdGlvblt2YWx1ZT1cIlwiXScpO1xuICAgICAgc2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgICAgaWYgKHBsYWNlaG9sZGVyKSBzZWxlY3QuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgIHBoLnZhbHVlID0gJyc7XG4gICAgICAgIHBoLnRleHRDb250ZW50ID0gJ1x1MjAxNCBTZWxlY3QgY2F0ZWdvcnkgXHUyMDE0JztcbiAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKHBoKTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5lbnRyaWVzKGNhdHMpLmZvckVhY2goKFtuYW1lLCBpbmZvXSkgPT4ge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gbmFtZTtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gYCR7aW5mby5pY29uIHx8ICcnfSAke25hbWV9YC50cmltKCk7XG4gICAgICAgIGlmIChuYW1lID09PSBjdXJyZW50KSBvcHQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQWxsb3cgb3RoZXIgbW9kdWxlcyB0byByZS1ydW4gcG9wdWxhdGlvbiBhZnRlciB0aGV5IChyZSlpbmplY3Qgc2VsZWN0c1xuICB3aW5kb3cucG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMgPSBwb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cztcbiAgd2luZG93LmxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMgPSBsb2FkVGVtcGxhdGVDYXRlZ29yaWVzO1xuXG4gIC8vIFRPVFAtZ2F0ZWQgaW5pdGlhbGl6YXRpb25cbiAgKGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG90cFJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvY29uZmlnJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGNvbnN0IHRvdHBEYXRhID0gYXdhaXQgdG90cFJlcy5qc29uKCk7XG5cbiAgICAgIGlmICh0b3RwRGF0YS5zdWNjZXNzICYmIHRvdHBEYXRhLmNvbmZpZy5lbmFibGVkKSB7XG4gICAgICAgIC8vIFRPVFAgaXMgZW5hYmxlZCAtIGNoZWNrIGlmIHdlIGhhdmUgYSB2YWxpZCBzZXNzaW9uXG4gICAgICAgIGNvbnN0IHRlc3RSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL2NoZWNrLXNlc3Npb24nLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgICBpZiAodGVzdFJlcy5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgIC8vIE5lZWQgVE9UUCB2ZXJpZmljYXRpb24gLSBzaG93IG92ZXJsYXlcbiAgICAgICAgICB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgICAgIHJldHVybjsgLy8gaW5pdGlhbGl6ZURhc2hib2FyZCgpIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHN1Y2Nlc3NmdWwgdmVyaWZpY2F0aW9uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RPVFAgY2hlY2sgZmFpbGVkLCBwcm9jZWVkaW5nIG5vcm1hbGx5OicsIGUpO1xuICAgIH1cblxuICAgIC8vIFRPVFAgZGlzYWJsZWQgb3Igc2Vzc2lvbiB2YWxpZCAtIGluaXRpYWxpemUgaW1tZWRpYXRlbHlcbiAgICBpbml0aWFsaXplRGFzaGJvYXJkKCk7XG4gIH0pKCk7XG5cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IE1PTklUT1JJTkcgV0lER0VUUyA9PT09PT09PT09XG4vLyBFbWJlZHMgYSBjb21wYWN0IHN5c3RlbS1yZXNvdXJjZSArIGhlYWx0aCBzdW1tYXJ5IHBhbmVsIGRpcmVjdGx5IG9uIHRoZVxuLy8gbWFpbiBkYXNoYm9hcmQuIFJlcGxhY2VzIHRoZSBuZWVkIGZvciBhIHNlcGFyYXRlIG1vbml0b3JpbmctZGFzaGJvYXJkLmh0bWxcbi8vIHBhZ2UgXHUyMDE0IHF1aWNrIGF0LWEtZ2xhbmNlIHN0YXRzIHdoZXJlIHlvdSBhbHJlYWR5IGFyZS5cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gLS0tLS0gU3R5bGUgaW5qZWN0aW9uIChzY29wZWQgdG8gLmRjLW1vbml0b3Igc28gaXQgZG9lc24ndCBsZWFrKSAtLS0tLVxuICBjb25zdCBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGVFbC50ZXh0Q29udGVudCA9IGBcbiAgICAuZGMtbW9uaXRvciB7XG4gICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSk7XG4gICAgICBnYXA6IDEycHg7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1jYXJkIHtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcsIHJnYmEoMjU1LDI1NSwyNTUsMC4wNCkpO1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogdmFyKC0tbXV0ZWQpO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItdmFsdWUge1xuICAgICAgZm9udC1zaXplOiAxLjRyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLWZnKTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3Itc3ViIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyIHtcbiAgICAgIG1hcmdpbi10b3A6IDZweDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbXV0ZWQpIDIwJSwgdHJhbnNwYXJlbnQpO1xuICAgICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyLWZpbGwge1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgd2lkdGg6IDAlO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tb2stZmcsICMyN2FlNjApO1xuICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC4zcyBlYXNlLCBiYWNrZ3JvdW5kIDAuM3MgZWFzZTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyLWZpbGwud2FybiB7IGJhY2tncm91bmQ6ICNmMzljMTI7IH1cbiAgICAuZGMtbW9uaXRvci1iYXItZmlsbC5iYWQgIHsgYmFja2dyb3VuZDogI2U3NGMzYzsgfVxuICAgIC5kYy1tb25pdG9yLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjg1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1waWxsIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1waWxsLm9rICAgeyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgIzI3YWU2MCAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICMyN2FlNjA7IH1cbiAgICAuZGMtbW9uaXRvci1waWxsLndhcm4geyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzOWMxMiAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICNmMzljMTI7IH1cbiAgICAuZGMtbW9uaXRvci1waWxsLmJhZCAgeyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2U3NGMzYyAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICNlNzRjM2M7IH1cbiAgICAuZGMtbW9uaXRvci1yZWZyZXNoIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIG9wYWNpdHk6IDAuNztcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG5cbiAgLy8gLS0tLS0gQ29udGFpbmVyIGVsZW1lbnQgKGluc2VydGVkIGFib3ZlIHNlcnZpY2UtZmlsdGVyLWJhcikgLS0tLS1cbiAgY29uc3QgZmlsdGVyQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLWJhcicpO1xuICBpZiAoIWZpbHRlckJhcikgcmV0dXJuO1xuXG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHBhbmVsLmNsYXNzTmFtZSA9ICdkYy1tb25pdG9yJztcbiAgcGFuZWwuaWQgPSAnZGMtbW9uaXRvci1wYW5lbCc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1oZWFkZXJcIiBzdHlsZT1cImdyaWQtY29sdW1uOiAxIC8gLTE7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci10aXRsZVwiPlx1RDgzRFx1RENDQSBTeXN0ZW0gT3ZlcnZpZXc8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZGMtbW9uaXRvci1yZWZyZXNoXCIgaWQ9XCJkYy1tb25pdG9yLXJlZnJlc2gtc3RhbXBcIj5cdTIwMTQ8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5TZXJ2aWNlczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItdmFsdWVcIiBpZD1cImRjLW1vbml0b3Itc2VydmljZXNcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXN1YlwiIGlkPVwiZGMtbW9uaXRvci1zZXJ2aWNlcy1zdWJcIj5sb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5Db250YWluZXJzIFVwPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1jb250YWluZXJzXCI+XHUyMDE0PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1zdWJcIiBpZD1cImRjLW1vbml0b3ItY29udGFpbmVycy1zdWJcIj5sb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5BdmcgQ1BVPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1jcHVcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWJhclwiPjxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWJhci1maWxsXCIgaWQ9XCJkYy1tb25pdG9yLWNwdS1iYXJcIj48L2Rpdj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPkF2ZyBNZW1vcnk8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLW1lbVwiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyXCI+PGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyLWZpbGxcIiBpZD1cImRjLW1vbml0b3ItbWVtLWJhclwiPjwvZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWxhYmVsXCI+SGVhbHRoPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1oZWFsdGhcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXN1YlwiIGlkPVwiZGMtbW9uaXRvci1oZWFsdGgtc3ViXCI+XHUyMDE0PC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIC8vIEluc2VydCBBQk9WRSB0aGUgZmlsdGVyIGJhclxuICBmaWx0ZXJCYXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocGFuZWwsIGZpbHRlckJhcik7XG5cbiAgLy8gLS0tLS0gSGVscGVycyAtLS0tLVxuICBmdW5jdGlvbiBzZXRCYXIoaWQsIHBjdCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBwID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBOdW1iZXIocGN0KSB8fCAwKSk7XG4gICAgZWwuc3R5bGUud2lkdGggPSBwICsgJyUnO1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3dhcm4nLCAnYmFkJyk7XG4gICAgaWYgKHAgPj0gODUpIGVsLmNsYXNzTGlzdC5hZGQoJ2JhZCcpO1xuICAgIGVsc2UgaWYgKHAgPj0gNjUpIGVsLmNsYXNzTGlzdC5hZGQoJ3dhcm4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZtdFBjdCh2KSB7XG4gICAgaWYgKHYgPT0gbnVsbCB8fCBpc05hTih2KSkgcmV0dXJuICdcdTIwMTQnO1xuICAgIHJldHVybiAoTWF0aC5yb3VuZCh2ICogMTApIC8gMTApICsgJyUnO1xuICB9XG5cbiAgZnVuY3Rpb24gZm10Qnl0ZXMoYikge1xuICAgIGlmIChiID09IG51bGwgfHwgaXNOYU4oYikpIHJldHVybiAnXHUyMDE0JztcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQiddO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoYiA+PSAxMDI0ICYmIGkgPCB1bml0cy5sZW5ndGggLSAxKSB7IGIgLz0gMTAyNDsgaSsrOyB9XG4gICAgcmV0dXJuIGIudG9GaXhlZCgxKSArICcgJyArIHVuaXRzW2ldO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VydmljZXNDYXJkKCkge1xuICAgIGNvbnN0IHRvdGFsID0gKHdpbmRvdy5BUFBTIHx8IFtdKS5sZW5ndGg7XG4gICAgbGV0IHVwID0gMDtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2FyZHMgLmNhcmQnKS5mb3JFYWNoKGMgPT4ge1xuICAgICAgaWYgKGMuZGF0YXNldC5zdGF0dXMgPT09ICdvbicpIHVwKys7XG4gICAgfSk7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1zZXJ2aWNlcycpO1xuICAgIGNvbnN0IHN1YiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLXNlcnZpY2VzLXN1YicpO1xuICAgIGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSBgJHt1cH0gLyAke3RvdGFsfWA7XG4gICAgaWYgKHN1Yikgc3ViLnRleHRDb250ZW50ID0gdG90YWwgPT09IDAgPyAnbm8gc2VydmljZXMgeWV0JyA6IGAke3VwfSBvbmxpbmUgXHUwMEI3ICR7dG90YWwgLSB1cH0gb2ZmbGluZWA7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUhlYWx0aFN1bW1hcnkoZGF0YSkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItaGVhbHRoJyk7XG4gICAgY29uc3Qgc3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItaGVhbHRoLXN1YicpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBpZiAoIWRhdGEgfHwgZGF0YS5zdW1tYXJ5ID09IG51bGwpIHtcbiAgICAgIGVsLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICBpZiAoc3ViKSBzdWIudGV4dENvbnRlbnQgPSAnbm8gZGF0YSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHMgPSBkYXRhLnN1bW1hcnk7XG4gICAgY29uc3QgaGVhbHRoeSA9IHMuaGVhbHRoeSA/PyBzLnVwID8/IDA7XG4gICAgY29uc3QgdW5oZWFsdGh5ID0gcy51bmhlYWx0aHkgPz8gcy5kb3duID8/IDA7XG4gICAgY29uc3QgdG90YWwgPSBzLnRvdGFsID8/IChoZWFsdGh5ICsgdW5oZWFsdGh5KTtcbiAgICBlbC50ZXh0Q29udGVudCA9IGAke2hlYWx0aHl9LyR7dG90YWx9YDtcbiAgICBpZiAoc3ViKSB7XG4gICAgICBpZiAodW5oZWFsdGh5ID09PSAwKSB7XG4gICAgICAgIHN1Yi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJkYy1tb25pdG9yLXBpbGwgb2tcIj5cdTI1Q0YgYWxsIGhlYWx0aHk8L3NwYW4+JztcbiAgICAgIH0gZWxzZSBpZiAodW5oZWFsdGh5IDw9IDIpIHtcbiAgICAgICAgc3ViLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cImRjLW1vbml0b3ItcGlsbCB3YXJuXCI+XHUyNUNGICR7dW5oZWFsdGh5fSBkZWdyYWRlZDwvc3Bhbj5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3ViLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cImRjLW1vbml0b3ItcGlsbCBiYWRcIj5cdTI1Q0YgJHt1bmhlYWx0aHl9IGRvd248L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLSBEYXRhIGZldGNoZXMgLS0tLS1cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdGF0cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL21vbml0b3Jpbmcvc3RhdHMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgIHJldHVybiAoZGF0YSAmJiBkYXRhLnN0YXRzKSA/IGRhdGEuc3RhdHMgOiBudWxsO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoSGVhbHRoKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9zdGF0dXMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBhd2FpdCByLmpzb24oKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVN0YXRzKHN0YXRzKSB7XG4gICAgY29uc3QgY29udGFpbmVycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLWNvbnRhaW5lcnMnKTtcbiAgICBjb25zdCBjb250YWluZXJzU3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItY29udGFpbmVycy1zdWInKTtcbiAgICBjb25zdCBjcHVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLWNwdScpO1xuICAgIGNvbnN0IG1lbUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItbWVtJyk7XG5cbiAgICBpZiAoIXN0YXRzKSB7XG4gICAgICBpZiAoY29udGFpbmVycykgY29udGFpbmVycy50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgaWYgKG1lbUVsKSBtZW1FbC50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QudmFsdWVzKHN0YXRzKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChjb250YWluZXJzKSBjb250YWluZXJzLnRleHRDb250ZW50ID0gJzAnO1xuICAgICAgaWYgKGNvbnRhaW5lcnNTdWIpIGNvbnRhaW5lcnNTdWIudGV4dENvbnRlbnQgPSAnbm8gY29udGFpbmVycyByZXBvcnRpbmcnO1xuICAgICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9ICcwJSc7XG4gICAgICBpZiAobWVtRWwpIG1lbUVsLnRleHRDb250ZW50ID0gJzAlJztcbiAgICAgIHNldEJhcignZGMtbW9uaXRvci1jcHUtYmFyJywgMCk7XG4gICAgICBzZXRCYXIoJ2RjLW1vbml0b3ItbWVtLWJhcicsIDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjcHVTdW0gPSAwLCBtZW1TdW0gPSAwLCBtZW1CeXRlcyA9IDAsIGNwdUNvdW50ID0gMCwgbWVtQ291bnQgPSAwO1xuICAgIGVudHJpZXMuZm9yRWFjaChzID0+IHtcbiAgICAgIC8vIENQVSBtYXkgYmUgcGVyY2VudGFnZSAoMC0xMDApIG9yIGZyYWN0aW9uICgwLTEpIFx1MjAxNCBoYW5kbGUgYm90aFxuICAgICAgaWYgKHMuY3B1ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3B1ID0gTnVtYmVyKHMuY3B1KTtcbiAgICAgICAgaWYgKCFpc05hTihjcHUpKSB7XG4gICAgICAgICAgY3B1U3VtICs9IGNwdSA+IDEgPyBjcHUgOiBjcHUgKiAxMDA7XG4gICAgICAgICAgY3B1Q291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMubWVtb3J5ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbWVtID0gTnVtYmVyKHMubWVtb3J5KTtcbiAgICAgICAgaWYgKCFpc05hTihtZW0pKSB7XG4gICAgICAgICAgbWVtU3VtICs9IG1lbTtcbiAgICAgICAgICBtZW1CeXRlcyArPSBOdW1iZXIocy5tZW1vcnlVc2FnZSB8fCAwKTtcbiAgICAgICAgICBtZW1Db3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhdmdDcHUgPSBjcHVDb3VudCA/IGNwdVN1bSAvIGNwdUNvdW50IDogMDtcbiAgICBjb25zdCBhdmdNZW0gPSBtZW1Db3VudCA/IG1lbVN1bSAvIG1lbUNvdW50IDogMDtcblxuICAgIGlmIChjb250YWluZXJzKSBjb250YWluZXJzLnRleHRDb250ZW50ID0gU3RyaW5nKGVudHJpZXMubGVuZ3RoKTtcbiAgICBpZiAoY29udGFpbmVyc1N1Yikge1xuICAgICAgY29uc3QgbWVtVHh0ID0gbWVtQnl0ZXMgPyBgIFx1MDBCNyAke2ZtdEJ5dGVzKG1lbUJ5dGVzKX0gUkFNYCA6ICcnO1xuICAgICAgY29udGFpbmVyc1N1Yi50ZXh0Q29udGVudCA9IGBydW5uaW5nJHttZW1UeHR9YDtcbiAgICB9XG4gICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9IGZtdFBjdChhdmdDcHUpO1xuICAgIGlmIChtZW1FbCkgbWVtRWwudGV4dENvbnRlbnQgPSBmbXRQY3QoYXZnTWVtKTtcbiAgICBzZXRCYXIoJ2RjLW1vbml0b3ItY3B1LWJhcicsIGF2Z0NwdSk7XG4gICAgc2V0QmFyKCdkYy1tb25pdG9yLW1lbS1iYXInLCBhdmdNZW0pO1xuICB9XG5cbiAgLy8gLS0tLS0gUHVibGljIHJlZnJlc2ggZnVuY3Rpb24gLS0tLS1cbiAgbGV0IGluRmxpZ2h0ID0gZmFsc2U7XG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgaWYgKGluRmxpZ2h0KSByZXR1cm47XG4gICAgaW5GbGlnaHQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBzZXRTZXJ2aWNlc0NhcmQoKTtcbiAgICAgIGNvbnN0IFtzdGF0cywgaGVhbHRoXSA9IGF3YWl0IFByb21pc2UuYWxsKFtmZXRjaFN0YXRzKCksIGZldGNoSGVhbHRoKCldKTtcbiAgICAgIGFwcGx5U3RhdHMoc3RhdHMpO1xuICAgICAgYXBwbHlIZWFsdGhTdW1tYXJ5KGhlYWx0aCk7XG4gICAgICBjb25zdCBzdGFtcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLXJlZnJlc2gtc3RhbXAnKTtcbiAgICAgIGlmIChzdGFtcCkge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBzdGFtcC50ZXh0Q29udGVudCA9IGB1cGRhdGVkICR7bm93LnRvTG9jYWxlVGltZVN0cmluZygpfWA7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGluRmxpZ2h0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3NlIGZvciBpbml0LmpzIHRvIGNhbGwgb25jZSBhbmQgcmUtY2FsbCBhZnRlciBlYWNoIHJlZnJlc2hBbGwgY3ljbGVcbiAgd2luZG93LnJlZnJlc2hNb25pdG9yaW5nV2lkZ2V0cyA9IHJlZnJlc2g7XG5cbiAgLy8gQXV0by1yZWZyZXNoIG9uIHRoZSBTVEFUUyBpbnRlcnZhbCAoc2VwYXJhdGUgZnJvbSBmdWxsIERBU0hCT0FSRCByZWZyZXNoKVxuICBzZXRJbnRlcnZhbChyZWZyZXNoLCAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5QT0xMICYmIERDLlBPTEwuU1RBVFMpIHx8IDUwMDApO1xuXG4gIC8vIFJlZnJlc2ggb25jZSBvbiBmaXJzdCBzY3JpcHQgbG9hZCAoaW5pdC5qcyBhbHNvIGNhbGxzIHRoaXM7IGRvdWJsZS1jYWxsIGlzIGhhcm1sZXNzKVxuICBzZXRUaW1lb3V0KHJlZnJlc2gsIDIwMCk7XG5cbn0pKCk7XG47XG4vKipcbiAqIERhc2hDYWRkeSBLZXlib2FyZCBTaG9ydGN1dHMgU3lzdGVtXG4gKiBQcm92aWRlcyBnbG9iYWwga2V5Ym9hcmQgc2hvcnRjdXRzIGZvciBpbXByb3ZlZCBuYXZpZ2F0aW9uXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgZGVidWcgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmICh3aW5kb3cuREFTSENBRERZX0RFQlVHKSB7IGNvbnNvbGUubG9nKC4uLmFyZ3MpOyB9XG4gIH07XG5cbiAgLy8gQWxsIG1vZGFsIHNlbGVjdG9ycyB0aGF0IGNhbiBiZSBjbG9zZWQgd2l0aCBFc2NhcGVcbiAgY29uc3QgTU9EQUxfU0VMRUNUT1JTID0gW1xuICAgICcjYXBwLXNlbGVjdG9yLW1vZGFsJyxcbiAgICAnI2FwcC1kZXBsb3ktbW9kYWwnLFxuICAgICcjd2VhdGhlci1tb2RhbCcsXG4gICAgJyN0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyxcbiAgICAnI3NlcnZpY2UtZWRpdC1tb2RhbCcsXG4gICAgJyNub3RpZmljYXRpb25zLW1vZGFsJyxcbiAgICAnI2JhY2t1cC1tb2RhbCcsXG4gICAgJyNzdGF0cy1tb2RhbCcsXG4gICAgJyNhcnItc2V0dXAtbW9kYWwnLFxuICAgICcjYWRkLXNlcnZpY2UtbW9kYWwnLFxuICAgICcjZXJyb3ItbG9nLW1vZGFsJyxcbiAgICAnI2xvZ3MtbW9kYWwnLFxuICAgICcjZG5zLXRlbXBsYXRlLW1vZGFsJ1xuICBdO1xuXG4gIC8vIFF1aWNrIHNlYXJjaCBzdGF0ZVxuICBsZXQgcXVpY2tTZWFyY2hNb2RhbCA9IG51bGw7XG4gIGxldCBxdWlja1NlYXJjaElucHV0ID0gbnVsbDtcbiAgbGV0IHF1aWNrU2VhcmNoUmVzdWx0cyA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGtleWJvYXJkIHNob3J0Y3V0cyBzeXN0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBxdWljayBzZWFyY2ggbW9kYWxcbiAgICAgIGNyZWF0ZVF1aWNrU2VhcmNoTW9kYWwoKTtcblxuICAgICAgLy8gQWRkIGdsb2JhbCBrZXlib2FyZCBsaXN0ZW5lclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUtleURvd24pO1xuXG4gICAgICBkZWJ1ZygnW0tleWJvYXJkIFNob3J0Y3V0c10gSW5pdGlhbGl6ZWQnKTtcbiAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBQcmVzcyBDdHJsK0sgdG8gb3BlbiBxdWljayBzZWFyY2gnKTtcbiAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBQcmVzcyBFc2NhcGUgdG8gY2xvc2UgbW9kYWxzJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZTonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIHF1aWNrIHNlYXJjaCBtb2RhbFxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCgpIHtcbiAgICBxdWlja1NlYXJjaE1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcXVpY2tTZWFyY2hNb2RhbC5pZCA9ICdxdWljay1zZWFyY2gtbW9kYWwnO1xuICAgIHF1aWNrU2VhcmNoTW9kYWwuY2xhc3NOYW1lID0gJ3F1aWNrLXNlYXJjaC1tb2RhbCc7XG4gICAgcXVpY2tTZWFyY2hNb2RhbC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaWNvblwiPlx1RDgzRFx1REQwRDwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInF1aWNrLXNlYXJjaC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHNlcnZpY2VzLCBhcHBzLCBvciBhY3Rpb25zLi4uXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtc2hvcnRjdXRcIj5FU0M8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwicXVpY2stc2VhcmNoLXJlc3VsdHNcIiBjbGFzcz1cInF1aWNrLXNlYXJjaC1yZXN1bHRzXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtZm9vdGVyXCI+XG4gICAgICAgICAgPHNwYW4+PGtiZD5cdTIxOTFcdTIxOTM8L2tiZD4gTmF2aWdhdGU8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PGtiZD5FbnRlcjwva2JkPiBTZWxlY3Q8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PGtiZD5Fc2M8L2tiZD4gQ2xvc2U8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIC8vIEFkZCBzdHlsZXNcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgICAucXVpY2stc2VhcmNoLW1vZGFsIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTtcbiAgICAgICAgei1pbmRleDogMTAwMDAwO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIHBhZGRpbmctdG9wOiAxNXZoO1xuICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1tb2RhbC5zaG93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1jb250ZW50IHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlLCAjMWExYTJlKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLCAjMzMzKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICAgICAgd2lkdGg6IDkwJTtcbiAgICAgICAgbWF4LXdpZHRoOiA2MDBweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCAyNXB4IDUwcHggLTEycHggcmdiYSgwLCAwLCAwLCAwLjUpO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWlucHV0LXdyYXBwZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBwYWRkaW5nOiAxNnB4IDIwcHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICMzMzMpO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaWNvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgfVxuXG4gICAgICAjcXVpY2stc2VhcmNoLWlucHV0IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgY29sb3I6IHZhcigtLWZnLCAjZmZmKTtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgIH1cblxuICAgICAgI3F1aWNrLXNlYXJjaC1pbnB1dDo6cGxhY2Vob2xkZXIge1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLXNob3J0Y3V0IHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3ZlciwgIzJhMmE0ZSk7XG4gICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLXJlc3VsdHMge1xuICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1jYXRlZ29yeSB7XG4gICAgICAgIHBhZGRpbmc6IDhweCAyMHB4O1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtaG92ZXIsICMyYTJhNGUpO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMjBweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbTpob3ZlcixcbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS5zZWxlY3RlZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCwgIzM0OThkYik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAyNHB4O1xuICAgICAgICB3aWR0aDogMzJweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWl0ZW0tY29udGVudCB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS10aXRsZSB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1mZywgI2ZmZik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjYWFhKTtcbiAgICAgICAgbWFyZ2luLXRvcDogMnB4O1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWl0ZW0tYmFkZ2Uge1xuICAgICAgICBwYWRkaW5nOiAycHggOHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3ZlciwgIzJhMmE0ZSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzg4OCk7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtZW1wdHkge1xuICAgICAgICBwYWRkaW5nOiA0MHB4IDIwcHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjNjY2KTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1mb290ZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAyNHB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDIwcHg7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICMzMzMpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWhvdmVyLCAjMmEyYTRlKTtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWZvb3RlciBrYmQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMxYTFhMmUpO1xuICAgICAgICBwYWRkaW5nOiAycHggNnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgfVxuICAgIGA7XG5cbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHF1aWNrU2VhcmNoTW9kYWwpO1xuXG4gICAgcXVpY2tTZWFyY2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWljay1zZWFyY2gtaW5wdXQnKTtcbiAgICBxdWlja1NlYXJjaFJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2stc2VhcmNoLXJlc3VsdHMnKTtcblxuICAgIC8vIElucHV0IGhhbmRsaW5nXG4gICAgcXVpY2tTZWFyY2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGhhbmRsZVNlYXJjaElucHV0KTtcbiAgICBxdWlja1NlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVTZWFyY2hLZXlEb3duKTtcblxuICAgIC8vIENsb3NlIG9uIGJhY2tkcm9wIGNsaWNrXG4gICAgcXVpY2tTZWFyY2hNb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgPT09IHF1aWNrU2VhcmNoTW9kYWwpIHtcbiAgICAgICAgY2xvc2VRdWlja1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBnbG9iYWwga2V5ZG93biBldmVudHNcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBDdHJsK0sgb3IgQ21kK0sgdG8gb3BlbiBxdWljayBzZWFyY2hcbiAgICAgIGlmICgoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkgJiYgZS5rZXkgPT09ICdrJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9wZW5RdWlja1NlYXJjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEVzY2FwZSB0byBjbG9zZSBtb2RhbHNcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgcXVpY2sgc2VhcmNoIGlzIG9wZW5cbiAgICAgICAgaWYgKHF1aWNrU2VhcmNoTW9kYWwgJiYgcXVpY2tTZWFyY2hNb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkge1xuICAgICAgICAgIGNsb3NlUXVpY2tTZWFyY2goKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIGNsb3NlIGFueSBvdGhlciBvcGVuIG1vZGFsXG4gICAgICAgIGNsb3NlVG9wTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBFcnJvciBoYW5kbGluZyBrZXlkb3duOicsIGUyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHF1aWNrIHNlYXJjaCBtb2RhbFxuICAgKi9cbiAgZnVuY3Rpb24gb3BlblF1aWNrU2VhcmNoKCkge1xuICAgIHRyeSB7XG4gICAgICBxdWlja1NlYXJjaE1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQuZm9jdXMoKTtcbiAgICAgIHNob3dEZWZhdWx0UmVzdWx0cygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3Igb3BlbmluZyBxdWljayBzZWFyY2g6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgcXVpY2sgc2VhcmNoIG1vZGFsXG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZVF1aWNrU2VhcmNoKCkge1xuICAgIHRyeSB7XG4gICAgICBxdWlja1NlYXJjaE1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHF1aWNrU2VhcmNoUmVzdWx0cy5pbm5lckhUTUwgPSAnJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGNsb3NpbmcgcXVpY2sgc2VhcmNoOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB0b3Btb3N0IG9wZW4gbW9kYWxcbiAgICovXG4gIGZ1bmN0aW9uIGNsb3NlVG9wTW9kYWwoKSB7XG4gICAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBNT0RBTF9TRUxFQ1RPUlMpIHtcbiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBpZiAobW9kYWwgJiYgKG1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpIHx8IG1vZGFsLnN0eWxlLmRpc3BsYXkgPT09ICdmbGV4JykpIHtcbiAgICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgICBtb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgZGVmYXVsdC9zdWdnZXN0ZWQgcmVzdWx0c1xuICAgKi9cbiAgZnVuY3Rpb24gc2hvd0RlZmF1bHRSZXN1bHRzKCkge1xuICAgIGNvbnN0IGh0bWwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWNhdGVnb3J5XCI+UXVpY2sgQWN0aW9uczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJyZWZyZXNoXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPlx1RDgzRFx1REQwNDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj5SZWZyZXNoIERhc2hib2FyZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPlJlZnJlc2ggYWxsIHNlcnZpY2Ugc3RhdHVzZXM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwicmVsb2FkLWNhZGR5XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPlx1MjZBMTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj5SZWxvYWQgQ2FkZHk8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5SZWxvYWQgQ2FkZHkgY29uZmlndXJhdGlvbjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJhZGQtc2VydmljZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj5cdTI3OTU8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+QWRkIFNlcnZpY2U8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5PcGVuIHNlcnZpY2UgY29uZmlndXJhdGlvbiBtb2RhbDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJhcHAtc2VsZWN0b3JcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+XHVEODNEXHVEQ0YxPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS10aXRsZVwiPkFwcCBTZWxlY3RvcjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPkRlcGxveSBuZXcgYXBwbGljYXRpb25zPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY2F0ZWdvcnlcIj5TZXJ2aWNlczwvZGl2PlxuICAgICAgJHtnZXRTZXJ2aWNlSXRlbXMoKX1cbiAgICBgO1xuXG4gICAgcXVpY2tTZWFyY2hSZXN1bHRzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgYXR0YWNoUmVzdWx0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlcnZpY2UgaXRlbXMgZnJvbSB0aGUgZGFzaGJvYXJkXG4gICAqL1xuICBmdW5jdGlvbiBnZXRTZXJ2aWNlSXRlbXMoKSB7XG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyZFtkYXRhLWFwcF0sICNjYXJkcyAuY2FyZCcpO1xuICAgIGxldCBodG1sID0gJyc7XG5cbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQgfHwgJ1Vua25vd24nO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5kYXRhc2V0LnN0YXR1cyB8fCAndW5rbm93bic7XG4gICAgICBjb25zdCBhcHAgPSBjYXJkLmRhdGFzZXQuYXBwIHx8ICcnO1xuXG4gICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSAnLS0nKSB7XG4gICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwib3Blbi1zZXJ2aWNlXCIgZGF0YS1zZXJ2aWNlPVwiJHthcHB9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj4ke3N0YXR1cyA9PT0gJ29uJyA/ICdcdUQ4M0RcdURGRTInIDogJ1x1RDgzRFx1REQzNCd9PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHtuYW1lfTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5DbGljayB0byBvcGVuIHNlcnZpY2U8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1iYWRnZVwiPiR7c3RhdHVzLnRvVXBwZXJDYXNlKCl9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGh0bWwgfHwgJzxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtZW1wdHlcIj5ObyBzZXJ2aWNlcyBmb3VuZDwvZGl2Pic7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNlYXJjaCBpbnB1dFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlU2VhcmNoSW5wdXQoZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeSA9IGUudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgIHNob3dEZWZhdWx0UmVzdWx0cygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNlYXJjaCB0aHJvdWdoIHNlcnZpY2VzIGFuZCBhY3Rpb25zXG4gICAgICBjb25zdCByZXN1bHRzID0gc2VhcmNoQWxsKHF1ZXJ5KTtcbiAgICAgIGRpc3BsYXlTZWFyY2hSZXN1bHRzKHJlc3VsdHMpO1xuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGhhbmRsaW5nIHNlYXJjaCBpbnB1dDonLCBlMi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGFsbCBpdGVtc1xuICAgKi9cbiAgZnVuY3Rpb24gc2VhcmNoQWxsKHF1ZXJ5KSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IHtcbiAgICAgIGFjdGlvbnM6IFtdLFxuICAgICAgc2VydmljZXM6IFtdXG4gICAgfTtcblxuICAgIC8vIFNlYXJjaCBhY3Rpb25zXG4gICAgY29uc3QgYWN0aW9ucyA9IFtcbiAgICAgIHsgaWQ6ICdyZWZyZXNoJywgdGl0bGU6ICdSZWZyZXNoIERhc2hib2FyZCcsIGljb246ICdcdUQ4M0RcdUREMDQnLCBrZXl3b3JkczogJ3JlZnJlc2ggcmVsb2FkIHVwZGF0ZSBzdGF0dXMnIH0sXG4gICAgICB7IGlkOiAncmVsb2FkLWNhZGR5JywgdGl0bGU6ICdSZWxvYWQgQ2FkZHknLCBpY29uOiAnXHUyNkExJywga2V5d29yZHM6ICdyZWxvYWQgY2FkZHkgcHJveHkgY29uZmlnJyB9LFxuICAgICAgeyBpZDogJ2FkZC1zZXJ2aWNlJywgdGl0bGU6ICdBZGQgU2VydmljZScsIGljb246ICdcdTI3OTUnLCBrZXl3b3JkczogJ2FkZCBuZXcgc2VydmljZSBjcmVhdGUnIH0sXG4gICAgICB7IGlkOiAnYXBwLXNlbGVjdG9yJywgdGl0bGU6ICdBcHAgU2VsZWN0b3InLCBpY29uOiAnXHVEODNEXHVEQ0YxJywga2V5d29yZHM6ICdhcHAgZGVwbG95IGluc3RhbGwgZG9ja2VyIGNvbnRhaW5lcicgfSxcbiAgICAgIHsgaWQ6ICdiYWNrdXAnLCB0aXRsZTogJ0JhY2t1cCAmIFJlc3RvcmUnLCBpY29uOiAnXHVEODNEXHVEQ0JFJywga2V5d29yZHM6ICdiYWNrdXAgcmVzdG9yZSBleHBvcnQgaW1wb3J0JyB9LFxuICAgICAgeyBpZDogJ3N0YXRzJywgdGl0bGU6ICdDb250YWluZXIgU3RhdHMnLCBpY29uOiAnXHVEODNEXHVEQ0NBJywga2V5d29yZHM6ICdzdGF0cyByZXNvdXJjZXMgY3B1IG1lbW9yeScgfSxcbiAgICAgIHsgaWQ6ICdsb2dzJywgdGl0bGU6ICdWaWV3IExvZ3MnLCBpY29uOiAnXHVEODNEXHVEQ0NCJywga2V5d29yZHM6ICdsb2dzIGVycm9yIGRlYnVnJyB9LFxuICAgICAgeyBpZDogJ3Rva2VucycsIHRpdGxlOiAnTWFuYWdlIFRva2VucycsIGljb246ICdcdUQ4M0RcdUREMTEnLCBrZXl3b3JkczogJ3Rva2VucyBhcGkga2V5cyBjcmVkZW50aWFscycgfSxcbiAgICAgIHsgaWQ6ICdub3RpZmljYXRpb25zJywgdGl0bGU6ICdOb3RpZmljYXRpb25zJywgaWNvbjogJ1x1RDgzRFx1REQxNCcsIGtleXdvcmRzOiAnYWxlcnRzIG5vdGlmaWNhdGlvbnMgZGlzY29yZCB0ZWxlZ3JhbScgfSxcbiAgICAgIHsgaWQ6ICd0aGVtZScsIHRpdGxlOiAnQ2hhbmdlIFRoZW1lJywgaWNvbjogJ1x1RDgzQ1x1REZBOCcsIGtleXdvcmRzOiAndGhlbWUgZGFyayBsaWdodCBhcHBlYXJhbmNlJyB9LFxuICAgICAgeyBpZDogJ3RvdXInLCB0aXRsZTogJ0hlbHAgVG91cicsIGljb246ICdcdUQ4M0NcdURGOTMnLCBrZXl3b3JkczogJ2hlbHAgdG91ciBndWlkZSBvbmJvYXJkaW5nJyB9XG4gICAgXTtcblxuICAgIGFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgaWYgKGFjdGlvbi50aXRsZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCBhY3Rpb24ua2V5d29yZHMuaW5jbHVkZXMocXVlcnkpKSB7XG4gICAgICAgIHJlc3VsdHMuYWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTZWFyY2ggc2VydmljZXNcbiAgICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJkW2RhdGEtYXBwXSwgI2NhcmRzIC5jYXJkJyk7XG4gICAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5uYW1lJyk/LnRleHRDb250ZW50IHx8ICcnO1xuICAgICAgY29uc3QgYXBwID0gY2FyZC5kYXRhc2V0LmFwcCB8fCAnJztcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGNhcmQuZGF0YXNldC5zdGF0dXMgfHwgJ3Vua25vd24nO1xuXG4gICAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCBhcHAudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpIHtcbiAgICAgICAgcmVzdWx0cy5zZXJ2aWNlcy5wdXNoKHtcbiAgICAgICAgICBpZDogYXBwLFxuICAgICAgICAgIHRpdGxlOiBuYW1lLFxuICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgIGljb246IHN0YXR1cyA9PT0gJ29uJyA/ICdcdUQ4M0RcdURGRTInIDogJ1x1RDgzRFx1REQzNCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHNlYXJjaCByZXN1bHRzXG4gICAqL1xuICBmdW5jdGlvbiBkaXNwbGF5U2VhcmNoUmVzdWx0cyhyZXN1bHRzKSB7XG4gICAgbGV0IGh0bWwgPSAnJztcblxuICAgIGlmIChyZXN1bHRzLmFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1jYXRlZ29yeVwiPkFjdGlvbnM8L2Rpdj4nO1xuICAgICAgcmVzdWx0cy5hY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCIke2FjdGlvbi5pZH1cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPiR7YWN0aW9uLmljb259PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHthY3Rpb24udGl0bGV9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHRzLnNlcnZpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY2F0ZWdvcnlcIj5TZXJ2aWNlczwvZGl2Pic7XG4gICAgICByZXN1bHRzLnNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwib3Blbi1zZXJ2aWNlXCIgZGF0YS1zZXJ2aWNlPVwiJHtzZXJ2aWNlLmlkfVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+JHtzZXJ2aWNlLmljb259PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHtzZXJ2aWNlLnRpdGxlfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWJhZGdlXCI+JHtzZXJ2aWNlLnN0YXR1cy50b1VwcGVyQ2FzZSgpfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghaHRtbCkge1xuICAgICAgaHRtbCA9ICc8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWVtcHR5XCI+Tm8gcmVzdWx0cyBmb3VuZDwvZGl2Pic7XG4gICAgfVxuXG4gICAgcXVpY2tTZWFyY2hSZXN1bHRzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgYXR0YWNoUmVzdWx0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGNsaWNrIGxpc3RlbmVycyB0byByZXN1bHQgaXRlbXNcbiAgICovXG4gIGZ1bmN0aW9uIGF0dGFjaFJlc3VsdExpc3RlbmVycygpIHtcbiAgICBjb25zdCBpdGVtcyA9IHF1aWNrU2VhcmNoUmVzdWx0cy5xdWVyeVNlbGVjdG9yQWxsKCcucXVpY2stc2VhcmNoLWl0ZW0nKTtcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGV4ZWN1dGVBY3Rpb24oaXRlbSkpO1xuXG4gICAgICAvLyBTZWxlY3QgZmlyc3QgaXRlbSBieSBkZWZhdWx0XG4gICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBrZXlib2FyZCBuYXZpZ2F0aW9uIGluIHNlYXJjaFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlU2VhcmNoS2V5RG93bihlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gcXVpY2tTZWFyY2hSZXN1bHRzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1zZWFyY2gtaXRlbScpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBxdWlja1NlYXJjaFJlc3VsdHMucXVlcnlTZWxlY3RvcignLnF1aWNrLXNlYXJjaC1pdGVtLnNlbGVjdGVkJyk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gQXJyYXkuZnJvbShpdGVtcykuaW5kZXhPZihzZWxlY3RlZCk7XG5cbiAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoc2VsZWN0ZWQpIHNlbGVjdGVkLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IChzZWxlY3RlZEluZGV4ICsgMSkgJSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIGl0ZW1zW25leHRJbmRleF0/LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGl0ZW1zW25leHRJbmRleF0/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChzZWxlY3RlZCkgc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgY29uc3QgcHJldkluZGV4ID0gc2VsZWN0ZWRJbmRleCA8PSAwID8gaXRlbXMubGVuZ3RoIC0gMSA6IHNlbGVjdGVkSW5kZXggLSAxO1xuICAgICAgICBpdGVtc1twcmV2SW5kZXhdPy5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICBpdGVtc1twcmV2SW5kZXhdPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgZXhlY3V0ZUFjdGlvbihzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBFcnJvciBoYW5kbGluZyBzZWFyY2ggbmF2aWdhdGlvbjonLCBlMi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhbiBhY3Rpb24gZnJvbSBxdWljayBzZWFyY2hcbiAgICovXG4gIGZ1bmN0aW9uIGV4ZWN1dGVBY3Rpb24oaXRlbSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBpdGVtLmRhdGFzZXQuYWN0aW9uO1xuICAgICAgY29uc3Qgc2VydmljZSA9IGl0ZW0uZGF0YXNldC5zZXJ2aWNlO1xuXG4gICAgICBjbG9zZVF1aWNrU2VhcmNoKCk7XG5cbiAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3JlZnJlc2gnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JlbG9hZC1jYWRkeSc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYWRkLXNlcnZpY2UnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZScpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdhcHAtc2VsZWN0b3InOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZS1idG4nKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmFja3VwJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlc3RvcmUtYnRuJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3N0YXRzJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyLXN0YXRzLWJ0bicpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsb2dzJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1lcnJvci1sb2dzJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Rva2Vucyc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS10b2tlbnMnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbm90aWZpY2F0aW9ucyc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS1ub3RpZmljYXRpb25zJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RoZW1lJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG91cic6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3RhcnQtdG91ci1idG4nKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb3Blbi1zZXJ2aWNlJzpcbiAgICAgICAgICBpZiAoc2VydmljZSkge1xuICAgICAgICAgICAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFwcD1cIiR7c2VydmljZX1cIl0gW2lkJD1cIi1vcGVuXCJdLCBbZGF0YS1hcHA9XCIke3NlcnZpY2V9XCJdIGJ1dHRvbjpub3QoLnJlc3RhcnQtYnRuKTpub3QoLmxvZ3MtYnRuKTpub3QoLnNldHRpbmdzLWJ0bilgKTtcbiAgICAgICAgICAgIGlmIChvcGVuQnRuKSB7XG4gICAgICAgICAgICAgIG9wZW5CdG4uY2xpY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRyeSB0byBmaW5kIHRoZSBjYXJkIGFuZCBjbGljayBpdFxuICAgICAgICAgICAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwPVwiJHtzZXJ2aWNlfVwiXWApO1xuICAgICAgICAgICAgICBpZiAoY2FyZCkgY2FyZC5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBkZWJ1ZygnW0tleWJvYXJkIFNob3J0Y3V0c10gVW5rbm93biBhY3Rpb246JywgYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGV4ZWN1dGluZyBhY3Rpb246JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvLyBJbml0aWFsaXplIHdoZW4gRE9NIGlzIHJlYWR5XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdCk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdCgpO1xuICB9XG5cbiAgLy8gRXhwb3NlIHRvIGdsb2JhbCBzY29wZVxuICB3aW5kb3cuRGFzaENhZGR5S2V5Ym9hcmRTaG9ydGN1dHMgPSB7XG4gICAgb3BlblF1aWNrU2VhcmNoLFxuICAgIGNsb3NlUXVpY2tTZWFyY2hcbiAgfTtcblxufSkoKTtcbiJdLAogICJtYXBwaW5ncyI6ICJDQUNDLFVBQVksQ0FFWCxTQUFTQSxHQUFxQixDQUM1QixNQUFNQyxFQUFpQixRQUFRLGlCQUFpQixFQUNoRCxHQUFJQSxFQUNGLEdBQUksQ0FDZSxLQUFLLE1BQU1BLENBQWMsRUFFakMsUUFBUUMsR0FBVyxDQUNyQixPQUFPLEtBQUssS0FBS0MsR0FBT0EsRUFBSSxLQUFPRCxFQUFRLEVBQUUsR0FDaEQsT0FBTyxLQUFLLEtBQUtBLENBQU8sQ0FFNUIsQ0FBQyxDQUNILE9BQVNFLEVBQUcsQ0FDVixRQUFRLEtBQUssa0NBQW1DQSxDQUFDLENBQ25ELENBRUosQ0FHQUosRUFBbUIsRUFHbkIsU0FBU0ssR0FBa0IsQ0FDekIsTUFBTUMsRUFBVyxTQUFTLGlCQUFpQixZQUFZLEVBQ3ZEQSxFQUFTLFFBQVEsQ0FBQ0MsRUFBTUMsSUFBVSxDQUNoQ0QsRUFBSyxNQUFNLGdCQUFrQixHQUFHLEtBQUssSUFBSUMsRUFBUSxHQUFJLEdBQUcsQ0FBQyxJQUMzRCxDQUFDLEVBQ0Qsc0JBQXNCLElBQU0sQ0FDMUJGLEVBQVMsUUFBUUMsR0FBUUEsRUFBSyxVQUFVLElBQUksUUFBUSxDQUFDLENBQ3ZELENBQUMsQ0FDSCxDQUVBLFNBQVNFLEdBQXdCLENBRS9CLEdBREksRUFBRSxrQkFBbUIsWUFDckIsQ0FBQyxPQUFPLGlCQUFtQixTQUFTLFdBQWEsYUFBZSxTQUFTLFdBQWEsWUFBYSxPQUV2RyxNQUFNQyxFQUFXLElBQU0sQ0FDckIsVUFBVSxjQUFjLFNBQVMsU0FBVSxDQUFFLGVBQWdCLE1BQU8sQ0FBQyxFQUFFLE1BQU9DLEdBQVUsQ0FDdEYsUUFBUSxLQUFLLDZDQUE4Q0EsQ0FBSyxDQUNsRSxDQUFDLENBQ0gsRUFFSSxTQUFTLGFBQWUsV0FDMUJELEVBQVMsRUFFVCxPQUFPLGlCQUFpQixPQUFRQSxFQUFVLENBQUUsS0FBTSxFQUFLLENBQUMsQ0FFNUQsQ0FJ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QUFlLGlCQUFpQixHQUFHLE1BQU0sRUFDbEQsTUFDRixJQUFLLFNBQ0gsU0FBUyxlQUFlLGVBQWUsR0FBRyxNQUFNLEVBQ2hELE1BQ0YsSUFBSyxnQkFDSCxTQUFTLGVBQWUsc0JBQXNCLEdBQUcsTUFBTSxFQUN2RCxNQUNGLElBQUssUUFDSCxTQUFTLGVBQWUsT0FBTyxHQUFHLE1BQU0sRUFDeEMsTUFDRixJQUFLLE9BQ0gsU0FBUyxlQUFlLGtCQUFrQixHQUFHLE1BQU0sRUFDbkQsTUFDRixJQUFLLGVBQ0gsR0FBSXJILEVBQVMsQ0FDWCxNQUFNNkgsRUFBVSxTQUFTLGNBQWMsY0FBYzdILENBQU8sZ0NBQWdDQSxDQUFPLCtEQUErRCxFQUNsSyxHQUFJNkgsRUFDRkEsRUFBUSxNQUFNLE1BQ1QsQ0FFTCxNQUFNeEgsRUFBTyxTQUFTLGNBQWMsY0FBY0wsQ0FBTyxJQUFJLEVBQ3pESyxHQUFNQSxFQUFLLE1BQU0sQ0FDdkIsQ0FDRixDQUNBLE1BQ0YsUUFDRW9GLEVBQU0sdUNBQXdDNEIsQ0FBTSxDQUN4RCxDQUNGLE9BQVNuSCxFQUFHLENBQ1YsUUFBUSxLQUFLLCtDQUFnREEsRUFBRSxPQUFPLENBQ3hFLENBQ0YsQ0FHSSxTQUFTLGFBQWUsVUFDMUIsU0FBUyxpQkFBaUIsbUJBQW9CNkYsQ0FBSSxFQUVsREEsRUFBSyxFQUlQLE9BQU8sMkJBQTZCLENBQ2xDLGdCQUFBTyxFQUNBLGlCQUFBRCxDQUNGLENBRUYsR0FBRyIsCiAgIm5hbWVzIjogWyJsb2FkQ3VzdG9tU2VydmljZXMiLCAiY3VzdG9tU2VydmljZXMiLCAic2VydmljZSIsICJhcHAiLCAiZSIsICJhbmltYXRlVG9wQ2FyZHMiLCAidG9wQ2FyZHMiLCAiY2FyZCIsICJpbmRleCIsICJyZWdpc3RlclNlcnZpY2VXb3JrZXIiLCAicmVnaXN0ZXIiLCAiZXJyb3IiLCAiX2Rhc2hib2FyZEluaXRpYWxpemVkIiwgImluaXRpYWxpemVEYXNoYm9hcmQiLCAibG9hZFRlbXBsYXRlQ2F0ZWdvcmllcyIsICJkIiwgImFkZFRvdXJCdXR0b24iLCAic2hvdWxkTG9hZE9uYm9hcmRpbmciLCAibG9hZE9uYm9hcmRpbmciLCAicyIsICJsaW5rIiwgImRhdGEiLCAiaW5pdFRvb2xiYXJTZWN0aW9ucyIsICJzZWN0aW9ucyIsICJzYXZlZCIsICJzZWN0aW9uIiwgImtleSIsICJoZWFkZXIiLCAiaXNPcGVuIiwgInN0YXRlIiwgInRvdXJEb25lIiwgInRhcmdldCIsICJidXR0b24iLCAiY2hlY2siLCAiciIsICJwb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cyIsICJjYXRzIiwgInNlbGVjdCIsICJjdXJyZW50IiwgInBsYWNlaG9sZGVyIiwgInBoIiwgIm5hbWUiLCAiaW5mbyIsICJvcHQiLCAidG90cERhdGEiLCAic3R5bGVFbCIsICJmaWx0ZXJCYXIiLCAicGFuZWwiLCAic2V0QmFyIiwgImlkIiwgInBjdCIsICJlbCIsICJwIiwgImZtdFBjdCIsICJ2IiwgImZtdEJ5dGVzIiwgImIiLCAidW5pdHMiLCAiaSIsICJzZXRTZXJ2aWNlc0NhcmQiLCAidG90YWwiLCAidXAiLCAiYyIsICJzdWIiLCAiYXBwbHlIZWFsdGhTdW1tYXJ5IiwgImhlYWx0aHkiLCAidW5oZWFsdGh5IiwgImZldGNoU3RhdHMiLCAiZmV0Y2hIZWFsdGgiLCAiYXBwbHlTdGF0cyIsICJzdGF0cyIsICJjb250YWluZXJzIiwgImNvbnRhaW5lcnNTdWIiLCAiY3B1RWwiLCAibWVtRWwiLCAiZW50cmllcyIsICJjcHVTdW0iLCAibWVtU3VtIiwgIm1lbUJ5dGVzIiwgImNwdUNvdW50IiwgIm1lbUNvdW50IiwgImNwdSIsICJtZW0iLCAiYXZnQ3B1IiwgImF2Z01lbSIsICJtZW1UeHQiLCAiaW5GbGlnaHQiLCAicmVmcmVzaCIsICJoZWFsdGgiLCAic3RhbXAiLCAibm93IiwgImRlYnVnIiwgImFyZ3MiLCAiTU9EQUxfU0VMRUNUT1JTIiwgInF1aWNrU2VhcmNoTW9kYWwiLCAicXVpY2tTZWFyY2hJbnB1dCIsICJxdWlja1NlYXJjaFJlc3VsdHMiLCAiaW5pdCIsICJjcmVhdGVRdWlja1NlYXJjaE1vZGFsIiwgImhhbmRsZUtleURvd24iLCAic3R5bGUiLCAiaGFuZGxlU2VhcmNoSW5wdXQiLCAiaGFuZGxlU2VhcmNoS2V5RG93biIsICJjbG9zZVF1aWNrU2VhcmNoIiwgIm9wZW5RdWlja1NlYXJjaCIsICJjbG9zZVRvcE1vZGFsIiwgImUyIiwgInNob3dEZWZhdWx0UmVzdWx0cyIsICJzZWxlY3RvciIsICJtb2RhbCIsICJodG1sIiwgImdldFNlcnZpY2VJdGVtcyIsICJhdHRhY2hSZXN1bHRMaXN0ZW5lcnMiLCAiY2FyZHMiLCAic3RhdHVzIiwgInF1ZXJ5IiwgInJlc3VsdHMiLCAic2VhcmNoQWxsIiwgImRpc3BsYXlTZWFyY2hSZXN1bHRzIiwgImFjdGlvbiIsICJpdGVtIiwgImV4ZWN1dGVBY3Rpb24iLCAiaXRlbXMiLCAic2VsZWN0ZWQiLCAic2VsZWN0ZWRJbmRleCIsICJuZXh0SW5kZXgiLCAicHJldkluZGV4IiwgIm9wZW5CdG4iXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gPT09PT09PT09PSBEQVNIQk9BUkQgSU5JVElBTElaQVRJT04gPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBsb2FkQ3VzdG9tU2VydmljZXMoKSB7XG4gICAgY29uc3QgY3VzdG9tU2VydmljZXMgPSBzYWZlR2V0KCdjdXN0b20tc2VydmljZXMnKTtcbiAgICBpZiAoY3VzdG9tU2VydmljZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gSlNPTi5wYXJzZShjdXN0b21TZXJ2aWNlcyk7XG4gICAgICAgIC8vIE1lcmdlIHdpdGggZGVmYXVsdCBBUFBTLCBhdm9pZGluZyBkdXBsaWNhdGVzXG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgaWYgKCF3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2UuaWQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKHNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgY3VzdG9tIHNlcnZpY2VzOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgY3VzdG9tIHNlcnZpY2VzIGltbWVkaWF0ZWx5IHNvIHdpbmRvdy5BUFBTIGlzIHBvcHVsYXRlZCBiZWZvcmUgYnVpbGRHcmlkIHJ1bnNcbiAgbG9hZEN1c3RvbVNlcnZpY2VzKCk7XG5cbiAgLy8gU3RhZ2dlcmVkIGFuaW1hdGlvbiBmb3IgdG9wIGNhcmRzIHRvb1xuICBmdW5jdGlvbiBhbmltYXRlVG9wQ2FyZHMoKSB7XG4gICAgY29uc3QgdG9wQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG9wIC5jYXJkJyk7XG4gICAgdG9wQ2FyZHMuZm9yRWFjaCgoY2FyZCwgaW5kZXgpID0+IHtcbiAgICAgIGNhcmQuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gYCR7TWF0aC5taW4oaW5kZXggKiA2MCwgMzAwKX1tc2A7XG4gICAgfSk7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRvcENhcmRzLmZvckVhY2goY2FyZCA9PiBjYXJkLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpIHtcbiAgICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkgcmV0dXJuO1xuICAgIGlmICghd2luZG93LmlzU2VjdXJlQ29udGV4dCAmJiBsb2NhdGlvbi5ob3N0bmFtZSAhPT0gJ2xvY2FsaG9zdCcgJiYgbG9jYXRpb24uaG9zdG5hbWUgIT09ICcxMjcuMC4wLjEnKSByZXR1cm47XG5cbiAgICBjb25zdCByZWdpc3RlciA9ICgpID0+IHtcbiAgICAgIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKCcvc3cuanMnLCB7IHVwZGF0ZVZpYUNhY2hlOiAnbm9uZScgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2luaXRdIFNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICByZWdpc3RlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlZ2lzdGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBkYXNoYm9hcmQgKGNhbGxlZCBhZnRlciBUT1RQIGdhdGUgY2hlY2sgb3IgZGlyZWN0bHkgaWYgVE9UUCBkaXNhYmxlZClcbiAgLy8gTk9URTogbG9hZFNlcnZpY2VzIGNvbWVzIGZyb20gd2luZG93LmxvYWRTZXJ2aWNlcyAoZXhwb3J0ZWQgYnkgZ3JpZC5qcylcbiAgbGV0IF9kYXNoYm9hcmRJbml0aWFsaXplZCA9IGZhbHNlO1xuICBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplRGFzaGJvYXJkKCkge1xuICAgIGlmIChfZGFzaGJvYXJkSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2luaXRdIGluaXRpYWxpemVEYXNoYm9hcmQgY2FsbGVkIGFnYWluLCBza2lwcGluZyBkdXBsaWNhdGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX2Rhc2hib2FyZEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBhd2FpdCB3aW5kb3cubG9hZFNlcnZpY2VzKCk7XG4gICAgYXdhaXQgbG9hZFRlbXBsYXRlQ2F0ZWdvcmllcygpO1xuICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICBhbmltYXRlVG9wQ2FyZHMoKTtcbiAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIC8vIFN0b3AgcG9sbGluZyBpZiB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBpbnZhbGlkYXRlZCAoZS5nLiBUT1RQIGdhdGVcbiAgICAgIC8vIG5vdyBhY3RpdmUsIG9yIHVzZXIgbG9nZ2VkIG91dCkuIEF2b2lkcyByZWxlbnRsZXNzIDQwMS80MDMgbm9pc2UuXG4gICAgICBpZiAod2luZG93Ll9kY0F1dGhMb3N0KSByZXR1cm47XG4gICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgIH0sIERDLlBPTEwuREFTSEJPQVJEKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoQ3JlZHNCdXR0b25zID09PSAnZnVuY3Rpb24nKSB3aW5kb3cucmVmcmVzaENyZWRzQnV0dG9ucygpO1xuICAgIGlmICh0eXBlb2Ygd2luZG93LnJlZnJlc2hNb25pdG9yaW5nV2lkZ2V0cyA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LnJlZnJlc2hNb25pdG9yaW5nV2lkZ2V0cygpO1xuICAgIC8vIFVwZGF0ZSBhdXRoIGNhcmQgKG1heSBoYXZlIGFscmVhZHkgYmVlbiB1cGRhdGVkIGJ5IHRoZSBhdXRvLWxvYWQgSUlGRSBidXQgZW5zdXJlIGl0J3MgY29ycmVjdClcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5fdXBkYXRlQXV0aENhcmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL2NvbmZpZycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgaWYgKGQuc3VjY2Vzcykgd2luZG93Ll91cGRhdGVBdXRoQ2FyZChkLmNvbmZpZy5lbmFibGVkICYmIGQuY29uZmlnLmlzU2V0VXAsIGQuY29uZmlnLnNlc3Npb25EdXJhdGlvbik7XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgfVxuICAgIGlmICh3aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgKi8gfVxuICAgIH1cbiAgICAvLyBMYXp5LWxvYWQgb25ib2FyZGluZyBvbmx5IG9uY2UgcGVyIGluc3RhbGwsIG90aGVyd2lzZSBqdXN0IGFkZCB0aGUgdG91ciBidXR0b25cbiAgICBhZGRUb3VyQnV0dG9uKCk7XG4gICAgaWYgKHNob3VsZExvYWRPbmJvYXJkaW5nKCkpIHtcbiAgICAgIGxvYWRPbmJvYXJkaW5nKCk7XG4gICAgfVxuXG4gICAgLy8gREMtMDQ4OiBpbmplY3QgdGhlIFwiQWRtaW5cIiB0cmlnZ2VyIGJ1dHRvbiBpbnRvIHRoZSB0b3AgYmFyLiBUaGVcbiAgICAvLyBidXR0b24gb25seSByZW5kZXJzIHdoZW4gL21lIHJldHVybnMgaXNBZG1pbj10cnVlOyB0aGUgbW9kdWxlXG4gICAgLy8gcmUtY2hlY2tzIGV2ZXJ5IDYwcyBzbyBhIHBlcm1pc3Npb24gZG93bmdyYWRlIHRha2VzIGVmZmVjdC5cbiAgICBpZiAod2luZG93LkFkbWluUGFuZWwgJiYgdHlwZW9mIHdpbmRvdy5BZG1pblBhbmVsLmF0dGFjaFRyaWdnZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdpbmRvdy5BZG1pblBhbmVsLmF0dGFjaFRyaWdnZXIoZG9jdW1lbnQuYm9keSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2luaXRdIEFkbWluUGFuZWwgYXR0YWNoVHJpZ2dlciBmYWlsZWQ6JywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTGF6eS1sb2FkIG9uYm9hcmRpbmcgYnVuZGxlICg1MiBLQikgXHUyMDE0IG9ubHkgbG9hZGVkIHdoZW4gbmVlZGVkXG4gIGZ1bmN0aW9uIGxvYWRPbmJvYXJkaW5nKCkge1xuICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjPVwiL2Rpc3Qvb25ib2FyZGluZy5qc1wiXScpKSByZXR1cm47IC8vIGFscmVhZHkgbG9hZGluZy9sb2FkZWRcbiAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgcy5zcmMgPSAnL2Rpc3Qvb25ib2FyZGluZy5qcyc7XG4gICAgcy5kZWZlciA9IHRydWU7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgICAvLyBBbHNvIGxvYWQgb25ib2FyZGluZyBDU1MgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tocmVmPVwiL2Nzcy9kcml2ZXIubWluLmNzc1wiXScpKSB7XG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICBsaW5rLmhyZWYgPSAnL2Nzcy9kcml2ZXIubWluLmNzcyc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgIH1cbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj1cIi9jc3Mvb25ib2FyZGluZy5jc3NcIl0nKSkge1xuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgbGluay5ocmVmID0gJy9jc3Mvb25ib2FyZGluZy5jc3MnO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiBvbmJvYXJkaW5nIHNob3VsZCBhdXRvLXN0YXJ0IChmaXJzdC10aW1lIHVzZXIpXG4gIGZ1bmN0aW9uIHNob3VsZExvYWRPbmJvYXJkaW5nKCkge1xuICAgIGlmICh0eXBlb2YgU0lURSAhPT0gJ3VuZGVmaW5lZCcgJiYgU0lURS5vbmJvYXJkaW5nQ29tcGxldGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5X29uYm9hcmRpbmcnKSk7XG4gICAgICByZXR1cm4gIWRhdGEgfHwgKCFkYXRhLnRvdXJDb21wbGV0ZWQgJiYgZGF0YS5jdXJyZW50U3RlcCA9PT0gMCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIHRydWU7IC8vIE5vIGRhdGEgbWVhbnMgZmlyc3QtdGltZSB1c2VyXG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gQ29sbGFwc2libGUgdG9vbGJhciBzZWN0aW9ucyA9PT09PVxuICBmdW5jdGlvbiBpbml0VG9vbGJhclNlY3Rpb25zKCkge1xuICAgIGNvbnN0IHNlY3Rpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRvb2xzLXNlY3Rpb24nKTtcbiAgICBpZiAoIXNlY3Rpb25zLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgLy8gUmVzdG9yZSBzYXZlZCBzdGF0ZSBmcm9tIGxvY2FsU3RvcmFnZVxuICAgIGxldCBzYXZlZCA9IHt9O1xuICAgIHRyeSB7IHNhdmVkID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9vbGJhci1zZWN0aW9ucycpIHx8ICd7fScpOyB9IGNhdGNoIChfKSB7fVxuXG4gICAgc2VjdGlvbnMuZm9yRWFjaChzZWN0aW9uID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHNlY3Rpb24uZGF0YXNldC5zZWN0aW9uO1xuICAgICAgY29uc3QgaGVhZGVyID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yKCcudG9vbHMtc2VjdGlvbi1oZWFkZXInKTtcbiAgICAgIGlmICghaGVhZGVyKSByZXR1cm47XG5cbiAgICAgIC8vIFJlc3RvcmUgc3RhdGUgKGRlZmF1bHQ6IGNvbGxhcHNlZClcbiAgICAgIGlmIChzYXZlZFtrZXldKSB7XG4gICAgICAgIHNlY3Rpb24uY2xhc3NMaXN0LmFkZCgnb3BlbicpO1xuICAgICAgICBoZWFkZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICAgIH1cblxuICAgICAgaGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBpc09wZW4gPSBzZWN0aW9uLmNsYXNzTGlzdC50b2dnbGUoJ29wZW4nKTtcbiAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGlzT3BlbiA/ICd0cnVlJyA6ICdmYWxzZScpO1xuXG4gICAgICAgIC8vIFNhdmUgc3RhdGVcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7fTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRvb2xzLXNlY3Rpb24nKS5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgIHN0YXRlW3MuZGF0YXNldC5zZWN0aW9uXSA9IHMuY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9vbGJhci1zZWN0aW9ucycsIEpTT04uc3RyaW5naWZ5KHN0YXRlKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgdG9vbGJhciBzZWN0aW9ucyBvbiBET00gcmVhZHlcbiAgaW5pdFRvb2xiYXJTZWN0aW9ucygpO1xuXG4gIC8vIEFkZCByZXN0YXJ0IHRvdXIgYnV0dG9uIChsb2FkcyBidW5kbGUgb24gY2xpY2sgaWYgbm90IGxvYWRlZClcbiAgLy8gVmlzaWJsZSBpbiBwcmltYXJ5IHRvb2xiYXIgdW50aWwgdG91ciBjb21wbGV0ZWQgb25jZSwgdGhlbiBtb3ZlcyB0byBBZG1pbiBzZWN0aW9uXG4gIGZ1bmN0aW9uIGFkZFRvdXJCdXR0b24oKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN0YXJ0LXRvdXItYnRuJykpIHJldHVybjtcblxuICAgIGxldCB0b3VyRG9uZSA9IHR5cGVvZiBTSVRFICE9PSAndW5kZWZpbmVkJyAmJiBTSVRFLm9uYm9hcmRpbmdDb21wbGV0ZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXNoY2FkZHlfb25ib2FyZGluZycpKTtcbiAgICAgIHRvdXJEb25lID0gdG91ckRvbmUgfHwgISEoZGF0YSAmJiBkYXRhLnRvdXJDb21wbGV0ZWQpO1xuICAgIH0gY2F0Y2ggKF8pIHt9XG5cbiAgICAvLyBCZWZvcmUgZmlyc3QgY29tcGxldGlvbjogc2hvdyBpbiBwcmltYXJ5IHRvb2xiYXIuIEFmdGVyOiB0dWNrIGludG8gQWRtaW4gc2VjdGlvbi5cbiAgICBjb25zdCB0YXJnZXQgPSB0b3VyRG9uZVxuICAgICAgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9vbHMtc2VjdGlvbltkYXRhLXNlY3Rpb249XCJhZG1pblwiXSAudG9vbHMtc2VjdGlvbi1pdGVtcycpXG4gICAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b29scy1wcmltYXJ5Jyk7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ1dHRvbi5pZCA9ICdyZXN0YXJ0LXRvdXItYnRuJztcbiAgICBidXR0b24udGV4dENvbnRlbnQgPSB0b3VyRG9uZSA/ICdIZWxwIFRvdXInIDogJ1x1RDgzQ1x1REY5MyBIZWxwIFRvdXInO1xuICAgIGJ1dHRvbi50aXRsZSA9ICdSZXN0YXJ0IHRoZSBvbmJvYXJkaW5nIHRvdXInO1xuICAgIGJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nKSB7XG4gICAgICAgIHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nLnJlc3RhcnRUb3VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkT25ib2FyZGluZygpO1xuICAgICAgICAvLyBXYWl0IGZvciBidW5kbGUgdG8gbG9hZCwgdGhlbiBzdGFydFxuICAgICAgICBjb25zdCBjaGVjayA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBpZiAod2luZG93LkRhc2hDYWRkeU9uYm9hcmRpbmcpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY2hlY2spO1xuICAgICAgICAgICAgd2luZG93LkRhc2hDYWRkeU9uYm9hcmRpbmcucmVzdGFydFRvdXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2xlYXJJbnRlcnZhbChjaGVjayksIDUwMDApOyAvLyBnaXZlIHVwIGFmdGVyIDVzXG4gICAgICB9XG4gICAgfTtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgfVxuXG4gIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkID0gaW5pdGlhbGl6ZURhc2hib2FyZDtcbiAgd2luZG93LmxvYWRDdXN0b21TZXJ2aWNlcyA9IGxvYWRDdXN0b21TZXJ2aWNlcztcbiAgcmVnaXN0ZXJTZXJ2aWNlV29ya2VyKCk7XG5cbiAgLy8gPT09PT0gVEVNUExBVEUgQ0FURUdPUklFUyA9PT09PVxuICAvLyBDYWNoZWQgdGVtcGxhdGUgY2F0ZWdvcmllcyBmcm9tIC9hcGkvdjEvdGVtcGxhdGVzIGZvciB1c2UgYWNyb3NzIHRoZSBVSVxuICAvLyAoc2VydmljZSBjcmVhdGUvZWRpdCwgZmlsdGVyIGRyb3Bkb3duLCBjYXRlZ29yeSBiYWRnZXMsIGV0Yy4pXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90ZW1wbGF0ZXMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm47XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgci5qc29uKCk7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmNhdGVnb3JpZXMpIHtcbiAgICAgICAgd2luZG93LkRDX0NBVEVHT1JJRVMgPSBkYXRhLmNhdGVnb3JpZXM7XG4gICAgICAgIC8vIEFsc28gZXhwb3NlIHZpYSBnbG9iYWxzLmpzIGNvbnN0YW50IGZvciBjb252ZW5pZW5jZVxuICAgICAgICBpZiAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJykgREMuQ0FURUdPUklFUyA9IGRhdGEuY2F0ZWdvcmllcztcbiAgICAgICAgLy8gUG9wdWxhdGUgYW55IGNhdGVnb3J5IDxzZWxlY3Q+IHRoYXQncyBhbHJlYWR5IGluIHRoZSBET01cbiAgICAgICAgcG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tpbml0XSBGYWlsZWQgdG8gbG9hZCB0ZW1wbGF0ZSBjYXRlZ29yaWVzOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzKCkge1xuICAgIGNvbnN0IGNhdHMgPSB3aW5kb3cuRENfQ0FURUdPUklFUyB8fCAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5DQVRFR09SSUVTKTtcbiAgICBpZiAoIWNhdHMpIHJldHVybjtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3RbZGF0YS1yb2xlPVwic2VydmljZS1jYXRlZ29yeVwiXScpLmZvckVhY2goc2VsZWN0ID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBzZWxlY3QuZGF0YXNldC5jdXJyZW50IHx8ICcnO1xuICAgICAgLy8gQ2xlYXIgb3B0aW9ucyBidXQga2VlcCB0aGUgZmlyc3QgKHBsYWNlaG9sZGVyKVxuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBzZWxlY3QucXVlcnlTZWxlY3Rvcignb3B0aW9uW3ZhbHVlPVwiXCJdJyk7XG4gICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJyc7XG4gICAgICBpZiAocGxhY2Vob2xkZXIpIHNlbGVjdC5hcHBlbmRDaGlsZChwbGFjZWhvbGRlcik7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgcGgudmFsdWUgPSAnJztcbiAgICAgICAgcGgudGV4dENvbnRlbnQgPSAnXHUyMDE0IFNlbGVjdCBjYXRlZ29yeSBcdTIwMTQnO1xuICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQocGgpO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmVudHJpZXMoY2F0cykuZm9yRWFjaCgoW25hbWUsIGluZm9dKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBuYW1lO1xuICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBgJHtpbmZvLmljb24gfHwgJyd9ICR7bmFtZX1gLnRyaW0oKTtcbiAgICAgICAgaWYgKG5hbWUgPT09IGN1cnJlbnQpIG9wdC5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBBbGxvdyBvdGhlciBtb2R1bGVzIHRvIHJlLXJ1biBwb3B1bGF0aW9uIGFmdGVyIHRoZXkgKHJlKWluamVjdCBzZWxlY3RzXG4gIHdpbmRvdy5wb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cyA9IHBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzO1xuICB3aW5kb3cubG9hZFRlbXBsYXRlQ2F0ZWdvcmllcyA9IGxvYWRUZW1wbGF0ZUNhdGVnb3JpZXM7XG5cbiAgLy8gVE9UUC1nYXRlZCBpbml0aWFsaXphdGlvblxuICAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b3RwUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgY29uc3QgdG90cERhdGEgPSBhd2FpdCB0b3RwUmVzLmpzb24oKTtcblxuICAgICAgaWYgKHRvdHBEYXRhLnN1Y2Nlc3MgJiYgdG90cERhdGEuY29uZmlnLmVuYWJsZWQpIHtcbiAgICAgICAgLy8gVE9UUCBpcyBlbmFibGVkIC0gY2hlY2sgaWYgd2UgaGF2ZSBhIHZhbGlkIHNlc3Npb25cbiAgICAgICAgY29uc3QgdGVzdFJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvY2hlY2stc2Vzc2lvbicsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICAgIGlmICh0ZXN0UmVzLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgLy8gTmVlZCBUT1RQIHZlcmlmaWNhdGlvbiAtIHNob3cgb3ZlcmxheVxuICAgICAgICAgIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5KCk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBpbml0aWFsaXplRGFzaGJvYXJkKCkgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCB2ZXJpZmljYXRpb25cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignVE9UUCBjaGVjayBmYWlsZWQsIHByb2NlZWRpbmcgbm9ybWFsbHk6JywgZSk7XG4gICAgfVxuXG4gICAgLy8gVE9UUCBkaXNhYmxlZCBvciBzZXNzaW9uIHZhbGlkIC0gaW5pdGlhbGl6ZSBpbW1lZGlhdGVseVxuICAgIGluaXRpYWxpemVEYXNoYm9hcmQoKTtcbiAgfSkoKTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gTU9OSVRPUklORyBXSURHRVRTID09PT09PT09PT1cbi8vIEVtYmVkcyBhIGNvbXBhY3Qgc3lzdGVtLXJlc291cmNlICsgaGVhbHRoIHN1bW1hcnkgcGFuZWwgZGlyZWN0bHkgb24gdGhlXG4vLyBtYWluIGRhc2hib2FyZC4gUmVwbGFjZXMgdGhlIG5lZWQgZm9yIGEgc2VwYXJhdGUgbW9uaXRvcmluZy1kYXNoYm9hcmQuaHRtbFxuLy8gcGFnZSBcdTIwMTQgcXVpY2sgYXQtYS1nbGFuY2Ugc3RhdHMgd2hlcmUgeW91IGFscmVhZHkgYXJlLlxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyAtLS0tLSBTdHlsZSBpbmplY3Rpb24gKHNjb3BlZCB0byAuZGMtbW9uaXRvciBzbyBpdCBkb2Vzbid0IGxlYWspIC0tLS0tXG4gIGNvbnN0IHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZUVsLnRleHRDb250ZW50ID0gYFxuICAgIC5kYy1tb25pdG9yIHtcbiAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIyMHB4LCAxZnIpKTtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7XG4gICAgfVxuICAgIC5kYy1tb25pdG9yLWNhcmQge1xuICAgICAgcGFkZGluZzogMTBweCAxMnB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZywgcmdiYSgyNTUsMjU1LDI1NSwwLjA0KSk7XG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1sYWJlbCB7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1xuICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci12YWx1ZSB7XG4gICAgICBmb250LXNpemU6IDEuNHJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogdmFyKC0tZmcpO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1zdWIge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogdmFyKC0tbXV0ZWQpO1xuICAgICAgbWFyZ2luLXRvcDogNHB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1iYXIge1xuICAgICAgbWFyZ2luLXRvcDogNnB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tdXRlZCkgMjAlLCB0cmFuc3BhcmVudCk7XG4gICAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1iYXItZmlsbCB7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB3aWR0aDogMCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1vay1mZywgIzI3YWU2MCk7XG4gICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzIGVhc2UsIGJhY2tncm91bmQgMC4zcyBlYXNlO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1iYXItZmlsbC53YXJuIHsgYmFja2dyb3VuZDogI2YzOWMxMjsgfVxuICAgIC5kYy1tb25pdG9yLWJhci1maWxsLmJhZCAgeyBiYWNrZ3JvdW5kOiAjZTc0YzNjOyB9XG4gICAgLmRjLW1vbml0b3ItaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDAuODVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgICBwYWRkaW5nOiAycHggOHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwub2sgICB7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjMjdhZTYwIDIwJSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogIzI3YWU2MDsgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwud2FybiB7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZjM5YzEyIDIwJSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogI2YzOWMxMjsgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwuYmFkICB7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZTc0YzNjIDIwJSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogI2U3NGMzYzsgfVxuICAgIC5kYy1tb25pdG9yLXJlZnJlc2gge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogdmFyKC0tbXV0ZWQpO1xuICAgICAgb3BhY2l0eTogMC43O1xuICAgIH1cbiAgYDtcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsKTtcblxuICAvLyAtLS0tLSBDb250YWluZXIgZWxlbWVudCAoaW5zZXJ0ZWQgYWJvdmUgc2VydmljZS1maWx0ZXItYmFyKSAtLS0tLVxuICBjb25zdCBmaWx0ZXJCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1maWx0ZXItYmFyJyk7XG4gIGlmICghZmlsdGVyQmFyKSByZXR1cm47XG5cbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcGFuZWwuY2xhc3NOYW1lID0gJ2RjLW1vbml0b3InO1xuICBwYW5lbC5pZCA9ICdkYy1tb25pdG9yLXBhbmVsJztcbiAgcGFuZWwuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWhlYWRlclwiIHN0eWxlPVwiZ3JpZC1jb2x1bW46IDEgLyAtMTtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXRpdGxlXCI+XHVEODNEXHVEQ0NBIFN5c3RlbSBPdmVydmlldzwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJkYy1tb25pdG9yLXJlZnJlc2hcIiBpZD1cImRjLW1vbml0b3ItcmVmcmVzaC1zdGFtcFwiPlx1MjAxNDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPlNlcnZpY2VzPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1zZXJ2aWNlc1wiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3Itc3ViXCIgaWQ9XCJkYy1tb25pdG9yLXNlcnZpY2VzLXN1YlwiPmxvYWRpbmdcdTIwMjY8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPkNvbnRhaW5lcnMgVXA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLWNvbnRhaW5lcnNcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXN1YlwiIGlkPVwiZGMtbW9uaXRvci1jb250YWluZXJzLXN1YlwiPmxvYWRpbmdcdTIwMjY8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPkF2ZyBDUFU8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLWNwdVwiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyXCI+PGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyLWZpbGxcIiBpZD1cImRjLW1vbml0b3ItY3B1LWJhclwiPjwvZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWxhYmVsXCI+QXZnIE1lbW9yeTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItdmFsdWVcIiBpZD1cImRjLW1vbml0b3ItbWVtXCI+XHUyMDE0PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1iYXJcIj48ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1iYXItZmlsbFwiIGlkPVwiZGMtbW9uaXRvci1tZW0tYmFyXCI+PC9kaXY+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5IZWFsdGg8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLWhlYWx0aFwiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3Itc3ViXCIgaWQ9XCJkYy1tb25pdG9yLWhlYWx0aC1zdWJcIj5cdTIwMTQ8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgLy8gSW5zZXJ0IEFCT1ZFIHRoZSBmaWx0ZXIgYmFyXG4gIGZpbHRlckJhci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShwYW5lbCwgZmlsdGVyQmFyKTtcblxuICAvLyAtLS0tLSBIZWxwZXJzIC0tLS0tXG4gIGZ1bmN0aW9uIHNldEJhcihpZCwgcGN0KSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHAgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIE51bWJlcihwY3QpIHx8IDApKTtcbiAgICBlbC5zdHlsZS53aWR0aCA9IHAgKyAnJSc7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnd2FybicsICdiYWQnKTtcbiAgICBpZiAocCA+PSA4NSkgZWwuY2xhc3NMaXN0LmFkZCgnYmFkJyk7XG4gICAgZWxzZSBpZiAocCA+PSA2NSkgZWwuY2xhc3NMaXN0LmFkZCgnd2FybicpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm10UGN0KHYpIHtcbiAgICBpZiAodiA9PSBudWxsIHx8IGlzTmFOKHYpKSByZXR1cm4gJ1x1MjAxNCc7XG4gICAgcmV0dXJuIChNYXRoLnJvdW5kKHYgKiAxMCkgLyAxMCkgKyAnJSc7XG4gIH1cblxuICBmdW5jdGlvbiBmbXRCeXRlcyhiKSB7XG4gICAgaWYgKGIgPT0gbnVsbCB8fCBpc05hTihiKSkgcmV0dXJuICdcdTIwMTQnO1xuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChiID49IDEwMjQgJiYgaSA8IHVuaXRzLmxlbmd0aCAtIDEpIHsgYiAvPSAxMDI0OyBpKys7IH1cbiAgICByZXR1cm4gYi50b0ZpeGVkKDEpICsgJyAnICsgdW5pdHNbaV07XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTZXJ2aWNlc0NhcmQoKSB7XG4gICAgY29uc3QgdG90YWwgPSAod2luZG93LkFQUFMgfHwgW10pLmxlbmd0aDtcbiAgICBsZXQgdXAgPSAwO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjYXJkcyAuY2FyZCcpLmZvckVhY2goYyA9PiB7XG4gICAgICBpZiAoYy5kYXRhc2V0LnN0YXR1cyA9PT0gJ29uJykgdXArKztcbiAgICB9KTtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLXNlcnZpY2VzJyk7XG4gICAgY29uc3Qgc3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3Itc2VydmljZXMtc3ViJyk7XG4gICAgaWYgKGVsKSBlbC50ZXh0Q29udGVudCA9IGAke3VwfSAvICR7dG90YWx9YDtcbiAgICBpZiAoc3ViKSBzdWIudGV4dENvbnRlbnQgPSB0b3RhbCA9PT0gMCA/ICdubyBzZXJ2aWNlcyB5ZXQnIDogYCR7dXB9IG9ubGluZSBcdTAwQjcgJHt0b3RhbCAtIHVwfSBvZmZsaW5lYDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5SGVhbHRoU3VtbWFyeShkYXRhKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1oZWFsdGgnKTtcbiAgICBjb25zdCBzdWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1oZWFsdGgtc3ViJyk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmICghZGF0YSB8fCBkYXRhLnN1bW1hcnkgPT0gbnVsbCkge1xuICAgICAgZWwudGV4dENvbnRlbnQgPSAnXHUyMDE0JztcbiAgICAgIGlmIChzdWIpIHN1Yi50ZXh0Q29udGVudCA9ICdubyBkYXRhJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcyA9IGRhdGEuc3VtbWFyeTtcbiAgICBjb25zdCBoZWFsdGh5ID0gcy5oZWFsdGh5ID8/IHMudXAgPz8gMDtcbiAgICBjb25zdCB1bmhlYWx0aHkgPSBzLnVuaGVhbHRoeSA/PyBzLmRvd24gPz8gMDtcbiAgICBjb25zdCB0b3RhbCA9IHMudG90YWwgPz8gKGhlYWx0aHkgKyB1bmhlYWx0aHkpO1xuICAgIGVsLnRleHRDb250ZW50ID0gYCR7aGVhbHRoeX0vJHt0b3RhbH1gO1xuICAgIGlmIChzdWIpIHtcbiAgICAgIGlmICh1bmhlYWx0aHkgPT09IDApIHtcbiAgICAgICAgc3ViLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImRjLW1vbml0b3ItcGlsbCBva1wiPlx1MjVDRiBhbGwgaGVhbHRoeTwvc3Bhbj4nO1xuICAgICAgfSBlbHNlIGlmICh1bmhlYWx0aHkgPD0gMikge1xuICAgICAgICBzdWIuaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPVwiZGMtbW9uaXRvci1waWxsIHdhcm5cIj5cdTI1Q0YgJHt1bmhlYWx0aHl9IGRlZ3JhZGVkPC9zcGFuPmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWIuaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPVwiZGMtbW9uaXRvci1waWxsIGJhZFwiPlx1MjVDRiAke3VuaGVhbHRoeX0gZG93bjwvc3Bhbj5gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tIERhdGEgZmV0Y2hlcyAtLS0tLVxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFN0YXRzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbW9uaXRvcmluZy9zdGF0cycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICBpZiAoIXIub2spIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgcmV0dXJuIChkYXRhICYmIGRhdGEuc3RhdHMpID8gZGF0YS5zdGF0cyA6IG51bGw7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hIZWFsdGgoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL3N0YXR1cycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICBpZiAoIXIub2spIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGF3YWl0IHIuanNvbigpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5U3RhdHMoc3RhdHMpIHtcbiAgICBjb25zdCBjb250YWluZXJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItY29udGFpbmVycycpO1xuICAgIGNvbnN0IGNvbnRhaW5lcnNTdWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1jb250YWluZXJzLXN1YicpO1xuICAgIGNvbnN0IGNwdUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItY3B1Jyk7XG4gICAgY29uc3QgbWVtRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1tZW0nKTtcblxuICAgIGlmICghc3RhdHMpIHtcbiAgICAgIGlmIChjb250YWluZXJzKSBjb250YWluZXJzLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICBpZiAoY3B1RWwpIGNwdUVsLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICBpZiAobWVtRWwpIG1lbUVsLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC52YWx1ZXMoc3RhdHMpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGNvbnRhaW5lcnMpIGNvbnRhaW5lcnMudGV4dENvbnRlbnQgPSAnMCc7XG4gICAgICBpZiAoY29udGFpbmVyc1N1YikgY29udGFpbmVyc1N1Yi50ZXh0Q29udGVudCA9ICdubyBjb250YWluZXJzIHJlcG9ydGluZyc7XG4gICAgICBpZiAoY3B1RWwpIGNwdUVsLnRleHRDb250ZW50ID0gJzAlJztcbiAgICAgIGlmIChtZW1FbCkgbWVtRWwudGV4dENvbnRlbnQgPSAnMCUnO1xuICAgICAgc2V0QmFyKCdkYy1tb25pdG9yLWNwdS1iYXInLCAwKTtcbiAgICAgIHNldEJhcignZGMtbW9uaXRvci1tZW0tYmFyJywgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNwdVN1bSA9IDAsIG1lbVN1bSA9IDAsIG1lbUJ5dGVzID0gMCwgY3B1Q291bnQgPSAwLCBtZW1Db3VudCA9IDA7XG4gICAgZW50cmllcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgLy8gQ1BVIG1heSBiZSBwZXJjZW50YWdlICgwLTEwMCkgb3IgZnJhY3Rpb24gKDAtMSkgXHUyMDE0IGhhbmRsZSBib3RoXG4gICAgICBpZiAocy5jcHUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjcHUgPSBOdW1iZXIocy5jcHUpO1xuICAgICAgICBpZiAoIWlzTmFOKGNwdSkpIHtcbiAgICAgICAgICBjcHVTdW0gKz0gY3B1ID4gMSA/IGNwdSA6IGNwdSAqIDEwMDtcbiAgICAgICAgICBjcHVDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocy5tZW1vcnkgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBtZW0gPSBOdW1iZXIocy5tZW1vcnkpO1xuICAgICAgICBpZiAoIWlzTmFOKG1lbSkpIHtcbiAgICAgICAgICBtZW1TdW0gKz0gbWVtO1xuICAgICAgICAgIG1lbUJ5dGVzICs9IE51bWJlcihzLm1lbW9yeVVzYWdlIHx8IDApO1xuICAgICAgICAgIG1lbUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGF2Z0NwdSA9IGNwdUNvdW50ID8gY3B1U3VtIC8gY3B1Q291bnQgOiAwO1xuICAgIGNvbnN0IGF2Z01lbSA9IG1lbUNvdW50ID8gbWVtU3VtIC8gbWVtQ291bnQgOiAwO1xuXG4gICAgaWYgKGNvbnRhaW5lcnMpIGNvbnRhaW5lcnMudGV4dENvbnRlbnQgPSBTdHJpbmcoZW50cmllcy5sZW5ndGgpO1xuICAgIGlmIChjb250YWluZXJzU3ViKSB7XG4gICAgICBjb25zdCBtZW1UeHQgPSBtZW1CeXRlcyA/IGAgXHUwMEI3ICR7Zm10Qnl0ZXMobWVtQnl0ZXMpfSBSQU1gIDogJyc7XG4gICAgICBjb250YWluZXJzU3ViLnRleHRDb250ZW50ID0gYHJ1bm5pbmcke21lbVR4dH1gO1xuICAgIH1cbiAgICBpZiAoY3B1RWwpIGNwdUVsLnRleHRDb250ZW50ID0gZm10UGN0KGF2Z0NwdSk7XG4gICAgaWYgKG1lbUVsKSBtZW1FbC50ZXh0Q29udGVudCA9IGZtdFBjdChhdmdNZW0pO1xuICAgIHNldEJhcignZGMtbW9uaXRvci1jcHUtYmFyJywgYXZnQ3B1KTtcbiAgICBzZXRCYXIoJ2RjLW1vbml0b3ItbWVtLWJhcicsIGF2Z01lbSk7XG4gIH1cblxuICAvLyAtLS0tLSBQdWJsaWMgcmVmcmVzaCBmdW5jdGlvbiAtLS0tLVxuICBsZXQgaW5GbGlnaHQgPSBmYWxzZTtcbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICBpZiAoaW5GbGlnaHQpIHJldHVybjtcbiAgICBpbkZsaWdodCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHNldFNlcnZpY2VzQ2FyZCgpO1xuICAgICAgY29uc3QgW3N0YXRzLCBoZWFsdGhdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2ZldGNoU3RhdHMoKSwgZmV0Y2hIZWFsdGgoKV0pO1xuICAgICAgYXBwbHlTdGF0cyhzdGF0cyk7XG4gICAgICBhcHBseUhlYWx0aFN1bW1hcnkoaGVhbHRoKTtcbiAgICAgIGNvbnN0IHN0YW1wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItcmVmcmVzaC1zdGFtcCcpO1xuICAgICAgaWYgKHN0YW1wKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHN0YW1wLnRleHRDb250ZW50ID0gYHVwZGF0ZWQgJHtub3cudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YDtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaW5GbGlnaHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIGluaXQuanMgdG8gY2FsbCBvbmNlIGFuZCByZS1jYWxsIGFmdGVyIGVhY2ggcmVmcmVzaEFsbCBjeWNsZVxuICB3aW5kb3cucmVmcmVzaE1vbml0b3JpbmdXaWRnZXRzID0gcmVmcmVzaDtcblxuICAvLyBBdXRvLXJlZnJlc2ggb24gdGhlIFNUQVRTIGludGVydmFsIChzZXBhcmF0ZSBmcm9tIGZ1bGwgREFTSEJPQVJEIHJlZnJlc2gpXG4gIHNldEludGVydmFsKHJlZnJlc2gsICh0eXBlb2YgREMgIT09ICd1bmRlZmluZWQnICYmIERDLlBPTEwgJiYgREMuUE9MTC5TVEFUUykgfHwgNTAwMCk7XG5cbiAgLy8gUmVmcmVzaCBvbmNlIG9uIGZpcnN0IHNjcmlwdCBsb2FkIChpbml0LmpzIGFsc28gY2FsbHMgdGhpczsgZG91YmxlLWNhbGwgaXMgaGFybWxlc3MpXG4gIHNldFRpbWVvdXQocmVmcmVzaCwgMjAwKTtcblxufSkoKTtcbjtcbi8qKlxuICogRGFzaENhZGR5IEtleWJvYXJkIFNob3J0Y3V0cyBTeXN0ZW1cbiAqIFByb3ZpZGVzIGdsb2JhbCBrZXlib2FyZCBzaG9ydGN1dHMgZm9yIGltcHJvdmVkIG5hdmlnYXRpb25cbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBkZWJ1ZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5EQVNIQ0FERFlfREVCVUcpIHsgY29uc29sZS5sb2coLi4uYXJncyk7IH1cbiAgfTtcblxuICAvLyBBbGwgbW9kYWwgc2VsZWN0b3JzIHRoYXQgY2FuIGJlIGNsb3NlZCB3aXRoIEVzY2FwZVxuICBjb25zdCBNT0RBTF9TRUxFQ1RPUlMgPSBbXG4gICAgJyNhcHAtc2VsZWN0b3ItbW9kYWwnLFxuICAgICcjYXBwLWRlcGxveS1tb2RhbCcsXG4gICAgJyN3ZWF0aGVyLW1vZGFsJyxcbiAgICAnI3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnLFxuICAgICcjc2VydmljZS1lZGl0LW1vZGFsJyxcbiAgICAnI25vdGlmaWNhdGlvbnMtbW9kYWwnLFxuICAgICcjYmFja3VwLW1vZGFsJyxcbiAgICAnI3N0YXRzLW1vZGFsJyxcbiAgICAnI2Fyci1zZXR1cC1tb2RhbCcsXG4gICAgJyNhZGQtc2VydmljZS1tb2RhbCcsXG4gICAgJyNlcnJvci1sb2ctbW9kYWwnLFxuICAgICcjbG9ncy1tb2RhbCcsXG4gICAgJyNkbnMtdGVtcGxhdGUtbW9kYWwnXG4gIF07XG5cbiAgLy8gUXVpY2sgc2VhcmNoIHN0YXRlXG4gIGxldCBxdWlja1NlYXJjaE1vZGFsID0gbnVsbDtcbiAgbGV0IHF1aWNrU2VhcmNoSW5wdXQgPSBudWxsO1xuICBsZXQgcXVpY2tTZWFyY2hSZXN1bHRzID0gbnVsbDtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUga2V5Ym9hcmQgc2hvcnRjdXRzIHN5c3RlbVxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIHF1aWNrIHNlYXJjaCBtb2RhbFxuICAgICAgY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCgpO1xuXG4gICAgICAvLyBBZGQgZ2xvYmFsIGtleWJvYXJkIGxpc3RlbmVyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bik7XG5cbiAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBJbml0aWFsaXplZCcpO1xuICAgICAgZGVidWcoJ1tLZXlib2FyZCBTaG9ydGN1dHNdIFByZXNzIEN0cmwrSyB0byBvcGVuIHF1aWNrIHNlYXJjaCcpO1xuICAgICAgZGVidWcoJ1tLZXlib2FyZCBTaG9ydGN1dHNdIFByZXNzIEVzY2FwZSB0byBjbG9zZSBtb2RhbHMnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEZhaWxlZCB0byBpbml0aWFsaXplOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgcXVpY2sgc2VhcmNoIG1vZGFsXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVRdWlja1NlYXJjaE1vZGFsKCkge1xuICAgIHF1aWNrU2VhcmNoTW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBxdWlja1NlYXJjaE1vZGFsLmlkID0gJ3F1aWNrLXNlYXJjaC1tb2RhbCc7XG4gICAgcXVpY2tTZWFyY2hNb2RhbC5jbGFzc05hbWUgPSAncXVpY2stc2VhcmNoLW1vZGFsJztcbiAgICBxdWlja1NlYXJjaE1vZGFsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWlucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pY29uXCI+XHVEODNEXHVERDBEPC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicXVpY2stc2VhcmNoLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc2VydmljZXMsIGFwcHMsIG9yIGFjdGlvbnMuLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1zaG9ydGN1dFwiPkVTQzwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJxdWljay1zZWFyY2gtcmVzdWx0c1wiIGNsYXNzPVwicXVpY2stc2VhcmNoLXJlc3VsdHNcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1mb290ZXJcIj5cbiAgICAgICAgICA8c3Bhbj48a2JkPlx1MjE5MVx1MjE5Mzwva2JkPiBOYXZpZ2F0ZTwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48a2JkPkVudGVyPC9rYmQ+IFNlbGVjdDwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48a2JkPkVzYzwva2JkPiBDbG9zZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuXG4gICAgLy8gQWRkIHN0eWxlc1xuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgIC5xdWljay1zZWFyY2gtbW9kYWwge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICAgICAgICB6LWluZGV4OiAxMDAwMDA7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgcGFkZGluZy10b3A6IDE1dmg7XG4gICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLW1vZGFsLnNob3cge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWNvbnRlbnQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMxYTFhMmUpO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICMzMzMpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgICAgICB3aWR0aDogOTAlO1xuICAgICAgICBtYXgtd2lkdGg6IDYwMHB4O1xuICAgICAgICBib3gtc2hhZG93OiAwIDI1cHggNTBweCAtMTJweCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaW5wdXQtd3JhcHBlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDE2cHggMjBweDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlciwgIzMzMyk7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB9XG5cbiAgICAgICNxdWljay1zZWFyY2gtaW5wdXQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICBjb2xvcjogdmFyKC0tZmcsICNmZmYpO1xuICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgICAgfVxuXG4gICAgICAjcXVpY2stc2VhcmNoLWlucHV0OjpwbGFjZWhvbGRlciB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtc2hvcnRjdXQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWhvdmVyLCAjMmEyYTRlKTtcbiAgICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtcmVzdWx0cyB7XG4gICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4O1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWNhdGVnb3J5IHtcbiAgICAgICAgcGFkZGluZzogOHB4IDIwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjNjY2KTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3ZlciwgIzJhMmE0ZSk7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgcGFkZGluZzogMTJweCAyMHB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtOmhvdmVyLFxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLnNlbGVjdGVkIHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LCAjMzQ5OGRiKTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLWljb24ge1xuICAgICAgICBmb250LXNpemU6IDI0cHg7XG4gICAgICAgIHdpZHRoOiAzMnB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1jb250ZW50IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWZnLCAjZmZmKTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLWRlc2NyaXB0aW9uIHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICNhYWEpO1xuICAgICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1iYWRnZSB7XG4gICAgICAgIHBhZGRpbmc6IDJweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWhvdmVyLCAjMmEyYTRlKTtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjODg4KTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1lbXB0eSB7XG4gICAgICAgIHBhZGRpbmc6IDQwcHggMjBweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWZvb3RlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBnYXA6IDI0cHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMjBweDtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlciwgIzMzMyk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtaG92ZXIsICMyYTJhNGUpO1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtZm9vdGVyIGtiZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSwgIzFhMWEyZSk7XG4gICAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA0cHg7XG4gICAgICB9XG4gICAgYDtcblxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocXVpY2tTZWFyY2hNb2RhbCk7XG5cbiAgICBxdWlja1NlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1aWNrLXNlYXJjaC1pbnB1dCcpO1xuICAgIHF1aWNrU2VhcmNoUmVzdWx0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWljay1zZWFyY2gtcmVzdWx0cycpO1xuXG4gICAgLy8gSW5wdXQgaGFuZGxpbmdcbiAgICBxdWlja1NlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgaGFuZGxlU2VhcmNoSW5wdXQpO1xuICAgIHF1aWNrU2VhcmNoSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZVNlYXJjaEtleURvd24pO1xuXG4gICAgLy8gQ2xvc2Ugb24gYmFja2Ryb3AgY2xpY2tcbiAgICBxdWlja1NlYXJjaE1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCA9PT0gcXVpY2tTZWFyY2hNb2RhbCkge1xuICAgICAgICBjbG9zZVF1aWNrU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGdsb2JhbCBrZXlkb3duIGV2ZW50c1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlS2V5RG93bihlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEN0cmwrSyBvciBDbWQrSyB0byBvcGVuIHF1aWNrIHNlYXJjaFxuICAgICAgaWYgKChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSAmJiBlLmtleSA9PT0gJ2snKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb3BlblF1aWNrU2VhcmNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRXNjYXBlIHRvIGNsb3NlIG1vZGFsc1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiBxdWljayBzZWFyY2ggaXMgb3BlblxuICAgICAgICBpZiAocXVpY2tTZWFyY2hNb2RhbCAmJiBxdWlja1NlYXJjaE1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XG4gICAgICAgICAgY2xvc2VRdWlja1NlYXJjaCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZW4gY2xvc2UgYW55IG90aGVyIG9wZW4gbW9kYWxcbiAgICAgICAgY2xvc2VUb3BNb2RhbCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGhhbmRsaW5nIGtleWRvd246JywgZTIubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gcXVpY2sgc2VhcmNoIG1vZGFsXG4gICAqL1xuICBmdW5jdGlvbiBvcGVuUXVpY2tTZWFyY2goKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1aWNrU2VhcmNoTW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgICAgcXVpY2tTZWFyY2hJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgcXVpY2tTZWFyY2hJbnB1dC5mb2N1cygpO1xuICAgICAgc2hvd0RlZmF1bHRSZXN1bHRzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBFcnJvciBvcGVuaW5nIHF1aWNrIHNlYXJjaDonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBxdWljayBzZWFyY2ggbW9kYWxcbiAgICovXG4gIGZ1bmN0aW9uIGNsb3NlUXVpY2tTZWFyY2goKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1aWNrU2VhcmNoTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgcXVpY2tTZWFyY2hJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgcXVpY2tTZWFyY2hSZXN1bHRzLmlubmVySFRNTCA9ICcnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3IgY2xvc2luZyBxdWljayBzZWFyY2g6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIHRvcG1vc3Qgb3BlbiBtb2RhbFxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VUb3BNb2RhbCgpIHtcbiAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIE1PREFMX1NFTEVDVE9SUykge1xuICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIGlmIChtb2RhbCAmJiAobW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykgfHwgbW9kYWwuc3R5bGUuZGlzcGxheSA9PT0gJ2ZsZXgnKSkge1xuICAgICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICAgIG1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBkZWZhdWx0L3N1Z2dlc3RlZCByZXN1bHRzXG4gICAqL1xuICBmdW5jdGlvbiBzaG93RGVmYXVsdFJlc3VsdHMoKSB7XG4gICAgY29uc3QgaHRtbCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY2F0ZWdvcnlcIj5RdWljayBBY3Rpb25zPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cInJlZnJlc2hcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+XHVEODNEXHVERDA0PC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS10aXRsZVwiPlJlZnJlc2ggRGFzaGJvYXJkPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWRlc2NyaXB0aW9uXCI+UmVmcmVzaCBhbGwgc2VydmljZSBzdGF0dXNlczwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJyZWxvYWQtY2FkZHlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+XHUyNkExPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS10aXRsZVwiPlJlbG9hZCBDYWRkeTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPlJlbG9hZCBDYWRkeSBjb25maWd1cmF0aW9uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cImFkZC1zZXJ2aWNlXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPlx1Mjc5NTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj5BZGQgU2VydmljZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPk9wZW4gc2VydmljZSBjb25maWd1cmF0aW9uIG1vZGFsPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cImFwcC1zZWxlY3RvclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj5cdUQ4M0RcdURDRjE8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+QXBwIFNlbGVjdG9yPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWRlc2NyaXB0aW9uXCI+RGVwbG95IG5ldyBhcHBsaWNhdGlvbnM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1jYXRlZ29yeVwiPlNlcnZpY2VzPC9kaXY+XG4gICAgICAke2dldFNlcnZpY2VJdGVtcygpfVxuICAgIGA7XG5cbiAgICBxdWlja1NlYXJjaFJlc3VsdHMuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhdHRhY2hSZXN1bHRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VydmljZSBpdGVtcyBmcm9tIHRoZSBkYXNoYm9hcmRcbiAgICovXG4gIGZ1bmN0aW9uIGdldFNlcnZpY2VJdGVtcygpIHtcbiAgICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJkW2RhdGEtYXBwXSwgI2NhcmRzIC5jYXJkJyk7XG4gICAgbGV0IGh0bWwgPSAnJztcblxuICAgIGNhcmRzLmZvckVhY2goY2FyZCA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcubmFtZScpPy50ZXh0Q29udGVudCB8fCAnVW5rbm93bic7XG4gICAgICBjb25zdCBzdGF0dXMgPSBjYXJkLmRhdGFzZXQuc3RhdHVzIHx8ICd1bmtub3duJztcbiAgICAgIGNvbnN0IGFwcCA9IGNhcmQuZGF0YXNldC5hcHAgfHwgJyc7XG5cbiAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09ICctLScpIHtcbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJvcGVuLXNlcnZpY2VcIiBkYXRhLXNlcnZpY2U9XCIke2FwcH1cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPiR7c3RhdHVzID09PSAnb24nID8gJ1x1RDgzRFx1REZFMicgOiAnXHVEODNEXHVERDM0J308L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj4ke25hbWV9PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPkNsaWNrIHRvIG9wZW4gc2VydmljZTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWJhZGdlXCI+JHtzdGF0dXMudG9VcHBlckNhc2UoKX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHRtbCB8fCAnPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1lbXB0eVwiPk5vIHNlcnZpY2VzIGZvdW5kPC9kaXY+JztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGlucHV0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVTZWFyY2hJbnB1dChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gZS50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgc2hvd0RlZmF1bHRSZXN1bHRzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2VhcmNoIHRocm91Z2ggc2VydmljZXMgYW5kIGFjdGlvbnNcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBzZWFyY2hBbGwocXVlcnkpO1xuICAgICAgZGlzcGxheVNlYXJjaFJlc3VsdHMocmVzdWx0cyk7XG4gICAgfSBjYXRjaCAoZTIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3IgaGFuZGxpbmcgc2VhcmNoIGlucHV0OicsIGUyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggYWxsIGl0ZW1zXG4gICAqL1xuICBmdW5jdGlvbiBzZWFyY2hBbGwocXVlcnkpIHtcbiAgICBjb25zdCByZXN1bHRzID0ge1xuICAgICAgYWN0aW9uczogW10sXG4gICAgICBzZXJ2aWNlczogW11cbiAgICB9O1xuXG4gICAgLy8gU2VhcmNoIGFjdGlvbnNcbiAgICBjb25zdCBhY3Rpb25zID0gW1xuICAgICAgeyBpZDogJ3JlZnJlc2gnLCB0aXRsZTogJ1JlZnJlc2ggRGFzaGJvYXJkJywgaWNvbjogJ1x1RDgzRFx1REQwNCcsIGtleXdvcmRzOiAncmVmcmVzaCByZWxvYWQgdXBkYXRlIHN0YXR1cycgfSxcbiAgICAgIHsgaWQ6ICdyZWxvYWQtY2FkZHknLCB0aXRsZTogJ1JlbG9hZCBDYWRkeScsIGljb246ICdcdTI2QTEnLCBrZXl3b3JkczogJ3JlbG9hZCBjYWRkeSBwcm94eSBjb25maWcnIH0sXG4gICAgICB7IGlkOiAnYWRkLXNlcnZpY2UnLCB0aXRsZTogJ0FkZCBTZXJ2aWNlJywgaWNvbjogJ1x1Mjc5NScsIGtleXdvcmRzOiAnYWRkIG5ldyBzZXJ2aWNlIGNyZWF0ZScgfSxcbiAgICAgIHsgaWQ6ICdhcHAtc2VsZWN0b3InLCB0aXRsZTogJ0FwcCBTZWxlY3RvcicsIGljb246ICdcdUQ4M0RcdURDRjEnLCBrZXl3b3JkczogJ2FwcCBkZXBsb3kgaW5zdGFsbCBkb2NrZXIgY29udGFpbmVyJyB9LFxuICAgICAgeyBpZDogJ2JhY2t1cCcsIHRpdGxlOiAnQmFja3VwICYgUmVzdG9yZScsIGljb246ICdcdUQ4M0RcdURDQkUnLCBrZXl3b3JkczogJ2JhY2t1cCByZXN0b3JlIGV4cG9ydCBpbXBvcnQnIH0sXG4gICAgICB7IGlkOiAnc3RhdHMnLCB0aXRsZTogJ0NvbnRhaW5lciBTdGF0cycsIGljb246ICdcdUQ4M0RcdURDQ0EnLCBrZXl3b3JkczogJ3N0YXRzIHJlc291cmNlcyBjcHUgbWVtb3J5JyB9LFxuICAgICAgeyBpZDogJ2xvZ3MnLCB0aXRsZTogJ1ZpZXcgTG9ncycsIGljb246ICdcdUQ4M0RcdURDQ0InLCBrZXl3b3JkczogJ2xvZ3MgZXJyb3IgZGVidWcnIH0sXG4gICAgICB7IGlkOiAndG9rZW5zJywgdGl0bGU6ICdNYW5hZ2UgVG9rZW5zJywgaWNvbjogJ1x1RDgzRFx1REQxMScsIGtleXdvcmRzOiAndG9rZW5zIGFwaSBrZXlzIGNyZWRlbnRpYWxzJyB9LFxuICAgICAgeyBpZDogJ25vdGlmaWNhdGlvbnMnLCB0aXRsZTogJ05vdGlmaWNhdGlvbnMnLCBpY29uOiAnXHVEODNEXHVERDE0Jywga2V5d29yZHM6ICdhbGVydHMgbm90aWZpY2F0aW9ucyBkaXNjb3JkIHRlbGVncmFtJyB9LFxuICAgICAgeyBpZDogJ3RoZW1lJywgdGl0bGU6ICdDaGFuZ2UgVGhlbWUnLCBpY29uOiAnXHVEODNDXHVERkE4Jywga2V5d29yZHM6ICd0aGVtZSBkYXJrIGxpZ2h0IGFwcGVhcmFuY2UnIH0sXG4gICAgICB7IGlkOiAndG91cicsIHRpdGxlOiAnSGVscCBUb3VyJywgaWNvbjogJ1x1RDgzQ1x1REY5MycsIGtleXdvcmRzOiAnaGVscCB0b3VyIGd1aWRlIG9uYm9hcmRpbmcnIH1cbiAgICBdO1xuXG4gICAgYWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICBpZiAoYWN0aW9uLnRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpIHx8IGFjdGlvbi5rZXl3b3Jkcy5pbmNsdWRlcyhxdWVyeSkpIHtcbiAgICAgICAgcmVzdWx0cy5hY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNlYXJjaCBzZXJ2aWNlc1xuICAgIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNhcmRbZGF0YS1hcHBdLCAjY2FyZHMgLmNhcmQnKTtcbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQgfHwgJyc7XG4gICAgICBjb25zdCBhcHAgPSBjYXJkLmRhdGFzZXQuYXBwIHx8ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5kYXRhc2V0LnN0YXR1cyB8fCAndW5rbm93bic7XG5cbiAgICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpIHx8IGFwcC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSkge1xuICAgICAgICByZXN1bHRzLnNlcnZpY2VzLnB1c2goe1xuICAgICAgICAgIGlkOiBhcHAsXG4gICAgICAgICAgdGl0bGU6IG5hbWUsXG4gICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgaWNvbjogc3RhdHVzID09PSAnb24nID8gJ1x1RDgzRFx1REZFMicgOiAnXHVEODNEXHVERDM0J1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgc2VhcmNoIHJlc3VsdHNcbiAgICovXG4gIGZ1bmN0aW9uIGRpc3BsYXlTZWFyY2hSZXN1bHRzKHJlc3VsdHMpIHtcbiAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgaWYgKHJlc3VsdHMuYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWNhdGVnb3J5XCI+QWN0aW9uczwvZGl2Pic7XG4gICAgICByZXN1bHRzLmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICBodG1sICs9IGBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cIiR7YWN0aW9uLmlkfVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+JHthY3Rpb24uaWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj4ke2FjdGlvbi50aXRsZX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdHMuc2VydmljZXMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1jYXRlZ29yeVwiPlNlcnZpY2VzPC9kaXY+JztcbiAgICAgIHJlc3VsdHMuc2VydmljZXMuZm9yRWFjaChzZXJ2aWNlID0+IHtcbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJvcGVuLXNlcnZpY2VcIiBkYXRhLXNlcnZpY2U9XCIke3NlcnZpY2UuaWR9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj4ke3NlcnZpY2UuaWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj4ke3NlcnZpY2UudGl0bGV9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tYmFkZ2VcIj4ke3NlcnZpY2Uuc3RhdHVzLnRvVXBwZXJDYXNlKCl9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFodG1sKSB7XG4gICAgICBodG1sID0gJzxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtZW1wdHlcIj5ObyByZXN1bHRzIGZvdW5kPC9kaXY+JztcbiAgICB9XG5cbiAgICBxdWlja1NlYXJjaFJlc3VsdHMuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhdHRhY2hSZXN1bHRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggY2xpY2sgbGlzdGVuZXJzIHRvIHJlc3VsdCBpdGVtc1xuICAgKi9cbiAgZnVuY3Rpb24gYXR0YWNoUmVzdWx0TGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IGl0ZW1zID0gcXVpY2tTZWFyY2hSZXN1bHRzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1zZWFyY2gtaXRlbScpO1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZXhlY3V0ZUFjdGlvbihpdGVtKSk7XG5cbiAgICAgIC8vIFNlbGVjdCBmaXJzdCBpdGVtIGJ5IGRlZmF1bHRcbiAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb24gaW4gc2VhcmNoXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVTZWFyY2hLZXlEb3duKGUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaXRlbXMgPSBxdWlja1NlYXJjaFJlc3VsdHMucXVlcnlTZWxlY3RvckFsbCgnLnF1aWNrLXNlYXJjaC1pdGVtJyk7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IHF1aWNrU2VhcmNoUmVzdWx0cy5xdWVyeVNlbGVjdG9yKCcucXVpY2stc2VhcmNoLWl0ZW0uc2VsZWN0ZWQnKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBBcnJheS5mcm9tKGl0ZW1zKS5pbmRleE9mKHNlbGVjdGVkKTtcblxuICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChzZWxlY3RlZCkgc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gKHNlbGVjdGVkSW5kZXggKyAxKSAlIGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgaXRlbXNbbmV4dEluZGV4XT8uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgICAgaXRlbXNbbmV4dEluZGV4XT8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkKSBzZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBzZWxlY3RlZEluZGV4IDw9IDAgPyBpdGVtcy5sZW5ndGggLSAxIDogc2VsZWN0ZWRJbmRleCAtIDE7XG4gICAgICAgIGl0ZW1zW3ByZXZJbmRleF0/LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGl0ZW1zW3ByZXZJbmRleF0/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICBleGVjdXRlQWN0aW9uKHNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGhhbmRsaW5nIHNlYXJjaCBuYXZpZ2F0aW9uOicsIGUyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFjdGlvbiBmcm9tIHF1aWNrIHNlYXJjaFxuICAgKi9cbiAgZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihpdGVtKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGl0ZW0uZGF0YXNldC5hY3Rpb247XG4gICAgICBjb25zdCBzZXJ2aWNlID0gaXRlbS5kYXRhc2V0LnNlcnZpY2U7XG5cbiAgICAgIGNsb3NlUXVpY2tTZWFyY2goKTtcblxuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgY2FzZSAncmVmcmVzaCc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZnJlc2gnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVsb2FkLWNhZGR5JzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVsb2FkLWNhZGR5LXRvcCcpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdhZGQtc2VydmljZSc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FwcC1zZWxlY3Rvcic6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWJ0bicpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdiYWNrdXAnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtcmVzdG9yZS1idG4nKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RhdHMnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXItc3RhdHMtYnRuJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xvZ3MnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3LWVycm9yLWxvZ3MnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9rZW5zJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFuYWdlLXRva2VucycpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdub3RpZmljYXRpb25zJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFuYWdlLW5vdGlmaWNhdGlvbnMnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndGhlbWUnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZScpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3VyJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdGFydC10b3VyLWJ0bicpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdvcGVuLXNlcnZpY2UnOlxuICAgICAgICAgIGlmIChzZXJ2aWNlKSB7XG4gICAgICAgICAgICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwPVwiJHtzZXJ2aWNlfVwiXSBbaWQkPVwiLW9wZW5cIl0sIFtkYXRhLWFwcD1cIiR7c2VydmljZX1cIl0gYnV0dG9uOm5vdCgucmVzdGFydC1idG4pOm5vdCgubG9ncy1idG4pOm5vdCguc2V0dGluZ3MtYnRuKWApO1xuICAgICAgICAgICAgaWYgKG9wZW5CdG4pIHtcbiAgICAgICAgICAgICAgb3BlbkJ0bi5jbGljaygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgdGhlIGNhcmQgYW5kIGNsaWNrIGl0XG4gICAgICAgICAgICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHA9XCIke3NlcnZpY2V9XCJdYCk7XG4gICAgICAgICAgICAgIGlmIChjYXJkKSBjYXJkLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBVbmtub3duIGFjdGlvbjonLCBhY3Rpb24pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3IgZXhlY3V0aW5nIGFjdGlvbjonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgd2hlbiBET00gaXMgcmVhZHlcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpbml0KTtcbiAgfSBlbHNlIHtcbiAgICBpbml0KCk7XG4gIH1cblxuICAvLyBFeHBvc2UgdG8gZ2xvYmFsIHNjb3BlXG4gIHdpbmRvdy5EYXNoQ2FkZHlLZXlib2FyZFNob3J0Y3V0cyA9IHtcbiAgICBvcGVuUXVpY2tTZWFyY2gsXG4gICAgY2xvc2VRdWlja1NlYXJjaFxuICB9O1xuXG59KSgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIkNBQ0MsVUFBWSxDQUVYLFNBQVNBLEdBQXFCLENBQzVCLE1BQU1DLEVBQWlCLFFBQVEsaUJBQWlCLEVBQ2hELEdBQUlBLEVBQ0YsR0FBSSxDQUNlLEtBQUssTUFBTUEsQ0FBYyxFQUVqQyxRQUFRQyxHQUFXLENBQ3JCLE9BQU8sS0FBSyxLQUFLQyxHQUFPQSxFQUFJLEtBQU9ELEVBQVEsRUFBRSxHQUNoRCxPQUFPLEtBQUssS0FBS0EsQ0FBTyxDQUU1QixDQUFDLENBQ0gsT0FBU0UsRUFBRyxDQUNWLFFBQVEsS0FBSyxrQ0FBbUNBLENBQUMsQ0FDbkQsQ0FFSixDQUdBSixFQUFtQixFQUduQixTQUFTSyxHQUFrQixDQUN6QixNQUFNQyxFQUFXLFNBQVMsaUJBQWlCLFlBQVksRUFDdkRBLEVBQVMsUUFBUSxDQUFDQyxFQUFNQyxJQUFVLENBQ2hDRCxFQUFLLE1BQU0sZ0JBQWtCLEdBQUcsS0FBSyxJQUFJQyxFQUFRLEdBQUksR0FBRyxDQUFDLElBQzNELENBQUMsRUFDRCxzQkFBc0IsSUFBTSxDQUMxQkYsRUFBUyxRQUFRQyxHQUFRQSxFQUFLLFVBQVUsSUFBSSxRQUFRLENBQUMsQ0FDdkQsQ0FBQyxDQUNILENBRUEsU0FBU0UsR0FBd0IsQ0FFL0IsR0FESSxFQUFFLGtCQUFtQixZQUNyQixDQUFDLE9BQU8saUJBQW1CLFNBQVMsV0FBYSxhQUFlLFNBQVMsV0FBYSxZQUFh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c3RvbVNlcnZpY2VzIiwgImN1c3RvbVNlcnZpY2VzIiwgInNlcnZpY2UiLCAiYXBwIiwgImUiLCAiYW5pbWF0ZVRvcENhcmRzIiwgInRvcENhcmRzIiwgImNhcmQiLCAiaW5kZXgiLCAicmVnaXN0ZXJTZXJ2aWNlV29ya2VyIiwgInJlZ2lzdGVyIiwgImVycm9yIiwgIl9kYXNoYm9hcmRJbml0aWFsaXplZCIsICJpbml0aWFsaXplRGFzaGJvYXJkIiwgImxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMiLCAiZCIsICJhZGRUb3VyQnV0dG9uIiwgInNob3VsZExvYWRPbmJvYXJkaW5nIiwgImxvYWRPbmJvYXJkaW5nIiwgInMiLCAibGluayIsICJkYXRhIiwgImluaXRUb29sYmFyU2VjdGlvbnMiLCAic2VjdGlvbnMiLCAic2F2ZWQiLCAic2VjdGlvbiIsICJrZXkiLCAiaGVhZGVyIiwgImlzT3BlbiIsICJzdGF0ZSIsICJ0b3VyRG9uZSIsICJ0YXJnZXQiLCAiYnV0dG9uIiwgImNoZWNrIiwgInIiLCAicG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMiLCAiY2F0cyIsICJzZWxlY3QiLCAiY3VycmVudCIsICJwbGFjZWhvbGRlciIsICJwaCIsICJuYW1lIiwgImluZm8iLCAib3B0IiwgInRvdHBEYXRhIiwgInN0eWxlRWwiLCAiZmlsdGVyQmFyIiwgInBhbmVsIiwgInNldEJhciIsICJpZCIsICJwY3QiLCAiZWwiLCAicCIsICJmbXRQY3QiLCAidiIsICJmbXRCeXRlcyIsICJiIiwgInVuaXRzIiwgImkiLCAic2V0U2VydmljZXNDYXJkIiwgInRvdGFsIiwgInVwIiwgImMiLCAic3ViIiwgImFwcGx5SGVhbHRoU3VtbWFyeSIsICJoZWFsdGh5IiwgInVuaGVhbHRoeSIsICJmZXRjaFN0YXRzIiwgImZldGNoSGVhbHRoIiwgImFwcGx5U3RhdHMiLCAic3RhdHMiLCAiY29udGFpbmVycyIsICJjb250YWluZXJzU3ViIiwgImNwdUVsIiwgIm1lbUVsIiwgImVudHJpZXMiLCAiY3B1U3VtIiwgIm1lbVN1bSIsICJtZW1CeXRlcyIsICJjcHVDb3VudCIsICJtZW1Db3VudCIsICJjcHUiLCAibWVtIiwgImF2Z0NwdSIsICJhdmdNZW0iLCAibWVtVHh0IiwgImluRmxpZ2h0IiwgInJlZnJlc2giLCAiaGVhbHRoIiwgInN0YW1wIiwgIm5vdyIsICJkZWJ1ZyIsICJhcmdzIiwgIk1PREFMX1NFTEVDVE9SUyIsICJxdWlja1NlYXJjaE1vZGFsIiwgInF1aWNrU2VhcmNoSW5wdXQiLCAicXVpY2tTZWFyY2hSZXN1bHRzIiwgImluaXQiLCAiY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCIsICJoYW5kbGVLZXlEb3duIiwgInN0eWxlIiwgImhhbmRsZVNlYXJjaElucHV0IiwgImhhbmRsZVNlYXJjaEtleURvd24iLCAiY2xvc2VRdWlja1NlYXJjaCIsICJvcGVuUXVpY2tTZWFyY2giLCAiY2xvc2VUb3BNb2RhbCIsICJlMiIsICJzaG93RGVmYXVsdFJlc3VsdHMiLCAic2VsZWN0b3IiLCAibW9kYWwiLCAiaHRtbCIsICJnZXRTZXJ2aWNlSXRlbXMiLCAiYXR0YWNoUmVzdWx0TGlzdGVuZXJzIiwgImNhcmRzIiwgInN0YXR1cyIsICJxdWVyeSIsICJyZXN1bHRzIiwgInNlYXJjaEFsbCIsICJkaXNwbGF5U2VhcmNoUmVzdWx0cyIsICJhY3Rpb24iLCAiaXRlbSIsICJleGVjdXRlQWN0aW9uIiwgIml0ZW1zIiwgInNlbGVjdGVkIiwgInNlbGVjdGVkSW5kZXgiLCAibmV4dEluZGV4IiwgInByZXZJbmRleCIsICJvcGVuQnRuIl0KfQo= diff --git a/status/js/core/grid.js b/status/js/core/grid.js index 77ff493..28eec16 100644 --- a/status/js/core/grid.js +++ b/status/js/core/grid.js @@ -365,6 +365,9 @@ } async function refreshAll() { + // Skip if auth has been lost (e.g. TOTP gate activated externally). + // The polling interval in init.js also checks this flag. + if (window._dcAuthLost) return; if (refreshInFlight) { refreshQueued = true; return refreshInFlight; @@ -417,9 +420,21 @@ refreshInFlight = (async () => { try { const response = await fetch('/api/v1/services/status', { cache: 'no-store' }); + if (response.status === 401 || response.status === 403) { + // Auth lost — stop the polling loop and close SSE; do NOT fall + // through to direct probes (those would misleadingly mark + // services as healthy since /probe/ treats 401/403 as "up"). + window._dcAuthLost = true; + if (window._sseReconnect && window._sseClose) { + window._sseClose(); // tell SSE to stop reconnecting + } + updateStamp('auth required'); + return; // skip the fallback entirely + } if (!response.ok) { throw new Error(`Status refresh failed (${response.status})`); } + window._dcAuthLost = false; // auth working again const data = await response.json(); applyBatchResults(data.statuses || {}); updateStamp('last check', data.checkedAt || new Date()); @@ -434,9 +449,11 @@ } } finally { refreshInFlight = null; - if (refreshQueued) { + if (refreshQueued && !window._dcAuthLost) { refreshQueued = false; setTimeout(() => { window.refreshAll(); }, 0); + } else { + refreshQueued = false; } } })(); diff --git a/status/js/core/init.js b/status/js/core/init.js index bc5d6ba..a53b380 100644 --- a/status/js/core/init.js +++ b/status/js/core/init.js @@ -63,7 +63,12 @@ window.buildGrid(); animateTopCards(); window.refreshAll(); - setInterval(window.refreshAll, DC.POLL.DASHBOARD); + setInterval(() => { + // Stop polling if the session has been invalidated (e.g. TOTP gate + // now active, or user logged out). Avoids relentless 401/403 noise. + if (window._dcAuthLost) return; + window.refreshAll(); + }, DC.POLL.DASHBOARD); if (typeof window.refreshCredsButtons === 'function') window.refreshCredsButtons(); if (typeof window.refreshMonitoringWidgets === 'function') window.refreshMonitoringWidgets(); // Update auth card (may have already been updated by the auto-load IIFE but ensure it's correct) diff --git a/status/js/live-events.js b/status/js/live-events.js index 0eb8e75..a91b16c 100644 --- a/status/js/live-events.js +++ b/status/js/live-events.js @@ -3,14 +3,18 @@ let es = null; let reconnectDelay = 1000; const MAX_RECONNECT = 30000; + let _sseFailCount = 0; + let _sseManuallyClosed = false; function connect() { if (es) { try { es.close(); } catch (_) {} } + if (_sseManuallyClosed) return; // auth-lost: don't reconnect es = new EventSource('/api/v1/events/stream'); es.addEventListener('connected', () => { reconnectDelay = 1000; // reset backoff + _sseFailCount = 0; // reset failure counter debug('[SSE] Connected to event stream'); }); @@ -101,15 +105,46 @@ // Reconnect on error es.onerror = () => { es.close(); + // If auth was explicitly lost (401/403 from the polling loop), + // don't attempt reconnection at all. + if (window._dcAuthLost || _sseManuallyClosed) { + console.warn('[SSE] Auth lost — stopping reconnection'); + return; + } + // Transient failures: retry with exponential backoff, stop after 5 + _sseFailCount++; + if (_sseFailCount > 5) { + console.warn('[SSE] Max reconnect attempts reached — stopping (server unreachable)'); + return; + } console.warn(`[SSE] Disconnected, reconnecting in ${reconnectDelay / 1000}s...`); setTimeout(connect, reconnectDelay); reconnectDelay = Math.min(reconnectDelay * 2, MAX_RECONNECT); }; } + // Called by grid.js when the polling loop detects auth loss (401/403) + function closeAndStop() { + _sseManuallyClosed = true; + if (es) { try { es.close(); } catch (_) {} } + } + + // Called by totp-auth.js after a successful mid-session re-auth: + // clears the latch so connect() can proceed again and resets the + // failure backoff. (Plain _sseReconnect/connect() would early-return + // on the latch forever — the user would need a manual F5.) + function resumeAfterReauth() { + _sseManuallyClosed = false; + _sseFailCount = 0; + reconnectDelay = 1000; + connect(); + } + // Start on page load connect(); - // Expose for debugging + // Expose for debugging and cross-module coordination window._sseReconnect = connect; + window._sseClose = closeAndStop; + window._sseResume = resumeAfterReauth; })(); diff --git a/status/js/totp-auth.js b/status/js/totp-auth.js index 1f6b3f3..04a301a 100644 --- a/status/js/totp-auth.js +++ b/status/js/totp-auth.js @@ -125,6 +125,15 @@ if (typeof window.initializeDashboard === 'function') { window.initializeDashboard(); } + // Resume live updates after mid-session re-auth. The auth-loss + // handlers latched polling + SSE off when the session expired + // (grid.js sets _dcAuthLost, live-events.js latches the stream + // closed); a fresh login must clear both and reconnect, or the + // dashboard stays frozen on stale data until a manual F5. + window._dcAuthLost = false; + if (typeof window._sseResume === 'function') window._sseResume(); + else if (typeof window._sseReconnect === 'function') window._sseReconnect(); + if (typeof window.refreshAll === 'function') window.refreshAll(); } else { errorEl.textContent = data.error || 'Invalid code'; errorEl.className = 'totp-error'; diff --git a/status/sw.js b/status/sw.js index 156fd49..9cd40e6 100644 --- a/status/sw.js +++ b/status/sw.js @@ -1,4 +1,4 @@ -const CACHE = 'dashcaddy-shell-4a75cb88af'; +const CACHE = 'dashcaddy-shell-78eab743c2'; const PRECACHE = [ '/', '/index.html',