diff --git a/assets/esbuild.js b/assets/esbuild.js index 6b4ed893..dd180231 100644 --- a/assets/esbuild.js +++ b/assets/esbuild.js @@ -18,12 +18,11 @@ let opts = { target: 'es2016', outdir: '../dist/js', define: { - 'process.env.LATENCY_SIM': process.env.LATENCY_SIM || 0, + 'process.env.LATENCY_SIM': process.env.LATENCY_SIM || "0", }, } if (mode === 'watch') { opts = { - watch: true, sourcemap: 'inline', ...opts } @@ -35,13 +34,13 @@ if (mode === 'release') { } } -// Start esbuild with previously defined options -// Stop the watcher when STDIN gets closed (no zombies please!) -esbuild.build(opts).then((result) => { +;(async () => { + const context = await esbuild.context(opts) + if (mode === 'watch') { - process.stdin.pipe(process.stdout) - process.stdin.on('end', () => { result.stop() }) + context.watch() + } else { + await context.rebuild() + context.dispose() } -}).catch((error) => { - process.exit(1) -}) +})() diff --git a/assets/package-lock.json b/assets/package-lock.json index cf488e60..58f36862 100644 --- a/assets/package-lock.json +++ b/assets/package-lock.json @@ -17,7 +17,7 @@ }, "devDependencies": { "autoprefixer": "^10.4.1", - "esbuild": "^0.14.0", + "esbuild": "^0.25.0", "postcss": "^8.4.31", "tailwindcss": "^3.0.11" } @@ -128,6 +128,406 @@ "node": ">=4" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -425,338 +825,114 @@ }, "engines": { "node": ">=10" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "node_modules/delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" - }, - "node_modules/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.37", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.37.tgz", - "integrity": "sha512-XIvFB1omSAxYgHYX48sC+HR8i/p7lx7R+0cX9faElg1g++h9IilCrJ12+bQuY+d96Wp7zkBiJwMOv+AhLtLrTg==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/esbuild": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.10.tgz", - "integrity": "sha512-ibZb+NwFqBwHHJlpnFMtg4aNmVK+LUtYMFC9CuKs6lDCBEvCHpqCFZFEirpqt1jOugwKGx8gALNGvX56lQyfew==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "optionalDependencies": { - "esbuild-android-arm64": "0.14.10", - "esbuild-darwin-64": "0.14.10", - "esbuild-darwin-arm64": "0.14.10", - "esbuild-freebsd-64": "0.14.10", - "esbuild-freebsd-arm64": "0.14.10", - "esbuild-linux-32": "0.14.10", - "esbuild-linux-64": "0.14.10", - "esbuild-linux-arm": "0.14.10", - "esbuild-linux-arm64": "0.14.10", - "esbuild-linux-mips64le": "0.14.10", - "esbuild-linux-ppc64le": "0.14.10", - "esbuild-linux-s390x": "0.14.10", - "esbuild-netbsd-64": "0.14.10", - "esbuild-openbsd-64": "0.14.10", - "esbuild-sunos-64": "0.14.10", - "esbuild-windows-32": "0.14.10", - "esbuild-windows-64": "0.14.10", - "esbuild-windows-arm64": "0.14.10" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.10.tgz", - "integrity": "sha512-vzkTafHKoiMX4uIN1kBnE/HXYLpNT95EgGanVk6DHGeYgDolU0NBxjO7yZpq4ZGFPOx8384eAdDrBYhO11TAlQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.10.tgz", - "integrity": "sha512-DJwzFVB95ZV7C3PQbf052WqaUuuMFXJeZJ0LKdnP1w+QOU0rlbKfX0tzuhoS//rOXUj1TFIwRuRsd0FX6skR7A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.10.tgz", - "integrity": "sha512-RNaaoZDg3nsqs5z56vYCjk/VJ76npf752W0rOaCl5lO5TsgV9zecfdYgt7dtUrIx8b7APhVaNYud+tGsDOVC9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.10.tgz", - "integrity": "sha512-10B3AzW894u6bGZZhWiJOHw1uEHb4AFbUuBdyml1Ht0vIqd+KqWW+iY/yMwQAzILr2WJZqEhbOXRkJtY8aRqOw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.10.tgz", - "integrity": "sha512-mSQrKB7UaWvuryBTCo9leOfY2uEUSimAvcKIaUWbk5Hth9Sg+Try+qNA/NibPgs/vHkX0KFo/Rce6RPea+P15g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.10.tgz", - "integrity": "sha512-lktF09JgJLZ63ANYHIPdYe339PDuVn19Q/FcGKkXWf+jSPkn5xkYzAabboNGZNUgNqSJ/vY7VrOn6UrBbJjgYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.10.tgz", - "integrity": "sha512-K+gCQz2oLIIBI8ZM77e9sYD5/DwEpeYCrOQ2SYXx+R4OU2CT9QjJDi4/OpE7ko4AcYMlMW7qrOCuLSgAlEj4Wg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.10.tgz", - "integrity": "sha512-BYa60dZ/KPmNKYxtHa3LSEdfKWHcm/RzP0MjB4AeBPhjS0D6/okhaBesZIY9kVIGDyeenKsJNOmnVt4+dhNnvQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.10.tgz", - "integrity": "sha512-+qocQuQvcp5wo/V+OLXxqHPc+gxHttJEvbU/xrCGE03vIMqraL4wMua8JQx0SWEnJCWP+Nhf//v8OSwz1Xr5kA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.10.tgz", - "integrity": "sha512-nmUd2xoBXpGo4NJCEWoaBj+n4EtDoLEvEYc8Z3aSJrY0Oa6s04czD1flmhd0I/d6QEU8b7GQ9U0g/rtBfhtxBg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + } }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.10.tgz", - "integrity": "sha512-vsOWZjm0rZix7HSmqwPph9arRVCyPtUpcURdayQDuIhMG2/UxJxpbdRaa//w4zYqcJzAWwuyH2PAlyy0ZNuxqQ==", - "cpu": [ - "ppc64" - ], + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.10.tgz", - "integrity": "sha512-knArKKZm0ypIYWOWyOT7+accVwbVV1LZnl2FWWy05u9Tyv5oqJ2F5+X2Vqe/gqd61enJXQWqoufXopvG3zULOg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.10.tgz", - "integrity": "sha512-6Gg8neVcLeyq0yt9bZpReb8ntZ8LBEjthxrcYWVrBElcltnDjIy1hrzsujt0+sC2rL+TlSsE9dzgyuvlDdPp2w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ] + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.10.tgz", - "integrity": "sha512-9rkHZzp10zI90CfKbFrwmQjqZaeDmyQ6s9/hvCwRkbOCHuto6RvMYH9ghQpcr5cUxD5OQIA+sHXi0zokRNXjcg==", - "cpu": [ - "x64" - ], + "node_modules/detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ] + "dependencies": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.10.tgz", - "integrity": "sha512-mEU+pqkhkhbwpJj5DiN3vL0GUFR/yrL3qj8ER1amIVyRibKbj02VM1QaIuk1sy5DRVIKiFXXgCaHvH3RNWCHIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ] + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true }, - "node_modules/esbuild-windows-32": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.10.tgz", - "integrity": "sha512-Z5DieUL1N6s78dOSdL95KWf8Y89RtPGxIoMF+LEy8ChDsX+pZpz6uAVCn+YaWpqQXO+2TnrcbgBIoprq2Mco1g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true }, - "node_modules/esbuild-windows-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.10.tgz", - "integrity": "sha512-LE5Mm62y0Bilu7RDryBhHIX8rK3at5VwJ6IGM3BsASidCfOBTzqcs7Yy0/Vkq39VKeTmy9/66BAfVoZRNznoDw==", - "cpu": [ - "x64" - ], + "node_modules/electron-to-chromium": { + "version": "1.4.37", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.37.tgz", + "integrity": "sha512-XIvFB1omSAxYgHYX48sC+HR8i/p7lx7R+0cX9faElg1g++h9IilCrJ12+bQuY+d96Wp7zkBiJwMOv+AhLtLrTg==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "is-arrayish": "^0.2.1" + } }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.10.tgz", - "integrity": "sha512-OJOyxDtabvcUYTc+O4dR0JMzLBz6G9+gXIHA7Oc5d5Fv1xiYa0nUeo8+W5s2e6ZkPRdIwOseYoL70rZz80S5BA==", - "cpu": [ - "arm64" - ], + "node_modules/esbuild": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" + } }, "node_modules/escalade": { "version": "3.1.1", @@ -1577,6 +1753,181 @@ } } }, + "@esbuild/aix-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", + "dev": true, + "optional": true + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1848,156 +2199,37 @@ } }, "esbuild": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.10.tgz", - "integrity": "sha512-ibZb+NwFqBwHHJlpnFMtg4aNmVK+LUtYMFC9CuKs6lDCBEvCHpqCFZFEirpqt1jOugwKGx8gALNGvX56lQyfew==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, "requires": { - "esbuild-android-arm64": "0.14.10", - "esbuild-darwin-64": "0.14.10", - "esbuild-darwin-arm64": "0.14.10", - "esbuild-freebsd-64": "0.14.10", - "esbuild-freebsd-arm64": "0.14.10", - "esbuild-linux-32": "0.14.10", - "esbuild-linux-64": "0.14.10", - "esbuild-linux-arm": "0.14.10", - "esbuild-linux-arm64": "0.14.10", - "esbuild-linux-mips64le": "0.14.10", - "esbuild-linux-ppc64le": "0.14.10", - "esbuild-linux-s390x": "0.14.10", - "esbuild-netbsd-64": "0.14.10", - "esbuild-openbsd-64": "0.14.10", - "esbuild-sunos-64": "0.14.10", - "esbuild-windows-32": "0.14.10", - "esbuild-windows-64": "0.14.10", - "esbuild-windows-arm64": "0.14.10" - } - }, - "esbuild-android-arm64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.10.tgz", - "integrity": "sha512-vzkTafHKoiMX4uIN1kBnE/HXYLpNT95EgGanVk6DHGeYgDolU0NBxjO7yZpq4ZGFPOx8384eAdDrBYhO11TAlQ==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.10.tgz", - "integrity": "sha512-DJwzFVB95ZV7C3PQbf052WqaUuuMFXJeZJ0LKdnP1w+QOU0rlbKfX0tzuhoS//rOXUj1TFIwRuRsd0FX6skR7A==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.10.tgz", - "integrity": "sha512-RNaaoZDg3nsqs5z56vYCjk/VJ76npf752W0rOaCl5lO5TsgV9zecfdYgt7dtUrIx8b7APhVaNYud+tGsDOVC9g==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.10.tgz", - "integrity": "sha512-10B3AzW894u6bGZZhWiJOHw1uEHb4AFbUuBdyml1Ht0vIqd+KqWW+iY/yMwQAzILr2WJZqEhbOXRkJtY8aRqOw==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.10.tgz", - "integrity": "sha512-mSQrKB7UaWvuryBTCo9leOfY2uEUSimAvcKIaUWbk5Hth9Sg+Try+qNA/NibPgs/vHkX0KFo/Rce6RPea+P15g==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.10.tgz", - "integrity": "sha512-lktF09JgJLZ63ANYHIPdYe339PDuVn19Q/FcGKkXWf+jSPkn5xkYzAabboNGZNUgNqSJ/vY7VrOn6UrBbJjgYA==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.10.tgz", - "integrity": "sha512-K+gCQz2oLIIBI8ZM77e9sYD5/DwEpeYCrOQ2SYXx+R4OU2CT9QjJDi4/OpE7ko4AcYMlMW7qrOCuLSgAlEj4Wg==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.10.tgz", - "integrity": "sha512-BYa60dZ/KPmNKYxtHa3LSEdfKWHcm/RzP0MjB4AeBPhjS0D6/okhaBesZIY9kVIGDyeenKsJNOmnVt4+dhNnvQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.10.tgz", - "integrity": "sha512-+qocQuQvcp5wo/V+OLXxqHPc+gxHttJEvbU/xrCGE03vIMqraL4wMua8JQx0SWEnJCWP+Nhf//v8OSwz1Xr5kA==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.10.tgz", - "integrity": "sha512-nmUd2xoBXpGo4NJCEWoaBj+n4EtDoLEvEYc8Z3aSJrY0Oa6s04czD1flmhd0I/d6QEU8b7GQ9U0g/rtBfhtxBg==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.10.tgz", - "integrity": "sha512-vsOWZjm0rZix7HSmqwPph9arRVCyPtUpcURdayQDuIhMG2/UxJxpbdRaa//w4zYqcJzAWwuyH2PAlyy0ZNuxqQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.10.tgz", - "integrity": "sha512-knArKKZm0ypIYWOWyOT7+accVwbVV1LZnl2FWWy05u9Tyv5oqJ2F5+X2Vqe/gqd61enJXQWqoufXopvG3zULOg==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.10.tgz", - "integrity": "sha512-6Gg8neVcLeyq0yt9bZpReb8ntZ8LBEjthxrcYWVrBElcltnDjIy1hrzsujt0+sC2rL+TlSsE9dzgyuvlDdPp2w==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.10.tgz", - "integrity": "sha512-9rkHZzp10zI90CfKbFrwmQjqZaeDmyQ6s9/hvCwRkbOCHuto6RvMYH9ghQpcr5cUxD5OQIA+sHXi0zokRNXjcg==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.10.tgz", - "integrity": "sha512-mEU+pqkhkhbwpJj5DiN3vL0GUFR/yrL3qj8ER1amIVyRibKbj02VM1QaIuk1sy5DRVIKiFXXgCaHvH3RNWCHIw==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.10.tgz", - "integrity": "sha512-Z5DieUL1N6s78dOSdL95KWf8Y89RtPGxIoMF+LEy8ChDsX+pZpz6uAVCn+YaWpqQXO+2TnrcbgBIoprq2Mco1g==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.10.tgz", - "integrity": "sha512-LE5Mm62y0Bilu7RDryBhHIX8rK3at5VwJ6IGM3BsASidCfOBTzqcs7Yy0/Vkq39VKeTmy9/66BAfVoZRNznoDw==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.10.tgz", - "integrity": "sha512-OJOyxDtabvcUYTc+O4dR0JMzLBz6G9+gXIHA7Oc5d5Fv1xiYa0nUeo8+W5s2e6ZkPRdIwOseYoL70rZz80S5BA==", - "dev": true, - "optional": true + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" + } }, "escalade": { "version": "3.1.1", diff --git a/assets/package.json b/assets/package.json index 646a953e..2123e6fb 100644 --- a/assets/package.json +++ b/assets/package.json @@ -17,7 +17,7 @@ }, "devDependencies": { "autoprefixer": "^10.4.1", - "esbuild": "^0.14.0", + "esbuild": "^0.25.0", "postcss": "^8.4.31", "tailwindcss": "^3.0.11" } diff --git a/dist/js/app.js b/dist/js/app.js index 7d4f2988..212ebe22 100644 --- a/dist/js/app.js +++ b/dist/js/app.js @@ -22,21 +22,25 @@ return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; - var __reExport = (target, module, copyDefault, desc) => { - if (module && typeof module === "object" || typeof module === "function") { - for (let key of __getOwnPropNames(module)) - if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default")) - __defProp(target, key, { get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable }); + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } - return target; - }; - var __toESM = (module, isNodeMode) => { - return __reExport(__markAsModule(__defProp(module != null ? __create(__getProtoOf(module)) : {}, "default", !isNodeMode && module && module.__esModule ? { get: () => module.default, enumerable: true } : { value: module, enumerable: true })), module); + return to; }; + var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod + )); // node_modules/clipboard/dist/clipboard.js var require_clipboard = __commonJS({ @@ -51,558 +55,637 @@ else root["ClipboardJS"] = factory(); })(exports, function() { - return function() { - var __webpack_modules__ = { - 686: function(__unused_webpack_module, __webpack_exports__, __webpack_require__2) { - "use strict"; - __webpack_require__2.d(__webpack_exports__, { - "default": function() { - return clipboard; - } - }); - var tiny_emitter = __webpack_require__2(279); - var tiny_emitter_default = /* @__PURE__ */ __webpack_require__2.n(tiny_emitter); - var listen = __webpack_require__2(370); - var listen_default = /* @__PURE__ */ __webpack_require__2.n(listen); - var src_select = __webpack_require__2(817); - var select_default = /* @__PURE__ */ __webpack_require__2.n(src_select); - ; - function command(type) { - try { - return document.execCommand(type); - } catch (err) { - return false; - } - } - ; - var ClipboardActionCut = function ClipboardActionCut2(target) { - var selectedText = select_default()(target); - command("cut"); - return selectedText; - }; - var actions_cut = ClipboardActionCut; - ; - function createFakeElement(value) { - var isRTL = document.documentElement.getAttribute("dir") === "rtl"; - var fakeElement = document.createElement("textarea"); - fakeElement.style.fontSize = "12pt"; - fakeElement.style.border = "0"; - fakeElement.style.padding = "0"; - fakeElement.style.margin = "0"; - fakeElement.style.position = "absolute"; - fakeElement.style[isRTL ? "right" : "left"] = "-9999px"; - var yPosition = window.pageYOffset || document.documentElement.scrollTop; - fakeElement.style.top = "".concat(yPosition, "px"); - fakeElement.setAttribute("readonly", ""); - fakeElement.value = value; - return fakeElement; - } - ; - var ClipboardActionCopy = function ClipboardActionCopy2(target) { - var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : { - container: document.body - }; - var selectedText = ""; - if (typeof target === "string") { - var fakeElement = createFakeElement(target); - options.container.appendChild(fakeElement); - selectedText = select_default()(fakeElement); - command("copy"); - fakeElement.remove(); - } else { - selectedText = select_default()(target); - command("copy"); - } - return selectedText; - }; - var actions_copy = ClipboardActionCopy; - ; - function _typeof(obj) { - "@babel/helpers - typeof"; - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function _typeof2(obj2) { - return typeof obj2; - }; - } else { - _typeof = function _typeof2(obj2) { - return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; - }; - } - return _typeof(obj); - } - var ClipboardActionDefault = function ClipboardActionDefault2() { - var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; - var _options$action = options.action, action = _options$action === void 0 ? "copy" : _options$action, container = options.container, target = options.target, text = options.text; - if (action !== "copy" && action !== "cut") { - throw new Error('Invalid "action" value, use either "copy" or "cut"'); - } - if (target !== void 0) { - if (target && _typeof(target) === "object" && target.nodeType === 1) { - if (action === "copy" && target.hasAttribute("disabled")) { - throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); + return ( + /******/ + function() { + var __webpack_modules__ = { + /***/ + 686: ( + /***/ + function(__unused_webpack_module, __webpack_exports__, __webpack_require__2) { + "use strict"; + __webpack_require__2.d(__webpack_exports__, { + "default": function() { + return ( + /* binding */ + clipboard + ); } - if (action === "cut" && (target.hasAttribute("readonly") || target.hasAttribute("disabled"))) { - throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`); + }); + var tiny_emitter = __webpack_require__2(279); + var tiny_emitter_default = /* @__PURE__ */ __webpack_require__2.n(tiny_emitter); + var listen = __webpack_require__2(370); + var listen_default = /* @__PURE__ */ __webpack_require__2.n(listen); + var src_select = __webpack_require__2(817); + var select_default = /* @__PURE__ */ __webpack_require__2.n(src_select); + ; + function command(type) { + try { + return document.execCommand(type); + } catch (err) { + return false; } - } else { - throw new Error('Invalid "target" value, use a valid Element'); } - } - if (text) { - return actions_copy(text, { - container - }); - } - if (target) { - return action === "cut" ? actions_cut(target) : actions_copy(target, { - container - }); - } - }; - var actions_default = ClipboardActionDefault; - ; - function clipboard_typeof(obj) { - "@babel/helpers - typeof"; - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - clipboard_typeof = function _typeof2(obj2) { - return typeof obj2; + ; + var ClipboardActionCut = function ClipboardActionCut2(target) { + var selectedText = select_default()(target); + command("cut"); + return selectedText; }; - } else { - clipboard_typeof = function _typeof2(obj2) { - return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; + var actions_cut = ClipboardActionCut; + ; + function createFakeElement(value) { + var isRTL = document.documentElement.getAttribute("dir") === "rtl"; + var fakeElement = document.createElement("textarea"); + fakeElement.style.fontSize = "12pt"; + fakeElement.style.border = "0"; + fakeElement.style.padding = "0"; + fakeElement.style.margin = "0"; + fakeElement.style.position = "absolute"; + fakeElement.style[isRTL ? "right" : "left"] = "-9999px"; + var yPosition = window.pageYOffset || document.documentElement.scrollTop; + fakeElement.style.top = "".concat(yPosition, "px"); + fakeElement.setAttribute("readonly", ""); + fakeElement.value = value; + return fakeElement; + } + ; + var ClipboardActionCopy = function ClipboardActionCopy2(target) { + var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : { + container: document.body + }; + var selectedText = ""; + if (typeof target === "string") { + var fakeElement = createFakeElement(target); + options.container.appendChild(fakeElement); + selectedText = select_default()(fakeElement); + command("copy"); + fakeElement.remove(); + } else { + selectedText = select_default()(target); + command("copy"); + } + return selectedText; }; - } - return clipboard_typeof(obj); - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) - descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) - _defineProperties(Constructor.prototype, protoProps); - if (staticProps) - _defineProperties(Constructor, staticProps); - return Constructor; - } - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); - if (superClass) - _setPrototypeOf(subClass, superClass); - } - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { - o2.__proto__ = p2; - return o2; - }; - return _setPrototypeOf(o, p); - } - function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), result; - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); + var actions_copy = ClipboardActionCopy; + ; + function _typeof(obj) { + "@babel/helpers - typeof"; + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function _typeof2(obj2) { + return typeof obj2; + }; + } else { + _typeof = function _typeof2(obj2) { + return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; + }; + } + return _typeof(obj); } - return _possibleConstructorReturn(this, result); - }; - } - function _possibleConstructorReturn(self2, call) { - if (call && (clipboard_typeof(call) === "object" || typeof call === "function")) { - return call; - } - return _assertThisInitialized(self2); - } - function _assertThisInitialized(self2) { - if (self2 === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - return self2; - } - function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) - return false; - if (Reflect.construct.sham) - return false; - if (typeof Proxy === "function") - return true; - try { - Date.prototype.toString.call(Reflect.construct(Date, [], function() { - })); - return true; - } catch (e) { - return false; - } - } - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) { - return o2.__proto__ || Object.getPrototypeOf(o2); - }; - return _getPrototypeOf(o); - } - function getAttributeValue(suffix, element) { - var attribute = "data-clipboard-".concat(suffix); - if (!element.hasAttribute(attribute)) { - return; - } - return element.getAttribute(attribute); - } - var Clipboard = /* @__PURE__ */ function(_Emitter) { - _inherits(Clipboard2, _Emitter); - var _super = _createSuper(Clipboard2); - function Clipboard2(trigger, options) { - var _this; - _classCallCheck(this, Clipboard2); - _this = _super.call(this); - _this.resolveOptions(options); - _this.listenClick(trigger); - return _this; - } - _createClass(Clipboard2, [{ - key: "resolveOptions", - value: function resolveOptions() { + var ClipboardActionDefault = function ClipboardActionDefault2() { var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; - this.action = typeof options.action === "function" ? options.action : this.defaultAction; - this.target = typeof options.target === "function" ? options.target : this.defaultTarget; - this.text = typeof options.text === "function" ? options.text : this.defaultText; - this.container = clipboard_typeof(options.container) === "object" ? options.container : document.body; - } - }, { - key: "listenClick", - value: function listenClick(trigger) { - var _this2 = this; - this.listener = listen_default()(trigger, "click", function(e) { - return _this2.onClick(e); - }); - } - }, { - key: "onClick", - value: function onClick(e) { - var trigger = e.delegateTarget || e.currentTarget; - var action = this.action(trigger) || "copy"; - var text = actions_default({ - action, - container: this.container, - target: this.target(trigger), - text: this.text(trigger) - }); - this.emit(text ? "success" : "error", { - action, - text, - trigger, - clearSelection: function clearSelection() { - if (trigger) { - trigger.focus(); + var _options$action = options.action, action = _options$action === void 0 ? "copy" : _options$action, container = options.container, target = options.target, text = options.text; + if (action !== "copy" && action !== "cut") { + throw new Error('Invalid "action" value, use either "copy" or "cut"'); + } + if (target !== void 0) { + if (target && _typeof(target) === "object" && target.nodeType === 1) { + if (action === "copy" && target.hasAttribute("disabled")) { + throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); + } + if (action === "cut" && (target.hasAttribute("readonly") || target.hasAttribute("disabled"))) { + throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`); } - document.activeElement.blur(); - window.getSelection().removeAllRanges(); + } else { + throw new Error('Invalid "target" value, use a valid Element'); } - }); + } + if (text) { + return actions_copy(text, { + container + }); + } + if (target) { + return action === "cut" ? actions_cut(target) : actions_copy(target, { + container + }); + } + }; + var actions_default = ClipboardActionDefault; + ; + function clipboard_typeof(obj) { + "@babel/helpers - typeof"; + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + clipboard_typeof = function _typeof2(obj2) { + return typeof obj2; + }; + } else { + clipboard_typeof = function _typeof2(obj2) { + return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; + }; + } + return clipboard_typeof(obj); } - }, { - key: "defaultAction", - value: function defaultAction(trigger) { - return getAttributeValue("action", trigger); + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } } - }, { - key: "defaultTarget", - value: function defaultTarget(trigger) { - var selector = getAttributeValue("target", trigger); - if (selector) { - return document.querySelector(selector); + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); } } - }, { - key: "defaultText", - value: function defaultText(trigger) { - return getAttributeValue("text", trigger); + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; } - }, { - key: "destroy", - value: function destroy() { - this.listener.destroy(); + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); + if (superClass) _setPrototypeOf(subClass, superClass); } - }], [{ - key: "copy", - value: function copy(target) { - var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : { - container: document.body + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); }; - return actions_copy(target, options); } - }, { - key: "cut", - value: function cut(target) { - return actions_cut(target); + function _possibleConstructorReturn(self2, call) { + if (call && (clipboard_typeof(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized(self2); } - }, { - key: "isSupported", - value: function isSupported() { - var action = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ["copy", "cut"]; - var actions = typeof action === "string" ? [action] : action; - var support = !!document.queryCommandSupported; - actions.forEach(function(action2) { - support = support && !!document.queryCommandSupported(action2); - }); - return support; + function _assertThisInitialized(self2) { + if (self2 === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self2; } - }]); - return Clipboard2; - }(tiny_emitter_default()); - var clipboard = Clipboard; - }, - 828: function(module2) { - var DOCUMENT_NODE_TYPE = 9; - if (typeof Element !== "undefined" && !Element.prototype.matches) { - var proto = Element.prototype; - proto.matches = proto.matchesSelector || proto.mozMatchesSelector || proto.msMatchesSelector || proto.oMatchesSelector || proto.webkitMatchesSelector; - } - function closest(element, selector) { - while (element && element.nodeType !== DOCUMENT_NODE_TYPE) { - if (typeof element.matches === "function" && element.matches(selector)) { - return element; + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function() { + })); + return true; + } catch (e) { + return false; + } } - element = element.parentNode; - } - } - module2.exports = closest; - }, - 438: function(module2, __unused_webpack_exports, __webpack_require__2) { - var closest = __webpack_require__2(828); - function _delegate(element, selector, type, callback, useCapture) { - var listenerFn = listener.apply(this, arguments); - element.addEventListener(type, listenerFn, useCapture); - return { - destroy: function() { - element.removeEventListener(type, listenerFn, useCapture); + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) { + return o2.__proto__ || Object.getPrototypeOf(o2); + }; + return _getPrototypeOf(o); } - }; - } - function delegate(elements, selector, type, callback, useCapture) { - if (typeof elements.addEventListener === "function") { - return _delegate.apply(null, arguments); - } - if (typeof type === "function") { - return _delegate.bind(null, document).apply(null, arguments); - } - if (typeof elements === "string") { - elements = document.querySelectorAll(elements); - } - return Array.prototype.map.call(elements, function(element) { - return _delegate(element, selector, type, callback, useCapture); - }); - } - function listener(element, selector, type, callback) { - return function(e) { - e.delegateTarget = closest(e.target, selector); - if (e.delegateTarget) { - callback.call(element, e); + function getAttributeValue(suffix, element) { + var attribute = "data-clipboard-".concat(suffix); + if (!element.hasAttribute(attribute)) { + return; + } + return element.getAttribute(attribute); } - }; - } - module2.exports = delegate; - }, - 879: function(__unused_webpack_module, exports2) { - exports2.node = function(value) { - return value !== void 0 && value instanceof HTMLElement && value.nodeType === 1; - }; - exports2.nodeList = function(value) { - var type = Object.prototype.toString.call(value); - return value !== void 0 && (type === "[object NodeList]" || type === "[object HTMLCollection]") && "length" in value && (value.length === 0 || exports2.node(value[0])); - }; - exports2.string = function(value) { - return typeof value === "string" || value instanceof String; - }; - exports2.fn = function(value) { - var type = Object.prototype.toString.call(value); - return type === "[object Function]"; - }; - }, - 370: function(module2, __unused_webpack_exports, __webpack_require__2) { - var is = __webpack_require__2(879); - var delegate = __webpack_require__2(438); - function listen(target, type, callback) { - if (!target && !type && !callback) { - throw new Error("Missing required arguments"); + var Clipboard = /* @__PURE__ */ function(_Emitter) { + _inherits(Clipboard2, _Emitter); + var _super = _createSuper(Clipboard2); + function Clipboard2(trigger, options) { + var _this; + _classCallCheck(this, Clipboard2); + _this = _super.call(this); + _this.resolveOptions(options); + _this.listenClick(trigger); + return _this; + } + _createClass(Clipboard2, [{ + key: "resolveOptions", + value: function resolveOptions() { + var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; + this.action = typeof options.action === "function" ? options.action : this.defaultAction; + this.target = typeof options.target === "function" ? options.target : this.defaultTarget; + this.text = typeof options.text === "function" ? options.text : this.defaultText; + this.container = clipboard_typeof(options.container) === "object" ? options.container : document.body; + } + /** + * Adds a click event listener to the passed trigger. + * @param {String|HTMLElement|HTMLCollection|NodeList} trigger + */ + }, { + key: "listenClick", + value: function listenClick(trigger) { + var _this2 = this; + this.listener = listen_default()(trigger, "click", function(e) { + return _this2.onClick(e); + }); + } + /** + * Defines a new `ClipboardAction` on each click event. + * @param {Event} e + */ + }, { + key: "onClick", + value: function onClick(e) { + var trigger = e.delegateTarget || e.currentTarget; + var action = this.action(trigger) || "copy"; + var text = actions_default({ + action, + container: this.container, + target: this.target(trigger), + text: this.text(trigger) + }); + this.emit(text ? "success" : "error", { + action, + text, + trigger, + clearSelection: function clearSelection() { + if (trigger) { + trigger.focus(); + } + document.activeElement.blur(); + window.getSelection().removeAllRanges(); + } + }); + } + /** + * Default `action` lookup function. + * @param {Element} trigger + */ + }, { + key: "defaultAction", + value: function defaultAction(trigger) { + return getAttributeValue("action", trigger); + } + /** + * Default `target` lookup function. + * @param {Element} trigger + */ + }, { + key: "defaultTarget", + value: function defaultTarget(trigger) { + var selector = getAttributeValue("target", trigger); + if (selector) { + return document.querySelector(selector); + } + } + /** + * Allow fire programmatically a copy action + * @param {String|HTMLElement} target + * @param {Object} options + * @returns Text copied. + */ + }, { + key: "defaultText", + /** + * Default `text` lookup function. + * @param {Element} trigger + */ + value: function defaultText(trigger) { + return getAttributeValue("text", trigger); + } + /** + * Destroy lifecycle. + */ + }, { + key: "destroy", + value: function destroy() { + this.listener.destroy(); + } + }], [{ + key: "copy", + value: function copy(target) { + var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : { + container: document.body + }; + return actions_copy(target, options); + } + /** + * Allow fire programmatically a cut action + * @param {String|HTMLElement} target + * @returns Text cutted. + */ + }, { + key: "cut", + value: function cut(target) { + return actions_cut(target); + } + /** + * Returns the support of the given action, or all actions if no action is + * given. + * @param {String} [action] + */ + }, { + key: "isSupported", + value: function isSupported() { + var action = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ["copy", "cut"]; + var actions = typeof action === "string" ? [action] : action; + var support = !!document.queryCommandSupported; + actions.forEach(function(action2) { + support = support && !!document.queryCommandSupported(action2); + }); + return support; + } + }]); + return Clipboard2; + }(tiny_emitter_default()); + var clipboard = Clipboard; } - if (!is.string(type)) { - throw new TypeError("Second argument must be a String"); + ), + /***/ + 828: ( + /***/ + function(module2) { + var DOCUMENT_NODE_TYPE = 9; + if (typeof Element !== "undefined" && !Element.prototype.matches) { + var proto = Element.prototype; + proto.matches = proto.matchesSelector || proto.mozMatchesSelector || proto.msMatchesSelector || proto.oMatchesSelector || proto.webkitMatchesSelector; + } + function closest(element, selector) { + while (element && element.nodeType !== DOCUMENT_NODE_TYPE) { + if (typeof element.matches === "function" && element.matches(selector)) { + return element; + } + element = element.parentNode; + } + } + module2.exports = closest; } - if (!is.fn(callback)) { - throw new TypeError("Third argument must be a Function"); + ), + /***/ + 438: ( + /***/ + function(module2, __unused_webpack_exports, __webpack_require__2) { + var closest = __webpack_require__2(828); + function _delegate(element, selector, type, callback, useCapture) { + var listenerFn = listener.apply(this, arguments); + element.addEventListener(type, listenerFn, useCapture); + return { + destroy: function() { + element.removeEventListener(type, listenerFn, useCapture); + } + }; + } + function delegate(elements, selector, type, callback, useCapture) { + if (typeof elements.addEventListener === "function") { + return _delegate.apply(null, arguments); + } + if (typeof type === "function") { + return _delegate.bind(null, document).apply(null, arguments); + } + if (typeof elements === "string") { + elements = document.querySelectorAll(elements); + } + return Array.prototype.map.call(elements, function(element) { + return _delegate(element, selector, type, callback, useCapture); + }); + } + function listener(element, selector, type, callback) { + return function(e) { + e.delegateTarget = closest(e.target, selector); + if (e.delegateTarget) { + callback.call(element, e); + } + }; + } + module2.exports = delegate; } - if (is.node(target)) { - return listenNode(target, type, callback); - } else if (is.nodeList(target)) { - return listenNodeList(target, type, callback); - } else if (is.string(target)) { - return listenSelector(target, type, callback); - } else { - throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList"); + ), + /***/ + 879: ( + /***/ + function(__unused_webpack_module, exports2) { + exports2.node = function(value) { + return value !== void 0 && value instanceof HTMLElement && value.nodeType === 1; + }; + exports2.nodeList = function(value) { + var type = Object.prototype.toString.call(value); + return value !== void 0 && (type === "[object NodeList]" || type === "[object HTMLCollection]") && "length" in value && (value.length === 0 || exports2.node(value[0])); + }; + exports2.string = function(value) { + return typeof value === "string" || value instanceof String; + }; + exports2.fn = function(value) { + var type = Object.prototype.toString.call(value); + return type === "[object Function]"; + }; } - } - function listenNode(node, type, callback) { - node.addEventListener(type, callback); - return { - destroy: function() { - node.removeEventListener(type, callback); + ), + /***/ + 370: ( + /***/ + function(module2, __unused_webpack_exports, __webpack_require__2) { + var is = __webpack_require__2(879); + var delegate = __webpack_require__2(438); + function listen(target, type, callback) { + if (!target && !type && !callback) { + throw new Error("Missing required arguments"); + } + if (!is.string(type)) { + throw new TypeError("Second argument must be a String"); + } + if (!is.fn(callback)) { + throw new TypeError("Third argument must be a Function"); + } + if (is.node(target)) { + return listenNode(target, type, callback); + } else if (is.nodeList(target)) { + return listenNodeList(target, type, callback); + } else if (is.string(target)) { + return listenSelector(target, type, callback); + } else { + throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList"); + } } - }; - } - function listenNodeList(nodeList, type, callback) { - Array.prototype.forEach.call(nodeList, function(node) { - node.addEventListener(type, callback); - }); - return { - destroy: function() { + function listenNode(node, type, callback) { + node.addEventListener(type, callback); + return { + destroy: function() { + node.removeEventListener(type, callback); + } + }; + } + function listenNodeList(nodeList, type, callback) { Array.prototype.forEach.call(nodeList, function(node) { - node.removeEventListener(type, callback); + node.addEventListener(type, callback); }); + return { + destroy: function() { + Array.prototype.forEach.call(nodeList, function(node) { + node.removeEventListener(type, callback); + }); + } + }; } - }; - } - function listenSelector(selector, type, callback) { - return delegate(document.body, selector, type, callback); - } - module2.exports = listen; - }, - 817: function(module2) { - function select(element) { - var selectedText; - if (element.nodeName === "SELECT") { - element.focus(); - selectedText = element.value; - } else if (element.nodeName === "INPUT" || element.nodeName === "TEXTAREA") { - var isReadOnly = element.hasAttribute("readonly"); - if (!isReadOnly) { - element.setAttribute("readonly", ""); + function listenSelector(selector, type, callback) { + return delegate(document.body, selector, type, callback); } - element.select(); - element.setSelectionRange(0, element.value.length); - if (!isReadOnly) { - element.removeAttribute("readonly"); + module2.exports = listen; + } + ), + /***/ + 817: ( + /***/ + function(module2) { + function select(element) { + var selectedText; + if (element.nodeName === "SELECT") { + element.focus(); + selectedText = element.value; + } else if (element.nodeName === "INPUT" || element.nodeName === "TEXTAREA") { + var isReadOnly = element.hasAttribute("readonly"); + if (!isReadOnly) { + element.setAttribute("readonly", ""); + } + element.select(); + element.setSelectionRange(0, element.value.length); + if (!isReadOnly) { + element.removeAttribute("readonly"); + } + selectedText = element.value; + } else { + if (element.hasAttribute("contenteditable")) { + element.focus(); + } + var selection = window.getSelection(); + var range2 = document.createRange(); + range2.selectNodeContents(element); + selection.removeAllRanges(); + selection.addRange(range2); + selectedText = selection.toString(); + } + return selectedText; } - selectedText = element.value; - } else { - if (element.hasAttribute("contenteditable")) { - element.focus(); + module2.exports = select; + } + ), + /***/ + 279: ( + /***/ + function(module2) { + function E() { } - var selection = window.getSelection(); - var range2 = document.createRange(); - range2.selectNodeContents(element); - selection.removeAllRanges(); - selection.addRange(range2); - selectedText = selection.toString(); + E.prototype = { + on: function(name, callback, ctx) { + var e = this.e || (this.e = {}); + (e[name] || (e[name] = [])).push({ + fn: callback, + ctx + }); + return this; + }, + once: function(name, callback, ctx) { + var self2 = this; + function listener() { + self2.off(name, listener); + callback.apply(ctx, arguments); + } + ; + listener._ = callback; + return this.on(name, listener, ctx); + }, + emit: function(name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + return this; + }, + off: function(name, callback) { + var e = this.e || (this.e = {}); + var evts = e[name]; + var liveEvents = []; + if (evts && callback) { + for (var i = 0, len = evts.length; i < len; i++) { + if (evts[i].fn !== callback && evts[i].fn._ !== callback) + liveEvents.push(evts[i]); + } + } + liveEvents.length ? e[name] = liveEvents : delete e[name]; + return this; + } + }; + module2.exports = E; + module2.exports.TinyEmitter = E; } - return selectedText; - } - module2.exports = select; - }, - 279: function(module2) { - function E() { + ) + /******/ + }; + var __webpack_module_cache__ = {}; + function __webpack_require__(moduleId) { + if (__webpack_module_cache__[moduleId]) { + return __webpack_module_cache__[moduleId].exports; } - E.prototype = { - on: function(name, callback, ctx) { - var e = this.e || (this.e = {}); - (e[name] || (e[name] = [])).push({ - fn: callback, - ctx - }); - return this; - }, - once: function(name, callback, ctx) { - var self2 = this; - function listener() { - self2.off(name, listener); - callback.apply(ctx, arguments); + var module2 = __webpack_module_cache__[moduleId] = { + /******/ + // no module.id needed + /******/ + // no module.loaded needed + /******/ + exports: {} + /******/ + }; + __webpack_modules__[moduleId](module2, module2.exports, __webpack_require__); + return module2.exports; + } + !function() { + __webpack_require__.n = function(module2) { + var getter = module2 && module2.__esModule ? ( + /******/ + function() { + return module2["default"]; } - ; - listener._ = callback; - return this.on(name, listener, ctx); - }, - emit: function(name) { - var data = [].slice.call(arguments, 1); - var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); - var i = 0; - var len = evtArr.length; - for (i; i < len; i++) { - evtArr[i].fn.apply(evtArr[i].ctx, data); + ) : ( + /******/ + function() { + return module2; } - return this; - }, - off: function(name, callback) { - var e = this.e || (this.e = {}); - var evts = e[name]; - var liveEvents = []; - if (evts && callback) { - for (var i = 0, len = evts.length; i < len; i++) { - if (evts[i].fn !== callback && evts[i].fn._ !== callback) - liveEvents.push(evts[i]); - } + ); + __webpack_require__.d(getter, { a: getter }); + return getter; + }; + }(); + !function() { + __webpack_require__.d = function(exports2, definition) { + for (var key in definition) { + if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports2, key)) { + Object.defineProperty(exports2, key, { enumerable: true, get: definition[key] }); } - liveEvents.length ? e[name] = liveEvents : delete e[name]; - return this; } }; - module2.exports = E; - module2.exports.TinyEmitter = E; - } - }; - var __webpack_module_cache__ = {}; - function __webpack_require__(moduleId) { - if (__webpack_module_cache__[moduleId]) { - return __webpack_module_cache__[moduleId].exports; - } - var module2 = __webpack_module_cache__[moduleId] = { - exports: {} - }; - __webpack_modules__[moduleId](module2, module2.exports, __webpack_require__); - return module2.exports; - } - !function() { - __webpack_require__.n = function(module2) { - var getter = module2 && module2.__esModule ? function() { - return module2["default"]; - } : function() { - return module2; + }(); + !function() { + __webpack_require__.o = function(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); }; - __webpack_require__.d(getter, { a: getter }); - return getter; - }; - }(); - !function() { - __webpack_require__.d = function(exports2, definition) { - for (var key in definition) { - if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports2, key)) { - Object.defineProperty(exports2, key, { enumerable: true, get: definition[key] }); - } - } - }; - }(); - !function() { - __webpack_require__.o = function(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); - }; - }(); - return __webpack_require__(686); - }().default; + }(); + return __webpack_require__(686); + }().default + ); }); } }); @@ -647,6 +730,7 @@ Toastify2.lib = Toastify2.prototype = { toastify: version, constructor: Toastify2, + // Initializing the object with required parameters init: function(options) { if (!options) { options = {}; @@ -677,6 +761,7 @@ } return this; }, + // Building the DOM element buildToast: function() { if (!this.options) { throw "Toastify is not initialized"; @@ -723,11 +808,14 @@ var closeElement = document.createElement("span"); closeElement.innerHTML = "✖"; closeElement.className = "toast-close"; - closeElement.addEventListener("click", function(event) { - event.stopPropagation(); - this.removeElement(this.toastElement); - window.clearTimeout(this.toastElement.timeOutValue); - }.bind(this)); + closeElement.addEventListener( + "click", + function(event) { + event.stopPropagation(); + this.removeElement(this.toastElement); + window.clearTimeout(this.toastElement.timeOutValue); + }.bind(this) + ); var width = window.innerWidth > 0 ? window.innerWidth : screen.width; if ((this.options.position == "left" || this.options.positionLeft === true) && width > 360) { divElement.insertAdjacentElement("afterbegin", closeElement); @@ -737,30 +825,45 @@ } if (this.options.stopOnFocus && this.options.duration > 0) { var self2 = this; - divElement.addEventListener("mouseover", function(event) { - window.clearTimeout(divElement.timeOutValue); - }); - divElement.addEventListener("mouseleave", function() { - divElement.timeOutValue = window.setTimeout(function() { - self2.removeElement(divElement); - }, self2.options.duration); - }); + divElement.addEventListener( + "mouseover", + function(event) { + window.clearTimeout(divElement.timeOutValue); + } + ); + divElement.addEventListener( + "mouseleave", + function() { + divElement.timeOutValue = window.setTimeout( + function() { + self2.removeElement(divElement); + }, + self2.options.duration + ); + } + ); } if (typeof this.options.destination !== "undefined") { - divElement.addEventListener("click", function(event) { - event.stopPropagation(); - if (this.options.newWindow === true) { - window.open(this.options.destination, "_blank"); - } else { - window.location = this.options.destination; - } - }.bind(this)); + divElement.addEventListener( + "click", + function(event) { + event.stopPropagation(); + if (this.options.newWindow === true) { + window.open(this.options.destination, "_blank"); + } else { + window.location = this.options.destination; + } + }.bind(this) + ); } if (typeof this.options.onClick === "function" && typeof this.options.destination === "undefined") { - divElement.addEventListener("click", function(event) { - event.stopPropagation(); - this.options.onClick(); - }.bind(this)); + divElement.addEventListener( + "click", + function(event) { + event.stopPropagation(); + this.options.onClick(); + }.bind(this) + ); } if (typeof this.options.offset === "object") { var x = getAxisOffsetAValue("x", this.options); @@ -771,6 +874,7 @@ } return divElement; }, + // Displaying the toast showToast: function() { this.toastElement = this.buildToast(); var rootElement; @@ -788,9 +892,12 @@ rootElement.insertBefore(this.toastElement, elementToInsert); Toastify2.reposition(); if (this.options.duration > 0) { - this.toastElement.timeOutValue = window.setTimeout(function() { - this.removeElement(this.toastElement); - }.bind(this), this.options.duration); + this.toastElement.timeOutValue = window.setTimeout( + function() { + this.removeElement(this.toastElement); + }.bind(this), + this.options.duration + ); } return this; }, @@ -800,18 +907,22 @@ } this.removeElement(this.toastElement); }, + // Removing the element from the DOM removeElement: function(toastElement) { toastElement.className = toastElement.className.replace(" on", ""); - window.setTimeout(function() { - if (this.options.node && this.options.node.parentNode) { - this.options.node.parentNode.removeChild(this.options.node); - } - if (toastElement.parentNode) { - toastElement.parentNode.removeChild(toastElement); - } - this.options.callback.call(toastElement); - Toastify2.reposition(); - }.bind(this), 400); + window.setTimeout( + function() { + if (this.options.node && this.options.node.parentNode) { + this.options.node.parentNode.removeChild(this.options.node); + } + if (toastElement.parentNode) { + toastElement.parentNode.removeChild(toastElement); + } + this.options.callback.call(toastElement); + Toastify2.reposition(); + }.bind(this), + 400 + ); } }; Toastify2.reposition = function() { @@ -885,10 +996,9 @@ (function(window2, document2) { "use strict"; !function() { - for (var lastTime = 0, vendors = ["ms", "moz", "webkit", "o"], x = 0; x < vendors.length && !window2.requestAnimationFrame; ++x) - window2.requestAnimationFrame = window2[vendors[x] + "RequestAnimationFrame"], window2.cancelAnimationFrame = window2[vendors[x] + "CancelAnimationFrame"] || window2[vendors[x] + "CancelRequestAnimationFrame"]; + for (var lastTime = 0, vendors = ["ms", "moz", "webkit", "o"], x = 0; x < vendors.length && !window2.requestAnimationFrame; ++x) window2.requestAnimationFrame = window2[vendors[x] + "RequestAnimationFrame"], window2.cancelAnimationFrame = window2[vendors[x] + "CancelAnimationFrame"] || window2[vendors[x] + "CancelRequestAnimationFrame"]; window2.requestAnimationFrame || (window2.requestAnimationFrame = function(callback, element) { - var currTime = new Date().getTime(), timeToCall = Math.max(0, 16 - (currTime - lastTime)), id = window2.setTimeout(function() { + var currTime = (/* @__PURE__ */ new Date()).getTime(), timeToCall = Math.max(0, 16 - (currTime - lastTime)), id = window2.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); return lastTime = currTime + timeToCall, id; @@ -901,26 +1011,24 @@ var ctx = canvas.getContext("2d"); ctx.shadowBlur = options.shadowBlur, ctx.shadowColor = options.shadowColor; var stop, lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0); - for (stop in options.barColors) - lineGradient.addColorStop(stop, options.barColors[stop]); + for (stop in options.barColors) lineGradient.addColorStop(stop, options.barColors[stop]); ctx.lineWidth = options.barThickness, ctx.beginPath(), ctx.moveTo(0, options.barThickness / 2), ctx.lineTo(Math.ceil(currentProgress * canvas.width), options.barThickness / 2), ctx.strokeStyle = lineGradient, ctx.stroke(); } var canvas, progressTimerId, fadeTimerId, currentProgress, showing, options = { autoRun: true, barThickness: 3, barColors: { 0: "rgba(26, 188, 156, .9)", ".25": "rgba(52, 152, 219, .9)", ".50": "rgba(241, 196, 15, .9)", ".75": "rgba(230, 126, 34, .9)", "1.0": "rgba(211, 84, 0, .9)" }, shadowBlur: 10, shadowColor: "rgba(0, 0, 0, .6)", className: null }, topbar2 = { config: function(opts) { - for (var key in opts) - options.hasOwnProperty(key) && (options[key] = opts[key]); + for (var key in opts) options.hasOwnProperty(key) && (options[key] = opts[key]); }, show: function() { var type, handler, elem; - showing || (showing = true, fadeTimerId !== null && window2.cancelAnimationFrame(fadeTimerId), canvas || ((elem = (canvas = document2.createElement("canvas")).style).position = "fixed", elem.top = elem.left = elem.right = elem.margin = elem.padding = 0, elem.zIndex = 100001, elem.display = "none", options.className && canvas.classList.add(options.className), document2.body.appendChild(canvas), type = "resize", handler = repaint, (elem = window2).addEventListener ? elem.addEventListener(type, handler, false) : elem.attachEvent ? elem.attachEvent("on" + type, handler) : elem["on" + type] = handler), canvas.style.opacity = 1, canvas.style.display = "block", topbar2.progress(0), options.autoRun && function loop() { + showing || (showing = true, null !== fadeTimerId && window2.cancelAnimationFrame(fadeTimerId), canvas || ((elem = (canvas = document2.createElement("canvas")).style).position = "fixed", elem.top = elem.left = elem.right = elem.margin = elem.padding = 0, elem.zIndex = 100001, elem.display = "none", options.className && canvas.classList.add(options.className), document2.body.appendChild(canvas), type = "resize", handler = repaint, (elem = window2).addEventListener ? elem.addEventListener(type, handler, false) : elem.attachEvent ? elem.attachEvent("on" + type, handler) : elem["on" + type] = handler), canvas.style.opacity = 1, canvas.style.display = "block", topbar2.progress(0), options.autoRun && function loop() { progressTimerId = window2.requestAnimationFrame(loop), topbar2.progress("+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2)); }()); }, progress: function(to) { - return to === void 0 || (typeof to == "string" && (to = (0 <= to.indexOf("+") || 0 <= to.indexOf("-") ? currentProgress : 0) + parseFloat(to)), currentProgress = 1 < to ? 1 : to, repaint()), currentProgress; + return void 0 === to || ("string" == typeof to && (to = (0 <= to.indexOf("+") || 0 <= to.indexOf("-") ? currentProgress : 0) + parseFloat(to)), currentProgress = 1 < to ? 1 : to, repaint()), currentProgress; }, hide: function() { - showing && (showing = false, progressTimerId != null && (window2.cancelAnimationFrame(progressTimerId), progressTimerId = null), function loop() { + showing && (showing = false, null != progressTimerId && (window2.cancelAnimationFrame(progressTimerId), progressTimerId = null), function loop() { return 1 <= topbar2.progress("+.1") && (canvas.style.opacity -= 0.05, canvas.style.opacity <= 0.05) ? (canvas.style.display = "none", void (fadeTimerId = null)) : void (fadeTimerId = window2.requestAnimationFrame(loop)); }()); } }; - typeof module == "object" && typeof module.exports == "object" ? module.exports = topbar2 : typeof define == "function" && define.amd ? define(function() { + "object" == typeof module && "object" == typeof module.exports ? module.exports = topbar2 : "function" == typeof define && define.amd ? define(function() { return topbar2; }) : this.topbar = topbar2; }).call(exports, window, document); @@ -931,8 +1039,7 @@ (function() { var PolyfillEvent = eventConstructor(); function eventConstructor() { - if (typeof window.CustomEvent === "function") - return window.CustomEvent; + if (typeof window.CustomEvent === "function") return window.CustomEvent; function CustomEvent2(event, params) { params = params || { bubbles: false, cancelable: false, detail: void 0 }; var evt = document.createEvent("CustomEvent"); @@ -954,10 +1061,8 @@ form.method = element.getAttribute("data-method") === "get" ? "get" : "post"; form.action = to; form.style.display = "none"; - if (target) - form.target = target; - else if (targetModifierKey) - form.target = "_blank"; + if (target) form.target = target; + else if (targetModifierKey) form.target = "_blank"; form.appendChild(csrf); form.appendChild(method); document.body.appendChild(form); @@ -967,8 +1072,7 @@ } window.addEventListener("click", function(e) { var element = e.target; - if (e.defaultPrevented) - return; + if (e.defaultPrevented) return; while (element && element.getAttribute) { var phoenixLinkEvent = new PolyfillEvent("phoenix.link.click", { "bubbles": true, @@ -1049,11 +1153,18 @@ this.recHooks = []; this.sent = false; } + /** + * + * @param {number} timeout + */ resend(timeout) { this.timeout = timeout; this.reset(); this.send(); } + /** + * + */ send() { if (this.hasReceived("timeout")) { return; @@ -1068,6 +1179,11 @@ join_ref: this.channel.joinRef() }); } + /** + * + * @param {*} status + * @param {*} callback + */ receive(status, callback) { if (this.hasReceived(status)) { callback(this.receivedResp.response); @@ -1075,6 +1191,9 @@ this.recHooks.push({ status, callback }); return this; } + /** + * @private + */ reset() { this.cancelRefEvent(); this.ref = null; @@ -1082,19 +1201,31 @@ this.receivedResp = null; this.sent = false; } + /** + * @private + */ matchReceive({ status, response, _ref }) { this.recHooks.filter((h) => h.status === status).forEach((h) => h.callback(response)); } + /** + * @private + */ cancelRefEvent() { if (!this.refEvent) { return; } this.channel.off(this.refEvent); } + /** + * @private + */ cancelTimeout() { clearTimeout(this.timeoutTimer); this.timeoutTimer = null; } + /** + * @private + */ startTimeout() { if (this.timeoutTimer) { this.cancelTimeout(); @@ -1111,9 +1242,15 @@ this.trigger("timeout", {}); }, this.timeout); } + /** + * @private + */ hasReceived(status) { return this.receivedResp && this.receivedResp.status === status; } + /** + * @private + */ trigger(status, response) { this.channel.trigger(this.refEvent, { status, response }); } @@ -1129,6 +1266,9 @@ this.tries = 0; clearTimeout(this.timer); } + /** + * Cancels any previous scheduleTimeout and schedules callback + */ scheduleTimeout() { clearTimeout(this.timer); this.timer = setTimeout(() => { @@ -1156,12 +1296,14 @@ } }, this.socket.rejoinAfterMs); this.stateChangeRefs.push(this.socket.onError(() => this.rejoinTimer.reset())); - this.stateChangeRefs.push(this.socket.onOpen(() => { - this.rejoinTimer.reset(); - if (this.isErrored()) { - this.rejoin(); - } - })); + this.stateChangeRefs.push( + this.socket.onOpen(() => { + this.rejoinTimer.reset(); + if (this.isErrored()) { + this.rejoin(); + } + }) + ); this.joinPush.receive("ok", () => { this.state = CHANNEL_STATES.joined; this.rejoinTimer.reset(); @@ -1207,6 +1349,11 @@ this.trigger(this.replyEventName(ref), payload); }); } + /** + * Join the channel + * @param {integer} timeout + * @returns {Push} + */ join(timeout = this.timeout) { if (this.joinedOnce) { throw new Error("tried to join multiple times. 'join' can only be called a single time per channel instance"); @@ -1217,25 +1364,87 @@ return this.joinPush; } } + /** + * Hook into channel close + * @param {Function} callback + */ onClose(callback) { this.on(CHANNEL_EVENTS.close, callback); } + /** + * Hook into channel errors + * @param {Function} callback + */ onError(callback) { return this.on(CHANNEL_EVENTS.error, (reason) => callback(reason)); } + /** + * Subscribes on channel events + * + * Subscription returns a ref counter, which can be used later to + * unsubscribe the exact event listener + * + * @example + * const ref1 = channel.on("event", do_stuff) + * const ref2 = channel.on("event", do_other_stuff) + * channel.off("event", ref1) + * // Since unsubscription, do_stuff won't fire, + * // while do_other_stuff will keep firing on the "event" + * + * @param {string} event + * @param {Function} callback + * @returns {integer} ref + */ on(event, callback) { let ref = this.bindingRef++; this.bindings.push({ event, ref, callback }); return ref; } + /** + * Unsubscribes off of channel events + * + * Use the ref returned from a channel.on() to unsubscribe one + * handler, or pass nothing for the ref to unsubscribe all + * handlers for the given event. + * + * @example + * // Unsubscribe the do_stuff handler + * const ref1 = channel.on("event", do_stuff) + * channel.off("event", ref1) + * + * // Unsubscribe all handlers from event + * channel.off("event") + * + * @param {string} event + * @param {integer} ref + */ off(event, ref) { this.bindings = this.bindings.filter((bind) => { return !(bind.event === event && (typeof ref === "undefined" || ref === bind.ref)); }); } + /** + * @private + */ canPush() { return this.socket.isConnected() && this.isJoined(); } + /** + * Sends a message `event` to phoenix with the payload `payload`. + * Phoenix receives this in the `handle_in(event, payload, socket)` + * function. if phoenix replies or it times out (default 10000ms), + * then optionally the reply can be received. + * + * @example + * channel.push("event") + * .receive("ok", payload => console.log("phoenix replied:", payload)) + * .receive("error", err => console.log("phoenix errored", err)) + * .receive("timeout", () => console.log("timed out pushing")) + * @param {string} event + * @param {Object} payload + * @param {number} [timeout] + * @returns {Push} + */ push(event, payload, timeout = this.timeout) { payload = payload || {}; if (!this.joinedOnce) { @@ -1252,6 +1461,22 @@ } return pushEvent; } + /** Leaves the channel + * + * Unsubscribes from server events, and + * instructs channel to terminate on server + * + * Triggers onClose() hooks + * + * To receive leave acknowledgements, use the `receive` + * hook to bind to the server ack, ie: + * + * @example + * channel.leave().receive("ok", () => alert("left!") ) + * + * @param {integer} timeout + * @returns {Push} + */ leave(timeout = this.timeout) { this.rejoinTimer.reset(); this.joinPush.cancelTimeout(); @@ -1269,9 +1494,24 @@ } return leavePush; } + /** + * Overridable message hook + * + * Receives all events for specialized message handling + * before dispatching to the channel callbacks. + * + * Must return the payload, modified or unmodified + * @param {string} event + * @param {Object} payload + * @param {integer} ref + * @returns {Object} + */ onMessage(_event, payload, _ref) { return payload; } + /** + * @private + */ isMember(topic, event, payload, joinRef) { if (this.topic !== topic) { return false; @@ -1284,9 +1524,15 @@ return true; } } + /** + * @private + */ joinRef() { return this.joinPush.ref; } + /** + * @private + */ rejoin(timeout = this.timeout) { if (this.isLeaving()) { return; @@ -1295,6 +1541,9 @@ this.state = CHANNEL_STATES.joining; this.joinPush.resend(timeout); } + /** + * @private + */ trigger(event, payload, ref, joinRef) { let handledPayload = this.onMessage(event, payload, ref, joinRef); if (payload && !handledPayload) { @@ -1306,21 +1555,39 @@ bind.callback(handledPayload, ref, joinRef || this.joinRef()); } } + /** + * @private + */ replyEventName(ref) { return `chan_reply_${ref}`; } + /** + * @private + */ isClosed() { return this.state === CHANNEL_STATES.closed; } + /** + * @private + */ isErrored() { return this.state === CHANNEL_STATES.errored; } + /** + * @private + */ isJoined() { return this.state === CHANNEL_STATES.joined; } + /** + * @private + */ isJoining() { return this.state === CHANNEL_STATES.joining; } + /** + * @private + */ isLeaving() { return this.state === CHANNEL_STATES.leaving; } @@ -1521,6 +1788,9 @@ } }); } + // we collect all pushes within the current event loop by + // setTimeout 0, which optimizes back-to-back procedural + // pushes against an empty buffer send(body) { if (typeof body !== "string") { body = arrayBufferToBase64(body); @@ -1600,6 +1870,7 @@ return callback({ join_ref, ref, topic, event, payload }); } }, + // private binaryEncode(message) { let { join_ref, ref, event, topic, payload } = message; let metaLength = this.META_LENGTH + join_ref.length + ref.length + topic.length + event.length; @@ -1751,9 +2022,18 @@ }, this.reconnectAfterMs); this.authToken = opts.authToken; } + /** + * Returns the LongPoll transport reference + */ getLongPollTransport() { return LongPoll; } + /** + * Disconnects and replaces the active transport + * + * @param {Function} newTransport - The new transport class to instantiate + * + */ replaceTransport(newTransport) { this.connectClock++; this.closeWasClean = true; @@ -1765,11 +2045,24 @@ } this.transport = newTransport; } + /** + * Returns the socket protocol + * + * @returns {string} + */ protocol() { return location.protocol.match(/^https/) ? "wss" : "ws"; } + /** + * The fully qualified socket url + * + * @returns {string} + */ endPointURL() { - let uri = Ajax.appendParams(Ajax.appendParams(this.endPoint, this.params()), { vsn: this.vsn }); + let uri = Ajax.appendParams( + Ajax.appendParams(this.endPoint, this.params()), + { vsn: this.vsn } + ); if (uri.charAt(0) !== "/") { return uri; } @@ -1778,6 +2071,15 @@ } return `${this.protocol()}://${location.host}${uri}`; } + /** + * Disconnects the socket + * + * See https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes for valid status codes. + * + * @param {Function} callback - Optional callback which is called after socket is disconnected. + * @param {integer} code - A status code for disconnection (Optional). + * @param {string} reason - A textual description of the reason to disconnect. (Optional) + */ disconnect(callback, code, reason) { this.connectClock++; this.disconnecting = true; @@ -1789,6 +2091,13 @@ callback && callback(); }, code, reason); } + /** + * + * @param {Object} params - The params to send when connecting, for example `{user_id: userToken}` + * + * Passing params to connect is deprecated; pass them in the Socket constructor instead: + * `new Socket("/socket", {params: {user_id: userToken}})`. + */ connect(params) { if (params) { console && console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor"); @@ -1803,32 +2112,69 @@ this.transportConnect(); } } + /** + * Logs the message. Override `this.logger` for specialized logging. noops by default + * @param {string} kind + * @param {string} msg + * @param {Object} data + */ log(kind, msg, data) { this.logger && this.logger(kind, msg, data); } + /** + * Returns true if a logger has been set on this socket. + */ hasLogger() { return this.logger !== null; } + /** + * Registers callbacks for connection open events + * + * @example socket.onOpen(function(){ console.info("the socket was opened") }) + * + * @param {Function} callback + */ onOpen(callback) { let ref = this.makeRef(); this.stateChangeCallbacks.open.push([ref, callback]); return ref; } + /** + * Registers callbacks for connection close events + * @param {Function} callback + */ onClose(callback) { let ref = this.makeRef(); this.stateChangeCallbacks.close.push([ref, callback]); return ref; } + /** + * Registers callbacks for connection error events + * + * @example socket.onError(function(error){ alert("An error occurred") }) + * + * @param {Function} callback + */ onError(callback) { let ref = this.makeRef(); this.stateChangeCallbacks.error.push([ref, callback]); return ref; } + /** + * Registers callbacks for connection message events + * @param {Function} callback + */ onMessage(callback) { let ref = this.makeRef(); this.stateChangeCallbacks.message.push([ref, callback]); return ref; } + /** + * Pings the server and invokes the callback with the RTT in milliseconds + * @param {Function} callback + * + * Returns true if the ping was pushed or false if unable to be pushed. + */ ping(callback) { if (!this.isConnected()) { return false; @@ -1844,6 +2190,9 @@ }); return true; } + /** + * @private + */ transportConnect() { this.connectClock++; this.closeWasClean = false; @@ -1921,6 +2270,9 @@ this.resetHeartbeat(); this.stateChangeCallbacks.open.forEach(([, callback]) => callback()); } + /** + * @private + */ heartbeatTimeout() { if (this.pendingHeartbeatRef) { this.pendingHeartbeatRef = null; @@ -2004,6 +2356,9 @@ } this.stateChangeCallbacks.close.forEach(([, callback]) => callback(event)); } + /** + * @private + */ onConnError(error) { if (this.hasLogger()) this.log("transport", error); @@ -2016,6 +2371,9 @@ this.triggerChanError(); } } + /** + * @private + */ triggerChanError() { this.channels.forEach((channel) => { if (!(channel.isErrored() || channel.isLeaving() || channel.isClosed())) { @@ -2023,6 +2381,9 @@ } }); } + /** + * @returns {string} + */ connectionState() { switch (this.conn && this.conn.readyState) { case SOCKET_STATES.connecting: @@ -2035,13 +2396,27 @@ return "closed"; } } + /** + * @returns {boolean} + */ isConnected() { return this.connectionState() === "open"; } + /** + * @private + * + * @param {Channel} + */ remove(channel) { this.off(channel.stateChangeRefs); this.channels = this.channels.filter((c) => c !== channel); } + /** + * Removes `onOpen`, `onClose`, `onError,` and `onMessage` registrations. + * + * @param {refs} - list of refs returned by calls to + * `onOpen`, `onClose`, `onError,` and `onMessage` + */ off(refs) { for (let key in this.stateChangeCallbacks) { this.stateChangeCallbacks[key] = this.stateChangeCallbacks[key].filter(([ref]) => { @@ -2049,11 +2424,21 @@ }); } } + /** + * Initiates a new channel for the given topic + * + * @param {string} topic + * @param {Object} chanParams - Parameters for the channel + * @returns {Channel} + */ channel(topic, chanParams = {}) { let chan = new Channel(topic, chanParams, this); this.channels.push(chan); return chan; } + /** + * @param {Object} data + */ push(data) { if (this.hasLogger()) { let { topic, event, payload, ref, join_ref } = data; @@ -2065,6 +2450,10 @@ this.sendBuffer.push(() => this.encode(data, (result) => this.conn.send(result))); } } + /** + * Return the next message ref, accounting for overflows + * @returns {string} + */ makeRef() { let newRef = this.ref + 1; if (newRef === this.ref) { @@ -2270,11 +2659,18 @@ } readNextChunk() { const reader = new window.FileReader(); - const blob = this.entry.file.slice(this.offset, this.chunkSize + this.offset); + const blob = this.entry.file.slice( + this.offset, + this.chunkSize + this.offset + ); reader.onload = (e) => { if (e.target.error === null) { - this.offset += e.target.result.byteLength; - this.pushChunk(e.target.result); + this.offset += /** @type {ArrayBuffer} */ + e.target.result.byteLength; + this.pushChunk( + /** @type {ArrayBuffer} */ + e.target.result + ); } else { return logError("Read error: " + e.target.error); } @@ -2288,7 +2684,10 @@ this.uploadChannel.push("chunk", chunk, this.chunkTimeout).receive("ok", () => { this.entry.progress(this.offset / this.entry.file.size * 100); if (!this.isDone()) { - this.chunkTimer = setTimeout(() => this.readNextChunk(), this.liveSocket.getLatencySim() || 0); + this.chunkTimer = setTimeout( + () => this.readNextChunk(), + this.liveSocket.getLatencySim() || 0 + ); } }).receive("error", ({ reason }) => this.error(reason)); } @@ -2303,7 +2702,9 @@ const elems = document.querySelectorAll("*[id]"); for (let i = 0, len = elems.length; i < len; i++) { if (ids.has(elems[i].id)) { - console.error(`Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.`); + console.error( + `Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.` + ); } else { ids.add(elems[i].id); } @@ -2314,7 +2715,9 @@ Object.keys(inserts).forEach((id) => { const streamEl = document.getElementById(id); if (streamEl && streamEl.parentElement && streamEl.parentElement.getAttribute("phx-update") !== "stream") { - errors.add(`The stream container with id "${streamEl.parentElement.id}" is missing the phx-update="stream" attribute. Ensure it is set for streams to work properly.`); + errors.add( + `The stream container with id "${streamEl.parentElement.id}" is missing the phx-update="stream" attribute. Ensure it is set for streams to work properly.` + ); } }); errors.forEach((error) => console.error(error)); @@ -2377,7 +2780,11 @@ if (!this.canPushState()) { return; } - history.replaceState(callback(history.state || {}), "", window.location.href); + history.replaceState( + callback(history.state || {}), + "", + window.location.href + ); }, pushState(kind, meta, to) { if (this.canPushState()) { @@ -2407,7 +2814,10 @@ document.cookie = `${name}=${value};${expires} path=/`; }, getCookie(name) { - return document.cookie.replace(new RegExp(`(?:(?:^|.*;s*)${name}s*=s*([^;]*).*$)|^.*$`), "$1"); + return document.cookie.replace( + new RegExp(`(?:(?:^|.*;s*)${name}s*=s*([^;]*).*$)|^.*$`), + "$1" + ); }, deleteCookie(name) { document.cookie = `${name}=; max-age=-1; path=/`; @@ -2465,11 +2875,19 @@ }, findUploadInputs(node) { const formId = node.id; - const inputsOutsideForm = this.all(document, `input[type="file"][${PHX_UPLOAD_REF}][form="${formId}"]`); - return this.all(node, `input[type="file"][${PHX_UPLOAD_REF}]`).concat(inputsOutsideForm); + const inputsOutsideForm = this.all( + document, + `input[type="file"][${PHX_UPLOAD_REF}][form="${formId}"]` + ); + return this.all(node, `input[type="file"][${PHX_UPLOAD_REF}]`).concat( + inputsOutsideForm + ); }, findComponentNodeList(viewId, cid, doc2 = document) { - return this.all(doc2, `[${PHX_VIEW_REF}="${viewId}"][${PHX_COMPONENT}="${cid}"]`); + return this.all( + doc2, + `[${PHX_VIEW_REF}="${viewId}"][${PHX_COMPONENT}="${cid}"]` + ); }, isPhxDestroyed(node) { return node.id && DOM.private(node, "destroyed") ? true : false; @@ -2544,7 +2962,10 @@ const parentCids = /* @__PURE__ */ new Set(); const childrenCids = /* @__PURE__ */ new Set(); cids.forEach((cid) => { - this.all(document, `[${PHX_VIEW_REF}="${viewId}"][${PHX_COMPONENT}="${cid}"]`).forEach((parent) => { + this.all( + document, + `[${PHX_VIEW_REF}="${viewId}"][${PHX_COMPONENT}="${cid}"]` + ).forEach((parent) => { parentCids.add(cid); this.all(parent, `[${PHX_VIEW_REF}="${viewId}"][${PHX_COMPONENT}]`).map((el) => parseInt(el.getAttribute(PHX_COMPONENT))).forEach((childCID) => childrenCids.add(childCID)); }); @@ -2579,9 +3000,11 @@ PHX_EVENT_CLASSES.forEach((className) => { fromEl.classList.contains(className) && toEl.classList.add(className); }); - PHX_PENDING_ATTRS.filter((attr) => fromEl.hasAttribute(attr)).forEach((attr) => { - toEl.setAttribute(attr, fromEl.getAttribute(attr)); - }); + PHX_PENDING_ATTRS.filter((attr) => fromEl.hasAttribute(attr)).forEach( + (attr) => { + toEl.setAttribute(attr, fromEl.getAttribute(attr)); + } + ); }, copyPrivates(target, source) { if (source[PHX_PRIVATE]) { @@ -2622,7 +3045,10 @@ } }); if (this.once(el, "debounce-blur")) { - el.addEventListener("blur", () => this.triggerCycle(el, "debounce-blur-cycle")); + el.addEventListener( + "blur", + () => this.triggerCycle(el, "debounce-blur-cycle") + ); } return; default: @@ -2699,6 +3125,9 @@ this.putPrivate(el, key, [currentCycle, trigger]); return currentCycle; }, + // maintains or adds privately used hook information + // fromEl and toEl can be the same element in the case of a newly added node + // fromEl and toEl can be any HTML node type, so we need to check if it's an element node maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom) { if (fromEl.hasAttribute && fromEl.hasAttribute("data-phx-hook") && !toEl.hasAttribute("data-phx-hook")) { toEl.setAttribute("data-phx-hook", fromEl.getAttribute("data-phx-hook")); @@ -2746,7 +3175,9 @@ return el.tagName === "TEMPLATE" && el.hasAttribute(PHX_PORTAL); }, closestViewEl(el) { - const portalOrViewEl = el.closest(`[${PHX_TELEPORTED_REF}],${PHX_VIEW_SELECTOR}`); + const portalOrViewEl = el.closest( + `[${PHX_TELEPORTED_REF}],${PHX_VIEW_SELECTOR}` + ); if (!portalOrViewEl) { return null; } @@ -2781,6 +3212,9 @@ return cloned; } }, + // merge attributes from source to target + // if an element is ignored, we only merge data attributes + // including removing data attributes that are no longer in the source mergeAttrs(target, source, opts = {}) { var _a; const exclude = new Set(opts.exclude || []); @@ -2868,11 +3302,13 @@ if (!childNode.id) { const isEmptyTextNode = childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue.trim() === ""; if (!isEmptyTextNode && childNode.nodeType !== Node.COMMENT_NODE) { - logError(`only HTML element tags with an id are allowed inside containers with phx-update. + logError( + `only HTML element tags with an id are allowed inside containers with phx-update. removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" -`); +` + ); } toRemove.push(childNode); } @@ -2894,15 +3330,21 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return container; } else { const newContainer = document.createElement(tagName); - Object.keys(attrs).forEach((attr) => newContainer.setAttribute(attr, attrs[attr])); - retainedAttrs.forEach((attr) => newContainer.setAttribute(attr, container.getAttribute(attr))); + Object.keys(attrs).forEach( + (attr) => newContainer.setAttribute(attr, attrs[attr]) + ); + retainedAttrs.forEach( + (attr) => newContainer.setAttribute(attr, container.getAttribute(attr)) + ); newContainer.innerHTML = container.innerHTML; container.replaceWith(newContainer); return newContainer; } }, getSticky(el, name, defaultVal) { - const op = (DOM.private(el, "sticky") || []).find(([existingName]) => name === existingName); + const op = (DOM.private(el, "sticky") || []).find( + ([existingName]) => name === existingName + ); if (op) { const [_name, _op, stashedResult] = op; return stashedResult; @@ -2918,7 +3360,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" putSticky(el, name, op) { const stashedResult = op(el); this.updatePrivate(el, "sticky", [], (ops) => { - const existingIndex = ops.findIndex(([existingName]) => name === existingName); + const existingIndex = ops.findIndex( + ([existingName]) => name === existingName + ); if (existingIndex >= 0) { ops[existingIndex] = [name, op, stashedResult]; } else { @@ -3015,6 +3459,7 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" isAutoUpload() { return this.autoUpload; } + //private onDone(callback) { this._onDone = () => { this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated); @@ -3069,7 +3514,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } } static getEntryDataURL(inputEl, ref, callback) { - const file = this.activeFiles(inputEl).find((file2) => this.genFileRef(file2) === ref); + const file = this.activeFiles(inputEl).find( + (file2) => this.genFileRef(file2) === ref + ); callback(URL.createObjectURL(file)); } static hasUploadsInProgress(formEl) { @@ -3107,12 +3554,28 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" dom_default.putPrivate(inputEl, "files", []); } static untrackFile(inputEl, file) { - dom_default.putPrivate(inputEl, "files", dom_default.private(inputEl, "files").filter((f) => !Object.is(f, file))); - } + dom_default.putPrivate( + inputEl, + "files", + dom_default.private(inputEl, "files").filter((f) => !Object.is(f, file)) + ); + } + /** + * @param {HTMLInputElement} inputEl + * @param {Array} files + * @param {DataTransfer} [dataTransfer] + */ static trackFiles(inputEl, files, dataTransfer) { if (inputEl.getAttribute("multiple") !== null) { - const newFiles = files.filter((file) => !this.activeFiles(inputEl).find((f) => Object.is(f, file))); - dom_default.updatePrivate(inputEl, "files", [], (existing) => existing.concat(newFiles)); + const newFiles = files.filter( + (file) => !this.activeFiles(inputEl).find((f) => Object.is(f, file)) + ); + dom_default.updatePrivate( + inputEl, + "files", + [], + (existing) => existing.concat(newFiles) + ); inputEl.value = null; } else { if (dataTransfer && dataTransfer.files.length > 0) { @@ -3123,17 +3586,25 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } static activeFileInputs(formEl) { const fileInputs = dom_default.findUploadInputs(formEl); - return Array.from(fileInputs).filter((el) => el.files && this.activeFiles(el).length > 0); + return Array.from(fileInputs).filter( + (el) => el.files && this.activeFiles(el).length > 0 + ); } static activeFiles(input) { - return (dom_default.private(input, "files") || []).filter((f) => UploadEntry.isActive(input, f)); + return (dom_default.private(input, "files") || []).filter( + (f) => UploadEntry.isActive(input, f) + ); } static inputsAwaitingPreflight(formEl) { const fileInputs = dom_default.findUploadInputs(formEl); - return Array.from(fileInputs).filter((input) => this.filesAwaitingPreflight(input).length > 0); + return Array.from(fileInputs).filter( + (input) => this.filesAwaitingPreflight(input).length > 0 + ); } static filesAwaitingPreflight(input) { - return this.activeFiles(input).filter((f) => !UploadEntry.isPreflighted(input, f) && !UploadEntry.isPreflightInProgress(f)); + return this.activeFiles(input).filter( + (f) => !UploadEntry.isPreflighted(input, f) && !UploadEntry.isPreflightInProgress(f) + ); } static markPreflightInProgress(entries) { entries.forEach((entry) => UploadEntry.markPreflightInProgress(entry.file)); @@ -3142,7 +3613,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.autoUpload = dom_default.isAutoUpload(inputEl); this.view = view; this.onComplete = onComplete; - this._entries = Array.from(_LiveUploader.filesAwaitingPreflight(inputEl) || []).map((file) => new UploadEntry(inputEl, file, view, this.autoUpload)); + this._entries = Array.from( + _LiveUploader.filesAwaitingPreflight(inputEl) || [] + ).map((file) => new UploadEntry(inputEl, file, view, this.autoUpload)); _LiveUploader.markPreflightInProgress(this._entries); this.numEntriesInProgress = this._entries.length; } @@ -3263,7 +3736,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" LiveImgPreview: { mounted() { this.ref = this.el.getAttribute("data-phx-entry-ref"); - this.inputEl = document.getElementById(this.el.getAttribute(PHX_UPLOAD_REF)); + this.inputEl = document.getElementById( + this.el.getAttribute(PHX_UPLOAD_REF) + ); LiveUploader.getEntryDataURL(this.inputEl, this.ref, (url) => { this.url = url; this.el.src = url; @@ -3349,43 +3824,52 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" let topOverran = false; const throttleInterval = 500; let pendingOp = null; - const onTopOverrun = this.throttle(throttleInterval, (topEvent, firstChild) => { - pendingOp = () => true; - this.liveSocket.js().push(this.el, topEvent, { - value: { id: firstChild.id, _overran: true }, - callback: () => { - pendingOp = null; - } - }); - }); - const onFirstChildAtTop = this.throttle(throttleInterval, (topEvent, firstChild) => { - pendingOp = () => firstChild.scrollIntoView({ block: "start" }); - this.liveSocket.js().push(this.el, topEvent, { - value: { id: firstChild.id }, - callback: () => { - pendingOp = null; - window.requestAnimationFrame(() => { - if (!isWithinViewport(firstChild, this.scrollContainer)) { - firstChild.scrollIntoView({ block: "start" }); - } - }); - } - }); - }); - const onLastChildAtBottom = this.throttle(throttleInterval, (bottomEvent, lastChild) => { - pendingOp = () => lastChild.scrollIntoView({ block: "end" }); - this.liveSocket.js().push(this.el, bottomEvent, { - value: { id: lastChild.id }, - callback: () => { - pendingOp = null; - window.requestAnimationFrame(() => { - if (!isWithinViewport(lastChild, this.scrollContainer)) { - lastChild.scrollIntoView({ block: "end" }); - } - }); - } - }); - }); + const onTopOverrun = this.throttle( + throttleInterval, + (topEvent, firstChild) => { + pendingOp = () => true; + this.liveSocket.js().push(this.el, topEvent, { + value: { id: firstChild.id, _overran: true }, + callback: () => { + pendingOp = null; + } + }); + } + ); + const onFirstChildAtTop = this.throttle( + throttleInterval, + (topEvent, firstChild) => { + pendingOp = () => firstChild.scrollIntoView({ block: "start" }); + this.liveSocket.js().push(this.el, topEvent, { + value: { id: firstChild.id }, + callback: () => { + pendingOp = null; + window.requestAnimationFrame(() => { + if (!isWithinViewport(firstChild, this.scrollContainer)) { + firstChild.scrollIntoView({ block: "start" }); + } + }); + } + }); + } + ); + const onLastChildAtBottom = this.throttle( + throttleInterval, + (bottomEvent, lastChild) => { + pendingOp = () => lastChild.scrollIntoView({ block: "end" }); + this.liveSocket.js().push(this.el, bottomEvent, { + value: { id: lastChild.id }, + callback: () => { + pendingOp = null; + window.requestAnimationFrame(() => { + if (!isWithinViewport(lastChild, this.scrollContainer)) { + lastChild.scrollIntoView({ block: "end" }); + } + }); + } + }); + } + ); this.onScroll = (_e) => { const scrollNow = scrollTop(this.scrollContainer); if (pendingOp) { @@ -3393,8 +3877,12 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return pendingOp(); } const rect = this.el.getBoundingClientRect(); - const topEvent = this.el.getAttribute(this.liveSocket.binding("viewport-top")); - const bottomEvent = this.el.getAttribute(this.liveSocket.binding("viewport-bottom")); + const topEvent = this.el.getAttribute( + this.liveSocket.binding("viewport-top") + ); + const bottomEvent = this.el.getAttribute( + this.liveSocket.binding("viewport-bottom") + ); const lastChild = this.el.lastElementChild; const firstChild = this.el.firstElementChild; const isScrollingUp = scrollNow < scrollBefore; @@ -3456,15 +3944,20 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } const closestLock = el.closest(`[${PHX_REF_LOCK}]`); const ref = closestLock.closest(`[${PHX_REF_LOCK}]`).getAttribute(PHX_REF_LOCK); - closestLock.addEventListener(`phx:undo-lock:${ref}`, () => { - callback(); - }, { once: true }); + closestLock.addEventListener( + `phx:undo-lock:${ref}`, + () => { + callback(); + }, + { once: true } + ); } constructor(el) { this.el = el; this.loadingRef = el.hasAttribute(PHX_REF_LOADING) ? parseInt(el.getAttribute(PHX_REF_LOADING), 10) : null; this.lockRef = el.hasAttribute(PHX_REF_LOCK) ? parseInt(el.getAttribute(PHX_REF_LOCK), 10) : null; } + // public maybeUndo(ref, phxEvent, eachCloneCallback) { if (!this.isWithin(ref)) { dom_default.updatePrivate(this.el, PHX_PENDING_REFS, [], (pendingRefs) => { @@ -3483,10 +3976,14 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" cancelable: false }; if (this.loadingRef && this.loadingRef > pendingRef) { - this.el.dispatchEvent(new CustomEvent(`phx:undo-loading:${pendingRef}`, opts)); + this.el.dispatchEvent( + new CustomEvent(`phx:undo-loading:${pendingRef}`, opts) + ); } if (this.lockRef && this.lockRef > pendingRef) { - this.el.dispatchEvent(new CustomEvent(`phx:undo-lock:${pendingRef}`, opts)); + this.el.dispatchEvent( + new CustomEvent(`phx:undo-lock:${pendingRef}`, opts) + ); } return pendingRef > ref; }); @@ -3495,9 +3992,16 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.el.removeAttribute(PHX_REF_SRC); } } + // private isWithin(ref) { return !(this.loadingRef !== null && this.loadingRef > ref && this.lockRef !== null && this.lockRef > ref); } + // Check for cloned PHX_REF_LOCK element that has been morphed behind + // the scenes while this element was locked in the DOM. + // When we apply the cloned tree to the active DOM element, we must + // + // 1. execute pending mounted hooks for nodes now in the DOM + // 2. undo any ref inside the cloned tree that has since been ack'd undoLocks(ref, phxEvent, eachCloneCallback) { if (!this.isLockUndoneBy(ref)) { return; @@ -3513,7 +4017,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" bubbles: true, cancelable: false }; - this.el.dispatchEvent(new CustomEvent(`phx:undo-lock:${this.lockRef}`, opts)); + this.el.dispatchEvent( + new CustomEvent(`phx:undo-lock:${this.lockRef}`, opts) + ); } undoLoading(ref, phxEvent) { if (!this.isLoadingUndoneBy(ref)) { @@ -3544,7 +4050,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" bubbles: true, cancelable: false }; - this.el.dispatchEvent(new CustomEvent(`phx:undo-loading:${this.loadingRef}`, opts)); + this.el.dispatchEvent( + new CustomEvent(`phx:undo-loading:${this.loadingRef}`, opts) + ); } PHX_EVENT_CLASSES.forEach((name) => { if (name !== "phx-submit-loading" || this.canUndoLoading(ref)) { @@ -3561,6 +4069,7 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" isFullyResolvedBy(ref) { return (this.loadingRef === null || this.loadingRef <= ref) && (this.lockRef === null || this.lockRef <= ref); } + // only remove the phx-submit-loading class if we are not locked canUndoLoading(ref) { return this.lockRef === null || this.lockRef <= ref; } @@ -3568,7 +4077,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" var DOMPostMorphRestorer = class { constructor(containerBefore, containerAfter, updateType) { const idsBefore = /* @__PURE__ */ new Set(); - const idsAfter = new Set([...containerAfter.children].map((child) => child.id)); + const idsAfter = new Set( + [...containerAfter.children].map((child) => child.id) + ); const elementsToModify = []; Array.from(containerBefore.children).forEach((child) => { if (child.id) { @@ -3587,6 +4098,12 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.elementsToModify = elementsToModify; this.elementIdsToAdd = [...idsAfter].filter((id) => !idsBefore.has(id)); } + // We do the following to optimize append/prepend operations: + // 1) Track ids of modified elements & of new elements + // 2) All the modified elements are put back in the correct position in the DOM tree + // by storing the id of their previous sibling + // 3) New elements are going to be put in the right place by morphdom during append. + // For prepend, we move them to the first position in the container perform() { const container = dom_default.byId(this.containerId); if (!container) { @@ -3594,14 +4111,20 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } this.elementsToModify.forEach((elementToModify) => { if (elementToModify.previousElementId) { - maybe(document.getElementById(elementToModify.previousElementId), (previousElem) => { - maybe(document.getElementById(elementToModify.elementId), (elem) => { - const isInRightPlace = elem.previousElementSibling && elem.previousElementSibling.id == previousElem.id; - if (!isInRightPlace) { - previousElem.insertAdjacentElement("afterend", elem); - } - }); - }); + maybe( + document.getElementById(elementToModify.previousElementId), + (previousElem) => { + maybe( + document.getElementById(elementToModify.elementId), + (elem) => { + const isInRightPlace = elem.previousElementSibling && elem.previousElementSibling.id == previousElem.id; + if (!isInRightPlace) { + previousElem.insertAdjacentElement("afterend", elem); + } + } + ); + } + ); } else { maybe(document.getElementById(elementToModify.elementId), (elem) => { const isInRightPlace = elem.previousElementSibling == null; @@ -3613,7 +4136,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" }); if (this.updateType == "prepend") { this.elementIdsToAdd.reverse().forEach((elemId) => { - maybe(document.getElementById(elemId), (elem) => container.insertAdjacentElement("afterbegin", elem)); + maybe( + document.getElementById(elemId), + (elem) => container.insertAdjacentElement("afterbegin", elem) + ); }); } } @@ -3757,6 +4283,12 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } syncBooleanAttrProp(fromEl, toEl, "selected"); }, + /** + * The "value" attribute is special for the element since it sets + * the initial value. Changing the "value" attribute without changing the + * "value" property will have no effect since it is only used to the set the + * initial value. Similar for the "checked" attribute, and "disabled". + */ INPUT: function(fromEl, toEl) { syncBooleanAttrProp(fromEl, toEl, "checked"); syncBooleanAttrProp(fromEl, toEl, "disabled"); @@ -3928,7 +4460,12 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (curFromNodeKey = getNodeKey(curFromNodeChild)) { addKeyedRemoval(curFromNodeKey); } else { - removeNode(curFromNodeChild, fromEl, true); + removeNode( + curFromNodeChild, + fromEl, + true + /* skip keyed nodes */ + ); } curFromNodeChild = fromNextSibling; } @@ -3993,7 +4530,12 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (curFromNodeKey) { addKeyedRemoval(curFromNodeKey); } else { - removeNode(curFromNodeChild, fromEl, true); + removeNode( + curFromNodeChild, + fromEl, + true + /* skip keyed nodes */ + ); } curFromNodeChild = matchingFromEl; curFromNodeKey = getNodeKey(curFromNodeChild); @@ -4024,7 +4566,12 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (curFromNodeKey) { addKeyedRemoval(curFromNodeKey); } else { - removeNode(curFromNodeChild, fromEl, true); + removeNode( + curFromNodeChild, + fromEl, + true + /* skip keyed nodes */ + ); } curFromNodeChild = fromNextSibling; } @@ -4149,9 +4696,13 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } markPrunableContentForRemoval() { const phxUpdate = this.liveSocket.binding(PHX_UPDATE); - dom_default.all(this.container, `[${phxUpdate}=append] > *, [${phxUpdate}=prepend] > *`, (el) => { - el.setAttribute(PHX_PRUNE, ""); - }); + dom_default.all( + this.container, + `[${phxUpdate}=append] > *, [${phxUpdate}=prepend] > *`, + (el) => { + el.setAttribute(PHX_PRUNE, ""); + } + ); } perform(isJoinPatch) { const { view, liveSocket: liveSocket2, html, container } = this; @@ -4164,7 +4715,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (closestLock) { const clonedTree = dom_default.private(closestLock, PHX_REF_LOCK); if (clonedTree) { - targetContainer = clonedTree.querySelector(`[data-phx-component="${this.targetCID}"]`); + targetContainer = clonedTree.querySelector( + `[data-phx-component="${this.targetCID}"]` + ); } } } @@ -4181,6 +4734,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" let externalFormTriggered = null; const morph = (targetContainer2, source, withChildren = this.withChildren) => { const morphCallbacks = { + // normally, we are running with childrenOnly, as the patch HTML for a LV + // does not include the LV attrs (data-phx-session, etc.) + // when we are patching a live component, we do want to patch the root element as well; + // another case is the recursive patch of a stream item that was kept on reset (-> onBeforeNodeAdded) childrenOnly: targetContainer2.getAttribute(PHX_COMPONENT) === null && !withChildren, getNodeKey: (node) => { if (dom_default.isPhxDestroyed(node)) { @@ -4191,9 +4748,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } return node.id || node.getAttribute && node.getAttribute(PHX_MAGIC_ID); }, + // skip indexing from children when container is stream skipFromChildren: (from) => { return from.getAttribute(phxUpdate) === PHX_STREAM; }, + // tell morphdom how to add a child addChild: (parent, child) => { const { ref, streamAt } = this.getStreamInsert(child); if (ref === void 0) { @@ -4205,7 +4764,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } else if (streamAt === -1) { const lastChild = parent.lastElementChild; if (lastChild && !lastChild.hasAttribute(PHX_STREAM_REF)) { - const nonStreamChild = Array.from(parent.children).find((c) => !c.hasAttribute(PHX_STREAM_REF)); + const nonStreamChild = Array.from(parent.children).find( + (c) => !c.hasAttribute(PHX_STREAM_REF) + ); parent.insertBefore(child, nonStreamChild); } else { parent.appendChild(child); @@ -4275,7 +4836,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return false; } if (dom_default.isPortalTemplate(el)) { - const teleportedEl = document.getElementById(el.content.firstElementChild.id); + const teleportedEl = document.getElementById( + el.content.firstElementChild.id + ); if (teleportedEl) { teleportedEl.remove(); morphCallbacks.onNodeDiscarded(teleportedEl); @@ -4298,7 +4861,12 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return morphCallbacks.onNodeAdded(toEl); } dom_default.syncPendingAttrs(fromEl, toEl); - dom_default.maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom); + dom_default.maintainPrivateHooks( + fromEl, + toEl, + phxViewportTop, + phxViewportBottom + ); dom_default.cleanChildNodes(toEl, phxUpdate); if (this.skipCIDSibling(toEl)) { this.maybeReOrderStream(fromEl); @@ -4360,7 +4928,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return false; } if (this.undoRef && dom_default.private(toEl, PHX_REF_LOCK)) { - dom_default.putPrivate(fromEl, PHX_REF_LOCK, dom_default.private(toEl, PHX_REF_LOCK)); + dom_default.putPrivate( + fromEl, + PHX_REF_LOCK, + dom_default.private(toEl, PHX_REF_LOCK) + ); } dom_default.copyPrivates(toEl, fromEl); if (dom_default.isPortalTemplate(toEl)) { @@ -4379,7 +4951,13 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" fromEl.blur(); } if (dom_default.isPhxUpdate(toEl, phxUpdate, ["append", "prepend"])) { - appendPrependUpdates.push(new DOMPostMorphRestorer(fromEl, toEl, toEl.getAttribute(phxUpdate))); + appendPrependUpdates.push( + new DOMPostMorphRestorer( + fromEl, + toEl, + toEl.getAttribute(phxUpdate) + ) + ); } dom_default.syncAttrsToProps(toEl); dom_default.applyStickyOperations(toEl); @@ -4421,7 +4999,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.view.portalElementIds.forEach((id) => { const el = document.getElementById(id); if (el) { - const source = document.getElementById(el.getAttribute(PHX_TELEPORTED_SRC)); + const source = document.getElementById( + el.getAttribute(PHX_TELEPORTED_SRC) + ); if (!source) { el.remove(); this.onNodeDiscarded(el); @@ -4433,18 +5013,25 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (liveSocket2.isDebugEnabled()) { detectDuplicateIds(); detectInvalidStreamInserts(this.streamInserts); - Array.from(document.querySelectorAll("input[name=id]")).forEach((node) => { - if (node instanceof HTMLInputElement && node.form) { - console.error('Detected an input with name="id" inside a form! This will cause problems when patching the DOM.\n', node); + Array.from(document.querySelectorAll("input[name=id]")).forEach( + (node) => { + if (node instanceof HTMLInputElement && node.form) { + console.error( + 'Detected an input with name="id" inside a form! This will cause problems when patching the DOM.\n', + node + ); + } } - }); + ); } if (appendPrependUpdates.length > 0) { liveSocket2.time("post-morph append/prepend restoration", () => { appendPrependUpdates.forEach((update) => update.perform()); }); } - liveSocket2.silenceEvents(() => dom_default.restoreFocus(focused, selectionStart, selectionEnd)); + liveSocket2.silenceEvents( + () => dom_default.restoreFocus(focused, selectionStart, selectionEnd) + ); dom_default.dispatchEvent(document, "phx:update"); added.forEach((el) => this.trackAfter("added", el)); updates.forEach((el) => this.trackAfter("updated", el)); @@ -4463,7 +5050,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" input.value = submitter.value; submitter.parentElement.insertBefore(input, submitter); } - Object.getPrototypeOf(externalFormTriggered).submit.call(externalFormTriggered); + Object.getPrototypeOf(externalFormTriggered).submit.call( + externalFormTriggered + ); } return true; } @@ -4500,7 +5089,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return insert || {}; } setStreamRef(el, ref) { - dom_default.putSticky(el, PHX_STREAM_REF, (el2) => el2.setAttribute(PHX_STREAM_REF, ref)); + dom_default.putSticky( + el, + PHX_STREAM_REF, + (el2) => el2.setAttribute(PHX_STREAM_REF, ref) + ); } maybeReOrderStream(el, isNew) { const { ref, streamAt, reset } = this.getStreamInsert(el); @@ -4576,7 +5169,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (!this.isCIDPatch()) { return; } - const [first, ...rest] = dom_default.findComponentNodeList(this.view.id, this.targetCID); + const [first, ...rest] = dom_default.findComponentNodeList( + this.view.id, + this.targetCID + ); if (rest.length === 0 && dom_default.childNodeLength(html) === 1) { return first; } else { @@ -4590,14 +5186,18 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const targetSelector = el.getAttribute(PHX_PORTAL); const portalContainer = document.querySelector(targetSelector); if (!portalContainer) { - throw new Error("portal target with selector " + targetSelector + " not found"); + throw new Error( + "portal target with selector " + targetSelector + " not found" + ); } const toTeleport = el.content.firstElementChild; if (this.skipCIDSibling(toTeleport)) { return; } if (!(toTeleport == null ? void 0 : toTeleport.id)) { - throw new Error("phx-portal template must have a single root element with ID!"); + throw new Error( + "phx-portal template must have a single root element with ID!" + ); } const existing = document.getElementById(toTeleport.id); let portalTarget; @@ -4742,7 +5342,13 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return this.viewId; } toString(onlyCids) { - const { buffer: str, streams } = this.recursiveToString(this.rendered, this.rendered[COMPONENTS], onlyCids, true, {}); + const { buffer: str, streams } = this.recursiveToString( + this.rendered, + this.rendered[COMPONENTS], + onlyCids, + true, + {} + ); return { buffer: str, streams }; } recursiveToString(rendered, components = rendered[COMPONENTS], onlyCids, changeTracking, rootAttrs) { @@ -4846,6 +5452,7 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return JSON.parse(JSON.stringify(diff)); } } + // keyed comprehensions mergeKeyed(target, source) { const clonedTarget = this.clone(target); Object.entries(source[KEYED]).forEach(([i, entry]) => { @@ -4879,6 +5486,14 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" target[TEMPLATES] = source[TEMPLATES]; } } + // Merges cid trees together, copying statics from source tree. + // + // The `pruneMagicId` is passed to control pruning the magicId of the + // target. We must always prune the magicId when we are sharing statics + // from another component. If not pruning, we replicate the logic from + // mutableMerge, where we set newRender to true if there is a root + // (effectively forcing the new version to be rendered instead of skipped) + // cloneMerge(target, source, pruneMagicId) { const merged = __spreadValues(__spreadValues({}, target), source); for (const key in merged) { @@ -4899,13 +5514,18 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return merged; } componentToString(cid) { - const { buffer: str, streams } = this.recursiveCIDToString(this.rendered[COMPONENTS], cid, null); + const { buffer: str, streams } = this.recursiveCIDToString( + this.rendered[COMPONENTS], + cid, + null + ); const [strippedHTML, _before, _after] = modifyRoot(str, {}); return { buffer: strippedHTML, streams }; } pruneCIDs(cids) { cids.forEach((cid) => delete this.rendered[COMPONENTS][cid]); } + // private get() { return this.rendered; } @@ -4923,9 +5543,17 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.magicId++; return `m${this.magicId}-${this.parentViewId()}`; } + // Converts rendered tree to output buffer. + // + // changeTracking controls if we can apply the PHX_SKIP optimization. toOutputBuffer(rendered, templates, output, changeTracking, rootAttrs = {}) { if (rendered[KEYED]) { - return this.comprehensionToBuffer(rendered, templates, output, changeTracking); + return this.comprehensionToBuffer( + rendered, + templates, + output, + changeTracking + ); } if (rendered[TEMPLATES]) { templates = rendered[TEMPLATES]; @@ -4960,7 +5588,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (skip) { attrs[PHX_SKIP] = true; } - const [newRoot, commentBefore, commentAfter] = modifyRoot(output.buffer, attrs, skip); + const [newRoot, commentBefore, commentAfter] = modifyRoot( + output.buffer, + attrs, + skip + ); rendered.newRender = false; output.buffer = prevBuffer + commentBefore + newRoot + commentAfter; } @@ -4973,7 +5605,12 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" for (let i = 0; i < rendered[KEYED][KEYED_COUNT]; i++) { output.buffer += statics[0]; for (let j = 1; j < statics.length; j++) { - this.dynamicToBuffer(rendered[KEYED][i][j - 1], keyedTemplates, output, changeTracking); + this.dynamicToBuffer( + rendered[KEYED][i][j - 1], + keyedTemplates, + output, + changeTracking + ); output.buffer += statics[j]; } } @@ -4991,7 +5628,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } dynamicToBuffer(rendered, templates, output, changeTracking) { if (typeof rendered === "number") { - const { buffer: str, streams } = this.recursiveCIDToString(output.components, rendered, output.onlyCids); + const { buffer: str, streams } = this.recursiveCIDToString( + output.components, + rendered, + output.onlyCids + ); output.buffer += str; output.streams = /* @__PURE__ */ new Set([...output.streams, ...streams]); } else if (isObject(rendered)) { @@ -5007,7 +5648,13 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" component.newRender = !skip; component.magicId = `c${cid}-${this.parentViewId()}`; const changeTracking = !component.reset; - const { buffer: html, streams } = this.recursiveToString(component, components, onlyCids, changeTracking, attrs); + const { buffer: html, streams } = this.recursiveToString( + component, + components, + onlyCids, + changeTracking, + attrs + ); delete component.reset; return { buffer: html, streams }; } @@ -5015,6 +5662,7 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" var focusStack = []; var default_transition_time = 200; var JS = { + // private exec(e, eventType, phxEvent, view, sourceEl, defaults) { const [defaultKind, defaultArgs] = defaults || [ null, @@ -5034,12 +5682,15 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" isVisible(el) { return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length > 0); }, + // returns true if any part of the element is inside the viewport isInViewport(el) { const rect = el.getBoundingClientRect(); const windowHeight = window.innerHeight || document.documentElement.clientHeight; const windowWidth = window.innerWidth || document.documentElement.clientWidth; return rect.right > 0 && rect.bottom > 0 && rect.left < windowWidth && rect.top < windowHeight; }, + // private + // commands exec_exec(e, eventType, phxEvent, view, sourceEl, el, { attr, to }) { const encodedJS = el.getAttribute(attr); if (!encodedJS) { @@ -5088,12 +5739,34 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (_target) { pushOpts._target = _target; } - targetView.pushInput(sourceEl, targetCtx, newCid, event || phxEvent, pushOpts, callback); + targetView.pushInput( + sourceEl, + targetCtx, + newCid, + event || phxEvent, + pushOpts, + callback + ); } else if (eventType === "submit") { const { submitter } = args; - targetView.submitForm(sourceEl, targetCtx, event || phxEvent, submitter, pushOpts, callback); + targetView.submitForm( + sourceEl, + targetCtx, + event || phxEvent, + submitter, + pushOpts, + callback + ); } else { - targetView.pushEvent(eventType, sourceEl, targetCtx, event || phxEvent, data, pushOpts, callback); + targetView.pushEvent( + eventType, + sourceEl, + targetCtx, + event || phxEvent, + data, + pushOpts, + callback + ); } }; if (args.targetView && args.targetCtx) { @@ -5103,10 +5776,21 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } }, exec_navigate(e, eventType, phxEvent, view, sourceEl, el, { href, replace }) { - view.liveSocket.historyRedirect(e, href, replace ? "replace" : "push", null, sourceEl); + view.liveSocket.historyRedirect( + e, + href, + replace ? "replace" : "push", + null, + sourceEl + ); }, exec_patch(e, eventType, phxEvent, view, sourceEl, el, { href, replace }) { - view.liveSocket.pushHistoryPatch(e, href, replace ? "replace" : "push", sourceEl); + view.liveSocket.pushHistoryPatch( + e, + href, + replace ? "replace" : "push", + sourceEl + ); }, exec_focus(e, eventType, phxEvent, view, sourceEl, el) { aria_default.attemptFocus(el); @@ -5117,7 +5801,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" exec_focus_first(e, eventType, phxEvent, view, sourceEl, el) { aria_default.focusFirstInteractive(el) || aria_default.focusFirst(el); window.requestAnimationFrame(() => { - window.requestAnimationFrame(() => aria_default.focusFirstInteractive(el) || aria_default.focusFirst(el)); + window.requestAnimationFrame( + () => aria_default.focusFirstInteractive(el) || aria_default.focusFirst(el) + ); }); }, exec_push_focus(e, eventType, phxEvent, view, sourceEl, el) { @@ -5169,7 +5855,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" dom_default.putPrivate(el, "JS:ignore_attrs", { apply: (fromEl, toEl) => { Array.from(fromEl.attributes).forEach((attr) => { - if (attrs.some((toIgnore) => attr.name == toIgnore || toIgnore === "*" || toIgnore.includes("*") && attr.name.match(toIgnore) != null)) { + if (attrs.some( + (toIgnore) => attr.name == toIgnore || toIgnore === "*" || toIgnore.includes("*") && attr.name.match(toIgnore) != null + )) { toEl.setAttribute(attr.name, attr.value); } }); @@ -5182,14 +5870,33 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" ignoreAttrs.apply(fromEl, toEl); } }, + // utils for commands show(eventType, view, el, display, transition, time, blocking) { if (!this.isVisible(el)) { - this.toggle(eventType, view, el, display, transition, null, time, blocking); + this.toggle( + eventType, + view, + el, + display, + transition, + null, + time, + blocking + ); } }, hide(eventType, view, el, display, transition, time, blocking) { if (this.isVisible(el)) { - this.toggle(eventType, view, el, display, null, transition, time, blocking); + this.toggle( + eventType, + view, + el, + display, + null, + transition, + time, + blocking + ); } }, toggle(eventType, view, el, display, ins, outs, time, blocking) { @@ -5199,15 +5906,25 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (inClasses.length > 0 || outClasses.length > 0) { if (this.isVisible(el)) { const onStart = () => { - this.addOrRemoveClasses(el, outStartClasses, inClasses.concat(inStartClasses).concat(inEndClasses)); + this.addOrRemoveClasses( + el, + outStartClasses, + inClasses.concat(inStartClasses).concat(inEndClasses) + ); window.requestAnimationFrame(() => { this.addOrRemoveClasses(el, outClasses, []); - window.requestAnimationFrame(() => this.addOrRemoveClasses(el, outEndClasses, outStartClasses)); + window.requestAnimationFrame( + () => this.addOrRemoveClasses(el, outEndClasses, outStartClasses) + ); }); }; const onEnd = () => { this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses)); - dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = "none"); + dom_default.putSticky( + el, + "toggle", + (currentEl) => currentEl.style.display = "none" + ); el.dispatchEvent(new Event("phx:hide-end")); }; el.dispatchEvent(new Event("phx:hide-start")); @@ -5222,12 +5939,20 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return; } const onStart = () => { - this.addOrRemoveClasses(el, inStartClasses, outClasses.concat(outStartClasses).concat(outEndClasses)); + this.addOrRemoveClasses( + el, + inStartClasses, + outClasses.concat(outStartClasses).concat(outEndClasses) + ); const stickyDisplay = display || this.defaultDisplay(el); window.requestAnimationFrame(() => { this.addOrRemoveClasses(el, inClasses, []); window.requestAnimationFrame(() => { - dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = stickyDisplay); + dom_default.putSticky( + el, + "toggle", + (currentEl) => currentEl.style.display = stickyDisplay + ); this.addOrRemoveClasses(el, inEndClasses, inStartClasses); }); }); @@ -5248,14 +5973,22 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (this.isVisible(el)) { window.requestAnimationFrame(() => { el.dispatchEvent(new Event("phx:hide-start")); - dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = "none"); + dom_default.putSticky( + el, + "toggle", + (currentEl) => currentEl.style.display = "none" + ); el.dispatchEvent(new Event("phx:hide-end")); }); } else { window.requestAnimationFrame(() => { el.dispatchEvent(new Event("phx:show-start")); const stickyDisplay = display || this.defaultDisplay(el); - dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = stickyDisplay); + dom_default.putSticky( + el, + "toggle", + (currentEl) => currentEl.style.display = stickyDisplay + ); el.dispatchEvent(new Event("phx:show-end")); }); } @@ -5264,9 +5997,21 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" toggleClasses(el, classes, transition, time, view, blocking) { window.requestAnimationFrame(() => { const [prevAdds, prevRemoves] = dom_default.getSticky(el, "classes", [[], []]); - const newAdds = classes.filter((name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name)); - const newRemoves = classes.filter((name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name)); - this.addOrRemoveClasses(el, newAdds, newRemoves, transition, time, view, blocking); + const newAdds = classes.filter( + (name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name) + ); + const newRemoves = classes.filter( + (name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name) + ); + this.addOrRemoveClasses( + el, + newAdds, + newRemoves, + transition, + time, + view, + blocking + ); }); }, toggleAttr(el, attr, val1, val2) { @@ -5293,13 +6038,23 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" ]; if (transitionRun.length > 0) { const onStart = () => { - this.addOrRemoveClasses(el, transitionStart, [].concat(transitionRun).concat(transitionEnd)); + this.addOrRemoveClasses( + el, + transitionStart, + [].concat(transitionRun).concat(transitionEnd) + ); window.requestAnimationFrame(() => { this.addOrRemoveClasses(el, transitionRun, []); - window.requestAnimationFrame(() => this.addOrRemoveClasses(el, transitionEnd, transitionStart)); + window.requestAnimationFrame( + () => this.addOrRemoveClasses(el, transitionEnd, transitionStart) + ); }); }; - const onDone = () => this.addOrRemoveClasses(el, adds.concat(transitionEnd), removes.concat(transitionRun).concat(transitionStart)); + const onDone = () => this.addOrRemoveClasses( + el, + adds.concat(transitionEnd), + removes.concat(transitionRun).concat(transitionStart) + ); if (blocking === false) { onStart(); setTimeout(onDone, time); @@ -5310,8 +6065,12 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } window.requestAnimationFrame(() => { const [prevAdds, prevRemoves] = dom_default.getSticky(el, "classes", [[], []]); - const keepAdds = adds.filter((name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name)); - const keepRemoves = removes.filter((name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name)); + const keepAdds = adds.filter( + (name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name) + ); + const keepRemoves = removes.filter( + (name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name) + ); const newAdds = prevAdds.filter((name) => removes.indexOf(name) < 0).concat(keepAdds); const newRemoves = prevRemoves.filter((name) => adds.indexOf(name) < 0).concat(keepRemoves); dom_default.putSticky(el, "classes", (currentEl) => { @@ -5373,36 +6132,92 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" }, show(el, opts = {}) { const owner = liveSocket2.owner(el); - js_default.show(eventType, owner, el, opts.display, js_default.transitionClasses(opts.transition), opts.time, opts.blocking); + js_default.show( + eventType, + owner, + el, + opts.display, + js_default.transitionClasses(opts.transition), + opts.time, + opts.blocking + ); }, hide(el, opts = {}) { const owner = liveSocket2.owner(el); - js_default.hide(eventType, owner, el, null, js_default.transitionClasses(opts.transition), opts.time, opts.blocking); + js_default.hide( + eventType, + owner, + el, + null, + js_default.transitionClasses(opts.transition), + opts.time, + opts.blocking + ); }, toggle(el, opts = {}) { const owner = liveSocket2.owner(el); const inTransition = js_default.transitionClasses(opts.in); const outTransition = js_default.transitionClasses(opts.out); - js_default.toggle(eventType, owner, el, opts.display, inTransition, outTransition, opts.time, opts.blocking); + js_default.toggle( + eventType, + owner, + el, + opts.display, + inTransition, + outTransition, + opts.time, + opts.blocking + ); }, addClass(el, names, opts = {}) { const classNames = Array.isArray(names) ? names : names.split(" "); const owner = liveSocket2.owner(el); - js_default.addOrRemoveClasses(el, classNames, [], js_default.transitionClasses(opts.transition), opts.time, owner, opts.blocking); + js_default.addOrRemoveClasses( + el, + classNames, + [], + js_default.transitionClasses(opts.transition), + opts.time, + owner, + opts.blocking + ); }, removeClass(el, names, opts = {}) { const classNames = Array.isArray(names) ? names : names.split(" "); const owner = liveSocket2.owner(el); - js_default.addOrRemoveClasses(el, [], classNames, js_default.transitionClasses(opts.transition), opts.time, owner, opts.blocking); + js_default.addOrRemoveClasses( + el, + [], + classNames, + js_default.transitionClasses(opts.transition), + opts.time, + owner, + opts.blocking + ); }, toggleClass(el, names, opts = {}) { const classNames = Array.isArray(names) ? names : names.split(" "); const owner = liveSocket2.owner(el); - js_default.toggleClasses(el, classNames, js_default.transitionClasses(opts.transition), opts.time, owner, opts.blocking); + js_default.toggleClasses( + el, + classNames, + js_default.transitionClasses(opts.transition), + opts.time, + owner, + opts.blocking + ); }, transition(el, transition, opts = {}) { const owner = liveSocket2.owner(el); - js_default.addOrRemoveClasses(el, [], [], js_default.transitionClasses(transition), opts.time, owner, opts.blocking); + js_default.addOrRemoveClasses( + el, + [], + [], + js_default.transitionClasses(transition), + opts.time, + owner, + opts.blocking + ); }, setAttribute(el, attr, val) { js_default.setOrRemoveAttrs(el, [[attr, val]], []); @@ -5423,11 +6238,22 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" }, navigate(href, opts = {}) { const customEvent = new CustomEvent("phx:exec"); - liveSocket2.historyRedirect(customEvent, href, opts.replace ? "replace" : "push", null, null); + liveSocket2.historyRedirect( + customEvent, + href, + opts.replace ? "replace" : "push", + null, + null + ); }, patch(href, opts = {}) { const customEvent = new CustomEvent("phx:exec"); - liveSocket2.pushHistoryPatch(customEvent, href, opts.replace ? "replace" : "push", null); + liveSocket2.pushHistoryPatch( + customEvent, + href, + opts.replace ? "replace" : "push", + null + ); }, ignoreAttributes(el, attrs) { js_default.ignoreAttrs(el, Array.isArray(attrs) ? attrs : [attrs]); @@ -5457,6 +6283,8 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" "__listeners", "__isDisconnected", "constructor", + // Standard object properties + // Core ViewHook API methods "js", "pushEvent", "pushEventTo", @@ -5464,6 +6292,7 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" "removeHandleEvent", "upload", "uploadTo", + // Internal lifecycle callers "__mounted", "__updated", "__beforeUpdate", @@ -5476,7 +6305,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (Object.prototype.hasOwnProperty.call(callbacks, key)) { this[key] = callbacks[key]; if (protectedProps.has(key)) { - console.warn(`Hook object for element #${el.id} overwrites core property '${key}'!`); + console.warn( + `Hook object for element #${el.id} overwrites core property '${key}'!` + ); } } } @@ -5495,17 +6326,21 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" }); } } + /** @internal */ __attachView(view) { if (view) { this.__view = () => view; this.liveSocket = view.liveSocket; } else { this.__view = () => { - throw new Error(`hook not yet attached to a live view: ${this.el.outerHTML}`); + throw new Error( + `hook not yet attached to a live view: ${this.el.outerHTML}` + ); }; this.liveSocket = null; } } + // Default lifecycle methods mounted() { } beforeUpdate() { @@ -5518,25 +6353,32 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } reconnected() { } + // Internal lifecycle callers - called by the View + /** @internal */ __mounted() { this.mounted(); } + /** @internal */ __updated() { this.updated(); } + /** @internal */ __beforeUpdate() { this.beforeUpdate(); } + /** @internal */ __destroyed() { this.destroyed(); dom_default.deletePrivate(this.el, HOOK_ID); } + /** @internal */ __reconnected() { if (this.__isDisconnected) { this.__isDisconnected = false; this.reconnected(); } } + /** @internal */ __disconnected() { this.__isDisconnected = true; this.disconnected(); @@ -5549,7 +6391,12 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" }); } pushEvent(event, payload, onReply) { - const promise = this.__view().pushHookEvent(this.el, null, event, payload || {}); + const promise = this.__view().pushHookEvent( + this.el, + null, + event, + payload || {} + ); if (onReply === void 0) { return promise.then(({ reply }) => reply); } @@ -5579,12 +6426,18 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" event, callback: (customEvent) => callback(customEvent.detail) }; - window.addEventListener(`phx:${event}`, callbackRef.callback); + window.addEventListener( + `phx:${event}`, + callbackRef.callback + ); this.__listeners.add(callbackRef); return callbackRef; } removeHandleEvent(ref) { - window.removeEventListener(`phx:${ref.event}`, ref.callback); + window.removeEventListener( + `phx:${ref.event}`, + ref.callback + ); this.__listeners.delete(ref); } upload(name, files) { @@ -5595,8 +6448,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" view.dispatchUploads(targetCtx, name, files); }); } + /** @internal */ __cleanup__() { - this.__listeners.forEach((callbackRef) => this.removeHandleEvent(callbackRef)); + this.__listeners.forEach( + (callbackRef) => this.removeHandleEvent(callbackRef) + ); } }; var prependFormDataKey = (key, prefix) => { @@ -5632,24 +6488,27 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" }); toRemove.forEach((key) => formData.delete(key)); const params = new URLSearchParams(); - const { inputsUnused, onlyHiddenInputs } = Array.from(form.elements).reduce((acc, input) => { - const { inputsUnused: inputsUnused2, onlyHiddenInputs: onlyHiddenInputs2 } = acc; - const key = input.name; - if (!key) { + const { inputsUnused, onlyHiddenInputs } = Array.from(form.elements).reduce( + (acc, input) => { + const { inputsUnused: inputsUnused2, onlyHiddenInputs: onlyHiddenInputs2 } = acc; + const key = input.name; + if (!key) { + return acc; + } + if (inputsUnused2[key] === void 0) { + inputsUnused2[key] = true; + } + if (onlyHiddenInputs2[key] === void 0) { + onlyHiddenInputs2[key] = true; + } + const isUsed = dom_default.private(input, PHX_HAS_FOCUSED) || dom_default.private(input, PHX_HAS_SUBMITTED); + const isHidden = input.type === "hidden"; + inputsUnused2[key] = inputsUnused2[key] && !isUsed; + onlyHiddenInputs2[key] = onlyHiddenInputs2[key] && isHidden; return acc; - } - if (inputsUnused2[key] === void 0) { - inputsUnused2[key] = true; - } - if (onlyHiddenInputs2[key] === void 0) { - onlyHiddenInputs2[key] = true; - } - const isUsed = dom_default.private(input, PHX_HAS_FOCUSED) || dom_default.private(input, PHX_HAS_SUBMITTED); - const isHidden = input.type === "hidden"; - inputsUnused2[key] = inputsUnused2[key] && !isUsed; - onlyHiddenInputs2[key] = onlyHiddenInputs2[key] && isHidden; - return acc; - }, { inputsUnused: {}, onlyHiddenInputs: {} }); + }, + { inputsUnused: {}, onlyHiddenInputs: {} } + ); for (const [key, val] of formData.entries()) { if (onlyNames.length === 0 || onlyNames.indexOf(key) >= 0) { const isUnused = inputsUnused[key]; @@ -5681,13 +6540,16 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.el = el; const boundView = dom_default.private(this.el, "view"); if (boundView !== void 0 && boundView.isDead !== true) { - logError(`The DOM element for this view has already been bound to a view. + logError( + `The DOM element for this view has already been bound to a view. An element can only ever be associated with a single view! Please ensure that you are not trying to initialize multiple LiveSockets on the same page. This could happen if you're accidentally trying to render your root layout more than once. Ensure that the template set on the LiveView is different than the root layout. - `, { view: boundView }); + `, + { view: boundView } + ); throw new Error("Cannot bind multiple views to the same DOM element."); } dom_default.putPrivate(this.el, "view", this); @@ -5784,7 +6646,13 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.channel.leave().receive("ok", onFinished).receive("error", onFinished).receive("timeout", onFinished); } setContainerClasses(...classes) { - this.el.classList.remove(PHX_CONNECTED_CLASS, PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_CLIENT_ERROR_CLASS, PHX_SERVER_ERROR_CLASS); + this.el.classList.remove( + PHX_CONNECTED_CLASS, + PHX_LOADING_CLASS, + PHX_ERROR_CLASS, + PHX_CLIENT_ERROR_CLASS, + PHX_SERVER_ERROR_CLASS + ); this.el.classList.add(...classes); } showLoader(timeout) { @@ -5799,7 +6667,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } } execAll(binding) { - dom_default.all(this.el, `[${binding}]`, (el) => this.liveSocket.execJS(el, el.getAttribute(binding))); + dom_default.all( + this.el, + `[${binding}]`, + (el) => this.liveSocket.execJS(el, el.getAttribute(binding)) + ); } hideLoader() { clearTimeout(this.loaderTimer); @@ -5819,9 +6691,18 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" }) { this.liveSocket.transition(time, onStart, onDone); } + // calls the callback with the view and target element for the given phxTarget + // targets can be: + // * an element itself, then it is simply passed to liveSocket.owner; + // * a CID (Component ID), then we first search the component's element in the DOM + // * a selector, then we search the selector in the DOM and call the callback + // for each element found with the corresponding owner view withinTargets(phxTarget, callback, dom = document) { if (phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement) { - return this.liveSocket.owner(phxTarget, (view) => callback(view, phxTarget)); + return this.liveSocket.owner( + phxTarget, + (view) => callback(view, phxTarget) + ); } if (isCid(phxTarget)) { const targets = dom_default.findComponentNodeList(this.id, phxTarget, dom); @@ -5833,9 +6714,13 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } else { const targets = Array.from(dom.querySelectorAll(phxTarget)); if (targets.length === 0) { - logError(`nothing found matching the phx-target selector "${phxTarget}"`); + logError( + `nothing found matching the phx-target selector "${phxTarget}"` + ); } - targets.forEach((target) => this.liveSocket.owner(target, (view) => callback(view, target))); + targets.forEach( + (target) => this.liveSocket.owner(target, (view) => callback(view, target)) + ); } } applyDiff(type, rawDiff, callback) { @@ -5866,12 +6751,18 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" }); } if (liveview_version !== this.liveSocket.version()) { - console.error(`LiveView asset version mismatch. JavaScript version ${this.liveSocket.version()} vs. server ${liveview_version}. To avoid issues, please ensure that your assets use the same version as the server.`); + console.error( + `LiveView asset version mismatch. JavaScript version ${this.liveSocket.version()} vs. server ${liveview_version}. To avoid issues, please ensure that your assets use the same version as the server.` + ); } if (pid) { this.el.setAttribute(PHX_LV_PID, pid); } - browser_default.dropLocal(this.liveSocket.localStorage, window.location.pathname, CONSECUTIVE_RELOADS); + browser_default.dropLocal( + this.liveSocket.localStorage, + window.location.pathname, + CONSECUTIVE_RELOADS + ); this.applyDiff("mount", rendered, ({ diff, events }) => { this.rendered = new Rendered(this.id, diff); const [html, streams] = this.renderContainer(null, "join"); @@ -5894,17 +6785,19 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (this.joinCount > 1 || this.parent && !this.parent.isJoinPending()) { return this.applyJoinPatch(live_patch, html, streams, events); } - const newChildren = dom_default.findPhxChildrenInFragment(html, this.id).filter((toEl) => { - const fromEl = toEl.id && this.el.querySelector(`[id="${toEl.id}"]`); - const phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC); - if (phxStatic) { - toEl.setAttribute(PHX_STATIC, phxStatic); - } - if (fromEl) { - fromEl.setAttribute(PHX_ROOT_ID, this.root.id); + const newChildren = dom_default.findPhxChildrenInFragment(html, this.id).filter( + (toEl) => { + const fromEl = toEl.id && this.el.querySelector(`[id="${toEl.id}"]`); + const phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC); + if (phxStatic) { + toEl.setAttribute(PHX_STATIC, phxStatic); + } + if (fromEl) { + fromEl.setAttribute(PHX_ROOT_ID, this.root.id); + } + return this.joinChild(toEl); } - return this.joinChild(toEl); - }); + ); if (newChildren.length === 0) { if (this.parent) { this.root.pendingJoinOps.push([ @@ -5927,16 +6820,33 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.el = dom_default.byId(this.id); this.el.setAttribute(PHX_ROOT_ID, this.root.id); } + // this is invoked for dead and live views, so we must filter by + // by owner to ensure we aren't duplicating hooks across disconnect + // and connected states. This also handles cases where hooks exist + // in a root layout with a LV in the body execNewMounted(parent = document) { let phxViewportTop = this.binding(PHX_VIEWPORT_TOP); let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM); - this.all(parent, `[${phxViewportTop}], [${phxViewportBottom}]`, (hookEl) => { - dom_default.maintainPrivateHooks(hookEl, hookEl, phxViewportTop, phxViewportBottom); - this.maybeAddNewHook(hookEl); - }); - this.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`, (hookEl) => { - this.maybeAddNewHook(hookEl); - }); + this.all( + parent, + `[${phxViewportTop}], [${phxViewportBottom}]`, + (hookEl) => { + dom_default.maintainPrivateHooks( + hookEl, + hookEl, + phxViewportTop, + phxViewportBottom + ); + this.maybeAddNewHook(hookEl); + } + ); + this.all( + parent, + `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`, + (hookEl) => { + this.maybeAddNewHook(hookEl); + } + ); this.all(parent, `[${this.binding(PHX_MOUNTED)}]`, (el) => { this.maybeMounted(el); }); @@ -6036,7 +6946,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" removedEls.push(el); } }); - patch.after("transitionsDiscarded", (els) => this.afterElementsRemoved(els, pruneCids)); + patch.after( + "transitionsDiscarded", + (els) => this.afterElementsRemoved(els, pruneCids) + ); patch.perform(isJoinPatch); this.afterElementsRemoved(removedEls, pruneCids); this.liveSocket.triggerDOM("onPatchEnd", [patch.targetContainer]); @@ -6045,8 +6958,14 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" afterElementsRemoved(elements, pruneCids) { const destroyedCIDs = []; elements.forEach((parent) => { - const components = dom_default.all(parent, `[${PHX_VIEW_REF}="${this.id}"][${PHX_COMPONENT}]`); - const hooks = dom_default.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-hook]`); + const components = dom_default.all( + parent, + `[${PHX_VIEW_REF}="${this.id}"][${PHX_COMPONENT}]` + ); + const hooks = dom_default.all( + parent, + `[${this.binding(PHX_HOOK)}], [data-phx-hook]` + ); components.concat(parent).forEach((el) => { const cid = this.componentID(el); if (isCid(cid) && destroyedCIDs.indexOf(cid) === -1 && el.getAttribute(PHX_VIEW_REF) === this.id) { @@ -6071,7 +6990,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const template = document.createElement("template"); template.innerHTML = html; dom_default.all(template.content, `[${PHX_PORTAL}]`).forEach((portalTemplate) => { - template.content.firstElementChild.appendChild(portalTemplate.content.firstElementChild); + template.content.firstElementChild.appendChild( + portalTemplate.content.firstElementChild + ); }); const rootEl = template.content.firstElementChild; rootEl.id = this.id; @@ -6079,20 +7000,31 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" rootEl.setAttribute(PHX_SESSION, this.getSession()); rootEl.setAttribute(PHX_STATIC, this.getStatic()); rootEl.setAttribute(PHX_PARENT_ID, this.parent ? this.parent.id : null); - const formsToRecover = dom_default.all(template.content, "form").filter((newForm) => newForm.id && oldForms[newForm.id]).filter((newForm) => !this.pendingForms.has(newForm.id)).filter((newForm) => oldForms[newForm.id].getAttribute(phxChange) === newForm.getAttribute(phxChange)).map((newForm) => { - return [oldForms[newForm.id], newForm]; - }); + const formsToRecover = ( + // we go over all forms in the new DOM; because this is only the HTML for the current + // view, we can be sure that all forms are owned by this view: + dom_default.all(template.content, "form").filter((newForm) => newForm.id && oldForms[newForm.id]).filter((newForm) => !this.pendingForms.has(newForm.id)).filter( + (newForm) => oldForms[newForm.id].getAttribute(phxChange) === newForm.getAttribute(phxChange) + ).map((newForm) => { + return [oldForms[newForm.id], newForm]; + }) + ); if (formsToRecover.length === 0) { return callback(); } formsToRecover.forEach(([oldForm, newForm], i) => { this.pendingForms.add(newForm.id); - this.pushFormRecovery(oldForm, newForm, template.content.firstElementChild, () => { - this.pendingForms.delete(newForm.id); - if (i === formsToRecover.length - 1) { - callback(); + this.pushFormRecovery( + oldForm, + newForm, + template.content.firstElementChild, + () => { + this.pendingForms.delete(newForm.id); + if (i === formsToRecover.length - 1) { + callback(); + } } - }); + ); }); } getChildById(id) { @@ -6161,9 +7093,15 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" let phxChildrenAdded = false; if (this.rendered.isComponentOnlyDiff(diff)) { this.liveSocket.time("component patch complete", () => { - const parentCids = dom_default.findExistingParentCIDs(this.id, this.rendered.componentCIDs(diff)); + const parentCids = dom_default.findExistingParentCIDs( + this.id, + this.rendered.componentCIDs(diff) + ); parentCids.forEach((parentCID) => { - if (this.componentPatch(this.rendered.getComponent(diff, parentCID), parentCID)) { + if (this.componentPatch( + this.rendered.getComponent(diff, parentCID), + parentCID + )) { phxChildrenAdded = true; } }); @@ -6220,7 +7158,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const hookDefinition = this.liveSocket.getHookDefinition(hookName); if (hookDefinition) { if (!el.id) { - logError(`no DOM ID for hook "${hookName}". Hooks require a unique ID on each element.`, el); + logError( + `no DOM ID for hook "${hookName}". Hooks require a unique ID on each element.`, + el + ); return; } let hookInstance; @@ -6230,7 +7171,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } else if (typeof hookDefinition === "object" && hookDefinition !== null) { hookInstance = new ViewHook(this, el, hookDefinition); } else { - logError(`Invalid hook definition for "${hookName}". Expected a class extending ViewHook or an object definition.`, el); + logError( + `Invalid hook definition for "${hookName}". Expected a class extending ViewHook or an object definition.`, + el + ); return; } } catch (e) { @@ -6252,7 +7196,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" delete this.viewHooks[hookId]; } applyPendingUpdates() { - this.pendingDiffs = this.pendingDiffs.filter(({ diff, events }) => !this.update(diff, events, true)); + this.pendingDiffs = this.pendingDiffs.filter( + ({ diff, events }) => !this.update(diff, events, true) + ); this.eachChild((child) => child.applyPendingUpdates()); } eachChild(callback) { @@ -6277,10 +7223,17 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" bindChannel() { this.liveSocket.onChannel(this.channel, "diff", (rawDiff) => { this.liveSocket.requestDOMUpdate(() => { - this.applyDiff("update", rawDiff, ({ diff, events }) => this.update(diff, events)); + this.applyDiff( + "update", + rawDiff, + ({ diff, events }) => this.update(diff, events) + ); }); }); - this.onChannel("redirect", ({ to, flash }) => this.onRedirect({ to, flash })); + this.onChannel( + "redirect", + ({ to, flash }) => this.onRedirect({ to, flash }) + ); this.onChannel("live_patch", (redir) => this.onLivePatch(redir)); this.onChannel("live_redirect", (redir) => this.onLiveRedirect(redir)); this.channel.onError((reason) => this.onError(reason)); @@ -6305,6 +7258,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" expandURL(to) { return to.startsWith("/") ? `${window.location.protocol}//${window.location.host}${to}` : to; } + /** + * @param {{to: string, flash?: string, reloadToken?: string}} redirect + */ onRedirect({ to, flash, reloadToken }) { this.liveSocket.redirect(to, flash, reloadToken); } @@ -6366,13 +7322,19 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } this.log("error", () => ["unable to join", resp]); if (this.isMain()) { - this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS], { unstructuredError: resp, errorKind: "server" }); + this.displayError( + [PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS], + { unstructuredError: resp, errorKind: "server" } + ); if (this.liveSocket.isConnected()) { this.liveSocket.reloadWithJitter(this); } } else { if (this.joinAttempts >= MAX_CHILD_JOIN_ATTEMPTS) { - this.root.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS], { unstructuredError: resp, errorKind: "server" }); + this.root.displayError( + [PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS], + { unstructuredError: resp, errorKind: "server" } + ); this.log("error", () => [ `giving up trying to mount after ${MAX_CHILD_JOIN_ATTEMPTS} tries`, resp @@ -6382,7 +7344,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const trueChildEl = dom_default.byId(this.el.id); if (trueChildEl) { dom_default.mergeAttrs(trueChildEl, this.el); - this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS], { unstructuredError: resp, errorKind: "server" }); + this.displayError( + [PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS], + { unstructuredError: resp, errorKind: "server" } + ); this.el = trueChildEl; } else { this.destroy(); @@ -6409,9 +7374,15 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } if (!this.liveSocket.isUnloaded()) { if (this.liveSocket.isConnected()) { - this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS], { unstructuredError: reason, errorKind: "server" }); + this.displayError( + [PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS], + { unstructuredError: reason, errorKind: "server" } + ); } else { - this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_CLIENT_ERROR_CLASS], { unstructuredError: reason, errorKind: "client" }); + this.displayError( + [PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_CLIENT_ERROR_CLASS], + { unstructuredError: reason, errorKind: "client" } + ); } } } @@ -6434,7 +7405,16 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const latency = this.liveSocket.getLatencySim(); const withLatency = latency ? (cb) => setTimeout(() => !this.isDestroyed() && cb(), latency) : (cb) => !this.isDestroyed() && cb(); withLatency(() => { - callerPush().receive("ok", (resp) => withLatency(() => receives.ok && receives.ok(resp))).receive("error", (reason) => withLatency(() => receives.error && receives.error(reason))).receive("timeout", () => withLatency(() => receives.timeout && receives.timeout())); + callerPush().receive( + "ok", + (resp) => withLatency(() => receives.ok && receives.ok(resp)) + ).receive( + "error", + (reason) => withLatency(() => receives.error && receives.error(reason)) + ).receive( + "timeout", + () => withLatency(() => receives.timeout && receives.timeout()) + ); }); } pushWithReply(refGenerator, event, payload) { @@ -6515,7 +7495,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (onlyEls && !onlyEls.has(parent)) { return; } - dom_default.all(parent, selector, (child) => this.undoElRef(child, ref, phxEvent)); + dom_default.all( + parent, + selector, + (child) => this.undoElRef(child, ref, phxEvent) + ); this.undoElRef(parent, ref, phxEvent); }); } else { @@ -6529,7 +7513,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" undoRef: ref }); const phxChildrenAdded = this.performPatch(patch, true); - dom_default.all(el, `[${PHX_REF_SRC}="${this.refSrc()}"]`, (child) => this.undoElRef(child, ref, phxEvent)); + dom_default.all( + el, + `[${PHX_REF_SRC}="${this.refSrc()}"]`, + (child) => this.undoElRef(child, ref, phxEvent) + ); if (phxChildrenAdded) { this.joinNewChildren(); } @@ -6567,7 +7555,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" }); }); const loadingCompletePromise = new Promise((resolve) => { - el.addEventListener(`phx:undo-loading:${newRef}`, () => resolve(detail), { once: true }); + el.addEventListener( + `phx:undo-loading:${newRef}`, + () => resolve(detail), + { once: true } + ); }); el.classList.add(`phx-${eventType}-loading`); const disableText = el.getAttribute(disableWith); @@ -6578,7 +7570,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (disableText !== "") { el.innerText = disableText; } - el.setAttribute(PHX_DISABLED, el.getAttribute(PHX_DISABLED) || el.disabled); + el.setAttribute( + PHX_DISABLED, + el.getAttribute(PHX_DISABLED) || el.disabled + ); el.setAttribute("disabled", ""); } const detail = { @@ -6602,7 +7597,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } lockEl.setAttribute(PHX_REF_LOCK, newRef); lockEl.setAttribute(PHX_REF_SRC, this.refSrc()); - lockEl.addEventListener(`phx:lock-stop:${newRef}`, () => resolve(detail), { once: true }); + lockEl.addEventListener( + `phx:lock-stop:${newRef}`, + () => resolve(detail), + { once: true } + ); }); } }; @@ -6615,17 +7614,21 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (opts.originalEvent) { detail["originalEvent"] = opts.originalEvent; } - el.dispatchEvent(new CustomEvent("phx:push", { - detail, - bubbles: true, - cancelable: false - })); - if (phxEvent) { - el.dispatchEvent(new CustomEvent(`phx:push:${phxEvent}`, { + el.dispatchEvent( + new CustomEvent("phx:push", { detail, bubbles: true, cancelable: false - })); + }) + ); + if (phxEvent) { + el.dispatchEvent( + new CustomEvent(`phx:push:${phxEvent}`, { + detail, + bubbles: true, + cancelable: false + }) + ); } } return [newRef, elements.map(({ el }) => el), opts]; @@ -6654,7 +7657,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (isCid(targetCtx)) { return targetCtx; } else if (targetCtx) { - return maybe(targetCtx.closest(`[${PHX_COMPONENT}]`), (el) => this.ownsElement(el) && this.componentID(el)); + return maybe( + targetCtx.closest(`[${PHX_COMPONENT}]`), + (el) => this.ownsElement(el) && this.componentID(el) + ); } else { return null; } @@ -6666,7 +7672,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" event, payload ]); - return Promise.reject(new Error("unable to push hook event. LiveView not connected")); + return Promise.reject( + new Error("unable to push hook event. LiveView not connected") + ); } const refGenerator = () => this.putRef([{ el, loading: true, lock: true }], event, "hook", { payload, @@ -6710,14 +7718,18 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return meta; } pushEvent(type, el, targetCtx, phxEvent, meta, opts = {}, onReply) { - this.pushWithReply((maybePayload) => this.putRef([{ el, loading: true, lock: true }], phxEvent, type, __spreadProps(__spreadValues({}, opts), { - payload: maybePayload == null ? void 0 : maybePayload.payload - })), "event", { - type, - event: phxEvent, - value: this.extractMeta(el, meta, opts.value), - cid: this.targetComponentID(el, targetCtx, opts) - }).then(({ reply }) => onReply && onReply(reply)).catch((error) => logError("Failed to push event", error)); + this.pushWithReply( + (maybePayload) => this.putRef([{ el, loading: true, lock: true }], phxEvent, type, __spreadProps(__spreadValues({}, opts), { + payload: maybePayload == null ? void 0 : maybePayload.payload + })), + "event", + { + type, + event: phxEvent, + value: this.extractMeta(el, meta, opts.value), + cid: this.targetComponentID(el, targetCtx, opts) + } + ).then(({ reply }) => onReply && onReply(reply)).catch((error) => logError("Failed to push event", error)); } pushFileProgress(fileEl, entryRef, progress, onReply = function() { }) { @@ -6738,10 +7750,15 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" let uploads; const cid = isCid(forceCid) ? forceCid : this.targetComponentID(inputEl.form, targetCtx, opts); const refGenerator = (maybePayload) => { - return this.putRef([ - { el: inputEl, loading: true, lock: true }, - { el: inputEl.form, loading: true, lock: true } - ], phxEvent, "change", __spreadProps(__spreadValues({}, opts), { payload: maybePayload == null ? void 0 : maybePayload.payload })); + return this.putRef( + [ + { el: inputEl, loading: true, lock: true }, + { el: inputEl.form, loading: true, lock: true } + ], + phxEvent, + "change", + __spreadProps(__spreadValues({}, opts), { payload: maybePayload == null ? void 0 : maybePayload.payload }) + ); }; let formData; const meta = this.extractMeta(inputEl.form, {}, opts.value); @@ -6763,6 +7780,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" event: phxEvent, value: formData, meta: __spreadValues({ + // no target was implicitly sent as "undefined" in LV <= 1.0.5, therefore + // we have to keep it. In 1.0.6 we switched from passing meta as URL encoded data + // to passing it directly in the event, but the JSON encode would drop keys with + // undefined values. _target: opts._target || "undefined" }, meta), uploads, @@ -6774,11 +7795,18 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (LiveUploader.filesAwaitingPreflight(inputEl).length > 0) { const [ref, _els] = refGenerator(); this.undoRefs(ref, phxEvent, [inputEl.form]); - this.uploadFiles(inputEl.form, phxEvent, targetCtx, ref, cid, (_uploads) => { - callback && callback(resp); - this.triggerAwaitingSubmit(inputEl.form, phxEvent); - this.undoRefs(ref, phxEvent); - }); + this.uploadFiles( + inputEl.form, + phxEvent, + targetCtx, + ref, + cid, + (_uploads) => { + callback && callback(resp); + this.triggerAwaitingSubmit(inputEl.form, phxEvent); + this.undoRefs(ref, phxEvent); + } + ); } }); } else { @@ -6795,7 +7823,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } } getScheduledSubmit(formEl) { - return this.formSubmits.find(([el, _ref, _opts, _callback]) => el.isSameNode(formEl)); + return this.formSubmits.find( + ([el, _ref, _opts, _callback]) => el.isSameNode(formEl) + ); } scheduleSubmit(formEl, ref, opts, callback) { if (this.getScheduledSubmit(formEl)) { @@ -6804,18 +7834,24 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.formSubmits.push([formEl, ref, opts, callback]); } cancelSubmit(formEl, phxEvent) { - this.formSubmits = this.formSubmits.filter(([el, ref, _opts, _callback]) => { - if (el.isSameNode(formEl)) { - this.undoRefs(ref, phxEvent); - return false; - } else { - return true; + this.formSubmits = this.formSubmits.filter( + ([el, ref, _opts, _callback]) => { + if (el.isSameNode(formEl)) { + this.undoRefs(ref, phxEvent); + return false; + } else { + return true; + } } - }); + ); } disableForm(formEl, phxEvent, opts = {}) { const filterIgnored = (el) => { - const userIgnored = closestPhxBinding(el, `${this.binding(PHX_UPDATE)}=ignore`, el.form); + const userIgnored = closestPhxBinding( + el, + `${this.binding(PHX_UPDATE)}=ignore`, + el.form + ); return !(userIgnored || closestPhxBinding(el, "data-phx-update=ignore", el.form)); }; const filterDisables = (el) => { @@ -6855,7 +7891,14 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const cid = this.targetComponentID(formEl, targetCtx); if (LiveUploader.hasUploadsInProgress(formEl)) { const [ref, _els] = refGenerator(); - const push = () => this.pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply); + const push = () => this.pushFormSubmit( + formEl, + targetCtx, + phxEvent, + submitter, + opts, + onReply + ); return this.scheduleSubmit(formEl, ref, opts, push); } else if (LiveUploader.inputsAwaitingPreflight(formEl).length > 0) { const [ref, els] = refGenerator(); @@ -6912,7 +7955,11 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.log("upload", () => ["got preflight response", resp]); uploader.entries().forEach((entry) => { if (resp.entries && !resp.entries[entry.ref]) { - this.handleFailedEntryPreflight(entry.ref, "failed preflight", uploader); + this.handleFailedEntryPreflight( + entry.ref, + "failed preflight", + uploader + ); } }); if (resp.error || Object.keys(resp.entries).length === 0) { @@ -6947,7 +7994,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } dispatchUploads(targetCtx, name, filesOrBlobs) { const targetElement = this.targetCtxElement(targetCtx) || this.el; - const inputs = dom_default.findUploadInputs(targetElement).filter((el) => el.name === name); + const inputs = dom_default.findUploadInputs(targetElement).filter( + (el) => el.name === name + ); if (inputs.length === 0) { logError(`no live file inputs found matching the name "${name}"`); } else if (inputs.length > 1) { @@ -6972,63 +8021,83 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const phxChange = this.binding("change"); const phxTarget = newForm.getAttribute(this.binding("target")) || newForm; const phxEvent = newForm.getAttribute(this.binding(PHX_AUTO_RECOVER)) || newForm.getAttribute(this.binding("change")); - const inputs = Array.from(oldForm.elements).filter((el) => dom_default.isFormInput(el) && el.name && !el.hasAttribute(phxChange)); + const inputs = Array.from(oldForm.elements).filter( + (el) => dom_default.isFormInput(el) && el.name && !el.hasAttribute(phxChange) + ); if (inputs.length === 0) { callback(); return; } - inputs.forEach((input2) => input2.hasAttribute(PHX_UPLOAD_REF) && LiveUploader.clearFiles(input2)); + inputs.forEach( + (input2) => input2.hasAttribute(PHX_UPLOAD_REF) && LiveUploader.clearFiles(input2) + ); const input = inputs.find((el) => el.type !== "hidden") || inputs[0]; let pending = 0; - this.withinTargets(phxTarget, (targetView, targetCtx) => { - const cid = this.targetComponentID(newForm, targetCtx); - pending++; - let e = new CustomEvent("phx:form-recovery", { - detail: { sourceElement: oldForm } - }); - js_default.exec(e, "change", phxEvent, this, input, [ - "push", - { - _target: input.name, - targetView, - targetCtx, - newCid: cid, - callback: () => { - pending--; - if (pending === 0) { - callback(); + this.withinTargets( + phxTarget, + (targetView, targetCtx) => { + const cid = this.targetComponentID(newForm, targetCtx); + pending++; + let e = new CustomEvent("phx:form-recovery", { + detail: { sourceElement: oldForm } + }); + js_default.exec(e, "change", phxEvent, this, input, [ + "push", + { + _target: input.name, + targetView, + targetCtx, + newCid: cid, + callback: () => { + pending--; + if (pending === 0) { + callback(); + } } } - } - ]); - }, templateDom); + ]); + }, + templateDom + ); } pushLinkPatch(e, href, targetEl, callback) { const linkRef = this.liveSocket.setPendingLink(href); const loading = e.isTrusted && e.type !== "popstate"; - const refGen = targetEl ? () => this.putRef([{ el: targetEl, loading, lock: true }], null, "click") : null; + const refGen = targetEl ? () => this.putRef( + [{ el: targetEl, loading, lock: true }], + null, + "click" + ) : null; const fallback = () => this.liveSocket.redirect(window.location.href); const url = href.startsWith("/") ? `${location.protocol}//${location.host}${href}` : href; - this.pushWithReply(refGen, "live_patch", { url }).then(({ resp }) => { - this.liveSocket.requestDOMUpdate(() => { - if (resp.link_redirect) { - this.liveSocket.replaceMain(href, null, callback, linkRef); - } else { - if (this.liveSocket.commitPendingLink(linkRef)) { - this.href = href; + this.pushWithReply(refGen, "live_patch", { url }).then( + ({ resp }) => { + this.liveSocket.requestDOMUpdate(() => { + if (resp.link_redirect) { + this.liveSocket.replaceMain(href, null, callback, linkRef); + } else { + if (this.liveSocket.commitPendingLink(linkRef)) { + this.href = href; + } + this.applyPendingUpdates(); + callback && callback(linkRef); } - this.applyPendingUpdates(); - callback && callback(linkRef); - } - }); - }, ({ error: _error, timeout: _timeout }) => fallback()); + }); + }, + ({ error: _error, timeout: _timeout }) => fallback() + ); } getFormsForRecovery() { if (this.joinCount === 0) { return {}; } const phxChange = this.binding("change"); - return dom_default.all(document, `#${CSS.escape(this.id)} form[${phxChange}], [${PHX_TELEPORTED_REF}="${CSS.escape(this.id)}"] form[${phxChange}]`).filter((form) => form.id).filter((form) => form.elements.length > 0).filter((form) => form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== "ignore").map((form) => { + return dom_default.all( + document, + `#${CSS.escape(this.id)} form[${phxChange}], [${PHX_TELEPORTED_REF}="${CSS.escape(this.id)}"] form[${phxChange}]` + ).filter((form) => form.id).filter((form) => form.elements.length > 0).filter( + (form) => form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== "ignore" + ).map((form) => { const clonedForm = form.cloneNode(true); morphdom_esm_default(clonedForm, form, { onBeforeElUpdated: (fromEl, toEl) => { @@ -7036,7 +8105,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return true; } }); - const externalElements = document.querySelectorAll(`[form="${form.id}"]`); + const externalElements = document.querySelectorAll( + `[form="${form.id}"]` + ); Array.from(externalElements).forEach((el) => { if (form.contains(el)) { return; @@ -7095,6 +8166,7 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" binding(kind) { return this.liveSocket.binding(kind); } + // phx-portal pushPortalElementId(id) { this.portalElementIds.add(id); } @@ -7154,13 +8226,16 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.boundEventNames = /* @__PURE__ */ new Set(); this.blockPhxChangeWhileComposing = opts.blockPhxChangeWhileComposing || false; this.serverCloseRef = null; - this.domCallbacks = Object.assign({ - jsQuerySelectorAll: null, - onPatchStart: closure2(), - onPatchEnd: closure2(), - onNodeAdded: closure2(), - onBeforeElUpdated: closure2() - }, opts.dom || {}); + this.domCallbacks = Object.assign( + { + jsQuerySelectorAll: null, + onPatchStart: closure2(), + onPatchEnd: closure2(), + onNodeAdded: closure2(), + onBeforeElUpdated: closure2() + }, + opts.dom || {} + ); this.transitions = new TransitionSet(); this.currentHistoryPosition = parseInt(this.sessionStorage.getItem(PHX_LV_HISTORY_POSITION)) || 0; window.addEventListener("pagehide", (_e) => { @@ -7172,6 +8247,7 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } }); } + // public version() { return "1.1.14"; } @@ -7198,7 +8274,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } enableLatencySim(upperBoundMs) { this.enableDebug(); - console.log("latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable"); + console.log( + "latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable" + ); this.sessionStorage.setItem(PHX_LV_LATENCY_SIM, upperBoundMs); } disableLatencySim() { @@ -7250,9 +8328,16 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const e = new CustomEvent("phx:exec", { detail: { sourceElement: el } }); this.owner(el, (view) => js_default.exec(e, eventType, encodedJS, view, el)); } + /** + * Returns an object with methods to manipluate the DOM and execute JavaScript. + * The applied changes integrate with server DOM patching. + * + * @returns {import("./js_commands").LiveSocketJSCommands} + */ js() { return js_commands_default(this, "js"); } + // private unload() { if (this.unloaded) { return; @@ -7311,7 +8396,13 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const minMs = this.reloadJitterMin; const maxMs = this.reloadJitterMax; let afterMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs; - const tries = browser_default.updateLocal(this.localStorage, window.location.pathname, CONSECUTIVE_RELOADS, 0, (count) => count + 1); + const tries = browser_default.updateLocal( + this.localStorage, + window.location.pathname, + CONSECUTIVE_RELOADS, + 0, + (count) => count + 1 + ); if (tries >= this.maxReloads) { afterMs = this.failsafeJitter; } @@ -7345,7 +8436,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return name && name.startsWith("Phoenix.") && hooks_default[name.split(".")[1]]; } maybeRuntimeHook(name) { - const runtimeHook = document.querySelector(`script[${PHX_RUNTIME_HOOK}="${CSS.escape(name)}"]`); + const runtimeHook = document.querySelector( + `script[${PHX_RUNTIME_HOOK}="${CSS.escape(name)}"]` + ); if (!runtimeHook) { return; } @@ -7358,7 +8451,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (hookDefiniton && (typeof hookDefiniton === "object" || typeof hookDefiniton === "function")) { return hookDefiniton; } - logError("runtime hook must return an object with hook callbacks or an instance of ViewHook", runtimeHook); + logError( + "runtime hook must return an object with hook callbacks or an instance of ViewHook", + runtimeHook + ); } isUnloaded() { return this.unloaded; @@ -7393,19 +8489,23 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } joinRootViews() { let rootsFound = false; - dom_default.all(document, `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`, (rootEl) => { - if (!this.getRootById(rootEl.id)) { - const view = this.newRootView(rootEl); - if (!dom_default.isPhxSticky(rootEl)) { - view.setHref(this.getHref()); - } - view.join(); - if (rootEl.hasAttribute(PHX_MAIN)) { - this.main = view; + dom_default.all( + document, + `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`, + (rootEl) => { + if (!this.getRootById(rootEl.id)) { + const view = this.newRootView(rootEl); + if (!dom_default.isPhxSticky(rootEl)) { + view.setHref(this.getHref()); + } + view.join(); + if (rootEl.hasAttribute(PHX_MAIN)) { + this.main = view; + } } + rootsFound = true; } - rootsFound = true; - }); + ); return rootsFound; } redirect(to, flash, reloadToken) { @@ -7419,7 +8519,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const liveReferer = this.currentLocation.href; this.outgoingMainEl = this.outgoingMainEl || this.main.el; const stickies = dom_default.findPhxSticky(document) || []; - const removeEls = dom_default.all(this.outgoingMainEl, `[${this.binding("remove")}]`).filter((el) => !dom_default.isChildOfAny(el, stickies)); + const removeEls = dom_default.all( + this.outgoingMainEl, + `[${this.binding("remove")}]` + ).filter((el) => !dom_default.isChildOfAny(el, stickies)); const newMainEl = dom_default.cloneNode(this.outgoingMainEl, ""); this.main.showLoader(this.loaderTimeout); this.main.destroy(); @@ -7483,7 +8586,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } getViewByEl(el) { const rootId = el.getAttribute(PHX_ROOT_ID); - return maybe(this.getRootById(rootId), (root) => root.getDescendentByEl(el)); + return maybe( + this.getRootById(rootId), + (root) => root.getDescendentByEl(el) + ); } getRootById(id) { return this.roots[id]; @@ -7523,6 +8629,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.prevActive.blur(); } } + /** + * @param {{dead?: boolean}} [options={}] + */ bindTopLevelEvents({ dead } = {}) { if (this.boundTopLevelEvents) { return; @@ -7535,13 +8644,17 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" }); document.body.addEventListener("click", function() { }); - window.addEventListener("pageshow", (e) => { - if (e.persisted) { - this.getSocket().disconnect(); - this.withPageLoading({ to: window.location.href, kind: "redirect" }); - window.location.reload(); - } - }, true); + window.addEventListener( + "pageshow", + (e) => { + if (e.persisted) { + this.getSocket().disconnect(); + this.withPageLoading({ to: window.location.href, kind: "redirect" }); + window.location.reload(); + } + }, + true + ); if (!dead) { this.bindNav(); } @@ -7549,33 +8662,45 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (!dead) { this.bindForms(); } - this.bind({ keyup: "keyup", keydown: "keydown" }, (e, type, view, targetEl, phxEvent, _phxTarget) => { - const matchKey = targetEl.getAttribute(this.binding(PHX_KEY)); - const pressedKey = e.key && e.key.toLowerCase(); - if (matchKey && matchKey.toLowerCase() !== pressedKey) { - return; - } - const data = __spreadValues({ key: e.key }, this.eventMeta(type, e, targetEl)); - js_default.exec(e, type, phxEvent, view, targetEl, ["push", { data }]); - }); - this.bind({ blur: "focusout", focus: "focusin" }, (e, type, view, targetEl, phxEvent, phxTarget) => { - if (!phxTarget) { + this.bind( + { keyup: "keyup", keydown: "keydown" }, + (e, type, view, targetEl, phxEvent, _phxTarget) => { + const matchKey = targetEl.getAttribute(this.binding(PHX_KEY)); + const pressedKey = e.key && e.key.toLowerCase(); + if (matchKey && matchKey.toLowerCase() !== pressedKey) { + return; + } const data = __spreadValues({ key: e.key }, this.eventMeta(type, e, targetEl)); js_default.exec(e, type, phxEvent, view, targetEl, ["push", { data }]); } - }); - this.bind({ blur: "blur", focus: "focus" }, (e, type, view, targetEl, phxEvent, phxTarget) => { - if (phxTarget === "window") { - const data = this.eventMeta(type, e, targetEl); - js_default.exec(e, type, phxEvent, view, targetEl, ["push", { data }]); + ); + this.bind( + { blur: "focusout", focus: "focusin" }, + (e, type, view, targetEl, phxEvent, phxTarget) => { + if (!phxTarget) { + const data = __spreadValues({ key: e.key }, this.eventMeta(type, e, targetEl)); + js_default.exec(e, type, phxEvent, view, targetEl, ["push", { data }]); + } } - }); + ); + this.bind( + { blur: "blur", focus: "focus" }, + (e, type, view, targetEl, phxEvent, phxTarget) => { + if (phxTarget === "window") { + const data = this.eventMeta(type, e, targetEl); + js_default.exec(e, type, phxEvent, view, targetEl, ["push", { data }]); + } + } + ); this.on("dragover", (e) => e.preventDefault()); this.on("drop", (e) => { e.preventDefault(); - const dropTargetId = maybe(closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)), (trueTarget) => { - return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET)); - }); + const dropTargetId = maybe( + closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)), + (trueTarget) => { + return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET)); + } + ); const dropTarget = dropTargetId && document.getElementById(dropTargetId); const files = Array.from(e.dataTransfer.files || []); if (!dropTarget || !(dropTarget instanceof HTMLInputElement) || dropTarget.disabled || files.length === 0 || !(dropTarget.files instanceof FileList)) { @@ -7589,7 +8714,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" if (!dom_default.isUploadInput(uploadTarget)) { return; } - const files = Array.from(e.detail.files || []).filter((f) => f instanceof File || f instanceof Blob); + const files = Array.from(e.detail.files || []).filter( + (f) => f instanceof File || f instanceof Blob + ); LiveUploader.trackFiles(uploadTarget, files); uploadTarget.dispatchEvent(new Event("input", { bubbles: true })); }); @@ -7604,6 +8731,8 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.resetReloadStatus(); return this.linkRef; } + // anytime we are navigating or connecting, drop reload cookie in case + // we issue the cookie but the next request was interrupted and the server never dropped it resetReloadStatus() { browser_default.deleteCookie(PHX_RELOAD_STATUS); } @@ -7654,36 +8783,40 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } bindClick(eventName, bindingName) { const click = this.binding(bindingName); - window.addEventListener(eventName, (e) => { - let target = null; - if (e.detail === 0) - this.clickStartedAtTarget = e.target; - const clickStartedAtTarget = this.clickStartedAtTarget || e.target; - target = closestPhxBinding(e.target, click); - this.dispatchClickAway(e, clickStartedAtTarget); - this.clickStartedAtTarget = null; - const phxEvent = target && target.getAttribute(click); - if (!phxEvent) { - if (dom_default.isNewPageClick(e, window.location)) { - this.unload(); + window.addEventListener( + eventName, + (e) => { + let target = null; + if (e.detail === 0) + this.clickStartedAtTarget = e.target; + const clickStartedAtTarget = this.clickStartedAtTarget || e.target; + target = closestPhxBinding(e.target, click); + this.dispatchClickAway(e, clickStartedAtTarget); + this.clickStartedAtTarget = null; + const phxEvent = target && target.getAttribute(click); + if (!phxEvent) { + if (dom_default.isNewPageClick(e, window.location)) { + this.unload(); + } + return; } - return; - } - if (target.getAttribute("href") === "#") { - e.preventDefault(); - } - if (target.hasAttribute(PHX_REF_SRC)) { - return; - } - this.debounce(target, e, "click", () => { - this.withinOwners(target, (view) => { - js_default.exec(e, "click", phxEvent, view, target, [ - "push", - { data: this.eventMeta("click", e, target) } - ]); + if (target.getAttribute("href") === "#") { + e.preventDefault(); + } + if (target.hasAttribute(PHX_REF_SRC)) { + return; + } + this.debounce(target, e, "click", () => { + this.withinOwners(target, (view) => { + js_default.exec(e, "click", phxEvent, view, target, [ + "push", + { data: this.eventMeta("click", e, target) } + ]); + }); }); - }); - }, false); + }, + false + ); } dispatchClickAway(e, clickStartedAt) { const phxClickAway = this.binding("click-away"); @@ -7712,65 +8845,80 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" window.addEventListener("scroll", (_e) => { clearTimeout(scrollTimer); scrollTimer = setTimeout(() => { - browser_default.updateCurrentState((state) => Object.assign(state, { scroll: window.scrollY })); + browser_default.updateCurrentState( + (state) => Object.assign(state, { scroll: window.scrollY }) + ); }, 100); }); - window.addEventListener("popstate", (event) => { - if (!this.registerNewLocation(window.location)) { - return; - } - const { type, backType, id, scroll, position } = event.state || {}; - const href = window.location.href; - const isForward = position > this.currentHistoryPosition; - const navType = isForward ? type : backType || type; - this.currentHistoryPosition = position || 0; - this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString()); - dom_default.dispatchEvent(window, "phx:navigate", { - detail: { - href, - patch: navType === "patch", - pop: true, - direction: isForward ? "forward" : "backward" - } - }); - this.requestDOMUpdate(() => { - const callback = () => { - this.maybeScroll(scroll); - }; - if (this.main.isConnected() && navType === "patch" && id === this.main.id) { - this.main.pushLinkPatch(event, href, null, callback); - } else { - this.replaceMain(href, null, callback); + window.addEventListener( + "popstate", + (event) => { + if (!this.registerNewLocation(window.location)) { + return; } - }); - }, false); - window.addEventListener("click", (e) => { - const target = closestPhxBinding(e.target, PHX_LIVE_LINK); - const type = target && target.getAttribute(PHX_LIVE_LINK); - if (!type || !this.isConnected() || !this.main || dom_default.wantsNewTab(e)) { - return; - } - const href = target.href instanceof SVGAnimatedString ? target.href.baseVal : target.href; - const linkState = target.getAttribute(PHX_LINK_STATE); - e.preventDefault(); - e.stopImmediatePropagation(); - if (this.pendingLink === href) { - return; - } - this.requestDOMUpdate(() => { - if (type === "patch") { - this.pushHistoryPatch(e, href, linkState, target); - } else if (type === "redirect") { - this.historyRedirect(e, href, linkState, null, target); - } else { - throw new Error(`expected ${PHX_LIVE_LINK} to be "patch" or "redirect", got: ${type}`); + const { type, backType, id, scroll, position } = event.state || {}; + const href = window.location.href; + const isForward = position > this.currentHistoryPosition; + const navType = isForward ? type : backType || type; + this.currentHistoryPosition = position || 0; + this.sessionStorage.setItem( + PHX_LV_HISTORY_POSITION, + this.currentHistoryPosition.toString() + ); + dom_default.dispatchEvent(window, "phx:navigate", { + detail: { + href, + patch: navType === "patch", + pop: true, + direction: isForward ? "forward" : "backward" + } + }); + this.requestDOMUpdate(() => { + const callback = () => { + this.maybeScroll(scroll); + }; + if (this.main.isConnected() && navType === "patch" && id === this.main.id) { + this.main.pushLinkPatch(event, href, null, callback); + } else { + this.replaceMain(href, null, callback); + } + }); + }, + false + ); + window.addEventListener( + "click", + (e) => { + const target = closestPhxBinding(e.target, PHX_LIVE_LINK); + const type = target && target.getAttribute(PHX_LIVE_LINK); + if (!type || !this.isConnected() || !this.main || dom_default.wantsNewTab(e)) { + return; } - const phxClick = target.getAttribute(this.binding("click")); - if (phxClick) { - this.requestDOMUpdate(() => this.execJS(target, phxClick, "click")); + const href = target.href instanceof SVGAnimatedString ? target.href.baseVal : target.href; + const linkState = target.getAttribute(PHX_LINK_STATE); + e.preventDefault(); + e.stopImmediatePropagation(); + if (this.pendingLink === href) { + return; } - }); - }, false); + this.requestDOMUpdate(() => { + if (type === "patch") { + this.pushHistoryPatch(e, href, linkState, target); + } else if (type === "redirect") { + this.historyRedirect(e, href, linkState, null, target); + } else { + throw new Error( + `expected ${PHX_LIVE_LINK} to be "patch" or "redirect", got: ${type}` + ); + } + const phxClick = target.getAttribute(this.binding("click")); + if (phxClick) { + this.requestDOMUpdate(() => this.execJS(target, phxClick, "click")); + } + }); + }, + false + ); } maybeScroll(scroll) { if (typeof scroll === "number") { @@ -7806,13 +8954,20 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" return; } this.currentHistoryPosition++; - this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString()); + this.sessionStorage.setItem( + PHX_LV_HISTORY_POSITION, + this.currentHistoryPosition.toString() + ); browser_default.updateCurrentState((state) => __spreadProps(__spreadValues({}, state), { backType: "patch" })); - browser_default.pushState(linkState, { - type: "patch", - id: this.main.id, - position: this.currentHistoryPosition - }, href); + browser_default.pushState( + linkState, + { + type: "patch", + id: this.main.id, + position: this.currentHistoryPosition + }, + href + ); dom_default.dispatchEvent(window, "phx:navigate", { detail: { patch: true, href, pop: false, direction: "forward" } }); @@ -7835,16 +8990,23 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.replaceMain(href, flash, (linkRef) => { if (linkRef === this.linkRef) { this.currentHistoryPosition++; - this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString()); + this.sessionStorage.setItem( + PHX_LV_HISTORY_POSITION, + this.currentHistoryPosition.toString() + ); browser_default.updateCurrentState((state) => __spreadProps(__spreadValues({}, state), { backType: "redirect" })); - browser_default.pushState(linkState, { - type: "redirect", - id: this.main.id, - scroll, - position: this.currentHistoryPosition - }, href); + browser_default.pushState( + linkState, + { + type: "redirect", + id: this.main.id, + scroll, + position: this.currentHistoryPosition + }, + href + ); dom_default.dispatchEvent(window, "phx:navigate", { detail: { href, patch: false, pop: false, direction: "forward" } }); @@ -7907,7 +9069,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.on(type, (e) => { if (e instanceof CustomEvent && (e.target instanceof HTMLInputElement || e.target instanceof HTMLSelectElement || e.target instanceof HTMLTextAreaElement) && e.target.form === void 0) { if (e.detail && e.detail.dispatcher) { - throw new Error(`dispatching a custom ${type} event is only supported on input elements inside a form`); + throw new Error( + `dispatching a custom ${type} event is only supported on input elements inside a form` + ); } return; } @@ -7917,10 +9081,14 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const key = `composition-listener-${type}`; if (!dom_default.private(input, key)) { dom_default.putPrivate(input, key, true); - input.addEventListener("compositionend", () => { - input.dispatchEvent(new Event(type, { bubbles: true })); - dom_default.deletePrivate(input, key); - }, { once: true }); + input.addEventListener( + "compositionend", + () => { + input.dispatchEvent(new Event(type, { bubbles: true })); + dom_default.deletePrivate(input, key); + }, + { once: true } + ); } return; } @@ -7961,7 +9129,9 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const input = Array.from(form.elements).find((el) => el.type === "reset"); if (input) { window.requestAnimationFrame(() => { - input.dispatchEvent(new Event("input", { bubbles: true, cancelable: false })); + input.dispatchEvent( + new Event("input", { bubbles: true, cancelable: false }) + ); }); } }); @@ -7976,9 +9146,18 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" const defaultThrottle = this.defaults.throttle.toString(); this.withinOwners(el, (view) => { const asyncFilter = () => !view.isDestroyed() && document.body.contains(el); - dom_default.debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, () => { - callback(); - }); + dom_default.debounce( + el, + event, + phxDebounce, + defaultDebounce, + phxThrottle, + defaultThrottle, + asyncFilter, + () => { + callback(); + } + ); }); } silenceEvents(callback) { @@ -8089,24 +9268,32 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" indexEl.value = newIndex; const targetEl = fieldEl.querySelectorAll(".embed__index")[newIndex]; targetEl.value = +targetEl.value + +e.target.dataset.dir * -1; - indexEl.dispatchEvent(new Event("input", { bubbles: true, cancelable: true })); + indexEl.dispatchEvent( + new Event("input", { bubbles: true, cancelable: true }) + ); }); this.el.addEventListener("live_admin:embed_add", (e) => { const sortInput = e.target.previousElementSibling; sortInput.checked = true; - sortInput.dispatchEvent(new Event("input", { bubbles: true, cancelable: true })); + sortInput.dispatchEvent( + new Event("input", { bubbles: true, cancelable: true }) + ); }); this.el.addEventListener("live_admin:embed_drop", (e) => { e.target.parentElement.classList.add("hidden"); const deleteInput = e.target.previousElementSibling; deleteInput.checked = true; - deleteInput.dispatchEvent(new Event("input", { bubbles: true, cancelable: true })); + deleteInput.dispatchEvent( + new Event("input", { bubbles: true, cancelable: true }) + ); }); this.el.addEventListener("live_admin:embed_delete", (e) => { e.target.parentElement.classList.add("hidden"); const deleteInput = e.target.closest(".embed__group").querySelector('input[value=""]'); deleteInput.disabled = false; - deleteInput.dispatchEvent(new Event("input", { bubbles: true, cancelable: true })); + deleteInput.dispatchEvent( + new Event("input", { bubbles: true, cancelable: true }) + ); }); } }; @@ -8135,13 +9322,16 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" mounted() { this.el.addEventListener("live_admin:action", (e) => { if (e.target.tagName === "FORM") { - const params = [...new FormData(e.target)].reduce((params2, [key, val]) => { - if (key === "args[]") { - return __spreadProps(__spreadValues({}, params2), { args: [...params2.args, val] }); - } else { - return __spreadProps(__spreadValues({}, params2), { [key]: val }); - } - }, { args: [] }); + const params = [...new FormData(e.target)].reduce( + (params2, [key, val]) => { + if (key === "args[]") { + return __spreadProps(__spreadValues({}, params2), { args: [...params2.args, val] }); + } else { + return __spreadProps(__spreadValues({}, params2), { [key]: val }); + } + }, + { args: [] } + ); e.target.reset(); this.pushEventTo(this.el, "action", params); } else { @@ -8155,13 +9345,16 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" this.selected = []; this.el.addEventListener("live_admin:action", (e) => { if (e.target.tagName === "FORM") { - const params = [...new FormData(e.target)].reduce((params2, [key, val]) => { - if (key === "args[]") { - return __spreadProps(__spreadValues({}, params2), { args: [...params2.args, val] }); - } else { - return __spreadProps(__spreadValues({}, params2), { [key]: val }); - } - }, { args: [] }); + const params = [...new FormData(e.target)].reduce( + (params2, [key, val]) => { + if (key === "args[]") { + return __spreadProps(__spreadValues({}, params2), { args: [...params2.args, val] }); + } else { + return __spreadProps(__spreadValues({}, params2), { [key]: val }); + } + }, + { args: [] } + ); this.pushEventTo(this.el, "action", __spreadProps(__spreadValues({}, params), { ids: this.selected })); } else { this.pushEventTo(this.el, "action", { @@ -8176,7 +9369,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } else { this.el.querySelector("#select-all").checked = false; } - this.selected = Array.from(this.el.querySelectorAll("input[data-record-key]:checked"), (e2) => e2.dataset.recordKey); + this.selected = Array.from( + this.el.querySelectorAll("input[data-record-key]:checked"), + (e2) => e2.dataset.recordKey + ); if (this.selected.length > 0) { document.getElementById("footer-select").style.removeProperty("display"); document.getElementById("footer-nav").style.display = "none"; @@ -8213,23 +9409,31 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" } window.liveSocket = liveSocket; })(); -/*! - * Toastify js 1.11.2 - * https://github.com/apvarun/toastify-js - * @license MIT licensed - * - * Copyright (C) 2018 Varun A P - */ -/*! - * clipboard.js v2.0.10 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -/** - * @license MIT - * topbar 1.0.0, 2021-01-06 - * http://buunguyen.github.io/topbar - * Copyright (c) 2021 Buu Nguyen - */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9jbGlwYm9hcmQvZGlzdC9jbGlwYm9hcmQuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy90b2FzdGlmeS1qcy9zcmMvdG9hc3RpZnkuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy90b3BiYXIvdG9wYmFyLm1pbi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfaHRtbC9wcml2L3N0YXRpYy9waG9lbml4X2h0bWwuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3V0aWxzLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3B1c2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3RpbWVyLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jaGFubmVsLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9hamF4LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9sb25ncG9sbC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvcHJlc2VuY2UuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NlcmlhbGl6ZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NvY2tldC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZW50cnlfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXRpbHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYnJvd3Nlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb20uanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXBsb2FkX2VudHJ5LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2xpdmVfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYXJpYS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9lbGVtZW50X3JlZi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcG9zdF9tb3JwaF9yZXN0b3Jlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L25vZGVfbW9kdWxlcy9tb3JwaGRvbS9kaXN0L21vcnBoZG9tLWVzbS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcGF0Y2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvcmVuZGVyZWQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanNfY29tbWFuZHMudHMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlld19ob29rLnRzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L3ZpZXcuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvbGl2ZV9zb2NrZXQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvaW5kZXgudHMiLCAiLi4vLi4vYXNzZXRzL2pzL2FwcC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohXG4gKiBjbGlwYm9hcmQuanMgdjIuMC4xMFxuICogaHR0cHM6Ly9jbGlwYm9hcmRqcy5jb20vXG4gKlxuICogTGljZW5zZWQgTUlUIFx1MDBBOSBaZW5vIFJvY2hhXG4gKi9cbihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkNsaXBib2FyZEpTXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkNsaXBib2FyZEpTXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKCkgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gNjg2OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vLyBFWFBPUlRTXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuICBcImRlZmF1bHRcIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGNsaXBib2FyZDsgfVxufSk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdGlueS1lbWl0dGVyL2luZGV4LmpzXG52YXIgdGlueV9lbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNzkpO1xudmFyIHRpbnlfZW1pdHRlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih0aW55X2VtaXR0ZXIpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9nb29kLWxpc3RlbmVyL3NyYy9saXN0ZW4uanNcbnZhciBsaXN0ZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3MCk7XG52YXIgbGlzdGVuX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGxpc3Rlbik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3NlbGVjdC9zcmMvc2VsZWN0LmpzXG52YXIgc3JjX3NlbGVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oODE3KTtcbnZhciBzZWxlY3RfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc3JjX3NlbGVjdCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2NvbW1hbmQuanNcbi8qKlxuICogRXhlY3V0ZXMgYSBnaXZlbiBvcGVyYXRpb24gdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBjb21tYW5kKHR5cGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQodHlwZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvY3V0LmpzXG5cblxuLyoqXG4gKiBDdXQgYWN0aW9uIHdyYXBwZXIuXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkN1dCA9IGZ1bmN0aW9uIENsaXBib2FyZEFjdGlvbkN1dCh0YXJnZXQpIHtcbiAgdmFyIHNlbGVjdGVkVGV4dCA9IHNlbGVjdF9kZWZhdWx0KCkodGFyZ2V0KTtcbiAgY29tbWFuZCgnY3V0Jyk7XG4gIHJldHVybiBzZWxlY3RlZFRleHQ7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2N1dCA9IChDbGlwYm9hcmRBY3Rpb25DdXQpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi9jcmVhdGUtZmFrZS1lbGVtZW50LmpzXG4vKipcbiAqIENyZWF0ZXMgYSBmYWtlIHRleHRhcmVhIGVsZW1lbnQgd2l0aCBhIHZhbHVlLlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmFrZUVsZW1lbnQodmFsdWUpIHtcbiAgdmFyIGlzUlRMID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlyJykgPT09ICdydGwnO1xuICB2YXIgZmFrZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOyAvLyBQcmV2ZW50IHpvb21pbmcgb24gaU9TXG5cbiAgZmFrZUVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSAnMTJwdCc7IC8vIFJlc2V0IGJveCBtb2RlbFxuXG4gIGZha2VFbGVtZW50LnN0eWxlLmJvcmRlciA9ICcwJztcbiAgZmFrZUVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcwJztcbiAgZmFrZUVsZW1lbnQuc3R5bGUubWFyZ2luID0gJzAnOyAvLyBNb3ZlIGVsZW1lbnQgb3V0IG9mIHNjcmVlbiBob3Jpem9udGFsbHlcblxuICBmYWtlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIGZha2VFbGVtZW50LnN0eWxlW2lzUlRMID8gJ3JpZ2h0JyA6ICdsZWZ0J10gPSAnLTk5OTlweCc7IC8vIE1vdmUgZWxlbWVudCB0byB0aGUgc2FtZSBwb3NpdGlvbiB2ZXJ0aWNhbGx5XG5cbiAgdmFyIHlQb3NpdGlvbiA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICBmYWtlRWxlbWVudC5zdHlsZS50b3AgPSBcIlwiLmNvbmNhdCh5UG9zaXRpb24sIFwicHhcIik7XG4gIGZha2VFbGVtZW50LnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7XG4gIGZha2VFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gIHJldHVybiBmYWtlRWxlbWVudDtcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9hY3Rpb25zL2NvcHkuanNcblxuXG5cbi8qKlxuICogQ29weSBhY3Rpb24gd3JhcHBlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkNvcHkgPSBmdW5jdGlvbiBDbGlwYm9hcmRBY3Rpb25Db3B5KHRhcmdldCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgIGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keVxuICB9O1xuICB2YXIgc2VsZWN0ZWRUZXh0ID0gJyc7XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIGZha2VFbGVtZW50ID0gY3JlYXRlRmFrZUVsZW1lbnQodGFyZ2V0KTtcbiAgICBvcHRpb25zLmNvbnRhaW5lci5hcHBlbmRDaGlsZChmYWtlRWxlbWVudCk7XG4gICAgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKShmYWtlRWxlbWVudCk7XG4gICAgY29tbWFuZCgnY29weScpO1xuICAgIGZha2VFbGVtZW50LnJlbW92ZSgpO1xuICB9IGVsc2Uge1xuICAgIHNlbGVjdGVkVGV4dCA9IHNlbGVjdF9kZWZhdWx0KCkodGFyZ2V0KTtcbiAgICBjb21tYW5kKCdjb3B5Jyk7XG4gIH1cblxuICByZXR1cm4gc2VsZWN0ZWRUZXh0O1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYWN0aW9uc19jb3B5ID0gKENsaXBib2FyZEFjdGlvbkNvcHkpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvZGVmYXVsdC5qc1xuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5cblxuLyoqXG4gKiBJbm5lciBmdW5jdGlvbiB3aGljaCBwZXJmb3JtcyBzZWxlY3Rpb24gZnJvbSBlaXRoZXIgYHRleHRgIG9yIGB0YXJnZXRgXG4gKiBwcm9wZXJ0aWVzIGFuZCB0aGVuIGV4ZWN1dGVzIGNvcHkgb3IgY3V0IG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICovXG5cbnZhciBDbGlwYm9hcmRBY3Rpb25EZWZhdWx0ID0gZnVuY3Rpb24gQ2xpcGJvYXJkQWN0aW9uRGVmYXVsdCgpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAvLyBEZWZpbmVzIGJhc2UgcHJvcGVydGllcyBwYXNzZWQgZnJvbSBjb25zdHJ1Y3Rvci5cbiAgdmFyIF9vcHRpb25zJGFjdGlvbiA9IG9wdGlvbnMuYWN0aW9uLFxuICAgICAgYWN0aW9uID0gX29wdGlvbnMkYWN0aW9uID09PSB2b2lkIDAgPyAnY29weScgOiBfb3B0aW9ucyRhY3Rpb24sXG4gICAgICBjb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcixcbiAgICAgIHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0LFxuICAgICAgdGV4dCA9IG9wdGlvbnMudGV4dDsgLy8gU2V0cyB0aGUgYGFjdGlvbmAgdG8gYmUgcGVyZm9ybWVkIHdoaWNoIGNhbiBiZSBlaXRoZXIgJ2NvcHknIG9yICdjdXQnLlxuXG4gIGlmIChhY3Rpb24gIT09ICdjb3B5JyAmJiBhY3Rpb24gIT09ICdjdXQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwiYWN0aW9uXCIgdmFsdWUsIHVzZSBlaXRoZXIgXCJjb3B5XCIgb3IgXCJjdXRcIicpO1xuICB9IC8vIFNldHMgdGhlIGB0YXJnZXRgIHByb3BlcnR5IHVzaW5nIGFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGhhdmUgaXRzIGNvbnRlbnQgY29waWVkLlxuXG5cbiAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRhcmdldCAmJiBfdHlwZW9mKHRhcmdldCkgPT09ICdvYmplY3QnICYmIHRhcmdldC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgaWYgKGFjdGlvbiA9PT0gJ2NvcHknICYmIHRhcmdldC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgYXR0cmlidXRlLiBQbGVhc2UgdXNlIFwicmVhZG9ubHlcIiBpbnN0ZWFkIG9mIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvbiA9PT0gJ2N1dCcgJiYgKHRhcmdldC5oYXNBdHRyaWJ1dGUoJ3JlYWRvbmx5JykgfHwgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgYXR0cmlidXRlLiBZb3UgY2FuXFwndCBjdXQgdGV4dCBmcm9tIGVsZW1lbnRzIHdpdGggXCJyZWFkb25seVwiIG9yIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGVzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBcInRhcmdldFwiIHZhbHVlLCB1c2UgYSB2YWxpZCBFbGVtZW50Jyk7XG4gICAgfVxuICB9IC8vIERlZmluZSBzZWxlY3Rpb24gc3RyYXRlZ3kgYmFzZWQgb24gYHRleHRgIHByb3BlcnR5LlxuXG5cbiAgaWYgKHRleHQpIHtcbiAgICByZXR1cm4gYWN0aW9uc19jb3B5KHRleHQsIHtcbiAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyXG4gICAgfSk7XG4gIH0gLy8gRGVmaW5lcyB3aGljaCBzZWxlY3Rpb24gc3RyYXRlZ3kgYmFzZWQgb24gYHRhcmdldGAgcHJvcGVydHkuXG5cblxuICBpZiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIGFjdGlvbiA9PT0gJ2N1dCcgPyBhY3Rpb25zX2N1dCh0YXJnZXQpIDogYWN0aW9uc19jb3B5KHRhcmdldCwge1xuICAgICAgY29udGFpbmVyOiBjb250YWluZXJcbiAgICB9KTtcbiAgfVxufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYWN0aW9uc19kZWZhdWx0ID0gKENsaXBib2FyZEFjdGlvbkRlZmF1bHQpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NsaXBib2FyZC5qc1xuZnVuY3Rpb24gY2xpcGJvYXJkX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgY2xpcGJvYXJkX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBjbGlwYm9hcmRfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIGNsaXBib2FyZF90eXBlb2Yob2JqKTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKGNsaXBib2FyZF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5cblxuXG5cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmV0cmlldmUgYXR0cmlidXRlIHZhbHVlLlxuICogQHBhcmFtIHtTdHJpbmd9IHN1ZmZpeFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoc3VmZml4LCBlbGVtZW50KSB7XG4gIHZhciBhdHRyaWJ1dGUgPSBcImRhdGEtY2xpcGJvYXJkLVwiLmNvbmNhdChzdWZmaXgpO1xuXG4gIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIHdoaWNoIHRha2VzIG9uZSBvciBtb3JlIGVsZW1lbnRzLCBhZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGVtLFxuICogYW5kIGluc3RhbnRpYXRlcyBhIG5ldyBgQ2xpcGJvYXJkQWN0aW9uYCBvbiBlYWNoIGNsaWNrLlxuICovXG5cblxudmFyIENsaXBib2FyZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0VtaXR0ZXIpIHtcbiAgX2luaGVyaXRzKENsaXBib2FyZCwgX0VtaXR0ZXIpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ2xpcGJvYXJkKTtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IHRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIENsaXBib2FyZCh0cmlnZ2VyLCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsaXBib2FyZCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgX3RoaXMucmVzb2x2ZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICBfdGhpcy5saXN0ZW5DbGljayh0cmlnZ2VyKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogRGVmaW5lcyBpZiBhdHRyaWJ1dGVzIHdvdWxkIGJlIHJlc29sdmVkIHVzaW5nIGludGVybmFsIHNldHRlciBmdW5jdGlvbnNcbiAgICogb3IgY3VzdG9tIGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoQ2xpcGJvYXJkLCBbe1xuICAgIGtleTogXCJyZXNvbHZlT3B0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNvbHZlT3B0aW9ucygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHRoaXMuYWN0aW9uID0gdHlwZW9mIG9wdGlvbnMuYWN0aW9uID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5hY3Rpb24gOiB0aGlzLmRlZmF1bHRBY3Rpb247XG4gICAgICB0aGlzLnRhcmdldCA9IHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGFyZ2V0IDogdGhpcy5kZWZhdWx0VGFyZ2V0O1xuICAgICAgdGhpcy50ZXh0ID0gdHlwZW9mIG9wdGlvbnMudGV4dCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGV4dCA6IHRoaXMuZGVmYXVsdFRleHQ7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGNsaXBib2FyZF90eXBlb2Yob3B0aW9ucy5jb250YWluZXIpID09PSAnb2JqZWN0JyA/IG9wdGlvbnMuY29udGFpbmVyIDogZG9jdW1lbnQuYm9keTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNsaWNrIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBwYXNzZWQgdHJpZ2dlci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGlzdGVuQ2xpY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGlzdGVuQ2xpY2sodHJpZ2dlcikge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5fZGVmYXVsdCgpKHRyaWdnZXIsICdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIub25DbGljayhlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGEgbmV3IGBDbGlwYm9hcmRBY3Rpb25gIG9uIGVhY2ggY2xpY2sgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib25DbGlja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gZS5kZWxlZ2F0ZVRhcmdldCB8fCBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgICB2YXIgYWN0aW9uID0gdGhpcy5hY3Rpb24odHJpZ2dlcikgfHwgJ2NvcHknO1xuICAgICAgdmFyIHRleHQgPSBhY3Rpb25zX2RlZmF1bHQoe1xuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldCh0cmlnZ2VyKSxcbiAgICAgICAgdGV4dDogdGhpcy50ZXh0KHRyaWdnZXIpXG4gICAgICB9KTsgLy8gRmlyZXMgYW4gZXZlbnQgYmFzZWQgb24gdGhlIGNvcHkgb3BlcmF0aW9uIHJlc3VsdC5cblxuICAgICAgdGhpcy5lbWl0KHRleHQgPyAnc3VjY2VzcycgOiAnZXJyb3InLCB7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgICAgICBjbGVhclNlbGVjdGlvbjogZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXIuZm9jdXMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGBhY3Rpb25gIGxvb2t1cCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRyaWdnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRBY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmYXVsdEFjdGlvbih0cmlnZ2VyKSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoJ2FjdGlvbicsIHRyaWdnZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGB0YXJnZXRgIGxvb2t1cCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRyaWdnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRUYXJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmYXVsdFRhcmdldCh0cmlnZ2VyKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgndGFyZ2V0JywgdHJpZ2dlcik7XG5cbiAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93IGZpcmUgcHJvZ3JhbW1hdGljYWxseSBhIGNvcHkgYWN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IHRhcmdldFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybnMgVGV4dCBjb3BpZWQuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0VGV4dFwiLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBgdGV4dGAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VGV4dCh0cmlnZ2VyKSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoJ3RleHQnLCB0cmlnZ2VyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVzdHJveSBsaWZlY3ljbGUuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmxpc3RlbmVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjb3B5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkodGFyZ2V0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgICAgICBjb250YWluZXI6IGRvY3VtZW50LmJvZHlcbiAgICAgIH07XG4gICAgICByZXR1cm4gYWN0aW9uc19jb3B5KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93IGZpcmUgcHJvZ3JhbW1hdGljYWxseSBhIGN1dCBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHJldHVybnMgVGV4dCBjdXR0ZWQuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjdXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3V0KHRhcmdldCkge1xuICAgICAgcmV0dXJuIGFjdGlvbnNfY3V0KHRhcmdldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnQgb2YgdGhlIGdpdmVuIGFjdGlvbiwgb3IgYWxsIGFjdGlvbnMgaWYgbm8gYWN0aW9uIGlzXG4gICAgICogZ2l2ZW4uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFthY3Rpb25dXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc1N1cHBvcnRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1N1cHBvcnRlZCgpIHtcbiAgICAgIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFsnY29weScsICdjdXQnXTtcbiAgICAgIHZhciBhY3Rpb25zID0gdHlwZW9mIGFjdGlvbiA9PT0gJ3N0cmluZycgPyBbYWN0aW9uXSA6IGFjdGlvbjtcbiAgICAgIHZhciBzdXBwb3J0ID0gISFkb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQ7XG4gICAgICBhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICBzdXBwb3J0ID0gc3VwcG9ydCAmJiAhIWRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChhY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3VwcG9ydDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ2xpcGJvYXJkO1xufSgodGlueV9lbWl0dGVyX2RlZmF1bHQoKSkpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDgyODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxudmFyIERPQ1VNRU5UX05PREVfVFlQRSA9IDk7XG5cbi8qKlxuICogQSBwb2x5ZmlsbCBmb3IgRWxlbWVudC5tYXRjaGVzKClcbiAqL1xuaWYgKHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcykge1xuICAgIHZhciBwcm90byA9IEVsZW1lbnQucHJvdG90eXBlO1xuXG4gICAgcHJvdG8ubWF0Y2hlcyA9IHByb3RvLm1hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8ubXNNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8ub01hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGNsb3Nlc3QgcGFyZW50IHRoYXQgbWF0Y2hlcyBhIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gY2xvc2VzdCAoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9PSBET0NVTUVOVF9OT0RFX1RZUEUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgICAgIGVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9zZXN0O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA0Mzg6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGNsb3Nlc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyOCk7XG5cbi8qKlxuICogRGVsZWdhdGVzIGV2ZW50IHRvIGEgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHBhcmFtIHtCb29sZWFufSB1c2VDYXB0dXJlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIF9kZWxlZ2F0ZShlbGVtZW50LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICB2YXIgbGlzdGVuZXJGbiA9IGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfEFycmF5fSBbZWxlbWVudHNdXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHBhcmFtIHtCb29sZWFufSB1c2VDYXB0dXJlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRlbGVnYXRlKGVsZW1lbnRzLCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICAvLyBIYW5kbGUgdGhlIHJlZ3VsYXIgRWxlbWVudCB1c2FnZVxuICAgIGlmICh0eXBlb2YgZWxlbWVudHMuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEVsZW1lbnQtbGVzcyB1c2FnZSwgaXQgZGVmYXVsdHMgdG8gZ2xvYmFsIGRlbGVnYXRpb25cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVXNlIGBkb2N1bWVudGAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciwgdGhlbiBhcHBseSBhcmd1bWVudHNcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNob3J0IHdheSB0byAudW5zaGlmdCBgYXJndW1lbnRzYCB3aXRob3V0IHJ1bm5pbmcgaW50byBkZW9wdGltaXphdGlvbnNcbiAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5iaW5kKG51bGwsIGRvY3VtZW50KS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBTZWxlY3Rvci1iYXNlZCB1c2FnZVxuICAgIGlmICh0eXBlb2YgZWxlbWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlbGVtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEFycmF5LWxpa2UgYmFzZWQgdXNhZ2VcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGVsZW1lbnRzLCBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlKGVsZW1lbnQsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRmluZHMgY2xvc2VzdCBtYXRjaCBhbmQgaW52b2tlcyBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuZXIoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5kZWxlZ2F0ZVRhcmdldCA9IGNsb3Nlc3QoZS50YXJnZXQsIHNlbGVjdG9yKTtcblxuICAgICAgICBpZiAoZS5kZWxlZ2F0ZVRhcmdldCkge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChlbGVtZW50LCBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWxlZ2F0ZTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODc5OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSB7XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBIVE1MIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnRzLm5vZGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgJiYgdmFsdWUubm9kZVR5cGUgPT09IDE7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgbGlzdCBvZiBIVE1MIGVsZW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5ub2RlTGlzdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgKHR5cGUgPT09ICdbb2JqZWN0IE5vZGVMaXN0XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJylcbiAgICAgICAgJiYgKCdsZW5ndGgnIGluIHZhbHVlKVxuICAgICAgICAmJiAodmFsdWUubGVuZ3RoID09PSAwIHx8IGV4cG9ydHMubm9kZSh2YWx1ZVswXSkpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuc3RyaW5nID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcblxuICAgIHJldHVybiB0eXBlID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzcwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODc5KTtcbnZhciBkZWxlZ2F0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDM4KTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYWxsIHBhcmFtcyBhbmQgY2FsbHMgdGhlIHJpZ2h0XG4gKiBsaXN0ZW5lciBmdW5jdGlvbiBiYXNlZCBvbiBpdHMgdGFyZ2V0IHR5cGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IHRhcmdldFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3Rlbih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0YXJnZXQgJiYgIXR5cGUgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudHMnKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIFN0cmluZycpO1xuICAgIH1cblxuICAgIGlmICghaXMuZm4oY2FsbGJhY2spKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSBGdW5jdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChpcy5ub2RlKHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIGxpc3Rlbk5vZGUodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLm5vZGVMaXN0KHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIGxpc3Rlbk5vZGVMaXN0KHRhcmdldCwgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBlbHNlIGlmIChpcy5zdHJpbmcodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuU2VsZWN0b3IodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nLCBIVE1MRWxlbWVudCwgSFRNTENvbGxlY3Rpb24sIG9yIE5vZGVMaXN0Jyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBIVE1MIGVsZW1lbnRcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5Ob2RlKG5vZGUsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBsaXN0IG9mIEhUTUwgZWxlbWVudHNcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Tm9kZUxpc3R8SFRNTENvbGxlY3Rpb259IG5vZGVMaXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuTm9kZUxpc3Qobm9kZUxpc3QsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChub2RlTGlzdCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIHNlbGVjdG9yXG4gKiBhbmQgcmV0dXJucyBhIHJlbW92ZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5TZWxlY3RvcihzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZGVsZWdhdGUoZG9jdW1lbnQuYm9keSwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0ZW47XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDgxNzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxuZnVuY3Rpb24gc2VsZWN0KGVsZW1lbnQpIHtcbiAgICB2YXIgc2VsZWN0ZWRUZXh0O1xuXG4gICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQubm9kZU5hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgdmFyIGlzUmVhZE9ubHkgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKTtcblxuICAgICAgICBpZiAoIWlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgZWxlbWVudC52YWx1ZS5sZW5ndGgpO1xuXG4gICAgICAgIGlmICghaXNSZWFkT25seSkge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JlYWRvbmx5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSkge1xuICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblxuICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRUZXh0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbGVjdDtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjc5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5mdW5jdGlvbiBFICgpIHtcbiAgLy8gS2VlcCB0aGlzIGVtcHR5IHNvIGl0J3MgZWFzaWVyIHRvIGluaGVyaXQgZnJvbVxuICAvLyAodmlhIGh0dHBzOi8vZ2l0aHViLmNvbS9saXBzbWFjayBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zY290dGNvcmdhbi90aW55LWVtaXR0ZXIvaXNzdWVzLzMpXG59XG5cbkUucHJvdG90eXBlID0ge1xuICBvbjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBjdHgpIHtcbiAgICB2YXIgZSA9IHRoaXMuZSB8fCAodGhpcy5lID0ge30pO1xuXG4gICAgKGVbbmFtZV0gfHwgKGVbbmFtZV0gPSBbXSkpLnB1c2goe1xuICAgICAgZm46IGNhbGxiYWNrLFxuICAgICAgY3R4OiBjdHhcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG9uY2U6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgY3R4KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGZ1bmN0aW9uIGxpc3RlbmVyICgpIHtcbiAgICAgIHNlbGYub2ZmKG5hbWUsIGxpc3RlbmVyKTtcbiAgICAgIGNhbGxiYWNrLmFwcGx5KGN0eCwgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgbGlzdGVuZXIuXyA9IGNhbGxiYWNrXG4gICAgcmV0dXJuIHRoaXMub24obmFtZSwgbGlzdGVuZXIsIGN0eCk7XG4gIH0sXG5cbiAgZW1pdDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgZGF0YSA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICB2YXIgZXZ0QXJyID0gKCh0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KSlbbmFtZV0gfHwgW10pLnNsaWNlKCk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBsZW4gPSBldnRBcnIubGVuZ3RoO1xuXG4gICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGV2dEFycltpXS5mbi5hcHBseShldnRBcnJbaV0uY3R4LCBkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBvZmY6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBlID0gdGhpcy5lIHx8ICh0aGlzLmUgPSB7fSk7XG4gICAgdmFyIGV2dHMgPSBlW25hbWVdO1xuICAgIHZhciBsaXZlRXZlbnRzID0gW107XG5cbiAgICBpZiAoZXZ0cyAmJiBjYWxsYmFjaykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV2dHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGV2dHNbaV0uZm4gIT09IGNhbGxiYWNrICYmIGV2dHNbaV0uZm4uXyAhPT0gY2FsbGJhY2spXG4gICAgICAgICAgbGl2ZUV2ZW50cy5wdXNoKGV2dHNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBldmVudCBmcm9tIHF1ZXVlIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtcbiAgICAvLyBTdWdnZXN0ZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2xhemRcbiAgICAvLyBSZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9zY290dGNvcmdhbi90aW55LWVtaXR0ZXIvY29tbWl0L2M2ZWJmYWE5YmM5NzNiMzNkMTEwYTg0YTMwNzc0MmI3Y2Y5NGM5NTMjY29tbWl0Y29tbWVudC01MDI0OTEwXG5cbiAgICAobGl2ZUV2ZW50cy5sZW5ndGgpXG4gICAgICA/IGVbbmFtZV0gPSBsaXZlRXZlbnRzXG4gICAgICA6IGRlbGV0ZSBlW25hbWVdO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRTtcbm1vZHVsZS5leHBvcnRzLlRpbnlFbWl0dGVyID0gRTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0ICovXG4vKioqKioqLyBcdCFmdW5jdGlvbigpIHtcbi8qKioqKiovIFx0XHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHR9KCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG4vKioqKioqLyBcdFx0XHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG4vKioqKioqLyBcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG4vKioqKioqLyBcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHR9KCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kICovXG4vKioqKioqLyBcdCFmdW5jdGlvbigpIHtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBtb2R1bGUgZXhwb3J0cyBtdXN0IGJlIHJldHVybmVkIGZyb20gcnVudGltZSBzbyBlbnRyeSBpbmxpbmluZyBpcyBkaXNhYmxlZFxuLyoqKioqKi8gXHQvLyBzdGFydHVwXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg2ODYpO1xuLyoqKioqKi8gfSkoKVxuLmRlZmF1bHQ7XG59KTsiLCAiLyohXG4gKiBUb2FzdGlmeSBqcyAxLjExLjJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHZhcnVuL3RvYXN0aWZ5LWpzXG4gKiBAbGljZW5zZSBNSVQgbGljZW5zZWRcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggVmFydW4gQSBQXG4gKi9cbihmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5Ub2FzdGlmeSA9IGZhY3RvcnkoKTtcbiAgfVxufSkodGhpcywgZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIC8vIE9iamVjdCBpbml0aWFsaXphdGlvblxuICB2YXIgVG9hc3RpZnkgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAvLyBSZXR1cm5pbmcgYSBuZXcgaW5pdCBvYmplY3RcbiAgICAgIHJldHVybiBuZXcgVG9hc3RpZnkubGliLmluaXQob3B0aW9ucyk7XG4gICAgfSxcbiAgICAvLyBMaWJyYXJ5IHZlcnNpb25cbiAgICB2ZXJzaW9uID0gXCIxLjExLjJcIjtcblxuICAvLyBTZXQgdGhlIGRlZmF1bHQgZ2xvYmFsIG9wdGlvbnNcbiAgVG9hc3RpZnkuZGVmYXVsdHMgPSB7XG4gICAgb2xkZXN0Rmlyc3Q6IHRydWUsXG4gICAgdGV4dDogXCJUb2FzdGlmeSBpcyBhd2Vzb21lIVwiLFxuICAgIG5vZGU6IHVuZGVmaW5lZCxcbiAgICBkdXJhdGlvbjogMzAwMCxcbiAgICBzZWxlY3RvcjogdW5kZWZpbmVkLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcbiAgICBkZXN0aW5hdGlvbjogdW5kZWZpbmVkLFxuICAgIG5ld1dpbmRvdzogZmFsc2UsXG4gICAgY2xvc2U6IGZhbHNlLFxuICAgIGdyYXZpdHk6IFwidG9hc3RpZnktdG9wXCIsXG4gICAgcG9zaXRpb25MZWZ0OiBmYWxzZSxcbiAgICBwb3NpdGlvbjogJycsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnJyxcbiAgICBhdmF0YXI6IFwiXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLFxuICAgIHN0b3BPbkZvY3VzOiB0cnVlLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuICAgIG9mZnNldDoge3g6IDAsIHk6IDB9LFxuICAgIGVzY2FwZU1hcmt1cDogdHJ1ZSxcbiAgICBzdHlsZToge2JhY2tncm91bmQ6ICcnfVxuICB9O1xuXG4gIC8vIERlZmluaW5nIHRoZSBwcm90b3R5cGUgb2YgdGhlIG9iamVjdFxuICBUb2FzdGlmeS5saWIgPSBUb2FzdGlmeS5wcm90b3R5cGUgPSB7XG4gICAgdG9hc3RpZnk6IHZlcnNpb24sXG5cbiAgICBjb25zdHJ1Y3RvcjogVG9hc3RpZnksXG5cbiAgICAvLyBJbml0aWFsaXppbmcgdGhlIG9iamVjdCB3aXRoIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgICBpbml0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAvLyBWZXJpZnlpbmcgYW5kIHZhbGlkYXRpbmcgdGhlIGlucHV0IG9iamVjdFxuICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRpbmcgdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgICB0aGlzLm9wdGlvbnMgPSB7fTtcblxuICAgICAgdGhpcy50b2FzdEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAvLyBWYWxpZGF0aW5nIHRoZSBvcHRpb25zXG4gICAgICB0aGlzLm9wdGlvbnMudGV4dCA9IG9wdGlvbnMudGV4dCB8fCBUb2FzdGlmeS5kZWZhdWx0cy50ZXh0OyAvLyBEaXNwbGF5IG1lc3NhZ2VcbiAgICAgIHRoaXMub3B0aW9ucy5ub2RlID0gb3B0aW9ucy5ub2RlIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLm5vZGU7ICAvLyBEaXNwbGF5IGNvbnRlbnQgYXMgbm9kZVxuICAgICAgdGhpcy5vcHRpb25zLmR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiA9PT0gMCA/IDAgOiBvcHRpb25zLmR1cmF0aW9uIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmR1cmF0aW9uOyAvLyBEaXNwbGF5IGR1cmF0aW9uXG4gICAgICB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPSBvcHRpb25zLnNlbGVjdG9yIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLnNlbGVjdG9yOyAvLyBQYXJlbnQgc2VsZWN0b3JcbiAgICAgIHRoaXMub3B0aW9ucy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgVG9hc3RpZnkuZGVmYXVsdHMuY2FsbGJhY2s7IC8vIENhbGxiYWNrIGFmdGVyIGRpc3BsYXlcbiAgICAgIHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbiA9IG9wdGlvbnMuZGVzdGluYXRpb24gfHwgVG9hc3RpZnkuZGVmYXVsdHMuZGVzdGluYXRpb247IC8vIE9uLWNsaWNrIGRlc3RpbmF0aW9uXG4gICAgICB0aGlzLm9wdGlvbnMubmV3V2luZG93ID0gb3B0aW9ucy5uZXdXaW5kb3cgfHwgVG9hc3RpZnkuZGVmYXVsdHMubmV3V2luZG93OyAvLyBPcGVuIGRlc3RpbmF0aW9uIGluIG5ldyB3aW5kb3dcbiAgICAgIHRoaXMub3B0aW9ucy5jbG9zZSA9IG9wdGlvbnMuY2xvc2UgfHwgVG9hc3RpZnkuZGVmYXVsdHMuY2xvc2U7IC8vIFNob3cgdG9hc3QgY2xvc2UgaWNvblxuICAgICAgdGhpcy5vcHRpb25zLmdyYXZpdHkgPSBvcHRpb25zLmdyYXZpdHkgPT09IFwiYm90dG9tXCIgPyBcInRvYXN0aWZ5LWJvdHRvbVwiIDogVG9hc3RpZnkuZGVmYXVsdHMuZ3Jhdml0eTsgLy8gdG9hc3QgcG9zaXRpb24gLSB0b3Agb3IgYm90dG9tXG4gICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25MZWZ0ID0gb3B0aW9ucy5wb3NpdGlvbkxlZnQgfHwgVG9hc3RpZnkuZGVmYXVsdHMucG9zaXRpb25MZWZ0OyAvLyB0b2FzdCBwb3NpdGlvbiAtIGxlZnQgb3IgcmlnaHRcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24gfHwgVG9hc3RpZnkuZGVmYXVsdHMucG9zaXRpb247IC8vIHRvYXN0IHBvc2l0aW9uIC0gbGVmdCBvciByaWdodFxuICAgICAgdGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmJhY2tncm91bmRDb2xvcjsgLy8gdG9hc3QgYmFja2dyb3VuZCBjb2xvclxuICAgICAgdGhpcy5vcHRpb25zLmF2YXRhciA9IG9wdGlvbnMuYXZhdGFyIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmF2YXRhcjsgLy8gaW1nIGVsZW1lbnQgc3JjIC0gdXJsIG9yIGEgcGF0aFxuICAgICAgdGhpcy5vcHRpb25zLmNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3NOYW1lIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmNsYXNzTmFtZTsgLy8gYWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3IgdGhlIHRvYXN0XG4gICAgICB0aGlzLm9wdGlvbnMuc3RvcE9uRm9jdXMgPSBvcHRpb25zLnN0b3BPbkZvY3VzID09PSB1bmRlZmluZWQgPyBUb2FzdGlmeS5kZWZhdWx0cy5zdG9wT25Gb2N1cyA6IG9wdGlvbnMuc3RvcE9uRm9jdXM7IC8vIHN0b3AgdGltZW91dCBvbiBmb2N1c1xuICAgICAgdGhpcy5vcHRpb25zLm9uQ2xpY2sgPSBvcHRpb25zLm9uQ2xpY2sgfHwgVG9hc3RpZnkuZGVmYXVsdHMub25DbGljazsgLy8gQ2FsbGJhY2sgYWZ0ZXIgY2xpY2tcbiAgICAgIHRoaXMub3B0aW9ucy5vZmZzZXQgPSBvcHRpb25zLm9mZnNldCB8fCBUb2FzdGlmeS5kZWZhdWx0cy5vZmZzZXQ7IC8vIHRvYXN0IG9mZnNldFxuICAgICAgdGhpcy5vcHRpb25zLmVzY2FwZU1hcmt1cCA9IG9wdGlvbnMuZXNjYXBlTWFya3VwICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmVzY2FwZU1hcmt1cCA6IFRvYXN0aWZ5LmRlZmF1bHRzLmVzY2FwZU1hcmt1cDtcbiAgICAgIHRoaXMub3B0aW9ucy5zdHlsZSA9IG9wdGlvbnMuc3R5bGUgfHwgVG9hc3RpZnkuZGVmYXVsdHMuc3R5bGU7XG4gICAgICBpZihvcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc3R5bGUuYmFja2dyb3VuZCA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm5pbmcgdGhlIGN1cnJlbnQgb2JqZWN0IGZvciBjaGFpbmluZyBmdW5jdGlvbnNcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZGluZyB0aGUgRE9NIGVsZW1lbnRcbiAgICBidWlsZFRvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFZhbGlkYXRpbmcgaWYgdGhlIG9wdGlvbnMgYXJlIGRlZmluZWRcbiAgICAgIGlmICghdGhpcy5vcHRpb25zKSB7XG4gICAgICAgIHRocm93IFwiVG9hc3RpZnkgaXMgbm90IGluaXRpYWxpemVkXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0XG4gICAgICB2YXIgZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSA9IFwidG9hc3RpZnkgb24gXCIgKyB0aGlzLm9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gICAgICAvLyBQb3NpdGlvbmluZyB0b2FzdCB0byBsZWZ0IG9yIHJpZ2h0IG9yIGNlbnRlclxuICAgICAgaWYgKCEhdGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LVwiICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVG8gYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9uc1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LWxlZnRcIjtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Byb3BlcnR5IGBwb3NpdGlvbkxlZnRgIHdpbGwgYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9ucy4gUGxlYXNlIHVzZSBgcG9zaXRpb25gIGluc3RlYWQuJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uXG4gICAgICAgICAgZGl2RWxlbWVudC5jbGFzc05hbWUgKz0gXCIgdG9hc3RpZnktcmlnaHRcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ25pbmcgZ3Jhdml0eSBvZiBlbGVtZW50XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSArPSBcIiBcIiArIHRoaXMub3B0aW9ucy5ncmF2aXR5O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAvLyBUaGlzIGlzIGJlaW5nIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdXNpbmcgdGhlIHN0eWxlIEhUTUwgRE9NIHByb3BlcnR5XG4gICAgICAgIGNvbnNvbGUud2FybignREVQUkVDQVRJT04gTk9USUNFOiBcImJhY2tncm91bmRDb2xvclwiIGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFwic3R5bGUuYmFja2dyb3VuZFwiIHByb3BlcnR5LicpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggb3VyIHN0eWxlIG9iamVjdCBhbmQgYXBwbHkgc3R5bGVzIHRvIGRpdkVsZW1lbnRcbiAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMub3B0aW9ucy5zdHlsZSkge1xuICAgICAgICBkaXZFbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IHRoaXMub3B0aW9ucy5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGluZyB0aGUgdG9hc3QgbWVzc2FnZS9ub2RlXG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vZGUgJiYgdGhpcy5vcHRpb25zLm5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWxpZCBub2RlLCB3ZSBpbnNlcnQgaXRcbiAgICAgICAgZGl2RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLm9wdGlvbnMubm9kZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXNjYXBlTWFya3VwKSB7XG4gICAgICAgICAgZGl2RWxlbWVudC5pbm5lclRleHQgPSB0aGlzLm9wdGlvbnMudGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXZFbGVtZW50LmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy50ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdmF0YXIgIT09IFwiXCIpIHtcbiAgICAgICAgICB2YXIgYXZhdGFyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICAgYXZhdGFyRWxlbWVudC5zcmMgPSB0aGlzLm9wdGlvbnMuYXZhdGFyO1xuXG4gICAgICAgICAgYXZhdGFyRWxlbWVudC5jbGFzc05hbWUgPSBcInRvYXN0aWZ5LWF2YXRhclwiO1xuXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PSBcImxlZnRcIiB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb25MZWZ0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgbGVmdCBvZiBjb250ZW50XG4gICAgICAgICAgICBkaXZFbGVtZW50LmFwcGVuZENoaWxkKGF2YXRhckVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgcmlnaHQgb2YgY29udGVudFxuICAgICAgICAgICAgZGl2RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGF2YXRhckVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgYSBjbG9zZSBpY29uIHRvIHRoZSB0b2FzdFxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBzcGFuIGZvciBjbG9zZSBlbGVtZW50XG4gICAgICAgIHZhciBjbG9zZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgY2xvc2VFbGVtZW50LmlubmVySFRNTCA9IFwiJiMxMDAwNjtcIjtcblxuICAgICAgICBjbG9zZUVsZW1lbnQuY2xhc3NOYW1lID0gXCJ0b2FzdC1jbG9zZVwiO1xuXG4gICAgICAgIC8vIFRyaWdnZXJpbmcgdGhlIHJlbW92YWwgb2YgdG9hc3QgZnJvbSBET00gb24gY2xvc2UgY2xpY2tcbiAgICAgICAgY2xvc2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbWVudCh0aGlzLnRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9DYWxjdWxhdGluZyBzY3JlZW4gd2lkdGhcbiAgICAgICAgdmFyIHdpZHRoID0gd2luZG93LmlubmVyV2lkdGggPiAwID8gd2luZG93LmlubmVyV2lkdGggOiBzY3JlZW4ud2lkdGg7XG5cbiAgICAgICAgLy8gQWRkaW5nIHRoZSBjbG9zZSBpY29uIHRvIHRoZSB0b2FzdCBlbGVtZW50XG4gICAgICAgIC8vIERpc3BsYXkgb24gdGhlIHJpZ2h0IGlmIHNjcmVlbiB3aWR0aCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzYwcHhcbiAgICAgICAgaWYgKCh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkgJiYgd2lkdGggPiAzNjApIHtcbiAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgbGVmdCBvZiBjb250ZW50XG4gICAgICAgICAgZGl2RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkaW5nIGNsb3NlIGljb24gb24gdGhlIHJpZ2h0IG9mIGNvbnRlbnRcbiAgICAgICAgICBkaXZFbGVtZW50LmFwcGVuZENoaWxkKGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGltZW91dCB3aGlsZSB0b2FzdCBpcyBmb2N1c2VkXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnN0b3BPbkZvY3VzICYmIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAvLyBzdG9wIGNvdW50ZG93blxuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJtb3VzZW92ZXJcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChkaXZFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICAgIC8vIGFkZCBiYWNrIHRoZSB0aW1lb3V0XG4gICAgICAgIGRpdkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcIm1vdXNlbGVhdmVcIixcbiAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRpdkVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdG9hc3QgZnJvbSBET01cbiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUVsZW1lbnQoZGl2RWxlbWVudCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kdXJhdGlvblxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgYW4gb24tY2xpY2sgZGVzdGluYXRpb24gcGF0aFxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZGl2RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5ld1dpbmRvdyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24sIFwiX2JsYW5rXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gdGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5vbkNsaWNrID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkNsaWNrKCk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGluZyBvZmZzZXRcbiAgICAgIGlmKHR5cGVvZiB0aGlzLm9wdGlvbnMub2Zmc2V0ID09PSBcIm9iamVjdFwiKSB7XG5cbiAgICAgICAgdmFyIHggPSBnZXRBeGlzT2Zmc2V0QVZhbHVlKFwieFwiLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB2YXIgeSA9IGdldEF4aXNPZmZzZXRBVmFsdWUoXCJ5XCIsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHhPZmZzZXQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgPyB4IDogXCItXCIgKyB4O1xuICAgICAgICB2YXIgeU9mZnNldCA9IHRoaXMub3B0aW9ucy5ncmF2aXR5ID09IFwidG9hc3RpZnktdG9wXCIgPyB5IDogXCItXCIgKyB5O1xuXG4gICAgICAgIGRpdkVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUoXCIgKyB4T2Zmc2V0ICsgXCIsXCIgKyB5T2Zmc2V0ICsgXCIpXCI7XG5cbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuaW5nIHRoZSBnZW5lcmF0ZWQgZWxlbWVudFxuICAgICAgcmV0dXJuIGRpdkVsZW1lbnQ7XG4gICAgfSxcblxuICAgIC8vIERpc3BsYXlpbmcgdGhlIHRvYXN0XG4gICAgc2hvd1RvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0IGZvciB0aGUgdG9hc3RcbiAgICAgIHRoaXMudG9hc3RFbGVtZW50ID0gdGhpcy5idWlsZFRvYXN0KCk7XG5cbiAgICAgIC8vIEdldHRpbmcgdGhlIHJvb3QgZWxlbWVudCB0byB3aXRoIHRoZSB0b2FzdCBuZWVkcyB0byBiZSBhZGRlZFxuICAgICAgdmFyIHJvb3RFbGVtZW50O1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0b3IgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAodHlwZW9mIFNoYWRvd1Jvb3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMub3B0aW9ucy5zZWxlY3RvciBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpKSB7XG4gICAgICAgIHJvb3RFbGVtZW50ID0gdGhpcy5vcHRpb25zLnNlbGVjdG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0aW5nIGlmIHJvb3QgZWxlbWVudCBpcyBwcmVzZW50IGluIERPTVxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICB0aHJvdyBcIlJvb3QgZWxlbWVudCBpcyBub3QgZGVmaW5lZFwiO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgdGhlIERPTSBlbGVtZW50XG4gICAgICB2YXIgZWxlbWVudFRvSW5zZXJ0ID0gVG9hc3RpZnkuZGVmYXVsdHMub2xkZXN0Rmlyc3QgPyByb290RWxlbWVudC5maXJzdENoaWxkIDogcm9vdEVsZW1lbnQubGFzdENoaWxkO1xuICAgICAgcm9vdEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMudG9hc3RFbGVtZW50LCBlbGVtZW50VG9JbnNlcnQpO1xuXG4gICAgICAvLyBSZXBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgaW4gY2FzZSBtdWx0aXBsZSB0b2FzdHMgYXJlIHByZXNlbnRcbiAgICAgIFRvYXN0aWZ5LnJlcG9zaXRpb24oKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRvYXN0IGZyb20gRE9NXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQodGhpcy50b2FzdEVsZW1lbnQpO1xuICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZHVyYXRpb25cbiAgICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICAgIH1cblxuICAgICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGhpZGVUb2FzdDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0RWxlbWVudC50aW1lT3V0VmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHRoaXMudG9hc3RFbGVtZW50KTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZpbmcgdGhlIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAgcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24odG9hc3RFbGVtZW50KSB7XG4gICAgICAvLyBIaWRpbmcgdGhlIGVsZW1lbnRcbiAgICAgIC8vIHRvYXN0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwib25cIik7XG4gICAgICB0b2FzdEVsZW1lbnQuY2xhc3NOYW1lID0gdG9hc3RFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKFwiIG9uXCIsIFwiXCIpO1xuXG4gICAgICAvLyBSZW1vdmluZyB0aGUgZWxlbWVudCBmcm9tIERPTSBhZnRlciB0cmFuc2l0aW9uIGVuZFxuICAgICAgd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIHJlbW92ZSBvcHRpb25zIG5vZGUgaWYgYW55XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub2RlICYmIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5vcHRpb25zLm5vZGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBET00sIG9ubHkgd2hlbiB0aGUgcGFyZW50IG5vZGUgd2FzIG5vdCByZW1vdmVkIGJlZm9yZS5cbiAgICAgICAgICBpZiAodG9hc3RFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRvYXN0RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2FsbGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgICAgICB0aGlzLm9wdGlvbnMuY2FsbGJhY2suY2FsbCh0b2FzdEVsZW1lbnQpO1xuXG4gICAgICAgICAgLy8gUmVwb3NpdGlvbmluZyB0aGUgdG9hc3RzIGFnYWluXG4gICAgICAgICAgVG9hc3RpZnkucmVwb3NpdGlvbigpO1xuICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgIDQwMFxuICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICB9LFxuICB9O1xuXG4gIC8vIFBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgb24gdGhlIERPTVxuICBUb2FzdGlmeS5yZXBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBUb3AgbWFyZ2lucyB3aXRoIGdyYXZpdHlcbiAgICB2YXIgdG9wTGVmdE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciB0b3BSaWdodE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciBvZmZzZXRTaXplID0ge1xuICAgICAgdG9wOiAxNSxcbiAgICAgIGJvdHRvbTogMTUsXG4gICAgfTtcblxuICAgIC8vIEdldCBhbGwgdG9hc3QgbWVzc2FnZXMgb24gdGhlIERPTVxuICAgIHZhciBhbGxUb2FzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwidG9hc3RpZnlcIik7XG5cbiAgICB2YXIgY2xhc3NVc2VkO1xuXG4gICAgLy8gTW9kaWZ5aW5nIHRoZSBwb3NpdGlvbiBvZiBlYWNoIHRvYXN0IGVsZW1lbnRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFRvYXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0dGluZyB0aGUgYXBwbGllZCBncmF2aXR5XG4gICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktdG9wXCIpID09PSB0cnVlKSB7XG4gICAgICAgIGNsYXNzVXNlZCA9IFwidG9hc3RpZnktdG9wXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc1VzZWQgPSBcInRvYXN0aWZ5LWJvdHRvbVwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVpZ2h0ID0gYWxsVG9hc3RzW2ldLm9mZnNldEhlaWdodDtcbiAgICAgIGNsYXNzVXNlZCA9IGNsYXNzVXNlZC5zdWJzdHIoOSwgY2xhc3NVc2VkLmxlbmd0aC0xKVxuICAgICAgLy8gU3BhY2luZyBiZXR3ZWVuIHRvYXN0c1xuICAgICAgdmFyIG9mZnNldCA9IDE1O1xuXG4gICAgICB2YXIgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCA+IDAgPyB3aW5kb3cuaW5uZXJXaWR0aCA6IHNjcmVlbi53aWR0aDtcblxuICAgICAgLy8gU2hvdyB0b2FzdCBpbiBjZW50ZXIgaWYgc2NyZWVuIHdpdGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDM2MHB4XG4gICAgICBpZiAod2lkdGggPD0gMzYwKSB7XG4gICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgIGFsbFRvYXN0c1tpXS5zdHlsZVtjbGFzc1VzZWRdID0gb2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgIG9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktbGVmdFwiKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgICAgYWxsVG9hc3RzW2ldLnN0eWxlW2NsYXNzVXNlZF0gPSB0b3BMZWZ0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wTGVmdE9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0dGluZyB0aGUgcG9zaXRpb25cbiAgICAgICAgICBhbGxUb2FzdHNbaV0uc3R5bGVbY2xhc3NVc2VkXSA9IHRvcFJpZ2h0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wUmlnaHRPZmZzZXRTaXplW2NsYXNzVXNlZF0gKz0gaGVpZ2h0ICsgb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgb2Zmc2V0LlxuICBmdW5jdGlvbiBnZXRBeGlzT2Zmc2V0QVZhbHVlKGF4aXMsIG9wdGlvbnMpIHtcblxuICAgIGlmKG9wdGlvbnMub2Zmc2V0W2F4aXNdKSB7XG4gICAgICBpZihpc05hTihvcHRpb25zLm9mZnNldFtheGlzXSkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMub2Zmc2V0W2F4aXNdO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLm9mZnNldFtheGlzXSArICdweCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcwcHgnO1xuXG4gIH1cblxuICBmdW5jdGlvbiBjb250YWluc0NsYXNzKGVsZW0sIHlvdXJDbGFzcykge1xuICAgIGlmICghZWxlbSB8fCB0eXBlb2YgeW91ckNsYXNzICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGVsZW0uY2xhc3NOYW1lICYmXG4gICAgICBlbGVtLmNsYXNzTmFtZVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgvXFxzKy9naSlcbiAgICAgICAgLmluZGV4T2YoeW91ckNsYXNzKSA+IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldHRpbmcgdXAgdGhlIHByb3RvdHlwZSBmb3IgdGhlIGluaXQgb2JqZWN0XG4gIFRvYXN0aWZ5LmxpYi5pbml0LnByb3RvdHlwZSA9IFRvYXN0aWZ5LmxpYjtcblxuICAvLyBSZXR1cm5pbmcgdGhlIFRvYXN0aWZ5IGZ1bmN0aW9uIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSB3aW5kb3cgb2JqZWN0L21vZHVsZVxuICByZXR1cm4gVG9hc3RpZnk7XG59KTtcbiIsICIvKipcbiAqIEBsaWNlbnNlIE1JVFxuICogdG9wYmFyIDEuMC4wLCAyMDIxLTAxLTA2XG4gKiBodHRwOi8vYnV1bmd1eWVuLmdpdGh1Yi5pby90b3BiYXJcbiAqIENvcHlyaWdodCAoYykgMjAyMSBCdXUgTmd1eWVuXG4gKi9cbihmdW5jdGlvbih3aW5kb3csZG9jdW1lbnQpe1widXNlIHN0cmljdFwiOyFmdW5jdGlvbigpe2Zvcih2YXIgbGFzdFRpbWU9MCx2ZW5kb3JzPVtcIm1zXCIsXCJtb3pcIixcIndlYmtpdFwiLFwib1wiXSx4PTA7eDx2ZW5kb3JzLmxlbmd0aCYmIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7Kyt4KXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9d2luZG93W3ZlbmRvcnNbeF0rXCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIl0sd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lPXdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsQW5pbWF0aW9uRnJhbWVcIl18fHdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGNhbGxiYWNrLGVsZW1lbnQpe3ZhciBjdXJyVGltZT0obmV3IERhdGUpLmdldFRpbWUoKSx0aW1lVG9DYWxsPU1hdGgubWF4KDAsMTYtKGN1cnJUaW1lLWxhc3RUaW1lKSksaWQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtjYWxsYmFjayhjdXJyVGltZSt0aW1lVG9DYWxsKX0sdGltZVRvQ2FsbCk7cmV0dXJuIGxhc3RUaW1lPWN1cnJUaW1lK3RpbWVUb0NhbGwsaWR9KSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oaWQpe2NsZWFyVGltZW91dChpZCl9KX0oKTtmdW5jdGlvbiByZXBhaW50KCl7Y2FudmFzLndpZHRoPXdpbmRvdy5pbm5lcldpZHRoLGNhbnZhcy5oZWlnaHQ9NSpvcHRpb25zLmJhclRoaWNrbmVzczt2YXIgY3R4PWNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7Y3R4LnNoYWRvd0JsdXI9b3B0aW9ucy5zaGFkb3dCbHVyLGN0eC5zaGFkb3dDb2xvcj1vcHRpb25zLnNoYWRvd0NvbG9yO3ZhciBzdG9wLGxpbmVHcmFkaWVudD1jdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwwLGNhbnZhcy53aWR0aCwwKTtmb3Ioc3RvcCBpbiBvcHRpb25zLmJhckNvbG9ycylsaW5lR3JhZGllbnQuYWRkQ29sb3JTdG9wKHN0b3Asb3B0aW9ucy5iYXJDb2xvcnNbc3RvcF0pO2N0eC5saW5lV2lkdGg9b3B0aW9ucy5iYXJUaGlja25lc3MsY3R4LmJlZ2luUGF0aCgpLGN0eC5tb3ZlVG8oMCxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHgubGluZVRvKE1hdGguY2VpbChjdXJyZW50UHJvZ3Jlc3MqY2FudmFzLndpZHRoKSxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHguc3Ryb2tlU3R5bGU9bGluZUdyYWRpZW50LGN0eC5zdHJva2UoKX12YXIgY2FudmFzLHByb2dyZXNzVGltZXJJZCxmYWRlVGltZXJJZCxjdXJyZW50UHJvZ3Jlc3Msc2hvd2luZyxvcHRpb25zPXthdXRvUnVuOiEwLGJhclRoaWNrbmVzczozLGJhckNvbG9yczp7MDpcInJnYmEoMjYsICAxODgsIDE1NiwgLjkpXCIsXCIuMjVcIjpcInJnYmEoNTIsICAxNTIsIDIxOSwgLjkpXCIsXCIuNTBcIjpcInJnYmEoMjQxLCAxOTYsIDE1LCAgLjkpXCIsXCIuNzVcIjpcInJnYmEoMjMwLCAxMjYsIDM0LCAgLjkpXCIsXCIxLjBcIjpcInJnYmEoMjExLCA4NCwgIDAsICAgLjkpXCJ9LHNoYWRvd0JsdXI6MTAsc2hhZG93Q29sb3I6XCJyZ2JhKDAsICAgMCwgICAwLCAgIC42KVwiLGNsYXNzTmFtZTpudWxsfSx0b3BiYXI9e2NvbmZpZzpmdW5jdGlvbihvcHRzKXtmb3IodmFyIGtleSBpbiBvcHRzKW9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSYmKG9wdGlvbnNba2V5XT1vcHRzW2tleV0pfSxzaG93OmZ1bmN0aW9uKCl7dmFyIHR5cGUsaGFuZGxlcixlbGVtO3Nob3dpbmd8fChzaG93aW5nPSEwLG51bGwhPT1mYWRlVGltZXJJZCYmd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGZhZGVUaW1lcklkKSxjYW52YXN8fCgoZWxlbT0oY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpLnN0eWxlKS5wb3NpdGlvbj1cImZpeGVkXCIsZWxlbS50b3A9ZWxlbS5sZWZ0PWVsZW0ucmlnaHQ9ZWxlbS5tYXJnaW49ZWxlbS5wYWRkaW5nPTAsZWxlbS56SW5kZXg9MTAwMDAxLGVsZW0uZGlzcGxheT1cIm5vbmVcIixvcHRpb25zLmNsYXNzTmFtZSYmY2FudmFzLmNsYXNzTGlzdC5hZGQob3B0aW9ucy5jbGFzc05hbWUpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKSx0eXBlPVwicmVzaXplXCIsaGFuZGxlcj1yZXBhaW50LChlbGVtPXdpbmRvdykuYWRkRXZlbnRMaXN0ZW5lcj9lbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSxoYW5kbGVyLCExKTplbGVtLmF0dGFjaEV2ZW50P2VsZW0uYXR0YWNoRXZlbnQoXCJvblwiK3R5cGUsaGFuZGxlcik6ZWxlbVtcIm9uXCIrdHlwZV09aGFuZGxlciksY2FudmFzLnN0eWxlLm9wYWNpdHk9MSxjYW52YXMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCIsdG9wYmFyLnByb2dyZXNzKDApLG9wdGlvbnMuYXV0b1J1biYmZnVuY3Rpb24gbG9vcCgpe3Byb2dyZXNzVGltZXJJZD13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApLHRvcGJhci5wcm9ncmVzcyhcIitcIisuMDUqTWF0aC5wb3coMS1NYXRoLnNxcnQoY3VycmVudFByb2dyZXNzKSwyKSl9KCkpfSxwcm9ncmVzczpmdW5jdGlvbih0byl7cmV0dXJuIHZvaWQgMD09PXRvfHwoXCJzdHJpbmdcIj09dHlwZW9mIHRvJiYodG89KDA8PXRvLmluZGV4T2YoXCIrXCIpfHwwPD10by5pbmRleE9mKFwiLVwiKT9jdXJyZW50UHJvZ3Jlc3M6MCkrcGFyc2VGbG9hdCh0bykpLGN1cnJlbnRQcm9ncmVzcz0xPHRvPzE6dG8scmVwYWludCgpKSxjdXJyZW50UHJvZ3Jlc3N9LGhpZGU6ZnVuY3Rpb24oKXtzaG93aW5nJiYoc2hvd2luZz0hMSxudWxsIT1wcm9ncmVzc1RpbWVySWQmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NUaW1lcklkKSxwcm9ncmVzc1RpbWVySWQ9bnVsbCksZnVuY3Rpb24gbG9vcCgpe3JldHVybiAxPD10b3BiYXIucHJvZ3Jlc3MoXCIrLjFcIikmJihjYW52YXMuc3R5bGUub3BhY2l0eS09LjA1LGNhbnZhcy5zdHlsZS5vcGFjaXR5PD0uMDUpPyhjYW52YXMuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix2b2lkKGZhZGVUaW1lcklkPW51bGwpKTp2b2lkKGZhZGVUaW1lcklkPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCkpfSgpKX19O1wib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz10b3BiYXI6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiB0b3BiYXJ9KTp0aGlzLnRvcGJhcj10b3BiYXJ9KS5jYWxsKHRoaXMsd2luZG93LGRvY3VtZW50KTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbihmdW5jdGlvbigpIHtcbiAgdmFyIFBvbHlmaWxsRXZlbnQgPSBldmVudENvbnN0cnVjdG9yKCk7XG5cbiAgZnVuY3Rpb24gZXZlbnRDb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gd2luZG93LkN1c3RvbUV2ZW50O1xuICAgIC8vIElFPD05IFN1cHBvcnRcbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge2J1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWR9O1xuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICAgIHJldHVybiBldnQ7XG4gICAgfVxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRIaWRkZW5JbnB1dChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC50eXBlID0gXCJoaWRkZW5cIjtcbiAgICBpbnB1dC5uYW1lID0gbmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGVsZW1lbnQsIHRhcmdldE1vZGlmaWVyS2V5KSB7XG4gICAgdmFyIHRvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRvXCIpLFxuICAgICAgICBtZXRob2QgPSBidWlsZEhpZGRlbklucHV0KFwiX21ldGhvZFwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpKSxcbiAgICAgICAgY3NyZiA9IGJ1aWxkSGlkZGVuSW5wdXQoXCJfY3NyZl90b2tlblwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3NyZlwiKSksXG4gICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSxcbiAgICAgICAgc3VibWl0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLFxuICAgICAgICB0YXJnZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcblxuICAgIGZvcm0ubWV0aG9kID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikgPT09IFwiZ2V0XCIpID8gXCJnZXRcIiA6IFwicG9zdFwiO1xuICAgIGZvcm0uYWN0aW9uID0gdG87XG4gICAgZm9ybS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cbiAgICBpZiAodGFyZ2V0KSBmb3JtLnRhcmdldCA9IHRhcmdldDtcbiAgICBlbHNlIGlmICh0YXJnZXRNb2RpZmllcktleSkgZm9ybS50YXJnZXQgPSBcIl9ibGFua1wiO1xuXG4gICAgZm9ybS5hcHBlbmRDaGlsZChjc3JmKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKG1ldGhvZCk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcblxuICAgIC8vIEluc2VydCBhIGJ1dHRvbiBhbmQgY2xpY2sgaXQgaW5zdGVhZCBvZiB1c2luZyBgZm9ybS5zdWJtaXRgXG4gICAgLy8gYmVjYXVzZSB0aGUgYHN1Ym1pdGAgZnVuY3Rpb24gZG9lcyBub3QgZW1pdCBhIGBzdWJtaXRgIGV2ZW50LlxuICAgIHN1Ym1pdC50eXBlID0gXCJzdWJtaXRcIjtcbiAgICBmb3JtLmFwcGVuZENoaWxkKHN1Ym1pdCk7XG4gICAgc3VibWl0LmNsaWNrKCk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWxlbWVudCA9IGUudGFyZ2V0O1xuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7XG4gICAgICB2YXIgcGhvZW5peExpbmtFdmVudCA9IG5ldyBQb2x5ZmlsbEV2ZW50KCdwaG9lbml4LmxpbmsuY2xpY2snLCB7XG4gICAgICAgIFwiYnViYmxlc1wiOiB0cnVlLCBcImNhbmNlbGFibGVcIjogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghZWxlbWVudC5kaXNwYXRjaEV2ZW50KHBob2VuaXhMaW5rRXZlbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1ldGhvZFwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdG9cIikpIHtcbiAgICAgICAgaGFuZGxlQ2xpY2soZWxlbWVudCwgZS5tZXRhS2V5IHx8IGUuc2hpZnRLZXkpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9LCBmYWxzZSk7XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Bob2VuaXgubGluay5jbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIG1lc3NhZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbmZpcm1cIik7XG4gICAgaWYobWVzc2FnZSAmJiAhd2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbn0pKCk7XG4iLCAiLy8gd3JhcHMgdmFsdWUgaW4gY2xvc3VyZSBvciByZXR1cm5zIGNsb3N1cmVcbmV4cG9ydCBsZXQgY2xvc3VyZSA9ICh2YWx1ZSkgPT4ge1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgbGV0IGNsb3N1cmUgPSBmdW5jdGlvbiAoKXsgcmV0dXJuIHZhbHVlIH1cbiAgICByZXR1cm4gY2xvc3VyZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGdsb2JhbFNlbGYgPSB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiBudWxsXG5leHBvcnQgY29uc3QgcGh4V2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG51bGxcbmV4cG9ydCBjb25zdCBnbG9iYWwgPSBnbG9iYWxTZWxmIHx8IHBoeFdpbmRvdyB8fCBnbG9iYWxUaGlzXG5leHBvcnQgY29uc3QgREVGQVVMVF9WU04gPSBcIjIuMC4wXCJcbmV4cG9ydCBjb25zdCBTT0NLRVRfU1RBVEVTID0ge2Nvbm5lY3Rpbmc6IDAsIG9wZW46IDEsIGNsb3Npbmc6IDIsIGNsb3NlZDogM31cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFdTX0NMT1NFX05PUk1BTCA9IDEwMDBcbmV4cG9ydCBjb25zdCBDSEFOTkVMX1NUQVRFUyA9IHtcbiAgY2xvc2VkOiBcImNsb3NlZFwiLFxuICBlcnJvcmVkOiBcImVycm9yZWRcIixcbiAgam9pbmVkOiBcImpvaW5lZFwiLFxuICBqb2luaW5nOiBcImpvaW5pbmdcIixcbiAgbGVhdmluZzogXCJsZWF2aW5nXCIsXG59XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9FVkVOVFMgPSB7XG4gIGNsb3NlOiBcInBoeF9jbG9zZVwiLFxuICBlcnJvcjogXCJwaHhfZXJyb3JcIixcbiAgam9pbjogXCJwaHhfam9pblwiLFxuICByZXBseTogXCJwaHhfcmVwbHlcIixcbiAgbGVhdmU6IFwicGh4X2xlYXZlXCJcbn1cblxuZXhwb3J0IGNvbnN0IFRSQU5TUE9SVFMgPSB7XG4gIGxvbmdwb2xsOiBcImxvbmdwb2xsXCIsXG4gIHdlYnNvY2tldDogXCJ3ZWJzb2NrZXRcIlxufVxuZXhwb3J0IGNvbnN0IFhIUl9TVEFURVMgPSB7XG4gIGNvbXBsZXRlOiA0XG59XG5leHBvcnQgY29uc3QgQVVUSF9UT0tFTl9QUkVGSVggPSBcImJhc2U2NHVybC5iZWFyZXIucGh4LlwiXG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIENoYW5uZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBldmVudCwgZm9yIGV4YW1wbGUgYFwicGh4X2pvaW5cImBcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIC0gVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IC0gVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaCB7XG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0KXtcbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgdGhpcy5ldmVudCA9IGV2ZW50XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZCB8fCBmdW5jdGlvbiAoKXsgcmV0dXJuIHt9IH1cbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gICAgdGhpcy5yZWNIb29rcyA9IFtdXG4gICAgdGhpcy5zZW50ID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKi9cbiAgcmVzZW5kKHRpbWVvdXQpe1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICB0aGlzLnJlc2V0KClcbiAgICB0aGlzLnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZW5kKCl7XG4gICAgaWYodGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIikpeyByZXR1cm4gfVxuICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICB0aGlzLnNlbnQgPSB0cnVlXG4gICAgdGhpcy5jaGFubmVsLnNvY2tldC5wdXNoKHtcbiAgICAgIHRvcGljOiB0aGlzLmNoYW5uZWwudG9waWMsXG4gICAgICBldmVudDogdGhpcy5ldmVudCxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCgpLFxuICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuam9pblJlZigpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHN0YXR1c1xuICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrXG4gICAqL1xuICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuaGFzUmVjZWl2ZWQoc3RhdHVzKSl7XG4gICAgICBjYWxsYmFjayh0aGlzLnJlY2VpdmVkUmVzcC5yZXNwb25zZSlcbiAgICB9XG5cbiAgICB0aGlzLnJlY0hvb2tzLnB1c2goe3N0YXR1cywgY2FsbGJhY2t9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlc2V0KCl7XG4gICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgdGhpcy5yZWYgPSBudWxsXG4gICAgdGhpcy5yZWZFdmVudCA9IG51bGxcbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnNlbnQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYXRjaFJlY2VpdmUoe3N0YXR1cywgcmVzcG9uc2UsIF9yZWZ9KXtcbiAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcihoID0+IGguc3RhdHVzID09PSBzdGF0dXMpXG4gICAgICAuZm9yRWFjaChoID0+IGguY2FsbGJhY2socmVzcG9uc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxSZWZFdmVudCgpe1xuICAgIGlmKCF0aGlzLnJlZkV2ZW50KXsgcmV0dXJuIH1cbiAgICB0aGlzLmNoYW5uZWwub2ZmKHRoaXMucmVmRXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVvdXQoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpXG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0VGltZW91dCgpe1xuICAgIGlmKHRoaXMudGltZW91dFRpbWVyKXsgdGhpcy5jYW5jZWxUaW1lb3V0KCkgfVxuICAgIHRoaXMucmVmID0gdGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKClcbiAgICB0aGlzLnJlZkV2ZW50ID0gdGhpcy5jaGFubmVsLnJlcGx5RXZlbnROYW1lKHRoaXMucmVmKVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKHRoaXMucmVmRXZlbnQsIHBheWxvYWQgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgICB0aGlzLmNhbmNlbFRpbWVvdXQoKVxuICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkXG4gICAgICB0aGlzLm1hdGNoUmVjZWl2ZShwYXlsb2FkKVxuICAgIH0pXG5cbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKFwidGltZW91dFwiLCB7fSlcbiAgICB9LCB0aGlzLnRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhhc1JlY2VpdmVkKHN0YXR1cyl7XG4gICAgcmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwICYmIHRoaXMucmVjZWl2ZWRSZXNwLnN0YXR1cyA9PT0gc3RhdHVzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSl7XG4gICAgdGhpcy5jaGFubmVsLnRyaWdnZXIodGhpcy5yZWZFdmVudCwge3N0YXR1cywgcmVzcG9uc2V9KVxuICB9XG59XG4iLCAiLyoqXG4gKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm1cbiAqIGNhbGN1bGF0ZWQgdGltZW91dCByZXRyaWVzLCBzdWNoIGFzIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCByZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDUwMDAsIDEwMDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9KVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgNTAwMFxuICogcmVjb25uZWN0VGltZXIucmVzZXQoKVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lckNhbGNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKXtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsY1xuICAgIHRoaXMudGltZXIgPSBudWxsXG4gICAgdGhpcy50cmllcyA9IDBcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmllcyA9IDBcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBzY2hlZHVsZVRpbWVvdXQgYW5kIHNjaGVkdWxlcyBjYWxsYmFja1xuICAgKi9cbiAgc2NoZWR1bGVUaW1lb3V0KCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpXG5cbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWVzID0gdGhpcy50cmllcyArIDFcbiAgICAgIHRoaXMuY2FsbGJhY2soKVxuICAgIH0sIHRoaXMudGltZXJDYWxjKHRoaXMudHJpZXMgKyAxKSlcbiAgfVxufVxuIiwgImltcG9ydCB7Y2xvc3VyZX0gZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgQ0hBTk5FTF9FVkVOVFMsXG4gIENIQU5ORUxfU1RBVEVTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgUHVzaCBmcm9tIFwiLi9wdXNoXCJcbmltcG9ydCBUaW1lciBmcm9tIFwiLi90aW1lclwiXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICogQHBhcmFtIHsoT2JqZWN0fGZ1bmN0aW9uKX0gcGFyYW1zXG4gKiBAcGFyYW0ge1NvY2tldH0gc29ja2V0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYW5uZWwge1xuICBjb25zdHJ1Y3Rvcih0b3BpYywgcGFyYW1zLCBzb2NrZXQpe1xuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWRcbiAgICB0aGlzLnRvcGljID0gdG9waWNcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUocGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy5iaW5kaW5ncyA9IFtdXG4gICAgdGhpcy5iaW5kaW5nUmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IHRoaXMuc29ja2V0LnRpbWVvdXRcbiAgICB0aGlzLmpvaW5lZE9uY2UgPSBmYWxzZVxuICAgIHRoaXMuam9pblB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5qb2luLCB0aGlzLnBhcmFtcywgdGhpcy50aW1lb3V0KVxuICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5zdGF0ZUNoYW5nZVJlZnMgPSBbXVxuXG4gICAgdGhpcy5yZWpvaW5UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW4oKSB9XG4gICAgfSwgdGhpcy5zb2NrZXQucmVqb2luQWZ0ZXJNcylcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uRXJyb3IoKCkgPT4gdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpKSlcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uT3BlbigoKSA9PiB7XG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuaXNFcnJvcmVkKCkpeyB0aGlzLnJlam9pbigpIH1cbiAgICB9KVxuICAgIClcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuam9pbmVkXG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5mb3JFYWNoKHB1c2hFdmVudCA9PiBwdXNoRXZlbnQuc2VuZCgpKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW11cbiAgICB9KVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcImVycm9yXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgY2xvc2UgJHt0aGlzLnRvcGljfSAke3RoaXMuam9pblJlZigpfWApXG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkXG4gICAgICB0aGlzLnNvY2tldC5yZW1vdmUodGhpcylcbiAgICB9KVxuICAgIHRoaXMub25FcnJvcihyZWFzb24gPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pXG4gICAgICBpZih0aGlzLmlzSm9pbmluZygpKXsgdGhpcy5qb2luUHVzaC5yZXNldCgpIH1cbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGB0aW1lb3V0ICR7dGhpcy50b3BpY30gKCR7dGhpcy5qb2luUmVmKCl9KWAsIHRoaXMuam9pblB1c2gudGltZW91dClcbiAgICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRoaXMudGltZW91dClcbiAgICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICB0aGlzLmpvaW5QdXNoLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMub24oQ0hBTk5FTF9FVkVOVFMucmVwbHksIChwYXlsb2FkLCByZWYpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlcih0aGlzLnJlcGx5RXZlbnROYW1lKHJlZiksIHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2luIHRoZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGpvaW4odGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgaWYodGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRyaWVkIHRvIGpvaW4gbXVsdGlwbGUgdGltZXMuICdqb2luJyBjYW4gb25seSBiZSBjYWxsZWQgYSBzaW5nbGUgdGltZSBwZXIgY2hhbm5lbCBpbnN0YW5jZVwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgICB0aGlzLmpvaW5lZE9uY2UgPSB0cnVlXG4gICAgICB0aGlzLnJlam9pbigpXG4gICAgICByZXR1cm4gdGhpcy5qb2luUHVzaFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIGludG8gY2hhbm5lbCBjbG9zZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25DbG9zZShjYWxsYmFjayl7XG4gICAgdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5jbG9zZSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogSG9vayBpbnRvIGNoYW5uZWwgZXJyb3JzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkVycm9yKGNhbGxiYWNrKXtcbiAgICByZXR1cm4gdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5lcnJvciwgcmVhc29uID0+IGNhbGxiYWNrKHJlYXNvbikpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBvbiBjaGFubmVsIGV2ZW50c1xuICAgKlxuICAgKiBTdWJzY3JpcHRpb24gcmV0dXJucyBhIHJlZiBjb3VudGVyLCB3aGljaCBjYW4gYmUgdXNlZCBsYXRlciB0b1xuICAgKiB1bnN1YnNjcmliZSB0aGUgZXhhY3QgZXZlbnQgbGlzdGVuZXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY29uc3QgcmVmMiA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19vdGhlcl9zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKiAvLyBTaW5jZSB1bnN1YnNjcmlwdGlvbiwgZG9fc3R1ZmYgd29uJ3QgZmlyZSxcbiAgICogLy8gd2hpbGUgZG9fb3RoZXJfc3R1ZmYgd2lsbCBrZWVwIGZpcmluZyBvbiB0aGUgXCJldmVudFwiXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7aW50ZWdlcn0gcmVmXG4gICAqL1xuICBvbihldmVudCwgY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLmJpbmRpbmdSZWYrK1xuICAgIHRoaXMuYmluZGluZ3MucHVzaCh7ZXZlbnQsIHJlZiwgY2FsbGJhY2t9KVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgb2ZmIG9mIGNoYW5uZWwgZXZlbnRzXG4gICAqXG4gICAqIFVzZSB0aGUgcmVmIHJldHVybmVkIGZyb20gYSBjaGFubmVsLm9uKCkgdG8gdW5zdWJzY3JpYmUgb25lXG4gICAqIGhhbmRsZXIsIG9yIHBhc3Mgbm90aGluZyBmb3IgdGhlIHJlZiB0byB1bnN1YnNjcmliZSBhbGxcbiAgICogaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBldmVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gVW5zdWJzY3JpYmUgdGhlIGRvX3N0dWZmIGhhbmRsZXJcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKlxuICAgKiAvLyBVbnN1YnNjcmliZSBhbGwgaGFuZGxlcnMgZnJvbSBldmVudFxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHJlZlxuICAgKi9cbiAgb2ZmKGV2ZW50LCByZWYpe1xuICAgIHRoaXMuYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgcmV0dXJuICEoYmluZC5ldmVudCA9PT0gZXZlbnQgJiYgKHR5cGVvZiByZWYgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVmID09PSBiaW5kLnJlZikpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuUHVzaCgpeyByZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLmlzSm9pbmVkKCkgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgYGV2ZW50YCB0byBwaG9lbml4IHdpdGggdGhlIHBheWxvYWQgYHBheWxvYWRgLlxuICAgKiBQaG9lbml4IHJlY2VpdmVzIHRoaXMgaW4gdGhlIGBoYW5kbGVfaW4oZXZlbnQsIHBheWxvYWQsIHNvY2tldClgXG4gICAqIGZ1bmN0aW9uLiBpZiBwaG9lbml4IHJlcGxpZXMgb3IgaXQgdGltZXMgb3V0IChkZWZhdWx0IDEwMDAwbXMpLFxuICAgKiB0aGVuIG9wdGlvbmFsbHkgdGhlIHJlcGx5IGNhbiBiZSByZWNlaXZlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY2hhbm5lbC5wdXNoKFwiZXZlbnRcIilcbiAgICogICAucmVjZWl2ZShcIm9rXCIsIHBheWxvYWQgPT4gY29uc29sZS5sb2coXCJwaG9lbml4IHJlcGxpZWQ6XCIsIHBheWxvYWQpKVxuICAgKiAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgZXJyID0+IGNvbnNvbGUubG9nKFwicGhvZW5peCBlcnJvcmVkXCIsIGVycikpXG4gICAqICAgLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IGNvbnNvbGUubG9nKFwidGltZWQgb3V0IHB1c2hpbmdcIikpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgcHVzaChldmVudCwgcGF5bG9hZCwgdGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgcGF5bG9hZCA9IHBheWxvYWQgfHwge31cbiAgICBpZighdGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJpZWQgdG8gcHVzaCAnJHtldmVudH0nIHRvICcke3RoaXMudG9waWN9JyBiZWZvcmUgam9pbmluZy4gVXNlIGNoYW5uZWwuam9pbigpIGJlZm9yZSBwdXNoaW5nIGV2ZW50c2ApXG4gICAgfVxuICAgIGxldCBwdXNoRXZlbnQgPSBuZXcgUHVzaCh0aGlzLCBldmVudCwgZnVuY3Rpb24gKCl7IHJldHVybiBwYXlsb2FkIH0sIHRpbWVvdXQpXG4gICAgaWYodGhpcy5jYW5QdXNoKCkpe1xuICAgICAgcHVzaEV2ZW50LnNlbmQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoRXZlbnQuc3RhcnRUaW1lb3V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5wdXNoKHB1c2hFdmVudClcbiAgICB9XG5cbiAgICByZXR1cm4gcHVzaEV2ZW50XG4gIH1cblxuICAvKiogTGVhdmVzIHRoZSBjaGFubmVsXG4gICAqXG4gICAqIFVuc3Vic2NyaWJlcyBmcm9tIHNlcnZlciBldmVudHMsIGFuZFxuICAgKiBpbnN0cnVjdHMgY2hhbm5lbCB0byB0ZXJtaW5hdGUgb24gc2VydmVyXG4gICAqXG4gICAqIFRyaWdnZXJzIG9uQ2xvc2UoKSBob29rc1xuICAgKlxuICAgKiBUbyByZWNlaXZlIGxlYXZlIGFja25vd2xlZGdlbWVudHMsIHVzZSB0aGUgYHJlY2VpdmVgXG4gICAqIGhvb2sgdG8gYmluZCB0byB0aGUgc2VydmVyIGFjaywgaWU6XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNoYW5uZWwubGVhdmUoKS5yZWNlaXZlKFwib2tcIiwgKCkgPT4gYWxlcnQoXCJsZWZ0IVwiKSApXG4gICAqXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGxlYXZlKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgIHRoaXMuam9pblB1c2guY2FuY2VsVGltZW91dCgpXG5cbiAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMubGVhdmluZ1xuICAgIGxldCBvbkNsb3NlID0gKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGxlYXZlICR7dGhpcy50b3BpY31gKVxuICAgICAgdGhpcy50cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmNsb3NlLCBcImxlYXZlXCIpXG4gICAgfVxuICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRpbWVvdXQpXG4gICAgbGVhdmVQdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBvbkNsb3NlKCkpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gb25DbG9zZSgpKVxuICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICBpZighdGhpcy5jYW5QdXNoKCkpeyBsZWF2ZVB1c2gudHJpZ2dlcihcIm9rXCIsIHt9KSB9XG5cbiAgICByZXR1cm4gbGVhdmVQdXNoXG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGFibGUgbWVzc2FnZSBob29rXG4gICAqXG4gICAqIFJlY2VpdmVzIGFsbCBldmVudHMgZm9yIHNwZWNpYWxpemVkIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICogYmVmb3JlIGRpc3BhdGNoaW5nIHRvIHRoZSBjaGFubmVsIGNhbGxiYWNrcy5cbiAgICpcbiAgICogTXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVmXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBvbk1lc3NhZ2UoX2V2ZW50LCBwYXlsb2FkLCBfcmVmKXsgcmV0dXJuIHBheWxvYWQgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNNZW1iZXIodG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmKXtcbiAgICBpZih0aGlzLnRvcGljICE9PSB0b3BpYyl7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZihqb2luUmVmICYmIGpvaW5SZWYgIT09IHRoaXMuam9pblJlZigpKXtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLCB7dG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmfSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgam9pblJlZigpeyByZXR1cm4gdGhpcy5qb2luUHVzaC5yZWYgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIGlmKHRoaXMuaXNMZWF2aW5nKCkpeyByZXR1cm4gfVxuICAgIHRoaXMuc29ja2V0LmxlYXZlT3BlblRvcGljKHRoaXMudG9waWMpXG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5pbmdcbiAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpe1xuICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMub25NZXNzYWdlKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpXG4gICAgaWYocGF5bG9hZCAmJiAhaGFuZGxlZFBheWxvYWQpeyB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIG9uTWVzc2FnZSBjYWxsYmFja3MgbXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcIikgfVxuXG4gICAgbGV0IGV2ZW50QmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcihiaW5kID0+IGJpbmQuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGV2ZW50QmluZGluZ3MubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IGJpbmQgPSBldmVudEJpbmRpbmdzW2ldXG4gICAgICBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYsIGpvaW5SZWYgfHwgdGhpcy5qb2luUmVmKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXBseUV2ZW50TmFtZShyZWYpeyByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0Nsb3NlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzRXJyb3JlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0pvaW5lZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzSm9pbmluZygpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZyB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xlYXZpbmcoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmxlYXZpbmcgfVxufVxuIiwgImltcG9ydCB7XG4gIGdsb2JhbCxcbiAgWEhSX1NUQVRFU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBamF4IHtcblxuICBzdGF0aWMgcmVxdWVzdChtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBpZihnbG9iYWwuWERvbWFpblJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWERvbWFpblJlcXVlc3QoKSAvLyBJRTgsIElFOVxuICAgICAgcmV0dXJuIHRoaXMueGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuWE1MSHR0cFJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKSAvLyBJRTcrLCBGaXJlZm94LCBDaHJvbWUsIE9wZXJhLCBTYWZhcmlcbiAgICAgIHJldHVybiB0aGlzLnhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuZmV0Y2ggJiYgZ2xvYmFsLkFib3J0Q29udHJvbGxlcil7XG4gICAgICAvLyBGZXRjaCB3aXRoIEFib3J0Q29udHJvbGxlciBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICByZXR1cm4gdGhpcy5mZXRjaFJlcXVlc3QobWV0aG9kLCBlbmRQb2ludCwgaGVhZGVycywgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjaylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3VpdGFibGUgWE1MSHR0cFJlcXVlc3QgaW1wbGVtZW50YXRpb24gZm91bmRcIilcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZmV0Y2hSZXF1ZXN0KG1ldGhvZCwgZW5kUG9pbnQsIGhlYWRlcnMsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgfVxuICAgIGxldCBjb250cm9sbGVyID0gbnVsbFxuICAgIGlmKHRpbWVvdXQpe1xuICAgICAgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgY29uc3QgX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KVxuICAgICAgb3B0aW9ucy5zaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbFxuICAgIH1cbiAgICBnbG9iYWwuZmV0Y2goZW5kUG9pbnQsIG9wdGlvbnMpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAudGhlbihkYXRhID0+IHRoaXMucGFyc2VKU09OKGRhdGEpKVxuICAgICAgLnRoZW4oZGF0YSA9PiBjYWxsYmFjayAmJiBjYWxsYmFjayhkYXRhKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBpZihlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgJiYgb250aW1lb3V0KXtcbiAgICAgICAgICBvbnRpbWVvdXQoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgcmV0dXJuIGNvbnRyb2xsZXJcbiAgfVxuXG4gIHN0YXRpYyB4ZG9tYWluUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQpXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHRoaXMucGFyc2VKU09OKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSlcbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICAvLyBXb3JrIGFyb3VuZCBidWcgaW4gSUU5IHRoYXQgcmVxdWlyZXMgYW4gYXR0YWNoZWQgb25wcm9ncmVzcyBoYW5kbGVyXG4gICAgcmVxLm9ucHJvZ3Jlc3MgPSAoKSA9PiB7IH1cblxuICAgIHJlcS5zZW5kKGJvZHkpXG4gICAgcmV0dXJuIHJlcVxuICB9XG5cbiAgc3RhdGljIHhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICByZXEub3BlbihtZXRob2QsIGVuZFBvaW50LCB0cnVlKVxuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIGZvcihsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKXtcbiAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJlcS5vbmVycm9yID0gKCkgPT4gY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbClcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYocmVxLnJlYWR5U3RhdGUgPT09IFhIUl9TVEFURVMuY29tcGxldGUgJiYgY2FsbGJhY2spe1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLnBhcnNlSlNPTihyZXEucmVzcG9uc2VUZXh0KVxuICAgICAgICBjYWxsYmFjayhyZXNwb25zZSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICByZXEuc2VuZChib2R5KVxuICAgIHJldHVybiByZXFcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpTT04ocmVzcCl7XG4gICAgaWYoIXJlc3AgfHwgcmVzcCA9PT0gXCJcIil7IHJldHVybiBudWxsIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwKVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsIHJlc3ApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqLCBwYXJlbnRLZXkpe1xuICAgIGxldCBxdWVyeVN0ciA9IFtdXG4gICAgZm9yKHZhciBrZXkgaW4gb2JqKXtcbiAgICAgIGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKXsgY29udGludWUgfVxuICAgICAgbGV0IHBhcmFtS2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fVske2tleX1dYCA6IGtleVxuICAgICAgbGV0IHBhcmFtVmFsID0gb2JqW2tleV1cbiAgICAgIGlmKHR5cGVvZiBwYXJhbVZhbCA9PT0gXCJvYmplY3RcIil7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2godGhpcy5zZXJpYWxpemUocGFyYW1WYWwsIHBhcmFtS2V5KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtS2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtVmFsKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5U3RyLmpvaW4oXCImXCIpXG4gIH1cblxuICBzdGF0aWMgYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKXtcbiAgICBpZihPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCl7IHJldHVybiB1cmwgfVxuXG4gICAgbGV0IHByZWZpeCA9IHVybC5tYXRjaCgvXFw/LykgPyBcIiZcIiA6IFwiP1wiXG4gICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3RoaXMuc2VyaWFsaXplKHBhcmFtcyl9YFxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUUyxcbiAgQVVUSF9UT0tFTl9QUkVGSVhcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEFqYXggZnJvbSBcIi4vYWpheFwiXG5cbmxldCBhcnJheUJ1ZmZlclRvQmFzZTY0ID0gKGJ1ZmZlcikgPT4ge1xuICBsZXQgYmluYXJ5ID0gXCJcIlxuICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpXG4gIGxldCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoXG4gIGZvcihsZXQgaSA9IDA7IGkgPCBsZW47IGkrKyl7IGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKSB9XG4gIHJldHVybiBidG9hKGJpbmFyeSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9uZ1BvbGwge1xuXG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBwcm90b2NvbHMpe1xuICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBzdWJwcm90b2NvbHMgZm9yIGF1dGhUb2tlblxuICAgIC8vIFtcInBob2VuaXhcIiwgXCJiYXNlNjR1cmwuYmVhcmVyLnBoeC5CQVNFNjRfRU5DT0RFRF9UT0tFTlwiXVxuICAgIGlmKHByb3RvY29scyAmJiBwcm90b2NvbHMubGVuZ3RoID09PSAyICYmIHByb3RvY29sc1sxXS5zdGFydHNXaXRoKEFVVEhfVE9LRU5fUFJFRklYKSl7XG4gICAgICB0aGlzLmF1dGhUb2tlbiA9IGF0b2IocHJvdG9jb2xzWzFdLnNsaWNlKEFVVEhfVE9LRU5fUFJFRklYLmxlbmd0aCkpXG4gICAgfVxuICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsXG4gICAgdGhpcy50b2tlbiA9IG51bGxcbiAgICB0aGlzLnNraXBIZWFydGJlYXQgPSB0cnVlXG4gICAgdGhpcy5yZXFzID0gbmV3IFNldCgpXG4gICAgdGhpcy5hd2FpdGluZ0JhdGNoQWNrID0gZmFsc2VcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IG51bGxcbiAgICB0aGlzLmN1cnJlbnRCYXRjaFRpbWVyID0gbnVsbFxuICAgIHRoaXMuYmF0Y2hCdWZmZXIgPSBbXVxuICAgIHRoaXMub25vcGVuID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25lcnJvciA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5wb2xsRW5kcG9pbnQgPSB0aGlzLm5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgdGhlIGNhbGxlciB0byBmaW5pc2ggc2V0dGluZyB1cCBvdXIgY2FsbGJhY2tzIGFuZCB0aW1lb3V0IHByb3BlcnRpZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucG9sbCgpLCAwKVxuICB9XG5cbiAgbm9ybWFsaXplRW5kcG9pbnQoZW5kUG9pbnQpe1xuICAgIHJldHVybiAoZW5kUG9pbnRcbiAgICAgIC5yZXBsYWNlKFwid3M6Ly9cIiwgXCJodHRwOi8vXCIpXG4gICAgICAucmVwbGFjZShcIndzczovL1wiLCBcImh0dHBzOi8vXCIpXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKFwiKC4qKVxcL1wiICsgVFJBTlNQT1JUUy53ZWJzb2NrZXQpLCBcIiQxL1wiICsgVFJBTlNQT1JUUy5sb25ncG9sbCkpXG4gIH1cblxuICBlbmRwb2ludFVSTCgpe1xuICAgIHJldHVybiBBamF4LmFwcGVuZFBhcmFtcyh0aGlzLnBvbGxFbmRwb2ludCwge3Rva2VuOiB0aGlzLnRva2VufSlcbiAgfVxuXG4gIGNsb3NlQW5kUmV0cnkoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgdGhpcy5jbG9zZShjb2RlLCByZWFzb24sIHdhc0NsZWFuKVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICB9XG5cbiAgb250aW1lb3V0KCl7XG4gICAgdGhpcy5vbmVycm9yKFwidGltZW91dFwiKVxuICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDA1LCBcInRpbWVvdXRcIiwgZmFsc2UpXG4gIH1cblxuICBpc0FjdGl2ZSgpeyByZXR1cm4gdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4gfHwgdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmcgfVxuXG4gIHBvbGwoKXtcbiAgICBjb25zdCBoZWFkZXJzID0ge1wiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwifVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIGhlYWRlcnNbXCJYLVBob2VuaXgtQXV0aFRva2VuXCJdID0gdGhpcy5hdXRoVG9rZW5cbiAgICB9XG4gICAgdGhpcy5hamF4KFwiR0VUXCIsIGhlYWRlcnMsIG51bGwsICgpID0+IHRoaXMub250aW1lb3V0KCksIHJlc3AgPT4ge1xuICAgICAgaWYocmVzcCl7XG4gICAgICAgIHZhciB7c3RhdHVzLCB0b2tlbiwgbWVzc2FnZXN9ID0gcmVzcFxuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyA9IDBcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKHN0YXR1cyl7XG4gICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICAgIC8vIFRhc2tzIGFyZSB3aGF0IHRoaW5ncyBsaWtlIGV2ZW50IGhhbmRsZXJzLCBzZXRUaW1lb3V0IGNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIHByb21pc2UgcmVzb2x2ZXMgYW5kIG1vcmUgYXJlIHJ1biB3aXRoaW4uXG4gICAgICAgICAgICAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIHRhc2tzLFxuICAgICAgICAgICAgLy8gbWljcm90YXNrcyBhbmQgbWFjcm90YXNrcy5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYXJlIG1haW5seSB1c2VkIGZvciBQcm9taXNlcywgd2hpbGUgbWFjcm90YXNrcyBhcmVcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciBtYWNyb3Rhc2tzLiBJZiB0aGUgSlMgZW5naW5lXG4gICAgICAgICAgICAvLyBpcyBsb29raW5nIGZvciBhIHRhc2sgdG8gcnVuLCBpdCB3aWxsIGFsd2F5cyB0cnkgdG8gZW1wdHkgdGhlXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcnVuIGFueXRoaW5nIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBtYWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LCBtZXNzYWdlcyBhbHdheXMgYXJyaXZlIGluIHRoZWlyIG93blxuICAgICAgICAgICAgLy8gZXZlbnQuIFRoaXMgbWVhbnMgdGhhdCBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlc29sdmVkIGZyb20gd2l0aGluLFxuICAgICAgICAgICAgLy8gdGhlaXIgY2FsbGJhY2tzIHdpbGwgYWx3YXlzIGZpbmlzaCBleGVjdXRpb24gYnkgdGhlIHRpbWUgdGhlXG4gICAgICAgICAgICAvLyBuZXh0IG1lc3NhZ2UgZXZlbnQgaGFuZGxlciBpcyBydW4uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gZW11bGF0ZSB0aGlzIGJlaGF2aW91ciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgZWFjaFxuICAgICAgICAgICAgLy8gb25tZXNzYWdlIGhhbmRsZXIgaXMgcnVuIHdpdGhpbiBpdHMgb3duIG1hY3JvdGFzay5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbm1lc3NhZ2Uoe2RhdGE6IG1zZ30pLCAwKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5wb2xsKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDEwOlxuICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMub3BlblxuICAgICAgICAgIHRoaXMub25vcGVuKHt9KVxuICAgICAgICAgIHRoaXMucG9sbCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDQwMylcbiAgICAgICAgICB0aGlzLmNsb3NlKDEwMDgsIFwiZm9yYmlkZGVuXCIsIGZhbHNlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDUwMClcbiAgICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoMTAxMSwgXCJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgNTAwKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHBvbGwgc3RhdHVzICR7c3RhdHVzfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHdlIGNvbGxlY3QgYWxsIHB1c2hlcyB3aXRoaW4gdGhlIGN1cnJlbnQgZXZlbnQgbG9vcCBieVxuICAvLyBzZXRUaW1lb3V0IDAsIHdoaWNoIG9wdGltaXplcyBiYWNrLXRvLWJhY2sgcHJvY2VkdXJhbFxuICAvLyBwdXNoZXMgYWdhaW5zdCBhbiBlbXB0eSBidWZmZXJcblxuICBzZW5kKGJvZHkpe1xuICAgIGlmKHR5cGVvZihib2R5KSAhPT0gXCJzdHJpbmdcIil7IGJvZHkgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KGJvZHkpIH1cbiAgICBpZih0aGlzLmN1cnJlbnRCYXRjaCl7XG4gICAgICB0aGlzLmN1cnJlbnRCYXRjaC5wdXNoKGJvZHkpXG4gICAgfSBlbHNlIGlmKHRoaXMuYXdhaXRpbmdCYXRjaEFjayl7XG4gICAgICB0aGlzLmJhdGNoQnVmZmVyLnB1c2goYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50QmF0Y2ggPSBbYm9keV1cbiAgICAgIHRoaXMuY3VycmVudEJhdGNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5iYXRjaFNlbmQodGhpcy5jdXJyZW50QmF0Y2gpXG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gbnVsbFxuICAgICAgfSwgMClcbiAgICB9XG4gIH1cblxuICBiYXRjaFNlbmQobWVzc2FnZXMpe1xuICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IHRydWVcbiAgICB0aGlzLmFqYXgoXCJQT1NUXCIsIHtcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtbmRqc29uXCJ9LCBtZXNzYWdlcy5qb2luKFwiXFxuXCIpLCAoKSA9PiB0aGlzLm9uZXJyb3IoXCJ0aW1lb3V0XCIpLCByZXNwID0+IHtcbiAgICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IGZhbHNlXG4gICAgICBpZighcmVzcCB8fCByZXNwLnN0YXR1cyAhPT0gMjAwKXtcbiAgICAgICAgdGhpcy5vbmVycm9yKHJlc3AgJiYgcmVzcC5zdGF0dXMpXG4gICAgICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDExLCBcImludGVybmFsIHNlcnZlciBlcnJvclwiLCBmYWxzZSlcbiAgICAgIH0gZWxzZSBpZih0aGlzLmJhdGNoQnVmZmVyLmxlbmd0aCA+IDApe1xuICAgICAgICB0aGlzLmJhdGNoU2VuZCh0aGlzLmJhdGNoQnVmZmVyKVxuICAgICAgICB0aGlzLmJhdGNoQnVmZmVyID0gW11cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY2xvc2UoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgZm9yKGxldCByZXEgb2YgdGhpcy5yZXFzKXsgcmVxLmFib3J0KCkgfVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY2xvc2VkXG4gICAgbGV0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtjb2RlOiAxMDAwLCByZWFzb246IHVuZGVmaW5lZCwgd2FzQ2xlYW46IHRydWV9LCB7Y29kZSwgcmVhc29uLCB3YXNDbGVhbn0pXG4gICAgdGhpcy5iYXRjaEJ1ZmZlciA9IFtdXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudEJhdGNoVGltZXIpXG4gICAgdGhpcy5jdXJyZW50QmF0Y2hUaW1lciA9IG51bGxcbiAgICBpZih0eXBlb2YoQ2xvc2VFdmVudCkgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgdGhpcy5vbmNsb3NlKG5ldyBDbG9zZUV2ZW50KFwiY2xvc2VcIiwgb3B0cykpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25jbG9zZShvcHRzKVxuICAgIH1cbiAgfVxuXG4gIGFqYXgobWV0aG9kLCBoZWFkZXJzLCBib2R5LCBvbkNhbGxlclRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBsZXQgcmVxXG4gICAgbGV0IG9udGltZW91dCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVxcy5kZWxldGUocmVxKVxuICAgICAgb25DYWxsZXJUaW1lb3V0KClcbiAgICB9XG4gICAgcmVxID0gQWpheC5yZXF1ZXN0KG1ldGhvZCwgdGhpcy5lbmRwb2ludFVSTCgpLCBoZWFkZXJzLCBib2R5LCB0aGlzLnRpbWVvdXQsIG9udGltZW91dCwgcmVzcCA9PiB7XG4gICAgICB0aGlzLnJlcXMuZGVsZXRlKHJlcSlcbiAgICAgIGlmKHRoaXMuaXNBY3RpdmUoKSl7IGNhbGxiYWNrKHJlc3ApIH1cbiAgICB9KVxuICAgIHRoaXMucmVxcy5hZGQocmVxKVxuICB9XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHJlc2VuY2VcbiAqIEBwYXJhbSB7Q2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBDaGFubmVsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zLFxuICogICAgICAgIGZvciBleGFtcGxlIGB7ZXZlbnRzOiB7c3RhdGU6IFwic3RhdGVcIiwgZGlmZjogXCJkaWZmXCJ9fWBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJlc2VuY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIG9wdHMgPSB7fSl7XG4gICAgbGV0IGV2ZW50cyA9IG9wdHMuZXZlbnRzIHx8IHtzdGF0ZTogXCJwcmVzZW5jZV9zdGF0ZVwiLCBkaWZmOiBcInByZXNlbmNlX2RpZmZcIn1cbiAgICB0aGlzLnN0YXRlID0ge31cbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIHRoaXMuam9pblJlZiA9IG51bGxcbiAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgIG9uSm9pbjogZnVuY3Rpb24gKCl7IH0sXG4gICAgICBvbkxlYXZlOiBmdW5jdGlvbiAoKXsgfSxcbiAgICAgIG9uU3luYzogZnVuY3Rpb24gKCl7IH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLnN0YXRlLCBuZXdTdGF0ZSA9PiB7XG4gICAgICBsZXQge29uSm9pbiwgb25MZWF2ZSwgb25TeW5jfSA9IHRoaXMuY2FsbGVyXG5cbiAgICAgIHRoaXMuam9pblJlZiA9IHRoaXMuY2hhbm5lbC5qb2luUmVmKClcbiAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSlcblxuICAgICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaChkaWZmID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgICBvblN5bmMoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLmRpZmYsIGRpZmYgPT4ge1xuICAgICAgbGV0IHtvbkpvaW4sIG9uTGVhdmUsIG9uU3luY30gPSB0aGlzLmNhbGxlclxuXG4gICAgICBpZih0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKXtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgICAgb25TeW5jKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Kb2luKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25Kb2luID0gY2FsbGJhY2sgfVxuXG4gIG9uTGVhdmUoY2FsbGJhY2speyB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2sgfVxuXG4gIG9uU3luYyhjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uU3luYyA9IGNhbGxiYWNrIH1cblxuICBsaXN0KGJ5KXsgcmV0dXJuIFByZXNlbmNlLmxpc3QodGhpcy5zdGF0ZSwgYnkpIH1cblxuICBpblBlbmRpbmdTeW5jU3RhdGUoKXtcbiAgICByZXR1cm4gIXRoaXMuam9pblJlZiB8fCAodGhpcy5qb2luUmVmICE9PSB0aGlzLmNoYW5uZWwuam9pblJlZigpKVxuICB9XG5cbiAgLy8gbG93ZXItbGV2ZWwgcHVibGljIHN0YXRpYyBBUElcblxuICAvKipcbiAgICogVXNlZCB0byBzeW5jIHRoZSBsaXN0IG9mIHByZXNlbmNlcyBvbiB0aGUgc2VydmVyXG4gICAqIHdpdGggdGhlIGNsaWVudCdzIHN0YXRlLiBBbiBvcHRpb25hbCBgb25Kb2luYCBhbmQgYG9uTGVhdmVgIGNhbGxiYWNrIGNhblxuICAgKiBiZSBwcm92aWRlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIHRoZSBjbGllbnQncyBsb2NhbCBwcmVzZW5jZXMgYWNyb3NzXG4gICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNTdGF0ZShjdXJyZW50U3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2xvbmUoY3VycmVudFN0YXRlKVxuICAgIGxldCBqb2lucyA9IHt9XG4gICAgbGV0IGxlYXZlcyA9IHt9XG5cbiAgICB0aGlzLm1hcChzdGF0ZSwgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIGlmKCFuZXdTdGF0ZVtrZXldKXtcbiAgICAgICAgbGVhdmVzW2tleV0gPSBwcmVzZW5jZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5tYXAobmV3U3RhdGUsIChrZXksIG5ld1ByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlKXtcbiAgICAgICAgbGV0IG5ld1JlZnMgPSBuZXdQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJSZWZzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGpvaW5lZE1ldGFzID0gbmV3UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gY3VyUmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBsZXQgbGVmdE1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IG5ld1JlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgaWYoam9pbmVkTWV0YXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICAgICAgam9pbnNba2V5XS5tZXRhcyA9IGpvaW5lZE1ldGFzXG4gICAgICAgIH1cbiAgICAgICAgaWYobGVmdE1ldGFzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGxlYXZlc1trZXldID0gdGhpcy5jbG9uZShjdXJyZW50UHJlc2VuY2UpXG4gICAgICAgICAgbGVhdmVzW2tleV0ubWV0YXMgPSBsZWZ0TWV0YXNcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwge2pvaW5zOiBqb2lucywgbGVhdmVzOiBsZWF2ZXN9LCBvbkpvaW4sIG9uTGVhdmUpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXNlZCB0byBzeW5jIGEgZGlmZiBvZiBwcmVzZW5jZSBqb2luIGFuZCBsZWF2ZVxuICAgKiBldmVudHMgZnJvbSB0aGUgc2VydmVyLCBhcyB0aGV5IGhhcHBlbi4gTGlrZSBgc3luY1N0YXRlYCwgYHN5bmNEaWZmYFxuICAgKiBhY2NlcHRzIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlclxuICAgKiBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCB7am9pbnMsIGxlYXZlc30gPSB0aGlzLmNsb25lKGRpZmYpXG4gICAgaWYoIW9uSm9pbil7IG9uSm9pbiA9IGZ1bmN0aW9uICgpeyB9IH1cbiAgICBpZighb25MZWF2ZSl7IG9uTGVhdmUgPSBmdW5jdGlvbiAoKXsgfSB9XG5cbiAgICB0aGlzLm1hcChqb2lucywgKGtleSwgbmV3UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBzdGF0ZVtrZXldID0gdGhpcy5jbG9uZShuZXdQcmVzZW5jZSlcbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZSl7XG4gICAgICAgIGxldCBqb2luZWRSZWZzID0gc3RhdGVba2V5XS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJNZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBqb2luZWRSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIHN0YXRlW2tleV0ubWV0YXMudW5zaGlmdCguLi5jdXJNZXRhcylcbiAgICAgIH1cbiAgICAgIG9uSm9pbihrZXksIGN1cnJlbnRQcmVzZW5jZSwgbmV3UHJlc2VuY2UpXG4gICAgfSlcbiAgICB0aGlzLm1hcChsZWF2ZXMsIChrZXksIGxlZnRQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIGlmKCFjdXJyZW50UHJlc2VuY2UpeyByZXR1cm4gfVxuICAgICAgbGV0IHJlZnNUb1JlbW92ZSA9IGxlZnRQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICBjdXJyZW50UHJlc2VuY2UubWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKHAgPT4ge1xuICAgICAgICByZXR1cm4gcmVmc1RvUmVtb3ZlLmluZGV4T2YocC5waHhfcmVmKSA8IDBcbiAgICAgIH0pXG4gICAgICBvbkxlYXZlKGtleSwgY3VycmVudFByZXNlbmNlLCBsZWZ0UHJlc2VuY2UpXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2UubWV0YXMubGVuZ3RoID09PSAwKXtcbiAgICAgICAgZGVsZXRlIHN0YXRlW2tleV1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHByZXNlbmNlcywgd2l0aCBzZWxlY3RlZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZXNlbmNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaG9vc2VyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBsaXN0KHByZXNlbmNlcywgY2hvb3Nlcil7XG4gICAgaWYoIWNob29zZXIpeyBjaG9vc2VyID0gZnVuY3Rpb24gKGtleSwgcHJlcyl7IHJldHVybiBwcmVzIH0gfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwKHByZXNlbmNlcywgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIHJldHVybiBjaG9vc2VyKGtleSwgcHJlc2VuY2UpXG4gICAgfSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBzdGF0aWMgbWFwKG9iaiwgZnVuYyl7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKGtleSA9PiBmdW5jKGtleSwgb2JqW2tleV0pKVxuICB9XG5cbiAgc3RhdGljIGNsb25lKG9iail7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cbn1cbiIsICIvKiBUaGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgbWVzc2FnZXMgKi9cbmltcG9ydCB7XG4gIENIQU5ORUxfRVZFTlRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgSEVBREVSX0xFTkdUSDogMSxcbiAgTUVUQV9MRU5HVEg6IDQsXG4gIEtJTkRTOiB7cHVzaDogMCwgcmVwbHk6IDEsIGJyb2FkY2FzdDogMn0sXG5cbiAgZW5jb2RlKG1zZywgY2FsbGJhY2spe1xuICAgIGlmKG1zZy5wYXlsb2FkLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5iaW5hcnlFbmNvZGUobXNnKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBheWxvYWQgPSBbbXNnLmpvaW5fcmVmLCBtc2cucmVmLCBtc2cudG9waWMsIG1zZy5ldmVudCwgbXNnLnBheWxvYWRdXG4gICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgfVxuICB9LFxuXG4gIGRlY29kZShyYXdQYXlsb2FkLCBjYWxsYmFjayl7XG4gICAgaWYocmF3UGF5bG9hZC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpXG4gICAgICByZXR1cm4gY2FsbGJhY2soe2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZH0pXG4gICAgfVxuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICBiaW5hcnlFbmNvZGUobWVzc2FnZSl7XG4gICAgbGV0IHtqb2luX3JlZiwgcmVmLCBldmVudCwgdG9waWMsIHBheWxvYWR9ID0gbWVzc2FnZVxuICAgIGxldCBtZXRhTGVuZ3RoID0gdGhpcy5NRVRBX0xFTkdUSCArIGpvaW5fcmVmLmxlbmd0aCArIHJlZi5sZW5ndGggKyB0b3BpYy5sZW5ndGggKyBldmVudC5sZW5ndGhcbiAgICBsZXQgaGVhZGVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuSEVBREVSX0xFTkdUSCArIG1ldGFMZW5ndGgpXG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnB1c2gpIC8vIGtpbmRcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luX3JlZi5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZXZlbnQubGVuZ3RoKVxuICAgIEFycmF5LmZyb20oam9pbl9yZWYsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKHJlZiwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20odG9waWMsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKGV2ZW50LCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG5cbiAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIHBheWxvYWQuYnl0ZUxlbmd0aClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkocGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlclxuICB9LFxuXG4gIGJpbmFyeURlY29kZShidWZmZXIpe1xuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICBsZXQga2luZCA9IHZpZXcuZ2V0VWludDgoMClcbiAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSB0aGlzLktJTkRTLnB1c2g6IHJldHVybiB0aGlzLmRlY29kZVB1c2goYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgICAgY2FzZSB0aGlzLktJTkRTLnJlcGx5OiByZXR1cm4gdGhpcy5kZWNvZGVSZXBseShidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgICBjYXNlIHRoaXMuS0lORFMuYnJvYWRjYXN0OiByZXR1cm4gdGhpcy5kZWNvZGVCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgIH1cbiAgfSxcblxuICBkZWNvZGVQdXNoKGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMylcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSCAtIDEgLy8gcHVzaGVzIGhhdmUgbm8gcmVmXG4gICAgbGV0IGpvaW5SZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBqb2luUmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgam9pblJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9LFxuXG4gIGRlY29kZVJlcGx5KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCByZWZTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDMpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoNClcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSFxuICAgIGxldCBqb2luUmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgam9pblJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGpvaW5SZWZTaXplXG4gICAgbGV0IHJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICBsZXQgcGF5bG9hZCA9IHtzdGF0dXM6IGV2ZW50LCByZXNwb25zZTogZGF0YX1cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IHJlZiwgdG9waWM6IHRvcGljLCBldmVudDogQ0hBTk5FTF9FVkVOVFMucmVwbHksIHBheWxvYWQ6IHBheWxvYWR9XG4gIH0sXG5cbiAgZGVjb2RlQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyAyXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG5cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBudWxsLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgZ2xvYmFsLFxuICBwaHhXaW5kb3csXG4gIENIQU5ORUxfRVZFTlRTLFxuICBERUZBVUxUX1RJTUVPVVQsXG4gIERFRkFVTFRfVlNOLFxuICBTT0NLRVRfU1RBVEVTLFxuICBUUkFOU1BPUlRTLFxuICBXU19DTE9TRV9OT1JNQUwsXG4gIEFVVEhfVE9LRU5fUFJFRklYXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb3N1cmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcbmltcG9ydCBDaGFubmVsIGZyb20gXCIuL2NoYW5uZWxcIlxuaW1wb3J0IExvbmdQb2xsIGZyb20gXCIuL2xvbmdwb2xsXCJcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCIuL3NlcmlhbGl6ZXJcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuLyoqIEluaXRpYWxpemVzIHRoZSBTb2NrZXQgKlxuICpcbiAqIEZvciBJRTggc3VwcG9ydCB1c2UgYW4gRVM1LXNoaW0gKGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kUG9pbnQgLSBUaGUgc3RyaW5nIFdlYlNvY2tldCBlbmRwb2ludCwgaWUsIGBcIndzOi8vZXhhbXBsZS5jb20vc29ja2V0XCJgLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIndzczovL2V4YW1wbGUuY29tXCJgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiL3NvY2tldFwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy50cmFuc3BvcnRdIC0gVGhlIFdlYnNvY2tldCBUcmFuc3BvcnQsIGZvciBleGFtcGxlIFdlYlNvY2tldCBvciBQaG9lbml4LkxvbmdQb2xsLlxuICpcbiAqIERlZmF1bHRzIHRvIFdlYlNvY2tldCB3aXRoIGF1dG9tYXRpYyBMb25nUG9sbCBmYWxsYmFjayBpZiBXZWJTb2NrZXQgaXMgbm90IGRlZmluZWQuXG4gKiBUbyBmYWxsYmFjayB0byBMb25nUG9sbCB3aGVuIFdlYlNvY2tldCBhdHRlbXB0cyBmYWlsLCB1c2UgYGxvbmdQb2xsRmFsbGJhY2tNczogMjUwMGAuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc10gLSBUaGUgbWlsbGlzZWNvbmQgdGltZSB0byBhdHRlbXB0IHRoZSBwcmltYXJ5IHRyYW5zcG9ydFxuICogYmVmb3JlIGZhbGxpbmcgYmFjayB0byB0aGUgTG9uZ1BvbGwgdHJhbnNwb3J0LiBEaXNhYmxlZCBieSBkZWZhdWx0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZGVidWddIC0gV2hlbiB0cnVlLCBlbmFibGVzIGRlYnVnIGxvZ2dpbmcuIERlZmF1bHQgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMuZW5jb2RlXSAtIFRoZSBmdW5jdGlvbiB0byBlbmNvZGUgb3V0Z29pbmcgbWVzc2FnZXMuXG4gKlxuICogRGVmYXVsdHMgdG8gSlNPTiBlbmNvZGVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmRlY29kZV0gLSBUaGUgZnVuY3Rpb24gdG8gZGVjb2RlIGluY29taW5nIG1lc3NhZ2VzLlxuICpcbiAqIERlZmF1bHRzIHRvIEpTT046XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogKHBheWxvYWQsIGNhbGxiYWNrKSA9PiBjYWxsYmFjayhKU09OLnBhcnNlKHBheWxvYWQpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnRpbWVvdXRdIC0gVGhlIGRlZmF1bHQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gdHJpZ2dlciBwdXNoIHRpbWVvdXRzLlxuICpcbiAqIERlZmF1bHRzIGBERUZBVUxUX1RJTUVPVVRgXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuaGVhcnRiZWF0SW50ZXJ2YWxNc10gLSBUaGUgbWlsbGlzZWMgaW50ZXJ2YWwgdG8gc2VuZCBhIGhlYXJ0YmVhdCBtZXNzYWdlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWNvbm5lY3RBZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlXG4gKiBzb2NrZXQgcmVjb25uZWN0IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuXG4gKlxuICogRGVmYXVsdHMgdG8gc3RlcHBlZCBiYWNrb2ZmIG9mOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWpvaW5BZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxpc2VjXG4gKiByZWpvaW4gaW50ZXJ2YWwgZm9yIGluZGl2aWR1YWwgY2hhbm5lbHMuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5sb2dnZXJdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLCBpZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbihraW5kLCBtc2csIGRhdGEpIHtcbiAqICAgY29uc29sZS5sb2coYCR7a2luZH06ICR7bXNnfWAsIGRhdGEpXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMubG9uZ3BvbGxlclRpbWVvdXRdIC0gVGhlIG1heGltdW0gdGltZW91dCBvZiBhIGxvbmcgcG9sbCBBSkFYIHJlcXVlc3QuXG4gKlxuICogRGVmYXVsdHMgdG8gMjBzIChkb3VibGUgdGhlIHNlcnZlciBsb25nIHBvbGwgdGltZXIpLlxuICpcbiAqIEBwYXJhbSB7KE9iamVjdHxmdW5jdGlvbil9IFtvcHRzLnBhcmFtc10gLSBUaGUgb3B0aW9uYWwgcGFyYW1zIHRvIHBhc3Mgd2hlbiBjb25uZWN0aW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYXV0aFRva2VuXSAtIHRoZSBvcHRpb25hbCBhdXRoZW50aWNhdGlvbiB0b2tlbiB0byBiZSBleHBvc2VkIG9uIHRoZSBzZXJ2ZXJcbiAqIHVuZGVyIHRoZSBgOmF1dGhfdG9rZW5gIGNvbm5lY3RfaW5mbyBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmluYXJ5VHlwZV0gLSBUaGUgYmluYXJ5IHR5cGUgdG8gdXNlIGZvciBiaW5hcnkgV2ViU29ja2V0IGZyYW1lcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBcImFycmF5YnVmZmVyXCJcbiAqXG4gKiBAcGFyYW0ge3Zzbn0gW29wdHMudnNuXSAtIFRoZSBzZXJpYWxpemVyJ3MgcHJvdG9jb2wgdmVyc2lvbiB0byBzZW5kIG9uIGNvbm5lY3QuXG4gKlxuICogRGVmYXVsdHMgdG8gREVGQVVMVF9WU04uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLnNlc3Npb25TdG9yYWdlXSAtIEFuIG9wdGlvbmFsIFN0b3JhZ2UgY29tcGF0aWJsZSBvYmplY3RcbiAqIFBob2VuaXggdXNlcyBzZXNzaW9uU3RvcmFnZSBmb3IgbG9uZ3BvbGwgZmFsbGJhY2sgaGlzdG9yeS4gT3ZlcnJpZGluZyB0aGUgc3RvcmUgaXNcbiAqIHVzZWZ1bCB3aGVuIFBob2VuaXggd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gYHNlc3Npb25TdG9yYWdlYC4gRm9yIGV4YW1wbGUsIFRoaXMgY291bGRcbiAqIGhhcHBlbiBpZiBhIHNpdGUgbG9hZHMgYSBjcm9zcy1kb21haW4gY2hhbm5lbCBpbiBhbiBpZnJhbWUuIEV4YW1wbGUgdXNhZ2U6XG4gKlxuICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gKiAgICAgICBjb25zdHJ1Y3RvcigpIHsgdGhpcy5zdG9yYWdlID0ge30gfVxuICogICAgICAgZ2V0SXRlbShrZXlOYW1lKSB7IHJldHVybiB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gfHwgbnVsbCB9XG4gKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gKiAgICAgICBzZXRJdGVtKGtleU5hbWUsIGtleVZhbHVlKSB7IHRoaXMuc3RvcmFnZVtrZXlOYW1lXSA9IGtleVZhbHVlIH1cbiAqICAgICB9XG4gKlxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBvcHRzID0ge30pe1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MgPSB7b3BlbjogW10sIGNsb3NlOiBbXSwgZXJyb3I6IFtdLCBtZXNzYWdlOiBbXX1cbiAgICB0aGlzLmNoYW5uZWxzID0gW11cbiAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIHRoaXMucmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IG9wdHMudGltZW91dCB8fCBERUZBVUxUX1RJTUVPVVRcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG9wdHMudHJhbnNwb3J0IHx8IGdsb2JhbC5XZWJTb2NrZXQgfHwgTG9uZ1BvbGxcbiAgICB0aGlzLnByaW1hcnlQYXNzZWRIZWFsdGhDaGVjayA9IGZhbHNlXG4gICAgdGhpcy5sb25nUG9sbEZhbGxiYWNrTXMgPSBvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc1xuICAgIHRoaXMuZmFsbGJhY2tUaW1lciA9IG51bGxcbiAgICB0aGlzLnNlc3Npb25TdG9yZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgKGdsb2JhbCAmJiBnbG9iYWwuc2Vzc2lvblN0b3JhZ2UpXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zID0gMFxuICAgIHRoaXMuZGVmYXVsdEVuY29kZXIgPSBTZXJpYWxpemVyLmVuY29kZS5iaW5kKFNlcmlhbGl6ZXIpXG4gICAgdGhpcy5kZWZhdWx0RGVjb2RlciA9IFNlcmlhbGl6ZXIuZGVjb2RlLmJpbmQoU2VyaWFsaXplcilcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5iaW5hcnlUeXBlID0gb3B0cy5iaW5hcnlUeXBlIHx8IFwiYXJyYXlidWZmZXJcIlxuICAgIHRoaXMuY29ubmVjdENsb2NrID0gMVxuICAgIGlmKHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmVuY29kZSA9IG9wdHMuZW5jb2RlIHx8IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gb3B0cy5kZWNvZGUgfHwgdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuY29kZSA9IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH1cbiAgICBsZXQgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICBpZihwaHhXaW5kb3cgJiYgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIpe1xuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5kaXNjb25uZWN0KClcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gdGhpcy5jb25uZWN0Q2xvY2tcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHBoeFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIiwgX2UgPT4ge1xuICAgICAgICBpZihhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID09PSB0aGlzLmNvbm5lY3RDbG9jayl7XG4gICAgICAgICAgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICAgICAgICB0aGlzLmNvbm5lY3QoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMgPSBvcHRzLmhlYXJ0YmVhdEludGVydmFsTXMgfHwgMzAwMDBcbiAgICB0aGlzLnJlam9pbkFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVqb2luQWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlam9pbkFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RBZnRlck1zID0gKHRyaWVzKSA9PiB7XG4gICAgICBpZihvcHRzLnJlY29ubmVjdEFmdGVyTXMpe1xuICAgICAgICByZXR1cm4gb3B0cy5yZWNvbm5lY3RBZnRlck1zKHRyaWVzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlciB8fCBudWxsXG4gICAgaWYoIXRoaXMubG9nZ2VyICYmIG9wdHMuZGVidWcpe1xuICAgICAgdGhpcy5sb2dnZXIgPSAoa2luZCwgbXNnLCBkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGAke2tpbmR9OiAke21zZ31gLCBkYXRhKSB9XG4gICAgfVxuICAgIHRoaXMubG9uZ3BvbGxlclRpbWVvdXQgPSBvcHRzLmxvbmdwb2xsZXJUaW1lb3V0IHx8IDIwMDAwXG4gICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKG9wdHMucGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuZW5kUG9pbnQgPSBgJHtlbmRQb2ludH0vJHtUUkFOU1BPUlRTLndlYnNvY2tldH1gXG4gICAgdGhpcy52c24gPSBvcHRzLnZzbiB8fCBERUZBVUxUX1ZTTlxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gbnVsbFxuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLmNvbm5lY3QoKSlcbiAgICB9LCB0aGlzLnJlY29ubmVjdEFmdGVyTXMpXG4gICAgdGhpcy5hdXRoVG9rZW4gPSBvcHRzLmF1dGhUb2tlblxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIExvbmdQb2xsIHRyYW5zcG9ydCByZWZlcmVuY2VcbiAgICovXG4gIGdldExvbmdQb2xsVHJhbnNwb3J0KCl7IHJldHVybiBMb25nUG9sbCB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGFuZCByZXBsYWNlcyB0aGUgYWN0aXZlIHRyYW5zcG9ydFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXdUcmFuc3BvcnQgLSBUaGUgbmV3IHRyYW5zcG9ydCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgKlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydChuZXdUcmFuc3BvcnQpe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSB0cnVlXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgdGhpcy5jb25uLmNsb3NlKClcbiAgICAgIHRoaXMuY29ubiA9IG51bGxcbiAgICB9XG4gICAgdGhpcy50cmFuc3BvcnQgPSBuZXdUcmFuc3BvcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb2NrZXQgcHJvdG9jb2xcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHByb3RvY29sKCl7IHJldHVybiBsb2NhdGlvbi5wcm90b2NvbC5tYXRjaCgvXmh0dHBzLykgPyBcIndzc1wiIDogXCJ3c1wiIH1cblxuICAvKipcbiAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBzb2NrZXQgdXJsXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlbmRQb2ludFVSTCgpe1xuICAgIGxldCB1cmkgPSBBamF4LmFwcGVuZFBhcmFtcyhcbiAgICAgIEFqYXguYXBwZW5kUGFyYW1zKHRoaXMuZW5kUG9pbnQsIHRoaXMucGFyYW1zKCkpLCB7dnNuOiB0aGlzLnZzbn0pXG4gICAgaWYodXJpLmNoYXJBdCgwKSAhPT0gXCIvXCIpeyByZXR1cm4gdXJpIH1cbiAgICBpZih1cmkuY2hhckF0KDEpID09PSBcIi9cIil7IHJldHVybiBgJHt0aGlzLnByb3RvY29sKCl9OiR7dXJpfWAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMucHJvdG9jb2woKX06Ly8ke2xvY2F0aW9uLmhvc3R9JHt1cml9YFxuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXRcbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DbG9zZUV2ZW50I1N0YXR1c19jb2RlcyBmb3IgdmFsaWQgc3RhdHVzIGNvZGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIE9wdGlvbmFsIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBzb2NrZXQgaXMgZGlzY29ubmVjdGVkLlxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IGNvZGUgLSBBIHN0YXR1cyBjb2RlIGZvciBkaXNjb25uZWN0aW9uIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBBIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiB0byBkaXNjb25uZWN0LiAoT3B0aW9uYWwpXG4gICAqL1xuICBkaXNjb25uZWN0KGNhbGxiYWNrLCBjb2RlLCByZWFzb24pe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSB0cnVlXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gdHJ1ZVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy50ZWFyZG93bigoKSA9PiB7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSBmYWxzZVxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH0sIGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtcyB0byBzZW5kIHdoZW4gY29ubmVjdGluZywgZm9yIGV4YW1wbGUgYHt1c2VyX2lkOiB1c2VyVG9rZW59YFxuICAgKlxuICAgKiBQYXNzaW5nIHBhcmFtcyB0byBjb25uZWN0IGlzIGRlcHJlY2F0ZWQ7IHBhc3MgdGhlbSBpbiB0aGUgU29ja2V0IGNvbnN0cnVjdG9yIGluc3RlYWQ6XG4gICAqIGBuZXcgU29ja2V0KFwiL3NvY2tldFwiLCB7cGFyYW1zOiB7dXNlcl9pZDogdXNlclRva2VufX0pYC5cbiAgICovXG4gIGNvbm5lY3QocGFyYW1zKXtcbiAgICBpZihwYXJhbXMpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKVxuICAgICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKHBhcmFtcylcbiAgICB9XG4gICAgaWYodGhpcy5jb25uICYmICF0aGlzLmRpc2Nvbm5lY3RpbmcpeyByZXR1cm4gfVxuICAgIGlmKHRoaXMubG9uZ1BvbGxGYWxsYmFja01zICYmIHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmNvbm5lY3RXaXRoRmFsbGJhY2soTG9uZ1BvbGwsIHRoaXMubG9uZ1BvbGxGYWxsYmFja01zKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYW5zcG9ydENvbm5lY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSBtZXNzYWdlLiBPdmVycmlkZSBgdGhpcy5sb2dnZXJgIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLiBub29wcyBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtc2dcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIGxvZyhraW5kLCBtc2csIGRhdGEpeyB0aGlzLmxvZ2dlciAmJiB0aGlzLmxvZ2dlcihraW5kLCBtc2csIGRhdGEpIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgbG9nZ2VyIGhhcyBiZWVuIHNldCBvbiB0aGlzIHNvY2tldC5cbiAgICovXG4gIGhhc0xvZ2dlcigpeyByZXR1cm4gdGhpcy5sb2dnZXIgIT09IG51bGwgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIG9wZW4gZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbk9wZW4oZnVuY3Rpb24oKXsgY29uc29sZS5pbmZvKFwidGhlIHNvY2tldCB3YXMgb3BlbmVkXCIpIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbk9wZW4oY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBjbG9zZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uQ2xvc2UoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuY2xvc2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gZXJyb3IgZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbkVycm9yKGZ1bmN0aW9uKGVycm9yKXsgYWxlcnQoXCJBbiBlcnJvciBvY2N1cnJlZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25FcnJvcihjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBtZXNzYWdlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25NZXNzYWdlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFBpbmdzIHRoZSBzZXJ2ZXIgYW5kIGludm9rZXMgdGhlIGNhbGxiYWNrIHdpdGggdGhlIFJUVCBpbiBtaWxsaXNlY29uZHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwaW5nIHdhcyBwdXNoZWQgb3IgZmFsc2UgaWYgdW5hYmxlIHRvIGJlIHB1c2hlZC5cbiAgICovXG4gIHBpbmcoY2FsbGJhY2spe1xuICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gZmFsc2UgfVxuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiByZWZ9KVxuICAgIGxldCBvbk1zZ1JlZiA9IHRoaXMub25NZXNzYWdlKG1zZyA9PiB7XG4gICAgICBpZihtc2cucmVmID09PSByZWYpe1xuICAgICAgICB0aGlzLm9mZihbb25Nc2dSZWZdKVxuICAgICAgICBjYWxsYmFjayhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICB0cmFuc3BvcnRDb25uZWN0KCl7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgbGV0IHByb3RvY29scyA9IHVuZGVmaW5lZFxuICAgIC8vIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgYmFzZWQgdG9rZW5cbiAgICAvLyAobG9uZ3BvbGwgdXNlcyBBdXRob3JpemF0aW9uIGhlYWRlciBpbnN0ZWFkKVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIHByb3RvY29scyA9IFtcInBob2VuaXhcIiwgYCR7QVVUSF9UT0tFTl9QUkVGSVh9JHtidG9hKHRoaXMuYXV0aFRva2VuKS5yZXBsYWNlKC89L2csIFwiXCIpfWBdXG4gICAgfVxuICAgIHRoaXMuY29ubiA9IG5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCksIHByb3RvY29scylcbiAgICB0aGlzLmNvbm4uYmluYXJ5VHlwZSA9IHRoaXMuYmluYXJ5VHlwZVxuICAgIHRoaXMuY29ubi50aW1lb3V0ID0gdGhpcy5sb25ncG9sbGVyVGltZW91dFxuICAgIHRoaXMuY29ubi5vbm9wZW4gPSAoKSA9PiB0aGlzLm9uQ29ubk9wZW4oKVxuICAgIHRoaXMuY29ubi5vbmVycm9yID0gZXJyb3IgPT4gdGhpcy5vbkNvbm5FcnJvcihlcnJvcilcbiAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5NZXNzYWdlKGV2ZW50KVxuICAgIHRoaXMuY29ubi5vbmNsb3NlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5DbG9zZShldmVudClcbiAgfVxuXG4gIGdldFNlc3Npb24oa2V5KXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JlICYmIHRoaXMuc2Vzc2lvblN0b3JlLmdldEl0ZW0oa2V5KSB9XG5cbiAgc3RvcmVTZXNzaW9uKGtleSwgdmFsKXsgdGhpcy5zZXNzaW9uU3RvcmUgJiYgdGhpcy5zZXNzaW9uU3RvcmUuc2V0SXRlbShrZXksIHZhbCkgfVxuXG4gIGNvbm5lY3RXaXRoRmFsbGJhY2soZmFsbGJhY2tUcmFuc3BvcnQsIGZhbGxiYWNrVGhyZXNob2xkID0gMjUwMCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICBsZXQgZXN0YWJsaXNoZWQgPSBmYWxzZVxuICAgIGxldCBwcmltYXJ5VHJhbnNwb3J0ID0gdHJ1ZVxuICAgIGxldCBvcGVuUmVmLCBlcnJvclJlZlxuICAgIGxldCBmYWxsYmFjayA9IChyZWFzb24pID0+IHtcbiAgICAgIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBmYWxsaW5nIGJhY2sgdG8gJHtmYWxsYmFja1RyYW5zcG9ydC5uYW1lfS4uLmAsIHJlYXNvbilcbiAgICAgIHRoaXMub2ZmKFtvcGVuUmVmLCBlcnJvclJlZl0pXG4gICAgICBwcmltYXJ5VHJhbnNwb3J0ID0gZmFsc2VcbiAgICAgIHRoaXMucmVwbGFjZVRyYW5zcG9ydChmYWxsYmFja1RyYW5zcG9ydClcbiAgICAgIHRoaXMudHJhbnNwb3J0Q29ubmVjdCgpXG4gICAgfVxuICAgIGlmKHRoaXMuZ2V0U2Vzc2lvbihgcGh4OmZhbGxiYWNrOiR7ZmFsbGJhY2tUcmFuc3BvcnQubmFtZX1gKSl7IHJldHVybiBmYWxsYmFjayhcIm1lbW9yaXplZFwiKSB9XG5cbiAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcblxuICAgIGVycm9yUmVmID0gdGhpcy5vbkVycm9yKHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImVycm9yXCIsIHJlYXNvbilcbiAgICAgIGlmKHByaW1hcnlUcmFuc3BvcnQgJiYgIWVzdGFibGlzaGVkKXtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICAgICAgZmFsbGJhY2socmVhc29uKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5vbk9wZW4oKCkgPT4ge1xuICAgICAgZXN0YWJsaXNoZWQgPSB0cnVlXG4gICAgICBpZighcHJpbWFyeVRyYW5zcG9ydCl7XG4gICAgICAgIC8vIG9ubHkgbWVtb3JpemUgTFAgaWYgd2UgbmV2ZXIgY29ubmVjdGVkIHRvIHByaW1hcnlcbiAgICAgICAgaWYoIXRoaXMucHJpbWFyeVBhc3NlZEhlYWx0aENoZWNrKXsgdGhpcy5zdG9yZVNlc3Npb24oYHBoeDpmYWxsYmFjazoke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9YCwgXCJ0cnVlXCIpIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBlc3RhYmxpc2hlZCAke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9IGZhbGxiYWNrYClcbiAgICAgIH1cbiAgICAgIC8vIGlmIHdlJ3ZlIGVzdGFibGlzaGVkIHByaW1hcnksIGdpdmUgdGhlIGZhbGxiYWNrIGEgbmV3IHBlcmlvZCB0byBhdHRlbXB0IHBpbmdcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcbiAgICAgIHRoaXMucGluZyhydHQgPT4ge1xuICAgICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNvbm5lY3RlZCB0byBwcmltYXJ5IGFmdGVyXCIsIHJ0dClcbiAgICAgICAgdGhpcy5wcmltYXJ5UGFzc2VkSGVhbHRoQ2hlY2sgPSB0cnVlXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy50cmFuc3BvcnRDb25uZWN0KClcbiAgfVxuXG4gIGNsZWFySGVhcnRiZWF0cygpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVyKVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVvdXRUaW1lcilcbiAgfVxuXG4gIG9uQ29ubk9wZW4oKXtcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBgJHt0aGlzLnRyYW5zcG9ydC5uYW1lfSBjb25uZWN0ZWQgdG8gJHt0aGlzLmVuZFBvaW50VVJMKCl9YClcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zKytcbiAgICB0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy5yZXNldEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4gY2FsbGJhY2soKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBoZWFydGJlYXRUaW1lb3V0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKXtcbiAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpeyB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImhlYXJ0YmVhdCB0aW1lb3V0LiBBdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uXCIpIH1cbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLnJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpLCBXU19DTE9TRV9OT1JNQUwsIFwiaGVhcnRiZWF0IHRpbWVvdXRcIilcbiAgICB9XG4gIH1cblxuICByZXNldEhlYXJ0YmVhdCgpe1xuICAgIGlmKHRoaXMuY29ubiAmJiB0aGlzLmNvbm4uc2tpcEhlYXJ0YmVhdCl7IHJldHVybiB9XG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMuY2xlYXJIZWFydGJlYXRzKClcbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbmRIZWFydGJlYXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgdGVhcmRvd24oY2FsbGJhY2ssIGNvZGUsIHJlYXNvbil7XG4gICAgaWYoIXRoaXMuY29ubil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH1cbiAgICBsZXQgY29ubmVjdENsb2NrID0gdGhpcy5jb25uZWN0Q2xvY2tcblxuICAgIHRoaXMud2FpdEZvckJ1ZmZlckRvbmUoKCkgPT4ge1xuICAgICAgaWYoY29ubmVjdENsb2NrICE9PSB0aGlzLmNvbm5lY3RDbG9jayl7IHJldHVybiB9XG4gICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICBpZihjb2RlKXsgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiB8fCBcIlwiKSB9IGVsc2UgeyB0aGlzLmNvbm4uY2xvc2UoKSB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZCgoKSA9PiB7XG4gICAgICAgIGlmKGNvbm5lY3RDbG9jayAhPT0gdGhpcy5jb25uZWN0Q2xvY2speyByZXR1cm4gfVxuICAgICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICAgIHRoaXMuY29ubi5vbm9wZW4gPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9uZXJyb3IgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4ub25jbG9zZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4gPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB3YWl0Rm9yQnVmZmVyRG9uZShjYWxsYmFjaywgdHJpZXMgPSAxKXtcbiAgICBpZih0cmllcyA9PT0gNSB8fCAhdGhpcy5jb25uIHx8ICF0aGlzLmNvbm4uYnVmZmVyZWRBbW91bnQpe1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhaXRGb3JCdWZmZXJEb25lKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICB3YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyA9IDEpe1xuICAgIGlmKHRyaWVzID09PSA1IHx8ICF0aGlzLmNvbm4gfHwgdGhpcy5jb25uLnJlYWR5U3RhdGUgPT09IFNPQ0tFVF9TVEFURVMuY2xvc2VkKXtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICBvbkNvbm5DbG9zZShldmVudCl7XG4gICAgbGV0IGNsb3NlQ29kZSA9IGV2ZW50ICYmIGV2ZW50LmNvZGVcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNsb3NlXCIsIGV2ZW50KVxuICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgdGhpcy5jbGVhckhlYXJ0YmVhdHMoKVxuICAgIGlmKCF0aGlzLmNsb3NlV2FzQ2xlYW4gJiYgY2xvc2VDb2RlICE9PSAxMDAwKXtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KClcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IGNhbGxiYWNrKGV2ZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Db25uRXJyb3IoZXJyb3Ipe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGVycm9yKVxuICAgIGxldCB0cmFuc3BvcnRCZWZvcmUgPSB0aGlzLnRyYW5zcG9ydFxuICAgIGxldCBlc3RhYmxpc2hlZEJlZm9yZSA9IHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9uc1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IuZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgdHJhbnNwb3J0QmVmb3JlLCBlc3RhYmxpc2hlZEJlZm9yZSlcbiAgICB9KVxuICAgIGlmKHRyYW5zcG9ydEJlZm9yZSA9PT0gdGhpcy50cmFuc3BvcnQgfHwgZXN0YWJsaXNoZWRCZWZvcmUgPiAwKXtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyQ2hhbkVycm9yKCl7XG4gICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgaWYoIShjaGFubmVsLmlzRXJyb3JlZCgpIHx8IGNoYW5uZWwuaXNMZWF2aW5nKCkgfHwgY2hhbm5lbC5pc0Nsb3NlZCgpKSl7XG4gICAgICAgIGNoYW5uZWwudHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5lcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjb25uZWN0aW9uU3RhdGUoKXtcbiAgICBzd2l0Y2godGhpcy5jb25uICYmIHRoaXMuY29ubi5yZWFkeVN0YXRlKXtcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nOiByZXR1cm4gXCJjb25uZWN0aW5nXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5vcGVuOiByZXR1cm4gXCJvcGVuXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jbG9zaW5nOiByZXR1cm4gXCJjbG9zaW5nXCJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBcImNsb3NlZFwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IFwib3BlblwiIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICpcbiAgICogQHBhcmFtIHtDaGFubmVsfVxuICAgKi9cbiAgcmVtb3ZlKGNoYW5uZWwpe1xuICAgIHRoaXMub2ZmKGNoYW5uZWwuc3RhdGVDaGFuZ2VSZWZzKVxuICAgIHRoaXMuY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcihjID0+IGMgIT09IGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3JlZnN9IC0gbGlzdCBvZiByZWZzIHJldHVybmVkIGJ5IGNhbGxzIHRvXG4gICAqICAgICAgICAgICAgICAgICBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYFxuICAgKi9cbiAgb2ZmKHJlZnMpe1xuICAgIGZvcihsZXQga2V5IGluIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mpe1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldLmZpbHRlcigoW3JlZl0pID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZnMuaW5kZXhPZihyZWYpID09PSAtMVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIGEgbmV3IGNoYW5uZWwgZm9yIHRoZSBnaXZlbiB0b3BpY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNoYW5QYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7Q2hhbm5lbH1cbiAgICovXG4gIGNoYW5uZWwodG9waWMsIGNoYW5QYXJhbXMgPSB7fSl7XG4gICAgbGV0IGNoYW4gPSBuZXcgQ2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcywgdGhpcylcbiAgICB0aGlzLmNoYW5uZWxzLnB1c2goY2hhbilcbiAgICByZXR1cm4gY2hhblxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqL1xuICBwdXNoKGRhdGEpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpe1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gZGF0YVxuICAgICAgdGhpcy5sb2coXCJwdXNoXCIsIGAke3RvcGljfSAke2V2ZW50fSAoJHtqb2luX3JlZn0sICR7cmVmfSlgLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kQnVmZmVyLnB1c2goKCkgPT4gdGhpcy5lbmNvZGUoZGF0YSwgcmVzdWx0ID0+IHRoaXMuY29ubi5zZW5kKHJlc3VsdCkpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgbWVzc2FnZSByZWYsIGFjY291bnRpbmcgZm9yIG92ZXJmbG93c1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgbWFrZVJlZigpe1xuICAgIGxldCBuZXdSZWYgPSB0aGlzLnJlZiArIDFcbiAgICBpZihuZXdSZWYgPT09IHRoaXMucmVmKXsgdGhpcy5yZWYgPSAwIH0gZWxzZSB7IHRoaXMucmVmID0gbmV3UmVmIH1cblxuICAgIHJldHVybiB0aGlzLnJlZi50b1N0cmluZygpXG4gIH1cblxuICBzZW5kSGVhcnRiZWF0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmICYmICF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWZ9KVxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmhlYXJ0YmVhdFRpbWVvdXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgZmx1c2hTZW5kQnVmZmVyKCl7XG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VuZEJ1ZmZlci5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpXG4gICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSl7XG4gICAgdGhpcy5kZWNvZGUocmF3TWVzc2FnZS5kYXRhLCBtc2cgPT4ge1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gbXNnXG4gICAgICBpZihyZWYgJiYgcmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpe1xuICAgICAgICB0aGlzLmNsZWFySGVhcnRiZWF0cygpXG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZW5kSGVhcnRiZWF0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcylcbiAgICAgIH1cblxuICAgICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJyZWNlaXZlXCIsIGAke3BheWxvYWQuc3RhdHVzIHx8IFwiXCJ9ICR7dG9waWN9ICR7ZXZlbnR9ICR7cmVmICYmIFwiKFwiICsgcmVmICsgXCIpXCIgfHwgXCJcIn1gLCBwYXlsb2FkKVxuXG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFubmVscy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzW2ldXG4gICAgICAgIGlmKCFjaGFubmVsLmlzTWVtYmVyKHRvcGljLCBldmVudCwgcGF5bG9hZCwgam9pbl9yZWYpKXsgY29udGludWUgfVxuICAgICAgICBjaGFubmVsLnRyaWdnZXIoZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWYpXG4gICAgICB9XG5cbiAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UubGVuZ3RoOyBpKyspe1xuICAgICAgICBsZXQgWywgY2FsbGJhY2tdID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlW2ldXG4gICAgICAgIGNhbGxiYWNrKG1zZylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbGVhdmVPcGVuVG9waWModG9waWMpe1xuICAgIGxldCBkdXBDaGFubmVsID0gdGhpcy5jaGFubmVscy5maW5kKGMgPT4gYy50b3BpYyA9PT0gdG9waWMgJiYgKGMuaXNKb2luZWQoKSB8fCBjLmlzSm9pbmluZygpKSlcbiAgICBpZihkdXBDaGFubmVsKXtcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBsZWF2aW5nIGR1cGxpY2F0ZSB0b3BpYyBcIiR7dG9waWN9XCJgKVxuICAgICAgZHVwQ2hhbm5lbC5sZWF2ZSgpXG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IENPTlNFQ1VUSVZFX1JFTE9BRFMgPSBcImNvbnNlY3V0aXZlLXJlbG9hZHNcIjtcbmV4cG9ydCBjb25zdCBNQVhfUkVMT0FEUyA9IDEwO1xuZXhwb3J0IGNvbnN0IFJFTE9BRF9KSVRURVJfTUlOID0gNTAwMDtcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSX01BWCA9IDEwMDAwO1xuZXhwb3J0IGNvbnN0IEZBSUxTQUZFX0pJVFRFUiA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IFBIWF9FVkVOVF9DTEFTU0VTID0gW1xuICBcInBoeC1jbGljay1sb2FkaW5nXCIsXG4gIFwicGh4LWNoYW5nZS1sb2FkaW5nXCIsXG4gIFwicGh4LXN1Ym1pdC1sb2FkaW5nXCIsXG4gIFwicGh4LWtleWRvd24tbG9hZGluZ1wiLFxuICBcInBoeC1rZXl1cC1sb2FkaW5nXCIsXG4gIFwicGh4LWJsdXItbG9hZGluZ1wiLFxuICBcInBoeC1mb2N1cy1sb2FkaW5nXCIsXG4gIFwicGh4LWhvb2stbG9hZGluZ1wiLFxuXTtcbmV4cG9ydCBjb25zdCBQSFhfQ09NUE9ORU5UID0gXCJkYXRhLXBoeC1jb21wb25lbnRcIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19SRUYgPSBcImRhdGEtcGh4LXZpZXdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9MSU5LID0gXCJkYXRhLXBoeC1saW5rXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSQUNLX1NUQVRJQyA9IFwidHJhY2stc3RhdGljXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJTktfU1RBVEUgPSBcImRhdGEtcGh4LWxpbmstc3RhdGVcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQURJTkcgPSBcImRhdGEtcGh4LXJlZi1sb2FkaW5nXCI7XG5leHBvcnQgY29uc3QgUEhYX1JFRl9TUkMgPSBcImRhdGEtcGh4LXJlZi1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQ0sgPSBcImRhdGEtcGh4LXJlZi1sb2NrXCI7XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfUkVGUyA9IFwicGh4LXBlbmRpbmctcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9UUkFDS19VUExPQURTID0gXCJ0cmFjay11cGxvYWRzXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQTE9BRF9SRUYgPSBcImRhdGEtcGh4LXVwbG9hZC1yZWZcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJFRkxJR0hURURfUkVGUyA9IFwiZGF0YS1waHgtcHJlZmxpZ2h0ZWQtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ET05FX1JFRlMgPSBcImRhdGEtcGh4LWRvbmUtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9EUk9QX1RBUkdFVCA9IFwiZHJvcC10YXJnZXRcIjtcbmV4cG9ydCBjb25zdCBQSFhfQUNUSVZFX0VOVFJZX1JFRlMgPSBcImRhdGEtcGh4LWFjdGl2ZS1yZWZzXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJVkVfRklMRV9VUERBVEVEID0gXCJwaHg6bGl2ZS1maWxlOnVwZGF0ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfU0tJUCA9IFwiZGF0YS1waHgtc2tpcFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9NQUdJQ19JRCA9IFwiZGF0YS1waHgtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJVTkUgPSBcImRhdGEtcGh4LXBydW5lXCI7XG5leHBvcnQgY29uc3QgUEhYX0NPTk5FQ1RFRF9DTEFTUyA9IFwicGh4LWNvbm5lY3RlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MT0FESU5HX0NMQVNTID0gXCJwaHgtbG9hZGluZ1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9FUlJPUl9DTEFTUyA9IFwicGh4LWVycm9yXCI7XG5leHBvcnQgY29uc3QgUEhYX0NMSUVOVF9FUlJPUl9DTEFTUyA9IFwicGh4LWNsaWVudC1lcnJvclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9TRVJWRVJfRVJST1JfQ0xBU1MgPSBcInBoeC1zZXJ2ZXItZXJyb3JcIjtcbmV4cG9ydCBjb25zdCBQSFhfUEFSRU5UX0lEID0gXCJkYXRhLXBoeC1wYXJlbnQtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfTUFJTiA9IFwiZGF0YS1waHgtbWFpblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ST09UX0lEID0gXCJkYXRhLXBoeC1yb290LWlkXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX1RPUCA9IFwidmlld3BvcnQtdG9wXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX0JPVFRPTSA9IFwidmlld3BvcnQtYm90dG9tXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSSUdHRVJfQUNUSU9OID0gXCJ0cmlnZ2VyLWFjdGlvblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9IQVNfRk9DVVNFRCA9IFwicGh4LWhhcy1mb2N1c2VkXCI7XG5leHBvcnQgY29uc3QgRk9DVVNBQkxFX0lOUFVUUyA9IFtcbiAgXCJ0ZXh0XCIsXG4gIFwidGV4dGFyZWFcIixcbiAgXCJudW1iZXJcIixcbiAgXCJlbWFpbFwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwic2VhcmNoXCIsXG4gIFwidGVsXCIsXG4gIFwidXJsXCIsXG4gIFwiZGF0ZVwiLFxuICBcInRpbWVcIixcbiAgXCJkYXRldGltZS1sb2NhbFwiLFxuICBcImNvbG9yXCIsXG4gIFwicmFuZ2VcIixcbl07XG5leHBvcnQgY29uc3QgQ0hFQ0tBQkxFX0lOUFVUUyA9IFtcImNoZWNrYm94XCIsIFwicmFkaW9cIl07XG5leHBvcnQgY29uc3QgUEhYX0hBU19TVUJNSVRURUQgPSBcInBoeC1oYXMtc3VibWl0dGVkXCI7XG5leHBvcnQgY29uc3QgUEhYX1NFU1NJT04gPSBcImRhdGEtcGh4LXNlc3Npb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19TRUxFQ1RPUiA9IGBbJHtQSFhfU0VTU0lPTn1dYDtcbmV4cG9ydCBjb25zdCBQSFhfU1RJQ0tZID0gXCJkYXRhLXBoeC1zdGlja3lcIjtcbmV4cG9ydCBjb25zdCBQSFhfU1RBVElDID0gXCJkYXRhLXBoeC1zdGF0aWNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVBRE9OTFkgPSBcImRhdGEtcGh4LXJlYWRvbmx5XCI7XG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVEID0gXCJkYXRhLXBoeC1kaXNhYmxlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEggPSBcImRpc2FibGUtd2l0aFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSA9IFwiZGF0YS1waHgtZGlzYWJsZS13aXRoLXJlc3RvcmVcIjtcbmV4cG9ydCBjb25zdCBQSFhfSE9PSyA9IFwiaG9va1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ERUJPVU5DRSA9IFwiZGVib3VuY2VcIjtcbmV4cG9ydCBjb25zdCBQSFhfVEhST1RUTEUgPSBcInRocm90dGxlXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQREFURSA9IFwidXBkYXRlXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTSA9IFwic3RyZWFtXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTV9SRUYgPSBcImRhdGEtcGh4LXN0cmVhbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9QT1JUQUwgPSBcImRhdGEtcGh4LXBvcnRhbFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1JFRiA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1NSQyA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZC1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUlVOVElNRV9IT09LID0gXCJkYXRhLXBoeC1ydW50aW1lLWhvb2tcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfUElEID0gXCJkYXRhLXBoeC1waWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfS0VZID0gXCJrZXlcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJJVkFURSA9IFwicGh4UHJpdmF0ZVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9BVVRPX1JFQ09WRVIgPSBcImF1dG8tcmVjb3ZlclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ERUJVRyA9IFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCI7XG5leHBvcnQgY29uc3QgUEhYX0xWX1BST0ZJTEUgPSBcInBoeDpsaXZlLXNvY2tldDpwcm9maWxpbmdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfTEFURU5DWV9TSU0gPSBcInBoeDpsaXZlLXNvY2tldDpsYXRlbmN5LXNpbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OID0gXCJwaHg6bmF2LWhpc3RvcnktcG9zaXRpb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJPR1JFU1MgPSBcInByb2dyZXNzXCI7XG5leHBvcnQgY29uc3QgUEhYX01PVU5URUQgPSBcIm1vdW50ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVMT0FEX1NUQVRVUyA9IFwiX19waG9lbml4X3JlbG9hZF9zdGF0dXNfX1wiO1xuZXhwb3J0IGNvbnN0IExPQURFUl9USU1FT1VUID0gMTtcbmV4cG9ydCBjb25zdCBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUyA9IDM7XG5leHBvcnQgY29uc3QgQkVGT1JFX1VOTE9BRF9MT0FERVJfVElNRU9VVCA9IDIwMDtcbmV4cG9ydCBjb25zdCBESVNDT05ORUNURURfVElNRU9VVCA9IDUwMDtcbmV4cG9ydCBjb25zdCBCSU5ESU5HX1BSRUZJWCA9IFwicGh4LVwiO1xuZXhwb3J0IGNvbnN0IFBVU0hfVElNRU9VVCA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IExJTktfSEVBREVSID0gXCJ4LXJlcXVlc3RlZC13aXRoXCI7XG5leHBvcnQgY29uc3QgUkVTUE9OU0VfVVJMX0hFQURFUiA9IFwieC1yZXNwb25zZS11cmxcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9UUklHR0VSID0gXCJkZWJvdW5jZS10cmlnZ2VyXCI7XG5leHBvcnQgY29uc3QgVEhST1RUTEVEID0gXCJ0aHJvdHRsZWRcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9QUkVWX0tFWSA9IFwiZGVib3VuY2UtcHJldi1rZXlcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUUyA9IHtcbiAgZGVib3VuY2U6IDMwMCxcbiAgdGhyb3R0bGU6IDMwMCxcbn07XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfQVRUUlMgPSBbUEhYX1JFRl9MT0FESU5HLCBQSFhfUkVGX1NSQywgUEhYX1JFRl9MT0NLXTtcbi8vIFJlbmRlcmVkXG5leHBvcnQgY29uc3QgU1RBVElDID0gXCJzXCI7XG5leHBvcnQgY29uc3QgUk9PVCA9IFwiclwiO1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVFMgPSBcImNcIjtcbmV4cG9ydCBjb25zdCBLRVlFRCA9IFwia1wiO1xuZXhwb3J0IGNvbnN0IEtFWUVEX0NPVU5UID0gXCJrY1wiO1xuZXhwb3J0IGNvbnN0IEVWRU5UUyA9IFwiZVwiO1xuZXhwb3J0IGNvbnN0IFJFUExZID0gXCJyXCI7XG5leHBvcnQgY29uc3QgVElUTEUgPSBcInRcIjtcbmV4cG9ydCBjb25zdCBURU1QTEFURVMgPSBcInBcIjtcbmV4cG9ydCBjb25zdCBTVFJFQU0gPSBcInN0cmVhbVwiO1xuIiwgImltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW50cnlVcGxvYWRlciB7XG4gIGNvbnN0cnVjdG9yKGVudHJ5LCBjb25maWcsIGxpdmVTb2NrZXQpIHtcbiAgICBjb25zdCB7IGNodW5rX3NpemUsIGNodW5rX3RpbWVvdXQgfSA9IGNvbmZpZztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuICAgIHRoaXMuZW50cnkgPSBlbnRyeTtcbiAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgdGhpcy5jaHVua1NpemUgPSBjaHVua19zaXplO1xuICAgIHRoaXMuY2h1bmtUaW1lb3V0ID0gY2h1bmtfdGltZW91dDtcbiAgICB0aGlzLmNodW5rVGltZXIgPSBudWxsO1xuICAgIHRoaXMuZXJyb3JlZCA9IGZhbHNlO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbCA9IGxpdmVTb2NrZXQuY2hhbm5lbChgbHZ1OiR7ZW50cnkucmVmfWAsIHtcbiAgICAgIHRva2VuOiBlbnRyeS5tZXRhZGF0YSgpLFxuICAgIH0pO1xuICB9XG5cbiAgZXJyb3IocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuZXJyb3JlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWwubGVhdmUoKTtcbiAgICB0aGlzLmVycm9yZWQgPSB0cnVlO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmNodW5rVGltZXIpO1xuICAgIHRoaXMuZW50cnkuZXJyb3IocmVhc29uKTtcbiAgfVxuXG4gIHVwbG9hZCgpIHtcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwub25FcnJvcigocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbFxuICAgICAgLmpvaW4oKVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoX2RhdGEpID0+IHRoaXMucmVhZE5leHRDaHVuaygpKVxuICAgICAgLnJlY2VpdmUoXCJlcnJvclwiLCAocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG5cbiAgaXNEb25lKCkge1xuICAgIHJldHVybiB0aGlzLm9mZnNldCA+PSB0aGlzLmVudHJ5LmZpbGUuc2l6ZTtcbiAgfVxuXG4gIHJlYWROZXh0Q2h1bmsoKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IHdpbmRvdy5GaWxlUmVhZGVyKCk7XG4gICAgY29uc3QgYmxvYiA9IHRoaXMuZW50cnkuZmlsZS5zbGljZShcbiAgICAgIHRoaXMub2Zmc2V0LFxuICAgICAgdGhpcy5jaHVua1NpemUgKyB0aGlzLm9mZnNldCxcbiAgICApO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmVycm9yID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpLmJ5dGVMZW5ndGg7XG4gICAgICAgIHRoaXMucHVzaENodW5rKC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsb2dFcnJvcihcIlJlYWQgZXJyb3I6IFwiICsgZS50YXJnZXQuZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9XG5cbiAgcHVzaENodW5rKGNodW5rKSB7XG4gICAgaWYgKCF0aGlzLnVwbG9hZENoYW5uZWwuaXNKb2luZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWxcbiAgICAgIC5wdXNoKFwiY2h1bmtcIiwgY2h1bmssIHRoaXMuY2h1bmtUaW1lb3V0KVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cnkucHJvZ3Jlc3MoKHRoaXMub2Zmc2V0IC8gdGhpcy5lbnRyeS5maWxlLnNpemUpICogMTAwKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRG9uZSgpKSB7XG4gICAgICAgICAgdGhpcy5jaHVua1RpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVhZE5leHRDaHVuaygpLFxuICAgICAgICAgICAgdGhpcy5saXZlU29ja2V0LmdldExhdGVuY3lTaW0oKSB8fCAwLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsICh7IHJlYXNvbiB9KSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUEhYX1ZJRVdfU0VMRUNUT1IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IEVudHJ5VXBsb2FkZXIgZnJvbSBcIi4vZW50cnlfdXBsb2FkZXJcIjtcblxuZXhwb3J0IGNvbnN0IGxvZ0Vycm9yID0gKG1zZywgb2JqKSA9PiBjb25zb2xlLmVycm9yICYmIGNvbnNvbGUuZXJyb3IobXNnLCBvYmopO1xuXG5leHBvcnQgY29uc3QgaXNDaWQgPSAoY2lkKSA9PiB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgY2lkO1xuICByZXR1cm4gdHlwZSA9PT0gXCJudW1iZXJcIiB8fCAodHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAvXigwfFsxLTldXFxkKikkLy50ZXN0KGNpZCkpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdER1cGxpY2F0ZUlkcygpIHtcbiAgY29uc3QgaWRzID0gbmV3IFNldCgpO1xuICBjb25zdCBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2lkXVwiKTtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGlkcy5oYXMoZWxlbXNbaV0uaWQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTXVsdGlwbGUgSURzIGRldGVjdGVkOiAke2VsZW1zW2ldLmlkfS4gRW5zdXJlIHVuaXF1ZSBlbGVtZW50IGlkcy5gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzLmFkZChlbGVtc1tpXS5pZCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyhpbnNlcnRzKSB7XG4gIGNvbnN0IGVycm9ycyA9IG5ldyBTZXQoKTtcbiAgT2JqZWN0LmtleXMoaW5zZXJ0cykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICBjb25zdCBzdHJlYW1FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoXG4gICAgICBzdHJlYW1FbCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJwaHgtdXBkYXRlXCIpICE9PSBcInN0cmVhbVwiXG4gICAgKSB7XG4gICAgICBlcnJvcnMuYWRkKFxuICAgICAgICBgVGhlIHN0cmVhbSBjb250YWluZXIgd2l0aCBpZCBcIiR7c3RyZWFtRWwucGFyZW50RWxlbWVudC5pZH1cIiBpcyBtaXNzaW5nIHRoZSBwaHgtdXBkYXRlPVwic3RyZWFtXCIgYXR0cmlidXRlLiBFbnN1cmUgaXQgaXMgc2V0IGZvciBzdHJlYW1zIHRvIHdvcmsgcHJvcGVybHkuYCxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbiAgZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKGVycm9yKSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWJ1ZyA9ICh2aWV3LCBraW5kLCBtc2csIG9iaikgPT4ge1xuICBpZiAodmlldy5saXZlU29ja2V0LmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopO1xuICB9XG59O1xuXG4vLyB3cmFwcyB2YWx1ZSBpbiBjbG9zdXJlIG9yIHJldHVybnMgY2xvc3VyZVxuZXhwb3J0IGNvbnN0IGNsb3N1cmUgPSAodmFsKSA9PlxuICB0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IHZhbFxuICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfTtcblxuZXhwb3J0IGNvbnN0IGNsb25lID0gKG9iaikgPT4ge1xuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbG9zZXN0UGh4QmluZGluZyA9IChlbCwgYmluZGluZywgYm9yZGVyRWwpID0+IHtcbiAgZG8ge1xuICAgIGlmIChlbC5tYXRjaGVzKGBbJHtiaW5kaW5nfV1gKSAmJiAhZWwuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50IHx8IGVsLnBhcmVudE5vZGU7XG4gIH0gd2hpbGUgKFxuICAgIGVsICE9PSBudWxsICYmXG4gICAgZWwubm9kZVR5cGUgPT09IDEgJiZcbiAgICAhKChib3JkZXJFbCAmJiBib3JkZXJFbC5pc1NhbWVOb2RlKGVsKSkgfHwgZWwubWF0Y2hlcyhQSFhfVklFV19TRUxFQ1RPUikpXG4gICk7XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKG9iaikgPT4ge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgIShvYmogaW5zdGFuY2VvZiBBcnJheSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFcXVhbE9iaiA9IChvYmoxLCBvYmoyKSA9PlxuICBKU09OLnN0cmluZ2lmeShvYmoxKSA9PT0gSlNPTi5zdHJpbmdpZnkob2JqMik7XG5cbmV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICBmb3IgKGNvbnN0IHggaW4gb2JqKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heWJlID0gKGVsLCBjYWxsYmFjaykgPT4gZWwgJiYgY2FsbGJhY2soZWwpO1xuXG5leHBvcnQgY29uc3QgY2hhbm5lbFVwbG9hZGVyID0gZnVuY3Rpb24gKGVudHJpZXMsIG9uRXJyb3IsIHJlc3AsIGxpdmVTb2NrZXQpIHtcbiAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IGVudHJ5VXBsb2FkZXIgPSBuZXcgRW50cnlVcGxvYWRlcihlbnRyeSwgcmVzcC5jb25maWcsIGxpdmVTb2NrZXQpO1xuICAgIGVudHJ5VXBsb2FkZXIudXBsb2FkKCk7XG4gIH0pO1xufTtcbiIsICJjb25zdCBCcm93c2VyID0ge1xuICBjYW5QdXNoU3RhdGUoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBoaXN0b3J5LnB1c2hTdGF0ZSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgfSxcblxuICBkcm9wTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSk7XG4gIH0sXG5cbiAgdXBkYXRlTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSwgaW5pdGlhbCwgZnVuYykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IG5ld1ZhbCA9IGN1cnJlbnQgPT09IG51bGwgPyBpbml0aWFsIDogZnVuYyhjdXJyZW50KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG5ld1ZhbCkpO1xuICAgIHJldHVybiBuZXdWYWw7XG4gIH0sXG5cbiAgZ2V0TG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpKSk7XG4gIH0sXG5cbiAgdXBkYXRlQ3VycmVudFN0YXRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmNhblB1c2hTdGF0ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuICAgICAgY2FsbGJhY2soaGlzdG9yeS5zdGF0ZSB8fCB7fSksXG4gICAgICBcIlwiLFxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgKTtcbiAgfSxcblxuICBwdXNoU3RhdGUoa2luZCwgbWV0YSwgdG8pIHtcbiAgICBpZiAodGhpcy5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgaWYgKHRvICE9PSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xuICAgICAgICBpZiAobWV0YS50eXBlID09IFwicmVkaXJlY3RcIiAmJiBtZXRhLnNjcm9sbCkge1xuICAgICAgICAgIC8vIElmIHdlJ3JlIHJlZGlyZWN0aW5nIHN0b3JlIHRoZSBjdXJyZW50IHNjcm9sbFkgZm9yIHRoZSBjdXJyZW50IGhpc3Rvcnkgc3RhdGUuXG4gICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gaGlzdG9yeS5zdGF0ZSB8fCB7fTtcbiAgICAgICAgICBjdXJyZW50U3RhdGUuc2Nyb2xsID0gbWV0YS5zY3JvbGw7XG4gICAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY3VycmVudFN0YXRlLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgbWV0YS5zY3JvbGw7IC8vIE9ubHkgc3RvcmUgdGhlIHNjcm9sbCBpbiB0aGUgcmVkaXJlY3QgY2FzZS5cbiAgICAgICAgaGlzdG9yeVtraW5kICsgXCJTdGF0ZVwiXShtZXRhLCBcIlwiLCB0byB8fCBudWxsKTsgLy8gSUUgd2lsbCBjb2VyY2UgdW5kZWZpbmVkIHRvIHN0cmluZ1xuXG4gICAgICAgIC8vIHdoZW4gdXNpbmcgbmF2aWdhdGUsIHdlJ2QgY2FsbCBwdXNoU3RhdGUgaW1tZWRpYXRlbHkgYmVmb3JlIHBhdGNoaW5nIHRoZSBET00sXG4gICAgICAgIC8vIGp1bXBpbmcgYmFjayB0byB0aGUgdG9wIG9mIHRoZSBwYWdlLCBlZmZlY3RpdmVseSBpZ25vcmluZyB0aGUgc2Nyb2xsSW50b1ZpZXc7XG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZSAoYWZ0ZXIgdGhlIERPTSBwYXRjaCkgYW5kIG9ubHkgdGhlbiB0cnlcbiAgICAgICAgLy8gdG8gc2Nyb2xsIHRvIHRoZSBoYXNoRWxcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzaEVsID0gdGhpcy5nZXRIYXNoVGFyZ2V0RWwod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuXG4gICAgICAgICAgaWYgKGhhc2hFbCkge1xuICAgICAgICAgICAgaGFzaEVsLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZXRhLnR5cGUgPT09IFwicmVkaXJlY3RcIikge1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbCgwLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZGlyZWN0KHRvKTtcbiAgICB9XG4gIH0sXG5cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlLCBtYXhBZ2VTZWNvbmRzKSB7XG4gICAgY29uc3QgZXhwaXJlcyA9XG4gICAgICB0eXBlb2YgbWF4QWdlU2Vjb25kcyA9PT0gXCJudW1iZXJcIiA/IGAgbWF4LWFnZT0ke21heEFnZVNlY29uZHN9O2AgOiBcIlwiO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PSR7dmFsdWV9OyR7ZXhwaXJlc30gcGF0aD0vYDtcbiAgfSxcblxuICBnZXRDb29raWUobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jb29raWUucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoYCg/Oig/Ol58Lio7XFxzKikke25hbWV9XFxzKlxcPVxccyooW147XSopLiokKXxeLiokYCksXG4gICAgICBcIiQxXCIsXG4gICAgKTtcbiAgfSxcblxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PTsgbWF4LWFnZT0tMTsgcGF0aD0vYDtcbiAgfSxcblxuICByZWRpcmVjdChcbiAgICB0b1VSTCxcbiAgICBmbGFzaCxcbiAgICBuYXZpZ2F0ZSA9ICh1cmwpID0+IHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgIH0sXG4gICkge1xuICAgIGlmIChmbGFzaCkge1xuICAgICAgdGhpcy5zZXRDb29raWUoXCJfX3Bob2VuaXhfZmxhc2hfX1wiLCBmbGFzaCwgNjApO1xuICAgIH1cbiAgICBuYXZpZ2F0ZSh0b1VSTCk7XG4gIH0sXG5cbiAgbG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpIHtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfS0ke3N1YmtleX1gO1xuICB9LFxuXG4gIGdldEhhc2hUYXJnZXRFbChtYXliZUhhc2gpIHtcbiAgICBjb25zdCBoYXNoID0gbWF5YmVIYXNoLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO1xuICAgIGlmIChoYXNoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoKSB8fFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgYVtuYW1lPVwiJHtoYXNofVwiXWApXG4gICAgKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXI7XG4iLCAiaW1wb3J0IHtcbiAgQ0hFQ0tBQkxFX0lOUFVUUyxcbiAgREVCT1VOQ0VfUFJFVl9LRVksXG4gIERFQk9VTkNFX1RSSUdHRVIsXG4gIEZPQ1VTQUJMRV9JTlBVVFMsXG4gIFBIWF9DT01QT05FTlQsXG4gIFBIWF9WSUVXX1JFRixcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfTUFJTixcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BSSVZBVEUsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVGX0xPQ0ssXG4gIFBIWF9QRU5ESU5HX0FUVFJTLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1NFU1NJT04sXG4gIFBIWF9TVEFUSUMsXG4gIFBIWF9VUExPQURfUkVGLFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1NUSUNLWSxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFRIUk9UVExFRCxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1NUUkVBTSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgRE9NID0ge1xuICBieUlkKGlkKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBsb2dFcnJvcihgbm8gaWQgZm91bmQgZm9yICR7aWR9YCk7XG4gIH0sXG5cbiAgcmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICBpZiAoZWwuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgfVxuICB9LFxuXG4gIGFsbChub2RlLCBxdWVyeSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgYXJyYXkuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfSxcblxuICBjaGlsZE5vZGVMZW5ndGgoaHRtbCkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnQ7XG4gIH0sXG5cbiAgaXNVcGxvYWRJbnB1dChlbCkge1xuICAgIHJldHVybiBlbC50eXBlID09PSBcImZpbGVcIiAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQXV0b1VwbG9hZChpbnB1dEVsKSB7XG4gICAgcmV0dXJuIGlucHV0RWwuaGFzQXR0cmlidXRlKFwiZGF0YS1waHgtYXV0by11cGxvYWRcIik7XG4gIH0sXG5cbiAgZmluZFVwbG9hZElucHV0cyhub2RlKSB7XG4gICAgY29uc3QgZm9ybUlkID0gbm9kZS5pZDtcbiAgICBjb25zdCBpbnB1dHNPdXRzaWRlRm9ybSA9IHRoaXMuYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgaW5wdXRbdHlwZT1cImZpbGVcIl1bJHtQSFhfVVBMT0FEX1JFRn1dW2Zvcm09XCIke2Zvcm1JZH1cIl1gLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWxsKG5vZGUsIGBpbnB1dFt0eXBlPVwiZmlsZVwiXVske1BIWF9VUExPQURfUkVGfV1gKS5jb25jYXQoXG4gICAgICBpbnB1dHNPdXRzaWRlRm9ybSxcbiAgICApO1xuICB9LFxuXG4gIGZpbmRDb21wb25lbnROb2RlTGlzdCh2aWV3SWQsIGNpZCwgZG9jID0gZG9jdW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoXG4gICAgICBkb2MsXG4gICAgICBgWyR7UEhYX1ZJRVdfUkVGfT1cIiR7dmlld0lkfVwiXVske1BIWF9DT01QT05FTlR9PVwiJHtjaWR9XCJdYCxcbiAgICApO1xuICB9LFxuXG4gIGlzUGh4RGVzdHJveWVkKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5pZCAmJiBET00ucHJpdmF0ZShub2RlLCBcImRlc3Ryb3llZFwiKSA/IHRydWUgOiBmYWxzZTtcbiAgfSxcblxuICB3YW50c05ld1RhYihlKSB7XG4gICAgY29uc3Qgd2FudHNOZXdUYWIgPVxuICAgICAgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IChlLmJ1dHRvbiAmJiBlLmJ1dHRvbiA9PT0gMSk7XG4gICAgY29uc3QgaXNEb3dubG9hZCA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmXG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJkb3dubG9hZFwiKTtcbiAgICBjb25zdCBpc1RhcmdldEJsYW5rID1cbiAgICAgIGUudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInRhcmdldFwiKSAmJlxuICAgICAgZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpLnRvTG93ZXJDYXNlKCkgPT09IFwiX2JsYW5rXCI7XG4gICAgY29uc3QgaXNUYXJnZXROYW1lZFRhYiA9XG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJ0YXJnZXRcIikgJiZcbiAgICAgICFlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIikuc3RhcnRzV2l0aChcIl9cIik7XG4gICAgcmV0dXJuIHdhbnRzTmV3VGFiIHx8IGlzVGFyZ2V0QmxhbmsgfHwgaXNEb3dubG9hZCB8fCBpc1RhcmdldE5hbWVkVGFiO1xuICB9LFxuXG4gIGlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkge1xuICAgIC8vIElnbm9yZSBmb3JtIHN1Ym1pc3Npb25zIGludGVuZGVkIHRvIGNsb3NlIGEgbmF0aXZlIDxkaWFsb2c+IGVsZW1lbnRcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvZGlhbG9nI3VzYWdlX25vdGVzXG4gICAgY29uc3QgaXNEaWFsb2dTdWJtaXQgPVxuICAgICAgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZShcIm1ldGhvZFwiKSA9PT0gXCJkaWFsb2dcIikgfHxcbiAgICAgIChlLnN1Ym1pdHRlciAmJiBlLnN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtbWV0aG9kXCIpID09PSBcImRpYWxvZ1wiKTtcblxuICAgIGlmIChpc0RpYWxvZ1N1Ym1pdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gIWUuZGVmYXVsdFByZXZlbnRlZCAmJiAhdGhpcy53YW50c05ld1RhYihlKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNOZXdQYWdlQ2xpY2soZSwgY3VycmVudExvY2F0aW9uKSB7XG4gICAgY29uc3QgaHJlZiA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50XG4gICAgICAgID8gZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgICA6IG51bGw7XG4gICAgbGV0IHVybDtcblxuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQgfHwgaHJlZiA9PT0gbnVsbCB8fCB0aGlzLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJtYWlsdG86XCIpIHx8IGhyZWYuc3RhcnRzV2l0aChcInRlbDpcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUudGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHVybCA9IG5ldyBVUkwoaHJlZik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICB1cmwgPSBuZXcgVVJMKGhyZWYsIGN1cnJlbnRMb2NhdGlvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gYmFkIFVSTCwgZmFsbGJhY2sgdG8gbGV0IGJyb3dzZXIgdHJ5IGl0IGFzIGV4dGVybmFsXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHVybC5ob3N0ID09PSBjdXJyZW50TG9jYXRpb24uaG9zdCAmJlxuICAgICAgdXJsLnByb3RvY29sID09PSBjdXJyZW50TG9jYXRpb24ucHJvdG9jb2xcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgdXJsLnBhdGhuYW1lID09PSBjdXJyZW50TG9jYXRpb24ucGF0aG5hbWUgJiZcbiAgICAgICAgdXJsLnNlYXJjaCA9PT0gY3VycmVudExvY2F0aW9uLnNlYXJjaFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB1cmwuaGFzaCA9PT0gXCJcIiAmJiAhdXJsLmhyZWYuZW5kc1dpdGgoXCIjXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsLnByb3RvY29sLnN0YXJ0c1dpdGgoXCJodHRwXCIpO1xuICB9LFxuXG4gIG1hcmtQaHhDaGlsZERlc3Ryb3llZChlbCkge1xuICAgIGlmICh0aGlzLmlzUGh4Q2hpbGQoZWwpKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiZGVzdHJveWVkXCIsIHRydWUpO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgcGFyZW50SWQpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0aGlzLmZpbmRQaHhDaGlsZHJlbih0ZW1wbGF0ZS5jb250ZW50LCBwYXJlbnRJZCk7XG4gIH0sXG5cbiAgaXNJZ25vcmVkKGVsLCBwaHhVcGRhdGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpIHx8IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXVwZGF0ZVwiKSkgPT09XG4gICAgICBcImlnbm9yZVwiXG4gICAgKTtcbiAgfSxcblxuICBpc1BoeFVwZGF0ZShlbCwgcGh4VXBkYXRlLCB1cGRhdGVUeXBlcykge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUgJiYgdXBkYXRlVHlwZXMuaW5kZXhPZihlbC5nZXRBdHRyaWJ1dGUocGh4VXBkYXRlKSkgPj0gMFxuICAgICk7XG4gIH0sXG5cbiAgZmluZFBoeFN0aWNreShlbCkge1xuICAgIHJldHVybiB0aGlzLmFsbChlbCwgYFske1BIWF9TVElDS1l9XWApO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbihlbCwgcGFyZW50SWQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoZWwsIGAke1BIWF9WSUVXX1NFTEVDVE9SfVske1BIWF9QQVJFTlRfSUR9PVwiJHtwYXJlbnRJZH1cIl1gKTtcbiAgfSxcblxuICBmaW5kRXhpc3RpbmdQYXJlbnRDSURzKHZpZXdJZCwgY2lkcykge1xuICAgIC8vIHdlIG9ubHkgd2FudCB0byBmaW5kIHBhcmVudHMgdGhhdCBleGlzdCBvbiB0aGUgcGFnZVxuICAgIC8vIGlmIGEgY2lkIGlzIG5vdCBvbiB0aGUgcGFnZSwgdGhlIG9ubHkgd2F5IGl0IGNhbiBiZSBhZGRlZCBiYWNrIHRvIHRoZSBwYWdlXG4gICAgLy8gaXMgaWYgYSBwYXJlbnQgYWRkcyBpdCBiYWNrLCB0aGVyZWZvcmUgaWYgYSBjaWQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHBhZ2UsXG4gICAgLy8gd2Ugc2hvdWxkIG5vdCB0cnkgdG8gcmVuZGVyIGl0IGJ5IGl0c2VsZiAoYmVjYXVzZSBpdCB3b3VsZCBiZSByZW5kZXJlZCB0d2ljZSxcbiAgICAvLyBvbmUgYnkgdGhlIHBhcmVudCwgYW5kIGEgc2Vjb25kIHRpbWUgYnkgaXRzZWxmKVxuICAgIGNvbnN0IHBhcmVudENpZHMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgY2hpbGRyZW5DaWRzID0gbmV3IFNldCgpO1xuXG4gICAgY2lkcy5mb3JFYWNoKChjaWQpID0+IHtcbiAgICAgIHRoaXMuYWxsKFxuICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3ZpZXdJZH1cIl1bJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXWAsXG4gICAgICApLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgICBwYXJlbnRDaWRzLmFkZChjaWQpO1xuICAgICAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHtQSFhfVklFV19SRUZ9PVwiJHt2aWV3SWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYClcbiAgICAgICAgICAubWFwKChlbCkgPT4gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpKSlcbiAgICAgICAgICAuZm9yRWFjaCgoY2hpbGRDSUQpID0+IGNoaWxkcmVuQ2lkcy5hZGQoY2hpbGRDSUQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2hpbGRyZW5DaWRzLmZvckVhY2goKGNoaWxkQ2lkKSA9PiBwYXJlbnRDaWRzLmRlbGV0ZShjaGlsZENpZCkpO1xuXG4gICAgcmV0dXJuIHBhcmVudENpZHM7XG4gIH0sXG5cbiAgcHJpdmF0ZShlbCwga2V5KSB7XG4gICAgcmV0dXJuIGVsW1BIWF9QUklWQVRFXSAmJiBlbFtQSFhfUFJJVkFURV1ba2V5XTtcbiAgfSxcblxuICBkZWxldGVQcml2YXRlKGVsLCBrZXkpIHtcbiAgICBlbFtQSFhfUFJJVkFURV0gJiYgZGVsZXRlIGVsW1BIWF9QUklWQVRFXVtrZXldO1xuICB9LFxuXG4gIHB1dFByaXZhdGUoZWwsIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIWVsW1BIWF9QUklWQVRFXSkge1xuICAgICAgZWxbUEhYX1BSSVZBVEVdID0ge307XG4gICAgfVxuICAgIGVsW1BIWF9QUklWQVRFXVtrZXldID0gdmFsdWU7XG4gIH0sXG5cbiAgdXBkYXRlUHJpdmF0ZShlbCwga2V5LCBkZWZhdWx0VmFsLCB1cGRhdGVGdW5jKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCB1cGRhdGVGdW5jKGRlZmF1bHRWYWwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIHVwZGF0ZUZ1bmMoZXhpc3RpbmcpKTtcbiAgICB9XG4gIH0sXG5cbiAgc3luY1BlbmRpbmdBdHRycyhmcm9tRWwsIHRvRWwpIHtcbiAgICBpZiAoIWZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKGNsYXNzTmFtZSkgPT4ge1xuICAgICAgZnJvbUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpICYmIHRvRWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0pO1xuICAgIFBIWF9QRU5ESU5HX0FUVFJTLmZpbHRlcigoYXR0cikgPT4gZnJvbUVsLmhhc0F0dHJpYnV0ZShhdHRyKSkuZm9yRWFjaChcbiAgICAgIChhdHRyKSA9PiB7XG4gICAgICAgIHRvRWwuc2V0QXR0cmlidXRlKGF0dHIsIGZyb21FbC5nZXRBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgfSxcbiAgICApO1xuICB9LFxuXG4gIGNvcHlQcml2YXRlcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmIChzb3VyY2VbUEhYX1BSSVZBVEVdKSB7XG4gICAgICB0YXJnZXRbUEhYX1BSSVZBVEVdID0gc291cmNlW1BIWF9QUklWQVRFXTtcbiAgICB9XG4gIH0sXG5cbiAgcHV0VGl0bGUoc3RyKSB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICBpZiAodGl0bGVFbCkge1xuICAgICAgY29uc3QgeyBwcmVmaXgsIHN1ZmZpeCwgZGVmYXVsdDogZGVmYXVsdFRpdGxlIH0gPSB0aXRsZUVsLmRhdGFzZXQ7XG4gICAgICBjb25zdCBpc0VtcHR5ID0gdHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIiB8fCBzdHIudHJpbSgpID09PSBcIlwiO1xuICAgICAgaWYgKGlzRW1wdHkgJiYgdHlwZW9mIGRlZmF1bHRUaXRsZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlubmVyID0gaXNFbXB0eSA/IGRlZmF1bHRUaXRsZSA6IHN0cjtcbiAgICAgIGRvY3VtZW50LnRpdGxlID0gYCR7cHJlZml4IHx8IFwiXCJ9JHtpbm5lciB8fCBcIlwifSR7c3VmZml4IHx8IFwiXCJ9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQudGl0bGUgPSBzdHI7XG4gICAgfVxuICB9LFxuXG4gIGRlYm91bmNlKFxuICAgIGVsLFxuICAgIGV2ZW50LFxuICAgIHBoeERlYm91bmNlLFxuICAgIGRlZmF1bHREZWJvdW5jZSxcbiAgICBwaHhUaHJvdHRsZSxcbiAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgYXN5bmNGaWx0ZXIsXG4gICAgY2FsbGJhY2ssXG4gICkge1xuICAgIGxldCBkZWJvdW5jZSA9IGVsLmdldEF0dHJpYnV0ZShwaHhEZWJvdW5jZSk7XG4gICAgbGV0IHRocm90dGxlID0gZWwuZ2V0QXR0cmlidXRlKHBoeFRocm90dGxlKTtcblxuICAgIGlmIChkZWJvdW5jZSA9PT0gXCJcIikge1xuICAgICAgZGVib3VuY2UgPSBkZWZhdWx0RGVib3VuY2U7XG4gICAgfVxuICAgIGlmICh0aHJvdHRsZSA9PT0gXCJcIikge1xuICAgICAgdGhyb3R0bGUgPSBkZWZhdWx0VGhyb3R0bGU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gZGVib3VuY2UgfHwgdGhyb3R0bGU7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSBudWxsOlxuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcblxuICAgICAgY2FzZSBcImJsdXJcIjpcbiAgICAgICAgdGhpcy5pbmNDeWNsZShlbCwgXCJkZWJvdW5jZS1ibHVyLWN5Y2xlXCIsICgpID0+IHtcbiAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImRlYm91bmNlLWJsdXJcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PlxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIFwiZGVib3VuY2UtYmx1ci1jeWNsZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9ICgpID0+XG4gICAgICAgICAgdGhyb3R0bGUgPyB0aGlzLmRlbGV0ZVByaXZhdGUoZWwsIFRIUk9UVExFRCkgOiBjYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBjdXJyZW50Q3ljbGUgPSB0aGlzLmluY0N5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSLCB0cmlnZ2VyKTtcbiAgICAgICAgaWYgKGlzTmFOKHRpbWVvdXQpKSB7XG4gICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKGBpbnZhbGlkIHRocm90dGxlL2RlYm91bmNlIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aHJvdHRsZSkge1xuICAgICAgICAgIGxldCBuZXdLZXlEb3duID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwia2V5ZG93blwiKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2S2V5ID0gdGhpcy5wcml2YXRlKGVsLCBERUJPVU5DRV9QUkVWX0tFWSk7XG4gICAgICAgICAgICB0aGlzLnB1dFByaXZhdGUoZWwsIERFQk9VTkNFX1BSRVZfS0VZLCBldmVudC5rZXkpO1xuICAgICAgICAgICAgbmV3S2V5RG93biA9IHByZXZLZXkgIT09IGV2ZW50LmtleTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW5ld0tleURvd24gJiYgdGhpcy5wcml2YXRlKGVsLCBUSFJPVFRMRUQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChhc3luY0ZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgVEhST1RUTEVELCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiwgY3VycmVudEN5Y2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm0gPSBlbC5mb3JtO1xuICAgICAgICBpZiAoZm9ybSAmJiB0aGlzLm9uY2UoZm9ybSwgXCJiaW5kLWRlYm91bmNlXCIpKSB7XG4gICAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsICgpID0+IHtcbiAgICAgICAgICAgIEFycmF5LmZyb20obmV3IEZvcm1EYXRhKGZvcm0pLmVudHJpZXMoKSwgKFtuYW1lXSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCIke25hbWV9XCJdYCk7XG4gICAgICAgICAgICAgIHRoaXMuaW5jQ3ljbGUoaW5wdXQsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVByaXZhdGUoaW5wdXQsIFRIUk9UVExFRCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImJpbmQtZGVib3VuY2VcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBiZWNhdXNlIHdlIHRyaWdnZXIgdGhlIGNhbGxiYWNrIGhlcmUsXG4gICAgICAgICAgICAvLyB3ZSBhbHNvIGNsZWFyIHRoZSB0aHJvdHRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICAvLyBmcm9tIGJlaW5nIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgdGltZW91dCBmaXJlc1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucHJpdmF0ZShlbCwgVEhST1RUTEVEKSk7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlckN5Y2xlKGVsLCBrZXksIGN1cnJlbnRDeWNsZSkge1xuICAgIGNvbnN0IFtjeWNsZSwgdHJpZ2dlcl0gPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKCFjdXJyZW50Q3ljbGUpIHtcbiAgICAgIGN1cnJlbnRDeWNsZSA9IGN5Y2xlO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEN5Y2xlID09PSBjeWNsZSkge1xuICAgICAgdGhpcy5pbmNDeWNsZShlbCwga2V5KTtcbiAgICAgIHRyaWdnZXIoKTtcbiAgICB9XG4gIH0sXG5cbiAgb25jZShlbCwga2V5KSB7XG4gICAgaWYgKHRoaXMucHJpdmF0ZShlbCwga2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgaW5jQ3ljbGUoZWwsIGtleSwgdHJpZ2dlciA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgbGV0IFtjdXJyZW50Q3ljbGVdID0gdGhpcy5wcml2YXRlKGVsLCBrZXkpIHx8IFswLCB0cmlnZ2VyXTtcbiAgICBjdXJyZW50Q3ljbGUrKztcbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgW2N1cnJlbnRDeWNsZSwgdHJpZ2dlcl0pO1xuICAgIHJldHVybiBjdXJyZW50Q3ljbGU7XG4gIH0sXG5cbiAgLy8gbWFpbnRhaW5zIG9yIGFkZHMgcHJpdmF0ZWx5IHVzZWQgaG9vayBpbmZvcm1hdGlvblxuICAvLyBmcm9tRWwgYW5kIHRvRWwgY2FuIGJlIHRoZSBzYW1lIGVsZW1lbnQgaW4gdGhlIGNhc2Ugb2YgYSBuZXdseSBhZGRlZCBub2RlXG4gIC8vIGZyb21FbCBhbmQgdG9FbCBjYW4gYmUgYW55IEhUTUwgbm9kZSB0eXBlLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgYW4gZWxlbWVudCBub2RlXG4gIG1haW50YWluUHJpdmF0ZUhvb2tzKGZyb21FbCwgdG9FbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKSB7XG4gICAgLy8gbWFpbnRhaW4gdGhlIGhvb2tzIGNyZWF0ZWQgd2l0aCBjcmVhdGVIb29rXG4gICAgaWYgKFxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIikgJiZcbiAgICAgICF0b0VsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIilcbiAgICApIHtcbiAgICAgIHRvRWwuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiLCBmcm9tRWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiKSk7XG4gICAgfVxuICAgIC8vIGFkZCBob29rcyB0byBlbGVtZW50cyB3aXRoIHZpZXdwb3J0IGF0dHJpYnV0ZXNcbiAgICBpZiAoXG4gICAgICB0b0VsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgKHRvRWwuaGFzQXR0cmlidXRlKHBoeFZpZXdwb3J0VG9wKSB8fFxuICAgICAgICB0b0VsLmhhc0F0dHJpYnV0ZShwaHhWaWV3cG9ydEJvdHRvbSkpXG4gICAgKSB7XG4gICAgICB0b0VsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJQaG9lbml4LkluZmluaXRlU2Nyb2xsXCIpO1xuICAgIH1cbiAgfSxcblxuICBwdXRDdXN0b21FbEhvb2soZWwsIGhvb2spIHtcbiAgICBpZiAoZWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxuICAgICAgICBob29rIGF0dGFjaGVkIHRvIG5vbi1jb25uZWN0ZWQgRE9NIGVsZW1lbnRcbiAgICAgICAgZW5zdXJlIHlvdSBhcmUgY2FsbGluZyBjcmVhdGVIb29rIHdpdGhpbiB5b3VyIGNvbm5lY3RlZENhbGxiYWNrLiAke2VsLm91dGVySFRNTH1cbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiY3VzdG9tLWVsLWhvb2tcIiwgaG9vayk7XG4gIH0sXG5cbiAgZ2V0Q3VzdG9tRWxIb29rKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMucHJpdmF0ZShlbCwgXCJjdXN0b20tZWwtaG9va1wiKTtcbiAgfSxcblxuICBpc1VzZWRJbnB1dChlbCkge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICh0aGlzLnByaXZhdGUoZWwsIFBIWF9IQVNfRk9DVVNFRCkgfHwgdGhpcy5wcml2YXRlKGVsLCBQSFhfSEFTX1NVQk1JVFRFRCkpXG4gICAgKTtcbiAgfSxcblxuICByZXNldEZvcm0oZm9ybSkge1xuICAgIEFycmF5LmZyb20oZm9ybS5lbGVtZW50cykuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19GT0NVU0VEKTtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19TVUJNSVRURUQpO1xuICAgIH0pO1xuICB9LFxuXG4gIGlzUGh4Q2hpbGQobm9kZSkge1xuICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKTtcbiAgfSxcblxuICBpc1BoeFN0aWNreShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9TVElDS1kpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQ2hpbGRPZkFueShlbCwgcGFyZW50cykge1xuICAgIHJldHVybiAhIXBhcmVudHMuZmluZCgocGFyZW50KSA9PiBwYXJlbnQuY29udGFpbnMoZWwpKTtcbiAgfSxcblxuICBmaXJzdFBoeENoaWxkKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQaHhDaGlsZChlbCkgPyBlbCA6IHRoaXMuYWxsKGVsLCBgWyR7UEhYX1BBUkVOVF9JRH1dYClbMF07XG4gIH0sXG5cbiAgaXNQb3J0YWxUZW1wbGF0ZShlbCkge1xuICAgIHJldHVybiBlbC50YWdOYW1lID09PSBcIlRFTVBMQVRFXCIgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICB9LFxuXG4gIGNsb3Nlc3RWaWV3RWwoZWwpIHtcbiAgICAvLyBmaW5kIHRoZSBjbG9zZXN0IHBvcnRhbCBvciB2aWV3IGVsZW1lbnQsIHdoaWNoZXZlciBjb21lcyBmaXJzdFxuICAgIGNvbnN0IHBvcnRhbE9yVmlld0VsID0gZWwuY2xvc2VzdChcbiAgICAgIGBbJHtQSFhfVEVMRVBPUlRFRF9SRUZ9XSwke1BIWF9WSUVXX1NFTEVDVE9SfWAsXG4gICAgKTtcbiAgICBpZiAoIXBvcnRhbE9yVmlld0VsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAvLyBQSFhfVEVMRVBPUlRFRF9SRUYgaXMgc2V0IHRvIHRoZSBpZCBvZiB0aGUgdmlldyB0aGF0IG93bnMgdGhlIHBvcnRhbCBlbGVtZW50XG4gICAgICByZXR1cm4gdGhpcy5ieUlkKHBvcnRhbE9yVmlld0VsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKTtcbiAgICB9IGVsc2UgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfU0VTU0lPTikpIHtcbiAgICAgIHJldHVybiBwb3J0YWxPclZpZXdFbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgZGlzcGF0Y2hFdmVudCh0YXJnZXQsIG5hbWUsIG9wdHMgPSB7fSkge1xuICAgIGxldCBkZWZhdWx0QnViYmxlID0gdHJ1ZTtcbiAgICBjb25zdCBpc1VwbG9hZFRhcmdldCA9XG4gICAgICB0YXJnZXQubm9kZU5hbWUgPT09IFwiSU5QVVRcIiAmJiB0YXJnZXQudHlwZSA9PT0gXCJmaWxlXCI7XG4gICAgaWYgKGlzVXBsb2FkVGFyZ2V0ICYmIG5hbWUgPT09IFwiY2xpY2tcIikge1xuICAgICAgZGVmYXVsdEJ1YmJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBidWJibGVzID0gb3B0cy5idWJibGVzID09PSB1bmRlZmluZWQgPyBkZWZhdWx0QnViYmxlIDogISFvcHRzLmJ1YmJsZXM7XG4gICAgY29uc3QgZXZlbnRPcHRzID0ge1xuICAgICAgYnViYmxlczogYnViYmxlcyxcbiAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICBkZXRhaWw6IG9wdHMuZGV0YWlsIHx8IHt9LFxuICAgIH07XG4gICAgY29uc3QgZXZlbnQgPVxuICAgICAgbmFtZSA9PT0gXCJjbGlja1wiXG4gICAgICAgID8gbmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLCBldmVudE9wdHMpXG4gICAgICAgIDogbmV3IEN1c3RvbUV2ZW50KG5hbWUsIGV2ZW50T3B0cyk7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9LFxuXG4gIGNsb25lTm9kZShub2RlLCBodG1sKSB7XG4gICAgaWYgKHR5cGVvZiBodG1sID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsb25lZCA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgIGNsb25lZC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICB9XG4gIH0sXG5cbiAgLy8gbWVyZ2UgYXR0cmlidXRlcyBmcm9tIHNvdXJjZSB0byB0YXJnZXRcbiAgLy8gaWYgYW4gZWxlbWVudCBpcyBpZ25vcmVkLCB3ZSBvbmx5IG1lcmdlIGRhdGEgYXR0cmlidXRlc1xuICAvLyBpbmNsdWRpbmcgcmVtb3ZpbmcgZGF0YSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgc291cmNlXG4gIG1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGV4Y2x1ZGUgPSBuZXcgU2V0KG9wdHMuZXhjbHVkZSB8fCBbXSk7XG4gICAgY29uc3QgaXNJZ25vcmVkID0gb3B0cy5pc0lnbm9yZWQ7XG4gICAgY29uc3Qgc291cmNlQXR0cnMgPSBzb3VyY2UuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gc291cmNlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzb3VyY2VBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKCFleGNsdWRlLmhhcyhuYW1lKSkge1xuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0YXJnZXQuZ2V0QXR0cmlidXRlKG5hbWUpICE9PSBzb3VyY2VWYWx1ZSAmJlxuICAgICAgICAgICghaXNJZ25vcmVkIHx8IChpc0lnbm9yZWQgJiYgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHNvdXJjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UgZXhjbHVkZSB0aGUgdmFsdWUgZnJvbSBiZWluZyBtZXJnZWQgb24gZm9jdXNlZCBpbnB1dHMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIHVzZXIncyBpbnB1dCBzaG91bGQgYWx3YXlzIHdpbi5cbiAgICAgICAgLy8gV2UgY2FuIHN0aWxsIGFzc2lnbiBpdCBhcyBsb25nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyB0aGUgc2FtZSwgdGhvdWdoLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSB1cGRhdGVkIGhvb2sgaXMgbm90IGJlaW5nIHRyaWdnZXJlZFxuICAgICAgICAvLyB3aGVuIGFuIGlucHV0IGlzIGJhY2sgaW4gaXRzIFwib3JpZ2luYWwgc3RhdGVcIiwgYmVjYXVzZSB0aGUgYXR0cmlidXRlXG4gICAgICAgIC8vIHdhcyBuZXZlciBjaGFuZ2VkLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8yMTYzXG4gICAgICAgIGlmIChuYW1lID09PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS52YWx1ZSA/PyBzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgIGlmICh0YXJnZXQudmFsdWUgPT09IHNvdXJjZVZhbHVlKSB7XG4gICAgICAgICAgICAvLyBhY3R1YWxseSBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byBzeW5jIGl0IHdpdGggdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0QXR0cnMgPSB0YXJnZXQuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gdGFyZ2V0QXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXRBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKGlzSWdub3JlZCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikgJiZcbiAgICAgICAgICAhc291cmNlLmhhc0F0dHJpYnV0ZShuYW1lKSAmJlxuICAgICAgICAgICFQSFhfUEVORElOR19BVFRSUy5pbmNsdWRlcyhuYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXNvdXJjZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1lcmdlRm9jdXNlZElucHV0KHRhcmdldCwgc291cmNlKSB7XG4gICAgLy8gc2tpcCBzZWxlY3RzIGJlY2F1c2UgRkYgd2lsbCByZXNldCBoaWdobGlnaHRlZCBpbmRleCBmb3IgYW55IHNldEF0dHJpYnV0ZVxuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSkge1xuICAgICAgRE9NLm1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIHsgZXhjbHVkZTogW1widmFsdWVcIl0gfSk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZS5yZWFkT25seSkge1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwicmVhZG9ubHlcIik7XG4gICAgfVxuICB9LFxuXG4gIGhhc1NlbGVjdGlvblJhbmdlKGVsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlICYmIChlbC50eXBlID09PSBcInRleHRcIiB8fCBlbC50eXBlID09PSBcInRleHRhcmVhXCIpXG4gICAgKTtcbiAgfSxcblxuICByZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCkge1xuICAgIGlmIChmb2N1c2VkIGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpIHtcbiAgICAgIGZvY3VzZWQuZm9jdXMoKTtcbiAgICB9XG4gICAgaWYgKCFET00uaXNUZXh0dWFsSW5wdXQoZm9jdXNlZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YXNGb2N1c2VkID0gZm9jdXNlZC5tYXRjaGVzKFwiOmZvY3VzXCIpO1xuICAgIGlmICghd2FzRm9jdXNlZCkge1xuICAgICAgZm9jdXNlZC5mb2N1cygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSkge1xuICAgICAgZm9jdXNlZC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNGb3JtSW5wdXQoZWwpIHtcbiAgICBpZiAoZWwubG9jYWxOYW1lICYmIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpKSB7XG4gICAgICAvLyBDdXN0b20gRWxlbWVudHMgbWF5IGJlIGZvcm0gYXNzb2NpYXRlZC4gVGhpcyBhbGxvd3MgdGhlbVxuICAgICAgLy8gdG8gcGFydGljaXBhdGUgd2l0aGluIGEgZm9ybSdzIGxpZmVjeWNsZSwgaW5jbHVkaW5nIGZvcm1cbiAgICAgIC8vIHZhbGlkaXR5IGFuZCBmb3JtIHN1Ym1pc3Npb25zLlxuICAgICAgLy8gVGhlIHNwZWMgZm9yIEZvcm0gQXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHMgcmVxdWlyZXMgdGhlXG4gICAgICAvLyBjdXN0b20gZWxlbWVudCdzIGNsYXNzIHRvIGNvbnRhaW4gYSBzdGF0aWMgYm9vbGVhbiB2YWx1ZSBvZiBgZm9ybUFzc29jaWF0ZWRgXG4gICAgICAvLyB3aGljaCBpZGVudGlmaWVzIHRoaXMgY2xhc3MgYXMgYWxsb3dlZCB0byBhc3NvY2lhdGUgdG8gYSBmb3JtLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvZGV2L2N1c3RvbS1lbGVtZW50cy5odG1sI2N1c3RvbS1lbGVtZW50cy1mYWNlLWV4YW1wbGVcbiAgICAgIC8vIGZvciBkZXRhaWxzLlxuICAgICAgcmV0dXJuIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpW2Bmb3JtQXNzb2NpYXRlZGBdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlbC50YWdOYW1lKSAmJiBlbC50eXBlICE9PSBcImJ1dHRvblwiXG4gICAgKTtcbiAgfSxcblxuICBzeW5jQXR0cnNUb1Byb3BzKGVsKSB7XG4gICAgaWYgKFxuICAgICAgZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBDSEVDS0FCTEVfSU5QVVRTLmluZGV4T2YoZWwudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSA+PSAwXG4gICAgKSB7XG4gICAgICBlbC5jaGVja2VkID0gZWwuZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSAhPT0gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgaXNUZXh0dWFsSW5wdXQoZWwpIHtcbiAgICByZXR1cm4gRk9DVVNBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUpID49IDA7XG4gIH0sXG5cbiAgaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWwuZ2V0QXR0cmlidXRlICYmXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUocGh4VHJpZ2dlckV4dGVybmFsKSAhPT0gbnVsbCAmJlxuICAgICAgZG9jdW1lbnQuYm9keS5jb250YWlucyhlbClcbiAgICApO1xuICB9LFxuXG4gIGNsZWFuQ2hpbGROb2Rlcyhjb250YWluZXIsIHBoeFVwZGF0ZSkge1xuICAgIGlmIChcbiAgICAgIERPTS5pc1BoeFVwZGF0ZShjb250YWluZXIsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiLCBQSFhfU1RSRUFNXSlcbiAgICApIHtcbiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XG4gICAgICBjb250YWluZXIuY2hpbGROb2Rlcy5mb3JFYWNoKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgaWYgKCFjaGlsZE5vZGUuaWQpIHtcbiAgICAgICAgICAvLyBTa2lwIHdhcm5pbmcgaWYgaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUgKGUuZy4gYSBuZXctbGluZSlcbiAgICAgICAgICBjb25zdCBpc0VtcHR5VGV4dE5vZGUgPVxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJlxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVWYWx1ZS50cmltKCkgPT09IFwiXCI7XG4gICAgICAgICAgaWYgKCFpc0VtcHR5VGV4dE5vZGUgJiYgY2hpbGROb2RlLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgICAgIFwib25seSBIVE1MIGVsZW1lbnQgdGFncyB3aXRoIGFuIGlkIGFyZSBhbGxvd2VkIGluc2lkZSBjb250YWluZXJzIHdpdGggcGh4LXVwZGF0ZS5cXG5cXG5cIiArXG4gICAgICAgICAgICAgICAgYHJlbW92aW5nIGlsbGVnYWwgbm9kZTogXCIkeyhjaGlsZE5vZGUub3V0ZXJIVE1MIHx8IGNoaWxkTm9kZS5ub2RlVmFsdWUpLnRyaW0oKX1cIlxcblxcbmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKGNoaWxkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdG9SZW1vdmUuZm9yRWFjaCgoY2hpbGROb2RlKSA9PiBjaGlsZE5vZGUucmVtb3ZlKCkpO1xuICAgIH1cbiAgfSxcblxuICByZXBsYWNlUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhZ05hbWUsIGF0dHJzKSB7XG4gICAgY29uc3QgcmV0YWluZWRBdHRycyA9IG5ldyBTZXQoW1xuICAgICAgXCJpZFwiLFxuICAgICAgUEhYX1NFU1NJT04sXG4gICAgICBQSFhfU1RBVElDLFxuICAgICAgUEhYX01BSU4sXG4gICAgICBQSFhfUk9PVF9JRCxcbiAgICBdKTtcbiAgICBpZiAoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBBcnJheS5mcm9tKGNvbnRhaW5lci5hdHRyaWJ1dGVzKVxuICAgICAgICAuZmlsdGVyKChhdHRyKSA9PiAhcmV0YWluZWRBdHRycy5oYXMoYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpKTtcblxuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpXG4gICAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICFyZXRhaW5lZEF0dHJzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSkpO1xuXG4gICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goKGF0dHIpID0+XG4gICAgICAgIG5ld0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pLFxuICAgICAgKTtcbiAgICAgIHJldGFpbmVkQXR0cnMuZm9yRWFjaCgoYXR0cikgPT5cbiAgICAgICAgbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBjb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHIpKSxcbiAgICAgICk7XG4gICAgICBuZXdDb250YWluZXIuaW5uZXJIVE1MID0gY29udGFpbmVyLmlubmVySFRNTDtcbiAgICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChuZXdDb250YWluZXIpO1xuICAgICAgcmV0dXJuIG5ld0NvbnRhaW5lcjtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0U3RpY2t5KGVsLCBuYW1lLCBkZWZhdWx0VmFsKSB7XG4gICAgY29uc3Qgb3AgPSAoRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpIHx8IFtdKS5maW5kKFxuICAgICAgKFtleGlzdGluZ05hbWVdKSA9PiBuYW1lID09PSBleGlzdGluZ05hbWUsXG4gICAgKTtcbiAgICBpZiAob3ApIHtcbiAgICAgIGNvbnN0IFtfbmFtZSwgX29wLCBzdGFzaGVkUmVzdWx0XSA9IG9wO1xuICAgICAgcmV0dXJuIHN0YXNoZWRSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbCA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbCgpIDogZGVmYXVsdFZhbDtcbiAgICB9XG4gIH0sXG5cbiAgZGVsZXRlU3RpY2t5KGVsLCBuYW1lKSB7XG4gICAgdGhpcy51cGRhdGVQcml2YXRlKGVsLCBcInN0aWNreVwiLCBbXSwgKG9wcykgPT4ge1xuICAgICAgcmV0dXJuIG9wcy5maWx0ZXIoKFtleGlzdGluZ05hbWUsIF9dKSA9PiBleGlzdGluZ05hbWUgIT09IG5hbWUpO1xuICAgIH0pO1xuICB9LFxuXG4gIHB1dFN0aWNreShlbCwgbmFtZSwgb3ApIHtcbiAgICBjb25zdCBzdGFzaGVkUmVzdWx0ID0gb3AoZWwpO1xuICAgIHRoaXMudXBkYXRlUHJpdmF0ZShlbCwgXCJzdGlja3lcIiwgW10sIChvcHMpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBvcHMuZmluZEluZGV4KFxuICAgICAgICAoW2V4aXN0aW5nTmFtZV0pID0+IG5hbWUgPT09IGV4aXN0aW5nTmFtZSxcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKSB7XG4gICAgICAgIG9wc1tleGlzdGluZ0luZGV4XSA9IFtuYW1lLCBvcCwgc3Rhc2hlZFJlc3VsdF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHMucHVzaChbbmFtZSwgb3AsIHN0YXNoZWRSZXN1bHRdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHM7XG4gICAgfSk7XG4gIH0sXG5cbiAgYXBwbHlTdGlja3lPcGVyYXRpb25zKGVsKSB7XG4gICAgY29uc3Qgb3BzID0gRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpO1xuICAgIGlmICghb3BzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3BzLmZvckVhY2goKFtuYW1lLCBvcCwgX3N0YXNoZWRdKSA9PiB0aGlzLnB1dFN0aWNreShlbCwgbmFtZSwgb3ApKTtcbiAgfSxcblxuICBpc0xvY2tlZChlbCkge1xuICAgIHJldHVybiBlbC5oYXNBdHRyaWJ1dGUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBET007XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IHsgY2hhbm5lbFVwbG9hZGVyLCBsb2dFcnJvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRFbnRyeSB7XG4gIHN0YXRpYyBpc0FjdGl2ZShmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBpc05ldyA9IGZpbGUuX3BoeFJlZiA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdGl2ZVJlZnMgPSBmaWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUykuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlUmVmcy5pbmRleE9mKExpdmVVcGxvYWRlci5nZW5GaWxlUmVmKGZpbGUpKSA+PSAwO1xuICAgIHJldHVybiBmaWxlLnNpemUgPiAwICYmIChpc05ldyB8fCBpc0FjdGl2ZSk7XG4gIH1cblxuICBzdGF0aWMgaXNQcmVmbGlnaHRlZChmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBwcmVmbGlnaHRlZFJlZnMgPSBmaWxlRWxcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1BSRUZMSUdIVEVEX1JFRlMpXG4gICAgICAuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzUHJlZmxpZ2h0ZWQgPVxuICAgICAgcHJlZmxpZ2h0ZWRSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDA7XG4gICAgcmV0dXJuIGlzUHJlZmxpZ2h0ZWQgJiYgdGhpcy5pc0FjdGl2ZShmaWxlRWwsIGZpbGUpO1xuICB9XG5cbiAgc3RhdGljIGlzUHJlZmxpZ2h0SW5Qcm9ncmVzcyhmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPT09IHRydWU7XG4gIH1cblxuICBzdGF0aWMgbWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZmlsZSkge1xuICAgIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZmlsZUVsLCBmaWxlLCB2aWV3LCBhdXRvVXBsb2FkKSB7XG4gICAgdGhpcy5yZWYgPSBMaXZlVXBsb2FkZXIuZ2VuRmlsZVJlZihmaWxlKTtcbiAgICB0aGlzLmZpbGVFbCA9IGZpbGVFbDtcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgdGhpcy5tZXRhID0gbnVsbDtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Byb2dyZXNzID0gMDtcbiAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gLTE7XG4gICAgdGhpcy5fb25Eb25lID0gZnVuY3Rpb24gKCkge307XG4gICAgdGhpcy5fb25FbFVwZGF0ZWQgPSB0aGlzLm9uRWxVcGRhdGVkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5maWxlRWwuYWRkRXZlbnRMaXN0ZW5lcihQSFhfTElWRV9GSUxFX1VQREFURUQsIHRoaXMuX29uRWxVcGRhdGVkKTtcbiAgICB0aGlzLmF1dG9VcGxvYWQgPSBhdXRvVXBsb2FkO1xuICB9XG5cbiAgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YTtcbiAgfVxuXG4gIHByb2dyZXNzKHByb2dyZXNzKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSBNYXRoLmZsb29yKHByb2dyZXNzKTtcbiAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPiB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50KSB7XG4gICAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPj0gMTAwKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzID0gMTAwO1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gMTAwO1xuICAgICAgICB0aGlzLl9pc0RvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcucHVzaEZpbGVQcm9ncmVzcyh0aGlzLmZpbGVFbCwgdGhpcy5yZWYsIDEwMCwgKCkgPT4ge1xuICAgICAgICAgIExpdmVVcGxvYWRlci51bnRyYWNrRmlsZSh0aGlzLmZpbGVFbCwgdGhpcy5maWxlKTtcbiAgICAgICAgICB0aGlzLl9vbkRvbmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMudmlldy5wdXNoRmlsZVByb2dyZXNzKHRoaXMuZmlsZUVsLCB0aGlzLnJlZiwgdGhpcy5fcHJvZ3Jlc3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzQ2FuY2VsbGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgdGhpcy5faXNEb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9vbkRvbmUoKTtcbiAgfVxuXG4gIGlzRG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEb25lO1xuICB9XG5cbiAgZXJyb3IocmVhc29uID0gXCJmYWlsZWRcIikge1xuICAgIHRoaXMuZmlsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoUEhYX0xJVkVfRklMRV9VUERBVEVELCB0aGlzLl9vbkVsVXBkYXRlZCk7XG4gICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB7IGVycm9yOiByZWFzb24gfSk7XG4gICAgaWYgKCF0aGlzLmlzQXV0b1VwbG9hZCgpKSB7XG4gICAgICBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyh0aGlzLmZpbGVFbCk7XG4gICAgfVxuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICAvL3ByaXZhdGVcblxuICBvbkRvbmUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkRvbmUgPSAoKSA9PiB7XG4gICAgICB0aGlzLmZpbGVFbC5yZW1vdmVFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG5cbiAgb25FbFVwZGF0ZWQoKSB7XG4gICAgY29uc3QgYWN0aXZlUmVmcyA9IHRoaXMuZmlsZUVsXG4gICAgICAuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUylcbiAgICAgIC5zcGxpdChcIixcIik7XG4gICAgaWYgKGFjdGl2ZVJlZnMuaW5kZXhPZih0aGlzLnJlZikgPT09IC0xKSB7XG4gICAgICBMaXZlVXBsb2FkZXIudW50cmFja0ZpbGUodGhpcy5maWxlRWwsIHRoaXMuZmlsZSk7XG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHRvUHJlZmxpZ2h0UGF5bG9hZCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9tb2RpZmllZDogdGhpcy5maWxlLmxhc3RNb2RpZmllZCxcbiAgICAgIG5hbWU6IHRoaXMuZmlsZS5uYW1lLFxuICAgICAgcmVsYXRpdmVfcGF0aDogdGhpcy5maWxlLndlYmtpdFJlbGF0aXZlUGF0aCxcbiAgICAgIHNpemU6IHRoaXMuZmlsZS5zaXplLFxuICAgICAgdHlwZTogdGhpcy5maWxlLnR5cGUsXG4gICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgbWV0YTogdHlwZW9mIHRoaXMuZmlsZS5tZXRhID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmZpbGUubWV0YSgpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICB1cGxvYWRlcih1cGxvYWRlcnMpIHtcbiAgICBpZiAodGhpcy5tZXRhLnVwbG9hZGVyKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9XG4gICAgICAgIHVwbG9hZGVyc1t0aGlzLm1ldGEudXBsb2FkZXJdIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciAke3RoaXMubWV0YS51cGxvYWRlcn1gKTtcbiAgICAgIHJldHVybiB7IG5hbWU6IHRoaXMubWV0YS51cGxvYWRlciwgY2FsbGJhY2s6IGNhbGxiYWNrIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiY2hhbm5lbFwiLCBjYWxsYmFjazogY2hhbm5lbFVwbG9hZGVyIH07XG4gICAgfVxuICB9XG5cbiAgemlwUG9zdEZsaWdodChyZXNwKSB7XG4gICAgdGhpcy5tZXRhID0gcmVzcC5lbnRyaWVzW3RoaXMucmVmXTtcbiAgICBpZiAoIXRoaXMubWV0YSkge1xuICAgICAgbG9nRXJyb3IoYG5vIHByZWZsaWdodCB1cGxvYWQgcmVzcG9uc2UgcmV0dXJuZWQgd2l0aCByZWYgJHt0aGlzLnJlZn1gLCB7XG4gICAgICAgIGlucHV0OiB0aGlzLmZpbGVFbCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3AsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBQSFhfRE9ORV9SRUZTLFxuICBQSFhfUFJFRkxJR0hURURfUkVGUyxcbiAgUEhYX1VQTE9BRF9SRUYsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQge30gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBVcGxvYWRFbnRyeSBmcm9tIFwiLi91cGxvYWRfZW50cnlcIjtcblxubGV0IGxpdmVVcGxvYWRlckZpbGVSZWYgPSAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXZlVXBsb2FkZXIge1xuICBzdGF0aWMgZ2VuRmlsZVJlZihmaWxlKSB7XG4gICAgY29uc3QgcmVmID0gZmlsZS5fcGh4UmVmO1xuICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZS5fcGh4UmVmID0gKGxpdmVVcGxvYWRlckZpbGVSZWYrKykudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiBmaWxlLl9waHhSZWY7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEVudHJ5RGF0YVVSTChpbnB1dEVsLCByZWYsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuYWN0aXZlRmlsZXMoaW5wdXRFbCkuZmluZChcbiAgICAgIChmaWxlKSA9PiB0aGlzLmdlbkZpbGVSZWYoZmlsZSkgPT09IHJlZixcbiAgICApO1xuICAgIGNhbGxiYWNrKFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSkpO1xuICB9XG5cbiAgc3RhdGljIGhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkge1xuICAgIGxldCBhY3RpdmUgPSAwO1xuICAgIERPTS5maW5kVXBsb2FkSW5wdXRzKGZvcm1FbCkuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSAhPT1cbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9ET05FX1JFRlMpXG4gICAgICApIHtcbiAgICAgICAgYWN0aXZlKys7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGl2ZSA+IDA7XG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpO1xuICAgIGNvbnN0IGZpbGVEYXRhID0ge307XG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSB7IHBhdGg6IGlucHV0RWwubmFtZSB9O1xuICAgICAgY29uc3QgdXBsb2FkUmVmID0gaW5wdXRFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpO1xuICAgICAgZmlsZURhdGFbdXBsb2FkUmVmXSA9IGZpbGVEYXRhW3VwbG9hZFJlZl0gfHwgW107XG4gICAgICBlbnRyeS5yZWYgPSB0aGlzLmdlbkZpbGVSZWYoZmlsZSk7XG4gICAgICBlbnRyeS5sYXN0X21vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQ7XG4gICAgICBlbnRyeS5uYW1lID0gZmlsZS5uYW1lIHx8IGVudHJ5LnJlZjtcbiAgICAgIGVudHJ5LnJlbGF0aXZlX3BhdGggPSBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aDtcbiAgICAgIGVudHJ5LnR5cGUgPSBmaWxlLnR5cGU7XG4gICAgICBlbnRyeS5zaXplID0gZmlsZS5zaXplO1xuICAgICAgaWYgKHR5cGVvZiBmaWxlLm1ldGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBlbnRyeS5tZXRhID0gZmlsZS5tZXRhKCk7XG4gICAgICB9XG4gICAgICBmaWxlRGF0YVt1cGxvYWRSZWZdLnB1c2goZW50cnkpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWxlRGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBjbGVhckZpbGVzKGlucHV0RWwpIHtcbiAgICBpbnB1dEVsLnZhbHVlID0gbnVsbDtcbiAgICBpbnB1dEVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRik7XG4gICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSk7XG4gIH1cblxuICBzdGF0aWMgdW50cmFja0ZpbGUoaW5wdXRFbCwgZmlsZSkge1xuICAgIERPTS5wdXRQcml2YXRlKFxuICAgICAgaW5wdXRFbCxcbiAgICAgIFwiZmlsZXNcIixcbiAgICAgIERPTS5wcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIikuZmlsdGVyKChmKSA9PiAhT2JqZWN0LmlzKGYsIGZpbGUpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gaW5wdXRFbFxuICAgKiBAcGFyYW0ge0FycmF5PEZpbGV8QmxvYj59IGZpbGVzXG4gICAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBbZGF0YVRyYW5zZmVyXVxuICAgKi9cbiAgc3RhdGljIHRyYWNrRmlsZXMoaW5wdXRFbCwgZmlsZXMsIGRhdGFUcmFuc2Zlcikge1xuICAgIGlmIChpbnB1dEVsLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBuZXdGaWxlcyA9IGZpbGVzLmZpbHRlcihcbiAgICAgICAgKGZpbGUpID0+ICF0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoKGYpID0+IE9iamVjdC5pcyhmLCBmaWxlKSksXG4gICAgICApO1xuICAgICAgRE9NLnVwZGF0ZVByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSwgKGV4aXN0aW5nKSA9PlxuICAgICAgICBleGlzdGluZy5jb25jYXQobmV3RmlsZXMpLFxuICAgICAgKTtcbiAgICAgIGlucHV0RWwudmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBpbnB1dEVsIGZpbGVzIHRvIGFsaWduIG91dHB1dCB3aXRoIHByb2dyYW1tYXRpYyBjaGFuZ2VzIChpLmUuIGRyYWcgYW5kIGRyb3ApXG4gICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlucHV0RWwuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgICB9XG4gICAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIGZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZUlucHV0cyhmb3JtRWwpIHtcbiAgICBjb25zdCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlSW5wdXRzKS5maWx0ZXIoXG4gICAgICAoZWwpID0+IGVsLmZpbGVzICYmIHRoaXMuYWN0aXZlRmlsZXMoZWwpLmxlbmd0aCA+IDAsXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBhY3RpdmVGaWxlcyhpbnB1dCkge1xuICAgIHJldHVybiAoRE9NLnByaXZhdGUoaW5wdXQsIFwiZmlsZXNcIikgfHwgW10pLmZpbHRlcigoZikgPT5cbiAgICAgIFVwbG9hZEVudHJ5LmlzQWN0aXZlKGlucHV0LCBmKSxcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGlucHV0c0F3YWl0aW5nUHJlZmxpZ2h0KGZvcm1FbCkge1xuICAgIGNvbnN0IGZpbGVJbnB1dHMgPSBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihcbiAgICAgIChpbnB1dCkgPT4gdGhpcy5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0KS5sZW5ndGggPiAwLFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0KS5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgIVVwbG9hZEVudHJ5LmlzUHJlZmxpZ2h0ZWQoaW5wdXQsIGYpICYmXG4gICAgICAgICFVcGxvYWRFbnRyeS5pc1ByZWZsaWdodEluUHJvZ3Jlc3MoZiksXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBtYXJrUHJlZmxpZ2h0SW5Qcm9ncmVzcyhlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gVXBsb2FkRW50cnkubWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZW50cnkuZmlsZSkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoaW5wdXRFbCwgdmlldywgb25Db21wbGV0ZSkge1xuICAgIHRoaXMuYXV0b1VwbG9hZCA9IERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCk7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLm9uQ29tcGxldGUgPSBvbkNvbXBsZXRlO1xuICAgIHRoaXMuX2VudHJpZXMgPSBBcnJheS5mcm9tKFxuICAgICAgTGl2ZVVwbG9hZGVyLmZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXRFbCkgfHwgW10sXG4gICAgKS5tYXAoKGZpbGUpID0+IG5ldyBVcGxvYWRFbnRyeShpbnB1dEVsLCBmaWxlLCB2aWV3LCB0aGlzLmF1dG9VcGxvYWQpKTtcblxuICAgIC8vIHByZXZlbnQgc2VuZGluZyBkdXBsaWNhdGUgcHJlZmxpZ2h0IHJlcXVlc3RzXG4gICAgTGl2ZVVwbG9hZGVyLm1hcmtQcmVmbGlnaHRJblByb2dyZXNzKHRoaXMuX2VudHJpZXMpO1xuXG4gICAgdGhpcy5udW1FbnRyaWVzSW5Qcm9ncmVzcyA9IHRoaXMuX2VudHJpZXMubGVuZ3RoO1xuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICBlbnRyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzO1xuICB9XG5cbiAgaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgbGl2ZVNvY2tldCkge1xuICAgIHRoaXMuX2VudHJpZXMgPSB0aGlzLl9lbnRyaWVzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS5pc0NhbmNlbGxlZCgpKSB7XG4gICAgICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICB0aGlzLm9uQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuemlwUG9zdEZsaWdodChyZXNwKTtcbiAgICAgICAgZW50cnkub25Eb25lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm51bUVudHJpZXNJblByb2dyZXNzLS07XG4gICAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBncm91cGVkRW50cmllcyA9IHRoaXMuX2VudHJpZXMucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgICBpZiAoIWVudHJ5Lm1ldGEpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgbmFtZSwgY2FsbGJhY2sgfSA9IGVudHJ5LnVwbG9hZGVyKGxpdmVTb2NrZXQudXBsb2FkZXJzKTtcbiAgICAgIGFjY1tuYW1lXSA9IGFjY1tuYW1lXSB8fCB7IGNhbGxiYWNrOiBjYWxsYmFjaywgZW50cmllczogW10gfTtcbiAgICAgIGFjY1tuYW1lXS5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZ3JvdXBlZEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIGVudHJpZXMgfSA9IGdyb3VwZWRFbnRyaWVzW25hbWVdO1xuICAgICAgY2FsbGJhY2soZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldCk7XG4gICAgfVxuICB9XG59XG4iLCAiY29uc3QgQVJJQSA9IHtcbiAgYW55T2YoaW5zdGFuY2UsIGNsYXNzZXMpIHtcbiAgICByZXR1cm4gY2xhc3Nlcy5maW5kKChuYW1lKSA9PiBpbnN0YW5jZSBpbnN0YW5jZW9mIG5hbWUpO1xuICB9LFxuXG4gIGlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWwucmVsICE9PSBcImlnbm9yZVwiKSB8fFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFyZWFFbGVtZW50ICYmIGVsLmhyZWYgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICghZWwuZGlzYWJsZWQgJiZcbiAgICAgICAgdGhpcy5hbnlPZihlbCwgW1xuICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFNlbGVjdEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFRleHRBcmVhRWxlbWVudCxcbiAgICAgICAgICBIVE1MQnV0dG9uRWxlbWVudCxcbiAgICAgICAgXSkpIHx8XG4gICAgICBlbCBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50IHx8XG4gICAgICAoZWwudGFiSW5kZXggPj0gMCAmJiBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpIHx8XG4gICAgICAoIWludGVyYWN0aXZlT25seSAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAhPT0gbnVsbCAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpXG4gICAgKTtcbiAgfSxcblxuICBhdHRlbXB0Rm9jdXMoZWwsIGludGVyYWN0aXZlT25seSkge1xuICAgIGlmICh0aGlzLmlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIHRoYXQncyBmaW5lXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5pc1NhbWVOb2RlKGVsKTtcbiAgfSxcblxuICBmb2N1c0ZpcnN0SW50ZXJhY3RpdmUoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCwgdHJ1ZSkgfHwgdGhpcy5mb2N1c0ZpcnN0SW50ZXJhY3RpdmUoY2hpbGQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxuXG4gIGZvY3VzRmlyc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCkgfHwgdGhpcy5mb2N1c0ZpcnN0KGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gY2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgfSxcblxuICBmb2N1c0xhc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5sYXN0RWxlbWVudENoaWxkO1xuICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgaWYgKHRoaXMuYXR0ZW1wdEZvY3VzKGNoaWxkKSB8fCB0aGlzLmZvY3VzTGFzdChjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjaGlsZCA9IGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEFSSUE7XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxuICBQSFhfVVBMT0FEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuaW1wb3J0IEFSSUEgZnJvbSBcIi4vYXJpYVwiO1xuXG5jb25zdCBIb29rcyA9IHtcbiAgTGl2ZUZpbGVVcGxvYWQ6IHtcbiAgICBhY3RpdmVSZWZzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUyk7XG4gICAgfSxcblxuICAgIHByZWZsaWdodGVkUmVmcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfUFJFRkxJR0hURURfUkVGUyk7XG4gICAgfSxcblxuICAgIG1vdW50ZWQoKSB7XG4gICAgICB0aGlzLnByZWZsaWdodGVkV2FzID0gdGhpcy5wcmVmbGlnaHRlZFJlZnMoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlZCgpIHtcbiAgICAgIGNvbnN0IG5ld1ByZWZsaWdodHMgPSB0aGlzLnByZWZsaWdodGVkUmVmcygpO1xuICAgICAgaWYgKHRoaXMucHJlZmxpZ2h0ZWRXYXMgIT09IG5ld1ByZWZsaWdodHMpIHtcbiAgICAgICAgdGhpcy5wcmVmbGlnaHRlZFdhcyA9IG5ld1ByZWZsaWdodHM7XG4gICAgICAgIGlmIChuZXdQcmVmbGlnaHRzID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5fX3ZpZXcoKS5jYW5jZWxTdWJtaXQodGhpcy5lbC5mb3JtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hY3RpdmVSZWZzKCkgPT09IFwiXCIpIHtcbiAgICAgICAgdGhpcy5lbC52YWx1ZSA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCkpO1xuICAgIH0sXG4gIH0sXG5cbiAgTGl2ZUltZ1ByZXZpZXc6IHtcbiAgICBtb3VudGVkKCkge1xuICAgICAgdGhpcy5yZWYgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWVudHJ5LXJlZlwiKTtcbiAgICAgIHRoaXMuaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLmdldEVudHJ5RGF0YVVSTCh0aGlzLmlucHV0RWwsIHRoaXMucmVmLCAodXJsKSA9PiB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVzdHJveWVkKCkge1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnVybCk7XG4gICAgfSxcbiAgfSxcbiAgRm9jdXNXcmFwOiB7XG4gICAgbW91bnRlZCgpIHtcbiAgICAgIHRoaXMuZm9jdXNTdGFydCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICB0aGlzLmZvY3VzRW5kID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgdGhpcy5mb2N1c1N0YXJ0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgQVJJQS5hdHRlbXB0Rm9jdXMobmV4dEZvY3VzKSB8fCBBUklBLmZvY3VzRmlyc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzTGFzdCh0aGlzLmVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvY3VzRW5kLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBTaGlmdCtUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIEFSSUEuYXR0ZW1wdEZvY3VzKG5leHRGb2N1cykgfHwgQVJJQS5mb2N1c0xhc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzRmlyc3QodGhpcy5lbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gb25seSB0cnkgdG8gY2hhbmdlIHRoZSBmb2N1cyBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnNpZGVcbiAgICAgIGlmICghdGhpcy5lbC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6c2hvdy1lbmRcIiwgKCkgPT4gdGhpcy5lbC5mb2N1cygpKTtcbiAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwpLmRpc3BsYXkgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgQVJJQS5mb2N1c0ZpcnN0KHRoaXMuZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IGZpbmRTY3JvbGxDb250YWluZXIgPSAoZWwpID0+IHtcbiAgLy8gdGhlIHNjcm9sbCBldmVudCB3b24ndCBiZSBmaXJlZCBvbiB0aGUgaHRtbC9ib2R5IGVsZW1lbnQgZXZlbiBpZiBvdmVyZmxvdyBpcyBzZXRcbiAgLy8gdGhlcmVmb3JlIHdlIHJldHVybiBudWxsIHRvIGluc3RlYWQgbGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzIG9uIGRvY3VtZW50XG4gIGlmIChbXCJIVE1MXCIsIFwiQk9EWVwiXS5pbmRleE9mKGVsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpID49IDApIHJldHVybiBudWxsO1xuICBpZiAoW1wic2Nyb2xsXCIsIFwiYXV0b1wiXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWwpLm92ZXJmbG93WSkgPj0gMClcbiAgICByZXR1cm4gZWw7XG4gIHJldHVybiBmaW5kU2Nyb2xsQ29udGFpbmVyKGVsLnBhcmVudEVsZW1lbnQpO1xufTtcblxuY29uc3Qgc2Nyb2xsVG9wID0gKHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgcmV0dXJuIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3A7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG4gIH1cbn07XG5cbmNvbnN0IGJvdHRvbSA9IChzY3JvbGxDb250YWluZXIpID0+IHtcbiAgaWYgKHNjcm9sbENvbnRhaW5lcikge1xuICAgIHJldHVybiBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO1xuICB9IGVsc2Uge1xuICAgIC8vIHdoZW4gd2UgaGF2ZSBubyBjb250YWluZXIsIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSBib3R0b20gY29vcmRpbmF0ZSBpcyB0aGUgdmlld3BvcnQgaGVpZ2h0XG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICB9XG59O1xuXG5jb25zdCB0b3AgPSAoc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGlmIChzY3JvbGxDb250YWluZXIpIHtcbiAgICByZXR1cm4gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgfSBlbHNlIHtcbiAgICAvLyB3aGVuIHdlIGhhdmUgbm8gY29udGFpbmVyIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSB0b3AgY29vcmRpbmF0ZSBpcyAwXG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbmNvbnN0IGlzQXRWaWV3cG9ydFRvcCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5jb25zdCBpc0F0Vmlld3BvcnRCb3R0b20gPSAoZWwsIHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiAoXG4gICAgTWF0aC5jZWlsKHJlY3QuYm90dG9tKSA+PSB0b3Aoc2Nyb2xsQ29udGFpbmVyKSAmJlxuICAgIE1hdGguY2VpbChyZWN0LmxlZnQpID49IDAgJiZcbiAgICBNYXRoLmZsb29yKHJlY3QuYm90dG9tKSA8PSBib3R0b20oc2Nyb2xsQ29udGFpbmVyKVxuICApO1xufTtcblxuY29uc3QgaXNXaXRoaW5WaWV3cG9ydCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5Ib29rcy5JbmZpbml0ZVNjcm9sbCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IGZpbmRTY3JvbGxDb250YWluZXIodGhpcy5lbCk7XG4gICAgbGV0IHNjcm9sbEJlZm9yZSA9IHNjcm9sbFRvcCh0aGlzLnNjcm9sbENvbnRhaW5lcik7XG4gICAgbGV0IHRvcE92ZXJyYW4gPSBmYWxzZTtcbiAgICBjb25zdCB0aHJvdHRsZUludGVydmFsID0gNTAwO1xuICAgIGxldCBwZW5kaW5nT3AgPSBudWxsO1xuXG4gICAgY29uc3Qgb25Ub3BPdmVycnVuID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAodG9wRXZlbnQsIGZpcnN0Q2hpbGQpID0+IHtcbiAgICAgICAgcGVuZGluZ09wID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkLCBfb3ZlcnJhbjogdHJ1ZSB9LFxuICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nT3AgPSBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25GaXJzdENoaWxkQXRUb3AgPSB0aGlzLnRocm90dGxlKFxuICAgICAgdGhyb3R0bGVJbnRlcnZhbCxcbiAgICAgICh0b3BFdmVudCwgZmlyc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkIH0sXG4gICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHBlbmRpbmdPcCA9IG51bGw7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgRE9NIGlzIHBhdGNoZWQgYnkgd2FpdGluZyBmb3IgdGhlIG5leHQgdGlja1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaXNXaXRoaW5WaWV3cG9ydChmaXJzdENoaWxkLCB0aGlzLnNjcm9sbENvbnRhaW5lcikpIHtcbiAgICAgICAgICAgICAgICBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBvbkxhc3RDaGlsZEF0Qm90dG9tID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAoYm90dG9tRXZlbnQsIGxhc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBsYXN0Q2hpbGQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogXCJlbmRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCBib3R0b21FdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBsYXN0Q2hpbGQuaWQgfSxcbiAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgcGVuZGluZ09wID0gbnVsbDtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgcGF0Y2hlZCBieSB3YWl0aW5nIGZvciB0aGUgbmV4dCB0aWNrXG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFpc1dpdGhpblZpZXdwb3J0KGxhc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpKSB7XG4gICAgICAgICAgICAgICAgbGFzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwiZW5kXCIgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5vblNjcm9sbCA9IChfZSkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsTm93ID0gc2Nyb2xsVG9wKHRoaXMuc2Nyb2xsQ29udGFpbmVyKTtcblxuICAgICAgaWYgKHBlbmRpbmdPcCkge1xuICAgICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgICAgIHJldHVybiBwZW5kaW5nT3AoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9wRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC10b3BcIiksXG4gICAgICApO1xuICAgICAgY29uc3QgYm90dG9tRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC1ib3R0b21cIiksXG4gICAgICApO1xuICAgICAgY29uc3QgbGFzdENoaWxkID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICBjb25zdCBpc1Njcm9sbGluZ1VwID0gc2Nyb2xsTm93IDwgc2Nyb2xsQmVmb3JlO1xuICAgICAgY29uc3QgaXNTY3JvbGxpbmdEb3duID0gc2Nyb2xsTm93ID4gc2Nyb2xsQmVmb3JlO1xuXG4gICAgICAvLyBlbCBvdmVycmFuIHdoaWxlIHNjcm9sbGluZyB1cFxuICAgICAgaWYgKGlzU2Nyb2xsaW5nVXAgJiYgdG9wRXZlbnQgJiYgIXRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPj0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gdHJ1ZTtcbiAgICAgICAgb25Ub3BPdmVycnVuKHRvcEV2ZW50LCBmaXJzdENoaWxkKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNTY3JvbGxpbmdEb3duICYmIHRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPD0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdG9wRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdVcCAmJlxuICAgICAgICBpc0F0Vmlld3BvcnRUb3AoZmlyc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpXG4gICAgICApIHtcbiAgICAgICAgb25GaXJzdENoaWxkQXRUb3AodG9wRXZlbnQsIGZpcnN0Q2hpbGQpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgYm90dG9tRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdEb3duICYmXG4gICAgICAgIGlzQXRWaWV3cG9ydEJvdHRvbShsYXN0Q2hpbGQsIHRoaXMuc2Nyb2xsQ29udGFpbmVyKVxuICAgICAgKSB7XG4gICAgICAgIG9uTGFzdENoaWxkQXRCb3R0b20oYm90dG9tRXZlbnQsIGxhc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfVxuICB9LFxuXG4gIGRlc3Ryb3llZCgpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXIpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgIH1cbiAgfSxcblxuICB0aHJvdHRsZShpbnRlcnZhbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgbGFzdENhbGxBdCA9IDA7XG4gICAgbGV0IHRpbWVyO1xuXG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVtYWluaW5nVGltZSA9IGludGVydmFsIC0gKG5vdyAtIGxhc3RDYWxsQXQpO1xuXG4gICAgICBpZiAocmVtYWluaW5nVGltZSA8PSAwIHx8IHJlbWFpbmluZ1RpbWUgPiBpbnRlcnZhbCkge1xuICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsYXN0Q2FsbEF0ID0gbm93O1xuICAgICAgICBjYWxsYmFjayguLi5hcmdzKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgbGFzdENhbGxBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGNhbGxiYWNrKC4uLmFyZ3MpO1xuICAgICAgICB9LCByZW1haW5pbmdUaW1lKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEhvb2tzO1xuIiwgImltcG9ydCB7XG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1BFTkRJTkdfUkVGUyxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFBIWF9ESVNBQkxFRCxcbiAgUEhYX1JFQURPTkxZLFxuICBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbGVtZW50UmVmIHtcbiAgc3RhdGljIG9uVW5sb2NrKGVsLCBjYWxsYmFjaykge1xuICAgIGlmICghRE9NLmlzTG9ja2VkKGVsKSAmJiAhZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNvbnN0IGNsb3Nlc3RMb2NrID0gZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKTtcbiAgICBjb25zdCByZWYgPSBjbG9zZXN0TG9ja1xuICAgICAgLmNsb3Nlc3QoYFske1BIWF9SRUZfTE9DS31dYClcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLKTtcbiAgICBjbG9zZXN0TG9jay5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDp1bmRvLWxvY2s6JHtyZWZ9YCxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sXG4gICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5sb2FkaW5nUmVmID0gZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORylcbiAgICAgID8gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyksIDEwKVxuICAgICAgOiBudWxsO1xuICAgIHRoaXMubG9ja1JlZiA9IGVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spXG4gICAgICA/IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spLCAxMClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIHB1YmxpY1xuXG4gIG1heWJlVW5kbyhyZWYsIHBoeEV2ZW50LCBlYWNoQ2xvbmVDYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5pc1dpdGhpbihyZWYpKSB7XG4gICAgICAvLyB3ZSBjYW5ub3QgdW5kbyB0aGUgbG9jayAvIGxvYWRpbmcgbm93LCBhcyB0aGVyZSBpcyBhIG5ld2VyIG9uZSBhbHJlYWR5IHNldDtcbiAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIHJlZiB3ZSB0cmllZCB0byBzZW5kIHRoZSB1bmRvIGV2ZW50IGxhdGVyXG4gICAgICBET00udXBkYXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUEVORElOR19SRUZTLCBbXSwgKHBlbmRpbmdSZWZzKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdW5kbyBsb2NrcyBhbmQgYXBwbHkgY2xvbmVzXG4gICAgdGhpcy51bmRvTG9ja3MocmVmLCBwaHhFdmVudCwgZWFjaENsb25lQ2FsbGJhY2spO1xuXG4gICAgLy8gdW5kbyBsb2FkaW5nIHN0YXRlc1xuICAgIHRoaXMudW5kb0xvYWRpbmcocmVmLCBwaHhFdmVudCk7XG5cbiAgICAvLyBlbnN1cmUgdW5kbyBldmVudHMgYXJlIGZpcmVkIGZvciBwZW5kaW5nIHJlZnMgdGhhdFxuICAgIC8vIGFyZSByZXNvbHZlZCBieSB0aGUgY3VycmVudCByZWYsIG90aGVyd2lzZSB3ZSdkIGxlYWsgZXZlbnQgbGlzdGVuZXJzXG4gICAgRE9NLnVwZGF0ZVByaXZhdGUodGhpcy5lbCwgUEhYX1BFTkRJTkdfUkVGUywgW10sIChwZW5kaW5nUmVmcykgPT4ge1xuICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzLmZpbHRlcigocGVuZGluZ1JlZikgPT4ge1xuICAgICAgICBsZXQgb3B0cyA9IHtcbiAgICAgICAgICBkZXRhaWw6IHsgcmVmOiBwZW5kaW5nUmVmLCBldmVudDogcGh4RXZlbnQgfSxcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nUmVmICYmIHRoaXMubG9hZGluZ1JlZiA+IHBlbmRpbmdSZWYpIHtcbiAgICAgICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvYWRpbmc6JHtwZW5kaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9ja1JlZiAmJiB0aGlzLmxvY2tSZWYgPiBwZW5kaW5nUmVmKSB7XG4gICAgICAgICAgdGhpcy5lbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2NrOiR7cGVuZGluZ1JlZn1gLCBvcHRzKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZW5kaW5nUmVmID4gcmVmO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBjbGVhbiB1cCBpZiBmdWxseSByZXNvbHZlZFxuICAgIGlmICh0aGlzLmlzRnVsbHlSZXNvbHZlZEJ5KHJlZikpIHtcbiAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfU1JDKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcml2YXRlXG5cbiAgaXNXaXRoaW4ocmVmKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICB0aGlzLmxvYWRpbmdSZWYgIT09IG51bGwgJiZcbiAgICAgIHRoaXMubG9hZGluZ1JlZiA+IHJlZiAmJlxuICAgICAgdGhpcy5sb2NrUmVmICE9PSBudWxsICYmXG4gICAgICB0aGlzLmxvY2tSZWYgPiByZWZcbiAgICApO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGNsb25lZCBQSFhfUkVGX0xPQ0sgZWxlbWVudCB0aGF0IGhhcyBiZWVuIG1vcnBoZWQgYmVoaW5kXG4gIC8vIHRoZSBzY2VuZXMgd2hpbGUgdGhpcyBlbGVtZW50IHdhcyBsb2NrZWQgaW4gdGhlIERPTS5cbiAgLy8gV2hlbiB3ZSBhcHBseSB0aGUgY2xvbmVkIHRyZWUgdG8gdGhlIGFjdGl2ZSBET00gZWxlbWVudCwgd2UgbXVzdFxuICAvL1xuICAvLyAgIDEuIGV4ZWN1dGUgcGVuZGluZyBtb3VudGVkIGhvb2tzIGZvciBub2RlcyBub3cgaW4gdGhlIERPTVxuICAvLyAgIDIuIHVuZG8gYW55IHJlZiBpbnNpZGUgdGhlIGNsb25lZCB0cmVlIHRoYXQgaGFzIHNpbmNlIGJlZW4gYWNrJ2RcbiAgdW5kb0xvY2tzKHJlZiwgcGh4RXZlbnQsIGVhY2hDbG9uZUNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9ja1VuZG9uZUJ5KHJlZikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbG9uZWRUcmVlID0gRE9NLnByaXZhdGUodGhpcy5lbCwgUEhYX1JFRl9MT0NLKTtcbiAgICBpZiAoY2xvbmVkVHJlZSkge1xuICAgICAgZWFjaENsb25lQ2FsbGJhY2soY2xvbmVkVHJlZSk7XG4gICAgICBET00uZGVsZXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUkVGX0xPQ0spO1xuICAgIH1cbiAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuXG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvY2s6JHt0aGlzLmxvY2tSZWZ9YCwgb3B0cyksXG4gICAgKTtcbiAgfVxuXG4gIHVuZG9Mb2FkaW5nKHJlZiwgcGh4RXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nVW5kb25lQnkocmVmKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNhblVuZG9Mb2FkaW5nKHJlZikgJiZcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgICkge1xuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXCJwaHgtY2hhbmdlLWxvYWRpbmdcIik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9MT0FESU5HKTtcbiAgICAgIGNvbnN0IGRpc2FibGVkVmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVEKTtcbiAgICAgIGNvbnN0IHJlYWRPbmx5VmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIC8vIHJlc3RvcmUgaW5wdXRzXG4gICAgICBpZiAocmVhZE9ubHlWYWwgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbC5yZWFkT25seSA9IHJlYWRPbmx5VmFsID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZFZhbCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVsLmRpc2FibGVkID0gZGlzYWJsZWRWYWwgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfRElTQUJMRUQpO1xuICAgICAgfVxuICAgICAgLy8gcmVzdG9yZSBkaXNhYmxlc1xuICAgICAgY29uc3QgZGlzYWJsZVJlc3RvcmUgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUpO1xuICAgICAgaWYgKGRpc2FibGVSZXN0b3JlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVJlc3RvcmU7XG4gICAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2FkaW5nOiR7dGhpcy5sb2FkaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgY2xhc3Nlc1xuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgIGlmIChuYW1lICE9PSBcInBoeC1zdWJtaXQtbG9hZGluZ1wiIHx8IHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgICBET00ucmVtb3ZlQ2xhc3ModGhpcy5lbCwgbmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpc0xvYWRpbmdVbmRvbmVCeShyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nUmVmID09PSBudWxsID8gZmFsc2UgOiB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmO1xuICB9XG4gIGlzTG9ja1VuZG9uZUJ5KHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgPyBmYWxzZSA6IHRoaXMubG9ja1JlZiA8PSByZWY7XG4gIH1cblxuICBpc0Z1bGx5UmVzb2x2ZWRCeShyZWYpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMubG9hZGluZ1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmKSAmJlxuICAgICAgKHRoaXMubG9ja1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvY2tSZWYgPD0gcmVmKVxuICAgICk7XG4gIH1cblxuICAvLyBvbmx5IHJlbW92ZSB0aGUgcGh4LXN1Ym1pdC1sb2FkaW5nIGNsYXNzIGlmIHdlIGFyZSBub3QgbG9ja2VkXG4gIGNhblVuZG9Mb2FkaW5nKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgfHwgdGhpcy5sb2NrUmVmIDw9IHJlZjtcbiAgfVxufVxuIiwgImltcG9ydCB7IG1heWJlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRE9NUG9zdE1vcnBoUmVzdG9yZXIge1xuICBjb25zdHJ1Y3Rvcihjb250YWluZXJCZWZvcmUsIGNvbnRhaW5lckFmdGVyLCB1cGRhdGVUeXBlKSB7XG4gICAgY29uc3QgaWRzQmVmb3JlID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGlkc0FmdGVyID0gbmV3IFNldChcbiAgICAgIFsuLi5jb250YWluZXJBZnRlci5jaGlsZHJlbl0ubWFwKChjaGlsZCkgPT4gY2hpbGQuaWQpLFxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50c1RvTW9kaWZ5ID0gW107XG5cbiAgICBBcnJheS5mcm9tKGNvbnRhaW5lckJlZm9yZS5jaGlsZHJlbikuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZC5pZCkge1xuICAgICAgICAvLyBhbGwgb2Ygb3VyIGNoaWxkcmVuIHNob3VsZCBiZSBlbGVtZW50cyB3aXRoIGlkc1xuICAgICAgICBpZHNCZWZvcmUuYWRkKGNoaWxkLmlkKTtcbiAgICAgICAgaWYgKGlkc0FmdGVyLmhhcyhjaGlsZC5pZCkpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnRJZCA9XG4gICAgICAgICAgICBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmIGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQ7XG4gICAgICAgICAgZWxlbWVudHNUb01vZGlmeS5wdXNoKHtcbiAgICAgICAgICAgIGVsZW1lbnRJZDogY2hpbGQuaWQsXG4gICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRJZDogcHJldmlvdXNFbGVtZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJBZnRlci5pZDtcbiAgICB0aGlzLnVwZGF0ZVR5cGUgPSB1cGRhdGVUeXBlO1xuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeSA9IGVsZW1lbnRzVG9Nb2RpZnk7XG4gICAgdGhpcy5lbGVtZW50SWRzVG9BZGQgPSBbLi4uaWRzQWZ0ZXJdLmZpbHRlcigoaWQpID0+ICFpZHNCZWZvcmUuaGFzKGlkKSk7XG4gIH1cblxuICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIHRvIG9wdGltaXplIGFwcGVuZC9wcmVwZW5kIG9wZXJhdGlvbnM6XG4gIC8vICAgMSkgVHJhY2sgaWRzIG9mIG1vZGlmaWVkIGVsZW1lbnRzICYgb2YgbmV3IGVsZW1lbnRzXG4gIC8vICAgMikgQWxsIHRoZSBtb2RpZmllZCBlbGVtZW50cyBhcmUgcHV0IGJhY2sgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIERPTSB0cmVlXG4gIC8vICAgICAgYnkgc3RvcmluZyB0aGUgaWQgb2YgdGhlaXIgcHJldmlvdXMgc2libGluZ1xuICAvLyAgIDMpIE5ldyBlbGVtZW50cyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSBieSBtb3JwaGRvbSBkdXJpbmcgYXBwZW5kLlxuICAvLyAgICAgIEZvciBwcmVwZW5kLCB3ZSBtb3ZlIHRoZW0gdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBjb250YWluZXJcbiAgcGVyZm9ybSgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBET00uYnlJZCh0aGlzLmNvbnRhaW5lcklkKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzVG9Nb2RpZnkuZm9yRWFjaCgoZWxlbWVudFRvTW9kaWZ5KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudFRvTW9kaWZ5LnByZXZpb3VzRWxlbWVudElkKSB7XG4gICAgICAgIG1heWJlKFxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5wcmV2aW91c0VsZW1lbnRJZCksXG4gICAgICAgICAgKHByZXZpb3VzRWxlbSkgPT4ge1xuICAgICAgICAgICAgbWF5YmUoXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLFxuICAgICAgICAgICAgICAoZWxlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID1cbiAgICAgICAgICAgICAgICAgIGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkID09IHByZXZpb3VzRWxlbS5pZDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzSW5SaWdodFBsYWNlKSB7XG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJlbmRcIiwgZWxlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCAoZWxlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID0gZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID09IG51bGw7XG4gICAgICAgICAgaWYgKCFpc0luUmlnaHRQbGFjZSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnVwZGF0ZVR5cGUgPT0gXCJwcmVwZW5kXCIpIHtcbiAgICAgIHRoaXMuZWxlbWVudElkc1RvQWRkLnJldmVyc2UoKS5mb3JFYWNoKChlbGVtSWQpID0+IHtcbiAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbUlkKSwgKGVsZW0pID0+XG4gICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJ2YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG5mdW5jdGlvbiBtb3JwaEF0dHJzKGZyb21Ob2RlLCB0b05vZGUpIHtcbiAgICB2YXIgdG9Ob2RlQXR0cnMgPSB0b05vZGUuYXR0cmlidXRlcztcbiAgICB2YXIgYXR0cjtcbiAgICB2YXIgYXR0ck5hbWU7XG4gICAgdmFyIGF0dHJOYW1lc3BhY2VVUkk7XG4gICAgdmFyIGF0dHJWYWx1ZTtcbiAgICB2YXIgZnJvbVZhbHVlO1xuXG4gICAgLy8gZG9jdW1lbnQtZnJhZ21lbnRzIGRvbnQgaGF2ZSBhdHRyaWJ1dGVzIHNvIGxldHMgbm90IGRvIGFueXRoaW5nXG4gICAgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBmcm9tTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50XG4gICAgZm9yICh2YXIgaSA9IHRvTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGF0dHIgPSB0b05vZGVBdHRyc1tpXTtcbiAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgIGF0dHJOYW1lc3BhY2VVUkkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcbiAgICAgICAgYXR0clZhbHVlID0gYXR0ci52YWx1ZTtcblxuICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZTtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZyb21WYWx1ZSAhPT0gYXR0clZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIucHJlZml4ID09PSAneG1sbnMnKXtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7IC8vIEl0J3Mgbm90IGFsbG93ZWQgdG8gc2V0IGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBYTUxOUyBuYW1lc3BhY2Ugd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBgeG1sbnNgIHByZWZpeFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IGF0dHJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgYXR0cmlidXRlcyBmb3VuZCBvbiB0aGUgb3JpZ2luYWwgRE9NIGVsZW1lbnQgdGhhdFxuICAgIC8vIHdlcmVuJ3QgZm91bmQgb24gdGhlIHRhcmdldCBlbGVtZW50LlxuICAgIHZhciBmcm9tTm9kZUF0dHJzID0gZnJvbU5vZGUuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIGQgPSBmcm9tTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGF0dHIgPSBmcm9tTm9kZUF0dHJzW2RdO1xuICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTtcbiAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGF0dHIubmFtZXNwYWNlVVJJO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubG9jYWxOYW1lIHx8IGF0dHJOYW1lO1xuXG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5yZW1vdmVBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxudmFyIHJhbmdlOyAvLyBDcmVhdGUgYSByYW5nZSBvYmplY3QgZm9yIGVmZmljZW50bHkgcmVuZGVyaW5nIHN0cmluZ3MgdG8gZWxlbWVudHMuXG52YXIgTlNfWEhUTUwgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG5cbnZhciBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogZG9jdW1lbnQ7XG52YXIgSEFTX1RFTVBMQVRFX1NVUFBPUlQgPSAhIWRvYyAmJiAnY29udGVudCcgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG52YXIgSEFTX1JBTkdFX1NVUFBPUlQgPSAhIWRvYyAmJiBkb2MuY3JlYXRlUmFuZ2UgJiYgJ2NyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCcgaW4gZG9jLmNyZWF0ZVJhbmdlKCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cikge1xuICAgIHZhciB0ZW1wbGF0ZSA9IGRvYy5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHN0cjtcbiAgICByZXR1cm4gdGVtcGxhdGUuY29udGVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21SYW5nZShzdHIpIHtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUoZG9jLmJvZHkpO1xuICAgIH1cblxuICAgIHZhciBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHIpO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21XcmFwKHN0cikge1xuICAgIHZhciBmcmFnbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCdib2R5Jyk7XG4gICAgZnJhZ21lbnQuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgYWJvdXQgdGhlIHNhbWVcbiAqIHZhciBodG1sID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhzdHIsICd0ZXh0L2h0bWwnKTtcbiAqIHJldHVybiBodG1sLmJvZHkuZmlyc3RDaGlsZDtcbiAqXG4gKiBAbWV0aG9kIHRvRWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICovXG5mdW5jdGlvbiB0b0VsZW1lbnQoc3RyKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBpZiAoSEFTX1RFTVBMQVRFX1NVUFBPUlQpIHtcbiAgICAgIC8vIGF2b2lkIHJlc3RyaWN0aW9ucyBvbiBjb250ZW50IGZvciB0aGluZ3MgbGlrZSBgPHRyPjx0aD5IaTwvdGg+PC90cj5gIHdoaWNoXG4gICAgICAvLyBjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQgZG9lc24ndCBzdXBwb3J0XG4gICAgICAvLyA8dGVtcGxhdGU+IHN1cHBvcnQgbm90IGF2YWlsYWJsZSBpbiBJRVxuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cik7XG4gICAgfSBlbHNlIGlmIChIQVNfUkFOR0VfU1VQUE9SVCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVJhbmdlKHN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVdyYXAoc3RyKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdHdvIG5vZGUncyBuYW1lcyBhcmUgdGhlIHNhbWUuXG4gKlxuICogTk9URTogV2UgZG9uJ3QgYm90aGVyIGNoZWNraW5nIGBuYW1lc3BhY2VVUklgIGJlY2F1c2UgeW91IHdpbGwgbmV2ZXIgZmluZCB0d28gSFRNTCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lXG4gKiAgICAgICBub2RlTmFtZSBhbmQgZGlmZmVyZW50IG5hbWVzcGFjZSBVUklzLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiIFRoZSB0YXJnZXQgZWxlbWVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZU5vZGVOYW1lcyhmcm9tRWwsIHRvRWwpIHtcbiAgICB2YXIgZnJvbU5vZGVOYW1lID0gZnJvbUVsLm5vZGVOYW1lO1xuICAgIHZhciB0b05vZGVOYW1lID0gdG9FbC5ub2RlTmFtZTtcbiAgICB2YXIgZnJvbUNvZGVTdGFydCwgdG9Db2RlU3RhcnQ7XG5cbiAgICBpZiAoZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZyb21Db2RlU3RhcnQgPSBmcm9tTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcbiAgICB0b0NvZGVTdGFydCA9IHRvTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcblxuICAgIC8vIElmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBhIHZpcnR1YWwgRE9NIG5vZGUgb3IgU1ZHIG5vZGUgdGhlbiB3ZSBtYXlcbiAgICAvLyBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgdGFnIG5hbWUgYmVmb3JlIGNvbXBhcmluZy4gTm9ybWFsIEhUTUwgZWxlbWVudHMgdGhhdCBhcmVcbiAgICAvLyBpbiB0aGUgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJcbiAgICAvLyBhcmUgY29udmVydGVkIHRvIHVwcGVyIGNhc2VcbiAgICBpZiAoZnJvbUNvZGVTdGFydCA8PSA5MCAmJiB0b0NvZGVTdGFydCA+PSA5NykgeyAvLyBmcm9tIGlzIHVwcGVyIGFuZCB0byBpcyBsb3dlclxuICAgICAgICByZXR1cm4gZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0b0NvZGVTdGFydCA8PSA5MCAmJiBmcm9tQ29kZVN0YXJ0ID49IDk3KSB7IC8vIHRvIGlzIHVwcGVyIGFuZCBmcm9tIGlzIGxvd2VyXG4gICAgICAgIHJldHVybiB0b05vZGVOYW1lID09PSBmcm9tTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50LCBvcHRpb25hbGx5IHdpdGggYSBrbm93biBuYW1lc3BhY2UgVVJJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBlbGVtZW50IG5hbWUsIGUuZy4gJ2Rpdicgb3IgJ3N2ZydcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlVVJJXSB0aGUgZWxlbWVudCdzIG5hbWVzcGFjZSBVUkksIGkuZS4gdGhlIHZhbHVlIG9mXG4gKiBpdHMgYHhtbG5zYCBhdHRyaWJ1dGUgb3IgaXRzIGluZmVycmVkIG5hbWVzcGFjZS5cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMobmFtZSwgbmFtZXNwYWNlVVJJKSB7XG4gICAgcmV0dXJuICFuYW1lc3BhY2VVUkkgfHwgbmFtZXNwYWNlVVJJID09PSBOU19YSFRNTCA/XG4gICAgICAgIGRvYy5jcmVhdGVFbGVtZW50KG5hbWUpIDpcbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIG5hbWUpO1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgY2hpbGRyZW4gb2Ygb25lIERPTSBlbGVtZW50IHRvIGFub3RoZXIgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gbW92ZUNoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICB2YXIgbmV4dENoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIHRvRWwuYXBwZW5kQ2hpbGQoY3VyQ2hpbGQpO1xuICAgICAgICBjdXJDaGlsZCA9IG5leHRDaGlsZDtcbiAgICB9XG4gICAgcmV0dXJuIHRvRWw7XG59XG5cbmZ1bmN0aW9uIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCBuYW1lKSB7XG4gICAgaWYgKGZyb21FbFtuYW1lXSAhPT0gdG9FbFtuYW1lXSkge1xuICAgICAgICBmcm9tRWxbbmFtZV0gPSB0b0VsW25hbWVdO1xuICAgICAgICBpZiAoZnJvbUVsW25hbWVdKSB7XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKG5hbWUsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciBzcGVjaWFsRWxIYW5kbGVycyA9IHtcbiAgICBPUFRJT046IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGZyb21FbC5wYXJlbnROb2RlO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUgPT09ICdTRUxFQ1QnICYmICFwYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgICAgIGlmIChmcm9tRWwuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpICYmICF0b0VsLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIE1TIEVkZ2UgYnVnIHdoZXJlIHRoZSAnc2VsZWN0ZWQnIGF0dHJpYnV0ZSBjYW4gb25seSBiZVxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkIGlmIHNldCB0byBhIG5vbi1lbXB0eSB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTIwODc2NzkvXG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVzZXQgc2VsZWN0IGVsZW1lbnQncyBzZWxlY3RlZEluZGV4IHRvIC0xLCBvdGhlcndpc2Ugc2V0dGluZ1xuICAgICAgICAgICAgICAgIC8vIGZyb21FbC5zZWxlY3RlZCB1c2luZyB0aGUgc3luY0Jvb2xlYW5BdHRyUHJvcCBiZWxvdyBoYXMgbm8gZWZmZWN0LlxuICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JyZWN0IHNlbGVjdGVkSW5kZXggd2lsbCBiZSBzZXQgaW4gdGhlIFNFTEVDVCBzcGVjaWFsIGhhbmRsZXIgYmVsb3cuXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdzZWxlY3RlZCcpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgaXMgc3BlY2lhbCBmb3IgdGhlIDxpbnB1dD4gZWxlbWVudCBzaW5jZSBpdCBzZXRzXG4gICAgICogdGhlIGluaXRpYWwgdmFsdWUuIENoYW5naW5nIHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICogXCJ2YWx1ZVwiIHByb3BlcnR5IHdpbGwgaGF2ZSBubyBlZmZlY3Qgc2luY2UgaXQgaXMgb25seSB1c2VkIHRvIHRoZSBzZXQgdGhlXG4gICAgICogaW5pdGlhbCB2YWx1ZS4gIFNpbWlsYXIgZm9yIHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUsIGFuZCBcImRpc2FibGVkXCIuXG4gICAgICovXG4gICAgSU5QVVQ6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2NoZWNrZWQnKTtcbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdkaXNhYmxlZCcpO1xuXG4gICAgICAgIGlmIChmcm9tRWwudmFsdWUgIT09IHRvRWwudmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IHRvRWwudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRvRWwuaGFzQXR0cmlidXRlKCd2YWx1ZScpKSB7XG4gICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIFRFWFRBUkVBOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIE5lZWRlZCBmb3IgSUUuIEFwcGFyZW50bHkgSUUgc2V0cyB0aGUgcGxhY2Vob2xkZXIgYXMgdGhlXG4gICAgICAgICAgICAvLyBub2RlIHZhbHVlIGFuZCB2aXNlIHZlcnNhLiBUaGlzIGlnbm9yZXMgYW4gZW1wdHkgdXBkYXRlLlxuICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gZmlyc3RDaGlsZC5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSB8fCAoIW5ld1ZhbHVlICYmIG9sZFZhbHVlID09IGZyb21FbC5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFNFTEVDVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiBvZiBmcm9tRWwsIG5vdCB0b0VsIHNpbmNlIG5vZGVzIGNhbiBiZSBtb3ZlZFxuICAgICAgICAgICAgLy8gZnJvbSB0b0VsIHRvIGZyb21FbCBkaXJlY3RseSB3aGVuIG1vcnBoaW5nLlxuICAgICAgICAgICAgLy8gQXQgdGhlIHRpbWUgdGhpcyBzcGVjaWFsIGhhbmRsZXIgaXMgaW52b2tlZCwgYWxsIGNoaWxkcmVuIGhhdmUgYWxyZWFkeSBiZWVuIG1vcnBoZWRcbiAgICAgICAgICAgIC8vIGFuZCBhcHBlbmRlZCB0byAvIHJlbW92ZWQgZnJvbSBmcm9tRWwsIHNvIHVzaW5nIGZyb21FbCBoZXJlIGlzIHNhZmUgYW5kIGNvcnJlY3QuXG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBvcHRncm91cDtcbiAgICAgICAgICAgIHZhciBub2RlTmFtZTtcbiAgICAgICAgICAgIHdoaWxlKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBjdXJDaGlsZC5ub2RlTmFtZSAmJiBjdXJDaGlsZC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgICAgICBvcHRncm91cCA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBlbXB0eSBvcHRncm91cHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGlsZC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1ckNoaWxkICYmIG9wdGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0Z3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcm9tRWwuc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFJDEgPSAxMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBkZWZhdWx0R2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkgfHwgbm9kZS5pZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycykge1xuXG4gIHJldHVybiBmdW5jdGlvbiBtb3JwaGRvbShmcm9tTm9kZSwgdG9Ob2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0b05vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoZnJvbU5vZGUubm9kZU5hbWUgPT09ICcjZG9jdW1lbnQnIHx8IGZyb21Ob2RlLm5vZGVOYW1lID09PSAnSFRNTCcgfHwgZnJvbU5vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICB2YXIgdG9Ob2RlSHRtbCA9IHRvTm9kZTtcbiAgICAgICAgdG9Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKTtcbiAgICAgICAgdG9Ob2RlLmlubmVySFRNTCA9IHRvTm9kZUh0bWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b05vZGUgPSB0b0VsZW1lbnQodG9Ob2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICB0b05vZGUgPSB0b05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgfVxuXG4gICAgdmFyIGdldE5vZGVLZXkgPSBvcHRpb25zLmdldE5vZGVLZXkgfHwgZGVmYXVsdEdldE5vZGVLZXk7XG4gICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVBZGRlZCA9IG9wdGlvbnMub25Ob2RlQWRkZWQgfHwgbm9vcDtcbiAgICB2YXIgb25CZWZvcmVFbFVwZGF0ZWQgPSBvcHRpb25zLm9uQmVmb3JlRWxVcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZU5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIHNraXBGcm9tQ2hpbGRyZW4gPSBvcHRpb25zLnNraXBGcm9tQ2hpbGRyZW4gfHwgbm9vcDtcbiAgICB2YXIgYWRkQ2hpbGQgPSBvcHRpb25zLmFkZENoaWxkIHx8IGZ1bmN0aW9uKHBhcmVudCwgY2hpbGQpeyByZXR1cm4gcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTsgfTtcbiAgICB2YXIgY2hpbGRyZW5Pbmx5ID0gb3B0aW9ucy5jaGlsZHJlbk9ubHkgPT09IHRydWU7XG5cbiAgICAvLyBUaGlzIG9iamVjdCBpcyB1c2VkIGFzIGEgbG9va3VwIHRvIHF1aWNrbHkgZmluZCBhbGwga2V5ZWQgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgIHZhciBmcm9tTm9kZXNMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXllZFJlbW92YWxMaXN0ID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRLZXllZFJlbW92YWwoa2V5KSB7XG4gICAgICBrZXllZFJlbW92YWxMaXN0LnB1c2goa2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB2YXIgY3VyQ2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuXG4gICAgICAgICAgdmFyIGtleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChza2lwS2V5ZWROb2RlcyAmJiAoa2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCkpKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgc2tpcHBpbmcga2V5ZWQgbm9kZXMgdGhlbiB3ZSBhZGQgdGhlIGtleVxuICAgICAgICAgICAgLy8gdG8gYSBsaXN0IHNvIHRoYXQgaXQgY2FuIGJlIGhhbmRsZWQgYXQgdGhlIHZlcnkgZW5kLlxuICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBub2RlIGFzIGRpc2NhcmRlZCBpZiBpdCBpcyBub3Qga2V5ZWQuIFdlIGRvIHRoaXMgYmVjYXVzZVxuICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCB3ZSBsb29wIHRocm91Z2ggYWxsIGtleWVkIGVsZW1lbnRzIHRoYXQgd2VyZSB1bm1hdGNoZWRcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSBpbiBvbmUgZmluYWwgcGFzcy5cbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICBpZiAoY3VyQ2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2RlcyhjdXJDaGlsZCwgc2tpcEtleWVkTm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJlbW92ZXMgYSBET00gbm9kZSBvdXQgb2YgdGhlIG9yaWdpbmFsIERPTVxuICAgICpcbiAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlXG4gICAgKiBAcGFyYW0gIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBub2RlcyBwYXJlbnRcbiAgICAqIEBwYXJhbSAge0Jvb2xlYW59IHNraXBLZXllZE5vZGVzIElmIHRydWUgdGhlbiBlbGVtZW50cyB3aXRoIGtleXMgd2lsbCBiZSBza2lwcGVkIGFuZCBub3QgZGlzY2FyZGVkLlxuICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlLCBwYXJlbnROb2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG9uQmVmb3JlTm9kZURpc2NhcmRlZChub2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBvbk5vZGVEaXNjYXJkZWQobm9kZSk7XG4gICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgfVxuXG4gICAgLy8gLy8gVHJlZVdhbGtlciBpbXBsZW1lbnRhdGlvbiBpcyBubyBmYXN0ZXIsIGJ1dCBrZWVwaW5nIHRoaXMgYXJvdW5kIGluIGNhc2UgdGhpcyBjaGFuZ2VzIGluIHRoZSBmdXR1cmVcbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUocm9vdCkge1xuICAgIC8vICAgICB2YXIgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgLy8gICAgICAgICByb290LFxuICAgIC8vICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICAgIC8vXG4gICAgLy8gICAgIHZhciBlbDtcbiAgICAvLyAgICAgd2hpbGUoKGVsID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpKSkge1xuICAgIC8vICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoZWwpO1xuICAgIC8vICAgICAgICAgaWYgKGtleSkge1xuICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyAvLyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUobm9kZSkge1xuICAgIC8vICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICAvLyAgICAgdmFyIGVsO1xuICAgIC8vICAgICB3aGlsZSgoZWwgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAvLyAgICAgICAgIGlmIChrZXkpIHtcbiAgICAvLyAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGVsO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgZnVuY3Rpb24gaW5kZXhUcmVlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICAgIHZhciBjdXJDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgIGluZGV4VHJlZShjdXJDaGlsZCk7XG5cbiAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5kZXhUcmVlKGZyb21Ob2RlKTtcblxuICAgIGZ1bmN0aW9uIGhhbmRsZU5vZGVBZGRlZChlbCkge1xuICAgICAgb25Ob2RlQWRkZWQoZWwpO1xuXG4gICAgICB2YXIgY3VyQ2hpbGQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0U2libGluZyA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIHZhciB1bm1hdGNoZWRGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBba2V5XTtcbiAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgZHVwbGljYXRlICNpZCBub2RlIGluIGNhY2hlLCByZXBsYWNlIGBlbGAgd2l0aCBjYWNoZSB2YWx1ZVxuICAgICAgICAgIC8vIGFuZCBtb3JwaCBpdCB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICBpZiAodW5tYXRjaGVkRnJvbUVsICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyQ2hpbGQsIHVubWF0Y2hlZEZyb21FbCkpIHtcbiAgICAgICAgICAgIGN1ckNoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgbW9ycGhFbCh1bm1hdGNoZWRGcm9tRWwsIGN1ckNoaWxkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBmb3IgY3VyQ2hpbGQgYW5kIGl0J3MgY2hpbGRyZW4gdG8gc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nIGluXG4gICAgICAgICAgLy8gZnJvbU5vZGVzTG9va3VwXG4gICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1ckNoaWxkID0gbmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgb2YgdGhlIFwidG8gbm9kZXNcIi4gSWYgY3VyRnJvbU5vZGVDaGlsZCBpc1xuICAgICAgLy8gbm9uLW51bGwgdGhlbiB3ZSBzdGlsbCBoYXZlIHNvbWUgZnJvbSBub2RlcyBsZWZ0IG92ZXIgdGhhdCBuZWVkXG4gICAgICAvLyB0byBiZSByZW1vdmVkXG4gICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICB2YXIgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgaWYgKChjdXJGcm9tTm9kZUtleSA9IGdldE5vZGVLZXkoY3VyRnJvbU5vZGVDaGlsZCkpKSB7XG4gICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vcnBoRWwoZnJvbUVsLCB0b0VsLCBjaGlsZHJlbk9ubHkpIHtcbiAgICAgIHZhciB0b0VsS2V5ID0gZ2V0Tm9kZUtleSh0b0VsKTtcblxuICAgICAgaWYgKHRvRWxLZXkpIHtcbiAgICAgICAgLy8gSWYgYW4gZWxlbWVudCB3aXRoIGFuIElEIGlzIGJlaW5nIG1vcnBoZWQgdGhlbiBpdCB3aWxsIGJlIGluIHRoZSBmaW5hbFxuICAgICAgICAvLyBET00gc28gY2xlYXIgaXQgb3V0IG9mIHRoZSBzYXZlZCBlbGVtZW50cyBjb2xsZWN0aW9uXG4gICAgICAgIGRlbGV0ZSBmcm9tTm9kZXNMb29rdXBbdG9FbEtleV07XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgIHZhciBiZWZvcmVVcGRhdGVSZXN1bHQgPSBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpO1xuICAgICAgICBpZiAoYmVmb3JlVXBkYXRlUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChiZWZvcmVVcGRhdGVSZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgIGZyb21FbCA9IGJlZm9yZVVwZGF0ZVJlc3VsdDtcbiAgICAgICAgICAvLyByZWluZGV4IHRoZSBuZXcgZnJvbUVsIGluIGNhc2UgaXQncyBub3QgaW4gdGhlIHNhbWVcbiAgICAgICAgICAvLyB0cmVlIGFzIHRoZSBvcmlnaW5hbCBmcm9tRWxcbiAgICAgICAgICAvLyAoUGhvZW5peCBMaXZlVmlldyBzb21ldGltZXMgcmV0dXJucyBhIGNsb25lZCB0cmVlLFxuICAgICAgICAgIC8vICBidXQga2V5ZWQgbG9va3VwcyB3b3VsZCBzdGlsbCBwb2ludCB0byB0aGUgb3JpZ2luYWwgdHJlZSlcbiAgICAgICAgICBpbmRleFRyZWUoZnJvbUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50IGZpcnN0XG4gICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgLy8gb3B0aW9uYWxcbiAgICAgICAgb25FbFVwZGF0ZWQoZnJvbUVsKTtcblxuICAgICAgICBpZiAob25CZWZvcmVFbENoaWxkcmVuVXBkYXRlZChmcm9tRWwsIHRvRWwpID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZnJvbUVsLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXJzLlRFWFRBUkVBKGZyb21FbCwgdG9FbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9ycGhDaGlsZHJlbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgIHZhciBza2lwRnJvbSA9IHNraXBGcm9tQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIHZhciBjdXJUb05vZGVDaGlsZCA9IHRvRWwuZmlyc3RDaGlsZDtcbiAgICAgIHZhciBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgICB2YXIgY3VyVG9Ob2RlS2V5O1xuICAgICAgdmFyIGN1ckZyb21Ob2RlS2V5O1xuXG4gICAgICB2YXIgZnJvbU5leHRTaWJsaW5nO1xuICAgICAgdmFyIHRvTmV4dFNpYmxpbmc7XG4gICAgICB2YXIgbWF0Y2hpbmdGcm9tRWw7XG5cbiAgICAgIC8vIHdhbGsgdGhlIGNoaWxkcmVuXG4gICAgICBvdXRlcjogd2hpbGUgKGN1clRvTm9kZUNoaWxkKSB7XG4gICAgICAgIHRvTmV4dFNpYmxpbmcgPSBjdXJUb05vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgY3VyVG9Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJUb05vZGVDaGlsZCk7XG5cbiAgICAgICAgLy8gd2FsayB0aGUgZnJvbU5vZGUgY2hpbGRyZW4gYWxsIHRoZSB3YXkgdGhyb3VnaFxuICAgICAgICB3aGlsZSAoIXNraXBGcm9tICYmIGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgaWYgKGN1clRvTm9kZUNoaWxkLmlzU2FtZU5vZGUgJiYgY3VyVG9Ob2RlQ2hpbGQuaXNTYW1lTm9kZShjdXJGcm9tTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgIHZhciBjdXJGcm9tTm9kZVR5cGUgPSBjdXJGcm9tTm9kZUNoaWxkLm5vZGVUeXBlO1xuXG4gICAgICAgICAgLy8gdGhpcyBtZWFucyBpZiB0aGUgY3VyRnJvbU5vZGVDaGlsZCBkb2VzbnQgaGF2ZSBhIG1hdGNoIHdpdGggdGhlIGN1clRvTm9kZUNoaWxkXG4gICAgICAgICAgdmFyIGlzQ29tcGF0aWJsZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IGN1clRvTm9kZUNoaWxkLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgRWxlbWVudCBub2Rlc1xuXG4gICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG5vZGUgaGFzIGEga2V5IHNvIHdlIHdhbnQgdG8gbWF0Y2ggaXQgdXAgd2l0aCB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAhPT0gY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBrZXkgc29cbiAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGNoZWNrIG91ciBsb29rdXAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgIC8vIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgICBpZiAoKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tTmV4dFNpYmxpbmcgPT09IG1hdGNoaW5nRnJvbUVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzaW5nbGUgZWxlbWVudCByZW1vdmFscy4gVG8gYXZvaWQgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIG5vZGUgb3V0IG9mIHRoZSB0cmVlIChzaW5jZSB0aGF0IGNhbiBicmVhayBDU1MgdHJhbnNpdGlvbnMsIGV0Yy4pLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgaW5zdGVhZCBkaXNjYXJkIHRoZSBjdXJyZW50IG5vZGUgYW5kIHdhaXQgdW50aWwgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdG8gcHJvcGVybHkgbWF0Y2ggdXAgdGhlIGtleWVkIHRhcmdldCBlbGVtZW50IHdpdGggaXRzIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcga2V5ZWQgZWxlbWVudCBzb21ld2hlcmUgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIG1vdmUgdGhlIG9yaWdpbmFsIERPTSBub2RlIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIG1vcnBoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBXZSB1c2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgcmVwbGFjZUNoaWxkIGJlY2F1c2Ugd2Ugd2FudCB0byBnbyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGByZW1vdmVOb2RlKClgIGZ1bmN0aW9uIGZvciB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGRpc2NhcmRlZCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBob29rcyBhcmUgY29ycmVjdGx5IGludm9rZWRcbiAgICAgICAgICAgICAgICAgICAgICBmcm9tRWwuaW5zZXJ0QmVmb3JlKG1hdGNoaW5nRnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb21OZXh0U2libGluZyA9IGN1ckZyb21Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBub2RlIGlzIGtleWVkIGl0IG1pZ2h0IGJlIG1hdGNoZWQgdXAgbGF0ZXIgc28gd2UgZGVmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IG1hdGNoaW5nRnJvbUVsO1xuICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGVzIGFyZSBub3QgY29tcGF0aWJsZSBzaW5jZSB0aGUgXCJ0b1wiIG5vZGUgaGFzIGEga2V5IGFuZCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBtYXRjaGluZyBrZXllZCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZVxuICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaGFzIGEga2V5XG4gICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBpc0NvbXBhdGlibGUgIT09IGZhbHNlICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgY29tcGF0aWJsZSBET00gZWxlbWVudHMgc28gdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgXCJmcm9tXCIgbm9kZSB0byBtYXRjaCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHRhcmdldCBET00gbm9kZS5cbiAgICAgICAgICAgICAgICAvLyBNT1JQSFxuICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBURVhUX05PREUgfHwgY3VyRnJvbU5vZGVUeXBlID09IENPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGJlaW5nIGNvbXBhcmVkIGFyZSBUZXh0IG9yIENvbW1lbnQgbm9kZXNcbiAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gU2ltcGx5IHVwZGF0ZSBub2RlVmFsdWUgb24gdGhlIG9yaWdpbmFsIG5vZGUgdG9cbiAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSAhPT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZC5ub2RlVmFsdWUgPSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0NvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIC8vIEFkdmFuY2UgYm90aCB0aGUgXCJ0b1wiIGNoaWxkIGFuZCB0aGUgXCJmcm9tXCIgY2hpbGQgc2luY2Ugd2UgZm91bmQgYSBtYXRjaFxuICAgICAgICAgICAgLy8gTm90aGluZyBlbHNlIHRvIGRvIGFzIHdlIGFscmVhZHkgcmVjdXJzaXZlbHkgY2FsbGVkIG1vcnBoQ2hpbGRyZW4gYWJvdmVcbiAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gdG9OZXh0U2libGluZztcbiAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBObyBjb21wYXRpYmxlIG1hdGNoIHNvIHJlbW92ZSB0aGUgb2xkIG5vZGUgZnJvbSB0aGUgRE9NIGFuZCBjb250aW51ZSB0cnlpbmcgdG8gZmluZCBhXG4gICAgICAgICAgLy8gbWF0Y2ggaW4gdGhlIG9yaWdpbmFsIERPTS4gSG93ZXZlciwgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSBmcm9tIG5vZGUgaXMgbm90IGtleWVkXG4gICAgICAgICAgLy8gc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCBhIGtleWVkIG5vZGUgbWlnaHQgbWF0Y2ggdXAgd2l0aCBhIG5vZGUgc29tZXdoZXJlIGVsc2UgaW4gdGhlXG4gICAgICAgICAgLy8gdGFyZ2V0IHRyZWUgYW5kIHdlIGRvbid0IHdhbnQgdG8gZGlzY2FyZCBpdCBqdXN0IHlldCBzaW5jZSBpdCBzdGlsbCBtaWdodCBmaW5kIGFcbiAgICAgICAgICAvLyBob21lIGluIHRoZSBmaW5hbCBET00gdHJlZS4gQWZ0ZXIgZXZlcnl0aGluZyBpcyBkb25lIHdlIHdpbGwgcmVtb3ZlIGFueSBrZXllZCBub2Rlc1xuICAgICAgICAgIC8vIHRoYXQgZGlkbid0IGZpbmQgYSBob21lXG4gICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCB0cnVlIC8qIHNraXAga2V5ZWQgbm9kZXMgKi8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgIH0gLy8gRU5EOiB3aGlsZShjdXJGcm9tTm9kZUNoaWxkKSB7fVxuXG4gICAgICAgIC8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIHdlIGRpZCBub3QgZmluZCBhIGNhbmRpZGF0ZSBtYXRjaCBmb3JcbiAgICAgICAgLy8gb3VyIFwidG8gbm9kZVwiIGFuZCB3ZSBleGhhdXN0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBcImZyb21cIlxuICAgICAgICAvLyBub2Rlcy4gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgYXBwZW5kIHRoZSBjdXJyZW50IFwidG9cIiBub2RlXG4gICAgICAgIC8vIHRvIHRoZSBlbmRcbiAgICAgICAgaWYgKGN1clRvTm9kZUtleSAmJiAobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkgJiYgY29tcGFyZU5vZGVOYW1lcyhtYXRjaGluZ0Zyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgLy8gTU9SUEhcbiAgICAgICAgICBpZighc2tpcEZyb20peyBhZGRDaGlsZChmcm9tRWwsIG1hdGNoaW5nRnJvbUVsKTsgfVxuICAgICAgICAgIG1vcnBoRWwobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgPSBvbkJlZm9yZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUpIHtcbiAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSBjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUoZnJvbUVsLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZENoaWxkKGZyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSk7XG5cbiAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgIGlmIChzcGVjaWFsRWxIYW5kbGVyKSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXIoZnJvbUVsLCB0b0VsKTtcbiAgICAgIH1cbiAgICB9IC8vIEVORDogbW9ycGhDaGlsZHJlbiguLi4pXG5cbiAgICB2YXIgbW9ycGhlZE5vZGUgPSBmcm9tTm9kZTtcbiAgICB2YXIgbW9ycGhlZE5vZGVUeXBlID0gbW9ycGhlZE5vZGUubm9kZVR5cGU7XG4gICAgdmFyIHRvTm9kZVR5cGUgPSB0b05vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnaXZlbiB0d28gRE9NIG5vZGVzIHRoYXQgYXJlIG5vdFxuICAgICAgLy8gY29tcGF0aWJsZSAoZS5nLiA8ZGl2PiAtLT4gPHNwYW4+IG9yIDxkaXY+IC0tPiBURVhUKVxuICAgICAgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICBpZiAoIWNvbXBhcmVOb2RlTmFtZXMoZnJvbU5vZGUsIHRvTm9kZSkpIHtcbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChmcm9tTm9kZSk7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZSA9IG1vdmVDaGlsZHJlbihmcm9tTm9kZSwgY3JlYXRlRWxlbWVudE5TKHRvTm9kZS5ub2RlTmFtZSwgdG9Ob2RlLm5hbWVzcGFjZVVSSSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBHb2luZyBmcm9tIGFuIGVsZW1lbnQgbm9kZSB0byBhIHRleHQgbm9kZVxuICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gVEVYVF9OT0RFIHx8IG1vcnBoZWROb2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7IC8vIFRleHQgb3IgY29tbWVudCBub2RlXG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBtb3JwaGVkTm9kZVR5cGUpIHtcbiAgICAgICAgICBpZiAobW9ycGhlZE5vZGUubm9kZVZhbHVlICE9PSB0b05vZGUubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZS5ub2RlVmFsdWUgPSB0b05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUZXh0IG5vZGUgdG8gc29tZXRoaW5nIGVsc2VcbiAgICAgICAgICBtb3JwaGVkTm9kZSA9IHRvTm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb3JwaGVkTm9kZSA9PT0gdG9Ob2RlKSB7XG4gICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAvLyB0b3NzIG91dCB0aGUgXCJmcm9tIG5vZGVcIiBhbmQgdXNlIHRoZSBcInRvIG5vZGVcIlxuICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRvTm9kZS5pc1NhbWVOb2RlICYmIHRvTm9kZS5pc1NhbWVOb2RlKG1vcnBoZWROb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG1vcnBoRWwobW9ycGhlZE5vZGUsIHRvTm9kZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgLy8gV2Ugbm93IG5lZWQgdG8gbG9vcCBvdmVyIGFueSBrZXllZCBub2RlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmVcbiAgICAgIC8vIHJlbW92ZWQuIFdlIG9ubHkgZG8gdGhlIHJlbW92YWwgaWYgd2Uga25vdyB0aGF0IHRoZSBrZXllZCBub2RlXG4gICAgICAvLyBuZXZlciBmb3VuZCBhIG1hdGNoLiBXaGVuIGEga2V5ZWQgbm9kZSBpcyBtYXRjaGVkIHVwIHdlIHJlbW92ZVxuICAgICAgLy8gaXQgb3V0IG9mIGZyb21Ob2Rlc0xvb2t1cCBhbmQgd2UgdXNlIGZyb21Ob2Rlc0xvb2t1cCB0byBkZXRlcm1pbmVcbiAgICAgIC8vIGlmIGEga2V5ZWQgbm9kZSBoYXMgYmVlbiBtYXRjaGVkIHVwIG9yIG5vdFxuICAgICAgaWYgKGtleWVkUmVtb3ZhbExpc3QpIHtcbiAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49a2V5ZWRSZW1vdmFsTGlzdC5sZW5ndGg7IGk8bGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxUb1JlbW92ZSA9IGZyb21Ob2Rlc0xvb2t1cFtrZXllZFJlbW92YWxMaXN0W2ldXTtcbiAgICAgICAgICBpZiAoZWxUb1JlbW92ZSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShlbFRvUmVtb3ZlLCBlbFRvUmVtb3ZlLnBhcmVudE5vZGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSAmJiBtb3JwaGVkTm9kZSAhPT0gZnJvbU5vZGUgJiYgZnJvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKG1vcnBoZWROb2RlLmFjdHVhbGl6ZSkge1xuICAgICAgICBtb3JwaGVkTm9kZSA9IG1vcnBoZWROb2RlLmFjdHVhbGl6ZShmcm9tTm9kZS5vd25lckRvY3VtZW50IHx8IGRvYyk7XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSBoYWQgdG8gc3dhcCBvdXQgdGhlIGZyb20gbm9kZSB3aXRoIGEgbmV3IG5vZGUgYmVjYXVzZSB0aGUgb2xkXG4gICAgICAvLyBub2RlIHdhcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgbm9kZSB0aGVuIHdlIG5lZWQgdG9cbiAgICAgIC8vIHJlcGxhY2UgdGhlIG9sZCBET00gbm9kZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuIFRoaXMgaXMgb25seVxuICAgICAgLy8gcG9zc2libGUgaWYgdGhlIG9yaWdpbmFsIERPTSBub2RlIHdhcyBwYXJ0IG9mIGEgRE9NIHRyZWUgd2hpY2hcbiAgICAgIC8vIHdlIGtub3cgaXMgdGhlIGNhc2UgaWYgaXQgaGFzIGEgcGFyZW50IG5vZGUuXG4gICAgICBmcm9tTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtb3JwaGVkTm9kZSwgZnJvbU5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgfTtcbn1cblxudmFyIG1vcnBoZG9tID0gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpO1xuXG5leHBvcnQgZGVmYXVsdCBtb3JwaGRvbTtcbiIsICJpbXBvcnQge1xuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfUFJVTkUsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NLSVAsXG4gIFBIWF9NQUdJQ19JRCxcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1RSSUdHRVJfQUNUSU9OLFxuICBQSFhfVVBEQVRFLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfU1RSRUFNLFxuICBQSFhfU1RSRUFNX1JFRixcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfVEVMRVBPUlRFRF9TUkMsXG4gIFBIWF9SVU5USU1FX0hPT0ssXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBkZXRlY3REdXBsaWNhdGVJZHMsIGRldGVjdEludmFsaWRTdHJlYW1JbnNlcnRzLCBpc0NpZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgRWxlbWVudFJlZiBmcm9tIFwiLi9lbGVtZW50X3JlZlwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBET01Qb3N0TW9ycGhSZXN0b3JlciBmcm9tIFwiLi9kb21fcG9zdF9tb3JwaF9yZXN0b3JlclwiO1xuaW1wb3J0IG1vcnBoZG9tIGZyb20gXCJtb3JwaGRvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01QYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHZpZXcsIGNvbnRhaW5lciwgaWQsIGh0bWwsIHN0cmVhbXMsIHRhcmdldENJRCwgb3B0cyA9IHt9KSB7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXQ7XG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucm9vdElEID0gdmlldy5yb290LmlkO1xuICAgIHRoaXMuaHRtbCA9IGh0bWw7XG4gICAgdGhpcy5zdHJlYW1zID0gc3RyZWFtcztcbiAgICB0aGlzLnN0cmVhbUluc2VydHMgPSB7fTtcbiAgICB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmUgPSB7fTtcbiAgICB0aGlzLnRhcmdldENJRCA9IHRhcmdldENJRDtcbiAgICB0aGlzLmNpZFBhdGNoID0gaXNDaWQodGhpcy50YXJnZXRDSUQpO1xuICAgIHRoaXMucGVuZGluZ1JlbW92ZXMgPSBbXTtcbiAgICB0aGlzLnBoeFJlbW92ZSA9IHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKFwicmVtb3ZlXCIpO1xuICAgIHRoaXMudGFyZ2V0Q29udGFpbmVyID0gdGhpcy5pc0NJRFBhdGNoKClcbiAgICAgID8gdGhpcy50YXJnZXRDSURDb250YWluZXIoaHRtbClcbiAgICAgIDogY29udGFpbmVyO1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge1xuICAgICAgYmVmb3JlYWRkZWQ6IFtdLFxuICAgICAgYmVmb3JldXBkYXRlZDogW10sXG4gICAgICBiZWZvcmVwaHhDaGlsZEFkZGVkOiBbXSxcbiAgICAgIGFmdGVyYWRkZWQ6IFtdLFxuICAgICAgYWZ0ZXJ1cGRhdGVkOiBbXSxcbiAgICAgIGFmdGVyZGlzY2FyZGVkOiBbXSxcbiAgICAgIGFmdGVycGh4Q2hpbGRBZGRlZDogW10sXG4gICAgICBhZnRlcnRyYW5zaXRpb25zRGlzY2FyZGVkOiBbXSxcbiAgICB9O1xuICAgIHRoaXMud2l0aENoaWxkcmVuID0gb3B0cy53aXRoQ2hpbGRyZW4gfHwgb3B0cy51bmRvUmVmIHx8IGZhbHNlO1xuICAgIHRoaXMudW5kb1JlZiA9IG9wdHMudW5kb1JlZjtcbiAgfVxuXG4gIGJlZm9yZShraW5kLCBjYWxsYmFjaykge1xuICAgIHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cbiAgYWZ0ZXIoa2luZCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICB0cmFja0JlZm9yZShraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGJlZm9yZSR7a2luZH1gXS5mb3JFYWNoKChjYWxsYmFjaykgPT4gY2FsbGJhY2soLi4uYXJncykpO1xuICB9XG5cbiAgdHJhY2tBZnRlcihraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGFmdGVyJHtraW5kfWBdLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayguLi5hcmdzKSk7XG4gIH1cblxuICBtYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpIHtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhQSFhfVVBEQVRFKTtcbiAgICBET00uYWxsKFxuICAgICAgdGhpcy5jb250YWluZXIsXG4gICAgICBgWyR7cGh4VXBkYXRlfT1hcHBlbmRdID4gKiwgWyR7cGh4VXBkYXRlfT1wcmVwZW5kXSA+ICpgLFxuICAgICAgKGVsKSA9PiB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUFJVTkUsIFwiXCIpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcGVyZm9ybShpc0pvaW5QYXRjaCkge1xuICAgIGNvbnN0IHsgdmlldywgbGl2ZVNvY2tldCwgaHRtbCwgY29udGFpbmVyIH0gPSB0aGlzO1xuICAgIGxldCB0YXJnZXRDb250YWluZXIgPSB0aGlzLnRhcmdldENvbnRhaW5lcjtcblxuICAgIGlmICh0aGlzLmlzQ0lEUGF0Y2goKSAmJiAhdGhpcy50YXJnZXRDb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NJRFBhdGNoKCkpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L3B1bGwvMzk0MlxuICAgICAgLy8gd2UgbmVlZCB0byBlbnN1cmUgdGhhdCBubyBwYXJlbnQgaXMgbG9ja2VkXG4gICAgICBjb25zdCBjbG9zZXN0TG9jayA9IHRhcmdldENvbnRhaW5lci5jbG9zZXN0KGBbJHtQSFhfUkVGX0xPQ0t9XWApO1xuICAgICAgaWYgKGNsb3Nlc3RMb2NrKSB7XG4gICAgICAgIGNvbnN0IGNsb25lZFRyZWUgPSBET00ucHJpdmF0ZShjbG9zZXN0TG9jaywgUEhYX1JFRl9MT0NLKTtcbiAgICAgICAgaWYgKGNsb25lZFRyZWUpIHtcbiAgICAgICAgICAvLyBpZiBhIHBhcmVudCBpcyBsb2NrZWQgd2l0aCBhIGNsb25lZCB0cmVlLCB3ZSBuZWVkIHRvIHBhdGNoIHRoZSBjbG9uZWQgdHJlZSBpbnN0ZWFkXG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyID0gY2xvbmVkVHJlZS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgYFtkYXRhLXBoeC1jb21wb25lbnQ9XCIke3RoaXMudGFyZ2V0Q0lEfVwiXWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvY3VzZWQgPSBsaXZlU29ja2V0LmdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9XG4gICAgICBmb2N1c2VkICYmIERPTS5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSA/IGZvY3VzZWQgOiB7fTtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1VQREFURSk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRCb3R0b20gPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX0JPVFRPTSk7XG4gICAgY29uc3QgcGh4VHJpZ2dlckV4dGVybmFsID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9UUklHR0VSX0FDVElPTik7XG4gICAgY29uc3QgYWRkZWQgPSBbXTtcbiAgICBjb25zdCB1cGRhdGVzID0gW107XG4gICAgY29uc3QgYXBwZW5kUHJlcGVuZFVwZGF0ZXMgPSBbXTtcblxuICAgIC8vIGFzIHRoZSBwb3J0YWwgdGFyZ2V0IGl0c2VsZiBjb3VsZCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBET00sXG4gICAgLy8gaXQgbWF5IG5vdCBiZSBwcmVzZW50IHdoaWxlIG1vcnBoaW5nIHByZXZpb3VzIHBhcnRzO1xuICAgIC8vIHRoZXJlZm9yZSB3ZSBhcHBseSBhbGwgdGVsZXBvcnRzIGFmdGVyIHRoZSBtb3JwaGluZyBpcyBkb25lK1xuICAgIGNvbnN0IHBvcnRhbENhbGxiYWNrcyA9IFtdO1xuXG4gICAgbGV0IGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IG51bGw7XG5cbiAgICBjb25zdCBtb3JwaCA9IChcbiAgICAgIHRhcmdldENvbnRhaW5lcixcbiAgICAgIHNvdXJjZSxcbiAgICAgIHdpdGhDaGlsZHJlbiA9IHRoaXMud2l0aENoaWxkcmVuLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgbW9ycGhDYWxsYmFja3MgPSB7XG4gICAgICAgIC8vIG5vcm1hbGx5LCB3ZSBhcmUgcnVubmluZyB3aXRoIGNoaWxkcmVuT25seSwgYXMgdGhlIHBhdGNoIEhUTUwgZm9yIGEgTFZcbiAgICAgICAgLy8gZG9lcyBub3QgaW5jbHVkZSB0aGUgTFYgYXR0cnMgKGRhdGEtcGh4LXNlc3Npb24sIGV0Yy4pXG4gICAgICAgIC8vIHdoZW4gd2UgYXJlIHBhdGNoaW5nIGEgbGl2ZSBjb21wb25lbnQsIHdlIGRvIHdhbnQgdG8gcGF0Y2ggdGhlIHJvb3QgZWxlbWVudCBhcyB3ZWxsO1xuICAgICAgICAvLyBhbm90aGVyIGNhc2UgaXMgdGhlIHJlY3Vyc2l2ZSBwYXRjaCBvZiBhIHN0cmVhbSBpdGVtIHRoYXQgd2FzIGtlcHQgb24gcmVzZXQgKC0+IG9uQmVmb3JlTm9kZUFkZGVkKVxuICAgICAgICBjaGlsZHJlbk9ubHk6XG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSA9PT0gbnVsbCAmJiAhd2l0aENoaWxkcmVuLFxuICAgICAgICBnZXROb2RlS2V5OiAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChET00uaXNQaHhEZXN0cm95ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgam9pbiBwYXRjaCwgdGhlbiBieSBkZWZpbml0aW9uIHRoZXJlIHdhcyBubyBQSFhfTUFHSUNfSUQuXG4gICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZWxlbWVudHMgbW9ycGhkb20gZGlzY2FyZHMuXG4gICAgICAgICAgaWYgKGlzSm9pblBhdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5pZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG5vZGUuaWQgfHwgKG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9NQUdJQ19JRCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gc2tpcCBpbmRleGluZyBmcm9tIGNoaWxkcmVuIHdoZW4gY29udGFpbmVyIGlzIHN0cmVhbVxuICAgICAgICBza2lwRnJvbUNoaWxkcmVuOiAoZnJvbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBmcm9tLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpID09PSBQSFhfU1RSRUFNO1xuICAgICAgICB9LFxuICAgICAgICAvLyB0ZWxsIG1vcnBoZG9tIGhvdyB0byBhZGQgYSBjaGlsZFxuICAgICAgICBhZGRDaGlsZDogKHBhcmVudCwgY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHJlZiwgc3RyZWFtQXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGNoaWxkKTtcbiAgICAgICAgICBpZiAocmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc2V0U3RyZWFtUmVmKGNoaWxkLCByZWYpO1xuXG4gICAgICAgICAgLy8gc3RyZWFtaW5nXG4gICAgICAgICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBjaGlsZCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1BdCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IHBhcmVudC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAmJiAhbGFzdENoaWxkLmhhc0F0dHJpYnV0ZShQSFhfU1RSRUFNX1JFRikpIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9uU3RyZWFtQ2hpbGQgPSBBcnJheS5mcm9tKHBhcmVudC5jaGlsZHJlbikuZmluZChcbiAgICAgICAgICAgICAgICAoYykgPT4gIWMuaGFzQXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbm9uU3RyZWFtQ2hpbGQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUF0ID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKVtzdHJlYW1BdF07XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBzaWJsaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlTm9kZUFkZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICAvLyBkb24ndCBhZGQgdXBkYXRlX29ubHkgbm9kZXMgaWYgdGhleSBkaWQgbm90IGFscmVhZHkgZXhpc3RcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmdldFN0cmVhbUluc2VydChlbCk/LnVwZGF0ZU9ubHkgJiZcbiAgICAgICAgICAgICF0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKGVsLCBlbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKTtcbiAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwiYWRkZWRcIiwgZWwpO1xuXG4gICAgICAgICAgbGV0IG1vcnBoZWRFbCA9IGVsO1xuICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJlYW0gaXRlbSB0aGF0IHdhcyBrZXB0IG9uIHJlc2V0LCByZWN1cnNpdmVseSBtb3JwaCBpdFxuICAgICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdKSB7XG4gICAgICAgICAgICBtb3JwaGVkRWwgPSB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtlbC5pZF07XG4gICAgICAgICAgICBtb3JwaChtb3JwaGVkRWwsIGVsLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbW9ycGhlZEVsO1xuICAgICAgICB9LFxuICAgICAgICBvbk5vZGVBZGRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXliZVJlT3JkZXJTdHJlYW0oZWwsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgcG9ydGFsQ2FsbGJhY2tzLnB1c2goKCkgPT4gdGhpcy50ZWxlcG9ydChlbCwgbW9ycGgpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBoYWNrIHRvIGZpeCBTYWZhcmkgaGFuZGxpbmcgb2YgaW1nIHNyY3NldCBhbmQgdmlkZW8gdGFnc1xuICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgZWwuc3Jjc2V0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1hc3NpZ25cbiAgICAgICAgICAgIGVsLnNyY3NldCA9IGVsLnNyY3NldDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCAmJiBlbC5hdXRvcGxheSkge1xuICAgICAgICAgICAgZWwucGxheSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoRE9NLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKSkge1xuICAgICAgICAgICAgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gZWw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoRE9NLmlzUGh4Q2hpbGQoZWwpICYmIHZpZXcub3duc0VsZW1lbnQoZWwpKSB8fFxuICAgICAgICAgICAgKERPTS5pc1BoeFN0aWNreShlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbC5wYXJlbnROb2RlKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tBZnRlcihcInBoeENoaWxkQWRkZWRcIiwgZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRhdGEtcGh4LXJ1bnRpbWUtaG9va1xuICAgICAgICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gXCJTQ1JJUFRcIiAmJiBlbC5oYXNBdHRyaWJ1dGUoUEhYX1JVTlRJTUVfSE9PSykpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkZWQucHVzaChlbCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTm9kZURpc2NhcmRlZDogKGVsKSA9PiB0aGlzLm9uTm9kZURpc2NhcmRlZChlbCksXG4gICAgICAgIG9uQmVmb3JlTm9kZURpc2NhcmRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BSVU5FKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQgIT09IG51bGwgJiZcbiAgICAgICAgICAgIGVsLmlkICYmXG4gICAgICAgICAgICBET00uaXNQaHhVcGRhdGUoZWwucGFyZW50RWxlbWVudCwgcGh4VXBkYXRlLCBbXG4gICAgICAgICAgICAgIFBIWF9TVFJFQU0sXG4gICAgICAgICAgICAgIFwiYXBwZW5kXCIsXG4gICAgICAgICAgICAgIFwicHJlcGVuZFwiLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZG9uJ3QgcmVtb3ZlIHRlbGVwb3J0ZWQgZWxlbWVudHNcbiAgICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHBvcnRhbCB0ZW1wbGF0ZSBpdHNlbGYgaXMgcmVtb3ZlZCwgcmVtb3ZlIHRoZSB0ZWxlcG9ydGVkIGVsZW1lbnQgYXMgd2VsbDtcbiAgICAgICAgICAgIC8vIHdlIGFsc28gcGVyZm9ybSBhIGNoZWNrIGFmdGVyIG1vcnBoZG9tIGlzIGZpbmlzaGVkIHRvIGNhdGNoIHBhcmVudCByZW1vdmFsc1xuICAgICAgICAgICAgY29uc3QgdGVsZXBvcnRlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICAgIGVsLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQuaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHRlbGVwb3J0ZWRFbCkge1xuICAgICAgICAgICAgICB0ZWxlcG9ydGVkRWwucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIG1vcnBoQ2FsbGJhY2tzLm9uTm9kZURpc2NhcmRlZCh0ZWxlcG9ydGVkRWwpO1xuICAgICAgICAgICAgICB0aGlzLnZpZXcuZHJvcFBvcnRhbEVsZW1lbnRJZCh0ZWxlcG9ydGVkRWwuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvbkVsVXBkYXRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKERPTS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCkpIHtcbiAgICAgICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IGVsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVzLnB1c2goZWwpO1xuICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGVsLCBmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgICAgLy8gaWYgd2UgYXJlIHBhdGNoaW5nIHRoZSByb290IHRhcmdldCBjb250YWluZXIgYW5kIHRoZSBpZCBoYXMgY2hhbmdlZCwgdHJlYXQgaXQgYXMgYSBuZXcgbm9kZVxuICAgICAgICAgIC8vIGJ5IHJlcGxhY2luZyB0aGUgZnJvbUVsIHdpdGggdGhlIHRvRWwsIHdoaWNoIGVuc3VyZXMgaG9va3MgYXJlIHRvcm4gZG93biBhbmQgcmUtY3JlYXRlZFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZyb21FbC5pZCAmJlxuICAgICAgICAgICAgZnJvbUVsLmlzU2FtZU5vZGUodGFyZ2V0Q29udGFpbmVyKSAmJlxuICAgICAgICAgICAgZnJvbUVsLmlkICE9PSB0b0VsLmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtb3JwaENhbGxiYWNrcy5vbk5vZGVEaXNjYXJkZWQoZnJvbUVsKTtcbiAgICAgICAgICAgIGZyb21FbC5yZXBsYWNlV2l0aCh0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiBtb3JwaENhbGxiYWNrcy5vbk5vZGVBZGRlZCh0b0VsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgRE9NLnN5bmNQZW5kaW5nQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICBET00ubWFpbnRhaW5Qcml2YXRlSG9va3MoXG4gICAgICAgICAgICBmcm9tRWwsXG4gICAgICAgICAgICB0b0VsLFxuICAgICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgICBwaHhWaWV3cG9ydEJvdHRvbSxcbiAgICAgICAgICApO1xuICAgICAgICAgIERPTS5jbGVhbkNoaWxkTm9kZXModG9FbCwgcGh4VXBkYXRlKTtcbiAgICAgICAgICBpZiAodGhpcy5za2lwQ0lEU2libGluZyh0b0VsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxpdmUgY29tcG9uZW50IHVzZWQgaW4gYSBzdHJlYW0sIHdlIG1heSBuZWVkIHRvIHJlb3JkZXIgaXRcbiAgICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChET00uaXNQaHhTdGlja3koZnJvbUVsKSkge1xuICAgICAgICAgICAgW1BIWF9TRVNTSU9OLCBQSFhfU1RBVElDLCBQSFhfUk9PVF9JRF1cbiAgICAgICAgICAgICAgLm1hcCgoYXR0cikgPT4gW1xuICAgICAgICAgICAgICAgIGF0dHIsXG4gICAgICAgICAgICAgICAgZnJvbUVsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmZvckVhY2goKFthdHRyLCBmcm9tVmFsLCB0b1ZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodG9WYWwgJiYgZnJvbVZhbCAhPT0gdG9WYWwpIHtcbiAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoYXR0ciwgdG9WYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSkgfHxcbiAgICAgICAgICAgIChmcm9tRWwuZm9ybSAmJiBmcm9tRWwuZm9ybS5pc1NhbWVOb2RlKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7XG4gICAgICAgICAgICAgIGlzSWdub3JlZDogRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZXMucHVzaChmcm9tRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmcm9tRWwudHlwZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZnJvbUVsLnZhbGlkaXR5ICYmXG4gICAgICAgICAgICBmcm9tRWwudmFsaWRpdHkuYmFkSW5wdXRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIFBIWF9SRUZfU1JDLCBpdCBpcyBsb2FkaW5nIG9yIGxvY2tlZCBhbmQgYXdhaXRpbmcgYW4gYWNrLlxuICAgICAgICAgIC8vIElmIGl0J3MgbG9ja2VkLCB3ZSBjbG9uZSB0aGUgZnJvbUVsIHRyZWUgYW5kIGluc3RydWN0IG1vcnBoZG9tIHRvIHVzZVxuICAgICAgICAgIC8vIHRoZSBjbG9uZWQgdHJlZSBhcyB0aGUgc291cmNlIG9mIHRoZSBtb3JwaCBmb3IgdGhpcyBicmFuY2ggZnJvbSBoZXJlIG9uIG91dC5cbiAgICAgICAgICAvLyBXZSBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBjbG9uZWQgdHJlZSBpbiB0aGUgZWxlbWVudCdzIHByaXZhdGUgZGF0YSwgYW5kXG4gICAgICAgICAgLy8gb24gYWNrICh2aWV3LnVuZG9SZWZzKSwgd2UgbW9ycGggdGhlIGNsb25lZCB0cmVlIHdpdGggdGhlIHRydWUgZnJvbUVsIGluIHRoZSBET00gdG9cbiAgICAgICAgICAvLyBhcHBseSBhbnkgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHdoaWxlIHRoZSBlbGVtZW50IHdhcyBsb2NrZWQuXG4gICAgICAgICAgY29uc3QgaXNGb2N1c2VkRm9ybUVsID1cbiAgICAgICAgICAgIGZvY3VzZWQgJiYgZnJvbUVsLmlzU2FtZU5vZGUoZm9jdXNlZCkgJiYgRE9NLmlzRm9ybUlucHV0KGZyb21FbCk7XG4gICAgICAgICAgY29uc3QgZm9jdXNlZFNlbGVjdENoYW5nZWQgPVxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmIHRoaXMuaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgaWYgKGZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSBuZXcgRWxlbWVudFJlZihmcm9tRWwpO1xuICAgICAgICAgICAgLy8gb25seSBwZXJmb3JtIHRoZSBjbG9uZSBzdGVwIGlmIHRoaXMgaXMgbm90IGEgcGF0Y2ggdGhhdCB1bmxvY2tzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHJlZi5sb2NrUmVmICYmXG4gICAgICAgICAgICAgICghdGhpcy51bmRvUmVmIHx8ICFyZWYuaXNMb2NrVW5kb25lQnkodGhpcy51bmRvUmVmKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoRE9NLmlzVXBsb2FkSW5wdXQoZnJvbUVsKSkge1xuICAgICAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwgeyBpc0lnbm9yZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVzLnB1c2goZnJvbUVsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICAgIGNvbnN0IGlzTG9ja2VkID0gZnJvbUVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuICAgICAgICAgICAgICBjb25zdCBjbG9uZSA9IGlzTG9ja2VkXG4gICAgICAgICAgICAgICAgPyBET00ucHJpdmF0ZShmcm9tRWwsIFBIWF9SRUZfTE9DSykgfHwgZnJvbUVsLmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoZnJvbUVsLCBQSFhfUkVGX0xPQ0ssIGNsb25lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNlZEZvcm1FbCkge1xuICAgICAgICAgICAgICAgICAgZnJvbUVsID0gY2xvbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoRE9NLmlzUGh4Q2hpbGQodG9FbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZTZXNzaW9uID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gICAgICAgICAgICBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHsgZXhjbHVkZTogW1BIWF9TVEFUSUNdIH0pO1xuICAgICAgICAgICAgaWYgKHByZXZTZXNzaW9uICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIHByZXZTZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdElEKTtcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhcmUgdW5kb2luZyBhIGxvY2ssIGNvcHkgcG90ZW50aWFsbHkgbmVzdGVkIGNsb25lcyBvdmVyXG4gICAgICAgICAgaWYgKHRoaXMudW5kb1JlZiAmJiBET00ucHJpdmF0ZSh0b0VsLCBQSFhfUkVGX0xPQ0spKSB7XG4gICAgICAgICAgICBET00ucHV0UHJpdmF0ZShcbiAgICAgICAgICAgICAgZnJvbUVsLFxuICAgICAgICAgICAgICBQSFhfUkVGX0xPQ0ssXG4gICAgICAgICAgICAgIERPTS5wcml2YXRlKHRvRWwsIFBIWF9SRUZfTE9DSyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBub3cgY29weSByZWd1bGFyIERPTS5wcml2YXRlIGRhdGFcbiAgICAgICAgICBET00uY29weVByaXZhdGVzKHRvRWwsIGZyb21FbCk7XG5cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKHRvRWwpKSB7XG4gICAgICAgICAgICBwb3J0YWxDYWxsYmFja3MucHVzaCgoKSA9PiB0aGlzLnRlbGVwb3J0KHRvRWwsIG1vcnBoKSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2tpcCBwYXRjaGluZyBmb2N1c2VkIGlucHV0cyB1bmxlc3MgZm9jdXMgaXMgYSBzZWxlY3QgdGhhdCBoYXMgY2hhbmdlZCBvcHRpb25zXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmXG4gICAgICAgICAgICBmcm9tRWwudHlwZSAhPT0gXCJoaWRkZW5cIiAmJlxuICAgICAgICAgICAgIWZvY3VzZWRTZWxlY3RDaGFuZ2VkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlRm9jdXNlZElucHV0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICBET00uc3luY0F0dHJzVG9Qcm9wcyhmcm9tRWwpO1xuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbCk7XG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJsdXIgZm9jdXNlZCBzZWxlY3QgaWYgaXQgY2hhbmdlZCBzbyBuYXRpdmUgVUkgaXMgdXBkYXRlZCAoaWUgc2FmYXJpIHdvbid0IHVwZGF0ZSB2aXNpYmxlIG9wdGlvbnMpXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFNlbGVjdENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgZnJvbUVsLmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChET00uaXNQaHhVcGRhdGUodG9FbCwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSkge1xuICAgICAgICAgICAgICBhcHBlbmRQcmVwZW5kVXBkYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBET01Qb3N0TW9ycGhSZXN0b3JlcihcbiAgICAgICAgICAgICAgICAgIGZyb21FbCxcbiAgICAgICAgICAgICAgICAgIHRvRWwsXG4gICAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIERPTS5zeW5jQXR0cnNUb1Byb3BzKHRvRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyh0b0VsKTtcbiAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICByZXR1cm4gZnJvbUVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIG1vcnBoZG9tKHRhcmdldENvbnRhaW5lciwgc291cmNlLCBtb3JwaENhbGxiYWNrcyk7XG4gICAgfTtcblxuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBjb250YWluZXIpO1xuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGNvbnRhaW5lciwgY29udGFpbmVyKTtcblxuICAgIGxpdmVTb2NrZXQudGltZShcIm1vcnBoZG9tXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RyZWFtcy5mb3JFYWNoKChbcmVmLCBpbnNlcnRzLCBkZWxldGVJZHMsIHJlc2V0XSkgPT4ge1xuICAgICAgICBpbnNlcnRzLmZvckVhY2goKFtrZXksIHN0cmVhbUF0LCBsaW1pdCwgdXBkYXRlT25seV0pID0+IHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUluc2VydHNba2V5XSA9IHsgcmVmLCBzdHJlYW1BdCwgbGltaXQsIHJlc2V0LCB1cGRhdGVPbmx5IH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIERPTS5hbGwoY29udGFpbmVyLCBgWyR7UEhYX1NUUkVBTV9SRUZ9PVwiJHtyZWZ9XCJdYCwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlSWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgW2lkPVwiJHtpZH1cIl1gKTtcbiAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU3RyZWFtQ2hpbGRFbGVtZW50KGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGNsZWFyIHN0cmVhbSBpdGVtcyBmcm9tIHRoZSBkZWFkIHJlbmRlciBpZiB0aGV5IGFyZSBub3QgaW5zZXJ0ZWQgYWdhaW5cbiAgICAgIGlmIChpc0pvaW5QYXRjaCkge1xuICAgICAgICBET00uYWxsKHRoaXMuY29udGFpbmVyLCBgWyR7cGh4VXBkYXRlfT0ke1BIWF9TVFJFQU19XWApXG4gICAgICAgICAgLy8gaXQgaXMgaW1wb3J0YW50IHRvIGZpbHRlciB0aGUgZWxlbWVudCBiZWZvcmUgcmVtb3ZpbmcgdGhlbSwgYXNcbiAgICAgICAgICAvLyBpdCBtYXkgaGFwcGVuIHRoYXQgc3RyZWFtcyBhcmUgbmVzdGVkIGFuZCB0aGUgb3duZXIgY2hlY2sgZmFpbHMgaWZcbiAgICAgICAgICAvLyBhIHBhcmVudCBpcyByZW1vdmVkIGJlZm9yZSBhIGNoaWxkXG4gICAgICAgICAgLmZpbHRlcigoZWwpID0+IHRoaXMudmlldy5vd25zRWxlbWVudChlbCkpXG4gICAgICAgICAgLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IHBlcmZvcm1lZCB0aGUgb3duZXIgY2hlY2ssIGVhY2ggY2hpbGQgaXMgZ3VhcmFudGVlZCB0byBiZSBvd25lZFxuICAgICAgICAgICAgICAvLyBieSB0aGUgdmlldy4gVG8gcHJldmVudCB0aGUgbmVzdGVkIG93bmVyIGNoZWNrIGZyb20gZmFpbGluZyBpbiBjYXNlIG9mIG5lc3RlZFxuICAgICAgICAgICAgICAvLyBzdHJlYW1zIHdoZXJlIHRoZSBwYXJlbnQgaXMgcmVtb3ZlZCBiZWZvcmUgdGhlIGNoaWxkLCB3ZSBmb3JjZSB0aGUgcmVtb3ZhbFxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbW9ycGgodGFyZ2V0Q29udGFpbmVyLCBodG1sKTtcbiAgICAgIC8vIG5vcm1hbCBwYXRjaCBjb21wbGV0ZSwgdGVsZXBvcnQgZWxlbWVudHMgbm93XG4gICAgICBwb3J0YWxDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKCkpO1xuICAgICAgLy8gY2hlY2sgZm9yIGFueSB0ZWxlcG9ydGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBpbiB0aGUgdmlldyBhbnkgbW9yZVxuICAgICAgLy8gYW5kIHJlbW92ZSB0aGVtXG4gICAgICB0aGlzLnZpZXcucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGVsKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kcm9wUG9ydGFsRWxlbWVudElkKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGxpdmVTb2NrZXQuaXNEZWJ1Z0VuYWJsZWQoKSkge1xuICAgICAgZGV0ZWN0RHVwbGljYXRlSWRzKCk7XG4gICAgICBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyh0aGlzLnN0cmVhbUluc2VydHMpO1xuICAgICAgLy8gd2FybiBpZiB0aGVyZSBhcmUgYW55IGlucHV0cyBuYW1lZCBcImlkXCJcbiAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImlucHV0W25hbWU9aWRdXCIpKS5mb3JFYWNoKFxuICAgICAgICAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBub2RlLmZvcm0pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdEZXRlY3RlZCBhbiBpbnB1dCB3aXRoIG5hbWU9XCJpZFwiIGluc2lkZSBhIGZvcm0hIFRoaXMgd2lsbCBjYXVzZSBwcm9ibGVtcyB3aGVuIHBhdGNoaW5nIHRoZSBET00uXFxuJyxcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXBwZW5kUHJlcGVuZFVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGl2ZVNvY2tldC50aW1lKFwicG9zdC1tb3JwaCBhcHBlbmQvcHJlcGVuZCByZXN0b3JhdGlvblwiLCAoKSA9PiB7XG4gICAgICAgIGFwcGVuZFByZXBlbmRVcGRhdGVzLmZvckVhY2goKHVwZGF0ZSkgPT4gdXBkYXRlLnBlcmZvcm0oKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXZlU29ja2V0LnNpbGVuY2VFdmVudHMoKCkgPT5cbiAgICAgIERPTS5yZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCksXG4gICAgKTtcbiAgICBET00uZGlzcGF0Y2hFdmVudChkb2N1bWVudCwgXCJwaHg6dXBkYXRlXCIpO1xuICAgIGFkZGVkLmZvckVhY2goKGVsKSA9PiB0aGlzLnRyYWNrQWZ0ZXIoXCJhZGRlZFwiLCBlbCkpO1xuICAgIHVwZGF0ZXMuZm9yRWFjaCgoZWwpID0+IHRoaXMudHJhY2tBZnRlcihcInVwZGF0ZWRcIiwgZWwpKTtcblxuICAgIHRoaXMudHJhbnNpdGlvblBlbmRpbmdSZW1vdmVzKCk7XG5cbiAgICBpZiAoZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkKSB7XG4gICAgICBsaXZlU29ja2V0LnVubG9hZCgpO1xuICAgICAgLy8gY2hlY2sgZm9yIHN1Ym1pdHRlciBhbmQgaW5qZWN0IGl0IGFzIGhpZGRlbiBpbnB1dCBmb3IgZXh0ZXJuYWwgc3VibWl0O1xuICAgICAgLy8gSW4gdGhlb3J5LCBpdCBjb3VsZCBoYXBwZW4gdGhhdCB0aGUgc3RvcmVkIHN1Ym1pdHRlciBpcyBvdXRkYXRlZCBhbmQgZG9lc24ndFxuICAgICAgLy8gZXhpc3QgaW4gdGhlIERPTSBhbnkgbW9yZSwgYnV0IHRoaXMgaXMgdW5saWtlbHksIHNvIHdlIGp1c3QgYWNjZXB0IGl0IGZvciBub3cuXG4gICAgICBjb25zdCBzdWJtaXR0ZXIgPSBET00ucHJpdmF0ZShleHRlcm5hbEZvcm1UcmlnZ2VyZWQsIFwic3VibWl0dGVyXCIpO1xuICAgICAgaWYgKHN1Ym1pdHRlciAmJiBzdWJtaXR0ZXIubmFtZSAmJiB0YXJnZXRDb250YWluZXIuY29udGFpbnMoc3VibWl0dGVyKSkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIGNvbnN0IGZvcm1JZCA9IHN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtXCIpO1xuICAgICAgICBpZiAoZm9ybUlkKSB7XG4gICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwiZm9ybVwiLCBmb3JtSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICAgICAgaW5wdXQudmFsdWUgPSBzdWJtaXR0ZXIudmFsdWU7XG4gICAgICAgIHN1Ym1pdHRlci5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShpbnB1dCwgc3VibWl0dGVyKTtcbiAgICAgIH1cbiAgICAgIC8vIHVzZSBwcm90b3R5cGUncyBzdWJtaXQgaW4gY2FzZSB0aGVyZSdzIGEgZm9ybSBjb250cm9sIHdpdGggbmFtZSBvciBpZCBvZiBcInN1Ym1pdFwiXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEZvcm1FbGVtZW50L3N1Ym1pdFxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkuc3VibWl0LmNhbGwoXG4gICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25Ob2RlRGlzY2FyZGVkKGVsKSB7XG4gICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICBpZiAoRE9NLmlzUGh4Q2hpbGQoZWwpIHx8IERPTS5pc1BoeFN0aWNreShlbCkpIHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5kZXN0cm95Vmlld0J5RWwoZWwpO1xuICAgIH1cbiAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJkaXNjYXJkZWRcIiwgZWwpO1xuICB9XG5cbiAgbWF5YmVQZW5kaW5nUmVtb3ZlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUodGhpcy5waHhSZW1vdmUpICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBlbmRpbmdSZW1vdmVzLnB1c2gobm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgZm9yY2UgPSBmYWxzZSkge1xuICAgIC8vIG1ha2Ugc3VyZSB0byBvbmx5IHJlbW92ZSBlbGVtZW50cyBvd25lZCBieSB0aGUgY3VycmVudCB2aWV3XG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zMDQ3XG4gICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zNjgxXG4gICAgaWYgKCFmb3JjZSAmJiAhdGhpcy52aWV3Lm93bnNFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG5vZGUgaWYgaXQgaXMgYWN0dWFsbHkgcmUtYWRkZWQgaW4gdGhlIHNhbWUgcGF0Y2hcbiAgICAvLyB3ZSBkbyBOT1Qgd2FudCB0byBleGVjdXRlIHBoeC1yZW1vdmUsIHdlIGRvIE5PVCB3YW50IHRvIGNhbGwgb25Ob2RlRGlzY2FyZGVkXG4gICAgaWYgKHRoaXMuc3RyZWFtSW5zZXJ0c1tjaGlsZC5pZF0pIHtcbiAgICAgIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtjaGlsZC5pZF0gPSBjaGlsZDtcbiAgICAgIGNoaWxkLnJlbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IHJlbW92ZSB0aGUgZWxlbWVudCBub3cgaWYgaXQgaGFzIG5vIHBoeC1yZW1vdmUgYmluZGluZ1xuICAgICAgaWYgKCF0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShjaGlsZCkpIHtcbiAgICAgICAgY2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRTdHJlYW1JbnNlcnQoZWwpIHtcbiAgICBjb25zdCBpbnNlcnQgPSBlbC5pZCA/IHRoaXMuc3RyZWFtSW5zZXJ0c1tlbC5pZF0gOiB7fTtcbiAgICByZXR1cm4gaW5zZXJ0IHx8IHt9O1xuICB9XG5cbiAgc2V0U3RyZWFtUmVmKGVsLCByZWYpIHtcbiAgICBET00ucHV0U3RpY2t5KGVsLCBQSFhfU1RSRUFNX1JFRiwgKGVsKSA9PlxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGLCByZWYpLFxuICAgICk7XG4gIH1cblxuICBtYXliZVJlT3JkZXJTdHJlYW0oZWwsIGlzTmV3KSB7XG4gICAgY29uc3QgeyByZWYsIHN0cmVhbUF0LCByZXNldCB9ID0gdGhpcy5nZXRTdHJlYW1JbnNlcnQoZWwpO1xuICAgIGlmIChzdHJlYW1BdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byBzZXQgdGhlIFBIWF9TVFJFQU1fUkVGIGhlcmUgYXMgd2VsbCBhcyBhZGRDaGlsZCBpcyBpbnZva2VkIG9ubHkgZm9yIHBhcmVudHNcbiAgICB0aGlzLnNldFN0cmVhbVJlZihlbCwgcmVmKTtcblxuICAgIGlmICghcmVzZXQgJiYgIWlzTmV3KSB7XG4gICAgICAvLyB3ZSBvbmx5IHJlb3JkZXIgaWYgdGhlIGVsZW1lbnQgaXMgbmV3IG9yIGl0J3MgYSBzdHJlYW0gcmVzZXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBoYXMgYSBwYXJlbnQgZWxlbWVudDtcbiAgICAvLyBpdCBkb2Vzbid0IGlmIHdlIGFyZSBjdXJyZW50bHkgcmVjdXJzaXZlbHkgbW9ycGhpbmcgKHJlc3RvcmluZyBhIHNhdmVkIHN0cmVhbSBjaGlsZClcbiAgICAvLyBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIG5vdCB5ZXQgYWRkZWQgdG8gdGhlIHJlYWwgZG9tO1xuICAgIC8vIHJlb3JkZXJpbmcgZG9lcyBub3QgbWFrZSBzZW5zZSBpbiB0aGF0IGNhc2UgYW55d2F5XG4gICAgaWYgKCFlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICBlbC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShlbCwgZWwucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgfSBlbHNlIGlmIChzdHJlYW1BdCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKTtcbiAgICAgIGNvbnN0IG9sZEluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlbCk7XG4gICAgICBpZiAoc3RyZWFtQXQgPj0gY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xuICAgICAgICBlbC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpYmxpbmcgPSBjaGlsZHJlbltzdHJlYW1BdF07XG4gICAgICAgIGlmIChvbGRJbmRleCA+IHN0cmVhbUF0KSB7XG4gICAgICAgICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZWwsIHNpYmxpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVsLCBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm1heWJlTGltaXRTdHJlYW0oZWwpO1xuICB9XG5cbiAgbWF5YmVMaW1pdFN0cmVhbShlbCkge1xuICAgIGNvbnN0IHsgbGltaXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGVsKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGxpbWl0ICE9PSBudWxsICYmIEFycmF5LmZyb20oZWwucGFyZW50RWxlbWVudC5jaGlsZHJlbik7XG4gICAgaWYgKGxpbWl0ICYmIGxpbWl0IDwgMCAmJiBjaGlsZHJlbi5sZW5ndGggPiBsaW1pdCAqIC0xKSB7XG4gICAgICBjaGlsZHJlblxuICAgICAgICAuc2xpY2UoMCwgY2hpbGRyZW4ubGVuZ3RoICsgbGltaXQpXG4gICAgICAgIC5mb3JFYWNoKChjaGlsZCkgPT4gdGhpcy5yZW1vdmVTdHJlYW1DaGlsZEVsZW1lbnQoY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKGxpbWl0ICYmIGxpbWl0ID49IDAgJiYgY2hpbGRyZW4ubGVuZ3RoID4gbGltaXQpIHtcbiAgICAgIGNoaWxkcmVuXG4gICAgICAgIC5zbGljZShsaW1pdClcbiAgICAgICAgLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCkpO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zaXRpb25QZW5kaW5nUmVtb3ZlcygpIHtcbiAgICBjb25zdCB7IHBlbmRpbmdSZW1vdmVzLCBsaXZlU29ja2V0IH0gPSB0aGlzO1xuICAgIGlmIChwZW5kaW5nUmVtb3Zlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaXZlU29ja2V0LnRyYW5zaXRpb25SZW1vdmVzKHBlbmRpbmdSZW1vdmVzLCAoKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmVzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBET00uZmlyc3RQaHhDaGlsZChlbCk7XG4gICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICBsaXZlU29ja2V0LmRlc3Ryb3lWaWV3QnlFbChjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50cmFja0FmdGVyKFwidHJhbnNpdGlvbnNEaXNjYXJkZWRcIiwgcGVuZGluZ1JlbW92ZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCkge1xuICAgIGlmICghKGZyb21FbCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB8fCBmcm9tRWwubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZyb21FbC5vcHRpb25zLmxlbmd0aCAhPT0gdG9FbC5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8ga2VlcCB0aGUgY3VycmVudCB2YWx1ZVxuICAgIHRvRWwudmFsdWUgPSBmcm9tRWwudmFsdWU7XG5cbiAgICAvLyBpbiBnZW5lcmFsIHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsIHdpdGggdXNpbmcgaXNFcXVhbE5vZGUgYXMgaXQgZG9lcyBub3QgYSByZWxpYWJsZVxuICAgIC8vIERPTSB0cmVlIGVxdWFsaXR5IGNoZWNrLCBidXQgZm9yIHNlbGVjdGlvbiBhdHRyaWJ1dGVzIGFuZCBvcHRpb25zIGl0IHdvcmtzIGZpbmVcbiAgICByZXR1cm4gIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKTtcbiAgfVxuXG4gIGlzQ0lEUGF0Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMuY2lkUGF0Y2g7XG4gIH1cblxuICBza2lwQ0lEU2libGluZyhlbCkge1xuICAgIHJldHVybiBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9TS0lQKTtcbiAgfVxuXG4gIHRhcmdldENJRENvbnRhaW5lcihodG1sKSB7XG4gICAgaWYgKCF0aGlzLmlzQ0lEUGF0Y2goKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdChcbiAgICAgIHRoaXMudmlldy5pZCxcbiAgICAgIHRoaXMudGFyZ2V0Q0lELFxuICAgICk7XG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAwICYmIERPTS5jaGlsZE5vZGVMZW5ndGgoaHRtbCkgPT09IDEpIHtcbiAgICAgIHJldHVybiBmaXJzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpcnN0ICYmIGZpcnN0LnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgaW5kZXhPZihwYXJlbnQsIGNoaWxkKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKS5pbmRleE9mKGNoaWxkKTtcbiAgfVxuXG4gIHRlbGVwb3J0KGVsLCBtb3JwaCkge1xuICAgIGNvbnN0IHRhcmdldFNlbGVjdG9yID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICAgIGNvbnN0IHBvcnRhbENvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpO1xuICAgIGlmICghcG9ydGFsQ29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwicG9ydGFsIHRhcmdldCB3aXRoIHNlbGVjdG9yIFwiICsgdGFyZ2V0U2VsZWN0b3IgKyBcIiBub3QgZm91bmRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIHBoeC1wb3J0YWwgdGVtcGxhdGVzIG11c3QgaGF2ZSBhIHNpbmdsZSByb290IGVsZW1lbnQsIHNvIHdlIGFzc3VtZSB0aGlzIHRvIGJlXG4gICAgLy8gdGhlIGNhc2UgaGVyZVxuICAgIGNvbnN0IHRvVGVsZXBvcnQgPSBlbC5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgIC8vIHRoZSBQSFhfU0tJUCBvcHRpbWl6YXRpb24gY2FuIGFsc28gYXBwbHkgaW5zaWRlIG9mIHRoZSA8dGVtcGxhdGU+IGVsZW1lbnRzXG4gICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcodG9UZWxlcG9ydCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0b1RlbGVwb3J0Py5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcInBoeC1wb3J0YWwgdGVtcGxhdGUgbXVzdCBoYXZlIGEgc2luZ2xlIHJvb3QgZWxlbWVudCB3aXRoIElEIVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0b1RlbGVwb3J0LmlkKTtcbiAgICBsZXQgcG9ydGFsVGFyZ2V0O1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgbmVlZHMgdG8gYmUgbW92ZWQgdG8gYW5vdGhlciB0YXJnZXRcbiAgICAgIGlmICghcG9ydGFsQ29udGFpbmVyLmNvbnRhaW5zKGV4aXN0aW5nKSkge1xuICAgICAgICBwb3J0YWxDb250YWluZXIuYXBwZW5kQ2hpbGQoZXhpc3RpbmcpO1xuICAgICAgfVxuICAgICAgLy8gd2UgYWxyZWFkeSB0ZWxlcG9ydGVkIGluIGEgcHJldmlvdXMgcGF0Y2hcbiAgICAgIHBvcnRhbFRhcmdldCA9IGV4aXN0aW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjcmVhdGUgZW1wdHkgdGFyZ2V0IGFuZCBtb3JwaCBpdCByZWN1cnNpdmVseVxuICAgICAgcG9ydGFsVGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0b1RlbGVwb3J0LnRhZ05hbWUpO1xuICAgICAgcG9ydGFsQ29udGFpbmVyLmFwcGVuZENoaWxkKHBvcnRhbFRhcmdldCk7XG4gICAgfVxuICAgIC8vIG1hcmsgdGhlIHRhcmdldCBhcyB0ZWxlcG9ydGVkO1xuICAgIC8vIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgYXR0cmlidXRlIG1vZGlmaWNhdGlvbnMsIHdlIHNldCB0aGUgYXR0cmlidXRlXG4gICAgLy8gb24gdGhlIHNvdXJjZSBhbmQgcmVtb3ZlIGl0IGFmdGVyIG1vcnBoaW5nICh3ZSBjb3VsZCBhbHNvIGp1c3Qga2VlcCBpdClcbiAgICAvLyBvdGhlcndpc2UgbW9ycGhkb20gd291bGQgcmVtb3ZlIGl0LCBhcyB0aGUgcmVmIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzb3VyY2VcbiAgICAvLyBhbmQgd2UnZCBuZWVkIHRvIHNldCBpdCBiYWNrIGFmdGVyIGVhY2ggbW9ycGhcbiAgICB0b1RlbGVwb3J0LnNldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYsIHRoaXMudmlldy5pZCk7XG4gICAgdG9UZWxlcG9ydC5zZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDLCBlbC5pZCk7XG4gICAgbW9ycGgocG9ydGFsVGFyZ2V0LCB0b1RlbGVwb3J0LCB0cnVlKTtcbiAgICB0b1RlbGVwb3J0LnJlbW92ZUF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpO1xuICAgIHRvVGVsZXBvcnQucmVtb3ZlQXR0cmlidXRlKFBIWF9URUxFUE9SVEVEX1NSQyk7XG4gICAgLy8gc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRlbGVwb3J0ZWQgZWxlbWVudCBpbiB0aGUgdmlld1xuICAgIC8vIHRvIGNsZWFudXAgd2hlbiB0aGUgdmlldyBpcyBkZXN0cm95ZWQsIGluIGNhc2UgdGhlIHBvcnRhbCB0YXJnZXRcbiAgICAvLyBpcyBvdXRzaWRlIHRoZSB2aWV3IGl0c2VsZlxuICAgIHRoaXMudmlldy5wdXNoUG9ydGFsRWxlbWVudElkKHRvVGVsZXBvcnQuaWQpO1xuICB9XG5cbiAgaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSkge1xuICAgIC8vIHVzdWFsbHksIHNjcmlwdHMgYXJlIG5vdCBleGVjdXRlZCB3aGVuIG1vcnBoZG9tIGFkZHMgdGhlbSB0byB0aGUgRE9NXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIHJ1bnRpbWUgY29sb2NhdGVkIGhvb2tzXG4gICAgY29uc3QgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZShQSFhfUlVOVElNRV9IT09LKTtcbiAgICBsZXQgbm9uY2UgPSBlbC5oYXNBdHRyaWJ1dGUoXCJub25jZVwiKSA/IGVsLmdldEF0dHJpYnV0ZShcIm5vbmNlXCIpIDogbnVsbDtcbiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKFwibm9uY2VcIikpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc291cmNlO1xuICAgICAgbm9uY2UgPSB0ZW1wbGF0ZS5jb250ZW50XG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gKVxuICAgICAgICAuZ2V0QXR0cmlidXRlKFwibm9uY2VcIik7XG4gICAgfVxuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgc2NyaXB0LnRleHRDb250ZW50ID0gZWwudGV4dENvbnRlbnQ7XG4gICAgRE9NLm1lcmdlQXR0cnMoc2NyaXB0LCBlbCwgeyBpc0lnbm9yZWQ6IGZhbHNlIH0pO1xuICAgIGlmIChub25jZSkge1xuICAgICAgc2NyaXB0Lm5vbmNlID0gbm9uY2U7XG4gICAgfVxuICAgIGVsLnJlcGxhY2VXaXRoKHNjcmlwdCk7XG4gICAgZWwgPSBzY3JpcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBDT01QT05FTlRTLFxuICBURU1QTEFURVMsXG4gIEVWRU5UUyxcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX1ZJRVdfUkVGLFxuICBQSFhfU0tJUCxcbiAgUEhYX01BR0lDX0lELFxuICBSRVBMWSxcbiAgU1RBVElDLFxuICBUSVRMRSxcbiAgU1RSRUFNLFxuICBST09ULFxuICBLRVlFRCxcbiAgS0VZRURfQ09VTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBpc09iamVjdCwgbG9nRXJyb3IsIGlzQ2lkIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgVk9JRF9UQUdTID0gbmV3IFNldChbXG4gIFwiYXJlYVwiLFxuICBcImJhc2VcIixcbiAgXCJiclwiLFxuICBcImNvbFwiLFxuICBcImNvbW1hbmRcIixcbiAgXCJlbWJlZFwiLFxuICBcImhyXCIsXG4gIFwiaW1nXCIsXG4gIFwiaW5wdXRcIixcbiAgXCJrZXlnZW5cIixcbiAgXCJsaW5rXCIsXG4gIFwibWV0YVwiLFxuICBcInBhcmFtXCIsXG4gIFwic291cmNlXCIsXG4gIFwidHJhY2tcIixcbiAgXCJ3YnJcIixcbl0pO1xuY29uc3QgcXVvdGVDaGFycyA9IG5ldyBTZXQoW1wiJ1wiLCAnXCInXSk7XG5cbmV4cG9ydCBjb25zdCBtb2RpZnlSb290ID0gKGh0bWwsIGF0dHJzLCBjbGVhcklubmVySFRNTCkgPT4ge1xuICBsZXQgaSA9IDA7XG4gIGxldCBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIGxldCBiZWZvcmVUYWcsIGFmdGVyVGFnLCB0YWcsIHRhZ05hbWVFbmRzQXQsIGlkLCBuZXdIVE1MO1xuXG4gIGNvbnN0IGxvb2thaGVhZCA9IGh0bWwubWF0Y2goL14oXFxzKig/OjwhLS0uKj8tLT5cXHMqKSopPChbXlxcc1xcLz5dKykvKTtcbiAgaWYgKGxvb2thaGVhZCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbWFsZm9ybWVkIGh0bWwgJHtodG1sfWApO1xuICB9XG5cbiAgaSA9IGxvb2thaGVhZFswXS5sZW5ndGg7XG4gIGJlZm9yZVRhZyA9IGxvb2thaGVhZFsxXTtcbiAgdGFnID0gbG9va2FoZWFkWzJdO1xuICB0YWdOYW1lRW5kc0F0ID0gaTtcblxuICAvLyBTY2FuIHRoZSBvcGVuaW5nIHRhZyBmb3IgaWQsIGlmIHRoZXJlIGlzIGFueVxuICBmb3IgKGk7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGh0bWwuY2hhckF0KGkpID09PSBcIj5cIikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChodG1sLmNoYXJBdChpKSA9PT0gXCI9XCIpIHtcbiAgICAgIGNvbnN0IGlzSWQgPSBodG1sLnNsaWNlKGkgLSAzLCBpKSA9PT0gXCIgaWRcIjtcbiAgICAgIGkrKztcbiAgICAgIGNvbnN0IGNoYXIgPSBodG1sLmNoYXJBdChpKTtcbiAgICAgIGlmIChxdW90ZUNoYXJzLmhhcyhjaGFyKSkge1xuICAgICAgICBjb25zdCBhdHRyU3RhcnRzQXQgPSBpO1xuICAgICAgICBpKys7XG4gICAgICAgIGZvciAoaTsgaSA8IGh0bWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoaHRtbC5jaGFyQXQoaSkgPT09IGNoYXIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJZCkge1xuICAgICAgICAgIGlkID0gaHRtbC5zbGljZShhdHRyU3RhcnRzQXQgKyAxLCBpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBjbG9zZUF0ID0gaHRtbC5sZW5ndGggLSAxO1xuICBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIHdoaWxlIChjbG9zZUF0ID49IGJlZm9yZVRhZy5sZW5ndGggKyB0YWcubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IGh0bWwuY2hhckF0KGNsb3NlQXQpO1xuICAgIGlmIChpbnNpZGVDb21tZW50KSB7XG4gICAgICBpZiAoY2hhciA9PT0gXCItXCIgJiYgaHRtbC5zbGljZShjbG9zZUF0IC0gMywgY2xvc2VBdCkgPT09IFwiPCEtXCIpIHtcbiAgICAgICAgaW5zaWRlQ29tbWVudCA9IGZhbHNlO1xuICAgICAgICBjbG9zZUF0IC09IDQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9zZUF0IC09IDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSBcIj5cIiAmJiBodG1sLnNsaWNlKGNsb3NlQXQgLSAyLCBjbG9zZUF0KSA9PT0gXCItLVwiKSB7XG4gICAgICBpbnNpZGVDb21tZW50ID0gdHJ1ZTtcbiAgICAgIGNsb3NlQXQgLT0gMztcbiAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiPlwiKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY2xvc2VBdCAtPSAxO1xuICAgIH1cbiAgfVxuICBhZnRlclRhZyA9IGh0bWwuc2xpY2UoY2xvc2VBdCArIDEsIGh0bWwubGVuZ3RoKTtcblxuICBjb25zdCBhdHRyc1N0ciA9IE9iamVjdC5rZXlzKGF0dHJzKVxuICAgIC5tYXAoKGF0dHIpID0+IChhdHRyc1thdHRyXSA9PT0gdHJ1ZSA/IGF0dHIgOiBgJHthdHRyfT1cIiR7YXR0cnNbYXR0cl19XCJgKSlcbiAgICAuam9pbihcIiBcIik7XG5cbiAgaWYgKGNsZWFySW5uZXJIVE1MKSB7XG4gICAgLy8gS2VlcCB0aGUgaWQgaWYgYW55XG4gICAgY29uc3QgaWRBdHRyU3RyID0gaWQgPyBgIGlkPVwiJHtpZH1cImAgOiBcIlwiO1xuICAgIGlmIChWT0lEX1RBR1MuaGFzKHRhZykpIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0vPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0+PC8ke3RhZ30+YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmVzdCA9IGh0bWwuc2xpY2UodGFnTmFtZUVuZHNBdCwgY2xvc2VBdCArIDEpO1xuICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0ke3Jlc3R9YDtcbiAgfVxuXG4gIHJldHVybiBbbmV3SFRNTCwgYmVmb3JlVGFnLCBhZnRlclRhZ107XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJlZCB7XG4gIHN0YXRpYyBleHRyYWN0KGRpZmYpIHtcbiAgICBjb25zdCB7IFtSRVBMWV06IHJlcGx5LCBbRVZFTlRTXTogZXZlbnRzLCBbVElUTEVdOiB0aXRsZSB9ID0gZGlmZjtcbiAgICBkZWxldGUgZGlmZltSRVBMWV07XG4gICAgZGVsZXRlIGRpZmZbRVZFTlRTXTtcbiAgICBkZWxldGUgZGlmZltUSVRMRV07XG4gICAgcmV0dXJuIHsgZGlmZiwgdGl0bGUsIHJlcGx5OiByZXBseSB8fCBudWxsLCBldmVudHM6IGV2ZW50cyB8fCBbXSB9O1xuICB9XG5cbiAgY29uc3RydWN0b3Iodmlld0lkLCByZW5kZXJlZCkge1xuICAgIHRoaXMudmlld0lkID0gdmlld0lkO1xuICAgIHRoaXMucmVuZGVyZWQgPSB7fTtcbiAgICB0aGlzLm1hZ2ljSWQgPSAwO1xuICAgIHRoaXMubWVyZ2VEaWZmKHJlbmRlcmVkKTtcbiAgfVxuXG4gIHBhcmVudFZpZXdJZCgpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SWQ7XG4gIH1cblxuICB0b1N0cmluZyhvbmx5Q2lkcykge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkLFxuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICAgIG9ubHlDaWRzLFxuICAgICAgdHJ1ZSxcbiAgICAgIHt9LFxuICAgICk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfTtcbiAgfVxuXG4gIHJlY3Vyc2l2ZVRvU3RyaW5nKFxuICAgIHJlbmRlcmVkLFxuICAgIGNvbXBvbmVudHMgPSByZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICBvbmx5Q2lkcyxcbiAgICBjaGFuZ2VUcmFja2luZyxcbiAgICByb290QXR0cnMsXG4gICkge1xuICAgIG9ubHlDaWRzID0gb25seUNpZHMgPyBuZXcgU2V0KG9ubHlDaWRzKSA6IG51bGw7XG4gICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgYnVmZmVyOiBcIlwiLFxuICAgICAgY29tcG9uZW50czogY29tcG9uZW50cyxcbiAgICAgIG9ubHlDaWRzOiBvbmx5Q2lkcyxcbiAgICAgIHN0cmVhbXM6IG5ldyBTZXQoKSxcbiAgICB9O1xuICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIG51bGwsIG91dHB1dCwgY2hhbmdlVHJhY2tpbmcsIHJvb3RBdHRycyk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBvdXRwdXQuYnVmZmVyLCBzdHJlYW1zOiBvdXRwdXQuc3RyZWFtcyB9O1xuICB9XG5cbiAgY29tcG9uZW50Q0lEcyhkaWZmKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGRpZmZbQ09NUE9ORU5UU10gfHwge30pLm1hcCgoaSkgPT4gcGFyc2VJbnQoaSkpO1xuICB9XG5cbiAgaXNDb21wb25lbnRPbmx5RGlmZihkaWZmKSB7XG4gICAgaWYgKCFkaWZmW0NPTVBPTkVOVFNdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhkaWZmKS5sZW5ndGggPT09IDE7XG4gIH1cblxuICBnZXRDb21wb25lbnQoZGlmZiwgY2lkKSB7XG4gICAgcmV0dXJuIGRpZmZbQ09NUE9ORU5UU11bY2lkXTtcbiAgfVxuXG4gIHJlc2V0UmVuZGVyKGNpZCkge1xuICAgIC8vIHdlIGFyZSByYWNpbmcgYSBjb21wb25lbnQgZGVzdHJveSwgaXQgY291bGQgbm90IGV4aXN0LCBzb1xuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHRyeSB0byBzZXQgcmVzZXQgb24gdW5kZWZpbmVkXG4gICAgaWYgKHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11bY2lkXSkge1xuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdLnJlc2V0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBtZXJnZURpZmYoZGlmZikge1xuICAgIGNvbnN0IG5ld2MgPSBkaWZmW0NPTVBPTkVOVFNdO1xuICAgIGNvbnN0IGNhY2hlID0ge307XG4gICAgZGVsZXRlIGRpZmZbQ09NUE9ORU5UU107XG4gICAgdGhpcy5yZW5kZXJlZCA9IHRoaXMubXV0YWJsZU1lcmdlKHRoaXMucmVuZGVyZWQsIGRpZmYpO1xuICAgIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10gPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdIHx8IHt9O1xuXG4gICAgaWYgKG5ld2MpIHtcbiAgICAgIGNvbnN0IG9sZGMgPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdO1xuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG5ld2NbY2lkXSA9IHRoaXMuY2FjaGVkRmluZENvbXBvbmVudChjaWQsIG5ld2NbY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG9sZGNbY2lkXSA9IG5ld2NbY2lkXTtcbiAgICAgIH1cbiAgICAgIGRpZmZbQ09NUE9ORU5UU10gPSBuZXdjO1xuICAgIH1cbiAgfVxuXG4gIGNhY2hlZEZpbmRDb21wb25lbnQoY2lkLCBjZGlmZiwgb2xkYywgbmV3YywgY2FjaGUpIHtcbiAgICBpZiAoY2FjaGVbY2lkXSkge1xuICAgICAgcmV0dXJuIGNhY2hlW2NpZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZGlmZixcbiAgICAgICAgc3RhdCxcbiAgICAgICAgc2NpZCA9IGNkaWZmW1NUQVRJQ107XG5cbiAgICAgIGlmIChpc0NpZChzY2lkKSkge1xuICAgICAgICBsZXQgdGRpZmY7XG5cbiAgICAgICAgaWYgKHNjaWQgPiAwKSB7XG4gICAgICAgICAgdGRpZmYgPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoc2NpZCwgbmV3Y1tzY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRkaWZmID0gb2xkY1stc2NpZF07XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ID0gdGRpZmZbU1RBVElDXTtcbiAgICAgICAgbmRpZmYgPSB0aGlzLmNsb25lTWVyZ2UodGRpZmYsIGNkaWZmLCB0cnVlKTtcbiAgICAgICAgbmRpZmZbU1RBVElDXSA9IHN0YXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZGlmZiA9XG4gICAgICAgICAgY2RpZmZbU1RBVElDXSAhPT0gdW5kZWZpbmVkIHx8IG9sZGNbY2lkXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGNkaWZmXG4gICAgICAgICAgICA6IHRoaXMuY2xvbmVNZXJnZShvbGRjW2NpZF0sIGNkaWZmLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGNhY2hlW2NpZF0gPSBuZGlmZjtcbiAgICAgIHJldHVybiBuZGlmZjtcbiAgICB9XG4gIH1cblxuICBtdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBpZiAoc291cmNlW1NUQVRJQ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgfVxuXG4gIGRvTXV0YWJsZU1lcmdlKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKHNvdXJjZVtLRVlFRF0pIHtcbiAgICAgIHRoaXMubWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsID0gdGFyZ2V0W2tleV07XG4gICAgICAgIGNvbnN0IGlzT2JqVmFsID0gaXNPYmplY3QodmFsKTtcbiAgICAgICAgaWYgKGlzT2JqVmFsICYmIHZhbFtTVEFUSUNdID09PSB1bmRlZmluZWQgJiYgaXNPYmplY3QodGFyZ2V0VmFsKSkge1xuICAgICAgICAgIHRoaXMuZG9NdXRhYmxlTWVyZ2UodGFyZ2V0VmFsLCB2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXRbUk9PVF0pIHtcbiAgICAgIHRhcmdldC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lKGRpZmYpIHtcbiAgICBpZiAoXCJzdHJ1Y3R1cmVkQ2xvbmVcIiBpbiB3aW5kb3cpIHtcbiAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoZGlmZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZhbGxiYWNrIGZvciBqZXN0XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkaWZmKSk7XG4gICAgfVxuICB9XG5cbiAgLy8ga2V5ZWQgY29tcHJlaGVuc2lvbnNcbiAgbWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSkge1xuICAgIC8vIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHRhcmdldCBzaW5jZSBlbGVtZW50cyBjYW4gbW92ZSBhbmQgb3RoZXJ3aXNlXG4gICAgLy8gaXQgY291bGQgaGFwcGVuIHRoYXQgd2UgbW9kaWZ5IGFuIGVsZW1lbnQgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlZmVyIHRvXG4gICAgLy8gbGF0ZXJcbiAgICBjb25zdCBjbG9uZWRUYXJnZXQgPSB0aGlzLmNsb25lKHRhcmdldCk7XG4gICAgT2JqZWN0LmVudHJpZXMoc291cmNlW0tFWUVEXSkuZm9yRWFjaCgoW2ksIGVudHJ5XSkgPT4ge1xuICAgICAgaWYgKGkgPT09IEtFWUVEX0NPVU5UKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICAvLyBbb2xkX2lkeCwgZGlmZl1cbiAgICAgICAgLy8gbW92ZWQgd2l0aCBkaWZmXG4gICAgICAgIGNvbnN0IFtvbGRfaWR4LCBkaWZmXSA9IGVudHJ5O1xuICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0gY2xvbmVkVGFyZ2V0W0tFWUVEXVtvbGRfaWR4XTtcbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBkaWZmKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIC8vIG1vdmVkIHdpdGhvdXQgZGlmZlxuICAgICAgICBjb25zdCBvbGRfaWR4ID0gZW50cnk7XG4gICAgICAgIHRhcmdldFtLRVlFRF1baV0gPSBjbG9uZWRUYXJnZXRbS0VZRURdW29sZF9pZHhdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW50cnkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgLy8gZGlmZiwgc2FtZSBwb3NpdGlvblxuICAgICAgICBpZiAoIXRhcmdldFtLRVlFRF1baV0pIHtcbiAgICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBlbnRyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gZHJvcCBleHRyYSBlbnRyaWVzXG4gICAgaWYgKHNvdXJjZVtLRVlFRF1bS0VZRURfQ09VTlRdIDwgdGFyZ2V0W0tFWUVEXVtLRVlFRF9DT1VOVF0pIHtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgICAgIGkgPCB0YXJnZXRbS0VZRURdW0tFWUVEX0NPVU5UXTtcbiAgICAgICAgaSsrXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIHRhcmdldFtLRVlFRF1baV07XG4gICAgICB9XG4gICAgfVxuICAgIHRhcmdldFtLRVlFRF1bS0VZRURfQ09VTlRdID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgaWYgKHNvdXJjZVtTVFJFQU1dKSB7XG4gICAgICB0YXJnZXRbU1RSRUFNXSA9IHNvdXJjZVtTVFJFQU1dO1xuICAgIH1cbiAgICBpZiAoc291cmNlW1RFTVBMQVRFU10pIHtcbiAgICAgIHRhcmdldFtURU1QTEFURVNdID0gc291cmNlW1RFTVBMQVRFU107XG4gICAgfVxuICB9XG5cbiAgLy8gTWVyZ2VzIGNpZCB0cmVlcyB0b2dldGhlciwgY29weWluZyBzdGF0aWNzIGZyb20gc291cmNlIHRyZWUuXG4gIC8vXG4gIC8vIFRoZSBgcHJ1bmVNYWdpY0lkYCBpcyBwYXNzZWQgdG8gY29udHJvbCBwcnVuaW5nIHRoZSBtYWdpY0lkIG9mIHRoZVxuICAvLyB0YXJnZXQuIFdlIG11c3QgYWx3YXlzIHBydW5lIHRoZSBtYWdpY0lkIHdoZW4gd2UgYXJlIHNoYXJpbmcgc3RhdGljc1xuICAvLyBmcm9tIGFub3RoZXIgY29tcG9uZW50LiBJZiBub3QgcHJ1bmluZywgd2UgcmVwbGljYXRlIHRoZSBsb2dpYyBmcm9tXG4gIC8vIG11dGFibGVNZXJnZSwgd2hlcmUgd2Ugc2V0IG5ld1JlbmRlciB0byB0cnVlIGlmIHRoZXJlIGlzIGEgcm9vdFxuICAvLyAoZWZmZWN0aXZlbHkgZm9yY2luZyB0aGUgbmV3IHZlcnNpb24gdG8gYmUgcmVuZGVyZWQgaW5zdGVhZCBvZiBza2lwcGVkKVxuICAvL1xuICBjbG9uZU1lcmdlKHRhcmdldCwgc291cmNlLCBwcnVuZU1hZ2ljSWQpIHtcbiAgICBjb25zdCBtZXJnZWQgPSB7IC4uLnRhcmdldCwgLi4uc291cmNlIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWVyZ2VkKSB7XG4gICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGNvbnN0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgaWYgKGlzT2JqZWN0KHZhbCkgJiYgdmFsW1NUQVRJQ10gPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwgdmFsLCBwcnVuZU1hZ2ljSWQpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwge30sIHBydW5lTWFnaWNJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcnVuZU1hZ2ljSWQpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubWFnaWNJZDtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubmV3UmVuZGVyO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0W1JPT1RdKSB7XG4gICAgICBtZXJnZWQubmV3UmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIGNvbXBvbmVudFRvU3RyaW5nKGNpZCkge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdLFxuICAgICAgY2lkLFxuICAgICAgbnVsbCxcbiAgICApO1xuICAgIGNvbnN0IFtzdHJpcHBlZEhUTUwsIF9iZWZvcmUsIF9hZnRlcl0gPSBtb2RpZnlSb290KHN0ciwge30pO1xuICAgIHJldHVybiB7IGJ1ZmZlcjogc3RyaXBwZWRIVE1MLCBzdHJlYW1zOiBzdHJlYW1zIH07XG4gIH1cblxuICBwcnVuZUNJRHMoY2lkcykge1xuICAgIGNpZHMuZm9yRWFjaCgoY2lkKSA9PiBkZWxldGUgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWQ7XG4gIH1cblxuICBpc05ld0ZpbmdlcnByaW50KGRpZmYgPSB7fSkge1xuICAgIHJldHVybiAhIWRpZmZbU1RBVElDXTtcbiAgfVxuXG4gIHRlbXBsYXRlU3RhdGljKHBhcnQsIHRlbXBsYXRlcykge1xuICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlc1twYXJ0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfVxuICB9XG5cbiAgbmV4dE1hZ2ljSUQoKSB7XG4gICAgdGhpcy5tYWdpY0lkKys7XG4gICAgcmV0dXJuIGBtJHt0aGlzLm1hZ2ljSWR9LSR7dGhpcy5wYXJlbnRWaWV3SWQoKX1gO1xuICB9XG5cbiAgLy8gQ29udmVydHMgcmVuZGVyZWQgdHJlZSB0byBvdXRwdXQgYnVmZmVyLlxuICAvL1xuICAvLyBjaGFuZ2VUcmFja2luZyBjb250cm9scyBpZiB3ZSBjYW4gYXBwbHkgdGhlIFBIWF9TS0lQIG9wdGltaXphdGlvbi5cbiAgdG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywgcm9vdEF0dHJzID0ge30pIHtcbiAgICBpZiAocmVuZGVyZWRbS0VZRURdKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wcmVoZW5zaW9uVG9CdWZmZXIoXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICB0ZW1wbGF0ZXMsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgY2hhbmdlVHJhY2tpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRlbXBsYXRlcyBhcmUgYSB3YXkgb2Ygc2hhcmluZyBzdGF0aWNzIGJldHdlZW4gbXVsdGlwbGUgcmVuZGVyZWQgc3RydWN0cy5cbiAgICAvLyBTaW5jZSBMaXZlVmlldyAxLjEsIHRob3NlIGNhbiBhbHNvIGFwcGVhciBhdCB0aGUgcm9vdCAtIGZvciBleGFtcGxlIGlmIG9uZSByZW5kZXJzXG4gICAgLy8gdHdvIGNvbXByZWhlbnNpb25zIHRoYXQgY2FuIHNoYXJlIHN0YXRpY3MuXG4gICAgLy8gV2hlbmV2ZXIgd2UgZmluZCB0ZW1wbGF0ZXMsIHdlIG5lZWQgdG8gdXNlIHRoZW0gcmVjdXJzaXZlbHkuIEFsc28sIHRlbXBsYXRlcyBjYW5cbiAgICAvLyBiZSBzZW50IGZvciBlYWNoIGRpZmYsIG5vdCBvbmx5IGZvciB0aGUgaW5pdGlhbCBvbmUuIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgdGhlbVxuICAgIC8vIHRob3VnaCwgc28gd2UgYWx3YXlzIHJlc29sdmUgdGhlbSBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgcmVuZGVyZWQgb2JqZWN0LlxuICAgIGlmIChyZW5kZXJlZFtURU1QTEFURVNdKSB7XG4gICAgICB0ZW1wbGF0ZXMgPSByZW5kZXJlZFtURU1QTEFURVNdO1xuICAgICAgZGVsZXRlIHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgfVxuXG4gICAgbGV0IHsgW1NUQVRJQ106IHN0YXRpY3MgfSA9IHJlbmRlcmVkO1xuICAgIHN0YXRpY3MgPSB0aGlzLnRlbXBsYXRlU3RhdGljKHN0YXRpY3MsIHRlbXBsYXRlcyk7XG4gICAgcmVuZGVyZWRbU1RBVElDXSA9IHN0YXRpY3M7XG4gICAgY29uc3QgaXNSb290ID0gcmVuZGVyZWRbUk9PVF07XG4gICAgY29uc3QgcHJldkJ1ZmZlciA9IG91dHB1dC5idWZmZXI7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IFwiXCI7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb25kaXRpb24gaXMgY2FsbGVkIHdoZW4gZmlyc3QgcmVuZGVyaW5nIGFuIG9wdGltaXphYmxlIGZ1bmN0aW9uIGNvbXBvbmVudC5cbiAgICAvLyBMQyBoYXZlIHRoZWlyIG1hZ2ljSWQgcHJldmlvdXNseSBzZXRcbiAgICBpZiAoY2hhbmdlVHJhY2tpbmcgJiYgaXNSb290ICYmICFyZW5kZXJlZC5tYWdpY0lkKSB7XG4gICAgICByZW5kZXJlZC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgICAgcmVuZGVyZWQubWFnaWNJZCA9IHRoaXMubmV4dE1hZ2ljSUQoKTtcbiAgICB9XG5cbiAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdGF0aWNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZFtpIC0gMV0sIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZyk7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbaV07XG4gICAgfVxuXG4gICAgLy8gQXBwbGllcyB0aGUgcm9vdCB0YWcgXCJza2lwXCIgb3B0aW1pemF0aW9uIGlmIHN1cHBvcnRlZCwgd2hpY2ggY2xlYXJzXG4gICAgLy8gdGhlIHJvb3QgdGFnIGF0dHJpYnV0ZXMgYW5kIGlubmVySFRNTCwgYW5kIG9ubHkgbWFpbnRhaW5zIHRoZSBtYWdpY0lkLlxuICAgIC8vIFdlIGNhbiBvbmx5IHNraXAgd2hlbiBjaGFuZ2VUcmFja2luZyBpcyBzdXBwb3J0ZWQsXG4gICAgLy8gYW5kIHdoZW4gdGhlIHJvb3QgZWxlbWVudCBoYXNuJ3QgZXhwZXJpZW5jZWQgYW4gdW5yZW5kZXJlZCBtZXJnZSAobmV3UmVuZGVyIHRydWUpLlxuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGxldCBza2lwID0gZmFsc2U7XG4gICAgICBsZXQgYXR0cnM7XG4gICAgICAvLyBXaGVuIGEgTEMgaXMgcmUtYWRkZWQgdG8gdGhlIHBhZ2UsIHdlIG5lZWQgdG8gcmUtcmVuZGVyIHRoZSBlbnRpcmUgTEMgdHJlZSxcbiAgICAgIC8vIHRoZXJlZm9yZSBjaGFuZ2VUcmFja2luZyBpcyBmYWxzZTsgaG93ZXZlciwgd2UgbmVlZCB0byBrZWVwIGFsbCB0aGUgbWFnaWNJZHNcbiAgICAgIC8vIGZyb20gYW55IGZ1bmN0aW9uIGNvbXBvbmVudCBzbyB0aGUgbmV4dCB0aW1lIHRoZSBMQyBpcyB1cGRhdGVkLCB3ZSBjYW4gYXBwbHlcbiAgICAgIC8vIHRoZSBza2lwIG9wdGltaXphdGlvblxuICAgICAgaWYgKGNoYW5nZVRyYWNraW5nIHx8IHJlbmRlcmVkLm1hZ2ljSWQpIHtcbiAgICAgICAgc2tpcCA9IGNoYW5nZVRyYWNraW5nICYmICFyZW5kZXJlZC5uZXdSZW5kZXI7XG4gICAgICAgIGF0dHJzID0geyBbUEhYX01BR0lDX0lEXTogcmVuZGVyZWQubWFnaWNJZCwgLi4ucm9vdEF0dHJzIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRycyA9IHJvb3RBdHRycztcbiAgICAgIH1cbiAgICAgIGlmIChza2lwKSB7XG4gICAgICAgIGF0dHJzW1BIWF9TS0lQXSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBbbmV3Um9vdCwgY29tbWVudEJlZm9yZSwgY29tbWVudEFmdGVyXSA9IG1vZGlmeVJvb3QoXG4gICAgICAgIG91dHB1dC5idWZmZXIsXG4gICAgICAgIGF0dHJzLFxuICAgICAgICBza2lwLFxuICAgICAgKTtcbiAgICAgIHJlbmRlcmVkLm5ld1JlbmRlciA9IGZhbHNlO1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IHByZXZCdWZmZXIgKyBjb21tZW50QmVmb3JlICsgbmV3Um9vdCArIGNvbW1lbnRBZnRlcjtcbiAgICB9XG4gIH1cblxuICBjb21wcmVoZW5zaW9uVG9CdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZykge1xuICAgIGNvbnN0IGtleWVkVGVtcGxhdGVzID0gdGVtcGxhdGVzIHx8IHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgY29uc3Qgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMocmVuZGVyZWRbU1RBVElDXSwgdGVtcGxhdGVzKTtcbiAgICByZW5kZXJlZFtTVEFUSUNdID0gc3RhdGljcztcbiAgICBkZWxldGUgcmVuZGVyZWRbVEVNUExBVEVTXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmVkW0tFWUVEXVtLRVlFRF9DT1VOVF07IGkrKykge1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzWzBdO1xuICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBzdGF0aWNzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY1RvQnVmZmVyKFxuICAgICAgICAgIHJlbmRlcmVkW0tFWUVEXVtpXVtqIC0gMV0sXG4gICAgICAgICAga2V5ZWRUZW1wbGF0ZXMsXG4gICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgICApO1xuICAgICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3Nbal07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gc3RvcmUgdGhlIHJlbmRlcmVkIHRyZWUgZm9yIHN0cmVhbXNcbiAgICBpZiAocmVuZGVyZWRbU1RSRUFNXSkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgIGNvbnN0IFtfcmVmLCBfaW5zZXJ0cywgZGVsZXRlSWRzLCByZXNldF0gPSBzdHJlYW0gfHwgW251bGwsIHt9LCBbXSwgbnVsbF07XG4gICAgICBpZiAoXG4gICAgICAgIHN0cmVhbSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChyZW5kZXJlZFtLRVlFRF1bS0VZRURfQ09VTlRdID4gMCB8fCBkZWxldGVJZHMubGVuZ3RoID4gMCB8fCByZXNldClcbiAgICAgICkge1xuICAgICAgICBkZWxldGUgcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgICAgcmVuZGVyZWRbS0VZRURdID0ge1xuICAgICAgICAgIFtLRVlFRF9DT1VOVF06IDAsXG4gICAgICAgIH07XG4gICAgICAgIG91dHB1dC5zdHJlYW1zLmFkZChzdHJlYW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQsIGNoYW5nZVRyYWNraW5nKSB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXJlZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3QgeyBidWZmZXI6IHN0ciwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVDSURUb1N0cmluZyhcbiAgICAgICAgb3V0cHV0LmNvbXBvbmVudHMsXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICBvdXRwdXQub25seUNpZHMsXG4gICAgICApO1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdHI7XG4gICAgICBvdXRwdXQuc3RyZWFtcyA9IG5ldyBTZXQoWy4uLm91dHB1dC5zdHJlYW1zLCAuLi5zdHJlYW1zXSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChyZW5kZXJlZCkpIHtcbiAgICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHJlbmRlcmVkO1xuICAgIH1cbiAgfVxuXG4gIHJlY3Vyc2l2ZUNJRFRvU3RyaW5nKGNvbXBvbmVudHMsIGNpZCwgb25seUNpZHMpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPVxuICAgICAgY29tcG9uZW50c1tjaWRdIHx8IGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm9yIENJRCAke2NpZH1gLCBjb21wb25lbnRzKTtcbiAgICBjb25zdCBhdHRycyA9IHsgW1BIWF9DT01QT05FTlRdOiBjaWQsIFtQSFhfVklFV19SRUZdOiB0aGlzLnZpZXdJZCB9O1xuICAgIGNvbnN0IHNraXAgPSBvbmx5Q2lkcyAmJiAhb25seUNpZHMuaGFzKGNpZCk7XG4gICAgLy8gVHdvIG9wdGltaXphdGlvbiBwYXRocyBhcHBseSBoZXJlOlxuICAgIC8vXG4gICAgLy8gICAxLiBUaGUgb25seUNpZHMgb3B0aW1pemF0aW9uIHdvcmtzIGJ5IHRoZSBzZXJ2ZXIgZGlmZiB0ZWxsaW5nIHVzIG9ubHkgc3BlY2lmaWNcbiAgICAvLyAgICAgY2lkJ3MgaGF2ZSBjaGFuZ2VkLiBUaGlzIGFsbG93cyB1cyB0byBza2lwIHJlbmRlcmluZyBhbnkgY29tcG9uZW50IHRoYXQgaGFzbid0IGNoYW5nZWQsXG4gICAgLy8gICAgIHdoaWNoIHVsdGltYXRlbHkgc2V0cyBQSFhfU0tJUCByb290IGF0dHJpYnV0ZSBhbmQgYXZvaWRzIHJlbmRlcmluZyB0aGUgaW5uZXJIVE1MLlxuICAgIC8vXG4gICAgLy8gICAyLiBUaGUgcm9vdCBQSFhfU0tJUCBvcHRpbWl6YXRpb24gZ2VuZXJhbGl6ZXMgdG8gYWxsIEhFRXggZnVuY3Rpb24gY29tcG9uZW50cywgYW5kXG4gICAgLy8gICAgIHdvcmtzIGluIHRoZSBzYW1lIFBIWF9TS0lQIGF0dHJpYnV0ZSBmYXNoaW9uIGFzIDEsIGJ1dCB0aGUgbmV3UmVuZGVyIHRyYWNraW5nIGlzIGRvbmVcbiAgICAvLyAgICAgYXQgdGhlIGdlbmVyYWwgZGlmZiBtZXJnZSBsZXZlbC4gSWYgd2UgbWVyZ2UgYSBkaWZmIHdpdGggbmV3IGR5bmFtaWNzLCB3ZSBuZWNlc3NhcmlseSBoYXZlXG4gICAgLy8gICAgIGV4cGVyaWVuY2VkIGEgY2hhbmdlIHdoaWNoIG11c3QgYmUgYSBuZXdSZW5kZXIsIGFuZCB0aHVzIHdlIGNhbid0IHNraXAgdGhlIHJlbmRlci5cbiAgICAvL1xuICAgIC8vIEJvdGggb3B0aW1pemF0aW9uIGZsb3dzIGFwcGx5IGhlcmUuIG5ld1JlbmRlciBpcyBzZXQgYmFzZWQgb24gdGhlIG9ubHlDaWRzIG9wdGltaXphdGlvbiwgYW5kXG4gICAgLy8gd2UgdHJhY2sgYSBkZXRlcm1pbmlzdGljIG1hZ2ljSWQgYmFzZWQgb24gdGhlIGNpZC5cbiAgICAvL1xuICAgIC8vIGNoYW5nZVRyYWNraW5nIGlzIGFib3V0IHRoZSBlbnRpcmUgdHJlZVxuICAgIC8vIG5ld1JlbmRlciBpcyBhYm91dCB0aGUgY3VycmVudCByb290IGluIHRoZSB0cmVlXG4gICAgLy9cbiAgICAvLyBCeSBkZWZhdWx0IGNoYW5nZVRyYWNraW5nIGlzIGVuYWJsZWQsIGJ1dCB3ZSBzcGVjaWFsIGNhc2UgdGhlIGZsb3cgd2hlcmUgdGhlIGNsaWVudCBpcyBwcnVuaW5nXG4gICAgLy8gY2lkcyBhbmQgdGhlIHNlcnZlciBhZGRzIHRoZSBjb21wb25lbnQgYmFjay4gSW4gc3VjaCBjYXNlcywgd2UgZXhwbGljaXRseSBkaXNhYmxlIGNoYW5nZVRyYWNraW5nXG4gICAgLy8gd2l0aCByZXNldFJlbmRlciBmb3IgdGhpcyBjaWQsIHRoZW4gcmUtZW5hYmxlIGl0IGFmdGVyIHRoZSByZWN1cnNpdmUgY2FsbCB0byBza2lwIHRoZSBvcHRpbWl6YXRpb25cbiAgICAvLyBmb3IgdGhlIGVudGlyZSBjb21wb25lbnQgdHJlZS5cbiAgICBjb21wb25lbnQubmV3UmVuZGVyID0gIXNraXA7XG4gICAgY29tcG9uZW50Lm1hZ2ljSWQgPSBgYyR7Y2lkfS0ke3RoaXMucGFyZW50Vmlld0lkKCl9YDtcbiAgICAvLyBlbmFibGUgY2hhbmdlIHRyYWNraW5nIGFzIGxvbmcgYXMgdGhlIGNvbXBvbmVudCBoYXNuJ3QgYmVlbiByZXNldFxuICAgIGNvbnN0IGNoYW5nZVRyYWNraW5nID0gIWNvbXBvbmVudC5yZXNldDtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVUb1N0cmluZyhcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudHMsXG4gICAgICBvbmx5Q2lkcyxcbiAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgYXR0cnMsXG4gICAgKTtcbiAgICAvLyBkaXNhYmxlIHJlc2V0IGFmdGVyIHdlJ3ZlIHJlbmRlcmVkXG4gICAgZGVsZXRlIGNvbXBvbmVudC5yZXNldDtcblxuICAgIHJldHVybiB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtczogc3RyZWFtcyB9O1xuICB9XG59XG4iLCAiaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBBUklBIGZyb20gXCIuL2FyaWFcIjtcblxuY29uc3QgZm9jdXNTdGFjayA9IFtdO1xuY29uc3QgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWUgPSAyMDA7XG5cbmNvbnN0IEpTID0ge1xuICAvLyBwcml2YXRlXG4gIGV4ZWMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGRlZmF1bHRzKSB7XG4gICAgY29uc3QgW2RlZmF1bHRLaW5kLCBkZWZhdWx0QXJnc10gPSBkZWZhdWx0cyB8fCBbXG4gICAgICBudWxsLFxuICAgICAgeyBjYWxsYmFjazogZGVmYXVsdHMgJiYgZGVmYXVsdHMuY2FsbGJhY2sgfSxcbiAgICBdO1xuICAgIGNvbnN0IGNvbW1hbmRzID1cbiAgICAgIHBoeEV2ZW50LmNoYXJBdCgwKSA9PT0gXCJbXCJcbiAgICAgICAgPyBKU09OLnBhcnNlKHBoeEV2ZW50KVxuICAgICAgICA6IFtbZGVmYXVsdEtpbmQsIGRlZmF1bHRBcmdzXV07XG5cbiAgICBjb21tYW5kcy5mb3JFYWNoKChba2luZCwgYXJnc10pID0+IHtcbiAgICAgIGlmIChraW5kID09PSBkZWZhdWx0S2luZCkge1xuICAgICAgICAvLyBhbHdheXMgcHJlZmVyIHRoZSBhcmdzLCBidXQga2VlcCBleGlzdGluZyBrZXlzIGZyb20gdGhlIGRlZmF1bHRBcmdzXG4gICAgICAgIGFyZ3MgPSB7IC4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzIH07XG4gICAgICAgIGFyZ3MuY2FsbGJhY2sgPSBhcmdzLmNhbGxiYWNrIHx8IGRlZmF1bHRBcmdzLmNhbGxiYWNrO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJUb0Vscyh2aWV3LmxpdmVTb2NrZXQsIHNvdXJjZUVsLCBhcmdzKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICB0aGlzW2BleGVjXyR7a2luZH1gXShlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgaXNWaXNpYmxlKGVsKSB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZWwub2Zmc2V0V2lkdGggfHxcbiAgICAgIGVsLm9mZnNldEhlaWdodCB8fFxuICAgICAgZWwuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwXG4gICAgKTtcbiAgfSxcblxuICAvLyByZXR1cm5zIHRydWUgaWYgYW55IHBhcnQgb2YgdGhlIGVsZW1lbnQgaXMgaW5zaWRlIHRoZSB2aWV3cG9ydFxuICBpc0luVmlld3BvcnQoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2luZG93SGVpZ2h0ID1cbiAgICAgIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHdpbmRvd1dpZHRoID1cbiAgICAgIHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcblxuICAgIHJldHVybiAoXG4gICAgICByZWN0LnJpZ2h0ID4gMCAmJlxuICAgICAgcmVjdC5ib3R0b20gPiAwICYmXG4gICAgICByZWN0LmxlZnQgPCB3aW5kb3dXaWR0aCAmJlxuICAgICAgcmVjdC50b3AgPCB3aW5kb3dIZWlnaHRcbiAgICApO1xuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICAvLyBjb21tYW5kc1xuXG4gIGV4ZWNfZXhlYyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0ciwgdG8gfSkge1xuICAgIGNvbnN0IGVuY29kZWRKUyA9IGVsLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICBpZiAoIWVuY29kZWRKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCAke2F0dHJ9IHRvIGNvbnRhaW4gSlMgY29tbWFuZCBvbiBcIiR7dG99XCJgKTtcbiAgICB9XG4gICAgdmlldy5saXZlU29ja2V0LmV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUpO1xuICB9LFxuXG4gIGV4ZWNfZGlzcGF0Y2goXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGV2ZW50LCBkZXRhaWwsIGJ1YmJsZXMsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIGRldGFpbCA9IGRldGFpbCB8fCB7fTtcbiAgICBkZXRhaWwuZGlzcGF0Y2hlciA9IHNvdXJjZUVsO1xuICAgIGlmIChibG9ja2luZykge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICAgIGRldGFpbC5kb25lID0gcmVzb2x2ZTtcbiAgICAgIH0pO1xuICAgICAgdmlldy5saXZlU29ja2V0LmFzeW5jVHJhbnNpdGlvbihwcm9taXNlKTtcbiAgICB9XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQoZWwsIGV2ZW50LCB7IGRldGFpbCwgYnViYmxlcyB9KTtcbiAgfSxcblxuICBleGVjX3B1c2goZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCBhcmdzKSB7XG4gICAgY29uc3Qge1xuICAgICAgZXZlbnQsXG4gICAgICBkYXRhLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nLFxuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlzcGF0Y2hlcixcbiAgICAgIGNhbGxiYWNrLFxuICAgIH0gPSBhcmdzO1xuICAgIGNvbnN0IHB1c2hPcHRzID0ge1xuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nOiAhIXBhZ2VfbG9hZGluZyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgfTtcbiAgICBjb25zdCB0YXJnZXRTcmMgPVxuICAgICAgZXZlbnRUeXBlID09PSBcImNoYW5nZVwiICYmIGRpc3BhdGNoZXIgPyBkaXNwYXRjaGVyIDogc291cmNlRWw7XG4gICAgY29uc3QgcGh4VGFyZ2V0ID1cbiAgICAgIHRhcmdldCB8fCB0YXJnZXRTcmMuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhcInRhcmdldFwiKSkgfHwgdGFyZ2V0U3JjO1xuICAgIGNvbnN0IGhhbmRsZXIgPSAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICBpZiAoIXRhcmdldFZpZXcuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBcImNoYW5nZVwiKSB7XG4gICAgICAgIGxldCB7IG5ld0NpZCwgX3RhcmdldCB9ID0gYXJncztcbiAgICAgICAgX3RhcmdldCA9XG4gICAgICAgICAgX3RhcmdldCB8fCAoRE9NLmlzRm9ybUlucHV0KHNvdXJjZUVsKSA/IHNvdXJjZUVsLm5hbWUgOiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoX3RhcmdldCkge1xuICAgICAgICAgIHB1c2hPcHRzLl90YXJnZXQgPSBfdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFZpZXcucHVzaElucHV0KFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBuZXdDaWQsXG4gICAgICAgICAgZXZlbnQgfHwgcGh4RXZlbnQsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gXCJzdWJtaXRcIikge1xuICAgICAgICBjb25zdCB7IHN1Ym1pdHRlciB9ID0gYXJncztcbiAgICAgICAgdGFyZ2V0Vmlldy5zdWJtaXRGb3JtKFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBldmVudCB8fCBwaHhFdmVudCxcbiAgICAgICAgICBzdWJtaXR0ZXIsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRWaWV3LnB1c2hFdmVudChcbiAgICAgICAgICBldmVudFR5cGUsXG4gICAgICAgICAgc291cmNlRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIGV2ZW50IHx8IHBoeEV2ZW50LFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBpbiBjYXNlIG9mIGZvcm1SZWNvdmVyeSwgdGFyZ2V0VmlldyBhbmQgdGFyZ2V0Q3R4IGFyZSBwYXNzZWQgYXMgYXJndW1lbnRcbiAgICAvLyBhcyB0aGV5IGFyZSBsb29rZWQgdXAgaW4gYSB0ZW1wbGF0ZSBlbGVtZW50LCBub3QgdGhlIHJlYWwgRE9NXG4gICAgaWYgKGFyZ3MudGFyZ2V0VmlldyAmJiBhcmdzLnRhcmdldEN0eCkge1xuICAgICAgaGFuZGxlcihhcmdzLnRhcmdldFZpZXcsIGFyZ3MudGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlldy53aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgaGFuZGxlcik7XG4gICAgfVxuICB9LFxuXG4gIGV4ZWNfbmF2aWdhdGUoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGhyZWYsIHJlcGxhY2UgfSkge1xuICAgIHZpZXcubGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgbnVsbCxcbiAgICAgIHNvdXJjZUVsLFxuICAgICk7XG4gIH0sXG5cbiAgZXhlY19wYXRjaChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgaHJlZiwgcmVwbGFjZSB9KSB7XG4gICAgdmlldy5saXZlU29ja2V0LnB1c2hIaXN0b3J5UGF0Y2goXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgc291cmNlRWwsXG4gICAgKTtcbiAgfSxcblxuICBleGVjX2ZvY3VzKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCkge1xuICAgIEFSSUEuYXR0ZW1wdEZvY3VzKGVsKTtcbiAgICAvLyBpbiBjYXNlIHRoZSBKUy5mb2N1cyBjb21tYW5kIGlzIGluIGEgSlMuc2hvdy9oaWRlL3RvZ2dsZSBjaGFpbiwgZm9yIHNob3cgd2UgbmVlZFxuICAgIC8vIHRvIHdhaXQgZm9yIEpTLnNob3cgdG8gaGF2ZSB1cGRhdGVkIHRoZSBlbGVtZW50J3MgZGlzcGxheSBwcm9wZXJ0eSAoc2VlIGV4ZWNfdG9nZ2xlKVxuICAgIC8vIGJ1dCB0aGF0IHJ1biBpbiBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgdGhlcmVmb3JlIHdlIG5lZWQgdG8gdXNlIHRoZW0gaGVyZSBhcyB3ZWxsXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IEFSSUEuYXR0ZW1wdEZvY3VzKGVsKSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgZXhlY19mb2N1c19maXJzdChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwpIHtcbiAgICBBUklBLmZvY3VzRmlyc3RJbnRlcmFjdGl2ZShlbCkgfHwgQVJJQS5mb2N1c0ZpcnN0KGVsKTtcbiAgICAvLyBpZiB5b3Ugd29uZGVyIGFib3V0IHRoZSBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgc2VlIGV4ZWNfZm9jdXNcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoXG4gICAgICAgICgpID0+IEFSSUEuZm9jdXNGaXJzdEludGVyYWN0aXZlKGVsKSB8fCBBUklBLmZvY3VzRmlyc3QoZWwpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSxcblxuICBleGVjX3B1c2hfZm9jdXMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsKSB7XG4gICAgZm9jdXNTdGFjay5wdXNoKGVsIHx8IHNvdXJjZUVsKTtcbiAgfSxcblxuICBleGVjX3BvcF9mb2N1cyhfZSwgX2V2ZW50VHlwZSwgX3BoeEV2ZW50LCBfdmlldywgX3NvdXJjZUVsLCBfZWwpIHtcbiAgICBjb25zdCBlbCA9IGZvY3VzU3RhY2sucG9wKCk7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5mb2N1cygpO1xuICAgICAgLy8gaWYgeW91IHdvbmRlciBhYm91dCB0aGUgbmVzdGVkIGFuaW1hdGlvbiBmcmFtZXMsIHNlZSBleGVjX2ZvY3VzXG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBlbC5mb2N1cygpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBleGVjX2FkZF9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBuYW1lcywgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3JlbW92ZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMudG9nZ2xlQ2xhc3NlcyhlbCwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9hdHRyKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBhdHRyOiBbYXR0ciwgdmFsMSwgdmFsMl0gfSxcbiAgKSB7XG4gICAgdGhpcy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgfSxcblxuICBleGVjX2lnbm9yZV9hdHRycyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0cnMgfSkge1xuICAgIHRoaXMuaWdub3JlQXR0cnMoZWwsIGF0dHJzKTtcbiAgfSxcblxuICBleGVjX3RyYW5zaXRpb24oXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IHRpbWUsIHRyYW5zaXRpb24sIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZShcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLnRvZ2dsZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWUsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3Nob3coXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuc2hvdyhldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyk7XG4gIH0sXG5cbiAgZXhlY19oaWRlKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLmhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpO1xuICB9LFxuXG4gIGV4ZWNfc2V0X2F0dHIoXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGF0dHI6IFthdHRyLCB2YWxdIH0sXG4gICkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWxdXSwgW10pO1xuICB9LFxuXG4gIGV4ZWNfcmVtb3ZlX2F0dHIoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGF0dHIgfSkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW10sIFthdHRyXSk7XG4gIH0sXG5cbiAgaWdub3JlQXR0cnMoZWwsIGF0dHJzKSB7XG4gICAgRE9NLnB1dFByaXZhdGUoZWwsIFwiSlM6aWdub3JlX2F0dHJzXCIsIHtcbiAgICAgIGFwcGx5OiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgIEFycmF5LmZyb20oZnJvbUVsLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhdHRycy5zb21lKFxuICAgICAgICAgICAgICAodG9JZ25vcmUpID0+XG4gICAgICAgICAgICAgICAgYXR0ci5uYW1lID09IHRvSWdub3JlIHx8XG4gICAgICAgICAgICAgICAgdG9JZ25vcmUgPT09IFwiKlwiIHx8XG4gICAgICAgICAgICAgICAgKHRvSWdub3JlLmluY2x1ZGVzKFwiKlwiKSAmJiBhdHRyLm5hbWUubWF0Y2godG9JZ25vcmUpICE9IG51bGwpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcblxuICBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpIHtcbiAgICBjb25zdCBpZ25vcmVBdHRycyA9IERPTS5wcml2YXRlKGZyb21FbCwgXCJKUzppZ25vcmVfYXR0cnNcIik7XG4gICAgaWYgKGlnbm9yZUF0dHJzKSB7XG4gICAgICBpZ25vcmVBdHRycy5hcHBseShmcm9tRWwsIHRvRWwpO1xuICAgIH1cbiAgfSxcblxuICAvLyB1dGlscyBmb3IgY29tbWFuZHNcblxuICBzaG93KGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nKSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgIHRoaXMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIHZpZXcsXG4gICAgICAgIGVsLFxuICAgICAgICBkaXNwbGF5LFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICBudWxsLFxuICAgICAgICB0aW1lLFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIGhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpIHtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUoZWwpKSB7XG4gICAgICB0aGlzLnRvZ2dsZShcbiAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICB2aWV3LFxuICAgICAgICBlbCxcbiAgICAgICAgZGlzcGxheSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbixcbiAgICAgICAgdGltZSxcbiAgICAgICAgYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICB0b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZykge1xuICAgIHRpbWUgPSB0aW1lIHx8IGRlZmF1bHRfdHJhbnNpdGlvbl90aW1lO1xuICAgIGNvbnN0IFtpbkNsYXNzZXMsIGluU3RhcnRDbGFzc2VzLCBpbkVuZENsYXNzZXNdID0gaW5zIHx8IFtbXSwgW10sIFtdXTtcbiAgICBjb25zdCBbb3V0Q2xhc3Nlcywgb3V0U3RhcnRDbGFzc2VzLCBvdXRFbmRDbGFzc2VzXSA9IG91dHMgfHwgW1tdLCBbXSwgW11dO1xuICAgIGlmIChpbkNsYXNzZXMubGVuZ3RoID4gMCB8fCBvdXRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgY29uc3Qgb25TdGFydCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgb3V0U3RhcnRDbGFzc2VzLFxuICAgICAgICAgICAgaW5DbGFzc2VzLmNvbmNhdChpblN0YXJ0Q2xhc3NlcykuY29uY2F0KGluRW5kQ2xhc3NlcyksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRDbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRFbmRDbGFzc2VzLCBvdXRTdGFydENsYXNzZXMpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FbmQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIFtdLCBvdXRDbGFzc2VzLmNvbmNhdChvdXRFbmRDbGFzc2VzKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfTtcbiAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgIGlmIChibG9ja2luZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgICAgc2V0VGltZW91dChvbkVuZCwgdGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmlldy50cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gXCJyZW1vdmVcIikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvblN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBpblN0YXJ0Q2xhc3NlcyxcbiAgICAgICAgICAgIG91dENsYXNzZXMuY29uY2F0KG91dFN0YXJ0Q2xhc3NlcykuY29uY2F0KG91dEVuZENsYXNzZXMpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RpY2t5RGlzcGxheSA9IGRpc3BsYXkgfHwgdGhpcy5kZWZhdWx0RGlzcGxheShlbCk7XG4gICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBmaXJzdCBhZGQgdGhlIHN0YXJ0aW5nICsgYWN0aXZlIGNsYXNzLCBUSEVOIG1ha2UgdGhlIGVsZW1lbnQgdmlzaWJsZVxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGlmIHdlIHRvZ2dsZWQgdGhlIHZpc2liaWxpdHkgZWFybGllciBjc3MgYW5pbWF0aW9uc1xuICAgICAgICAgICAgLy8gd291bGQgZmxpY2tlciwgYXMgdGhlIGVsZW1lbnQgYmVjb21lcyB2aXNpYmxlIGJlZm9yZSB0aGUgYWN0aXZlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gY2xhc3MgaXMgc2V0IChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM0NTYpXG4gICAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgaW5DbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICAvLyBhZGRPclJlbW92ZUNsYXNzZXMgdXNlcyBhIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpdHNlbGYsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIG1vdmUgdGhlIHB1dFN0aWNreVxuICAgICAgICAgICAgLy8gaW50byB0aGUgbmV4dCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuLi5cbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICAgIFwidG9nZ2xlXCIsXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBpbkVuZENsYXNzZXMsIGluU3RhcnRDbGFzc2VzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVuZCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgW10sIGluQ2xhc3Nlcy5jb25jYXQoaW5FbmRDbGFzc2VzKSk7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6c2hvdy1lbmRcIikpO1xuICAgICAgICB9O1xuICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIG9uU3RhcnQoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KG9uRW5kLCB0aW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25FbmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgICBjb25zdCBzdGlja3lEaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLmRlZmF1bHREaXNwbGF5KGVsKTtcbiAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBcInRvZ2dsZVwiLFxuICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LWVuZFwiKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0b2dnbGVDbGFzc2VzKGVsLCBjbGFzc2VzLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3LCBibG9ja2luZykge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3QgbmV3QWRkcyA9IGNsYXNzZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSkgPT4gcHJldkFkZHMuaW5kZXhPZihuYW1lKSA8IDAgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gY2xhc3Nlcy5maWx0ZXIoXG4gICAgICAgIChuYW1lKSA9PiBwcmV2UmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMCAmJiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBuZXdBZGRzLFxuICAgICAgICBuZXdSZW1vdmVzLFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICB0aW1lLFxuICAgICAgICB2aWV3LFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdG9nZ2xlQXR0cihlbCwgYXR0ciwgdmFsMSwgdmFsMikge1xuICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoYXR0cikpIHtcbiAgICAgIGlmICh2YWwyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdG9nZ2xlIGJldHdlZW4gdmFsMSBhbmQgdmFsMlxuICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKGF0dHIpID09PSB2YWwxKSB7XG4gICAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDJdXSwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWwxXV0sIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGF0dHJcbiAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbXSwgW2F0dHJdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDFdXSwgW10pO1xuICAgIH1cbiAgfSxcblxuICBhZGRPclJlbW92ZUNsYXNzZXMoZWwsIGFkZHMsIHJlbW92ZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKSB7XG4gICAgdGltZSA9IHRpbWUgfHwgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWU7XG4gICAgY29uc3QgW3RyYW5zaXRpb25SdW4sIHRyYW5zaXRpb25TdGFydCwgdHJhbnNpdGlvbkVuZF0gPSB0cmFuc2l0aW9uIHx8IFtcbiAgICAgIFtdLFxuICAgICAgW10sXG4gICAgICBbXSxcbiAgICBdO1xuICAgIGlmICh0cmFuc2l0aW9uUnVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG9uU3RhcnQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHRyYW5zaXRpb25TdGFydCxcbiAgICAgICAgICBbXS5jb25jYXQodHJhbnNpdGlvblJ1bikuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICApO1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgdHJhbnNpdGlvblJ1biwgW10pO1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT5cbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCB0cmFuc2l0aW9uRW5kLCB0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpID0+XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGFkZHMuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICAgIHJlbW92ZXMuY29uY2F0KHRyYW5zaXRpb25SdW4pLmNvbmNhdCh0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICApO1xuICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgIHNldFRpbWVvdXQob25Eb25lLCB0aW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3Qga2VlcEFkZHMgPSBhZGRzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZBZGRzLmluZGV4T2YobmFtZSkgPCAwICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgY29uc3Qga2VlcFJlbW92ZXMgPSByZW1vdmVzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZSZW1vdmVzLmluZGV4T2YobmFtZSkgPCAwICYmIGVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdBZGRzID0gcHJldkFkZHNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gcmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwQWRkcyk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gYWRkcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwUmVtb3Zlcyk7XG5cbiAgICAgIERPTS5wdXRTdGlja3koZWwsIFwiY2xhc3Nlc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICAgIGN1cnJlbnRFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLm5ld1JlbW92ZXMpO1xuICAgICAgICBjdXJyZW50RWwuY2xhc3NMaXN0LmFkZCguLi5uZXdBZGRzKTtcbiAgICAgICAgcmV0dXJuIFtuZXdBZGRzLCBuZXdSZW1vdmVzXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuXG4gIHNldE9yUmVtb3ZlQXR0cnMoZWwsIHNldHMsIHJlbW92ZXMpIHtcbiAgICBjb25zdCBbcHJldlNldHMsIHByZXZSZW1vdmVzXSA9IERPTS5nZXRTdGlja3koZWwsIFwiYXR0cnNcIiwgW1tdLCBbXV0pO1xuXG4gICAgY29uc3QgYWx0ZXJlZEF0dHJzID0gc2V0cy5tYXAoKFthdHRyLCBfdmFsXSkgPT4gYXR0cikuY29uY2F0KHJlbW92ZXMpO1xuICAgIGNvbnN0IG5ld1NldHMgPSBwcmV2U2V0c1xuICAgICAgLmZpbHRlcigoW2F0dHIsIF92YWxdKSA9PiAhYWx0ZXJlZEF0dHJzLmluY2x1ZGVzKGF0dHIpKVxuICAgICAgLmNvbmNhdChzZXRzKTtcbiAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgIC5maWx0ZXIoKGF0dHIpID0+ICFhbHRlcmVkQXR0cnMuaW5jbHVkZXMoYXR0cikpXG4gICAgICAuY29uY2F0KHJlbW92ZXMpO1xuXG4gICAgRE9NLnB1dFN0aWNreShlbCwgXCJhdHRyc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICBuZXdSZW1vdmVzLmZvckVhY2goKGF0dHIpID0+IGN1cnJlbnRFbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgbmV3U2V0cy5mb3JFYWNoKChbYXR0ciwgdmFsXSkgPT4gY3VycmVudEVsLnNldEF0dHJpYnV0ZShhdHRyLCB2YWwpKTtcbiAgICAgIHJldHVybiBbbmV3U2V0cywgbmV3UmVtb3Zlc107XG4gICAgfSk7XG4gIH0sXG5cbiAgaGFzQWxsQ2xhc3NlcyhlbCwgY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLmV2ZXJ5KChuYW1lKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSkpO1xuICB9LFxuXG4gIGlzVG9nZ2xlZE91dChlbCwgb3V0Q2xhc3Nlcykge1xuICAgIHJldHVybiAhdGhpcy5pc1Zpc2libGUoZWwpIHx8IHRoaXMuaGFzQWxsQ2xhc3NlcyhlbCwgb3V0Q2xhc3Nlcyk7XG4gIH0sXG5cbiAgZmlsdGVyVG9FbHMobGl2ZVNvY2tldCwgc291cmNlRWwsIHsgdG8gfSkge1xuICAgIGNvbnN0IGRlZmF1bHRRdWVyeSA9ICgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodG8pO1xuICAgICAgfSBlbHNlIGlmICh0by5jbG9zZXN0KSB7XG4gICAgICAgIGNvbnN0IHRvRWwgPSBzb3VyY2VFbC5jbG9zZXN0KHRvLmNsb3Nlc3QpO1xuICAgICAgICByZXR1cm4gdG9FbCA/IFt0b0VsXSA6IFtdO1xuICAgICAgfSBlbHNlIGlmICh0by5pbm5lcikge1xuICAgICAgICByZXR1cm4gc291cmNlRWwucXVlcnlTZWxlY3RvckFsbCh0by5pbm5lcik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdG9cbiAgICAgID8gbGl2ZVNvY2tldC5qc1F1ZXJ5U2VsZWN0b3JBbGwoc291cmNlRWwsIHRvLCBkZWZhdWx0UXVlcnkpXG4gICAgICA6IFtzb3VyY2VFbF07XG4gIH0sXG5cbiAgZGVmYXVsdERpc3BsYXkoZWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgeyB0cjogXCJ0YWJsZS1yb3dcIiwgdGQ6IFwidGFibGUtY2VsbFwiIH1bZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCBcImJsb2NrXCJcbiAgICApO1xuICB9LFxuXG4gIHRyYW5zaXRpb25DbGFzc2VzKHZhbCkge1xuICAgIGlmICghdmFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgW3RyYW5zLCB0U3RhcnQsIHRFbmRdID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBbdmFsLnNwbGl0KFwiIFwiKSwgW10sIFtdXTtcbiAgICB0cmFucyA9IEFycmF5LmlzQXJyYXkodHJhbnMpID8gdHJhbnMgOiB0cmFucy5zcGxpdChcIiBcIik7XG4gICAgdFN0YXJ0ID0gQXJyYXkuaXNBcnJheSh0U3RhcnQpID8gdFN0YXJ0IDogdFN0YXJ0LnNwbGl0KFwiIFwiKTtcbiAgICB0RW5kID0gQXJyYXkuaXNBcnJheSh0RW5kKSA/IHRFbmQgOiB0RW5kLnNwbGl0KFwiIFwiKTtcbiAgICByZXR1cm4gW3RyYW5zLCB0U3RhcnQsIHRFbmRdO1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgSlM7XG4iLCAiaW1wb3J0IEpTIGZyb20gXCIuL2pzXCI7XG5pbXBvcnQgTGl2ZVNvY2tldCBmcm9tIFwiLi9saXZlX3NvY2tldFwiO1xuXG50eXBlIFRyYW5zaXRpb24gPSBzdHJpbmcgfCBzdHJpbmdbXTtcblxuLy8gQmFzZSBvcHRpb25zIGZvciBjb21tYW5kcyBpbnZvbHZpbmcgdHJhbnNpdGlvbnMgYW5kIHRpbWluZ1xudHlwZSBCYXNlT3B0cyA9IHtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIHRvIHNldC5cbiAgICogQWNjZXB0cyBhIHN0cmluZyBvZiBjbGFzc2VzIG9yIGEgMy10dXBsZSBsaWtlOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0wXCIsIFwib3BhY2l0eS0xMDBcIl1gXG4gICAqL1xuICB0cmFuc2l0aW9uPzogVHJhbnNpdGlvbjtcbiAgLyoqIFRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgMjAwLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG50eXBlIFNob3dPcHRzID0gQmFzZU9wdHMgJiB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG59O1xuXG50eXBlIFRvZ2dsZU9wdHMgPSB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQ1NTIHRyYW5zaXRpb24gY2xhc3NlcyBmb3Igc2hvd2luZy5cbiAgICogQWNjZXB0cyBlaXRoZXIgdGhlIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgaW4sIG9yXG4gICAqIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSB0cmFuc2l0aW9uIGNsYXNzLCB0aGUgY2xhc3MgdG8gYXBwbHlcbiAgICogdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqIGBbXCJlYXNlLW91dCBkdXJhdGlvbi0zMDBcIiwgXCJvcGFjaXR5LTBcIiwgXCJvcGFjaXR5LTEwMFwiXWBcbiAgICovXG4gIGluPzogVHJhbnNpdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIGZvciBoaWRpbmcuXG4gICAqIEFjY2VwdHMgZWl0aGVyIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgb3V0LCBvclxuICAgKiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqIHRvIHN0YXJ0IHRoZSB0cmFuc2l0aW9uLCBhbmQgdGhlIGVuZGluZyB0cmFuc2l0aW9uIGNsYXNzLCBzdWNoIGFzOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0xMDBcIiwgXCJvcGFjaXR5LTBcIl1gXG4gICAqL1xuICBvdXQ/OiBUcmFuc2l0aW9uO1xuICAvKiogVGhlIHRyYW5zaXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG4vLyBPcHRpb25zIHNwZWNpZmljIHRvIHRoZSAndHJhbnNpdGlvbicgY29tbWFuZFxudHlwZSBUcmFuc2l0aW9uQ29tbWFuZE9wdHMgPSB7XG4gIC8qKiBUaGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuICovXG4gIHRpbWU/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRvIGJsb2NrIFVJIGR1cmluZyB0cmFuc2l0aW9uLiBEZWZhdWx0cyBgdHJ1ZWAuICovXG4gIGJsb2NraW5nPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUHVzaE9wdHMgPSB7XG4gIC8qKiBEYXRhIHRvIGJlIG1lcmdlZCBpbnRvIHRoZSBldmVudCBwYXlsb2FkLiAqL1xuICB2YWx1ZT86IGFueTtcbiAgLyoqIEZvciB0YXJnZXRpbmcgYSBMaXZlQ29tcG9uZW50IGJ5IGl0cyBJRCwgYSBjb21wb25lbnQgSUQgKG51bWJlciksIG9yIGEgQ1NTIHNlbGVjdG9yIHN0cmluZy4gKi9cbiAgdGFyZ2V0PzogSFRNTEVsZW1lbnQgfCBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBJbmRpY2F0ZXMgaWYgYSBwYWdlIGxvYWRpbmcgc3RhdGUgc2hvdWxkIGJlIHNob3duLiAqL1xuICBwYWdlX2xvYWRpbmc/OiBib29sZWFuO1xuICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93IG90aGVyIHByb3BlcnRpZXMgbGlrZSAnY2lkJywgJ3JlZGlyZWN0JywgZXRjLlxufTtcblxudHlwZSBOYXZpZ2F0aW9uT3B0cyA9IHtcbiAgLyoqIFdoZXRoZXIgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGluc3RlYWQgb2YgcHVzaGluZyBhIG5ldyBvbmUuICovXG4gIHJlcGxhY2U/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFsbCBwb3NzaWJsZSBKUyBjb21tYW5kcyB0aGF0IGNhbiBiZSBnZW5lcmF0ZWQgYnkgdGhlIGZhY3RvcnkuXG4gKiBUaGlzIGlzIHVzZWQgYXMgYSBiYXNlIGZvciBMaXZlU29ja2V0SlNDb21tYW5kcyBhbmQgSG9va0pTQ29tbWFuZHMuXG4gKi9cbmludGVyZmFjZSBBbGxKU0NvbW1hbmRzIHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgZWxlbWVudC5cbiAgICogVGhpcyB2ZXJzaW9uIGlzIGZvciBnZW5lcmFsIHVzZSB2aWEgbGl2ZVNvY2tldC5qcygpLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCBpbiB3aG9zZSBjb250ZXh0IHRvIGV4ZWN1dGUgdGhlIEphdmFTY3JpcHQuXG4gICAqIEBwYXJhbSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbDogSFRNTEVsZW1lbnQsIGVuY29kZWRKUzogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogU2hvd3MgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gc2hvdy5cbiAgICogQHBhcmFtIHtTaG93T3B0c30gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYGRpc3BsYXlgLCBgdHJhbnNpdGlvbmAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICBzaG93KGVsOiBIVE1MRWxlbWVudCwgb3B0cz86IFNob3dPcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogSGlkZXMgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gaGlkZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGhpZGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGBkaXNwbGF5YCwgYGluYCwgYG91dGAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0b2dnbGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogVG9nZ2xlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgQ1NTIGNsYXNzZXMgdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYWRkIGNsYXNzZXMgdG8uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIGFkZC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGFkZENsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIENTUyBjbGFzc2VzIGZyb20gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gcmVtb3ZlIGNsYXNzZXMgZnJvbS5cbiAgICogQHBhcmFtIG5hbWVzIC0gVGhlIGNsYXNzIG5hbWUocykgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYHRyYW5zaXRpb25gLCBgdGltZWAsIGFuZCBgYmxvY2tpbmdgLlxuICAgKi9cbiAgcmVtb3ZlQ2xhc3MoZWw6IEhUTUxFbGVtZW50LCBuYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdHM/OiBCYXNlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgQ1NTIGNsYXNzZXMgb24gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gdG9nZ2xlIGNsYXNzZXMgb24uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIHRvZ2dsZUNsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgQ1NTIHRyYW5zaXRpb24gdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIHRyYW5zaXRpb24gdG8uXG4gICAqIEBwYXJhbSB0cmFuc2l0aW9uIC0gVGhlIHRyYW5zaXRpb24gY2xhc3MoZXMpIHRvIGFwcGx5LlxuICAgKiAgIEFjY2VwdHMgYSBzdHJpbmcgb2YgY2xhc3NlcyB0byBhcHBseSB3aGVuIHRyYW5zaXRpb25pbmcgb3JcbiAgICogICBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqICAgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqXG4gICAqICAgICAgIFtcImVhc2Utb3V0IGR1cmF0aW9uLTMwMFwiLCBcIm9wYWNpdHktMTAwXCIsIFwib3BhY2l0eS0wXCJdXG4gICAqXG4gICAqIEBwYXJhbSBbb3B0cz17fV0gLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGltaW5nIGFuZCBibG9ja2luZyBiZWhhdmlvci5cbiAgICogICBBY2NlcHRzOiBgdGltZWAgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0cmFuc2l0aW9uKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICB0cmFuc2l0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBvcHRzPzogVHJhbnNpdGlvbkNvbW1hbmRPcHRzLFxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXRzIGFuIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gc2V0LlxuICAgKiBAcGFyYW0gdmFsIC0gVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAgICovXG4gIHNldEF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgYXR0cmlidXRlIGZyb20uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgYW4gYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgYmV0d2VlbiB0d28gdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gdG9nZ2xlLlxuICAgKiBAcGFyYW0gdmFsMSAtIFRoZSBmaXJzdCB2YWx1ZSB0byB0b2dnbGUgYmV0d2Vlbi5cbiAgICogQHBhcmFtIHZhbDIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIHRvZ2dsZSBiZXR3ZWVuLlxuICAgKi9cbiAgdG9nZ2xlQXR0cmlidXRlKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICBhdHRyOiBzdHJpbmcsXG4gICAgdmFsMTogc3RyaW5nLFxuICAgIHZhbDI6IHN0cmluZyxcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogUHVzaGVzIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIEFuIGVsZW1lbnQgdGhhdCBiZWxvbmdzIHRvIHRoZSB0YXJnZXQgTGl2ZVZpZXcgLyBMaXZlQ29tcG9uZW50IG9yIGEgY29tcG9uZW50IElELlxuICAgKiAgIFRvIHRhcmdldCBhIExpdmVDb21wb25lbnQgYnkgaXRzIElELCBwYXNzIGEgc2VwYXJhdGUgYHRhcmdldGAgaW4gdGhlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIGV2ZW50IG5hbWUgdG8gcHVzaC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB2YWx1ZWAsIGB0YXJnZXRgLCBgcGFnZV9sb2FkaW5nYC5cbiAgICovXG4gIHB1c2goZWw6IEhUTUxFbGVtZW50LCB0eXBlOiBzdHJpbmcsIG9wdHM/OiBQdXNoT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbmF2aWdhdGlvbiBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBuYXZpZ2F0ZSB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIG5hdmlnYXRlKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogU2VuZHMgYSBwYXRjaCBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBwYXRjaCB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIHBhdGNoKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogTWFyayBhdHRyaWJ1dGVzIGFzIGlnbm9yZWQsIHNraXBwaW5nIHRoZW0gd2hlbiBwYXRjaGluZyB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBpZ25vcmUgYXR0cmlidXRlcyBvbi5cbiAgICogQHBhcmFtIGF0dHJzIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIG9yIG5hbWVzIHRvIGlnbm9yZS5cbiAgICovXG4gIGlnbm9yZUF0dHJpYnV0ZXMoZWw6IEhUTUxFbGVtZW50LCBhdHRyczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoXG4gIGxpdmVTb2NrZXQ6IExpdmVTb2NrZXQsXG4gIGV2ZW50VHlwZTogc3RyaW5nIHwgbnVsbCxcbik6IEFsbEpTQ29tbWFuZHMgPT4ge1xuICByZXR1cm4ge1xuICAgIGV4ZWMoZWwsIGVuY29kZWRKUykge1xuICAgICAgbGl2ZVNvY2tldC5leGVjSlMoZWwsIGVuY29kZWRKUywgZXZlbnRUeXBlKTtcbiAgICB9LFxuICAgIHNob3coZWwsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLnNob3coXG4gICAgICAgIGV2ZW50VHlwZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIGVsLFxuICAgICAgICBvcHRzLmRpc3BsYXksXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBoaWRlKGVsLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5oaWRlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZShlbCwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgY29uc3QgaW5UcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5pbik7XG4gICAgICBjb25zdCBvdXRUcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5vdXQpO1xuICAgICAgSlMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgb3B0cy5kaXNwbGF5LFxuICAgICAgICBpblRyYW5zaXRpb24sXG4gICAgICAgIG91dFRyYW5zaXRpb24sXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhZGRDbGFzcyhlbCwgbmFtZXMsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IEFycmF5LmlzQXJyYXkobmFtZXMpID8gbmFtZXMgOiBuYW1lcy5zcGxpdChcIiBcIik7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgSlMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIG9wdHMuYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH0sXG4gICAgcmVtb3ZlQ2xhc3MoZWwsIG5hbWVzLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzIDogbmFtZXMuc3BsaXQoXCIgXCIpO1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgZWwsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGFzc05hbWVzLFxuICAgICAgICBKUy50cmFuc2l0aW9uQ2xhc3NlcyhvcHRzLnRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZUNsYXNzKGVsLCBuYW1lcywgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjbGFzc05hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IG5hbWVzLnNwbGl0KFwiIFwiKTtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy50b2dnbGVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvd25lcixcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICB0cmFuc2l0aW9uKGVsLCB0cmFuc2l0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBbXSxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKHRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHNldEF0dHJpYnV0ZShlbCwgYXR0ciwgdmFsKSB7XG4gICAgICBKUy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbF1dLCBbXSk7XG4gICAgfSxcbiAgICByZW1vdmVBdHRyaWJ1dGUoZWwsIGF0dHIpIHtcbiAgICAgIEpTLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtdLCBbYXR0cl0pO1xuICAgIH0sXG4gICAgdG9nZ2xlQXR0cmlidXRlKGVsLCBhdHRyLCB2YWwxLCB2YWwyKSB7XG4gICAgICBKUy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgICB9LFxuICAgIHB1c2goZWwsIHR5cGUsIG9wdHMgPSB7fSkge1xuICAgICAgbGl2ZVNvY2tldC53aXRoaW5Pd25lcnMoZWwsICh2aWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBvcHRzLnZhbHVlIHx8IHt9O1xuICAgICAgICBkZWxldGUgb3B0cy52YWx1ZTtcbiAgICAgICAgbGV0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiLCB7IGRldGFpbDogeyBzb3VyY2VFbGVtZW50OiBlbCB9IH0pO1xuICAgICAgICBKUy5leGVjKGUsIGV2ZW50VHlwZSwgdHlwZSwgdmlldywgZWwsIFtcInB1c2hcIiwgeyBkYXRhLCAuLi5vcHRzIH1dKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoaHJlZiwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIpO1xuICAgICAgbGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICAgIGN1c3RvbUV2ZW50LFxuICAgICAgICBocmVmLFxuICAgICAgICBvcHRzLnJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHBhdGNoKGhyZWYsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiKTtcbiAgICAgIGxpdmVTb2NrZXQucHVzaEhpc3RvcnlQYXRjaChcbiAgICAgICAgY3VzdG9tRXZlbnQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIG9wdHMucmVwbGFjZSA/IFwicmVwbGFjZVwiIDogXCJwdXNoXCIsXG4gICAgICAgIG51bGwsXG4gICAgICApO1xuICAgIH0sXG4gICAgaWdub3JlQXR0cmlidXRlcyhlbCwgYXR0cnMpIHtcbiAgICAgIEpTLmlnbm9yZUF0dHJzKGVsLCBBcnJheS5pc0FycmF5KGF0dHJzKSA/IGF0dHJzIDogW2F0dHJzXSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogSlNDb21tYW5kcyBmb3IgdXNlIHdpdGggYGxpdmVTb2NrZXQuanMoKWAuXG4gKiBJbmNsdWRlcyB0aGUgZ2VuZXJhbCBgZXhlY2AgY29tbWFuZCB0aGF0IHJlcXVpcmVzIGFuIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIExpdmVTb2NrZXRKU0NvbW1hbmRzID0gQWxsSlNDb21tYW5kcztcblxuLyoqXG4gKiBKU0NvbW1hbmRzIGZvciB1c2Ugd2l0aGluIGEgSG9vay5cbiAqIFRoZSBgZXhlY2AgY29tbWFuZCBpcyB0YWlsb3JlZCBmb3IgaG9va3MsIG5vdCByZXF1aXJpbmcgYW4gZXhwbGljaXQgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb29rSlNDb21tYW5kcyBleHRlbmRzIE9taXQ8QWxsSlNDb21tYW5kcywgXCJleGVjXCI+IHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgaG9vaydzIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbmNvZGVkSlM6IHN0cmluZyk6IHZvaWQ7XG59XG4iLCAiaW1wb3J0IGpzQ29tbWFuZHMsIHsgSG9va0pTQ29tbWFuZHMgfSBmcm9tIFwiLi9qc19jb21tYW5kc1wiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBMaXZlU29ja2V0IGZyb20gXCIuL2xpdmVfc29ja2V0XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5cbmNvbnN0IEhPT0tfSUQgPSBcImhvb2tJZFwiO1xubGV0IHZpZXdIb29rSUQgPSAxO1xuXG5leHBvcnQgdHlwZSBPblJlcGx5ID0gKHJlcGx5OiBhbnksIHJlZjogbnVtYmVyKSA9PiBhbnk7XG5leHBvcnQgdHlwZSBDYWxsYmFja1JlZiA9IHsgZXZlbnQ6IHN0cmluZzsgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSB9O1xuXG5leHBvcnQgdHlwZSBQaHhUYXJnZXQgPSBzdHJpbmcgfCBudW1iZXIgfCBIVE1MRWxlbWVudDtcblxuZXhwb3J0IGludGVyZmFjZSBIb29rSW50ZXJmYWNlPEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgRE9NIGVsZW1lbnQgdGhhdCB0aGUgaG9vayBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIGVsOiBFO1xuXG4gIC8qKlxuICAgKiBUaGUgTGl2ZVNvY2tldCBpbnN0YW5jZSB0aGF0IHRoZSBob29rIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICAvKipcbiAgICogVGhlIG1vdW50ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBET00gYW5kIGl0cyBzZXJ2ZXIgTGl2ZVZpZXcgaGFzIGZpbmlzaGVkIG1vdW50aW5nLlxuICAgKi9cbiAgbW91bnRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBiZWZvcmVVcGRhdGUgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGFib3V0IHRvIGJlIHVwZGF0ZWQgaW4gdGhlIERPTS5cbiAgICogTm90ZTogYW55IGNhbGwgaGVyZSBtdXN0IGJlIHN5bmNocm9ub3VzIGFzIHRoZSBvcGVyYXRpb24gY2Fubm90IGJlIGRlZmVycmVkIG9yIGNhbmNlbGxlZC5cbiAgICovXG4gIGJlZm9yZVVwZGF0ZT86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXN0cm95ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSwgZWl0aGVyIGJ5IGEgcGFyZW50IHVwZGF0ZSwgb3IgYnkgdGhlIHBhcmVudCBiZWluZyByZW1vdmVkIGVudGlyZWx5XG4gICAqL1xuICBkZXN0cm95ZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzY29ubmVjdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCdzIHBhcmVudCBMaXZlVmlldyBoYXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBtYW5pcGx1YXRlIHRoZSBET00gYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdC5cbiAgICogVGhlIGFwcGxpZWQgY2hhbmdlcyBpbnRlZ3JhdGUgd2l0aCBzZXJ2ZXIgRE9NIHBhdGNoaW5nLlxuICAgKi9cbiAganMoKTogSG9va0pTQ29tbWFuZHM7XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBhbiBldmVudCB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIFtwYXlsb2FkXSAtIFRoZSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuICAgKiBAcGFyYW0gW29uUmVwbHldIC0gQSBjYWxsYmFjayB0byBoYW5kbGUgdGhlIHNlcnZlcidzIHJlcGx5LlxuICAgKlxuICAgKiBXaGVuIG9uUmVwbHkgaXMgbm90IHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgYSBQcm9taXNlIHRoYXRcbiAgICogV2hlbiBvblJlcGx5IGlzIHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgdm9pZC5cbiAgICovXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkOiBhbnksIG9uUmVwbHk6IE9uUmVwbHkpOiB2b2lkO1xuICBwdXNoRXZlbnQoZXZlbnQ6IHN0cmluZywgcGF5bG9hZD86IGFueSk6IFByb21pc2U8YW55PjtcblxuICAvKipcbiAgICogUHVzaGVkIGEgdGFyZ2V0ZWQgZXZlbnQgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogSXQgc2VuZHMgdGhlIGV2ZW50IHRvIHRoZSBMaXZlQ29tcG9uZW50IG9yIExpdmVWaWV3IHRoZSBgc2VsZWN0b3JPclRhcmdldGAgaXMgZGVmaW5lZCBpbixcbiAgICogd2hlcmUgaXRzIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBxdWVyeSBzZWxlY3RvciwgYW4gYWN0dWFsIERPTSBlbGVtZW50LCBvciBhIENJRCAoY29tcG9uZW50IGlkKVxuICAgKiByZXR1cm5lZCBieSB0aGUgYEBteXNlbGZgIGFzc2lnbi5cbiAgICpcbiAgICogSWYgdGhlIHF1ZXJ5IHNlbGVjdG9yIHJldHVybnMgbW9yZSB0aGFuIG9uZSBlbGVtZW50IGl0IHdpbGwgc2VuZCB0aGUgZXZlbnQgdG8gYWxsIG9mIHRoZW0sXG4gICAqIGV2ZW4gaWYgYWxsIHRoZSBlbGVtZW50cyBhcmUgaW4gdGhlIHNhbWUgTGl2ZUNvbXBvbmVudCBvciBMaXZlVmlldy4gQmVjYXVzZSBvZiB0aGlzLFxuICAgKiBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWQsIGEgcHJvbWlzZSBpcyByZXR1cm5lZCB0aGF0IG1hdGNoZXMgdGhlIHJldHVybiB2YWx1ZSBvZlxuICAgKiBbYFByb21pc2UuYWxsU2V0dGxlZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJvbWlzZS9hbGxTZXR0bGVkI3JldHVybl92YWx1ZSkuXG4gICAqIEluZGl2aWR1YWwgZnVsZmlsbGVkIHZhbHVlcyBhcmUgb2YgdGhlIGZvcm1hdCBgeyByZXBseSwgcmVmIH1gLCB3aGVyZSBgcmVwbHlgIGlzIHRoZSBzZXJ2ZXIncyByZXBseS5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdG9yT3JUYXJnZXQgLSBUaGUgc2VsZWN0b3IsIGVsZW1lbnQsIG9yIENJRCB0byB0YXJnZXQuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBldmVudCBuYW1lLlxuICAgKiBAcGFyYW0gW3BheWxvYWRdIC0gVGhlIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgc2VydmVyLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QuXG4gICAqIEBwYXJhbSBbb25SZXBseV0gLSBBIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgc2VydmVyJ3MgcmVwbHkuXG4gICAqXG4gICAqIFdoZW4gb25SZXBseSBpcyBub3QgcHJvdmlkZWQsIHRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2UuXG4gICAqIFdoZW4gb25SZXBseSBpcyBwcm92aWRlZCwgdGhlIG1ldGhvZCByZXR1cm5zIHZvaWQuXG4gICAqL1xuICBwdXNoRXZlbnRUbyhcbiAgICBzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsXG4gICAgZXZlbnQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBvYmplY3QsXG4gICAgb25SZXBseTogT25SZXBseSxcbiAgKTogdm9pZDtcbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgKTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDx7IHJlcGx5OiBhbnk7IHJlZjogbnVtYmVyIH0+W10+O1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhbiBldmVudCBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0byBoYW5kbGUgYHB1c2hFdmVudGAgY2FsbHMgZnJvbSB0aGUgc2VydmVyLiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIHBheWxvYWQgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgcmVjZWl2ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsYmFjaywgd2hpY2ggY2FuIGJlIHVzZWQgaW4gYHJlbW92ZUhhbmRsZUV2ZW50YCB0byByZW1vdmUgdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgaGFuZGxlRXZlbnQoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSk6IENhbGxiYWNrUmVmO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIGBoYW5kbGVFdmVudGAuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1JlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gdHJpZ2dlciBhIGxpdmUgZmlsZSB1cGxvYWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHVwbG9hZCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGBQaG9lbml4LkxpdmVWaWV3LmFsbG93X3VwbG9hZC8zYCBjYWxsLlxuICAgKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdXBsb2FkLlxuICAgKi9cbiAgdXBsb2FkKG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvKipcbiAgICogQWxsb3dzIHRvIHRyaWdnZXIgYSBsaXZlIGZpbGUgdXBsb2FkIHRvIGEgc3BlY2lmaWMgdGFyZ2V0LlxuICAgKlxuICAgKiBAcGFyYW0gc2VsZWN0b3JPclRhcmdldCAtIFRoZSB0YXJnZXQgdG8gdXBsb2FkIHRoZSBmaWxlcyB0by5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgdXBsb2FkIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgYFBob2VuaXguTGl2ZVZpZXcuYWxsb3dfdXBsb2FkLzNgIGNhbGwuXG4gICAqIEBwYXJhbSBmaWxlcyAtIFRoZSBmaWxlcyB0byB1cGxvYWQuXG4gICAqL1xuICB1cGxvYWRUbyhzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsIG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvLyBhbGxvdyB1bmtub3duIG1ldGhvZHMsIGFzIHBlb3BsZSBjYW4gZGVmaW5lIHRoZW0gaW4gdGhlaXIgaG9va3NcbiAgW2tleTogUHJvcGVydHlLZXldOiBhbnk7XG59XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9EZWZpbml0ZWx5VHlwZWQvRGVmaW5pdGVseVR5cGVkL2Jsb2IvZmFjMWFhNzVhY2RkZGJmNGYxYTk1ZTk4ZWUyMjk3YjU0Y2U0YjRjOS90eXBlcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5kLnRzI0wyNlxuLy8gbGljZW5zZWQgdW5kZXIgTUlUXG5leHBvcnQgaW50ZXJmYWNlIEhvb2s8b3V0IFQgPSBvYmplY3QsIEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgbW91bnRlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTSBhbmQgaXRzIHNlcnZlciBMaXZlVmlldyBoYXMgZmluaXNoZWQgbW91bnRpbmcuXG4gICAqL1xuICBtb3VudGVkPzogKHRoaXM6IFQgJiBIb29rSW50ZXJmYWNlPEU+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgYmVmb3JlVXBkYXRlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhYm91dCB0byBiZSB1cGRhdGVkIGluIHRoZSBET00uXG4gICAqIE5vdGU6IGFueSBjYWxsIGhlcmUgbXVzdCBiZSBzeW5jaHJvbm91cyBhcyB0aGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBkZWZlcnJlZCBvciBjYW5jZWxsZWQuXG4gICAqL1xuICBiZWZvcmVVcGRhdGU/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRlc3Ryb3llZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwYWdlLCBlaXRoZXIgYnkgYSBwYXJlbnQgdXBkYXRlLCBvciBieSB0aGUgcGFyZW50IGJlaW5nIHJlbW92ZWQgZW50aXJlbHlcbiAgICovXG4gIGRlc3Ryb3llZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRpc2Nvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBkaXNjb25uZWN0ZWQ/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvLyBBbGxvdyBjdXN0b20gbWV0aG9kcyB3aXRoIGFueSBzaWduYXR1cmUgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzXG4gIFtrZXk6IFByb3BlcnR5S2V5XTogYW55O1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIExpdmVWaWV3IGhvb2tzLiBVc2VycyBleHRlbmQgdGhpcyBjbGFzcyB0byBkZWZpbmUgdGhlaXIgaG9va3MuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15Q3VzdG9tSG9vayBleHRlbmRzIFZpZXdIb29rIHtcbiAqICAgbXlTdGF0ZSA9IFwiaW5pdGlhbFwiO1xuICpcbiAqICAgbW91bnRlZCgpIHtcbiAqICAgICBjb25zb2xlLmxvZyhcIkhvb2sgbW91bnRlZCBvbiBlbGVtZW50OlwiLCB0aGlzLmVsKTtcbiAqICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gKiAgICAgICB0aGlzLnB1c2hFdmVudChcImVsZW1lbnQtY2xpY2tlZFwiLCB7IHN0YXRlOiB0aGlzLm15U3RhdGUgfSk7XG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIHVwZGF0ZWQoKSB7XG4gKiAgICAgY29uc29sZS5sb2coXCJIb29rIHVwZGF0ZWRcIiwgdGhpcy5lbC5pZCk7XG4gKiAgIH1cbiAqXG4gKiAgIG15Q3VzdG9tTWV0aG9kKHNvbWVBcmc6IHN0cmluZykge1xuICogICAgIGNvbnNvbGUubG9nKFwibXlDdXN0b21NZXRob2QgY2FsbGVkIHdpdGg6XCIsIHNvbWVBcmcsIFwiQ3VycmVudCBzdGF0ZTpcIiwgdGhpcy5teVN0YXRlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhlIGB0aGlzYCBjb250ZXh0IHdpdGhpbiB0aGUgaG9vayBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20gbWV0aG9kcywgZXRjLilcbiAqIHdpbGwgcmVmZXIgdG8gdGhlIGhvb2sgaW5zdGFuY2UsIHByb3ZpZGluZyBhY2Nlc3MgdG8gYHRoaXMuZWxgLCBgdGhpcy5saXZlU29ja2V0YCxcbiAqIGB0aGlzLnB1c2hFdmVudCgpYCwgZXRjLiwgYXMgd2VsbCBhcyBhbnkgcHJvcGVydGllcyBvciBtZXRob2RzIGRlZmluZWQgb24gdGhlIHN1YmNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgVmlld0hvb2s8RSBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+XG4gIGltcGxlbWVudHMgSG9va0ludGVyZmFjZTxFPlxue1xuICBlbDogRTtcbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICBwcml2YXRlIF9fbGlzdGVuZXJzOiBTZXQ8Q2FsbGJhY2tSZWY+O1xuICBwcml2YXRlIF9faXNEaXNjb25uZWN0ZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX192aWV3OiAoKSA9PiBWaWV3O1xuXG4gIHN0YXRpYyBtYWtlSUQoKSB7XG4gICAgcmV0dXJuIHZpZXdIb29rSUQrKztcbiAgfVxuICBzdGF0aWMgZWxlbWVudElEKGVsOiBIVE1MRWxlbWVudCkge1xuICAgIHJldHVybiBET00ucHJpdmF0ZShlbCwgSE9PS19JRCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3OiBWaWV3IHwgbnVsbCwgZWw6IEUsIGNhbGxiYWNrcz86IEhvb2spIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5fX2F0dGFjaFZpZXcodmlldyk7XG4gICAgdGhpcy5fX2xpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBET00ucHV0UHJpdmF0ZSh0aGlzLmVsLCBIT09LX0lELCBWaWV3SG9vay5tYWtlSUQoKSk7XG5cbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAvLyBUaGlzIGluc3RhbmNlIGlzIGZvciBhbiBvYmplY3QtbGl0ZXJhbCBob29rLiBDb3B5IG1ldGhvZHMvcHJvcGVydGllcy5cbiAgICAgIC8vIFRoZXNlIGFyZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIE5PVCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsYmFja3Mgb2JqZWN0LlxuICAgICAgY29uc3QgcHJvdGVjdGVkUHJvcHMgPSBuZXcgU2V0KFtcbiAgICAgICAgXCJlbFwiLFxuICAgICAgICBcImxpdmVTb2NrZXRcIixcbiAgICAgICAgXCJfX3ZpZXdcIixcbiAgICAgICAgXCJfX2xpc3RlbmVyc1wiLFxuICAgICAgICBcIl9faXNEaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJjb25zdHJ1Y3RvclwiLCAvLyBTdGFuZGFyZCBvYmplY3QgcHJvcGVydGllc1xuICAgICAgICAvLyBDb3JlIFZpZXdIb29rIEFQSSBtZXRob2RzXG4gICAgICAgIFwianNcIixcbiAgICAgICAgXCJwdXNoRXZlbnRcIixcbiAgICAgICAgXCJwdXNoRXZlbnRUb1wiLFxuICAgICAgICBcImhhbmRsZUV2ZW50XCIsXG4gICAgICAgIFwicmVtb3ZlSGFuZGxlRXZlbnRcIixcbiAgICAgICAgXCJ1cGxvYWRcIixcbiAgICAgICAgXCJ1cGxvYWRUb1wiLFxuICAgICAgICAvLyBJbnRlcm5hbCBsaWZlY3ljbGUgY2FsbGVyc1xuICAgICAgICBcIl9fbW91bnRlZFwiLFxuICAgICAgICBcIl9fdXBkYXRlZFwiLFxuICAgICAgICBcIl9fYmVmb3JlVXBkYXRlXCIsXG4gICAgICAgIFwiX19kZXN0cm95ZWRcIixcbiAgICAgICAgXCJfX3JlY29ubmVjdGVkXCIsXG4gICAgICAgIFwiX19kaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJfX2NsZWFudXBfX1wiLFxuICAgICAgXSk7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNhbGxiYWNrcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhbGxiYWNrcywga2V5KSkge1xuICAgICAgICAgICh0aGlzIGFzIGFueSlba2V5XSA9IGNhbGxiYWNrc1trZXldO1xuICAgICAgICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UgYWxsb3cgdGhlIG92ZXJ3cml0ZSwgYnV0IHdlIGxvZyBhIHdhcm5pbmdcbiAgICAgICAgICBpZiAocHJvdGVjdGVkUHJvcHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYEhvb2sgb2JqZWN0IGZvciBlbGVtZW50ICMke2VsLmlkfSBvdmVyd3JpdGVzIGNvcmUgcHJvcGVydHkgJyR7a2V5fSchYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpZmVjeWNsZU1ldGhvZHM6IChrZXlvZiBIb29rKVtdID0gW1xuICAgICAgICBcIm1vdW50ZWRcIixcbiAgICAgICAgXCJiZWZvcmVVcGRhdGVcIixcbiAgICAgICAgXCJ1cGRhdGVkXCIsXG4gICAgICAgIFwiZGVzdHJveWVkXCIsXG4gICAgICAgIFwiZGlzY29ubmVjdGVkXCIsXG4gICAgICAgIFwicmVjb25uZWN0ZWRcIixcbiAgICAgIF07XG4gICAgICBsaWZlY3ljbGVNZXRob2RzLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNhbGxiYWNrc1ttZXRob2ROYW1lXSAmJlxuICAgICAgICAgIHR5cGVvZiBjYWxsYmFja3NbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW21ldGhvZE5hbWVdID0gY2FsbGJhY2tzW21ldGhvZE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gSWYgJ2NhbGxiYWNrcycgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIGEgdXNlci1kZWZpbmVkIGNsYXNzIChlLmcuLCBNeUhvb2spLlxuICAgIC8vIEl0cyBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20pIGFyZSBhbHJlYWR5IHBhcnQgb2YgaXRzIHByb3RvdHlwZSBvciBpbnN0YW5jZSxcbiAgICAvLyBhbmQgd2lsbCBjb3JyZWN0bHkgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzIGZyb20gVmlld0hvb2sucHJvdG90eXBlLlxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2F0dGFjaFZpZXcodmlldzogVmlldyB8IG51bGwpIHtcbiAgICBpZiAodmlldykge1xuICAgICAgdGhpcy5fX3ZpZXcgPSAoKSA9PiB2aWV3O1xuICAgICAgdGhpcy5saXZlU29ja2V0ID0gdmlldy5saXZlU29ja2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fdmlldyA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBob29rIG5vdCB5ZXQgYXR0YWNoZWQgdG8gYSBsaXZlIHZpZXc6ICR7dGhpcy5lbC5vdXRlckhUTUx9YCxcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmxpdmVTb2NrZXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZmF1bHQgbGlmZWN5Y2xlIG1ldGhvZHNcbiAgbW91bnRlZCgpOiB2b2lkIHt9XG4gIGJlZm9yZVVwZGF0ZSgpOiB2b2lkIHt9XG4gIHVwZGF0ZWQoKTogdm9pZCB7fVxuICBkZXN0cm95ZWQoKTogdm9pZCB7fVxuICBkaXNjb25uZWN0ZWQoKTogdm9pZCB7fVxuICByZWNvbm5lY3RlZCgpOiB2b2lkIHt9XG5cbiAgLy8gSW50ZXJuYWwgbGlmZWN5Y2xlIGNhbGxlcnMgLSBjYWxsZWQgYnkgdGhlIFZpZXdcblxuICAvKiogQGludGVybmFsICovXG4gIF9fbW91bnRlZCgpIHtcbiAgICB0aGlzLm1vdW50ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fdXBkYXRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fYmVmb3JlVXBkYXRlKCkge1xuICAgIHRoaXMuYmVmb3JlVXBkYXRlKCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rlc3Ryb3llZCgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCgpO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIEhPT0tfSUQpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vcGhvZW5peGZyYW1ld29yay9waG9lbml4X2xpdmVfdmlldy9pc3N1ZXMvMzQ5NlxuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19yZWNvbm5lY3RlZCgpIHtcbiAgICBpZiAodGhpcy5fX2lzRGlzY29ubmVjdGVkKSB7XG4gICAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVjb25uZWN0ZWQoKTtcbiAgICB9XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rpc2Nvbm5lY3RlZCgpIHtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBqcygpOiBIb29rSlNDb21tYW5kcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmpzQ29tbWFuZHModGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LCBcImhvb2tcIiksXG4gICAgICBleGVjOiAoZW5jb2RlZEpTOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LmV4ZWNKUyh0aGlzLmVsLCBlbmNvZGVkSlMsIFwiaG9va1wiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55LCBvblJlcGx5PzogT25SZXBseSkge1xuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLl9fdmlldygpLnB1c2hIb29rRXZlbnQoXG4gICAgICB0aGlzLmVsLFxuICAgICAgbnVsbCxcbiAgICAgIGV2ZW50LFxuICAgICAgcGF5bG9hZCB8fCB7fSxcbiAgICApO1xuICAgIGlmIChvblJlcGx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKHsgcmVwbHkgfSkgPT4gcmVwbHkpO1xuICAgIH1cbiAgICBwcm9taXNlLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgICBvblJlcGx5PzogT25SZXBseSxcbiAgKSB7XG4gICAgaWYgKG9uUmVwbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGFyZ2V0UGFpcjogeyB2aWV3OiBWaWV3OyB0YXJnZXRDdHg6IGFueSB9W10gPSBbXTtcbiAgICAgIHRoaXMuX192aWV3KCkud2l0aGluVGFyZ2V0cyhzZWxlY3Rvck9yVGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIHRhcmdldFBhaXIucHVzaCh7IHZpZXcsIHRhcmdldEN0eCB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSB0YXJnZXRQYWlyLm1hcCgoeyB2aWV3LCB0YXJnZXRDdHggfSkgPT4ge1xuICAgICAgICByZXR1cm4gdmlldy5wdXNoSG9va0V2ZW50KHRoaXMuZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQgfHwge30pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgICB9XG4gICAgdGhpcy5fX3ZpZXcoKS53aXRoaW5UYXJnZXRzKHNlbGVjdG9yT3JUYXJnZXQsICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgIHZpZXdcbiAgICAgICAgLnB1c2hIb29rRXZlbnQodGhpcy5lbCwgdGFyZ2V0Q3R4LCBldmVudCwgcGF5bG9hZCB8fCB7fSlcbiAgICAgICAgLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhbmRsZUV2ZW50KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAocGF5bG9hZDogYW55KSA9PiBhbnkpOiBDYWxsYmFja1JlZiB7XG4gICAgY29uc3QgY2FsbGJhY2tSZWY6IENhbGxiYWNrUmVmID0ge1xuICAgICAgZXZlbnQsXG4gICAgICBjYWxsYmFjazogKGN1c3RvbUV2ZW50OiBDdXN0b21FdmVudCkgPT4gY2FsbGJhY2soY3VzdG9tRXZlbnQuZGV0YWlsKSxcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDoke2V2ZW50fWAsXG4gICAgICBjYWxsYmFja1JlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5hZGQoY2FsbGJhY2tSZWYpO1xuICAgIHJldHVybiBjYWxsYmFja1JlZjtcbiAgfVxuXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIGBwaHg6JHtyZWYuZXZlbnR9YCxcbiAgICAgIHJlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5kZWxldGUocmVmKTtcbiAgfVxuXG4gIHVwbG9hZChuYW1lOiBzdHJpbmcsIGZpbGVzOiBGaWxlTGlzdCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3KCkuZGlzcGF0Y2hVcGxvYWRzKG51bGwsIG5hbWUsIGZpbGVzKTtcbiAgfVxuXG4gIHVwbG9hZFRvKHNlbGVjdG9yT3JUYXJnZXQ6IFBoeFRhcmdldCwgbmFtZTogc3RyaW5nLCBmaWxlczogRmlsZUxpc3QpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9fdmlldygpLndpdGhpblRhcmdldHMoc2VsZWN0b3JPclRhcmdldCwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgdmlldy5kaXNwYXRjaFVwbG9hZHModGFyZ2V0Q3R4LCBuYW1lLCBmaWxlcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9fY2xlYW51cF9fKCkge1xuICAgIHRoaXMuX19saXN0ZW5lcnMuZm9yRWFjaCgoY2FsbGJhY2tSZWYpID0+XG4gICAgICB0aGlzLnJlbW92ZUhhbmRsZUV2ZW50KGNhbGxiYWNrUmVmKSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEhvb2tzT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBWaWV3SG9vayB8IEhvb2s+O1xuXG5leHBvcnQgZGVmYXVsdCBWaWV3SG9vaztcbiIsICJpbXBvcnQge1xuICBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VULFxuICBDSEVDS0FCTEVfSU5QVVRTLFxuICBDT05TRUNVVElWRV9SRUxPQURTLFxuICBQSFhfQVVUT19SRUNPVkVSLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfVklFV19SRUYsXG4gIFBIWF9DT05ORUNURURfQ0xBU1MsXG4gIFBIWF9ESVNBQkxFX1dJVEgsXG4gIFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSxcbiAgUEhYX0RJU0FCTEVELFxuICBQSFhfTE9BRElOR19DTEFTUyxcbiAgUEhYX0VSUk9SX0NMQVNTLFxuICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfSE9PSyxcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BST0dSRVNTLFxuICBQSFhfUkVBRE9OTFksXG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9TUkMsXG4gIFBIWF9SRUZfTE9DSyxcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU1RBVElDLFxuICBQSFhfU1RJQ0tZLFxuICBQSFhfVFJBQ0tfU1RBVElDLFxuICBQSFhfVFJBQ0tfVVBMT0FEUyxcbiAgUEhYX1VQREFURSxcbiAgUEhYX1VQTE9BRF9SRUYsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQSFhfTUFJTixcbiAgUEhYX01PVU5URUQsXG4gIFBVU0hfVElNRU9VVCxcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgTUFYX0NISUxEX0pPSU5fQVRURU1QVFMsXG4gIFBIWF9MVl9QSUQsXG4gIFBIWF9QT1JUQUwsXG4gIFBIWF9URUxFUE9SVEVEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgaXNFbXB0eSxcbiAgaXNFcXVhbE9iaixcbiAgbG9nRXJyb3IsXG4gIG1heWJlLFxuICBpc0NpZCxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBFbGVtZW50UmVmIGZyb20gXCIuL2VsZW1lbnRfcmVmXCI7XG5pbXBvcnQgRE9NUGF0Y2ggZnJvbSBcIi4vZG9tX3BhdGNoXCI7XG5pbXBvcnQgTGl2ZVVwbG9hZGVyIGZyb20gXCIuL2xpdmVfdXBsb2FkZXJcIjtcbmltcG9ydCBSZW5kZXJlZCBmcm9tIFwiLi9yZW5kZXJlZFwiO1xuaW1wb3J0IHsgVmlld0hvb2sgfSBmcm9tIFwiLi92aWV3X2hvb2tcIjtcbmltcG9ydCBKUyBmcm9tIFwiLi9qc1wiO1xuXG5pbXBvcnQgbW9ycGhkb20gZnJvbSBcIm1vcnBoZG9tXCI7XG5cbmV4cG9ydCBjb25zdCBwcmVwZW5kRm9ybURhdGFLZXkgPSAoa2V5LCBwcmVmaXgpID0+IHtcbiAgY29uc3QgaXNBcnJheSA9IGtleS5lbmRzV2l0aChcIltdXCIpO1xuICAvLyBSZW1vdmUgdGhlIFwiW11cIiBpZiBpdCdzIGFuIGFycmF5XG4gIGxldCBiYXNlS2V5ID0gaXNBcnJheSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG4gIC8vIFJlcGxhY2UgbGFzdCBvY2N1cnJlbmNlIG9mIGtleSBiZWZvcmUgYSBjbG9zaW5nIGJyYWNrZXQgb3IgdGhlIGVuZCB3aXRoIGtleSBwbHVzIHN1ZmZpeFxuICBiYXNlS2V5ID0gYmFzZUtleS5yZXBsYWNlKC8oW15cXFtcXF1dKykoXFxdPyQpLywgYCR7cHJlZml4fSQxJDJgKTtcbiAgLy8gQWRkIGJhY2sgdGhlIFwiW11cIiBpZiBpdCB3YXMgYW4gYXJyYXlcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICBiYXNlS2V5ICs9IFwiW11cIjtcbiAgfVxuICByZXR1cm4gYmFzZUtleTtcbn07XG5cbmNvbnN0IHNlcmlhbGl6ZUZvcm0gPSAoZm9ybSwgb3B0cywgb25seU5hbWVzID0gW10pID0+IHtcbiAgY29uc3QgeyBzdWJtaXR0ZXIgfSA9IG9wdHM7XG5cbiAgLy8gV2UgbXVzdCBpbmplY3QgdGhlIHN1Ym1pdHRlciBpbiB0aGUgb3JkZXIgdGhhdCBpdCBleGlzdHMgaW4gdGhlIERPTVxuICAvLyByZWxhdGl2ZSB0byBvdGhlciBpbnB1dHMuIEZvciBleGFtcGxlLCBmb3IgY2hlY2tib3ggZ3JvdXBzLCB0aGUgb3JkZXIgbXVzdCBiZSBtYWludGFpbmVkLlxuICBsZXQgaW5qZWN0ZWRFbGVtZW50O1xuICBpZiAoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgLy8gc2V0IHRoZSBmb3JtIGF0dHJpYnV0ZSBpZiB0aGUgc3VibWl0dGVyIGhhcyBvbmU7XG4gICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBlbGVtZW50IGlzIG91dHNpZGUgdGhlIGFjdHVhbCBmb3JtIGVsZW1lbnRcbiAgICBjb25zdCBmb3JtSWQgPSBzdWJtaXR0ZXIuZ2V0QXR0cmlidXRlKFwiZm9ybVwiKTtcbiAgICBpZiAoZm9ybUlkKSB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJmb3JtXCIsIGZvcm1JZCk7XG4gICAgfVxuICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHN1Ym1pdHRlci52YWx1ZTtcbiAgICBzdWJtaXR0ZXIucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaW5wdXQsIHN1Ym1pdHRlcik7XG4gICAgaW5qZWN0ZWRFbGVtZW50ID0gaW5wdXQ7XG4gIH1cblxuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgY29uc3QgdG9SZW1vdmUgPSBbXTtcblxuICBmb3JtRGF0YS5mb3JFYWNoKCh2YWwsIGtleSwgX2luZGV4KSA9PiB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgIHRvUmVtb3ZlLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsZWFudXAgYWZ0ZXIgYnVpbGRpbmcgZmlsZURhdGFcbiAgdG9SZW1vdmUuZm9yRWFjaCgoa2V5KSA9PiBmb3JtRGF0YS5kZWxldGUoa2V5KSk7XG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuXG4gIGNvbnN0IHsgaW5wdXRzVW51c2VkLCBvbmx5SGlkZGVuSW5wdXRzIH0gPSBBcnJheS5mcm9tKGZvcm0uZWxlbWVudHMpLnJlZHVjZShcbiAgICAoYWNjLCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dHNVbnVzZWQsIG9ubHlIaWRkZW5JbnB1dHMgfSA9IGFjYztcbiAgICAgIGNvbnN0IGtleSA9IGlucHV0Lm5hbWU7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5wdXRzVW51c2VkW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnB1dHNVbnVzZWRba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob25seUhpZGRlbklucHV0c1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb25seUhpZGRlbklucHV0c1trZXldID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNVc2VkID1cbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCkgfHxcbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfU1VCTUlUVEVEKTtcbiAgICAgIGNvbnN0IGlzSGlkZGVuID0gaW5wdXQudHlwZSA9PT0gXCJoaWRkZW5cIjtcbiAgICAgIGlucHV0c1VudXNlZFtrZXldID0gaW5wdXRzVW51c2VkW2tleV0gJiYgIWlzVXNlZDtcbiAgICAgIG9ubHlIaWRkZW5JbnB1dHNba2V5XSA9IG9ubHlIaWRkZW5JbnB1dHNba2V5XSAmJiBpc0hpZGRlbjtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIHsgaW5wdXRzVW51c2VkOiB7fSwgb25seUhpZGRlbklucHV0czoge30gfSxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7XG4gICAgaWYgKG9ubHlOYW1lcy5sZW5ndGggPT09IDAgfHwgb25seU5hbWVzLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICBjb25zdCBpc1VudXNlZCA9IGlucHV0c1VudXNlZFtrZXldO1xuICAgICAgY29uc3QgaGlkZGVuID0gb25seUhpZGRlbklucHV0c1trZXldO1xuICAgICAgaWYgKGlzVW51c2VkICYmICEoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lID09IGtleSkgJiYgIWhpZGRlbikge1xuICAgICAgICBwYXJhbXMuYXBwZW5kKHByZXBlbmRGb3JtRGF0YUtleShrZXksIFwiX3VudXNlZF9cIiksIFwiXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcGFyYW1zLmFwcGVuZChrZXksIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gcmVtb3ZlIHRoZSBpbmplY3RlZCBlbGVtZW50IGFnYWluXG4gIC8vIChpdCB3b3VsZCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IGRvbSBwYXRjaCBhbnl3YXksIGJ1dCB0aGlzIGlzIGNsZWFuZXIpXG4gIGlmIChzdWJtaXR0ZXIgJiYgaW5qZWN0ZWRFbGVtZW50KSB7XG4gICAgc3VibWl0dGVyLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoaW5qZWN0ZWRFbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXMudG9TdHJpbmcoKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuICBzdGF0aWMgY2xvc2VzdFZpZXcoZWwpIHtcbiAgICBjb25zdCBsaXZlVmlld0VsID0gZWwuY2xvc2VzdChQSFhfVklFV19TRUxFQ1RPUik7XG4gICAgcmV0dXJuIGxpdmVWaWV3RWwgPyBET00ucHJpdmF0ZShsaXZlVmlld0VsLCBcInZpZXdcIikgOiBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwsIGxpdmVTb2NrZXQsIHBhcmVudFZpZXcsIGZsYXNoLCBsaXZlUmVmZXJlcikge1xuICAgIHRoaXMuaXNEZWFkID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldDtcbiAgICB0aGlzLmZsYXNoID0gZmxhc2g7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnRWaWV3O1xuICAgIHRoaXMucm9vdCA9IHBhcmVudFZpZXcgPyBwYXJlbnRWaWV3LnJvb3QgOiB0aGlzO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvcHVsbC8zNzIxXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBib3VuZCB0byBhIHZpZXdcbiAgICBjb25zdCBib3VuZFZpZXcgPSBET00ucHJpdmF0ZSh0aGlzLmVsLCBcInZpZXdcIik7XG4gICAgaWYgKGJvdW5kVmlldyAhPT0gdW5kZWZpbmVkICYmIGJvdW5kVmlldy5pc0RlYWQgIT09IHRydWUpIHtcbiAgICAgIGxvZ0Vycm9yKFxuICAgICAgICBgVGhlIERPTSBlbGVtZW50IGZvciB0aGlzIHZpZXcgaGFzIGFscmVhZHkgYmVlbiBib3VuZCB0byBhIHZpZXcuXG5cbiAgICAgICAgQW4gZWxlbWVudCBjYW4gb25seSBldmVyIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSB2aWV3IVxuICAgICAgICBQbGVhc2UgZW5zdXJlIHRoYXQgeW91IGFyZSBub3QgdHJ5aW5nIHRvIGluaXRpYWxpemUgbXVsdGlwbGUgTGl2ZVNvY2tldHMgb24gdGhlIHNhbWUgcGFnZS5cbiAgICAgICAgVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91J3JlIGFjY2lkZW50YWxseSB0cnlpbmcgdG8gcmVuZGVyIHlvdXIgcm9vdCBsYXlvdXQgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgIEVuc3VyZSB0aGF0IHRoZSB0ZW1wbGF0ZSBzZXQgb24gdGhlIExpdmVWaWV3IGlzIGRpZmZlcmVudCB0aGFuIHRoZSByb290IGxheW91dC5cbiAgICAgIGAsXG4gICAgICAgIHsgdmlldzogYm91bmRWaWV3IH0sXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGJpbmQgbXVsdGlwbGUgdmlld3MgdG8gdGhlIHNhbWUgRE9NIGVsZW1lbnQuXCIpO1xuICAgIH1cbiAgICAvLyBiaW5kIHRoZSB2aWV3IHRvIHRoZSBlbGVtZW50XG4gICAgRE9NLnB1dFByaXZhdGUodGhpcy5lbCwgXCJ2aWV3XCIsIHRoaXMpO1xuICAgIHRoaXMuaWQgPSB0aGlzLmVsLmlkO1xuICAgIHRoaXMucmVmID0gMDtcbiAgICB0aGlzLmxhc3RBY2tSZWYgPSBudWxsO1xuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgLyoqXG4gICAgICogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLmxvYWRlclRpbWVyID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0RpZmZzID0gW107XG4gICAgdGhpcy5wZW5kaW5nRm9ybXMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5yZWRpcmVjdCA9IGZhbHNlO1xuICAgIHRoaXMuaHJlZiA9IG51bGw7XG4gICAgdGhpcy5qb2luQ291bnQgPSB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmpvaW5Db3VudCAtIDEgOiAwO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzID0gMDtcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuam9pbkNhbGxiYWNrID0gZnVuY3Rpb24gKG9uRG9uZSkge1xuICAgICAgb25Eb25lICYmIG9uRG9uZSgpO1xuICAgIH07XG4gICAgdGhpcy5zdG9wQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAvLyB1c3VhbGx5LCBvbmx5IHRoZSByb290IExpdmVWaWV3IHN0b3JlcyBwZW5kaW5nXG4gICAgLy8gam9pbiBvcGVyYXRpb25zIGZvciBhbGwgY2hpbGRyZW4gKGFuZCBpdHNlbGYpLFxuICAgIC8vIGJ1dCBpbiBjYXNlIG9mIHJlam9pbnMgKGpvaW5Db3VudCA+IDEpIGVhY2ggY2hpbGRcbiAgICAvLyBzdG9yZXMgaXRzIG93biBldmVudHMgaW5zdGVhZFxuICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICB0aGlzLnZpZXdIb29rcyA9IHt9O1xuICAgIHRoaXMuZm9ybVN1Ym1pdHMgPSBbXTtcbiAgICB0aGlzLmNoaWxkcmVuID0gdGhpcy5wYXJlbnQgPyBudWxsIDoge307XG4gICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdID0ge307XG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5jaGFubmVsID0gdGhpcy5saXZlU29ja2V0LmNoYW5uZWwoYGx2OiR7dGhpcy5pZH1gLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmhyZWYgJiYgdGhpcy5leHBhbmRVUkwodGhpcy5ocmVmKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZGlyZWN0OiB0aGlzLnJlZGlyZWN0ID8gdXJsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmw6IHRoaXMucmVkaXJlY3QgPyB1bmRlZmluZWQgOiB1cmwgfHwgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXM6IHRoaXMuY29ubmVjdFBhcmFtcyhsaXZlUmVmZXJlciksXG4gICAgICAgIHNlc3Npb246IHRoaXMuZ2V0U2Vzc2lvbigpLFxuICAgICAgICBzdGF0aWM6IHRoaXMuZ2V0U3RhdGljKCksXG4gICAgICAgIGZsYXNoOiB0aGlzLmZsYXNoLFxuICAgICAgICBzdGlja3k6IHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9TVElDS1kpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLnBvcnRhbEVsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICBzZXRIcmVmKGhyZWYpIHtcbiAgICB0aGlzLmhyZWYgPSBocmVmO1xuICB9XG5cbiAgc2V0UmVkaXJlY3QoaHJlZikge1xuICAgIHRoaXMucmVkaXJlY3QgPSB0cnVlO1xuICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gIH1cblxuICBpc01haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9NQUlOKTtcbiAgfVxuXG4gIGNvbm5lY3RQYXJhbXMobGl2ZVJlZmVyZXIpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmxpdmVTb2NrZXQucGFyYW1zKHRoaXMuZWwpO1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gRE9NLmFsbChkb2N1bWVudCwgYFske3RoaXMuYmluZGluZyhQSFhfVFJBQ0tfU1RBVElDKX1dYClcbiAgICAgIC5tYXAoKG5vZGUpID0+IG5vZGUuc3JjIHx8IG5vZGUuaHJlZilcbiAgICAgIC5maWx0ZXIoKHVybCkgPT4gdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIik7XG5cbiAgICBpZiAobWFuaWZlc3QubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1zW1wiX3RyYWNrX3N0YXRpY1wiXSA9IG1hbmlmZXN0O1xuICAgIH1cbiAgICBwYXJhbXNbXCJfbW91bnRzXCJdID0gdGhpcy5qb2luQ291bnQ7XG4gICAgcGFyYW1zW1wiX21vdW50X2F0dGVtcHRzXCJdID0gdGhpcy5qb2luQXR0ZW1wdHM7XG4gICAgcGFyYW1zW1wiX2xpdmVfcmVmZXJlclwiXSA9IGxpdmVSZWZlcmVyO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzKys7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbC5jYW5QdXNoKCk7XG4gIH1cblxuICBnZXRTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gIH1cblxuICBnZXRTdGF0aWMoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQyk7XG4gICAgcmV0dXJuIHZhbCA9PT0gXCJcIiA/IG51bGwgOiB2YWw7XG4gIH1cblxuICBkZXN0cm95KGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmRlc3Ryb3lBbGxDaGlsZHJlbigpO1xuICAgIHRoaXMuZGVzdHJveVBvcnRhbEVsZW1lbnRzKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIFwidmlld1wiKTtcbiAgICBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdO1xuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnBhcmVudC5pZF1bdGhpcy5pZF07XG4gICAgfVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjb25zdCBvbkZpbmlzaGVkID0gKCkgPT4ge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95SG9vayh0aGlzLnZpZXdIb29rc1tpZF0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBET00ubWFya1BoeENoaWxkRGVzdHJveWVkKHRoaXMuZWwpO1xuXG4gICAgdGhpcy5sb2coXCJkZXN0cm95ZWRcIiwgKCkgPT4gW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdKTtcbiAgICB0aGlzLmNoYW5uZWxcbiAgICAgIC5sZWF2ZSgpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgb25GaW5pc2hlZCk7XG4gIH1cblxuICBzZXRDb250YWluZXJDbGFzc2VzKC4uLmNsYXNzZXMpIHtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICAgICAgUEhYX0xPQURJTkdfQ0xBU1MsXG4gICAgICBQSFhfRVJST1JfQ0xBU1MsXG4gICAgICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICAgICAgUEhYX1NFUlZFUl9FUlJPUl9DTEFTUyxcbiAgICApO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcbiAgfVxuXG4gIHNob3dMb2FkZXIodGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBpZiAodGltZW91dCkge1xuICAgICAgdGhpcy5sb2FkZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93TG9hZGVyKCksIHRpbWVvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMudmlld0hvb2tzKSB7XG4gICAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX2Rpc2Nvbm5lY3RlZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9MT0FESU5HX0NMQVNTKTtcbiAgICB9XG4gIH1cblxuICBleGVjQWxsKGJpbmRpbmcpIHtcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHtiaW5kaW5nfV1gLCAoZWwpID0+XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUoYmluZGluZykpLFxuICAgICk7XG4gIH1cblxuICBoaWRlTG9hZGVyKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5kaXNjb25uZWN0ZWRUaW1lcik7XG4gICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9DT05ORUNURURfQ0xBU1MpO1xuICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJjb25uZWN0ZWRcIikpO1xuICB9XG5cbiAgdHJpZ2dlclJlY29ubmVjdGVkKCkge1xuICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX3JlY29ubmVjdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgbG9nKGtpbmQsIG1zZ0NhbGxiYWNrKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LmxvZyh0aGlzLCBraW5kLCBtc2dDYWxsYmFjayk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKTtcbiAgfVxuXG4gIC8vIGNhbGxzIHRoZSBjYWxsYmFjayB3aXRoIHRoZSB2aWV3IGFuZCB0YXJnZXQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIHBoeFRhcmdldFxuICAvLyB0YXJnZXRzIGNhbiBiZTpcbiAgLy8gICogYW4gZWxlbWVudCBpdHNlbGYsIHRoZW4gaXQgaXMgc2ltcGx5IHBhc3NlZCB0byBsaXZlU29ja2V0Lm93bmVyO1xuICAvLyAgKiBhIENJRCAoQ29tcG9uZW50IElEKSwgdGhlbiB3ZSBmaXJzdCBzZWFyY2ggdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQgaW4gdGhlIERPTVxuICAvLyAgKiBhIHNlbGVjdG9yLCB0aGVuIHdlIHNlYXJjaCB0aGUgc2VsZWN0b3IgaW4gdGhlIERPTSBhbmQgY2FsbCB0aGUgY2FsbGJhY2tcbiAgLy8gICAgZm9yIGVhY2ggZWxlbWVudCBmb3VuZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG93bmVyIHZpZXdcbiAgd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20gPSBkb2N1bWVudCkge1xuICAgIC8vIGluIHRoZSBmb3JtIHJlY292ZXJ5IGNhc2Ugd2Ugc2VhcmNoIGluIGEgdGVtcGxhdGUgZnJhZ21lbnQgaW5zdGVhZCBvZlxuICAgIC8vIHRoZSByZWFsIGRvbSwgdGhlcmVmb3JlIHdlIG9wdGlvbmFsbHkgcGFzcyBkb20gYW5kIHZpZXdFbFxuXG4gICAgaWYgKHBoeFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHBoeFRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQub3duZXIocGh4VGFyZ2V0LCAodmlldykgPT5cbiAgICAgICAgY2FsbGJhY2sodmlldywgcGh4VGFyZ2V0KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ2lkKHBoeFRhcmdldCkpIHtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuaWQsIHBoeFRhcmdldCwgZG9tKTtcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsb2dFcnJvcihgbm8gY29tcG9uZW50IGZvdW5kIG1hdGNoaW5nIHBoeC10YXJnZXQgb2YgJHtwaHhUYXJnZXR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayh0aGlzLCBwYXJzZUludChwaHhUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IEFycmF5LmZyb20oZG9tLnF1ZXJ5U2VsZWN0b3JBbGwocGh4VGFyZ2V0KSk7XG4gICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgYG5vdGhpbmcgZm91bmQgbWF0Y2hpbmcgdGhlIHBoeC10YXJnZXQgc2VsZWN0b3IgXCIke3BoeFRhcmdldH1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT5cbiAgICAgICAgdGhpcy5saXZlU29ja2V0Lm93bmVyKHRhcmdldCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIHRhcmdldCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhcHBseURpZmYodHlwZSwgcmF3RGlmZiwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmxvZyh0eXBlLCAoKSA9PiBbXCJcIiwgY2xvbmUocmF3RGlmZildKTtcbiAgICBjb25zdCB7IGRpZmYsIHJlcGx5LCBldmVudHMsIHRpdGxlIH0gPSBSZW5kZXJlZC5leHRyYWN0KHJhd0RpZmYpO1xuICAgIGNhbGxiYWNrKHsgZGlmZiwgcmVwbHksIGV2ZW50cyB9KTtcbiAgICBpZiAodHlwZW9mIHRpdGxlID09PSBcInN0cmluZ1wiIHx8ICh0eXBlID09IFwibW91bnRcIiAmJiB0aGlzLmlzTWFpbigpKSkge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBET00ucHV0VGl0bGUodGl0bGUpKTtcbiAgICB9XG4gIH1cblxuICBvbkpvaW4ocmVzcCkge1xuICAgIGNvbnN0IHsgcmVuZGVyZWQsIGNvbnRhaW5lciwgbGl2ZXZpZXdfdmVyc2lvbiwgcGlkIH0gPSByZXNwO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IFt0YWcsIGF0dHJzXSA9IGNvbnRhaW5lcjtcbiAgICAgIHRoaXMuZWwgPSBET00ucmVwbGFjZVJvb3RDb250YWluZXIodGhpcy5lbCwgdGFnLCBhdHRycyk7XG4gICAgfVxuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgdGhpcy5qb2luUGVuZGluZyA9IHRydWU7XG4gICAgdGhpcy5mbGFzaCA9IG51bGw7XG4gICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0gdGhpcy5nZXRGb3Jtc0ZvclJlY292ZXJ5KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTWFpbigpICYmIHdpbmRvdy5oaXN0b3J5LnN0YXRlID09PSBudWxsKSB7XG4gICAgICAvLyBzZXQgaW5pdGlhbCBoaXN0b3J5IGVudHJ5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhZ2UgbG9hZCAobm8gaGlzdG9yeSlcbiAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFwicmVwbGFjZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLmxpdmVTb2NrZXQuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChsaXZldmlld192ZXJzaW9uICE9PSB0aGlzLmxpdmVTb2NrZXQudmVyc2lvbigpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTGl2ZVZpZXcgYXNzZXQgdmVyc2lvbiBtaXNtYXRjaC4gSmF2YVNjcmlwdCB2ZXJzaW9uICR7dGhpcy5saXZlU29ja2V0LnZlcnNpb24oKX0gdnMuIHNlcnZlciAke2xpdmV2aWV3X3ZlcnNpb259LiBUbyBhdm9pZCBpc3N1ZXMsIHBsZWFzZSBlbnN1cmUgdGhhdCB5b3VyIGFzc2V0cyB1c2UgdGhlIHNhbWUgdmVyc2lvbiBhcyB0aGUgc2VydmVyLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRoZSBwaWQgaXMgb25seSBzZW50IGlmXG4gICAgLy9cbiAgICAvLyAgICBjb25maWcgOnBob2VuaXhfbGl2ZV92aWV3LCA6ZGVidWdfYXR0cmlidXRlc1xuICAgIC8vXG4gICAgLy8gaWYgc2V0IHRvIHRydWUuIEl0IGlzIHRvIGhlbHAgZGVidWdnaW5nIGluIGRldmVsb3BtZW50LlxuICAgIGlmIChwaWQpIHtcbiAgICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFBIWF9MVl9QSUQsIHBpZCk7XG4gICAgfVxuXG4gICAgQnJvd3Nlci5kcm9wTG9jYWwoXG4gICAgICB0aGlzLmxpdmVTb2NrZXQubG9jYWxTdG9yYWdlLFxuICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgICApO1xuICAgIHRoaXMuYXBwbHlEaWZmKFwibW91bnRcIiwgcmVuZGVyZWQsICh7IGRpZmYsIGV2ZW50cyB9KSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gbmV3IFJlbmRlcmVkKHRoaXMuaWQsIGRpZmYpO1xuICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIobnVsbCwgXCJqb2luXCIpO1xuICAgICAgdGhpcy5kcm9wUGVuZGluZ1JlZnMoKTtcbiAgICAgIHRoaXMuam9pbkNvdW50Kys7XG4gICAgICB0aGlzLmpvaW5BdHRlbXB0cyA9IDA7XG5cbiAgICAgIHRoaXMubWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uSm9pbkNvbXBsZXRlKHJlc3AsIGh0bWwsIHN0cmVhbXMsIGV2ZW50cyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3BQZW5kaW5nUmVmcygpIHtcbiAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7UEhYX1JFRl9TUkN9PVwiJHt0aGlzLnJlZlNyYygpfVwiXWAsIChlbCkgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpO1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5Db21wbGV0ZSh7IGxpdmVfcGF0Y2ggfSwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gcHJvdmlkZSBhIGJldHRlciBleHBlcmllbmNlLCB3ZSB3YW50IHRvIGpvaW5cbiAgICAvLyBhbGwgTGl2ZVZpZXdzIGZpcnN0IGFuZCBvbmx5IHRoZW4gYXBwbHkgdGhlaXIgcGF0Y2hlcy5cbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxIHx8ICh0aGlzLnBhcmVudCAmJiAhdGhpcy5wYXJlbnQuaXNKb2luUGVuZGluZygpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKTtcbiAgICB9XG5cbiAgICAvLyBPbmUgZG93bnNpZGUgb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IHdlIG5lZWQgdG8gZmluZCBwaHhDaGlsZHJlblxuICAgIC8vIGluIHRoZSBodG1sIGZyYWdtZW50LCBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBET00uIFRoZSBmcmFnbWVudFxuICAgIC8vIGFsc28gZG9lcyBub3QgaW5jbHVkZSBQSFhfU1RBVElDLCBzbyB3ZSBuZWVkIHRvIGNvcHkgaXQgb3ZlciBmcm9tXG4gICAgLy8gdGhlIERPTS5cbiAgICBjb25zdCBuZXdDaGlsZHJlbiA9IERPTS5maW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50KGh0bWwsIHRoaXMuaWQpLmZpbHRlcihcbiAgICAgICh0b0VsKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyb21FbCA9IHRvRWwuaWQgJiYgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke3RvRWwuaWR9XCJdYCk7XG4gICAgICAgIGNvbnN0IHBoeFN0YXRpYyA9IGZyb21FbCAmJiBmcm9tRWwuZ2V0QXR0cmlidXRlKFBIWF9TVEFUSUMpO1xuICAgICAgICBpZiAocGh4U3RhdGljKSB7XG4gICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgcGh4U3RhdGljKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgUEhYX1JPT1RfSUQgdG8gcHJldmVudCBldmVudHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRvIHRoZSByb290IHZpZXdcbiAgICAgICAgLy8gd2hpbGUgdGhlIGNoaWxkIGpvaW4gaXMgc3RpbGwgcGVuZGluZ1xuICAgICAgICBpZiAoZnJvbUVsKSB7XG4gICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCwgdGhpcy5yb290LmlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5qb2luQ2hpbGQodG9FbCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAobmV3Q2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW1xuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKCkgPT4gdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5wYXJlbnQuYWNrSm9pbih0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3QucGVuZGluZ0pvaW5PcHMucHVzaChbXG4gICAgICAgIHRoaXMsXG4gICAgICAgICgpID0+IHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIGF0dGFjaFRydWVEb2NFbCgpIHtcbiAgICB0aGlzLmVsID0gRE9NLmJ5SWQodGhpcy5pZCk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gIH1cblxuICAvLyB0aGlzIGlzIGludm9rZWQgZm9yIGRlYWQgYW5kIGxpdmUgdmlld3MsIHNvIHdlIG11c3QgZmlsdGVyIGJ5XG4gIC8vIGJ5IG93bmVyIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgZHVwbGljYXRpbmcgaG9va3MgYWNyb3NzIGRpc2Nvbm5lY3RcbiAgLy8gYW5kIGNvbm5lY3RlZCBzdGF0ZXMuIFRoaXMgYWxzbyBoYW5kbGVzIGNhc2VzIHdoZXJlIGhvb2tzIGV4aXN0XG4gIC8vIGluIGEgcm9vdCBsYXlvdXQgd2l0aCBhIExWIGluIHRoZSBib2R5XG4gIGV4ZWNOZXdNb3VudGVkKHBhcmVudCA9IGRvY3VtZW50KSB7XG4gICAgbGV0IHBoeFZpZXdwb3J0VG9wID0gdGhpcy5iaW5kaW5nKFBIWF9WSUVXUE9SVF9UT1ApO1xuICAgIGxldCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICB0aGlzLmFsbChcbiAgICAgIHBhcmVudCxcbiAgICAgIGBbJHtwaHhWaWV3cG9ydFRvcH1dLCBbJHtwaHhWaWV3cG9ydEJvdHRvbX1dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKFxuICAgICAgICAgIGhvb2tFbCxcbiAgICAgICAgICBob29rRWwsXG4gICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgcGh4Vmlld3BvcnRCb3R0b20sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWF5YmVBZGROZXdIb29rKGhvb2tFbCk7XG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5hbGwoXG4gICAgICBwYXJlbnQsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFBIWF9IT09LKX1dLCBbZGF0YS1waHgtJHtQSFhfSE9PS31dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgdGhpcy5tYXliZUFkZE5ld0hvb2soaG9va0VsKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHt0aGlzLmJpbmRpbmcoUEhYX01PVU5URUQpfV1gLCAoZWwpID0+IHtcbiAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFsbChwYXJlbnQsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGVsKSA9PiB7XG4gICAgICBpZiAodGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgICAgY2FsbGJhY2soZWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gaW4gY2FzZSBvZiByZWpvaW5zLCB3ZSBuZWVkIHRvIG1hbnVhbGx5IHBlcmZvcm0gYWxsXG4gICAgLy8gcGVuZGluZyBvcHNcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nSm9pbk9wcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChjYikgPT4gdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIgJiYgY2IoKSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hdHRhY2hUcnVlRG9jRWwoKTtcbiAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBzdHJlYW1zLCBudWxsKTtcbiAgICBwYXRjaC5tYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpO1xuICAgIHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCBmYWxzZSwgdHJ1ZSk7XG4gICAgdGhpcy5qb2luTmV3Q2hpbGRyZW4oKTtcbiAgICB0aGlzLmV4ZWNOZXdNb3VudGVkKCk7XG5cbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgdGhpcy5hcHBseVBlbmRpbmdVcGRhdGVzKCk7XG5cbiAgICBpZiAobGl2ZV9wYXRjaCkge1xuICAgICAgY29uc3QgeyBraW5kLCB0byB9ID0gbGl2ZV9wYXRjaDtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpO1xuICAgIH1cbiAgICB0aGlzLmhpZGVMb2FkZXIoKTtcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICB0aGlzLnRyaWdnZXJSZWNvbm5lY3RlZCgpO1xuICAgIH1cbiAgICB0aGlzLnN0b3BDYWxsYmFjaygpO1xuICB9XG5cbiAgdHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbkJlZm9yZUVsVXBkYXRlZFwiLCBbZnJvbUVsLCB0b0VsXSk7XG4gICAgY29uc3QgaG9vayA9IHRoaXMuZ2V0SG9vayhmcm9tRWwpO1xuICAgIGNvbnN0IGlzSWdub3JlZCA9IGhvb2sgJiYgRE9NLmlzSWdub3JlZChmcm9tRWwsIHRoaXMuYmluZGluZyhQSFhfVVBEQVRFKSk7XG4gICAgaWYgKFxuICAgICAgaG9vayAmJlxuICAgICAgIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKSAmJlxuICAgICAgIShpc0lnbm9yZWQgJiYgaXNFcXVhbE9iaihmcm9tRWwuZGF0YXNldCwgdG9FbC5kYXRhc2V0KSlcbiAgICApIHtcbiAgICAgIGhvb2suX19iZWZvcmVVcGRhdGUoKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH1cbiAgfVxuXG4gIG1heWJlTW91bnRlZChlbCkge1xuICAgIGNvbnN0IHBoeE1vdW50ZWQgPSBlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9NT1VOVEVEKSk7XG4gICAgY29uc3QgaGFzQmVlbkludm9rZWQgPSBwaHhNb3VudGVkICYmIERPTS5wcml2YXRlKGVsLCBcIm1vdW50ZWRcIik7XG4gICAgaWYgKHBoeE1vdW50ZWQgJiYgIWhhc0JlZW5JbnZva2VkKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBwaHhNb3VudGVkKTtcbiAgICAgIERPTS5wdXRQcml2YXRlKGVsLCBcIm1vdW50ZWRcIiwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWF5YmVBZGROZXdIb29rKGVsKSB7XG4gICAgY29uc3QgbmV3SG9vayA9IHRoaXMuYWRkSG9vayhlbCk7XG4gICAgaWYgKG5ld0hvb2spIHtcbiAgICAgIG5ld0hvb2suX19tb3VudGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcGVyZm9ybVBhdGNoKHBhdGNoLCBwcnVuZUNpZHMsIGlzSm9pblBhdGNoID0gZmFsc2UpIHtcbiAgICBjb25zdCByZW1vdmVkRWxzID0gW107XG4gICAgbGV0IHBoeENoaWxkcmVuQWRkZWQgPSBmYWxzZTtcbiAgICBjb25zdCB1cGRhdGVkSG9va0lkcyA9IG5ldyBTZXQoKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaFN0YXJ0XCIsIFtwYXRjaC50YXJnZXRDb250YWluZXJdKTtcblxuICAgIHBhdGNoLmFmdGVyKFwiYWRkZWRcIiwgKGVsKSA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudHJpZ2dlckRPTShcIm9uTm9kZUFkZGVkXCIsIFtlbF0pO1xuICAgICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSB0aGlzLmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgICBjb25zdCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICAgIERPTS5tYWludGFpblByaXZhdGVIb29rcyhlbCwgZWwsIHBoeFZpZXdwb3J0VG9wLCBwaHhWaWV3cG9ydEJvdHRvbSk7XG4gICAgICB0aGlzLm1heWJlQWRkTmV3SG9vayhlbCk7XG4gICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKSB7XG4gICAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmFmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCAoZWwpID0+IHtcbiAgICAgIGlmIChET00uaXNQaHhTdGlja3koZWwpKSB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5qb2luUm9vdFZpZXdzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmJlZm9yZShcInVwZGF0ZWRcIiwgKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IHRoaXMudHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKTtcbiAgICAgIGlmIChob29rKSB7XG4gICAgICAgIHVwZGF0ZWRIb29rSWRzLmFkZChmcm9tRWwuaWQpO1xuICAgICAgfVxuICAgICAgLy8gdHJpZ2dlciBKUyBzcGVjaWZpYyB1cGRhdGUgbG9naWMgKGZvciBleGFtcGxlIGZvciBKUy5pZ25vcmVfYXR0cmlidXRlcylcbiAgICAgIEpTLm9uQmVmb3JlRWxVcGRhdGVkKGZyb21FbCwgdG9FbCk7XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInVwZGF0ZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAodXBkYXRlZEhvb2tJZHMuaGFzKGVsLmlkKSkge1xuICAgICAgICB0aGlzLmdldEhvb2soZWwpLl9fdXBkYXRlZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcGF0Y2guYWZ0ZXIoXCJkaXNjYXJkZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAoZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHJlbW92ZWRFbHMucHVzaChlbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInRyYW5zaXRpb25zRGlzY2FyZGVkXCIsIChlbHMpID0+XG4gICAgICB0aGlzLmFmdGVyRWxlbWVudHNSZW1vdmVkKGVscywgcHJ1bmVDaWRzKSxcbiAgICApO1xuICAgIHBhdGNoLnBlcmZvcm0oaXNKb2luUGF0Y2gpO1xuICAgIHRoaXMuYWZ0ZXJFbGVtZW50c1JlbW92ZWQocmVtb3ZlZEVscywgcHJ1bmVDaWRzKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaEVuZFwiLCBbcGF0Y2gudGFyZ2V0Q29udGFpbmVyXSk7XG4gICAgcmV0dXJuIHBoeENoaWxkcmVuQWRkZWQ7XG4gIH1cblxuICBhZnRlckVsZW1lbnRzUmVtb3ZlZChlbGVtZW50cywgcHJ1bmVDaWRzKSB7XG4gICAgY29uc3QgZGVzdHJveWVkQ0lEcyA9IFtdO1xuICAgIGVsZW1lbnRzLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50cyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3RoaXMuaWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBob29rcyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske3RoaXMuYmluZGluZyhQSFhfSE9PSyl9XSwgW2RhdGEtcGh4LWhvb2tdYCxcbiAgICAgICk7XG4gICAgICBjb21wb25lbnRzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMuY29tcG9uZW50SUQoZWwpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDaWQoY2lkKSAmJlxuICAgICAgICAgIGRlc3Ryb3llZENJRHMuaW5kZXhPZihjaWQpID09PSAtMSAmJlxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfVklFV19SRUYpID09PSB0aGlzLmlkXG4gICAgICAgICkge1xuICAgICAgICAgIGRlc3Ryb3llZENJRHMucHVzaChjaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhvb2tzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGhvb2tFbCkgPT4ge1xuICAgICAgICBjb25zdCBob29rID0gdGhpcy5nZXRIb29rKGhvb2tFbCk7XG4gICAgICAgIGhvb2sgJiYgdGhpcy5kZXN0cm95SG9vayhob29rKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIFdlIHNob3VsZCBub3QgcHJ1bmVDaWRzIG9uIGpvaW5zLiBPdGhlcndpc2UsIGluIGNhc2Ugb2ZcbiAgICAvLyByZWpvaW5zLCB3ZSBtYXkgbm90aWZ5IGNpZHMgdGhhdCBubyBsb25nZXIgYmVsb25nIHRvIHRoZVxuICAgIC8vIGN1cnJlbnQgTGl2ZVZpZXcgdG8gYmUgcmVtb3ZlZC5cbiAgICBpZiAocHJ1bmVDaWRzKSB7XG4gICAgICB0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcyk7XG4gICAgfVxuICB9XG5cbiAgam9pbk5ld0NoaWxkcmVuKCkge1xuICAgIERPTS5maW5kUGh4Q2hpbGRyZW4oZG9jdW1lbnQsIHRoaXMuaWQpLmZvckVhY2goKGVsKSA9PiB0aGlzLmpvaW5DaGlsZChlbCkpO1xuICB9XG5cbiAgbWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwaHhDaGFuZ2UgPSB0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIik7XG4gICAgY29uc3Qgb2xkRm9ybXMgPSB0aGlzLnJvb3QuZm9ybXNGb3JSZWNvdmVyeTtcbiAgICAvLyBTbyB3aHkgZG8gd2UgY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBoZXJlP1xuICAgIC8vIE9uZSB3YXkgdG8gcmVjb3ZlciBmb3JtcyB3b3VsZCBiZSB0byBpbW1lZGlhdGVseSBhcHBseSB0aGUgbW91bnRcbiAgICAvLyBwYXRjaCBhbmQgdGhlbiBhZnRlcndhcmRzIHJlY292ZXIgdGhlIGZvcm1zLiBIb3dldmVyLCB0aGlzIHdvdWxkXG4gICAgLy8gY2F1c2UgYSBmbGlja2VyLCBiZWNhdXNlIHRoZSBtb3VudCBwYXRjaCB3b3VsZCByZW1vdmUgdGhlIGZvcm0gY29udGVudFxuICAgIC8vIHVudGlsIGl0IGlzIHJlc3RvcmVkLiBUaGVyZWZvcmUgTFYgZGVjaWRlZCB0byBkbyBmb3JtIHJlY292ZXJ5IHdpdGggdGhlXG4gICAgLy8gcmF3IEhUTUwgYmVmb3JlIGl0IGlzIGFwcGxpZWQgYW5kIGRlbGF5IHRoZSBtb3VudCBwYXRjaCB1bnRpbCB0aGUgZm9ybVxuICAgIC8vIHJlY292ZXJ5IGV2ZW50cyBhcmUgZG9uZS5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIDwucG9ydGFsPiBoZXJlIGFuZCB0ZWxlcG9ydCBpdCBpbnRvIG91ciB0ZW1wb3JhcnkgRE9NIGZvciByZWNvdmVyeVxuICAgIC8vIGFzIHdlJ2Qgb3RoZXJ3aXNlIG5vdCBmaW5kIHRlbGVwb3J0ZWQgZm9ybXNcbiAgICBET00uYWxsKHRlbXBsYXRlLmNvbnRlbnQsIGBbJHtQSFhfUE9SVEFMfV1gKS5mb3JFYWNoKChwb3J0YWxUZW1wbGF0ZSkgPT4ge1xuICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZC5hcHBlbmRDaGlsZChcbiAgICAgICAgcG9ydGFsVGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBiZWNhdXNlIHdlIHdvcmsgd2l0aCBhIHRlbXBsYXRlIGVsZW1lbnQsIHdlIG11c3QgbWFudWFsbHkgY29weSB0aGUgYXR0cmlidXRlc1xuICAgIC8vIG90aGVyd2lzZSB0aGUgb3duZXIgLyB0YXJnZXQgaGVscGVycyBkb24ndCB3b3JrIHByb3Blcmx5XG4gICAgY29uc3Qgcm9vdEVsID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICByb290RWwuaWQgPSB0aGlzLmlkO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfU0VTU0lPTiwgdGhpcy5nZXRTZXNzaW9uKCkpO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgdGhpcy5nZXRTdGF0aWMoKSk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lELCB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmlkIDogbnVsbCk7XG5cbiAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtIGVsZW1lbnRzIGluIHRoZSBuZXcgSFRNTCBmb3IgdGhlIExWXG4gICAgLy8gYW5kIGxvb2sgZm9yIG9sZCBmb3JtcyBpbiB0aGUgYGZvcm1zRm9yUmVjb3ZlcnlgIG9iamVjdDtcbiAgICAvLyB0aGUgZm9ybXNGb3JSZWNvdmVyeSBjYW4gYWxzbyBjb250YWluIGZvcm1zIGZyb20gY2hpbGQgdmlld3NcbiAgICBjb25zdCBmb3Jtc1RvUmVjb3ZlciA9XG4gICAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtcyBpbiB0aGUgbmV3IERPTTsgYmVjYXVzZSB0aGlzIGlzIG9ubHkgdGhlIEhUTUwgZm9yIHRoZSBjdXJyZW50XG4gICAgICAvLyB2aWV3LCB3ZSBjYW4gYmUgc3VyZSB0aGF0IGFsbCBmb3JtcyBhcmUgb3duZWQgYnkgdGhpcyB2aWV3OlxuICAgICAgRE9NLmFsbCh0ZW1wbGF0ZS5jb250ZW50LCBcImZvcm1cIilcbiAgICAgICAgLy8gb25seSByZWNvdmVyIGZvcm1zIHRoYXQgaGF2ZSBhbiBpZCBhbmQgYXJlIGluIHRoZSBvbGQgRE9NXG4gICAgICAgIC5maWx0ZXIoKG5ld0Zvcm0pID0+IG5ld0Zvcm0uaWQgJiYgb2xkRm9ybXNbbmV3Rm9ybS5pZF0pXG4gICAgICAgIC8vIGFiYW5kb24gZm9ybXMgd2UgYWxyZWFkeSB0cmllZCB0byByZWNvdmVyIHRvIHByZXZlbnQgbG9vcGluZyBhIGZhaWxlZCBzdGF0ZVxuICAgICAgICAuZmlsdGVyKChuZXdGb3JtKSA9PiAhdGhpcy5wZW5kaW5nRm9ybXMuaGFzKG5ld0Zvcm0uaWQpKVxuICAgICAgICAvLyBvbmx5IHJlY292ZXIgaWYgdGhlIGZvcm0gaGFzIHRoZSBzYW1lIHBoeC1jaGFuZ2UgdmFsdWVcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAobmV3Rm9ybSkgPT5cbiAgICAgICAgICAgIG9sZEZvcm1zW25ld0Zvcm0uaWRdLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpID09PVxuICAgICAgICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChuZXdGb3JtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtvbGRGb3Jtc1tuZXdGb3JtLmlkXSwgbmV3Rm9ybV07XG4gICAgICAgIH0pO1xuXG4gICAgaWYgKGZvcm1zVG9SZWNvdmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZm9ybXNUb1JlY292ZXIuZm9yRWFjaCgoW29sZEZvcm0sIG5ld0Zvcm1dLCBpKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdGb3Jtcy5hZGQobmV3Rm9ybS5pZCk7XG4gICAgICAvLyBpdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBmaXJzdEVsZW1lbnRDaGlsZCBvZiB0aGUgdGVtcGxhdGUgY29udGVudFxuICAgICAgLy8gYmVjYXVzZSB3aGVuIHRyYXZlcnNpbmcgYSBkb2N1bWVudEZyYWdtZW50IHVzaW5nIHBhcmVudE5vZGUsIHdlIHdvbid0IGV2ZXIgYXJyaXZlIGF0XG4gICAgICAvLyB0aGUgZnJhZ21lbnQ7IGFzIHRoZSB0ZW1wbGF0ZSBpcyBhbHdheXMgYSBMaXZlVmlldywgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5XG4gICAgICAvLyBvbmUgY2hpbGQgb24gdGhlIHJvb3QgbGV2ZWxcbiAgICAgIHRoaXMucHVzaEZvcm1SZWNvdmVyeShcbiAgICAgICAgb2xkRm9ybSxcbiAgICAgICAgbmV3Rm9ybSxcbiAgICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0Zvcm1zLmRlbGV0ZShuZXdGb3JtLmlkKTtcbiAgICAgICAgICAvLyB3ZSBvbmx5IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgYWxsIGZvcm1zIGhhdmUgYmVlbiByZWNvdmVyZWRcbiAgICAgICAgICBpZiAoaSA9PT0gZm9ybXNUb1JlY292ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2hpbGRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVtpZF07XG4gIH1cblxuICBnZXREZXNjZW5kZW50QnlFbChlbCkge1xuICAgIGlmIChlbC5pZCA9PT0gdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2VsLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKV0/LltlbC5pZF07XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveURlc2NlbmRlbnQoaWQpIHtcbiAgICBmb3IgKGNvbnN0IHBhcmVudElkIGluIHRoaXMucm9vdC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZElkIGluIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF0pIHtcbiAgICAgICAgaWYgKGNoaWxkSWQgPT09IGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF1bY2hpbGRJZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgam9pbkNoaWxkKGVsKSB7XG4gICAgY29uc3QgY2hpbGQgPSB0aGlzLmdldENoaWxkQnlJZChlbC5pZCk7XG4gICAgaWYgKCFjaGlsZCkge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLmxpdmVTb2NrZXQsIHRoaXMpO1xuICAgICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW3ZpZXcuaWRdID0gdmlldztcbiAgICAgIHZpZXcuam9pbigpO1xuICAgICAgdGhpcy5jaGlsZEpvaW5zKys7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpc0pvaW5QZW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmpvaW5QZW5kaW5nO1xuICB9XG5cbiAgYWNrSm9pbihfY2hpbGQpIHtcbiAgICB0aGlzLmNoaWxkSm9pbnMtLTtcblxuICAgIGlmICh0aGlzLmNoaWxkSm9pbnMgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKCkge1xuICAgIC8vIHdlIGNhbiBjbGVhciBwZW5kaW5nIGZvcm0gcmVjb3ZlcmllcyBub3cgdGhhdCB3ZSd2ZSBqb2luZWQuXG4gICAgLy8gVGhleSBlaXRoZXIgYWxsIHJlc29sdmVkIG9yIHdlcmUgYWJhbmRvbmVkXG4gICAgdGhpcy5wZW5kaW5nRm9ybXMuY2xlYXIoKTtcbiAgICAvLyB3ZSBjYW4gYWxzbyBjbGVhciB0aGUgZm9ybXNGb3JSZWNvdmVyeSBvYmplY3QgdG8gbm90IGtlZXAgb2xkIGZvcm0gZWxlbWVudHMgYXJvdW5kXG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5qb2luQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChbdmlldywgb3BdKSA9PiB7XG4gICAgICAgIGlmICghdmlldy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICAgb3AoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gW107XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGUoZGlmZiwgZXZlbnRzLCBpc1BlbmRpbmcgPSBmYWxzZSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNKb2luUGVuZGluZygpIHx8XG4gICAgICAodGhpcy5saXZlU29ja2V0Lmhhc1BlbmRpbmdMaW5rKCkgJiYgdGhpcy5yb290LmlzTWFpbigpKVxuICAgICkge1xuICAgICAgLy8gZG9uJ3QgbXV0YXRlIGlmIHRoaXMgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZGlmZlxuICAgICAgaWYgKCFpc1BlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaCh7IGRpZmYsIGV2ZW50cyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVkLm1lcmdlRGlmZihkaWZmKTtcbiAgICBsZXQgcGh4Q2hpbGRyZW5BZGRlZCA9IGZhbHNlO1xuXG4gICAgLy8gV2hlbiB0aGUgZGlmZiBvbmx5IGNvbnRhaW5zIGNvbXBvbmVudCBkaWZmcywgdGhlbiB3YWxrIGNvbXBvbmVudHNcbiAgICAvLyBhbmQgcGF0Y2ggb25seSB0aGUgcGFyZW50IGNvbXBvbmVudCBjb250YWluZXJzIGZvdW5kIGluIHRoZSBkaWZmLlxuICAgIC8vIE90aGVyd2lzZSwgcGF0Y2ggZW50aXJlIExWIGNvbnRhaW5lci5cbiAgICBpZiAodGhpcy5yZW5kZXJlZC5pc0NvbXBvbmVudE9ubHlEaWZmKGRpZmYpKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudGltZShcImNvbXBvbmVudCBwYXRjaCBjb21wbGV0ZVwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudENpZHMgPSBET00uZmluZEV4aXN0aW5nUGFyZW50Q0lEcyhcbiAgICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgIHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSxcbiAgICAgICAgKTtcbiAgICAgICAgcGFyZW50Q2lkcy5mb3JFYWNoKChwYXJlbnRDSUQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFBhdGNoKFxuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLmdldENvbXBvbmVudChkaWZmLCBwYXJlbnRDSUQpLFxuICAgICAgICAgICAgICBwYXJlbnRDSUQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaXNFbXB0eShkaWZmKSkge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnRpbWUoXCJmdWxsIHBhdGNoIGNvbXBsZXRlXCIsICgpID0+IHtcbiAgICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIoZGlmZiwgXCJ1cGRhdGVcIik7XG4gICAgICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIG51bGwpO1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgaWYgKHBoeENoaWxkcmVuQWRkZWQpIHtcbiAgICAgIHRoaXMuam9pbk5ld0NoaWxkcmVuKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZW5kZXJDb250YWluZXIoZGlmZiwga2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQudGltZShgdG9TdHJpbmcgZGlmZiAoJHtraW5kfSlgLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWcgPSB0aGlzLmVsLnRhZ05hbWU7XG4gICAgICAvLyBEb24ndCBza2lwIGFueSBjb21wb25lbnQgaW4gdGhlIGRpZmYgbm9yIGFueSBtYXJrZWQgYXMgcHJ1bmVkXG4gICAgICAvLyAoYXMgdGhleSBtYXkgaGF2ZSBiZWVuIGFkZGVkIGJhY2spXG4gICAgICBjb25zdCBjaWRzID0gZGlmZiA/IHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSA6IG51bGw7XG4gICAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC50b1N0cmluZyhjaWRzKTtcbiAgICAgIHJldHVybiBbYDwke3RhZ30+JHtodG1sfTwvJHt0YWd9PmAsIHN0cmVhbXNdO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50UGF0Y2goZGlmZiwgY2lkKSB7XG4gICAgaWYgKGlzRW1wdHkoZGlmZikpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC5jb21wb25lbnRUb1N0cmluZyhjaWQpO1xuICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIGNpZCk7XG4gICAgY29uc3QgY2hpbGRyZW5BZGRlZCA9IHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCB0cnVlKTtcbiAgICByZXR1cm4gY2hpbGRyZW5BZGRlZDtcbiAgfVxuXG4gIGdldEhvb2soZWwpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGVsKV07XG4gIH1cblxuICBhZGRIb29rKGVsKSB7XG4gICAgY29uc3QgaG9va0VsSWQgPSBWaWV3SG9vay5lbGVtZW50SUQoZWwpO1xuXG4gICAgLy8gb25seSBldmVyIHRyeSB0byBhZGQgaG9va3MgdG8gZWxlbWVudHMgb3duZWQgYnkgdGhpcyB2aWV3XG4gICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiAhdGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaG9va0VsSWQgJiYgIXRoaXMudmlld0hvb2tzW2hvb2tFbElkXSkge1xuICAgICAgLy8gaG9vayBjcmVhdGVkLCBidXQgbm90IGF0dGFjaGVkIChjcmVhdGVIb29rIGZvciB3ZWIgY29tcG9uZW50KVxuICAgICAgY29uc3QgaG9vayA9XG4gICAgICAgIERPTS5nZXRDdXN0b21FbEhvb2soZWwpIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyBob29rIGZvdW5kIGZvciBjdXN0b20gZWxlbWVudDogJHtlbC5pZH1gKTtcbiAgICAgIHRoaXMudmlld0hvb2tzW2hvb2tFbElkXSA9IGhvb2s7XG4gICAgICBob29rLl9fYXR0YWNoVmlldyh0aGlzKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH0gZWxzZSBpZiAoaG9va0VsSWQgfHwgIWVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgLy8gbm8gaG9vayBmb3VuZFxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBuZXcgaG9vayBmb3VuZCB3aXRoIHBoeC1ob29rIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgaG9va05hbWUgPVxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoYGRhdGEtcGh4LSR7UEhYX0hPT0t9YCkgfHxcbiAgICAgICAgZWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfSE9PSykpO1xuXG4gICAgICBpZiAoIWhvb2tOYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaG9va0RlZmluaXRpb24gPSB0aGlzLmxpdmVTb2NrZXQuZ2V0SG9va0RlZmluaXRpb24oaG9va05hbWUpO1xuXG4gICAgICBpZiAoaG9va0RlZmluaXRpb24pIHtcbiAgICAgICAgaWYgKCFlbC5pZCkge1xuICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgYG5vIERPTSBJRCBmb3IgaG9vayBcIiR7aG9va05hbWV9XCIuIEhvb2tzIHJlcXVpcmUgYSB1bmlxdWUgSUQgb24gZWFjaCBlbGVtZW50LmAsXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBob29rSW5zdGFuY2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGhvb2tEZWZpbml0aW9uID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIGhvb2tEZWZpbml0aW9uLnByb3RvdHlwZSBpbnN0YW5jZW9mIFZpZXdIb29rXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJdCdzIGEgY2xhc3MgY29uc3RydWN0b3IgKHN1YmNsYXNzIG9mIFZpZXdIb29rKVxuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IGhvb2tEZWZpbml0aW9uKHRoaXMsIGVsKTsgLy8gYHRoaXNgIGlzIHRoZSBWaWV3IGluc3RhbmNlXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBob29rRGVmaW5pdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaG9va0RlZmluaXRpb24gIT09IG51bGxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIEl0J3MgYW4gb2JqZWN0IGxpdGVyYWwsIHBhc3MgaXQgdG8gdGhlIFZpZXdIb29rIGNvbnN0cnVjdG9yIGZvciB3cmFwcGluZ1xuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IFZpZXdIb29rKHRoaXMsIGVsLCBob29rRGVmaW5pdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBob29rIGRlZmluaXRpb24gZm9yIFwiJHtob29rTmFtZX1cIi4gRXhwZWN0ZWQgYSBjbGFzcyBleHRlbmRpbmcgVmlld0hvb2sgb3IgYW4gb2JqZWN0IGRlZmluaXRpb24uYCxcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKTtcbiAgICAgICAgICBsb2dFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBob29rIFwiJHtob29rTmFtZX1cIjogJHtlcnJvck1lc3NhZ2V9YCwgZWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlld0hvb2tzW1ZpZXdIb29rLmVsZW1lbnRJRChob29rSW5zdGFuY2UuZWwpXSA9IGhvb2tJbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIGhvb2tJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSBpZiAoaG9va05hbWUgIT09IG51bGwpIHtcbiAgICAgICAgbG9nRXJyb3IoYHVua25vd24gaG9vayBmb3VuZCBmb3IgXCIke2hvb2tOYW1lfVwiYCwgZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lIb29rKGhvb2spIHtcbiAgICAvLyBfX2Rlc3Ryb3llZCBjbGVhcnMgdGhlIGVsZW1lbnRJRCBmcm9tIHRoZSBob29rLCB0aGVyZWZvcmVcbiAgICAvLyB3ZSBuZWVkIHRvIGdldCBpdCBiZWZvcmUgY2FsbGluZyBfX2Rlc3Ryb3llZFxuICAgIGNvbnN0IGhvb2tJZCA9IFZpZXdIb29rLmVsZW1lbnRJRChob29rLmVsKTtcbiAgICBob29rLl9fZGVzdHJveWVkKCk7XG4gICAgaG9vay5fX2NsZWFudXBfXygpO1xuICAgIGRlbGV0ZSB0aGlzLnZpZXdIb29rc1tob29rSWRdO1xuICB9XG5cbiAgYXBwbHlQZW5kaW5nVXBkYXRlcygpIHtcbiAgICAvLyBUbyBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVyZSB3ZSBtaWdodCBzdGlsbCBiZSBwZW5kaW5nIGEgbmV3XG4gICAgLy8gbmF2aWdhdGlvbiBvciB0aGUgam9pbiBpcyBzdGlsbCBwZW5kaW5nLCBgdGhpcy51cGRhdGVgIHJldHVybnMgZmFsc2VcbiAgICAvLyBpZiB0aGUgZGlmZiB3YXMgbm90IGFwcGxpZWQuXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSB0aGlzLnBlbmRpbmdEaWZmcy5maWx0ZXIoXG4gICAgICAoeyBkaWZmLCBldmVudHMgfSkgPT4gIXRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cywgdHJ1ZSksXG4gICAgKTtcbiAgICB0aGlzLmVhY2hDaGlsZCgoY2hpbGQpID0+IGNoaWxkLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKSk7XG4gIH1cblxuICBlYWNoQ2hpbGQoY2FsbGJhY2spIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXSB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGlkIGluIGNoaWxkcmVuKSB7XG4gICAgICBjYWxsYmFjayh0aGlzLmdldENoaWxkQnlJZChpZCkpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbm5lbChldmVudCwgY2IpIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQub25DaGFubmVsKHRoaXMuY2hhbm5lbCwgZXZlbnQsIChyZXNwKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0pvaW5QZW5kaW5nKCkpIHtcbiAgICAgICAgLy8gaW4gY2FzZSB0aGlzIGlzIGEgcmVqb2luIChqb2luQ291bnQgPiAxKSB3ZSBzdG9yZSBvdXIgb3duIGpvaW4gb3BzXG4gICAgICAgIGlmICh0aGlzLmpvaW5Db3VudCA+IDEpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdKb2luT3BzLnB1c2goKCkgPT4gY2IocmVzcCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiBjYihyZXNwKV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiBjYihyZXNwKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kQ2hhbm5lbCgpIHtcbiAgICAvLyBUaGUgZGlmZiBldmVudCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgcmVndWxhciB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICAvLyBBbGwgb3RoZXIgb3BlcmF0aW9ucyBhcmUgcXVldWVkIHRvIGJlIGFwcGxpZWQgb25seSBhZnRlciBqb2luLlxuICAgIHRoaXMubGl2ZVNvY2tldC5vbkNoYW5uZWwodGhpcy5jaGFubmVsLCBcImRpZmZcIiwgKHJhd0RpZmYpID0+IHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmF3RGlmZiwgKHsgZGlmZiwgZXZlbnRzIH0pID0+XG4gICAgICAgICAgdGhpcy51cGRhdGUoZGlmZiwgZXZlbnRzKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMub25DaGFubmVsKFwicmVkaXJlY3RcIiwgKHsgdG8sIGZsYXNoIH0pID0+XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bywgZmxhc2ggfSksXG4gICAgKTtcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVBhdGNoKHJlZGlyKSk7XG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3JlZGlyZWN0XCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVSZWRpcmVjdChyZWRpcikpO1xuICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKChyZWFzb24pID0+IHRoaXMub25FcnJvcihyZWFzb24pKTtcbiAgICB0aGlzLmNoYW5uZWwub25DbG9zZSgocmVhc29uKSA9PiB0aGlzLm9uQ2xvc2UocmVhc29uKSk7XG4gIH1cblxuICBkZXN0cm95QWxsQ2hpbGRyZW4oKSB7XG4gICAgdGhpcy5lYWNoQ2hpbGQoKGNoaWxkKSA9PiBjaGlsZC5kZXN0cm95KCkpO1xuICB9XG5cbiAgb25MaXZlUmVkaXJlY3QocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kLCBmbGFzaCB9ID0gcmVkaXI7XG4gICAgY29uc3QgdXJsID0gdGhpcy5leHBhbmRVUkwodG8pO1xuICAgIGNvbnN0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6c2VydmVyLW5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyB0bywga2luZCwgZmxhc2ggfSxcbiAgICB9KTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVJlZGlyZWN0KGUsIHVybCwga2luZCwgZmxhc2gpO1xuICB9XG5cbiAgb25MaXZlUGF0Y2gocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kIH0gPSByZWRpcjtcbiAgICB0aGlzLmhyZWYgPSB0aGlzLmV4cGFuZFVSTCh0byk7XG4gICAgdGhpcy5saXZlU29ja2V0Lmhpc3RvcnlQYXRjaCh0bywga2luZCk7XG4gIH1cblxuICBleHBhbmRVUkwodG8pIHtcbiAgICByZXR1cm4gdG8uc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0ke3RvfWBcbiAgICAgIDogdG87XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7dG86IHN0cmluZywgZmxhc2g/OiBzdHJpbmcsIHJlbG9hZFRva2VuPzogc3RyaW5nfX0gcmVkaXJlY3RcbiAgICovXG4gIG9uUmVkaXJlY3QoeyB0bywgZmxhc2gsIHJlbG9hZFRva2VuIH0pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3QodG8sIGZsYXNoLCByZWxvYWRUb2tlbik7XG4gIH1cblxuICBpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95ZWQ7XG4gIH1cblxuICBqb2luRGVhZCgpIHtcbiAgICB0aGlzLmlzRGVhZCA9IHRydWU7XG4gIH1cblxuICBqb2luUHVzaCgpIHtcbiAgICB0aGlzLmpvaW5QdXNoID0gdGhpcy5qb2luUHVzaCB8fCB0aGlzLmNoYW5uZWwuam9pbigpO1xuICAgIHJldHVybiB0aGlzLmpvaW5QdXNoO1xuICB9XG5cbiAgam9pbihjYWxsYmFjaykge1xuICAgIHRoaXMuc2hvd0xvYWRlcih0aGlzLmxpdmVTb2NrZXQubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5iaW5kQ2hhbm5lbCgpO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLnN0b3BDYWxsYmFjayA9IHRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe1xuICAgICAgICB0bzogdGhpcy5ocmVmLFxuICAgICAgICBraW5kOiBcImluaXRpYWxcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmpvaW5DYWxsYmFjayA9IChvbkRvbmUpID0+IHtcbiAgICAgIG9uRG9uZSA9IG9uRG9uZSB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgIGNhbGxiYWNrID8gY2FsbGJhY2sodGhpcy5qb2luQ291bnQsIG9uRG9uZSkgOiBvbkRvbmUoKTtcbiAgICB9O1xuXG4gICAgdGhpcy53cmFwUHVzaCgoKSA9PiB0aGlzLmNoYW5uZWwuam9pbigpLCB7XG4gICAgICBvazogKHJlc3ApID0+IHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHRoaXMub25Kb2luKHJlc3ApKSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHRoaXMub25Kb2luRXJyb3IoZXJyb3IpLFxuICAgICAgdGltZW91dDogKCkgPT4gdGhpcy5vbkpvaW5FcnJvcih7IHJlYXNvbjogXCJ0aW1lb3V0XCIgfSksXG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5FcnJvcihyZXNwKSB7XG4gICAgaWYgKHJlc3AucmVhc29uID09PSBcInJlbG9hZFwiKSB7XG4gICAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcbiAgICAgICAgYGZhaWxlZCBtb3VudCB3aXRoICR7cmVzcC5zdGF0dXN9LiBGYWxsaW5nIGJhY2sgdG8gcGFnZSByZWxvYWRgLFxuICAgICAgICByZXNwLFxuICAgICAgXSk7XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bzogdGhpcy5yb290LmhyZWYsIHJlbG9hZFRva2VuOiByZXNwLnRva2VuIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocmVzcC5yZWFzb24gPT09IFwidW5hdXRob3JpemVkXCIgfHwgcmVzcC5yZWFzb24gPT09IFwic3RhbGVcIikge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgIFwidW5hdXRob3JpemVkIGxpdmVfcmVkaXJlY3QuIEZhbGxpbmcgYmFjayB0byBwYWdlIHJlcXVlc3RcIixcbiAgICAgICAgcmVzcCxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5vblJlZGlyZWN0KHsgdG86IHRoaXMucm9vdC5ocmVmLCBmbGFzaDogdGhpcy5mbGFzaCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QgfHwgcmVzcC5saXZlX3JlZGlyZWN0KSB7XG4gICAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmNoYW5uZWwubGVhdmUoKTtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgfVxuICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlc3AubGl2ZV9yZWRpcmVjdCk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwiZXJyb3JcIiwgKCkgPT4gW1widW5hYmxlIHRvIGpvaW5cIiwgcmVzcF0pO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9TRVJWRVJfRVJST1JfQ0xBU1NdLFxuICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5saXZlU29ja2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LnJlbG9hZFdpdGhKaXR0ZXIodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmpvaW5BdHRlbXB0cyA+PSBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUykge1xuICAgICAgICAvLyBwdXQgdGhlIHJvb3QgcmV2aWV3IGludG8gcGVybWFuZW50IGVycm9yIHN0YXRlLCBidXQgZG9uJ3QgZGVzdHJveSBpdCBhcyBpdCBjYW4gcmVtYWluIGFjdGl2ZVxuICAgICAgICB0aGlzLnJvb3QuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgICAgYGdpdmluZyB1cCB0cnlpbmcgdG8gbW91bnQgYWZ0ZXIgJHtNQVhfQ0hJTERfSk9JTl9BVFRFTVBUU30gdHJpZXNgLFxuICAgICAgICAgIHJlc3AsXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRydWVDaGlsZEVsID0gRE9NLmJ5SWQodGhpcy5lbC5pZCk7XG4gICAgICBpZiAodHJ1ZUNoaWxkRWwpIHtcbiAgICAgICAgRE9NLm1lcmdlQXR0cnModHJ1ZUNoaWxkRWwsIHRoaXMuZWwpO1xuICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgICBbUEhYX0xPQURJTkdfQ0xBU1MsIFBIWF9FUlJPUl9DTEFTUywgUEhYX1NFUlZFUl9FUlJPUl9DTEFTU10sXG4gICAgICAgICAgeyB1bnN0cnVjdHVyZWRFcnJvcjogcmVzcCwgZXJyb3JLaW5kOiBcInNlcnZlclwiIH0sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZWwgPSB0cnVlQ2hpbGRFbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2xvc2UocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTWFpbigpICYmXG4gICAgICB0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSAmJlxuICAgICAgcmVhc29uICE9PSBcImxlYXZlXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuZHJvcEFjdGl2ZUVsZW1lbnQodGhpcyk7XG4gICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCkpIHtcbiAgICAgIHRoaXMuc2hvd0xvYWRlcihCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VUKTtcbiAgICB9XG4gIH1cblxuICBvbkVycm9yKHJlYXNvbikge1xuICAgIHRoaXMub25DbG9zZShyZWFzb24pO1xuICAgIGlmICh0aGlzLmxpdmVTb2NrZXQuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ2aWV3IGNyYXNoZWRcIiwgcmVhc29uXSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5saXZlU29ja2V0LmlzVW5sb2FkZWQoKSkge1xuICAgICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZWFzb24sIGVycm9yS2luZDogXCJzZXJ2ZXJcIiB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXG4gICAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9DTElFTlRfRVJST1JfQ0xBU1NdLFxuICAgICAgICAgIHsgdW5zdHJ1Y3R1cmVkRXJyb3I6IHJlYXNvbiwgZXJyb3JLaW5kOiBcImNsaWVudFwiIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGlzcGxheUVycm9yKGNsYXNzZXMsIGRldGFpbHMgPSB7fSkge1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7XG4gICAgICAgIGRldGFpbDogeyB0bzogdGhpcy5ocmVmLCBraW5kOiBcImVycm9yXCIsIC4uLmRldGFpbHMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNob3dMb2FkZXIoKTtcbiAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoLi4uY2xhc3Nlcyk7XG4gICAgdGhpcy5kZWxheWVkRGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBkZWxheWVkRGlzY29ubmVjdGVkKCkge1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJkaXNjb25uZWN0ZWRcIikpO1xuICAgIH0sIHRoaXMubGl2ZVNvY2tldC5kaXNjb25uZWN0ZWRUaW1lb3V0KTtcbiAgfVxuXG4gIHdyYXBQdXNoKGNhbGxlclB1c2gsIHJlY2VpdmVzKSB7XG4gICAgY29uc3QgbGF0ZW5jeSA9IHRoaXMubGl2ZVNvY2tldC5nZXRMYXRlbmN5U2ltKCk7XG4gICAgY29uc3Qgd2l0aExhdGVuY3kgPSBsYXRlbmN5XG4gICAgICA/IChjYikgPT4gc2V0VGltZW91dCgoKSA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIGNiKCksIGxhdGVuY3kpXG4gICAgICA6IChjYikgPT4gIXRoaXMuaXNEZXN0cm95ZWQoKSAmJiBjYigpO1xuXG4gICAgd2l0aExhdGVuY3koKCkgPT4ge1xuICAgICAgY2FsbGVyUHVzaCgpXG4gICAgICAgIC5yZWNlaXZlKFwib2tcIiwgKHJlc3ApID0+XG4gICAgICAgICAgd2l0aExhdGVuY3koKCkgPT4gcmVjZWl2ZXMub2sgJiYgcmVjZWl2ZXMub2socmVzcCkpLFxuICAgICAgICApXG4gICAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgKHJlYXNvbikgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy5lcnJvciAmJiByZWNlaXZlcy5lcnJvcihyZWFzb24pKSxcbiAgICAgICAgKVxuICAgICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy50aW1lb3V0ICYmIHJlY2VpdmVzLnRpbWVvdXQoKSksXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIm5vIGNvbm5lY3Rpb25cIikpO1xuICAgIH1cblxuICAgIGNvbnN0IFtyZWYsIFtlbF0sIG9wdHNdID0gcmVmR2VuZXJhdG9yXG4gICAgICA/IHJlZkdlbmVyYXRvcih7IHBheWxvYWQgfSlcbiAgICAgIDogW251bGwsIFtdLCB7fV07XG4gICAgY29uc3Qgb2xkSm9pbkNvdW50ID0gdGhpcy5qb2luQ291bnQ7XG4gICAgbGV0IG9uTG9hZGluZ0RvbmUgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBpZiAob3B0cy5wYWdlX2xvYWRpbmcpIHtcbiAgICAgIG9uTG9hZGluZ0RvbmUgPSB0aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHtcbiAgICAgICAga2luZDogXCJlbGVtZW50XCIsXG4gICAgICAgIHRhcmdldDogZWwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQuY2lkICE9PSBcIm51bWJlclwiKSB7XG4gICAgICBkZWxldGUgcGF5bG9hZC5jaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMud3JhcFB1c2goKCkgPT4gdGhpcy5jaGFubmVsLnB1c2goZXZlbnQsIHBheWxvYWQsIFBVU0hfVElNRU9VVCksIHtcbiAgICAgICAgb2s6IChyZXNwKSA9PiB7XG4gICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0QWNrUmVmID0gcmVmO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmaW5pc2ggPSAoaG9va1JlcGx5KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcC5yZWRpcmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzcC5saXZlX3BhdGNoKSB7XG4gICAgICAgICAgICAgIHRoaXMub25MaXZlUGF0Y2gocmVzcC5saXZlX3BhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25Mb2FkaW5nRG9uZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZSh7IHJlc3A6IHJlc3AsIHJlcGx5OiBob29rUmVwbHksIHJlZiB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChyZXNwLmRpZmYpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmVzcC5kaWZmLCAoeyBkaWZmLCByZXBseSwgZXZlbnRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cyk7XG4gICAgICAgICAgICAgICAgZmluaXNoKHJlcGx5KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5pc2gobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKHJlYXNvbikgPT5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBmYWlsZWQgd2l0aCByZWFzb246ICR7SlNPTi5zdHJpbmdpZnkocmVhc29uKX1gKSksXG4gICAgICAgIHRpbWVvdXQ6ICgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwidGltZW91dFwiKSk7XG4gICAgICAgICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSBvbGRKb2luQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZWxvYWRXaXRoSml0dGVyKHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2coXCJ0aW1lb3V0XCIsICgpID0+IFtcbiAgICAgICAgICAgICAgICBcInJlY2VpdmVkIHRpbWVvdXQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlci4gRmFsbGluZyBiYWNrIHRvIGhhcmQgcmVmcmVzaCBmb3IgcmVjb3ZlcnlcIixcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuZG9SZWZzKHJlZiwgcGh4RXZlbnQsIG9ubHlFbHMpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZXhpdCBpZiBleHRlcm5hbCBmb3JtIHRyaWdnZXJlZFxuICAgIGNvbnN0IHNlbGVjdG9yID0gYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gO1xuXG4gICAgaWYgKG9ubHlFbHMpIHtcbiAgICAgIG9ubHlFbHMgPSBuZXcgU2V0KG9ubHlFbHMpO1xuICAgICAgRE9NLmFsbChkb2N1bWVudCwgc2VsZWN0b3IsIChwYXJlbnQpID0+IHtcbiAgICAgICAgaWYgKG9ubHlFbHMgJiYgIW9ubHlFbHMuaGFzKHBhcmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdW5kbyBhbnkgY2hpbGQgcmVmcyB3aXRoaW4gcGFyZW50IGZpcnN0XG4gICAgICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGNoaWxkKSA9PlxuICAgICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51bmRvRWxSZWYocGFyZW50LCByZWYsIHBoeEV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBET00uYWxsKGRvY3VtZW50LCBzZWxlY3RvciwgKGVsKSA9PiB0aGlzLnVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGVsUmVmID0gbmV3IEVsZW1lbnRSZWYoZWwpO1xuXG4gICAgZWxSZWYubWF5YmVVbmRvKHJlZiwgcGh4RXZlbnQsIChjbG9uZWRUcmVlKSA9PiB7XG4gICAgICAvLyB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBmdWxsIHBhdGNoIG9uIHVubG9ja2VkIGVsZW1lbnRzXG4gICAgICAvLyB0byBwZXJmb3JtIGFsbCB0aGUgbmVjZXNzYXJ5IGxvZ2ljIChsaWtlIGNhbGxpbmcgdXBkYXRlZCBmb3IgaG9va3MsIGV0Yy4pXG4gICAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCBlbCwgdGhpcy5pZCwgY2xvbmVkVHJlZSwgW10sIG51bGwsIHtcbiAgICAgICAgdW5kb1JlZjogcmVmLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgRE9NLmFsbChlbCwgYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gLCAoY2hpbGQpID0+XG4gICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICk7XG4gICAgICBpZiAocGh4Q2hpbGRyZW5BZGRlZCkge1xuICAgICAgICB0aGlzLmpvaW5OZXdDaGlsZHJlbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVmU3JjKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmlkO1xuICB9XG5cbiAgcHV0UmVmKGVsZW1lbnRzLCBwaHhFdmVudCwgZXZlbnRUeXBlLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBuZXdSZWYgPSB0aGlzLnJlZisrO1xuICAgIGNvbnN0IGRpc2FibGVXaXRoID0gdGhpcy5iaW5kaW5nKFBIWF9ESVNBQkxFX1dJVEgpO1xuICAgIGlmIChvcHRzLmxvYWRpbmcpIHtcbiAgICAgIGNvbnN0IGxvYWRpbmdFbHMgPSBET00uYWxsKGRvY3VtZW50LCBvcHRzLmxvYWRpbmcpLm1hcCgoZWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZWwsIGxvY2s6IHRydWUsIGxvYWRpbmc6IHRydWUgfTtcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudHMgPSBlbGVtZW50cy5jb25jYXQobG9hZGluZ0Vscyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7IGVsLCBsb2NrLCBsb2FkaW5nIH0gb2YgZWxlbWVudHMpIHtcbiAgICAgIGlmICghbG9jayAmJiAhbG9hZGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwdXRSZWYgcmVxdWlyZXMgbG9jayBvciBsb2FkaW5nXCIpO1xuICAgICAgfVxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQURJTkcsIG5ld1JlZik7XG4gICAgICB9XG4gICAgICBpZiAobG9jaykge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLLCBuZXdSZWYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICFsb2FkaW5nIHx8XG4gICAgICAgIChvcHRzLnN1Ym1pdHRlciAmJiAhKGVsID09PSBvcHRzLnN1Ym1pdHRlciB8fCBlbCA9PT0gb3B0cy5mb3JtKSlcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9ja0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoYHBoeDp1bmRvLWxvY2s6JHtuZXdSZWZ9YCwgKCkgPT4gcmVzb2x2ZShkZXRhaWwpLCB7XG4gICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbG9hZGluZ0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgYHBoeDp1bmRvLWxvYWRpbmc6JHtuZXdSZWZ9YCxcbiAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgeyBvbmNlOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgZWwuY2xhc3NMaXN0LmFkZChgcGh4LSR7ZXZlbnRUeXBlfS1sb2FkaW5nYCk7XG4gICAgICBjb25zdCBkaXNhYmxlVGV4dCA9IGVsLmdldEF0dHJpYnV0ZShkaXNhYmxlV2l0aCk7XG4gICAgICBpZiAoZGlzYWJsZVRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCFlbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKSkge1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsIGVsLmlubmVyVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVUZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUEhYX0RJU0FCTEVEIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHNldCBpbiBkaXNhYmxlRm9ybVxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgUEhYX0RJU0FCTEVELFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQpIHx8IGVsLmRpc2FibGVkLFxuICAgICAgICApO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGV0YWlsID0ge1xuICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgICByZWY6IG5ld1JlZixcbiAgICAgICAgaXNMb2FkaW5nOiBsb2FkaW5nLFxuICAgICAgICBpc0xvY2tlZDogbG9jayxcbiAgICAgICAgbG9ja0VsZW1lbnRzOiBlbGVtZW50cy5maWx0ZXIoKHsgbG9jayB9KSA9PiBsb2NrKS5tYXAoKHsgZWwgfSkgPT4gZWwpLFxuICAgICAgICBsb2FkaW5nRWxlbWVudHM6IGVsZW1lbnRzXG4gICAgICAgICAgLmZpbHRlcigoeyBsb2FkaW5nIH0pID0+IGxvYWRpbmcpXG4gICAgICAgICAgLm1hcCgoeyBlbCB9KSA9PiBlbCksXG4gICAgICAgIHVubG9jazogKGVscykgPT4ge1xuICAgICAgICAgIGVscyA9IEFycmF5LmlzQXJyYXkoZWxzKSA/IGVscyA6IFtlbHNdO1xuICAgICAgICAgIHRoaXMudW5kb1JlZnMobmV3UmVmLCBwaHhFdmVudCwgZWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgbG9ja0NvbXBsZXRlOiBsb2NrQ29tcGxldGVQcm9taXNlLFxuICAgICAgICBsb2FkaW5nQ29tcGxldGU6IGxvYWRpbmdDb21wbGV0ZVByb21pc2UsXG4gICAgICAgIGxvY2s6IChsb2NrRWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWNrZWQobmV3UmVmKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZXRhaWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9ja0VsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0ssIG5ld1JlZik7XG4gICAgICAgICAgICBsb2NrRWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgICAgICAgIGxvY2tFbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBgcGh4OmxvY2stc3RvcDoke25ld1JlZn1gLFxuICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpZiAob3B0cy5wYXlsb2FkKSB7XG4gICAgICAgIGRldGFpbFtcInBheWxvYWRcIl0gPSBvcHRzLnBheWxvYWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy50YXJnZXQpIHtcbiAgICAgICAgZGV0YWlsW1widGFyZ2V0XCJdID0gb3B0cy50YXJnZXQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5vcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgIGRldGFpbFtcIm9yaWdpbmFsRXZlbnRcIl0gPSBvcHRzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB9XG4gICAgICBlbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6cHVzaFwiLCB7XG4gICAgICAgICAgZGV0YWlsOiBkZXRhaWwsXG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaWYgKHBoeEV2ZW50KSB7XG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6cHVzaDoke3BoeEV2ZW50fWAsIHtcbiAgICAgICAgICAgIGRldGFpbDogZGV0YWlsLFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW25ld1JlZiwgZWxlbWVudHMubWFwKCh7IGVsIH0pID0+IGVsKSwgb3B0c107XG4gIH1cblxuICBpc0Fja2VkKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxhc3RBY2tSZWYgIT09IG51bGwgJiYgdGhpcy5sYXN0QWNrUmVmID49IHJlZjtcbiAgfVxuXG4gIGNvbXBvbmVudElEKGVsKSB7XG4gICAgY29uc3QgY2lkID0gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKTtcbiAgICByZXR1cm4gY2lkID8gcGFyc2VJbnQoY2lkKSA6IG51bGw7XG4gIH1cblxuICB0YXJnZXRDb21wb25lbnRJRCh0YXJnZXQsIHRhcmdldEN0eCwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIHJldHVybiB0YXJnZXRDdHg7XG4gICAgfVxuXG4gICAgY29uc3QgY2lkT3JTZWxlY3RvciA9XG4gICAgICBvcHRzLnRhcmdldCB8fCB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInRhcmdldFwiKSk7XG4gICAgaWYgKGlzQ2lkKGNpZE9yU2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoY2lkT3JTZWxlY3Rvcik7XG4gICAgfSBlbHNlIGlmICh0YXJnZXRDdHggJiYgKGNpZE9yU2VsZWN0b3IgIT09IG51bGwgfHwgb3B0cy50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VzdENvbXBvbmVudElEKHRhcmdldEN0eCkge1xuICAgIGlmIChpc0NpZCh0YXJnZXRDdHgpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0Q3R4O1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0Q3R4KSB7XG4gICAgICByZXR1cm4gbWF5YmUoXG4gICAgICAgIHRhcmdldEN0eC5jbG9zZXN0KGBbJHtQSFhfQ09NUE9ORU5UfV1gKSxcbiAgICAgICAgKGVsKSA9PiB0aGlzLm93bnNFbGVtZW50KGVsKSAmJiB0aGlzLmNvbXBvbmVudElEKGVsKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hIb29rRXZlbnQoZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJob29rXCIsICgpID0+IFtcbiAgICAgICAgXCJ1bmFibGUgdG8gcHVzaCBob29rIGV2ZW50LiBMaXZlVmlldyBub3QgY29ubmVjdGVkXCIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcInVuYWJsZSB0byBwdXNoIGhvb2sgZXZlbnQuIExpdmVWaWV3IG5vdCBjb25uZWN0ZWRcIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZkdlbmVyYXRvciA9ICgpID0+XG4gICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgZXZlbnQsIFwiaG9va1wiLCB7XG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0Q3R4LFxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCB7XG4gICAgICB0eXBlOiBcImhvb2tcIixcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIHZhbHVlOiBwYXlsb2FkLFxuICAgICAgY2lkOiB0aGlzLmNsb3Nlc3RDb21wb25lbnRJRCh0YXJnZXRDdHgpLFxuICAgIH0pLnRoZW4oKHsgcmVzcDogX3Jlc3AsIHJlcGx5LCByZWYgfSkgPT4gKHsgcmVwbHksIHJlZiB9KSk7XG4gIH1cblxuICBleHRyYWN0TWV0YShlbCwgbWV0YSwgdmFsdWUpIHtcbiAgICBjb25zdCBwcmVmaXggPSB0aGlzLmJpbmRpbmcoXCJ2YWx1ZS1cIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgbWV0YSA9IHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZSA9IGVsLmF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBtZXRhW25hbWUucmVwbGFjZShwcmVmaXgsIFwiXCIpXSA9IGVsLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShlbCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkpIHtcbiAgICAgIGlmICghbWV0YSkge1xuICAgICAgICBtZXRhID0ge307XG4gICAgICB9XG4gICAgICBtZXRhLnZhbHVlID0gZWwudmFsdWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZWwudGFnTmFtZSA9PT0gXCJJTlBVVFwiICYmXG4gICAgICAgIENIRUNLQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlKSA+PSAwICYmXG4gICAgICAgICFlbC5jaGVja2VkXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIG1ldGEudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgIG1ldGEgPSB7fTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIG1ldGFba2V5XSA9IHZhbHVlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXRhO1xuICB9XG5cbiAgcHVzaEV2ZW50KHR5cGUsIGVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBtZXRhLCBvcHRzID0ge30sIG9uUmVwbHkpIHtcbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkoXG4gICAgICAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgcGh4RXZlbnQsIHR5cGUsIHtcbiAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgIHBheWxvYWQ6IG1heWJlUGF5bG9hZD8ucGF5bG9hZCxcbiAgICAgICAgfSksXG4gICAgICBcImV2ZW50XCIsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IHRoaXMuZXh0cmFjdE1ldGEoZWwsIG1ldGEsIG9wdHMudmFsdWUpLFxuICAgICAgICBjaWQ6IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoZWwsIHRhcmdldEN0eCwgb3B0cyksXG4gICAgICB9LFxuICAgIClcbiAgICAgIC50aGVuKCh7IHJlcGx5IH0pID0+IG9uUmVwbHkgJiYgb25SZXBseShyZXBseSkpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICBwdXNoRmlsZVByb2dyZXNzKGZpbGVFbCwgZW50cnlSZWYsIHByb2dyZXNzLCBvblJlcGx5ID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQud2l0aGluT3duZXJzKGZpbGVFbC5mb3JtLCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICB2aWV3XG4gICAgICAgIC5wdXNoV2l0aFJlcGx5KG51bGwsIFwicHJvZ3Jlc3NcIiwge1xuICAgICAgICAgIGV2ZW50OiBmaWxlRWwuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhQSFhfUFJPR1JFU1MpKSxcbiAgICAgICAgICByZWY6IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICAgIGVudHJ5X3JlZjogZW50cnlSZWYsXG4gICAgICAgICAgcHJvZ3Jlc3M6IHByb2dyZXNzLFxuICAgICAgICAgIGNpZDogdmlldy50YXJnZXRDb21wb25lbnRJRChmaWxlRWwuZm9ybSwgdGFyZ2V0Q3R4KSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gb25SZXBseSgpKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGZpbGUgcHJvZ3Jlc3NcIiwgZXJyb3IpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hJbnB1dChpbnB1dEVsLCB0YXJnZXRDdHgsIGZvcmNlQ2lkLCBwaHhFdmVudCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAoIWlucHV0RWwuZm9ybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZm9ybSBldmVudHMgcmVxdWlyZSB0aGUgaW5wdXQgdG8gYmUgaW5zaWRlIGEgZm9ybVwiKTtcbiAgICB9XG5cbiAgICBsZXQgdXBsb2FkcztcbiAgICBjb25zdCBjaWQgPSBpc0NpZChmb3JjZUNpZClcbiAgICAgID8gZm9yY2VDaWRcbiAgICAgIDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCwgb3B0cyk7XG4gICAgY29uc3QgcmVmR2VuZXJhdG9yID0gKG1heWJlUGF5bG9hZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucHV0UmVmKFxuICAgICAgICBbXG4gICAgICAgICAgeyBlbDogaW5wdXRFbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICAgIHsgZWw6IGlucHV0RWwuZm9ybSwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgXCJjaGFuZ2VcIixcbiAgICAgICAgeyAuLi5vcHRzLCBwYXlsb2FkOiBtYXliZVBheWxvYWQ/LnBheWxvYWQgfSxcbiAgICAgICk7XG4gICAgfTtcbiAgICBsZXQgZm9ybURhdGE7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoaW5wdXRFbC5mb3JtLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplT3B0cyA9IHt9O1xuICAgIGlmIChpbnB1dEVsIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgIHNlcmlhbGl6ZU9wdHMuc3VibWl0dGVyID0gaW5wdXRFbDtcbiAgICB9XG4gICAgaWYgKGlucHV0RWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNoYW5nZVwiKSkpIHtcbiAgICAgIGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShpbnB1dEVsLmZvcm0sIHNlcmlhbGl6ZU9wdHMsIFtpbnB1dEVsLm5hbWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGlucHV0RWwuZm9ybSwgc2VyaWFsaXplT3B0cyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmXG4gICAgICBpbnB1dEVsLmZpbGVzICYmXG4gICAgICBpbnB1dEVsLmZpbGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGlucHV0RWwsIEFycmF5LmZyb20oaW5wdXRFbC5maWxlcykpO1xuICAgIH1cbiAgICB1cGxvYWRzID0gTGl2ZVVwbG9hZGVyLnNlcmlhbGl6ZVVwbG9hZHMoaW5wdXRFbCk7XG5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgbWV0YToge1xuICAgICAgICAvLyBubyB0YXJnZXQgd2FzIGltcGxpY2l0bHkgc2VudCBhcyBcInVuZGVmaW5lZFwiIGluIExWIDw9IDEuMC41LCB0aGVyZWZvcmVcbiAgICAgICAgLy8gd2UgaGF2ZSB0byBrZWVwIGl0LiBJbiAxLjAuNiB3ZSBzd2l0Y2hlZCBmcm9tIHBhc3NpbmcgbWV0YSBhcyBVUkwgZW5jb2RlZCBkYXRhXG4gICAgICAgIC8vIHRvIHBhc3NpbmcgaXQgZGlyZWN0bHkgaW4gdGhlIGV2ZW50LCBidXQgdGhlIEpTT04gZW5jb2RlIHdvdWxkIGRyb3Aga2V5cyB3aXRoXG4gICAgICAgIC8vIHVuZGVmaW5lZCB2YWx1ZXMuXG4gICAgICAgIF90YXJnZXQ6IG9wdHMuX3RhcmdldCB8fCBcInVuZGVmaW5lZFwiLFxuICAgICAgICAuLi5tZXRhLFxuICAgICAgfSxcbiAgICAgIHVwbG9hZHM6IHVwbG9hZHMsXG4gICAgICBjaWQ6IGNpZCxcbiAgICB9O1xuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIFwiZXZlbnRcIiwgZXZlbnQpXG4gICAgICAudGhlbigoeyByZXNwIH0pID0+IHtcbiAgICAgICAgaWYgKERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmIERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCkpIHtcbiAgICAgICAgICAvLyB0aGUgZWxlbWVudCBjb3VsZCBiZSBpbnNpZGUgYSBsb2NrZWQgcGFyZW50IGZvciBvdGhlciB1bnJlbGF0ZWQgY2hhbmdlcztcbiAgICAgICAgICAvLyB3ZSBjYW4gb25seSBzdGFydCB1cGxvYWRzIHdoZW4gdGhlIHRyZWUgaXMgdW5sb2NrZWQgYW5kIHRoZVxuICAgICAgICAgIC8vIG5lY2Vzc2FyeSBkYXRhIGF0dHJpYnV0ZXMgYXJlIHNldCBpbiB0aGUgcmVhbCBET01cbiAgICAgICAgICBFbGVtZW50UmVmLm9uVW5sb2NrKGlucHV0RWwsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICAgICAgICAgIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCwgW2lucHV0RWwuZm9ybV0pO1xuICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVzKFxuICAgICAgICAgICAgICAgIGlucHV0RWwuZm9ybSxcbiAgICAgICAgICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgICAgICAgICB0YXJnZXRDdHgsXG4gICAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgICAgIGNpZCxcbiAgICAgICAgICAgICAgICAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHJlc3ApO1xuICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQXdhaXRpbmdTdWJtaXQoaW5wdXRFbC5mb3JtLCBwaHhFdmVudCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGlucHV0IGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICB0cmlnZ2VyQXdhaXRpbmdTdWJtaXQoZm9ybUVsLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGF3YWl0aW5nU3VibWl0ID0gdGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKTtcbiAgICBpZiAoYXdhaXRpbmdTdWJtaXQpIHtcbiAgICAgIGNvbnN0IFtfZWwsIF9yZWYsIF9vcHRzLCBjYWxsYmFja10gPSBhd2FpdGluZ1N1Ym1pdDtcbiAgICAgIHRoaXMuY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVN1Ym1pdHMuZmluZCgoW2VsLCBfcmVmLCBfb3B0cywgX2NhbGxiYWNrXSkgPT5cbiAgICAgIGVsLmlzU2FtZU5vZGUoZm9ybUVsKSxcbiAgICApO1xuICB9XG5cbiAgc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuZ2V0U2NoZWR1bGVkU3VibWl0KGZvcm1FbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmZvcm1TdWJtaXRzLnB1c2goW2Zvcm1FbCwgcmVmLCBvcHRzLCBjYWxsYmFja10pO1xuICB9XG5cbiAgY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpIHtcbiAgICB0aGlzLmZvcm1TdWJtaXRzID0gdGhpcy5mb3JtU3VibWl0cy5maWx0ZXIoXG4gICAgICAoW2VsLCByZWYsIF9vcHRzLCBfY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgIGlmIChlbC5pc1NhbWVOb2RlKGZvcm1FbCkpIHtcbiAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgZGlzYWJsZUZvcm0oZm9ybUVsLCBwaHhFdmVudCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZmlsdGVySWdub3JlZCA9IChlbCkgPT4ge1xuICAgICAgY29uc3QgdXNlcklnbm9yZWQgPSBjbG9zZXN0UGh4QmluZGluZyhcbiAgICAgICAgZWwsXG4gICAgICAgIGAke3RoaXMuYmluZGluZyhQSFhfVVBEQVRFKX09aWdub3JlYCxcbiAgICAgICAgZWwuZm9ybSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gIShcbiAgICAgICAgdXNlcklnbm9yZWQgfHwgY2xvc2VzdFBoeEJpbmRpbmcoZWwsIFwiZGF0YS1waHgtdXBkYXRlPWlnbm9yZVwiLCBlbC5mb3JtKVxuICAgICAgKTtcbiAgICB9O1xuICAgIGNvbnN0IGZpbHRlckRpc2FibGVzID0gKGVsKSA9PiB7XG4gICAgICByZXR1cm4gZWwuaGFzQXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKSk7XG4gICAgfTtcbiAgICBjb25zdCBmaWx0ZXJCdXR0b24gPSAoZWwpID0+IGVsLnRhZ05hbWUgPT0gXCJCVVRUT05cIjtcblxuICAgIGNvbnN0IGZpbHRlcklucHV0ID0gKGVsKSA9PlxuICAgICAgW1wiSU5QVVRcIiwgXCJURVhUQVJFQVwiLCBcIlNFTEVDVFwiXS5pbmNsdWRlcyhlbC50YWdOYW1lKTtcblxuICAgIGNvbnN0IGZvcm1FbGVtZW50cyA9IEFycmF5LmZyb20oZm9ybUVsLmVsZW1lbnRzKTtcbiAgICBjb25zdCBkaXNhYmxlcyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVyRGlzYWJsZXMpO1xuICAgIGNvbnN0IGJ1dHRvbnMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckJ1dHRvbikuZmlsdGVyKGZpbHRlcklnbm9yZWQpO1xuICAgIGNvbnN0IGlucHV0cyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVySW5wdXQpLmZpbHRlcihmaWx0ZXJJZ25vcmVkKTtcblxuICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgYnV0dG9uLmRpc2FibGVkKTtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZLCBpbnB1dC5yZWFkT25seSk7XG4gICAgICBpbnB1dC5yZWFkT25seSA9IHRydWU7XG4gICAgICBpZiAoaW5wdXQuZmlsZXMpIHtcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgaW5wdXQuZGlzYWJsZWQpO1xuICAgICAgICBpbnB1dC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZm9ybUVscyA9IGRpc2FibGVzXG4gICAgICAuY29uY2F0KGJ1dHRvbnMpXG4gICAgICAuY29uY2F0KGlucHV0cylcbiAgICAgIC5tYXAoKGVsKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGVsLCBsb2FkaW5nOiB0cnVlLCBsb2NrOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgIC8vIHdlIHJldmVyc2UgdGhlIG9yZGVyIHNvIGZvcm0gY2hpbGRyZW4gYXJlIGFscmVhZHkgbG9ja2VkIGJ5IHRoZSB0aW1lXG4gICAgLy8gdGhlIGZvcm0gaXMgbG9ja2VkXG4gICAgY29uc3QgZWxzID0gW3sgZWw6IGZvcm1FbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogZmFsc2UgfV1cbiAgICAgIC5jb25jYXQoZm9ybUVscylcbiAgICAgIC5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIHRoaXMucHV0UmVmKGVscywgcGh4RXZlbnQsIFwic3VibWl0XCIsIG9wdHMpO1xuICB9XG5cbiAgcHVzaEZvcm1TdWJtaXQoZm9ybUVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBzdWJtaXR0ZXIsIG9wdHMsIG9uUmVwbHkpIHtcbiAgICBjb25zdCByZWZHZW5lcmF0b3IgPSAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgdGhpcy5kaXNhYmxlRm9ybShmb3JtRWwsIHBoeEV2ZW50LCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGZvcm06IGZvcm1FbCxcbiAgICAgICAgcGF5bG9hZDogbWF5YmVQYXlsb2FkPy5wYXlsb2FkLFxuICAgICAgICBzdWJtaXR0ZXI6IHN1Ym1pdHRlcixcbiAgICAgIH0pO1xuICAgIC8vIHN0b3JlIHRoZSBzdWJtaXR0ZXIgaW4gdGhlIGZvcm0gZWxlbWVudCBpbiBvcmRlciB0byB0cmlnZ2VyIGl0XG4gICAgLy8gZm9yIHBoeC10cmlnZ2VyLWFjdGlvblxuICAgIERPTS5wdXRQcml2YXRlKGZvcm1FbCwgXCJzdWJtaXR0ZXJcIiwgc3VibWl0dGVyKTtcbiAgICBjb25zdCBjaWQgPSB0aGlzLnRhcmdldENvbXBvbmVudElEKGZvcm1FbCwgdGFyZ2V0Q3R4KTtcbiAgICBpZiAoTGl2ZVVwbG9hZGVyLmhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkpIHtcbiAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwdXNoID0gKCkgPT5cbiAgICAgICAgdGhpcy5wdXNoRm9ybVN1Ym1pdChcbiAgICAgICAgICBmb3JtRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIHBoeEV2ZW50LFxuICAgICAgICAgIHN1Ym1pdHRlcixcbiAgICAgICAgICBvcHRzLFxuICAgICAgICAgIG9uUmVwbHksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVN1Ym1pdChmb3JtRWwsIHJlZiwgb3B0cywgcHVzaCk7XG4gICAgfSBlbHNlIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbcmVmLCBlbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwcm94eVJlZkdlbiA9ICgpID0+IFtyZWYsIGVscywgb3B0c107XG4gICAgICB0aGlzLnVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIChfdXBsb2FkcykgPT4ge1xuICAgICAgICAvLyBpZiB3ZSBzdGlsbCBoYXZpbmcgcGVuZGluZyBwcmVmbGlnaHRzIGl0IG1lYW5zIHdlIGhhdmUgaW52YWxpZCBlbnRyaWVzXG4gICAgICAgIC8vIGFuZCB0aGUgcGh4LXN1Ym1pdCBjYW5ub3QgYmUgY29tcGxldGVkXG4gICAgICAgIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoZm9ybUVsLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwsIHsgc3VibWl0dGVyIH0pO1xuICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocHJveHlSZWZHZW4sIFwiZXZlbnRcIiwge1xuICAgICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICAgICAgbWV0YTogbWV0YSxcbiAgICAgICAgICBjaWQ6IGNpZCxcbiAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigoeyByZXNwIH0pID0+IG9uUmVwbHkocmVzcCkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICEoXG4gICAgICAgIGZvcm1FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpICYmXG4gICAgICAgIGZvcm1FbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmV4dHJhY3RNZXRhKGZvcm1FbCwge30sIG9wdHMudmFsdWUpO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGZvcm1FbCwgeyBzdWJtaXR0ZXIgfSk7XG4gICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocmVmR2VuZXJhdG9yLCBcImV2ZW50XCIsIHtcbiAgICAgICAgdHlwZTogXCJmb3JtXCIsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgICBtZXRhOiBtZXRhLFxuICAgICAgICBjaWQ6IGNpZCxcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4gb25SZXBseShyZXNwKSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgIH1cbiAgfVxuXG4gIHVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIG9uQ29tcGxldGUpIHtcbiAgICBjb25zdCBqb2luQ291bnRBdFVwbG9hZCA9IHRoaXMuam9pbkNvdW50O1xuICAgIGNvbnN0IGlucHV0RWxzID0gTGl2ZVVwbG9hZGVyLmFjdGl2ZUZpbGVJbnB1dHMoZm9ybUVsKTtcbiAgICBsZXQgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPSBpbnB1dEVscy5sZW5ndGg7XG5cbiAgICAvLyBnZXQgZWFjaCBmaWxlIGlucHV0XG4gICAgaW5wdXRFbHMuZm9yRWFjaCgoaW5wdXRFbCkgPT4ge1xuICAgICAgY29uc3QgdXBsb2FkZXIgPSBuZXcgTGl2ZVVwbG9hZGVyKGlucHV0RWwsIHRoaXMsICgpID0+IHtcbiAgICAgICAgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKG51bUZpbGVJbnB1dHNJblByb2dyZXNzID09PSAwKSB7XG4gICAgICAgICAgb25Db21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW50cmllcyA9IHVwbG9hZGVyXG4gICAgICAgIC5lbnRyaWVzKClcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnRvUHJlZmxpZ2h0UGF5bG9hZCgpKTtcblxuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG51bUZpbGVJbnB1dHNJblByb2dyZXNzLS07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgcmVmOiBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJpZXM6IGVudHJpZXMsXG4gICAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmxvZyhcInVwbG9hZFwiLCAoKSA9PiBbXCJzZW5kaW5nIHByZWZsaWdodCByZXF1ZXN0XCIsIHBheWxvYWRdKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiYWxsb3dfdXBsb2FkXCIsIHBheWxvYWQpXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtcImdvdCBwcmVmbGlnaHQgcmVzcG9uc2VcIiwgcmVzcF0pO1xuICAgICAgICAgIC8vIHRoZSBwcmVmbGlnaHQgd2lsbCByZWplY3QgZW50cmllcyBiZXlvbmQgdGhlIG1heCBlbnRyaWVzXG4gICAgICAgICAgLy8gc28gd2UgZXJyb3IgYW5kIGNhbmNlbCBlbnRyaWVzIG9uIHRoZSBjbGllbnQgdGhhdCBhcmUgbWlzc2luZyBmcm9tIHRoZSByZXNwb25zZVxuICAgICAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3AuZW50cmllcyAmJiAhcmVzcC5lbnRyaWVzW2VudHJ5LnJlZl0pIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodChcbiAgICAgICAgICAgICAgICBlbnRyeS5yZWYsXG4gICAgICAgICAgICAgICAgXCJmYWlsZWQgcHJlZmxpZ2h0XCIsXG4gICAgICAgICAgICAgICAgdXBsb2FkZXIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gZm9yIGF1dG8gdXBsb2Fkcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgZW50cmllcyByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAvLyBmb3IgZm9ybSBzdWJtaXRzIHRoYXQgY29udGFpbiBpbnZhbGlkIGVudHJpZXNcbiAgICAgICAgICBpZiAocmVzcC5lcnJvciB8fCBPYmplY3Qua2V5cyhyZXNwLmVudHJpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy51bmRvUmVmcyhyZWYsIHBoeEV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3AuZXJyb3IgfHwgW107XG4gICAgICAgICAgICBlcnJvcnMubWFwKChbZW50cnlfcmVmLCByZWFzb25dKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmFpbGVkRW50cnlQcmVmbGlnaHQoZW50cnlfcmVmLCByZWFzb24sIHVwbG9hZGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvbkVycm9yID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5qb2luQ291bnQgPT09IGpvaW5Db3VudEF0VXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdXBsb2FkZXIuaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgdGhpcy5saXZlU29ja2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKFwiRmFpbGVkIHRvIHB1c2ggdXBsb2FkXCIsIGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodCh1cGxvYWRSZWYsIHJlYXNvbiwgdXBsb2FkZXIpIHtcbiAgICBpZiAodXBsb2FkZXIuaXNBdXRvVXBsb2FkKCkpIHtcbiAgICAgIC8vIHVwbG9hZFJlZiBtYXkgYmUgdG9wIGxldmVsIHVwbG9hZCBjb25maWcgcmVmIG9yIGVudHJ5IHJlZlxuICAgICAgY29uc3QgZW50cnkgPSB1cGxvYWRlclxuICAgICAgICAuZW50cmllcygpXG4gICAgICAgIC5maW5kKChlbnRyeSkgPT4gZW50cnkucmVmID09PSB1cGxvYWRSZWYudG9TdHJpbmcoKSk7XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5jYW5jZWwoKSk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtgZXJyb3IgZm9yIGVudHJ5ICR7dXBsb2FkUmVmfWAsIHJlYXNvbl0pO1xuICB9XG5cbiAgZGlzcGF0Y2hVcGxvYWRzKHRhcmdldEN0eCwgbmFtZSwgZmlsZXNPckJsb2JzKSB7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHRoaXMudGFyZ2V0Q3R4RWxlbWVudCh0YXJnZXRDdHgpIHx8IHRoaXMuZWw7XG4gICAgY29uc3QgaW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHModGFyZ2V0RWxlbWVudCkuZmlsdGVyKFxuICAgICAgKGVsKSA9PiBlbC5uYW1lID09PSBuYW1lLFxuICAgICk7XG4gICAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0Vycm9yKGBubyBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dHMubGVuZ3RoID4gMSkge1xuICAgICAgbG9nRXJyb3IoYGR1cGxpY2F0ZSBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KGlucHV0c1swXSwgUEhYX1RSQUNLX1VQTE9BRFMsIHtcbiAgICAgICAgZGV0YWlsOiB7IGZpbGVzOiBmaWxlc09yQmxvYnMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRhcmdldEN0eEVsZW1lbnQodGFyZ2V0Q3R4KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIGNvbnN0IFt0YXJnZXRdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmlkLCB0YXJnZXRDdHgpO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2UgaWYgKHRhcmdldEN0eCkge1xuICAgICAgcmV0dXJuIHRhcmdldEN0eDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVzaEZvcm1SZWNvdmVyeShvbGRGb3JtLCBuZXdGb3JtLCB0ZW1wbGF0ZURvbSwgY2FsbGJhY2spIHtcbiAgICAvLyB3ZSBhcmUgb25seSByZWNvdmVyaW5nIGZvcm1zIGluc2lkZSB0aGUgY3VycmVudCB2aWV3LCB0aGVyZWZvcmUgaXQgaXMgc2FmZSB0b1xuICAgIC8vIHNraXAgd2l0aGluT3duZXJzIGhlcmUgYW5kIGFsd2F5cyB1c2UgdGhpcyB3aGVuIHJlZmVycmluZyB0byB0aGUgdmlld1xuICAgIGNvbnN0IHBoeENoYW5nZSA9IHRoaXMuYmluZGluZyhcImNoYW5nZVwiKTtcbiAgICBjb25zdCBwaHhUYXJnZXQgPSBuZXdGb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpIHx8IG5ld0Zvcm07XG4gICAgY29uc3QgcGh4RXZlbnQgPVxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9BVVRPX1JFQ09WRVIpKSB8fFxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICBjb25zdCBpbnB1dHMgPSBBcnJheS5mcm9tKG9sZEZvcm0uZWxlbWVudHMpLmZpbHRlcihcbiAgICAgIChlbCkgPT4gRE9NLmlzRm9ybUlucHV0KGVsKSAmJiBlbC5uYW1lICYmICFlbC5oYXNBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICApO1xuICAgIGlmIChpbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG11c3QgY2xlYXIgdHJhY2tlZCB1cGxvYWRzIGJlZm9yZSByZWNvdmVyeSBhcyB0aGV5IG5vIGxvbmdlciBoYXZlIHZhbGlkIHJlZnNcbiAgICBpbnB1dHMuZm9yRWFjaChcbiAgICAgIChpbnB1dCkgPT5cbiAgICAgICAgaW5wdXQuaGFzQXR0cmlidXRlKFBIWF9VUExPQURfUkVGKSAmJiBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyhpbnB1dCksXG4gICAgKTtcbiAgICAvLyBwdXNoSW5wdXQgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGEgc291cmNlIGVsZW1lbnQgdGhhdCBpbml0aWF0ZWQgdGhlIGNoYW5nZTtcbiAgICAvLyBiZWNhdXNlIHRoaXMgaXMgbm90IHRoZSBjYXNlIHdoZW4gd2UgcmVjb3ZlciBmb3Jtcywgd2UgcHJvdmlkZSB0aGUgZmlyc3QgaW5wdXQgd2UgZmluZFxuICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzLmZpbmQoKGVsKSA9PiBlbC50eXBlICE9PSBcImhpZGRlblwiKSB8fCBpbnB1dHNbMF07XG5cbiAgICAvLyBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSB0YXJnZXRzLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVjb3ZlcnkgZXZlbnRzXG4gICAgLy8gYW5kIG9ubHkgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBhbGwgZXZlbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWRcbiAgICBsZXQgcGVuZGluZyA9IDA7XG4gICAgLy8gd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20sIHZpZXdFbClcbiAgICB0aGlzLndpdGhpblRhcmdldHMoXG4gICAgICBwaHhUYXJnZXQsXG4gICAgICAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQobmV3Rm9ybSwgdGFyZ2V0Q3R4KTtcbiAgICAgICAgcGVuZGluZysrO1xuICAgICAgICBsZXQgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpmb3JtLXJlY292ZXJ5XCIsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgc291cmNlRWxlbWVudDogb2xkRm9ybSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdGhpcywgaW5wdXQsIFtcbiAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfdGFyZ2V0OiBpbnB1dC5uYW1lLFxuICAgICAgICAgICAgdGFyZ2V0VmlldyxcbiAgICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICAgIG5ld0NpZDogY2lkLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgcGVuZGluZy0tO1xuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICB9LFxuICAgICAgdGVtcGxhdGVEb20sXG4gICAgKTtcbiAgfVxuXG4gIHB1c2hMaW5rUGF0Y2goZSwgaHJlZiwgdGFyZ2V0RWwsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgbGlua1JlZiA9IHRoaXMubGl2ZVNvY2tldC5zZXRQZW5kaW5nTGluayhocmVmKTtcbiAgICAvLyBvbmx5IGFkZCBsb2FkaW5nIHN0YXRlcyBpZiBldmVudCBpcyB0cnVzdGVkIChpdCB3YXMgdHJpZ2dlcmVkIGJ5IHVzZXIsIHN1Y2ggYXMgY2xpY2spIGFuZFxuICAgIC8vIGl0J3Mgbm90IGEgZm9yd2FyZC9iYWNrIG5hdmlnYXRpb24gZnJvbSBwb3BzdGF0ZVxuICAgIGNvbnN0IGxvYWRpbmcgPSBlLmlzVHJ1c3RlZCAmJiBlLnR5cGUgIT09IFwicG9wc3RhdGVcIjtcbiAgICBjb25zdCByZWZHZW4gPSB0YXJnZXRFbFxuICAgICAgPyAoKSA9PlxuICAgICAgICAgIHRoaXMucHV0UmVmKFxuICAgICAgICAgICAgW3sgZWw6IHRhcmdldEVsLCBsb2FkaW5nOiBsb2FkaW5nLCBsb2NrOiB0cnVlIH1dLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZmFsbGJhY2sgPSAoKSA9PiB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3Qod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGNvbnN0IHVybCA9IGhyZWYuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7bG9jYXRpb24ucHJvdG9jb2x9Ly8ke2xvY2F0aW9uLmhvc3R9JHtocmVmfWBcbiAgICAgIDogaHJlZjtcblxuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW4sIFwibGl2ZV9wYXRjaFwiLCB7IHVybCB9KS50aGVuKFxuICAgICAgKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICBpZiAocmVzcC5saW5rX3JlZGlyZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVwbGFjZU1haW4oaHJlZiwgbnVsbCwgY2FsbGJhY2ssIGxpbmtSZWYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saXZlU29ja2V0LmNvbW1pdFBlbmRpbmdMaW5rKGxpbmtSZWYpKSB7XG4gICAgICAgICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGxpbmtSZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgKHsgZXJyb3I6IF9lcnJvciwgdGltZW91dDogX3RpbWVvdXQgfSkgPT4gZmFsbGJhY2soKSxcbiAgICApO1xuICB9XG5cbiAgZ2V0Rm9ybXNGb3JSZWNvdmVyeSgpIHtcbiAgICAvLyBGb3JtIHJlY292ZXJ5IGlzIGNvbXBsZXggaW4gTGl2ZVZpZXc6XG4gICAgLy8gV2Ugd2FudCB0byBzdXBwb3J0IG5lc3RlZCBMaXZlVmlld3MgYW5kIGFsc28gcHJvdmlkZSBhIGdvb2QgdXNlciBleHBlcmllbmNlLlxuICAgIC8vIFRoZXJlZm9yZSwgd2hlbiB0aGUgY2hhbm5lbCByZWpvaW5zLCB3ZSBjb3B5IGFsbCBmb3JtcyB0aGF0IGFyZSBlbGlnaWJsZSBmb3JcbiAgICAvLyByZWNvdmVyeSB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGVtIGxhdGVyLlxuICAgIC8vIFdoeSBkbyB3ZSBuZWVkIHRvIGNvcHkgdGhlbT8gQmVjYXVzZSB3aGVuIHRoZSBtYWluIExpdmVWaWV3IGpvaW5zLCBhbnkgZm9ybXNcbiAgICAvLyBpbiBuZXN0ZWQgTGl2ZVZpZXdzIHdvdWxkIGJlIGxvc3QuXG4gICAgLy9cbiAgICAvLyBXZSBzaG91bGQgcmV3b3JrIHRoaXMgaW4gdGhlIGZ1dHVyZSB0byBzZXJpYWxpemUgdGhlIGZvcm0gcGF5bG9hZCBoZXJlXG4gICAgLy8gaW5zdGVhZCBvZiBjbG9uaW5nIHRoZSBET00gbm9kZXMsIGJ1dCBtYWtpbmcgdGhpcyB3b3JrIGNvcnJlY3RseSBpcyB0ZWRpb3VzLFxuICAgIC8vIGFzIHNlbmRpbmcgdGhlIGNvcnJlY3QgZm9ybSBwYXlsb2FkIHJlbGllcyBvbiBKUy5wdXNoIHRvIGV4dHJhY3QgdmFsdWVzXG4gICAgLy8gZnJvbSBKUyBjb21tYW5kcyAocGh4LWNoYW5nZT17SlMucHVzaChcImV2ZW50XCIsIHZhbHVlOiAuLi4sIHRhcmdldDogLi4uKX0pLFxuICAgIC8vIGFzIHdlbGwgYXMgdmlldy5wdXNoSW5wdXQsIHdoaWNoIGV4cGVjdHMgRE9NIGVsZW1lbnRzLlxuXG4gICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuXG4gICAgcmV0dXJuIERPTS5hbGwoXG4gICAgICBkb2N1bWVudCxcbiAgICAgIGAjJHtDU1MuZXNjYXBlKHRoaXMuaWQpfSBmb3JtWyR7cGh4Q2hhbmdlfV0sIFske1BIWF9URUxFUE9SVEVEX1JFRn09XCIke0NTUy5lc2NhcGUodGhpcy5pZCl9XCJdIGZvcm1bJHtwaHhDaGFuZ2V9XWAsXG4gICAgKVxuICAgICAgLmZpbHRlcigoZm9ybSkgPT4gZm9ybS5pZClcbiAgICAgIC5maWx0ZXIoKGZvcm0pID0+IGZvcm0uZWxlbWVudHMubGVuZ3RoID4gMClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChmb3JtKSA9PlxuICAgICAgICAgIGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgIT09IFwiaWdub3JlXCIsXG4gICAgICApXG4gICAgICAubWFwKChmb3JtKSA9PiB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgdGhlIHdob2xlIGZvcm0sIGFzIHJlbHlpbmcgb24gZm9ybS5lbGVtZW50cyBjYW4gbGVhZCB0b1xuICAgICAgICAvLyBzaXR1YXRpb25zIHdoZXJlIHdlIGhhdmVcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICA8Zm9ybT48ZmllbGRzZXQgZGlzYWJsZWQ+PGlucHV0IG5hbWU9XCJmb29cIiB2YWx1ZT1cImJhclwiPjwvZmllbGRzZXQ+PC9mb3JtPlxuICAgICAgICAvL1xuICAgICAgICAvLyBhbmQgZm9ybS5lbGVtZW50cyByZXR1cm5zIGJvdGggdGhlIGZpZWxkc2V0IGFuZCB0aGUgaW5wdXQgc2VwYXJhdGVseS5cbiAgICAgICAgLy8gQmVjYXVzZSB0aGUgZmllbGRzZXQgaXMgZGlzYWJsZWQsIHRoZSBpbnB1dCBzaG91bGQgTk9UIGJlIHNlbnQgdGhvdWdoLlxuICAgICAgICAvLyBXZSBjYW4gb25seSByZWxpYWJseSBzZXJpYWxpemUgdGhlIGZvcm0gYnkgY2xvbmluZyBpdCBmdWxseS5cbiAgICAgICAgY29uc3QgY2xvbmVkRm9ybSA9IGZvcm0uY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAvLyB3ZSBjYWxsIG1vcnBoZG9tIHRvIGNvcHkgYW55IHNwZWNpYWwgc3RhdGVcbiAgICAgICAgLy8gbGlrZSB0aGUgc2VsZWN0ZWQgb3B0aW9uIG9mIGEgPHNlbGVjdD4gZWxlbWVudDtcbiAgICAgICAgLy8gYW55IGFsc28gY29weSBvdmVyIHByaXZhdGVzICh3aGljaCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRvdWNoZWQgZmllbGRzKVxuICAgICAgICBtb3JwaGRvbShjbG9uZWRGb3JtLCBmb3JtLCB7XG4gICAgICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgICAgIERPTS5jb3B5UHJpdmF0ZXMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBuZXh0IHVwLCB3ZSBhbHNvIG5lZWQgdG8gY2xvbmUgYW55IGVsZW1lbnRzIHdpdGggZm9ybT1cImlkXCIgcGFyYW1ldGVyXG4gICAgICAgIGNvbnN0IGV4dGVybmFsRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgIGBbZm9ybT1cIiR7Zm9ybS5pZH1cIl1gLFxuICAgICAgICApO1xuICAgICAgICBBcnJheS5mcm9tKGV4dGVybmFsRWxlbWVudHMpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGZvcm0uY29udGFpbnMoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNsb25lZEVsID0gZWwuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgIG1vcnBoZG9tKGNsb25lZEVsLCBlbCk7XG4gICAgICAgICAgRE9NLmNvcHlQcml2YXRlcyhjbG9uZWRFbCwgZWwpO1xuICAgICAgICAgIGNsb25lZEZvcm0uYXBwZW5kQ2hpbGQoY2xvbmVkRWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsb25lZEZvcm07XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgoYWNjLCBmb3JtKSA9PiB7XG4gICAgICAgIGFjY1tmb3JtLmlkXSA9IGZvcm07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gIH1cblxuICBtYXliZVB1c2hDb21wb25lbnRzRGVzdHJveWVkKGRlc3Ryb3llZENJRHMpIHtcbiAgICBsZXQgd2lsbERlc3Ryb3lDSURzID0gZGVzdHJveWVkQ0lEcy5maWx0ZXIoKGNpZCkgPT4ge1xuICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbkVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGNvbXBvbmVudHMgZGVzdHJveWVkXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHdpbGxEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyB3ZSBtdXN0IHJlc2V0IHRoZSByZW5kZXIgY2hhbmdlIHRyYWNraW5nIGZvciBjaWRzIHRoYXRcbiAgICAgIC8vIGNvdWxkIGJlIGFkZGVkIGJhY2sgZnJvbSB0aGUgc2VydmVyIHNvIHdlIGRvbid0IHNraXAgdGhlbVxuICAgICAgd2lsbERlc3Ryb3lDSURzLmZvckVhY2goKGNpZCkgPT4gdGhpcy5yZW5kZXJlZC5yZXNldFJlbmRlcihjaWQpKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiY2lkc193aWxsX2Rlc3Ryb3lcIiwgeyBjaWRzOiB3aWxsRGVzdHJveUNJRHMgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgcGVuZGluZyB0cmFuc2l0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUgZGV0ZXJtaW5pbmdcbiAgICAgICAgICAvLyBpZiB0aGUgY2lkcyB3ZXJlIGFkZGVkIGJhY2sgdG8gdGhlIERPTSBpbiB0aGUgbWVhbnRpbWUgKCMzMTM5KVxuICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFNlZSBpZiBhbnkgb2YgdGhlIGNpZHMgd2Ugd2FudGVkIHRvIGRlc3Ryb3kgd2VyZSBhZGRlZCBiYWNrLFxuICAgICAgICAgICAgLy8gaWYgdGhleSB3ZXJlIGFkZGVkIGJhY2ssIHdlIGRvbid0IGFjdHVhbGx5IGRlc3Ryb3kgdGhlbS5cbiAgICAgICAgICAgIGxldCBjb21wbGV0ZWx5RGVzdHJveUNJRHMgPSB3aWxsRGVzdHJveUNJRHMuZmlsdGVyKChjaWQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGNvbXBsZXRlbHlEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImNpZHNfZGVzdHJveWVkXCIsIHtcbiAgICAgICAgICAgICAgICBjaWRzOiBjb21wbGV0ZWx5RGVzdHJveUNJRHMsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLnBydW5lQ0lEcyhyZXNwLmNpZHMpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKG9uRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gob25FcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3duc0VsZW1lbnQoZWwpIHtcbiAgICBsZXQgcGFyZW50Vmlld0VsID0gRE9NLmNsb3Nlc3RWaWV3RWwoZWwpO1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRCkgPT09IHRoaXMuaWQgfHxcbiAgICAgIChwYXJlbnRWaWV3RWwgJiYgcGFyZW50Vmlld0VsLmlkID09PSB0aGlzLmlkKSB8fFxuICAgICAgKCFwYXJlbnRWaWV3RWwgJiYgdGhpcy5pc0RlYWQpXG4gICAgKTtcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgc3VibWl0dGVyLCBvcHRzID0ge30pIHtcbiAgICBET00ucHV0UHJpdmF0ZShmb3JtLCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSk7XG4gICAgY29uc3QgaW5wdXRzID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKTtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSkpO1xuICAgIHRoaXMubGl2ZVNvY2tldC5ibHVyQWN0aXZlRWxlbWVudCh0aGlzKTtcbiAgICB0aGlzLnB1c2hGb3JtU3VibWl0KGZvcm0sIHRhcmdldEN0eCwgcGh4RXZlbnQsIHN1Ym1pdHRlciwgb3B0cywgKCkgPT4ge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGJpbmRpbmcoa2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhraW5kKTtcbiAgfVxuXG4gIC8vIHBoeC1wb3J0YWxcbiAgcHVzaFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5hZGQoaWQpO1xuICB9XG5cbiAgZHJvcFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5kZWxldGUoaWQpO1xuICB9XG5cbiAgZGVzdHJveVBvcnRhbEVsZW1lbnRzKCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBCSU5ESU5HX1BSRUZJWCxcbiAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgREVGQVVMVFMsXG4gIEZBSUxTQUZFX0pJVFRFUixcbiAgTE9BREVSX1RJTUVPVVQsXG4gIERJU0NPTk5FQ1RFRF9USU1FT1VULFxuICBNQVhfUkVMT0FEUyxcbiAgUEhYX0RFQk9VTkNFLFxuICBQSFhfRFJPUF9UQVJHRVQsXG4gIFBIWF9IQVNfRk9DVVNFRCxcbiAgUEhYX0tFWSxcbiAgUEhYX0xJTktfU1RBVEUsXG4gIFBIWF9MSVZFX0xJTkssXG4gIFBIWF9MVl9ERUJVRyxcbiAgUEhYX0xWX0xBVEVOQ1lfU0lNLFxuICBQSFhfTFZfUFJPRklMRSxcbiAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gIFBIWF9NQUlOLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9USFJPVFRMRSxcbiAgUEhYX1RSQUNLX1VQTE9BRFMsXG4gIFBIWF9TRVNTSU9OLFxuICBSRUxPQURfSklUVEVSX01JTixcbiAgUkVMT0FEX0pJVFRFUl9NQVgsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVMT0FEX1NUQVRVUyxcbiAgUEhYX1JVTlRJTUVfSE9PSyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgY2xvc3VyZSxcbiAgZGVidWcsXG4gIG1heWJlLFxuICBsb2dFcnJvcixcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBIb29rcyBmcm9tIFwiLi9ob29rc1wiO1xuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5pbXBvcnQgSlMgZnJvbSBcIi4vanNcIjtcbmltcG9ydCBqc0NvbW1hbmRzIGZyb20gXCIuL2pzX2NvbW1hbmRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VzZWRJbnB1dCA9IChlbCkgPT4gRE9NLmlzVXNlZElucHV0KGVsKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKHVybCwgcGh4U29ja2V0LCBvcHRzID0ge30pIHtcbiAgICB0aGlzLnVubG9hZGVkID0gZmFsc2U7XG4gICAgaWYgKCFwaHhTb2NrZXQgfHwgcGh4U29ja2V0LmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICBhIHBob2VuaXggU29ja2V0IG11c3QgYmUgcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgTGl2ZVNvY2tldCBjb25zdHJ1Y3Rvci4gRm9yIGV4YW1wbGU6XG5cbiAgICAgICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxuICAgICAgICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICAgICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnNvY2tldCA9IG5ldyBwaHhTb2NrZXQodXJsLCBvcHRzKTtcbiAgICB0aGlzLmJpbmRpbmdQcmVmaXggPSBvcHRzLmJpbmRpbmdQcmVmaXggfHwgQklORElOR19QUkVGSVg7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUob3B0cy5wYXJhbXMgfHwge30pO1xuICAgIHRoaXMudmlld0xvZ2dlciA9IG9wdHMudmlld0xvZ2dlcjtcbiAgICB0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzID0gb3B0cy5tZXRhZGF0YSB8fCB7fTtcbiAgICB0aGlzLmRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihjbG9uZShERUZBVUxUUyksIG9wdHMuZGVmYXVsdHMgfHwge30pO1xuICAgIHRoaXMucHJldkFjdGl2ZSA9IG51bGw7XG4gICAgdGhpcy5zaWxlbmNlZCA9IGZhbHNlO1xuICAgIHRoaXMubWFpbiA9IG51bGw7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgdGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5saW5rUmVmID0gMTtcbiAgICB0aGlzLnJvb3RzID0ge307XG4gICAgdGhpcy5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBjbG9uZSh3aW5kb3cubG9jYXRpb24pO1xuICAgIHRoaXMuaG9va3MgPSBvcHRzLmhvb2tzIHx8IHt9O1xuICAgIHRoaXMudXBsb2FkZXJzID0gb3B0cy51cGxvYWRlcnMgfHwge307XG4gICAgdGhpcy5sb2FkZXJUaW1lb3V0ID0gb3B0cy5sb2FkZXJUaW1lb3V0IHx8IExPQURFUl9USU1FT1VUO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZW91dCA9IG9wdHMuZGlzY29ubmVjdGVkVGltZW91dCB8fCBESVNDT05ORUNURURfVElNRU9VVDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gbnVsbDtcbiAgICB0aGlzLm1heFJlbG9hZHMgPSBvcHRzLm1heFJlbG9hZHMgfHwgTUFYX1JFTE9BRFM7XG4gICAgdGhpcy5yZWxvYWRKaXR0ZXJNaW4gPSBvcHRzLnJlbG9hZEppdHRlck1pbiB8fCBSRUxPQURfSklUVEVSX01JTjtcbiAgICB0aGlzLnJlbG9hZEppdHRlck1heCA9IG9wdHMucmVsb2FkSml0dGVyTWF4IHx8IFJFTE9BRF9KSVRURVJfTUFYO1xuICAgIHRoaXMuZmFpbHNhZmVKaXR0ZXIgPSBvcHRzLmZhaWxzYWZlSml0dGVyIHx8IEZBSUxTQUZFX0pJVFRFUjtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IG9wdHMubG9jYWxTdG9yYWdlIHx8IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgd2luZG93LnNlc3Npb25TdG9yYWdlO1xuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IGZhbHNlO1xuICAgIHRoaXMuYm91bmRFdmVudE5hbWVzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuYmxvY2tQaHhDaGFuZ2VXaGlsZUNvbXBvc2luZyA9XG4gICAgICBvcHRzLmJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3NpbmcgfHwgZmFsc2U7XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgdGhpcy5kb21DYWxsYmFja3MgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBqc1F1ZXJ5U2VsZWN0b3JBbGw6IG51bGwsXG4gICAgICAgIG9uUGF0Y2hTdGFydDogY2xvc3VyZSgpLFxuICAgICAgICBvblBhdGNoRW5kOiBjbG9zdXJlKCksXG4gICAgICAgIG9uTm9kZUFkZGVkOiBjbG9zdXJlKCksXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiBjbG9zdXJlKCksXG4gICAgICB9LFxuICAgICAgb3B0cy5kb20gfHwge30sXG4gICAgKTtcbiAgICB0aGlzLnRyYW5zaXRpb25zID0gbmV3IFRyYW5zaXRpb25TZXQoKTtcbiAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24gPVxuICAgICAgcGFyc2VJbnQodGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OKSkgfHwgMDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIChfZSkgPT4ge1xuICAgICAgdGhpcy51bmxvYWRlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVW5sb2FkZWQoKSkge1xuICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZSBhbmQgYnJvd3NlciBkb2VzIG5vdCBlbWl0IFwicGFnZXNob3dcIlxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBwdWJsaWNcblxuICB2ZXJzaW9uKCkge1xuICAgIHJldHVybiBMVl9WU047XG4gIH1cblxuICBpc1Byb2ZpbGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX1BST0ZJTEUpID09PSBcInRydWVcIjtcbiAgfVxuXG4gIGlzRGVidWdFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX0RFQlVHKSA9PT0gXCJ0cnVlXCI7XG4gIH1cblxuICBpc0RlYnVnRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfREVCVUcpID09PSBcImZhbHNlXCI7XG4gIH1cblxuICBlbmFibGVEZWJ1ZygpIHtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0RFQlVHLCBcInRydWVcIik7XG4gIH1cblxuICBlbmFibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9QUk9GSUxFLCBcInRydWVcIik7XG4gIH1cblxuICBkaXNhYmxlRGVidWcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9ERUJVRywgXCJmYWxzZVwiKTtcbiAgfVxuXG4gIGRpc2FibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9QUk9GSUxFKTtcbiAgfVxuXG4gIGVuYWJsZUxhdGVuY3lTaW0odXBwZXJCb3VuZE1zKSB7XG4gICAgdGhpcy5lbmFibGVEZWJ1ZygpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJsYXRlbmN5IHNpbXVsYXRvciBlbmFibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBicm93c2VyIHNlc3Npb24uIENhbGwgZGlzYWJsZUxhdGVuY3lTaW0oKSB0byBkaXNhYmxlXCIsXG4gICAgKTtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNLCB1cHBlckJvdW5kTXMpO1xuICB9XG5cbiAgZGlzYWJsZUxhdGVuY3lTaW0oKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSk7XG4gIH1cblxuICBnZXRMYXRlbmN5U2ltKCkge1xuICAgIGNvbnN0IHN0ciA9IHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfTEFURU5DWV9TSU0pO1xuICAgIHJldHVybiBzdHIgPyBwYXJzZUludChzdHIpIDogbnVsbDtcbiAgfVxuXG4gIGdldFNvY2tldCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ7XG4gIH1cblxuICBjb25uZWN0KCkge1xuICAgIC8vIGVuYWJsZSBkZWJ1ZyBieSBkZWZhdWx0IGlmIG9uIGxvY2FsaG9zdCBhbmQgbm90IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSBcImxvY2FsaG9zdFwiICYmICF0aGlzLmlzRGVidWdEaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLmVuYWJsZURlYnVnKCk7XG4gICAgfVxuICAgIGNvbnN0IGRvQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVzZXRSZWxvYWRTdGF0dXMoKTtcbiAgICAgIGlmICh0aGlzLmpvaW5Sb290Vmlld3MoKSkge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cygpO1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWFpbikge1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmpvaW5EZWFkVmlldygpO1xuICAgIH07XG4gICAgaWYgKFxuICAgICAgW1wiY29tcGxldGVcIiwgXCJsb2FkZWRcIiwgXCJpbnRlcmFjdGl2ZVwiXS5pbmRleE9mKGRvY3VtZW50LnJlYWR5U3RhdGUpID49IDBcbiAgICApIHtcbiAgICAgIGRvQ29ubmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiBkb0Nvbm5lY3QoKSk7XG4gICAgfVxuICB9XG5cbiAgZGlzY29ubmVjdChjYWxsYmFjaykge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lcik7XG4gICAgLy8gcmVtb3ZlIHRoZSBzb2NrZXQgY2xvc2UgbGlzdGVuZXIgdG8gYXZvaWQgdHJ5aW5nIHRvIGhhbmRsZVxuICAgIC8vIGEgc2VydmVyIGNsb3NlIGV2ZW50IHdoZW4gaXQgaXMgYWN0dWFsbHkgY2F1c2VkIGJ5IHVzIGRpc2Nvbm5lY3RpbmdcbiAgICBpZiAodGhpcy5zZXJ2ZXJDbG9zZVJlZikge1xuICAgICAgdGhpcy5zb2NrZXQub2ZmKHRoaXMuc2VydmVyQ2xvc2VSZWYpO1xuICAgICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0LmRpc2Nvbm5lY3QoY2FsbGJhY2spO1xuICB9XG5cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuc29ja2V0LnJlcGxhY2VUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgfVxuXG4gIGV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUgPSBudWxsKSB7XG4gICAgY29uc3QgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIsIHsgZGV0YWlsOiB7IHNvdXJjZUVsZW1lbnQ6IGVsIH0gfSk7XG4gICAgdGhpcy5vd25lcihlbCwgKHZpZXcpID0+IEpTLmV4ZWMoZSwgZXZlbnRUeXBlLCBlbmNvZGVkSlMsIHZpZXcsIGVsKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2pzX2NvbW1hbmRzXCIpLkxpdmVTb2NrZXRKU0NvbW1hbmRzfVxuICAgKi9cbiAganMoKSB7XG4gICAgcmV0dXJuIGpzQ29tbWFuZHModGhpcywgXCJqc1wiKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICB1bmxvYWQoKSB7XG4gICAgaWYgKHRoaXMudW5sb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWFpbiAmJiB0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgIHRoaXMubG9nKHRoaXMubWFpbiwgXCJzb2NrZXRcIiwgKCkgPT4gW1wiZGlzY29ubmVjdCBmb3IgcGFnZSBuYXZcIl0pO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3lBbGxWaWV3cygpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgdHJpZ2dlckRPTShraW5kLCBhcmdzKSB7XG4gICAgdGhpcy5kb21DYWxsYmFja3Nba2luZF0oLi4uYXJncyk7XG4gIH1cblxuICB0aW1lKG5hbWUsIGZ1bmMpIHtcbiAgICBpZiAoIXRoaXMuaXNQcm9maWxlRW5hYmxlZCgpIHx8ICFjb25zb2xlLnRpbWUpIHtcbiAgICAgIHJldHVybiBmdW5jKCk7XG4gICAgfVxuICAgIGNvbnNvbGUudGltZShuYW1lKTtcbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgY29uc29sZS50aW1lRW5kKG5hbWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBsb2codmlldywga2luZCwgbXNnQ2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy52aWV3TG9nZ2VyKSB7XG4gICAgICBjb25zdCBbbXNnLCBvYmpdID0gbXNnQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMudmlld0xvZ2dlcih2aWV3LCBraW5kLCBtc2csIG9iaik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IFttc2csIG9ial0gPSBtc2dDYWxsYmFjaygpO1xuICAgICAgZGVidWcodmlldywga2luZCwgbXNnLCBvYmopO1xuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RET01VcGRhdGUoY2FsbGJhY2spIHtcbiAgICB0aGlzLnRyYW5zaXRpb25zLmFmdGVyKGNhbGxiYWNrKTtcbiAgfVxuXG4gIGFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRBc3luY1RyYW5zaXRpb24ocHJvbWlzZSk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSk7XG4gIH1cblxuICBvbkNoYW5uZWwoY2hhbm5lbCwgZXZlbnQsIGNiKSB7XG4gICAgY2hhbm5lbC5vbihldmVudCwgKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGxhdGVuY3kgPSB0aGlzLmdldExhdGVuY3lTaW0oKTtcbiAgICAgIGlmICghbGF0ZW5jeSkge1xuICAgICAgICBjYihkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoZGF0YSksIGxhdGVuY3kpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkV2l0aEppdHRlcih2aWV3LCBsb2cpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGNvbnN0IG1pbk1zID0gdGhpcy5yZWxvYWRKaXR0ZXJNaW47XG4gICAgY29uc3QgbWF4TXMgPSB0aGlzLnJlbG9hZEppdHRlck1heDtcbiAgICBsZXQgYWZ0ZXJNcyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhNcyAtIG1pbk1zICsgMSkpICsgbWluTXM7XG4gICAgY29uc3QgdHJpZXMgPSBCcm93c2VyLnVwZGF0ZUxvY2FsKFxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UsXG4gICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICBDT05TRUNVVElWRV9SRUxPQURTLFxuICAgICAgMCxcbiAgICAgIChjb3VudCkgPT4gY291bnQgKyAxLFxuICAgICk7XG4gICAgaWYgKHRyaWVzID49IHRoaXMubWF4UmVsb2Fkcykge1xuICAgICAgYWZ0ZXJNcyA9IHRoaXMuZmFpbHNhZmVKaXR0ZXI7XG4gICAgfVxuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBpZiB2aWV3IGhhcyByZWNvdmVyZWQsIHN1Y2ggYXMgdHJhbnNwb3J0IHJlcGxhY2VkLCB0aGVuIGNhbmNlbFxuICAgICAgaWYgKHZpZXcuaXNEZXN0cm95ZWQoKSB8fCB2aWV3LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmlldy5kZXN0cm95KCk7XG4gICAgICBsb2dcbiAgICAgICAgPyBsb2coKVxuICAgICAgICA6IHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgICBgZW5jb3VudGVyZWQgJHt0cmllc30gY29uc2VjdXRpdmUgcmVsb2Fkc2AsXG4gICAgICAgICAgXSk7XG4gICAgICBpZiAodHJpZXMgPj0gdGhpcy5tYXhSZWxvYWRzKSB7XG4gICAgICAgIHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgYGV4Y2VlZGVkICR7dGhpcy5tYXhSZWxvYWRzfSBjb25zZWN1dGl2ZSByZWxvYWRzLiBFbnRlcmluZyBmYWlsc2FmZSBtb2RlYCxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5oYXNQZW5kaW5nTGluaygpKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMucGVuZGluZ0xpbms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSwgYWZ0ZXJNcyk7XG4gIH1cblxuICBnZXRIb29rRGVmaW5pdGlvbihuYW1lKSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1heWJlSW50ZXJuYWxIb29rKG5hbWUpIHx8XG4gICAgICB0aGlzLmhvb2tzW25hbWVdIHx8XG4gICAgICB0aGlzLm1heWJlUnVudGltZUhvb2sobmFtZSlcbiAgICApO1xuICB9XG5cbiAgbWF5YmVJbnRlcm5hbEhvb2sobmFtZSkge1xuICAgIHJldHVybiBuYW1lICYmIG5hbWUuc3RhcnRzV2l0aChcIlBob2VuaXguXCIpICYmIEhvb2tzW25hbWUuc3BsaXQoXCIuXCIpWzFdXTtcbiAgfVxuXG4gIG1heWJlUnVudGltZUhvb2sobmFtZSkge1xuICAgIGNvbnN0IHJ1bnRpbWVIb29rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gLFxuICAgICk7XG4gICAgaWYgKCFydW50aW1lSG9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgY2FsbGJhY2tzID0gd2luZG93W2BwaHhfaG9va18ke25hbWV9YF07XG4gICAgaWYgKCFjYWxsYmFja3MgfHwgdHlwZW9mIGNhbGxiYWNrcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBsb2dFcnJvcihcImEgcnVudGltZSBob29rIG11c3QgYmUgYSBmdW5jdGlvblwiLCBydW50aW1lSG9vayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvb2tEZWZpbml0b24gPSBjYWxsYmFja3MoKTtcbiAgICBpZiAoXG4gICAgICBob29rRGVmaW5pdG9uICYmXG4gICAgICAodHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwiZnVuY3Rpb25cIilcbiAgICApIHtcbiAgICAgIHJldHVybiBob29rRGVmaW5pdG9uO1xuICAgIH1cbiAgICBsb2dFcnJvcihcbiAgICAgIFwicnVudGltZSBob29rIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGhvb2sgY2FsbGJhY2tzIG9yIGFuIGluc3RhbmNlIG9mIFZpZXdIb29rXCIsXG4gICAgICBydW50aW1lSG9vayxcbiAgICApO1xuICB9XG5cbiAgaXNVbmxvYWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy51bmxvYWRlZDtcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpO1xuICB9XG5cbiAgZ2V0QmluZGluZ1ByZWZpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5iaW5kaW5nUHJlZml4O1xuICB9XG5cbiAgYmluZGluZyhraW5kKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0QmluZGluZ1ByZWZpeCgpfSR7a2luZH1gO1xuICB9XG5cbiAgY2hhbm5lbCh0b3BpYywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0LmNoYW5uZWwodG9waWMsIHBhcmFtcyk7XG4gIH1cblxuICBqb2luRGVhZFZpZXcoKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgaWYgKFxuICAgICAgYm9keSAmJlxuICAgICAgIXRoaXMuaXNQaHhWaWV3KGJvZHkpICYmXG4gICAgICAhdGhpcy5pc1BoeFZpZXcoZG9jdW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpXG4gICAgKSB7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy5uZXdSb290Vmlldyhib2R5KTtcbiAgICAgIHZpZXcuc2V0SHJlZih0aGlzLmdldEhyZWYoKSk7XG4gICAgICB2aWV3LmpvaW5EZWFkKCk7XG4gICAgICBpZiAoIXRoaXMubWFpbikge1xuICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgfVxuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHZpZXcuZXhlY05ld01vdW50ZWQoKTtcbiAgICAgICAgLy8gcmVzdG9yZSBzY3JvbGwgcG9zaXRpb24gd2hlbiBuYXZpZ2F0aW5nIGZyb20gYW4gZXh0ZXJuYWwgLyBub24tbGl2ZSBwYWdlXG4gICAgICAgIHRoaXMubWF5YmVTY3JvbGwoaGlzdG9yeS5zdGF0ZT8uc2Nyb2xsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGpvaW5Sb290Vmlld3MoKSB7XG4gICAgbGV0IHJvb3RzRm91bmQgPSBmYWxzZTtcbiAgICBET00uYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgJHtQSFhfVklFV19TRUxFQ1RPUn06bm90KFske1BIWF9QQVJFTlRfSUR9XSlgLFxuICAgICAgKHJvb3RFbCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0Um9vdEJ5SWQocm9vdEVsLmlkKSkge1xuICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLm5ld1Jvb3RWaWV3KHJvb3RFbCk7XG4gICAgICAgICAgLy8gc3RpY2tpZXMgY2Fubm90IGJlIG1vdW50ZWQgYXQgdGhlIHJvdXRlciBhbmQgdGhlcmVmb3JlIHNob3VsZCBub3RcbiAgICAgICAgICAvLyBnZXQgYSBocmVmIHNldCBvbiB0aGVtXG4gICAgICAgICAgaWYgKCFET00uaXNQaHhTdGlja3kocm9vdEVsKSkge1xuICAgICAgICAgICAgdmlldy5zZXRIcmVmKHRoaXMuZ2V0SHJlZigpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmlldy5qb2luKCk7XG4gICAgICAgICAgaWYgKHJvb3RFbC5oYXNBdHRyaWJ1dGUoUEhYX01BSU4pKSB7XG4gICAgICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByb290c0ZvdW5kID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcm9vdHNGb3VuZDtcbiAgfVxuXG4gIHJlZGlyZWN0KHRvLCBmbGFzaCwgcmVsb2FkVG9rZW4pIHtcbiAgICBpZiAocmVsb2FkVG9rZW4pIHtcbiAgICAgIEJyb3dzZXIuc2V0Q29va2llKFBIWF9SRUxPQURfU1RBVFVTLCByZWxvYWRUb2tlbiwgNjApO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZCgpO1xuICAgIEJyb3dzZXIucmVkaXJlY3QodG8sIGZsYXNoKTtcbiAgfVxuXG4gIHJlcGxhY2VNYWluKFxuICAgIGhyZWYsXG4gICAgZmxhc2gsXG4gICAgY2FsbGJhY2sgPSBudWxsLFxuICAgIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpLFxuICApIHtcbiAgICBjb25zdCBsaXZlUmVmZXJlciA9IHRoaXMuY3VycmVudExvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IHRoaXMub3V0Z29pbmdNYWluRWwgfHwgdGhpcy5tYWluLmVsO1xuXG4gICAgY29uc3Qgc3RpY2tpZXMgPSBET00uZmluZFBoeFN0aWNreShkb2N1bWVudCkgfHwgW107XG4gICAgY29uc3QgcmVtb3ZlRWxzID0gRE9NLmFsbChcbiAgICAgIHRoaXMub3V0Z29pbmdNYWluRWwsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFwicmVtb3ZlXCIpfV1gLFxuICAgICkuZmlsdGVyKChlbCkgPT4gIURPTS5pc0NoaWxkT2ZBbnkoZWwsIHN0aWNraWVzKSk7XG5cbiAgICBjb25zdCBuZXdNYWluRWwgPSBET00uY2xvbmVOb2RlKHRoaXMub3V0Z29pbmdNYWluRWwsIFwiXCIpO1xuICAgIHRoaXMubWFpbi5zaG93TG9hZGVyKHRoaXMubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5tYWluLmRlc3Ryb3koKTtcblxuICAgIHRoaXMubWFpbiA9IHRoaXMubmV3Um9vdFZpZXcobmV3TWFpbkVsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMubWFpbi5zZXRSZWRpcmVjdChocmVmKTtcbiAgICB0aGlzLnRyYW5zaXRpb25SZW1vdmVzKHJlbW92ZUVscyk7XG4gICAgdGhpcy5tYWluLmpvaW4oKGpvaW5Db3VudCwgb25Eb25lKSA9PiB7XG4gICAgICBpZiAoam9pbkNvdW50ID09PSAxICYmIHRoaXMuY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZikpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAvLyByZW1vdmUgcGh4LXJlbW92ZSBlbHMgcmlnaHQgYmVmb3JlIHdlIHJlcGxhY2UgdGhlIG1haW4gZWxlbWVudFxuICAgICAgICAgIHJlbW92ZUVscy5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuICAgICAgICAgIHN0aWNraWVzLmZvckVhY2goKGVsKSA9PiBuZXdNYWluRWwuYXBwZW5kQ2hpbGQoZWwpKTtcbiAgICAgICAgICB0aGlzLm91dGdvaW5nTWFpbkVsLnJlcGxhY2VXaXRoKG5ld01haW5FbCk7XG4gICAgICAgICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobGlua1JlZik7XG4gICAgICAgICAgb25Eb25lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJhbnNpdGlvblJlbW92ZXMoZWxlbWVudHMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVtb3ZlQXR0ciA9IHRoaXMuYmluZGluZyhcInJlbW92ZVwiKTtcbiAgICBjb25zdCBzaWxlbmNlRXZlbnRzID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgLy8gcHJldmVudCBhbGwgbGlzdGVuZXJzIHdlIGNhcmUgYWJvdXQgZnJvbSBidWJibGluZyB0byB3aW5kb3dcbiAgICAgIC8vIHNpbmNlIHdlIGFyZSByZW1vdmluZyB0aGUgZWxlbWVudFxuICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBzaWxlbmNlRXZlbnRzLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUocmVtb3ZlQXR0ciksIFwicmVtb3ZlXCIpO1xuICAgIH0pO1xuICAgIC8vIHJlbW92ZSB0aGUgc2lsZW5jZWQgbGlzdGVuZXJzIHdoZW4gdHJhbnNpdGlvbnMgYXJlIGRvbmUgaW5jYXNlIHRoZSBlbGVtZW50IGlzIHJlLXVzZWRcbiAgICAvLyBhbmQgY2FsbCBjYWxsZXIncyBjYWxsYmFjayBhcyBzb29uIGFzIHdlIGFyZSBkb25lIHdpdGggdHJhbnNpdGlvbnNcbiAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIHNpbGVuY2VFdmVudHMsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBpc1BoeFZpZXcoZWwpIHtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgIT09IG51bGw7XG4gIH1cblxuICBuZXdSb290VmlldyhlbCwgZmxhc2gsIGxpdmVSZWZlcmVyKSB7XG4gICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLCBudWxsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMucm9vdHNbdmlldy5pZF0gPSB2aWV3O1xuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgb3duZXIoY2hpbGRFbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgdmlldztcbiAgICBjb25zdCB2aWV3RWwgPSBET00uY2xvc2VzdFZpZXdFbChjaGlsZEVsKTtcbiAgICBpZiAodmlld0VsKSB7XG4gICAgICAvLyBpdCBjYW4gaGFwcGVuIHRoYXQgd2UgZmluZCBhIHZpZXcgdGhhdCBpcyBhbHJlYWR5IGRlc3Ryb3llZDtcbiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBETyBOT1Qgd2FudCB0byBmYWxsYmFjayB0byB0aGUgbWFpbiBlbGVtZW50XG4gICAgICB2aWV3ID0gdGhpcy5nZXRWaWV3QnlFbCh2aWV3RWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aWV3ID0gdGhpcy5tYWluO1xuICAgIH1cbiAgICByZXR1cm4gdmlldyAmJiBjYWxsYmFjayA/IGNhbGxiYWNrKHZpZXcpIDogdmlldztcbiAgfVxuXG4gIHdpdGhpbk93bmVycyhjaGlsZEVsLCBjYWxsYmFjaykge1xuICAgIHRoaXMub3duZXIoY2hpbGRFbCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIGNoaWxkRWwpKTtcbiAgfVxuXG4gIGdldFZpZXdCeUVsKGVsKSB7XG4gICAgY29uc3Qgcm9vdElkID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9ST09UX0lEKTtcbiAgICByZXR1cm4gbWF5YmUodGhpcy5nZXRSb290QnlJZChyb290SWQpLCAocm9vdCkgPT5cbiAgICAgIHJvb3QuZ2V0RGVzY2VuZGVudEJ5RWwoZWwpLFxuICAgICk7XG4gIH1cblxuICBnZXRSb290QnlJZChpZCkge1xuICAgIHJldHVybiB0aGlzLnJvb3RzW2lkXTtcbiAgfVxuXG4gIGRlc3Ryb3lBbGxWaWV3cygpIHtcbiAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucm9vdHMpIHtcbiAgICAgIHRoaXMucm9vdHNbaWRdLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW2lkXTtcbiAgICB9XG4gICAgdGhpcy5tYWluID0gbnVsbDtcbiAgfVxuXG4gIGRlc3Ryb3lWaWV3QnlFbChlbCkge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmdldFJvb3RCeUlkKGVsLmdldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCkpO1xuICAgIGlmIChyb290ICYmIHJvb3QuaWQgPT09IGVsLmlkKSB7XG4gICAgICByb290LmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW3Jvb3QuaWRdO1xuICAgIH0gZWxzZSBpZiAocm9vdCkge1xuICAgICAgcm9vdC5kZXN0cm95RGVzY2VuZGVudChlbC5pZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZlRWxlbWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGRyb3BBY3RpdmVFbGVtZW50KHZpZXcpIHtcbiAgICBpZiAodGhpcy5wcmV2QWN0aXZlICYmIHZpZXcub3duc0VsZW1lbnQodGhpcy5wcmV2QWN0aXZlKSkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXN0b3JlUHJldmlvdXNseUFjdGl2ZUZvY3VzKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMucHJldkFjdGl2ZSAmJlxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgYmx1ckFjdGl2ZUVsZW1lbnQoKSB7XG4gICAgdGhpcy5wcmV2QWN0aXZlID0gdGhpcy5nZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmJsdXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZGVhZD86IGJvb2xlYW59fSBbb3B0aW9ucz17fV1cbiAgICovXG4gIGJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IHRydWU7XG4gICAgLy8gZW50ZXIgZmFpbHNhZmUgcmVsb2FkIGlmIHNlcnZlciBoYXMgZ29uZSBhd2F5IGludGVudGlvbmFsbHksIHN1Y2ggYXMgXCJkaXNjb25uZWN0XCIgYnJvYWRjYXN0XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGV2ZW50KSA9PiB7XG4gICAgICAvLyBmYWlsc2FmZSByZWxvYWQgaWYgbm9ybWFsIGNsb3N1cmUgYW5kIHdlIHN0aWxsIGhhdmUgYSBtYWluIExWXG4gICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuY29kZSA9PT0gMTAwMCAmJiB0aGlzLm1haW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkV2l0aEppdHRlcih0aGlzLm1haW4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHt9KTsgLy8gZW5zdXJlIGFsbCBjbGljayBldmVudHMgYnViYmxlIGZvciBtb2JpbGUgU2FmYXJpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBhZ2VzaG93XCIsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5wZXJzaXN0ZWQpIHtcbiAgICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZVxuICAgICAgICAgIHRoaXMuZ2V0U29ja2V0KCkuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHRoaXMud2l0aFBhZ2VMb2FkaW5nKHsgdG86IHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBraW5kOiBcInJlZGlyZWN0XCIgfSk7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kTmF2KCk7XG4gICAgfVxuICAgIHRoaXMuYmluZENsaWNrcygpO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kRm9ybXMoKTtcbiAgICB9XG4gICAgdGhpcy5iaW5kKFxuICAgICAgeyBrZXl1cDogXCJrZXl1cFwiLCBrZXlkb3duOiBcImtleWRvd25cIiB9LFxuICAgICAgKGUsIHR5cGUsIHZpZXcsIHRhcmdldEVsLCBwaHhFdmVudCwgX3BoeFRhcmdldCkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaEtleSA9IHRhcmdldEVsLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0tFWSkpO1xuICAgICAgICBjb25zdCBwcmVzc2VkS2V5ID0gZS5rZXkgJiYgZS5rZXkudG9Mb3dlckNhc2UoKTsgLy8gY2hyb21lIGNsaWNrZWQgYXV0b2NvbXBsZXRlcyBzZW5kIGEga2V5ZG93biB3aXRob3V0IGtleVxuICAgICAgICBpZiAobWF0Y2hLZXkgJiYgbWF0Y2hLZXkudG9Mb3dlckNhc2UoKSAhPT0gcHJlc3NlZEtleSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICBKUy5leGVjKGUsIHR5cGUsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXRFbCwgW1wicHVzaFwiLCB7IGRhdGEgfV0pO1xuICAgICAgfSxcbiAgICApO1xuICAgIHRoaXMuYmluZChcbiAgICAgIHsgYmx1cjogXCJmb2N1c291dFwiLCBmb2N1czogXCJmb2N1c2luXCIgfSxcbiAgICAgIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgcGh4RXZlbnQsIHBoeFRhcmdldCkgPT4ge1xuICAgICAgICBpZiAoIXBoeFRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmJpbmQoXG4gICAgICB7IGJsdXI6IFwiYmx1clwiLCBmb2N1czogXCJmb2N1c1wiIH0sXG4gICAgICAoZSwgdHlwZSwgdmlldywgdGFyZ2V0RWwsIHBoeEV2ZW50LCBwaHhUYXJnZXQpID0+IHtcbiAgICAgICAgLy8gYmx1ciBhbmQgZm9jdXMgYXJlIHRyaWdnZXJlZCBvbiBkb2N1bWVudCBhbmQgd2luZG93LiBEaXNjYXJkIG9uZSB0byBhdm9pZCBkdXBzXG4gICAgICAgIGlmIChwaHhUYXJnZXQgPT09IFwid2luZG93XCIpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ldmVudE1ldGEodHlwZSwgZSwgdGFyZ2V0RWwpO1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLm9uKFwiZHJhZ292ZXJcIiwgKGUpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG4gICAgdGhpcy5vbihcImRyb3BcIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BUYXJnZXRJZCA9IG1heWJlKFxuICAgICAgICBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgdGhpcy5iaW5kaW5nKFBIWF9EUk9QX1RBUkdFVCkpLFxuICAgICAgICAodHJ1ZVRhcmdldCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0cnVlVGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgZHJvcFRhcmdldCA9IGRyb3BUYXJnZXRJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkcm9wVGFyZ2V0SWQpO1xuICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGUuZGF0YVRyYW5zZmVyLmZpbGVzIHx8IFtdKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWRyb3BUYXJnZXQgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgfHxcbiAgICAgICAgZHJvcFRhcmdldC5kaXNhYmxlZCB8fFxuICAgICAgICBmaWxlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0LmZpbGVzIGluc3RhbmNlb2YgRmlsZUxpc3QpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBMaXZlVXBsb2FkZXIudHJhY2tGaWxlcyhkcm9wVGFyZ2V0LCBmaWxlcywgZS5kYXRhVHJhbnNmZXIpO1xuICAgICAgZHJvcFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gICAgdGhpcy5vbihQSFhfVFJBQ0tfVVBMT0FEUywgKGUpID0+IHtcbiAgICAgIGNvbnN0IHVwbG9hZFRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgaWYgKCFET00uaXNVcGxvYWRJbnB1dCh1cGxvYWRUYXJnZXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRldGFpbC5maWxlcyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAoZikgPT4gZiBpbnN0YW5jZW9mIEZpbGUgfHwgZiBpbnN0YW5jZW9mIEJsb2IsXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLnRyYWNrRmlsZXModXBsb2FkVGFyZ2V0LCBmaWxlcyk7XG4gICAgICB1cGxvYWRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZXZlbnRNZXRhKGV2ZW50TmFtZSwgZSwgdGFyZ2V0RWwpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMubWV0YWRhdGFDYWxsYmFja3NbZXZlbnROYW1lXTtcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhlLCB0YXJnZXRFbCkgOiB7fTtcbiAgfVxuXG4gIHNldFBlbmRpbmdMaW5rKGhyZWYpIHtcbiAgICB0aGlzLmxpbmtSZWYrKztcbiAgICB0aGlzLnBlbmRpbmdMaW5rID0gaHJlZjtcbiAgICB0aGlzLnJlc2V0UmVsb2FkU3RhdHVzKCk7XG4gICAgcmV0dXJuIHRoaXMubGlua1JlZjtcbiAgfVxuXG4gIC8vIGFueXRpbWUgd2UgYXJlIG5hdmlnYXRpbmcgb3IgY29ubmVjdGluZywgZHJvcCByZWxvYWQgY29va2llIGluIGNhc2VcbiAgLy8gd2UgaXNzdWUgdGhlIGNvb2tpZSBidXQgdGhlIG5leHQgcmVxdWVzdCB3YXMgaW50ZXJydXB0ZWQgYW5kIHRoZSBzZXJ2ZXIgbmV2ZXIgZHJvcHBlZCBpdFxuICByZXNldFJlbG9hZFN0YXR1cygpIHtcbiAgICBCcm93c2VyLmRlbGV0ZUNvb2tpZShQSFhfUkVMT0FEX1NUQVRVUyk7XG4gIH1cblxuICBjb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSB7XG4gICAgaWYgKHRoaXMubGlua1JlZiAhPT0gbGlua1JlZikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhyZWYgPSB0aGlzLnBlbmRpbmdMaW5rO1xuICAgICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXRIcmVmKCkge1xuICAgIHJldHVybiB0aGlzLmhyZWY7XG4gIH1cblxuICBoYXNQZW5kaW5nTGluaygpIHtcbiAgICByZXR1cm4gISF0aGlzLnBlbmRpbmdMaW5rO1xuICB9XG5cbiAgYmluZChldmVudHMsIGNhbGxiYWNrKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiBldmVudHMpIHtcbiAgICAgIGNvbnN0IGJyb3dzZXJFdmVudE5hbWUgPSBldmVudHNbZXZlbnRdO1xuXG4gICAgICB0aGlzLm9uKGJyb3dzZXJFdmVudE5hbWUsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmcoZXZlbnQpO1xuICAgICAgICBjb25zdCB3aW5kb3dCaW5kaW5nID0gdGhpcy5iaW5kaW5nKGB3aW5kb3ctJHtldmVudH1gKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGh4RXZlbnQgPVxuICAgICAgICAgIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoYmluZGluZyk7XG4gICAgICAgIGlmICh0YXJnZXRQaHhFdmVudCkge1xuICAgICAgICAgIHRoaXMuZGVib3VuY2UoZS50YXJnZXQsIGUsIGJyb3dzZXJFdmVudE5hbWUsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZS50YXJnZXQsIHRhcmdldFBoeEV2ZW50LCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHt3aW5kb3dCaW5kaW5nfV1gLCAoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBoeEV2ZW50ID0gZWwuZ2V0QXR0cmlidXRlKHdpbmRvd0JpbmRpbmcpO1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZShlbCwgZSwgYnJvd3NlckV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZWwsIHBoeEV2ZW50LCBcIndpbmRvd1wiKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYmluZENsaWNrcygpIHtcbiAgICB0aGlzLm9uKFwibW91c2Vkb3duXCIsIChlKSA9PiAodGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IGUudGFyZ2V0KSk7XG4gICAgdGhpcy5iaW5kQ2xpY2soXCJjbGlja1wiLCBcImNsaWNrXCIpO1xuICB9XG5cbiAgYmluZENsaWNrKGV2ZW50TmFtZSwgYmluZGluZ05hbWUpIHtcbiAgICBjb25zdCBjbGljayA9IHRoaXMuYmluZGluZyhiaW5kaW5nTmFtZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBsZXQgdGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLy8gYSBzeW50aGV0aWMgY2xpY2sgZXZlbnQgKGRldGFpbCAwKSB3aWxsIG5vdCBoYXZlIGNhdXNlZCBhIG1vdXNlZG93biBldmVudCxcbiAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSBjbGlja1N0YXJ0ZWRBdFRhcmdldCBpcyBzdGFsZVxuICAgICAgICBpZiAoZS5kZXRhaWwgPT09IDApIHRoaXMuY2xpY2tTdGFydGVkQXRUYXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgY29uc3QgY2xpY2tTdGFydGVkQXRUYXJnZXQgPSB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0IHx8IGUudGFyZ2V0O1xuICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyB0aGUgdGFyZ2V0IGZvciB0aGUgY2xpY2sgZXZlbnQsIHdlIGFsd2F5cyB3YW50IHRvXG4gICAgICAgIC8vIHVzZSB0aGUgYWN0dWFsIGV2ZW50IHRhcmdldCwgc2VlICMzMzcyXG4gICAgICAgIHRhcmdldCA9IGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCBjbGljayk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXRUYXJnZXQpO1xuICAgICAgICB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgY29uc3QgcGh4RXZlbnQgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShjbGljayk7XG4gICAgICAgIGlmICghcGh4RXZlbnQpIHtcbiAgICAgICAgICBpZiAoRE9NLmlzTmV3UGFnZUNsaWNrKGUsIHdpbmRvdy5sb2NhdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub29wIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGF3YWl0aW5nIGFuIGFjayBmb3IgdGhpcyBlbCBhbHJlYWR5XG4gICAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKFBIWF9SRUZfU1JDKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVib3VuY2UodGFyZ2V0LCBlLCBcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyh0YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgICBKUy5leGVjKGUsIFwiY2xpY2tcIiwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldCwgW1xuICAgICAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICAgICAgeyBkYXRhOiB0aGlzLmV2ZW50TWV0YShcImNsaWNrXCIsIGUsIHRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXQpIHtcbiAgICBjb25zdCBwaHhDbGlja0F3YXkgPSB0aGlzLmJpbmRpbmcoXCJjbGljay1hd2F5XCIpO1xuICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHtwaHhDbGlja0F3YXl9XWAsIChlbCkgPT4ge1xuICAgICAgaWYgKCEoZWwuaXNTYW1lTm9kZShjbGlja1N0YXJ0ZWRBdCkgfHwgZWwuY29udGFpbnMoY2xpY2tTdGFydGVkQXQpKSkge1xuICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICBjb25zdCBwaHhFdmVudCA9IGVsLmdldEF0dHJpYnV0ZShwaHhDbGlja0F3YXkpO1xuICAgICAgICAgIGlmIChKUy5pc1Zpc2libGUoZWwpICYmIEpTLmlzSW5WaWV3cG9ydChlbCkpIHtcbiAgICAgICAgICAgIEpTLmV4ZWMoZSwgXCJjbGlja1wiLCBwaHhFdmVudCwgdmlldywgZWwsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgZGF0YTogdGhpcy5ldmVudE1ldGEoXCJjbGlja1wiLCBlLCBlLnRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kTmF2KCkge1xuICAgIGlmICghQnJvd3Nlci5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IFwibWFudWFsXCI7XG4gICAgfVxuICAgIGxldCBzY3JvbGxUaW1lciA9IG51bGw7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgKF9lKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZXIpO1xuICAgICAgc2Nyb2xsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PlxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHsgc2Nyb2xsOiB3aW5kb3cuc2Nyb2xsWSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBvcHN0YXRlXCIsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHR5cGUsIGJhY2tUeXBlLCBpZCwgc2Nyb2xsLCBwb3NpdGlvbiB9ID0gZXZlbnQuc3RhdGUgfHwge307XG4gICAgICAgIGNvbnN0IGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcblxuICAgICAgICAvLyBDb21wYXJlIHBvc2l0aW9ucyB0byBkZXRlcm1pbmUgZGlyZWN0aW9uXG4gICAgICAgIGNvbnN0IGlzRm9yd2FyZCA9IHBvc2l0aW9uID4gdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uO1xuICAgICAgICBjb25zdCBuYXZUeXBlID0gaXNGb3J3YXJkID8gdHlwZSA6IGJhY2tUeXBlIHx8IHR5cGU7XG5cbiAgICAgICAgLy8gVXBkYXRlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uID0gcG9zaXRpb24gfHwgMDtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgIFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OLFxuICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICApO1xuXG4gICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgIHBhdGNoOiBuYXZUeXBlID09PSBcInBhdGNoXCIsXG4gICAgICAgICAgICBwb3A6IHRydWUsXG4gICAgICAgICAgICBkaXJlY3Rpb246IGlzRm9yd2FyZCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tYXliZVNjcm9sbChzY3JvbGwpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5tYWluLmlzQ29ubmVjdGVkKCkgJiZcbiAgICAgICAgICAgIG5hdlR5cGUgPT09IFwicGF0Y2hcIiAmJlxuICAgICAgICAgICAgaWQgPT09IHRoaXMubWFpbi5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5tYWluLnB1c2hMaW5rUGF0Y2goZXZlbnQsIGhyZWYsIG51bGwsIGNhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWFpbihocmVmLCBudWxsLCBjYWxsYmFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJjbGlja1wiLFxuICAgICAgKGUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gY2xvc2VzdFBoeEJpbmRpbmcoZS50YXJnZXQsIFBIWF9MSVZFX0xJTkspO1xuICAgICAgICBjb25zdCB0eXBlID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJVkVfTElOSyk7XG4gICAgICAgIGlmICghdHlwZSB8fCAhdGhpcy5pc0Nvbm5lY3RlZCgpIHx8ICF0aGlzLm1haW4gfHwgRE9NLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB3cmFwcGluZyBhbiBTVkcgZWxlbWVudCBpbiBhbiBhbmNob3IgdGFnLCB0aGUgaHJlZiBjYW4gYmUgYW4gU1ZHQW5pbWF0ZWRTdHJpbmdcbiAgICAgICAgY29uc3QgaHJlZiA9XG4gICAgICAgICAgdGFyZ2V0LmhyZWYgaW5zdGFuY2VvZiBTVkdBbmltYXRlZFN0cmluZ1xuICAgICAgICAgICAgPyB0YXJnZXQuaHJlZi5iYXNlVmFsXG4gICAgICAgICAgICA6IHRhcmdldC5ocmVmO1xuXG4gICAgICAgIGNvbnN0IGxpbmtTdGF0ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJTktfU1RBVEUpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IC8vIGRvIG5vdCBidWJibGUgY2xpY2sgdG8gcmVndWxhciBwaHgtY2xpY2sgYmluZGluZ3NcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0xpbmsgPT09IGhyZWYpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlID09PSBcInBhdGNoXCIpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgbnVsbCwgdGFyZ2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZXhwZWN0ZWQgJHtQSFhfTElWRV9MSU5LfSB0byBiZSBcInBhdGNoXCIgb3IgXCJyZWRpcmVjdFwiLCBnb3Q6ICR7dHlwZX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGh4Q2xpY2sgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNsaWNrXCIpKTtcbiAgICAgICAgICBpZiAocGh4Q2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB0aGlzLmV4ZWNKUyh0YXJnZXQsIHBoeENsaWNrLCBcImNsaWNrXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBtYXliZVNjcm9sbChzY3JvbGwpIHtcbiAgICBpZiAodHlwZW9mIHNjcm9sbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHNjcm9sbCk7XG4gICAgICB9KTsgLy8gdGhlIGJvZHkgbmVlZHMgdG8gcmVuZGVyIGJlZm9yZSB3ZSBzY3JvbGwuXG4gICAgfVxuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChldmVudCwgcGF5bG9hZCA9IHt9KSB7XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBgcGh4OiR7ZXZlbnR9YCwgeyBkZXRhaWw6IHBheWxvYWQgfSk7XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50cyhldmVudHMpIHtcbiAgICBldmVudHMuZm9yRWFjaCgoW2V2ZW50LCBwYXlsb2FkXSkgPT4gdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LCBwYXlsb2FkKSk7XG4gIH1cblxuICB3aXRoUGFnZUxvYWRpbmcoaW5mbywgY2FsbGJhY2spIHtcbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7IGRldGFpbDogaW5mbyB9KTtcbiAgICBjb25zdCBkb25lID0gKCkgPT5cbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgeyBkZXRhaWw6IGluZm8gfSk7XG4gICAgcmV0dXJuIGNhbGxiYWNrID8gY2FsbGJhY2soZG9uZSkgOiBkb25lO1xuICB9XG5cbiAgcHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldEVsKSB7XG4gICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbi5pc01haW4oKSkge1xuICAgICAgcmV0dXJuIEJyb3dzZXIucmVkaXJlY3QoaHJlZik7XG4gICAgfVxuXG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJwYXRjaFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLm1haW4ucHVzaExpbmtQYXRjaChlLCBocmVmLCB0YXJnZXRFbCwgKGxpbmtSZWYpID0+IHtcbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBoaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmID0gdGhpcy5zZXRQZW5kaW5nTGluayhocmVmKSkge1xuICAgIGlmICghdGhpcy5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluY3JlbWVudCBwb3NpdGlvbiBmb3IgbmV3IHN0YXRlXG4gICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uKys7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24udG9TdHJpbmcoKSxcbiAgICApO1xuXG4gICAgLy8gc3RvcmUgdGhlIHR5cGUgZm9yIGJhY2sgbmF2aWdhdGlvblxuICAgIEJyb3dzZXIudXBkYXRlQ3VycmVudFN0YXRlKChzdGF0ZSkgPT4gKHsgLi4uc3RhdGUsIGJhY2tUeXBlOiBcInBhdGNoXCIgfSkpO1xuXG4gICAgQnJvd3Nlci5wdXNoU3RhdGUoXG4gICAgICBsaW5rU3RhdGUsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMubWFpbi5pZCxcbiAgICAgICAgcG9zaXRpb246IHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0sXG4gICAgICBocmVmLFxuICAgICk7XG5cbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4Om5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyBwYXRjaDogdHJ1ZSwgaHJlZiwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICB9XG5cbiAgaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgZmxhc2gsIHRhcmdldEVsKSB7XG4gICAgY29uc3QgY2xpY2tMb2FkaW5nID0gdGFyZ2V0RWwgJiYgZS5pc1RydXN0ZWQgJiYgZS50eXBlICE9PSBcInBvcHN0YXRlXCI7XG4gICAgaWYgKGNsaWNrTG9hZGluZykge1xuICAgICAgdGFyZ2V0RWwuY2xhc3NMaXN0LmFkZChcInBoeC1jbGljay1sb2FkaW5nXCIpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSB8fCAhdGhpcy5tYWluLmlzTWFpbigpKSB7XG4gICAgICByZXR1cm4gQnJvd3Nlci5yZWRpcmVjdChocmVmLCBmbGFzaCk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCB0byBmdWxsIGhyZWYgaWYgb25seSBwYXRoIHByZWZpeFxuICAgIGlmICgvXlxcLyR8XlxcL1teXFwvXSsuKiQvLnRlc3QoaHJlZikpIHtcbiAgICAgIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3QgfSA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgIGhyZWYgPSBgJHtwcm90b2NvbH0vLyR7aG9zdH0ke2hyZWZ9YDtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFk7XG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJyZWRpcmVjdFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLnJlcGxhY2VNYWluKGhyZWYsIGZsYXNoLCAobGlua1JlZikgPT4ge1xuICAgICAgICBpZiAobGlua1JlZiA9PT0gdGhpcy5saW5rUmVmKSB7XG4gICAgICAgICAgLy8gSW5jcmVtZW50IHBvc2l0aW9uIGZvciBuZXcgc3RhdGVcbiAgICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24rKztcbiAgICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICBQSFhfTFZfSElTVE9SWV9QT1NJVElPTixcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBzdG9yZSB0aGUgdHlwZSBmb3IgYmFjayBuYXZpZ2F0aW9uXG4gICAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBiYWNrVHlwZTogXCJyZWRpcmVjdFwiLFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFxuICAgICAgICAgICAgbGlua1N0YXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInJlZGlyZWN0XCIsXG4gICAgICAgICAgICAgIGlkOiB0aGlzLm1haW4uaWQsXG4gICAgICAgICAgICAgIHNjcm9sbDogc2Nyb2xsLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgICAgZGV0YWlsOiB7IGhyZWYsIHBhdGNoOiBmYWxzZSwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgdW5kbyBjbGljay1sb2FkaW5nIGNsYXNzXG4gICAgICAgIC8vIChpbiBjYXNlIGl0IG9yaWdpbmF0ZWQgaW4gYSBzdGlja3kgbGl2ZSB2aWV3LCBvdGhlcndpc2UgaXQgd291bGQgYmUgcmVtb3ZlZCBhbnl3YXkpXG4gICAgICAgIGlmIChjbGlja0xvYWRpbmcpIHtcbiAgICAgICAgICB0YXJnZXRFbC5jbGFzc0xpc3QucmVtb3ZlKFwicGh4LWNsaWNrLWxvYWRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZWdpc3Rlck5ld0xvY2F0aW9uKG5ld0xvY2F0aW9uKSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSB0aGlzLmN1cnJlbnRMb2NhdGlvbjtcbiAgICBpZiAocGF0aG5hbWUgKyBzZWFyY2ggPT09IG5ld0xvY2F0aW9uLnBhdGhuYW1lICsgbmV3TG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gY2xvbmUobmV3TG9jYXRpb24pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgYmluZEZvcm1zKCkge1xuICAgIGxldCBpdGVyYXRpb25zID0gMDtcbiAgICBsZXQgZXh0ZXJuYWxGb3JtU3VibWl0dGVkID0gZmFsc2U7XG5cbiAgICAvLyBkaXNhYmxlIGZvcm1zIG9uIHN1Ym1pdCB0aGF0IHRyYWNrIHBoeC1jaGFuZ2UgYnV0IHBlcmZvcm0gZXh0ZXJuYWwgc3VibWl0XG4gICAgdGhpcy5vbihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgcGh4U3VibWl0ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInN1Ym1pdFwiKSk7XG4gICAgICBjb25zdCBwaHhDaGFuZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICAgIGlmICghZXh0ZXJuYWxGb3JtU3VibWl0dGVkICYmIHBoeENoYW5nZSAmJiAhcGh4U3VibWl0KSB7XG4gICAgICAgIGV4dGVybmFsRm9ybVN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgdmlldy5kaXNhYmxlRm9ybShlLnRhcmdldCk7XG4gICAgICAgICAgLy8gc2FmYXJpIG5lZWRzIG5leHQgdGlja1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKERPTS5pc1VubG9hZGFibGVGb3JtU3VibWl0KGUpKSB7XG4gICAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLnRhcmdldC5zdWJtaXQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKFwic3VibWl0XCIsIChlKSA9PiB7XG4gICAgICBjb25zdCBwaHhFdmVudCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJzdWJtaXRcIikpO1xuICAgICAgaWYgKCFwaHhFdmVudCkge1xuICAgICAgICBpZiAoRE9NLmlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkpIHtcbiAgICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICBKUy5leGVjKGUsIFwic3VibWl0XCIsIHBoeEV2ZW50LCB2aWV3LCBlLnRhcmdldCwgW1xuICAgICAgICAgIFwicHVzaFwiLFxuICAgICAgICAgIHsgc3VibWl0dGVyOiBlLnN1Ym1pdHRlciB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIFtcImNoYW5nZVwiLCBcImlucHV0XCJdKSB7XG4gICAgICB0aGlzLm9uKHR5cGUsIChlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlIGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQgJiZcbiAgICAgICAgICAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpICYmXG4gICAgICAgICAgZS50YXJnZXQuZm9ybSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHRocm93IG9uIGludmFsaWQgSlMuZGlzcGF0Y2ggdGFyZ2V0IGFuZCBub29wIGlmIEN1c3RvbUV2ZW50IHRyaWdnZXJlZCBvdXRzaWRlIEpTLmRpc3BhdGNoXG4gICAgICAgICAgaWYgKGUuZGV0YWlsICYmIGUuZGV0YWlsLmRpc3BhdGNoZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGRpc3BhdGNoaW5nIGEgY3VzdG9tICR7dHlwZX0gZXZlbnQgaXMgb25seSBzdXBwb3J0ZWQgb24gaW5wdXQgZWxlbWVudHMgaW5zaWRlIGEgZm9ybWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0O1xuICAgICAgICBpZiAodGhpcy5ibG9ja1BoeENoYW5nZVdoaWxlQ29tcG9zaW5nICYmIGUuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBgY29tcG9zaXRpb24tbGlzdGVuZXItJHt0eXBlfWA7XG4gICAgICAgICAgaWYgKCFET00ucHJpdmF0ZShpbnB1dCwga2V5KSkge1xuICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBcImNvbXBvc2l0aW9uZW5kXCIsXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGEgbmV3IGlucHV0L2NoYW5nZSBldmVudFxuICAgICAgICAgICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgRE9NLmRlbGV0ZVByaXZhdGUoaW5wdXQsIGtleSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKTtcbiAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gaW5wdXQuZm9ybSAmJiBpbnB1dC5mb3JtLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpO1xuICAgICAgICBjb25zdCBwaHhFdmVudCA9IGlucHV0RXZlbnQgfHwgZm9ybUV2ZW50O1xuICAgICAgICBpZiAoIXBoeEV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbnB1dC50eXBlID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgaW5wdXQudmFsaWRpdHkgJiZcbiAgICAgICAgICBpbnB1dC52YWxpZGl0eS5iYWRJbnB1dFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gaW5wdXRFdmVudCA/IGlucHV0IDogaW5wdXQuZm9ybTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZXJhdGlvbnMgPSBpdGVyYXRpb25zO1xuICAgICAgICBpdGVyYXRpb25zKys7XG4gICAgICAgIGNvbnN0IHsgYXQ6IGF0LCB0eXBlOiBsYXN0VHlwZSB9ID1cbiAgICAgICAgICBET00ucHJpdmF0ZShpbnB1dCwgXCJwcmV2LWl0ZXJhdGlvblwiKSB8fCB7fTtcbiAgICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIGFsd2F5cyBmaXJlIGF0IGxlYXN0IG9uZSBcImlucHV0XCIgZXZlbnQgYmVmb3JlIGV2ZXJ5IFwiY2hhbmdlXCJcbiAgICAgICAgLy8gSWdub3JlIFwiY2hhbmdlXCIgZXZlbnRzLCB1bmxlc3MgdGhlcmUgd2FzIG5vIHByaW9yIFwiaW5wdXRcIiBldmVudC5cbiAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgdXNlciBjb2RlIHRyaWdnZXJzIGEgXCJjaGFuZ2VcIiBldmVudCwgb3IgaWYgdGhlIGJyb3dzZXIgaXMgbm9uLWNvbmZvcm1pbmcuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhdCA9PT0gY3VycmVudEl0ZXJhdGlvbnMgLSAxICYmXG4gICAgICAgICAgdHlwZSA9PT0gXCJjaGFuZ2VcIiAmJlxuICAgICAgICAgIGxhc3RUeXBlID09PSBcImlucHV0XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIiwge1xuICAgICAgICAgIGF0OiBjdXJyZW50SXRlcmF0aW9ucyxcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlYm91bmNlKGlucHV0LCBlLCB0eXBlLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZGlzcGF0Y2hlciwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX0ZPQ1VTRUQsIHRydWUpO1xuICAgICAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdmlldywgaW5wdXQsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgX3RhcmdldDogZS50YXJnZXQubmFtZSwgZGlzcGF0Y2hlcjogZGlzcGF0Y2hlciB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMub24oXCJyZXNldFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuICAgICAgRE9NLnJlc2V0Rm9ybShmb3JtKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKS5maW5kKChlbCkgPT4gZWwudHlwZSA9PT0gXCJyZXNldFwiKTtcbiAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAvLyB3YWl0IHVudGlsIG5leHQgdGljayB0byBnZXQgdXBkYXRlZCBpbnB1dCB2YWx1ZVxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEV2ZW50KFwiaW5wdXRcIiwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiBmYWxzZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRlYm91bmNlKGVsLCBldmVudCwgZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgIGlmIChldmVudFR5cGUgPT09IFwiYmx1clwiIHx8IGV2ZW50VHlwZSA9PT0gXCJmb2N1c291dFwiKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBwaHhEZWJvdW5jZSA9IHRoaXMuYmluZGluZyhQSFhfREVCT1VOQ0UpO1xuICAgIGNvbnN0IHBoeFRocm90dGxlID0gdGhpcy5iaW5kaW5nKFBIWF9USFJPVFRMRSk7XG4gICAgY29uc3QgZGVmYXVsdERlYm91bmNlID0gdGhpcy5kZWZhdWx0cy5kZWJvdW5jZS50b1N0cmluZygpO1xuICAgIGNvbnN0IGRlZmF1bHRUaHJvdHRsZSA9IHRoaXMuZGVmYXVsdHMudGhyb3R0bGUudG9TdHJpbmcoKTtcblxuICAgIHRoaXMud2l0aGluT3duZXJzKGVsLCAodmlldykgPT4ge1xuICAgICAgY29uc3QgYXN5bmNGaWx0ZXIgPSAoKSA9PlxuICAgICAgICAhdmlldy5pc0Rlc3Ryb3llZCgpICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpO1xuICAgICAgRE9NLmRlYm91bmNlKFxuICAgICAgICBlbCxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHBoeERlYm91bmNlLFxuICAgICAgICBkZWZhdWx0RGVib3VuY2UsXG4gICAgICAgIHBoeFRocm90dGxlLFxuICAgICAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgICAgIGFzeW5jRmlsdGVyLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBzaWxlbmNlRXZlbnRzKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5zaWxlbmNlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soKTtcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2U7XG4gIH1cblxuICBvbihldmVudCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmJvdW5kRXZlbnROYW1lcy5hZGQoZXZlbnQpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCAoZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNpbGVuY2VkKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAganNRdWVyeVNlbGVjdG9yQWxsKHNvdXJjZUVsLCBxdWVyeSwgZGVmYXVsdFF1ZXJ5KSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5kb21DYWxsYmFja3MuanNRdWVyeVNlbGVjdG9yQWxsO1xuICAgIHJldHVybiBhbGwgPyBhbGwoc291cmNlRWwsIHF1ZXJ5LCBkZWZhdWx0UXVlcnkpIDogZGVmYXVsdFF1ZXJ5KCk7XG4gIH1cbn1cblxuY2xhc3MgVHJhbnNpdGlvblNldCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5wcm9taXNlcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnBlbmRpbmdPcHMgPSBbXTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMuZm9yRWFjaCgodGltZXIpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcik7XG4gICAgfSk7XG4gICAgdGhpcy5wcm9taXNlcy5jbGVhcigpO1xuICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gIH1cblxuICBhZnRlcihjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoUGVuZGluZ09wKGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBhZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSkge1xuICAgIG9uU3RhcnQoKTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmFuc2l0aW9ucy5kZWxldGUodGltZXIpO1xuICAgICAgb25Eb25lKCk7XG4gICAgICB0aGlzLmZsdXNoUGVuZGluZ09wcygpO1xuICAgIH0sIHRpbWUpO1xuICAgIHRoaXMudHJhbnNpdGlvbnMuYWRkKHRpbWVyKTtcbiAgfVxuXG4gIGFkZEFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy5wcm9taXNlcy5hZGQocHJvbWlzZSk7XG4gICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMucHJvbWlzZXMuZGVsZXRlKHByb21pc2UpO1xuICAgICAgdGhpcy5mbHVzaFBlbmRpbmdPcHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hQZW5kaW5nT3Aob3ApIHtcbiAgICB0aGlzLnBlbmRpbmdPcHMucHVzaChvcCk7XG4gIH1cblxuICBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25zLnNpemUgKyB0aGlzLnByb21pc2VzLnNpemU7XG4gIH1cblxuICBmbHVzaFBlbmRpbmdPcHMoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSgpID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcCA9IHRoaXMucGVuZGluZ09wcy5zaGlmdCgpO1xuICAgIGlmIChvcCkge1xuICAgICAgb3AoKTtcbiAgICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5QaG9lbml4IExpdmVWaWV3IEphdmFTY3JpcHQgQ2xpZW50XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5TZWUgdGhlIGhleGRvY3MgYXQgYGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlld2AgZm9yIGRvY3VtZW50YXRpb24uXG4qL1xuXG5pbXBvcnQgT3JpZ2luYWxMaXZlU29ja2V0LCB7IGlzVXNlZElucHV0IH0gZnJvbSBcIi4vbGl2ZV9zb2NrZXRcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCI7XG5pbXBvcnQgeyBWaWV3SG9vayB9IGZyb20gXCIuL3ZpZXdfaG9va1wiO1xuaW1wb3J0IFZpZXcgZnJvbSBcIi4vdmlld1wiO1xuXG5pbXBvcnQgdHlwZSB7IExpdmVTb2NrZXRKU0NvbW1hbmRzIH0gZnJvbSBcIi4vanNfY29tbWFuZHNcIjtcbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va3NPcHRpb25zIH0gZnJvbSBcIi4vdmlld19ob29rXCI7XG5pbXBvcnQgdHlwZSB7IFNvY2tldCBhcyBQaG9lbml4U29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgTGl2ZVNvY2tldCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXZlU29ja2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0cyBmb3IgcGh4LWRlYm91bmNlIGFuZCBwaHgtdGhyb3R0bGUuXG4gICAqL1xuICBkZWZhdWx0cz86IHtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC1kZWJvdW5jZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICBkZWJvdW5jZT86IG51bWJlcjtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC10aHJvdHRsZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICB0aHJvdHRsZT86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiBmb3IgcGFzc2luZyBjb25uZWN0IHBhcmFtcy5cbiAgICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIExpdmVWaWV3LiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogICAgIChlbCkgPT4ge3ZpZXc6IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtbXktdmlldy1uYW1lXCIsIHRva2VuOiB3aW5kb3cubXlUb2tlbn1cbiAgICpcbiAgICovXG4gIHBhcmFtcz86XG4gICAgfCAoKGVsOiBIVE1MRWxlbWVudCkgPT4geyBba2V5OiBzdHJpbmddOiBhbnkgfSlcbiAgICB8IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgcHJlZml4IHRvIHVzZSBmb3IgYWxsIHBoeCBET00gYW5ub3RhdGlvbnMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwicGh4LVwiLlxuICAgKi9cbiAgYmluZGluZ1ByZWZpeD86IHN0cmluZztcbiAgLyoqXG4gICAqIENhbGxiYWNrcyBmb3IgTGl2ZVZpZXcgaG9va3MuXG4gICAqXG4gICAqIFNlZSBbQ2xpZW50IGhvb2tzIHZpYSBgcGh4LWhvb2tgXShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sI2NsaWVudC1ob29rcy12aWEtcGh4LWhvb2spIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgaG9va3M/OiBIb29rc09wdGlvbnM7XG4gIC8qKiBDYWxsYmFja3MgZm9yIExpdmVWaWV3IHVwbG9hZGVycy4gKi9cbiAgdXBsb2FkZXJzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTsgLy8gVE9ETzogZGVmaW5lIG1vcmUgc3BlY2lmaWNhbGx5XG4gIC8qKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGFwcGx5aW5nIGxvYWRpbmcgc3RhdGVzLiAqL1xuICBsb2FkZXJUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBleGVjdXRpbmcgcGh4LWRpc2Nvbm5lY3RlZCBjb21tYW5kcy4gKi9cbiAgZGlzY29ubmVjdGVkVGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmVsb2FkcyBiZWZvcmUgZW50ZXJpbmcgZmFpbHNhZmUgbW9kZS4gKi9cbiAgbWF4UmVsb2Fkcz86IG51bWJlcjtcbiAgLyoqIE1pbmltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1pbj86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1heD86IG51bWJlcjtcbiAgLyoqIFRpbWUgYmV0d2VlbiByZWxvYWQgYXR0ZW1wdHMgaW4gZmFpbHNhZmUgbW9kZS4gKi9cbiAgZmFpbHNhZmVKaXR0ZXI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBsb2cgZGVidWcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgKHZpZXcsIGtpbmQsIG1zZywgb2JqKSA9PiBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopXG4gICAqL1xuICB2aWV3TG9nZ2VyPzogKHZpZXc6IFZpZXcsIGtpbmQ6IHN0cmluZywgbXNnOiBzdHJpbmcsIG9iajogYW55KSA9PiB2b2lkO1xuICAvKipcbiAgICogT2JqZWN0IG1hcHBpbmcgZXZlbnQgbmFtZXMgdG8gZnVuY3Rpb25zIGZvciBwb3B1bGF0aW5nIGV2ZW50IG1ldGFkYXRhLlxuICAgKlxuICAgKiAgICAgbWV0YWRhdGE6IHtcbiAgICogICAgICAgY2xpY2s6IChlLCBlbCkgPT4ge1xuICAgKiAgICAgICAgIHJldHVybiB7XG4gICAqICAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAqICAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gICAqICAgICAgICAgICBkZXRhaWw6IGUuZGV0YWlsIHx8IDEsXG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9LFxuICAgKiAgICAgICBrZXlkb3duOiAoZSwgZWwpID0+IHtcbiAgICogICAgICAgICByZXR1cm4ge1xuICAgKiAgICAgICAgICAga2V5OiBlLmtleSxcbiAgICogICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICogICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAgICogICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5XG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqXG4gICAqL1xuICBtZXRhZGF0YT86IHsgW2V2ZW50TmFtZTogc3RyaW5nXTogKGU6IEV2ZW50LCBlbDogSFRNTEVsZW1lbnQpID0+IG9iamVjdCB9O1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgc2Vzc2lvblN0b3JhZ2VgLiBGb3IgZXhhbXBsZSwgVGhpcyBjb3VsZFxuICAgKiBoYXBwZW4gaWYgYSBzaXRlIGxvYWRzIGEgY3Jvc3MtZG9tYWluIExpdmVWaWV3IGluIGFuIGlmcmFtZS5cbiAgICpcbiAgICogRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gICAqICAgICAgIGNvbnN0cnVjdG9yKCkgeyB0aGlzLnN0b3JhZ2UgPSB7fSB9XG4gICAqICAgICAgIGdldEl0ZW0oa2V5TmFtZSkgeyByZXR1cm4gdGhpcy5zdG9yYWdlW2tleU5hbWVdIHx8IG51bGwgfVxuICAgKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gICAqICAgICAgIHNldEl0ZW0oa2V5TmFtZSwga2V5VmFsdWUpIHsgdGhpcy5zdG9yYWdlW2tleU5hbWVdID0ga2V5VmFsdWUgfVxuICAgKiAgICAgfVxuICAgKi9cbiAgc2Vzc2lvblN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogU2VlIGBzZXNzaW9uU3RvcmFnZWAgZm9yIGFuIGV4YW1wbGUuXG4gICAqL1xuICBsb2NhbFN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogSWYgc2V0IHRvIGB0cnVlYCwgYHBoeC1jaGFuZ2VgIGV2ZW50cyB3aWxsIGJlIGJsb2NrZWQgKHdpbGwgbm90IGZpcmUpXG4gICAqIHdoaWxlIHRoZSB1c2VyIGlzIGNvbXBvc2luZyBpbnB1dCB1c2luZyBhbiBJTUUgKElucHV0IE1ldGhvZCBFZGl0b3IpLlxuICAgKiBUaGlzIGlzIGRldGVybWluZWQgYnkgdGhlIGBlLmlzQ29tcG9zaW5nYCBwcm9wZXJ0eSBvbiBrZXlib2FyZCBldmVudHMsXG4gICAqIHdoaWNoIGlzIGB0cnVlYCB3aGVuIHRoZSB1c2VyIGlzIGluIHRoZSBwcm9jZXNzIG9mIGVudGVyaW5nIGNvbXBvc2VkIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuICAgKiB3aGVuIHR5cGluZyBKYXBhbmVzZSBvciBDaGluZXNlIHVzaW5nIHJvbWFqaSBvciBwaW55aW4gaW5wdXQgbWV0aG9kcykuXG4gICAqIEJ5IGRlZmF1bHQsIGBwaHgtY2hhbmdlYCB3aWxsIG5vdCBiZSBibG9ja2VkIGR1cmluZyBhIGNvbXBvc2l0aW9uIHNlc3Npb24sXG4gICAqIGJ1dCBub3RlIHRoYXQgdGhlcmUgd2VyZSBpc3N1ZXMgcmVwb3J0ZWQgaW4gb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpLFxuICAgKiB3aGVyZSBhIExpdmVWaWV3IHBhdGNoIHRvIHRoZSBpbnB1dCBjYXVzZWQgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICpcbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuICAgKiAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2lzQ29tcG9zaW5nXG4gICAqIC0gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzMzMjJcbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3Npbmc/OiBib29sZWFuO1xuICAvKiogRE9NIGNhbGxiYWNrcy4gKi9cbiAgZG9tPzoge1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgcXVlcnlpbmcgZWxlbWVudHMgaW4gSlMgY29tbWFuZHMuXG4gICAgICogQHBhcmFtIHNvdXJjZUVsIC0gVGhlIHNvdXJjZSBlbGVtZW50LCBlLmcuIHRoZSBidXR0b24gdGhhdCB3YXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0gcXVlcnkgLSBUaGUgcXVlcnkgdmFsdWUuXG4gICAgICogQHBhcmFtIGRlZmF1bHRRdWVyeSAtIEEgZGVmYXVsdCBxdWVyeSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGlmIG5vIGN1c3RvbSBxdWVyeSBzaG91bGQgYmUgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGpzUXVlcnlTZWxlY3RvckFsbD86IChcbiAgICAgIHNvdXJjZUVsOiBIVE1MRWxlbWVudCxcbiAgICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgICBkZWZhdWx0UXVlcnk6ICgpID0+IEVsZW1lbnRbXSxcbiAgICApID0+IEVsZW1lbnRbXTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaFN0YXJ0PzogKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaEVuZD86IChjb250YWluZXI6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgbmV3IERPTSBub2RlIGlzIGFkZGVkLlxuICAgICAqL1xuICAgIG9uTm9kZUFkZGVkPzogKG5vZGU6IE5vZGUpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGJlZm9yZSBhbiBlbGVtZW50IGlzIHVwZGF0ZWQuXG4gICAgICovXG4gICAgb25CZWZvcmVFbFVwZGF0ZWQ/OiAoZnJvbUVsOiBFbGVtZW50LCB0b0VsOiBFbGVtZW50KSA9PiB2b2lkO1xuICB9O1xuICAvKiogQWxsb3cgcGFzc3Rocm91Z2ggb2Ygb3RoZXIgb3B0aW9ucyB0byB0aGUgUGhvZW5peCBTb2NrZXQgY29uc3RydWN0b3IuICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgcHVibGljIEFQSSBvZiBhIExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGl2ZVNvY2tldEluc3RhbmNlSW50ZXJmYWNlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIExpdmVWaWV3IGNsaWVudC5cbiAgICovXG4gIHZlcnNpb24oKTogc3RyaW5nO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLiBTZWUgYGVuYWJsZVByb2ZpbGluZ2AgYW5kIGBkaXNhYmxlUHJvZmlsaW5nYC5cbiAgICovXG4gIGlzUHJvZmlsZUVuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC4gU2VlIGBlbmFibGVEZWJ1Z2AgYW5kIGBkaXNhYmxlRGVidWdgLlxuICAgKi9cbiAgaXNEZWJ1Z0VuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIFNlZSBgZW5hYmxlRGVidWdgIGFuZCBgZGlzYWJsZURlYnVnYC5cbiAgICovXG4gIGlzRGVidWdEaXNhYmxlZCgpOiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlcyBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIFdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWQsIHRoZSBMaXZlVmlldyBjbGllbnQgd2lsbCBsb2cgZGVidWcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUuXG4gICAqIFNlZSBbRGVidWdnaW5nIGNsaWVudCBldmVudHNdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9qcy1pbnRlcm9wLmh0bWwjZGVidWdnaW5nLWNsaWVudC1ldmVudHMpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlRGVidWcoKTogdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcHJvZmlsaW5nLlxuICAgKlxuICAgKiBXaGVuIHByb2ZpbGluZyBpcyBlbmFibGVkLCB0aGUgTGl2ZVZpZXcgY2xpZW50IHdpbGwgbG9nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZS5cbiAgICovXG4gIGVuYWJsZVByb2ZpbGluZygpOiB2b2lkO1xuICAvKipcbiAgICogRGlzYWJsZXMgZGVidWdnaW5nLlxuICAgKi9cbiAgZGlzYWJsZURlYnVnKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBwcm9maWxpbmcuXG4gICAqL1xuICBkaXNhYmxlUHJvZmlsaW5nKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGVzIGxhdGVuY3kgc2ltdWxhdGlvbi5cbiAgICpcbiAgICogV2hlbiBsYXRlbmN5IHNpbXVsYXRpb24gaXMgZW5hYmxlZCwgdGhlIExpdmVWaWV3IGNsaWVudCB3aWxsIGFkZCBhIGRlbGF5IHRvIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgc2VydmVyLlxuICAgKiBTZWUgW1NpbXVsYXRpbmcgTGF0ZW5jeV0oaHR0cHM6Ly9oZXhkb2NzLnBtL3Bob2VuaXhfbGl2ZV92aWV3L2pzLWludGVyb3AuaHRtbCNzaW11bGF0aW5nLWxhdGVuY3kpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlTGF0ZW5jeVNpbSh1cHBlckJvdW5kTXM6IG51bWJlcik6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBsYXRlbmN5IHNpbXVsYXRpb24uXG4gICAqL1xuICBkaXNhYmxlTGF0ZW5jeVNpbSgpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsYXRlbmN5IHNpbXVsYXRpb24gdXBwZXIgYm91bmQuXG4gICAqL1xuICBnZXRMYXRlbmN5U2ltKCk6IG51bWJlciB8IG51bGw7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBQaG9lbml4IFNvY2tldCBpbnN0YW5jZS5cbiAgICovXG4gIGdldFNvY2tldCgpOiBQaG9lbml4U29ja2V0O1xuICAvKipcbiAgICogQ29ubmVjdHMgdG8gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGNvbm5lY3QoKTogdm9pZDtcbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgLyoqXG4gICAqIENhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIHRyYW5zcG9ydCB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIFBob2VuaXggU29ja2V0LlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQ6IGFueSk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBlbmNvZGVkIEpTIGNvbW1hbmQsIHRhcmdldGluZyB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogU2VlIFtgUGhvZW5peC5MaXZlVmlldy5KU2BdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9QaG9lbml4LkxpdmVWaWV3LkpTLmh0bWwpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZXhlY0pTKGVsOiBIVE1MRWxlbWVudCwgZW5jb2RlZEpTOiBzdHJpbmcsIGV2ZW50VHlwZT86IHN0cmluZyB8IG51bGwpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIFNlZSBbSmF2YVNjcmlwdCBpbnRlcm9wZXJhYmlsaXR5XShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGpzKCk6IExpdmVTb2NrZXRKU0NvbW1hbmRzO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBkZXNjcmliaW5nIHRoZSBMaXZlU29ja2V0IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpdmVTb2NrZXRDb25zdHJ1Y3RvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgYFwid3NzOi8vZXhhbXBsZS5jb20vbGl2ZVwiYCxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIi9saXZlXCJgIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICAgKiBAcGFyYW0gc29ja2V0IC0gdGhlIHJlcXVpcmVkIFBob2VuaXggU29ja2V0IGNsYXNzIGltcG9ydGVkIGZyb20gXCJwaG9lbml4XCIuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbiAgICogICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICogICAgIGxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHsuLi59KVxuICAgKlxuICAgKiBAcGFyYW0gb3B0cyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBuZXcgKFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgc29ja2V0OiB0eXBlb2YgUGhvZW5peFNvY2tldCxcbiAgICBvcHRzPzogTGl2ZVNvY2tldE9wdGlvbnMsXG4gICk6IExpdmVTb2NrZXRJbnN0YW5jZUludGVyZmFjZTtcbn1cblxuLy8gYmVjYXVzZSBMaXZlU29ja2V0IGlzIGluIEpTIChmb3Igbm93KSwgd2UgY2FzdCBpdCB0byBvdXIgZGVmaW5lZCBUeXBlU2NyaXB0IGNvbnN0cnVjdG9yLlxuY29uc3QgTGl2ZVNvY2tldCA9IE9yaWdpbmFsTGl2ZVNvY2tldCBhcyB1bmtub3duIGFzIExpdmVTb2NrZXRDb25zdHJ1Y3RvcjtcblxuLyoqIENyZWF0ZXMgYSBob29rIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBob29rLlxuICogQHBhcmFtIGNhbGxiYWNrcyAtIFRoZSBsaXN0IG9mIGhvb2sgY2FsbGJhY2tzLCBzdWNoIGFzIG1vdW50ZWQsXG4gKiAgIHVwZGF0ZWQsIGRlc3Ryb3llZCwgZXRjLlxuICpcbiAqICpOb3RlKjogYGNyZWF0ZUhvb2tgIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGBjb25uZWN0ZWRDYWxsYmFja2AgbGlmZWN5Y2xlXG4gKiB3aGljaCBpcyB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTS4gSWYgeW91IHRyeVxuICogdG8gY2FsbCBgY3JlYXRlSG9va2AgZnJvbSB0aGUgY29uc3RydWN0b3IsIGFuIGVycm9yIHdpbGwgYmUgbG9nZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gKiAgIGNvbm5lY3RlZENhbGxiYWNrKCl7XG4gKiAgICAgbGV0IG9uTGl2ZVZpZXdNb3VudGVkID0gKCkgPT4gdGhpcy5ob29rLnB1c2hFdmVudCguLi4pKVxuICogICAgIHRoaXMuaG9vayA9IGNyZWF0ZUhvb2sodGhpcywge21vdW50ZWQ6IG9uTGl2ZVZpZXdNb3VudGVkfSlcbiAqICAgfVxuICogfVxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIEhvb2sgaW5zdGFuY2UgZm9yIHRoZSBjdXN0b20gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSG9vayhlbDogSFRNTEVsZW1lbnQsIGNhbGxiYWNrczogSG9vayk6IFZpZXdIb29rIHtcbiAgbGV0IGV4aXN0aW5nSG9vayA9IERPTS5nZXRDdXN0b21FbEhvb2soZWwpO1xuICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSG9vaztcbiAgfVxuXG4gIGxldCBob29rID0gbmV3IFZpZXdIb29rKFZpZXcuY2xvc2VzdFZpZXcoZWwpLCBlbCwgY2FsbGJhY2tzKTtcbiAgRE9NLnB1dEN1c3RvbUVsSG9vayhlbCwgaG9vayk7XG4gIHJldHVybiBob29rO1xufVxuXG5leHBvcnQgeyBMaXZlU29ja2V0LCBpc1VzZWRJbnB1dCwgY3JlYXRlSG9vaywgVmlld0hvb2ssIEhvb2ssIEhvb2tzT3B0aW9ucyB9O1xuIiwgImltcG9ydCBcInBob2VuaXhfaHRtbFwiO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcbmltcG9ydCB7IExpdmVTb2NrZXQgfSBmcm9tIFwicGhvZW5peF9saXZlX3ZpZXdcIjtcbmltcG9ydCBDbGlwYm9hcmRKUyBmcm9tIFwiY2xpcGJvYXJkXCI7XG5pbXBvcnQgVG9hc3RpZnkgZnJvbSBcInRvYXN0aWZ5LWpzXCI7XG5pbXBvcnQgdG9wYmFyIGZyb20gXCJ0b3BiYXJcIjtcblxudG9wYmFyLmNvbmZpZyh7XG4gIGJhckNvbG9yczogeyAwOiBcInJnYig2NywgNTYsIDIwMilcIiB9LFxuICBzaGFkb3dDb2xvcjogXCJyZ2JhKDAsIDAsIDAsIC4zKVwiLFxuICBjbGFzc05hbWU6IFwidG9wYmFyXCIsXG59KTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCAoaW5mbykgPT4gdG9wYmFyLnNob3coKSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpwYWdlLWxvYWRpbmctc3RvcFwiLCAoKSA9PiB0b3BiYXIuaGlkZSgpKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnN1Y2Nlc3NcIiwgKGUpID0+IHtcbiAgVG9hc3RpZnkoe1xuICAgIHRleHQ6IGUuZGV0YWlsLm1zZyxcbiAgICBjbGFzc05hbWU6IFwidG9hc3RfX2NvbnRhaW5lci0tc3VjY2Vzc1wiLFxuICB9KS5zaG93VG9hc3QoKTtcbn0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6ZXJyb3JcIiwgKGUpID0+IHtcbiAgVG9hc3RpZnkoe1xuICAgIHRleHQ6IGUuZGV0YWlsLm1zZyxcbiAgICBjbGFzc05hbWU6IFwidG9hc3RfX2NvbnRhaW5lci0tZXJyb3JcIixcbiAgfSkuc2hvd1RvYXN0KCk7XG59KTtcblxubGV0IEhvb2tzID0ge307XG5cbkhvb2tzLkVtYmVkQ29tcG9uZW50ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImxpdmVfYWRtaW46bW92ZV9lbWJlZFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgZW1iZWRFbCA9IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCBpbmRleEVsID0gZW1iZWRFbC5xdWVyeVNlbGVjdG9yKFwiLmVtYmVkX19pbmRleFwiKTtcbiAgICAgIGNvbnN0IGZpZWxkRWwgPSBlbWJlZEVsLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gK2luZGV4RWwudmFsdWUgKyArZS50YXJnZXQuZGF0YXNldC5kaXI7XG4gICAgICBpbmRleEVsLnZhbHVlID0gbmV3SW5kZXg7XG5cbiAgICAgIGNvbnN0IHRhcmdldEVsID0gZmllbGRFbC5xdWVyeVNlbGVjdG9yQWxsKFwiLmVtYmVkX19pbmRleFwiKVtuZXdJbmRleF07XG4gICAgICB0YXJnZXRFbC52YWx1ZSA9ICt0YXJnZXRFbC52YWx1ZSArICtlLnRhcmdldC5kYXRhc2V0LmRpciAqIC0xO1xuXG4gICAgICBpbmRleEVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJsaXZlX2FkbWluOmVtYmVkX2FkZFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3Qgc29ydElucHV0ID0gZS50YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgIHNvcnRJbnB1dC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIHNvcnRJbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjplbWJlZF9kcm9wXCIsIChlKSA9PiB7XG4gICAgICBlLnRhcmdldC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG4gICAgICBjb25zdCBkZWxldGVJbnB1dCA9IGUudGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICBkZWxldGVJbnB1dC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIGRlbGV0ZUlucHV0LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJsaXZlX2FkbWluOmVtYmVkX2RlbGV0ZVwiLCAoZSkgPT4ge1xuICAgICAgZS50YXJnZXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuXG4gICAgICBjb25zdCBkZWxldGVJbnB1dCA9IGUudGFyZ2V0XG4gICAgICAgIC5jbG9zZXN0KFwiLmVtYmVkX19ncm91cFwiKVxuICAgICAgICAucXVlcnlTZWxlY3RvcignaW5wdXRbdmFsdWU9XCJcIl0nKTtcbiAgICAgIGRlbGV0ZUlucHV0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBkZWxldGVJbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSksXG4gICAgICApO1xuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuU2VhcmNoU2VsZWN0ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuaGFuZGxlRXZlbnQoXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5lbFxuICAgICAgICAucXVlcnlTZWxlY3RvcihcImlucHV0XCIpXG4gICAgICAgIC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5Ib29rcy5BcnJheUlucHV0ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuaGFuZGxlRXZlbnQoXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5lbFxuICAgICAgICAucXVlcnlTZWxlY3RvcihcImlucHV0XCIpXG4gICAgICAgIC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5Ib29rcy5NYXBJbnB1dCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLmhhbmRsZUV2ZW50KFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIHRoaXMuZWxcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKVxuICAgICAgICAuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuVmlld1BhZ2UgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjphY3Rpb25cIiwgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lID09PSBcIkZPUk1cIikge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBbLi4ubmV3IEZvcm1EYXRhKGUudGFyZ2V0KV0ucmVkdWNlKFxuICAgICAgICAgIChwYXJhbXMsIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYXJnc1tdXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ucGFyYW1zLCBhcmdzOiBbLi4ucGFyYW1zLmFyZ3MsIHZhbF0gfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLnBhcmFtcywgW2tleV06IHZhbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBhcmdzOiBbXSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGUudGFyZ2V0LnJlc2V0KCk7XG5cbiAgICAgICAgdGhpcy5wdXNoRXZlbnRUbyh0aGlzLmVsLCBcImFjdGlvblwiLCBwYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wdXNoRXZlbnRUbyh0aGlzLmVsLCBcImFjdGlvblwiLCB7IG5hbWU6IGUudGFyZ2V0LmRhdGFzZXQuYWN0aW9uIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuSW5kZXhQYWdlID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBbXTtcblxuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImxpdmVfYWRtaW46YWN0aW9uXCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQudGFnTmFtZSA9PT0gXCJGT1JNXCIpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gWy4uLm5ldyBGb3JtRGF0YShlLnRhcmdldCldLnJlZHVjZShcbiAgICAgICAgICAocGFyYW1zLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcImFyZ3NbXVwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLnBhcmFtcywgYXJnczogWy4uLnBhcmFtcy5hcmdzLCB2YWxdIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5wYXJhbXMsIFtrZXldOiB2YWwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgYXJnczogW10gfSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnB1c2hFdmVudFRvKHRoaXMuZWwsIFwiYWN0aW9uXCIsIHsgLi4ucGFyYW1zLCBpZHM6IHRoaXMuc2VsZWN0ZWQgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnB1c2hFdmVudFRvKHRoaXMuZWwsIFwiYWN0aW9uXCIsIHtcbiAgICAgICAgICBuYW1lOiBlLnRhcmdldC5kYXRhc2V0LmFjdGlvbixcbiAgICAgICAgICBpZHM6IHRoaXMuc2VsZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjp0b2dnbGVfc2VsZWN0XCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQuaWQgPT09IFwic2VsZWN0LWFsbFwiKSB7XG4gICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbChcIi5yZXNvdXJjZV9fc2VsZWN0XCIpXG4gICAgICAgICAgLmZvckVhY2goKGJveCkgPT4gKGJveC5jaGVja2VkID0gZS50YXJnZXQuY2hlY2tlZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKFwiI3NlbGVjdC1hbGxcIikuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGVkID0gQXJyYXkuZnJvbShcbiAgICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbZGF0YS1yZWNvcmQta2V5XTpjaGVja2VkXCIpLFxuICAgICAgICAoZSkgPT4gZS5kYXRhc2V0LnJlY29yZEtleSxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItc2VsZWN0XCIpLnN0eWxlLnJlbW92ZVByb3BlcnR5KFwiZGlzcGxheVwiKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItbmF2XCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZm9vdGVyLW5hdlwiKS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcImRpc3BsYXlcIik7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZm9vdGVyLXNlbGVjdFwiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIHVwZGF0ZWQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IFtdO1xuXG4gICAgdmFyIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmRKUyh0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuY2VsbF9fY29weVwiKSwge1xuICAgICAgdGFyZ2V0OiBmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICByZXR1cm4gdHJpZ2dlci5jbG9zZXN0KFwiLnJlc291cmNlX19jZWxsXCIpLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNsaXBib2FyZC5vbihcInN1Y2Nlc3NcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIFRvYXN0aWZ5KHtcbiAgICAgICAgdGV4dDogZS50cmlnZ2VyLmRhdGFzZXQubWVzc2FnZSxcbiAgICAgICAgY2xhc3NOYW1lOiBcInRvYXN0X19jb250YWluZXJcIixcbiAgICAgIH0pLnNob3dUb2FzdCgpO1xuICAgIH0pO1xuICB9LFxufTtcblxubGV0IGNzcmZUb2tlbiA9IGRvY3VtZW50XG4gIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcbiAgLmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIik7XG5sZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7XG4gIGhvb2tzOiBIb29rcyxcbiAgcGFyYW1zOiB7IF9jc3JmX3Rva2VuOiBjc3JmVG9rZW4gfSxcbn0pO1xuXG4vLyBDb25uZWN0IGlmIHRoZXJlIGFyZSBhbnkgTGl2ZVZpZXdzIG9uIHRoZSBwYWdlXG5saXZlU29ja2V0LmNvbm5lY3QoKTtcblxuaWYgKEVOViA9PSBcImRldlwiKSB7XG4gIGxpdmVTb2NrZXQuZW5hYmxlRGVidWcoKTtcbiAgbGl2ZVNvY2tldC5lbmFibGVMYXRlbmN5U2ltKHByb2Nlc3MuZW52LkxBVEVOQ1lfU0lNKTtcbn1cblxud2luZG93LmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBTUEsTUFBQywyQ0FBMEMsTUFBTSxTQUFTO0FBQ3pELFlBQUcsT0FBTyxZQUFZLFlBQVks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 +/*! Bundled license information: + +clipboard/dist/clipboard.js: + (*! + * clipboard.js v2.0.10 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + *) + +toastify-js/src/toastify.js: + (*! + * Toastify js 1.11.2 + * https://github.com/apvarun/toastify-js + * @license MIT licensed + * + * Copyright (C) 2018 Varun A P + *) + +topbar/topbar.min.js: + (** + * @license MIT + * topbar 1.0.0, 2021-01-06 + * http://buunguyen.github.io/topbar + * Copyright (c) 2021 Buu Nguyen + *) +*/ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9jbGlwYm9hcmQvZGlzdC9jbGlwYm9hcmQuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy90b2FzdGlmeS1qcy9zcmMvdG9hc3RpZnkuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy90b3BiYXIvdG9wYmFyLm1pbi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfaHRtbC9wcml2L3N0YXRpYy9waG9lbml4X2h0bWwuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3V0aWxzLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3B1c2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3RpbWVyLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jaGFubmVsLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9hamF4LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9sb25ncG9sbC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvcHJlc2VuY2UuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NlcmlhbGl6ZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NvY2tldC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZW50cnlfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXRpbHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYnJvd3Nlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb20uanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXBsb2FkX2VudHJ5LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2xpdmVfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYXJpYS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9lbGVtZW50X3JlZi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcG9zdF9tb3JwaF9yZXN0b3Jlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L25vZGVfbW9kdWxlcy9tb3JwaGRvbS9kaXN0L21vcnBoZG9tLWVzbS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcGF0Y2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvcmVuZGVyZWQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanNfY29tbWFuZHMudHMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlld19ob29rLnRzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L3ZpZXcuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvbGl2ZV9zb2NrZXQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvaW5kZXgudHMiLCAiLi4vLi4vYXNzZXRzL2pzL2FwcC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohXG4gKiBjbGlwYm9hcmQuanMgdjIuMC4xMFxuICogaHR0cHM6Ly9jbGlwYm9hcmRqcy5jb20vXG4gKlxuICogTGljZW5zZWQgTUlUIFx1MDBBOSBaZW5vIFJvY2hhXG4gKi9cbihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkNsaXBib2FyZEpTXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkNsaXBib2FyZEpTXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKCkgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gNjg2OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vLyBFWFBPUlRTXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuICBcImRlZmF1bHRcIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGNsaXBib2FyZDsgfVxufSk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdGlueS1lbWl0dGVyL2luZGV4LmpzXG52YXIgdGlueV9lbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNzkpO1xudmFyIHRpbnlfZW1pdHRlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih0aW55X2VtaXR0ZXIpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9nb29kLWxpc3RlbmVyL3NyYy9saXN0ZW4uanNcbnZhciBsaXN0ZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3MCk7XG52YXIgbGlzdGVuX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGxpc3Rlbik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3NlbGVjdC9zcmMvc2VsZWN0LmpzXG52YXIgc3JjX3NlbGVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oODE3KTtcbnZhciBzZWxlY3RfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc3JjX3NlbGVjdCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2NvbW1hbmQuanNcbi8qKlxuICogRXhlY3V0ZXMgYSBnaXZlbiBvcGVyYXRpb24gdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBjb21tYW5kKHR5cGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQodHlwZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvY3V0LmpzXG5cblxuLyoqXG4gKiBDdXQgYWN0aW9uIHdyYXBwZXIuXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkN1dCA9IGZ1bmN0aW9uIENsaXBib2FyZEFjdGlvbkN1dCh0YXJnZXQpIHtcbiAgdmFyIHNlbGVjdGVkVGV4dCA9IHNlbGVjdF9kZWZhdWx0KCkodGFyZ2V0KTtcbiAgY29tbWFuZCgnY3V0Jyk7XG4gIHJldHVybiBzZWxlY3RlZFRleHQ7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2N1dCA9IChDbGlwYm9hcmRBY3Rpb25DdXQpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi9jcmVhdGUtZmFrZS1lbGVtZW50LmpzXG4vKipcbiAqIENyZWF0ZXMgYSBmYWtlIHRleHRhcmVhIGVsZW1lbnQgd2l0aCBhIHZhbHVlLlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmFrZUVsZW1lbnQodmFsdWUpIHtcbiAgdmFyIGlzUlRMID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlyJykgPT09ICdydGwnO1xuICB2YXIgZmFrZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOyAvLyBQcmV2ZW50IHpvb21pbmcgb24gaU9TXG5cbiAgZmFrZUVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSAnMTJwdCc7IC8vIFJlc2V0IGJveCBtb2RlbFxuXG4gIGZha2VFbGVtZW50LnN0eWxlLmJvcmRlciA9ICcwJztcbiAgZmFrZUVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcwJztcbiAgZmFrZUVsZW1lbnQuc3R5bGUubWFyZ2luID0gJzAnOyAvLyBNb3ZlIGVsZW1lbnQgb3V0IG9mIHNjcmVlbiBob3Jpem9udGFsbHlcblxuICBmYWtlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIGZha2VFbGVtZW50LnN0eWxlW2lzUlRMID8gJ3JpZ2h0JyA6ICdsZWZ0J10gPSAnLTk5OTlweCc7IC8vIE1vdmUgZWxlbWVudCB0byB0aGUgc2FtZSBwb3NpdGlvbiB2ZXJ0aWNhbGx5XG5cbiAgdmFyIHlQb3NpdGlvbiA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICBmYWtlRWxlbWVudC5zdHlsZS50b3AgPSBcIlwiLmNvbmNhdCh5UG9zaXRpb24sIFwicHhcIik7XG4gIGZha2VFbGVtZW50LnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7XG4gIGZha2VFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gIHJldHVybiBmYWtlRWxlbWVudDtcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9hY3Rpb25zL2NvcHkuanNcblxuXG5cbi8qKlxuICogQ29weSBhY3Rpb24gd3JhcHBlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkNvcHkgPSBmdW5jdGlvbiBDbGlwYm9hcmRBY3Rpb25Db3B5KHRhcmdldCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgIGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keVxuICB9O1xuICB2YXIgc2VsZWN0ZWRUZXh0ID0gJyc7XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIGZha2VFbGVtZW50ID0gY3JlYXRlRmFrZUVsZW1lbnQodGFyZ2V0KTtcbiAgICBvcHRpb25zLmNvbnRhaW5lci5hcHBlbmRDaGlsZChmYWtlRWxlbWVudCk7XG4gICAgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKShmYWtlRWxlbWVudCk7XG4gICAgY29tbWFuZCgnY29weScpO1xuICAgIGZha2VFbGVtZW50LnJlbW92ZSgpO1xuICB9IGVsc2Uge1xuICAgIHNlbGVjdGVkVGV4dCA9IHNlbGVjdF9kZWZhdWx0KCkodGFyZ2V0KTtcbiAgICBjb21tYW5kKCdjb3B5Jyk7XG4gIH1cblxuICByZXR1cm4gc2VsZWN0ZWRUZXh0O1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYWN0aW9uc19jb3B5ID0gKENsaXBib2FyZEFjdGlvbkNvcHkpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvZGVmYXVsdC5qc1xuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5cblxuLyoqXG4gKiBJbm5lciBmdW5jdGlvbiB3aGljaCBwZXJmb3JtcyBzZWxlY3Rpb24gZnJvbSBlaXRoZXIgYHRleHRgIG9yIGB0YXJnZXRgXG4gKiBwcm9wZXJ0aWVzIGFuZCB0aGVuIGV4ZWN1dGVzIGNvcHkgb3IgY3V0IG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICovXG5cbnZhciBDbGlwYm9hcmRBY3Rpb25EZWZhdWx0ID0gZnVuY3Rpb24gQ2xpcGJvYXJkQWN0aW9uRGVmYXVsdCgpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAvLyBEZWZpbmVzIGJhc2UgcHJvcGVydGllcyBwYXNzZWQgZnJvbSBjb25zdHJ1Y3Rvci5cbiAgdmFyIF9vcHRpb25zJGFjdGlvbiA9IG9wdGlvbnMuYWN0aW9uLFxuICAgICAgYWN0aW9uID0gX29wdGlvbnMkYWN0aW9uID09PSB2b2lkIDAgPyAnY29weScgOiBfb3B0aW9ucyRhY3Rpb24sXG4gICAgICBjb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcixcbiAgICAgIHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0LFxuICAgICAgdGV4dCA9IG9wdGlvbnMudGV4dDsgLy8gU2V0cyB0aGUgYGFjdGlvbmAgdG8gYmUgcGVyZm9ybWVkIHdoaWNoIGNhbiBiZSBlaXRoZXIgJ2NvcHknIG9yICdjdXQnLlxuXG4gIGlmIChhY3Rpb24gIT09ICdjb3B5JyAmJiBhY3Rpb24gIT09ICdjdXQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwiYWN0aW9uXCIgdmFsdWUsIHVzZSBlaXRoZXIgXCJjb3B5XCIgb3IgXCJjdXRcIicpO1xuICB9IC8vIFNldHMgdGhlIGB0YXJnZXRgIHByb3BlcnR5IHVzaW5nIGFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGhhdmUgaXRzIGNvbnRlbnQgY29waWVkLlxuXG5cbiAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRhcmdldCAmJiBfdHlwZW9mKHRhcmdldCkgPT09ICdvYmplY3QnICYmIHRhcmdldC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgaWYgKGFjdGlvbiA9PT0gJ2NvcHknICYmIHRhcmdldC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgYXR0cmlidXRlLiBQbGVhc2UgdXNlIFwicmVhZG9ubHlcIiBpbnN0ZWFkIG9mIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvbiA9PT0gJ2N1dCcgJiYgKHRhcmdldC5oYXNBdHRyaWJ1dGUoJ3JlYWRvbmx5JykgfHwgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgYXR0cmlidXRlLiBZb3UgY2FuXFwndCBjdXQgdGV4dCBmcm9tIGVsZW1lbnRzIHdpdGggXCJyZWFkb25seVwiIG9yIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGVzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBcInRhcmdldFwiIHZhbHVlLCB1c2UgYSB2YWxpZCBFbGVtZW50Jyk7XG4gICAgfVxuICB9IC8vIERlZmluZSBzZWxlY3Rpb24gc3RyYXRlZ3kgYmFzZWQgb24gYHRleHRgIHByb3BlcnR5LlxuXG5cbiAgaWYgKHRleHQpIHtcbiAgICByZXR1cm4gYWN0aW9uc19jb3B5KHRleHQsIHtcbiAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyXG4gICAgfSk7XG4gIH0gLy8gRGVmaW5lcyB3aGljaCBzZWxlY3Rpb24gc3RyYXRlZ3kgYmFzZWQgb24gYHRhcmdldGAgcHJvcGVydHkuXG5cblxuICBpZiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIGFjdGlvbiA9PT0gJ2N1dCcgPyBhY3Rpb25zX2N1dCh0YXJnZXQpIDogYWN0aW9uc19jb3B5KHRhcmdldCwge1xuICAgICAgY29udGFpbmVyOiBjb250YWluZXJcbiAgICB9KTtcbiAgfVxufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYWN0aW9uc19kZWZhdWx0ID0gKENsaXBib2FyZEFjdGlvbkRlZmF1bHQpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NsaXBib2FyZC5qc1xuZnVuY3Rpb24gY2xpcGJvYXJkX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgY2xpcGJvYXJkX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBjbGlwYm9hcmRfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIGNsaXBib2FyZF90eXBlb2Yob2JqKTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKGNsaXBib2FyZF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5cblxuXG5cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmV0cmlldmUgYXR0cmlidXRlIHZhbHVlLlxuICogQHBhcmFtIHtTdHJpbmd9IHN1ZmZpeFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoc3VmZml4LCBlbGVtZW50KSB7XG4gIHZhciBhdHRyaWJ1dGUgPSBcImRhdGEtY2xpcGJvYXJkLVwiLmNvbmNhdChzdWZmaXgpO1xuXG4gIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIHdoaWNoIHRha2VzIG9uZSBvciBtb3JlIGVsZW1lbnRzLCBhZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGVtLFxuICogYW5kIGluc3RhbnRpYXRlcyBhIG5ldyBgQ2xpcGJvYXJkQWN0aW9uYCBvbiBlYWNoIGNsaWNrLlxuICovXG5cblxudmFyIENsaXBib2FyZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0VtaXR0ZXIpIHtcbiAgX2luaGVyaXRzKENsaXBib2FyZCwgX0VtaXR0ZXIpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ2xpcGJvYXJkKTtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IHRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIENsaXBib2FyZCh0cmlnZ2VyLCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsaXBib2FyZCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgX3RoaXMucmVzb2x2ZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICBfdGhpcy5saXN0ZW5DbGljayh0cmlnZ2VyKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogRGVmaW5lcyBpZiBhdHRyaWJ1dGVzIHdvdWxkIGJlIHJlc29sdmVkIHVzaW5nIGludGVybmFsIHNldHRlciBmdW5jdGlvbnNcbiAgICogb3IgY3VzdG9tIGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoQ2xpcGJvYXJkLCBbe1xuICAgIGtleTogXCJyZXNvbHZlT3B0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNvbHZlT3B0aW9ucygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHRoaXMuYWN0aW9uID0gdHlwZW9mIG9wdGlvbnMuYWN0aW9uID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5hY3Rpb24gOiB0aGlzLmRlZmF1bHRBY3Rpb247XG4gICAgICB0aGlzLnRhcmdldCA9IHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGFyZ2V0IDogdGhpcy5kZWZhdWx0VGFyZ2V0O1xuICAgICAgdGhpcy50ZXh0ID0gdHlwZW9mIG9wdGlvbnMudGV4dCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGV4dCA6IHRoaXMuZGVmYXVsdFRleHQ7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGNsaXBib2FyZF90eXBlb2Yob3B0aW9ucy5jb250YWluZXIpID09PSAnb2JqZWN0JyA/IG9wdGlvbnMuY29udGFpbmVyIDogZG9jdW1lbnQuYm9keTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNsaWNrIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBwYXNzZWQgdHJpZ2dlci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGlzdGVuQ2xpY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGlzdGVuQ2xpY2sodHJpZ2dlcikge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5fZGVmYXVsdCgpKHRyaWdnZXIsICdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIub25DbGljayhlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGEgbmV3IGBDbGlwYm9hcmRBY3Rpb25gIG9uIGVhY2ggY2xpY2sgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib25DbGlja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gZS5kZWxlZ2F0ZVRhcmdldCB8fCBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgICB2YXIgYWN0aW9uID0gdGhpcy5hY3Rpb24odHJpZ2dlcikgfHwgJ2NvcHknO1xuICAgICAgdmFyIHRleHQgPSBhY3Rpb25zX2RlZmF1bHQoe1xuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldCh0cmlnZ2VyKSxcbiAgICAgICAgdGV4dDogdGhpcy50ZXh0KHRyaWdnZXIpXG4gICAgICB9KTsgLy8gRmlyZXMgYW4gZXZlbnQgYmFzZWQgb24gdGhlIGNvcHkgb3BlcmF0aW9uIHJlc3VsdC5cblxuICAgICAgdGhpcy5lbWl0KHRleHQgPyAnc3VjY2VzcycgOiAnZXJyb3InLCB7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgICAgICBjbGVhclNlbGVjdGlvbjogZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXIuZm9jdXMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGBhY3Rpb25gIGxvb2t1cCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRyaWdnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRBY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmYXVsdEFjdGlvbih0cmlnZ2VyKSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoJ2FjdGlvbicsIHRyaWdnZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGB0YXJnZXRgIGxvb2t1cCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRyaWdnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRUYXJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmYXVsdFRhcmdldCh0cmlnZ2VyKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgndGFyZ2V0JywgdHJpZ2dlcik7XG5cbiAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93IGZpcmUgcHJvZ3JhbW1hdGljYWxseSBhIGNvcHkgYWN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IHRhcmdldFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybnMgVGV4dCBjb3BpZWQuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0VGV4dFwiLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBgdGV4dGAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VGV4dCh0cmlnZ2VyKSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoJ3RleHQnLCB0cmlnZ2VyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVzdHJveSBsaWZlY3ljbGUuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmxpc3RlbmVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjb3B5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkodGFyZ2V0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgICAgICBjb250YWluZXI6IGRvY3VtZW50LmJvZHlcbiAgICAgIH07XG4gICAgICByZXR1cm4gYWN0aW9uc19jb3B5KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93IGZpcmUgcHJvZ3JhbW1hdGljYWxseSBhIGN1dCBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHJldHVybnMgVGV4dCBjdXR0ZWQuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjdXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3V0KHRhcmdldCkge1xuICAgICAgcmV0dXJuIGFjdGlvbnNfY3V0KHRhcmdldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnQgb2YgdGhlIGdpdmVuIGFjdGlvbiwgb3IgYWxsIGFjdGlvbnMgaWYgbm8gYWN0aW9uIGlzXG4gICAgICogZ2l2ZW4uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFthY3Rpb25dXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc1N1cHBvcnRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1N1cHBvcnRlZCgpIHtcbiAgICAgIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFsnY29weScsICdjdXQnXTtcbiAgICAgIHZhciBhY3Rpb25zID0gdHlwZW9mIGFjdGlvbiA9PT0gJ3N0cmluZycgPyBbYWN0aW9uXSA6IGFjdGlvbjtcbiAgICAgIHZhciBzdXBwb3J0ID0gISFkb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQ7XG4gICAgICBhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICBzdXBwb3J0ID0gc3VwcG9ydCAmJiAhIWRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChhY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3VwcG9ydDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ2xpcGJvYXJkO1xufSgodGlueV9lbWl0dGVyX2RlZmF1bHQoKSkpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDgyODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxudmFyIERPQ1VNRU5UX05PREVfVFlQRSA9IDk7XG5cbi8qKlxuICogQSBwb2x5ZmlsbCBmb3IgRWxlbWVudC5tYXRjaGVzKClcbiAqL1xuaWYgKHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcykge1xuICAgIHZhciBwcm90byA9IEVsZW1lbnQucHJvdG90eXBlO1xuXG4gICAgcHJvdG8ubWF0Y2hlcyA9IHByb3RvLm1hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8ubXNNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8ub01hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGNsb3Nlc3QgcGFyZW50IHRoYXQgbWF0Y2hlcyBhIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gY2xvc2VzdCAoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9PSBET0NVTUVOVF9OT0RFX1RZUEUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgICAgIGVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9zZXN0O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA0Mzg6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGNsb3Nlc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyOCk7XG5cbi8qKlxuICogRGVsZWdhdGVzIGV2ZW50IHRvIGEgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHBhcmFtIHtCb29sZWFufSB1c2VDYXB0dXJlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIF9kZWxlZ2F0ZShlbGVtZW50LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICB2YXIgbGlzdGVuZXJGbiA9IGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfEFycmF5fSBbZWxlbWVudHNdXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHBhcmFtIHtCb29sZWFufSB1c2VDYXB0dXJlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRlbGVnYXRlKGVsZW1lbnRzLCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICAvLyBIYW5kbGUgdGhlIHJlZ3VsYXIgRWxlbWVudCB1c2FnZVxuICAgIGlmICh0eXBlb2YgZWxlbWVudHMuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEVsZW1lbnQtbGVzcyB1c2FnZSwgaXQgZGVmYXVsdHMgdG8gZ2xvYmFsIGRlbGVnYXRpb25cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVXNlIGBkb2N1bWVudGAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciwgdGhlbiBhcHBseSBhcmd1bWVudHNcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNob3J0IHdheSB0byAudW5zaGlmdCBgYXJndW1lbnRzYCB3aXRob3V0IHJ1bm5pbmcgaW50byBkZW9wdGltaXphdGlvbnNcbiAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5iaW5kKG51bGwsIGRvY3VtZW50KS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBTZWxlY3Rvci1iYXNlZCB1c2FnZVxuICAgIGlmICh0eXBlb2YgZWxlbWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlbGVtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEFycmF5LWxpa2UgYmFzZWQgdXNhZ2VcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGVsZW1lbnRzLCBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlKGVsZW1lbnQsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRmluZHMgY2xvc2VzdCBtYXRjaCBhbmQgaW52b2tlcyBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuZXIoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5kZWxlZ2F0ZVRhcmdldCA9IGNsb3Nlc3QoZS50YXJnZXQsIHNlbGVjdG9yKTtcblxuICAgICAgICBpZiAoZS5kZWxlZ2F0ZVRhcmdldCkge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChlbGVtZW50LCBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWxlZ2F0ZTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODc5OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSB7XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBIVE1MIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnRzLm5vZGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgJiYgdmFsdWUubm9kZVR5cGUgPT09IDE7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgbGlzdCBvZiBIVE1MIGVsZW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5ub2RlTGlzdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgKHR5cGUgPT09ICdbb2JqZWN0IE5vZGVMaXN0XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJylcbiAgICAgICAgJiYgKCdsZW5ndGgnIGluIHZhbHVlKVxuICAgICAgICAmJiAodmFsdWUubGVuZ3RoID09PSAwIHx8IGV4cG9ydHMubm9kZSh2YWx1ZVswXSkpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuc3RyaW5nID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcblxuICAgIHJldHVybiB0eXBlID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzcwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODc5KTtcbnZhciBkZWxlZ2F0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDM4KTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYWxsIHBhcmFtcyBhbmQgY2FsbHMgdGhlIHJpZ2h0XG4gKiBsaXN0ZW5lciBmdW5jdGlvbiBiYXNlZCBvbiBpdHMgdGFyZ2V0IHR5cGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IHRhcmdldFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3Rlbih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0YXJnZXQgJiYgIXR5cGUgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudHMnKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIFN0cmluZycpO1xuICAgIH1cblxuICAgIGlmICghaXMuZm4oY2FsbGJhY2spKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSBGdW5jdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChpcy5ub2RlKHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIGxpc3Rlbk5vZGUodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLm5vZGVMaXN0KHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIGxpc3Rlbk5vZGVMaXN0KHRhcmdldCwgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBlbHNlIGlmIChpcy5zdHJpbmcodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuU2VsZWN0b3IodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nLCBIVE1MRWxlbWVudCwgSFRNTENvbGxlY3Rpb24sIG9yIE5vZGVMaXN0Jyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBIVE1MIGVsZW1lbnRcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5Ob2RlKG5vZGUsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBsaXN0IG9mIEhUTUwgZWxlbWVudHNcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Tm9kZUxpc3R8SFRNTENvbGxlY3Rpb259IG5vZGVMaXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuTm9kZUxpc3Qobm9kZUxpc3QsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChub2RlTGlzdCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIHNlbGVjdG9yXG4gKiBhbmQgcmV0dXJucyBhIHJlbW92ZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5TZWxlY3RvcihzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZGVsZWdhdGUoZG9jdW1lbnQuYm9keSwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0ZW47XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDgxNzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxuZnVuY3Rpb24gc2VsZWN0KGVsZW1lbnQpIHtcbiAgICB2YXIgc2VsZWN0ZWRUZXh0O1xuXG4gICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQubm9kZU5hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgdmFyIGlzUmVhZE9ubHkgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKTtcblxuICAgICAgICBpZiAoIWlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgZWxlbWVudC52YWx1ZS5sZW5ndGgpO1xuXG4gICAgICAgIGlmICghaXNSZWFkT25seSkge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JlYWRvbmx5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSkge1xuICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblxuICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRUZXh0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbGVjdDtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjc5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5mdW5jdGlvbiBFICgpIHtcbiAgLy8gS2VlcCB0aGlzIGVtcHR5IHNvIGl0J3MgZWFzaWVyIHRvIGluaGVyaXQgZnJvbVxuICAvLyAodmlhIGh0dHBzOi8vZ2l0aHViLmNvbS9saXBzbWFjayBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zY290dGNvcmdhbi90aW55LWVtaXR0ZXIvaXNzdWVzLzMpXG59XG5cbkUucHJvdG90eXBlID0ge1xuICBvbjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBjdHgpIHtcbiAgICB2YXIgZSA9IHRoaXMuZSB8fCAodGhpcy5lID0ge30pO1xuXG4gICAgKGVbbmFtZV0gfHwgKGVbbmFtZV0gPSBbXSkpLnB1c2goe1xuICAgICAgZm46IGNhbGxiYWNrLFxuICAgICAgY3R4OiBjdHhcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG9uY2U6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgY3R4KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGZ1bmN0aW9uIGxpc3RlbmVyICgpIHtcbiAgICAgIHNlbGYub2ZmKG5hbWUsIGxpc3RlbmVyKTtcbiAgICAgIGNhbGxiYWNrLmFwcGx5KGN0eCwgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgbGlzdGVuZXIuXyA9IGNhbGxiYWNrXG4gICAgcmV0dXJuIHRoaXMub24obmFtZSwgbGlzdGVuZXIsIGN0eCk7XG4gIH0sXG5cbiAgZW1pdDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgZGF0YSA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICB2YXIgZXZ0QXJyID0gKCh0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KSlbbmFtZV0gfHwgW10pLnNsaWNlKCk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBsZW4gPSBldnRBcnIubGVuZ3RoO1xuXG4gICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGV2dEFycltpXS5mbi5hcHBseShldnRBcnJbaV0uY3R4LCBkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBvZmY6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBlID0gdGhpcy5lIHx8ICh0aGlzLmUgPSB7fSk7XG4gICAgdmFyIGV2dHMgPSBlW25hbWVdO1xuICAgIHZhciBsaXZlRXZlbnRzID0gW107XG5cbiAgICBpZiAoZXZ0cyAmJiBjYWxsYmFjaykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV2dHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGV2dHNbaV0uZm4gIT09IGNhbGxiYWNrICYmIGV2dHNbaV0uZm4uXyAhPT0gY2FsbGJhY2spXG4gICAgICAgICAgbGl2ZUV2ZW50cy5wdXNoKGV2dHNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBldmVudCBmcm9tIHF1ZXVlIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtcbiAgICAvLyBTdWdnZXN0ZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2xhemRcbiAgICAvLyBSZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9zY290dGNvcmdhbi90aW55LWVtaXR0ZXIvY29tbWl0L2M2ZWJmYWE5YmM5NzNiMzNkMTEwYTg0YTMwNzc0MmI3Y2Y5NGM5NTMjY29tbWl0Y29tbWVudC01MDI0OTEwXG5cbiAgICAobGl2ZUV2ZW50cy5sZW5ndGgpXG4gICAgICA/IGVbbmFtZV0gPSBsaXZlRXZlbnRzXG4gICAgICA6IGRlbGV0ZSBlW25hbWVdO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRTtcbm1vZHVsZS5leHBvcnRzLlRpbnlFbWl0dGVyID0gRTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0ICovXG4vKioqKioqLyBcdCFmdW5jdGlvbigpIHtcbi8qKioqKiovIFx0XHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHR9KCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG4vKioqKioqLyBcdFx0XHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG4vKioqKioqLyBcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG4vKioqKioqLyBcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHR9KCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kICovXG4vKioqKioqLyBcdCFmdW5jdGlvbigpIHtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBtb2R1bGUgZXhwb3J0cyBtdXN0IGJlIHJldHVybmVkIGZyb20gcnVudGltZSBzbyBlbnRyeSBpbmxpbmluZyBpcyBkaXNhYmxlZFxuLyoqKioqKi8gXHQvLyBzdGFydHVwXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg2ODYpO1xuLyoqKioqKi8gfSkoKVxuLmRlZmF1bHQ7XG59KTsiLCAiLyohXG4gKiBUb2FzdGlmeSBqcyAxLjExLjJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHZhcnVuL3RvYXN0aWZ5LWpzXG4gKiBAbGljZW5zZSBNSVQgbGljZW5zZWRcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggVmFydW4gQSBQXG4gKi9cbihmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5Ub2FzdGlmeSA9IGZhY3RvcnkoKTtcbiAgfVxufSkodGhpcywgZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIC8vIE9iamVjdCBpbml0aWFsaXphdGlvblxuICB2YXIgVG9hc3RpZnkgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAvLyBSZXR1cm5pbmcgYSBuZXcgaW5pdCBvYmplY3RcbiAgICAgIHJldHVybiBuZXcgVG9hc3RpZnkubGliLmluaXQob3B0aW9ucyk7XG4gICAgfSxcbiAgICAvLyBMaWJyYXJ5IHZlcnNpb25cbiAgICB2ZXJzaW9uID0gXCIxLjExLjJcIjtcblxuICAvLyBTZXQgdGhlIGRlZmF1bHQgZ2xvYmFsIG9wdGlvbnNcbiAgVG9hc3RpZnkuZGVmYXVsdHMgPSB7XG4gICAgb2xkZXN0Rmlyc3Q6IHRydWUsXG4gICAgdGV4dDogXCJUb2FzdGlmeSBpcyBhd2Vzb21lIVwiLFxuICAgIG5vZGU6IHVuZGVmaW5lZCxcbiAgICBkdXJhdGlvbjogMzAwMCxcbiAgICBzZWxlY3RvcjogdW5kZWZpbmVkLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcbiAgICBkZXN0aW5hdGlvbjogdW5kZWZpbmVkLFxuICAgIG5ld1dpbmRvdzogZmFsc2UsXG4gICAgY2xvc2U6IGZhbHNlLFxuICAgIGdyYXZpdHk6IFwidG9hc3RpZnktdG9wXCIsXG4gICAgcG9zaXRpb25MZWZ0OiBmYWxzZSxcbiAgICBwb3NpdGlvbjogJycsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnJyxcbiAgICBhdmF0YXI6IFwiXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLFxuICAgIHN0b3BPbkZvY3VzOiB0cnVlLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuICAgIG9mZnNldDoge3g6IDAsIHk6IDB9LFxuICAgIGVzY2FwZU1hcmt1cDogdHJ1ZSxcbiAgICBzdHlsZToge2JhY2tncm91bmQ6ICcnfVxuICB9O1xuXG4gIC8vIERlZmluaW5nIHRoZSBwcm90b3R5cGUgb2YgdGhlIG9iamVjdFxuICBUb2FzdGlmeS5saWIgPSBUb2FzdGlmeS5wcm90b3R5cGUgPSB7XG4gICAgdG9hc3RpZnk6IHZlcnNpb24sXG5cbiAgICBjb25zdHJ1Y3RvcjogVG9hc3RpZnksXG5cbiAgICAvLyBJbml0aWFsaXppbmcgdGhlIG9iamVjdCB3aXRoIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgICBpbml0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAvLyBWZXJpZnlpbmcgYW5kIHZhbGlkYXRpbmcgdGhlIGlucHV0IG9iamVjdFxuICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRpbmcgdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgICB0aGlzLm9wdGlvbnMgPSB7fTtcblxuICAgICAgdGhpcy50b2FzdEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAvLyBWYWxpZGF0aW5nIHRoZSBvcHRpb25zXG4gICAgICB0aGlzLm9wdGlvbnMudGV4dCA9IG9wdGlvbnMudGV4dCB8fCBUb2FzdGlmeS5kZWZhdWx0cy50ZXh0OyAvLyBEaXNwbGF5IG1lc3NhZ2VcbiAgICAgIHRoaXMub3B0aW9ucy5ub2RlID0gb3B0aW9ucy5ub2RlIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLm5vZGU7ICAvLyBEaXNwbGF5IGNvbnRlbnQgYXMgbm9kZVxuICAgICAgdGhpcy5vcHRpb25zLmR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiA9PT0gMCA/IDAgOiBvcHRpb25zLmR1cmF0aW9uIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmR1cmF0aW9uOyAvLyBEaXNwbGF5IGR1cmF0aW9uXG4gICAgICB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPSBvcHRpb25zLnNlbGVjdG9yIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLnNlbGVjdG9yOyAvLyBQYXJlbnQgc2VsZWN0b3JcbiAgICAgIHRoaXMub3B0aW9ucy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgVG9hc3RpZnkuZGVmYXVsdHMuY2FsbGJhY2s7IC8vIENhbGxiYWNrIGFmdGVyIGRpc3BsYXlcbiAgICAgIHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbiA9IG9wdGlvbnMuZGVzdGluYXRpb24gfHwgVG9hc3RpZnkuZGVmYXVsdHMuZGVzdGluYXRpb247IC8vIE9uLWNsaWNrIGRlc3RpbmF0aW9uXG4gICAgICB0aGlzLm9wdGlvbnMubmV3V2luZG93ID0gb3B0aW9ucy5uZXdXaW5kb3cgfHwgVG9hc3RpZnkuZGVmYXVsdHMubmV3V2luZG93OyAvLyBPcGVuIGRlc3RpbmF0aW9uIGluIG5ldyB3aW5kb3dcbiAgICAgIHRoaXMub3B0aW9ucy5jbG9zZSA9IG9wdGlvbnMuY2xvc2UgfHwgVG9hc3RpZnkuZGVmYXVsdHMuY2xvc2U7IC8vIFNob3cgdG9hc3QgY2xvc2UgaWNvblxuICAgICAgdGhpcy5vcHRpb25zLmdyYXZpdHkgPSBvcHRpb25zLmdyYXZpdHkgPT09IFwiYm90dG9tXCIgPyBcInRvYXN0aWZ5LWJvdHRvbVwiIDogVG9hc3RpZnkuZGVmYXVsdHMuZ3Jhdml0eTsgLy8gdG9hc3QgcG9zaXRpb24gLSB0b3Agb3IgYm90dG9tXG4gICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25MZWZ0ID0gb3B0aW9ucy5wb3NpdGlvbkxlZnQgfHwgVG9hc3RpZnkuZGVmYXVsdHMucG9zaXRpb25MZWZ0OyAvLyB0b2FzdCBwb3NpdGlvbiAtIGxlZnQgb3IgcmlnaHRcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24gfHwgVG9hc3RpZnkuZGVmYXVsdHMucG9zaXRpb247IC8vIHRvYXN0IHBvc2l0aW9uIC0gbGVmdCBvciByaWdodFxuICAgICAgdGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmJhY2tncm91bmRDb2xvcjsgLy8gdG9hc3QgYmFja2dyb3VuZCBjb2xvclxuICAgICAgdGhpcy5vcHRpb25zLmF2YXRhciA9IG9wdGlvbnMuYXZhdGFyIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmF2YXRhcjsgLy8gaW1nIGVsZW1lbnQgc3JjIC0gdXJsIG9yIGEgcGF0aFxuICAgICAgdGhpcy5vcHRpb25zLmNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3NOYW1lIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmNsYXNzTmFtZTsgLy8gYWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3IgdGhlIHRvYXN0XG4gICAgICB0aGlzLm9wdGlvbnMuc3RvcE9uRm9jdXMgPSBvcHRpb25zLnN0b3BPbkZvY3VzID09PSB1bmRlZmluZWQgPyBUb2FzdGlmeS5kZWZhdWx0cy5zdG9wT25Gb2N1cyA6IG9wdGlvbnMuc3RvcE9uRm9jdXM7IC8vIHN0b3AgdGltZW91dCBvbiBmb2N1c1xuICAgICAgdGhpcy5vcHRpb25zLm9uQ2xpY2sgPSBvcHRpb25zLm9uQ2xpY2sgfHwgVG9hc3RpZnkuZGVmYXVsdHMub25DbGljazsgLy8gQ2FsbGJhY2sgYWZ0ZXIgY2xpY2tcbiAgICAgIHRoaXMub3B0aW9ucy5vZmZzZXQgPSBvcHRpb25zLm9mZnNldCB8fCBUb2FzdGlmeS5kZWZhdWx0cy5vZmZzZXQ7IC8vIHRvYXN0IG9mZnNldFxuICAgICAgdGhpcy5vcHRpb25zLmVzY2FwZU1hcmt1cCA9IG9wdGlvbnMuZXNjYXBlTWFya3VwICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmVzY2FwZU1hcmt1cCA6IFRvYXN0aWZ5LmRlZmF1bHRzLmVzY2FwZU1hcmt1cDtcbiAgICAgIHRoaXMub3B0aW9ucy5zdHlsZSA9IG9wdGlvbnMuc3R5bGUgfHwgVG9hc3RpZnkuZGVmYXVsdHMuc3R5bGU7XG4gICAgICBpZihvcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc3R5bGUuYmFja2dyb3VuZCA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm5pbmcgdGhlIGN1cnJlbnQgb2JqZWN0IGZvciBjaGFpbmluZyBmdW5jdGlvbnNcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZGluZyB0aGUgRE9NIGVsZW1lbnRcbiAgICBidWlsZFRvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFZhbGlkYXRpbmcgaWYgdGhlIG9wdGlvbnMgYXJlIGRlZmluZWRcbiAgICAgIGlmICghdGhpcy5vcHRpb25zKSB7XG4gICAgICAgIHRocm93IFwiVG9hc3RpZnkgaXMgbm90IGluaXRpYWxpemVkXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0XG4gICAgICB2YXIgZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSA9IFwidG9hc3RpZnkgb24gXCIgKyB0aGlzLm9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gICAgICAvLyBQb3NpdGlvbmluZyB0b2FzdCB0byBsZWZ0IG9yIHJpZ2h0IG9yIGNlbnRlclxuICAgICAgaWYgKCEhdGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LVwiICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVG8gYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9uc1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LWxlZnRcIjtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Byb3BlcnR5IGBwb3NpdGlvbkxlZnRgIHdpbGwgYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9ucy4gUGxlYXNlIHVzZSBgcG9zaXRpb25gIGluc3RlYWQuJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uXG4gICAgICAgICAgZGl2RWxlbWVudC5jbGFzc05hbWUgKz0gXCIgdG9hc3RpZnktcmlnaHRcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ25pbmcgZ3Jhdml0eSBvZiBlbGVtZW50XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSArPSBcIiBcIiArIHRoaXMub3B0aW9ucy5ncmF2aXR5O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAvLyBUaGlzIGlzIGJlaW5nIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdXNpbmcgdGhlIHN0eWxlIEhUTUwgRE9NIHByb3BlcnR5XG4gICAgICAgIGNvbnNvbGUud2FybignREVQUkVDQVRJT04gTk9USUNFOiBcImJhY2tncm91bmRDb2xvclwiIGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFwic3R5bGUuYmFja2dyb3VuZFwiIHByb3BlcnR5LicpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggb3VyIHN0eWxlIG9iamVjdCBhbmQgYXBwbHkgc3R5bGVzIHRvIGRpdkVsZW1lbnRcbiAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMub3B0aW9ucy5zdHlsZSkge1xuICAgICAgICBkaXZFbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IHRoaXMub3B0aW9ucy5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGluZyB0aGUgdG9hc3QgbWVzc2FnZS9ub2RlXG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vZGUgJiYgdGhpcy5vcHRpb25zLm5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWxpZCBub2RlLCB3ZSBpbnNlcnQgaXRcbiAgICAgICAgZGl2RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLm9wdGlvbnMubm9kZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXNjYXBlTWFya3VwKSB7XG4gICAgICAgICAgZGl2RWxlbWVudC5pbm5lclRleHQgPSB0aGlzLm9wdGlvbnMudGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXZFbGVtZW50LmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy50ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdmF0YXIgIT09IFwiXCIpIHtcbiAgICAgICAgICB2YXIgYXZhdGFyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICAgYXZhdGFyRWxlbWVudC5zcmMgPSB0aGlzLm9wdGlvbnMuYXZhdGFyO1xuXG4gICAgICAgICAgYXZhdGFyRWxlbWVudC5jbGFzc05hbWUgPSBcInRvYXN0aWZ5LWF2YXRhclwiO1xuXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PSBcImxlZnRcIiB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb25MZWZ0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgbGVmdCBvZiBjb250ZW50XG4gICAgICAgICAgICBkaXZFbGVtZW50LmFwcGVuZENoaWxkKGF2YXRhckVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgcmlnaHQgb2YgY29udGVudFxuICAgICAgICAgICAgZGl2RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGF2YXRhckVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgYSBjbG9zZSBpY29uIHRvIHRoZSB0b2FzdFxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBzcGFuIGZvciBjbG9zZSBlbGVtZW50XG4gICAgICAgIHZhciBjbG9zZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgY2xvc2VFbGVtZW50LmlubmVySFRNTCA9IFwiJiMxMDAwNjtcIjtcblxuICAgICAgICBjbG9zZUVsZW1lbnQuY2xhc3NOYW1lID0gXCJ0b2FzdC1jbG9zZVwiO1xuXG4gICAgICAgIC8vIFRyaWdnZXJpbmcgdGhlIHJlbW92YWwgb2YgdG9hc3QgZnJvbSBET00gb24gY2xvc2UgY2xpY2tcbiAgICAgICAgY2xvc2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbWVudCh0aGlzLnRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9DYWxjdWxhdGluZyBzY3JlZW4gd2lkdGhcbiAgICAgICAgdmFyIHdpZHRoID0gd2luZG93LmlubmVyV2lkdGggPiAwID8gd2luZG93LmlubmVyV2lkdGggOiBzY3JlZW4ud2lkdGg7XG5cbiAgICAgICAgLy8gQWRkaW5nIHRoZSBjbG9zZSBpY29uIHRvIHRoZSB0b2FzdCBlbGVtZW50XG4gICAgICAgIC8vIERpc3BsYXkgb24gdGhlIHJpZ2h0IGlmIHNjcmVlbiB3aWR0aCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzYwcHhcbiAgICAgICAgaWYgKCh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkgJiYgd2lkdGggPiAzNjApIHtcbiAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgbGVmdCBvZiBjb250ZW50XG4gICAgICAgICAgZGl2RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkaW5nIGNsb3NlIGljb24gb24gdGhlIHJpZ2h0IG9mIGNvbnRlbnRcbiAgICAgICAgICBkaXZFbGVtZW50LmFwcGVuZENoaWxkKGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGltZW91dCB3aGlsZSB0b2FzdCBpcyBmb2N1c2VkXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnN0b3BPbkZvY3VzICYmIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAvLyBzdG9wIGNvdW50ZG93blxuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJtb3VzZW92ZXJcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChkaXZFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICAgIC8vIGFkZCBiYWNrIHRoZSB0aW1lb3V0XG4gICAgICAgIGRpdkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcIm1vdXNlbGVhdmVcIixcbiAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRpdkVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdG9hc3QgZnJvbSBET01cbiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUVsZW1lbnQoZGl2RWxlbWVudCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kdXJhdGlvblxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgYW4gb24tY2xpY2sgZGVzdGluYXRpb24gcGF0aFxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZGl2RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5ld1dpbmRvdyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24sIFwiX2JsYW5rXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gdGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5vbkNsaWNrID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkNsaWNrKCk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGluZyBvZmZzZXRcbiAgICAgIGlmKHR5cGVvZiB0aGlzLm9wdGlvbnMub2Zmc2V0ID09PSBcIm9iamVjdFwiKSB7XG5cbiAgICAgICAgdmFyIHggPSBnZXRBeGlzT2Zmc2V0QVZhbHVlKFwieFwiLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB2YXIgeSA9IGdldEF4aXNPZmZzZXRBVmFsdWUoXCJ5XCIsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHhPZmZzZXQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgPyB4IDogXCItXCIgKyB4O1xuICAgICAgICB2YXIgeU9mZnNldCA9IHRoaXMub3B0aW9ucy5ncmF2aXR5ID09IFwidG9hc3RpZnktdG9wXCIgPyB5IDogXCItXCIgKyB5O1xuXG4gICAgICAgIGRpdkVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUoXCIgKyB4T2Zmc2V0ICsgXCIsXCIgKyB5T2Zmc2V0ICsgXCIpXCI7XG5cbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuaW5nIHRoZSBnZW5lcmF0ZWQgZWxlbWVudFxuICAgICAgcmV0dXJuIGRpdkVsZW1lbnQ7XG4gICAgfSxcblxuICAgIC8vIERpc3BsYXlpbmcgdGhlIHRvYXN0XG4gICAgc2hvd1RvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0IGZvciB0aGUgdG9hc3RcbiAgICAgIHRoaXMudG9hc3RFbGVtZW50ID0gdGhpcy5idWlsZFRvYXN0KCk7XG5cbiAgICAgIC8vIEdldHRpbmcgdGhlIHJvb3QgZWxlbWVudCB0byB3aXRoIHRoZSB0b2FzdCBuZWVkcyB0byBiZSBhZGRlZFxuICAgICAgdmFyIHJvb3RFbGVtZW50O1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0b3IgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAodHlwZW9mIFNoYWRvd1Jvb3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMub3B0aW9ucy5zZWxlY3RvciBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpKSB7XG4gICAgICAgIHJvb3RFbGVtZW50ID0gdGhpcy5vcHRpb25zLnNlbGVjdG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0aW5nIGlmIHJvb3QgZWxlbWVudCBpcyBwcmVzZW50IGluIERPTVxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICB0aHJvdyBcIlJvb3QgZWxlbWVudCBpcyBub3QgZGVmaW5lZFwiO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgdGhlIERPTSBlbGVtZW50XG4gICAgICB2YXIgZWxlbWVudFRvSW5zZXJ0ID0gVG9hc3RpZnkuZGVmYXVsdHMub2xkZXN0Rmlyc3QgPyByb290RWxlbWVudC5maXJzdENoaWxkIDogcm9vdEVsZW1lbnQubGFzdENoaWxkO1xuICAgICAgcm9vdEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMudG9hc3RFbGVtZW50LCBlbGVtZW50VG9JbnNlcnQpO1xuXG4gICAgICAvLyBSZXBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgaW4gY2FzZSBtdWx0aXBsZSB0b2FzdHMgYXJlIHByZXNlbnRcbiAgICAgIFRvYXN0aWZ5LnJlcG9zaXRpb24oKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRvYXN0IGZyb20gRE9NXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQodGhpcy50b2FzdEVsZW1lbnQpO1xuICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZHVyYXRpb25cbiAgICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICAgIH1cblxuICAgICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGhpZGVUb2FzdDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0RWxlbWVudC50aW1lT3V0VmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHRoaXMudG9hc3RFbGVtZW50KTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZpbmcgdGhlIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAgcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24odG9hc3RFbGVtZW50KSB7XG4gICAgICAvLyBIaWRpbmcgdGhlIGVsZW1lbnRcbiAgICAgIC8vIHRvYXN0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwib25cIik7XG4gICAgICB0b2FzdEVsZW1lbnQuY2xhc3NOYW1lID0gdG9hc3RFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKFwiIG9uXCIsIFwiXCIpO1xuXG4gICAgICAvLyBSZW1vdmluZyB0aGUgZWxlbWVudCBmcm9tIERPTSBhZnRlciB0cmFuc2l0aW9uIGVuZFxuICAgICAgd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIHJlbW92ZSBvcHRpb25zIG5vZGUgaWYgYW55XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub2RlICYmIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5vcHRpb25zLm5vZGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBET00sIG9ubHkgd2hlbiB0aGUgcGFyZW50IG5vZGUgd2FzIG5vdCByZW1vdmVkIGJlZm9yZS5cbiAgICAgICAgICBpZiAodG9hc3RFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRvYXN0RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2FsbGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgICAgICB0aGlzLm9wdGlvbnMuY2FsbGJhY2suY2FsbCh0b2FzdEVsZW1lbnQpO1xuXG4gICAgICAgICAgLy8gUmVwb3NpdGlvbmluZyB0aGUgdG9hc3RzIGFnYWluXG4gICAgICAgICAgVG9hc3RpZnkucmVwb3NpdGlvbigpO1xuICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgIDQwMFxuICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICB9LFxuICB9O1xuXG4gIC8vIFBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgb24gdGhlIERPTVxuICBUb2FzdGlmeS5yZXBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBUb3AgbWFyZ2lucyB3aXRoIGdyYXZpdHlcbiAgICB2YXIgdG9wTGVmdE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciB0b3BSaWdodE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciBvZmZzZXRTaXplID0ge1xuICAgICAgdG9wOiAxNSxcbiAgICAgIGJvdHRvbTogMTUsXG4gICAgfTtcblxuICAgIC8vIEdldCBhbGwgdG9hc3QgbWVzc2FnZXMgb24gdGhlIERPTVxuICAgIHZhciBhbGxUb2FzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwidG9hc3RpZnlcIik7XG5cbiAgICB2YXIgY2xhc3NVc2VkO1xuXG4gICAgLy8gTW9kaWZ5aW5nIHRoZSBwb3NpdGlvbiBvZiBlYWNoIHRvYXN0IGVsZW1lbnRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFRvYXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0dGluZyB0aGUgYXBwbGllZCBncmF2aXR5XG4gICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktdG9wXCIpID09PSB0cnVlKSB7XG4gICAgICAgIGNsYXNzVXNlZCA9IFwidG9hc3RpZnktdG9wXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc1VzZWQgPSBcInRvYXN0aWZ5LWJvdHRvbVwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVpZ2h0ID0gYWxsVG9hc3RzW2ldLm9mZnNldEhlaWdodDtcbiAgICAgIGNsYXNzVXNlZCA9IGNsYXNzVXNlZC5zdWJzdHIoOSwgY2xhc3NVc2VkLmxlbmd0aC0xKVxuICAgICAgLy8gU3BhY2luZyBiZXR3ZWVuIHRvYXN0c1xuICAgICAgdmFyIG9mZnNldCA9IDE1O1xuXG4gICAgICB2YXIgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCA+IDAgPyB3aW5kb3cuaW5uZXJXaWR0aCA6IHNjcmVlbi53aWR0aDtcblxuICAgICAgLy8gU2hvdyB0b2FzdCBpbiBjZW50ZXIgaWYgc2NyZWVuIHdpdGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDM2MHB4XG4gICAgICBpZiAod2lkdGggPD0gMzYwKSB7XG4gICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgIGFsbFRvYXN0c1tpXS5zdHlsZVtjbGFzc1VzZWRdID0gb2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgIG9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktbGVmdFwiKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgICAgYWxsVG9hc3RzW2ldLnN0eWxlW2NsYXNzVXNlZF0gPSB0b3BMZWZ0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wTGVmdE9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0dGluZyB0aGUgcG9zaXRpb25cbiAgICAgICAgICBhbGxUb2FzdHNbaV0uc3R5bGVbY2xhc3NVc2VkXSA9IHRvcFJpZ2h0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wUmlnaHRPZmZzZXRTaXplW2NsYXNzVXNlZF0gKz0gaGVpZ2h0ICsgb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgb2Zmc2V0LlxuICBmdW5jdGlvbiBnZXRBeGlzT2Zmc2V0QVZhbHVlKGF4aXMsIG9wdGlvbnMpIHtcblxuICAgIGlmKG9wdGlvbnMub2Zmc2V0W2F4aXNdKSB7XG4gICAgICBpZihpc05hTihvcHRpb25zLm9mZnNldFtheGlzXSkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMub2Zmc2V0W2F4aXNdO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLm9mZnNldFtheGlzXSArICdweCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcwcHgnO1xuXG4gIH1cblxuICBmdW5jdGlvbiBjb250YWluc0NsYXNzKGVsZW0sIHlvdXJDbGFzcykge1xuICAgIGlmICghZWxlbSB8fCB0eXBlb2YgeW91ckNsYXNzICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGVsZW0uY2xhc3NOYW1lICYmXG4gICAgICBlbGVtLmNsYXNzTmFtZVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgvXFxzKy9naSlcbiAgICAgICAgLmluZGV4T2YoeW91ckNsYXNzKSA+IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldHRpbmcgdXAgdGhlIHByb3RvdHlwZSBmb3IgdGhlIGluaXQgb2JqZWN0XG4gIFRvYXN0aWZ5LmxpYi5pbml0LnByb3RvdHlwZSA9IFRvYXN0aWZ5LmxpYjtcblxuICAvLyBSZXR1cm5pbmcgdGhlIFRvYXN0aWZ5IGZ1bmN0aW9uIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSB3aW5kb3cgb2JqZWN0L21vZHVsZVxuICByZXR1cm4gVG9hc3RpZnk7XG59KTtcbiIsICIvKipcbiAqIEBsaWNlbnNlIE1JVFxuICogdG9wYmFyIDEuMC4wLCAyMDIxLTAxLTA2XG4gKiBodHRwOi8vYnV1bmd1eWVuLmdpdGh1Yi5pby90b3BiYXJcbiAqIENvcHlyaWdodCAoYykgMjAyMSBCdXUgTmd1eWVuXG4gKi9cbihmdW5jdGlvbih3aW5kb3csZG9jdW1lbnQpe1widXNlIHN0cmljdFwiOyFmdW5jdGlvbigpe2Zvcih2YXIgbGFzdFRpbWU9MCx2ZW5kb3JzPVtcIm1zXCIsXCJtb3pcIixcIndlYmtpdFwiLFwib1wiXSx4PTA7eDx2ZW5kb3JzLmxlbmd0aCYmIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7Kyt4KXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9d2luZG93W3ZlbmRvcnNbeF0rXCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIl0sd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lPXdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsQW5pbWF0aW9uRnJhbWVcIl18fHdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGNhbGxiYWNrLGVsZW1lbnQpe3ZhciBjdXJyVGltZT0obmV3IERhdGUpLmdldFRpbWUoKSx0aW1lVG9DYWxsPU1hdGgubWF4KDAsMTYtKGN1cnJUaW1lLWxhc3RUaW1lKSksaWQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtjYWxsYmFjayhjdXJyVGltZSt0aW1lVG9DYWxsKX0sdGltZVRvQ2FsbCk7cmV0dXJuIGxhc3RUaW1lPWN1cnJUaW1lK3RpbWVUb0NhbGwsaWR9KSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oaWQpe2NsZWFyVGltZW91dChpZCl9KX0oKTtmdW5jdGlvbiByZXBhaW50KCl7Y2FudmFzLndpZHRoPXdpbmRvdy5pbm5lcldpZHRoLGNhbnZhcy5oZWlnaHQ9NSpvcHRpb25zLmJhclRoaWNrbmVzczt2YXIgY3R4PWNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7Y3R4LnNoYWRvd0JsdXI9b3B0aW9ucy5zaGFkb3dCbHVyLGN0eC5zaGFkb3dDb2xvcj1vcHRpb25zLnNoYWRvd0NvbG9yO3ZhciBzdG9wLGxpbmVHcmFkaWVudD1jdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwwLGNhbnZhcy53aWR0aCwwKTtmb3Ioc3RvcCBpbiBvcHRpb25zLmJhckNvbG9ycylsaW5lR3JhZGllbnQuYWRkQ29sb3JTdG9wKHN0b3Asb3B0aW9ucy5iYXJDb2xvcnNbc3RvcF0pO2N0eC5saW5lV2lkdGg9b3B0aW9ucy5iYXJUaGlja25lc3MsY3R4LmJlZ2luUGF0aCgpLGN0eC5tb3ZlVG8oMCxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHgubGluZVRvKE1hdGguY2VpbChjdXJyZW50UHJvZ3Jlc3MqY2FudmFzLndpZHRoKSxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHguc3Ryb2tlU3R5bGU9bGluZUdyYWRpZW50LGN0eC5zdHJva2UoKX12YXIgY2FudmFzLHByb2dyZXNzVGltZXJJZCxmYWRlVGltZXJJZCxjdXJyZW50UHJvZ3Jlc3Msc2hvd2luZyxvcHRpb25zPXthdXRvUnVuOiEwLGJhclRoaWNrbmVzczozLGJhckNvbG9yczp7MDpcInJnYmEoMjYsICAxODgsIDE1NiwgLjkpXCIsXCIuMjVcIjpcInJnYmEoNTIsICAxNTIsIDIxOSwgLjkpXCIsXCIuNTBcIjpcInJnYmEoMjQxLCAxOTYsIDE1LCAgLjkpXCIsXCIuNzVcIjpcInJnYmEoMjMwLCAxMjYsIDM0LCAgLjkpXCIsXCIxLjBcIjpcInJnYmEoMjExLCA4NCwgIDAsICAgLjkpXCJ9LHNoYWRvd0JsdXI6MTAsc2hhZG93Q29sb3I6XCJyZ2JhKDAsICAgMCwgICAwLCAgIC42KVwiLGNsYXNzTmFtZTpudWxsfSx0b3BiYXI9e2NvbmZpZzpmdW5jdGlvbihvcHRzKXtmb3IodmFyIGtleSBpbiBvcHRzKW9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSYmKG9wdGlvbnNba2V5XT1vcHRzW2tleV0pfSxzaG93OmZ1bmN0aW9uKCl7dmFyIHR5cGUsaGFuZGxlcixlbGVtO3Nob3dpbmd8fChzaG93aW5nPSEwLG51bGwhPT1mYWRlVGltZXJJZCYmd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGZhZGVUaW1lcklkKSxjYW52YXN8fCgoZWxlbT0oY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpLnN0eWxlKS5wb3NpdGlvbj1cImZpeGVkXCIsZWxlbS50b3A9ZWxlbS5sZWZ0PWVsZW0ucmlnaHQ9ZWxlbS5tYXJnaW49ZWxlbS5wYWRkaW5nPTAsZWxlbS56SW5kZXg9MTAwMDAxLGVsZW0uZGlzcGxheT1cIm5vbmVcIixvcHRpb25zLmNsYXNzTmFtZSYmY2FudmFzLmNsYXNzTGlzdC5hZGQob3B0aW9ucy5jbGFzc05hbWUpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKSx0eXBlPVwicmVzaXplXCIsaGFuZGxlcj1yZXBhaW50LChlbGVtPXdpbmRvdykuYWRkRXZlbnRMaXN0ZW5lcj9lbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSxoYW5kbGVyLCExKTplbGVtLmF0dGFjaEV2ZW50P2VsZW0uYXR0YWNoRXZlbnQoXCJvblwiK3R5cGUsaGFuZGxlcik6ZWxlbVtcIm9uXCIrdHlwZV09aGFuZGxlciksY2FudmFzLnN0eWxlLm9wYWNpdHk9MSxjYW52YXMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCIsdG9wYmFyLnByb2dyZXNzKDApLG9wdGlvbnMuYXV0b1J1biYmZnVuY3Rpb24gbG9vcCgpe3Byb2dyZXNzVGltZXJJZD13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApLHRvcGJhci5wcm9ncmVzcyhcIitcIisuMDUqTWF0aC5wb3coMS1NYXRoLnNxcnQoY3VycmVudFByb2dyZXNzKSwyKSl9KCkpfSxwcm9ncmVzczpmdW5jdGlvbih0byl7cmV0dXJuIHZvaWQgMD09PXRvfHwoXCJzdHJpbmdcIj09dHlwZW9mIHRvJiYodG89KDA8PXRvLmluZGV4T2YoXCIrXCIpfHwwPD10by5pbmRleE9mKFwiLVwiKT9jdXJyZW50UHJvZ3Jlc3M6MCkrcGFyc2VGbG9hdCh0bykpLGN1cnJlbnRQcm9ncmVzcz0xPHRvPzE6dG8scmVwYWludCgpKSxjdXJyZW50UHJvZ3Jlc3N9LGhpZGU6ZnVuY3Rpb24oKXtzaG93aW5nJiYoc2hvd2luZz0hMSxudWxsIT1wcm9ncmVzc1RpbWVySWQmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NUaW1lcklkKSxwcm9ncmVzc1RpbWVySWQ9bnVsbCksZnVuY3Rpb24gbG9vcCgpe3JldHVybiAxPD10b3BiYXIucHJvZ3Jlc3MoXCIrLjFcIikmJihjYW52YXMuc3R5bGUub3BhY2l0eS09LjA1LGNhbnZhcy5zdHlsZS5vcGFjaXR5PD0uMDUpPyhjYW52YXMuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix2b2lkKGZhZGVUaW1lcklkPW51bGwpKTp2b2lkKGZhZGVUaW1lcklkPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCkpfSgpKX19O1wib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz10b3BiYXI6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiB0b3BiYXJ9KTp0aGlzLnRvcGJhcj10b3BiYXJ9KS5jYWxsKHRoaXMsd2luZG93LGRvY3VtZW50KTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbihmdW5jdGlvbigpIHtcbiAgdmFyIFBvbHlmaWxsRXZlbnQgPSBldmVudENvbnN0cnVjdG9yKCk7XG5cbiAgZnVuY3Rpb24gZXZlbnRDb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gd2luZG93LkN1c3RvbUV2ZW50O1xuICAgIC8vIElFPD05IFN1cHBvcnRcbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge2J1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWR9O1xuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICAgIHJldHVybiBldnQ7XG4gICAgfVxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRIaWRkZW5JbnB1dChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC50eXBlID0gXCJoaWRkZW5cIjtcbiAgICBpbnB1dC5uYW1lID0gbmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGVsZW1lbnQsIHRhcmdldE1vZGlmaWVyS2V5KSB7XG4gICAgdmFyIHRvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRvXCIpLFxuICAgICAgICBtZXRob2QgPSBidWlsZEhpZGRlbklucHV0KFwiX21ldGhvZFwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpKSxcbiAgICAgICAgY3NyZiA9IGJ1aWxkSGlkZGVuSW5wdXQoXCJfY3NyZl90b2tlblwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3NyZlwiKSksXG4gICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSxcbiAgICAgICAgc3VibWl0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLFxuICAgICAgICB0YXJnZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcblxuICAgIGZvcm0ubWV0aG9kID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikgPT09IFwiZ2V0XCIpID8gXCJnZXRcIiA6IFwicG9zdFwiO1xuICAgIGZvcm0uYWN0aW9uID0gdG87XG4gICAgZm9ybS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cbiAgICBpZiAodGFyZ2V0KSBmb3JtLnRhcmdldCA9IHRhcmdldDtcbiAgICBlbHNlIGlmICh0YXJnZXRNb2RpZmllcktleSkgZm9ybS50YXJnZXQgPSBcIl9ibGFua1wiO1xuXG4gICAgZm9ybS5hcHBlbmRDaGlsZChjc3JmKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKG1ldGhvZCk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcblxuICAgIC8vIEluc2VydCBhIGJ1dHRvbiBhbmQgY2xpY2sgaXQgaW5zdGVhZCBvZiB1c2luZyBgZm9ybS5zdWJtaXRgXG4gICAgLy8gYmVjYXVzZSB0aGUgYHN1Ym1pdGAgZnVuY3Rpb24gZG9lcyBub3QgZW1pdCBhIGBzdWJtaXRgIGV2ZW50LlxuICAgIHN1Ym1pdC50eXBlID0gXCJzdWJtaXRcIjtcbiAgICBmb3JtLmFwcGVuZENoaWxkKHN1Ym1pdCk7XG4gICAgc3VibWl0LmNsaWNrKCk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWxlbWVudCA9IGUudGFyZ2V0O1xuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7XG4gICAgICB2YXIgcGhvZW5peExpbmtFdmVudCA9IG5ldyBQb2x5ZmlsbEV2ZW50KCdwaG9lbml4LmxpbmsuY2xpY2snLCB7XG4gICAgICAgIFwiYnViYmxlc1wiOiB0cnVlLCBcImNhbmNlbGFibGVcIjogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghZWxlbWVudC5kaXNwYXRjaEV2ZW50KHBob2VuaXhMaW5rRXZlbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1ldGhvZFwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdG9cIikpIHtcbiAgICAgICAgaGFuZGxlQ2xpY2soZWxlbWVudCwgZS5tZXRhS2V5IHx8IGUuc2hpZnRLZXkpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9LCBmYWxzZSk7XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Bob2VuaXgubGluay5jbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIG1lc3NhZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbmZpcm1cIik7XG4gICAgaWYobWVzc2FnZSAmJiAhd2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbn0pKCk7XG4iLCAiLy8gd3JhcHMgdmFsdWUgaW4gY2xvc3VyZSBvciByZXR1cm5zIGNsb3N1cmVcbmV4cG9ydCBsZXQgY2xvc3VyZSA9ICh2YWx1ZSkgPT4ge1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgbGV0IGNsb3N1cmUgPSBmdW5jdGlvbiAoKXsgcmV0dXJuIHZhbHVlIH1cbiAgICByZXR1cm4gY2xvc3VyZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGdsb2JhbFNlbGYgPSB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiBudWxsXG5leHBvcnQgY29uc3QgcGh4V2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG51bGxcbmV4cG9ydCBjb25zdCBnbG9iYWwgPSBnbG9iYWxTZWxmIHx8IHBoeFdpbmRvdyB8fCBnbG9iYWxUaGlzXG5leHBvcnQgY29uc3QgREVGQVVMVF9WU04gPSBcIjIuMC4wXCJcbmV4cG9ydCBjb25zdCBTT0NLRVRfU1RBVEVTID0ge2Nvbm5lY3Rpbmc6IDAsIG9wZW46IDEsIGNsb3Npbmc6IDIsIGNsb3NlZDogM31cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFdTX0NMT1NFX05PUk1BTCA9IDEwMDBcbmV4cG9ydCBjb25zdCBDSEFOTkVMX1NUQVRFUyA9IHtcbiAgY2xvc2VkOiBcImNsb3NlZFwiLFxuICBlcnJvcmVkOiBcImVycm9yZWRcIixcbiAgam9pbmVkOiBcImpvaW5lZFwiLFxuICBqb2luaW5nOiBcImpvaW5pbmdcIixcbiAgbGVhdmluZzogXCJsZWF2aW5nXCIsXG59XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9FVkVOVFMgPSB7XG4gIGNsb3NlOiBcInBoeF9jbG9zZVwiLFxuICBlcnJvcjogXCJwaHhfZXJyb3JcIixcbiAgam9pbjogXCJwaHhfam9pblwiLFxuICByZXBseTogXCJwaHhfcmVwbHlcIixcbiAgbGVhdmU6IFwicGh4X2xlYXZlXCJcbn1cblxuZXhwb3J0IGNvbnN0IFRSQU5TUE9SVFMgPSB7XG4gIGxvbmdwb2xsOiBcImxvbmdwb2xsXCIsXG4gIHdlYnNvY2tldDogXCJ3ZWJzb2NrZXRcIlxufVxuZXhwb3J0IGNvbnN0IFhIUl9TVEFURVMgPSB7XG4gIGNvbXBsZXRlOiA0XG59XG5leHBvcnQgY29uc3QgQVVUSF9UT0tFTl9QUkVGSVggPSBcImJhc2U2NHVybC5iZWFyZXIucGh4LlwiXG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIENoYW5uZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBldmVudCwgZm9yIGV4YW1wbGUgYFwicGh4X2pvaW5cImBcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIC0gVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IC0gVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaCB7XG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0KXtcbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgdGhpcy5ldmVudCA9IGV2ZW50XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZCB8fCBmdW5jdGlvbiAoKXsgcmV0dXJuIHt9IH1cbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gICAgdGhpcy5yZWNIb29rcyA9IFtdXG4gICAgdGhpcy5zZW50ID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKi9cbiAgcmVzZW5kKHRpbWVvdXQpe1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICB0aGlzLnJlc2V0KClcbiAgICB0aGlzLnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZW5kKCl7XG4gICAgaWYodGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIikpeyByZXR1cm4gfVxuICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICB0aGlzLnNlbnQgPSB0cnVlXG4gICAgdGhpcy5jaGFubmVsLnNvY2tldC5wdXNoKHtcbiAgICAgIHRvcGljOiB0aGlzLmNoYW5uZWwudG9waWMsXG4gICAgICBldmVudDogdGhpcy5ldmVudCxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCgpLFxuICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuam9pblJlZigpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHN0YXR1c1xuICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrXG4gICAqL1xuICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuaGFzUmVjZWl2ZWQoc3RhdHVzKSl7XG4gICAgICBjYWxsYmFjayh0aGlzLnJlY2VpdmVkUmVzcC5yZXNwb25zZSlcbiAgICB9XG5cbiAgICB0aGlzLnJlY0hvb2tzLnB1c2goe3N0YXR1cywgY2FsbGJhY2t9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlc2V0KCl7XG4gICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgdGhpcy5yZWYgPSBudWxsXG4gICAgdGhpcy5yZWZFdmVudCA9IG51bGxcbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnNlbnQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYXRjaFJlY2VpdmUoe3N0YXR1cywgcmVzcG9uc2UsIF9yZWZ9KXtcbiAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcihoID0+IGguc3RhdHVzID09PSBzdGF0dXMpXG4gICAgICAuZm9yRWFjaChoID0+IGguY2FsbGJhY2socmVzcG9uc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxSZWZFdmVudCgpe1xuICAgIGlmKCF0aGlzLnJlZkV2ZW50KXsgcmV0dXJuIH1cbiAgICB0aGlzLmNoYW5uZWwub2ZmKHRoaXMucmVmRXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVvdXQoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpXG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0VGltZW91dCgpe1xuICAgIGlmKHRoaXMudGltZW91dFRpbWVyKXsgdGhpcy5jYW5jZWxUaW1lb3V0KCkgfVxuICAgIHRoaXMucmVmID0gdGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKClcbiAgICB0aGlzLnJlZkV2ZW50ID0gdGhpcy5jaGFubmVsLnJlcGx5RXZlbnROYW1lKHRoaXMucmVmKVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKHRoaXMucmVmRXZlbnQsIHBheWxvYWQgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgICB0aGlzLmNhbmNlbFRpbWVvdXQoKVxuICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkXG4gICAgICB0aGlzLm1hdGNoUmVjZWl2ZShwYXlsb2FkKVxuICAgIH0pXG5cbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKFwidGltZW91dFwiLCB7fSlcbiAgICB9LCB0aGlzLnRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhhc1JlY2VpdmVkKHN0YXR1cyl7XG4gICAgcmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwICYmIHRoaXMucmVjZWl2ZWRSZXNwLnN0YXR1cyA9PT0gc3RhdHVzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSl7XG4gICAgdGhpcy5jaGFubmVsLnRyaWdnZXIodGhpcy5yZWZFdmVudCwge3N0YXR1cywgcmVzcG9uc2V9KVxuICB9XG59XG4iLCAiLyoqXG4gKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm1cbiAqIGNhbGN1bGF0ZWQgdGltZW91dCByZXRyaWVzLCBzdWNoIGFzIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCByZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDUwMDAsIDEwMDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9KVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgNTAwMFxuICogcmVjb25uZWN0VGltZXIucmVzZXQoKVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lckNhbGNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKXtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsY1xuICAgIHRoaXMudGltZXIgPSBudWxsXG4gICAgdGhpcy50cmllcyA9IDBcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmllcyA9IDBcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBzY2hlZHVsZVRpbWVvdXQgYW5kIHNjaGVkdWxlcyBjYWxsYmFja1xuICAgKi9cbiAgc2NoZWR1bGVUaW1lb3V0KCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpXG5cbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWVzID0gdGhpcy50cmllcyArIDFcbiAgICAgIHRoaXMuY2FsbGJhY2soKVxuICAgIH0sIHRoaXMudGltZXJDYWxjKHRoaXMudHJpZXMgKyAxKSlcbiAgfVxufVxuIiwgImltcG9ydCB7Y2xvc3VyZX0gZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgQ0hBTk5FTF9FVkVOVFMsXG4gIENIQU5ORUxfU1RBVEVTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgUHVzaCBmcm9tIFwiLi9wdXNoXCJcbmltcG9ydCBUaW1lciBmcm9tIFwiLi90aW1lclwiXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICogQHBhcmFtIHsoT2JqZWN0fGZ1bmN0aW9uKX0gcGFyYW1zXG4gKiBAcGFyYW0ge1NvY2tldH0gc29ja2V0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYW5uZWwge1xuICBjb25zdHJ1Y3Rvcih0b3BpYywgcGFyYW1zLCBzb2NrZXQpe1xuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWRcbiAgICB0aGlzLnRvcGljID0gdG9waWNcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUocGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy5iaW5kaW5ncyA9IFtdXG4gICAgdGhpcy5iaW5kaW5nUmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IHRoaXMuc29ja2V0LnRpbWVvdXRcbiAgICB0aGlzLmpvaW5lZE9uY2UgPSBmYWxzZVxuICAgIHRoaXMuam9pblB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5qb2luLCB0aGlzLnBhcmFtcywgdGhpcy50aW1lb3V0KVxuICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5zdGF0ZUNoYW5nZVJlZnMgPSBbXVxuXG4gICAgdGhpcy5yZWpvaW5UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW4oKSB9XG4gICAgfSwgdGhpcy5zb2NrZXQucmVqb2luQWZ0ZXJNcylcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uRXJyb3IoKCkgPT4gdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpKSlcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uT3BlbigoKSA9PiB7XG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuaXNFcnJvcmVkKCkpeyB0aGlzLnJlam9pbigpIH1cbiAgICB9KVxuICAgIClcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuam9pbmVkXG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5mb3JFYWNoKHB1c2hFdmVudCA9PiBwdXNoRXZlbnQuc2VuZCgpKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW11cbiAgICB9KVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcImVycm9yXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgY2xvc2UgJHt0aGlzLnRvcGljfSAke3RoaXMuam9pblJlZigpfWApXG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkXG4gICAgICB0aGlzLnNvY2tldC5yZW1vdmUodGhpcylcbiAgICB9KVxuICAgIHRoaXMub25FcnJvcihyZWFzb24gPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pXG4gICAgICBpZih0aGlzLmlzSm9pbmluZygpKXsgdGhpcy5qb2luUHVzaC5yZXNldCgpIH1cbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGB0aW1lb3V0ICR7dGhpcy50b3BpY30gKCR7dGhpcy5qb2luUmVmKCl9KWAsIHRoaXMuam9pblB1c2gudGltZW91dClcbiAgICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRoaXMudGltZW91dClcbiAgICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICB0aGlzLmpvaW5QdXNoLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMub24oQ0hBTk5FTF9FVkVOVFMucmVwbHksIChwYXlsb2FkLCByZWYpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlcih0aGlzLnJlcGx5RXZlbnROYW1lKHJlZiksIHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2luIHRoZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGpvaW4odGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgaWYodGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRyaWVkIHRvIGpvaW4gbXVsdGlwbGUgdGltZXMuICdqb2luJyBjYW4gb25seSBiZSBjYWxsZWQgYSBzaW5nbGUgdGltZSBwZXIgY2hhbm5lbCBpbnN0YW5jZVwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgICB0aGlzLmpvaW5lZE9uY2UgPSB0cnVlXG4gICAgICB0aGlzLnJlam9pbigpXG4gICAgICByZXR1cm4gdGhpcy5qb2luUHVzaFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIGludG8gY2hhbm5lbCBjbG9zZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25DbG9zZShjYWxsYmFjayl7XG4gICAgdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5jbG9zZSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogSG9vayBpbnRvIGNoYW5uZWwgZXJyb3JzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkVycm9yKGNhbGxiYWNrKXtcbiAgICByZXR1cm4gdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5lcnJvciwgcmVhc29uID0+IGNhbGxiYWNrKHJlYXNvbikpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBvbiBjaGFubmVsIGV2ZW50c1xuICAgKlxuICAgKiBTdWJzY3JpcHRpb24gcmV0dXJucyBhIHJlZiBjb3VudGVyLCB3aGljaCBjYW4gYmUgdXNlZCBsYXRlciB0b1xuICAgKiB1bnN1YnNjcmliZSB0aGUgZXhhY3QgZXZlbnQgbGlzdGVuZXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY29uc3QgcmVmMiA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19vdGhlcl9zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKiAvLyBTaW5jZSB1bnN1YnNjcmlwdGlvbiwgZG9fc3R1ZmYgd29uJ3QgZmlyZSxcbiAgICogLy8gd2hpbGUgZG9fb3RoZXJfc3R1ZmYgd2lsbCBrZWVwIGZpcmluZyBvbiB0aGUgXCJldmVudFwiXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7aW50ZWdlcn0gcmVmXG4gICAqL1xuICBvbihldmVudCwgY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLmJpbmRpbmdSZWYrK1xuICAgIHRoaXMuYmluZGluZ3MucHVzaCh7ZXZlbnQsIHJlZiwgY2FsbGJhY2t9KVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgb2ZmIG9mIGNoYW5uZWwgZXZlbnRzXG4gICAqXG4gICAqIFVzZSB0aGUgcmVmIHJldHVybmVkIGZyb20gYSBjaGFubmVsLm9uKCkgdG8gdW5zdWJzY3JpYmUgb25lXG4gICAqIGhhbmRsZXIsIG9yIHBhc3Mgbm90aGluZyBmb3IgdGhlIHJlZiB0byB1bnN1YnNjcmliZSBhbGxcbiAgICogaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBldmVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gVW5zdWJzY3JpYmUgdGhlIGRvX3N0dWZmIGhhbmRsZXJcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKlxuICAgKiAvLyBVbnN1YnNjcmliZSBhbGwgaGFuZGxlcnMgZnJvbSBldmVudFxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHJlZlxuICAgKi9cbiAgb2ZmKGV2ZW50LCByZWYpe1xuICAgIHRoaXMuYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgcmV0dXJuICEoYmluZC5ldmVudCA9PT0gZXZlbnQgJiYgKHR5cGVvZiByZWYgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVmID09PSBiaW5kLnJlZikpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuUHVzaCgpeyByZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLmlzSm9pbmVkKCkgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgYGV2ZW50YCB0byBwaG9lbml4IHdpdGggdGhlIHBheWxvYWQgYHBheWxvYWRgLlxuICAgKiBQaG9lbml4IHJlY2VpdmVzIHRoaXMgaW4gdGhlIGBoYW5kbGVfaW4oZXZlbnQsIHBheWxvYWQsIHNvY2tldClgXG4gICAqIGZ1bmN0aW9uLiBpZiBwaG9lbml4IHJlcGxpZXMgb3IgaXQgdGltZXMgb3V0IChkZWZhdWx0IDEwMDAwbXMpLFxuICAgKiB0aGVuIG9wdGlvbmFsbHkgdGhlIHJlcGx5IGNhbiBiZSByZWNlaXZlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY2hhbm5lbC5wdXNoKFwiZXZlbnRcIilcbiAgICogICAucmVjZWl2ZShcIm9rXCIsIHBheWxvYWQgPT4gY29uc29sZS5sb2coXCJwaG9lbml4IHJlcGxpZWQ6XCIsIHBheWxvYWQpKVxuICAgKiAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgZXJyID0+IGNvbnNvbGUubG9nKFwicGhvZW5peCBlcnJvcmVkXCIsIGVycikpXG4gICAqICAgLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IGNvbnNvbGUubG9nKFwidGltZWQgb3V0IHB1c2hpbmdcIikpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgcHVzaChldmVudCwgcGF5bG9hZCwgdGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgcGF5bG9hZCA9IHBheWxvYWQgfHwge31cbiAgICBpZighdGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJpZWQgdG8gcHVzaCAnJHtldmVudH0nIHRvICcke3RoaXMudG9waWN9JyBiZWZvcmUgam9pbmluZy4gVXNlIGNoYW5uZWwuam9pbigpIGJlZm9yZSBwdXNoaW5nIGV2ZW50c2ApXG4gICAgfVxuICAgIGxldCBwdXNoRXZlbnQgPSBuZXcgUHVzaCh0aGlzLCBldmVudCwgZnVuY3Rpb24gKCl7IHJldHVybiBwYXlsb2FkIH0sIHRpbWVvdXQpXG4gICAgaWYodGhpcy5jYW5QdXNoKCkpe1xuICAgICAgcHVzaEV2ZW50LnNlbmQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoRXZlbnQuc3RhcnRUaW1lb3V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5wdXNoKHB1c2hFdmVudClcbiAgICB9XG5cbiAgICByZXR1cm4gcHVzaEV2ZW50XG4gIH1cblxuICAvKiogTGVhdmVzIHRoZSBjaGFubmVsXG4gICAqXG4gICAqIFVuc3Vic2NyaWJlcyBmcm9tIHNlcnZlciBldmVudHMsIGFuZFxuICAgKiBpbnN0cnVjdHMgY2hhbm5lbCB0byB0ZXJtaW5hdGUgb24gc2VydmVyXG4gICAqXG4gICAqIFRyaWdnZXJzIG9uQ2xvc2UoKSBob29rc1xuICAgKlxuICAgKiBUbyByZWNlaXZlIGxlYXZlIGFja25vd2xlZGdlbWVudHMsIHVzZSB0aGUgYHJlY2VpdmVgXG4gICAqIGhvb2sgdG8gYmluZCB0byB0aGUgc2VydmVyIGFjaywgaWU6XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNoYW5uZWwubGVhdmUoKS5yZWNlaXZlKFwib2tcIiwgKCkgPT4gYWxlcnQoXCJsZWZ0IVwiKSApXG4gICAqXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGxlYXZlKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgIHRoaXMuam9pblB1c2guY2FuY2VsVGltZW91dCgpXG5cbiAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMubGVhdmluZ1xuICAgIGxldCBvbkNsb3NlID0gKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGxlYXZlICR7dGhpcy50b3BpY31gKVxuICAgICAgdGhpcy50cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmNsb3NlLCBcImxlYXZlXCIpXG4gICAgfVxuICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRpbWVvdXQpXG4gICAgbGVhdmVQdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBvbkNsb3NlKCkpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gb25DbG9zZSgpKVxuICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICBpZighdGhpcy5jYW5QdXNoKCkpeyBsZWF2ZVB1c2gudHJpZ2dlcihcIm9rXCIsIHt9KSB9XG5cbiAgICByZXR1cm4gbGVhdmVQdXNoXG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGFibGUgbWVzc2FnZSBob29rXG4gICAqXG4gICAqIFJlY2VpdmVzIGFsbCBldmVudHMgZm9yIHNwZWNpYWxpemVkIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICogYmVmb3JlIGRpc3BhdGNoaW5nIHRvIHRoZSBjaGFubmVsIGNhbGxiYWNrcy5cbiAgICpcbiAgICogTXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVmXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBvbk1lc3NhZ2UoX2V2ZW50LCBwYXlsb2FkLCBfcmVmKXsgcmV0dXJuIHBheWxvYWQgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNNZW1iZXIodG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmKXtcbiAgICBpZih0aGlzLnRvcGljICE9PSB0b3BpYyl7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZihqb2luUmVmICYmIGpvaW5SZWYgIT09IHRoaXMuam9pblJlZigpKXtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLCB7dG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmfSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgam9pblJlZigpeyByZXR1cm4gdGhpcy5qb2luUHVzaC5yZWYgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIGlmKHRoaXMuaXNMZWF2aW5nKCkpeyByZXR1cm4gfVxuICAgIHRoaXMuc29ja2V0LmxlYXZlT3BlblRvcGljKHRoaXMudG9waWMpXG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5pbmdcbiAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpe1xuICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMub25NZXNzYWdlKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpXG4gICAgaWYocGF5bG9hZCAmJiAhaGFuZGxlZFBheWxvYWQpeyB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIG9uTWVzc2FnZSBjYWxsYmFja3MgbXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcIikgfVxuXG4gICAgbGV0IGV2ZW50QmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcihiaW5kID0+IGJpbmQuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGV2ZW50QmluZGluZ3MubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IGJpbmQgPSBldmVudEJpbmRpbmdzW2ldXG4gICAgICBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYsIGpvaW5SZWYgfHwgdGhpcy5qb2luUmVmKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXBseUV2ZW50TmFtZShyZWYpeyByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0Nsb3NlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzRXJyb3JlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0pvaW5lZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzSm9pbmluZygpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZyB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xlYXZpbmcoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmxlYXZpbmcgfVxufVxuIiwgImltcG9ydCB7XG4gIGdsb2JhbCxcbiAgWEhSX1NUQVRFU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBamF4IHtcblxuICBzdGF0aWMgcmVxdWVzdChtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBpZihnbG9iYWwuWERvbWFpblJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWERvbWFpblJlcXVlc3QoKSAvLyBJRTgsIElFOVxuICAgICAgcmV0dXJuIHRoaXMueGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuWE1MSHR0cFJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKSAvLyBJRTcrLCBGaXJlZm94LCBDaHJvbWUsIE9wZXJhLCBTYWZhcmlcbiAgICAgIHJldHVybiB0aGlzLnhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuZmV0Y2ggJiYgZ2xvYmFsLkFib3J0Q29udHJvbGxlcil7XG4gICAgICAvLyBGZXRjaCB3aXRoIEFib3J0Q29udHJvbGxlciBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICByZXR1cm4gdGhpcy5mZXRjaFJlcXVlc3QobWV0aG9kLCBlbmRQb2ludCwgaGVhZGVycywgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjaylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3VpdGFibGUgWE1MSHR0cFJlcXVlc3QgaW1wbGVtZW50YXRpb24gZm91bmRcIilcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZmV0Y2hSZXF1ZXN0KG1ldGhvZCwgZW5kUG9pbnQsIGhlYWRlcnMsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgfVxuICAgIGxldCBjb250cm9sbGVyID0gbnVsbFxuICAgIGlmKHRpbWVvdXQpe1xuICAgICAgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgY29uc3QgX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KVxuICAgICAgb3B0aW9ucy5zaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbFxuICAgIH1cbiAgICBnbG9iYWwuZmV0Y2goZW5kUG9pbnQsIG9wdGlvbnMpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAudGhlbihkYXRhID0+IHRoaXMucGFyc2VKU09OKGRhdGEpKVxuICAgICAgLnRoZW4oZGF0YSA9PiBjYWxsYmFjayAmJiBjYWxsYmFjayhkYXRhKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBpZihlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgJiYgb250aW1lb3V0KXtcbiAgICAgICAgICBvbnRpbWVvdXQoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgcmV0dXJuIGNvbnRyb2xsZXJcbiAgfVxuXG4gIHN0YXRpYyB4ZG9tYWluUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQpXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHRoaXMucGFyc2VKU09OKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSlcbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICAvLyBXb3JrIGFyb3VuZCBidWcgaW4gSUU5IHRoYXQgcmVxdWlyZXMgYW4gYXR0YWNoZWQgb25wcm9ncmVzcyBoYW5kbGVyXG4gICAgcmVxLm9ucHJvZ3Jlc3MgPSAoKSA9PiB7IH1cblxuICAgIHJlcS5zZW5kKGJvZHkpXG4gICAgcmV0dXJuIHJlcVxuICB9XG5cbiAgc3RhdGljIHhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICByZXEub3BlbihtZXRob2QsIGVuZFBvaW50LCB0cnVlKVxuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIGZvcihsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKXtcbiAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJlcS5vbmVycm9yID0gKCkgPT4gY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbClcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYocmVxLnJlYWR5U3RhdGUgPT09IFhIUl9TVEFURVMuY29tcGxldGUgJiYgY2FsbGJhY2spe1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLnBhcnNlSlNPTihyZXEucmVzcG9uc2VUZXh0KVxuICAgICAgICBjYWxsYmFjayhyZXNwb25zZSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICByZXEuc2VuZChib2R5KVxuICAgIHJldHVybiByZXFcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpTT04ocmVzcCl7XG4gICAgaWYoIXJlc3AgfHwgcmVzcCA9PT0gXCJcIil7IHJldHVybiBudWxsIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwKVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsIHJlc3ApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqLCBwYXJlbnRLZXkpe1xuICAgIGxldCBxdWVyeVN0ciA9IFtdXG4gICAgZm9yKHZhciBrZXkgaW4gb2JqKXtcbiAgICAgIGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKXsgY29udGludWUgfVxuICAgICAgbGV0IHBhcmFtS2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fVske2tleX1dYCA6IGtleVxuICAgICAgbGV0IHBhcmFtVmFsID0gb2JqW2tleV1cbiAgICAgIGlmKHR5cGVvZiBwYXJhbVZhbCA9PT0gXCJvYmplY3RcIil7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2godGhpcy5zZXJpYWxpemUocGFyYW1WYWwsIHBhcmFtS2V5KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtS2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtVmFsKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5U3RyLmpvaW4oXCImXCIpXG4gIH1cblxuICBzdGF0aWMgYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKXtcbiAgICBpZihPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCl7IHJldHVybiB1cmwgfVxuXG4gICAgbGV0IHByZWZpeCA9IHVybC5tYXRjaCgvXFw/LykgPyBcIiZcIiA6IFwiP1wiXG4gICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3RoaXMuc2VyaWFsaXplKHBhcmFtcyl9YFxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUUyxcbiAgQVVUSF9UT0tFTl9QUkVGSVhcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEFqYXggZnJvbSBcIi4vYWpheFwiXG5cbmxldCBhcnJheUJ1ZmZlclRvQmFzZTY0ID0gKGJ1ZmZlcikgPT4ge1xuICBsZXQgYmluYXJ5ID0gXCJcIlxuICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpXG4gIGxldCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoXG4gIGZvcihsZXQgaSA9IDA7IGkgPCBsZW47IGkrKyl7IGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKSB9XG4gIHJldHVybiBidG9hKGJpbmFyeSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9uZ1BvbGwge1xuXG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBwcm90b2NvbHMpe1xuICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBzdWJwcm90b2NvbHMgZm9yIGF1dGhUb2tlblxuICAgIC8vIFtcInBob2VuaXhcIiwgXCJiYXNlNjR1cmwuYmVhcmVyLnBoeC5CQVNFNjRfRU5DT0RFRF9UT0tFTlwiXVxuICAgIGlmKHByb3RvY29scyAmJiBwcm90b2NvbHMubGVuZ3RoID09PSAyICYmIHByb3RvY29sc1sxXS5zdGFydHNXaXRoKEFVVEhfVE9LRU5fUFJFRklYKSl7XG4gICAgICB0aGlzLmF1dGhUb2tlbiA9IGF0b2IocHJvdG9jb2xzWzFdLnNsaWNlKEFVVEhfVE9LRU5fUFJFRklYLmxlbmd0aCkpXG4gICAgfVxuICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsXG4gICAgdGhpcy50b2tlbiA9IG51bGxcbiAgICB0aGlzLnNraXBIZWFydGJlYXQgPSB0cnVlXG4gICAgdGhpcy5yZXFzID0gbmV3IFNldCgpXG4gICAgdGhpcy5hd2FpdGluZ0JhdGNoQWNrID0gZmFsc2VcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IG51bGxcbiAgICB0aGlzLmN1cnJlbnRCYXRjaFRpbWVyID0gbnVsbFxuICAgIHRoaXMuYmF0Y2hCdWZmZXIgPSBbXVxuICAgIHRoaXMub25vcGVuID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25lcnJvciA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5wb2xsRW5kcG9pbnQgPSB0aGlzLm5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgdGhlIGNhbGxlciB0byBmaW5pc2ggc2V0dGluZyB1cCBvdXIgY2FsbGJhY2tzIGFuZCB0aW1lb3V0IHByb3BlcnRpZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucG9sbCgpLCAwKVxuICB9XG5cbiAgbm9ybWFsaXplRW5kcG9pbnQoZW5kUG9pbnQpe1xuICAgIHJldHVybiAoZW5kUG9pbnRcbiAgICAgIC5yZXBsYWNlKFwid3M6Ly9cIiwgXCJodHRwOi8vXCIpXG4gICAgICAucmVwbGFjZShcIndzczovL1wiLCBcImh0dHBzOi8vXCIpXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKFwiKC4qKVxcL1wiICsgVFJBTlNQT1JUUy53ZWJzb2NrZXQpLCBcIiQxL1wiICsgVFJBTlNQT1JUUy5sb25ncG9sbCkpXG4gIH1cblxuICBlbmRwb2ludFVSTCgpe1xuICAgIHJldHVybiBBamF4LmFwcGVuZFBhcmFtcyh0aGlzLnBvbGxFbmRwb2ludCwge3Rva2VuOiB0aGlzLnRva2VufSlcbiAgfVxuXG4gIGNsb3NlQW5kUmV0cnkoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgdGhpcy5jbG9zZShjb2RlLCByZWFzb24sIHdhc0NsZWFuKVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICB9XG5cbiAgb250aW1lb3V0KCl7XG4gICAgdGhpcy5vbmVycm9yKFwidGltZW91dFwiKVxuICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDA1LCBcInRpbWVvdXRcIiwgZmFsc2UpXG4gIH1cblxuICBpc0FjdGl2ZSgpeyByZXR1cm4gdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4gfHwgdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmcgfVxuXG4gIHBvbGwoKXtcbiAgICBjb25zdCBoZWFkZXJzID0ge1wiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwifVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIGhlYWRlcnNbXCJYLVBob2VuaXgtQXV0aFRva2VuXCJdID0gdGhpcy5hdXRoVG9rZW5cbiAgICB9XG4gICAgdGhpcy5hamF4KFwiR0VUXCIsIGhlYWRlcnMsIG51bGwsICgpID0+IHRoaXMub250aW1lb3V0KCksIHJlc3AgPT4ge1xuICAgICAgaWYocmVzcCl7XG4gICAgICAgIHZhciB7c3RhdHVzLCB0b2tlbiwgbWVzc2FnZXN9ID0gcmVzcFxuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyA9IDBcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKHN0YXR1cyl7XG4gICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICAgIC8vIFRhc2tzIGFyZSB3aGF0IHRoaW5ncyBsaWtlIGV2ZW50IGhhbmRsZXJzLCBzZXRUaW1lb3V0IGNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIHByb21pc2UgcmVzb2x2ZXMgYW5kIG1vcmUgYXJlIHJ1biB3aXRoaW4uXG4gICAgICAgICAgICAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIHRhc2tzLFxuICAgICAgICAgICAgLy8gbWljcm90YXNrcyBhbmQgbWFjcm90YXNrcy5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYXJlIG1haW5seSB1c2VkIGZvciBQcm9taXNlcywgd2hpbGUgbWFjcm90YXNrcyBhcmVcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciBtYWNyb3Rhc2tzLiBJZiB0aGUgSlMgZW5naW5lXG4gICAgICAgICAgICAvLyBpcyBsb29raW5nIGZvciBhIHRhc2sgdG8gcnVuLCBpdCB3aWxsIGFsd2F5cyB0cnkgdG8gZW1wdHkgdGhlXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcnVuIGFueXRoaW5nIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBtYWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LCBtZXNzYWdlcyBhbHdheXMgYXJyaXZlIGluIHRoZWlyIG93blxuICAgICAgICAgICAgLy8gZXZlbnQuIFRoaXMgbWVhbnMgdGhhdCBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlc29sdmVkIGZyb20gd2l0aGluLFxuICAgICAgICAgICAgLy8gdGhlaXIgY2FsbGJhY2tzIHdpbGwgYWx3YXlzIGZpbmlzaCBleGVjdXRpb24gYnkgdGhlIHRpbWUgdGhlXG4gICAgICAgICAgICAvLyBuZXh0IG1lc3NhZ2UgZXZlbnQgaGFuZGxlciBpcyBydW4uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gZW11bGF0ZSB0aGlzIGJlaGF2aW91ciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgZWFjaFxuICAgICAgICAgICAgLy8gb25tZXNzYWdlIGhhbmRsZXIgaXMgcnVuIHdpdGhpbiBpdHMgb3duIG1hY3JvdGFzay5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbm1lc3NhZ2Uoe2RhdGE6IG1zZ30pLCAwKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5wb2xsKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDEwOlxuICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMub3BlblxuICAgICAgICAgIHRoaXMub25vcGVuKHt9KVxuICAgICAgICAgIHRoaXMucG9sbCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDQwMylcbiAgICAgICAgICB0aGlzLmNsb3NlKDEwMDgsIFwiZm9yYmlkZGVuXCIsIGZhbHNlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDUwMClcbiAgICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoMTAxMSwgXCJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgNTAwKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHBvbGwgc3RhdHVzICR7c3RhdHVzfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHdlIGNvbGxlY3QgYWxsIHB1c2hlcyB3aXRoaW4gdGhlIGN1cnJlbnQgZXZlbnQgbG9vcCBieVxuICAvLyBzZXRUaW1lb3V0IDAsIHdoaWNoIG9wdGltaXplcyBiYWNrLXRvLWJhY2sgcHJvY2VkdXJhbFxuICAvLyBwdXNoZXMgYWdhaW5zdCBhbiBlbXB0eSBidWZmZXJcblxuICBzZW5kKGJvZHkpe1xuICAgIGlmKHR5cGVvZihib2R5KSAhPT0gXCJzdHJpbmdcIil7IGJvZHkgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KGJvZHkpIH1cbiAgICBpZih0aGlzLmN1cnJlbnRCYXRjaCl7XG4gICAgICB0aGlzLmN1cnJlbnRCYXRjaC5wdXNoKGJvZHkpXG4gICAgfSBlbHNlIGlmKHRoaXMuYXdhaXRpbmdCYXRjaEFjayl7XG4gICAgICB0aGlzLmJhdGNoQnVmZmVyLnB1c2goYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50QmF0Y2ggPSBbYm9keV1cbiAgICAgIHRoaXMuY3VycmVudEJhdGNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5iYXRjaFNlbmQodGhpcy5jdXJyZW50QmF0Y2gpXG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gbnVsbFxuICAgICAgfSwgMClcbiAgICB9XG4gIH1cblxuICBiYXRjaFNlbmQobWVzc2FnZXMpe1xuICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IHRydWVcbiAgICB0aGlzLmFqYXgoXCJQT1NUXCIsIHtcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtbmRqc29uXCJ9LCBtZXNzYWdlcy5qb2luKFwiXFxuXCIpLCAoKSA9PiB0aGlzLm9uZXJyb3IoXCJ0aW1lb3V0XCIpLCByZXNwID0+IHtcbiAgICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IGZhbHNlXG4gICAgICBpZighcmVzcCB8fCByZXNwLnN0YXR1cyAhPT0gMjAwKXtcbiAgICAgICAgdGhpcy5vbmVycm9yKHJlc3AgJiYgcmVzcC5zdGF0dXMpXG4gICAgICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDExLCBcImludGVybmFsIHNlcnZlciBlcnJvclwiLCBmYWxzZSlcbiAgICAgIH0gZWxzZSBpZih0aGlzLmJhdGNoQnVmZmVyLmxlbmd0aCA+IDApe1xuICAgICAgICB0aGlzLmJhdGNoU2VuZCh0aGlzLmJhdGNoQnVmZmVyKVxuICAgICAgICB0aGlzLmJhdGNoQnVmZmVyID0gW11cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY2xvc2UoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgZm9yKGxldCByZXEgb2YgdGhpcy5yZXFzKXsgcmVxLmFib3J0KCkgfVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY2xvc2VkXG4gICAgbGV0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtjb2RlOiAxMDAwLCByZWFzb246IHVuZGVmaW5lZCwgd2FzQ2xlYW46IHRydWV9LCB7Y29kZSwgcmVhc29uLCB3YXNDbGVhbn0pXG4gICAgdGhpcy5iYXRjaEJ1ZmZlciA9IFtdXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudEJhdGNoVGltZXIpXG4gICAgdGhpcy5jdXJyZW50QmF0Y2hUaW1lciA9IG51bGxcbiAgICBpZih0eXBlb2YoQ2xvc2VFdmVudCkgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgdGhpcy5vbmNsb3NlKG5ldyBDbG9zZUV2ZW50KFwiY2xvc2VcIiwgb3B0cykpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25jbG9zZShvcHRzKVxuICAgIH1cbiAgfVxuXG4gIGFqYXgobWV0aG9kLCBoZWFkZXJzLCBib2R5LCBvbkNhbGxlclRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBsZXQgcmVxXG4gICAgbGV0IG9udGltZW91dCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVxcy5kZWxldGUocmVxKVxuICAgICAgb25DYWxsZXJUaW1lb3V0KClcbiAgICB9XG4gICAgcmVxID0gQWpheC5yZXF1ZXN0KG1ldGhvZCwgdGhpcy5lbmRwb2ludFVSTCgpLCBoZWFkZXJzLCBib2R5LCB0aGlzLnRpbWVvdXQsIG9udGltZW91dCwgcmVzcCA9PiB7XG4gICAgICB0aGlzLnJlcXMuZGVsZXRlKHJlcSlcbiAgICAgIGlmKHRoaXMuaXNBY3RpdmUoKSl7IGNhbGxiYWNrKHJlc3ApIH1cbiAgICB9KVxuICAgIHRoaXMucmVxcy5hZGQocmVxKVxuICB9XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHJlc2VuY2VcbiAqIEBwYXJhbSB7Q2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBDaGFubmVsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zLFxuICogICAgICAgIGZvciBleGFtcGxlIGB7ZXZlbnRzOiB7c3RhdGU6IFwic3RhdGVcIiwgZGlmZjogXCJkaWZmXCJ9fWBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJlc2VuY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIG9wdHMgPSB7fSl7XG4gICAgbGV0IGV2ZW50cyA9IG9wdHMuZXZlbnRzIHx8IHtzdGF0ZTogXCJwcmVzZW5jZV9zdGF0ZVwiLCBkaWZmOiBcInByZXNlbmNlX2RpZmZcIn1cbiAgICB0aGlzLnN0YXRlID0ge31cbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIHRoaXMuam9pblJlZiA9IG51bGxcbiAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgIG9uSm9pbjogZnVuY3Rpb24gKCl7IH0sXG4gICAgICBvbkxlYXZlOiBmdW5jdGlvbiAoKXsgfSxcbiAgICAgIG9uU3luYzogZnVuY3Rpb24gKCl7IH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLnN0YXRlLCBuZXdTdGF0ZSA9PiB7XG4gICAgICBsZXQge29uSm9pbiwgb25MZWF2ZSwgb25TeW5jfSA9IHRoaXMuY2FsbGVyXG5cbiAgICAgIHRoaXMuam9pblJlZiA9IHRoaXMuY2hhbm5lbC5qb2luUmVmKClcbiAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSlcblxuICAgICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaChkaWZmID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgICBvblN5bmMoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLmRpZmYsIGRpZmYgPT4ge1xuICAgICAgbGV0IHtvbkpvaW4sIG9uTGVhdmUsIG9uU3luY30gPSB0aGlzLmNhbGxlclxuXG4gICAgICBpZih0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKXtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgICAgb25TeW5jKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Kb2luKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25Kb2luID0gY2FsbGJhY2sgfVxuXG4gIG9uTGVhdmUoY2FsbGJhY2speyB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2sgfVxuXG4gIG9uU3luYyhjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uU3luYyA9IGNhbGxiYWNrIH1cblxuICBsaXN0KGJ5KXsgcmV0dXJuIFByZXNlbmNlLmxpc3QodGhpcy5zdGF0ZSwgYnkpIH1cblxuICBpblBlbmRpbmdTeW5jU3RhdGUoKXtcbiAgICByZXR1cm4gIXRoaXMuam9pblJlZiB8fCAodGhpcy5qb2luUmVmICE9PSB0aGlzLmNoYW5uZWwuam9pblJlZigpKVxuICB9XG5cbiAgLy8gbG93ZXItbGV2ZWwgcHVibGljIHN0YXRpYyBBUElcblxuICAvKipcbiAgICogVXNlZCB0byBzeW5jIHRoZSBsaXN0IG9mIHByZXNlbmNlcyBvbiB0aGUgc2VydmVyXG4gICAqIHdpdGggdGhlIGNsaWVudCdzIHN0YXRlLiBBbiBvcHRpb25hbCBgb25Kb2luYCBhbmQgYG9uTGVhdmVgIGNhbGxiYWNrIGNhblxuICAgKiBiZSBwcm92aWRlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIHRoZSBjbGllbnQncyBsb2NhbCBwcmVzZW5jZXMgYWNyb3NzXG4gICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNTdGF0ZShjdXJyZW50U3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2xvbmUoY3VycmVudFN0YXRlKVxuICAgIGxldCBqb2lucyA9IHt9XG4gICAgbGV0IGxlYXZlcyA9IHt9XG5cbiAgICB0aGlzLm1hcChzdGF0ZSwgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIGlmKCFuZXdTdGF0ZVtrZXldKXtcbiAgICAgICAgbGVhdmVzW2tleV0gPSBwcmVzZW5jZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5tYXAobmV3U3RhdGUsIChrZXksIG5ld1ByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlKXtcbiAgICAgICAgbGV0IG5ld1JlZnMgPSBuZXdQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJSZWZzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGpvaW5lZE1ldGFzID0gbmV3UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gY3VyUmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBsZXQgbGVmdE1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IG5ld1JlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgaWYoam9pbmVkTWV0YXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICAgICAgam9pbnNba2V5XS5tZXRhcyA9IGpvaW5lZE1ldGFzXG4gICAgICAgIH1cbiAgICAgICAgaWYobGVmdE1ldGFzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGxlYXZlc1trZXldID0gdGhpcy5jbG9uZShjdXJyZW50UHJlc2VuY2UpXG4gICAgICAgICAgbGVhdmVzW2tleV0ubWV0YXMgPSBsZWZ0TWV0YXNcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwge2pvaW5zOiBqb2lucywgbGVhdmVzOiBsZWF2ZXN9LCBvbkpvaW4sIG9uTGVhdmUpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXNlZCB0byBzeW5jIGEgZGlmZiBvZiBwcmVzZW5jZSBqb2luIGFuZCBsZWF2ZVxuICAgKiBldmVudHMgZnJvbSB0aGUgc2VydmVyLCBhcyB0aGV5IGhhcHBlbi4gTGlrZSBgc3luY1N0YXRlYCwgYHN5bmNEaWZmYFxuICAgKiBhY2NlcHRzIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlclxuICAgKiBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCB7am9pbnMsIGxlYXZlc30gPSB0aGlzLmNsb25lKGRpZmYpXG4gICAgaWYoIW9uSm9pbil7IG9uSm9pbiA9IGZ1bmN0aW9uICgpeyB9IH1cbiAgICBpZighb25MZWF2ZSl7IG9uTGVhdmUgPSBmdW5jdGlvbiAoKXsgfSB9XG5cbiAgICB0aGlzLm1hcChqb2lucywgKGtleSwgbmV3UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBzdGF0ZVtrZXldID0gdGhpcy5jbG9uZShuZXdQcmVzZW5jZSlcbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZSl7XG4gICAgICAgIGxldCBqb2luZWRSZWZzID0gc3RhdGVba2V5XS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJNZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBqb2luZWRSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIHN0YXRlW2tleV0ubWV0YXMudW5zaGlmdCguLi5jdXJNZXRhcylcbiAgICAgIH1cbiAgICAgIG9uSm9pbihrZXksIGN1cnJlbnRQcmVzZW5jZSwgbmV3UHJlc2VuY2UpXG4gICAgfSlcbiAgICB0aGlzLm1hcChsZWF2ZXMsIChrZXksIGxlZnRQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIGlmKCFjdXJyZW50UHJlc2VuY2UpeyByZXR1cm4gfVxuICAgICAgbGV0IHJlZnNUb1JlbW92ZSA9IGxlZnRQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICBjdXJyZW50UHJlc2VuY2UubWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKHAgPT4ge1xuICAgICAgICByZXR1cm4gcmVmc1RvUmVtb3ZlLmluZGV4T2YocC5waHhfcmVmKSA8IDBcbiAgICAgIH0pXG4gICAgICBvbkxlYXZlKGtleSwgY3VycmVudFByZXNlbmNlLCBsZWZ0UHJlc2VuY2UpXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2UubWV0YXMubGVuZ3RoID09PSAwKXtcbiAgICAgICAgZGVsZXRlIHN0YXRlW2tleV1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHByZXNlbmNlcywgd2l0aCBzZWxlY3RlZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZXNlbmNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaG9vc2VyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBsaXN0KHByZXNlbmNlcywgY2hvb3Nlcil7XG4gICAgaWYoIWNob29zZXIpeyBjaG9vc2VyID0gZnVuY3Rpb24gKGtleSwgcHJlcyl7IHJldHVybiBwcmVzIH0gfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwKHByZXNlbmNlcywgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIHJldHVybiBjaG9vc2VyKGtleSwgcHJlc2VuY2UpXG4gICAgfSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBzdGF0aWMgbWFwKG9iaiwgZnVuYyl7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKGtleSA9PiBmdW5jKGtleSwgb2JqW2tleV0pKVxuICB9XG5cbiAgc3RhdGljIGNsb25lKG9iail7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cbn1cbiIsICIvKiBUaGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgbWVzc2FnZXMgKi9cbmltcG9ydCB7XG4gIENIQU5ORUxfRVZFTlRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgSEVBREVSX0xFTkdUSDogMSxcbiAgTUVUQV9MRU5HVEg6IDQsXG4gIEtJTkRTOiB7cHVzaDogMCwgcmVwbHk6IDEsIGJyb2FkY2FzdDogMn0sXG5cbiAgZW5jb2RlKG1zZywgY2FsbGJhY2spe1xuICAgIGlmKG1zZy5wYXlsb2FkLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5iaW5hcnlFbmNvZGUobXNnKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBheWxvYWQgPSBbbXNnLmpvaW5fcmVmLCBtc2cucmVmLCBtc2cudG9waWMsIG1zZy5ldmVudCwgbXNnLnBheWxvYWRdXG4gICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgfVxuICB9LFxuXG4gIGRlY29kZShyYXdQYXlsb2FkLCBjYWxsYmFjayl7XG4gICAgaWYocmF3UGF5bG9hZC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpXG4gICAgICByZXR1cm4gY2FsbGJhY2soe2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZH0pXG4gICAgfVxuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICBiaW5hcnlFbmNvZGUobWVzc2FnZSl7XG4gICAgbGV0IHtqb2luX3JlZiwgcmVmLCBldmVudCwgdG9waWMsIHBheWxvYWR9ID0gbWVzc2FnZVxuICAgIGxldCBtZXRhTGVuZ3RoID0gdGhpcy5NRVRBX0xFTkdUSCArIGpvaW5fcmVmLmxlbmd0aCArIHJlZi5sZW5ndGggKyB0b3BpYy5sZW5ndGggKyBldmVudC5sZW5ndGhcbiAgICBsZXQgaGVhZGVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuSEVBREVSX0xFTkdUSCArIG1ldGFMZW5ndGgpXG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnB1c2gpIC8vIGtpbmRcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luX3JlZi5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZXZlbnQubGVuZ3RoKVxuICAgIEFycmF5LmZyb20oam9pbl9yZWYsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKHJlZiwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20odG9waWMsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKGV2ZW50LCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG5cbiAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIHBheWxvYWQuYnl0ZUxlbmd0aClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkocGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlclxuICB9LFxuXG4gIGJpbmFyeURlY29kZShidWZmZXIpe1xuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICBsZXQga2luZCA9IHZpZXcuZ2V0VWludDgoMClcbiAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSB0aGlzLktJTkRTLnB1c2g6IHJldHVybiB0aGlzLmRlY29kZVB1c2goYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgICAgY2FzZSB0aGlzLktJTkRTLnJlcGx5OiByZXR1cm4gdGhpcy5kZWNvZGVSZXBseShidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgICBjYXNlIHRoaXMuS0lORFMuYnJvYWRjYXN0OiByZXR1cm4gdGhpcy5kZWNvZGVCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgIH1cbiAgfSxcblxuICBkZWNvZGVQdXNoKGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMylcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSCAtIDEgLy8gcHVzaGVzIGhhdmUgbm8gcmVmXG4gICAgbGV0IGpvaW5SZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBqb2luUmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgam9pblJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9LFxuXG4gIGRlY29kZVJlcGx5KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCByZWZTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDMpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoNClcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSFxuICAgIGxldCBqb2luUmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgam9pblJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGpvaW5SZWZTaXplXG4gICAgbGV0IHJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICBsZXQgcGF5bG9hZCA9IHtzdGF0dXM6IGV2ZW50LCByZXNwb25zZTogZGF0YX1cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IHJlZiwgdG9waWM6IHRvcGljLCBldmVudDogQ0hBTk5FTF9FVkVOVFMucmVwbHksIHBheWxvYWQ6IHBheWxvYWR9XG4gIH0sXG5cbiAgZGVjb2RlQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyAyXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG5cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBudWxsLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgZ2xvYmFsLFxuICBwaHhXaW5kb3csXG4gIENIQU5ORUxfRVZFTlRTLFxuICBERUZBVUxUX1RJTUVPVVQsXG4gIERFRkFVTFRfVlNOLFxuICBTT0NLRVRfU1RBVEVTLFxuICBUUkFOU1BPUlRTLFxuICBXU19DTE9TRV9OT1JNQUwsXG4gIEFVVEhfVE9LRU5fUFJFRklYXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb3N1cmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcbmltcG9ydCBDaGFubmVsIGZyb20gXCIuL2NoYW5uZWxcIlxuaW1wb3J0IExvbmdQb2xsIGZyb20gXCIuL2xvbmdwb2xsXCJcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCIuL3NlcmlhbGl6ZXJcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuLyoqIEluaXRpYWxpemVzIHRoZSBTb2NrZXQgKlxuICpcbiAqIEZvciBJRTggc3VwcG9ydCB1c2UgYW4gRVM1LXNoaW0gKGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kUG9pbnQgLSBUaGUgc3RyaW5nIFdlYlNvY2tldCBlbmRwb2ludCwgaWUsIGBcIndzOi8vZXhhbXBsZS5jb20vc29ja2V0XCJgLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIndzczovL2V4YW1wbGUuY29tXCJgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiL3NvY2tldFwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy50cmFuc3BvcnRdIC0gVGhlIFdlYnNvY2tldCBUcmFuc3BvcnQsIGZvciBleGFtcGxlIFdlYlNvY2tldCBvciBQaG9lbml4LkxvbmdQb2xsLlxuICpcbiAqIERlZmF1bHRzIHRvIFdlYlNvY2tldCB3aXRoIGF1dG9tYXRpYyBMb25nUG9sbCBmYWxsYmFjayBpZiBXZWJTb2NrZXQgaXMgbm90IGRlZmluZWQuXG4gKiBUbyBmYWxsYmFjayB0byBMb25nUG9sbCB3aGVuIFdlYlNvY2tldCBhdHRlbXB0cyBmYWlsLCB1c2UgYGxvbmdQb2xsRmFsbGJhY2tNczogMjUwMGAuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc10gLSBUaGUgbWlsbGlzZWNvbmQgdGltZSB0byBhdHRlbXB0IHRoZSBwcmltYXJ5IHRyYW5zcG9ydFxuICogYmVmb3JlIGZhbGxpbmcgYmFjayB0byB0aGUgTG9uZ1BvbGwgdHJhbnNwb3J0LiBEaXNhYmxlZCBieSBkZWZhdWx0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZGVidWddIC0gV2hlbiB0cnVlLCBlbmFibGVzIGRlYnVnIGxvZ2dpbmcuIERlZmF1bHQgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMuZW5jb2RlXSAtIFRoZSBmdW5jdGlvbiB0byBlbmNvZGUgb3V0Z29pbmcgbWVzc2FnZXMuXG4gKlxuICogRGVmYXVsdHMgdG8gSlNPTiBlbmNvZGVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmRlY29kZV0gLSBUaGUgZnVuY3Rpb24gdG8gZGVjb2RlIGluY29taW5nIG1lc3NhZ2VzLlxuICpcbiAqIERlZmF1bHRzIHRvIEpTT046XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogKHBheWxvYWQsIGNhbGxiYWNrKSA9PiBjYWxsYmFjayhKU09OLnBhcnNlKHBheWxvYWQpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnRpbWVvdXRdIC0gVGhlIGRlZmF1bHQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gdHJpZ2dlciBwdXNoIHRpbWVvdXRzLlxuICpcbiAqIERlZmF1bHRzIGBERUZBVUxUX1RJTUVPVVRgXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuaGVhcnRiZWF0SW50ZXJ2YWxNc10gLSBUaGUgbWlsbGlzZWMgaW50ZXJ2YWwgdG8gc2VuZCBhIGhlYXJ0YmVhdCBtZXNzYWdlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWNvbm5lY3RBZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlXG4gKiBzb2NrZXQgcmVjb25uZWN0IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuXG4gKlxuICogRGVmYXVsdHMgdG8gc3RlcHBlZCBiYWNrb2ZmIG9mOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWpvaW5BZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxpc2VjXG4gKiByZWpvaW4gaW50ZXJ2YWwgZm9yIGluZGl2aWR1YWwgY2hhbm5lbHMuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5sb2dnZXJdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLCBpZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbihraW5kLCBtc2csIGRhdGEpIHtcbiAqICAgY29uc29sZS5sb2coYCR7a2luZH06ICR7bXNnfWAsIGRhdGEpXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMubG9uZ3BvbGxlclRpbWVvdXRdIC0gVGhlIG1heGltdW0gdGltZW91dCBvZiBhIGxvbmcgcG9sbCBBSkFYIHJlcXVlc3QuXG4gKlxuICogRGVmYXVsdHMgdG8gMjBzIChkb3VibGUgdGhlIHNlcnZlciBsb25nIHBvbGwgdGltZXIpLlxuICpcbiAqIEBwYXJhbSB7KE9iamVjdHxmdW5jdGlvbil9IFtvcHRzLnBhcmFtc10gLSBUaGUgb3B0aW9uYWwgcGFyYW1zIHRvIHBhc3Mgd2hlbiBjb25uZWN0aW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYXV0aFRva2VuXSAtIHRoZSBvcHRpb25hbCBhdXRoZW50aWNhdGlvbiB0b2tlbiB0byBiZSBleHBvc2VkIG9uIHRoZSBzZXJ2ZXJcbiAqIHVuZGVyIHRoZSBgOmF1dGhfdG9rZW5gIGNvbm5lY3RfaW5mbyBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmluYXJ5VHlwZV0gLSBUaGUgYmluYXJ5IHR5cGUgdG8gdXNlIGZvciBiaW5hcnkgV2ViU29ja2V0IGZyYW1lcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBcImFycmF5YnVmZmVyXCJcbiAqXG4gKiBAcGFyYW0ge3Zzbn0gW29wdHMudnNuXSAtIFRoZSBzZXJpYWxpemVyJ3MgcHJvdG9jb2wgdmVyc2lvbiB0byBzZW5kIG9uIGNvbm5lY3QuXG4gKlxuICogRGVmYXVsdHMgdG8gREVGQVVMVF9WU04uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLnNlc3Npb25TdG9yYWdlXSAtIEFuIG9wdGlvbmFsIFN0b3JhZ2UgY29tcGF0aWJsZSBvYmplY3RcbiAqIFBob2VuaXggdXNlcyBzZXNzaW9uU3RvcmFnZSBmb3IgbG9uZ3BvbGwgZmFsbGJhY2sgaGlzdG9yeS4gT3ZlcnJpZGluZyB0aGUgc3RvcmUgaXNcbiAqIHVzZWZ1bCB3aGVuIFBob2VuaXggd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gYHNlc3Npb25TdG9yYWdlYC4gRm9yIGV4YW1wbGUsIFRoaXMgY291bGRcbiAqIGhhcHBlbiBpZiBhIHNpdGUgbG9hZHMgYSBjcm9zcy1kb21haW4gY2hhbm5lbCBpbiBhbiBpZnJhbWUuIEV4YW1wbGUgdXNhZ2U6XG4gKlxuICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gKiAgICAgICBjb25zdHJ1Y3RvcigpIHsgdGhpcy5zdG9yYWdlID0ge30gfVxuICogICAgICAgZ2V0SXRlbShrZXlOYW1lKSB7IHJldHVybiB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gfHwgbnVsbCB9XG4gKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gKiAgICAgICBzZXRJdGVtKGtleU5hbWUsIGtleVZhbHVlKSB7IHRoaXMuc3RvcmFnZVtrZXlOYW1lXSA9IGtleVZhbHVlIH1cbiAqICAgICB9XG4gKlxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBvcHRzID0ge30pe1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MgPSB7b3BlbjogW10sIGNsb3NlOiBbXSwgZXJyb3I6IFtdLCBtZXNzYWdlOiBbXX1cbiAgICB0aGlzLmNoYW5uZWxzID0gW11cbiAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIHRoaXMucmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IG9wdHMudGltZW91dCB8fCBERUZBVUxUX1RJTUVPVVRcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG9wdHMudHJhbnNwb3J0IHx8IGdsb2JhbC5XZWJTb2NrZXQgfHwgTG9uZ1BvbGxcbiAgICB0aGlzLnByaW1hcnlQYXNzZWRIZWFsdGhDaGVjayA9IGZhbHNlXG4gICAgdGhpcy5sb25nUG9sbEZhbGxiYWNrTXMgPSBvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc1xuICAgIHRoaXMuZmFsbGJhY2tUaW1lciA9IG51bGxcbiAgICB0aGlzLnNlc3Npb25TdG9yZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgKGdsb2JhbCAmJiBnbG9iYWwuc2Vzc2lvblN0b3JhZ2UpXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zID0gMFxuICAgIHRoaXMuZGVmYXVsdEVuY29kZXIgPSBTZXJpYWxpemVyLmVuY29kZS5iaW5kKFNlcmlhbGl6ZXIpXG4gICAgdGhpcy5kZWZhdWx0RGVjb2RlciA9IFNlcmlhbGl6ZXIuZGVjb2RlLmJpbmQoU2VyaWFsaXplcilcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5iaW5hcnlUeXBlID0gb3B0cy5iaW5hcnlUeXBlIHx8IFwiYXJyYXlidWZmZXJcIlxuICAgIHRoaXMuY29ubmVjdENsb2NrID0gMVxuICAgIGlmKHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmVuY29kZSA9IG9wdHMuZW5jb2RlIHx8IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gb3B0cy5kZWNvZGUgfHwgdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuY29kZSA9IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH1cbiAgICBsZXQgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICBpZihwaHhXaW5kb3cgJiYgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIpe1xuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5kaXNjb25uZWN0KClcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gdGhpcy5jb25uZWN0Q2xvY2tcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHBoeFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIiwgX2UgPT4ge1xuICAgICAgICBpZihhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID09PSB0aGlzLmNvbm5lY3RDbG9jayl7XG4gICAgICAgICAgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICAgICAgICB0aGlzLmNvbm5lY3QoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMgPSBvcHRzLmhlYXJ0YmVhdEludGVydmFsTXMgfHwgMzAwMDBcbiAgICB0aGlzLnJlam9pbkFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVqb2luQWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlam9pbkFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RBZnRlck1zID0gKHRyaWVzKSA9PiB7XG4gICAgICBpZihvcHRzLnJlY29ubmVjdEFmdGVyTXMpe1xuICAgICAgICByZXR1cm4gb3B0cy5yZWNvbm5lY3RBZnRlck1zKHRyaWVzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlciB8fCBudWxsXG4gICAgaWYoIXRoaXMubG9nZ2VyICYmIG9wdHMuZGVidWcpe1xuICAgICAgdGhpcy5sb2dnZXIgPSAoa2luZCwgbXNnLCBkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGAke2tpbmR9OiAke21zZ31gLCBkYXRhKSB9XG4gICAgfVxuICAgIHRoaXMubG9uZ3BvbGxlclRpbWVvdXQgPSBvcHRzLmxvbmdwb2xsZXJUaW1lb3V0IHx8IDIwMDAwXG4gICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKG9wdHMucGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuZW5kUG9pbnQgPSBgJHtlbmRQb2ludH0vJHtUUkFOU1BPUlRTLndlYnNvY2tldH1gXG4gICAgdGhpcy52c24gPSBvcHRzLnZzbiB8fCBERUZBVUxUX1ZTTlxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gbnVsbFxuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLmNvbm5lY3QoKSlcbiAgICB9LCB0aGlzLnJlY29ubmVjdEFmdGVyTXMpXG4gICAgdGhpcy5hdXRoVG9rZW4gPSBvcHRzLmF1dGhUb2tlblxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIExvbmdQb2xsIHRyYW5zcG9ydCByZWZlcmVuY2VcbiAgICovXG4gIGdldExvbmdQb2xsVHJhbnNwb3J0KCl7IHJldHVybiBMb25nUG9sbCB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGFuZCByZXBsYWNlcyB0aGUgYWN0aXZlIHRyYW5zcG9ydFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXdUcmFuc3BvcnQgLSBUaGUgbmV3IHRyYW5zcG9ydCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgKlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydChuZXdUcmFuc3BvcnQpe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSB0cnVlXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgdGhpcy5jb25uLmNsb3NlKClcbiAgICAgIHRoaXMuY29ubiA9IG51bGxcbiAgICB9XG4gICAgdGhpcy50cmFuc3BvcnQgPSBuZXdUcmFuc3BvcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb2NrZXQgcHJvdG9jb2xcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHByb3RvY29sKCl7IHJldHVybiBsb2NhdGlvbi5wcm90b2NvbC5tYXRjaCgvXmh0dHBzLykgPyBcIndzc1wiIDogXCJ3c1wiIH1cblxuICAvKipcbiAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBzb2NrZXQgdXJsXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlbmRQb2ludFVSTCgpe1xuICAgIGxldCB1cmkgPSBBamF4LmFwcGVuZFBhcmFtcyhcbiAgICAgIEFqYXguYXBwZW5kUGFyYW1zKHRoaXMuZW5kUG9pbnQsIHRoaXMucGFyYW1zKCkpLCB7dnNuOiB0aGlzLnZzbn0pXG4gICAgaWYodXJpLmNoYXJBdCgwKSAhPT0gXCIvXCIpeyByZXR1cm4gdXJpIH1cbiAgICBpZih1cmkuY2hhckF0KDEpID09PSBcIi9cIil7IHJldHVybiBgJHt0aGlzLnByb3RvY29sKCl9OiR7dXJpfWAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMucHJvdG9jb2woKX06Ly8ke2xvY2F0aW9uLmhvc3R9JHt1cml9YFxuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXRcbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DbG9zZUV2ZW50I1N0YXR1c19jb2RlcyBmb3IgdmFsaWQgc3RhdHVzIGNvZGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIE9wdGlvbmFsIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBzb2NrZXQgaXMgZGlzY29ubmVjdGVkLlxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IGNvZGUgLSBBIHN0YXR1cyBjb2RlIGZvciBkaXNjb25uZWN0aW9uIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBBIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiB0byBkaXNjb25uZWN0LiAoT3B0aW9uYWwpXG4gICAqL1xuICBkaXNjb25uZWN0KGNhbGxiYWNrLCBjb2RlLCByZWFzb24pe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSB0cnVlXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gdHJ1ZVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy50ZWFyZG93bigoKSA9PiB7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSBmYWxzZVxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH0sIGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtcyB0byBzZW5kIHdoZW4gY29ubmVjdGluZywgZm9yIGV4YW1wbGUgYHt1c2VyX2lkOiB1c2VyVG9rZW59YFxuICAgKlxuICAgKiBQYXNzaW5nIHBhcmFtcyB0byBjb25uZWN0IGlzIGRlcHJlY2F0ZWQ7IHBhc3MgdGhlbSBpbiB0aGUgU29ja2V0IGNvbnN0cnVjdG9yIGluc3RlYWQ6XG4gICAqIGBuZXcgU29ja2V0KFwiL3NvY2tldFwiLCB7cGFyYW1zOiB7dXNlcl9pZDogdXNlclRva2VufX0pYC5cbiAgICovXG4gIGNvbm5lY3QocGFyYW1zKXtcbiAgICBpZihwYXJhbXMpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKVxuICAgICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKHBhcmFtcylcbiAgICB9XG4gICAgaWYodGhpcy5jb25uICYmICF0aGlzLmRpc2Nvbm5lY3RpbmcpeyByZXR1cm4gfVxuICAgIGlmKHRoaXMubG9uZ1BvbGxGYWxsYmFja01zICYmIHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmNvbm5lY3RXaXRoRmFsbGJhY2soTG9uZ1BvbGwsIHRoaXMubG9uZ1BvbGxGYWxsYmFja01zKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYW5zcG9ydENvbm5lY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSBtZXNzYWdlLiBPdmVycmlkZSBgdGhpcy5sb2dnZXJgIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLiBub29wcyBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtc2dcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIGxvZyhraW5kLCBtc2csIGRhdGEpeyB0aGlzLmxvZ2dlciAmJiB0aGlzLmxvZ2dlcihraW5kLCBtc2csIGRhdGEpIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgbG9nZ2VyIGhhcyBiZWVuIHNldCBvbiB0aGlzIHNvY2tldC5cbiAgICovXG4gIGhhc0xvZ2dlcigpeyByZXR1cm4gdGhpcy5sb2dnZXIgIT09IG51bGwgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIG9wZW4gZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbk9wZW4oZnVuY3Rpb24oKXsgY29uc29sZS5pbmZvKFwidGhlIHNvY2tldCB3YXMgb3BlbmVkXCIpIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbk9wZW4oY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBjbG9zZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uQ2xvc2UoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuY2xvc2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gZXJyb3IgZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbkVycm9yKGZ1bmN0aW9uKGVycm9yKXsgYWxlcnQoXCJBbiBlcnJvciBvY2N1cnJlZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25FcnJvcihjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBtZXNzYWdlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25NZXNzYWdlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFBpbmdzIHRoZSBzZXJ2ZXIgYW5kIGludm9rZXMgdGhlIGNhbGxiYWNrIHdpdGggdGhlIFJUVCBpbiBtaWxsaXNlY29uZHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwaW5nIHdhcyBwdXNoZWQgb3IgZmFsc2UgaWYgdW5hYmxlIHRvIGJlIHB1c2hlZC5cbiAgICovXG4gIHBpbmcoY2FsbGJhY2spe1xuICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gZmFsc2UgfVxuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiByZWZ9KVxuICAgIGxldCBvbk1zZ1JlZiA9IHRoaXMub25NZXNzYWdlKG1zZyA9PiB7XG4gICAgICBpZihtc2cucmVmID09PSByZWYpe1xuICAgICAgICB0aGlzLm9mZihbb25Nc2dSZWZdKVxuICAgICAgICBjYWxsYmFjayhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICB0cmFuc3BvcnRDb25uZWN0KCl7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgbGV0IHByb3RvY29scyA9IHVuZGVmaW5lZFxuICAgIC8vIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgYmFzZWQgdG9rZW5cbiAgICAvLyAobG9uZ3BvbGwgdXNlcyBBdXRob3JpemF0aW9uIGhlYWRlciBpbnN0ZWFkKVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIHByb3RvY29scyA9IFtcInBob2VuaXhcIiwgYCR7QVVUSF9UT0tFTl9QUkVGSVh9JHtidG9hKHRoaXMuYXV0aFRva2VuKS5yZXBsYWNlKC89L2csIFwiXCIpfWBdXG4gICAgfVxuICAgIHRoaXMuY29ubiA9IG5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCksIHByb3RvY29scylcbiAgICB0aGlzLmNvbm4uYmluYXJ5VHlwZSA9IHRoaXMuYmluYXJ5VHlwZVxuICAgIHRoaXMuY29ubi50aW1lb3V0ID0gdGhpcy5sb25ncG9sbGVyVGltZW91dFxuICAgIHRoaXMuY29ubi5vbm9wZW4gPSAoKSA9PiB0aGlzLm9uQ29ubk9wZW4oKVxuICAgIHRoaXMuY29ubi5vbmVycm9yID0gZXJyb3IgPT4gdGhpcy5vbkNvbm5FcnJvcihlcnJvcilcbiAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5NZXNzYWdlKGV2ZW50KVxuICAgIHRoaXMuY29ubi5vbmNsb3NlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5DbG9zZShldmVudClcbiAgfVxuXG4gIGdldFNlc3Npb24oa2V5KXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JlICYmIHRoaXMuc2Vzc2lvblN0b3JlLmdldEl0ZW0oa2V5KSB9XG5cbiAgc3RvcmVTZXNzaW9uKGtleSwgdmFsKXsgdGhpcy5zZXNzaW9uU3RvcmUgJiYgdGhpcy5zZXNzaW9uU3RvcmUuc2V0SXRlbShrZXksIHZhbCkgfVxuXG4gIGNvbm5lY3RXaXRoRmFsbGJhY2soZmFsbGJhY2tUcmFuc3BvcnQsIGZhbGxiYWNrVGhyZXNob2xkID0gMjUwMCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICBsZXQgZXN0YWJsaXNoZWQgPSBmYWxzZVxuICAgIGxldCBwcmltYXJ5VHJhbnNwb3J0ID0gdHJ1ZVxuICAgIGxldCBvcGVuUmVmLCBlcnJvclJlZlxuICAgIGxldCBmYWxsYmFjayA9IChyZWFzb24pID0+IHtcbiAgICAgIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBmYWxsaW5nIGJhY2sgdG8gJHtmYWxsYmFja1RyYW5zcG9ydC5uYW1lfS4uLmAsIHJlYXNvbilcbiAgICAgIHRoaXMub2ZmKFtvcGVuUmVmLCBlcnJvclJlZl0pXG4gICAgICBwcmltYXJ5VHJhbnNwb3J0ID0gZmFsc2VcbiAgICAgIHRoaXMucmVwbGFjZVRyYW5zcG9ydChmYWxsYmFja1RyYW5zcG9ydClcbiAgICAgIHRoaXMudHJhbnNwb3J0Q29ubmVjdCgpXG4gICAgfVxuICAgIGlmKHRoaXMuZ2V0U2Vzc2lvbihgcGh4OmZhbGxiYWNrOiR7ZmFsbGJhY2tUcmFuc3BvcnQubmFtZX1gKSl7IHJldHVybiBmYWxsYmFjayhcIm1lbW9yaXplZFwiKSB9XG5cbiAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcblxuICAgIGVycm9yUmVmID0gdGhpcy5vbkVycm9yKHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImVycm9yXCIsIHJlYXNvbilcbiAgICAgIGlmKHByaW1hcnlUcmFuc3BvcnQgJiYgIWVzdGFibGlzaGVkKXtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICAgICAgZmFsbGJhY2socmVhc29uKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5vbk9wZW4oKCkgPT4ge1xuICAgICAgZXN0YWJsaXNoZWQgPSB0cnVlXG4gICAgICBpZighcHJpbWFyeVRyYW5zcG9ydCl7XG4gICAgICAgIC8vIG9ubHkgbWVtb3JpemUgTFAgaWYgd2UgbmV2ZXIgY29ubmVjdGVkIHRvIHByaW1hcnlcbiAgICAgICAgaWYoIXRoaXMucHJpbWFyeVBhc3NlZEhlYWx0aENoZWNrKXsgdGhpcy5zdG9yZVNlc3Npb24oYHBoeDpmYWxsYmFjazoke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9YCwgXCJ0cnVlXCIpIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBlc3RhYmxpc2hlZCAke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9IGZhbGxiYWNrYClcbiAgICAgIH1cbiAgICAgIC8vIGlmIHdlJ3ZlIGVzdGFibGlzaGVkIHByaW1hcnksIGdpdmUgdGhlIGZhbGxiYWNrIGEgbmV3IHBlcmlvZCB0byBhdHRlbXB0IHBpbmdcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcbiAgICAgIHRoaXMucGluZyhydHQgPT4ge1xuICAgICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNvbm5lY3RlZCB0byBwcmltYXJ5IGFmdGVyXCIsIHJ0dClcbiAgICAgICAgdGhpcy5wcmltYXJ5UGFzc2VkSGVhbHRoQ2hlY2sgPSB0cnVlXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy50cmFuc3BvcnRDb25uZWN0KClcbiAgfVxuXG4gIGNsZWFySGVhcnRiZWF0cygpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVyKVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVvdXRUaW1lcilcbiAgfVxuXG4gIG9uQ29ubk9wZW4oKXtcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBgJHt0aGlzLnRyYW5zcG9ydC5uYW1lfSBjb25uZWN0ZWQgdG8gJHt0aGlzLmVuZFBvaW50VVJMKCl9YClcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zKytcbiAgICB0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy5yZXNldEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4gY2FsbGJhY2soKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBoZWFydGJlYXRUaW1lb3V0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKXtcbiAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpeyB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImhlYXJ0YmVhdCB0aW1lb3V0LiBBdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uXCIpIH1cbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLnJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpLCBXU19DTE9TRV9OT1JNQUwsIFwiaGVhcnRiZWF0IHRpbWVvdXRcIilcbiAgICB9XG4gIH1cblxuICByZXNldEhlYXJ0YmVhdCgpe1xuICAgIGlmKHRoaXMuY29ubiAmJiB0aGlzLmNvbm4uc2tpcEhlYXJ0YmVhdCl7IHJldHVybiB9XG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMuY2xlYXJIZWFydGJlYXRzKClcbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbmRIZWFydGJlYXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgdGVhcmRvd24oY2FsbGJhY2ssIGNvZGUsIHJlYXNvbil7XG4gICAgaWYoIXRoaXMuY29ubil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH1cbiAgICBsZXQgY29ubmVjdENsb2NrID0gdGhpcy5jb25uZWN0Q2xvY2tcblxuICAgIHRoaXMud2FpdEZvckJ1ZmZlckRvbmUoKCkgPT4ge1xuICAgICAgaWYoY29ubmVjdENsb2NrICE9PSB0aGlzLmNvbm5lY3RDbG9jayl7IHJldHVybiB9XG4gICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICBpZihjb2RlKXsgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiB8fCBcIlwiKSB9IGVsc2UgeyB0aGlzLmNvbm4uY2xvc2UoKSB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZCgoKSA9PiB7XG4gICAgICAgIGlmKGNvbm5lY3RDbG9jayAhPT0gdGhpcy5jb25uZWN0Q2xvY2speyByZXR1cm4gfVxuICAgICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICAgIHRoaXMuY29ubi5vbm9wZW4gPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9uZXJyb3IgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4ub25jbG9zZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4gPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB3YWl0Rm9yQnVmZmVyRG9uZShjYWxsYmFjaywgdHJpZXMgPSAxKXtcbiAgICBpZih0cmllcyA9PT0gNSB8fCAhdGhpcy5jb25uIHx8ICF0aGlzLmNvbm4uYnVmZmVyZWRBbW91bnQpe1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhaXRGb3JCdWZmZXJEb25lKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICB3YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyA9IDEpe1xuICAgIGlmKHRyaWVzID09PSA1IHx8ICF0aGlzLmNvbm4gfHwgdGhpcy5jb25uLnJlYWR5U3RhdGUgPT09IFNPQ0tFVF9TVEFURVMuY2xvc2VkKXtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICBvbkNvbm5DbG9zZShldmVudCl7XG4gICAgbGV0IGNsb3NlQ29kZSA9IGV2ZW50ICYmIGV2ZW50LmNvZGVcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNsb3NlXCIsIGV2ZW50KVxuICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgdGhpcy5jbGVhckhlYXJ0YmVhdHMoKVxuICAgIGlmKCF0aGlzLmNsb3NlV2FzQ2xlYW4gJiYgY2xvc2VDb2RlICE9PSAxMDAwKXtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KClcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IGNhbGxiYWNrKGV2ZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Db25uRXJyb3IoZXJyb3Ipe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGVycm9yKVxuICAgIGxldCB0cmFuc3BvcnRCZWZvcmUgPSB0aGlzLnRyYW5zcG9ydFxuICAgIGxldCBlc3RhYmxpc2hlZEJlZm9yZSA9IHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9uc1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IuZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgdHJhbnNwb3J0QmVmb3JlLCBlc3RhYmxpc2hlZEJlZm9yZSlcbiAgICB9KVxuICAgIGlmKHRyYW5zcG9ydEJlZm9yZSA9PT0gdGhpcy50cmFuc3BvcnQgfHwgZXN0YWJsaXNoZWRCZWZvcmUgPiAwKXtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyQ2hhbkVycm9yKCl7XG4gICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgaWYoIShjaGFubmVsLmlzRXJyb3JlZCgpIHx8IGNoYW5uZWwuaXNMZWF2aW5nKCkgfHwgY2hhbm5lbC5pc0Nsb3NlZCgpKSl7XG4gICAgICAgIGNoYW5uZWwudHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5lcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjb25uZWN0aW9uU3RhdGUoKXtcbiAgICBzd2l0Y2godGhpcy5jb25uICYmIHRoaXMuY29ubi5yZWFkeVN0YXRlKXtcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nOiByZXR1cm4gXCJjb25uZWN0aW5nXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5vcGVuOiByZXR1cm4gXCJvcGVuXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jbG9zaW5nOiByZXR1cm4gXCJjbG9zaW5nXCJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBcImNsb3NlZFwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IFwib3BlblwiIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICpcbiAgICogQHBhcmFtIHtDaGFubmVsfVxuICAgKi9cbiAgcmVtb3ZlKGNoYW5uZWwpe1xuICAgIHRoaXMub2ZmKGNoYW5uZWwuc3RhdGVDaGFuZ2VSZWZzKVxuICAgIHRoaXMuY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcihjID0+IGMgIT09IGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3JlZnN9IC0gbGlzdCBvZiByZWZzIHJldHVybmVkIGJ5IGNhbGxzIHRvXG4gICAqICAgICAgICAgICAgICAgICBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYFxuICAgKi9cbiAgb2ZmKHJlZnMpe1xuICAgIGZvcihsZXQga2V5IGluIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mpe1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldLmZpbHRlcigoW3JlZl0pID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZnMuaW5kZXhPZihyZWYpID09PSAtMVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIGEgbmV3IGNoYW5uZWwgZm9yIHRoZSBnaXZlbiB0b3BpY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNoYW5QYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7Q2hhbm5lbH1cbiAgICovXG4gIGNoYW5uZWwodG9waWMsIGNoYW5QYXJhbXMgPSB7fSl7XG4gICAgbGV0IGNoYW4gPSBuZXcgQ2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcywgdGhpcylcbiAgICB0aGlzLmNoYW5uZWxzLnB1c2goY2hhbilcbiAgICByZXR1cm4gY2hhblxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqL1xuICBwdXNoKGRhdGEpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpe1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gZGF0YVxuICAgICAgdGhpcy5sb2coXCJwdXNoXCIsIGAke3RvcGljfSAke2V2ZW50fSAoJHtqb2luX3JlZn0sICR7cmVmfSlgLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kQnVmZmVyLnB1c2goKCkgPT4gdGhpcy5lbmNvZGUoZGF0YSwgcmVzdWx0ID0+IHRoaXMuY29ubi5zZW5kKHJlc3VsdCkpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgbWVzc2FnZSByZWYsIGFjY291bnRpbmcgZm9yIG92ZXJmbG93c1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgbWFrZVJlZigpe1xuICAgIGxldCBuZXdSZWYgPSB0aGlzLnJlZiArIDFcbiAgICBpZihuZXdSZWYgPT09IHRoaXMucmVmKXsgdGhpcy5yZWYgPSAwIH0gZWxzZSB7IHRoaXMucmVmID0gbmV3UmVmIH1cblxuICAgIHJldHVybiB0aGlzLnJlZi50b1N0cmluZygpXG4gIH1cblxuICBzZW5kSGVhcnRiZWF0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmICYmICF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWZ9KVxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmhlYXJ0YmVhdFRpbWVvdXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgZmx1c2hTZW5kQnVmZmVyKCl7XG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VuZEJ1ZmZlci5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpXG4gICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSl7XG4gICAgdGhpcy5kZWNvZGUocmF3TWVzc2FnZS5kYXRhLCBtc2cgPT4ge1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gbXNnXG4gICAgICBpZihyZWYgJiYgcmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpe1xuICAgICAgICB0aGlzLmNsZWFySGVhcnRiZWF0cygpXG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZW5kSGVhcnRiZWF0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcylcbiAgICAgIH1cblxuICAgICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJyZWNlaXZlXCIsIGAke3BheWxvYWQuc3RhdHVzIHx8IFwiXCJ9ICR7dG9waWN9ICR7ZXZlbnR9ICR7cmVmICYmIFwiKFwiICsgcmVmICsgXCIpXCIgfHwgXCJcIn1gLCBwYXlsb2FkKVxuXG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFubmVscy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzW2ldXG4gICAgICAgIGlmKCFjaGFubmVsLmlzTWVtYmVyKHRvcGljLCBldmVudCwgcGF5bG9hZCwgam9pbl9yZWYpKXsgY29udGludWUgfVxuICAgICAgICBjaGFubmVsLnRyaWdnZXIoZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWYpXG4gICAgICB9XG5cbiAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UubGVuZ3RoOyBpKyspe1xuICAgICAgICBsZXQgWywgY2FsbGJhY2tdID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlW2ldXG4gICAgICAgIGNhbGxiYWNrKG1zZylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbGVhdmVPcGVuVG9waWModG9waWMpe1xuICAgIGxldCBkdXBDaGFubmVsID0gdGhpcy5jaGFubmVscy5maW5kKGMgPT4gYy50b3BpYyA9PT0gdG9waWMgJiYgKGMuaXNKb2luZWQoKSB8fCBjLmlzSm9pbmluZygpKSlcbiAgICBpZihkdXBDaGFubmVsKXtcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBsZWF2aW5nIGR1cGxpY2F0ZSB0b3BpYyBcIiR7dG9waWN9XCJgKVxuICAgICAgZHVwQ2hhbm5lbC5sZWF2ZSgpXG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IENPTlNFQ1VUSVZFX1JFTE9BRFMgPSBcImNvbnNlY3V0aXZlLXJlbG9hZHNcIjtcbmV4cG9ydCBjb25zdCBNQVhfUkVMT0FEUyA9IDEwO1xuZXhwb3J0IGNvbnN0IFJFTE9BRF9KSVRURVJfTUlOID0gNTAwMDtcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSX01BWCA9IDEwMDAwO1xuZXhwb3J0IGNvbnN0IEZBSUxTQUZFX0pJVFRFUiA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IFBIWF9FVkVOVF9DTEFTU0VTID0gW1xuICBcInBoeC1jbGljay1sb2FkaW5nXCIsXG4gIFwicGh4LWNoYW5nZS1sb2FkaW5nXCIsXG4gIFwicGh4LXN1Ym1pdC1sb2FkaW5nXCIsXG4gIFwicGh4LWtleWRvd24tbG9hZGluZ1wiLFxuICBcInBoeC1rZXl1cC1sb2FkaW5nXCIsXG4gIFwicGh4LWJsdXItbG9hZGluZ1wiLFxuICBcInBoeC1mb2N1cy1sb2FkaW5nXCIsXG4gIFwicGh4LWhvb2stbG9hZGluZ1wiLFxuXTtcbmV4cG9ydCBjb25zdCBQSFhfQ09NUE9ORU5UID0gXCJkYXRhLXBoeC1jb21wb25lbnRcIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19SRUYgPSBcImRhdGEtcGh4LXZpZXdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9MSU5LID0gXCJkYXRhLXBoeC1saW5rXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSQUNLX1NUQVRJQyA9IFwidHJhY2stc3RhdGljXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJTktfU1RBVEUgPSBcImRhdGEtcGh4LWxpbmstc3RhdGVcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQURJTkcgPSBcImRhdGEtcGh4LXJlZi1sb2FkaW5nXCI7XG5leHBvcnQgY29uc3QgUEhYX1JFRl9TUkMgPSBcImRhdGEtcGh4LXJlZi1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQ0sgPSBcImRhdGEtcGh4LXJlZi1sb2NrXCI7XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfUkVGUyA9IFwicGh4LXBlbmRpbmctcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9UUkFDS19VUExPQURTID0gXCJ0cmFjay11cGxvYWRzXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQTE9BRF9SRUYgPSBcImRhdGEtcGh4LXVwbG9hZC1yZWZcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJFRkxJR0hURURfUkVGUyA9IFwiZGF0YS1waHgtcHJlZmxpZ2h0ZWQtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ET05FX1JFRlMgPSBcImRhdGEtcGh4LWRvbmUtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9EUk9QX1RBUkdFVCA9IFwiZHJvcC10YXJnZXRcIjtcbmV4cG9ydCBjb25zdCBQSFhfQUNUSVZFX0VOVFJZX1JFRlMgPSBcImRhdGEtcGh4LWFjdGl2ZS1yZWZzXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJVkVfRklMRV9VUERBVEVEID0gXCJwaHg6bGl2ZS1maWxlOnVwZGF0ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfU0tJUCA9IFwiZGF0YS1waHgtc2tpcFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9NQUdJQ19JRCA9IFwiZGF0YS1waHgtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJVTkUgPSBcImRhdGEtcGh4LXBydW5lXCI7XG5leHBvcnQgY29uc3QgUEhYX0NPTk5FQ1RFRF9DTEFTUyA9IFwicGh4LWNvbm5lY3RlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MT0FESU5HX0NMQVNTID0gXCJwaHgtbG9hZGluZ1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9FUlJPUl9DTEFTUyA9IFwicGh4LWVycm9yXCI7XG5leHBvcnQgY29uc3QgUEhYX0NMSUVOVF9FUlJPUl9DTEFTUyA9IFwicGh4LWNsaWVudC1lcnJvclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9TRVJWRVJfRVJST1JfQ0xBU1MgPSBcInBoeC1zZXJ2ZXItZXJyb3JcIjtcbmV4cG9ydCBjb25zdCBQSFhfUEFSRU5UX0lEID0gXCJkYXRhLXBoeC1wYXJlbnQtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfTUFJTiA9IFwiZGF0YS1waHgtbWFpblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ST09UX0lEID0gXCJkYXRhLXBoeC1yb290LWlkXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX1RPUCA9IFwidmlld3BvcnQtdG9wXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX0JPVFRPTSA9IFwidmlld3BvcnQtYm90dG9tXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSSUdHRVJfQUNUSU9OID0gXCJ0cmlnZ2VyLWFjdGlvblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9IQVNfRk9DVVNFRCA9IFwicGh4LWhhcy1mb2N1c2VkXCI7XG5leHBvcnQgY29uc3QgRk9DVVNBQkxFX0lOUFVUUyA9IFtcbiAgXCJ0ZXh0XCIsXG4gIFwidGV4dGFyZWFcIixcbiAgXCJudW1iZXJcIixcbiAgXCJlbWFpbFwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwic2VhcmNoXCIsXG4gIFwidGVsXCIsXG4gIFwidXJsXCIsXG4gIFwiZGF0ZVwiLFxuICBcInRpbWVcIixcbiAgXCJkYXRldGltZS1sb2NhbFwiLFxuICBcImNvbG9yXCIsXG4gIFwicmFuZ2VcIixcbl07XG5leHBvcnQgY29uc3QgQ0hFQ0tBQkxFX0lOUFVUUyA9IFtcImNoZWNrYm94XCIsIFwicmFkaW9cIl07XG5leHBvcnQgY29uc3QgUEhYX0hBU19TVUJNSVRURUQgPSBcInBoeC1oYXMtc3VibWl0dGVkXCI7XG5leHBvcnQgY29uc3QgUEhYX1NFU1NJT04gPSBcImRhdGEtcGh4LXNlc3Npb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19TRUxFQ1RPUiA9IGBbJHtQSFhfU0VTU0lPTn1dYDtcbmV4cG9ydCBjb25zdCBQSFhfU1RJQ0tZID0gXCJkYXRhLXBoeC1zdGlja3lcIjtcbmV4cG9ydCBjb25zdCBQSFhfU1RBVElDID0gXCJkYXRhLXBoeC1zdGF0aWNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVBRE9OTFkgPSBcImRhdGEtcGh4LXJlYWRvbmx5XCI7XG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVEID0gXCJkYXRhLXBoeC1kaXNhYmxlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEggPSBcImRpc2FibGUtd2l0aFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSA9IFwiZGF0YS1waHgtZGlzYWJsZS13aXRoLXJlc3RvcmVcIjtcbmV4cG9ydCBjb25zdCBQSFhfSE9PSyA9IFwiaG9va1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ERUJPVU5DRSA9IFwiZGVib3VuY2VcIjtcbmV4cG9ydCBjb25zdCBQSFhfVEhST1RUTEUgPSBcInRocm90dGxlXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQREFURSA9IFwidXBkYXRlXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTSA9IFwic3RyZWFtXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTV9SRUYgPSBcImRhdGEtcGh4LXN0cmVhbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9QT1JUQUwgPSBcImRhdGEtcGh4LXBvcnRhbFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1JFRiA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1NSQyA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZC1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUlVOVElNRV9IT09LID0gXCJkYXRhLXBoeC1ydW50aW1lLWhvb2tcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfUElEID0gXCJkYXRhLXBoeC1waWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfS0VZID0gXCJrZXlcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJJVkFURSA9IFwicGh4UHJpdmF0ZVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9BVVRPX1JFQ09WRVIgPSBcImF1dG8tcmVjb3ZlclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ERUJVRyA9IFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCI7XG5leHBvcnQgY29uc3QgUEhYX0xWX1BST0ZJTEUgPSBcInBoeDpsaXZlLXNvY2tldDpwcm9maWxpbmdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfTEFURU5DWV9TSU0gPSBcInBoeDpsaXZlLXNvY2tldDpsYXRlbmN5LXNpbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OID0gXCJwaHg6bmF2LWhpc3RvcnktcG9zaXRpb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJPR1JFU1MgPSBcInByb2dyZXNzXCI7XG5leHBvcnQgY29uc3QgUEhYX01PVU5URUQgPSBcIm1vdW50ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVMT0FEX1NUQVRVUyA9IFwiX19waG9lbml4X3JlbG9hZF9zdGF0dXNfX1wiO1xuZXhwb3J0IGNvbnN0IExPQURFUl9USU1FT1VUID0gMTtcbmV4cG9ydCBjb25zdCBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUyA9IDM7XG5leHBvcnQgY29uc3QgQkVGT1JFX1VOTE9BRF9MT0FERVJfVElNRU9VVCA9IDIwMDtcbmV4cG9ydCBjb25zdCBESVNDT05ORUNURURfVElNRU9VVCA9IDUwMDtcbmV4cG9ydCBjb25zdCBCSU5ESU5HX1BSRUZJWCA9IFwicGh4LVwiO1xuZXhwb3J0IGNvbnN0IFBVU0hfVElNRU9VVCA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IExJTktfSEVBREVSID0gXCJ4LXJlcXVlc3RlZC13aXRoXCI7XG5leHBvcnQgY29uc3QgUkVTUE9OU0VfVVJMX0hFQURFUiA9IFwieC1yZXNwb25zZS11cmxcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9UUklHR0VSID0gXCJkZWJvdW5jZS10cmlnZ2VyXCI7XG5leHBvcnQgY29uc3QgVEhST1RUTEVEID0gXCJ0aHJvdHRsZWRcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9QUkVWX0tFWSA9IFwiZGVib3VuY2UtcHJldi1rZXlcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUUyA9IHtcbiAgZGVib3VuY2U6IDMwMCxcbiAgdGhyb3R0bGU6IDMwMCxcbn07XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfQVRUUlMgPSBbUEhYX1JFRl9MT0FESU5HLCBQSFhfUkVGX1NSQywgUEhYX1JFRl9MT0NLXTtcbi8vIFJlbmRlcmVkXG5leHBvcnQgY29uc3QgU1RBVElDID0gXCJzXCI7XG5leHBvcnQgY29uc3QgUk9PVCA9IFwiclwiO1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVFMgPSBcImNcIjtcbmV4cG9ydCBjb25zdCBLRVlFRCA9IFwia1wiO1xuZXhwb3J0IGNvbnN0IEtFWUVEX0NPVU5UID0gXCJrY1wiO1xuZXhwb3J0IGNvbnN0IEVWRU5UUyA9IFwiZVwiO1xuZXhwb3J0IGNvbnN0IFJFUExZID0gXCJyXCI7XG5leHBvcnQgY29uc3QgVElUTEUgPSBcInRcIjtcbmV4cG9ydCBjb25zdCBURU1QTEFURVMgPSBcInBcIjtcbmV4cG9ydCBjb25zdCBTVFJFQU0gPSBcInN0cmVhbVwiO1xuIiwgImltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW50cnlVcGxvYWRlciB7XG4gIGNvbnN0cnVjdG9yKGVudHJ5LCBjb25maWcsIGxpdmVTb2NrZXQpIHtcbiAgICBjb25zdCB7IGNodW5rX3NpemUsIGNodW5rX3RpbWVvdXQgfSA9IGNvbmZpZztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuICAgIHRoaXMuZW50cnkgPSBlbnRyeTtcbiAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgdGhpcy5jaHVua1NpemUgPSBjaHVua19zaXplO1xuICAgIHRoaXMuY2h1bmtUaW1lb3V0ID0gY2h1bmtfdGltZW91dDtcbiAgICB0aGlzLmNodW5rVGltZXIgPSBudWxsO1xuICAgIHRoaXMuZXJyb3JlZCA9IGZhbHNlO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbCA9IGxpdmVTb2NrZXQuY2hhbm5lbChgbHZ1OiR7ZW50cnkucmVmfWAsIHtcbiAgICAgIHRva2VuOiBlbnRyeS5tZXRhZGF0YSgpLFxuICAgIH0pO1xuICB9XG5cbiAgZXJyb3IocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuZXJyb3JlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWwubGVhdmUoKTtcbiAgICB0aGlzLmVycm9yZWQgPSB0cnVlO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmNodW5rVGltZXIpO1xuICAgIHRoaXMuZW50cnkuZXJyb3IocmVhc29uKTtcbiAgfVxuXG4gIHVwbG9hZCgpIHtcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwub25FcnJvcigocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbFxuICAgICAgLmpvaW4oKVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoX2RhdGEpID0+IHRoaXMucmVhZE5leHRDaHVuaygpKVxuICAgICAgLnJlY2VpdmUoXCJlcnJvclwiLCAocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG5cbiAgaXNEb25lKCkge1xuICAgIHJldHVybiB0aGlzLm9mZnNldCA+PSB0aGlzLmVudHJ5LmZpbGUuc2l6ZTtcbiAgfVxuXG4gIHJlYWROZXh0Q2h1bmsoKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IHdpbmRvdy5GaWxlUmVhZGVyKCk7XG4gICAgY29uc3QgYmxvYiA9IHRoaXMuZW50cnkuZmlsZS5zbGljZShcbiAgICAgIHRoaXMub2Zmc2V0LFxuICAgICAgdGhpcy5jaHVua1NpemUgKyB0aGlzLm9mZnNldCxcbiAgICApO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmVycm9yID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpLmJ5dGVMZW5ndGg7XG4gICAgICAgIHRoaXMucHVzaENodW5rKC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsb2dFcnJvcihcIlJlYWQgZXJyb3I6IFwiICsgZS50YXJnZXQuZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9XG5cbiAgcHVzaENodW5rKGNodW5rKSB7XG4gICAgaWYgKCF0aGlzLnVwbG9hZENoYW5uZWwuaXNKb2luZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWxcbiAgICAgIC5wdXNoKFwiY2h1bmtcIiwgY2h1bmssIHRoaXMuY2h1bmtUaW1lb3V0KVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cnkucHJvZ3Jlc3MoKHRoaXMub2Zmc2V0IC8gdGhpcy5lbnRyeS5maWxlLnNpemUpICogMTAwKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRG9uZSgpKSB7XG4gICAgICAgICAgdGhpcy5jaHVua1RpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVhZE5leHRDaHVuaygpLFxuICAgICAgICAgICAgdGhpcy5saXZlU29ja2V0LmdldExhdGVuY3lTaW0oKSB8fCAwLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsICh7IHJlYXNvbiB9KSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUEhYX1ZJRVdfU0VMRUNUT1IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IEVudHJ5VXBsb2FkZXIgZnJvbSBcIi4vZW50cnlfdXBsb2FkZXJcIjtcblxuZXhwb3J0IGNvbnN0IGxvZ0Vycm9yID0gKG1zZywgb2JqKSA9PiBjb25zb2xlLmVycm9yICYmIGNvbnNvbGUuZXJyb3IobXNnLCBvYmopO1xuXG5leHBvcnQgY29uc3QgaXNDaWQgPSAoY2lkKSA9PiB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgY2lkO1xuICByZXR1cm4gdHlwZSA9PT0gXCJudW1iZXJcIiB8fCAodHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAvXigwfFsxLTldXFxkKikkLy50ZXN0KGNpZCkpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdER1cGxpY2F0ZUlkcygpIHtcbiAgY29uc3QgaWRzID0gbmV3IFNldCgpO1xuICBjb25zdCBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2lkXVwiKTtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGlkcy5oYXMoZWxlbXNbaV0uaWQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTXVsdGlwbGUgSURzIGRldGVjdGVkOiAke2VsZW1zW2ldLmlkfS4gRW5zdXJlIHVuaXF1ZSBlbGVtZW50IGlkcy5gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzLmFkZChlbGVtc1tpXS5pZCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyhpbnNlcnRzKSB7XG4gIGNvbnN0IGVycm9ycyA9IG5ldyBTZXQoKTtcbiAgT2JqZWN0LmtleXMoaW5zZXJ0cykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICBjb25zdCBzdHJlYW1FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoXG4gICAgICBzdHJlYW1FbCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJwaHgtdXBkYXRlXCIpICE9PSBcInN0cmVhbVwiXG4gICAgKSB7XG4gICAgICBlcnJvcnMuYWRkKFxuICAgICAgICBgVGhlIHN0cmVhbSBjb250YWluZXIgd2l0aCBpZCBcIiR7c3RyZWFtRWwucGFyZW50RWxlbWVudC5pZH1cIiBpcyBtaXNzaW5nIHRoZSBwaHgtdXBkYXRlPVwic3RyZWFtXCIgYXR0cmlidXRlLiBFbnN1cmUgaXQgaXMgc2V0IGZvciBzdHJlYW1zIHRvIHdvcmsgcHJvcGVybHkuYCxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbiAgZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKGVycm9yKSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWJ1ZyA9ICh2aWV3LCBraW5kLCBtc2csIG9iaikgPT4ge1xuICBpZiAodmlldy5saXZlU29ja2V0LmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopO1xuICB9XG59O1xuXG4vLyB3cmFwcyB2YWx1ZSBpbiBjbG9zdXJlIG9yIHJldHVybnMgY2xvc3VyZVxuZXhwb3J0IGNvbnN0IGNsb3N1cmUgPSAodmFsKSA9PlxuICB0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IHZhbFxuICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfTtcblxuZXhwb3J0IGNvbnN0IGNsb25lID0gKG9iaikgPT4ge1xuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbG9zZXN0UGh4QmluZGluZyA9IChlbCwgYmluZGluZywgYm9yZGVyRWwpID0+IHtcbiAgZG8ge1xuICAgIGlmIChlbC5tYXRjaGVzKGBbJHtiaW5kaW5nfV1gKSAmJiAhZWwuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50IHx8IGVsLnBhcmVudE5vZGU7XG4gIH0gd2hpbGUgKFxuICAgIGVsICE9PSBudWxsICYmXG4gICAgZWwubm9kZVR5cGUgPT09IDEgJiZcbiAgICAhKChib3JkZXJFbCAmJiBib3JkZXJFbC5pc1NhbWVOb2RlKGVsKSkgfHwgZWwubWF0Y2hlcyhQSFhfVklFV19TRUxFQ1RPUikpXG4gICk7XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKG9iaikgPT4ge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgIShvYmogaW5zdGFuY2VvZiBBcnJheSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFcXVhbE9iaiA9IChvYmoxLCBvYmoyKSA9PlxuICBKU09OLnN0cmluZ2lmeShvYmoxKSA9PT0gSlNPTi5zdHJpbmdpZnkob2JqMik7XG5cbmV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICBmb3IgKGNvbnN0IHggaW4gb2JqKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heWJlID0gKGVsLCBjYWxsYmFjaykgPT4gZWwgJiYgY2FsbGJhY2soZWwpO1xuXG5leHBvcnQgY29uc3QgY2hhbm5lbFVwbG9hZGVyID0gZnVuY3Rpb24gKGVudHJpZXMsIG9uRXJyb3IsIHJlc3AsIGxpdmVTb2NrZXQpIHtcbiAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IGVudHJ5VXBsb2FkZXIgPSBuZXcgRW50cnlVcGxvYWRlcihlbnRyeSwgcmVzcC5jb25maWcsIGxpdmVTb2NrZXQpO1xuICAgIGVudHJ5VXBsb2FkZXIudXBsb2FkKCk7XG4gIH0pO1xufTtcbiIsICJjb25zdCBCcm93c2VyID0ge1xuICBjYW5QdXNoU3RhdGUoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBoaXN0b3J5LnB1c2hTdGF0ZSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgfSxcblxuICBkcm9wTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSk7XG4gIH0sXG5cbiAgdXBkYXRlTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSwgaW5pdGlhbCwgZnVuYykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IG5ld1ZhbCA9IGN1cnJlbnQgPT09IG51bGwgPyBpbml0aWFsIDogZnVuYyhjdXJyZW50KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG5ld1ZhbCkpO1xuICAgIHJldHVybiBuZXdWYWw7XG4gIH0sXG5cbiAgZ2V0TG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpKSk7XG4gIH0sXG5cbiAgdXBkYXRlQ3VycmVudFN0YXRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmNhblB1c2hTdGF0ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuICAgICAgY2FsbGJhY2soaGlzdG9yeS5zdGF0ZSB8fCB7fSksXG4gICAgICBcIlwiLFxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgKTtcbiAgfSxcblxuICBwdXNoU3RhdGUoa2luZCwgbWV0YSwgdG8pIHtcbiAgICBpZiAodGhpcy5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgaWYgKHRvICE9PSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xuICAgICAgICBpZiAobWV0YS50eXBlID09IFwicmVkaXJlY3RcIiAmJiBtZXRhLnNjcm9sbCkge1xuICAgICAgICAgIC8vIElmIHdlJ3JlIHJlZGlyZWN0aW5nIHN0b3JlIHRoZSBjdXJyZW50IHNjcm9sbFkgZm9yIHRoZSBjdXJyZW50IGhpc3Rvcnkgc3RhdGUuXG4gICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gaGlzdG9yeS5zdGF0ZSB8fCB7fTtcbiAgICAgICAgICBjdXJyZW50U3RhdGUuc2Nyb2xsID0gbWV0YS5zY3JvbGw7XG4gICAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY3VycmVudFN0YXRlLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgbWV0YS5zY3JvbGw7IC8vIE9ubHkgc3RvcmUgdGhlIHNjcm9sbCBpbiB0aGUgcmVkaXJlY3QgY2FzZS5cbiAgICAgICAgaGlzdG9yeVtraW5kICsgXCJTdGF0ZVwiXShtZXRhLCBcIlwiLCB0byB8fCBudWxsKTsgLy8gSUUgd2lsbCBjb2VyY2UgdW5kZWZpbmVkIHRvIHN0cmluZ1xuXG4gICAgICAgIC8vIHdoZW4gdXNpbmcgbmF2aWdhdGUsIHdlJ2QgY2FsbCBwdXNoU3RhdGUgaW1tZWRpYXRlbHkgYmVmb3JlIHBhdGNoaW5nIHRoZSBET00sXG4gICAgICAgIC8vIGp1bXBpbmcgYmFjayB0byB0aGUgdG9wIG9mIHRoZSBwYWdlLCBlZmZlY3RpdmVseSBpZ25vcmluZyB0aGUgc2Nyb2xsSW50b1ZpZXc7XG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZSAoYWZ0ZXIgdGhlIERPTSBwYXRjaCkgYW5kIG9ubHkgdGhlbiB0cnlcbiAgICAgICAgLy8gdG8gc2Nyb2xsIHRvIHRoZSBoYXNoRWxcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzaEVsID0gdGhpcy5nZXRIYXNoVGFyZ2V0RWwod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuXG4gICAgICAgICAgaWYgKGhhc2hFbCkge1xuICAgICAgICAgICAgaGFzaEVsLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZXRhLnR5cGUgPT09IFwicmVkaXJlY3RcIikge1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbCgwLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZGlyZWN0KHRvKTtcbiAgICB9XG4gIH0sXG5cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlLCBtYXhBZ2VTZWNvbmRzKSB7XG4gICAgY29uc3QgZXhwaXJlcyA9XG4gICAgICB0eXBlb2YgbWF4QWdlU2Vjb25kcyA9PT0gXCJudW1iZXJcIiA/IGAgbWF4LWFnZT0ke21heEFnZVNlY29uZHN9O2AgOiBcIlwiO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PSR7dmFsdWV9OyR7ZXhwaXJlc30gcGF0aD0vYDtcbiAgfSxcblxuICBnZXRDb29raWUobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jb29raWUucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoYCg/Oig/Ol58Lio7XFxzKikke25hbWV9XFxzKlxcPVxccyooW147XSopLiokKXxeLiokYCksXG4gICAgICBcIiQxXCIsXG4gICAgKTtcbiAgfSxcblxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PTsgbWF4LWFnZT0tMTsgcGF0aD0vYDtcbiAgfSxcblxuICByZWRpcmVjdChcbiAgICB0b1VSTCxcbiAgICBmbGFzaCxcbiAgICBuYXZpZ2F0ZSA9ICh1cmwpID0+IHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgIH0sXG4gICkge1xuICAgIGlmIChmbGFzaCkge1xuICAgICAgdGhpcy5zZXRDb29raWUoXCJfX3Bob2VuaXhfZmxhc2hfX1wiLCBmbGFzaCwgNjApO1xuICAgIH1cbiAgICBuYXZpZ2F0ZSh0b1VSTCk7XG4gIH0sXG5cbiAgbG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpIHtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfS0ke3N1YmtleX1gO1xuICB9LFxuXG4gIGdldEhhc2hUYXJnZXRFbChtYXliZUhhc2gpIHtcbiAgICBjb25zdCBoYXNoID0gbWF5YmVIYXNoLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO1xuICAgIGlmIChoYXNoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoKSB8fFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgYVtuYW1lPVwiJHtoYXNofVwiXWApXG4gICAgKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXI7XG4iLCAiaW1wb3J0IHtcbiAgQ0hFQ0tBQkxFX0lOUFVUUyxcbiAgREVCT1VOQ0VfUFJFVl9LRVksXG4gIERFQk9VTkNFX1RSSUdHRVIsXG4gIEZPQ1VTQUJMRV9JTlBVVFMsXG4gIFBIWF9DT01QT05FTlQsXG4gIFBIWF9WSUVXX1JFRixcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfTUFJTixcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BSSVZBVEUsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVGX0xPQ0ssXG4gIFBIWF9QRU5ESU5HX0FUVFJTLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1NFU1NJT04sXG4gIFBIWF9TVEFUSUMsXG4gIFBIWF9VUExPQURfUkVGLFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1NUSUNLWSxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFRIUk9UVExFRCxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1NUUkVBTSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgRE9NID0ge1xuICBieUlkKGlkKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBsb2dFcnJvcihgbm8gaWQgZm91bmQgZm9yICR7aWR9YCk7XG4gIH0sXG5cbiAgcmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICBpZiAoZWwuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgfVxuICB9LFxuXG4gIGFsbChub2RlLCBxdWVyeSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgYXJyYXkuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfSxcblxuICBjaGlsZE5vZGVMZW5ndGgoaHRtbCkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnQ7XG4gIH0sXG5cbiAgaXNVcGxvYWRJbnB1dChlbCkge1xuICAgIHJldHVybiBlbC50eXBlID09PSBcImZpbGVcIiAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQXV0b1VwbG9hZChpbnB1dEVsKSB7XG4gICAgcmV0dXJuIGlucHV0RWwuaGFzQXR0cmlidXRlKFwiZGF0YS1waHgtYXV0by11cGxvYWRcIik7XG4gIH0sXG5cbiAgZmluZFVwbG9hZElucHV0cyhub2RlKSB7XG4gICAgY29uc3QgZm9ybUlkID0gbm9kZS5pZDtcbiAgICBjb25zdCBpbnB1dHNPdXRzaWRlRm9ybSA9IHRoaXMuYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgaW5wdXRbdHlwZT1cImZpbGVcIl1bJHtQSFhfVVBMT0FEX1JFRn1dW2Zvcm09XCIke2Zvcm1JZH1cIl1gLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWxsKG5vZGUsIGBpbnB1dFt0eXBlPVwiZmlsZVwiXVske1BIWF9VUExPQURfUkVGfV1gKS5jb25jYXQoXG4gICAgICBpbnB1dHNPdXRzaWRlRm9ybSxcbiAgICApO1xuICB9LFxuXG4gIGZpbmRDb21wb25lbnROb2RlTGlzdCh2aWV3SWQsIGNpZCwgZG9jID0gZG9jdW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoXG4gICAgICBkb2MsXG4gICAgICBgWyR7UEhYX1ZJRVdfUkVGfT1cIiR7dmlld0lkfVwiXVske1BIWF9DT01QT05FTlR9PVwiJHtjaWR9XCJdYCxcbiAgICApO1xuICB9LFxuXG4gIGlzUGh4RGVzdHJveWVkKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5pZCAmJiBET00ucHJpdmF0ZShub2RlLCBcImRlc3Ryb3llZFwiKSA/IHRydWUgOiBmYWxzZTtcbiAgfSxcblxuICB3YW50c05ld1RhYihlKSB7XG4gICAgY29uc3Qgd2FudHNOZXdUYWIgPVxuICAgICAgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IChlLmJ1dHRvbiAmJiBlLmJ1dHRvbiA9PT0gMSk7XG4gICAgY29uc3QgaXNEb3dubG9hZCA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmXG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJkb3dubG9hZFwiKTtcbiAgICBjb25zdCBpc1RhcmdldEJsYW5rID1cbiAgICAgIGUudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInRhcmdldFwiKSAmJlxuICAgICAgZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpLnRvTG93ZXJDYXNlKCkgPT09IFwiX2JsYW5rXCI7XG4gICAgY29uc3QgaXNUYXJnZXROYW1lZFRhYiA9XG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJ0YXJnZXRcIikgJiZcbiAgICAgICFlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIikuc3RhcnRzV2l0aChcIl9cIik7XG4gICAgcmV0dXJuIHdhbnRzTmV3VGFiIHx8IGlzVGFyZ2V0QmxhbmsgfHwgaXNEb3dubG9hZCB8fCBpc1RhcmdldE5hbWVkVGFiO1xuICB9LFxuXG4gIGlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkge1xuICAgIC8vIElnbm9yZSBmb3JtIHN1Ym1pc3Npb25zIGludGVuZGVkIHRvIGNsb3NlIGEgbmF0aXZlIDxkaWFsb2c+IGVsZW1lbnRcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvZGlhbG9nI3VzYWdlX25vdGVzXG4gICAgY29uc3QgaXNEaWFsb2dTdWJtaXQgPVxuICAgICAgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZShcIm1ldGhvZFwiKSA9PT0gXCJkaWFsb2dcIikgfHxcbiAgICAgIChlLnN1Ym1pdHRlciAmJiBlLnN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtbWV0aG9kXCIpID09PSBcImRpYWxvZ1wiKTtcblxuICAgIGlmIChpc0RpYWxvZ1N1Ym1pdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gIWUuZGVmYXVsdFByZXZlbnRlZCAmJiAhdGhpcy53YW50c05ld1RhYihlKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNOZXdQYWdlQ2xpY2soZSwgY3VycmVudExvY2F0aW9uKSB7XG4gICAgY29uc3QgaHJlZiA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50XG4gICAgICAgID8gZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgICA6IG51bGw7XG4gICAgbGV0IHVybDtcblxuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQgfHwgaHJlZiA9PT0gbnVsbCB8fCB0aGlzLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJtYWlsdG86XCIpIHx8IGhyZWYuc3RhcnRzV2l0aChcInRlbDpcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUudGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHVybCA9IG5ldyBVUkwoaHJlZik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICB1cmwgPSBuZXcgVVJMKGhyZWYsIGN1cnJlbnRMb2NhdGlvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gYmFkIFVSTCwgZmFsbGJhY2sgdG8gbGV0IGJyb3dzZXIgdHJ5IGl0IGFzIGV4dGVybmFsXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHVybC5ob3N0ID09PSBjdXJyZW50TG9jYXRpb24uaG9zdCAmJlxuICAgICAgdXJsLnByb3RvY29sID09PSBjdXJyZW50TG9jYXRpb24ucHJvdG9jb2xcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgdXJsLnBhdGhuYW1lID09PSBjdXJyZW50TG9jYXRpb24ucGF0aG5hbWUgJiZcbiAgICAgICAgdXJsLnNlYXJjaCA9PT0gY3VycmVudExvY2F0aW9uLnNlYXJjaFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB1cmwuaGFzaCA9PT0gXCJcIiAmJiAhdXJsLmhyZWYuZW5kc1dpdGgoXCIjXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsLnByb3RvY29sLnN0YXJ0c1dpdGgoXCJodHRwXCIpO1xuICB9LFxuXG4gIG1hcmtQaHhDaGlsZERlc3Ryb3llZChlbCkge1xuICAgIGlmICh0aGlzLmlzUGh4Q2hpbGQoZWwpKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiZGVzdHJveWVkXCIsIHRydWUpO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgcGFyZW50SWQpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0aGlzLmZpbmRQaHhDaGlsZHJlbih0ZW1wbGF0ZS5jb250ZW50LCBwYXJlbnRJZCk7XG4gIH0sXG5cbiAgaXNJZ25vcmVkKGVsLCBwaHhVcGRhdGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpIHx8IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXVwZGF0ZVwiKSkgPT09XG4gICAgICBcImlnbm9yZVwiXG4gICAgKTtcbiAgfSxcblxuICBpc1BoeFVwZGF0ZShlbCwgcGh4VXBkYXRlLCB1cGRhdGVUeXBlcykge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUgJiYgdXBkYXRlVHlwZXMuaW5kZXhPZihlbC5nZXRBdHRyaWJ1dGUocGh4VXBkYXRlKSkgPj0gMFxuICAgICk7XG4gIH0sXG5cbiAgZmluZFBoeFN0aWNreShlbCkge1xuICAgIHJldHVybiB0aGlzLmFsbChlbCwgYFske1BIWF9TVElDS1l9XWApO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbihlbCwgcGFyZW50SWQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoZWwsIGAke1BIWF9WSUVXX1NFTEVDVE9SfVske1BIWF9QQVJFTlRfSUR9PVwiJHtwYXJlbnRJZH1cIl1gKTtcbiAgfSxcblxuICBmaW5kRXhpc3RpbmdQYXJlbnRDSURzKHZpZXdJZCwgY2lkcykge1xuICAgIC8vIHdlIG9ubHkgd2FudCB0byBmaW5kIHBhcmVudHMgdGhhdCBleGlzdCBvbiB0aGUgcGFnZVxuICAgIC8vIGlmIGEgY2lkIGlzIG5vdCBvbiB0aGUgcGFnZSwgdGhlIG9ubHkgd2F5IGl0IGNhbiBiZSBhZGRlZCBiYWNrIHRvIHRoZSBwYWdlXG4gICAgLy8gaXMgaWYgYSBwYXJlbnQgYWRkcyBpdCBiYWNrLCB0aGVyZWZvcmUgaWYgYSBjaWQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHBhZ2UsXG4gICAgLy8gd2Ugc2hvdWxkIG5vdCB0cnkgdG8gcmVuZGVyIGl0IGJ5IGl0c2VsZiAoYmVjYXVzZSBpdCB3b3VsZCBiZSByZW5kZXJlZCB0d2ljZSxcbiAgICAvLyBvbmUgYnkgdGhlIHBhcmVudCwgYW5kIGEgc2Vjb25kIHRpbWUgYnkgaXRzZWxmKVxuICAgIGNvbnN0IHBhcmVudENpZHMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgY2hpbGRyZW5DaWRzID0gbmV3IFNldCgpO1xuXG4gICAgY2lkcy5mb3JFYWNoKChjaWQpID0+IHtcbiAgICAgIHRoaXMuYWxsKFxuICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3ZpZXdJZH1cIl1bJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXWAsXG4gICAgICApLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgICBwYXJlbnRDaWRzLmFkZChjaWQpO1xuICAgICAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHtQSFhfVklFV19SRUZ9PVwiJHt2aWV3SWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYClcbiAgICAgICAgICAubWFwKChlbCkgPT4gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpKSlcbiAgICAgICAgICAuZm9yRWFjaCgoY2hpbGRDSUQpID0+IGNoaWxkcmVuQ2lkcy5hZGQoY2hpbGRDSUQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2hpbGRyZW5DaWRzLmZvckVhY2goKGNoaWxkQ2lkKSA9PiBwYXJlbnRDaWRzLmRlbGV0ZShjaGlsZENpZCkpO1xuXG4gICAgcmV0dXJuIHBhcmVudENpZHM7XG4gIH0sXG5cbiAgcHJpdmF0ZShlbCwga2V5KSB7XG4gICAgcmV0dXJuIGVsW1BIWF9QUklWQVRFXSAmJiBlbFtQSFhfUFJJVkFURV1ba2V5XTtcbiAgfSxcblxuICBkZWxldGVQcml2YXRlKGVsLCBrZXkpIHtcbiAgICBlbFtQSFhfUFJJVkFURV0gJiYgZGVsZXRlIGVsW1BIWF9QUklWQVRFXVtrZXldO1xuICB9LFxuXG4gIHB1dFByaXZhdGUoZWwsIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIWVsW1BIWF9QUklWQVRFXSkge1xuICAgICAgZWxbUEhYX1BSSVZBVEVdID0ge307XG4gICAgfVxuICAgIGVsW1BIWF9QUklWQVRFXVtrZXldID0gdmFsdWU7XG4gIH0sXG5cbiAgdXBkYXRlUHJpdmF0ZShlbCwga2V5LCBkZWZhdWx0VmFsLCB1cGRhdGVGdW5jKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCB1cGRhdGVGdW5jKGRlZmF1bHRWYWwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIHVwZGF0ZUZ1bmMoZXhpc3RpbmcpKTtcbiAgICB9XG4gIH0sXG5cbiAgc3luY1BlbmRpbmdBdHRycyhmcm9tRWwsIHRvRWwpIHtcbiAgICBpZiAoIWZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKGNsYXNzTmFtZSkgPT4ge1xuICAgICAgZnJvbUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpICYmIHRvRWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0pO1xuICAgIFBIWF9QRU5ESU5HX0FUVFJTLmZpbHRlcigoYXR0cikgPT4gZnJvbUVsLmhhc0F0dHJpYnV0ZShhdHRyKSkuZm9yRWFjaChcbiAgICAgIChhdHRyKSA9PiB7XG4gICAgICAgIHRvRWwuc2V0QXR0cmlidXRlKGF0dHIsIGZyb21FbC5nZXRBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgfSxcbiAgICApO1xuICB9LFxuXG4gIGNvcHlQcml2YXRlcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmIChzb3VyY2VbUEhYX1BSSVZBVEVdKSB7XG4gICAgICB0YXJnZXRbUEhYX1BSSVZBVEVdID0gc291cmNlW1BIWF9QUklWQVRFXTtcbiAgICB9XG4gIH0sXG5cbiAgcHV0VGl0bGUoc3RyKSB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICBpZiAodGl0bGVFbCkge1xuICAgICAgY29uc3QgeyBwcmVmaXgsIHN1ZmZpeCwgZGVmYXVsdDogZGVmYXVsdFRpdGxlIH0gPSB0aXRsZUVsLmRhdGFzZXQ7XG4gICAgICBjb25zdCBpc0VtcHR5ID0gdHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIiB8fCBzdHIudHJpbSgpID09PSBcIlwiO1xuICAgICAgaWYgKGlzRW1wdHkgJiYgdHlwZW9mIGRlZmF1bHRUaXRsZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlubmVyID0gaXNFbXB0eSA/IGRlZmF1bHRUaXRsZSA6IHN0cjtcbiAgICAgIGRvY3VtZW50LnRpdGxlID0gYCR7cHJlZml4IHx8IFwiXCJ9JHtpbm5lciB8fCBcIlwifSR7c3VmZml4IHx8IFwiXCJ9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQudGl0bGUgPSBzdHI7XG4gICAgfVxuICB9LFxuXG4gIGRlYm91bmNlKFxuICAgIGVsLFxuICAgIGV2ZW50LFxuICAgIHBoeERlYm91bmNlLFxuICAgIGRlZmF1bHREZWJvdW5jZSxcbiAgICBwaHhUaHJvdHRsZSxcbiAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgYXN5bmNGaWx0ZXIsXG4gICAgY2FsbGJhY2ssXG4gICkge1xuICAgIGxldCBkZWJvdW5jZSA9IGVsLmdldEF0dHJpYnV0ZShwaHhEZWJvdW5jZSk7XG4gICAgbGV0IHRocm90dGxlID0gZWwuZ2V0QXR0cmlidXRlKHBoeFRocm90dGxlKTtcblxuICAgIGlmIChkZWJvdW5jZSA9PT0gXCJcIikge1xuICAgICAgZGVib3VuY2UgPSBkZWZhdWx0RGVib3VuY2U7XG4gICAgfVxuICAgIGlmICh0aHJvdHRsZSA9PT0gXCJcIikge1xuICAgICAgdGhyb3R0bGUgPSBkZWZhdWx0VGhyb3R0bGU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gZGVib3VuY2UgfHwgdGhyb3R0bGU7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSBudWxsOlxuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcblxuICAgICAgY2FzZSBcImJsdXJcIjpcbiAgICAgICAgdGhpcy5pbmNDeWNsZShlbCwgXCJkZWJvdW5jZS1ibHVyLWN5Y2xlXCIsICgpID0+IHtcbiAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImRlYm91bmNlLWJsdXJcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PlxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIFwiZGVib3VuY2UtYmx1ci1jeWNsZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9ICgpID0+XG4gICAgICAgICAgdGhyb3R0bGUgPyB0aGlzLmRlbGV0ZVByaXZhdGUoZWwsIFRIUk9UVExFRCkgOiBjYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBjdXJyZW50Q3ljbGUgPSB0aGlzLmluY0N5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSLCB0cmlnZ2VyKTtcbiAgICAgICAgaWYgKGlzTmFOKHRpbWVvdXQpKSB7XG4gICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKGBpbnZhbGlkIHRocm90dGxlL2RlYm91bmNlIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aHJvdHRsZSkge1xuICAgICAgICAgIGxldCBuZXdLZXlEb3duID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwia2V5ZG93blwiKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2S2V5ID0gdGhpcy5wcml2YXRlKGVsLCBERUJPVU5DRV9QUkVWX0tFWSk7XG4gICAgICAgICAgICB0aGlzLnB1dFByaXZhdGUoZWwsIERFQk9VTkNFX1BSRVZfS0VZLCBldmVudC5rZXkpO1xuICAgICAgICAgICAgbmV3S2V5RG93biA9IHByZXZLZXkgIT09IGV2ZW50LmtleTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW5ld0tleURvd24gJiYgdGhpcy5wcml2YXRlKGVsLCBUSFJPVFRMRUQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChhc3luY0ZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgVEhST1RUTEVELCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiwgY3VycmVudEN5Y2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm0gPSBlbC5mb3JtO1xuICAgICAgICBpZiAoZm9ybSAmJiB0aGlzLm9uY2UoZm9ybSwgXCJiaW5kLWRlYm91bmNlXCIpKSB7XG4gICAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsICgpID0+IHtcbiAgICAgICAgICAgIEFycmF5LmZyb20obmV3IEZvcm1EYXRhKGZvcm0pLmVudHJpZXMoKSwgKFtuYW1lXSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCIke25hbWV9XCJdYCk7XG4gICAgICAgICAgICAgIHRoaXMuaW5jQ3ljbGUoaW5wdXQsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVByaXZhdGUoaW5wdXQsIFRIUk9UVExFRCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImJpbmQtZGVib3VuY2VcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBiZWNhdXNlIHdlIHRyaWdnZXIgdGhlIGNhbGxiYWNrIGhlcmUsXG4gICAgICAgICAgICAvLyB3ZSBhbHNvIGNsZWFyIHRoZSB0aHJvdHRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICAvLyBmcm9tIGJlaW5nIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgdGltZW91dCBmaXJlc1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucHJpdmF0ZShlbCwgVEhST1RUTEVEKSk7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlckN5Y2xlKGVsLCBrZXksIGN1cnJlbnRDeWNsZSkge1xuICAgIGNvbnN0IFtjeWNsZSwgdHJpZ2dlcl0gPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKCFjdXJyZW50Q3ljbGUpIHtcbiAgICAgIGN1cnJlbnRDeWNsZSA9IGN5Y2xlO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEN5Y2xlID09PSBjeWNsZSkge1xuICAgICAgdGhpcy5pbmNDeWNsZShlbCwga2V5KTtcbiAgICAgIHRyaWdnZXIoKTtcbiAgICB9XG4gIH0sXG5cbiAgb25jZShlbCwga2V5KSB7XG4gICAgaWYgKHRoaXMucHJpdmF0ZShlbCwga2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgaW5jQ3ljbGUoZWwsIGtleSwgdHJpZ2dlciA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgbGV0IFtjdXJyZW50Q3ljbGVdID0gdGhpcy5wcml2YXRlKGVsLCBrZXkpIHx8IFswLCB0cmlnZ2VyXTtcbiAgICBjdXJyZW50Q3ljbGUrKztcbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgW2N1cnJlbnRDeWNsZSwgdHJpZ2dlcl0pO1xuICAgIHJldHVybiBjdXJyZW50Q3ljbGU7XG4gIH0sXG5cbiAgLy8gbWFpbnRhaW5zIG9yIGFkZHMgcHJpdmF0ZWx5IHVzZWQgaG9vayBpbmZvcm1hdGlvblxuICAvLyBmcm9tRWwgYW5kIHRvRWwgY2FuIGJlIHRoZSBzYW1lIGVsZW1lbnQgaW4gdGhlIGNhc2Ugb2YgYSBuZXdseSBhZGRlZCBub2RlXG4gIC8vIGZyb21FbCBhbmQgdG9FbCBjYW4gYmUgYW55IEhUTUwgbm9kZSB0eXBlLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgYW4gZWxlbWVudCBub2RlXG4gIG1haW50YWluUHJpdmF0ZUhvb2tzKGZyb21FbCwgdG9FbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKSB7XG4gICAgLy8gbWFpbnRhaW4gdGhlIGhvb2tzIGNyZWF0ZWQgd2l0aCBjcmVhdGVIb29rXG4gICAgaWYgKFxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIikgJiZcbiAgICAgICF0b0VsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIilcbiAgICApIHtcbiAgICAgIHRvRWwuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiLCBmcm9tRWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiKSk7XG4gICAgfVxuICAgIC8vIGFkZCBob29rcyB0byBlbGVtZW50cyB3aXRoIHZpZXdwb3J0IGF0dHJpYnV0ZXNcbiAgICBpZiAoXG4gICAgICB0b0VsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgKHRvRWwuaGFzQXR0cmlidXRlKHBoeFZpZXdwb3J0VG9wKSB8fFxuICAgICAgICB0b0VsLmhhc0F0dHJpYnV0ZShwaHhWaWV3cG9ydEJvdHRvbSkpXG4gICAgKSB7XG4gICAgICB0b0VsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJQaG9lbml4LkluZmluaXRlU2Nyb2xsXCIpO1xuICAgIH1cbiAgfSxcblxuICBwdXRDdXN0b21FbEhvb2soZWwsIGhvb2spIHtcbiAgICBpZiAoZWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxuICAgICAgICBob29rIGF0dGFjaGVkIHRvIG5vbi1jb25uZWN0ZWQgRE9NIGVsZW1lbnRcbiAgICAgICAgZW5zdXJlIHlvdSBhcmUgY2FsbGluZyBjcmVhdGVIb29rIHdpdGhpbiB5b3VyIGNvbm5lY3RlZENhbGxiYWNrLiAke2VsLm91dGVySFRNTH1cbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiY3VzdG9tLWVsLWhvb2tcIiwgaG9vayk7XG4gIH0sXG5cbiAgZ2V0Q3VzdG9tRWxIb29rKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMucHJpdmF0ZShlbCwgXCJjdXN0b20tZWwtaG9va1wiKTtcbiAgfSxcblxuICBpc1VzZWRJbnB1dChlbCkge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICh0aGlzLnByaXZhdGUoZWwsIFBIWF9IQVNfRk9DVVNFRCkgfHwgdGhpcy5wcml2YXRlKGVsLCBQSFhfSEFTX1NVQk1JVFRFRCkpXG4gICAgKTtcbiAgfSxcblxuICByZXNldEZvcm0oZm9ybSkge1xuICAgIEFycmF5LmZyb20oZm9ybS5lbGVtZW50cykuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19GT0NVU0VEKTtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19TVUJNSVRURUQpO1xuICAgIH0pO1xuICB9LFxuXG4gIGlzUGh4Q2hpbGQobm9kZSkge1xuICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKTtcbiAgfSxcblxuICBpc1BoeFN0aWNreShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9TVElDS1kpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQ2hpbGRPZkFueShlbCwgcGFyZW50cykge1xuICAgIHJldHVybiAhIXBhcmVudHMuZmluZCgocGFyZW50KSA9PiBwYXJlbnQuY29udGFpbnMoZWwpKTtcbiAgfSxcblxuICBmaXJzdFBoeENoaWxkKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQaHhDaGlsZChlbCkgPyBlbCA6IHRoaXMuYWxsKGVsLCBgWyR7UEhYX1BBUkVOVF9JRH1dYClbMF07XG4gIH0sXG5cbiAgaXNQb3J0YWxUZW1wbGF0ZShlbCkge1xuICAgIHJldHVybiBlbC50YWdOYW1lID09PSBcIlRFTVBMQVRFXCIgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICB9LFxuXG4gIGNsb3Nlc3RWaWV3RWwoZWwpIHtcbiAgICAvLyBmaW5kIHRoZSBjbG9zZXN0IHBvcnRhbCBvciB2aWV3IGVsZW1lbnQsIHdoaWNoZXZlciBjb21lcyBmaXJzdFxuICAgIGNvbnN0IHBvcnRhbE9yVmlld0VsID0gZWwuY2xvc2VzdChcbiAgICAgIGBbJHtQSFhfVEVMRVBPUlRFRF9SRUZ9XSwke1BIWF9WSUVXX1NFTEVDVE9SfWAsXG4gICAgKTtcbiAgICBpZiAoIXBvcnRhbE9yVmlld0VsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAvLyBQSFhfVEVMRVBPUlRFRF9SRUYgaXMgc2V0IHRvIHRoZSBpZCBvZiB0aGUgdmlldyB0aGF0IG93bnMgdGhlIHBvcnRhbCBlbGVtZW50XG4gICAgICByZXR1cm4gdGhpcy5ieUlkKHBvcnRhbE9yVmlld0VsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKTtcbiAgICB9IGVsc2UgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfU0VTU0lPTikpIHtcbiAgICAgIHJldHVybiBwb3J0YWxPclZpZXdFbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgZGlzcGF0Y2hFdmVudCh0YXJnZXQsIG5hbWUsIG9wdHMgPSB7fSkge1xuICAgIGxldCBkZWZhdWx0QnViYmxlID0gdHJ1ZTtcbiAgICBjb25zdCBpc1VwbG9hZFRhcmdldCA9XG4gICAgICB0YXJnZXQubm9kZU5hbWUgPT09IFwiSU5QVVRcIiAmJiB0YXJnZXQudHlwZSA9PT0gXCJmaWxlXCI7XG4gICAgaWYgKGlzVXBsb2FkVGFyZ2V0ICYmIG5hbWUgPT09IFwiY2xpY2tcIikge1xuICAgICAgZGVmYXVsdEJ1YmJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBidWJibGVzID0gb3B0cy5idWJibGVzID09PSB1bmRlZmluZWQgPyBkZWZhdWx0QnViYmxlIDogISFvcHRzLmJ1YmJsZXM7XG4gICAgY29uc3QgZXZlbnRPcHRzID0ge1xuICAgICAgYnViYmxlczogYnViYmxlcyxcbiAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICBkZXRhaWw6IG9wdHMuZGV0YWlsIHx8IHt9LFxuICAgIH07XG4gICAgY29uc3QgZXZlbnQgPVxuICAgICAgbmFtZSA9PT0gXCJjbGlja1wiXG4gICAgICAgID8gbmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLCBldmVudE9wdHMpXG4gICAgICAgIDogbmV3IEN1c3RvbUV2ZW50KG5hbWUsIGV2ZW50T3B0cyk7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9LFxuXG4gIGNsb25lTm9kZShub2RlLCBodG1sKSB7XG4gICAgaWYgKHR5cGVvZiBodG1sID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsb25lZCA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgIGNsb25lZC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICB9XG4gIH0sXG5cbiAgLy8gbWVyZ2UgYXR0cmlidXRlcyBmcm9tIHNvdXJjZSB0byB0YXJnZXRcbiAgLy8gaWYgYW4gZWxlbWVudCBpcyBpZ25vcmVkLCB3ZSBvbmx5IG1lcmdlIGRhdGEgYXR0cmlidXRlc1xuICAvLyBpbmNsdWRpbmcgcmVtb3ZpbmcgZGF0YSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgc291cmNlXG4gIG1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGV4Y2x1ZGUgPSBuZXcgU2V0KG9wdHMuZXhjbHVkZSB8fCBbXSk7XG4gICAgY29uc3QgaXNJZ25vcmVkID0gb3B0cy5pc0lnbm9yZWQ7XG4gICAgY29uc3Qgc291cmNlQXR0cnMgPSBzb3VyY2UuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gc291cmNlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzb3VyY2VBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKCFleGNsdWRlLmhhcyhuYW1lKSkge1xuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0YXJnZXQuZ2V0QXR0cmlidXRlKG5hbWUpICE9PSBzb3VyY2VWYWx1ZSAmJlxuICAgICAgICAgICghaXNJZ25vcmVkIHx8IChpc0lnbm9yZWQgJiYgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHNvdXJjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UgZXhjbHVkZSB0aGUgdmFsdWUgZnJvbSBiZWluZyBtZXJnZWQgb24gZm9jdXNlZCBpbnB1dHMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIHVzZXIncyBpbnB1dCBzaG91bGQgYWx3YXlzIHdpbi5cbiAgICAgICAgLy8gV2UgY2FuIHN0aWxsIGFzc2lnbiBpdCBhcyBsb25nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyB0aGUgc2FtZSwgdGhvdWdoLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSB1cGRhdGVkIGhvb2sgaXMgbm90IGJlaW5nIHRyaWdnZXJlZFxuICAgICAgICAvLyB3aGVuIGFuIGlucHV0IGlzIGJhY2sgaW4gaXRzIFwib3JpZ2luYWwgc3RhdGVcIiwgYmVjYXVzZSB0aGUgYXR0cmlidXRlXG4gICAgICAgIC8vIHdhcyBuZXZlciBjaGFuZ2VkLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8yMTYzXG4gICAgICAgIGlmIChuYW1lID09PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS52YWx1ZSA/PyBzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgIGlmICh0YXJnZXQudmFsdWUgPT09IHNvdXJjZVZhbHVlKSB7XG4gICAgICAgICAgICAvLyBhY3R1YWxseSBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byBzeW5jIGl0IHdpdGggdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0QXR0cnMgPSB0YXJnZXQuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gdGFyZ2V0QXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXRBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKGlzSWdub3JlZCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikgJiZcbiAgICAgICAgICAhc291cmNlLmhhc0F0dHJpYnV0ZShuYW1lKSAmJlxuICAgICAgICAgICFQSFhfUEVORElOR19BVFRSUy5pbmNsdWRlcyhuYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXNvdXJjZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1lcmdlRm9jdXNlZElucHV0KHRhcmdldCwgc291cmNlKSB7XG4gICAgLy8gc2tpcCBzZWxlY3RzIGJlY2F1c2UgRkYgd2lsbCByZXNldCBoaWdobGlnaHRlZCBpbmRleCBmb3IgYW55IHNldEF0dHJpYnV0ZVxuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSkge1xuICAgICAgRE9NLm1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIHsgZXhjbHVkZTogW1widmFsdWVcIl0gfSk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZS5yZWFkT25seSkge1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwicmVhZG9ubHlcIik7XG4gICAgfVxuICB9LFxuXG4gIGhhc1NlbGVjdGlvblJhbmdlKGVsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlICYmIChlbC50eXBlID09PSBcInRleHRcIiB8fCBlbC50eXBlID09PSBcInRleHRhcmVhXCIpXG4gICAgKTtcbiAgfSxcblxuICByZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCkge1xuICAgIGlmIChmb2N1c2VkIGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpIHtcbiAgICAgIGZvY3VzZWQuZm9jdXMoKTtcbiAgICB9XG4gICAgaWYgKCFET00uaXNUZXh0dWFsSW5wdXQoZm9jdXNlZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YXNGb2N1c2VkID0gZm9jdXNlZC5tYXRjaGVzKFwiOmZvY3VzXCIpO1xuICAgIGlmICghd2FzRm9jdXNlZCkge1xuICAgICAgZm9jdXNlZC5mb2N1cygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSkge1xuICAgICAgZm9jdXNlZC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNGb3JtSW5wdXQoZWwpIHtcbiAgICBpZiAoZWwubG9jYWxOYW1lICYmIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpKSB7XG4gICAgICAvLyBDdXN0b20gRWxlbWVudHMgbWF5IGJlIGZvcm0gYXNzb2NpYXRlZC4gVGhpcyBhbGxvd3MgdGhlbVxuICAgICAgLy8gdG8gcGFydGljaXBhdGUgd2l0aGluIGEgZm9ybSdzIGxpZmVjeWNsZSwgaW5jbHVkaW5nIGZvcm1cbiAgICAgIC8vIHZhbGlkaXR5IGFuZCBmb3JtIHN1Ym1pc3Npb25zLlxuICAgICAgLy8gVGhlIHNwZWMgZm9yIEZvcm0gQXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHMgcmVxdWlyZXMgdGhlXG4gICAgICAvLyBjdXN0b20gZWxlbWVudCdzIGNsYXNzIHRvIGNvbnRhaW4gYSBzdGF0aWMgYm9vbGVhbiB2YWx1ZSBvZiBgZm9ybUFzc29jaWF0ZWRgXG4gICAgICAvLyB3aGljaCBpZGVudGlmaWVzIHRoaXMgY2xhc3MgYXMgYWxsb3dlZCB0byBhc3NvY2lhdGUgdG8gYSBmb3JtLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvZGV2L2N1c3RvbS1lbGVtZW50cy5odG1sI2N1c3RvbS1lbGVtZW50cy1mYWNlLWV4YW1wbGVcbiAgICAgIC8vIGZvciBkZXRhaWxzLlxuICAgICAgcmV0dXJuIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpW2Bmb3JtQXNzb2NpYXRlZGBdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlbC50YWdOYW1lKSAmJiBlbC50eXBlICE9PSBcImJ1dHRvblwiXG4gICAgKTtcbiAgfSxcblxuICBzeW5jQXR0cnNUb1Byb3BzKGVsKSB7XG4gICAgaWYgKFxuICAgICAgZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBDSEVDS0FCTEVfSU5QVVRTLmluZGV4T2YoZWwudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSA+PSAwXG4gICAgKSB7XG4gICAgICBlbC5jaGVja2VkID0gZWwuZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSAhPT0gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgaXNUZXh0dWFsSW5wdXQoZWwpIHtcbiAgICByZXR1cm4gRk9DVVNBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUpID49IDA7XG4gIH0sXG5cbiAgaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWwuZ2V0QXR0cmlidXRlICYmXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUocGh4VHJpZ2dlckV4dGVybmFsKSAhPT0gbnVsbCAmJlxuICAgICAgZG9jdW1lbnQuYm9keS5jb250YWlucyhlbClcbiAgICApO1xuICB9LFxuXG4gIGNsZWFuQ2hpbGROb2Rlcyhjb250YWluZXIsIHBoeFVwZGF0ZSkge1xuICAgIGlmIChcbiAgICAgIERPTS5pc1BoeFVwZGF0ZShjb250YWluZXIsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiLCBQSFhfU1RSRUFNXSlcbiAgICApIHtcbiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XG4gICAgICBjb250YWluZXIuY2hpbGROb2Rlcy5mb3JFYWNoKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgaWYgKCFjaGlsZE5vZGUuaWQpIHtcbiAgICAgICAgICAvLyBTa2lwIHdhcm5pbmcgaWYgaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUgKGUuZy4gYSBuZXctbGluZSlcbiAgICAgICAgICBjb25zdCBpc0VtcHR5VGV4dE5vZGUgPVxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJlxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVWYWx1ZS50cmltKCkgPT09IFwiXCI7XG4gICAgICAgICAgaWYgKCFpc0VtcHR5VGV4dE5vZGUgJiYgY2hpbGROb2RlLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgICAgIFwib25seSBIVE1MIGVsZW1lbnQgdGFncyB3aXRoIGFuIGlkIGFyZSBhbGxvd2VkIGluc2lkZSBjb250YWluZXJzIHdpdGggcGh4LXVwZGF0ZS5cXG5cXG5cIiArXG4gICAgICAgICAgICAgICAgYHJlbW92aW5nIGlsbGVnYWwgbm9kZTogXCIkeyhjaGlsZE5vZGUub3V0ZXJIVE1MIHx8IGNoaWxkTm9kZS5ub2RlVmFsdWUpLnRyaW0oKX1cIlxcblxcbmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKGNoaWxkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdG9SZW1vdmUuZm9yRWFjaCgoY2hpbGROb2RlKSA9PiBjaGlsZE5vZGUucmVtb3ZlKCkpO1xuICAgIH1cbiAgfSxcblxuICByZXBsYWNlUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhZ05hbWUsIGF0dHJzKSB7XG4gICAgY29uc3QgcmV0YWluZWRBdHRycyA9IG5ldyBTZXQoW1xuICAgICAgXCJpZFwiLFxuICAgICAgUEhYX1NFU1NJT04sXG4gICAgICBQSFhfU1RBVElDLFxuICAgICAgUEhYX01BSU4sXG4gICAgICBQSFhfUk9PVF9JRCxcbiAgICBdKTtcbiAgICBpZiAoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBBcnJheS5mcm9tKGNvbnRhaW5lci5hdHRyaWJ1dGVzKVxuICAgICAgICAuZmlsdGVyKChhdHRyKSA9PiAhcmV0YWluZWRBdHRycy5oYXMoYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpKTtcblxuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpXG4gICAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICFyZXRhaW5lZEF0dHJzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSkpO1xuXG4gICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goKGF0dHIpID0+XG4gICAgICAgIG5ld0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pLFxuICAgICAgKTtcbiAgICAgIHJldGFpbmVkQXR0cnMuZm9yRWFjaCgoYXR0cikgPT5cbiAgICAgICAgbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBjb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHIpKSxcbiAgICAgICk7XG4gICAgICBuZXdDb250YWluZXIuaW5uZXJIVE1MID0gY29udGFpbmVyLmlubmVySFRNTDtcbiAgICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChuZXdDb250YWluZXIpO1xuICAgICAgcmV0dXJuIG5ld0NvbnRhaW5lcjtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0U3RpY2t5KGVsLCBuYW1lLCBkZWZhdWx0VmFsKSB7XG4gICAgY29uc3Qgb3AgPSAoRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpIHx8IFtdKS5maW5kKFxuICAgICAgKFtleGlzdGluZ05hbWVdKSA9PiBuYW1lID09PSBleGlzdGluZ05hbWUsXG4gICAgKTtcbiAgICBpZiAob3ApIHtcbiAgICAgIGNvbnN0IFtfbmFtZSwgX29wLCBzdGFzaGVkUmVzdWx0XSA9IG9wO1xuICAgICAgcmV0dXJuIHN0YXNoZWRSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbCA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbCgpIDogZGVmYXVsdFZhbDtcbiAgICB9XG4gIH0sXG5cbiAgZGVsZXRlU3RpY2t5KGVsLCBuYW1lKSB7XG4gICAgdGhpcy51cGRhdGVQcml2YXRlKGVsLCBcInN0aWNreVwiLCBbXSwgKG9wcykgPT4ge1xuICAgICAgcmV0dXJuIG9wcy5maWx0ZXIoKFtleGlzdGluZ05hbWUsIF9dKSA9PiBleGlzdGluZ05hbWUgIT09IG5hbWUpO1xuICAgIH0pO1xuICB9LFxuXG4gIHB1dFN0aWNreShlbCwgbmFtZSwgb3ApIHtcbiAgICBjb25zdCBzdGFzaGVkUmVzdWx0ID0gb3AoZWwpO1xuICAgIHRoaXMudXBkYXRlUHJpdmF0ZShlbCwgXCJzdGlja3lcIiwgW10sIChvcHMpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBvcHMuZmluZEluZGV4KFxuICAgICAgICAoW2V4aXN0aW5nTmFtZV0pID0+IG5hbWUgPT09IGV4aXN0aW5nTmFtZSxcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKSB7XG4gICAgICAgIG9wc1tleGlzdGluZ0luZGV4XSA9IFtuYW1lLCBvcCwgc3Rhc2hlZFJlc3VsdF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHMucHVzaChbbmFtZSwgb3AsIHN0YXNoZWRSZXN1bHRdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHM7XG4gICAgfSk7XG4gIH0sXG5cbiAgYXBwbHlTdGlja3lPcGVyYXRpb25zKGVsKSB7XG4gICAgY29uc3Qgb3BzID0gRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpO1xuICAgIGlmICghb3BzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3BzLmZvckVhY2goKFtuYW1lLCBvcCwgX3N0YXNoZWRdKSA9PiB0aGlzLnB1dFN0aWNreShlbCwgbmFtZSwgb3ApKTtcbiAgfSxcblxuICBpc0xvY2tlZChlbCkge1xuICAgIHJldHVybiBlbC5oYXNBdHRyaWJ1dGUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBET007XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IHsgY2hhbm5lbFVwbG9hZGVyLCBsb2dFcnJvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRFbnRyeSB7XG4gIHN0YXRpYyBpc0FjdGl2ZShmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBpc05ldyA9IGZpbGUuX3BoeFJlZiA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdGl2ZVJlZnMgPSBmaWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUykuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlUmVmcy5pbmRleE9mKExpdmVVcGxvYWRlci5nZW5GaWxlUmVmKGZpbGUpKSA+PSAwO1xuICAgIHJldHVybiBmaWxlLnNpemUgPiAwICYmIChpc05ldyB8fCBpc0FjdGl2ZSk7XG4gIH1cblxuICBzdGF0aWMgaXNQcmVmbGlnaHRlZChmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBwcmVmbGlnaHRlZFJlZnMgPSBmaWxlRWxcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1BSRUZMSUdIVEVEX1JFRlMpXG4gICAgICAuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzUHJlZmxpZ2h0ZWQgPVxuICAgICAgcHJlZmxpZ2h0ZWRSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDA7XG4gICAgcmV0dXJuIGlzUHJlZmxpZ2h0ZWQgJiYgdGhpcy5pc0FjdGl2ZShmaWxlRWwsIGZpbGUpO1xuICB9XG5cbiAgc3RhdGljIGlzUHJlZmxpZ2h0SW5Qcm9ncmVzcyhmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPT09IHRydWU7XG4gIH1cblxuICBzdGF0aWMgbWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZmlsZSkge1xuICAgIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZmlsZUVsLCBmaWxlLCB2aWV3LCBhdXRvVXBsb2FkKSB7XG4gICAgdGhpcy5yZWYgPSBMaXZlVXBsb2FkZXIuZ2VuRmlsZVJlZihmaWxlKTtcbiAgICB0aGlzLmZpbGVFbCA9IGZpbGVFbDtcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgdGhpcy5tZXRhID0gbnVsbDtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Byb2dyZXNzID0gMDtcbiAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gLTE7XG4gICAgdGhpcy5fb25Eb25lID0gZnVuY3Rpb24gKCkge307XG4gICAgdGhpcy5fb25FbFVwZGF0ZWQgPSB0aGlzLm9uRWxVcGRhdGVkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5maWxlRWwuYWRkRXZlbnRMaXN0ZW5lcihQSFhfTElWRV9GSUxFX1VQREFURUQsIHRoaXMuX29uRWxVcGRhdGVkKTtcbiAgICB0aGlzLmF1dG9VcGxvYWQgPSBhdXRvVXBsb2FkO1xuICB9XG5cbiAgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YTtcbiAgfVxuXG4gIHByb2dyZXNzKHByb2dyZXNzKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSBNYXRoLmZsb29yKHByb2dyZXNzKTtcbiAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPiB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50KSB7XG4gICAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPj0gMTAwKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzID0gMTAwO1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gMTAwO1xuICAgICAgICB0aGlzLl9pc0RvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcucHVzaEZpbGVQcm9ncmVzcyh0aGlzLmZpbGVFbCwgdGhpcy5yZWYsIDEwMCwgKCkgPT4ge1xuICAgICAgICAgIExpdmVVcGxvYWRlci51bnRyYWNrRmlsZSh0aGlzLmZpbGVFbCwgdGhpcy5maWxlKTtcbiAgICAgICAgICB0aGlzLl9vbkRvbmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMudmlldy5wdXNoRmlsZVByb2dyZXNzKHRoaXMuZmlsZUVsLCB0aGlzLnJlZiwgdGhpcy5fcHJvZ3Jlc3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzQ2FuY2VsbGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgdGhpcy5faXNEb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9vbkRvbmUoKTtcbiAgfVxuXG4gIGlzRG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEb25lO1xuICB9XG5cbiAgZXJyb3IocmVhc29uID0gXCJmYWlsZWRcIikge1xuICAgIHRoaXMuZmlsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoUEhYX0xJVkVfRklMRV9VUERBVEVELCB0aGlzLl9vbkVsVXBkYXRlZCk7XG4gICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB7IGVycm9yOiByZWFzb24gfSk7XG4gICAgaWYgKCF0aGlzLmlzQXV0b1VwbG9hZCgpKSB7XG4gICAgICBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyh0aGlzLmZpbGVFbCk7XG4gICAgfVxuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICAvL3ByaXZhdGVcblxuICBvbkRvbmUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkRvbmUgPSAoKSA9PiB7XG4gICAgICB0aGlzLmZpbGVFbC5yZW1vdmVFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG5cbiAgb25FbFVwZGF0ZWQoKSB7XG4gICAgY29uc3QgYWN0aXZlUmVmcyA9IHRoaXMuZmlsZUVsXG4gICAgICAuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUylcbiAgICAgIC5zcGxpdChcIixcIik7XG4gICAgaWYgKGFjdGl2ZVJlZnMuaW5kZXhPZih0aGlzLnJlZikgPT09IC0xKSB7XG4gICAgICBMaXZlVXBsb2FkZXIudW50cmFja0ZpbGUodGhpcy5maWxlRWwsIHRoaXMuZmlsZSk7XG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHRvUHJlZmxpZ2h0UGF5bG9hZCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9tb2RpZmllZDogdGhpcy5maWxlLmxhc3RNb2RpZmllZCxcbiAgICAgIG5hbWU6IHRoaXMuZmlsZS5uYW1lLFxuICAgICAgcmVsYXRpdmVfcGF0aDogdGhpcy5maWxlLndlYmtpdFJlbGF0aXZlUGF0aCxcbiAgICAgIHNpemU6IHRoaXMuZmlsZS5zaXplLFxuICAgICAgdHlwZTogdGhpcy5maWxlLnR5cGUsXG4gICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgbWV0YTogdHlwZW9mIHRoaXMuZmlsZS5tZXRhID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmZpbGUubWV0YSgpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICB1cGxvYWRlcih1cGxvYWRlcnMpIHtcbiAgICBpZiAodGhpcy5tZXRhLnVwbG9hZGVyKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9XG4gICAgICAgIHVwbG9hZGVyc1t0aGlzLm1ldGEudXBsb2FkZXJdIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciAke3RoaXMubWV0YS51cGxvYWRlcn1gKTtcbiAgICAgIHJldHVybiB7IG5hbWU6IHRoaXMubWV0YS51cGxvYWRlciwgY2FsbGJhY2s6IGNhbGxiYWNrIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiY2hhbm5lbFwiLCBjYWxsYmFjazogY2hhbm5lbFVwbG9hZGVyIH07XG4gICAgfVxuICB9XG5cbiAgemlwUG9zdEZsaWdodChyZXNwKSB7XG4gICAgdGhpcy5tZXRhID0gcmVzcC5lbnRyaWVzW3RoaXMucmVmXTtcbiAgICBpZiAoIXRoaXMubWV0YSkge1xuICAgICAgbG9nRXJyb3IoYG5vIHByZWZsaWdodCB1cGxvYWQgcmVzcG9uc2UgcmV0dXJuZWQgd2l0aCByZWYgJHt0aGlzLnJlZn1gLCB7XG4gICAgICAgIGlucHV0OiB0aGlzLmZpbGVFbCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3AsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBQSFhfRE9ORV9SRUZTLFxuICBQSFhfUFJFRkxJR0hURURfUkVGUyxcbiAgUEhYX1VQTE9BRF9SRUYsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQge30gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBVcGxvYWRFbnRyeSBmcm9tIFwiLi91cGxvYWRfZW50cnlcIjtcblxubGV0IGxpdmVVcGxvYWRlckZpbGVSZWYgPSAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXZlVXBsb2FkZXIge1xuICBzdGF0aWMgZ2VuRmlsZVJlZihmaWxlKSB7XG4gICAgY29uc3QgcmVmID0gZmlsZS5fcGh4UmVmO1xuICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZS5fcGh4UmVmID0gKGxpdmVVcGxvYWRlckZpbGVSZWYrKykudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiBmaWxlLl9waHhSZWY7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEVudHJ5RGF0YVVSTChpbnB1dEVsLCByZWYsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuYWN0aXZlRmlsZXMoaW5wdXRFbCkuZmluZChcbiAgICAgIChmaWxlKSA9PiB0aGlzLmdlbkZpbGVSZWYoZmlsZSkgPT09IHJlZixcbiAgICApO1xuICAgIGNhbGxiYWNrKFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSkpO1xuICB9XG5cbiAgc3RhdGljIGhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkge1xuICAgIGxldCBhY3RpdmUgPSAwO1xuICAgIERPTS5maW5kVXBsb2FkSW5wdXRzKGZvcm1FbCkuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSAhPT1cbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9ET05FX1JFRlMpXG4gICAgICApIHtcbiAgICAgICAgYWN0aXZlKys7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGl2ZSA+IDA7XG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpO1xuICAgIGNvbnN0IGZpbGVEYXRhID0ge307XG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSB7IHBhdGg6IGlucHV0RWwubmFtZSB9O1xuICAgICAgY29uc3QgdXBsb2FkUmVmID0gaW5wdXRFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpO1xuICAgICAgZmlsZURhdGFbdXBsb2FkUmVmXSA9IGZpbGVEYXRhW3VwbG9hZFJlZl0gfHwgW107XG4gICAgICBlbnRyeS5yZWYgPSB0aGlzLmdlbkZpbGVSZWYoZmlsZSk7XG4gICAgICBlbnRyeS5sYXN0X21vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQ7XG4gICAgICBlbnRyeS5uYW1lID0gZmlsZS5uYW1lIHx8IGVudHJ5LnJlZjtcbiAgICAgIGVudHJ5LnJlbGF0aXZlX3BhdGggPSBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aDtcbiAgICAgIGVudHJ5LnR5cGUgPSBmaWxlLnR5cGU7XG4gICAgICBlbnRyeS5zaXplID0gZmlsZS5zaXplO1xuICAgICAgaWYgKHR5cGVvZiBmaWxlLm1ldGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBlbnRyeS5tZXRhID0gZmlsZS5tZXRhKCk7XG4gICAgICB9XG4gICAgICBmaWxlRGF0YVt1cGxvYWRSZWZdLnB1c2goZW50cnkpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWxlRGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBjbGVhckZpbGVzKGlucHV0RWwpIHtcbiAgICBpbnB1dEVsLnZhbHVlID0gbnVsbDtcbiAgICBpbnB1dEVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRik7XG4gICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSk7XG4gIH1cblxuICBzdGF0aWMgdW50cmFja0ZpbGUoaW5wdXRFbCwgZmlsZSkge1xuICAgIERPTS5wdXRQcml2YXRlKFxuICAgICAgaW5wdXRFbCxcbiAgICAgIFwiZmlsZXNcIixcbiAgICAgIERPTS5wcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIikuZmlsdGVyKChmKSA9PiAhT2JqZWN0LmlzKGYsIGZpbGUpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gaW5wdXRFbFxuICAgKiBAcGFyYW0ge0FycmF5PEZpbGV8QmxvYj59IGZpbGVzXG4gICAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBbZGF0YVRyYW5zZmVyXVxuICAgKi9cbiAgc3RhdGljIHRyYWNrRmlsZXMoaW5wdXRFbCwgZmlsZXMsIGRhdGFUcmFuc2Zlcikge1xuICAgIGlmIChpbnB1dEVsLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBuZXdGaWxlcyA9IGZpbGVzLmZpbHRlcihcbiAgICAgICAgKGZpbGUpID0+ICF0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoKGYpID0+IE9iamVjdC5pcyhmLCBmaWxlKSksXG4gICAgICApO1xuICAgICAgRE9NLnVwZGF0ZVByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSwgKGV4aXN0aW5nKSA9PlxuICAgICAgICBleGlzdGluZy5jb25jYXQobmV3RmlsZXMpLFxuICAgICAgKTtcbiAgICAgIGlucHV0RWwudmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBpbnB1dEVsIGZpbGVzIHRvIGFsaWduIG91dHB1dCB3aXRoIHByb2dyYW1tYXRpYyBjaGFuZ2VzIChpLmUuIGRyYWcgYW5kIGRyb3ApXG4gICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlucHV0RWwuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgICB9XG4gICAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIGZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZUlucHV0cyhmb3JtRWwpIHtcbiAgICBjb25zdCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlSW5wdXRzKS5maWx0ZXIoXG4gICAgICAoZWwpID0+IGVsLmZpbGVzICYmIHRoaXMuYWN0aXZlRmlsZXMoZWwpLmxlbmd0aCA+IDAsXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBhY3RpdmVGaWxlcyhpbnB1dCkge1xuICAgIHJldHVybiAoRE9NLnByaXZhdGUoaW5wdXQsIFwiZmlsZXNcIikgfHwgW10pLmZpbHRlcigoZikgPT5cbiAgICAgIFVwbG9hZEVudHJ5LmlzQWN0aXZlKGlucHV0LCBmKSxcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGlucHV0c0F3YWl0aW5nUHJlZmxpZ2h0KGZvcm1FbCkge1xuICAgIGNvbnN0IGZpbGVJbnB1dHMgPSBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihcbiAgICAgIChpbnB1dCkgPT4gdGhpcy5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0KS5sZW5ndGggPiAwLFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0KS5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgIVVwbG9hZEVudHJ5LmlzUHJlZmxpZ2h0ZWQoaW5wdXQsIGYpICYmXG4gICAgICAgICFVcGxvYWRFbnRyeS5pc1ByZWZsaWdodEluUHJvZ3Jlc3MoZiksXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBtYXJrUHJlZmxpZ2h0SW5Qcm9ncmVzcyhlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gVXBsb2FkRW50cnkubWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZW50cnkuZmlsZSkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoaW5wdXRFbCwgdmlldywgb25Db21wbGV0ZSkge1xuICAgIHRoaXMuYXV0b1VwbG9hZCA9IERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCk7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLm9uQ29tcGxldGUgPSBvbkNvbXBsZXRlO1xuICAgIHRoaXMuX2VudHJpZXMgPSBBcnJheS5mcm9tKFxuICAgICAgTGl2ZVVwbG9hZGVyLmZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXRFbCkgfHwgW10sXG4gICAgKS5tYXAoKGZpbGUpID0+IG5ldyBVcGxvYWRFbnRyeShpbnB1dEVsLCBmaWxlLCB2aWV3LCB0aGlzLmF1dG9VcGxvYWQpKTtcblxuICAgIC8vIHByZXZlbnQgc2VuZGluZyBkdXBsaWNhdGUgcHJlZmxpZ2h0IHJlcXVlc3RzXG4gICAgTGl2ZVVwbG9hZGVyLm1hcmtQcmVmbGlnaHRJblByb2dyZXNzKHRoaXMuX2VudHJpZXMpO1xuXG4gICAgdGhpcy5udW1FbnRyaWVzSW5Qcm9ncmVzcyA9IHRoaXMuX2VudHJpZXMubGVuZ3RoO1xuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICBlbnRyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzO1xuICB9XG5cbiAgaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgbGl2ZVNvY2tldCkge1xuICAgIHRoaXMuX2VudHJpZXMgPSB0aGlzLl9lbnRyaWVzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS5pc0NhbmNlbGxlZCgpKSB7XG4gICAgICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICB0aGlzLm9uQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuemlwUG9zdEZsaWdodChyZXNwKTtcbiAgICAgICAgZW50cnkub25Eb25lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm51bUVudHJpZXNJblByb2dyZXNzLS07XG4gICAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBncm91cGVkRW50cmllcyA9IHRoaXMuX2VudHJpZXMucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgICBpZiAoIWVudHJ5Lm1ldGEpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgbmFtZSwgY2FsbGJhY2sgfSA9IGVudHJ5LnVwbG9hZGVyKGxpdmVTb2NrZXQudXBsb2FkZXJzKTtcbiAgICAgIGFjY1tuYW1lXSA9IGFjY1tuYW1lXSB8fCB7IGNhbGxiYWNrOiBjYWxsYmFjaywgZW50cmllczogW10gfTtcbiAgICAgIGFjY1tuYW1lXS5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZ3JvdXBlZEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIGVudHJpZXMgfSA9IGdyb3VwZWRFbnRyaWVzW25hbWVdO1xuICAgICAgY2FsbGJhY2soZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldCk7XG4gICAgfVxuICB9XG59XG4iLCAiY29uc3QgQVJJQSA9IHtcbiAgYW55T2YoaW5zdGFuY2UsIGNsYXNzZXMpIHtcbiAgICByZXR1cm4gY2xhc3Nlcy5maW5kKChuYW1lKSA9PiBpbnN0YW5jZSBpbnN0YW5jZW9mIG5hbWUpO1xuICB9LFxuXG4gIGlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWwucmVsICE9PSBcImlnbm9yZVwiKSB8fFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFyZWFFbGVtZW50ICYmIGVsLmhyZWYgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICghZWwuZGlzYWJsZWQgJiZcbiAgICAgICAgdGhpcy5hbnlPZihlbCwgW1xuICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFNlbGVjdEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFRleHRBcmVhRWxlbWVudCxcbiAgICAgICAgICBIVE1MQnV0dG9uRWxlbWVudCxcbiAgICAgICAgXSkpIHx8XG4gICAgICBlbCBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50IHx8XG4gICAgICAoZWwudGFiSW5kZXggPj0gMCAmJiBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpIHx8XG4gICAgICAoIWludGVyYWN0aXZlT25seSAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAhPT0gbnVsbCAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpXG4gICAgKTtcbiAgfSxcblxuICBhdHRlbXB0Rm9jdXMoZWwsIGludGVyYWN0aXZlT25seSkge1xuICAgIGlmICh0aGlzLmlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIHRoYXQncyBmaW5lXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5pc1NhbWVOb2RlKGVsKTtcbiAgfSxcblxuICBmb2N1c0ZpcnN0SW50ZXJhY3RpdmUoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCwgdHJ1ZSkgfHwgdGhpcy5mb2N1c0ZpcnN0SW50ZXJhY3RpdmUoY2hpbGQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxuXG4gIGZvY3VzRmlyc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCkgfHwgdGhpcy5mb2N1c0ZpcnN0KGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gY2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgfSxcblxuICBmb2N1c0xhc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5sYXN0RWxlbWVudENoaWxkO1xuICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgaWYgKHRoaXMuYXR0ZW1wdEZvY3VzKGNoaWxkKSB8fCB0aGlzLmZvY3VzTGFzdChjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjaGlsZCA9IGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEFSSUE7XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxuICBQSFhfVVBMT0FEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuaW1wb3J0IEFSSUEgZnJvbSBcIi4vYXJpYVwiO1xuXG5jb25zdCBIb29rcyA9IHtcbiAgTGl2ZUZpbGVVcGxvYWQ6IHtcbiAgICBhY3RpdmVSZWZzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUyk7XG4gICAgfSxcblxuICAgIHByZWZsaWdodGVkUmVmcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfUFJFRkxJR0hURURfUkVGUyk7XG4gICAgfSxcblxuICAgIG1vdW50ZWQoKSB7XG4gICAgICB0aGlzLnByZWZsaWdodGVkV2FzID0gdGhpcy5wcmVmbGlnaHRlZFJlZnMoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlZCgpIHtcbiAgICAgIGNvbnN0IG5ld1ByZWZsaWdodHMgPSB0aGlzLnByZWZsaWdodGVkUmVmcygpO1xuICAgICAgaWYgKHRoaXMucHJlZmxpZ2h0ZWRXYXMgIT09IG5ld1ByZWZsaWdodHMpIHtcbiAgICAgICAgdGhpcy5wcmVmbGlnaHRlZFdhcyA9IG5ld1ByZWZsaWdodHM7XG4gICAgICAgIGlmIChuZXdQcmVmbGlnaHRzID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5fX3ZpZXcoKS5jYW5jZWxTdWJtaXQodGhpcy5lbC5mb3JtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hY3RpdmVSZWZzKCkgPT09IFwiXCIpIHtcbiAgICAgICAgdGhpcy5lbC52YWx1ZSA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCkpO1xuICAgIH0sXG4gIH0sXG5cbiAgTGl2ZUltZ1ByZXZpZXc6IHtcbiAgICBtb3VudGVkKCkge1xuICAgICAgdGhpcy5yZWYgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWVudHJ5LXJlZlwiKTtcbiAgICAgIHRoaXMuaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLmdldEVudHJ5RGF0YVVSTCh0aGlzLmlucHV0RWwsIHRoaXMucmVmLCAodXJsKSA9PiB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVzdHJveWVkKCkge1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnVybCk7XG4gICAgfSxcbiAgfSxcbiAgRm9jdXNXcmFwOiB7XG4gICAgbW91bnRlZCgpIHtcbiAgICAgIHRoaXMuZm9jdXNTdGFydCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICB0aGlzLmZvY3VzRW5kID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgdGhpcy5mb2N1c1N0YXJ0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgQVJJQS5hdHRlbXB0Rm9jdXMobmV4dEZvY3VzKSB8fCBBUklBLmZvY3VzRmlyc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzTGFzdCh0aGlzLmVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvY3VzRW5kLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBTaGlmdCtUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIEFSSUEuYXR0ZW1wdEZvY3VzKG5leHRGb2N1cykgfHwgQVJJQS5mb2N1c0xhc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzRmlyc3QodGhpcy5lbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gb25seSB0cnkgdG8gY2hhbmdlIHRoZSBmb2N1cyBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnNpZGVcbiAgICAgIGlmICghdGhpcy5lbC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6c2hvdy1lbmRcIiwgKCkgPT4gdGhpcy5lbC5mb2N1cygpKTtcbiAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwpLmRpc3BsYXkgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgQVJJQS5mb2N1c0ZpcnN0KHRoaXMuZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IGZpbmRTY3JvbGxDb250YWluZXIgPSAoZWwpID0+IHtcbiAgLy8gdGhlIHNjcm9sbCBldmVudCB3b24ndCBiZSBmaXJlZCBvbiB0aGUgaHRtbC9ib2R5IGVsZW1lbnQgZXZlbiBpZiBvdmVyZmxvdyBpcyBzZXRcbiAgLy8gdGhlcmVmb3JlIHdlIHJldHVybiBudWxsIHRvIGluc3RlYWQgbGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzIG9uIGRvY3VtZW50XG4gIGlmIChbXCJIVE1MXCIsIFwiQk9EWVwiXS5pbmRleE9mKGVsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpID49IDApIHJldHVybiBudWxsO1xuICBpZiAoW1wic2Nyb2xsXCIsIFwiYXV0b1wiXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWwpLm92ZXJmbG93WSkgPj0gMClcbiAgICByZXR1cm4gZWw7XG4gIHJldHVybiBmaW5kU2Nyb2xsQ29udGFpbmVyKGVsLnBhcmVudEVsZW1lbnQpO1xufTtcblxuY29uc3Qgc2Nyb2xsVG9wID0gKHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgcmV0dXJuIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3A7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG4gIH1cbn07XG5cbmNvbnN0IGJvdHRvbSA9IChzY3JvbGxDb250YWluZXIpID0+IHtcbiAgaWYgKHNjcm9sbENvbnRhaW5lcikge1xuICAgIHJldHVybiBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO1xuICB9IGVsc2Uge1xuICAgIC8vIHdoZW4gd2UgaGF2ZSBubyBjb250YWluZXIsIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSBib3R0b20gY29vcmRpbmF0ZSBpcyB0aGUgdmlld3BvcnQgaGVpZ2h0XG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICB9XG59O1xuXG5jb25zdCB0b3AgPSAoc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGlmIChzY3JvbGxDb250YWluZXIpIHtcbiAgICByZXR1cm4gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgfSBlbHNlIHtcbiAgICAvLyB3aGVuIHdlIGhhdmUgbm8gY29udGFpbmVyIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSB0b3AgY29vcmRpbmF0ZSBpcyAwXG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbmNvbnN0IGlzQXRWaWV3cG9ydFRvcCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5jb25zdCBpc0F0Vmlld3BvcnRCb3R0b20gPSAoZWwsIHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiAoXG4gICAgTWF0aC5jZWlsKHJlY3QuYm90dG9tKSA+PSB0b3Aoc2Nyb2xsQ29udGFpbmVyKSAmJlxuICAgIE1hdGguY2VpbChyZWN0LmxlZnQpID49IDAgJiZcbiAgICBNYXRoLmZsb29yKHJlY3QuYm90dG9tKSA8PSBib3R0b20oc2Nyb2xsQ29udGFpbmVyKVxuICApO1xufTtcblxuY29uc3QgaXNXaXRoaW5WaWV3cG9ydCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5Ib29rcy5JbmZpbml0ZVNjcm9sbCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IGZpbmRTY3JvbGxDb250YWluZXIodGhpcy5lbCk7XG4gICAgbGV0IHNjcm9sbEJlZm9yZSA9IHNjcm9sbFRvcCh0aGlzLnNjcm9sbENvbnRhaW5lcik7XG4gICAgbGV0IHRvcE92ZXJyYW4gPSBmYWxzZTtcbiAgICBjb25zdCB0aHJvdHRsZUludGVydmFsID0gNTAwO1xuICAgIGxldCBwZW5kaW5nT3AgPSBudWxsO1xuXG4gICAgY29uc3Qgb25Ub3BPdmVycnVuID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAodG9wRXZlbnQsIGZpcnN0Q2hpbGQpID0+IHtcbiAgICAgICAgcGVuZGluZ09wID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkLCBfb3ZlcnJhbjogdHJ1ZSB9LFxuICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nT3AgPSBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25GaXJzdENoaWxkQXRUb3AgPSB0aGlzLnRocm90dGxlKFxuICAgICAgdGhyb3R0bGVJbnRlcnZhbCxcbiAgICAgICh0b3BFdmVudCwgZmlyc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkIH0sXG4gICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHBlbmRpbmdPcCA9IG51bGw7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgRE9NIGlzIHBhdGNoZWQgYnkgd2FpdGluZyBmb3IgdGhlIG5leHQgdGlja1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaXNXaXRoaW5WaWV3cG9ydChmaXJzdENoaWxkLCB0aGlzLnNjcm9sbENvbnRhaW5lcikpIHtcbiAgICAgICAgICAgICAgICBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBvbkxhc3RDaGlsZEF0Qm90dG9tID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAoYm90dG9tRXZlbnQsIGxhc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBsYXN0Q2hpbGQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogXCJlbmRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCBib3R0b21FdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBsYXN0Q2hpbGQuaWQgfSxcbiAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgcGVuZGluZ09wID0gbnVsbDtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgcGF0Y2hlZCBieSB3YWl0aW5nIGZvciB0aGUgbmV4dCB0aWNrXG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFpc1dpdGhpblZpZXdwb3J0KGxhc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpKSB7XG4gICAgICAgICAgICAgICAgbGFzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwiZW5kXCIgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5vblNjcm9sbCA9IChfZSkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsTm93ID0gc2Nyb2xsVG9wKHRoaXMuc2Nyb2xsQ29udGFpbmVyKTtcblxuICAgICAgaWYgKHBlbmRpbmdPcCkge1xuICAgICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgICAgIHJldHVybiBwZW5kaW5nT3AoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9wRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC10b3BcIiksXG4gICAgICApO1xuICAgICAgY29uc3QgYm90dG9tRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC1ib3R0b21cIiksXG4gICAgICApO1xuICAgICAgY29uc3QgbGFzdENoaWxkID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICBjb25zdCBpc1Njcm9sbGluZ1VwID0gc2Nyb2xsTm93IDwgc2Nyb2xsQmVmb3JlO1xuICAgICAgY29uc3QgaXNTY3JvbGxpbmdEb3duID0gc2Nyb2xsTm93ID4gc2Nyb2xsQmVmb3JlO1xuXG4gICAgICAvLyBlbCBvdmVycmFuIHdoaWxlIHNjcm9sbGluZyB1cFxuICAgICAgaWYgKGlzU2Nyb2xsaW5nVXAgJiYgdG9wRXZlbnQgJiYgIXRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPj0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gdHJ1ZTtcbiAgICAgICAgb25Ub3BPdmVycnVuKHRvcEV2ZW50LCBmaXJzdENoaWxkKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNTY3JvbGxpbmdEb3duICYmIHRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPD0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdG9wRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdVcCAmJlxuICAgICAgICBpc0F0Vmlld3BvcnRUb3AoZmlyc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpXG4gICAgICApIHtcbiAgICAgICAgb25GaXJzdENoaWxkQXRUb3AodG9wRXZlbnQsIGZpcnN0Q2hpbGQpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgYm90dG9tRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdEb3duICYmXG4gICAgICAgIGlzQXRWaWV3cG9ydEJvdHRvbShsYXN0Q2hpbGQsIHRoaXMuc2Nyb2xsQ29udGFpbmVyKVxuICAgICAgKSB7XG4gICAgICAgIG9uTGFzdENoaWxkQXRCb3R0b20oYm90dG9tRXZlbnQsIGxhc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfVxuICB9LFxuXG4gIGRlc3Ryb3llZCgpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXIpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgIH1cbiAgfSxcblxuICB0aHJvdHRsZShpbnRlcnZhbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgbGFzdENhbGxBdCA9IDA7XG4gICAgbGV0IHRpbWVyO1xuXG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVtYWluaW5nVGltZSA9IGludGVydmFsIC0gKG5vdyAtIGxhc3RDYWxsQXQpO1xuXG4gICAgICBpZiAocmVtYWluaW5nVGltZSA8PSAwIHx8IHJlbWFpbmluZ1RpbWUgPiBpbnRlcnZhbCkge1xuICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsYXN0Q2FsbEF0ID0gbm93O1xuICAgICAgICBjYWxsYmFjayguLi5hcmdzKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgbGFzdENhbGxBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGNhbGxiYWNrKC4uLmFyZ3MpO1xuICAgICAgICB9LCByZW1haW5pbmdUaW1lKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEhvb2tzO1xuIiwgImltcG9ydCB7XG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1BFTkRJTkdfUkVGUyxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFBIWF9ESVNBQkxFRCxcbiAgUEhYX1JFQURPTkxZLFxuICBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbGVtZW50UmVmIHtcbiAgc3RhdGljIG9uVW5sb2NrKGVsLCBjYWxsYmFjaykge1xuICAgIGlmICghRE9NLmlzTG9ja2VkKGVsKSAmJiAhZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNvbnN0IGNsb3Nlc3RMb2NrID0gZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKTtcbiAgICBjb25zdCByZWYgPSBjbG9zZXN0TG9ja1xuICAgICAgLmNsb3Nlc3QoYFske1BIWF9SRUZfTE9DS31dYClcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLKTtcbiAgICBjbG9zZXN0TG9jay5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDp1bmRvLWxvY2s6JHtyZWZ9YCxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sXG4gICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5sb2FkaW5nUmVmID0gZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORylcbiAgICAgID8gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyksIDEwKVxuICAgICAgOiBudWxsO1xuICAgIHRoaXMubG9ja1JlZiA9IGVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spXG4gICAgICA/IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spLCAxMClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIHB1YmxpY1xuXG4gIG1heWJlVW5kbyhyZWYsIHBoeEV2ZW50LCBlYWNoQ2xvbmVDYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5pc1dpdGhpbihyZWYpKSB7XG4gICAgICAvLyB3ZSBjYW5ub3QgdW5kbyB0aGUgbG9jayAvIGxvYWRpbmcgbm93LCBhcyB0aGVyZSBpcyBhIG5ld2VyIG9uZSBhbHJlYWR5IHNldDtcbiAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIHJlZiB3ZSB0cmllZCB0byBzZW5kIHRoZSB1bmRvIGV2ZW50IGxhdGVyXG4gICAgICBET00udXBkYXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUEVORElOR19SRUZTLCBbXSwgKHBlbmRpbmdSZWZzKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdW5kbyBsb2NrcyBhbmQgYXBwbHkgY2xvbmVzXG4gICAgdGhpcy51bmRvTG9ja3MocmVmLCBwaHhFdmVudCwgZWFjaENsb25lQ2FsbGJhY2spO1xuXG4gICAgLy8gdW5kbyBsb2FkaW5nIHN0YXRlc1xuICAgIHRoaXMudW5kb0xvYWRpbmcocmVmLCBwaHhFdmVudCk7XG5cbiAgICAvLyBlbnN1cmUgdW5kbyBldmVudHMgYXJlIGZpcmVkIGZvciBwZW5kaW5nIHJlZnMgdGhhdFxuICAgIC8vIGFyZSByZXNvbHZlZCBieSB0aGUgY3VycmVudCByZWYsIG90aGVyd2lzZSB3ZSdkIGxlYWsgZXZlbnQgbGlzdGVuZXJzXG4gICAgRE9NLnVwZGF0ZVByaXZhdGUodGhpcy5lbCwgUEhYX1BFTkRJTkdfUkVGUywgW10sIChwZW5kaW5nUmVmcykgPT4ge1xuICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzLmZpbHRlcigocGVuZGluZ1JlZikgPT4ge1xuICAgICAgICBsZXQgb3B0cyA9IHtcbiAgICAgICAgICBkZXRhaWw6IHsgcmVmOiBwZW5kaW5nUmVmLCBldmVudDogcGh4RXZlbnQgfSxcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nUmVmICYmIHRoaXMubG9hZGluZ1JlZiA+IHBlbmRpbmdSZWYpIHtcbiAgICAgICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvYWRpbmc6JHtwZW5kaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9ja1JlZiAmJiB0aGlzLmxvY2tSZWYgPiBwZW5kaW5nUmVmKSB7XG4gICAgICAgICAgdGhpcy5lbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2NrOiR7cGVuZGluZ1JlZn1gLCBvcHRzKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZW5kaW5nUmVmID4gcmVmO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBjbGVhbiB1cCBpZiBmdWxseSByZXNvbHZlZFxuICAgIGlmICh0aGlzLmlzRnVsbHlSZXNvbHZlZEJ5KHJlZikpIHtcbiAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfU1JDKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcml2YXRlXG5cbiAgaXNXaXRoaW4ocmVmKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICB0aGlzLmxvYWRpbmdSZWYgIT09IG51bGwgJiZcbiAgICAgIHRoaXMubG9hZGluZ1JlZiA+IHJlZiAmJlxuICAgICAgdGhpcy5sb2NrUmVmICE9PSBudWxsICYmXG4gICAgICB0aGlzLmxvY2tSZWYgPiByZWZcbiAgICApO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGNsb25lZCBQSFhfUkVGX0xPQ0sgZWxlbWVudCB0aGF0IGhhcyBiZWVuIG1vcnBoZWQgYmVoaW5kXG4gIC8vIHRoZSBzY2VuZXMgd2hpbGUgdGhpcyBlbGVtZW50IHdhcyBsb2NrZWQgaW4gdGhlIERPTS5cbiAgLy8gV2hlbiB3ZSBhcHBseSB0aGUgY2xvbmVkIHRyZWUgdG8gdGhlIGFjdGl2ZSBET00gZWxlbWVudCwgd2UgbXVzdFxuICAvL1xuICAvLyAgIDEuIGV4ZWN1dGUgcGVuZGluZyBtb3VudGVkIGhvb2tzIGZvciBub2RlcyBub3cgaW4gdGhlIERPTVxuICAvLyAgIDIuIHVuZG8gYW55IHJlZiBpbnNpZGUgdGhlIGNsb25lZCB0cmVlIHRoYXQgaGFzIHNpbmNlIGJlZW4gYWNrJ2RcbiAgdW5kb0xvY2tzKHJlZiwgcGh4RXZlbnQsIGVhY2hDbG9uZUNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9ja1VuZG9uZUJ5KHJlZikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbG9uZWRUcmVlID0gRE9NLnByaXZhdGUodGhpcy5lbCwgUEhYX1JFRl9MT0NLKTtcbiAgICBpZiAoY2xvbmVkVHJlZSkge1xuICAgICAgZWFjaENsb25lQ2FsbGJhY2soY2xvbmVkVHJlZSk7XG4gICAgICBET00uZGVsZXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUkVGX0xPQ0spO1xuICAgIH1cbiAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuXG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvY2s6JHt0aGlzLmxvY2tSZWZ9YCwgb3B0cyksXG4gICAgKTtcbiAgfVxuXG4gIHVuZG9Mb2FkaW5nKHJlZiwgcGh4RXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nVW5kb25lQnkocmVmKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNhblVuZG9Mb2FkaW5nKHJlZikgJiZcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgICkge1xuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXCJwaHgtY2hhbmdlLWxvYWRpbmdcIik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9MT0FESU5HKTtcbiAgICAgIGNvbnN0IGRpc2FibGVkVmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVEKTtcbiAgICAgIGNvbnN0IHJlYWRPbmx5VmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIC8vIHJlc3RvcmUgaW5wdXRzXG4gICAgICBpZiAocmVhZE9ubHlWYWwgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbC5yZWFkT25seSA9IHJlYWRPbmx5VmFsID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZFZhbCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVsLmRpc2FibGVkID0gZGlzYWJsZWRWYWwgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfRElTQUJMRUQpO1xuICAgICAgfVxuICAgICAgLy8gcmVzdG9yZSBkaXNhYmxlc1xuICAgICAgY29uc3QgZGlzYWJsZVJlc3RvcmUgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUpO1xuICAgICAgaWYgKGRpc2FibGVSZXN0b3JlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVJlc3RvcmU7XG4gICAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2FkaW5nOiR7dGhpcy5sb2FkaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgY2xhc3Nlc1xuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgIGlmIChuYW1lICE9PSBcInBoeC1zdWJtaXQtbG9hZGluZ1wiIHx8IHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgICBET00ucmVtb3ZlQ2xhc3ModGhpcy5lbCwgbmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpc0xvYWRpbmdVbmRvbmVCeShyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nUmVmID09PSBudWxsID8gZmFsc2UgOiB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmO1xuICB9XG4gIGlzTG9ja1VuZG9uZUJ5KHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgPyBmYWxzZSA6IHRoaXMubG9ja1JlZiA8PSByZWY7XG4gIH1cblxuICBpc0Z1bGx5UmVzb2x2ZWRCeShyZWYpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMubG9hZGluZ1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmKSAmJlxuICAgICAgKHRoaXMubG9ja1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvY2tSZWYgPD0gcmVmKVxuICAgICk7XG4gIH1cblxuICAvLyBvbmx5IHJlbW92ZSB0aGUgcGh4LXN1Ym1pdC1sb2FkaW5nIGNsYXNzIGlmIHdlIGFyZSBub3QgbG9ja2VkXG4gIGNhblVuZG9Mb2FkaW5nKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgfHwgdGhpcy5sb2NrUmVmIDw9IHJlZjtcbiAgfVxufVxuIiwgImltcG9ydCB7IG1heWJlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRE9NUG9zdE1vcnBoUmVzdG9yZXIge1xuICBjb25zdHJ1Y3Rvcihjb250YWluZXJCZWZvcmUsIGNvbnRhaW5lckFmdGVyLCB1cGRhdGVUeXBlKSB7XG4gICAgY29uc3QgaWRzQmVmb3JlID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGlkc0FmdGVyID0gbmV3IFNldChcbiAgICAgIFsuLi5jb250YWluZXJBZnRlci5jaGlsZHJlbl0ubWFwKChjaGlsZCkgPT4gY2hpbGQuaWQpLFxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50c1RvTW9kaWZ5ID0gW107XG5cbiAgICBBcnJheS5mcm9tKGNvbnRhaW5lckJlZm9yZS5jaGlsZHJlbikuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZC5pZCkge1xuICAgICAgICAvLyBhbGwgb2Ygb3VyIGNoaWxkcmVuIHNob3VsZCBiZSBlbGVtZW50cyB3aXRoIGlkc1xuICAgICAgICBpZHNCZWZvcmUuYWRkKGNoaWxkLmlkKTtcbiAgICAgICAgaWYgKGlkc0FmdGVyLmhhcyhjaGlsZC5pZCkpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnRJZCA9XG4gICAgICAgICAgICBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmIGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQ7XG4gICAgICAgICAgZWxlbWVudHNUb01vZGlmeS5wdXNoKHtcbiAgICAgICAgICAgIGVsZW1lbnRJZDogY2hpbGQuaWQsXG4gICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRJZDogcHJldmlvdXNFbGVtZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJBZnRlci5pZDtcbiAgICB0aGlzLnVwZGF0ZVR5cGUgPSB1cGRhdGVUeXBlO1xuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeSA9IGVsZW1lbnRzVG9Nb2RpZnk7XG4gICAgdGhpcy5lbGVtZW50SWRzVG9BZGQgPSBbLi4uaWRzQWZ0ZXJdLmZpbHRlcigoaWQpID0+ICFpZHNCZWZvcmUuaGFzKGlkKSk7XG4gIH1cblxuICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIHRvIG9wdGltaXplIGFwcGVuZC9wcmVwZW5kIG9wZXJhdGlvbnM6XG4gIC8vICAgMSkgVHJhY2sgaWRzIG9mIG1vZGlmaWVkIGVsZW1lbnRzICYgb2YgbmV3IGVsZW1lbnRzXG4gIC8vICAgMikgQWxsIHRoZSBtb2RpZmllZCBlbGVtZW50cyBhcmUgcHV0IGJhY2sgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIERPTSB0cmVlXG4gIC8vICAgICAgYnkgc3RvcmluZyB0aGUgaWQgb2YgdGhlaXIgcHJldmlvdXMgc2libGluZ1xuICAvLyAgIDMpIE5ldyBlbGVtZW50cyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSBieSBtb3JwaGRvbSBkdXJpbmcgYXBwZW5kLlxuICAvLyAgICAgIEZvciBwcmVwZW5kLCB3ZSBtb3ZlIHRoZW0gdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBjb250YWluZXJcbiAgcGVyZm9ybSgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBET00uYnlJZCh0aGlzLmNvbnRhaW5lcklkKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzVG9Nb2RpZnkuZm9yRWFjaCgoZWxlbWVudFRvTW9kaWZ5KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudFRvTW9kaWZ5LnByZXZpb3VzRWxlbWVudElkKSB7XG4gICAgICAgIG1heWJlKFxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5wcmV2aW91c0VsZW1lbnRJZCksXG4gICAgICAgICAgKHByZXZpb3VzRWxlbSkgPT4ge1xuICAgICAgICAgICAgbWF5YmUoXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLFxuICAgICAgICAgICAgICAoZWxlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID1cbiAgICAgICAgICAgICAgICAgIGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkID09IHByZXZpb3VzRWxlbS5pZDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzSW5SaWdodFBsYWNlKSB7XG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJlbmRcIiwgZWxlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCAoZWxlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID0gZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID09IG51bGw7XG4gICAgICAgICAgaWYgKCFpc0luUmlnaHRQbGFjZSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnVwZGF0ZVR5cGUgPT0gXCJwcmVwZW5kXCIpIHtcbiAgICAgIHRoaXMuZWxlbWVudElkc1RvQWRkLnJldmVyc2UoKS5mb3JFYWNoKChlbGVtSWQpID0+IHtcbiAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbUlkKSwgKGVsZW0pID0+XG4gICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJ2YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG5mdW5jdGlvbiBtb3JwaEF0dHJzKGZyb21Ob2RlLCB0b05vZGUpIHtcbiAgICB2YXIgdG9Ob2RlQXR0cnMgPSB0b05vZGUuYXR0cmlidXRlcztcbiAgICB2YXIgYXR0cjtcbiAgICB2YXIgYXR0ck5hbWU7XG4gICAgdmFyIGF0dHJOYW1lc3BhY2VVUkk7XG4gICAgdmFyIGF0dHJWYWx1ZTtcbiAgICB2YXIgZnJvbVZhbHVlO1xuXG4gICAgLy8gZG9jdW1lbnQtZnJhZ21lbnRzIGRvbnQgaGF2ZSBhdHRyaWJ1dGVzIHNvIGxldHMgbm90IGRvIGFueXRoaW5nXG4gICAgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBmcm9tTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50XG4gICAgZm9yICh2YXIgaSA9IHRvTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGF0dHIgPSB0b05vZGVBdHRyc1tpXTtcbiAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgIGF0dHJOYW1lc3BhY2VVUkkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcbiAgICAgICAgYXR0clZhbHVlID0gYXR0ci52YWx1ZTtcblxuICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZTtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZyb21WYWx1ZSAhPT0gYXR0clZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIucHJlZml4ID09PSAneG1sbnMnKXtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7IC8vIEl0J3Mgbm90IGFsbG93ZWQgdG8gc2V0IGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBYTUxOUyBuYW1lc3BhY2Ugd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBgeG1sbnNgIHByZWZpeFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IGF0dHJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgYXR0cmlidXRlcyBmb3VuZCBvbiB0aGUgb3JpZ2luYWwgRE9NIGVsZW1lbnQgdGhhdFxuICAgIC8vIHdlcmVuJ3QgZm91bmQgb24gdGhlIHRhcmdldCBlbGVtZW50LlxuICAgIHZhciBmcm9tTm9kZUF0dHJzID0gZnJvbU5vZGUuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIGQgPSBmcm9tTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGF0dHIgPSBmcm9tTm9kZUF0dHJzW2RdO1xuICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTtcbiAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGF0dHIubmFtZXNwYWNlVVJJO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubG9jYWxOYW1lIHx8IGF0dHJOYW1lO1xuXG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5yZW1vdmVBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxudmFyIHJhbmdlOyAvLyBDcmVhdGUgYSByYW5nZSBvYmplY3QgZm9yIGVmZmljZW50bHkgcmVuZGVyaW5nIHN0cmluZ3MgdG8gZWxlbWVudHMuXG52YXIgTlNfWEhUTUwgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG5cbnZhciBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogZG9jdW1lbnQ7XG52YXIgSEFTX1RFTVBMQVRFX1NVUFBPUlQgPSAhIWRvYyAmJiAnY29udGVudCcgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG52YXIgSEFTX1JBTkdFX1NVUFBPUlQgPSAhIWRvYyAmJiBkb2MuY3JlYXRlUmFuZ2UgJiYgJ2NyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCcgaW4gZG9jLmNyZWF0ZVJhbmdlKCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cikge1xuICAgIHZhciB0ZW1wbGF0ZSA9IGRvYy5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHN0cjtcbiAgICByZXR1cm4gdGVtcGxhdGUuY29udGVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21SYW5nZShzdHIpIHtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUoZG9jLmJvZHkpO1xuICAgIH1cblxuICAgIHZhciBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHIpO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21XcmFwKHN0cikge1xuICAgIHZhciBmcmFnbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCdib2R5Jyk7XG4gICAgZnJhZ21lbnQuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgYWJvdXQgdGhlIHNhbWVcbiAqIHZhciBodG1sID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhzdHIsICd0ZXh0L2h0bWwnKTtcbiAqIHJldHVybiBodG1sLmJvZHkuZmlyc3RDaGlsZDtcbiAqXG4gKiBAbWV0aG9kIHRvRWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICovXG5mdW5jdGlvbiB0b0VsZW1lbnQoc3RyKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBpZiAoSEFTX1RFTVBMQVRFX1NVUFBPUlQpIHtcbiAgICAgIC8vIGF2b2lkIHJlc3RyaWN0aW9ucyBvbiBjb250ZW50IGZvciB0aGluZ3MgbGlrZSBgPHRyPjx0aD5IaTwvdGg+PC90cj5gIHdoaWNoXG4gICAgICAvLyBjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQgZG9lc24ndCBzdXBwb3J0XG4gICAgICAvLyA8dGVtcGxhdGU+IHN1cHBvcnQgbm90IGF2YWlsYWJsZSBpbiBJRVxuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cik7XG4gICAgfSBlbHNlIGlmIChIQVNfUkFOR0VfU1VQUE9SVCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVJhbmdlKHN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVdyYXAoc3RyKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdHdvIG5vZGUncyBuYW1lcyBhcmUgdGhlIHNhbWUuXG4gKlxuICogTk9URTogV2UgZG9uJ3QgYm90aGVyIGNoZWNraW5nIGBuYW1lc3BhY2VVUklgIGJlY2F1c2UgeW91IHdpbGwgbmV2ZXIgZmluZCB0d28gSFRNTCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lXG4gKiAgICAgICBub2RlTmFtZSBhbmQgZGlmZmVyZW50IG5hbWVzcGFjZSBVUklzLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiIFRoZSB0YXJnZXQgZWxlbWVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZU5vZGVOYW1lcyhmcm9tRWwsIHRvRWwpIHtcbiAgICB2YXIgZnJvbU5vZGVOYW1lID0gZnJvbUVsLm5vZGVOYW1lO1xuICAgIHZhciB0b05vZGVOYW1lID0gdG9FbC5ub2RlTmFtZTtcbiAgICB2YXIgZnJvbUNvZGVTdGFydCwgdG9Db2RlU3RhcnQ7XG5cbiAgICBpZiAoZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZyb21Db2RlU3RhcnQgPSBmcm9tTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcbiAgICB0b0NvZGVTdGFydCA9IHRvTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcblxuICAgIC8vIElmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBhIHZpcnR1YWwgRE9NIG5vZGUgb3IgU1ZHIG5vZGUgdGhlbiB3ZSBtYXlcbiAgICAvLyBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgdGFnIG5hbWUgYmVmb3JlIGNvbXBhcmluZy4gTm9ybWFsIEhUTUwgZWxlbWVudHMgdGhhdCBhcmVcbiAgICAvLyBpbiB0aGUgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJcbiAgICAvLyBhcmUgY29udmVydGVkIHRvIHVwcGVyIGNhc2VcbiAgICBpZiAoZnJvbUNvZGVTdGFydCA8PSA5MCAmJiB0b0NvZGVTdGFydCA+PSA5NykgeyAvLyBmcm9tIGlzIHVwcGVyIGFuZCB0byBpcyBsb3dlclxuICAgICAgICByZXR1cm4gZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0b0NvZGVTdGFydCA8PSA5MCAmJiBmcm9tQ29kZVN0YXJ0ID49IDk3KSB7IC8vIHRvIGlzIHVwcGVyIGFuZCBmcm9tIGlzIGxvd2VyXG4gICAgICAgIHJldHVybiB0b05vZGVOYW1lID09PSBmcm9tTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50LCBvcHRpb25hbGx5IHdpdGggYSBrbm93biBuYW1lc3BhY2UgVVJJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBlbGVtZW50IG5hbWUsIGUuZy4gJ2Rpdicgb3IgJ3N2ZydcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlVVJJXSB0aGUgZWxlbWVudCdzIG5hbWVzcGFjZSBVUkksIGkuZS4gdGhlIHZhbHVlIG9mXG4gKiBpdHMgYHhtbG5zYCBhdHRyaWJ1dGUgb3IgaXRzIGluZmVycmVkIG5hbWVzcGFjZS5cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMobmFtZSwgbmFtZXNwYWNlVVJJKSB7XG4gICAgcmV0dXJuICFuYW1lc3BhY2VVUkkgfHwgbmFtZXNwYWNlVVJJID09PSBOU19YSFRNTCA/XG4gICAgICAgIGRvYy5jcmVhdGVFbGVtZW50KG5hbWUpIDpcbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIG5hbWUpO1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgY2hpbGRyZW4gb2Ygb25lIERPTSBlbGVtZW50IHRvIGFub3RoZXIgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gbW92ZUNoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICB2YXIgbmV4dENoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIHRvRWwuYXBwZW5kQ2hpbGQoY3VyQ2hpbGQpO1xuICAgICAgICBjdXJDaGlsZCA9IG5leHRDaGlsZDtcbiAgICB9XG4gICAgcmV0dXJuIHRvRWw7XG59XG5cbmZ1bmN0aW9uIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCBuYW1lKSB7XG4gICAgaWYgKGZyb21FbFtuYW1lXSAhPT0gdG9FbFtuYW1lXSkge1xuICAgICAgICBmcm9tRWxbbmFtZV0gPSB0b0VsW25hbWVdO1xuICAgICAgICBpZiAoZnJvbUVsW25hbWVdKSB7XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKG5hbWUsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciBzcGVjaWFsRWxIYW5kbGVycyA9IHtcbiAgICBPUFRJT046IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGZyb21FbC5wYXJlbnROb2RlO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUgPT09ICdTRUxFQ1QnICYmICFwYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgICAgIGlmIChmcm9tRWwuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpICYmICF0b0VsLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIE1TIEVkZ2UgYnVnIHdoZXJlIHRoZSAnc2VsZWN0ZWQnIGF0dHJpYnV0ZSBjYW4gb25seSBiZVxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkIGlmIHNldCB0byBhIG5vbi1lbXB0eSB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTIwODc2NzkvXG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVzZXQgc2VsZWN0IGVsZW1lbnQncyBzZWxlY3RlZEluZGV4IHRvIC0xLCBvdGhlcndpc2Ugc2V0dGluZ1xuICAgICAgICAgICAgICAgIC8vIGZyb21FbC5zZWxlY3RlZCB1c2luZyB0aGUgc3luY0Jvb2xlYW5BdHRyUHJvcCBiZWxvdyBoYXMgbm8gZWZmZWN0LlxuICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JyZWN0IHNlbGVjdGVkSW5kZXggd2lsbCBiZSBzZXQgaW4gdGhlIFNFTEVDVCBzcGVjaWFsIGhhbmRsZXIgYmVsb3cuXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdzZWxlY3RlZCcpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgaXMgc3BlY2lhbCBmb3IgdGhlIDxpbnB1dD4gZWxlbWVudCBzaW5jZSBpdCBzZXRzXG4gICAgICogdGhlIGluaXRpYWwgdmFsdWUuIENoYW5naW5nIHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICogXCJ2YWx1ZVwiIHByb3BlcnR5IHdpbGwgaGF2ZSBubyBlZmZlY3Qgc2luY2UgaXQgaXMgb25seSB1c2VkIHRvIHRoZSBzZXQgdGhlXG4gICAgICogaW5pdGlhbCB2YWx1ZS4gIFNpbWlsYXIgZm9yIHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUsIGFuZCBcImRpc2FibGVkXCIuXG4gICAgICovXG4gICAgSU5QVVQ6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2NoZWNrZWQnKTtcbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdkaXNhYmxlZCcpO1xuXG4gICAgICAgIGlmIChmcm9tRWwudmFsdWUgIT09IHRvRWwudmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IHRvRWwudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRvRWwuaGFzQXR0cmlidXRlKCd2YWx1ZScpKSB7XG4gICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIFRFWFRBUkVBOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIE5lZWRlZCBmb3IgSUUuIEFwcGFyZW50bHkgSUUgc2V0cyB0aGUgcGxhY2Vob2xkZXIgYXMgdGhlXG4gICAgICAgICAgICAvLyBub2RlIHZhbHVlIGFuZCB2aXNlIHZlcnNhLiBUaGlzIGlnbm9yZXMgYW4gZW1wdHkgdXBkYXRlLlxuICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gZmlyc3RDaGlsZC5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSB8fCAoIW5ld1ZhbHVlICYmIG9sZFZhbHVlID09IGZyb21FbC5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFNFTEVDVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiBvZiBmcm9tRWwsIG5vdCB0b0VsIHNpbmNlIG5vZGVzIGNhbiBiZSBtb3ZlZFxuICAgICAgICAgICAgLy8gZnJvbSB0b0VsIHRvIGZyb21FbCBkaXJlY3RseSB3aGVuIG1vcnBoaW5nLlxuICAgICAgICAgICAgLy8gQXQgdGhlIHRpbWUgdGhpcyBzcGVjaWFsIGhhbmRsZXIgaXMgaW52b2tlZCwgYWxsIGNoaWxkcmVuIGhhdmUgYWxyZWFkeSBiZWVuIG1vcnBoZWRcbiAgICAgICAgICAgIC8vIGFuZCBhcHBlbmRlZCB0byAvIHJlbW92ZWQgZnJvbSBmcm9tRWwsIHNvIHVzaW5nIGZyb21FbCBoZXJlIGlzIHNhZmUgYW5kIGNvcnJlY3QuXG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBvcHRncm91cDtcbiAgICAgICAgICAgIHZhciBub2RlTmFtZTtcbiAgICAgICAgICAgIHdoaWxlKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBjdXJDaGlsZC5ub2RlTmFtZSAmJiBjdXJDaGlsZC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgICAgICBvcHRncm91cCA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBlbXB0eSBvcHRncm91cHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGlsZC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1ckNoaWxkICYmIG9wdGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0Z3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcm9tRWwuc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFJDEgPSAxMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBkZWZhdWx0R2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkgfHwgbm9kZS5pZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycykge1xuXG4gIHJldHVybiBmdW5jdGlvbiBtb3JwaGRvbShmcm9tTm9kZSwgdG9Ob2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0b05vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoZnJvbU5vZGUubm9kZU5hbWUgPT09ICcjZG9jdW1lbnQnIHx8IGZyb21Ob2RlLm5vZGVOYW1lID09PSAnSFRNTCcgfHwgZnJvbU5vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICB2YXIgdG9Ob2RlSHRtbCA9IHRvTm9kZTtcbiAgICAgICAgdG9Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKTtcbiAgICAgICAgdG9Ob2RlLmlubmVySFRNTCA9IHRvTm9kZUh0bWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b05vZGUgPSB0b0VsZW1lbnQodG9Ob2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICB0b05vZGUgPSB0b05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgfVxuXG4gICAgdmFyIGdldE5vZGVLZXkgPSBvcHRpb25zLmdldE5vZGVLZXkgfHwgZGVmYXVsdEdldE5vZGVLZXk7XG4gICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVBZGRlZCA9IG9wdGlvbnMub25Ob2RlQWRkZWQgfHwgbm9vcDtcbiAgICB2YXIgb25CZWZvcmVFbFVwZGF0ZWQgPSBvcHRpb25zLm9uQmVmb3JlRWxVcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZU5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIHNraXBGcm9tQ2hpbGRyZW4gPSBvcHRpb25zLnNraXBGcm9tQ2hpbGRyZW4gfHwgbm9vcDtcbiAgICB2YXIgYWRkQ2hpbGQgPSBvcHRpb25zLmFkZENoaWxkIHx8IGZ1bmN0aW9uKHBhcmVudCwgY2hpbGQpeyByZXR1cm4gcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTsgfTtcbiAgICB2YXIgY2hpbGRyZW5Pbmx5ID0gb3B0aW9ucy5jaGlsZHJlbk9ubHkgPT09IHRydWU7XG5cbiAgICAvLyBUaGlzIG9iamVjdCBpcyB1c2VkIGFzIGEgbG9va3VwIHRvIHF1aWNrbHkgZmluZCBhbGwga2V5ZWQgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgIHZhciBmcm9tTm9kZXNMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXllZFJlbW92YWxMaXN0ID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRLZXllZFJlbW92YWwoa2V5KSB7XG4gICAgICBrZXllZFJlbW92YWxMaXN0LnB1c2goa2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB2YXIgY3VyQ2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuXG4gICAgICAgICAgdmFyIGtleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChza2lwS2V5ZWROb2RlcyAmJiAoa2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCkpKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgc2tpcHBpbmcga2V5ZWQgbm9kZXMgdGhlbiB3ZSBhZGQgdGhlIGtleVxuICAgICAgICAgICAgLy8gdG8gYSBsaXN0IHNvIHRoYXQgaXQgY2FuIGJlIGhhbmRsZWQgYXQgdGhlIHZlcnkgZW5kLlxuICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBub2RlIGFzIGRpc2NhcmRlZCBpZiBpdCBpcyBub3Qga2V5ZWQuIFdlIGRvIHRoaXMgYmVjYXVzZVxuICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCB3ZSBsb29wIHRocm91Z2ggYWxsIGtleWVkIGVsZW1lbnRzIHRoYXQgd2VyZSB1bm1hdGNoZWRcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSBpbiBvbmUgZmluYWwgcGFzcy5cbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICBpZiAoY3VyQ2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2RlcyhjdXJDaGlsZCwgc2tpcEtleWVkTm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJlbW92ZXMgYSBET00gbm9kZSBvdXQgb2YgdGhlIG9yaWdpbmFsIERPTVxuICAgICpcbiAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlXG4gICAgKiBAcGFyYW0gIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBub2RlcyBwYXJlbnRcbiAgICAqIEBwYXJhbSAge0Jvb2xlYW59IHNraXBLZXllZE5vZGVzIElmIHRydWUgdGhlbiBlbGVtZW50cyB3aXRoIGtleXMgd2lsbCBiZSBza2lwcGVkIGFuZCBub3QgZGlzY2FyZGVkLlxuICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlLCBwYXJlbnROb2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG9uQmVmb3JlTm9kZURpc2NhcmRlZChub2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBvbk5vZGVEaXNjYXJkZWQobm9kZSk7XG4gICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgfVxuXG4gICAgLy8gLy8gVHJlZVdhbGtlciBpbXBsZW1lbnRhdGlvbiBpcyBubyBmYXN0ZXIsIGJ1dCBrZWVwaW5nIHRoaXMgYXJvdW5kIGluIGNhc2UgdGhpcyBjaGFuZ2VzIGluIHRoZSBmdXR1cmVcbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUocm9vdCkge1xuICAgIC8vICAgICB2YXIgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgLy8gICAgICAgICByb290LFxuICAgIC8vICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICAgIC8vXG4gICAgLy8gICAgIHZhciBlbDtcbiAgICAvLyAgICAgd2hpbGUoKGVsID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpKSkge1xuICAgIC8vICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoZWwpO1xuICAgIC8vICAgICAgICAgaWYgKGtleSkge1xuICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyAvLyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUobm9kZSkge1xuICAgIC8vICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICAvLyAgICAgdmFyIGVsO1xuICAgIC8vICAgICB3aGlsZSgoZWwgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAvLyAgICAgICAgIGlmIChrZXkpIHtcbiAgICAvLyAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGVsO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgZnVuY3Rpb24gaW5kZXhUcmVlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICAgIHZhciBjdXJDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgIGluZGV4VHJlZShjdXJDaGlsZCk7XG5cbiAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5kZXhUcmVlKGZyb21Ob2RlKTtcblxuICAgIGZ1bmN0aW9uIGhhbmRsZU5vZGVBZGRlZChlbCkge1xuICAgICAgb25Ob2RlQWRkZWQoZWwpO1xuXG4gICAgICB2YXIgY3VyQ2hpbGQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0U2libGluZyA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIHZhciB1bm1hdGNoZWRGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBba2V5XTtcbiAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgZHVwbGljYXRlICNpZCBub2RlIGluIGNhY2hlLCByZXBsYWNlIGBlbGAgd2l0aCBjYWNoZSB2YWx1ZVxuICAgICAgICAgIC8vIGFuZCBtb3JwaCBpdCB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICBpZiAodW5tYXRjaGVkRnJvbUVsICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyQ2hpbGQsIHVubWF0Y2hlZEZyb21FbCkpIHtcbiAgICAgICAgICAgIGN1ckNoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgbW9ycGhFbCh1bm1hdGNoZWRGcm9tRWwsIGN1ckNoaWxkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBmb3IgY3VyQ2hpbGQgYW5kIGl0J3MgY2hpbGRyZW4gdG8gc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nIGluXG4gICAgICAgICAgLy8gZnJvbU5vZGVzTG9va3VwXG4gICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1ckNoaWxkID0gbmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgb2YgdGhlIFwidG8gbm9kZXNcIi4gSWYgY3VyRnJvbU5vZGVDaGlsZCBpc1xuICAgICAgLy8gbm9uLW51bGwgdGhlbiB3ZSBzdGlsbCBoYXZlIHNvbWUgZnJvbSBub2RlcyBsZWZ0IG92ZXIgdGhhdCBuZWVkXG4gICAgICAvLyB0byBiZSByZW1vdmVkXG4gICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICB2YXIgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgaWYgKChjdXJGcm9tTm9kZUtleSA9IGdldE5vZGVLZXkoY3VyRnJvbU5vZGVDaGlsZCkpKSB7XG4gICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vcnBoRWwoZnJvbUVsLCB0b0VsLCBjaGlsZHJlbk9ubHkpIHtcbiAgICAgIHZhciB0b0VsS2V5ID0gZ2V0Tm9kZUtleSh0b0VsKTtcblxuICAgICAgaWYgKHRvRWxLZXkpIHtcbiAgICAgICAgLy8gSWYgYW4gZWxlbWVudCB3aXRoIGFuIElEIGlzIGJlaW5nIG1vcnBoZWQgdGhlbiBpdCB3aWxsIGJlIGluIHRoZSBmaW5hbFxuICAgICAgICAvLyBET00gc28gY2xlYXIgaXQgb3V0IG9mIHRoZSBzYXZlZCBlbGVtZW50cyBjb2xsZWN0aW9uXG4gICAgICAgIGRlbGV0ZSBmcm9tTm9kZXNMb29rdXBbdG9FbEtleV07XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgIHZhciBiZWZvcmVVcGRhdGVSZXN1bHQgPSBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpO1xuICAgICAgICBpZiAoYmVmb3JlVXBkYXRlUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChiZWZvcmVVcGRhdGVSZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgIGZyb21FbCA9IGJlZm9yZVVwZGF0ZVJlc3VsdDtcbiAgICAgICAgICAvLyByZWluZGV4IHRoZSBuZXcgZnJvbUVsIGluIGNhc2UgaXQncyBub3QgaW4gdGhlIHNhbWVcbiAgICAgICAgICAvLyB0cmVlIGFzIHRoZSBvcmlnaW5hbCBmcm9tRWxcbiAgICAgICAgICAvLyAoUGhvZW5peCBMaXZlVmlldyBzb21ldGltZXMgcmV0dXJucyBhIGNsb25lZCB0cmVlLFxuICAgICAgICAgIC8vICBidXQga2V5ZWQgbG9va3VwcyB3b3VsZCBzdGlsbCBwb2ludCB0byB0aGUgb3JpZ2luYWwgdHJlZSlcbiAgICAgICAgICBpbmRleFRyZWUoZnJvbUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50IGZpcnN0XG4gICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgLy8gb3B0aW9uYWxcbiAgICAgICAgb25FbFVwZGF0ZWQoZnJvbUVsKTtcblxuICAgICAgICBpZiAob25CZWZvcmVFbENoaWxkcmVuVXBkYXRlZChmcm9tRWwsIHRvRWwpID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZnJvbUVsLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXJzLlRFWFRBUkVBKGZyb21FbCwgdG9FbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9ycGhDaGlsZHJlbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgIHZhciBza2lwRnJvbSA9IHNraXBGcm9tQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIHZhciBjdXJUb05vZGVDaGlsZCA9IHRvRWwuZmlyc3RDaGlsZDtcbiAgICAgIHZhciBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgICB2YXIgY3VyVG9Ob2RlS2V5O1xuICAgICAgdmFyIGN1ckZyb21Ob2RlS2V5O1xuXG4gICAgICB2YXIgZnJvbU5leHRTaWJsaW5nO1xuICAgICAgdmFyIHRvTmV4dFNpYmxpbmc7XG4gICAgICB2YXIgbWF0Y2hpbmdGcm9tRWw7XG5cbiAgICAgIC8vIHdhbGsgdGhlIGNoaWxkcmVuXG4gICAgICBvdXRlcjogd2hpbGUgKGN1clRvTm9kZUNoaWxkKSB7XG4gICAgICAgIHRvTmV4dFNpYmxpbmcgPSBjdXJUb05vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgY3VyVG9Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJUb05vZGVDaGlsZCk7XG5cbiAgICAgICAgLy8gd2FsayB0aGUgZnJvbU5vZGUgY2hpbGRyZW4gYWxsIHRoZSB3YXkgdGhyb3VnaFxuICAgICAgICB3aGlsZSAoIXNraXBGcm9tICYmIGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgaWYgKGN1clRvTm9kZUNoaWxkLmlzU2FtZU5vZGUgJiYgY3VyVG9Ob2RlQ2hpbGQuaXNTYW1lTm9kZShjdXJGcm9tTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgIHZhciBjdXJGcm9tTm9kZVR5cGUgPSBjdXJGcm9tTm9kZUNoaWxkLm5vZGVUeXBlO1xuXG4gICAgICAgICAgLy8gdGhpcyBtZWFucyBpZiB0aGUgY3VyRnJvbU5vZGVDaGlsZCBkb2VzbnQgaGF2ZSBhIG1hdGNoIHdpdGggdGhlIGN1clRvTm9kZUNoaWxkXG4gICAgICAgICAgdmFyIGlzQ29tcGF0aWJsZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IGN1clRvTm9kZUNoaWxkLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgRWxlbWVudCBub2Rlc1xuXG4gICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG5vZGUgaGFzIGEga2V5IHNvIHdlIHdhbnQgdG8gbWF0Y2ggaXQgdXAgd2l0aCB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAhPT0gY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBrZXkgc29cbiAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGNoZWNrIG91ciBsb29rdXAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgIC8vIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgICBpZiAoKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tTmV4dFNpYmxpbmcgPT09IG1hdGNoaW5nRnJvbUVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzaW5nbGUgZWxlbWVudCByZW1vdmFscy4gVG8gYXZvaWQgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIG5vZGUgb3V0IG9mIHRoZSB0cmVlIChzaW5jZSB0aGF0IGNhbiBicmVhayBDU1MgdHJhbnNpdGlvbnMsIGV0Yy4pLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgaW5zdGVhZCBkaXNjYXJkIHRoZSBjdXJyZW50IG5vZGUgYW5kIHdhaXQgdW50aWwgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdG8gcHJvcGVybHkgbWF0Y2ggdXAgdGhlIGtleWVkIHRhcmdldCBlbGVtZW50IHdpdGggaXRzIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcga2V5ZWQgZWxlbWVudCBzb21ld2hlcmUgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIG1vdmUgdGhlIG9yaWdpbmFsIERPTSBub2RlIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIG1vcnBoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBXZSB1c2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgcmVwbGFjZUNoaWxkIGJlY2F1c2Ugd2Ugd2FudCB0byBnbyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGByZW1vdmVOb2RlKClgIGZ1bmN0aW9uIGZvciB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGRpc2NhcmRlZCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBob29rcyBhcmUgY29ycmVjdGx5IGludm9rZWRcbiAgICAgICAgICAgICAgICAgICAgICBmcm9tRWwuaW5zZXJ0QmVmb3JlKG1hdGNoaW5nRnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb21OZXh0U2libGluZyA9IGN1ckZyb21Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBub2RlIGlzIGtleWVkIGl0IG1pZ2h0IGJlIG1hdGNoZWQgdXAgbGF0ZXIgc28gd2UgZGVmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IG1hdGNoaW5nRnJvbUVsO1xuICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGVzIGFyZSBub3QgY29tcGF0aWJsZSBzaW5jZSB0aGUgXCJ0b1wiIG5vZGUgaGFzIGEga2V5IGFuZCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBtYXRjaGluZyBrZXllZCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZVxuICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaGFzIGEga2V5XG4gICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBpc0NvbXBhdGlibGUgIT09IGZhbHNlICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgY29tcGF0aWJsZSBET00gZWxlbWVudHMgc28gdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgXCJmcm9tXCIgbm9kZSB0byBtYXRjaCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHRhcmdldCBET00gbm9kZS5cbiAgICAgICAgICAgICAgICAvLyBNT1JQSFxuICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBURVhUX05PREUgfHwgY3VyRnJvbU5vZGVUeXBlID09IENPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGJlaW5nIGNvbXBhcmVkIGFyZSBUZXh0IG9yIENvbW1lbnQgbm9kZXNcbiAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gU2ltcGx5IHVwZGF0ZSBub2RlVmFsdWUgb24gdGhlIG9yaWdpbmFsIG5vZGUgdG9cbiAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSAhPT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZC5ub2RlVmFsdWUgPSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0NvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIC8vIEFkdmFuY2UgYm90aCB0aGUgXCJ0b1wiIGNoaWxkIGFuZCB0aGUgXCJmcm9tXCIgY2hpbGQgc2luY2Ugd2UgZm91bmQgYSBtYXRjaFxuICAgICAgICAgICAgLy8gTm90aGluZyBlbHNlIHRvIGRvIGFzIHdlIGFscmVhZHkgcmVjdXJzaXZlbHkgY2FsbGVkIG1vcnBoQ2hpbGRyZW4gYWJvdmVcbiAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gdG9OZXh0U2libGluZztcbiAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBObyBjb21wYXRpYmxlIG1hdGNoIHNvIHJlbW92ZSB0aGUgb2xkIG5vZGUgZnJvbSB0aGUgRE9NIGFuZCBjb250aW51ZSB0cnlpbmcgdG8gZmluZCBhXG4gICAgICAgICAgLy8gbWF0Y2ggaW4gdGhlIG9yaWdpbmFsIERPTS4gSG93ZXZlciwgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSBmcm9tIG5vZGUgaXMgbm90IGtleWVkXG4gICAgICAgICAgLy8gc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCBhIGtleWVkIG5vZGUgbWlnaHQgbWF0Y2ggdXAgd2l0aCBhIG5vZGUgc29tZXdoZXJlIGVsc2UgaW4gdGhlXG4gICAgICAgICAgLy8gdGFyZ2V0IHRyZWUgYW5kIHdlIGRvbid0IHdhbnQgdG8gZGlzY2FyZCBpdCBqdXN0IHlldCBzaW5jZSBpdCBzdGlsbCBtaWdodCBmaW5kIGFcbiAgICAgICAgICAvLyBob21lIGluIHRoZSBmaW5hbCBET00gdHJlZS4gQWZ0ZXIgZXZlcnl0aGluZyBpcyBkb25lIHdlIHdpbGwgcmVtb3ZlIGFueSBrZXllZCBub2Rlc1xuICAgICAgICAgIC8vIHRoYXQgZGlkbid0IGZpbmQgYSBob21lXG4gICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCB0cnVlIC8qIHNraXAga2V5ZWQgbm9kZXMgKi8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgIH0gLy8gRU5EOiB3aGlsZShjdXJGcm9tTm9kZUNoaWxkKSB7fVxuXG4gICAgICAgIC8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIHdlIGRpZCBub3QgZmluZCBhIGNhbmRpZGF0ZSBtYXRjaCBmb3JcbiAgICAgICAgLy8gb3VyIFwidG8gbm9kZVwiIGFuZCB3ZSBleGhhdXN0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBcImZyb21cIlxuICAgICAgICAvLyBub2Rlcy4gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgYXBwZW5kIHRoZSBjdXJyZW50IFwidG9cIiBub2RlXG4gICAgICAgIC8vIHRvIHRoZSBlbmRcbiAgICAgICAgaWYgKGN1clRvTm9kZUtleSAmJiAobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkgJiYgY29tcGFyZU5vZGVOYW1lcyhtYXRjaGluZ0Zyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgLy8gTU9SUEhcbiAgICAgICAgICBpZighc2tpcEZyb20peyBhZGRDaGlsZChmcm9tRWwsIG1hdGNoaW5nRnJvbUVsKTsgfVxuICAgICAgICAgIG1vcnBoRWwobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgPSBvbkJlZm9yZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUpIHtcbiAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSBjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUoZnJvbUVsLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZENoaWxkKGZyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSk7XG5cbiAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgIGlmIChzcGVjaWFsRWxIYW5kbGVyKSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXIoZnJvbUVsLCB0b0VsKTtcbiAgICAgIH1cbiAgICB9IC8vIEVORDogbW9ycGhDaGlsZHJlbiguLi4pXG5cbiAgICB2YXIgbW9ycGhlZE5vZGUgPSBmcm9tTm9kZTtcbiAgICB2YXIgbW9ycGhlZE5vZGVUeXBlID0gbW9ycGhlZE5vZGUubm9kZVR5cGU7XG4gICAgdmFyIHRvTm9kZVR5cGUgPSB0b05vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnaXZlbiB0d28gRE9NIG5vZGVzIHRoYXQgYXJlIG5vdFxuICAgICAgLy8gY29tcGF0aWJsZSAoZS5nLiA8ZGl2PiAtLT4gPHNwYW4+IG9yIDxkaXY+IC0tPiBURVhUKVxuICAgICAgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICBpZiAoIWNvbXBhcmVOb2RlTmFtZXMoZnJvbU5vZGUsIHRvTm9kZSkpIHtcbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChmcm9tTm9kZSk7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZSA9IG1vdmVDaGlsZHJlbihmcm9tTm9kZSwgY3JlYXRlRWxlbWVudE5TKHRvTm9kZS5ub2RlTmFtZSwgdG9Ob2RlLm5hbWVzcGFjZVVSSSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBHb2luZyBmcm9tIGFuIGVsZW1lbnQgbm9kZSB0byBhIHRleHQgbm9kZVxuICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gVEVYVF9OT0RFIHx8IG1vcnBoZWROb2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7IC8vIFRleHQgb3IgY29tbWVudCBub2RlXG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBtb3JwaGVkTm9kZVR5cGUpIHtcbiAgICAgICAgICBpZiAobW9ycGhlZE5vZGUubm9kZVZhbHVlICE9PSB0b05vZGUubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZS5ub2RlVmFsdWUgPSB0b05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUZXh0IG5vZGUgdG8gc29tZXRoaW5nIGVsc2VcbiAgICAgICAgICBtb3JwaGVkTm9kZSA9IHRvTm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb3JwaGVkTm9kZSA9PT0gdG9Ob2RlKSB7XG4gICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAvLyB0b3NzIG91dCB0aGUgXCJmcm9tIG5vZGVcIiBhbmQgdXNlIHRoZSBcInRvIG5vZGVcIlxuICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRvTm9kZS5pc1NhbWVOb2RlICYmIHRvTm9kZS5pc1NhbWVOb2RlKG1vcnBoZWROb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG1vcnBoRWwobW9ycGhlZE5vZGUsIHRvTm9kZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgLy8gV2Ugbm93IG5lZWQgdG8gbG9vcCBvdmVyIGFueSBrZXllZCBub2RlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmVcbiAgICAgIC8vIHJlbW92ZWQuIFdlIG9ubHkgZG8gdGhlIHJlbW92YWwgaWYgd2Uga25vdyB0aGF0IHRoZSBrZXllZCBub2RlXG4gICAgICAvLyBuZXZlciBmb3VuZCBhIG1hdGNoLiBXaGVuIGEga2V5ZWQgbm9kZSBpcyBtYXRjaGVkIHVwIHdlIHJlbW92ZVxuICAgICAgLy8gaXQgb3V0IG9mIGZyb21Ob2Rlc0xvb2t1cCBhbmQgd2UgdXNlIGZyb21Ob2Rlc0xvb2t1cCB0byBkZXRlcm1pbmVcbiAgICAgIC8vIGlmIGEga2V5ZWQgbm9kZSBoYXMgYmVlbiBtYXRjaGVkIHVwIG9yIG5vdFxuICAgICAgaWYgKGtleWVkUmVtb3ZhbExpc3QpIHtcbiAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49a2V5ZWRSZW1vdmFsTGlzdC5sZW5ndGg7IGk8bGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxUb1JlbW92ZSA9IGZyb21Ob2Rlc0xvb2t1cFtrZXllZFJlbW92YWxMaXN0W2ldXTtcbiAgICAgICAgICBpZiAoZWxUb1JlbW92ZSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShlbFRvUmVtb3ZlLCBlbFRvUmVtb3ZlLnBhcmVudE5vZGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSAmJiBtb3JwaGVkTm9kZSAhPT0gZnJvbU5vZGUgJiYgZnJvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKG1vcnBoZWROb2RlLmFjdHVhbGl6ZSkge1xuICAgICAgICBtb3JwaGVkTm9kZSA9IG1vcnBoZWROb2RlLmFjdHVhbGl6ZShmcm9tTm9kZS5vd25lckRvY3VtZW50IHx8IGRvYyk7XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSBoYWQgdG8gc3dhcCBvdXQgdGhlIGZyb20gbm9kZSB3aXRoIGEgbmV3IG5vZGUgYmVjYXVzZSB0aGUgb2xkXG4gICAgICAvLyBub2RlIHdhcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgbm9kZSB0aGVuIHdlIG5lZWQgdG9cbiAgICAgIC8vIHJlcGxhY2UgdGhlIG9sZCBET00gbm9kZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuIFRoaXMgaXMgb25seVxuICAgICAgLy8gcG9zc2libGUgaWYgdGhlIG9yaWdpbmFsIERPTSBub2RlIHdhcyBwYXJ0IG9mIGEgRE9NIHRyZWUgd2hpY2hcbiAgICAgIC8vIHdlIGtub3cgaXMgdGhlIGNhc2UgaWYgaXQgaGFzIGEgcGFyZW50IG5vZGUuXG4gICAgICBmcm9tTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtb3JwaGVkTm9kZSwgZnJvbU5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgfTtcbn1cblxudmFyIG1vcnBoZG9tID0gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpO1xuXG5leHBvcnQgZGVmYXVsdCBtb3JwaGRvbTtcbiIsICJpbXBvcnQge1xuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfUFJVTkUsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NLSVAsXG4gIFBIWF9NQUdJQ19JRCxcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1RSSUdHRVJfQUNUSU9OLFxuICBQSFhfVVBEQVRFLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfU1RSRUFNLFxuICBQSFhfU1RSRUFNX1JFRixcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfVEVMRVBPUlRFRF9TUkMsXG4gIFBIWF9SVU5USU1FX0hPT0ssXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBkZXRlY3REdXBsaWNhdGVJZHMsIGRldGVjdEludmFsaWRTdHJlYW1JbnNlcnRzLCBpc0NpZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgRWxlbWVudFJlZiBmcm9tIFwiLi9lbGVtZW50X3JlZlwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBET01Qb3N0TW9ycGhSZXN0b3JlciBmcm9tIFwiLi9kb21fcG9zdF9tb3JwaF9yZXN0b3JlclwiO1xuaW1wb3J0IG1vcnBoZG9tIGZyb20gXCJtb3JwaGRvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01QYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHZpZXcsIGNvbnRhaW5lciwgaWQsIGh0bWwsIHN0cmVhbXMsIHRhcmdldENJRCwgb3B0cyA9IHt9KSB7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXQ7XG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucm9vdElEID0gdmlldy5yb290LmlkO1xuICAgIHRoaXMuaHRtbCA9IGh0bWw7XG4gICAgdGhpcy5zdHJlYW1zID0gc3RyZWFtcztcbiAgICB0aGlzLnN0cmVhbUluc2VydHMgPSB7fTtcbiAgICB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmUgPSB7fTtcbiAgICB0aGlzLnRhcmdldENJRCA9IHRhcmdldENJRDtcbiAgICB0aGlzLmNpZFBhdGNoID0gaXNDaWQodGhpcy50YXJnZXRDSUQpO1xuICAgIHRoaXMucGVuZGluZ1JlbW92ZXMgPSBbXTtcbiAgICB0aGlzLnBoeFJlbW92ZSA9IHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKFwicmVtb3ZlXCIpO1xuICAgIHRoaXMudGFyZ2V0Q29udGFpbmVyID0gdGhpcy5pc0NJRFBhdGNoKClcbiAgICAgID8gdGhpcy50YXJnZXRDSURDb250YWluZXIoaHRtbClcbiAgICAgIDogY29udGFpbmVyO1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge1xuICAgICAgYmVmb3JlYWRkZWQ6IFtdLFxuICAgICAgYmVmb3JldXBkYXRlZDogW10sXG4gICAgICBiZWZvcmVwaHhDaGlsZEFkZGVkOiBbXSxcbiAgICAgIGFmdGVyYWRkZWQ6IFtdLFxuICAgICAgYWZ0ZXJ1cGRhdGVkOiBbXSxcbiAgICAgIGFmdGVyZGlzY2FyZGVkOiBbXSxcbiAgICAgIGFmdGVycGh4Q2hpbGRBZGRlZDogW10sXG4gICAgICBhZnRlcnRyYW5zaXRpb25zRGlzY2FyZGVkOiBbXSxcbiAgICB9O1xuICAgIHRoaXMud2l0aENoaWxkcmVuID0gb3B0cy53aXRoQ2hpbGRyZW4gfHwgb3B0cy51bmRvUmVmIHx8IGZhbHNlO1xuICAgIHRoaXMudW5kb1JlZiA9IG9wdHMudW5kb1JlZjtcbiAgfVxuXG4gIGJlZm9yZShraW5kLCBjYWxsYmFjaykge1xuICAgIHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cbiAgYWZ0ZXIoa2luZCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICB0cmFja0JlZm9yZShraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGJlZm9yZSR7a2luZH1gXS5mb3JFYWNoKChjYWxsYmFjaykgPT4gY2FsbGJhY2soLi4uYXJncykpO1xuICB9XG5cbiAgdHJhY2tBZnRlcihraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGFmdGVyJHtraW5kfWBdLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayguLi5hcmdzKSk7XG4gIH1cblxuICBtYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpIHtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhQSFhfVVBEQVRFKTtcbiAgICBET00uYWxsKFxuICAgICAgdGhpcy5jb250YWluZXIsXG4gICAgICBgWyR7cGh4VXBkYXRlfT1hcHBlbmRdID4gKiwgWyR7cGh4VXBkYXRlfT1wcmVwZW5kXSA+ICpgLFxuICAgICAgKGVsKSA9PiB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUFJVTkUsIFwiXCIpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcGVyZm9ybShpc0pvaW5QYXRjaCkge1xuICAgIGNvbnN0IHsgdmlldywgbGl2ZVNvY2tldCwgaHRtbCwgY29udGFpbmVyIH0gPSB0aGlzO1xuICAgIGxldCB0YXJnZXRDb250YWluZXIgPSB0aGlzLnRhcmdldENvbnRhaW5lcjtcblxuICAgIGlmICh0aGlzLmlzQ0lEUGF0Y2goKSAmJiAhdGhpcy50YXJnZXRDb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NJRFBhdGNoKCkpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L3B1bGwvMzk0MlxuICAgICAgLy8gd2UgbmVlZCB0byBlbnN1cmUgdGhhdCBubyBwYXJlbnQgaXMgbG9ja2VkXG4gICAgICBjb25zdCBjbG9zZXN0TG9jayA9IHRhcmdldENvbnRhaW5lci5jbG9zZXN0KGBbJHtQSFhfUkVGX0xPQ0t9XWApO1xuICAgICAgaWYgKGNsb3Nlc3RMb2NrKSB7XG4gICAgICAgIGNvbnN0IGNsb25lZFRyZWUgPSBET00ucHJpdmF0ZShjbG9zZXN0TG9jaywgUEhYX1JFRl9MT0NLKTtcbiAgICAgICAgaWYgKGNsb25lZFRyZWUpIHtcbiAgICAgICAgICAvLyBpZiBhIHBhcmVudCBpcyBsb2NrZWQgd2l0aCBhIGNsb25lZCB0cmVlLCB3ZSBuZWVkIHRvIHBhdGNoIHRoZSBjbG9uZWQgdHJlZSBpbnN0ZWFkXG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyID0gY2xvbmVkVHJlZS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgYFtkYXRhLXBoeC1jb21wb25lbnQ9XCIke3RoaXMudGFyZ2V0Q0lEfVwiXWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvY3VzZWQgPSBsaXZlU29ja2V0LmdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9XG4gICAgICBmb2N1c2VkICYmIERPTS5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSA/IGZvY3VzZWQgOiB7fTtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1VQREFURSk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRCb3R0b20gPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX0JPVFRPTSk7XG4gICAgY29uc3QgcGh4VHJpZ2dlckV4dGVybmFsID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9UUklHR0VSX0FDVElPTik7XG4gICAgY29uc3QgYWRkZWQgPSBbXTtcbiAgICBjb25zdCB1cGRhdGVzID0gW107XG4gICAgY29uc3QgYXBwZW5kUHJlcGVuZFVwZGF0ZXMgPSBbXTtcblxuICAgIC8vIGFzIHRoZSBwb3J0YWwgdGFyZ2V0IGl0c2VsZiBjb3VsZCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBET00sXG4gICAgLy8gaXQgbWF5IG5vdCBiZSBwcmVzZW50IHdoaWxlIG1vcnBoaW5nIHByZXZpb3VzIHBhcnRzO1xuICAgIC8vIHRoZXJlZm9yZSB3ZSBhcHBseSBhbGwgdGVsZXBvcnRzIGFmdGVyIHRoZSBtb3JwaGluZyBpcyBkb25lK1xuICAgIGNvbnN0IHBvcnRhbENhbGxiYWNrcyA9IFtdO1xuXG4gICAgbGV0IGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IG51bGw7XG5cbiAgICBjb25zdCBtb3JwaCA9IChcbiAgICAgIHRhcmdldENvbnRhaW5lcixcbiAgICAgIHNvdXJjZSxcbiAgICAgIHdpdGhDaGlsZHJlbiA9IHRoaXMud2l0aENoaWxkcmVuLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgbW9ycGhDYWxsYmFja3MgPSB7XG4gICAgICAgIC8vIG5vcm1hbGx5LCB3ZSBhcmUgcnVubmluZyB3aXRoIGNoaWxkcmVuT25seSwgYXMgdGhlIHBhdGNoIEhUTUwgZm9yIGEgTFZcbiAgICAgICAgLy8gZG9lcyBub3QgaW5jbHVkZSB0aGUgTFYgYXR0cnMgKGRhdGEtcGh4LXNlc3Npb24sIGV0Yy4pXG4gICAgICAgIC8vIHdoZW4gd2UgYXJlIHBhdGNoaW5nIGEgbGl2ZSBjb21wb25lbnQsIHdlIGRvIHdhbnQgdG8gcGF0Y2ggdGhlIHJvb3QgZWxlbWVudCBhcyB3ZWxsO1xuICAgICAgICAvLyBhbm90aGVyIGNhc2UgaXMgdGhlIHJlY3Vyc2l2ZSBwYXRjaCBvZiBhIHN0cmVhbSBpdGVtIHRoYXQgd2FzIGtlcHQgb24gcmVzZXQgKC0+IG9uQmVmb3JlTm9kZUFkZGVkKVxuICAgICAgICBjaGlsZHJlbk9ubHk6XG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSA9PT0gbnVsbCAmJiAhd2l0aENoaWxkcmVuLFxuICAgICAgICBnZXROb2RlS2V5OiAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChET00uaXNQaHhEZXN0cm95ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgam9pbiBwYXRjaCwgdGhlbiBieSBkZWZpbml0aW9uIHRoZXJlIHdhcyBubyBQSFhfTUFHSUNfSUQuXG4gICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZWxlbWVudHMgbW9ycGhkb20gZGlzY2FyZHMuXG4gICAgICAgICAgaWYgKGlzSm9pblBhdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5pZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG5vZGUuaWQgfHwgKG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9NQUdJQ19JRCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gc2tpcCBpbmRleGluZyBmcm9tIGNoaWxkcmVuIHdoZW4gY29udGFpbmVyIGlzIHN0cmVhbVxuICAgICAgICBza2lwRnJvbUNoaWxkcmVuOiAoZnJvbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBmcm9tLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpID09PSBQSFhfU1RSRUFNO1xuICAgICAgICB9LFxuICAgICAgICAvLyB0ZWxsIG1vcnBoZG9tIGhvdyB0byBhZGQgYSBjaGlsZFxuICAgICAgICBhZGRDaGlsZDogKHBhcmVudCwgY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHJlZiwgc3RyZWFtQXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGNoaWxkKTtcbiAgICAgICAgICBpZiAocmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc2V0U3RyZWFtUmVmKGNoaWxkLCByZWYpO1xuXG4gICAgICAgICAgLy8gc3RyZWFtaW5nXG4gICAgICAgICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBjaGlsZCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1BdCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IHBhcmVudC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAmJiAhbGFzdENoaWxkLmhhc0F0dHJpYnV0ZShQSFhfU1RSRUFNX1JFRikpIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9uU3RyZWFtQ2hpbGQgPSBBcnJheS5mcm9tKHBhcmVudC5jaGlsZHJlbikuZmluZChcbiAgICAgICAgICAgICAgICAoYykgPT4gIWMuaGFzQXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbm9uU3RyZWFtQ2hpbGQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUF0ID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKVtzdHJlYW1BdF07XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBzaWJsaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlTm9kZUFkZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICAvLyBkb24ndCBhZGQgdXBkYXRlX29ubHkgbm9kZXMgaWYgdGhleSBkaWQgbm90IGFscmVhZHkgZXhpc3RcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmdldFN0cmVhbUluc2VydChlbCk/LnVwZGF0ZU9ubHkgJiZcbiAgICAgICAgICAgICF0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKGVsLCBlbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKTtcbiAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwiYWRkZWRcIiwgZWwpO1xuXG4gICAgICAgICAgbGV0IG1vcnBoZWRFbCA9IGVsO1xuICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJlYW0gaXRlbSB0aGF0IHdhcyBrZXB0IG9uIHJlc2V0LCByZWN1cnNpdmVseSBtb3JwaCBpdFxuICAgICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdKSB7XG4gICAgICAgICAgICBtb3JwaGVkRWwgPSB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtlbC5pZF07XG4gICAgICAgICAgICBtb3JwaChtb3JwaGVkRWwsIGVsLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbW9ycGhlZEVsO1xuICAgICAgICB9LFxuICAgICAgICBvbk5vZGVBZGRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXliZVJlT3JkZXJTdHJlYW0oZWwsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgcG9ydGFsQ2FsbGJhY2tzLnB1c2goKCkgPT4gdGhpcy50ZWxlcG9ydChlbCwgbW9ycGgpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBoYWNrIHRvIGZpeCBTYWZhcmkgaGFuZGxpbmcgb2YgaW1nIHNyY3NldCBhbmQgdmlkZW8gdGFnc1xuICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgZWwuc3Jjc2V0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1hc3NpZ25cbiAgICAgICAgICAgIGVsLnNyY3NldCA9IGVsLnNyY3NldDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCAmJiBlbC5hdXRvcGxheSkge1xuICAgICAgICAgICAgZWwucGxheSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoRE9NLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKSkge1xuICAgICAgICAgICAgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gZWw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoRE9NLmlzUGh4Q2hpbGQoZWwpICYmIHZpZXcub3duc0VsZW1lbnQoZWwpKSB8fFxuICAgICAgICAgICAgKERPTS5pc1BoeFN0aWNreShlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbC5wYXJlbnROb2RlKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tBZnRlcihcInBoeENoaWxkQWRkZWRcIiwgZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRhdGEtcGh4LXJ1bnRpbWUtaG9va1xuICAgICAgICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gXCJTQ1JJUFRcIiAmJiBlbC5oYXNBdHRyaWJ1dGUoUEhYX1JVTlRJTUVfSE9PSykpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkZWQucHVzaChlbCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTm9kZURpc2NhcmRlZDogKGVsKSA9PiB0aGlzLm9uTm9kZURpc2NhcmRlZChlbCksXG4gICAgICAgIG9uQmVmb3JlTm9kZURpc2NhcmRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BSVU5FKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQgIT09IG51bGwgJiZcbiAgICAgICAgICAgIGVsLmlkICYmXG4gICAgICAgICAgICBET00uaXNQaHhVcGRhdGUoZWwucGFyZW50RWxlbWVudCwgcGh4VXBkYXRlLCBbXG4gICAgICAgICAgICAgIFBIWF9TVFJFQU0sXG4gICAgICAgICAgICAgIFwiYXBwZW5kXCIsXG4gICAgICAgICAgICAgIFwicHJlcGVuZFwiLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZG9uJ3QgcmVtb3ZlIHRlbGVwb3J0ZWQgZWxlbWVudHNcbiAgICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHBvcnRhbCB0ZW1wbGF0ZSBpdHNlbGYgaXMgcmVtb3ZlZCwgcmVtb3ZlIHRoZSB0ZWxlcG9ydGVkIGVsZW1lbnQgYXMgd2VsbDtcbiAgICAgICAgICAgIC8vIHdlIGFsc28gcGVyZm9ybSBhIGNoZWNrIGFmdGVyIG1vcnBoZG9tIGlzIGZpbmlzaGVkIHRvIGNhdGNoIHBhcmVudCByZW1vdmFsc1xuICAgICAgICAgICAgY29uc3QgdGVsZXBvcnRlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICAgIGVsLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQuaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHRlbGVwb3J0ZWRFbCkge1xuICAgICAgICAgICAgICB0ZWxlcG9ydGVkRWwucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIG1vcnBoQ2FsbGJhY2tzLm9uTm9kZURpc2NhcmRlZCh0ZWxlcG9ydGVkRWwpO1xuICAgICAgICAgICAgICB0aGlzLnZpZXcuZHJvcFBvcnRhbEVsZW1lbnRJZCh0ZWxlcG9ydGVkRWwuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvbkVsVXBkYXRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKERPTS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCkpIHtcbiAgICAgICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IGVsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVzLnB1c2goZWwpO1xuICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGVsLCBmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgICAgLy8gaWYgd2UgYXJlIHBhdGNoaW5nIHRoZSByb290IHRhcmdldCBjb250YWluZXIgYW5kIHRoZSBpZCBoYXMgY2hhbmdlZCwgdHJlYXQgaXQgYXMgYSBuZXcgbm9kZVxuICAgICAgICAgIC8vIGJ5IHJlcGxhY2luZyB0aGUgZnJvbUVsIHdpdGggdGhlIHRvRWwsIHdoaWNoIGVuc3VyZXMgaG9va3MgYXJlIHRvcm4gZG93biBhbmQgcmUtY3JlYXRlZFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZyb21FbC5pZCAmJlxuICAgICAgICAgICAgZnJvbUVsLmlzU2FtZU5vZGUodGFyZ2V0Q29udGFpbmVyKSAmJlxuICAgICAgICAgICAgZnJvbUVsLmlkICE9PSB0b0VsLmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtb3JwaENhbGxiYWNrcy5vbk5vZGVEaXNjYXJkZWQoZnJvbUVsKTtcbiAgICAgICAgICAgIGZyb21FbC5yZXBsYWNlV2l0aCh0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiBtb3JwaENhbGxiYWNrcy5vbk5vZGVBZGRlZCh0b0VsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgRE9NLnN5bmNQZW5kaW5nQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICBET00ubWFpbnRhaW5Qcml2YXRlSG9va3MoXG4gICAgICAgICAgICBmcm9tRWwsXG4gICAgICAgICAgICB0b0VsLFxuICAgICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgICBwaHhWaWV3cG9ydEJvdHRvbSxcbiAgICAgICAgICApO1xuICAgICAgICAgIERPTS5jbGVhbkNoaWxkTm9kZXModG9FbCwgcGh4VXBkYXRlKTtcbiAgICAgICAgICBpZiAodGhpcy5za2lwQ0lEU2libGluZyh0b0VsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxpdmUgY29tcG9uZW50IHVzZWQgaW4gYSBzdHJlYW0sIHdlIG1heSBuZWVkIHRvIHJlb3JkZXIgaXRcbiAgICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChET00uaXNQaHhTdGlja3koZnJvbUVsKSkge1xuICAgICAgICAgICAgW1BIWF9TRVNTSU9OLCBQSFhfU1RBVElDLCBQSFhfUk9PVF9JRF1cbiAgICAgICAgICAgICAgLm1hcCgoYXR0cikgPT4gW1xuICAgICAgICAgICAgICAgIGF0dHIsXG4gICAgICAgICAgICAgICAgZnJvbUVsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmZvckVhY2goKFthdHRyLCBmcm9tVmFsLCB0b1ZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodG9WYWwgJiYgZnJvbVZhbCAhPT0gdG9WYWwpIHtcbiAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoYXR0ciwgdG9WYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSkgfHxcbiAgICAgICAgICAgIChmcm9tRWwuZm9ybSAmJiBmcm9tRWwuZm9ybS5pc1NhbWVOb2RlKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7XG4gICAgICAgICAgICAgIGlzSWdub3JlZDogRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZXMucHVzaChmcm9tRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmcm9tRWwudHlwZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZnJvbUVsLnZhbGlkaXR5ICYmXG4gICAgICAgICAgICBmcm9tRWwudmFsaWRpdHkuYmFkSW5wdXRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIFBIWF9SRUZfU1JDLCBpdCBpcyBsb2FkaW5nIG9yIGxvY2tlZCBhbmQgYXdhaXRpbmcgYW4gYWNrLlxuICAgICAgICAgIC8vIElmIGl0J3MgbG9ja2VkLCB3ZSBjbG9uZSB0aGUgZnJvbUVsIHRyZWUgYW5kIGluc3RydWN0IG1vcnBoZG9tIHRvIHVzZVxuICAgICAgICAgIC8vIHRoZSBjbG9uZWQgdHJlZSBhcyB0aGUgc291cmNlIG9mIHRoZSBtb3JwaCBmb3IgdGhpcyBicmFuY2ggZnJvbSBoZXJlIG9uIG91dC5cbiAgICAgICAgICAvLyBXZSBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBjbG9uZWQgdHJlZSBpbiB0aGUgZWxlbWVudCdzIHByaXZhdGUgZGF0YSwgYW5kXG4gICAgICAgICAgLy8gb24gYWNrICh2aWV3LnVuZG9SZWZzKSwgd2UgbW9ycGggdGhlIGNsb25lZCB0cmVlIHdpdGggdGhlIHRydWUgZnJvbUVsIGluIHRoZSBET00gdG9cbiAgICAgICAgICAvLyBhcHBseSBhbnkgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHdoaWxlIHRoZSBlbGVtZW50IHdhcyBsb2NrZWQuXG4gICAgICAgICAgY29uc3QgaXNGb2N1c2VkRm9ybUVsID1cbiAgICAgICAgICAgIGZvY3VzZWQgJiYgZnJvbUVsLmlzU2FtZU5vZGUoZm9jdXNlZCkgJiYgRE9NLmlzRm9ybUlucHV0KGZyb21FbCk7XG4gICAgICAgICAgY29uc3QgZm9jdXNlZFNlbGVjdENoYW5nZWQgPVxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmIHRoaXMuaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgaWYgKGZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSBuZXcgRWxlbWVudFJlZihmcm9tRWwpO1xuICAgICAgICAgICAgLy8gb25seSBwZXJmb3JtIHRoZSBjbG9uZSBzdGVwIGlmIHRoaXMgaXMgbm90IGEgcGF0Y2ggdGhhdCB1bmxvY2tzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHJlZi5sb2NrUmVmICYmXG4gICAgICAgICAgICAgICghdGhpcy51bmRvUmVmIHx8ICFyZWYuaXNMb2NrVW5kb25lQnkodGhpcy51bmRvUmVmKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoRE9NLmlzVXBsb2FkSW5wdXQoZnJvbUVsKSkge1xuICAgICAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwgeyBpc0lnbm9yZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVzLnB1c2goZnJvbUVsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICAgIGNvbnN0IGlzTG9ja2VkID0gZnJvbUVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuICAgICAgICAgICAgICBjb25zdCBjbG9uZSA9IGlzTG9ja2VkXG4gICAgICAgICAgICAgICAgPyBET00ucHJpdmF0ZShmcm9tRWwsIFBIWF9SRUZfTE9DSykgfHwgZnJvbUVsLmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoZnJvbUVsLCBQSFhfUkVGX0xPQ0ssIGNsb25lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNlZEZvcm1FbCkge1xuICAgICAgICAgICAgICAgICAgZnJvbUVsID0gY2xvbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoRE9NLmlzUGh4Q2hpbGQodG9FbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZTZXNzaW9uID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gICAgICAgICAgICBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHsgZXhjbHVkZTogW1BIWF9TVEFUSUNdIH0pO1xuICAgICAgICAgICAgaWYgKHByZXZTZXNzaW9uICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIHByZXZTZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdElEKTtcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhcmUgdW5kb2luZyBhIGxvY2ssIGNvcHkgcG90ZW50aWFsbHkgbmVzdGVkIGNsb25lcyBvdmVyXG4gICAgICAgICAgaWYgKHRoaXMudW5kb1JlZiAmJiBET00ucHJpdmF0ZSh0b0VsLCBQSFhfUkVGX0xPQ0spKSB7XG4gICAgICAgICAgICBET00ucHV0UHJpdmF0ZShcbiAgICAgICAgICAgICAgZnJvbUVsLFxuICAgICAgICAgICAgICBQSFhfUkVGX0xPQ0ssXG4gICAgICAgICAgICAgIERPTS5wcml2YXRlKHRvRWwsIFBIWF9SRUZfTE9DSyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBub3cgY29weSByZWd1bGFyIERPTS5wcml2YXRlIGRhdGFcbiAgICAgICAgICBET00uY29weVByaXZhdGVzKHRvRWwsIGZyb21FbCk7XG5cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKHRvRWwpKSB7XG4gICAgICAgICAgICBwb3J0YWxDYWxsYmFja3MucHVzaCgoKSA9PiB0aGlzLnRlbGVwb3J0KHRvRWwsIG1vcnBoKSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2tpcCBwYXRjaGluZyBmb2N1c2VkIGlucHV0cyB1bmxlc3MgZm9jdXMgaXMgYSBzZWxlY3QgdGhhdCBoYXMgY2hhbmdlZCBvcHRpb25zXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmXG4gICAgICAgICAgICBmcm9tRWwudHlwZSAhPT0gXCJoaWRkZW5cIiAmJlxuICAgICAgICAgICAgIWZvY3VzZWRTZWxlY3RDaGFuZ2VkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlRm9jdXNlZElucHV0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICBET00uc3luY0F0dHJzVG9Qcm9wcyhmcm9tRWwpO1xuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbCk7XG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJsdXIgZm9jdXNlZCBzZWxlY3QgaWYgaXQgY2hhbmdlZCBzbyBuYXRpdmUgVUkgaXMgdXBkYXRlZCAoaWUgc2FmYXJpIHdvbid0IHVwZGF0ZSB2aXNpYmxlIG9wdGlvbnMpXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFNlbGVjdENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgZnJvbUVsLmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChET00uaXNQaHhVcGRhdGUodG9FbCwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSkge1xuICAgICAgICAgICAgICBhcHBlbmRQcmVwZW5kVXBkYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBET01Qb3N0TW9ycGhSZXN0b3JlcihcbiAgICAgICAgICAgICAgICAgIGZyb21FbCxcbiAgICAgICAgICAgICAgICAgIHRvRWwsXG4gICAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIERPTS5zeW5jQXR0cnNUb1Byb3BzKHRvRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyh0b0VsKTtcbiAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICByZXR1cm4gZnJvbUVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIG1vcnBoZG9tKHRhcmdldENvbnRhaW5lciwgc291cmNlLCBtb3JwaENhbGxiYWNrcyk7XG4gICAgfTtcblxuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBjb250YWluZXIpO1xuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGNvbnRhaW5lciwgY29udGFpbmVyKTtcblxuICAgIGxpdmVTb2NrZXQudGltZShcIm1vcnBoZG9tXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RyZWFtcy5mb3JFYWNoKChbcmVmLCBpbnNlcnRzLCBkZWxldGVJZHMsIHJlc2V0XSkgPT4ge1xuICAgICAgICBpbnNlcnRzLmZvckVhY2goKFtrZXksIHN0cmVhbUF0LCBsaW1pdCwgdXBkYXRlT25seV0pID0+IHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUluc2VydHNba2V5XSA9IHsgcmVmLCBzdHJlYW1BdCwgbGltaXQsIHJlc2V0LCB1cGRhdGVPbmx5IH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIERPTS5hbGwoY29udGFpbmVyLCBgWyR7UEhYX1NUUkVBTV9SRUZ9PVwiJHtyZWZ9XCJdYCwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlSWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgW2lkPVwiJHtpZH1cIl1gKTtcbiAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU3RyZWFtQ2hpbGRFbGVtZW50KGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGNsZWFyIHN0cmVhbSBpdGVtcyBmcm9tIHRoZSBkZWFkIHJlbmRlciBpZiB0aGV5IGFyZSBub3QgaW5zZXJ0ZWQgYWdhaW5cbiAgICAgIGlmIChpc0pvaW5QYXRjaCkge1xuICAgICAgICBET00uYWxsKHRoaXMuY29udGFpbmVyLCBgWyR7cGh4VXBkYXRlfT0ke1BIWF9TVFJFQU19XWApXG4gICAgICAgICAgLy8gaXQgaXMgaW1wb3J0YW50IHRvIGZpbHRlciB0aGUgZWxlbWVudCBiZWZvcmUgcmVtb3ZpbmcgdGhlbSwgYXNcbiAgICAgICAgICAvLyBpdCBtYXkgaGFwcGVuIHRoYXQgc3RyZWFtcyBhcmUgbmVzdGVkIGFuZCB0aGUgb3duZXIgY2hlY2sgZmFpbHMgaWZcbiAgICAgICAgICAvLyBhIHBhcmVudCBpcyByZW1vdmVkIGJlZm9yZSBhIGNoaWxkXG4gICAgICAgICAgLmZpbHRlcigoZWwpID0+IHRoaXMudmlldy5vd25zRWxlbWVudChlbCkpXG4gICAgICAgICAgLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IHBlcmZvcm1lZCB0aGUgb3duZXIgY2hlY2ssIGVhY2ggY2hpbGQgaXMgZ3VhcmFudGVlZCB0byBiZSBvd25lZFxuICAgICAgICAgICAgICAvLyBieSB0aGUgdmlldy4gVG8gcHJldmVudCB0aGUgbmVzdGVkIG93bmVyIGNoZWNrIGZyb20gZmFpbGluZyBpbiBjYXNlIG9mIG5lc3RlZFxuICAgICAgICAgICAgICAvLyBzdHJlYW1zIHdoZXJlIHRoZSBwYXJlbnQgaXMgcmVtb3ZlZCBiZWZvcmUgdGhlIGNoaWxkLCB3ZSBmb3JjZSB0aGUgcmVtb3ZhbFxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbW9ycGgodGFyZ2V0Q29udGFpbmVyLCBodG1sKTtcbiAgICAgIC8vIG5vcm1hbCBwYXRjaCBjb21wbGV0ZSwgdGVsZXBvcnQgZWxlbWVudHMgbm93XG4gICAgICBwb3J0YWxDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKCkpO1xuICAgICAgLy8gY2hlY2sgZm9yIGFueSB0ZWxlcG9ydGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBpbiB0aGUgdmlldyBhbnkgbW9yZVxuICAgICAgLy8gYW5kIHJlbW92ZSB0aGVtXG4gICAgICB0aGlzLnZpZXcucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGVsKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kcm9wUG9ydGFsRWxlbWVudElkKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGxpdmVTb2NrZXQuaXNEZWJ1Z0VuYWJsZWQoKSkge1xuICAgICAgZGV0ZWN0RHVwbGljYXRlSWRzKCk7XG4gICAgICBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyh0aGlzLnN0cmVhbUluc2VydHMpO1xuICAgICAgLy8gd2FybiBpZiB0aGVyZSBhcmUgYW55IGlucHV0cyBuYW1lZCBcImlkXCJcbiAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImlucHV0W25hbWU9aWRdXCIpKS5mb3JFYWNoKFxuICAgICAgICAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBub2RlLmZvcm0pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdEZXRlY3RlZCBhbiBpbnB1dCB3aXRoIG5hbWU9XCJpZFwiIGluc2lkZSBhIGZvcm0hIFRoaXMgd2lsbCBjYXVzZSBwcm9ibGVtcyB3aGVuIHBhdGNoaW5nIHRoZSBET00uXFxuJyxcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXBwZW5kUHJlcGVuZFVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGl2ZVNvY2tldC50aW1lKFwicG9zdC1tb3JwaCBhcHBlbmQvcHJlcGVuZCByZXN0b3JhdGlvblwiLCAoKSA9PiB7XG4gICAgICAgIGFwcGVuZFByZXBlbmRVcGRhdGVzLmZvckVhY2goKHVwZGF0ZSkgPT4gdXBkYXRlLnBlcmZvcm0oKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXZlU29ja2V0LnNpbGVuY2VFdmVudHMoKCkgPT5cbiAgICAgIERPTS5yZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCksXG4gICAgKTtcbiAgICBET00uZGlzcGF0Y2hFdmVudChkb2N1bWVudCwgXCJwaHg6dXBkYXRlXCIpO1xuICAgIGFkZGVkLmZvckVhY2goKGVsKSA9PiB0aGlzLnRyYWNrQWZ0ZXIoXCJhZGRlZFwiLCBlbCkpO1xuICAgIHVwZGF0ZXMuZm9yRWFjaCgoZWwpID0+IHRoaXMudHJhY2tBZnRlcihcInVwZGF0ZWRcIiwgZWwpKTtcblxuICAgIHRoaXMudHJhbnNpdGlvblBlbmRpbmdSZW1vdmVzKCk7XG5cbiAgICBpZiAoZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkKSB7XG4gICAgICBsaXZlU29ja2V0LnVubG9hZCgpO1xuICAgICAgLy8gY2hlY2sgZm9yIHN1Ym1pdHRlciBhbmQgaW5qZWN0IGl0IGFzIGhpZGRlbiBpbnB1dCBmb3IgZXh0ZXJuYWwgc3VibWl0O1xuICAgICAgLy8gSW4gdGhlb3J5LCBpdCBjb3VsZCBoYXBwZW4gdGhhdCB0aGUgc3RvcmVkIHN1Ym1pdHRlciBpcyBvdXRkYXRlZCBhbmQgZG9lc24ndFxuICAgICAgLy8gZXhpc3QgaW4gdGhlIERPTSBhbnkgbW9yZSwgYnV0IHRoaXMgaXMgdW5saWtlbHksIHNvIHdlIGp1c3QgYWNjZXB0IGl0IGZvciBub3cuXG4gICAgICBjb25zdCBzdWJtaXR0ZXIgPSBET00ucHJpdmF0ZShleHRlcm5hbEZvcm1UcmlnZ2VyZWQsIFwic3VibWl0dGVyXCIpO1xuICAgICAgaWYgKHN1Ym1pdHRlciAmJiBzdWJtaXR0ZXIubmFtZSAmJiB0YXJnZXRDb250YWluZXIuY29udGFpbnMoc3VibWl0dGVyKSkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIGNvbnN0IGZvcm1JZCA9IHN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtXCIpO1xuICAgICAgICBpZiAoZm9ybUlkKSB7XG4gICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwiZm9ybVwiLCBmb3JtSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICAgICAgaW5wdXQudmFsdWUgPSBzdWJtaXR0ZXIudmFsdWU7XG4gICAgICAgIHN1Ym1pdHRlci5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShpbnB1dCwgc3VibWl0dGVyKTtcbiAgICAgIH1cbiAgICAgIC8vIHVzZSBwcm90b3R5cGUncyBzdWJtaXQgaW4gY2FzZSB0aGVyZSdzIGEgZm9ybSBjb250cm9sIHdpdGggbmFtZSBvciBpZCBvZiBcInN1Ym1pdFwiXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEZvcm1FbGVtZW50L3N1Ym1pdFxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkuc3VibWl0LmNhbGwoXG4gICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25Ob2RlRGlzY2FyZGVkKGVsKSB7XG4gICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICBpZiAoRE9NLmlzUGh4Q2hpbGQoZWwpIHx8IERPTS5pc1BoeFN0aWNreShlbCkpIHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5kZXN0cm95Vmlld0J5RWwoZWwpO1xuICAgIH1cbiAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJkaXNjYXJkZWRcIiwgZWwpO1xuICB9XG5cbiAgbWF5YmVQZW5kaW5nUmVtb3ZlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUodGhpcy5waHhSZW1vdmUpICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBlbmRpbmdSZW1vdmVzLnB1c2gobm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgZm9yY2UgPSBmYWxzZSkge1xuICAgIC8vIG1ha2Ugc3VyZSB0byBvbmx5IHJlbW92ZSBlbGVtZW50cyBvd25lZCBieSB0aGUgY3VycmVudCB2aWV3XG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zMDQ3XG4gICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zNjgxXG4gICAgaWYgKCFmb3JjZSAmJiAhdGhpcy52aWV3Lm93bnNFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG5vZGUgaWYgaXQgaXMgYWN0dWFsbHkgcmUtYWRkZWQgaW4gdGhlIHNhbWUgcGF0Y2hcbiAgICAvLyB3ZSBkbyBOT1Qgd2FudCB0byBleGVjdXRlIHBoeC1yZW1vdmUsIHdlIGRvIE5PVCB3YW50IHRvIGNhbGwgb25Ob2RlRGlzY2FyZGVkXG4gICAgaWYgKHRoaXMuc3RyZWFtSW5zZXJ0c1tjaGlsZC5pZF0pIHtcbiAgICAgIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtjaGlsZC5pZF0gPSBjaGlsZDtcbiAgICAgIGNoaWxkLnJlbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IHJlbW92ZSB0aGUgZWxlbWVudCBub3cgaWYgaXQgaGFzIG5vIHBoeC1yZW1vdmUgYmluZGluZ1xuICAgICAgaWYgKCF0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShjaGlsZCkpIHtcbiAgICAgICAgY2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRTdHJlYW1JbnNlcnQoZWwpIHtcbiAgICBjb25zdCBpbnNlcnQgPSBlbC5pZCA/IHRoaXMuc3RyZWFtSW5zZXJ0c1tlbC5pZF0gOiB7fTtcbiAgICByZXR1cm4gaW5zZXJ0IHx8IHt9O1xuICB9XG5cbiAgc2V0U3RyZWFtUmVmKGVsLCByZWYpIHtcbiAgICBET00ucHV0U3RpY2t5KGVsLCBQSFhfU1RSRUFNX1JFRiwgKGVsKSA9PlxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGLCByZWYpLFxuICAgICk7XG4gIH1cblxuICBtYXliZVJlT3JkZXJTdHJlYW0oZWwsIGlzTmV3KSB7XG4gICAgY29uc3QgeyByZWYsIHN0cmVhbUF0LCByZXNldCB9ID0gdGhpcy5nZXRTdHJlYW1JbnNlcnQoZWwpO1xuICAgIGlmIChzdHJlYW1BdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byBzZXQgdGhlIFBIWF9TVFJFQU1fUkVGIGhlcmUgYXMgd2VsbCBhcyBhZGRDaGlsZCBpcyBpbnZva2VkIG9ubHkgZm9yIHBhcmVudHNcbiAgICB0aGlzLnNldFN0cmVhbVJlZihlbCwgcmVmKTtcblxuICAgIGlmICghcmVzZXQgJiYgIWlzTmV3KSB7XG4gICAgICAvLyB3ZSBvbmx5IHJlb3JkZXIgaWYgdGhlIGVsZW1lbnQgaXMgbmV3IG9yIGl0J3MgYSBzdHJlYW0gcmVzZXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBoYXMgYSBwYXJlbnQgZWxlbWVudDtcbiAgICAvLyBpdCBkb2Vzbid0IGlmIHdlIGFyZSBjdXJyZW50bHkgcmVjdXJzaXZlbHkgbW9ycGhpbmcgKHJlc3RvcmluZyBhIHNhdmVkIHN0cmVhbSBjaGlsZClcbiAgICAvLyBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIG5vdCB5ZXQgYWRkZWQgdG8gdGhlIHJlYWwgZG9tO1xuICAgIC8vIHJlb3JkZXJpbmcgZG9lcyBub3QgbWFrZSBzZW5zZSBpbiB0aGF0IGNhc2UgYW55d2F5XG4gICAgaWYgKCFlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICBlbC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShlbCwgZWwucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgfSBlbHNlIGlmIChzdHJlYW1BdCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKTtcbiAgICAgIGNvbnN0IG9sZEluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlbCk7XG4gICAgICBpZiAoc3RyZWFtQXQgPj0gY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xuICAgICAgICBlbC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpYmxpbmcgPSBjaGlsZHJlbltzdHJlYW1BdF07XG4gICAgICAgIGlmIChvbGRJbmRleCA+IHN0cmVhbUF0KSB7XG4gICAgICAgICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZWwsIHNpYmxpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVsLCBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm1heWJlTGltaXRTdHJlYW0oZWwpO1xuICB9XG5cbiAgbWF5YmVMaW1pdFN0cmVhbShlbCkge1xuICAgIGNvbnN0IHsgbGltaXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGVsKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGxpbWl0ICE9PSBudWxsICYmIEFycmF5LmZyb20oZWwucGFyZW50RWxlbWVudC5jaGlsZHJlbik7XG4gICAgaWYgKGxpbWl0ICYmIGxpbWl0IDwgMCAmJiBjaGlsZHJlbi5sZW5ndGggPiBsaW1pdCAqIC0xKSB7XG4gICAgICBjaGlsZHJlblxuICAgICAgICAuc2xpY2UoMCwgY2hpbGRyZW4ubGVuZ3RoICsgbGltaXQpXG4gICAgICAgIC5mb3JFYWNoKChjaGlsZCkgPT4gdGhpcy5yZW1vdmVTdHJlYW1DaGlsZEVsZW1lbnQoY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKGxpbWl0ICYmIGxpbWl0ID49IDAgJiYgY2hpbGRyZW4ubGVuZ3RoID4gbGltaXQpIHtcbiAgICAgIGNoaWxkcmVuXG4gICAgICAgIC5zbGljZShsaW1pdClcbiAgICAgICAgLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCkpO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zaXRpb25QZW5kaW5nUmVtb3ZlcygpIHtcbiAgICBjb25zdCB7IHBlbmRpbmdSZW1vdmVzLCBsaXZlU29ja2V0IH0gPSB0aGlzO1xuICAgIGlmIChwZW5kaW5nUmVtb3Zlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaXZlU29ja2V0LnRyYW5zaXRpb25SZW1vdmVzKHBlbmRpbmdSZW1vdmVzLCAoKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmVzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBET00uZmlyc3RQaHhDaGlsZChlbCk7XG4gICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICBsaXZlU29ja2V0LmRlc3Ryb3lWaWV3QnlFbChjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50cmFja0FmdGVyKFwidHJhbnNpdGlvbnNEaXNjYXJkZWRcIiwgcGVuZGluZ1JlbW92ZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCkge1xuICAgIGlmICghKGZyb21FbCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB8fCBmcm9tRWwubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZyb21FbC5vcHRpb25zLmxlbmd0aCAhPT0gdG9FbC5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8ga2VlcCB0aGUgY3VycmVudCB2YWx1ZVxuICAgIHRvRWwudmFsdWUgPSBmcm9tRWwudmFsdWU7XG5cbiAgICAvLyBpbiBnZW5lcmFsIHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsIHdpdGggdXNpbmcgaXNFcXVhbE5vZGUgYXMgaXQgZG9lcyBub3QgYSByZWxpYWJsZVxuICAgIC8vIERPTSB0cmVlIGVxdWFsaXR5IGNoZWNrLCBidXQgZm9yIHNlbGVjdGlvbiBhdHRyaWJ1dGVzIGFuZCBvcHRpb25zIGl0IHdvcmtzIGZpbmVcbiAgICByZXR1cm4gIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKTtcbiAgfVxuXG4gIGlzQ0lEUGF0Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMuY2lkUGF0Y2g7XG4gIH1cblxuICBza2lwQ0lEU2libGluZyhlbCkge1xuICAgIHJldHVybiBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9TS0lQKTtcbiAgfVxuXG4gIHRhcmdldENJRENvbnRhaW5lcihodG1sKSB7XG4gICAgaWYgKCF0aGlzLmlzQ0lEUGF0Y2goKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdChcbiAgICAgIHRoaXMudmlldy5pZCxcbiAgICAgIHRoaXMudGFyZ2V0Q0lELFxuICAgICk7XG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAwICYmIERPTS5jaGlsZE5vZGVMZW5ndGgoaHRtbCkgPT09IDEpIHtcbiAgICAgIHJldHVybiBmaXJzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpcnN0ICYmIGZpcnN0LnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgaW5kZXhPZihwYXJlbnQsIGNoaWxkKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKS5pbmRleE9mKGNoaWxkKTtcbiAgfVxuXG4gIHRlbGVwb3J0KGVsLCBtb3JwaCkge1xuICAgIGNvbnN0IHRhcmdldFNlbGVjdG9yID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICAgIGNvbnN0IHBvcnRhbENvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpO1xuICAgIGlmICghcG9ydGFsQ29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwicG9ydGFsIHRhcmdldCB3aXRoIHNlbGVjdG9yIFwiICsgdGFyZ2V0U2VsZWN0b3IgKyBcIiBub3QgZm91bmRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIHBoeC1wb3J0YWwgdGVtcGxhdGVzIG11c3QgaGF2ZSBhIHNpbmdsZSByb290IGVsZW1lbnQsIHNvIHdlIGFzc3VtZSB0aGlzIHRvIGJlXG4gICAgLy8gdGhlIGNhc2UgaGVyZVxuICAgIGNvbnN0IHRvVGVsZXBvcnQgPSBlbC5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgIC8vIHRoZSBQSFhfU0tJUCBvcHRpbWl6YXRpb24gY2FuIGFsc28gYXBwbHkgaW5zaWRlIG9mIHRoZSA8dGVtcGxhdGU+IGVsZW1lbnRzXG4gICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcodG9UZWxlcG9ydCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0b1RlbGVwb3J0Py5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcInBoeC1wb3J0YWwgdGVtcGxhdGUgbXVzdCBoYXZlIGEgc2luZ2xlIHJvb3QgZWxlbWVudCB3aXRoIElEIVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0b1RlbGVwb3J0LmlkKTtcbiAgICBsZXQgcG9ydGFsVGFyZ2V0O1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgbmVlZHMgdG8gYmUgbW92ZWQgdG8gYW5vdGhlciB0YXJnZXRcbiAgICAgIGlmICghcG9ydGFsQ29udGFpbmVyLmNvbnRhaW5zKGV4aXN0aW5nKSkge1xuICAgICAgICBwb3J0YWxDb250YWluZXIuYXBwZW5kQ2hpbGQoZXhpc3RpbmcpO1xuICAgICAgfVxuICAgICAgLy8gd2UgYWxyZWFkeSB0ZWxlcG9ydGVkIGluIGEgcHJldmlvdXMgcGF0Y2hcbiAgICAgIHBvcnRhbFRhcmdldCA9IGV4aXN0aW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjcmVhdGUgZW1wdHkgdGFyZ2V0IGFuZCBtb3JwaCBpdCByZWN1cnNpdmVseVxuICAgICAgcG9ydGFsVGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0b1RlbGVwb3J0LnRhZ05hbWUpO1xuICAgICAgcG9ydGFsQ29udGFpbmVyLmFwcGVuZENoaWxkKHBvcnRhbFRhcmdldCk7XG4gICAgfVxuICAgIC8vIG1hcmsgdGhlIHRhcmdldCBhcyB0ZWxlcG9ydGVkO1xuICAgIC8vIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgYXR0cmlidXRlIG1vZGlmaWNhdGlvbnMsIHdlIHNldCB0aGUgYXR0cmlidXRlXG4gICAgLy8gb24gdGhlIHNvdXJjZSBhbmQgcmVtb3ZlIGl0IGFmdGVyIG1vcnBoaW5nICh3ZSBjb3VsZCBhbHNvIGp1c3Qga2VlcCBpdClcbiAgICAvLyBvdGhlcndpc2UgbW9ycGhkb20gd291bGQgcmVtb3ZlIGl0LCBhcyB0aGUgcmVmIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzb3VyY2VcbiAgICAvLyBhbmQgd2UnZCBuZWVkIHRvIHNldCBpdCBiYWNrIGFmdGVyIGVhY2ggbW9ycGhcbiAgICB0b1RlbGVwb3J0LnNldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYsIHRoaXMudmlldy5pZCk7XG4gICAgdG9UZWxlcG9ydC5zZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDLCBlbC5pZCk7XG4gICAgbW9ycGgocG9ydGFsVGFyZ2V0LCB0b1RlbGVwb3J0LCB0cnVlKTtcbiAgICB0b1RlbGVwb3J0LnJlbW92ZUF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpO1xuICAgIHRvVGVsZXBvcnQucmVtb3ZlQXR0cmlidXRlKFBIWF9URUxFUE9SVEVEX1NSQyk7XG4gICAgLy8gc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRlbGVwb3J0ZWQgZWxlbWVudCBpbiB0aGUgdmlld1xuICAgIC8vIHRvIGNsZWFudXAgd2hlbiB0aGUgdmlldyBpcyBkZXN0cm95ZWQsIGluIGNhc2UgdGhlIHBvcnRhbCB0YXJnZXRcbiAgICAvLyBpcyBvdXRzaWRlIHRoZSB2aWV3IGl0c2VsZlxuICAgIHRoaXMudmlldy5wdXNoUG9ydGFsRWxlbWVudElkKHRvVGVsZXBvcnQuaWQpO1xuICB9XG5cbiAgaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSkge1xuICAgIC8vIHVzdWFsbHksIHNjcmlwdHMgYXJlIG5vdCBleGVjdXRlZCB3aGVuIG1vcnBoZG9tIGFkZHMgdGhlbSB0byB0aGUgRE9NXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIHJ1bnRpbWUgY29sb2NhdGVkIGhvb2tzXG4gICAgY29uc3QgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZShQSFhfUlVOVElNRV9IT09LKTtcbiAgICBsZXQgbm9uY2UgPSBlbC5oYXNBdHRyaWJ1dGUoXCJub25jZVwiKSA/IGVsLmdldEF0dHJpYnV0ZShcIm5vbmNlXCIpIDogbnVsbDtcbiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKFwibm9uY2VcIikpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc291cmNlO1xuICAgICAgbm9uY2UgPSB0ZW1wbGF0ZS5jb250ZW50XG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gKVxuICAgICAgICAuZ2V0QXR0cmlidXRlKFwibm9uY2VcIik7XG4gICAgfVxuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgc2NyaXB0LnRleHRDb250ZW50ID0gZWwudGV4dENvbnRlbnQ7XG4gICAgRE9NLm1lcmdlQXR0cnMoc2NyaXB0LCBlbCwgeyBpc0lnbm9yZWQ6IGZhbHNlIH0pO1xuICAgIGlmIChub25jZSkge1xuICAgICAgc2NyaXB0Lm5vbmNlID0gbm9uY2U7XG4gICAgfVxuICAgIGVsLnJlcGxhY2VXaXRoKHNjcmlwdCk7XG4gICAgZWwgPSBzY3JpcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBDT01QT05FTlRTLFxuICBURU1QTEFURVMsXG4gIEVWRU5UUyxcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX1ZJRVdfUkVGLFxuICBQSFhfU0tJUCxcbiAgUEhYX01BR0lDX0lELFxuICBSRVBMWSxcbiAgU1RBVElDLFxuICBUSVRMRSxcbiAgU1RSRUFNLFxuICBST09ULFxuICBLRVlFRCxcbiAgS0VZRURfQ09VTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBpc09iamVjdCwgbG9nRXJyb3IsIGlzQ2lkIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgVk9JRF9UQUdTID0gbmV3IFNldChbXG4gIFwiYXJlYVwiLFxuICBcImJhc2VcIixcbiAgXCJiclwiLFxuICBcImNvbFwiLFxuICBcImNvbW1hbmRcIixcbiAgXCJlbWJlZFwiLFxuICBcImhyXCIsXG4gIFwiaW1nXCIsXG4gIFwiaW5wdXRcIixcbiAgXCJrZXlnZW5cIixcbiAgXCJsaW5rXCIsXG4gIFwibWV0YVwiLFxuICBcInBhcmFtXCIsXG4gIFwic291cmNlXCIsXG4gIFwidHJhY2tcIixcbiAgXCJ3YnJcIixcbl0pO1xuY29uc3QgcXVvdGVDaGFycyA9IG5ldyBTZXQoW1wiJ1wiLCAnXCInXSk7XG5cbmV4cG9ydCBjb25zdCBtb2RpZnlSb290ID0gKGh0bWwsIGF0dHJzLCBjbGVhcklubmVySFRNTCkgPT4ge1xuICBsZXQgaSA9IDA7XG4gIGxldCBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIGxldCBiZWZvcmVUYWcsIGFmdGVyVGFnLCB0YWcsIHRhZ05hbWVFbmRzQXQsIGlkLCBuZXdIVE1MO1xuXG4gIGNvbnN0IGxvb2thaGVhZCA9IGh0bWwubWF0Y2goL14oXFxzKig/OjwhLS0uKj8tLT5cXHMqKSopPChbXlxcc1xcLz5dKykvKTtcbiAgaWYgKGxvb2thaGVhZCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbWFsZm9ybWVkIGh0bWwgJHtodG1sfWApO1xuICB9XG5cbiAgaSA9IGxvb2thaGVhZFswXS5sZW5ndGg7XG4gIGJlZm9yZVRhZyA9IGxvb2thaGVhZFsxXTtcbiAgdGFnID0gbG9va2FoZWFkWzJdO1xuICB0YWdOYW1lRW5kc0F0ID0gaTtcblxuICAvLyBTY2FuIHRoZSBvcGVuaW5nIHRhZyBmb3IgaWQsIGlmIHRoZXJlIGlzIGFueVxuICBmb3IgKGk7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGh0bWwuY2hhckF0KGkpID09PSBcIj5cIikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChodG1sLmNoYXJBdChpKSA9PT0gXCI9XCIpIHtcbiAgICAgIGNvbnN0IGlzSWQgPSBodG1sLnNsaWNlKGkgLSAzLCBpKSA9PT0gXCIgaWRcIjtcbiAgICAgIGkrKztcbiAgICAgIGNvbnN0IGNoYXIgPSBodG1sLmNoYXJBdChpKTtcbiAgICAgIGlmIChxdW90ZUNoYXJzLmhhcyhjaGFyKSkge1xuICAgICAgICBjb25zdCBhdHRyU3RhcnRzQXQgPSBpO1xuICAgICAgICBpKys7XG4gICAgICAgIGZvciAoaTsgaSA8IGh0bWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoaHRtbC5jaGFyQXQoaSkgPT09IGNoYXIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJZCkge1xuICAgICAgICAgIGlkID0gaHRtbC5zbGljZShhdHRyU3RhcnRzQXQgKyAxLCBpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBjbG9zZUF0ID0gaHRtbC5sZW5ndGggLSAxO1xuICBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIHdoaWxlIChjbG9zZUF0ID49IGJlZm9yZVRhZy5sZW5ndGggKyB0YWcubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IGh0bWwuY2hhckF0KGNsb3NlQXQpO1xuICAgIGlmIChpbnNpZGVDb21tZW50KSB7XG4gICAgICBpZiAoY2hhciA9PT0gXCItXCIgJiYgaHRtbC5zbGljZShjbG9zZUF0IC0gMywgY2xvc2VBdCkgPT09IFwiPCEtXCIpIHtcbiAgICAgICAgaW5zaWRlQ29tbWVudCA9IGZhbHNlO1xuICAgICAgICBjbG9zZUF0IC09IDQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9zZUF0IC09IDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSBcIj5cIiAmJiBodG1sLnNsaWNlKGNsb3NlQXQgLSAyLCBjbG9zZUF0KSA9PT0gXCItLVwiKSB7XG4gICAgICBpbnNpZGVDb21tZW50ID0gdHJ1ZTtcbiAgICAgIGNsb3NlQXQgLT0gMztcbiAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiPlwiKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY2xvc2VBdCAtPSAxO1xuICAgIH1cbiAgfVxuICBhZnRlclRhZyA9IGh0bWwuc2xpY2UoY2xvc2VBdCArIDEsIGh0bWwubGVuZ3RoKTtcblxuICBjb25zdCBhdHRyc1N0ciA9IE9iamVjdC5rZXlzKGF0dHJzKVxuICAgIC5tYXAoKGF0dHIpID0+IChhdHRyc1thdHRyXSA9PT0gdHJ1ZSA/IGF0dHIgOiBgJHthdHRyfT1cIiR7YXR0cnNbYXR0cl19XCJgKSlcbiAgICAuam9pbihcIiBcIik7XG5cbiAgaWYgKGNsZWFySW5uZXJIVE1MKSB7XG4gICAgLy8gS2VlcCB0aGUgaWQgaWYgYW55XG4gICAgY29uc3QgaWRBdHRyU3RyID0gaWQgPyBgIGlkPVwiJHtpZH1cImAgOiBcIlwiO1xuICAgIGlmIChWT0lEX1RBR1MuaGFzKHRhZykpIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0vPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0+PC8ke3RhZ30+YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmVzdCA9IGh0bWwuc2xpY2UodGFnTmFtZUVuZHNBdCwgY2xvc2VBdCArIDEpO1xuICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0ke3Jlc3R9YDtcbiAgfVxuXG4gIHJldHVybiBbbmV3SFRNTCwgYmVmb3JlVGFnLCBhZnRlclRhZ107XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJlZCB7XG4gIHN0YXRpYyBleHRyYWN0KGRpZmYpIHtcbiAgICBjb25zdCB7IFtSRVBMWV06IHJlcGx5LCBbRVZFTlRTXTogZXZlbnRzLCBbVElUTEVdOiB0aXRsZSB9ID0gZGlmZjtcbiAgICBkZWxldGUgZGlmZltSRVBMWV07XG4gICAgZGVsZXRlIGRpZmZbRVZFTlRTXTtcbiAgICBkZWxldGUgZGlmZltUSVRMRV07XG4gICAgcmV0dXJuIHsgZGlmZiwgdGl0bGUsIHJlcGx5OiByZXBseSB8fCBudWxsLCBldmVudHM6IGV2ZW50cyB8fCBbXSB9O1xuICB9XG5cbiAgY29uc3RydWN0b3Iodmlld0lkLCByZW5kZXJlZCkge1xuICAgIHRoaXMudmlld0lkID0gdmlld0lkO1xuICAgIHRoaXMucmVuZGVyZWQgPSB7fTtcbiAgICB0aGlzLm1hZ2ljSWQgPSAwO1xuICAgIHRoaXMubWVyZ2VEaWZmKHJlbmRlcmVkKTtcbiAgfVxuXG4gIHBhcmVudFZpZXdJZCgpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SWQ7XG4gIH1cblxuICB0b1N0cmluZyhvbmx5Q2lkcykge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkLFxuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICAgIG9ubHlDaWRzLFxuICAgICAgdHJ1ZSxcbiAgICAgIHt9LFxuICAgICk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfTtcbiAgfVxuXG4gIHJlY3Vyc2l2ZVRvU3RyaW5nKFxuICAgIHJlbmRlcmVkLFxuICAgIGNvbXBvbmVudHMgPSByZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICBvbmx5Q2lkcyxcbiAgICBjaGFuZ2VUcmFja2luZyxcbiAgICByb290QXR0cnMsXG4gICkge1xuICAgIG9ubHlDaWRzID0gb25seUNpZHMgPyBuZXcgU2V0KG9ubHlDaWRzKSA6IG51bGw7XG4gICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgYnVmZmVyOiBcIlwiLFxuICAgICAgY29tcG9uZW50czogY29tcG9uZW50cyxcbiAgICAgIG9ubHlDaWRzOiBvbmx5Q2lkcyxcbiAgICAgIHN0cmVhbXM6IG5ldyBTZXQoKSxcbiAgICB9O1xuICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIG51bGwsIG91dHB1dCwgY2hhbmdlVHJhY2tpbmcsIHJvb3RBdHRycyk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBvdXRwdXQuYnVmZmVyLCBzdHJlYW1zOiBvdXRwdXQuc3RyZWFtcyB9O1xuICB9XG5cbiAgY29tcG9uZW50Q0lEcyhkaWZmKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGRpZmZbQ09NUE9ORU5UU10gfHwge30pLm1hcCgoaSkgPT4gcGFyc2VJbnQoaSkpO1xuICB9XG5cbiAgaXNDb21wb25lbnRPbmx5RGlmZihkaWZmKSB7XG4gICAgaWYgKCFkaWZmW0NPTVBPTkVOVFNdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhkaWZmKS5sZW5ndGggPT09IDE7XG4gIH1cblxuICBnZXRDb21wb25lbnQoZGlmZiwgY2lkKSB7XG4gICAgcmV0dXJuIGRpZmZbQ09NUE9ORU5UU11bY2lkXTtcbiAgfVxuXG4gIHJlc2V0UmVuZGVyKGNpZCkge1xuICAgIC8vIHdlIGFyZSByYWNpbmcgYSBjb21wb25lbnQgZGVzdHJveSwgaXQgY291bGQgbm90IGV4aXN0LCBzb1xuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHRyeSB0byBzZXQgcmVzZXQgb24gdW5kZWZpbmVkXG4gICAgaWYgKHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11bY2lkXSkge1xuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdLnJlc2V0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBtZXJnZURpZmYoZGlmZikge1xuICAgIGNvbnN0IG5ld2MgPSBkaWZmW0NPTVBPTkVOVFNdO1xuICAgIGNvbnN0IGNhY2hlID0ge307XG4gICAgZGVsZXRlIGRpZmZbQ09NUE9ORU5UU107XG4gICAgdGhpcy5yZW5kZXJlZCA9IHRoaXMubXV0YWJsZU1lcmdlKHRoaXMucmVuZGVyZWQsIGRpZmYpO1xuICAgIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10gPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdIHx8IHt9O1xuXG4gICAgaWYgKG5ld2MpIHtcbiAgICAgIGNvbnN0IG9sZGMgPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdO1xuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG5ld2NbY2lkXSA9IHRoaXMuY2FjaGVkRmluZENvbXBvbmVudChjaWQsIG5ld2NbY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG9sZGNbY2lkXSA9IG5ld2NbY2lkXTtcbiAgICAgIH1cbiAgICAgIGRpZmZbQ09NUE9ORU5UU10gPSBuZXdjO1xuICAgIH1cbiAgfVxuXG4gIGNhY2hlZEZpbmRDb21wb25lbnQoY2lkLCBjZGlmZiwgb2xkYywgbmV3YywgY2FjaGUpIHtcbiAgICBpZiAoY2FjaGVbY2lkXSkge1xuICAgICAgcmV0dXJuIGNhY2hlW2NpZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZGlmZixcbiAgICAgICAgc3RhdCxcbiAgICAgICAgc2NpZCA9IGNkaWZmW1NUQVRJQ107XG5cbiAgICAgIGlmIChpc0NpZChzY2lkKSkge1xuICAgICAgICBsZXQgdGRpZmY7XG5cbiAgICAgICAgaWYgKHNjaWQgPiAwKSB7XG4gICAgICAgICAgdGRpZmYgPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoc2NpZCwgbmV3Y1tzY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRkaWZmID0gb2xkY1stc2NpZF07XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ID0gdGRpZmZbU1RBVElDXTtcbiAgICAgICAgbmRpZmYgPSB0aGlzLmNsb25lTWVyZ2UodGRpZmYsIGNkaWZmLCB0cnVlKTtcbiAgICAgICAgbmRpZmZbU1RBVElDXSA9IHN0YXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZGlmZiA9XG4gICAgICAgICAgY2RpZmZbU1RBVElDXSAhPT0gdW5kZWZpbmVkIHx8IG9sZGNbY2lkXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGNkaWZmXG4gICAgICAgICAgICA6IHRoaXMuY2xvbmVNZXJnZShvbGRjW2NpZF0sIGNkaWZmLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGNhY2hlW2NpZF0gPSBuZGlmZjtcbiAgICAgIHJldHVybiBuZGlmZjtcbiAgICB9XG4gIH1cblxuICBtdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBpZiAoc291cmNlW1NUQVRJQ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgfVxuXG4gIGRvTXV0YWJsZU1lcmdlKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKHNvdXJjZVtLRVlFRF0pIHtcbiAgICAgIHRoaXMubWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsID0gdGFyZ2V0W2tleV07XG4gICAgICAgIGNvbnN0IGlzT2JqVmFsID0gaXNPYmplY3QodmFsKTtcbiAgICAgICAgaWYgKGlzT2JqVmFsICYmIHZhbFtTVEFUSUNdID09PSB1bmRlZmluZWQgJiYgaXNPYmplY3QodGFyZ2V0VmFsKSkge1xuICAgICAgICAgIHRoaXMuZG9NdXRhYmxlTWVyZ2UodGFyZ2V0VmFsLCB2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXRbUk9PVF0pIHtcbiAgICAgIHRhcmdldC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lKGRpZmYpIHtcbiAgICBpZiAoXCJzdHJ1Y3R1cmVkQ2xvbmVcIiBpbiB3aW5kb3cpIHtcbiAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoZGlmZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZhbGxiYWNrIGZvciBqZXN0XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkaWZmKSk7XG4gICAgfVxuICB9XG5cbiAgLy8ga2V5ZWQgY29tcHJlaGVuc2lvbnNcbiAgbWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSkge1xuICAgIC8vIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHRhcmdldCBzaW5jZSBlbGVtZW50cyBjYW4gbW92ZSBhbmQgb3RoZXJ3aXNlXG4gICAgLy8gaXQgY291bGQgaGFwcGVuIHRoYXQgd2UgbW9kaWZ5IGFuIGVsZW1lbnQgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlZmVyIHRvXG4gICAgLy8gbGF0ZXJcbiAgICBjb25zdCBjbG9uZWRUYXJnZXQgPSB0aGlzLmNsb25lKHRhcmdldCk7XG4gICAgT2JqZWN0LmVudHJpZXMoc291cmNlW0tFWUVEXSkuZm9yRWFjaCgoW2ksIGVudHJ5XSkgPT4ge1xuICAgICAgaWYgKGkgPT09IEtFWUVEX0NPVU5UKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICAvLyBbb2xkX2lkeCwgZGlmZl1cbiAgICAgICAgLy8gbW92ZWQgd2l0aCBkaWZmXG4gICAgICAgIGNvbnN0IFtvbGRfaWR4LCBkaWZmXSA9IGVudHJ5O1xuICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0gY2xvbmVkVGFyZ2V0W0tFWUVEXVtvbGRfaWR4XTtcbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBkaWZmKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIC8vIG1vdmVkIHdpdGhvdXQgZGlmZlxuICAgICAgICBjb25zdCBvbGRfaWR4ID0gZW50cnk7XG4gICAgICAgIHRhcmdldFtLRVlFRF1baV0gPSBjbG9uZWRUYXJnZXRbS0VZRURdW29sZF9pZHhdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW50cnkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgLy8gZGlmZiwgc2FtZSBwb3NpdGlvblxuICAgICAgICBpZiAoIXRhcmdldFtLRVlFRF1baV0pIHtcbiAgICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBlbnRyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gZHJvcCBleHRyYSBlbnRyaWVzXG4gICAgaWYgKHNvdXJjZVtLRVlFRF1bS0VZRURfQ09VTlRdIDwgdGFyZ2V0W0tFWUVEXVtLRVlFRF9DT1VOVF0pIHtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgICAgIGkgPCB0YXJnZXRbS0VZRURdW0tFWUVEX0NPVU5UXTtcbiAgICAgICAgaSsrXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIHRhcmdldFtLRVlFRF1baV07XG4gICAgICB9XG4gICAgfVxuICAgIHRhcmdldFtLRVlFRF1bS0VZRURfQ09VTlRdID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgaWYgKHNvdXJjZVtTVFJFQU1dKSB7XG4gICAgICB0YXJnZXRbU1RSRUFNXSA9IHNvdXJjZVtTVFJFQU1dO1xuICAgIH1cbiAgICBpZiAoc291cmNlW1RFTVBMQVRFU10pIHtcbiAgICAgIHRhcmdldFtURU1QTEFURVNdID0gc291cmNlW1RFTVBMQVRFU107XG4gICAgfVxuICB9XG5cbiAgLy8gTWVyZ2VzIGNpZCB0cmVlcyB0b2dldGhlciwgY29weWluZyBzdGF0aWNzIGZyb20gc291cmNlIHRyZWUuXG4gIC8vXG4gIC8vIFRoZSBgcHJ1bmVNYWdpY0lkYCBpcyBwYXNzZWQgdG8gY29udHJvbCBwcnVuaW5nIHRoZSBtYWdpY0lkIG9mIHRoZVxuICAvLyB0YXJnZXQuIFdlIG11c3QgYWx3YXlzIHBydW5lIHRoZSBtYWdpY0lkIHdoZW4gd2UgYXJlIHNoYXJpbmcgc3RhdGljc1xuICAvLyBmcm9tIGFub3RoZXIgY29tcG9uZW50LiBJZiBub3QgcHJ1bmluZywgd2UgcmVwbGljYXRlIHRoZSBsb2dpYyBmcm9tXG4gIC8vIG11dGFibGVNZXJnZSwgd2hlcmUgd2Ugc2V0IG5ld1JlbmRlciB0byB0cnVlIGlmIHRoZXJlIGlzIGEgcm9vdFxuICAvLyAoZWZmZWN0aXZlbHkgZm9yY2luZyB0aGUgbmV3IHZlcnNpb24gdG8gYmUgcmVuZGVyZWQgaW5zdGVhZCBvZiBza2lwcGVkKVxuICAvL1xuICBjbG9uZU1lcmdlKHRhcmdldCwgc291cmNlLCBwcnVuZU1hZ2ljSWQpIHtcbiAgICBjb25zdCBtZXJnZWQgPSB7IC4uLnRhcmdldCwgLi4uc291cmNlIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWVyZ2VkKSB7XG4gICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGNvbnN0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgaWYgKGlzT2JqZWN0KHZhbCkgJiYgdmFsW1NUQVRJQ10gPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwgdmFsLCBwcnVuZU1hZ2ljSWQpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwge30sIHBydW5lTWFnaWNJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcnVuZU1hZ2ljSWQpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubWFnaWNJZDtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubmV3UmVuZGVyO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0W1JPT1RdKSB7XG4gICAgICBtZXJnZWQubmV3UmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIGNvbXBvbmVudFRvU3RyaW5nKGNpZCkge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdLFxuICAgICAgY2lkLFxuICAgICAgbnVsbCxcbiAgICApO1xuICAgIGNvbnN0IFtzdHJpcHBlZEhUTUwsIF9iZWZvcmUsIF9hZnRlcl0gPSBtb2RpZnlSb290KHN0ciwge30pO1xuICAgIHJldHVybiB7IGJ1ZmZlcjogc3RyaXBwZWRIVE1MLCBzdHJlYW1zOiBzdHJlYW1zIH07XG4gIH1cblxuICBwcnVuZUNJRHMoY2lkcykge1xuICAgIGNpZHMuZm9yRWFjaCgoY2lkKSA9PiBkZWxldGUgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWQ7XG4gIH1cblxuICBpc05ld0ZpbmdlcnByaW50KGRpZmYgPSB7fSkge1xuICAgIHJldHVybiAhIWRpZmZbU1RBVElDXTtcbiAgfVxuXG4gIHRlbXBsYXRlU3RhdGljKHBhcnQsIHRlbXBsYXRlcykge1xuICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlc1twYXJ0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfVxuICB9XG5cbiAgbmV4dE1hZ2ljSUQoKSB7XG4gICAgdGhpcy5tYWdpY0lkKys7XG4gICAgcmV0dXJuIGBtJHt0aGlzLm1hZ2ljSWR9LSR7dGhpcy5wYXJlbnRWaWV3SWQoKX1gO1xuICB9XG5cbiAgLy8gQ29udmVydHMgcmVuZGVyZWQgdHJlZSB0byBvdXRwdXQgYnVmZmVyLlxuICAvL1xuICAvLyBjaGFuZ2VUcmFja2luZyBjb250cm9scyBpZiB3ZSBjYW4gYXBwbHkgdGhlIFBIWF9TS0lQIG9wdGltaXphdGlvbi5cbiAgdG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywgcm9vdEF0dHJzID0ge30pIHtcbiAgICBpZiAocmVuZGVyZWRbS0VZRURdKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wcmVoZW5zaW9uVG9CdWZmZXIoXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICB0ZW1wbGF0ZXMsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgY2hhbmdlVHJhY2tpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRlbXBsYXRlcyBhcmUgYSB3YXkgb2Ygc2hhcmluZyBzdGF0aWNzIGJldHdlZW4gbXVsdGlwbGUgcmVuZGVyZWQgc3RydWN0cy5cbiAgICAvLyBTaW5jZSBMaXZlVmlldyAxLjEsIHRob3NlIGNhbiBhbHNvIGFwcGVhciBhdCB0aGUgcm9vdCAtIGZvciBleGFtcGxlIGlmIG9uZSByZW5kZXJzXG4gICAgLy8gdHdvIGNvbXByZWhlbnNpb25zIHRoYXQgY2FuIHNoYXJlIHN0YXRpY3MuXG4gICAgLy8gV2hlbmV2ZXIgd2UgZmluZCB0ZW1wbGF0ZXMsIHdlIG5lZWQgdG8gdXNlIHRoZW0gcmVjdXJzaXZlbHkuIEFsc28sIHRlbXBsYXRlcyBjYW5cbiAgICAvLyBiZSBzZW50IGZvciBlYWNoIGRpZmYsIG5vdCBvbmx5IGZvciB0aGUgaW5pdGlhbCBvbmUuIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgdGhlbVxuICAgIC8vIHRob3VnaCwgc28gd2UgYWx3YXlzIHJlc29sdmUgdGhlbSBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgcmVuZGVyZWQgb2JqZWN0LlxuICAgIGlmIChyZW5kZXJlZFtURU1QTEFURVNdKSB7XG4gICAgICB0ZW1wbGF0ZXMgPSByZW5kZXJlZFtURU1QTEFURVNdO1xuICAgICAgZGVsZXRlIHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgfVxuXG4gICAgbGV0IHsgW1NUQVRJQ106IHN0YXRpY3MgfSA9IHJlbmRlcmVkO1xuICAgIHN0YXRpY3MgPSB0aGlzLnRlbXBsYXRlU3RhdGljKHN0YXRpY3MsIHRlbXBsYXRlcyk7XG4gICAgcmVuZGVyZWRbU1RBVElDXSA9IHN0YXRpY3M7XG4gICAgY29uc3QgaXNSb290ID0gcmVuZGVyZWRbUk9PVF07XG4gICAgY29uc3QgcHJldkJ1ZmZlciA9IG91dHB1dC5idWZmZXI7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IFwiXCI7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb25kaXRpb24gaXMgY2FsbGVkIHdoZW4gZmlyc3QgcmVuZGVyaW5nIGFuIG9wdGltaXphYmxlIGZ1bmN0aW9uIGNvbXBvbmVudC5cbiAgICAvLyBMQyBoYXZlIHRoZWlyIG1hZ2ljSWQgcHJldmlvdXNseSBzZXRcbiAgICBpZiAoY2hhbmdlVHJhY2tpbmcgJiYgaXNSb290ICYmICFyZW5kZXJlZC5tYWdpY0lkKSB7XG4gICAgICByZW5kZXJlZC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgICAgcmVuZGVyZWQubWFnaWNJZCA9IHRoaXMubmV4dE1hZ2ljSUQoKTtcbiAgICB9XG5cbiAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdGF0aWNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZFtpIC0gMV0sIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZyk7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbaV07XG4gICAgfVxuXG4gICAgLy8gQXBwbGllcyB0aGUgcm9vdCB0YWcgXCJza2lwXCIgb3B0aW1pemF0aW9uIGlmIHN1cHBvcnRlZCwgd2hpY2ggY2xlYXJzXG4gICAgLy8gdGhlIHJvb3QgdGFnIGF0dHJpYnV0ZXMgYW5kIGlubmVySFRNTCwgYW5kIG9ubHkgbWFpbnRhaW5zIHRoZSBtYWdpY0lkLlxuICAgIC8vIFdlIGNhbiBvbmx5IHNraXAgd2hlbiBjaGFuZ2VUcmFja2luZyBpcyBzdXBwb3J0ZWQsXG4gICAgLy8gYW5kIHdoZW4gdGhlIHJvb3QgZWxlbWVudCBoYXNuJ3QgZXhwZXJpZW5jZWQgYW4gdW5yZW5kZXJlZCBtZXJnZSAobmV3UmVuZGVyIHRydWUpLlxuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGxldCBza2lwID0gZmFsc2U7XG4gICAgICBsZXQgYXR0cnM7XG4gICAgICAvLyBXaGVuIGEgTEMgaXMgcmUtYWRkZWQgdG8gdGhlIHBhZ2UsIHdlIG5lZWQgdG8gcmUtcmVuZGVyIHRoZSBlbnRpcmUgTEMgdHJlZSxcbiAgICAgIC8vIHRoZXJlZm9yZSBjaGFuZ2VUcmFja2luZyBpcyBmYWxzZTsgaG93ZXZlciwgd2UgbmVlZCB0byBrZWVwIGFsbCB0aGUgbWFnaWNJZHNcbiAgICAgIC8vIGZyb20gYW55IGZ1bmN0aW9uIGNvbXBvbmVudCBzbyB0aGUgbmV4dCB0aW1lIHRoZSBMQyBpcyB1cGRhdGVkLCB3ZSBjYW4gYXBwbHlcbiAgICAgIC8vIHRoZSBza2lwIG9wdGltaXphdGlvblxuICAgICAgaWYgKGNoYW5nZVRyYWNraW5nIHx8IHJlbmRlcmVkLm1hZ2ljSWQpIHtcbiAgICAgICAgc2tpcCA9IGNoYW5nZVRyYWNraW5nICYmICFyZW5kZXJlZC5uZXdSZW5kZXI7XG4gICAgICAgIGF0dHJzID0geyBbUEhYX01BR0lDX0lEXTogcmVuZGVyZWQubWFnaWNJZCwgLi4ucm9vdEF0dHJzIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRycyA9IHJvb3RBdHRycztcbiAgICAgIH1cbiAgICAgIGlmIChza2lwKSB7XG4gICAgICAgIGF0dHJzW1BIWF9TS0lQXSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBbbmV3Um9vdCwgY29tbWVudEJlZm9yZSwgY29tbWVudEFmdGVyXSA9IG1vZGlmeVJvb3QoXG4gICAgICAgIG91dHB1dC5idWZmZXIsXG4gICAgICAgIGF0dHJzLFxuICAgICAgICBza2lwLFxuICAgICAgKTtcbiAgICAgIHJlbmRlcmVkLm5ld1JlbmRlciA9IGZhbHNlO1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IHByZXZCdWZmZXIgKyBjb21tZW50QmVmb3JlICsgbmV3Um9vdCArIGNvbW1lbnRBZnRlcjtcbiAgICB9XG4gIH1cblxuICBjb21wcmVoZW5zaW9uVG9CdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZykge1xuICAgIGNvbnN0IGtleWVkVGVtcGxhdGVzID0gdGVtcGxhdGVzIHx8IHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgY29uc3Qgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMocmVuZGVyZWRbU1RBVElDXSwgdGVtcGxhdGVzKTtcbiAgICByZW5kZXJlZFtTVEFUSUNdID0gc3RhdGljcztcbiAgICBkZWxldGUgcmVuZGVyZWRbVEVNUExBVEVTXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmVkW0tFWUVEXVtLRVlFRF9DT1VOVF07IGkrKykge1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzWzBdO1xuICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBzdGF0aWNzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY1RvQnVmZmVyKFxuICAgICAgICAgIHJlbmRlcmVkW0tFWUVEXVtpXVtqIC0gMV0sXG4gICAgICAgICAga2V5ZWRUZW1wbGF0ZXMsXG4gICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgICApO1xuICAgICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3Nbal07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gc3RvcmUgdGhlIHJlbmRlcmVkIHRyZWUgZm9yIHN0cmVhbXNcbiAgICBpZiAocmVuZGVyZWRbU1RSRUFNXSkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgIGNvbnN0IFtfcmVmLCBfaW5zZXJ0cywgZGVsZXRlSWRzLCByZXNldF0gPSBzdHJlYW0gfHwgW251bGwsIHt9LCBbXSwgbnVsbF07XG4gICAgICBpZiAoXG4gICAgICAgIHN0cmVhbSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChyZW5kZXJlZFtLRVlFRF1bS0VZRURfQ09VTlRdID4gMCB8fCBkZWxldGVJZHMubGVuZ3RoID4gMCB8fCByZXNldClcbiAgICAgICkge1xuICAgICAgICBkZWxldGUgcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgICAgcmVuZGVyZWRbS0VZRURdID0ge1xuICAgICAgICAgIFtLRVlFRF9DT1VOVF06IDAsXG4gICAgICAgIH07XG4gICAgICAgIG91dHB1dC5zdHJlYW1zLmFkZChzdHJlYW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQsIGNoYW5nZVRyYWNraW5nKSB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXJlZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3QgeyBidWZmZXI6IHN0ciwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVDSURUb1N0cmluZyhcbiAgICAgICAgb3V0cHV0LmNvbXBvbmVudHMsXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICBvdXRwdXQub25seUNpZHMsXG4gICAgICApO1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdHI7XG4gICAgICBvdXRwdXQuc3RyZWFtcyA9IG5ldyBTZXQoWy4uLm91dHB1dC5zdHJlYW1zLCAuLi5zdHJlYW1zXSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChyZW5kZXJlZCkpIHtcbiAgICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHJlbmRlcmVkO1xuICAgIH1cbiAgfVxuXG4gIHJlY3Vyc2l2ZUNJRFRvU3RyaW5nKGNvbXBvbmVudHMsIGNpZCwgb25seUNpZHMpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPVxuICAgICAgY29tcG9uZW50c1tjaWRdIHx8IGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm9yIENJRCAke2NpZH1gLCBjb21wb25lbnRzKTtcbiAgICBjb25zdCBhdHRycyA9IHsgW1BIWF9DT01QT05FTlRdOiBjaWQsIFtQSFhfVklFV19SRUZdOiB0aGlzLnZpZXdJZCB9O1xuICAgIGNvbnN0IHNraXAgPSBvbmx5Q2lkcyAmJiAhb25seUNpZHMuaGFzKGNpZCk7XG4gICAgLy8gVHdvIG9wdGltaXphdGlvbiBwYXRocyBhcHBseSBoZXJlOlxuICAgIC8vXG4gICAgLy8gICAxLiBUaGUgb25seUNpZHMgb3B0aW1pemF0aW9uIHdvcmtzIGJ5IHRoZSBzZXJ2ZXIgZGlmZiB0ZWxsaW5nIHVzIG9ubHkgc3BlY2lmaWNcbiAgICAvLyAgICAgY2lkJ3MgaGF2ZSBjaGFuZ2VkLiBUaGlzIGFsbG93cyB1cyB0byBza2lwIHJlbmRlcmluZyBhbnkgY29tcG9uZW50IHRoYXQgaGFzbid0IGNoYW5nZWQsXG4gICAgLy8gICAgIHdoaWNoIHVsdGltYXRlbHkgc2V0cyBQSFhfU0tJUCByb290IGF0dHJpYnV0ZSBhbmQgYXZvaWRzIHJlbmRlcmluZyB0aGUgaW5uZXJIVE1MLlxuICAgIC8vXG4gICAgLy8gICAyLiBUaGUgcm9vdCBQSFhfU0tJUCBvcHRpbWl6YXRpb24gZ2VuZXJhbGl6ZXMgdG8gYWxsIEhFRXggZnVuY3Rpb24gY29tcG9uZW50cywgYW5kXG4gICAgLy8gICAgIHdvcmtzIGluIHRoZSBzYW1lIFBIWF9TS0lQIGF0dHJpYnV0ZSBmYXNoaW9uIGFzIDEsIGJ1dCB0aGUgbmV3UmVuZGVyIHRyYWNraW5nIGlzIGRvbmVcbiAgICAvLyAgICAgYXQgdGhlIGdlbmVyYWwgZGlmZiBtZXJnZSBsZXZlbC4gSWYgd2UgbWVyZ2UgYSBkaWZmIHdpdGggbmV3IGR5bmFtaWNzLCB3ZSBuZWNlc3NhcmlseSBoYXZlXG4gICAgLy8gICAgIGV4cGVyaWVuY2VkIGEgY2hhbmdlIHdoaWNoIG11c3QgYmUgYSBuZXdSZW5kZXIsIGFuZCB0aHVzIHdlIGNhbid0IHNraXAgdGhlIHJlbmRlci5cbiAgICAvL1xuICAgIC8vIEJvdGggb3B0aW1pemF0aW9uIGZsb3dzIGFwcGx5IGhlcmUuIG5ld1JlbmRlciBpcyBzZXQgYmFzZWQgb24gdGhlIG9ubHlDaWRzIG9wdGltaXphdGlvbiwgYW5kXG4gICAgLy8gd2UgdHJhY2sgYSBkZXRlcm1pbmlzdGljIG1hZ2ljSWQgYmFzZWQgb24gdGhlIGNpZC5cbiAgICAvL1xuICAgIC8vIGNoYW5nZVRyYWNraW5nIGlzIGFib3V0IHRoZSBlbnRpcmUgdHJlZVxuICAgIC8vIG5ld1JlbmRlciBpcyBhYm91dCB0aGUgY3VycmVudCByb290IGluIHRoZSB0cmVlXG4gICAgLy9cbiAgICAvLyBCeSBkZWZhdWx0IGNoYW5nZVRyYWNraW5nIGlzIGVuYWJsZWQsIGJ1dCB3ZSBzcGVjaWFsIGNhc2UgdGhlIGZsb3cgd2hlcmUgdGhlIGNsaWVudCBpcyBwcnVuaW5nXG4gICAgLy8gY2lkcyBhbmQgdGhlIHNlcnZlciBhZGRzIHRoZSBjb21wb25lbnQgYmFjay4gSW4gc3VjaCBjYXNlcywgd2UgZXhwbGljaXRseSBkaXNhYmxlIGNoYW5nZVRyYWNraW5nXG4gICAgLy8gd2l0aCByZXNldFJlbmRlciBmb3IgdGhpcyBjaWQsIHRoZW4gcmUtZW5hYmxlIGl0IGFmdGVyIHRoZSByZWN1cnNpdmUgY2FsbCB0byBza2lwIHRoZSBvcHRpbWl6YXRpb25cbiAgICAvLyBmb3IgdGhlIGVudGlyZSBjb21wb25lbnQgdHJlZS5cbiAgICBjb21wb25lbnQubmV3UmVuZGVyID0gIXNraXA7XG4gICAgY29tcG9uZW50Lm1hZ2ljSWQgPSBgYyR7Y2lkfS0ke3RoaXMucGFyZW50Vmlld0lkKCl9YDtcbiAgICAvLyBlbmFibGUgY2hhbmdlIHRyYWNraW5nIGFzIGxvbmcgYXMgdGhlIGNvbXBvbmVudCBoYXNuJ3QgYmVlbiByZXNldFxuICAgIGNvbnN0IGNoYW5nZVRyYWNraW5nID0gIWNvbXBvbmVudC5yZXNldDtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVUb1N0cmluZyhcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudHMsXG4gICAgICBvbmx5Q2lkcyxcbiAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgYXR0cnMsXG4gICAgKTtcbiAgICAvLyBkaXNhYmxlIHJlc2V0IGFmdGVyIHdlJ3ZlIHJlbmRlcmVkXG4gICAgZGVsZXRlIGNvbXBvbmVudC5yZXNldDtcblxuICAgIHJldHVybiB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtczogc3RyZWFtcyB9O1xuICB9XG59XG4iLCAiaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBBUklBIGZyb20gXCIuL2FyaWFcIjtcblxuY29uc3QgZm9jdXNTdGFjayA9IFtdO1xuY29uc3QgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWUgPSAyMDA7XG5cbmNvbnN0IEpTID0ge1xuICAvLyBwcml2YXRlXG4gIGV4ZWMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGRlZmF1bHRzKSB7XG4gICAgY29uc3QgW2RlZmF1bHRLaW5kLCBkZWZhdWx0QXJnc10gPSBkZWZhdWx0cyB8fCBbXG4gICAgICBudWxsLFxuICAgICAgeyBjYWxsYmFjazogZGVmYXVsdHMgJiYgZGVmYXVsdHMuY2FsbGJhY2sgfSxcbiAgICBdO1xuICAgIGNvbnN0IGNvbW1hbmRzID1cbiAgICAgIHBoeEV2ZW50LmNoYXJBdCgwKSA9PT0gXCJbXCJcbiAgICAgICAgPyBKU09OLnBhcnNlKHBoeEV2ZW50KVxuICAgICAgICA6IFtbZGVmYXVsdEtpbmQsIGRlZmF1bHRBcmdzXV07XG5cbiAgICBjb21tYW5kcy5mb3JFYWNoKChba2luZCwgYXJnc10pID0+IHtcbiAgICAgIGlmIChraW5kID09PSBkZWZhdWx0S2luZCkge1xuICAgICAgICAvLyBhbHdheXMgcHJlZmVyIHRoZSBhcmdzLCBidXQga2VlcCBleGlzdGluZyBrZXlzIGZyb20gdGhlIGRlZmF1bHRBcmdzXG4gICAgICAgIGFyZ3MgPSB7IC4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzIH07XG4gICAgICAgIGFyZ3MuY2FsbGJhY2sgPSBhcmdzLmNhbGxiYWNrIHx8IGRlZmF1bHRBcmdzLmNhbGxiYWNrO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJUb0Vscyh2aWV3LmxpdmVTb2NrZXQsIHNvdXJjZUVsLCBhcmdzKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICB0aGlzW2BleGVjXyR7a2luZH1gXShlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgaXNWaXNpYmxlKGVsKSB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZWwub2Zmc2V0V2lkdGggfHxcbiAgICAgIGVsLm9mZnNldEhlaWdodCB8fFxuICAgICAgZWwuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwXG4gICAgKTtcbiAgfSxcblxuICAvLyByZXR1cm5zIHRydWUgaWYgYW55IHBhcnQgb2YgdGhlIGVsZW1lbnQgaXMgaW5zaWRlIHRoZSB2aWV3cG9ydFxuICBpc0luVmlld3BvcnQoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2luZG93SGVpZ2h0ID1cbiAgICAgIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHdpbmRvd1dpZHRoID1cbiAgICAgIHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcblxuICAgIHJldHVybiAoXG4gICAgICByZWN0LnJpZ2h0ID4gMCAmJlxuICAgICAgcmVjdC5ib3R0b20gPiAwICYmXG4gICAgICByZWN0LmxlZnQgPCB3aW5kb3dXaWR0aCAmJlxuICAgICAgcmVjdC50b3AgPCB3aW5kb3dIZWlnaHRcbiAgICApO1xuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICAvLyBjb21tYW5kc1xuXG4gIGV4ZWNfZXhlYyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0ciwgdG8gfSkge1xuICAgIGNvbnN0IGVuY29kZWRKUyA9IGVsLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICBpZiAoIWVuY29kZWRKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCAke2F0dHJ9IHRvIGNvbnRhaW4gSlMgY29tbWFuZCBvbiBcIiR7dG99XCJgKTtcbiAgICB9XG4gICAgdmlldy5saXZlU29ja2V0LmV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUpO1xuICB9LFxuXG4gIGV4ZWNfZGlzcGF0Y2goXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGV2ZW50LCBkZXRhaWwsIGJ1YmJsZXMsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIGRldGFpbCA9IGRldGFpbCB8fCB7fTtcbiAgICBkZXRhaWwuZGlzcGF0Y2hlciA9IHNvdXJjZUVsO1xuICAgIGlmIChibG9ja2luZykge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICAgIGRldGFpbC5kb25lID0gcmVzb2x2ZTtcbiAgICAgIH0pO1xuICAgICAgdmlldy5saXZlU29ja2V0LmFzeW5jVHJhbnNpdGlvbihwcm9taXNlKTtcbiAgICB9XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQoZWwsIGV2ZW50LCB7IGRldGFpbCwgYnViYmxlcyB9KTtcbiAgfSxcblxuICBleGVjX3B1c2goZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCBhcmdzKSB7XG4gICAgY29uc3Qge1xuICAgICAgZXZlbnQsXG4gICAgICBkYXRhLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nLFxuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlzcGF0Y2hlcixcbiAgICAgIGNhbGxiYWNrLFxuICAgIH0gPSBhcmdzO1xuICAgIGNvbnN0IHB1c2hPcHRzID0ge1xuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nOiAhIXBhZ2VfbG9hZGluZyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgfTtcbiAgICBjb25zdCB0YXJnZXRTcmMgPVxuICAgICAgZXZlbnRUeXBlID09PSBcImNoYW5nZVwiICYmIGRpc3BhdGNoZXIgPyBkaXNwYXRjaGVyIDogc291cmNlRWw7XG4gICAgY29uc3QgcGh4VGFyZ2V0ID1cbiAgICAgIHRhcmdldCB8fCB0YXJnZXRTcmMuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhcInRhcmdldFwiKSkgfHwgdGFyZ2V0U3JjO1xuICAgIGNvbnN0IGhhbmRsZXIgPSAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICBpZiAoIXRhcmdldFZpZXcuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBcImNoYW5nZVwiKSB7XG4gICAgICAgIGxldCB7IG5ld0NpZCwgX3RhcmdldCB9ID0gYXJncztcbiAgICAgICAgX3RhcmdldCA9XG4gICAgICAgICAgX3RhcmdldCB8fCAoRE9NLmlzRm9ybUlucHV0KHNvdXJjZUVsKSA/IHNvdXJjZUVsLm5hbWUgOiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoX3RhcmdldCkge1xuICAgICAgICAgIHB1c2hPcHRzLl90YXJnZXQgPSBfdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFZpZXcucHVzaElucHV0KFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBuZXdDaWQsXG4gICAgICAgICAgZXZlbnQgfHwgcGh4RXZlbnQsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gXCJzdWJtaXRcIikge1xuICAgICAgICBjb25zdCB7IHN1Ym1pdHRlciB9ID0gYXJncztcbiAgICAgICAgdGFyZ2V0Vmlldy5zdWJtaXRGb3JtKFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBldmVudCB8fCBwaHhFdmVudCxcbiAgICAgICAgICBzdWJtaXR0ZXIsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRWaWV3LnB1c2hFdmVudChcbiAgICAgICAgICBldmVudFR5cGUsXG4gICAgICAgICAgc291cmNlRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIGV2ZW50IHx8IHBoeEV2ZW50LFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBpbiBjYXNlIG9mIGZvcm1SZWNvdmVyeSwgdGFyZ2V0VmlldyBhbmQgdGFyZ2V0Q3R4IGFyZSBwYXNzZWQgYXMgYXJndW1lbnRcbiAgICAvLyBhcyB0aGV5IGFyZSBsb29rZWQgdXAgaW4gYSB0ZW1wbGF0ZSBlbGVtZW50LCBub3QgdGhlIHJlYWwgRE9NXG4gICAgaWYgKGFyZ3MudGFyZ2V0VmlldyAmJiBhcmdzLnRhcmdldEN0eCkge1xuICAgICAgaGFuZGxlcihhcmdzLnRhcmdldFZpZXcsIGFyZ3MudGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlldy53aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgaGFuZGxlcik7XG4gICAgfVxuICB9LFxuXG4gIGV4ZWNfbmF2aWdhdGUoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGhyZWYsIHJlcGxhY2UgfSkge1xuICAgIHZpZXcubGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgbnVsbCxcbiAgICAgIHNvdXJjZUVsLFxuICAgICk7XG4gIH0sXG5cbiAgZXhlY19wYXRjaChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgaHJlZiwgcmVwbGFjZSB9KSB7XG4gICAgdmlldy5saXZlU29ja2V0LnB1c2hIaXN0b3J5UGF0Y2goXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgc291cmNlRWwsXG4gICAgKTtcbiAgfSxcblxuICBleGVjX2ZvY3VzKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCkge1xuICAgIEFSSUEuYXR0ZW1wdEZvY3VzKGVsKTtcbiAgICAvLyBpbiBjYXNlIHRoZSBKUy5mb2N1cyBjb21tYW5kIGlzIGluIGEgSlMuc2hvdy9oaWRlL3RvZ2dsZSBjaGFpbiwgZm9yIHNob3cgd2UgbmVlZFxuICAgIC8vIHRvIHdhaXQgZm9yIEpTLnNob3cgdG8gaGF2ZSB1cGRhdGVkIHRoZSBlbGVtZW50J3MgZGlzcGxheSBwcm9wZXJ0eSAoc2VlIGV4ZWNfdG9nZ2xlKVxuICAgIC8vIGJ1dCB0aGF0IHJ1biBpbiBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgdGhlcmVmb3JlIHdlIG5lZWQgdG8gdXNlIHRoZW0gaGVyZSBhcyB3ZWxsXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IEFSSUEuYXR0ZW1wdEZvY3VzKGVsKSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgZXhlY19mb2N1c19maXJzdChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwpIHtcbiAgICBBUklBLmZvY3VzRmlyc3RJbnRlcmFjdGl2ZShlbCkgfHwgQVJJQS5mb2N1c0ZpcnN0KGVsKTtcbiAgICAvLyBpZiB5b3Ugd29uZGVyIGFib3V0IHRoZSBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgc2VlIGV4ZWNfZm9jdXNcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoXG4gICAgICAgICgpID0+IEFSSUEuZm9jdXNGaXJzdEludGVyYWN0aXZlKGVsKSB8fCBBUklBLmZvY3VzRmlyc3QoZWwpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSxcblxuICBleGVjX3B1c2hfZm9jdXMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsKSB7XG4gICAgZm9jdXNTdGFjay5wdXNoKGVsIHx8IHNvdXJjZUVsKTtcbiAgfSxcblxuICBleGVjX3BvcF9mb2N1cyhfZSwgX2V2ZW50VHlwZSwgX3BoeEV2ZW50LCBfdmlldywgX3NvdXJjZUVsLCBfZWwpIHtcbiAgICBjb25zdCBlbCA9IGZvY3VzU3RhY2sucG9wKCk7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5mb2N1cygpO1xuICAgICAgLy8gaWYgeW91IHdvbmRlciBhYm91dCB0aGUgbmVzdGVkIGFuaW1hdGlvbiBmcmFtZXMsIHNlZSBleGVjX2ZvY3VzXG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBlbC5mb2N1cygpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBleGVjX2FkZF9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBuYW1lcywgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3JlbW92ZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMudG9nZ2xlQ2xhc3NlcyhlbCwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9hdHRyKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBhdHRyOiBbYXR0ciwgdmFsMSwgdmFsMl0gfSxcbiAgKSB7XG4gICAgdGhpcy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgfSxcblxuICBleGVjX2lnbm9yZV9hdHRycyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0cnMgfSkge1xuICAgIHRoaXMuaWdub3JlQXR0cnMoZWwsIGF0dHJzKTtcbiAgfSxcblxuICBleGVjX3RyYW5zaXRpb24oXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IHRpbWUsIHRyYW5zaXRpb24sIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZShcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLnRvZ2dsZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWUsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3Nob3coXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuc2hvdyhldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyk7XG4gIH0sXG5cbiAgZXhlY19oaWRlKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLmhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpO1xuICB9LFxuXG4gIGV4ZWNfc2V0X2F0dHIoXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGF0dHI6IFthdHRyLCB2YWxdIH0sXG4gICkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWxdXSwgW10pO1xuICB9LFxuXG4gIGV4ZWNfcmVtb3ZlX2F0dHIoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGF0dHIgfSkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW10sIFthdHRyXSk7XG4gIH0sXG5cbiAgaWdub3JlQXR0cnMoZWwsIGF0dHJzKSB7XG4gICAgRE9NLnB1dFByaXZhdGUoZWwsIFwiSlM6aWdub3JlX2F0dHJzXCIsIHtcbiAgICAgIGFwcGx5OiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgIEFycmF5LmZyb20oZnJvbUVsLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhdHRycy5zb21lKFxuICAgICAgICAgICAgICAodG9JZ25vcmUpID0+XG4gICAgICAgICAgICAgICAgYXR0ci5uYW1lID09IHRvSWdub3JlIHx8XG4gICAgICAgICAgICAgICAgdG9JZ25vcmUgPT09IFwiKlwiIHx8XG4gICAgICAgICAgICAgICAgKHRvSWdub3JlLmluY2x1ZGVzKFwiKlwiKSAmJiBhdHRyLm5hbWUubWF0Y2godG9JZ25vcmUpICE9IG51bGwpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcblxuICBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpIHtcbiAgICBjb25zdCBpZ25vcmVBdHRycyA9IERPTS5wcml2YXRlKGZyb21FbCwgXCJKUzppZ25vcmVfYXR0cnNcIik7XG4gICAgaWYgKGlnbm9yZUF0dHJzKSB7XG4gICAgICBpZ25vcmVBdHRycy5hcHBseShmcm9tRWwsIHRvRWwpO1xuICAgIH1cbiAgfSxcblxuICAvLyB1dGlscyBmb3IgY29tbWFuZHNcblxuICBzaG93KGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nKSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgIHRoaXMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIHZpZXcsXG4gICAgICAgIGVsLFxuICAgICAgICBkaXNwbGF5LFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICBudWxsLFxuICAgICAgICB0aW1lLFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIGhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpIHtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUoZWwpKSB7XG4gICAgICB0aGlzLnRvZ2dsZShcbiAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICB2aWV3LFxuICAgICAgICBlbCxcbiAgICAgICAgZGlzcGxheSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbixcbiAgICAgICAgdGltZSxcbiAgICAgICAgYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICB0b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZykge1xuICAgIHRpbWUgPSB0aW1lIHx8IGRlZmF1bHRfdHJhbnNpdGlvbl90aW1lO1xuICAgIGNvbnN0IFtpbkNsYXNzZXMsIGluU3RhcnRDbGFzc2VzLCBpbkVuZENsYXNzZXNdID0gaW5zIHx8IFtbXSwgW10sIFtdXTtcbiAgICBjb25zdCBbb3V0Q2xhc3Nlcywgb3V0U3RhcnRDbGFzc2VzLCBvdXRFbmRDbGFzc2VzXSA9IG91dHMgfHwgW1tdLCBbXSwgW11dO1xuICAgIGlmIChpbkNsYXNzZXMubGVuZ3RoID4gMCB8fCBvdXRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgY29uc3Qgb25TdGFydCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgb3V0U3RhcnRDbGFzc2VzLFxuICAgICAgICAgICAgaW5DbGFzc2VzLmNvbmNhdChpblN0YXJ0Q2xhc3NlcykuY29uY2F0KGluRW5kQ2xhc3NlcyksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRDbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRFbmRDbGFzc2VzLCBvdXRTdGFydENsYXNzZXMpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FbmQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIFtdLCBvdXRDbGFzc2VzLmNvbmNhdChvdXRFbmRDbGFzc2VzKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfTtcbiAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgIGlmIChibG9ja2luZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgICAgc2V0VGltZW91dChvbkVuZCwgdGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmlldy50cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gXCJyZW1vdmVcIikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvblN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBpblN0YXJ0Q2xhc3NlcyxcbiAgICAgICAgICAgIG91dENsYXNzZXMuY29uY2F0KG91dFN0YXJ0Q2xhc3NlcykuY29uY2F0KG91dEVuZENsYXNzZXMpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RpY2t5RGlzcGxheSA9IGRpc3BsYXkgfHwgdGhpcy5kZWZhdWx0RGlzcGxheShlbCk7XG4gICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBmaXJzdCBhZGQgdGhlIHN0YXJ0aW5nICsgYWN0aXZlIGNsYXNzLCBUSEVOIG1ha2UgdGhlIGVsZW1lbnQgdmlzaWJsZVxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGlmIHdlIHRvZ2dsZWQgdGhlIHZpc2liaWxpdHkgZWFybGllciBjc3MgYW5pbWF0aW9uc1xuICAgICAgICAgICAgLy8gd291bGQgZmxpY2tlciwgYXMgdGhlIGVsZW1lbnQgYmVjb21lcyB2aXNpYmxlIGJlZm9yZSB0aGUgYWN0aXZlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gY2xhc3MgaXMgc2V0IChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM0NTYpXG4gICAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgaW5DbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICAvLyBhZGRPclJlbW92ZUNsYXNzZXMgdXNlcyBhIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpdHNlbGYsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIG1vdmUgdGhlIHB1dFN0aWNreVxuICAgICAgICAgICAgLy8gaW50byB0aGUgbmV4dCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuLi5cbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICAgIFwidG9nZ2xlXCIsXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBpbkVuZENsYXNzZXMsIGluU3RhcnRDbGFzc2VzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVuZCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgW10sIGluQ2xhc3Nlcy5jb25jYXQoaW5FbmRDbGFzc2VzKSk7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6c2hvdy1lbmRcIikpO1xuICAgICAgICB9O1xuICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIG9uU3RhcnQoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KG9uRW5kLCB0aW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25FbmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgICBjb25zdCBzdGlja3lEaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLmRlZmF1bHREaXNwbGF5KGVsKTtcbiAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBcInRvZ2dsZVwiLFxuICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LWVuZFwiKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0b2dnbGVDbGFzc2VzKGVsLCBjbGFzc2VzLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3LCBibG9ja2luZykge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3QgbmV3QWRkcyA9IGNsYXNzZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSkgPT4gcHJldkFkZHMuaW5kZXhPZihuYW1lKSA8IDAgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gY2xhc3Nlcy5maWx0ZXIoXG4gICAgICAgIChuYW1lKSA9PiBwcmV2UmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMCAmJiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBuZXdBZGRzLFxuICAgICAgICBuZXdSZW1vdmVzLFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICB0aW1lLFxuICAgICAgICB2aWV3LFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdG9nZ2xlQXR0cihlbCwgYXR0ciwgdmFsMSwgdmFsMikge1xuICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoYXR0cikpIHtcbiAgICAgIGlmICh2YWwyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdG9nZ2xlIGJldHdlZW4gdmFsMSBhbmQgdmFsMlxuICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKGF0dHIpID09PSB2YWwxKSB7XG4gICAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDJdXSwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWwxXV0sIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGF0dHJcbiAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbXSwgW2F0dHJdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDFdXSwgW10pO1xuICAgIH1cbiAgfSxcblxuICBhZGRPclJlbW92ZUNsYXNzZXMoZWwsIGFkZHMsIHJlbW92ZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKSB7XG4gICAgdGltZSA9IHRpbWUgfHwgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWU7XG4gICAgY29uc3QgW3RyYW5zaXRpb25SdW4sIHRyYW5zaXRpb25TdGFydCwgdHJhbnNpdGlvbkVuZF0gPSB0cmFuc2l0aW9uIHx8IFtcbiAgICAgIFtdLFxuICAgICAgW10sXG4gICAgICBbXSxcbiAgICBdO1xuICAgIGlmICh0cmFuc2l0aW9uUnVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG9uU3RhcnQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHRyYW5zaXRpb25TdGFydCxcbiAgICAgICAgICBbXS5jb25jYXQodHJhbnNpdGlvblJ1bikuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICApO1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgdHJhbnNpdGlvblJ1biwgW10pO1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT5cbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCB0cmFuc2l0aW9uRW5kLCB0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpID0+XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGFkZHMuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICAgIHJlbW92ZXMuY29uY2F0KHRyYW5zaXRpb25SdW4pLmNvbmNhdCh0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICApO1xuICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgIHNldFRpbWVvdXQob25Eb25lLCB0aW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3Qga2VlcEFkZHMgPSBhZGRzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZBZGRzLmluZGV4T2YobmFtZSkgPCAwICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgY29uc3Qga2VlcFJlbW92ZXMgPSByZW1vdmVzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZSZW1vdmVzLmluZGV4T2YobmFtZSkgPCAwICYmIGVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdBZGRzID0gcHJldkFkZHNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gcmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwQWRkcyk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gYWRkcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwUmVtb3Zlcyk7XG5cbiAgICAgIERPTS5wdXRTdGlja3koZWwsIFwiY2xhc3Nlc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICAgIGN1cnJlbnRFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLm5ld1JlbW92ZXMpO1xuICAgICAgICBjdXJyZW50RWwuY2xhc3NMaXN0LmFkZCguLi5uZXdBZGRzKTtcbiAgICAgICAgcmV0dXJuIFtuZXdBZGRzLCBuZXdSZW1vdmVzXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuXG4gIHNldE9yUmVtb3ZlQXR0cnMoZWwsIHNldHMsIHJlbW92ZXMpIHtcbiAgICBjb25zdCBbcHJldlNldHMsIHByZXZSZW1vdmVzXSA9IERPTS5nZXRTdGlja3koZWwsIFwiYXR0cnNcIiwgW1tdLCBbXV0pO1xuXG4gICAgY29uc3QgYWx0ZXJlZEF0dHJzID0gc2V0cy5tYXAoKFthdHRyLCBfdmFsXSkgPT4gYXR0cikuY29uY2F0KHJlbW92ZXMpO1xuICAgIGNvbnN0IG5ld1NldHMgPSBwcmV2U2V0c1xuICAgICAgLmZpbHRlcigoW2F0dHIsIF92YWxdKSA9PiAhYWx0ZXJlZEF0dHJzLmluY2x1ZGVzKGF0dHIpKVxuICAgICAgLmNvbmNhdChzZXRzKTtcbiAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgIC5maWx0ZXIoKGF0dHIpID0+ICFhbHRlcmVkQXR0cnMuaW5jbHVkZXMoYXR0cikpXG4gICAgICAuY29uY2F0KHJlbW92ZXMpO1xuXG4gICAgRE9NLnB1dFN0aWNreShlbCwgXCJhdHRyc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICBuZXdSZW1vdmVzLmZvckVhY2goKGF0dHIpID0+IGN1cnJlbnRFbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgbmV3U2V0cy5mb3JFYWNoKChbYXR0ciwgdmFsXSkgPT4gY3VycmVudEVsLnNldEF0dHJpYnV0ZShhdHRyLCB2YWwpKTtcbiAgICAgIHJldHVybiBbbmV3U2V0cywgbmV3UmVtb3Zlc107XG4gICAgfSk7XG4gIH0sXG5cbiAgaGFzQWxsQ2xhc3NlcyhlbCwgY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLmV2ZXJ5KChuYW1lKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSkpO1xuICB9LFxuXG4gIGlzVG9nZ2xlZE91dChlbCwgb3V0Q2xhc3Nlcykge1xuICAgIHJldHVybiAhdGhpcy5pc1Zpc2libGUoZWwpIHx8IHRoaXMuaGFzQWxsQ2xhc3NlcyhlbCwgb3V0Q2xhc3Nlcyk7XG4gIH0sXG5cbiAgZmlsdGVyVG9FbHMobGl2ZVNvY2tldCwgc291cmNlRWwsIHsgdG8gfSkge1xuICAgIGNvbnN0IGRlZmF1bHRRdWVyeSA9ICgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodG8pO1xuICAgICAgfSBlbHNlIGlmICh0by5jbG9zZXN0KSB7XG4gICAgICAgIGNvbnN0IHRvRWwgPSBzb3VyY2VFbC5jbG9zZXN0KHRvLmNsb3Nlc3QpO1xuICAgICAgICByZXR1cm4gdG9FbCA/IFt0b0VsXSA6IFtdO1xuICAgICAgfSBlbHNlIGlmICh0by5pbm5lcikge1xuICAgICAgICByZXR1cm4gc291cmNlRWwucXVlcnlTZWxlY3RvckFsbCh0by5pbm5lcik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdG9cbiAgICAgID8gbGl2ZVNvY2tldC5qc1F1ZXJ5U2VsZWN0b3JBbGwoc291cmNlRWwsIHRvLCBkZWZhdWx0UXVlcnkpXG4gICAgICA6IFtzb3VyY2VFbF07XG4gIH0sXG5cbiAgZGVmYXVsdERpc3BsYXkoZWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgeyB0cjogXCJ0YWJsZS1yb3dcIiwgdGQ6IFwidGFibGUtY2VsbFwiIH1bZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCBcImJsb2NrXCJcbiAgICApO1xuICB9LFxuXG4gIHRyYW5zaXRpb25DbGFzc2VzKHZhbCkge1xuICAgIGlmICghdmFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgW3RyYW5zLCB0U3RhcnQsIHRFbmRdID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBbdmFsLnNwbGl0KFwiIFwiKSwgW10sIFtdXTtcbiAgICB0cmFucyA9IEFycmF5LmlzQXJyYXkodHJhbnMpID8gdHJhbnMgOiB0cmFucy5zcGxpdChcIiBcIik7XG4gICAgdFN0YXJ0ID0gQXJyYXkuaXNBcnJheSh0U3RhcnQpID8gdFN0YXJ0IDogdFN0YXJ0LnNwbGl0KFwiIFwiKTtcbiAgICB0RW5kID0gQXJyYXkuaXNBcnJheSh0RW5kKSA/IHRFbmQgOiB0RW5kLnNwbGl0KFwiIFwiKTtcbiAgICByZXR1cm4gW3RyYW5zLCB0U3RhcnQsIHRFbmRdO1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgSlM7XG4iLCAiaW1wb3J0IEpTIGZyb20gXCIuL2pzXCI7XG5pbXBvcnQgTGl2ZVNvY2tldCBmcm9tIFwiLi9saXZlX3NvY2tldFwiO1xuXG50eXBlIFRyYW5zaXRpb24gPSBzdHJpbmcgfCBzdHJpbmdbXTtcblxuLy8gQmFzZSBvcHRpb25zIGZvciBjb21tYW5kcyBpbnZvbHZpbmcgdHJhbnNpdGlvbnMgYW5kIHRpbWluZ1xudHlwZSBCYXNlT3B0cyA9IHtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIHRvIHNldC5cbiAgICogQWNjZXB0cyBhIHN0cmluZyBvZiBjbGFzc2VzIG9yIGEgMy10dXBsZSBsaWtlOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0wXCIsIFwib3BhY2l0eS0xMDBcIl1gXG4gICAqL1xuICB0cmFuc2l0aW9uPzogVHJhbnNpdGlvbjtcbiAgLyoqIFRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgMjAwLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG50eXBlIFNob3dPcHRzID0gQmFzZU9wdHMgJiB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG59O1xuXG50eXBlIFRvZ2dsZU9wdHMgPSB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQ1NTIHRyYW5zaXRpb24gY2xhc3NlcyBmb3Igc2hvd2luZy5cbiAgICogQWNjZXB0cyBlaXRoZXIgdGhlIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgaW4sIG9yXG4gICAqIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSB0cmFuc2l0aW9uIGNsYXNzLCB0aGUgY2xhc3MgdG8gYXBwbHlcbiAgICogdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqIGBbXCJlYXNlLW91dCBkdXJhdGlvbi0zMDBcIiwgXCJvcGFjaXR5LTBcIiwgXCJvcGFjaXR5LTEwMFwiXWBcbiAgICovXG4gIGluPzogVHJhbnNpdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIGZvciBoaWRpbmcuXG4gICAqIEFjY2VwdHMgZWl0aGVyIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgb3V0LCBvclxuICAgKiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqIHRvIHN0YXJ0IHRoZSB0cmFuc2l0aW9uLCBhbmQgdGhlIGVuZGluZyB0cmFuc2l0aW9uIGNsYXNzLCBzdWNoIGFzOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0xMDBcIiwgXCJvcGFjaXR5LTBcIl1gXG4gICAqL1xuICBvdXQ/OiBUcmFuc2l0aW9uO1xuICAvKiogVGhlIHRyYW5zaXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG4vLyBPcHRpb25zIHNwZWNpZmljIHRvIHRoZSAndHJhbnNpdGlvbicgY29tbWFuZFxudHlwZSBUcmFuc2l0aW9uQ29tbWFuZE9wdHMgPSB7XG4gIC8qKiBUaGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuICovXG4gIHRpbWU/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRvIGJsb2NrIFVJIGR1cmluZyB0cmFuc2l0aW9uLiBEZWZhdWx0cyBgdHJ1ZWAuICovXG4gIGJsb2NraW5nPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUHVzaE9wdHMgPSB7XG4gIC8qKiBEYXRhIHRvIGJlIG1lcmdlZCBpbnRvIHRoZSBldmVudCBwYXlsb2FkLiAqL1xuICB2YWx1ZT86IGFueTtcbiAgLyoqIEZvciB0YXJnZXRpbmcgYSBMaXZlQ29tcG9uZW50IGJ5IGl0cyBJRCwgYSBjb21wb25lbnQgSUQgKG51bWJlciksIG9yIGEgQ1NTIHNlbGVjdG9yIHN0cmluZy4gKi9cbiAgdGFyZ2V0PzogSFRNTEVsZW1lbnQgfCBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBJbmRpY2F0ZXMgaWYgYSBwYWdlIGxvYWRpbmcgc3RhdGUgc2hvdWxkIGJlIHNob3duLiAqL1xuICBwYWdlX2xvYWRpbmc/OiBib29sZWFuO1xuICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93IG90aGVyIHByb3BlcnRpZXMgbGlrZSAnY2lkJywgJ3JlZGlyZWN0JywgZXRjLlxufTtcblxudHlwZSBOYXZpZ2F0aW9uT3B0cyA9IHtcbiAgLyoqIFdoZXRoZXIgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGluc3RlYWQgb2YgcHVzaGluZyBhIG5ldyBvbmUuICovXG4gIHJlcGxhY2U/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFsbCBwb3NzaWJsZSBKUyBjb21tYW5kcyB0aGF0IGNhbiBiZSBnZW5lcmF0ZWQgYnkgdGhlIGZhY3RvcnkuXG4gKiBUaGlzIGlzIHVzZWQgYXMgYSBiYXNlIGZvciBMaXZlU29ja2V0SlNDb21tYW5kcyBhbmQgSG9va0pTQ29tbWFuZHMuXG4gKi9cbmludGVyZmFjZSBBbGxKU0NvbW1hbmRzIHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgZWxlbWVudC5cbiAgICogVGhpcyB2ZXJzaW9uIGlzIGZvciBnZW5lcmFsIHVzZSB2aWEgbGl2ZVNvY2tldC5qcygpLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCBpbiB3aG9zZSBjb250ZXh0IHRvIGV4ZWN1dGUgdGhlIEphdmFTY3JpcHQuXG4gICAqIEBwYXJhbSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbDogSFRNTEVsZW1lbnQsIGVuY29kZWRKUzogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogU2hvd3MgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gc2hvdy5cbiAgICogQHBhcmFtIHtTaG93T3B0c30gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYGRpc3BsYXlgLCBgdHJhbnNpdGlvbmAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICBzaG93KGVsOiBIVE1MRWxlbWVudCwgb3B0cz86IFNob3dPcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogSGlkZXMgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gaGlkZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGhpZGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGBkaXNwbGF5YCwgYGluYCwgYG91dGAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0b2dnbGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogVG9nZ2xlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgQ1NTIGNsYXNzZXMgdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYWRkIGNsYXNzZXMgdG8uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIGFkZC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGFkZENsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIENTUyBjbGFzc2VzIGZyb20gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gcmVtb3ZlIGNsYXNzZXMgZnJvbS5cbiAgICogQHBhcmFtIG5hbWVzIC0gVGhlIGNsYXNzIG5hbWUocykgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYHRyYW5zaXRpb25gLCBgdGltZWAsIGFuZCBgYmxvY2tpbmdgLlxuICAgKi9cbiAgcmVtb3ZlQ2xhc3MoZWw6IEhUTUxFbGVtZW50LCBuYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdHM/OiBCYXNlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgQ1NTIGNsYXNzZXMgb24gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gdG9nZ2xlIGNsYXNzZXMgb24uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIHRvZ2dsZUNsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgQ1NTIHRyYW5zaXRpb24gdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIHRyYW5zaXRpb24gdG8uXG4gICAqIEBwYXJhbSB0cmFuc2l0aW9uIC0gVGhlIHRyYW5zaXRpb24gY2xhc3MoZXMpIHRvIGFwcGx5LlxuICAgKiAgIEFjY2VwdHMgYSBzdHJpbmcgb2YgY2xhc3NlcyB0byBhcHBseSB3aGVuIHRyYW5zaXRpb25pbmcgb3JcbiAgICogICBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqICAgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqXG4gICAqICAgICAgIFtcImVhc2Utb3V0IGR1cmF0aW9uLTMwMFwiLCBcIm9wYWNpdHktMTAwXCIsIFwib3BhY2l0eS0wXCJdXG4gICAqXG4gICAqIEBwYXJhbSBbb3B0cz17fV0gLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGltaW5nIGFuZCBibG9ja2luZyBiZWhhdmlvci5cbiAgICogICBBY2NlcHRzOiBgdGltZWAgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0cmFuc2l0aW9uKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICB0cmFuc2l0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBvcHRzPzogVHJhbnNpdGlvbkNvbW1hbmRPcHRzLFxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXRzIGFuIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gc2V0LlxuICAgKiBAcGFyYW0gdmFsIC0gVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAgICovXG4gIHNldEF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgYXR0cmlidXRlIGZyb20uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgYW4gYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgYmV0d2VlbiB0d28gdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gdG9nZ2xlLlxuICAgKiBAcGFyYW0gdmFsMSAtIFRoZSBmaXJzdCB2YWx1ZSB0byB0b2dnbGUgYmV0d2Vlbi5cbiAgICogQHBhcmFtIHZhbDIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIHRvZ2dsZSBiZXR3ZWVuLlxuICAgKi9cbiAgdG9nZ2xlQXR0cmlidXRlKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICBhdHRyOiBzdHJpbmcsXG4gICAgdmFsMTogc3RyaW5nLFxuICAgIHZhbDI6IHN0cmluZyxcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogUHVzaGVzIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIEFuIGVsZW1lbnQgdGhhdCBiZWxvbmdzIHRvIHRoZSB0YXJnZXQgTGl2ZVZpZXcgLyBMaXZlQ29tcG9uZW50IG9yIGEgY29tcG9uZW50IElELlxuICAgKiAgIFRvIHRhcmdldCBhIExpdmVDb21wb25lbnQgYnkgaXRzIElELCBwYXNzIGEgc2VwYXJhdGUgYHRhcmdldGAgaW4gdGhlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIGV2ZW50IG5hbWUgdG8gcHVzaC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB2YWx1ZWAsIGB0YXJnZXRgLCBgcGFnZV9sb2FkaW5nYC5cbiAgICovXG4gIHB1c2goZWw6IEhUTUxFbGVtZW50LCB0eXBlOiBzdHJpbmcsIG9wdHM/OiBQdXNoT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbmF2aWdhdGlvbiBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBuYXZpZ2F0ZSB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIG5hdmlnYXRlKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogU2VuZHMgYSBwYXRjaCBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBwYXRjaCB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIHBhdGNoKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogTWFyayBhdHRyaWJ1dGVzIGFzIGlnbm9yZWQsIHNraXBwaW5nIHRoZW0gd2hlbiBwYXRjaGluZyB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBpZ25vcmUgYXR0cmlidXRlcyBvbi5cbiAgICogQHBhcmFtIGF0dHJzIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIG9yIG5hbWVzIHRvIGlnbm9yZS5cbiAgICovXG4gIGlnbm9yZUF0dHJpYnV0ZXMoZWw6IEhUTUxFbGVtZW50LCBhdHRyczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoXG4gIGxpdmVTb2NrZXQ6IExpdmVTb2NrZXQsXG4gIGV2ZW50VHlwZTogc3RyaW5nIHwgbnVsbCxcbik6IEFsbEpTQ29tbWFuZHMgPT4ge1xuICByZXR1cm4ge1xuICAgIGV4ZWMoZWwsIGVuY29kZWRKUykge1xuICAgICAgbGl2ZVNvY2tldC5leGVjSlMoZWwsIGVuY29kZWRKUywgZXZlbnRUeXBlKTtcbiAgICB9LFxuICAgIHNob3coZWwsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLnNob3coXG4gICAgICAgIGV2ZW50VHlwZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIGVsLFxuICAgICAgICBvcHRzLmRpc3BsYXksXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBoaWRlKGVsLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5oaWRlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZShlbCwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgY29uc3QgaW5UcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5pbik7XG4gICAgICBjb25zdCBvdXRUcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5vdXQpO1xuICAgICAgSlMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgb3B0cy5kaXNwbGF5LFxuICAgICAgICBpblRyYW5zaXRpb24sXG4gICAgICAgIG91dFRyYW5zaXRpb24sXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhZGRDbGFzcyhlbCwgbmFtZXMsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IEFycmF5LmlzQXJyYXkobmFtZXMpID8gbmFtZXMgOiBuYW1lcy5zcGxpdChcIiBcIik7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgSlMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIG9wdHMuYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH0sXG4gICAgcmVtb3ZlQ2xhc3MoZWwsIG5hbWVzLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzIDogbmFtZXMuc3BsaXQoXCIgXCIpO1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgZWwsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGFzc05hbWVzLFxuICAgICAgICBKUy50cmFuc2l0aW9uQ2xhc3NlcyhvcHRzLnRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZUNsYXNzKGVsLCBuYW1lcywgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjbGFzc05hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IG5hbWVzLnNwbGl0KFwiIFwiKTtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy50b2dnbGVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvd25lcixcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICB0cmFuc2l0aW9uKGVsLCB0cmFuc2l0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBbXSxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKHRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHNldEF0dHJpYnV0ZShlbCwgYXR0ciwgdmFsKSB7XG4gICAgICBKUy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbF1dLCBbXSk7XG4gICAgfSxcbiAgICByZW1vdmVBdHRyaWJ1dGUoZWwsIGF0dHIpIHtcbiAgICAgIEpTLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtdLCBbYXR0cl0pO1xuICAgIH0sXG4gICAgdG9nZ2xlQXR0cmlidXRlKGVsLCBhdHRyLCB2YWwxLCB2YWwyKSB7XG4gICAgICBKUy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgICB9LFxuICAgIHB1c2goZWwsIHR5cGUsIG9wdHMgPSB7fSkge1xuICAgICAgbGl2ZVNvY2tldC53aXRoaW5Pd25lcnMoZWwsICh2aWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBvcHRzLnZhbHVlIHx8IHt9O1xuICAgICAgICBkZWxldGUgb3B0cy52YWx1ZTtcbiAgICAgICAgbGV0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiLCB7IGRldGFpbDogeyBzb3VyY2VFbGVtZW50OiBlbCB9IH0pO1xuICAgICAgICBKUy5leGVjKGUsIGV2ZW50VHlwZSwgdHlwZSwgdmlldywgZWwsIFtcInB1c2hcIiwgeyBkYXRhLCAuLi5vcHRzIH1dKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoaHJlZiwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIpO1xuICAgICAgbGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICAgIGN1c3RvbUV2ZW50LFxuICAgICAgICBocmVmLFxuICAgICAgICBvcHRzLnJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHBhdGNoKGhyZWYsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiKTtcbiAgICAgIGxpdmVTb2NrZXQucHVzaEhpc3RvcnlQYXRjaChcbiAgICAgICAgY3VzdG9tRXZlbnQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIG9wdHMucmVwbGFjZSA/IFwicmVwbGFjZVwiIDogXCJwdXNoXCIsXG4gICAgICAgIG51bGwsXG4gICAgICApO1xuICAgIH0sXG4gICAgaWdub3JlQXR0cmlidXRlcyhlbCwgYXR0cnMpIHtcbiAgICAgIEpTLmlnbm9yZUF0dHJzKGVsLCBBcnJheS5pc0FycmF5KGF0dHJzKSA/IGF0dHJzIDogW2F0dHJzXSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogSlNDb21tYW5kcyBmb3IgdXNlIHdpdGggYGxpdmVTb2NrZXQuanMoKWAuXG4gKiBJbmNsdWRlcyB0aGUgZ2VuZXJhbCBgZXhlY2AgY29tbWFuZCB0aGF0IHJlcXVpcmVzIGFuIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIExpdmVTb2NrZXRKU0NvbW1hbmRzID0gQWxsSlNDb21tYW5kcztcblxuLyoqXG4gKiBKU0NvbW1hbmRzIGZvciB1c2Ugd2l0aGluIGEgSG9vay5cbiAqIFRoZSBgZXhlY2AgY29tbWFuZCBpcyB0YWlsb3JlZCBmb3IgaG9va3MsIG5vdCByZXF1aXJpbmcgYW4gZXhwbGljaXQgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb29rSlNDb21tYW5kcyBleHRlbmRzIE9taXQ8QWxsSlNDb21tYW5kcywgXCJleGVjXCI+IHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgaG9vaydzIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbmNvZGVkSlM6IHN0cmluZyk6IHZvaWQ7XG59XG4iLCAiaW1wb3J0IGpzQ29tbWFuZHMsIHsgSG9va0pTQ29tbWFuZHMgfSBmcm9tIFwiLi9qc19jb21tYW5kc1wiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBMaXZlU29ja2V0IGZyb20gXCIuL2xpdmVfc29ja2V0XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5cbmNvbnN0IEhPT0tfSUQgPSBcImhvb2tJZFwiO1xubGV0IHZpZXdIb29rSUQgPSAxO1xuXG5leHBvcnQgdHlwZSBPblJlcGx5ID0gKHJlcGx5OiBhbnksIHJlZjogbnVtYmVyKSA9PiBhbnk7XG5leHBvcnQgdHlwZSBDYWxsYmFja1JlZiA9IHsgZXZlbnQ6IHN0cmluZzsgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSB9O1xuXG5leHBvcnQgdHlwZSBQaHhUYXJnZXQgPSBzdHJpbmcgfCBudW1iZXIgfCBIVE1MRWxlbWVudDtcblxuZXhwb3J0IGludGVyZmFjZSBIb29rSW50ZXJmYWNlPEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgRE9NIGVsZW1lbnQgdGhhdCB0aGUgaG9vayBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIGVsOiBFO1xuXG4gIC8qKlxuICAgKiBUaGUgTGl2ZVNvY2tldCBpbnN0YW5jZSB0aGF0IHRoZSBob29rIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICAvKipcbiAgICogVGhlIG1vdW50ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBET00gYW5kIGl0cyBzZXJ2ZXIgTGl2ZVZpZXcgaGFzIGZpbmlzaGVkIG1vdW50aW5nLlxuICAgKi9cbiAgbW91bnRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBiZWZvcmVVcGRhdGUgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGFib3V0IHRvIGJlIHVwZGF0ZWQgaW4gdGhlIERPTS5cbiAgICogTm90ZTogYW55IGNhbGwgaGVyZSBtdXN0IGJlIHN5bmNocm9ub3VzIGFzIHRoZSBvcGVyYXRpb24gY2Fubm90IGJlIGRlZmVycmVkIG9yIGNhbmNlbGxlZC5cbiAgICovXG4gIGJlZm9yZVVwZGF0ZT86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXN0cm95ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSwgZWl0aGVyIGJ5IGEgcGFyZW50IHVwZGF0ZSwgb3IgYnkgdGhlIHBhcmVudCBiZWluZyByZW1vdmVkIGVudGlyZWx5XG4gICAqL1xuICBkZXN0cm95ZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzY29ubmVjdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCdzIHBhcmVudCBMaXZlVmlldyBoYXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBtYW5pcGx1YXRlIHRoZSBET00gYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdC5cbiAgICogVGhlIGFwcGxpZWQgY2hhbmdlcyBpbnRlZ3JhdGUgd2l0aCBzZXJ2ZXIgRE9NIHBhdGNoaW5nLlxuICAgKi9cbiAganMoKTogSG9va0pTQ29tbWFuZHM7XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBhbiBldmVudCB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIFtwYXlsb2FkXSAtIFRoZSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuICAgKiBAcGFyYW0gW29uUmVwbHldIC0gQSBjYWxsYmFjayB0byBoYW5kbGUgdGhlIHNlcnZlcidzIHJlcGx5LlxuICAgKlxuICAgKiBXaGVuIG9uUmVwbHkgaXMgbm90IHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgYSBQcm9taXNlIHRoYXRcbiAgICogV2hlbiBvblJlcGx5IGlzIHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgdm9pZC5cbiAgICovXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkOiBhbnksIG9uUmVwbHk6IE9uUmVwbHkpOiB2b2lkO1xuICBwdXNoRXZlbnQoZXZlbnQ6IHN0cmluZywgcGF5bG9hZD86IGFueSk6IFByb21pc2U8YW55PjtcblxuICAvKipcbiAgICogUHVzaGVkIGEgdGFyZ2V0ZWQgZXZlbnQgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogSXQgc2VuZHMgdGhlIGV2ZW50IHRvIHRoZSBMaXZlQ29tcG9uZW50IG9yIExpdmVWaWV3IHRoZSBgc2VsZWN0b3JPclRhcmdldGAgaXMgZGVmaW5lZCBpbixcbiAgICogd2hlcmUgaXRzIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBxdWVyeSBzZWxlY3RvciwgYW4gYWN0dWFsIERPTSBlbGVtZW50LCBvciBhIENJRCAoY29tcG9uZW50IGlkKVxuICAgKiByZXR1cm5lZCBieSB0aGUgYEBteXNlbGZgIGFzc2lnbi5cbiAgICpcbiAgICogSWYgdGhlIHF1ZXJ5IHNlbGVjdG9yIHJldHVybnMgbW9yZSB0aGFuIG9uZSBlbGVtZW50IGl0IHdpbGwgc2VuZCB0aGUgZXZlbnQgdG8gYWxsIG9mIHRoZW0sXG4gICAqIGV2ZW4gaWYgYWxsIHRoZSBlbGVtZW50cyBhcmUgaW4gdGhlIHNhbWUgTGl2ZUNvbXBvbmVudCBvciBMaXZlVmlldy4gQmVjYXVzZSBvZiB0aGlzLFxuICAgKiBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWQsIGEgcHJvbWlzZSBpcyByZXR1cm5lZCB0aGF0IG1hdGNoZXMgdGhlIHJldHVybiB2YWx1ZSBvZlxuICAgKiBbYFByb21pc2UuYWxsU2V0dGxlZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJvbWlzZS9hbGxTZXR0bGVkI3JldHVybl92YWx1ZSkuXG4gICAqIEluZGl2aWR1YWwgZnVsZmlsbGVkIHZhbHVlcyBhcmUgb2YgdGhlIGZvcm1hdCBgeyByZXBseSwgcmVmIH1gLCB3aGVyZSBgcmVwbHlgIGlzIHRoZSBzZXJ2ZXIncyByZXBseS5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdG9yT3JUYXJnZXQgLSBUaGUgc2VsZWN0b3IsIGVsZW1lbnQsIG9yIENJRCB0byB0YXJnZXQuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBldmVudCBuYW1lLlxuICAgKiBAcGFyYW0gW3BheWxvYWRdIC0gVGhlIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgc2VydmVyLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QuXG4gICAqIEBwYXJhbSBbb25SZXBseV0gLSBBIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgc2VydmVyJ3MgcmVwbHkuXG4gICAqXG4gICAqIFdoZW4gb25SZXBseSBpcyBub3QgcHJvdmlkZWQsIHRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2UuXG4gICAqIFdoZW4gb25SZXBseSBpcyBwcm92aWRlZCwgdGhlIG1ldGhvZCByZXR1cm5zIHZvaWQuXG4gICAqL1xuICBwdXNoRXZlbnRUbyhcbiAgICBzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsXG4gICAgZXZlbnQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBvYmplY3QsXG4gICAgb25SZXBseTogT25SZXBseSxcbiAgKTogdm9pZDtcbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgKTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDx7IHJlcGx5OiBhbnk7IHJlZjogbnVtYmVyIH0+W10+O1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhbiBldmVudCBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0byBoYW5kbGUgYHB1c2hFdmVudGAgY2FsbHMgZnJvbSB0aGUgc2VydmVyLiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIHBheWxvYWQgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgcmVjZWl2ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsYmFjaywgd2hpY2ggY2FuIGJlIHVzZWQgaW4gYHJlbW92ZUhhbmRsZUV2ZW50YCB0byByZW1vdmUgdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgaGFuZGxlRXZlbnQoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSk6IENhbGxiYWNrUmVmO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIGBoYW5kbGVFdmVudGAuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1JlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gdHJpZ2dlciBhIGxpdmUgZmlsZSB1cGxvYWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHVwbG9hZCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGBQaG9lbml4LkxpdmVWaWV3LmFsbG93X3VwbG9hZC8zYCBjYWxsLlxuICAgKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdXBsb2FkLlxuICAgKi9cbiAgdXBsb2FkKG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvKipcbiAgICogQWxsb3dzIHRvIHRyaWdnZXIgYSBsaXZlIGZpbGUgdXBsb2FkIHRvIGEgc3BlY2lmaWMgdGFyZ2V0LlxuICAgKlxuICAgKiBAcGFyYW0gc2VsZWN0b3JPclRhcmdldCAtIFRoZSB0YXJnZXQgdG8gdXBsb2FkIHRoZSBmaWxlcyB0by5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgdXBsb2FkIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgYFBob2VuaXguTGl2ZVZpZXcuYWxsb3dfdXBsb2FkLzNgIGNhbGwuXG4gICAqIEBwYXJhbSBmaWxlcyAtIFRoZSBmaWxlcyB0byB1cGxvYWQuXG4gICAqL1xuICB1cGxvYWRUbyhzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsIG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvLyBhbGxvdyB1bmtub3duIG1ldGhvZHMsIGFzIHBlb3BsZSBjYW4gZGVmaW5lIHRoZW0gaW4gdGhlaXIgaG9va3NcbiAgW2tleTogUHJvcGVydHlLZXldOiBhbnk7XG59XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9EZWZpbml0ZWx5VHlwZWQvRGVmaW5pdGVseVR5cGVkL2Jsb2IvZmFjMWFhNzVhY2RkZGJmNGYxYTk1ZTk4ZWUyMjk3YjU0Y2U0YjRjOS90eXBlcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5kLnRzI0wyNlxuLy8gbGljZW5zZWQgdW5kZXIgTUlUXG5leHBvcnQgaW50ZXJmYWNlIEhvb2s8b3V0IFQgPSBvYmplY3QsIEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgbW91bnRlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTSBhbmQgaXRzIHNlcnZlciBMaXZlVmlldyBoYXMgZmluaXNoZWQgbW91bnRpbmcuXG4gICAqL1xuICBtb3VudGVkPzogKHRoaXM6IFQgJiBIb29rSW50ZXJmYWNlPEU+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgYmVmb3JlVXBkYXRlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhYm91dCB0byBiZSB1cGRhdGVkIGluIHRoZSBET00uXG4gICAqIE5vdGU6IGFueSBjYWxsIGhlcmUgbXVzdCBiZSBzeW5jaHJvbm91cyBhcyB0aGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBkZWZlcnJlZCBvciBjYW5jZWxsZWQuXG4gICAqL1xuICBiZWZvcmVVcGRhdGU/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRlc3Ryb3llZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwYWdlLCBlaXRoZXIgYnkgYSBwYXJlbnQgdXBkYXRlLCBvciBieSB0aGUgcGFyZW50IGJlaW5nIHJlbW92ZWQgZW50aXJlbHlcbiAgICovXG4gIGRlc3Ryb3llZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRpc2Nvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBkaXNjb25uZWN0ZWQ/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvLyBBbGxvdyBjdXN0b20gbWV0aG9kcyB3aXRoIGFueSBzaWduYXR1cmUgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzXG4gIFtrZXk6IFByb3BlcnR5S2V5XTogYW55O1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIExpdmVWaWV3IGhvb2tzLiBVc2VycyBleHRlbmQgdGhpcyBjbGFzcyB0byBkZWZpbmUgdGhlaXIgaG9va3MuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15Q3VzdG9tSG9vayBleHRlbmRzIFZpZXdIb29rIHtcbiAqICAgbXlTdGF0ZSA9IFwiaW5pdGlhbFwiO1xuICpcbiAqICAgbW91bnRlZCgpIHtcbiAqICAgICBjb25zb2xlLmxvZyhcIkhvb2sgbW91bnRlZCBvbiBlbGVtZW50OlwiLCB0aGlzLmVsKTtcbiAqICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gKiAgICAgICB0aGlzLnB1c2hFdmVudChcImVsZW1lbnQtY2xpY2tlZFwiLCB7IHN0YXRlOiB0aGlzLm15U3RhdGUgfSk7XG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIHVwZGF0ZWQoKSB7XG4gKiAgICAgY29uc29sZS5sb2coXCJIb29rIHVwZGF0ZWRcIiwgdGhpcy5lbC5pZCk7XG4gKiAgIH1cbiAqXG4gKiAgIG15Q3VzdG9tTWV0aG9kKHNvbWVBcmc6IHN0cmluZykge1xuICogICAgIGNvbnNvbGUubG9nKFwibXlDdXN0b21NZXRob2QgY2FsbGVkIHdpdGg6XCIsIHNvbWVBcmcsIFwiQ3VycmVudCBzdGF0ZTpcIiwgdGhpcy5teVN0YXRlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhlIGB0aGlzYCBjb250ZXh0IHdpdGhpbiB0aGUgaG9vayBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20gbWV0aG9kcywgZXRjLilcbiAqIHdpbGwgcmVmZXIgdG8gdGhlIGhvb2sgaW5zdGFuY2UsIHByb3ZpZGluZyBhY2Nlc3MgdG8gYHRoaXMuZWxgLCBgdGhpcy5saXZlU29ja2V0YCxcbiAqIGB0aGlzLnB1c2hFdmVudCgpYCwgZXRjLiwgYXMgd2VsbCBhcyBhbnkgcHJvcGVydGllcyBvciBtZXRob2RzIGRlZmluZWQgb24gdGhlIHN1YmNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgVmlld0hvb2s8RSBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+XG4gIGltcGxlbWVudHMgSG9va0ludGVyZmFjZTxFPlxue1xuICBlbDogRTtcbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICBwcml2YXRlIF9fbGlzdGVuZXJzOiBTZXQ8Q2FsbGJhY2tSZWY+O1xuICBwcml2YXRlIF9faXNEaXNjb25uZWN0ZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX192aWV3OiAoKSA9PiBWaWV3O1xuXG4gIHN0YXRpYyBtYWtlSUQoKSB7XG4gICAgcmV0dXJuIHZpZXdIb29rSUQrKztcbiAgfVxuICBzdGF0aWMgZWxlbWVudElEKGVsOiBIVE1MRWxlbWVudCkge1xuICAgIHJldHVybiBET00ucHJpdmF0ZShlbCwgSE9PS19JRCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3OiBWaWV3IHwgbnVsbCwgZWw6IEUsIGNhbGxiYWNrcz86IEhvb2spIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5fX2F0dGFjaFZpZXcodmlldyk7XG4gICAgdGhpcy5fX2xpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBET00ucHV0UHJpdmF0ZSh0aGlzLmVsLCBIT09LX0lELCBWaWV3SG9vay5tYWtlSUQoKSk7XG5cbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAvLyBUaGlzIGluc3RhbmNlIGlzIGZvciBhbiBvYmplY3QtbGl0ZXJhbCBob29rLiBDb3B5IG1ldGhvZHMvcHJvcGVydGllcy5cbiAgICAgIC8vIFRoZXNlIGFyZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIE5PVCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsYmFja3Mgb2JqZWN0LlxuICAgICAgY29uc3QgcHJvdGVjdGVkUHJvcHMgPSBuZXcgU2V0KFtcbiAgICAgICAgXCJlbFwiLFxuICAgICAgICBcImxpdmVTb2NrZXRcIixcbiAgICAgICAgXCJfX3ZpZXdcIixcbiAgICAgICAgXCJfX2xpc3RlbmVyc1wiLFxuICAgICAgICBcIl9faXNEaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJjb25zdHJ1Y3RvclwiLCAvLyBTdGFuZGFyZCBvYmplY3QgcHJvcGVydGllc1xuICAgICAgICAvLyBDb3JlIFZpZXdIb29rIEFQSSBtZXRob2RzXG4gICAgICAgIFwianNcIixcbiAgICAgICAgXCJwdXNoRXZlbnRcIixcbiAgICAgICAgXCJwdXNoRXZlbnRUb1wiLFxuICAgICAgICBcImhhbmRsZUV2ZW50XCIsXG4gICAgICAgIFwicmVtb3ZlSGFuZGxlRXZlbnRcIixcbiAgICAgICAgXCJ1cGxvYWRcIixcbiAgICAgICAgXCJ1cGxvYWRUb1wiLFxuICAgICAgICAvLyBJbnRlcm5hbCBsaWZlY3ljbGUgY2FsbGVyc1xuICAgICAgICBcIl9fbW91bnRlZFwiLFxuICAgICAgICBcIl9fdXBkYXRlZFwiLFxuICAgICAgICBcIl9fYmVmb3JlVXBkYXRlXCIsXG4gICAgICAgIFwiX19kZXN0cm95ZWRcIixcbiAgICAgICAgXCJfX3JlY29ubmVjdGVkXCIsXG4gICAgICAgIFwiX19kaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJfX2NsZWFudXBfX1wiLFxuICAgICAgXSk7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNhbGxiYWNrcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhbGxiYWNrcywga2V5KSkge1xuICAgICAgICAgICh0aGlzIGFzIGFueSlba2V5XSA9IGNhbGxiYWNrc1trZXldO1xuICAgICAgICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UgYWxsb3cgdGhlIG92ZXJ3cml0ZSwgYnV0IHdlIGxvZyBhIHdhcm5pbmdcbiAgICAgICAgICBpZiAocHJvdGVjdGVkUHJvcHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYEhvb2sgb2JqZWN0IGZvciBlbGVtZW50ICMke2VsLmlkfSBvdmVyd3JpdGVzIGNvcmUgcHJvcGVydHkgJyR7a2V5fSchYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpZmVjeWNsZU1ldGhvZHM6IChrZXlvZiBIb29rKVtdID0gW1xuICAgICAgICBcIm1vdW50ZWRcIixcbiAgICAgICAgXCJiZWZvcmVVcGRhdGVcIixcbiAgICAgICAgXCJ1cGRhdGVkXCIsXG4gICAgICAgIFwiZGVzdHJveWVkXCIsXG4gICAgICAgIFwiZGlzY29ubmVjdGVkXCIsXG4gICAgICAgIFwicmVjb25uZWN0ZWRcIixcbiAgICAgIF07XG4gICAgICBsaWZlY3ljbGVNZXRob2RzLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNhbGxiYWNrc1ttZXRob2ROYW1lXSAmJlxuICAgICAgICAgIHR5cGVvZiBjYWxsYmFja3NbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW21ldGhvZE5hbWVdID0gY2FsbGJhY2tzW21ldGhvZE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gSWYgJ2NhbGxiYWNrcycgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIGEgdXNlci1kZWZpbmVkIGNsYXNzIChlLmcuLCBNeUhvb2spLlxuICAgIC8vIEl0cyBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20pIGFyZSBhbHJlYWR5IHBhcnQgb2YgaXRzIHByb3RvdHlwZSBvciBpbnN0YW5jZSxcbiAgICAvLyBhbmQgd2lsbCBjb3JyZWN0bHkgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzIGZyb20gVmlld0hvb2sucHJvdG90eXBlLlxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2F0dGFjaFZpZXcodmlldzogVmlldyB8IG51bGwpIHtcbiAgICBpZiAodmlldykge1xuICAgICAgdGhpcy5fX3ZpZXcgPSAoKSA9PiB2aWV3O1xuICAgICAgdGhpcy5saXZlU29ja2V0ID0gdmlldy5saXZlU29ja2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fdmlldyA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBob29rIG5vdCB5ZXQgYXR0YWNoZWQgdG8gYSBsaXZlIHZpZXc6ICR7dGhpcy5lbC5vdXRlckhUTUx9YCxcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmxpdmVTb2NrZXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZmF1bHQgbGlmZWN5Y2xlIG1ldGhvZHNcbiAgbW91bnRlZCgpOiB2b2lkIHt9XG4gIGJlZm9yZVVwZGF0ZSgpOiB2b2lkIHt9XG4gIHVwZGF0ZWQoKTogdm9pZCB7fVxuICBkZXN0cm95ZWQoKTogdm9pZCB7fVxuICBkaXNjb25uZWN0ZWQoKTogdm9pZCB7fVxuICByZWNvbm5lY3RlZCgpOiB2b2lkIHt9XG5cbiAgLy8gSW50ZXJuYWwgbGlmZWN5Y2xlIGNhbGxlcnMgLSBjYWxsZWQgYnkgdGhlIFZpZXdcblxuICAvKiogQGludGVybmFsICovXG4gIF9fbW91bnRlZCgpIHtcbiAgICB0aGlzLm1vdW50ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fdXBkYXRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fYmVmb3JlVXBkYXRlKCkge1xuICAgIHRoaXMuYmVmb3JlVXBkYXRlKCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rlc3Ryb3llZCgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCgpO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIEhPT0tfSUQpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vcGhvZW5peGZyYW1ld29yay9waG9lbml4X2xpdmVfdmlldy9pc3N1ZXMvMzQ5NlxuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19yZWNvbm5lY3RlZCgpIHtcbiAgICBpZiAodGhpcy5fX2lzRGlzY29ubmVjdGVkKSB7XG4gICAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVjb25uZWN0ZWQoKTtcbiAgICB9XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rpc2Nvbm5lY3RlZCgpIHtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBqcygpOiBIb29rSlNDb21tYW5kcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmpzQ29tbWFuZHModGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LCBcImhvb2tcIiksXG4gICAgICBleGVjOiAoZW5jb2RlZEpTOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LmV4ZWNKUyh0aGlzLmVsLCBlbmNvZGVkSlMsIFwiaG9va1wiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55LCBvblJlcGx5PzogT25SZXBseSkge1xuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLl9fdmlldygpLnB1c2hIb29rRXZlbnQoXG4gICAgICB0aGlzLmVsLFxuICAgICAgbnVsbCxcbiAgICAgIGV2ZW50LFxuICAgICAgcGF5bG9hZCB8fCB7fSxcbiAgICApO1xuICAgIGlmIChvblJlcGx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKHsgcmVwbHkgfSkgPT4gcmVwbHkpO1xuICAgIH1cbiAgICBwcm9taXNlLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgICBvblJlcGx5PzogT25SZXBseSxcbiAgKSB7XG4gICAgaWYgKG9uUmVwbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGFyZ2V0UGFpcjogeyB2aWV3OiBWaWV3OyB0YXJnZXRDdHg6IGFueSB9W10gPSBbXTtcbiAgICAgIHRoaXMuX192aWV3KCkud2l0aGluVGFyZ2V0cyhzZWxlY3Rvck9yVGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIHRhcmdldFBhaXIucHVzaCh7IHZpZXcsIHRhcmdldEN0eCB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSB0YXJnZXRQYWlyLm1hcCgoeyB2aWV3LCB0YXJnZXRDdHggfSkgPT4ge1xuICAgICAgICByZXR1cm4gdmlldy5wdXNoSG9va0V2ZW50KHRoaXMuZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQgfHwge30pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgICB9XG4gICAgdGhpcy5fX3ZpZXcoKS53aXRoaW5UYXJnZXRzKHNlbGVjdG9yT3JUYXJnZXQsICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgIHZpZXdcbiAgICAgICAgLnB1c2hIb29rRXZlbnQodGhpcy5lbCwgdGFyZ2V0Q3R4LCBldmVudCwgcGF5bG9hZCB8fCB7fSlcbiAgICAgICAgLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhbmRsZUV2ZW50KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAocGF5bG9hZDogYW55KSA9PiBhbnkpOiBDYWxsYmFja1JlZiB7XG4gICAgY29uc3QgY2FsbGJhY2tSZWY6IENhbGxiYWNrUmVmID0ge1xuICAgICAgZXZlbnQsXG4gICAgICBjYWxsYmFjazogKGN1c3RvbUV2ZW50OiBDdXN0b21FdmVudCkgPT4gY2FsbGJhY2soY3VzdG9tRXZlbnQuZGV0YWlsKSxcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDoke2V2ZW50fWAsXG4gICAgICBjYWxsYmFja1JlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5hZGQoY2FsbGJhY2tSZWYpO1xuICAgIHJldHVybiBjYWxsYmFja1JlZjtcbiAgfVxuXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIGBwaHg6JHtyZWYuZXZlbnR9YCxcbiAgICAgIHJlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5kZWxldGUocmVmKTtcbiAgfVxuXG4gIHVwbG9hZChuYW1lOiBzdHJpbmcsIGZpbGVzOiBGaWxlTGlzdCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3KCkuZGlzcGF0Y2hVcGxvYWRzKG51bGwsIG5hbWUsIGZpbGVzKTtcbiAgfVxuXG4gIHVwbG9hZFRvKHNlbGVjdG9yT3JUYXJnZXQ6IFBoeFRhcmdldCwgbmFtZTogc3RyaW5nLCBmaWxlczogRmlsZUxpc3QpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9fdmlldygpLndpdGhpblRhcmdldHMoc2VsZWN0b3JPclRhcmdldCwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgdmlldy5kaXNwYXRjaFVwbG9hZHModGFyZ2V0Q3R4LCBuYW1lLCBmaWxlcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9fY2xlYW51cF9fKCkge1xuICAgIHRoaXMuX19saXN0ZW5lcnMuZm9yRWFjaCgoY2FsbGJhY2tSZWYpID0+XG4gICAgICB0aGlzLnJlbW92ZUhhbmRsZUV2ZW50KGNhbGxiYWNrUmVmKSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEhvb2tzT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBWaWV3SG9vayB8IEhvb2s+O1xuXG5leHBvcnQgZGVmYXVsdCBWaWV3SG9vaztcbiIsICJpbXBvcnQge1xuICBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VULFxuICBDSEVDS0FCTEVfSU5QVVRTLFxuICBDT05TRUNVVElWRV9SRUxPQURTLFxuICBQSFhfQVVUT19SRUNPVkVSLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfVklFV19SRUYsXG4gIFBIWF9DT05ORUNURURfQ0xBU1MsXG4gIFBIWF9ESVNBQkxFX1dJVEgsXG4gIFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSxcbiAgUEhYX0RJU0FCTEVELFxuICBQSFhfTE9BRElOR19DTEFTUyxcbiAgUEhYX0VSUk9SX0NMQVNTLFxuICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfSE9PSyxcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BST0dSRVNTLFxuICBQSFhfUkVBRE9OTFksXG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9TUkMsXG4gIFBIWF9SRUZfTE9DSyxcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU1RBVElDLFxuICBQSFhfU1RJQ0tZLFxuICBQSFhfVFJBQ0tfU1RBVElDLFxuICBQSFhfVFJBQ0tfVVBMT0FEUyxcbiAgUEhYX1VQREFURSxcbiAgUEhYX1VQTE9BRF9SRUYsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQSFhfTUFJTixcbiAgUEhYX01PVU5URUQsXG4gIFBVU0hfVElNRU9VVCxcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgTUFYX0NISUxEX0pPSU5fQVRURU1QVFMsXG4gIFBIWF9MVl9QSUQsXG4gIFBIWF9QT1JUQUwsXG4gIFBIWF9URUxFUE9SVEVEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgaXNFbXB0eSxcbiAgaXNFcXVhbE9iaixcbiAgbG9nRXJyb3IsXG4gIG1heWJlLFxuICBpc0NpZCxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBFbGVtZW50UmVmIGZyb20gXCIuL2VsZW1lbnRfcmVmXCI7XG5pbXBvcnQgRE9NUGF0Y2ggZnJvbSBcIi4vZG9tX3BhdGNoXCI7XG5pbXBvcnQgTGl2ZVVwbG9hZGVyIGZyb20gXCIuL2xpdmVfdXBsb2FkZXJcIjtcbmltcG9ydCBSZW5kZXJlZCBmcm9tIFwiLi9yZW5kZXJlZFwiO1xuaW1wb3J0IHsgVmlld0hvb2sgfSBmcm9tIFwiLi92aWV3X2hvb2tcIjtcbmltcG9ydCBKUyBmcm9tIFwiLi9qc1wiO1xuXG5pbXBvcnQgbW9ycGhkb20gZnJvbSBcIm1vcnBoZG9tXCI7XG5cbmV4cG9ydCBjb25zdCBwcmVwZW5kRm9ybURhdGFLZXkgPSAoa2V5LCBwcmVmaXgpID0+IHtcbiAgY29uc3QgaXNBcnJheSA9IGtleS5lbmRzV2l0aChcIltdXCIpO1xuICAvLyBSZW1vdmUgdGhlIFwiW11cIiBpZiBpdCdzIGFuIGFycmF5XG4gIGxldCBiYXNlS2V5ID0gaXNBcnJheSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG4gIC8vIFJlcGxhY2UgbGFzdCBvY2N1cnJlbmNlIG9mIGtleSBiZWZvcmUgYSBjbG9zaW5nIGJyYWNrZXQgb3IgdGhlIGVuZCB3aXRoIGtleSBwbHVzIHN1ZmZpeFxuICBiYXNlS2V5ID0gYmFzZUtleS5yZXBsYWNlKC8oW15cXFtcXF1dKykoXFxdPyQpLywgYCR7cHJlZml4fSQxJDJgKTtcbiAgLy8gQWRkIGJhY2sgdGhlIFwiW11cIiBpZiBpdCB3YXMgYW4gYXJyYXlcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICBiYXNlS2V5ICs9IFwiW11cIjtcbiAgfVxuICByZXR1cm4gYmFzZUtleTtcbn07XG5cbmNvbnN0IHNlcmlhbGl6ZUZvcm0gPSAoZm9ybSwgb3B0cywgb25seU5hbWVzID0gW10pID0+IHtcbiAgY29uc3QgeyBzdWJtaXR0ZXIgfSA9IG9wdHM7XG5cbiAgLy8gV2UgbXVzdCBpbmplY3QgdGhlIHN1Ym1pdHRlciBpbiB0aGUgb3JkZXIgdGhhdCBpdCBleGlzdHMgaW4gdGhlIERPTVxuICAvLyByZWxhdGl2ZSB0byBvdGhlciBpbnB1dHMuIEZvciBleGFtcGxlLCBmb3IgY2hlY2tib3ggZ3JvdXBzLCB0aGUgb3JkZXIgbXVzdCBiZSBtYWludGFpbmVkLlxuICBsZXQgaW5qZWN0ZWRFbGVtZW50O1xuICBpZiAoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgLy8gc2V0IHRoZSBmb3JtIGF0dHJpYnV0ZSBpZiB0aGUgc3VibWl0dGVyIGhhcyBvbmU7XG4gICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBlbGVtZW50IGlzIG91dHNpZGUgdGhlIGFjdHVhbCBmb3JtIGVsZW1lbnRcbiAgICBjb25zdCBmb3JtSWQgPSBzdWJtaXR0ZXIuZ2V0QXR0cmlidXRlKFwiZm9ybVwiKTtcbiAgICBpZiAoZm9ybUlkKSB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJmb3JtXCIsIGZvcm1JZCk7XG4gICAgfVxuICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHN1Ym1pdHRlci52YWx1ZTtcbiAgICBzdWJtaXR0ZXIucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaW5wdXQsIHN1Ym1pdHRlcik7XG4gICAgaW5qZWN0ZWRFbGVtZW50ID0gaW5wdXQ7XG4gIH1cblxuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgY29uc3QgdG9SZW1vdmUgPSBbXTtcblxuICBmb3JtRGF0YS5mb3JFYWNoKCh2YWwsIGtleSwgX2luZGV4KSA9PiB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgIHRvUmVtb3ZlLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsZWFudXAgYWZ0ZXIgYnVpbGRpbmcgZmlsZURhdGFcbiAgdG9SZW1vdmUuZm9yRWFjaCgoa2V5KSA9PiBmb3JtRGF0YS5kZWxldGUoa2V5KSk7XG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuXG4gIGNvbnN0IHsgaW5wdXRzVW51c2VkLCBvbmx5SGlkZGVuSW5wdXRzIH0gPSBBcnJheS5mcm9tKGZvcm0uZWxlbWVudHMpLnJlZHVjZShcbiAgICAoYWNjLCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dHNVbnVzZWQsIG9ubHlIaWRkZW5JbnB1dHMgfSA9IGFjYztcbiAgICAgIGNvbnN0IGtleSA9IGlucHV0Lm5hbWU7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5wdXRzVW51c2VkW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnB1dHNVbnVzZWRba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob25seUhpZGRlbklucHV0c1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb25seUhpZGRlbklucHV0c1trZXldID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNVc2VkID1cbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCkgfHxcbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfU1VCTUlUVEVEKTtcbiAgICAgIGNvbnN0IGlzSGlkZGVuID0gaW5wdXQudHlwZSA9PT0gXCJoaWRkZW5cIjtcbiAgICAgIGlucHV0c1VudXNlZFtrZXldID0gaW5wdXRzVW51c2VkW2tleV0gJiYgIWlzVXNlZDtcbiAgICAgIG9ubHlIaWRkZW5JbnB1dHNba2V5XSA9IG9ubHlIaWRkZW5JbnB1dHNba2V5XSAmJiBpc0hpZGRlbjtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIHsgaW5wdXRzVW51c2VkOiB7fSwgb25seUhpZGRlbklucHV0czoge30gfSxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7XG4gICAgaWYgKG9ubHlOYW1lcy5sZW5ndGggPT09IDAgfHwgb25seU5hbWVzLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICBjb25zdCBpc1VudXNlZCA9IGlucHV0c1VudXNlZFtrZXldO1xuICAgICAgY29uc3QgaGlkZGVuID0gb25seUhpZGRlbklucHV0c1trZXldO1xuICAgICAgaWYgKGlzVW51c2VkICYmICEoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lID09IGtleSkgJiYgIWhpZGRlbikge1xuICAgICAgICBwYXJhbXMuYXBwZW5kKHByZXBlbmRGb3JtRGF0YUtleShrZXksIFwiX3VudXNlZF9cIiksIFwiXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcGFyYW1zLmFwcGVuZChrZXksIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gcmVtb3ZlIHRoZSBpbmplY3RlZCBlbGVtZW50IGFnYWluXG4gIC8vIChpdCB3b3VsZCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IGRvbSBwYXRjaCBhbnl3YXksIGJ1dCB0aGlzIGlzIGNsZWFuZXIpXG4gIGlmIChzdWJtaXR0ZXIgJiYgaW5qZWN0ZWRFbGVtZW50KSB7XG4gICAgc3VibWl0dGVyLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoaW5qZWN0ZWRFbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXMudG9TdHJpbmcoKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuICBzdGF0aWMgY2xvc2VzdFZpZXcoZWwpIHtcbiAgICBjb25zdCBsaXZlVmlld0VsID0gZWwuY2xvc2VzdChQSFhfVklFV19TRUxFQ1RPUik7XG4gICAgcmV0dXJuIGxpdmVWaWV3RWwgPyBET00ucHJpdmF0ZShsaXZlVmlld0VsLCBcInZpZXdcIikgOiBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwsIGxpdmVTb2NrZXQsIHBhcmVudFZpZXcsIGZsYXNoLCBsaXZlUmVmZXJlcikge1xuICAgIHRoaXMuaXNEZWFkID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldDtcbiAgICB0aGlzLmZsYXNoID0gZmxhc2g7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnRWaWV3O1xuICAgIHRoaXMucm9vdCA9IHBhcmVudFZpZXcgPyBwYXJlbnRWaWV3LnJvb3QgOiB0aGlzO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvcHVsbC8zNzIxXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBib3VuZCB0byBhIHZpZXdcbiAgICBjb25zdCBib3VuZFZpZXcgPSBET00ucHJpdmF0ZSh0aGlzLmVsLCBcInZpZXdcIik7XG4gICAgaWYgKGJvdW5kVmlldyAhPT0gdW5kZWZpbmVkICYmIGJvdW5kVmlldy5pc0RlYWQgIT09IHRydWUpIHtcbiAgICAgIGxvZ0Vycm9yKFxuICAgICAgICBgVGhlIERPTSBlbGVtZW50IGZvciB0aGlzIHZpZXcgaGFzIGFscmVhZHkgYmVlbiBib3VuZCB0byBhIHZpZXcuXG5cbiAgICAgICAgQW4gZWxlbWVudCBjYW4gb25seSBldmVyIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSB2aWV3IVxuICAgICAgICBQbGVhc2UgZW5zdXJlIHRoYXQgeW91IGFyZSBub3QgdHJ5aW5nIHRvIGluaXRpYWxpemUgbXVsdGlwbGUgTGl2ZVNvY2tldHMgb24gdGhlIHNhbWUgcGFnZS5cbiAgICAgICAgVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91J3JlIGFjY2lkZW50YWxseSB0cnlpbmcgdG8gcmVuZGVyIHlvdXIgcm9vdCBsYXlvdXQgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgIEVuc3VyZSB0aGF0IHRoZSB0ZW1wbGF0ZSBzZXQgb24gdGhlIExpdmVWaWV3IGlzIGRpZmZlcmVudCB0aGFuIHRoZSByb290IGxheW91dC5cbiAgICAgIGAsXG4gICAgICAgIHsgdmlldzogYm91bmRWaWV3IH0sXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGJpbmQgbXVsdGlwbGUgdmlld3MgdG8gdGhlIHNhbWUgRE9NIGVsZW1lbnQuXCIpO1xuICAgIH1cbiAgICAvLyBiaW5kIHRoZSB2aWV3IHRvIHRoZSBlbGVtZW50XG4gICAgRE9NLnB1dFByaXZhdGUodGhpcy5lbCwgXCJ2aWV3XCIsIHRoaXMpO1xuICAgIHRoaXMuaWQgPSB0aGlzLmVsLmlkO1xuICAgIHRoaXMucmVmID0gMDtcbiAgICB0aGlzLmxhc3RBY2tSZWYgPSBudWxsO1xuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgLyoqXG4gICAgICogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLmxvYWRlclRpbWVyID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0RpZmZzID0gW107XG4gICAgdGhpcy5wZW5kaW5nRm9ybXMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5yZWRpcmVjdCA9IGZhbHNlO1xuICAgIHRoaXMuaHJlZiA9IG51bGw7XG4gICAgdGhpcy5qb2luQ291bnQgPSB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmpvaW5Db3VudCAtIDEgOiAwO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzID0gMDtcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuam9pbkNhbGxiYWNrID0gZnVuY3Rpb24gKG9uRG9uZSkge1xuICAgICAgb25Eb25lICYmIG9uRG9uZSgpO1xuICAgIH07XG4gICAgdGhpcy5zdG9wQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAvLyB1c3VhbGx5LCBvbmx5IHRoZSByb290IExpdmVWaWV3IHN0b3JlcyBwZW5kaW5nXG4gICAgLy8gam9pbiBvcGVyYXRpb25zIGZvciBhbGwgY2hpbGRyZW4gKGFuZCBpdHNlbGYpLFxuICAgIC8vIGJ1dCBpbiBjYXNlIG9mIHJlam9pbnMgKGpvaW5Db3VudCA+IDEpIGVhY2ggY2hpbGRcbiAgICAvLyBzdG9yZXMgaXRzIG93biBldmVudHMgaW5zdGVhZFxuICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICB0aGlzLnZpZXdIb29rcyA9IHt9O1xuICAgIHRoaXMuZm9ybVN1Ym1pdHMgPSBbXTtcbiAgICB0aGlzLmNoaWxkcmVuID0gdGhpcy5wYXJlbnQgPyBudWxsIDoge307XG4gICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdID0ge307XG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5jaGFubmVsID0gdGhpcy5saXZlU29ja2V0LmNoYW5uZWwoYGx2OiR7dGhpcy5pZH1gLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmhyZWYgJiYgdGhpcy5leHBhbmRVUkwodGhpcy5ocmVmKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZGlyZWN0OiB0aGlzLnJlZGlyZWN0ID8gdXJsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmw6IHRoaXMucmVkaXJlY3QgPyB1bmRlZmluZWQgOiB1cmwgfHwgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXM6IHRoaXMuY29ubmVjdFBhcmFtcyhsaXZlUmVmZXJlciksXG4gICAgICAgIHNlc3Npb246IHRoaXMuZ2V0U2Vzc2lvbigpLFxuICAgICAgICBzdGF0aWM6IHRoaXMuZ2V0U3RhdGljKCksXG4gICAgICAgIGZsYXNoOiB0aGlzLmZsYXNoLFxuICAgICAgICBzdGlja3k6IHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9TVElDS1kpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLnBvcnRhbEVsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICBzZXRIcmVmKGhyZWYpIHtcbiAgICB0aGlzLmhyZWYgPSBocmVmO1xuICB9XG5cbiAgc2V0UmVkaXJlY3QoaHJlZikge1xuICAgIHRoaXMucmVkaXJlY3QgPSB0cnVlO1xuICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gIH1cblxuICBpc01haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9NQUlOKTtcbiAgfVxuXG4gIGNvbm5lY3RQYXJhbXMobGl2ZVJlZmVyZXIpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmxpdmVTb2NrZXQucGFyYW1zKHRoaXMuZWwpO1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gRE9NLmFsbChkb2N1bWVudCwgYFske3RoaXMuYmluZGluZyhQSFhfVFJBQ0tfU1RBVElDKX1dYClcbiAgICAgIC5tYXAoKG5vZGUpID0+IG5vZGUuc3JjIHx8IG5vZGUuaHJlZilcbiAgICAgIC5maWx0ZXIoKHVybCkgPT4gdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIik7XG5cbiAgICBpZiAobWFuaWZlc3QubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1zW1wiX3RyYWNrX3N0YXRpY1wiXSA9IG1hbmlmZXN0O1xuICAgIH1cbiAgICBwYXJhbXNbXCJfbW91bnRzXCJdID0gdGhpcy5qb2luQ291bnQ7XG4gICAgcGFyYW1zW1wiX21vdW50X2F0dGVtcHRzXCJdID0gdGhpcy5qb2luQXR0ZW1wdHM7XG4gICAgcGFyYW1zW1wiX2xpdmVfcmVmZXJlclwiXSA9IGxpdmVSZWZlcmVyO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzKys7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbC5jYW5QdXNoKCk7XG4gIH1cblxuICBnZXRTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gIH1cblxuICBnZXRTdGF0aWMoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQyk7XG4gICAgcmV0dXJuIHZhbCA9PT0gXCJcIiA/IG51bGwgOiB2YWw7XG4gIH1cblxuICBkZXN0cm95KGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmRlc3Ryb3lBbGxDaGlsZHJlbigpO1xuICAgIHRoaXMuZGVzdHJveVBvcnRhbEVsZW1lbnRzKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIFwidmlld1wiKTtcbiAgICBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdO1xuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnBhcmVudC5pZF1bdGhpcy5pZF07XG4gICAgfVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjb25zdCBvbkZpbmlzaGVkID0gKCkgPT4ge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95SG9vayh0aGlzLnZpZXdIb29rc1tpZF0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBET00ubWFya1BoeENoaWxkRGVzdHJveWVkKHRoaXMuZWwpO1xuXG4gICAgdGhpcy5sb2coXCJkZXN0cm95ZWRcIiwgKCkgPT4gW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdKTtcbiAgICB0aGlzLmNoYW5uZWxcbiAgICAgIC5sZWF2ZSgpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgb25GaW5pc2hlZCk7XG4gIH1cblxuICBzZXRDb250YWluZXJDbGFzc2VzKC4uLmNsYXNzZXMpIHtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICAgICAgUEhYX0xPQURJTkdfQ0xBU1MsXG4gICAgICBQSFhfRVJST1JfQ0xBU1MsXG4gICAgICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICAgICAgUEhYX1NFUlZFUl9FUlJPUl9DTEFTUyxcbiAgICApO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcbiAgfVxuXG4gIHNob3dMb2FkZXIodGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBpZiAodGltZW91dCkge1xuICAgICAgdGhpcy5sb2FkZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93TG9hZGVyKCksIHRpbWVvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMudmlld0hvb2tzKSB7XG4gICAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX2Rpc2Nvbm5lY3RlZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9MT0FESU5HX0NMQVNTKTtcbiAgICB9XG4gIH1cblxuICBleGVjQWxsKGJpbmRpbmcpIHtcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHtiaW5kaW5nfV1gLCAoZWwpID0+XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUoYmluZGluZykpLFxuICAgICk7XG4gIH1cblxuICBoaWRlTG9hZGVyKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5kaXNjb25uZWN0ZWRUaW1lcik7XG4gICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9DT05ORUNURURfQ0xBU1MpO1xuICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJjb25uZWN0ZWRcIikpO1xuICB9XG5cbiAgdHJpZ2dlclJlY29ubmVjdGVkKCkge1xuICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX3JlY29ubmVjdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgbG9nKGtpbmQsIG1zZ0NhbGxiYWNrKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LmxvZyh0aGlzLCBraW5kLCBtc2dDYWxsYmFjayk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKTtcbiAgfVxuXG4gIC8vIGNhbGxzIHRoZSBjYWxsYmFjayB3aXRoIHRoZSB2aWV3IGFuZCB0YXJnZXQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIHBoeFRhcmdldFxuICAvLyB0YXJnZXRzIGNhbiBiZTpcbiAgLy8gICogYW4gZWxlbWVudCBpdHNlbGYsIHRoZW4gaXQgaXMgc2ltcGx5IHBhc3NlZCB0byBsaXZlU29ja2V0Lm93bmVyO1xuICAvLyAgKiBhIENJRCAoQ29tcG9uZW50IElEKSwgdGhlbiB3ZSBmaXJzdCBzZWFyY2ggdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQgaW4gdGhlIERPTVxuICAvLyAgKiBhIHNlbGVjdG9yLCB0aGVuIHdlIHNlYXJjaCB0aGUgc2VsZWN0b3IgaW4gdGhlIERPTSBhbmQgY2FsbCB0aGUgY2FsbGJhY2tcbiAgLy8gICAgZm9yIGVhY2ggZWxlbWVudCBmb3VuZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG93bmVyIHZpZXdcbiAgd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20gPSBkb2N1bWVudCkge1xuICAgIC8vIGluIHRoZSBmb3JtIHJlY292ZXJ5IGNhc2Ugd2Ugc2VhcmNoIGluIGEgdGVtcGxhdGUgZnJhZ21lbnQgaW5zdGVhZCBvZlxuICAgIC8vIHRoZSByZWFsIGRvbSwgdGhlcmVmb3JlIHdlIG9wdGlvbmFsbHkgcGFzcyBkb20gYW5kIHZpZXdFbFxuXG4gICAgaWYgKHBoeFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHBoeFRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQub3duZXIocGh4VGFyZ2V0LCAodmlldykgPT5cbiAgICAgICAgY2FsbGJhY2sodmlldywgcGh4VGFyZ2V0KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ2lkKHBoeFRhcmdldCkpIHtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuaWQsIHBoeFRhcmdldCwgZG9tKTtcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsb2dFcnJvcihgbm8gY29tcG9uZW50IGZvdW5kIG1hdGNoaW5nIHBoeC10YXJnZXQgb2YgJHtwaHhUYXJnZXR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayh0aGlzLCBwYXJzZUludChwaHhUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IEFycmF5LmZyb20oZG9tLnF1ZXJ5U2VsZWN0b3JBbGwocGh4VGFyZ2V0KSk7XG4gICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgYG5vdGhpbmcgZm91bmQgbWF0Y2hpbmcgdGhlIHBoeC10YXJnZXQgc2VsZWN0b3IgXCIke3BoeFRhcmdldH1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT5cbiAgICAgICAgdGhpcy5saXZlU29ja2V0Lm93bmVyKHRhcmdldCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIHRhcmdldCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhcHBseURpZmYodHlwZSwgcmF3RGlmZiwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmxvZyh0eXBlLCAoKSA9PiBbXCJcIiwgY2xvbmUocmF3RGlmZildKTtcbiAgICBjb25zdCB7IGRpZmYsIHJlcGx5LCBldmVudHMsIHRpdGxlIH0gPSBSZW5kZXJlZC5leHRyYWN0KHJhd0RpZmYpO1xuICAgIGNhbGxiYWNrKHsgZGlmZiwgcmVwbHksIGV2ZW50cyB9KTtcbiAgICBpZiAodHlwZW9mIHRpdGxlID09PSBcInN0cmluZ1wiIHx8ICh0eXBlID09IFwibW91bnRcIiAmJiB0aGlzLmlzTWFpbigpKSkge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBET00ucHV0VGl0bGUodGl0bGUpKTtcbiAgICB9XG4gIH1cblxuICBvbkpvaW4ocmVzcCkge1xuICAgIGNvbnN0IHsgcmVuZGVyZWQsIGNvbnRhaW5lciwgbGl2ZXZpZXdfdmVyc2lvbiwgcGlkIH0gPSByZXNwO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IFt0YWcsIGF0dHJzXSA9IGNvbnRhaW5lcjtcbiAgICAgIHRoaXMuZWwgPSBET00ucmVwbGFjZVJvb3RDb250YWluZXIodGhpcy5lbCwgdGFnLCBhdHRycyk7XG4gICAgfVxuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgdGhpcy5qb2luUGVuZGluZyA9IHRydWU7XG4gICAgdGhpcy5mbGFzaCA9IG51bGw7XG4gICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0gdGhpcy5nZXRGb3Jtc0ZvclJlY292ZXJ5KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTWFpbigpICYmIHdpbmRvdy5oaXN0b3J5LnN0YXRlID09PSBudWxsKSB7XG4gICAgICAvLyBzZXQgaW5pdGlhbCBoaXN0b3J5IGVudHJ5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhZ2UgbG9hZCAobm8gaGlzdG9yeSlcbiAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFwicmVwbGFjZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLmxpdmVTb2NrZXQuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChsaXZldmlld192ZXJzaW9uICE9PSB0aGlzLmxpdmVTb2NrZXQudmVyc2lvbigpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTGl2ZVZpZXcgYXNzZXQgdmVyc2lvbiBtaXNtYXRjaC4gSmF2YVNjcmlwdCB2ZXJzaW9uICR7dGhpcy5saXZlU29ja2V0LnZlcnNpb24oKX0gdnMuIHNlcnZlciAke2xpdmV2aWV3X3ZlcnNpb259LiBUbyBhdm9pZCBpc3N1ZXMsIHBsZWFzZSBlbnN1cmUgdGhhdCB5b3VyIGFzc2V0cyB1c2UgdGhlIHNhbWUgdmVyc2lvbiBhcyB0aGUgc2VydmVyLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRoZSBwaWQgaXMgb25seSBzZW50IGlmXG4gICAgLy9cbiAgICAvLyAgICBjb25maWcgOnBob2VuaXhfbGl2ZV92aWV3LCA6ZGVidWdfYXR0cmlidXRlc1xuICAgIC8vXG4gICAgLy8gaWYgc2V0IHRvIHRydWUuIEl0IGlzIHRvIGhlbHAgZGVidWdnaW5nIGluIGRldmVsb3BtZW50LlxuICAgIGlmIChwaWQpIHtcbiAgICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFBIWF9MVl9QSUQsIHBpZCk7XG4gICAgfVxuXG4gICAgQnJvd3Nlci5kcm9wTG9jYWwoXG4gICAgICB0aGlzLmxpdmVTb2NrZXQubG9jYWxTdG9yYWdlLFxuICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgICApO1xuICAgIHRoaXMuYXBwbHlEaWZmKFwibW91bnRcIiwgcmVuZGVyZWQsICh7IGRpZmYsIGV2ZW50cyB9KSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gbmV3IFJlbmRlcmVkKHRoaXMuaWQsIGRpZmYpO1xuICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIobnVsbCwgXCJqb2luXCIpO1xuICAgICAgdGhpcy5kcm9wUGVuZGluZ1JlZnMoKTtcbiAgICAgIHRoaXMuam9pbkNvdW50Kys7XG4gICAgICB0aGlzLmpvaW5BdHRlbXB0cyA9IDA7XG5cbiAgICAgIHRoaXMubWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uSm9pbkNvbXBsZXRlKHJlc3AsIGh0bWwsIHN0cmVhbXMsIGV2ZW50cyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3BQZW5kaW5nUmVmcygpIHtcbiAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7UEhYX1JFRl9TUkN9PVwiJHt0aGlzLnJlZlNyYygpfVwiXWAsIChlbCkgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpO1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5Db21wbGV0ZSh7IGxpdmVfcGF0Y2ggfSwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gcHJvdmlkZSBhIGJldHRlciBleHBlcmllbmNlLCB3ZSB3YW50IHRvIGpvaW5cbiAgICAvLyBhbGwgTGl2ZVZpZXdzIGZpcnN0IGFuZCBvbmx5IHRoZW4gYXBwbHkgdGhlaXIgcGF0Y2hlcy5cbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxIHx8ICh0aGlzLnBhcmVudCAmJiAhdGhpcy5wYXJlbnQuaXNKb2luUGVuZGluZygpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKTtcbiAgICB9XG5cbiAgICAvLyBPbmUgZG93bnNpZGUgb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IHdlIG5lZWQgdG8gZmluZCBwaHhDaGlsZHJlblxuICAgIC8vIGluIHRoZSBodG1sIGZyYWdtZW50LCBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBET00uIFRoZSBmcmFnbWVudFxuICAgIC8vIGFsc28gZG9lcyBub3QgaW5jbHVkZSBQSFhfU1RBVElDLCBzbyB3ZSBuZWVkIHRvIGNvcHkgaXQgb3ZlciBmcm9tXG4gICAgLy8gdGhlIERPTS5cbiAgICBjb25zdCBuZXdDaGlsZHJlbiA9IERPTS5maW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50KGh0bWwsIHRoaXMuaWQpLmZpbHRlcihcbiAgICAgICh0b0VsKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyb21FbCA9IHRvRWwuaWQgJiYgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke3RvRWwuaWR9XCJdYCk7XG4gICAgICAgIGNvbnN0IHBoeFN0YXRpYyA9IGZyb21FbCAmJiBmcm9tRWwuZ2V0QXR0cmlidXRlKFBIWF9TVEFUSUMpO1xuICAgICAgICBpZiAocGh4U3RhdGljKSB7XG4gICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgcGh4U3RhdGljKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgUEhYX1JPT1RfSUQgdG8gcHJldmVudCBldmVudHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRvIHRoZSByb290IHZpZXdcbiAgICAgICAgLy8gd2hpbGUgdGhlIGNoaWxkIGpvaW4gaXMgc3RpbGwgcGVuZGluZ1xuICAgICAgICBpZiAoZnJvbUVsKSB7XG4gICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCwgdGhpcy5yb290LmlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5qb2luQ2hpbGQodG9FbCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAobmV3Q2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW1xuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKCkgPT4gdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5wYXJlbnQuYWNrSm9pbih0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3QucGVuZGluZ0pvaW5PcHMucHVzaChbXG4gICAgICAgIHRoaXMsXG4gICAgICAgICgpID0+IHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIGF0dGFjaFRydWVEb2NFbCgpIHtcbiAgICB0aGlzLmVsID0gRE9NLmJ5SWQodGhpcy5pZCk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gIH1cblxuICAvLyB0aGlzIGlzIGludm9rZWQgZm9yIGRlYWQgYW5kIGxpdmUgdmlld3MsIHNvIHdlIG11c3QgZmlsdGVyIGJ5XG4gIC8vIGJ5IG93bmVyIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgZHVwbGljYXRpbmcgaG9va3MgYWNyb3NzIGRpc2Nvbm5lY3RcbiAgLy8gYW5kIGNvbm5lY3RlZCBzdGF0ZXMuIFRoaXMgYWxzbyBoYW5kbGVzIGNhc2VzIHdoZXJlIGhvb2tzIGV4aXN0XG4gIC8vIGluIGEgcm9vdCBsYXlvdXQgd2l0aCBhIExWIGluIHRoZSBib2R5XG4gIGV4ZWNOZXdNb3VudGVkKHBhcmVudCA9IGRvY3VtZW50KSB7XG4gICAgbGV0IHBoeFZpZXdwb3J0VG9wID0gdGhpcy5iaW5kaW5nKFBIWF9WSUVXUE9SVF9UT1ApO1xuICAgIGxldCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICB0aGlzLmFsbChcbiAgICAgIHBhcmVudCxcbiAgICAgIGBbJHtwaHhWaWV3cG9ydFRvcH1dLCBbJHtwaHhWaWV3cG9ydEJvdHRvbX1dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKFxuICAgICAgICAgIGhvb2tFbCxcbiAgICAgICAgICBob29rRWwsXG4gICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgcGh4Vmlld3BvcnRCb3R0b20sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWF5YmVBZGROZXdIb29rKGhvb2tFbCk7XG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5hbGwoXG4gICAgICBwYXJlbnQsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFBIWF9IT09LKX1dLCBbZGF0YS1waHgtJHtQSFhfSE9PS31dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgdGhpcy5tYXliZUFkZE5ld0hvb2soaG9va0VsKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHt0aGlzLmJpbmRpbmcoUEhYX01PVU5URUQpfV1gLCAoZWwpID0+IHtcbiAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFsbChwYXJlbnQsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGVsKSA9PiB7XG4gICAgICBpZiAodGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgICAgY2FsbGJhY2soZWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gaW4gY2FzZSBvZiByZWpvaW5zLCB3ZSBuZWVkIHRvIG1hbnVhbGx5IHBlcmZvcm0gYWxsXG4gICAgLy8gcGVuZGluZyBvcHNcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nSm9pbk9wcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChjYikgPT4gdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIgJiYgY2IoKSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hdHRhY2hUcnVlRG9jRWwoKTtcbiAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBzdHJlYW1zLCBudWxsKTtcbiAgICBwYXRjaC5tYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpO1xuICAgIHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCBmYWxzZSwgdHJ1ZSk7XG4gICAgdGhpcy5qb2luTmV3Q2hpbGRyZW4oKTtcbiAgICB0aGlzLmV4ZWNOZXdNb3VudGVkKCk7XG5cbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgdGhpcy5hcHBseVBlbmRpbmdVcGRhdGVzKCk7XG5cbiAgICBpZiAobGl2ZV9wYXRjaCkge1xuICAgICAgY29uc3QgeyBraW5kLCB0byB9ID0gbGl2ZV9wYXRjaDtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpO1xuICAgIH1cbiAgICB0aGlzLmhpZGVMb2FkZXIoKTtcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICB0aGlzLnRyaWdnZXJSZWNvbm5lY3RlZCgpO1xuICAgIH1cbiAgICB0aGlzLnN0b3BDYWxsYmFjaygpO1xuICB9XG5cbiAgdHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbkJlZm9yZUVsVXBkYXRlZFwiLCBbZnJvbUVsLCB0b0VsXSk7XG4gICAgY29uc3QgaG9vayA9IHRoaXMuZ2V0SG9vayhmcm9tRWwpO1xuICAgIGNvbnN0IGlzSWdub3JlZCA9IGhvb2sgJiYgRE9NLmlzSWdub3JlZChmcm9tRWwsIHRoaXMuYmluZGluZyhQSFhfVVBEQVRFKSk7XG4gICAgaWYgKFxuICAgICAgaG9vayAmJlxuICAgICAgIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKSAmJlxuICAgICAgIShpc0lnbm9yZWQgJiYgaXNFcXVhbE9iaihmcm9tRWwuZGF0YXNldCwgdG9FbC5kYXRhc2V0KSlcbiAgICApIHtcbiAgICAgIGhvb2suX19iZWZvcmVVcGRhdGUoKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH1cbiAgfVxuXG4gIG1heWJlTW91bnRlZChlbCkge1xuICAgIGNvbnN0IHBoeE1vdW50ZWQgPSBlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9NT1VOVEVEKSk7XG4gICAgY29uc3QgaGFzQmVlbkludm9rZWQgPSBwaHhNb3VudGVkICYmIERPTS5wcml2YXRlKGVsLCBcIm1vdW50ZWRcIik7XG4gICAgaWYgKHBoeE1vdW50ZWQgJiYgIWhhc0JlZW5JbnZva2VkKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBwaHhNb3VudGVkKTtcbiAgICAgIERPTS5wdXRQcml2YXRlKGVsLCBcIm1vdW50ZWRcIiwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWF5YmVBZGROZXdIb29rKGVsKSB7XG4gICAgY29uc3QgbmV3SG9vayA9IHRoaXMuYWRkSG9vayhlbCk7XG4gICAgaWYgKG5ld0hvb2spIHtcbiAgICAgIG5ld0hvb2suX19tb3VudGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcGVyZm9ybVBhdGNoKHBhdGNoLCBwcnVuZUNpZHMsIGlzSm9pblBhdGNoID0gZmFsc2UpIHtcbiAgICBjb25zdCByZW1vdmVkRWxzID0gW107XG4gICAgbGV0IHBoeENoaWxkcmVuQWRkZWQgPSBmYWxzZTtcbiAgICBjb25zdCB1cGRhdGVkSG9va0lkcyA9IG5ldyBTZXQoKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaFN0YXJ0XCIsIFtwYXRjaC50YXJnZXRDb250YWluZXJdKTtcblxuICAgIHBhdGNoLmFmdGVyKFwiYWRkZWRcIiwgKGVsKSA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudHJpZ2dlckRPTShcIm9uTm9kZUFkZGVkXCIsIFtlbF0pO1xuICAgICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSB0aGlzLmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgICBjb25zdCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICAgIERPTS5tYWludGFpblByaXZhdGVIb29rcyhlbCwgZWwsIHBoeFZpZXdwb3J0VG9wLCBwaHhWaWV3cG9ydEJvdHRvbSk7XG4gICAgICB0aGlzLm1heWJlQWRkTmV3SG9vayhlbCk7XG4gICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKSB7XG4gICAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmFmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCAoZWwpID0+IHtcbiAgICAgIGlmIChET00uaXNQaHhTdGlja3koZWwpKSB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5qb2luUm9vdFZpZXdzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmJlZm9yZShcInVwZGF0ZWRcIiwgKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IHRoaXMudHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKTtcbiAgICAgIGlmIChob29rKSB7XG4gICAgICAgIHVwZGF0ZWRIb29rSWRzLmFkZChmcm9tRWwuaWQpO1xuICAgICAgfVxuICAgICAgLy8gdHJpZ2dlciBKUyBzcGVjaWZpYyB1cGRhdGUgbG9naWMgKGZvciBleGFtcGxlIGZvciBKUy5pZ25vcmVfYXR0cmlidXRlcylcbiAgICAgIEpTLm9uQmVmb3JlRWxVcGRhdGVkKGZyb21FbCwgdG9FbCk7XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInVwZGF0ZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAodXBkYXRlZEhvb2tJZHMuaGFzKGVsLmlkKSkge1xuICAgICAgICB0aGlzLmdldEhvb2soZWwpLl9fdXBkYXRlZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcGF0Y2guYWZ0ZXIoXCJkaXNjYXJkZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAoZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHJlbW92ZWRFbHMucHVzaChlbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInRyYW5zaXRpb25zRGlzY2FyZGVkXCIsIChlbHMpID0+XG4gICAgICB0aGlzLmFmdGVyRWxlbWVudHNSZW1vdmVkKGVscywgcHJ1bmVDaWRzKSxcbiAgICApO1xuICAgIHBhdGNoLnBlcmZvcm0oaXNKb2luUGF0Y2gpO1xuICAgIHRoaXMuYWZ0ZXJFbGVtZW50c1JlbW92ZWQocmVtb3ZlZEVscywgcHJ1bmVDaWRzKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaEVuZFwiLCBbcGF0Y2gudGFyZ2V0Q29udGFpbmVyXSk7XG4gICAgcmV0dXJuIHBoeENoaWxkcmVuQWRkZWQ7XG4gIH1cblxuICBhZnRlckVsZW1lbnRzUmVtb3ZlZChlbGVtZW50cywgcHJ1bmVDaWRzKSB7XG4gICAgY29uc3QgZGVzdHJveWVkQ0lEcyA9IFtdO1xuICAgIGVsZW1lbnRzLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50cyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3RoaXMuaWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBob29rcyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske3RoaXMuYmluZGluZyhQSFhfSE9PSyl9XSwgW2RhdGEtcGh4LWhvb2tdYCxcbiAgICAgICk7XG4gICAgICBjb21wb25lbnRzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMuY29tcG9uZW50SUQoZWwpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDaWQoY2lkKSAmJlxuICAgICAgICAgIGRlc3Ryb3llZENJRHMuaW5kZXhPZihjaWQpID09PSAtMSAmJlxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfVklFV19SRUYpID09PSB0aGlzLmlkXG4gICAgICAgICkge1xuICAgICAgICAgIGRlc3Ryb3llZENJRHMucHVzaChjaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhvb2tzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGhvb2tFbCkgPT4ge1xuICAgICAgICBjb25zdCBob29rID0gdGhpcy5nZXRIb29rKGhvb2tFbCk7XG4gICAgICAgIGhvb2sgJiYgdGhpcy5kZXN0cm95SG9vayhob29rKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIFdlIHNob3VsZCBub3QgcHJ1bmVDaWRzIG9uIGpvaW5zLiBPdGhlcndpc2UsIGluIGNhc2Ugb2ZcbiAgICAvLyByZWpvaW5zLCB3ZSBtYXkgbm90aWZ5IGNpZHMgdGhhdCBubyBsb25nZXIgYmVsb25nIHRvIHRoZVxuICAgIC8vIGN1cnJlbnQgTGl2ZVZpZXcgdG8gYmUgcmVtb3ZlZC5cbiAgICBpZiAocHJ1bmVDaWRzKSB7XG4gICAgICB0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcyk7XG4gICAgfVxuICB9XG5cbiAgam9pbk5ld0NoaWxkcmVuKCkge1xuICAgIERPTS5maW5kUGh4Q2hpbGRyZW4oZG9jdW1lbnQsIHRoaXMuaWQpLmZvckVhY2goKGVsKSA9PiB0aGlzLmpvaW5DaGlsZChlbCkpO1xuICB9XG5cbiAgbWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwaHhDaGFuZ2UgPSB0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIik7XG4gICAgY29uc3Qgb2xkRm9ybXMgPSB0aGlzLnJvb3QuZm9ybXNGb3JSZWNvdmVyeTtcbiAgICAvLyBTbyB3aHkgZG8gd2UgY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBoZXJlP1xuICAgIC8vIE9uZSB3YXkgdG8gcmVjb3ZlciBmb3JtcyB3b3VsZCBiZSB0byBpbW1lZGlhdGVseSBhcHBseSB0aGUgbW91bnRcbiAgICAvLyBwYXRjaCBhbmQgdGhlbiBhZnRlcndhcmRzIHJlY292ZXIgdGhlIGZvcm1zLiBIb3dldmVyLCB0aGlzIHdvdWxkXG4gICAgLy8gY2F1c2UgYSBmbGlja2VyLCBiZWNhdXNlIHRoZSBtb3VudCBwYXRjaCB3b3VsZCByZW1vdmUgdGhlIGZvcm0gY29udGVudFxuICAgIC8vIHVudGlsIGl0IGlzIHJlc3RvcmVkLiBUaGVyZWZvcmUgTFYgZGVjaWRlZCB0byBkbyBmb3JtIHJlY292ZXJ5IHdpdGggdGhlXG4gICAgLy8gcmF3IEhUTUwgYmVmb3JlIGl0IGlzIGFwcGxpZWQgYW5kIGRlbGF5IHRoZSBtb3VudCBwYXRjaCB1bnRpbCB0aGUgZm9ybVxuICAgIC8vIHJlY292ZXJ5IGV2ZW50cyBhcmUgZG9uZS5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIDwucG9ydGFsPiBoZXJlIGFuZCB0ZWxlcG9ydCBpdCBpbnRvIG91ciB0ZW1wb3JhcnkgRE9NIGZvciByZWNvdmVyeVxuICAgIC8vIGFzIHdlJ2Qgb3RoZXJ3aXNlIG5vdCBmaW5kIHRlbGVwb3J0ZWQgZm9ybXNcbiAgICBET00uYWxsKHRlbXBsYXRlLmNvbnRlbnQsIGBbJHtQSFhfUE9SVEFMfV1gKS5mb3JFYWNoKChwb3J0YWxUZW1wbGF0ZSkgPT4ge1xuICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZC5hcHBlbmRDaGlsZChcbiAgICAgICAgcG9ydGFsVGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBiZWNhdXNlIHdlIHdvcmsgd2l0aCBhIHRlbXBsYXRlIGVsZW1lbnQsIHdlIG11c3QgbWFudWFsbHkgY29weSB0aGUgYXR0cmlidXRlc1xuICAgIC8vIG90aGVyd2lzZSB0aGUgb3duZXIgLyB0YXJnZXQgaGVscGVycyBkb24ndCB3b3JrIHByb3Blcmx5XG4gICAgY29uc3Qgcm9vdEVsID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICByb290RWwuaWQgPSB0aGlzLmlkO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfU0VTU0lPTiwgdGhpcy5nZXRTZXNzaW9uKCkpO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgdGhpcy5nZXRTdGF0aWMoKSk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lELCB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmlkIDogbnVsbCk7XG5cbiAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtIGVsZW1lbnRzIGluIHRoZSBuZXcgSFRNTCBmb3IgdGhlIExWXG4gICAgLy8gYW5kIGxvb2sgZm9yIG9sZCBmb3JtcyBpbiB0aGUgYGZvcm1zRm9yUmVjb3ZlcnlgIG9iamVjdDtcbiAgICAvLyB0aGUgZm9ybXNGb3JSZWNvdmVyeSBjYW4gYWxzbyBjb250YWluIGZvcm1zIGZyb20gY2hpbGQgdmlld3NcbiAgICBjb25zdCBmb3Jtc1RvUmVjb3ZlciA9XG4gICAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtcyBpbiB0aGUgbmV3IERPTTsgYmVjYXVzZSB0aGlzIGlzIG9ubHkgdGhlIEhUTUwgZm9yIHRoZSBjdXJyZW50XG4gICAgICAvLyB2aWV3LCB3ZSBjYW4gYmUgc3VyZSB0aGF0IGFsbCBmb3JtcyBhcmUgb3duZWQgYnkgdGhpcyB2aWV3OlxuICAgICAgRE9NLmFsbCh0ZW1wbGF0ZS5jb250ZW50LCBcImZvcm1cIilcbiAgICAgICAgLy8gb25seSByZWNvdmVyIGZvcm1zIHRoYXQgaGF2ZSBhbiBpZCBhbmQgYXJlIGluIHRoZSBvbGQgRE9NXG4gICAgICAgIC5maWx0ZXIoKG5ld0Zvcm0pID0+IG5ld0Zvcm0uaWQgJiYgb2xkRm9ybXNbbmV3Rm9ybS5pZF0pXG4gICAgICAgIC8vIGFiYW5kb24gZm9ybXMgd2UgYWxyZWFkeSB0cmllZCB0byByZWNvdmVyIHRvIHByZXZlbnQgbG9vcGluZyBhIGZhaWxlZCBzdGF0ZVxuICAgICAgICAuZmlsdGVyKChuZXdGb3JtKSA9PiAhdGhpcy5wZW5kaW5nRm9ybXMuaGFzKG5ld0Zvcm0uaWQpKVxuICAgICAgICAvLyBvbmx5IHJlY292ZXIgaWYgdGhlIGZvcm0gaGFzIHRoZSBzYW1lIHBoeC1jaGFuZ2UgdmFsdWVcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAobmV3Rm9ybSkgPT5cbiAgICAgICAgICAgIG9sZEZvcm1zW25ld0Zvcm0uaWRdLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpID09PVxuICAgICAgICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChuZXdGb3JtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtvbGRGb3Jtc1tuZXdGb3JtLmlkXSwgbmV3Rm9ybV07XG4gICAgICAgIH0pO1xuXG4gICAgaWYgKGZvcm1zVG9SZWNvdmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZm9ybXNUb1JlY292ZXIuZm9yRWFjaCgoW29sZEZvcm0sIG5ld0Zvcm1dLCBpKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdGb3Jtcy5hZGQobmV3Rm9ybS5pZCk7XG4gICAgICAvLyBpdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBmaXJzdEVsZW1lbnRDaGlsZCBvZiB0aGUgdGVtcGxhdGUgY29udGVudFxuICAgICAgLy8gYmVjYXVzZSB3aGVuIHRyYXZlcnNpbmcgYSBkb2N1bWVudEZyYWdtZW50IHVzaW5nIHBhcmVudE5vZGUsIHdlIHdvbid0IGV2ZXIgYXJyaXZlIGF0XG4gICAgICAvLyB0aGUgZnJhZ21lbnQ7IGFzIHRoZSB0ZW1wbGF0ZSBpcyBhbHdheXMgYSBMaXZlVmlldywgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5XG4gICAgICAvLyBvbmUgY2hpbGQgb24gdGhlIHJvb3QgbGV2ZWxcbiAgICAgIHRoaXMucHVzaEZvcm1SZWNvdmVyeShcbiAgICAgICAgb2xkRm9ybSxcbiAgICAgICAgbmV3Rm9ybSxcbiAgICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0Zvcm1zLmRlbGV0ZShuZXdGb3JtLmlkKTtcbiAgICAgICAgICAvLyB3ZSBvbmx5IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgYWxsIGZvcm1zIGhhdmUgYmVlbiByZWNvdmVyZWRcbiAgICAgICAgICBpZiAoaSA9PT0gZm9ybXNUb1JlY292ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2hpbGRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVtpZF07XG4gIH1cblxuICBnZXREZXNjZW5kZW50QnlFbChlbCkge1xuICAgIGlmIChlbC5pZCA9PT0gdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2VsLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKV0/LltlbC5pZF07XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveURlc2NlbmRlbnQoaWQpIHtcbiAgICBmb3IgKGNvbnN0IHBhcmVudElkIGluIHRoaXMucm9vdC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZElkIGluIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF0pIHtcbiAgICAgICAgaWYgKGNoaWxkSWQgPT09IGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF1bY2hpbGRJZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgam9pbkNoaWxkKGVsKSB7XG4gICAgY29uc3QgY2hpbGQgPSB0aGlzLmdldENoaWxkQnlJZChlbC5pZCk7XG4gICAgaWYgKCFjaGlsZCkge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLmxpdmVTb2NrZXQsIHRoaXMpO1xuICAgICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW3ZpZXcuaWRdID0gdmlldztcbiAgICAgIHZpZXcuam9pbigpO1xuICAgICAgdGhpcy5jaGlsZEpvaW5zKys7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpc0pvaW5QZW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmpvaW5QZW5kaW5nO1xuICB9XG5cbiAgYWNrSm9pbihfY2hpbGQpIHtcbiAgICB0aGlzLmNoaWxkSm9pbnMtLTtcblxuICAgIGlmICh0aGlzLmNoaWxkSm9pbnMgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKCkge1xuICAgIC8vIHdlIGNhbiBjbGVhciBwZW5kaW5nIGZvcm0gcmVjb3ZlcmllcyBub3cgdGhhdCB3ZSd2ZSBqb2luZWQuXG4gICAgLy8gVGhleSBlaXRoZXIgYWxsIHJlc29sdmVkIG9yIHdlcmUgYWJhbmRvbmVkXG4gICAgdGhpcy5wZW5kaW5nRm9ybXMuY2xlYXIoKTtcbiAgICAvLyB3ZSBjYW4gYWxzbyBjbGVhciB0aGUgZm9ybXNGb3JSZWNvdmVyeSBvYmplY3QgdG8gbm90IGtlZXAgb2xkIGZvcm0gZWxlbWVudHMgYXJvdW5kXG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5qb2luQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChbdmlldywgb3BdKSA9PiB7XG4gICAgICAgIGlmICghdmlldy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICAgb3AoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gW107XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGUoZGlmZiwgZXZlbnRzLCBpc1BlbmRpbmcgPSBmYWxzZSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNKb2luUGVuZGluZygpIHx8XG4gICAgICAodGhpcy5saXZlU29ja2V0Lmhhc1BlbmRpbmdMaW5rKCkgJiYgdGhpcy5yb290LmlzTWFpbigpKVxuICAgICkge1xuICAgICAgLy8gZG9uJ3QgbXV0YXRlIGlmIHRoaXMgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZGlmZlxuICAgICAgaWYgKCFpc1BlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaCh7IGRpZmYsIGV2ZW50cyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVkLm1lcmdlRGlmZihkaWZmKTtcbiAgICBsZXQgcGh4Q2hpbGRyZW5BZGRlZCA9IGZhbHNlO1xuXG4gICAgLy8gV2hlbiB0aGUgZGlmZiBvbmx5IGNvbnRhaW5zIGNvbXBvbmVudCBkaWZmcywgdGhlbiB3YWxrIGNvbXBvbmVudHNcbiAgICAvLyBhbmQgcGF0Y2ggb25seSB0aGUgcGFyZW50IGNvbXBvbmVudCBjb250YWluZXJzIGZvdW5kIGluIHRoZSBkaWZmLlxuICAgIC8vIE90aGVyd2lzZSwgcGF0Y2ggZW50aXJlIExWIGNvbnRhaW5lci5cbiAgICBpZiAodGhpcy5yZW5kZXJlZC5pc0NvbXBvbmVudE9ubHlEaWZmKGRpZmYpKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudGltZShcImNvbXBvbmVudCBwYXRjaCBjb21wbGV0ZVwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudENpZHMgPSBET00uZmluZEV4aXN0aW5nUGFyZW50Q0lEcyhcbiAgICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgIHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSxcbiAgICAgICAgKTtcbiAgICAgICAgcGFyZW50Q2lkcy5mb3JFYWNoKChwYXJlbnRDSUQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFBhdGNoKFxuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLmdldENvbXBvbmVudChkaWZmLCBwYXJlbnRDSUQpLFxuICAgICAgICAgICAgICBwYXJlbnRDSUQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaXNFbXB0eShkaWZmKSkge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnRpbWUoXCJmdWxsIHBhdGNoIGNvbXBsZXRlXCIsICgpID0+IHtcbiAgICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIoZGlmZiwgXCJ1cGRhdGVcIik7XG4gICAgICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIG51bGwpO1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgaWYgKHBoeENoaWxkcmVuQWRkZWQpIHtcbiAgICAgIHRoaXMuam9pbk5ld0NoaWxkcmVuKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZW5kZXJDb250YWluZXIoZGlmZiwga2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQudGltZShgdG9TdHJpbmcgZGlmZiAoJHtraW5kfSlgLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWcgPSB0aGlzLmVsLnRhZ05hbWU7XG4gICAgICAvLyBEb24ndCBza2lwIGFueSBjb21wb25lbnQgaW4gdGhlIGRpZmYgbm9yIGFueSBtYXJrZWQgYXMgcHJ1bmVkXG4gICAgICAvLyAoYXMgdGhleSBtYXkgaGF2ZSBiZWVuIGFkZGVkIGJhY2spXG4gICAgICBjb25zdCBjaWRzID0gZGlmZiA/IHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSA6IG51bGw7XG4gICAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC50b1N0cmluZyhjaWRzKTtcbiAgICAgIHJldHVybiBbYDwke3RhZ30+JHtodG1sfTwvJHt0YWd9PmAsIHN0cmVhbXNdO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50UGF0Y2goZGlmZiwgY2lkKSB7XG4gICAgaWYgKGlzRW1wdHkoZGlmZikpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC5jb21wb25lbnRUb1N0cmluZyhjaWQpO1xuICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIGNpZCk7XG4gICAgY29uc3QgY2hpbGRyZW5BZGRlZCA9IHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCB0cnVlKTtcbiAgICByZXR1cm4gY2hpbGRyZW5BZGRlZDtcbiAgfVxuXG4gIGdldEhvb2soZWwpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGVsKV07XG4gIH1cblxuICBhZGRIb29rKGVsKSB7XG4gICAgY29uc3QgaG9va0VsSWQgPSBWaWV3SG9vay5lbGVtZW50SUQoZWwpO1xuXG4gICAgLy8gb25seSBldmVyIHRyeSB0byBhZGQgaG9va3MgdG8gZWxlbWVudHMgb3duZWQgYnkgdGhpcyB2aWV3XG4gICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiAhdGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaG9va0VsSWQgJiYgIXRoaXMudmlld0hvb2tzW2hvb2tFbElkXSkge1xuICAgICAgLy8gaG9vayBjcmVhdGVkLCBidXQgbm90IGF0dGFjaGVkIChjcmVhdGVIb29rIGZvciB3ZWIgY29tcG9uZW50KVxuICAgICAgY29uc3QgaG9vayA9XG4gICAgICAgIERPTS5nZXRDdXN0b21FbEhvb2soZWwpIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyBob29rIGZvdW5kIGZvciBjdXN0b20gZWxlbWVudDogJHtlbC5pZH1gKTtcbiAgICAgIHRoaXMudmlld0hvb2tzW2hvb2tFbElkXSA9IGhvb2s7XG4gICAgICBob29rLl9fYXR0YWNoVmlldyh0aGlzKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH0gZWxzZSBpZiAoaG9va0VsSWQgfHwgIWVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgLy8gbm8gaG9vayBmb3VuZFxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBuZXcgaG9vayBmb3VuZCB3aXRoIHBoeC1ob29rIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgaG9va05hbWUgPVxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoYGRhdGEtcGh4LSR7UEhYX0hPT0t9YCkgfHxcbiAgICAgICAgZWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfSE9PSykpO1xuXG4gICAgICBpZiAoIWhvb2tOYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaG9va0RlZmluaXRpb24gPSB0aGlzLmxpdmVTb2NrZXQuZ2V0SG9va0RlZmluaXRpb24oaG9va05hbWUpO1xuXG4gICAgICBpZiAoaG9va0RlZmluaXRpb24pIHtcbiAgICAgICAgaWYgKCFlbC5pZCkge1xuICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgYG5vIERPTSBJRCBmb3IgaG9vayBcIiR7aG9va05hbWV9XCIuIEhvb2tzIHJlcXVpcmUgYSB1bmlxdWUgSUQgb24gZWFjaCBlbGVtZW50LmAsXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBob29rSW5zdGFuY2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGhvb2tEZWZpbml0aW9uID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIGhvb2tEZWZpbml0aW9uLnByb3RvdHlwZSBpbnN0YW5jZW9mIFZpZXdIb29rXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJdCdzIGEgY2xhc3MgY29uc3RydWN0b3IgKHN1YmNsYXNzIG9mIFZpZXdIb29rKVxuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IGhvb2tEZWZpbml0aW9uKHRoaXMsIGVsKTsgLy8gYHRoaXNgIGlzIHRoZSBWaWV3IGluc3RhbmNlXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBob29rRGVmaW5pdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaG9va0RlZmluaXRpb24gIT09IG51bGxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIEl0J3MgYW4gb2JqZWN0IGxpdGVyYWwsIHBhc3MgaXQgdG8gdGhlIFZpZXdIb29rIGNvbnN0cnVjdG9yIGZvciB3cmFwcGluZ1xuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IFZpZXdIb29rKHRoaXMsIGVsLCBob29rRGVmaW5pdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBob29rIGRlZmluaXRpb24gZm9yIFwiJHtob29rTmFtZX1cIi4gRXhwZWN0ZWQgYSBjbGFzcyBleHRlbmRpbmcgVmlld0hvb2sgb3IgYW4gb2JqZWN0IGRlZmluaXRpb24uYCxcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKTtcbiAgICAgICAgICBsb2dFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBob29rIFwiJHtob29rTmFtZX1cIjogJHtlcnJvck1lc3NhZ2V9YCwgZWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlld0hvb2tzW1ZpZXdIb29rLmVsZW1lbnRJRChob29rSW5zdGFuY2UuZWwpXSA9IGhvb2tJbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIGhvb2tJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSBpZiAoaG9va05hbWUgIT09IG51bGwpIHtcbiAgICAgICAgbG9nRXJyb3IoYHVua25vd24gaG9vayBmb3VuZCBmb3IgXCIke2hvb2tOYW1lfVwiYCwgZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lIb29rKGhvb2spIHtcbiAgICAvLyBfX2Rlc3Ryb3llZCBjbGVhcnMgdGhlIGVsZW1lbnRJRCBmcm9tIHRoZSBob29rLCB0aGVyZWZvcmVcbiAgICAvLyB3ZSBuZWVkIHRvIGdldCBpdCBiZWZvcmUgY2FsbGluZyBfX2Rlc3Ryb3llZFxuICAgIGNvbnN0IGhvb2tJZCA9IFZpZXdIb29rLmVsZW1lbnRJRChob29rLmVsKTtcbiAgICBob29rLl9fZGVzdHJveWVkKCk7XG4gICAgaG9vay5fX2NsZWFudXBfXygpO1xuICAgIGRlbGV0ZSB0aGlzLnZpZXdIb29rc1tob29rSWRdO1xuICB9XG5cbiAgYXBwbHlQZW5kaW5nVXBkYXRlcygpIHtcbiAgICAvLyBUbyBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVyZSB3ZSBtaWdodCBzdGlsbCBiZSBwZW5kaW5nIGEgbmV3XG4gICAgLy8gbmF2aWdhdGlvbiBvciB0aGUgam9pbiBpcyBzdGlsbCBwZW5kaW5nLCBgdGhpcy51cGRhdGVgIHJldHVybnMgZmFsc2VcbiAgICAvLyBpZiB0aGUgZGlmZiB3YXMgbm90IGFwcGxpZWQuXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSB0aGlzLnBlbmRpbmdEaWZmcy5maWx0ZXIoXG4gICAgICAoeyBkaWZmLCBldmVudHMgfSkgPT4gIXRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cywgdHJ1ZSksXG4gICAgKTtcbiAgICB0aGlzLmVhY2hDaGlsZCgoY2hpbGQpID0+IGNoaWxkLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKSk7XG4gIH1cblxuICBlYWNoQ2hpbGQoY2FsbGJhY2spIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXSB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGlkIGluIGNoaWxkcmVuKSB7XG4gICAgICBjYWxsYmFjayh0aGlzLmdldENoaWxkQnlJZChpZCkpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbm5lbChldmVudCwgY2IpIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQub25DaGFubmVsKHRoaXMuY2hhbm5lbCwgZXZlbnQsIChyZXNwKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0pvaW5QZW5kaW5nKCkpIHtcbiAgICAgICAgLy8gaW4gY2FzZSB0aGlzIGlzIGEgcmVqb2luIChqb2luQ291bnQgPiAxKSB3ZSBzdG9yZSBvdXIgb3duIGpvaW4gb3BzXG4gICAgICAgIGlmICh0aGlzLmpvaW5Db3VudCA+IDEpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdKb2luT3BzLnB1c2goKCkgPT4gY2IocmVzcCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiBjYihyZXNwKV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiBjYihyZXNwKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kQ2hhbm5lbCgpIHtcbiAgICAvLyBUaGUgZGlmZiBldmVudCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgcmVndWxhciB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICAvLyBBbGwgb3RoZXIgb3BlcmF0aW9ucyBhcmUgcXVldWVkIHRvIGJlIGFwcGxpZWQgb25seSBhZnRlciBqb2luLlxuICAgIHRoaXMubGl2ZVNvY2tldC5vbkNoYW5uZWwodGhpcy5jaGFubmVsLCBcImRpZmZcIiwgKHJhd0RpZmYpID0+IHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmF3RGlmZiwgKHsgZGlmZiwgZXZlbnRzIH0pID0+XG4gICAgICAgICAgdGhpcy51cGRhdGUoZGlmZiwgZXZlbnRzKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMub25DaGFubmVsKFwicmVkaXJlY3RcIiwgKHsgdG8sIGZsYXNoIH0pID0+XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bywgZmxhc2ggfSksXG4gICAgKTtcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVBhdGNoKHJlZGlyKSk7XG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3JlZGlyZWN0XCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVSZWRpcmVjdChyZWRpcikpO1xuICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKChyZWFzb24pID0+IHRoaXMub25FcnJvcihyZWFzb24pKTtcbiAgICB0aGlzLmNoYW5uZWwub25DbG9zZSgocmVhc29uKSA9PiB0aGlzLm9uQ2xvc2UocmVhc29uKSk7XG4gIH1cblxuICBkZXN0cm95QWxsQ2hpbGRyZW4oKSB7XG4gICAgdGhpcy5lYWNoQ2hpbGQoKGNoaWxkKSA9PiBjaGlsZC5kZXN0cm95KCkpO1xuICB9XG5cbiAgb25MaXZlUmVkaXJlY3QocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kLCBmbGFzaCB9ID0gcmVkaXI7XG4gICAgY29uc3QgdXJsID0gdGhpcy5leHBhbmRVUkwodG8pO1xuICAgIGNvbnN0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6c2VydmVyLW5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyB0bywga2luZCwgZmxhc2ggfSxcbiAgICB9KTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVJlZGlyZWN0KGUsIHVybCwga2luZCwgZmxhc2gpO1xuICB9XG5cbiAgb25MaXZlUGF0Y2gocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kIH0gPSByZWRpcjtcbiAgICB0aGlzLmhyZWYgPSB0aGlzLmV4cGFuZFVSTCh0byk7XG4gICAgdGhpcy5saXZlU29ja2V0Lmhpc3RvcnlQYXRjaCh0bywga2luZCk7XG4gIH1cblxuICBleHBhbmRVUkwodG8pIHtcbiAgICByZXR1cm4gdG8uc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0ke3RvfWBcbiAgICAgIDogdG87XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7dG86IHN0cmluZywgZmxhc2g/OiBzdHJpbmcsIHJlbG9hZFRva2VuPzogc3RyaW5nfX0gcmVkaXJlY3RcbiAgICovXG4gIG9uUmVkaXJlY3QoeyB0bywgZmxhc2gsIHJlbG9hZFRva2VuIH0pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3QodG8sIGZsYXNoLCByZWxvYWRUb2tlbik7XG4gIH1cblxuICBpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95ZWQ7XG4gIH1cblxuICBqb2luRGVhZCgpIHtcbiAgICB0aGlzLmlzRGVhZCA9IHRydWU7XG4gIH1cblxuICBqb2luUHVzaCgpIHtcbiAgICB0aGlzLmpvaW5QdXNoID0gdGhpcy5qb2luUHVzaCB8fCB0aGlzLmNoYW5uZWwuam9pbigpO1xuICAgIHJldHVybiB0aGlzLmpvaW5QdXNoO1xuICB9XG5cbiAgam9pbihjYWxsYmFjaykge1xuICAgIHRoaXMuc2hvd0xvYWRlcih0aGlzLmxpdmVTb2NrZXQubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5iaW5kQ2hhbm5lbCgpO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLnN0b3BDYWxsYmFjayA9IHRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe1xuICAgICAgICB0bzogdGhpcy5ocmVmLFxuICAgICAgICBraW5kOiBcImluaXRpYWxcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmpvaW5DYWxsYmFjayA9IChvbkRvbmUpID0+IHtcbiAgICAgIG9uRG9uZSA9IG9uRG9uZSB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgIGNhbGxiYWNrID8gY2FsbGJhY2sodGhpcy5qb2luQ291bnQsIG9uRG9uZSkgOiBvbkRvbmUoKTtcbiAgICB9O1xuXG4gICAgdGhpcy53cmFwUHVzaCgoKSA9PiB0aGlzLmNoYW5uZWwuam9pbigpLCB7XG4gICAgICBvazogKHJlc3ApID0+IHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHRoaXMub25Kb2luKHJlc3ApKSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHRoaXMub25Kb2luRXJyb3IoZXJyb3IpLFxuICAgICAgdGltZW91dDogKCkgPT4gdGhpcy5vbkpvaW5FcnJvcih7IHJlYXNvbjogXCJ0aW1lb3V0XCIgfSksXG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5FcnJvcihyZXNwKSB7XG4gICAgaWYgKHJlc3AucmVhc29uID09PSBcInJlbG9hZFwiKSB7XG4gICAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcbiAgICAgICAgYGZhaWxlZCBtb3VudCB3aXRoICR7cmVzcC5zdGF0dXN9LiBGYWxsaW5nIGJhY2sgdG8gcGFnZSByZWxvYWRgLFxuICAgICAgICByZXNwLFxuICAgICAgXSk7XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bzogdGhpcy5yb290LmhyZWYsIHJlbG9hZFRva2VuOiByZXNwLnRva2VuIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocmVzcC5yZWFzb24gPT09IFwidW5hdXRob3JpemVkXCIgfHwgcmVzcC5yZWFzb24gPT09IFwic3RhbGVcIikge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgIFwidW5hdXRob3JpemVkIGxpdmVfcmVkaXJlY3QuIEZhbGxpbmcgYmFjayB0byBwYWdlIHJlcXVlc3RcIixcbiAgICAgICAgcmVzcCxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5vblJlZGlyZWN0KHsgdG86IHRoaXMucm9vdC5ocmVmLCBmbGFzaDogdGhpcy5mbGFzaCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QgfHwgcmVzcC5saXZlX3JlZGlyZWN0KSB7XG4gICAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmNoYW5uZWwubGVhdmUoKTtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgfVxuICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlc3AubGl2ZV9yZWRpcmVjdCk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwiZXJyb3JcIiwgKCkgPT4gW1widW5hYmxlIHRvIGpvaW5cIiwgcmVzcF0pO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9TRVJWRVJfRVJST1JfQ0xBU1NdLFxuICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5saXZlU29ja2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LnJlbG9hZFdpdGhKaXR0ZXIodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmpvaW5BdHRlbXB0cyA+PSBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUykge1xuICAgICAgICAvLyBwdXQgdGhlIHJvb3QgcmV2aWV3IGludG8gcGVybWFuZW50IGVycm9yIHN0YXRlLCBidXQgZG9uJ3QgZGVzdHJveSBpdCBhcyBpdCBjYW4gcmVtYWluIGFjdGl2ZVxuICAgICAgICB0aGlzLnJvb3QuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgICAgYGdpdmluZyB1cCB0cnlpbmcgdG8gbW91bnQgYWZ0ZXIgJHtNQVhfQ0hJTERfSk9JTl9BVFRFTVBUU30gdHJpZXNgLFxuICAgICAgICAgIHJlc3AsXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRydWVDaGlsZEVsID0gRE9NLmJ5SWQodGhpcy5lbC5pZCk7XG4gICAgICBpZiAodHJ1ZUNoaWxkRWwpIHtcbiAgICAgICAgRE9NLm1lcmdlQXR0cnModHJ1ZUNoaWxkRWwsIHRoaXMuZWwpO1xuICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgICBbUEhYX0xPQURJTkdfQ0xBU1MsIFBIWF9FUlJPUl9DTEFTUywgUEhYX1NFUlZFUl9FUlJPUl9DTEFTU10sXG4gICAgICAgICAgeyB1bnN0cnVjdHVyZWRFcnJvcjogcmVzcCwgZXJyb3JLaW5kOiBcInNlcnZlclwiIH0sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZWwgPSB0cnVlQ2hpbGRFbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2xvc2UocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTWFpbigpICYmXG4gICAgICB0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSAmJlxuICAgICAgcmVhc29uICE9PSBcImxlYXZlXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuZHJvcEFjdGl2ZUVsZW1lbnQodGhpcyk7XG4gICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCkpIHtcbiAgICAgIHRoaXMuc2hvd0xvYWRlcihCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VUKTtcbiAgICB9XG4gIH1cblxuICBvbkVycm9yKHJlYXNvbikge1xuICAgIHRoaXMub25DbG9zZShyZWFzb24pO1xuICAgIGlmICh0aGlzLmxpdmVTb2NrZXQuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ2aWV3IGNyYXNoZWRcIiwgcmVhc29uXSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5saXZlU29ja2V0LmlzVW5sb2FkZWQoKSkge1xuICAgICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZWFzb24sIGVycm9yS2luZDogXCJzZXJ2ZXJcIiB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXG4gICAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9DTElFTlRfRVJST1JfQ0xBU1NdLFxuICAgICAgICAgIHsgdW5zdHJ1Y3R1cmVkRXJyb3I6IHJlYXNvbiwgZXJyb3JLaW5kOiBcImNsaWVudFwiIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGlzcGxheUVycm9yKGNsYXNzZXMsIGRldGFpbHMgPSB7fSkge1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7XG4gICAgICAgIGRldGFpbDogeyB0bzogdGhpcy5ocmVmLCBraW5kOiBcImVycm9yXCIsIC4uLmRldGFpbHMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNob3dMb2FkZXIoKTtcbiAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoLi4uY2xhc3Nlcyk7XG4gICAgdGhpcy5kZWxheWVkRGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBkZWxheWVkRGlzY29ubmVjdGVkKCkge1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJkaXNjb25uZWN0ZWRcIikpO1xuICAgIH0sIHRoaXMubGl2ZVNvY2tldC5kaXNjb25uZWN0ZWRUaW1lb3V0KTtcbiAgfVxuXG4gIHdyYXBQdXNoKGNhbGxlclB1c2gsIHJlY2VpdmVzKSB7XG4gICAgY29uc3QgbGF0ZW5jeSA9IHRoaXMubGl2ZVNvY2tldC5nZXRMYXRlbmN5U2ltKCk7XG4gICAgY29uc3Qgd2l0aExhdGVuY3kgPSBsYXRlbmN5XG4gICAgICA/IChjYikgPT4gc2V0VGltZW91dCgoKSA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIGNiKCksIGxhdGVuY3kpXG4gICAgICA6IChjYikgPT4gIXRoaXMuaXNEZXN0cm95ZWQoKSAmJiBjYigpO1xuXG4gICAgd2l0aExhdGVuY3koKCkgPT4ge1xuICAgICAgY2FsbGVyUHVzaCgpXG4gICAgICAgIC5yZWNlaXZlKFwib2tcIiwgKHJlc3ApID0+XG4gICAgICAgICAgd2l0aExhdGVuY3koKCkgPT4gcmVjZWl2ZXMub2sgJiYgcmVjZWl2ZXMub2socmVzcCkpLFxuICAgICAgICApXG4gICAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgKHJlYXNvbikgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy5lcnJvciAmJiByZWNlaXZlcy5lcnJvcihyZWFzb24pKSxcbiAgICAgICAgKVxuICAgICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy50aW1lb3V0ICYmIHJlY2VpdmVzLnRpbWVvdXQoKSksXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIm5vIGNvbm5lY3Rpb25cIikpO1xuICAgIH1cblxuICAgIGNvbnN0IFtyZWYsIFtlbF0sIG9wdHNdID0gcmVmR2VuZXJhdG9yXG4gICAgICA/IHJlZkdlbmVyYXRvcih7IHBheWxvYWQgfSlcbiAgICAgIDogW251bGwsIFtdLCB7fV07XG4gICAgY29uc3Qgb2xkSm9pbkNvdW50ID0gdGhpcy5qb2luQ291bnQ7XG4gICAgbGV0IG9uTG9hZGluZ0RvbmUgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBpZiAob3B0cy5wYWdlX2xvYWRpbmcpIHtcbiAgICAgIG9uTG9hZGluZ0RvbmUgPSB0aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHtcbiAgICAgICAga2luZDogXCJlbGVtZW50XCIsXG4gICAgICAgIHRhcmdldDogZWwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQuY2lkICE9PSBcIm51bWJlclwiKSB7XG4gICAgICBkZWxldGUgcGF5bG9hZC5jaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMud3JhcFB1c2goKCkgPT4gdGhpcy5jaGFubmVsLnB1c2goZXZlbnQsIHBheWxvYWQsIFBVU0hfVElNRU9VVCksIHtcbiAgICAgICAgb2s6IChyZXNwKSA9PiB7XG4gICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0QWNrUmVmID0gcmVmO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmaW5pc2ggPSAoaG9va1JlcGx5KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcC5yZWRpcmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzcC5saXZlX3BhdGNoKSB7XG4gICAgICAgICAgICAgIHRoaXMub25MaXZlUGF0Y2gocmVzcC5saXZlX3BhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25Mb2FkaW5nRG9uZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZSh7IHJlc3A6IHJlc3AsIHJlcGx5OiBob29rUmVwbHksIHJlZiB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChyZXNwLmRpZmYpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmVzcC5kaWZmLCAoeyBkaWZmLCByZXBseSwgZXZlbnRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cyk7XG4gICAgICAgICAgICAgICAgZmluaXNoKHJlcGx5KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5pc2gobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKHJlYXNvbikgPT5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBmYWlsZWQgd2l0aCByZWFzb246ICR7SlNPTi5zdHJpbmdpZnkocmVhc29uKX1gKSksXG4gICAgICAgIHRpbWVvdXQ6ICgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwidGltZW91dFwiKSk7XG4gICAgICAgICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSBvbGRKb2luQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZWxvYWRXaXRoSml0dGVyKHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2coXCJ0aW1lb3V0XCIsICgpID0+IFtcbiAgICAgICAgICAgICAgICBcInJlY2VpdmVkIHRpbWVvdXQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlci4gRmFsbGluZyBiYWNrIHRvIGhhcmQgcmVmcmVzaCBmb3IgcmVjb3ZlcnlcIixcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuZG9SZWZzKHJlZiwgcGh4RXZlbnQsIG9ubHlFbHMpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZXhpdCBpZiBleHRlcm5hbCBmb3JtIHRyaWdnZXJlZFxuICAgIGNvbnN0IHNlbGVjdG9yID0gYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gO1xuXG4gICAgaWYgKG9ubHlFbHMpIHtcbiAgICAgIG9ubHlFbHMgPSBuZXcgU2V0KG9ubHlFbHMpO1xuICAgICAgRE9NLmFsbChkb2N1bWVudCwgc2VsZWN0b3IsIChwYXJlbnQpID0+IHtcbiAgICAgICAgaWYgKG9ubHlFbHMgJiYgIW9ubHlFbHMuaGFzKHBhcmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdW5kbyBhbnkgY2hpbGQgcmVmcyB3aXRoaW4gcGFyZW50IGZpcnN0XG4gICAgICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGNoaWxkKSA9PlxuICAgICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51bmRvRWxSZWYocGFyZW50LCByZWYsIHBoeEV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBET00uYWxsKGRvY3VtZW50LCBzZWxlY3RvciwgKGVsKSA9PiB0aGlzLnVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGVsUmVmID0gbmV3IEVsZW1lbnRSZWYoZWwpO1xuXG4gICAgZWxSZWYubWF5YmVVbmRvKHJlZiwgcGh4RXZlbnQsIChjbG9uZWRUcmVlKSA9PiB7XG4gICAgICAvLyB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBmdWxsIHBhdGNoIG9uIHVubG9ja2VkIGVsZW1lbnRzXG4gICAgICAvLyB0byBwZXJmb3JtIGFsbCB0aGUgbmVjZXNzYXJ5IGxvZ2ljIChsaWtlIGNhbGxpbmcgdXBkYXRlZCBmb3IgaG9va3MsIGV0Yy4pXG4gICAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCBlbCwgdGhpcy5pZCwgY2xvbmVkVHJlZSwgW10sIG51bGwsIHtcbiAgICAgICAgdW5kb1JlZjogcmVmLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgRE9NLmFsbChlbCwgYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gLCAoY2hpbGQpID0+XG4gICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICk7XG4gICAgICBpZiAocGh4Q2hpbGRyZW5BZGRlZCkge1xuICAgICAgICB0aGlzLmpvaW5OZXdDaGlsZHJlbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVmU3JjKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmlkO1xuICB9XG5cbiAgcHV0UmVmKGVsZW1lbnRzLCBwaHhFdmVudCwgZXZlbnRUeXBlLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBuZXdSZWYgPSB0aGlzLnJlZisrO1xuICAgIGNvbnN0IGRpc2FibGVXaXRoID0gdGhpcy5iaW5kaW5nKFBIWF9ESVNBQkxFX1dJVEgpO1xuICAgIGlmIChvcHRzLmxvYWRpbmcpIHtcbiAgICAgIGNvbnN0IGxvYWRpbmdFbHMgPSBET00uYWxsKGRvY3VtZW50LCBvcHRzLmxvYWRpbmcpLm1hcCgoZWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZWwsIGxvY2s6IHRydWUsIGxvYWRpbmc6IHRydWUgfTtcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudHMgPSBlbGVtZW50cy5jb25jYXQobG9hZGluZ0Vscyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7IGVsLCBsb2NrLCBsb2FkaW5nIH0gb2YgZWxlbWVudHMpIHtcbiAgICAgIGlmICghbG9jayAmJiAhbG9hZGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwdXRSZWYgcmVxdWlyZXMgbG9jayBvciBsb2FkaW5nXCIpO1xuICAgICAgfVxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQURJTkcsIG5ld1JlZik7XG4gICAgICB9XG4gICAgICBpZiAobG9jaykge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLLCBuZXdSZWYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICFsb2FkaW5nIHx8XG4gICAgICAgIChvcHRzLnN1Ym1pdHRlciAmJiAhKGVsID09PSBvcHRzLnN1Ym1pdHRlciB8fCBlbCA9PT0gb3B0cy5mb3JtKSlcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9ja0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoYHBoeDp1bmRvLWxvY2s6JHtuZXdSZWZ9YCwgKCkgPT4gcmVzb2x2ZShkZXRhaWwpLCB7XG4gICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbG9hZGluZ0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgYHBoeDp1bmRvLWxvYWRpbmc6JHtuZXdSZWZ9YCxcbiAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgeyBvbmNlOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgZWwuY2xhc3NMaXN0LmFkZChgcGh4LSR7ZXZlbnRUeXBlfS1sb2FkaW5nYCk7XG4gICAgICBjb25zdCBkaXNhYmxlVGV4dCA9IGVsLmdldEF0dHJpYnV0ZShkaXNhYmxlV2l0aCk7XG4gICAgICBpZiAoZGlzYWJsZVRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCFlbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKSkge1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsIGVsLmlubmVyVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVUZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUEhYX0RJU0FCTEVEIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHNldCBpbiBkaXNhYmxlRm9ybVxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgUEhYX0RJU0FCTEVELFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQpIHx8IGVsLmRpc2FibGVkLFxuICAgICAgICApO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGV0YWlsID0ge1xuICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgICByZWY6IG5ld1JlZixcbiAgICAgICAgaXNMb2FkaW5nOiBsb2FkaW5nLFxuICAgICAgICBpc0xvY2tlZDogbG9jayxcbiAgICAgICAgbG9ja0VsZW1lbnRzOiBlbGVtZW50cy5maWx0ZXIoKHsgbG9jayB9KSA9PiBsb2NrKS5tYXAoKHsgZWwgfSkgPT4gZWwpLFxuICAgICAgICBsb2FkaW5nRWxlbWVudHM6IGVsZW1lbnRzXG4gICAgICAgICAgLmZpbHRlcigoeyBsb2FkaW5nIH0pID0+IGxvYWRpbmcpXG4gICAgICAgICAgLm1hcCgoeyBlbCB9KSA9PiBlbCksXG4gICAgICAgIHVubG9jazogKGVscykgPT4ge1xuICAgICAgICAgIGVscyA9IEFycmF5LmlzQXJyYXkoZWxzKSA/IGVscyA6IFtlbHNdO1xuICAgICAgICAgIHRoaXMudW5kb1JlZnMobmV3UmVmLCBwaHhFdmVudCwgZWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgbG9ja0NvbXBsZXRlOiBsb2NrQ29tcGxldGVQcm9taXNlLFxuICAgICAgICBsb2FkaW5nQ29tcGxldGU6IGxvYWRpbmdDb21wbGV0ZVByb21pc2UsXG4gICAgICAgIGxvY2s6IChsb2NrRWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWNrZWQobmV3UmVmKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZXRhaWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9ja0VsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0ssIG5ld1JlZik7XG4gICAgICAgICAgICBsb2NrRWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgICAgICAgIGxvY2tFbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBgcGh4OmxvY2stc3RvcDoke25ld1JlZn1gLFxuICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpZiAob3B0cy5wYXlsb2FkKSB7XG4gICAgICAgIGRldGFpbFtcInBheWxvYWRcIl0gPSBvcHRzLnBheWxvYWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy50YXJnZXQpIHtcbiAgICAgICAgZGV0YWlsW1widGFyZ2V0XCJdID0gb3B0cy50YXJnZXQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5vcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgIGRldGFpbFtcIm9yaWdpbmFsRXZlbnRcIl0gPSBvcHRzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB9XG4gICAgICBlbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6cHVzaFwiLCB7XG4gICAgICAgICAgZGV0YWlsOiBkZXRhaWwsXG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaWYgKHBoeEV2ZW50KSB7XG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6cHVzaDoke3BoeEV2ZW50fWAsIHtcbiAgICAgICAgICAgIGRldGFpbDogZGV0YWlsLFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW25ld1JlZiwgZWxlbWVudHMubWFwKCh7IGVsIH0pID0+IGVsKSwgb3B0c107XG4gIH1cblxuICBpc0Fja2VkKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxhc3RBY2tSZWYgIT09IG51bGwgJiYgdGhpcy5sYXN0QWNrUmVmID49IHJlZjtcbiAgfVxuXG4gIGNvbXBvbmVudElEKGVsKSB7XG4gICAgY29uc3QgY2lkID0gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKTtcbiAgICByZXR1cm4gY2lkID8gcGFyc2VJbnQoY2lkKSA6IG51bGw7XG4gIH1cblxuICB0YXJnZXRDb21wb25lbnRJRCh0YXJnZXQsIHRhcmdldEN0eCwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIHJldHVybiB0YXJnZXRDdHg7XG4gICAgfVxuXG4gICAgY29uc3QgY2lkT3JTZWxlY3RvciA9XG4gICAgICBvcHRzLnRhcmdldCB8fCB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInRhcmdldFwiKSk7XG4gICAgaWYgKGlzQ2lkKGNpZE9yU2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoY2lkT3JTZWxlY3Rvcik7XG4gICAgfSBlbHNlIGlmICh0YXJnZXRDdHggJiYgKGNpZE9yU2VsZWN0b3IgIT09IG51bGwgfHwgb3B0cy50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VzdENvbXBvbmVudElEKHRhcmdldEN0eCkge1xuICAgIGlmIChpc0NpZCh0YXJnZXRDdHgpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0Q3R4O1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0Q3R4KSB7XG4gICAgICByZXR1cm4gbWF5YmUoXG4gICAgICAgIHRhcmdldEN0eC5jbG9zZXN0KGBbJHtQSFhfQ09NUE9ORU5UfV1gKSxcbiAgICAgICAgKGVsKSA9PiB0aGlzLm93bnNFbGVtZW50KGVsKSAmJiB0aGlzLmNvbXBvbmVudElEKGVsKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hIb29rRXZlbnQoZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJob29rXCIsICgpID0+IFtcbiAgICAgICAgXCJ1bmFibGUgdG8gcHVzaCBob29rIGV2ZW50LiBMaXZlVmlldyBub3QgY29ubmVjdGVkXCIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcInVuYWJsZSB0byBwdXNoIGhvb2sgZXZlbnQuIExpdmVWaWV3IG5vdCBjb25uZWN0ZWRcIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZkdlbmVyYXRvciA9ICgpID0+XG4gICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgZXZlbnQsIFwiaG9va1wiLCB7XG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0Q3R4LFxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCB7XG4gICAgICB0eXBlOiBcImhvb2tcIixcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIHZhbHVlOiBwYXlsb2FkLFxuICAgICAgY2lkOiB0aGlzLmNsb3Nlc3RDb21wb25lbnRJRCh0YXJnZXRDdHgpLFxuICAgIH0pLnRoZW4oKHsgcmVzcDogX3Jlc3AsIHJlcGx5LCByZWYgfSkgPT4gKHsgcmVwbHksIHJlZiB9KSk7XG4gIH1cblxuICBleHRyYWN0TWV0YShlbCwgbWV0YSwgdmFsdWUpIHtcbiAgICBjb25zdCBwcmVmaXggPSB0aGlzLmJpbmRpbmcoXCJ2YWx1ZS1cIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgbWV0YSA9IHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZSA9IGVsLmF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBtZXRhW25hbWUucmVwbGFjZShwcmVmaXgsIFwiXCIpXSA9IGVsLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShlbCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkpIHtcbiAgICAgIGlmICghbWV0YSkge1xuICAgICAgICBtZXRhID0ge307XG4gICAgICB9XG4gICAgICBtZXRhLnZhbHVlID0gZWwudmFsdWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZWwudGFnTmFtZSA9PT0gXCJJTlBVVFwiICYmXG4gICAgICAgIENIRUNLQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlKSA+PSAwICYmXG4gICAgICAgICFlbC5jaGVja2VkXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIG1ldGEudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgIG1ldGEgPSB7fTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIG1ldGFba2V5XSA9IHZhbHVlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXRhO1xuICB9XG5cbiAgcHVzaEV2ZW50KHR5cGUsIGVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBtZXRhLCBvcHRzID0ge30sIG9uUmVwbHkpIHtcbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkoXG4gICAgICAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgcGh4RXZlbnQsIHR5cGUsIHtcbiAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgIHBheWxvYWQ6IG1heWJlUGF5bG9hZD8ucGF5bG9hZCxcbiAgICAgICAgfSksXG4gICAgICBcImV2ZW50XCIsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IHRoaXMuZXh0cmFjdE1ldGEoZWwsIG1ldGEsIG9wdHMudmFsdWUpLFxuICAgICAgICBjaWQ6IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoZWwsIHRhcmdldEN0eCwgb3B0cyksXG4gICAgICB9LFxuICAgIClcbiAgICAgIC50aGVuKCh7IHJlcGx5IH0pID0+IG9uUmVwbHkgJiYgb25SZXBseShyZXBseSkpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICBwdXNoRmlsZVByb2dyZXNzKGZpbGVFbCwgZW50cnlSZWYsIHByb2dyZXNzLCBvblJlcGx5ID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQud2l0aGluT3duZXJzKGZpbGVFbC5mb3JtLCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICB2aWV3XG4gICAgICAgIC5wdXNoV2l0aFJlcGx5KG51bGwsIFwicHJvZ3Jlc3NcIiwge1xuICAgICAgICAgIGV2ZW50OiBmaWxlRWwuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhQSFhfUFJPR1JFU1MpKSxcbiAgICAgICAgICByZWY6IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICAgIGVudHJ5X3JlZjogZW50cnlSZWYsXG4gICAgICAgICAgcHJvZ3Jlc3M6IHByb2dyZXNzLFxuICAgICAgICAgIGNpZDogdmlldy50YXJnZXRDb21wb25lbnRJRChmaWxlRWwuZm9ybSwgdGFyZ2V0Q3R4KSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gb25SZXBseSgpKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGZpbGUgcHJvZ3Jlc3NcIiwgZXJyb3IpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hJbnB1dChpbnB1dEVsLCB0YXJnZXRDdHgsIGZvcmNlQ2lkLCBwaHhFdmVudCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAoIWlucHV0RWwuZm9ybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZm9ybSBldmVudHMgcmVxdWlyZSB0aGUgaW5wdXQgdG8gYmUgaW5zaWRlIGEgZm9ybVwiKTtcbiAgICB9XG5cbiAgICBsZXQgdXBsb2FkcztcbiAgICBjb25zdCBjaWQgPSBpc0NpZChmb3JjZUNpZClcbiAgICAgID8gZm9yY2VDaWRcbiAgICAgIDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCwgb3B0cyk7XG4gICAgY29uc3QgcmVmR2VuZXJhdG9yID0gKG1heWJlUGF5bG9hZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucHV0UmVmKFxuICAgICAgICBbXG4gICAgICAgICAgeyBlbDogaW5wdXRFbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICAgIHsgZWw6IGlucHV0RWwuZm9ybSwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgXCJjaGFuZ2VcIixcbiAgICAgICAgeyAuLi5vcHRzLCBwYXlsb2FkOiBtYXliZVBheWxvYWQ/LnBheWxvYWQgfSxcbiAgICAgICk7XG4gICAgfTtcbiAgICBsZXQgZm9ybURhdGE7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoaW5wdXRFbC5mb3JtLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplT3B0cyA9IHt9O1xuICAgIGlmIChpbnB1dEVsIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgIHNlcmlhbGl6ZU9wdHMuc3VibWl0dGVyID0gaW5wdXRFbDtcbiAgICB9XG4gICAgaWYgKGlucHV0RWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNoYW5nZVwiKSkpIHtcbiAgICAgIGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShpbnB1dEVsLmZvcm0sIHNlcmlhbGl6ZU9wdHMsIFtpbnB1dEVsLm5hbWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGlucHV0RWwuZm9ybSwgc2VyaWFsaXplT3B0cyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmXG4gICAgICBpbnB1dEVsLmZpbGVzICYmXG4gICAgICBpbnB1dEVsLmZpbGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGlucHV0RWwsIEFycmF5LmZyb20oaW5wdXRFbC5maWxlcykpO1xuICAgIH1cbiAgICB1cGxvYWRzID0gTGl2ZVVwbG9hZGVyLnNlcmlhbGl6ZVVwbG9hZHMoaW5wdXRFbCk7XG5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgbWV0YToge1xuICAgICAgICAvLyBubyB0YXJnZXQgd2FzIGltcGxpY2l0bHkgc2VudCBhcyBcInVuZGVmaW5lZFwiIGluIExWIDw9IDEuMC41LCB0aGVyZWZvcmVcbiAgICAgICAgLy8gd2UgaGF2ZSB0byBrZWVwIGl0LiBJbiAxLjAuNiB3ZSBzd2l0Y2hlZCBmcm9tIHBhc3NpbmcgbWV0YSBhcyBVUkwgZW5jb2RlZCBkYXRhXG4gICAgICAgIC8vIHRvIHBhc3NpbmcgaXQgZGlyZWN0bHkgaW4gdGhlIGV2ZW50LCBidXQgdGhlIEpTT04gZW5jb2RlIHdvdWxkIGRyb3Aga2V5cyB3aXRoXG4gICAgICAgIC8vIHVuZGVmaW5lZCB2YWx1ZXMuXG4gICAgICAgIF90YXJnZXQ6IG9wdHMuX3RhcmdldCB8fCBcInVuZGVmaW5lZFwiLFxuICAgICAgICAuLi5tZXRhLFxuICAgICAgfSxcbiAgICAgIHVwbG9hZHM6IHVwbG9hZHMsXG4gICAgICBjaWQ6IGNpZCxcbiAgICB9O1xuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIFwiZXZlbnRcIiwgZXZlbnQpXG4gICAgICAudGhlbigoeyByZXNwIH0pID0+IHtcbiAgICAgICAgaWYgKERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmIERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCkpIHtcbiAgICAgICAgICAvLyB0aGUgZWxlbWVudCBjb3VsZCBiZSBpbnNpZGUgYSBsb2NrZWQgcGFyZW50IGZvciBvdGhlciB1bnJlbGF0ZWQgY2hhbmdlcztcbiAgICAgICAgICAvLyB3ZSBjYW4gb25seSBzdGFydCB1cGxvYWRzIHdoZW4gdGhlIHRyZWUgaXMgdW5sb2NrZWQgYW5kIHRoZVxuICAgICAgICAgIC8vIG5lY2Vzc2FyeSBkYXRhIGF0dHJpYnV0ZXMgYXJlIHNldCBpbiB0aGUgcmVhbCBET01cbiAgICAgICAgICBFbGVtZW50UmVmLm9uVW5sb2NrKGlucHV0RWwsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICAgICAgICAgIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCwgW2lucHV0RWwuZm9ybV0pO1xuICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVzKFxuICAgICAgICAgICAgICAgIGlucHV0RWwuZm9ybSxcbiAgICAgICAgICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgICAgICAgICB0YXJnZXRDdHgsXG4gICAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgICAgIGNpZCxcbiAgICAgICAgICAgICAgICAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHJlc3ApO1xuICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQXdhaXRpbmdTdWJtaXQoaW5wdXRFbC5mb3JtLCBwaHhFdmVudCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGlucHV0IGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICB0cmlnZ2VyQXdhaXRpbmdTdWJtaXQoZm9ybUVsLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGF3YWl0aW5nU3VibWl0ID0gdGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKTtcbiAgICBpZiAoYXdhaXRpbmdTdWJtaXQpIHtcbiAgICAgIGNvbnN0IFtfZWwsIF9yZWYsIF9vcHRzLCBjYWxsYmFja10gPSBhd2FpdGluZ1N1Ym1pdDtcbiAgICAgIHRoaXMuY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVN1Ym1pdHMuZmluZCgoW2VsLCBfcmVmLCBfb3B0cywgX2NhbGxiYWNrXSkgPT5cbiAgICAgIGVsLmlzU2FtZU5vZGUoZm9ybUVsKSxcbiAgICApO1xuICB9XG5cbiAgc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuZ2V0U2NoZWR1bGVkU3VibWl0KGZvcm1FbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmZvcm1TdWJtaXRzLnB1c2goW2Zvcm1FbCwgcmVmLCBvcHRzLCBjYWxsYmFja10pO1xuICB9XG5cbiAgY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpIHtcbiAgICB0aGlzLmZvcm1TdWJtaXRzID0gdGhpcy5mb3JtU3VibWl0cy5maWx0ZXIoXG4gICAgICAoW2VsLCByZWYsIF9vcHRzLCBfY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgIGlmIChlbC5pc1NhbWVOb2RlKGZvcm1FbCkpIHtcbiAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgZGlzYWJsZUZvcm0oZm9ybUVsLCBwaHhFdmVudCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZmlsdGVySWdub3JlZCA9IChlbCkgPT4ge1xuICAgICAgY29uc3QgdXNlcklnbm9yZWQgPSBjbG9zZXN0UGh4QmluZGluZyhcbiAgICAgICAgZWwsXG4gICAgICAgIGAke3RoaXMuYmluZGluZyhQSFhfVVBEQVRFKX09aWdub3JlYCxcbiAgICAgICAgZWwuZm9ybSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gIShcbiAgICAgICAgdXNlcklnbm9yZWQgfHwgY2xvc2VzdFBoeEJpbmRpbmcoZWwsIFwiZGF0YS1waHgtdXBkYXRlPWlnbm9yZVwiLCBlbC5mb3JtKVxuICAgICAgKTtcbiAgICB9O1xuICAgIGNvbnN0IGZpbHRlckRpc2FibGVzID0gKGVsKSA9PiB7XG4gICAgICByZXR1cm4gZWwuaGFzQXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKSk7XG4gICAgfTtcbiAgICBjb25zdCBmaWx0ZXJCdXR0b24gPSAoZWwpID0+IGVsLnRhZ05hbWUgPT0gXCJCVVRUT05cIjtcblxuICAgIGNvbnN0IGZpbHRlcklucHV0ID0gKGVsKSA9PlxuICAgICAgW1wiSU5QVVRcIiwgXCJURVhUQVJFQVwiLCBcIlNFTEVDVFwiXS5pbmNsdWRlcyhlbC50YWdOYW1lKTtcblxuICAgIGNvbnN0IGZvcm1FbGVtZW50cyA9IEFycmF5LmZyb20oZm9ybUVsLmVsZW1lbnRzKTtcbiAgICBjb25zdCBkaXNhYmxlcyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVyRGlzYWJsZXMpO1xuICAgIGNvbnN0IGJ1dHRvbnMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckJ1dHRvbikuZmlsdGVyKGZpbHRlcklnbm9yZWQpO1xuICAgIGNvbnN0IGlucHV0cyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVySW5wdXQpLmZpbHRlcihmaWx0ZXJJZ25vcmVkKTtcblxuICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgYnV0dG9uLmRpc2FibGVkKTtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZLCBpbnB1dC5yZWFkT25seSk7XG4gICAgICBpbnB1dC5yZWFkT25seSA9IHRydWU7XG4gICAgICBpZiAoaW5wdXQuZmlsZXMpIHtcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgaW5wdXQuZGlzYWJsZWQpO1xuICAgICAgICBpbnB1dC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZm9ybUVscyA9IGRpc2FibGVzXG4gICAgICAuY29uY2F0KGJ1dHRvbnMpXG4gICAgICAuY29uY2F0KGlucHV0cylcbiAgICAgIC5tYXAoKGVsKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGVsLCBsb2FkaW5nOiB0cnVlLCBsb2NrOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgIC8vIHdlIHJldmVyc2UgdGhlIG9yZGVyIHNvIGZvcm0gY2hpbGRyZW4gYXJlIGFscmVhZHkgbG9ja2VkIGJ5IHRoZSB0aW1lXG4gICAgLy8gdGhlIGZvcm0gaXMgbG9ja2VkXG4gICAgY29uc3QgZWxzID0gW3sgZWw6IGZvcm1FbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogZmFsc2UgfV1cbiAgICAgIC5jb25jYXQoZm9ybUVscylcbiAgICAgIC5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIHRoaXMucHV0UmVmKGVscywgcGh4RXZlbnQsIFwic3VibWl0XCIsIG9wdHMpO1xuICB9XG5cbiAgcHVzaEZvcm1TdWJtaXQoZm9ybUVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBzdWJtaXR0ZXIsIG9wdHMsIG9uUmVwbHkpIHtcbiAgICBjb25zdCByZWZHZW5lcmF0b3IgPSAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgdGhpcy5kaXNhYmxlRm9ybShmb3JtRWwsIHBoeEV2ZW50LCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGZvcm06IGZvcm1FbCxcbiAgICAgICAgcGF5bG9hZDogbWF5YmVQYXlsb2FkPy5wYXlsb2FkLFxuICAgICAgICBzdWJtaXR0ZXI6IHN1Ym1pdHRlcixcbiAgICAgIH0pO1xuICAgIC8vIHN0b3JlIHRoZSBzdWJtaXR0ZXIgaW4gdGhlIGZvcm0gZWxlbWVudCBpbiBvcmRlciB0byB0cmlnZ2VyIGl0XG4gICAgLy8gZm9yIHBoeC10cmlnZ2VyLWFjdGlvblxuICAgIERPTS5wdXRQcml2YXRlKGZvcm1FbCwgXCJzdWJtaXR0ZXJcIiwgc3VibWl0dGVyKTtcbiAgICBjb25zdCBjaWQgPSB0aGlzLnRhcmdldENvbXBvbmVudElEKGZvcm1FbCwgdGFyZ2V0Q3R4KTtcbiAgICBpZiAoTGl2ZVVwbG9hZGVyLmhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkpIHtcbiAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwdXNoID0gKCkgPT5cbiAgICAgICAgdGhpcy5wdXNoRm9ybVN1Ym1pdChcbiAgICAgICAgICBmb3JtRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIHBoeEV2ZW50LFxuICAgICAgICAgIHN1Ym1pdHRlcixcbiAgICAgICAgICBvcHRzLFxuICAgICAgICAgIG9uUmVwbHksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVN1Ym1pdChmb3JtRWwsIHJlZiwgb3B0cywgcHVzaCk7XG4gICAgfSBlbHNlIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbcmVmLCBlbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwcm94eVJlZkdlbiA9ICgpID0+IFtyZWYsIGVscywgb3B0c107XG4gICAgICB0aGlzLnVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIChfdXBsb2FkcykgPT4ge1xuICAgICAgICAvLyBpZiB3ZSBzdGlsbCBoYXZpbmcgcGVuZGluZyBwcmVmbGlnaHRzIGl0IG1lYW5zIHdlIGhhdmUgaW52YWxpZCBlbnRyaWVzXG4gICAgICAgIC8vIGFuZCB0aGUgcGh4LXN1Ym1pdCBjYW5ub3QgYmUgY29tcGxldGVkXG4gICAgICAgIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoZm9ybUVsLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwsIHsgc3VibWl0dGVyIH0pO1xuICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocHJveHlSZWZHZW4sIFwiZXZlbnRcIiwge1xuICAgICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICAgICAgbWV0YTogbWV0YSxcbiAgICAgICAgICBjaWQ6IGNpZCxcbiAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigoeyByZXNwIH0pID0+IG9uUmVwbHkocmVzcCkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICEoXG4gICAgICAgIGZvcm1FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpICYmXG4gICAgICAgIGZvcm1FbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmV4dHJhY3RNZXRhKGZvcm1FbCwge30sIG9wdHMudmFsdWUpO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGZvcm1FbCwgeyBzdWJtaXR0ZXIgfSk7XG4gICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocmVmR2VuZXJhdG9yLCBcImV2ZW50XCIsIHtcbiAgICAgICAgdHlwZTogXCJmb3JtXCIsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgICBtZXRhOiBtZXRhLFxuICAgICAgICBjaWQ6IGNpZCxcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4gb25SZXBseShyZXNwKSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgIH1cbiAgfVxuXG4gIHVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIG9uQ29tcGxldGUpIHtcbiAgICBjb25zdCBqb2luQ291bnRBdFVwbG9hZCA9IHRoaXMuam9pbkNvdW50O1xuICAgIGNvbnN0IGlucHV0RWxzID0gTGl2ZVVwbG9hZGVyLmFjdGl2ZUZpbGVJbnB1dHMoZm9ybUVsKTtcbiAgICBsZXQgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPSBpbnB1dEVscy5sZW5ndGg7XG5cbiAgICAvLyBnZXQgZWFjaCBmaWxlIGlucHV0XG4gICAgaW5wdXRFbHMuZm9yRWFjaCgoaW5wdXRFbCkgPT4ge1xuICAgICAgY29uc3QgdXBsb2FkZXIgPSBuZXcgTGl2ZVVwbG9hZGVyKGlucHV0RWwsIHRoaXMsICgpID0+IHtcbiAgICAgICAgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKG51bUZpbGVJbnB1dHNJblByb2dyZXNzID09PSAwKSB7XG4gICAgICAgICAgb25Db21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW50cmllcyA9IHVwbG9hZGVyXG4gICAgICAgIC5lbnRyaWVzKClcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnRvUHJlZmxpZ2h0UGF5bG9hZCgpKTtcblxuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG51bUZpbGVJbnB1dHNJblByb2dyZXNzLS07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgcmVmOiBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJpZXM6IGVudHJpZXMsXG4gICAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmxvZyhcInVwbG9hZFwiLCAoKSA9PiBbXCJzZW5kaW5nIHByZWZsaWdodCByZXF1ZXN0XCIsIHBheWxvYWRdKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiYWxsb3dfdXBsb2FkXCIsIHBheWxvYWQpXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtcImdvdCBwcmVmbGlnaHQgcmVzcG9uc2VcIiwgcmVzcF0pO1xuICAgICAgICAgIC8vIHRoZSBwcmVmbGlnaHQgd2lsbCByZWplY3QgZW50cmllcyBiZXlvbmQgdGhlIG1heCBlbnRyaWVzXG4gICAgICAgICAgLy8gc28gd2UgZXJyb3IgYW5kIGNhbmNlbCBlbnRyaWVzIG9uIHRoZSBjbGllbnQgdGhhdCBhcmUgbWlzc2luZyBmcm9tIHRoZSByZXNwb25zZVxuICAgICAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3AuZW50cmllcyAmJiAhcmVzcC5lbnRyaWVzW2VudHJ5LnJlZl0pIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodChcbiAgICAgICAgICAgICAgICBlbnRyeS5yZWYsXG4gICAgICAgICAgICAgICAgXCJmYWlsZWQgcHJlZmxpZ2h0XCIsXG4gICAgICAgICAgICAgICAgdXBsb2FkZXIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gZm9yIGF1dG8gdXBsb2Fkcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgZW50cmllcyByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAvLyBmb3IgZm9ybSBzdWJtaXRzIHRoYXQgY29udGFpbiBpbnZhbGlkIGVudHJpZXNcbiAgICAgICAgICBpZiAocmVzcC5lcnJvciB8fCBPYmplY3Qua2V5cyhyZXNwLmVudHJpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy51bmRvUmVmcyhyZWYsIHBoeEV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3AuZXJyb3IgfHwgW107XG4gICAgICAgICAgICBlcnJvcnMubWFwKChbZW50cnlfcmVmLCByZWFzb25dKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmFpbGVkRW50cnlQcmVmbGlnaHQoZW50cnlfcmVmLCByZWFzb24sIHVwbG9hZGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvbkVycm9yID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5qb2luQ291bnQgPT09IGpvaW5Db3VudEF0VXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdXBsb2FkZXIuaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgdGhpcy5saXZlU29ja2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKFwiRmFpbGVkIHRvIHB1c2ggdXBsb2FkXCIsIGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodCh1cGxvYWRSZWYsIHJlYXNvbiwgdXBsb2FkZXIpIHtcbiAgICBpZiAodXBsb2FkZXIuaXNBdXRvVXBsb2FkKCkpIHtcbiAgICAgIC8vIHVwbG9hZFJlZiBtYXkgYmUgdG9wIGxldmVsIHVwbG9hZCBjb25maWcgcmVmIG9yIGVudHJ5IHJlZlxuICAgICAgY29uc3QgZW50cnkgPSB1cGxvYWRlclxuICAgICAgICAuZW50cmllcygpXG4gICAgICAgIC5maW5kKChlbnRyeSkgPT4gZW50cnkucmVmID09PSB1cGxvYWRSZWYudG9TdHJpbmcoKSk7XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5jYW5jZWwoKSk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtgZXJyb3IgZm9yIGVudHJ5ICR7dXBsb2FkUmVmfWAsIHJlYXNvbl0pO1xuICB9XG5cbiAgZGlzcGF0Y2hVcGxvYWRzKHRhcmdldEN0eCwgbmFtZSwgZmlsZXNPckJsb2JzKSB7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHRoaXMudGFyZ2V0Q3R4RWxlbWVudCh0YXJnZXRDdHgpIHx8IHRoaXMuZWw7XG4gICAgY29uc3QgaW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHModGFyZ2V0RWxlbWVudCkuZmlsdGVyKFxuICAgICAgKGVsKSA9PiBlbC5uYW1lID09PSBuYW1lLFxuICAgICk7XG4gICAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0Vycm9yKGBubyBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dHMubGVuZ3RoID4gMSkge1xuICAgICAgbG9nRXJyb3IoYGR1cGxpY2F0ZSBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KGlucHV0c1swXSwgUEhYX1RSQUNLX1VQTE9BRFMsIHtcbiAgICAgICAgZGV0YWlsOiB7IGZpbGVzOiBmaWxlc09yQmxvYnMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRhcmdldEN0eEVsZW1lbnQodGFyZ2V0Q3R4KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIGNvbnN0IFt0YXJnZXRdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmlkLCB0YXJnZXRDdHgpO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2UgaWYgKHRhcmdldEN0eCkge1xuICAgICAgcmV0dXJuIHRhcmdldEN0eDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVzaEZvcm1SZWNvdmVyeShvbGRGb3JtLCBuZXdGb3JtLCB0ZW1wbGF0ZURvbSwgY2FsbGJhY2spIHtcbiAgICAvLyB3ZSBhcmUgb25seSByZWNvdmVyaW5nIGZvcm1zIGluc2lkZSB0aGUgY3VycmVudCB2aWV3LCB0aGVyZWZvcmUgaXQgaXMgc2FmZSB0b1xuICAgIC8vIHNraXAgd2l0aGluT3duZXJzIGhlcmUgYW5kIGFsd2F5cyB1c2UgdGhpcyB3aGVuIHJlZmVycmluZyB0byB0aGUgdmlld1xuICAgIGNvbnN0IHBoeENoYW5nZSA9IHRoaXMuYmluZGluZyhcImNoYW5nZVwiKTtcbiAgICBjb25zdCBwaHhUYXJnZXQgPSBuZXdGb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpIHx8IG5ld0Zvcm07XG4gICAgY29uc3QgcGh4RXZlbnQgPVxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9BVVRPX1JFQ09WRVIpKSB8fFxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICBjb25zdCBpbnB1dHMgPSBBcnJheS5mcm9tKG9sZEZvcm0uZWxlbWVudHMpLmZpbHRlcihcbiAgICAgIChlbCkgPT4gRE9NLmlzRm9ybUlucHV0KGVsKSAmJiBlbC5uYW1lICYmICFlbC5oYXNBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICApO1xuICAgIGlmIChpbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG11c3QgY2xlYXIgdHJhY2tlZCB1cGxvYWRzIGJlZm9yZSByZWNvdmVyeSBhcyB0aGV5IG5vIGxvbmdlciBoYXZlIHZhbGlkIHJlZnNcbiAgICBpbnB1dHMuZm9yRWFjaChcbiAgICAgIChpbnB1dCkgPT5cbiAgICAgICAgaW5wdXQuaGFzQXR0cmlidXRlKFBIWF9VUExPQURfUkVGKSAmJiBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyhpbnB1dCksXG4gICAgKTtcbiAgICAvLyBwdXNoSW5wdXQgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGEgc291cmNlIGVsZW1lbnQgdGhhdCBpbml0aWF0ZWQgdGhlIGNoYW5nZTtcbiAgICAvLyBiZWNhdXNlIHRoaXMgaXMgbm90IHRoZSBjYXNlIHdoZW4gd2UgcmVjb3ZlciBmb3Jtcywgd2UgcHJvdmlkZSB0aGUgZmlyc3QgaW5wdXQgd2UgZmluZFxuICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzLmZpbmQoKGVsKSA9PiBlbC50eXBlICE9PSBcImhpZGRlblwiKSB8fCBpbnB1dHNbMF07XG5cbiAgICAvLyBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSB0YXJnZXRzLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVjb3ZlcnkgZXZlbnRzXG4gICAgLy8gYW5kIG9ubHkgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBhbGwgZXZlbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWRcbiAgICBsZXQgcGVuZGluZyA9IDA7XG4gICAgLy8gd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20sIHZpZXdFbClcbiAgICB0aGlzLndpdGhpblRhcmdldHMoXG4gICAgICBwaHhUYXJnZXQsXG4gICAgICAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQobmV3Rm9ybSwgdGFyZ2V0Q3R4KTtcbiAgICAgICAgcGVuZGluZysrO1xuICAgICAgICBsZXQgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpmb3JtLXJlY292ZXJ5XCIsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgc291cmNlRWxlbWVudDogb2xkRm9ybSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdGhpcywgaW5wdXQsIFtcbiAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfdGFyZ2V0OiBpbnB1dC5uYW1lLFxuICAgICAgICAgICAgdGFyZ2V0VmlldyxcbiAgICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICAgIG5ld0NpZDogY2lkLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgcGVuZGluZy0tO1xuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICB9LFxuICAgICAgdGVtcGxhdGVEb20sXG4gICAgKTtcbiAgfVxuXG4gIHB1c2hMaW5rUGF0Y2goZSwgaHJlZiwgdGFyZ2V0RWwsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgbGlua1JlZiA9IHRoaXMubGl2ZVNvY2tldC5zZXRQZW5kaW5nTGluayhocmVmKTtcbiAgICAvLyBvbmx5IGFkZCBsb2FkaW5nIHN0YXRlcyBpZiBldmVudCBpcyB0cnVzdGVkIChpdCB3YXMgdHJpZ2dlcmVkIGJ5IHVzZXIsIHN1Y2ggYXMgY2xpY2spIGFuZFxuICAgIC8vIGl0J3Mgbm90IGEgZm9yd2FyZC9iYWNrIG5hdmlnYXRpb24gZnJvbSBwb3BzdGF0ZVxuICAgIGNvbnN0IGxvYWRpbmcgPSBlLmlzVHJ1c3RlZCAmJiBlLnR5cGUgIT09IFwicG9wc3RhdGVcIjtcbiAgICBjb25zdCByZWZHZW4gPSB0YXJnZXRFbFxuICAgICAgPyAoKSA9PlxuICAgICAgICAgIHRoaXMucHV0UmVmKFxuICAgICAgICAgICAgW3sgZWw6IHRhcmdldEVsLCBsb2FkaW5nOiBsb2FkaW5nLCBsb2NrOiB0cnVlIH1dLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZmFsbGJhY2sgPSAoKSA9PiB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3Qod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGNvbnN0IHVybCA9IGhyZWYuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7bG9jYXRpb24ucHJvdG9jb2x9Ly8ke2xvY2F0aW9uLmhvc3R9JHtocmVmfWBcbiAgICAgIDogaHJlZjtcblxuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW4sIFwibGl2ZV9wYXRjaFwiLCB7IHVybCB9KS50aGVuKFxuICAgICAgKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICBpZiAocmVzcC5saW5rX3JlZGlyZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVwbGFjZU1haW4oaHJlZiwgbnVsbCwgY2FsbGJhY2ssIGxpbmtSZWYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saXZlU29ja2V0LmNvbW1pdFBlbmRpbmdMaW5rKGxpbmtSZWYpKSB7XG4gICAgICAgICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGxpbmtSZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgKHsgZXJyb3I6IF9lcnJvciwgdGltZW91dDogX3RpbWVvdXQgfSkgPT4gZmFsbGJhY2soKSxcbiAgICApO1xuICB9XG5cbiAgZ2V0Rm9ybXNGb3JSZWNvdmVyeSgpIHtcbiAgICAvLyBGb3JtIHJlY292ZXJ5IGlzIGNvbXBsZXggaW4gTGl2ZVZpZXc6XG4gICAgLy8gV2Ugd2FudCB0byBzdXBwb3J0IG5lc3RlZCBMaXZlVmlld3MgYW5kIGFsc28gcHJvdmlkZSBhIGdvb2QgdXNlciBleHBlcmllbmNlLlxuICAgIC8vIFRoZXJlZm9yZSwgd2hlbiB0aGUgY2hhbm5lbCByZWpvaW5zLCB3ZSBjb3B5IGFsbCBmb3JtcyB0aGF0IGFyZSBlbGlnaWJsZSBmb3JcbiAgICAvLyByZWNvdmVyeSB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGVtIGxhdGVyLlxuICAgIC8vIFdoeSBkbyB3ZSBuZWVkIHRvIGNvcHkgdGhlbT8gQmVjYXVzZSB3aGVuIHRoZSBtYWluIExpdmVWaWV3IGpvaW5zLCBhbnkgZm9ybXNcbiAgICAvLyBpbiBuZXN0ZWQgTGl2ZVZpZXdzIHdvdWxkIGJlIGxvc3QuXG4gICAgLy9cbiAgICAvLyBXZSBzaG91bGQgcmV3b3JrIHRoaXMgaW4gdGhlIGZ1dHVyZSB0byBzZXJpYWxpemUgdGhlIGZvcm0gcGF5bG9hZCBoZXJlXG4gICAgLy8gaW5zdGVhZCBvZiBjbG9uaW5nIHRoZSBET00gbm9kZXMsIGJ1dCBtYWtpbmcgdGhpcyB3b3JrIGNvcnJlY3RseSBpcyB0ZWRpb3VzLFxuICAgIC8vIGFzIHNlbmRpbmcgdGhlIGNvcnJlY3QgZm9ybSBwYXlsb2FkIHJlbGllcyBvbiBKUy5wdXNoIHRvIGV4dHJhY3QgdmFsdWVzXG4gICAgLy8gZnJvbSBKUyBjb21tYW5kcyAocGh4LWNoYW5nZT17SlMucHVzaChcImV2ZW50XCIsIHZhbHVlOiAuLi4sIHRhcmdldDogLi4uKX0pLFxuICAgIC8vIGFzIHdlbGwgYXMgdmlldy5wdXNoSW5wdXQsIHdoaWNoIGV4cGVjdHMgRE9NIGVsZW1lbnRzLlxuXG4gICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuXG4gICAgcmV0dXJuIERPTS5hbGwoXG4gICAgICBkb2N1bWVudCxcbiAgICAgIGAjJHtDU1MuZXNjYXBlKHRoaXMuaWQpfSBmb3JtWyR7cGh4Q2hhbmdlfV0sIFske1BIWF9URUxFUE9SVEVEX1JFRn09XCIke0NTUy5lc2NhcGUodGhpcy5pZCl9XCJdIGZvcm1bJHtwaHhDaGFuZ2V9XWAsXG4gICAgKVxuICAgICAgLmZpbHRlcigoZm9ybSkgPT4gZm9ybS5pZClcbiAgICAgIC5maWx0ZXIoKGZvcm0pID0+IGZvcm0uZWxlbWVudHMubGVuZ3RoID4gMClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChmb3JtKSA9PlxuICAgICAgICAgIGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgIT09IFwiaWdub3JlXCIsXG4gICAgICApXG4gICAgICAubWFwKChmb3JtKSA9PiB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgdGhlIHdob2xlIGZvcm0sIGFzIHJlbHlpbmcgb24gZm9ybS5lbGVtZW50cyBjYW4gbGVhZCB0b1xuICAgICAgICAvLyBzaXR1YXRpb25zIHdoZXJlIHdlIGhhdmVcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICA8Zm9ybT48ZmllbGRzZXQgZGlzYWJsZWQ+PGlucHV0IG5hbWU9XCJmb29cIiB2YWx1ZT1cImJhclwiPjwvZmllbGRzZXQ+PC9mb3JtPlxuICAgICAgICAvL1xuICAgICAgICAvLyBhbmQgZm9ybS5lbGVtZW50cyByZXR1cm5zIGJvdGggdGhlIGZpZWxkc2V0IGFuZCB0aGUgaW5wdXQgc2VwYXJhdGVseS5cbiAgICAgICAgLy8gQmVjYXVzZSB0aGUgZmllbGRzZXQgaXMgZGlzYWJsZWQsIHRoZSBpbnB1dCBzaG91bGQgTk9UIGJlIHNlbnQgdGhvdWdoLlxuICAgICAgICAvLyBXZSBjYW4gb25seSByZWxpYWJseSBzZXJpYWxpemUgdGhlIGZvcm0gYnkgY2xvbmluZyBpdCBmdWxseS5cbiAgICAgICAgY29uc3QgY2xvbmVkRm9ybSA9IGZvcm0uY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAvLyB3ZSBjYWxsIG1vcnBoZG9tIHRvIGNvcHkgYW55IHNwZWNpYWwgc3RhdGVcbiAgICAgICAgLy8gbGlrZSB0aGUgc2VsZWN0ZWQgb3B0aW9uIG9mIGEgPHNlbGVjdD4gZWxlbWVudDtcbiAgICAgICAgLy8gYW55IGFsc28gY29weSBvdmVyIHByaXZhdGVzICh3aGljaCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRvdWNoZWQgZmllbGRzKVxuICAgICAgICBtb3JwaGRvbShjbG9uZWRGb3JtLCBmb3JtLCB7XG4gICAgICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgICAgIERPTS5jb3B5UHJpdmF0ZXMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBuZXh0IHVwLCB3ZSBhbHNvIG5lZWQgdG8gY2xvbmUgYW55IGVsZW1lbnRzIHdpdGggZm9ybT1cImlkXCIgcGFyYW1ldGVyXG4gICAgICAgIGNvbnN0IGV4dGVybmFsRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgIGBbZm9ybT1cIiR7Zm9ybS5pZH1cIl1gLFxuICAgICAgICApO1xuICAgICAgICBBcnJheS5mcm9tKGV4dGVybmFsRWxlbWVudHMpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGZvcm0uY29udGFpbnMoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNsb25lZEVsID0gZWwuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgIG1vcnBoZG9tKGNsb25lZEVsLCBlbCk7XG4gICAgICAgICAgRE9NLmNvcHlQcml2YXRlcyhjbG9uZWRFbCwgZWwpO1xuICAgICAgICAgIGNsb25lZEZvcm0uYXBwZW5kQ2hpbGQoY2xvbmVkRWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsb25lZEZvcm07XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgoYWNjLCBmb3JtKSA9PiB7XG4gICAgICAgIGFjY1tmb3JtLmlkXSA9IGZvcm07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gIH1cblxuICBtYXliZVB1c2hDb21wb25lbnRzRGVzdHJveWVkKGRlc3Ryb3llZENJRHMpIHtcbiAgICBsZXQgd2lsbERlc3Ryb3lDSURzID0gZGVzdHJveWVkQ0lEcy5maWx0ZXIoKGNpZCkgPT4ge1xuICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbkVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGNvbXBvbmVudHMgZGVzdHJveWVkXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHdpbGxEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyB3ZSBtdXN0IHJlc2V0IHRoZSByZW5kZXIgY2hhbmdlIHRyYWNraW5nIGZvciBjaWRzIHRoYXRcbiAgICAgIC8vIGNvdWxkIGJlIGFkZGVkIGJhY2sgZnJvbSB0aGUgc2VydmVyIHNvIHdlIGRvbid0IHNraXAgdGhlbVxuICAgICAgd2lsbERlc3Ryb3lDSURzLmZvckVhY2goKGNpZCkgPT4gdGhpcy5yZW5kZXJlZC5yZXNldFJlbmRlcihjaWQpKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiY2lkc193aWxsX2Rlc3Ryb3lcIiwgeyBjaWRzOiB3aWxsRGVzdHJveUNJRHMgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgcGVuZGluZyB0cmFuc2l0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUgZGV0ZXJtaW5pbmdcbiAgICAgICAgICAvLyBpZiB0aGUgY2lkcyB3ZXJlIGFkZGVkIGJhY2sgdG8gdGhlIERPTSBpbiB0aGUgbWVhbnRpbWUgKCMzMTM5KVxuICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFNlZSBpZiBhbnkgb2YgdGhlIGNpZHMgd2Ugd2FudGVkIHRvIGRlc3Ryb3kgd2VyZSBhZGRlZCBiYWNrLFxuICAgICAgICAgICAgLy8gaWYgdGhleSB3ZXJlIGFkZGVkIGJhY2ssIHdlIGRvbid0IGFjdHVhbGx5IGRlc3Ryb3kgdGhlbS5cbiAgICAgICAgICAgIGxldCBjb21wbGV0ZWx5RGVzdHJveUNJRHMgPSB3aWxsRGVzdHJveUNJRHMuZmlsdGVyKChjaWQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGNvbXBsZXRlbHlEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImNpZHNfZGVzdHJveWVkXCIsIHtcbiAgICAgICAgICAgICAgICBjaWRzOiBjb21wbGV0ZWx5RGVzdHJveUNJRHMsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLnBydW5lQ0lEcyhyZXNwLmNpZHMpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKG9uRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gob25FcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3duc0VsZW1lbnQoZWwpIHtcbiAgICBsZXQgcGFyZW50Vmlld0VsID0gRE9NLmNsb3Nlc3RWaWV3RWwoZWwpO1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRCkgPT09IHRoaXMuaWQgfHxcbiAgICAgIChwYXJlbnRWaWV3RWwgJiYgcGFyZW50Vmlld0VsLmlkID09PSB0aGlzLmlkKSB8fFxuICAgICAgKCFwYXJlbnRWaWV3RWwgJiYgdGhpcy5pc0RlYWQpXG4gICAgKTtcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgc3VibWl0dGVyLCBvcHRzID0ge30pIHtcbiAgICBET00ucHV0UHJpdmF0ZShmb3JtLCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSk7XG4gICAgY29uc3QgaW5wdXRzID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKTtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSkpO1xuICAgIHRoaXMubGl2ZVNvY2tldC5ibHVyQWN0aXZlRWxlbWVudCh0aGlzKTtcbiAgICB0aGlzLnB1c2hGb3JtU3VibWl0KGZvcm0sIHRhcmdldEN0eCwgcGh4RXZlbnQsIHN1Ym1pdHRlciwgb3B0cywgKCkgPT4ge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGJpbmRpbmcoa2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhraW5kKTtcbiAgfVxuXG4gIC8vIHBoeC1wb3J0YWxcbiAgcHVzaFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5hZGQoaWQpO1xuICB9XG5cbiAgZHJvcFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5kZWxldGUoaWQpO1xuICB9XG5cbiAgZGVzdHJveVBvcnRhbEVsZW1lbnRzKCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBCSU5ESU5HX1BSRUZJWCxcbiAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgREVGQVVMVFMsXG4gIEZBSUxTQUZFX0pJVFRFUixcbiAgTE9BREVSX1RJTUVPVVQsXG4gIERJU0NPTk5FQ1RFRF9USU1FT1VULFxuICBNQVhfUkVMT0FEUyxcbiAgUEhYX0RFQk9VTkNFLFxuICBQSFhfRFJPUF9UQVJHRVQsXG4gIFBIWF9IQVNfRk9DVVNFRCxcbiAgUEhYX0tFWSxcbiAgUEhYX0xJTktfU1RBVEUsXG4gIFBIWF9MSVZFX0xJTkssXG4gIFBIWF9MVl9ERUJVRyxcbiAgUEhYX0xWX0xBVEVOQ1lfU0lNLFxuICBQSFhfTFZfUFJPRklMRSxcbiAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gIFBIWF9NQUlOLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9USFJPVFRMRSxcbiAgUEhYX1RSQUNLX1VQTE9BRFMsXG4gIFBIWF9TRVNTSU9OLFxuICBSRUxPQURfSklUVEVSX01JTixcbiAgUkVMT0FEX0pJVFRFUl9NQVgsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVMT0FEX1NUQVRVUyxcbiAgUEhYX1JVTlRJTUVfSE9PSyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgY2xvc3VyZSxcbiAgZGVidWcsXG4gIG1heWJlLFxuICBsb2dFcnJvcixcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBIb29rcyBmcm9tIFwiLi9ob29rc1wiO1xuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5pbXBvcnQgSlMgZnJvbSBcIi4vanNcIjtcbmltcG9ydCBqc0NvbW1hbmRzIGZyb20gXCIuL2pzX2NvbW1hbmRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VzZWRJbnB1dCA9IChlbCkgPT4gRE9NLmlzVXNlZElucHV0KGVsKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKHVybCwgcGh4U29ja2V0LCBvcHRzID0ge30pIHtcbiAgICB0aGlzLnVubG9hZGVkID0gZmFsc2U7XG4gICAgaWYgKCFwaHhTb2NrZXQgfHwgcGh4U29ja2V0LmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICBhIHBob2VuaXggU29ja2V0IG11c3QgYmUgcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgTGl2ZVNvY2tldCBjb25zdHJ1Y3Rvci4gRm9yIGV4YW1wbGU6XG5cbiAgICAgICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxuICAgICAgICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICAgICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnNvY2tldCA9IG5ldyBwaHhTb2NrZXQodXJsLCBvcHRzKTtcbiAgICB0aGlzLmJpbmRpbmdQcmVmaXggPSBvcHRzLmJpbmRpbmdQcmVmaXggfHwgQklORElOR19QUkVGSVg7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUob3B0cy5wYXJhbXMgfHwge30pO1xuICAgIHRoaXMudmlld0xvZ2dlciA9IG9wdHMudmlld0xvZ2dlcjtcbiAgICB0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzID0gb3B0cy5tZXRhZGF0YSB8fCB7fTtcbiAgICB0aGlzLmRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihjbG9uZShERUZBVUxUUyksIG9wdHMuZGVmYXVsdHMgfHwge30pO1xuICAgIHRoaXMucHJldkFjdGl2ZSA9IG51bGw7XG4gICAgdGhpcy5zaWxlbmNlZCA9IGZhbHNlO1xuICAgIHRoaXMubWFpbiA9IG51bGw7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgdGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5saW5rUmVmID0gMTtcbiAgICB0aGlzLnJvb3RzID0ge307XG4gICAgdGhpcy5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBjbG9uZSh3aW5kb3cubG9jYXRpb24pO1xuICAgIHRoaXMuaG9va3MgPSBvcHRzLmhvb2tzIHx8IHt9O1xuICAgIHRoaXMudXBsb2FkZXJzID0gb3B0cy51cGxvYWRlcnMgfHwge307XG4gICAgdGhpcy5sb2FkZXJUaW1lb3V0ID0gb3B0cy5sb2FkZXJUaW1lb3V0IHx8IExPQURFUl9USU1FT1VUO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZW91dCA9IG9wdHMuZGlzY29ubmVjdGVkVGltZW91dCB8fCBESVNDT05ORUNURURfVElNRU9VVDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gbnVsbDtcbiAgICB0aGlzLm1heFJlbG9hZHMgPSBvcHRzLm1heFJlbG9hZHMgfHwgTUFYX1JFTE9BRFM7XG4gICAgdGhpcy5yZWxvYWRKaXR0ZXJNaW4gPSBvcHRzLnJlbG9hZEppdHRlck1pbiB8fCBSRUxPQURfSklUVEVSX01JTjtcbiAgICB0aGlzLnJlbG9hZEppdHRlck1heCA9IG9wdHMucmVsb2FkSml0dGVyTWF4IHx8IFJFTE9BRF9KSVRURVJfTUFYO1xuICAgIHRoaXMuZmFpbHNhZmVKaXR0ZXIgPSBvcHRzLmZhaWxzYWZlSml0dGVyIHx8IEZBSUxTQUZFX0pJVFRFUjtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IG9wdHMubG9jYWxTdG9yYWdlIHx8IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgd2luZG93LnNlc3Npb25TdG9yYWdlO1xuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IGZhbHNlO1xuICAgIHRoaXMuYm91bmRFdmVudE5hbWVzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuYmxvY2tQaHhDaGFuZ2VXaGlsZUNvbXBvc2luZyA9XG4gICAgICBvcHRzLmJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3NpbmcgfHwgZmFsc2U7XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgdGhpcy5kb21DYWxsYmFja3MgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBqc1F1ZXJ5U2VsZWN0b3JBbGw6IG51bGwsXG4gICAgICAgIG9uUGF0Y2hTdGFydDogY2xvc3VyZSgpLFxuICAgICAgICBvblBhdGNoRW5kOiBjbG9zdXJlKCksXG4gICAgICAgIG9uTm9kZUFkZGVkOiBjbG9zdXJlKCksXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiBjbG9zdXJlKCksXG4gICAgICB9LFxuICAgICAgb3B0cy5kb20gfHwge30sXG4gICAgKTtcbiAgICB0aGlzLnRyYW5zaXRpb25zID0gbmV3IFRyYW5zaXRpb25TZXQoKTtcbiAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24gPVxuICAgICAgcGFyc2VJbnQodGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OKSkgfHwgMDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIChfZSkgPT4ge1xuICAgICAgdGhpcy51bmxvYWRlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVW5sb2FkZWQoKSkge1xuICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZSBhbmQgYnJvd3NlciBkb2VzIG5vdCBlbWl0IFwicGFnZXNob3dcIlxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBwdWJsaWNcblxuICB2ZXJzaW9uKCkge1xuICAgIHJldHVybiBMVl9WU047XG4gIH1cblxuICBpc1Byb2ZpbGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX1BST0ZJTEUpID09PSBcInRydWVcIjtcbiAgfVxuXG4gIGlzRGVidWdFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX0RFQlVHKSA9PT0gXCJ0cnVlXCI7XG4gIH1cblxuICBpc0RlYnVnRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfREVCVUcpID09PSBcImZhbHNlXCI7XG4gIH1cblxuICBlbmFibGVEZWJ1ZygpIHtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0RFQlVHLCBcInRydWVcIik7XG4gIH1cblxuICBlbmFibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9QUk9GSUxFLCBcInRydWVcIik7XG4gIH1cblxuICBkaXNhYmxlRGVidWcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9ERUJVRywgXCJmYWxzZVwiKTtcbiAgfVxuXG4gIGRpc2FibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9QUk9GSUxFKTtcbiAgfVxuXG4gIGVuYWJsZUxhdGVuY3lTaW0odXBwZXJCb3VuZE1zKSB7XG4gICAgdGhpcy5lbmFibGVEZWJ1ZygpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJsYXRlbmN5IHNpbXVsYXRvciBlbmFibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBicm93c2VyIHNlc3Npb24uIENhbGwgZGlzYWJsZUxhdGVuY3lTaW0oKSB0byBkaXNhYmxlXCIsXG4gICAgKTtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNLCB1cHBlckJvdW5kTXMpO1xuICB9XG5cbiAgZGlzYWJsZUxhdGVuY3lTaW0oKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSk7XG4gIH1cblxuICBnZXRMYXRlbmN5U2ltKCkge1xuICAgIGNvbnN0IHN0ciA9IHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfTEFURU5DWV9TSU0pO1xuICAgIHJldHVybiBzdHIgPyBwYXJzZUludChzdHIpIDogbnVsbDtcbiAgfVxuXG4gIGdldFNvY2tldCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ7XG4gIH1cblxuICBjb25uZWN0KCkge1xuICAgIC8vIGVuYWJsZSBkZWJ1ZyBieSBkZWZhdWx0IGlmIG9uIGxvY2FsaG9zdCBhbmQgbm90IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSBcImxvY2FsaG9zdFwiICYmICF0aGlzLmlzRGVidWdEaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLmVuYWJsZURlYnVnKCk7XG4gICAgfVxuICAgIGNvbnN0IGRvQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVzZXRSZWxvYWRTdGF0dXMoKTtcbiAgICAgIGlmICh0aGlzLmpvaW5Sb290Vmlld3MoKSkge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cygpO1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWFpbikge1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmpvaW5EZWFkVmlldygpO1xuICAgIH07XG4gICAgaWYgKFxuICAgICAgW1wiY29tcGxldGVcIiwgXCJsb2FkZWRcIiwgXCJpbnRlcmFjdGl2ZVwiXS5pbmRleE9mKGRvY3VtZW50LnJlYWR5U3RhdGUpID49IDBcbiAgICApIHtcbiAgICAgIGRvQ29ubmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiBkb0Nvbm5lY3QoKSk7XG4gICAgfVxuICB9XG5cbiAgZGlzY29ubmVjdChjYWxsYmFjaykge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lcik7XG4gICAgLy8gcmVtb3ZlIHRoZSBzb2NrZXQgY2xvc2UgbGlzdGVuZXIgdG8gYXZvaWQgdHJ5aW5nIHRvIGhhbmRsZVxuICAgIC8vIGEgc2VydmVyIGNsb3NlIGV2ZW50IHdoZW4gaXQgaXMgYWN0dWFsbHkgY2F1c2VkIGJ5IHVzIGRpc2Nvbm5lY3RpbmdcbiAgICBpZiAodGhpcy5zZXJ2ZXJDbG9zZVJlZikge1xuICAgICAgdGhpcy5zb2NrZXQub2ZmKHRoaXMuc2VydmVyQ2xvc2VSZWYpO1xuICAgICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0LmRpc2Nvbm5lY3QoY2FsbGJhY2spO1xuICB9XG5cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuc29ja2V0LnJlcGxhY2VUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgfVxuXG4gIGV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUgPSBudWxsKSB7XG4gICAgY29uc3QgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIsIHsgZGV0YWlsOiB7IHNvdXJjZUVsZW1lbnQ6IGVsIH0gfSk7XG4gICAgdGhpcy5vd25lcihlbCwgKHZpZXcpID0+IEpTLmV4ZWMoZSwgZXZlbnRUeXBlLCBlbmNvZGVkSlMsIHZpZXcsIGVsKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2pzX2NvbW1hbmRzXCIpLkxpdmVTb2NrZXRKU0NvbW1hbmRzfVxuICAgKi9cbiAganMoKSB7XG4gICAgcmV0dXJuIGpzQ29tbWFuZHModGhpcywgXCJqc1wiKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICB1bmxvYWQoKSB7XG4gICAgaWYgKHRoaXMudW5sb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWFpbiAmJiB0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgIHRoaXMubG9nKHRoaXMubWFpbiwgXCJzb2NrZXRcIiwgKCkgPT4gW1wiZGlzY29ubmVjdCBmb3IgcGFnZSBuYXZcIl0pO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3lBbGxWaWV3cygpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgdHJpZ2dlckRPTShraW5kLCBhcmdzKSB7XG4gICAgdGhpcy5kb21DYWxsYmFja3Nba2luZF0oLi4uYXJncyk7XG4gIH1cblxuICB0aW1lKG5hbWUsIGZ1bmMpIHtcbiAgICBpZiAoIXRoaXMuaXNQcm9maWxlRW5hYmxlZCgpIHx8ICFjb25zb2xlLnRpbWUpIHtcbiAgICAgIHJldHVybiBmdW5jKCk7XG4gICAgfVxuICAgIGNvbnNvbGUudGltZShuYW1lKTtcbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgY29uc29sZS50aW1lRW5kKG5hbWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBsb2codmlldywga2luZCwgbXNnQ2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy52aWV3TG9nZ2VyKSB7XG4gICAgICBjb25zdCBbbXNnLCBvYmpdID0gbXNnQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMudmlld0xvZ2dlcih2aWV3LCBraW5kLCBtc2csIG9iaik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IFttc2csIG9ial0gPSBtc2dDYWxsYmFjaygpO1xuICAgICAgZGVidWcodmlldywga2luZCwgbXNnLCBvYmopO1xuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RET01VcGRhdGUoY2FsbGJhY2spIHtcbiAgICB0aGlzLnRyYW5zaXRpb25zLmFmdGVyKGNhbGxiYWNrKTtcbiAgfVxuXG4gIGFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRBc3luY1RyYW5zaXRpb24ocHJvbWlzZSk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSk7XG4gIH1cblxuICBvbkNoYW5uZWwoY2hhbm5lbCwgZXZlbnQsIGNiKSB7XG4gICAgY2hhbm5lbC5vbihldmVudCwgKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGxhdGVuY3kgPSB0aGlzLmdldExhdGVuY3lTaW0oKTtcbiAgICAgIGlmICghbGF0ZW5jeSkge1xuICAgICAgICBjYihkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoZGF0YSksIGxhdGVuY3kpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkV2l0aEppdHRlcih2aWV3LCBsb2cpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGNvbnN0IG1pbk1zID0gdGhpcy5yZWxvYWRKaXR0ZXJNaW47XG4gICAgY29uc3QgbWF4TXMgPSB0aGlzLnJlbG9hZEppdHRlck1heDtcbiAgICBsZXQgYWZ0ZXJNcyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhNcyAtIG1pbk1zICsgMSkpICsgbWluTXM7XG4gICAgY29uc3QgdHJpZXMgPSBCcm93c2VyLnVwZGF0ZUxvY2FsKFxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UsXG4gICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICBDT05TRUNVVElWRV9SRUxPQURTLFxuICAgICAgMCxcbiAgICAgIChjb3VudCkgPT4gY291bnQgKyAxLFxuICAgICk7XG4gICAgaWYgKHRyaWVzID49IHRoaXMubWF4UmVsb2Fkcykge1xuICAgICAgYWZ0ZXJNcyA9IHRoaXMuZmFpbHNhZmVKaXR0ZXI7XG4gICAgfVxuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBpZiB2aWV3IGhhcyByZWNvdmVyZWQsIHN1Y2ggYXMgdHJhbnNwb3J0IHJlcGxhY2VkLCB0aGVuIGNhbmNlbFxuICAgICAgaWYgKHZpZXcuaXNEZXN0cm95ZWQoKSB8fCB2aWV3LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmlldy5kZXN0cm95KCk7XG4gICAgICBsb2dcbiAgICAgICAgPyBsb2coKVxuICAgICAgICA6IHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgICBgZW5jb3VudGVyZWQgJHt0cmllc30gY29uc2VjdXRpdmUgcmVsb2Fkc2AsXG4gICAgICAgICAgXSk7XG4gICAgICBpZiAodHJpZXMgPj0gdGhpcy5tYXhSZWxvYWRzKSB7XG4gICAgICAgIHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgYGV4Y2VlZGVkICR7dGhpcy5tYXhSZWxvYWRzfSBjb25zZWN1dGl2ZSByZWxvYWRzLiBFbnRlcmluZyBmYWlsc2FmZSBtb2RlYCxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5oYXNQZW5kaW5nTGluaygpKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMucGVuZGluZ0xpbms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSwgYWZ0ZXJNcyk7XG4gIH1cblxuICBnZXRIb29rRGVmaW5pdGlvbihuYW1lKSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1heWJlSW50ZXJuYWxIb29rKG5hbWUpIHx8XG4gICAgICB0aGlzLmhvb2tzW25hbWVdIHx8XG4gICAgICB0aGlzLm1heWJlUnVudGltZUhvb2sobmFtZSlcbiAgICApO1xuICB9XG5cbiAgbWF5YmVJbnRlcm5hbEhvb2sobmFtZSkge1xuICAgIHJldHVybiBuYW1lICYmIG5hbWUuc3RhcnRzV2l0aChcIlBob2VuaXguXCIpICYmIEhvb2tzW25hbWUuc3BsaXQoXCIuXCIpWzFdXTtcbiAgfVxuXG4gIG1heWJlUnVudGltZUhvb2sobmFtZSkge1xuICAgIGNvbnN0IHJ1bnRpbWVIb29rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gLFxuICAgICk7XG4gICAgaWYgKCFydW50aW1lSG9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgY2FsbGJhY2tzID0gd2luZG93W2BwaHhfaG9va18ke25hbWV9YF07XG4gICAgaWYgKCFjYWxsYmFja3MgfHwgdHlwZW9mIGNhbGxiYWNrcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBsb2dFcnJvcihcImEgcnVudGltZSBob29rIG11c3QgYmUgYSBmdW5jdGlvblwiLCBydW50aW1lSG9vayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvb2tEZWZpbml0b24gPSBjYWxsYmFja3MoKTtcbiAgICBpZiAoXG4gICAgICBob29rRGVmaW5pdG9uICYmXG4gICAgICAodHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwiZnVuY3Rpb25cIilcbiAgICApIHtcbiAgICAgIHJldHVybiBob29rRGVmaW5pdG9uO1xuICAgIH1cbiAgICBsb2dFcnJvcihcbiAgICAgIFwicnVudGltZSBob29rIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGhvb2sgY2FsbGJhY2tzIG9yIGFuIGluc3RhbmNlIG9mIFZpZXdIb29rXCIsXG4gICAgICBydW50aW1lSG9vayxcbiAgICApO1xuICB9XG5cbiAgaXNVbmxvYWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy51bmxvYWRlZDtcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpO1xuICB9XG5cbiAgZ2V0QmluZGluZ1ByZWZpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5iaW5kaW5nUHJlZml4O1xuICB9XG5cbiAgYmluZGluZyhraW5kKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0QmluZGluZ1ByZWZpeCgpfSR7a2luZH1gO1xuICB9XG5cbiAgY2hhbm5lbCh0b3BpYywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0LmNoYW5uZWwodG9waWMsIHBhcmFtcyk7XG4gIH1cblxuICBqb2luRGVhZFZpZXcoKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgaWYgKFxuICAgICAgYm9keSAmJlxuICAgICAgIXRoaXMuaXNQaHhWaWV3KGJvZHkpICYmXG4gICAgICAhdGhpcy5pc1BoeFZpZXcoZG9jdW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpXG4gICAgKSB7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy5uZXdSb290Vmlldyhib2R5KTtcbiAgICAgIHZpZXcuc2V0SHJlZih0aGlzLmdldEhyZWYoKSk7XG4gICAgICB2aWV3LmpvaW5EZWFkKCk7XG4gICAgICBpZiAoIXRoaXMubWFpbikge1xuICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgfVxuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHZpZXcuZXhlY05ld01vdW50ZWQoKTtcbiAgICAgICAgLy8gcmVzdG9yZSBzY3JvbGwgcG9zaXRpb24gd2hlbiBuYXZpZ2F0aW5nIGZyb20gYW4gZXh0ZXJuYWwgLyBub24tbGl2ZSBwYWdlXG4gICAgICAgIHRoaXMubWF5YmVTY3JvbGwoaGlzdG9yeS5zdGF0ZT8uc2Nyb2xsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGpvaW5Sb290Vmlld3MoKSB7XG4gICAgbGV0IHJvb3RzRm91bmQgPSBmYWxzZTtcbiAgICBET00uYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgJHtQSFhfVklFV19TRUxFQ1RPUn06bm90KFske1BIWF9QQVJFTlRfSUR9XSlgLFxuICAgICAgKHJvb3RFbCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0Um9vdEJ5SWQocm9vdEVsLmlkKSkge1xuICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLm5ld1Jvb3RWaWV3KHJvb3RFbCk7XG4gICAgICAgICAgLy8gc3RpY2tpZXMgY2Fubm90IGJlIG1vdW50ZWQgYXQgdGhlIHJvdXRlciBhbmQgdGhlcmVmb3JlIHNob3VsZCBub3RcbiAgICAgICAgICAvLyBnZXQgYSBocmVmIHNldCBvbiB0aGVtXG4gICAgICAgICAgaWYgKCFET00uaXNQaHhTdGlja3kocm9vdEVsKSkge1xuICAgICAgICAgICAgdmlldy5zZXRIcmVmKHRoaXMuZ2V0SHJlZigpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmlldy5qb2luKCk7XG4gICAgICAgICAgaWYgKHJvb3RFbC5oYXNBdHRyaWJ1dGUoUEhYX01BSU4pKSB7XG4gICAgICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByb290c0ZvdW5kID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcm9vdHNGb3VuZDtcbiAgfVxuXG4gIHJlZGlyZWN0KHRvLCBmbGFzaCwgcmVsb2FkVG9rZW4pIHtcbiAgICBpZiAocmVsb2FkVG9rZW4pIHtcbiAgICAgIEJyb3dzZXIuc2V0Q29va2llKFBIWF9SRUxPQURfU1RBVFVTLCByZWxvYWRUb2tlbiwgNjApO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZCgpO1xuICAgIEJyb3dzZXIucmVkaXJlY3QodG8sIGZsYXNoKTtcbiAgfVxuXG4gIHJlcGxhY2VNYWluKFxuICAgIGhyZWYsXG4gICAgZmxhc2gsXG4gICAgY2FsbGJhY2sgPSBudWxsLFxuICAgIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpLFxuICApIHtcbiAgICBjb25zdCBsaXZlUmVmZXJlciA9IHRoaXMuY3VycmVudExvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IHRoaXMub3V0Z29pbmdNYWluRWwgfHwgdGhpcy5tYWluLmVsO1xuXG4gICAgY29uc3Qgc3RpY2tpZXMgPSBET00uZmluZFBoeFN0aWNreShkb2N1bWVudCkgfHwgW107XG4gICAgY29uc3QgcmVtb3ZlRWxzID0gRE9NLmFsbChcbiAgICAgIHRoaXMub3V0Z29pbmdNYWluRWwsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFwicmVtb3ZlXCIpfV1gLFxuICAgICkuZmlsdGVyKChlbCkgPT4gIURPTS5pc0NoaWxkT2ZBbnkoZWwsIHN0aWNraWVzKSk7XG5cbiAgICBjb25zdCBuZXdNYWluRWwgPSBET00uY2xvbmVOb2RlKHRoaXMub3V0Z29pbmdNYWluRWwsIFwiXCIpO1xuICAgIHRoaXMubWFpbi5zaG93TG9hZGVyKHRoaXMubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5tYWluLmRlc3Ryb3koKTtcblxuICAgIHRoaXMubWFpbiA9IHRoaXMubmV3Um9vdFZpZXcobmV3TWFpbkVsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMubWFpbi5zZXRSZWRpcmVjdChocmVmKTtcbiAgICB0aGlzLnRyYW5zaXRpb25SZW1vdmVzKHJlbW92ZUVscyk7XG4gICAgdGhpcy5tYWluLmpvaW4oKGpvaW5Db3VudCwgb25Eb25lKSA9PiB7XG4gICAgICBpZiAoam9pbkNvdW50ID09PSAxICYmIHRoaXMuY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZikpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAvLyByZW1vdmUgcGh4LXJlbW92ZSBlbHMgcmlnaHQgYmVmb3JlIHdlIHJlcGxhY2UgdGhlIG1haW4gZWxlbWVudFxuICAgICAgICAgIHJlbW92ZUVscy5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuICAgICAgICAgIHN0aWNraWVzLmZvckVhY2goKGVsKSA9PiBuZXdNYWluRWwuYXBwZW5kQ2hpbGQoZWwpKTtcbiAgICAgICAgICB0aGlzLm91dGdvaW5nTWFpbkVsLnJlcGxhY2VXaXRoKG5ld01haW5FbCk7XG4gICAgICAgICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobGlua1JlZik7XG4gICAgICAgICAgb25Eb25lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJhbnNpdGlvblJlbW92ZXMoZWxlbWVudHMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVtb3ZlQXR0ciA9IHRoaXMuYmluZGluZyhcInJlbW92ZVwiKTtcbiAgICBjb25zdCBzaWxlbmNlRXZlbnRzID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgLy8gcHJldmVudCBhbGwgbGlzdGVuZXJzIHdlIGNhcmUgYWJvdXQgZnJvbSBidWJibGluZyB0byB3aW5kb3dcbiAgICAgIC8vIHNpbmNlIHdlIGFyZSByZW1vdmluZyB0aGUgZWxlbWVudFxuICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBzaWxlbmNlRXZlbnRzLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUocmVtb3ZlQXR0ciksIFwicmVtb3ZlXCIpO1xuICAgIH0pO1xuICAgIC8vIHJlbW92ZSB0aGUgc2lsZW5jZWQgbGlzdGVuZXJzIHdoZW4gdHJhbnNpdGlvbnMgYXJlIGRvbmUgaW5jYXNlIHRoZSBlbGVtZW50IGlzIHJlLXVzZWRcbiAgICAvLyBhbmQgY2FsbCBjYWxsZXIncyBjYWxsYmFjayBhcyBzb29uIGFzIHdlIGFyZSBkb25lIHdpdGggdHJhbnNpdGlvbnNcbiAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIHNpbGVuY2VFdmVudHMsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBpc1BoeFZpZXcoZWwpIHtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgIT09IG51bGw7XG4gIH1cblxuICBuZXdSb290VmlldyhlbCwgZmxhc2gsIGxpdmVSZWZlcmVyKSB7XG4gICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLCBudWxsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMucm9vdHNbdmlldy5pZF0gPSB2aWV3O1xuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgb3duZXIoY2hpbGRFbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgdmlldztcbiAgICBjb25zdCB2aWV3RWwgPSBET00uY2xvc2VzdFZpZXdFbChjaGlsZEVsKTtcbiAgICBpZiAodmlld0VsKSB7XG4gICAgICAvLyBpdCBjYW4gaGFwcGVuIHRoYXQgd2UgZmluZCBhIHZpZXcgdGhhdCBpcyBhbHJlYWR5IGRlc3Ryb3llZDtcbiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBETyBOT1Qgd2FudCB0byBmYWxsYmFjayB0byB0aGUgbWFpbiBlbGVtZW50XG4gICAgICB2aWV3ID0gdGhpcy5nZXRWaWV3QnlFbCh2aWV3RWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aWV3ID0gdGhpcy5tYWluO1xuICAgIH1cbiAgICByZXR1cm4gdmlldyAmJiBjYWxsYmFjayA/IGNhbGxiYWNrKHZpZXcpIDogdmlldztcbiAgfVxuXG4gIHdpdGhpbk93bmVycyhjaGlsZEVsLCBjYWxsYmFjaykge1xuICAgIHRoaXMub3duZXIoY2hpbGRFbCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIGNoaWxkRWwpKTtcbiAgfVxuXG4gIGdldFZpZXdCeUVsKGVsKSB7XG4gICAgY29uc3Qgcm9vdElkID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9ST09UX0lEKTtcbiAgICByZXR1cm4gbWF5YmUodGhpcy5nZXRSb290QnlJZChyb290SWQpLCAocm9vdCkgPT5cbiAgICAgIHJvb3QuZ2V0RGVzY2VuZGVudEJ5RWwoZWwpLFxuICAgICk7XG4gIH1cblxuICBnZXRSb290QnlJZChpZCkge1xuICAgIHJldHVybiB0aGlzLnJvb3RzW2lkXTtcbiAgfVxuXG4gIGRlc3Ryb3lBbGxWaWV3cygpIHtcbiAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucm9vdHMpIHtcbiAgICAgIHRoaXMucm9vdHNbaWRdLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW2lkXTtcbiAgICB9XG4gICAgdGhpcy5tYWluID0gbnVsbDtcbiAgfVxuXG4gIGRlc3Ryb3lWaWV3QnlFbChlbCkge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmdldFJvb3RCeUlkKGVsLmdldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCkpO1xuICAgIGlmIChyb290ICYmIHJvb3QuaWQgPT09IGVsLmlkKSB7XG4gICAgICByb290LmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW3Jvb3QuaWRdO1xuICAgIH0gZWxzZSBpZiAocm9vdCkge1xuICAgICAgcm9vdC5kZXN0cm95RGVzY2VuZGVudChlbC5pZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZlRWxlbWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGRyb3BBY3RpdmVFbGVtZW50KHZpZXcpIHtcbiAgICBpZiAodGhpcy5wcmV2QWN0aXZlICYmIHZpZXcub3duc0VsZW1lbnQodGhpcy5wcmV2QWN0aXZlKSkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXN0b3JlUHJldmlvdXNseUFjdGl2ZUZvY3VzKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMucHJldkFjdGl2ZSAmJlxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgYmx1ckFjdGl2ZUVsZW1lbnQoKSB7XG4gICAgdGhpcy5wcmV2QWN0aXZlID0gdGhpcy5nZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmJsdXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZGVhZD86IGJvb2xlYW59fSBbb3B0aW9ucz17fV1cbiAgICovXG4gIGJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IHRydWU7XG4gICAgLy8gZW50ZXIgZmFpbHNhZmUgcmVsb2FkIGlmIHNlcnZlciBoYXMgZ29uZSBhd2F5IGludGVudGlvbmFsbHksIHN1Y2ggYXMgXCJkaXNjb25uZWN0XCIgYnJvYWRjYXN0XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGV2ZW50KSA9PiB7XG4gICAgICAvLyBmYWlsc2FmZSByZWxvYWQgaWYgbm9ybWFsIGNsb3N1cmUgYW5kIHdlIHN0aWxsIGhhdmUgYSBtYWluIExWXG4gICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuY29kZSA9PT0gMTAwMCAmJiB0aGlzLm1haW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkV2l0aEppdHRlcih0aGlzLm1haW4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHt9KTsgLy8gZW5zdXJlIGFsbCBjbGljayBldmVudHMgYnViYmxlIGZvciBtb2JpbGUgU2FmYXJpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBhZ2VzaG93XCIsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5wZXJzaXN0ZWQpIHtcbiAgICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZVxuICAgICAgICAgIHRoaXMuZ2V0U29ja2V0KCkuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHRoaXMud2l0aFBhZ2VMb2FkaW5nKHsgdG86IHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBraW5kOiBcInJlZGlyZWN0XCIgfSk7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kTmF2KCk7XG4gICAgfVxuICAgIHRoaXMuYmluZENsaWNrcygpO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kRm9ybXMoKTtcbiAgICB9XG4gICAgdGhpcy5iaW5kKFxuICAgICAgeyBrZXl1cDogXCJrZXl1cFwiLCBrZXlkb3duOiBcImtleWRvd25cIiB9LFxuICAgICAgKGUsIHR5cGUsIHZpZXcsIHRhcmdldEVsLCBwaHhFdmVudCwgX3BoeFRhcmdldCkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaEtleSA9IHRhcmdldEVsLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0tFWSkpO1xuICAgICAgICBjb25zdCBwcmVzc2VkS2V5ID0gZS5rZXkgJiYgZS5rZXkudG9Mb3dlckNhc2UoKTsgLy8gY2hyb21lIGNsaWNrZWQgYXV0b2NvbXBsZXRlcyBzZW5kIGEga2V5ZG93biB3aXRob3V0IGtleVxuICAgICAgICBpZiAobWF0Y2hLZXkgJiYgbWF0Y2hLZXkudG9Mb3dlckNhc2UoKSAhPT0gcHJlc3NlZEtleSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICBKUy5leGVjKGUsIHR5cGUsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXRFbCwgW1wicHVzaFwiLCB7IGRhdGEgfV0pO1xuICAgICAgfSxcbiAgICApO1xuICAgIHRoaXMuYmluZChcbiAgICAgIHsgYmx1cjogXCJmb2N1c291dFwiLCBmb2N1czogXCJmb2N1c2luXCIgfSxcbiAgICAgIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgcGh4RXZlbnQsIHBoeFRhcmdldCkgPT4ge1xuICAgICAgICBpZiAoIXBoeFRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmJpbmQoXG4gICAgICB7IGJsdXI6IFwiYmx1clwiLCBmb2N1czogXCJmb2N1c1wiIH0sXG4gICAgICAoZSwgdHlwZSwgdmlldywgdGFyZ2V0RWwsIHBoeEV2ZW50LCBwaHhUYXJnZXQpID0+IHtcbiAgICAgICAgLy8gYmx1ciBhbmQgZm9jdXMgYXJlIHRyaWdnZXJlZCBvbiBkb2N1bWVudCBhbmQgd2luZG93LiBEaXNjYXJkIG9uZSB0byBhdm9pZCBkdXBzXG4gICAgICAgIGlmIChwaHhUYXJnZXQgPT09IFwid2luZG93XCIpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ldmVudE1ldGEodHlwZSwgZSwgdGFyZ2V0RWwpO1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLm9uKFwiZHJhZ292ZXJcIiwgKGUpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG4gICAgdGhpcy5vbihcImRyb3BcIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BUYXJnZXRJZCA9IG1heWJlKFxuICAgICAgICBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgdGhpcy5iaW5kaW5nKFBIWF9EUk9QX1RBUkdFVCkpLFxuICAgICAgICAodHJ1ZVRhcmdldCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0cnVlVGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgZHJvcFRhcmdldCA9IGRyb3BUYXJnZXRJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkcm9wVGFyZ2V0SWQpO1xuICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGUuZGF0YVRyYW5zZmVyLmZpbGVzIHx8IFtdKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWRyb3BUYXJnZXQgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgfHxcbiAgICAgICAgZHJvcFRhcmdldC5kaXNhYmxlZCB8fFxuICAgICAgICBmaWxlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0LmZpbGVzIGluc3RhbmNlb2YgRmlsZUxpc3QpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBMaXZlVXBsb2FkZXIudHJhY2tGaWxlcyhkcm9wVGFyZ2V0LCBmaWxlcywgZS5kYXRhVHJhbnNmZXIpO1xuICAgICAgZHJvcFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gICAgdGhpcy5vbihQSFhfVFJBQ0tfVVBMT0FEUywgKGUpID0+IHtcbiAgICAgIGNvbnN0IHVwbG9hZFRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgaWYgKCFET00uaXNVcGxvYWRJbnB1dCh1cGxvYWRUYXJnZXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRldGFpbC5maWxlcyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAoZikgPT4gZiBpbnN0YW5jZW9mIEZpbGUgfHwgZiBpbnN0YW5jZW9mIEJsb2IsXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLnRyYWNrRmlsZXModXBsb2FkVGFyZ2V0LCBmaWxlcyk7XG4gICAgICB1cGxvYWRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZXZlbnRNZXRhKGV2ZW50TmFtZSwgZSwgdGFyZ2V0RWwpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMubWV0YWRhdGFDYWxsYmFja3NbZXZlbnROYW1lXTtcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhlLCB0YXJnZXRFbCkgOiB7fTtcbiAgfVxuXG4gIHNldFBlbmRpbmdMaW5rKGhyZWYpIHtcbiAgICB0aGlzLmxpbmtSZWYrKztcbiAgICB0aGlzLnBlbmRpbmdMaW5rID0gaHJlZjtcbiAgICB0aGlzLnJlc2V0UmVsb2FkU3RhdHVzKCk7XG4gICAgcmV0dXJuIHRoaXMubGlua1JlZjtcbiAgfVxuXG4gIC8vIGFueXRpbWUgd2UgYXJlIG5hdmlnYXRpbmcgb3IgY29ubmVjdGluZywgZHJvcCByZWxvYWQgY29va2llIGluIGNhc2VcbiAgLy8gd2UgaXNzdWUgdGhlIGNvb2tpZSBidXQgdGhlIG5leHQgcmVxdWVzdCB3YXMgaW50ZXJydXB0ZWQgYW5kIHRoZSBzZXJ2ZXIgbmV2ZXIgZHJvcHBlZCBpdFxuICByZXNldFJlbG9hZFN0YXR1cygpIHtcbiAgICBCcm93c2VyLmRlbGV0ZUNvb2tpZShQSFhfUkVMT0FEX1NUQVRVUyk7XG4gIH1cblxuICBjb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSB7XG4gICAgaWYgKHRoaXMubGlua1JlZiAhPT0gbGlua1JlZikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhyZWYgPSB0aGlzLnBlbmRpbmdMaW5rO1xuICAgICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXRIcmVmKCkge1xuICAgIHJldHVybiB0aGlzLmhyZWY7XG4gIH1cblxuICBoYXNQZW5kaW5nTGluaygpIHtcbiAgICByZXR1cm4gISF0aGlzLnBlbmRpbmdMaW5rO1xuICB9XG5cbiAgYmluZChldmVudHMsIGNhbGxiYWNrKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiBldmVudHMpIHtcbiAgICAgIGNvbnN0IGJyb3dzZXJFdmVudE5hbWUgPSBldmVudHNbZXZlbnRdO1xuXG4gICAgICB0aGlzLm9uKGJyb3dzZXJFdmVudE5hbWUsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmcoZXZlbnQpO1xuICAgICAgICBjb25zdCB3aW5kb3dCaW5kaW5nID0gdGhpcy5iaW5kaW5nKGB3aW5kb3ctJHtldmVudH1gKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGh4RXZlbnQgPVxuICAgICAgICAgIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoYmluZGluZyk7XG4gICAgICAgIGlmICh0YXJnZXRQaHhFdmVudCkge1xuICAgICAgICAgIHRoaXMuZGVib3VuY2UoZS50YXJnZXQsIGUsIGJyb3dzZXJFdmVudE5hbWUsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZS50YXJnZXQsIHRhcmdldFBoeEV2ZW50LCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHt3aW5kb3dCaW5kaW5nfV1gLCAoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBoeEV2ZW50ID0gZWwuZ2V0QXR0cmlidXRlKHdpbmRvd0JpbmRpbmcpO1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZShlbCwgZSwgYnJvd3NlckV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZWwsIHBoeEV2ZW50LCBcIndpbmRvd1wiKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYmluZENsaWNrcygpIHtcbiAgICB0aGlzLm9uKFwibW91c2Vkb3duXCIsIChlKSA9PiAodGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IGUudGFyZ2V0KSk7XG4gICAgdGhpcy5iaW5kQ2xpY2soXCJjbGlja1wiLCBcImNsaWNrXCIpO1xuICB9XG5cbiAgYmluZENsaWNrKGV2ZW50TmFtZSwgYmluZGluZ05hbWUpIHtcbiAgICBjb25zdCBjbGljayA9IHRoaXMuYmluZGluZyhiaW5kaW5nTmFtZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBsZXQgdGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLy8gYSBzeW50aGV0aWMgY2xpY2sgZXZlbnQgKGRldGFpbCAwKSB3aWxsIG5vdCBoYXZlIGNhdXNlZCBhIG1vdXNlZG93biBldmVudCxcbiAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSBjbGlja1N0YXJ0ZWRBdFRhcmdldCBpcyBzdGFsZVxuICAgICAgICBpZiAoZS5kZXRhaWwgPT09IDApIHRoaXMuY2xpY2tTdGFydGVkQXRUYXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgY29uc3QgY2xpY2tTdGFydGVkQXRUYXJnZXQgPSB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0IHx8IGUudGFyZ2V0O1xuICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyB0aGUgdGFyZ2V0IGZvciB0aGUgY2xpY2sgZXZlbnQsIHdlIGFsd2F5cyB3YW50IHRvXG4gICAgICAgIC8vIHVzZSB0aGUgYWN0dWFsIGV2ZW50IHRhcmdldCwgc2VlICMzMzcyXG4gICAgICAgIHRhcmdldCA9IGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCBjbGljayk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXRUYXJnZXQpO1xuICAgICAgICB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgY29uc3QgcGh4RXZlbnQgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShjbGljayk7XG4gICAgICAgIGlmICghcGh4RXZlbnQpIHtcbiAgICAgICAgICBpZiAoRE9NLmlzTmV3UGFnZUNsaWNrKGUsIHdpbmRvdy5sb2NhdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub29wIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGF3YWl0aW5nIGFuIGFjayBmb3IgdGhpcyBlbCBhbHJlYWR5XG4gICAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKFBIWF9SRUZfU1JDKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVib3VuY2UodGFyZ2V0LCBlLCBcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyh0YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgICBKUy5leGVjKGUsIFwiY2xpY2tcIiwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldCwgW1xuICAgICAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICAgICAgeyBkYXRhOiB0aGlzLmV2ZW50TWV0YShcImNsaWNrXCIsIGUsIHRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXQpIHtcbiAgICBjb25zdCBwaHhDbGlja0F3YXkgPSB0aGlzLmJpbmRpbmcoXCJjbGljay1hd2F5XCIpO1xuICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHtwaHhDbGlja0F3YXl9XWAsIChlbCkgPT4ge1xuICAgICAgaWYgKCEoZWwuaXNTYW1lTm9kZShjbGlja1N0YXJ0ZWRBdCkgfHwgZWwuY29udGFpbnMoY2xpY2tTdGFydGVkQXQpKSkge1xuICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICBjb25zdCBwaHhFdmVudCA9IGVsLmdldEF0dHJpYnV0ZShwaHhDbGlja0F3YXkpO1xuICAgICAgICAgIGlmIChKUy5pc1Zpc2libGUoZWwpICYmIEpTLmlzSW5WaWV3cG9ydChlbCkpIHtcbiAgICAgICAgICAgIEpTLmV4ZWMoZSwgXCJjbGlja1wiLCBwaHhFdmVudCwgdmlldywgZWwsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgZGF0YTogdGhpcy5ldmVudE1ldGEoXCJjbGlja1wiLCBlLCBlLnRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kTmF2KCkge1xuICAgIGlmICghQnJvd3Nlci5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IFwibWFudWFsXCI7XG4gICAgfVxuICAgIGxldCBzY3JvbGxUaW1lciA9IG51bGw7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgKF9lKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZXIpO1xuICAgICAgc2Nyb2xsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PlxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHsgc2Nyb2xsOiB3aW5kb3cuc2Nyb2xsWSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBvcHN0YXRlXCIsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHR5cGUsIGJhY2tUeXBlLCBpZCwgc2Nyb2xsLCBwb3NpdGlvbiB9ID0gZXZlbnQuc3RhdGUgfHwge307XG4gICAgICAgIGNvbnN0IGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcblxuICAgICAgICAvLyBDb21wYXJlIHBvc2l0aW9ucyB0byBkZXRlcm1pbmUgZGlyZWN0aW9uXG4gICAgICAgIGNvbnN0IGlzRm9yd2FyZCA9IHBvc2l0aW9uID4gdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uO1xuICAgICAgICBjb25zdCBuYXZUeXBlID0gaXNGb3J3YXJkID8gdHlwZSA6IGJhY2tUeXBlIHx8IHR5cGU7XG5cbiAgICAgICAgLy8gVXBkYXRlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uID0gcG9zaXRpb24gfHwgMDtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgIFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OLFxuICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICApO1xuXG4gICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgIHBhdGNoOiBuYXZUeXBlID09PSBcInBhdGNoXCIsXG4gICAgICAgICAgICBwb3A6IHRydWUsXG4gICAgICAgICAgICBkaXJlY3Rpb246IGlzRm9yd2FyZCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tYXliZVNjcm9sbChzY3JvbGwpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5tYWluLmlzQ29ubmVjdGVkKCkgJiZcbiAgICAgICAgICAgIG5hdlR5cGUgPT09IFwicGF0Y2hcIiAmJlxuICAgICAgICAgICAgaWQgPT09IHRoaXMubWFpbi5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5tYWluLnB1c2hMaW5rUGF0Y2goZXZlbnQsIGhyZWYsIG51bGwsIGNhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWFpbihocmVmLCBudWxsLCBjYWxsYmFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJjbGlja1wiLFxuICAgICAgKGUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gY2xvc2VzdFBoeEJpbmRpbmcoZS50YXJnZXQsIFBIWF9MSVZFX0xJTkspO1xuICAgICAgICBjb25zdCB0eXBlID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJVkVfTElOSyk7XG4gICAgICAgIGlmICghdHlwZSB8fCAhdGhpcy5pc0Nvbm5lY3RlZCgpIHx8ICF0aGlzLm1haW4gfHwgRE9NLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB3cmFwcGluZyBhbiBTVkcgZWxlbWVudCBpbiBhbiBhbmNob3IgdGFnLCB0aGUgaHJlZiBjYW4gYmUgYW4gU1ZHQW5pbWF0ZWRTdHJpbmdcbiAgICAgICAgY29uc3QgaHJlZiA9XG4gICAgICAgICAgdGFyZ2V0LmhyZWYgaW5zdGFuY2VvZiBTVkdBbmltYXRlZFN0cmluZ1xuICAgICAgICAgICAgPyB0YXJnZXQuaHJlZi5iYXNlVmFsXG4gICAgICAgICAgICA6IHRhcmdldC5ocmVmO1xuXG4gICAgICAgIGNvbnN0IGxpbmtTdGF0ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJTktfU1RBVEUpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IC8vIGRvIG5vdCBidWJibGUgY2xpY2sgdG8gcmVndWxhciBwaHgtY2xpY2sgYmluZGluZ3NcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0xpbmsgPT09IGhyZWYpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlID09PSBcInBhdGNoXCIpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgbnVsbCwgdGFyZ2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZXhwZWN0ZWQgJHtQSFhfTElWRV9MSU5LfSB0byBiZSBcInBhdGNoXCIgb3IgXCJyZWRpcmVjdFwiLCBnb3Q6ICR7dHlwZX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGh4Q2xpY2sgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNsaWNrXCIpKTtcbiAgICAgICAgICBpZiAocGh4Q2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB0aGlzLmV4ZWNKUyh0YXJnZXQsIHBoeENsaWNrLCBcImNsaWNrXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBtYXliZVNjcm9sbChzY3JvbGwpIHtcbiAgICBpZiAodHlwZW9mIHNjcm9sbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHNjcm9sbCk7XG4gICAgICB9KTsgLy8gdGhlIGJvZHkgbmVlZHMgdG8gcmVuZGVyIGJlZm9yZSB3ZSBzY3JvbGwuXG4gICAgfVxuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChldmVudCwgcGF5bG9hZCA9IHt9KSB7XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBgcGh4OiR7ZXZlbnR9YCwgeyBkZXRhaWw6IHBheWxvYWQgfSk7XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50cyhldmVudHMpIHtcbiAgICBldmVudHMuZm9yRWFjaCgoW2V2ZW50LCBwYXlsb2FkXSkgPT4gdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LCBwYXlsb2FkKSk7XG4gIH1cblxuICB3aXRoUGFnZUxvYWRpbmcoaW5mbywgY2FsbGJhY2spIHtcbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7IGRldGFpbDogaW5mbyB9KTtcbiAgICBjb25zdCBkb25lID0gKCkgPT5cbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgeyBkZXRhaWw6IGluZm8gfSk7XG4gICAgcmV0dXJuIGNhbGxiYWNrID8gY2FsbGJhY2soZG9uZSkgOiBkb25lO1xuICB9XG5cbiAgcHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldEVsKSB7XG4gICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbi5pc01haW4oKSkge1xuICAgICAgcmV0dXJuIEJyb3dzZXIucmVkaXJlY3QoaHJlZik7XG4gICAgfVxuXG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJwYXRjaFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLm1haW4ucHVzaExpbmtQYXRjaChlLCBocmVmLCB0YXJnZXRFbCwgKGxpbmtSZWYpID0+IHtcbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBoaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmID0gdGhpcy5zZXRQZW5kaW5nTGluayhocmVmKSkge1xuICAgIGlmICghdGhpcy5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluY3JlbWVudCBwb3NpdGlvbiBmb3IgbmV3IHN0YXRlXG4gICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uKys7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24udG9TdHJpbmcoKSxcbiAgICApO1xuXG4gICAgLy8gc3RvcmUgdGhlIHR5cGUgZm9yIGJhY2sgbmF2aWdhdGlvblxuICAgIEJyb3dzZXIudXBkYXRlQ3VycmVudFN0YXRlKChzdGF0ZSkgPT4gKHsgLi4uc3RhdGUsIGJhY2tUeXBlOiBcInBhdGNoXCIgfSkpO1xuXG4gICAgQnJvd3Nlci5wdXNoU3RhdGUoXG4gICAgICBsaW5rU3RhdGUsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMubWFpbi5pZCxcbiAgICAgICAgcG9zaXRpb246IHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0sXG4gICAgICBocmVmLFxuICAgICk7XG5cbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4Om5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyBwYXRjaDogdHJ1ZSwgaHJlZiwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICB9XG5cbiAgaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgZmxhc2gsIHRhcmdldEVsKSB7XG4gICAgY29uc3QgY2xpY2tMb2FkaW5nID0gdGFyZ2V0RWwgJiYgZS5pc1RydXN0ZWQgJiYgZS50eXBlICE9PSBcInBvcHN0YXRlXCI7XG4gICAgaWYgKGNsaWNrTG9hZGluZykge1xuICAgICAgdGFyZ2V0RWwuY2xhc3NMaXN0LmFkZChcInBoeC1jbGljay1sb2FkaW5nXCIpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSB8fCAhdGhpcy5tYWluLmlzTWFpbigpKSB7XG4gICAgICByZXR1cm4gQnJvd3Nlci5yZWRpcmVjdChocmVmLCBmbGFzaCk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCB0byBmdWxsIGhyZWYgaWYgb25seSBwYXRoIHByZWZpeFxuICAgIGlmICgvXlxcLyR8XlxcL1teXFwvXSsuKiQvLnRlc3QoaHJlZikpIHtcbiAgICAgIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3QgfSA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgIGhyZWYgPSBgJHtwcm90b2NvbH0vLyR7aG9zdH0ke2hyZWZ9YDtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFk7XG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJyZWRpcmVjdFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLnJlcGxhY2VNYWluKGhyZWYsIGZsYXNoLCAobGlua1JlZikgPT4ge1xuICAgICAgICBpZiAobGlua1JlZiA9PT0gdGhpcy5saW5rUmVmKSB7XG4gICAgICAgICAgLy8gSW5jcmVtZW50IHBvc2l0aW9uIGZvciBuZXcgc3RhdGVcbiAgICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24rKztcbiAgICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICBQSFhfTFZfSElTVE9SWV9QT1NJVElPTixcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBzdG9yZSB0aGUgdHlwZSBmb3IgYmFjayBuYXZpZ2F0aW9uXG4gICAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBiYWNrVHlwZTogXCJyZWRpcmVjdFwiLFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFxuICAgICAgICAgICAgbGlua1N0YXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInJlZGlyZWN0XCIsXG4gICAgICAgICAgICAgIGlkOiB0aGlzLm1haW4uaWQsXG4gICAgICAgICAgICAgIHNjcm9sbDogc2Nyb2xsLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgICAgZGV0YWlsOiB7IGhyZWYsIHBhdGNoOiBmYWxzZSwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgdW5kbyBjbGljay1sb2FkaW5nIGNsYXNzXG4gICAgICAgIC8vIChpbiBjYXNlIGl0IG9yaWdpbmF0ZWQgaW4gYSBzdGlja3kgbGl2ZSB2aWV3LCBvdGhlcndpc2UgaXQgd291bGQgYmUgcmVtb3ZlZCBhbnl3YXkpXG4gICAgICAgIGlmIChjbGlja0xvYWRpbmcpIHtcbiAgICAgICAgICB0YXJnZXRFbC5jbGFzc0xpc3QucmVtb3ZlKFwicGh4LWNsaWNrLWxvYWRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZWdpc3Rlck5ld0xvY2F0aW9uKG5ld0xvY2F0aW9uKSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSB0aGlzLmN1cnJlbnRMb2NhdGlvbjtcbiAgICBpZiAocGF0aG5hbWUgKyBzZWFyY2ggPT09IG5ld0xvY2F0aW9uLnBhdGhuYW1lICsgbmV3TG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gY2xvbmUobmV3TG9jYXRpb24pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgYmluZEZvcm1zKCkge1xuICAgIGxldCBpdGVyYXRpb25zID0gMDtcbiAgICBsZXQgZXh0ZXJuYWxGb3JtU3VibWl0dGVkID0gZmFsc2U7XG5cbiAgICAvLyBkaXNhYmxlIGZvcm1zIG9uIHN1Ym1pdCB0aGF0IHRyYWNrIHBoeC1jaGFuZ2UgYnV0IHBlcmZvcm0gZXh0ZXJuYWwgc3VibWl0XG4gICAgdGhpcy5vbihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgcGh4U3VibWl0ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInN1Ym1pdFwiKSk7XG4gICAgICBjb25zdCBwaHhDaGFuZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICAgIGlmICghZXh0ZXJuYWxGb3JtU3VibWl0dGVkICYmIHBoeENoYW5nZSAmJiAhcGh4U3VibWl0KSB7XG4gICAgICAgIGV4dGVybmFsRm9ybVN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgdmlldy5kaXNhYmxlRm9ybShlLnRhcmdldCk7XG4gICAgICAgICAgLy8gc2FmYXJpIG5lZWRzIG5leHQgdGlja1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKERPTS5pc1VubG9hZGFibGVGb3JtU3VibWl0KGUpKSB7XG4gICAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLnRhcmdldC5zdWJtaXQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKFwic3VibWl0XCIsIChlKSA9PiB7XG4gICAgICBjb25zdCBwaHhFdmVudCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJzdWJtaXRcIikpO1xuICAgICAgaWYgKCFwaHhFdmVudCkge1xuICAgICAgICBpZiAoRE9NLmlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkpIHtcbiAgICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICBKUy5leGVjKGUsIFwic3VibWl0XCIsIHBoeEV2ZW50LCB2aWV3LCBlLnRhcmdldCwgW1xuICAgICAgICAgIFwicHVzaFwiLFxuICAgICAgICAgIHsgc3VibWl0dGVyOiBlLnN1Ym1pdHRlciB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIFtcImNoYW5nZVwiLCBcImlucHV0XCJdKSB7XG4gICAgICB0aGlzLm9uKHR5cGUsIChlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlIGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQgJiZcbiAgICAgICAgICAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpICYmXG4gICAgICAgICAgZS50YXJnZXQuZm9ybSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHRocm93IG9uIGludmFsaWQgSlMuZGlzcGF0Y2ggdGFyZ2V0IGFuZCBub29wIGlmIEN1c3RvbUV2ZW50IHRyaWdnZXJlZCBvdXRzaWRlIEpTLmRpc3BhdGNoXG4gICAgICAgICAgaWYgKGUuZGV0YWlsICYmIGUuZGV0YWlsLmRpc3BhdGNoZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGRpc3BhdGNoaW5nIGEgY3VzdG9tICR7dHlwZX0gZXZlbnQgaXMgb25seSBzdXBwb3J0ZWQgb24gaW5wdXQgZWxlbWVudHMgaW5zaWRlIGEgZm9ybWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0O1xuICAgICAgICBpZiAodGhpcy5ibG9ja1BoeENoYW5nZVdoaWxlQ29tcG9zaW5nICYmIGUuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBgY29tcG9zaXRpb24tbGlzdGVuZXItJHt0eXBlfWA7XG4gICAgICAgICAgaWYgKCFET00ucHJpdmF0ZShpbnB1dCwga2V5KSkge1xuICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBcImNvbXBvc2l0aW9uZW5kXCIsXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGEgbmV3IGlucHV0L2NoYW5nZSBldmVudFxuICAgICAgICAgICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgRE9NLmRlbGV0ZVByaXZhdGUoaW5wdXQsIGtleSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKTtcbiAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gaW5wdXQuZm9ybSAmJiBpbnB1dC5mb3JtLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpO1xuICAgICAgICBjb25zdCBwaHhFdmVudCA9IGlucHV0RXZlbnQgfHwgZm9ybUV2ZW50O1xuICAgICAgICBpZiAoIXBoeEV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbnB1dC50eXBlID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgaW5wdXQudmFsaWRpdHkgJiZcbiAgICAgICAgICBpbnB1dC52YWxpZGl0eS5iYWRJbnB1dFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gaW5wdXRFdmVudCA/IGlucHV0IDogaW5wdXQuZm9ybTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZXJhdGlvbnMgPSBpdGVyYXRpb25zO1xuICAgICAgICBpdGVyYXRpb25zKys7XG4gICAgICAgIGNvbnN0IHsgYXQ6IGF0LCB0eXBlOiBsYXN0VHlwZSB9ID1cbiAgICAgICAgICBET00ucHJpdmF0ZShpbnB1dCwgXCJwcmV2LWl0ZXJhdGlvblwiKSB8fCB7fTtcbiAgICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIGFsd2F5cyBmaXJlIGF0IGxlYXN0IG9uZSBcImlucHV0XCIgZXZlbnQgYmVmb3JlIGV2ZXJ5IFwiY2hhbmdlXCJcbiAgICAgICAgLy8gSWdub3JlIFwiY2hhbmdlXCIgZXZlbnRzLCB1bmxlc3MgdGhlcmUgd2FzIG5vIHByaW9yIFwiaW5wdXRcIiBldmVudC5cbiAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgdXNlciBjb2RlIHRyaWdnZXJzIGEgXCJjaGFuZ2VcIiBldmVudCwgb3IgaWYgdGhlIGJyb3dzZXIgaXMgbm9uLWNvbmZvcm1pbmcuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhdCA9PT0gY3VycmVudEl0ZXJhdGlvbnMgLSAxICYmXG4gICAgICAgICAgdHlwZSA9PT0gXCJjaGFuZ2VcIiAmJlxuICAgICAgICAgIGxhc3RUeXBlID09PSBcImlucHV0XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIiwge1xuICAgICAgICAgIGF0OiBjdXJyZW50SXRlcmF0aW9ucyxcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlYm91bmNlKGlucHV0LCBlLCB0eXBlLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZGlzcGF0Y2hlciwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX0ZPQ1VTRUQsIHRydWUpO1xuICAgICAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdmlldywgaW5wdXQsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgX3RhcmdldDogZS50YXJnZXQubmFtZSwgZGlzcGF0Y2hlcjogZGlzcGF0Y2hlciB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMub24oXCJyZXNldFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuICAgICAgRE9NLnJlc2V0Rm9ybShmb3JtKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKS5maW5kKChlbCkgPT4gZWwudHlwZSA9PT0gXCJyZXNldFwiKTtcbiAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAvLyB3YWl0IHVudGlsIG5leHQgdGljayB0byBnZXQgdXBkYXRlZCBpbnB1dCB2YWx1ZVxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEV2ZW50KFwiaW5wdXRcIiwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiBmYWxzZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRlYm91bmNlKGVsLCBldmVudCwgZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgIGlmIChldmVudFR5cGUgPT09IFwiYmx1clwiIHx8IGV2ZW50VHlwZSA9PT0gXCJmb2N1c291dFwiKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBwaHhEZWJvdW5jZSA9IHRoaXMuYmluZGluZyhQSFhfREVCT1VOQ0UpO1xuICAgIGNvbnN0IHBoeFRocm90dGxlID0gdGhpcy5iaW5kaW5nKFBIWF9USFJPVFRMRSk7XG4gICAgY29uc3QgZGVmYXVsdERlYm91bmNlID0gdGhpcy5kZWZhdWx0cy5kZWJvdW5jZS50b1N0cmluZygpO1xuICAgIGNvbnN0IGRlZmF1bHRUaHJvdHRsZSA9IHRoaXMuZGVmYXVsdHMudGhyb3R0bGUudG9TdHJpbmcoKTtcblxuICAgIHRoaXMud2l0aGluT3duZXJzKGVsLCAodmlldykgPT4ge1xuICAgICAgY29uc3QgYXN5bmNGaWx0ZXIgPSAoKSA9PlxuICAgICAgICAhdmlldy5pc0Rlc3Ryb3llZCgpICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpO1xuICAgICAgRE9NLmRlYm91bmNlKFxuICAgICAgICBlbCxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHBoeERlYm91bmNlLFxuICAgICAgICBkZWZhdWx0RGVib3VuY2UsXG4gICAgICAgIHBoeFRocm90dGxlLFxuICAgICAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgICAgIGFzeW5jRmlsdGVyLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBzaWxlbmNlRXZlbnRzKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5zaWxlbmNlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soKTtcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2U7XG4gIH1cblxuICBvbihldmVudCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmJvdW5kRXZlbnROYW1lcy5hZGQoZXZlbnQpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCAoZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNpbGVuY2VkKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAganNRdWVyeVNlbGVjdG9yQWxsKHNvdXJjZUVsLCBxdWVyeSwgZGVmYXVsdFF1ZXJ5KSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5kb21DYWxsYmFja3MuanNRdWVyeVNlbGVjdG9yQWxsO1xuICAgIHJldHVybiBhbGwgPyBhbGwoc291cmNlRWwsIHF1ZXJ5LCBkZWZhdWx0UXVlcnkpIDogZGVmYXVsdFF1ZXJ5KCk7XG4gIH1cbn1cblxuY2xhc3MgVHJhbnNpdGlvblNldCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5wcm9taXNlcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnBlbmRpbmdPcHMgPSBbXTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMuZm9yRWFjaCgodGltZXIpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcik7XG4gICAgfSk7XG4gICAgdGhpcy5wcm9taXNlcy5jbGVhcigpO1xuICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gIH1cblxuICBhZnRlcihjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoUGVuZGluZ09wKGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBhZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSkge1xuICAgIG9uU3RhcnQoKTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmFuc2l0aW9ucy5kZWxldGUodGltZXIpO1xuICAgICAgb25Eb25lKCk7XG4gICAgICB0aGlzLmZsdXNoUGVuZGluZ09wcygpO1xuICAgIH0sIHRpbWUpO1xuICAgIHRoaXMudHJhbnNpdGlvbnMuYWRkKHRpbWVyKTtcbiAgfVxuXG4gIGFkZEFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy5wcm9taXNlcy5hZGQocHJvbWlzZSk7XG4gICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMucHJvbWlzZXMuZGVsZXRlKHByb21pc2UpO1xuICAgICAgdGhpcy5mbHVzaFBlbmRpbmdPcHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hQZW5kaW5nT3Aob3ApIHtcbiAgICB0aGlzLnBlbmRpbmdPcHMucHVzaChvcCk7XG4gIH1cblxuICBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25zLnNpemUgKyB0aGlzLnByb21pc2VzLnNpemU7XG4gIH1cblxuICBmbHVzaFBlbmRpbmdPcHMoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSgpID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcCA9IHRoaXMucGVuZGluZ09wcy5zaGlmdCgpO1xuICAgIGlmIChvcCkge1xuICAgICAgb3AoKTtcbiAgICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5QaG9lbml4IExpdmVWaWV3IEphdmFTY3JpcHQgQ2xpZW50XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5TZWUgdGhlIGhleGRvY3MgYXQgYGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlld2AgZm9yIGRvY3VtZW50YXRpb24uXG4qL1xuXG5pbXBvcnQgT3JpZ2luYWxMaXZlU29ja2V0LCB7IGlzVXNlZElucHV0IH0gZnJvbSBcIi4vbGl2ZV9zb2NrZXRcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCI7XG5pbXBvcnQgeyBWaWV3SG9vayB9IGZyb20gXCIuL3ZpZXdfaG9va1wiO1xuaW1wb3J0IFZpZXcgZnJvbSBcIi4vdmlld1wiO1xuXG5pbXBvcnQgdHlwZSB7IExpdmVTb2NrZXRKU0NvbW1hbmRzIH0gZnJvbSBcIi4vanNfY29tbWFuZHNcIjtcbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va3NPcHRpb25zIH0gZnJvbSBcIi4vdmlld19ob29rXCI7XG5pbXBvcnQgdHlwZSB7IFNvY2tldCBhcyBQaG9lbml4U29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgTGl2ZVNvY2tldCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXZlU29ja2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0cyBmb3IgcGh4LWRlYm91bmNlIGFuZCBwaHgtdGhyb3R0bGUuXG4gICAqL1xuICBkZWZhdWx0cz86IHtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC1kZWJvdW5jZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICBkZWJvdW5jZT86IG51bWJlcjtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC10aHJvdHRsZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICB0aHJvdHRsZT86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiBmb3IgcGFzc2luZyBjb25uZWN0IHBhcmFtcy5cbiAgICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIExpdmVWaWV3LiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogICAgIChlbCkgPT4ge3ZpZXc6IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtbXktdmlldy1uYW1lXCIsIHRva2VuOiB3aW5kb3cubXlUb2tlbn1cbiAgICpcbiAgICovXG4gIHBhcmFtcz86XG4gICAgfCAoKGVsOiBIVE1MRWxlbWVudCkgPT4geyBba2V5OiBzdHJpbmddOiBhbnkgfSlcbiAgICB8IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgcHJlZml4IHRvIHVzZSBmb3IgYWxsIHBoeCBET00gYW5ub3RhdGlvbnMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwicGh4LVwiLlxuICAgKi9cbiAgYmluZGluZ1ByZWZpeD86IHN0cmluZztcbiAgLyoqXG4gICAqIENhbGxiYWNrcyBmb3IgTGl2ZVZpZXcgaG9va3MuXG4gICAqXG4gICAqIFNlZSBbQ2xpZW50IGhvb2tzIHZpYSBgcGh4LWhvb2tgXShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sI2NsaWVudC1ob29rcy12aWEtcGh4LWhvb2spIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgaG9va3M/OiBIb29rc09wdGlvbnM7XG4gIC8qKiBDYWxsYmFja3MgZm9yIExpdmVWaWV3IHVwbG9hZGVycy4gKi9cbiAgdXBsb2FkZXJzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTsgLy8gVE9ETzogZGVmaW5lIG1vcmUgc3BlY2lmaWNhbGx5XG4gIC8qKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGFwcGx5aW5nIGxvYWRpbmcgc3RhdGVzLiAqL1xuICBsb2FkZXJUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBleGVjdXRpbmcgcGh4LWRpc2Nvbm5lY3RlZCBjb21tYW5kcy4gKi9cbiAgZGlzY29ubmVjdGVkVGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmVsb2FkcyBiZWZvcmUgZW50ZXJpbmcgZmFpbHNhZmUgbW9kZS4gKi9cbiAgbWF4UmVsb2Fkcz86IG51bWJlcjtcbiAgLyoqIE1pbmltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1pbj86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1heD86IG51bWJlcjtcbiAgLyoqIFRpbWUgYmV0d2VlbiByZWxvYWQgYXR0ZW1wdHMgaW4gZmFpbHNhZmUgbW9kZS4gKi9cbiAgZmFpbHNhZmVKaXR0ZXI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBsb2cgZGVidWcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgKHZpZXcsIGtpbmQsIG1zZywgb2JqKSA9PiBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopXG4gICAqL1xuICB2aWV3TG9nZ2VyPzogKHZpZXc6IFZpZXcsIGtpbmQ6IHN0cmluZywgbXNnOiBzdHJpbmcsIG9iajogYW55KSA9PiB2b2lkO1xuICAvKipcbiAgICogT2JqZWN0IG1hcHBpbmcgZXZlbnQgbmFtZXMgdG8gZnVuY3Rpb25zIGZvciBwb3B1bGF0aW5nIGV2ZW50IG1ldGFkYXRhLlxuICAgKlxuICAgKiAgICAgbWV0YWRhdGE6IHtcbiAgICogICAgICAgY2xpY2s6IChlLCBlbCkgPT4ge1xuICAgKiAgICAgICAgIHJldHVybiB7XG4gICAqICAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAqICAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gICAqICAgICAgICAgICBkZXRhaWw6IGUuZGV0YWlsIHx8IDEsXG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9LFxuICAgKiAgICAgICBrZXlkb3duOiAoZSwgZWwpID0+IHtcbiAgICogICAgICAgICByZXR1cm4ge1xuICAgKiAgICAgICAgICAga2V5OiBlLmtleSxcbiAgICogICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICogICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAgICogICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5XG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqXG4gICAqL1xuICBtZXRhZGF0YT86IHsgW2V2ZW50TmFtZTogc3RyaW5nXTogKGU6IEV2ZW50LCBlbDogSFRNTEVsZW1lbnQpID0+IG9iamVjdCB9O1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgc2Vzc2lvblN0b3JhZ2VgLiBGb3IgZXhhbXBsZSwgVGhpcyBjb3VsZFxuICAgKiBoYXBwZW4gaWYgYSBzaXRlIGxvYWRzIGEgY3Jvc3MtZG9tYWluIExpdmVWaWV3IGluIGFuIGlmcmFtZS5cbiAgICpcbiAgICogRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gICAqICAgICAgIGNvbnN0cnVjdG9yKCkgeyB0aGlzLnN0b3JhZ2UgPSB7fSB9XG4gICAqICAgICAgIGdldEl0ZW0oa2V5TmFtZSkgeyByZXR1cm4gdGhpcy5zdG9yYWdlW2tleU5hbWVdIHx8IG51bGwgfVxuICAgKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gICAqICAgICAgIHNldEl0ZW0oa2V5TmFtZSwga2V5VmFsdWUpIHsgdGhpcy5zdG9yYWdlW2tleU5hbWVdID0ga2V5VmFsdWUgfVxuICAgKiAgICAgfVxuICAgKi9cbiAgc2Vzc2lvblN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogU2VlIGBzZXNzaW9uU3RvcmFnZWAgZm9yIGFuIGV4YW1wbGUuXG4gICAqL1xuICBsb2NhbFN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogSWYgc2V0IHRvIGB0cnVlYCwgYHBoeC1jaGFuZ2VgIGV2ZW50cyB3aWxsIGJlIGJsb2NrZWQgKHdpbGwgbm90IGZpcmUpXG4gICAqIHdoaWxlIHRoZSB1c2VyIGlzIGNvbXBvc2luZyBpbnB1dCB1c2luZyBhbiBJTUUgKElucHV0IE1ldGhvZCBFZGl0b3IpLlxuICAgKiBUaGlzIGlzIGRldGVybWluZWQgYnkgdGhlIGBlLmlzQ29tcG9zaW5nYCBwcm9wZXJ0eSBvbiBrZXlib2FyZCBldmVudHMsXG4gICAqIHdoaWNoIGlzIGB0cnVlYCB3aGVuIHRoZSB1c2VyIGlzIGluIHRoZSBwcm9jZXNzIG9mIGVudGVyaW5nIGNvbXBvc2VkIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuICAgKiB3aGVuIHR5cGluZyBKYXBhbmVzZSBvciBDaGluZXNlIHVzaW5nIHJvbWFqaSBvciBwaW55aW4gaW5wdXQgbWV0aG9kcykuXG4gICAqIEJ5IGRlZmF1bHQsIGBwaHgtY2hhbmdlYCB3aWxsIG5vdCBiZSBibG9ja2VkIGR1cmluZyBhIGNvbXBvc2l0aW9uIHNlc3Npb24sXG4gICAqIGJ1dCBub3RlIHRoYXQgdGhlcmUgd2VyZSBpc3N1ZXMgcmVwb3J0ZWQgaW4gb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpLFxuICAgKiB3aGVyZSBhIExpdmVWaWV3IHBhdGNoIHRvIHRoZSBpbnB1dCBjYXVzZWQgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICpcbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuICAgKiAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2lzQ29tcG9zaW5nXG4gICAqIC0gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzMzMjJcbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3Npbmc/OiBib29sZWFuO1xuICAvKiogRE9NIGNhbGxiYWNrcy4gKi9cbiAgZG9tPzoge1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgcXVlcnlpbmcgZWxlbWVudHMgaW4gSlMgY29tbWFuZHMuXG4gICAgICogQHBhcmFtIHNvdXJjZUVsIC0gVGhlIHNvdXJjZSBlbGVtZW50LCBlLmcuIHRoZSBidXR0b24gdGhhdCB3YXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0gcXVlcnkgLSBUaGUgcXVlcnkgdmFsdWUuXG4gICAgICogQHBhcmFtIGRlZmF1bHRRdWVyeSAtIEEgZGVmYXVsdCBxdWVyeSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGlmIG5vIGN1c3RvbSBxdWVyeSBzaG91bGQgYmUgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGpzUXVlcnlTZWxlY3RvckFsbD86IChcbiAgICAgIHNvdXJjZUVsOiBIVE1MRWxlbWVudCxcbiAgICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgICBkZWZhdWx0UXVlcnk6ICgpID0+IEVsZW1lbnRbXSxcbiAgICApID0+IEVsZW1lbnRbXTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaFN0YXJ0PzogKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaEVuZD86IChjb250YWluZXI6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgbmV3IERPTSBub2RlIGlzIGFkZGVkLlxuICAgICAqL1xuICAgIG9uTm9kZUFkZGVkPzogKG5vZGU6IE5vZGUpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGJlZm9yZSBhbiBlbGVtZW50IGlzIHVwZGF0ZWQuXG4gICAgICovXG4gICAgb25CZWZvcmVFbFVwZGF0ZWQ/OiAoZnJvbUVsOiBFbGVtZW50LCB0b0VsOiBFbGVtZW50KSA9PiB2b2lkO1xuICB9O1xuICAvKiogQWxsb3cgcGFzc3Rocm91Z2ggb2Ygb3RoZXIgb3B0aW9ucyB0byB0aGUgUGhvZW5peCBTb2NrZXQgY29uc3RydWN0b3IuICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgcHVibGljIEFQSSBvZiBhIExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGl2ZVNvY2tldEluc3RhbmNlSW50ZXJmYWNlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIExpdmVWaWV3IGNsaWVudC5cbiAgICovXG4gIHZlcnNpb24oKTogc3RyaW5nO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLiBTZWUgYGVuYWJsZVByb2ZpbGluZ2AgYW5kIGBkaXNhYmxlUHJvZmlsaW5nYC5cbiAgICovXG4gIGlzUHJvZmlsZUVuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC4gU2VlIGBlbmFibGVEZWJ1Z2AgYW5kIGBkaXNhYmxlRGVidWdgLlxuICAgKi9cbiAgaXNEZWJ1Z0VuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIFNlZSBgZW5hYmxlRGVidWdgIGFuZCBgZGlzYWJsZURlYnVnYC5cbiAgICovXG4gIGlzRGVidWdEaXNhYmxlZCgpOiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlcyBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIFdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWQsIHRoZSBMaXZlVmlldyBjbGllbnQgd2lsbCBsb2cgZGVidWcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUuXG4gICAqIFNlZSBbRGVidWdnaW5nIGNsaWVudCBldmVudHNdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9qcy1pbnRlcm9wLmh0bWwjZGVidWdnaW5nLWNsaWVudC1ldmVudHMpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlRGVidWcoKTogdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcHJvZmlsaW5nLlxuICAgKlxuICAgKiBXaGVuIHByb2ZpbGluZyBpcyBlbmFibGVkLCB0aGUgTGl2ZVZpZXcgY2xpZW50IHdpbGwgbG9nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZS5cbiAgICovXG4gIGVuYWJsZVByb2ZpbGluZygpOiB2b2lkO1xuICAvKipcbiAgICogRGlzYWJsZXMgZGVidWdnaW5nLlxuICAgKi9cbiAgZGlzYWJsZURlYnVnKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBwcm9maWxpbmcuXG4gICAqL1xuICBkaXNhYmxlUHJvZmlsaW5nKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGVzIGxhdGVuY3kgc2ltdWxhdGlvbi5cbiAgICpcbiAgICogV2hlbiBsYXRlbmN5IHNpbXVsYXRpb24gaXMgZW5hYmxlZCwgdGhlIExpdmVWaWV3IGNsaWVudCB3aWxsIGFkZCBhIGRlbGF5IHRvIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgc2VydmVyLlxuICAgKiBTZWUgW1NpbXVsYXRpbmcgTGF0ZW5jeV0oaHR0cHM6Ly9oZXhkb2NzLnBtL3Bob2VuaXhfbGl2ZV92aWV3L2pzLWludGVyb3AuaHRtbCNzaW11bGF0aW5nLWxhdGVuY3kpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlTGF0ZW5jeVNpbSh1cHBlckJvdW5kTXM6IG51bWJlcik6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBsYXRlbmN5IHNpbXVsYXRpb24uXG4gICAqL1xuICBkaXNhYmxlTGF0ZW5jeVNpbSgpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsYXRlbmN5IHNpbXVsYXRpb24gdXBwZXIgYm91bmQuXG4gICAqL1xuICBnZXRMYXRlbmN5U2ltKCk6IG51bWJlciB8IG51bGw7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBQaG9lbml4IFNvY2tldCBpbnN0YW5jZS5cbiAgICovXG4gIGdldFNvY2tldCgpOiBQaG9lbml4U29ja2V0O1xuICAvKipcbiAgICogQ29ubmVjdHMgdG8gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGNvbm5lY3QoKTogdm9pZDtcbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgLyoqXG4gICAqIENhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIHRyYW5zcG9ydCB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIFBob2VuaXggU29ja2V0LlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQ6IGFueSk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBlbmNvZGVkIEpTIGNvbW1hbmQsIHRhcmdldGluZyB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogU2VlIFtgUGhvZW5peC5MaXZlVmlldy5KU2BdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9QaG9lbml4LkxpdmVWaWV3LkpTLmh0bWwpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZXhlY0pTKGVsOiBIVE1MRWxlbWVudCwgZW5jb2RlZEpTOiBzdHJpbmcsIGV2ZW50VHlwZT86IHN0cmluZyB8IG51bGwpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIFNlZSBbSmF2YVNjcmlwdCBpbnRlcm9wZXJhYmlsaXR5XShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGpzKCk6IExpdmVTb2NrZXRKU0NvbW1hbmRzO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBkZXNjcmliaW5nIHRoZSBMaXZlU29ja2V0IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpdmVTb2NrZXRDb25zdHJ1Y3RvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgYFwid3NzOi8vZXhhbXBsZS5jb20vbGl2ZVwiYCxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIi9saXZlXCJgIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICAgKiBAcGFyYW0gc29ja2V0IC0gdGhlIHJlcXVpcmVkIFBob2VuaXggU29ja2V0IGNsYXNzIGltcG9ydGVkIGZyb20gXCJwaG9lbml4XCIuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbiAgICogICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICogICAgIGxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHsuLi59KVxuICAgKlxuICAgKiBAcGFyYW0gb3B0cyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBuZXcgKFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgc29ja2V0OiB0eXBlb2YgUGhvZW5peFNvY2tldCxcbiAgICBvcHRzPzogTGl2ZVNvY2tldE9wdGlvbnMsXG4gICk6IExpdmVTb2NrZXRJbnN0YW5jZUludGVyZmFjZTtcbn1cblxuLy8gYmVjYXVzZSBMaXZlU29ja2V0IGlzIGluIEpTIChmb3Igbm93KSwgd2UgY2FzdCBpdCB0byBvdXIgZGVmaW5lZCBUeXBlU2NyaXB0IGNvbnN0cnVjdG9yLlxuY29uc3QgTGl2ZVNvY2tldCA9IE9yaWdpbmFsTGl2ZVNvY2tldCBhcyB1bmtub3duIGFzIExpdmVTb2NrZXRDb25zdHJ1Y3RvcjtcblxuLyoqIENyZWF0ZXMgYSBob29rIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBob29rLlxuICogQHBhcmFtIGNhbGxiYWNrcyAtIFRoZSBsaXN0IG9mIGhvb2sgY2FsbGJhY2tzLCBzdWNoIGFzIG1vdW50ZWQsXG4gKiAgIHVwZGF0ZWQsIGRlc3Ryb3llZCwgZXRjLlxuICpcbiAqICpOb3RlKjogYGNyZWF0ZUhvb2tgIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGBjb25uZWN0ZWRDYWxsYmFja2AgbGlmZWN5Y2xlXG4gKiB3aGljaCBpcyB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTS4gSWYgeW91IHRyeVxuICogdG8gY2FsbCBgY3JlYXRlSG9va2AgZnJvbSB0aGUgY29uc3RydWN0b3IsIGFuIGVycm9yIHdpbGwgYmUgbG9nZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gKiAgIGNvbm5lY3RlZENhbGxiYWNrKCl7XG4gKiAgICAgbGV0IG9uTGl2ZVZpZXdNb3VudGVkID0gKCkgPT4gdGhpcy5ob29rLnB1c2hFdmVudCguLi4pKVxuICogICAgIHRoaXMuaG9vayA9IGNyZWF0ZUhvb2sodGhpcywge21vdW50ZWQ6IG9uTGl2ZVZpZXdNb3VudGVkfSlcbiAqICAgfVxuICogfVxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIEhvb2sgaW5zdGFuY2UgZm9yIHRoZSBjdXN0b20gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSG9vayhlbDogSFRNTEVsZW1lbnQsIGNhbGxiYWNrczogSG9vayk6IFZpZXdIb29rIHtcbiAgbGV0IGV4aXN0aW5nSG9vayA9IERPTS5nZXRDdXN0b21FbEhvb2soZWwpO1xuICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSG9vaztcbiAgfVxuXG4gIGxldCBob29rID0gbmV3IFZpZXdIb29rKFZpZXcuY2xvc2VzdFZpZXcoZWwpLCBlbCwgY2FsbGJhY2tzKTtcbiAgRE9NLnB1dEN1c3RvbUVsSG9vayhlbCwgaG9vayk7XG4gIHJldHVybiBob29rO1xufVxuXG5leHBvcnQgeyBMaXZlU29ja2V0LCBpc1VzZWRJbnB1dCwgY3JlYXRlSG9vaywgVmlld0hvb2ssIEhvb2ssIEhvb2tzT3B0aW9ucyB9O1xuIiwgImltcG9ydCBcInBob2VuaXhfaHRtbFwiO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcbmltcG9ydCB7IExpdmVTb2NrZXQgfSBmcm9tIFwicGhvZW5peF9saXZlX3ZpZXdcIjtcbmltcG9ydCBDbGlwYm9hcmRKUyBmcm9tIFwiY2xpcGJvYXJkXCI7XG5pbXBvcnQgVG9hc3RpZnkgZnJvbSBcInRvYXN0aWZ5LWpzXCI7XG5pbXBvcnQgdG9wYmFyIGZyb20gXCJ0b3BiYXJcIjtcblxudG9wYmFyLmNvbmZpZyh7XG4gIGJhckNvbG9yczogeyAwOiBcInJnYig2NywgNTYsIDIwMilcIiB9LFxuICBzaGFkb3dDb2xvcjogXCJyZ2JhKDAsIDAsIDAsIC4zKVwiLFxuICBjbGFzc05hbWU6IFwidG9wYmFyXCIsXG59KTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCAoaW5mbykgPT4gdG9wYmFyLnNob3coKSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpwYWdlLWxvYWRpbmctc3RvcFwiLCAoKSA9PiB0b3BiYXIuaGlkZSgpKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnN1Y2Nlc3NcIiwgKGUpID0+IHtcbiAgVG9hc3RpZnkoe1xuICAgIHRleHQ6IGUuZGV0YWlsLm1zZyxcbiAgICBjbGFzc05hbWU6IFwidG9hc3RfX2NvbnRhaW5lci0tc3VjY2Vzc1wiLFxuICB9KS5zaG93VG9hc3QoKTtcbn0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6ZXJyb3JcIiwgKGUpID0+IHtcbiAgVG9hc3RpZnkoe1xuICAgIHRleHQ6IGUuZGV0YWlsLm1zZyxcbiAgICBjbGFzc05hbWU6IFwidG9hc3RfX2NvbnRhaW5lci0tZXJyb3JcIixcbiAgfSkuc2hvd1RvYXN0KCk7XG59KTtcblxubGV0IEhvb2tzID0ge307XG5cbkhvb2tzLkVtYmVkQ29tcG9uZW50ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImxpdmVfYWRtaW46bW92ZV9lbWJlZFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgZW1iZWRFbCA9IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCBpbmRleEVsID0gZW1iZWRFbC5xdWVyeVNlbGVjdG9yKFwiLmVtYmVkX19pbmRleFwiKTtcbiAgICAgIGNvbnN0IGZpZWxkRWwgPSBlbWJlZEVsLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gK2luZGV4RWwudmFsdWUgKyArZS50YXJnZXQuZGF0YXNldC5kaXI7XG4gICAgICBpbmRleEVsLnZhbHVlID0gbmV3SW5kZXg7XG5cbiAgICAgIGNvbnN0IHRhcmdldEVsID0gZmllbGRFbC5xdWVyeVNlbGVjdG9yQWxsKFwiLmVtYmVkX19pbmRleFwiKVtuZXdJbmRleF07XG4gICAgICB0YXJnZXRFbC52YWx1ZSA9ICt0YXJnZXRFbC52YWx1ZSArICtlLnRhcmdldC5kYXRhc2V0LmRpciAqIC0xO1xuXG4gICAgICBpbmRleEVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJsaXZlX2FkbWluOmVtYmVkX2FkZFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3Qgc29ydElucHV0ID0gZS50YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgIHNvcnRJbnB1dC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIHNvcnRJbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjplbWJlZF9kcm9wXCIsIChlKSA9PiB7XG4gICAgICBlLnRhcmdldC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG4gICAgICBjb25zdCBkZWxldGVJbnB1dCA9IGUudGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICBkZWxldGVJbnB1dC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIGRlbGV0ZUlucHV0LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJsaXZlX2FkbWluOmVtYmVkX2RlbGV0ZVwiLCAoZSkgPT4ge1xuICAgICAgZS50YXJnZXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuXG4gICAgICBjb25zdCBkZWxldGVJbnB1dCA9IGUudGFyZ2V0XG4gICAgICAgIC5jbG9zZXN0KFwiLmVtYmVkX19ncm91cFwiKVxuICAgICAgICAucXVlcnlTZWxlY3RvcignaW5wdXRbdmFsdWU9XCJcIl0nKTtcbiAgICAgIGRlbGV0ZUlucHV0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBkZWxldGVJbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSksXG4gICAgICApO1xuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuU2VhcmNoU2VsZWN0ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuaGFuZGxlRXZlbnQoXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5lbFxuICAgICAgICAucXVlcnlTZWxlY3RvcihcImlucHV0XCIpXG4gICAgICAgIC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5Ib29rcy5BcnJheUlucHV0ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuaGFuZGxlRXZlbnQoXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5lbFxuICAgICAgICAucXVlcnlTZWxlY3RvcihcImlucHV0XCIpXG4gICAgICAgIC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5Ib29rcy5NYXBJbnB1dCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLmhhbmRsZUV2ZW50KFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIHRoaXMuZWxcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKVxuICAgICAgICAuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuVmlld1BhZ2UgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjphY3Rpb25cIiwgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lID09PSBcIkZPUk1cIikge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBbLi4ubmV3IEZvcm1EYXRhKGUudGFyZ2V0KV0ucmVkdWNlKFxuICAgICAgICAgIChwYXJhbXMsIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYXJnc1tdXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ucGFyYW1zLCBhcmdzOiBbLi4ucGFyYW1zLmFyZ3MsIHZhbF0gfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLnBhcmFtcywgW2tleV06IHZhbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBhcmdzOiBbXSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGUudGFyZ2V0LnJlc2V0KCk7XG5cbiAgICAgICAgdGhpcy5wdXNoRXZlbnRUbyh0aGlzLmVsLCBcImFjdGlvblwiLCBwYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wdXNoRXZlbnRUbyh0aGlzLmVsLCBcImFjdGlvblwiLCB7IG5hbWU6IGUudGFyZ2V0LmRhdGFzZXQuYWN0aW9uIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuSW5kZXhQYWdlID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBbXTtcblxuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImxpdmVfYWRtaW46YWN0aW9uXCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQudGFnTmFtZSA9PT0gXCJGT1JNXCIpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gWy4uLm5ldyBGb3JtRGF0YShlLnRhcmdldCldLnJlZHVjZShcbiAgICAgICAgICAocGFyYW1zLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcImFyZ3NbXVwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLnBhcmFtcywgYXJnczogWy4uLnBhcmFtcy5hcmdzLCB2YWxdIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5wYXJhbXMsIFtrZXldOiB2YWwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgYXJnczogW10gfSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnB1c2hFdmVudFRvKHRoaXMuZWwsIFwiYWN0aW9uXCIsIHsgLi4ucGFyYW1zLCBpZHM6IHRoaXMuc2VsZWN0ZWQgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnB1c2hFdmVudFRvKHRoaXMuZWwsIFwiYWN0aW9uXCIsIHtcbiAgICAgICAgICBuYW1lOiBlLnRhcmdldC5kYXRhc2V0LmFjdGlvbixcbiAgICAgICAgICBpZHM6IHRoaXMuc2VsZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjp0b2dnbGVfc2VsZWN0XCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQuaWQgPT09IFwic2VsZWN0LWFsbFwiKSB7XG4gICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbChcIi5yZXNvdXJjZV9fc2VsZWN0XCIpXG4gICAgICAgICAgLmZvckVhY2goKGJveCkgPT4gKGJveC5jaGVja2VkID0gZS50YXJnZXQuY2hlY2tlZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKFwiI3NlbGVjdC1hbGxcIikuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGVkID0gQXJyYXkuZnJvbShcbiAgICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbZGF0YS1yZWNvcmQta2V5XTpjaGVja2VkXCIpLFxuICAgICAgICAoZSkgPT4gZS5kYXRhc2V0LnJlY29yZEtleSxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItc2VsZWN0XCIpLnN0eWxlLnJlbW92ZVByb3BlcnR5KFwiZGlzcGxheVwiKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItbmF2XCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZm9vdGVyLW5hdlwiKS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcImRpc3BsYXlcIik7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZm9vdGVyLXNlbGVjdFwiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIHVwZGF0ZWQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IFtdO1xuXG4gICAgdmFyIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmRKUyh0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuY2VsbF9fY29weVwiKSwge1xuICAgICAgdGFyZ2V0OiBmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICByZXR1cm4gdHJpZ2dlci5jbG9zZXN0KFwiLnJlc291cmNlX19jZWxsXCIpLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNsaXBib2FyZC5vbihcInN1Y2Nlc3NcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIFRvYXN0aWZ5KHtcbiAgICAgICAgdGV4dDogZS50cmlnZ2VyLmRhdGFzZXQubWVzc2FnZSxcbiAgICAgICAgY2xhc3NOYW1lOiBcInRvYXN0X19jb250YWluZXJcIixcbiAgICAgIH0pLnNob3dUb2FzdCgpO1xuICAgIH0pO1xuICB9LFxufTtcblxubGV0IGNzcmZUb2tlbiA9IGRvY3VtZW50XG4gIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcbiAgLmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIik7XG5sZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7XG4gIGhvb2tzOiBIb29rcyxcbiAgcGFyYW1zOiB7IF9jc3JmX3Rva2VuOiBjc3JmVG9rZW4gfSxcbn0pO1xuXG4vLyBDb25uZWN0IGlmIHRoZXJlIGFyZSBhbnkgTGl2ZVZpZXdzIG9uIHRoZSBwYWdlXG5saXZlU29ja2V0LmNvbm5lY3QoKTtcblxuaWYgKEVOViA9PSBcImRldlwiKSB7XG4gIGxpdmVTb2NrZXQuZW5hYmxlRGVidWcoKTtcbiAgbGl2ZVNvY2tldC5lbmFibGVMYXRlbmN5U2ltKHByb2Nlc3MuZW52LkxBVEVOQ1lfU0lNKTtcbn1cblxud2luZG93LmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQU1BLE9BQUMsU0FBUyxpQ0FBaUMsTUFBTSxTQUFTO0FBQ3pELFlBQUcsT0FBTyxZ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LEVBQUUsYUFBYSxVQUFVO0FBQUEsRUFDbkMsQ0FBQztBQUdELGFBQVcsUUFBUTtBQUVuQixNQUFJLE9BQU8sT0FBTztBQUNoQixlQUFXLFlBQVk7QUFDdkIsZUFBVyxpQkFBaUIsQ0FBdUI7QUFBQSxFQUNyRDtBQUVBLFNBQU8sYUFBYTsiLAogICJuYW1lcyI6IFsiX193ZWJwYWNrX3JlcXVpcmVfXyIsICJDbGlwYm9hcmRBY3Rpb25DdXQiLCAiQ2xpcGJvYXJkQWN0aW9uQ29weSIsICJfdHlwZW9mIiwgIm9iaiIsICJDbGlwYm9hcmRBY3Rpb25EZWZhdWx0IiwgIl9zZXRQcm90b3R5cGVPZiIsICJvIiwgInAiLCAic2VsZiIsICJfZ2V0UHJvdG90eXBlT2YiLCAiQ2xpcGJvYXJkIiwgImFjdGlvbiIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJyYW5nZSIsICJnbG9iYWwiLCAiVG9hc3RpZnkiLCAic2VsZiIsICJ3aW5kb3ciLCAiZG9jdW1lbnQiLCAidG9wYmFyIiwgIkN1c3RvbUV2ZW50IiwgImNsb3N1cmUiLCAibGl2ZVNvY2tldCIsICJjbG9zdXJlIiwgImRvYyIsICJlIiwgImlzRW1wdHkiLCAiZmlsZSIsICJtb3JwaEF0dHJzIiwgIm1vcnBoZG9tIiwgImNoaWxkcmVuT25seSIsICJ0YXJnZXRDb250YWluZXIiLCAiY2xvbmUiLCAiZWwiLCAiaW5wdXRzVW51c2VkIiwgIm9ubHlIaWRkZW5JbnB1dHMiLCAibG9jayIsICJsb2FkaW5nIiwgImVudHJ5IiwgImlucHV0IiwgImNsb3N1cmUiLCAiTGl2ZVNvY2tldCIsICJ0b3BiYXIiLCAiVG9hc3RpZnkiLCAiSG9va3MiLCAicGFyYW1zIiwgImUiLCAiQ2xpcGJvYXJkSlMiXQp9Cg==