diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..747353e --- /dev/null +++ b/bun.lock @@ -0,0 +1,635 @@ +{ + "lockfileVersion": 1, + "configVersion": 0, + "workspaces": { + "": { + "name": "@anthropic-ai/claude-code", + "dependencies": { + "@anthropic-ai/sdk": "^0.39.0", + "@commander-js/extra-typings": "^13.1.0", + "@growthbook/growthbook": "^1.4.0", + "@modelcontextprotocol/sdk": "^1.12.1", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.57.0", + "@opentelemetry/core": "^1.30.0", + "@opentelemetry/sdk-logs": "^0.57.0", + "@opentelemetry/sdk-metrics": "^1.30.0", + "@opentelemetry/sdk-trace-base": "^1.30.0", + "@xterm/addon-fit": "^0.10.0", + "@xterm/addon-search": "^0.15.0", + "@xterm/addon-unicode11": "^0.8.0", + "@xterm/addon-web-links": "^0.11.0", + "@xterm/addon-webgl": "^0.18.0", + "@xterm/xterm": "^5.5.0", + "auto-bind": "^5.0.1", + "axios": "^1.7.0", + "chalk": "^5.4.0", + "chokidar": "^4.0.0", + "cli-boxes": "^3.0.0", + "code-excerpt": "^4.0.0", + "diff": "^7.0.0", + "execa": "^9.5.0", + "figures": "^6.1.0", + "fuse.js": "^7.0.0", + "highlight.js": "^11.11.0", + "ignore": "^6.0.0", + "lodash-es": "^4.17.21", + "marked": "^15.0.0", + "node-pty": "^1.1.0", + "p-map": "^7.0.0", + "picomatch": "^4.0.0", + "proper-lockfile": "^4.1.2", + "qrcode": "^1.5.0", + "react": "^19.0.0", + "react-reconciler": "^0.31.0", + "semver": "^7.6.0", + "stack-utils": "^2.0.6", + "strip-ansi": "^7.1.0", + "supports-hyperlinks": "^3.1.0", + "tree-kill": "^1.2.2", + "type-fest": "^4.30.0", + "undici": "^7.3.0", + "usehooks-ts": "^3.1.0", + "wrap-ansi": "^9.0.0", + "ws": "^8.18.0", + "yaml": "^2.6.0", + "zod": "^3.24.0", + }, + "devDependencies": { + "@biomejs/biome": "^1.9.0", + "@types/diff": "^7.0.0", + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.10.0", + "@types/picomatch": "^3.0.0", + "@types/proper-lockfile": "^4.1.4", + "@types/react": "^19.0.0", + "@types/semver": "^7.5.8", + "@types/stack-utils": "^2.0.3", + "@types/ws": "^8.5.0", + "esbuild": "^0.25.0", + "typescript": "^5.7.0", + }, + }, + }, + "packages": { + "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.39.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg=="], + + "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.9.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.9.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], + + "@commander-js/extra-typings": ["@commander-js/extra-typings@13.1.0", "", { "peerDependencies": { "commander": "~13.1.0" } }, "sha512-q5P52BYb1hwVWE6dtID7VvuJWrlfbCv4klj7BjUUOqMz4jbSZD4C9fJ9lRjL2jnBGTg+gDDlaXN51rkWcLk4fg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + + "@growthbook/growthbook": ["@growthbook/growthbook@1.6.5", "", { "dependencies": { "dom-mutator": "^0.6.0" } }, "sha512-mUaMsgeUTpRIUOTn33EUXHRK6j7pxBjwqH4WpQyq+pukjd1AIzWlEa6w7i6bInJUcweGgP2beXZmaP6b6UPn7A=="], + + "@hono/node-server": ["@hono/node-server@1.19.12", "", { "peerDependencies": { "hono": "^4" } }, "sha512-txsUW4SQ1iilgE0l9/e9VQWmELXifEFvmdA1j6WFh/aFPj99hIntrSsq/if0UWyGVkmrRPKA1wCeP+UCr1B9Uw=="], + + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.1", "", {}, "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="], + + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/core": ["@opentelemetry/core@1.30.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ=="], + + "@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="], + + "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-TXFHJ5c+BKggWbdEQ/inpgIzEmS2BGQowLE9UhsMd7YYlUfBQJ4uax0VF/B5NYigdM/75OoJGhAV3upEhK+3gg=="], + + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog=="], + + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], + + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], + + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], + + "@types/diff": ["@types/diff@7.0.2", "", {}, "sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q=="], + + "@types/lodash": ["@types/lodash@4.17.24", "", {}, "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ=="], + + "@types/lodash-es": ["@types/lodash-es@4.17.12", "", { "dependencies": { "@types/lodash": "*" } }, "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ=="], + + "@types/node": ["@types/node@22.19.15", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg=="], + + "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], + + "@types/picomatch": ["@types/picomatch@3.0.2", "", {}, "sha512-n0i8TD3UDB7paoMMxA3Y65vUncFJXjcUf7lQY7YyKGl6031FNjfsLs6pdLFCy2GNFxItPJG8GvvpbZc2skH7WA=="], + + "@types/proper-lockfile": ["@types/proper-lockfile@4.1.4", "", { "dependencies": { "@types/retry": "*" } }, "sha512-uo2ABllncSqg9F1D4nugVl9v93RmjxF6LJzQLMLDdPaXCUIDPeOJ21Gbqi43xNKzBi/WQ0Q0dICqufzQbMjipQ=="], + + "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], + + "@types/retry": ["@types/retry@0.12.5", "", {}, "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw=="], + + "@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="], + + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + + "@xterm/addon-fit": ["@xterm/addon-fit@0.10.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ=="], + + "@xterm/addon-search": ["@xterm/addon-search@0.15.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-ZBZKLQ+EuKE83CqCmSSz5y1tx+aNOCUaA7dm6emgOX+8J9H1FWXZyrKfzjwzV+V14TV3xToz1goIeRhXBS5qjg=="], + + "@xterm/addon-unicode11": ["@xterm/addon-unicode11@0.8.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-LxinXu8SC4OmVa6FhgwsVCBZbr8WoSGzBl2+vqe8WcQ6hb1r6Gj9P99qTNdPiFPh4Ceiu2pC8xukZ6+2nnh49Q=="], + + "@xterm/addon-web-links": ["@xterm/addon-web-links@0.11.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-nIHQ38pQI+a5kXnRaTgwqSHnX7KE6+4SVoceompgHL26unAxdfP6IPqUTSYPQgSwM56hsElfoNrrW5V7BUED/Q=="], + + "@xterm/addon-webgl": ["@xterm/addon-webgl@0.18.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-xCnfMBTI+/HKPdRnSOHaJDRqEpq2Ugy8LEj9GiY4J3zJObo3joylIFaMvzBwbYRg8zLtkO0KQaStCeSfoaI2/w=="], + + "@xterm/xterm": ["@xterm/xterm@5.5.0", "", {}, "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + + "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], + + "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + + "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" }, "peerDependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], + + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "auto-bind": ["auto-bind@5.0.1", "", {}, "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg=="], + + "axios": ["axios@1.14.0", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } }, "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ=="], + + "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], + + "cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="], + + "code-excerpt": ["code-excerpt@4.0.0", "", { "dependencies": { "convert-to-spaces": "^2.0.1" } }, "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], + + "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "convert-to-spaces": ["convert-to-spaces@2.0.1", "", {}, "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ=="], + + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "diff": ["diff@7.0.0", "", {}, "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw=="], + + "dijkstrajs": ["dijkstrajs@1.0.3", "", {}, "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="], + + "dom-mutator": ["dom-mutator@0.6.0", "", {}, "sha512-iCt9o0aYfXMUkz/43ZOAUFQYotjGB+GNbYJiJdz4TgXkyToXbbRy5S6FbTp72lRBtfpUMwEc1KmpFEU4CZeoNg=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": "bin/esbuild" }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], + + "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + + "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="], + + "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], + + "express-rate-limit": ["express-rate-limit@8.3.2", "", { "dependencies": { "ip-address": "10.1.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], + + "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], + + "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], + + "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + + "form-data-encoder": ["form-data-encoder@1.7.2", "", {}, "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="], + + "formdata-node": ["formdata-node@4.4.1", "", { "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" } }, "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "fuse.js": ["fuse.js@7.1.0", "", {}, "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-east-asian-width": ["get-east-asian-width@1.5.0", "", {}, "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "highlight.js": ["highlight.js@11.11.1", "", {}, "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w=="], + + "hono": ["hono@4.12.9", "", {}, "sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA=="], + + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + + "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], + + "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], + + "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], + + "ignore": ["ignore@6.0.2", "", {}, "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + + "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], + + "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jose": ["jose@6.2.2", "", {}, "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="], + + "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "lodash-es": ["lodash-es@4.17.23", "", {}, "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg=="], + + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "marked": ["marked@15.0.12", "", { "bin": "bin/marked.js" }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-pty": ["node-pty@1.1.0", "", { "dependencies": { "node-addon-api": "^7.1.0" } }, "sha512-20JqtutY6JPXTUnL0ij1uad7Qe1baT46lyolh2sSENDd4sTzKZ4nmAFkeAARDKwmlLjPx6XKRlwRUxwjOy+lUg=="], + + "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "p-map": ["p-map@7.0.4", "", {}, "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-to-regexp": ["path-to-regexp@8.4.1", "", {}, "sha512-fvU78fIjZ+SBM9YwCknCvKOUKkLVqtWDVctl0s7xIqfmfb38t2TT4ZU2gHm+Z8xGwgW+QWEU3oQSAzIbo89Ggw=="], + + "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], + + "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="], + + "pngjs": ["pngjs@5.0.0", "", {}, "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="], + + "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="], + + "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], + + "qrcode": ["qrcode@1.5.4", "", { "dependencies": { "dijkstrajs": "^1.0.1", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, "bin": "bin/qrcode" }, "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg=="], + + "qs": ["qs@6.15.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], + + "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], + + "react-reconciler": ["react-reconciler@0.31.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "require-main-filename": ["require-main-filename@2.0.0", "", {}, "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="], + + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], + + "semver": ["semver@7.7.4", "", { "bin": "bin/semver.js" }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], + + "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], + + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-hyperlinks": ["supports-hyperlinks@3.2.0", "", { "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "tree-kill": ["tree-kill@1.2.2", "", { "bin": "cli.js" }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici": ["undici@7.24.6", "", {}, "sha512-Xi4agocCbRzt0yYMZGMA6ApD7gvtUFaxm4ZmeacWI4cZxaF6C+8I8QfofC20NAePiB/IcvZmzkJ7XPa471AEtA=="], + + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "usehooks-ts": ["usehooks-ts@3.1.1", "", { "dependencies": { "lodash.debounce": "^4.0.8" }, "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-I4diPp9Cq6ieSUH2wu+fDAVQO43xwtulo+fKEidHUwZPnYImbtkTjzIJYcDcJqxgmX31GVqNFURodvcgHcW0pA=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-module": ["which-module@2.0.1", "", {}, "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="], + + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="], + + "y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], + + "yaml": ["yaml@2.8.3", "", { "bin": "bin.mjs" }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], + + "yargs": ["yargs@15.4.1", "", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="], + + "yargs-parser": ["yargs-parser@18.1.3", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="], + + "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], + + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], + + "@anthropic-ai/sdk/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], + + "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "cliui/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "proper-lockfile/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "@anthropic-ai/sdk/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + } +} diff --git a/src/server/web/admin.ts b/src/server/web/admin.ts new file mode 100644 index 0000000..3708c36 --- /dev/null +++ b/src/server/web/admin.ts @@ -0,0 +1,188 @@ +import { Router } from "express"; +import { join } from "path"; +import { readFileSync } from "fs"; +import type { Request, Response } from "express"; +import type { AuthenticatedRequest } from "./auth/adapter.js"; +import type { SessionManager } from "./session-manager.js"; +import type { UserStore } from "./user-store.js"; + +/** + * Admin dashboard routes. + * + * All routes under /admin require the requesting user to have isAdmin = true. + * The caller (pty-server.ts) is responsible for applying the auth middleware + * before mounting this router. + */ + +function requireAdmin(req: Request, res: Response, next: () => void): void { + const user = (req as AuthenticatedRequest).user; + if (!user?.isAdmin) { + res.status(403).json({ error: "Forbidden" }); + return; + } + next(); +} + +export function createAdminRouter( + sessionManager: SessionManager, + userStore: UserStore, +): Router { + const router = Router(); + + // All admin routes require admin role. + router.use(requireAdmin); + + // ── Dashboard UI ────────────────────────────────────────────────────────── + + router.get("/", (_req, res) => { + try { + const p = join(import.meta.dirname, "public/admin.html"); + res.setHeader("Content-Type", "text/html"); + res.send(readFileSync(p, "utf8")); + } catch { + res.setHeader("Content-Type", "text/html"); + res.send(INLINE_ADMIN_HTML); + } + }); + + // ── API: all active sessions ────────────────────────────────────────────── + + /** + * GET /admin/sessions + * Returns all active sessions across all users. + */ + router.get("/sessions", (_req, res) => { + const sessions = sessionManager.getAllSessions().map((s) => ({ + id: s.token, + userId: s.userId, + createdAt: s.created, + ageMs: Date.now() - new Date(s.created).getTime(), + alive: s.alive, + })); + res.json({ sessions }); + }); + + // ── API: all connected users ────────────────────────────────────────────── + + /** + * GET /admin/users + * Returns all users that currently have at least one active session. + */ + router.get("/users", (_req, res) => { + res.json({ users: userStore.list() }); + }); + + // ── API: force-kill a session ───────────────────────────────────────────── + + /** + * DELETE /admin/sessions/:token + * Force-kills the specified session regardless of which user owns it. + */ + router.delete("/sessions/:token", (req, res) => { + const { token } = req.params; + const session = sessionManager.getSession(token); + if (!session) { + res.status(404).json({ error: "Session not found" }); + return; + } + sessionManager.destroySession(token); + res.json({ ok: true, destroyed: token }); + }); + + return router; +} + +// ── Inline admin dashboard HTML ─────────────────────────────────────────────── + +const INLINE_ADMIN_HTML = ` + + + + + Claude Code — Admin + + + +

Admin Dashboard

+

Claude Code — multi-user session management

+ + + +

Connected Users

+ + + +
User IDEmail / NameSessionsFirst seen
Loading…
+ +

Active Sessions

+ + + +
Session IDUser IDAgeAction
Loading…
+ +
+ + + +`; diff --git a/src/server/web/pty-server.ts b/src/server/web/pty-server.ts index ea56b59..ff3d1c7 100644 --- a/src/server/web/pty-server.ts +++ b/src/server/web/pty-server.ts @@ -1,91 +1,182 @@ import express from "express"; import { createServer } from "http"; +import { mkdirSync } from "fs"; import path from "path"; import { spawn } from "node-pty"; import { WebSocketServer } from "ws"; -import { ConnectionRateLimiter, validateAuthToken } from "./auth.js"; +import type { IncomingMessage } from "http"; +import { ConnectionRateLimiter } from "./auth.js"; import { SessionManager } from "./session-manager.js"; +import { UserStore } from "./user-store.js"; +import { createAdminRouter } from "./admin.js"; +import { SessionStore } from "./auth/adapter.js"; +import { TokenAuthAdapter } from "./auth/token-auth.js"; +import { OAuthAdapter } from "./auth/oauth-auth.js"; +import { ApiKeyAdapter } from "./auth/apikey-auth.js"; +import type { AuthAdapter, AuthUser } from "./auth/adapter.js"; + +// ── Configuration ───────────────────────────────────────────────────────────── -// Configuration from environment const PORT = parseInt(process.env.PORT ?? "3000", 10); const HOST = process.env.HOST ?? "0.0.0.0"; const MAX_SESSIONS = parseInt(process.env.MAX_SESSIONS ?? "10", 10); +const MAX_SESSIONS_PER_USER = parseInt(process.env.MAX_SESSIONS_PER_USER ?? "3", 10); +const MAX_SESSIONS_PER_HOUR = parseInt(process.env.MAX_SESSIONS_PER_HOUR ?? "10", 10); const ALLOWED_ORIGINS = process.env.ALLOWED_ORIGINS?.split(",") ?? []; -const GRACE_PERIOD_MS = parseInt( - process.env.SESSION_GRACE_MS ?? String(5 * 60_000), - 10, -); -const SCROLLBACK_BYTES = parseInt( - process.env.SCROLLBACK_BYTES ?? String(100 * 1024), - 10, -); - -// Resolve the claude CLI binary +const GRACE_PERIOD_MS = parseInt(process.env.SESSION_GRACE_MS ?? String(5 * 60_000), 10); +const SCROLLBACK_BYTES = parseInt(process.env.SCROLLBACK_BYTES ?? String(100 * 1024), 10); const CLAUDE_BIN = process.env.CLAUDE_BIN ?? "claude"; +const AUTH_PROVIDER = process.env.AUTH_PROVIDER ?? "token"; +const SESSION_SECRET = process.env.SESSION_SECRET ?? crypto.randomUUID(); +const USER_HOME_BASE = process.env.USER_HOME_BASE ?? "/home/claude/users"; + +// ── Auth adapter ────────────────────────────────────────────────────────────── + +const sessionStore = new SessionStore(SESSION_SECRET); + +let authAdapter: AuthAdapter; +switch (AUTH_PROVIDER) { + case "oauth": + authAdapter = new OAuthAdapter(sessionStore); + break; + case "apikey": + authAdapter = new ApiKeyAdapter(sessionStore); + break; + default: + authAdapter = new TokenAuthAdapter(); +} + +// ── Express app ─────────────────────────────────────────────────────────────── const app = express(); app.use(express.json()); +app.use(express.urlencoded({ extended: false })); const server = createServer(app); -// --- Session Manager --- +// Register auth routes (login, callback, logout) before static files so they +// take priority over any index.html fallback. +authAdapter.setupRoutes(app); + +// ── User store ──────────────────────────────────────────────────────────────── + +const userStore = new UserStore(); + +// ── Session Manager ─────────────────────────────────────────────────────────── + +/** Returns the user-specific home directory, creating it if needed. */ +function userHomeDir(userId: string): string { + const dir = path.join(USER_HOME_BASE, userId); + try { + mkdirSync(path.join(dir, ".claude"), { recursive: true }); + } catch { + // Already exists or no permission — fail silently; PTY spawn will surface any real issue. + } + return dir; +} const sessionManager = new SessionManager( MAX_SESSIONS, - (cols, rows) => - spawn(CLAUDE_BIN, [], { + (cols, rows, user?: AuthUser) => { + const userId = user?.id ?? "default"; + const home = userHomeDir(userId); + return spawn(CLAUDE_BIN, [], { name: "xterm-256color", cols, rows, - cwd: process.env.WORK_DIR ?? process.cwd(), + cwd: process.env.WORK_DIR ?? home, env: { ...process.env, TERM: "xterm-256color", COLORTERM: "truecolor", + HOME: home, + // Inject the user's own API key when using apikey auth provider. + ...(user?.apiKey ? { ANTHROPIC_API_KEY: user.apiKey } : {}), }, - }), + }); + }, GRACE_PERIOD_MS, SCROLLBACK_BYTES, + MAX_SESSIONS_PER_USER, + MAX_SESSIONS_PER_HOUR, ); -// --- HTTP routes --- +// ── HTTP routes ─────────────────────────────────────────────────────────────── app.get("/health", (_req, res) => { res.json({ status: "ok", activeSessions: sessionManager.activeCount, maxSessions: MAX_SESSIONS, + authProvider: AUTH_PROVIDER, }); }); -app.get("/api/sessions", (_req, res) => { - res.json(sessionManager.listSessions()); +/** + * GET /api/sessions — list the current user's sessions. + * Requires authentication. Admins see all sessions. + */ +app.get("/api/sessions", authAdapter.requireAuth.bind(authAdapter), (req, res) => { + const user = (req as express.Request & { user: AuthUser }).user; + const sessions = user.isAdmin + ? sessionManager.getAllSessions() + : sessionManager.getUserSessions(user.id); + res.json(sessions); }); -app.delete("/api/sessions/:token", (req, res) => { - const { token } = req.params; - const session = sessionManager.getSession(token); - if (!session) { - res.status(404).json({ error: "Session not found" }); - return; - } - sessionManager.destroySession(token); - res.status(204).end(); -}); +/** + * DELETE /api/sessions/:token — kill a session. + * Users may only kill their own sessions; admins may kill any session. + */ +app.delete( + "/api/sessions/:token", + authAdapter.requireAuth.bind(authAdapter), + (req, res) => { + const { token } = req.params; + const user = (req as express.Request & { user: AuthUser }).user; + const session = sessionManager.getSession(token); -// Serve static frontend + if (!session) { + res.status(404).json({ error: "Session not found" }); + return; + } + + if (!user.isAdmin && session.userId !== user.id) { + res.status(403).json({ error: "Forbidden" }); + return; + } + + sessionManager.destroySession(token); + res.status(204).end(); + }, +); + +// Admin routes — protected by admin-role check inside the router. +app.use( + "/admin", + authAdapter.requireAuth.bind(authAdapter), + createAdminRouter(sessionManager, userStore), +); + +// Static frontend (served last so auth/admin routes win). const publicDir = path.join(import.meta.dirname, "public"); app.use(express.static(publicDir)); -app.get("/", (_req, res) => { +app.get("/", authAdapter.requireAuth.bind(authAdapter), (_req, res) => { res.sendFile(path.join(publicDir, "index.html")); }); -// --- WebSocket server --- +// ── WebSocket server ────────────────────────────────────────────────────────── + +/** + * Extend IncomingMessage to carry the authenticated user through from + * verifyClient to the connection handler without re-authenticating. + */ +interface AuthedRequest extends IncomingMessage { + _authUser?: AuthUser; +} const rateLimiter = new ConnectionRateLimiter(); - -// Clean up rate limiter every 5 minutes const rateLimiterCleanup = setInterval(() => rateLimiter.cleanup(), 5 * 60_000); const wss = new WebSocketServer({ @@ -99,14 +190,15 @@ const wss = new WebSocketServer({ return; } - // Auth token check - if (!validateAuthToken(req)) { - console.warn("Rejected connection: invalid auth token"); + // Authenticate the user + const user = authAdapter.authenticate(req as IncomingMessage); + if (!user) { + console.warn("Rejected WebSocket connection: unauthenticated"); callback(false, 401, "Unauthorized"); return; } - // Rate limit check + // IP-level rate limit (guards against connection floods from a single IP) const ip = (req.headers["x-forwarded-for"] as string)?.split(",")[0]?.trim() ?? req.socket.remoteAddress ?? @@ -117,56 +209,82 @@ const wss = new WebSocketServer({ return; } + // Per-user rate limit (hourly new-session quota) + if (sessionManager.isUserRateLimited(user.id)) { + const retryAfter = sessionManager.retryAfterSeconds(user.id); + console.warn(`Per-user rate limit for ${user.id}`); + callback(false, 429, "Too Many Requests", { "Retry-After": String(retryAfter) }); + return; + } + + // Per-user concurrent session limit + if (sessionManager.isUserAtConcurrentLimit(user.id)) { + console.warn(`Concurrent session limit reached for ${user.id}`); + callback(false, 429, "Session limit reached"); + return; + } + + // Attach user to request for the connection handler + (req as AuthedRequest)._authUser = user; callback(true); }, }); wss.on("connection", (ws, req) => { + const user = (req as AuthedRequest)._authUser; + if (!user) { + // Should never happen — verifyClient already checked, but be safe. + ws.close(1008, "Unauthenticated"); + return; + } + const ip = (req.headers["x-forwarded-for"] as string)?.split(",")[0]?.trim() ?? req.socket.remoteAddress ?? "unknown"; - console.log(`New WebSocket connection from ${ip}`); + console.log(`New WebSocket connection from ${ip} (user: ${user.id})`); - const url = new URL( - req.url ?? "/", - `http://${req.headers.host ?? "localhost"}`, - ); + const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`); const cols = parseInt(url.searchParams.get("cols") ?? "80", 10); const rows = parseInt(url.searchParams.get("rows") ?? "24", 10); const resumeToken = url.searchParams.get("resume"); - // Try to resume an existing session + // Try to resume an existing session owned by this user if (resumeToken) { - const resumed = sessionManager.resume(resumeToken, ws, cols, rows); - if (resumed) { - return; + const stored = sessionManager.getSession(resumeToken); + // Users may only resume their own sessions (admins can resume any) + if (stored && (user.isAdmin || stored.userId === user.id)) { + const resumed = sessionManager.resume(resumeToken, ws, cols, rows); + if (resumed) return; } - // Session expired or not found — fall through to create a new one console.log( - `[resume] Session ${resumeToken.slice(0, 8)}… not found — starting fresh`, + `[resume] Session ${resumeToken.slice(0, 8)}… not found or not owned — starting fresh`, ); } - // Capacity check only applies to new sessions + // Global capacity check if (sessionManager.isFull) { - ws.send( - JSON.stringify({ - type: "error", - message: "Max sessions reached. Try again later.", - }), - ); + ws.send(JSON.stringify({ type: "error", message: "Max sessions reached. Try again later." })); ws.close(1013, "Max sessions reached"); return; } - const token = sessionManager.create(ws, cols, rows); + const token = sessionManager.create(ws, cols, rows, user); if (token) { + // Track the user in the user store + userStore.touch(user.id, { email: user.email, name: user.name }); + + // Release the user slot when this session ends + const stored = sessionManager.getSession(token); + if (stored) { + stored.pty.onExit(() => userStore.release(user.id)); + } + ws.send(JSON.stringify({ type: "session", token })); } }); -// --- Graceful shutdown --- +// ── Graceful shutdown ───────────────────────────────────────────────────────── function shutdown() { console.log("Shutting down..."); @@ -179,7 +297,6 @@ function shutdown() { }); }); - // Force exit after 10 seconds setTimeout(() => { console.error("Forced shutdown after timeout"); process.exit(1); @@ -189,21 +306,21 @@ function shutdown() { process.on("SIGTERM", shutdown); process.on("SIGINT", shutdown); -// --- Start --- +// ── Start ───────────────────────────────────────────────────────────────────── server.listen(PORT, HOST, () => { console.log(`PTY server listening on http://${HOST}:${PORT}`); console.log(` WebSocket: ws://${HOST}:${PORT}/ws`); - console.log(` Max sessions: ${MAX_SESSIONS}`); - console.log( - ` Session grace period: ${GRACE_PERIOD_MS / 1000}s`, - ); - console.log( - ` Scrollback buffer: ${Math.round(SCROLLBACK_BYTES / 1024)}KB per session`, - ); - if (process.env.AUTH_TOKEN) { + console.log(` Max sessions: ${MAX_SESSIONS} (${MAX_SESSIONS_PER_USER} per user)`); + console.log(` Session grace period: ${GRACE_PERIOD_MS / 1000}s`); + console.log(` Scrollback buffer: ${Math.round(SCROLLBACK_BYTES / 1024)}KB per session`); + console.log(` Auth provider: ${AUTH_PROVIDER}`); + if (AUTH_PROVIDER === "token" && process.env.AUTH_TOKEN) { console.log(" Auth: token required"); } + if (process.env.ADMIN_USERS) { + console.log(` Admins: ${process.env.ADMIN_USERS}`); + } }); export { app, server, sessionManager, wss }; diff --git a/src/server/web/public/terminal.css b/src/server/web/public/terminal.css index 5c2da35..8cc7957 100644 --- a/src/server/web/public/terminal.css +++ b/src/server/web/public/terminal.css @@ -1,4 +1,170 @@ -/* Terminal Theme — CSS Custom Properties */ +/* node_modules/@xterm/xterm/css/xterm.css */ +.xterm { + cursor: text; + position: relative; + user-select: none; + -ms-user-select: none; + -webkit-user-select: none; +} +.xterm.focus, +.xterm:focus { + outline: none; +} +.xterm .xterm-helpers { + position: absolute; + top: 0; + z-index: 5; +} +.xterm .xterm-helper-textarea { + padding: 0; + border: 0; + margin: 0; + position: absolute; + opacity: 0; + left: -9999em; + top: 0; + width: 0; + height: 0; + z-index: -5; + white-space: nowrap; + overflow: hidden; + resize: none; +} +.xterm .composition-view { + background: #000; + color: #FFF; + display: none; + position: absolute; + white-space: nowrap; + z-index: 1; +} +.xterm .composition-view.active { + display: block; +} +.xterm .xterm-viewport { + background-color: #000; + overflow-y: scroll; + cursor: default; + position: absolute; + right: 0; + left: 0; + top: 0; + bottom: 0; +} +.xterm .xterm-screen { + position: relative; +} +.xterm .xterm-screen canvas { + position: absolute; + left: 0; + top: 0; +} +.xterm .xterm-scroll-area { + visibility: hidden; +} +.xterm-char-measure-element { + display: inline-block; + visibility: hidden; + position: absolute; + top: 0; + left: -9999em; + line-height: normal; +} +.xterm.enable-mouse-events { + cursor: default; +} +.xterm.xterm-cursor-pointer, +.xterm .xterm-cursor-pointer { + cursor: pointer; +} +.xterm.column-select.focus { + cursor: crosshair; +} +.xterm .xterm-accessibility:not(.debug), +.xterm .xterm-message { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + z-index: 10; + color: transparent; + pointer-events: none; +} +.xterm .xterm-accessibility-tree:not(.debug) *::selection { + color: transparent; +} +.xterm .xterm-accessibility-tree { + -webkit-user-select: text; + user-select: text; + white-space: pre; +} +.xterm .live-region { + position: absolute; + left: -9999px; + width: 1px; + height: 1px; + overflow: hidden; +} +.xterm-dim { + opacity: 1 !important; +} +.xterm-underline-1 { + text-decoration: underline; +} +.xterm-underline-2 { + text-decoration: double underline; +} +.xterm-underline-3 { + text-decoration: wavy underline; +} +.xterm-underline-4 { + text-decoration: dotted underline; +} +.xterm-underline-5 { + text-decoration: dashed underline; +} +.xterm-overline { + text-decoration: overline; +} +.xterm-overline.xterm-underline-1 { + text-decoration: overline underline; +} +.xterm-overline.xterm-underline-2 { + text-decoration: overline double underline; +} +.xterm-overline.xterm-underline-3 { + text-decoration: overline wavy underline; +} +.xterm-overline.xterm-underline-4 { + text-decoration: overline dotted underline; +} +.xterm-overline.xterm-underline-5 { + text-decoration: overline dashed underline; +} +.xterm-strikethrough { + text-decoration: line-through; +} +.xterm-screen .xterm-decoration-container .xterm-decoration { + z-index: 6; + position: absolute; +} +.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer { + z-index: 7; +} +.xterm-decoration-overview-ruler { + z-index: 8; + position: absolute; + top: 0; + right: 0; + pointer-events: none; +} +.xterm-decoration-top { + z-index: 2; + position: relative; +} + +/* src/server/web/styles.css */ :root { --term-bg: #1a1b26; --term-fg: #c0caf5; @@ -19,7 +185,6 @@ --bar-accent: #7aa2f7; --overlay-bg: rgba(26, 27, 38, 0.92); } - @media (prefers-color-scheme: light) { :root { --term-bg: #f5f5f5; @@ -42,22 +207,26 @@ --overlay-bg: rgba(245, 245, 245, 0.92); } } - -* { +*, +*::before, +*::after { + box-sizing: border-box; margin: 0; padding: 0; - box-sizing: border-box; } - -html, body { +html, +body { width: 100vw; height: 100vh; overflow: hidden; background: var(--term-bg); - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; + font-family: + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + system-ui, + sans-serif; } - -/* Top bar */ #top-bar { display: flex; align-items: center; @@ -69,30 +238,36 @@ html, body { font-size: 12px; user-select: none; -webkit-user-select: none; - transition: transform 0.2s ease; } - #top-bar.collapsed { - transform: translateY(-100%); - position: absolute; - top: 0; - left: 0; - right: 0; - z-index: 10; + display: none; } - -#top-bar .left { - display: flex; - align-items: center; - gap: 10px; -} - +#top-bar .left, #top-bar .right { display: flex; align-items: center; gap: 10px; } - +#toggle-bar { + display: none; + position: fixed; + top: 4px; + right: 4px; + z-index: 20; + width: 20px; + height: 20px; + background: var(--bar-bg); + border: 1px solid var(--bar-fg); + border-radius: 3px; + color: var(--bar-fg); + cursor: pointer; + font-size: 10px; + align-items: center; + justify-content: center; +} +#top-bar.collapsed ~ #toggle-bar { + display: flex; +} .status-dot { width: 7px; height: 7px; @@ -100,26 +275,21 @@ html, body { background: var(--term-green); transition: background 0.3s; } - .status-dot.disconnected { background: var(--term-red); } - .status-dot.connecting { background: var(--term-yellow); - animation: pulse 1s infinite; + animation: pulse 1s ease-in-out infinite; } - @keyframes pulse { - 0%, 100% { opacity: 1; } - 50% { opacity: 0.4; } + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.35; + } } - -#latency { - color: var(--bar-fg); - font-variant-numeric: tabular-nums; -} - #bar-btn { background: none; border: 1px solid var(--bar-fg); @@ -130,68 +300,49 @@ html, body { font-size: 11px; transition: color 0.15s, border-color 0.15s; } - #bar-btn:hover { color: var(--bar-accent); border-color: var(--bar-accent); } - -#toggle-bar { - position: fixed; - top: 4px; - right: 4px; - z-index: 20; - background: var(--bar-bg); - border: 1px solid var(--bar-fg); - color: var(--bar-fg); - width: 20px; - height: 20px; - border-radius: 3px; - cursor: pointer; - font-size: 10px; - line-height: 1; - display: none; - align-items: center; - justify-content: center; -} - -#top-bar.collapsed ~ #toggle-bar { - display: flex; -} - -/* Terminal container */ #terminal-container { width: 100%; height: calc(100vh - 32px); background: var(--term-bg); } - #top-bar.collapsed ~ #terminal-container { height: 100vh; } - #terminal-container .xterm { padding: 4px; } - -/* Loading overlay */ -#loading-overlay { +#loading-overlay, +#reconnect-overlay { position: fixed; - inset: 0; + top: 0; + right: 0; + bottom: 0; + left: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; + gap: 0; background: var(--overlay-bg); z-index: 100; +} +#loading-overlay { transition: opacity 0.3s ease; } - #loading-overlay.hidden { opacity: 0; pointer-events: none; } - +#reconnect-overlay { + display: none; +} +#reconnect-overlay.visible { + display: flex; +} .spinner { width: 36px; height: 36px; @@ -201,75 +352,81 @@ html, body { animation: spin 0.8s linear infinite; margin-bottom: 16px; } - @keyframes spin { - to { transform: rotate(360deg); } + to { + transform: rotate(360deg); + } } - -#loading-overlay .message { +.overlay-msg { color: var(--term-fg); font-size: 14px; - opacity: 0.8; + opacity: 0.85; } - -/* Reconnect overlay */ -#reconnect-overlay { - position: fixed; - inset: 0; - display: none; - flex-direction: column; - align-items: center; - justify-content: center; - background: var(--overlay-bg); - z-index: 90; -} - -#reconnect-overlay.visible { - display: flex; -} - -#reconnect-overlay .message { - color: var(--term-fg); - font-size: 14px; - margin-bottom: 8px; -} - -#reconnect-overlay .sub { +.overlay-sub { + margin-top: 6px; color: var(--bar-fg); font-size: 12px; } - -/* Mobile: make terminal touch-friendly */ +.xterm-viewport::-webkit-scrollbar { + width: 8px; +} +.xterm-viewport::-webkit-scrollbar-track { + background: transparent; +} +.xterm-viewport::-webkit-scrollbar-thumb { + background: var(--term-bright-black); + border-radius: 4px; +} +.xterm-viewport::-webkit-scrollbar-thumb:hover { + background: var(--bar-fg); +} @media (max-width: 600px) { #top-bar { height: 28px; font-size: 11px; padding: 0 8px; } - #terminal-container { height: calc(100vh - 28px); } - #top-bar.collapsed ~ #terminal-container { height: 100vh; } } +/*! Bundled license information: -/* Scrollbar styling for xterm */ -.xterm-viewport::-webkit-scrollbar { - width: 8px; -} - -.xterm-viewport::-webkit-scrollbar-track { - background: transparent; -} - -.xterm-viewport::-webkit-scrollbar-thumb { - background: var(--term-bright-black); - border-radius: 4px; -} - -.xterm-viewport::-webkit-scrollbar-thumb:hover { - background: var(--bar-fg); -} +@xterm/xterm/css/xterm.css: + (** + * Copyright (c) 2014 The xterm.js authors. All rights reserved. + * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) + * https://github.com/chjj/term.js + * @license MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * Originally forked from (with the author's permission): + * Fabrice Bellard's javascript vt100 for jslinux: + * http://bellard.org/jslinux/ + * Copyright (c) 2011 Fabrice Bellard + * The original design remains. The terminal itself + * has been extended to include xterm CSI codes, among + * other features. + *) +*/ +/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B4dGVybS94dGVybS9jc3MveHRlcm0uY3NzIiwgIi4uL3N0eWxlcy5jc3MiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIENocmlzdG9waGVyIEplZmZyZXkgKE1JVCBMaWNlbnNlKVxuICogaHR0cHM6Ly9naXRodWIuY29tL2NoamovdGVybS5qc1xuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqXG4gKiBPcmlnaW5hbGx5IGZvcmtlZCBmcm9tICh3aXRoIHRoZSBhdXRob3IncyBwZXJtaXNzaW9uKTpcbiAqICAgRmFicmljZSBCZWxsYXJkJ3MgamF2YXNjcmlwdCB2dDEwMCBmb3IganNsaW51eDpcbiAqICAgaHR0cDovL2JlbGxhcmQub3JnL2pzbGludXgvXG4gKiAgIENvcHlyaWdodCAoYykgMjAxMSBGYWJyaWNlIEJlbGxhcmRcbiAqICAgVGhlIG9yaWdpbmFsIGRlc2lnbiByZW1haW5zLiBUaGUgdGVybWluYWwgaXRzZWxmXG4gKiAgIGhhcyBiZWVuIGV4dGVuZGVkIHRvIGluY2x1ZGUgeHRlcm0gQ1NJIGNvZGVzLCBhbW9uZ1xuICogICBvdGhlciBmZWF0dXJlcy5cbiAqL1xuXG4vKipcbiAqICBEZWZhdWx0IHN0eWxlcyBmb3IgeHRlcm0uanNcbiAqL1xuXG4ueHRlcm0ge1xuICAgIGN1cnNvcjogdGV4dDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi54dGVybS5mb2N1cyxcbi54dGVybTpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZTtcbn1cblxuLnh0ZXJtIC54dGVybS1oZWxwZXJzIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIC8qKlxuICAgICAqIFRoZSB6LWluZGV4IG9mIHRoZSBoZWxwZXJzIG11c3QgYmUgaGlnaGVyIHRoYW4gdGhlIGNhbnZhc2VzIGluIG9yZGVyIGZvclxuICAgICAqIElNRXMgdG8gYXBwZWFyIG9uIHRvcC5cbiAgICAgKi9cbiAgICB6LWluZGV4OiA1O1xufVxuXG4ueHRlcm0gLnh0ZXJtLWhlbHBlci10ZXh0YXJlYSB7XG4gICAgcGFkZGluZzogMDtcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIC8qIE1vdmUgdGV4dGFyZWEgb3V0IG9mIHRoZSBzY3JlZW4gdG8gdGhlIGZhciBsZWZ0LCBzbyB0aGF0IHRoZSBjdXJzb3IgaXMgbm90IHZpc2libGUgKi9cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgb3BhY2l0eTogMDtcbiAgICBsZWZ0OiAtOTk5OWVtO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgei1pbmRleDogLTU7XG4gICAgLyoqIFByZXZlbnQgd3JhcHBpbmcgc28gdGhlIElNRSBhcHBlYXJzIGFnYWluc3QgdGhlIHRleHRhcmVhIGF0IHRoZSBjb3JyZWN0IHBvc2l0aW9uICovXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHJlc2l6ZTogbm9uZTtcbn1cblxuLnh0ZXJtIC5jb21wb3NpdGlvbi12aWV3IHtcbiAgICAvKiBUT0RPOiBDb21wb3NpdGlvbiBwb3NpdGlvbiBnb3QgbWVzc2VkIHVwIHNvbWV3aGVyZSAqL1xuICAgIGJhY2tncm91bmQ6ICMwMDA7XG4gICAgY29sb3I6ICNGRkY7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB6LWluZGV4OiAxO1xufVxuXG4ueHRlcm0gLmNvbXBvc2l0aW9uLXZpZXcuYWN0aXZlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLnh0ZXJtIC54dGVybS12aWV3cG9ydCB7XG4gICAgLyogT24gT1MgWCB0aGlzIGlzIHJlcXVpcmVkIGluIG9yZGVyIGZvciB0aGUgc2Nyb2xsIGJhciB0byBhcHBlYXIgZnVsbHkgb3BhcXVlICovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDtcbiAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IDA7XG59XG5cbi54dGVybSAueHRlcm0tc2NyZWVuIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi54dGVybSAueHRlcm0tc2NyZWVuIGNhbnZhcyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xufVxuXG4ueHRlcm0gLnh0ZXJtLXNjcm9sbC1hcmVhIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbi54dGVybS1jaGFyLW1lYXN1cmUtZWxlbWVudCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IC05OTk5ZW07XG4gICAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuLnh0ZXJtLmVuYWJsZS1tb3VzZS1ldmVudHMge1xuICAgIC8qIFdoZW4gbW91c2UgZXZlbnRzIGFyZSBlbmFibGVkIChlZy4gdG11eCksIHJldmVydCB0byB0aGUgc3RhbmRhcmQgcG9pbnRlciBjdXJzb3IgKi9cbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi54dGVybS54dGVybS1jdXJzb3ItcG9pbnRlcixcbi54dGVybSAueHRlcm0tY3Vyc29yLXBvaW50ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnh0ZXJtLmNvbHVtbi1zZWxlY3QuZm9jdXMge1xuICAgIC8qIENvbHVtbiBzZWxlY3Rpb24gbW9kZSAqL1xuICAgIGN1cnNvcjogY3Jvc3NoYWlyO1xufVxuXG4ueHRlcm0gLnh0ZXJtLWFjY2Vzc2liaWxpdHk6bm90KC5kZWJ1ZyksXG4ueHRlcm0gLnh0ZXJtLW1lc3NhZ2Uge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgei1pbmRleDogMTA7XG4gICAgY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4ueHRlcm0gLnh0ZXJtLWFjY2Vzc2liaWxpdHktdHJlZTpub3QoLmRlYnVnKSAqOjpzZWxlY3Rpb24ge1xuICBjb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi54dGVybSAueHRlcm0tYWNjZXNzaWJpbGl0eS10cmVlIHtcbiAgdXNlci1zZWxlY3Q6IHRleHQ7XG4gIHdoaXRlLXNwYWNlOiBwcmU7XG59XG5cbi54dGVybSAubGl2ZS1yZWdpb24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAtOTk5OXB4O1xuICAgIHdpZHRoOiAxcHg7XG4gICAgaGVpZ2h0OiAxcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnh0ZXJtLWRpbSB7XG4gICAgLyogRGltIHNob3VsZCBub3QgYXBwbHkgdG8gYmFja2dyb3VuZCwgc28gdGhlIG9wYWNpdHkgb2YgdGhlIGZvcmVncm91bmQgY29sb3IgaXMgYXBwbGllZFxuICAgICAqIGV4cGxpY2l0bHkgaW4gdGhlIGdlbmVyYXRlZCBjbGFzcyBhbmQgcmVzZXQgdG8gMSBoZXJlICovXG4gICAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xufVxuXG4ueHRlcm0tdW5kZXJsaW5lLTEgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfVxuLnh0ZXJtLXVuZGVybGluZS0yIHsgdGV4dC1kZWNvcmF0aW9uOiBkb3VibGUgdW5kZXJsaW5lOyB9XG4ueHRlcm0tdW5kZXJsaW5lLTMgeyB0ZXh0LWRlY29yYXRpb246IHdhdnkgdW5kZXJsaW5lOyB9XG4ueHRlcm0tdW5kZXJsaW5lLTQgeyB0ZXh0LWRlY29yYXRpb246IGRvdHRlZCB1bmRlcmxpbmU7IH1cbi54dGVybS11bmRlcmxpbmUtNSB7IHRleHQtZGVjb3JhdGlvbjogZGFzaGVkIHVuZGVybGluZTsgfVxuXG4ueHRlcm0tb3ZlcmxpbmUge1xuICAgIHRleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7XG59XG5cbi54dGVybS1vdmVybGluZS54dGVybS11bmRlcmxpbmUtMSB7IHRleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmUgdW5kZXJsaW5lOyB9XG4ueHRlcm0tb3ZlcmxpbmUueHRlcm0tdW5kZXJsaW5lLTIgeyB0ZXh0LWRlY29yYXRpb246IG92ZXJsaW5lIGRvdWJsZSB1bmRlcmxpbmU7IH1cbi54dGVybS1vdmVybGluZS54dGVybS11bmRlcmxpbmUtMyB7IHRleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmUgd2F2eSB1bmRlcmxpbmU7IH1cbi54dGVybS1vdmVybGluZS54dGVybS11bmRlcmxpbmUtNCB7IHRleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmUgZG90dGVkIHVuZGVybGluZTsgfVxuLnh0ZXJtLW92ZXJsaW5lLnh0ZXJtLXVuZGVybGluZS01IHsgdGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZSBkYXNoZWQgdW5kZXJsaW5lOyB9XG5cbi54dGVybS1zdHJpa2V0aHJvdWdoIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcbn1cblxuLnh0ZXJtLXNjcmVlbiAueHRlcm0tZGVjb3JhdGlvbi1jb250YWluZXIgLnh0ZXJtLWRlY29yYXRpb24ge1xuXHR6LWluZGV4OiA2O1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi54dGVybS1zY3JlZW4gLnh0ZXJtLWRlY29yYXRpb24tY29udGFpbmVyIC54dGVybS1kZWNvcmF0aW9uLnh0ZXJtLWRlY29yYXRpb24tdG9wLWxheWVyIHtcblx0ei1pbmRleDogNztcbn1cblxuLnh0ZXJtLWRlY29yYXRpb24tb3ZlcnZpZXctcnVsZXIge1xuICAgIHotaW5kZXg6IDg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnh0ZXJtLWRlY29yYXRpb24tdG9wIHtcbiAgICB6LWluZGV4OiAyO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbiIsICIvKiBcdTI1MDBcdTI1MDAgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzICh0aGVtZSB0b2tlbnMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAqL1xuOnJvb3Qge1xuICAtLXRlcm0tYmc6ICMxYTFiMjY7XG4gIC0tdGVybS1mZzogI2MwY2FmNTtcbiAgLS10ZXJtLWN1cnNvcjogI2MwY2FmNTtcbiAgLS10ZXJtLXNlbGVjdGlvbjogcmdiYSgxMzAsIDE3MCwgMjU1LCAwLjMpO1xuICAtLXRlcm0tYmxhY2s6ICMxNTE2MWU7XG4gIC0tdGVybS1yZWQ6ICNmNzc2OGU7XG4gIC0tdGVybS1ncmVlbjogIzllY2U2YTtcbiAgLS10ZXJtLXllbGxvdzogI2UwYWY2ODtcbiAgLS10ZXJtLWJsdWU6ICM3YWEyZjc7XG4gIC0tdGVybS1tYWdlbnRhOiAjYmI5YWY3O1xuICAtLXRlcm0tY3lhbjogIzdkY2ZmZjtcbiAgLS10ZXJtLXdoaXRlOiAjYTliMWQ2O1xuICAtLXRlcm0tYnJpZ2h0LWJsYWNrOiAjNDE0ODY4O1xuICAtLXRlcm0tYnJpZ2h0LXdoaXRlOiAjYzBjYWY1O1xuICAtLWJhci1iZzogIzE2MTYxZTtcbiAgLS1iYXItZmc6ICM1NjVmODk7XG4gIC0tYmFyLWFjY2VudDogIzdhYTJmNztcbiAgLS1vdmVybGF5LWJnOiByZ2JhKDI2LCAyNywgMzgsIDAuOTIpO1xufVxuXG5AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkge1xuICA6cm9vdCB7XG4gICAgLS10ZXJtLWJnOiAjZjVmNWY1O1xuICAgIC0tdGVybS1mZzogIzM0M2I1ODtcbiAgICAtLXRlcm0tY3Vyc29yOiAjMzQzYjU4O1xuICAgIC0tdGVybS1zZWxlY3Rpb246IHJnYmEoNTIsIDU5LCA4OCwgMC4yKTtcbiAgICAtLXRlcm0tYmxhY2s6ICMwZjBmMTQ7XG4gICAgLS10ZXJtLXJlZDogIzhjNDM1MTtcbiAgICAtLXRlcm0tZ3JlZW46ICM0ODVlMzA7XG4gICAgLS10ZXJtLXllbGxvdzogIzhmNWUxNTtcbiAgICAtLXRlcm0tYmx1ZTogIzM0NTQ4YTtcbiAgICAtLXRlcm0tbWFnZW50YTogIzVhNGE3ODtcbiAgICAtLXRlcm0tY3lhbjogIzBmNGI2ZTtcbiAgICAtLXRlcm0td2hpdGU6ICMzNDNiNTg7XG4gICAgLS10ZXJtLWJyaWdodC1ibGFjazogIzk2OTlhMztcbiAgICAtLXRlcm0tYnJpZ2h0LXdoaXRlOiAjMzQzYjU4O1xuICAgIC0tYmFyLWJnOiAjZThlOGU4O1xuICAgIC0tYmFyLWZnOiAjNmM3MDg2O1xuICAgIC0tYmFyLWFjY2VudDogIzM0NTQ4YTtcbiAgICAtLW92ZXJsYXktYmc6IHJnYmEoMjQ1LCAyNDUsIDI0NSwgMC45Mik7XG4gIH1cbn1cblxuLyogXHUyNTAwXHUyNTAwIFJlc2V0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAqL1xuKiwgKjo6YmVmb3JlLCAqOjphZnRlciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuaHRtbCwgYm9keSB7XG4gIHdpZHRoOiAxMDB2dztcbiAgaGVpZ2h0OiAxMDB2aDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZDogdmFyKC0tdGVybS1iZyk7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHN5c3RlbS11aSwgc2Fucy1zZXJpZjtcbn1cblxuLyogXHUyNTAwXHUyNTAwIFRvcCBiYXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwICovXG4jdG9wLWJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgaGVpZ2h0OiAzMnB4O1xuICBwYWRkaW5nOiAwIDEycHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJhci1iZyk7XG4gIGNvbG9yOiB2YXIoLS1iYXItZmcpO1xuICBmb250LXNpemU6IDEycHg7XG4gIHVzZXItc2VsZWN0OiBub25lO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xufVxuXG4jdG9wLWJhci5jb2xsYXBzZWQge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4jdG9wLWJhciAubGVmdCxcbiN0b3AtYmFyIC5yaWdodCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTBweDtcbn1cblxuLyogUmUtZXhwYW5kIGJ1dHRvbiBcdTIwMTQgb25seSB2aXNpYmxlIHdoZW4gYmFyIGlzIGNvbGxhcHNlZCAqL1xuI3RvZ2dsZS1iYXIge1xuICBkaXNwbGF5OiBub25lO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogNHB4O1xuICByaWdodDogNHB4O1xuICB6LWluZGV4OiAyMDtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgYmFja2dyb3VuZDogdmFyKC0tYmFyLWJnKTtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFyLWZnKTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBjb2xvcjogdmFyKC0tYmFyLWZnKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4jdG9wLWJhci5jb2xsYXBzZWQgfiAjdG9nZ2xlLWJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbi8qIFx1MjUwMFx1MjUwMCBTdGF0dXMgZG90IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAqL1xuLnN0YXR1cy1kb3Qge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS10ZXJtLWdyZWVuKTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjNzO1xufVxuXG4uc3RhdHVzLWRvdC5kaXNjb25uZWN0ZWQge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS10ZXJtLXJlZCk7XG59XG5cbi5zdGF0dXMtZG90LmNvbm5lY3Rpbmcge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS10ZXJtLXllbGxvdyk7XG4gIGFuaW1hdGlvbjogcHVsc2UgMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG59XG5cbkBrZXlmcmFtZXMgcHVsc2Uge1xuICAwJSwgMTAwJSB7IG9wYWNpdHk6IDE7IH1cbiAgNTAlICAgICAgIHsgb3BhY2l0eTogMC4zNTsgfVxufVxuXG4vKiBcdTI1MDBcdTI1MDAgQmFyIGJ1dHRvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgKi9cbiNiYXItYnRuIHtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFyLWZnKTtcbiAgY29sb3I6IHZhcigtLWJhci1mZyk7XG4gIHBhZGRpbmc6IDJweCA4cHg7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDExcHg7XG4gIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzLCBib3JkZXItY29sb3IgMC4xNXM7XG59XG5cbiNiYXItYnRuOmhvdmVyIHtcbiAgY29sb3I6IHZhcigtLWJhci1hY2NlbnQpO1xuICBib3JkZXItY29sb3I6IHZhcigtLWJhci1hY2NlbnQpO1xufVxuXG4vKiBcdTI1MDBcdTI1MDAgVGVybWluYWwgY29udGFpbmVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAqL1xuI3Rlcm1pbmFsLWNvbnRhaW5lciB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGNhbGMoMTAwdmggLSAzMnB4KTtcbiAgYmFja2dyb3VuZDogdmFyKC0tdGVybS1iZyk7XG59XG5cbiN0b3AtYmFyLmNvbGxhcHNlZCB+ICN0ZXJtaW5hbC1jb250YWluZXIge1xuICBoZWlnaHQ6IDEwMHZoO1xufVxuXG4vKiBHaXZlIHh0ZXJtIGEgbGl0dGxlIGJyZWF0aGluZyByb29tICovXG4jdGVybWluYWwtY29udGFpbmVyIC54dGVybSB7XG4gIHBhZGRpbmc6IDRweDtcbn1cblxuLyogXHUyNTAwXHUyNTAwIE92ZXJsYXlzIChsb2FkaW5nICsgcmVjb25uZWN0KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgKi9cbiNsb2FkaW5nLW92ZXJsYXksXG4jcmVjb25uZWN0LW92ZXJsYXkge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGluc2V0OiAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZ2FwOiAwO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1vdmVybGF5LWJnKTtcbiAgei1pbmRleDogMTAwO1xufVxuXG4jbG9hZGluZy1vdmVybGF5IHtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2U7XG59XG5cbiNsb2FkaW5nLW92ZXJsYXkuaGlkZGVuIHtcbiAgb3BhY2l0eTogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbiNyZWNvbm5lY3Qtb3ZlcmxheSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbiNyZWNvbm5lY3Qtb3ZlcmxheS52aXNpYmxlIHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLnNwaW5uZXIge1xuICB3aWR0aDogMzZweDtcbiAgaGVpZ2h0OiAzNnB4O1xuICBib3JkZXI6IDNweCBzb2xpZCB2YXIoLS10ZXJtLWJyaWdodC1ibGFjayk7XG4gIGJvcmRlci10b3AtY29sb3I6IHZhcigtLWJhci1hY2NlbnQpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGFuaW1hdGlvbjogc3BpbiAwLjhzIGxpbmVhciBpbmZpbml0ZTtcbiAgbWFyZ2luLWJvdHRvbTogMTZweDtcbn1cblxuQGtleWZyYW1lcyBzcGluIHtcbiAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XG59XG5cbi5vdmVybGF5LW1zZyB7XG4gIGNvbG9yOiB2YXIoLS10ZXJtLWZnKTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBvcGFjaXR5OiAwLjg1O1xufVxuXG4ub3ZlcmxheS1zdWIge1xuICBtYXJnaW4tdG9wOiA2cHg7XG4gIGNvbG9yOiB2YXIoLS1iYXItZmcpO1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi8qIFx1MjUwMFx1MjUwMCBTY3JvbGxiYXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwICovXG4ueHRlcm0tdmlld3BvcnQ6Oi13ZWJraXQtc2Nyb2xsYmFyICAgICAgICB7IHdpZHRoOiA4cHg7IH1cbi54dGVybS12aWV3cG9ydDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH1cbi54dGVybS12aWV3cG9ydDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgIHsgYmFja2dyb3VuZDogdmFyKC0tdGVybS1icmlnaHQtYmxhY2spOyBib3JkZXItcmFkaXVzOiA0cHg7IH1cbi54dGVybS12aWV3cG9ydDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXItZmcpOyB9XG5cbi8qIFx1MjUwMFx1MjUwMCBNb2JpbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwICovXG5AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHtcbiAgI3RvcC1iYXIge1xuICAgIGhlaWdodDogMjhweDtcbiAgICBmb250LXNpemU6IDExcHg7XG4gICAgcGFkZGluZzogMCA4cHg7XG4gIH1cblxuICAjdGVybWluYWwtY29udGFpbmVyIHtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwdmggLSAyOHB4KTtcbiAgfVxuXG4gICN0b3AtYmFyLmNvbGxhcHNlZCB+ICN0ZXJtaW5hbC1jb250YWluZXIge1xuICAgIGhlaWdodDogMTAwdmg7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFxQ0EsQ0FBQztBQUNHLFVBQVE7QUFDUixZQUFVO0FBQ1YsZUFBYTtBQUNiLG1CQUFpQjtBQUNqQix1QkFBcUI7QUFDekI7QUFFQSxDQVJDLEtBUUssQ0FBQztBQUNQLENBVEMsS0FTSztBQUNGLFdBQVM7QUFDYjtBQUVBLENBYkMsTUFhTSxDQUFDO0FBQ0osWUFBVTtBQUNWLE9BQUs7QUFLTCxXQUFTO0FBQ2I7QUFFQSxDQXZCQyxNQXVCTSxDQUFDO0FBQ0osV0FBUztBQUNULFVBQVE7QUFDUixVQUFRO0FBRVIsWUFBVTtBQUNWLFdBQVM7QUFDVCxRQUFNO0FBQ04sT0FBSztBQUNMLFNBQU87QUFDUCxVQUFRO0FBQ1IsV0FBUztBQUVULGVBQWE7QUFDYixZQUFVO0FBQ1YsVUFBUTtBQUNaO0FBRUEsQ0F6Q0MsTUF5Q00sQ0FBQztBQUVKLGNBQVk7QUFDWixTQUFPO0FBQ1AsV0FBUztBQUNULFlBQVU7QUFDVixlQUFhO0FBQ2IsV0FBUztBQUNiO0FBRUEsQ0FuREMsTUFtRE0sQ0FWQyxnQkFVZ0IsQ0FB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 */ diff --git a/src/server/web/public/terminal.js b/src/server/web/public/terminal.js index 8965937..a20192e 100644 --- a/src/server/web/public/terminal.js +++ b/src/server/web/public/terminal.js @@ -1,361 +1,8963 @@ -/** - * Claude Code — Terminal-in-Browser (xterm.js + WebSocket) - */ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +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 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 +)); -const RECONNECT_BASE_MS = 1000; -const RECONNECT_MAX_MS = 30000; -const PING_INTERVAL_MS = 5000; +// node_modules/@xterm/xterm/lib/xterm.js +var require_xterm = __commonJS({ + "node_modules/@xterm/xterm/lib/xterm.js"(exports, module) { + "use strict"; + !(function(e, t) { + if ("object" == typeof exports && "object" == typeof module) module.exports = t(); + else if ("function" == typeof define && define.amd) define([], t); + else { + var i = t(); + for (var s in i) ("object" == typeof exports ? exports : e)[s] = i[s]; + } + })(globalThis, (() => (() => { + "use strict"; + var e = { 4567: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.AccessibilityManager = void 0; + const n = i2(9042), o = i2(9924), a = i2(844), h = i2(4725), c = i2(2585), l = i2(3656); + let d = t2.AccessibilityManager = class extends a.Disposable { + constructor(e3, t3, i3, s3) { + super(), this._terminal = e3, this._coreBrowserService = i3, this._renderService = s3, this._rowColumns = /* @__PURE__ */ new WeakMap(), this._liveRegionLineCount = 0, this._charsToConsume = [], this._charsToAnnounce = "", this._accessibilityContainer = this._coreBrowserService.mainDocument.createElement("div"), this._accessibilityContainer.classList.add("xterm-accessibility"), this._rowContainer = this._coreBrowserService.mainDocument.createElement("div"), this._rowContainer.setAttribute("role", "list"), this._rowContainer.classList.add("xterm-accessibility-tree"), this._rowElements = []; + for (let e4 = 0; e4 < this._terminal.rows; e4++) this._rowElements[e4] = this._createAccessibilityTreeNode(), this._rowContainer.appendChild(this._rowElements[e4]); + if (this._topBoundaryFocusListener = (e4) => this._handleBoundaryFocus(e4, 0), this._bottomBoundaryFocusListener = (e4) => this._handleBoundaryFocus(e4, 1), this._rowElements[0].addEventListener("focus", this._topBoundaryFocusListener), this._rowElements[this._rowElements.length - 1].addEventListener("focus", this._bottomBoundaryFocusListener), this._refreshRowsDimensions(), this._accessibilityContainer.appendChild(this._rowContainer), this._liveRegion = this._coreBrowserService.mainDocument.createElement("div"), this._liveRegion.classList.add("live-region"), this._liveRegion.setAttribute("aria-live", "assertive"), this._accessibilityContainer.appendChild(this._liveRegion), this._liveRegionDebouncer = this.register(new o.TimeBasedDebouncer(this._renderRows.bind(this))), !this._terminal.element) throw new Error("Cannot enable accessibility before Terminal.open"); + this._terminal.element.insertAdjacentElement("afterbegin", this._accessibilityContainer), this.register(this._terminal.onResize(((e4) => this._handleResize(e4.rows)))), this.register(this._terminal.onRender(((e4) => this._refreshRows(e4.start, e4.end)))), this.register(this._terminal.onScroll((() => this._refreshRows()))), this.register(this._terminal.onA11yChar(((e4) => this._handleChar(e4)))), this.register(this._terminal.onLineFeed((() => this._handleChar("\n")))), this.register(this._terminal.onA11yTab(((e4) => this._handleTab(e4)))), this.register(this._terminal.onKey(((e4) => this._handleKey(e4.key)))), this.register(this._terminal.onBlur((() => this._clearLiveRegion()))), this.register(this._renderService.onDimensionsChange((() => this._refreshRowsDimensions()))), this.register((0, l.addDisposableDomListener)(document, "selectionchange", (() => this._handleSelectionChange()))), this.register(this._coreBrowserService.onDprChange((() => this._refreshRowsDimensions()))), this._refreshRows(), this.register((0, a.toDisposable)((() => { + this._accessibilityContainer.remove(), this._rowElements.length = 0; + }))); + } + _handleTab(e3) { + for (let t3 = 0; t3 < e3; t3++) this._handleChar(" "); + } + _handleChar(e3) { + this._liveRegionLineCount < 21 && (this._charsToConsume.length > 0 ? this._charsToConsume.shift() !== e3 && (this._charsToAnnounce += e3) : this._charsToAnnounce += e3, "\n" === e3 && (this._liveRegionLineCount++, 21 === this._liveRegionLineCount && (this._liveRegion.textContent += n.tooMuchOutput))); + } + _clearLiveRegion() { + this._liveRegion.textContent = "", this._liveRegionLineCount = 0; + } + _handleKey(e3) { + this._clearLiveRegion(), new RegExp("\\p{Control}", "u").test(e3) || this._charsToConsume.push(e3); + } + _refreshRows(e3, t3) { + this._liveRegionDebouncer.refresh(e3, t3, this._terminal.rows); + } + _renderRows(e3, t3) { + const i3 = this._terminal.buffer, s3 = i3.lines.length.toString(); + for (let r2 = e3; r2 <= t3; r2++) { + const e4 = i3.lines.get(i3.ydisp + r2), t4 = [], n2 = (e4 == null ? void 0 : e4.translateToString(true, void 0, void 0, t4)) || "", o2 = (i3.ydisp + r2 + 1).toString(), a2 = this._rowElements[r2]; + a2 && (0 === n2.length ? (a2.innerText = "\xA0", this._rowColumns.set(a2, [0, 1])) : (a2.textContent = n2, this._rowColumns.set(a2, t4)), a2.setAttribute("aria-posinset", o2), a2.setAttribute("aria-setsize", s3)); + } + this._announceCharacters(); + } + _announceCharacters() { + 0 !== this._charsToAnnounce.length && (this._liveRegion.textContent += this._charsToAnnounce, this._charsToAnnounce = ""); + } + _handleBoundaryFocus(e3, t3) { + const i3 = e3.target, s3 = this._rowElements[0 === t3 ? 1 : this._rowElements.length - 2]; + if (i3.getAttribute("aria-posinset") === (0 === t3 ? "1" : `${this._terminal.buffer.lines.length}`)) return; + if (e3.relatedTarget !== s3) return; + let r2, n2; + if (0 === t3 ? (r2 = i3, n2 = this._rowElements.pop(), this._rowContainer.removeChild(n2)) : (r2 = this._rowElements.shift(), n2 = i3, this._rowContainer.removeChild(r2)), r2.removeEventListener("focus", this._topBoundaryFocusListener), n2.removeEventListener("focus", this._bottomBoundaryFocusListener), 0 === t3) { + const e4 = this._createAccessibilityTreeNode(); + this._rowElements.unshift(e4), this._rowContainer.insertAdjacentElement("afterbegin", e4); + } else { + const e4 = this._createAccessibilityTreeNode(); + this._rowElements.push(e4), this._rowContainer.appendChild(e4); + } + this._rowElements[0].addEventListener("focus", this._topBoundaryFocusListener), this._rowElements[this._rowElements.length - 1].addEventListener("focus", this._bottomBoundaryFocusListener), this._terminal.scrollLines(0 === t3 ? -1 : 1), this._rowElements[0 === t3 ? 1 : this._rowElements.length - 2].focus(), e3.preventDefault(), e3.stopImmediatePropagation(); + } + _handleSelectionChange() { + var _a; + if (0 === this._rowElements.length) return; + const e3 = document.getSelection(); + if (!e3) return; + if (e3.isCollapsed) return void (this._rowContainer.contains(e3.anchorNode) && this._terminal.clearSelection()); + if (!e3.anchorNode || !e3.focusNode) return void console.error("anchorNode and/or focusNode are null"); + let t3 = { node: e3.anchorNode, offset: e3.anchorOffset }, i3 = { node: e3.focusNode, offset: e3.focusOffset }; + if ((t3.node.compareDocumentPosition(i3.node) & Node.DOCUMENT_POSITION_PRECEDING || t3.node === i3.node && t3.offset > i3.offset) && ([t3, i3] = [i3, t3]), t3.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING) && (t3 = { node: this._rowElements[0].childNodes[0], offset: 0 }), !this._rowContainer.contains(t3.node)) return; + const s3 = this._rowElements.slice(-1)[0]; + if (i3.node.compareDocumentPosition(s3) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING) && (i3 = { node: s3, offset: ((_a = s3.textContent) == null ? void 0 : _a.length) ?? 0 }), !this._rowContainer.contains(i3.node)) return; + const r2 = ({ node: e4, offset: t4 }) => { + const i4 = e4 instanceof Text ? e4.parentNode : e4; + let s4 = parseInt(i4 == null ? void 0 : i4.getAttribute("aria-posinset"), 10) - 1; + if (isNaN(s4)) return console.warn("row is invalid. Race condition?"), null; + const r3 = this._rowColumns.get(i4); + if (!r3) return console.warn("columns is null. Race condition?"), null; + let n3 = t4 < r3.length ? r3[t4] : r3.slice(-1)[0] + 1; + return n3 >= this._terminal.cols && (++s4, n3 = 0), { row: s4, column: n3 }; + }, n2 = r2(t3), o2 = r2(i3); + if (n2 && o2) { + if (n2.row > o2.row || n2.row === o2.row && n2.column >= o2.column) throw new Error("invalid range"); + this._terminal.select(n2.column, n2.row, (o2.row - n2.row) * this._terminal.cols - n2.column + o2.column); + } + } + _handleResize(e3) { + this._rowElements[this._rowElements.length - 1].removeEventListener("focus", this._bottomBoundaryFocusListener); + for (let e4 = this._rowContainer.children.length; e4 < this._terminal.rows; e4++) this._rowElements[e4] = this._createAccessibilityTreeNode(), this._rowContainer.appendChild(this._rowElements[e4]); + for (; this._rowElements.length > e3; ) this._rowContainer.removeChild(this._rowElements.pop()); + this._rowElements[this._rowElements.length - 1].addEventListener("focus", this._bottomBoundaryFocusListener), this._refreshRowsDimensions(); + } + _createAccessibilityTreeNode() { + const e3 = this._coreBrowserService.mainDocument.createElement("div"); + return e3.setAttribute("role", "listitem"), e3.tabIndex = -1, this._refreshRowDimensions(e3), e3; + } + _refreshRowsDimensions() { + if (this._renderService.dimensions.css.cell.height) { + this._accessibilityContainer.style.width = `${this._renderService.dimensions.css.canvas.width}px`, this._rowElements.length !== this._terminal.rows && this._handleResize(this._terminal.rows); + for (let e3 = 0; e3 < this._terminal.rows; e3++) this._refreshRowDimensions(this._rowElements[e3]); + } + } + _refreshRowDimensions(e3) { + e3.style.height = `${this._renderService.dimensions.css.cell.height}px`; + } + }; + t2.AccessibilityManager = d = s2([r(1, c.IInstantiationService), r(2, h.ICoreBrowserService), r(3, h.IRenderService)], d); + }, 3614: (e2, t2) => { + function i2(e3) { + return e3.replace(/\r?\n/g, "\r"); + } + function s2(e3, t3) { + return t3 ? "\x1B[200~" + e3 + "\x1B[201~" : e3; + } + function r(e3, t3, r2, n2) { + e3 = s2(e3 = i2(e3), r2.decPrivateModes.bracketedPasteMode && true !== n2.rawOptions.ignoreBracketedPasteMode), r2.triggerDataEvent(e3, true), t3.value = ""; + } + function n(e3, t3, i3) { + const s3 = i3.getBoundingClientRect(), r2 = e3.clientX - s3.left - 10, n2 = e3.clientY - s3.top - 10; + t3.style.width = "20px", t3.style.height = "20px", t3.style.left = `${r2}px`, t3.style.top = `${n2}px`, t3.style.zIndex = "1000", t3.focus(); + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.rightClickHandler = t2.moveTextAreaUnderMouseCursor = t2.paste = t2.handlePasteEvent = t2.copyHandler = t2.bracketTextForPaste = t2.prepareTextForTerminal = void 0, t2.prepareTextForTerminal = i2, t2.bracketTextForPaste = s2, t2.copyHandler = function(e3, t3) { + e3.clipboardData && e3.clipboardData.setData("text/plain", t3.selectionText), e3.preventDefault(); + }, t2.handlePasteEvent = function(e3, t3, i3, s3) { + e3.stopPropagation(), e3.clipboardData && r(e3.clipboardData.getData("text/plain"), t3, i3, s3); + }, t2.paste = r, t2.moveTextAreaUnderMouseCursor = n, t2.rightClickHandler = function(e3, t3, i3, s3, r2) { + n(e3, t3, i3), r2 && s3.rightClickSelect(e3), t3.value = s3.selectionText, t3.select(); + }; + }, 7239: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ColorContrastCache = void 0; + const s2 = i2(1505); + t2.ColorContrastCache = class { + constructor() { + this._color = new s2.TwoKeyMap(), this._css = new s2.TwoKeyMap(); + } + setCss(e3, t3, i3) { + this._css.set(e3, t3, i3); + } + getCss(e3, t3) { + return this._css.get(e3, t3); + } + setColor(e3, t3, i3) { + this._color.set(e3, t3, i3); + } + getColor(e3, t3) { + return this._color.get(e3, t3); + } + clear() { + this._color.clear(), this._css.clear(); + } + }; + }, 3656: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.addDisposableDomListener = void 0, t2.addDisposableDomListener = function(e3, t3, i2, s2) { + e3.addEventListener(t3, i2, s2); + let r = false; + return { dispose: () => { + r || (r = true, e3.removeEventListener(t3, i2, s2)); + } }; + }; + }, 3551: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.Linkifier = void 0; + const n = i2(3656), o = i2(8460), a = i2(844), h = i2(2585), c = i2(4725); + let l = t2.Linkifier = class extends a.Disposable { + get currentLink() { + return this._currentLink; + } + constructor(e3, t3, i3, s3, r2) { + super(), this._element = e3, this._mouseService = t3, this._renderService = i3, this._bufferService = s3, this._linkProviderService = r2, this._linkCacheDisposables = [], this._isMouseOut = true, this._wasResized = false, this._activeLine = -1, this._onShowLinkUnderline = this.register(new o.EventEmitter()), this.onShowLinkUnderline = this._onShowLinkUnderline.event, this._onHideLinkUnderline = this.register(new o.EventEmitter()), this.onHideLinkUnderline = this._onHideLinkUnderline.event, this.register((0, a.getDisposeArrayDisposable)(this._linkCacheDisposables)), this.register((0, a.toDisposable)((() => { + var _a; + this._lastMouseEvent = void 0, (_a = this._activeProviderReplies) == null ? void 0 : _a.clear(); + }))), this.register(this._bufferService.onResize((() => { + this._clearCurrentLink(), this._wasResized = true; + }))), this.register((0, n.addDisposableDomListener)(this._element, "mouseleave", (() => { + this._isMouseOut = true, this._clearCurrentLink(); + }))), this.register((0, n.addDisposableDomListener)(this._element, "mousemove", this._handleMouseMove.bind(this))), this.register((0, n.addDisposableDomListener)(this._element, "mousedown", this._handleMouseDown.bind(this))), this.register((0, n.addDisposableDomListener)(this._element, "mouseup", this._handleMouseUp.bind(this))); + } + _handleMouseMove(e3) { + this._lastMouseEvent = e3; + const t3 = this._positionFromMouseEvent(e3, this._element, this._mouseService); + if (!t3) return; + this._isMouseOut = false; + const i3 = e3.composedPath(); + for (let e4 = 0; e4 < i3.length; e4++) { + const t4 = i3[e4]; + if (t4.classList.contains("xterm")) break; + if (t4.classList.contains("xterm-hover")) return; + } + this._lastBufferCell && t3.x === this._lastBufferCell.x && t3.y === this._lastBufferCell.y || (this._handleHover(t3), this._lastBufferCell = t3); + } + _handleHover(e3) { + if (this._activeLine !== e3.y || this._wasResized) return this._clearCurrentLink(), this._askForLink(e3, false), void (this._wasResized = false); + this._currentLink && this._linkAtPosition(this._currentLink.link, e3) || (this._clearCurrentLink(), this._askForLink(e3, true)); + } + _askForLink(e3, t3) { + var _a, _b; + this._activeProviderReplies && t3 || ((_a = this._activeProviderReplies) == null ? void 0 : _a.forEach(((e4) => { + e4 == null ? void 0 : e4.forEach(((e5) => { + e5.link.dispose && e5.link.dispose(); + })); + })), this._activeProviderReplies = /* @__PURE__ */ new Map(), this._activeLine = e3.y); + let i3 = false; + for (const [s3, r2] of this._linkProviderService.linkProviders.entries()) if (t3) { + const t4 = (_b = this._activeProviderReplies) == null ? void 0 : _b.get(s3); + t4 && (i3 = this._checkLinkProviderResult(s3, e3, i3)); + } else r2.provideLinks(e3.y, ((t4) => { + var _a2, _b2; + if (this._isMouseOut) return; + const r3 = t4 == null ? void 0 : t4.map(((e4) => ({ link: e4 }))); + (_a2 = this._activeProviderReplies) == null ? void 0 : _a2.set(s3, r3), i3 = this._checkLinkProviderResult(s3, e3, i3), ((_b2 = this._activeProviderReplies) == null ? void 0 : _b2.size) === this._linkProviderService.linkProviders.length && this._removeIntersectingLinks(e3.y, this._activeProviderReplies); + })); + } + _removeIntersectingLinks(e3, t3) { + const i3 = /* @__PURE__ */ new Set(); + for (let s3 = 0; s3 < t3.size; s3++) { + const r2 = t3.get(s3); + if (r2) for (let t4 = 0; t4 < r2.length; t4++) { + const s4 = r2[t4], n2 = s4.link.range.start.y < e3 ? 0 : s4.link.range.start.x, o2 = s4.link.range.end.y > e3 ? this._bufferService.cols : s4.link.range.end.x; + for (let e4 = n2; e4 <= o2; e4++) { + if (i3.has(e4)) { + r2.splice(t4--, 1); + break; + } + i3.add(e4); + } + } + } + } + _checkLinkProviderResult(e3, t3, i3) { + var _a; + if (!this._activeProviderReplies) return i3; + const s3 = this._activeProviderReplies.get(e3); + let r2 = false; + for (let t4 = 0; t4 < e3; t4++) this._activeProviderReplies.has(t4) && !this._activeProviderReplies.get(t4) || (r2 = true); + if (!r2 && s3) { + const e4 = s3.find(((e5) => this._linkAtPosition(e5.link, t3))); + e4 && (i3 = true, this._handleNewLink(e4)); + } + if (this._activeProviderReplies.size === this._linkProviderService.linkProviders.length && !i3) for (let e4 = 0; e4 < this._activeProviderReplies.size; e4++) { + const s4 = (_a = this._activeProviderReplies.get(e4)) == null ? void 0 : _a.find(((e5) => this._linkAtPosition(e5.link, t3))); + if (s4) { + i3 = true, this._handleNewLink(s4); + break; + } + } + return i3; + } + _handleMouseDown() { + this._mouseDownLink = this._currentLink; + } + _handleMouseUp(e3) { + if (!this._currentLink) return; + const t3 = this._positionFromMouseEvent(e3, this._element, this._mouseService); + t3 && this._mouseDownLink === this._currentLink && this._linkAtPosition(this._currentLink.link, t3) && this._currentLink.link.activate(e3, this._currentLink.link.text); + } + _clearCurrentLink(e3, t3) { + this._currentLink && this._lastMouseEvent && (!e3 || !t3 || this._currentLink.link.range.start.y >= e3 && this._currentLink.link.range.end.y <= t3) && (this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent), this._currentLink = void 0, (0, a.disposeArray)(this._linkCacheDisposables)); + } + _handleNewLink(e3) { + if (!this._lastMouseEvent) return; + const t3 = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService); + t3 && this._linkAtPosition(e3.link, t3) && (this._currentLink = e3, this._currentLink.state = { decorations: { underline: void 0 === e3.link.decorations || e3.link.decorations.underline, pointerCursor: void 0 === e3.link.decorations || e3.link.decorations.pointerCursor }, isHovered: true }, this._linkHover(this._element, e3.link, this._lastMouseEvent), e3.link.decorations = {}, Object.defineProperties(e3.link.decorations, { pointerCursor: { get: () => { + var _a, _b; + return (_b = (_a = this._currentLink) == null ? void 0 : _a.state) == null ? void 0 : _b.decorations.pointerCursor; + }, set: (e4) => { + var _a; + ((_a = this._currentLink) == null ? void 0 : _a.state) && this._currentLink.state.decorations.pointerCursor !== e4 && (this._currentLink.state.decorations.pointerCursor = e4, this._currentLink.state.isHovered && this._element.classList.toggle("xterm-cursor-pointer", e4)); + } }, underline: { get: () => { + var _a, _b; + return (_b = (_a = this._currentLink) == null ? void 0 : _a.state) == null ? void 0 : _b.decorations.underline; + }, set: (t4) => { + var _a, _b, _c; + ((_a = this._currentLink) == null ? void 0 : _a.state) && ((_c = (_b = this._currentLink) == null ? void 0 : _b.state) == null ? void 0 : _c.decorations.underline) !== t4 && (this._currentLink.state.decorations.underline = t4, this._currentLink.state.isHovered && this._fireUnderlineEvent(e3.link, t4)); + } } }), this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(((e4) => { + if (!this._currentLink) return; + const t4 = 0 === e4.start ? 0 : e4.start + 1 + this._bufferService.buffer.ydisp, i3 = this._bufferService.buffer.ydisp + 1 + e4.end; + if (this._currentLink.link.range.start.y >= t4 && this._currentLink.link.range.end.y <= i3 && (this._clearCurrentLink(t4, i3), this._lastMouseEvent)) { + const e5 = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService); + e5 && this._askForLink(e5, false); + } + })))); + } + _linkHover(e3, t3, i3) { + var _a; + ((_a = this._currentLink) == null ? void 0 : _a.state) && (this._currentLink.state.isHovered = true, this._currentLink.state.decorations.underline && this._fireUnderlineEvent(t3, true), this._currentLink.state.decorations.pointerCursor && e3.classList.add("xterm-cursor-pointer")), t3.hover && t3.hover(i3, t3.text); + } + _fireUnderlineEvent(e3, t3) { + const i3 = e3.range, s3 = this._bufferService.buffer.ydisp, r2 = this._createLinkUnderlineEvent(i3.start.x - 1, i3.start.y - s3 - 1, i3.end.x, i3.end.y - s3 - 1, void 0); + (t3 ? this._onShowLinkUnderline : this._onHideLinkUnderline).fire(r2); + } + _linkLeave(e3, t3, i3) { + var _a; + ((_a = this._currentLink) == null ? void 0 : _a.state) && (this._currentLink.state.isHovered = false, this._currentLink.state.decorations.underline && this._fireUnderlineEvent(t3, false), this._currentLink.state.decorations.pointerCursor && e3.classList.remove("xterm-cursor-pointer")), t3.leave && t3.leave(i3, t3.text); + } + _linkAtPosition(e3, t3) { + const i3 = e3.range.start.y * this._bufferService.cols + e3.range.start.x, s3 = e3.range.end.y * this._bufferService.cols + e3.range.end.x, r2 = t3.y * this._bufferService.cols + t3.x; + return i3 <= r2 && r2 <= s3; + } + _positionFromMouseEvent(e3, t3, i3) { + const s3 = i3.getCoords(e3, t3, this._bufferService.cols, this._bufferService.rows); + if (s3) return { x: s3[0], y: s3[1] + this._bufferService.buffer.ydisp }; + } + _createLinkUnderlineEvent(e3, t3, i3, s3, r2) { + return { x1: e3, y1: t3, x2: i3, y2: s3, cols: this._bufferService.cols, fg: r2 }; + } + }; + t2.Linkifier = l = s2([r(1, c.IMouseService), r(2, c.IRenderService), r(3, h.IBufferService), r(4, c.ILinkProviderService)], l); + }, 9042: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.tooMuchOutput = t2.promptLabel = void 0, t2.promptLabel = "Terminal input", t2.tooMuchOutput = "Too much output to announce, navigate to rows manually to read"; + }, 3730: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.OscLinkProvider = void 0; + const n = i2(511), o = i2(2585); + let a = t2.OscLinkProvider = class { + constructor(e3, t3, i3) { + this._bufferService = e3, this._optionsService = t3, this._oscLinkService = i3; + } + provideLinks(e3, t3) { + var _a; + const i3 = this._bufferService.buffer.lines.get(e3 - 1); + if (!i3) return void t3(void 0); + const s3 = [], r2 = this._optionsService.rawOptions.linkHandler, o2 = new n.CellData(), a2 = i3.getTrimmedLength(); + let c = -1, l = -1, d = false; + for (let t4 = 0; t4 < a2; t4++) if (-1 !== l || i3.hasContent(t4)) { + if (i3.loadCell(t4, o2), o2.hasExtendedAttrs() && o2.extended.urlId) { + if (-1 === l) { + l = t4, c = o2.extended.urlId; + continue; + } + d = o2.extended.urlId !== c; + } else -1 !== l && (d = true); + if (d || -1 !== l && t4 === a2 - 1) { + const i4 = (_a = this._oscLinkService.getLinkData(c)) == null ? void 0 : _a.uri; + if (i4) { + const n2 = { start: { x: l + 1, y: e3 }, end: { x: t4 + (d || t4 !== a2 - 1 ? 0 : 1), y: e3 } }; + let o3 = false; + if (!(r2 == null ? void 0 : r2.allowNonHttpProtocols)) try { + const e4 = new URL(i4); + ["http:", "https:"].includes(e4.protocol) || (o3 = true); + } catch (e4) { + o3 = true; + } + o3 || s3.push({ text: i4, range: n2, activate: (e4, t5) => r2 ? r2.activate(e4, t5, n2) : h(0, t5), hover: (e4, t5) => { + var _a2; + return (_a2 = r2 == null ? void 0 : r2.hover) == null ? void 0 : _a2.call(r2, e4, t5, n2); + }, leave: (e4, t5) => { + var _a2; + return (_a2 = r2 == null ? void 0 : r2.leave) == null ? void 0 : _a2.call(r2, e4, t5, n2); + } }); + } + d = false, o2.hasExtendedAttrs() && o2.extended.urlId ? (l = t4, c = o2.extended.urlId) : (l = -1, c = -1); + } + } + t3(s3); + } + }; + function h(e3, t3) { + if (confirm(`Do you want to navigate to ${t3}? -// DOM elements -const loadingOverlay = document.getElementById('loading-overlay'); -const reconnectOverlay = document.getElementById('reconnect-overlay'); -const reconnectSub = document.getElementById('reconnect-sub'); -const statusDot = document.getElementById('status-dot'); -const latencyEl = document.getElementById('latency'); -const barBtn = document.getElementById('bar-btn'); -const topBar = document.getElementById('top-bar'); -const toggleBar = document.getElementById('toggle-bar'); -const terminalContainer = document.getElementById('terminal-container'); +WARNING: This link could potentially be dangerous`)) { + const e4 = window.open(); + if (e4) { + try { + e4.opener = null; + } catch { + } + e4.location.href = t3; + } else console.warn("Opening link blocked as opener could not be cleared"); + } + } + t2.OscLinkProvider = a = s2([r(0, o.IBufferService), r(1, o.IOptionsService), r(2, o.IOscLinkService)], a); + }, 6193: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.RenderDebouncer = void 0, t2.RenderDebouncer = class { + constructor(e3, t3) { + this._renderCallback = e3, this._coreBrowserService = t3, this._refreshCallbacks = []; + } + dispose() { + this._animationFrame && (this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame), this._animationFrame = void 0); + } + addRefreshCallback(e3) { + return this._refreshCallbacks.push(e3), this._animationFrame || (this._animationFrame = this._coreBrowserService.window.requestAnimationFrame((() => this._innerRefresh()))), this._animationFrame; + } + refresh(e3, t3, i2) { + this._rowCount = i2, e3 = void 0 !== e3 ? e3 : 0, t3 = void 0 !== t3 ? t3 : this._rowCount - 1, this._rowStart = void 0 !== this._rowStart ? Math.min(this._rowStart, e3) : e3, this._rowEnd = void 0 !== this._rowEnd ? Math.max(this._rowEnd, t3) : t3, this._animationFrame || (this._animationFrame = this._coreBrowserService.window.requestAnimationFrame((() => this._innerRefresh()))); + } + _innerRefresh() { + if (this._animationFrame = void 0, void 0 === this._rowStart || void 0 === this._rowEnd || void 0 === this._rowCount) return void this._runRefreshCallbacks(); + const e3 = Math.max(this._rowStart, 0), t3 = Math.min(this._rowEnd, this._rowCount - 1); + this._rowStart = void 0, this._rowEnd = void 0, this._renderCallback(e3, t3), this._runRefreshCallbacks(); + } + _runRefreshCallbacks() { + for (const e3 of this._refreshCallbacks) e3(0); + this._refreshCallbacks = []; + } + }; + }, 3236: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Terminal = void 0; + const s2 = i2(3614), r = i2(3656), n = i2(3551), o = i2(9042), a = i2(3730), h = i2(1680), c = i2(3107), l = i2(5744), d = i2(2950), _ = i2(1296), u = i2(428), f = i2(4269), v = i2(5114), p = i2(8934), g = i2(3230), m = i2(9312), S = i2(4725), C = i2(6731), b = i2(8055), w = i2(8969), y = i2(8460), E = i2(844), k = i2(6114), L = i2(8437), D = i2(2584), R = i2(7399), x = i2(5941), A = i2(9074), B = i2(2585), T = i2(5435), M = i2(4567), O = i2(779); + class P extends w.CoreTerminal { + get onFocus() { + return this._onFocus.event; + } + get onBlur() { + return this._onBlur.event; + } + get onA11yChar() { + return this._onA11yCharEmitter.event; + } + get onA11yTab() { + return this._onA11yTabEmitter.event; + } + get onWillOpen() { + return this._onWillOpen.event; + } + constructor(e3 = {}) { + super(e3), this.browser = k, this._keyDownHandled = false, this._keyDownSeen = false, this._keyPressHandled = false, this._unprocessedDeadKey = false, this._accessibilityManager = this.register(new E.MutableDisposable()), this._onCursorMove = this.register(new y.EventEmitter()), this.onCursorMove = this._onCursorMove.event, this._onKey = this.register(new y.EventEmitter()), this.onKey = this._onKey.event, this._onRender = this.register(new y.EventEmitter()), this.onRender = this._onRender.event, this._onSelectionChange = this.register(new y.EventEmitter()), this.onSelectionChange = this._onSelectionChange.event, this._onTitleChange = this.register(new y.EventEmitter()), this.onTitleChange = this._onTitleChange.event, this._onBell = this.register(new y.EventEmitter()), this.onBell = this._onBell.event, this._onFocus = this.register(new y.EventEmitter()), this._onBlur = this.register(new y.EventEmitter()), this._onA11yCharEmitter = this.register(new y.EventEmitter()), this._onA11yTabEmitter = this.register(new y.EventEmitter()), this._onWillOpen = this.register(new y.EventEmitter()), this._setup(), this._decorationService = this._instantiationService.createInstance(A.DecorationService), this._instantiationService.setService(B.IDecorationService, this._decorationService), this._linkProviderService = this._instantiationService.createInstance(O.LinkProviderService), this._instantiationService.setService(S.ILinkProviderService, this._linkProviderService), this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(a.OscLinkProvider)), this.register(this._inputHandler.onRequestBell((() => this._onBell.fire()))), this.register(this._inputHandler.onRequestRefreshRows(((e4, t3) => this.refresh(e4, t3)))), this.register(this._inputHandler.onRequestSendFocus((() => this._reportFocus()))), this.register(this._inputHandler.onRequestReset((() => this.reset()))), this.register(this._inputHandler.onRequestWindowsOptionsReport(((e4) => this._reportWindowsOptions(e4)))), this.register(this._inputHandler.onColor(((e4) => this._handleColorEvent(e4)))), this.register((0, y.forwardEvent)(this._inputHandler.onCursorMove, this._onCursorMove)), this.register((0, y.forwardEvent)(this._inputHandler.onTitleChange, this._onTitleChange)), this.register((0, y.forwardEvent)(this._inputHandler.onA11yChar, this._onA11yCharEmitter)), this.register((0, y.forwardEvent)(this._inputHandler.onA11yTab, this._onA11yTabEmitter)), this.register(this._bufferService.onResize(((e4) => this._afterResize(e4.cols, e4.rows)))), this.register((0, E.toDisposable)((() => { + var _a, _b; + this._customKeyEventHandler = void 0, (_b = (_a = this.element) == null ? void 0 : _a.parentNode) == null ? void 0 : _b.removeChild(this.element); + }))); + } + _handleColorEvent(e3) { + if (this._themeService) for (const t3 of e3) { + let e4, i3 = ""; + switch (t3.index) { + case 256: + e4 = "foreground", i3 = "10"; + break; + case 257: + e4 = "background", i3 = "11"; + break; + case 258: + e4 = "cursor", i3 = "12"; + break; + default: + e4 = "ansi", i3 = "4;" + t3.index; + } + switch (t3.type) { + case 0: + const s3 = b.color.toColorRGB("ansi" === e4 ? this._themeService.colors.ansi[t3.index] : this._themeService.colors[e4]); + this.coreService.triggerDataEvent(`${D.C0.ESC}]${i3};${(0, x.toRgbString)(s3)}${D.C1_ESCAPED.ST}`); + break; + case 1: + if ("ansi" === e4) this._themeService.modifyColors(((e5) => e5.ansi[t3.index] = b.channels.toColor(...t3.color))); + else { + const i4 = e4; + this._themeService.modifyColors(((e5) => e5[i4] = b.channels.toColor(...t3.color))); + } + break; + case 2: + this._themeService.restoreColor(t3.index); + } + } + } + _setup() { + super._setup(), this._customKeyEventHandler = void 0; + } + get buffer() { + return this.buffers.active; + } + focus() { + this.textarea && this.textarea.focus({ preventScroll: true }); + } + _handleScreenReaderModeOptionChange(e3) { + e3 ? !this._accessibilityManager.value && this._renderService && (this._accessibilityManager.value = this._instantiationService.createInstance(M.AccessibilityManager, this)) : this._accessibilityManager.clear(); + } + _handleTextAreaFocus(e3) { + this.coreService.decPrivateModes.sendFocus && this.coreService.triggerDataEvent(D.C0.ESC + "[I"), this.element.classList.add("focus"), this._showCursor(), this._onFocus.fire(); + } + blur() { + var _a; + return (_a = this.textarea) == null ? void 0 : _a.blur(); + } + _handleTextAreaBlur() { + this.textarea.value = "", this.refresh(this.buffer.y, this.buffer.y), this.coreService.decPrivateModes.sendFocus && this.coreService.triggerDataEvent(D.C0.ESC + "[O"), this.element.classList.remove("focus"), this._onBlur.fire(); + } + _syncTextArea() { + if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper.isComposing || !this._renderService) return; + const e3 = this.buffer.ybase + this.buffer.y, t3 = this.buffer.lines.get(e3); + if (!t3) return; + const i3 = Math.min(this.buffer.x, this.cols - 1), s3 = this._renderService.dimensions.css.cell.height, r2 = t3.getWidth(i3), n2 = this._renderService.dimensions.css.cell.width * r2, o2 = this.buffer.y * this._renderService.dimensions.css.cell.height, a2 = i3 * this._renderService.dimensions.css.cell.width; + this.textarea.style.left = a2 + "px", this.textarea.style.top = o2 + "px", this.textarea.style.width = n2 + "px", this.textarea.style.height = s3 + "px", this.textarea.style.lineHeight = s3 + "px", this.textarea.style.zIndex = "-5"; + } + _initGlobal() { + this._bindKeys(), this.register((0, r.addDisposableDomListener)(this.element, "copy", ((e4) => { + this.hasSelection() && (0, s2.copyHandler)(e4, this._selectionService); + }))); + const e3 = (e4) => (0, s2.handlePasteEvent)(e4, this.textarea, this.coreService, this.optionsService); + this.register((0, r.addDisposableDomListener)(this.textarea, "paste", e3)), this.register((0, r.addDisposableDomListener)(this.element, "paste", e3)), k.isFirefox ? this.register((0, r.addDisposableDomListener)(this.element, "mousedown", ((e4) => { + 2 === e4.button && (0, s2.rightClickHandler)(e4, this.textarea, this.screenElement, this._selectionService, this.options.rightClickSelectsWord); + }))) : this.register((0, r.addDisposableDomListener)(this.element, "contextmenu", ((e4) => { + (0, s2.rightClickHandler)(e4, this.textarea, this.screenElement, this._selectionService, this.options.rightClickSelectsWord); + }))), k.isLinux && this.register((0, r.addDisposableDomListener)(this.element, "auxclick", ((e4) => { + 1 === e4.button && (0, s2.moveTextAreaUnderMouseCursor)(e4, this.textarea, this.screenElement); + }))); + } + _bindKeys() { + this.register((0, r.addDisposableDomListener)(this.textarea, "keyup", ((e3) => this._keyUp(e3)), true)), this.register((0, r.addDisposableDomListener)(this.textarea, "keydown", ((e3) => this._keyDown(e3)), true)), this.register((0, r.addDisposableDomListener)(this.textarea, "keypress", ((e3) => this._keyPress(e3)), true)), this.register((0, r.addDisposableDomListener)(this.textarea, "compositionstart", (() => this._compositionHelper.compositionstart()))), this.register((0, r.addDisposableDomListener)(this.textarea, "compositionupdate", ((e3) => this._compositionHelper.compositionupdate(e3)))), this.register((0, r.addDisposableDomListener)(this.textarea, "compositionend", (() => this._compositionHelper.compositionend()))), this.register((0, r.addDisposableDomListener)(this.textarea, "input", ((e3) => this._inputEvent(e3)), true)), this.register(this.onRender((() => this._compositionHelper.updateCompositionElements()))); + } + open(e3) { + var _a; + if (!e3) throw new Error("Terminal requires a parent element."); + if (e3.isConnected || this._logService.debug("Terminal.open was called on an element that was not attached to the DOM"), ((_a = this.element) == null ? void 0 : _a.ownerDocument.defaultView) && this._coreBrowserService) return void (this.element.ownerDocument.defaultView !== this._coreBrowserService.window && (this._coreBrowserService.window = this.element.ownerDocument.defaultView)); + this._document = e3.ownerDocument, this.options.documentOverride && this.options.documentOverride instanceof Document && (this._document = this.optionsService.rawOptions.documentOverride), this.element = this._document.createElement("div"), this.element.dir = "ltr", this.element.classList.add("terminal"), this.element.classList.add("xterm"), e3.appendChild(this.element); + const t3 = this._document.createDocumentFragment(); + this._viewportElement = this._document.createElement("div"), this._viewportElement.classList.add("xterm-viewport"), t3.appendChild(this._viewportElement), this._viewportScrollArea = this._document.createElement("div"), this._viewportScrollArea.classList.add("xterm-scroll-area"), this._viewportElement.appendChild(this._viewportScrollArea), this.screenElement = this._document.createElement("div"), this.screenElement.classList.add("xterm-screen"), this.register((0, r.addDisposableDomListener)(this.screenElement, "mousemove", ((e4) => this.updateCursorStyle(e4)))), this._helperContainer = this._document.createElement("div"), this._helperContainer.classList.add("xterm-helpers"), this.screenElement.appendChild(this._helperContainer), t3.appendChild(this.screenElement), this.textarea = this._document.createElement("textarea"), this.textarea.classList.add("xterm-helper-textarea"), this.textarea.setAttribute("aria-label", o.promptLabel), k.isChromeOS || this.textarea.setAttribute("aria-multiline", "false"), this.textarea.setAttribute("autocorrect", "off"), this.textarea.setAttribute("autocapitalize", "off"), this.textarea.setAttribute("spellcheck", "false"), this.textarea.tabIndex = 0, this._coreBrowserService = this.register(this._instantiationService.createInstance(v.CoreBrowserService, this.textarea, e3.ownerDocument.defaultView ?? window, this._document ?? "undefined" != typeof window ? window.document : null)), this._instantiationService.setService(S.ICoreBrowserService, this._coreBrowserService), this.register((0, r.addDisposableDomListener)(this.textarea, "focus", ((e4) => this._handleTextAreaFocus(e4)))), this.register((0, r.addDisposableDomListener)(this.textarea, "blur", (() => this._handleTextAreaBlur()))), this._helperContainer.appendChild(this.textarea), this._charSizeService = this._instantiationService.createInstance(u.CharSizeService, this._document, this._helperContainer), this._instantiationService.setService(S.ICharSizeService, this._charSizeService), this._themeService = this._instantiationService.createInstance(C.ThemeService), this._instantiationService.setService(S.IThemeService, this._themeService), this._characterJoinerService = this._instantiationService.createInstance(f.CharacterJoinerService), this._instantiationService.setService(S.ICharacterJoinerService, this._characterJoinerService), this._renderService = this.register(this._instantiationService.createInstance(g.RenderService, this.rows, this.screenElement)), this._instantiationService.setService(S.IRenderService, this._renderService), this.register(this._renderService.onRenderedViewportChange(((e4) => this._onRender.fire(e4)))), this.onResize(((e4) => this._renderService.resize(e4.cols, e4.rows))), this._compositionView = this._document.createElement("div"), this._compositionView.classList.add("composition-view"), this._compositionHelper = this._instantiationService.createInstance(d.CompositionHelper, this.textarea, this._compositionView), this._helperContainer.appendChild(this._compositionView), this._mouseService = this._instantiationService.createInstance(p.MouseService), this._instantiationService.setService(S.IMouseService, this._mouseService), this.linkifier = this.register(this._instantiationService.createInstance(n.Linkifier, this.screenElement)), this.element.appendChild(t3); + try { + this._onWillOpen.fire(this.element); + } catch { + } + this._renderService.hasRenderer() || this._renderService.setRenderer(this._createRenderer()), this.viewport = this._instantiationService.createInstance(h.Viewport, this._viewportElement, this._viewportScrollArea), this.viewport.onRequestScrollLines(((e4) => this.scrollLines(e4.amount, e4.suppressScrollEvent, 1))), this.register(this._inputHandler.onRequestSyncScrollBar((() => this.viewport.syncScrollArea()))), this.register(this.viewport), this.register(this.onCursorMove((() => { + this._renderService.handleCursorMove(), this._syncTextArea(); + }))), this.register(this.onResize((() => this._renderService.handleResize(this.cols, this.rows)))), this.register(this.onBlur((() => this._renderService.handleBlur()))), this.register(this.onFocus((() => this._renderService.handleFocus()))), this.register(this._renderService.onDimensionsChange((() => this.viewport.syncScrollArea()))), this._selectionService = this.register(this._instantiationService.createInstance(m.SelectionService, this.element, this.screenElement, this.linkifier)), this._instantiationService.setService(S.ISelectionService, this._selectionService), this.register(this._selectionService.onRequestScrollLines(((e4) => this.scrollLines(e4.amount, e4.suppressScrollEvent)))), this.register(this._selectionService.onSelectionChange((() => this._onSelectionChange.fire()))), this.register(this._selectionService.onRequestRedraw(((e4) => this._renderService.handleSelectionChanged(e4.start, e4.end, e4.columnSelectMode)))), this.register(this._selectionService.onLinuxMouseSelection(((e4) => { + this.textarea.value = e4, this.textarea.focus(), this.textarea.select(); + }))), this.register(this._onScroll.event(((e4) => { + this.viewport.syncScrollArea(), this._selectionService.refresh(); + }))), this.register((0, r.addDisposableDomListener)(this._viewportElement, "scroll", (() => this._selectionService.refresh()))), this.register(this._instantiationService.createInstance(c.BufferDecorationRenderer, this.screenElement)), this.register((0, r.addDisposableDomListener)(this.element, "mousedown", ((e4) => this._selectionService.handleMouseDown(e4)))), this.coreMouseService.areMouseEventsActive ? (this._selectionService.disable(), this.element.classList.add("enable-mouse-events")) : this._selectionService.enable(), this.options.screenReaderMode && (this._accessibilityManager.value = this._instantiationService.createInstance(M.AccessibilityManager, this)), this.register(this.optionsService.onSpecificOptionChange("screenReaderMode", ((e4) => this._handleScreenReaderModeOptionChange(e4)))), this.options.overviewRulerWidth && (this._overviewRulerRenderer = this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer, this._viewportElement, this.screenElement))), this.optionsService.onSpecificOptionChange("overviewRulerWidth", ((e4) => { + !this._overviewRulerRenderer && e4 && this._viewportElement && this.screenElement && (this._overviewRulerRenderer = this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer, this._viewportElement, this.screenElement))); + })), this._charSizeService.measure(), this.refresh(0, this.rows - 1), this._initGlobal(), this.bindMouse(); + } + _createRenderer() { + return this._instantiationService.createInstance(_.DomRenderer, this, this._document, this.element, this.screenElement, this._viewportElement, this._helperContainer, this.linkifier); + } + bindMouse() { + const e3 = this, t3 = this.element; + function i3(t4) { + const i4 = e3._mouseService.getMouseReportCoords(t4, e3.screenElement); + if (!i4) return false; + let s4, r2; + switch (t4.overrideType || t4.type) { + case "mousemove": + r2 = 32, void 0 === t4.buttons ? (s4 = 3, void 0 !== t4.button && (s4 = t4.button < 3 ? t4.button : 3)) : s4 = 1 & t4.buttons ? 0 : 4 & t4.buttons ? 1 : 2 & t4.buttons ? 2 : 3; + break; + case "mouseup": + r2 = 0, s4 = t4.button < 3 ? t4.button : 3; + break; + case "mousedown": + r2 = 1, s4 = t4.button < 3 ? t4.button : 3; + break; + case "wheel": + if (e3._customWheelEventHandler && false === e3._customWheelEventHandler(t4)) return false; + if (0 === e3.viewport.getLinesScrolled(t4)) return false; + r2 = t4.deltaY < 0 ? 0 : 1, s4 = 4; + break; + default: + return false; + } + return !(void 0 === r2 || void 0 === s4 || s4 > 4) && e3.coreMouseService.triggerMouseEvent({ col: i4.col, row: i4.row, x: i4.x, y: i4.y, button: s4, action: r2, ctrl: t4.ctrlKey, alt: t4.altKey, shift: t4.shiftKey }); + } + const s3 = { mouseup: null, wheel: null, mousedrag: null, mousemove: null }, n2 = { mouseup: (e4) => (i3(e4), e4.buttons || (this._document.removeEventListener("mouseup", s3.mouseup), s3.mousedrag && this._document.removeEventListener("mousemove", s3.mousedrag)), this.cancel(e4)), wheel: (e4) => (i3(e4), this.cancel(e4, true)), mousedrag: (e4) => { + e4.buttons && i3(e4); + }, mousemove: (e4) => { + e4.buttons || i3(e4); + } }; + this.register(this.coreMouseService.onProtocolChange(((e4) => { + e4 ? ("debug" === this.optionsService.rawOptions.logLevel && this._logService.debug("Binding to mouse events:", this.coreMouseService.explainEvents(e4)), this.element.classList.add("enable-mouse-events"), this._selectionService.disable()) : (this._logService.debug("Unbinding from mouse events."), this.element.classList.remove("enable-mouse-events"), this._selectionService.enable()), 8 & e4 ? s3.mousemove || (t3.addEventListener("mousemove", n2.mousemove), s3.mousemove = n2.mousemove) : (t3.removeEventListener("mousemove", s3.mousemove), s3.mousemove = null), 16 & e4 ? s3.wheel || (t3.addEventListener("wheel", n2.wheel, { passive: false }), s3.wheel = n2.wheel) : (t3.removeEventListener("wheel", s3.wheel), s3.wheel = null), 2 & e4 ? s3.mouseup || (s3.mouseup = n2.mouseup) : (this._document.removeEventListener("mouseup", s3.mouseup), s3.mouseup = null), 4 & e4 ? s3.mousedrag || (s3.mousedrag = n2.mousedrag) : (this._document.removeEventListener("mousemove", s3.mousedrag), s3.mousedrag = null); + }))), this.coreMouseService.activeProtocol = this.coreMouseService.activeProtocol, this.register((0, r.addDisposableDomListener)(t3, "mousedown", ((e4) => { + if (e4.preventDefault(), this.focus(), this.coreMouseService.areMouseEventsActive && !this._selectionService.shouldForceSelection(e4)) return i3(e4), s3.mouseup && this._document.addEventListener("mouseup", s3.mouseup), s3.mousedrag && this._document.addEventListener("mousemove", s3.mousedrag), this.cancel(e4); + }))), this.register((0, r.addDisposableDomListener)(t3, "wheel", ((e4) => { + if (!s3.wheel) { + if (this._customWheelEventHandler && false === this._customWheelEventHandler(e4)) return false; + if (!this.buffer.hasScrollback) { + const t4 = this.viewport.getLinesScrolled(e4); + if (0 === t4) return; + const i4 = D.C0.ESC + (this.coreService.decPrivateModes.applicationCursorKeys ? "O" : "[") + (e4.deltaY < 0 ? "A" : "B"); + let s4 = ""; + for (let e5 = 0; e5 < Math.abs(t4); e5++) s4 += i4; + return this.coreService.triggerDataEvent(s4, true), this.cancel(e4, true); + } + return this.viewport.handleWheel(e4) ? this.cancel(e4) : void 0; + } + }), { passive: false })), this.register((0, r.addDisposableDomListener)(t3, "touchstart", ((e4) => { + if (!this.coreMouseService.areMouseEventsActive) return this.viewport.handleTouchStart(e4), this.cancel(e4); + }), { passive: true })), this.register((0, r.addDisposableDomListener)(t3, "touchmove", ((e4) => { + if (!this.coreMouseService.areMouseEventsActive) return this.viewport.handleTouchMove(e4) ? void 0 : this.cancel(e4); + }), { passive: false })); + } + refresh(e3, t3) { + var _a; + (_a = this._renderService) == null ? void 0 : _a.refreshRows(e3, t3); + } + updateCursorStyle(e3) { + var _a; + ((_a = this._selectionService) == null ? void 0 : _a.shouldColumnSelect(e3)) ? this.element.classList.add("column-select") : this.element.classList.remove("column-select"); + } + _showCursor() { + this.coreService.isCursorInitialized || (this.coreService.isCursorInitialized = true, this.refresh(this.buffer.y, this.buffer.y)); + } + scrollLines(e3, t3, i3 = 0) { + var _a; + 1 === i3 ? (super.scrollLines(e3, t3, i3), this.refresh(0, this.rows - 1)) : (_a = this.viewport) == null ? void 0 : _a.scrollLines(e3); + } + paste(e3) { + (0, s2.paste)(e3, this.textarea, this.coreService, this.optionsService); + } + attachCustomKeyEventHandler(e3) { + this._customKeyEventHandler = e3; + } + attachCustomWheelEventHandler(e3) { + this._customWheelEventHandler = e3; + } + registerLinkProvider(e3) { + return this._linkProviderService.registerLinkProvider(e3); + } + registerCharacterJoiner(e3) { + if (!this._characterJoinerService) throw new Error("Terminal must be opened first"); + const t3 = this._characterJoinerService.register(e3); + return this.refresh(0, this.rows - 1), t3; + } + deregisterCharacterJoiner(e3) { + if (!this._characterJoinerService) throw new Error("Terminal must be opened first"); + this._characterJoinerService.deregister(e3) && this.refresh(0, this.rows - 1); + } + get markers() { + return this.buffer.markers; + } + registerMarker(e3) { + return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + e3); + } + registerDecoration(e3) { + return this._decorationService.registerDecoration(e3); + } + hasSelection() { + return !!this._selectionService && this._selectionService.hasSelection; + } + select(e3, t3, i3) { + this._selectionService.setSelection(e3, t3, i3); + } + getSelection() { + return this._selectionService ? this._selectionService.selectionText : ""; + } + getSelectionPosition() { + if (this._selectionService && this._selectionService.hasSelection) return { start: { x: this._selectionService.selectionStart[0], y: this._selectionService.selectionStart[1] }, end: { x: this._selectionService.selectionEnd[0], y: this._selectionService.selectionEnd[1] } }; + } + clearSelection() { + var _a; + (_a = this._selectionService) == null ? void 0 : _a.clearSelection(); + } + selectAll() { + var _a; + (_a = this._selectionService) == null ? void 0 : _a.selectAll(); + } + selectLines(e3, t3) { + var _a; + (_a = this._selectionService) == null ? void 0 : _a.selectLines(e3, t3); + } + _keyDown(e3) { + if (this._keyDownHandled = false, this._keyDownSeen = true, this._customKeyEventHandler && false === this._customKeyEventHandler(e3)) return false; + const t3 = this.browser.isMac && this.options.macOptionIsMeta && e3.altKey; + if (!t3 && !this._compositionHelper.keydown(e3)) return this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp && this.scrollToBottom(), false; + t3 || "Dead" !== e3.key && "AltGraph" !== e3.key || (this._unprocessedDeadKey = true); + const i3 = (0, R.evaluateKeyboardEvent)(e3, this.coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta); + if (this.updateCursorStyle(e3), 3 === i3.type || 2 === i3.type) { + const t4 = this.rows - 1; + return this.scrollLines(2 === i3.type ? -t4 : t4), this.cancel(e3, true); + } + return 1 === i3.type && this.selectAll(), !!this._isThirdLevelShift(this.browser, e3) || (i3.cancel && this.cancel(e3, true), !i3.key || !!(e3.key && !e3.ctrlKey && !e3.altKey && !e3.metaKey && 1 === e3.key.length && e3.key.charCodeAt(0) >= 65 && e3.key.charCodeAt(0) <= 90) || (this._unprocessedDeadKey ? (this._unprocessedDeadKey = false, true) : (i3.key !== D.C0.ETX && i3.key !== D.C0.CR || (this.textarea.value = ""), this._onKey.fire({ key: i3.key, domEvent: e3 }), this._showCursor(), this.coreService.triggerDataEvent(i3.key, true), !this.optionsService.rawOptions.screenReaderMode || e3.altKey || e3.ctrlKey ? this.cancel(e3, true) : void (this._keyDownHandled = true)))); + } + _isThirdLevelShift(e3, t3) { + const i3 = e3.isMac && !this.options.macOptionIsMeta && t3.altKey && !t3.ctrlKey && !t3.metaKey || e3.isWindows && t3.altKey && t3.ctrlKey && !t3.metaKey || e3.isWindows && t3.getModifierState("AltGraph"); + return "keypress" === t3.type ? i3 : i3 && (!t3.keyCode || t3.keyCode > 47); + } + _keyUp(e3) { + this._keyDownSeen = false, this._customKeyEventHandler && false === this._customKeyEventHandler(e3) || ((function(e4) { + return 16 === e4.keyCode || 17 === e4.keyCode || 18 === e4.keyCode; + })(e3) || this.focus(), this.updateCursorStyle(e3), this._keyPressHandled = false); + } + _keyPress(e3) { + let t3; + if (this._keyPressHandled = false, this._keyDownHandled) return false; + if (this._customKeyEventHandler && false === this._customKeyEventHandler(e3)) return false; + if (this.cancel(e3), e3.charCode) t3 = e3.charCode; + else if (null === e3.which || void 0 === e3.which) t3 = e3.keyCode; + else { + if (0 === e3.which || 0 === e3.charCode) return false; + t3 = e3.which; + } + return !(!t3 || (e3.altKey || e3.ctrlKey || e3.metaKey) && !this._isThirdLevelShift(this.browser, e3) || (t3 = String.fromCharCode(t3), this._onKey.fire({ key: t3, domEvent: e3 }), this._showCursor(), this.coreService.triggerDataEvent(t3, true), this._keyPressHandled = true, this._unprocessedDeadKey = false, 0)); + } + _inputEvent(e3) { + if (e3.data && "insertText" === e3.inputType && (!e3.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) { + if (this._keyPressHandled) return false; + this._unprocessedDeadKey = false; + const t3 = e3.data; + return this.coreService.triggerDataEvent(t3, true), this.cancel(e3), true; + } + return false; + } + resize(e3, t3) { + e3 !== this.cols || t3 !== this.rows ? super.resize(e3, t3) : this._charSizeService && !this._charSizeService.hasValidSize && this._charSizeService.measure(); + } + _afterResize(e3, t3) { + var _a, _b; + (_a = this._charSizeService) == null ? void 0 : _a.measure(), (_b = this.viewport) == null ? void 0 : _b.syncScrollArea(true); + } + clear() { + var _a; + if (0 !== this.buffer.ybase || 0 !== this.buffer.y) { + this.buffer.clearAllMarkers(), this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)), this.buffer.lines.length = 1, this.buffer.ydisp = 0, this.buffer.ybase = 0, this.buffer.y = 0; + for (let e3 = 1; e3 < this.rows; e3++) this.buffer.lines.push(this.buffer.getBlankLine(L.DEFAULT_ATTR_DATA)); + this._onScroll.fire({ position: this.buffer.ydisp, source: 0 }), (_a = this.viewport) == null ? void 0 : _a.reset(), this.refresh(0, this.rows - 1); + } + } + reset() { + var _a, _b; + this.options.rows = this.rows, this.options.cols = this.cols; + const e3 = this._customKeyEventHandler; + this._setup(), super.reset(), (_a = this._selectionService) == null ? void 0 : _a.reset(), this._decorationService.reset(), (_b = this.viewport) == null ? void 0 : _b.reset(), this._customKeyEventHandler = e3, this.refresh(0, this.rows - 1); + } + clearTextureAtlas() { + var _a; + (_a = this._renderService) == null ? void 0 : _a.clearTextureAtlas(); + } + _reportFocus() { + var _a; + ((_a = this.element) == null ? void 0 : _a.classList.contains("focus")) ? this.coreService.triggerDataEvent(D.C0.ESC + "[I") : this.coreService.triggerDataEvent(D.C0.ESC + "[O"); + } + _reportWindowsOptions(e3) { + if (this._renderService) switch (e3) { + case T.WindowsOptionsReportType.GET_WIN_SIZE_PIXELS: + const e4 = this._renderService.dimensions.css.canvas.width.toFixed(0), t3 = this._renderService.dimensions.css.canvas.height.toFixed(0); + this.coreService.triggerDataEvent(`${D.C0.ESC}[4;${t3};${e4}t`); + break; + case T.WindowsOptionsReportType.GET_CELL_SIZE_PIXELS: + const i3 = this._renderService.dimensions.css.cell.width.toFixed(0), s3 = this._renderService.dimensions.css.cell.height.toFixed(0); + this.coreService.triggerDataEvent(`${D.C0.ESC}[6;${s3};${i3}t`); + } + } + cancel(e3, t3) { + if (this.options.cancelEvents || t3) return e3.preventDefault(), e3.stopPropagation(), false; + } + } + t2.Terminal = P; + }, 9924: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.TimeBasedDebouncer = void 0, t2.TimeBasedDebouncer = class { + constructor(e3, t3 = 1e3) { + this._renderCallback = e3, this._debounceThresholdMS = t3, this._lastRefreshMs = 0, this._additionalRefreshRequested = false; + } + dispose() { + this._refreshTimeoutID && clearTimeout(this._refreshTimeoutID); + } + refresh(e3, t3, i2) { + this._rowCount = i2, e3 = void 0 !== e3 ? e3 : 0, t3 = void 0 !== t3 ? t3 : this._rowCount - 1, this._rowStart = void 0 !== this._rowStart ? Math.min(this._rowStart, e3) : e3, this._rowEnd = void 0 !== this._rowEnd ? Math.max(this._rowEnd, t3) : t3; + const s2 = Date.now(); + if (s2 - this._lastRefreshMs >= this._debounceThresholdMS) this._lastRefreshMs = s2, this._innerRefresh(); + else if (!this._additionalRefreshRequested) { + const e4 = s2 - this._lastRefreshMs, t4 = this._debounceThresholdMS - e4; + this._additionalRefreshRequested = true, this._refreshTimeoutID = window.setTimeout((() => { + this._lastRefreshMs = Date.now(), this._innerRefresh(), this._additionalRefreshRequested = false, this._refreshTimeoutID = void 0; + }), t4); + } + } + _innerRefresh() { + if (void 0 === this._rowStart || void 0 === this._rowEnd || void 0 === this._rowCount) return; + const e3 = Math.max(this._rowStart, 0), t3 = Math.min(this._rowEnd, this._rowCount - 1); + this._rowStart = void 0, this._rowEnd = void 0, this._renderCallback(e3, t3); + } + }; + }, 1680: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.Viewport = void 0; + const n = i2(3656), o = i2(4725), a = i2(8460), h = i2(844), c = i2(2585); + let l = t2.Viewport = class extends h.Disposable { + constructor(e3, t3, i3, s3, r2, o2, h2, c2) { + super(), this._viewportElement = e3, this._scrollArea = t3, this._bufferService = i3, this._optionsService = s3, this._charSizeService = r2, this._renderService = o2, this._coreBrowserService = h2, this.scrollBarWidth = 0, this._currentRowHeight = 0, this._currentDeviceCellHeight = 0, this._lastRecordedBufferLength = 0, this._lastRecordedViewportHeight = 0, this._lastRecordedBufferHeight = 0, this._lastTouchY = 0, this._lastScrollTop = 0, this._wheelPartialScroll = 0, this._refreshAnimationFrame = null, this._ignoreNextScrollEvent = false, this._smoothScrollState = { startTime: 0, origin: -1, target: -1 }, this._onRequestScrollLines = this.register(new a.EventEmitter()), this.onRequestScrollLines = this._onRequestScrollLines.event, this.scrollBarWidth = this._viewportElement.offsetWidth - this._scrollArea.offsetWidth || 15, this.register((0, n.addDisposableDomListener)(this._viewportElement, "scroll", this._handleScroll.bind(this))), this._activeBuffer = this._bufferService.buffer, this.register(this._bufferService.buffers.onBufferActivate(((e4) => this._activeBuffer = e4.activeBuffer))), this._renderDimensions = this._renderService.dimensions, this.register(this._renderService.onDimensionsChange(((e4) => this._renderDimensions = e4))), this._handleThemeChange(c2.colors), this.register(c2.onChangeColors(((e4) => this._handleThemeChange(e4)))), this.register(this._optionsService.onSpecificOptionChange("scrollback", (() => this.syncScrollArea()))), setTimeout((() => this.syncScrollArea())); + } + _handleThemeChange(e3) { + this._viewportElement.style.backgroundColor = e3.background.css; + } + reset() { + this._currentRowHeight = 0, this._currentDeviceCellHeight = 0, this._lastRecordedBufferLength = 0, this._lastRecordedViewportHeight = 0, this._lastRecordedBufferHeight = 0, this._lastTouchY = 0, this._lastScrollTop = 0, this._coreBrowserService.window.requestAnimationFrame((() => this.syncScrollArea())); + } + _refresh(e3) { + if (e3) return this._innerRefresh(), void (null !== this._refreshAnimationFrame && this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame)); + null === this._refreshAnimationFrame && (this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame((() => this._innerRefresh()))); + } + _innerRefresh() { + if (this._charSizeService.height > 0) { + this._currentRowHeight = this._renderDimensions.device.cell.height / this._coreBrowserService.dpr, this._currentDeviceCellHeight = this._renderDimensions.device.cell.height, this._lastRecordedViewportHeight = this._viewportElement.offsetHeight; + const e4 = Math.round(this._currentRowHeight * this._lastRecordedBufferLength) + (this._lastRecordedViewportHeight - this._renderDimensions.css.canvas.height); + this._lastRecordedBufferHeight !== e4 && (this._lastRecordedBufferHeight = e4, this._scrollArea.style.height = this._lastRecordedBufferHeight + "px"); + } + const e3 = this._bufferService.buffer.ydisp * this._currentRowHeight; + this._viewportElement.scrollTop !== e3 && (this._ignoreNextScrollEvent = true, this._viewportElement.scrollTop = e3), this._refreshAnimationFrame = null; + } + syncScrollArea(e3 = false) { + if (this._lastRecordedBufferLength !== this._bufferService.buffer.lines.length) return this._lastRecordedBufferLength = this._bufferService.buffer.lines.length, void this._refresh(e3); + this._lastRecordedViewportHeight === this._renderService.dimensions.css.canvas.height && this._lastScrollTop === this._activeBuffer.ydisp * this._currentRowHeight && this._renderDimensions.device.cell.height === this._currentDeviceCellHeight || this._refresh(e3); + } + _handleScroll(e3) { + if (this._lastScrollTop = this._viewportElement.scrollTop, !this._viewportElement.offsetParent) return; + if (this._ignoreNextScrollEvent) return this._ignoreNextScrollEvent = false, void this._onRequestScrollLines.fire({ amount: 0, suppressScrollEvent: true }); + const t3 = Math.round(this._lastScrollTop / this._currentRowHeight) - this._bufferService.buffer.ydisp; + this._onRequestScrollLines.fire({ amount: t3, suppressScrollEvent: true }); + } + _smoothScroll() { + if (this._isDisposed || -1 === this._smoothScrollState.origin || -1 === this._smoothScrollState.target) return; + const e3 = this._smoothScrollPercent(); + this._viewportElement.scrollTop = this._smoothScrollState.origin + Math.round(e3 * (this._smoothScrollState.target - this._smoothScrollState.origin)), e3 < 1 ? this._coreBrowserService.window.requestAnimationFrame((() => this._smoothScroll())) : this._clearSmoothScrollState(); + } + _smoothScrollPercent() { + return this._optionsService.rawOptions.smoothScrollDuration && this._smoothScrollState.startTime ? Math.max(Math.min((Date.now() - this._smoothScrollState.startTime) / this._optionsService.rawOptions.smoothScrollDuration, 1), 0) : 1; + } + _clearSmoothScrollState() { + this._smoothScrollState.startTime = 0, this._smoothScrollState.origin = -1, this._smoothScrollState.target = -1; + } + _bubbleScroll(e3, t3) { + const i3 = this._viewportElement.scrollTop + this._lastRecordedViewportHeight; + return !(t3 < 0 && 0 !== this._viewportElement.scrollTop || t3 > 0 && i3 < this._lastRecordedBufferHeight) || (e3.cancelable && e3.preventDefault(), false); + } + handleWheel(e3) { + const t3 = this._getPixelsScrolled(e3); + return 0 !== t3 && (this._optionsService.rawOptions.smoothScrollDuration ? (this._smoothScrollState.startTime = Date.now(), this._smoothScrollPercent() < 1 ? (this._smoothScrollState.origin = this._viewportElement.scrollTop, -1 === this._smoothScrollState.target ? this._smoothScrollState.target = this._viewportElement.scrollTop + t3 : this._smoothScrollState.target += t3, this._smoothScrollState.target = Math.max(Math.min(this._smoothScrollState.target, this._viewportElement.scrollHeight), 0), this._smoothScroll()) : this._clearSmoothScrollState()) : this._viewportElement.scrollTop += t3, this._bubbleScroll(e3, t3)); + } + scrollLines(e3) { + if (0 !== e3) if (this._optionsService.rawOptions.smoothScrollDuration) { + const t3 = e3 * this._currentRowHeight; + this._smoothScrollState.startTime = Date.now(), this._smoothScrollPercent() < 1 ? (this._smoothScrollState.origin = this._viewportElement.scrollTop, this._smoothScrollState.target = this._smoothScrollState.origin + t3, this._smoothScrollState.target = Math.max(Math.min(this._smoothScrollState.target, this._viewportElement.scrollHeight), 0), this._smoothScroll()) : this._clearSmoothScrollState(); + } else this._onRequestScrollLines.fire({ amount: e3, suppressScrollEvent: false }); + } + _getPixelsScrolled(e3) { + if (0 === e3.deltaY || e3.shiftKey) return 0; + let t3 = this._applyScrollModifier(e3.deltaY, e3); + return e3.deltaMode === WheelEvent.DOM_DELTA_LINE ? t3 *= this._currentRowHeight : e3.deltaMode === WheelEvent.DOM_DELTA_PAGE && (t3 *= this._currentRowHeight * this._bufferService.rows), t3; + } + getBufferElements(e3, t3) { + var _a; + let i3, s3 = ""; + const r2 = [], n2 = t3 ?? this._bufferService.buffer.lines.length, o2 = this._bufferService.buffer.lines; + for (let t4 = e3; t4 < n2; t4++) { + const e4 = o2.get(t4); + if (!e4) continue; + const n3 = (_a = o2.get(t4 + 1)) == null ? void 0 : _a.isWrapped; + if (s3 += e4.translateToString(!n3), !n3 || t4 === o2.length - 1) { + const e5 = document.createElement("div"); + e5.textContent = s3, r2.push(e5), s3.length > 0 && (i3 = e5), s3 = ""; + } + } + return { bufferElements: r2, cursorElement: i3 }; + } + getLinesScrolled(e3) { + if (0 === e3.deltaY || e3.shiftKey) return 0; + let t3 = this._applyScrollModifier(e3.deltaY, e3); + return e3.deltaMode === WheelEvent.DOM_DELTA_PIXEL ? (t3 /= this._currentRowHeight + 0, this._wheelPartialScroll += t3, t3 = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1), this._wheelPartialScroll %= 1) : e3.deltaMode === WheelEvent.DOM_DELTA_PAGE && (t3 *= this._bufferService.rows), t3; + } + _applyScrollModifier(e3, t3) { + const i3 = this._optionsService.rawOptions.fastScrollModifier; + return "alt" === i3 && t3.altKey || "ctrl" === i3 && t3.ctrlKey || "shift" === i3 && t3.shiftKey ? e3 * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity : e3 * this._optionsService.rawOptions.scrollSensitivity; + } + handleTouchStart(e3) { + this._lastTouchY = e3.touches[0].pageY; + } + handleTouchMove(e3) { + const t3 = this._lastTouchY - e3.touches[0].pageY; + return this._lastTouchY = e3.touches[0].pageY, 0 !== t3 && (this._viewportElement.scrollTop += t3, this._bubbleScroll(e3, t3)); + } + }; + t2.Viewport = l = s2([r(2, c.IBufferService), r(3, c.IOptionsService), r(4, o.ICharSizeService), r(5, o.IRenderService), r(6, o.ICoreBrowserService), r(7, o.IThemeService)], l); + }, 3107: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferDecorationRenderer = void 0; + const n = i2(4725), o = i2(844), a = i2(2585); + let h = t2.BufferDecorationRenderer = class extends o.Disposable { + constructor(e3, t3, i3, s3, r2) { + super(), this._screenElement = e3, this._bufferService = t3, this._coreBrowserService = i3, this._decorationService = s3, this._renderService = r2, this._decorationElements = /* @__PURE__ */ new Map(), this._altBufferIsActive = false, this._dimensionsChanged = false, this._container = document.createElement("div"), this._container.classList.add("xterm-decoration-container"), this._screenElement.appendChild(this._container), this.register(this._renderService.onRenderedViewportChange((() => this._doRefreshDecorations()))), this.register(this._renderService.onDimensionsChange((() => { + this._dimensionsChanged = true, this._queueRefresh(); + }))), this.register(this._coreBrowserService.onDprChange((() => this._queueRefresh()))), this.register(this._bufferService.buffers.onBufferActivate((() => { + this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt; + }))), this.register(this._decorationService.onDecorationRegistered((() => this._queueRefresh()))), this.register(this._decorationService.onDecorationRemoved(((e4) => this._removeDecoration(e4)))), this.register((0, o.toDisposable)((() => { + this._container.remove(), this._decorationElements.clear(); + }))); + } + _queueRefresh() { + void 0 === this._animationFrame && (this._animationFrame = this._renderService.addRefreshCallback((() => { + this._doRefreshDecorations(), this._animationFrame = void 0; + }))); + } + _doRefreshDecorations() { + for (const e3 of this._decorationService.decorations) this._renderDecoration(e3); + this._dimensionsChanged = false; + } + _renderDecoration(e3) { + this._refreshStyle(e3), this._dimensionsChanged && this._refreshXPosition(e3); + } + _createElement(e3) { + var _a; + const t3 = this._coreBrowserService.mainDocument.createElement("div"); + t3.classList.add("xterm-decoration"), t3.classList.toggle("xterm-decoration-top-layer", "top" === ((_a = e3 == null ? void 0 : e3.options) == null ? void 0 : _a.layer)), t3.style.width = `${Math.round((e3.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`, t3.style.height = (e3.options.height || 1) * this._renderService.dimensions.css.cell.height + "px", t3.style.top = (e3.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height + "px", t3.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`; + const i3 = e3.options.x ?? 0; + return i3 && i3 > this._bufferService.cols && (t3.style.display = "none"), this._refreshXPosition(e3, t3), t3; + } + _refreshStyle(e3) { + const t3 = e3.marker.line - this._bufferService.buffers.active.ydisp; + if (t3 < 0 || t3 >= this._bufferService.rows) e3.element && (e3.element.style.display = "none", e3.onRenderEmitter.fire(e3.element)); + else { + let i3 = this._decorationElements.get(e3); + i3 || (i3 = this._createElement(e3), e3.element = i3, this._decorationElements.set(e3, i3), this._container.appendChild(i3), e3.onDispose((() => { + this._decorationElements.delete(e3), i3.remove(); + }))), i3.style.top = t3 * this._renderService.dimensions.css.cell.height + "px", i3.style.display = this._altBufferIsActive ? "none" : "block", e3.onRenderEmitter.fire(i3); + } + } + _refreshXPosition(e3, t3 = e3.element) { + if (!t3) return; + const i3 = e3.options.x ?? 0; + "right" === (e3.options.anchor || "left") ? t3.style.right = i3 ? i3 * this._renderService.dimensions.css.cell.width + "px" : "" : t3.style.left = i3 ? i3 * this._renderService.dimensions.css.cell.width + "px" : ""; + } + _removeDecoration(e3) { + var _a; + (_a = this._decorationElements.get(e3)) == null ? void 0 : _a.remove(), this._decorationElements.delete(e3), e3.dispose(); + } + }; + t2.BufferDecorationRenderer = h = s2([r(1, a.IBufferService), r(2, n.ICoreBrowserService), r(3, a.IDecorationService), r(4, n.IRenderService)], h); + }, 5871: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ColorZoneStore = void 0, t2.ColorZoneStore = class { + constructor() { + this._zones = [], this._zonePool = [], this._zonePoolIndex = 0, this._linePadding = { full: 0, left: 0, center: 0, right: 0 }; + } + get zones() { + return this._zonePool.length = Math.min(this._zonePool.length, this._zones.length), this._zones; + } + clear() { + this._zones.length = 0, this._zonePoolIndex = 0; + } + addDecoration(e3) { + if (e3.options.overviewRulerOptions) { + for (const t3 of this._zones) if (t3.color === e3.options.overviewRulerOptions.color && t3.position === e3.options.overviewRulerOptions.position) { + if (this._lineIntersectsZone(t3, e3.marker.line)) return; + if (this._lineAdjacentToZone(t3, e3.marker.line, e3.options.overviewRulerOptions.position)) return void this._addLineToZone(t3, e3.marker.line); + } + if (this._zonePoolIndex < this._zonePool.length) return this._zonePool[this._zonePoolIndex].color = e3.options.overviewRulerOptions.color, this._zonePool[this._zonePoolIndex].position = e3.options.overviewRulerOptions.position, this._zonePool[this._zonePoolIndex].startBufferLine = e3.marker.line, this._zonePool[this._zonePoolIndex].endBufferLine = e3.marker.line, void this._zones.push(this._zonePool[this._zonePoolIndex++]); + this._zones.push({ color: e3.options.overviewRulerOptions.color, position: e3.options.overviewRulerOptions.position, startBufferLine: e3.marker.line, endBufferLine: e3.marker.line }), this._zonePool.push(this._zones[this._zones.length - 1]), this._zonePoolIndex++; + } + } + setPadding(e3) { + this._linePadding = e3; + } + _lineIntersectsZone(e3, t3) { + return t3 >= e3.startBufferLine && t3 <= e3.endBufferLine; + } + _lineAdjacentToZone(e3, t3, i2) { + return t3 >= e3.startBufferLine - this._linePadding[i2 || "full"] && t3 <= e3.endBufferLine + this._linePadding[i2 || "full"]; + } + _addLineToZone(e3, t3) { + e3.startBufferLine = Math.min(e3.startBufferLine, t3), e3.endBufferLine = Math.max(e3.endBufferLine, t3); + } + }; + }, 5744: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.OverviewRulerRenderer = void 0; + const n = i2(5871), o = i2(4725), a = i2(844), h = i2(2585), c = { full: 0, left: 0, center: 0, right: 0 }, l = { full: 0, left: 0, center: 0, right: 0 }, d = { full: 0, left: 0, center: 0, right: 0 }; + let _ = t2.OverviewRulerRenderer = class extends a.Disposable { + get _width() { + return this._optionsService.options.overviewRulerWidth || 0; + } + constructor(e3, t3, i3, s3, r2, o2, h2) { + var _a; + super(), this._viewportElement = e3, this._screenElement = t3, this._bufferService = i3, this._decorationService = s3, this._renderService = r2, this._optionsService = o2, this._coreBrowserService = h2, this._colorZoneStore = new n.ColorZoneStore(), this._shouldUpdateDimensions = true, this._shouldUpdateAnchor = true, this._lastKnownBufferLength = 0, this._canvas = this._coreBrowserService.mainDocument.createElement("canvas"), this._canvas.classList.add("xterm-decoration-overview-ruler"), this._refreshCanvasDimensions(), (_a = this._viewportElement.parentElement) == null ? void 0 : _a.insertBefore(this._canvas, this._viewportElement); + const c2 = this._canvas.getContext("2d"); + if (!c2) throw new Error("Ctx cannot be null"); + this._ctx = c2, this._registerDecorationListeners(), this._registerBufferChangeListeners(), this._registerDimensionChangeListeners(), this.register((0, a.toDisposable)((() => { + var _a2; + (_a2 = this._canvas) == null ? void 0 : _a2.remove(); + }))); + } + _registerDecorationListeners() { + this.register(this._decorationService.onDecorationRegistered((() => this._queueRefresh(void 0, true)))), this.register(this._decorationService.onDecorationRemoved((() => this._queueRefresh(void 0, true)))); + } + _registerBufferChangeListeners() { + this.register(this._renderService.onRenderedViewportChange((() => this._queueRefresh()))), this.register(this._bufferService.buffers.onBufferActivate((() => { + this._canvas.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? "none" : "block"; + }))), this.register(this._bufferService.onScroll((() => { + this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length && (this._refreshDrawHeightConstants(), this._refreshColorZonePadding()); + }))); + } + _registerDimensionChangeListeners() { + this.register(this._renderService.onRender((() => { + this._containerHeight && this._containerHeight === this._screenElement.clientHeight || (this._queueRefresh(true), this._containerHeight = this._screenElement.clientHeight); + }))), this.register(this._optionsService.onSpecificOptionChange("overviewRulerWidth", (() => this._queueRefresh(true)))), this.register(this._coreBrowserService.onDprChange((() => this._queueRefresh(true)))), this._queueRefresh(true); + } + _refreshDrawConstants() { + const e3 = Math.floor(this._canvas.width / 3), t3 = Math.ceil(this._canvas.width / 3); + l.full = this._canvas.width, l.left = e3, l.center = t3, l.right = e3, this._refreshDrawHeightConstants(), d.full = 0, d.left = 0, d.center = l.left, d.right = l.left + l.center; + } + _refreshDrawHeightConstants() { + c.full = Math.round(2 * this._coreBrowserService.dpr); + const e3 = this._canvas.height / this._bufferService.buffer.lines.length, t3 = Math.round(Math.max(Math.min(e3, 12), 6) * this._coreBrowserService.dpr); + c.left = t3, c.center = t3, c.right = t3; + } + _refreshColorZonePadding() { + this._colorZoneStore.setPadding({ full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * c.full), left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * c.left), center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * c.center), right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * c.right) }), this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length; + } + _refreshCanvasDimensions() { + this._canvas.style.width = `${this._width}px`, this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr), this._canvas.style.height = `${this._screenElement.clientHeight}px`, this._canvas.height = Math.round(this._screenElement.clientHeight * this._coreBrowserService.dpr), this._refreshDrawConstants(), this._refreshColorZonePadding(); + } + _refreshDecorations() { + this._shouldUpdateDimensions && this._refreshCanvasDimensions(), this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height), this._colorZoneStore.clear(); + for (const e4 of this._decorationService.decorations) this._colorZoneStore.addDecoration(e4); + this._ctx.lineWidth = 1; + const e3 = this._colorZoneStore.zones; + for (const t3 of e3) "full" !== t3.position && this._renderColorZone(t3); + for (const t3 of e3) "full" === t3.position && this._renderColorZone(t3); + this._shouldUpdateDimensions = false, this._shouldUpdateAnchor = false; + } + _renderColorZone(e3) { + this._ctx.fillStyle = e3.color, this._ctx.fillRect(d[e3.position || "full"], Math.round((this._canvas.height - 1) * (e3.startBufferLine / this._bufferService.buffers.active.lines.length) - c[e3.position || "full"] / 2), l[e3.position || "full"], Math.round((this._canvas.height - 1) * ((e3.endBufferLine - e3.startBufferLine) / this._bufferService.buffers.active.lines.length) + c[e3.position || "full"])); + } + _queueRefresh(e3, t3) { + this._shouldUpdateDimensions = e3 || this._shouldUpdateDimensions, this._shouldUpdateAnchor = t3 || this._shouldUpdateAnchor, void 0 === this._animationFrame && (this._animationFrame = this._coreBrowserService.window.requestAnimationFrame((() => { + this._refreshDecorations(), this._animationFrame = void 0; + }))); + } + }; + t2.OverviewRulerRenderer = _ = s2([r(2, h.IBufferService), r(3, h.IDecorationService), r(4, o.IRenderService), r(5, h.IOptionsService), r(6, o.ICoreBrowserService)], _); + }, 2950: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.CompositionHelper = void 0; + const n = i2(4725), o = i2(2585), a = i2(2584); + let h = t2.CompositionHelper = class { + get isComposing() { + return this._isComposing; + } + constructor(e3, t3, i3, s3, r2, n2) { + this._textarea = e3, this._compositionView = t3, this._bufferService = i3, this._optionsService = s3, this._coreService = r2, this._renderService = n2, this._isComposing = false, this._isSendingComposition = false, this._compositionPosition = { start: 0, end: 0 }, this._dataAlreadySent = ""; + } + compositionstart() { + this._isComposing = true, this._compositionPosition.start = this._textarea.value.length, this._compositionView.textContent = "", this._dataAlreadySent = "", this._compositionView.classList.add("active"); + } + compositionupdate(e3) { + this._compositionView.textContent = e3.data, this.updateCompositionElements(), setTimeout((() => { + this._compositionPosition.end = this._textarea.value.length; + }), 0); + } + compositionend() { + this._finalizeComposition(true); + } + keydown(e3) { + if (this._isComposing || this._isSendingComposition) { + if (229 === e3.keyCode) return false; + if (16 === e3.keyCode || 17 === e3.keyCode || 18 === e3.keyCode) return false; + this._finalizeComposition(false); + } + return 229 !== e3.keyCode || (this._handleAnyTextareaChanges(), false); + } + _finalizeComposition(e3) { + if (this._compositionView.classList.remove("active"), this._isComposing = false, e3) { + const e4 = { start: this._compositionPosition.start, end: this._compositionPosition.end }; + this._isSendingComposition = true, setTimeout((() => { + if (this._isSendingComposition) { + let t3; + this._isSendingComposition = false, e4.start += this._dataAlreadySent.length, t3 = this._isComposing ? this._textarea.value.substring(e4.start, e4.end) : this._textarea.value.substring(e4.start), t3.length > 0 && this._coreService.triggerDataEvent(t3, true); + } + }), 0); + } else { + this._isSendingComposition = false; + const e4 = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end); + this._coreService.triggerDataEvent(e4, true); + } + } + _handleAnyTextareaChanges() { + const e3 = this._textarea.value; + setTimeout((() => { + if (!this._isComposing) { + const t3 = this._textarea.value, i3 = t3.replace(e3, ""); + this._dataAlreadySent = i3, t3.length > e3.length ? this._coreService.triggerDataEvent(i3, true) : t3.length < e3.length ? this._coreService.triggerDataEvent(`${a.C0.DEL}`, true) : t3.length === e3.length && t3 !== e3 && this._coreService.triggerDataEvent(t3, true); + } + }), 0); + } + updateCompositionElements(e3) { + if (this._isComposing) { + if (this._bufferService.buffer.isCursorInViewport) { + const e4 = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1), t3 = this._renderService.dimensions.css.cell.height, i3 = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height, s3 = e4 * this._renderService.dimensions.css.cell.width; + this._compositionView.style.left = s3 + "px", this._compositionView.style.top = i3 + "px", this._compositionView.style.height = t3 + "px", this._compositionView.style.lineHeight = t3 + "px", this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily, this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + "px"; + const r2 = this._compositionView.getBoundingClientRect(); + this._textarea.style.left = s3 + "px", this._textarea.style.top = i3 + "px", this._textarea.style.width = Math.max(r2.width, 1) + "px", this._textarea.style.height = Math.max(r2.height, 1) + "px", this._textarea.style.lineHeight = r2.height + "px"; + } + e3 || setTimeout((() => this.updateCompositionElements(true)), 0); + } + } + }; + t2.CompositionHelper = h = s2([r(2, o.IBufferService), r(3, o.IOptionsService), r(4, o.ICoreService), r(5, n.IRenderService)], h); + }, 9806: (e2, t2) => { + function i2(e3, t3, i3) { + const s2 = i3.getBoundingClientRect(), r = e3.getComputedStyle(i3), n = parseInt(r.getPropertyValue("padding-left")), o = parseInt(r.getPropertyValue("padding-top")); + return [t3.clientX - s2.left - n, t3.clientY - s2.top - o]; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.getCoords = t2.getCoordsRelativeToElement = void 0, t2.getCoordsRelativeToElement = i2, t2.getCoords = function(e3, t3, s2, r, n, o, a, h, c) { + if (!o) return; + const l = i2(e3, t3, s2); + return l ? (l[0] = Math.ceil((l[0] + (c ? a / 2 : 0)) / a), l[1] = Math.ceil(l[1] / h), l[0] = Math.min(Math.max(l[0], 1), r + (c ? 1 : 0)), l[1] = Math.min(Math.max(l[1], 1), n), l) : void 0; + }; + }, 9504: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.moveToCellSequence = void 0; + const s2 = i2(2584); + function r(e3, t3, i3, s3) { + const r2 = e3 - n(e3, i3), a2 = t3 - n(t3, i3), l = Math.abs(r2 - a2) - (function(e4, t4, i4) { + let s4 = 0; + const r3 = e4 - n(e4, i4), a3 = t4 - n(t4, i4); + for (let n2 = 0; n2 < Math.abs(r3 - a3); n2++) { + const a4 = "A" === o(e4, t4) ? -1 : 1, h2 = i4.buffer.lines.get(r3 + a4 * n2); + (h2 == null ? void 0 : h2.isWrapped) && s4++; + } + return s4; + })(e3, t3, i3); + return c(l, h(o(e3, t3), s3)); + } + function n(e3, t3) { + let i3 = 0, s3 = t3.buffer.lines.get(e3), r2 = s3 == null ? void 0 : s3.isWrapped; + for (; r2 && e3 >= 0 && e3 < t3.rows; ) i3++, s3 = t3.buffer.lines.get(--e3), r2 = s3 == null ? void 0 : s3.isWrapped; + return i3; + } + function o(e3, t3) { + return e3 > t3 ? "A" : "B"; + } + function a(e3, t3, i3, s3, r2, n2) { + let o2 = e3, a2 = t3, h2 = ""; + for (; o2 !== i3 || a2 !== s3; ) o2 += r2 ? 1 : -1, r2 && o2 > n2.cols - 1 ? (h2 += n2.buffer.translateBufferLineToString(a2, false, e3, o2), o2 = 0, e3 = 0, a2++) : !r2 && o2 < 0 && (h2 += n2.buffer.translateBufferLineToString(a2, false, 0, e3 + 1), o2 = n2.cols - 1, e3 = o2, a2--); + return h2 + n2.buffer.translateBufferLineToString(a2, false, e3, o2); + } + function h(e3, t3) { + const i3 = t3 ? "O" : "["; + return s2.C0.ESC + i3 + e3; + } + function c(e3, t3) { + e3 = Math.floor(e3); + let i3 = ""; + for (let s3 = 0; s3 < e3; s3++) i3 += t3; + return i3; + } + t2.moveToCellSequence = function(e3, t3, i3, s3) { + const o2 = i3.buffer.x, l = i3.buffer.y; + if (!i3.buffer.hasScrollback) return (function(e4, t4, i4, s4, o3, l2) { + return 0 === r(t4, s4, o3, l2).length ? "" : c(a(e4, t4, e4, t4 - n(t4, o3), false, o3).length, h("D", l2)); + })(o2, l, 0, t3, i3, s3) + r(l, t3, i3, s3) + (function(e4, t4, i4, s4, o3, l2) { + let d2; + d2 = r(t4, s4, o3, l2).length > 0 ? s4 - n(s4, o3) : t4; + const _2 = s4, u = (function(e5, t5, i5, s5, o4, a2) { + let h2; + return h2 = r(i5, s5, o4, a2).length > 0 ? s5 - n(s5, o4) : t5, e5 < i5 && h2 <= s5 || e5 >= i5 && h2 < s5 ? "C" : "D"; + })(e4, t4, i4, s4, o3, l2); + return c(a(e4, d2, i4, _2, "C" === u, o3).length, h(u, l2)); + })(o2, l, e3, t3, i3, s3); + let d; + if (l === t3) return d = o2 > e3 ? "D" : "C", c(Math.abs(o2 - e3), h(d, s3)); + d = l > t3 ? "D" : "C"; + const _ = Math.abs(l - t3); + return c((function(e4, t4) { + return t4.cols - e4; + })(l > t3 ? e3 : o2, i3) + (_ - 1) * i3.cols + 1 + ((l > t3 ? o2 : e3) - 1), h(d, s3)); + }; + }, 1296: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.DomRenderer = void 0; + const n = i2(3787), o = i2(2550), a = i2(2223), h = i2(6171), c = i2(6052), l = i2(4725), d = i2(8055), _ = i2(8460), u = i2(844), f = i2(2585), v = "xterm-dom-renderer-owner-", p = "xterm-rows", g = "xterm-fg-", m = "xterm-bg-", S = "xterm-focus", C = "xterm-selection"; + let b = 1, w = t2.DomRenderer = class extends u.Disposable { + constructor(e3, t3, i3, s3, r2, a2, l2, d2, f2, g2, m2, S2, w2) { + super(), this._terminal = e3, this._document = t3, this._element = i3, this._screenElement = s3, this._viewportElement = r2, this._helperContainer = a2, this._linkifier2 = l2, this._charSizeService = f2, this._optionsService = g2, this._bufferService = m2, this._coreBrowserService = S2, this._themeService = w2, this._terminalClass = b++, this._rowElements = [], this._selectionRenderModel = (0, c.createSelectionRenderModel)(), this.onRequestRedraw = this.register(new _.EventEmitter()).event, this._rowContainer = this._document.createElement("div"), this._rowContainer.classList.add(p), this._rowContainer.style.lineHeight = "normal", this._rowContainer.setAttribute("aria-hidden", "true"), this._refreshRowElements(this._bufferService.cols, this._bufferService.rows), this._selectionContainer = this._document.createElement("div"), this._selectionContainer.classList.add(C), this._selectionContainer.setAttribute("aria-hidden", "true"), this.dimensions = (0, h.createRenderDimensions)(), this._updateDimensions(), this.register(this._optionsService.onOptionChange((() => this._handleOptionsChanged()))), this.register(this._themeService.onChangeColors(((e4) => this._injectCss(e4)))), this._injectCss(this._themeService.colors), this._rowFactory = d2.createInstance(n.DomRendererRowFactory, document), this._element.classList.add(v + this._terminalClass), this._screenElement.appendChild(this._rowContainer), this._screenElement.appendChild(this._selectionContainer), this.register(this._linkifier2.onShowLinkUnderline(((e4) => this._handleLinkHover(e4)))), this.register(this._linkifier2.onHideLinkUnderline(((e4) => this._handleLinkLeave(e4)))), this.register((0, u.toDisposable)((() => { + this._element.classList.remove(v + this._terminalClass), this._rowContainer.remove(), this._selectionContainer.remove(), this._widthCache.dispose(), this._themeStyleElement.remove(), this._dimensionsStyleElement.remove(); + }))), this._widthCache = new o.WidthCache(this._document, this._helperContainer), this._widthCache.setFont(this._optionsService.rawOptions.fontFamily, this._optionsService.rawOptions.fontSize, this._optionsService.rawOptions.fontWeight, this._optionsService.rawOptions.fontWeightBold), this._setDefaultSpacing(); + } + _updateDimensions() { + const e3 = this._coreBrowserService.dpr; + this.dimensions.device.char.width = this._charSizeService.width * e3, this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * e3), this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing), this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight), this.dimensions.device.char.left = 0, this.dimensions.device.char.top = 0, this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols, this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows, this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / e3), this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / e3), this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols, this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows; + for (const e4 of this._rowElements) e4.style.width = `${this.dimensions.css.canvas.width}px`, e4.style.height = `${this.dimensions.css.cell.height}px`, e4.style.lineHeight = `${this.dimensions.css.cell.height}px`, e4.style.overflow = "hidden"; + this._dimensionsStyleElement || (this._dimensionsStyleElement = this._document.createElement("style"), this._screenElement.appendChild(this._dimensionsStyleElement)); + const t3 = `${this._terminalSelector} .${p} span { display: inline-block; height: 100%; vertical-align: top;}`; + this._dimensionsStyleElement.textContent = t3, this._selectionContainer.style.height = this._viewportElement.style.height, this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`, this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`; + } + _injectCss(e3) { + this._themeStyleElement || (this._themeStyleElement = this._document.createElement("style"), this._screenElement.appendChild(this._themeStyleElement)); + let t3 = `${this._terminalSelector} .${p} { color: ${e3.foreground.css}; font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`; + t3 += `${this._terminalSelector} .${p} .xterm-dim { color: ${d.color.multiplyOpacity(e3.foreground, 0.5).css};}`, t3 += `${this._terminalSelector} span:not(.xterm-bold) { font-weight: ${this._optionsService.rawOptions.fontWeight};}${this._terminalSelector} span.xterm-bold { font-weight: ${this._optionsService.rawOptions.fontWeightBold};}${this._terminalSelector} span.xterm-italic { font-style: italic;}`; + const i3 = `blink_underline_${this._terminalClass}`, s3 = `blink_bar_${this._terminalClass}`, r2 = `blink_block_${this._terminalClass}`; + t3 += `@keyframes ${i3} { 50% { border-bottom-style: hidden; }}`, t3 += `@keyframes ${s3} { 50% { box-shadow: none; }}`, t3 += `@keyframes ${r2} { 0% { background-color: ${e3.cursor.css}; color: ${e3.cursorAccent.css}; } 50% { background-color: inherit; color: ${e3.cursor.css}; }}`, t3 += `${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${i3} 1s step-end infinite;}${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s3} 1s step-end infinite;}${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${r2} 1s step-end infinite;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-block { background-color: ${e3.cursor.css}; color: ${e3.cursorAccent.css};}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e3.cursor.css} !important; color: ${e3.cursorAccent.css} !important;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e3.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e3.cursor.css} inset;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e3.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`, t3 += `${this._terminalSelector} .${C} { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .${C} div { position: absolute; background-color: ${e3.selectionBackgroundOpaque.css};}${this._terminalSelector} .${C} div { position: absolute; background-color: ${e3.selectionInactiveBackgroundOpaque.css};}`; + for (const [i4, s4] of e3.ansi.entries()) t3 += `${this._terminalSelector} .${g}${i4} { color: ${s4.css}; }${this._terminalSelector} .${g}${i4}.xterm-dim { color: ${d.color.multiplyOpacity(s4, 0.5).css}; }${this._terminalSelector} .${m}${i4} { background-color: ${s4.css}; }`; + t3 += `${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR} { color: ${d.color.opaque(e3.background).css}; }${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${d.color.multiplyOpacity(d.color.opaque(e3.background), 0.5).css}; }${this._terminalSelector} .${m}${a.INVERTED_DEFAULT_COLOR} { background-color: ${e3.foreground.css}; }`, this._themeStyleElement.textContent = t3; + } + _setDefaultSpacing() { + const e3 = this.dimensions.css.cell.width - this._widthCache.get("W", false, false); + this._rowContainer.style.letterSpacing = `${e3}px`, this._rowFactory.defaultSpacing = e3; + } + handleDevicePixelRatioChange() { + this._updateDimensions(), this._widthCache.clear(), this._setDefaultSpacing(); + } + _refreshRowElements(e3, t3) { + for (let e4 = this._rowElements.length; e4 <= t3; e4++) { + const e5 = this._document.createElement("div"); + this._rowContainer.appendChild(e5), this._rowElements.push(e5); + } + for (; this._rowElements.length > t3; ) this._rowContainer.removeChild(this._rowElements.pop()); + } + handleResize(e3, t3) { + this._refreshRowElements(e3, t3), this._updateDimensions(), this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode); + } + handleCharSizeChanged() { + this._updateDimensions(), this._widthCache.clear(), this._setDefaultSpacing(); + } + handleBlur() { + this._rowContainer.classList.remove(S), this.renderRows(0, this._bufferService.rows - 1); + } + handleFocus() { + this._rowContainer.classList.add(S), this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y); + } + handleSelectionChanged(e3, t3, i3) { + if (this._selectionContainer.replaceChildren(), this._rowFactory.handleSelectionChanged(e3, t3, i3), this.renderRows(0, this._bufferService.rows - 1), !e3 || !t3) return; + this._selectionRenderModel.update(this._terminal, e3, t3, i3); + const s3 = this._selectionRenderModel.viewportStartRow, r2 = this._selectionRenderModel.viewportEndRow, n2 = this._selectionRenderModel.viewportCappedStartRow, o2 = this._selectionRenderModel.viewportCappedEndRow; + if (n2 >= this._bufferService.rows || o2 < 0) return; + const a2 = this._document.createDocumentFragment(); + if (i3) { + const i4 = e3[0] > t3[0]; + a2.appendChild(this._createSelectionElement(n2, i4 ? t3[0] : e3[0], i4 ? e3[0] : t3[0], o2 - n2 + 1)); + } else { + const i4 = s3 === n2 ? e3[0] : 0, h2 = n2 === r2 ? t3[0] : this._bufferService.cols; + a2.appendChild(this._createSelectionElement(n2, i4, h2)); + const c2 = o2 - n2 - 1; + if (a2.appendChild(this._createSelectionElement(n2 + 1, 0, this._bufferService.cols, c2)), n2 !== o2) { + const e4 = r2 === o2 ? t3[0] : this._bufferService.cols; + a2.appendChild(this._createSelectionElement(o2, 0, e4)); + } + } + this._selectionContainer.appendChild(a2); + } + _createSelectionElement(e3, t3, i3, s3 = 1) { + const r2 = this._document.createElement("div"), n2 = t3 * this.dimensions.css.cell.width; + let o2 = this.dimensions.css.cell.width * (i3 - t3); + return n2 + o2 > this.dimensions.css.canvas.width && (o2 = this.dimensions.css.canvas.width - n2), r2.style.height = s3 * this.dimensions.css.cell.height + "px", r2.style.top = e3 * this.dimensions.css.cell.height + "px", r2.style.left = `${n2}px`, r2.style.width = `${o2}px`, r2; + } + handleCursorMove() { + } + _handleOptionsChanged() { + this._updateDimensions(), this._injectCss(this._themeService.colors), this._widthCache.setFont(this._optionsService.rawOptions.fontFamily, this._optionsService.rawOptions.fontSize, this._optionsService.rawOptions.fontWeight, this._optionsService.rawOptions.fontWeightBold), this._setDefaultSpacing(); + } + clear() { + for (const e3 of this._rowElements) e3.replaceChildren(); + } + renderRows(e3, t3) { + const i3 = this._bufferService.buffer, s3 = i3.ybase + i3.y, r2 = Math.min(i3.x, this._bufferService.cols - 1), n2 = this._optionsService.rawOptions.cursorBlink, o2 = this._optionsService.rawOptions.cursorStyle, a2 = this._optionsService.rawOptions.cursorInactiveStyle; + for (let h2 = e3; h2 <= t3; h2++) { + const e4 = h2 + i3.ydisp, t4 = this._rowElements[h2], c2 = i3.lines.get(e4); + if (!t4 || !c2) break; + t4.replaceChildren(...this._rowFactory.createRow(c2, e4, e4 === s3, o2, a2, r2, n2, this.dimensions.css.cell.width, this._widthCache, -1, -1)); + } + } + get _terminalSelector() { + return `.${v}${this._terminalClass}`; + } + _handleLinkHover(e3) { + this._setCellUnderline(e3.x1, e3.x2, e3.y1, e3.y2, e3.cols, true); + } + _handleLinkLeave(e3) { + this._setCellUnderline(e3.x1, e3.x2, e3.y1, e3.y2, e3.cols, false); + } + _setCellUnderline(e3, t3, i3, s3, r2, n2) { + i3 < 0 && (e3 = 0), s3 < 0 && (t3 = 0); + const o2 = this._bufferService.rows - 1; + i3 = Math.max(Math.min(i3, o2), 0), s3 = Math.max(Math.min(s3, o2), 0), r2 = Math.min(r2, this._bufferService.cols); + const a2 = this._bufferService.buffer, h2 = a2.ybase + a2.y, c2 = Math.min(a2.x, r2 - 1), l2 = this._optionsService.rawOptions.cursorBlink, d2 = this._optionsService.rawOptions.cursorStyle, _2 = this._optionsService.rawOptions.cursorInactiveStyle; + for (let o3 = i3; o3 <= s3; ++o3) { + const u2 = o3 + a2.ydisp, f2 = this._rowElements[o3], v2 = a2.lines.get(u2); + if (!f2 || !v2) break; + f2.replaceChildren(...this._rowFactory.createRow(v2, u2, u2 === h2, d2, _2, c2, l2, this.dimensions.css.cell.width, this._widthCache, n2 ? o3 === i3 ? e3 : 0 : -1, n2 ? (o3 === s3 ? t3 : r2) - 1 : -1)); + } + } + }; + t2.DomRenderer = w = s2([r(7, f.IInstantiationService), r(8, l.ICharSizeService), r(9, f.IOptionsService), r(10, f.IBufferService), r(11, l.ICoreBrowserService), r(12, l.IThemeService)], w); + }, 3787: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.DomRendererRowFactory = void 0; + const n = i2(2223), o = i2(643), a = i2(511), h = i2(2585), c = i2(8055), l = i2(4725), d = i2(4269), _ = i2(6171), u = i2(3734); + let f = t2.DomRendererRowFactory = class { + constructor(e3, t3, i3, s3, r2, n2, o2) { + this._document = e3, this._characterJoinerService = t3, this._optionsService = i3, this._coreBrowserService = s3, this._coreService = r2, this._decorationService = n2, this._themeService = o2, this._workCell = new a.CellData(), this._columnSelectMode = false, this.defaultSpacing = 0; + } + handleSelectionChanged(e3, t3, i3) { + this._selectionStart = e3, this._selectionEnd = t3, this._columnSelectMode = i3; + } + createRow(e3, t3, i3, s3, r2, a2, h2, l2, _2, f2, p) { + const g = [], m = this._characterJoinerService.getJoinedCharacters(t3), S = this._themeService.colors; + let C, b = e3.getNoBgTrimmedLength(); + i3 && b < a2 + 1 && (b = a2 + 1); + let w = 0, y = "", E = 0, k = 0, L = 0, D = false, R = 0, x = false, A = 0; + const B = [], T = -1 !== f2 && -1 !== p; + for (let M = 0; M < b; M++) { + e3.loadCell(M, this._workCell); + let b2 = this._workCell.getWidth(); + if (0 === b2) continue; + let O = false, P = M, I = this._workCell; + if (m.length > 0 && M === m[0][0]) { + O = true; + const t4 = m.shift(); + I = new d.JoinedCellData(this._workCell, e3.translateToString(true, t4[0], t4[1]), t4[1] - t4[0]), P = t4[1] - 1, b2 = I.getWidth(); + } + const H = this._isCellInSelection(M, t3), F = i3 && M === a2, W = T && M >= f2 && M <= p; + let U = false; + this._decorationService.forEachDecorationAtCell(M, t3, void 0, ((e4) => { + U = true; + })); + let N = I.getChars() || o.WHITESPACE_CELL_CHAR; + if (" " === N && (I.isUnderline() || I.isOverline()) && (N = "\xA0"), A = b2 * l2 - _2.get(N, I.isBold(), I.isItalic()), C) { + if (w && (H && x || !H && !x && I.bg === E) && (H && x && S.selectionForeground || I.fg === k) && I.extended.ext === L && W === D && A === R && !F && !O && !U) { + I.isInvisible() ? y += o.WHITESPACE_CELL_CHAR : y += N, w++; + continue; + } + w && (C.textContent = y), C = this._document.createElement("span"), w = 0, y = ""; + } else C = this._document.createElement("span"); + if (E = I.bg, k = I.fg, L = I.extended.ext, D = W, R = A, x = H, O && a2 >= M && a2 <= P && (a2 = M), !this._coreService.isCursorHidden && F && this._coreService.isCursorInitialized) { + if (B.push("xterm-cursor"), this._coreBrowserService.isFocused) h2 && B.push("xterm-cursor-blink"), B.push("bar" === s3 ? "xterm-cursor-bar" : "underline" === s3 ? "xterm-cursor-underline" : "xterm-cursor-block"); + else if (r2) switch (r2) { + case "outline": + B.push("xterm-cursor-outline"); + break; + case "block": + B.push("xterm-cursor-block"); + break; + case "bar": + B.push("xterm-cursor-bar"); + break; + case "underline": + B.push("xterm-cursor-underline"); + } + } + if (I.isBold() && B.push("xterm-bold"), I.isItalic() && B.push("xterm-italic"), I.isDim() && B.push("xterm-dim"), y = I.isInvisible() ? o.WHITESPACE_CELL_CHAR : I.getChars() || o.WHITESPACE_CELL_CHAR, I.isUnderline() && (B.push(`xterm-underline-${I.extended.underlineStyle}`), " " === y && (y = "\xA0"), !I.isUnderlineColorDefault())) if (I.isUnderlineColorRGB()) C.style.textDecorationColor = `rgb(${u.AttributeData.toColorRGB(I.getUnderlineColor()).join(",")})`; + else { + let e4 = I.getUnderlineColor(); + this._optionsService.rawOptions.drawBoldTextInBrightColors && I.isBold() && e4 < 8 && (e4 += 8), C.style.textDecorationColor = S.ansi[e4].css; + } + I.isOverline() && (B.push("xterm-overline"), " " === y && (y = "\xA0")), I.isStrikethrough() && B.push("xterm-strikethrough"), W && (C.style.textDecoration = "underline"); + let $ = I.getFgColor(), j = I.getFgColorMode(), z = I.getBgColor(), K = I.getBgColorMode(); + const q = !!I.isInverse(); + if (q) { + const e4 = $; + $ = z, z = e4; + const t4 = j; + j = K, K = t4; + } + let V, G, X, J = false; + switch (this._decorationService.forEachDecorationAtCell(M, t3, void 0, ((e4) => { + "top" !== e4.options.layer && J || (e4.backgroundColorRGB && (K = 50331648, z = e4.backgroundColorRGB.rgba >> 8 & 16777215, V = e4.backgroundColorRGB), e4.foregroundColorRGB && (j = 50331648, $ = e4.foregroundColorRGB.rgba >> 8 & 16777215, G = e4.foregroundColorRGB), J = "top" === e4.options.layer); + })), !J && H && (V = this._coreBrowserService.isFocused ? S.selectionBackgroundOpaque : S.selectionInactiveBackgroundOpaque, z = V.rgba >> 8 & 16777215, K = 50331648, J = true, S.selectionForeground && (j = 50331648, $ = S.selectionForeground.rgba >> 8 & 16777215, G = S.selectionForeground)), J && B.push("xterm-decoration-top"), K) { + case 16777216: + case 33554432: + X = S.ansi[z], B.push(`xterm-bg-${z}`); + break; + case 50331648: + X = c.channels.toColor(z >> 16, z >> 8 & 255, 255 & z), this._addStyle(C, `background-color:#${v((z >>> 0).toString(16), "0", 6)}`); + break; + default: + q ? (X = S.foreground, B.push(`xterm-bg-${n.INVERTED_DEFAULT_COLOR}`)) : X = S.background; + } + switch (V || I.isDim() && (V = c.color.multiplyOpacity(X, 0.5)), j) { + case 16777216: + case 33554432: + I.isBold() && $ < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors && ($ += 8), this._applyMinimumContrast(C, X, S.ansi[$], I, V, void 0) || B.push(`xterm-fg-${$}`); + break; + case 50331648: + const e4 = c.channels.toColor($ >> 16 & 255, $ >> 8 & 255, 255 & $); + this._applyMinimumContrast(C, X, e4, I, V, G) || this._addStyle(C, `color:#${v($.toString(16), "0", 6)}`); + break; + default: + this._applyMinimumContrast(C, X, S.foreground, I, V, G) || q && B.push(`xterm-fg-${n.INVERTED_DEFAULT_COLOR}`); + } + B.length && (C.className = B.join(" "), B.length = 0), F || O || U ? C.textContent = y : w++, A !== this.defaultSpacing && (C.style.letterSpacing = `${A}px`), g.push(C), M = P; + } + return C && w && (C.textContent = y), g; + } + _applyMinimumContrast(e3, t3, i3, s3, r2, n2) { + if (1 === this._optionsService.rawOptions.minimumContrastRatio || (0, _.treatGlyphAsBackgroundColor)(s3.getCode())) return false; + const o2 = this._getContrastCache(s3); + let a2; + if (r2 || n2 || (a2 = o2.getColor(t3.rgba, i3.rgba)), void 0 === a2) { + const e4 = this._optionsService.rawOptions.minimumContrastRatio / (s3.isDim() ? 2 : 1); + a2 = c.color.ensureContrastRatio(r2 || t3, n2 || i3, e4), o2.setColor((r2 || t3).rgba, (n2 || i3).rgba, a2 ?? null); + } + return !!a2 && (this._addStyle(e3, `color:${a2.css}`), true); + } + _getContrastCache(e3) { + return e3.isDim() ? this._themeService.colors.halfContrastCache : this._themeService.colors.contrastCache; + } + _addStyle(e3, t3) { + e3.setAttribute("style", `${e3.getAttribute("style") || ""}${t3};`); + } + _isCellInSelection(e3, t3) { + const i3 = this._selectionStart, s3 = this._selectionEnd; + return !(!i3 || !s3) && (this._columnSelectMode ? i3[0] <= s3[0] ? e3 >= i3[0] && t3 >= i3[1] && e3 < s3[0] && t3 <= s3[1] : e3 < i3[0] && t3 >= i3[1] && e3 >= s3[0] && t3 <= s3[1] : t3 > i3[1] && t3 < s3[1] || i3[1] === s3[1] && t3 === i3[1] && e3 >= i3[0] && e3 < s3[0] || i3[1] < s3[1] && t3 === s3[1] && e3 < s3[0] || i3[1] < s3[1] && t3 === i3[1] && e3 >= i3[0]); + } + }; + function v(e3, t3, i3) { + for (; e3.length < i3; ) e3 = t3 + e3; + return e3; + } + t2.DomRendererRowFactory = f = s2([r(1, l.ICharacterJoinerService), r(2, h.IOptionsService), r(3, l.ICoreBrowserService), r(4, h.ICoreService), r(5, h.IDecorationService), r(6, l.IThemeService)], f); + }, 2550: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.WidthCache = void 0, t2.WidthCache = class { + constructor(e3, t3) { + this._flat = new Float32Array(256), this._font = "", this._fontSize = 0, this._weight = "normal", this._weightBold = "bold", this._measureElements = [], this._container = e3.createElement("div"), this._container.classList.add("xterm-width-cache-measure-container"), this._container.setAttribute("aria-hidden", "true"), this._container.style.whiteSpace = "pre", this._container.style.fontKerning = "none"; + const i2 = e3.createElement("span"); + i2.classList.add("xterm-char-measure-element"); + const s2 = e3.createElement("span"); + s2.classList.add("xterm-char-measure-element"), s2.style.fontWeight = "bold"; + const r = e3.createElement("span"); + r.classList.add("xterm-char-measure-element"), r.style.fontStyle = "italic"; + const n = e3.createElement("span"); + n.classList.add("xterm-char-measure-element"), n.style.fontWeight = "bold", n.style.fontStyle = "italic", this._measureElements = [i2, s2, r, n], this._container.appendChild(i2), this._container.appendChild(s2), this._container.appendChild(r), this._container.appendChild(n), t3.appendChild(this._container), this.clear(); + } + dispose() { + this._container.remove(), this._measureElements.length = 0, this._holey = void 0; + } + clear() { + this._flat.fill(-9999), this._holey = /* @__PURE__ */ new Map(); + } + setFont(e3, t3, i2, s2) { + e3 === this._font && t3 === this._fontSize && i2 === this._weight && s2 === this._weightBold || (this._font = e3, this._fontSize = t3, this._weight = i2, this._weightBold = s2, this._container.style.fontFamily = this._font, this._container.style.fontSize = `${this._fontSize}px`, this._measureElements[0].style.fontWeight = `${i2}`, this._measureElements[1].style.fontWeight = `${s2}`, this._measureElements[2].style.fontWeight = `${i2}`, this._measureElements[3].style.fontWeight = `${s2}`, this.clear()); + } + get(e3, t3, i2) { + let s2 = 0; + if (!t3 && !i2 && 1 === e3.length && (s2 = e3.charCodeAt(0)) < 256) { + if (-9999 !== this._flat[s2]) return this._flat[s2]; + const t4 = this._measure(e3, 0); + return t4 > 0 && (this._flat[s2] = t4), t4; + } + let r = e3; + t3 && (r += "B"), i2 && (r += "I"); + let n = this._holey.get(r); + if (void 0 === n) { + let s3 = 0; + t3 && (s3 |= 1), i2 && (s3 |= 2), n = this._measure(e3, s3), n > 0 && this._holey.set(r, n); + } + return n; + } + _measure(e3, t3) { + const i2 = this._measureElements[t3]; + return i2.textContent = e3.repeat(32), i2.offsetWidth / 32; + } + }; + }, 2223: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.TEXT_BASELINE = t2.DIM_OPACITY = t2.INVERTED_DEFAULT_COLOR = void 0; + const s2 = i2(6114); + t2.INVERTED_DEFAULT_COLOR = 257, t2.DIM_OPACITY = 0.5, t2.TEXT_BASELINE = s2.isFirefox || s2.isLegacyEdge ? "bottom" : "ideographic"; + }, 6171: (e2, t2) => { + function i2(e3) { + return 57508 <= e3 && e3 <= 57558; + } + function s2(e3) { + return e3 >= 128512 && e3 <= 128591 || e3 >= 127744 && e3 <= 128511 || e3 >= 128640 && e3 <= 128767 || e3 >= 9728 && e3 <= 9983 || e3 >= 9984 && e3 <= 10175 || e3 >= 65024 && e3 <= 65039 || e3 >= 129280 && e3 <= 129535 || e3 >= 127462 && e3 <= 127487; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.computeNextVariantOffset = t2.createRenderDimensions = t2.treatGlyphAsBackgroundColor = t2.allowRescaling = t2.isEmoji = t2.isRestrictedPowerlineGlyph = t2.isPowerlineGlyph = t2.throwIfFalsy = void 0, t2.throwIfFalsy = function(e3) { + if (!e3) throw new Error("value must not be falsy"); + return e3; + }, t2.isPowerlineGlyph = i2, t2.isRestrictedPowerlineGlyph = function(e3) { + return 57520 <= e3 && e3 <= 57527; + }, t2.isEmoji = s2, t2.allowRescaling = function(e3, t3, r, n) { + return 1 === t3 && r > Math.ceil(1.5 * n) && void 0 !== e3 && e3 > 255 && !s2(e3) && !i2(e3) && !(function(e4) { + return 57344 <= e4 && e4 <= 63743; + })(e3); + }, t2.treatGlyphAsBackgroundColor = function(e3) { + return i2(e3) || (function(e4) { + return 9472 <= e4 && e4 <= 9631; + })(e3); + }, t2.createRenderDimensions = function() { + return { css: { canvas: { width: 0, height: 0 }, cell: { width: 0, height: 0 } }, device: { canvas: { width: 0, height: 0 }, cell: { width: 0, height: 0 }, char: { width: 0, height: 0, left: 0, top: 0 } } }; + }, t2.computeNextVariantOffset = function(e3, t3, i3 = 0) { + return (e3 - (2 * Math.round(t3) - i3)) % (2 * Math.round(t3)); + }; + }, 6052: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.createSelectionRenderModel = void 0; + class i2 { + constructor() { + this.clear(); + } + clear() { + this.hasSelection = false, this.columnSelectMode = false, this.viewportStartRow = 0, this.viewportEndRow = 0, this.viewportCappedStartRow = 0, this.viewportCappedEndRow = 0, this.startCol = 0, this.endCol = 0, this.selectionStart = void 0, this.selectionEnd = void 0; + } + update(e3, t3, i3, s2 = false) { + if (this.selectionStart = t3, this.selectionEnd = i3, !t3 || !i3 || t3[0] === i3[0] && t3[1] === i3[1]) return void this.clear(); + const r = e3.buffers.active.ydisp, n = t3[1] - r, o = i3[1] - r, a = Math.max(n, 0), h = Math.min(o, e3.rows - 1); + a >= e3.rows || h < 0 ? this.clear() : (this.hasSelection = true, this.columnSelectMode = s2, this.viewportStartRow = n, this.viewportEndRow = o, this.viewportCappedStartRow = a, this.viewportCappedEndRow = h, this.startCol = t3[0], this.endCol = i3[0]); + } + isCellSelected(e3, t3, i3) { + return !!this.hasSelection && (i3 -= e3.buffer.active.viewportY, this.columnSelectMode ? this.startCol <= this.endCol ? t3 >= this.startCol && i3 >= this.viewportCappedStartRow && t3 < this.endCol && i3 <= this.viewportCappedEndRow : t3 < this.startCol && i3 >= this.viewportCappedStartRow && t3 >= this.endCol && i3 <= this.viewportCappedEndRow : i3 > this.viewportStartRow && i3 < this.viewportEndRow || this.viewportStartRow === this.viewportEndRow && i3 === this.viewportStartRow && t3 >= this.startCol && t3 < this.endCol || this.viewportStartRow < this.viewportEndRow && i3 === this.viewportEndRow && t3 < this.endCol || this.viewportStartRow < this.viewportEndRow && i3 === this.viewportStartRow && t3 >= this.startCol); + } + } + t2.createSelectionRenderModel = function() { + return new i2(); + }; + }, 456: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.SelectionModel = void 0, t2.SelectionModel = class { + constructor(e3) { + this._bufferService = e3, this.isSelectAllActive = false, this.selectionStartLength = 0; + } + clearSelection() { + this.selectionStart = void 0, this.selectionEnd = void 0, this.isSelectAllActive = false, this.selectionStartLength = 0; + } + get finalSelectionStart() { + return this.isSelectAllActive ? [0, 0] : this.selectionEnd && this.selectionStart && this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart; + } + get finalSelectionEnd() { + if (this.isSelectAllActive) return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1]; + if (this.selectionStart) { + if (!this.selectionEnd || this.areSelectionValuesReversed()) { + const e3 = this.selectionStart[0] + this.selectionStartLength; + return e3 > this._bufferService.cols ? e3 % this._bufferService.cols == 0 ? [this._bufferService.cols, this.selectionStart[1] + Math.floor(e3 / this._bufferService.cols) - 1] : [e3 % this._bufferService.cols, this.selectionStart[1] + Math.floor(e3 / this._bufferService.cols)] : [e3, this.selectionStart[1]]; + } + if (this.selectionStartLength && this.selectionEnd[1] === this.selectionStart[1]) { + const e3 = this.selectionStart[0] + this.selectionStartLength; + return e3 > this._bufferService.cols ? [e3 % this._bufferService.cols, this.selectionStart[1] + Math.floor(e3 / this._bufferService.cols)] : [Math.max(e3, this.selectionEnd[0]), this.selectionEnd[1]]; + } + return this.selectionEnd; + } + } + areSelectionValuesReversed() { + const e3 = this.selectionStart, t3 = this.selectionEnd; + return !(!e3 || !t3) && (e3[1] > t3[1] || e3[1] === t3[1] && e3[0] > t3[0]); + } + handleTrim(e3) { + return this.selectionStart && (this.selectionStart[1] -= e3), this.selectionEnd && (this.selectionEnd[1] -= e3), this.selectionEnd && this.selectionEnd[1] < 0 ? (this.clearSelection(), true) : (this.selectionStart && this.selectionStart[1] < 0 && (this.selectionStart[1] = 0), false); + } + }; + }, 428: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.CharSizeService = void 0; + const n = i2(2585), o = i2(8460), a = i2(844); + let h = t2.CharSizeService = class extends a.Disposable { + get hasValidSize() { + return this.width > 0 && this.height > 0; + } + constructor(e3, t3, i3) { + super(), this._optionsService = i3, this.width = 0, this.height = 0, this._onCharSizeChange = this.register(new o.EventEmitter()), this.onCharSizeChange = this._onCharSizeChange.event; + try { + this._measureStrategy = this.register(new d(this._optionsService)); + } catch { + this._measureStrategy = this.register(new l(e3, t3, this._optionsService)); + } + this.register(this._optionsService.onMultipleOptionChange(["fontFamily", "fontSize"], (() => this.measure()))); + } + measure() { + const e3 = this._measureStrategy.measure(); + e3.width === this.width && e3.height === this.height || (this.width = e3.width, this.height = e3.height, this._onCharSizeChange.fire()); + } + }; + t2.CharSizeService = h = s2([r(2, n.IOptionsService)], h); + class c extends a.Disposable { + constructor() { + super(...arguments), this._result = { width: 0, height: 0 }; + } + _validateAndSet(e3, t3) { + void 0 !== e3 && e3 > 0 && void 0 !== t3 && t3 > 0 && (this._result.width = e3, this._result.height = t3); + } + } + class l extends c { + constructor(e3, t3, i3) { + super(), this._document = e3, this._parentElement = t3, this._optionsService = i3, this._measureElement = this._document.createElement("span"), this._measureElement.classList.add("xterm-char-measure-element"), this._measureElement.textContent = "W".repeat(32), this._measureElement.setAttribute("aria-hidden", "true"), this._measureElement.style.whiteSpace = "pre", this._measureElement.style.fontKerning = "none", this._parentElement.appendChild(this._measureElement); + } + measure() { + return this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily, this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`, this._validateAndSet(Number(this._measureElement.offsetWidth) / 32, Number(this._measureElement.offsetHeight)), this._result; + } + } + class d extends c { + constructor(e3) { + super(), this._optionsService = e3, this._canvas = new OffscreenCanvas(100, 100), this._ctx = this._canvas.getContext("2d"); + const t3 = this._ctx.measureText("W"); + if (!("width" in t3 && "fontBoundingBoxAscent" in t3 && "fontBoundingBoxDescent" in t3)) throw new Error("Required font metrics not supported"); + } + measure() { + this._ctx.font = `${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`; + const e3 = this._ctx.measureText("W"); + return this._validateAndSet(e3.width, e3.fontBoundingBoxAscent + e3.fontBoundingBoxDescent), this._result; + } + } + }, 4269: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.CharacterJoinerService = t2.JoinedCellData = void 0; + const n = i2(3734), o = i2(643), a = i2(511), h = i2(2585); + class c extends n.AttributeData { + constructor(e3, t3, i3) { + super(), this.content = 0, this.combinedData = "", this.fg = e3.fg, this.bg = e3.bg, this.combinedData = t3, this._width = i3; + } + isCombined() { + return 2097152; + } + getWidth() { + return this._width; + } + getChars() { + return this.combinedData; + } + getCode() { + return 2097151; + } + setFromCharData(e3) { + throw new Error("not implemented"); + } + getAsCharData() { + return [this.fg, this.getChars(), this.getWidth(), this.getCode()]; + } + } + t2.JoinedCellData = c; + let l = t2.CharacterJoinerService = class e3 { + constructor(e4) { + this._bufferService = e4, this._characterJoiners = [], this._nextCharacterJoinerId = 0, this._workCell = new a.CellData(); + } + register(e4) { + const t3 = { id: this._nextCharacterJoinerId++, handler: e4 }; + return this._characterJoiners.push(t3), t3.id; + } + deregister(e4) { + for (let t3 = 0; t3 < this._characterJoiners.length; t3++) if (this._characterJoiners[t3].id === e4) return this._characterJoiners.splice(t3, 1), true; + return false; + } + getJoinedCharacters(e4) { + if (0 === this._characterJoiners.length) return []; + const t3 = this._bufferService.buffer.lines.get(e4); + if (!t3 || 0 === t3.length) return []; + const i3 = [], s3 = t3.translateToString(true); + let r2 = 0, n2 = 0, a2 = 0, h2 = t3.getFg(0), c2 = t3.getBg(0); + for (let e5 = 0; e5 < t3.getTrimmedLength(); e5++) if (t3.loadCell(e5, this._workCell), 0 !== this._workCell.getWidth()) { + if (this._workCell.fg !== h2 || this._workCell.bg !== c2) { + if (e5 - r2 > 1) { + const e6 = this._getJoinedRanges(s3, a2, n2, t3, r2); + for (let t4 = 0; t4 < e6.length; t4++) i3.push(e6[t4]); + } + r2 = e5, a2 = n2, h2 = this._workCell.fg, c2 = this._workCell.bg; + } + n2 += this._workCell.getChars().length || o.WHITESPACE_CELL_CHAR.length; + } + if (this._bufferService.cols - r2 > 1) { + const e5 = this._getJoinedRanges(s3, a2, n2, t3, r2); + for (let t4 = 0; t4 < e5.length; t4++) i3.push(e5[t4]); + } + return i3; + } + _getJoinedRanges(t3, i3, s3, r2, n2) { + const o2 = t3.substring(i3, s3); + let a2 = []; + try { + a2 = this._characterJoiners[0].handler(o2); + } catch (e4) { + console.error(e4); + } + for (let t4 = 1; t4 < this._characterJoiners.length; t4++) try { + const i4 = this._characterJoiners[t4].handler(o2); + for (let t5 = 0; t5 < i4.length; t5++) e3._mergeRanges(a2, i4[t5]); + } catch (e4) { + console.error(e4); + } + return this._stringRangesToCellRanges(a2, r2, n2), a2; + } + _stringRangesToCellRanges(e4, t3, i3) { + let s3 = 0, r2 = false, n2 = 0, a2 = e4[s3]; + if (a2) { + for (let h2 = i3; h2 < this._bufferService.cols; h2++) { + const i4 = t3.getWidth(h2), c2 = t3.getString(h2).length || o.WHITESPACE_CELL_CHAR.length; + if (0 !== i4) { + if (!r2 && a2[0] <= n2 && (a2[0] = h2, r2 = true), a2[1] <= n2) { + if (a2[1] = h2, a2 = e4[++s3], !a2) break; + a2[0] <= n2 ? (a2[0] = h2, r2 = true) : r2 = false; + } + n2 += c2; + } + } + a2 && (a2[1] = this._bufferService.cols); + } + } + static _mergeRanges(e4, t3) { + let i3 = false; + for (let s3 = 0; s3 < e4.length; s3++) { + const r2 = e4[s3]; + if (i3) { + if (t3[1] <= r2[0]) return e4[s3 - 1][1] = t3[1], e4; + if (t3[1] <= r2[1]) return e4[s3 - 1][1] = Math.max(t3[1], r2[1]), e4.splice(s3, 1), e4; + e4.splice(s3, 1), s3--; + } else { + if (t3[1] <= r2[0]) return e4.splice(s3, 0, t3), e4; + if (t3[1] <= r2[1]) return r2[0] = Math.min(t3[0], r2[0]), e4; + t3[0] < r2[1] && (r2[0] = Math.min(t3[0], r2[0]), i3 = true); + } + } + return i3 ? e4[e4.length - 1][1] = t3[1] : e4.push(t3), e4; + } + }; + t2.CharacterJoinerService = l = s2([r(0, h.IBufferService)], l); + }, 5114: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CoreBrowserService = void 0; + const s2 = i2(844), r = i2(8460), n = i2(3656); + class o extends s2.Disposable { + constructor(e3, t3, i3) { + super(), this._textarea = e3, this._window = t3, this.mainDocument = i3, this._isFocused = false, this._cachedIsFocused = void 0, this._screenDprMonitor = new a(this._window), this._onDprChange = this.register(new r.EventEmitter()), this.onDprChange = this._onDprChange.event, this._onWindowChange = this.register(new r.EventEmitter()), this.onWindowChange = this._onWindowChange.event, this.register(this.onWindowChange(((e4) => this._screenDprMonitor.setWindow(e4)))), this.register((0, r.forwardEvent)(this._screenDprMonitor.onDprChange, this._onDprChange)), this._textarea.addEventListener("focus", (() => this._isFocused = true)), this._textarea.addEventListener("blur", (() => this._isFocused = false)); + } + get window() { + return this._window; + } + set window(e3) { + this._window !== e3 && (this._window = e3, this._onWindowChange.fire(this._window)); + } + get dpr() { + return this.window.devicePixelRatio; + } + get isFocused() { + return void 0 === this._cachedIsFocused && (this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus(), queueMicrotask((() => this._cachedIsFocused = void 0))), this._cachedIsFocused; + } + } + t2.CoreBrowserService = o; + class a extends s2.Disposable { + constructor(e3) { + super(), this._parentWindow = e3, this._windowResizeListener = this.register(new s2.MutableDisposable()), this._onDprChange = this.register(new r.EventEmitter()), this.onDprChange = this._onDprChange.event, this._outerListener = () => this._setDprAndFireIfDiffers(), this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio, this._updateDpr(), this._setWindowResizeListener(), this.register((0, s2.toDisposable)((() => this.clearListener()))); + } + setWindow(e3) { + this._parentWindow = e3, this._setWindowResizeListener(), this._setDprAndFireIfDiffers(); + } + _setWindowResizeListener() { + this._windowResizeListener.value = (0, n.addDisposableDomListener)(this._parentWindow, "resize", (() => this._setDprAndFireIfDiffers())); + } + _setDprAndFireIfDiffers() { + this._parentWindow.devicePixelRatio !== this._currentDevicePixelRatio && this._onDprChange.fire(this._parentWindow.devicePixelRatio), this._updateDpr(); + } + _updateDpr() { + var _a2; + this._outerListener && ((_a2 = this._resolutionMediaMatchList) == null ? void 0 : _a2.removeListener(this._outerListener), this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio, this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`), this._resolutionMediaMatchList.addListener(this._outerListener)); + } + clearListener() { + this._resolutionMediaMatchList && this._outerListener && (this._resolutionMediaMatchList.removeListener(this._outerListener), this._resolutionMediaMatchList = void 0, this._outerListener = void 0); + } + } + }, 779: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.LinkProviderService = void 0; + const s2 = i2(844); + class r extends s2.Disposable { + constructor() { + super(), this.linkProviders = [], this.register((0, s2.toDisposable)((() => this.linkProviders.length = 0))); + } + registerLinkProvider(e3) { + return this.linkProviders.push(e3), { dispose: () => { + const t3 = this.linkProviders.indexOf(e3); + -1 !== t3 && this.linkProviders.splice(t3, 1); + } }; + } + } + t2.LinkProviderService = r; + }, 8934: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.MouseService = void 0; + const n = i2(4725), o = i2(9806); + let a = t2.MouseService = class { + constructor(e3, t3) { + this._renderService = e3, this._charSizeService = t3; + } + getCoords(e3, t3, i3, s3, r2) { + return (0, o.getCoords)(window, e3, t3, i3, s3, this._charSizeService.hasValidSize, this._renderService.dimensions.css.cell.width, this._renderService.dimensions.css.cell.height, r2); + } + getMouseReportCoords(e3, t3) { + const i3 = (0, o.getCoordsRelativeToElement)(window, e3, t3); + if (this._charSizeService.hasValidSize) return i3[0] = Math.min(Math.max(i3[0], 0), this._renderService.dimensions.css.canvas.width - 1), i3[1] = Math.min(Math.max(i3[1], 0), this._renderService.dimensions.css.canvas.height - 1), { col: Math.floor(i3[0] / this._renderService.dimensions.css.cell.width), row: Math.floor(i3[1] / this._renderService.dimensions.css.cell.height), x: Math.floor(i3[0]), y: Math.floor(i3[1]) }; + } + }; + t2.MouseService = a = s2([r(0, n.IRenderService), r(1, n.ICharSizeService)], a); + }, 3230: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.RenderService = void 0; + const n = i2(6193), o = i2(4725), a = i2(8460), h = i2(844), c = i2(7226), l = i2(2585); + let d = t2.RenderService = class extends h.Disposable { + get dimensions() { + return this._renderer.value.dimensions; + } + constructor(e3, t3, i3, s3, r2, o2, l2, d2) { + super(), this._rowCount = e3, this._charSizeService = s3, this._renderer = this.register(new h.MutableDisposable()), this._pausedResizeTask = new c.DebouncedIdleTask(), this._observerDisposable = this.register(new h.MutableDisposable()), this._isPaused = false, this._needsFullRefresh = false, this._isNextRenderRedrawOnly = true, this._needsSelectionRefresh = false, this._canvasWidth = 0, this._canvasHeight = 0, this._selectionState = { start: void 0, end: void 0, columnSelectMode: false }, this._onDimensionsChange = this.register(new a.EventEmitter()), this.onDimensionsChange = this._onDimensionsChange.event, this._onRenderedViewportChange = this.register(new a.EventEmitter()), this.onRenderedViewportChange = this._onRenderedViewportChange.event, this._onRender = this.register(new a.EventEmitter()), this.onRender = this._onRender.event, this._onRefreshRequest = this.register(new a.EventEmitter()), this.onRefreshRequest = this._onRefreshRequest.event, this._renderDebouncer = new n.RenderDebouncer(((e4, t4) => this._renderRows(e4, t4)), l2), this.register(this._renderDebouncer), this.register(l2.onDprChange((() => this.handleDevicePixelRatioChange()))), this.register(o2.onResize((() => this._fullRefresh()))), this.register(o2.buffers.onBufferActivate((() => { + var _a; + return (_a = this._renderer.value) == null ? void 0 : _a.clear(); + }))), this.register(i3.onOptionChange((() => this._handleOptionsChanged()))), this.register(this._charSizeService.onCharSizeChange((() => this.handleCharSizeChanged()))), this.register(r2.onDecorationRegistered((() => this._fullRefresh()))), this.register(r2.onDecorationRemoved((() => this._fullRefresh()))), this.register(i3.onMultipleOptionChange(["customGlyphs", "drawBoldTextInBrightColors", "letterSpacing", "lineHeight", "fontFamily", "fontSize", "fontWeight", "fontWeightBold", "minimumContrastRatio", "rescaleOverlappingGlyphs"], (() => { + this.clear(), this.handleResize(o2.cols, o2.rows), this._fullRefresh(); + }))), this.register(i3.onMultipleOptionChange(["cursorBlink", "cursorStyle"], (() => this.refreshRows(o2.buffer.y, o2.buffer.y, true)))), this.register(d2.onChangeColors((() => this._fullRefresh()))), this._registerIntersectionObserver(l2.window, t3), this.register(l2.onWindowChange(((e4) => this._registerIntersectionObserver(e4, t3)))); + } + _registerIntersectionObserver(e3, t3) { + if ("IntersectionObserver" in e3) { + const i3 = new e3.IntersectionObserver(((e4) => this._handleIntersectionChange(e4[e4.length - 1])), { threshold: 0 }); + i3.observe(t3), this._observerDisposable.value = (0, h.toDisposable)((() => i3.disconnect())); + } + } + _handleIntersectionChange(e3) { + this._isPaused = void 0 === e3.isIntersecting ? 0 === e3.intersectionRatio : !e3.isIntersecting, this._isPaused || this._charSizeService.hasValidSize || this._charSizeService.measure(), !this._isPaused && this._needsFullRefresh && (this._pausedResizeTask.flush(), this.refreshRows(0, this._rowCount - 1), this._needsFullRefresh = false); + } + refreshRows(e3, t3, i3 = false) { + this._isPaused ? this._needsFullRefresh = true : (i3 || (this._isNextRenderRedrawOnly = false), this._renderDebouncer.refresh(e3, t3, this._rowCount)); + } + _renderRows(e3, t3) { + this._renderer.value && (e3 = Math.min(e3, this._rowCount - 1), t3 = Math.min(t3, this._rowCount - 1), this._renderer.value.renderRows(e3, t3), this._needsSelectionRefresh && (this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode), this._needsSelectionRefresh = false), this._isNextRenderRedrawOnly || this._onRenderedViewportChange.fire({ start: e3, end: t3 }), this._onRender.fire({ start: e3, end: t3 }), this._isNextRenderRedrawOnly = true); + } + resize(e3, t3) { + this._rowCount = t3, this._fireOnCanvasResize(); + } + _handleOptionsChanged() { + this._renderer.value && (this.refreshRows(0, this._rowCount - 1), this._fireOnCanvasResize()); + } + _fireOnCanvasResize() { + this._renderer.value && (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight || this._onDimensionsChange.fire(this._renderer.value.dimensions)); + } + hasRenderer() { + return !!this._renderer.value; + } + setRenderer(e3) { + this._renderer.value = e3, this._renderer.value && (this._renderer.value.onRequestRedraw(((e4) => this.refreshRows(e4.start, e4.end, true))), this._needsSelectionRefresh = true, this._fullRefresh()); + } + addRefreshCallback(e3) { + return this._renderDebouncer.addRefreshCallback(e3); + } + _fullRefresh() { + this._isPaused ? this._needsFullRefresh = true : this.refreshRows(0, this._rowCount - 1); + } + clearTextureAtlas() { + var _a, _b; + this._renderer.value && ((_b = (_a = this._renderer.value).clearTextureAtlas) == null ? void 0 : _b.call(_a), this._fullRefresh()); + } + handleDevicePixelRatioChange() { + this._charSizeService.measure(), this._renderer.value && (this._renderer.value.handleDevicePixelRatioChange(), this.refreshRows(0, this._rowCount - 1)); + } + handleResize(e3, t3) { + this._renderer.value && (this._isPaused ? this._pausedResizeTask.set((() => { + var _a; + return (_a = this._renderer.value) == null ? void 0 : _a.handleResize(e3, t3); + })) : this._renderer.value.handleResize(e3, t3), this._fullRefresh()); + } + handleCharSizeChanged() { + var _a; + (_a = this._renderer.value) == null ? void 0 : _a.handleCharSizeChanged(); + } + handleBlur() { + var _a; + (_a = this._renderer.value) == null ? void 0 : _a.handleBlur(); + } + handleFocus() { + var _a; + (_a = this._renderer.value) == null ? void 0 : _a.handleFocus(); + } + handleSelectionChanged(e3, t3, i3) { + var _a; + this._selectionState.start = e3, this._selectionState.end = t3, this._selectionState.columnSelectMode = i3, (_a = this._renderer.value) == null ? void 0 : _a.handleSelectionChanged(e3, t3, i3); + } + handleCursorMove() { + var _a; + (_a = this._renderer.value) == null ? void 0 : _a.handleCursorMove(); + } + clear() { + var _a; + (_a = this._renderer.value) == null ? void 0 : _a.clear(); + } + }; + t2.RenderService = d = s2([r(2, l.IOptionsService), r(3, o.ICharSizeService), r(4, l.IDecorationService), r(5, l.IBufferService), r(6, o.ICoreBrowserService), r(7, o.IThemeService)], d); + }, 9312: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.SelectionService = void 0; + const n = i2(9806), o = i2(9504), a = i2(456), h = i2(4725), c = i2(8460), l = i2(844), d = i2(6114), _ = i2(4841), u = i2(511), f = i2(2585), v = String.fromCharCode(160), p = new RegExp(v, "g"); + let g = t2.SelectionService = class extends l.Disposable { + constructor(e3, t3, i3, s3, r2, n2, o2, h2, d2) { + super(), this._element = e3, this._screenElement = t3, this._linkifier = i3, this._bufferService = s3, this._coreService = r2, this._mouseService = n2, this._optionsService = o2, this._renderService = h2, this._coreBrowserService = d2, this._dragScrollAmount = 0, this._enabled = true, this._workCell = new u.CellData(), this._mouseDownTimeStamp = 0, this._oldHasSelection = false, this._oldSelectionStart = void 0, this._oldSelectionEnd = void 0, this._onLinuxMouseSelection = this.register(new c.EventEmitter()), this.onLinuxMouseSelection = this._onLinuxMouseSelection.event, this._onRedrawRequest = this.register(new c.EventEmitter()), this.onRequestRedraw = this._onRedrawRequest.event, this._onSelectionChange = this.register(new c.EventEmitter()), this.onSelectionChange = this._onSelectionChange.event, this._onRequestScrollLines = this.register(new c.EventEmitter()), this.onRequestScrollLines = this._onRequestScrollLines.event, this._mouseMoveListener = (e4) => this._handleMouseMove(e4), this._mouseUpListener = (e4) => this._handleMouseUp(e4), this._coreService.onUserInput((() => { + this.hasSelection && this.clearSelection(); + })), this._trimListener = this._bufferService.buffer.lines.onTrim(((e4) => this._handleTrim(e4))), this.register(this._bufferService.buffers.onBufferActivate(((e4) => this._handleBufferActivate(e4)))), this.enable(), this._model = new a.SelectionModel(this._bufferService), this._activeSelectionMode = 0, this.register((0, l.toDisposable)((() => { + this._removeMouseDownListeners(); + }))); + } + reset() { + this.clearSelection(); + } + disable() { + this.clearSelection(), this._enabled = false; + } + enable() { + this._enabled = true; + } + get selectionStart() { + return this._model.finalSelectionStart; + } + get selectionEnd() { + return this._model.finalSelectionEnd; + } + get hasSelection() { + const e3 = this._model.finalSelectionStart, t3 = this._model.finalSelectionEnd; + return !(!e3 || !t3 || e3[0] === t3[0] && e3[1] === t3[1]); + } + get selectionText() { + const e3 = this._model.finalSelectionStart, t3 = this._model.finalSelectionEnd; + if (!e3 || !t3) return ""; + const i3 = this._bufferService.buffer, s3 = []; + if (3 === this._activeSelectionMode) { + if (e3[0] === t3[0]) return ""; + const r2 = e3[0] < t3[0] ? e3[0] : t3[0], n2 = e3[0] < t3[0] ? t3[0] : e3[0]; + for (let o2 = e3[1]; o2 <= t3[1]; o2++) { + const e4 = i3.translateBufferLineToString(o2, true, r2, n2); + s3.push(e4); + } + } else { + const r2 = e3[1] === t3[1] ? t3[0] : void 0; + s3.push(i3.translateBufferLineToString(e3[1], true, e3[0], r2)); + for (let r3 = e3[1] + 1; r3 <= t3[1] - 1; r3++) { + const e4 = i3.lines.get(r3), t4 = i3.translateBufferLineToString(r3, true); + (e4 == null ? void 0 : e4.isWrapped) ? s3[s3.length - 1] += t4 : s3.push(t4); + } + if (e3[1] !== t3[1]) { + const e4 = i3.lines.get(t3[1]), r3 = i3.translateBufferLineToString(t3[1], true, 0, t3[0]); + e4 && e4.isWrapped ? s3[s3.length - 1] += r3 : s3.push(r3); + } + } + return s3.map(((e4) => e4.replace(p, " "))).join(d.isWindows ? "\r\n" : "\n"); + } + clearSelection() { + this._model.clearSelection(), this._removeMouseDownListeners(), this.refresh(), this._onSelectionChange.fire(); + } + refresh(e3) { + this._refreshAnimationFrame || (this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame((() => this._refresh()))), d.isLinux && e3 && this.selectionText.length && this._onLinuxMouseSelection.fire(this.selectionText); + } + _refresh() { + this._refreshAnimationFrame = void 0, this._onRedrawRequest.fire({ start: this._model.finalSelectionStart, end: this._model.finalSelectionEnd, columnSelectMode: 3 === this._activeSelectionMode }); + } + _isClickInSelection(e3) { + const t3 = this._getMouseBufferCoords(e3), i3 = this._model.finalSelectionStart, s3 = this._model.finalSelectionEnd; + return !!(i3 && s3 && t3) && this._areCoordsInSelection(t3, i3, s3); + } + isCellInSelection(e3, t3) { + const i3 = this._model.finalSelectionStart, s3 = this._model.finalSelectionEnd; + return !(!i3 || !s3) && this._areCoordsInSelection([e3, t3], i3, s3); + } + _areCoordsInSelection(e3, t3, i3) { + return e3[1] > t3[1] && e3[1] < i3[1] || t3[1] === i3[1] && e3[1] === t3[1] && e3[0] >= t3[0] && e3[0] < i3[0] || t3[1] < i3[1] && e3[1] === i3[1] && e3[0] < i3[0] || t3[1] < i3[1] && e3[1] === t3[1] && e3[0] >= t3[0]; + } + _selectWordAtCursor(e3, t3) { + var _a, _b; + const i3 = (_b = (_a = this._linkifier.currentLink) == null ? void 0 : _a.link) == null ? void 0 : _b.range; + if (i3) return this._model.selectionStart = [i3.start.x - 1, i3.start.y - 1], this._model.selectionStartLength = (0, _.getRangeLength)(i3, this._bufferService.cols), this._model.selectionEnd = void 0, true; + const s3 = this._getMouseBufferCoords(e3); + return !!s3 && (this._selectWordAt(s3, t3), this._model.selectionEnd = void 0, true); + } + selectAll() { + this._model.isSelectAllActive = true, this.refresh(), this._onSelectionChange.fire(); + } + selectLines(e3, t3) { + this._model.clearSelection(), e3 = Math.max(e3, 0), t3 = Math.min(t3, this._bufferService.buffer.lines.length - 1), this._model.selectionStart = [0, e3], this._model.selectionEnd = [this._bufferService.cols, t3], this.refresh(), this._onSelectionChange.fire(); + } + _handleTrim(e3) { + this._model.handleTrim(e3) && this.refresh(); + } + _getMouseBufferCoords(e3) { + const t3 = this._mouseService.getCoords(e3, this._screenElement, this._bufferService.cols, this._bufferService.rows, true); + if (t3) return t3[0]--, t3[1]--, t3[1] += this._bufferService.buffer.ydisp, t3; + } + _getMouseEventScrollAmount(e3) { + let t3 = (0, n.getCoordsRelativeToElement)(this._coreBrowserService.window, e3, this._screenElement)[1]; + const i3 = this._renderService.dimensions.css.canvas.height; + return t3 >= 0 && t3 <= i3 ? 0 : (t3 > i3 && (t3 -= i3), t3 = Math.min(Math.max(t3, -50), 50), t3 /= 50, t3 / Math.abs(t3) + Math.round(14 * t3)); + } + shouldForceSelection(e3) { + return d.isMac ? e3.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection : e3.shiftKey; + } + handleMouseDown(e3) { + if (this._mouseDownTimeStamp = e3.timeStamp, (2 !== e3.button || !this.hasSelection) && 0 === e3.button) { + if (!this._enabled) { + if (!this.shouldForceSelection(e3)) return; + e3.stopPropagation(); + } + e3.preventDefault(), this._dragScrollAmount = 0, this._enabled && e3.shiftKey ? this._handleIncrementalClick(e3) : 1 === e3.detail ? this._handleSingleClick(e3) : 2 === e3.detail ? this._handleDoubleClick(e3) : 3 === e3.detail && this._handleTripleClick(e3), this._addMouseDownListeners(), this.refresh(true); + } + } + _addMouseDownListeners() { + this._screenElement.ownerDocument && (this._screenElement.ownerDocument.addEventListener("mousemove", this._mouseMoveListener), this._screenElement.ownerDocument.addEventListener("mouseup", this._mouseUpListener)), this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval((() => this._dragScroll()), 50); + } + _removeMouseDownListeners() { + this._screenElement.ownerDocument && (this._screenElement.ownerDocument.removeEventListener("mousemove", this._mouseMoveListener), this._screenElement.ownerDocument.removeEventListener("mouseup", this._mouseUpListener)), this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer), this._dragScrollIntervalTimer = void 0; + } + _handleIncrementalClick(e3) { + this._model.selectionStart && (this._model.selectionEnd = this._getMouseBufferCoords(e3)); + } + _handleSingleClick(e3) { + if (this._model.selectionStartLength = 0, this._model.isSelectAllActive = false, this._activeSelectionMode = this.shouldColumnSelect(e3) ? 3 : 0, this._model.selectionStart = this._getMouseBufferCoords(e3), !this._model.selectionStart) return; + this._model.selectionEnd = void 0; + const t3 = this._bufferService.buffer.lines.get(this._model.selectionStart[1]); + t3 && t3.length !== this._model.selectionStart[0] && 0 === t3.hasWidth(this._model.selectionStart[0]) && this._model.selectionStart[0]++; + } + _handleDoubleClick(e3) { + this._selectWordAtCursor(e3, true) && (this._activeSelectionMode = 1); + } + _handleTripleClick(e3) { + const t3 = this._getMouseBufferCoords(e3); + t3 && (this._activeSelectionMode = 2, this._selectLineAt(t3[1])); + } + shouldColumnSelect(e3) { + return e3.altKey && !(d.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection); + } + _handleMouseMove(e3) { + if (e3.stopImmediatePropagation(), !this._model.selectionStart) return; + const t3 = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null; + if (this._model.selectionEnd = this._getMouseBufferCoords(e3), !this._model.selectionEnd) return void this.refresh(true); + 2 === this._activeSelectionMode ? this._model.selectionEnd[1] < this._model.selectionStart[1] ? this._model.selectionEnd[0] = 0 : this._model.selectionEnd[0] = this._bufferService.cols : 1 === this._activeSelectionMode && this._selectToWordAt(this._model.selectionEnd), this._dragScrollAmount = this._getMouseEventScrollAmount(e3), 3 !== this._activeSelectionMode && (this._dragScrollAmount > 0 ? this._model.selectionEnd[0] = this._bufferService.cols : this._dragScrollAmount < 0 && (this._model.selectionEnd[0] = 0)); + const i3 = this._bufferService.buffer; + if (this._model.selectionEnd[1] < i3.lines.length) { + const e4 = i3.lines.get(this._model.selectionEnd[1]); + e4 && 0 === e4.hasWidth(this._model.selectionEnd[0]) && this._model.selectionEnd[0] < this._bufferService.cols && this._model.selectionEnd[0]++; + } + t3 && t3[0] === this._model.selectionEnd[0] && t3[1] === this._model.selectionEnd[1] || this.refresh(true); + } + _dragScroll() { + if (this._model.selectionEnd && this._model.selectionStart && this._dragScrollAmount) { + this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false }); + const e3 = this._bufferService.buffer; + this._dragScrollAmount > 0 ? (3 !== this._activeSelectionMode && (this._model.selectionEnd[0] = this._bufferService.cols), this._model.selectionEnd[1] = Math.min(e3.ydisp + this._bufferService.rows, e3.lines.length - 1)) : (3 !== this._activeSelectionMode && (this._model.selectionEnd[0] = 0), this._model.selectionEnd[1] = e3.ydisp), this.refresh(); + } + } + _handleMouseUp(e3) { + const t3 = e3.timeStamp - this._mouseDownTimeStamp; + if (this._removeMouseDownListeners(), this.selectionText.length <= 1 && t3 < 500 && e3.altKey && this._optionsService.rawOptions.altClickMovesCursor) { + if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) { + const t4 = this._mouseService.getCoords(e3, this._element, this._bufferService.cols, this._bufferService.rows, false); + if (t4 && void 0 !== t4[0] && void 0 !== t4[1]) { + const e4 = (0, o.moveToCellSequence)(t4[0] - 1, t4[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys); + this._coreService.triggerDataEvent(e4, true); + } + } + } else this._fireEventIfSelectionChanged(); + } + _fireEventIfSelectionChanged() { + const e3 = this._model.finalSelectionStart, t3 = this._model.finalSelectionEnd, i3 = !(!e3 || !t3 || e3[0] === t3[0] && e3[1] === t3[1]); + i3 ? e3 && t3 && (this._oldSelectionStart && this._oldSelectionEnd && e3[0] === this._oldSelectionStart[0] && e3[1] === this._oldSelectionStart[1] && t3[0] === this._oldSelectionEnd[0] && t3[1] === this._oldSelectionEnd[1] || this._fireOnSelectionChange(e3, t3, i3)) : this._oldHasSelection && this._fireOnSelectionChange(e3, t3, i3); + } + _fireOnSelectionChange(e3, t3, i3) { + this._oldSelectionStart = e3, this._oldSelectionEnd = t3, this._oldHasSelection = i3, this._onSelectionChange.fire(); + } + _handleBufferActivate(e3) { + this.clearSelection(), this._trimListener.dispose(), this._trimListener = e3.activeBuffer.lines.onTrim(((e4) => this._handleTrim(e4))); + } + _convertViewportColToCharacterIndex(e3, t3) { + let i3 = t3; + for (let s3 = 0; t3 >= s3; s3++) { + const r2 = e3.loadCell(s3, this._workCell).getChars().length; + 0 === this._workCell.getWidth() ? i3-- : r2 > 1 && t3 !== s3 && (i3 += r2 - 1); + } + return i3; + } + setSelection(e3, t3, i3) { + this._model.clearSelection(), this._removeMouseDownListeners(), this._model.selectionStart = [e3, t3], this._model.selectionStartLength = i3, this.refresh(), this._fireEventIfSelectionChanged(); + } + rightClickSelect(e3) { + this._isClickInSelection(e3) || (this._selectWordAtCursor(e3, false) && this.refresh(true), this._fireEventIfSelectionChanged()); + } + _getWordAt(e3, t3, i3 = true, s3 = true) { + if (e3[0] >= this._bufferService.cols) return; + const r2 = this._bufferService.buffer, n2 = r2.lines.get(e3[1]); + if (!n2) return; + const o2 = r2.translateBufferLineToString(e3[1], false); + let a2 = this._convertViewportColToCharacterIndex(n2, e3[0]), h2 = a2; + const c2 = e3[0] - a2; + let l2 = 0, d2 = 0, _2 = 0, u2 = 0; + if (" " === o2.charAt(a2)) { + for (; a2 > 0 && " " === o2.charAt(a2 - 1); ) a2--; + for (; h2 < o2.length && " " === o2.charAt(h2 + 1); ) h2++; + } else { + let t4 = e3[0], i4 = e3[0]; + 0 === n2.getWidth(t4) && (l2++, t4--), 2 === n2.getWidth(i4) && (d2++, i4++); + const s4 = n2.getString(i4).length; + for (s4 > 1 && (u2 += s4 - 1, h2 += s4 - 1); t4 > 0 && a2 > 0 && !this._isCharWordSeparator(n2.loadCell(t4 - 1, this._workCell)); ) { + n2.loadCell(t4 - 1, this._workCell); + const e4 = this._workCell.getChars().length; + 0 === this._workCell.getWidth() ? (l2++, t4--) : e4 > 1 && (_2 += e4 - 1, a2 -= e4 - 1), a2--, t4--; + } + for (; i4 < n2.length && h2 + 1 < o2.length && !this._isCharWordSeparator(n2.loadCell(i4 + 1, this._workCell)); ) { + n2.loadCell(i4 + 1, this._workCell); + const e4 = this._workCell.getChars().length; + 2 === this._workCell.getWidth() ? (d2++, i4++) : e4 > 1 && (u2 += e4 - 1, h2 += e4 - 1), h2++, i4++; + } + } + h2++; + let f2 = a2 + c2 - l2 + _2, v2 = Math.min(this._bufferService.cols, h2 - a2 + l2 + d2 - _2 - u2); + if (t3 || "" !== o2.slice(a2, h2).trim()) { + if (i3 && 0 === f2 && 32 !== n2.getCodePoint(0)) { + const t4 = r2.lines.get(e3[1] - 1); + if (t4 && n2.isWrapped && 32 !== t4.getCodePoint(this._bufferService.cols - 1)) { + const t5 = this._getWordAt([this._bufferService.cols - 1, e3[1] - 1], false, true, false); + if (t5) { + const e4 = this._bufferService.cols - t5.start; + f2 -= e4, v2 += e4; + } + } + } + if (s3 && f2 + v2 === this._bufferService.cols && 32 !== n2.getCodePoint(this._bufferService.cols - 1)) { + const t4 = r2.lines.get(e3[1] + 1); + if ((t4 == null ? void 0 : t4.isWrapped) && 32 !== t4.getCodePoint(0)) { + const t5 = this._getWordAt([0, e3[1] + 1], false, false, true); + t5 && (v2 += t5.length); + } + } + return { start: f2, length: v2 }; + } + } + _selectWordAt(e3, t3) { + const i3 = this._getWordAt(e3, t3); + if (i3) { + for (; i3.start < 0; ) i3.start += this._bufferService.cols, e3[1]--; + this._model.selectionStart = [i3.start, e3[1]], this._model.selectionStartLength = i3.length; + } + } + _selectToWordAt(e3) { + const t3 = this._getWordAt(e3, true); + if (t3) { + let i3 = e3[1]; + for (; t3.start < 0; ) t3.start += this._bufferService.cols, i3--; + if (!this._model.areSelectionValuesReversed()) for (; t3.start + t3.length > this._bufferService.cols; ) t3.length -= this._bufferService.cols, i3++; + this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? t3.start : t3.start + t3.length, i3]; + } + } + _isCharWordSeparator(e3) { + return 0 !== e3.getWidth() && this._optionsService.rawOptions.wordSeparator.indexOf(e3.getChars()) >= 0; + } + _selectLineAt(e3) { + const t3 = this._bufferService.buffer.getWrappedRangeForLine(e3), i3 = { start: { x: 0, y: t3.first }, end: { x: this._bufferService.cols - 1, y: t3.last } }; + this._model.selectionStart = [0, t3.first], this._model.selectionEnd = void 0, this._model.selectionStartLength = (0, _.getRangeLength)(i3, this._bufferService.cols); + } + }; + t2.SelectionService = g = s2([r(3, f.IBufferService), r(4, f.ICoreService), r(5, h.IMouseService), r(6, f.IOptionsService), r(7, h.IRenderService), r(8, h.ICoreBrowserService)], g); + }, 4725: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ILinkProviderService = t2.IThemeService = t2.ICharacterJoinerService = t2.ISelectionService = t2.IRenderService = t2.IMouseService = t2.ICoreBrowserService = t2.ICharSizeService = void 0; + const s2 = i2(8343); + t2.ICharSizeService = (0, s2.createDecorator)("CharSizeService"), t2.ICoreBrowserService = (0, s2.createDecorator)("CoreBrowserService"), t2.IMouseService = (0, s2.createDecorator)("MouseService"), t2.IRenderService = (0, s2.createDecorator)("RenderService"), t2.ISelectionService = (0, s2.createDecorator)("SelectionService"), t2.ICharacterJoinerService = (0, s2.createDecorator)("CharacterJoinerService"), t2.IThemeService = (0, s2.createDecorator)("ThemeService"), t2.ILinkProviderService = (0, s2.createDecorator)("LinkProviderService"); + }, 6731: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.ThemeService = t2.DEFAULT_ANSI_COLORS = void 0; + const n = i2(7239), o = i2(8055), a = i2(8460), h = i2(844), c = i2(2585), l = o.css.toColor("#ffffff"), d = o.css.toColor("#000000"), _ = o.css.toColor("#ffffff"), u = o.css.toColor("#000000"), f = { css: "rgba(255, 255, 255, 0.3)", rgba: 4294967117 }; + t2.DEFAULT_ANSI_COLORS = Object.freeze((() => { + const e3 = [o.css.toColor("#2e3436"), o.css.toColor("#cc0000"), o.css.toColor("#4e9a06"), o.css.toColor("#c4a000"), o.css.toColor("#3465a4"), o.css.toColor("#75507b"), o.css.toColor("#06989a"), o.css.toColor("#d3d7cf"), o.css.toColor("#555753"), o.css.toColor("#ef2929"), o.css.toColor("#8ae234"), o.css.toColor("#fce94f"), o.css.toColor("#729fcf"), o.css.toColor("#ad7fa8"), o.css.toColor("#34e2e2"), o.css.toColor("#eeeeec")], t3 = [0, 95, 135, 175, 215, 255]; + for (let i3 = 0; i3 < 216; i3++) { + const s3 = t3[i3 / 36 % 6 | 0], r2 = t3[i3 / 6 % 6 | 0], n2 = t3[i3 % 6]; + e3.push({ css: o.channels.toCss(s3, r2, n2), rgba: o.channels.toRgba(s3, r2, n2) }); + } + for (let t4 = 0; t4 < 24; t4++) { + const i3 = 8 + 10 * t4; + e3.push({ css: o.channels.toCss(i3, i3, i3), rgba: o.channels.toRgba(i3, i3, i3) }); + } + return e3; + })()); + let v = t2.ThemeService = class extends h.Disposable { + get colors() { + return this._colors; + } + constructor(e3) { + super(), this._optionsService = e3, this._contrastCache = new n.ColorContrastCache(), this._halfContrastCache = new n.ColorContrastCache(), this._onChangeColors = this.register(new a.EventEmitter()), this.onChangeColors = this._onChangeColors.event, this._colors = { foreground: l, background: d, cursor: _, cursorAccent: u, selectionForeground: void 0, selectionBackgroundTransparent: f, selectionBackgroundOpaque: o.color.blend(d, f), selectionInactiveBackgroundTransparent: f, selectionInactiveBackgroundOpaque: o.color.blend(d, f), ansi: t2.DEFAULT_ANSI_COLORS.slice(), contrastCache: this._contrastCache, halfContrastCache: this._halfContrastCache }, this._updateRestoreColors(), this._setTheme(this._optionsService.rawOptions.theme), this.register(this._optionsService.onSpecificOptionChange("minimumContrastRatio", (() => this._contrastCache.clear()))), this.register(this._optionsService.onSpecificOptionChange("theme", (() => this._setTheme(this._optionsService.rawOptions.theme)))); + } + _setTheme(e3 = {}) { + const i3 = this._colors; + if (i3.foreground = p(e3.foreground, l), i3.background = p(e3.background, d), i3.cursor = p(e3.cursor, _), i3.cursorAccent = p(e3.cursorAccent, u), i3.selectionBackgroundTransparent = p(e3.selectionBackground, f), i3.selectionBackgroundOpaque = o.color.blend(i3.background, i3.selectionBackgroundTransparent), i3.selectionInactiveBackgroundTransparent = p(e3.selectionInactiveBackground, i3.selectionBackgroundTransparent), i3.selectionInactiveBackgroundOpaque = o.color.blend(i3.background, i3.selectionInactiveBackgroundTransparent), i3.selectionForeground = e3.selectionForeground ? p(e3.selectionForeground, o.NULL_COLOR) : void 0, i3.selectionForeground === o.NULL_COLOR && (i3.selectionForeground = void 0), o.color.isOpaque(i3.selectionBackgroundTransparent)) { + const e4 = 0.3; + i3.selectionBackgroundTransparent = o.color.opacity(i3.selectionBackgroundTransparent, e4); + } + if (o.color.isOpaque(i3.selectionInactiveBackgroundTransparent)) { + const e4 = 0.3; + i3.selectionInactiveBackgroundTransparent = o.color.opacity(i3.selectionInactiveBackgroundTransparent, e4); + } + if (i3.ansi = t2.DEFAULT_ANSI_COLORS.slice(), i3.ansi[0] = p(e3.black, t2.DEFAULT_ANSI_COLORS[0]), i3.ansi[1] = p(e3.red, t2.DEFAULT_ANSI_COLORS[1]), i3.ansi[2] = p(e3.green, t2.DEFAULT_ANSI_COLORS[2]), i3.ansi[3] = p(e3.yellow, t2.DEFAULT_ANSI_COLORS[3]), i3.ansi[4] = p(e3.blue, t2.DEFAULT_ANSI_COLORS[4]), i3.ansi[5] = p(e3.magenta, t2.DEFAULT_ANSI_COLORS[5]), i3.ansi[6] = p(e3.cyan, t2.DEFAULT_ANSI_COLORS[6]), i3.ansi[7] = p(e3.white, t2.DEFAULT_ANSI_COLORS[7]), i3.ansi[8] = p(e3.brightBlack, t2.DEFAULT_ANSI_COLORS[8]), i3.ansi[9] = p(e3.brightRed, t2.DEFAULT_ANSI_COLORS[9]), i3.ansi[10] = p(e3.brightGreen, t2.DEFAULT_ANSI_COLORS[10]), i3.ansi[11] = p(e3.brightYellow, t2.DEFAULT_ANSI_COLORS[11]), i3.ansi[12] = p(e3.brightBlue, t2.DEFAULT_ANSI_COLORS[12]), i3.ansi[13] = p(e3.brightMagenta, t2.DEFAULT_ANSI_COLORS[13]), i3.ansi[14] = p(e3.brightCyan, t2.DEFAULT_ANSI_COLORS[14]), i3.ansi[15] = p(e3.brightWhite, t2.DEFAULT_ANSI_COLORS[15]), e3.extendedAnsi) { + const s3 = Math.min(i3.ansi.length - 16, e3.extendedAnsi.length); + for (let r2 = 0; r2 < s3; r2++) i3.ansi[r2 + 16] = p(e3.extendedAnsi[r2], t2.DEFAULT_ANSI_COLORS[r2 + 16]); + } + this._contrastCache.clear(), this._halfContrastCache.clear(), this._updateRestoreColors(), this._onChangeColors.fire(this.colors); + } + restoreColor(e3) { + this._restoreColor(e3), this._onChangeColors.fire(this.colors); + } + _restoreColor(e3) { + if (void 0 !== e3) switch (e3) { + case 256: + this._colors.foreground = this._restoreColors.foreground; + break; + case 257: + this._colors.background = this._restoreColors.background; + break; + case 258: + this._colors.cursor = this._restoreColors.cursor; + break; + default: + this._colors.ansi[e3] = this._restoreColors.ansi[e3]; + } + else for (let e4 = 0; e4 < this._restoreColors.ansi.length; ++e4) this._colors.ansi[e4] = this._restoreColors.ansi[e4]; + } + modifyColors(e3) { + e3(this._colors), this._onChangeColors.fire(this.colors); + } + _updateRestoreColors() { + this._restoreColors = { foreground: this._colors.foreground, background: this._colors.background, cursor: this._colors.cursor, ansi: this._colors.ansi.slice() }; + } + }; + function p(e3, t3) { + if (void 0 !== e3) try { + return o.css.toColor(e3); + } catch { + } + return t3; + } + t2.ThemeService = v = s2([r(0, c.IOptionsService)], v); + }, 6349: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CircularList = void 0; + const s2 = i2(8460), r = i2(844); + class n extends r.Disposable { + constructor(e3) { + super(), this._maxLength = e3, this.onDeleteEmitter = this.register(new s2.EventEmitter()), this.onDelete = this.onDeleteEmitter.event, this.onInsertEmitter = this.register(new s2.EventEmitter()), this.onInsert = this.onInsertEmitter.event, this.onTrimEmitter = this.register(new s2.EventEmitter()), this.onTrim = this.onTrimEmitter.event, this._array = new Array(this._maxLength), this._startIndex = 0, this._length = 0; + } + get maxLength() { + return this._maxLength; + } + set maxLength(e3) { + if (this._maxLength === e3) return; + const t3 = new Array(e3); + for (let i3 = 0; i3 < Math.min(e3, this.length); i3++) t3[i3] = this._array[this._getCyclicIndex(i3)]; + this._array = t3, this._maxLength = e3, this._startIndex = 0; + } + get length() { + return this._length; + } + set length(e3) { + if (e3 > this._length) for (let t3 = this._length; t3 < e3; t3++) this._array[t3] = void 0; + this._length = e3; + } + get(e3) { + return this._array[this._getCyclicIndex(e3)]; + } + set(e3, t3) { + this._array[this._getCyclicIndex(e3)] = t3; + } + push(e3) { + this._array[this._getCyclicIndex(this._length)] = e3, this._length === this._maxLength ? (this._startIndex = ++this._startIndex % this._maxLength, this.onTrimEmitter.fire(1)) : this._length++; + } + recycle() { + if (this._length !== this._maxLength) throw new Error("Can only recycle when the buffer is full"); + return this._startIndex = ++this._startIndex % this._maxLength, this.onTrimEmitter.fire(1), this._array[this._getCyclicIndex(this._length - 1)]; + } + get isFull() { + return this._length === this._maxLength; + } + pop() { + return this._array[this._getCyclicIndex(this._length-- - 1)]; + } + splice(e3, t3, ...i3) { + if (t3) { + for (let i4 = e3; i4 < this._length - t3; i4++) this._array[this._getCyclicIndex(i4)] = this._array[this._getCyclicIndex(i4 + t3)]; + this._length -= t3, this.onDeleteEmitter.fire({ index: e3, amount: t3 }); + } + for (let t4 = this._length - 1; t4 >= e3; t4--) this._array[this._getCyclicIndex(t4 + i3.length)] = this._array[this._getCyclicIndex(t4)]; + for (let t4 = 0; t4 < i3.length; t4++) this._array[this._getCyclicIndex(e3 + t4)] = i3[t4]; + if (i3.length && this.onInsertEmitter.fire({ index: e3, amount: i3.length }), this._length + i3.length > this._maxLength) { + const e4 = this._length + i3.length - this._maxLength; + this._startIndex += e4, this._length = this._maxLength, this.onTrimEmitter.fire(e4); + } else this._length += i3.length; + } + trimStart(e3) { + e3 > this._length && (e3 = this._length), this._startIndex += e3, this._length -= e3, this.onTrimEmitter.fire(e3); + } + shiftElements(e3, t3, i3) { + if (!(t3 <= 0)) { + if (e3 < 0 || e3 >= this._length) throw new Error("start argument out of range"); + if (e3 + i3 < 0) throw new Error("Cannot shift elements in list beyond index 0"); + if (i3 > 0) { + for (let s4 = t3 - 1; s4 >= 0; s4--) this.set(e3 + s4 + i3, this.get(e3 + s4)); + const s3 = e3 + t3 + i3 - this._length; + if (s3 > 0) for (this._length += s3; this._length > this._maxLength; ) this._length--, this._startIndex++, this.onTrimEmitter.fire(1); + } else for (let s3 = 0; s3 < t3; s3++) this.set(e3 + s3 + i3, this.get(e3 + s3)); + } + } + _getCyclicIndex(e3) { + return (this._startIndex + e3) % this._maxLength; + } + } + t2.CircularList = n; + }, 1439: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.clone = void 0, t2.clone = function e3(t3, i2 = 5) { + if ("object" != typeof t3) return t3; + const s2 = Array.isArray(t3) ? [] : {}; + for (const r in t3) s2[r] = i2 <= 1 ? t3[r] : t3[r] && e3(t3[r], i2 - 1); + return s2; + }; + }, 8055: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.contrastRatio = t2.toPaddedHex = t2.rgba = t2.rgb = t2.css = t2.color = t2.channels = t2.NULL_COLOR = void 0; + let i2 = 0, s2 = 0, r = 0, n = 0; + var o, a, h, c, l; + function d(e3) { + const t3 = e3.toString(16); + return t3.length < 2 ? "0" + t3 : t3; + } + function _(e3, t3) { + return e3 < t3 ? (t3 + 0.05) / (e3 + 0.05) : (e3 + 0.05) / (t3 + 0.05); + } + t2.NULL_COLOR = { css: "#00000000", rgba: 0 }, (function(e3) { + e3.toCss = function(e4, t3, i3, s3) { + return void 0 !== s3 ? `#${d(e4)}${d(t3)}${d(i3)}${d(s3)}` : `#${d(e4)}${d(t3)}${d(i3)}`; + }, e3.toRgba = function(e4, t3, i3, s3 = 255) { + return (e4 << 24 | t3 << 16 | i3 << 8 | s3) >>> 0; + }, e3.toColor = function(t3, i3, s3, r2) { + return { css: e3.toCss(t3, i3, s3, r2), rgba: e3.toRgba(t3, i3, s3, r2) }; + }; + })(o || (t2.channels = o = {})), (function(e3) { + function t3(e4, t4) { + return n = Math.round(255 * t4), [i2, s2, r] = l.toChannels(e4.rgba), { css: o.toCss(i2, s2, r, n), rgba: o.toRgba(i2, s2, r, n) }; + } + e3.blend = function(e4, t4) { + if (n = (255 & t4.rgba) / 255, 1 === n) return { css: t4.css, rgba: t4.rgba }; + const a2 = t4.rgba >> 24 & 255, h2 = t4.rgba >> 16 & 255, c2 = t4.rgba >> 8 & 255, l2 = e4.rgba >> 24 & 255, d2 = e4.rgba >> 16 & 255, _2 = e4.rgba >> 8 & 255; + return i2 = l2 + Math.round((a2 - l2) * n), s2 = d2 + Math.round((h2 - d2) * n), r = _2 + Math.round((c2 - _2) * n), { css: o.toCss(i2, s2, r), rgba: o.toRgba(i2, s2, r) }; + }, e3.isOpaque = function(e4) { + return 255 == (255 & e4.rgba); + }, e3.ensureContrastRatio = function(e4, t4, i3) { + const s3 = l.ensureContrastRatio(e4.rgba, t4.rgba, i3); + if (s3) return o.toColor(s3 >> 24 & 255, s3 >> 16 & 255, s3 >> 8 & 255); + }, e3.opaque = function(e4) { + const t4 = (255 | e4.rgba) >>> 0; + return [i2, s2, r] = l.toChannels(t4), { css: o.toCss(i2, s2, r), rgba: t4 }; + }, e3.opacity = t3, e3.multiplyOpacity = function(e4, i3) { + return n = 255 & e4.rgba, t3(e4, n * i3 / 255); + }, e3.toColorRGB = function(e4) { + return [e4.rgba >> 24 & 255, e4.rgba >> 16 & 255, e4.rgba >> 8 & 255]; + }; + })(a || (t2.color = a = {})), (function(e3) { + let t3, a2; + try { + const e4 = document.createElement("canvas"); + e4.width = 1, e4.height = 1; + const i3 = e4.getContext("2d", { willReadFrequently: true }); + i3 && (t3 = i3, t3.globalCompositeOperation = "copy", a2 = t3.createLinearGradient(0, 0, 1, 1)); + } catch { + } + e3.toColor = function(e4) { + if (e4.match(/#[\da-f]{3,8}/i)) switch (e4.length) { + case 4: + return i2 = parseInt(e4.slice(1, 2).repeat(2), 16), s2 = parseInt(e4.slice(2, 3).repeat(2), 16), r = parseInt(e4.slice(3, 4).repeat(2), 16), o.toColor(i2, s2, r); + case 5: + return i2 = parseInt(e4.slice(1, 2).repeat(2), 16), s2 = parseInt(e4.slice(2, 3).repeat(2), 16), r = parseInt(e4.slice(3, 4).repeat(2), 16), n = parseInt(e4.slice(4, 5).repeat(2), 16), o.toColor(i2, s2, r, n); + case 7: + return { css: e4, rgba: (parseInt(e4.slice(1), 16) << 8 | 255) >>> 0 }; + case 9: + return { css: e4, rgba: parseInt(e4.slice(1), 16) >>> 0 }; + } + const h2 = e4.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/); + if (h2) return i2 = parseInt(h2[1]), s2 = parseInt(h2[2]), r = parseInt(h2[3]), n = Math.round(255 * (void 0 === h2[5] ? 1 : parseFloat(h2[5]))), o.toColor(i2, s2, r, n); + if (!t3 || !a2) throw new Error("css.toColor: Unsupported css format"); + if (t3.fillStyle = a2, t3.fillStyle = e4, "string" != typeof t3.fillStyle) throw new Error("css.toColor: Unsupported css format"); + if (t3.fillRect(0, 0, 1, 1), [i2, s2, r, n] = t3.getImageData(0, 0, 1, 1).data, 255 !== n) throw new Error("css.toColor: Unsupported css format"); + return { rgba: o.toRgba(i2, s2, r, n), css: e4 }; + }; + })(h || (t2.css = h = {})), (function(e3) { + function t3(e4, t4, i3) { + const s3 = e4 / 255, r2 = t4 / 255, n2 = i3 / 255; + return 0.2126 * (s3 <= 0.03928 ? s3 / 12.92 : Math.pow((s3 + 0.055) / 1.055, 2.4)) + 0.7152 * (r2 <= 0.03928 ? r2 / 12.92 : Math.pow((r2 + 0.055) / 1.055, 2.4)) + 0.0722 * (n2 <= 0.03928 ? n2 / 12.92 : Math.pow((n2 + 0.055) / 1.055, 2.4)); + } + e3.relativeLuminance = function(e4) { + return t3(e4 >> 16 & 255, e4 >> 8 & 255, 255 & e4); + }, e3.relativeLuminance2 = t3; + })(c || (t2.rgb = c = {})), (function(e3) { + function t3(e4, t4, i3) { + const s3 = e4 >> 24 & 255, r2 = e4 >> 16 & 255, n2 = e4 >> 8 & 255; + let o2 = t4 >> 24 & 255, a3 = t4 >> 16 & 255, h2 = t4 >> 8 & 255, l2 = _(c.relativeLuminance2(o2, a3, h2), c.relativeLuminance2(s3, r2, n2)); + for (; l2 < i3 && (o2 > 0 || a3 > 0 || h2 > 0); ) o2 -= Math.max(0, Math.ceil(0.1 * o2)), a3 -= Math.max(0, Math.ceil(0.1 * a3)), h2 -= Math.max(0, Math.ceil(0.1 * h2)), l2 = _(c.relativeLuminance2(o2, a3, h2), c.relativeLuminance2(s3, r2, n2)); + return (o2 << 24 | a3 << 16 | h2 << 8 | 255) >>> 0; + } + function a2(e4, t4, i3) { + const s3 = e4 >> 24 & 255, r2 = e4 >> 16 & 255, n2 = e4 >> 8 & 255; + let o2 = t4 >> 24 & 255, a3 = t4 >> 16 & 255, h2 = t4 >> 8 & 255, l2 = _(c.relativeLuminance2(o2, a3, h2), c.relativeLuminance2(s3, r2, n2)); + for (; l2 < i3 && (o2 < 255 || a3 < 255 || h2 < 255); ) o2 = Math.min(255, o2 + Math.ceil(0.1 * (255 - o2))), a3 = Math.min(255, a3 + Math.ceil(0.1 * (255 - a3))), h2 = Math.min(255, h2 + Math.ceil(0.1 * (255 - h2))), l2 = _(c.relativeLuminance2(o2, a3, h2), c.relativeLuminance2(s3, r2, n2)); + return (o2 << 24 | a3 << 16 | h2 << 8 | 255) >>> 0; + } + e3.blend = function(e4, t4) { + if (n = (255 & t4) / 255, 1 === n) return t4; + const a3 = t4 >> 24 & 255, h2 = t4 >> 16 & 255, c2 = t4 >> 8 & 255, l2 = e4 >> 24 & 255, d2 = e4 >> 16 & 255, _2 = e4 >> 8 & 255; + return i2 = l2 + Math.round((a3 - l2) * n), s2 = d2 + Math.round((h2 - d2) * n), r = _2 + Math.round((c2 - _2) * n), o.toRgba(i2, s2, r); + }, e3.ensureContrastRatio = function(e4, i3, s3) { + const r2 = c.relativeLuminance(e4 >> 8), n2 = c.relativeLuminance(i3 >> 8); + if (_(r2, n2) < s3) { + if (n2 < r2) { + const n3 = t3(e4, i3, s3), o3 = _(r2, c.relativeLuminance(n3 >> 8)); + if (o3 < s3) { + const t4 = a2(e4, i3, s3); + return o3 > _(r2, c.relativeLuminance(t4 >> 8)) ? n3 : t4; + } + return n3; + } + const o2 = a2(e4, i3, s3), h2 = _(r2, c.relativeLuminance(o2 >> 8)); + if (h2 < s3) { + const n3 = t3(e4, i3, s3); + return h2 > _(r2, c.relativeLuminance(n3 >> 8)) ? o2 : n3; + } + return o2; + } + }, e3.reduceLuminance = t3, e3.increaseLuminance = a2, e3.toChannels = function(e4) { + return [e4 >> 24 & 255, e4 >> 16 & 255, e4 >> 8 & 255, 255 & e4]; + }; + })(l || (t2.rgba = l = {})), t2.toPaddedHex = d, t2.contrastRatio = _; + }, 8969: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CoreTerminal = void 0; + const s2 = i2(844), r = i2(2585), n = i2(4348), o = i2(7866), a = i2(744), h = i2(7302), c = i2(6975), l = i2(8460), d = i2(1753), _ = i2(1480), u = i2(7994), f = i2(9282), v = i2(5435), p = i2(5981), g = i2(2660); + let m = false; + class S extends s2.Disposable { + get onScroll() { + return this._onScrollApi || (this._onScrollApi = this.register(new l.EventEmitter()), this._onScroll.event(((e3) => { + var _a; + (_a = this._onScrollApi) == null ? void 0 : _a.fire(e3.position); + }))), this._onScrollApi.event; + } + get cols() { + return this._bufferService.cols; + } + get rows() { + return this._bufferService.rows; + } + get buffers() { + return this._bufferService.buffers; + } + get options() { + return this.optionsService.options; + } + set options(e3) { + for (const t3 in e3) this.optionsService.options[t3] = e3[t3]; + } + constructor(e3) { + super(), this._windowsWrappingHeuristics = this.register(new s2.MutableDisposable()), this._onBinary = this.register(new l.EventEmitter()), this.onBinary = this._onBinary.event, this._onData = this.register(new l.EventEmitter()), this.onData = this._onData.event, this._onLineFeed = this.register(new l.EventEmitter()), this.onLineFeed = this._onLineFeed.event, this._onResize = this.register(new l.EventEmitter()), this.onResize = this._onResize.event, this._onWriteParsed = this.register(new l.EventEmitter()), this.onWriteParsed = this._onWriteParsed.event, this._onScroll = this.register(new l.EventEmitter()), this._instantiationService = new n.InstantiationService(), this.optionsService = this.register(new h.OptionsService(e3)), this._instantiationService.setService(r.IOptionsService, this.optionsService), this._bufferService = this.register(this._instantiationService.createInstance(a.BufferService)), this._instantiationService.setService(r.IBufferService, this._bufferService), this._logService = this.register(this._instantiationService.createInstance(o.LogService)), this._instantiationService.setService(r.ILogService, this._logService), this.coreService = this.register(this._instantiationService.createInstance(c.CoreService)), this._instantiationService.setService(r.ICoreService, this.coreService), this.coreMouseService = this.register(this._instantiationService.createInstance(d.CoreMouseService)), this._instantiationService.setService(r.ICoreMouseService, this.coreMouseService), this.unicodeService = this.register(this._instantiationService.createInstance(_.UnicodeService)), this._instantiationService.setService(r.IUnicodeService, this.unicodeService), this._charsetService = this._instantiationService.createInstance(u.CharsetService), this._instantiationService.setService(r.ICharsetService, this._charsetService), this._oscLinkService = this._instantiationService.createInstance(g.OscLinkService), this._instantiationService.setService(r.IOscLinkService, this._oscLinkService), this._inputHandler = this.register(new v.InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.coreMouseService, this.unicodeService)), this.register((0, l.forwardEvent)(this._inputHandler.onLineFeed, this._onLineFeed)), this.register(this._inputHandler), this.register((0, l.forwardEvent)(this._bufferService.onResize, this._onResize)), this.register((0, l.forwardEvent)(this.coreService.onData, this._onData)), this.register((0, l.forwardEvent)(this.coreService.onBinary, this._onBinary)), this.register(this.coreService.onRequestScrollToBottom((() => this.scrollToBottom()))), this.register(this.coreService.onUserInput((() => this._writeBuffer.handleUserInput()))), this.register(this.optionsService.onMultipleOptionChange(["windowsMode", "windowsPty"], (() => this._handleWindowsPtyOptionChange()))), this.register(this._bufferService.onScroll(((e4) => { + this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: 0 }), this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom); + }))), this.register(this._inputHandler.onScroll(((e4) => { + this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: 0 }), this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom); + }))), this._writeBuffer = this.register(new p.WriteBuffer(((e4, t3) => this._inputHandler.parse(e4, t3)))), this.register((0, l.forwardEvent)(this._writeBuffer.onWriteParsed, this._onWriteParsed)); + } + write(e3, t3) { + this._writeBuffer.write(e3, t3); + } + writeSync(e3, t3) { + this._logService.logLevel <= r.LogLevelEnum.WARN && !m && (this._logService.warn("writeSync is unreliable and will be removed soon."), m = true), this._writeBuffer.writeSync(e3, t3); + } + input(e3, t3 = true) { + this.coreService.triggerDataEvent(e3, t3); + } + resize(e3, t3) { + isNaN(e3) || isNaN(t3) || (e3 = Math.max(e3, a.MINIMUM_COLS), t3 = Math.max(t3, a.MINIMUM_ROWS), this._bufferService.resize(e3, t3)); + } + scroll(e3, t3 = false) { + this._bufferService.scroll(e3, t3); + } + scrollLines(e3, t3, i3) { + this._bufferService.scrollLines(e3, t3, i3); + } + scrollPages(e3) { + this.scrollLines(e3 * (this.rows - 1)); + } + scrollToTop() { + this.scrollLines(-this._bufferService.buffer.ydisp); + } + scrollToBottom() { + this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp); + } + scrollToLine(e3) { + const t3 = e3 - this._bufferService.buffer.ydisp; + 0 !== t3 && this.scrollLines(t3); + } + registerEscHandler(e3, t3) { + return this._inputHandler.registerEscHandler(e3, t3); + } + registerDcsHandler(e3, t3) { + return this._inputHandler.registerDcsHandler(e3, t3); + } + registerCsiHandler(e3, t3) { + return this._inputHandler.registerCsiHandler(e3, t3); + } + registerOscHandler(e3, t3) { + return this._inputHandler.registerOscHandler(e3, t3); + } + _setup() { + this._handleWindowsPtyOptionChange(); + } + reset() { + this._inputHandler.reset(), this._bufferService.reset(), this._charsetService.reset(), this.coreService.reset(), this.coreMouseService.reset(); + } + _handleWindowsPtyOptionChange() { + let e3 = false; + const t3 = this.optionsService.rawOptions.windowsPty; + t3 && void 0 !== t3.buildNumber && void 0 !== t3.buildNumber ? e3 = !!("conpty" === t3.backend && t3.buildNumber < 21376) : this.optionsService.rawOptions.windowsMode && (e3 = true), e3 ? this._enableWindowsWrappingHeuristics() : this._windowsWrappingHeuristics.clear(); + } + _enableWindowsWrappingHeuristics() { + if (!this._windowsWrappingHeuristics.value) { + const e3 = []; + e3.push(this.onLineFeed(f.updateWindowsModeWrappedState.bind(null, this._bufferService))), e3.push(this.registerCsiHandler({ final: "H" }, (() => ((0, f.updateWindowsModeWrappedState)(this._bufferService), false)))), this._windowsWrappingHeuristics.value = (0, s2.toDisposable)((() => { + for (const t3 of e3) t3.dispose(); + })); + } + } + } + t2.CoreTerminal = S; + }, 8460: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.runAndSubscribe = t2.forwardEvent = t2.EventEmitter = void 0, t2.EventEmitter = class { + constructor() { + this._listeners = [], this._disposed = false; + } + get event() { + return this._event || (this._event = (e3) => (this._listeners.push(e3), { dispose: () => { + if (!this._disposed) { + for (let t3 = 0; t3 < this._listeners.length; t3++) if (this._listeners[t3] === e3) return void this._listeners.splice(t3, 1); + } + } })), this._event; + } + fire(e3, t3) { + const i2 = []; + for (let e4 = 0; e4 < this._listeners.length; e4++) i2.push(this._listeners[e4]); + for (let s2 = 0; s2 < i2.length; s2++) i2[s2].call(void 0, e3, t3); + } + dispose() { + this.clearListeners(), this._disposed = true; + } + clearListeners() { + this._listeners && (this._listeners.length = 0); + } + }, t2.forwardEvent = function(e3, t3) { + return e3(((e4) => t3.fire(e4))); + }, t2.runAndSubscribe = function(e3, t3) { + return t3(void 0), e3(((e4) => t3(e4))); + }; + }, 5435: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.InputHandler = t2.WindowsOptionsReportType = void 0; + const n = i2(2584), o = i2(7116), a = i2(2015), h = i2(844), c = i2(482), l = i2(8437), d = i2(8460), _ = i2(643), u = i2(511), f = i2(3734), v = i2(2585), p = i2(1480), g = i2(6242), m = i2(6351), S = i2(5941), C = { "(": 0, ")": 1, "*": 2, "+": 3, "-": 1, ".": 2 }, b = 131072; + function w(e3, t3) { + if (e3 > 24) return t3.setWinLines || false; + switch (e3) { + case 1: + return !!t3.restoreWin; + case 2: + return !!t3.minimizeWin; + case 3: + return !!t3.setWinPosition; + case 4: + return !!t3.setWinSizePixels; + case 5: + return !!t3.raiseWin; + case 6: + return !!t3.lowerWin; + case 7: + return !!t3.refreshWin; + case 8: + return !!t3.setWinSizeChars; + case 9: + return !!t3.maximizeWin; + case 10: + return !!t3.fullscreenWin; + case 11: + return !!t3.getWinState; + case 13: + return !!t3.getWinPosition; + case 14: + return !!t3.getWinSizePixels; + case 15: + return !!t3.getScreenSizePixels; + case 16: + return !!t3.getCellSizePixels; + case 18: + return !!t3.getWinSizeChars; + case 19: + return !!t3.getScreenSizeChars; + case 20: + return !!t3.getIconTitle; + case 21: + return !!t3.getWinTitle; + case 22: + return !!t3.pushTitle; + case 23: + return !!t3.popTitle; + case 24: + return !!t3.setWinLines; + } + return false; + } + var y; + !(function(e3) { + e3[e3.GET_WIN_SIZE_PIXELS = 0] = "GET_WIN_SIZE_PIXELS", e3[e3.GET_CELL_SIZE_PIXELS = 1] = "GET_CELL_SIZE_PIXELS"; + })(y || (t2.WindowsOptionsReportType = y = {})); + let E = 0; + class k extends h.Disposable { + getAttrData() { + return this._curAttrData; + } + constructor(e3, t3, i3, s3, r2, h2, _2, f2, v2 = new a.EscapeSequenceParser()) { + super(), this._bufferService = e3, this._charsetService = t3, this._coreService = i3, this._logService = s3, this._optionsService = r2, this._oscLinkService = h2, this._coreMouseService = _2, this._unicodeService = f2, this._parser = v2, this._parseBuffer = new Uint32Array(4096), this._stringDecoder = new c.StringToUtf32(), this._utf8Decoder = new c.Utf8ToUtf32(), this._workCell = new u.CellData(), this._windowTitle = "", this._iconName = "", this._windowTitleStack = [], this._iconNameStack = [], this._curAttrData = l.DEFAULT_ATTR_DATA.clone(), this._eraseAttrDataInternal = l.DEFAULT_ATTR_DATA.clone(), this._onRequestBell = this.register(new d.EventEmitter()), this.onRequestBell = this._onRequestBell.event, this._onRequestRefreshRows = this.register(new d.EventEmitter()), this.onRequestRefreshRows = this._onRequestRefreshRows.event, this._onRequestReset = this.register(new d.EventEmitter()), this.onRequestReset = this._onRequestReset.event, this._onRequestSendFocus = this.register(new d.EventEmitter()), this.onRequestSendFocus = this._onRequestSendFocus.event, this._onRequestSyncScrollBar = this.register(new d.EventEmitter()), this.onRequestSyncScrollBar = this._onRequestSyncScrollBar.event, this._onRequestWindowsOptionsReport = this.register(new d.EventEmitter()), this.onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event, this._onA11yChar = this.register(new d.EventEmitter()), this.onA11yChar = this._onA11yChar.event, this._onA11yTab = this.register(new d.EventEmitter()), this.onA11yTab = this._onA11yTab.event, this._onCursorMove = this.register(new d.EventEmitter()), this.onCursorMove = this._onCursorMove.event, this._onLineFeed = this.register(new d.EventEmitter()), this.onLineFeed = this._onLineFeed.event, this._onScroll = this.register(new d.EventEmitter()), this.onScroll = this._onScroll.event, this._onTitleChange = this.register(new d.EventEmitter()), this.onTitleChange = this._onTitleChange.event, this._onColor = this.register(new d.EventEmitter()), this.onColor = this._onColor.event, this._parseStack = { paused: false, cursorStartX: 0, cursorStartY: 0, decodedLength: 0, position: 0 }, this._specialColors = [256, 257, 258], this.register(this._parser), this._dirtyRowTracker = new L(this._bufferService), this._activeBuffer = this._bufferService.buffer, this.register(this._bufferService.buffers.onBufferActivate(((e4) => this._activeBuffer = e4.activeBuffer))), this._parser.setCsiHandlerFallback(((e4, t4) => { + this._logService.debug("Unknown CSI code: ", { identifier: this._parser.identToString(e4), params: t4.toArray() }); + })), this._parser.setEscHandlerFallback(((e4) => { + this._logService.debug("Unknown ESC code: ", { identifier: this._parser.identToString(e4) }); + })), this._parser.setExecuteHandlerFallback(((e4) => { + this._logService.debug("Unknown EXECUTE code: ", { code: e4 }); + })), this._parser.setOscHandlerFallback(((e4, t4, i4) => { + this._logService.debug("Unknown OSC code: ", { identifier: e4, action: t4, data: i4 }); + })), this._parser.setDcsHandlerFallback(((e4, t4, i4) => { + "HOOK" === t4 && (i4 = i4.toArray()), this._logService.debug("Unknown DCS code: ", { identifier: this._parser.identToString(e4), action: t4, payload: i4 }); + })), this._parser.setPrintHandler(((e4, t4, i4) => this.print(e4, t4, i4))), this._parser.registerCsiHandler({ final: "@" }, ((e4) => this.insertChars(e4))), this._parser.registerCsiHandler({ intermediates: " ", final: "@" }, ((e4) => this.scrollLeft(e4))), this._parser.registerCsiHandler({ final: "A" }, ((e4) => this.cursorUp(e4))), this._parser.registerCsiHandler({ intermediates: " ", final: "A" }, ((e4) => this.scrollRight(e4))), this._parser.registerCsiHandler({ final: "B" }, ((e4) => this.cursorDown(e4))), this._parser.registerCsiHandler({ final: "C" }, ((e4) => this.cursorForward(e4))), this._parser.registerCsiHandler({ final: "D" }, ((e4) => this.cursorBackward(e4))), this._parser.registerCsiHandler({ final: "E" }, ((e4) => this.cursorNextLine(e4))), this._parser.registerCsiHandler({ final: "F" }, ((e4) => this.cursorPrecedingLine(e4))), this._parser.registerCsiHandler({ final: "G" }, ((e4) => this.cursorCharAbsolute(e4))), this._parser.registerCsiHandler({ final: "H" }, ((e4) => this.cursorPosition(e4))), this._parser.registerCsiHandler({ final: "I" }, ((e4) => this.cursorForwardTab(e4))), this._parser.registerCsiHandler({ final: "J" }, ((e4) => this.eraseInDisplay(e4, false))), this._parser.registerCsiHandler({ prefix: "?", final: "J" }, ((e4) => this.eraseInDisplay(e4, true))), this._parser.registerCsiHandler({ final: "K" }, ((e4) => this.eraseInLine(e4, false))), this._parser.registerCsiHandler({ prefix: "?", final: "K" }, ((e4) => this.eraseInLine(e4, true))), this._parser.registerCsiHandler({ final: "L" }, ((e4) => this.insertLines(e4))), this._parser.registerCsiHandler({ final: "M" }, ((e4) => this.deleteLines(e4))), this._parser.registerCsiHandler({ final: "P" }, ((e4) => this.deleteChars(e4))), this._parser.registerCsiHandler({ final: "S" }, ((e4) => this.scrollUp(e4))), this._parser.registerCsiHandler({ final: "T" }, ((e4) => this.scrollDown(e4))), this._parser.registerCsiHandler({ final: "X" }, ((e4) => this.eraseChars(e4))), this._parser.registerCsiHandler({ final: "Z" }, ((e4) => this.cursorBackwardTab(e4))), this._parser.registerCsiHandler({ final: "`" }, ((e4) => this.charPosAbsolute(e4))), this._parser.registerCsiHandler({ final: "a" }, ((e4) => this.hPositionRelative(e4))), this._parser.registerCsiHandler({ final: "b" }, ((e4) => this.repeatPrecedingCharacter(e4))), this._parser.registerCsiHandler({ final: "c" }, ((e4) => this.sendDeviceAttributesPrimary(e4))), this._parser.registerCsiHandler({ prefix: ">", final: "c" }, ((e4) => this.sendDeviceAttributesSecondary(e4))), this._parser.registerCsiHandler({ final: "d" }, ((e4) => this.linePosAbsolute(e4))), this._parser.registerCsiHandler({ final: "e" }, ((e4) => this.vPositionRelative(e4))), this._parser.registerCsiHandler({ final: "f" }, ((e4) => this.hVPosition(e4))), this._parser.registerCsiHandler({ final: "g" }, ((e4) => this.tabClear(e4))), this._parser.registerCsiHandler({ final: "h" }, ((e4) => this.setMode(e4))), this._parser.registerCsiHandler({ prefix: "?", final: "h" }, ((e4) => this.setModePrivate(e4))), this._parser.registerCsiHandler({ final: "l" }, ((e4) => this.resetMode(e4))), this._parser.registerCsiHandler({ prefix: "?", final: "l" }, ((e4) => this.resetModePrivate(e4))), this._parser.registerCsiHandler({ final: "m" }, ((e4) => this.charAttributes(e4))), this._parser.registerCsiHandler({ final: "n" }, ((e4) => this.deviceStatus(e4))), this._parser.registerCsiHandler({ prefix: "?", final: "n" }, ((e4) => this.deviceStatusPrivate(e4))), this._parser.registerCsiHandler({ intermediates: "!", final: "p" }, ((e4) => this.softReset(e4))), this._parser.registerCsiHandler({ intermediates: " ", final: "q" }, ((e4) => this.setCursorStyle(e4))), this._parser.registerCsiHandler({ final: "r" }, ((e4) => this.setScrollRegion(e4))), this._parser.registerCsiHandler({ final: "s" }, ((e4) => this.saveCursor(e4))), this._parser.registerCsiHandler({ final: "t" }, ((e4) => this.windowOptions(e4))), this._parser.registerCsiHandler({ final: "u" }, ((e4) => this.restoreCursor(e4))), this._parser.registerCsiHandler({ intermediates: "'", final: "}" }, ((e4) => this.insertColumns(e4))), this._parser.registerCsiHandler({ intermediates: "'", final: "~" }, ((e4) => this.deleteColumns(e4))), this._parser.registerCsiHandler({ intermediates: '"', final: "q" }, ((e4) => this.selectProtected(e4))), this._parser.registerCsiHandler({ intermediates: "$", final: "p" }, ((e4) => this.requestMode(e4, true))), this._parser.registerCsiHandler({ prefix: "?", intermediates: "$", final: "p" }, ((e4) => this.requestMode(e4, false))), this._parser.setExecuteHandler(n.C0.BEL, (() => this.bell())), this._parser.setExecuteHandler(n.C0.LF, (() => this.lineFeed())), this._parser.setExecuteHandler(n.C0.VT, (() => this.lineFeed())), this._parser.setExecuteHandler(n.C0.FF, (() => this.lineFeed())), this._parser.setExecuteHandler(n.C0.CR, (() => this.carriageReturn())), this._parser.setExecuteHandler(n.C0.BS, (() => this.backspace())), this._parser.setExecuteHandler(n.C0.HT, (() => this.tab())), this._parser.setExecuteHandler(n.C0.SO, (() => this.shiftOut())), this._parser.setExecuteHandler(n.C0.SI, (() => this.shiftIn())), this._parser.setExecuteHandler(n.C1.IND, (() => this.index())), this._parser.setExecuteHandler(n.C1.NEL, (() => this.nextLine())), this._parser.setExecuteHandler(n.C1.HTS, (() => this.tabSet())), this._parser.registerOscHandler(0, new g.OscHandler(((e4) => (this.setTitle(e4), this.setIconName(e4), true)))), this._parser.registerOscHandler(1, new g.OscHandler(((e4) => this.setIconName(e4)))), this._parser.registerOscHandler(2, new g.OscHandler(((e4) => this.setTitle(e4)))), this._parser.registerOscHandler(4, new g.OscHandler(((e4) => this.setOrReportIndexedColor(e4)))), this._parser.registerOscHandler(8, new g.OscHandler(((e4) => this.setHyperlink(e4)))), this._parser.registerOscHandler(10, new g.OscHandler(((e4) => this.setOrReportFgColor(e4)))), this._parser.registerOscHandler(11, new g.OscHandler(((e4) => this.setOrReportBgColor(e4)))), this._parser.registerOscHandler(12, new g.OscHandler(((e4) => this.setOrReportCursorColor(e4)))), this._parser.registerOscHandler(104, new g.OscHandler(((e4) => this.restoreIndexedColor(e4)))), this._parser.registerOscHandler(110, new g.OscHandler(((e4) => this.restoreFgColor(e4)))), this._parser.registerOscHandler(111, new g.OscHandler(((e4) => this.restoreBgColor(e4)))), this._parser.registerOscHandler(112, new g.OscHandler(((e4) => this.restoreCursorColor(e4)))), this._parser.registerEscHandler({ final: "7" }, (() => this.saveCursor())), this._parser.registerEscHandler({ final: "8" }, (() => this.restoreCursor())), this._parser.registerEscHandler({ final: "D" }, (() => this.index())), this._parser.registerEscHandler({ final: "E" }, (() => this.nextLine())), this._parser.registerEscHandler({ final: "H" }, (() => this.tabSet())), this._parser.registerEscHandler({ final: "M" }, (() => this.reverseIndex())), this._parser.registerEscHandler({ final: "=" }, (() => this.keypadApplicationMode())), this._parser.registerEscHandler({ final: ">" }, (() => this.keypadNumericMode())), this._parser.registerEscHandler({ final: "c" }, (() => this.fullReset())), this._parser.registerEscHandler({ final: "n" }, (() => this.setgLevel(2))), this._parser.registerEscHandler({ final: "o" }, (() => this.setgLevel(3))), this._parser.registerEscHandler({ final: "|" }, (() => this.setgLevel(3))), this._parser.registerEscHandler({ final: "}" }, (() => this.setgLevel(2))), this._parser.registerEscHandler({ final: "~" }, (() => this.setgLevel(1))), this._parser.registerEscHandler({ intermediates: "%", final: "@" }, (() => this.selectDefaultCharset())), this._parser.registerEscHandler({ intermediates: "%", final: "G" }, (() => this.selectDefaultCharset())); + for (const e4 in o.CHARSETS) this._parser.registerEscHandler({ intermediates: "(", final: e4 }, (() => this.selectCharset("(" + e4))), this._parser.registerEscHandler({ intermediates: ")", final: e4 }, (() => this.selectCharset(")" + e4))), this._parser.registerEscHandler({ intermediates: "*", final: e4 }, (() => this.selectCharset("*" + e4))), this._parser.registerEscHandler({ intermediates: "+", final: e4 }, (() => this.selectCharset("+" + e4))), this._parser.registerEscHandler({ intermediates: "-", final: e4 }, (() => this.selectCharset("-" + e4))), this._parser.registerEscHandler({ intermediates: ".", final: e4 }, (() => this.selectCharset("." + e4))), this._parser.registerEscHandler({ intermediates: "/", final: e4 }, (() => this.selectCharset("/" + e4))); + this._parser.registerEscHandler({ intermediates: "#", final: "8" }, (() => this.screenAlignmentPattern())), this._parser.setErrorHandler(((e4) => (this._logService.error("Parsing error: ", e4), e4))), this._parser.registerDcsHandler({ intermediates: "$", final: "q" }, new m.DcsHandler(((e4, t4) => this.requestStatusString(e4, t4)))); + } + _preserveStack(e3, t3, i3, s3) { + this._parseStack.paused = true, this._parseStack.cursorStartX = e3, this._parseStack.cursorStartY = t3, this._parseStack.decodedLength = i3, this._parseStack.position = s3; + } + _logSlowResolvingAsync(e3) { + this._logService.logLevel <= v.LogLevelEnum.WARN && Promise.race([e3, new Promise(((e4, t3) => setTimeout((() => t3("#SLOW_TIMEOUT")), 5e3)))]).catch(((e4) => { + if ("#SLOW_TIMEOUT" !== e4) throw e4; + console.warn("async parser handler taking longer than 5000 ms"); + })); + } + _getCurrentLinkId() { + return this._curAttrData.extended.urlId; + } + parse(e3, t3) { + let i3, s3 = this._activeBuffer.x, r2 = this._activeBuffer.y, n2 = 0; + const o2 = this._parseStack.paused; + if (o2) { + if (i3 = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, t3)) return this._logSlowResolvingAsync(i3), i3; + s3 = this._parseStack.cursorStartX, r2 = this._parseStack.cursorStartY, this._parseStack.paused = false, e3.length > b && (n2 = this._parseStack.position + b); + } + if (this._logService.logLevel <= v.LogLevelEnum.DEBUG && this._logService.debug("parsing data" + ("string" == typeof e3 ? ` "${e3}"` : ` "${Array.prototype.map.call(e3, ((e4) => String.fromCharCode(e4))).join("")}"`), "string" == typeof e3 ? e3.split("").map(((e4) => e4.charCodeAt(0))) : e3), this._parseBuffer.length < e3.length && this._parseBuffer.length < b && (this._parseBuffer = new Uint32Array(Math.min(e3.length, b))), o2 || this._dirtyRowTracker.clearRange(), e3.length > b) for (let t4 = n2; t4 < e3.length; t4 += b) { + const n3 = t4 + b < e3.length ? t4 + b : e3.length, o3 = "string" == typeof e3 ? this._stringDecoder.decode(e3.substring(t4, n3), this._parseBuffer) : this._utf8Decoder.decode(e3.subarray(t4, n3), this._parseBuffer); + if (i3 = this._parser.parse(this._parseBuffer, o3)) return this._preserveStack(s3, r2, o3, t4), this._logSlowResolvingAsync(i3), i3; + } + else if (!o2) { + const t4 = "string" == typeof e3 ? this._stringDecoder.decode(e3, this._parseBuffer) : this._utf8Decoder.decode(e3, this._parseBuffer); + if (i3 = this._parser.parse(this._parseBuffer, t4)) return this._preserveStack(s3, r2, t4, 0), this._logSlowResolvingAsync(i3), i3; + } + this._activeBuffer.x === s3 && this._activeBuffer.y === r2 || this._onCursorMove.fire(); + const a2 = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp), h2 = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp); + h2 < this._bufferService.rows && this._onRequestRefreshRows.fire(Math.min(h2, this._bufferService.rows - 1), Math.min(a2, this._bufferService.rows - 1)); + } + print(e3, t3, i3) { + let s3, r2; + const n2 = this._charsetService.charset, o2 = this._optionsService.rawOptions.screenReaderMode, a2 = this._bufferService.cols, h2 = this._coreService.decPrivateModes.wraparound, d2 = this._coreService.modes.insertMode, u2 = this._curAttrData; + let f2 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y); + this._dirtyRowTracker.markDirty(this._activeBuffer.y), this._activeBuffer.x && i3 - t3 > 0 && 2 === f2.getWidth(this._activeBuffer.x - 1) && f2.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, u2); + let v2 = this._parser.precedingJoinState; + for (let g2 = t3; g2 < i3; ++g2) { + if (s3 = e3[g2], s3 < 127 && n2) { + const e4 = n2[String.fromCharCode(s3)]; + e4 && (s3 = e4.charCodeAt(0)); + } + const t4 = this._unicodeService.charProperties(s3, v2); + r2 = p.UnicodeService.extractWidth(t4); + const i4 = p.UnicodeService.extractShouldJoin(t4), m2 = i4 ? p.UnicodeService.extractWidth(v2) : 0; + if (v2 = t4, o2 && this._onA11yChar.fire((0, c.stringFromCodePoint)(s3)), this._getCurrentLinkId() && this._oscLinkService.addLineToLink(this._getCurrentLinkId(), this._activeBuffer.ybase + this._activeBuffer.y), this._activeBuffer.x + r2 - m2 > a2) { + if (h2) { + const e4 = f2; + let t5 = this._activeBuffer.x - m2; + for (this._activeBuffer.x = m2, this._activeBuffer.y++, this._activeBuffer.y === this._activeBuffer.scrollBottom + 1 ? (this._activeBuffer.y--, this._bufferService.scroll(this._eraseAttrData(), true)) : (this._activeBuffer.y >= this._bufferService.rows && (this._activeBuffer.y = this._bufferService.rows - 1), this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y).isWrapped = true), f2 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y), m2 > 0 && f2 instanceof l.BufferLine && f2.copyCellsFrom(e4, t5, 0, m2, false); t5 < a2; ) e4.setCellFromCodepoint(t5++, 0, 1, u2); + } else if (this._activeBuffer.x = a2 - 1, 2 === r2) continue; + } + if (i4 && this._activeBuffer.x) { + const e4 = f2.getWidth(this._activeBuffer.x - 1) ? 1 : 2; + f2.addCodepointToCell(this._activeBuffer.x - e4, s3, r2); + for (let e5 = r2 - m2; --e5 >= 0; ) f2.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, u2); + } else if (d2 && (f2.insertCells(this._activeBuffer.x, r2 - m2, this._activeBuffer.getNullCell(u2)), 2 === f2.getWidth(a2 - 1) && f2.setCellFromCodepoint(a2 - 1, _.NULL_CELL_CODE, _.NULL_CELL_WIDTH, u2)), f2.setCellFromCodepoint(this._activeBuffer.x++, s3, r2, u2), r2 > 0) for (; --r2; ) f2.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, u2); + } + this._parser.precedingJoinState = v2, this._activeBuffer.x < a2 && i3 - t3 > 0 && 0 === f2.getWidth(this._activeBuffer.x) && !f2.hasContent(this._activeBuffer.x) && f2.setCellFromCodepoint(this._activeBuffer.x, 0, 1, u2), this._dirtyRowTracker.markDirty(this._activeBuffer.y); + } + registerCsiHandler(e3, t3) { + return "t" !== e3.final || e3.prefix || e3.intermediates ? this._parser.registerCsiHandler(e3, t3) : this._parser.registerCsiHandler(e3, ((e4) => !w(e4.params[0], this._optionsService.rawOptions.windowOptions) || t3(e4))); + } + registerDcsHandler(e3, t3) { + return this._parser.registerDcsHandler(e3, new m.DcsHandler(t3)); + } + registerEscHandler(e3, t3) { + return this._parser.registerEscHandler(e3, t3); + } + registerOscHandler(e3, t3) { + return this._parser.registerOscHandler(e3, new g.OscHandler(t3)); + } + bell() { + return this._onRequestBell.fire(), true; + } + lineFeed() { + return this._dirtyRowTracker.markDirty(this._activeBuffer.y), this._optionsService.rawOptions.convertEol && (this._activeBuffer.x = 0), this._activeBuffer.y++, this._activeBuffer.y === this._activeBuffer.scrollBottom + 1 ? (this._activeBuffer.y--, this._bufferService.scroll(this._eraseAttrData())) : this._activeBuffer.y >= this._bufferService.rows ? this._activeBuffer.y = this._bufferService.rows - 1 : this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y).isWrapped = false, this._activeBuffer.x >= this._bufferService.cols && this._activeBuffer.x--, this._dirtyRowTracker.markDirty(this._activeBuffer.y), this._onLineFeed.fire(), true; + } + carriageReturn() { + return this._activeBuffer.x = 0, true; + } + backspace() { + var _a; + if (!this._coreService.decPrivateModes.reverseWraparound) return this._restrictCursor(), this._activeBuffer.x > 0 && this._activeBuffer.x--, true; + if (this._restrictCursor(this._bufferService.cols), this._activeBuffer.x > 0) this._activeBuffer.x--; + else if (0 === this._activeBuffer.x && this._activeBuffer.y > this._activeBuffer.scrollTop && this._activeBuffer.y <= this._activeBuffer.scrollBottom && ((_a = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)) == null ? void 0 : _a.isWrapped)) { + this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y).isWrapped = false, this._activeBuffer.y--, this._activeBuffer.x = this._bufferService.cols - 1; + const e3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y); + e3.hasWidth(this._activeBuffer.x) && !e3.hasContent(this._activeBuffer.x) && this._activeBuffer.x--; + } + return this._restrictCursor(), true; + } + tab() { + if (this._activeBuffer.x >= this._bufferService.cols) return true; + const e3 = this._activeBuffer.x; + return this._activeBuffer.x = this._activeBuffer.nextStop(), this._optionsService.rawOptions.screenReaderMode && this._onA11yTab.fire(this._activeBuffer.x - e3), true; + } + shiftOut() { + return this._charsetService.setgLevel(1), true; + } + shiftIn() { + return this._charsetService.setgLevel(0), true; + } + _restrictCursor(e3 = this._bufferService.cols - 1) { + this._activeBuffer.x = Math.min(e3, Math.max(0, this._activeBuffer.x)), this._activeBuffer.y = this._coreService.decPrivateModes.origin ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y)) : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y)), this._dirtyRowTracker.markDirty(this._activeBuffer.y); + } + _setCursor(e3, t3) { + this._dirtyRowTracker.markDirty(this._activeBuffer.y), this._coreService.decPrivateModes.origin ? (this._activeBuffer.x = e3, this._activeBuffer.y = this._activeBuffer.scrollTop + t3) : (this._activeBuffer.x = e3, this._activeBuffer.y = t3), this._restrictCursor(), this._dirtyRowTracker.markDirty(this._activeBuffer.y); + } + _moveCursor(e3, t3) { + this._restrictCursor(), this._setCursor(this._activeBuffer.x + e3, this._activeBuffer.y + t3); + } + cursorUp(e3) { + const t3 = this._activeBuffer.y - this._activeBuffer.scrollTop; + return t3 >= 0 ? this._moveCursor(0, -Math.min(t3, e3.params[0] || 1)) : this._moveCursor(0, -(e3.params[0] || 1)), true; + } + cursorDown(e3) { + const t3 = this._activeBuffer.scrollBottom - this._activeBuffer.y; + return t3 >= 0 ? this._moveCursor(0, Math.min(t3, e3.params[0] || 1)) : this._moveCursor(0, e3.params[0] || 1), true; + } + cursorForward(e3) { + return this._moveCursor(e3.params[0] || 1, 0), true; + } + cursorBackward(e3) { + return this._moveCursor(-(e3.params[0] || 1), 0), true; + } + cursorNextLine(e3) { + return this.cursorDown(e3), this._activeBuffer.x = 0, true; + } + cursorPrecedingLine(e3) { + return this.cursorUp(e3), this._activeBuffer.x = 0, true; + } + cursorCharAbsolute(e3) { + return this._setCursor((e3.params[0] || 1) - 1, this._activeBuffer.y), true; + } + cursorPosition(e3) { + return this._setCursor(e3.length >= 2 ? (e3.params[1] || 1) - 1 : 0, (e3.params[0] || 1) - 1), true; + } + charPosAbsolute(e3) { + return this._setCursor((e3.params[0] || 1) - 1, this._activeBuffer.y), true; + } + hPositionRelative(e3) { + return this._moveCursor(e3.params[0] || 1, 0), true; + } + linePosAbsolute(e3) { + return this._setCursor(this._activeBuffer.x, (e3.params[0] || 1) - 1), true; + } + vPositionRelative(e3) { + return this._moveCursor(0, e3.params[0] || 1), true; + } + hVPosition(e3) { + return this.cursorPosition(e3), true; + } + tabClear(e3) { + const t3 = e3.params[0]; + return 0 === t3 ? delete this._activeBuffer.tabs[this._activeBuffer.x] : 3 === t3 && (this._activeBuffer.tabs = {}), true; + } + cursorForwardTab(e3) { + if (this._activeBuffer.x >= this._bufferService.cols) return true; + let t3 = e3.params[0] || 1; + for (; t3--; ) this._activeBuffer.x = this._activeBuffer.nextStop(); + return true; + } + cursorBackwardTab(e3) { + if (this._activeBuffer.x >= this._bufferService.cols) return true; + let t3 = e3.params[0] || 1; + for (; t3--; ) this._activeBuffer.x = this._activeBuffer.prevStop(); + return true; + } + selectProtected(e3) { + const t3 = e3.params[0]; + return 1 === t3 && (this._curAttrData.bg |= 536870912), 2 !== t3 && 0 !== t3 || (this._curAttrData.bg &= -536870913), true; + } + _eraseInBufferLine(e3, t3, i3, s3 = false, r2 = false) { + const n2 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e3); + n2.replaceCells(t3, i3, this._activeBuffer.getNullCell(this._eraseAttrData()), r2), s3 && (n2.isWrapped = false); + } + _resetBufferLine(e3, t3 = false) { + const i3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e3); + i3 && (i3.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), t3), this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + e3), i3.isWrapped = false); + } + eraseInDisplay(e3, t3 = false) { + let i3; + switch (this._restrictCursor(this._bufferService.cols), e3.params[0]) { + case 0: + for (i3 = this._activeBuffer.y, this._dirtyRowTracker.markDirty(i3), this._eraseInBufferLine(i3++, this._activeBuffer.x, this._bufferService.cols, 0 === this._activeBuffer.x, t3); i3 < this._bufferService.rows; i3++) this._resetBufferLine(i3, t3); + this._dirtyRowTracker.markDirty(i3); + break; + case 1: + for (i3 = this._activeBuffer.y, this._dirtyRowTracker.markDirty(i3), this._eraseInBufferLine(i3, 0, this._activeBuffer.x + 1, true, t3), this._activeBuffer.x + 1 >= this._bufferService.cols && (this._activeBuffer.lines.get(i3 + 1).isWrapped = false); i3--; ) this._resetBufferLine(i3, t3); + this._dirtyRowTracker.markDirty(0); + break; + case 2: + for (i3 = this._bufferService.rows, this._dirtyRowTracker.markDirty(i3 - 1); i3--; ) this._resetBufferLine(i3, t3); + this._dirtyRowTracker.markDirty(0); + break; + case 3: + const e4 = this._activeBuffer.lines.length - this._bufferService.rows; + e4 > 0 && (this._activeBuffer.lines.trimStart(e4), this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - e4, 0), this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - e4, 0), this._onScroll.fire(0)); + } + return true; + } + eraseInLine(e3, t3 = false) { + switch (this._restrictCursor(this._bufferService.cols), e3.params[0]) { + case 0: + this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, 0 === this._activeBuffer.x, t3); + break; + case 1: + this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, t3); + break; + case 2: + this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, t3); + } + return this._dirtyRowTracker.markDirty(this._activeBuffer.y), true; + } + insertLines(e3) { + this._restrictCursor(); + let t3 = e3.params[0] || 1; + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const i3 = this._activeBuffer.ybase + this._activeBuffer.y, s3 = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom, r2 = this._bufferService.rows - 1 + this._activeBuffer.ybase - s3 + 1; + for (; t3--; ) this._activeBuffer.lines.splice(r2 - 1, 1), this._activeBuffer.lines.splice(i3, 0, this._activeBuffer.getBlankLine(this._eraseAttrData())); + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom), this._activeBuffer.x = 0, true; + } + deleteLines(e3) { + this._restrictCursor(); + let t3 = e3.params[0] || 1; + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const i3 = this._activeBuffer.ybase + this._activeBuffer.y; + let s3; + for (s3 = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom, s3 = this._bufferService.rows - 1 + this._activeBuffer.ybase - s3; t3--; ) this._activeBuffer.lines.splice(i3, 1), this._activeBuffer.lines.splice(s3, 0, this._activeBuffer.getBlankLine(this._eraseAttrData())); + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom), this._activeBuffer.x = 0, true; + } + insertChars(e3) { + this._restrictCursor(); + const t3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y); + return t3 && (t3.insertCells(this._activeBuffer.x, e3.params[0] || 1, this._activeBuffer.getNullCell(this._eraseAttrData())), this._dirtyRowTracker.markDirty(this._activeBuffer.y)), true; + } + deleteChars(e3) { + this._restrictCursor(); + const t3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y); + return t3 && (t3.deleteCells(this._activeBuffer.x, e3.params[0] || 1, this._activeBuffer.getNullCell(this._eraseAttrData())), this._dirtyRowTracker.markDirty(this._activeBuffer.y)), true; + } + scrollUp(e3) { + let t3 = e3.params[0] || 1; + for (; t3--; ) this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1), this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData())); + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + scrollDown(e3) { + let t3 = e3.params[0] || 1; + for (; t3--; ) this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1), this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(l.DEFAULT_ATTR_DATA)); + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + scrollLeft(e3) { + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const t3 = e3.params[0] || 1; + for (let e4 = this._activeBuffer.scrollTop; e4 <= this._activeBuffer.scrollBottom; ++e4) { + const i3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e4); + i3.deleteCells(0, t3, this._activeBuffer.getNullCell(this._eraseAttrData())), i3.isWrapped = false; + } + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + scrollRight(e3) { + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const t3 = e3.params[0] || 1; + for (let e4 = this._activeBuffer.scrollTop; e4 <= this._activeBuffer.scrollBottom; ++e4) { + const i3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e4); + i3.insertCells(0, t3, this._activeBuffer.getNullCell(this._eraseAttrData())), i3.isWrapped = false; + } + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + insertColumns(e3) { + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const t3 = e3.params[0] || 1; + for (let e4 = this._activeBuffer.scrollTop; e4 <= this._activeBuffer.scrollBottom; ++e4) { + const i3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e4); + i3.insertCells(this._activeBuffer.x, t3, this._activeBuffer.getNullCell(this._eraseAttrData())), i3.isWrapped = false; + } + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + deleteColumns(e3) { + if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) return true; + const t3 = e3.params[0] || 1; + for (let e4 = this._activeBuffer.scrollTop; e4 <= this._activeBuffer.scrollBottom; ++e4) { + const i3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + e4); + i3.deleteCells(this._activeBuffer.x, t3, this._activeBuffer.getNullCell(this._eraseAttrData())), i3.isWrapped = false; + } + return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom), true; + } + eraseChars(e3) { + this._restrictCursor(); + const t3 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y); + return t3 && (t3.replaceCells(this._activeBuffer.x, this._activeBuffer.x + (e3.params[0] || 1), this._activeBuffer.getNullCell(this._eraseAttrData())), this._dirtyRowTracker.markDirty(this._activeBuffer.y)), true; + } + repeatPrecedingCharacter(e3) { + const t3 = this._parser.precedingJoinState; + if (!t3) return true; + const i3 = e3.params[0] || 1, s3 = p.UnicodeService.extractWidth(t3), r2 = this._activeBuffer.x - s3, n2 = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y).getString(r2), o2 = new Uint32Array(n2.length * i3); + let a2 = 0; + for (let e4 = 0; e4 < n2.length; ) { + const t4 = n2.codePointAt(e4) || 0; + o2[a2++] = t4, e4 += t4 > 65535 ? 2 : 1; + } + let h2 = a2; + for (let e4 = 1; e4 < i3; ++e4) o2.copyWithin(h2, 0, a2), h2 += a2; + return this.print(o2, 0, h2), true; + } + sendDeviceAttributesPrimary(e3) { + return e3.params[0] > 0 || (this._is("xterm") || this._is("rxvt-unicode") || this._is("screen") ? this._coreService.triggerDataEvent(n.C0.ESC + "[?1;2c") : this._is("linux") && this._coreService.triggerDataEvent(n.C0.ESC + "[?6c")), true; + } + sendDeviceAttributesSecondary(e3) { + return e3.params[0] > 0 || (this._is("xterm") ? this._coreService.triggerDataEvent(n.C0.ESC + "[>0;276;0c") : this._is("rxvt-unicode") ? this._coreService.triggerDataEvent(n.C0.ESC + "[>85;95;0c") : this._is("linux") ? this._coreService.triggerDataEvent(e3.params[0] + "c") : this._is("screen") && this._coreService.triggerDataEvent(n.C0.ESC + "[>83;40003;0c")), true; + } + _is(e3) { + return 0 === (this._optionsService.rawOptions.termName + "").indexOf(e3); + } + setMode(e3) { + for (let t3 = 0; t3 < e3.length; t3++) switch (e3.params[t3]) { + case 4: + this._coreService.modes.insertMode = true; + break; + case 20: + this._optionsService.options.convertEol = true; + } + return true; + } + setModePrivate(e3) { + for (let t3 = 0; t3 < e3.length; t3++) switch (e3.params[t3]) { + case 1: + this._coreService.decPrivateModes.applicationCursorKeys = true; + break; + case 2: + this._charsetService.setgCharset(0, o.DEFAULT_CHARSET), this._charsetService.setgCharset(1, o.DEFAULT_CHARSET), this._charsetService.setgCharset(2, o.DEFAULT_CHARSET), this._charsetService.setgCharset(3, o.DEFAULT_CHARSET); + break; + case 3: + this._optionsService.rawOptions.windowOptions.setWinLines && (this._bufferService.resize(132, this._bufferService.rows), this._onRequestReset.fire()); + break; + case 6: + this._coreService.decPrivateModes.origin = true, this._setCursor(0, 0); + break; + case 7: + this._coreService.decPrivateModes.wraparound = true; + break; + case 12: + this._optionsService.options.cursorBlink = true; + break; + case 45: + this._coreService.decPrivateModes.reverseWraparound = true; + break; + case 66: + this._logService.debug("Serial port requested application keypad."), this._coreService.decPrivateModes.applicationKeypad = true, this._onRequestSyncScrollBar.fire(); + break; + case 9: + this._coreMouseService.activeProtocol = "X10"; + break; + case 1e3: + this._coreMouseService.activeProtocol = "VT200"; + break; + case 1002: + this._coreMouseService.activeProtocol = "DRAG"; + break; + case 1003: + this._coreMouseService.activeProtocol = "ANY"; + break; + case 1004: + this._coreService.decPrivateModes.sendFocus = true, this._onRequestSendFocus.fire(); + break; + case 1005: + this._logService.debug("DECSET 1005 not supported (see #2507)"); + break; + case 1006: + this._coreMouseService.activeEncoding = "SGR"; + break; + case 1015: + this._logService.debug("DECSET 1015 not supported (see #2507)"); + break; + case 1016: + this._coreMouseService.activeEncoding = "SGR_PIXELS"; + break; + case 25: + this._coreService.isCursorHidden = false; + break; + case 1048: + this.saveCursor(); + break; + case 1049: + this.saveCursor(); + case 47: + case 1047: + this._bufferService.buffers.activateAltBuffer(this._eraseAttrData()), this._coreService.isCursorInitialized = true, this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1), this._onRequestSyncScrollBar.fire(); + break; + case 2004: + this._coreService.decPrivateModes.bracketedPasteMode = true; + } + return true; + } + resetMode(e3) { + for (let t3 = 0; t3 < e3.length; t3++) switch (e3.params[t3]) { + case 4: + this._coreService.modes.insertMode = false; + break; + case 20: + this._optionsService.options.convertEol = false; + } + return true; + } + resetModePrivate(e3) { + for (let t3 = 0; t3 < e3.length; t3++) switch (e3.params[t3]) { + case 1: + this._coreService.decPrivateModes.applicationCursorKeys = false; + break; + case 3: + this._optionsService.rawOptions.windowOptions.setWinLines && (this._bufferService.resize(80, this._bufferService.rows), this._onRequestReset.fire()); + break; + case 6: + this._coreService.decPrivateModes.origin = false, this._setCursor(0, 0); + break; + case 7: + this._coreService.decPrivateModes.wraparound = false; + break; + case 12: + this._optionsService.options.cursorBlink = false; + break; + case 45: + this._coreService.decPrivateModes.reverseWraparound = false; + break; + case 66: + this._logService.debug("Switching back to normal keypad."), this._coreService.decPrivateModes.applicationKeypad = false, this._onRequestSyncScrollBar.fire(); + break; + case 9: + case 1e3: + case 1002: + case 1003: + this._coreMouseService.activeProtocol = "NONE"; + break; + case 1004: + this._coreService.decPrivateModes.sendFocus = false; + break; + case 1005: + this._logService.debug("DECRST 1005 not supported (see #2507)"); + break; + case 1006: + case 1016: + this._coreMouseService.activeEncoding = "DEFAULT"; + break; + case 1015: + this._logService.debug("DECRST 1015 not supported (see #2507)"); + break; + case 25: + this._coreService.isCursorHidden = true; + break; + case 1048: + this.restoreCursor(); + break; + case 1049: + case 47: + case 1047: + this._bufferService.buffers.activateNormalBuffer(), 1049 === e3.params[t3] && this.restoreCursor(), this._coreService.isCursorInitialized = true, this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1), this._onRequestSyncScrollBar.fire(); + break; + case 2004: + this._coreService.decPrivateModes.bracketedPasteMode = false; + } + return true; + } + requestMode(e3, t3) { + const i3 = this._coreService.decPrivateModes, { activeProtocol: s3, activeEncoding: r2 } = this._coreMouseService, o2 = this._coreService, { buffers: a2, cols: h2 } = this._bufferService, { active: c2, alt: l2 } = a2, d2 = this._optionsService.rawOptions, _2 = (e4) => e4 ? 1 : 2, u2 = e3.params[0]; + return f2 = u2, v2 = t3 ? 2 === u2 ? 4 : 4 === u2 ? _2(o2.modes.insertMode) : 12 === u2 ? 3 : 20 === u2 ? _2(d2.convertEol) : 0 : 1 === u2 ? _2(i3.applicationCursorKeys) : 3 === u2 ? d2.windowOptions.setWinLines ? 80 === h2 ? 2 : 132 === h2 ? 1 : 0 : 0 : 6 === u2 ? _2(i3.origin) : 7 === u2 ? _2(i3.wraparound) : 8 === u2 ? 3 : 9 === u2 ? _2("X10" === s3) : 12 === u2 ? _2(d2.cursorBlink) : 25 === u2 ? _2(!o2.isCursorHidden) : 45 === u2 ? _2(i3.reverseWraparound) : 66 === u2 ? _2(i3.applicationKeypad) : 67 === u2 ? 4 : 1e3 === u2 ? _2("VT200" === s3) : 1002 === u2 ? _2("DRAG" === s3) : 1003 === u2 ? _2("ANY" === s3) : 1004 === u2 ? _2(i3.sendFocus) : 1005 === u2 ? 4 : 1006 === u2 ? _2("SGR" === r2) : 1015 === u2 ? 4 : 1016 === u2 ? _2("SGR_PIXELS" === r2) : 1048 === u2 ? 1 : 47 === u2 || 1047 === u2 || 1049 === u2 ? _2(c2 === l2) : 2004 === u2 ? _2(i3.bracketedPasteMode) : 0, o2.triggerDataEvent(`${n.C0.ESC}[${t3 ? "" : "?"}${f2};${v2}$y`), true; + var f2, v2; + } + _updateAttrColor(e3, t3, i3, s3, r2) { + return 2 === t3 ? (e3 |= 50331648, e3 &= -16777216, e3 |= f.AttributeData.fromColorRGB([i3, s3, r2])) : 5 === t3 && (e3 &= -50331904, e3 |= 33554432 | 255 & i3), e3; + } + _extractColor(e3, t3, i3) { + const s3 = [0, 0, -1, 0, 0, 0]; + let r2 = 0, n2 = 0; + do { + if (s3[n2 + r2] = e3.params[t3 + n2], e3.hasSubParams(t3 + n2)) { + const i4 = e3.getSubParams(t3 + n2); + let o2 = 0; + do { + 5 === s3[1] && (r2 = 1), s3[n2 + o2 + 1 + r2] = i4[o2]; + } while (++o2 < i4.length && o2 + n2 + 1 + r2 < s3.length); + break; + } + if (5 === s3[1] && n2 + r2 >= 2 || 2 === s3[1] && n2 + r2 >= 5) break; + s3[1] && (r2 = 1); + } while (++n2 + t3 < e3.length && n2 + r2 < s3.length); + for (let e4 = 2; e4 < s3.length; ++e4) -1 === s3[e4] && (s3[e4] = 0); + switch (s3[0]) { + case 38: + i3.fg = this._updateAttrColor(i3.fg, s3[1], s3[3], s3[4], s3[5]); + break; + case 48: + i3.bg = this._updateAttrColor(i3.bg, s3[1], s3[3], s3[4], s3[5]); + break; + case 58: + i3.extended = i3.extended.clone(), i3.extended.underlineColor = this._updateAttrColor(i3.extended.underlineColor, s3[1], s3[3], s3[4], s3[5]); + } + return n2; + } + _processUnderline(e3, t3) { + t3.extended = t3.extended.clone(), (!~e3 || e3 > 5) && (e3 = 1), t3.extended.underlineStyle = e3, t3.fg |= 268435456, 0 === e3 && (t3.fg &= -268435457), t3.updateExtended(); + } + _processSGR0(e3) { + e3.fg = l.DEFAULT_ATTR_DATA.fg, e3.bg = l.DEFAULT_ATTR_DATA.bg, e3.extended = e3.extended.clone(), e3.extended.underlineStyle = 0, e3.extended.underlineColor &= -67108864, e3.updateExtended(); + } + charAttributes(e3) { + if (1 === e3.length && 0 === e3.params[0]) return this._processSGR0(this._curAttrData), true; + const t3 = e3.length; + let i3; + const s3 = this._curAttrData; + for (let r2 = 0; r2 < t3; r2++) i3 = e3.params[r2], i3 >= 30 && i3 <= 37 ? (s3.fg &= -50331904, s3.fg |= 16777216 | i3 - 30) : i3 >= 40 && i3 <= 47 ? (s3.bg &= -50331904, s3.bg |= 16777216 | i3 - 40) : i3 >= 90 && i3 <= 97 ? (s3.fg &= -50331904, s3.fg |= 16777224 | i3 - 90) : i3 >= 100 && i3 <= 107 ? (s3.bg &= -50331904, s3.bg |= 16777224 | i3 - 100) : 0 === i3 ? this._processSGR0(s3) : 1 === i3 ? s3.fg |= 134217728 : 3 === i3 ? s3.bg |= 67108864 : 4 === i3 ? (s3.fg |= 268435456, this._processUnderline(e3.hasSubParams(r2) ? e3.getSubParams(r2)[0] : 1, s3)) : 5 === i3 ? s3.fg |= 536870912 : 7 === i3 ? s3.fg |= 67108864 : 8 === i3 ? s3.fg |= 1073741824 : 9 === i3 ? s3.fg |= 2147483648 : 2 === i3 ? s3.bg |= 134217728 : 21 === i3 ? this._processUnderline(2, s3) : 22 === i3 ? (s3.fg &= -134217729, s3.bg &= -134217729) : 23 === i3 ? s3.bg &= -67108865 : 24 === i3 ? (s3.fg &= -268435457, this._processUnderline(0, s3)) : 25 === i3 ? s3.fg &= -536870913 : 27 === i3 ? s3.fg &= -67108865 : 28 === i3 ? s3.fg &= -1073741825 : 29 === i3 ? s3.fg &= 2147483647 : 39 === i3 ? (s3.fg &= -67108864, s3.fg |= 16777215 & l.DEFAULT_ATTR_DATA.fg) : 49 === i3 ? (s3.bg &= -67108864, s3.bg |= 16777215 & l.DEFAULT_ATTR_DATA.bg) : 38 === i3 || 48 === i3 || 58 === i3 ? r2 += this._extractColor(e3, r2, s3) : 53 === i3 ? s3.bg |= 1073741824 : 55 === i3 ? s3.bg &= -1073741825 : 59 === i3 ? (s3.extended = s3.extended.clone(), s3.extended.underlineColor = -1, s3.updateExtended()) : 100 === i3 ? (s3.fg &= -67108864, s3.fg |= 16777215 & l.DEFAULT_ATTR_DATA.fg, s3.bg &= -67108864, s3.bg |= 16777215 & l.DEFAULT_ATTR_DATA.bg) : this._logService.debug("Unknown SGR attribute: %d.", i3); + return true; + } + deviceStatus(e3) { + switch (e3.params[0]) { + case 5: + this._coreService.triggerDataEvent(`${n.C0.ESC}[0n`); + break; + case 6: + const e4 = this._activeBuffer.y + 1, t3 = this._activeBuffer.x + 1; + this._coreService.triggerDataEvent(`${n.C0.ESC}[${e4};${t3}R`); + } + return true; + } + deviceStatusPrivate(e3) { + if (6 === e3.params[0]) { + const e4 = this._activeBuffer.y + 1, t3 = this._activeBuffer.x + 1; + this._coreService.triggerDataEvent(`${n.C0.ESC}[?${e4};${t3}R`); + } + return true; + } + softReset(e3) { + return this._coreService.isCursorHidden = false, this._onRequestSyncScrollBar.fire(), this._activeBuffer.scrollTop = 0, this._activeBuffer.scrollBottom = this._bufferService.rows - 1, this._curAttrData = l.DEFAULT_ATTR_DATA.clone(), this._coreService.reset(), this._charsetService.reset(), this._activeBuffer.savedX = 0, this._activeBuffer.savedY = this._activeBuffer.ybase, this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg, this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg, this._activeBuffer.savedCharset = this._charsetService.charset, this._coreService.decPrivateModes.origin = false, true; + } + setCursorStyle(e3) { + const t3 = e3.params[0] || 1; + switch (t3) { + case 1: + case 2: + this._optionsService.options.cursorStyle = "block"; + break; + case 3: + case 4: + this._optionsService.options.cursorStyle = "underline"; + break; + case 5: + case 6: + this._optionsService.options.cursorStyle = "bar"; + } + const i3 = t3 % 2 == 1; + return this._optionsService.options.cursorBlink = i3, true; + } + setScrollRegion(e3) { + const t3 = e3.params[0] || 1; + let i3; + return (e3.length < 2 || (i3 = e3.params[1]) > this._bufferService.rows || 0 === i3) && (i3 = this._bufferService.rows), i3 > t3 && (this._activeBuffer.scrollTop = t3 - 1, this._activeBuffer.scrollBottom = i3 - 1, this._setCursor(0, 0)), true; + } + windowOptions(e3) { + if (!w(e3.params[0], this._optionsService.rawOptions.windowOptions)) return true; + const t3 = e3.length > 1 ? e3.params[1] : 0; + switch (e3.params[0]) { + case 14: + 2 !== t3 && this._onRequestWindowsOptionsReport.fire(y.GET_WIN_SIZE_PIXELS); + break; + case 16: + this._onRequestWindowsOptionsReport.fire(y.GET_CELL_SIZE_PIXELS); + break; + case 18: + this._bufferService && this._coreService.triggerDataEvent(`${n.C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`); + break; + case 22: + 0 !== t3 && 2 !== t3 || (this._windowTitleStack.push(this._windowTitle), this._windowTitleStack.length > 10 && this._windowTitleStack.shift()), 0 !== t3 && 1 !== t3 || (this._iconNameStack.push(this._iconName), this._iconNameStack.length > 10 && this._iconNameStack.shift()); + break; + case 23: + 0 !== t3 && 2 !== t3 || this._windowTitleStack.length && this.setTitle(this._windowTitleStack.pop()), 0 !== t3 && 1 !== t3 || this._iconNameStack.length && this.setIconName(this._iconNameStack.pop()); + } + return true; + } + saveCursor(e3) { + return this._activeBuffer.savedX = this._activeBuffer.x, this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg, this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg, this._activeBuffer.savedCharset = this._charsetService.charset, true; + } + restoreCursor(e3) { + return this._activeBuffer.x = this._activeBuffer.savedX || 0, this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0), this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg, this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg, this._charsetService.charset = this._savedCharset, this._activeBuffer.savedCharset && (this._charsetService.charset = this._activeBuffer.savedCharset), this._restrictCursor(), true; + } + setTitle(e3) { + return this._windowTitle = e3, this._onTitleChange.fire(e3), true; + } + setIconName(e3) { + return this._iconName = e3, true; + } + setOrReportIndexedColor(e3) { + const t3 = [], i3 = e3.split(";"); + for (; i3.length > 1; ) { + const e4 = i3.shift(), s3 = i3.shift(); + if (/^\d+$/.exec(e4)) { + const i4 = parseInt(e4); + if (D(i4)) if ("?" === s3) t3.push({ type: 0, index: i4 }); + else { + const e5 = (0, S.parseColor)(s3); + e5 && t3.push({ type: 1, index: i4, color: e5 }); + } + } + } + return t3.length && this._onColor.fire(t3), true; + } + setHyperlink(e3) { + const t3 = e3.split(";"); + return !(t3.length < 2) && (t3[1] ? this._createHyperlink(t3[0], t3[1]) : !t3[0] && this._finishHyperlink()); + } + _createHyperlink(e3, t3) { + this._getCurrentLinkId() && this._finishHyperlink(); + const i3 = e3.split(":"); + let s3; + const r2 = i3.findIndex(((e4) => e4.startsWith("id="))); + return -1 !== r2 && (s3 = i3[r2].slice(3) || void 0), this._curAttrData.extended = this._curAttrData.extended.clone(), this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id: s3, uri: t3 }), this._curAttrData.updateExtended(), true; + } + _finishHyperlink() { + return this._curAttrData.extended = this._curAttrData.extended.clone(), this._curAttrData.extended.urlId = 0, this._curAttrData.updateExtended(), true; + } + _setOrReportSpecialColor(e3, t3) { + const i3 = e3.split(";"); + for (let e4 = 0; e4 < i3.length && !(t3 >= this._specialColors.length); ++e4, ++t3) if ("?" === i3[e4]) this._onColor.fire([{ type: 0, index: this._specialColors[t3] }]); + else { + const s3 = (0, S.parseColor)(i3[e4]); + s3 && this._onColor.fire([{ type: 1, index: this._specialColors[t3], color: s3 }]); + } + return true; + } + setOrReportFgColor(e3) { + return this._setOrReportSpecialColor(e3, 0); + } + setOrReportBgColor(e3) { + return this._setOrReportSpecialColor(e3, 1); + } + setOrReportCursorColor(e3) { + return this._setOrReportSpecialColor(e3, 2); + } + restoreIndexedColor(e3) { + if (!e3) return this._onColor.fire([{ type: 2 }]), true; + const t3 = [], i3 = e3.split(";"); + for (let e4 = 0; e4 < i3.length; ++e4) if (/^\d+$/.exec(i3[e4])) { + const s3 = parseInt(i3[e4]); + D(s3) && t3.push({ type: 2, index: s3 }); + } + return t3.length && this._onColor.fire(t3), true; + } + restoreFgColor(e3) { + return this._onColor.fire([{ type: 2, index: 256 }]), true; + } + restoreBgColor(e3) { + return this._onColor.fire([{ type: 2, index: 257 }]), true; + } + restoreCursorColor(e3) { + return this._onColor.fire([{ type: 2, index: 258 }]), true; + } + nextLine() { + return this._activeBuffer.x = 0, this.index(), true; + } + keypadApplicationMode() { + return this._logService.debug("Serial port requested application keypad."), this._coreService.decPrivateModes.applicationKeypad = true, this._onRequestSyncScrollBar.fire(), true; + } + keypadNumericMode() { + return this._logService.debug("Switching back to normal keypad."), this._coreService.decPrivateModes.applicationKeypad = false, this._onRequestSyncScrollBar.fire(), true; + } + selectDefaultCharset() { + return this._charsetService.setgLevel(0), this._charsetService.setgCharset(0, o.DEFAULT_CHARSET), true; + } + selectCharset(e3) { + return 2 !== e3.length ? (this.selectDefaultCharset(), true) : ("/" === e3[0] || this._charsetService.setgCharset(C[e3[0]], o.CHARSETS[e3[1]] || o.DEFAULT_CHARSET), true); + } + index() { + return this._restrictCursor(), this._activeBuffer.y++, this._activeBuffer.y === this._activeBuffer.scrollBottom + 1 ? (this._activeBuffer.y--, this._bufferService.scroll(this._eraseAttrData())) : this._activeBuffer.y >= this._bufferService.rows && (this._activeBuffer.y = this._bufferService.rows - 1), this._restrictCursor(), true; + } + tabSet() { + return this._activeBuffer.tabs[this._activeBuffer.x] = true, true; + } + reverseIndex() { + if (this._restrictCursor(), this._activeBuffer.y === this._activeBuffer.scrollTop) { + const e3 = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop; + this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, e3, 1), this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData())), this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom); + } else this._activeBuffer.y--, this._restrictCursor(); + return true; + } + fullReset() { + return this._parser.reset(), this._onRequestReset.fire(), true; + } + reset() { + this._curAttrData = l.DEFAULT_ATTR_DATA.clone(), this._eraseAttrDataInternal = l.DEFAULT_ATTR_DATA.clone(); + } + _eraseAttrData() { + return this._eraseAttrDataInternal.bg &= -67108864, this._eraseAttrDataInternal.bg |= 67108863 & this._curAttrData.bg, this._eraseAttrDataInternal; + } + setgLevel(e3) { + return this._charsetService.setgLevel(e3), true; + } + screenAlignmentPattern() { + const e3 = new u.CellData(); + e3.content = 1 << 22 | "E".charCodeAt(0), e3.fg = this._curAttrData.fg, e3.bg = this._curAttrData.bg, this._setCursor(0, 0); + for (let t3 = 0; t3 < this._bufferService.rows; ++t3) { + const i3 = this._activeBuffer.ybase + this._activeBuffer.y + t3, s3 = this._activeBuffer.lines.get(i3); + s3 && (s3.fill(e3), s3.isWrapped = false); + } + return this._dirtyRowTracker.markAllDirty(), this._setCursor(0, 0), true; + } + requestStatusString(e3, t3) { + const i3 = this._bufferService.buffer, s3 = this._optionsService.rawOptions; + return ((e4) => (this._coreService.triggerDataEvent(`${n.C0.ESC}${e4}${n.C0.ESC}\\`), true))('"q' === e3 ? `P1$r${this._curAttrData.isProtected() ? 1 : 0}"q` : '"p' === e3 ? 'P1$r61;1"p' : "r" === e3 ? `P1$r${i3.scrollTop + 1};${i3.scrollBottom + 1}r` : "m" === e3 ? "P1$r0m" : " q" === e3 ? `P1$r${{ block: 2, underline: 4, bar: 6 }[s3.cursorStyle] - (s3.cursorBlink ? 1 : 0)} q` : "P0$r"); + } + markRangeDirty(e3, t3) { + this._dirtyRowTracker.markRangeDirty(e3, t3); + } + } + t2.InputHandler = k; + let L = class { + constructor(e3) { + this._bufferService = e3, this.clearRange(); + } + clearRange() { + this.start = this._bufferService.buffer.y, this.end = this._bufferService.buffer.y; + } + markDirty(e3) { + e3 < this.start ? this.start = e3 : e3 > this.end && (this.end = e3); + } + markRangeDirty(e3, t3) { + e3 > t3 && (E = e3, e3 = t3, t3 = E), e3 < this.start && (this.start = e3), t3 > this.end && (this.end = t3); + } + markAllDirty() { + this.markRangeDirty(0, this._bufferService.rows - 1); + } + }; + function D(e3) { + return 0 <= e3 && e3 < 256; + } + L = s2([r(0, v.IBufferService)], L); + }, 844: (e2, t2) => { + function i2(e3) { + for (const t3 of e3) t3.dispose(); + e3.length = 0; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.getDisposeArrayDisposable = t2.disposeArray = t2.toDisposable = t2.MutableDisposable = t2.Disposable = void 0, t2.Disposable = class { + constructor() { + this._disposables = [], this._isDisposed = false; + } + dispose() { + this._isDisposed = true; + for (const e3 of this._disposables) e3.dispose(); + this._disposables.length = 0; + } + register(e3) { + return this._disposables.push(e3), e3; + } + unregister(e3) { + const t3 = this._disposables.indexOf(e3); + -1 !== t3 && this._disposables.splice(t3, 1); + } + }, t2.MutableDisposable = class { + constructor() { + this._isDisposed = false; + } + get value() { + return this._isDisposed ? void 0 : this._value; + } + set value(e3) { + var _a; + this._isDisposed || e3 === this._value || ((_a = this._value) == null ? void 0 : _a.dispose(), this._value = e3); + } + clear() { + this.value = void 0; + } + dispose() { + var _a; + this._isDisposed = true, (_a = this._value) == null ? void 0 : _a.dispose(), this._value = void 0; + } + }, t2.toDisposable = function(e3) { + return { dispose: e3 }; + }, t2.disposeArray = i2, t2.getDisposeArrayDisposable = function(e3) { + return { dispose: () => i2(e3) }; + }; + }, 1505: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.FourKeyMap = t2.TwoKeyMap = void 0; + class i2 { + constructor() { + this._data = {}; + } + set(e3, t3, i3) { + this._data[e3] || (this._data[e3] = {}), this._data[e3][t3] = i3; + } + get(e3, t3) { + return this._data[e3] ? this._data[e3][t3] : void 0; + } + clear() { + this._data = {}; + } + } + t2.TwoKeyMap = i2, t2.FourKeyMap = class { + constructor() { + this._data = new i2(); + } + set(e3, t3, s2, r, n) { + this._data.get(e3, t3) || this._data.set(e3, t3, new i2()), this._data.get(e3, t3).set(s2, r, n); + } + get(e3, t3, i3, s2) { + var _a; + return (_a = this._data.get(e3, t3)) == null ? void 0 : _a.get(i3, s2); + } + clear() { + this._data.clear(); + } + }; + }, 6114: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.isChromeOS = t2.isLinux = t2.isWindows = t2.isIphone = t2.isIpad = t2.isMac = t2.getSafariVersion = t2.isSafari = t2.isLegacyEdge = t2.isFirefox = t2.isNode = void 0, t2.isNode = "undefined" != typeof process && "title" in process; + const i2 = t2.isNode ? "node" : navigator.userAgent, s2 = t2.isNode ? "node" : navigator.platform; + t2.isFirefox = i2.includes("Firefox"), t2.isLegacyEdge = i2.includes("Edge"), t2.isSafari = /^((?!chrome|android).)*safari/i.test(i2), t2.getSafariVersion = function() { + if (!t2.isSafari) return 0; + const e3 = i2.match(/Version\/(\d+)/); + return null === e3 || e3.length < 2 ? 0 : parseInt(e3[1]); + }, t2.isMac = ["Macintosh", "MacIntel", "MacPPC", "Mac68K"].includes(s2), t2.isIpad = "iPad" === s2, t2.isIphone = "iPhone" === s2, t2.isWindows = ["Windows", "Win16", "Win32", "WinCE"].includes(s2), t2.isLinux = s2.indexOf("Linux") >= 0, t2.isChromeOS = /\bCrOS\b/.test(i2); + }, 6106: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.SortedList = void 0; + let i2 = 0; + t2.SortedList = class { + constructor(e3) { + this._getKey = e3, this._array = []; + } + clear() { + this._array.length = 0; + } + insert(e3) { + 0 !== this._array.length ? (i2 = this._search(this._getKey(e3)), this._array.splice(i2, 0, e3)) : this._array.push(e3); + } + delete(e3) { + if (0 === this._array.length) return false; + const t3 = this._getKey(e3); + if (void 0 === t3) return false; + if (i2 = this._search(t3), -1 === i2) return false; + if (this._getKey(this._array[i2]) !== t3) return false; + do { + if (this._array[i2] === e3) return this._array.splice(i2, 1), true; + } while (++i2 < this._array.length && this._getKey(this._array[i2]) === t3); + return false; + } + *getKeyIterator(e3) { + if (0 !== this._array.length && (i2 = this._search(e3), !(i2 < 0 || i2 >= this._array.length) && this._getKey(this._array[i2]) === e3)) do { + yield this._array[i2]; + } while (++i2 < this._array.length && this._getKey(this._array[i2]) === e3); + } + forEachByKey(e3, t3) { + if (0 !== this._array.length && (i2 = this._search(e3), !(i2 < 0 || i2 >= this._array.length) && this._getKey(this._array[i2]) === e3)) do { + t3(this._array[i2]); + } while (++i2 < this._array.length && this._getKey(this._array[i2]) === e3); + } + values() { + return [...this._array].values(); + } + _search(e3) { + let t3 = 0, i3 = this._array.length - 1; + for (; i3 >= t3; ) { + let s2 = t3 + i3 >> 1; + const r = this._getKey(this._array[s2]); + if (r > e3) i3 = s2 - 1; + else { + if (!(r < e3)) { + for (; s2 > 0 && this._getKey(this._array[s2 - 1]) === e3; ) s2--; + return s2; + } + t3 = s2 + 1; + } + } + return t3; + } + }; + }, 7226: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.DebouncedIdleTask = t2.IdleTaskQueue = t2.PriorityTaskQueue = void 0; + const s2 = i2(6114); + class r { + constructor() { + this._tasks = [], this._i = 0; + } + enqueue(e3) { + this._tasks.push(e3), this._start(); + } + flush() { + for (; this._i < this._tasks.length; ) this._tasks[this._i]() || this._i++; + this.clear(); + } + clear() { + this._idleCallback && (this._cancelCallback(this._idleCallback), this._idleCallback = void 0), this._i = 0, this._tasks.length = 0; + } + _start() { + this._idleCallback || (this._idleCallback = this._requestCallback(this._process.bind(this))); + } + _process(e3) { + this._idleCallback = void 0; + let t3 = 0, i3 = 0, s3 = e3.timeRemaining(), r2 = 0; + for (; this._i < this._tasks.length; ) { + if (t3 = Date.now(), this._tasks[this._i]() || this._i++, t3 = Math.max(1, Date.now() - t3), i3 = Math.max(t3, i3), r2 = e3.timeRemaining(), 1.5 * i3 > r2) return s3 - t3 < -20 && console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s3 - t3))}ms`), void this._start(); + s3 = r2; + } + this.clear(); + } + } + class n extends r { + _requestCallback(e3) { + return setTimeout((() => e3(this._createDeadline(16)))); + } + _cancelCallback(e3) { + clearTimeout(e3); + } + _createDeadline(e3) { + const t3 = Date.now() + e3; + return { timeRemaining: () => Math.max(0, t3 - Date.now()) }; + } + } + t2.PriorityTaskQueue = n, t2.IdleTaskQueue = !s2.isNode && "requestIdleCallback" in window ? class extends r { + _requestCallback(e3) { + return requestIdleCallback(e3); + } + _cancelCallback(e3) { + cancelIdleCallback(e3); + } + } : n, t2.DebouncedIdleTask = class { + constructor() { + this._queue = new t2.IdleTaskQueue(); + } + set(e3) { + this._queue.clear(), this._queue.enqueue(e3); + } + flush() { + this._queue.flush(); + } + }; + }, 9282: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.updateWindowsModeWrappedState = void 0; + const s2 = i2(643); + t2.updateWindowsModeWrappedState = function(e3) { + const t3 = e3.buffer.lines.get(e3.buffer.ybase + e3.buffer.y - 1), i3 = t3 == null ? void 0 : t3.get(e3.cols - 1), r = e3.buffer.lines.get(e3.buffer.ybase + e3.buffer.y); + r && i3 && (r.isWrapped = i3[s2.CHAR_DATA_CODE_INDEX] !== s2.NULL_CELL_CODE && i3[s2.CHAR_DATA_CODE_INDEX] !== s2.WHITESPACE_CELL_CODE); + }; + }, 3734: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ExtendedAttrs = t2.AttributeData = void 0; + class i2 { + constructor() { + this.fg = 0, this.bg = 0, this.extended = new s2(); + } + static toColorRGB(e3) { + return [e3 >>> 16 & 255, e3 >>> 8 & 255, 255 & e3]; + } + static fromColorRGB(e3) { + return (255 & e3[0]) << 16 | (255 & e3[1]) << 8 | 255 & e3[2]; + } + clone() { + const e3 = new i2(); + return e3.fg = this.fg, e3.bg = this.bg, e3.extended = this.extended.clone(), e3; + } + isInverse() { + return 67108864 & this.fg; + } + isBold() { + return 134217728 & this.fg; + } + isUnderline() { + return this.hasExtendedAttrs() && 0 !== this.extended.underlineStyle ? 1 : 268435456 & this.fg; + } + isBlink() { + return 536870912 & this.fg; + } + isInvisible() { + return 1073741824 & this.fg; + } + isItalic() { + return 67108864 & this.bg; + } + isDim() { + return 134217728 & this.bg; + } + isStrikethrough() { + return 2147483648 & this.fg; + } + isProtected() { + return 536870912 & this.bg; + } + isOverline() { + return 1073741824 & this.bg; + } + getFgColorMode() { + return 50331648 & this.fg; + } + getBgColorMode() { + return 50331648 & this.bg; + } + isFgRGB() { + return 50331648 == (50331648 & this.fg); + } + isBgRGB() { + return 50331648 == (50331648 & this.bg); + } + isFgPalette() { + return 16777216 == (50331648 & this.fg) || 33554432 == (50331648 & this.fg); + } + isBgPalette() { + return 16777216 == (50331648 & this.bg) || 33554432 == (50331648 & this.bg); + } + isFgDefault() { + return 0 == (50331648 & this.fg); + } + isBgDefault() { + return 0 == (50331648 & this.bg); + } + isAttributeDefault() { + return 0 === this.fg && 0 === this.bg; + } + getFgColor() { + switch (50331648 & this.fg) { + case 16777216: + case 33554432: + return 255 & this.fg; + case 50331648: + return 16777215 & this.fg; + default: + return -1; + } + } + getBgColor() { + switch (50331648 & this.bg) { + case 16777216: + case 33554432: + return 255 & this.bg; + case 50331648: + return 16777215 & this.bg; + default: + return -1; + } + } + hasExtendedAttrs() { + return 268435456 & this.bg; + } + updateExtended() { + this.extended.isEmpty() ? this.bg &= -268435457 : this.bg |= 268435456; + } + getUnderlineColor() { + if (268435456 & this.bg && ~this.extended.underlineColor) switch (50331648 & this.extended.underlineColor) { + case 16777216: + case 33554432: + return 255 & this.extended.underlineColor; + case 50331648: + return 16777215 & this.extended.underlineColor; + default: + return this.getFgColor(); + } + return this.getFgColor(); + } + getUnderlineColorMode() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 50331648 & this.extended.underlineColor : this.getFgColorMode(); + } + isUnderlineColorRGB() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 50331648 == (50331648 & this.extended.underlineColor) : this.isFgRGB(); + } + isUnderlineColorPalette() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 16777216 == (50331648 & this.extended.underlineColor) || 33554432 == (50331648 & this.extended.underlineColor) : this.isFgPalette(); + } + isUnderlineColorDefault() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 0 == (50331648 & this.extended.underlineColor) : this.isFgDefault(); + } + getUnderlineStyle() { + return 268435456 & this.fg ? 268435456 & this.bg ? this.extended.underlineStyle : 1 : 0; + } + getUnderlineVariantOffset() { + return this.extended.underlineVariantOffset; + } + } + t2.AttributeData = i2; + class s2 { + get ext() { + return this._urlId ? -469762049 & this._ext | this.underlineStyle << 26 : this._ext; + } + set ext(e3) { + this._ext = e3; + } + get underlineStyle() { + return this._urlId ? 5 : (469762048 & this._ext) >> 26; + } + set underlineStyle(e3) { + this._ext &= -469762049, this._ext |= e3 << 26 & 469762048; + } + get underlineColor() { + return 67108863 & this._ext; + } + set underlineColor(e3) { + this._ext &= -67108864, this._ext |= 67108863 & e3; + } + get urlId() { + return this._urlId; + } + set urlId(e3) { + this._urlId = e3; + } + get underlineVariantOffset() { + const e3 = (3758096384 & this._ext) >> 29; + return e3 < 0 ? 4294967288 ^ e3 : e3; + } + set underlineVariantOffset(e3) { + this._ext &= 536870911, this._ext |= e3 << 29 & 3758096384; + } + constructor(e3 = 0, t3 = 0) { + this._ext = 0, this._urlId = 0, this._ext = e3, this._urlId = t3; + } + clone() { + return new s2(this._ext, this._urlId); + } + isEmpty() { + return 0 === this.underlineStyle && 0 === this._urlId; + } + } + t2.ExtendedAttrs = s2; + }, 9092: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Buffer = t2.MAX_BUFFER_SIZE = void 0; + const s2 = i2(6349), r = i2(7226), n = i2(3734), o = i2(8437), a = i2(4634), h = i2(511), c = i2(643), l = i2(4863), d = i2(7116); + t2.MAX_BUFFER_SIZE = 4294967295, t2.Buffer = class { + constructor(e3, t3, i3) { + this._hasScrollback = e3, this._optionsService = t3, this._bufferService = i3, this.ydisp = 0, this.ybase = 0, this.y = 0, this.x = 0, this.tabs = {}, this.savedY = 0, this.savedX = 0, this.savedCurAttrData = o.DEFAULT_ATTR_DATA.clone(), this.savedCharset = d.DEFAULT_CHARSET, this.markers = [], this._nullCell = h.CellData.fromCharData([0, c.NULL_CELL_CHAR, c.NULL_CELL_WIDTH, c.NULL_CELL_CODE]), this._whitespaceCell = h.CellData.fromCharData([0, c.WHITESPACE_CELL_CHAR, c.WHITESPACE_CELL_WIDTH, c.WHITESPACE_CELL_CODE]), this._isClearing = false, this._memoryCleanupQueue = new r.IdleTaskQueue(), this._memoryCleanupPosition = 0, this._cols = this._bufferService.cols, this._rows = this._bufferService.rows, this.lines = new s2.CircularList(this._getCorrectBufferLength(this._rows)), this.scrollTop = 0, this.scrollBottom = this._rows - 1, this.setupTabStops(); + } + getNullCell(e3) { + return e3 ? (this._nullCell.fg = e3.fg, this._nullCell.bg = e3.bg, this._nullCell.extended = e3.extended) : (this._nullCell.fg = 0, this._nullCell.bg = 0, this._nullCell.extended = new n.ExtendedAttrs()), this._nullCell; + } + getWhitespaceCell(e3) { + return e3 ? (this._whitespaceCell.fg = e3.fg, this._whitespaceCell.bg = e3.bg, this._whitespaceCell.extended = e3.extended) : (this._whitespaceCell.fg = 0, this._whitespaceCell.bg = 0, this._whitespaceCell.extended = new n.ExtendedAttrs()), this._whitespaceCell; + } + getBlankLine(e3, t3) { + return new o.BufferLine(this._bufferService.cols, this.getNullCell(e3), t3); + } + get hasScrollback() { + return this._hasScrollback && this.lines.maxLength > this._rows; + } + get isCursorInViewport() { + const e3 = this.ybase + this.y - this.ydisp; + return e3 >= 0 && e3 < this._rows; + } + _getCorrectBufferLength(e3) { + if (!this._hasScrollback) return e3; + const i3 = e3 + this._optionsService.rawOptions.scrollback; + return i3 > t2.MAX_BUFFER_SIZE ? t2.MAX_BUFFER_SIZE : i3; + } + fillViewportRows(e3) { + if (0 === this.lines.length) { + void 0 === e3 && (e3 = o.DEFAULT_ATTR_DATA); + let t3 = this._rows; + for (; t3--; ) this.lines.push(this.getBlankLine(e3)); + } + } + clear() { + this.ydisp = 0, this.ybase = 0, this.y = 0, this.x = 0, this.lines = new s2.CircularList(this._getCorrectBufferLength(this._rows)), this.scrollTop = 0, this.scrollBottom = this._rows - 1, this.setupTabStops(); + } + resize(e3, t3) { + const i3 = this.getNullCell(o.DEFAULT_ATTR_DATA); + let s3 = 0; + const r2 = this._getCorrectBufferLength(t3); + if (r2 > this.lines.maxLength && (this.lines.maxLength = r2), this.lines.length > 0) { + if (this._cols < e3) for (let t4 = 0; t4 < this.lines.length; t4++) s3 += +this.lines.get(t4).resize(e3, i3); + let n2 = 0; + if (this._rows < t3) for (let s4 = this._rows; s4 < t3; s4++) this.lines.length < t3 + this.ybase && (this._optionsService.rawOptions.windowsMode || void 0 !== this._optionsService.rawOptions.windowsPty.backend || void 0 !== this._optionsService.rawOptions.windowsPty.buildNumber ? this.lines.push(new o.BufferLine(e3, i3)) : this.ybase > 0 && this.lines.length <= this.ybase + this.y + n2 + 1 ? (this.ybase--, n2++, this.ydisp > 0 && this.ydisp--) : this.lines.push(new o.BufferLine(e3, i3))); + else for (let e4 = this._rows; e4 > t3; e4--) this.lines.length > t3 + this.ybase && (this.lines.length > this.ybase + this.y + 1 ? this.lines.pop() : (this.ybase++, this.ydisp++)); + if (r2 < this.lines.maxLength) { + const e4 = this.lines.length - r2; + e4 > 0 && (this.lines.trimStart(e4), this.ybase = Math.max(this.ybase - e4, 0), this.ydisp = Math.max(this.ydisp - e4, 0), this.savedY = Math.max(this.savedY - e4, 0)), this.lines.maxLength = r2; + } + this.x = Math.min(this.x, e3 - 1), this.y = Math.min(this.y, t3 - 1), n2 && (this.y += n2), this.savedX = Math.min(this.savedX, e3 - 1), this.scrollTop = 0; + } + if (this.scrollBottom = t3 - 1, this._isReflowEnabled && (this._reflow(e3, t3), this._cols > e3)) for (let t4 = 0; t4 < this.lines.length; t4++) s3 += +this.lines.get(t4).resize(e3, i3); + this._cols = e3, this._rows = t3, this._memoryCleanupQueue.clear(), s3 > 0.1 * this.lines.length && (this._memoryCleanupPosition = 0, this._memoryCleanupQueue.enqueue((() => this._batchedMemoryCleanup()))); + } + _batchedMemoryCleanup() { + let e3 = true; + this._memoryCleanupPosition >= this.lines.length && (this._memoryCleanupPosition = 0, e3 = false); + let t3 = 0; + for (; this._memoryCleanupPosition < this.lines.length; ) if (t3 += this.lines.get(this._memoryCleanupPosition++).cleanupMemory(), t3 > 100) return true; + return e3; + } + get _isReflowEnabled() { + const e3 = this._optionsService.rawOptions.windowsPty; + return e3 && e3.buildNumber ? this._hasScrollback && "conpty" === e3.backend && e3.buildNumber >= 21376 : this._hasScrollback && !this._optionsService.rawOptions.windowsMode; + } + _reflow(e3, t3) { + this._cols !== e3 && (e3 > this._cols ? this._reflowLarger(e3, t3) : this._reflowSmaller(e3, t3)); + } + _reflowLarger(e3, t3) { + const i3 = (0, a.reflowLargerGetLinesToRemove)(this.lines, this._cols, e3, this.ybase + this.y, this.getNullCell(o.DEFAULT_ATTR_DATA)); + if (i3.length > 0) { + const s3 = (0, a.reflowLargerCreateNewLayout)(this.lines, i3); + (0, a.reflowLargerApplyNewLayout)(this.lines, s3.layout), this._reflowLargerAdjustViewport(e3, t3, s3.countRemoved); + } + } + _reflowLargerAdjustViewport(e3, t3, i3) { + const s3 = this.getNullCell(o.DEFAULT_ATTR_DATA); + let r2 = i3; + for (; r2-- > 0; ) 0 === this.ybase ? (this.y > 0 && this.y--, this.lines.length < t3 && this.lines.push(new o.BufferLine(e3, s3))) : (this.ydisp === this.ybase && this.ydisp--, this.ybase--); + this.savedY = Math.max(this.savedY - i3, 0); + } + _reflowSmaller(e3, t3) { + const i3 = this.getNullCell(o.DEFAULT_ATTR_DATA), s3 = []; + let r2 = 0; + for (let n2 = this.lines.length - 1; n2 >= 0; n2--) { + let h2 = this.lines.get(n2); + if (!h2 || !h2.isWrapped && h2.getTrimmedLength() <= e3) continue; + const c2 = [h2]; + for (; h2.isWrapped && n2 > 0; ) h2 = this.lines.get(--n2), c2.unshift(h2); + const l2 = this.ybase + this.y; + if (l2 >= n2 && l2 < n2 + c2.length) continue; + const d2 = c2[c2.length - 1].getTrimmedLength(), _ = (0, a.reflowSmallerGetNewLineLengths)(c2, this._cols, e3), u = _.length - c2.length; + let f; + f = 0 === this.ybase && this.y !== this.lines.length - 1 ? Math.max(0, this.y - this.lines.maxLength + u) : Math.max(0, this.lines.length - this.lines.maxLength + u); + const v = []; + for (let e4 = 0; e4 < u; e4++) { + const e5 = this.getBlankLine(o.DEFAULT_ATTR_DATA, true); + v.push(e5); + } + v.length > 0 && (s3.push({ start: n2 + c2.length + r2, newLines: v }), r2 += v.length), c2.push(...v); + let p = _.length - 1, g = _[p]; + 0 === g && (p--, g = _[p]); + let m = c2.length - u - 1, S = d2; + for (; m >= 0; ) { + const e4 = Math.min(S, g); + if (void 0 === c2[p]) break; + if (c2[p].copyCellsFrom(c2[m], S - e4, g - e4, e4, true), g -= e4, 0 === g && (p--, g = _[p]), S -= e4, 0 === S) { + m--; + const e5 = Math.max(m, 0); + S = (0, a.getWrappedLineTrimmedLength)(c2, e5, this._cols); + } + } + for (let t4 = 0; t4 < c2.length; t4++) _[t4] < e3 && c2[t4].setCell(_[t4], i3); + let C = u - f; + for (; C-- > 0; ) 0 === this.ybase ? this.y < t3 - 1 ? (this.y++, this.lines.pop()) : (this.ybase++, this.ydisp++) : this.ybase < Math.min(this.lines.maxLength, this.lines.length + r2) - t3 && (this.ybase === this.ydisp && this.ydisp++, this.ybase++); + this.savedY = Math.min(this.savedY + u, this.ybase + t3 - 1); + } + if (s3.length > 0) { + const e4 = [], t4 = []; + for (let e5 = 0; e5 < this.lines.length; e5++) t4.push(this.lines.get(e5)); + const i4 = this.lines.length; + let n2 = i4 - 1, o2 = 0, a2 = s3[o2]; + this.lines.length = Math.min(this.lines.maxLength, this.lines.length + r2); + let h2 = 0; + for (let c3 = Math.min(this.lines.maxLength - 1, i4 + r2 - 1); c3 >= 0; c3--) if (a2 && a2.start > n2 + h2) { + for (let e5 = a2.newLines.length - 1; e5 >= 0; e5--) this.lines.set(c3--, a2.newLines[e5]); + c3++, e4.push({ index: n2 + 1, amount: a2.newLines.length }), h2 += a2.newLines.length, a2 = s3[++o2]; + } else this.lines.set(c3, t4[n2--]); + let c2 = 0; + for (let t5 = e4.length - 1; t5 >= 0; t5--) e4[t5].index += c2, this.lines.onInsertEmitter.fire(e4[t5]), c2 += e4[t5].amount; + const l2 = Math.max(0, i4 + r2 - this.lines.maxLength); + l2 > 0 && this.lines.onTrimEmitter.fire(l2); + } + } + translateBufferLineToString(e3, t3, i3 = 0, s3) { + const r2 = this.lines.get(e3); + return r2 ? r2.translateToString(t3, i3, s3) : ""; + } + getWrappedRangeForLine(e3) { + let t3 = e3, i3 = e3; + for (; t3 > 0 && this.lines.get(t3).isWrapped; ) t3--; + for (; i3 + 1 < this.lines.length && this.lines.get(i3 + 1).isWrapped; ) i3++; + return { first: t3, last: i3 }; + } + setupTabStops(e3) { + for (null != e3 ? this.tabs[e3] || (e3 = this.prevStop(e3)) : (this.tabs = {}, e3 = 0); e3 < this._cols; e3 += this._optionsService.rawOptions.tabStopWidth) this.tabs[e3] = true; + } + prevStop(e3) { + for (null == e3 && (e3 = this.x); !this.tabs[--e3] && e3 > 0; ) ; + return e3 >= this._cols ? this._cols - 1 : e3 < 0 ? 0 : e3; + } + nextStop(e3) { + for (null == e3 && (e3 = this.x); !this.tabs[++e3] && e3 < this._cols; ) ; + return e3 >= this._cols ? this._cols - 1 : e3 < 0 ? 0 : e3; + } + clearMarkers(e3) { + this._isClearing = true; + for (let t3 = 0; t3 < this.markers.length; t3++) this.markers[t3].line === e3 && (this.markers[t3].dispose(), this.markers.splice(t3--, 1)); + this._isClearing = false; + } + clearAllMarkers() { + this._isClearing = true; + for (let e3 = 0; e3 < this.markers.length; e3++) this.markers[e3].dispose(), this.markers.splice(e3--, 1); + this._isClearing = false; + } + addMarker(e3) { + const t3 = new l.Marker(e3); + return this.markers.push(t3), t3.register(this.lines.onTrim(((e4) => { + t3.line -= e4, t3.line < 0 && t3.dispose(); + }))), t3.register(this.lines.onInsert(((e4) => { + t3.line >= e4.index && (t3.line += e4.amount); + }))), t3.register(this.lines.onDelete(((e4) => { + t3.line >= e4.index && t3.line < e4.index + e4.amount && t3.dispose(), t3.line > e4.index && (t3.line -= e4.amount); + }))), t3.register(t3.onDispose((() => this._removeMarker(t3)))), t3; + } + _removeMarker(e3) { + this._isClearing || this.markers.splice(this.markers.indexOf(e3), 1); + } + }; + }, 8437: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferLine = t2.DEFAULT_ATTR_DATA = void 0; + const s2 = i2(3734), r = i2(511), n = i2(643), o = i2(482); + t2.DEFAULT_ATTR_DATA = Object.freeze(new s2.AttributeData()); + let a = 0; + class h { + constructor(e3, t3, i3 = false) { + this.isWrapped = i3, this._combined = {}, this._extendedAttrs = {}, this._data = new Uint32Array(3 * e3); + const s3 = t3 || r.CellData.fromCharData([0, n.NULL_CELL_CHAR, n.NULL_CELL_WIDTH, n.NULL_CELL_CODE]); + for (let t4 = 0; t4 < e3; ++t4) this.setCell(t4, s3); + this.length = e3; + } + get(e3) { + const t3 = this._data[3 * e3 + 0], i3 = 2097151 & t3; + return [this._data[3 * e3 + 1], 2097152 & t3 ? this._combined[e3] : i3 ? (0, o.stringFromCodePoint)(i3) : "", t3 >> 22, 2097152 & t3 ? this._combined[e3].charCodeAt(this._combined[e3].length - 1) : i3]; + } + set(e3, t3) { + this._data[3 * e3 + 1] = t3[n.CHAR_DATA_ATTR_INDEX], t3[n.CHAR_DATA_CHAR_INDEX].length > 1 ? (this._combined[e3] = t3[1], this._data[3 * e3 + 0] = 2097152 | e3 | t3[n.CHAR_DATA_WIDTH_INDEX] << 22) : this._data[3 * e3 + 0] = t3[n.CHAR_DATA_CHAR_INDEX].charCodeAt(0) | t3[n.CHAR_DATA_WIDTH_INDEX] << 22; + } + getWidth(e3) { + return this._data[3 * e3 + 0] >> 22; + } + hasWidth(e3) { + return 12582912 & this._data[3 * e3 + 0]; + } + getFg(e3) { + return this._data[3 * e3 + 1]; + } + getBg(e3) { + return this._data[3 * e3 + 2]; + } + hasContent(e3) { + return 4194303 & this._data[3 * e3 + 0]; + } + getCodePoint(e3) { + const t3 = this._data[3 * e3 + 0]; + return 2097152 & t3 ? this._combined[e3].charCodeAt(this._combined[e3].length - 1) : 2097151 & t3; + } + isCombined(e3) { + return 2097152 & this._data[3 * e3 + 0]; + } + getString(e3) { + const t3 = this._data[3 * e3 + 0]; + return 2097152 & t3 ? this._combined[e3] : 2097151 & t3 ? (0, o.stringFromCodePoint)(2097151 & t3) : ""; + } + isProtected(e3) { + return 536870912 & this._data[3 * e3 + 2]; + } + loadCell(e3, t3) { + return a = 3 * e3, t3.content = this._data[a + 0], t3.fg = this._data[a + 1], t3.bg = this._data[a + 2], 2097152 & t3.content && (t3.combinedData = this._combined[e3]), 268435456 & t3.bg && (t3.extended = this._extendedAttrs[e3]), t3; + } + setCell(e3, t3) { + 2097152 & t3.content && (this._combined[e3] = t3.combinedData), 268435456 & t3.bg && (this._extendedAttrs[e3] = t3.extended), this._data[3 * e3 + 0] = t3.content, this._data[3 * e3 + 1] = t3.fg, this._data[3 * e3 + 2] = t3.bg; + } + setCellFromCodepoint(e3, t3, i3, s3) { + 268435456 & s3.bg && (this._extendedAttrs[e3] = s3.extended), this._data[3 * e3 + 0] = t3 | i3 << 22, this._data[3 * e3 + 1] = s3.fg, this._data[3 * e3 + 2] = s3.bg; + } + addCodepointToCell(e3, t3, i3) { + let s3 = this._data[3 * e3 + 0]; + 2097152 & s3 ? this._combined[e3] += (0, o.stringFromCodePoint)(t3) : 2097151 & s3 ? (this._combined[e3] = (0, o.stringFromCodePoint)(2097151 & s3) + (0, o.stringFromCodePoint)(t3), s3 &= -2097152, s3 |= 2097152) : s3 = t3 | 1 << 22, i3 && (s3 &= -12582913, s3 |= i3 << 22), this._data[3 * e3 + 0] = s3; + } + insertCells(e3, t3, i3) { + if ((e3 %= this.length) && 2 === this.getWidth(e3 - 1) && this.setCellFromCodepoint(e3 - 1, 0, 1, i3), t3 < this.length - e3) { + const s3 = new r.CellData(); + for (let i4 = this.length - e3 - t3 - 1; i4 >= 0; --i4) this.setCell(e3 + t3 + i4, this.loadCell(e3 + i4, s3)); + for (let s4 = 0; s4 < t3; ++s4) this.setCell(e3 + s4, i3); + } else for (let t4 = e3; t4 < this.length; ++t4) this.setCell(t4, i3); + 2 === this.getWidth(this.length - 1) && this.setCellFromCodepoint(this.length - 1, 0, 1, i3); + } + deleteCells(e3, t3, i3) { + if (e3 %= this.length, t3 < this.length - e3) { + const s3 = new r.CellData(); + for (let i4 = 0; i4 < this.length - e3 - t3; ++i4) this.setCell(e3 + i4, this.loadCell(e3 + t3 + i4, s3)); + for (let e4 = this.length - t3; e4 < this.length; ++e4) this.setCell(e4, i3); + } else for (let t4 = e3; t4 < this.length; ++t4) this.setCell(t4, i3); + e3 && 2 === this.getWidth(e3 - 1) && this.setCellFromCodepoint(e3 - 1, 0, 1, i3), 0 !== this.getWidth(e3) || this.hasContent(e3) || this.setCellFromCodepoint(e3, 0, 1, i3); + } + replaceCells(e3, t3, i3, s3 = false) { + if (s3) for (e3 && 2 === this.getWidth(e3 - 1) && !this.isProtected(e3 - 1) && this.setCellFromCodepoint(e3 - 1, 0, 1, i3), t3 < this.length && 2 === this.getWidth(t3 - 1) && !this.isProtected(t3) && this.setCellFromCodepoint(t3, 0, 1, i3); e3 < t3 && e3 < this.length; ) this.isProtected(e3) || this.setCell(e3, i3), e3++; + else for (e3 && 2 === this.getWidth(e3 - 1) && this.setCellFromCodepoint(e3 - 1, 0, 1, i3), t3 < this.length && 2 === this.getWidth(t3 - 1) && this.setCellFromCodepoint(t3, 0, 1, i3); e3 < t3 && e3 < this.length; ) this.setCell(e3++, i3); + } + resize(e3, t3) { + if (e3 === this.length) return 4 * this._data.length * 2 < this._data.buffer.byteLength; + const i3 = 3 * e3; + if (e3 > this.length) { + if (this._data.buffer.byteLength >= 4 * i3) this._data = new Uint32Array(this._data.buffer, 0, i3); + else { + const e4 = new Uint32Array(i3); + e4.set(this._data), this._data = e4; + } + for (let i4 = this.length; i4 < e3; ++i4) this.setCell(i4, t3); + } else { + this._data = this._data.subarray(0, i3); + const t4 = Object.keys(this._combined); + for (let i4 = 0; i4 < t4.length; i4++) { + const s4 = parseInt(t4[i4], 10); + s4 >= e3 && delete this._combined[s4]; + } + const s3 = Object.keys(this._extendedAttrs); + for (let t5 = 0; t5 < s3.length; t5++) { + const i4 = parseInt(s3[t5], 10); + i4 >= e3 && delete this._extendedAttrs[i4]; + } + } + return this.length = e3, 4 * i3 * 2 < this._data.buffer.byteLength; + } + cleanupMemory() { + if (4 * this._data.length * 2 < this._data.buffer.byteLength) { + const e3 = new Uint32Array(this._data.length); + return e3.set(this._data), this._data = e3, 1; + } + return 0; + } + fill(e3, t3 = false) { + if (t3) for (let t4 = 0; t4 < this.length; ++t4) this.isProtected(t4) || this.setCell(t4, e3); + else { + this._combined = {}, this._extendedAttrs = {}; + for (let t4 = 0; t4 < this.length; ++t4) this.setCell(t4, e3); + } + } + copyFrom(e3) { + this.length !== e3.length ? this._data = new Uint32Array(e3._data) : this._data.set(e3._data), this.length = e3.length, this._combined = {}; + for (const t3 in e3._combined) this._combined[t3] = e3._combined[t3]; + this._extendedAttrs = {}; + for (const t3 in e3._extendedAttrs) this._extendedAttrs[t3] = e3._extendedAttrs[t3]; + this.isWrapped = e3.isWrapped; + } + clone() { + const e3 = new h(0); + e3._data = new Uint32Array(this._data), e3.length = this.length; + for (const t3 in this._combined) e3._combined[t3] = this._combined[t3]; + for (const t3 in this._extendedAttrs) e3._extendedAttrs[t3] = this._extendedAttrs[t3]; + return e3.isWrapped = this.isWrapped, e3; + } + getTrimmedLength() { + for (let e3 = this.length - 1; e3 >= 0; --e3) if (4194303 & this._data[3 * e3 + 0]) return e3 + (this._data[3 * e3 + 0] >> 22); + return 0; + } + getNoBgTrimmedLength() { + for (let e3 = this.length - 1; e3 >= 0; --e3) if (4194303 & this._data[3 * e3 + 0] || 50331648 & this._data[3 * e3 + 2]) return e3 + (this._data[3 * e3 + 0] >> 22); + return 0; + } + copyCellsFrom(e3, t3, i3, s3, r2) { + const n2 = e3._data; + if (r2) for (let r3 = s3 - 1; r3 >= 0; r3--) { + for (let e4 = 0; e4 < 3; e4++) this._data[3 * (i3 + r3) + e4] = n2[3 * (t3 + r3) + e4]; + 268435456 & n2[3 * (t3 + r3) + 2] && (this._extendedAttrs[i3 + r3] = e3._extendedAttrs[t3 + r3]); + } + else for (let r3 = 0; r3 < s3; r3++) { + for (let e4 = 0; e4 < 3; e4++) this._data[3 * (i3 + r3) + e4] = n2[3 * (t3 + r3) + e4]; + 268435456 & n2[3 * (t3 + r3) + 2] && (this._extendedAttrs[i3 + r3] = e3._extendedAttrs[t3 + r3]); + } + const o2 = Object.keys(e3._combined); + for (let s4 = 0; s4 < o2.length; s4++) { + const r3 = parseInt(o2[s4], 10); + r3 >= t3 && (this._combined[r3 - t3 + i3] = e3._combined[r3]); + } + } + translateToString(e3, t3, i3, s3) { + t3 = t3 ?? 0, i3 = i3 ?? this.length, e3 && (i3 = Math.min(i3, this.getTrimmedLength())), s3 && (s3.length = 0); + let r2 = ""; + for (; t3 < i3; ) { + const e4 = this._data[3 * t3 + 0], i4 = 2097151 & e4, a2 = 2097152 & e4 ? this._combined[t3] : i4 ? (0, o.stringFromCodePoint)(i4) : n.WHITESPACE_CELL_CHAR; + if (r2 += a2, s3) for (let e5 = 0; e5 < a2.length; ++e5) s3.push(t3); + t3 += e4 >> 22 || 1; + } + return s3 && s3.push(t3), r2; + } + } + t2.BufferLine = h; + }, 4841: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.getRangeLength = void 0, t2.getRangeLength = function(e3, t3) { + if (e3.start.y > e3.end.y) throw new Error(`Buffer range end (${e3.end.x}, ${e3.end.y}) cannot be before start (${e3.start.x}, ${e3.start.y})`); + return t3 * (e3.end.y - e3.start.y) + (e3.end.x - e3.start.x + 1); + }; + }, 4634: (e2, t2) => { + function i2(e3, t3, i3) { + if (t3 === e3.length - 1) return e3[t3].getTrimmedLength(); + const s2 = !e3[t3].hasContent(i3 - 1) && 1 === e3[t3].getWidth(i3 - 1), r = 2 === e3[t3 + 1].getWidth(0); + return s2 && r ? i3 - 1 : i3; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.getWrappedLineTrimmedLength = t2.reflowSmallerGetNewLineLengths = t2.reflowLargerApplyNewLayout = t2.reflowLargerCreateNewLayout = t2.reflowLargerGetLinesToRemove = void 0, t2.reflowLargerGetLinesToRemove = function(e3, t3, s2, r, n) { + const o = []; + for (let a = 0; a < e3.length - 1; a++) { + let h = a, c = e3.get(++h); + if (!c.isWrapped) continue; + const l = [e3.get(a)]; + for (; h < e3.length && c.isWrapped; ) l.push(c), c = e3.get(++h); + if (r >= a && r < h) { + a += l.length - 1; + continue; + } + let d = 0, _ = i2(l, d, t3), u = 1, f = 0; + for (; u < l.length; ) { + const e4 = i2(l, u, t3), r2 = e4 - f, o2 = s2 - _, a2 = Math.min(r2, o2); + l[d].copyCellsFrom(l[u], f, _, a2, false), _ += a2, _ === s2 && (d++, _ = 0), f += a2, f === e4 && (u++, f = 0), 0 === _ && 0 !== d && 2 === l[d - 1].getWidth(s2 - 1) && (l[d].copyCellsFrom(l[d - 1], s2 - 1, _++, 1, false), l[d - 1].setCell(s2 - 1, n)); + } + l[d].replaceCells(_, s2, n); + let v = 0; + for (let e4 = l.length - 1; e4 > 0 && (e4 > d || 0 === l[e4].getTrimmedLength()); e4--) v++; + v > 0 && (o.push(a + l.length - v), o.push(v)), a += l.length - 1; + } + return o; + }, t2.reflowLargerCreateNewLayout = function(e3, t3) { + const i3 = []; + let s2 = 0, r = t3[s2], n = 0; + for (let o = 0; o < e3.length; o++) if (r === o) { + const i4 = t3[++s2]; + e3.onDeleteEmitter.fire({ index: o - n, amount: i4 }), o += i4 - 1, n += i4, r = t3[++s2]; + } else i3.push(o); + return { layout: i3, countRemoved: n }; + }, t2.reflowLargerApplyNewLayout = function(e3, t3) { + const i3 = []; + for (let s2 = 0; s2 < t3.length; s2++) i3.push(e3.get(t3[s2])); + for (let t4 = 0; t4 < i3.length; t4++) e3.set(t4, i3[t4]); + e3.length = t3.length; + }, t2.reflowSmallerGetNewLineLengths = function(e3, t3, s2) { + const r = [], n = e3.map(((s3, r2) => i2(e3, r2, t3))).reduce(((e4, t4) => e4 + t4)); + let o = 0, a = 0, h = 0; + for (; h < n; ) { + if (n - h < s2) { + r.push(n - h); + break; + } + o += s2; + const c = i2(e3, a, t3); + o > c && (o -= c, a++); + const l = 2 === e3[a].getWidth(o - 1); + l && o--; + const d = l ? s2 - 1 : s2; + r.push(d), h += d; + } + return r; + }, t2.getWrappedLineTrimmedLength = i2; + }, 5295: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferSet = void 0; + const s2 = i2(8460), r = i2(844), n = i2(9092); + class o extends r.Disposable { + constructor(e3, t3) { + super(), this._optionsService = e3, this._bufferService = t3, this._onBufferActivate = this.register(new s2.EventEmitter()), this.onBufferActivate = this._onBufferActivate.event, this.reset(), this.register(this._optionsService.onSpecificOptionChange("scrollback", (() => this.resize(this._bufferService.cols, this._bufferService.rows)))), this.register(this._optionsService.onSpecificOptionChange("tabStopWidth", (() => this.setupTabStops()))); + } + reset() { + this._normal = new n.Buffer(true, this._optionsService, this._bufferService), this._normal.fillViewportRows(), this._alt = new n.Buffer(false, this._optionsService, this._bufferService), this._activeBuffer = this._normal, this._onBufferActivate.fire({ activeBuffer: this._normal, inactiveBuffer: this._alt }), this.setupTabStops(); + } + get alt() { + return this._alt; + } + get active() { + return this._activeBuffer; + } + get normal() { + return this._normal; + } + activateNormalBuffer() { + this._activeBuffer !== this._normal && (this._normal.x = this._alt.x, this._normal.y = this._alt.y, this._alt.clearAllMarkers(), this._alt.clear(), this._activeBuffer = this._normal, this._onBufferActivate.fire({ activeBuffer: this._normal, inactiveBuffer: this._alt })); + } + activateAltBuffer(e3) { + this._activeBuffer !== this._alt && (this._alt.fillViewportRows(e3), this._alt.x = this._normal.x, this._alt.y = this._normal.y, this._activeBuffer = this._alt, this._onBufferActivate.fire({ activeBuffer: this._alt, inactiveBuffer: this._normal })); + } + resize(e3, t3) { + this._normal.resize(e3, t3), this._alt.resize(e3, t3), this.setupTabStops(e3); + } + setupTabStops(e3) { + this._normal.setupTabStops(e3), this._alt.setupTabStops(e3); + } + } + t2.BufferSet = o; + }, 511: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CellData = void 0; + const s2 = i2(482), r = i2(643), n = i2(3734); + class o extends n.AttributeData { + constructor() { + super(...arguments), this.content = 0, this.fg = 0, this.bg = 0, this.extended = new n.ExtendedAttrs(), this.combinedData = ""; + } + static fromCharData(e3) { + const t3 = new o(); + return t3.setFromCharData(e3), t3; + } + isCombined() { + return 2097152 & this.content; + } + getWidth() { + return this.content >> 22; + } + getChars() { + return 2097152 & this.content ? this.combinedData : 2097151 & this.content ? (0, s2.stringFromCodePoint)(2097151 & this.content) : ""; + } + getCode() { + return this.isCombined() ? this.combinedData.charCodeAt(this.combinedData.length - 1) : 2097151 & this.content; + } + setFromCharData(e3) { + this.fg = e3[r.CHAR_DATA_ATTR_INDEX], this.bg = 0; + let t3 = false; + if (e3[r.CHAR_DATA_CHAR_INDEX].length > 2) t3 = true; + else if (2 === e3[r.CHAR_DATA_CHAR_INDEX].length) { + const i3 = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0); + if (55296 <= i3 && i3 <= 56319) { + const s3 = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1); + 56320 <= s3 && s3 <= 57343 ? this.content = 1024 * (i3 - 55296) + s3 - 56320 + 65536 | e3[r.CHAR_DATA_WIDTH_INDEX] << 22 : t3 = true; + } else t3 = true; + } else this.content = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0) | e3[r.CHAR_DATA_WIDTH_INDEX] << 22; + t3 && (this.combinedData = e3[r.CHAR_DATA_CHAR_INDEX], this.content = 2097152 | e3[r.CHAR_DATA_WIDTH_INDEX] << 22); + } + getAsCharData() { + return [this.fg, this.getChars(), this.getWidth(), this.getCode()]; + } + } + t2.CellData = o; + }, 643: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.WHITESPACE_CELL_CODE = t2.WHITESPACE_CELL_WIDTH = t2.WHITESPACE_CELL_CHAR = t2.NULL_CELL_CODE = t2.NULL_CELL_WIDTH = t2.NULL_CELL_CHAR = t2.CHAR_DATA_CODE_INDEX = t2.CHAR_DATA_WIDTH_INDEX = t2.CHAR_DATA_CHAR_INDEX = t2.CHAR_DATA_ATTR_INDEX = t2.DEFAULT_EXT = t2.DEFAULT_ATTR = t2.DEFAULT_COLOR = void 0, t2.DEFAULT_COLOR = 0, t2.DEFAULT_ATTR = 256 | t2.DEFAULT_COLOR << 9, t2.DEFAULT_EXT = 0, t2.CHAR_DATA_ATTR_INDEX = 0, t2.CHAR_DATA_CHAR_INDEX = 1, t2.CHAR_DATA_WIDTH_INDEX = 2, t2.CHAR_DATA_CODE_INDEX = 3, t2.NULL_CELL_CHAR = "", t2.NULL_CELL_WIDTH = 1, t2.NULL_CELL_CODE = 0, t2.WHITESPACE_CELL_CHAR = " ", t2.WHITESPACE_CELL_WIDTH = 1, t2.WHITESPACE_CELL_CODE = 32; + }, 4863: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Marker = void 0; + const s2 = i2(8460), r = i2(844); + class n { + get id() { + return this._id; + } + constructor(e3) { + this.line = e3, this.isDisposed = false, this._disposables = [], this._id = n._nextId++, this._onDispose = this.register(new s2.EventEmitter()), this.onDispose = this._onDispose.event; + } + dispose() { + this.isDisposed || (this.isDisposed = true, this.line = -1, this._onDispose.fire(), (0, r.disposeArray)(this._disposables), this._disposables.length = 0); + } + register(e3) { + return this._disposables.push(e3), e3; + } + } + t2.Marker = n, n._nextId = 1; + }, 7116: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.DEFAULT_CHARSET = t2.CHARSETS = void 0, t2.CHARSETS = {}, t2.DEFAULT_CHARSET = t2.CHARSETS.B, t2.CHARSETS[0] = { "`": "\u25C6", a: "\u2592", b: "\u2409", c: "\u240C", d: "\u240D", e: "\u240A", f: "\xB0", g: "\xB1", h: "\u2424", i: "\u240B", j: "\u2518", k: "\u2510", l: "\u250C", m: "\u2514", n: "\u253C", o: "\u23BA", p: "\u23BB", q: "\u2500", r: "\u23BC", s: "\u23BD", t: "\u251C", u: "\u2524", v: "\u2534", w: "\u252C", x: "\u2502", y: "\u2264", z: "\u2265", "{": "\u03C0", "|": "\u2260", "}": "\xA3", "~": "\xB7" }, t2.CHARSETS.A = { "#": "\xA3" }, t2.CHARSETS.B = void 0, t2.CHARSETS[4] = { "#": "\xA3", "@": "\xBE", "[": "ij", "\\": "\xBD", "]": "|", "{": "\xA8", "|": "f", "}": "\xBC", "~": "\xB4" }, t2.CHARSETS.C = t2.CHARSETS[5] = { "[": "\xC4", "\\": "\xD6", "]": "\xC5", "^": "\xDC", "`": "\xE9", "{": "\xE4", "|": "\xF6", "}": "\xE5", "~": "\xFC" }, t2.CHARSETS.R = { "#": "\xA3", "@": "\xE0", "[": "\xB0", "\\": "\xE7", "]": "\xA7", "{": "\xE9", "|": "\xF9", "}": "\xE8", "~": "\xA8" }, t2.CHARSETS.Q = { "@": "\xE0", "[": "\xE2", "\\": "\xE7", "]": "\xEA", "^": "\xEE", "`": "\xF4", "{": "\xE9", "|": "\xF9", "}": "\xE8", "~": "\xFB" }, t2.CHARSETS.K = { "@": "\xA7", "[": "\xC4", "\\": "\xD6", "]": "\xDC", "{": "\xE4", "|": "\xF6", "}": "\xFC", "~": "\xDF" }, t2.CHARSETS.Y = { "#": "\xA3", "@": "\xA7", "[": "\xB0", "\\": "\xE7", "]": "\xE9", "`": "\xF9", "{": "\xE0", "|": "\xF2", "}": "\xE8", "~": "\xEC" }, t2.CHARSETS.E = t2.CHARSETS[6] = { "@": "\xC4", "[": "\xC6", "\\": "\xD8", "]": "\xC5", "^": "\xDC", "`": "\xE4", "{": "\xE6", "|": "\xF8", "}": "\xE5", "~": "\xFC" }, t2.CHARSETS.Z = { "#": "\xA3", "@": "\xA7", "[": "\xA1", "\\": "\xD1", "]": "\xBF", "{": "\xB0", "|": "\xF1", "}": "\xE7" }, t2.CHARSETS.H = t2.CHARSETS[7] = { "@": "\xC9", "[": "\xC4", "\\": "\xD6", "]": "\xC5", "^": "\xDC", "`": "\xE9", "{": "\xE4", "|": "\xF6", "}": "\xE5", "~": "\xFC" }, t2.CHARSETS["="] = { "#": "\xF9", "@": "\xE0", "[": "\xE9", "\\": "\xE7", "]": "\xEA", "^": "\xEE", _: "\xE8", "`": "\xF4", "{": "\xE4", "|": "\xF6", "}": "\xFC", "~": "\xFB" }; + }, 2584: (e2, t2) => { + var i2, s2, r; + Object.defineProperty(t2, "__esModule", { value: true }), t2.C1_ESCAPED = t2.C1 = t2.C0 = void 0, (function(e3) { + e3.NUL = "\0", e3.SOH = "", e3.STX = "", e3.ETX = "", e3.EOT = "", e3.ENQ = "", e3.ACK = "", e3.BEL = "\x07", e3.BS = "\b", e3.HT = " ", e3.LF = "\n", e3.VT = "\v", e3.FF = "\f", e3.CR = "\r", e3.SO = "", e3.SI = "", e3.DLE = "", e3.DC1 = "", e3.DC2 = "", e3.DC3 = "", e3.DC4 = "", e3.NAK = "", e3.SYN = "", e3.ETB = "", e3.CAN = "", e3.EM = "", e3.SUB = "", e3.ESC = "\x1B", e3.FS = "", e3.GS = "", e3.RS = "", e3.US = "", e3.SP = " ", e3.DEL = "\x7F"; + })(i2 || (t2.C0 = i2 = {})), (function(e3) { + e3.PAD = "\x80", e3.HOP = "\x81", e3.BPH = "\x82", e3.NBH = "\x83", e3.IND = "\x84", e3.NEL = "\x85", e3.SSA = "\x86", e3.ESA = "\x87", e3.HTS = "\x88", e3.HTJ = "\x89", e3.VTS = "\x8A", e3.PLD = "\x8B", e3.PLU = "\x8C", e3.RI = "\x8D", e3.SS2 = "\x8E", e3.SS3 = "\x8F", e3.DCS = "\x90", e3.PU1 = "\x91", e3.PU2 = "\x92", e3.STS = "\x93", e3.CCH = "\x94", e3.MW = "\x95", e3.SPA = "\x96", e3.EPA = "\x97", e3.SOS = "\x98", e3.SGCI = "\x99", e3.SCI = "\x9A", e3.CSI = "\x9B", e3.ST = "\x9C", e3.OSC = "\x9D", e3.PM = "\x9E", e3.APC = "\x9F"; + })(s2 || (t2.C1 = s2 = {})), (function(e3) { + e3.ST = `${i2.ESC}\\`; + })(r || (t2.C1_ESCAPED = r = {})); + }, 7399: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.evaluateKeyboardEvent = void 0; + const s2 = i2(2584), r = { 48: ["0", ")"], 49: ["1", "!"], 50: ["2", "@"], 51: ["3", "#"], 52: ["4", "$"], 53: ["5", "%"], 54: ["6", "^"], 55: ["7", "&"], 56: ["8", "*"], 57: ["9", "("], 186: [";", ":"], 187: ["=", "+"], 188: [",", "<"], 189: ["-", "_"], 190: [".", ">"], 191: ["/", "?"], 192: ["`", "~"], 219: ["[", "{"], 220: ["\\", "|"], 221: ["]", "}"], 222: ["'", '"'] }; + t2.evaluateKeyboardEvent = function(e3, t3, i3, n) { + const o = { type: 0, cancel: false, key: void 0 }, a = (e3.shiftKey ? 1 : 0) | (e3.altKey ? 2 : 0) | (e3.ctrlKey ? 4 : 0) | (e3.metaKey ? 8 : 0); + switch (e3.keyCode) { + case 0: + "UIKeyInputUpArrow" === e3.key ? o.key = t3 ? s2.C0.ESC + "OA" : s2.C0.ESC + "[A" : "UIKeyInputLeftArrow" === e3.key ? o.key = t3 ? s2.C0.ESC + "OD" : s2.C0.ESC + "[D" : "UIKeyInputRightArrow" === e3.key ? o.key = t3 ? s2.C0.ESC + "OC" : s2.C0.ESC + "[C" : "UIKeyInputDownArrow" === e3.key && (o.key = t3 ? s2.C0.ESC + "OB" : s2.C0.ESC + "[B"); + break; + case 8: + o.key = e3.ctrlKey ? "\b" : s2.C0.DEL, e3.altKey && (o.key = s2.C0.ESC + o.key); + break; + case 9: + if (e3.shiftKey) { + o.key = s2.C0.ESC + "[Z"; + break; + } + o.key = s2.C0.HT, o.cancel = true; + break; + case 13: + o.key = e3.altKey ? s2.C0.ESC + s2.C0.CR : s2.C0.CR, o.cancel = true; + break; + case 27: + o.key = s2.C0.ESC, e3.altKey && (o.key = s2.C0.ESC + s2.C0.ESC), o.cancel = true; + break; + case 37: + if (e3.metaKey) break; + a ? (o.key = s2.C0.ESC + "[1;" + (a + 1) + "D", o.key === s2.C0.ESC + "[1;3D" && (o.key = s2.C0.ESC + (i3 ? "b" : "[1;5D"))) : o.key = t3 ? s2.C0.ESC + "OD" : s2.C0.ESC + "[D"; + break; + case 39: + if (e3.metaKey) break; + a ? (o.key = s2.C0.ESC + "[1;" + (a + 1) + "C", o.key === s2.C0.ESC + "[1;3C" && (o.key = s2.C0.ESC + (i3 ? "f" : "[1;5C"))) : o.key = t3 ? s2.C0.ESC + "OC" : s2.C0.ESC + "[C"; + break; + case 38: + if (e3.metaKey) break; + a ? (o.key = s2.C0.ESC + "[1;" + (a + 1) + "A", i3 || o.key !== s2.C0.ESC + "[1;3A" || (o.key = s2.C0.ESC + "[1;5A")) : o.key = t3 ? s2.C0.ESC + "OA" : s2.C0.ESC + "[A"; + break; + case 40: + if (e3.metaKey) break; + a ? (o.key = s2.C0.ESC + "[1;" + (a + 1) + "B", i3 || o.key !== s2.C0.ESC + "[1;3B" || (o.key = s2.C0.ESC + "[1;5B")) : o.key = t3 ? s2.C0.ESC + "OB" : s2.C0.ESC + "[B"; + break; + case 45: + e3.shiftKey || e3.ctrlKey || (o.key = s2.C0.ESC + "[2~"); + break; + case 46: + o.key = a ? s2.C0.ESC + "[3;" + (a + 1) + "~" : s2.C0.ESC + "[3~"; + break; + case 36: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "H" : t3 ? s2.C0.ESC + "OH" : s2.C0.ESC + "[H"; + break; + case 35: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "F" : t3 ? s2.C0.ESC + "OF" : s2.C0.ESC + "[F"; + break; + case 33: + e3.shiftKey ? o.type = 2 : e3.ctrlKey ? o.key = s2.C0.ESC + "[5;" + (a + 1) + "~" : o.key = s2.C0.ESC + "[5~"; + break; + case 34: + e3.shiftKey ? o.type = 3 : e3.ctrlKey ? o.key = s2.C0.ESC + "[6;" + (a + 1) + "~" : o.key = s2.C0.ESC + "[6~"; + break; + case 112: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "P" : s2.C0.ESC + "OP"; + break; + case 113: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "Q" : s2.C0.ESC + "OQ"; + break; + case 114: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "R" : s2.C0.ESC + "OR"; + break; + case 115: + o.key = a ? s2.C0.ESC + "[1;" + (a + 1) + "S" : s2.C0.ESC + "OS"; + break; + case 116: + o.key = a ? s2.C0.ESC + "[15;" + (a + 1) + "~" : s2.C0.ESC + "[15~"; + break; + case 117: + o.key = a ? s2.C0.ESC + "[17;" + (a + 1) + "~" : s2.C0.ESC + "[17~"; + break; + case 118: + o.key = a ? s2.C0.ESC + "[18;" + (a + 1) + "~" : s2.C0.ESC + "[18~"; + break; + case 119: + o.key = a ? s2.C0.ESC + "[19;" + (a + 1) + "~" : s2.C0.ESC + "[19~"; + break; + case 120: + o.key = a ? s2.C0.ESC + "[20;" + (a + 1) + "~" : s2.C0.ESC + "[20~"; + break; + case 121: + o.key = a ? s2.C0.ESC + "[21;" + (a + 1) + "~" : s2.C0.ESC + "[21~"; + break; + case 122: + o.key = a ? s2.C0.ESC + "[23;" + (a + 1) + "~" : s2.C0.ESC + "[23~"; + break; + case 123: + o.key = a ? s2.C0.ESC + "[24;" + (a + 1) + "~" : s2.C0.ESC + "[24~"; + break; + default: + if (!e3.ctrlKey || e3.shiftKey || e3.altKey || e3.metaKey) if (i3 && !n || !e3.altKey || e3.metaKey) !i3 || e3.altKey || e3.ctrlKey || e3.shiftKey || !e3.metaKey ? e3.key && !e3.ctrlKey && !e3.altKey && !e3.metaKey && e3.keyCode >= 48 && 1 === e3.key.length ? o.key = e3.key : e3.key && e3.ctrlKey && ("_" === e3.key && (o.key = s2.C0.US), "@" === e3.key && (o.key = s2.C0.NUL)) : 65 === e3.keyCode && (o.type = 1); + else { + const t4 = r[e3.keyCode], i4 = t4 == null ? void 0 : t4[e3.shiftKey ? 1 : 0]; + if (i4) o.key = s2.C0.ESC + i4; + else if (e3.keyCode >= 65 && e3.keyCode <= 90) { + const t5 = e3.ctrlKey ? e3.keyCode - 64 : e3.keyCode + 32; + let i5 = String.fromCharCode(t5); + e3.shiftKey && (i5 = i5.toUpperCase()), o.key = s2.C0.ESC + i5; + } else if (32 === e3.keyCode) o.key = s2.C0.ESC + (e3.ctrlKey ? s2.C0.NUL : " "); + else if ("Dead" === e3.key && e3.code.startsWith("Key")) { + let t5 = e3.code.slice(3, 4); + e3.shiftKey || (t5 = t5.toLowerCase()), o.key = s2.C0.ESC + t5, o.cancel = true; + } + } + else e3.keyCode >= 65 && e3.keyCode <= 90 ? o.key = String.fromCharCode(e3.keyCode - 64) : 32 === e3.keyCode ? o.key = s2.C0.NUL : e3.keyCode >= 51 && e3.keyCode <= 55 ? o.key = String.fromCharCode(e3.keyCode - 51 + 27) : 56 === e3.keyCode ? o.key = s2.C0.DEL : 219 === e3.keyCode ? o.key = s2.C0.ESC : 220 === e3.keyCode ? o.key = s2.C0.FS : 221 === e3.keyCode && (o.key = s2.C0.GS); + } + return o; + }; + }, 482: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Utf8ToUtf32 = t2.StringToUtf32 = t2.utf32ToString = t2.stringFromCodePoint = void 0, t2.stringFromCodePoint = function(e3) { + return e3 > 65535 ? (e3 -= 65536, String.fromCharCode(55296 + (e3 >> 10)) + String.fromCharCode(e3 % 1024 + 56320)) : String.fromCharCode(e3); + }, t2.utf32ToString = function(e3, t3 = 0, i2 = e3.length) { + let s2 = ""; + for (let r = t3; r < i2; ++r) { + let t4 = e3[r]; + t4 > 65535 ? (t4 -= 65536, s2 += String.fromCharCode(55296 + (t4 >> 10)) + String.fromCharCode(t4 % 1024 + 56320)) : s2 += String.fromCharCode(t4); + } + return s2; + }, t2.StringToUtf32 = class { + constructor() { + this._interim = 0; + } + clear() { + this._interim = 0; + } + decode(e3, t3) { + const i2 = e3.length; + if (!i2) return 0; + let s2 = 0, r = 0; + if (this._interim) { + const i3 = e3.charCodeAt(r++); + 56320 <= i3 && i3 <= 57343 ? t3[s2++] = 1024 * (this._interim - 55296) + i3 - 56320 + 65536 : (t3[s2++] = this._interim, t3[s2++] = i3), this._interim = 0; + } + for (let n = r; n < i2; ++n) { + const r2 = e3.charCodeAt(n); + if (55296 <= r2 && r2 <= 56319) { + if (++n >= i2) return this._interim = r2, s2; + const o = e3.charCodeAt(n); + 56320 <= o && o <= 57343 ? t3[s2++] = 1024 * (r2 - 55296) + o - 56320 + 65536 : (t3[s2++] = r2, t3[s2++] = o); + } else 65279 !== r2 && (t3[s2++] = r2); + } + return s2; + } + }, t2.Utf8ToUtf32 = class { + constructor() { + this.interim = new Uint8Array(3); + } + clear() { + this.interim.fill(0); + } + decode(e3, t3) { + const i2 = e3.length; + if (!i2) return 0; + let s2, r, n, o, a = 0, h = 0, c = 0; + if (this.interim[0]) { + let s3 = false, r2 = this.interim[0]; + r2 &= 192 == (224 & r2) ? 31 : 224 == (240 & r2) ? 15 : 7; + let n2, o2 = 0; + for (; (n2 = 63 & this.interim[++o2]) && o2 < 4; ) r2 <<= 6, r2 |= n2; + const h2 = 192 == (224 & this.interim[0]) ? 2 : 224 == (240 & this.interim[0]) ? 3 : 4, l2 = h2 - o2; + for (; c < l2; ) { + if (c >= i2) return 0; + if (n2 = e3[c++], 128 != (192 & n2)) { + c--, s3 = true; + break; + } + this.interim[o2++] = n2, r2 <<= 6, r2 |= 63 & n2; + } + s3 || (2 === h2 ? r2 < 128 ? c-- : t3[a++] = r2 : 3 === h2 ? r2 < 2048 || r2 >= 55296 && r2 <= 57343 || 65279 === r2 || (t3[a++] = r2) : r2 < 65536 || r2 > 1114111 || (t3[a++] = r2)), this.interim.fill(0); + } + const l = i2 - 4; + let d = c; + for (; d < i2; ) { + for (; !(!(d < l) || 128 & (s2 = e3[d]) || 128 & (r = e3[d + 1]) || 128 & (n = e3[d + 2]) || 128 & (o = e3[d + 3])); ) t3[a++] = s2, t3[a++] = r, t3[a++] = n, t3[a++] = o, d += 4; + if (s2 = e3[d++], s2 < 128) t3[a++] = s2; + else if (192 == (224 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (h = (31 & s2) << 6 | 63 & r, h < 128) { + d--; + continue; + } + t3[a++] = h; + } else if (224 == (240 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, a; + if (n = e3[d++], 128 != (192 & n)) { + d--; + continue; + } + if (h = (15 & s2) << 12 | (63 & r) << 6 | 63 & n, h < 2048 || h >= 55296 && h <= 57343 || 65279 === h) continue; + t3[a++] = h; + } else if (240 == (248 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, a; + if (n = e3[d++], 128 != (192 & n)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, this.interim[2] = n, a; + if (o = e3[d++], 128 != (192 & o)) { + d--; + continue; + } + if (h = (7 & s2) << 18 | (63 & r) << 12 | (63 & n) << 6 | 63 & o, h < 65536 || h > 1114111) continue; + t3[a++] = h; + } + } + return a; + } + }; + }, 225: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.UnicodeV6 = void 0; + const s2 = i2(1480), r = [[768, 879], [1155, 1158], [1160, 1161], [1425, 1469], [1471, 1471], [1473, 1474], [1476, 1477], [1479, 1479], [1536, 1539], [1552, 1557], [1611, 1630], [1648, 1648], [1750, 1764], [1767, 1768], [1770, 1773], [1807, 1807], [1809, 1809], [1840, 1866], [1958, 1968], [2027, 2035], [2305, 2306], [2364, 2364], [2369, 2376], [2381, 2381], [2385, 2388], [2402, 2403], [2433, 2433], [2492, 2492], [2497, 2500], [2509, 2509], [2530, 2531], [2561, 2562], [2620, 2620], [2625, 2626], [2631, 2632], [2635, 2637], [2672, 2673], [2689, 2690], [2748, 2748], [2753, 2757], [2759, 2760], [2765, 2765], [2786, 2787], [2817, 2817], [2876, 2876], [2879, 2879], [2881, 2883], [2893, 2893], [2902, 2902], [2946, 2946], [3008, 3008], [3021, 3021], [3134, 3136], [3142, 3144], [3146, 3149], [3157, 3158], [3260, 3260], [3263, 3263], [3270, 3270], [3276, 3277], [3298, 3299], [3393, 3395], [3405, 3405], [3530, 3530], [3538, 3540], [3542, 3542], [3633, 3633], [3636, 3642], [3655, 3662], [3761, 3761], [3764, 3769], [3771, 3772], [3784, 3789], [3864, 3865], [3893, 3893], [3895, 3895], [3897, 3897], [3953, 3966], [3968, 3972], [3974, 3975], [3984, 3991], [3993, 4028], [4038, 4038], [4141, 4144], [4146, 4146], [4150, 4151], [4153, 4153], [4184, 4185], [4448, 4607], [4959, 4959], [5906, 5908], [5938, 5940], [5970, 5971], [6002, 6003], [6068, 6069], [6071, 6077], [6086, 6086], [6089, 6099], [6109, 6109], [6155, 6157], [6313, 6313], [6432, 6434], [6439, 6440], [6450, 6450], [6457, 6459], [6679, 6680], [6912, 6915], [6964, 6964], [6966, 6970], [6972, 6972], [6978, 6978], [7019, 7027], [7616, 7626], [7678, 7679], [8203, 8207], [8234, 8238], [8288, 8291], [8298, 8303], [8400, 8431], [12330, 12335], [12441, 12442], [43014, 43014], [43019, 43019], [43045, 43046], [64286, 64286], [65024, 65039], [65056, 65059], [65279, 65279], [65529, 65531]], n = [[68097, 68099], [68101, 68102], [68108, 68111], [68152, 68154], [68159, 68159], [119143, 119145], [119155, 119170], [119173, 119179], [119210, 119213], [119362, 119364], [917505, 917505], [917536, 917631], [917760, 917999]]; + let o; + t2.UnicodeV6 = class { + constructor() { + if (this.version = "6", !o) { + o = new Uint8Array(65536), o.fill(1), o[0] = 0, o.fill(0, 1, 32), o.fill(0, 127, 160), o.fill(2, 4352, 4448), o[9001] = 2, o[9002] = 2, o.fill(2, 11904, 42192), o[12351] = 1, o.fill(2, 44032, 55204), o.fill(2, 63744, 64256), o.fill(2, 65040, 65050), o.fill(2, 65072, 65136), o.fill(2, 65280, 65377), o.fill(2, 65504, 65511); + for (let e3 = 0; e3 < r.length; ++e3) o.fill(0, r[e3][0], r[e3][1] + 1); + } + } + wcwidth(e3) { + return e3 < 32 ? 0 : e3 < 127 ? 1 : e3 < 65536 ? o[e3] : (function(e4, t3) { + let i3, s3 = 0, r2 = t3.length - 1; + if (e4 < t3[0][0] || e4 > t3[r2][1]) return false; + for (; r2 >= s3; ) if (i3 = s3 + r2 >> 1, e4 > t3[i3][1]) s3 = i3 + 1; + else { + if (!(e4 < t3[i3][0])) return true; + r2 = i3 - 1; + } + return false; + })(e3, n) ? 0 : e3 >= 131072 && e3 <= 196605 || e3 >= 196608 && e3 <= 262141 ? 2 : 1; + } + charProperties(e3, t3) { + let i3 = this.wcwidth(e3), r2 = 0 === i3 && 0 !== t3; + if (r2) { + const e4 = s2.UnicodeService.extractWidth(t3); + 0 === e4 ? r2 = false : e4 > i3 && (i3 = e4); + } + return s2.UnicodeService.createPropertyValue(0, i3, r2); + } + }; + }, 5981: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.WriteBuffer = void 0; + const s2 = i2(8460), r = i2(844); + class n extends r.Disposable { + constructor(e3) { + super(), this._action = e3, this._writeBuffer = [], this._callbacks = [], this._pendingData = 0, this._bufferOffset = 0, this._isSyncWriting = false, this._syncCalls = 0, this._didUserInput = false, this._onWriteParsed = this.register(new s2.EventEmitter()), this.onWriteParsed = this._onWriteParsed.event; + } + handleUserInput() { + this._didUserInput = true; + } + writeSync(e3, t3) { + if (void 0 !== t3 && this._syncCalls > t3) return void (this._syncCalls = 0); + if (this._pendingData += e3.length, this._writeBuffer.push(e3), this._callbacks.push(void 0), this._syncCalls++, this._isSyncWriting) return; + let i3; + for (this._isSyncWriting = true; i3 = this._writeBuffer.shift(); ) { + this._action(i3); + const e4 = this._callbacks.shift(); + e4 && e4(); + } + this._pendingData = 0, this._bufferOffset = 2147483647, this._isSyncWriting = false, this._syncCalls = 0; + } + write(e3, t3) { + if (this._pendingData > 5e7) throw new Error("write data discarded, use flow control to avoid losing data"); + if (!this._writeBuffer.length) { + if (this._bufferOffset = 0, this._didUserInput) return this._didUserInput = false, this._pendingData += e3.length, this._writeBuffer.push(e3), this._callbacks.push(t3), void this._innerWrite(); + setTimeout((() => this._innerWrite())); + } + this._pendingData += e3.length, this._writeBuffer.push(e3), this._callbacks.push(t3); + } + _innerWrite(e3 = 0, t3 = true) { + const i3 = e3 || Date.now(); + for (; this._writeBuffer.length > this._bufferOffset; ) { + const e4 = this._writeBuffer[this._bufferOffset], s3 = this._action(e4, t3); + if (s3) { + const e5 = (e6) => Date.now() - i3 >= 12 ? setTimeout((() => this._innerWrite(0, e6))) : this._innerWrite(i3, e6); + return void s3.catch(((e6) => (queueMicrotask((() => { + throw e6; + })), Promise.resolve(false)))).then(e5); + } + const r2 = this._callbacks[this._bufferOffset]; + if (r2 && r2(), this._bufferOffset++, this._pendingData -= e4.length, Date.now() - i3 >= 12) break; + } + this._writeBuffer.length > this._bufferOffset ? (this._bufferOffset > 50 && (this._writeBuffer = this._writeBuffer.slice(this._bufferOffset), this._callbacks = this._callbacks.slice(this._bufferOffset), this._bufferOffset = 0), setTimeout((() => this._innerWrite()))) : (this._writeBuffer.length = 0, this._callbacks.length = 0, this._pendingData = 0, this._bufferOffset = 0), this._onWriteParsed.fire(); + } + } + t2.WriteBuffer = n; + }, 5941: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.toRgbString = t2.parseColor = void 0; + const i2 = /^([\da-f])\/([\da-f])\/([\da-f])$|^([\da-f]{2})\/([\da-f]{2})\/([\da-f]{2})$|^([\da-f]{3})\/([\da-f]{3})\/([\da-f]{3})$|^([\da-f]{4})\/([\da-f]{4})\/([\da-f]{4})$/, s2 = /^[\da-f]+$/; + function r(e3, t3) { + const i3 = e3.toString(16), s3 = i3.length < 2 ? "0" + i3 : i3; + switch (t3) { + case 4: + return i3[0]; + case 8: + return s3; + case 12: + return (s3 + s3).slice(0, 3); + default: + return s3 + s3; + } + } + t2.parseColor = function(e3) { + if (!e3) return; + let t3 = e3.toLowerCase(); + if (0 === t3.indexOf("rgb:")) { + t3 = t3.slice(4); + const e4 = i2.exec(t3); + if (e4) { + const t4 = e4[1] ? 15 : e4[4] ? 255 : e4[7] ? 4095 : 65535; + return [Math.round(parseInt(e4[1] || e4[4] || e4[7] || e4[10], 16) / t4 * 255), Math.round(parseInt(e4[2] || e4[5] || e4[8] || e4[11], 16) / t4 * 255), Math.round(parseInt(e4[3] || e4[6] || e4[9] || e4[12], 16) / t4 * 255)]; + } + } else if (0 === t3.indexOf("#") && (t3 = t3.slice(1), s2.exec(t3) && [3, 6, 9, 12].includes(t3.length))) { + const e4 = t3.length / 3, i3 = [0, 0, 0]; + for (let s3 = 0; s3 < 3; ++s3) { + const r2 = parseInt(t3.slice(e4 * s3, e4 * s3 + e4), 16); + i3[s3] = 1 === e4 ? r2 << 4 : 2 === e4 ? r2 : 3 === e4 ? r2 >> 4 : r2 >> 8; + } + return i3; + } + }, t2.toRgbString = function(e3, t3 = 16) { + const [i3, s3, n] = e3; + return `rgb:${r(i3, t3)}/${r(s3, t3)}/${r(n, t3)}`; + }; + }, 5770: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.PAYLOAD_LIMIT = void 0, t2.PAYLOAD_LIMIT = 1e7; + }, 6351: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.DcsHandler = t2.DcsParser = void 0; + const s2 = i2(482), r = i2(8742), n = i2(5770), o = []; + t2.DcsParser = class { + constructor() { + this._handlers = /* @__PURE__ */ Object.create(null), this._active = o, this._ident = 0, this._handlerFb = () => { + }, this._stack = { paused: false, loopPosition: 0, fallThrough: false }; + } + dispose() { + this._handlers = /* @__PURE__ */ Object.create(null), this._handlerFb = () => { + }, this._active = o; + } + registerHandler(e3, t3) { + void 0 === this._handlers[e3] && (this._handlers[e3] = []); + const i3 = this._handlers[e3]; + return i3.push(t3), { dispose: () => { + const e4 = i3.indexOf(t3); + -1 !== e4 && i3.splice(e4, 1); + } }; + } + clearHandler(e3) { + this._handlers[e3] && delete this._handlers[e3]; + } + setHandlerFallback(e3) { + this._handlerFb = e3; + } + reset() { + if (this._active.length) for (let e3 = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; e3 >= 0; --e3) this._active[e3].unhook(false); + this._stack.paused = false, this._active = o, this._ident = 0; + } + hook(e3, t3) { + if (this.reset(), this._ident = e3, this._active = this._handlers[e3] || o, this._active.length) for (let e4 = this._active.length - 1; e4 >= 0; e4--) this._active[e4].hook(t3); + else this._handlerFb(this._ident, "HOOK", t3); + } + put(e3, t3, i3) { + if (this._active.length) for (let s3 = this._active.length - 1; s3 >= 0; s3--) this._active[s3].put(e3, t3, i3); + else this._handlerFb(this._ident, "PUT", (0, s2.utf32ToString)(e3, t3, i3)); + } + unhook(e3, t3 = true) { + if (this._active.length) { + let i3 = false, s3 = this._active.length - 1, r2 = false; + if (this._stack.paused && (s3 = this._stack.loopPosition - 1, i3 = t3, r2 = this._stack.fallThrough, this._stack.paused = false), !r2 && false === i3) { + for (; s3 >= 0 && (i3 = this._active[s3].unhook(e3), true !== i3); s3--) if (i3 instanceof Promise) return this._stack.paused = true, this._stack.loopPosition = s3, this._stack.fallThrough = false, i3; + s3--; + } + for (; s3 >= 0; s3--) if (i3 = this._active[s3].unhook(false), i3 instanceof Promise) return this._stack.paused = true, this._stack.loopPosition = s3, this._stack.fallThrough = true, i3; + } else this._handlerFb(this._ident, "UNHOOK", e3); + this._active = o, this._ident = 0; + } + }; + const a = new r.Params(); + a.addParam(0), t2.DcsHandler = class { + constructor(e3) { + this._handler = e3, this._data = "", this._params = a, this._hitLimit = false; + } + hook(e3) { + this._params = e3.length > 1 || e3.params[0] ? e3.clone() : a, this._data = "", this._hitLimit = false; + } + put(e3, t3, i3) { + this._hitLimit || (this._data += (0, s2.utf32ToString)(e3, t3, i3), this._data.length > n.PAYLOAD_LIMIT && (this._data = "", this._hitLimit = true)); + } + unhook(e3) { + let t3 = false; + if (this._hitLimit) t3 = false; + else if (e3 && (t3 = this._handler(this._data, this._params), t3 instanceof Promise)) return t3.then(((e4) => (this._params = a, this._data = "", this._hitLimit = false, e4))); + return this._params = a, this._data = "", this._hitLimit = false, t3; + } + }; + }, 2015: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.EscapeSequenceParser = t2.VT500_TRANSITION_TABLE = t2.TransitionTable = void 0; + const s2 = i2(844), r = i2(8742), n = i2(6242), o = i2(6351); + class a { + constructor(e3) { + this.table = new Uint8Array(e3); + } + setDefault(e3, t3) { + this.table.fill(e3 << 4 | t3); + } + add(e3, t3, i3, s3) { + this.table[t3 << 8 | e3] = i3 << 4 | s3; + } + addMany(e3, t3, i3, s3) { + for (let r2 = 0; r2 < e3.length; r2++) this.table[t3 << 8 | e3[r2]] = i3 << 4 | s3; + } + } + t2.TransitionTable = a; + const h = 160; + t2.VT500_TRANSITION_TABLE = (function() { + const e3 = new a(4095), t3 = Array.apply(null, Array(256)).map(((e4, t4) => t4)), i3 = (e4, i4) => t3.slice(e4, i4), s3 = i3(32, 127), r2 = i3(0, 24); + r2.push(25), r2.push.apply(r2, i3(28, 32)); + const n2 = i3(0, 14); + let o2; + for (o2 in e3.setDefault(1, 0), e3.addMany(s3, 0, 2, 0), n2) e3.addMany([24, 26, 153, 154], o2, 3, 0), e3.addMany(i3(128, 144), o2, 3, 0), e3.addMany(i3(144, 152), o2, 3, 0), e3.add(156, o2, 0, 0), e3.add(27, o2, 11, 1), e3.add(157, o2, 4, 8), e3.addMany([152, 158, 159], o2, 0, 7), e3.add(155, o2, 11, 3), e3.add(144, o2, 11, 9); + return e3.addMany(r2, 0, 3, 0), e3.addMany(r2, 1, 3, 1), e3.add(127, 1, 0, 1), e3.addMany(r2, 8, 0, 8), e3.addMany(r2, 3, 3, 3), e3.add(127, 3, 0, 3), e3.addMany(r2, 4, 3, 4), e3.add(127, 4, 0, 4), e3.addMany(r2, 6, 3, 6), e3.addMany(r2, 5, 3, 5), e3.add(127, 5, 0, 5), e3.addMany(r2, 2, 3, 2), e3.add(127, 2, 0, 2), e3.add(93, 1, 4, 8), e3.addMany(s3, 8, 5, 8), e3.add(127, 8, 5, 8), e3.addMany([156, 27, 24, 26, 7], 8, 6, 0), e3.addMany(i3(28, 32), 8, 0, 8), e3.addMany([88, 94, 95], 1, 0, 7), e3.addMany(s3, 7, 0, 7), e3.addMany(r2, 7, 0, 7), e3.add(156, 7, 0, 0), e3.add(127, 7, 0, 7), e3.add(91, 1, 11, 3), e3.addMany(i3(64, 127), 3, 7, 0), e3.addMany(i3(48, 60), 3, 8, 4), e3.addMany([60, 61, 62, 63], 3, 9, 4), e3.addMany(i3(48, 60), 4, 8, 4), e3.addMany(i3(64, 127), 4, 7, 0), e3.addMany([60, 61, 62, 63], 4, 0, 6), e3.addMany(i3(32, 64), 6, 0, 6), e3.add(127, 6, 0, 6), e3.addMany(i3(64, 127), 6, 0, 0), e3.addMany(i3(32, 48), 3, 9, 5), e3.addMany(i3(32, 48), 5, 9, 5), e3.addMany(i3(48, 64), 5, 0, 6), e3.addMany(i3(64, 127), 5, 7, 0), e3.addMany(i3(32, 48), 4, 9, 5), e3.addMany(i3(32, 48), 1, 9, 2), e3.addMany(i3(32, 48), 2, 9, 2), e3.addMany(i3(48, 127), 2, 10, 0), e3.addMany(i3(48, 80), 1, 10, 0), e3.addMany(i3(81, 88), 1, 10, 0), e3.addMany([89, 90, 92], 1, 10, 0), e3.addMany(i3(96, 127), 1, 10, 0), e3.add(80, 1, 11, 9), e3.addMany(r2, 9, 0, 9), e3.add(127, 9, 0, 9), e3.addMany(i3(28, 32), 9, 0, 9), e3.addMany(i3(32, 48), 9, 9, 12), e3.addMany(i3(48, 60), 9, 8, 10), e3.addMany([60, 61, 62, 63], 9, 9, 10), e3.addMany(r2, 11, 0, 11), e3.addMany(i3(32, 128), 11, 0, 11), e3.addMany(i3(28, 32), 11, 0, 11), e3.addMany(r2, 10, 0, 10), e3.add(127, 10, 0, 10), e3.addMany(i3(28, 32), 10, 0, 10), e3.addMany(i3(48, 60), 10, 8, 10), e3.addMany([60, 61, 62, 63], 10, 0, 11), e3.addMany(i3(32, 48), 10, 9, 12), e3.addMany(r2, 12, 0, 12), e3.add(127, 12, 0, 12), e3.addMany(i3(28, 32), 12, 0, 12), e3.addMany(i3(32, 48), 12, 9, 12), e3.addMany(i3(48, 64), 12, 0, 11), e3.addMany(i3(64, 127), 12, 12, 13), e3.addMany(i3(64, 127), 10, 12, 13), e3.addMany(i3(64, 127), 9, 12, 13), e3.addMany(r2, 13, 13, 13), e3.addMany(s3, 13, 13, 13), e3.add(127, 13, 0, 13), e3.addMany([27, 156, 24, 26], 13, 14, 0), e3.add(h, 0, 2, 0), e3.add(h, 8, 5, 8), e3.add(h, 6, 0, 6), e3.add(h, 11, 0, 11), e3.add(h, 13, 13, 13), e3; + })(); + class c extends s2.Disposable { + constructor(e3 = t2.VT500_TRANSITION_TABLE) { + super(), this._transitions = e3, this._parseStack = { state: 0, handlers: [], handlerPos: 0, transition: 0, chunkPos: 0 }, this.initialState = 0, this.currentState = this.initialState, this._params = new r.Params(), this._params.addParam(0), this._collect = 0, this.precedingJoinState = 0, this._printHandlerFb = (e4, t3, i3) => { + }, this._executeHandlerFb = (e4) => { + }, this._csiHandlerFb = (e4, t3) => { + }, this._escHandlerFb = (e4) => { + }, this._errorHandlerFb = (e4) => e4, this._printHandler = this._printHandlerFb, this._executeHandlers = /* @__PURE__ */ Object.create(null), this._csiHandlers = /* @__PURE__ */ Object.create(null), this._escHandlers = /* @__PURE__ */ Object.create(null), this.register((0, s2.toDisposable)((() => { + this._csiHandlers = /* @__PURE__ */ Object.create(null), this._executeHandlers = /* @__PURE__ */ Object.create(null), this._escHandlers = /* @__PURE__ */ Object.create(null); + }))), this._oscParser = this.register(new n.OscParser()), this._dcsParser = this.register(new o.DcsParser()), this._errorHandler = this._errorHandlerFb, this.registerEscHandler({ final: "\\" }, (() => true)); + } + _identifier(e3, t3 = [64, 126]) { + let i3 = 0; + if (e3.prefix) { + if (e3.prefix.length > 1) throw new Error("only one byte as prefix supported"); + if (i3 = e3.prefix.charCodeAt(0), i3 && 60 > i3 || i3 > 63) throw new Error("prefix must be in range 0x3c .. 0x3f"); + } + if (e3.intermediates) { + if (e3.intermediates.length > 2) throw new Error("only two bytes as intermediates are supported"); + for (let t4 = 0; t4 < e3.intermediates.length; ++t4) { + const s4 = e3.intermediates.charCodeAt(t4); + if (32 > s4 || s4 > 47) throw new Error("intermediate must be in range 0x20 .. 0x2f"); + i3 <<= 8, i3 |= s4; + } + } + if (1 !== e3.final.length) throw new Error("final must be a single byte"); + const s3 = e3.final.charCodeAt(0); + if (t3[0] > s3 || s3 > t3[1]) throw new Error(`final must be in range ${t3[0]} .. ${t3[1]}`); + return i3 <<= 8, i3 |= s3, i3; + } + identToString(e3) { + const t3 = []; + for (; e3; ) t3.push(String.fromCharCode(255 & e3)), e3 >>= 8; + return t3.reverse().join(""); + } + setPrintHandler(e3) { + this._printHandler = e3; + } + clearPrintHandler() { + this._printHandler = this._printHandlerFb; + } + registerEscHandler(e3, t3) { + const i3 = this._identifier(e3, [48, 126]); + void 0 === this._escHandlers[i3] && (this._escHandlers[i3] = []); + const s3 = this._escHandlers[i3]; + return s3.push(t3), { dispose: () => { + const e4 = s3.indexOf(t3); + -1 !== e4 && s3.splice(e4, 1); + } }; + } + clearEscHandler(e3) { + this._escHandlers[this._identifier(e3, [48, 126])] && delete this._escHandlers[this._identifier(e3, [48, 126])]; + } + setEscHandlerFallback(e3) { + this._escHandlerFb = e3; + } + setExecuteHandler(e3, t3) { + this._executeHandlers[e3.charCodeAt(0)] = t3; + } + clearExecuteHandler(e3) { + this._executeHandlers[e3.charCodeAt(0)] && delete this._executeHandlers[e3.charCodeAt(0)]; + } + setExecuteHandlerFallback(e3) { + this._executeHandlerFb = e3; + } + registerCsiHandler(e3, t3) { + const i3 = this._identifier(e3); + void 0 === this._csiHandlers[i3] && (this._csiHandlers[i3] = []); + const s3 = this._csiHandlers[i3]; + return s3.push(t3), { dispose: () => { + const e4 = s3.indexOf(t3); + -1 !== e4 && s3.splice(e4, 1); + } }; + } + clearCsiHandler(e3) { + this._csiHandlers[this._identifier(e3)] && delete this._csiHandlers[this._identifier(e3)]; + } + setCsiHandlerFallback(e3) { + this._csiHandlerFb = e3; + } + registerDcsHandler(e3, t3) { + return this._dcsParser.registerHandler(this._identifier(e3), t3); + } + clearDcsHandler(e3) { + this._dcsParser.clearHandler(this._identifier(e3)); + } + setDcsHandlerFallback(e3) { + this._dcsParser.setHandlerFallback(e3); + } + registerOscHandler(e3, t3) { + return this._oscParser.registerHandler(e3, t3); + } + clearOscHandler(e3) { + this._oscParser.clearHandler(e3); + } + setOscHandlerFallback(e3) { + this._oscParser.setHandlerFallback(e3); + } + setErrorHandler(e3) { + this._errorHandler = e3; + } + clearErrorHandler() { + this._errorHandler = this._errorHandlerFb; + } + reset() { + this.currentState = this.initialState, this._oscParser.reset(), this._dcsParser.reset(), this._params.reset(), this._params.addParam(0), this._collect = 0, this.precedingJoinState = 0, 0 !== this._parseStack.state && (this._parseStack.state = 2, this._parseStack.handlers = []); + } + _preserveStack(e3, t3, i3, s3, r2) { + this._parseStack.state = e3, this._parseStack.handlers = t3, this._parseStack.handlerPos = i3, this._parseStack.transition = s3, this._parseStack.chunkPos = r2; + } + parse(e3, t3, i3) { + let s3, r2 = 0, n2 = 0, o2 = 0; + if (this._parseStack.state) if (2 === this._parseStack.state) this._parseStack.state = 0, o2 = this._parseStack.chunkPos + 1; + else { + if (void 0 === i3 || 1 === this._parseStack.state) throw this._parseStack.state = 1, new Error("improper continuation due to previous async handler, giving up parsing"); + const t4 = this._parseStack.handlers; + let n3 = this._parseStack.handlerPos - 1; + switch (this._parseStack.state) { + case 3: + if (false === i3 && n3 > -1) { + for (; n3 >= 0 && (s3 = t4[n3](this._params), true !== s3); n3--) if (s3 instanceof Promise) return this._parseStack.handlerPos = n3, s3; + } + this._parseStack.handlers = []; + break; + case 4: + if (false === i3 && n3 > -1) { + for (; n3 >= 0 && (s3 = t4[n3](), true !== s3); n3--) if (s3 instanceof Promise) return this._parseStack.handlerPos = n3, s3; + } + this._parseStack.handlers = []; + break; + case 6: + if (r2 = e3[this._parseStack.chunkPos], s3 = this._dcsParser.unhook(24 !== r2 && 26 !== r2, i3), s3) return s3; + 27 === r2 && (this._parseStack.transition |= 1), this._params.reset(), this._params.addParam(0), this._collect = 0; + break; + case 5: + if (r2 = e3[this._parseStack.chunkPos], s3 = this._oscParser.end(24 !== r2 && 26 !== r2, i3), s3) return s3; + 27 === r2 && (this._parseStack.transition |= 1), this._params.reset(), this._params.addParam(0), this._collect = 0; + } + this._parseStack.state = 0, o2 = this._parseStack.chunkPos + 1, this.precedingJoinState = 0, this.currentState = 15 & this._parseStack.transition; + } + for (let i4 = o2; i4 < t3; ++i4) { + switch (r2 = e3[i4], n2 = this._transitions.table[this.currentState << 8 | (r2 < 160 ? r2 : h)], n2 >> 4) { + case 2: + for (let s4 = i4 + 1; ; ++s4) { + if (s4 >= t3 || (r2 = e3[s4]) < 32 || r2 > 126 && r2 < h) { + this._printHandler(e3, i4, s4), i4 = s4 - 1; + break; + } + if (++s4 >= t3 || (r2 = e3[s4]) < 32 || r2 > 126 && r2 < h) { + this._printHandler(e3, i4, s4), i4 = s4 - 1; + break; + } + if (++s4 >= t3 || (r2 = e3[s4]) < 32 || r2 > 126 && r2 < h) { + this._printHandler(e3, i4, s4), i4 = s4 - 1; + break; + } + if (++s4 >= t3 || (r2 = e3[s4]) < 32 || r2 > 126 && r2 < h) { + this._printHandler(e3, i4, s4), i4 = s4 - 1; + break; + } + } + break; + case 3: + this._executeHandlers[r2] ? this._executeHandlers[r2]() : this._executeHandlerFb(r2), this.precedingJoinState = 0; + break; + case 0: + break; + case 1: + if (this._errorHandler({ position: i4, code: r2, currentState: this.currentState, collect: this._collect, params: this._params, abort: false }).abort) return; + break; + case 7: + const o3 = this._csiHandlers[this._collect << 8 | r2]; + let a2 = o3 ? o3.length - 1 : -1; + for (; a2 >= 0 && (s3 = o3[a2](this._params), true !== s3); a2--) if (s3 instanceof Promise) return this._preserveStack(3, o3, a2, n2, i4), s3; + a2 < 0 && this._csiHandlerFb(this._collect << 8 | r2, this._params), this.precedingJoinState = 0; + break; + case 8: + do { + switch (r2) { + case 59: + this._params.addParam(0); + break; + case 58: + this._params.addSubParam(-1); + break; + default: + this._params.addDigit(r2 - 48); + } + } while (++i4 < t3 && (r2 = e3[i4]) > 47 && r2 < 60); + i4--; + break; + case 9: + this._collect <<= 8, this._collect |= r2; + break; + case 10: + const c2 = this._escHandlers[this._collect << 8 | r2]; + let l = c2 ? c2.length - 1 : -1; + for (; l >= 0 && (s3 = c2[l](), true !== s3); l--) if (s3 instanceof Promise) return this._preserveStack(4, c2, l, n2, i4), s3; + l < 0 && this._escHandlerFb(this._collect << 8 | r2), this.precedingJoinState = 0; + break; + case 11: + this._params.reset(), this._params.addParam(0), this._collect = 0; + break; + case 12: + this._dcsParser.hook(this._collect << 8 | r2, this._params); + break; + case 13: + for (let s4 = i4 + 1; ; ++s4) if (s4 >= t3 || 24 === (r2 = e3[s4]) || 26 === r2 || 27 === r2 || r2 > 127 && r2 < h) { + this._dcsParser.put(e3, i4, s4), i4 = s4 - 1; + break; + } + break; + case 14: + if (s3 = this._dcsParser.unhook(24 !== r2 && 26 !== r2), s3) return this._preserveStack(6, [], 0, n2, i4), s3; + 27 === r2 && (n2 |= 1), this._params.reset(), this._params.addParam(0), this._collect = 0, this.precedingJoinState = 0; + break; + case 4: + this._oscParser.start(); + break; + case 5: + for (let s4 = i4 + 1; ; s4++) if (s4 >= t3 || (r2 = e3[s4]) < 32 || r2 > 127 && r2 < h) { + this._oscParser.put(e3, i4, s4), i4 = s4 - 1; + break; + } + break; + case 6: + if (s3 = this._oscParser.end(24 !== r2 && 26 !== r2), s3) return this._preserveStack(5, [], 0, n2, i4), s3; + 27 === r2 && (n2 |= 1), this._params.reset(), this._params.addParam(0), this._collect = 0, this.precedingJoinState = 0; + } + this.currentState = 15 & n2; + } + } + } + t2.EscapeSequenceParser = c; + }, 6242: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.OscHandler = t2.OscParser = void 0; + const s2 = i2(5770), r = i2(482), n = []; + t2.OscParser = class { + constructor() { + this._state = 0, this._active = n, this._id = -1, this._handlers = /* @__PURE__ */ Object.create(null), this._handlerFb = () => { + }, this._stack = { paused: false, loopPosition: 0, fallThrough: false }; + } + registerHandler(e3, t3) { + void 0 === this._handlers[e3] && (this._handlers[e3] = []); + const i3 = this._handlers[e3]; + return i3.push(t3), { dispose: () => { + const e4 = i3.indexOf(t3); + -1 !== e4 && i3.splice(e4, 1); + } }; + } + clearHandler(e3) { + this._handlers[e3] && delete this._handlers[e3]; + } + setHandlerFallback(e3) { + this._handlerFb = e3; + } + dispose() { + this._handlers = /* @__PURE__ */ Object.create(null), this._handlerFb = () => { + }, this._active = n; + } + reset() { + if (2 === this._state) for (let e3 = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; e3 >= 0; --e3) this._active[e3].end(false); + this._stack.paused = false, this._active = n, this._id = -1, this._state = 0; + } + _start() { + if (this._active = this._handlers[this._id] || n, this._active.length) for (let e3 = this._active.length - 1; e3 >= 0; e3--) this._active[e3].start(); + else this._handlerFb(this._id, "START"); + } + _put(e3, t3, i3) { + if (this._active.length) for (let s3 = this._active.length - 1; s3 >= 0; s3--) this._active[s3].put(e3, t3, i3); + else this._handlerFb(this._id, "PUT", (0, r.utf32ToString)(e3, t3, i3)); + } + start() { + this.reset(), this._state = 1; + } + put(e3, t3, i3) { + if (3 !== this._state) { + if (1 === this._state) for (; t3 < i3; ) { + const i4 = e3[t3++]; + if (59 === i4) { + this._state = 2, this._start(); + break; + } + if (i4 < 48 || 57 < i4) return void (this._state = 3); + -1 === this._id && (this._id = 0), this._id = 10 * this._id + i4 - 48; + } + 2 === this._state && i3 - t3 > 0 && this._put(e3, t3, i3); + } + } + end(e3, t3 = true) { + if (0 !== this._state) { + if (3 !== this._state) if (1 === this._state && this._start(), this._active.length) { + let i3 = false, s3 = this._active.length - 1, r2 = false; + if (this._stack.paused && (s3 = this._stack.loopPosition - 1, i3 = t3, r2 = this._stack.fallThrough, this._stack.paused = false), !r2 && false === i3) { + for (; s3 >= 0 && (i3 = this._active[s3].end(e3), true !== i3); s3--) if (i3 instanceof Promise) return this._stack.paused = true, this._stack.loopPosition = s3, this._stack.fallThrough = false, i3; + s3--; + } + for (; s3 >= 0; s3--) if (i3 = this._active[s3].end(false), i3 instanceof Promise) return this._stack.paused = true, this._stack.loopPosition = s3, this._stack.fallThrough = true, i3; + } else this._handlerFb(this._id, "END", e3); + this._active = n, this._id = -1, this._state = 0; + } + } + }, t2.OscHandler = class { + constructor(e3) { + this._handler = e3, this._data = "", this._hitLimit = false; + } + start() { + this._data = "", this._hitLimit = false; + } + put(e3, t3, i3) { + this._hitLimit || (this._data += (0, r.utf32ToString)(e3, t3, i3), this._data.length > s2.PAYLOAD_LIMIT && (this._data = "", this._hitLimit = true)); + } + end(e3) { + let t3 = false; + if (this._hitLimit) t3 = false; + else if (e3 && (t3 = this._handler(this._data), t3 instanceof Promise)) return t3.then(((e4) => (this._data = "", this._hitLimit = false, e4))); + return this._data = "", this._hitLimit = false, t3; + } + }; + }, 8742: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Params = void 0; + const i2 = 2147483647; + class s2 { + static fromArray(e3) { + const t3 = new s2(); + if (!e3.length) return t3; + for (let i3 = Array.isArray(e3[0]) ? 1 : 0; i3 < e3.length; ++i3) { + const s3 = e3[i3]; + if (Array.isArray(s3)) for (let e4 = 0; e4 < s3.length; ++e4) t3.addSubParam(s3[e4]); + else t3.addParam(s3); + } + return t3; + } + constructor(e3 = 32, t3 = 32) { + if (this.maxLength = e3, this.maxSubParamsLength = t3, t3 > 256) throw new Error("maxSubParamsLength must not be greater than 256"); + this.params = new Int32Array(e3), this.length = 0, this._subParams = new Int32Array(t3), this._subParamsLength = 0, this._subParamsIdx = new Uint16Array(e3), this._rejectDigits = false, this._rejectSubDigits = false, this._digitIsSub = false; + } + clone() { + const e3 = new s2(this.maxLength, this.maxSubParamsLength); + return e3.params.set(this.params), e3.length = this.length, e3._subParams.set(this._subParams), e3._subParamsLength = this._subParamsLength, e3._subParamsIdx.set(this._subParamsIdx), e3._rejectDigits = this._rejectDigits, e3._rejectSubDigits = this._rejectSubDigits, e3._digitIsSub = this._digitIsSub, e3; + } + toArray() { + const e3 = []; + for (let t3 = 0; t3 < this.length; ++t3) { + e3.push(this.params[t3]); + const i3 = this._subParamsIdx[t3] >> 8, s3 = 255 & this._subParamsIdx[t3]; + s3 - i3 > 0 && e3.push(Array.prototype.slice.call(this._subParams, i3, s3)); + } + return e3; + } + reset() { + this.length = 0, this._subParamsLength = 0, this._rejectDigits = false, this._rejectSubDigits = false, this._digitIsSub = false; + } + addParam(e3) { + if (this._digitIsSub = false, this.length >= this.maxLength) this._rejectDigits = true; + else { + if (e3 < -1) throw new Error("values lesser than -1 are not allowed"); + this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength, this.params[this.length++] = e3 > i2 ? i2 : e3; + } + } + addSubParam(e3) { + if (this._digitIsSub = true, this.length) if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) this._rejectSubDigits = true; + else { + if (e3 < -1) throw new Error("values lesser than -1 are not allowed"); + this._subParams[this._subParamsLength++] = e3 > i2 ? i2 : e3, this._subParamsIdx[this.length - 1]++; + } + } + hasSubParams(e3) { + return (255 & this._subParamsIdx[e3]) - (this._subParamsIdx[e3] >> 8) > 0; + } + getSubParams(e3) { + const t3 = this._subParamsIdx[e3] >> 8, i3 = 255 & this._subParamsIdx[e3]; + return i3 - t3 > 0 ? this._subParams.subarray(t3, i3) : null; + } + getSubParamsAll() { + const e3 = {}; + for (let t3 = 0; t3 < this.length; ++t3) { + const i3 = this._subParamsIdx[t3] >> 8, s3 = 255 & this._subParamsIdx[t3]; + s3 - i3 > 0 && (e3[t3] = this._subParams.slice(i3, s3)); + } + return e3; + } + addDigit(e3) { + let t3; + if (this._rejectDigits || !(t3 = this._digitIsSub ? this._subParamsLength : this.length) || this._digitIsSub && this._rejectSubDigits) return; + const s3 = this._digitIsSub ? this._subParams : this.params, r = s3[t3 - 1]; + s3[t3 - 1] = ~r ? Math.min(10 * r + e3, i2) : e3; + } + } + t2.Params = s2; + }, 5741: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.AddonManager = void 0, t2.AddonManager = class { + constructor() { + this._addons = []; + } + dispose() { + for (let e3 = this._addons.length - 1; e3 >= 0; e3--) this._addons[e3].instance.dispose(); + } + loadAddon(e3, t3) { + const i2 = { instance: t3, dispose: t3.dispose, isDisposed: false }; + this._addons.push(i2), t3.dispose = () => this._wrappedAddonDispose(i2), t3.activate(e3); + } + _wrappedAddonDispose(e3) { + if (e3.isDisposed) return; + let t3 = -1; + for (let i2 = 0; i2 < this._addons.length; i2++) if (this._addons[i2] === e3) { + t3 = i2; + break; + } + if (-1 === t3) throw new Error("Could not dispose an addon that has not been loaded"); + e3.isDisposed = true, e3.dispose.apply(e3.instance), this._addons.splice(t3, 1); + } + }; + }, 8771: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferApiView = void 0; + const s2 = i2(3785), r = i2(511); + t2.BufferApiView = class { + constructor(e3, t3) { + this._buffer = e3, this.type = t3; + } + init(e3) { + return this._buffer = e3, this; + } + get cursorY() { + return this._buffer.y; + } + get cursorX() { + return this._buffer.x; + } + get viewportY() { + return this._buffer.ydisp; + } + get baseY() { + return this._buffer.ybase; + } + get length() { + return this._buffer.lines.length; + } + getLine(e3) { + const t3 = this._buffer.lines.get(e3); + if (t3) return new s2.BufferLineApiView(t3); + } + getNullCell() { + return new r.CellData(); + } + }; + }, 3785: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferLineApiView = void 0; + const s2 = i2(511); + t2.BufferLineApiView = class { + constructor(e3) { + this._line = e3; + } + get isWrapped() { + return this._line.isWrapped; + } + get length() { + return this._line.length; + } + getCell(e3, t3) { + if (!(e3 < 0 || e3 >= this._line.length)) return t3 ? (this._line.loadCell(e3, t3), t3) : this._line.loadCell(e3, new s2.CellData()); + } + translateToString(e3, t3, i3) { + return this._line.translateToString(e3, t3, i3); + } + }; + }, 8285: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferNamespaceApi = void 0; + const s2 = i2(8771), r = i2(8460), n = i2(844); + class o extends n.Disposable { + constructor(e3) { + super(), this._core = e3, this._onBufferChange = this.register(new r.EventEmitter()), this.onBufferChange = this._onBufferChange.event, this._normal = new s2.BufferApiView(this._core.buffers.normal, "normal"), this._alternate = new s2.BufferApiView(this._core.buffers.alt, "alternate"), this._core.buffers.onBufferActivate((() => this._onBufferChange.fire(this.active))); + } + get active() { + if (this._core.buffers.active === this._core.buffers.normal) return this.normal; + if (this._core.buffers.active === this._core.buffers.alt) return this.alternate; + throw new Error("Active buffer is neither normal nor alternate"); + } + get normal() { + return this._normal.init(this._core.buffers.normal); + } + get alternate() { + return this._alternate.init(this._core.buffers.alt); + } + } + t2.BufferNamespaceApi = o; + }, 7975: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ParserApi = void 0, t2.ParserApi = class { + constructor(e3) { + this._core = e3; + } + registerCsiHandler(e3, t3) { + return this._core.registerCsiHandler(e3, ((e4) => t3(e4.toArray()))); + } + addCsiHandler(e3, t3) { + return this.registerCsiHandler(e3, t3); + } + registerDcsHandler(e3, t3) { + return this._core.registerDcsHandler(e3, ((e4, i2) => t3(e4, i2.toArray()))); + } + addDcsHandler(e3, t3) { + return this.registerDcsHandler(e3, t3); + } + registerEscHandler(e3, t3) { + return this._core.registerEscHandler(e3, t3); + } + addEscHandler(e3, t3) { + return this.registerEscHandler(e3, t3); + } + registerOscHandler(e3, t3) { + return this._core.registerOscHandler(e3, t3); + } + addOscHandler(e3, t3) { + return this.registerOscHandler(e3, t3); + } + }; + }, 7090: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.UnicodeApi = void 0, t2.UnicodeApi = class { + constructor(e3) { + this._core = e3; + } + register(e3) { + this._core.unicodeService.register(e3); + } + get versions() { + return this._core.unicodeService.versions; + } + get activeVersion() { + return this._core.unicodeService.activeVersion; + } + set activeVersion(e3) { + this._core.unicodeService.activeVersion = e3; + } + }; + }, 744: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.BufferService = t2.MINIMUM_ROWS = t2.MINIMUM_COLS = void 0; + const n = i2(8460), o = i2(844), a = i2(5295), h = i2(2585); + t2.MINIMUM_COLS = 2, t2.MINIMUM_ROWS = 1; + let c = t2.BufferService = class extends o.Disposable { + get buffer() { + return this.buffers.active; + } + constructor(e3) { + super(), this.isUserScrolling = false, this._onResize = this.register(new n.EventEmitter()), this.onResize = this._onResize.event, this._onScroll = this.register(new n.EventEmitter()), this.onScroll = this._onScroll.event, this.cols = Math.max(e3.rawOptions.cols || 0, t2.MINIMUM_COLS), this.rows = Math.max(e3.rawOptions.rows || 0, t2.MINIMUM_ROWS), this.buffers = this.register(new a.BufferSet(e3, this)); + } + resize(e3, t3) { + this.cols = e3, this.rows = t3, this.buffers.resize(e3, t3), this._onResize.fire({ cols: e3, rows: t3 }); + } + reset() { + this.buffers.reset(), this.isUserScrolling = false; + } + scroll(e3, t3 = false) { + const i3 = this.buffer; + let s3; + s3 = this._cachedBlankLine, s3 && s3.length === this.cols && s3.getFg(0) === e3.fg && s3.getBg(0) === e3.bg || (s3 = i3.getBlankLine(e3, t3), this._cachedBlankLine = s3), s3.isWrapped = t3; + const r2 = i3.ybase + i3.scrollTop, n2 = i3.ybase + i3.scrollBottom; + if (0 === i3.scrollTop) { + const e4 = i3.lines.isFull; + n2 === i3.lines.length - 1 ? e4 ? i3.lines.recycle().copyFrom(s3) : i3.lines.push(s3.clone()) : i3.lines.splice(n2 + 1, 0, s3.clone()), e4 ? this.isUserScrolling && (i3.ydisp = Math.max(i3.ydisp - 1, 0)) : (i3.ybase++, this.isUserScrolling || i3.ydisp++); + } else { + const e4 = n2 - r2 + 1; + i3.lines.shiftElements(r2 + 1, e4 - 1, -1), i3.lines.set(n2, s3.clone()); + } + this.isUserScrolling || (i3.ydisp = i3.ybase), this._onScroll.fire(i3.ydisp); + } + scrollLines(e3, t3, i3) { + const s3 = this.buffer; + if (e3 < 0) { + if (0 === s3.ydisp) return; + this.isUserScrolling = true; + } else e3 + s3.ydisp >= s3.ybase && (this.isUserScrolling = false); + const r2 = s3.ydisp; + s3.ydisp = Math.max(Math.min(s3.ydisp + e3, s3.ybase), 0), r2 !== s3.ydisp && (t3 || this._onScroll.fire(s3.ydisp)); + } + }; + t2.BufferService = c = s2([r(0, h.IOptionsService)], c); + }, 7994: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CharsetService = void 0, t2.CharsetService = class { + constructor() { + this.glevel = 0, this._charsets = []; + } + reset() { + this.charset = void 0, this._charsets = [], this.glevel = 0; + } + setgLevel(e3) { + this.glevel = e3, this.charset = this._charsets[e3]; + } + setgCharset(e3, t3) { + this._charsets[e3] = t3, this.glevel === e3 && (this.charset = t3); + } + }; + }, 1753: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.CoreMouseService = void 0; + const n = i2(2585), o = i2(8460), a = i2(844), h = { NONE: { events: 0, restrict: () => false }, X10: { events: 1, restrict: (e3) => 4 !== e3.button && 1 === e3.action && (e3.ctrl = false, e3.alt = false, e3.shift = false, true) }, VT200: { events: 19, restrict: (e3) => 32 !== e3.action }, DRAG: { events: 23, restrict: (e3) => 32 !== e3.action || 3 !== e3.button }, ANY: { events: 31, restrict: (e3) => true } }; + function c(e3, t3) { + let i3 = (e3.ctrl ? 16 : 0) | (e3.shift ? 4 : 0) | (e3.alt ? 8 : 0); + return 4 === e3.button ? (i3 |= 64, i3 |= e3.action) : (i3 |= 3 & e3.button, 4 & e3.button && (i3 |= 64), 8 & e3.button && (i3 |= 128), 32 === e3.action ? i3 |= 32 : 0 !== e3.action || t3 || (i3 |= 3)), i3; + } + const l = String.fromCharCode, d = { DEFAULT: (e3) => { + const t3 = [c(e3, false) + 32, e3.col + 32, e3.row + 32]; + return t3[0] > 255 || t3[1] > 255 || t3[2] > 255 ? "" : `\x1B[M${l(t3[0])}${l(t3[1])}${l(t3[2])}`; + }, SGR: (e3) => { + const t3 = 0 === e3.action && 4 !== e3.button ? "m" : "M"; + return `\x1B[<${c(e3, true)};${e3.col};${e3.row}${t3}`; + }, SGR_PIXELS: (e3) => { + const t3 = 0 === e3.action && 4 !== e3.button ? "m" : "M"; + return `\x1B[<${c(e3, true)};${e3.x};${e3.y}${t3}`; + } }; + let _ = t2.CoreMouseService = class extends a.Disposable { + constructor(e3, t3) { + super(), this._bufferService = e3, this._coreService = t3, this._protocols = {}, this._encodings = {}, this._activeProtocol = "", this._activeEncoding = "", this._lastEvent = null, this._onProtocolChange = this.register(new o.EventEmitter()), this.onProtocolChange = this._onProtocolChange.event; + for (const e4 of Object.keys(h)) this.addProtocol(e4, h[e4]); + for (const e4 of Object.keys(d)) this.addEncoding(e4, d[e4]); + this.reset(); + } + addProtocol(e3, t3) { + this._protocols[e3] = t3; + } + addEncoding(e3, t3) { + this._encodings[e3] = t3; + } + get activeProtocol() { + return this._activeProtocol; + } + get areMouseEventsActive() { + return 0 !== this._protocols[this._activeProtocol].events; + } + set activeProtocol(e3) { + if (!this._protocols[e3]) throw new Error(`unknown protocol "${e3}"`); + this._activeProtocol = e3, this._onProtocolChange.fire(this._protocols[e3].events); + } + get activeEncoding() { + return this._activeEncoding; + } + set activeEncoding(e3) { + if (!this._encodings[e3]) throw new Error(`unknown encoding "${e3}"`); + this._activeEncoding = e3; + } + reset() { + this.activeProtocol = "NONE", this.activeEncoding = "DEFAULT", this._lastEvent = null; + } + triggerMouseEvent(e3) { + if (e3.col < 0 || e3.col >= this._bufferService.cols || e3.row < 0 || e3.row >= this._bufferService.rows) return false; + if (4 === e3.button && 32 === e3.action) return false; + if (3 === e3.button && 32 !== e3.action) return false; + if (4 !== e3.button && (2 === e3.action || 3 === e3.action)) return false; + if (e3.col++, e3.row++, 32 === e3.action && this._lastEvent && this._equalEvents(this._lastEvent, e3, "SGR_PIXELS" === this._activeEncoding)) return false; + if (!this._protocols[this._activeProtocol].restrict(e3)) return false; + const t3 = this._encodings[this._activeEncoding](e3); + return t3 && ("DEFAULT" === this._activeEncoding ? this._coreService.triggerBinaryEvent(t3) : this._coreService.triggerDataEvent(t3, true)), this._lastEvent = e3, true; + } + explainEvents(e3) { + return { down: !!(1 & e3), up: !!(2 & e3), drag: !!(4 & e3), move: !!(8 & e3), wheel: !!(16 & e3) }; + } + _equalEvents(e3, t3, i3) { + if (i3) { + if (e3.x !== t3.x) return false; + if (e3.y !== t3.y) return false; + } else { + if (e3.col !== t3.col) return false; + if (e3.row !== t3.row) return false; + } + return e3.button === t3.button && e3.action === t3.action && e3.ctrl === t3.ctrl && e3.alt === t3.alt && e3.shift === t3.shift; + } + }; + t2.CoreMouseService = _ = s2([r(0, n.IBufferService), r(1, n.ICoreService)], _); + }, 6975: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.CoreService = void 0; + const n = i2(1439), o = i2(8460), a = i2(844), h = i2(2585), c = Object.freeze({ insertMode: false }), l = Object.freeze({ applicationCursorKeys: false, applicationKeypad: false, bracketedPasteMode: false, origin: false, reverseWraparound: false, sendFocus: false, wraparound: true }); + let d = t2.CoreService = class extends a.Disposable { + constructor(e3, t3, i3) { + super(), this._bufferService = e3, this._logService = t3, this._optionsService = i3, this.isCursorInitialized = false, this.isCursorHidden = false, this._onData = this.register(new o.EventEmitter()), this.onData = this._onData.event, this._onUserInput = this.register(new o.EventEmitter()), this.onUserInput = this._onUserInput.event, this._onBinary = this.register(new o.EventEmitter()), this.onBinary = this._onBinary.event, this._onRequestScrollToBottom = this.register(new o.EventEmitter()), this.onRequestScrollToBottom = this._onRequestScrollToBottom.event, this.modes = (0, n.clone)(c), this.decPrivateModes = (0, n.clone)(l); + } + reset() { + this.modes = (0, n.clone)(c), this.decPrivateModes = (0, n.clone)(l); + } + triggerDataEvent(e3, t3 = false) { + if (this._optionsService.rawOptions.disableStdin) return; + const i3 = this._bufferService.buffer; + t3 && this._optionsService.rawOptions.scrollOnUserInput && i3.ybase !== i3.ydisp && this._onRequestScrollToBottom.fire(), t3 && this._onUserInput.fire(), this._logService.debug(`sending data "${e3}"`, (() => e3.split("").map(((e4) => e4.charCodeAt(0))))), this._onData.fire(e3); + } + triggerBinaryEvent(e3) { + this._optionsService.rawOptions.disableStdin || (this._logService.debug(`sending binary "${e3}"`, (() => e3.split("").map(((e4) => e4.charCodeAt(0))))), this._onBinary.fire(e3)); + } + }; + t2.CoreService = d = s2([r(0, h.IBufferService), r(1, h.ILogService), r(2, h.IOptionsService)], d); + }, 9074: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.DecorationService = void 0; + const s2 = i2(8055), r = i2(8460), n = i2(844), o = i2(6106); + let a = 0, h = 0; + class c extends n.Disposable { + get decorations() { + return this._decorations.values(); + } + constructor() { + super(), this._decorations = new o.SortedList(((e3) => e3 == null ? void 0 : e3.marker.line)), this._onDecorationRegistered = this.register(new r.EventEmitter()), this.onDecorationRegistered = this._onDecorationRegistered.event, this._onDecorationRemoved = this.register(new r.EventEmitter()), this.onDecorationRemoved = this._onDecorationRemoved.event, this.register((0, n.toDisposable)((() => this.reset()))); + } + registerDecoration(e3) { + if (e3.marker.isDisposed) return; + const t3 = new l(e3); + if (t3) { + const e4 = t3.marker.onDispose((() => t3.dispose())); + t3.onDispose((() => { + t3 && (this._decorations.delete(t3) && this._onDecorationRemoved.fire(t3), e4.dispose()); + })), this._decorations.insert(t3), this._onDecorationRegistered.fire(t3); + } + return t3; + } + reset() { + for (const e3 of this._decorations.values()) e3.dispose(); + this._decorations.clear(); + } + *getDecorationsAtCell(e3, t3, i3) { + let s3 = 0, r2 = 0; + for (const n2 of this._decorations.getKeyIterator(t3)) s3 = n2.options.x ?? 0, r2 = s3 + (n2.options.width ?? 1), e3 >= s3 && e3 < r2 && (!i3 || (n2.options.layer ?? "bottom") === i3) && (yield n2); + } + forEachDecorationAtCell(e3, t3, i3, s3) { + this._decorations.forEachByKey(t3, ((t4) => { + a = t4.options.x ?? 0, h = a + (t4.options.width ?? 1), e3 >= a && e3 < h && (!i3 || (t4.options.layer ?? "bottom") === i3) && s3(t4); + })); + } + } + t2.DecorationService = c; + class l extends n.Disposable { + get isDisposed() { + return this._isDisposed; + } + get backgroundColorRGB() { + return null === this._cachedBg && (this.options.backgroundColor ? this._cachedBg = s2.css.toColor(this.options.backgroundColor) : this._cachedBg = void 0), this._cachedBg; + } + get foregroundColorRGB() { + return null === this._cachedFg && (this.options.foregroundColor ? this._cachedFg = s2.css.toColor(this.options.foregroundColor) : this._cachedFg = void 0), this._cachedFg; + } + constructor(e3) { + super(), this.options = e3, this.onRenderEmitter = this.register(new r.EventEmitter()), this.onRender = this.onRenderEmitter.event, this._onDispose = this.register(new r.EventEmitter()), this.onDispose = this._onDispose.event, this._cachedBg = null, this._cachedFg = null, this.marker = e3.marker, this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position && (this.options.overviewRulerOptions.position = "full"); + } + dispose() { + this._onDispose.fire(), super.dispose(); + } + } + }, 4348: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.InstantiationService = t2.ServiceCollection = void 0; + const s2 = i2(2585), r = i2(8343); + class n { + constructor(...e3) { + this._entries = /* @__PURE__ */ new Map(); + for (const [t3, i3] of e3) this.set(t3, i3); + } + set(e3, t3) { + const i3 = this._entries.get(e3); + return this._entries.set(e3, t3), i3; + } + forEach(e3) { + for (const [t3, i3] of this._entries.entries()) e3(t3, i3); + } + has(e3) { + return this._entries.has(e3); + } + get(e3) { + return this._entries.get(e3); + } + } + t2.ServiceCollection = n, t2.InstantiationService = class { + constructor() { + this._services = new n(), this._services.set(s2.IInstantiationService, this); + } + setService(e3, t3) { + this._services.set(e3, t3); + } + getService(e3) { + return this._services.get(e3); + } + createInstance(e3, ...t3) { + const i3 = (0, r.getServiceDependencies)(e3).sort(((e4, t4) => e4.index - t4.index)), s3 = []; + for (const t4 of i3) { + const i4 = this._services.get(t4.id); + if (!i4) throw new Error(`[createInstance] ${e3.name} depends on UNKNOWN service ${t4.id}.`); + s3.push(i4); + } + const n2 = i3.length > 0 ? i3[0].index : t3.length; + if (t3.length !== n2) throw new Error(`[createInstance] First service dependency of ${e3.name} at position ${n2 + 1} conflicts with ${t3.length} static arguments`); + return new e3(...[...t3, ...s3]); + } + }; + }, 7866: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.traceCall = t2.setTraceLogger = t2.LogService = void 0; + const n = i2(844), o = i2(2585), a = { trace: o.LogLevelEnum.TRACE, debug: o.LogLevelEnum.DEBUG, info: o.LogLevelEnum.INFO, warn: o.LogLevelEnum.WARN, error: o.LogLevelEnum.ERROR, off: o.LogLevelEnum.OFF }; + let h, c = t2.LogService = class extends n.Disposable { + get logLevel() { + return this._logLevel; + } + constructor(e3) { + super(), this._optionsService = e3, this._logLevel = o.LogLevelEnum.OFF, this._updateLogLevel(), this.register(this._optionsService.onSpecificOptionChange("logLevel", (() => this._updateLogLevel()))), h = this; + } + _updateLogLevel() { + this._logLevel = a[this._optionsService.rawOptions.logLevel]; + } + _evalLazyOptionalParams(e3) { + for (let t3 = 0; t3 < e3.length; t3++) "function" == typeof e3[t3] && (e3[t3] = e3[t3]()); + } + _log(e3, t3, i3) { + this._evalLazyOptionalParams(i3), e3.call(console, (this._optionsService.options.logger ? "" : "xterm.js: ") + t3, ...i3); + } + trace(e3, ...t3) { + var _a; + this._logLevel <= o.LogLevelEnum.TRACE && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.trace.bind(this._optionsService.options.logger)) ?? console.log, e3, t3); + } + debug(e3, ...t3) { + var _a; + this._logLevel <= o.LogLevelEnum.DEBUG && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.debug.bind(this._optionsService.options.logger)) ?? console.log, e3, t3); + } + info(e3, ...t3) { + var _a; + this._logLevel <= o.LogLevelEnum.INFO && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.info.bind(this._optionsService.options.logger)) ?? console.info, e3, t3); + } + warn(e3, ...t3) { + var _a; + this._logLevel <= o.LogLevelEnum.WARN && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.warn.bind(this._optionsService.options.logger)) ?? console.warn, e3, t3); + } + error(e3, ...t3) { + var _a; + this._logLevel <= o.LogLevelEnum.ERROR && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.error.bind(this._optionsService.options.logger)) ?? console.error, e3, t3); + } + }; + t2.LogService = c = s2([r(0, o.IOptionsService)], c), t2.setTraceLogger = function(e3) { + h = e3; + }, t2.traceCall = function(e3, t3, i3) { + if ("function" != typeof i3.value) throw new Error("not supported"); + const s3 = i3.value; + i3.value = function(...e4) { + if (h.logLevel !== o.LogLevelEnum.TRACE) return s3.apply(this, e4); + h.trace(`GlyphRenderer#${s3.name}(${e4.map(((e5) => JSON.stringify(e5))).join(", ")})`); + const t4 = s3.apply(this, e4); + return h.trace(`GlyphRenderer#${s3.name} return`, t4), t4; + }; + }; + }, 7302: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.OptionsService = t2.DEFAULT_OPTIONS = void 0; + const s2 = i2(8460), r = i2(844), n = i2(6114); + t2.DEFAULT_OPTIONS = { cols: 80, rows: 24, cursorBlink: false, cursorStyle: "block", cursorWidth: 1, cursorInactiveStyle: "outline", customGlyphs: true, drawBoldTextInBrightColors: true, documentOverride: null, fastScrollModifier: "alt", fastScrollSensitivity: 5, fontFamily: "courier-new, courier, monospace", fontSize: 15, fontWeight: "normal", fontWeightBold: "bold", ignoreBracketedPasteMode: false, lineHeight: 1, letterSpacing: 0, linkHandler: null, logLevel: "info", logger: null, scrollback: 1e3, scrollOnUserInput: true, scrollSensitivity: 1, screenReaderMode: false, smoothScrollDuration: 0, macOptionIsMeta: false, macOptionClickForcesSelection: false, minimumContrastRatio: 1, disableStdin: false, allowProposedApi: false, allowTransparency: false, tabStopWidth: 8, theme: {}, rescaleOverlappingGlyphs: false, rightClickSelectsWord: n.isMac, windowOptions: {}, windowsMode: false, windowsPty: {}, wordSeparator: " ()[]{}',\"`", altClickMovesCursor: true, convertEol: false, termName: "xterm", cancelEvents: false, overviewRulerWidth: 0 }; + const o = ["normal", "bold", "100", "200", "300", "400", "500", "600", "700", "800", "900"]; + class a extends r.Disposable { + constructor(e3) { + super(), this._onOptionChange = this.register(new s2.EventEmitter()), this.onOptionChange = this._onOptionChange.event; + const i3 = { ...t2.DEFAULT_OPTIONS }; + for (const t3 in e3) if (t3 in i3) try { + const s3 = e3[t3]; + i3[t3] = this._sanitizeAndValidateOption(t3, s3); + } catch (e4) { + console.error(e4); + } + this.rawOptions = i3, this.options = { ...i3 }, this._setupOptions(), this.register((0, r.toDisposable)((() => { + this.rawOptions.linkHandler = null, this.rawOptions.documentOverride = null; + }))); + } + onSpecificOptionChange(e3, t3) { + return this.onOptionChange(((i3) => { + i3 === e3 && t3(this.rawOptions[e3]); + })); + } + onMultipleOptionChange(e3, t3) { + return this.onOptionChange(((i3) => { + -1 !== e3.indexOf(i3) && t3(); + })); + } + _setupOptions() { + const e3 = (e4) => { + if (!(e4 in t2.DEFAULT_OPTIONS)) throw new Error(`No option with key "${e4}"`); + return this.rawOptions[e4]; + }, i3 = (e4, i4) => { + if (!(e4 in t2.DEFAULT_OPTIONS)) throw new Error(`No option with key "${e4}"`); + i4 = this._sanitizeAndValidateOption(e4, i4), this.rawOptions[e4] !== i4 && (this.rawOptions[e4] = i4, this._onOptionChange.fire(e4)); + }; + for (const t3 in this.rawOptions) { + const s3 = { get: e3.bind(this, t3), set: i3.bind(this, t3) }; + Object.defineProperty(this.options, t3, s3); + } + } + _sanitizeAndValidateOption(e3, i3) { + switch (e3) { + case "cursorStyle": + if (i3 || (i3 = t2.DEFAULT_OPTIONS[e3]), !/* @__PURE__ */ (function(e4) { + return "block" === e4 || "underline" === e4 || "bar" === e4; + })(i3)) throw new Error(`"${i3}" is not a valid value for ${e3}`); + break; + case "wordSeparator": + i3 || (i3 = t2.DEFAULT_OPTIONS[e3]); + break; + case "fontWeight": + case "fontWeightBold": + if ("number" == typeof i3 && 1 <= i3 && i3 <= 1e3) break; + i3 = o.includes(i3) ? i3 : t2.DEFAULT_OPTIONS[e3]; + break; + case "cursorWidth": + i3 = Math.floor(i3); + case "lineHeight": + case "tabStopWidth": + if (i3 < 1) throw new Error(`${e3} cannot be less than 1, value: ${i3}`); + break; + case "minimumContrastRatio": + i3 = Math.max(1, Math.min(21, Math.round(10 * i3) / 10)); + break; + case "scrollback": + if ((i3 = Math.min(i3, 4294967295)) < 0) throw new Error(`${e3} cannot be less than 0, value: ${i3}`); + break; + case "fastScrollSensitivity": + case "scrollSensitivity": + if (i3 <= 0) throw new Error(`${e3} cannot be less than or equal to 0, value: ${i3}`); + break; + case "rows": + case "cols": + if (!i3 && 0 !== i3) throw new Error(`${e3} must be numeric, value: ${i3}`); + break; + case "windowsPty": + i3 = i3 ?? {}; + } + return i3; + } + } + t2.OptionsService = a; + }, 2660: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, n2 = arguments.length, o2 = n2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a = e3.length - 1; a >= 0; a--) (r2 = e3[a]) && (o2 = (n2 < 3 ? r2(o2) : n2 > 3 ? r2(t3, i3, o2) : r2(t3, i3)) || o2); + return n2 > 3 && o2 && Object.defineProperty(t3, i3, o2), o2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.OscLinkService = void 0; + const n = i2(2585); + let o = t2.OscLinkService = class { + constructor(e3) { + this._bufferService = e3, this._nextId = 1, this._entriesWithId = /* @__PURE__ */ new Map(), this._dataByLinkId = /* @__PURE__ */ new Map(); + } + registerLink(e3) { + const t3 = this._bufferService.buffer; + if (void 0 === e3.id) { + const i4 = t3.addMarker(t3.ybase + t3.y), s4 = { data: e3, id: this._nextId++, lines: [i4] }; + return i4.onDispose((() => this._removeMarkerFromLink(s4, i4))), this._dataByLinkId.set(s4.id, s4), s4.id; + } + const i3 = e3, s3 = this._getEntryIdKey(i3), r2 = this._entriesWithId.get(s3); + if (r2) return this.addLineToLink(r2.id, t3.ybase + t3.y), r2.id; + const n2 = t3.addMarker(t3.ybase + t3.y), o2 = { id: this._nextId++, key: this._getEntryIdKey(i3), data: i3, lines: [n2] }; + return n2.onDispose((() => this._removeMarkerFromLink(o2, n2))), this._entriesWithId.set(o2.key, o2), this._dataByLinkId.set(o2.id, o2), o2.id; + } + addLineToLink(e3, t3) { + const i3 = this._dataByLinkId.get(e3); + if (i3 && i3.lines.every(((e4) => e4.line !== t3))) { + const e4 = this._bufferService.buffer.addMarker(t3); + i3.lines.push(e4), e4.onDispose((() => this._removeMarkerFromLink(i3, e4))); + } + } + getLinkData(e3) { + var _a; + return (_a = this._dataByLinkId.get(e3)) == null ? void 0 : _a.data; + } + _getEntryIdKey(e3) { + return `${e3.id};;${e3.uri}`; + } + _removeMarkerFromLink(e3, t3) { + const i3 = e3.lines.indexOf(t3); + -1 !== i3 && (e3.lines.splice(i3, 1), 0 === e3.lines.length && (void 0 !== e3.data.id && this._entriesWithId.delete(e3.key), this._dataByLinkId.delete(e3.id))); + } + }; + t2.OscLinkService = o = s2([r(0, n.IBufferService)], o); + }, 8343: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.createDecorator = t2.getServiceDependencies = t2.serviceRegistry = void 0; + const i2 = "di$target", s2 = "di$dependencies"; + t2.serviceRegistry = /* @__PURE__ */ new Map(), t2.getServiceDependencies = function(e3) { + return e3[s2] || []; + }, t2.createDecorator = function(e3) { + if (t2.serviceRegistry.has(e3)) return t2.serviceRegistry.get(e3); + const r = function(e4, t3, n) { + if (3 !== arguments.length) throw new Error("@IServiceName-decorator can only be used to decorate a parameter"); + !(function(e5, t4, r2) { + t4[i2] === t4 ? t4[s2].push({ id: e5, index: r2 }) : (t4[s2] = [{ id: e5, index: r2 }], t4[i2] = t4); + })(r, e4, n); + }; + return r.toString = () => e3, t2.serviceRegistry.set(e3, r), r; + }; + }, 2585: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.IDecorationService = t2.IUnicodeService = t2.IOscLinkService = t2.IOptionsService = t2.ILogService = t2.LogLevelEnum = t2.IInstantiationService = t2.ICharsetService = t2.ICoreService = t2.ICoreMouseService = t2.IBufferService = void 0; + const s2 = i2(8343); + var r; + t2.IBufferService = (0, s2.createDecorator)("BufferService"), t2.ICoreMouseService = (0, s2.createDecorator)("CoreMouseService"), t2.ICoreService = (0, s2.createDecorator)("CoreService"), t2.ICharsetService = (0, s2.createDecorator)("CharsetService"), t2.IInstantiationService = (0, s2.createDecorator)("InstantiationService"), (function(e3) { + e3[e3.TRACE = 0] = "TRACE", e3[e3.DEBUG = 1] = "DEBUG", e3[e3.INFO = 2] = "INFO", e3[e3.WARN = 3] = "WARN", e3[e3.ERROR = 4] = "ERROR", e3[e3.OFF = 5] = "OFF"; + })(r || (t2.LogLevelEnum = r = {})), t2.ILogService = (0, s2.createDecorator)("LogService"), t2.IOptionsService = (0, s2.createDecorator)("OptionsService"), t2.IOscLinkService = (0, s2.createDecorator)("OscLinkService"), t2.IUnicodeService = (0, s2.createDecorator)("UnicodeService"), t2.IDecorationService = (0, s2.createDecorator)("DecorationService"); + }, 1480: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.UnicodeService = void 0; + const s2 = i2(8460), r = i2(225); + class n { + static extractShouldJoin(e3) { + return 0 != (1 & e3); + } + static extractWidth(e3) { + return e3 >> 1 & 3; + } + static extractCharKind(e3) { + return e3 >> 3; + } + static createPropertyValue(e3, t3, i3 = false) { + return (16777215 & e3) << 3 | (3 & t3) << 1 | (i3 ? 1 : 0); + } + constructor() { + this._providers = /* @__PURE__ */ Object.create(null), this._active = "", this._onChange = new s2.EventEmitter(), this.onChange = this._onChange.event; + const e3 = new r.UnicodeV6(); + this.register(e3), this._active = e3.version, this._activeProvider = e3; + } + dispose() { + this._onChange.dispose(); + } + get versions() { + return Object.keys(this._providers); + } + get activeVersion() { + return this._active; + } + set activeVersion(e3) { + if (!this._providers[e3]) throw new Error(`unknown Unicode version "${e3}"`); + this._active = e3, this._activeProvider = this._providers[e3], this._onChange.fire(e3); + } + register(e3) { + this._providers[e3.version] = e3; + } + wcwidth(e3) { + return this._activeProvider.wcwidth(e3); + } + getStringCellWidth(e3) { + let t3 = 0, i3 = 0; + const s3 = e3.length; + for (let r2 = 0; r2 < s3; ++r2) { + let o = e3.charCodeAt(r2); + if (55296 <= o && o <= 56319) { + if (++r2 >= s3) return t3 + this.wcwidth(o); + const i4 = e3.charCodeAt(r2); + 56320 <= i4 && i4 <= 57343 ? o = 1024 * (o - 55296) + i4 - 56320 + 65536 : t3 += this.wcwidth(i4); + } + const a = this.charProperties(o, i3); + let h = n.extractWidth(a); + n.extractShouldJoin(a) && (h -= n.extractWidth(i3)), t3 += h, i3 = a; + } + return t3; + } + charProperties(e3, t3) { + return this._activeProvider.charProperties(e3, t3); + } + } + t2.UnicodeService = n; + } }, t = {}; + function i(s2) { + var r = t[s2]; + if (void 0 !== r) return r.exports; + var n = t[s2] = { exports: {} }; + return e[s2].call(n.exports, n, n.exports, i), n.exports; + } + var s = {}; + return (() => { + var e2 = s; + Object.defineProperty(e2, "__esModule", { value: true }), e2.Terminal = void 0; + const t2 = i(9042), r = i(3236), n = i(844), o = i(5741), a = i(8285), h = i(7975), c = i(7090), l = ["cols", "rows"]; + class d extends n.Disposable { + constructor(e3) { + super(), this._core = this.register(new r.Terminal(e3)), this._addonManager = this.register(new o.AddonManager()), this._publicOptions = { ...this._core.options }; + const t3 = (e4) => this._core.options[e4], i2 = (e4, t4) => { + this._checkReadonlyOptions(e4), this._core.options[e4] = t4; + }; + for (const e4 in this._core.options) { + const s2 = { get: t3.bind(this, e4), set: i2.bind(this, e4) }; + Object.defineProperty(this._publicOptions, e4, s2); + } + } + _checkReadonlyOptions(e3) { + if (l.includes(e3)) throw new Error(`Option "${e3}" can only be set in the constructor`); + } + _checkProposedApi() { + if (!this._core.optionsService.rawOptions.allowProposedApi) throw new Error("You must set the allowProposedApi option to true to use proposed API"); + } + get onBell() { + return this._core.onBell; + } + get onBinary() { + return this._core.onBinary; + } + get onCursorMove() { + return this._core.onCursorMove; + } + get onData() { + return this._core.onData; + } + get onKey() { + return this._core.onKey; + } + get onLineFeed() { + return this._core.onLineFeed; + } + get onRender() { + return this._core.onRender; + } + get onResize() { + return this._core.onResize; + } + get onScroll() { + return this._core.onScroll; + } + get onSelectionChange() { + return this._core.onSelectionChange; + } + get onTitleChange() { + return this._core.onTitleChange; + } + get onWriteParsed() { + return this._core.onWriteParsed; + } + get element() { + return this._core.element; + } + get parser() { + return this._parser || (this._parser = new h.ParserApi(this._core)), this._parser; + } + get unicode() { + return this._checkProposedApi(), new c.UnicodeApi(this._core); + } + get textarea() { + return this._core.textarea; + } + get rows() { + return this._core.rows; + } + get cols() { + return this._core.cols; + } + get buffer() { + return this._buffer || (this._buffer = this.register(new a.BufferNamespaceApi(this._core))), this._buffer; + } + get markers() { + return this._checkProposedApi(), this._core.markers; + } + get modes() { + const e3 = this._core.coreService.decPrivateModes; + let t3 = "none"; + switch (this._core.coreMouseService.activeProtocol) { + case "X10": + t3 = "x10"; + break; + case "VT200": + t3 = "vt200"; + break; + case "DRAG": + t3 = "drag"; + break; + case "ANY": + t3 = "any"; + } + return { applicationCursorKeysMode: e3.applicationCursorKeys, applicationKeypadMode: e3.applicationKeypad, bracketedPasteMode: e3.bracketedPasteMode, insertMode: this._core.coreService.modes.insertMode, mouseTrackingMode: t3, originMode: e3.origin, reverseWraparoundMode: e3.reverseWraparound, sendFocusMode: e3.sendFocus, wraparoundMode: e3.wraparound }; + } + get options() { + return this._publicOptions; + } + set options(e3) { + for (const t3 in e3) this._publicOptions[t3] = e3[t3]; + } + blur() { + this._core.blur(); + } + focus() { + this._core.focus(); + } + input(e3, t3 = true) { + this._core.input(e3, t3); + } + resize(e3, t3) { + this._verifyIntegers(e3, t3), this._core.resize(e3, t3); + } + open(e3) { + this._core.open(e3); + } + attachCustomKeyEventHandler(e3) { + this._core.attachCustomKeyEventHandler(e3); + } + attachCustomWheelEventHandler(e3) { + this._core.attachCustomWheelEventHandler(e3); + } + registerLinkProvider(e3) { + return this._core.registerLinkProvider(e3); + } + registerCharacterJoiner(e3) { + return this._checkProposedApi(), this._core.registerCharacterJoiner(e3); + } + deregisterCharacterJoiner(e3) { + this._checkProposedApi(), this._core.deregisterCharacterJoiner(e3); + } + registerMarker(e3 = 0) { + return this._verifyIntegers(e3), this._core.registerMarker(e3); + } + registerDecoration(e3) { + return this._checkProposedApi(), this._verifyPositiveIntegers(e3.x ?? 0, e3.width ?? 0, e3.height ?? 0), this._core.registerDecoration(e3); + } + hasSelection() { + return this._core.hasSelection(); + } + select(e3, t3, i2) { + this._verifyIntegers(e3, t3, i2), this._core.select(e3, t3, i2); + } + getSelection() { + return this._core.getSelection(); + } + getSelectionPosition() { + return this._core.getSelectionPosition(); + } + clearSelection() { + this._core.clearSelection(); + } + selectAll() { + this._core.selectAll(); + } + selectLines(e3, t3) { + this._verifyIntegers(e3, t3), this._core.selectLines(e3, t3); + } + dispose() { + super.dispose(); + } + scrollLines(e3) { + this._verifyIntegers(e3), this._core.scrollLines(e3); + } + scrollPages(e3) { + this._verifyIntegers(e3), this._core.scrollPages(e3); + } + scrollToTop() { + this._core.scrollToTop(); + } + scrollToBottom() { + this._core.scrollToBottom(); + } + scrollToLine(e3) { + this._verifyIntegers(e3), this._core.scrollToLine(e3); + } + clear() { + this._core.clear(); + } + write(e3, t3) { + this._core.write(e3, t3); + } + writeln(e3, t3) { + this._core.write(e3), this._core.write("\r\n", t3); + } + paste(e3) { + this._core.paste(e3); + } + refresh(e3, t3) { + this._verifyIntegers(e3, t3), this._core.refresh(e3, t3); + } + reset() { + this._core.reset(); + } + clearTextureAtlas() { + this._core.clearTextureAtlas(); + } + loadAddon(e3) { + this._addonManager.loadAddon(this, e3); + } + static get strings() { + return t2; + } + _verifyIntegers(...e3) { + for (const t3 of e3) if (t3 === 1 / 0 || isNaN(t3) || t3 % 1 != 0) throw new Error("This API only accepts integers"); + } + _verifyPositiveIntegers(...e3) { + for (const t3 of e3) if (t3 && (t3 === 1 / 0 || isNaN(t3) || t3 % 1 != 0 || t3 < 0)) throw new Error("This API only accepts positive integers"); + } + } + e2.Terminal = d; + })(), s; + })())); + } +}); -// State -let ws = null; -let term = null; -let fitAddon = null; -let searchAddon = null; -let webglAddon = null; -let reconnectDelay = RECONNECT_BASE_MS; -let reconnectTimer = null; -let pingTimer = null; -let lastPingSent = 0; -let connected = false; +// node_modules/@xterm/addon-fit/lib/addon-fit.js +var require_addon_fit = __commonJS({ + "node_modules/@xterm/addon-fit/lib/addon-fit.js"(exports, module) { + "use strict"; + !(function(e, t) { + "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.FitAddon = t() : e.FitAddon = t(); + })(self, (() => (() => { + "use strict"; + var e = {}; + return (() => { + var t = e; + Object.defineProperty(t, "__esModule", { value: true }), t.FitAddon = void 0, t.FitAddon = class { + activate(e2) { + this._terminal = e2; + } + dispose() { + } + fit() { + const e2 = this.proposeDimensions(); + if (!e2 || !this._terminal || isNaN(e2.cols) || isNaN(e2.rows)) return; + const t2 = this._terminal._core; + this._terminal.rows === e2.rows && this._terminal.cols === e2.cols || (t2._renderService.clear(), this._terminal.resize(e2.cols, e2.rows)); + } + proposeDimensions() { + if (!this._terminal) return; + if (!this._terminal.element || !this._terminal.element.parentElement) return; + const e2 = this._terminal._core, t2 = e2._renderService.dimensions; + if (0 === t2.css.cell.width || 0 === t2.css.cell.height) return; + const r = 0 === this._terminal.options.scrollback ? 0 : e2.viewport.scrollBarWidth, i = window.getComputedStyle(this._terminal.element.parentElement), o = parseInt(i.getPropertyValue("height")), s = Math.max(0, parseInt(i.getPropertyValue("width"))), n = window.getComputedStyle(this._terminal.element), l = o - (parseInt(n.getPropertyValue("padding-top")) + parseInt(n.getPropertyValue("padding-bottom"))), a = s - (parseInt(n.getPropertyValue("padding-right")) + parseInt(n.getPropertyValue("padding-left"))) - r; + return { cols: Math.max(2, Math.floor(a / t2.css.cell.width)), rows: Math.max(1, Math.floor(l / t2.css.cell.height)) }; + } + }; + })(), e; + })())); + } +}); -// ── Theme ────────────────────────────────────────────────────────────── +// node_modules/@xterm/addon-web-links/lib/addon-web-links.js +var require_addon_web_links = __commonJS({ + "node_modules/@xterm/addon-web-links/lib/addon-web-links.js"(exports, module) { + "use strict"; + !(function(e, t) { + "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.WebLinksAddon = t() : e.WebLinksAddon = t(); + })(self, (() => (() => { + "use strict"; + var e = { 6: (e2, t2) => { + function n2(e3) { + try { + const t3 = new URL(e3), n3 = t3.password && t3.username ? `${t3.protocol}//${t3.username}:${t3.password}@${t3.host}` : t3.username ? `${t3.protocol}//${t3.username}@${t3.host}` : `${t3.protocol}//${t3.host}`; + return e3.toLocaleLowerCase().startsWith(n3.toLocaleLowerCase()); + } catch (e4) { + return false; + } + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.LinkComputer = t2.WebLinkProvider = void 0, t2.WebLinkProvider = class { + constructor(e3, t3, n3, o3 = {}) { + this._terminal = e3, this._regex = t3, this._handler = n3, this._options = o3; + } + provideLinks(e3, t3) { + const n3 = o2.computeLink(e3, this._regex, this._terminal, this._handler); + t3(this._addCallbacks(n3)); + } + _addCallbacks(e3) { + return e3.map(((e4) => (e4.leave = this._options.leave, e4.hover = (t3, n3) => { + if (this._options.hover) { + const { range: o3 } = e4; + this._options.hover(t3, n3, o3); + } + }, e4))); + } + }; + class o2 { + static computeLink(e3, t3, r, i) { + const s = new RegExp(t3.source, (t3.flags || "") + "g"), [a, c] = o2._getWindowedLineStrings(e3 - 1, r), l = a.join(""); + let d; + const p = []; + for (; d = s.exec(l); ) { + const e4 = d[0]; + if (!n2(e4)) continue; + const [t4, s2] = o2._mapStrIdx(r, c, 0, d.index), [a2, l2] = o2._mapStrIdx(r, t4, s2, e4.length); + if (-1 === t4 || -1 === s2 || -1 === a2 || -1 === l2) continue; + const h = { start: { x: s2 + 1, y: t4 + 1 }, end: { x: l2, y: a2 + 1 } }; + p.push({ range: h, text: e4, activate: i }); + } + return p; + } + static _getWindowedLineStrings(e3, t3) { + let n3, o3 = e3, r = e3, i = 0, s = ""; + const a = []; + if (n3 = t3.buffer.active.getLine(e3)) { + const e4 = n3.translateToString(true); + if (n3.isWrapped && " " !== e4[0]) { + for (i = 0; (n3 = t3.buffer.active.getLine(--o3)) && i < 2048 && (s = n3.translateToString(true), i += s.length, a.push(s), n3.isWrapped && -1 === s.indexOf(" ")); ) ; + a.reverse(); + } + for (a.push(e4), i = 0; (n3 = t3.buffer.active.getLine(++r)) && n3.isWrapped && i < 2048 && (s = n3.translateToString(true), i += s.length, a.push(s), -1 === s.indexOf(" ")); ) ; + } + return [a, o3]; + } + static _mapStrIdx(e3, t3, n3, o3) { + const r = e3.buffer.active, i = r.getNullCell(); + let s = n3; + for (; o3; ) { + const e4 = r.getLine(t3); + if (!e4) return [-1, -1]; + for (let n4 = s; n4 < e4.length; ++n4) { + e4.getCell(n4, i); + const s2 = i.getChars(); + if (i.getWidth() && (o3 -= s2.length || 1, n4 === e4.length - 1 && "" === s2)) { + const e5 = r.getLine(t3 + 1); + e5 && e5.isWrapped && (e5.getCell(0, i), 2 === i.getWidth() && (o3 += 1)); + } + if (o3 < 0) return [t3, n4]; + } + t3++, s = 0; + } + return [t3, s]; + } + } + t2.LinkComputer = o2; + } }, t = {}; + function n(o2) { + var r = t[o2]; + if (void 0 !== r) return r.exports; + var i = t[o2] = { exports: {} }; + return e[o2](i, i.exports, n), i.exports; + } + var o = {}; + return (() => { + var e2 = o; + Object.defineProperty(e2, "__esModule", { value: true }), e2.WebLinksAddon = void 0; + const t2 = n(6), r = /(https?|HTTPS?):[/]{2}[^\s"'!*(){}|\\\^<>`]*[^\s"':,.!?{}|\\\^~\[\]`()<>]/; + function i(e3, t3) { + const n2 = window.open(); + if (n2) { + try { + n2.opener = null; + } catch { + } + n2.location.href = t3; + } else console.warn("Opening link blocked as opener could not be cleared"); + } + e2.WebLinksAddon = class { + constructor(e3 = i, t3 = {}) { + this._handler = e3, this._options = t3; + } + activate(e3) { + this._terminal = e3; + const n2 = this._options, o2 = n2.urlRegex || r; + this._linkProvider = this._terminal.registerLinkProvider(new t2.WebLinkProvider(this._terminal, o2, this._handler, n2)); + } + dispose() { + var _a; + (_a = this._linkProvider) == null ? void 0 : _a.dispose(); + } + }; + })(), o; + })())); + } +}); +// node_modules/@xterm/addon-search/lib/addon-search.js +var require_addon_search = __commonJS({ + "node_modules/@xterm/addon-search/lib/addon-search.js"(exports, module) { + "use strict"; + !(function(e, t) { + "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.SearchAddon = t() : e.SearchAddon = t(); + })(self, (() => (() => { + "use strict"; + var e = { 345: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.runAndSubscribe = t2.forwardEvent = t2.EventEmitter = void 0, t2.EventEmitter = class { + constructor() { + this._listeners = [], this._disposed = false; + } + get event() { + return this._event || (this._event = (e3) => (this._listeners.push(e3), { dispose: () => { + if (!this._disposed) { + for (let t3 = 0; t3 < this._listeners.length; t3++) if (this._listeners[t3] === e3) return void this._listeners.splice(t3, 1); + } + } })), this._event; + } + fire(e3, t3) { + const i2 = []; + for (let e4 = 0; e4 < this._listeners.length; e4++) i2.push(this._listeners[e4]); + for (let s2 = 0; s2 < i2.length; s2++) i2[s2].call(void 0, e3, t3); + } + dispose() { + this.clearListeners(), this._disposed = true; + } + clearListeners() { + this._listeners && (this._listeners.length = 0); + } + }, t2.forwardEvent = function(e3, t3) { + return e3(((e4) => t3.fire(e4))); + }, t2.runAndSubscribe = function(e3, t3) { + return t3(void 0), e3(((e4) => t3(e4))); + }; + }, 859: (e2, t2) => { + function i2(e3) { + for (const t3 of e3) t3.dispose(); + e3.length = 0; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.getDisposeArrayDisposable = t2.disposeArray = t2.toDisposable = t2.MutableDisposable = t2.Disposable = void 0, t2.Disposable = class { + constructor() { + this._disposables = [], this._isDisposed = false; + } + dispose() { + this._isDisposed = true; + for (const e3 of this._disposables) e3.dispose(); + this._disposables.length = 0; + } + register(e3) { + return this._disposables.push(e3), e3; + } + unregister(e3) { + const t3 = this._disposables.indexOf(e3); + -1 !== t3 && this._disposables.splice(t3, 1); + } + }, t2.MutableDisposable = class { + constructor() { + this._isDisposed = false; + } + get value() { + return this._isDisposed ? void 0 : this._value; + } + set value(e3) { + var _a; + this._isDisposed || e3 === this._value || ((_a = this._value) == null ? void 0 : _a.dispose(), this._value = e3); + } + clear() { + this.value = void 0; + } + dispose() { + var _a; + this._isDisposed = true, (_a = this._value) == null ? void 0 : _a.dispose(), this._value = void 0; + } + }, t2.toDisposable = function(e3) { + return { dispose: e3 }; + }, t2.disposeArray = i2, t2.getDisposeArrayDisposable = function(e3) { + return { dispose: () => i2(e3) }; + }; + } }, t = {}; + function i(s2) { + var r = t[s2]; + if (void 0 !== r) return r.exports; + var o = t[s2] = { exports: {} }; + return e[s2](o, o.exports, i), o.exports; + } + var s = {}; + return (() => { + var e2 = s; + Object.defineProperty(e2, "__esModule", { value: true }), e2.SearchAddon = void 0; + const t2 = i(345), r = i(859), o = " ~!@#$%^&*()+`-=[]{}|\\;:\"',./<>?"; + class n extends r.Disposable { + constructor(e3) { + super(), this._highlightedLines = /* @__PURE__ */ new Set(), this._highlightDecorations = [], this._selectedDecoration = this.register(new r.MutableDisposable()), this._linesCacheTimeoutId = 0, this._linesCacheDisposables = new r.MutableDisposable(), this._onDidChangeResults = this.register(new t2.EventEmitter()), this.onDidChangeResults = this._onDidChangeResults.event, this._highlightLimit = (e3 == null ? void 0 : e3.highlightLimit) ?? 1e3; + } + activate(e3) { + this._terminal = e3, this.register(this._terminal.onWriteParsed((() => this._updateMatches()))), this.register(this._terminal.onResize((() => this._updateMatches()))), this.register((0, r.toDisposable)((() => this.clearDecorations()))); + } + _updateMatches() { + var _a; + this._highlightTimeout && window.clearTimeout(this._highlightTimeout), this._cachedSearchTerm && ((_a = this._lastSearchOptions) == null ? void 0 : _a.decorations) && (this._highlightTimeout = setTimeout((() => { + const e3 = this._cachedSearchTerm; + this._cachedSearchTerm = void 0, this.findPrevious(e3, { ...this._lastSearchOptions, incremental: true, noScroll: true }); + }), 200)); + } + clearDecorations(e3) { + this._selectedDecoration.clear(), (0, r.disposeArray)(this._highlightDecorations), this._highlightDecorations = [], this._highlightedLines.clear(), e3 || (this._cachedSearchTerm = void 0); + } + clearActiveDecoration() { + this._selectedDecoration.clear(); + } + findNext(e3, t3) { + if (!this._terminal) throw new Error("Cannot use addon until it has been loaded"); + const i2 = !this._lastSearchOptions || this._didOptionsChange(this._lastSearchOptions, t3); + this._lastSearchOptions = t3, (t3 == null ? void 0 : t3.decorations) && (void 0 === this._cachedSearchTerm || e3 !== this._cachedSearchTerm || i2) && this._highlightAllMatches(e3, t3); + const s2 = this._findNextAndSelect(e3, t3); + return this._fireResults(t3), this._cachedSearchTerm = e3, s2; + } + _highlightAllMatches(e3, t3) { + if (!this._terminal) throw new Error("Cannot use addon until it has been loaded"); + if (!e3 || 0 === e3.length) return void this.clearDecorations(); + t3 = t3 || {}, this.clearDecorations(true); + const i2 = []; + let s2, r2 = this._find(e3, 0, 0, t3); + for (; r2 && ((s2 == null ? void 0 : s2.row) !== r2.row || (s2 == null ? void 0 : s2.col) !== r2.col) && !(i2.length >= this._highlightLimit); ) s2 = r2, i2.push(s2), r2 = this._find(e3, s2.col + s2.term.length >= this._terminal.cols ? s2.row + 1 : s2.row, s2.col + s2.term.length >= this._terminal.cols ? 0 : s2.col + 1, t3); + for (const e4 of i2) { + const i3 = this._createResultDecoration(e4, t3.decorations); + i3 && (this._highlightedLines.add(i3.marker.line), this._highlightDecorations.push({ decoration: i3, match: e4, dispose() { + i3.dispose(); + } })); + } + } + _find(e3, t3, i2, s2) { + var _a; + if (!this._terminal || !e3 || 0 === e3.length) return (_a = this._terminal) == null ? void 0 : _a.clearSelection(), void this.clearDecorations(); + if (i2 > this._terminal.cols) throw new Error(`Invalid col: ${i2} to search in terminal of ${this._terminal.cols} cols`); + let r2; + this._initLinesCache(); + const o2 = { startRow: t3, startCol: i2 }; + if (r2 = this._findInLine(e3, o2, s2), !r2) for (let i3 = t3 + 1; i3 < this._terminal.buffer.active.baseY + this._terminal.rows && (o2.startRow = i3, o2.startCol = 0, r2 = this._findInLine(e3, o2, s2), !r2); i3++) ; + return r2; + } + _findNextAndSelect(e3, t3) { + var _a; + if (!this._terminal || !e3 || 0 === e3.length) return (_a = this._terminal) == null ? void 0 : _a.clearSelection(), this.clearDecorations(), false; + const i2 = this._terminal.getSelectionPosition(); + this._terminal.clearSelection(); + let s2 = 0, r2 = 0; + i2 && (this._cachedSearchTerm === e3 ? (s2 = i2.end.x, r2 = i2.end.y) : (s2 = i2.start.x, r2 = i2.start.y)), this._initLinesCache(); + const o2 = { startRow: r2, startCol: s2 }; + let n2 = this._findInLine(e3, o2, t3); + if (!n2) for (let i3 = r2 + 1; i3 < this._terminal.buffer.active.baseY + this._terminal.rows && (o2.startRow = i3, o2.startCol = 0, n2 = this._findInLine(e3, o2, t3), !n2); i3++) ; + if (!n2 && 0 !== r2) for (let i3 = 0; i3 < r2 && (o2.startRow = i3, o2.startCol = 0, n2 = this._findInLine(e3, o2, t3), !n2); i3++) ; + return !n2 && i2 && (o2.startRow = i2.start.y, o2.startCol = 0, n2 = this._findInLine(e3, o2, t3)), this._selectResult(n2, t3 == null ? void 0 : t3.decorations, t3 == null ? void 0 : t3.noScroll); + } + findPrevious(e3, t3) { + if (!this._terminal) throw new Error("Cannot use addon until it has been loaded"); + const i2 = !this._lastSearchOptions || this._didOptionsChange(this._lastSearchOptions, t3); + this._lastSearchOptions = t3, (t3 == null ? void 0 : t3.decorations) && (void 0 === this._cachedSearchTerm || e3 !== this._cachedSearchTerm || i2) && this._highlightAllMatches(e3, t3); + const s2 = this._findPreviousAndSelect(e3, t3); + return this._fireResults(t3), this._cachedSearchTerm = e3, s2; + } + _didOptionsChange(e3, t3) { + return !!t3 && (e3.caseSensitive !== t3.caseSensitive || e3.regex !== t3.regex || e3.wholeWord !== t3.wholeWord); + } + _fireResults(e3) { + if (e3 == null ? void 0 : e3.decorations) { + let e4 = -1; + if (this._selectedDecoration.value) { + const t3 = this._selectedDecoration.value.match; + for (let i2 = 0; i2 < this._highlightDecorations.length; i2++) { + const s2 = this._highlightDecorations[i2].match; + if (s2.row === t3.row && s2.col === t3.col && s2.size === t3.size) { + e4 = i2; + break; + } + } + } + this._onDidChangeResults.fire({ resultIndex: e4, resultCount: this._highlightDecorations.length }); + } + } + _findPreviousAndSelect(e3, t3) { + var _a; + if (!this._terminal) throw new Error("Cannot use addon until it has been loaded"); + if (!this._terminal || !e3 || 0 === e3.length) return (_a = this._terminal) == null ? void 0 : _a.clearSelection(), this.clearDecorations(), false; + const i2 = this._terminal.getSelectionPosition(); + this._terminal.clearSelection(); + let s2 = this._terminal.buffer.active.baseY + this._terminal.rows - 1, r2 = this._terminal.cols; + const o2 = true; + this._initLinesCache(); + const n2 = { startRow: s2, startCol: r2 }; + let h; + if (i2 && (n2.startRow = s2 = i2.start.y, n2.startCol = r2 = i2.start.x, this._cachedSearchTerm !== e3 && (h = this._findInLine(e3, n2, t3, false), h || (n2.startRow = s2 = i2.end.y, n2.startCol = r2 = i2.end.x))), h || (h = this._findInLine(e3, n2, t3, o2)), !h) { + n2.startCol = Math.max(n2.startCol, this._terminal.cols); + for (let i3 = s2 - 1; i3 >= 0 && (n2.startRow = i3, h = this._findInLine(e3, n2, t3, o2), !h); i3--) ; + } + if (!h && s2 !== this._terminal.buffer.active.baseY + this._terminal.rows - 1) for (let i3 = this._terminal.buffer.active.baseY + this._terminal.rows - 1; i3 >= s2 && (n2.startRow = i3, h = this._findInLine(e3, n2, t3, o2), !h); i3--) ; + return this._selectResult(h, t3 == null ? void 0 : t3.decorations, t3 == null ? void 0 : t3.noScroll); + } + _initLinesCache() { + const e3 = this._terminal; + this._linesCache || (this._linesCache = new Array(e3.buffer.active.length), this._linesCacheDisposables.value = (0, r.getDisposeArrayDisposable)([e3.onLineFeed((() => this._destroyLinesCache())), e3.onCursorMove((() => this._destroyLinesCache())), e3.onResize((() => this._destroyLinesCache()))])), window.clearTimeout(this._linesCacheTimeoutId), this._linesCacheTimeoutId = window.setTimeout((() => this._destroyLinesCache()), 15e3); + } + _destroyLinesCache() { + this._linesCache = void 0, this._linesCacheDisposables.clear(), this._linesCacheTimeoutId && (window.clearTimeout(this._linesCacheTimeoutId), this._linesCacheTimeoutId = 0); + } + _isWholeWord(e3, t3, i2) { + return (0 === e3 || o.includes(t3[e3 - 1])) && (e3 + i2.length === t3.length || o.includes(t3[e3 + i2.length])); + } + _findInLine(e3, t3, i2 = {}, s2 = false) { + var _a; + const r2 = this._terminal, o2 = t3.startRow, n2 = t3.startCol, h = r2.buffer.active.getLine(o2); + if (h == null ? void 0 : h.isWrapped) return s2 ? void (t3.startCol += r2.cols) : (t3.startRow--, t3.startCol += r2.cols, this._findInLine(e3, t3, i2)); + let a = (_a = this._linesCache) == null ? void 0 : _a[o2]; + a || (a = this._translateBufferLineToStringWithWrap(o2, true), this._linesCache && (this._linesCache[o2] = a)); + const [l, c] = a, d = this._bufferColsToStringOffset(o2, n2), _ = i2.caseSensitive ? e3 : e3.toLowerCase(), u = i2.caseSensitive ? l : l.toLowerCase(); + let f = -1; + if (i2.regex) { + const t4 = RegExp(_, "g"); + let i3; + if (s2) for (; i3 = t4.exec(u.slice(0, d)); ) f = t4.lastIndex - i3[0].length, e3 = i3[0], t4.lastIndex -= e3.length - 1; + else i3 = t4.exec(u.slice(d)), i3 && i3[0].length > 0 && (f = d + (t4.lastIndex - i3[0].length), e3 = i3[0]); + } else s2 ? d - _.length >= 0 && (f = u.lastIndexOf(_, d - _.length)) : f = u.indexOf(_, d); + if (f >= 0) { + if (i2.wholeWord && !this._isWholeWord(f, u, e3)) return; + let t4 = 0; + for (; t4 < c.length - 1 && f >= c[t4 + 1]; ) t4++; + let s3 = t4; + for (; s3 < c.length - 1 && f + e3.length >= c[s3 + 1]; ) s3++; + const n3 = f - c[t4], h2 = f + e3.length - c[s3], a2 = this._stringLengthToBufferSize(o2 + t4, n3); + return { term: e3, col: a2, row: o2 + t4, size: this._stringLengthToBufferSize(o2 + s3, h2) - a2 + r2.cols * (s3 - t4) }; + } + } + _stringLengthToBufferSize(e3, t3) { + const i2 = this._terminal.buffer.active.getLine(e3); + if (!i2) return 0; + for (let e4 = 0; e4 < t3; e4++) { + const s2 = i2.getCell(e4); + if (!s2) break; + const r2 = s2.getChars(); + r2.length > 1 && (t3 -= r2.length - 1); + const o2 = i2.getCell(e4 + 1); + o2 && 0 === o2.getWidth() && t3++; + } + return t3; + } + _bufferColsToStringOffset(e3, t3) { + const i2 = this._terminal; + let s2 = e3, r2 = 0, o2 = i2.buffer.active.getLine(s2); + for (; t3 > 0 && o2; ) { + for (let e4 = 0; e4 < t3 && e4 < i2.cols; e4++) { + const t4 = o2.getCell(e4); + if (!t4) break; + t4.getWidth() && (r2 += 0 === t4.getCode() ? 1 : t4.getChars().length); + } + if (s2++, o2 = i2.buffer.active.getLine(s2), o2 && !o2.isWrapped) break; + t3 -= i2.cols; + } + return r2; + } + _translateBufferLineToStringWithWrap(e3, t3) { + var _a; + const i2 = this._terminal, s2 = [], r2 = [0]; + let o2 = i2.buffer.active.getLine(e3); + for (; o2; ) { + const n2 = i2.buffer.active.getLine(e3 + 1), h = !!n2 && n2.isWrapped; + let a = o2.translateToString(!h && t3); + if (h && n2) { + const e4 = o2.getCell(o2.length - 1); + e4 && 0 === e4.getCode() && 1 === e4.getWidth() && 2 === ((_a = n2.getCell(0)) == null ? void 0 : _a.getWidth()) && (a = a.slice(0, -1)); + } + if (s2.push(a), !h) break; + r2.push(r2[r2.length - 1] + a.length), e3++, o2 = n2; + } + return [s2.join(""), r2]; + } + _selectResult(e3, t3, i2) { + const s2 = this._terminal; + if (this._selectedDecoration.clear(), !e3) return s2.clearSelection(), false; + if (s2.select(e3.col, e3.row, e3.size), t3) { + const i3 = s2.registerMarker(-s2.buffer.active.baseY - s2.buffer.active.cursorY + e3.row); + if (i3) { + const o2 = s2.registerDecoration({ marker: i3, x: e3.col, width: e3.size, backgroundColor: t3.activeMatchBackground, layer: "top", overviewRulerOptions: { color: t3.activeMatchColorOverviewRuler } }); + if (o2) { + const s3 = []; + s3.push(i3), s3.push(o2.onRender(((e4) => this._applyStyles(e4, t3.activeMatchBorder, true)))), s3.push(o2.onDispose((() => (0, r.disposeArray)(s3)))), this._selectedDecoration.value = { decoration: o2, match: e3, dispose() { + o2.dispose(); + } }; + } + } + } + if (!i2 && (e3.row >= s2.buffer.active.viewportY + s2.rows || e3.row < s2.buffer.active.viewportY)) { + let t4 = e3.row - s2.buffer.active.viewportY; + t4 -= Math.floor(s2.rows / 2), s2.scrollLines(t4); + } + return true; + } + _applyStyles(e3, t3, i2) { + e3.classList.contains("xterm-find-result-decoration") || (e3.classList.add("xterm-find-result-decoration"), t3 && (e3.style.outline = `1px solid ${t3}`)), i2 && e3.classList.add("xterm-find-active-result-decoration"); + } + _createResultDecoration(e3, t3) { + const i2 = this._terminal, s2 = i2.registerMarker(-i2.buffer.active.baseY - i2.buffer.active.cursorY + e3.row); + if (!s2) return; + const o2 = i2.registerDecoration({ marker: s2, x: e3.col, width: e3.size, backgroundColor: t3.matchBackground, overviewRulerOptions: this._highlightedLines.has(s2.line) ? void 0 : { color: t3.matchOverviewRuler, position: "center" } }); + if (o2) { + const e4 = []; + e4.push(s2), e4.push(o2.onRender(((e5) => this._applyStyles(e5, t3.matchBorder, false)))), e4.push(o2.onDispose((() => (0, r.disposeArray)(e4)))); + } + return o2; + } + } + e2.SearchAddon = n; + })(), s; + })())); + } +}); + +// node_modules/@xterm/addon-unicode11/lib/addon-unicode11.js +var require_addon_unicode11 = __commonJS({ + "node_modules/@xterm/addon-unicode11/lib/addon-unicode11.js"(exports, module) { + "use strict"; + !(function(e, t) { + "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.Unicode11Addon = t() : e.Unicode11Addon = t(); + })(exports, (() => (() => { + "use strict"; + var e = { 433: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.UnicodeV11 = void 0; + const r2 = i2(938), s = [[768, 879], [1155, 1161], [1425, 1469], [1471, 1471], [1473, 1474], [1476, 1477], [1479, 1479], [1536, 1541], [1552, 1562], [1564, 1564], [1611, 1631], [1648, 1648], [1750, 1757], [1759, 1764], [1767, 1768], [1770, 1773], [1807, 1807], [1809, 1809], [1840, 1866], [1958, 1968], [2027, 2035], [2045, 2045], [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2093], [2137, 2139], [2259, 2306], [2362, 2362], [2364, 2364], [2369, 2376], [2381, 2381], [2385, 2391], [2402, 2403], [2433, 2433], [2492, 2492], [2497, 2500], [2509, 2509], [2530, 2531], [2558, 2558], [2561, 2562], [2620, 2620], [2625, 2626], [2631, 2632], [2635, 2637], [2641, 2641], [2672, 2673], [2677, 2677], [2689, 2690], [2748, 2748], [2753, 2757], [2759, 2760], [2765, 2765], [2786, 2787], [2810, 2815], [2817, 2817], [2876, 2876], [2879, 2879], [2881, 2884], [2893, 2893], [2902, 2902], [2914, 2915], [2946, 2946], [3008, 3008], [3021, 3021], [3072, 3072], [3076, 3076], [3134, 3136], [3142, 3144], [3146, 3149], [3157, 3158], [3170, 3171], [3201, 3201], [3260, 3260], [3263, 3263], [3270, 3270], [3276, 3277], [3298, 3299], [3328, 3329], [3387, 3388], [3393, 3396], [3405, 3405], [3426, 3427], [3530, 3530], [3538, 3540], [3542, 3542], [3633, 3633], [3636, 3642], [3655, 3662], [3761, 3761], [3764, 3772], [3784, 3789], [3864, 3865], [3893, 3893], [3895, 3895], [3897, 3897], [3953, 3966], [3968, 3972], [3974, 3975], [3981, 3991], [3993, 4028], [4038, 4038], [4141, 4144], [4146, 4151], [4153, 4154], [4157, 4158], [4184, 4185], [4190, 4192], [4209, 4212], [4226, 4226], [4229, 4230], [4237, 4237], [4253, 4253], [4448, 4607], [4957, 4959], [5906, 5908], [5938, 5940], [5970, 5971], [6002, 6003], [6068, 6069], [6071, 6077], [6086, 6086], [6089, 6099], [6109, 6109], [6155, 6158], [6277, 6278], [6313, 6313], [6432, 6434], [6439, 6440], [6450, 6450], [6457, 6459], [6679, 6680], [6683, 6683], [6742, 6742], [6744, 6750], [6752, 6752], [6754, 6754], [6757, 6764], [6771, 6780], [6783, 6783], [6832, 6846], [6912, 6915], [6964, 6964], [6966, 6970], [6972, 6972], [6978, 6978], [7019, 7027], [7040, 7041], [7074, 7077], [7080, 7081], [7083, 7085], [7142, 7142], [7144, 7145], [7149, 7149], [7151, 7153], [7212, 7219], [7222, 7223], [7376, 7378], [7380, 7392], [7394, 7400], [7405, 7405], [7412, 7412], [7416, 7417], [7616, 7673], [7675, 7679], [8203, 8207], [8234, 8238], [8288, 8292], [8294, 8303], [8400, 8432], [11503, 11505], [11647, 11647], [11744, 11775], [12330, 12333], [12441, 12442], [42607, 42610], [42612, 42621], [42654, 42655], [42736, 42737], [43010, 43010], [43014, 43014], [43019, 43019], [43045, 43046], [43204, 43205], [43232, 43249], [43263, 43263], [43302, 43309], [43335, 43345], [43392, 43394], [43443, 43443], [43446, 43449], [43452, 43453], [43493, 43493], [43561, 43566], [43569, 43570], [43573, 43574], [43587, 43587], [43596, 43596], [43644, 43644], [43696, 43696], [43698, 43700], [43703, 43704], [43710, 43711], [43713, 43713], [43756, 43757], [43766, 43766], [44005, 44005], [44008, 44008], [44013, 44013], [64286, 64286], [65024, 65039], [65056, 65071], [65279, 65279], [65529, 65531]], n = [[66045, 66045], [66272, 66272], [66422, 66426], [68097, 68099], [68101, 68102], [68108, 68111], [68152, 68154], [68159, 68159], [68325, 68326], [68900, 68903], [69446, 69456], [69633, 69633], [69688, 69702], [69759, 69761], [69811, 69814], [69817, 69818], [69821, 69821], [69837, 69837], [69888, 69890], [69927, 69931], [69933, 69940], [70003, 70003], [70016, 70017], [70070, 70078], [70089, 70092], [70191, 70193], [70196, 70196], [70198, 70199], [70206, 70206], [70367, 70367], [70371, 70378], [70400, 70401], [70459, 70460], [70464, 70464], [70502, 70508], [70512, 70516], [70712, 70719], [70722, 70724], [70726, 70726], [70750, 70750], [70835, 70840], [70842, 70842], [70847, 70848], [70850, 70851], [71090, 71093], [71100, 71101], [71103, 71104], [71132, 71133], [71219, 71226], [71229, 71229], [71231, 71232], [71339, 71339], [71341, 71341], [71344, 71349], [71351, 71351], [71453, 71455], [71458, 71461], [71463, 71467], [71727, 71735], [71737, 71738], [72148, 72151], [72154, 72155], [72160, 72160], [72193, 72202], [72243, 72248], [72251, 72254], [72263, 72263], [72273, 72278], [72281, 72283], [72330, 72342], [72344, 72345], [72752, 72758], [72760, 72765], [72767, 72767], [72850, 72871], [72874, 72880], [72882, 72883], [72885, 72886], [73009, 73014], [73018, 73018], [73020, 73021], [73023, 73029], [73031, 73031], [73104, 73105], [73109, 73109], [73111, 73111], [73459, 73460], [78896, 78904], [92912, 92916], [92976, 92982], [94031, 94031], [94095, 94098], [113821, 113822], [113824, 113827], [119143, 119145], [119155, 119170], [119173, 119179], [119210, 119213], [119362, 119364], [121344, 121398], [121403, 121452], [121461, 121461], [121476, 121476], [121499, 121503], [121505, 121519], [122880, 122886], [122888, 122904], [122907, 122913], [122915, 122916], [122918, 122922], [123184, 123190], [123628, 123631], [125136, 125142], [125252, 125258], [917505, 917505], [917536, 917631], [917760, 917999]], o = [[4352, 4447], [8986, 8987], [9001, 9002], [9193, 9196], [9200, 9200], [9203, 9203], [9725, 9726], [9748, 9749], [9800, 9811], [9855, 9855], [9875, 9875], [9889, 9889], [9898, 9899], [9917, 9918], [9924, 9925], [9934, 9934], [9940, 9940], [9962, 9962], [9970, 9971], [9973, 9973], [9978, 9978], [9981, 9981], [9989, 9989], [9994, 9995], [10024, 10024], [10060, 10060], [10062, 10062], [10067, 10069], [10071, 10071], [10133, 10135], [10160, 10160], [10175, 10175], [11035, 11036], [11088, 11088], [11093, 11093], [11904, 11929], [11931, 12019], [12032, 12245], [12272, 12283], [12288, 12329], [12334, 12350], [12353, 12438], [12443, 12543], [12549, 12591], [12593, 12686], [12688, 12730], [12736, 12771], [12784, 12830], [12832, 12871], [12880, 19903], [19968, 42124], [42128, 42182], [43360, 43388], [44032, 55203], [63744, 64255], [65040, 65049], [65072, 65106], [65108, 65126], [65128, 65131], [65281, 65376], [65504, 65510]], c = [[94176, 94179], [94208, 100343], [100352, 101106], [110592, 110878], [110928, 110930], [110948, 110951], [110960, 111355], [126980, 126980], [127183, 127183], [127374, 127374], [127377, 127386], [127488, 127490], [127504, 127547], [127552, 127560], [127568, 127569], [127584, 127589], [127744, 127776], [127789, 127797], [127799, 127868], [127870, 127891], [127904, 127946], [127951, 127955], [127968, 127984], [127988, 127988], [127992, 128062], [128064, 128064], [128066, 128252], [128255, 128317], [128331, 128334], [128336, 128359], [128378, 128378], [128405, 128406], [128420, 128420], [128507, 128591], [128640, 128709], [128716, 128716], [128720, 128722], [128725, 128725], [128747, 128748], [128756, 128762], [128992, 129003], [129293, 129393], [129395, 129398], [129402, 129442], [129445, 129450], [129454, 129482], [129485, 129535], [129648, 129651], [129656, 129658], [129664, 129666], [129680, 129685], [131072, 196605], [196608, 262141]]; + let l; + function d(e3, t3) { + let i3, r3 = 0, s2 = t3.length - 1; + if (e3 < t3[0][0] || e3 > t3[s2][1]) return false; + for (; s2 >= r3; ) if (i3 = r3 + s2 >> 1, e3 > t3[i3][1]) r3 = i3 + 1; + else { + if (!(e3 < t3[i3][0])) return true; + s2 = i3 - 1; + } + return false; + } + t2.UnicodeV11 = class { + constructor() { + if (this.version = "11", !l) { + l = new Uint8Array(65536), l.fill(1), l[0] = 0, l.fill(0, 1, 32), l.fill(0, 127, 160); + for (let e3 = 0; e3 < s.length; ++e3) l.fill(0, s[e3][0], s[e3][1] + 1); + for (let e3 = 0; e3 < o.length; ++e3) l.fill(2, o[e3][0], o[e3][1] + 1); + } + } + wcwidth(e3) { + return e3 < 32 ? 0 : e3 < 127 ? 1 : e3 < 65536 ? l[e3] : d(e3, n) ? 0 : d(e3, c) ? 2 : 1; + } + charProperties(e3, t3) { + let i3 = this.wcwidth(e3), s2 = 0 === i3 && 0 !== t3; + if (s2) { + const e4 = r2.UnicodeService.extractWidth(t3); + 0 === e4 ? s2 = false : e4 > i3 && (i3 = e4); + } + return r2.UnicodeService.createPropertyValue(0, i3, s2); + } + }; + }, 345: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.runAndSubscribe = t2.forwardEvent = t2.EventEmitter = void 0, t2.EventEmitter = class { + constructor() { + this._listeners = [], this._disposed = false; + } + get event() { + return this._event || (this._event = (e3) => (this._listeners.push(e3), { dispose: () => { + if (!this._disposed) { + for (let t3 = 0; t3 < this._listeners.length; t3++) if (this._listeners[t3] === e3) return void this._listeners.splice(t3, 1); + } + } })), this._event; + } + fire(e3, t3) { + const i2 = []; + for (let e4 = 0; e4 < this._listeners.length; e4++) i2.push(this._listeners[e4]); + for (let r2 = 0; r2 < i2.length; r2++) i2[r2].call(void 0, e3, t3); + } + dispose() { + this.clearListeners(), this._disposed = true; + } + clearListeners() { + this._listeners && (this._listeners.length = 0); + } + }, t2.forwardEvent = function(e3, t3) { + return e3(((e4) => t3.fire(e4))); + }, t2.runAndSubscribe = function(e3, t3) { + return t3(void 0), e3(((e4) => t3(e4))); + }; + }, 490: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.UnicodeV6 = void 0; + const r2 = i2(938), s = [[768, 879], [1155, 1158], [1160, 1161], [1425, 1469], [1471, 1471], [1473, 1474], [1476, 1477], [1479, 1479], [1536, 1539], [1552, 1557], [1611, 1630], [1648, 1648], [1750, 1764], [1767, 1768], [1770, 1773], [1807, 1807], [1809, 1809], [1840, 1866], [1958, 1968], [2027, 2035], [2305, 2306], [2364, 2364], [2369, 2376], [2381, 2381], [2385, 2388], [2402, 2403], [2433, 2433], [2492, 2492], [2497, 2500], [2509, 2509], [2530, 2531], [2561, 2562], [2620, 2620], [2625, 2626], [2631, 2632], [2635, 2637], [2672, 2673], [2689, 2690], [2748, 2748], [2753, 2757], [2759, 2760], [2765, 2765], [2786, 2787], [2817, 2817], [2876, 2876], [2879, 2879], [2881, 2883], [2893, 2893], [2902, 2902], [2946, 2946], [3008, 3008], [3021, 3021], [3134, 3136], [3142, 3144], [3146, 3149], [3157, 3158], [3260, 3260], [3263, 3263], [3270, 3270], [3276, 3277], [3298, 3299], [3393, 3395], [3405, 3405], [3530, 3530], [3538, 3540], [3542, 3542], [3633, 3633], [3636, 3642], [3655, 3662], [3761, 3761], [3764, 3769], [3771, 3772], [3784, 3789], [3864, 3865], [3893, 3893], [3895, 3895], [3897, 3897], [3953, 3966], [3968, 3972], [3974, 3975], [3984, 3991], [3993, 4028], [4038, 4038], [4141, 4144], [4146, 4146], [4150, 4151], [4153, 4153], [4184, 4185], [4448, 4607], [4959, 4959], [5906, 5908], [5938, 5940], [5970, 5971], [6002, 6003], [6068, 6069], [6071, 6077], [6086, 6086], [6089, 6099], [6109, 6109], [6155, 6157], [6313, 6313], [6432, 6434], [6439, 6440], [6450, 6450], [6457, 6459], [6679, 6680], [6912, 6915], [6964, 6964], [6966, 6970], [6972, 6972], [6978, 6978], [7019, 7027], [7616, 7626], [7678, 7679], [8203, 8207], [8234, 8238], [8288, 8291], [8298, 8303], [8400, 8431], [12330, 12335], [12441, 12442], [43014, 43014], [43019, 43019], [43045, 43046], [64286, 64286], [65024, 65039], [65056, 65059], [65279, 65279], [65529, 65531]], n = [[68097, 68099], [68101, 68102], [68108, 68111], [68152, 68154], [68159, 68159], [119143, 119145], [119155, 119170], [119173, 119179], [119210, 119213], [119362, 119364], [917505, 917505], [917536, 917631], [917760, 917999]]; + let o; + t2.UnicodeV6 = class { + constructor() { + if (this.version = "6", !o) { + o = new Uint8Array(65536), o.fill(1), o[0] = 0, o.fill(0, 1, 32), o.fill(0, 127, 160), o.fill(2, 4352, 4448), o[9001] = 2, o[9002] = 2, o.fill(2, 11904, 42192), o[12351] = 1, o.fill(2, 44032, 55204), o.fill(2, 63744, 64256), o.fill(2, 65040, 65050), o.fill(2, 65072, 65136), o.fill(2, 65280, 65377), o.fill(2, 65504, 65511); + for (let e3 = 0; e3 < s.length; ++e3) o.fill(0, s[e3][0], s[e3][1] + 1); + } + } + wcwidth(e3) { + return e3 < 32 ? 0 : e3 < 127 ? 1 : e3 < 65536 ? o[e3] : (function(e4, t3) { + let i3, r3 = 0, s2 = t3.length - 1; + if (e4 < t3[0][0] || e4 > t3[s2][1]) return false; + for (; s2 >= r3; ) if (i3 = r3 + s2 >> 1, e4 > t3[i3][1]) r3 = i3 + 1; + else { + if (!(e4 < t3[i3][0])) return true; + s2 = i3 - 1; + } + return false; + })(e3, n) ? 0 : e3 >= 131072 && e3 <= 196605 || e3 >= 196608 && e3 <= 262141 ? 2 : 1; + } + charProperties(e3, t3) { + let i3 = this.wcwidth(e3), s2 = 0 === i3 && 0 !== t3; + if (s2) { + const e4 = r2.UnicodeService.extractWidth(t3); + 0 === e4 ? s2 = false : e4 > i3 && (i3 = e4); + } + return r2.UnicodeService.createPropertyValue(0, i3, s2); + } + }; + }, 938: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.UnicodeService = void 0; + const r2 = i2(345), s = i2(490); + class n { + static extractShouldJoin(e3) { + return 0 != (1 & e3); + } + static extractWidth(e3) { + return e3 >> 1 & 3; + } + static extractCharKind(e3) { + return e3 >> 3; + } + static createPropertyValue(e3, t3, i3 = false) { + return (16777215 & e3) << 3 | (3 & t3) << 1 | (i3 ? 1 : 0); + } + constructor() { + this._providers = /* @__PURE__ */ Object.create(null), this._active = "", this._onChange = new r2.EventEmitter(), this.onChange = this._onChange.event; + const e3 = new s.UnicodeV6(); + this.register(e3), this._active = e3.version, this._activeProvider = e3; + } + dispose() { + this._onChange.dispose(); + } + get versions() { + return Object.keys(this._providers); + } + get activeVersion() { + return this._active; + } + set activeVersion(e3) { + if (!this._providers[e3]) throw new Error(`unknown Unicode version "${e3}"`); + this._active = e3, this._activeProvider = this._providers[e3], this._onChange.fire(e3); + } + register(e3) { + this._providers[e3.version] = e3; + } + wcwidth(e3) { + return this._activeProvider.wcwidth(e3); + } + getStringCellWidth(e3) { + let t3 = 0, i3 = 0; + const r3 = e3.length; + for (let s2 = 0; s2 < r3; ++s2) { + let o = e3.charCodeAt(s2); + if (55296 <= o && o <= 56319) { + if (++s2 >= r3) return t3 + this.wcwidth(o); + const i4 = e3.charCodeAt(s2); + 56320 <= i4 && i4 <= 57343 ? o = 1024 * (o - 55296) + i4 - 56320 + 65536 : t3 += this.wcwidth(i4); + } + const c = this.charProperties(o, i3); + let l = n.extractWidth(c); + n.extractShouldJoin(c) && (l -= n.extractWidth(i3)), t3 += l, i3 = c; + } + return t3; + } + charProperties(e3, t3) { + return this._activeProvider.charProperties(e3, t3); + } + } + t2.UnicodeService = n; + } }, t = {}; + function i(r2) { + var s = t[r2]; + if (void 0 !== s) return s.exports; + var n = t[r2] = { exports: {} }; + return e[r2](n, n.exports, i), n.exports; + } + var r = {}; + return (() => { + var e2 = r; + Object.defineProperty(e2, "__esModule", { value: true }), e2.Unicode11Addon = void 0; + const t2 = i(433); + e2.Unicode11Addon = class { + activate(e3) { + e3.unicode.register(new t2.UnicodeV11()); + } + dispose() { + } + }; + })(), r; + })())); + } +}); + +// node_modules/@xterm/addon-webgl/lib/addon-webgl.js +var require_addon_webgl = __commonJS({ + "node_modules/@xterm/addon-webgl/lib/addon-webgl.js"(exports, module) { + "use strict"; + !(function(e, t) { + "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.WebglAddon = t() : e.WebglAddon = t(); + })(self, (() => (() => { + "use strict"; + var e = { 965: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.GlyphRenderer = void 0; + const s2 = i2(374), r = i2(509), o = i2(855), n = i2(859), a = i2(381), h = 11, l = h * Float32Array.BYTES_PER_ELEMENT; + let c, d = 0, _ = 0, u = 0; + class g extends n.Disposable { + constructor(e3, t3, i3, o2) { + super(), this._terminal = e3, this._gl = t3, this._dimensions = i3, this._optionsService = o2, this._activeBuffer = 0, this._vertices = { count: 0, attributes: new Float32Array(0), attributesBuffers: [new Float32Array(0), new Float32Array(0)] }; + const h2 = this._gl; + void 0 === r.TextureAtlas.maxAtlasPages && (r.TextureAtlas.maxAtlasPages = Math.min(32, (0, s2.throwIfFalsy)(h2.getParameter(h2.MAX_TEXTURE_IMAGE_UNITS))), r.TextureAtlas.maxTextureSize = (0, s2.throwIfFalsy)(h2.getParameter(h2.MAX_TEXTURE_SIZE))), this._program = (0, s2.throwIfFalsy)((0, a.createProgram)(h2, "#version 300 es\nlayout (location = 0) in vec2 a_unitquad;\nlayout (location = 1) in vec2 a_cellpos;\nlayout (location = 2) in vec2 a_offset;\nlayout (location = 3) in vec2 a_size;\nlayout (location = 4) in float a_texpage;\nlayout (location = 5) in vec2 a_texcoord;\nlayout (location = 6) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}", (function(e4) { + let t4 = ""; + for (let i4 = 1; i4 < e4; i4++) t4 += ` else if (v_texpage == ${i4}) { outColor = texture(u_texture[${i4}], v_texcoord); }`; + return `#version 300 es +precision lowp float; + +in vec2 v_texcoord; +flat in int v_texpage; + +uniform sampler2D u_texture[${e4}]; + +out vec4 outColor; + +void main() { + if (v_texpage == 0) { + outColor = texture(u_texture[0], v_texcoord); + } ${t4} +}`; + })(r.TextureAtlas.maxAtlasPages))), this.register((0, n.toDisposable)((() => h2.deleteProgram(this._program)))), this._projectionLocation = (0, s2.throwIfFalsy)(h2.getUniformLocation(this._program, "u_projection")), this._resolutionLocation = (0, s2.throwIfFalsy)(h2.getUniformLocation(this._program, "u_resolution")), this._textureLocation = (0, s2.throwIfFalsy)(h2.getUniformLocation(this._program, "u_texture")), this._vertexArrayObject = h2.createVertexArray(), h2.bindVertexArray(this._vertexArrayObject); + const c2 = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]), d2 = h2.createBuffer(); + this.register((0, n.toDisposable)((() => h2.deleteBuffer(d2)))), h2.bindBuffer(h2.ARRAY_BUFFER, d2), h2.bufferData(h2.ARRAY_BUFFER, c2, h2.STATIC_DRAW), h2.enableVertexAttribArray(0), h2.vertexAttribPointer(0, 2, this._gl.FLOAT, false, 0, 0); + const _2 = new Uint8Array([0, 1, 2, 3]), u2 = h2.createBuffer(); + this.register((0, n.toDisposable)((() => h2.deleteBuffer(u2)))), h2.bindBuffer(h2.ELEMENT_ARRAY_BUFFER, u2), h2.bufferData(h2.ELEMENT_ARRAY_BUFFER, _2, h2.STATIC_DRAW), this._attributesBuffer = (0, s2.throwIfFalsy)(h2.createBuffer()), this.register((0, n.toDisposable)((() => h2.deleteBuffer(this._attributesBuffer)))), h2.bindBuffer(h2.ARRAY_BUFFER, this._attributesBuffer), h2.enableVertexAttribArray(2), h2.vertexAttribPointer(2, 2, h2.FLOAT, false, l, 0), h2.vertexAttribDivisor(2, 1), h2.enableVertexAttribArray(3), h2.vertexAttribPointer(3, 2, h2.FLOAT, false, l, 2 * Float32Array.BYTES_PER_ELEMENT), h2.vertexAttribDivisor(3, 1), h2.enableVertexAttribArray(4), h2.vertexAttribPointer(4, 1, h2.FLOAT, false, l, 4 * Float32Array.BYTES_PER_ELEMENT), h2.vertexAttribDivisor(4, 1), h2.enableVertexAttribArray(5), h2.vertexAttribPointer(5, 2, h2.FLOAT, false, l, 5 * Float32Array.BYTES_PER_ELEMENT), h2.vertexAttribDivisor(5, 1), h2.enableVertexAttribArray(6), h2.vertexAttribPointer(6, 2, h2.FLOAT, false, l, 7 * Float32Array.BYTES_PER_ELEMENT), h2.vertexAttribDivisor(6, 1), h2.enableVertexAttribArray(1), h2.vertexAttribPointer(1, 2, h2.FLOAT, false, l, 9 * Float32Array.BYTES_PER_ELEMENT), h2.vertexAttribDivisor(1, 1), h2.useProgram(this._program); + const g2 = new Int32Array(r.TextureAtlas.maxAtlasPages); + for (let e4 = 0; e4 < r.TextureAtlas.maxAtlasPages; e4++) g2[e4] = e4; + h2.uniform1iv(this._textureLocation, g2), h2.uniformMatrix4fv(this._projectionLocation, false, a.PROJECTION_MATRIX), this._atlasTextures = []; + for (let e4 = 0; e4 < r.TextureAtlas.maxAtlasPages; e4++) { + const t4 = new a.GLTexture((0, s2.throwIfFalsy)(h2.createTexture())); + this.register((0, n.toDisposable)((() => h2.deleteTexture(t4.texture)))), h2.activeTexture(h2.TEXTURE0 + e4), h2.bindTexture(h2.TEXTURE_2D, t4.texture), h2.texParameteri(h2.TEXTURE_2D, h2.TEXTURE_WRAP_S, h2.CLAMP_TO_EDGE), h2.texParameteri(h2.TEXTURE_2D, h2.TEXTURE_WRAP_T, h2.CLAMP_TO_EDGE), h2.texImage2D(h2.TEXTURE_2D, 0, h2.RGBA, 1, 1, 0, h2.RGBA, h2.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255])), this._atlasTextures[e4] = t4; + } + h2.enable(h2.BLEND), h2.blendFunc(h2.SRC_ALPHA, h2.ONE_MINUS_SRC_ALPHA), this.handleResize(); + } + beginFrame() { + return !this._atlas || this._atlas.beginFrame(); + } + updateCell(e3, t3, i3, s3, r2, o2, n2, a2, h2) { + this._updateCell(this._vertices.attributes, e3, t3, i3, s3, r2, o2, n2, a2, h2); + } + _updateCell(e3, t3, i3, r2, n2, a2, l2, g2, v, f) { + d = (i3 * this._terminal.cols + t3) * h, r2 !== o.NULL_CELL_CODE && void 0 !== r2 ? this._atlas && (c = g2 && g2.length > 1 ? this._atlas.getRasterizedGlyphCombinedChar(g2, n2, a2, l2, false) : this._atlas.getRasterizedGlyph(r2, n2, a2, l2, false), _ = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2), n2 !== f && c.offset.x > _ ? (u = c.offset.x - _, e3[d] = -(c.offset.x - u) + this._dimensions.device.char.left, e3[d + 1] = -c.offset.y + this._dimensions.device.char.top, e3[d + 2] = (c.size.x - u) / this._dimensions.device.canvas.width, e3[d + 3] = c.size.y / this._dimensions.device.canvas.height, e3[d + 4] = c.texturePage, e3[d + 5] = c.texturePositionClipSpace.x + u / this._atlas.pages[c.texturePage].canvas.width, e3[d + 6] = c.texturePositionClipSpace.y, e3[d + 7] = c.sizeClipSpace.x - u / this._atlas.pages[c.texturePage].canvas.width, e3[d + 8] = c.sizeClipSpace.y) : (e3[d] = -c.offset.x + this._dimensions.device.char.left, e3[d + 1] = -c.offset.y + this._dimensions.device.char.top, e3[d + 2] = c.size.x / this._dimensions.device.canvas.width, e3[d + 3] = c.size.y / this._dimensions.device.canvas.height, e3[d + 4] = c.texturePage, e3[d + 5] = c.texturePositionClipSpace.x, e3[d + 6] = c.texturePositionClipSpace.y, e3[d + 7] = c.sizeClipSpace.x, e3[d + 8] = c.sizeClipSpace.y), this._optionsService.rawOptions.rescaleOverlappingGlyphs && (0, s2.allowRescaling)(r2, v, c.size.x, this._dimensions.device.cell.width) && (e3[d + 2] = (this._dimensions.device.cell.width - 1) / this._dimensions.device.canvas.width)) : e3.fill(0, d, d + h - 1 - 2); + } + clear() { + const e3 = this._terminal, t3 = e3.cols * e3.rows * h; + this._vertices.count !== t3 ? this._vertices.attributes = new Float32Array(t3) : this._vertices.attributes.fill(0); + let i3 = 0; + for (; i3 < this._vertices.attributesBuffers.length; i3++) this._vertices.count !== t3 ? this._vertices.attributesBuffers[i3] = new Float32Array(t3) : this._vertices.attributesBuffers[i3].fill(0); + this._vertices.count = t3, i3 = 0; + for (let t4 = 0; t4 < e3.rows; t4++) for (let s3 = 0; s3 < e3.cols; s3++) this._vertices.attributes[i3 + 9] = s3 / e3.cols, this._vertices.attributes[i3 + 10] = t4 / e3.rows, i3 += h; + } + handleResize() { + const e3 = this._gl; + e3.useProgram(this._program), e3.viewport(0, 0, e3.canvas.width, e3.canvas.height), e3.uniform2f(this._resolutionLocation, e3.canvas.width, e3.canvas.height), this.clear(); + } + render(e3) { + if (!this._atlas) return; + const t3 = this._gl; + t3.useProgram(this._program), t3.bindVertexArray(this._vertexArrayObject), this._activeBuffer = (this._activeBuffer + 1) % 2; + const i3 = this._vertices.attributesBuffers[this._activeBuffer]; + let s3 = 0; + for (let t4 = 0; t4 < e3.lineLengths.length; t4++) { + const r2 = t4 * this._terminal.cols * h, o2 = this._vertices.attributes.subarray(r2, r2 + e3.lineLengths[t4] * h); + i3.set(o2, s3), s3 += o2.length; + } + t3.bindBuffer(t3.ARRAY_BUFFER, this._attributesBuffer), t3.bufferData(t3.ARRAY_BUFFER, i3.subarray(0, s3), t3.STREAM_DRAW); + for (let e4 = 0; e4 < this._atlas.pages.length; e4++) this._atlas.pages[e4].version !== this._atlasTextures[e4].version && this._bindAtlasPageTexture(t3, this._atlas, e4); + t3.drawElementsInstanced(t3.TRIANGLE_STRIP, 4, t3.UNSIGNED_BYTE, 0, s3 / h); + } + setAtlas(e3) { + this._atlas = e3; + for (const e4 of this._atlasTextures) e4.version = -1; + } + _bindAtlasPageTexture(e3, t3, i3) { + e3.activeTexture(e3.TEXTURE0 + i3), e3.bindTexture(e3.TEXTURE_2D, this._atlasTextures[i3].texture), e3.texParameteri(e3.TEXTURE_2D, e3.TEXTURE_WRAP_S, e3.CLAMP_TO_EDGE), e3.texParameteri(e3.TEXTURE_2D, e3.TEXTURE_WRAP_T, e3.CLAMP_TO_EDGE), e3.texImage2D(e3.TEXTURE_2D, 0, e3.RGBA, e3.RGBA, e3.UNSIGNED_BYTE, t3.pages[i3].canvas), e3.generateMipmap(e3.TEXTURE_2D), this._atlasTextures[i3].version = t3.pages[i3].version; + } + setDimensions(e3) { + this._dimensions = e3; + } + } + t2.GlyphRenderer = g; + }, 742: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.RectangleRenderer = void 0; + const s2 = i2(374), r = i2(859), o = i2(310), n = i2(381), a = 8 * Float32Array.BYTES_PER_ELEMENT; + class h { + constructor() { + this.attributes = new Float32Array(160), this.count = 0; + } + } + let l = 0, c = 0, d = 0, _ = 0, u = 0, g = 0, v = 0; + class f extends r.Disposable { + constructor(e3, t3, i3, o2) { + super(), this._terminal = e3, this._gl = t3, this._dimensions = i3, this._themeService = o2, this._vertices = new h(), this._verticesCursor = new h(); + const l2 = this._gl; + this._program = (0, s2.throwIfFalsy)((0, n.createProgram)(l2, "#version 300 es\nlayout (location = 0) in vec2 a_position;\nlayout (location = 1) in vec2 a_size;\nlayout (location = 2) in vec4 a_color;\nlayout (location = 3) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n vec2 zeroToOne = a_position + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_color = a_color;\n}", "#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n outColor = v_color;\n}")), this.register((0, r.toDisposable)((() => l2.deleteProgram(this._program)))), this._projectionLocation = (0, s2.throwIfFalsy)(l2.getUniformLocation(this._program, "u_projection")), this._vertexArrayObject = l2.createVertexArray(), l2.bindVertexArray(this._vertexArrayObject); + const c2 = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]), d2 = l2.createBuffer(); + this.register((0, r.toDisposable)((() => l2.deleteBuffer(d2)))), l2.bindBuffer(l2.ARRAY_BUFFER, d2), l2.bufferData(l2.ARRAY_BUFFER, c2, l2.STATIC_DRAW), l2.enableVertexAttribArray(3), l2.vertexAttribPointer(3, 2, this._gl.FLOAT, false, 0, 0); + const _2 = new Uint8Array([0, 1, 2, 3]), u2 = l2.createBuffer(); + this.register((0, r.toDisposable)((() => l2.deleteBuffer(u2)))), l2.bindBuffer(l2.ELEMENT_ARRAY_BUFFER, u2), l2.bufferData(l2.ELEMENT_ARRAY_BUFFER, _2, l2.STATIC_DRAW), this._attributesBuffer = (0, s2.throwIfFalsy)(l2.createBuffer()), this.register((0, r.toDisposable)((() => l2.deleteBuffer(this._attributesBuffer)))), l2.bindBuffer(l2.ARRAY_BUFFER, this._attributesBuffer), l2.enableVertexAttribArray(0), l2.vertexAttribPointer(0, 2, l2.FLOAT, false, a, 0), l2.vertexAttribDivisor(0, 1), l2.enableVertexAttribArray(1), l2.vertexAttribPointer(1, 2, l2.FLOAT, false, a, 2 * Float32Array.BYTES_PER_ELEMENT), l2.vertexAttribDivisor(1, 1), l2.enableVertexAttribArray(2), l2.vertexAttribPointer(2, 4, l2.FLOAT, false, a, 4 * Float32Array.BYTES_PER_ELEMENT), l2.vertexAttribDivisor(2, 1), this._updateCachedColors(o2.colors), this.register(this._themeService.onChangeColors(((e4) => { + this._updateCachedColors(e4), this._updateViewportRectangle(); + }))); + } + renderBackgrounds() { + this._renderVertices(this._vertices); + } + renderCursor() { + this._renderVertices(this._verticesCursor); + } + _renderVertices(e3) { + const t3 = this._gl; + t3.useProgram(this._program), t3.bindVertexArray(this._vertexArrayObject), t3.uniformMatrix4fv(this._projectionLocation, false, n.PROJECTION_MATRIX), t3.bindBuffer(t3.ARRAY_BUFFER, this._attributesBuffer), t3.bufferData(t3.ARRAY_BUFFER, e3.attributes, t3.DYNAMIC_DRAW), t3.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, t3.UNSIGNED_BYTE, 0, e3.count); + } + handleResize() { + this._updateViewportRectangle(); + } + setDimensions(e3) { + this._dimensions = e3; + } + _updateCachedColors(e3) { + this._bgFloat = this._colorToFloat32Array(e3.background), this._cursorFloat = this._colorToFloat32Array(e3.cursor); + } + _updateViewportRectangle() { + this._addRectangleFloat(this._vertices.attributes, 0, 0, 0, this._terminal.cols * this._dimensions.device.cell.width, this._terminal.rows * this._dimensions.device.cell.height, this._bgFloat); + } + updateBackgrounds(e3) { + const t3 = this._terminal, i3 = this._vertices; + let s3, r2, n2, a2, h2, l2, c2, d2, _2, u2, g2, v2 = 1; + for (s3 = 0; s3 < t3.rows; s3++) { + for (n2 = -1, a2 = 0, h2 = 0, l2 = false, r2 = 0; r2 < t3.cols; r2++) c2 = (s3 * t3.cols + r2) * o.RENDER_MODEL_INDICIES_PER_CELL, d2 = e3.cells[c2 + o.RENDER_MODEL_BG_OFFSET], _2 = e3.cells[c2 + o.RENDER_MODEL_FG_OFFSET], u2 = !!(67108864 & _2), (d2 !== a2 || _2 !== h2 && (l2 || u2)) && ((0 !== a2 || l2 && 0 !== h2) && (g2 = 8 * v2++, this._updateRectangle(i3, g2, h2, a2, n2, r2, s3)), n2 = r2, a2 = d2, h2 = _2, l2 = u2); + (0 !== a2 || l2 && 0 !== h2) && (g2 = 8 * v2++, this._updateRectangle(i3, g2, h2, a2, n2, t3.cols, s3)); + } + i3.count = v2; + } + updateCursor(e3) { + const t3 = this._verticesCursor, i3 = e3.cursor; + if (!i3 || "block" === i3.style) return void (t3.count = 0); + let s3, r2 = 0; + "bar" !== i3.style && "outline" !== i3.style || (s3 = 8 * r2++, this._addRectangleFloat(t3.attributes, s3, i3.x * this._dimensions.device.cell.width, i3.y * this._dimensions.device.cell.height, "bar" === i3.style ? i3.dpr * i3.cursorWidth : i3.dpr, this._dimensions.device.cell.height, this._cursorFloat)), "underline" !== i3.style && "outline" !== i3.style || (s3 = 8 * r2++, this._addRectangleFloat(t3.attributes, s3, i3.x * this._dimensions.device.cell.width, (i3.y + 1) * this._dimensions.device.cell.height - i3.dpr, i3.width * this._dimensions.device.cell.width, i3.dpr, this._cursorFloat)), "outline" === i3.style && (s3 = 8 * r2++, this._addRectangleFloat(t3.attributes, s3, i3.x * this._dimensions.device.cell.width, i3.y * this._dimensions.device.cell.height, i3.width * this._dimensions.device.cell.width, i3.dpr, this._cursorFloat), s3 = 8 * r2++, this._addRectangleFloat(t3.attributes, s3, (i3.x + i3.width) * this._dimensions.device.cell.width - i3.dpr, i3.y * this._dimensions.device.cell.height, i3.dpr, this._dimensions.device.cell.height, this._cursorFloat)), t3.count = r2; + } + _updateRectangle(e3, t3, i3, s3, r2, o2, a2) { + if (67108864 & i3) switch (50331648 & i3) { + case 16777216: + case 33554432: + l = this._themeService.colors.ansi[255 & i3].rgba; + break; + case 50331648: + l = (16777215 & i3) << 8; + break; + default: + l = this._themeService.colors.foreground.rgba; + } + else switch (50331648 & s3) { + case 16777216: + case 33554432: + l = this._themeService.colors.ansi[255 & s3].rgba; + break; + case 50331648: + l = (16777215 & s3) << 8; + break; + default: + l = this._themeService.colors.background.rgba; + } + e3.attributes.length < t3 + 4 && (e3.attributes = (0, n.expandFloat32Array)(e3.attributes, this._terminal.rows * this._terminal.cols * 8)), c = r2 * this._dimensions.device.cell.width, d = a2 * this._dimensions.device.cell.height, _ = (l >> 24 & 255) / 255, u = (l >> 16 & 255) / 255, g = (l >> 8 & 255) / 255, v = 1, this._addRectangle(e3.attributes, t3, c, d, (o2 - r2) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, _, u, g, v); + } + _addRectangle(e3, t3, i3, s3, r2, o2, n2, a2, h2, l2) { + e3[t3] = i3 / this._dimensions.device.canvas.width, e3[t3 + 1] = s3 / this._dimensions.device.canvas.height, e3[t3 + 2] = r2 / this._dimensions.device.canvas.width, e3[t3 + 3] = o2 / this._dimensions.device.canvas.height, e3[t3 + 4] = n2, e3[t3 + 5] = a2, e3[t3 + 6] = h2, e3[t3 + 7] = l2; + } + _addRectangleFloat(e3, t3, i3, s3, r2, o2, n2) { + e3[t3] = i3 / this._dimensions.device.canvas.width, e3[t3 + 1] = s3 / this._dimensions.device.canvas.height, e3[t3 + 2] = r2 / this._dimensions.device.canvas.width, e3[t3 + 3] = o2 / this._dimensions.device.canvas.height, e3[t3 + 4] = n2[0], e3[t3 + 5] = n2[1], e3[t3 + 6] = n2[2], e3[t3 + 7] = n2[3]; + } + _colorToFloat32Array(e3) { + return new Float32Array([(e3.rgba >> 24 & 255) / 255, (e3.rgba >> 16 & 255) / 255, (e3.rgba >> 8 & 255) / 255, (255 & e3.rgba) / 255]); + } + } + t2.RectangleRenderer = f; + }, 310: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.RenderModel = t2.COMBINED_CHAR_BIT_MASK = t2.RENDER_MODEL_EXT_OFFSET = t2.RENDER_MODEL_FG_OFFSET = t2.RENDER_MODEL_BG_OFFSET = t2.RENDER_MODEL_INDICIES_PER_CELL = void 0; + const s2 = i2(296); + t2.RENDER_MODEL_INDICIES_PER_CELL = 4, t2.RENDER_MODEL_BG_OFFSET = 1, t2.RENDER_MODEL_FG_OFFSET = 2, t2.RENDER_MODEL_EXT_OFFSET = 3, t2.COMBINED_CHAR_BIT_MASK = 2147483648, t2.RenderModel = class { + constructor() { + this.cells = new Uint32Array(0), this.lineLengths = new Uint32Array(0), this.selection = (0, s2.createSelectionRenderModel)(); + } + resize(e3, i3) { + const s3 = e3 * i3 * t2.RENDER_MODEL_INDICIES_PER_CELL; + s3 !== this.cells.length && (this.cells = new Uint32Array(s3), this.lineLengths = new Uint32Array(i3)); + } + clear() { + this.cells.fill(0, 0), this.lineLengths.fill(0, 0); + } + }; + }, 666: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.JoinedCellData = t2.WebglRenderer = void 0; + const s2 = i2(820), r = i2(274), o = i2(627), n = i2(457), a = i2(56), h = i2(374), l = i2(345), c = i2(859), d = i2(147), _ = i2(782), u = i2(855), g = i2(965), v = i2(742), f = i2(310), p = i2(733); + class C extends c.Disposable { + constructor(e3, t3, i3, n2, d2, u2, g2, v2, C2) { + super(), this._terminal = e3, this._characterJoinerService = t3, this._charSizeService = i3, this._coreBrowserService = n2, this._coreService = d2, this._decorationService = u2, this._optionsService = g2, this._themeService = v2, this._cursorBlinkStateManager = new c.MutableDisposable(), this._charAtlasDisposable = this.register(new c.MutableDisposable()), this._observerDisposable = this.register(new c.MutableDisposable()), this._model = new f.RenderModel(), this._workCell = new _.CellData(), this._workCell2 = new _.CellData(), this._rectangleRenderer = this.register(new c.MutableDisposable()), this._glyphRenderer = this.register(new c.MutableDisposable()), this._onChangeTextureAtlas = this.register(new l.EventEmitter()), this.onChangeTextureAtlas = this._onChangeTextureAtlas.event, this._onAddTextureAtlasCanvas = this.register(new l.EventEmitter()), this.onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event, this._onRemoveTextureAtlasCanvas = this.register(new l.EventEmitter()), this.onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event, this._onRequestRedraw = this.register(new l.EventEmitter()), this.onRequestRedraw = this._onRequestRedraw.event, this._onContextLoss = this.register(new l.EventEmitter()), this.onContextLoss = this._onContextLoss.event, this.register(this._themeService.onChangeColors((() => this._handleColorChange()))), this._cellColorResolver = new r.CellColorResolver(this._terminal, this._optionsService, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService), this._core = this._terminal._core, this._renderLayers = [new p.LinkRenderLayer(this._core.screenElement, 2, this._terminal, this._core.linkifier, this._coreBrowserService, g2, this._themeService)], this.dimensions = (0, h.createRenderDimensions)(), this._devicePixelRatio = this._coreBrowserService.dpr, this._updateDimensions(), this._updateCursorBlink(), this.register(g2.onOptionChange((() => this._handleOptionsChanged()))), this._canvas = this._coreBrowserService.mainDocument.createElement("canvas"); + const m2 = { antialias: false, depth: false, preserveDrawingBuffer: C2 }; + if (this._gl = this._canvas.getContext("webgl2", m2), !this._gl) throw new Error("WebGL2 not supported " + this._gl); + this.register((0, s2.addDisposableDomListener)(this._canvas, "webglcontextlost", ((e4) => { + console.log("webglcontextlost event received"), e4.preventDefault(), this._contextRestorationTimeout = setTimeout((() => { + this._contextRestorationTimeout = void 0, console.warn("webgl context not restored; firing onContextLoss"), this._onContextLoss.fire(e4); + }), 3e3); + }))), this.register((0, s2.addDisposableDomListener)(this._canvas, "webglcontextrestored", ((e4) => { + console.warn("webglcontextrestored event received"), clearTimeout(this._contextRestorationTimeout), this._contextRestorationTimeout = void 0, (0, o.removeTerminalFromCache)(this._terminal), this._initializeWebGLState(), this._requestRedrawViewport(); + }))), this._observerDisposable.value = (0, a.observeDevicePixelDimensions)(this._canvas, this._coreBrowserService.window, ((e4, t4) => this._setCanvasDevicePixelDimensions(e4, t4))), this.register(this._coreBrowserService.onWindowChange(((e4) => { + this._observerDisposable.value = (0, a.observeDevicePixelDimensions)(this._canvas, e4, ((e5, t4) => this._setCanvasDevicePixelDimensions(e5, t4))); + }))), this._core.screenElement.appendChild(this._canvas), [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState(), this._isAttached = this._coreBrowserService.window.document.body.contains(this._core.screenElement), this.register((0, c.toDisposable)((() => { + var _a; + for (const e4 of this._renderLayers) e4.dispose(); + (_a = this._canvas.parentElement) == null ? void 0 : _a.removeChild(this._canvas), (0, o.removeTerminalFromCache)(this._terminal); + }))); + } + get textureAtlas() { + var _a; + return (_a = this._charAtlas) == null ? void 0 : _a.pages[0].canvas; + } + _handleColorChange() { + this._refreshCharAtlas(), this._clearModel(true); + } + handleDevicePixelRatioChange() { + this._devicePixelRatio !== this._coreBrowserService.dpr && (this._devicePixelRatio = this._coreBrowserService.dpr, this.handleResize(this._terminal.cols, this._terminal.rows)); + } + handleResize(e3, t3) { + var _a, _b, _c, _d; + this._updateDimensions(), this._model.resize(this._terminal.cols, this._terminal.rows); + for (const e4 of this._renderLayers) e4.resize(this._terminal, this.dimensions); + this._canvas.width = this.dimensions.device.canvas.width, this._canvas.height = this.dimensions.device.canvas.height, this._canvas.style.width = `${this.dimensions.css.canvas.width}px`, this._canvas.style.height = `${this.dimensions.css.canvas.height}px`, this._core.screenElement.style.width = `${this.dimensions.css.canvas.width}px`, this._core.screenElement.style.height = `${this.dimensions.css.canvas.height}px`, (_a = this._rectangleRenderer.value) == null ? void 0 : _a.setDimensions(this.dimensions), (_b = this._rectangleRenderer.value) == null ? void 0 : _b.handleResize(), (_c = this._glyphRenderer.value) == null ? void 0 : _c.setDimensions(this.dimensions), (_d = this._glyphRenderer.value) == null ? void 0 : _d.handleResize(), this._refreshCharAtlas(), this._clearModel(false); + } + handleCharSizeChanged() { + this.handleResize(this._terminal.cols, this._terminal.rows); + } + handleBlur() { + var _a; + for (const e3 of this._renderLayers) e3.handleBlur(this._terminal); + (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.pause(), this._requestRedrawViewport(); + } + handleFocus() { + var _a; + for (const e3 of this._renderLayers) e3.handleFocus(this._terminal); + (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.resume(), this._requestRedrawViewport(); + } + handleSelectionChanged(e3, t3, i3) { + for (const s3 of this._renderLayers) s3.handleSelectionChanged(this._terminal, e3, t3, i3); + this._model.selection.update(this._core, e3, t3, i3), this._requestRedrawViewport(); + } + handleCursorMove() { + var _a; + for (const e3 of this._renderLayers) e3.handleCursorMove(this._terminal); + (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.restartBlinkAnimation(); + } + _handleOptionsChanged() { + this._updateDimensions(), this._refreshCharAtlas(), this._updateCursorBlink(); + } + _initializeWebGLState() { + return this._rectangleRenderer.value = new v.RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService), this._glyphRenderer.value = new g.GlyphRenderer(this._terminal, this._gl, this.dimensions, this._optionsService), this.handleCharSizeChanged(), [this._rectangleRenderer.value, this._glyphRenderer.value]; + } + _refreshCharAtlas() { + var _a; + if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) return void (this._isAttached = false); + const e3 = (0, o.acquireTextureAtlas)(this._terminal, this._optionsService.rawOptions, this._themeService.colors, this.dimensions.device.cell.width, this.dimensions.device.cell.height, this.dimensions.device.char.width, this.dimensions.device.char.height, this._coreBrowserService.dpr); + this._charAtlas !== e3 && (this._onChangeTextureAtlas.fire(e3.pages[0].canvas), this._charAtlasDisposable.value = (0, c.getDisposeArrayDisposable)([(0, l.forwardEvent)(e3.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas), (0, l.forwardEvent)(e3.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)])), this._charAtlas = e3, this._charAtlas.warmUp(), (_a = this._glyphRenderer.value) == null ? void 0 : _a.setAtlas(this._charAtlas); + } + _clearModel(e3) { + var _a; + this._model.clear(), e3 && ((_a = this._glyphRenderer.value) == null ? void 0 : _a.clear()); + } + clearTextureAtlas() { + var _a; + (_a = this._charAtlas) == null ? void 0 : _a.clearTexture(), this._clearModel(true), this._requestRedrawViewport(); + } + clear() { + var _a; + this._clearModel(true); + for (const e3 of this._renderLayers) e3.reset(this._terminal); + (_a = this._cursorBlinkStateManager.value) == null ? void 0 : _a.restartBlinkAnimation(), this._updateCursorBlink(); + } + registerCharacterJoiner(e3) { + return -1; + } + deregisterCharacterJoiner(e3) { + return false; + } + renderRows(e3, t3) { + if (!this._isAttached) { + if (!(this._coreBrowserService.window.document.body.contains(this._core.screenElement) && this._charSizeService.width && this._charSizeService.height)) return; + this._updateDimensions(), this._refreshCharAtlas(), this._isAttached = true; + } + for (const i3 of this._renderLayers) i3.handleGridChanged(this._terminal, e3, t3); + this._glyphRenderer.value && this._rectangleRenderer.value && (this._glyphRenderer.value.beginFrame() ? (this._clearModel(true), this._updateModel(0, this._terminal.rows - 1)) : this._updateModel(e3, t3), this._rectangleRenderer.value.renderBackgrounds(), this._glyphRenderer.value.render(this._model), this._cursorBlinkStateManager.value && !this._cursorBlinkStateManager.value.isCursorVisible || this._rectangleRenderer.value.renderCursor()); + } + _updateCursorBlink() { + this._terminal.options.cursorBlink ? this._cursorBlinkStateManager.value = new n.CursorBlinkStateManager((() => { + this._requestRedrawCursor(); + }), this._coreBrowserService) : this._cursorBlinkStateManager.clear(), this._requestRedrawCursor(); + } + _updateModel(e3, t3) { + const i3 = this._core; + let s3, r2, o2, n2, a2, h2, l2, c2, d2, _2, g2, v2, p2, C2, x = this._workCell; + e3 = L(e3, i3.rows - 1, 0), t3 = L(t3, i3.rows - 1, 0); + const w = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY, b = w - i3.buffer.ydisp, M = Math.min(this._terminal.buffer.active.cursorX, i3.cols - 1); + let R = -1; + const y = this._coreService.isCursorInitialized && !this._coreService.isCursorHidden && (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible); + this._model.cursor = void 0; + let A = false; + for (r2 = e3; r2 <= t3; r2++) for (o2 = r2 + i3.buffer.ydisp, n2 = i3.buffer.lines.get(o2), this._model.lineLengths[r2] = 0, a2 = this._characterJoinerService.getJoinedCharacters(o2), p2 = 0; p2 < i3.cols; p2++) if (s3 = this._cellColorResolver.result.bg, n2.loadCell(p2, x), 0 === p2 && (s3 = this._cellColorResolver.result.bg), h2 = false, l2 = p2, a2.length > 0 && p2 === a2[0][0] && (h2 = true, c2 = a2.shift(), x = new m(x, n2.translateToString(true, c2[0], c2[1]), c2[1] - c2[0]), l2 = c2[1] - 1), d2 = x.getChars(), _2 = x.getCode(), v2 = (r2 * i3.cols + p2) * f.RENDER_MODEL_INDICIES_PER_CELL, this._cellColorResolver.resolve(x, p2, o2, this.dimensions.device.cell.width), y && o2 === w && (p2 === M && (this._model.cursor = { x: M, y: b, width: x.getWidth(), style: this._coreBrowserService.isFocused ? i3.options.cursorStyle || "block" : i3.options.cursorInactiveStyle, cursorWidth: i3.options.cursorWidth, dpr: this._devicePixelRatio }, R = M + x.getWidth() - 1), p2 >= M && p2 <= R && (this._coreBrowserService.isFocused && "block" === (i3.options.cursorStyle || "block") || false === this._coreBrowserService.isFocused && "block" === i3.options.cursorInactiveStyle) && (this._cellColorResolver.result.fg = 50331648 | this._themeService.colors.cursorAccent.rgba >> 8 & 16777215, this._cellColorResolver.result.bg = 50331648 | this._themeService.colors.cursor.rgba >> 8 & 16777215)), _2 !== u.NULL_CELL_CODE && (this._model.lineLengths[r2] = p2 + 1), (this._model.cells[v2] !== _2 || this._model.cells[v2 + f.RENDER_MODEL_BG_OFFSET] !== this._cellColorResolver.result.bg || this._model.cells[v2 + f.RENDER_MODEL_FG_OFFSET] !== this._cellColorResolver.result.fg || this._model.cells[v2 + f.RENDER_MODEL_EXT_OFFSET] !== this._cellColorResolver.result.ext) && (A = true, d2.length > 1 && (_2 |= f.COMBINED_CHAR_BIT_MASK), this._model.cells[v2] = _2, this._model.cells[v2 + f.RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg, this._model.cells[v2 + f.RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg, this._model.cells[v2 + f.RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext, g2 = x.getWidth(), this._glyphRenderer.value.updateCell(p2, r2, _2, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, d2, g2, s3), h2)) for (x = this._workCell, p2++; p2 < l2; p2++) C2 = (r2 * i3.cols + p2) * f.RENDER_MODEL_INDICIES_PER_CELL, this._glyphRenderer.value.updateCell(p2, r2, u.NULL_CELL_CODE, 0, 0, 0, u.NULL_CELL_CHAR, 0, 0), this._model.cells[C2] = u.NULL_CELL_CODE, this._model.cells[C2 + f.RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg, this._model.cells[C2 + f.RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg, this._model.cells[C2 + f.RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext; + A && this._rectangleRenderer.value.updateBackgrounds(this._model), this._rectangleRenderer.value.updateCursor(this._model); + } + _updateDimensions() { + this._charSizeService.width && this._charSizeService.height && (this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio), this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio), this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight), this.dimensions.device.char.top = 1 === this._optionsService.rawOptions.lineHeight ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2), this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing), this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2), this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height, this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width, this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio), this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio), this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio, this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio); + } + _setCanvasDevicePixelDimensions(e3, t3) { + this._canvas.width === e3 && this._canvas.height === t3 || (this._canvas.width = e3, this._canvas.height = t3, this._requestRedrawViewport()); + } + _requestRedrawViewport() { + this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 }); + } + _requestRedrawCursor() { + const e3 = this._terminal.buffer.active.cursorY; + this._onRequestRedraw.fire({ start: e3, end: e3 }); + } + } + t2.WebglRenderer = C; + class m extends d.AttributeData { + constructor(e3, t3, i3) { + super(), this.content = 0, this.combinedData = "", this.fg = e3.fg, this.bg = e3.bg, this.combinedData = t3, this._width = i3; + } + isCombined() { + return 2097152; + } + getWidth() { + return this._width; + } + getChars() { + return this.combinedData; + } + getCode() { + return 2097151; + } + setFromCharData(e3) { + throw new Error("not implemented"); + } + getAsCharData() { + return [this.fg, this.getChars(), this.getWidth(), this.getCode()]; + } + } + function L(e3, t3, i3 = 0) { + return Math.max(Math.min(e3, t3), i3); + } + t2.JoinedCellData = m; + }, 381: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.GLTexture = t2.expandFloat32Array = t2.createShader = t2.createProgram = t2.PROJECTION_MATRIX = void 0; + const s2 = i2(374); + function r(e3, t3, i3) { + const r2 = (0, s2.throwIfFalsy)(e3.createShader(t3)); + if (e3.shaderSource(r2, i3), e3.compileShader(r2), e3.getShaderParameter(r2, e3.COMPILE_STATUS)) return r2; + console.error(e3.getShaderInfoLog(r2)), e3.deleteShader(r2); + } + t2.PROJECTION_MATRIX = new Float32Array([2, 0, 0, 0, 0, -2, 0, 0, 0, 0, 1, 0, -1, 1, 0, 1]), t2.createProgram = function(e3, t3, i3) { + const o = (0, s2.throwIfFalsy)(e3.createProgram()); + if (e3.attachShader(o, (0, s2.throwIfFalsy)(r(e3, e3.VERTEX_SHADER, t3))), e3.attachShader(o, (0, s2.throwIfFalsy)(r(e3, e3.FRAGMENT_SHADER, i3))), e3.linkProgram(o), e3.getProgramParameter(o, e3.LINK_STATUS)) return o; + console.error(e3.getProgramInfoLog(o)), e3.deleteProgram(o); + }, t2.createShader = r, t2.expandFloat32Array = function(e3, t3) { + const i3 = Math.min(2 * e3.length, t3), s3 = new Float32Array(i3); + for (let t4 = 0; t4 < e3.length; t4++) s3[t4] = e3[t4]; + return s3; + }, t2.GLTexture = class { + constructor(e3) { + this.texture = e3, this.version = -1; + } + }; + }, 592: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.BaseRenderLayer = void 0; + const s2 = i2(627), r = i2(237), o = i2(374), n = i2(859); + class a extends n.Disposable { + constructor(e3, t3, i3, s3, r2, o2, a2, h) { + super(), this._container = t3, this._alpha = r2, this._coreBrowserService = o2, this._optionsService = a2, this._themeService = h, this._deviceCharWidth = 0, this._deviceCharHeight = 0, this._deviceCellWidth = 0, this._deviceCellHeight = 0, this._deviceCharLeft = 0, this._deviceCharTop = 0, this._canvas = this._coreBrowserService.mainDocument.createElement("canvas"), this._canvas.classList.add(`xterm-${i3}-layer`), this._canvas.style.zIndex = s3.toString(), this._initCanvas(), this._container.appendChild(this._canvas), this.register(this._themeService.onChangeColors(((t4) => { + this._refreshCharAtlas(e3, t4), this.reset(e3); + }))), this.register((0, n.toDisposable)((() => { + this._canvas.remove(); + }))); + } + _initCanvas() { + this._ctx = (0, o.throwIfFalsy)(this._canvas.getContext("2d", { alpha: this._alpha })), this._alpha || this._clearAll(); + } + handleBlur(e3) { + } + handleFocus(e3) { + } + handleCursorMove(e3) { + } + handleGridChanged(e3, t3, i3) { + } + handleSelectionChanged(e3, t3, i3, s3 = false) { + } + _setTransparency(e3, t3) { + if (t3 === this._alpha) return; + const i3 = this._canvas; + this._alpha = t3, this._canvas = this._canvas.cloneNode(), this._initCanvas(), this._container.replaceChild(this._canvas, i3), this._refreshCharAtlas(e3, this._themeService.colors), this.handleGridChanged(e3, 0, e3.rows - 1); + } + _refreshCharAtlas(e3, t3) { + this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0 || (this._charAtlas = (0, s2.acquireTextureAtlas)(e3, this._optionsService.rawOptions, t3, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr), this._charAtlas.warmUp()); + } + resize(e3, t3) { + this._deviceCellWidth = t3.device.cell.width, this._deviceCellHeight = t3.device.cell.height, this._deviceCharWidth = t3.device.char.width, this._deviceCharHeight = t3.device.char.height, this._deviceCharLeft = t3.device.char.left, this._deviceCharTop = t3.device.char.top, this._canvas.width = t3.device.canvas.width, this._canvas.height = t3.device.canvas.height, this._canvas.style.width = `${t3.css.canvas.width}px`, this._canvas.style.height = `${t3.css.canvas.height}px`, this._alpha || this._clearAll(), this._refreshCharAtlas(e3, this._themeService.colors); + } + _fillBottomLineAtCells(e3, t3, i3 = 1) { + this._ctx.fillRect(e3 * this._deviceCellWidth, (t3 + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1, i3 * this._deviceCellWidth, this._coreBrowserService.dpr); + } + _clearAll() { + this._alpha ? this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height) : (this._ctx.fillStyle = this._themeService.colors.background.css, this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height)); + } + _clearCells(e3, t3, i3, s3) { + this._alpha ? this._ctx.clearRect(e3 * this._deviceCellWidth, t3 * this._deviceCellHeight, i3 * this._deviceCellWidth, s3 * this._deviceCellHeight) : (this._ctx.fillStyle = this._themeService.colors.background.css, this._ctx.fillRect(e3 * this._deviceCellWidth, t3 * this._deviceCellHeight, i3 * this._deviceCellWidth, s3 * this._deviceCellHeight)); + } + _fillCharTrueColor(e3, t3, i3, s3) { + this._ctx.font = this._getFont(e3, false, false), this._ctx.textBaseline = r.TEXT_BASELINE, this._clipCell(i3, s3, t3.getWidth()), this._ctx.fillText(t3.getChars(), i3 * this._deviceCellWidth + this._deviceCharLeft, s3 * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight); + } + _clipCell(e3, t3, i3) { + this._ctx.beginPath(), this._ctx.rect(e3 * this._deviceCellWidth, t3 * this._deviceCellHeight, i3 * this._deviceCellWidth, this._deviceCellHeight), this._ctx.clip(); + } + _getFont(e3, t3, i3) { + return `${i3 ? "italic" : ""} ${t3 ? e3.options.fontWeightBold : e3.options.fontWeight} ${e3.options.fontSize * this._coreBrowserService.dpr}px ${e3.options.fontFamily}`; + } + } + t2.BaseRenderLayer = a; + }, 733: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.LinkRenderLayer = void 0; + const s2 = i2(197), r = i2(237), o = i2(592); + class n extends o.BaseRenderLayer { + constructor(e3, t3, i3, s3, r2, o2, n2) { + super(i3, e3, "link", t3, true, r2, o2, n2), this.register(s3.onShowLinkUnderline(((e4) => this._handleShowLinkUnderline(e4)))), this.register(s3.onHideLinkUnderline(((e4) => this._handleHideLinkUnderline(e4)))); + } + resize(e3, t3) { + super.resize(e3, t3), this._state = void 0; + } + reset(e3) { + this._clearCurrentLink(); + } + _clearCurrentLink() { + if (this._state) { + this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1); + const e3 = this._state.y2 - this._state.y1 - 1; + e3 > 0 && this._clearCells(0, this._state.y1 + 1, this._state.cols, e3), this._clearCells(0, this._state.y2, this._state.x2, 1), this._state = void 0; + } + } + _handleShowLinkUnderline(e3) { + if (e3.fg === r.INVERTED_DEFAULT_COLOR ? this._ctx.fillStyle = this._themeService.colors.background.css : void 0 !== e3.fg && (0, s2.is256Color)(e3.fg) ? this._ctx.fillStyle = this._themeService.colors.ansi[e3.fg].css : this._ctx.fillStyle = this._themeService.colors.foreground.css, e3.y1 === e3.y2) this._fillBottomLineAtCells(e3.x1, e3.y1, e3.x2 - e3.x1); + else { + this._fillBottomLineAtCells(e3.x1, e3.y1, e3.cols - e3.x1); + for (let t3 = e3.y1 + 1; t3 < e3.y2; t3++) this._fillBottomLineAtCells(0, t3, e3.cols); + this._fillBottomLineAtCells(0, e3.y2, e3.x2); + } + this._state = e3; + } + _handleHideLinkUnderline(e3) { + this._clearCurrentLink(); + } + } + t2.LinkRenderLayer = n; + }, 820: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.addDisposableDomListener = void 0, t2.addDisposableDomListener = function(e3, t3, i2, s2) { + e3.addEventListener(t3, i2, s2); + let r = false; + return { dispose: () => { + r || (r = true, e3.removeEventListener(t3, i2, s2)); + } }; + }; + }, 274: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CellColorResolver = void 0; + const s2 = i2(855), r = i2(160), o = i2(374); + let n, a = 0, h = 0, l = false, c = false, d = false, _ = 0; + t2.CellColorResolver = class { + constructor(e3, t3, i3, s3, r2, o2) { + this._terminal = e3, this._optionService = t3, this._selectionRenderModel = i3, this._decorationService = s3, this._coreBrowserService = r2, this._themeService = o2, this.result = { fg: 0, bg: 0, ext: 0 }; + } + resolve(e3, t3, i3, u) { + if (this.result.bg = e3.bg, this.result.fg = e3.fg, this.result.ext = 268435456 & e3.bg ? e3.extended.ext : 0, h = 0, a = 0, c = false, l = false, d = false, n = this._themeService.colors, _ = 0, e3.getCode() !== s2.NULL_CELL_CODE && 4 === e3.extended.underlineStyle) { + const e4 = Math.max(1, Math.floor(this._optionService.rawOptions.fontSize * this._coreBrowserService.dpr / 15)); + _ = t3 * u % (2 * Math.round(e4)); + } + if (this._decorationService.forEachDecorationAtCell(t3, i3, "bottom", ((e4) => { + e4.backgroundColorRGB && (h = e4.backgroundColorRGB.rgba >> 8 & 16777215, c = true), e4.foregroundColorRGB && (a = e4.foregroundColorRGB.rgba >> 8 & 16777215, l = true); + })), d = this._selectionRenderModel.isCellSelected(this._terminal, t3, i3), d) { + if (67108864 & this.result.fg || 0 != (50331648 & this.result.bg)) { + if (67108864 & this.result.fg) switch (50331648 & this.result.fg) { + case 16777216: + case 33554432: + h = this._themeService.colors.ansi[255 & this.result.fg].rgba; + break; + case 50331648: + h = (16777215 & this.result.fg) << 8 | 255; + break; + default: + h = this._themeService.colors.foreground.rgba; + } + else switch (50331648 & this.result.bg) { + case 16777216: + case 33554432: + h = this._themeService.colors.ansi[255 & this.result.bg].rgba; + break; + case 50331648: + h = (16777215 & this.result.bg) << 8 | 255; + } + h = r.rgba.blend(h, 4294967040 & (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba | 128) >> 8 & 16777215; + } else h = (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba >> 8 & 16777215; + if (c = true, n.selectionForeground && (a = n.selectionForeground.rgba >> 8 & 16777215, l = true), (0, o.treatGlyphAsBackgroundColor)(e3.getCode())) { + if (67108864 & this.result.fg && 0 == (50331648 & this.result.bg)) a = (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba >> 8 & 16777215; + else { + if (67108864 & this.result.fg) switch (50331648 & this.result.bg) { + case 16777216: + case 33554432: + a = this._themeService.colors.ansi[255 & this.result.bg].rgba; + break; + case 50331648: + a = (16777215 & this.result.bg) << 8 | 255; + } + else switch (50331648 & this.result.fg) { + case 16777216: + case 33554432: + a = this._themeService.colors.ansi[255 & this.result.fg].rgba; + break; + case 50331648: + a = (16777215 & this.result.fg) << 8 | 255; + break; + default: + a = this._themeService.colors.foreground.rgba; + } + a = r.rgba.blend(a, 4294967040 & (this._coreBrowserService.isFocused ? n.selectionBackgroundOpaque : n.selectionInactiveBackgroundOpaque).rgba | 128) >> 8 & 16777215; + } + l = true; + } + } + this._decorationService.forEachDecorationAtCell(t3, i3, "top", ((e4) => { + e4.backgroundColorRGB && (h = e4.backgroundColorRGB.rgba >> 8 & 16777215, c = true), e4.foregroundColorRGB && (a = e4.foregroundColorRGB.rgba >> 8 & 16777215, l = true); + })), c && (h = d ? -16777216 & e3.bg & -134217729 | h | 50331648 : -16777216 & e3.bg | h | 50331648), l && (a = -16777216 & e3.fg & -67108865 | a | 50331648), 67108864 & this.result.fg && (c && !l && (a = 0 == (50331648 & this.result.bg) ? -134217728 & this.result.fg | 16777215 & n.background.rgba >> 8 | 50331648 : -134217728 & this.result.fg | 67108863 & this.result.bg, l = true), !c && l && (h = 0 == (50331648 & this.result.fg) ? -67108864 & this.result.bg | 16777215 & n.foreground.rgba >> 8 | 50331648 : -67108864 & this.result.bg | 67108863 & this.result.fg, c = true)), n = void 0, this.result.bg = c ? h : this.result.bg, this.result.fg = l ? a : this.result.fg, this.result.ext &= 536870911, this.result.ext |= _ << 29 & 3758096384; + } + }; + }, 627: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.removeTerminalFromCache = t2.acquireTextureAtlas = void 0; + const s2 = i2(509), r = i2(197), o = []; + t2.acquireTextureAtlas = function(e3, t3, i3, n, a, h, l, c) { + const d = (0, r.generateConfig)(n, a, h, l, t3, i3, c); + for (let t4 = 0; t4 < o.length; t4++) { + const i4 = o[t4], s3 = i4.ownedBy.indexOf(e3); + if (s3 >= 0) { + if ((0, r.configEquals)(i4.config, d)) return i4.atlas; + 1 === i4.ownedBy.length ? (i4.atlas.dispose(), o.splice(t4, 1)) : i4.ownedBy.splice(s3, 1); + break; + } + } + for (let t4 = 0; t4 < o.length; t4++) { + const i4 = o[t4]; + if ((0, r.configEquals)(i4.config, d)) return i4.ownedBy.push(e3), i4.atlas; + } + const _ = e3._core, u = { atlas: new s2.TextureAtlas(document, d, _.unicodeService), config: d, ownedBy: [e3] }; + return o.push(u), u.atlas; + }, t2.removeTerminalFromCache = function(e3) { + for (let t3 = 0; t3 < o.length; t3++) { + const i3 = o[t3].ownedBy.indexOf(e3); + if (-1 !== i3) { + 1 === o[t3].ownedBy.length ? (o[t3].atlas.dispose(), o.splice(t3, 1)) : o[t3].ownedBy.splice(i3, 1); + break; + } + } + }; + }, 197: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.is256Color = t2.configEquals = t2.generateConfig = void 0; + const s2 = i2(160); + t2.generateConfig = function(e3, t3, i3, r, o, n, a) { + const h = { foreground: n.foreground, background: n.background, cursor: s2.NULL_COLOR, cursorAccent: s2.NULL_COLOR, selectionForeground: s2.NULL_COLOR, selectionBackgroundTransparent: s2.NULL_COLOR, selectionBackgroundOpaque: s2.NULL_COLOR, selectionInactiveBackgroundTransparent: s2.NULL_COLOR, selectionInactiveBackgroundOpaque: s2.NULL_COLOR, ansi: n.ansi.slice(), contrastCache: n.contrastCache, halfContrastCache: n.halfContrastCache }; + return { customGlyphs: o.customGlyphs, devicePixelRatio: a, letterSpacing: o.letterSpacing, lineHeight: o.lineHeight, deviceCellWidth: e3, deviceCellHeight: t3, deviceCharWidth: i3, deviceCharHeight: r, fontFamily: o.fontFamily, fontSize: o.fontSize, fontWeight: o.fontWeight, fontWeightBold: o.fontWeightBold, allowTransparency: o.allowTransparency, drawBoldTextInBrightColors: o.drawBoldTextInBrightColors, minimumContrastRatio: o.minimumContrastRatio, colors: h }; + }, t2.configEquals = function(e3, t3) { + for (let i3 = 0; i3 < e3.colors.ansi.length; i3++) if (e3.colors.ansi[i3].rgba !== t3.colors.ansi[i3].rgba) return false; + return e3.devicePixelRatio === t3.devicePixelRatio && e3.customGlyphs === t3.customGlyphs && e3.lineHeight === t3.lineHeight && e3.letterSpacing === t3.letterSpacing && e3.fontFamily === t3.fontFamily && e3.fontSize === t3.fontSize && e3.fontWeight === t3.fontWeight && e3.fontWeightBold === t3.fontWeightBold && e3.allowTransparency === t3.allowTransparency && e3.deviceCharWidth === t3.deviceCharWidth && e3.deviceCharHeight === t3.deviceCharHeight && e3.drawBoldTextInBrightColors === t3.drawBoldTextInBrightColors && e3.minimumContrastRatio === t3.minimumContrastRatio && e3.colors.foreground.rgba === t3.colors.foreground.rgba && e3.colors.background.rgba === t3.colors.background.rgba; + }, t2.is256Color = function(e3) { + return 16777216 == (50331648 & e3) || 33554432 == (50331648 & e3); + }; + }, 237: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.TEXT_BASELINE = t2.DIM_OPACITY = t2.INVERTED_DEFAULT_COLOR = void 0; + const s2 = i2(399); + t2.INVERTED_DEFAULT_COLOR = 257, t2.DIM_OPACITY = 0.5, t2.TEXT_BASELINE = s2.isFirefox || s2.isLegacyEdge ? "bottom" : "ideographic"; + }, 457: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CursorBlinkStateManager = void 0; + t2.CursorBlinkStateManager = class { + constructor(e3, t3) { + this._renderCallback = e3, this._coreBrowserService = t3, this.isCursorVisible = true, this._coreBrowserService.isFocused && this._restartInterval(); + } + get isPaused() { + return !(this._blinkStartTimeout || this._blinkInterval); + } + dispose() { + this._blinkInterval && (this._coreBrowserService.window.clearInterval(this._blinkInterval), this._blinkInterval = void 0), this._blinkStartTimeout && (this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout), this._blinkStartTimeout = void 0), this._animationFrame && (this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame), this._animationFrame = void 0); + } + restartBlinkAnimation() { + this.isPaused || (this._animationTimeRestarted = Date.now(), this.isCursorVisible = true, this._animationFrame || (this._animationFrame = this._coreBrowserService.window.requestAnimationFrame((() => { + this._renderCallback(), this._animationFrame = void 0; + })))); + } + _restartInterval(e3 = 600) { + this._blinkInterval && (this._coreBrowserService.window.clearInterval(this._blinkInterval), this._blinkInterval = void 0), this._blinkStartTimeout = this._coreBrowserService.window.setTimeout((() => { + if (this._animationTimeRestarted) { + const e4 = 600 - (Date.now() - this._animationTimeRestarted); + if (this._animationTimeRestarted = void 0, e4 > 0) return void this._restartInterval(e4); + } + this.isCursorVisible = false, this._animationFrame = this._coreBrowserService.window.requestAnimationFrame((() => { + this._renderCallback(), this._animationFrame = void 0; + })), this._blinkInterval = this._coreBrowserService.window.setInterval((() => { + if (this._animationTimeRestarted) { + const e4 = 600 - (Date.now() - this._animationTimeRestarted); + return this._animationTimeRestarted = void 0, void this._restartInterval(e4); + } + this.isCursorVisible = !this.isCursorVisible, this._animationFrame = this._coreBrowserService.window.requestAnimationFrame((() => { + this._renderCallback(), this._animationFrame = void 0; + })); + }), 600); + }), e3); + } + pause() { + this.isCursorVisible = true, this._blinkInterval && (this._coreBrowserService.window.clearInterval(this._blinkInterval), this._blinkInterval = void 0), this._blinkStartTimeout && (this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout), this._blinkStartTimeout = void 0), this._animationFrame && (this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame), this._animationFrame = void 0); + } + resume() { + this.pause(), this._animationTimeRestarted = void 0, this._restartInterval(), this.restartBlinkAnimation(); + } + }; + }, 860: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.tryDrawCustomChar = t2.powerlineDefinitions = t2.boxDrawingDefinitions = t2.blockElementDefinitions = void 0; + const s2 = i2(374); + t2.blockElementDefinitions = { "\u2580": [{ x: 0, y: 0, w: 8, h: 4 }], "\u2581": [{ x: 0, y: 7, w: 8, h: 1 }], "\u2582": [{ x: 0, y: 6, w: 8, h: 2 }], "\u2583": [{ x: 0, y: 5, w: 8, h: 3 }], "\u2584": [{ x: 0, y: 4, w: 8, h: 4 }], "\u2585": [{ x: 0, y: 3, w: 8, h: 5 }], "\u2586": [{ x: 0, y: 2, w: 8, h: 6 }], "\u2587": [{ x: 0, y: 1, w: 8, h: 7 }], "\u2588": [{ x: 0, y: 0, w: 8, h: 8 }], "\u2589": [{ x: 0, y: 0, w: 7, h: 8 }], "\u258A": [{ x: 0, y: 0, w: 6, h: 8 }], "\u258B": [{ x: 0, y: 0, w: 5, h: 8 }], "\u258C": [{ x: 0, y: 0, w: 4, h: 8 }], "\u258D": [{ x: 0, y: 0, w: 3, h: 8 }], "\u258E": [{ x: 0, y: 0, w: 2, h: 8 }], "\u258F": [{ x: 0, y: 0, w: 1, h: 8 }], "\u2590": [{ x: 4, y: 0, w: 4, h: 8 }], "\u2594": [{ x: 0, y: 0, w: 8, h: 1 }], "\u2595": [{ x: 7, y: 0, w: 1, h: 8 }], "\u2596": [{ x: 0, y: 4, w: 4, h: 4 }], "\u2597": [{ x: 4, y: 4, w: 4, h: 4 }], "\u2598": [{ x: 0, y: 0, w: 4, h: 4 }], "\u2599": [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], "\u259A": [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }], "\u259B": [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }], "\u259C": [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }], "\u259D": [{ x: 4, y: 0, w: 4, h: 4 }], "\u259E": [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }], "\u259F": [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], "\u{1FB70}": [{ x: 1, y: 0, w: 1, h: 8 }], "\u{1FB71}": [{ x: 2, y: 0, w: 1, h: 8 }], "\u{1FB72}": [{ x: 3, y: 0, w: 1, h: 8 }], "\u{1FB73}": [{ x: 4, y: 0, w: 1, h: 8 }], "\u{1FB74}": [{ x: 5, y: 0, w: 1, h: 8 }], "\u{1FB75}": [{ x: 6, y: 0, w: 1, h: 8 }], "\u{1FB76}": [{ x: 0, y: 1, w: 8, h: 1 }], "\u{1FB77}": [{ x: 0, y: 2, w: 8, h: 1 }], "\u{1FB78}": [{ x: 0, y: 3, w: 8, h: 1 }], "\u{1FB79}": [{ x: 0, y: 4, w: 8, h: 1 }], "\u{1FB7A}": [{ x: 0, y: 5, w: 8, h: 1 }], "\u{1FB7B}": [{ x: 0, y: 6, w: 8, h: 1 }], "\u{1FB7C}": [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }], "\u{1FB7D}": [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }], "\u{1FB7E}": [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }], "\u{1FB7F}": [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }], "\u{1FB80}": [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }], "\u{1FB81}": [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }], "\u{1FB82}": [{ x: 0, y: 0, w: 8, h: 2 }], "\u{1FB83}": [{ x: 0, y: 0, w: 8, h: 3 }], "\u{1FB84}": [{ x: 0, y: 0, w: 8, h: 5 }], "\u{1FB85}": [{ x: 0, y: 0, w: 8, h: 6 }], "\u{1FB86}": [{ x: 0, y: 0, w: 8, h: 7 }], "\u{1FB87}": [{ x: 6, y: 0, w: 2, h: 8 }], "\u{1FB88}": [{ x: 5, y: 0, w: 3, h: 8 }], "\u{1FB89}": [{ x: 3, y: 0, w: 5, h: 8 }], "\u{1FB8A}": [{ x: 2, y: 0, w: 6, h: 8 }], "\u{1FB8B}": [{ x: 1, y: 0, w: 7, h: 8 }], "\u{1FB95}": [{ x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 }, { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 }, { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 }, { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }], "\u{1FB96}": [{ x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 }, { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 }, { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 }, { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }], "\u{1FB97}": [{ x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }] }; + const r = { "\u2591": [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0]], "\u2592": [[1, 0], [0, 0], [0, 1], [0, 0]], "\u2593": [[0, 1], [1, 1], [1, 0], [1, 1]] }; + t2.boxDrawingDefinitions = { "\u2500": { 1: "M0,.5 L1,.5" }, "\u2501": { 3: "M0,.5 L1,.5" }, "\u2502": { 1: "M.5,0 L.5,1" }, "\u2503": { 3: "M.5,0 L.5,1" }, "\u250C": { 1: "M0.5,1 L.5,.5 L1,.5" }, "\u250F": { 3: "M0.5,1 L.5,.5 L1,.5" }, "\u2510": { 1: "M0,.5 L.5,.5 L.5,1" }, "\u2513": { 3: "M0,.5 L.5,.5 L.5,1" }, "\u2514": { 1: "M.5,0 L.5,.5 L1,.5" }, "\u2517": { 3: "M.5,0 L.5,.5 L1,.5" }, "\u2518": { 1: "M.5,0 L.5,.5 L0,.5" }, "\u251B": { 3: "M.5,0 L.5,.5 L0,.5" }, "\u251C": { 1: "M.5,0 L.5,1 M.5,.5 L1,.5" }, "\u2523": { 3: "M.5,0 L.5,1 M.5,.5 L1,.5" }, "\u2524": { 1: "M.5,0 L.5,1 M.5,.5 L0,.5" }, "\u252B": { 3: "M.5,0 L.5,1 M.5,.5 L0,.5" }, "\u252C": { 1: "M0,.5 L1,.5 M.5,.5 L.5,1" }, "\u2533": { 3: "M0,.5 L1,.5 M.5,.5 L.5,1" }, "\u2534": { 1: "M0,.5 L1,.5 M.5,.5 L.5,0" }, "\u253B": { 3: "M0,.5 L1,.5 M.5,.5 L.5,0" }, "\u253C": { 1: "M0,.5 L1,.5 M.5,0 L.5,1" }, "\u254B": { 3: "M0,.5 L1,.5 M.5,0 L.5,1" }, "\u2574": { 1: "M.5,.5 L0,.5" }, "\u2578": { 3: "M.5,.5 L0,.5" }, "\u2575": { 1: "M.5,.5 L.5,0" }, "\u2579": { 3: "M.5,.5 L.5,0" }, "\u2576": { 1: "M.5,.5 L1,.5" }, "\u257A": { 3: "M.5,.5 L1,.5" }, "\u2577": { 1: "M.5,.5 L.5,1" }, "\u257B": { 3: "M.5,.5 L.5,1" }, "\u2550": { 1: (e3, t3) => `M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3}` }, "\u2551": { 1: (e3, t3) => `M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1` }, "\u2552": { 1: (e3, t3) => `M.5,1 L.5,${0.5 - t3} L1,${0.5 - t3} M.5,${0.5 + t3} L1,${0.5 + t3}` }, "\u2553": { 1: (e3, t3) => `M${0.5 - e3},1 L${0.5 - e3},.5 L1,.5 M${0.5 + e3},.5 L${0.5 + e3},1` }, "\u2554": { 1: (e3, t3) => `M1,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1` }, "\u2555": { 1: (e3, t3) => `M0,${0.5 - t3} L.5,${0.5 - t3} L.5,1 M0,${0.5 + t3} L.5,${0.5 + t3}` }, "\u2556": { 1: (e3, t3) => `M${0.5 + e3},1 L${0.5 + e3},.5 L0,.5 M${0.5 - e3},.5 L${0.5 - e3},1` }, "\u2557": { 1: (e3, t3) => `M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M0,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},1` }, "\u2558": { 1: (e3, t3) => `M.5,0 L.5,${0.5 + t3} L1,${0.5 + t3} M.5,${0.5 - t3} L1,${0.5 - t3}` }, "\u2559": { 1: (e3, t3) => `M1,.5 L${0.5 - e3},.5 L${0.5 - e3},0 M${0.5 + e3},.5 L${0.5 + e3},0` }, "\u255A": { 1: (e3, t3) => `M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0 M1,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},0` }, "\u255B": { 1: (e3, t3) => `M0,${0.5 + t3} L.5,${0.5 + t3} L.5,0 M0,${0.5 - t3} L.5,${0.5 - t3}` }, "\u255C": { 1: (e3, t3) => `M0,.5 L${0.5 + e3},.5 L${0.5 + e3},0 M${0.5 - e3},.5 L${0.5 - e3},0` }, "\u255D": { 1: (e3, t3) => `M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0 M0,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},0` }, "\u255E": { 1: (e3, t3) => `M.5,0 L.5,1 M.5,${0.5 - t3} L1,${0.5 - t3} M.5,${0.5 + t3} L1,${0.5 + t3}` }, "\u255F": { 1: (e3, t3) => `M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1 M${0.5 + e3},.5 L1,.5` }, "\u2560": { 1: (e3, t3) => `M${0.5 - e3},0 L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1 M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0` }, "\u2561": { 1: (e3, t3) => `M.5,0 L.5,1 M0,${0.5 - t3} L.5,${0.5 - t3} M0,${0.5 + t3} L.5,${0.5 + t3}` }, "\u2562": { 1: (e3, t3) => `M0,.5 L${0.5 - e3},.5 M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1` }, "\u2563": { 1: (e3, t3) => `M${0.5 + e3},0 L${0.5 + e3},1 M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0` }, "\u2564": { 1: (e3, t3) => `M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3} M.5,${0.5 + t3} L.5,1` }, "\u2565": { 1: (e3, t3) => `M0,.5 L1,.5 M${0.5 - e3},.5 L${0.5 - e3},1 M${0.5 + e3},.5 L${0.5 + e3},1` }, "\u2566": { 1: (e3, t3) => `M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1` }, "\u2567": { 1: (e3, t3) => `M.5,0 L.5,${0.5 - t3} M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3}` }, "\u2568": { 1: (e3, t3) => `M0,.5 L1,.5 M${0.5 - e3},.5 L${0.5 - e3},0 M${0.5 + e3},.5 L${0.5 + e3},0` }, "\u2569": { 1: (e3, t3) => `M0,${0.5 + t3} L1,${0.5 + t3} M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0 M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0` }, "\u256A": { 1: (e3, t3) => `M.5,0 L.5,1 M0,${0.5 - t3} L1,${0.5 - t3} M0,${0.5 + t3} L1,${0.5 + t3}` }, "\u256B": { 1: (e3, t3) => `M0,.5 L1,.5 M${0.5 - e3},0 L${0.5 - e3},1 M${0.5 + e3},0 L${0.5 + e3},1` }, "\u256C": { 1: (e3, t3) => `M0,${0.5 + t3} L${0.5 - e3},${0.5 + t3} L${0.5 - e3},1 M1,${0.5 + t3} L${0.5 + e3},${0.5 + t3} L${0.5 + e3},1 M0,${0.5 - t3} L${0.5 - e3},${0.5 - t3} L${0.5 - e3},0 M1,${0.5 - t3} L${0.5 + e3},${0.5 - t3} L${0.5 + e3},0` }, "\u2571": { 1: "M1,0 L0,1" }, "\u2572": { 1: "M0,0 L1,1" }, "\u2573": { 1: "M1,0 L0,1 M0,0 L1,1" }, "\u257C": { 1: "M.5,.5 L0,.5", 3: "M.5,.5 L1,.5" }, "\u257D": { 1: "M.5,.5 L.5,0", 3: "M.5,.5 L.5,1" }, "\u257E": { 1: "M.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "\u257F": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L.5,0" }, "\u250D": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L1,.5" }, "\u250E": { 1: "M.5,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "\u2511": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L0,.5" }, "\u2512": { 1: "M.5,.5 L0,.5", 3: "M.5,.5 L.5,1" }, "\u2515": { 1: "M.5,.5 L.5,0", 3: "M.5,.5 L1,.5" }, "\u2516": { 1: "M.5,.5 L1,.5", 3: "M.5,.5 L.5,0" }, "\u2519": { 1: "M.5,.5 L.5,0", 3: "M.5,.5 L0,.5" }, "\u251A": { 1: "M.5,.5 L0,.5", 3: "M.5,.5 L.5,0" }, "\u251D": { 1: "M.5,0 L.5,1", 3: "M.5,.5 L1,.5" }, "\u251E": { 1: "M0.5,1 L.5,.5 L1,.5", 3: "M.5,.5 L.5,0" }, "\u251F": { 1: "M.5,0 L.5,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "\u2520": { 1: "M.5,.5 L1,.5", 3: "M.5,0 L.5,1" }, "\u2521": { 1: "M.5,.5 L.5,1", 3: "M.5,0 L.5,.5 L1,.5" }, "\u2522": { 1: "M.5,.5 L.5,0", 3: "M0.5,1 L.5,.5 L1,.5" }, "\u2525": { 1: "M.5,0 L.5,1", 3: "M.5,.5 L0,.5" }, "\u2526": { 1: "M0,.5 L.5,.5 L.5,1", 3: "M.5,.5 L.5,0" }, "\u2527": { 1: "M.5,0 L.5,.5 L0,.5", 3: "M.5,.5 L.5,1" }, "\u2528": { 1: "M.5,.5 L0,.5", 3: "M.5,0 L.5,1" }, "\u2529": { 1: "M.5,.5 L.5,1", 3: "M.5,0 L.5,.5 L0,.5" }, "\u252A": { 1: "M.5,.5 L.5,0", 3: "M0,.5 L.5,.5 L.5,1" }, "\u252D": { 1: "M0.5,1 L.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "\u252E": { 1: "M0,.5 L.5,.5 L.5,1", 3: "M.5,.5 L1,.5" }, "\u252F": { 1: "M.5,.5 L.5,1", 3: "M0,.5 L1,.5" }, "\u2530": { 1: "M0,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "\u2531": { 1: "M.5,.5 L1,.5", 3: "M0,.5 L.5,.5 L.5,1" }, "\u2532": { 1: "M.5,.5 L0,.5", 3: "M0.5,1 L.5,.5 L1,.5" }, "\u2535": { 1: "M.5,0 L.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "\u2536": { 1: "M.5,0 L.5,.5 L0,.5", 3: "M.5,.5 L1,.5" }, "\u2537": { 1: "M.5,.5 L.5,0", 3: "M0,.5 L1,.5" }, "\u2538": { 1: "M0,.5 L1,.5", 3: "M.5,.5 L.5,0" }, "\u2539": { 1: "M.5,.5 L1,.5", 3: "M.5,0 L.5,.5 L0,.5" }, "\u253A": { 1: "M.5,.5 L0,.5", 3: "M.5,0 L.5,.5 L1,.5" }, "\u253D": { 1: "M.5,0 L.5,1 M.5,.5 L1,.5", 3: "M.5,.5 L0,.5" }, "\u253E": { 1: "M.5,0 L.5,1 M.5,.5 L0,.5", 3: "M.5,.5 L1,.5" }, "\u253F": { 1: "M.5,0 L.5,1", 3: "M0,.5 L1,.5" }, "\u2540": { 1: "M0,.5 L1,.5 M.5,.5 L.5,1", 3: "M.5,.5 L.5,0" }, "\u2541": { 1: "M.5,.5 L.5,0 M0,.5 L1,.5", 3: "M.5,.5 L.5,1" }, "\u2542": { 1: "M0,.5 L1,.5", 3: "M.5,0 L.5,1" }, "\u2543": { 1: "M0.5,1 L.5,.5 L1,.5", 3: "M.5,0 L.5,.5 L0,.5" }, "\u2544": { 1: "M0,.5 L.5,.5 L.5,1", 3: "M.5,0 L.5,.5 L1,.5" }, "\u2545": { 1: "M.5,0 L.5,.5 L1,.5", 3: "M0,.5 L.5,.5 L.5,1" }, "\u2546": { 1: "M.5,0 L.5,.5 L0,.5", 3: "M0.5,1 L.5,.5 L1,.5" }, "\u2547": { 1: "M.5,.5 L.5,1", 3: "M.5,.5 L.5,0 M0,.5 L1,.5" }, "\u2548": { 1: "M.5,.5 L.5,0", 3: "M0,.5 L1,.5 M.5,.5 L.5,1" }, "\u2549": { 1: "M.5,.5 L1,.5", 3: "M.5,0 L.5,1 M.5,.5 L0,.5" }, "\u254A": { 1: "M.5,.5 L0,.5", 3: "M.5,0 L.5,1 M.5,.5 L1,.5" }, "\u254C": { 1: "M.1,.5 L.4,.5 M.6,.5 L.9,.5" }, "\u254D": { 3: "M.1,.5 L.4,.5 M.6,.5 L.9,.5" }, "\u2504": { 1: "M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5" }, "\u2505": { 3: "M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5" }, "\u2508": { 1: "M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5" }, "\u2509": { 3: "M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5" }, "\u254E": { 1: "M.5,.1 L.5,.4 M.5,.6 L.5,.9" }, "\u254F": { 3: "M.5,.1 L.5,.4 M.5,.6 L.5,.9" }, "\u2506": { 1: "M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333" }, "\u2507": { 3: "M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333" }, "\u250A": { 1: "M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95" }, "\u250B": { 3: "M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95" }, "\u256D": { 1: (e3, t3) => `M.5,1 L.5,${0.5 + t3 / 0.15 * 0.5} C.5,${0.5 + t3 / 0.15 * 0.5},.5,.5,1,.5` }, "\u256E": { 1: (e3, t3) => `M.5,1 L.5,${0.5 + t3 / 0.15 * 0.5} C.5,${0.5 + t3 / 0.15 * 0.5},.5,.5,0,.5` }, "\u256F": { 1: (e3, t3) => `M.5,0 L.5,${0.5 - t3 / 0.15 * 0.5} C.5,${0.5 - t3 / 0.15 * 0.5},.5,.5,0,.5` }, "\u2570": { 1: (e3, t3) => `M.5,0 L.5,${0.5 - t3 / 0.15 * 0.5} C.5,${0.5 - t3 / 0.15 * 0.5},.5,.5,1,.5` } }, t2.powerlineDefinitions = { "\uE0B0": { d: "M0,0 L1,.5 L0,1", type: 0, rightPadding: 2 }, "\uE0B1": { d: "M-1,-.5 L1,.5 L-1,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "\uE0B2": { d: "M1,0 L0,.5 L1,1", type: 0, leftPadding: 2 }, "\uE0B3": { d: "M2,-.5 L0,.5 L2,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "\uE0B4": { d: "M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0", type: 0, rightPadding: 1 }, "\uE0B5": { d: "M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0", type: 1, rightPadding: 1 }, "\uE0B6": { d: "M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0", type: 0, leftPadding: 1 }, "\uE0B7": { d: "M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0", type: 1, leftPadding: 1 }, "\uE0B8": { d: "M-.5,-.5 L1.5,1.5 L-.5,1.5", type: 0 }, "\uE0B9": { d: "M-.5,-.5 L1.5,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "\uE0BA": { d: "M1.5,-.5 L-.5,1.5 L1.5,1.5", type: 0 }, "\uE0BC": { d: "M1.5,-.5 L-.5,1.5 L-.5,-.5", type: 0 }, "\uE0BD": { d: "M1.5,-.5 L-.5,1.5", type: 1, leftPadding: 1, rightPadding: 1 }, "\uE0BE": { d: "M-.5,-.5 L1.5,1.5 L1.5,-.5", type: 0 } }, t2.powerlineDefinitions["\uE0BB"] = t2.powerlineDefinitions["\uE0BD"], t2.powerlineDefinitions["\uE0BF"] = t2.powerlineDefinitions["\uE0B9"], t2.tryDrawCustomChar = function(e3, i3, n2, l, c, d, _, u) { + const g = t2.blockElementDefinitions[i3]; + if (g) return (function(e4, t3, i4, s3, r2, o2) { + for (let n3 = 0; n3 < t3.length; n3++) { + const a2 = t3[n3], h2 = r2 / 8, l2 = o2 / 8; + e4.fillRect(i4 + a2.x * h2, s3 + a2.y * l2, a2.w * h2, a2.h * l2); + } + })(e3, g, n2, l, c, d), true; + const v = r[i3]; + if (v) return (function(e4, t3, i4, r2, n3, a2) { + let h2 = o.get(t3); + h2 || (h2 = /* @__PURE__ */ new Map(), o.set(t3, h2)); + const l2 = e4.fillStyle; + if ("string" != typeof l2) throw new Error(`Unexpected fillStyle type "${l2}"`); + let c2 = h2.get(l2); + if (!c2) { + const i5 = t3[0].length, r3 = t3.length, o2 = e4.canvas.ownerDocument.createElement("canvas"); + o2.width = i5, o2.height = r3; + const n4 = (0, s2.throwIfFalsy)(o2.getContext("2d")), a3 = new ImageData(i5, r3); + let d2, _2, u2, g2; + if (l2.startsWith("#")) d2 = parseInt(l2.slice(1, 3), 16), _2 = parseInt(l2.slice(3, 5), 16), u2 = parseInt(l2.slice(5, 7), 16), g2 = l2.length > 7 && parseInt(l2.slice(7, 9), 16) || 1; + else { + if (!l2.startsWith("rgba")) throw new Error(`Unexpected fillStyle color format "${l2}" when drawing pattern glyph`); + [d2, _2, u2, g2] = l2.substring(5, l2.length - 1).split(",").map(((e5) => parseFloat(e5))); + } + for (let e5 = 0; e5 < r3; e5++) for (let s3 = 0; s3 < i5; s3++) a3.data[4 * (e5 * i5 + s3)] = d2, a3.data[4 * (e5 * i5 + s3) + 1] = _2, a3.data[4 * (e5 * i5 + s3) + 2] = u2, a3.data[4 * (e5 * i5 + s3) + 3] = t3[e5][s3] * (255 * g2); + n4.putImageData(a3, 0, 0), c2 = (0, s2.throwIfFalsy)(e4.createPattern(o2, null)), h2.set(l2, c2); + } + e4.fillStyle = c2, e4.fillRect(i4, r2, n3, a2); + })(e3, v, n2, l, c, d), true; + const f = t2.boxDrawingDefinitions[i3]; + if (f) return (function(e4, t3, i4, s3, r2, o2, n3) { + e4.strokeStyle = e4.fillStyle; + for (const [l2, c2] of Object.entries(t3)) { + let t4; + e4.beginPath(), e4.lineWidth = n3 * Number.parseInt(l2), t4 = "function" == typeof c2 ? c2(0.15, 0.15 / o2 * r2) : c2; + for (const l3 of t4.split(" ")) { + const t5 = l3[0], c3 = a[t5]; + if (!c3) { + console.error(`Could not find drawing instructions for "${t5}"`); + continue; + } + const d2 = l3.substring(1).split(","); + d2[0] && d2[1] && c3(e4, h(d2, r2, o2, i4, s3, true, n3)); + } + e4.stroke(), e4.closePath(); + } + })(e3, f, n2, l, c, d, u), true; + const p = t2.powerlineDefinitions[i3]; + return !!p && ((function(e4, t3, i4, s3, r2, o2, n3, l2) { + const c2 = new Path2D(); + c2.rect(i4, s3, r2, o2), e4.clip(c2), e4.beginPath(); + const d2 = n3 / 12; + e4.lineWidth = l2 * d2; + for (const n4 of t3.d.split(" ")) { + const c3 = n4[0], _2 = a[c3]; + if (!_2) { + console.error(`Could not find drawing instructions for "${c3}"`); + continue; + } + const u2 = n4.substring(1).split(","); + u2[0] && u2[1] && _2(e4, h(u2, r2, o2, i4, s3, false, l2, (t3.leftPadding ?? 0) * (d2 / 2), (t3.rightPadding ?? 0) * (d2 / 2))); + } + 1 === t3.type ? (e4.strokeStyle = e4.fillStyle, e4.stroke()) : e4.fill(), e4.closePath(); + })(e3, p, n2, l, c, d, _, u), true); + }; + const o = /* @__PURE__ */ new Map(); + function n(e3, t3, i3 = 0) { + return Math.max(Math.min(e3, t3), i3); + } + const a = { C: (e3, t3) => e3.bezierCurveTo(t3[0], t3[1], t3[2], t3[3], t3[4], t3[5]), L: (e3, t3) => e3.lineTo(t3[0], t3[1]), M: (e3, t3) => e3.moveTo(t3[0], t3[1]) }; + function h(e3, t3, i3, s3, r2, o2, a2, h2 = 0, l = 0) { + const c = e3.map(((e4) => parseFloat(e4) || parseInt(e4))); + if (c.length < 2) throw new Error("Too few arguments for instruction"); + for (let e4 = 0; e4 < c.length; e4 += 2) c[e4] *= t3 - h2 * a2 - l * a2, o2 && 0 !== c[e4] && (c[e4] = n(Math.round(c[e4] + 0.5) - 0.5, t3, 0)), c[e4] += s3 + h2 * a2; + for (let e4 = 1; e4 < c.length; e4 += 2) c[e4] *= i3, o2 && 0 !== c[e4] && (c[e4] = n(Math.round(c[e4] + 0.5) - 0.5, i3, 0)), c[e4] += r2; + return c; + } + }, 56: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.observeDevicePixelDimensions = void 0; + const s2 = i2(859); + t2.observeDevicePixelDimensions = function(e3, t3, i3) { + let r = new t3.ResizeObserver(((t4) => { + const s3 = t4.find(((t5) => t5.target === e3)); + if (!s3) return; + if (!("devicePixelContentBoxSize" in s3)) return r == null ? void 0 : r.disconnect(), void (r = void 0); + const o = s3.devicePixelContentBoxSize[0].inlineSize, n = s3.devicePixelContentBoxSize[0].blockSize; + o > 0 && n > 0 && i3(o, n); + })); + try { + r.observe(e3, { box: ["device-pixel-content-box"] }); + } catch { + r.disconnect(), r = void 0; + } + return (0, s2.toDisposable)((() => r == null ? void 0 : r.disconnect())); + }; + }, 374: (e2, t2) => { + function i2(e3) { + return 57508 <= e3 && e3 <= 57558; + } + function s2(e3) { + return e3 >= 128512 && e3 <= 128591 || e3 >= 127744 && e3 <= 128511 || e3 >= 128640 && e3 <= 128767 || e3 >= 9728 && e3 <= 9983 || e3 >= 9984 && e3 <= 10175 || e3 >= 65024 && e3 <= 65039 || e3 >= 129280 && e3 <= 129535 || e3 >= 127462 && e3 <= 127487; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.computeNextVariantOffset = t2.createRenderDimensions = t2.treatGlyphAsBackgroundColor = t2.allowRescaling = t2.isEmoji = t2.isRestrictedPowerlineGlyph = t2.isPowerlineGlyph = t2.throwIfFalsy = void 0, t2.throwIfFalsy = function(e3) { + if (!e3) throw new Error("value must not be falsy"); + return e3; + }, t2.isPowerlineGlyph = i2, t2.isRestrictedPowerlineGlyph = function(e3) { + return 57520 <= e3 && e3 <= 57527; + }, t2.isEmoji = s2, t2.allowRescaling = function(e3, t3, r, o) { + return 1 === t3 && r > Math.ceil(1.5 * o) && void 0 !== e3 && e3 > 255 && !s2(e3) && !i2(e3) && !(function(e4) { + return 57344 <= e4 && e4 <= 63743; + })(e3); + }, t2.treatGlyphAsBackgroundColor = function(e3) { + return i2(e3) || (function(e4) { + return 9472 <= e4 && e4 <= 9631; + })(e3); + }, t2.createRenderDimensions = function() { + return { css: { canvas: { width: 0, height: 0 }, cell: { width: 0, height: 0 } }, device: { canvas: { width: 0, height: 0 }, cell: { width: 0, height: 0 }, char: { width: 0, height: 0, left: 0, top: 0 } } }; + }, t2.computeNextVariantOffset = function(e3, t3, i3 = 0) { + return (e3 - (2 * Math.round(t3) - i3)) % (2 * Math.round(t3)); + }; + }, 296: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.createSelectionRenderModel = void 0; + class i2 { + constructor() { + this.clear(); + } + clear() { + this.hasSelection = false, this.columnSelectMode = false, this.viewportStartRow = 0, this.viewportEndRow = 0, this.viewportCappedStartRow = 0, this.viewportCappedEndRow = 0, this.startCol = 0, this.endCol = 0, this.selectionStart = void 0, this.selectionEnd = void 0; + } + update(e3, t3, i3, s2 = false) { + if (this.selectionStart = t3, this.selectionEnd = i3, !t3 || !i3 || t3[0] === i3[0] && t3[1] === i3[1]) return void this.clear(); + const r = e3.buffers.active.ydisp, o = t3[1] - r, n = i3[1] - r, a = Math.max(o, 0), h = Math.min(n, e3.rows - 1); + a >= e3.rows || h < 0 ? this.clear() : (this.hasSelection = true, this.columnSelectMode = s2, this.viewportStartRow = o, this.viewportEndRow = n, this.viewportCappedStartRow = a, this.viewportCappedEndRow = h, this.startCol = t3[0], this.endCol = i3[0]); + } + isCellSelected(e3, t3, i3) { + return !!this.hasSelection && (i3 -= e3.buffer.active.viewportY, this.columnSelectMode ? this.startCol <= this.endCol ? t3 >= this.startCol && i3 >= this.viewportCappedStartRow && t3 < this.endCol && i3 <= this.viewportCappedEndRow : t3 < this.startCol && i3 >= this.viewportCappedStartRow && t3 >= this.endCol && i3 <= this.viewportCappedEndRow : i3 > this.viewportStartRow && i3 < this.viewportEndRow || this.viewportStartRow === this.viewportEndRow && i3 === this.viewportStartRow && t3 >= this.startCol && t3 < this.endCol || this.viewportStartRow < this.viewportEndRow && i3 === this.viewportEndRow && t3 < this.endCol || this.viewportStartRow < this.viewportEndRow && i3 === this.viewportStartRow && t3 >= this.startCol); + } + } + t2.createSelectionRenderModel = function() { + return new i2(); + }; + }, 509: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.TextureAtlas = void 0; + const s2 = i2(237), r = i2(860), o = i2(374), n = i2(160), a = i2(345), h = i2(485), l = i2(385), c = i2(147), d = i2(855), _ = { texturePage: 0, texturePosition: { x: 0, y: 0 }, texturePositionClipSpace: { x: 0, y: 0 }, offset: { x: 0, y: 0 }, size: { x: 0, y: 0 }, sizeClipSpace: { x: 0, y: 0 } }; + let u; + class g { + get pages() { + return this._pages; + } + constructor(e3, t3, i3) { + this._document = e3, this._config = t3, this._unicodeService = i3, this._didWarmUp = false, this._cacheMap = new h.FourKeyMap(), this._cacheMapCombined = new h.FourKeyMap(), this._pages = [], this._activePages = [], this._workBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 }, this._workAttributeData = new c.AttributeData(), this._textureSize = 512, this._onAddTextureAtlasCanvas = new a.EventEmitter(), this.onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event, this._onRemoveTextureAtlasCanvas = new a.EventEmitter(), this.onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event, this._requestClearModel = false, this._createNewPage(), this._tmpCanvas = p(e3, 4 * this._config.deviceCellWidth + 4, this._config.deviceCellHeight + 4), this._tmpCtx = (0, o.throwIfFalsy)(this._tmpCanvas.getContext("2d", { alpha: this._config.allowTransparency, willReadFrequently: true })); + } + dispose() { + for (const e3 of this.pages) e3.canvas.remove(); + this._onAddTextureAtlasCanvas.dispose(); + } + warmUp() { + this._didWarmUp || (this._doWarmUp(), this._didWarmUp = true); + } + _doWarmUp() { + const e3 = new l.IdleTaskQueue(); + for (let t3 = 33; t3 < 126; t3++) e3.enqueue((() => { + if (!this._cacheMap.get(t3, d.DEFAULT_COLOR, d.DEFAULT_COLOR, d.DEFAULT_EXT)) { + const e4 = this._drawToCache(t3, d.DEFAULT_COLOR, d.DEFAULT_COLOR, d.DEFAULT_EXT); + this._cacheMap.set(t3, d.DEFAULT_COLOR, d.DEFAULT_COLOR, d.DEFAULT_EXT, e4); + } + })); + } + beginFrame() { + return this._requestClearModel; + } + clearTexture() { + if (0 !== this._pages[0].currentRow.x || 0 !== this._pages[0].currentRow.y) { + for (const e3 of this._pages) e3.clear(); + this._cacheMap.clear(), this._cacheMapCombined.clear(), this._didWarmUp = false; + } + } + _createNewPage() { + if (g.maxAtlasPages && this._pages.length >= Math.max(4, g.maxAtlasPages)) { + const e4 = this._pages.filter(((e5) => 2 * e5.canvas.width <= (g.maxTextureSize || 4096))).sort(((e5, t4) => t4.canvas.width !== e5.canvas.width ? t4.canvas.width - e5.canvas.width : t4.percentageUsed - e5.percentageUsed)); + let t3 = -1, i3 = 0; + for (let s4 = 0; s4 < e4.length; s4++) if (e4[s4].canvas.width !== i3) t3 = s4, i3 = e4[s4].canvas.width; + else if (s4 - t3 == 3) break; + const s3 = e4.slice(t3, t3 + 4), r2 = s3.map(((e5) => e5.glyphs[0].texturePage)).sort(((e5, t4) => e5 > t4 ? 1 : -1)), o2 = this.pages.length - s3.length, n2 = this._mergePages(s3, o2); + n2.version++; + for (let e5 = r2.length - 1; e5 >= 0; e5--) this._deletePage(r2[e5]); + this.pages.push(n2), this._requestClearModel = true, this._onAddTextureAtlasCanvas.fire(n2.canvas); + } + const e3 = new v(this._document, this._textureSize); + return this._pages.push(e3), this._activePages.push(e3), this._onAddTextureAtlasCanvas.fire(e3.canvas), e3; + } + _mergePages(e3, t3) { + const i3 = 2 * e3[0].canvas.width, s3 = new v(this._document, i3, e3); + for (const [r2, o2] of e3.entries()) { + const e4 = r2 * o2.canvas.width % i3, n2 = Math.floor(r2 / 2) * o2.canvas.height; + s3.ctx.drawImage(o2.canvas, e4, n2); + for (const s4 of o2.glyphs) s4.texturePage = t3, s4.sizeClipSpace.x = s4.size.x / i3, s4.sizeClipSpace.y = s4.size.y / i3, s4.texturePosition.x += e4, s4.texturePosition.y += n2, s4.texturePositionClipSpace.x = s4.texturePosition.x / i3, s4.texturePositionClipSpace.y = s4.texturePosition.y / i3; + this._onRemoveTextureAtlasCanvas.fire(o2.canvas); + const a2 = this._activePages.indexOf(o2); + -1 !== a2 && this._activePages.splice(a2, 1); + } + return s3; + } + _deletePage(e3) { + this._pages.splice(e3, 1); + for (let t3 = e3; t3 < this._pages.length; t3++) { + const e4 = this._pages[t3]; + for (const t4 of e4.glyphs) t4.texturePage--; + e4.version++; + } + } + getRasterizedGlyphCombinedChar(e3, t3, i3, s3, r2) { + return this._getFromCacheMap(this._cacheMapCombined, e3, t3, i3, s3, r2); + } + getRasterizedGlyph(e3, t3, i3, s3, r2) { + return this._getFromCacheMap(this._cacheMap, e3, t3, i3, s3, r2); + } + _getFromCacheMap(e3, t3, i3, s3, r2, o2 = false) { + return u = e3.get(t3, i3, s3, r2), u || (u = this._drawToCache(t3, i3, s3, r2, o2), e3.set(t3, i3, s3, r2, u)), u; + } + _getColorFromAnsiIndex(e3) { + if (e3 >= this._config.colors.ansi.length) throw new Error("No color found for idx " + e3); + return this._config.colors.ansi[e3]; + } + _getBackgroundColor(e3, t3, i3, s3) { + if (this._config.allowTransparency) return n.NULL_COLOR; + let r2; + switch (e3) { + case 16777216: + case 33554432: + r2 = this._getColorFromAnsiIndex(t3); + break; + case 50331648: + const e4 = c.AttributeData.toColorRGB(t3); + r2 = n.channels.toColor(e4[0], e4[1], e4[2]); + break; + default: + r2 = i3 ? n.color.opaque(this._config.colors.foreground) : this._config.colors.background; + } + return r2; + } + _getForegroundColor(e3, t3, i3, r2, o2, a2, h2, l2, d2, _2) { + const u2 = this._getMinimumContrastColor(e3, t3, i3, r2, o2, a2, h2, d2, l2, _2); + if (u2) return u2; + let g2; + switch (o2) { + case 16777216: + case 33554432: + this._config.drawBoldTextInBrightColors && d2 && a2 < 8 && (a2 += 8), g2 = this._getColorFromAnsiIndex(a2); + break; + case 50331648: + const e4 = c.AttributeData.toColorRGB(a2); + g2 = n.channels.toColor(e4[0], e4[1], e4[2]); + break; + default: + g2 = h2 ? this._config.colors.background : this._config.colors.foreground; + } + return this._config.allowTransparency && (g2 = n.color.opaque(g2)), l2 && (g2 = n.color.multiplyOpacity(g2, s2.DIM_OPACITY)), g2; + } + _resolveBackgroundRgba(e3, t3, i3) { + switch (e3) { + case 16777216: + case 33554432: + return this._getColorFromAnsiIndex(t3).rgba; + case 50331648: + return t3 << 8; + default: + return i3 ? this._config.colors.foreground.rgba : this._config.colors.background.rgba; + } + } + _resolveForegroundRgba(e3, t3, i3, s3) { + switch (e3) { + case 16777216: + case 33554432: + return this._config.drawBoldTextInBrightColors && s3 && t3 < 8 && (t3 += 8), this._getColorFromAnsiIndex(t3).rgba; + case 50331648: + return t3 << 8; + default: + return i3 ? this._config.colors.background.rgba : this._config.colors.foreground.rgba; + } + } + _getMinimumContrastColor(e3, t3, i3, s3, r2, o2, a2, h2, l2, c2) { + if (1 === this._config.minimumContrastRatio || c2) return; + const d2 = this._getContrastCache(l2), _2 = d2.getColor(e3, s3); + if (void 0 !== _2) return _2 || void 0; + const u2 = this._resolveBackgroundRgba(t3, i3, a2), g2 = this._resolveForegroundRgba(r2, o2, a2, h2), v2 = n.rgba.ensureContrastRatio(u2, g2, this._config.minimumContrastRatio / (l2 ? 2 : 1)); + if (!v2) return void d2.setColor(e3, s3, null); + const f2 = n.channels.toColor(v2 >> 24 & 255, v2 >> 16 & 255, v2 >> 8 & 255); + return d2.setColor(e3, s3, f2), f2; + } + _getContrastCache(e3) { + return e3 ? this._config.colors.halfContrastCache : this._config.colors.contrastCache; + } + _drawToCache(e3, t3, i3, n2, a2 = false) { + const h2 = "number" == typeof e3 ? String.fromCharCode(e3) : e3, l2 = Math.min(this._config.deviceCellWidth * Math.max(h2.length, 2) + 4, this._textureSize); + this._tmpCanvas.width < l2 && (this._tmpCanvas.width = l2); + const d2 = Math.min(this._config.deviceCellHeight + 8, this._textureSize); + if (this._tmpCanvas.height < d2 && (this._tmpCanvas.height = d2), this._tmpCtx.save(), this._workAttributeData.fg = i3, this._workAttributeData.bg = t3, this._workAttributeData.extended.ext = n2, this._workAttributeData.isInvisible()) return _; + const u2 = !!this._workAttributeData.isBold(), v2 = !!this._workAttributeData.isInverse(), p2 = !!this._workAttributeData.isDim(), C = !!this._workAttributeData.isItalic(), m = !!this._workAttributeData.isUnderline(), L = !!this._workAttributeData.isStrikethrough(), x = !!this._workAttributeData.isOverline(); + let w = this._workAttributeData.getFgColor(), b = this._workAttributeData.getFgColorMode(), M = this._workAttributeData.getBgColor(), R = this._workAttributeData.getBgColorMode(); + if (v2) { + const e4 = w; + w = M, M = e4; + const t4 = b; + b = R, R = t4; + } + const y = this._getBackgroundColor(R, M, v2, p2); + this._tmpCtx.globalCompositeOperation = "copy", this._tmpCtx.fillStyle = y.css, this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height), this._tmpCtx.globalCompositeOperation = "source-over"; + const A = u2 ? this._config.fontWeightBold : this._config.fontWeight, E = C ? "italic" : ""; + this._tmpCtx.font = `${E} ${A} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`, this._tmpCtx.textBaseline = s2.TEXT_BASELINE; + const S = 1 === h2.length && (0, o.isPowerlineGlyph)(h2.charCodeAt(0)), T = 1 === h2.length && (0, o.isRestrictedPowerlineGlyph)(h2.charCodeAt(0)), D = this._getForegroundColor(t3, R, M, i3, b, w, v2, p2, u2, (0, o.treatGlyphAsBackgroundColor)(h2.charCodeAt(0))); + this._tmpCtx.fillStyle = D.css; + const B = T ? 0 : 4; + let F = false; + false !== this._config.customGlyphs && (F = (0, r.tryDrawCustomChar)(this._tmpCtx, h2, B, B, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.fontSize, this._config.devicePixelRatio)); + let P, I = !S; + if (P = "number" == typeof e3 ? this._unicodeService.wcwidth(e3) : this._unicodeService.getStringCellWidth(e3), m) { + this._tmpCtx.save(); + const e4 = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15)), t4 = e4 % 2 == 1 ? 0.5 : 0; + if (this._tmpCtx.lineWidth = e4, this._workAttributeData.isUnderlineColorDefault()) this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle; + else if (this._workAttributeData.isUnderlineColorRGB()) I = false, this._tmpCtx.strokeStyle = `rgb(${c.AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(",")})`; + else { + I = false; + let e5 = this._workAttributeData.getUnderlineColor(); + this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && e5 < 8 && (e5 += 8), this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(e5).css; + } + this._tmpCtx.beginPath(); + const i4 = B, s3 = Math.ceil(B + this._config.deviceCharHeight) - t4 - (a2 ? 2 * e4 : 0), r2 = s3 + e4, n3 = s3 + 2 * e4; + let l3 = this._workAttributeData.getUnderlineVariantOffset(); + for (let a3 = 0; a3 < P; a3++) { + this._tmpCtx.save(); + const h3 = i4 + a3 * this._config.deviceCellWidth, c2 = i4 + (a3 + 1) * this._config.deviceCellWidth, d3 = h3 + this._config.deviceCellWidth / 2; + switch (this._workAttributeData.extended.underlineStyle) { + case 2: + this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(c2, s3), this._tmpCtx.moveTo(h3, n3), this._tmpCtx.lineTo(c2, n3); + break; + case 3: + const i5 = e4 <= 1 ? n3 : Math.ceil(B + this._config.deviceCharHeight - e4 / 2) - t4, a4 = e4 <= 1 ? s3 : Math.ceil(B + this._config.deviceCharHeight + e4 / 2) - t4, _2 = new Path2D(); + _2.rect(h3, s3, this._config.deviceCellWidth, n3 - s3), this._tmpCtx.clip(_2), this._tmpCtx.moveTo(h3 - this._config.deviceCellWidth / 2, r2), this._tmpCtx.bezierCurveTo(h3 - this._config.deviceCellWidth / 2, a4, h3, a4, h3, r2), this._tmpCtx.bezierCurveTo(h3, i5, d3, i5, d3, r2), this._tmpCtx.bezierCurveTo(d3, a4, c2, a4, c2, r2), this._tmpCtx.bezierCurveTo(c2, i5, c2 + this._config.deviceCellWidth / 2, i5, c2 + this._config.deviceCellWidth / 2, r2); + break; + case 4: + const u3 = 0 === l3 ? 0 : l3 >= e4 ? 2 * e4 - l3 : e4 - l3; + false == !(l3 >= e4) || 0 === u3 ? (this._tmpCtx.setLineDash([Math.round(e4), Math.round(e4)]), this._tmpCtx.moveTo(h3 + u3, s3), this._tmpCtx.lineTo(c2, s3)) : (this._tmpCtx.setLineDash([Math.round(e4), Math.round(e4)]), this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(h3 + u3, s3), this._tmpCtx.moveTo(h3 + u3 + e4, s3), this._tmpCtx.lineTo(c2, s3)), l3 = (0, o.computeNextVariantOffset)(c2 - h3, e4, l3); + break; + case 5: + const g2 = 0.6, v3 = 0.3, f2 = c2 - h3, p3 = Math.floor(g2 * f2), C2 = Math.floor(v3 * f2), m2 = f2 - p3 - C2; + this._tmpCtx.setLineDash([p3, C2, m2]), this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(c2, s3); + break; + default: + this._tmpCtx.moveTo(h3, s3), this._tmpCtx.lineTo(c2, s3); + } + this._tmpCtx.stroke(), this._tmpCtx.restore(); + } + if (this._tmpCtx.restore(), !F && this._config.fontSize >= 12 && !this._config.allowTransparency && " " !== h2) { + this._tmpCtx.save(), this._tmpCtx.textBaseline = "alphabetic"; + const t5 = this._tmpCtx.measureText(h2); + if (this._tmpCtx.restore(), "actualBoundingBoxDescent" in t5 && t5.actualBoundingBoxDescent > 0) { + this._tmpCtx.save(); + const t6 = new Path2D(); + t6.rect(i4, s3 - Math.ceil(e4 / 2), this._config.deviceCellWidth * P, n3 - s3 + Math.ceil(e4 / 2)), this._tmpCtx.clip(t6), this._tmpCtx.lineWidth = 3 * this._config.devicePixelRatio, this._tmpCtx.strokeStyle = y.css, this._tmpCtx.strokeText(h2, B, B + this._config.deviceCharHeight), this._tmpCtx.restore(); + } + } + } + if (x) { + const e4 = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15)), t4 = e4 % 2 == 1 ? 0.5 : 0; + this._tmpCtx.lineWidth = e4, this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle, this._tmpCtx.beginPath(), this._tmpCtx.moveTo(B, B + t4), this._tmpCtx.lineTo(B + this._config.deviceCharWidth * P, B + t4), this._tmpCtx.stroke(); + } + if (F || this._tmpCtx.fillText(h2, B, B + this._config.deviceCharHeight), "_" === h2 && !this._config.allowTransparency) { + let e4 = f(this._tmpCtx.getImageData(B, B, this._config.deviceCellWidth, this._config.deviceCellHeight), y, D, I); + if (e4) for (let t4 = 1; t4 <= 5 && (this._tmpCtx.save(), this._tmpCtx.fillStyle = y.css, this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height), this._tmpCtx.restore(), this._tmpCtx.fillText(h2, B, B + this._config.deviceCharHeight - t4), e4 = f(this._tmpCtx.getImageData(B, B, this._config.deviceCellWidth, this._config.deviceCellHeight), y, D, I), e4); t4++) ; + } + if (L) { + const e4 = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10)), t4 = this._tmpCtx.lineWidth % 2 == 1 ? 0.5 : 0; + this._tmpCtx.lineWidth = e4, this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle, this._tmpCtx.beginPath(), this._tmpCtx.moveTo(B, B + Math.floor(this._config.deviceCharHeight / 2) - t4), this._tmpCtx.lineTo(B + this._config.deviceCharWidth * P, B + Math.floor(this._config.deviceCharHeight / 2) - t4), this._tmpCtx.stroke(); + } + this._tmpCtx.restore(); + const O = this._tmpCtx.getImageData(0, 0, this._tmpCanvas.width, this._tmpCanvas.height); + let k; + if (k = this._config.allowTransparency ? (function(e4) { + for (let t4 = 0; t4 < e4.data.length; t4 += 4) if (e4.data[t4 + 3] > 0) return false; + return true; + })(O) : f(O, y, D, I), k) return _; + const $ = this._findGlyphBoundingBox(O, this._workBoundingBox, l2, T, F, B); + let U, N; + for (; ; ) { + if (0 === this._activePages.length) { + const e4 = this._createNewPage(); + U = e4, N = e4.currentRow, N.height = $.size.y; + break; + } + U = this._activePages[this._activePages.length - 1], N = U.currentRow; + for (const e4 of this._activePages) $.size.y <= e4.currentRow.height && (U = e4, N = e4.currentRow); + for (let e4 = this._activePages.length - 1; e4 >= 0; e4--) for (const t4 of this._activePages[e4].fixedRows) t4.height <= N.height && $.size.y <= t4.height && (U = this._activePages[e4], N = t4); + if (N.y + $.size.y >= U.canvas.height || N.height > $.size.y + 2) { + let e4 = false; + if (U.currentRow.y + U.currentRow.height + $.size.y >= U.canvas.height) { + let t4; + for (const e5 of this._activePages) if (e5.currentRow.y + e5.currentRow.height + $.size.y < e5.canvas.height) { + t4 = e5; + break; + } + if (t4) U = t4; + else if (g.maxAtlasPages && this._pages.length >= g.maxAtlasPages && N.y + $.size.y <= U.canvas.height && N.height >= $.size.y && N.x + $.size.x <= U.canvas.width) e4 = true; + else { + const t5 = this._createNewPage(); + U = t5, N = t5.currentRow, N.height = $.size.y, e4 = true; + } + } + e4 || (U.currentRow.height > 0 && U.fixedRows.push(U.currentRow), N = { x: 0, y: U.currentRow.y + U.currentRow.height, height: $.size.y }, U.fixedRows.push(N), U.currentRow = { x: 0, y: N.y + N.height, height: 0 }); + } + if (N.x + $.size.x <= U.canvas.width) break; + N === U.currentRow ? (N.x = 0, N.y += N.height, N.height = 0) : U.fixedRows.splice(U.fixedRows.indexOf(N), 1); + } + return $.texturePage = this._pages.indexOf(U), $.texturePosition.x = N.x, $.texturePosition.y = N.y, $.texturePositionClipSpace.x = N.x / U.canvas.width, $.texturePositionClipSpace.y = N.y / U.canvas.height, $.sizeClipSpace.x /= U.canvas.width, $.sizeClipSpace.y /= U.canvas.height, N.height = Math.max(N.height, $.size.y), N.x += $.size.x, U.ctx.putImageData(O, $.texturePosition.x - this._workBoundingBox.left, $.texturePosition.y - this._workBoundingBox.top, this._workBoundingBox.left, this._workBoundingBox.top, $.size.x, $.size.y), U.addGlyph($), U.version++, $; + } + _findGlyphBoundingBox(e3, t3, i3, s3, r2, o2) { + t3.top = 0; + const n2 = s3 ? this._config.deviceCellHeight : this._tmpCanvas.height, a2 = s3 ? this._config.deviceCellWidth : i3; + let h2 = false; + for (let i4 = 0; i4 < n2; i4++) { + for (let s4 = 0; s4 < a2; s4++) { + const r3 = i4 * this._tmpCanvas.width * 4 + 4 * s4 + 3; + if (0 !== e3.data[r3]) { + t3.top = i4, h2 = true; + break; + } + } + if (h2) break; + } + t3.left = 0, h2 = false; + for (let i4 = 0; i4 < o2 + a2; i4++) { + for (let s4 = 0; s4 < n2; s4++) { + const r3 = s4 * this._tmpCanvas.width * 4 + 4 * i4 + 3; + if (0 !== e3.data[r3]) { + t3.left = i4, h2 = true; + break; + } + } + if (h2) break; + } + t3.right = a2, h2 = false; + for (let i4 = o2 + a2 - 1; i4 >= o2; i4--) { + for (let s4 = 0; s4 < n2; s4++) { + const r3 = s4 * this._tmpCanvas.width * 4 + 4 * i4 + 3; + if (0 !== e3.data[r3]) { + t3.right = i4, h2 = true; + break; + } + } + if (h2) break; + } + t3.bottom = n2, h2 = false; + for (let i4 = n2 - 1; i4 >= 0; i4--) { + for (let s4 = 0; s4 < a2; s4++) { + const r3 = i4 * this._tmpCanvas.width * 4 + 4 * s4 + 3; + if (0 !== e3.data[r3]) { + t3.bottom = i4, h2 = true; + break; + } + } + if (h2) break; + } + return { texturePage: 0, texturePosition: { x: 0, y: 0 }, texturePositionClipSpace: { x: 0, y: 0 }, size: { x: t3.right - t3.left + 1, y: t3.bottom - t3.top + 1 }, sizeClipSpace: { x: t3.right - t3.left + 1, y: t3.bottom - t3.top + 1 }, offset: { x: -t3.left + o2 + (s3 || r2 ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0), y: -t3.top + o2 + (s3 || r2 ? 1 === this._config.lineHeight ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0) } }; + } + } + t2.TextureAtlas = g; + class v { + get percentageUsed() { + return this._usedPixels / (this.canvas.width * this.canvas.height); + } + get glyphs() { + return this._glyphs; + } + addGlyph(e3) { + this._glyphs.push(e3), this._usedPixels += e3.size.x * e3.size.y; + } + constructor(e3, t3, i3) { + if (this._usedPixels = 0, this._glyphs = [], this.version = 0, this.currentRow = { x: 0, y: 0, height: 0 }, this.fixedRows = [], i3) for (const e4 of i3) this._glyphs.push(...e4.glyphs), this._usedPixels += e4._usedPixels; + this.canvas = p(e3, t3, t3), this.ctx = (0, o.throwIfFalsy)(this.canvas.getContext("2d", { alpha: true })); + } + clear() { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height), this.currentRow.x = 0, this.currentRow.y = 0, this.currentRow.height = 0, this.fixedRows.length = 0, this.version++; + } + } + function f(e3, t3, i3, s3) { + const r2 = t3.rgba >>> 24, o2 = t3.rgba >>> 16 & 255, n2 = t3.rgba >>> 8 & 255, a2 = i3.rgba >>> 24, h2 = i3.rgba >>> 16 & 255, l2 = i3.rgba >>> 8 & 255, c2 = Math.floor((Math.abs(r2 - a2) + Math.abs(o2 - h2) + Math.abs(n2 - l2)) / 12); + let d2 = true; + for (let t4 = 0; t4 < e3.data.length; t4 += 4) e3.data[t4] === r2 && e3.data[t4 + 1] === o2 && e3.data[t4 + 2] === n2 || s3 && Math.abs(e3.data[t4] - r2) + Math.abs(e3.data[t4 + 1] - o2) + Math.abs(e3.data[t4 + 2] - n2) < c2 ? e3.data[t4 + 3] = 0 : d2 = false; + return d2; + } + function p(e3, t3, i3) { + const s3 = e3.createElement("canvas"); + return s3.width = t3, s3.height = i3, s3; + } + }, 160: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.contrastRatio = t2.toPaddedHex = t2.rgba = t2.rgb = t2.css = t2.color = t2.channels = t2.NULL_COLOR = void 0; + let i2 = 0, s2 = 0, r = 0, o = 0; + var n, a, h, l, c; + function d(e3) { + const t3 = e3.toString(16); + return t3.length < 2 ? "0" + t3 : t3; + } + function _(e3, t3) { + return e3 < t3 ? (t3 + 0.05) / (e3 + 0.05) : (e3 + 0.05) / (t3 + 0.05); + } + t2.NULL_COLOR = { css: "#00000000", rgba: 0 }, (function(e3) { + e3.toCss = function(e4, t3, i3, s3) { + return void 0 !== s3 ? `#${d(e4)}${d(t3)}${d(i3)}${d(s3)}` : `#${d(e4)}${d(t3)}${d(i3)}`; + }, e3.toRgba = function(e4, t3, i3, s3 = 255) { + return (e4 << 24 | t3 << 16 | i3 << 8 | s3) >>> 0; + }, e3.toColor = function(t3, i3, s3, r2) { + return { css: e3.toCss(t3, i3, s3, r2), rgba: e3.toRgba(t3, i3, s3, r2) }; + }; + })(n || (t2.channels = n = {})), (function(e3) { + function t3(e4, t4) { + return o = Math.round(255 * t4), [i2, s2, r] = c.toChannels(e4.rgba), { css: n.toCss(i2, s2, r, o), rgba: n.toRgba(i2, s2, r, o) }; + } + e3.blend = function(e4, t4) { + if (o = (255 & t4.rgba) / 255, 1 === o) return { css: t4.css, rgba: t4.rgba }; + const a2 = t4.rgba >> 24 & 255, h2 = t4.rgba >> 16 & 255, l2 = t4.rgba >> 8 & 255, c2 = e4.rgba >> 24 & 255, d2 = e4.rgba >> 16 & 255, _2 = e4.rgba >> 8 & 255; + return i2 = c2 + Math.round((a2 - c2) * o), s2 = d2 + Math.round((h2 - d2) * o), r = _2 + Math.round((l2 - _2) * o), { css: n.toCss(i2, s2, r), rgba: n.toRgba(i2, s2, r) }; + }, e3.isOpaque = function(e4) { + return 255 == (255 & e4.rgba); + }, e3.ensureContrastRatio = function(e4, t4, i3) { + const s3 = c.ensureContrastRatio(e4.rgba, t4.rgba, i3); + if (s3) return n.toColor(s3 >> 24 & 255, s3 >> 16 & 255, s3 >> 8 & 255); + }, e3.opaque = function(e4) { + const t4 = (255 | e4.rgba) >>> 0; + return [i2, s2, r] = c.toChannels(t4), { css: n.toCss(i2, s2, r), rgba: t4 }; + }, e3.opacity = t3, e3.multiplyOpacity = function(e4, i3) { + return o = 255 & e4.rgba, t3(e4, o * i3 / 255); + }, e3.toColorRGB = function(e4) { + return [e4.rgba >> 24 & 255, e4.rgba >> 16 & 255, e4.rgba >> 8 & 255]; + }; + })(a || (t2.color = a = {})), (function(e3) { + let t3, a2; + try { + const e4 = document.createElement("canvas"); + e4.width = 1, e4.height = 1; + const i3 = e4.getContext("2d", { willReadFrequently: true }); + i3 && (t3 = i3, t3.globalCompositeOperation = "copy", a2 = t3.createLinearGradient(0, 0, 1, 1)); + } catch { + } + e3.toColor = function(e4) { + if (e4.match(/#[\da-f]{3,8}/i)) switch (e4.length) { + case 4: + return i2 = parseInt(e4.slice(1, 2).repeat(2), 16), s2 = parseInt(e4.slice(2, 3).repeat(2), 16), r = parseInt(e4.slice(3, 4).repeat(2), 16), n.toColor(i2, s2, r); + case 5: + return i2 = parseInt(e4.slice(1, 2).repeat(2), 16), s2 = parseInt(e4.slice(2, 3).repeat(2), 16), r = parseInt(e4.slice(3, 4).repeat(2), 16), o = parseInt(e4.slice(4, 5).repeat(2), 16), n.toColor(i2, s2, r, o); + case 7: + return { css: e4, rgba: (parseInt(e4.slice(1), 16) << 8 | 255) >>> 0 }; + case 9: + return { css: e4, rgba: parseInt(e4.slice(1), 16) >>> 0 }; + } + const h2 = e4.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/); + if (h2) return i2 = parseInt(h2[1]), s2 = parseInt(h2[2]), r = parseInt(h2[3]), o = Math.round(255 * (void 0 === h2[5] ? 1 : parseFloat(h2[5]))), n.toColor(i2, s2, r, o); + if (!t3 || !a2) throw new Error("css.toColor: Unsupported css format"); + if (t3.fillStyle = a2, t3.fillStyle = e4, "string" != typeof t3.fillStyle) throw new Error("css.toColor: Unsupported css format"); + if (t3.fillRect(0, 0, 1, 1), [i2, s2, r, o] = t3.getImageData(0, 0, 1, 1).data, 255 !== o) throw new Error("css.toColor: Unsupported css format"); + return { rgba: n.toRgba(i2, s2, r, o), css: e4 }; + }; + })(h || (t2.css = h = {})), (function(e3) { + function t3(e4, t4, i3) { + const s3 = e4 / 255, r2 = t4 / 255, o2 = i3 / 255; + return 0.2126 * (s3 <= 0.03928 ? s3 / 12.92 : Math.pow((s3 + 0.055) / 1.055, 2.4)) + 0.7152 * (r2 <= 0.03928 ? r2 / 12.92 : Math.pow((r2 + 0.055) / 1.055, 2.4)) + 0.0722 * (o2 <= 0.03928 ? o2 / 12.92 : Math.pow((o2 + 0.055) / 1.055, 2.4)); + } + e3.relativeLuminance = function(e4) { + return t3(e4 >> 16 & 255, e4 >> 8 & 255, 255 & e4); + }, e3.relativeLuminance2 = t3; + })(l || (t2.rgb = l = {})), (function(e3) { + function t3(e4, t4, i3) { + const s3 = e4 >> 24 & 255, r2 = e4 >> 16 & 255, o2 = e4 >> 8 & 255; + let n2 = t4 >> 24 & 255, a3 = t4 >> 16 & 255, h2 = t4 >> 8 & 255, c2 = _(l.relativeLuminance2(n2, a3, h2), l.relativeLuminance2(s3, r2, o2)); + for (; c2 < i3 && (n2 > 0 || a3 > 0 || h2 > 0); ) n2 -= Math.max(0, Math.ceil(0.1 * n2)), a3 -= Math.max(0, Math.ceil(0.1 * a3)), h2 -= Math.max(0, Math.ceil(0.1 * h2)), c2 = _(l.relativeLuminance2(n2, a3, h2), l.relativeLuminance2(s3, r2, o2)); + return (n2 << 24 | a3 << 16 | h2 << 8 | 255) >>> 0; + } + function a2(e4, t4, i3) { + const s3 = e4 >> 24 & 255, r2 = e4 >> 16 & 255, o2 = e4 >> 8 & 255; + let n2 = t4 >> 24 & 255, a3 = t4 >> 16 & 255, h2 = t4 >> 8 & 255, c2 = _(l.relativeLuminance2(n2, a3, h2), l.relativeLuminance2(s3, r2, o2)); + for (; c2 < i3 && (n2 < 255 || a3 < 255 || h2 < 255); ) n2 = Math.min(255, n2 + Math.ceil(0.1 * (255 - n2))), a3 = Math.min(255, a3 + Math.ceil(0.1 * (255 - a3))), h2 = Math.min(255, h2 + Math.ceil(0.1 * (255 - h2))), c2 = _(l.relativeLuminance2(n2, a3, h2), l.relativeLuminance2(s3, r2, o2)); + return (n2 << 24 | a3 << 16 | h2 << 8 | 255) >>> 0; + } + e3.blend = function(e4, t4) { + if (o = (255 & t4) / 255, 1 === o) return t4; + const a3 = t4 >> 24 & 255, h2 = t4 >> 16 & 255, l2 = t4 >> 8 & 255, c2 = e4 >> 24 & 255, d2 = e4 >> 16 & 255, _2 = e4 >> 8 & 255; + return i2 = c2 + Math.round((a3 - c2) * o), s2 = d2 + Math.round((h2 - d2) * o), r = _2 + Math.round((l2 - _2) * o), n.toRgba(i2, s2, r); + }, e3.ensureContrastRatio = function(e4, i3, s3) { + const r2 = l.relativeLuminance(e4 >> 8), o2 = l.relativeLuminance(i3 >> 8); + if (_(r2, o2) < s3) { + if (o2 < r2) { + const o3 = t3(e4, i3, s3), n3 = _(r2, l.relativeLuminance(o3 >> 8)); + if (n3 < s3) { + const t4 = a2(e4, i3, s3); + return n3 > _(r2, l.relativeLuminance(t4 >> 8)) ? o3 : t4; + } + return o3; + } + const n2 = a2(e4, i3, s3), h2 = _(r2, l.relativeLuminance(n2 >> 8)); + if (h2 < s3) { + const o3 = t3(e4, i3, s3); + return h2 > _(r2, l.relativeLuminance(o3 >> 8)) ? n2 : o3; + } + return n2; + } + }, e3.reduceLuminance = t3, e3.increaseLuminance = a2, e3.toChannels = function(e4) { + return [e4 >> 24 & 255, e4 >> 16 & 255, e4 >> 8 & 255, 255 & e4]; + }; + })(c || (t2.rgba = c = {})), t2.toPaddedHex = d, t2.contrastRatio = _; + }, 345: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.runAndSubscribe = t2.forwardEvent = t2.EventEmitter = void 0, t2.EventEmitter = class { + constructor() { + this._listeners = [], this._disposed = false; + } + get event() { + return this._event || (this._event = (e3) => (this._listeners.push(e3), { dispose: () => { + if (!this._disposed) { + for (let t3 = 0; t3 < this._listeners.length; t3++) if (this._listeners[t3] === e3) return void this._listeners.splice(t3, 1); + } + } })), this._event; + } + fire(e3, t3) { + const i2 = []; + for (let e4 = 0; e4 < this._listeners.length; e4++) i2.push(this._listeners[e4]); + for (let s2 = 0; s2 < i2.length; s2++) i2[s2].call(void 0, e3, t3); + } + dispose() { + this.clearListeners(), this._disposed = true; + } + clearListeners() { + this._listeners && (this._listeners.length = 0); + } + }, t2.forwardEvent = function(e3, t3) { + return e3(((e4) => t3.fire(e4))); + }, t2.runAndSubscribe = function(e3, t3) { + return t3(void 0), e3(((e4) => t3(e4))); + }; + }, 859: (e2, t2) => { + function i2(e3) { + for (const t3 of e3) t3.dispose(); + e3.length = 0; + } + Object.defineProperty(t2, "__esModule", { value: true }), t2.getDisposeArrayDisposable = t2.disposeArray = t2.toDisposable = t2.MutableDisposable = t2.Disposable = void 0, t2.Disposable = class { + constructor() { + this._disposables = [], this._isDisposed = false; + } + dispose() { + this._isDisposed = true; + for (const e3 of this._disposables) e3.dispose(); + this._disposables.length = 0; + } + register(e3) { + return this._disposables.push(e3), e3; + } + unregister(e3) { + const t3 = this._disposables.indexOf(e3); + -1 !== t3 && this._disposables.splice(t3, 1); + } + }, t2.MutableDisposable = class { + constructor() { + this._isDisposed = false; + } + get value() { + return this._isDisposed ? void 0 : this._value; + } + set value(e3) { + var _a; + this._isDisposed || e3 === this._value || ((_a = this._value) == null ? void 0 : _a.dispose(), this._value = e3); + } + clear() { + this.value = void 0; + } + dispose() { + var _a; + this._isDisposed = true, (_a = this._value) == null ? void 0 : _a.dispose(), this._value = void 0; + } + }, t2.toDisposable = function(e3) { + return { dispose: e3 }; + }, t2.disposeArray = i2, t2.getDisposeArrayDisposable = function(e3) { + return { dispose: () => i2(e3) }; + }; + }, 485: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.FourKeyMap = t2.TwoKeyMap = void 0; + class i2 { + constructor() { + this._data = {}; + } + set(e3, t3, i3) { + this._data[e3] || (this._data[e3] = {}), this._data[e3][t3] = i3; + } + get(e3, t3) { + return this._data[e3] ? this._data[e3][t3] : void 0; + } + clear() { + this._data = {}; + } + } + t2.TwoKeyMap = i2, t2.FourKeyMap = class { + constructor() { + this._data = new i2(); + } + set(e3, t3, s2, r, o) { + this._data.get(e3, t3) || this._data.set(e3, t3, new i2()), this._data.get(e3, t3).set(s2, r, o); + } + get(e3, t3, i3, s2) { + var _a; + return (_a = this._data.get(e3, t3)) == null ? void 0 : _a.get(i3, s2); + } + clear() { + this._data.clear(); + } + }; + }, 399: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.isChromeOS = t2.isLinux = t2.isWindows = t2.isIphone = t2.isIpad = t2.isMac = t2.getSafariVersion = t2.isSafari = t2.isLegacyEdge = t2.isFirefox = t2.isNode = void 0, t2.isNode = "undefined" != typeof process && "title" in process; + const i2 = t2.isNode ? "node" : navigator.userAgent, s2 = t2.isNode ? "node" : navigator.platform; + t2.isFirefox = i2.includes("Firefox"), t2.isLegacyEdge = i2.includes("Edge"), t2.isSafari = /^((?!chrome|android).)*safari/i.test(i2), t2.getSafariVersion = function() { + if (!t2.isSafari) return 0; + const e3 = i2.match(/Version\/(\d+)/); + return null === e3 || e3.length < 2 ? 0 : parseInt(e3[1]); + }, t2.isMac = ["Macintosh", "MacIntel", "MacPPC", "Mac68K"].includes(s2), t2.isIpad = "iPad" === s2, t2.isIphone = "iPhone" === s2, t2.isWindows = ["Windows", "Win16", "Win32", "WinCE"].includes(s2), t2.isLinux = s2.indexOf("Linux") >= 0, t2.isChromeOS = /\bCrOS\b/.test(i2); + }, 385: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.DebouncedIdleTask = t2.IdleTaskQueue = t2.PriorityTaskQueue = void 0; + const s2 = i2(399); + class r { + constructor() { + this._tasks = [], this._i = 0; + } + enqueue(e3) { + this._tasks.push(e3), this._start(); + } + flush() { + for (; this._i < this._tasks.length; ) this._tasks[this._i]() || this._i++; + this.clear(); + } + clear() { + this._idleCallback && (this._cancelCallback(this._idleCallback), this._idleCallback = void 0), this._i = 0, this._tasks.length = 0; + } + _start() { + this._idleCallback || (this._idleCallback = this._requestCallback(this._process.bind(this))); + } + _process(e3) { + this._idleCallback = void 0; + let t3 = 0, i3 = 0, s3 = e3.timeRemaining(), r2 = 0; + for (; this._i < this._tasks.length; ) { + if (t3 = Date.now(), this._tasks[this._i]() || this._i++, t3 = Math.max(1, Date.now() - t3), i3 = Math.max(t3, i3), r2 = e3.timeRemaining(), 1.5 * i3 > r2) return s3 - t3 < -20 && console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s3 - t3))}ms`), void this._start(); + s3 = r2; + } + this.clear(); + } + } + class o extends r { + _requestCallback(e3) { + return setTimeout((() => e3(this._createDeadline(16)))); + } + _cancelCallback(e3) { + clearTimeout(e3); + } + _createDeadline(e3) { + const t3 = Date.now() + e3; + return { timeRemaining: () => Math.max(0, t3 - Date.now()) }; + } + } + t2.PriorityTaskQueue = o, t2.IdleTaskQueue = !s2.isNode && "requestIdleCallback" in window ? class extends r { + _requestCallback(e3) { + return requestIdleCallback(e3); + } + _cancelCallback(e3) { + cancelIdleCallback(e3); + } + } : o, t2.DebouncedIdleTask = class { + constructor() { + this._queue = new t2.IdleTaskQueue(); + } + set(e3) { + this._queue.clear(), this._queue.enqueue(e3); + } + flush() { + this._queue.flush(); + } + }; + }, 147: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.ExtendedAttrs = t2.AttributeData = void 0; + class i2 { + constructor() { + this.fg = 0, this.bg = 0, this.extended = new s2(); + } + static toColorRGB(e3) { + return [e3 >>> 16 & 255, e3 >>> 8 & 255, 255 & e3]; + } + static fromColorRGB(e3) { + return (255 & e3[0]) << 16 | (255 & e3[1]) << 8 | 255 & e3[2]; + } + clone() { + const e3 = new i2(); + return e3.fg = this.fg, e3.bg = this.bg, e3.extended = this.extended.clone(), e3; + } + isInverse() { + return 67108864 & this.fg; + } + isBold() { + return 134217728 & this.fg; + } + isUnderline() { + return this.hasExtendedAttrs() && 0 !== this.extended.underlineStyle ? 1 : 268435456 & this.fg; + } + isBlink() { + return 536870912 & this.fg; + } + isInvisible() { + return 1073741824 & this.fg; + } + isItalic() { + return 67108864 & this.bg; + } + isDim() { + return 134217728 & this.bg; + } + isStrikethrough() { + return 2147483648 & this.fg; + } + isProtected() { + return 536870912 & this.bg; + } + isOverline() { + return 1073741824 & this.bg; + } + getFgColorMode() { + return 50331648 & this.fg; + } + getBgColorMode() { + return 50331648 & this.bg; + } + isFgRGB() { + return 50331648 == (50331648 & this.fg); + } + isBgRGB() { + return 50331648 == (50331648 & this.bg); + } + isFgPalette() { + return 16777216 == (50331648 & this.fg) || 33554432 == (50331648 & this.fg); + } + isBgPalette() { + return 16777216 == (50331648 & this.bg) || 33554432 == (50331648 & this.bg); + } + isFgDefault() { + return 0 == (50331648 & this.fg); + } + isBgDefault() { + return 0 == (50331648 & this.bg); + } + isAttributeDefault() { + return 0 === this.fg && 0 === this.bg; + } + getFgColor() { + switch (50331648 & this.fg) { + case 16777216: + case 33554432: + return 255 & this.fg; + case 50331648: + return 16777215 & this.fg; + default: + return -1; + } + } + getBgColor() { + switch (50331648 & this.bg) { + case 16777216: + case 33554432: + return 255 & this.bg; + case 50331648: + return 16777215 & this.bg; + default: + return -1; + } + } + hasExtendedAttrs() { + return 268435456 & this.bg; + } + updateExtended() { + this.extended.isEmpty() ? this.bg &= -268435457 : this.bg |= 268435456; + } + getUnderlineColor() { + if (268435456 & this.bg && ~this.extended.underlineColor) switch (50331648 & this.extended.underlineColor) { + case 16777216: + case 33554432: + return 255 & this.extended.underlineColor; + case 50331648: + return 16777215 & this.extended.underlineColor; + default: + return this.getFgColor(); + } + return this.getFgColor(); + } + getUnderlineColorMode() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 50331648 & this.extended.underlineColor : this.getFgColorMode(); + } + isUnderlineColorRGB() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 50331648 == (50331648 & this.extended.underlineColor) : this.isFgRGB(); + } + isUnderlineColorPalette() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 16777216 == (50331648 & this.extended.underlineColor) || 33554432 == (50331648 & this.extended.underlineColor) : this.isFgPalette(); + } + isUnderlineColorDefault() { + return 268435456 & this.bg && ~this.extended.underlineColor ? 0 == (50331648 & this.extended.underlineColor) : this.isFgDefault(); + } + getUnderlineStyle() { + return 268435456 & this.fg ? 268435456 & this.bg ? this.extended.underlineStyle : 1 : 0; + } + getUnderlineVariantOffset() { + return this.extended.underlineVariantOffset; + } + } + t2.AttributeData = i2; + class s2 { + get ext() { + return this._urlId ? -469762049 & this._ext | this.underlineStyle << 26 : this._ext; + } + set ext(e3) { + this._ext = e3; + } + get underlineStyle() { + return this._urlId ? 5 : (469762048 & this._ext) >> 26; + } + set underlineStyle(e3) { + this._ext &= -469762049, this._ext |= e3 << 26 & 469762048; + } + get underlineColor() { + return 67108863 & this._ext; + } + set underlineColor(e3) { + this._ext &= -67108864, this._ext |= 67108863 & e3; + } + get urlId() { + return this._urlId; + } + set urlId(e3) { + this._urlId = e3; + } + get underlineVariantOffset() { + const e3 = (3758096384 & this._ext) >> 29; + return e3 < 0 ? 4294967288 ^ e3 : e3; + } + set underlineVariantOffset(e3) { + this._ext &= 536870911, this._ext |= e3 << 29 & 3758096384; + } + constructor(e3 = 0, t3 = 0) { + this._ext = 0, this._urlId = 0, this._ext = e3, this._urlId = t3; + } + clone() { + return new s2(this._ext, this._urlId); + } + isEmpty() { + return 0 === this.underlineStyle && 0 === this._urlId; + } + } + t2.ExtendedAttrs = s2; + }, 782: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.CellData = void 0; + const s2 = i2(133), r = i2(855), o = i2(147); + class n extends o.AttributeData { + constructor() { + super(...arguments), this.content = 0, this.fg = 0, this.bg = 0, this.extended = new o.ExtendedAttrs(), this.combinedData = ""; + } + static fromCharData(e3) { + const t3 = new n(); + return t3.setFromCharData(e3), t3; + } + isCombined() { + return 2097152 & this.content; + } + getWidth() { + return this.content >> 22; + } + getChars() { + return 2097152 & this.content ? this.combinedData : 2097151 & this.content ? (0, s2.stringFromCodePoint)(2097151 & this.content) : ""; + } + getCode() { + return this.isCombined() ? this.combinedData.charCodeAt(this.combinedData.length - 1) : 2097151 & this.content; + } + setFromCharData(e3) { + this.fg = e3[r.CHAR_DATA_ATTR_INDEX], this.bg = 0; + let t3 = false; + if (e3[r.CHAR_DATA_CHAR_INDEX].length > 2) t3 = true; + else if (2 === e3[r.CHAR_DATA_CHAR_INDEX].length) { + const i3 = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0); + if (55296 <= i3 && i3 <= 56319) { + const s3 = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1); + 56320 <= s3 && s3 <= 57343 ? this.content = 1024 * (i3 - 55296) + s3 - 56320 + 65536 | e3[r.CHAR_DATA_WIDTH_INDEX] << 22 : t3 = true; + } else t3 = true; + } else this.content = e3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0) | e3[r.CHAR_DATA_WIDTH_INDEX] << 22; + t3 && (this.combinedData = e3[r.CHAR_DATA_CHAR_INDEX], this.content = 2097152 | e3[r.CHAR_DATA_WIDTH_INDEX] << 22); + } + getAsCharData() { + return [this.fg, this.getChars(), this.getWidth(), this.getCode()]; + } + } + t2.CellData = n; + }, 855: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.WHITESPACE_CELL_CODE = t2.WHITESPACE_CELL_WIDTH = t2.WHITESPACE_CELL_CHAR = t2.NULL_CELL_CODE = t2.NULL_CELL_WIDTH = t2.NULL_CELL_CHAR = t2.CHAR_DATA_CODE_INDEX = t2.CHAR_DATA_WIDTH_INDEX = t2.CHAR_DATA_CHAR_INDEX = t2.CHAR_DATA_ATTR_INDEX = t2.DEFAULT_EXT = t2.DEFAULT_ATTR = t2.DEFAULT_COLOR = void 0, t2.DEFAULT_COLOR = 0, t2.DEFAULT_ATTR = 256 | t2.DEFAULT_COLOR << 9, t2.DEFAULT_EXT = 0, t2.CHAR_DATA_ATTR_INDEX = 0, t2.CHAR_DATA_CHAR_INDEX = 1, t2.CHAR_DATA_WIDTH_INDEX = 2, t2.CHAR_DATA_CODE_INDEX = 3, t2.NULL_CELL_CHAR = "", t2.NULL_CELL_WIDTH = 1, t2.NULL_CELL_CODE = 0, t2.WHITESPACE_CELL_CHAR = " ", t2.WHITESPACE_CELL_WIDTH = 1, t2.WHITESPACE_CELL_CODE = 32; + }, 133: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.Utf8ToUtf32 = t2.StringToUtf32 = t2.utf32ToString = t2.stringFromCodePoint = void 0, t2.stringFromCodePoint = function(e3) { + return e3 > 65535 ? (e3 -= 65536, String.fromCharCode(55296 + (e3 >> 10)) + String.fromCharCode(e3 % 1024 + 56320)) : String.fromCharCode(e3); + }, t2.utf32ToString = function(e3, t3 = 0, i2 = e3.length) { + let s2 = ""; + for (let r = t3; r < i2; ++r) { + let t4 = e3[r]; + t4 > 65535 ? (t4 -= 65536, s2 += String.fromCharCode(55296 + (t4 >> 10)) + String.fromCharCode(t4 % 1024 + 56320)) : s2 += String.fromCharCode(t4); + } + return s2; + }, t2.StringToUtf32 = class { + constructor() { + this._interim = 0; + } + clear() { + this._interim = 0; + } + decode(e3, t3) { + const i2 = e3.length; + if (!i2) return 0; + let s2 = 0, r = 0; + if (this._interim) { + const i3 = e3.charCodeAt(r++); + 56320 <= i3 && i3 <= 57343 ? t3[s2++] = 1024 * (this._interim - 55296) + i3 - 56320 + 65536 : (t3[s2++] = this._interim, t3[s2++] = i3), this._interim = 0; + } + for (let o = r; o < i2; ++o) { + const r2 = e3.charCodeAt(o); + if (55296 <= r2 && r2 <= 56319) { + if (++o >= i2) return this._interim = r2, s2; + const n = e3.charCodeAt(o); + 56320 <= n && n <= 57343 ? t3[s2++] = 1024 * (r2 - 55296) + n - 56320 + 65536 : (t3[s2++] = r2, t3[s2++] = n); + } else 65279 !== r2 && (t3[s2++] = r2); + } + return s2; + } + }, t2.Utf8ToUtf32 = class { + constructor() { + this.interim = new Uint8Array(3); + } + clear() { + this.interim.fill(0); + } + decode(e3, t3) { + const i2 = e3.length; + if (!i2) return 0; + let s2, r, o, n, a = 0, h = 0, l = 0; + if (this.interim[0]) { + let s3 = false, r2 = this.interim[0]; + r2 &= 192 == (224 & r2) ? 31 : 224 == (240 & r2) ? 15 : 7; + let o2, n2 = 0; + for (; (o2 = 63 & this.interim[++n2]) && n2 < 4; ) r2 <<= 6, r2 |= o2; + const h2 = 192 == (224 & this.interim[0]) ? 2 : 224 == (240 & this.interim[0]) ? 3 : 4, c2 = h2 - n2; + for (; l < c2; ) { + if (l >= i2) return 0; + if (o2 = e3[l++], 128 != (192 & o2)) { + l--, s3 = true; + break; + } + this.interim[n2++] = o2, r2 <<= 6, r2 |= 63 & o2; + } + s3 || (2 === h2 ? r2 < 128 ? l-- : t3[a++] = r2 : 3 === h2 ? r2 < 2048 || r2 >= 55296 && r2 <= 57343 || 65279 === r2 || (t3[a++] = r2) : r2 < 65536 || r2 > 1114111 || (t3[a++] = r2)), this.interim.fill(0); + } + const c = i2 - 4; + let d = l; + for (; d < i2; ) { + for (; !(!(d < c) || 128 & (s2 = e3[d]) || 128 & (r = e3[d + 1]) || 128 & (o = e3[d + 2]) || 128 & (n = e3[d + 3])); ) t3[a++] = s2, t3[a++] = r, t3[a++] = o, t3[a++] = n, d += 4; + if (s2 = e3[d++], s2 < 128) t3[a++] = s2; + else if (192 == (224 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (h = (31 & s2) << 6 | 63 & r, h < 128) { + d--; + continue; + } + t3[a++] = h; + } else if (224 == (240 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, a; + if (o = e3[d++], 128 != (192 & o)) { + d--; + continue; + } + if (h = (15 & s2) << 12 | (63 & r) << 6 | 63 & o, h < 2048 || h >= 55296 && h <= 57343 || 65279 === h) continue; + t3[a++] = h; + } else if (240 == (248 & s2)) { + if (d >= i2) return this.interim[0] = s2, a; + if (r = e3[d++], 128 != (192 & r)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, a; + if (o = e3[d++], 128 != (192 & o)) { + d--; + continue; + } + if (d >= i2) return this.interim[0] = s2, this.interim[1] = r, this.interim[2] = o, a; + if (n = e3[d++], 128 != (192 & n)) { + d--; + continue; + } + if (h = (7 & s2) << 18 | (63 & r) << 12 | (63 & o) << 6 | 63 & n, h < 65536 || h > 1114111) continue; + t3[a++] = h; + } + } + return a; + } + }; + }, 776: function(e2, t2, i2) { + var s2 = this && this.__decorate || function(e3, t3, i3, s3) { + var r2, o2 = arguments.length, n2 = o2 < 3 ? t3 : null === s3 ? s3 = Object.getOwnPropertyDescriptor(t3, i3) : s3; + if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) n2 = Reflect.decorate(e3, t3, i3, s3); + else for (var a2 = e3.length - 1; a2 >= 0; a2--) (r2 = e3[a2]) && (n2 = (o2 < 3 ? r2(n2) : o2 > 3 ? r2(t3, i3, n2) : r2(t3, i3)) || n2); + return o2 > 3 && n2 && Object.defineProperty(t3, i3, n2), n2; + }, r = this && this.__param || function(e3, t3) { + return function(i3, s3) { + t3(i3, s3, e3); + }; + }; + Object.defineProperty(t2, "__esModule", { value: true }), t2.traceCall = t2.setTraceLogger = t2.LogService = void 0; + const o = i2(859), n = i2(97), a = { trace: n.LogLevelEnum.TRACE, debug: n.LogLevelEnum.DEBUG, info: n.LogLevelEnum.INFO, warn: n.LogLevelEnum.WARN, error: n.LogLevelEnum.ERROR, off: n.LogLevelEnum.OFF }; + let h, l = t2.LogService = class extends o.Disposable { + get logLevel() { + return this._logLevel; + } + constructor(e3) { + super(), this._optionsService = e3, this._logLevel = n.LogLevelEnum.OFF, this._updateLogLevel(), this.register(this._optionsService.onSpecificOptionChange("logLevel", (() => this._updateLogLevel()))), h = this; + } + _updateLogLevel() { + this._logLevel = a[this._optionsService.rawOptions.logLevel]; + } + _evalLazyOptionalParams(e3) { + for (let t3 = 0; t3 < e3.length; t3++) "function" == typeof e3[t3] && (e3[t3] = e3[t3]()); + } + _log(e3, t3, i3) { + this._evalLazyOptionalParams(i3), e3.call(console, (this._optionsService.options.logger ? "" : "xterm.js: ") + t3, ...i3); + } + trace(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.TRACE && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.trace.bind(this._optionsService.options.logger)) ?? console.log, e3, t3); + } + debug(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.DEBUG && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.debug.bind(this._optionsService.options.logger)) ?? console.log, e3, t3); + } + info(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.INFO && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.info.bind(this._optionsService.options.logger)) ?? console.info, e3, t3); + } + warn(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.WARN && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.warn.bind(this._optionsService.options.logger)) ?? console.warn, e3, t3); + } + error(e3, ...t3) { + var _a; + this._logLevel <= n.LogLevelEnum.ERROR && this._log(((_a = this._optionsService.options.logger) == null ? void 0 : _a.error.bind(this._optionsService.options.logger)) ?? console.error, e3, t3); + } + }; + t2.LogService = l = s2([r(0, n.IOptionsService)], l), t2.setTraceLogger = function(e3) { + h = e3; + }, t2.traceCall = function(e3, t3, i3) { + if ("function" != typeof i3.value) throw new Error("not supported"); + const s3 = i3.value; + i3.value = function(...e4) { + if (h.logLevel !== n.LogLevelEnum.TRACE) return s3.apply(this, e4); + h.trace(`GlyphRenderer#${s3.name}(${e4.map(((e5) => JSON.stringify(e5))).join(", ")})`); + const t4 = s3.apply(this, e4); + return h.trace(`GlyphRenderer#${s3.name} return`, t4), t4; + }; + }; + }, 726: (e2, t2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.createDecorator = t2.getServiceDependencies = t2.serviceRegistry = void 0; + const i2 = "di$target", s2 = "di$dependencies"; + t2.serviceRegistry = /* @__PURE__ */ new Map(), t2.getServiceDependencies = function(e3) { + return e3[s2] || []; + }, t2.createDecorator = function(e3) { + if (t2.serviceRegistry.has(e3)) return t2.serviceRegistry.get(e3); + const r = function(e4, t3, o) { + if (3 !== arguments.length) throw new Error("@IServiceName-decorator can only be used to decorate a parameter"); + !(function(e5, t4, r2) { + t4[i2] === t4 ? t4[s2].push({ id: e5, index: r2 }) : (t4[s2] = [{ id: e5, index: r2 }], t4[i2] = t4); + })(r, e4, o); + }; + return r.toString = () => e3, t2.serviceRegistry.set(e3, r), r; + }; + }, 97: (e2, t2, i2) => { + Object.defineProperty(t2, "__esModule", { value: true }), t2.IDecorationService = t2.IUnicodeService = t2.IOscLinkService = t2.IOptionsService = t2.ILogService = t2.LogLevelEnum = t2.IInstantiationService = t2.ICharsetService = t2.ICoreService = t2.ICoreMouseService = t2.IBufferService = void 0; + const s2 = i2(726); + var r; + t2.IBufferService = (0, s2.createDecorator)("BufferService"), t2.ICoreMouseService = (0, s2.createDecorator)("CoreMouseService"), t2.ICoreService = (0, s2.createDecorator)("CoreService"), t2.ICharsetService = (0, s2.createDecorator)("CharsetService"), t2.IInstantiationService = (0, s2.createDecorator)("InstantiationService"), (function(e3) { + e3[e3.TRACE = 0] = "TRACE", e3[e3.DEBUG = 1] = "DEBUG", e3[e3.INFO = 2] = "INFO", e3[e3.WARN = 3] = "WARN", e3[e3.ERROR = 4] = "ERROR", e3[e3.OFF = 5] = "OFF"; + })(r || (t2.LogLevelEnum = r = {})), t2.ILogService = (0, s2.createDecorator)("LogService"), t2.IOptionsService = (0, s2.createDecorator)("OptionsService"), t2.IOscLinkService = (0, s2.createDecorator)("OscLinkService"), t2.IUnicodeService = (0, s2.createDecorator)("UnicodeService"), t2.IDecorationService = (0, s2.createDecorator)("DecorationService"); + } }, t = {}; + function i(s2) { + var r = t[s2]; + if (void 0 !== r) return r.exports; + var o = t[s2] = { exports: {} }; + return e[s2].call(o.exports, o, o.exports, i), o.exports; + } + var s = {}; + return (() => { + var e2 = s; + Object.defineProperty(e2, "__esModule", { value: true }), e2.WebglAddon = void 0; + const t2 = i(345), r = i(859), o = i(399), n = i(666), a = i(776); + class h extends r.Disposable { + constructor(e3) { + if (o.isSafari && (0, o.getSafariVersion)() < 16) { + const e4 = { antialias: false, depth: false, preserveDrawingBuffer: true }; + if (!document.createElement("canvas").getContext("webgl2", e4)) throw new Error("Webgl2 is only supported on Safari 16 and above"); + } + super(), this._preserveDrawingBuffer = e3, this._onChangeTextureAtlas = this.register(new t2.EventEmitter()), this.onChangeTextureAtlas = this._onChangeTextureAtlas.event, this._onAddTextureAtlasCanvas = this.register(new t2.EventEmitter()), this.onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event, this._onRemoveTextureAtlasCanvas = this.register(new t2.EventEmitter()), this.onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event, this._onContextLoss = this.register(new t2.EventEmitter()), this.onContextLoss = this._onContextLoss.event; + } + activate(e3) { + const i2 = e3._core; + if (!e3.element) return void this.register(i2.onWillOpen((() => this.activate(e3)))); + this._terminal = e3; + const s2 = i2.coreService, o2 = i2.optionsService, h2 = i2, l = h2._renderService, c = h2._characterJoinerService, d = h2._charSizeService, _ = h2._coreBrowserService, u = h2._decorationService, g = h2._logService, v = h2._themeService; + (0, a.setTraceLogger)(g), this._renderer = this.register(new n.WebglRenderer(e3, c, d, _, s2, u, o2, v, this._preserveDrawingBuffer)), this.register((0, t2.forwardEvent)(this._renderer.onContextLoss, this._onContextLoss)), this.register((0, t2.forwardEvent)(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas)), this.register((0, t2.forwardEvent)(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas)), this.register((0, t2.forwardEvent)(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)), l.setRenderer(this._renderer), this.register((0, r.toDisposable)((() => { + const t3 = this._terminal._core._renderService; + t3.setRenderer(this._terminal._core._createRenderer()), t3.handleResize(e3.cols, e3.rows); + }))); + } + get textureAtlas() { + var _a; + return (_a = this._renderer) == null ? void 0 : _a.textureAtlas; + } + clearTextureAtlas() { + var _a; + (_a = this._renderer) == null ? void 0 : _a.clearTextureAtlas(); + } + } + e2.WebglAddon = h; + })(), s; + })())); + } +}); + +// src/server/web/terminal.ts +var import_xterm = __toESM(require_xterm(), 1); +var import_addon_fit = __toESM(require_addon_fit(), 1); +var import_addon_web_links = __toESM(require_addon_web_links(), 1); +var import_addon_search = __toESM(require_addon_search(), 1); +var import_addon_unicode11 = __toESM(require_addon_unicode11(), 1); +var import_addon_webgl = __toESM(require_addon_webgl(), 1); +var RECONNECT_BASE_MS = 1e3; +var RECONNECT_MAX_MS = 3e4; +var PING_INTERVAL_MS = 5e3; +var ws = null; +var term; +var fitAddon; +var searchAddon; +var reconnectDelay = RECONNECT_BASE_MS; +var reconnectTimer = null; +var pingTimer = null; +var lastPingSent = 0; +var connected = false; +var loadingOverlay = document.getElementById("loading-overlay"); +var reconnectOverlay = document.getElementById("reconnect-overlay"); +var reconnectSub = document.getElementById("reconnect-sub"); +var statusDot = document.getElementById("status-dot"); +var latencyEl = document.getElementById("latency"); +var barBtn = document.getElementById("bar-btn"); +var topBar = document.getElementById("top-bar"); +var toggleBarBtn = document.getElementById("toggle-bar"); +var terminalContainer = document.getElementById("terminal-container"); function getTheme() { const s = getComputedStyle(document.documentElement); const v = (prop) => s.getPropertyValue(prop).trim(); return { - background: v('--term-bg'), - foreground: v('--term-fg'), - cursor: v('--term-cursor'), - selectionBackground: v('--term-selection'), - black: v('--term-black'), - red: v('--term-red'), - green: v('--term-green'), - yellow: v('--term-yellow'), - blue: v('--term-blue'), - magenta: v('--term-magenta'), - cyan: v('--term-cyan'), - white: v('--term-white'), - brightBlack: v('--term-bright-black'), - brightRed: v('--term-red'), - brightGreen: v('--term-green'), - brightYellow: v('--term-yellow'), - brightBlue: v('--term-blue'), - brightMagenta: v('--term-magenta'), - brightCyan: v('--term-cyan'), - brightWhite: v('--term-bright-white'), + background: v("--term-bg"), + foreground: v("--term-fg"), + cursor: v("--term-cursor"), + selectionBackground: v("--term-selection"), + black: v("--term-black"), + red: v("--term-red"), + green: v("--term-green"), + yellow: v("--term-yellow"), + blue: v("--term-blue"), + magenta: v("--term-magenta"), + cyan: v("--term-cyan"), + white: v("--term-white"), + brightBlack: v("--term-bright-black"), + brightRed: v("--term-red"), + brightGreen: v("--term-green"), + brightYellow: v("--term-yellow"), + brightBlue: v("--term-blue"), + brightMagenta: v("--term-magenta"), + brightCyan: v("--term-cyan"), + brightWhite: v("--term-bright-white") }; } - -// ── Terminal Init ────────────────────────────────────────────────────── - function initTerminal() { - term = new Terminal({ + term = new import_xterm.Terminal({ cursorBlink: true, - cursorStyle: 'block', + cursorStyle: "block", fontFamily: "'Cascadia Code', 'Fira Code', 'JetBrains Mono', 'SF Mono', Menlo, Monaco, 'Courier New', monospace", fontSize: 14, lineHeight: 1.2, theme: getTheme(), allowProposedApi: true, - scrollback: 10000, - convertEol: true, + scrollback: 1e4, + convertEol: true }); - - // Addons - fitAddon = new FitAddon.FitAddon(); + fitAddon = new import_addon_fit.FitAddon(); term.loadAddon(fitAddon); - - const webLinksAddon = new WebLinksAddon.WebLinksAddon(); - term.loadAddon(webLinksAddon); - - searchAddon = new SearchAddon.SearchAddon(); + term.loadAddon(new import_addon_web_links.WebLinksAddon()); + searchAddon = new import_addon_search.SearchAddon(); term.loadAddon(searchAddon); - - const unicode11Addon = new Unicode11Addon.Unicode11Addon(); - term.loadAddon(unicode11Addon); - term.unicode.activeVersion = '11'; - - // Open terminal + const unicode11 = new import_addon_unicode11.Unicode11Addon(); + term.loadAddon(unicode11); + term.unicode.activeVersion = "11"; term.open(terminalContainer); - - // Try WebGL renderer, fall back to canvas try { - webglAddon = new WebglAddon.WebglAddon(); - webglAddon.onContextLoss(() => { - webglAddon.dispose(); - webglAddon = null; - }); - term.loadAddon(webglAddon); - } catch (e) { - console.warn('WebGL renderer unavailable, using default canvas renderer'); + const webgl = new import_addon_webgl.WebglAddon(); + webgl.onContextLoss(() => webgl.dispose()); + term.loadAddon(webgl); + } catch { } - fitAddon.fit(); - - // Resize handling - const resizeObserver = new ResizeObserver(() => { - if (fitAddon) { - fitAddon.fit(); - } - }); + const resizeObserver = new ResizeObserver(() => fitAddon.fit()); resizeObserver.observe(terminalContainer); - - term.onResize(({ cols, rows }) => { - sendJSON({ type: 'resize', cols, rows }); - }); - - // Forward input to WebSocket + term.onResize(({ cols, rows }) => sendJSON({ type: "resize", cols, rows })); term.onData((data) => { - if (ws && ws.readyState === WebSocket.OPEN) { - ws.send(data); - } + if ((ws == null ? void 0 : ws.readyState) === WebSocket.OPEN) ws.send(data); }); - - // Binary data - term.onBinary((data) => { - if (ws && ws.readyState === WebSocket.OPEN) { - const buf = new Uint8Array(data.length); - for (let i = 0; i < data.length; i++) { - buf[i] = data.charCodeAt(i) & 0xff; - } - ws.send(buf.buffer); - } - }); - - // Keyboard intercepts term.attachCustomKeyEventHandler((ev) => { - // Ctrl+Shift+F → search - if (ev.ctrlKey && ev.shiftKey && ev.key === 'F') { - if (ev.type === 'keydown') { - const query = prompt('Search terminal:'); - if (query) searchAddon.findNext(query); + if (ev.ctrlKey && ev.shiftKey && ev.key === "F") { + if (ev.type === "keydown") { + const query = window.prompt("Search terminal:"); + if (query) searchAddon.findNext(query, { caseSensitive: false, regex: false }); } return false; } - // Ctrl+Shift+C → copy (Linux) - if (ev.ctrlKey && ev.shiftKey && ev.key === 'C') { - if (ev.type === 'keydown') { + if (ev.ctrlKey && ev.shiftKey && ev.key === "C") { + if (ev.type === "keydown") { const sel = term.getSelection(); if (sel) navigator.clipboard.writeText(sel); } return false; } - // Ctrl+Shift+V → paste (Linux) - if (ev.ctrlKey && ev.shiftKey && ev.key === 'V') { - if (ev.type === 'keydown') { + if (ev.ctrlKey && ev.shiftKey && ev.key === "V") { + if (ev.type === "keydown") { navigator.clipboard.readText().then((text) => { - if (ws && ws.readyState === WebSocket.OPEN) { - ws.send(text); - } + if ((ws == null ? void 0 : ws.readyState) === WebSocket.OPEN) ws.send(text); }); } return false; } return true; }); - - // Theme change listener - window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { + window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => { term.options.theme = getTheme(); }); } - -// ── WebSocket ────────────────────────────────────────────────────────── - -function getWSUrl() { - const proto = location.protocol === 'https:' ? 'wss:' : 'ws:'; +function getWsUrl() { + const proto = location.protocol === "https:" ? "wss:" : "ws:"; const url = new URL(`${proto}//${location.host}/ws`); - // Auth token from URL param or localStorage const params = new URLSearchParams(location.search); - const token = params.get('token') || localStorage.getItem('claude-terminal-token'); + const token = params.get("token") ?? localStorage.getItem("claude-terminal-token"); if (token) { - url.searchParams.set('token', token); - // Persist for reconnection - localStorage.setItem('claude-terminal-token', token); + url.searchParams.set("token", token); + localStorage.setItem("claude-terminal-token", token); } + url.searchParams.set("cols", String(term.cols)); + url.searchParams.set("rows", String(term.rows)); return url.toString(); } - -function sendJSON(obj) { - if (ws && ws.readyState === WebSocket.OPEN) { - ws.send(JSON.stringify(obj)); - } +function sendJSON(msg) { + if ((ws == null ? void 0 : ws.readyState) === WebSocket.OPEN) ws.send(JSON.stringify(msg)); } - function connect() { - setStatus('connecting'); - - ws = new WebSocket(getWSUrl()); - ws.binaryType = 'arraybuffer'; - - ws.addEventListener('open', () => { + setStatus("connecting"); + ws = new WebSocket(getWsUrl()); + ws.addEventListener("open", () => { connected = true; reconnectDelay = RECONNECT_BASE_MS; - setStatus('connected'); - hideLoading(); - hideReconnect(); - - // Send initial size - if (fitAddon) { - fitAddon.fit(); - sendJSON({ type: 'resize', cols: term.cols, rows: term.rows }); - } - - // Start ping + setStatus("connected"); + hideOverlay(loadingOverlay); + hideOverlay(reconnectOverlay); + fitAddon.fit(); + sendJSON({ type: "resize", cols: term.cols, rows: term.rows }); startPing(); }); - - ws.addEventListener('message', (ev) => { - if (ev.data instanceof ArrayBuffer) { - term.write(new Uint8Array(ev.data)); - } else if (typeof ev.data === 'string') { - // Could be JSON control message or plain text + ws.addEventListener("message", ({ data }) => { + if (data.startsWith("{")) { try { - const msg = JSON.parse(ev.data); - handleControlMessage(msg); + handleControlMessage(JSON.parse(data)); + return; } catch { - term.write(ev.data); } } + term.write(data); }); - - ws.addEventListener('close', () => { - onDisconnect(); - }); - - ws.addEventListener('error', () => { - // error fires before close, let close handle reconnect + ws.addEventListener("close", onDisconnect); + ws.addEventListener("error", () => { }); } - function handleControlMessage(msg) { - if (msg.type === 'pong') { - const latency = Date.now() - lastPingSent; - latencyEl.textContent = `${latency}ms`; + switch (msg.type) { + case "connected": + break; + case "pong": + latencyEl.textContent = `${Date.now() - lastPingSent}ms`; + break; + case "error": + term.writeln(`\r +\x1B[31m[error] ${msg.message}\x1B[0m`); + break; + case "exit": + term.writeln( + `\r +\x1B[33m[session ended \u2014 exit code ${msg.exitCode ?? 0}]\x1B[0m` + ); + break; } } - function onDisconnect() { connected = false; - setStatus('disconnected'); + ws = null; + setStatus("disconnected"); stopPing(); - - if (ws) { - ws = null; - } - - showReconnect(); + showOverlay(reconnectOverlay); scheduleReconnect(); } - function scheduleReconnect() { - clearTimeout(reconnectTimer); - reconnectSub.textContent = `Retrying in ${Math.round(reconnectDelay / 1000)}s...`; - reconnectTimer = setTimeout(() => { - connect(); - }, reconnectDelay); + if (reconnectTimer) clearTimeout(reconnectTimer); + reconnectSub.textContent = `Retrying in ${Math.round(reconnectDelay / 1e3)}s\u2026`; + reconnectTimer = setTimeout(() => connect(), reconnectDelay); reconnectDelay = Math.min(reconnectDelay * 2, RECONNECT_MAX_MS); } - function manualReconnect() { - clearTimeout(reconnectTimer); + if (reconnectTimer) clearTimeout(reconnectTimer); reconnectDelay = RECONNECT_BASE_MS; - if (ws) { - ws.close(); - ws = null; - } - // Clear terminal for fresh session - if (term) term.clear(); + ws == null ? void 0 : ws.close(); + ws = null; + term.clear(); connect(); } - -// ── Ping ─────────────────────────────────────────────────────────────── - function startPing() { stopPing(); pingTimer = setInterval(() => { - if (ws && ws.readyState === WebSocket.OPEN) { + if ((ws == null ? void 0 : ws.readyState) === WebSocket.OPEN) { lastPingSent = Date.now(); - sendJSON({ type: 'ping' }); + sendJSON({ type: "ping" }); } }, PING_INTERVAL_MS); } - function stopPing() { - clearInterval(pingTimer); - latencyEl.textContent = '--'; + if (pingTimer) clearInterval(pingTimer); + pingTimer = null; + latencyEl.textContent = "--"; } - -// ── UI Helpers ───────────────────────────────────────────────────────── - function setStatus(state) { - statusDot.className = 'status-dot'; - if (state === 'disconnected') statusDot.classList.add('disconnected'); - if (state === 'connecting') statusDot.classList.add('connecting'); - - barBtn.textContent = connected ? 'Disconnect' : 'Reconnect'; + statusDot.className = "status-dot"; + if (state !== "connected") statusDot.classList.add(state); + barBtn.textContent = connected ? "Disconnect" : "Reconnect"; } - -function hideLoading() { - loadingOverlay.classList.add('hidden'); +function showOverlay(el) { + el.classList.remove("hidden"); + el.classList.add("visible"); } - -function showReconnect() { - reconnectOverlay.classList.add('visible'); +function hideOverlay(el) { + el.classList.remove("visible"); + el.classList.add("hidden"); } - -function hideReconnect() { - reconnectOverlay.classList.remove('visible'); -} - -// ── Top Bar Toggle ───────────────────────────────────────────────────── - function setupBarToggle() { - const isCollapsed = localStorage.getItem('claude-bar-collapsed') === 'true'; - if (isCollapsed) topBar.classList.add('collapsed'); - - toggleBar.addEventListener('click', () => { - topBar.classList.remove('collapsed'); - localStorage.setItem('claude-bar-collapsed', 'false'); - if (fitAddon) setTimeout(() => fitAddon.fit(), 200); + const STORAGE_KEY = "claude-bar-collapsed"; + if (localStorage.getItem(STORAGE_KEY) === "true") { + topBar.classList.add("collapsed"); + } + toggleBarBtn.addEventListener("click", () => { + topBar.classList.remove("collapsed"); + localStorage.setItem(STORAGE_KEY, "false"); + setTimeout(() => fitAddon.fit(), 200); }); - - // Double-click top bar to collapse - topBar.addEventListener('dblclick', () => { - topBar.classList.add('collapsed'); - localStorage.setItem('claude-bar-collapsed', 'true'); - if (fitAddon) setTimeout(() => fitAddon.fit(), 200); + topBar.addEventListener("dblclick", () => { + topBar.classList.add("collapsed"); + localStorage.setItem(STORAGE_KEY, "true"); + setTimeout(() => fitAddon.fit(), 200); }); - - barBtn.addEventListener('click', () => { + barBtn.addEventListener("click", () => { if (connected) { - if (ws) ws.close(); + ws == null ? void 0 : ws.close(); } else { manualReconnect(); } }); } - -// ── Boot ─────────────────────────────────────────────────────────────── - -document.addEventListener('DOMContentLoaded', () => { +document.addEventListener("DOMContentLoaded", () => { initTerminal(); setupBarToggle(); connect(); - - // Focus terminal on click anywhere - document.addEventListener('click', () => term.focus()); + document.addEventListener("click", () => term.focus()); term.focus(); }); +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsid2VicGFjazovL0B4dGVybS94dGVybS93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9BY2Nlc3NpYmlsaXR5TWFuYWdlci50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL0NsaXBib2FyZC50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL0NvbG9yQ29udHJhc3RDYWNoZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL0xpZmVjeWNsZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL0xpbmtpZmllci50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL0xvY2FsaXphYmxlU3RyaW5ncy50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL09zY0xpbmtQcm92aWRlci50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL1JlbmRlckRlYm91bmNlci50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL1Rlcm1pbmFsLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvVGltZUJhc2VkRGVib3VuY2VyLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvVmlld3BvcnQudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9kZWNvcmF0aW9ucy9CdWZmZXJEZWNvcmF0aW9uUmVuZGVyZXIudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9kZWNvcmF0aW9ucy9Db2xvclpvbmVTdG9yZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL2RlY29yYXRpb25zL092ZXJ2aWV3UnVsZXJSZW5kZXJlci50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL2lucHV0L0NvbXBvc2l0aW9uSGVscGVyLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvaW5wdXQvTW91c2UudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9pbnB1dC9Nb3ZlVG9DZWxsLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvZG9tL0RvbVJlbmRlcmVyLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvZG9tL0RvbVJlbmRlcmVyUm93RmFjdG9yeS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3JlbmRlcmVyL2RvbS9XaWR0aENhY2hlLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NvbnN0YW50cy50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1NlbGVjdGlvblJlbmRlck1vZGVsLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VsZWN0aW9uL1NlbGVjdGlvbk1vZGVsLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VydmljZXMvQ2hhclNpemVTZXJ2aWNlLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VydmljZXMvQ2hhcmFjdGVySm9pbmVyU2VydmljZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3NlcnZpY2VzL0NvcmVCcm93c2VyU2VydmljZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3NlcnZpY2VzL0xpbmtQcm92aWRlclNlcnZpY2UudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9zZXJ2aWNlcy9Nb3VzZVNlcnZpY2UudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvYnJvd3Nlci9zZXJ2aWNlcy9SZW5kZXJTZXJ2aWNlLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VydmljZXMvU2VsZWN0aW9uU2VydmljZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VydmljZXMvVGhlbWVTZXJ2aWNlLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9DaXJjdWxhckxpc3QudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL0Nsb25lLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9Db2xvci50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vQ29yZVRlcm1pbmFsLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9FdmVudEVtaXR0ZXIudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL0lucHV0SGFuZGxlci50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vTGlmZWN5Y2xlLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9NdWx0aUtleU1hcC50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vUGxhdGZvcm0udHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL1NvcnRlZExpc3QudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL1Rhc2tRdWV1ZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vV2luZG93c01vZGUudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9idWZmZXIvQnVmZmVyLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9idWZmZXIvQnVmZmVyTGluZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vYnVmZmVyL0J1ZmZlclJhbmdlLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9idWZmZXIvQnVmZmVyUmVmbG93LnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9idWZmZXIvQnVmZmVyU2V0LnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9idWZmZXIvQ2VsbERhdGEudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL2J1ZmZlci9Db25zdGFudHMudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL2J1ZmZlci9NYXJrZXIudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL2RhdGEvQ2hhcnNldHMudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL2RhdGEvRXNjYXBlU2VxdWVuY2VzLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9pbnB1dC9LZXlib2FyZC50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vaW5wdXQvVGV4dERlY29kZXIudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL2lucHV0L1VuaWNvZGVWNi50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vaW5wdXQvV3JpdGVCdWZmZXIudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL2lucHV0L1hQYXJzZUNvbG9yLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wYXJzZXIvQ29uc3RhbnRzLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wYXJzZXIvRGNzUGFyc2VyLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wYXJzZXIvRXNjYXBlU2VxdWVuY2VQYXJzZXIudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL3BhcnNlci9Pc2NQYXJzZXIudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL3BhcnNlci9QYXJhbXMudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL3B1YmxpYy9BZGRvbk1hbmFnZXIudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL3B1YmxpYy9CdWZmZXJBcGlWaWV3LnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wdWJsaWMvQnVmZmVyTGluZUFwaVZpZXcudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL3B1YmxpYy9CdWZmZXJOYW1lc3BhY2VBcGkudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL3B1YmxpYy9QYXJzZXJBcGkudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL3B1YmxpYy9Vbmljb2RlQXBpLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9CdWZmZXJTZXJ2aWNlLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9DaGFyc2V0U2VydmljZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvQ29yZU1vdXNlU2VydmljZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvQ29yZVNlcnZpY2UudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL3NlcnZpY2VzL0RlY29yYXRpb25TZXJ2aWNlLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9JbnN0YW50aWF0aW9uU2VydmljZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvTG9nU2VydmljZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvT3B0aW9uc1NlcnZpY2UudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL3NlcnZpY2VzL09zY0xpbmtTZXJ2aWNlLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCAid2VicGFjazovL0B4dGVybS94dGVybS9zcmMvY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzLnRzIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9Vbmljb2RlU2VydmljZS50cyIsICJ3ZWJwYWNrOi8vQHh0ZXJtL3h0ZXJtL3dlYnBhY2svYm9vdHN0cmFwIiwgIndlYnBhY2s6Ly9AeHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvcHVibGljL1Rlcm1pbmFsLnRzIiwgIndlYnBhY2s6Ly9GaXRBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCAid2VicGFjazovL0ZpdEFkZG9uL3NyYy9GaXRBZGRvbi50cyIsICJ3ZWJwYWNrOi8vV2ViTGlua3NBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCAid2VicGFjazovL1dlYkxpbmtzQWRkb24vc3JjL1dlYkxpbmtQcm92aWRlci50cyIsICJ3ZWJwYWNrOi8vV2ViTGlua3NBZGRvbi93ZWJwYWNrL2Jvb3RzdHJhcCIsICJ3ZWJwYWNrOi8vV2ViTGlua3NBZGRvbi9zcmMvV2ViTGlua3NBZGRvbi50cyIsICJ3ZWJwYWNrOi8vU2VhcmNoQWRkb24vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwgIndlYnBhY2s6Ly9TZWFyY2hBZGRvbi9zcmMvY29tbW9uL0V2ZW50RW1pdHRlci50cyIsICJ3ZWJwYWNrOi8vU2VhcmNoQWRkb24vc3JjL2NvbW1vbi9MaWZlY3ljbGUudHMiLCAid2VicGFjazovL1NlYXJjaEFkZG9uL3dlYnBhY2svYm9vdHN0cmFwIiwgIndlYnBhY2s6Ly9TZWFyY2hBZGRvbi9zcmMvU2VhcmNoQWRkb24udHMiLCAid2VicGFjazovL1VuaWNvZGUxMUFkZG9uL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsICJ3ZWJwYWNrOi8vVW5pY29kZTExQWRkb24vc3JjL1VuaWNvZGVWMTEudHMiLCAid2VicGFjazovL1VuaWNvZGUxMUFkZG9uL3NyYy9jb21tb24vRXZlbnRFbWl0dGVyLnRzIiwgIndlYnBhY2s6Ly9Vbmljb2RlMTFBZGRvbi9zcmMvY29tbW9uL2lucHV0L1VuaWNvZGVWNi50cyIsICJ3ZWJwYWNrOi8vVW5pY29kZTExQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9Vbmljb2RlU2VydmljZS50cyIsICJ3ZWJwYWNrOi8vVW5pY29kZTExQWRkb24vd2VicGFjay9ib290c3RyYXAiLCAid2VicGFjazovL1VuaWNvZGUxMUFkZG9uL3NyYy9Vbmljb2RlMTFBZGRvbi50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL0dseXBoUmVuZGVyZXIudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL1JlY3RhbmdsZVJlbmRlcmVyLnRzIiwgIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9SZW5kZXJNb2RlbC50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvV2ViZ2xSZW5kZXJlci50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvV2ViZ2xVdGlscy50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvcmVuZGVyTGF5ZXIvQmFzZVJlbmRlckxheWVyLnRzIiwgIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9yZW5kZXJMYXllci9MaW5rUmVuZGVyTGF5ZXIudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2Jyb3dzZXIvTGlmZWN5Y2xlLnRzIiwgIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DZWxsQ29sb3JSZXNvbHZlci50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ2hhckF0bGFzQ2FjaGUudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NoYXJBdGxhc1V0aWxzLnRzIiwgIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9Db25zdGFudHMudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnRzIiwgIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DdXN0b21HbHlwaHMudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0RldmljZVBpeGVsT2JzZXJ2ZXIudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1NlbGVjdGlvblJlbmRlck1vZGVsLnRzIiwgIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9icm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UZXh0dXJlQXRsYXMudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2NvbW1vbi9Db2xvci50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL0V2ZW50RW1pdHRlci50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL0xpZmVjeWNsZS50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL011bHRpS2V5TWFwLnRzIiwgIndlYnBhY2s6Ly9XZWJnbEFkZG9uL3NyYy9jb21tb24vUGxhdGZvcm0udHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2NvbW1vbi9UYXNrUXVldWUudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YS50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL2J1ZmZlci9DZWxsRGF0YS50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL2J1ZmZlci9Db25zdGFudHMudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2NvbW1vbi9pbnB1dC9UZXh0RGVjb2Rlci50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvY29tbW9uL3NlcnZpY2VzL0xvZ1NlcnZpY2UudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCAid2VicGFjazovL1dlYmdsQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcy50cyIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi93ZWJwYWNrL2Jvb3RzdHJhcCIsICJ3ZWJwYWNrOi8vV2ViZ2xBZGRvbi9zcmMvV2ViZ2xBZGRvbi50cyIsICIuLi90ZXJtaW5hbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIHtcblx0XHR2YXIgYSA9IGZhY3RvcnkoKTtcblx0XHRmb3IodmFyIGkgaW4gYSkgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyA/IGV4cG9ydHMgOiByb290KVtpXSA9IGFbaV07XG5cdH1cbn0pKGdsb2JhbFRoaXMsICgpID0+IHtcbnJldHVybiAiLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgKiBhcyBTdHJpbmdzIGZyb20gJ2Jyb3dzZXIvTG9jYWxpemFibGVTdHJpbmdzJztcbmltcG9ydCB7IElUZXJtaW5hbCwgSVJlbmRlckRlYm91bmNlciB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgVGltZUJhc2VkRGVib3VuY2VyIH0gZnJvbSAnYnJvd3Nlci9UaW1lQmFzZWREZWJvdW5jZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUJ1ZmZlciB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgSUluc3RhbnRpYXRpb25TZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciB9IGZyb20gJ2Jyb3dzZXIvTGlmZWN5Y2xlJztcblxuY29uc3QgTUFYX1JPV1NfVE9fUkVBRCA9IDIwO1xuXG5jb25zdCBlbnVtIEJvdW5kYXJ5UG9zaXRpb24ge1xuICBUT1AsXG4gIEJPVFRPTVxufVxuXG4vLyBUdXJuIHRoaXMgb24gdG8gdW5oaWRlIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUgYW5kIGRpc3BsYXkgaXQgdW5kZXJcbi8vIChpbnN0ZWFkIG9mIG92ZXJsYXBwaW5nIHdpdGgpIHRoZSB0ZXJtaW5hbC5cbmNvbnN0IERFQlVHID0gZmFsc2U7XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NpYmlsaXR5TWFuYWdlciBleHRlbmRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIF9kZWJ1Z1Jvb3RDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcblxuICBwcml2YXRlIF9yb3dDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9yb3dFbGVtZW50czogSFRNTEVsZW1lbnRbXTtcbiAgcHJpdmF0ZSBfcm93Q29sdW1uczogV2Vha01hcDxIVE1MRWxlbWVudCwgbnVtYmVyW10+ID0gbmV3IFdlYWtNYXAoKTtcblxuICBwcml2YXRlIF9saXZlUmVnaW9uOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfbGl2ZVJlZ2lvbkxpbmVDb3VudDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGl2ZVJlZ2lvbkRlYm91bmNlcjogSVJlbmRlckRlYm91bmNlcjtcblxuICBwcml2YXRlIF90b3BCb3VuZGFyeUZvY3VzTGlzdGVuZXI6IChlOiBGb2N1c0V2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIF9ib3R0b21Cb3VuZGFyeUZvY3VzTGlzdGVuZXI6IChlOiBGb2N1c0V2ZW50KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGlzIHF1ZXVlIGhhcyBhIGNoYXJhY3RlciBwdXNoZWQgdG8gaXQgZm9yIGtleXMgdGhhdCBhcmUgcHJlc3NlZCwgaWYgdGhlXG4gICAqIG5leHQgY2hhcmFjdGVyIGFkZGVkIHRvIHRoZSB0ZXJtaW5hbCBpcyBlcXVhbCB0byB0aGUga2V5IGNoYXIgdGhlbiBpdCBpc1xuICAgKiBub3QgYW5ub3VuY2VkIChhZGRlZCB0byBsaXZlIHJlZ2lvbikgYmVjYXVzZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGFubm91bmNlZFxuICAgKiBieSB0aGUgdGV4dGFyZWEgZXZlbnQgKHdoaWNoIGNhbm5vdCBiZSBjYW5jZWxlZCkuIFRoZXJlIGFyZSBzb21lIHJhY2VcbiAgICogY29uZGl0aW9uIGNhc2VzIGlmIHRoZXJlIGlzIHR5cGluZyB3aGlsZSBkYXRhIGlzIHN0cmVhbWluZywgYnV0IHRoaXMgY292ZXJzXG4gICAqIHRoZSBtYWluIGNhc2Ugb2YgdHlwaW5nIGludG8gdGhlIHByb21wdCBhbmQgaW5wdXR0aW5nIHRoZSBhbnN3ZXIgdG8gYVxuICAgKiBxdWVzdGlvbiAoWS9OLCBldGMuKS5cbiAgICovXG4gIHByaXZhdGUgX2NoYXJzVG9Db25zdW1lOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHByaXZhdGUgX2NoYXJzVG9Bbm5vdW5jZTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IElUZXJtaW5hbCxcbiAgICBASUluc3RhbnRpYXRpb25TZXJ2aWNlIGluc3RhbnRpYXRpb25TZXJ2aWNlOiBJSW5zdGFudGlhdGlvblNlcnZpY2UsXG4gICAgQElDb3JlQnJvd3NlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIEBJUmVuZGVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UubWFpbkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIuY2xhc3NMaXN0LmFkZCgneHRlcm0tYWNjZXNzaWJpbGl0eScpO1xuXG4gICAgdGhpcy5fcm93Q29udGFpbmVyID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLl9yb3dDb250YWluZXIuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2xpc3QnKTtcbiAgICB0aGlzLl9yb3dDb250YWluZXIuY2xhc3NMaXN0LmFkZCgneHRlcm0tYWNjZXNzaWJpbGl0eS10cmVlJyk7XG4gICAgdGhpcy5fcm93RWxlbWVudHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3Rlcm1pbmFsLnJvd3M7IGkrKykge1xuICAgICAgdGhpcy5fcm93RWxlbWVudHNbaV0gPSB0aGlzLl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUoKTtcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9yb3dFbGVtZW50c1tpXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdG9wQm91bmRhcnlGb2N1c0xpc3RlbmVyID0gZSA9PiB0aGlzLl9oYW5kbGVCb3VuZGFyeUZvY3VzKGUsIEJvdW5kYXJ5UG9zaXRpb24uVE9QKTtcbiAgICB0aGlzLl9ib3R0b21Cb3VuZGFyeUZvY3VzTGlzdGVuZXIgPSBlID0+IHRoaXMuX2hhbmRsZUJvdW5kYXJ5Rm9jdXMoZSwgQm91bmRhcnlQb3NpdGlvbi5CT1RUT00pO1xuICAgIHRoaXMuX3Jvd0VsZW1lbnRzWzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fdG9wQm91bmRhcnlGb2N1c0xpc3RlbmVyKTtcbiAgICB0aGlzLl9yb3dFbGVtZW50c1t0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggLSAxXS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX2JvdHRvbUJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcik7XG5cbiAgICB0aGlzLl9yZWZyZXNoUm93c0RpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX3Jvd0NvbnRhaW5lcik7XG5cbiAgICB0aGlzLl9saXZlUmVnaW9uID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLl9saXZlUmVnaW9uLmNsYXNzTGlzdC5hZGQoJ2xpdmUtcmVnaW9uJyk7XG4gICAgdGhpcy5fbGl2ZVJlZ2lvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsICdhc3NlcnRpdmUnKTtcbiAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2xpdmVSZWdpb24pO1xuICAgIHRoaXMuX2xpdmVSZWdpb25EZWJvdW5jZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBUaW1lQmFzZWREZWJvdW5jZXIodGhpcy5fcmVuZGVyUm93cy5iaW5kKHRoaXMpKSk7XG5cbiAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsLmVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGVuYWJsZSBhY2Nlc3NpYmlsaXR5IGJlZm9yZSBUZXJtaW5hbC5vcGVuJyk7XG4gICAgfVxuXG4gICAgaWYgKERFQlVHKSB7XG4gICAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2RlYnVnJyk7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZGVidWcnKTtcblxuICAgICAgLy8gVXNlIGEgYDxkaXYgY2xhc3M9XCJ4dGVybVwiPmAgY29udGFpbmVyIHNvIHRoYXQgdGhlIGNzcyB3aWxsIHN0aWxsIGFwcGx5LlxuICAgICAgdGhpcy5fZGVidWdSb290Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLl9kZWJ1Z1Jvb3RDb250YWluZXIuY2xhc3NMaXN0LmFkZCgneHRlcm0nKTtcblxuICAgICAgdGhpcy5fZGVidWdSb290Q29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCctLS0tLS1zdGFydCBhMTF5LS0tLS0tJykpO1xuICAgICAgdGhpcy5fZGVidWdSb290Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIpO1xuICAgICAgdGhpcy5fZGVidWdSb290Q29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCctLS0tLS1lbmQgYTExeS0tLS0tLScpKTtcblxuICAgICAgdGhpcy5fdGVybWluYWwuZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGhpcy5fZGVidWdSb290Q29udGFpbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGVybWluYWwuZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyYmVnaW4nLCB0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3Rlcm1pbmFsLm9uUmVzaXplKGUgPT4gdGhpcy5faGFuZGxlUmVzaXplKGUucm93cykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3Rlcm1pbmFsLm9uUmVuZGVyKGUgPT4gdGhpcy5fcmVmcmVzaFJvd3MoZS5zdGFydCwgZS5lbmQpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vblNjcm9sbCgoKSA9PiB0aGlzLl9yZWZyZXNoUm93cygpKSk7XG4gICAgLy8gTGluZSBmZWVkIGlzIGFuIGlzc3VlIGFzIHRoZSBwcm9tcHQgd29uJ3QgYmUgcmVhZCBvdXQgYWZ0ZXIgYSBjb21tYW5kIGlzIHJ1blxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGVybWluYWwub25BMTF5Q2hhcihjaGFyID0+IHRoaXMuX2hhbmRsZUNoYXIoY2hhcikpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3Rlcm1pbmFsLm9uTGluZUZlZWQoKCkgPT4gdGhpcy5faGFuZGxlQ2hhcignXFxuJykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3Rlcm1pbmFsLm9uQTExeVRhYihzcGFjZUNvdW50ID0+IHRoaXMuX2hhbmRsZVRhYihzcGFjZUNvdW50KSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGVybWluYWwub25LZXkoZSA9PiB0aGlzLl9oYW5kbGVLZXkoZS5rZXkpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vbkJsdXIoKCkgPT4gdGhpcy5fY2xlYXJMaXZlUmVnaW9uKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3JlbmRlclNlcnZpY2Uub25EaW1lbnNpb25zQ2hhbmdlKCgpID0+IHRoaXMuX3JlZnJlc2hSb3dzRGltZW5zaW9ucygpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIoZG9jdW1lbnQsICdzZWxlY3Rpb25jaGFuZ2UnLCAoKSA9PiB0aGlzLl9oYW5kbGVTZWxlY3Rpb25DaGFuZ2UoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm9uRHByQ2hhbmdlKCgpID0+IHRoaXMuX3JlZnJlc2hSb3dzRGltZW5zaW9ucygpKSk7XG5cbiAgICB0aGlzLl9yZWZyZXNoUm93cygpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgIGlmIChERUJVRykge1xuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RDb250YWluZXIhLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fYWNjZXNzaWJpbGl0eUNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aCA9IDA7XG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlVGFiKHNwYWNlQ291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhY2VDb3VudDsgaSsrKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDaGFyKCcgJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ2hhcihjaGFyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbGl2ZVJlZ2lvbkxpbmVDb3VudCA8IE1BWF9ST1dTX1RPX1JFQUQgKyAxKSB7XG4gICAgICBpZiAodGhpcy5fY2hhcnNUb0NvbnN1bWUubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBIYXZlIHRoZSBzY3JlZW4gcmVhZGVyIGlnbm9yZSB0aGUgY2hhciBpZiBpdCB3YXMganVzdCBpbnB1dFxuICAgICAgICBjb25zdCBzaGlmdGVkQ2hhciA9IHRoaXMuX2NoYXJzVG9Db25zdW1lLnNoaWZ0KCk7XG4gICAgICAgIGlmIChzaGlmdGVkQ2hhciAhPT0gY2hhcikge1xuICAgICAgICAgIHRoaXMuX2NoYXJzVG9Bbm5vdW5jZSArPSBjaGFyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jaGFyc1RvQW5ub3VuY2UgKz0gY2hhcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcXG4nKSB7XG4gICAgICAgIHRoaXMuX2xpdmVSZWdpb25MaW5lQ291bnQrKztcbiAgICAgICAgaWYgKHRoaXMuX2xpdmVSZWdpb25MaW5lQ291bnQgPT09IE1BWF9ST1dTX1RPX1JFQUQgKyAxKSB7XG4gICAgICAgICAgdGhpcy5fbGl2ZVJlZ2lvbi50ZXh0Q29udGVudCArPSBTdHJpbmdzLnRvb011Y2hPdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGVhckxpdmVSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fbGl2ZVJlZ2lvbi50ZXh0Q29udGVudCA9ICcnO1xuICAgIHRoaXMuX2xpdmVSZWdpb25MaW5lQ291bnQgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlS2V5KGtleUNoYXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFyTGl2ZVJlZ2lvbigpO1xuICAgIC8vIE9ubHkgYWRkIHRoZSBjaGFyIGlmIHRoZXJlIGlzIG5vIGNvbnRyb2wgY2hhcmFjdGVyLlxuICAgIGlmICghL1xccHtDb250cm9sfS91LnRlc3Qoa2V5Q2hhcikpIHtcbiAgICAgIHRoaXMuX2NoYXJzVG9Db25zdW1lLnB1c2goa2V5Q2hhcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaFJvd3Moc3RhcnQ/OiBudW1iZXIsIGVuZD86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2xpdmVSZWdpb25EZWJvdW5jZXIucmVmcmVzaChzdGFydCwgZW5kLCB0aGlzLl90ZXJtaW5hbC5yb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlclJvd3Moc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXI6IElCdWZmZXIgPSB0aGlzLl90ZXJtaW5hbC5idWZmZXI7XG4gICAgY29uc3Qgc2V0U2l6ZSA9IGJ1ZmZlci5saW5lcy5sZW5ndGgudG9TdHJpbmcoKTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBidWZmZXIubGluZXMuZ2V0KGJ1ZmZlci55ZGlzcCArIGkpO1xuICAgICAgY29uc3QgY29sdW1uczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGxpbmVEYXRhID0gbGluZT8udHJhbnNsYXRlVG9TdHJpbmcodHJ1ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbHVtbnMpIHx8ICcnO1xuICAgICAgY29uc3QgcG9zSW5TZXQgPSAoYnVmZmVyLnlkaXNwICsgaSArIDEpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fcm93RWxlbWVudHNbaV07XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBpZiAobGluZURhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWxlbWVudC5pbm5lclRleHQgPSAnXFx1MDBhMCc7XG4gICAgICAgICAgdGhpcy5fcm93Q29sdW1ucy5zZXQoZWxlbWVudCwgWzAsIDFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gbGluZURhdGE7XG4gICAgICAgICAgdGhpcy5fcm93Q29sdW1ucy5zZXQoZWxlbWVudCwgY29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcG9zaW5zZXQnLCBwb3NJblNldCk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXNldHNpemUnLCBzZXRTaXplKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYW5ub3VuY2VDaGFyYWN0ZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIF9hbm5vdW5jZUNoYXJhY3RlcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NoYXJzVG9Bbm5vdW5jZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbGl2ZVJlZ2lvbi50ZXh0Q29udGVudCArPSB0aGlzLl9jaGFyc1RvQW5ub3VuY2U7XG4gICAgdGhpcy5fY2hhcnNUb0Fubm91bmNlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVCb3VuZGFyeUZvY3VzKGU6IEZvY3VzRXZlbnQsIHBvc2l0aW9uOiBCb3VuZGFyeVBvc2l0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgYm91bmRhcnlFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgYmVmb3JlQm91bmRhcnlFbGVtZW50ID0gdGhpcy5fcm93RWxlbWVudHNbcG9zaXRpb24gPT09IEJvdW5kYXJ5UG9zaXRpb24uVE9QID8gMSA6IHRoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aCAtIDJdO1xuXG4gICAgLy8gRG9uJ3Qgc2Nyb2xsIGlmIHRoZSBidWZmZXIgdG9wIGhhcyByZWFjaGVkIHRoZSBlbmQgaW4gdGhhdCBkaXJlY3Rpb25cbiAgICBjb25zdCBwb3NJblNldCA9IGJvdW5kYXJ5RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtcG9zaW5zZXQnKTtcbiAgICBjb25zdCBsYXN0Um93UG9zID0gcG9zaXRpb24gPT09IEJvdW5kYXJ5UG9zaXRpb24uVE9QID8gJzEnIDogYCR7dGhpcy5fdGVybWluYWwuYnVmZmVyLmxpbmVzLmxlbmd0aH1gO1xuICAgIGlmIChwb3NJblNldCA9PT0gbGFzdFJvd1Bvcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvbid0IHNjcm9sbCB3aGVuIHRoZSBsYXN0IGZvY3VzZWQgaXRlbSB3YXMgbm90IHRoZSBzZWNvbmQgcm93IChmb2N1cyBpcyBnb2luZyB0aGUgb3RoZXJcbiAgICAvLyBkaXJlY3Rpb24pXG4gICAgaWYgKGUucmVsYXRlZFRhcmdldCAhPT0gYmVmb3JlQm91bmRhcnlFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIG9sZCBib3VuZGFyeSBlbGVtZW50IGZyb20gYXJyYXlcbiAgICBsZXQgdG9wQm91bmRhcnlFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBsZXQgYm90dG9tQm91bmRhcnlFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBpZiAocG9zaXRpb24gPT09IEJvdW5kYXJ5UG9zaXRpb24uVE9QKSB7XG4gICAgICB0b3BCb3VuZGFyeUVsZW1lbnQgPSBib3VuZGFyeUVsZW1lbnQ7XG4gICAgICBib3R0b21Cb3VuZGFyeUVsZW1lbnQgPSB0aGlzLl9yb3dFbGVtZW50cy5wb3AoKSE7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIucmVtb3ZlQ2hpbGQoYm90dG9tQm91bmRhcnlFbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9wQm91bmRhcnlFbGVtZW50ID0gdGhpcy5fcm93RWxlbWVudHMuc2hpZnQoKSE7XG4gICAgICBib3R0b21Cb3VuZGFyeUVsZW1lbnQgPSBib3VuZGFyeUVsZW1lbnQ7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIucmVtb3ZlQ2hpbGQodG9wQm91bmRhcnlFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgbGlzdGVuZXJzIGZyb20gb2xkIGJvdW5kYXJ5IGVsZW1lbnRzXG4gICAgdG9wQm91bmRhcnlFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fdG9wQm91bmRhcnlGb2N1c0xpc3RlbmVyKTtcbiAgICBib3R0b21Cb3VuZGFyeUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLl9ib3R0b21Cb3VuZGFyeUZvY3VzTGlzdGVuZXIpO1xuXG4gICAgLy8gQWRkIG5ldyBlbGVtZW50IHRvIGFycmF5L0RPTVxuICAgIGlmIChwb3NpdGlvbiA9PT0gQm91bmRhcnlQb3NpdGlvbi5UT1ApIHtcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB0aGlzLl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUoKTtcbiAgICAgIHRoaXMuX3Jvd0VsZW1lbnRzLnVuc2hpZnQobmV3RWxlbWVudCk7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmJlZ2luJywgbmV3RWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB0aGlzLl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUoKTtcbiAgICAgIHRoaXMuX3Jvd0VsZW1lbnRzLnB1c2gobmV3RWxlbWVudCk7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGxpc3RlbmVycyB0byBuZXcgYm91bmRhcnkgZWxlbWVudHNcbiAgICB0aGlzLl9yb3dFbGVtZW50c1swXS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX3RvcEJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcik7XG4gICAgdGhpcy5fcm93RWxlbWVudHNbdGhpcy5fcm93RWxlbWVudHMubGVuZ3RoIC0gMV0uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLl9ib3R0b21Cb3VuZGFyeUZvY3VzTGlzdGVuZXIpO1xuXG4gICAgLy8gU2Nyb2xsIHVwXG4gICAgdGhpcy5fdGVybWluYWwuc2Nyb2xsTGluZXMocG9zaXRpb24gPT09IEJvdW5kYXJ5UG9zaXRpb24uVE9QID8gLTEgOiAxKTtcblxuICAgIC8vIEZvY3VzIG5ldyBib3VuZGFyeSBiZWZvcmUgZWxlbWVudFxuICAgIHRoaXMuX3Jvd0VsZW1lbnRzW3Bvc2l0aW9uID09PSBCb3VuZGFyeVBvc2l0aW9uLlRPUCA/IDEgOiB0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggLSAyXS5mb2N1cygpO1xuXG4gICAgLy8gUHJldmVudCB0aGUgc3RhbmRhcmQgYmVoYXZpb3JcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVNlbGVjdGlvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcm93RWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0aW9uLmlzQ29sbGFwc2VkKSB7XG4gICAgICAvLyBPbmx5IGRvIHNvbWV0aGluZyB3aGVuIHRoZSBhbmNob3JOb2RlIGlzIGluc2lkZSB0aGUgcm93IGNvbnRhaW5lci4gVGhpc1xuICAgICAgLy8gYmVoYXZpb3IgbWlycm9ycyB3aGF0IHdlIGRvIHdpdGggbW91c2UgLS0tIGlmIHRoZSBtb3VzZSBjbGlja3NcbiAgICAgIC8vIHNvbWV3aGVyZSBvdXRzaWRlIG9mIHRoZSB0ZXJtaW5hbCwgd2UgZG9uJ3QgY2xlYXIgdGhlIHNlbGVjdGlvbi5cbiAgICAgIGlmICh0aGlzLl9yb3dDb250YWluZXIuY29udGFpbnMoc2VsZWN0aW9uLmFuY2hvck5vZGUpKSB7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFzZWxlY3Rpb24uYW5jaG9yTm9kZSB8fCAhc2VsZWN0aW9uLmZvY3VzTm9kZSkge1xuICAgICAgY29uc29sZS5lcnJvcignYW5jaG9yTm9kZSBhbmQvb3IgZm9jdXNOb2RlIGFyZSBudWxsJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU29ydCB0aGUgdHdvIHNlbGVjdGlvbiBwb2ludHMgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgbGV0IGJlZ2luID0geyBub2RlOiBzZWxlY3Rpb24uYW5jaG9yTm9kZSwgb2Zmc2V0OiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0IH07XG4gICAgbGV0IGVuZCA9IHsgbm9kZTogc2VsZWN0aW9uLmZvY3VzTm9kZSwgb2Zmc2V0OiBzZWxlY3Rpb24uZm9jdXNPZmZzZXQgfTtcbiAgICBpZiAoKGJlZ2luLm5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZW5kLm5vZGUpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHx8IChiZWdpbi5ub2RlID09PSBlbmQubm9kZSAmJiBiZWdpbi5vZmZzZXQgPiBlbmQub2Zmc2V0KSApIHtcbiAgICAgIFtiZWdpbiwgZW5kXSA9IFtlbmQsIGJlZ2luXTtcbiAgICB9XG5cbiAgICAvLyBDbGFtcCBiZWdpbi9lbmQgdG8gdGhlIGluc2lkZSBvZiB0aGUgcm93IGNvbnRhaW5lci5cbiAgICBpZiAoYmVnaW4ubm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLl9yb3dFbGVtZW50c1swXSkgJiAoTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkgfCBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykpIHtcbiAgICAgIGJlZ2luID0geyBub2RlOiB0aGlzLl9yb3dFbGVtZW50c1swXS5jaGlsZE5vZGVzWzBdLCBvZmZzZXQ6IDAgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9yb3dDb250YWluZXIuY29udGFpbnMoYmVnaW4ubm9kZSkpIHtcbiAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIGBiZWdpbmAgaXMgYmVsb3cgdGhlIGxhc3Qgcm93LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0Um93RWxlbWVudCA9IHRoaXMuX3Jvd0VsZW1lbnRzLnNsaWNlKC0xKVswXTtcbiAgICBpZiAoZW5kLm5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obGFzdFJvd0VsZW1lbnQpICYgKE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZIHwgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpKSB7XG4gICAgICBlbmQgPSB7XG4gICAgICAgIG5vZGU6IGxhc3RSb3dFbGVtZW50LFxuICAgICAgICBvZmZzZXQ6IGxhc3RSb3dFbGVtZW50LnRleHRDb250ZW50Py5sZW5ndGggPz8gMFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9yb3dDb250YWluZXIuY29udGFpbnMoZW5kLm5vZGUpKSB7XG4gICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBgZW5kYCBpcyBhYm92ZSB0aGUgZmlyc3Qgcm93LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRvUm93Q29sdW1uID0gKHsgbm9kZSwgb2Zmc2V0IH06IHR5cGVvZiBiZWdpbik6IHtyb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9IHwgbnVsbCA9PiB7XG4gICAgICAvLyBgbm9kZWAgaXMgZWl0aGVyIHRoZSByb3cgZWxlbWVudCBvciB0aGUgVGV4dCBub2RlIGluc2lkZSBpdC5cbiAgICAgIGNvbnN0IHJvd0VsZW1lbnQ6IGFueSA9IG5vZGUgaW5zdGFuY2VvZiBUZXh0ID8gbm9kZS5wYXJlbnROb2RlIDogbm9kZTtcbiAgICAgIGxldCByb3cgPSBwYXJzZUludChyb3dFbGVtZW50Py5nZXRBdHRyaWJ1dGUoJ2FyaWEtcG9zaW5zZXQnKSwgMTApIC0gMTtcbiAgICAgIGlmIChpc05hTihyb3cpKSB7XG4gICAgICAgIGNvbnNvbGUud2Fybigncm93IGlzIGludmFsaWQuIFJhY2UgY29uZGl0aW9uPycpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuX3Jvd0NvbHVtbnMuZ2V0KHJvd0VsZW1lbnQpO1xuICAgICAgaWYgKCFjb2x1bW5zKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignY29sdW1ucyBpcyBudWxsLiBSYWNlIGNvbmRpdGlvbj8nKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGxldCBjb2x1bW4gPSBvZmZzZXQgPCBjb2x1bW5zLmxlbmd0aCA/IGNvbHVtbnNbb2Zmc2V0XSA6IGNvbHVtbnMuc2xpY2UoLTEpWzBdICsgMTtcbiAgICAgIGlmIChjb2x1bW4gPj0gdGhpcy5fdGVybWluYWwuY29scykge1xuICAgICAgICArK3JvdztcbiAgICAgICAgY29sdW1uID0gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJvdyxcbiAgICAgICAgY29sdW1uXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBiZWdpblJvd0NvbHVtbiA9IHRvUm93Q29sdW1uKGJlZ2luKTtcbiAgICBjb25zdCBlbmRSb3dDb2x1bW4gPSB0b1Jvd0NvbHVtbihlbmQpO1xuXG4gICAgaWYgKCFiZWdpblJvd0NvbHVtbiB8fCAhZW5kUm93Q29sdW1uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGJlZ2luUm93Q29sdW1uLnJvdyA+IGVuZFJvd0NvbHVtbi5yb3cgfHwgKGJlZ2luUm93Q29sdW1uLnJvdyA9PT0gZW5kUm93Q29sdW1uLnJvdyAmJiBiZWdpblJvd0NvbHVtbi5jb2x1bW4gPj0gZW5kUm93Q29sdW1uLmNvbHVtbikpIHtcbiAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIHdlIGhhdmUgc29tZSBidWdzLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJhbmdlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fdGVybWluYWwuc2VsZWN0KFxuICAgICAgYmVnaW5Sb3dDb2x1bW4uY29sdW1uLFxuICAgICAgYmVnaW5Sb3dDb2x1bW4ucm93LFxuICAgICAgKGVuZFJvd0NvbHVtbi5yb3cgLSBiZWdpblJvd0NvbHVtbi5yb3cpICogdGhpcy5fdGVybWluYWwuY29scyAtIGJlZ2luUm93Q29sdW1uLmNvbHVtbiArIGVuZFJvd0NvbHVtbi5jb2x1bW5cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlUmVzaXplKHJvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBib3R0b20gYm91bmRhcnkgbGlzdGVuZXJcbiAgICB0aGlzLl9yb3dFbGVtZW50c1t0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggLSAxXS5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX2JvdHRvbUJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcik7XG5cbiAgICAvLyBHcm93IHJvd3MgYXMgcmVxdWlyZWRcbiAgICBmb3IgKGxldCBpID0gdGhpcy5fcm93Q29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aDsgaSA8IHRoaXMuX3Rlcm1pbmFsLnJvd3M7IGkrKykge1xuICAgICAgdGhpcy5fcm93RWxlbWVudHNbaV0gPSB0aGlzLl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUoKTtcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9yb3dFbGVtZW50c1tpXSk7XG4gICAgfVxuICAgIC8vIFNocmluayByb3dzIGFzIHJlcXVpcmVkXG4gICAgd2hpbGUgKHRoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aCA+IHJvd3MpIHtcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLl9yb3dFbGVtZW50cy5wb3AoKSEpO1xuICAgIH1cblxuICAgIC8vIEFkZCBib3R0b20gYm91bmRhcnkgbGlzdGVuZXJcbiAgICB0aGlzLl9yb3dFbGVtZW50c1t0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggLSAxXS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX2JvdHRvbUJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcik7XG5cbiAgICB0aGlzLl9yZWZyZXNoUm93c0RpbWVuc2lvbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUFjY2Vzc2liaWxpdHlUcmVlTm9kZSgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5tYWluRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnbGlzdGl0ZW0nKTtcbiAgICBlbGVtZW50LnRhYkluZGV4ID0gLTE7XG4gICAgdGhpcy5fcmVmcmVzaFJvd0RpbWVuc2lvbnMoZWxlbWVudCk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbiAgcHJpdmF0ZSBfcmVmcmVzaFJvd3NEaW1lbnNpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7dGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGh9cHhgO1xuICAgIGlmICh0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggIT09IHRoaXMuX3Rlcm1pbmFsLnJvd3MpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVJlc2l6ZSh0aGlzLl90ZXJtaW5hbC5yb3dzKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90ZXJtaW5hbC5yb3dzOyBpKyspIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hSb3dEaW1lbnNpb25zKHRoaXMuX3Jvd0VsZW1lbnRzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfcmVmcmVzaFJvd0RpbWVuc2lvbnMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3RoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNvcmVTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG4vKipcbiAqIFByZXBhcmVzIHRleHQgdG8gYmUgcGFzdGVkIGludG8gdGhlIHRlcm1pbmFsIGJ5IG5vcm1hbGl6aW5nIHRoZSBsaW5lIGVuZGluZ3NcbiAqIEBwYXJhbSB0ZXh0IFRoZSBwYXN0ZWQgdGV4dCB0aGF0IG5lZWRzIHByb2Nlc3NpbmcgYmVmb3JlIGluc2VydGluZyBpbnRvIHRoZSB0ZXJtaW5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVRleHRGb3JUZXJtaW5hbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHI/XFxuL2csICdcXHInKTtcbn1cblxuLyoqXG4gKiBCcmFja2V0IHRleHQgZm9yIHBhc3RlLCBpZiBuZWNlc3NhcnksIGFzIHBlciBodHRwczovL2NpcncuaW4vYmxvZy9icmFja2V0ZWQtcGFzdGVcbiAqIEBwYXJhbSB0ZXh0IFRoZSBwYXN0ZWQgdGV4dCB0byBicmFja2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicmFja2V0VGV4dEZvclBhc3RlKHRleHQ6IHN0cmluZywgYnJhY2tldGVkUGFzdGVNb2RlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGJyYWNrZXRlZFBhc3RlTW9kZSkge1xuICAgIHJldHVybiAnXFx4MWJbMjAwficgKyB0ZXh0ICsgJ1xceDFiWzIwMX4nO1xuICB9XG4gIHJldHVybiB0ZXh0O1xufVxuXG4vKipcbiAqIEJpbmRzIGNvcHkgZnVuY3Rpb25hbGl0eSB0byB0aGUgZ2l2ZW4gdGVybWluYWwuXG4gKiBAcGFyYW0gZXYgVGhlIG9yaWdpbmFsIGNvcHkgZXZlbnQgdG8gYmUgaGFuZGxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weUhhbmRsZXIoZXY6IENsaXBib2FyZEV2ZW50LCBzZWxlY3Rpb25TZXJ2aWNlOiBJU2VsZWN0aW9uU2VydmljZSk6IHZvaWQge1xuICBpZiAoZXYuY2xpcGJvYXJkRGF0YSkge1xuICAgIGV2LmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9wbGFpbicsIHNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uVGV4dCk7XG4gIH1cbiAgLy8gUHJldmVudCBvciB0aGUgb3JpZ2luYWwgdGV4dCB3aWxsIGJlIGNvcGllZC5cbiAgZXYucHJldmVudERlZmF1bHQoKTtcbn1cblxuLyoqXG4gKiBSZWRpcmVjdCB0aGUgY2xpcGJvYXJkJ3MgZGF0YSB0byB0aGUgdGVybWluYWwncyBpbnB1dCBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUGFzdGVFdmVudChldjogQ2xpcGJvYXJkRXZlbnQsIHRleHRhcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50LCBjb3JlU2VydmljZTogSUNvcmVTZXJ2aWNlLCBvcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlKTogdm9pZCB7XG4gIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICBpZiAoZXYuY2xpcGJvYXJkRGF0YSkge1xuICAgIGNvbnN0IHRleHQgPSBldi5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKTtcbiAgICBwYXN0ZSh0ZXh0LCB0ZXh0YXJlYSwgY29yZVNlcnZpY2UsIG9wdGlvbnNTZXJ2aWNlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFzdGUodGV4dDogc3RyaW5nLCB0ZXh0YXJlYTogSFRNTFRleHRBcmVhRWxlbWVudCwgY29yZVNlcnZpY2U6IElDb3JlU2VydmljZSwgb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSk6IHZvaWQge1xuICB0ZXh0ID0gcHJlcGFyZVRleHRGb3JUZXJtaW5hbCh0ZXh0KTtcbiAgdGV4dCA9IGJyYWNrZXRUZXh0Rm9yUGFzdGUodGV4dCwgY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmJyYWNrZXRlZFBhc3RlTW9kZSAmJiBvcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmlnbm9yZUJyYWNrZXRlZFBhc3RlTW9kZSAhPT0gdHJ1ZSk7XG4gIGNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQodGV4dCwgdHJ1ZSk7XG4gIHRleHRhcmVhLnZhbHVlID0gJyc7XG59XG5cbi8qKlxuICogTW92ZXMgdGhlIHRleHRhcmVhIHVuZGVyIHRoZSBtb3VzZSBjdXJzb3IgYW5kIGZvY3VzZXMgaXQuXG4gKiBAcGFyYW0gZXYgVGhlIG9yaWdpbmFsIHJpZ2h0IGNsaWNrIGV2ZW50IHRvIGJlIGhhbmRsZWQuXG4gKiBAcGFyYW0gdGV4dGFyZWEgVGhlIHRlcm1pbmFsJ3MgdGV4dGFyZWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlVGV4dEFyZWFVbmRlck1vdXNlQ3Vyc29yKGV2OiBNb3VzZUV2ZW50LCB0ZXh0YXJlYTogSFRNTFRleHRBcmVhRWxlbWVudCwgc2NyZWVuRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcblxuICAvLyBDYWxjdWxhdGUgdGV4dGFyZWEgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiBlbGVtZW50XG4gIGNvbnN0IHBvcyA9IHNjcmVlbkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IGxlZnQgPSBldi5jbGllbnRYIC0gcG9zLmxlZnQgLSAxMDtcbiAgY29uc3QgdG9wID0gZXYuY2xpZW50WSAtIHBvcy50b3AgLSAxMDtcblxuICAvLyBCcmluZyB0ZXh0YXJlYSBhdCB0aGUgY3Vyc29yIHBvc2l0aW9uXG4gIHRleHRhcmVhLnN0eWxlLndpZHRoID0gJzIwcHgnO1xuICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnMjBweCc7XG4gIHRleHRhcmVhLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgdGV4dGFyZWEuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgdGV4dGFyZWEuc3R5bGUuekluZGV4ID0gJzEwMDAnO1xuXG4gIHRleHRhcmVhLmZvY3VzKCk7XG59XG5cbi8qKlxuICogQmluZCB0byByaWdodC1jbGljayBldmVudCBhbmQgYWxsb3cgcmlnaHQtY2xpY2sgY29weSBhbmQgcGFzdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByaWdodENsaWNrSGFuZGxlcihldjogTW91c2VFdmVudCwgdGV4dGFyZWE6IEhUTUxUZXh0QXJlYUVsZW1lbnQsIHNjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzZWxlY3Rpb25TZXJ2aWNlOiBJU2VsZWN0aW9uU2VydmljZSwgc2hvdWxkU2VsZWN0V29yZDogYm9vbGVhbik6IHZvaWQge1xuICBtb3ZlVGV4dEFyZWFVbmRlck1vdXNlQ3Vyc29yKGV2LCB0ZXh0YXJlYSwgc2NyZWVuRWxlbWVudCk7XG5cbiAgaWYgKHNob3VsZFNlbGVjdFdvcmQpIHtcbiAgICBzZWxlY3Rpb25TZXJ2aWNlLnJpZ2h0Q2xpY2tTZWxlY3QoZXYpO1xuICB9XG5cbiAgLy8gR2V0IHRleHRhcmVhIHJlYWR5IHRvIGNvcHkgZnJvbSB0aGUgY29udGV4dCBtZW51XG4gIHRleHRhcmVhLnZhbHVlID0gc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb25UZXh0O1xuICB0ZXh0YXJlYS5zZWxlY3QoKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb2xvckNvbnRyYXN0Q2FjaGUgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBUd29LZXlNYXAgfSBmcm9tICdjb21tb24vTXVsdGlLZXlNYXAnO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JDb250cmFzdENhY2hlIGltcGxlbWVudHMgSUNvbG9yQ29udHJhc3RDYWNoZSB7XG4gIHByaXZhdGUgX2NvbG9yOiBUd29LZXlNYXA8LyogYmcgKi9udW1iZXIsIC8qIGZnICovbnVtYmVyLCBJQ29sb3IgfCBudWxsPiA9IG5ldyBUd29LZXlNYXAoKTtcbiAgcHJpdmF0ZSBfY3NzOiBUd29LZXlNYXA8LyogYmcgKi9udW1iZXIsIC8qIGZnICovbnVtYmVyLCBzdHJpbmcgfCBudWxsPiA9IG5ldyBUd29LZXlNYXAoKTtcblxuICBwdWJsaWMgc2V0Q3NzKGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fY3NzLnNldChiZywgZmcsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDc3MoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jc3MuZ2V0KGJnLCBmZyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29sb3IoYmc6IG51bWJlciwgZmc6IG51bWJlciwgdmFsdWU6IElDb2xvciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2xvci5zZXQoYmcsIGZnLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sb3IoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IElDb2xvciB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb2xvci5nZXQoYmcsIGZnKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2xvci5jbGVhcigpO1xuICAgIHRoaXMuX2Nzcy5jbGVhcigpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQWRkcyBhIGRpc3Bvc2FibGUgbGlzdGVuZXIgdG8gYSBub2RlIGluIHRoZSBET00sIHJldHVybmluZyB0aGUgZGlzcG9zYWJsZS5cbiAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGFkZCBhIGxpc3RlbmVyIHRvLlxuICogQHBhcmFtIHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBmb3IgdGhlIGxpc3RlbmVyLlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIGJvb2xlYW4gb3Igb3B0aW9ucyBvYmplY3QgdG8gcGFzcyBvbiB0byB0aGUgZXZlbnRcbiAqIGxpc3RlbmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKFxuICBub2RlOiBFbGVtZW50IHwgV2luZG93IHwgRG9jdW1lbnQsXG4gIHR5cGU6IHN0cmluZyxcbiAgaGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZCxcbiAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9uc1xuKTogSURpc3Bvc2FibGUge1xuICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gIGxldCBkaXNwb3NlZCA9IGZhbHNlO1xuICByZXR1cm4ge1xuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGlmIChkaXNwb3NlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkaXNwb3NlZCA9IHRydWU7XG4gICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgfVxuICB9O1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyIH0gZnJvbSAnYnJvd3Nlci9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSUJ1ZmZlckNlbGxQb3NpdGlvbiwgSUxpbmssIElMaW5rRGVjb3JhdGlvbnMsIElMaW5rV2l0aFN0YXRlLCBJTGlua2lmaWVyMiwgSUxpbmtpZmllckV2ZW50IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIGRpc3Bvc2VBcnJheSwgZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJTGlua1Byb3ZpZGVyU2VydmljZSwgSU1vdXNlU2VydmljZSwgSVJlbmRlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGNsYXNzIExpbmtpZmllciBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJTGlua2lmaWVyMiB7XG4gIHB1YmxpYyBnZXQgY3VycmVudExpbmsoKTogSUxpbmtXaXRoU3RhdGUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fY3VycmVudExpbms7IH1cbiAgcHJvdGVjdGVkIF9jdXJyZW50TGluazogSUxpbmtXaXRoU3RhdGUgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX21vdXNlRG93bkxpbms6IElMaW5rV2l0aFN0YXRlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9sYXN0TW91c2VFdmVudDogTW91c2VFdmVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbGlua0NhY2hlRGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10gPSBbXTtcbiAgcHJpdmF0ZSBfbGFzdEJ1ZmZlckNlbGw6IElCdWZmZXJDZWxsUG9zaXRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2lzTW91c2VPdXQ6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF93YXNSZXNpemVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2FjdGl2ZVByb3ZpZGVyUmVwbGllczogTWFwPE51bWJlciwgSUxpbmtXaXRoU3RhdGVbXSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2FjdGl2ZUxpbmU6IG51bWJlciA9IC0xO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uU2hvd0xpbmtVbmRlcmxpbmUgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SUxpbmtpZmllckV2ZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uU2hvd0xpbmtVbmRlcmxpbmUgPSB0aGlzLl9vblNob3dMaW5rVW5kZXJsaW5lLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkhpZGVMaW5rVW5kZXJsaW5lID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElMaW5raWZpZXJFdmVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkhpZGVMaW5rVW5kZXJsaW5lID0gdGhpcy5fb25IaWRlTGlua1VuZGVybGluZS5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBASU1vdXNlU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9tb3VzZVNlcnZpY2U6IElNb3VzZVNlcnZpY2UsXG4gICAgQElSZW5kZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlclNlcnZpY2U6IElSZW5kZXJTZXJ2aWNlLFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASUxpbmtQcm92aWRlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfbGlua1Byb3ZpZGVyU2VydmljZTogSUxpbmtQcm92aWRlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUodGhpcy5fbGlua0NhY2hlRGlzcG9zYWJsZXMpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLl9sYXN0TW91c2VFdmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIC8vIENsZWFyIG91dCBsaW5rIHByb3ZpZGVycyBhcyB0aGV5IGNvdWxkIGVhc2lseSBjYXVzZSBhbiBlbWJlZGRlciBtZW1vcnkgbGVha1xuICAgICAgdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzPy5jbGVhcigpO1xuICAgIH0pKTtcbiAgICAvLyBMaXN0ZW4gdG8gcmVzaXplIHRvIGNhdGNoIHRoZSBjYXNlIHdoZXJlIGl0J3MgcmVzaXplZCBhbmQgdGhlIGN1cnNvciBpcyBvdXQgb2YgdGhlIHZpZXdwb3J0LlxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fYnVmZmVyU2VydmljZS5vblJlc2l6ZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jbGVhckN1cnJlbnRMaW5rKCk7XG4gICAgICB0aGlzLl93YXNSZXNpemVkID0gdHJ1ZTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5fZWxlbWVudCwgJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICB0aGlzLl9pc01vdXNlT3V0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NsZWFyQ3VycmVudExpbmsoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5fZWxlbWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX2hhbmRsZU1vdXNlTW92ZS5iaW5kKHRoaXMpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5fZWxlbWVudCwgJ21vdXNlZG93bicsIHRoaXMuX2hhbmRsZU1vdXNlRG93bi5iaW5kKHRoaXMpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5fZWxlbWVudCwgJ21vdXNldXAnLCB0aGlzLl9oYW5kbGVNb3VzZVVwLmJpbmQodGhpcykpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX2xhc3RNb3VzZUV2ZW50ID0gZXZlbnQ7XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuX3Bvc2l0aW9uRnJvbU1vdXNlRXZlbnQoZXZlbnQsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX21vdXNlU2VydmljZSk7XG4gICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc01vdXNlT3V0ID0gZmFsc2U7XG5cbiAgICAvLyBJZ25vcmUgdGhlIGV2ZW50IGlmIGl0J3MgYW4gZW1iZWRkZXIgY3JlYXRlZCBob3ZlciB3aWRnZXRcbiAgICBjb25zdCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcG9zZWRQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBjb21wb3NlZFBhdGhbaV07XG4gICAgICAvLyBIaXQgVGVybWluYWwuZWxlbWVudCwgYnJlYWsgYW5kIGNvbnRpbnVlXG4gICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygneHRlcm0nKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIEl0J3MgYSBob3ZlciwgZG9uJ3QgcmVzcGVjdCBob3ZlciBldmVudFxuICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3h0ZXJtLWhvdmVyJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5fbGFzdEJ1ZmZlckNlbGwgfHwgKHBvc2l0aW9uLnggIT09IHRoaXMuX2xhc3RCdWZmZXJDZWxsLnggfHwgcG9zaXRpb24ueSAhPT0gdGhpcy5fbGFzdEJ1ZmZlckNlbGwueSkpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUhvdmVyKHBvc2l0aW9uKTtcbiAgICAgIHRoaXMuX2xhc3RCdWZmZXJDZWxsID0gcG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlSG92ZXIocG9zaXRpb246IElCdWZmZXJDZWxsUG9zaXRpb24pOiB2b2lkIHtcbiAgICAvLyBUT0RPOiBUaGlzIGN1cnJlbnRseSBkb2VzIG5vdCBjYWNoZSBsaW5rIHByb3ZpZGVyIHJlc3VsdHMgYWNyb3NzIHdyYXBwZWQgbGluZXMsIGFjdGl2ZUxpbmVcbiAgICAvLyAgICAgICBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgYGFjdGl2ZVJhbmdlOiB7c3RhcnRZLCBlbmRZfWBcbiAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBsaW5rXG4gICAgaWYgKHRoaXMuX2FjdGl2ZUxpbmUgIT09IHBvc2l0aW9uLnkgfHwgdGhpcy5fd2FzUmVzaXplZCkge1xuICAgICAgdGhpcy5fY2xlYXJDdXJyZW50TGluaygpO1xuICAgICAgdGhpcy5fYXNrRm9yTGluayhwb3NpdGlvbiwgZmFsc2UpO1xuICAgICAgdGhpcy5fd2FzUmVzaXplZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRoZSBpZiB0aGUgbGluayBpcyBpbiB0aGUgbW91c2UgcG9zaXRpb25cbiAgICBjb25zdCBpc0N1cnJlbnRMaW5rSW5Qb3NpdGlvbiA9IHRoaXMuX2N1cnJlbnRMaW5rICYmIHRoaXMuX2xpbmtBdFBvc2l0aW9uKHRoaXMuX2N1cnJlbnRMaW5rLmxpbmssIHBvc2l0aW9uKTtcbiAgICBpZiAoIWlzQ3VycmVudExpbmtJblBvc2l0aW9uKSB7XG4gICAgICB0aGlzLl9jbGVhckN1cnJlbnRMaW5rKCk7XG4gICAgICB0aGlzLl9hc2tGb3JMaW5rKHBvc2l0aW9uLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hc2tGb3JMaW5rKHBvc2l0aW9uOiBJQnVmZmVyQ2VsbFBvc2l0aW9uLCB1c2VMaW5lQ2FjaGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcyB8fCAhdXNlTGluZUNhY2hlKSB7XG4gICAgICB0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXM/LmZvckVhY2gocmVwbHkgPT4ge1xuICAgICAgICByZXBseT8uZm9yRWFjaChsaW5rV2l0aFN0YXRlID0+IHtcbiAgICAgICAgICBpZiAobGlua1dpdGhTdGF0ZS5saW5rLmRpc3Bvc2UpIHtcbiAgICAgICAgICAgIGxpbmtXaXRoU3RhdGUubGluay5kaXNwb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5fYWN0aXZlTGluZSA9IHBvc2l0aW9uLnk7XG4gICAgfVxuICAgIGxldCBsaW5rUHJvdmlkZWQgPSBmYWxzZTtcblxuICAgIC8vIFRoZXJlIGlzIG5vIGxpbmsgY2FjaGVkLCBzbyBhc2sgZm9yIG9uZVxuICAgIGZvciAoY29uc3QgW2ksIGxpbmtQcm92aWRlcl0gb2YgdGhpcy5fbGlua1Byb3ZpZGVyU2VydmljZS5saW5rUHJvdmlkZXJzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHVzZUxpbmVDYWNoZSkge1xuICAgICAgICBjb25zdCBleGlzdGluZ1JlcGx5ID0gdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzPy5nZXQoaSk7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzbid0IGEgcmVwbHksIHRoZSBwcm92aWRlciBoYXNuJ3QgcmVzcG9uZGVkIHlldC5cblxuICAgICAgICAvLyBUT0RPOiBJZiB0aGVyZSBpc24ndCBhIHJlcGx5IHlldCBpdCBtZWFucyB0aGF0IHRoZSBwcm92aWRlciBpcyBzdGlsbCByZXNvbHZpbmcuIEVuc3VyaW5nXG4gICAgICAgIC8vIHByb3ZpZGVMaW5rcyBpc24ndCB0cmlnZ2VyZWQgYWdhaW4gc2F2ZXMgSUxpbmsuaG92ZXIgZmlyaW5nIHR3aWNlIHRob3VnaC4gVGhpcyBwcm9iYWJseVxuICAgICAgICAvLyBuZWVkcyBwcm9taXNlcyB0byBnZXQgZml4ZWRcbiAgICAgICAgaWYgKGV4aXN0aW5nUmVwbHkpIHtcbiAgICAgICAgICBsaW5rUHJvdmlkZWQgPSB0aGlzLl9jaGVja0xpbmtQcm92aWRlclJlc3VsdChpLCBwb3NpdGlvbiwgbGlua1Byb3ZpZGVkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlua1Byb3ZpZGVyLnByb3ZpZGVMaW5rcyhwb3NpdGlvbi55LCAobGlua3M6IElMaW5rW10gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5faXNNb3VzZU91dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBsaW5rc1dpdGhTdGF0ZTogSUxpbmtXaXRoU3RhdGVbXSB8IHVuZGVmaW5lZCA9IGxpbmtzPy5tYXAobGluayAgPT4gKHsgbGluayB9KSk7XG4gICAgICAgICAgdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzPy5zZXQoaSwgbGlua3NXaXRoU3RhdGUpO1xuICAgICAgICAgIGxpbmtQcm92aWRlZCA9IHRoaXMuX2NoZWNrTGlua1Byb3ZpZGVyUmVzdWx0KGksIHBvc2l0aW9uLCBsaW5rUHJvdmlkZWQpO1xuXG4gICAgICAgICAgLy8gSWYgYWxsIHByb3ZpZGVycyBoYXZlIHJlc3BvbmRlZCwgcmVtb3ZlIGxvd2VyIHByaW9yaXR5IGxpbmtzIHRoYXQgaW50ZXJzZWN0IHJhbmdlcyBvZlxuICAgICAgICAgIC8vIGhpZ2hlciBwcmlvcml0eSBsaW5rc1xuICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXM/LnNpemUgPT09IHRoaXMuX2xpbmtQcm92aWRlclNlcnZpY2UubGlua1Byb3ZpZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUludGVyc2VjdGluZ0xpbmtzKHBvc2l0aW9uLnksIHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVJbnRlcnNlY3RpbmdMaW5rcyh5OiBudW1iZXIsIHJlcGxpZXM6IE1hcDxOdW1iZXIsIElMaW5rV2l0aFN0YXRlW10gfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gICAgY29uc3Qgb2NjdXBpZWRDZWxscyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVwbGllcy5zaXplOyBpKyspIHtcbiAgICAgIGNvbnN0IHByb3ZpZGVyUmVwbHkgPSByZXBsaWVzLmdldChpKTtcbiAgICAgIGlmICghcHJvdmlkZXJSZXBseSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvdmlkZXJSZXBseS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBsaW5rV2l0aFN0YXRlID0gcHJvdmlkZXJSZXBseVtpXTtcbiAgICAgICAgY29uc3Qgc3RhcnRYID0gbGlua1dpdGhTdGF0ZS5saW5rLnJhbmdlLnN0YXJ0LnkgPCB5ID8gMCA6IGxpbmtXaXRoU3RhdGUubGluay5yYW5nZS5zdGFydC54O1xuICAgICAgICBjb25zdCBlbmRYID0gbGlua1dpdGhTdGF0ZS5saW5rLnJhbmdlLmVuZC55ID4geSA/IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyA6IGxpbmtXaXRoU3RhdGUubGluay5yYW5nZS5lbmQueDtcbiAgICAgICAgZm9yIChsZXQgeCA9IHN0YXJ0WDsgeCA8PSBlbmRYOyB4KyspIHtcbiAgICAgICAgICBpZiAob2NjdXBpZWRDZWxscy5oYXMoeCkpIHtcbiAgICAgICAgICAgIHByb3ZpZGVyUmVwbHkuc3BsaWNlKGktLSwgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgb2NjdXBpZWRDZWxscy5hZGQoeCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jaGVja0xpbmtQcm92aWRlclJlc3VsdChpbmRleDogbnVtYmVyLCBwb3NpdGlvbjogSUJ1ZmZlckNlbGxQb3NpdGlvbiwgbGlua1Byb3ZpZGVkOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMpIHtcbiAgICAgIHJldHVybiBsaW5rUHJvdmlkZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgbGlua3MgPSB0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMuZ2V0KGluZGV4KTtcblxuICAgIC8vIENoZWNrIGlmIGV2ZXJ5IHByb3ZpZGVyIGJlZm9yZSB0aGlzIG9uZSBoYXMgY29tZSBiYWNrIHVuZGVmaW5lZFxuICAgIGxldCBoYXNMaW5rQmVmb3JlID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRleDsgaisrKSB7XG4gICAgICBpZiAoIXRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcy5oYXMoaikgfHwgdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzLmdldChqKSkge1xuICAgICAgICBoYXNMaW5rQmVmb3JlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBhbGwgcHJvdmlkZXJzIHdpdGggaGlnaGVyIHByaW9yaXR5IGNhbWUgYmFjayB1bmRlZmluZWQsIHRoZW4gdGhpcyBwcm92aWRlcidzIGxpbmsgZm9yXG4gICAgLy8gdGhlIHBvc2l0aW9uIHNob3VsZCBiZSB1c2VkXG4gICAgaWYgKCFoYXNMaW5rQmVmb3JlICYmIGxpbmtzKSB7XG4gICAgICBjb25zdCBsaW5rQXRQb3NpdGlvbiA9IGxpbmtzLmZpbmQobGluayA9PiB0aGlzLl9saW5rQXRQb3NpdGlvbihsaW5rLmxpbmssIHBvc2l0aW9uKSk7XG4gICAgICBpZiAobGlua0F0UG9zaXRpb24pIHtcbiAgICAgICAgbGlua1Byb3ZpZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faGFuZGxlTmV3TGluayhsaW5rQXRQb3NpdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYWxsIHRoZSBwcm92aWRlcnMgaGF2ZSByZXNwb25kZWRcbiAgICBpZiAodGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzLnNpemUgPT09IHRoaXMuX2xpbmtQcm92aWRlclNlcnZpY2UubGlua1Byb3ZpZGVycy5sZW5ndGggJiYgIWxpbmtQcm92aWRlZCkge1xuICAgICAgLy8gUmVzcGVjdCB0aGUgb3JkZXIgb2YgdGhlIGxpbmsgcHJvdmlkZXJzXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcy5zaXplOyBqKyspIHtcbiAgICAgICAgY29uc3QgY3VycmVudExpbmsgPSB0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMuZ2V0KGopPy5maW5kKGxpbmsgPT4gdGhpcy5fbGlua0F0UG9zaXRpb24obGluay5saW5rLCBwb3NpdGlvbikpO1xuICAgICAgICBpZiAoY3VycmVudExpbmspIHtcbiAgICAgICAgICBsaW5rUHJvdmlkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX2hhbmRsZU5ld0xpbmsoY3VycmVudExpbmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmtQcm92aWRlZDtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU1vdXNlRG93bigpOiB2b2lkIHtcbiAgICB0aGlzLl9tb3VzZURvd25MaW5rID0gdGhpcy5fY3VycmVudExpbms7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVNb3VzZVVwKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9jdXJyZW50TGluaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fcG9zaXRpb25Gcm9tTW91c2VFdmVudChldmVudCwgdGhpcy5fZWxlbWVudCwgdGhpcy5fbW91c2VTZXJ2aWNlKTtcbiAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX21vdXNlRG93bkxpbmsgPT09IHRoaXMuX2N1cnJlbnRMaW5rICYmIHRoaXMuX2xpbmtBdFBvc2l0aW9uKHRoaXMuX2N1cnJlbnRMaW5rLmxpbmssIHBvc2l0aW9uKSkge1xuICAgICAgdGhpcy5fY3VycmVudExpbmsubGluay5hY3RpdmF0ZShldmVudCwgdGhpcy5fY3VycmVudExpbmsubGluay50ZXh0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGVhckN1cnJlbnRMaW5rKHN0YXJ0Um93PzogbnVtYmVyLCBlbmRSb3c/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2N1cnJlbnRMaW5rIHx8ICF0aGlzLl9sYXN0TW91c2VFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgYSBzdGFydCBhbmQgZW5kIHJvdywgY2hlY2sgdGhhdCB0aGUgbGluayBpcyB3aXRoaW4gaXRcbiAgICBpZiAoIXN0YXJ0Um93IHx8ICFlbmRSb3cgfHwgKHRoaXMuX2N1cnJlbnRMaW5rLmxpbmsucmFuZ2Uuc3RhcnQueSA+PSBzdGFydFJvdyAmJiB0aGlzLl9jdXJyZW50TGluay5saW5rLnJhbmdlLmVuZC55IDw9IGVuZFJvdykpIHtcbiAgICAgIHRoaXMuX2xpbmtMZWF2ZSh0aGlzLl9lbGVtZW50LCB0aGlzLl9jdXJyZW50TGluay5saW5rLCB0aGlzLl9sYXN0TW91c2VFdmVudCk7XG4gICAgICB0aGlzLl9jdXJyZW50TGluayA9IHVuZGVmaW5lZDtcbiAgICAgIGRpc3Bvc2VBcnJheSh0aGlzLl9saW5rQ2FjaGVEaXNwb3NhYmxlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlTmV3TGluayhsaW5rV2l0aFN0YXRlOiBJTGlua1dpdGhTdGF0ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fbGFzdE1vdXNlRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuX3Bvc2l0aW9uRnJvbU1vdXNlRXZlbnQodGhpcy5fbGFzdE1vdXNlRXZlbnQsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX21vdXNlU2VydmljZSk7XG5cbiAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBob3ZlciBpZiB0aGUgd2UgaGF2ZSBhIGxpbmsgYXQgdGhlIHBvc2l0aW9uXG4gICAgaWYgKHRoaXMuX2xpbmtBdFBvc2l0aW9uKGxpbmtXaXRoU3RhdGUubGluaywgcG9zaXRpb24pKSB7XG4gICAgICB0aGlzLl9jdXJyZW50TGluayA9IGxpbmtXaXRoU3RhdGU7XG4gICAgICB0aGlzLl9jdXJyZW50TGluay5zdGF0ZSA9IHtcbiAgICAgICAgZGVjb3JhdGlvbnM6IHtcbiAgICAgICAgICB1bmRlcmxpbmU6IGxpbmtXaXRoU3RhdGUubGluay5kZWNvcmF0aW9ucyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGxpbmtXaXRoU3RhdGUubGluay5kZWNvcmF0aW9ucy51bmRlcmxpbmUsXG4gICAgICAgICAgcG9pbnRlckN1cnNvcjogbGlua1dpdGhTdGF0ZS5saW5rLmRlY29yYXRpb25zID09PSB1bmRlZmluZWQgPyB0cnVlIDogbGlua1dpdGhTdGF0ZS5saW5rLmRlY29yYXRpb25zLnBvaW50ZXJDdXJzb3JcbiAgICAgICAgfSxcbiAgICAgICAgaXNIb3ZlcmVkOiB0cnVlXG4gICAgICB9O1xuICAgICAgdGhpcy5fbGlua0hvdmVyKHRoaXMuX2VsZW1lbnQsIGxpbmtXaXRoU3RhdGUubGluaywgdGhpcy5fbGFzdE1vdXNlRXZlbnQpO1xuXG4gICAgICAvLyBBZGQgbGlzdGVuZXIgZm9yIHRyYWNraW5nIGRlY29yYXRpb25zIGNoYW5nZXNcbiAgICAgIGxpbmtXaXRoU3RhdGUubGluay5kZWNvcmF0aW9ucyA9IHt9IGFzIElMaW5rRGVjb3JhdGlvbnM7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsaW5rV2l0aFN0YXRlLmxpbmsuZGVjb3JhdGlvbnMsIHtcbiAgICAgICAgcG9pbnRlckN1cnNvcjoge1xuICAgICAgICAgIGdldDogKCkgPT4gdGhpcy5fY3VycmVudExpbms/LnN0YXRlPy5kZWNvcmF0aW9ucy5wb2ludGVyQ3Vyc29yLFxuICAgICAgICAgIHNldDogdiA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudExpbms/LnN0YXRlICYmIHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmRlY29yYXRpb25zLnBvaW50ZXJDdXJzb3IgIT09IHYpIHtcbiAgICAgICAgICAgICAgdGhpcy5fY3VycmVudExpbmsuc3RhdGUuZGVjb3JhdGlvbnMucG9pbnRlckN1cnNvciA9IHY7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5pc0hvdmVyZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3h0ZXJtLWN1cnNvci1wb2ludGVyJywgdik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHVuZGVybGluZToge1xuICAgICAgICAgIGdldDogKCkgPT4gdGhpcy5fY3VycmVudExpbms/LnN0YXRlPy5kZWNvcmF0aW9ucy51bmRlcmxpbmUsXG4gICAgICAgICAgc2V0OiB2ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50TGluaz8uc3RhdGUgJiYgdGhpcy5fY3VycmVudExpbms/LnN0YXRlPy5kZWNvcmF0aW9ucy51bmRlcmxpbmUgIT09IHYpIHtcbiAgICAgICAgICAgICAgdGhpcy5fY3VycmVudExpbmsuc3RhdGUuZGVjb3JhdGlvbnMudW5kZXJsaW5lID0gdjtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmlzSG92ZXJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpcmVVbmRlcmxpbmVFdmVudChsaW5rV2l0aFN0YXRlLmxpbmssIHYpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIHRvIHZpZXdwb3J0IGNoYW5nZXMgdG8gcmUtcmVuZGVyIHRoZSBsaW5rIHVuZGVyIHRoZSBjdXJzb3IgKG9ubHkgd2hlbiB0aGUgbGluZSB0aGVcbiAgICAgIC8vIGxpbmsgaXMgb24gY2hhbmdlcylcbiAgICAgIHRoaXMuX2xpbmtDYWNoZURpc3Bvc2FibGVzLnB1c2godGhpcy5fcmVuZGVyU2VydmljZS5vblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UoZSA9PiB7XG4gICAgICAgIC8vIFNhbml0eSBjaGVjaywgdGhpcyBzaG91bGRuJ3QgaGFwcGVuIGluIHByYWN0aWNlIGFzIHRoaXMgbGlzdGVuZXIgd291bGQgYmUgZGlzcG9zZWRcbiAgICAgICAgaWYgKCF0aGlzLl9jdXJyZW50TGluaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHN0YXJ0IGlzIDAgYSBzY3JvbGwgbW9zdCBsaWtlbHkgb2NjdXJyZWQsIG1ha2Ugc3VyZSBsaW5rcyBhYm92ZSB0aGUgZm9sZCBhbHNvIGdldFxuICAgICAgICAvLyBjbGVhcmVkLlxuICAgICAgICBjb25zdCBzdGFydCA9IGUuc3RhcnQgPT09IDAgPyAwIDogZS5zdGFydCArIDEgKyB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcDtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3AgKyAxICsgZS5lbmQ7XG4gICAgICAgIC8vIE9ubHkgY2xlYXIgdGhlIGxpbmsgaWYgdGhlIHZpZXdwb3J0IGNoYW5nZSBoYXBwZW5lZCBvbiB0aGlzIGxpbmVcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRMaW5rLmxpbmsucmFuZ2Uuc3RhcnQueSA+PSBzdGFydCAmJiB0aGlzLl9jdXJyZW50TGluay5saW5rLnJhbmdlLmVuZC55IDw9IGVuZCkge1xuICAgICAgICAgIHRoaXMuX2NsZWFyQ3VycmVudExpbmsoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgaWYgKHRoaXMuX2xhc3RNb3VzZUV2ZW50KSB7XG4gICAgICAgICAgICAvLyByZS1ldmFsIHByZXZpb3VzbHkgYWN0aXZlIGxpbmsgYWZ0ZXIgY2hhbmdlc1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9wb3NpdGlvbkZyb21Nb3VzZUV2ZW50KHRoaXMuX2xhc3RNb3VzZUV2ZW50LCB0aGlzLl9lbGVtZW50LCB0aGlzLl9tb3VzZVNlcnZpY2UhKTtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLl9hc2tGb3JMaW5rKHBvc2l0aW9uLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9saW5rSG92ZXIoZWxlbWVudDogSFRNTEVsZW1lbnQsIGxpbms6IElMaW5rLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jdXJyZW50TGluaz8uc3RhdGUpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmlzSG92ZXJlZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5fY3VycmVudExpbmsuc3RhdGUuZGVjb3JhdGlvbnMudW5kZXJsaW5lKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVVbmRlcmxpbmVFdmVudChsaW5rLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5kZWNvcmF0aW9ucy5wb2ludGVyQ3Vyc29yKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgneHRlcm0tY3Vyc29yLXBvaW50ZXInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluay5ob3Zlcikge1xuICAgICAgbGluay5ob3ZlcihldmVudCwgbGluay50ZXh0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9maXJlVW5kZXJsaW5lRXZlbnQobGluazogSUxpbmssIHNob3dFdmVudDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJhbmdlID0gbGluay5yYW5nZTtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXQgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcDtcbiAgICBjb25zdCBldmVudCA9IHRoaXMuX2NyZWF0ZUxpbmtVbmRlcmxpbmVFdmVudChyYW5nZS5zdGFydC54IC0gMSwgcmFuZ2Uuc3RhcnQueSAtIHNjcm9sbE9mZnNldCAtIDEsIHJhbmdlLmVuZC54LCByYW5nZS5lbmQueSAtIHNjcm9sbE9mZnNldCAtIDEsIHVuZGVmaW5lZCk7XG4gICAgY29uc3QgZW1pdHRlciA9IHNob3dFdmVudCA/IHRoaXMuX29uU2hvd0xpbmtVbmRlcmxpbmUgOiB0aGlzLl9vbkhpZGVMaW5rVW5kZXJsaW5lO1xuICAgIGVtaXR0ZXIuZmlyZShldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2xpbmtMZWF2ZShlbGVtZW50OiBIVE1MRWxlbWVudCwgbGluazogSUxpbmssIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRMaW5rPy5zdGF0ZSkge1xuICAgICAgdGhpcy5fY3VycmVudExpbmsuc3RhdGUuaXNIb3ZlcmVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5fY3VycmVudExpbmsuc3RhdGUuZGVjb3JhdGlvbnMudW5kZXJsaW5lKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVVbmRlcmxpbmVFdmVudChsaW5rLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY3VycmVudExpbmsuc3RhdGUuZGVjb3JhdGlvbnMucG9pbnRlckN1cnNvcikge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3h0ZXJtLWN1cnNvci1wb2ludGVyJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpbmsubGVhdmUpIHtcbiAgICAgIGxpbmsubGVhdmUoZXZlbnQsIGxpbmsudGV4dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBidWZmZXIgcG9zaXRpb24gaXMgd2l0aGluIHRoZSBsaW5rXG4gICAqIEBwYXJhbSBsaW5rXG4gICAqIEBwYXJhbSBwb3NpdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBfbGlua0F0UG9zaXRpb24obGluazogSUxpbmssIHBvc2l0aW9uOiBJQnVmZmVyQ2VsbFBvc2l0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbG93ZXIgPSBsaW5rLnJhbmdlLnN0YXJ0LnkgKiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgKyBsaW5rLnJhbmdlLnN0YXJ0Lng7XG4gICAgY29uc3QgdXBwZXIgPSBsaW5rLnJhbmdlLmVuZC55ICogdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzICsgbGluay5yYW5nZS5lbmQueDtcbiAgICBjb25zdCBjdXJyZW50ID0gcG9zaXRpb24ueSAqIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyArIHBvc2l0aW9uLng7XG4gICAgcmV0dXJuIChsb3dlciA8PSBjdXJyZW50ICYmIGN1cnJlbnQgPD0gdXBwZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYnVmZmVyIHBvc2l0aW9uIGZyb20gYSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHByaXZhdGUgX3Bvc2l0aW9uRnJvbU1vdXNlRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBtb3VzZVNlcnZpY2U6IElNb3VzZVNlcnZpY2UpOiBJQnVmZmVyQ2VsbFBvc2l0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb29yZHMgPSBtb3VzZVNlcnZpY2UuZ2V0Q29vcmRzKGV2ZW50LCBlbGVtZW50LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyk7XG4gICAgaWYgKCFjb29yZHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4geyB4OiBjb29yZHNbMF0sIHk6IGNvb3Jkc1sxXSArIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwIH07XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVMaW5rVW5kZXJsaW5lRXZlbnQoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgZmc6IG51bWJlciB8IHVuZGVmaW5lZCk6IElMaW5raWZpZXJFdmVudCB7XG4gICAgcmV0dXJuIHsgeDEsIHkxLCB4MiwgeTIsIGNvbHM6IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgZmcgfTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHN0cmluZ3MgdGhhdCBnZXQgZXhwb3J0ZWQgaW4gdGhlIEFQSSBzbyB0aGV5IGNhbiBiZSBsb2NhbGl6ZWRcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuZXhwb3J0IGxldCBwcm9tcHRMYWJlbCA9ICdUZXJtaW5hbCBpbnB1dCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbmV4cG9ydCBsZXQgdG9vTXVjaE91dHB1dCA9ICdUb28gbXVjaCBvdXRwdXQgdG8gYW5ub3VuY2UsIG5hdmlnYXRlIHRvIHJvd3MgbWFudWFsbHkgdG8gcmVhZCc7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQnVmZmVyUmFuZ2UsIElMaW5rIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJTGlua1Byb3ZpZGVyIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElPcHRpb25zU2VydmljZSwgSU9zY0xpbmtTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGNsYXNzIE9zY0xpbmtQcm92aWRlciBpbXBsZW1lbnRzIElMaW5rUHJvdmlkZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIEBJT3NjTGlua1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3NjTGlua1NlcnZpY2U6IElPc2NMaW5rU2VydmljZVxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBwcm92aWRlTGlua3MoeTogbnVtYmVyLCBjYWxsYmFjazogKGxpbmtzOiBJTGlua1tdIHwgdW5kZWZpbmVkKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldCh5IC0gMSk7XG4gICAgaWYgKCFsaW5lKSB7XG4gICAgICBjYWxsYmFjayh1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogSUxpbmtbXSA9IFtdO1xuICAgIGNvbnN0IGxpbmtIYW5kbGVyID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5saW5rSGFuZGxlcjtcbiAgICBjb25zdCBjZWxsID0gbmV3IENlbGxEYXRhKCk7XG4gICAgY29uc3QgbGluZUxlbmd0aCA9IGxpbmUuZ2V0VHJpbW1lZExlbmd0aCgpO1xuICAgIGxldCBjdXJyZW50TGlua0lkID0gLTE7XG4gICAgbGV0IGN1cnJlbnRTdGFydCA9IC0xO1xuICAgIGxldCBmaW5pc2hMaW5rID0gZmFsc2U7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBsaW5lTGVuZ3RoOyB4KyspIHtcbiAgICAgIC8vIE1pbm9yIG9wdGltaXphdGlvbiwgb25seSBjaGVjayBmb3IgY29udGVudCBpZiB0aGVyZSBpc24ndCBhIGxpbmsgaW4gY2FzZSB0aGUgbGluayBlbmRzIHdpdGhcbiAgICAgIC8vIGEgbnVsbCBjZWxsXG4gICAgICBpZiAoY3VycmVudFN0YXJ0ID09PSAtMSAmJiAhbGluZS5oYXNDb250ZW50KHgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsaW5lLmxvYWRDZWxsKHgsIGNlbGwpO1xuICAgICAgaWYgKGNlbGwuaGFzRXh0ZW5kZWRBdHRycygpICYmIGNlbGwuZXh0ZW5kZWQudXJsSWQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRTdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICBjdXJyZW50U3RhcnQgPSB4O1xuICAgICAgICAgIGN1cnJlbnRMaW5rSWQgPSBjZWxsLmV4dGVuZGVkLnVybElkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmlzaExpbmsgPSBjZWxsLmV4dGVuZGVkLnVybElkICE9PSBjdXJyZW50TGlua0lkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY3VycmVudFN0YXJ0ICE9PSAtMSkge1xuICAgICAgICAgIGZpbmlzaExpbmsgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5pc2hMaW5rIHx8IChjdXJyZW50U3RhcnQgIT09IC0xICYmIHggPT09IGxpbmVMZW5ndGggLSAxKSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5fb3NjTGlua1NlcnZpY2UuZ2V0TGlua0RhdGEoY3VycmVudExpbmtJZCk/LnVyaTtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAvLyBUaGVzZSByYW5nZXMgYXJlIDEtYmFzZWRcbiAgICAgICAgICBjb25zdCByYW5nZTogSUJ1ZmZlclJhbmdlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgeDogY3VycmVudFN0YXJ0ICsgMSxcbiAgICAgICAgICAgICAgeVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAvLyBPZmZzZXQgZW5kIHggaWYgaXQncyBhIGxpbmsgdGhhdCBlbmRzIG9uIHRoZSBsYXN0IGNlbGwgaW4gdGhlIGxpbmVcbiAgICAgICAgICAgICAgeDogeCArICghZmluaXNoTGluayAmJiB4ID09PSBsaW5lTGVuZ3RoIC0gMSA/IDEgOiAwKSxcbiAgICAgICAgICAgICAgeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBsZXQgaWdub3JlTGluayA9IGZhbHNlO1xuICAgICAgICAgIGlmICghbGlua0hhbmRsZXI/LmFsbG93Tm9uSHR0cFByb3RvY29scykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh0ZXh0KTtcbiAgICAgICAgICAgICAgaWYgKCFbJ2h0dHA6JywgJ2h0dHBzOiddLmluY2x1ZGVzKHBhcnNlZC5wcm90b2NvbCkpIHtcbiAgICAgICAgICAgICAgICBpZ25vcmVMaW5rID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAvLyBJZ25vcmUgaW52YWxpZCBVUkxzIHRvIHByZXZlbnQgdW5leHBlY3RlZCBiZWhhdmlvcnNcbiAgICAgICAgICAgICAgaWdub3JlTGluayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpZ25vcmVMaW5rKSB7XG4gICAgICAgICAgICAvLyBPU0MgbGlua3MgYWx3YXlzIHVzZSB1bmRlcmxpbmUgYW5kIHBvaW50ZXIgZGVjb3JhdGlvbnNcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICAgIGFjdGl2YXRlOiAoZSwgdGV4dCkgPT4gKGxpbmtIYW5kbGVyID8gbGlua0hhbmRsZXIuYWN0aXZhdGUoZSwgdGV4dCwgcmFuZ2UpIDogZGVmYXVsdEFjdGl2YXRlKGUsIHRleHQpKSxcbiAgICAgICAgICAgICAgaG92ZXI6IChlLCB0ZXh0KSA9PiBsaW5rSGFuZGxlcj8uaG92ZXI/LihlLCB0ZXh0LCByYW5nZSksXG4gICAgICAgICAgICAgIGxlYXZlOiAoZSwgdGV4dCkgPT4gbGlua0hhbmRsZXI/LmxlYXZlPy4oZSwgdGV4dCwgcmFuZ2UpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluaXNoTGluayA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENsZWFyIGxpbmsgb3Igc3RhcnQgYSBuZXcgbGluayBpZiBvbmUgc3RhcnRzIGltbWVkaWF0ZWx5XG4gICAgICAgIGlmIChjZWxsLmhhc0V4dGVuZGVkQXR0cnMoKSAmJiBjZWxsLmV4dGVuZGVkLnVybElkKSB7XG4gICAgICAgICAgY3VycmVudFN0YXJ0ID0geDtcbiAgICAgICAgICBjdXJyZW50TGlua0lkID0gY2VsbC5leHRlbmRlZC51cmxJZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50U3RhcnQgPSAtMTtcbiAgICAgICAgICBjdXJyZW50TGlua0lkID0gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBIYW5kbGUgZmV0Y2hpbmcgYW5kIHJldHVybmluZyBvdGhlciBsaW5rIHJhbmdlcyB0byB1bmRlcmxpbmUgb3RoZXIgbGlua3Mgd2l0aCB0aGUgc2FtZVxuICAgIC8vICAgICAgIGlkXG4gICAgY2FsbGJhY2socmVzdWx0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QWN0aXZhdGUoZTogTW91c2VFdmVudCwgdXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYW5zd2VyID0gY29uZmlybShgRG8geW91IHdhbnQgdG8gbmF2aWdhdGUgdG8gJHt1cml9P1xcblxcbldBUk5JTkc6IFRoaXMgbGluayBjb3VsZCBwb3RlbnRpYWxseSBiZSBkYW5nZXJvdXNgKTtcbiAgaWYgKGFuc3dlcikge1xuICAgIGNvbnN0IG5ld1dpbmRvdyA9IHdpbmRvdy5vcGVuKCk7XG4gICAgaWYgKG5ld1dpbmRvdykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3V2luZG93Lm9wZW5lciA9IG51bGw7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbm8tb3AsIEVsZWN0cm9uIGNhbiB0aHJvd1xuICAgICAgfVxuICAgICAgbmV3V2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignT3BlbmluZyBsaW5rIGJsb2NrZWQgYXMgb3BlbmVyIGNvdWxkIG5vdCBiZSBjbGVhcmVkJyk7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJUmVuZGVyRGVib3VuY2VyV2l0aENhbGxiYWNrIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbi8qKlxuICogRGVib3VuY2VzIGNhbGxzIHRvIHJlbmRlciB0ZXJtaW5hbCByb3dzIHVzaW5nIGFuaW1hdGlvbiBmcmFtZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5kZXJEZWJvdW5jZXIgaW1wbGVtZW50cyBJUmVuZGVyRGVib3VuY2VyV2l0aENhbGxiYWNrIHtcbiAgcHJpdmF0ZSBfcm93U3RhcnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcm93RW5kOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3Jvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2FuaW1hdGlvbkZyYW1lOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3JlZnJlc2hDYWxsYmFja3M6IEZyYW1lUmVxdWVzdENhbGxiYWNrW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJDYWxsYmFjazogKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSA9PiB2b2lkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZVxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZSk7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkUmVmcmVzaENhbGxiYWNrKGNhbGxiYWNrOiBGcmFtZVJlcXVlc3RDYWxsYmFjayk6IG51bWJlciB7XG4gICAgdGhpcy5fcmVmcmVzaENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICBpZiAoIXRoaXMuX2FuaW1hdGlvbkZyYW1lKSB7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuX2lubmVyUmVmcmVzaCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FuaW1hdGlvbkZyYW1lO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2gocm93U3RhcnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgcm93RW5kOiBudW1iZXIgfCB1bmRlZmluZWQsIHJvd0NvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9yb3dDb3VudCA9IHJvd0NvdW50O1xuICAgIC8vIEdldCB0aGUgbWluL21heCByb3cgc3RhcnQvZW5kIGZvciB0aGUgYXJnIHZhbHVlc1xuICAgIHJvd1N0YXJ0ID0gcm93U3RhcnQgIT09IHVuZGVmaW5lZCA/IHJvd1N0YXJ0IDogMDtcbiAgICByb3dFbmQgPSByb3dFbmQgIT09IHVuZGVmaW5lZCA/IHJvd0VuZCA6IHRoaXMuX3Jvd0NvdW50IC0gMTtcbiAgICAvLyBTZXQgdGhlIHByb3BlcnRpZXMgdG8gdGhlIHVwZGF0ZWQgdmFsdWVzXG4gICAgdGhpcy5fcm93U3RhcnQgPSB0aGlzLl9yb3dTdGFydCAhPT0gdW5kZWZpbmVkID8gTWF0aC5taW4odGhpcy5fcm93U3RhcnQsIHJvd1N0YXJ0KSA6IHJvd1N0YXJ0O1xuICAgIHRoaXMuX3Jvd0VuZCA9IHRoaXMuX3Jvd0VuZCAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgodGhpcy5fcm93RW5kLCByb3dFbmQpIDogcm93RW5kO1xuXG4gICAgaWYgKHRoaXMuX2FuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLl9pbm5lclJlZnJlc2goKSk7XG4gIH1cblxuICBwcml2YXRlIF9pbm5lclJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBNYWtlIHN1cmUgdmFsdWVzIGFyZSBzZXRcbiAgICBpZiAodGhpcy5fcm93U3RhcnQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9yb3dFbmQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9yb3dDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9ydW5SZWZyZXNoQ2FsbGJhY2tzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xhbXAgdmFsdWVzXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCh0aGlzLl9yb3dTdGFydCwgMCk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4odGhpcy5fcm93RW5kLCB0aGlzLl9yb3dDb3VudCAtIDEpO1xuXG4gICAgLy8gUmVzZXQgZGVib3VuY2VyICh0aGlzIGhhcHBlbnMgYmVmb3JlIHJlbmRlciBjYWxsYmFjayBhcyB0aGUgcmVuZGVyIGNvdWxkIHRyaWdnZXIgaXQgYWdhaW4pXG4gICAgdGhpcy5fcm93U3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcm93RW5kID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gUnVuIHJlbmRlciBjYWxsYmFja1xuICAgIHRoaXMuX3JlbmRlckNhbGxiYWNrKHN0YXJ0LCBlbmQpO1xuICAgIHRoaXMuX3J1blJlZnJlc2hDYWxsYmFja3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3J1blJlZnJlc2hDYWxsYmFja3MoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLl9yZWZyZXNoQ2FsbGJhY2tzKSB7XG4gICAgICBjYWxsYmFjaygwKTtcbiAgICB9XG4gICAgdGhpcy5fcmVmcmVzaENhbGxiYWNrcyA9IFtdO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgQ2hyaXN0b3BoZXIgSmVmZnJleSAoTUlUIExpY2Vuc2UpXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBPcmlnaW5hbGx5IGZvcmtlZCBmcm9tICh3aXRoIHRoZSBhdXRob3IncyBwZXJtaXNzaW9uKTpcbiAqICAgRmFicmljZSBCZWxsYXJkJ3MgamF2YXNjcmlwdCB2dDEwMCBmb3IganNsaW51eDpcbiAqICAgaHR0cDovL2JlbGxhcmQub3JnL2pzbGludXgvXG4gKiAgIENvcHlyaWdodCAoYykgMjAxMSBGYWJyaWNlIEJlbGxhcmRcbiAqICAgVGhlIG9yaWdpbmFsIGRlc2lnbiByZW1haW5zLiBUaGUgdGVybWluYWwgaXRzZWxmXG4gKiAgIGhhcyBiZWVuIGV4dGVuZGVkIHRvIGluY2x1ZGUgeHRlcm0gQ1NJIGNvZGVzLCBhbW9uZ1xuICogICBvdGhlciBmZWF0dXJlcy5cbiAqXG4gKiBUZXJtaW5hbCBFbXVsYXRpb24gUmVmZXJlbmNlczpcbiAqICAgaHR0cDovL3Z0MTAwLm5ldC9cbiAqICAgaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy50eHRcbiAqICAgaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy5odG1sXG4gKiAgIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC92dHRlc3QvXG4gKiAgIGh0dHA6Ly93d3cuaW53YXAuY29tL3BkcDEwL2Fuc2ljb2RlLnR4dFxuICogICBodHRwOi8vbGludXguZGllLm5ldC9tYW4vNC9jb25zb2xlX2NvZGVzXG4gKiAgIGh0dHA6Ly9saW51eC5kaWUubmV0L21hbi83L3VyeHZ0XG4gKi9cblxuaW1wb3J0IHsgY29weUhhbmRsZXIsIGhhbmRsZVBhc3RlRXZlbnQsIG1vdmVUZXh0QXJlYVVuZGVyTW91c2VDdXJzb3IsIHBhc3RlLCByaWdodENsaWNrSGFuZGxlciB9IGZyb20gJ2Jyb3dzZXIvQ2xpcGJvYXJkJztcbmltcG9ydCB7IGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciB9IGZyb20gJ2Jyb3dzZXIvTGlmZWN5Y2xlJztcbmltcG9ydCB7IExpbmtpZmllciB9IGZyb20gJy4vTGlua2lmaWVyJztcbmltcG9ydCAqIGFzIFN0cmluZ3MgZnJvbSAnYnJvd3Nlci9Mb2NhbGl6YWJsZVN0cmluZ3MnO1xuaW1wb3J0IHsgT3NjTGlua1Byb3ZpZGVyIH0gZnJvbSAnYnJvd3Nlci9Pc2NMaW5rUHJvdmlkZXInO1xuaW1wb3J0IHsgQ2hhcmFjdGVySm9pbmVySGFuZGxlciwgQ3VzdG9tS2V5RXZlbnRIYW5kbGVyLCBDdXN0b21XaGVlbEV2ZW50SGFuZGxlciwgSUJyb3dzZXIsIElCdWZmZXJSYW5nZSwgSUNvbXBvc2l0aW9uSGVscGVyLCBJTGlua2lmaWVyMiwgSVRlcm1pbmFsLCBJVmlld3BvcnQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IFZpZXdwb3J0IH0gZnJvbSAnYnJvd3Nlci9WaWV3cG9ydCc7XG5pbXBvcnQgeyBCdWZmZXJEZWNvcmF0aW9uUmVuZGVyZXIgfSBmcm9tICdicm93c2VyL2RlY29yYXRpb25zL0J1ZmZlckRlY29yYXRpb25SZW5kZXJlcic7XG5pbXBvcnQgeyBPdmVydmlld1J1bGVyUmVuZGVyZXIgfSBmcm9tICdicm93c2VyL2RlY29yYXRpb25zL092ZXJ2aWV3UnVsZXJSZW5kZXJlcic7XG5pbXBvcnQgeyBDb21wb3NpdGlvbkhlbHBlciB9IGZyb20gJ2Jyb3dzZXIvaW5wdXQvQ29tcG9zaXRpb25IZWxwZXInO1xuaW1wb3J0IHsgRG9tUmVuZGVyZXIgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL2RvbS9Eb21SZW5kZXJlcic7XG5pbXBvcnQgeyBJUmVuZGVyZXIgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBDaGFyU2l6ZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL0NoYXJTaXplU2VydmljZSc7XG5pbXBvcnQgeyBDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9DaGFyYWN0ZXJKb2luZXJTZXJ2aWNlJztcbmltcG9ydCB7IENvcmVCcm93c2VyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvQ29yZUJyb3dzZXJTZXJ2aWNlJztcbmltcG9ydCB7IE1vdXNlU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvTW91c2VTZXJ2aWNlJztcbmltcG9ydCB7IFJlbmRlclNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1JlbmRlclNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBJQ2hhclNpemVTZXJ2aWNlLCBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSwgSUNvcmVCcm93c2VyU2VydmljZSwgSUxpbmtQcm92aWRlclNlcnZpY2UsIElNb3VzZVNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlLCBJU2VsZWN0aW9uU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9UaGVtZVNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbm5lbHMsIGNvbG9yIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcbmltcG9ydCB7IENvcmVUZXJtaW5hbCB9IGZyb20gJ2NvbW1vbi9Db3JlVGVybWluYWwnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJRXZlbnQsIGZvcndhcmRFdmVudCB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgTXV0YWJsZURpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0ICogYXMgQnJvd3NlciBmcm9tICdjb21tb24vUGxhdGZvcm0nO1xuaW1wb3J0IHsgQ29sb3JSZXF1ZXN0VHlwZSwgQ29yZU1vdXNlQWN0aW9uLCBDb3JlTW91c2VCdXR0b24sIENvcmVNb3VzZUV2ZW50VHlwZSwgSUNvbG9yRXZlbnQsIElUZXJtaW5hbE9wdGlvbnMsIEtleWJvYXJkUmVzdWx0VHlwZSwgU2Nyb2xsU291cmNlLCBTcGVjaWFsQ29sb3JJbmRleCB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBERUZBVUxUX0FUVFJfREFUQSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQnVmZmVyTGluZSc7XG5pbXBvcnQgeyBJQnVmZmVyIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBDMCwgQzFfRVNDQVBFRCB9IGZyb20gJ2NvbW1vbi9kYXRhL0VzY2FwZVNlcXVlbmNlcyc7XG5pbXBvcnQgeyBldmFsdWF0ZUtleWJvYXJkRXZlbnQgfSBmcm9tICdjb21tb24vaW5wdXQvS2V5Ym9hcmQnO1xuaW1wb3J0IHsgdG9SZ2JTdHJpbmcgfSBmcm9tICdjb21tb24vaW5wdXQvWFBhcnNlQ29sb3InO1xuaW1wb3J0IHsgRGVjb3JhdGlvblNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvRGVjb3JhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgSURlY29yYXRpb25TZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElEZWNvcmF0aW9uLCBJRGVjb3JhdGlvbk9wdGlvbnMsIElEaXNwb3NhYmxlLCBJTGlua1Byb3ZpZGVyLCBJTWFya2VyIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZSB9IGZyb20gJy4uL2NvbW1vbi9JbnB1dEhhbmRsZXInO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eU1hbmFnZXIgfSBmcm9tICcuL0FjY2Vzc2liaWxpdHlNYW5hZ2VyJztcbmltcG9ydCB7IExpbmtQcm92aWRlclNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL0xpbmtQcm92aWRlclNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgVGVybWluYWwgZXh0ZW5kcyBDb3JlVGVybWluYWwgaW1wbGVtZW50cyBJVGVybWluYWwge1xuICBwdWJsaWMgdGV4dGFyZWE6IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHNjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdmlld3BvcnRTY3JvbGxBcmVhOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdmlld3BvcnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfaGVscGVyQ29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfY29tcG9zaXRpb25WaWV3OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgbGlua2lmaWVyOiBJTGlua2lmaWVyMiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfb3ZlcnZpZXdSdWxlclJlbmRlcmVyOiBPdmVydmlld1J1bGVyUmVuZGVyZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGJyb3dzZXI6IElCcm93c2VyID0gQnJvd3NlciBhcyBhbnk7XG5cbiAgcHJpdmF0ZSBfY3VzdG9tS2V5RXZlbnRIYW5kbGVyOiBDdXN0b21LZXlFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2N1c3RvbVdoZWVsRXZlbnRIYW5kbGVyOiBDdXN0b21XaGVlbEV2ZW50SGFuZGxlciB8IHVuZGVmaW5lZDtcblxuICAvLyBCcm93c2VyIHNlcnZpY2VzXG4gIHByaXZhdGUgX2RlY29yYXRpb25TZXJ2aWNlOiBEZWNvcmF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBfbGlua1Byb3ZpZGVyU2VydmljZTogSUxpbmtQcm92aWRlclNlcnZpY2U7XG5cbiAgLy8gT3B0aW9uYWwgYnJvd3NlciBzZXJ2aWNlc1xuICBwcml2YXRlIF9jaGFyU2l6ZVNlcnZpY2U6IElDaGFyU2l6ZVNlcnZpY2UgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbW91c2VTZXJ2aWNlOiBJTW91c2VTZXJ2aWNlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlOiBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uU2VydmljZTogSVNlbGVjdGlvblNlcnZpY2UgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgd2hldGhlciB0aGUga2V5ZG93biBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYW5kIHRyaWdnZXJlZCBhIGRhdGEgZXZlbnQsIGlmIHNvXG4gICAqIHRoZSBrZXlwcmVzcyBldmVudCBzaG91bGQgbm90IHRyaWdnZXIgYSBkYXRhIGV2ZW50IGJ1dCBzaG91bGQgc3RpbGwgcHJpbnQgdG8gdGhlIHRleHRhcmVhIHNvXG4gICAqIHNjcmVlbiByZWFkZXJzIHdpbGwgYW5ub3VuY2UgaXQuXG4gICAqL1xuICBwcml2YXRlIF9rZXlEb3duSGFuZGxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHdoZXRoZXIgYSBrZXlkb3duIGV2ZW50IGhhcyBvY2N1cmVkIHNpbmNlIHRoZSBsYXN0IGtleXVwIGV2ZW50LCBpLmUuIHdoZXRoZXIgYSBrZXlcbiAgICogaXMgY3VycmVudGx5IFwicHJlc3NlZFwiLlxuICAgKi9cbiAgcHJpdmF0ZSBfa2V5RG93blNlZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVjb3JkcyB3aGV0aGVyIHRoZSBrZXlwcmVzcyBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYW5kIHRyaWdnZXJlZCBhIGRhdGEgZXZlbnQsIGlmIHNvXG4gICAqIHRoZSBpbnB1dCBldmVudCBzaG91bGQgbm90IHRyaWdnZXIgYSBkYXRhIGV2ZW50IGJ1dCBzaG91bGQgc3RpbGwgcHJpbnQgdG8gdGhlIHRleHRhcmVhIHNvXG4gICAqIHNjcmVlbiByZWFkZXJzIHdpbGwgYW5ub3VuY2UgaXQuXG4gICAqL1xuICBwcml2YXRlIF9rZXlQcmVzc0hhbmRsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVjb3JkcyB3aGV0aGVyIHRoZXJlIGhhcyBiZWVuIGEga2V5ZG93biBldmVudCBmb3IgYSBkZWFkIGtleSB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBrZXlkb3duXG4gICAqIGV2ZW50IGZvciB0aGUgY29tcG9zZWQvYWx0ZXJuYXRpdmUgY2hhcmFjdGVyLiBJZiB3ZSBjYW5jZWwgdGhlIGtleWRvd24gZXZlbnQgZm9yIHRoZSBkZWFkIGtleSxcbiAgICogbm8gZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCBmb3IgdGhlIGZpbmFsIGNoYXJhY3Rlci5cbiAgICovXG4gIHByaXZhdGUgX3VucHJvY2Vzc2VkRGVhZEtleTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyB2aWV3cG9ydDogSVZpZXdwb3J0IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jb21wb3NpdGlvbkhlbHBlcjogSUNvbXBvc2l0aW9uSGVscGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hY2Nlc3NpYmlsaXR5TWFuYWdlcjogTXV0YWJsZURpc3Bvc2FibGU8QWNjZXNzaWJpbGl0eU1hbmFnZXI+ID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DdXJzb3JNb3ZlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25DdXJzb3JNb3ZlID0gdGhpcy5fb25DdXJzb3JNb3ZlLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbktleSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nLCBkb21FdmVudDogS2V5Ym9hcmRFdmVudCB9PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uS2V5ID0gdGhpcy5fb25LZXkuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVuZGVyID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbmRlciA9IHRoaXMuX29uUmVuZGVyLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uVGl0bGVDaGFuZ2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uVGl0bGVDaGFuZ2UgPSB0aGlzLl9vblRpdGxlQ2hhbmdlLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkJlbGwgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkJlbGwgPSB0aGlzLl9vbkJlbGwuZXZlbnQ7XG5cbiAgcHJpdmF0ZSBfb25Gb2N1cyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIGdldCBvbkZvY3VzKCk6IElFdmVudDx2b2lkPiB7IHJldHVybiB0aGlzLl9vbkZvY3VzLmV2ZW50OyB9XG4gIHByaXZhdGUgX29uQmx1ciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIGdldCBvbkJsdXIoKTogSUV2ZW50PHZvaWQ+IHsgcmV0dXJuIHRoaXMuX29uQmx1ci5ldmVudDsgfVxuICBwcml2YXRlIF9vbkExMXlDaGFyRW1pdHRlciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCkpO1xuICBwdWJsaWMgZ2V0IG9uQTExeUNoYXIoKTogSUV2ZW50PHN0cmluZz4geyByZXR1cm4gdGhpcy5fb25BMTF5Q2hhckVtaXR0ZXIuZXZlbnQ7IH1cbiAgcHJpdmF0ZSBfb25BMTF5VGFiRW1pdHRlciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCkpO1xuICBwdWJsaWMgZ2V0IG9uQTExeVRhYigpOiBJRXZlbnQ8bnVtYmVyPiB7IHJldHVybiB0aGlzLl9vbkExMXlUYWJFbWl0dGVyLmV2ZW50OyB9XG4gIHByaXZhdGUgX29uV2lsbE9wZW4gPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SFRNTEVsZW1lbnQ+KCkpO1xuICBwdWJsaWMgZ2V0IG9uV2lsbE9wZW4oKTogSUV2ZW50PEhUTUxFbGVtZW50PiB7IHJldHVybiB0aGlzLl9vbldpbGxPcGVuLmV2ZW50OyB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogUGFydGlhbDxJVGVybWluYWxPcHRpb25zPiA9IHt9XG4gICkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5fc2V0dXAoKTtcblxuICAgIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoRGVjb3JhdGlvblNlcnZpY2UpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSURlY29yYXRpb25TZXJ2aWNlLCB0aGlzLl9kZWNvcmF0aW9uU2VydmljZSk7XG4gICAgdGhpcy5fbGlua1Byb3ZpZGVyU2VydmljZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKExpbmtQcm92aWRlclNlcnZpY2UpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSUxpbmtQcm92aWRlclNlcnZpY2UsIHRoaXMuX2xpbmtQcm92aWRlclNlcnZpY2UpO1xuICAgIHRoaXMuX2xpbmtQcm92aWRlclNlcnZpY2UucmVnaXN0ZXJMaW5rUHJvdmlkZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoT3NjTGlua1Byb3ZpZGVyKSk7XG5cbiAgICAvLyBTZXR1cCBJbnB1dEhhbmRsZXIgbGlzdGVuZXJzXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25SZXF1ZXN0QmVsbCgoKSA9PiB0aGlzLl9vbkJlbGwuZmlyZSgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25SZXF1ZXN0UmVmcmVzaFJvd3MoKHN0YXJ0LCBlbmQpID0+IHRoaXMucmVmcmVzaChzdGFydCwgZW5kKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uUmVxdWVzdFNlbmRGb2N1cygoKSA9PiB0aGlzLl9yZXBvcnRGb2N1cygpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25SZXF1ZXN0UmVzZXQoKCkgPT4gdGhpcy5yZXNldCgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQodHlwZSA9PiB0aGlzLl9yZXBvcnRXaW5kb3dzT3B0aW9ucyh0eXBlKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uQ29sb3IoKGV2ZW50KSA9PiB0aGlzLl9oYW5kbGVDb2xvckV2ZW50KGV2ZW50KSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX2lucHV0SGFuZGxlci5vbkN1cnNvck1vdmUsIHRoaXMuX29uQ3Vyc29yTW92ZSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX2lucHV0SGFuZGxlci5vblRpdGxlQ2hhbmdlLCB0aGlzLl9vblRpdGxlQ2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5faW5wdXRIYW5kbGVyLm9uQTExeUNoYXIsIHRoaXMuX29uQTExeUNoYXJFbWl0dGVyKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5faW5wdXRIYW5kbGVyLm9uQTExeVRhYiwgdGhpcy5fb25BMTF5VGFiRW1pdHRlcikpO1xuXG4gICAgLy8gU2V0dXAgbGlzdGVuZXJzXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLm9uUmVzaXplKGUgPT4gdGhpcy5fYWZ0ZXJSZXNpemUoZS5jb2xzLCBlLnJvd3MpKSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmVsZW1lbnQ/LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCk7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjb2xvciBldmVudCBmcm9tIGlucHV0aGFuZGxlciBmb3IgT1NDIDR8MTA0IHwgMTB8MTEwIHwgMTF8MTExIHwgMTJ8MTEyLlxuICAgKiBBbiBldmVudCBmcm9tIE9TQyA0fDEwNCBtYXkgY29udGFpbiBtdWx0aXBsZSBzZXQgb3IgcmVwb3J0IHJlcXVlc3RzLCBhbmQgbXVsdGlwbGVcbiAgICogb3Igbm9uZSByZXN0b3JlIHJlcXVlc3RzIChyZXNldHRpbmcgYWxsKSxcbiAgICogd2hpbGUgYW4gZXZlbnQgZnJvbSBPU0MgMTB8MTEwIHwgMTF8MTExIHwgMTJ8MTEyIGFsd2F5cyBjb250YWlucyBhIHNpbmdsZSByZXF1ZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ29sb3JFdmVudChldmVudDogSUNvbG9yRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3RoZW1lU2VydmljZSkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgcmVxIG9mIGV2ZW50KSB7XG4gICAgICBsZXQgYWNjOiAnZm9yZWdyb3VuZCcgfCAnYmFja2dyb3VuZCcgfCAnY3Vyc29yJyB8ICdhbnNpJztcbiAgICAgIGxldCBpZGVudCA9ICcnO1xuICAgICAgc3dpdGNoIChyZXEuaW5kZXgpIHtcbiAgICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5GT1JFR1JPVU5EOiAvLyBPU0MgMTAgfCAxMTBcbiAgICAgICAgICBhY2MgPSAnZm9yZWdyb3VuZCc7XG4gICAgICAgICAgaWRlbnQgPSAnMTAnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkJBQ0tHUk9VTkQ6IC8vIE9TQyAxMSB8IDExMVxuICAgICAgICAgIGFjYyA9ICdiYWNrZ3JvdW5kJztcbiAgICAgICAgICBpZGVudCA9ICcxMSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguQ1VSU09SOiAvLyBPU0MgMTIgfCAxMTJcbiAgICAgICAgICBhY2MgPSAnY3Vyc29yJztcbiAgICAgICAgICBpZGVudCA9ICcxMic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IC8vIE9TQyA0IHwgMTA0XG4gICAgICAgICAgLy8gd2UgY2FuIHNraXAgdGhlIFswLi4yNTVdIHJhbmdlIGNoZWNrIGhlcmUgKGFscmVhZHkgZG9uZSBpbiBpbnB1dGhhbmRsZXIpXG4gICAgICAgICAgYWNjID0gJ2Fuc2knO1xuICAgICAgICAgIGlkZW50ID0gJzQ7JyArIHJlcS5pbmRleDtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAocmVxLnR5cGUpIHtcbiAgICAgICAgY2FzZSBDb2xvclJlcXVlc3RUeXBlLlJFUE9SVDpcbiAgICAgICAgICBjb25zdCBjb2xvclJnYiA9IGNvbG9yLnRvQ29sb3JSR0IoYWNjID09PSAnYW5zaSdcbiAgICAgICAgICAgID8gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW3JlcS5pbmRleF1cbiAgICAgICAgICAgIDogdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9yc1thY2NdKTtcbiAgICAgICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfV0ke2lkZW50fTske3RvUmdiU3RyaW5nKGNvbG9yUmdiKX0ke0MxX0VTQ0FQRUQuU1R9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29sb3JSZXF1ZXN0VHlwZS5TRVQ6XG4gICAgICAgICAgaWYgKGFjYyA9PT0gJ2Fuc2knKSB7XG4gICAgICAgICAgICB0aGlzLl90aGVtZVNlcnZpY2UubW9kaWZ5Q29sb3JzKGNvbG9ycyA9PiBjb2xvcnMuYW5zaVtyZXEuaW5kZXhdID0gY2hhbm5lbHMudG9Db2xvciguLi5yZXEuY29sb3IpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmFycm93ZWRBY2MgPSBhY2M7XG4gICAgICAgICAgICB0aGlzLl90aGVtZVNlcnZpY2UubW9kaWZ5Q29sb3JzKGNvbG9ycyA9PiBjb2xvcnNbbmFycm93ZWRBY2NdID0gY2hhbm5lbHMudG9Db2xvciguLi5yZXEuY29sb3IpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29sb3JSZXF1ZXN0VHlwZS5SRVNUT1JFOlxuICAgICAgICAgIHRoaXMuX3RoZW1lU2VydmljZS5yZXN0b3JlQ29sb3IocmVxLmluZGV4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NldHVwKCk6IHZvaWQge1xuICAgIHN1cGVyLl9zZXR1cCgpO1xuXG4gICAgdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIHByb3BlcnR5IHRvIGFjdGl2ZSBidWZmZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGJ1ZmZlcigpOiBJQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJzLmFjdGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1cyB0aGUgdGVybWluYWwuIERlbGVnYXRlcyBmb2N1cyBoYW5kbGluZyB0byB0aGUgdGVybWluYWwncyBET00gZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50ZXh0YXJlYSkge1xuICAgICAgdGhpcy50ZXh0YXJlYS5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlU2NyZWVuUmVhZGVyTW9kZU9wdGlvbkNoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKCF0aGlzLl9hY2Nlc3NpYmlsaXR5TWFuYWdlci52YWx1ZSAmJiB0aGlzLl9yZW5kZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlNYW5hZ2VyLnZhbHVlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoQWNjZXNzaWJpbGl0eU1hbmFnZXIsIHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5TWFuYWdlci5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgZGVzaXJlZCBmb2N1cyBiZWhhdmlvciBvbiBhIGdpdmVuIHRlcm1pbmFsIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVRleHRBcmVhRm9jdXMoZXY6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuc2VuZEZvY3VzKSB7XG4gICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoQzAuRVNDICsgJ1tJJyk7XG4gICAgfVxuICAgIHRoaXMuZWxlbWVudCEuY2xhc3NMaXN0LmFkZCgnZm9jdXMnKTtcbiAgICB0aGlzLl9zaG93Q3Vyc29yKCk7XG4gICAgdGhpcy5fb25Gb2N1cy5maXJlKCk7XG4gIH1cblxuICAvKipcbiAgICogQmx1ciB0aGUgdGVybWluYWwsIGNhbGxpbmcgdGhlIGJsdXIgZnVuY3Rpb24gb24gdGhlIHRlcm1pbmFsJ3MgdW5kZXJseWluZ1xuICAgKiB0ZXh0YXJlYS5cbiAgICovXG4gIHB1YmxpYyBibHVyKCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLnRleHRhcmVhPy5ibHVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgdGhlIGRlc2lyZWQgYmx1ciBiZWhhdmlvciBvbiBhIGdpdmVuIHRlcm1pbmFsIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVRleHRBcmVhQmx1cigpOiB2b2lkIHtcbiAgICAvLyBUZXh0IGNhbiBzYWZlbHkgYmUgcmVtb3ZlZCBvbiBibHVyLiBEb2luZyBpdCBlYXJsaWVyIGNvdWxkIGludGVyZmVyZSB3aXRoXG4gICAgLy8gc2NyZWVuIHJlYWRlcnMgcmVhZGluZyBpdCBvdXQuXG4gICAgdGhpcy50ZXh0YXJlYSEudmFsdWUgPSAnJztcbiAgICB0aGlzLnJlZnJlc2godGhpcy5idWZmZXIueSwgdGhpcy5idWZmZXIueSk7XG4gICAgaWYgKHRoaXMuY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLnNlbmRGb2N1cykge1xuICAgICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KEMwLkVTQyArICdbTycpO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnQhLmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzJyk7XG4gICAgdGhpcy5fb25CbHVyLmZpcmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNUZXh0QXJlYSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGV4dGFyZWEgfHwgIXRoaXMuYnVmZmVyLmlzQ3Vyc29ySW5WaWV3cG9ydCB8fCB0aGlzLl9jb21wb3NpdGlvbkhlbHBlciEuaXNDb21wb3NpbmcgfHwgIXRoaXMuX3JlbmRlclNlcnZpY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3Vyc29yWSA9IHRoaXMuYnVmZmVyLnliYXNlICsgdGhpcy5idWZmZXIueTtcbiAgICBjb25zdCBidWZmZXJMaW5lID0gdGhpcy5idWZmZXIubGluZXMuZ2V0KGN1cnNvclkpO1xuICAgIGlmICghYnVmZmVyTGluZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJzb3JYID0gTWF0aC5taW4odGhpcy5idWZmZXIueCwgdGhpcy5jb2xzIC0gMSk7XG4gICAgY29uc3QgY2VsbEhlaWdodCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGggPSBidWZmZXJMaW5lLmdldFdpZHRoKGN1cnNvclgpO1xuICAgIGNvbnN0IGNlbGxXaWR0aCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCAqIHdpZHRoO1xuICAgIGNvbnN0IGN1cnNvclRvcCA9IHRoaXMuYnVmZmVyLnkgKiB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0O1xuICAgIGNvbnN0IGN1cnNvckxlZnQgPSBjdXJzb3JYICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoO1xuXG4gICAgLy8gU3luYyB0aGUgdGV4dGFyZWEgdG8gdGhlIGV4YWN0IHBvc2l0aW9uIG9mIHRoZSBjb21wb3NpdGlvbiB2aWV3IHNvIHRoZSBJTUUga25vd3Mgd2hlcmUgdGhlXG4gICAgLy8gdGV4dCBpcy5cbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLmxlZnQgPSBjdXJzb3JMZWZ0ICsgJ3B4JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLnRvcCA9IGN1cnNvclRvcCArICdweCc7XG4gICAgdGhpcy50ZXh0YXJlYS5zdHlsZS53aWR0aCA9IGNlbGxXaWR0aCArICdweCc7XG4gICAgdGhpcy50ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBjZWxsSGVpZ2h0ICsgJ3B4JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLmxpbmVIZWlnaHQgPSBjZWxsSGVpZ2h0ICsgJ3B4JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLnpJbmRleCA9ICctNSc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAqL1xuICBwcml2YXRlIF9pbml0R2xvYmFsKCk6IHZvaWQge1xuICAgIHRoaXMuX2JpbmRLZXlzKCk7XG5cbiAgICAvLyBCaW5kIGNsaXBib2FyZCBmdW5jdGlvbmFsaXR5XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5lbGVtZW50ISwgJ2NvcHknLCAoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvLyBJZiBtb3VzZSBldmVudHMgYXJlIGFjdGl2ZSBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgaXMgZGlzYWJsZWQgYW5kXG4gICAgICAvLyBjb3B5IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSBob3N0IHByb2dyYW0uXG4gICAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29weUhhbmRsZXIoZXZlbnQsIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UhKTtcbiAgICB9KSk7XG4gICAgY29uc3QgcGFzdGVIYW5kbGVyV3JhcHBlciA9IChldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkID0+IGhhbmRsZVBhc3RlRXZlbnQoZXZlbnQsIHRoaXMudGV4dGFyZWEhLCB0aGlzLmNvcmVTZXJ2aWNlLCB0aGlzLm9wdGlvbnNTZXJ2aWNlKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ3Bhc3RlJywgcGFzdGVIYW5kbGVyV3JhcHBlcikpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuZWxlbWVudCEsICdwYXN0ZScsIHBhc3RlSGFuZGxlcldyYXBwZXIpKTtcblxuICAgIC8vIEhhbmRsZSByaWdodCBjbGljayBjb250ZXh0IG1lbnVzXG4gICAgaWYgKEJyb3dzZXIuaXNGaXJlZm94KSB7XG4gICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYXBwZWFyIHRvIGZpcmUgdGhlIGNvbnRleHRtZW51IGV2ZW50IG9uIHJpZ2h0IGNsaWNrXG4gICAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLmVsZW1lbnQhLCAnbW91c2Vkb3duJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgICByaWdodENsaWNrSGFuZGxlcihldmVudCwgdGhpcy50ZXh0YXJlYSEsIHRoaXMuc2NyZWVuRWxlbWVudCEsIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UhLCB0aGlzLm9wdGlvbnMucmlnaHRDbGlja1NlbGVjdHNXb3JkKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLmVsZW1lbnQhLCAnY29udGV4dG1lbnUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgcmlnaHRDbGlja0hhbmRsZXIoZXZlbnQsIHRoaXMudGV4dGFyZWEhLCB0aGlzLnNjcmVlbkVsZW1lbnQhLCB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlISwgdGhpcy5vcHRpb25zLnJpZ2h0Q2xpY2tTZWxlY3RzV29yZCk7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gTW92ZSB0aGUgdGV4dGFyZWEgdW5kZXIgdGhlIGN1cnNvciB3aGVuIG1pZGRsZSBjbGlja2luZyBvbiBMaW51eCB0byBlbnN1cmVcbiAgICAvLyBtaWRkbGUgY2xpY2sgdG8gcGFzdGUgc2VsZWN0aW9uIHdvcmtzLiBUaGlzIG9ubHkgYXBwZWFycyB0byB3b3JrIGluIENocm9tZVxuICAgIC8vIGF0IHRoZSB0aW1lIGlzIHdyaXRpbmcuXG4gICAgaWYgKEJyb3dzZXIuaXNMaW51eCkge1xuICAgICAgLy8gVXNlIGF1eGNsaWNrIGV2ZW50IG92ZXIgbW91c2Vkb3duIHRoZSBsYXR0ZXIgZG9lc24ndCBzZWVtIHRvIHdvcmsuIE5vdGVcbiAgICAgIC8vIHRoYXQgdGhlIHJlZ3VsYXIgY2xpY2sgZXZlbnQgZG9lc24ndCBmaXJlIGZvciB0aGUgbWlkZGxlIG1vdXNlIGJ1dHRvbi5cbiAgICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuZWxlbWVudCEsICdhdXhjbGljaycsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAxKSB7XG4gICAgICAgICAgbW92ZVRleHRBcmVhVW5kZXJNb3VzZUN1cnNvcihldmVudCwgdGhpcy50ZXh0YXJlYSEsIHRoaXMuc2NyZWVuRWxlbWVudCEpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGtleSBoYW5kbGluZyB0byB0aGUgdGVybWluYWxcbiAgICovXG4gIHByaXZhdGUgX2JpbmRLZXlzKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMudGV4dGFyZWEhLCAna2V5dXAnLCAoZXY6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX2tleVVwKGV2KSwgdHJ1ZSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMudGV4dGFyZWEhLCAna2V5ZG93bicsIChldjogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5fa2V5RG93bihldiksIHRydWUpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ2tleXByZXNzJywgKGV2OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9rZXlQcmVzcyhldiksIHRydWUpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ2NvbXBvc2l0aW9uc3RhcnQnLCAoKSA9PiB0aGlzLl9jb21wb3NpdGlvbkhlbHBlciEuY29tcG9zaXRpb25zdGFydCgpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy50ZXh0YXJlYSEsICdjb21wb3NpdGlvbnVwZGF0ZScsIChlOiBDb21wb3NpdGlvbkV2ZW50KSA9PiB0aGlzLl9jb21wb3NpdGlvbkhlbHBlciEuY29tcG9zaXRpb251cGRhdGUoZSkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ2NvbXBvc2l0aW9uZW5kJywgKCkgPT4gdGhpcy5fY29tcG9zaXRpb25IZWxwZXIhLmNvbXBvc2l0aW9uZW5kKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ2lucHV0JywgKGV2OiBJbnB1dEV2ZW50KSA9PiB0aGlzLl9pbnB1dEV2ZW50KGV2KSwgdHJ1ZSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5vblJlbmRlcigoKSA9PiB0aGlzLl9jb21wb3NpdGlvbkhlbHBlciEudXBkYXRlQ29tcG9zaXRpb25FbGVtZW50cygpKSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIHRlcm1pbmFsIHdpdGhpbiBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyZW50IFRoZSBlbGVtZW50IHRvIGNyZWF0ZSB0aGUgdGVybWluYWwgd2l0aGluLlxuICAgKi9cbiAgcHVibGljIG9wZW4ocGFyZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rlcm1pbmFsIHJlcXVpcmVzIGEgcGFyZW50IGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1Rlcm1pbmFsLm9wZW4gd2FzIGNhbGxlZCBvbiBhbiBlbGVtZW50IHRoYXQgd2FzIG5vdCBhdHRhY2hlZCB0byB0aGUgRE9NJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHRlcm1pbmFsIGlzIGFscmVhZHkgb3BlbmVkXG4gICAgaWYgKHRoaXMuZWxlbWVudD8ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UpIHtcbiAgICAgIC8vIEFkanVzdCB0aGUgd2luZG93IGlmIG5lZWRlZFxuICAgICAgaWYgKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICE9PSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93KSB7XG4gICAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cgPSB0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9kb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZG9jdW1lbnRPdmVycmlkZSAmJiB0aGlzLm9wdGlvbnMuZG9jdW1lbnRPdmVycmlkZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICB0aGlzLl9kb2N1bWVudCA9IHRoaXMub3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5kb2N1bWVudE92ZXJyaWRlIGFzIERvY3VtZW50O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBtYWluIGVsZW1lbnQgY29udGFpbmVyXG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5lbGVtZW50LmRpciA9ICdsdHInOyAgIC8vIHh0ZXJtLmNzcyBhc3N1bWVzIExUUlxuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0ZXJtaW5hbCcpO1xuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd4dGVybScpO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xuXG4gICAgLy8gUGVyZm9ybWFuY2U6IFVzZSBhIGRvY3VtZW50IGZyYWdtZW50IHRvIGJ1aWxkIHRoZSB0ZXJtaW5hbFxuICAgIC8vIHZpZXdwb3J0IGFuZCBoZWxwZXIgZWxlbWVudHMgZGV0YWNoZWQgZnJvbSB0aGUgRE9NXG4gICAgY29uc3QgZnJhZ21lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgdGhpcy5fdmlld3BvcnRFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fdmlld3BvcnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLXZpZXdwb3J0Jyk7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdmlld3BvcnRFbGVtZW50KTtcblxuICAgIHRoaXMuX3ZpZXdwb3J0U2Nyb2xsQXJlYSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX3ZpZXdwb3J0U2Nyb2xsQXJlYS5jbGFzc0xpc3QuYWRkKCd4dGVybS1zY3JvbGwtYXJlYScpO1xuICAgIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl92aWV3cG9ydFNjcm9sbEFyZWEpO1xuXG4gICAgdGhpcy5zY3JlZW5FbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5zY3JlZW5FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLXNjcmVlbicpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuc2NyZWVuRWxlbWVudCwgJ21vdXNlbW92ZScsIChldjogTW91c2VFdmVudCkgPT4gdGhpcy51cGRhdGVDdXJzb3JTdHlsZShldikpKTtcbiAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lciB0aGF0IHdpbGwgaG9sZCBoZWxwZXJzIGxpa2UgdGhlIHRleHRhcmVhIGZvclxuICAgIC8vIGNhcHR1cmluZyBET00gRXZlbnRzLiBUaGVuIHByb2R1Y2UgdGhlIGhlbHBlcnMuXG4gICAgdGhpcy5faGVscGVyQ29udGFpbmVyID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5faGVscGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWhlbHBlcnMnKTtcbiAgICB0aGlzLnNjcmVlbkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faGVscGVyQ29udGFpbmVyKTtcbiAgICBmcmFnbWVudC5hcHBlbmRDaGlsZCh0aGlzLnNjcmVlbkVsZW1lbnQpO1xuXG4gICAgdGhpcy50ZXh0YXJlYSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdGhpcy50ZXh0YXJlYS5jbGFzc0xpc3QuYWRkKCd4dGVybS1oZWxwZXItdGV4dGFyZWEnKTtcbiAgICB0aGlzLnRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIFN0cmluZ3MucHJvbXB0TGFiZWwpO1xuICAgIGlmICghQnJvd3Nlci5pc0Nocm9tZU9TKSB7XG4gICAgICAvLyBDaHJvbWVWb3ggb24gQ2hyb21lT1MgZG9lcyBub3QgbGlrZSB0aGlzLiBTZWVcbiAgICAgIC8vIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vaXNzdWVzLzI2MDE3MDM5N1xuICAgICAgdGhpcy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ2FyaWEtbXVsdGlsaW5lJywgJ2ZhbHNlJyk7XG4gICAgfVxuICAgIHRoaXMudGV4dGFyZWEuc2V0QXR0cmlidXRlKCdhdXRvY29ycmVjdCcsICdvZmYnKTtcbiAgICB0aGlzLnRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXV0b2NhcGl0YWxpemUnLCAnb2ZmJyk7XG4gICAgdGhpcy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3NwZWxsY2hlY2snLCAnZmFsc2UnKTtcbiAgICB0aGlzLnRleHRhcmVhLnRhYkluZGV4ID0gMDtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBjb3JlIGJyb3dzZXIgc2VydmljZSBiZWZvcmUgdGhlIGdlbmVyaWMgdGV4dGFyZWEgaGFuZGxlcnMgYXJlIHJlZ2lzdGVyZWQgc28gaXRcbiAgICAvLyBoYW5kbGVzIHRoZW0gZmlyc3QuIE90aGVyd2lzZSB0aGUgcmVuZGVyZXJzIG1heSB1c2UgdGhlIHdyb25nIGZvY3VzIHN0YXRlLlxuICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgICAgdGhpcy50ZXh0YXJlYSxcbiAgICAgIHBhcmVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ID8/IHdpbmRvdyxcbiAgICAgIC8vIEZvcmNlIHVuc2FmZSBudWxsIGluIG5vZGUuanMgZW52aXJvbm1lbnQgZm9yIHRlc3RzXG4gICAgICB0aGlzLl9kb2N1bWVudCA/PyAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpID8gd2luZG93LmRvY3VtZW50IDogbnVsbCBhcyBhbnlcbiAgICApKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElDb3JlQnJvd3NlclNlcnZpY2UsIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhLCAnZm9jdXMnLCAoZXY6IEZvY3VzRXZlbnQpID0+IHRoaXMuX2hhbmRsZVRleHRBcmVhRm9jdXMoZXYpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy50ZXh0YXJlYSwgJ2JsdXInLCAoKSA9PiB0aGlzLl9oYW5kbGVUZXh0QXJlYUJsdXIoKSkpO1xuICAgIHRoaXMuX2hlbHBlckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnRleHRhcmVhKTtcblxuICAgIHRoaXMuX2NoYXJTaXplU2VydmljZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKENoYXJTaXplU2VydmljZSwgdGhpcy5fZG9jdW1lbnQsIHRoaXMuX2hlbHBlckNvbnRhaW5lcik7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQ2hhclNpemVTZXJ2aWNlLCB0aGlzLl9jaGFyU2l6ZVNlcnZpY2UpO1xuXG4gICAgdGhpcy5fdGhlbWVTZXJ2aWNlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoVGhlbWVTZXJ2aWNlKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElUaGVtZVNlcnZpY2UsIHRoaXMuX3RoZW1lU2VydmljZSk7XG5cbiAgICB0aGlzLl9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoQ2hhcmFjdGVySm9pbmVyU2VydmljZSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQ2hhcmFjdGVySm9pbmVyU2VydmljZSwgdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZSk7XG5cbiAgICB0aGlzLl9yZW5kZXJTZXJ2aWNlID0gdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShSZW5kZXJTZXJ2aWNlLCB0aGlzLnJvd3MsIHRoaXMuc2NyZWVuRWxlbWVudCkpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSVJlbmRlclNlcnZpY2UsIHRoaXMuX3JlbmRlclNlcnZpY2UpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyU2VydmljZS5vblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UoZSA9PiB0aGlzLl9vblJlbmRlci5maXJlKGUpKSk7XG4gICAgdGhpcy5vblJlc2l6ZShlID0+IHRoaXMuX3JlbmRlclNlcnZpY2UhLnJlc2l6ZShlLmNvbHMsIGUucm93cykpO1xuXG4gICAgdGhpcy5fY29tcG9zaXRpb25WaWV3ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fY29tcG9zaXRpb25WaWV3LmNsYXNzTGlzdC5hZGQoJ2NvbXBvc2l0aW9uLXZpZXcnKTtcbiAgICB0aGlzLl9jb21wb3NpdGlvbkhlbHBlciA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKENvbXBvc2l0aW9uSGVscGVyLCB0aGlzLnRleHRhcmVhLCB0aGlzLl9jb21wb3NpdGlvblZpZXcpO1xuICAgIHRoaXMuX2hlbHBlckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jb21wb3NpdGlvblZpZXcpO1xuXG4gICAgdGhpcy5fbW91c2VTZXJ2aWNlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoTW91c2VTZXJ2aWNlKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElNb3VzZVNlcnZpY2UsIHRoaXMuX21vdXNlU2VydmljZSk7XG5cbiAgICB0aGlzLmxpbmtpZmllciA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoTGlua2lmaWVyLCB0aGlzLnNjcmVlbkVsZW1lbnQpKTtcblxuICAgIC8vIFBlcmZvcm1hbmNlOiBBZGQgdmlld3BvcnQgYW5kIGhlbHBlciBlbGVtZW50cyBmcm9tIHRoZSBmcmFnbWVudFxuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fb25XaWxsT3Blbi5maXJlKHRoaXMuZWxlbWVudCk7XG4gICAgfVxuICAgIGNhdGNoIHsgLyogZmFpbHMgdG8gbG9hZCBhZGRvbiBmb3Igc29tZSByZWFzb24gKi8gfVxuICAgIGlmICghdGhpcy5fcmVuZGVyU2VydmljZS5oYXNSZW5kZXJlcigpKSB7XG4gICAgICB0aGlzLl9yZW5kZXJTZXJ2aWNlLnNldFJlbmRlcmVyKHRoaXMuX2NyZWF0ZVJlbmRlcmVyKCkpO1xuICAgIH1cblxuICAgIHRoaXMudmlld3BvcnQgPSB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShWaWV3cG9ydCwgdGhpcy5fdmlld3BvcnRFbGVtZW50LCB0aGlzLl92aWV3cG9ydFNjcm9sbEFyZWEpO1xuICAgIHRoaXMudmlld3BvcnQub25SZXF1ZXN0U2Nyb2xsTGluZXMoZSA9PiB0aGlzLnNjcm9sbExpbmVzKGUuYW1vdW50LCBlLnN1cHByZXNzU2Nyb2xsRXZlbnQsIFNjcm9sbFNvdXJjZS5WSUVXUE9SVCkpLFxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uUmVxdWVzdFN5bmNTY3JvbGxCYXIoKCkgPT4gdGhpcy52aWV3cG9ydCEuc3luY1Njcm9sbEFyZWEoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy52aWV3cG9ydCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMub25DdXJzb3JNb3ZlKCgpID0+IHtcbiAgICAgIHRoaXMuX3JlbmRlclNlcnZpY2UhLmhhbmRsZUN1cnNvck1vdmUoKTtcbiAgICAgIHRoaXMuX3N5bmNUZXh0QXJlYSgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMub25SZXNpemUoKCkgPT4gdGhpcy5fcmVuZGVyU2VydmljZSEuaGFuZGxlUmVzaXplKHRoaXMuY29scywgdGhpcy5yb3dzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5vbkJsdXIoKCkgPT4gdGhpcy5fcmVuZGVyU2VydmljZSEuaGFuZGxlQmx1cigpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLm9uRm9jdXMoKCkgPT4gdGhpcy5fcmVuZGVyU2VydmljZSEuaGFuZGxlRm9jdXMoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyU2VydmljZS5vbkRpbWVuc2lvbnNDaGFuZ2UoKCkgPT4gdGhpcy52aWV3cG9ydCEuc3luY1Njcm9sbEFyZWEoKSkpO1xuXG4gICAgdGhpcy5fc2VsZWN0aW9uU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoU2VsZWN0aW9uU2VydmljZSxcbiAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgIHRoaXMuc2NyZWVuRWxlbWVudCxcbiAgICAgIHRoaXMubGlua2lmaWVyXG4gICAgKSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJU2VsZWN0aW9uU2VydmljZSwgdGhpcy5fc2VsZWN0aW9uU2VydmljZSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLm9uUmVxdWVzdFNjcm9sbExpbmVzKGUgPT4gdGhpcy5zY3JvbGxMaW5lcyhlLmFtb3VudCwgZS5zdXBwcmVzc1Njcm9sbEV2ZW50KSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fc2VsZWN0aW9uU2VydmljZS5vblNlbGVjdGlvbkNoYW5nZSgoKSA9PiB0aGlzLl9vblNlbGVjdGlvbkNoYW5nZS5maXJlKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3NlbGVjdGlvblNlcnZpY2Uub25SZXF1ZXN0UmVkcmF3KGUgPT4gdGhpcy5fcmVuZGVyU2VydmljZSEuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChlLnN0YXJ0LCBlLmVuZCwgZS5jb2x1bW5TZWxlY3RNb2RlKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fc2VsZWN0aW9uU2VydmljZS5vbkxpbnV4TW91c2VTZWxlY3Rpb24odGV4dCA9PiB7XG4gICAgICAvLyBJZiB0aGVyZSdzIGEgbmV3IHNlbGVjdGlvbiwgcHV0IGl0IGludG8gdGhlIHRleHRhcmVhLCBmb2N1cyBhbmQgc2VsZWN0IGl0XG4gICAgICAvLyBpbiBvcmRlciB0byByZWdpc3RlciBpdCBhcyBhIHNlbGVjdGlvbiBvbiB0aGUgT1MuIFRoaXMgZXZlbnQgaXMgZmlyZWRcbiAgICAgIC8vIG9ubHkgb24gTGludXggdG8gZW5hYmxlIG1pZGRsZSBjbGljayB0byBwYXN0ZSBzZWxlY3Rpb24uXG4gICAgICB0aGlzLnRleHRhcmVhIS52YWx1ZSA9IHRleHQ7XG4gICAgICB0aGlzLnRleHRhcmVhIS5mb2N1cygpO1xuICAgICAgdGhpcy50ZXh0YXJlYSEuc2VsZWN0KCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb25TY3JvbGwuZXZlbnQoZXYgPT4ge1xuICAgICAgdGhpcy52aWV3cG9ydCEuc3luY1Njcm9sbEFyZWEoKTtcbiAgICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UhLnJlZnJlc2goKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5fdmlld3BvcnRFbGVtZW50LCAnc2Nyb2xsJywgKCkgPT4gdGhpcy5fc2VsZWN0aW9uU2VydmljZSEucmVmcmVzaCgpKSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKEJ1ZmZlckRlY29yYXRpb25SZW5kZXJlciwgdGhpcy5zY3JlZW5FbGVtZW50KSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5lbGVtZW50LCAnbW91c2Vkb3duJywgKGU6IE1vdXNlRXZlbnQpID0+IHRoaXMuX3NlbGVjdGlvblNlcnZpY2UhLmhhbmRsZU1vdXNlRG93bihlKSkpO1xuXG4gICAgLy8gYXBwbHkgbW91c2UgZXZlbnQgY2xhc3NlcyBzZXQgYnkgZXNjYXBlIGNvZGVzIGJlZm9yZSB0ZXJtaW5hbCB3YXMgYXR0YWNoZWRcbiAgICBpZiAodGhpcy5jb3JlTW91c2VTZXJ2aWNlLmFyZU1vdXNlRXZlbnRzQWN0aXZlKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLmRpc2FibGUoKTtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdlbmFibGUtbW91c2UtZXZlbnRzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UuZW5hYmxlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zY3JlZW5SZWFkZXJNb2RlKSB7XG4gICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtdXN0IGJlIGRvbmUgKmFmdGVyKiB0aGUgcmVuZGVyZXIgaXMgY3JlYXRlZCBpbiBvcmRlciB0b1xuICAgICAgLy8gZW5zdXJlIHRoZSBjb3JyZWN0IG9yZGVyIG9mIHRoZSBkcHJjaGFuZ2UgZXZlbnRcbiAgICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlNYW5hZ2VyLnZhbHVlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoQWNjZXNzaWJpbGl0eU1hbmFnZXIsIHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMub3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgnc2NyZWVuUmVhZGVyTW9kZScsIGUgPT4gdGhpcy5faGFuZGxlU2NyZWVuUmVhZGVyTW9kZU9wdGlvbkNoYW5nZShlKSkpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vdmVydmlld1J1bGVyV2lkdGgpIHtcbiAgICAgIHRoaXMuX292ZXJ2aWV3UnVsZXJSZW5kZXJlciA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoT3ZlcnZpZXdSdWxlclJlbmRlcmVyLCB0aGlzLl92aWV3cG9ydEVsZW1lbnQsIHRoaXMuc2NyZWVuRWxlbWVudCkpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ292ZXJ2aWV3UnVsZXJXaWR0aCcsIHZhbHVlID0+IHtcbiAgICAgIGlmICghdGhpcy5fb3ZlcnZpZXdSdWxlclJlbmRlcmVyICYmIHZhbHVlICYmIHRoaXMuX3ZpZXdwb3J0RWxlbWVudCAmJiB0aGlzLnNjcmVlbkVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5fb3ZlcnZpZXdSdWxlclJlbmRlcmVyID0gdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShPdmVydmlld1J1bGVyUmVuZGVyZXIsIHRoaXMuX3ZpZXdwb3J0RWxlbWVudCwgdGhpcy5zY3JlZW5FbGVtZW50KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gTWVhc3VyZSB0aGUgY2hhcmFjdGVyIHNpemVcbiAgICB0aGlzLl9jaGFyU2l6ZVNlcnZpY2UubWVhc3VyZSgpO1xuXG4gICAgLy8gU2V0dXAgbG9vcCB0aGF0IGRyYXdzIHRvIHNjcmVlblxuICAgIHRoaXMucmVmcmVzaCgwLCB0aGlzLnJvd3MgLSAxKTtcblxuICAgIC8vIEluaXRpYWxpemUgZ2xvYmFsIGFjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHRha2VuIG9uIHRoZSBkb2N1bWVudC5cbiAgICB0aGlzLl9pbml0R2xvYmFsKCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIG1vdXNlIGV2ZW50cyBhbmQgdHJhbnNsYXRlXG4gICAgLy8gdGhlbSBpbnRvIHRlcm1pbmFsIG1vdXNlIHByb3RvY29scy5cbiAgICB0aGlzLmJpbmRNb3VzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlUmVuZGVyZXIoKTogSVJlbmRlcmVyIHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoRG9tUmVuZGVyZXIsIHRoaXMsIHRoaXMuX2RvY3VtZW50ISwgdGhpcy5lbGVtZW50ISwgdGhpcy5zY3JlZW5FbGVtZW50ISwgdGhpcy5fdmlld3BvcnRFbGVtZW50ISwgdGhpcy5faGVscGVyQ29udGFpbmVyISwgdGhpcy5saW5raWZpZXIhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kIGNlcnRhaW4gbW91c2UgZXZlbnRzIHRvIHRoZSB0ZXJtaW5hbC5cbiAgICogQnkgZGVmYXVsdCBvbmx5IDMgYnV0dG9uICsgd2hlZWwgdXAvZG93biBpcyBhdGl2YXRlZC4gRm9yIGhpZ2hlciBidXR0b25zXG4gICAqIG5vIG1vdXNlIHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQuIFR5cGljYWxseSB0aGUgc3RhbmRhcmQgYWN0aW9ucyB3aWxsIGJlIGFjdGl2ZS5cbiAgICpcbiAgICogVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyBub3QgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGhpZ2hlciBidXR0b25zL3doZWVsOlxuICAgKiAtIEJ1dHRvbiA0IGFuZCA1IGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgaGlzdG9yeSBiYWNrIGFuZCBmb3J3YXJkIG5hdmlnYXRpb24sXG4gICAqICAgdGhlcmUgaXMgbm8gc3RyYWlnaHQgZm9yd2FyZCB3YXkgdG8gc3VwcmVzcy9pbnRlcmNlcHQgdGhvc2Ugc3RhbmRhcmQgYWN0aW9ucy5cbiAgICogLSBTdXBwb3J0IGZvciBoaWdoZXIgYnV0dG9ucyBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0vYnJvd3NlciBjb21iaW5hdGlvbnMuXG4gICAqIC0gTGVmdC9yaWdodCB3aGVlbCB3YXMgbm90IHRlc3RlZC5cbiAgICogLSBFbXVsYXRvcnMgdmFyeSBpbiBtb3VzZSBidXR0b24gc3VwcG9ydCwgdHlwaWNhbGx5IG9ubHkgMyBidXR0b25zIGFuZFxuICAgKiAgIHdoZWVsIHVwL2Rvd24gd29yayByZWxpYWJsZS5cbiAgICpcbiAgICogVE9ETzogTW92ZSBtb3VzZSBldmVudCBjb2RlIGludG8gaXRzIG93biBmaWxlLlxuICAgKi9cbiAgcHVibGljIGJpbmRNb3VzZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudCE7XG5cbiAgICAvLyBzZW5kIGV2ZW50IHRvIENvcmVNb3VzZVNlcnZpY2VcbiAgICBmdW5jdGlvbiBzZW5kRXZlbnQoZXY6IE1vdXNlRXZlbnQgfCBXaGVlbEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAvLyBnZXQgbW91c2UgY29vcmRpbmF0ZXNcbiAgICAgIGNvbnN0IHBvcyA9IHNlbGYuX21vdXNlU2VydmljZSEuZ2V0TW91c2VSZXBvcnRDb29yZHMoZXYsIHNlbGYuc2NyZWVuRWxlbWVudCEpO1xuICAgICAgaWYgKCFwb3MpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgYnV0OiBDb3JlTW91c2VCdXR0b247XG4gICAgICBsZXQgYWN0aW9uOiBDb3JlTW91c2VBY3Rpb24gfCB1bmRlZmluZWQ7XG4gICAgICBzd2l0Y2ggKChldiBhcyBhbnkpLm92ZXJyaWRlVHlwZSB8fCBldi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgICAgICAgYWN0aW9uID0gQ29yZU1vdXNlQWN0aW9uLk1PVkU7XG4gICAgICAgICAgaWYgKGV2LmJ1dHRvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gYnV0dG9ucyBpcyBub3Qgc3VwcG9ydGVkIG9uIG1hY09TLCB0cnkgdG8gZ2V0IGEgdmFsdWUgZnJvbSBidXR0b24gaW5zdGVhZFxuICAgICAgICAgICAgYnV0ID0gQ29yZU1vdXNlQnV0dG9uLk5PTkU7XG4gICAgICAgICAgICBpZiAoZXYuYnV0dG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgYnV0ID0gZXYuYnV0dG9uIDwgMyA/IGV2LmJ1dHRvbiA6IENvcmVNb3VzZUJ1dHRvbi5OT05FO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gTUROIGJ1dHRvbnMgb25seSByZXBvcnRzIHVwIHRvIGJ1dHRvbiA1IChBVVgyKVxuICAgICAgICAgICAgYnV0ID0gZXYuYnV0dG9ucyAmIDEgPyBDb3JlTW91c2VCdXR0b24uTEVGVCA6XG4gICAgICAgICAgICAgIGV2LmJ1dHRvbnMgJiA0ID8gQ29yZU1vdXNlQnV0dG9uLk1JRERMRSA6XG4gICAgICAgICAgICAgICAgZXYuYnV0dG9ucyAmIDIgPyBDb3JlTW91c2VCdXR0b24uUklHSFQgOlxuICAgICAgICAgICAgICAgICAgQ29yZU1vdXNlQnV0dG9uLk5PTkU7IC8vIGZhbGxiYWNrIHRvIE5PTkVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vdXNldXAnOlxuICAgICAgICAgIGFjdGlvbiA9IENvcmVNb3VzZUFjdGlvbi5VUDtcbiAgICAgICAgICBidXQgPSBldi5idXR0b24gPCAzID8gZXYuYnV0dG9uIDogQ29yZU1vdXNlQnV0dG9uLk5PTkU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICAgICAgYWN0aW9uID0gQ29yZU1vdXNlQWN0aW9uLkRPV047XG4gICAgICAgICAgYnV0ID0gZXYuYnV0dG9uIDwgMyA/IGV2LmJ1dHRvbiA6IENvcmVNb3VzZUJ1dHRvbi5OT05FO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd3aGVlbCc6XG4gICAgICAgICAgaWYgKHNlbGYuX2N1c3RvbVdoZWVsRXZlbnRIYW5kbGVyICYmIHNlbGYuX2N1c3RvbVdoZWVsRXZlbnRIYW5kbGVyKGV2IGFzIFdoZWVsRXZlbnQpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhbW91bnQgPSBzZWxmLnZpZXdwb3J0IS5nZXRMaW5lc1Njcm9sbGVkKGV2IGFzIFdoZWVsRXZlbnQpO1xuXG4gICAgICAgICAgaWYgKGFtb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjdGlvbiA9IChldiBhcyBXaGVlbEV2ZW50KS5kZWx0YVkgPCAwID8gQ29yZU1vdXNlQWN0aW9uLlVQIDogQ29yZU1vdXNlQWN0aW9uLkRPV047XG4gICAgICAgICAgYnV0ID0gQ29yZU1vdXNlQnV0dG9uLldIRUVMO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGRvbnQgaGFuZGxlIG90aGVyIGV2ZW50IHR5cGVzIGJ5IGFjY2lkZW50XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBleGl0IGlmIHdlIGNhbm5vdCBkZXRlcm1pbmUgdmFsaWQgYnV0dG9uL2FjdGlvbiB2YWx1ZXNcbiAgICAgIC8vIGRvIG5vdGhpbmcgZm9yIGhpZ2hlciBidXR0b25zIHRoYW4gd2hlZWxcbiAgICAgIGlmIChhY3Rpb24gPT09IHVuZGVmaW5lZCB8fCBidXQgPT09IHVuZGVmaW5lZCB8fCBidXQgPiBDb3JlTW91c2VCdXR0b24uV0hFRUwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi5jb3JlTW91c2VTZXJ2aWNlLnRyaWdnZXJNb3VzZUV2ZW50KHtcbiAgICAgICAgY29sOiBwb3MuY29sLFxuICAgICAgICByb3c6IHBvcy5yb3csXG4gICAgICAgIHg6IHBvcy54LFxuICAgICAgICB5OiBwb3MueSxcbiAgICAgICAgYnV0dG9uOiBidXQsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY3RybDogZXYuY3RybEtleSxcbiAgICAgICAgYWx0OiBldi5hbHRLZXksXG4gICAgICAgIHNoaWZ0OiBldi5zaGlmdEtleVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgbGlzdGVuZXIgc3RhdGUgaGFuZGxpbmcuXG4gICAgICogV2UgbGlzdGVuIHRvIHRoZSBvblByb3RvY29sQ2hhbmdlIGV2ZW50IG9mIENvcmVNb3VzZVNlcnZpY2UgYW5kIHB1dFxuICAgICAqIHJlcXVlc3RlZCBsaXN0ZW5lcnMgaW4gYHJlcXVlc3RlZEV2ZW50c2AuIFdpdGggdGhpcyB0aGUgbGlzdGVuZXJzXG4gICAgICogaGF2ZSBhbGwgYml0cyB0byBkbyB0aGUgZXZlbnQgbGlzdGVuZXIganVnZ2xpbmcuXG4gICAgICogTm90ZTogJ21vdXNlZG93bicgY3VycmVudGx5IGlzIFwiYWx3YXlzIG9uXCIgYW5kIG5vdCBtYW5hZ2VkXG4gICAgICogYnkgb25Qcm90b2NvbENoYW5nZS5cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0ZWRFdmVudHM6IHsgW2tleTogc3RyaW5nXTogKChldjogRXZlbnQpID0+IHZvaWQpIHwgbnVsbCB9ID0ge1xuICAgICAgbW91c2V1cDogbnVsbCxcbiAgICAgIHdoZWVsOiBudWxsLFxuICAgICAgbW91c2VkcmFnOiBudWxsLFxuICAgICAgbW91c2Vtb3ZlOiBudWxsXG4gICAgfTtcbiAgICBjb25zdCBldmVudExpc3RlbmVyczogeyBba2V5OiBzdHJpbmddOiAoZXY6IGFueSkgPT4gdm9pZCB8IGJvb2xlYW4gfSA9IHtcbiAgICAgIG1vdXNldXA6IChldjogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBzZW5kRXZlbnQoZXYpO1xuICAgICAgICBpZiAoIWV2LmJ1dHRvbnMpIHtcbiAgICAgICAgICAvLyBpZiBubyBvdGhlciBidXR0b24gaXMgaGVsZCByZW1vdmUgZ2xvYmFsIGhhbmRsZXJzXG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCByZXF1ZXN0ZWRFdmVudHMubW91c2V1cCEpO1xuICAgICAgICAgIGlmIChyZXF1ZXN0ZWRFdmVudHMubW91c2VkcmFnKSB7XG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudCEucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgcmVxdWVzdGVkRXZlbnRzLm1vdXNlZHJhZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhbmNlbChldik7XG4gICAgICB9LFxuICAgICAgd2hlZWw6IChldjogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgICBzZW5kRXZlbnQoZXYpO1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXYsIHRydWUpO1xuICAgICAgfSxcbiAgICAgIG1vdXNlZHJhZzogKGV2OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIGRlYWwgb25seSB3aXRoIG1vdmUgd2hpbGUgYSBidXR0b24gaXMgaGVsZFxuICAgICAgICBpZiAoZXYuYnV0dG9ucykge1xuICAgICAgICAgIHNlbmRFdmVudChldik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBtb3VzZW1vdmU6IChldjogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAvLyBkZWFsIG9ubHkgd2l0aCBtb3ZlIHdpdGhvdXQgYW55IGJ1dHRvblxuICAgICAgICBpZiAoIWV2LmJ1dHRvbnMpIHtcbiAgICAgICAgICBzZW5kRXZlbnQoZXYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuY29yZU1vdXNlU2VydmljZS5vblByb3RvY29sQ2hhbmdlKGV2ZW50cyA9PiB7XG4gICAgICAvLyBhcHBseSBnbG9iYWwgY2hhbmdlcyBvbiBldmVudHNcbiAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sb2dMZXZlbCA9PT0gJ2RlYnVnJykge1xuICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ0JpbmRpbmcgdG8gbW91c2UgZXZlbnRzOicsIHRoaXMuY29yZU1vdXNlU2VydmljZS5leHBsYWluRXZlbnRzKGV2ZW50cykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudCEuY2xhc3NMaXN0LmFkZCgnZW5hYmxlLW1vdXNlLWV2ZW50cycpO1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlIS5kaXNhYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdVbmJpbmRpbmcgZnJvbSBtb3VzZSBldmVudHMuJyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCEuY2xhc3NMaXN0LnJlbW92ZSgnZW5hYmxlLW1vdXNlLWV2ZW50cycpO1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlIS5lbmFibGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkL3JlbW92ZSBoYW5kbGVycyBmcm9tIHJlcXVlc3RlZEV2ZW50c1xuXG4gICAgICBpZiAoIShldmVudHMgJiBDb3JlTW91c2VFdmVudFR5cGUuTU9WRSkpIHtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgcmVxdWVzdGVkRXZlbnRzLm1vdXNlbW92ZSEpO1xuICAgICAgICByZXF1ZXN0ZWRFdmVudHMubW91c2Vtb3ZlID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoIXJlcXVlc3RlZEV2ZW50cy5tb3VzZW1vdmUpIHtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZXZlbnRMaXN0ZW5lcnMubW91c2Vtb3ZlKTtcbiAgICAgICAgcmVxdWVzdGVkRXZlbnRzLm1vdXNlbW92ZSA9IGV2ZW50TGlzdGVuZXJzLm1vdXNlbW92ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoZXZlbnRzICYgQ29yZU1vdXNlRXZlbnRUeXBlLldIRUVMKSkge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHJlcXVlc3RlZEV2ZW50cy53aGVlbCEpO1xuICAgICAgICByZXF1ZXN0ZWRFdmVudHMud2hlZWwgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICghcmVxdWVzdGVkRXZlbnRzLndoZWVsKSB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgZXZlbnRMaXN0ZW5lcnMud2hlZWwsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgICAgIHJlcXVlc3RlZEV2ZW50cy53aGVlbCA9IGV2ZW50TGlzdGVuZXJzLndoZWVsO1xuICAgICAgfVxuXG4gICAgICBpZiAoIShldmVudHMgJiBDb3JlTW91c2VFdmVudFR5cGUuVVApKSB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50IS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgcmVxdWVzdGVkRXZlbnRzLm1vdXNldXAhKTtcbiAgICAgICAgcmVxdWVzdGVkRXZlbnRzLm1vdXNldXAgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICghcmVxdWVzdGVkRXZlbnRzLm1vdXNldXApIHtcbiAgICAgICAgcmVxdWVzdGVkRXZlbnRzLm1vdXNldXAgPSBldmVudExpc3RlbmVycy5tb3VzZXVwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIShldmVudHMgJiBDb3JlTW91c2VFdmVudFR5cGUuRFJBRykpIHtcbiAgICAgICAgdGhpcy5fZG9jdW1lbnQhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHJlcXVlc3RlZEV2ZW50cy5tb3VzZWRyYWchKTtcbiAgICAgICAgcmVxdWVzdGVkRXZlbnRzLm1vdXNlZHJhZyA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCFyZXF1ZXN0ZWRFdmVudHMubW91c2VkcmFnKSB7XG4gICAgICAgIHJlcXVlc3RlZEV2ZW50cy5tb3VzZWRyYWcgPSBldmVudExpc3RlbmVycy5tb3VzZWRyYWc7XG4gICAgICB9XG4gICAgfSkpO1xuICAgIC8vIGZvcmNlIGluaXRpYWwgb25Qcm90b2NvbENoYW5nZSBzbyB3ZSBkb250IG1pc3MgZWFybHkgbW91c2UgcmVxdWVzdHNcbiAgICB0aGlzLmNvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2wgPSB0aGlzLmNvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2w7XG5cbiAgICAvKipcbiAgICAgKiBcIkFsd2F5cyBvblwiIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcihlbCwgJ21vdXNlZG93bicsIChldjogTW91c2VFdmVudCkgPT4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZm9jdXMoKTtcblxuICAgICAgLy8gRG9uJ3Qgc2VuZCB0aGUgbW91c2UgYnV0dG9uIHRvIHRoZSBwdHkgaWYgbW91c2UgZXZlbnRzIGFyZSBkaXNhYmxlZCBvclxuICAgICAgLy8gaWYgdGhlIHNlbGVjdGlvbiBtYW5hZ2VyIGlzIGhhdmluZyBzZWxlY3Rpb24gZm9yY2VkIChpZS4gYSBtb2RpZmllciBpc1xuICAgICAgLy8gaGVsZCkuXG4gICAgICBpZiAoIXRoaXMuY29yZU1vdXNlU2VydmljZS5hcmVNb3VzZUV2ZW50c0FjdGl2ZSB8fCB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlIS5zaG91bGRGb3JjZVNlbGVjdGlvbihldikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZW5kRXZlbnQoZXYpO1xuXG4gICAgICAvLyBSZWdpc3RlciBhZGRpdGlvbmFsIGdsb2JhbCBoYW5kbGVycyB3aGljaCBzaG91bGQga2VlcCByZXBvcnRpbmcgb3V0c2lkZVxuICAgICAgLy8gb2YgdGhlIHRlcm1pbmFsIGVsZW1lbnQuXG4gICAgICAvLyBOb3RlOiBPdGhlciBlbXVsYXRvcnMgYWxzbyBkbyB0aGlzIGZvciAnbW91c2Vkb3duJyB3aGlsZSBhIGJ1dHRvblxuICAgICAgLy8gaXMgaGVsZCwgd2UgY3VycmVudGx5IGxpbWl0ICdtb3VzZWRvd24nIHRvIHRoZSB0ZXJtaW5hbCBvbmx5LlxuICAgICAgaWYgKHJlcXVlc3RlZEV2ZW50cy5tb3VzZXVwKSB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50IS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgcmVxdWVzdGVkRXZlbnRzLm1vdXNldXApO1xuICAgICAgfVxuICAgICAgaWYgKHJlcXVlc3RlZEV2ZW50cy5tb3VzZWRyYWcpIHtcbiAgICAgICAgdGhpcy5fZG9jdW1lbnQhLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHJlcXVlc3RlZEV2ZW50cy5tb3VzZWRyYWcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXYpO1xuICAgIH0pKTtcblxuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKGVsLCAnd2hlZWwnLCAoZXY6IFdoZWVsRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvIG5vdGhpbmcsIGlmIGFwcCBzaWRlIGhhbmRsZXMgd2hlZWwgaXRzZWxmXG4gICAgICBpZiAocmVxdWVzdGVkRXZlbnRzLndoZWVsKSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLl9jdXN0b21XaGVlbEV2ZW50SGFuZGxlciAmJiB0aGlzLl9jdXN0b21XaGVlbEV2ZW50SGFuZGxlcihldikgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmJ1ZmZlci5oYXNTY3JvbGxiYWNrKSB7XG4gICAgICAgIC8vIENvbnZlcnQgd2hlZWwgZXZlbnRzIGludG8gdXAvZG93biBldmVudHMgd2hlbiB0aGUgYnVmZmVyIGRvZXMgbm90IGhhdmUgc2Nyb2xsYmFjaywgdGhpc1xuICAgICAgICAvLyBlbmFibGVzIHNjcm9sbGluZyBpbiBhcHBzIGhvc3RlZCBpbiB0aGUgYWx0IGJ1ZmZlciBzdWNoIGFzIHZpbSBvciB0bXV4LlxuICAgICAgICBjb25zdCBhbW91bnQgPSB0aGlzLnZpZXdwb3J0IS5nZXRMaW5lc1Njcm9sbGVkKGV2KTtcblxuICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZXJlJ3Mgbm8gdmVydGljYWwgc2Nyb2xsXG4gICAgICAgIGlmIChhbW91bnQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYW5kIHNlbmQgc2VxdWVuY2VzXG4gICAgICAgIGNvbnN0IHNlcXVlbmNlID0gQzAuRVNDICsgKHRoaXMuY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uQ3Vyc29yS2V5cyA/ICdPJyA6ICdbJykgKyAoZXYuZGVsdGFZIDwgMCA/ICdBJyA6ICdCJyk7XG4gICAgICAgIGxldCBkYXRhID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5hYnMoYW1vdW50KTsgaSsrKSB7XG4gICAgICAgICAgZGF0YSArPSBzZXF1ZW5jZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoZGF0YSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbmNlbChldiwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIG5vcm1hbCB2aWV3cG9ydCBzY3JvbGxpbmdcbiAgICAgIC8vIGNvbmRpdGlvbmFsbHkgc3RvcCBldmVudCwgaWYgdGhlIHZpZXdwb3J0IHN0aWxsIGhhZCByb3dzIHRvIHNjcm9sbCB3aXRoaW5cbiAgICAgIGlmICh0aGlzLnZpZXdwb3J0IS5oYW5kbGVXaGVlbChldikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuY2VsKGV2KTtcbiAgICAgIH1cbiAgICB9LCB7IHBhc3NpdmU6IGZhbHNlIH0pKTtcblxuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKGVsLCAndG91Y2hzdGFydCcsIChldjogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY29yZU1vdXNlU2VydmljZS5hcmVNb3VzZUV2ZW50c0FjdGl2ZSkgcmV0dXJuO1xuICAgICAgdGhpcy52aWV3cG9ydCEuaGFuZGxlVG91Y2hTdGFydChldik7XG4gICAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXYpO1xuICAgIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcihlbCwgJ3RvdWNobW92ZScsIChldjogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY29yZU1vdXNlU2VydmljZS5hcmVNb3VzZUV2ZW50c0FjdGl2ZSkgcmV0dXJuO1xuICAgICAgaWYgKCF0aGlzLnZpZXdwb3J0IS5oYW5kbGVUb3VjaE1vdmUoZXYpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbmNlbChldik7XG4gICAgICB9XG4gICAgfSwgeyBwYXNzaXZlOiBmYWxzZSB9KSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBUZWxscyB0aGUgcmVuZGVyZXIgdG8gcmVmcmVzaCB0ZXJtaW5hbCBjb250ZW50IGJldHdlZW4gdHdvIHJvd3MgKGluY2x1c2l2ZSkgYXQgdGhlIG5leHRcbiAgICogb3Bwb3J0dW5pdHkuXG4gICAqIEBwYXJhbSBzdGFydCBUaGUgcm93IHRvIHN0YXJ0IGZyb20gKGJldHdlZW4gMCBhbmQgdGhpcy5yb3dzIC0gMSkuXG4gICAqIEBwYXJhbSBlbmQgVGhlIHJvdyB0byBlbmQgYXQgKGJldHdlZW4gc3RhcnQgYW5kIHRoaXMucm93cyAtIDEpLlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2goc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJTZXJ2aWNlPy5yZWZyZXNoUm93cyhzdGFydCwgZW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGN1cnNvciBzdHlsZSBmb3IgZGlmZmVyZW50IHNlbGVjdGlvbiBtb2Rlc1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZUN1cnNvclN0eWxlKGV2OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlPy5zaG91bGRDb2x1bW5TZWxlY3QoZXYpKSB7XG4gICAgICB0aGlzLmVsZW1lbnQhLmNsYXNzTGlzdC5hZGQoJ2NvbHVtbi1zZWxlY3QnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50IS5jbGFzc0xpc3QucmVtb3ZlKCdjb2x1bW4tc2VsZWN0Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdGhlIGN1cnNvciBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIF9zaG93Q3Vyc29yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb3JlU2VydmljZS5pc0N1cnNvckluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLmNvcmVTZXJ2aWNlLmlzQ3Vyc29ySW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5yZWZyZXNoKHRoaXMuYnVmZmVyLnksIHRoaXMuYnVmZmVyLnkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ/OiBib29sZWFuLCBzb3VyY2UgPSBTY3JvbGxTb3VyY2UuVEVSTUlOQUwpOiB2b2lkIHtcbiAgICBpZiAoc291cmNlID09PSBTY3JvbGxTb3VyY2UuVklFV1BPUlQpIHtcbiAgICAgIHN1cGVyLnNjcm9sbExpbmVzKGRpc3AsIHN1cHByZXNzU2Nyb2xsRXZlbnQsIHNvdXJjZSk7XG4gICAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlld3BvcnQ/LnNjcm9sbExpbmVzKGRpc3ApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwYXN0ZShkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBwYXN0ZShkYXRhLCB0aGlzLnRleHRhcmVhISwgdGhpcy5jb3JlU2VydmljZSwgdGhpcy5vcHRpb25zU2VydmljZSk7XG4gIH1cblxuICBwdWJsaWMgYXR0YWNoQ3VzdG9tS2V5RXZlbnRIYW5kbGVyKGN1c3RvbUtleUV2ZW50SGFuZGxlcjogQ3VzdG9tS2V5RXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyID0gY3VzdG9tS2V5RXZlbnRIYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIGF0dGFjaEN1c3RvbVdoZWVsRXZlbnRIYW5kbGVyKGN1c3RvbVdoZWVsRXZlbnRIYW5kbGVyOiBDdXN0b21XaGVlbEV2ZW50SGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX2N1c3RvbVdoZWVsRXZlbnRIYW5kbGVyID0gY3VzdG9tV2hlZWxFdmVudEhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJMaW5rUHJvdmlkZXIobGlua1Byb3ZpZGVyOiBJTGlua1Byb3ZpZGVyKTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9saW5rUHJvdmlkZXJTZXJ2aWNlLnJlZ2lzdGVyTGlua1Byb3ZpZGVyKGxpbmtQcm92aWRlcik7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIoaGFuZGxlcjogQ2hhcmFjdGVySm9pbmVySGFuZGxlcik6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLl9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rlcm1pbmFsIG11c3QgYmUgb3BlbmVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGpvaW5lcklkID0gdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZS5yZWdpc3RlcihoYW5kbGVyKTtcbiAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gICAgcmV0dXJuIGpvaW5lcklkO1xuICB9XG5cbiAgcHVibGljIGRlcmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIoam9pbmVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZXJtaW5hbCBtdXN0IGJlIG9wZW5lZCBmaXJzdCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZS5kZXJlZ2lzdGVyKGpvaW5lcklkKSkge1xuICAgICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFya2VycygpOiBJTWFya2VyW10ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5tYXJrZXJzO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyTWFya2VyKGN1cnNvcllPZmZzZXQ6IG51bWJlcik6IElNYXJrZXIge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5hZGRNYXJrZXIodGhpcy5idWZmZXIueWJhc2UgKyB0aGlzLmJ1ZmZlci55ICsgY3Vyc29yWU9mZnNldCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJEZWNvcmF0aW9uKGRlY29yYXRpb25PcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnMpOiBJRGVjb3JhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLnJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSB0ZXJtaW5hbCBoYXMgYW4gYWN0aXZlIHNlbGVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBoYXNTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UgPyB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLmhhc1NlbGVjdGlvbiA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGV4dCB3aXRoaW4gdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gdGhlIHNlbGVjdGlvbiBzdGFydHMgYXQuLlxuICAgKiBAcGFyYW0gcm93IFRoZSByb3cgdGhlIHNlbGVjdGlvbiBzdGFydHMgYXQuXG4gICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgc2VsZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdChjb2x1bW46IG51bWJlciwgcm93OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0aW9uU2VydmljZSEuc2V0U2VsZWN0aW9uKGNvbHVtbiwgcm93LCBsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRlcm1pbmFsJ3MgY3VycmVudCBzZWxlY3Rpb24sIHRoaXMgaXMgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgY29weVxuICAgKiBiZWhhdmlvciBvdXRzaWRlIG9mIHh0ZXJtLmpzLlxuICAgKi9cbiAgcHVibGljIGdldFNlbGVjdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlID8gdGhpcy5fc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb25UZXh0IDogJyc7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0aW9uUG9zaXRpb24oKTogSUJ1ZmZlclJhbmdlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX3NlbGVjdGlvblNlcnZpY2UgfHwgIXRoaXMuX3NlbGVjdGlvblNlcnZpY2UuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydDoge1xuICAgICAgICB4OiB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvblN0YXJ0IVswXSxcbiAgICAgICAgeTogdGhpcy5fc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb25TdGFydCFbMV1cbiAgICAgIH0sXG4gICAgICBlbmQ6IHtcbiAgICAgICAgeDogdGhpcy5fc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb25FbmQhWzBdLFxuICAgICAgICB5OiB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvbkVuZCFbMV1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY3VycmVudCB0ZXJtaW5hbCBzZWxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0aW9uU2VydmljZT8uY2xlYXJTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGFsbCB0ZXh0IHdpdGhpbiB0aGUgdGVybWluYWwuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2U/LnNlbGVjdEFsbCgpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdExpbmVzKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0aW9uU2VydmljZT8uc2VsZWN0TGluZXMoc3RhcnQsIGVuZCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGEga2V5ZG93biBbS2V5Ym9hcmRFdmVudF0uXG4gICAqXG4gICAqIFtLZXlib2FyZEV2ZW50XTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9ET00vS2V5Ym9hcmRFdmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIF9rZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgdGhpcy5fa2V5RG93bkhhbmRsZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9rZXlEb3duU2VlbiA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyICYmIHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlcihldmVudCkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWdub3JlIGNvbXBvc2luZyB3aXRoIEFsdCBrZXkgb24gTWFjIHdoZW4gbWFjT3B0aW9uSXNNZXRhIGlzIGVuYWJsZWRcbiAgICBjb25zdCBzaG91bGRJZ25vcmVDb21wb3NpdGlvbiA9IHRoaXMuYnJvd3Nlci5pc01hYyAmJiB0aGlzLm9wdGlvbnMubWFjT3B0aW9uSXNNZXRhICYmIGV2ZW50LmFsdEtleTtcblxuICAgIGlmICghc2hvdWxkSWdub3JlQ29tcG9zaXRpb24gJiYgIXRoaXMuX2NvbXBvc2l0aW9uSGVscGVyIS5rZXlkb3duKGV2ZW50KSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zY3JvbGxPblVzZXJJbnB1dCAmJiB0aGlzLmJ1ZmZlci55YmFzZSAhPT0gdGhpcy5idWZmZXIueWRpc3ApIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghc2hvdWxkSWdub3JlQ29tcG9zaXRpb24gJiYgKGV2ZW50LmtleSA9PT0gJ0RlYWQnIHx8IGV2ZW50LmtleSA9PT0gJ0FsdEdyYXBoJykpIHtcbiAgICAgIHRoaXMuX3VucHJvY2Vzc2VkRGVhZEtleSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gZXZhbHVhdGVLZXlib2FyZEV2ZW50KGV2ZW50LCB0aGlzLmNvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbkN1cnNvcktleXMsIHRoaXMuYnJvd3Nlci5pc01hYywgdGhpcy5vcHRpb25zLm1hY09wdGlvbklzTWV0YSk7XG5cbiAgICB0aGlzLnVwZGF0ZUN1cnNvclN0eWxlKGV2ZW50KTtcblxuICAgIGlmIChyZXN1bHQudHlwZSA9PT0gS2V5Ym9hcmRSZXN1bHRUeXBlLlBBR0VfRE9XTiB8fCByZXN1bHQudHlwZSA9PT0gS2V5Ym9hcmRSZXN1bHRUeXBlLlBBR0VfVVApIHtcbiAgICAgIGNvbnN0IHNjcm9sbENvdW50ID0gdGhpcy5yb3dzIC0gMTtcbiAgICAgIHRoaXMuc2Nyb2xsTGluZXMocmVzdWx0LnR5cGUgPT09IEtleWJvYXJkUmVzdWx0VHlwZS5QQUdFX1VQID8gLXNjcm9sbENvdW50IDogc2Nyb2xsQ291bnQpO1xuICAgICAgcmV0dXJuIHRoaXMuY2FuY2VsKGV2ZW50LCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LnR5cGUgPT09IEtleWJvYXJkUmVzdWx0VHlwZS5TRUxFQ1RfQUxMKSB7XG4gICAgICB0aGlzLnNlbGVjdEFsbCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1RoaXJkTGV2ZWxTaGlmdCh0aGlzLmJyb3dzZXIsIGV2ZW50KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5jYW5jZWwpIHtcbiAgICAgIC8vIFRoZSBldmVudCBpcyBjYW5jZWxlZCBhdCB0aGUgZW5kIGFscmVhZHksIGlzIHRoaXMgbmVjZXNzYXJ5P1xuICAgICAgdGhpcy5jYW5jZWwoZXZlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LmtleSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSEFDSzogUHJvY2VzcyBBLVogaW4gdGhlIGtleXByZXNzIGV2ZW50IHRvIGZpeCBhbiBpc3N1ZSB3aXRoIG1hY09TIElNRXMgd2hlcmUgbG93ZXIgY2FzZVxuICAgIC8vIGxldHRlcnMgY2Fubm90IGJlIGlucHV0IHdoaWxlIGNhcHMgbG9jayBpcyBvbi5cbiAgICBpZiAoZXZlbnQua2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKGV2ZW50LmtleS5jaGFyQ29kZUF0KDApID49IDY1ICYmIGV2ZW50LmtleS5jaGFyQ29kZUF0KDApIDw9IDkwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl91bnByb2Nlc3NlZERlYWRLZXkpIHtcbiAgICAgIHRoaXMuX3VucHJvY2Vzc2VkRGVhZEtleSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgY3RybCtjIG9yIGVudGVyIGlzIGJlaW5nIHNlbnQsIGNsZWFyIG91dCB0aGUgdGV4dGFyZWEuIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHNjcmVlbiByZWFkZXJzXG4gICAgLy8gd2lsbCBhbm5vdW5jZSBkZWxldGVkIGNoYXJhY3RlcnMuIFRoaXMgd2lsbCBub3Qgd29yayAxMDAlIG9mIHRoZSB0aW1lIGJ1dCBpdCBzaG91bGQgY292ZXJcbiAgICAvLyBtb3N0IHNjZW5hcmlvcy5cbiAgICBpZiAocmVzdWx0LmtleSA9PT0gQzAuRVRYIHx8IHJlc3VsdC5rZXkgPT09IEMwLkNSKSB7XG4gICAgICB0aGlzLnRleHRhcmVhIS52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMuX29uS2V5LmZpcmUoeyBrZXk6IHJlc3VsdC5rZXksIGRvbUV2ZW50OiBldmVudCB9KTtcbiAgICB0aGlzLl9zaG93Q3Vyc29yKCk7XG4gICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KHJlc3VsdC5rZXksIHRydWUpO1xuXG4gICAgLy8gQ2FuY2VsIGV2ZW50cyB3aGVuIG5vdCBpbiBzY3JlZW4gcmVhZGVyIG1vZGUgc28gZXZlbnRzIGRvbid0IGdldCBidWJibGVkIHVwIGFuZCBoYW5kbGVkIGJ5XG4gICAgLy8gb3RoZXIgbGlzdGVuZXJzLiBXaGVuIHNjcmVlbiByZWFkZXIgbW9kZSBpcyBlbmFibGVkLCB3ZSBkb24ndCBjYW5jZWwgdGhlbSAodW5sZXNzIGN0cmwgb3IgYWx0XG4gICAgLy8gaXMgYWxzbyBkZXByZXNzZWQpIHNvIHRoYXQgdGhlIGN1cnNvciB0ZXh0YXJlYSBjYW4gYmUgdXBkYXRlZCwgd2hpY2ggdHJpZ2dlcnMgdGhlIHNjcmVlblxuICAgIC8vIHJlYWRlciB0byByZWFkIGl0LlxuICAgIGlmICghdGhpcy5vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcmVlblJlYWRlck1vZGUgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbmNlbChldmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fa2V5RG93bkhhbmRsZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNUaGlyZExldmVsU2hpZnQoYnJvd3NlcjogSUJyb3dzZXIsIGV2OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGhpcmRMZXZlbEtleSA9XG4gICAgICAoYnJvd3Nlci5pc01hYyAmJiAhdGhpcy5vcHRpb25zLm1hY09wdGlvbklzTWV0YSAmJiBldi5hbHRLZXkgJiYgIWV2LmN0cmxLZXkgJiYgIWV2Lm1ldGFLZXkpIHx8XG4gICAgICAoYnJvd3Nlci5pc1dpbmRvd3MgJiYgZXYuYWx0S2V5ICYmIGV2LmN0cmxLZXkgJiYgIWV2Lm1ldGFLZXkpIHx8XG4gICAgICAoYnJvd3Nlci5pc1dpbmRvd3MgJiYgZXYuZ2V0TW9kaWZpZXJTdGF0ZSgnQWx0R3JhcGgnKSk7XG5cbiAgICBpZiAoZXYudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIHRoaXJkTGV2ZWxLZXk7XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgaW52b2tlIGZvciBhcnJvd3MsIHBhZ2VEb3duLCBob21lLCBiYWNrc3BhY2UsIGV0Yy4gKG9uIG5vbi1rZXlwcmVzcyBldmVudHMpXG4gICAgcmV0dXJuIHRoaXJkTGV2ZWxLZXkgJiYgKCFldi5rZXlDb2RlIHx8IGV2LmtleUNvZGUgPiA0Nyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2tleVVwKGV2OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fa2V5RG93blNlZW4gPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXIgJiYgdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyKGV2KSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXdhc01vZGlmaWVyS2V5T25seUV2ZW50KGV2KSkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ3Vyc29yU3R5bGUoZXYpO1xuICAgIHRoaXMuX2tleVByZXNzSGFuZGxlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGtleXByZXNzIGV2ZW50LlxuICAgKiBLZXkgUmVzb3VyY2VzOlxuICAgKiAgIC0gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9ET00vS2V5Ym9hcmRFdmVudFxuICAgKiBAcGFyYW0gZXYgVGhlIGtleXByZXNzIGV2ZW50IHRvIGJlIGhhbmRsZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2tleVByZXNzKGV2OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgbGV0IGtleTtcblxuICAgIHRoaXMuX2tleVByZXNzSGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuX2tleURvd25IYW5kbGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlciAmJiB0aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXIoZXYpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuY2FuY2VsKGV2KTtcblxuICAgIGlmIChldi5jaGFyQ29kZSkge1xuICAgICAga2V5ID0gZXYuY2hhckNvZGU7XG4gICAgfSBlbHNlIGlmIChldi53aGljaCA9PT0gbnVsbCB8fCBldi53aGljaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBrZXkgPSBldi5rZXlDb2RlO1xuICAgIH0gZWxzZSBpZiAoZXYud2hpY2ggIT09IDAgJiYgZXYuY2hhckNvZGUgIT09IDApIHtcbiAgICAgIGtleSA9IGV2LndoaWNoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFrZXkgfHwgKFxuICAgICAgKGV2LmFsdEtleSB8fCBldi5jdHJsS2V5IHx8IGV2Lm1ldGFLZXkpICYmICF0aGlzLl9pc1RoaXJkTGV2ZWxTaGlmdCh0aGlzLmJyb3dzZXIsIGV2KVxuICAgICkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGtleSk7XG5cbiAgICB0aGlzLl9vbktleS5maXJlKHsga2V5LCBkb21FdmVudDogZXYgfSk7XG4gICAgdGhpcy5fc2hvd0N1cnNvcigpO1xuICAgIHRoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChrZXksIHRydWUpO1xuXG4gICAgdGhpcy5fa2V5UHJlc3NIYW5kbGVkID0gdHJ1ZTtcblxuICAgIC8vIFRoZSBrZXkgd2FzIGhhbmRsZWQgc28gY2xlYXIgdGhlIGRlYWQga2V5IHN0YXRlLCBvdGhlcndpc2UgY2VydGFpbiBrZXlzdHJva2VzIGxpa2UgYXJyb3dcbiAgICAvLyBrZXlzIGNvdWxkIGJlIGlnbm9yZWRcbiAgICB0aGlzLl91bnByb2Nlc3NlZERlYWRLZXkgPSBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhbiBpbnB1dCBldmVudC5cbiAgICogS2V5IFJlc291cmNlczpcbiAgICogICAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9JbnB1dEV2ZW50XG4gICAqIEBwYXJhbSBldiBUaGUgaW5wdXQgZXZlbnQgdG8gYmUgaGFuZGxlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfaW5wdXRFdmVudChldjogSW5wdXRFdmVudCk6IGJvb2xlYW4ge1xuICAgIC8vIE9ubHkgc3VwcG9ydCBlbW9qaSBJTUVzIHdoZW4gc2NyZWVuIHJlYWRlciBtb2RlIGlzIGRpc2FibGVkIGFzIHRoZSBldmVudCBtdXN0IGJ1YmJsZSB1cCB0b1xuICAgIC8vIHN1cHBvcnQgcmVhZGluZyBvdXQgY2hhcmFjdGVyIGlucHV0IHdoaWNoIGNhbiBkb3VibGluZyB1cCBpbnB1dCBjaGFyYWN0ZXJzXG4gICAgLy8gQmFzZWQgb24gdGhlc2UgZXZlbnQgdHJhY2VzOiBodHRwczovL2dpdGh1Yi5jb20veHRlcm1qcy94dGVybS5qcy9pc3N1ZXMvMzY3OVxuICAgIGlmIChldi5kYXRhICYmIGV2LmlucHV0VHlwZSA9PT0gJ2luc2VydFRleHQnICYmICghZXYuY29tcG9zZWQgfHwgIXRoaXMuX2tleURvd25TZWVuKSAmJiAhdGhpcy5vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcmVlblJlYWRlck1vZGUpIHtcbiAgICAgIGlmICh0aGlzLl9rZXlQcmVzc0hhbmRsZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUga2V5IHdhcyBoYW5kbGVkIHNvIGNsZWFyIHRoZSBkZWFkIGtleSBzdGF0ZSwgb3RoZXJ3aXNlIGNlcnRhaW4ga2V5c3Ryb2tlcyBsaWtlIGFycm93XG4gICAgICAvLyBrZXlzIGNvdWxkIGJlIGlnbm9yZWRcbiAgICAgIHRoaXMuX3VucHJvY2Vzc2VkRGVhZEtleSA9IGZhbHNlO1xuXG4gICAgICBjb25zdCB0ZXh0ID0gZXYuZGF0YTtcbiAgICAgIHRoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudCh0ZXh0LCB0cnVlKTtcblxuICAgICAgdGhpcy5jYW5jZWwoZXYpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2l6ZXMgdGhlIHRlcm1pbmFsLlxuICAgKlxuICAgKiBAcGFyYW0geCBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgdG8gcmVzaXplIHRvLlxuICAgKiBAcGFyYW0geSBUaGUgbnVtYmVyIG9mIHJvd3MgdG8gcmVzaXplIHRvLlxuICAgKi9cbiAgcHVibGljIHJlc2l6ZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh4ID09PSB0aGlzLmNvbHMgJiYgeSA9PT0gdGhpcy5yb3dzKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSBzdGlsbCBuZWVkIHRvIG1lYXN1cmUgdGhlIGNoYXIgc2l6ZSAoZml4ZXMgIzc4NSkuXG4gICAgICBpZiAodGhpcy5fY2hhclNpemVTZXJ2aWNlICYmICF0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGFzVmFsaWRTaXplKSB7XG4gICAgICAgIHRoaXMuX2NoYXJTaXplU2VydmljZS5tZWFzdXJlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIucmVzaXplKHgsIHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWZ0ZXJSZXNpemUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFyU2l6ZVNlcnZpY2U/Lm1lYXN1cmUoKTtcblxuICAgIC8vIFN5bmMgdGhlIHNjcm9sbCBhcmVhIHRvIG1ha2Ugc3VyZSBzY3JvbGwgZXZlbnRzIGRvbid0IGZpcmUgYW5kIHNjcm9sbCB0aGUgdmlld3BvcnQgdG8gYW5cbiAgICAvLyBpbnZhbGlkIGxvY2F0aW9uXG4gICAgdGhpcy52aWV3cG9ydD8uc3luY1Njcm9sbEFyZWEodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGVudGlyZSBidWZmZXIsIG1ha2luZyB0aGUgcHJvbXB0IGxpbmUgdGhlIG5ldyBmaXJzdCBsaW5lLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJ1ZmZlci55YmFzZSA9PT0gMCAmJiB0aGlzLmJ1ZmZlci55ID09PSAwKSB7XG4gICAgICAvLyBEb24ndCBjbGVhciBpZiBpdCdzIGFscmVhZHkgY2xlYXJcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5idWZmZXIuY2xlYXJBbGxNYXJrZXJzKCk7XG4gICAgdGhpcy5idWZmZXIubGluZXMuc2V0KDAsIHRoaXMuYnVmZmVyLmxpbmVzLmdldCh0aGlzLmJ1ZmZlci55YmFzZSArIHRoaXMuYnVmZmVyLnkpISk7XG4gICAgdGhpcy5idWZmZXIubGluZXMubGVuZ3RoID0gMTtcbiAgICB0aGlzLmJ1ZmZlci55ZGlzcCA9IDA7XG4gICAgdGhpcy5idWZmZXIueWJhc2UgPSAwO1xuICAgIHRoaXMuYnVmZmVyLnkgPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIHRoaXMuYnVmZmVyLmxpbmVzLnB1c2godGhpcy5idWZmZXIuZ2V0QmxhbmtMaW5lKERFRkFVTFRfQVRUUl9EQVRBKSk7XG4gICAgfVxuICAgIC8vIElNUE9SVEFOVDogRmlyZSBzY3JvbGwgZXZlbnQgYmVmb3JlIHZpZXdwb3J0IGlzIHJlc2V0LiBUaGlzIGVuc3VyZXMgZW1iZWRkZXJzIGdldCB0aGUgY2xlYXJcbiAgICAvLyBzY3JvbGwgZXZlbnQgYW5kIHRoYXQgdGhlIHZpZXdwb3J0J3Mgc3RhdGUgd2lsbCBiZSB2YWxpZCBmb3IgaW1tZWRpYXRlIHdyaXRlcy5cbiAgICB0aGlzLl9vblNjcm9sbC5maXJlKHsgcG9zaXRpb246IHRoaXMuYnVmZmVyLnlkaXNwLCBzb3VyY2U6IFNjcm9sbFNvdXJjZS5URVJNSU5BTCB9KTtcbiAgICB0aGlzLnZpZXdwb3J0Py5yZXNldCgpO1xuICAgIHRoaXMucmVmcmVzaCgwLCB0aGlzLnJvd3MgLSAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0ZXJtaW5hbC5cbiAgICogTm90ZTogQ2FsbGluZyB0aGlzIGRpcmVjdGx5IGZyb20gSlMgaXMgc3luY2hyb25vdXMgYnV0IGRvZXMgbm90IGNsZWFyXG4gICAqIGlucHV0IGJ1ZmZlcnMgYW5kIGRvZXMgbm90IHJlc2V0IHRoZSBwYXJzZXIsIHRodXMgdGhlIHRlcm1pbmFsIHdpbGxcbiAgICogY29udGludWUgdG8gYXBwbHkgcGVuZGluZyBpbnB1dCBkYXRhLlxuICAgKiBJZiB5b3UgbmVlZCBpbiBiYW5kIHJlc2V0IChzeW5jaHJvbm91cyB3aXRoIGlucHV0IGRhdGEpIGNvbnNpZGVyXG4gICAqIHVzaW5nIERFQ1NUUiAoc29mdCByZXNldCwgQ1NJICEgcCkgb3IgUklTIGluc3RlYWQgKGhhcmQgcmVzZXQsIEVTQyBjKS5cbiAgICovXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBTaW5jZSBfc2V0dXAgaGFuZGxlcyBhIGZ1bGwgdGVybWluYWwgY3JlYXRpb24sIHdlIGhhdmUgdG8gY2FycnkgZm9yd2FyZFxuICAgICAqIGEgZmV3IHRoaW5ncyB0aGF0IHNob3VsZCBub3QgcmVzZXQuXG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zLnJvd3MgPSB0aGlzLnJvd3M7XG4gICAgdGhpcy5vcHRpb25zLmNvbHMgPSB0aGlzLmNvbHM7XG4gICAgY29uc3QgY3VzdG9tS2V5RXZlbnRIYW5kbGVyID0gdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyO1xuXG4gICAgdGhpcy5fc2V0dXAoKTtcbiAgICBzdXBlci5yZXNldCgpO1xuICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2U/LnJlc2V0KCk7XG4gICAgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLnZpZXdwb3J0Py5yZXNldCgpO1xuXG4gICAgLy8gcmVhdHRhY2hcbiAgICB0aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXIgPSBjdXN0b21LZXlFdmVudEhhbmRsZXI7XG5cbiAgICAvLyBkbyBhIGZ1bGwgc2NyZWVuIHJlZnJlc2hcbiAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJUZXh0dXJlQXRsYXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyU2VydmljZT8uY2xlYXJUZXh0dXJlQXRsYXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcG9ydEZvY3VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXMnKSkge1xuICAgICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KEMwLkVTQyArICdbSScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoQzAuRVNDICsgJ1tPJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVwb3J0V2luZG93c09wdGlvbnModHlwZTogV2luZG93c09wdGlvbnNSZXBvcnRUeXBlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJTZXJ2aWNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZS5HRVRfV0lOX1NJWkVfUElYRUxTOlxuICAgICAgICBjb25zdCBjYW52YXNXaWR0aCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoLnRvRml4ZWQoMCk7XG4gICAgICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodC50b0ZpeGVkKDApO1xuICAgICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfVs0OyR7Y2FudmFzSGVpZ2h0fTske2NhbnZhc1dpZHRofXRgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZS5HRVRfQ0VMTF9TSVpFX1BJWEVMUzpcbiAgICAgICAgY29uc3QgY2VsbFdpZHRoID0gdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoLnRvRml4ZWQoMCk7XG4gICAgICAgIGNvbnN0IGNlbGxIZWlnaHQgPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0LnRvRml4ZWQoMCk7XG4gICAgICAgIHRoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtDMC5FU0N9WzY7JHtjZWxsSGVpZ2h0fTske2NlbGxXaWR0aH10YCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IFJlbW92ZSBjYW5jZWwgZnVuY3Rpb24gYW5kIGNhbmNlbEV2ZW50cyBvcHRpb25cbiAgcHVibGljIGNhbmNlbChldjogRXZlbnQsIGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmNhbmNlbEV2ZW50cyAmJiAhZm9yY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXJzXG4gKi9cblxuZnVuY3Rpb24gd2FzTW9kaWZpZXJLZXlPbmx5RXZlbnQoZXY6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV2LmtleUNvZGUgPT09IDE2IHx8IC8vIFNoaWZ0XG4gICAgZXYua2V5Q29kZSA9PT0gMTcgfHwgLy8gQ3RybFxuICAgIGV2LmtleUNvZGUgPT09IDE4OyAvLyBBbHRcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmNvbnN0IFJFTkRFUl9ERUJPVU5DRV9USFJFU0hPTERfTVMgPSAxMDAwOyAvLyAxIFNlY29uZFxuXG5pbXBvcnQgeyBJUmVuZGVyRGVib3VuY2VyIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5cbi8qKlxuICogRGVib3VuY2VzIGNhbGxzIHRvIHVwZGF0ZSBzY3JlZW4gcmVhZGVycyB0byB1cGRhdGUgYXQgbW9zdCBvbmNlIGNvbmZpZ3VyYWJsZSBpbnRlcnZhbCBvZiB0aW1lLlxuICovXG5leHBvcnQgY2xhc3MgVGltZUJhc2VkRGVib3VuY2VyIGltcGxlbWVudHMgSVJlbmRlckRlYm91bmNlciB7XG4gIHByaXZhdGUgX3Jvd1N0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3Jvd0VuZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBsYXN0IG1vbWVudCB0aGF0IHRoZSBUZXJtaW5hbCB3YXMgcmVmcmVzaGVkIGF0XG4gIHByaXZhdGUgX2xhc3RSZWZyZXNoTXMgPSAwO1xuICAvLyBXaGV0aGVyIGEgdHJhaWxpbmcgcmVmcmVzaCBzaG91bGQgYmUgdHJpZ2dlcmVkIGR1ZSB0byBhIHJlZnJlc2ggcmVxdWVzdCB0aGF0IHdhcyB0aHJvdHRsZWRcbiAgcHJpdmF0ZSBfYWRkaXRpb25hbFJlZnJlc2hSZXF1ZXN0ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9yZWZyZXNoVGltZW91dElEOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcmVuZGVyQ2FsbGJhY2s6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gdm9pZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZWJvdW5jZVRocmVzaG9sZE1TID0gUkVOREVSX0RFQk9VTkNFX1RIUkVTSE9MRF9NU1xuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yZWZyZXNoVGltZW91dElEKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVmcmVzaFRpbWVvdXRJRCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZnJlc2gocm93U3RhcnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgcm93RW5kOiBudW1iZXIgfCB1bmRlZmluZWQsIHJvd0NvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9yb3dDb3VudCA9IHJvd0NvdW50O1xuICAgIC8vIEdldCB0aGUgbWluL21heCByb3cgc3RhcnQvZW5kIGZvciB0aGUgYXJnIHZhbHVlc1xuICAgIHJvd1N0YXJ0ID0gcm93U3RhcnQgIT09IHVuZGVmaW5lZCA/IHJvd1N0YXJ0IDogMDtcbiAgICByb3dFbmQgPSByb3dFbmQgIT09IHVuZGVmaW5lZCA/IHJvd0VuZCA6IHRoaXMuX3Jvd0NvdW50IC0gMTtcbiAgICAvLyBTZXQgdGhlIHByb3BlcnRpZXMgdG8gdGhlIHVwZGF0ZWQgdmFsdWVzXG4gICAgdGhpcy5fcm93U3RhcnQgPSB0aGlzLl9yb3dTdGFydCAhPT0gdW5kZWZpbmVkID8gTWF0aC5taW4odGhpcy5fcm93U3RhcnQsIHJvd1N0YXJ0KSA6IHJvd1N0YXJ0O1xuICAgIHRoaXMuX3Jvd0VuZCA9IHRoaXMuX3Jvd0VuZCAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgodGhpcy5fcm93RW5kLCByb3dFbmQpIDogcm93RW5kO1xuXG4gICAgLy8gT25seSByZWZyZXNoIGlmIHRoZSB0aW1lIHNpbmNlIGxhc3QgcmVmcmVzaCBpcyBhYm92ZSBhIHRocmVzaG9sZCwgb3RoZXJ3aXNlIHdhaXQgZm9yXG4gICAgLy8gZW5vdWdoIHRpbWUgdG8gcGFzcyBiZWZvcmUgcmVmcmVzaGluZyBhZ2Fpbi5cbiAgICBjb25zdCByZWZyZXNoUmVxdWVzdFRpbWU6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgaWYgKHJlZnJlc2hSZXF1ZXN0VGltZSAtIHRoaXMuX2xhc3RSZWZyZXNoTXMgPj0gdGhpcy5fZGVib3VuY2VUaHJlc2hvbGRNUykge1xuICAgICAgLy8gRW5vdWdoIHRpbWUgaGFzIGxhcHNlZCBzaW5jZSB0aGUgbGFzdCByZWZyZXNoOyByZWZyZXNoIGltbWVkaWF0ZWx5XG4gICAgICB0aGlzLl9sYXN0UmVmcmVzaE1zID0gcmVmcmVzaFJlcXVlc3RUaW1lO1xuICAgICAgdGhpcy5faW5uZXJSZWZyZXNoKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5fYWRkaXRpb25hbFJlZnJlc2hSZXF1ZXN0ZWQpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGFkZGl0aW9uYWwgcmVxdWVzdCB0aHJvdHRsZWQ7IHNldCB1cCB0cmFpbGluZyByZWZyZXNoXG4gICAgICBjb25zdCBlbGFwc2VkID0gcmVmcmVzaFJlcXVlc3RUaW1lIC0gdGhpcy5fbGFzdFJlZnJlc2hNcztcbiAgICAgIGNvbnN0IHdhaXRQZXJpb2RCZWZvcmVUcmFpbGluZ1JlZnJlc2ggPSB0aGlzLl9kZWJvdW5jZVRocmVzaG9sZE1TIC0gZWxhcHNlZDtcbiAgICAgIHRoaXMuX2FkZGl0aW9uYWxSZWZyZXNoUmVxdWVzdGVkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5fcmVmcmVzaFRpbWVvdXRJRCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fbGFzdFJlZnJlc2hNcyA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuX2lubmVyUmVmcmVzaCgpO1xuICAgICAgICB0aGlzLl9hZGRpdGlvbmFsUmVmcmVzaFJlcXVlc3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yZWZyZXNoVGltZW91dElEID0gdW5kZWZpbmVkOyAvLyBObyBsb25nZXIgbmVlZCB0byBjbGVhciB0aGUgdGltZW91dFxuICAgICAgfSwgd2FpdFBlcmlvZEJlZm9yZVRyYWlsaW5nUmVmcmVzaCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaW5uZXJSZWZyZXNoKCk6IHZvaWQge1xuICAgIC8vIE1ha2Ugc3VyZSB2YWx1ZXMgYXJlIHNldFxuICAgIGlmICh0aGlzLl9yb3dTdGFydCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3Jvd0VuZCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3Jvd0NvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbGFtcCB2YWx1ZXNcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KHRoaXMuX3Jvd1N0YXJ0LCAwKTtcbiAgICBjb25zdCBlbmQgPSBNYXRoLm1pbih0aGlzLl9yb3dFbmQsIHRoaXMuX3Jvd0NvdW50IC0gMSk7XG5cbiAgICAvLyBSZXNldCBkZWJvdW5jZXIgKHRoaXMgaGFwcGVucyBiZWZvcmUgcmVuZGVyIGNhbGxiYWNrIGFzIHRoZSByZW5kZXIgY291bGQgdHJpZ2dlciBpdCBhZ2FpbilcbiAgICB0aGlzLl9yb3dTdGFydCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yb3dFbmQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBSdW4gcmVuZGVyIGNhbGxiYWNrXG4gICAgdGhpcy5fcmVuZGVyQ2FsbGJhY2soc3RhcnQsIGVuZCk7XG4gIH1cbn1cblxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyIH0gZnJvbSAnYnJvd3Nlci9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSVZpZXdwb3J0LCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IElDaGFyU2l6ZVNlcnZpY2UsIElDb3JlQnJvd3NlclNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElCdWZmZXIgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5jb25zdCBGQUxMQkFDS19TQ1JPTExfQkFSX1dJRFRIID0gMTU7XG5cbmludGVyZmFjZSBJU21vb3RoU2Nyb2xsU3RhdGUge1xuICBzdGFydFRpbWU6IG51bWJlcjtcbiAgb3JpZ2luOiBudW1iZXI7XG4gIHRhcmdldDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHZpZXdwb3J0IG9mIGEgdGVybWluYWwsIHRoZSB2aXNpYmxlIGFyZWEgd2l0aGluIHRoZSBsYXJnZXIgYnVmZmVyIG9mIG91dHB1dC5cbiAqIExvZ2ljIGZvciB0aGUgdmlydHVhbCBzY3JvbGwgYmFyIGlzIGluY2x1ZGVkIGluIHRoaXMgb2JqZWN0LlxuICovXG5leHBvcnQgY2xhc3MgVmlld3BvcnQgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSVZpZXdwb3J0IHtcbiAgcHVibGljIHNjcm9sbEJhcldpZHRoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9jdXJyZW50Um93SGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9jdXJyZW50RGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdFJlY29yZGVkQnVmZmVyTGVuZ3RoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdFJlY29yZGVkQnVmZmVySGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0VG91Y2hZOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0U2Nyb2xsVG9wOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9hY3RpdmVCdWZmZXI6IElCdWZmZXI7XG4gIHByaXZhdGUgX3JlbmRlckRpbWVuc2lvbnM6IElSZW5kZXJEaW1lbnNpb25zO1xuXG4gIC8vIFN0b3JlcyBhIHBhcnRpYWwgbGluZSBhbW91bnQgd2hlbiBzY3JvbGxpbmcsIHRoaXMgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtdWNoIG9mIGEgbGluZVxuICAvLyBpcyBzY3JvbGxlZCBzbyB3ZSBjYW4gXCJzY3JvbGxcIiBvdmVyIHBhcnRpYWwgbGluZXMgYW5kIGZlZWwgbmF0dXJhbCBvbiB0b3VjaHBhZHMuIFRoaXMgaXMgYVxuICAvLyBxdWljayBmaXggYW5kIGNvdWxkIGhhdmUgYSBtb3JlIHJvYnVzdCBzb2x1dGlvbiBpbiBwbGFjZSB0aGF0IHJlc2V0IHRoZSB2YWx1ZSB3aGVuIG5lZWRlZC5cbiAgcHJpdmF0ZSBfd2hlZWxQYXJ0aWFsU2Nyb2xsOiBudW1iZXIgPSAwO1xuXG4gIHByaXZhdGUgX3JlZnJlc2hBbmltYXRpb25GcmFtZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2lnbm9yZU5leHRTY3JvbGxFdmVudDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zbW9vdGhTY3JvbGxTdGF0ZTogSVNtb290aFNjcm9sbFN0YXRlID0ge1xuICAgIHN0YXJ0VGltZTogMCxcbiAgICBvcmlnaW46IC0xLFxuICAgIHRhcmdldDogLTFcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RTY3JvbGxMaW5lcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7IGFtb3VudDogbnVtYmVyLCBzdXBwcmVzc1Njcm9sbEV2ZW50OiBib29sZWFuIH0+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0U2Nyb2xsTGluZXMgPSB0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF92aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Njcm9sbEFyZWE6IEhUTUxFbGVtZW50LFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgQElDaGFyU2l6ZVNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY2hhclNpemVTZXJ2aWNlOiBJQ2hhclNpemVTZXJ2aWNlLFxuICAgIEBJUmVuZGVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZSxcbiAgICBASUNvcmVCcm93c2VyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgQElUaGVtZVNlcnZpY2UgdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBNZWFzdXJlIHRoZSB3aWR0aCBvZiB0aGUgc2Nyb2xsYmFyLiBJZiBpdCBpcyAwIHdlIGNhbiBhc3N1bWUgaXQncyBhbiBPU1ggb3ZlcmxheSBzY3JvbGxiYXIuXG4gICAgLy8gVW5mb3J0dW5hdGVseSB0aGUgb3ZlcmxheSBzY3JvbGxiYXIgd291bGQgYmUgaGlkZGVuIHVuZGVybmVhdGggdGhlIHNjcmVlbiBlbGVtZW50IGluIHRoYXRcbiAgICAvLyBjYXNlLCB0aGVyZWZvcmUgd2UgYWNjb3VudCBmb3IgYSBzdGFuZGFyZCBhbW91bnQgdG8gbWFrZSBpdCB2aXNpYmxlXG4gICAgdGhpcy5zY3JvbGxCYXJXaWR0aCA9ICh0aGlzLl92aWV3cG9ydEVsZW1lbnQub2Zmc2V0V2lkdGggLSB0aGlzLl9zY3JvbGxBcmVhLm9mZnNldFdpZHRoKSB8fCBGQUxMQkFDS19TQ1JPTExfQkFSX1dJRFRIO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuX3ZpZXdwb3J0RWxlbWVudCwgJ3Njcm9sbCcsIHRoaXMuX2hhbmRsZVNjcm9sbC5iaW5kKHRoaXMpKSk7XG5cbiAgICAvLyBUcmFjayBwcm9wZXJ0aWVzIHVzZWQgaW4gcGVyZm9ybWFuY2UgY3JpdGljYWwgY29kZSBtYW51YWxseSB0byBhdm9pZCB1c2luZyBzbG93IGdldHRlcnNcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcjtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5vbkJ1ZmZlckFjdGl2YXRlKGUgPT4gdGhpcy5fYWN0aXZlQnVmZmVyID0gZS5hY3RpdmVCdWZmZXIpKTtcbiAgICB0aGlzLl9yZW5kZXJEaW1lbnNpb25zID0gdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyU2VydmljZS5vbkRpbWVuc2lvbnNDaGFuZ2UoZSA9PiB0aGlzLl9yZW5kZXJEaW1lbnNpb25zID0gZSkpO1xuXG4gICAgdGhpcy5faGFuZGxlVGhlbWVDaGFuZ2UodGhlbWVTZXJ2aWNlLmNvbG9ycyk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGVtZVNlcnZpY2Uub25DaGFuZ2VDb2xvcnMoZSA9PiB0aGlzLl9oYW5kbGVUaGVtZUNoYW5nZShlKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgnc2Nyb2xsYmFjaycsICgpID0+IHRoaXMuc3luY1Njcm9sbEFyZWEoKSkpO1xuXG4gICAgLy8gUGVyZm9ybSB0aGlzIGFzeW5jIHRvIGVuc3VyZSB0aGUgSUNoYXJTaXplU2VydmljZSBpcyByZWFkeS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1Njcm9sbEFyZWEoKSk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVUaGVtZUNoYW5nZShjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3JzLmJhY2tncm91bmQuY3NzO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2N1cnJlbnRSb3dIZWlnaHQgPSAwO1xuICAgIHRoaXMuX2N1cnJlbnREZXZpY2VDZWxsSGVpZ2h0ID0gMDtcbiAgICB0aGlzLl9sYXN0UmVjb3JkZWRCdWZmZXJMZW5ndGggPSAwO1xuICAgIHRoaXMuX2xhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0ID0gMDtcbiAgICB0aGlzLl9sYXN0UmVjb3JkZWRCdWZmZXJIZWlnaHQgPSAwO1xuICAgIHRoaXMuX2xhc3RUb3VjaFkgPSAwO1xuICAgIHRoaXMuX2xhc3RTY3JvbGxUb3AgPSAwO1xuICAgIC8vIFN5bmMgb24gbmV4dCBhbmltYXRpb24gZnJhbWUgdG8gZW5zdXJlIHRoZSBuZXcgdGVybWluYWwgc3RhdGUgaXMgdXNlZFxuICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuc3luY1Njcm9sbEFyZWEoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaGVzIHJvdyBoZWlnaHQsIHNldHRpbmcgbGluZS1oZWlnaHQsIHZpZXdwb3J0IGhlaWdodCBhbmQgc2Nyb2xsIGFyZWEgaGVpZ2h0IGlmXG4gICAqIG5lY2Vzc2FyeS5cbiAgICovXG4gIHByaXZhdGUgX3JlZnJlc2goaW1tZWRpYXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgdGhpcy5faW5uZXJSZWZyZXNoKCk7XG4gICAgICBpZiAodGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5faW5uZXJSZWZyZXNoKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lubmVyUmVmcmVzaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2hhclNpemVTZXJ2aWNlLmhlaWdodCA+IDApIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3dIZWlnaHQgPSB0aGlzLl9yZW5kZXJEaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCAvIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHI7XG4gICAgICB0aGlzLl9jdXJyZW50RGV2aWNlQ2VsbEhlaWdodCA9IHRoaXMuX3JlbmRlckRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0O1xuICAgICAgdGhpcy5fbGFzdFJlY29yZGVkVmlld3BvcnRIZWlnaHQgPSB0aGlzLl92aWV3cG9ydEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgY29uc3QgbmV3QnVmZmVySGVpZ2h0ID0gTWF0aC5yb3VuZCh0aGlzLl9jdXJyZW50Um93SGVpZ2h0ICogdGhpcy5fbGFzdFJlY29yZGVkQnVmZmVyTGVuZ3RoKSArICh0aGlzLl9sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodCAtIHRoaXMuX3JlbmRlckRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgaWYgKHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckhlaWdodCAhPT0gbmV3QnVmZmVySGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckhlaWdodCA9IG5ld0J1ZmZlckhlaWdodDtcbiAgICAgICAgdGhpcy5fc2Nyb2xsQXJlYS5zdHlsZS5oZWlnaHQgPSB0aGlzLl9sYXN0UmVjb3JkZWRCdWZmZXJIZWlnaHQgKyAncHgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN5bmMgc2Nyb2xsVG9wXG4gICAgY29uc3Qgc2Nyb2xsVG9wID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3AgKiB0aGlzLl9jdXJyZW50Um93SGVpZ2h0O1xuICAgIGlmICh0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wICE9PSBzY3JvbGxUb3ApIHtcbiAgICAgIC8vIElnbm9yZSB0aGUgbmV4dCBzY3JvbGwgZXZlbnQgd2hpY2ggd2lsbCBiZSB0cmlnZ2VyZWQgYnkgc2V0dGluZyB0aGUgc2Nyb2xsVG9wIGFzIHdlIGRvIG5vdFxuICAgICAgLy8gd2FudCB0aGlzIGV2ZW50IHRvIHNjcm9sbCB0aGUgdGVybWluYWxcbiAgICAgIHRoaXMuX2lnbm9yZU5leHRTY3JvbGxFdmVudCA9IHRydWU7XG4gICAgICB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgIH1cblxuICAgIHRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBkaW1lbnNpb25zIGFuZCBzeW5jaHJvbml6ZXMgdGhlIHNjcm9sbCBhcmVhIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIHB1YmxpYyBzeW5jU2Nyb2xsQXJlYShpbW1lZGlhdGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIC8vIElmIGJ1ZmZlciBoZWlnaHQgY2hhbmdlZFxuICAgIGlmICh0aGlzLl9sYXN0UmVjb3JkZWRCdWZmZXJMZW5ndGggIT09IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbGFzdFJlY29yZGVkQnVmZmVyTGVuZ3RoID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMubGVuZ3RoO1xuICAgICAgdGhpcy5fcmVmcmVzaChpbW1lZGlhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHZpZXdwb3J0IGhlaWdodCBjaGFuZ2VkXG4gICAgaWYgKHRoaXMuX2xhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0ICE9PSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2goaW1tZWRpYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgYnVmZmVyIHBvc2l0aW9uIGRvZXNuJ3QgbWF0Y2ggbGFzdCBzY3JvbGwgdG9wXG4gICAgaWYgKHRoaXMuX2xhc3RTY3JvbGxUb3AgIT09IHRoaXMuX2FjdGl2ZUJ1ZmZlci55ZGlzcCAqIHRoaXMuX2N1cnJlbnRSb3dIZWlnaHQpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2goaW1tZWRpYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiByb3cgaGVpZ2h0IGNoYW5nZWRcbiAgICBpZiAodGhpcy5fcmVuZGVyRGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQgIT09IHRoaXMuX2N1cnJlbnREZXZpY2VDZWxsSGVpZ2h0KSB7XG4gICAgICB0aGlzLl9yZWZyZXNoKGltbWVkaWF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgc2Nyb2xsIGV2ZW50cyBvbiB0aGUgdmlld3BvcnQsIGNhbGN1bGF0aW5nIHRoZSBuZXcgdmlld3BvcnQgYW5kIHJlcXVlc3RpbmcgdGhlXG4gICAqIHRlcm1pbmFsIHRvIHNjcm9sbCB0byBpdC5cbiAgICogQHBhcmFtIGV2IFRoZSBzY3JvbGwgZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVTY3JvbGwoZXY6IEV2ZW50KTogdm9pZCB7XG4gICAgLy8gUmVjb3JkIGN1cnJlbnQgc2Nyb2xsIHRvcCBwb3NpdGlvblxuICAgIHRoaXMuX2xhc3RTY3JvbGxUb3AgPSB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wO1xuXG4gICAgLy8gRG9uJ3QgYXR0ZW1wdCB0byBzY3JvbGwgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHZpc2libGUsIG90aGVyd2lzZSBzY3JvbGxUb3Agd2lsbCBiZSBjb3JydXB0XG4gICAgLy8gd2hpY2ggY2F1c2VzIHRoZSB0ZXJtaW5hbCB0byBzY3JvbGwgdGhlIGJ1ZmZlciB0byB0aGUgdG9wXG4gICAgaWYgKCF0aGlzLl92aWV3cG9ydEVsZW1lbnQub2Zmc2V0UGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWdub3JlIHRoZSBldmVudCBpZiBpdCB3YXMgZmxhZ2dlZCB0byBpZ25vcmUgKHdoZW4gdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQgaXMgZnJvbSBWaWV3cG9ydClcbiAgICBpZiAodGhpcy5faWdub3JlTmV4dFNjcm9sbEV2ZW50KSB7XG4gICAgICB0aGlzLl9pZ25vcmVOZXh0U2Nyb2xsRXZlbnQgPSBmYWxzZTtcbiAgICAgIC8vIFN0aWxsIHRyaWdnZXIgdGhlIHNjcm9sbCBzbyBsaW5lcyBnZXQgcmVmcmVzaGVkXG4gICAgICB0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5maXJlKHsgYW1vdW50OiAwLCBzdXBwcmVzc1Njcm9sbEV2ZW50OiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1JvdyA9IE1hdGgucm91bmQodGhpcy5fbGFzdFNjcm9sbFRvcCAvIHRoaXMuX2N1cnJlbnRSb3dIZWlnaHQpO1xuICAgIGNvbnN0IGRpZmYgPSBuZXdSb3cgLSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcDtcbiAgICB0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5maXJlKHsgYW1vdW50OiBkaWZmLCBzdXBwcmVzc1Njcm9sbEV2ZW50OiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc21vb3RoU2Nyb2xsKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIHZhbGlkIHN0YXRlXG4gICAgaWYgKHRoaXMuX2lzRGlzcG9zZWQgfHwgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUub3JpZ2luID09PSAtMSB8fCB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQgPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGNvbXBsZXRlXG4gICAgY29uc3QgcGVyY2VudCA9IHRoaXMuX3Ntb290aFNjcm9sbFBlcmNlbnQoKTtcbiAgICB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUub3JpZ2luICsgTWF0aC5yb3VuZChwZXJjZW50ICogKHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldCAtIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbikpO1xuXG4gICAgLy8gQ29udGludWUgb3IgZmluaXNoIHNtb290aCBzY3JvbGxcbiAgICBpZiAocGVyY2VudCA8IDEpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuX3Ntb290aFNjcm9sbCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2xlYXJTbW9vdGhTY3JvbGxTdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Ntb290aFNjcm9sbFBlcmNlbnQoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc21vb3RoU2Nyb2xsRHVyYXRpb24gfHwgIXRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbigoRGF0ZS5ub3coKSAtIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnN0YXJ0VGltZSkgLyB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNtb290aFNjcm9sbER1cmF0aW9uLCAxKSwgMCk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhclNtb290aFNjcm9sbFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUub3JpZ2luID0gLTE7XG4gICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0ID0gLTE7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBidWJibGluZyBvZiBzY3JvbGwgZXZlbnQgaW4gY2FzZSB0aGUgdmlld3BvcnQgaGFzIHJlYWNoZWQgdG9wIG9yIGJvdHRvbVxuICAgKiBAcGFyYW0gZXYgVGhlIHNjcm9sbCBldmVudC5cbiAgICogQHBhcmFtIGFtb3VudCBUaGUgYW1vdW50IHNjcm9sbGVkXG4gICAqL1xuICBwcml2YXRlIF9idWJibGVTY3JvbGwoZXY6IEV2ZW50LCBhbW91bnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjcm9sbFBvc0Zyb21Ub3AgPSB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wICsgdGhpcy5fbGFzdFJlY29yZGVkVmlld3BvcnRIZWlnaHQ7XG4gICAgaWYgKChhbW91bnQgPCAwICYmIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgIT09IDApIHx8XG4gICAgICAoYW1vdW50ID4gMCAmJiBzY3JvbGxQb3NGcm9tVG9wIDwgdGhpcy5fbGFzdFJlY29yZGVkQnVmZmVySGVpZ2h0KSkge1xuICAgICAgaWYgKGV2LmNhbmNlbGFibGUpIHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBtb3VzZSB3aGVlbCBldmVudHMgYnkgYWRqdXN0aW5nIHRoZSB2aWV3cG9ydCdzIHNjcm9sbFRvcCBhbmQgZGVsZWdhdGluZyB0aGUgYWN0dWFsXG4gICAqIHNjcm9sbGluZyB0byBgb25TY3JvbGxgLCB0aGlzIGV2ZW50IG5lZWRzIHRvIGJlIGF0dGFjaGVkIG1hbnVhbGx5IGJ5IHRoZSBjb25zdW1lciBvZlxuICAgKiBgVmlld3BvcnRgLlxuICAgKiBAcGFyYW0gZXYgVGhlIG1vdXNlIHdoZWVsIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIGhhbmRsZVdoZWVsKGV2OiBXaGVlbEV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgYW1vdW50ID0gdGhpcy5fZ2V0UGl4ZWxzU2Nyb2xsZWQoZXYpO1xuICAgIGlmIChhbW91bnQgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNtb290aFNjcm9sbER1cmF0aW9uKSB7XG4gICAgICB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wICs9IGFtb3VudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUuc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmICh0aGlzLl9zbW9vdGhTY3JvbGxQZXJjZW50KCkgPCAxKSB7XG4gICAgICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbiA9IHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICAgIGlmICh0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0ID0gdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCArIGFtb3VudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQgKz0gYW1vdW50O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldCA9IE1hdGgubWF4KE1hdGgubWluKHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldCwgdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbEhlaWdodCksIDApO1xuICAgICAgICB0aGlzLl9zbW9vdGhTY3JvbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NsZWFyU21vb3RoU2Nyb2xsU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2J1YmJsZVNjcm9sbChldiwgYW1vdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZGlzcCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc21vb3RoU2Nyb2xsRHVyYXRpb24pIHtcbiAgICAgIHRoaXMuX29uUmVxdWVzdFNjcm9sbExpbmVzLmZpcmUoeyBhbW91bnQ6IGRpc3AsIHN1cHByZXNzU2Nyb2xsRXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhbW91bnQgPSBkaXNwICogdGhpcy5fY3VycmVudFJvd0hlaWdodDtcbiAgICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBpZiAodGhpcy5fc21vb3RoU2Nyb2xsUGVyY2VudCgpIDwgMSkge1xuICAgICAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5vcmlnaW4gPSB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQgPSB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5vcmlnaW4gKyBhbW91bnQ7XG4gICAgICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldCA9IE1hdGgubWF4KE1hdGgubWluKHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldCwgdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbEhlaWdodCksIDApO1xuICAgICAgICB0aGlzLl9zbW9vdGhTY3JvbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NsZWFyU21vb3RoU2Nyb2xsU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRQaXhlbHNTY3JvbGxlZChldjogV2hlZWxFdmVudCk6IG51bWJlciB7XG4gICAgLy8gRG8gbm90aGluZyBpZiBpdCdzIG5vdCBhIHZlcnRpY2FsIHNjcm9sbCBldmVudFxuICAgIGlmIChldi5kZWx0YVkgPT09IDAgfHwgZXYuc2hpZnRLZXkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIFdoZWVsRXZlbnQuRE9NX0RFTFRBX1BJWEVMXG4gICAgbGV0IGFtb3VudCA9IHRoaXMuX2FwcGx5U2Nyb2xsTW9kaWZpZXIoZXYuZGVsdGFZLCBldik7XG4gICAgaWYgKGV2LmRlbHRhTW9kZSA9PT0gV2hlZWxFdmVudC5ET01fREVMVEFfTElORSkge1xuICAgICAgYW1vdW50ICo9IHRoaXMuX2N1cnJlbnRSb3dIZWlnaHQ7XG4gICAgfSBlbHNlIGlmIChldi5kZWx0YU1vZGUgPT09IFdoZWVsRXZlbnQuRE9NX0RFTFRBX1BBR0UpIHtcbiAgICAgIGFtb3VudCAqPSB0aGlzLl9jdXJyZW50Um93SGVpZ2h0ICogdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzO1xuICAgIH1cbiAgICByZXR1cm4gYW1vdW50O1xuICB9XG5cblxuICBwdWJsaWMgZ2V0QnVmZmVyRWxlbWVudHMoc3RhcnRMaW5lOiBudW1iZXIsIGVuZExpbmU/OiBudW1iZXIpOiB7IGJ1ZmZlckVsZW1lbnRzOiBIVE1MRWxlbWVudFtdLCBjdXJzb3JFbGVtZW50PzogSFRNTEVsZW1lbnQgfSB7XG4gICAgbGV0IGN1cnJlbnRMaW5lOiBzdHJpbmcgPSAnJztcbiAgICBsZXQgY3Vyc29yRWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgYnVmZmVyRWxlbWVudHM6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBjb25zdCBlbmQgPSBlbmRMaW5lID8/IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmxlbmd0aDtcbiAgICBjb25zdCBsaW5lcyA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzO1xuICAgIGZvciAobGV0IGkgPSBzdGFydExpbmU7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzLmdldChpKTtcbiAgICAgIGlmICghbGluZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzV3JhcHBlZCA9IGxpbmVzLmdldChpICsgMSk/LmlzV3JhcHBlZDtcbiAgICAgIGN1cnJlbnRMaW5lICs9IGxpbmUudHJhbnNsYXRlVG9TdHJpbmcoIWlzV3JhcHBlZCk7XG4gICAgICBpZiAoIWlzV3JhcHBlZCB8fCBpID09PSBsaW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYudGV4dENvbnRlbnQgPSBjdXJyZW50TGluZTtcbiAgICAgICAgYnVmZmVyRWxlbWVudHMucHVzaChkaXYpO1xuICAgICAgICBpZiAoY3VycmVudExpbmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGN1cnNvckVsZW1lbnQgPSBkaXY7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudExpbmUgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgYnVmZmVyRWxlbWVudHMsIGN1cnNvckVsZW1lbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHNjcm9sbGVkIGJ5IHRoZSBtb3VzZSBldmVudCB0YWtpbmcgaW50byBhY2NvdW50IHdoYXQgdHlwZSBvZiBkZWx0YVxuICAgKiBpcyBiZWluZyB1c2VkLlxuICAgKiBAcGFyYW0gZXYgVGhlIG1vdXNlIHdoZWVsIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIGdldExpbmVzU2Nyb2xsZWQoZXY6IFdoZWVsRXZlbnQpOiBudW1iZXIge1xuICAgIC8vIERvIG5vdGhpbmcgaWYgaXQncyBub3QgYSB2ZXJ0aWNhbCBzY3JvbGwgZXZlbnRcbiAgICBpZiAoZXYuZGVsdGFZID09PSAwIHx8IGV2LnNoaWZ0S2V5KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBXaGVlbEV2ZW50LkRPTV9ERUxUQV9MSU5FXG4gICAgbGV0IGFtb3VudCA9IHRoaXMuX2FwcGx5U2Nyb2xsTW9kaWZpZXIoZXYuZGVsdGFZLCBldik7XG4gICAgaWYgKGV2LmRlbHRhTW9kZSA9PT0gV2hlZWxFdmVudC5ET01fREVMVEFfUElYRUwpIHtcbiAgICAgIGFtb3VudCAvPSB0aGlzLl9jdXJyZW50Um93SGVpZ2h0ICsgMC4wOyAvLyBQcmV2ZW50IGludGVnZXIgZGl2aXNpb25cbiAgICAgIHRoaXMuX3doZWVsUGFydGlhbFNjcm9sbCArPSBhbW91bnQ7XG4gICAgICBhbW91bnQgPSBNYXRoLmZsb29yKE1hdGguYWJzKHRoaXMuX3doZWVsUGFydGlhbFNjcm9sbCkpICogKHRoaXMuX3doZWVsUGFydGlhbFNjcm9sbCA+IDAgPyAxIDogLTEpO1xuICAgICAgdGhpcy5fd2hlZWxQYXJ0aWFsU2Nyb2xsICU9IDE7XG4gICAgfSBlbHNlIGlmIChldi5kZWx0YU1vZGUgPT09IFdoZWVsRXZlbnQuRE9NX0RFTFRBX1BBR0UpIHtcbiAgICAgIGFtb3VudCAqPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3M7XG4gICAgfVxuICAgIHJldHVybiBhbW91bnQ7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVNjcm9sbE1vZGlmaWVyKGFtb3VudDogbnVtYmVyLCBldjogV2hlZWxFdmVudCk6IG51bWJlciB7XG4gICAgY29uc3QgbW9kaWZpZXIgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZhc3RTY3JvbGxNb2RpZmllcjtcbiAgICAvLyBNdWx0aXBseSB0aGUgc2Nyb2xsIHNwZWVkIHdoZW4gdGhlIG1vZGlmaWVyIGlzIGRvd25cbiAgICBpZiAoKG1vZGlmaWVyID09PSAnYWx0JyAmJiBldi5hbHRLZXkpIHx8XG4gICAgICAobW9kaWZpZXIgPT09ICdjdHJsJyAmJiBldi5jdHJsS2V5KSB8fFxuICAgICAgKG1vZGlmaWVyID09PSAnc2hpZnQnICYmIGV2LnNoaWZ0S2V5KSkge1xuICAgICAgcmV0dXJuIGFtb3VudCAqIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZmFzdFNjcm9sbFNlbnNpdGl2aXR5ICogdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eTtcbiAgICB9XG5cbiAgICByZXR1cm4gYW1vdW50ICogdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSB0b3VjaHN0YXJ0IGV2ZW50LCByZWNvcmRpbmcgdGhlIHRvdWNoIG9jY3VycmVkLlxuICAgKiBAcGFyYW0gZXYgVGhlIHRvdWNoIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIGhhbmRsZVRvdWNoU3RhcnQoZXY6IFRvdWNoRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9sYXN0VG91Y2hZID0gZXYudG91Y2hlc1swXS5wYWdlWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSB0b3VjaG1vdmUgZXZlbnQsIHNjcm9sbGluZyB0aGUgdmlld3BvcnQgaWYgdGhlIHBvc2l0aW9uIHNoaWZ0ZWQuXG4gICAqIEBwYXJhbSBldiBUaGUgdG91Y2ggZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlVG91Y2hNb3ZlKGV2OiBUb3VjaEV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGVsdGFZID0gdGhpcy5fbGFzdFRvdWNoWSAtIGV2LnRvdWNoZXNbMF0ucGFnZVk7XG4gICAgdGhpcy5fbGFzdFRvdWNoWSA9IGV2LnRvdWNoZXNbMF0ucGFnZVk7XG4gICAgaWYgKGRlbHRhWSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wICs9IGRlbHRhWTtcbiAgICByZXR1cm4gdGhpcy5fYnViYmxlU2Nyb2xsKGV2LCBkZWx0YVkpO1xuICB9XG59XG4iLCAiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IElDb3JlQnJvd3NlclNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJRGVjb3JhdGlvblNlcnZpY2UsIElJbnRlcm5hbERlY29yYXRpb24gfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgY2xhc3MgQnVmZmVyRGVjb3JhdGlvblJlbmRlcmVyIGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlY29yYXRpb25FbGVtZW50czogTWFwPElJbnRlcm5hbERlY29yYXRpb24sIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIF9hbmltYXRpb25GcmFtZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hbHRCdWZmZXJJc0FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9kaW1lbnNpb25zQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASUNvcmVCcm93c2VyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgQElEZWNvcmF0aW9uU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9kZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIEBJUmVuZGVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWRlY29yYXRpb24tY29udGFpbmVyJyk7XG4gICAgdGhpcy5fc2NyZWVuRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uUmVuZGVyZWRWaWV3cG9ydENoYW5nZSgoKSA9PiB0aGlzLl9kb1JlZnJlc2hEZWNvcmF0aW9ucygpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uRGltZW5zaW9uc0NoYW5nZSgoKSA9PiB7XG4gICAgICB0aGlzLl9kaW1lbnNpb25zQ2hhbmdlZCA9IHRydWU7XG4gICAgICB0aGlzLl9xdWV1ZVJlZnJlc2goKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uub25EcHJDaGFuZ2UoKCkgPT4gdGhpcy5fcXVldWVSZWZyZXNoKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5vbkJ1ZmZlckFjdGl2YXRlKCgpID0+IHtcbiAgICAgIHRoaXMuX2FsdEJ1ZmZlcklzQWN0aXZlID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIgPT09IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hbHQ7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fZGVjb3JhdGlvblNlcnZpY2Uub25EZWNvcmF0aW9uUmVnaXN0ZXJlZCgoKSA9PiB0aGlzLl9xdWV1ZVJlZnJlc2goKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fZGVjb3JhdGlvblNlcnZpY2Uub25EZWNvcmF0aW9uUmVtb3ZlZChkZWNvcmF0aW9uID0+IHRoaXMuX3JlbW92ZURlY29yYXRpb24oZGVjb3JhdGlvbikpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuY2xlYXIoKTtcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9xdWV1ZVJlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FuaW1hdGlvbkZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmFkZFJlZnJlc2hDYWxsYmFjaygoKSA9PiB7XG4gICAgICB0aGlzLl9kb1JlZnJlc2hEZWNvcmF0aW9ucygpO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9kb1JlZnJlc2hEZWNvcmF0aW9ucygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGRlY29yYXRpb24gb2YgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UuZGVjb3JhdGlvbnMpIHtcbiAgICAgIHRoaXMuX3JlbmRlckRlY29yYXRpb24oZGVjb3JhdGlvbik7XG4gICAgfVxuICAgIHRoaXMuX2RpbWVuc2lvbnNDaGFuZ2VkID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJEZWNvcmF0aW9uKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLl9yZWZyZXNoU3R5bGUoZGVjb3JhdGlvbik7XG4gICAgaWYgKHRoaXMuX2RpbWVuc2lvbnNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoWFBvc2l0aW9uKGRlY29yYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUVsZW1lbnQoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbik6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWRlY29yYXRpb24nKTtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3h0ZXJtLWRlY29yYXRpb24tdG9wLWxheWVyJywgZGVjb3JhdGlvbj8ub3B0aW9ucz8ubGF5ZXIgPT09ICd0b3AnKTtcbiAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gYCR7TWF0aC5yb3VuZCgoZGVjb3JhdGlvbi5vcHRpb25zLndpZHRoIHx8IDEpICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoKX1weGA7XG4gICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHsoZGVjb3JhdGlvbi5vcHRpb25zLmhlaWdodCB8fCAxKSAqIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7KGRlY29yYXRpb24ubWFya2VyLmxpbmUgLSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZlLnlkaXNwKSAqIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuICAgIGVsZW1lbnQuc3R5bGUubGluZUhlaWdodCA9IGAke3RoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuXG4gICAgY29uc3QgeCA9IGRlY29yYXRpb24ub3B0aW9ucy54ID8/IDA7XG4gICAgaWYgKHggJiYgeCA+IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scykge1xuICAgICAgLy8gZXhjZWVkZWQgdGhlIGNvbnRhaW5lciB3aWR0aCwgc28gaGlkZVxuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgICB0aGlzLl9yZWZyZXNoWFBvc2l0aW9uKGRlY29yYXRpb24sIGVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoU3R5bGUoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGxpbmUgPSBkZWNvcmF0aW9uLm1hcmtlci5saW5lIC0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS55ZGlzcDtcbiAgICBpZiAobGluZSA8IDAgfHwgbGluZSA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpIHtcbiAgICAgIC8vIG91dHNpZGUgb2Ygdmlld3BvcnRcbiAgICAgIGlmIChkZWNvcmF0aW9uLmVsZW1lbnQpIHtcbiAgICAgICAgZGVjb3JhdGlvbi5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRlY29yYXRpb24ub25SZW5kZXJFbWl0dGVyLmZpcmUoZGVjb3JhdGlvbi5lbGVtZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuZ2V0KGRlY29yYXRpb24pO1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQgPSB0aGlzLl9jcmVhdGVFbGVtZW50KGRlY29yYXRpb24pO1xuICAgICAgICBkZWNvcmF0aW9uLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuc2V0KGRlY29yYXRpb24sIGVsZW1lbnQpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIGRlY29yYXRpb24ub25EaXNwb3NlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuZGVsZXRlKGRlY29yYXRpb24pO1xuICAgICAgICAgIGVsZW1lbnQhLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7bGluZSAqIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdGhpcy5fYWx0QnVmZmVySXNBY3RpdmUgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgZGVjb3JhdGlvbi5vblJlbmRlckVtaXR0ZXIuZmlyZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoWFBvc2l0aW9uKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24sIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gZGVjb3JhdGlvbi5lbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHggPSBkZWNvcmF0aW9uLm9wdGlvbnMueCA/PyAwO1xuICAgIGlmICgoZGVjb3JhdGlvbi5vcHRpb25zLmFuY2hvciB8fCAnbGVmdCcpID09PSAncmlnaHQnKSB7XG4gICAgICBlbGVtZW50LnN0eWxlLnJpZ2h0ID0geCA/IGAke3ggKiB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwud2lkdGh9cHhgIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IHggPyBgJHt4ICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRofXB4YCA6ICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZURlY29yYXRpb24oZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX2RlY29yYXRpb25FbGVtZW50cy5nZXQoZGVjb3JhdGlvbik/LnJlbW92ZSgpO1xuICAgIHRoaXMuX2RlY29yYXRpb25FbGVtZW50cy5kZWxldGUoZGVjb3JhdGlvbik7XG4gICAgZGVjb3JhdGlvbi5kaXNwb3NlKCk7XG4gIH1cbn1cbiIsICIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgSUludGVybmFsRGVjb3JhdGlvbiB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbG9yWm9uZVN0b3JlIHtcbiAgcmVhZG9ubHkgem9uZXM6IElDb2xvclpvbmVbXTtcbiAgY2xlYXIoKTogdm9pZDtcbiAgYWRkRGVjb3JhdGlvbihkZWNvcmF0aW9uOiBJSW50ZXJuYWxEZWNvcmF0aW9uKTogdm9pZDtcbiAgLyoqXG4gICAqIFNldHMgdGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIGxpbmVzIHRoYXQgd2lsbCBiZSBhZGRlZCBiZXR3ZWVuIHpvbmVzLCBpZiBuZXcgbGluZXMgaW50ZXJzZWN0XG4gICAqIHRoZSBwYWRkaW5nIHRoZXkgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgc2FtZSB6b25lLlxuICAgKi9cbiAgc2V0UGFkZGluZyhwYWRkaW5nOiB7IFtwb3NpdGlvbjogc3RyaW5nXTogbnVtYmVyIH0pOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2xvclpvbmUge1xuICAvKiogQ29sb3IgaW4gYSBmb3JtYXQgc3VwcG9ydGVkIGJ5IGNhbnZhcycgZmlsbFN0eWxlLiAqL1xuICBjb2xvcjogc3RyaW5nO1xuICBwb3NpdGlvbjogJ2Z1bGwnIHwgJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnIHwgdW5kZWZpbmVkO1xuICBzdGFydEJ1ZmZlckxpbmU6IG51bWJlcjtcbiAgZW5kQnVmZmVyTGluZTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSU1pbmltYWxEZWNvcmF0aW9uRm9yQ29sb3Jab25lIHtcbiAgbWFya2VyOiBQaWNrPElJbnRlcm5hbERlY29yYXRpb25bJ21hcmtlciddLCAnbGluZSc+O1xuICBvcHRpb25zOiBQaWNrPElJbnRlcm5hbERlY29yYXRpb25bJ29wdGlvbnMnXSwgJ292ZXJ2aWV3UnVsZXJPcHRpb25zJz47XG59XG5cbmV4cG9ydCBjbGFzcyBDb2xvclpvbmVTdG9yZSBpbXBsZW1lbnRzIElDb2xvclpvbmVTdG9yZSB7XG4gIHByaXZhdGUgX3pvbmVzOiBJQ29sb3Jab25lW10gPSBbXTtcblxuICAvLyBUaGUgem9uZSBwb29sIGlzIHVzZWQgdG8ga2VlcCB6b25lIG9iamVjdHMgZnJvbSBiZWluZyBmcmVlZCBiZXR3ZWVuIGNsZWFyaW5nIHRoZSBjb2xvciB6b25lXG4gIC8vIHN0b3JlIGFuZCBmZXRjaGluZyB0aGUgem9uZXMuIFRoaXMgaGVscHMgcmVkdWNlIEdDIHByZXNzdXJlIHNpbmNlIHRoZSBjb2xvciB6b25lcyBhcmVcbiAgLy8gYWNjdW11bGF0ZWQgb24gcG90ZW50aWFsbHkgZXZlcnkgc2Nyb2xsIGV2ZW50LlxuICBwcml2YXRlIF96b25lUG9vbDogSUNvbG9yWm9uZVtdID0gW107XG4gIHByaXZhdGUgX3pvbmVQb29sSW5kZXggPSAwO1xuXG4gIHByaXZhdGUgX2xpbmVQYWRkaW5nOiB7IFtwb3NpdGlvbjogc3RyaW5nXTogbnVtYmVyIH0gPSB7XG4gICAgZnVsbDogMCxcbiAgICBsZWZ0OiAwLFxuICAgIGNlbnRlcjogMCxcbiAgICByaWdodDogMFxuICB9O1xuXG4gIHB1YmxpYyBnZXQgem9uZXMoKTogSUNvbG9yWm9uZVtdIHtcbiAgICAvLyBUcmltIHRoZSB6b25lIHBvb2wgdG8gZnJlZSB1bnVzZWQgbWVtb3J5XG4gICAgdGhpcy5fem9uZVBvb2wubGVuZ3RoID0gTWF0aC5taW4odGhpcy5fem9uZVBvb2wubGVuZ3RoLCB0aGlzLl96b25lcy5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzLl96b25lcztcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl96b25lcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX3pvbmVQb29sSW5kZXggPSAwO1xuICB9XG5cbiAgcHVibGljIGFkZERlY29yYXRpb24oZGVjb3JhdGlvbjogSU1pbmltYWxEZWNvcmF0aW9uRm9yQ29sb3Jab25lKTogdm9pZCB7XG4gICAgaWYgKCFkZWNvcmF0aW9uLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB6IG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBpZiAoei5jb2xvciA9PT0gZGVjb3JhdGlvbi5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLmNvbG9yICYmXG4gICAgICAgICAgei5wb3NpdGlvbiA9PT0gZGVjb3JhdGlvbi5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl9saW5lSW50ZXJzZWN0c1pvbmUoeiwgZGVjb3JhdGlvbi5tYXJrZXIubGluZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2xpbmVBZGphY2VudFRvWm9uZSh6LCBkZWNvcmF0aW9uLm1hcmtlci5saW5lLCBkZWNvcmF0aW9uLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMucG9zaXRpb24pKSB7XG4gICAgICAgICAgdGhpcy5fYWRkTGluZVRvWm9uZSh6LCBkZWNvcmF0aW9uLm1hcmtlci5saW5lKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ3JlYXRlIHVzaW5nIHpvbmUgcG9vbCBpZiBwb3NzaWJsZVxuICAgIGlmICh0aGlzLl96b25lUG9vbEluZGV4IDwgdGhpcy5fem9uZVBvb2wubGVuZ3RoKSB7XG4gICAgICB0aGlzLl96b25lUG9vbFt0aGlzLl96b25lUG9vbEluZGV4XS5jb2xvciA9IGRlY29yYXRpb24ub3B0aW9ucy5vdmVydmlld1J1bGVyT3B0aW9ucy5jb2xvcjtcbiAgICAgIHRoaXMuX3pvbmVQb29sW3RoaXMuX3pvbmVQb29sSW5kZXhdLnBvc2l0aW9uID0gZGVjb3JhdGlvbi5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLnBvc2l0aW9uO1xuICAgICAgdGhpcy5fem9uZVBvb2xbdGhpcy5fem9uZVBvb2xJbmRleF0uc3RhcnRCdWZmZXJMaW5lID0gZGVjb3JhdGlvbi5tYXJrZXIubGluZTtcbiAgICAgIHRoaXMuX3pvbmVQb29sW3RoaXMuX3pvbmVQb29sSW5kZXhdLmVuZEJ1ZmZlckxpbmUgPSBkZWNvcmF0aW9uLm1hcmtlci5saW5lO1xuICAgICAgdGhpcy5fem9uZXMucHVzaCh0aGlzLl96b25lUG9vbFt0aGlzLl96b25lUG9vbEluZGV4KytdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ3JlYXRlXG4gICAgdGhpcy5fem9uZXMucHVzaCh7XG4gICAgICBjb2xvcjogZGVjb3JhdGlvbi5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLmNvbG9yLFxuICAgICAgcG9zaXRpb246IGRlY29yYXRpb24ub3B0aW9ucy5vdmVydmlld1J1bGVyT3B0aW9ucy5wb3NpdGlvbixcbiAgICAgIHN0YXJ0QnVmZmVyTGluZTogZGVjb3JhdGlvbi5tYXJrZXIubGluZSxcbiAgICAgIGVuZEJ1ZmZlckxpbmU6IGRlY29yYXRpb24ubWFya2VyLmxpbmVcbiAgICB9KTtcbiAgICB0aGlzLl96b25lUG9vbC5wdXNoKHRoaXMuX3pvbmVzW3RoaXMuX3pvbmVzLmxlbmd0aCAtIDFdKTtcbiAgICB0aGlzLl96b25lUG9vbEluZGV4Kys7XG4gIH1cblxuICBwdWJsaWMgc2V0UGFkZGluZyhwYWRkaW5nOiB7IFtwb3NpdGlvbjogc3RyaW5nXTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICB0aGlzLl9saW5lUGFkZGluZyA9IHBhZGRpbmc7XG4gIH1cblxuICBwcml2YXRlIF9saW5lSW50ZXJzZWN0c1pvbmUoem9uZTogSUNvbG9yWm9uZSwgbGluZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGxpbmUgPj0gem9uZS5zdGFydEJ1ZmZlckxpbmUgJiZcbiAgICAgIGxpbmUgPD0gem9uZS5lbmRCdWZmZXJMaW5lXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpbmVBZGphY2VudFRvWm9uZSh6b25lOiBJQ29sb3Jab25lLCBsaW5lOiBudW1iZXIsIHBvc2l0aW9uOiBJQ29sb3Jab25lWydwb3NpdGlvbiddKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIChsaW5lID49IHpvbmUuc3RhcnRCdWZmZXJMaW5lIC0gdGhpcy5fbGluZVBhZGRpbmdbcG9zaXRpb24gfHwgJ2Z1bGwnXSkgJiZcbiAgICAgIChsaW5lIDw9IHpvbmUuZW5kQnVmZmVyTGluZSArIHRoaXMuX2xpbmVQYWRkaW5nW3Bvc2l0aW9uIHx8ICdmdWxsJ10pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZExpbmVUb1pvbmUoem9uZTogSUNvbG9yWm9uZSwgbGluZTogbnVtYmVyKTogdm9pZCB7XG4gICAgem9uZS5zdGFydEJ1ZmZlckxpbmUgPSBNYXRoLm1pbih6b25lLnN0YXJ0QnVmZmVyTGluZSwgbGluZSk7XG4gICAgem9uZS5lbmRCdWZmZXJMaW5lID0gTWF0aC5tYXgoem9uZS5lbmRCdWZmZXJMaW5lLCBsaW5lKTtcbiAgfVxufVxuIiwgIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBDb2xvclpvbmVTdG9yZSwgSUNvbG9yWm9uZSwgSUNvbG9yWm9uZVN0b3JlIH0gZnJvbSAnYnJvd3Nlci9kZWNvcmF0aW9ucy9Db2xvclpvbmVTdG9yZSc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSURlY29yYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG4vLyBIZWxwZXIgb2JqZWN0cyB0byBhdm9pZCBleGNlc3NpdmUgY2FsY3VsYXRpb24gYW5kIGdhcmJhZ2UgY29sbGVjdGlvbiBkdXJpbmcgcmVuZGVyaW5nLiBUaGVzZSBhcmVcbi8vIHN0YXRpYyB2YWx1ZXMgZm9yIGVhY2ggcmVuZGVyIGFuZCBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgdGhlIGRlY29yYXRpb24gcG9zaXRpb24gYXMgdGhlIGtleS5cbmNvbnN0IGRyYXdIZWlnaHQgPSB7XG4gIGZ1bGw6IDAsXG4gIGxlZnQ6IDAsXG4gIGNlbnRlcjogMCxcbiAgcmlnaHQ6IDBcbn07XG5jb25zdCBkcmF3V2lkdGggPSB7XG4gIGZ1bGw6IDAsXG4gIGxlZnQ6IDAsXG4gIGNlbnRlcjogMCxcbiAgcmlnaHQ6IDBcbn07XG5jb25zdCBkcmF3WCA9IHtcbiAgZnVsbDogMCxcbiAgbGVmdDogMCxcbiAgY2VudGVyOiAwLFxuICByaWdodDogMFxufTtcblxuZXhwb3J0IGNsYXNzIE92ZXJ2aWV3UnVsZXJSZW5kZXJlciBleHRlbmRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9jdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29sb3Jab25lU3RvcmU6IElDb2xvclpvbmVTdG9yZSA9IG5ldyBDb2xvclpvbmVTdG9yZSgpO1xuICBwcml2YXRlIGdldCBfd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5vdmVydmlld1J1bGVyV2lkdGggfHwgMDtcbiAgfVxuICBwcml2YXRlIF9hbmltYXRpb25GcmFtZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX3Nob3VsZFVwZGF0ZURpbWVuc2lvbnM6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB0cnVlO1xuICBwcml2YXRlIF9zaG91bGRVcGRhdGVBbmNob3I6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB0cnVlO1xuICBwcml2YXRlIF9sYXN0S25vd25CdWZmZXJMZW5ndGg6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBfY29udGFpbmVySGVpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdmlld3BvcnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zY3JlZW5FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElEZWNvcmF0aW9uU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9kZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIEBJUmVuZGVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZSxcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgQElDb3JlQnJvd3NlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY2FudmFzID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICB0aGlzLl9jYW52YXMuY2xhc3NMaXN0LmFkZCgneHRlcm0tZGVjb3JhdGlvbi1vdmVydmlldy1ydWxlcicpO1xuICAgIHRoaXMuX3JlZnJlc2hDYW52YXNEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5fdmlld3BvcnRFbGVtZW50LnBhcmVudEVsZW1lbnQ/Lmluc2VydEJlZm9yZSh0aGlzLl9jYW52YXMsIHRoaXMuX3ZpZXdwb3J0RWxlbWVudCk7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5fY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3R4IGNhbm5vdCBiZSBudWxsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2N0eCA9IGN0eDtcbiAgICB9XG4gICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0aW9uTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJCdWZmZXJDaGFuZ2VMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9yZWdpc3RlckRpbWVuc2lvbkNoYW5nZUxpc3RlbmVycygpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgIHRoaXMuX2NhbnZhcz8ucmVtb3ZlKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIGRlY29yYXRpb24gYWRkIG9yIHJlbW92ZSwgcmVkcmF3XG4gICAqL1xuICBwcml2YXRlIF9yZWdpc3RlckRlY29yYXRpb25MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5vbkRlY29yYXRpb25SZWdpc3RlcmVkKCgpID0+IHRoaXMuX3F1ZXVlUmVmcmVzaCh1bmRlZmluZWQsIHRydWUpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5vbkRlY29yYXRpb25SZW1vdmVkKCgpID0+IHRoaXMuX3F1ZXVlUmVmcmVzaCh1bmRlZmluZWQsIHRydWUpKSk7XG4gIH1cblxuICAvKipcbiAgICogT24gYnVmZmVyIGNoYW5nZSwgcmVkcmF3XG4gICAqIGFuZCBoaWRlIHRoZSBjYW52YXMgaWYgdGhlIGFsdCBidWZmZXIgaXMgYWN0aXZlXG4gICAqL1xuICBwcml2YXRlIF9yZWdpc3RlckJ1ZmZlckNoYW5nZUxpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3JlbmRlclNlcnZpY2Uub25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlKCgpID0+IHRoaXMuX3F1ZXVlUmVmcmVzaCgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMub25CdWZmZXJBY3RpdmF0ZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jYW52YXMhLnN0eWxlLmRpc3BsYXkgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlciA9PT0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFsdCA/ICdub25lJyA6ICdibG9jayc7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fYnVmZmVyU2VydmljZS5vblNjcm9sbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fbGFzdEtub3duQnVmZmVyTGVuZ3RoICE9PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMubm9ybWFsLmxpbmVzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9yZWZyZXNoRHJhd0hlaWdodENvbnN0YW50cygpO1xuICAgICAgICB0aGlzLl9yZWZyZXNoQ29sb3Jab25lUGFkZGluZygpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogT24gZGltZW5zaW9uIGNoYW5nZSwgdXBkYXRlIGNhbnZhcyBkaW1lbnNpb25zXG4gICAqIGFuZCB0aGVuIHJlZHJhd1xuICAgKi9cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJEaW1lbnNpb25DaGFuZ2VMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gY29udGFpbmVyIGhlaWdodCBjaGFuZ2VkXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uUmVuZGVyKCgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghdGhpcy5fY29udGFpbmVySGVpZ2h0IHx8IHRoaXMuX2NvbnRhaW5lckhlaWdodCAhPT0gdGhpcy5fc2NyZWVuRWxlbWVudC5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgdGhpcy5fcXVldWVSZWZyZXNoKHRydWUpO1xuICAgICAgICB0aGlzLl9jb250YWluZXJIZWlnaHQgPSB0aGlzLl9zY3JlZW5FbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgLy8gb3ZlcnZpZXcgcnVsZXIgd2lkdGggY2hhbmdlZFxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgnb3ZlcnZpZXdSdWxlcldpZHRoJywgKCkgPT4gdGhpcy5fcXVldWVSZWZyZXNoKHRydWUpKSk7XG4gICAgLy8gZGV2aWNlIHBpeGVsIHJhdGlvIGNoYW5nZWRcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5vbkRwckNoYW5nZSgoKSA9PiB0aGlzLl9xdWV1ZVJlZnJlc2godHJ1ZSkpKTtcbiAgICAvLyBzZXQgdGhlIGNhbnZhcyBkaW1lbnNpb25zXG4gICAgdGhpcy5fcXVldWVSZWZyZXNoKHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaERyYXdDb25zdGFudHMoKTogdm9pZCB7XG4gICAgLy8gd2lkdGhcbiAgICBjb25zdCBvdXRlcldpZHRoID0gTWF0aC5mbG9vcih0aGlzLl9jYW52YXMud2lkdGggLyAzKTtcbiAgICBjb25zdCBpbm5lcldpZHRoID0gTWF0aC5jZWlsKHRoaXMuX2NhbnZhcy53aWR0aCAvIDMpO1xuICAgIGRyYXdXaWR0aC5mdWxsID0gdGhpcy5fY2FudmFzLndpZHRoO1xuICAgIGRyYXdXaWR0aC5sZWZ0ID0gb3V0ZXJXaWR0aDtcbiAgICBkcmF3V2lkdGguY2VudGVyID0gaW5uZXJXaWR0aDtcbiAgICBkcmF3V2lkdGgucmlnaHQgPSBvdXRlcldpZHRoO1xuICAgIC8vIGhlaWdodFxuICAgIHRoaXMuX3JlZnJlc2hEcmF3SGVpZ2h0Q29uc3RhbnRzKCk7XG4gICAgLy8geFxuICAgIGRyYXdYLmZ1bGwgPSAwO1xuICAgIGRyYXdYLmxlZnQgPSAwO1xuICAgIGRyYXdYLmNlbnRlciA9IGRyYXdXaWR0aC5sZWZ0O1xuICAgIGRyYXdYLnJpZ2h0ID0gZHJhd1dpZHRoLmxlZnQgKyBkcmF3V2lkdGguY2VudGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaERyYXdIZWlnaHRDb25zdGFudHMoKTogdm9pZCB7XG4gICAgZHJhd0hlaWdodC5mdWxsID0gTWF0aC5yb3VuZCgyICogdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcik7XG4gICAgLy8gQ2FsY3VsYXRlIGFjdHVhbCBwaXhlbHMgcGVyIGxpbmVcbiAgICBjb25zdCBwaXhlbHNQZXJMaW5lID0gdGhpcy5fY2FudmFzLmhlaWdodCAvIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmxlbmd0aDtcbiAgICAvLyBDbGFtcCBhY3R1YWwgcGl4ZWxzIHdpdGhpbiBhIHJhbmdlXG4gICAgY29uc3Qgbm9uRnVsbEhlaWdodCA9IE1hdGgucm91bmQoTWF0aC5tYXgoTWF0aC5taW4ocGl4ZWxzUGVyTGluZSwgMTIpLCA2KSAqIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIpO1xuICAgIGRyYXdIZWlnaHQubGVmdCA9IG5vbkZ1bGxIZWlnaHQ7XG4gICAgZHJhd0hlaWdodC5jZW50ZXIgPSBub25GdWxsSGVpZ2h0O1xuICAgIGRyYXdIZWlnaHQucmlnaHQgPSBub25GdWxsSGVpZ2h0O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaENvbG9yWm9uZVBhZGRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5fY29sb3Jab25lU3RvcmUuc2V0UGFkZGluZyh7XG4gICAgICBmdWxsOiBNYXRoLmZsb29yKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmUubGluZXMubGVuZ3RoIC8gKHRoaXMuX2NhbnZhcy5oZWlnaHQgLSAxKSAqIGRyYXdIZWlnaHQuZnVsbCksXG4gICAgICBsZWZ0OiBNYXRoLmZsb29yKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmUubGluZXMubGVuZ3RoIC8gKHRoaXMuX2NhbnZhcy5oZWlnaHQgLSAxKSAqIGRyYXdIZWlnaHQubGVmdCksXG4gICAgICBjZW50ZXI6IE1hdGguZmxvb3IodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS5saW5lcy5sZW5ndGggLyAodGhpcy5fY2FudmFzLmhlaWdodCAtIDEpICogZHJhd0hlaWdodC5jZW50ZXIpLFxuICAgICAgcmlnaHQ6IE1hdGguZmxvb3IodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS5saW5lcy5sZW5ndGggLyAodGhpcy5fY2FudmFzLmhlaWdodCAtIDEpICogZHJhd0hlaWdodC5yaWdodClcbiAgICB9KTtcbiAgICB0aGlzLl9sYXN0S25vd25CdWZmZXJMZW5ndGggPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMubm9ybWFsLmxpbmVzLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZnJlc2hDYW52YXNEaW1lbnNpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbnZhcy5zdHlsZS53aWR0aCA9IGAke3RoaXMuX3dpZHRofXB4YDtcbiAgICB0aGlzLl9jYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuX3dpZHRoICogdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcik7XG4gICAgdGhpcy5fY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke3RoaXMuX3NjcmVlbkVsZW1lbnQuY2xpZW50SGVpZ2h0fXB4YDtcbiAgICB0aGlzLl9jYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZCh0aGlzLl9zY3JlZW5FbGVtZW50LmNsaWVudEhlaWdodCAqIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIpO1xuICAgIHRoaXMuX3JlZnJlc2hEcmF3Q29uc3RhbnRzKCk7XG4gICAgdGhpcy5fcmVmcmVzaENvbG9yWm9uZVBhZGRpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZnJlc2hEZWNvcmF0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2hvdWxkVXBkYXRlRGltZW5zaW9ucykge1xuICAgICAgdGhpcy5fcmVmcmVzaENhbnZhc0RpbWVuc2lvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5fY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLl9jYW52YXMud2lkdGgsIHRoaXMuX2NhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuX2NvbG9yWm9uZVN0b3JlLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBkZWNvcmF0aW9uIG9mIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLmRlY29yYXRpb25zKSB7XG4gICAgICB0aGlzLl9jb2xvclpvbmVTdG9yZS5hZGREZWNvcmF0aW9uKGRlY29yYXRpb24pO1xuICAgIH1cbiAgICB0aGlzLl9jdHgubGluZVdpZHRoID0gMTtcbiAgICBjb25zdCB6b25lcyA9IHRoaXMuX2NvbG9yWm9uZVN0b3JlLnpvbmVzO1xuICAgIGZvciAoY29uc3Qgem9uZSBvZiB6b25lcykge1xuICAgICAgaWYgKHpvbmUucG9zaXRpb24gIT09ICdmdWxsJykge1xuICAgICAgICB0aGlzLl9yZW5kZXJDb2xvclpvbmUoem9uZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qgem9uZSBvZiB6b25lcykge1xuICAgICAgaWYgKHpvbmUucG9zaXRpb24gPT09ICdmdWxsJykge1xuICAgICAgICB0aGlzLl9yZW5kZXJDb2xvclpvbmUoem9uZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3Nob3VsZFVwZGF0ZURpbWVuc2lvbnMgPSBmYWxzZTtcbiAgICB0aGlzLl9zaG91bGRVcGRhdGVBbmNob3IgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckNvbG9yWm9uZSh6b25lOiBJQ29sb3Jab25lKTogdm9pZCB7XG4gICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9IHpvbmUuY29sb3I7XG4gICAgdGhpcy5fY3R4LmZpbGxSZWN0KFxuICAgICAgLyogeCAqLyBkcmF3WFt6b25lLnBvc2l0aW9uIHx8ICdmdWxsJ10sXG4gICAgICAvKiB5ICovIE1hdGgucm91bmQoXG4gICAgICAgICh0aGlzLl9jYW52YXMuaGVpZ2h0IC0gMSkgKiAvLyAtMSB0byBlbnN1cmUgYXQgbGVhc3QgMnB4IGFyZSBhbGxvd2VkIGZvciBkZWNvcmF0aW9uIG9uIGxhc3QgbGluZVxuICAgICAgICAoem9uZS5zdGFydEJ1ZmZlckxpbmUgLyB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZlLmxpbmVzLmxlbmd0aCkgLSBkcmF3SGVpZ2h0W3pvbmUucG9zaXRpb24gfHwgJ2Z1bGwnXSAvIDJcbiAgICAgICksXG4gICAgICAvKiB3ICovIGRyYXdXaWR0aFt6b25lLnBvc2l0aW9uIHx8ICdmdWxsJ10sXG4gICAgICAvKiBoICovIE1hdGgucm91bmQoXG4gICAgICAgICh0aGlzLl9jYW52YXMuaGVpZ2h0IC0gMSkgKiAvLyAtMSB0byBlbnN1cmUgYXQgbGVhc3QgMnB4IGFyZSBhbGxvd2VkIGZvciBkZWNvcmF0aW9uIG9uIGxhc3QgbGluZVxuICAgICAgICAoKHpvbmUuZW5kQnVmZmVyTGluZSAtIHpvbmUuc3RhcnRCdWZmZXJMaW5lKSAvIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmUubGluZXMubGVuZ3RoKSArIGRyYXdIZWlnaHRbem9uZS5wb3NpdGlvbiB8fCAnZnVsbCddXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3F1ZXVlUmVmcmVzaCh1cGRhdGVDYW52YXNEaW1lbnNpb25zPzogYm9vbGVhbiwgdXBkYXRlQW5jaG9yPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3Nob3VsZFVwZGF0ZURpbWVuc2lvbnMgPSB1cGRhdGVDYW52YXNEaW1lbnNpb25zIHx8IHRoaXMuX3Nob3VsZFVwZGF0ZURpbWVuc2lvbnM7XG4gICAgdGhpcy5fc2hvdWxkVXBkYXRlQW5jaG9yID0gdXBkYXRlQW5jaG9yIHx8IHRoaXMuX3Nob3VsZFVwZGF0ZUFuY2hvcjtcbiAgICBpZiAodGhpcy5fYW5pbWF0aW9uRnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuX3JlZnJlc2hEZWNvcmF0aW9ucygpO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSUNvcmVTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgQzAgfSBmcm9tICdjb21tb24vZGF0YS9Fc2NhcGVTZXF1ZW5jZXMnO1xuXG5pbnRlcmZhY2UgSVBvc2l0aW9uIHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG59XG5cbi8qKlxuICogRW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBmb3IgaGFuZGxpbmcgY29tcG9zaXRpb25zdGFydCwgY29tcG9zaXRpb251cGRhdGUgYW5kIGNvbXBvc2l0aW9uZW5kXG4gKiBldmVudHMsIGRpc3BsYXlpbmcgdGhlIGluLXByb2dyZXNzIGNvbXBvc2l0aW9uIHRvIHRoZSBVSSBhbmQgZm9yd2FyZGluZyB0aGUgZmluYWwgY29tcG9zaXRpb25cbiAqIHRvIHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRpb25IZWxwZXIge1xuICAvKipcbiAgICogV2hldGhlciBpbnB1dCBjb21wb3NpdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nLCBlZy4gdmlhIGEgbW9iaWxlIGtleWJvYXJkLCBzcGVlY2ggaW5wdXQgb3JcbiAgICogSU1FLiBUaGlzIHZhcmlhYmxlIGRldGVybWluZXMgd2hldGhlciB0aGUgY29tcG9zaXRpb25UZXh0IHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlIFVJLlxuICAgKi9cbiAgcHJpdmF0ZSBfaXNDb21wb3Npbmc6IGJvb2xlYW47XG4gIHB1YmxpYyBnZXQgaXNDb21wb3NpbmcoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0NvbXBvc2luZzsgfVxuXG4gIC8qKlxuICAgKiBUaGUgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCB0ZXh0YXJlYSdzIHZhbHVlIG9mIHRoZSBjdXJyZW50IGNvbXBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tcG9zaXRpb25Qb3NpdGlvbjogSVBvc2l0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgY29tcG9zaXRpb24gaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgc2VudCwgc2V0dGluZyB0aGlzIHRvIGZhbHNlIHdpbGwgY2FuY2VsIGFueVxuICAgKiBpbi1wcm9ncmVzcyBjb21wb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgX2lzU2VuZGluZ0NvbXBvc2l0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEYXRhIGFscmVhZHkgc2VudCBkdWUgdG8ga2V5ZG93biBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2RhdGFBbHJlYWR5U2VudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RleHRhcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbXBvc2l0aW9uVmlldzogSFRNTEVsZW1lbnQsXG4gICAgQElCdWZmZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBASUNvcmVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsXG4gICAgQElSZW5kZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlclNlcnZpY2U6IElSZW5kZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuX2lzQ29tcG9zaW5nID0gZmFsc2U7XG4gICAgdGhpcy5faXNTZW5kaW5nQ29tcG9zaXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uID0geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgdGhpcy5fZGF0YUFscmVhZHlTZW50ID0gJyc7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY29tcG9zaXRpb25zdGFydCBldmVudCwgYWN0aXZhdGluZyB0aGUgY29tcG9zaXRpb24gdmlldy5cbiAgICovXG4gIHB1YmxpYyBjb21wb3NpdGlvbnN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2lzQ29tcG9zaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0ID0gdGhpcy5fdGV4dGFyZWEudmFsdWUubGVuZ3RoO1xuICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldy50ZXh0Q29udGVudCA9ICcnO1xuICAgIHRoaXMuX2RhdGFBbHJlYWR5U2VudCA9ICcnO1xuICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjb21wb3NpdGlvbnVwZGF0ZSBldmVudCwgdXBkYXRpbmcgdGhlIGNvbXBvc2l0aW9uIHZpZXcuXG4gICAqIEBwYXJhbSBldiBUaGUgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgY29tcG9zaXRpb251cGRhdGUoZXY6IFBpY2s8Q29tcG9zaXRpb25FdmVudCwgJ2RhdGEnPik6IHZvaWQge1xuICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldy50ZXh0Q29udGVudCA9IGV2LmRhdGE7XG4gICAgdGhpcy51cGRhdGVDb21wb3NpdGlvbkVsZW1lbnRzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLmVuZCA9IHRoaXMuX3RleHRhcmVhLnZhbHVlLmxlbmd0aDtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjb21wb3NpdGlvbmVuZCBldmVudCwgaGlkaW5nIHRoZSBjb21wb3NpdGlvbiB2aWV3IGFuZCBzZW5kaW5nIHRoZSBjb21wb3NpdGlvbiB0b1xuICAgKiB0aGUgaGFuZGxlci5cbiAgICovXG4gIHB1YmxpYyBjb21wb3NpdGlvbmVuZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9maW5hbGl6ZUNvbXBvc2l0aW9uKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGtleWRvd24gZXZlbnQsIHJvdXRpbmcgYW55IG5lY2Vzc2FyeSBldmVudHMgdG8gdGhlIENvbXBvc2l0aW9uSGVscGVyIGZ1bmN0aW9ucy5cbiAgICogQHBhcmFtIGV2IFRoZSBrZXlkb3duIGV2ZW50LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBUZXJtaW5hbCBzaG91bGQgY29udGludWUgcHJvY2Vzc2luZyB0aGUga2V5ZG93biBldmVudC5cbiAgICovXG4gIHB1YmxpYyBrZXlkb3duKGV2OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2lzQ29tcG9zaW5nIHx8IHRoaXMuX2lzU2VuZGluZ0NvbXBvc2l0aW9uKSB7XG4gICAgICBpZiAoZXYua2V5Q29kZSA9PT0gMjI5KSB7XG4gICAgICAgIC8vIENvbnRpbnVlIGNvbXBvc2luZyBpZiB0aGUga2V5Q29kZSBpcyB0aGUgXCJjb21wb3NpdGlvbiBjaGFyYWN0ZXJcIlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoZXYua2V5Q29kZSA9PT0gMTYgfHwgZXYua2V5Q29kZSA9PT0gMTcgfHwgZXYua2V5Q29kZSA9PT0gMTgpIHtcbiAgICAgICAgLy8gQ29udGludWUgY29tcG9zaW5nIGlmIHRoZSBrZXlDb2RlIGlzIGEgbW9kaWZpZXIga2V5XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbmlzaCBjb21wb3NpdGlvbiBpbW1lZGlhdGVseS4gVGhpcyBpcyBtYWlubHkgaGVyZSBmb3IgdGhlIGNhc2Ugd2hlcmUgZW50ZXIgaXNcbiAgICAgIC8vIHByZXNzZWQgYW5kIHRoZSBoYW5kbGVyIG5lZWRzIHRvIGJlIHRyaWdnZXJlZCBiZWZvcmUgdGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQuXG4gICAgICB0aGlzLl9maW5hbGl6ZUNvbXBvc2l0aW9uKGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAoZXYua2V5Q29kZSA9PT0gMjI5KSB7XG4gICAgICAvLyBJZiB0aGUgXCJjb21wb3NpdGlvbiBjaGFyYWN0ZXJcIiBpcyB1c2VkIGJ1dCBnZXRzIHRvIHRoaXMgcG9pbnQgaXQgbWVhbnMgYSBub24tY29tcG9zaXRpb25cbiAgICAgIC8vIGNoYXJhY3RlciAoZWcuIG51bWJlcnMgYW5kIHB1bmN0dWF0aW9uKSB3YXMgcHJlc3NlZCB3aGVuIHRoZSBJTUUgd2FzIGFjdGl2ZS5cbiAgICAgIHRoaXMuX2hhbmRsZUFueVRleHRhcmVhQ2hhbmdlcygpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmFsaXplcyB0aGUgY29tcG9zaXRpb24sIHJlc3VtaW5nIHJlZ3VsYXIgaW5wdXQgYWN0aW9ucy4gVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGNvbXBvc2l0aW9uXG4gICAqIGlzIGVuZGluZy5cbiAgICogQHBhcmFtIHdhaXRGb3JQcm9wYWdhdGlvbiBXaGV0aGVyIHRvIHdhaXQgZm9yIGV2ZW50cyB0byBwcm9wYWdhdGUgYmVmb3JlIHNlbmRpbmdcbiAgICogICB0aGUgaW5wdXQuIFRoaXMgc2hvdWxkIGJlIGZhbHNlIGlmIGEgbm9uLWNvbXBvc2l0aW9uIGtleXN0cm9rZSBpcyBlbnRlcmVkIGJlZm9yZSB0aGVcbiAgICogICBjb21wb3NpdGlvbmVuZCBldmVudCBpcyB0cmlnZ2VyZWQsIHN1Y2ggYXMgZW50ZXIsIHNvIHRoYXQgdGhlIGNvbXBvc2l0aW9uIGlzIHNlbnQgYmVmb3JlXG4gICAqICAgdGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQuXG4gICAqL1xuICBwcml2YXRlIF9maW5hbGl6ZUNvbXBvc2l0aW9uKHdhaXRGb3JQcm9wYWdhdGlvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICB0aGlzLl9pc0NvbXBvc2luZyA9IGZhbHNlO1xuXG4gICAgaWYgKCF3YWl0Rm9yUHJvcGFnYXRpb24pIHtcbiAgICAgIC8vIENhbmNlbCBhbnkgZGVsYXllZCBjb21wb3NpdGlvbiBzZW5kIHJlcXVlc3RzIGFuZCBzZW5kIHRoZSBpbnB1dCBpbW1lZGlhdGVseS5cbiAgICAgIHRoaXMuX2lzU2VuZGluZ0NvbXBvc2l0aW9uID0gZmFsc2U7XG4gICAgICBjb25zdCBpbnB1dCA9IHRoaXMuX3RleHRhcmVhLnZhbHVlLnN1YnN0cmluZyh0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0LCB0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLmVuZCk7XG4gICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGlucHV0LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTWFrZSBhIGRlZXAgY29weSBvZiB0aGUgY29tcG9zaXRpb24gcG9zaXRpb24gaGVyZSBhcyBhIG5ldyBjb21wb3NpdGlvbnN0YXJ0IGV2ZW50IG1heVxuICAgICAgLy8gZmlyZSBiZWZvcmUgdGhlIHNldFRpbWVvdXQgZXhlY3V0ZXMuXG4gICAgICBjb25zdCBjdXJyZW50Q29tcG9zaXRpb25Qb3NpdGlvbiA9IHtcbiAgICAgICAgc3RhcnQ6IHRoaXMuX2NvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQsXG4gICAgICAgIGVuZDogdGhpcy5fY29tcG9zaXRpb25Qb3NpdGlvbi5lbmRcbiAgICAgIH07XG5cbiAgICAgIC8vIFNpbmNlIGNvbXBvc2l0aW9uKiBldmVudHMgaGFwcGVuIGJlZm9yZSB0aGUgY2hhbmdlcyB0YWtlIHBsYWNlIGluIHRoZSB0ZXh0YXJlYSBvbiBtb3N0XG4gICAgICAvLyBicm93c2VycywgdXNlIGEgc2V0VGltZW91dCB3aXRoIDBtcyB0aW1lIHRvIGFsbG93IHRoZSBuYXRpdmUgY29tcG9zaXRpb25lbmQgZXZlbnQgdG9cbiAgICAgIC8vIGNvbXBsZXRlLiBUaGlzIGVuc3VyZXMgdGhlIGNvcnJlY3QgY2hhcmFjdGVyIGlzIHJldHJpZXZlZC5cbiAgICAgIC8vIFRoaXMgc29sdXRpb24gd2FzIHVzZWQgYmVjYXVzZTpcbiAgICAgIC8vIC0gVGhlIGNvbXBvc2l0aW9uZW5kIGV2ZW50J3MgZGF0YSBwcm9wZXJ0eSBpcyB1bnJlbGlhYmxlLCBhdCBsZWFzdCBvbiBDaHJvbWl1bVxuICAgICAgLy8gLSBUaGUgbGFzdCBjb21wb3NpdGlvbnVwZGF0ZSBldmVudCdzIGRhdGEgcHJvcGVydHkgZG9lcyBub3QgYWx3YXlzIGFjY3VyYXRlbHkgZGVzY3JpYmVcbiAgICAgIC8vICAgdGhlIGNoYXJhY3RlciwgYSBjb3VudGVyIGV4YW1wbGUgYmVpbmcgS29yZWFuIHdoZXJlIGFuIGVuZGluZyBjb25zb25zYW50IGNhbiBtb3ZlIHRvXG4gICAgICAvLyAgIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGlmIHRoZSBmb2xsb3dpbmcgaW5wdXQgaXMgYSB2b3dlbC5cbiAgICAgIHRoaXMuX2lzU2VuZGluZ0NvbXBvc2l0aW9uID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaW5wdXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gc2VudFxuICAgICAgICBpZiAodGhpcy5faXNTZW5kaW5nQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICB0aGlzLl9pc1NlbmRpbmdDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgIGxldCBpbnB1dDtcbiAgICAgICAgICAvLyBBZGQgbGVuZ3RoIG9mIGRhdGEgYWxyZWFkeSBzZW50IGR1ZSB0byBrZXlkb3duIGV2ZW50LFxuICAgICAgICAgIC8vIG90aGVyd2lzZSBpbnB1dCBjaGFyYWN0ZXJzIGNhbiBiZSBkdXBsaWNhdGVkLiAoSXNzdWUgIzMxOTEpXG4gICAgICAgICAgY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQgKz0gdGhpcy5fZGF0YUFscmVhZHlTZW50Lmxlbmd0aDtcbiAgICAgICAgICBpZiAodGhpcy5faXNDb21wb3NpbmcpIHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgZW5kIHBvc2l0aW9uIHRvIGdldCB0aGUgc3RyaW5nIGlmIGEgbmV3IGNvbXBvc2l0aW9uIGhhcyBzdGFydGVkLlxuICAgICAgICAgICAgaW5wdXQgPSB0aGlzLl90ZXh0YXJlYS52YWx1ZS5zdWJzdHJpbmcoY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQsIGN1cnJlbnRDb21wb3NpdGlvblBvc2l0aW9uLmVuZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVzZSB0aGUgZW5kIHBvc2l0aW9uIGhlcmUgaW4gb3JkZXIgdG8gcGljayB1cCBhbnkgY2hhcmFjdGVycyBhZnRlciB0aGVcbiAgICAgICAgICAgIC8vIGNvbXBvc2l0aW9uIGhhcyBmaW5pc2hlZCwgZm9yIGV4YW1wbGUgd2hlbiB0eXBpbmcgYSBub24tY29tcG9zaXRpb24gY2hhcmFjdGVyXG4gICAgICAgICAgICAvLyAoZWcuIDIpIGFmdGVyIGEgY29tcG9zaXRpb24gY2hhcmFjdGVyLlxuICAgICAgICAgICAgaW5wdXQgPSB0aGlzLl90ZXh0YXJlYS52YWx1ZS5zdWJzdHJpbmcoY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChpbnB1dCwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgdGV4dGFyZWEgYWZ0ZXIgdGhlIGN1cnJlbnQgZXZlbnQgY2hhaW4gaXMgYWxsb3dlZCB0byBjb21wbGV0ZS5cbiAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gbm90IGN1cnJlbnRseSBjb21wb3NpbmcgYnV0IGEga2V5ZG93biBldmVudCB3aXRoIHRoZSBcImNvbXBvc2l0aW9uXG4gICAqIGNoYXJhY3RlclwiICgyMjkpIGlzIHRyaWdnZXJlZCwgaW4gb3JkZXIgdG8gYWxsb3cgbm9uLWNvbXBvc2l0aW9uIHRleHQgdG8gYmUgZW50ZXJlZCB3aGVuIGFuXG4gICAqIElNRSBpcyBhY3RpdmUuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVBbnlUZXh0YXJlYUNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl90ZXh0YXJlYS52YWx1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIElnbm9yZSBpZiBhIGNvbXBvc2l0aW9uIGhhcyBzdGFydGVkIHNpbmNlIHRoZSB0aW1lb3V0XG4gICAgICBpZiAoIXRoaXMuX2lzQ29tcG9zaW5nKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5fdGV4dGFyZWEudmFsdWU7XG5cbiAgICAgICAgY29uc3QgZGlmZiA9IG5ld1ZhbHVlLnJlcGxhY2Uob2xkVmFsdWUsICcnKTtcblxuICAgICAgICB0aGlzLl9kYXRhQWxyZWFkeVNlbnQgPSBkaWZmO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPiBvbGRWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGRpZmYsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8IG9sZFZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuREVMfWAsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKChuZXdWYWx1ZS5sZW5ndGggPT09IG9sZFZhbHVlLmxlbmd0aCkgJiYgKG5ld1ZhbHVlICE9PSBvbGRWYWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KG5ld1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogUG9zaXRpb25zIHRoZSBjb21wb3NpdGlvbiB2aWV3IG9uIHRvcCBvZiB0aGUgY3Vyc29yIGFuZCB0aGUgdGV4dGFyZWEganVzdCBiZWxvdyBpdCAoc28gdGhlXG4gICAqIElNRSBoZWxwZXIgZGlhbG9nIGlzIHBvc2l0aW9uZWQgY29ycmVjdGx5KS5cbiAgICogQHBhcmFtIGRvbnRSZWN1cnNlIFdoZXRoZXIgdG8gdXNlIHNldFRpbWVvdXQgdG8gcmVjdXJzaXZlbHkgdHJpZ2dlciBhbm90aGVyIHVwZGF0ZSwgdGhpcyBpc1xuICAgKiAgIG5lY2Vzc2FyeSBhcyB0aGUgSU1FIGV2ZW50cyBhY3Jvc3MgYnJvd3NlcnMgYXJlIG5vdCBjb25zaXN0ZW50bHkgdHJpZ2dlcmVkLlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHMoZG9udFJlY3Vyc2U/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0NvbXBvc2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5pc0N1cnNvckluVmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IGN1cnNvclggPSBNYXRoLm1pbih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci54LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxKTtcblxuICAgICAgY29uc3QgY2VsbEhlaWdodCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQ7XG4gICAgICBjb25zdCBjdXJzb3JUb3AgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodDtcbiAgICAgIGNvbnN0IGN1cnNvckxlZnQgPSBjdXJzb3JYICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoO1xuXG4gICAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcuc3R5bGUubGVmdCA9IGN1cnNvckxlZnQgKyAncHgnO1xuICAgICAgdGhpcy5fY29tcG9zaXRpb25WaWV3LnN0eWxlLnRvcCA9IGN1cnNvclRvcCArICdweCc7XG4gICAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcuc3R5bGUuaGVpZ2h0ID0gY2VsbEhlaWdodCArICdweCc7XG4gICAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcuc3R5bGUubGluZUhlaWdodCA9IGNlbGxIZWlnaHQgKyAncHgnO1xuICAgICAgdGhpcy5fY29tcG9zaXRpb25WaWV3LnN0eWxlLmZvbnRGYW1pbHkgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRGYW1pbHk7XG4gICAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcuc3R5bGUuZm9udFNpemUgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRTaXplICsgJ3B4JztcbiAgICAgIC8vIFN5bmMgdGhlIHRleHRhcmVhIHRvIHRoZSBleGFjdCBwb3NpdGlvbiBvZiB0aGUgY29tcG9zaXRpb24gdmlldyBzbyB0aGUgSU1FIGtub3dzIHdoZXJlIHRoZVxuICAgICAgLy8gdGV4dCBpcy5cbiAgICAgIGNvbnN0IGNvbXBvc2l0aW9uVmlld0JvdW5kcyA9IHRoaXMuX2NvbXBvc2l0aW9uVmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuX3RleHRhcmVhLnN0eWxlLmxlZnQgPSBjdXJzb3JMZWZ0ICsgJ3B4JztcbiAgICAgIHRoaXMuX3RleHRhcmVhLnN0eWxlLnRvcCA9IGN1cnNvclRvcCArICdweCc7XG4gICAgICAvLyBFbnN1cmUgdGhlIHRleHQgYXJlYSBpcyBhdCBsZWFzdCAxeDEsIG90aGVyd2lzZSBjZXJ0YWluIElNRXMgbWF5IGJyZWFrXG4gICAgICB0aGlzLl90ZXh0YXJlYS5zdHlsZS53aWR0aCA9IE1hdGgubWF4KGNvbXBvc2l0aW9uVmlld0JvdW5kcy53aWR0aCwgMSkgKyAncHgnO1xuICAgICAgdGhpcy5fdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgoY29tcG9zaXRpb25WaWV3Qm91bmRzLmhlaWdodCwgMSkgKyAncHgnO1xuICAgICAgdGhpcy5fdGV4dGFyZWEuc3R5bGUubGluZUhlaWdodCA9IGNvbXBvc2l0aW9uVmlld0JvdW5kcy5oZWlnaHQgKyAncHgnO1xuICAgIH1cblxuICAgIGlmICghZG9udFJlY3Vyc2UpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVDb21wb3NpdGlvbkVsZW1lbnRzKHRydWUpLCAwKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29yZHNSZWxhdGl2ZVRvRWxlbWVudCh3aW5kb3c6IFBpY2s8V2luZG93LCAnZ2V0Q29tcHV0ZWRTdHlsZSc+LCBldmVudDoge2NsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyfSwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IGVsZW1lbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICBjb25zdCBsZWZ0UGFkZGluZyA9IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWxlZnQnKSk7XG4gIGNvbnN0IHRvcFBhZGRpbmcgPSBwYXJzZUludChlbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSk7XG4gIHJldHVybiBbXG4gICAgZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIGxlZnRQYWRkaW5nLFxuICAgIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIHRvcFBhZGRpbmdcbiAgXTtcbn1cblxuLyoqXG4gKiBHZXRzIGNvb3JkaW5hdGVzIHdpdGhpbiB0aGUgdGVybWluYWwgZm9yIGEgcGFydGljdWxhciBtb3VzZSBldmVudC4gVGhlIHJlc3VsdFxuICogaXMgcmV0dXJuZWQgYXMgYW4gYXJyYXkgaW4gdGhlIGZvcm0gW3gsIHldIGluc3RlYWQgb2YgYW4gb2JqZWN0IGFzIGl0J3MgYVxuICogbGl0dGxlIGZhc3RlciBhbmQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIHNvbWUgbG93IGxldmVsIGNvZGUuXG4gKiBAcGFyYW0gd2luZG93IFRoZSB3aW5kb3cgb2JqZWN0IHRoZSBlbGVtZW50IGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIHRlcm1pbmFsJ3MgY29udGFpbmVyIGVsZW1lbnQuXG4gKiBAcGFyYW0gY29sQ291bnQgVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0ZXJtaW5hbC5cbiAqIEBwYXJhbSByb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgbiB0aGUgdGVybWluYWwuXG4gKiBAcGFyYW0gaGFzVmFsaWRDaGFyU2l6ZSBXaGV0aGVyIHRoZXJlIGlzIGEgdmFsaWQgY2hhcmFjdGVyIHNpemUgYXZhaWxhYmxlLlxuICogQHBhcmFtIGNzc0NlbGxXaWR0aCBUaGUgY2VsbCB3aWR0aCBkZXZpY2UgcGl4ZWwgcmVuZGVyIGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0gY3NzQ2VsbEhlaWdodCBUaGUgY2VsbCBoZWlnaHQgZGV2aWNlIHBpeGVsIHJlbmRlciBkaW1lbnNpb25zLlxuICogQHBhcmFtIGlzU2VsZWN0aW9uIFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgZm9yIHRoZSBzZWxlY3Rpb24gb3Igbm90LiBUaGlzIHdpbGxcbiAqIGFwcGx5IGFuIG9mZnNldCB0byB0aGUgeCB2YWx1ZSBzdWNoIHRoYXQgdGhlIGxlZnQgaGFsZiBvZiB0aGUgY2VsbCB3aWxsXG4gKiBzZWxlY3QgdGhhdCBjZWxsIGFuZCB0aGUgcmlnaHQgaGFsZiB3aWxsIHNlbGVjdCB0aGUgbmV4dCBjZWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29vcmRzKHdpbmRvdzogUGljazxXaW5kb3csICdnZXRDb21wdXRlZFN0eWxlJz4sIGV2ZW50OiBQaWNrPE1vdXNlRXZlbnQsICdjbGllbnRYJyB8ICdjbGllbnRZJz4sIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb2xDb3VudDogbnVtYmVyLCByb3dDb3VudDogbnVtYmVyLCBoYXNWYWxpZENoYXJTaXplOiBib29sZWFuLCBjc3NDZWxsV2lkdGg6IG51bWJlciwgY3NzQ2VsbEhlaWdodDogbnVtYmVyLCBpc1NlbGVjdGlvbj86IGJvb2xlYW4pOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgLy8gQ29vcmRpbmF0ZXMgY2Fubm90IGJlIG1lYXN1cmVkIGlmIHRoZXJlIGFyZSBubyB2YWxpZFxuICBpZiAoIWhhc1ZhbGlkQ2hhclNpemUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY29vcmRzID0gZ2V0Q29vcmRzUmVsYXRpdmVUb0VsZW1lbnQod2luZG93LCBldmVudCwgZWxlbWVudCk7XG4gIGlmICghY29vcmRzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvb3Jkc1swXSA9IE1hdGguY2VpbCgoY29vcmRzWzBdICsgKGlzU2VsZWN0aW9uID8gY3NzQ2VsbFdpZHRoIC8gMiA6IDApKSAvIGNzc0NlbGxXaWR0aCk7XG4gIGNvb3Jkc1sxXSA9IE1hdGguY2VpbChjb29yZHNbMV0gLyBjc3NDZWxsSGVpZ2h0KTtcblxuICAvLyBFbnN1cmUgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGUgdGVybWluYWwgdmlld3BvcnQuIE5vdGUgdGhhdCBzZWxlY3Rpb25zXG4gIC8vIG5lZWQgYW4gYWRkaXRpb24gcG9pbnQgb2YgcHJlY2lzaW9uIHRvIGNvdmVyIHRoZSBlbmQgcG9pbnQgKGFzIGNoYXJhY3RlcnNcbiAgLy8gY292ZXIgaGFsZiBvZiBvbmUgY2hhciBhbmQgaGFsZiBvZiB0aGUgbmV4dCkuXG4gIGNvb3Jkc1swXSA9IE1hdGgubWluKE1hdGgubWF4KGNvb3Jkc1swXSwgMSksIGNvbENvdW50ICsgKGlzU2VsZWN0aW9uID8gMSA6IDApKTtcbiAgY29vcmRzWzFdID0gTWF0aC5taW4oTWF0aC5tYXgoY29vcmRzWzFdLCAxKSwgcm93Q291bnQpO1xuXG4gIHJldHVybiBjb29yZHM7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBDMCB9IGZyb20gJ2NvbW1vbi9kYXRhL0VzY2FwZVNlcXVlbmNlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmNvbnN0IGVudW0gRGlyZWN0aW9uIHtcbiAgVVAgPSAnQScsXG4gIERPV04gPSAnQicsXG4gIFJJR0hUID0gJ0MnLFxuICBMRUZUID0gJ0QnXG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIGFsbCB0aGUgYXJyb3cgc2VxdWVuY2VzIHRvZ2V0aGVyLlxuICogUmVzZXRzIHRoZSBzdGFydGluZyByb3cgdG8gYW4gdW53cmFwcGVkIHJvdywgbW92ZXMgdG8gdGhlIHJlcXVlc3RlZCByb3csXG4gKiB0aGVuIG1vdmVzIHRvIHJlcXVlc3RlZCBjb2wuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9DZWxsU2VxdWVuY2UodGFyZ2V0WDogbnVtYmVyLCB0YXJnZXRZOiBudW1iZXIsIGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcjogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHN0YXJ0WCA9IGJ1ZmZlclNlcnZpY2UuYnVmZmVyLng7XG4gIGNvbnN0IHN0YXJ0WSA9IGJ1ZmZlclNlcnZpY2UuYnVmZmVyLnk7XG5cbiAgLy8gVGhlIGFsdCBidWZmZXIgc2hvdWxkIHRyeSB0byBuYXZpZ2F0ZSBiZXR3ZWVuIHJvd3NcbiAgaWYgKCFidWZmZXJTZXJ2aWNlLmJ1ZmZlci5oYXNTY3JvbGxiYWNrKSB7XG4gICAgcmV0dXJuIHJlc2V0U3RhcnRpbmdSb3coc3RhcnRYLCBzdGFydFksIHRhcmdldFgsIHRhcmdldFksIGJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yKSArXG4gICAgICBtb3ZlVG9SZXF1ZXN0ZWRSb3coc3RhcnRZLCB0YXJnZXRZLCBidWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcikgK1xuICAgICAgbW92ZVRvUmVxdWVzdGVkQ29sKHN0YXJ0WCwgc3RhcnRZLCB0YXJnZXRYLCB0YXJnZXRZLCBidWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcik7XG4gIH1cblxuICAvLyBPbmx5IG1vdmUgaG9yaXpvbnRhbGx5IGZvciB0aGUgbm9ybWFsIGJ1ZmZlclxuICBsZXQgZGlyZWN0aW9uO1xuICBpZiAoc3RhcnRZID09PSB0YXJnZXRZKSB7XG4gICAgZGlyZWN0aW9uID0gc3RhcnRYID4gdGFyZ2V0WCA/IERpcmVjdGlvbi5MRUZUIDogRGlyZWN0aW9uLlJJR0hUO1xuICAgIHJldHVybiByZXBlYXQoTWF0aC5hYnMoc3RhcnRYIC0gdGFyZ2V0WCksIHNlcXVlbmNlKGRpcmVjdGlvbiwgYXBwbGljYXRpb25DdXJzb3IpKTtcbiAgfVxuICBkaXJlY3Rpb24gPSBzdGFydFkgPiB0YXJnZXRZID8gRGlyZWN0aW9uLkxFRlQgOiBEaXJlY3Rpb24uUklHSFQ7XG4gIGNvbnN0IHJvd0RpZmZlcmVuY2UgPSBNYXRoLmFicyhzdGFydFkgLSB0YXJnZXRZKTtcbiAgY29uc3QgY2VsbHNUb01vdmUgPSBjb2xzRnJvbVJvd0VuZChzdGFydFkgPiB0YXJnZXRZID8gdGFyZ2V0WCA6IHN0YXJ0WCwgYnVmZmVyU2VydmljZSkgK1xuICAgIChyb3dEaWZmZXJlbmNlIC0gMSkgKiBidWZmZXJTZXJ2aWNlLmNvbHMgKyAxIC8qIHdyYXAgYXJvdW5kIDEgcm93ICovICtcbiAgICBjb2xzRnJvbVJvd0JlZ2lubmluZyhzdGFydFkgPiB0YXJnZXRZID8gc3RhcnRYIDogdGFyZ2V0WCwgYnVmZmVyU2VydmljZSk7XG4gIHJldHVybiByZXBlYXQoY2VsbHNUb01vdmUsIHNlcXVlbmNlKGRpcmVjdGlvbiwgYXBwbGljYXRpb25DdXJzb3IpKTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBudW1iZXIgb2YgY29scyBmcm9tIGEgcm93IGJlZ2lubmluZyB0byBhIGNvbC5cbiAqL1xuZnVuY3Rpb24gY29sc0Zyb21Sb3dCZWdpbm5pbmcoY3Vyclg6IG51bWJlciwgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UpOiBudW1iZXIge1xuICByZXR1cm4gY3VyclggLSAxO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIG51bWJlciBvZiBjb2xzIGZyb20gYSBjb2wgdG8gcm93IGVuZC5cbiAqL1xuZnVuY3Rpb24gY29sc0Zyb21Sb3dFbmQoY3Vyclg6IG51bWJlciwgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UpOiBudW1iZXIge1xuICByZXR1cm4gYnVmZmVyU2VydmljZS5jb2xzIC0gY3Vyclg7XG59XG5cbi8qKlxuICogSWYgdGhlIGluaXRpYWwgcG9zaXRpb24gb2YgdGhlIGN1cnNvciBpcyBvbiBhIHJvdyB0aGF0IGlzIHdyYXBwZWQsIG1vdmUgdGhlXG4gKiBjdXJzb3IgdXAgdG8gdGhlIGZpcnN0IHJvdyB0aGF0IGlzIG5vdCB3cmFwcGVkIHRvIGhhdmUgYWNjdXJhdGUgdmVydGljYWxcbiAqIHBvc2l0aW9uaW5nLlxuICovXG5mdW5jdGlvbiByZXNldFN0YXJ0aW5nUm93KHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgdGFyZ2V0WDogbnVtYmVyLCB0YXJnZXRZOiBudW1iZXIsIGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcjogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChtb3ZlVG9SZXF1ZXN0ZWRSb3coc3RhcnRZLCB0YXJnZXRZLCBidWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcikubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHJldHVybiByZXBlYXQoYnVmZmVyTGluZShcbiAgICBzdGFydFgsIHN0YXJ0WSwgc3RhcnRYLFxuICAgIHN0YXJ0WSAtIHdyYXBwZWRSb3dzRm9yUm93KHN0YXJ0WSwgYnVmZmVyU2VydmljZSksIGZhbHNlLCBidWZmZXJTZXJ2aWNlXG4gICkubGVuZ3RoLCBzZXF1ZW5jZShEaXJlY3Rpb24uTEVGVCwgYXBwbGljYXRpb25DdXJzb3IpKTtcbn1cblxuLyoqXG4gKiBVc2luZyB0aGUgcmVzZXQgc3RhcnRpbmcgYW5kIGVuZGluZyByb3csIG1vdmUgdG8gdGhlIHJlcXVlc3RlZCByb3csXG4gKiBpZ25vcmluZyB3cmFwcGVkIHJvd3NcbiAqL1xuZnVuY3Rpb24gbW92ZVRvUmVxdWVzdGVkUm93KHN0YXJ0WTogbnVtYmVyLCB0YXJnZXRZOiBudW1iZXIsIGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcjogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHN0YXJ0Um93ID0gc3RhcnRZIC0gd3JhcHBlZFJvd3NGb3JSb3coc3RhcnRZLCBidWZmZXJTZXJ2aWNlKTtcbiAgY29uc3QgZW5kUm93ID0gdGFyZ2V0WSAtIHdyYXBwZWRSb3dzRm9yUm93KHRhcmdldFksIGJ1ZmZlclNlcnZpY2UpO1xuXG4gIGNvbnN0IHJvd3NUb01vdmUgPSBNYXRoLmFicyhzdGFydFJvdyAtIGVuZFJvdykgLSB3cmFwcGVkUm93c0NvdW50KHN0YXJ0WSwgdGFyZ2V0WSwgYnVmZmVyU2VydmljZSk7XG5cbiAgcmV0dXJuIHJlcGVhdChyb3dzVG9Nb3ZlLCBzZXF1ZW5jZSh2ZXJ0aWNhbERpcmVjdGlvbihzdGFydFksIHRhcmdldFkpLCBhcHBsaWNhdGlvbkN1cnNvcikpO1xufVxuXG4vKipcbiAqIE1vdmUgdG8gdGhlIHJlcXVlc3RlZCBjb2wgb24gdGhlIGVuZGluZyByb3dcbiAqL1xuZnVuY3Rpb24gbW92ZVRvUmVxdWVzdGVkQ29sKHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgdGFyZ2V0WDogbnVtYmVyLCB0YXJnZXRZOiBudW1iZXIsIGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcjogYm9vbGVhbik6IHN0cmluZyB7XG4gIGxldCBzdGFydFJvdztcbiAgaWYgKG1vdmVUb1JlcXVlc3RlZFJvdyhzdGFydFksIHRhcmdldFksIGJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yKS5sZW5ndGggPiAwKSB7XG4gICAgc3RhcnRSb3cgPSB0YXJnZXRZIC0gd3JhcHBlZFJvd3NGb3JSb3codGFyZ2V0WSwgYnVmZmVyU2VydmljZSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRSb3cgPSBzdGFydFk7XG4gIH1cblxuICBjb25zdCBlbmRSb3cgPSB0YXJnZXRZO1xuICBjb25zdCBkaXJlY3Rpb24gPSBob3Jpem9udGFsRGlyZWN0aW9uKHN0YXJ0WCwgc3RhcnRZLCB0YXJnZXRYLCB0YXJnZXRZLCBidWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcik7XG5cbiAgcmV0dXJuIHJlcGVhdChidWZmZXJMaW5lKFxuICAgIHN0YXJ0WCwgc3RhcnRSb3csIHRhcmdldFgsIGVuZFJvdyxcbiAgICBkaXJlY3Rpb24gPT09IERpcmVjdGlvbi5SSUdIVCwgYnVmZmVyU2VydmljZVxuICApLmxlbmd0aCwgc2VxdWVuY2UoZGlyZWN0aW9uLCBhcHBsaWNhdGlvbkN1cnNvcikpO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb25zXG4gKi9cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2Ygd3JhcHBlZCByb3dzIGJldHdlZW4gdGhlIHVud3JhcHBlZCBzdGFydGluZyBhbmRcbiAqIGVuZGluZyByb3dzLiBUaGVzZSByb3dzIG5lZWQgdG8gaWdub3JlZCBzaW5jZSB0aGUgY3Vyc29yIHNraXBzIG92ZXIgdGhlbS5cbiAqL1xuZnVuY3Rpb24gd3JhcHBlZFJvd3NDb3VudChzdGFydFk6IG51bWJlciwgdGFyZ2V0WTogbnVtYmVyLCBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSk6IG51bWJlciB7XG4gIGxldCB3cmFwcGVkUm93cyA9IDA7XG4gIGNvbnN0IHN0YXJ0Um93ID0gc3RhcnRZIC0gd3JhcHBlZFJvd3NGb3JSb3coc3RhcnRZLCBidWZmZXJTZXJ2aWNlKTtcbiAgY29uc3QgZW5kUm93ID0gdGFyZ2V0WSAtIHdyYXBwZWRSb3dzRm9yUm93KHRhcmdldFksIGJ1ZmZlclNlcnZpY2UpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5hYnMoc3RhcnRSb3cgLSBlbmRSb3cpOyBpKyspIHtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB2ZXJ0aWNhbERpcmVjdGlvbihzdGFydFksIHRhcmdldFkpID09PSBEaXJlY3Rpb24uVVAgPyAtMSA6IDE7XG4gICAgY29uc3QgbGluZSA9IGJ1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldChzdGFydFJvdyArIChkaXJlY3Rpb24gKiBpKSk7XG4gICAgaWYgKGxpbmU/LmlzV3JhcHBlZCkge1xuICAgICAgd3JhcHBlZFJvd3MrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd3JhcHBlZFJvd3M7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIHdyYXBwZWQgcm93cyB0aGF0IG1ha2UgdXAgYSBnaXZlbiByb3cuXG4gKiBAcGFyYW0gY3VycmVudFJvdyBUaGUgcm93IHRvIGRldGVybWluZSBob3cgbWFueSB3cmFwcGVkIHJvd3MgbWFrZSBpdCB1cFxuICovXG5mdW5jdGlvbiB3cmFwcGVkUm93c0ZvclJvdyhjdXJyZW50Um93OiBudW1iZXIsIGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlKTogbnVtYmVyIHtcbiAgbGV0IHJvd0NvdW50ID0gMDtcbiAgbGV0IGxpbmUgPSBidWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5nZXQoY3VycmVudFJvdyk7XG4gIGxldCBsaW5lV3JhcHMgPSBsaW5lPy5pc1dyYXBwZWQ7XG5cbiAgd2hpbGUgKGxpbmVXcmFwcyAmJiBjdXJyZW50Um93ID49IDAgJiYgY3VycmVudFJvdyA8IGJ1ZmZlclNlcnZpY2Uucm93cykge1xuICAgIHJvd0NvdW50Kys7XG4gICAgbGluZSA9IGJ1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldCgtLWN1cnJlbnRSb3cpO1xuICAgIGxpbmVXcmFwcyA9IGxpbmU/LmlzV3JhcHBlZDtcbiAgfVxuXG4gIHJldHVybiByb3dDb3VudDtcbn1cblxuLyoqXG4gKiBEaXJlY3Rpb24gZGV0ZXJtaW5lcnNcbiAqL1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHJpZ2h0IG9yIGxlZnQgYXJyb3cgaXMgbmVlZGVkXG4gKi9cbmZ1bmN0aW9uIGhvcml6b250YWxEaXJlY3Rpb24oc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCB0YXJnZXRYOiBudW1iZXIsIHRhcmdldFk6IG51bWJlciwgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yOiBib29sZWFuKTogRGlyZWN0aW9uIHtcbiAgbGV0IHN0YXJ0Um93O1xuICBpZiAobW92ZVRvUmVxdWVzdGVkUm93KHRhcmdldFgsIHRhcmdldFksIGJ1ZmZlclNlcnZpY2UsIGFwcGxpY2F0aW9uQ3Vyc29yKS5sZW5ndGggPiAwKSB7XG4gICAgc3RhcnRSb3cgPSB0YXJnZXRZIC0gd3JhcHBlZFJvd3NGb3JSb3codGFyZ2V0WSwgYnVmZmVyU2VydmljZSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRSb3cgPSBzdGFydFk7XG4gIH1cblxuICBpZiAoKHN0YXJ0WCA8IHRhcmdldFggJiZcbiAgICBzdGFydFJvdyA8PSB0YXJnZXRZKSB8fCAvLyBkb3duL3JpZ2h0IG9yIHNhbWUgeS9yaWdodFxuICAgIChzdGFydFggPj0gdGFyZ2V0WCAmJlxuICAgIHN0YXJ0Um93IDwgdGFyZ2V0WSkpIHsgIC8vIGRvd24vbGVmdCBvciBzYW1lIHkvbGVmdFxuICAgIHJldHVybiBEaXJlY3Rpb24uUklHSFQ7XG4gIH1cbiAgcmV0dXJuIERpcmVjdGlvbi5MRUZUO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHVwIG9yIGRvd24gYXJyb3cgaXMgbmVlZGVkXG4gKi9cbmZ1bmN0aW9uIHZlcnRpY2FsRGlyZWN0aW9uKHN0YXJ0WTogbnVtYmVyLCB0YXJnZXRZOiBudW1iZXIpOiBEaXJlY3Rpb24ge1xuICByZXR1cm4gc3RhcnRZID4gdGFyZ2V0WSA/IERpcmVjdGlvbi5VUCA6IERpcmVjdGlvbi5ET1dOO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdHMgdGhlIHN0cmluZyBvZiBjaGFycyBpbiB0aGUgYnVmZmVyIGZyb20gYSBzdGFydGluZyByb3cgYW5kIGNvbFxuICogdG8gYW4gZW5kaW5nIHJvdyBhbmQgY29sXG4gKiBAcGFyYW0gc3RhcnRDb2wgVGhlIHN0YXJ0aW5nIGNvbHVtbiBwb3NpdGlvblxuICogQHBhcmFtIHN0YXJ0Um93IFRoZSBzdGFydGluZyByb3cgcG9zaXRpb25cbiAqIEBwYXJhbSBlbmRDb2wgVGhlIGVuZGluZyBjb2x1bW4gcG9zaXRpb25cbiAqIEBwYXJhbSBlbmRSb3cgVGhlIGVuZGluZyByb3cgcG9zaXRpb25cbiAqIEBwYXJhbSBmb3J3YXJkIERpcmVjdGlvbiB0byBtb3ZlXG4gKi9cbmZ1bmN0aW9uIGJ1ZmZlckxpbmUoXG4gIHN0YXJ0Q29sOiBudW1iZXIsXG4gIHN0YXJ0Um93OiBudW1iZXIsXG4gIGVuZENvbDogbnVtYmVyLFxuICBlbmRSb3c6IG51bWJlcixcbiAgZm9yd2FyZDogYm9vbGVhbixcbiAgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2Vcbik6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50Q29sID0gc3RhcnRDb2w7XG4gIGxldCBjdXJyZW50Um93ID0gc3RhcnRSb3c7XG4gIGxldCBidWZmZXJTdHIgPSAnJztcblxuICB3aGlsZSAoY3VycmVudENvbCAhPT0gZW5kQ29sIHx8IGN1cnJlbnRSb3cgIT09IGVuZFJvdykge1xuICAgIGN1cnJlbnRDb2wgKz0gZm9yd2FyZCA/IDEgOiAtMTtcblxuICAgIGlmIChmb3J3YXJkICYmIGN1cnJlbnRDb2wgPiBidWZmZXJTZXJ2aWNlLmNvbHMgLSAxKSB7XG4gICAgICBidWZmZXJTdHIgKz0gYnVmZmVyU2VydmljZS5idWZmZXIudHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nKFxuICAgICAgICBjdXJyZW50Um93LCBmYWxzZSwgc3RhcnRDb2wsIGN1cnJlbnRDb2xcbiAgICAgICk7XG4gICAgICBjdXJyZW50Q29sID0gMDtcbiAgICAgIHN0YXJ0Q29sID0gMDtcbiAgICAgIGN1cnJlbnRSb3crKztcbiAgICB9IGVsc2UgaWYgKCFmb3J3YXJkICYmIGN1cnJlbnRDb2wgPCAwKSB7XG4gICAgICBidWZmZXJTdHIgKz0gYnVmZmVyU2VydmljZS5idWZmZXIudHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nKFxuICAgICAgICBjdXJyZW50Um93LCBmYWxzZSwgMCwgc3RhcnRDb2wgKyAxXG4gICAgICApO1xuICAgICAgY3VycmVudENvbCA9IGJ1ZmZlclNlcnZpY2UuY29scyAtIDE7XG4gICAgICBzdGFydENvbCA9IGN1cnJlbnRDb2w7XG4gICAgICBjdXJyZW50Um93LS07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlclN0ciArIGJ1ZmZlclNlcnZpY2UuYnVmZmVyLnRyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZyhcbiAgICBjdXJyZW50Um93LCBmYWxzZSwgc3RhcnRDb2wsIGN1cnJlbnRDb2xcbiAgKTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIHRoZSBlc2NhcGUgc2VxdWVuY2UgZm9yIGNsaWNraW5nIGFuIGFycm93XG4gKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdG8gbW92ZVxuICovXG5mdW5jdGlvbiBzZXF1ZW5jZShkaXJlY3Rpb246IERpcmVjdGlvbiwgYXBwbGljYXRpb25DdXJzb3I6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBtb2QgPSAgYXBwbGljYXRpb25DdXJzb3IgPyAnTycgOiAnWyc7XG4gIHJldHVybiBDMC5FU0MgKyBtb2QgKyBkaXJlY3Rpb247XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXBlYXRlZCBhIGdpdmVuIG51bWJlciBvZiB0aW1lc1xuICogUG9seWZpbGwgZnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvcmVwZWF0XG4gKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZ1xuICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRoYXQgaXMgdG8gYmUgcmVwZWF0ZWRcbiAqL1xuZnVuY3Rpb24gcmVwZWF0KGNvdW50OiBudW1iZXIsIHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY291bnQgPSBNYXRoLmZsb29yKGNvdW50KTtcbiAgbGV0IHJwdCA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBycHQgKz0gc3RyO1xuICB9XG4gIHJldHVybiBycHQ7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBEb21SZW5kZXJlclJvd0ZhY3RvcnksIFJvd0NzcyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvZG9tL0RvbVJlbmRlcmVyUm93RmFjdG9yeSc7XG5pbXBvcnQgeyBXaWR0aENhY2hlIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9kb20vV2lkdGhDYWNoZSc7XG5pbXBvcnQgeyBJTlZFUlRFRF9ERUZBVUxUX0NPTE9SIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ29uc3RhbnRzJztcbmltcG9ydCB7IGNyZWF0ZVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzJztcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvU2VsZWN0aW9uUmVuZGVyTW9kZWwnO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMsIElSZW5kZXJlciwgSVJlcXVlc3RSZWRyYXdFdmVudCwgSVNlbGVjdGlvblJlbmRlck1vZGVsIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNoYXJTaXplU2VydmljZSwgSUNvcmVCcm93c2VyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUxpbmtpZmllcjIsIElMaW5raWZpZXJFdmVudCwgSVRlcm1pbmFsLCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElJbnN0YW50aWF0aW9uU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuXG5jb25zdCBURVJNSU5BTF9DTEFTU19QUkVGSVggPSAneHRlcm0tZG9tLXJlbmRlcmVyLW93bmVyLSc7XG5jb25zdCBST1dfQ09OVEFJTkVSX0NMQVNTID0gJ3h0ZXJtLXJvd3MnO1xuY29uc3QgRkdfQ0xBU1NfUFJFRklYID0gJ3h0ZXJtLWZnLSc7XG5jb25zdCBCR19DTEFTU19QUkVGSVggPSAneHRlcm0tYmctJztcbmNvbnN0IEZPQ1VTX0NMQVNTID0gJ3h0ZXJtLWZvY3VzJztcbmNvbnN0IFNFTEVDVElPTl9DTEFTUyA9ICd4dGVybS1zZWxlY3Rpb24nO1xuXG5sZXQgbmV4dFRlcm1pbmFsSWQgPSAxO1xuXG4vKipcbiAqIEEgZmFsbGJhY2sgcmVuZGVyZXIgZm9yIHdoZW4gY2FudmFzIGlzIHNsb3cuIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlXG4gKiBwYXJ0aWN1bGFybHkgZmFzdCBvciBmZWF0dXJlIGNvbXBsZXRlLCBtb3JlIGp1c3Qgc3RhYmxlIGFuZCB1c2FibGUgZm9yIHdoZW5cbiAqIGNhbnZhcyBpcyBub3QgYW4gb3B0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRG9tUmVuZGVyZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSVJlbmRlcmVyIHtcbiAgcHJpdmF0ZSBfcm93RmFjdG9yeTogRG9tUmVuZGVyZXJSb3dGYWN0b3J5O1xuICBwcml2YXRlIF90ZXJtaW5hbENsYXNzOiBudW1iZXIgPSBuZXh0VGVybWluYWxJZCsrO1xuXG4gIHByaXZhdGUgX3RoZW1lU3R5bGVFbGVtZW50ITogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHJpdmF0ZSBfZGltZW5zaW9uc1N0eWxlRWxlbWVudCE6IEhUTUxTdHlsZUVsZW1lbnQ7XG4gIHByaXZhdGUgX3Jvd0NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3Jvd0VsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gW107XG4gIHByaXZhdGUgX3NlbGVjdGlvbkNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3dpZHRoQ2FjaGU6IFdpZHRoQ2FjaGU7XG4gIHByaXZhdGUgX3NlbGVjdGlvblJlbmRlck1vZGVsOiBJU2VsZWN0aW9uUmVuZGVyTW9kZWwgPSBjcmVhdGVTZWxlY3Rpb25SZW5kZXJNb2RlbCgpO1xuXG4gIHB1YmxpYyBkaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucztcblxuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0UmVkcmF3ID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElSZXF1ZXN0UmVkcmF3RXZlbnQ+KCkpLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBJVGVybWluYWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdwb3J0RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGVscGVyQ29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9saW5raWZpZXIyOiBJTGlua2lmaWVyMixcbiAgICBASUluc3RhbnRpYXRpb25TZXJ2aWNlIGluc3RhbnRpYXRpb25TZXJ2aWNlOiBJSW5zdGFudGlhdGlvblNlcnZpY2UsXG4gICAgQElDaGFyU2l6ZVNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY2hhclNpemVTZXJ2aWNlOiBJQ2hhclNpemVTZXJ2aWNlLFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElDb3JlQnJvd3NlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIEBJVGhlbWVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX3RoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lciA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFJPV19DT05UQUlORVJfQ0xBU1MpO1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5zdHlsZS5saW5lSGVpZ2h0ID0gJ25vcm1hbCc7XG4gICAgdGhpcy5fcm93Q29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIHRoaXMuX3JlZnJlc2hSb3dFbGVtZW50cyh0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyk7XG4gICAgdGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoU0VMRUNUSU9OX0NMQVNTKTtcbiAgICB0aGlzLl9zZWxlY3Rpb25Db250YWluZXIuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG5cbiAgICB0aGlzLmRpbWVuc2lvbnMgPSBjcmVhdGVSZW5kZXJEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5fdXBkYXRlRGltZW5zaW9ucygpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25PcHRpb25DaGFuZ2UoKCkgPT4gdGhpcy5faGFuZGxlT3B0aW9uc0NoYW5nZWQoKSkpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90aGVtZVNlcnZpY2Uub25DaGFuZ2VDb2xvcnMoZSA9PiB0aGlzLl9pbmplY3RDc3MoZSkpKTtcbiAgICB0aGlzLl9pbmplY3RDc3ModGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycyk7XG5cbiAgICB0aGlzLl9yb3dGYWN0b3J5ID0gaW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoRG9tUmVuZGVyZXJSb3dGYWN0b3J5LCBkb2N1bWVudCk7XG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoVEVSTUlOQUxfQ0xBU1NfUFJFRklYICsgdGhpcy5fdGVybWluYWxDbGFzcyk7XG4gICAgdGhpcy5fc2NyZWVuRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9yb3dDb250YWluZXIpO1xuICAgIHRoaXMuX3NjcmVlbkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fbGlua2lmaWVyMi5vblNob3dMaW5rVW5kZXJsaW5lKGUgPT4gdGhpcy5faGFuZGxlTGlua0hvdmVyKGUpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9saW5raWZpZXIyLm9uSGlkZUxpbmtVbmRlcmxpbmUoZSA9PiB0aGlzLl9oYW5kbGVMaW5rTGVhdmUoZSkpKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShURVJNSU5BTF9DTEFTU19QUkVGSVggKyB0aGlzLl90ZXJtaW5hbENsYXNzKTtcblxuICAgICAgLy8gT3V0c2lkZSBpbmZsdWVuY2VzIHN1Y2ggYXMgUmVhY3QgdW5tb3VudHMgbWF5IG1hbmlwdWxhdGUgdGhlIERPTSBiZWZvcmUgb3VyIGRpc3Bvc2FsLlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvaXNzdWVzLzI5NjBcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgIHRoaXMuX3dpZHRoQ2FjaGUuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5fdGhlbWVTdHlsZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLl9kaW1lbnNpb25zU3R5bGVFbGVtZW50LnJlbW92ZSgpO1xuICAgIH0pKTtcblxuICAgIHRoaXMuX3dpZHRoQ2FjaGUgPSBuZXcgV2lkdGhDYWNoZSh0aGlzLl9kb2N1bWVudCwgdGhpcy5faGVscGVyQ29udGFpbmVyKTtcbiAgICB0aGlzLl93aWR0aENhY2hlLnNldEZvbnQoXG4gICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRGYW1pbHksXG4gICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRTaXplLFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250V2VpZ2h0LFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250V2VpZ2h0Qm9sZFxuICAgICk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFNwYWNpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZURpbWVuc2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgZHByID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIud2lkdGggPSB0aGlzLl9jaGFyU2l6ZVNlcnZpY2Uud2lkdGggKiBkcHI7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCA9IE1hdGguY2VpbCh0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGVpZ2h0ICogZHByKTtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGggPSB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIud2lkdGggKyBNYXRoLnJvdW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubGV0dGVyU3BhY2luZyk7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCAqIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubGluZUhlaWdodCk7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmxlZnQgPSAwO1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci50b3AgPSAwO1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoICogdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQgKiB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3M7XG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoIC8gZHByKTtcbiAgICB0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodCAvIGRwcik7XG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGggLyB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodCA9IHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodCAvIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cztcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLl9yb3dFbGVtZW50cykge1xuICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRofXB4YDtcbiAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodH1weGA7XG4gICAgICBlbGVtZW50LnN0eWxlLmxpbmVIZWlnaHQgPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0fXB4YDtcbiAgICAgIC8vIE1ha2Ugc3VyZSByb3dzIGRvbid0IG92ZXJmbG93IG9udG8gZm9sbG93aW5nIHJvd1xuICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZGltZW5zaW9uc1N0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5fZGltZW5zaW9uc1N0eWxlRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLl9zY3JlZW5FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2RpbWVuc2lvbnNTdHlsZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlcyA9XG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSBzcGFuIHtgICtcbiAgICAgIGAgZGlzcGxheTogaW5saW5lLWJsb2NrO2AgKyAgIC8vIFRPRE86IGZpbmQgd29ya2Fyb3VuZCBmb3IgaW5saW5lLWJsb2NrIChjcmVhdGVzIH4yMCUgcmVuZGVyIHBlbmFsdHkpXG4gICAgICBgIGhlaWdodDogMTAwJTtgICtcbiAgICAgIGAgdmVydGljYWwtYWxpZ246IHRvcDtgICtcbiAgICAgIGB9YDtcblxuICAgIHRoaXMuX2RpbWVuc2lvbnNTdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBzdHlsZXM7XG5cbiAgICB0aGlzLl9zZWxlY3Rpb25Db250YWluZXIuc3R5bGUuaGVpZ2h0ID0gdGhpcy5fdmlld3BvcnRFbGVtZW50LnN0eWxlLmhlaWdodDtcbiAgICB0aGlzLl9zY3JlZW5FbGVtZW50LnN0eWxlLndpZHRoID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGh9cHhgO1xuICAgIHRoaXMuX3NjcmVlbkVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0fXB4YDtcbiAgfVxuXG4gIHByaXZhdGUgX2luamVjdENzcyhjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3RoZW1lU3R5bGVFbGVtZW50KSB7XG4gICAgICB0aGlzLl90aGVtZVN0eWxlRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLl9zY3JlZW5FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RoZW1lU3R5bGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBCYXNlIENTU1xuICAgIGxldCBzdHlsZXMgPVxuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Uk9XX0NPTlRBSU5FUl9DTEFTU30ge2AgK1xuICAgICAgYCBjb2xvcjogJHtjb2xvcnMuZm9yZWdyb3VuZC5jc3N9O2AgK1xuICAgICAgYCBmb250LWZhbWlseTogJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRGYW1pbHl9O2AgK1xuICAgICAgYCBmb250LXNpemU6ICR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZX1weDtgICtcbiAgICAgIGAgZm9udC1rZXJuaW5nOiBub25lO2AgK1xuICAgICAgYCB3aGl0ZS1zcGFjZTogcHJlYCArXG4gICAgICBgfWA7XG4gICAgc3R5bGVzICs9XG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSAueHRlcm0tZGltIHtgICtcbiAgICAgIGAgY29sb3I6ICR7Y29sb3IubXVsdGlwbHlPcGFjaXR5KGNvbG9ycy5mb3JlZ3JvdW5kLCAwLjUpLmNzc307YCArXG4gICAgICBgfWA7XG4gICAgLy8gVGV4dCBzdHlsZXNcbiAgICBzdHlsZXMgKz1cbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IHNwYW46bm90KC4ke1Jvd0Nzcy5CT0xEX0NMQVNTfSkge2AgK1xuICAgICAgYCBmb250LXdlaWdodDogJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRXZWlnaHR9O2AgK1xuICAgICAgYH1gICtcbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IHNwYW4uJHtSb3dDc3MuQk9MRF9DTEFTU30ge2AgK1xuICAgICAgYCBmb250LXdlaWdodDogJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRXZWlnaHRCb2xkfTtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSBzcGFuLiR7Um93Q3NzLklUQUxJQ19DTEFTU30ge2AgK1xuICAgICAgYCBmb250LXN0eWxlOiBpdGFsaWM7YCArXG4gICAgICBgfWA7XG4gICAgLy8gQmxpbmsgYW5pbWF0aW9uXG4gICAgY29uc3QgYmxpbmtBbmltYXRpb25VbmRlcmxpbmVJZCA9IGBibGlua191bmRlcmxpbmVfJHt0aGlzLl90ZXJtaW5hbENsYXNzfWA7XG4gICAgY29uc3QgYmxpbmtBbmltYXRpb25CYXJJZCA9IGBibGlua19iYXJfJHt0aGlzLl90ZXJtaW5hbENsYXNzfWA7XG4gICAgY29uc3QgYmxpbmtBbmltYXRpb25CbG9ja0lkID0gYGJsaW5rX2Jsb2NrXyR7dGhpcy5fdGVybWluYWxDbGFzc31gO1xuICAgIHN0eWxlcyArPVxuICAgICAgYEBrZXlmcmFtZXMgJHtibGlua0FuaW1hdGlvblVuZGVybGluZUlkfSB7YCArXG4gICAgICBgIDUwJSB7YCArXG4gICAgICBgICBib3JkZXItYm90dG9tLXN0eWxlOiBoaWRkZW47YCArXG4gICAgICBgIH1gICtcbiAgICAgIGB9YDtcbiAgICBzdHlsZXMgKz1cbiAgICAgIGBAa2V5ZnJhbWVzICR7YmxpbmtBbmltYXRpb25CYXJJZH0ge2AgK1xuICAgICAgYCA1MCUge2AgK1xuICAgICAgYCAgYm94LXNoYWRvdzogbm9uZTtgICtcbiAgICAgIGAgfWAgK1xuICAgICAgYH1gO1xuICAgIHN0eWxlcyArPVxuICAgICAgYEBrZXlmcmFtZXMgJHtibGlua0FuaW1hdGlvbkJsb2NrSWR9IHtgICtcbiAgICAgIGAgMCUge2AgK1xuICAgICAgYCAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMuY3Vyc29yLmNzc307YCArXG4gICAgICBgICBjb2xvcjogJHtjb2xvcnMuY3Vyc29yQWNjZW50LmNzc307YCArXG4gICAgICBgIH1gICtcbiAgICAgIGAgNTAlIHtgICtcbiAgICAgIGAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7YCArXG4gICAgICBgICBjb2xvcjogJHtjb2xvcnMuY3Vyc29yLmNzc307YCArXG4gICAgICBgIH1gICtcbiAgICAgIGB9YDtcbiAgICAvLyBDdXJzb3JcbiAgICBzdHlsZXMgKz1cbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke1JPV19DT05UQUlORVJfQ0xBU1N9LiR7Rk9DVVNfQ0xBU1N9IC4ke1Jvd0Nzcy5DVVJTT1JfQ0xBU1N9LiR7Um93Q3NzLkNVUlNPUl9CTElOS19DTEFTU30uJHtSb3dDc3MuQ1VSU09SX1NUWUxFX1VOREVSTElORV9DTEFTU30ge2AgK1xuICAgICAgYCBhbmltYXRpb246ICR7YmxpbmtBbmltYXRpb25VbmRlcmxpbmVJZH0gMXMgc3RlcC1lbmQgaW5maW5pdGU7YCArXG4gICAgICBgfWAgK1xuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Uk9XX0NPTlRBSU5FUl9DTEFTU30uJHtGT0NVU19DTEFTU30gLiR7Um93Q3NzLkNVUlNPUl9DTEFTU30uJHtSb3dDc3MuQ1VSU09SX0JMSU5LX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfQkFSX0NMQVNTfSB7YCArXG4gICAgICBgIGFuaW1hdGlvbjogJHtibGlua0FuaW1hdGlvbkJhcklkfSAxcyBzdGVwLWVuZCBpbmZpbml0ZTtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfS4ke0ZPQ1VTX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfQkxJTktfQ0xBU1N9LiR7Um93Q3NzLkNVUlNPUl9TVFlMRV9CTE9DS19DTEFTU30ge2AgK1xuICAgICAgYCBhbmltYXRpb246ICR7YmxpbmtBbmltYXRpb25CbG9ja0lkfSAxcyBzdGVwLWVuZCBpbmZpbml0ZTtgICtcbiAgICAgIGB9YCArXG4gICAgICAvLyAhaW1wb3J0YW50IGhlbHBzIGZpeCBhbiBpc3N1ZSB3aGVyZSB0aGUgY3Vyc29yIHdpbGwgbm90IHJlbmRlciBvbiB0b3Agb2YgdGhlIHNlbGVjdGlvbixcbiAgICAgIC8vIGhvd2V2ZXIgaXQncyB2ZXJ5IGhhcmQgdG8gZml4IHRoaXMgaXNzdWUgYW5kIHJldGFpbiB0aGUgYmxpbmsgYW5pbWF0aW9uIHdpdGhvdXQgdGhlIHVzZSBvZlxuICAgICAgLy8gIWltcG9ydGFudC4gU28gdGhpcyBlZGdlIGNhc2UgZmFpbHMgd2hlbiBjdXJzb3IgYmxpbmsgaXMgb24uXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfQkxPQ0tfQ0xBU1N9IHtgICtcbiAgICAgIGAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMuY3Vyc29yLmNzc307YCArXG4gICAgICBgIGNvbG9yOiAke2NvbG9ycy5jdXJzb3JBY2NlbnQuY3NzfTtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfQkxPQ0tfQ0xBU1N9Om5vdCguJHtSb3dDc3MuQ1VSU09SX0JMSU5LX0NMQVNTfSkge2AgK1xuICAgICAgYCBiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9ycy5jdXJzb3IuY3NzfSAhaW1wb3J0YW50O2AgK1xuICAgICAgYCBjb2xvcjogJHtjb2xvcnMuY3Vyc29yQWNjZW50LmNzc30gIWltcG9ydGFudDtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfT1VUTElORV9DTEFTU30ge2AgK1xuICAgICAgYCBvdXRsaW5lOiAxcHggc29saWQgJHtjb2xvcnMuY3Vyc29yLmNzc307YCArXG4gICAgICBgIG91dGxpbmUtb2Zmc2V0OiAtMXB4O2AgK1xuICAgICAgYH1gICtcbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke1JPV19DT05UQUlORVJfQ0xBU1N9IC4ke1Jvd0Nzcy5DVVJTT1JfQ0xBU1N9LiR7Um93Q3NzLkNVUlNPUl9TVFlMRV9CQVJfQ0xBU1N9IHtgICtcbiAgICAgIGAgYm94LXNoYWRvdzogJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmN1cnNvcldpZHRofXB4IDAgMCAke2NvbG9ycy5jdXJzb3IuY3NzfSBpbnNldDtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfVU5ERVJMSU5FX0NMQVNTfSB7YCArXG4gICAgICBgIGJvcmRlci1ib3R0b206IDFweCAke2NvbG9ycy5jdXJzb3IuY3NzfTtgICtcbiAgICAgIGAgYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7YCArXG4gICAgICBgIGhlaWdodDogY2FsYygxMDAlIC0gMXB4KTtgICtcbiAgICAgIGB9YDtcbiAgICAvLyBTZWxlY3Rpb25cbiAgICBzdHlsZXMgKz1cbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke1NFTEVDVElPTl9DTEFTU30ge2AgK1xuICAgICAgYCBwb3NpdGlvbjogYWJzb2x1dGU7YCArXG4gICAgICBgIHRvcDogMDtgICtcbiAgICAgIGAgbGVmdDogMDtgICtcbiAgICAgIGAgei1pbmRleDogMTtgICtcbiAgICAgIGAgcG9pbnRlci1ldmVudHM6IG5vbmU7YCArXG4gICAgICBgfWAgK1xuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0uZm9jdXMgLiR7U0VMRUNUSU9OX0NMQVNTfSBkaXYge2AgK1xuICAgICAgYCBwb3NpdGlvbjogYWJzb2x1dGU7YCArXG4gICAgICBgIGJhY2tncm91bmQtY29sb3I6ICR7Y29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUuY3NzfTtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtTRUxFQ1RJT05fQ0xBU1N9IGRpdiB7YCArXG4gICAgICBgIHBvc2l0aW9uOiBhYnNvbHV0ZTtgICtcbiAgICAgIGAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlLmNzc307YCArXG4gICAgICBgfWA7XG4gICAgLy8gQ29sb3JzXG4gICAgZm9yIChjb25zdCBbaSwgY10gb2YgY29sb3JzLmFuc2kuZW50cmllcygpKSB7XG4gICAgICBzdHlsZXMgKz1cbiAgICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7RkdfQ0xBU1NfUFJFRklYfSR7aX0geyBjb2xvcjogJHtjLmNzc307IH1gICtcbiAgICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7RkdfQ0xBU1NfUFJFRklYfSR7aX0uJHtSb3dDc3MuRElNX0NMQVNTfSB7IGNvbG9yOiAke2NvbG9yLm11bHRpcGx5T3BhY2l0eShjLCAwLjUpLmNzc307IH1gICtcbiAgICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7QkdfQ0xBU1NfUFJFRklYfSR7aX0geyBiYWNrZ3JvdW5kLWNvbG9yOiAke2MuY3NzfTsgfWA7XG4gICAgfVxuICAgIHN0eWxlcyArPVxuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7RkdfQ0xBU1NfUFJFRklYfSR7SU5WRVJURURfREVGQVVMVF9DT0xPUn0geyBjb2xvcjogJHtjb2xvci5vcGFxdWUoY29sb3JzLmJhY2tncm91bmQpLmNzc307IH1gICtcbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke0ZHX0NMQVNTX1BSRUZJWH0ke0lOVkVSVEVEX0RFRkFVTFRfQ09MT1J9LiR7Um93Q3NzLkRJTV9DTEFTU30geyBjb2xvcjogJHtjb2xvci5tdWx0aXBseU9wYWNpdHkoY29sb3Iub3BhcXVlKGNvbG9ycy5iYWNrZ3JvdW5kKSwgMC41KS5jc3N9OyB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtCR19DTEFTU19QUkVGSVh9JHtJTlZFUlRFRF9ERUZBVUxUX0NPTE9SfSB7IGJhY2tncm91bmQtY29sb3I6ICR7Y29sb3JzLmZvcmVncm91bmQuY3NzfTsgfWA7XG5cbiAgICB0aGlzLl90aGVtZVN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IHN0eWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZhdWx0IGxldHRlciBzcGFjaW5nXG4gICAqIER1ZSB0byByb3VuZGluZyBpc3N1ZXMgaW4gZGltZW5zaW9ucyBkcHIgY2FsYyBnbHlwaCBtaWdodCByZW5kZXJcbiAgICogc2xpZ2h0bHkgdG9vIHdpZGUgb3IgdG9vIG5hcnJvdy4gVGhlIG1ldGhvZCBjb3JyZWN0cyB0aGUgc3RhY2tpbmcgb2Zmc2V0c1xuICAgKiBieSBhcHBseWluZyBhIGRlZmF1bHQgbGV0dGVyLXNwYWNpbmcgZm9yIGFsbCBjaGFycy5cbiAgICogVGhlIHZhbHVlIGdldHMgcGFzc2VkIHRvIHRoZSByb3cgZmFjdG9yeSB0byBhdm9pZCBzZXR0aW5nIHRoaXMgdmFsdWUgYWdhaW5cbiAgICogKHJlbmRlciBzcGVlZHVwIGlzIHJvdWdobHkgMTAlKS5cbiAgICovXG4gIHByaXZhdGUgX3NldERlZmF1bHRTcGFjaW5nKCk6IHZvaWQge1xuICAgIC8vIG1lYXN1cmUgc2FtZSBjaGFyIGFzIGluIENoYXJTaXplU2VydmljZSB0byBnZXQgdGhlIGJhc2UgZGV2aWF0aW9uXG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCAtIHRoaXMuX3dpZHRoQ2FjaGUuZ2V0KCdXJywgZmFsc2UsIGZhbHNlKTtcbiAgICB0aGlzLl9yb3dDb250YWluZXIuc3R5bGUubGV0dGVyU3BhY2luZyA9IGAke3NwYWNpbmd9cHhgO1xuICAgIHRoaXMuX3Jvd0ZhY3RvcnkuZGVmYXVsdFNwYWNpbmcgPSBzcGFjaW5nO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5fdXBkYXRlRGltZW5zaW9ucygpO1xuICAgIHRoaXMuX3dpZHRoQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLl9zZXREZWZhdWx0U3BhY2luZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaFJvd0VsZW1lbnRzKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQWRkIG1pc3NpbmcgZWxlbWVudHNcbiAgICBmb3IgKGxldCBpID0gdGhpcy5fcm93RWxlbWVudHMubGVuZ3RoOyBpIDw9IHJvd3M7IGkrKykge1xuICAgICAgY29uc3Qgcm93ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgIHRoaXMuX3Jvd0VsZW1lbnRzLnB1c2gocm93KTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGV4Y2VzcyBlbGVtZW50c1xuICAgIHdoaWxlICh0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggPiByb3dzKSB7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm93RWxlbWVudHMucG9wKCkhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcmVmcmVzaFJvd0VsZW1lbnRzKGNvbHMsIHJvd3MpO1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbkNoYW5nZWQodGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwuc2VsZWN0aW9uU3RhcnQsIHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLnNlbGVjdGlvbkVuZCwgdGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwuY29sdW1uU2VsZWN0TW9kZSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ2hhclNpemVDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl93aWR0aENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFNwYWNpbmcoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKEZPQ1VTX0NMQVNTKTtcbiAgICB0aGlzLnJlbmRlclJvd3MoMCwgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcm93Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoRk9DVVNfQ0xBU1MpO1xuICAgIHRoaXMucmVuZGVyUm93cyh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55KTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgYWxsIHNlbGVjdGlvbnNcbiAgICB0aGlzLl9zZWxlY3Rpb25Db250YWluZXIucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgdGhpcy5fcm93RmFjdG9yeS5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHN0YXJ0LCBlbmQsIGNvbHVtblNlbGVjdE1vZGUpO1xuICAgIHRoaXMucmVuZGVyUm93cygwLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxKTtcblxuICAgIC8vIFNlbGVjdGlvbiBkb2VzIG5vdCBleGlzdFxuICAgIGlmICghc3RhcnQgfHwgIWVuZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLnVwZGF0ZSh0aGlzLl90ZXJtaW5hbCwgc3RhcnQsIGVuZCwgY29sdW1uU2VsZWN0TW9kZSk7XG5cbiAgICAvLyBUcmFuc2xhdGUgZnJvbSBidWZmZXIgcG9zaXRpb24gdG8gdmlld3BvcnQgcG9zaXRpb25cbiAgICBjb25zdCB2aWV3cG9ydFN0YXJ0Um93ID0gdGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwudmlld3BvcnRTdGFydFJvdztcbiAgICBjb25zdCB2aWV3cG9ydEVuZFJvdyA9IHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLnZpZXdwb3J0RW5kUm93O1xuICAgIGNvbnN0IHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPSB0aGlzLl9zZWxlY3Rpb25SZW5kZXJNb2RlbC52aWV3cG9ydENhcHBlZFN0YXJ0Um93O1xuICAgIGNvbnN0IHZpZXdwb3J0Q2FwcGVkRW5kUm93ID0gdGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwudmlld3BvcnRDYXBwZWRFbmRSb3c7XG5cbiAgICAvLyBObyBuZWVkIHRvIGRyYXcgdGhlIHNlbGVjdGlvblxuICAgIGlmICh2aWV3cG9ydENhcHBlZFN0YXJ0Um93ID49IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyB8fCB2aWV3cG9ydENhcHBlZEVuZFJvdyA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIHNlbGVjdGlvbnNcbiAgICBjb25zdCBkb2N1bWVudEZyYWdtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgaWYgKGNvbHVtblNlbGVjdE1vZGUpIHtcbiAgICAgIGNvbnN0IGlzWEZsaXBwZWQgPSBzdGFydFswXSA+IGVuZFswXTtcbiAgICAgIGRvY3VtZW50RnJhZ21lbnQuYXBwZW5kQ2hpbGQoXG4gICAgICAgIHRoaXMuX2NyZWF0ZVNlbGVjdGlvbkVsZW1lbnQodmlld3BvcnRDYXBwZWRTdGFydFJvdywgaXNYRmxpcHBlZCA/IGVuZFswXSA6IHN0YXJ0WzBdLCBpc1hGbGlwcGVkID8gc3RhcnRbMF0gOiBlbmRbMF0sIHZpZXdwb3J0Q2FwcGVkRW5kUm93IC0gdmlld3BvcnRDYXBwZWRTdGFydFJvdyArIDEpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEcmF3IGZpcnN0IHJvd1xuICAgICAgY29uc3Qgc3RhcnRDb2wgPSB2aWV3cG9ydFN0YXJ0Um93ID09PSB2aWV3cG9ydENhcHBlZFN0YXJ0Um93ID8gc3RhcnRbMF0gOiAwO1xuICAgICAgY29uc3QgZW5kQ29sID0gdmlld3BvcnRDYXBwZWRTdGFydFJvdyA9PT0gdmlld3BvcnRFbmRSb3cgPyBlbmRbMF0gOiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgICBkb2N1bWVudEZyYWdtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVNlbGVjdGlvbkVsZW1lbnQodmlld3BvcnRDYXBwZWRTdGFydFJvdywgc3RhcnRDb2wsIGVuZENvbCkpO1xuICAgICAgLy8gRHJhdyBtaWRkbGUgcm93c1xuICAgICAgY29uc3QgbWlkZGxlUm93c0NvdW50ID0gdmlld3BvcnRDYXBwZWRFbmRSb3cgLSB2aWV3cG9ydENhcHBlZFN0YXJ0Um93IC0gMTtcbiAgICAgIGRvY3VtZW50RnJhZ21lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlU2VsZWN0aW9uRWxlbWVudCh2aWV3cG9ydENhcHBlZFN0YXJ0Um93ICsgMSwgMCwgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCBtaWRkbGVSb3dzQ291bnQpKTtcbiAgICAgIC8vIERyYXcgZmluYWwgcm93XG4gICAgICBpZiAodmlld3BvcnRDYXBwZWRTdGFydFJvdyAhPT0gdmlld3BvcnRDYXBwZWRFbmRSb3cpIHtcbiAgICAgICAgLy8gT25seSBkcmF3IHZpZXdwb3J0RW5kUm93IGlmIGl0J3Mgbm90IHRoZSBzYW1lIGFzIHZpZXdwb3J0dGFydFJvd1xuICAgICAgICBjb25zdCBlbmRDb2wgPSB2aWV3cG9ydEVuZFJvdyA9PT0gdmlld3BvcnRDYXBwZWRFbmRSb3cgPyBlbmRbMF0gOiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgICAgIGRvY3VtZW50RnJhZ21lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlU2VsZWN0aW9uRWxlbWVudCh2aWV3cG9ydENhcHBlZEVuZFJvdywgMCwgZW5kQ29sKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudEZyYWdtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc2VsZWN0aW9uIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi5cbiAgICogQHBhcmFtIHJvdyBUaGUgcm93IG9mIHRoZSBzZWxlY3Rpb24uXG4gICAqIEBwYXJhbSBjb2xTdGFydCBUaGUgc3RhcnQgY29sdW1uLlxuICAgKiBAcGFyYW0gY29sRW5kIFRoZSBlbmQgY29sdW1ucy5cbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZVNlbGVjdGlvbkVsZW1lbnQocm93OiBudW1iZXIsIGNvbFN0YXJ0OiBudW1iZXIsIGNvbEVuZDogbnVtYmVyLCByb3dDb3VudDogbnVtYmVyID0gMSk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgbGVmdCA9IGNvbFN0YXJ0ICogdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoO1xuICAgIGxldCB3aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCAqIChjb2xFbmQgLSBjb2xTdGFydCk7XG4gICAgaWYgKGxlZnQgKyB3aWR0aCA+IHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoKSB7XG4gICAgICB3aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoIC0gbGVmdDtcbiAgICB9XG5cbiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3Jvd0NvdW50ICogdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodH1weGA7XG4gICAgZWxlbWVudC5zdHlsZS50b3AgPSBgJHtyb3cgKiB0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0fXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUN1cnNvck1vdmUoKTogdm9pZCB7XG4gICAgLy8gTm8tb3AsIHRoZSBjdXJzb3IgaXMgZHJhd24gd2hlbiByb3dzIGFyZSBkcmF3blxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlT3B0aW9uc0NoYW5nZWQoKTogdm9pZCB7XG4gICAgLy8gRm9yY2UgYSByZWZyZXNoXG4gICAgdGhpcy5fdXBkYXRlRGltZW5zaW9ucygpO1xuICAgIC8vIFJlZnJlc2ggQ1NTXG4gICAgdGhpcy5faW5qZWN0Q3NzKHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMpO1xuICAgIC8vIHVwZGF0ZSBzcGFjaW5nIGNhY2hlXG4gICAgdGhpcy5fd2lkdGhDYWNoZS5zZXRGb250KFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250RmFtaWx5LFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZSxcbiAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFdlaWdodCxcbiAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFdlaWdodEJvbGRcbiAgICApO1xuICAgIHRoaXMuX3NldERlZmF1bHRTcGFjaW5nKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBlIG9mIHRoaXMuX3Jvd0VsZW1lbnRzKSB7XG4gICAgICAvKipcbiAgICAgICAqIE5PVEU6IFRoaXMgdXNlZCB0byBiZSBgZS5pbm5lclRleHQgPSAnJztgIGJ1dCB0aGF0IGRvZXNuJ3Qgd29yayB3aGVuIHVzaW5nIGBqc2RvbWAgYW5kXG4gICAgICAgKiBgQHRlc3RpbmctbGlicmFyeS9yZWFjdGBcbiAgICAgICAqXG4gICAgICAgKiByZWZlcmVuY2VzOlxuICAgICAgICogLSBodHRwczovL2dpdGh1Yi5jb20vdGVzdGluZy1saWJyYXJ5L3JlYWN0LXRlc3RpbmctbGlicmFyeS9pc3N1ZXMvMTE0NlxuICAgICAgICogLSBodHRwczovL2dpdGh1Yi5jb20vanNkb20vanNkb20vaXNzdWVzLzEyNDVcbiAgICAgICAqL1xuICAgICAgZS5yZXBsYWNlQ2hpbGRyZW4oKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyUm93cyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO1xuICAgIGNvbnN0IGN1cnNvckFic29sdXRlWSA9IGJ1ZmZlci55YmFzZSArIGJ1ZmZlci55O1xuICAgIGNvbnN0IGN1cnNvclggPSBNYXRoLm1pbihidWZmZXIueCwgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gMSk7XG4gICAgY29uc3QgY3Vyc29yQmxpbmsgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmN1cnNvckJsaW5rO1xuICAgIGNvbnN0IGN1cnNvclN0eWxlID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JTdHlsZTtcbiAgICBjb25zdCBjdXJzb3JJbmFjdGl2ZVN0eWxlID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JJbmFjdGl2ZVN0eWxlO1xuXG4gICAgZm9yIChsZXQgeSA9IHN0YXJ0OyB5IDw9IGVuZDsgeSsrKSB7XG4gICAgICBjb25zdCByb3cgPSB5ICsgYnVmZmVyLnlkaXNwO1xuICAgICAgY29uc3Qgcm93RWxlbWVudCA9IHRoaXMuX3Jvd0VsZW1lbnRzW3ldO1xuICAgICAgY29uc3QgbGluZURhdGEgPSBidWZmZXIubGluZXMuZ2V0KHJvdyk7XG4gICAgICBpZiAoIXJvd0VsZW1lbnQgfHwgIWxpbmVEYXRhKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcm93RWxlbWVudC5yZXBsYWNlQ2hpbGRyZW4oXG4gICAgICAgIC4uLnRoaXMuX3Jvd0ZhY3RvcnkuY3JlYXRlUm93KFxuICAgICAgICAgIGxpbmVEYXRhLFxuICAgICAgICAgIHJvdyxcbiAgICAgICAgICByb3cgPT09IGN1cnNvckFic29sdXRlWSxcbiAgICAgICAgICBjdXJzb3JTdHlsZSxcbiAgICAgICAgICBjdXJzb3JJbmFjdGl2ZVN0eWxlLFxuICAgICAgICAgIGN1cnNvclgsXG4gICAgICAgICAgY3Vyc29yQmxpbmssXG4gICAgICAgICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoLFxuICAgICAgICAgIHRoaXMuX3dpZHRoQ2FjaGUsXG4gICAgICAgICAgLTEsXG4gICAgICAgICAgLTFcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBfdGVybWluYWxTZWxlY3RvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLiR7VEVSTUlOQUxfQ0xBU1NfUFJFRklYfSR7dGhpcy5fdGVybWluYWxDbGFzc31gO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlTGlua0hvdmVyKGU6IElMaW5raWZpZXJFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3NldENlbGxVbmRlcmxpbmUoZS54MSwgZS54MiwgZS55MSwgZS55MiwgZS5jb2xzLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUxpbmtMZWF2ZShlOiBJTGlua2lmaWVyRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRDZWxsVW5kZXJsaW5lKGUueDEsIGUueDIsIGUueTEsIGUueTIsIGUuY29scywgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q2VsbFVuZGVybGluZSh4OiBudW1iZXIsIHgyOiBudW1iZXIsIHk6IG51bWJlciwgeTI6IG51bWJlciwgY29sczogbnVtYmVyLCBlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyoqXG4gICAgICogTk9URTogVGhlIGxpbmtpZmllciBtYXkgc2VuZCBvdXQgb2Ygdmlld3BvcnQgeS12YWx1ZXMgaWY6XG4gICAgICogLSBuZWdhdGl2ZSB5LXZhbHVlOiB0aGUgbGluayBzdGFydGVkIGF0IGEgaGlnaGVyIGxpbmVcbiAgICAgKiAtIHktdmFsdWUgPj0gbWF4WTogdGhlIGxpbmsgZW5kcyBhdCBhIGxpbmUgYmVsb3cgdmlld3BvcnRcbiAgICAgKlxuICAgICAqIEZvciBuZWdhdGl2ZSB5LXZhbHVlcyB3ZSBjYW4gc2ltcGx5IGFkanVzdCB4ID0gMCxcbiAgICAgKiBhcyBoaWdoZXIgdXAgbGluayBzdGFydCBtZWFucywgdGhhdCBldmVyeXRoaW5nIGZyb21cbiAgICAgKiAoMCwwKSBpcyBhIGxpbmsgdW5kZXIgdG9wLWRvd24tbGVmdC1yaWdodCBjaGFyIHByb2dyZXNzaW9uXG4gICAgICpcbiAgICAgKiBBZGRpdGlvbmFsbHkgdGhlcmUgbWlnaHQgYmUgYSBzbWFsbCBjaGFuY2Ugb2Ygb3V0LW9mLXN5bmMgeHx5LXZhbHVlc1xuICAgICAqIGZyb20gYSByYWNlIGNvbmRpdGlvbiBvZiByZW5kZXIgdXBkYXRlcyB2cy4gbGluayBldmVudCBoYW5kbGVyIGV4ZWN1dGlvbjpcbiAgICAgKiAtIChzeW5jKSByZXNpemU6IGNoYW5jZXMgdGVybWluYWwgYnVmZmVyIGluIHN5bmMsIHNjaGVkdWxlcyByZW5kZXIgdXBkYXRlIGFzeW5jXG4gICAgICogLSAoYXN5bmMpIGxpbmsgaGFuZGxlciByYWNlIGNvbmRpdGlvbjogbmV3IGJ1ZmZlciBtZXRyaWNzLCBidXQgc3RpbGwgb24gb2xkIHJlbmRlciBzdGF0ZVxuICAgICAqIC0gKGFzeW5jKSByZW5kZXIgdXBkYXRlOiBicmluZ3MgdGVybSBtZXRyaWNzIGFuZCByZW5kZXIgc3RhdGUgYmFjayBpbiBzeW5jXG4gICAgICovXG4gICAgLy8gY2xpcCBjb29yZHMgaW50byB2aWV3cG9ydFxuICAgIGlmICh5IDwgMCkgeCA9IDA7XG4gICAgaWYgKHkyIDwgMCkgeDIgPSAwO1xuICAgIGNvbnN0IG1heFkgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxO1xuICAgIHkgPSBNYXRoLm1heChNYXRoLm1pbih5LCBtYXhZKSwgMCk7XG4gICAgeTIgPSBNYXRoLm1heChNYXRoLm1pbih5MiwgbWF4WSksIDApO1xuXG4gICAgY29scyA9IE1hdGgubWluKGNvbHMsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyk7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgY29uc3QgY3Vyc29yQWJzb2x1dGVZID0gYnVmZmVyLnliYXNlICsgYnVmZmVyLnk7XG4gICAgY29uc3QgY3Vyc29yWCA9IE1hdGgubWluKGJ1ZmZlci54LCBjb2xzIC0gMSk7XG4gICAgY29uc3QgY3Vyc29yQmxpbmsgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmN1cnNvckJsaW5rO1xuICAgIGNvbnN0IGN1cnNvclN0eWxlID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JTdHlsZTtcbiAgICBjb25zdCBjdXJzb3JJbmFjdGl2ZVN0eWxlID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JJbmFjdGl2ZVN0eWxlO1xuXG4gICAgLy8gcmVmcmVzaCByb3dzIHdpdGhpbiBsaW5rIHJhbmdlXG4gICAgZm9yIChsZXQgaSA9IHk7IGkgPD0geTI7ICsraSkge1xuICAgICAgY29uc3Qgcm93ID0gaSArIGJ1ZmZlci55ZGlzcDtcbiAgICAgIGNvbnN0IHJvd0VsZW1lbnQgPSB0aGlzLl9yb3dFbGVtZW50c1tpXTtcbiAgICAgIGNvbnN0IGJ1ZmZlcmxpbmUgPSBidWZmZXIubGluZXMuZ2V0KHJvdyk7XG4gICAgICBpZiAoIXJvd0VsZW1lbnQgfHwgIWJ1ZmZlcmxpbmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByb3dFbGVtZW50LnJlcGxhY2VDaGlsZHJlbihcbiAgICAgICAgLi4udGhpcy5fcm93RmFjdG9yeS5jcmVhdGVSb3coXG4gICAgICAgICAgYnVmZmVybGluZSxcbiAgICAgICAgICByb3csXG4gICAgICAgICAgcm93ID09PSBjdXJzb3JBYnNvbHV0ZVksXG4gICAgICAgICAgY3Vyc29yU3R5bGUsXG4gICAgICAgICAgY3Vyc29ySW5hY3RpdmVTdHlsZSxcbiAgICAgICAgICBjdXJzb3JYLFxuICAgICAgICAgIGN1cnNvckJsaW5rLFxuICAgICAgICAgIHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCxcbiAgICAgICAgICB0aGlzLl93aWR0aENhY2hlLFxuICAgICAgICAgIGVuYWJsZWQgPyAoaSA9PT0geSA/IHggOiAwKSA6IC0xLFxuICAgICAgICAgIGVuYWJsZWQgPyAoKGkgPT09IHkyID8geDIgOiBjb2xzKSAtIDEpIDogLTFcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCwgMjAyMyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElCdWZmZXJMaW5lLCBJQ2VsbERhdGEsIElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBJTlZFUlRFRF9ERUZBVUxUX0NPTE9SIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ29uc3RhbnRzJztcbmltcG9ydCB7IFdISVRFU1BBQ0VfQ0VMTF9DSEFSLCBBdHRyaWJ1dGVzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcbmltcG9ydCB7IElDb3JlU2VydmljZSwgSURlY29yYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgY2hhbm5lbHMsIGNvbG9yIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcbmltcG9ydCB7IElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLCBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBKb2luZWRDZWxsRGF0YSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvQ2hhcmFjdGVySm9pbmVyU2VydmljZSc7XG5pbXBvcnQgeyB0cmVhdEdseXBoQXNCYWNrZ3JvdW5kQ29sb3IgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuaW1wb3J0IHsgV2lkdGhDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvZG9tL1dpZHRoQ2FjaGUnO1xuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuXG5cbmV4cG9ydCBjb25zdCBlbnVtIFJvd0NzcyB7XG4gIEJPTERfQ0xBU1MgPSAneHRlcm0tYm9sZCcsXG4gIERJTV9DTEFTUyA9ICd4dGVybS1kaW0nLFxuICBJVEFMSUNfQ0xBU1MgPSAneHRlcm0taXRhbGljJyxcbiAgVU5ERVJMSU5FX0NMQVNTID0gJ3h0ZXJtLXVuZGVybGluZScsXG4gIE9WRVJMSU5FX0NMQVNTID0gJ3h0ZXJtLW92ZXJsaW5lJyxcbiAgU1RSSUtFVEhST1VHSF9DTEFTUyA9ICd4dGVybS1zdHJpa2V0aHJvdWdoJyxcbiAgQ1VSU09SX0NMQVNTID0gJ3h0ZXJtLWN1cnNvcicsXG4gIENVUlNPUl9CTElOS19DTEFTUyA9ICd4dGVybS1jdXJzb3ItYmxpbmsnLFxuICBDVVJTT1JfU1RZTEVfQkxPQ0tfQ0xBU1MgPSAneHRlcm0tY3Vyc29yLWJsb2NrJyxcbiAgQ1VSU09SX1NUWUxFX09VVExJTkVfQ0xBU1MgPSAneHRlcm0tY3Vyc29yLW91dGxpbmUnLFxuICBDVVJTT1JfU1RZTEVfQkFSX0NMQVNTID0gJ3h0ZXJtLWN1cnNvci1iYXInLFxuICBDVVJTT1JfU1RZTEVfVU5ERVJMSU5FX0NMQVNTID0gJ3h0ZXJtLWN1cnNvci11bmRlcmxpbmUnXG59XG5cblxuZXhwb3J0IGNsYXNzIERvbVJlbmRlcmVyUm93RmFjdG9yeSB7XG4gIHByaXZhdGUgX3dvcmtDZWxsOiBDZWxsRGF0YSA9IG5ldyBDZWxsRGF0YSgpO1xuXG4gIHByaXZhdGUgX3NlbGVjdGlvblN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9zZWxlY3Rpb25FbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2NvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgZGVmYXVsdFNwYWNpbmcgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgICBASUNoYXJhY3RlckpvaW5lclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY2hhcmFjdGVySm9pbmVyU2VydmljZTogSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIEBJQ29yZUJyb3dzZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBASUNvcmVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsXG4gICAgQElEZWNvcmF0aW9uU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9kZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIEBJVGhlbWVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX3RoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoc3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgY29sdW1uU2VsZWN0TW9kZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5fc2VsZWN0aW9uRW5kID0gZW5kO1xuICAgIHRoaXMuX2NvbHVtblNlbGVjdE1vZGUgPSBjb2x1bW5TZWxlY3RNb2RlO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVJvdyhcbiAgICBsaW5lRGF0YTogSUJ1ZmZlckxpbmUsXG4gICAgcm93OiBudW1iZXIsXG4gICAgaXNDdXJzb3JSb3c6IGJvb2xlYW4sXG4gICAgY3Vyc29yU3R5bGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjdXJzb3JJbmFjdGl2ZVN0eWxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY3Vyc29yWDogbnVtYmVyLFxuICAgIGN1cnNvckJsaW5rOiBib29sZWFuLFxuICAgIGNlbGxXaWR0aDogbnVtYmVyLFxuICAgIHdpZHRoQ2FjaGU6IFdpZHRoQ2FjaGUsXG4gICAgbGlua1N0YXJ0OiBudW1iZXIsXG4gICAgbGlua0VuZDogbnVtYmVyXG4gICk6IEhUTUxTcGFuRWxlbWVudFtdIHtcblxuICAgIGNvbnN0IGVsZW1lbnRzOiBIVE1MU3BhbkVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IGpvaW5lZFJhbmdlcyA9IHRoaXMuX2NoYXJhY3RlckpvaW5lclNlcnZpY2UuZ2V0Sm9pbmVkQ2hhcmFjdGVycyhyb3cpO1xuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnM7XG5cbiAgICBsZXQgbGluZUxlbmd0aCA9IGxpbmVEYXRhLmdldE5vQmdUcmltbWVkTGVuZ3RoKCk7XG4gICAgaWYgKGlzQ3Vyc29yUm93ICYmIGxpbmVMZW5ndGggPCBjdXJzb3JYICsgMSkge1xuICAgICAgbGluZUxlbmd0aCA9IGN1cnNvclggKyAxO1xuICAgIH1cblxuICAgIGxldCBjaGFyRWxlbWVudDogSFRNTFNwYW5FbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGxldCBjZWxsQW1vdW50ID0gMDtcbiAgICBsZXQgdGV4dCA9ICcnO1xuICAgIGxldCBvbGRCZyA9IDA7XG4gICAgbGV0IG9sZEZnID0gMDtcbiAgICBsZXQgb2xkRXh0ID0gMDtcbiAgICBsZXQgb2xkTGlua0hvdmVyOiBudW1iZXIgfCBib29sZWFuID0gZmFsc2U7XG4gICAgbGV0IG9sZFNwYWNpbmcgPSAwO1xuICAgIGxldCBvbGRJc0luU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gICAgbGV0IHNwYWNpbmcgPSAwO1xuICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBoYXNIb3ZlciA9IGxpbmtTdGFydCAhPT0gLTEgJiYgbGlua0VuZCAhPT0gLTE7XG5cbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGxpbmVMZW5ndGg7IHgrKykge1xuICAgICAgbGluZURhdGEubG9hZENlbGwoeCwgdGhpcy5fd29ya0NlbGwpO1xuICAgICAgbGV0IHdpZHRoID0gdGhpcy5fd29ya0NlbGwuZ2V0V2lkdGgoKTtcblxuICAgICAgLy8gVGhlIGNoYXJhY3RlciB0byB0aGUgbGVmdCBpcyBhIHdpZGUgY2hhcmFjdGVyLCBkcmF3aW5nIGlzIG93bmVkIGJ5IHRoZSBjaGFyIGF0IHgtMVxuICAgICAgaWYgKHdpZHRoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0cnVlLCBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIocykgdG8gZHJhdyB3ZXJlIGpvaW5lZC5cbiAgICAgIGxldCBpc0pvaW5lZCA9IGZhbHNlO1xuICAgICAgbGV0IGxhc3RDaGFyWCA9IHg7XG5cbiAgICAgIC8vIFByb2Nlc3MgYW55IGpvaW5lZCBjaGFyYWN0ZXIgcmFuZ2VzIGFzIG5lZWRlZC4gQmVjYXVzZSBvZiBob3cgdGhlXG4gICAgICAvLyByYW5nZXMgYXJlIHByb2R1Y2VkLCB3ZSBrbm93IHRoYXQgdGhleSBhcmUgdmFsaWQgZm9yIHRoZSBjaGFyYWN0ZXJzXG4gICAgICAvLyBhbmQgYXR0cmlidXRlcyBvZiBvdXIgaW5wdXQuXG4gICAgICBsZXQgY2VsbCA9IHRoaXMuX3dvcmtDZWxsO1xuICAgICAgaWYgKGpvaW5lZFJhbmdlcy5sZW5ndGggPiAwICYmIHggPT09IGpvaW5lZFJhbmdlc1swXVswXSkge1xuICAgICAgICBpc0pvaW5lZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gam9pbmVkUmFuZ2VzLnNoaWZ0KCkhO1xuXG4gICAgICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgZXhhY3Qgc3RhcnQgYW5kIGVuZCBjb2x1bW4gb2YgdGhlIGpvaW5lZCByYW5nZSxcbiAgICAgICAgLy8gc28gd2UgZ2V0IHRoZSBzdHJpbmcgYW5kIHdpZHRoIHJlcHJlc2VudGluZyBpdCBkaXJlY3RseVxuICAgICAgICBjZWxsID0gbmV3IEpvaW5lZENlbGxEYXRhKFxuICAgICAgICAgIHRoaXMuX3dvcmtDZWxsLFxuICAgICAgICAgIGxpbmVEYXRhLnRyYW5zbGF0ZVRvU3RyaW5nKHRydWUsIHJhbmdlWzBdLCByYW5nZVsxXSksXG4gICAgICAgICAgcmFuZ2VbMV0gLSByYW5nZVswXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgb3ZlciB0aGUgY2VsbHMgb2NjdXBpZWQgYnkgdGhpcyByYW5nZSBpbiB0aGUgbG9vcFxuICAgICAgICBsYXN0Q2hhclggPSByYW5nZVsxXSAtIDE7XG5cbiAgICAgICAgLy8gUmVjYWxjdWxhdGUgd2lkdGhcbiAgICAgICAgd2lkdGggPSBjZWxsLmdldFdpZHRoKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzSW5TZWxlY3Rpb24gPSB0aGlzLl9pc0NlbGxJblNlbGVjdGlvbih4LCByb3cpO1xuICAgICAgY29uc3QgaXNDdXJzb3JDZWxsID0gaXNDdXJzb3JSb3cgJiYgeCA9PT0gY3Vyc29yWDtcbiAgICAgIGNvbnN0IGlzTGlua0hvdmVyID0gaGFzSG92ZXIgJiYgeCA+PSBsaW5rU3RhcnQgJiYgeCA8PSBsaW5rRW5kO1xuXG4gICAgICBsZXQgaXNEZWNvcmF0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLmZvckVhY2hEZWNvcmF0aW9uQXRDZWxsKHgsIHJvdywgdW5kZWZpbmVkLCBkID0+IHtcbiAgICAgICAgaXNEZWNvcmF0ZWQgPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGdldCBjaGFycyB0byByZW5kZXIgZm9yIHRoaXMgY2VsbFxuICAgICAgbGV0IGNoYXJzID0gY2VsbC5nZXRDaGFycygpIHx8IFdISVRFU1BBQ0VfQ0VMTF9DSEFSO1xuICAgICAgaWYgKGNoYXJzID09PSAnICcgJiYgKGNlbGwuaXNVbmRlcmxpbmUoKSB8fCBjZWxsLmlzT3ZlcmxpbmUoKSkpIHtcbiAgICAgICAgY2hhcnMgPSAnXFx4YTAnO1xuICAgICAgfVxuXG4gICAgICAvLyBsb29rdXAgY2hhciByZW5kZXIgd2lkdGggYW5kIGNhbGMgc3BhY2luZ1xuICAgICAgc3BhY2luZyA9IHdpZHRoICogY2VsbFdpZHRoIC0gd2lkdGhDYWNoZS5nZXQoY2hhcnMsIGNlbGwuaXNCb2xkKCksIGNlbGwuaXNJdGFsaWMoKSk7XG5cbiAgICAgIGlmICghY2hhckVsZW1lbnQpIHtcbiAgICAgICAgY2hhckVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKipcbiAgICAgICAgICogY2hhcnMgY2FuIG9ubHkgYmUgbWVyZ2VkIG9uIGV4aXN0aW5nIHNwYW4gaWY6XG4gICAgICAgICAqIC0gZXhpc3Rpbmcgc3BhbiBvbmx5IGNvbnRhaW5zIG1lcmdlYWJsZSBjaGFycyAoY2VsbEFtb3VudCAhPSAwKVxuICAgICAgICAgKiAtIGJnIGRpZCBub3QgY2hhbmdlIChvciBib3RoIGFyZSBpbiBzZWxlY3Rpb24pXG4gICAgICAgICAqIC0gZmcgZGlkIG5vdCBjaGFuZ2UgKG9yIGJvdGggYXJlIGluIHNlbGVjdGlvbiBhbmQgc2VsZWN0aW9uIGZnIGlzIHNldClcbiAgICAgICAgICogLSBleHQgZGlkIG5vdCBjaGFuZ2VcbiAgICAgICAgICogLSB1bmRlcmxpbmUgZnJvbSBob3ZlciBzdGF0ZSBkaWQgbm90IGNoYW5nZVxuICAgICAgICAgKiAtIGNlbGwgY29udGVudCByZW5kZXJzIHRvIHNhbWUgbGV0dGVyLXNwYWNpbmdcbiAgICAgICAgICogLSBjZWxsIGlzIG5vdCBjdXJzb3JcbiAgICAgICAgICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICBjZWxsQW1vdW50XG4gICAgICAgICAgJiYgKFxuICAgICAgICAgICAgKGlzSW5TZWxlY3Rpb24gJiYgb2xkSXNJblNlbGVjdGlvbilcbiAgICAgICAgICAgIHx8ICghaXNJblNlbGVjdGlvbiAmJiAhb2xkSXNJblNlbGVjdGlvbiAmJiBjZWxsLmJnID09PSBvbGRCZylcbiAgICAgICAgICApXG4gICAgICAgICAgJiYgKFxuICAgICAgICAgICAgKGlzSW5TZWxlY3Rpb24gJiYgb2xkSXNJblNlbGVjdGlvbiAmJiBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZClcbiAgICAgICAgICAgIHx8IGNlbGwuZmcgPT09IG9sZEZnXG4gICAgICAgICAgKVxuICAgICAgICAgICYmIGNlbGwuZXh0ZW5kZWQuZXh0ID09PSBvbGRFeHRcbiAgICAgICAgICAmJiBpc0xpbmtIb3ZlciA9PT0gb2xkTGlua0hvdmVyXG4gICAgICAgICAgJiYgc3BhY2luZyA9PT0gb2xkU3BhY2luZ1xuICAgICAgICAgICYmICFpc0N1cnNvckNlbGxcbiAgICAgICAgICAmJiAhaXNKb2luZWRcbiAgICAgICAgICAmJiAhaXNEZWNvcmF0ZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gbm8gc3BhbiBhbHRlcmF0aW9ucywgdGh1cyBvbmx5IGFjY291bnQgY2hhcnMgc2tpcHBpbmcgYWxsIGNvZGUgYmVsb3dcbiAgICAgICAgICBpZiAoY2VsbC5pc0ludmlzaWJsZSgpKSB7XG4gICAgICAgICAgICB0ZXh0ICs9IFdISVRFU1BBQ0VfQ0VMTF9DSEFSO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ICs9IGNoYXJzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjZWxsQW1vdW50Kys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogY2Fubm90IG1lcmdlOlxuICAgICAgICAgICAqIC0gYXBwbHkgbGVmdC1vdmVyIHRleHQgdG8gb2xkIHNwYW5cbiAgICAgICAgICAgKiAtIGNyZWF0ZSBuZXcgc3BhbiwgcmVzZXQgc3RhdGUgaG9sZGVycyBjZWxsQW1vdW50ICYgdGV4dFxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChjZWxsQW1vdW50KSB7XG4gICAgICAgICAgICBjaGFyRWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoYXJFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIGNlbGxBbW91bnQgPSAwO1xuICAgICAgICAgIHRleHQgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gcHJlc2VydmUgY29uZGl0aW9ucyBmb3IgbmV4dCBtZXJnZXIgZXZhbCByb3VuZFxuICAgICAgb2xkQmcgPSBjZWxsLmJnO1xuICAgICAgb2xkRmcgPSBjZWxsLmZnO1xuICAgICAgb2xkRXh0ID0gY2VsbC5leHRlbmRlZC5leHQ7XG4gICAgICBvbGRMaW5rSG92ZXIgPSBpc0xpbmtIb3ZlcjtcbiAgICAgIG9sZFNwYWNpbmcgPSBzcGFjaW5nO1xuICAgICAgb2xkSXNJblNlbGVjdGlvbiA9IGlzSW5TZWxlY3Rpb247XG5cbiAgICAgIGlmIChpc0pvaW5lZCkge1xuICAgICAgICAvLyBUaGUgRE9NIHJlbmRlcmVyIGNvbG9ycyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgY3Vyc29yIGJ1dCBmb3IgbGlnYXR1cmVzIGFsbCBjZWxscyBhcmVcbiAgICAgICAgLy8gam9pbmVkLiBUaGUgd29ya2Fyb3VuZCBoZXJlIGlzIHRvIHNob3cgYSBjdXJzb3IgYXJvdW5kIHRoZSB3aG9sZSBsaWdhdHVyZSBzbyBpdCBzaG93cyB1cCxcbiAgICAgICAgLy8gdGhlIGN1cnNvciBsb29rcyB0aGUgc2FtZSB3aGVuIG9uIGFueSBjaGFyYWN0ZXIgb2YgdGhlIGxpZ2F0dXJlIHRob3VnaFxuICAgICAgICBpZiAoY3Vyc29yWCA+PSB4ICYmIGN1cnNvclggPD0gbGFzdENoYXJYKSB7XG4gICAgICAgICAgY3Vyc29yWCA9IHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckhpZGRlbiAmJiBpc0N1cnNvckNlbGwgJiYgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZCkge1xuICAgICAgICBjbGFzc2VzLnB1c2goUm93Q3NzLkNVUlNPUl9DTEFTUyk7XG4gICAgICAgIGlmICh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgaWYgKGN1cnNvckJsaW5rKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goUm93Q3NzLkNVUlNPUl9CTElOS19DTEFTUyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNsYXNzZXMucHVzaChcbiAgICAgICAgICAgIGN1cnNvclN0eWxlID09PSAnYmFyJ1xuICAgICAgICAgICAgICA/IFJvd0Nzcy5DVVJTT1JfU1RZTEVfQkFSX0NMQVNTXG4gICAgICAgICAgICAgIDogY3Vyc29yU3R5bGUgPT09ICd1bmRlcmxpbmUnXG4gICAgICAgICAgICAgICAgPyBSb3dDc3MuQ1VSU09SX1NUWUxFX1VOREVSTElORV9DTEFTU1xuICAgICAgICAgICAgICAgIDogUm93Q3NzLkNVUlNPUl9TVFlMRV9CTE9DS19DTEFTU1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGN1cnNvckluYWN0aXZlU3R5bGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoY3Vyc29ySW5hY3RpdmVTdHlsZSkge1xuICAgICAgICAgICAgICBjYXNlICdvdXRsaW5lJzpcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goUm93Q3NzLkNVUlNPUl9TVFlMRV9PVVRMSU5FX0NMQVNTKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnYmxvY2snOlxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuQ1VSU09SX1NUWUxFX0JMT0NLX0NMQVNTKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnYmFyJzpcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goUm93Q3NzLkNVUlNPUl9TVFlMRV9CQVJfQ0xBU1MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICd1bmRlcmxpbmUnOlxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuQ1VSU09SX1NUWUxFX1VOREVSTElORV9DTEFTUyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjZWxsLmlzQm9sZCgpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuQk9MRF9DTEFTUyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZWxsLmlzSXRhbGljKCkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKFJvd0Nzcy5JVEFMSUNfQ0xBU1MpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc0RpbSgpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuRElNX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwuaXNJbnZpc2libGUoKSkge1xuICAgICAgICB0ZXh0ID0gV0hJVEVTUEFDRV9DRUxMX0NIQVI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0ID0gY2VsbC5nZXRDaGFycygpIHx8IFdISVRFU1BBQ0VfQ0VMTF9DSEFSO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc1VuZGVybGluZSgpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChgJHtSb3dDc3MuVU5ERVJMSU5FX0NMQVNTfS0ke2NlbGwuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGV9YCk7XG4gICAgICAgIGlmICh0ZXh0ID09PSAnICcpIHtcbiAgICAgICAgICB0ZXh0ID0gJ1xceGEwJzsgLy8gPSAmbmJzcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNlbGwuaXNVbmRlcmxpbmVDb2xvckRlZmF1bHQoKSkge1xuICAgICAgICAgIGlmIChjZWxsLmlzVW5kZXJsaW5lQ29sb3JSR0IoKSkge1xuICAgICAgICAgICAgY2hhckVsZW1lbnQuc3R5bGUudGV4dERlY29yYXRpb25Db2xvciA9IGByZ2IoJHtBdHRyaWJ1dGVEYXRhLnRvQ29sb3JSR0IoY2VsbC5nZXRVbmRlcmxpbmVDb2xvcigpKS5qb2luKCcsJyl9KWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmZyA9IGNlbGwuZ2V0VW5kZXJsaW5lQ29sb3IoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzICYmIGNlbGwuaXNCb2xkKCkgJiYgZmcgPCA4KSB7XG4gICAgICAgICAgICAgIGZnICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGFyRWxlbWVudC5zdHlsZS50ZXh0RGVjb3JhdGlvbkNvbG9yID0gY29sb3JzLmFuc2lbZmddLmNzcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwuaXNPdmVybGluZSgpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuT1ZFUkxJTkVfQ0xBU1MpO1xuICAgICAgICBpZiAodGV4dCA9PT0gJyAnKSB7XG4gICAgICAgICAgdGV4dCA9ICdcXHhhMCc7IC8vID0gJm5ic3A7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwuaXNTdHJpa2V0aHJvdWdoKCkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKFJvd0Nzcy5TVFJJS0VUSFJPVUdIX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgLy8gYXBwbHkgbGluayBob3ZlciB1bmRlcmxpbmUgbGF0ZSwgZWZmZWN0aXZlbHkgb3ZlcnJpZGVzIGFueSBwcmV2aW91cyB0ZXh0LWRlY29yYXRpb25cbiAgICAgIC8vIHNldHRpbmdzXG4gICAgICBpZiAoaXNMaW5rSG92ZXIpIHtcbiAgICAgICAgY2hhckVsZW1lbnQuc3R5bGUudGV4dERlY29yYXRpb24gPSAndW5kZXJsaW5lJztcbiAgICAgIH1cblxuICAgICAgbGV0IGZnID0gY2VsbC5nZXRGZ0NvbG9yKCk7XG4gICAgICBsZXQgZmdDb2xvck1vZGUgPSBjZWxsLmdldEZnQ29sb3JNb2RlKCk7XG4gICAgICBsZXQgYmcgPSBjZWxsLmdldEJnQ29sb3IoKTtcbiAgICAgIGxldCBiZ0NvbG9yTW9kZSA9IGNlbGwuZ2V0QmdDb2xvck1vZGUoKTtcbiAgICAgIGNvbnN0IGlzSW52ZXJzZSA9ICEhY2VsbC5pc0ludmVyc2UoKTtcbiAgICAgIGlmIChpc0ludmVyc2UpIHtcbiAgICAgICAgY29uc3QgdGVtcCA9IGZnO1xuICAgICAgICBmZyA9IGJnO1xuICAgICAgICBiZyA9IHRlbXA7XG4gICAgICAgIGNvbnN0IHRlbXAyID0gZmdDb2xvck1vZGU7XG4gICAgICAgIGZnQ29sb3JNb2RlID0gYmdDb2xvck1vZGU7XG4gICAgICAgIGJnQ29sb3JNb2RlID0gdGVtcDI7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IGFueSBkZWNvcmF0aW9uIGZvcmVncm91bmQvYmFja2dyb3VuZCBvdmVycmlkZXMsIHRoaXMgbXVzdCBoYXBwZW4gYWZ0ZXIgaW52ZXJzZSBoYXNcbiAgICAgIC8vIGJlZW4gYXBwbGllZFxuICAgICAgbGV0IGJnT3ZlcnJpZGU6IElDb2xvciB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBmZ092ZXJyaWRlOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgaXNUb3AgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLmZvckVhY2hEZWNvcmF0aW9uQXRDZWxsKHgsIHJvdywgdW5kZWZpbmVkLCBkID0+IHtcbiAgICAgICAgaWYgKGQub3B0aW9ucy5sYXllciAhPT0gJ3RvcCcgJiYgaXNUb3ApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGQuYmFja2dyb3VuZENvbG9yUkdCKSB7XG4gICAgICAgICAgYmdDb2xvck1vZGUgPSBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgICAgICBiZyA9IGQuYmFja2dyb3VuZENvbG9yUkdCLnJnYmEgPj4gOCAmIDB4RkZGRkZGO1xuICAgICAgICAgIGJnT3ZlcnJpZGUgPSBkLmJhY2tncm91bmRDb2xvclJHQjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZC5mb3JlZ3JvdW5kQ29sb3JSR0IpIHtcbiAgICAgICAgICBmZ0NvbG9yTW9kZSA9IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgICAgIGZnID0gZC5mb3JlZ3JvdW5kQ29sb3JSR0IucmdiYSA+PiA4ICYgMHhGRkZGRkY7XG4gICAgICAgICAgZmdPdmVycmlkZSA9IGQuZm9yZWdyb3VuZENvbG9yUkdCO1xuICAgICAgICB9XG4gICAgICAgIGlzVG9wID0gZC5vcHRpb25zLmxheWVyID09PSAndG9wJztcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBcHBseSBzZWxlY3Rpb25cbiAgICAgIGlmICghaXNUb3AgJiYgaXNJblNlbGVjdGlvbikge1xuICAgICAgICAvLyBJZiBpbiB0aGUgc2VsZWN0aW9uLCBmb3JjZSB0aGUgZWxlbWVudCB0byBiZSBhYm92ZSB0aGUgc2VsZWN0aW9uIHRvIGltcHJvdmUgY29udHJhc3QgYW5kXG4gICAgICAgIC8vIHN1cHBvcnQgb3BhcXVlIHNlbGVjdGlvbnMuIFRoZSBhcHBsaWVzIGJhY2tncm91bmQgaXMgbm90IGFjdHVhbGx5IG5lZWRlZCBoZXJlIGFzXG4gICAgICAgIC8vIHNlbGVjdGlvbiBpcyBkcmF3biBpbiBhIHNlcGVyYXRlIGNvbnRhaW5lciwgdGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIHRvIGVuc3VyaW5nIG1pbmltdW1cbiAgICAgICAgLy8gY29udHJhc3QgcmF0aW9cbiAgICAgICAgYmdPdmVycmlkZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQgPyBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6IGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWU7XG4gICAgICAgIGJnID0gYmdPdmVycmlkZS5yZ2JhID4+IDggJiAweEZGRkZGRjtcbiAgICAgICAgYmdDb2xvck1vZGUgPSBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgICAgLy8gU2luY2UgYW4gb3BhcXVlIHNlbGVjdGlvbiBpcyBiZWluZyByZW5kZXJlZCwgdGhlIHNlbGVjdGlvbiBwcmV0ZW5kcyB0byBiZSBhIGRlY29yYXRpb24gdG9cbiAgICAgICAgLy8gZW5zdXJlIHRleHQgaXMgZHJhd24gYWJvdmUgdGhlIHNlbGVjdGlvbi5cbiAgICAgICAgaXNUb3AgPSB0cnVlO1xuICAgICAgICAvLyBBcHBseSBzZWxlY3Rpb24gZm9yZWdyb3VuZCBpZiBhcHBsaWNhYmxlXG4gICAgICAgIGlmIChjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCkge1xuICAgICAgICAgIGZnQ29sb3JNb2RlID0gQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgICAgICAgZmcgPSBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZC5yZ2JhID4+IDggJiAweEZGRkZGRjtcbiAgICAgICAgICBmZ092ZXJyaWRlID0gY29sb3JzLnNlbGVjdGlvbkZvcmVncm91bmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIHRvcCBkZWNvcmF0aW9uLCByZW5kZXIgYWJvdmUgdGhlIHNlbGVjdGlvblxuICAgICAgaWYgKGlzVG9wKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgneHRlcm0tZGVjb3JhdGlvbi10b3AnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQmFja2dyb3VuZFxuICAgICAgbGV0IHJlc29sdmVkQmc6IElDb2xvcjtcbiAgICAgIHN3aXRjaCAoYmdDb2xvck1vZGUpIHtcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgICAgcmVzb2x2ZWRCZyA9IGNvbG9ycy5hbnNpW2JnXTtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goYHh0ZXJtLWJnLSR7Ymd9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgcmVzb2x2ZWRCZyA9IGNoYW5uZWxzLnRvQ29sb3IoYmcgPj4gMTYsIGJnID4+IDggJiAweEZGLCBiZyAmIDB4RkYpO1xuICAgICAgICAgIHRoaXMuX2FkZFN0eWxlKGNoYXJFbGVtZW50LCBgYmFja2dyb3VuZC1jb2xvcjojJHtwYWRTdGFydCgoYmcgPj4+IDApLnRvU3RyaW5nKDE2KSwgJzAnLCA2KX1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKGlzSW52ZXJzZSkge1xuICAgICAgICAgICAgcmVzb2x2ZWRCZyA9IGNvbG9ycy5mb3JlZ3JvdW5kO1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKGB4dGVybS1iZy0ke0lOVkVSVEVEX0RFRkFVTFRfQ09MT1J9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmVkQmcgPSBjb2xvcnMuYmFja2dyb3VuZDtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGJhY2tncm91bmQgb3ZlcnJpZGUgYnkgbm93IGl0J3MgdGhlIG9yaWdpbmFsIGNvbG9yLCBzbyBhcHBseSBkaW0gaWYgbmVlZGVkXG4gICAgICBpZiAoIWJnT3ZlcnJpZGUpIHtcbiAgICAgICAgaWYgKGNlbGwuaXNEaW0oKSkge1xuICAgICAgICAgIGJnT3ZlcnJpZGUgPSBjb2xvci5tdWx0aXBseU9wYWNpdHkocmVzb2x2ZWRCZywgMC41KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGb3JlZ3JvdW5kXG4gICAgICBzd2l0Y2ggKGZnQ29sb3JNb2RlKSB7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgIGlmIChjZWxsLmlzQm9sZCgpICYmIGZnIDwgOCAmJiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzKSB7XG4gICAgICAgICAgICBmZyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuX2FwcGx5TWluaW11bUNvbnRyYXN0KGNoYXJFbGVtZW50LCByZXNvbHZlZEJnLCBjb2xvcnMuYW5zaVtmZ10sIGNlbGwsIGJnT3ZlcnJpZGUsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaChgeHRlcm0tZmctJHtmZ31gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgY29uc3QgY29sb3IgPSBjaGFubmVscy50b0NvbG9yKFxuICAgICAgICAgICAgKGZnID4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAoZmcgPj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgIChmZyAgICAgICkgJiAweEZGXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXRoaXMuX2FwcGx5TWluaW11bUNvbnRyYXN0KGNoYXJFbGVtZW50LCByZXNvbHZlZEJnLCBjb2xvciwgY2VsbCwgYmdPdmVycmlkZSwgZmdPdmVycmlkZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFN0eWxlKGNoYXJFbGVtZW50LCBgY29sb3I6IyR7cGFkU3RhcnQoZmcudG9TdHJpbmcoMTYpLCAnMCcsIDYpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCF0aGlzLl9hcHBseU1pbmltdW1Db250cmFzdChjaGFyRWxlbWVudCwgcmVzb2x2ZWRCZywgY29sb3JzLmZvcmVncm91bmQsIGNlbGwsIGJnT3ZlcnJpZGUsIGZnT3ZlcnJpZGUpKSB7XG4gICAgICAgICAgICBpZiAoaXNJbnZlcnNlKSB7XG4gICAgICAgICAgICAgIGNsYXNzZXMucHVzaChgeHRlcm0tZmctJHtJTlZFUlRFRF9ERUZBVUxUX0NPTE9SfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXBwbHkgQ1NTIGNsYXNzZXNcbiAgICAgIC8vIHNsaWdodGx5IGZhc3RlciB0aGFuIHVzaW5nIGNsYXNzTGlzdCBieSBvbWl0dGluZ1xuICAgICAgLy8gY2hlY2tzIGZvciBkb3VibGVkIGVudHJpZXMgKGNvZGUgYWJvdmUgc2hvdWxkIG5vdCBoYXZlIGRvdWJsZXRzKVxuICAgICAgaWYgKGNsYXNzZXMubGVuZ3RoKSB7XG4gICAgICAgIGNoYXJFbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzZXMuam9pbignICcpO1xuICAgICAgICBjbGFzc2VzLmxlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIGV4Y2x1ZGUgY29uZGl0aW9ucyBmb3IgY2VsbCBtZXJnaW5nIC0gbmV2ZXIgbWVyZ2UgdGhlc2VcbiAgICAgIGlmICghaXNDdXJzb3JDZWxsICYmICFpc0pvaW5lZCAmJiAhaXNEZWNvcmF0ZWQpIHtcbiAgICAgICAgY2VsbEFtb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhckVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgfVxuICAgICAgLy8gYXBwbHkgbGV0dGVyLXNwYWNpbmcgcnVsZVxuICAgICAgaWYgKHNwYWNpbmcgIT09IHRoaXMuZGVmYXVsdFNwYWNpbmcpIHtcbiAgICAgICAgY2hhckVsZW1lbnQuc3R5bGUubGV0dGVyU3BhY2luZyA9IGAke3NwYWNpbmd9cHhgO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50cy5wdXNoKGNoYXJFbGVtZW50KTtcbiAgICAgIHggPSBsYXN0Q2hhclg7XG4gICAgfVxuXG4gICAgLy8gcG9zdGZpeCB0ZXh0IG9mIGxhc3QgbWVyZ2VkIHNwYW5cbiAgICBpZiAoY2hhckVsZW1lbnQgJiYgY2VsbEFtb3VudCkge1xuICAgICAgY2hhckVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50cztcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5TWluaW11bUNvbnRyYXN0KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBiZzogSUNvbG9yLCBmZzogSUNvbG9yLCBjZWxsOiBJQ2VsbERhdGEsIGJnT3ZlcnJpZGU6IElDb2xvciB8IHVuZGVmaW5lZCwgZmdPdmVycmlkZTogSUNvbG9yIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubWluaW11bUNvbnRyYXN0UmF0aW8gPT09IDEgfHwgdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yKGNlbGwuZ2V0Q29kZSgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRyeSBnZXQgZnJvbSBjYWNoZSBmaXJzdCwgb25seSB1c2UgdGhlIGNhY2hlIHdoZW4gdGhlcmUgYXJlIG5vIGRlY29yYXRpb24gb3ZlcnJpZGVzXG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLl9nZXRDb250cmFzdENhY2hlKGNlbGwpO1xuICAgIGxldCBhZGp1c3RlZENvbG9yOiBJQ29sb3IgfCB1bmRlZmluZWQgfCBudWxsID0gdW5kZWZpbmVkO1xuICAgIGlmICghYmdPdmVycmlkZSAmJiAhZmdPdmVycmlkZSkge1xuICAgICAgYWRqdXN0ZWRDb2xvciA9IGNhY2hlLmdldENvbG9yKGJnLnJnYmEsIGZnLnJnYmEpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgc3RvcmUgaW4gY2FjaGVcbiAgICBpZiAoYWRqdXN0ZWRDb2xvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBEaW0gY2VsbHMgb25seSByZXF1aXJlIGhhbGYgdGhlIGNvbnRyYXN0LCBvdGhlcndpc2UgdGhleSB3b3VsZG4ndCBiZSBkaXN0aW5ndWlzaGFibGUgZnJvbVxuICAgICAgLy8gbm9uLWRpbSBjZWxsc1xuICAgICAgY29uc3QgcmF0aW8gPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLm1pbmltdW1Db250cmFzdFJhdGlvIC8gKGNlbGwuaXNEaW0oKSA/IDIgOiAxKTtcbiAgICAgIGFkanVzdGVkQ29sb3IgPSBjb2xvci5lbnN1cmVDb250cmFzdFJhdGlvKGJnT3ZlcnJpZGUgfHwgYmcsIGZnT3ZlcnJpZGUgfHwgZmcsIHJhdGlvKTtcbiAgICAgIGNhY2hlLnNldENvbG9yKChiZ092ZXJyaWRlIHx8IGJnKS5yZ2JhLCAoZmdPdmVycmlkZSB8fCBmZykucmdiYSwgYWRqdXN0ZWRDb2xvciA/PyBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAoYWRqdXN0ZWRDb2xvcikge1xuICAgICAgdGhpcy5fYWRkU3R5bGUoZWxlbWVudCwgYGNvbG9yOiR7YWRqdXN0ZWRDb2xvci5jc3N9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb250cmFzdENhY2hlKGNlbGw6IElDZWxsRGF0YSk6IElDb2xvckNvbnRyYXN0Q2FjaGUge1xuICAgIGlmIChjZWxsLmlzRGltKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmhhbGZDb250cmFzdENhY2hlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5jb250cmFzdENhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkU3R5bGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHN0eWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgJHtlbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKSB8fCAnJ30ke3N0eWxlfTtgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzQ2VsbEluU2VsZWN0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9zZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9zZWxlY3Rpb25FbmQ7XG4gICAgaWYgKCFzdGFydCB8fCAhZW5kKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb2x1bW5TZWxlY3RNb2RlKSB7XG4gICAgICBpZiAoc3RhcnRbMF0gPD0gZW5kWzBdKSB7XG4gICAgICAgIHJldHVybiB4ID49IHN0YXJ0WzBdICYmIHkgPj0gc3RhcnRbMV0gJiZcbiAgICAgICAgICB4IDwgZW5kWzBdICYmIHkgPD0gZW5kWzFdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHggPCBzdGFydFswXSAmJiB5ID49IHN0YXJ0WzFdICYmXG4gICAgICAgIHggPj0gZW5kWzBdICYmIHkgPD0gZW5kWzFdO1xuICAgIH1cbiAgICByZXR1cm4gKHkgPiBzdGFydFsxXSAmJiB5IDwgZW5kWzFdKSB8fFxuICAgICAgICAoc3RhcnRbMV0gPT09IGVuZFsxXSAmJiB5ID09PSBzdGFydFsxXSAmJiB4ID49IHN0YXJ0WzBdICYmIHggPCBlbmRbMF0pIHx8XG4gICAgICAgIChzdGFydFsxXSA8IGVuZFsxXSAmJiB5ID09PSBlbmRbMV0gJiYgeCA8IGVuZFswXSkgfHxcbiAgICAgICAgKHN0YXJ0WzFdIDwgZW5kWzFdICYmIHkgPT09IHN0YXJ0WzFdICYmIHggPj0gc3RhcnRbMF0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhZFN0YXJ0KHRleHQ6IHN0cmluZywgcGFkQ2hhcjogc3RyaW5nLCBsZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XG4gIHdoaWxlICh0ZXh0Lmxlbmd0aCA8IGxlbmd0aCkge1xuICAgIHRleHQgPSBwYWRDaGFyICsgdGV4dDtcbiAgfVxuICByZXR1cm4gdGV4dDtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEZvbnRXZWlnaHQgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5cbmV4cG9ydCBjb25zdCBlbnVtIFdpZHRoQ2FjaGVTZXR0aW5ncyB7XG4gIC8qKiBzZW50aW5lbCBmb3IgdW5zZXQgdmFsdWVzIGluIGZsYXQgY2FjaGUgKi9cbiAgRkxBVF9VTlNFVCA9IC05OTk5LFxuICAvKiogc2l6ZSBvZiBmbGF0IGNhY2hlLCBzaXplLTEgZXF1YWxzIGhpZ2hlc3QgY29kZXBvaW50IGhhbmRsZWQgYnkgZmxhdCAqL1xuICBGTEFUX1NJWkUgPSAyNTYsXG4gIC8qKiBjaGFyIHJlcGVhdCBmb3IgbWVhc3VyaW5nICovXG4gIFJFUEVBVCA9IDMyXG59XG5cblxuY29uc3QgZW51bSBGb250VmFyaWFudCB7XG4gIFJFR1VMQVIgPSAwLFxuICBCT0xEID0gMSxcbiAgSVRBTElDID0gMixcbiAgQk9MRF9JVEFMSUMgPSAzXG59XG5cblxuZXhwb3J0IGNsYXNzIFdpZHRoQ2FjaGUgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIC8vIGZsYXQgY2FjaGUgZm9yIHJlZ3VsYXIgdmFyaWFudCB1cCB0byBDYWNoZVNldHRpbmdzLkZMQVRfU0laRVxuICAvLyBOT1RFOiB+NHggZmFzdGVyIGFjY2VzcyB0aGFuIGhvbGV5IChzZXJ2aW5nID4+ODAlIG9mIHRlcm1pbmFsIGNvbnRlbnQpXG4gIC8vICAgICAgIEl0IGhhcyBhIHNtYWxsIG1lbW9yeSBmb290cHJpbnQgKG9ubHkgMU1CIGZvciBmdWxsIEJNUCBjYWNoaW5nKSxcbiAgLy8gICAgICAgc3RpbGwgdGhlIHN3ZWV0IHNwb3QgaXMgbm90IHJlYWNoZWQgYmVmb3JlIHRvdWNoaW5nIDMyayBkaWZmZXJlbnQgY29kZXBvaW50cyxcbiAgLy8gICAgICAgdGh1cyB3ZSBzdG9yZSB0aGUgcmVtYWluaW5nIDw8MjAlIG9mIHRlcm1pbmFsIGRhdGEgaW4gYSBob2xleSBzdHJ1Y3R1cmUuXG4gIHByb3RlY3RlZCBfZmxhdCA9IG5ldyBGbG9hdDMyQXJyYXkoV2lkdGhDYWNoZVNldHRpbmdzLkZMQVRfU0laRSk7XG5cbiAgLy8gaG9sZXkgY2FjaGUgZm9yIGJvbGQsIGl0YWxpYyBhbmQgYm9sZCZpdGFsaWMgZm9yIGFueSBzdHJpbmdcbiAgLy8gRklYTUU6IGNhbiBncm93IHJlYWxseSBiaWcgb3ZlciB0aW1lICh+OC41IE1CIGZvciBmdWxsIEJNUCBjYWNoaW5nKSxcbiAgLy8gICAgICAgIHNvIGEgc2hhcmVkIEFQSSBhY3Jvc3MgdGVybWluYWxzIGlzIG5lZWRlZFxuICBwcm90ZWN0ZWQgX2hvbGV5OiBNYXA8c3RyaW5nLCBudW1iZXI+IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2ZvbnQgPSAnJztcbiAgcHJpdmF0ZSBfZm9udFNpemUgPSAwO1xuICBwcml2YXRlIF93ZWlnaHQ6IEZvbnRXZWlnaHQgPSAnbm9ybWFsJztcbiAgcHJpdmF0ZSBfd2VpZ2h0Qm9sZDogRm9udFdlaWdodCA9ICdib2xkJztcbiAgcHJpdmF0ZSBfY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSBfbWVhc3VyZUVsZW1lbnRzOiBIVE1MU3BhbkVsZW1lbnRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKF9kb2N1bWVudDogRG9jdW1lbnQsIF9oZWxwZXJDb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5fY29udGFpbmVyID0gX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd4dGVybS13aWR0aC1jYWNoZS1tZWFzdXJlLWNvbnRhaW5lcicpO1xuICAgIHRoaXMuX2NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAvLyBTUCBzaG91bGQgc3RhY2sgaW4gc3BhbnNcbiAgICB0aGlzLl9jb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9ICdwcmUnO1xuICAgIC8vIGF2b2lkIHVuZGVyY3V0cyBpbiBub24tbW9ub3NwYWNlIGZvbnRzIGZyb20ga2VybmluZ1xuICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5mb250S2VybmluZyA9ICdub25lJztcblxuICAgIGNvbnN0IHJlZ3VsYXIgPSBfZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHJlZ3VsYXIuY2xhc3NMaXN0LmFkZCgneHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnQnKTtcblxuICAgIGNvbnN0IGJvbGQgPSBfZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGJvbGQuY2xhc3NMaXN0LmFkZCgneHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnQnKTtcbiAgICBib2xkLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XG5cbiAgICBjb25zdCBpdGFsaWMgPSBfZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGl0YWxpYy5jbGFzc0xpc3QuYWRkKCd4dGVybS1jaGFyLW1lYXN1cmUtZWxlbWVudCcpO1xuICAgIGl0YWxpYy5zdHlsZS5mb250U3R5bGUgPSAnaXRhbGljJztcblxuICAgIGNvbnN0IGJvbGRJdGFsaWMgPSBfZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGJvbGRJdGFsaWMuY2xhc3NMaXN0LmFkZCgneHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnQnKTtcbiAgICBib2xkSXRhbGljLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XG4gICAgYm9sZEl0YWxpYy5zdHlsZS5mb250U3R5bGUgPSAnaXRhbGljJztcblxuICAgIC8vIE5PVEU6IG11c3QgYmUgaW4gb3JkZXIgb2YgRm9udFZhcmlhbnRcbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudHMgPSBbcmVndWxhciwgYm9sZCwgaXRhbGljLCBib2xkSXRhbGljXTtcbiAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQocmVndWxhcik7XG4gICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGJvbGQpO1xuICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChpdGFsaWMpO1xuICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChib2xkSXRhbGljKTtcblxuICAgIF9oZWxwZXJDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKTtcblxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbnRhaW5lci5yZW1vdmUoKTsgICAgICAgICAgIC8vIHJlbW92ZSBlbGVtZW50cyBmcm9tIERPTVxuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50cy5sZW5ndGggPSAwOyAgIC8vIHJlbGVhc2UgZWxlbWVudCByZWZzXG4gICAgdGhpcy5faG9sZXkgPSB1bmRlZmluZWQ7ICAgICAgICAgICAgLy8gZnJlZSBjYWNoZSBtZW1vcnkgdmlhIEdDXG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIHdpZHRoIGNhY2hlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZsYXQuZmlsbChXaWR0aENhY2hlU2V0dGluZ3MuRkxBVF9VTlNFVCk7XG4gICAgLy8gLmNsZWFyKCkgaGFzIHNvbWUgb3ZlcmhlYWQsIHJlLWFzc2lnbiBpbnN0ZWFkICg+MyB0aW1lcyBmYXN0ZXIpXG4gICAgdGhpcy5faG9sZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZm9udCBmb3IgbWVhc3VyaW5nLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBmb3IgYW55IGNoYW5nZXMgb24gZm9udCBzZXR0aW5ncy5cbiAgICogQWxzbyBjbGVhcnMgdGhlIGNhY2hlLlxuICAgKi9cbiAgcHVibGljIHNldEZvbnQoZm9udDogc3RyaW5nLCBmb250U2l6ZTogbnVtYmVyLCB3ZWlnaHQ6IEZvbnRXZWlnaHQsIHdlaWdodEJvbGQ6IEZvbnRXZWlnaHQpOiB2b2lkIHtcbiAgICAvLyBza2lwIGlmIG5vdGhpbmcgY2hhbmdlZFxuICAgIGlmIChmb250ID09PSB0aGlzLl9mb250XG4gICAgICAmJiBmb250U2l6ZSA9PT0gdGhpcy5fZm9udFNpemVcbiAgICAgICYmIHdlaWdodCA9PT0gdGhpcy5fd2VpZ2h0XG4gICAgICAmJiB3ZWlnaHRCb2xkID09PSB0aGlzLl93ZWlnaHRCb2xkXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZm9udCA9IGZvbnQ7XG4gICAgdGhpcy5fZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICB0aGlzLl93ZWlnaHQgPSB3ZWlnaHQ7XG4gICAgdGhpcy5fd2VpZ2h0Qm9sZCA9IHdlaWdodEJvbGQ7XG5cbiAgICB0aGlzLl9jb250YWluZXIuc3R5bGUuZm9udEZhbWlseSA9IHRoaXMuX2ZvbnQ7XG4gICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLmZvbnRTaXplID0gYCR7dGhpcy5fZm9udFNpemV9cHhgO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50c1tGb250VmFyaWFudC5SRUdVTEFSXS5zdHlsZS5mb250V2VpZ2h0ID0gYCR7d2VpZ2h0fWA7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnRzW0ZvbnRWYXJpYW50LkJPTERdLnN0eWxlLmZvbnRXZWlnaHQgPSBgJHt3ZWlnaHRCb2xkfWA7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnRzW0ZvbnRWYXJpYW50LklUQUxJQ10uc3R5bGUuZm9udFdlaWdodCA9IGAke3dlaWdodH1gO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50c1tGb250VmFyaWFudC5CT0xEX0lUQUxJQ10uc3R5bGUuZm9udFdlaWdodCA9IGAke3dlaWdodEJvbGR9YDtcblxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHJlbmRlciB3aWR0aCBmb3IgY2VsbCBjb250ZW50IGBjYCB3aXRoIGN1cnJlbnQgZm9udCBzZXR0aW5ncy5cbiAgICogYHZhcmlhbnRgIGRlbm90ZXMgdGhlIGZvbnQgdmFyaWFudCB0byBiZSB1c2VkLlxuICAgKi9cbiAgcHVibGljIGdldChjOiBzdHJpbmcsIGJvbGQ6IGJvb2xlYW4gfCBudW1iZXIsIGl0YWxpYzogYm9vbGVhbiB8IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGNwID0gMDtcbiAgICBpZiAoIWJvbGQgJiYgIWl0YWxpYyAmJiBjLmxlbmd0aCA9PT0gMSAmJiAoY3AgPSBjLmNoYXJDb2RlQXQoMCkpIDwgV2lkdGhDYWNoZVNldHRpbmdzLkZMQVRfU0laRSkge1xuICAgICAgaWYgKHRoaXMuX2ZsYXRbY3BdICE9PSBXaWR0aENhY2hlU2V0dGluZ3MuRkxBVF9VTlNFVCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmxhdFtjcF07XG4gICAgICB9XG4gICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX21lYXN1cmUoYywgMCk7XG4gICAgICBpZiAod2lkdGggPiAwKSB7XG4gICAgICAgIHRoaXMuX2ZsYXRbY3BdID0gd2lkdGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2lkdGg7XG4gICAgfVxuICAgIGxldCBrZXkgPSBjO1xuICAgIGlmIChib2xkKSBrZXkgKz0gJ0InO1xuICAgIGlmIChpdGFsaWMpIGtleSArPSAnSSc7XG4gICAgbGV0IHdpZHRoID0gdGhpcy5faG9sZXkhLmdldChrZXkpO1xuICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgdmFyaWFudCA9IDA7XG4gICAgICBpZiAoYm9sZCkgdmFyaWFudCB8PSBGb250VmFyaWFudC5CT0xEO1xuICAgICAgaWYgKGl0YWxpYykgdmFyaWFudCB8PSBGb250VmFyaWFudC5JVEFMSUM7XG4gICAgICB3aWR0aCA9IHRoaXMuX21lYXN1cmUoYywgdmFyaWFudCk7XG4gICAgICBpZiAod2lkdGggPiAwKSB7XG4gICAgICAgIHRoaXMuX2hvbGV5IS5zZXQoa2V5LCB3aWR0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3aWR0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbWVhc3VyZShjOiBzdHJpbmcsIHZhcmlhbnQ6IEZvbnRWYXJpYW50KTogbnVtYmVyIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuX21lYXN1cmVFbGVtZW50c1t2YXJpYW50XTtcbiAgICBlbC50ZXh0Q29udGVudCA9IGMucmVwZWF0KFdpZHRoQ2FjaGVTZXR0aW5ncy5SRVBFQVQpO1xuICAgIHJldHVybiBlbC5vZmZzZXRXaWR0aCAvIFdpZHRoQ2FjaGVTZXR0aW5ncy5SRVBFQVQ7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGlzRmlyZWZveCwgaXNMZWdhY3lFZGdlIH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcblxuZXhwb3J0IGNvbnN0IElOVkVSVEVEX0RFRkFVTFRfQ09MT1IgPSAyNTc7XG5cbmV4cG9ydCBjb25zdCBESU1fT1BBQ0lUWSA9IDAuNTtcbi8vIFRoZSB0ZXh0IGJhc2VsaW5lIGlzIHNldCBjb25kaXRpb25hbGx5IGJ5IGJyb3dzZXIuIFVzaW5nICdpZGVvZ3JhcGhpYycgZm9yIEZpcmVmb3ggb3IgTGVnYWN5IEVkZ2Vcbi8vIHdvdWxkIHJlc3VsdCBpbiB0cnVuY2F0ZWQgdGV4dCAoSXNzdWUgMzM1MykuIFVzaW5nICdib3R0b20nIGZvciBDaHJvbWUgd291bGQgcmVzdWx0IGluIHNsaWdodGx5XG4vLyB1bmFsaWduZWQgUG93ZXJsaW5lIGZvbnRzIChQUiAzMzU2I2lzc3VlY29tbWVudC04NTA5MjgxNzkpLlxuZXhwb3J0IGNvbnN0IFRFWFRfQkFTRUxJTkU6IENhbnZhc1RleHRCYXNlbGluZSA9IGlzRmlyZWZveCB8fCBpc0xlZ2FjeUVkZ2UgPyAnYm90dG9tJyA6ICdpZGVvZ3JhcGhpYyc7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGltZW5zaW9ucywgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0lmRmFsc3k8VD4odmFsdWU6IFQgfCB1bmRlZmluZWQgfCBudWxsKTogVCB7XG4gIGlmICghdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbHVlIG11c3Qgbm90IGJlIGZhbHN5Jyk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAvLyBPbmx5IHJldHVybiB0cnVlIGZvciBQb3dlcmxpbmUgc3ltYm9scyB3aGljaCByZXF1aXJlXG4gIC8vIGRpZmZlcmVudCBwYWRkaW5nIGFuZCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBtaW5pbXVtIGNvbnRyYXN0XG4gIC8vIHJhdGlvIHN0YW5kYXJkc1xuICByZXR1cm4gMHhFMEE0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPD0gMHhFMEQ2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIDB4RTBCMCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDw9IDB4RTBCNztcbn1cblxuZnVuY3Rpb24gaXNOZXJkRm9udEdseXBoKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAweEUwMDAgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweEY4RkY7XG59XG5cbmZ1bmN0aW9uIGlzQm94T3JCbG9ja0dseXBoKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAweDI1MDAgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweDI1OUY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Vtb2ppKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29kZXBvaW50ID49IDB4MUY2MDAgJiYgY29kZXBvaW50IDw9IDB4MUY2NEYgfHwgLy8gRW1vdGljb25zXG4gICAgY29kZXBvaW50ID49IDB4MUYzMDAgJiYgY29kZXBvaW50IDw9IDB4MUY1RkYgfHwgLy8gTWlzYyBTeW1ib2xzIGFuZCBQaWN0b2dyYXBoc1xuICAgIGNvZGVwb2ludCA+PSAweDFGNjgwICYmIGNvZGVwb2ludCA8PSAweDFGNkZGIHx8IC8vIFRyYW5zcG9ydCBhbmQgTWFwXG4gICAgY29kZXBvaW50ID49IDB4MjYwMCAgJiYgY29kZXBvaW50IDw9IDB4MjZGRiAgfHwgLy8gTWlzYyBzeW1ib2xzXG4gICAgY29kZXBvaW50ID49IDB4MjcwMCAgJiYgY29kZXBvaW50IDw9IDB4MjdCRiAgfHwgLy8gRGluZ2JhdHNcbiAgICBjb2RlcG9pbnQgPj0gMHhGRTAwICAmJiBjb2RlcG9pbnQgPD0gMHhGRTBGICB8fCAvLyBWYXJpYXRpb24gU2VsZWN0b3JzXG4gICAgY29kZXBvaW50ID49IDB4MUY5MDAgJiYgY29kZXBvaW50IDw9IDB4MUY5RkYgfHwgLy8gU3VwcGxlbWVudGFsIFN5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzXG4gICAgY29kZXBvaW50ID49IDB4MUYxRTYgJiYgY29kZXBvaW50IDw9IDB4MUYxRkZcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93UmVzY2FsaW5nKGNvZGVwb2ludDogbnVtYmVyIHwgdW5kZWZpbmVkLCB3aWR0aDogbnVtYmVyLCBnbHlwaFNpemVYOiBudW1iZXIsIGRldmljZUNlbGxXaWR0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgLy8gSXMgc2luZ2xlIGNlbGwgd2lkdGhcbiAgICB3aWR0aCA9PT0gMSAmJlxuICAgIC8vIEdseXBoIGV4Y2VlZHMgY2VsbCBib3VuZHMsIGFkZCA1MCUgdG8gYXZvaWQgaHVydGluZyByZWFkYWJpbGl0eSBieSByZXNjYWxpbmcgZ2x5cGhzIHRoYXRcbiAgICAvLyBiYXJlbHkgb3ZlcmxhcFxuICAgIGdseXBoU2l6ZVggPiBNYXRoLmNlaWwoZGV2aWNlQ2VsbFdpZHRoICogMS41KSAmJlxuICAgIC8vIE5ldmVyIHJlc2NhbGUgYXNjaWlcbiAgICBjb2RlcG9pbnQgIT09IHVuZGVmaW5lZCAmJiBjb2RlcG9pbnQgPiAweEZGICYmXG4gICAgLy8gTmV2ZXIgcmVzY2FsZSBlbW9qaVxuICAgICFpc0Vtb2ppKGNvZGVwb2ludCkgJiZcbiAgICAvLyBOZXZlciByZXNjYWxlIHBvd2VybGluZSBvciBuZXJkIGZvbnRzXG4gICAgIWlzUG93ZXJsaW5lR2x5cGgoY29kZXBvaW50KSAmJiAhaXNOZXJkRm9udEdseXBoKGNvZGVwb2ludClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvcihjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQpIHx8IGlzQm94T3JCbG9ja0dseXBoKGNvZGVwb2ludCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW5kZXJEaW1lbnNpb25zKCk6IElSZW5kZXJEaW1lbnNpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBjc3M6IHtcbiAgICAgIGNhbnZhczogY3JlYXRlRGltZW5zaW9uKCksXG4gICAgICBjZWxsOiBjcmVhdGVEaW1lbnNpb24oKVxuICAgIH0sXG4gICAgZGV2aWNlOiB7XG4gICAgICBjYW52YXM6IGNyZWF0ZURpbWVuc2lvbigpLFxuICAgICAgY2VsbDogY3JlYXRlRGltZW5zaW9uKCksXG4gICAgICBjaGFyOiB7XG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogMFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGltZW5zaW9uKCk6IElEaW1lbnNpb25zIHtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVOZXh0VmFyaWFudE9mZnNldChjZWxsV2lkdGg6IG51bWJlciwgbGluZVdpZHRoOiBudW1iZXIsIGN1cnJlbnRPZmZzZXQ6IG51bWJlciA9IDApOiBudW1iZXIge1xuICByZXR1cm4gKGNlbGxXaWR0aCAtIChNYXRoLnJvdW5kKGxpbmVXaWR0aCkgKiAyIC0gY3VycmVudE9mZnNldCkpICUgKE1hdGgucm91bmQobGluZVdpZHRoKSAqIDIpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSVRlcm1pbmFsIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJU2VsZWN0aW9uUmVuZGVyTW9kZWwgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5cbmNsYXNzIFNlbGVjdGlvblJlbmRlck1vZGVsIGltcGxlbWVudHMgSVNlbGVjdGlvblJlbmRlck1vZGVsIHtcbiAgcHVibGljIGhhc1NlbGVjdGlvbiE6IGJvb2xlYW47XG4gIHB1YmxpYyBjb2x1bW5TZWxlY3RNb2RlITogYm9vbGVhbjtcbiAgcHVibGljIHZpZXdwb3J0U3RhcnRSb3chOiBudW1iZXI7XG4gIHB1YmxpYyB2aWV3cG9ydEVuZFJvdyE6IG51bWJlcjtcbiAgcHVibGljIHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3chOiBudW1iZXI7XG4gIHB1YmxpYyB2aWV3cG9ydENhcHBlZEVuZFJvdyE6IG51bWJlcjtcbiAgcHVibGljIHN0YXJ0Q29sITogbnVtYmVyO1xuICBwdWJsaWMgZW5kQ29sITogbnVtYmVyO1xuICBwdWJsaWMgc2VsZWN0aW9uU3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBzZWxlY3Rpb25FbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuaGFzU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5jb2x1bW5TZWxlY3RNb2RlID0gZmFsc2U7XG4gICAgdGhpcy52aWV3cG9ydFN0YXJ0Um93ID0gMDtcbiAgICB0aGlzLnZpZXdwb3J0RW5kUm93ID0gMDtcbiAgICB0aGlzLnZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPSAwO1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRFbmRSb3cgPSAwO1xuICAgIHRoaXMuc3RhcnRDb2wgPSAwO1xuICAgIHRoaXMuZW5kQ29sID0gMDtcbiAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2VsZWN0aW9uRW5kID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZSh0ZXJtaW5hbDogSVRlcm1pbmFsLCBzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBlbmQ7XG4gICAgLy8gU2VsZWN0aW9uIGRvZXMgbm90IGV4aXN0XG4gICAgaWYgKCFzdGFydCB8fCAhZW5kIHx8IChzdGFydFswXSA9PT0gZW5kWzBdICYmIHN0YXJ0WzFdID09PSBlbmRbMV0pKSB7XG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVHJhbnNsYXRlIGZyb20gYnVmZmVyIHBvc2l0aW9uIHRvIHZpZXdwb3J0IHBvc2l0aW9uXG4gICAgY29uc3Qgdmlld3BvcnRZID0gdGVybWluYWwuYnVmZmVycy5hY3RpdmUueWRpc3A7XG4gICAgY29uc3Qgdmlld3BvcnRTdGFydFJvdyA9IHN0YXJ0WzFdIC0gdmlld3BvcnRZO1xuICAgIGNvbnN0IHZpZXdwb3J0RW5kUm93ID0gZW5kWzFdIC0gdmlld3BvcnRZO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPSBNYXRoLm1heCh2aWV3cG9ydFN0YXJ0Um93LCAwKTtcbiAgICBjb25zdCB2aWV3cG9ydENhcHBlZEVuZFJvdyA9IE1hdGgubWluKHZpZXdwb3J0RW5kUm93LCB0ZXJtaW5hbC5yb3dzIC0gMSk7XG5cbiAgICAvLyBObyBuZWVkIHRvIGRyYXcgdGhlIHNlbGVjdGlvblxuICAgIGlmICh2aWV3cG9ydENhcHBlZFN0YXJ0Um93ID49IHRlcm1pbmFsLnJvd3MgfHwgdmlld3BvcnRDYXBwZWRFbmRSb3cgPCAwKSB7XG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNTZWxlY3Rpb24gPSB0cnVlO1xuICAgIHRoaXMuY29sdW1uU2VsZWN0TW9kZSA9IGNvbHVtblNlbGVjdE1vZGU7XG4gICAgdGhpcy52aWV3cG9ydFN0YXJ0Um93ID0gdmlld3BvcnRTdGFydFJvdztcbiAgICB0aGlzLnZpZXdwb3J0RW5kUm93ID0gdmlld3BvcnRFbmRSb3c7XG4gICAgdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93ID0gdmlld3BvcnRDYXBwZWRTdGFydFJvdztcbiAgICB0aGlzLnZpZXdwb3J0Q2FwcGVkRW5kUm93ID0gdmlld3BvcnRDYXBwZWRFbmRSb3c7XG4gICAgdGhpcy5zdGFydENvbCA9IHN0YXJ0WzBdO1xuICAgIHRoaXMuZW5kQ29sID0gZW5kWzBdO1xuICB9XG5cbiAgcHVibGljIGlzQ2VsbFNlbGVjdGVkKHRlcm1pbmFsOiBUZXJtaW5hbCwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHkgLT0gdGVybWluYWwuYnVmZmVyLmFjdGl2ZS52aWV3cG9ydFk7XG4gICAgaWYgKHRoaXMuY29sdW1uU2VsZWN0TW9kZSkge1xuICAgICAgaWYgKHRoaXMuc3RhcnRDb2wgPD0gdGhpcy5lbmRDb2wpIHtcbiAgICAgICAgcmV0dXJuIHggPj0gdGhpcy5zdGFydENvbCAmJiB5ID49IHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyAmJlxuICAgICAgICAgIHggPCB0aGlzLmVuZENvbCAmJiB5IDw9IHRoaXMudmlld3BvcnRDYXBwZWRFbmRSb3c7XG4gICAgICB9XG4gICAgICByZXR1cm4geCA8IHRoaXMuc3RhcnRDb2wgJiYgeSA+PSB0aGlzLnZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgJiZcbiAgICAgICAgeCA+PSB0aGlzLmVuZENvbCAmJiB5IDw9IHRoaXMudmlld3BvcnRDYXBwZWRFbmRSb3c7XG4gICAgfVxuICAgIHJldHVybiAoeSA+IHRoaXMudmlld3BvcnRTdGFydFJvdyAmJiB5IDwgdGhpcy52aWV3cG9ydEVuZFJvdykgfHxcbiAgICAgICh0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPT09IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeSA9PT0gdGhpcy52aWV3cG9ydFN0YXJ0Um93ICYmIHggPj0gdGhpcy5zdGFydENvbCAmJiB4IDwgdGhpcy5lbmRDb2wpIHx8XG4gICAgICAodGhpcy52aWV3cG9ydFN0YXJ0Um93IDwgdGhpcy52aWV3cG9ydEVuZFJvdyAmJiB5ID09PSB0aGlzLnZpZXdwb3J0RW5kUm93ICYmIHggPCB0aGlzLmVuZENvbCkgfHxcbiAgICAgICh0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPCB0aGlzLnZpZXdwb3J0RW5kUm93ICYmIHkgPT09IHRoaXMudmlld3BvcnRTdGFydFJvdyAmJiB4ID49IHRoaXMuc3RhcnRDb2wpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3Rpb25SZW5kZXJNb2RlbCgpOiBJU2VsZWN0aW9uUmVuZGVyTW9kZWwge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvblJlbmRlck1vZGVsKCk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHNlbGVjdGlvbiB3aXRoaW4gdGhlIGJ1ZmZlci4gVGhpcyBtb2RlbCBvbmx5IGNhcmVzIGFib3V0IGNvbHVtblxuICogYW5kIHJvdyBjb29yZGluYXRlcywgbm90IHdpZGUgY2hhcmFjdGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgc2VsZWN0IGFsbCBpcyBjdXJyZW50bHkgYWN0aXZlLlxuICAgKi9cbiAgcHVibGljIGlzU2VsZWN0QWxsQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbWFsIGxlbmd0aCBvZiB0aGUgc2VsZWN0aW9uIGZyb20gdGhlIHN0YXJ0IHBvc2l0aW9uLiBXaGVuIGRvdWJsZVxuICAgKiBjbGlja2luZyBvbiBhIHdvcmQsIHRoZSB3b3JkIHdpbGwgYmUgc2VsZWN0ZWQgd2hpY2ggbWFrZXMgdGhlIHNlbGVjdGlvblxuICAgKiBzdGFydCBhdCB0aGUgc3RhcnQgb2YgdGhlIHdvcmQgYW5kIG1ha2VzIHRoaXMgdmFyaWFibGUgdGhlIGxlbmd0aC5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3Rpb25TdGFydExlbmd0aDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogVGhlIFt4LCB5XSBwb3NpdGlvbiB0aGUgc2VsZWN0aW9uIHN0YXJ0cyBhdC5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3Rpb25TdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIFt4LCB5XSBwb3NpdGlvbiB0aGUgc2VsZWN0aW9uIGVuZHMgYXQuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0aW9uRW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlXG4gICkge1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzU2VsZWN0QWxsQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydExlbmd0aCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZpbmFsIHNlbGVjdGlvbiBzdGFydCwgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBzZWxlY3QgYWxsLlxuICAgKi9cbiAgcHVibGljIGdldCBmaW5hbFNlbGVjdGlvblN0YXJ0KCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0QWxsQWN0aXZlKSB7XG4gICAgICByZXR1cm4gWzAsIDBdO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25FbmQgfHwgIXRoaXMuc2VsZWN0aW9uU3RhcnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblN0YXJ0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFyZVNlbGVjdGlvblZhbHVlc1JldmVyc2VkKCkgPyB0aGlzLnNlbGVjdGlvbkVuZCA6IHRoaXMuc2VsZWN0aW9uU3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZpbmFsIHNlbGVjdGlvbiBlbmQsIHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gc2VsZWN0IGFsbCwgZG91YmxlIGNsaWNrXG4gICAqIHdvcmQgc2VsZWN0aW9uIGFuZCB0cmlwbGUgY2xpY2sgbGluZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpbmFsU2VsZWN0aW9uRW5kKCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0QWxsQWN0aXZlKSB7XG4gICAgICByZXR1cm4gW3RoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UgKyB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxXTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0aW9uU3RhcnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSBzZWxlY3Rpb24gc3RhcnQgKyBsZW5ndGggaWYgdGhlIGVuZCBkb2Vzbid0IGV4aXN0IG9yIHRoZXkncmUgcmV2ZXJzZWRcbiAgICBpZiAoIXRoaXMuc2VsZWN0aW9uRW5kIHx8IHRoaXMuYXJlU2VsZWN0aW9uVmFsdWVzUmV2ZXJzZWQoKSkge1xuICAgICAgY29uc3Qgc3RhcnRQbHVzTGVuZ3RoID0gdGhpcy5zZWxlY3Rpb25TdGFydFswXSArIHRoaXMuc2VsZWN0aW9uU3RhcnRMZW5ndGg7XG4gICAgICBpZiAoc3RhcnRQbHVzTGVuZ3RoID4gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgdHJhaWxpbmcgRU9MIGlzbid0IGluY2x1ZGVkIHdoZW4gdGhlIHNlbGVjdGlvbiBlbmRzIG9uIHRoZSByaWdodCBlZGdlXG4gICAgICAgIGlmIChzdGFydFBsdXNMZW5ndGggJSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gW3RoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5zZWxlY3Rpb25TdGFydFsxXSArIE1hdGguZmxvb3Ioc3RhcnRQbHVzTGVuZ3RoIC8gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbc3RhcnRQbHVzTGVuZ3RoICUgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCB0aGlzLnNlbGVjdGlvblN0YXJ0WzFdICsgTWF0aC5mbG9vcihzdGFydFBsdXNMZW5ndGggLyB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc3RhcnRQbHVzTGVuZ3RoLCB0aGlzLnNlbGVjdGlvblN0YXJ0WzFdXTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIHRoZSB3b3JkL2xpbmUgaXMgc2VsZWN0ZWQgYWZ0ZXIgYSBkb3VibGUvdHJpcGxlIGNsaWNrXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnRMZW5ndGgpIHtcbiAgICAgIC8vIFNlbGVjdCB0aGUgbGFyZ2VyIG9mIHRoZSB0d28gd2hlbiBzdGFydCBhbmQgZW5kIGFyZSBvbiB0aGUgc2FtZSBsaW5lXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25FbmRbMV0gPT09IHRoaXMuc2VsZWN0aW9uU3RhcnRbMV0pIHtcbiAgICAgICAgLy8gS2VlcCB0aGUgd2hvbGUgd3JhcHBlZCB3b3JkL2xpbmUgc2VsZWN0ZWQgaWYgdGhlIGNvbnRlbnQgd3JhcHMgbXVsdGlwbGUgbGluZXNcbiAgICAgICAgY29uc3Qgc3RhcnRQbHVzTGVuZ3RoID0gdGhpcy5zZWxlY3Rpb25TdGFydFswXSArIHRoaXMuc2VsZWN0aW9uU3RhcnRMZW5ndGg7XG4gICAgICAgIGlmIChzdGFydFBsdXNMZW5ndGggPiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpIHtcbiAgICAgICAgICByZXR1cm4gW3N0YXJ0UGx1c0xlbmd0aCAlIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5zZWxlY3Rpb25TdGFydFsxXSArIE1hdGguZmxvb3Ioc3RhcnRQbHVzTGVuZ3RoIC8gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtNYXRoLm1heChzdGFydFBsdXNMZW5ndGgsIHRoaXMuc2VsZWN0aW9uRW5kWzBdKSwgdGhpcy5zZWxlY3Rpb25FbmRbMV1dO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25FbmQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gc3RhcnQgYW5kIGVuZCBhcmUgcmV2ZXJzZWQuXG4gICAqL1xuICBwdWJsaWMgYXJlU2VsZWN0aW9uVmFsdWVzUmV2ZXJzZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnNlbGVjdGlvblN0YXJ0O1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuc2VsZWN0aW9uRW5kO1xuICAgIGlmICghc3RhcnQgfHwgIWVuZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnRbMV0gPiBlbmRbMV0gfHwgKHN0YXJ0WzFdID09PSBlbmRbMV0gJiYgc3RhcnRbMF0gPiBlbmRbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgYnVmZmVyIGJlaW5nIHRyaW1tZWQsIGFkanVzdCB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgdGhlIGJ1ZmZlciBpcyBiZWluZyB0cmltbWVkLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGEgcmVmcmVzaCBpcyBuZWNlc3NhcnkuXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlVHJpbShhbW91bnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIC8vIEFkanVzdCB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSB0cmltbWVkIGFtb3VudC5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25TdGFydCkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydFsxXSAtPSBhbW91bnQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkVuZCkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25FbmRbMV0gLT0gYW1vdW50O1xuICAgIH1cblxuICAgIC8vIFRoZSBzZWxlY3Rpb24gaGFzIG1vdmVkIG9mZiB0aGUgYnVmZmVyLCBjbGVhciBpdC5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25FbmQgJiYgdGhpcy5zZWxlY3Rpb25FbmRbMV0gPCAwKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIHN0YXJ0IGlzIHRyaW1tZWQsIGVuc3VyZSB0aGUgc3RhcnQgY29sdW1uIGlzIDAuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnQgJiYgdGhpcy5zZWxlY3Rpb25TdGFydFsxXSA8IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRbMV0gPSAwO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IElDaGFyU2l6ZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcblxuZXhwb3J0IGNsYXNzIENoYXJTaXplU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJQ2hhclNpemVTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyB3aWR0aDogbnVtYmVyID0gMDtcbiAgcHVibGljIGhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbWVhc3VyZVN0cmF0ZWd5OiBJTWVhc3VyZVN0cmF0ZWd5O1xuXG4gIHB1YmxpYyBnZXQgaGFzVmFsaWRTaXplKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy53aWR0aCA+IDAgJiYgdGhpcy5oZWlnaHQgPiAwOyB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFyU2l6ZUNoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhclNpemVDaGFuZ2UgPSB0aGlzLl9vbkNoYXJTaXplQ2hhbmdlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fbWVhc3VyZVN0cmF0ZWd5ID0gdGhpcy5yZWdpc3RlcihuZXcgVGV4dE1ldHJpY3NNZWFzdXJlU3RyYXRlZ3kodGhpcy5fb3B0aW9uc1NlcnZpY2UpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuX21lYXN1cmVTdHJhdGVneSA9IHRoaXMucmVnaXN0ZXIobmV3IERvbU1lYXN1cmVTdHJhdGVneShkb2N1bWVudCwgcGFyZW50RWxlbWVudCwgdGhpcy5fb3B0aW9uc1NlcnZpY2UpKTtcbiAgICB9XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vbk11bHRpcGxlT3B0aW9uQ2hhbmdlKFsnZm9udEZhbWlseScsICdmb250U2l6ZSddLCAoKSA9PiB0aGlzLm1lYXN1cmUoKSkpO1xuICB9XG5cbiAgcHVibGljIG1lYXN1cmUoKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fbWVhc3VyZVN0cmF0ZWd5Lm1lYXN1cmUoKTtcbiAgICBpZiAocmVzdWx0LndpZHRoICE9PSB0aGlzLndpZHRoIHx8IHJlc3VsdC5oZWlnaHQgIT09IHRoaXMuaGVpZ2h0KSB7XG4gICAgICB0aGlzLndpZHRoID0gcmVzdWx0LndpZHRoO1xuICAgICAgdGhpcy5oZWlnaHQgPSByZXN1bHQuaGVpZ2h0O1xuICAgICAgdGhpcy5fb25DaGFyU2l6ZUNoYW5nZS5maXJlKCk7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBJTWVhc3VyZVN0cmF0ZWd5IHtcbiAgbWVhc3VyZSgpOiBSZWFkb25seTxJTWVhc3VyZVJlc3VsdD47XG59XG5cbmludGVyZmFjZSBJTWVhc3VyZVJlc3VsdCB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG5jb25zdCBlbnVtIERvbU1lYXN1cmVTdHJhdGVneUNvbnN0YW50cyB7XG4gIFJFUEVBVCA9IDMyXG59XG5cbmFic3RyYWN0IGNsYXNzIEJhc2VNZWFzdXJlU3RhdGVneSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJTWVhc3VyZVN0cmF0ZWd5IHtcbiAgcHJvdGVjdGVkIF9yZXN1bHQ6IElNZWFzdXJlUmVzdWx0ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG5cbiAgcHJvdGVjdGVkIF92YWxpZGF0ZUFuZFNldCh3aWR0aDogbnVtYmVyIHwgdW5kZWZpbmVkLCBoZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIElmIHZhbHVlcyBhcmUgMCB0aGVuIHRoZSBlbGVtZW50IGlzIGxpa2VseSBjdXJyZW50bHkgZGlzcGxheTpub25lLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZFxuICAgIC8vIHJldGFpbiB0aGUgcHJldmlvdXMgdmFsdWUuXG4gICAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQgJiYgd2lkdGggPiAwICYmIGhlaWdodCAhPT0gdW5kZWZpbmVkICYmIGhlaWdodCA+IDApIHtcbiAgICAgIHRoaXMuX3Jlc3VsdC53aWR0aCA9IHdpZHRoO1xuICAgICAgdGhpcy5fcmVzdWx0LmhlaWdodCA9IGhlaWdodDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgbWVhc3VyZSgpOiBSZWFkb25seTxJTWVhc3VyZVJlc3VsdD47XG59XG5cbmNsYXNzIERvbU1lYXN1cmVTdHJhdGVneSBleHRlbmRzIEJhc2VNZWFzdXJlU3RhdGVneSB7XG4gIHByaXZhdGUgX21lYXN1cmVFbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcHJpdmF0ZSBfcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgcHJpdmF0ZSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWNoYXItbWVhc3VyZS1lbGVtZW50Jyk7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVycucmVwZWF0KERvbU1lYXN1cmVTdHJhdGVneUNvbnN0YW50cy5SRVBFQVQpO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LnN0eWxlLndoaXRlU3BhY2UgPSAncHJlJztcbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC5zdHlsZS5mb250S2VybmluZyA9ICdub25lJztcbiAgICB0aGlzLl9wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX21lYXN1cmVFbGVtZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBtZWFzdXJlKCk6IFJlYWRvbmx5PElNZWFzdXJlUmVzdWx0PiB7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnQuc3R5bGUuZm9udEZhbWlseSA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udEZhbWlseTtcbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC5zdHlsZS5mb250U2l6ZSA9IGAke3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFNpemV9cHhgO1xuXG4gICAgLy8gTm90ZSB0aGF0IHRoaXMgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyBsYXlvdXRcbiAgICB0aGlzLl92YWxpZGF0ZUFuZFNldChOdW1iZXIodGhpcy5fbWVhc3VyZUVsZW1lbnQub2Zmc2V0V2lkdGgpIC8gRG9tTWVhc3VyZVN0cmF0ZWd5Q29uc3RhbnRzLlJFUEVBVCwgTnVtYmVyKHRoaXMuX21lYXN1cmVFbGVtZW50Lm9mZnNldEhlaWdodCkpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3Jlc3VsdDtcbiAgfVxufVxuXG5jbGFzcyBUZXh0TWV0cmljc01lYXN1cmVTdHJhdGVneSBleHRlbmRzIEJhc2VNZWFzdXJlU3RhdGVneSB7XG4gIHByaXZhdGUgX2NhbnZhczogT2Zmc2NyZWVuQ2FudmFzO1xuICBwcml2YXRlIF9jdHg6IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIGFueSByZXF1aXJlZCBBUEkgaXMgbm90IHN1cHBvcnRlZFxuICAgIHRoaXMuX2NhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoMTAwLCAxMDApO1xuICAgIHRoaXMuX2N0eCA9IHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpITtcbiAgICBjb25zdCBhID0gdGhpcy5fY3R4Lm1lYXN1cmVUZXh0KCdXJyk7XG4gICAgaWYgKCEoJ3dpZHRoJyBpbiBhICYmICdmb250Qm91bmRpbmdCb3hBc2NlbnQnIGluIGEgJiYgJ2ZvbnRCb3VuZGluZ0JveERlc2NlbnQnIGluIGEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIGZvbnQgbWV0cmljcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1lYXN1cmUoKTogUmVhZG9ubHk8SU1lYXN1cmVSZXN1bHQ+IHtcbiAgICB0aGlzLl9jdHguZm9udCA9IGAke3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFNpemV9cHggJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRGYW1pbHl9YDtcbiAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5fY3R4Lm1lYXN1cmVUZXh0KCdXJyk7XG4gICAgdGhpcy5fdmFsaWRhdGVBbmRTZXQobWV0cmljcy53aWR0aCwgbWV0cmljcy5mb250Qm91bmRpbmdCb3hBc2NlbnQgKyBtZXRyaWNzLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpO1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHQ7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElCdWZmZXJMaW5lLCBJQ2VsbERhdGEsIENoYXJEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IElDaGFyYWN0ZXJKb2luZXIgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuaW1wb3J0IHsgV0hJVEVTUEFDRV9DRUxMX0NIQVIsIENvbnRlbnQgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNoYXJhY3RlckpvaW5lclNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGNsYXNzIEpvaW5lZENlbGxEYXRhIGV4dGVuZHMgQXR0cmlidXRlRGF0YSBpbXBsZW1lbnRzIElDZWxsRGF0YSB7XG4gIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XG4gIC8vIC5jb250ZW50IGNhcnJpZXMgbm8gbWVhbmluZyBmb3Igam9pbmVkIENlbGxEYXRhLCBzaW1wbHkgbnVsbGlmeSBpdFxuICAvLyB0aHVzIHdlIGhhdmUgdG8gb3ZlcmxvYWQgYWxsIG90aGVyIC5jb250ZW50IGFjY2Vzc29yc1xuICBwdWJsaWMgY29udGVudDogbnVtYmVyID0gMDtcbiAgcHVibGljIGZnOiBudW1iZXI7XG4gIHB1YmxpYyBiZzogbnVtYmVyO1xuICBwdWJsaWMgY29tYmluZWREYXRhOiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihmaXJzdENlbGw6IElDZWxsRGF0YSwgY2hhcnM6IHN0cmluZywgd2lkdGg6IG51bWJlcikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5mZyA9IGZpcnN0Q2VsbC5mZztcbiAgICB0aGlzLmJnID0gZmlyc3RDZWxsLmJnO1xuICAgIHRoaXMuY29tYmluZWREYXRhID0gY2hhcnM7XG4gICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcbiAgfVxuXG4gIHB1YmxpYyBpc0NvbWJpbmVkKCk6IG51bWJlciB7XG4gICAgLy8gYWx3YXlzIG1hcmsgam9pbmVkIGNlbGwgZGF0YSBhcyBjb21iaW5lZFxuICAgIHJldHVybiBDb250ZW50LklTX0NPTUJJTkVEX01BU0s7XG4gIH1cblxuICBwdWJsaWMgZ2V0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2hhcnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21iaW5lZERhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29kZSgpOiBudW1iZXIge1xuICAgIC8vIGNvZGUgYWx3YXlzIGdldHMgdGhlIGhpZ2hlc3QgcG9zc2libGUgZmFrZSBjb2RlcG9pbnQgKHJlYWQgYXMgLTEpXG4gICAgLy8gdGhpcyBpcyBuZWVkZWQgYXMgY29kZSBpcyB1c2VkIGJ5IGNhY2hlcyBhcyBpZGVudGlmaWVyXG4gICAgcmV0dXJuIDB4MUZGRkZGO1xuICB9XG5cbiAgcHVibGljIHNldEZyb21DaGFyRGF0YSh2YWx1ZTogQ2hhckRhdGEpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgcHVibGljIGdldEFzQ2hhckRhdGEoKTogQ2hhckRhdGEge1xuICAgIHJldHVybiBbdGhpcy5mZywgdGhpcy5nZXRDaGFycygpLCB0aGlzLmdldFdpZHRoKCksIHRoaXMuZ2V0Q29kZSgpXTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2hhcmFjdGVySm9pbmVyU2VydmljZSBpbXBsZW1lbnRzIElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2NoYXJhY3RlckpvaW5lcnM6IElDaGFyYWN0ZXJKb2luZXJbXSA9IFtdO1xuICBwcml2YXRlIF9uZXh0Q2hhcmFjdGVySm9pbmVySWQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3dvcmtDZWxsOiBDZWxsRGF0YSA9IG5ldyBDZWxsRGF0YSgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZVxuICApIHsgfVxuXG4gIHB1YmxpYyByZWdpc3RlcihoYW5kbGVyOiAodGV4dDogc3RyaW5nKSA9PiBbbnVtYmVyLCBudW1iZXJdW10pOiBudW1iZXIge1xuICAgIGNvbnN0IGpvaW5lcjogSUNoYXJhY3RlckpvaW5lciA9IHtcbiAgICAgIGlkOiB0aGlzLl9uZXh0Q2hhcmFjdGVySm9pbmVySWQrKyxcbiAgICAgIGhhbmRsZXJcbiAgICB9O1xuXG4gICAgdGhpcy5fY2hhcmFjdGVySm9pbmVycy5wdXNoKGpvaW5lcik7XG4gICAgcmV0dXJuIGpvaW5lci5pZDtcbiAgfVxuXG4gIHB1YmxpYyBkZXJlZ2lzdGVyKGpvaW5lcklkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NoYXJhY3RlckpvaW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLl9jaGFyYWN0ZXJKb2luZXJzW2ldLmlkID09PSBqb2luZXJJZCkge1xuICAgICAgICB0aGlzLl9jaGFyYWN0ZXJKb2luZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldEpvaW5lZENoYXJhY3RlcnMocm93OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdW10ge1xuICAgIGlmICh0aGlzLl9jaGFyYWN0ZXJKb2luZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5nZXQocm93KTtcbiAgICBpZiAoIWxpbmUgfHwgbGluZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByYW5nZXM6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtdO1xuICAgIGNvbnN0IGxpbmVTdHIgPSBsaW5lLnRyYW5zbGF0ZVRvU3RyaW5nKHRydWUpO1xuXG4gICAgLy8gQmVjYXVzZSBzb21lIGNlbGxzIGNhbiBiZSByZXByZXNlbnRlZCBieSBtdWx0aXBsZSBqYXZhc2NyaXB0IGNoYXJhY3RlcnMsXG4gICAgLy8gd2UgdHJhY2sgdGhlIGNlbGwgYW5kIHRoZSBzdHJpbmcgaW5kZXhlcyBzZXBhcmF0ZWx5LiBUaGlzIGFsbG93cyB1cyB0b1xuICAgIC8vIHRyYW5zbGF0ZSB0aGUgc3RyaW5nIHJhbmdlcyB3ZSBnZXQgZnJvbSB0aGUgam9pbmVycyBiYWNrIGludG8gY2VsbCByYW5nZXNcbiAgICAvLyBmb3IgdXNlIHdoZW4gcmVuZGVyaW5nXG4gICAgbGV0IHJhbmdlU3RhcnRDb2x1bW4gPSAwO1xuICAgIGxldCBjdXJyZW50U3RyaW5nSW5kZXggPSAwO1xuICAgIGxldCByYW5nZVN0YXJ0U3RyaW5nSW5kZXggPSAwO1xuICAgIGxldCByYW5nZUF0dHJGRyA9IGxpbmUuZ2V0RmcoMCk7XG4gICAgbGV0IHJhbmdlQXR0ckJHID0gbGluZS5nZXRCZygwKTtcblxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgbGluZS5nZXRUcmltbWVkTGVuZ3RoKCk7IHgrKykge1xuICAgICAgbGluZS5sb2FkQ2VsbCh4LCB0aGlzLl93b3JrQ2VsbCk7XG5cbiAgICAgIGlmICh0aGlzLl93b3JrQ2VsbC5nZXRXaWR0aCgpID09PSAwKSB7XG4gICAgICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIGlzIG9mIHdpZHRoIDAsIHNraXAgaXQuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBFbmQgb2YgcmFuZ2VcbiAgICAgIGlmICh0aGlzLl93b3JrQ2VsbC5mZyAhPT0gcmFuZ2VBdHRyRkcgfHwgdGhpcy5fd29ya0NlbGwuYmcgIT09IHJhbmdlQXR0ckJHKSB7XG4gICAgICAgIC8vIElmIHdlIGVuZGVkIHVwIHdpdGggYSBzZXF1ZW5jZSBvZiBtb3JlIHRoYW4gb25lIGNoYXJhY3RlcixcbiAgICAgICAgLy8gbG9vayBmb3IgcmFuZ2VzIHRvIGpvaW4uXG4gICAgICAgIGlmICh4IC0gcmFuZ2VTdGFydENvbHVtbiA+IDEpIHtcbiAgICAgICAgICBjb25zdCBqb2luZWRSYW5nZXMgPSB0aGlzLl9nZXRKb2luZWRSYW5nZXMoXG4gICAgICAgICAgICBsaW5lU3RyLFxuICAgICAgICAgICAgcmFuZ2VTdGFydFN0cmluZ0luZGV4LFxuICAgICAgICAgICAgY3VycmVudFN0cmluZ0luZGV4LFxuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIHJhbmdlU3RhcnRDb2x1bW5cbiAgICAgICAgICApO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgam9pbmVkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByYW5nZXMucHVzaChqb2luZWRSYW5nZXNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IG91ciBtYXJrZXJzIGZvciBhIG5ldyByYW5nZS5cbiAgICAgICAgcmFuZ2VTdGFydENvbHVtbiA9IHg7XG4gICAgICAgIHJhbmdlU3RhcnRTdHJpbmdJbmRleCA9IGN1cnJlbnRTdHJpbmdJbmRleDtcbiAgICAgICAgcmFuZ2VBdHRyRkcgPSB0aGlzLl93b3JrQ2VsbC5mZztcbiAgICAgICAgcmFuZ2VBdHRyQkcgPSB0aGlzLl93b3JrQ2VsbC5iZztcbiAgICAgIH1cblxuICAgICAgY3VycmVudFN0cmluZ0luZGV4ICs9IHRoaXMuX3dvcmtDZWxsLmdldENoYXJzKCkubGVuZ3RoIHx8IFdISVRFU1BBQ0VfQ0VMTF9DSEFSLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGFueSB0cmFpbGluZyByYW5nZXMuXG4gICAgaWYgKHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyAtIHJhbmdlU3RhcnRDb2x1bW4gPiAxKSB7XG4gICAgICBjb25zdCBqb2luZWRSYW5nZXMgPSB0aGlzLl9nZXRKb2luZWRSYW5nZXMoXG4gICAgICAgIGxpbmVTdHIsXG4gICAgICAgIHJhbmdlU3RhcnRTdHJpbmdJbmRleCxcbiAgICAgICAgY3VycmVudFN0cmluZ0luZGV4LFxuICAgICAgICBsaW5lLFxuICAgICAgICByYW5nZVN0YXJ0Q29sdW1uXG4gICAgICApO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBqb2luZWRSYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmFuZ2VzLnB1c2goam9pbmVkUmFuZ2VzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmFuZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgc2VnbWVudCBvZiBhIGxpbmUgb2YgdGV4dCwgZmluZCBhbGwgcmFuZ2VzIG9mIHRleHQgdGhhdCBzaG91bGQgYmVcbiAgICogam9pbmVkIGluIGEgc2luZ2xlIHJlbmRlcmluZyB1bml0LiBSYW5nZXMgYXJlIGludGVybmFsbHkgY29udmVydGVkIHRvXG4gICAqIGNvbHVtbiByYW5nZXMsIHJhdGhlciB0aGFuIHN0cmluZyByYW5nZXMuXG4gICAqIEBwYXJhbSBsaW5lIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZnVsbCBsaW5lIG9mIHRleHRcbiAgICogQHBhcmFtIHN0YXJ0SW5kZXggU3RhcnQgcG9zaXRpb24gb2YgdGhlIHJhbmdlIHRvIHNlYXJjaCBpbiB0aGUgc3RyaW5nIChpbmNsdXNpdmUpXG4gICAqIEBwYXJhbSBlbmRJbmRleCBFbmQgcG9zaXRpb24gb2YgdGhlIHJhbmdlIHRvIHNlYXJjaCBpbiB0aGUgc3RyaW5nIChleGNsdXNpdmUpXG4gICAqL1xuICBwcml2YXRlIF9nZXRKb2luZWRSYW5nZXMobGluZTogc3RyaW5nLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIGxpbmVEYXRhOiBJQnVmZmVyTGluZSwgc3RhcnRDb2w6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl1bXSB7XG4gICAgY29uc3QgdGV4dCA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGFscmVhZHkga25vdyB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBqb2luZXIgc29cbiAgICAvLyB3ZSBjYW4ganVzdCBwdWxsIGl0cyB2YWx1ZSBhbmQgYXNzaWduIGl0IGRpcmVjdGx5IHJhdGhlciB0aGFuXG4gICAgLy8gbWVyZ2luZyBpdCBpbnRvIGFuIGVtcHR5IGFycmF5LCB3aGljaCBpbmN1cnMgdW5uZWNlc3Nhcnkgd3JpdGVzLlxuICAgIGxldCBhbGxKb2luZWRSYW5nZXM6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBhbGxKb2luZWRSYW5nZXMgPSB0aGlzLl9jaGFyYWN0ZXJKb2luZXJzWzBdLmhhbmRsZXIodGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2NoYXJhY3RlckpvaW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIFdlIG1lcmdlIGFueSBvdmVybGFwcGluZyByYW5nZXMgYWNyb3NzIHRoZSBkaWZmZXJlbnQgam9pbmVyc1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgam9pbmVyUmFuZ2VzID0gdGhpcy5fY2hhcmFjdGVySm9pbmVyc1tpXS5oYW5kbGVyKHRleHQpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGpvaW5lclJhbmdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIENoYXJhY3RlckpvaW5lclNlcnZpY2UuX21lcmdlUmFuZ2VzKGFsbEpvaW5lZFJhbmdlcywgam9pbmVyUmFuZ2VzW2pdKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3N0cmluZ1Jhbmdlc1RvQ2VsbFJhbmdlcyhhbGxKb2luZWRSYW5nZXMsIGxpbmVEYXRhLCBzdGFydENvbCk7XG4gICAgcmV0dXJuIGFsbEpvaW5lZFJhbmdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RpZmllcyB0aGUgcHJvdmlkZWQgcmFuZ2VzIGluLXBsYWNlIHRvIGFkanVzdCBmb3IgdmFyaWF0aW9ucyBiZXR3ZWVuXG4gICAqIHN0cmluZyBsZW5ndGggYW5kIGNlbGwgd2lkdGggc28gdGhhdCB0aGUgcmFuZ2UgcmVwcmVzZW50cyBhIGNlbGwgcmFuZ2UsXG4gICAqIHJhdGhlciB0aGFuIHRoZSBzdHJpbmcgcmFuZ2UgdGhlIGpvaW5lciBwcm92aWRlcy5cbiAgICogQHBhcmFtIHJhbmdlcyBTdHJpbmcgcmFuZ2VzIGNvbnRhaW5pbmcgc3RhcnQgKGluY2x1c2l2ZSkgYW5kIGVuZCAoZXhjbHVzaXZlKSBpbmRleFxuICAgKiBAcGFyYW0gbGluZSBDZWxsIGRhdGEgZm9yIHRoZSByZWxldmFudCBsaW5lIGluIHRoZSB0ZXJtaW5hbFxuICAgKiBAcGFyYW0gc3RhcnRDb2wgT2Zmc2V0IHdpdGhpbiB0aGUgbGluZSB0byBzdGFydCBmcm9tXG4gICAqL1xuICBwcml2YXRlIF9zdHJpbmdSYW5nZXNUb0NlbGxSYW5nZXMocmFuZ2VzOiBbbnVtYmVyLCBudW1iZXJdW10sIGxpbmU6IElCdWZmZXJMaW5lLCBzdGFydENvbDogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGN1cnJlbnRSYW5nZUluZGV4ID0gMDtcbiAgICBsZXQgY3VycmVudFJhbmdlU3RhcnRlZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50U3RyaW5nSW5kZXggPSAwO1xuICAgIGxldCBjdXJyZW50UmFuZ2UgPSByYW5nZXNbY3VycmVudFJhbmdlSW5kZXhdO1xuXG4gICAgLy8gSWYgd2UgZ290IHRocm91Z2ggYWxsIG9mIHRoZSByYW5nZXMsIHN0b3Agc2VhcmNoaW5nXG4gICAgaWYgKCFjdXJyZW50UmFuZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCB4ID0gc3RhcnRDb2w7IHggPCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7IHgrKykge1xuICAgICAgY29uc3Qgd2lkdGggPSBsaW5lLmdldFdpZHRoKHgpO1xuICAgICAgY29uc3QgbGVuZ3RoID0gbGluZS5nZXRTdHJpbmcoeCkubGVuZ3RoIHx8IFdISVRFU1BBQ0VfQ0VMTF9DSEFSLmxlbmd0aDtcblxuICAgICAgLy8gV2Ugc2tpcCB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMgd2hlbiBjcmVhdGluZyB0aGUgc3RyaW5nIHRvIGpvaW4gdGhlIHRleHRcbiAgICAgIC8vIHNvIHdlIGRvIHRoZSBzYW1lIGhlcmVcbiAgICAgIGlmICh3aWR0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHRoZSBzdGFydCBvZiB0aGUgcmFuZ2VcbiAgICAgIGlmICghY3VycmVudFJhbmdlU3RhcnRlZCAmJiBjdXJyZW50UmFuZ2VbMF0gPD0gY3VycmVudFN0cmluZ0luZGV4KSB7XG4gICAgICAgIGN1cnJlbnRSYW5nZVswXSA9IHg7XG4gICAgICAgIGN1cnJlbnRSYW5nZVN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2VcbiAgICAgIGlmIChjdXJyZW50UmFuZ2VbMV0gPD0gY3VycmVudFN0cmluZ0luZGV4KSB7XG4gICAgICAgIGN1cnJlbnRSYW5nZVsxXSA9IHg7XG5cbiAgICAgICAgLy8gV2UncmUgZmluaXNoZWQgd2l0aCB0aGlzIHJhbmdlLCBzbyB3ZSBtb3ZlIHRvIHRoZSBuZXh0IG9uZVxuICAgICAgICBjdXJyZW50UmFuZ2UgPSByYW5nZXNbKytjdXJyZW50UmFuZ2VJbmRleF07XG5cbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIG1vcmUgcmFuZ2VzIGxlZnQsIHN0b3Agc2VhcmNoaW5nXG4gICAgICAgIGlmICghY3VycmVudFJhbmdlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSYW5nZXMgY2FuIGJlIG9uIGFkamFjZW50IGNoYXJhY3RlcnMuIEJlY2F1c2UgdGhlIGVuZCBpbmRleCBvZiB0aGVcbiAgICAgICAgLy8gcmFuZ2VzIGFyZSBleGNsdXNpdmUsIHRoaXMgbWVhbnMgdGhhdCB0aGUgaW5kZXggZm9yIHRoZSBzdGFydCBvZiBhXG4gICAgICAgIC8vIHJhbmdlIGNhbiBiZSB0aGUgc2FtZSBhcyB0aGUgZW5kIGluZGV4IG9mIHRoZSBwcmV2aW91cyByYW5nZS4gVG9cbiAgICAgICAgLy8gYWNjb3VudCBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHJhbmdlLCB3ZSBjaGVjayBoZXJlIGp1c3QgaW4gY2FzZS5cbiAgICAgICAgaWYgKGN1cnJlbnRSYW5nZVswXSA8PSBjdXJyZW50U3RyaW5nSW5kZXgpIHtcbiAgICAgICAgICBjdXJyZW50UmFuZ2VbMF0gPSB4O1xuICAgICAgICAgIGN1cnJlbnRSYW5nZVN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRSYW5nZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3QgdGhlIHN0cmluZyBpbmRleCBiYXNlZCBvbiB0aGUgY2hhcmFjdGVyIGxlbmd0aCB0byBsaW5lIHVwIHdpdGhcbiAgICAgIC8vIHRoZSBjb2x1bW4gYWRqdXN0bWVudFxuICAgICAgY3VycmVudFN0cmluZ0luZGV4ICs9IGxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBzdGlsbCBhIHJhbmdlIGxlZnQgYXQgdGhlIGVuZCwgaXQgbXVzdCBleHRlbmQgYWxsIHRoZSB3YXkgdG9cbiAgICAvLyB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuICAgIGlmIChjdXJyZW50UmFuZ2UpIHtcbiAgICAgIGN1cnJlbnRSYW5nZVsxXSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2VzIHRoZSByYW5nZSBkZWZpbmVkIGJ5IHRoZSBwcm92aWRlZCBzdGFydCBhbmQgZW5kIGludG8gdGhlIGxpc3Qgb2ZcbiAgICogZXhpc3RpbmcgcmFuZ2VzLiBUaGUgbWVyZ2UgaXMgZG9uZSBpbiBwbGFjZSBvbiB0aGUgZXhpc3RpbmcgcmFuZ2UgZm9yXG4gICAqIHBlcmZvcm1hbmNlIGFuZCBpcyBhbHNvIHJldHVybmVkLlxuICAgKiBAcGFyYW0gcmFuZ2VzIEV4aXN0aW5nIHJhbmdlIGxpc3RcbiAgICogQHBhcmFtIG5ld1JhbmdlIFR1cGxlIG9mIHR3byBudW1iZXJzIHJlcHJlc2VudGluZyB0aGUgbmV3IHJhbmdlIHRvIG1lcmdlIGluLlxuICAgKiBAcmV0dXJucyBUaGUgcmFuZ2VzIGlucHV0IHdpdGggdGhlIG5ldyByYW5nZSBtZXJnZWQgaW4gcGxhY2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9tZXJnZVJhbmdlcyhyYW5nZXM6IFtudW1iZXIsIG51bWJlcl1bXSwgbmV3UmFuZ2U6IFtudW1iZXIsIG51bWJlcl0pOiBbbnVtYmVyLCBudW1iZXJdW10ge1xuICAgIGxldCBpblJhbmdlID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gcmFuZ2VzW2ldO1xuICAgICAgaWYgKCFpblJhbmdlKSB7XG4gICAgICAgIGlmIChuZXdSYW5nZVsxXSA8PSByYW5nZVswXSkge1xuICAgICAgICAgIC8vIENhc2UgMTogTmV3IHJhbmdlIGlzIGJlZm9yZSB0aGUgc2VhcmNoIHJhbmdlXG4gICAgICAgICAgcmFuZ2VzLnNwbGljZShpLCAwLCBuZXdSYW5nZSk7XG4gICAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdSYW5nZVsxXSA8PSByYW5nZVsxXSkge1xuICAgICAgICAgIC8vIENhc2UgMjogTmV3IHJhbmdlIGlzIGVpdGhlciB3aG9sbHkgY29udGFpbmVkIHdpdGhpbiB0aGVcbiAgICAgICAgICAvLyBzZWFyY2ggcmFuZ2Ugb3Igb3ZlcmxhcHMgd2l0aCB0aGUgZnJvbnQgb2YgaXRcbiAgICAgICAgICByYW5nZVswXSA9IE1hdGgubWluKG5ld1JhbmdlWzBdLCByYW5nZVswXSk7XG4gICAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdSYW5nZVswXSA8IHJhbmdlWzFdKSB7XG4gICAgICAgICAgLy8gQ2FzZSAzOiBOZXcgcmFuZ2UgZWl0aGVyIHdob2xseSBjb250YWlucyB0aGUgc2VhcmNoIHJhbmdlXG4gICAgICAgICAgLy8gb3Igb3ZlcmxhcHMgd2l0aCB0aGUgZW5kIG9mIGl0XG4gICAgICAgICAgcmFuZ2VbMF0gPSBNYXRoLm1pbihuZXdSYW5nZVswXSwgcmFuZ2VbMF0pO1xuICAgICAgICAgIGluUmFuZ2UgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FzZSA0OiBOZXcgcmFuZ2Ugc3RhcnRzIGFmdGVyIHRoZSBzZWFyY2ggcmFuZ2VcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobmV3UmFuZ2VbMV0gPD0gcmFuZ2VbMF0pIHtcbiAgICAgICAgICAvLyBDYXNlIDU6IE5ldyByYW5nZSBleHRlbmRzIGZyb20gcHJldmlvdXMgcmFuZ2UgYnV0IGRvZXNuJ3RcbiAgICAgICAgICAvLyByZWFjaCB0aGUgY3VycmVudCBvbmVcbiAgICAgICAgICByYW5nZXNbaSAtIDFdWzFdID0gbmV3UmFuZ2VbMV07XG4gICAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdSYW5nZVsxXSA8PSByYW5nZVsxXSkge1xuICAgICAgICAgIC8vIENhc2UgNjogTmV3IHJhbmdlIGV4dGVuZHMgZnJvbSBwcnZpb3VzIHJhbmdlIGludG8gdGhlXG4gICAgICAgICAgLy8gY3VycmVudCByYW5nZVxuICAgICAgICAgIHJhbmdlc1tpIC0gMV1bMV0gPSBNYXRoLm1heChuZXdSYW5nZVsxXSwgcmFuZ2VbMV0pO1xuICAgICAgICAgIHJhbmdlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhc2UgNzogTmV3IHJhbmdlIGV4dGVuZHMgZnJvbSBwcmV2aW91cyByYW5nZSBwYXN0IHRoZVxuICAgICAgICAvLyBlbmQgb2YgdGhlIGN1cnJlbnQgcmFuZ2VcbiAgICAgICAgcmFuZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgICAgaS0tO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpblJhbmdlKSB7XG4gICAgICAvLyBDYXNlIDg6IE5ldyByYW5nZSBleHRlbmRzIHBhc3QgdGhlIGxhc3QgZXhpc3RpbmcgcmFuZ2VcbiAgICAgIHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV1bMV0gPSBuZXdSYW5nZVsxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FzZSA5OiBOZXcgcmFuZ2Ugc3RhcnRzIGFmdGVyIHRoZSBsYXN0IGV4aXN0aW5nIHJhbmdlXG4gICAgICByYW5nZXMucHVzaChuZXdSYW5nZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmdlcztcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSwgTXV0YWJsZURpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSB9IGZyb20gJy4vU2VydmljZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBmb3J3YXJkRXZlbnQgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciB9IGZyb20gJ2Jyb3dzZXIvTGlmZWN5Y2xlJztcblxuZXhwb3J0IGNsYXNzIENvcmVCcm93c2VyU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJQ29yZUJyb3dzZXJTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2lzRm9jdXNlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9jYWNoZWRJc0ZvY3VzZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3NjcmVlbkRwck1vbml0b3IgPSBuZXcgU2NyZWVuRHByTW9uaXRvcih0aGlzLl93aW5kb3cpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRHByQ2hhbmdlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkRwckNoYW5nZSA9IHRoaXMuX29uRHByQ2hhbmdlLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbldpbmRvd0NoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbldpbmRvd0NoYW5nZSA9IHRoaXMuX29uV2luZG93Q2hhbmdlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3RleHRhcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICAgIHByaXZhdGUgX3dpbmRvdzogV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMsXG4gICAgcHVibGljIHJlYWRvbmx5IG1haW5Eb2N1bWVudDogRG9jdW1lbnRcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIE1vbml0b3IgZGV2aWNlIHBpeGVsIHJhdGlvXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLm9uV2luZG93Q2hhbmdlKHcgPT4gdGhpcy5fc2NyZWVuRHByTW9uaXRvci5zZXRXaW5kb3codykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9zY3JlZW5EcHJNb25pdG9yLm9uRHByQ2hhbmdlLCB0aGlzLl9vbkRwckNoYW5nZSkpO1xuXG4gICAgdGhpcy5fdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiB0aGlzLl9pc0ZvY3VzZWQgPSB0cnVlKTtcbiAgICB0aGlzLl90ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gdGhpcy5faXNGb2N1c2VkID0gZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGdldCB3aW5kb3coKTogV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMge1xuICAgIHJldHVybiB0aGlzLl93aW5kb3c7XG4gIH1cblxuICBwdWJsaWMgc2V0IHdpbmRvdyh2YWx1ZTogV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMpIHtcbiAgICBpZiAodGhpcy5fd2luZG93ICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fd2luZG93ID0gdmFsdWU7XG4gICAgICB0aGlzLl9vbldpbmRvd0NoYW5nZS5maXJlKHRoaXMuX3dpbmRvdyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBkcHIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy53aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9jYWNoZWRJc0ZvY3VzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fY2FjaGVkSXNGb2N1c2VkID0gdGhpcy5faXNGb2N1c2VkICYmIHRoaXMuX3RleHRhcmVhLm93bmVyRG9jdW1lbnQuaGFzRm9jdXMoKTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuX2NhY2hlZElzRm9jdXNlZCA9IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRJc0ZvY3VzZWQ7XG4gIH1cbn1cblxuXG4vKipcbiAqIFRoZSBzY3JlZW4gZGV2aWNlIHBpeGVsIHJhdGlvIG1vbml0b3IgYWxsb3dzIGxpc3RlbmluZyBmb3Igd2hlbiB0aGVcbiAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHZhbHVlIGNoYW5nZXMuIFRoaXMgaXMgZG9uZSBub3Qgd2l0aCBwb2xsaW5nIGJ1dCB3aXRoXG4gKiB0aGUgdXNlIG9mIHdpbmRvdy5tYXRjaE1lZGlhIHRvIHdhdGNoIG1lZGlhIHF1ZXJpZXMuIFdoZW4gdGhlIGV2ZW50IGZpcmVzLFxuICogdGhlIGxpc3RlbmVyIHdpbGwgYmUgcmVhdHRhY2hlZCB1c2luZyBhIGRpZmZlcmVudCBtZWRpYSBxdWVyeSB0byBlbnN1cmUgdGhhdFxuICogYW55IGZ1cnRoZXIgY2hhbmdlcyB3aWxsIHJlZ2lzdGVyLlxuICpcbiAqIFRoZSBsaXN0ZW5lciBzaG91bGQgZmlyZSBvbiBib3RoIHdpbmRvdyB6b29tIGNoYW5nZXMgYW5kIHN3aXRjaGluZyB0byBhXG4gKiBtb25pdG9yIHdpdGggYSBkaWZmZXJlbnQgRFBJLlxuICovXG5jbGFzcyBTY3JlZW5EcHJNb25pdG9yIGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgX2N1cnJlbnREZXZpY2VQaXhlbFJhdGlvOiBudW1iZXI7XG4gIHByaXZhdGUgX291dGVyTGlzdGVuZXI6ICgodGhpczogTWVkaWFRdWVyeUxpc3QsIGV2OiBNZWRpYVF1ZXJ5TGlzdEV2ZW50KSA9PiBhbnkpIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yZXNvbHV0aW9uTWVkaWFNYXRjaExpc3Q6IE1lZGlhUXVlcnlMaXN0IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF93aW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRHByQ2hhbmdlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkRwckNoYW5nZSA9IHRoaXMuX29uRHByQ2hhbmdlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3BhcmVudFdpbmRvdzogV2luZG93KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgbGlzdGVuZXIgYW5kIGRwciB2YWx1ZVxuICAgIHRoaXMuX291dGVyTGlzdGVuZXIgPSAoKSA9PiB0aGlzLl9zZXREcHJBbmRGaXJlSWZEaWZmZXJzKCk7XG4gICAgdGhpcy5fY3VycmVudERldmljZVBpeGVsUmF0aW8gPSB0aGlzLl9wYXJlbnRXaW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICB0aGlzLl91cGRhdGVEcHIoKTtcblxuICAgIC8vIE1vbml0b3IgYWN0aXZlIHdpbmRvdyByZXNpemVcbiAgICB0aGlzLl9zZXRXaW5kb3dSZXNpemVMaXN0ZW5lcigpO1xuXG4gICAgLy8gU2V0dXAgYWRkaXRpb25hbCBkaXNwb3NhYmxlc1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHRoaXMuY2xlYXJMaXN0ZW5lcigpKSk7XG4gIH1cblxuXG4gIHB1YmxpYyBzZXRXaW5kb3cocGFyZW50V2luZG93OiBXaW5kb3cpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJlbnRXaW5kb3cgPSBwYXJlbnRXaW5kb3c7XG4gICAgdGhpcy5fc2V0V2luZG93UmVzaXplTGlzdGVuZXIoKTtcbiAgICB0aGlzLl9zZXREcHJBbmRGaXJlSWZEaWZmZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRXaW5kb3dSZXNpemVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB0aGlzLl93aW5kb3dSZXNpemVMaXN0ZW5lci52YWx1ZSA9IGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLl9wYXJlbnRXaW5kb3csICdyZXNpemUnLCAoKSA9PiB0aGlzLl9zZXREcHJBbmRGaXJlSWZEaWZmZXJzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RHByQW5kRmlyZUlmRGlmZmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGFyZW50V2luZG93LmRldmljZVBpeGVsUmF0aW8gIT09IHRoaXMuX2N1cnJlbnREZXZpY2VQaXhlbFJhdGlvKSB7XG4gICAgICB0aGlzLl9vbkRwckNoYW5nZS5maXJlKHRoaXMuX3BhcmVudFdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlRHByKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVEcHIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9vdXRlckxpc3RlbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgbGlzdGVuZXJzIGZvciBvbGQgRFBSXG4gICAgdGhpcy5fcmVzb2x1dGlvbk1lZGlhTWF0Y2hMaXN0Py5yZW1vdmVMaXN0ZW5lcih0aGlzLl9vdXRlckxpc3RlbmVyKTtcblxuICAgIC8vIEFkZCBsaXN0ZW5lcnMgZm9yIG5ldyBEUFJcbiAgICB0aGlzLl9jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyA9IHRoaXMuX3BhcmVudFdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgIHRoaXMuX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdCA9IHRoaXMuX3BhcmVudFdpbmRvdy5tYXRjaE1lZGlhKGBzY3JlZW4gYW5kIChyZXNvbHV0aW9uOiAke3RoaXMuX3BhcmVudFdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfWRwcHgpYCk7XG4gICAgdGhpcy5fcmVzb2x1dGlvbk1lZGlhTWF0Y2hMaXN0LmFkZExpc3RlbmVyKHRoaXMuX291dGVyTGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZXNvbHV0aW9uTWVkaWFNYXRjaExpc3QgfHwgIXRoaXMuX291dGVyTGlzdGVuZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVzb2x1dGlvbk1lZGlhTWF0Y2hMaXN0LnJlbW92ZUxpc3RlbmVyKHRoaXMuX291dGVyTGlzdGVuZXIpO1xuICAgIHRoaXMuX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9vdXRlckxpc3RlbmVyID0gdW5kZWZpbmVkO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgSUxpbmtQcm92aWRlciwgSUxpbmtQcm92aWRlclNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgTGlua1Byb3ZpZGVyU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJTGlua1Byb3ZpZGVyU2VydmljZSB7XG4gIGRlY2xhcmUgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyByZWFkb25seSBsaW5rUHJvdmlkZXJzOiBJTGlua1Byb3ZpZGVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHRoaXMubGlua1Byb3ZpZGVycy5sZW5ndGggPSAwKSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJMaW5rUHJvdmlkZXIobGlua1Byb3ZpZGVyOiBJTGlua1Byb3ZpZGVyKTogSURpc3Bvc2FibGUge1xuICAgIHRoaXMubGlua1Byb3ZpZGVycy5wdXNoKGxpbmtQcm92aWRlcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaW5rIHByb3ZpZGVyIGZyb20gdGhlIGxpc3RcbiAgICAgICAgY29uc3QgcHJvdmlkZXJJbmRleCA9IHRoaXMubGlua1Byb3ZpZGVycy5pbmRleE9mKGxpbmtQcm92aWRlcik7XG5cbiAgICAgICAgaWYgKHByb3ZpZGVySW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5saW5rUHJvdmlkZXJzLnNwbGljZShwcm92aWRlckluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDaGFyU2l6ZVNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlLCBJTW91c2VTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBnZXRDb29yZHMsIGdldENvb3Jkc1JlbGF0aXZlVG9FbGVtZW50IH0gZnJvbSAnYnJvd3Nlci9pbnB1dC9Nb3VzZSc7XG5cbmV4cG9ydCBjbGFzcyBNb3VzZVNlcnZpY2UgaW1wbGVtZW50cyBJTW91c2VTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJUmVuZGVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZSxcbiAgICBASUNoYXJTaXplU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jaGFyU2l6ZVNlcnZpY2U6IElDaGFyU2l6ZVNlcnZpY2VcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29vcmRzKGV2ZW50OiB7Y2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXJ9LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgY29sQ291bnQ6IG51bWJlciwgcm93Q291bnQ6IG51bWJlciwgaXNTZWxlY3Rpb24/OiBib29sZWFuKTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGdldENvb3JkcyhcbiAgICAgIHdpbmRvdyxcbiAgICAgIGV2ZW50LFxuICAgICAgZWxlbWVudCxcbiAgICAgIGNvbENvdW50LFxuICAgICAgcm93Q291bnQsXG4gICAgICB0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGFzVmFsaWRTaXplLFxuICAgICAgdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoLFxuICAgICAgdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodCxcbiAgICAgIGlzU2VsZWN0aW9uXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNb3VzZVJlcG9ydENvb3JkcyhldmVudDogTW91c2VFdmVudCwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiB7IGNvbDogbnVtYmVyLCByb3c6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29vcmRzID0gZ2V0Q29vcmRzUmVsYXRpdmVUb0VsZW1lbnQod2luZG93LCBldmVudCwgZWxlbWVudCk7XG4gICAgaWYgKCF0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGFzVmFsaWRTaXplKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb29yZHNbMF0gPSBNYXRoLm1pbihNYXRoLm1heChjb29yZHNbMF0sIDApLCB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aCAtIDEpO1xuICAgIGNvb3Jkc1sxXSA9IE1hdGgubWluKE1hdGgubWF4KGNvb3Jkc1sxXSwgMCksIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodCAtIDEpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2w6IE1hdGguZmxvb3IoY29vcmRzWzBdIC8gdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoKSxcbiAgICAgIHJvdzogTWF0aC5mbG9vcihjb29yZHNbMV0gLyB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0KSxcbiAgICAgIHg6IE1hdGguZmxvb3IoY29vcmRzWzBdKSxcbiAgICAgIHk6IE1hdGguZmxvb3IoY29vcmRzWzFdKVxuICAgIH07XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IFJlbmRlckRlYm91bmNlciB9IGZyb20gJ2Jyb3dzZXIvUmVuZGVyRGVib3VuY2VyJztcbmltcG9ydCB7IElSZW5kZXJEZWJvdW5jZXJXaXRoQ2FsbGJhY2sgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElSZW5kZXJEaW1lbnNpb25zLCBJUmVuZGVyZXIgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ2hhclNpemVTZXJ2aWNlLCBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCBNdXRhYmxlRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBEZWJvdW5jZWRJZGxlVGFzayB9IGZyb20gJ2NvbW1vbi9UYXNrUXVldWUnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElEZWNvcmF0aW9uU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuaW50ZXJmYWNlIElTZWxlY3Rpb25TdGF0ZSB7XG4gIHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBSZW5kZXJTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElSZW5kZXJTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX3JlbmRlcmVyOiBNdXRhYmxlRGlzcG9zYWJsZTxJUmVuZGVyZXI+ID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG4gIHByaXZhdGUgX3JlbmRlckRlYm91bmNlcjogSVJlbmRlckRlYm91bmNlcldpdGhDYWxsYmFjaztcbiAgcHJpdmF0ZSBfcGF1c2VkUmVzaXplVGFzayA9IG5ldyBEZWJvdW5jZWRJZGxlVGFzaygpO1xuICBwcml2YXRlIF9vYnNlcnZlckRpc3Bvc2FibGUgPSB0aGlzLnJlZ2lzdGVyKG5ldyBNdXRhYmxlRGlzcG9zYWJsZSgpKTtcblxuICBwcml2YXRlIF9pc1BhdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9uZWVkc0Z1bGxSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzTmV4dFJlbmRlclJlZHJhd09ubHk6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9uZWVkc1NlbGVjdGlvblJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY2FudmFzV2lkdGg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2NhbnZhc0hlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uU3RhdGU6IElTZWxlY3Rpb25TdGF0ZSA9IHtcbiAgICBzdGFydDogdW5kZWZpbmVkLFxuICAgIGVuZDogdW5kZWZpbmVkLFxuICAgIGNvbHVtblNlbGVjdE1vZGU6IGZhbHNlXG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25EaW1lbnNpb25zQ2hhbmdlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElSZW5kZXJEaW1lbnNpb25zPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uRGltZW5zaW9uc0NoYW5nZSA9IHRoaXMuX29uRGltZW5zaW9uc0NoYW5nZS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UgPSB0aGlzLl9vblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVuZGVyID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbmRlciA9IHRoaXMuX29uUmVuZGVyLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlZnJlc2hSZXF1ZXN0ID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlZnJlc2hSZXF1ZXN0ID0gdGhpcy5fb25SZWZyZXNoUmVxdWVzdC5ldmVudDtcblxuICBwdWJsaWMgZ2V0IGRpbWVuc2lvbnMoKTogSVJlbmRlckRpbWVuc2lvbnMgeyByZXR1cm4gdGhpcy5fcmVuZGVyZXIudmFsdWUhLmRpbWVuc2lvbnM7IH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yb3dDb3VudDogbnVtYmVyLFxuICAgIHNjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIEBJT3B0aW9uc1NlcnZpY2Ugb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBASUNoYXJTaXplU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jaGFyU2l6ZVNlcnZpY2U6IElDaGFyU2l6ZVNlcnZpY2UsXG4gICAgQElEZWNvcmF0aW9uU2VydmljZSBkZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIEBJQnVmZmVyU2VydmljZSBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASUNvcmVCcm93c2VyU2VydmljZSBjb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgQElUaGVtZVNlcnZpY2UgdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9yZW5kZXJEZWJvdW5jZXIgPSBuZXcgUmVuZGVyRGVib3VuY2VyKChzdGFydCwgZW5kKSA9PiB0aGlzLl9yZW5kZXJSb3dzKHN0YXJ0LCBlbmQpLCBjb3JlQnJvd3NlclNlcnZpY2UpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyRGVib3VuY2VyKTtcblxuICAgIHRoaXMucmVnaXN0ZXIoY29yZUJyb3dzZXJTZXJ2aWNlLm9uRHByQ2hhbmdlKCgpID0+IHRoaXMuaGFuZGxlRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZSgpKSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGJ1ZmZlclNlcnZpY2Uub25SZXNpemUoKCkgPT4gdGhpcy5fZnVsbFJlZnJlc2goKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYnVmZmVyU2VydmljZS5idWZmZXJzLm9uQnVmZmVyQWN0aXZhdGUoKCkgPT4gdGhpcy5fcmVuZGVyZXIudmFsdWU/LmNsZWFyKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKG9wdGlvbnNTZXJ2aWNlLm9uT3B0aW9uQ2hhbmdlKCgpID0+IHRoaXMuX2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2NoYXJTaXplU2VydmljZS5vbkNoYXJTaXplQ2hhbmdlKCgpID0+IHRoaXMuaGFuZGxlQ2hhclNpemVDaGFuZ2VkKCkpKTtcblxuICAgIC8vIERvIGEgZnVsbCByZWZyZXNoIHdoZW5ldmVyIGFueSBkZWNvcmF0aW9uIGlzIGFkZGVkIG9yIHJlbW92ZWQuIFRoaXMgbWF5IG5vdCBhY3R1YWxseSByZXN1bHRcbiAgICAvLyBpbiBjaGFuZ2VzIGJ1dCBzaW5jZSBkZWNvcmF0aW9ucyBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkgb3IgYWRkZWQvcmVtb3ZlZCBhbGwgaW4gdGhlIHNhbWVcbiAgICAvLyBmcmFtZSB0aGlzIHNob3VsZCBoYXZlIG1pbmltYWwgcGVyZm9ybWFuY2UgaW1wYWN0LlxuICAgIHRoaXMucmVnaXN0ZXIoZGVjb3JhdGlvblNlcnZpY2Uub25EZWNvcmF0aW9uUmVnaXN0ZXJlZCgoKSA9PiB0aGlzLl9mdWxsUmVmcmVzaCgpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihkZWNvcmF0aW9uU2VydmljZS5vbkRlY29yYXRpb25SZW1vdmVkKCgpID0+IHRoaXMuX2Z1bGxSZWZyZXNoKCkpKTtcblxuICAgIC8vIENsZWFyIHRoZSByZW5kZXJlciB3aGVuIHRoZSBhIGNoYW5nZSB0aGF0IGNvdWxkIGFmZmVjdCBnbHlwaHMgb2NjdXJzXG4gICAgdGhpcy5yZWdpc3RlcihvcHRpb25zU2VydmljZS5vbk11bHRpcGxlT3B0aW9uQ2hhbmdlKFtcbiAgICAgICdjdXN0b21HbHlwaHMnLFxuICAgICAgJ2RyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzJyxcbiAgICAgICdsZXR0ZXJTcGFjaW5nJyxcbiAgICAgICdsaW5lSGVpZ2h0JyxcbiAgICAgICdmb250RmFtaWx5JyxcbiAgICAgICdmb250U2l6ZScsXG4gICAgICAnZm9udFdlaWdodCcsXG4gICAgICAnZm9udFdlaWdodEJvbGQnLFxuICAgICAgJ21pbmltdW1Db250cmFzdFJhdGlvJyxcbiAgICAgICdyZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHMnXG4gICAgXSwgKCkgPT4ge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgdGhpcy5oYW5kbGVSZXNpemUoYnVmZmVyU2VydmljZS5jb2xzLCBidWZmZXJTZXJ2aWNlLnJvd3MpO1xuICAgICAgdGhpcy5fZnVsbFJlZnJlc2goKTtcbiAgICB9KSk7XG5cbiAgICAvLyBSZWZyZXNoIHRoZSBjdXJzb3IgbGluZSB3aGVuIHRoZSBjdXJzb3IgY2hhbmdlc1xuICAgIHRoaXMucmVnaXN0ZXIob3B0aW9uc1NlcnZpY2Uub25NdWx0aXBsZU9wdGlvbkNoYW5nZShbXG4gICAgICAnY3Vyc29yQmxpbmsnLFxuICAgICAgJ2N1cnNvclN0eWxlJ1xuICAgIF0sICgpID0+IHRoaXMucmVmcmVzaFJvd3MoYnVmZmVyU2VydmljZS5idWZmZXIueSwgYnVmZmVyU2VydmljZS5idWZmZXIueSwgdHJ1ZSkpKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodGhlbWVTZXJ2aWNlLm9uQ2hhbmdlQ29sb3JzKCgpID0+IHRoaXMuX2Z1bGxSZWZyZXNoKCkpKTtcblxuICAgIHRoaXMuX3JlZ2lzdGVySW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdywgc2NyZWVuRWxlbWVudCk7XG4gICAgdGhpcy5yZWdpc3Rlcihjb3JlQnJvd3NlclNlcnZpY2Uub25XaW5kb3dDaGFuZ2UoKHcpID0+IHRoaXMuX3JlZ2lzdGVySW50ZXJzZWN0aW9uT2JzZXJ2ZXIodywgc2NyZWVuRWxlbWVudCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVySW50ZXJzZWN0aW9uT2JzZXJ2ZXIodzogV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMsIHNjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgLy8gRGV0ZWN0IHdoZXRoZXIgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgaXMgZGV0ZWN0ZWQgYW5kIGVuYWJsZSByZW5kZXJlciBwYXVzZVxuICAgIC8vIGFuZCByZXN1bWUgYmFzZWQgb24gdGVybWluYWwgdmlzaWJpbGl0eSBpZiBzb1xuICAgIGlmICgnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInIGluIHcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IHcuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZSA9PiB0aGlzLl9oYW5kbGVJbnRlcnNlY3Rpb25DaGFuZ2UoZVtlLmxlbmd0aCAtIDFdKSwgeyB0aHJlc2hvbGQ6IDAgfSk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHNjcmVlbkVsZW1lbnQpO1xuICAgICAgdGhpcy5fb2JzZXJ2ZXJEaXNwb3NhYmxlLnZhbHVlID0gdG9EaXNwb3NhYmxlKCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlSW50ZXJzZWN0aW9uQ2hhbmdlKGVudHJ5OiBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5KTogdm9pZCB7XG4gICAgdGhpcy5faXNQYXVzZWQgPSBlbnRyeS5pc0ludGVyc2VjdGluZyA9PT0gdW5kZWZpbmVkID8gKGVudHJ5LmludGVyc2VjdGlvblJhdGlvID09PSAwKSA6ICFlbnRyeS5pc0ludGVyc2VjdGluZztcblxuICAgIC8vIFRlcm1pbmFsIHdhcyBoaWRkZW4gb24gb3BlblxuICAgIGlmICghdGhpcy5faXNQYXVzZWQgJiYgIXRoaXMuX2NoYXJTaXplU2VydmljZS5oYXNWYWxpZFNpemUpIHtcbiAgICAgIHRoaXMuX2NoYXJTaXplU2VydmljZS5tZWFzdXJlKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9pc1BhdXNlZCAmJiB0aGlzLl9uZWVkc0Z1bGxSZWZyZXNoKSB7XG4gICAgICB0aGlzLl9wYXVzZWRSZXNpemVUYXNrLmZsdXNoKCk7XG4gICAgICB0aGlzLnJlZnJlc2hSb3dzKDAsIHRoaXMuX3Jvd0NvdW50IC0gMSk7XG4gICAgICB0aGlzLl9uZWVkc0Z1bGxSZWZyZXNoID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZnJlc2hSb3dzKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBpc1JlZHJhd09ubHk6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc1BhdXNlZCkge1xuICAgICAgdGhpcy5fbmVlZHNGdWxsUmVmcmVzaCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNSZWRyYXdPbmx5KSB7XG4gICAgICB0aGlzLl9pc05leHRSZW5kZXJSZWRyYXdPbmx5ID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlckRlYm91bmNlci5yZWZyZXNoKHN0YXJ0LCBlbmQsIHRoaXMuX3Jvd0NvdW50KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlclJvd3Moc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2luY2UgdGhpcyBpcyBkZWJvdW5jZWQsIGEgcmVzaXplIGV2ZW50IGNvdWxkIGhhdmUgaGFwcGVuZWQgYmV0d2VlbiB0aGUgdGltZSBhIHJlZnJlc2ggd2FzXG4gICAgLy8gcmVxdWVzdGVkIGFuZCB3aGVuIHRoaXMgdHJpZ2dlcnMuIENsYW1wIHRoZSB2YWx1ZXMgb2Ygc3RhcnQgYW5kIGVuZCB0byBlbnN1cmUgdGhleSdyZSB2YWxpZFxuICAgIC8vIGdpdmVuIHRoZSBjdXJyZW50IHZpZXdwb3J0IHN0YXRlLlxuICAgIHN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsIHRoaXMuX3Jvd0NvdW50IC0gMSk7XG4gICAgZW5kID0gTWF0aC5taW4oZW5kLCB0aGlzLl9yb3dDb3VudCAtIDEpO1xuXG4gICAgLy8gUmVuZGVyXG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWUucmVuZGVyUm93cyhzdGFydCwgZW5kKTtcblxuICAgIC8vIFVwZGF0ZSBzZWxlY3Rpb24gaWYgbmVlZGVkXG4gICAgaWYgKHRoaXMuX25lZWRzU2VsZWN0aW9uUmVmcmVzaCkge1xuICAgICAgdGhpcy5fcmVuZGVyZXIudmFsdWUuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCh0aGlzLl9zZWxlY3Rpb25TdGF0ZS5zdGFydCwgdGhpcy5fc2VsZWN0aW9uU3RhdGUuZW5kLCB0aGlzLl9zZWxlY3Rpb25TdGF0ZS5jb2x1bW5TZWxlY3RNb2RlKTtcbiAgICAgIHRoaXMuX25lZWRzU2VsZWN0aW9uUmVmcmVzaCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEZpcmUgcmVuZGVyIGV2ZW50IG9ubHkgaWYgaXQgd2FzIG5vdCBhIHJlZHJhd1xuICAgIGlmICghdGhpcy5faXNOZXh0UmVuZGVyUmVkcmF3T25seSkge1xuICAgICAgdGhpcy5fb25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlLmZpcmUoeyBzdGFydCwgZW5kIH0pO1xuICAgIH1cbiAgICB0aGlzLl9vblJlbmRlci5maXJlKHsgc3RhcnQsIGVuZCB9KTtcbiAgICB0aGlzLl9pc05leHRSZW5kZXJSZWRyYXdPbmx5ID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9yb3dDb3VudCA9IHJvd3M7XG4gICAgdGhpcy5fZmlyZU9uQ2FudmFzUmVzaXplKCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPcHRpb25zQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaFJvd3MoMCwgdGhpcy5fcm93Q291bnQgLSAxKTtcbiAgICB0aGlzLl9maXJlT25DYW52YXNSZXNpemUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVPbkNhbnZhc1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIERvbid0IGZpcmUgdGhlIGV2ZW50IGlmIHRoZSBkaW1lbnNpb25zIGhhdmVuJ3QgY2hhbmdlZFxuICAgIGlmICh0aGlzLl9yZW5kZXJlci52YWx1ZS5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGggPT09IHRoaXMuX2NhbnZhc1dpZHRoICYmIHRoaXMuX3JlbmRlcmVyLnZhbHVlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQgPT09IHRoaXMuX2NhbnZhc0hlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9vbkRpbWVuc2lvbnNDaGFuZ2UuZmlyZSh0aGlzLl9yZW5kZXJlci52YWx1ZS5kaW1lbnNpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNSZW5kZXJlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl9yZW5kZXJlci52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRSZW5kZXJlcihyZW5kZXJlcjogSVJlbmRlcmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWUgPSByZW5kZXJlcjtcbiAgICAvLyBJZiB0aGUgdmFsdWUgd2FzIG5vdCBzZXQsIHRoZSB0ZXJtaW5hbCBpcyBiZWluZyBkaXNwb3NlZCBzbyBpZ25vcmUgaXRcbiAgICBpZiAodGhpcy5fcmVuZGVyZXIudmFsdWUpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlLm9uUmVxdWVzdFJlZHJhdyhlID0+IHRoaXMucmVmcmVzaFJvd3MoZS5zdGFydCwgZS5lbmQsIHRydWUpKTtcblxuICAgICAgLy8gRm9yY2UgYSByZWZyZXNoXG4gICAgICB0aGlzLl9uZWVkc1NlbGVjdGlvblJlZnJlc2ggPSB0cnVlO1xuICAgICAgdGhpcy5fZnVsbFJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkUmVmcmVzaENhbGxiYWNrKGNhbGxiYWNrOiBGcmFtZVJlcXVlc3RDYWxsYmFjayk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlckRlYm91bmNlci5hZGRSZWZyZXNoQ2FsbGJhY2soY2FsbGJhY2spO1xuICB9XG5cbiAgcHJpdmF0ZSBfZnVsbFJlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzUGF1c2VkKSB7XG4gICAgICB0aGlzLl9uZWVkc0Z1bGxSZWZyZXNoID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWZyZXNoUm93cygwLCB0aGlzLl9yb3dDb3VudCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhclRleHR1cmVBdGxhcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlLmNsZWFyVGV4dHVyZUF0bGFzPy4oKTtcbiAgICB0aGlzLl9mdWxsUmVmcmVzaCgpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UoKTogdm9pZCB7XG4gICAgLy8gRm9yY2UgY2hhciBzaXplIG1lYXN1cmVtZW50IGFzIERvbU1lYXN1cmVTdHJhdGVneShnZXRCb3VuZGluZ0NsaWVudFJlY3QpIGlzIG5vdCBzdGFibGVcbiAgICAvLyB3aGVuIGRldmljZVBpeGVsUmF0aW8gY2hhbmdlc1xuICAgIHRoaXMuX2NoYXJTaXplU2VydmljZS5tZWFzdXJlKCk7XG5cbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlLmhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UoKTtcbiAgICB0aGlzLnJlZnJlc2hSb3dzKDAsIHRoaXMuX3Jvd0NvdW50IC0gMSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJlci52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNQYXVzZWQpIHtcbiAgICAgIHRoaXMuX3BhdXNlZFJlc2l6ZVRhc2suc2V0KCgpID0+IHRoaXMuX3JlbmRlcmVyLnZhbHVlPy5oYW5kbGVSZXNpemUoY29scywgcm93cykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci52YWx1ZS5oYW5kbGVSZXNpemUoY29scywgcm93cyk7XG4gICAgfVxuICAgIHRoaXMuX2Z1bGxSZWZyZXNoKCk7XG4gIH1cblxuICAvLyBUT0RPOiBJcyB0aGlzIHVzZWZ1bCB3aGVuIHdlIGhhdmUgb25SZXNpemU/XG4gIHB1YmxpYyBoYW5kbGVDaGFyU2l6ZUNoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWU/LmhhbmRsZUNoYXJTaXplQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWU/LmhhbmRsZUJsdXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVGb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlci52YWx1ZT8uaGFuZGxlRm9jdXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25TdGF0ZS5zdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuX3NlbGVjdGlvblN0YXRlLmVuZCA9IGVuZDtcbiAgICB0aGlzLl9zZWxlY3Rpb25TdGF0ZS5jb2x1bW5TZWxlY3RNb2RlID0gY29sdW1uU2VsZWN0TW9kZTtcbiAgICB0aGlzLl9yZW5kZXJlci52YWx1ZT8uaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydCwgZW5kLCBjb2x1bW5TZWxlY3RNb2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDdXJzb3JNb3ZlKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlPy5oYW5kbGVDdXJzb3JNb3ZlKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWU/LmNsZWFyKCk7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElCdWZmZXJSYW5nZSwgSUxpbmtpZmllcjIgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IGdldENvb3Jkc1JlbGF0aXZlVG9FbGVtZW50IH0gZnJvbSAnYnJvd3Nlci9pbnB1dC9Nb3VzZSc7XG5pbXBvcnQgeyBtb3ZlVG9DZWxsU2VxdWVuY2UgfSBmcm9tICdicm93c2VyL2lucHV0L01vdmVUb0NlbGwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdicm93c2VyL3NlbGVjdGlvbi9TZWxlY3Rpb25Nb2RlbCc7XG5pbXBvcnQgeyBJU2VsZWN0aW9uUmVkcmF3UmVxdWVzdEV2ZW50LCBJU2VsZWN0aW9uUmVxdWVzdFNjcm9sbExpbmVzRXZlbnQgfSBmcm9tICdicm93c2VyL3NlbGVjdGlvbi9UeXBlcyc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJTW91c2VTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSwgSVNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgKiBhcyBCcm93c2VyIGZyb20gJ2NvbW1vbi9QbGF0Zm9ybSc7XG5pbXBvcnQgeyBJQnVmZmVyTGluZSwgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgZ2V0UmFuZ2VMZW5ndGggfSBmcm9tICdjb21tb24vYnVmZmVyL0J1ZmZlclJhbmdlJztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBJQnVmZmVyIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSUNvcmVTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBhYm92ZSBvciBiZWxvdyB0aGUgdmlld3BvcnQgaW5cbiAqIG9yZGVyIHRvIHNjcm9sbCBhdCB0aGUgbWF4aW11bSBzcGVlZC5cbiAqL1xuY29uc3QgRFJBR19TQ1JPTExfTUFYX1RIUkVTSE9MRCA9IDUwO1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIHNjcm9sbGluZyBzcGVlZFxuICovXG5jb25zdCBEUkFHX1NDUk9MTF9NQVhfU1BFRUQgPSAxNTtcblxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGRyYWcgc2Nyb2xsIHVwZGF0ZXMuXG4gKi9cbmNvbnN0IERSQUdfU0NST0xMX0lOVEVSVkFMID0gNTA7XG5cbi8qKlxuICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdGhhdCBjYW4gaGF2ZSBlbGFwc2VkIGZvciBhbiBhbHQgY2xpY2sgdG8gbW92ZSB0aGVcbiAqIGN1cnNvci5cbiAqL1xuY29uc3QgQUxUX0NMSUNLX01PVkVfQ1VSU09SX1RJTUUgPSA1MDA7XG5cbmNvbnN0IE5PTl9CUkVBS0lOR19TUEFDRV9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApO1xuY29uc3QgQUxMX05PTl9CUkVBS0lOR19TUEFDRV9SRUdFWCA9IG5ldyBSZWdFeHAoTk9OX0JSRUFLSU5HX1NQQUNFX0NIQVIsICdnJyk7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHBvc2l0aW9uIG9mIGEgd29yZCBvbiBhIGxpbmUuXG4gKi9cbmludGVyZmFjZSBJV29yZFBvc2l0aW9uIHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgbGVuZ3RoOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBzZWxlY3Rpb24gbW9kZSwgdGhpcyBkcml2ZXMgaG93IHRoZSBzZWxlY3Rpb24gYmVoYXZlcyBvbiBtb3VzZSBtb3ZlLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBTZWxlY3Rpb25Nb2RlIHtcbiAgTk9STUFMLFxuICBXT1JELFxuICBMSU5FLFxuICBDT0xVTU5cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgbWFuYWdlcyB0aGUgc2VsZWN0aW9uIG9mIHRoZSB0ZXJtaW5hbC4gV2l0aCBoZWxwIGZyb21cbiAqIFNlbGVjdGlvbk1vZGVsLCBTZWxlY3Rpb25TZXJ2aWNlIGhhbmRsZXMgd2l0aCBhbGwgbG9naWMgYXNzb2NpYXRlZCB3aXRoXG4gKiBkZWFsaW5nIHdpdGggdGhlIHNlbGVjdGlvbiwgaW5jbHVkaW5nIGhhbmRsaW5nIG1vdXNlIGludGVyYWN0aW9uLCB3aWRlXG4gKiBjaGFyYWN0ZXJzIGFuZCBmZXRjaGluZyB0aGUgYWN0dWFsIHRleHQgd2l0aGluIHRoZSBzZWxlY3Rpb24uIFJlbmRlcmluZyBpc1xuICogbm90IGhhbmRsZWQgYnkgdGhlIFNlbGVjdGlvblNlcnZpY2UgYnV0IHRoZSBvblJlZHJhd1JlcXVlc3QgZXZlbnQgaXMgZmlyZWRcbiAqIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyByZWFkeSB0byBiZSByZWRyYXduIChvbiBhbiBhbmltYXRpb24gZnJhbWUpLlxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJU2VsZWN0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgX21vZGVsOiBTZWxlY3Rpb25Nb2RlbDtcblxuICAvKipcbiAgICogVGhlIGFtb3VudCB0byBzY3JvbGwgZXZlcnkgZHJhZyBzY3JvbGwgdXBkYXRlIChkZXBlbmRzIG9uIGhvdyBmYXIgdGhlIG1vdXNlXG4gICAqIGRyYWcgaXMgYWJvdmUgb3IgYmVsb3cgdGhlIHRlcm1pbmFsKS5cbiAgICovXG4gIHByaXZhdGUgX2RyYWdTY3JvbGxBbW91bnQ6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBtb2RlLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9hY3RpdmVTZWxlY3Rpb25Nb2RlOiBTZWxlY3Rpb25Nb2RlO1xuXG4gIC8qKlxuICAgKiBBIHNldEludGVydmFsIHRpbWVyIHRoYXQgaXMgYWN0aXZlIHdoaWxlIHRoZSBtb3VzZSBpcyBkb3duIHdob3NlIGNhbGxiYWNrXG4gICAqIHNjcm9sbHMgdGhlIHZpZXdwb3J0IHdoZW4gbmVjZXNzYXJ5LlxuICAgKi9cbiAgcHJpdmF0ZSBfZHJhZ1Njcm9sbEludGVydmFsVGltZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGFuaW1hdGlvbiBmcmFtZSBJRCB1c2VkIGZvciByZWZyZXNoaW5nIHRoZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIF9yZWZyZXNoQW5pbWF0aW9uRnJhbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciBzZWxlY3Rpb24gaXMgZW5hYmxlZC5cbiAgICovXG4gIHByaXZhdGUgX2VuYWJsZWQgPSB0cnVlO1xuXG4gIHByaXZhdGUgX21vdXNlTW92ZUxpc3RlbmVyOiBFdmVudExpc3RlbmVyO1xuICBwcml2YXRlIF9tb3VzZVVwTGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI7XG4gIHByaXZhdGUgX3RyaW1MaXN0ZW5lcjogSURpc3Bvc2FibGU7XG4gIHByaXZhdGUgX3dvcmtDZWxsOiBDZWxsRGF0YSA9IG5ldyBDZWxsRGF0YSgpO1xuXG4gIHByaXZhdGUgX21vdXNlRG93blRpbWVTdGFtcDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfb2xkSGFzU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX29sZFNlbGVjdGlvblN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9vbGRTZWxlY3Rpb25FbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25MaW51eE1vdXNlU2VsZWN0aW9uID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkxpbnV4TW91c2VTZWxlY3Rpb24gPSB0aGlzLl9vbkxpbnV4TW91c2VTZWxlY3Rpb24uZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVkcmF3UmVxdWVzdCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uUmVkcmF3UmVxdWVzdEV2ZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdFJlZHJhdyA9IHRoaXMuX29uUmVkcmF3UmVxdWVzdC5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25TZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RTY3JvbGxMaW5lcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uUmVxdWVzdFNjcm9sbExpbmVzRXZlbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0U2Nyb2xsTGluZXMgPSB0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zY3JlZW5FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9saW5raWZpZXI6IElMaW5raWZpZXIyLFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASUNvcmVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsXG4gICAgQElNb3VzZVNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfbW91c2VTZXJ2aWNlOiBJTW91c2VTZXJ2aWNlLFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBASVJlbmRlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyU2VydmljZTogSVJlbmRlclNlcnZpY2UsXG4gICAgQElDb3JlQnJvd3NlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0IGxpc3RlbmVyc1xuICAgIHRoaXMuX21vdXNlTW92ZUxpc3RlbmVyID0gZXZlbnQgPT4gdGhpcy5faGFuZGxlTW91c2VNb3ZlKGV2ZW50IGFzIE1vdXNlRXZlbnQpO1xuICAgIHRoaXMuX21vdXNlVXBMaXN0ZW5lciA9IGV2ZW50ID0+IHRoaXMuX2hhbmRsZU1vdXNlVXAoZXZlbnQgYXMgTW91c2VFdmVudCk7XG4gICAgdGhpcy5fY29yZVNlcnZpY2Uub25Vc2VySW5wdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl90cmltTGlzdGVuZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5vblRyaW0oYW1vdW50ID0+IHRoaXMuX2hhbmRsZVRyaW0oYW1vdW50KSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMub25CdWZmZXJBY3RpdmF0ZShlID0+IHRoaXMuX2hhbmRsZUJ1ZmZlckFjdGl2YXRlKGUpKSk7XG5cbiAgICB0aGlzLmVuYWJsZSgpO1xuXG4gICAgdGhpcy5fbW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWwodGhpcy5fYnVmZmVyU2VydmljZSk7XG4gICAgdGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGUuTk9STUFMO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVtb3ZlTW91c2VEb3duTGlzdGVuZXJzKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgc2VsZWN0aW9uIG1hbmFnZXIuIFRoaXMgaXMgdXNlZnVsIGZvciB3aGVuIHRlcm1pbmFsIG1vdXNlXG4gICAqIGFyZSBlbmFibGVkLlxuICAgKi9cbiAgcHVibGljIGRpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgdGhlIHNlbGVjdGlvbiBtYW5hZ2VyLlxuICAgKi9cbiAgcHVibGljIGVuYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VsZWN0aW9uU3RhcnQoKTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvblN0YXJ0OyB9XG4gIHB1YmxpYyBnZXQgc2VsZWN0aW9uRW5kKCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25FbmQ7IH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZXJlIGlzIGFuIGFjdGl2ZSB0ZXh0IHNlbGVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvbkVuZDtcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0WzBdICE9PSBlbmRbMF0gfHwgc3RhcnRbMV0gIT09IGVuZFsxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0ZXh0IGN1cnJlbnRseSBzZWxlY3RlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0aW9uVGV4dCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvbkVuZDtcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcjtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5DT0xVTU4pIHtcbiAgICAgIC8vIElnbm9yZSB6ZXJvIHdpZHRoIHNlbGVjdGlvbnNcbiAgICAgIGlmIChzdGFydFswXSA9PT0gZW5kWzBdKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIGNvbHVtbiBzZWxlY3Rpb24gaXQncyBub3QgZW5vdWdoIHRvIHJlbHkgb24gZmluYWwgc2VsZWN0aW9uJ3Mgc3dhcHBpbmcgb2YgcmV2ZXJzZWRcbiAgICAgIC8vIHZhbHVlcywgaXQgYWxzbyBuZWVkcyB0aGUgeCBjb29yZGluYXRlcyB0byBzd2FwIGluZGVwZW5kZW50bHkgb2YgdGhlIHkgY29vcmRpbmF0ZSBpcyBuZWVkZWRcbiAgICAgIGNvbnN0IHN0YXJ0Q29sID0gc3RhcnRbMF0gPCBlbmRbMF0gPyBzdGFydFswXSA6IGVuZFswXTtcbiAgICAgIGNvbnN0IGVuZENvbCA9IHN0YXJ0WzBdIDwgZW5kWzBdID8gZW5kWzBdIDogc3RhcnRbMF07XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnRbMV07IGkgPD0gZW5kWzFdOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGluZVRleHQgPSBidWZmZXIudHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nKGksIHRydWUsIHN0YXJ0Q29sLCBlbmRDb2wpO1xuICAgICAgICByZXN1bHQucHVzaChsaW5lVGV4dCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEdldCBmaXJzdCByb3dcbiAgICAgIGNvbnN0IHN0YXJ0Um93RW5kQ29sID0gc3RhcnRbMV0gPT09IGVuZFsxXSA/IGVuZFswXSA6IHVuZGVmaW5lZDtcbiAgICAgIHJlc3VsdC5wdXNoKGJ1ZmZlci50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoc3RhcnRbMV0sIHRydWUsIHN0YXJ0WzBdLCBzdGFydFJvd0VuZENvbCkpO1xuXG4gICAgICAvLyBHZXQgbWlkZGxlIHJvd3NcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydFsxXSArIDE7IGkgPD0gZW5kWzFdIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlckxpbmUgPSBidWZmZXIubGluZXMuZ2V0KGkpO1xuICAgICAgICBjb25zdCBsaW5lVGV4dCA9IGJ1ZmZlci50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoaSwgdHJ1ZSk7XG4gICAgICAgIGlmIChidWZmZXJMaW5lPy5pc1dyYXBwZWQpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdICs9IGxpbmVUZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGxpbmVUZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgZmluYWwgcm93XG4gICAgICBpZiAoc3RhcnRbMV0gIT09IGVuZFsxXSkge1xuICAgICAgICBjb25zdCBidWZmZXJMaW5lID0gYnVmZmVyLmxpbmVzLmdldChlbmRbMV0pO1xuICAgICAgICBjb25zdCBsaW5lVGV4dCA9IGJ1ZmZlci50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoZW5kWzFdLCB0cnVlLCAwLCBlbmRbMF0pO1xuICAgICAgICBpZiAoYnVmZmVyTGluZSAmJiBidWZmZXJMaW5lIS5pc1dyYXBwZWQpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdICs9IGxpbmVUZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGxpbmVUZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcm1hdCBzdHJpbmcgYnkgcmVwbGFjaW5nIG5vbi1icmVha2luZyBzcGFjZSBjaGFycyB3aXRoIHJlZ3VsYXIgc3BhY2VzXG4gICAgLy8gYW5kIGpvaW5pbmcgdGhlIGFycmF5IGludG8gYSBtdWx0aS1saW5lIHN0cmluZy5cbiAgICBjb25zdCBmb3JtYXR0ZWRSZXN1bHQgPSByZXN1bHQubWFwKGxpbmUgPT4ge1xuICAgICAgcmV0dXJuIGxpbmUucmVwbGFjZShBTExfTk9OX0JSRUFLSU5HX1NQQUNFX1JFR0VYLCAnICcpO1xuICAgIH0pLmpvaW4oQnJvd3Nlci5pc1dpbmRvd3MgPyAnXFxyXFxuJyA6ICdcXG4nKTtcblxuICAgIHJldHVybiBmb3JtYXR0ZWRSZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBjdXJyZW50IHRlcm1pbmFsIHNlbGVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RlbC5jbGVhclNlbGVjdGlvbigpO1xuICAgIHRoaXMuX3JlbW92ZU1vdXNlRG93bkxpc3RlbmVycygpO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlLmZpcmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZXMgYSByZWZyZXNoLCByZWRyYXdpbmcgdGhlIHNlbGVjdGlvbiBvbiB0aGUgbmV4dCBvcHBvcnR1bml0eS5cbiAgICogQHBhcmFtIGlzTGludXhNb3VzZVNlbGVjdGlvbiBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYXMgYSBuZXdcbiAgICogc2VsZWN0aW9uIG9uIExpbnV4LlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2goaXNMaW51eE1vdXNlU2VsZWN0aW9uPzogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIFF1ZXVlIHRoZSByZWZyZXNoIGZvciB0aGUgcmVuZGVyZXJcbiAgICBpZiAoIXRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5fcmVmcmVzaCgpKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgcGxhdGZvcm0gaXMgTGludXggYW5kIHRoZSByZWZyZXNoIGNhbGwgY29tZXMgZnJvbSBhIG1vdXNlIGV2ZW50LFxuICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzZWxlY3Rpb24gZm9yIG1pZGRsZSBjbGljayB0byBwYXN0ZSBzZWxlY3Rpb24uXG4gICAgaWYgKEJyb3dzZXIuaXNMaW51eCAmJiBpc0xpbnV4TW91c2VTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGlvblRleHQgPSB0aGlzLnNlbGVjdGlvblRleHQ7XG4gICAgICBpZiAoc2VsZWN0aW9uVGV4dC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fb25MaW51eE1vdXNlU2VsZWN0aW9uLmZpcmUodGhpcy5zZWxlY3Rpb25UZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgdGhlIHJlZnJlc2ggZXZlbnQsIGNhdXNpbmcgY29uc3VtZXJzIHRvIHBpY2sgaXQgdXAgYW5kIHJlZHJhdyB0aGVcbiAgICogc2VsZWN0aW9uIHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fb25SZWRyYXdSZXF1ZXN0LmZpcmUoe1xuICAgICAgc3RhcnQ6IHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uRW5kLFxuICAgICAgY29sdW1uU2VsZWN0TW9kZTogdGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5DT0xVTU5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgY2xpY2sgd2FzIGluc2lkZSB0aGUgY3VycmVudCBzZWxlY3Rpb25cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSBfaXNDbGlja0luU2VsZWN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29vcmRzID0gdGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvbkVuZDtcblxuICAgIGlmICghc3RhcnQgfHwgIWVuZCB8fCAhY29vcmRzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2FyZUNvb3Jkc0luU2VsZWN0aW9uKGNvb3Jkcywgc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwdWJsaWMgaXNDZWxsSW5TZWxlY3Rpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uU3RhcnQ7XG4gICAgY29uc3QgZW5kID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25FbmQ7XG4gICAgaWYgKCFzdGFydCB8fCAhZW5kKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcmVDb29yZHNJblNlbGVjdGlvbihbeCwgeV0sIHN0YXJ0LCBlbmQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hcmVDb29yZHNJblNlbGVjdGlvbihjb29yZHM6IFtudW1iZXIsIG51bWJlcl0sIHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGNvb3Jkc1sxXSA+IHN0YXJ0WzFdICYmIGNvb3Jkc1sxXSA8IGVuZFsxXSkgfHxcbiAgICAgICAgKHN0YXJ0WzFdID09PSBlbmRbMV0gJiYgY29vcmRzWzFdID09PSBzdGFydFsxXSAmJiBjb29yZHNbMF0gPj0gc3RhcnRbMF0gJiYgY29vcmRzWzBdIDwgZW5kWzBdKSB8fFxuICAgICAgICAoc3RhcnRbMV0gPCBlbmRbMV0gJiYgY29vcmRzWzFdID09PSBlbmRbMV0gJiYgY29vcmRzWzBdIDwgZW5kWzBdKSB8fFxuICAgICAgICAoc3RhcnRbMV0gPCBlbmRbMV0gJiYgY29vcmRzWzFdID09PSBzdGFydFsxXSAmJiBjb29yZHNbMF0gPj0gc3RhcnRbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgd29yZCBhdCB0aGUgY3VycmVudCBtb3VzZSBldmVudCBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX3NlbGVjdFdvcmRBdEN1cnNvcihldmVudDogTW91c2VFdmVudCwgYWxsb3dXaGl0ZXNwYWNlT25seVNlbGVjdGlvbjogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgbGluayB1bmRlciB0aGUgY3Vyc29yIGZpcnN0IGFuZCBzZWxlY3QgdGhhdCBpZiBzb1xuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fbGlua2lmaWVyLmN1cnJlbnRMaW5rPy5saW5rPy5yYW5nZTtcbiAgICBpZiAocmFuZ2UpIHtcbiAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0ID0gW3JhbmdlLnN0YXJ0LnggLSAxLCByYW5nZS5zdGFydC55IC0gMV07XG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydExlbmd0aCA9IGdldFJhbmdlTGVuZ3RoKHJhbmdlLCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpO1xuICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29vcmRzID0gdGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQpO1xuICAgIGlmIChjb29yZHMpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFdvcmRBdChjb29yZHMsIGFsbG93V2hpdGVzcGFjZU9ubHlTZWxlY3Rpb24pO1xuICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGFsbCB0ZXh0IHdpdGhpbiB0aGUgdGVybWluYWwuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGVsLmlzU2VsZWN0QWxsQWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLl9vblNlbGVjdGlvbkNoYW5nZS5maXJlKCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TGluZXMoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RlbC5jbGVhclNlbGVjdGlvbigpO1xuICAgIHN0YXJ0ID0gTWF0aC5tYXgoc3RhcnQsIDApO1xuICAgIGVuZCA9IE1hdGgubWluKGVuZCwgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMubGVuZ3RoIC0gMSk7XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnQgPSBbMCwgc3RhcnRdO1xuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZCA9IFt0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIGVuZF07XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UuZmlyZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgYnVmZmVyIGJlaW5nIHRyaW1tZWQsIGFkanVzdCB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgdGhlIGJ1ZmZlciBpcyBiZWluZyB0cmltbWVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVHJpbShhbW91bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5lZWRzUmVmcmVzaCA9IHRoaXMuX21vZGVsLmhhbmRsZVRyaW0oYW1vdW50KTtcbiAgICBpZiAobmVlZHNSZWZyZXNoKSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgMC1iYXNlZCBbeCwgeV0gYnVmZmVyIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IG1vdXNlIGV2ZW50LlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlIGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQ6IE1vdXNlRXZlbnQpOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9tb3VzZVNlcnZpY2UuZ2V0Q29vcmRzKGV2ZW50LCB0aGlzLl9zY3JlZW5FbGVtZW50LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cywgdHJ1ZSk7XG4gICAgaWYgKCFjb29yZHMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCB0byAwLWJhc2VkXG4gICAgY29vcmRzWzBdLS07XG4gICAgY29vcmRzWzFdLS07XG5cbiAgICAvLyBDb252ZXJ0IHZpZXdwb3J0IGNvb3JkcyB0byBidWZmZXIgY29vcmRzXG4gICAgY29vcmRzWzFdICs9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwO1xuICAgIHJldHVybiBjb29yZHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYW1vdW50IHRoZSB2aWV3cG9ydCBzaG91bGQgYmUgc2Nyb2xsZWQgYmFzZWQgb24gaG93IGZhciBvdXQgb2YgdGhlXG4gICAqIHRlcm1pbmFsIHRoZSBtb3VzZSBpcy5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2dldE1vdXNlRXZlbnRTY3JvbGxBbW91bnQoZXZlbnQ6IE1vdXNlRXZlbnQpOiBudW1iZXIge1xuICAgIGxldCBvZmZzZXQgPSBnZXRDb29yZHNSZWxhdGl2ZVRvRWxlbWVudCh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LCBldmVudCwgdGhpcy5fc2NyZWVuRWxlbWVudClbMV07XG4gICAgY29uc3QgdGVybWluYWxIZWlnaHQgPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQ7XG4gICAgaWYgKG9mZnNldCA+PSAwICYmIG9mZnNldCA8PSB0ZXJtaW5hbEhlaWdodCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPiB0ZXJtaW5hbEhlaWdodCkge1xuICAgICAgb2Zmc2V0IC09IHRlcm1pbmFsSGVpZ2h0O1xuICAgIH1cblxuICAgIG9mZnNldCA9IE1hdGgubWluKE1hdGgubWF4KG9mZnNldCwgLURSQUdfU0NST0xMX01BWF9USFJFU0hPTEQpLCBEUkFHX1NDUk9MTF9NQVhfVEhSRVNIT0xEKTtcbiAgICBvZmZzZXQgLz0gRFJBR19TQ1JPTExfTUFYX1RIUkVTSE9MRDtcbiAgICByZXR1cm4gKG9mZnNldCAvIE1hdGguYWJzKG9mZnNldCkpICsgTWF0aC5yb3VuZChvZmZzZXQgKiAoRFJBR19TQ1JPTExfTUFYX1NQRUVEIC0gMSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgc2hvdWxkIGZvcmNlIHNlbGVjdGlvbiwgcmVnYXJkbGVzcyBvZlxuICAgKiB3aGV0aGVyIHRoZSB0ZXJtaW5hbCBpcyBpbiBtb3VzZSBldmVudHMgbW9kZS5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudC5cbiAgICovXG4gIHB1YmxpYyBzaG91bGRGb3JjZVNlbGVjdGlvbihldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChCcm93c2VyLmlzTWFjKSB7XG4gICAgICByZXR1cm4gZXZlbnQuYWx0S2V5ICYmIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubWFjT3B0aW9uQ2xpY2tGb3JjZXNTZWxlY3Rpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50LnNoaWZ0S2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGUgbW91c2Vkb3duIGV2ZW50LCBzZXR0aW5nIHVwIGZvciBhIG5ldyBzZWxlY3Rpb24uXG4gICAqIEBwYXJhbSBldmVudCBUaGUgbW91c2Vkb3duIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIGhhbmRsZU1vdXNlRG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX21vdXNlRG93blRpbWVTdGFtcCA9IGV2ZW50LnRpbWVTdGFtcDtcbiAgICAvLyBJZiB3ZSBoYXZlIHNlbGVjdGlvbiwgd2Ugd2FudCB0aGUgY29udGV4dCBtZW51IG9uIHJpZ2h0IGNsaWNrIGV2ZW4gaWYgdGhlXG4gICAgLy8gdGVybWluYWwgaXMgaW4gbW91c2UgbW9kZS5cbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAyICYmIHRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSBhY3Rpb24gdGhlIHByaW1hcnkgYnV0dG9uXG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFsbG93IHNlbGVjdGlvbiB3aGVuIHVzaW5nIGEgc3BlY2lmaWMgbW9kaWZpZXIga2V5LCBldmVuIHdoZW4gZGlzYWJsZWRcbiAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcbiAgICAgIGlmICghdGhpcy5zaG91bGRGb3JjZVNlbGVjdGlvbihldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBzZW5kIHRoZSBtb3VzZSBkb3duIGV2ZW50IHRvIHRoZSBjdXJyZW50IHByb2Nlc3MsIHdlIHdhbnQgdG8gc2VsZWN0XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBUZWxsIHRoZSBicm93c2VyIG5vdCB0byBzdGFydCBhIHJlZ3VsYXIgc2VsZWN0aW9uXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIFJlc2V0IGRyYWcgc2Nyb2xsIHN0YXRlXG4gICAgdGhpcy5fZHJhZ1Njcm9sbEFtb3VudCA9IDA7XG5cbiAgICBpZiAodGhpcy5fZW5hYmxlZCAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5faGFuZGxlSW5jcmVtZW50YWxDbGljayhldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChldmVudC5kZXRhaWwgPT09IDEpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlU2luZ2xlQ2xpY2soZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5kZXRhaWwgPT09IDIpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlRG91YmxlQ2xpY2soZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5kZXRhaWwgPT09IDMpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlVHJpcGxlQ2xpY2soZXZlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2FkZE1vdXNlRG93bkxpc3RlbmVycygpO1xuICAgIHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGxpc3RlbmVycyB3aGVuIG1vdXNlZG93biBpcyB0cmlnZ2VyZWQuXG4gICAqL1xuICBwcml2YXRlIF9hZGRNb3VzZURvd25MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gTGlzdGVuIG9uIHRoZSBkb2N1bWVudCBzbyB0aGF0IGRyYWdnaW5nIG91dHNpZGUgb2Ygdmlld3BvcnQgd29ya3NcbiAgICBpZiAodGhpcy5fc2NyZWVuRWxlbWVudC5vd25lckRvY3VtZW50KSB7XG4gICAgICB0aGlzLl9zY3JlZW5FbGVtZW50Lm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fbW91c2VNb3ZlTGlzdGVuZXIpO1xuICAgICAgdGhpcy5fc2NyZWVuRWxlbWVudC5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9tb3VzZVVwTGlzdGVuZXIpO1xuICAgIH1cbiAgICB0aGlzLl9kcmFnU2Nyb2xsSW50ZXJ2YWxUaW1lciA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5fZHJhZ1Njcm9sbCgpLCBEUkFHX1NDUk9MTF9JTlRFUlZBTCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXJzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2hlbiBtb3VzZWRvd24gaXMgdHJpZ2dlcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVtb3ZlTW91c2VEb3duTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zY3JlZW5FbGVtZW50Lm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIHRoaXMuX3NjcmVlbkVsZW1lbnQub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9tb3VzZU1vdmVMaXN0ZW5lcik7XG4gICAgICB0aGlzLl9zY3JlZW5FbGVtZW50Lm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX21vdXNlVXBMaXN0ZW5lcik7XG4gICAgfVxuICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9kcmFnU2Nyb2xsSW50ZXJ2YWxUaW1lcik7XG4gICAgdGhpcy5fZHJhZ1Njcm9sbEludGVydmFsVGltZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYW4gaW5jcmVtZW50YWwgY2xpY2ssIHNldHRpbmcgdGhlIHNlbGVjdGlvbiBlbmQgcG9zaXRpb24gdG8gdGhlIG1vdXNlXG4gICAqIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlIGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlSW5jcmVtZW50YWxDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydCkge1xuICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gdGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIHNpbmdsZSBjbGljaywgcmVzZXR0aW5nIHJlbGV2YW50IHN0YXRlIGFuZCBzZXR0aW5nIHRoZSBzZWxlY3Rpb25cbiAgICogc3RhcnQgcG9zaXRpb24uXG4gICAqIEBwYXJhbSBldmVudCBUaGUgbW91c2UgZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVTaW5nbGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0TGVuZ3RoID0gMDtcbiAgICB0aGlzLl9tb2RlbC5pc1NlbGVjdEFsbEFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUgPSB0aGlzLnNob3VsZENvbHVtblNlbGVjdChldmVudCkgPyBTZWxlY3Rpb25Nb2RlLkNPTFVNTiA6IFNlbGVjdGlvbk1vZGUuTk9STUFMO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgbmV3IHNlbGVjdGlvblxuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0ID0gdGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQpO1xuICAgIGlmICghdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBsaW5lIGV4aXN0c1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5nZXQodGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRbMV0pO1xuICAgIGlmICghbGluZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBlYXJseSBpZiB0aGUgY2xpY2sgZXZlbnQgaXMgbm90IGluIHRoZSBidWZmZXIgKGVnLiBpbiBzY3JvbGwgYmFyKVxuICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRbMF0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbW91c2UgaXMgb3ZlciB0aGUgc2Vjb25kIGhhbGYgb2YgYSB3aWRlIGNoYXJhY3RlciwgYWRqdXN0IHRoZVxuICAgIC8vIHNlbGVjdGlvbiB0byBjb3ZlciB0aGUgd2hvbGUgY2hhcmFjdGVyXG4gICAgaWYgKGxpbmUuaGFzV2lkdGgodGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRbMF0pID09PSAwKSB7XG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydFswXSsrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIGRvdWJsZSBjbGljaywgc2VsZWN0aW5nIHRoZSBjdXJyZW50IHdvcmQuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgbW91c2UgZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVEb3VibGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zZWxlY3RXb3JkQXRDdXJzb3IoZXZlbnQsIHRydWUpKSB7XG4gICAgICB0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5XT1JEO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIHRyaXBsZSBjbGljaywgc2VsZWN0aW5nIHRoZSBjdXJyZW50IGxpbmUgYW5kIGFjdGl2YXRpbmcgbGluZVxuICAgKiBzZWxlY3QgbW9kZS5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVRyaXBsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY29vcmRzID0gdGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZXZlbnQpO1xuICAgIGlmIChjb29yZHMpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2RlLkxJTkU7XG4gICAgICB0aGlzLl9zZWxlY3RMaW5lQXQoY29vcmRzWzFdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBzaG91bGQgb3BlcmF0ZSBpbiBjb2x1bW4gc2VsZWN0IG1vZGVcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBvciBrZXlib2FyZCBldmVudFxuICAgKi9cbiAgcHVibGljIHNob3VsZENvbHVtblNlbGVjdChldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZlbnQuYWx0S2V5ICYmICEoQnJvd3Nlci5pc01hYyAmJiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLm1hY09wdGlvbkNsaWNrRm9yY2VzU2VsZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBtb3VzZW1vdmUgZXZlbnQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIGRvd24sIHJlY29yZGluZyB0aGVcbiAgICogZW5kIG9mIHRoZSBzZWxlY3Rpb24gYW5kIHJlZnJlc2hpbmcgdGhlIHNlbGVjdGlvbi5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZW1vdmUgZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgbW91c2Vtb3ZlIGxpc3RlbmVyIGlzIGFjdGl2ZSBpdCBtZWFucyB0aGF0IGEgc2VsZWN0aW9uIGlzXG4gICAgLy8gY3VycmVudGx5IGJlaW5nIG1hZGUsIHdlIHNob3VsZCBzdG9wIHByb3BhZ2F0aW9uIHRvIHByZXZlbnQgbW91c2UgZXZlbnRzXG4gICAgLy8gdG8gYmUgc2VudCB0byB0aGUgcHR5LlxuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gRG8gbm90aGluZyBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24gc3RhcnQsIHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgZmlyc3RcbiAgICAvLyBjbGljayBpbiB0aGUgdGVybWluYWwgaXMgYW4gaW5jcmVtZW50YWwgY2xpY2tcbiAgICBpZiAoIXRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVjb3JkIHRoZSBwcmV2aW91cyBwb3NpdGlvbiBzbyB3ZSBrbm93IHdoZXRoZXIgdG8gcmVkcmF3IHRoZSBzZWxlY3Rpb25cbiAgICAvLyBhdCB0aGUgZW5kLlxuICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0aW9uRW5kID0gdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID8gW3RoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSwgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzFdXSA6IG51bGw7XG5cbiAgICAvLyBTZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uIGVuZCBiYXNlZCBvbiB0aGUgbW91c2UgY29vcmRpbmF0ZXNcbiAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQgPSB0aGlzLl9nZXRNb3VzZUJ1ZmZlckNvb3JkcyhldmVudCk7XG4gICAgaWYgKCF0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQpIHtcbiAgICAgIHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZWxlY3QgdGhlIGVudGlyZSBsaW5lIGlmIGxpbmUgc2VsZWN0IG1vZGUgaXMgYWN0aXZlLlxuICAgIGlmICh0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkxJTkUpIHtcbiAgICAgIGlmICh0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMV0gPCB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydFsxXSkge1xuICAgICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMF0gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5XT1JEKSB7XG4gICAgICB0aGlzLl9zZWxlY3RUb1dvcmRBdCh0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQpO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB0aGUgYW1vdW50IG9mIHNjcm9sbGluZyB0aGF0IHdpbGwgaGFwcGVuLlxuICAgIHRoaXMuX2RyYWdTY3JvbGxBbW91bnQgPSB0aGlzLl9nZXRNb3VzZUV2ZW50U2Nyb2xsQW1vdW50KGV2ZW50KTtcblxuICAgIC8vIElmIHRoZSBjdXJzb3Igd2FzIGFib3ZlIG9yIGJlbG93IHRoZSB2aWV3cG9ydCwgbWFrZSBzdXJlIGl0J3MgYXQgdGhlXG4gICAgLy8gc3RhcnQgb3IgZW5kIG9mIHRoZSB2aWV3cG9ydCByZXNwZWN0aXZlbHkuIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW5cbiAgICAvLyBOT1QgaW4gY29sdW1uIHNlbGVjdCBtb2RlLlxuICAgIGlmICh0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlICE9PSBTZWxlY3Rpb25Nb2RlLkNPTFVNTikge1xuICAgICAgaWYgKHRoaXMuX2RyYWdTY3JvbGxBbW91bnQgPiAwKSB7XG4gICAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fZHJhZ1Njcm9sbEFtb3VudCA8IDApIHtcbiAgICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIGEgd2lkZSBjaGFyYWN0ZXIgaW5jbHVkZSB0aGUgY2VsbCB0byB0aGUgcmlnaHQgaW4gdGhlXG4gICAgLy8gc2VsZWN0aW9uLiBOb3RlIHRoYXQgc2VsZWN0aW9ucyBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGxpbmUgd2lsbCBuZXZlclxuICAgIC8vIGhhdmUgYSBjaGFyYWN0ZXIuXG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgaWYgKHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFsxXSA8IGJ1ZmZlci5saW5lcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBidWZmZXIubGluZXMuZ2V0KHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFsxXSk7XG4gICAgICBpZiAobGluZSAmJiBsaW5lLmhhc1dpZHRoKHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSkgPT09IDApIHtcbiAgICAgICAgaWYgKHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSA8IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scykge1xuICAgICAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBkcmF3IGhlcmUgaWYgdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLlxuICAgIGlmICghcHJldmlvdXNTZWxlY3Rpb25FbmQgfHxcbiAgICAgIHByZXZpb3VzU2VsZWN0aW9uRW5kWzBdICE9PSB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMF0gfHxcbiAgICAgIHByZXZpb3VzU2VsZWN0aW9uRW5kWzFdICE9PSB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMV0pIHtcbiAgICAgIHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIHRoYXQgb2NjdXJzIGV2ZXJ5IERSQUdfU0NST0xMX0lOVEVSVkFMIG1zIHRoYXQgZG9lcyB0aGVcbiAgICogc2Nyb2xsaW5nIG9mIHRoZSB2aWV3cG9ydC5cbiAgICovXG4gIHByaXZhdGUgX2RyYWdTY3JvbGwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQgfHwgIXRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9kcmFnU2Nyb2xsQW1vdW50KSB7XG4gICAgICB0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5maXJlKHsgYW1vdW50OiB0aGlzLl9kcmFnU2Nyb2xsQW1vdW50LCBzdXBwcmVzc1Njcm9sbEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIC8vIFJlLWV2YWx1YXRlIHNlbGVjdGlvblxuICAgICAgLy8gSWYgdGhlIGN1cnNvciB3YXMgYWJvdmUgb3IgYmVsb3cgdGhlIHZpZXdwb3J0LCBtYWtlIHN1cmUgaXQncyBhdCB0aGVcbiAgICAgIC8vIHN0YXJ0IG9yIGVuZCBvZiB0aGUgdmlld3BvcnQgcmVzcGVjdGl2ZWx5LiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiB3aGVuXG4gICAgICAvLyBOT1QgaW4gY29sdW1uIHNlbGVjdCBtb2RlLlxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgICBpZiAodGhpcy5fZHJhZ1Njcm9sbEFtb3VudCA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUgIT09IFNlbGVjdGlvbk1vZGUuQ09MVU1OKSB7XG4gICAgICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFsxXSA9IE1hdGgubWluKGJ1ZmZlci55ZGlzcCArIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cywgYnVmZmVyLmxpbmVzLmxlbmd0aCAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUgIT09IFNlbGVjdGlvbk1vZGUuQ09MVU1OKSB7XG4gICAgICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMV0gPSBidWZmZXIueWRpc3A7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgbW91c2V1cCBldmVudCwgcmVtb3ZpbmcgdGhlIG1vdXNlZG93biBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgbW91c2V1cCBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZU1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lRWxhcHNlZCA9IGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX21vdXNlRG93blRpbWVTdGFtcDtcblxuICAgIHRoaXMuX3JlbW92ZU1vdXNlRG93bkxpc3RlbmVycygpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uVGV4dC5sZW5ndGggPD0gMSAmJiB0aW1lRWxhcHNlZCA8IEFMVF9DTElDS19NT1ZFX0NVUlNPUl9USU1FICYmIGV2ZW50LmFsdEtleSAmJiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmFsdENsaWNrTW92ZXNDdXJzb3IpIHtcbiAgICAgIGlmICh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55YmFzZSA9PT0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3ApIHtcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSB0aGlzLl9tb3VzZVNlcnZpY2UuZ2V0Q29vcmRzKFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHRoaXMuX2VsZW1lbnQsXG4gICAgICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLFxuICAgICAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgICBpZiAoY29vcmRpbmF0ZXMgJiYgY29vcmRpbmF0ZXNbMF0gIT09IHVuZGVmaW5lZCAmJiBjb29yZGluYXRlc1sxXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgc2VxdWVuY2UgPSBtb3ZlVG9DZWxsU2VxdWVuY2UoY29vcmRpbmF0ZXNbMF0gLSAxLCBjb29yZGluYXRlc1sxXSAtIDEsIHRoaXMuX2J1ZmZlclNlcnZpY2UsIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbkN1cnNvcktleXMpO1xuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoc2VxdWVuY2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ZpcmVFdmVudElmU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVFdmVudElmU2VsZWN0aW9uQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uU3RhcnQ7XG4gICAgY29uc3QgZW5kID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25FbmQ7XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gISFzdGFydCAmJiAhIWVuZCAmJiAoc3RhcnRbMF0gIT09IGVuZFswXSB8fCBzdGFydFsxXSAhPT0gZW5kWzFdKTtcblxuICAgIGlmICghaGFzU2VsZWN0aW9uKSB7XG4gICAgICBpZiAodGhpcy5fb2xkSGFzU2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVPblNlbGVjdGlvbkNoYW5nZShzdGFydCwgZW5kLCBoYXNTZWxlY3Rpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNhbml0eSBjaGVjaywgdGhlc2Ugc2hvdWxkIG5vdCBiZSB1bmRlZmluZWQgYXMgdGhlcmUgaXMgYSBzZWxlY3Rpb25cbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX29sZFNlbGVjdGlvblN0YXJ0IHx8ICF0aGlzLl9vbGRTZWxlY3Rpb25FbmQgfHwgKFxuICAgICAgc3RhcnRbMF0gIT09IHRoaXMuX29sZFNlbGVjdGlvblN0YXJ0WzBdIHx8IHN0YXJ0WzFdICE9PSB0aGlzLl9vbGRTZWxlY3Rpb25TdGFydFsxXSB8fFxuICAgICAgZW5kWzBdICE9PSB0aGlzLl9vbGRTZWxlY3Rpb25FbmRbMF0gfHwgZW5kWzFdICE9PSB0aGlzLl9vbGRTZWxlY3Rpb25FbmRbMV0pKSB7XG5cbiAgICAgIHRoaXMuX2ZpcmVPblNlbGVjdGlvbkNoYW5nZShzdGFydCwgZW5kLCBoYXNTZWxlY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVPblNlbGVjdGlvbkNoYW5nZShzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBoYXNTZWxlY3Rpb246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9vbGRTZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuX29sZFNlbGVjdGlvbkVuZCA9IGVuZDtcbiAgICB0aGlzLl9vbGRIYXNTZWxlY3Rpb24gPSBoYXNTZWxlY3Rpb247XG4gICAgdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UuZmlyZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQnVmZmVyQWN0aXZhdGUoZToge2FjdGl2ZUJ1ZmZlcjogSUJ1ZmZlciwgaW5hY3RpdmVCdWZmZXI6IElCdWZmZXJ9KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIC8vIE9ubHkgYWRqdXN0IHRoZSBzZWxlY3Rpb24gb24gdHJpbSwgc2hpZnRFbGVtZW50cyBpcyByYXJlbHkgdXNlZCAob25seSBpblxuICAgIC8vIHJldmVyc2VJbmRleCkgYW5kIGRlbGV0ZSBpbiBhIHNwbGljZSBpcyBvbmx5IGV2ZXIgdXNlZCB3aGVuIHRoZSBzYW1lXG4gICAgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIHdhcyBqdXN0IGFkZGVkLiBHaXZlbiB0aGlzIGlzIGNvdWxkIGFjdHVhbGx5IGJlXG4gICAgLy8gYmVuZWZpY2lhbCB0byBsZWF2ZSB0aGUgc2VsZWN0aW9uIGFzIGlzIGZvciB0aGVzZSBjYXNlcy5cbiAgICB0aGlzLl90cmltTGlzdGVuZXIuZGlzcG9zZSgpO1xuICAgIHRoaXMuX3RyaW1MaXN0ZW5lciA9IGUuYWN0aXZlQnVmZmVyLmxpbmVzLm9uVHJpbShhbW91bnQgPT4gdGhpcy5faGFuZGxlVHJpbShhbW91bnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHZpZXdwb3J0IGNvbHVtbiAoMCB0byBjb2xzIC0gMSkgdG8gdGhlIGNoYXJhY3RlciBpbmRleCBvbiB0aGVcbiAgICogYnVmZmVyIGxpbmUsIHRoZSBsYXR0ZXIgdGFrZXMgaW50byBhY2NvdW50IHdpZGUgYW5kIG51bGwgY2hhcmFjdGVycy5cbiAgICogQHBhcmFtIGJ1ZmZlckxpbmUgVGhlIGJ1ZmZlciBsaW5lIHRvIHVzZS5cbiAgICogQHBhcmFtIHggVGhlIHggaW5kZXggaW4gdGhlIGJ1ZmZlciBsaW5lIHRvIGNvbnZlcnQuXG4gICAqL1xuICBwcml2YXRlIF9jb252ZXJ0Vmlld3BvcnRDb2xUb0NoYXJhY3RlckluZGV4KGJ1ZmZlckxpbmU6IElCdWZmZXJMaW5lLCB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBjaGFySW5kZXggPSB4O1xuICAgIGZvciAobGV0IGkgPSAwOyB4ID49IGk7IGkrKykge1xuICAgICAgY29uc3QgbGVuZ3RoID0gYnVmZmVyTGluZS5sb2FkQ2VsbChpLCB0aGlzLl93b3JrQ2VsbCkuZ2V0Q2hhcnMoKS5sZW5ndGg7XG4gICAgICBpZiAodGhpcy5fd29ya0NlbGwuZ2V0V2lkdGgoKSA9PT0gMCkge1xuICAgICAgICAvLyBXaWRlIGNoYXJhY3RlcnMgYXJlbid0IGluY2x1ZGVkIGluIHRoZSBsaW5lIHN0cmluZyBzbyBkZWNyZW1lbnQgdGhlXG4gICAgICAgIC8vIGluZGV4IHNvIHRoZSBpbmRleCBpcyBiYWNrIG9uIHRoZSB3aWRlIGNoYXJhY3Rlci5cbiAgICAgICAgY2hhckluZGV4LS07XG4gICAgICB9IGVsc2UgaWYgKGxlbmd0aCA+IDEgJiYgeCAhPT0gaSkge1xuICAgICAgICAvLyBFbW9qaXMgdGFrZSB1cCBtdWx0aXBsZSBjaGFyYWN0ZXJzLCBzbyBhZGp1c3QgYWNjb3JkaW5nbHkuIEZvciB0aGVzZVxuICAgICAgICAvLyB3ZSBkb24ndCB3YW50IG90IGluY2x1ZGUgdGhlIGNoYXJhY3RlciBhdCB0aGUgY29sdW1uIGFzIHdlJ3JlXG4gICAgICAgIC8vIHJldHVybmluZyB0aGUgc3RhcnQgaW5kZXggaW4gdGhlIHN0cmluZywgbm90IHRoZSBlbmQgaW5kZXguXG4gICAgICAgIGNoYXJJbmRleCArPSBsZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hhckluZGV4O1xuICB9XG5cbiAgcHVibGljIHNldFNlbGVjdGlvbihjb2w6IG51bWJlciwgcm93OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fbW9kZWwuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB0aGlzLl9yZW1vdmVNb3VzZURvd25MaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydCA9IFtjb2wsIHJvd107XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRMZW5ndGggPSBsZW5ndGg7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgdGhpcy5fZmlyZUV2ZW50SWZTZWxlY3Rpb25DaGFuZ2VkKCk7XG4gIH1cblxuICBwdWJsaWMgcmlnaHRDbGlja1NlbGVjdChldjogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNDbGlja0luU2VsZWN0aW9uKGV2KSkge1xuICAgICAgaWYgKHRoaXMuX3NlbGVjdFdvcmRBdEN1cnNvcihldiwgZmFsc2UpKSB7XG4gICAgICAgIHRoaXMucmVmcmVzaCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpcmVFdmVudElmU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHBvc2l0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSB3b3JkIGF0IHRoZSBjb29yZGluYXRlZCBzcGVjaWZpZWQuXG4gICAqIEBwYXJhbSBjb29yZHMgVGhlIGNvb3JkaW5hdGVzIHRvIGdldCB0aGUgd29yZCBhdC5cbiAgICovXG4gIHByaXZhdGUgX2dldFdvcmRBdChjb29yZHM6IFtudW1iZXIsIG51bWJlcl0sIGFsbG93V2hpdGVzcGFjZU9ubHlTZWxlY3Rpb246IGJvb2xlYW4sIGZvbGxvd1dyYXBwZWRMaW5lc0Fib3ZlOiBib29sZWFuID0gdHJ1ZSwgZm9sbG93V3JhcHBlZExpbmVzQmVsb3c6IGJvb2xlYW4gPSB0cnVlKTogSVdvcmRQb3NpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgLy8gRW5zdXJlIGNvb3JkcyBhcmUgd2l0aGluIHZpZXdwb3J0IChlZy4gbm90IHdpdGhpbiBzY3JvbGwgYmFyKVxuICAgIGlmIChjb29yZHNbMF0gPj0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmZlckxpbmUgPSBidWZmZXIubGluZXMuZ2V0KGNvb3Jkc1sxXSk7XG4gICAgaWYgKCFidWZmZXJMaW5lKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmUgPSBidWZmZXIudHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nKGNvb3Jkc1sxXSwgZmFsc2UpO1xuXG4gICAgLy8gR2V0IGFjdHVhbCBpbmRleCwgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiB3aWRlIGNoYXJhY3RlcnNcbiAgICBsZXQgc3RhcnRJbmRleCA9IHRoaXMuX2NvbnZlcnRWaWV3cG9ydENvbFRvQ2hhcmFjdGVySW5kZXgoYnVmZmVyTGluZSwgY29vcmRzWzBdKTtcbiAgICBsZXQgZW5kSW5kZXggPSBzdGFydEluZGV4O1xuXG4gICAgLy8gUmVjb3JkIG9mZnNldCB0byBiZSB1c2VkIGxhdGVyXG4gICAgY29uc3QgY2hhck9mZnNldCA9IGNvb3Jkc1swXSAtIHN0YXJ0SW5kZXg7XG4gICAgbGV0IGxlZnRXaWRlQ2hhckNvdW50ID0gMDtcbiAgICBsZXQgcmlnaHRXaWRlQ2hhckNvdW50ID0gMDtcbiAgICBsZXQgbGVmdExvbmdDaGFyT2Zmc2V0ID0gMDtcbiAgICBsZXQgcmlnaHRMb25nQ2hhck9mZnNldCA9IDA7XG5cbiAgICBpZiAobGluZS5jaGFyQXQoc3RhcnRJbmRleCkgPT09ICcgJykge1xuICAgICAgLy8gRXhwYW5kIHVudGlsIG5vbi13aGl0ZXNwYWNlIGlzIGhpdFxuICAgICAgd2hpbGUgKHN0YXJ0SW5kZXggPiAwICYmIGxpbmUuY2hhckF0KHN0YXJ0SW5kZXggLSAxKSA9PT0gJyAnKSB7XG4gICAgICAgIHN0YXJ0SW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbmRJbmRleCA8IGxpbmUubGVuZ3RoICYmIGxpbmUuY2hhckF0KGVuZEluZGV4ICsgMSkgPT09ICcgJykge1xuICAgICAgICBlbmRJbmRleCsrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFeHBhbmQgdW50aWwgd2hpdGVzcGFjZSBpcyBoaXQuIFRoaXMgYWxnb3JpdGhtIHdvcmtzIGJ5IHNjYW5uaW5nIGxlZnRcbiAgICAgIC8vIGFuZCByaWdodCBmcm9tIHRoZSBzdGFydGluZyBwb3NpdGlvbiwga2VlcGluZyBib3RoIHRoZSBpbmRleCBmb3JtYXRcbiAgICAgIC8vIChsaW5lKSBhbmQgdGhlIGNvbHVtbiBmb3JtYXQgKGJ1ZmZlckxpbmUpIGluIHN5bmMuIFdoZW4gYSB3aWRlXG4gICAgICAvLyBjaGFyYWN0ZXIgaXMgaGl0LCBpdCBpcyByZWNvcmRlZCBhbmQgdGhlIGNvbHVtbiBpbmRleCBpcyBhZGp1c3RlZC5cbiAgICAgIGxldCBzdGFydENvbCA9IGNvb3Jkc1swXTtcbiAgICAgIGxldCBlbmRDb2wgPSBjb29yZHNbMF07XG5cbiAgICAgIC8vIENvbnNpZGVyIHRoZSBpbml0aWFsIHBvc2l0aW9uLCBza2lwIGl0IGFuZCBpbmNyZW1lbnQgdGhlIHdpZGUgY2hhclxuICAgICAgLy8gdmFyaWFibGVcbiAgICAgIGlmIChidWZmZXJMaW5lLmdldFdpZHRoKHN0YXJ0Q29sKSA9PT0gMCkge1xuICAgICAgICBsZWZ0V2lkZUNoYXJDb3VudCsrO1xuICAgICAgICBzdGFydENvbC0tO1xuICAgICAgfVxuICAgICAgaWYgKGJ1ZmZlckxpbmUuZ2V0V2lkdGgoZW5kQ29sKSA9PT0gMikge1xuICAgICAgICByaWdodFdpZGVDaGFyQ291bnQrKztcbiAgICAgICAgZW5kQ29sKys7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkanVzdCB0aGUgZW5kIGluZGV4IGZvciBjaGFyYWN0ZXJzIHdob3NlIGxlbmd0aCBhcmUgPiAxIChlbW9qaXMpXG4gICAgICBjb25zdCBsZW5ndGggPSBidWZmZXJMaW5lLmdldFN0cmluZyhlbmRDb2wpLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAxKSB7XG4gICAgICAgIHJpZ2h0TG9uZ0NoYXJPZmZzZXQgKz0gbGVuZ3RoIC0gMTtcbiAgICAgICAgZW5kSW5kZXggKz0gbGVuZ3RoIC0gMTtcbiAgICAgIH1cblxuICAgICAgLy8gRXhwYW5kIHRoZSBzdHJpbmcgaW4gYm90aCBkaXJlY3Rpb25zIHVudGlsIGEgc3BhY2UgaXMgaGl0XG4gICAgICB3aGlsZSAoc3RhcnRDb2wgPiAwICYmIHN0YXJ0SW5kZXggPiAwICYmICF0aGlzLl9pc0NoYXJXb3JkU2VwYXJhdG9yKGJ1ZmZlckxpbmUubG9hZENlbGwoc3RhcnRDb2wgLSAxLCB0aGlzLl93b3JrQ2VsbCkpKSB7XG4gICAgICAgIGJ1ZmZlckxpbmUubG9hZENlbGwoc3RhcnRDb2wgLSAxLCB0aGlzLl93b3JrQ2VsbCk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuX3dvcmtDZWxsLmdldENoYXJzKCkubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5fd29ya0NlbGwuZ2V0V2lkdGgoKSA9PT0gMCkge1xuICAgICAgICAgIC8vIElmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhIHdpZGUgY2hhciwgcmVjb3JkIGl0IGFuZCBza2lwIHRoZSBjb2x1bW5cbiAgICAgICAgICBsZWZ0V2lkZUNoYXJDb3VudCsrO1xuICAgICAgICAgIHN0YXJ0Q29sLS07XG4gICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIElmIHRoZSBuZXh0IGNoYXJhY3RlcidzIHN0cmluZyBpcyBsb25nZXIgdGhhbiAxIGNoYXIgKGVnLiBlbW9qaSksXG4gICAgICAgICAgLy8gYWRqdXN0IHRoZSBpbmRleFxuICAgICAgICAgIGxlZnRMb25nQ2hhck9mZnNldCArPSBsZW5ndGggLSAxO1xuICAgICAgICAgIHN0YXJ0SW5kZXggLT0gbGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydEluZGV4LS07XG4gICAgICAgIHN0YXJ0Q29sLS07XG4gICAgICB9XG4gICAgICB3aGlsZSAoZW5kQ29sIDwgYnVmZmVyTGluZS5sZW5ndGggJiYgZW5kSW5kZXggKyAxIDwgbGluZS5sZW5ndGggJiYgIXRoaXMuX2lzQ2hhcldvcmRTZXBhcmF0b3IoYnVmZmVyTGluZS5sb2FkQ2VsbChlbmRDb2wgKyAxLCB0aGlzLl93b3JrQ2VsbCkpKSB7XG4gICAgICAgIGJ1ZmZlckxpbmUubG9hZENlbGwoZW5kQ29sICsgMSwgdGhpcy5fd29ya0NlbGwpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLl93b3JrQ2VsbC5nZXRDaGFycygpLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtDZWxsLmdldFdpZHRoKCkgPT09IDIpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYSB3aWRlIGNoYXIsIHJlY29yZCBpdCBhbmQgc2tpcCB0aGUgY29sdW1uXG4gICAgICAgICAgcmlnaHRXaWRlQ2hhckNvdW50Kys7XG4gICAgICAgICAgZW5kQ29sKys7XG4gICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIElmIHRoZSBuZXh0IGNoYXJhY3RlcidzIHN0cmluZyBpcyBsb25nZXIgdGhhbiAxIGNoYXIgKGVnLiBlbW9qaSksXG4gICAgICAgICAgLy8gYWRqdXN0IHRoZSBpbmRleFxuICAgICAgICAgIHJpZ2h0TG9uZ0NoYXJPZmZzZXQgKz0gbGVuZ3RoIC0gMTtcbiAgICAgICAgICBlbmRJbmRleCArPSBsZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIGVuZEluZGV4Kys7XG4gICAgICAgIGVuZENvbCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluY3JlbWVuZXQgdGhlIGVuZCBpbmRleCBzbyBpdCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY2hhcmFjdGVyXG4gICAgZW5kSW5kZXgrKztcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3RhcnQgX2NvbHVtbl8sIGNvbnZlcnRpbmcgdGhlIHRoZSBzdHJpbmcgaW5kZXhlcyBiYWNrIHRvXG4gICAgLy8gY29sdW1uIGNvb3JkaW5hdGVzLlxuICAgIGxldCBzdGFydCA9XG4gICAgICAgIHN0YXJ0SW5kZXggLy8gVGhlIGluZGV4IG9mIHRoZSBzZWxlY3Rpb24ncyBzdGFydCBjaGFyIGluIHRoZSBsaW5lIHN0cmluZ1xuICAgICAgICArIGNoYXJPZmZzZXQgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaW5pdGlhbCBjaGFyJ3MgY29sdW1uIGFuZCBpbmRleFxuICAgICAgICAtIGxlZnRXaWRlQ2hhckNvdW50IC8vIFRoZSBudW1iZXIgb2Ygd2lkZSBjaGFycyBsZWZ0IG9mIHRoZSBpbml0aWFsIGNoYXJcbiAgICAgICAgKyBsZWZ0TG9uZ0NoYXJPZmZzZXQ7IC8vIFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBjaGFycyBsZWZ0IG9mIHRoZSBpbml0aWFsIGNoYXIgYWRkZWQgYnkgY29sdW1ucyB3aXRoIHN0cmluZ3MgbG9uZ2VyIHRoYW4gMSAoZW1vamlzKVxuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBsZW5ndGggaW4gX2NvbHVtbnNfLCBjb252ZXJ0aW5nIHRoZSB0aGUgc3RyaW5nIGluZGV4ZXMgYmFja1xuICAgIC8vIHRvIGNvbHVtbiBjb29yZGluYXRlcy5cbiAgICBsZXQgbGVuZ3RoID0gTWF0aC5taW4odGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCAvLyBEaXNhbGxvdyBsZW5ndGhzIGxhcmdlciB0aGFuIHRoZSB0ZXJtaW5hbCBjb2xzXG4gICAgICBlbmRJbmRleCAvLyBUaGUgaW5kZXggb2YgdGhlIHNlbGVjdGlvbidzIGVuZCBjaGFyIGluIHRoZSBsaW5lIHN0cmluZ1xuICAgICAgLSBzdGFydEluZGV4IC8vIFRoZSBpbmRleCBvZiB0aGUgc2VsZWN0aW9uJ3Mgc3RhcnQgY2hhciBpbiB0aGUgbGluZSBzdHJpbmdcbiAgICAgICsgbGVmdFdpZGVDaGFyQ291bnQgLy8gVGhlIG51bWJlciBvZiB3aWRlIGNoYXJzIGxlZnQgb2YgdGhlIGluaXRpYWwgY2hhclxuICAgICAgKyByaWdodFdpZGVDaGFyQ291bnQgLy8gVGhlIG51bWJlciBvZiB3aWRlIGNoYXJzIHJpZ2h0IG9mIHRoZSBpbml0aWFsIGNoYXIgKGluY2x1c2l2ZSlcbiAgICAgIC0gbGVmdExvbmdDaGFyT2Zmc2V0IC8vIFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBjaGFycyBsZWZ0IG9mIHRoZSBpbml0aWFsIGNoYXIgYWRkZWQgYnkgY29sdW1ucyB3aXRoIHN0cmluZ3MgbG9uZ2VyIHRoYW4gMSAoZW1vamlzKVxuICAgICAgLSByaWdodExvbmdDaGFyT2Zmc2V0KTsgLy8gVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNoYXJzIHJpZ2h0IG9mIHRoZSBpbml0aWFsIGNoYXIgKGluY2x1c2l2ZSkgYWRkZWQgYnkgY29sdW1ucyB3aXRoIHN0cmluZ3MgbG9uZ2VyIHRoYW4gMSAoZW1vamlzKVxuXG4gICAgaWYgKCFhbGxvd1doaXRlc3BhY2VPbmx5U2VsZWN0aW9uICYmIGxpbmUuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gUmVjdXJzZSB1cHdhcmRzIGlmIHRoZSBsaW5lIGlzIHdyYXBwZWQgYW5kIHRoZSB3b3JkIHdyYXBzIHRvIHRoZSBhYm92ZSBsaW5lXG4gICAgaWYgKGZvbGxvd1dyYXBwZWRMaW5lc0Fib3ZlKSB7XG4gICAgICBpZiAoc3RhcnQgPT09IDAgJiYgYnVmZmVyTGluZS5nZXRDb2RlUG9pbnQoMCkgIT09IDMyIC8qICcgJyAqLykge1xuICAgICAgICBjb25zdCBwcmV2aW91c0J1ZmZlckxpbmUgPSBidWZmZXIubGluZXMuZ2V0KGNvb3Jkc1sxXSAtIDEpO1xuICAgICAgICBpZiAocHJldmlvdXNCdWZmZXJMaW5lICYmIGJ1ZmZlckxpbmUuaXNXcmFwcGVkICYmIHByZXZpb3VzQnVmZmVyTGluZS5nZXRDb2RlUG9pbnQodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gMSkgIT09IDMyIC8qICcgJyAqLykge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzTGluZVdvcmRQb3NpdGlvbiA9IHRoaXMuX2dldFdvcmRBdChbdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gMSwgY29vcmRzWzFdIC0gMV0sIGZhbHNlLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgaWYgKHByZXZpb3VzTGluZVdvcmRQb3NpdGlvbikge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gcHJldmlvdXNMaW5lV29yZFBvc2l0aW9uLnN0YXJ0O1xuICAgICAgICAgICAgc3RhcnQgLT0gb2Zmc2V0O1xuICAgICAgICAgICAgbGVuZ3RoICs9IG9mZnNldDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWN1cnNlIGRvd253YXJkcyBpZiB0aGUgbGluZSBpcyB3cmFwcGVkIGFuZCB0aGUgd29yZCB3cmFwcyB0byB0aGUgbmV4dCBsaW5lXG4gICAgaWYgKGZvbGxvd1dyYXBwZWRMaW5lc0JlbG93KSB7XG4gICAgICBpZiAoc3RhcnQgKyBsZW5ndGggPT09IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyAmJiBidWZmZXJMaW5lLmdldENvZGVQb2ludCh0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxKSAhPT0gMzIgLyogJyAnICovKSB7XG4gICAgICAgIGNvbnN0IG5leHRCdWZmZXJMaW5lID0gYnVmZmVyLmxpbmVzLmdldChjb29yZHNbMV0gKyAxKTtcbiAgICAgICAgaWYgKG5leHRCdWZmZXJMaW5lPy5pc1dyYXBwZWQgJiYgbmV4dEJ1ZmZlckxpbmUuZ2V0Q29kZVBvaW50KDApICE9PSAzMiAvKiAnICcgKi8pIHtcbiAgICAgICAgICBjb25zdCBuZXh0TGluZVdvcmRQb3NpdGlvbiA9IHRoaXMuX2dldFdvcmRBdChbMCwgY29vcmRzWzFdICsgMV0sIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgaWYgKG5leHRMaW5lV29yZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBsZW5ndGggKz0gbmV4dExpbmVXb3JkUG9zaXRpb24ubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHN0YXJ0LCBsZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSB3b3JkIGF0IHRoZSBjb29yZGluYXRlcyBzcGVjaWZpZWQuXG4gICAqIEBwYXJhbSBjb29yZHMgVGhlIGNvb3JkaW5hdGVzIHRvIGdldCB0aGUgd29yZCBhdC5cbiAgICogQHBhcmFtIGFsbG93V2hpdGVzcGFjZU9ubHlTZWxlY3Rpb24gSWYgd2hpdGVzcGFjZSBzaG91bGQgYmUgc2VsZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBfc2VsZWN0V29yZEF0KGNvb3JkczogW251bWJlciwgbnVtYmVyXSwgYWxsb3dXaGl0ZXNwYWNlT25seVNlbGVjdGlvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmRQb3NpdGlvbiA9IHRoaXMuX2dldFdvcmRBdChjb29yZHMsIGFsbG93V2hpdGVzcGFjZU9ubHlTZWxlY3Rpb24pO1xuICAgIGlmICh3b3JkUG9zaXRpb24pIHtcbiAgICAgIC8vIEFkanVzdCBuZWdhdGl2ZSBzdGFydCB2YWx1ZVxuICAgICAgd2hpbGUgKHdvcmRQb3NpdGlvbi5zdGFydCA8IDApIHtcbiAgICAgICAgd29yZFBvc2l0aW9uLnN0YXJ0ICs9IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztcbiAgICAgICAgY29vcmRzWzFdLS07XG4gICAgICB9XG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydCA9IFt3b3JkUG9zaXRpb24uc3RhcnQsIGNvb3Jkc1sxXV07XG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydExlbmd0aCA9IHdvcmRQb3NpdGlvbi5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNlbGVjdGlvbiBlbmQgdG8gdGhlIHdvcmQgYXQgdGhlIGNvb3JkaW5hdGVkIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIGNvb3JkcyBUaGUgY29vcmRpbmF0ZXMgdG8gZ2V0IHRoZSB3b3JkIGF0LlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VsZWN0VG9Xb3JkQXQoY29vcmRzOiBbbnVtYmVyLCBudW1iZXJdKTogdm9pZCB7XG4gICAgY29uc3Qgd29yZFBvc2l0aW9uID0gdGhpcy5fZ2V0V29yZEF0KGNvb3JkcywgdHJ1ZSk7XG4gICAgaWYgKHdvcmRQb3NpdGlvbikge1xuICAgICAgbGV0IGVuZFJvdyA9IGNvb3Jkc1sxXTtcblxuICAgICAgLy8gQWRqdXN0IG5lZ2F0aXZlIHN0YXJ0IHZhbHVlXG4gICAgICB3aGlsZSAod29yZFBvc2l0aW9uLnN0YXJ0IDwgMCkge1xuICAgICAgICB3b3JkUG9zaXRpb24uc3RhcnQgKz0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgICAgICBlbmRSb3ctLTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHdyYXBwZWQgbGVuZ3RoIHZhbHVlLCB0aGlzIG9ubHkgbmVlZHMgdG8gaGFwcGVuIHdoZW4gdmFsdWVzIGFyZSByZXZlcnNlZCBhcyBpbiB0aGF0XG4gICAgICAvLyBjYXNlIHdlJ3JlIGludGVyZXN0ZWQgaW4gdGhlIHN0YXJ0IG9mIHRoZSB3b3JkLCBub3QgdGhlIGVuZFxuICAgICAgaWYgKCF0aGlzLl9tb2RlbC5hcmVTZWxlY3Rpb25WYWx1ZXNSZXZlcnNlZCgpKSB7XG4gICAgICAgIHdoaWxlICh3b3JkUG9zaXRpb24uc3RhcnQgKyB3b3JkUG9zaXRpb24ubGVuZ3RoID4gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICAgICAgd29yZFBvc2l0aW9uLmxlbmd0aCAtPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgICAgICAgZW5kUm93Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gW3RoaXMuX21vZGVsLmFyZVNlbGVjdGlvblZhbHVlc1JldmVyc2VkKCkgPyB3b3JkUG9zaXRpb24uc3RhcnQgOiB3b3JkUG9zaXRpb24uc3RhcnQgKyB3b3JkUG9zaXRpb24ubGVuZ3RoLCBlbmRSb3ddO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBjb25zaWRlcmVkIGEgd29yZCBzZXBhcmF0b3IgYnkgdGhlIHNlbGVjdFxuICAgKiB3b3JkIGxvZ2ljLlxuICAgKiBAcGFyYW0gY2VsbCBUaGUgY2VsbCB0byBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgX2lzQ2hhcldvcmRTZXBhcmF0b3IoY2VsbDogQ2VsbERhdGEpOiBib29sZWFuIHtcbiAgICAvLyBaZXJvIHdpZHRoIGNoYXJhY3RlcnMgYXJlIG5ldmVyIHNlcGFyYXRvcnMgYXMgdGhleSBhcmUgYWx3YXlzIHRvIHRoZVxuICAgIC8vIHJpZ2h0IG9mIHdpZGUgY2hhcmFjdGVyc1xuICAgIGlmIChjZWxsLmdldFdpZHRoKCkgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud29yZFNlcGFyYXRvci5pbmRleE9mKGNlbGwuZ2V0Q2hhcnMoKSkgPj0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSBsaW5lIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgaW5kZXguXG4gICAqL1xuICBwcm90ZWN0ZWQgX3NlbGVjdExpbmVBdChsaW5lOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB3cmFwcGVkUmFuZ2UgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5nZXRXcmFwcGVkUmFuZ2VGb3JMaW5lKGxpbmUpO1xuICAgIGNvbnN0IHJhbmdlOiBJQnVmZmVyUmFuZ2UgPSB7XG4gICAgICBzdGFydDogeyB4OiAwLCB5OiB3cmFwcGVkUmFuZ2UuZmlyc3QgfSxcbiAgICAgIGVuZDogeyB4OiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxLCB5OiB3cmFwcGVkUmFuZ2UubGFzdCB9XG4gICAgfTtcbiAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydCA9IFswLCB3cmFwcGVkUmFuZ2UuZmlyc3RdO1xuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydExlbmd0aCA9IGdldFJhbmdlTGVuZ3RoKHJhbmdlLCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRXZlbnQgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IElSZW5kZXJEaW1lbnNpb25zLCBJUmVuZGVyZXIgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ29sb3JTZXQsIElMaW5rLCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJU2VsZWN0aW9uUmVkcmF3UmVxdWVzdEV2ZW50IGFzIElTZWxlY3Rpb25SZXF1ZXN0UmVkcmF3RXZlbnQsIElTZWxlY3Rpb25SZXF1ZXN0U2Nyb2xsTGluZXNFdmVudCB9IGZyb20gJ2Jyb3dzZXIvc2VsZWN0aW9uL1R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZURlY29yYXRvciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgQWxsQ29sb3JJbmRleCwgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5leHBvcnQgY29uc3QgSUNoYXJTaXplU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ2hhclNpemVTZXJ2aWNlPignQ2hhclNpemVTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDaGFyU2l6ZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWFkb25seSB3aWR0aDogbnVtYmVyO1xuICByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgaGFzVmFsaWRTaXplOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IG9uQ2hhclNpemVDaGFuZ2U6IElFdmVudDx2b2lkPjtcblxuICBtZWFzdXJlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJQ29yZUJyb3dzZXJTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDb3JlQnJvd3NlclNlcnZpY2U+KCdDb3JlQnJvd3NlclNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNvcmVCcm93c2VyU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGlzRm9jdXNlZDogYm9vbGVhbjtcblxuICByZWFkb25seSBvbkRwckNoYW5nZTogSUV2ZW50PG51bWJlcj47XG4gIHJlYWRvbmx5IG9uV2luZG93Q2hhbmdlOiBJRXZlbnQ8V2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXM+O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHBhcmVudCB3aW5kb3cgdGhhdCB0aGUgdGVybWluYWwgaXMgcmVuZGVyZWQgaW50by4gRE9NIGFuZCByZW5kZXJpbmcgQVBJcyAoZS5nLlxuICAgKiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHNob3VsZCBiZSBpbnZva2VkIGluIHRoZSBjb250ZXh0IG9mIHRoaXMgd2luZG93LiBUaGlzIHNob3VsZCBiZSBzZXQgd2hlblxuICAgKiB0aGUgd2luZG93IGhvc3RpbmcgdGhlIHh0ZXJtLmpzIGluc3RhbmNlIGNoYW5nZXMuXG4gICAqL1xuICB3aW5kb3c6IFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzO1xuICAvKipcbiAgICogVGhlIGRvY3VtZW50IG9mIHRoZSBwcmltYXJ5IHdpbmRvdyB0byBiZSB1c2VkIHRvIGNyZWF0ZSBlbGVtZW50cyB3aGVuIHdvcmtpbmcgd2l0aCBtdWx0aXBsZVxuICAgKiB3aW5kb3dzLiBUaGlzIGlzIGRlZmluZWQgYnkgdGhlIGRvY3VtZW50T3ZlcnJpZGUgc2V0dGluZy5cbiAgICovXG4gIHJlYWRvbmx5IG1haW5Eb2N1bWVudDogRG9jdW1lbnQ7XG4gIC8qKlxuICAgKiBIZWxwZXIgZm9yIGdldHRpbmcgdGhlIGRldmljZVBpeGVsUmF0aW8gb2YgdGhlIHBhcmVudCB3aW5kb3cuXG4gICAqL1xuICByZWFkb25seSBkcHI6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IElNb3VzZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SU1vdXNlU2VydmljZT4oJ01vdXNlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJTW91c2VTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgZ2V0Q29vcmRzKGV2ZW50OiB7Y2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXJ9LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgY29sQ291bnQ6IG51bWJlciwgcm93Q291bnQ6IG51bWJlciwgaXNTZWxlY3Rpb24/OiBib29sZWFuKTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgZ2V0TW91c2VSZXBvcnRDb29yZHMoZXZlbnQ6IE1vdXNlRXZlbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogeyBjb2w6IG51bWJlciwgcm93OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJUmVuZGVyU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJUmVuZGVyU2VydmljZT4oJ1JlbmRlclNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlclNlcnZpY2UgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIG9uRGltZW5zaW9uc0NoYW5nZTogSUV2ZW50PElSZW5kZXJEaW1lbnNpb25zPjtcbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gYnVmZmVyIGNoYW5nZXMgYXJlIHJlbmRlcmVkLiBUaGlzIGRvZXMgbm90IGZpcmUgd2hlbiBvbmx5IGN1cnNvclxuICAgKiBvciBzZWxlY3Rpb25zIGFyZSByZW5kZXJlZC5cbiAgICovXG4gIG9uUmVuZGVyZWRWaWV3cG9ydENoYW5nZTogSUV2ZW50PHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT47XG4gIC8qKlxuICAgKiBGaXJlcyBvbiByZW5kZXJcbiAgICovXG4gIG9uUmVuZGVyOiBJRXZlbnQ8eyBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciB9PjtcbiAgb25SZWZyZXNoUmVxdWVzdDogSUV2ZW50PHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT47XG5cbiAgZGltZW5zaW9uczogSVJlbmRlckRpbWVuc2lvbnM7XG5cbiAgYWRkUmVmcmVzaENhbGxiYWNrKGNhbGxiYWNrOiBGcmFtZVJlcXVlc3RDYWxsYmFjayk6IG51bWJlcjtcblxuICByZWZyZXNoUm93cyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQ7XG4gIGNsZWFyVGV4dHVyZUF0bGFzKCk6IHZvaWQ7XG4gIHJlc2l6ZShjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQ7XG4gIGhhc1JlbmRlcmVyKCk6IGJvb2xlYW47XG4gIHNldFJlbmRlcmVyKHJlbmRlcmVyOiBJUmVuZGVyZXIpOiB2b2lkO1xuICBoYW5kbGVEZXZpY2VQaXhlbFJhdGlvQ2hhbmdlKCk6IHZvaWQ7XG4gIGhhbmRsZVJlc2l6ZShjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQ7XG4gIGhhbmRsZUNoYXJTaXplQ2hhbmdlZCgpOiB2b2lkO1xuICBoYW5kbGVCbHVyKCk6IHZvaWQ7XG4gIGhhbmRsZUZvY3VzKCk6IHZvaWQ7XG4gIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoc3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgY29sdW1uU2VsZWN0TW9kZTogYm9vbGVhbik6IHZvaWQ7XG4gIGhhbmRsZUN1cnNvck1vdmUoKTogdm9pZDtcbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElTZWxlY3Rpb25TZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElTZWxlY3Rpb25TZXJ2aWNlPignU2VsZWN0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJU2VsZWN0aW9uU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblRleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgaGFzU2VsZWN0aW9uOiBib29sZWFuO1xuICByZWFkb25seSBzZWxlY3Rpb25TdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc2VsZWN0aW9uRW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IG9uTGludXhNb3VzZVNlbGVjdGlvbjogSUV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uUmVxdWVzdFJlZHJhdzogSUV2ZW50PElTZWxlY3Rpb25SZXF1ZXN0UmVkcmF3RXZlbnQ+O1xuICByZWFkb25seSBvblJlcXVlc3RTY3JvbGxMaW5lczogSUV2ZW50PElTZWxlY3Rpb25SZXF1ZXN0U2Nyb2xsTGluZXNFdmVudD47XG4gIHJlYWRvbmx5IG9uU2VsZWN0aW9uQ2hhbmdlOiBJRXZlbnQ8dm9pZD47XG5cbiAgZGlzYWJsZSgpOiB2b2lkO1xuICBlbmFibGUoKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcbiAgc2V0U2VsZWN0aW9uKHJvdzogbnVtYmVyLCBjb2w6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkO1xuICBzZWxlY3RBbGwoKTogdm9pZDtcbiAgc2VsZWN0TGluZXMoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkO1xuICBjbGVhclNlbGVjdGlvbigpOiB2b2lkO1xuICByaWdodENsaWNrU2VsZWN0KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZDtcbiAgc2hvdWxkQ29sdW1uU2VsZWN0KGV2ZW50OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IGJvb2xlYW47XG4gIHNob3VsZEZvcmNlU2VsZWN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbjtcbiAgcmVmcmVzaChpc0xpbnV4TW91c2VTZWxlY3Rpb24/OiBib29sZWFuKTogdm9pZDtcbiAgaGFuZGxlTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZDtcbiAgaXNDZWxsSW5TZWxlY3Rpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgSUNoYXJhY3RlckpvaW5lclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNoYXJhY3RlckpvaW5lclNlcnZpY2U+KCdDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVnaXN0ZXIoaGFuZGxlcjogKHRleHQ6IHN0cmluZykgPT4gW251bWJlciwgbnVtYmVyXVtdKTogbnVtYmVyO1xuICBkZXJlZ2lzdGVyKGpvaW5lcklkOiBudW1iZXIpOiBib29sZWFuO1xuICBnZXRKb2luZWRDaGFyYWN0ZXJzKHJvdzogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXVtdO1xufVxuXG5leHBvcnQgY29uc3QgSVRoZW1lU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJVGhlbWVTZXJ2aWNlPignVGhlbWVTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElUaGVtZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQ7XG5cbiAgcmVhZG9ubHkgb25DaGFuZ2VDb2xvcnM6IElFdmVudDxSZWFkb25seUNvbG9yU2V0PjtcblxuICByZXN0b3JlQ29sb3Ioc2xvdD86IEFsbENvbG9ySW5kZXgpOiB2b2lkO1xuICAvKipcbiAgICogQWxsb3dzIGV4dGVybmFsIG1vZGlmeWluZyBvZiBjb2xvcnMgaW4gdGhlIHRoZW1lLCB0aGlzIGlzIHVzZWQgaW5zdGVhZCBvZiB7QGxpbmsgY29sb3JzfSB0b1xuICAgKiBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzLlxuICAgKi9cbiAgbW9kaWZ5Q29sb3JzKGNhbGxiYWNrOiAoY29sb3JzOiBJQ29sb3JTZXQpID0+IHZvaWQpOiB2b2lkO1xufVxuXG5cbmV4cG9ydCBjb25zdCBJTGlua1Byb3ZpZGVyU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJTGlua1Byb3ZpZGVyU2VydmljZT4oJ0xpbmtQcm92aWRlclNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUxpbmtQcm92aWRlclNlcnZpY2UgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICByZWFkb25seSBsaW5rUHJvdmlkZXJzOiBSZWFkb25seUFycmF5PElMaW5rUHJvdmlkZXI+O1xuICByZWdpc3RlckxpbmtQcm92aWRlcihsaW5rUHJvdmlkZXI6IElMaW5rUHJvdmlkZXIpOiBJRGlzcG9zYWJsZTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUxpbmtQcm92aWRlciB7XG4gIHByb3ZpZGVMaW5rcyh5OiBudW1iZXIsIGNhbGxiYWNrOiAobGlua3M6IElMaW5rW10gfCB1bmRlZmluZWQpID0+IHZvaWQpOiB2b2lkO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9Db2xvckNvbnRyYXN0Q2FjaGUnO1xuaW1wb3J0IHsgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSwgSUNvbG9yU2V0LCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBjaGFubmVscywgY29sb3IsIGNzcywgTlVMTF9DT0xPUiB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElPcHRpb25zU2VydmljZSwgSVRoZW1lIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEFsbENvbG9ySW5kZXgsIElDb2xvciwgU3BlY2lhbENvbG9ySW5kZXggfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5pbnRlcmZhY2UgSVJlc3RvcmVDb2xvclNldCB7XG4gIGZvcmVncm91bmQ6IElDb2xvcjtcbiAgYmFja2dyb3VuZDogSUNvbG9yO1xuICBjdXJzb3I6IElDb2xvcjtcbiAgYW5zaTogSUNvbG9yW107XG59XG5cblxuY29uc3QgREVGQVVMVF9GT1JFR1JPVU5EID0gY3NzLnRvQ29sb3IoJyNmZmZmZmYnKTtcbmNvbnN0IERFRkFVTFRfQkFDS0dST1VORCA9IGNzcy50b0NvbG9yKCcjMDAwMDAwJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUiA9IGNzcy50b0NvbG9yKCcjZmZmZmZmJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQgPSBjc3MudG9Db2xvcignIzAwMDAwMCcpO1xuY29uc3QgREVGQVVMVF9TRUxFQ1RJT04gPSB7XG4gIGNzczogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKScsXG4gIHJnYmE6IDB4RkZGRkZGNERcbn07XG5cbi8vIEFuIElJRkUgdG8gZ2VuZXJhdGUgREVGQVVMVF9BTlNJX0NPTE9SUy5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FOU0lfQ09MT1JTID0gT2JqZWN0LmZyZWV6ZSgoKCkgPT4ge1xuICBjb25zdCBjb2xvcnMgPSBbXG4gICAgLy8gZGFyazpcbiAgICBjc3MudG9Db2xvcignIzJlMzQzNicpLFxuICAgIGNzcy50b0NvbG9yKCcjY2MwMDAwJyksXG4gICAgY3NzLnRvQ29sb3IoJyM0ZTlhMDYnKSxcbiAgICBjc3MudG9Db2xvcignI2M0YTAwMCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzQ2NWE0JyksXG4gICAgY3NzLnRvQ29sb3IoJyM3NTUwN2InKSxcbiAgICBjc3MudG9Db2xvcignIzA2OTg5YScpLFxuICAgIGNzcy50b0NvbG9yKCcjZDNkN2NmJyksXG4gICAgLy8gYnJpZ2h0OlxuICAgIGNzcy50b0NvbG9yKCcjNTU1NzUzJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZjI5MjknKSxcbiAgICBjc3MudG9Db2xvcignIzhhZTIzNCcpLFxuICAgIGNzcy50b0NvbG9yKCcjZmNlOTRmJyksXG4gICAgY3NzLnRvQ29sb3IoJyM3MjlmY2YnKSxcbiAgICBjc3MudG9Db2xvcignI2FkN2ZhOCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzRlMmUyJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZWVlZWMnKVxuICBdO1xuXG4gIC8vIEZpbGwgaW4gdGhlIHJlbWFpbmluZyAyNDAgQU5TSSBjb2xvcnMuXG4gIC8vIEdlbmVyYXRlIGNvbG9ycyAoMTYtMjMxKVxuICBjb25zdCB2ID0gWzB4MDAsIDB4NWYsIDB4ODcsIDB4YWYsIDB4ZDcsIDB4ZmZdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDIxNjsgaSsrKSB7XG4gICAgY29uc3QgciA9IHZbKGkgLyAzNikgJSA2IHwgMF07XG4gICAgY29uc3QgZyA9IHZbKGkgLyA2KSAlIDYgfCAwXTtcbiAgICBjb25zdCBiID0gdltpICUgNl07XG4gICAgY29sb3JzLnB1c2goe1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhyLCBnLCBiKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShyLCBnLCBiKVxuICAgIH0pO1xuICB9XG5cbiAgLy8gR2VuZXJhdGUgZ3JleXMgKDIzMi0yNTUpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuICAgIGNvbnN0IGMgPSA4ICsgaSAqIDEwO1xuICAgIGNvbG9ycy5wdXNoKHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoYywgYywgYyksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoYywgYywgYylcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb2xvcnM7XG59KSgpKTtcblxuZXhwb3J0IGNsYXNzIFRoZW1lU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJVGhlbWVTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2NvbG9yczogSUNvbG9yU2V0O1xuICBwcml2YXRlIF9jb250cmFzdENhY2hlOiBJQ29sb3JDb250cmFzdENhY2hlID0gbmV3IENvbG9yQ29udHJhc3RDYWNoZSgpO1xuICBwcml2YXRlIF9oYWxmQ29udHJhc3RDYWNoZTogSUNvbG9yQ29udHJhc3RDYWNoZSA9IG5ldyBDb2xvckNvbnRyYXN0Q2FjaGUoKTtcbiAgcHJpdmF0ZSBfcmVzdG9yZUNvbG9ycyE6IElSZXN0b3JlQ29sb3JTZXQ7XG5cbiAgcHVibGljIGdldCBjb2xvcnMoKTogUmVhZG9ubHlDb2xvclNldCB7IHJldHVybiB0aGlzLl9jb2xvcnM7IH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYW5nZUNvbG9ycyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxSZWFkb25seUNvbG9yU2V0PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhbmdlQ29sb3JzID0gdGhpcy5fb25DaGFuZ2VDb2xvcnMuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiBERUZBVUxUX0ZPUkVHUk9VTkQsXG4gICAgICBiYWNrZ3JvdW5kOiBERUZBVUxUX0JBQ0tHUk9VTkQsXG4gICAgICBjdXJzb3I6IERFRkFVTFRfQ1VSU09SLFxuICAgICAgY3Vyc29yQWNjZW50OiBERUZBVUxUX0NVUlNPUl9BQ0NFTlQsXG4gICAgICBzZWxlY3Rpb25Gb3JlZ3JvdW5kOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IERFRkFVTFRfU0VMRUNUSU9OLFxuICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZTogY29sb3IuYmxlbmQoREVGQVVMVF9CQUNLR1JPVU5ELCBERUZBVUxUX1NFTEVDVElPTiksXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudDogREVGQVVMVF9TRUxFQ1RJT04sXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWU6IGNvbG9yLmJsZW5kKERFRkFVTFRfQkFDS0dST1VORCwgREVGQVVMVF9TRUxFQ1RJT04pLFxuICAgICAgYW5zaTogREVGQVVMVF9BTlNJX0NPTE9SUy5zbGljZSgpLFxuICAgICAgY29udHJhc3RDYWNoZTogdGhpcy5fY29udHJhc3RDYWNoZSxcbiAgICAgIGhhbGZDb250cmFzdENhY2hlOiB0aGlzLl9oYWxmQ29udHJhc3RDYWNoZVxuICAgIH07XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX3NldFRoZW1lKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGhlbWUpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdtaW5pbXVtQ29udHJhc3RSYXRpbycsICgpID0+IHRoaXMuX2NvbnRyYXN0Q2FjaGUuY2xlYXIoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgndGhlbWUnLCAoKSA9PiB0aGlzLl9zZXRUaGVtZSh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRoZW1lKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRlcm1pbmFsJ3MgdGhlbWUuXG4gICAqIEBwYXJhbSB0aGVtZSBUaGUgIHRoZW1lIHRvIHVzZS4gSWYgYSBwYXJ0aWFsIHRoZW1lIGlzIHByb3ZpZGVkIHRoZW4gZGVmYXVsdFxuICAgKiBjb2xvcnMgd2lsbCBiZSB1c2VkIHdoZXJlIGNvbG9ycyBhcmUgbm90IGRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIF9zZXRUaGVtZSh0aGVtZTogSVRoZW1lID0ge30pOiB2b2lkIHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLl9jb2xvcnM7XG4gICAgY29sb3JzLmZvcmVncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmZvcmVncm91bmQsIERFRkFVTFRfRk9SRUdST1VORCk7XG4gICAgY29sb3JzLmJhY2tncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmJhY2tncm91bmQsIERFRkFVTFRfQkFDS0dST1VORCk7XG4gICAgY29sb3JzLmN1cnNvciA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yLCBERUZBVUxUX0NVUlNPUik7XG4gICAgY29sb3JzLmN1cnNvckFjY2VudCA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yQWNjZW50LCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkJhY2tncm91bmQsIERFRkFVTFRfU0VMRUNUSU9OKTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50KTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCk7XG4gICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID0gdGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCA/IHBhcnNlQ29sb3IodGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCwgTlVMTF9DT0xPUikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID09PSBOVUxMX0NPTE9SKSB7XG4gICAgICBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBzZWxlY3Rpb24gY29sb3IgaXMgb3BhcXVlLCBibGVuZCBpdCB3aXRoIGJhY2tncm91bmQgd2l0aCAwLjMgb3BhY2l0eVxuICAgICAqIElzc3VlICMyNzM3XG4gICAgICovXG4gICAgaWYgKGNvbG9yLmlzT3BhcXVlKGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCA9IGNvbG9yLm9wYWNpdHkoY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCwgb3BhY2l0eSk7XG4gICAgfVxuICAgIGlmIChjb2xvci5pc09wYXF1ZShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gY29sb3Iub3BhY2l0eShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQsIG9wYWNpdHkpO1xuICAgIH1cbiAgICBjb2xvcnMuYW5zaSA9IERFRkFVTFRfQU5TSV9DT0xPUlMuc2xpY2UoKTtcbiAgICBjb2xvcnMuYW5zaVswXSA9IHBhcnNlQ29sb3IodGhlbWUuYmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbMF0pO1xuICAgIGNvbG9ycy5hbnNpWzFdID0gcGFyc2VDb2xvcih0aGVtZS5yZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbMV0pO1xuICAgIGNvbG9ycy5hbnNpWzJdID0gcGFyc2VDb2xvcih0aGVtZS5ncmVlbiwgREVGQVVMVF9BTlNJX0NPTE9SU1syXSk7XG4gICAgY29sb3JzLmFuc2lbM10gPSBwYXJzZUNvbG9yKHRoZW1lLnllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1szXSk7XG4gICAgY29sb3JzLmFuc2lbNF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJsdWUsIERFRkFVTFRfQU5TSV9DT0xPUlNbNF0pO1xuICAgIGNvbG9ycy5hbnNpWzVdID0gcGFyc2VDb2xvcih0aGVtZS5tYWdlbnRhLCBERUZBVUxUX0FOU0lfQ09MT1JTWzVdKTtcbiAgICBjb2xvcnMuYW5zaVs2XSA9IHBhcnNlQ29sb3IodGhlbWUuY3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1s2XSk7XG4gICAgY29sb3JzLmFuc2lbN10gPSBwYXJzZUNvbG9yKHRoZW1lLndoaXRlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzddKTtcbiAgICBjb2xvcnMuYW5zaVs4XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0QmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbOF0pO1xuICAgIGNvbG9ycy5hbnNpWzldID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRSZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbOV0pO1xuICAgIGNvbG9ycy5hbnNpWzEwXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0R3JlZW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMTBdKTtcbiAgICBjb2xvcnMuYW5zaVsxMV0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodFllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1sxMV0pO1xuICAgIGNvbG9ycy5hbnNpWzEyXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Qmx1ZSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxMl0pO1xuICAgIGNvbG9ycy5hbnNpWzEzXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0TWFnZW50YSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxM10pO1xuICAgIGNvbG9ycy5hbnNpWzE0XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Q3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1sxNF0pO1xuICAgIGNvbG9ycy5hbnNpWzE1XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0V2hpdGUsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTVdKTtcbiAgICBpZiAodGhlbWUuZXh0ZW5kZWRBbnNpKSB7XG4gICAgICBjb25zdCBjb2xvckNvdW50ID0gTWF0aC5taW4oY29sb3JzLmFuc2kubGVuZ3RoIC0gMTYsIHRoZW1lLmV4dGVuZGVkQW5zaS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvckNvdW50OyBpKyspIHtcbiAgICAgICAgY29sb3JzLmFuc2lbaSArIDE2XSA9IHBhcnNlQ29sb3IodGhlbWUuZXh0ZW5kZWRBbnNpW2ldLCBERUZBVUxUX0FOU0lfQ09MT1JTW2kgKyAxNl0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhciBvdXIgdGhlIGNhY2hlXG4gICAgdGhpcy5fY29udHJhc3RDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX2hhbGZDb250cmFzdENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpO1xuICB9XG5cbiAgcHVibGljIHJlc3RvcmVDb2xvcihzbG90PzogQWxsQ29sb3JJbmRleCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcihzbG90KTtcbiAgICB0aGlzLl9vbkNoYW5nZUNvbG9ycy5maXJlKHRoaXMuY29sb3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVDb2xvcihzbG90OiBBbGxDb2xvckluZGV4IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gdW5zZXQgc2xvdCByZXN0b3JlcyBhbGwgYW5zaSBjb2xvcnNcbiAgICBpZiAoc2xvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaS5sZW5ndGg7ICsraSkge1xuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtpXSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChzbG90KSB7XG4gICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkZPUkVHUk9VTkQ6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5mb3JlZ3JvdW5kID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5mb3JlZ3JvdW5kO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguQkFDS0dST1VORDpcbiAgICAgICAgdGhpcy5fY29sb3JzLmJhY2tncm91bmQgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmJhY2tncm91bmQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5DVVJTT1I6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5jdXJzb3IgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmN1cnNvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtzbG90XSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtzbG90XTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbW9kaWZ5Q29sb3JzKGNhbGxiYWNrOiAoY29sb3JzOiBJQ29sb3JTZXQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjYWxsYmFjayh0aGlzLl9jb2xvcnMpO1xuICAgIC8vIEFzc3VtZSB0aGUgY2hhbmdlIGhhcHBlbmVkXG4gICAgdGhpcy5fb25DaGFuZ2VDb2xvcnMuZmlyZSh0aGlzLmNvbG9ycyk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVSZXN0b3JlQ29sb3JzKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiB0aGlzLl9jb2xvcnMuZm9yZWdyb3VuZCxcbiAgICAgIGJhY2tncm91bmQ6IHRoaXMuX2NvbG9ycy5iYWNrZ3JvdW5kLFxuICAgICAgY3Vyc29yOiB0aGlzLl9jb2xvcnMuY3Vyc29yLFxuICAgICAgYW5zaTogdGhpcy5fY29sb3JzLmFuc2kuc2xpY2UoKVxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDb2xvcihcbiAgY3NzU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrOiBJQ29sb3Jcbik6IElDb2xvciB7XG4gIGlmIChjc3NTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY3NzLnRvQ29sb3IoY3NzU3RyaW5nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vLW9wXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDaXJjdWxhckxpc3QgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUluc2VydEV2ZW50IHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgYW1vdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlbGV0ZUV2ZW50IHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgYW1vdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNpcmN1bGFyIGxpc3Q7IGEgbGlzdCB3aXRoIGEgbWF4aW11bSBzaXplIHRoYXQgd3JhcHMgYXJvdW5kIHdoZW4gcHVzaCBpcyBjYWxsZWQsXG4gKiBvdmVycmlkaW5nIHZhbHVlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBDaXJjdWxhckxpc3Q8VD4gZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUNpcmN1bGFyTGlzdDxUPiB7XG4gIHByb3RlY3RlZCBfYXJyYXk6IChUIHwgdW5kZWZpbmVkKVtdO1xuICBwcml2YXRlIF9zdGFydEluZGV4OiBudW1iZXI7XG4gIHByaXZhdGUgX2xlbmd0aDogbnVtYmVyO1xuXG4gIHB1YmxpYyByZWFkb25seSBvbkRlbGV0ZUVtaXR0ZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SURlbGV0ZUV2ZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uRGVsZXRlID0gdGhpcy5vbkRlbGV0ZUVtaXR0ZXIuZXZlbnQ7XG4gIHB1YmxpYyByZWFkb25seSBvbkluc2VydEVtaXR0ZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SUluc2VydEV2ZW50PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uSW5zZXJ0ID0gdGhpcy5vbkluc2VydEVtaXR0ZXIuZXZlbnQ7XG4gIHB1YmxpYyByZWFkb25seSBvblRyaW1FbWl0dGVyID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblRyaW0gPSB0aGlzLm9uVHJpbUVtaXR0ZXIuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfbWF4TGVuZ3RoOiBudW1iZXJcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9hcnJheSA9IG5ldyBBcnJheTxUPih0aGlzLl9tYXhMZW5ndGgpO1xuICAgIHRoaXMuX3N0YXJ0SW5kZXggPSAwO1xuICAgIHRoaXMuX2xlbmd0aCA9IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9tYXhMZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1heExlbmd0aChuZXdNYXhMZW5ndGg6IG51bWJlcikge1xuICAgIC8vIFRoZXJlIHdhcyBubyBjaGFuZ2UgaW4gbWF4TGVuZ3RoLCByZXR1cm4gZWFybHkuXG4gICAgaWYgKHRoaXMuX21heExlbmd0aCA9PT0gbmV3TWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVjb25zdHJ1Y3QgYXJyYXksIHN0YXJ0aW5nIGF0IGluZGV4IDAuIE9ubHkgdHJhbnNmZXIgdmFsdWVzIGZyb20gdGhlXG4gICAgLy8gaW5kZXhlcyAwIHRvIGxlbmd0aC5cbiAgICBjb25zdCBuZXdBcnJheSA9IG5ldyBBcnJheTxUIHwgdW5kZWZpbmVkPihuZXdNYXhMZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4obmV3TWF4TGVuZ3RoLCB0aGlzLmxlbmd0aCk7IGkrKykge1xuICAgICAgbmV3QXJyYXlbaV0gPSB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpKV07XG4gICAgfVxuICAgIHRoaXMuX2FycmF5ID0gbmV3QXJyYXk7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gbmV3TWF4TGVuZ3RoO1xuICAgIHRoaXMuX3N0YXJ0SW5kZXggPSAwO1xuICB9XG5cbiAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIHNldCBsZW5ndGgobmV3TGVuZ3RoOiBudW1iZXIpIHtcbiAgICBpZiAobmV3TGVuZ3RoID4gdGhpcy5fbGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy5fbGVuZ3RoOyBpIDwgbmV3TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5fYXJyYXlbaV0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2xlbmd0aCA9IG5ld0xlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBhbiBpbmRleC5cbiAgICpcbiAgICogTm90ZSB0aGF0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoZXJlIGlzIG5vIGJvdW5kcyBjaGVja2luZyBoZXJlLCB0aGUgaW5kZXggcmVmZXJlbmNlIGlzXG4gICAqIGNpcmN1bGFyIHNvIHRoaXMgc2hvdWxkIGFsd2F5cyByZXR1cm4gYSB2YWx1ZSBhbmQgbmV2ZXIgdGhyb3cuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluZGV4LlxuICAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGluZGV4KV07XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgYXQgYW4gaW5kZXguXG4gICAqXG4gICAqIE5vdGUgdGhhdCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB0aGVyZSBpcyBubyBib3VuZHMgY2hlY2tpbmcgaGVyZSwgdGhlIGluZGV4IHJlZmVyZW5jZSBpc1xuICAgKiBjaXJjdWxhciBzbyB0aGlzIHNob3VsZCBhbHdheXMgcmV0dXJuIGEgdmFsdWUgYW5kIG5ldmVyIHRocm93LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIHNldC5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICBwdWJsaWMgc2V0KGluZGV4OiBudW1iZXIsIHZhbHVlOiBUIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoaW5kZXgpXSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBhIG5ldyB2YWx1ZSBvbnRvIHRoZSBsaXN0LCB3cmFwcGluZyBhcm91bmQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBhcnJheSwgb3ZlcnJpZGluZyBpbmRleCAwXG4gICAqIGlmIHRoZSBtYXhpbXVtIGxlbmd0aCBpcyByZWFjaGVkLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHB1c2ggb250byB0aGUgbGlzdC5cbiAgICovXG4gIHB1YmxpYyBwdXNoKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgodGhpcy5fbGVuZ3RoKV0gPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09PSB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMuX3N0YXJ0SW5kZXggPSArK3RoaXMuX3N0YXJ0SW5kZXggJSB0aGlzLl9tYXhMZW5ndGg7XG4gICAgICB0aGlzLm9uVHJpbUVtaXR0ZXIuZmlyZSgxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGVuZ3RoKys7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkdmFuY2UgcmluZ2J1ZmZlciBpbmRleCBhbmQgcmV0dXJuIGN1cnJlbnQgZWxlbWVudCBmb3IgcmVjeWNsaW5nLlxuICAgKiBOb3RlOiBUaGUgYnVmZmVyIG11c3QgYmUgZnVsbCBmb3IgdGhpcyBtZXRob2QgdG8gd29yay5cbiAgICogQHRocm93cyBXaGVuIHRoZSBidWZmZXIgaXMgbm90IGZ1bGwuXG4gICAqL1xuICBwdWJsaWMgcmVjeWNsZSgpOiBUIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9PSB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgcmVjeWNsZSB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbCcpO1xuICAgIH1cbiAgICB0aGlzLl9zdGFydEluZGV4ID0gKyt0aGlzLl9zdGFydEluZGV4ICUgdGhpcy5fbWF4TGVuZ3RoO1xuICAgIHRoaXMub25UcmltRW1pdHRlci5maXJlKDEpO1xuICAgIHJldHVybiB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleCh0aGlzLl9sZW5ndGggLSAxKV0hO1xuICB9XG5cbiAgLyoqXG4gICAqIFJpbmdidWZmZXIgaXMgYXQgbWF4IGxlbmd0aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNGdWxsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sZW5ndGggPT09IHRoaXMuX21heExlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBsYXN0IHZhbHVlIG9uIHRoZSBsaXN0LlxuICAgKiBAcmV0dXJucyBUaGUgcG9wcGVkIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHBvcCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgodGhpcy5fbGVuZ3RoLS0gLSAxKV07XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbmQvb3IgaW5zZXJ0cyBpdGVtcyBhdCBhIHBhcnRpY3VsYXIgaW5kZXggKGluIHRoYXQgb3JkZXIpLiBVbmxpa2VcbiAgICogQXJyYXkucHJvdG90eXBlLnNwbGljZSwgdGhpcyBvcGVyYXRpb24gZG9lcyBub3QgcmV0dXJuIHRoZSBkZWxldGVkIGl0ZW1zIGFzIGEgbmV3IGFycmF5IGluXG4gICAqIG9yZGVyIHRvIHNhdmUgY3JlYXRpbmcgYSBuZXcgYXJyYXkuIE5vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBtYXkgc2hpZnQgYWxsIHZhbHVlcyBpbiB0aGUgbGlzdFxuICAgKiBpbiB0aGUgd29yc3QgY2FzZS5cbiAgICogQHBhcmFtIHN0YXJ0IFRoZSBpbmRleCB0byBkZWxldGUgYW5kL29yIGluc2VydC5cbiAgICogQHBhcmFtIGRlbGV0ZUNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIHRvIGluc2VydC5cbiAgICovXG4gIHB1YmxpYyBzcGxpY2Uoc3RhcnQ6IG51bWJlciwgZGVsZXRlQ291bnQ6IG51bWJlciwgLi4uaXRlbXM6IFRbXSk6IHZvaWQge1xuICAgIC8vIERlbGV0ZSBpdGVtc1xuICAgIGlmIChkZWxldGVDb3VudCkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgdGhpcy5fbGVuZ3RoIC0gZGVsZXRlQ291bnQ7IGkrKykge1xuICAgICAgICB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpKV0gPSB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpICsgZGVsZXRlQ291bnQpXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xlbmd0aCAtPSBkZWxldGVDb3VudDtcbiAgICAgIHRoaXMub25EZWxldGVFbWl0dGVyLmZpcmUoeyBpbmRleDogc3RhcnQsIGFtb3VudDogZGVsZXRlQ291bnQgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGl0ZW1zXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuX2xlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7IGktLSkge1xuICAgICAgdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoaSArIGl0ZW1zLmxlbmd0aCldID0gdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoaSldO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChzdGFydCArIGkpXSA9IGl0ZW1zW2ldO1xuICAgIH1cbiAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLm9uSW5zZXJ0RW1pdHRlci5maXJlKHsgaW5kZXg6IHN0YXJ0LCBhbW91bnQ6IGl0ZW1zLmxlbmd0aCB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGp1c3QgbGVuZ3RoIGFzIG5lZWRlZFxuICAgIGlmICh0aGlzLl9sZW5ndGggKyBpdGVtcy5sZW5ndGggPiB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNvdW50VG9UcmltID0gKHRoaXMuX2xlbmd0aCArIGl0ZW1zLmxlbmd0aCkgLSB0aGlzLl9tYXhMZW5ndGg7XG4gICAgICB0aGlzLl9zdGFydEluZGV4ICs9IGNvdW50VG9UcmltO1xuICAgICAgdGhpcy5fbGVuZ3RoID0gdGhpcy5fbWF4TGVuZ3RoO1xuICAgICAgdGhpcy5vblRyaW1FbWl0dGVyLmZpcmUoY291bnRUb1RyaW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sZW5ndGggKz0gaXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmltcyBhIG51bWJlciBvZiBpdGVtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbGlzdC5cbiAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlLlxuICAgKi9cbiAgcHVibGljIHRyaW1TdGFydChjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGNvdW50ID4gdGhpcy5fbGVuZ3RoKSB7XG4gICAgICBjb3VudCA9IHRoaXMuX2xlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRJbmRleCArPSBjb3VudDtcbiAgICB0aGlzLl9sZW5ndGggLT0gY291bnQ7XG4gICAgdGhpcy5vblRyaW1FbWl0dGVyLmZpcmUoY291bnQpO1xuICB9XG5cbiAgcHVibGljIHNoaWZ0RWxlbWVudHMoc3RhcnQ6IG51bWJlciwgY291bnQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMuX2xlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydCBhcmd1bWVudCBvdXQgb2YgcmFuZ2UnKTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0ICsgb2Zmc2V0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2hpZnQgZWxlbWVudHMgaW4gbGlzdCBiZXlvbmQgaW5kZXggMCcpO1xuICAgIH1cblxuICAgIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0aGlzLnNldChzdGFydCArIGkgKyBvZmZzZXQsIHRoaXMuZ2V0KHN0YXJ0ICsgaSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhwYW5kTGlzdEJ5ID0gKHN0YXJ0ICsgY291bnQgKyBvZmZzZXQpIC0gdGhpcy5fbGVuZ3RoO1xuICAgICAgaWYgKGV4cGFuZExpc3RCeSA+IDApIHtcbiAgICAgICAgdGhpcy5fbGVuZ3RoICs9IGV4cGFuZExpc3RCeTtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2xlbmd0aCA+IHRoaXMuX21heExlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2xlbmd0aC0tO1xuICAgICAgICAgIHRoaXMuX3N0YXJ0SW5kZXgrKztcbiAgICAgICAgICB0aGlzLm9uVHJpbUVtaXR0ZXIuZmlyZSgxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgdGhpcy5zZXQoc3RhcnQgKyBpICsgb2Zmc2V0LCB0aGlzLmdldChzdGFydCArIGkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3ljbGljIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgaW5kZXguIFRoZSBjeWNsaWMgaW5kZXggY2FuIHRoZW4gYmUgdXNlZCBvbiB0aGVcbiAgICogYmFja2luZyBhcnJheSB0byBnZXQgdGhlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWd1bGFyIGluZGV4LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHJlZ3VsYXIgaW5kZXguXG4gICAqIEByZXR1cm5zIFRoZSBjeWNsaWMgaW5kZXguXG4gICAqL1xuICBwcml2YXRlIF9nZXRDeWNsaWNJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuX3N0YXJ0SW5kZXggKyBpbmRleCkgJSB0aGlzLl9tYXhMZW5ndGg7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbi8qXG4gKiBBIHNpbXBsZSB1dGlsaXR5IGZvciBjbG9uaW5nIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmU8VD4odmFsOiBULCBkZXB0aDogbnVtYmVyID0gNSk6IFQge1xuICBpZiAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLy8gSWYgd2UncmUgY2xvbmluZyBhbiBhcnJheSwgdXNlIGFuIGFycmF5IGFzIHRoZSBiYXNlLCBvdGhlcndpc2UgdXNlIGFuIG9iamVjdFxuICBjb25zdCBjbG9uZWRPYmplY3Q6IGFueSA9IEFycmF5LmlzQXJyYXkodmFsKSA/IFtdIDoge307XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gdmFsKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY2xvbmUgZWFjayBpdGVtIHVubGVzcyB3ZSdyZSBhdCB0aGUgbWF4aW11bSBkZXB0aFxuICAgIGNsb25lZE9iamVjdFtrZXldID0gZGVwdGggPD0gMSA/IHZhbFtrZXldIDogKHZhbFtrZXldICYmIGNsb25lKHZhbFtrZXldLCBkZXB0aCAtIDEpKTtcbiAgfVxuXG4gIHJldHVybiBjbG9uZWRPYmplY3QgYXMgVDtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb2xvciwgSUNvbG9yUkdCIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxubGV0ICRyID0gMDtcbmxldCAkZyA9IDA7XG5sZXQgJGIgPSAwO1xubGV0ICRhID0gMDtcblxuZXhwb3J0IGNvbnN0IE5VTExfQ09MT1I6IElDb2xvciA9IHtcbiAgY3NzOiAnIzAwMDAwMDAwJyxcbiAgcmdiYTogMFxufTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcImNoYW5uZWxzXCIgKGluZGl2aWR1YWwgY29sb3IgY2hhbm5lbHMgYXMgbnVtYmVycykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY2hhbm5lbHMge1xuICBleHBvcnQgZnVuY3Rpb24gdG9Dc3MocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGAjJHt0b1BhZGRlZEhleChyKX0ke3RvUGFkZGVkSGV4KGcpfSR7dG9QYWRkZWRIZXgoYil9JHt0b1BhZGRlZEhleChhKX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX1gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvUmdiYShyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIgPSAweEZGKTogbnVtYmVyIHtcbiAgICAvLyBOb3RlOiBUaGUgYWdncmVnYXRlZCBudW1iZXIgaXMgUkdCQTMyIChCRSksIHRodXMgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIEFCR1IzMlxuICAgIC8vIG9uIExFIHN5c3RlbXMsIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBmb3IgZGlyZWN0IDMyLWJpdCBidWZmZXIgd3JpdGVzLlxuICAgIC8vID4+PiAwIGZvcmNlcyBhbiB1bnNpZ25lZCBpbnRcbiAgICByZXR1cm4gKHIgPDwgMjQgfCBnIDw8IDE2IHwgYiA8PCA4IHwgYSkgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogSUNvbG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhyLCBnLCBiLCBhKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShyLCBnLCBiLCBhKVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBgSUNvbG9yYC5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjb2xvciB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogSUNvbG9yLCBmZzogSUNvbG9yKTogSUNvbG9yIHtcbiAgICAkYSA9IChmZy5yZ2JhICYgMHhGRikgLyAyNTU7XG4gICAgaWYgKCRhID09PSAxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjc3M6IGZnLmNzcyxcbiAgICAgICAgcmdiYTogZmcucmdiYVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnLnJnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBmZ0cgPSAoZmcucmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGZnQiA9IChmZy5yZ2JhID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIGNvbnN0IGNzcyA9IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIpO1xuICAgIGNvbnN0IHJnYmEgPSBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gICAgcmV0dXJuIHsgY3NzLCByZ2JhIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaXNPcGFxdWUoY29sb3I6IElDb2xvcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY29sb3IucmdiYSAmIDB4RkYpID09PSAweEZGO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbnRyYXN0UmF0aW8oYmc6IElDb2xvciwgZmc6IElDb2xvciwgcmF0aW86IG51bWJlcik6IElDb2xvciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmdiYS5lbnN1cmVDb250cmFzdFJhdGlvKGJnLnJnYmEsIGZnLnJnYmEsIHJhdGlvKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoXG4gICAgICAocmVzdWx0ID4+IDI0ICYgMHhGRiksXG4gICAgICAocmVzdWx0ID4+IDE2ICYgMHhGRiksXG4gICAgICAocmVzdWx0ID4+IDggICYgMHhGRilcbiAgICApO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYXF1ZShjb2xvcjogSUNvbG9yKTogSUNvbG9yIHtcbiAgICBjb25zdCByZ2JhQ29sb3IgPSAoY29sb3IucmdiYSB8IDB4RkYpID4+PiAwO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhyZ2JhQ29sb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIpLFxuICAgICAgcmdiYTogcmdiYUNvbG9yXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBvcGFjaXR5KGNvbG9yOiBJQ29sb3IsIG9wYWNpdHk6IG51bWJlcik6IElDb2xvciB7XG4gICAgJGEgPSBNYXRoLnJvdW5kKG9wYWNpdHkgKiAweEZGKTtcbiAgICBbJHIsICRnLCAkYl0gPSByZ2JhLnRvQ2hhbm5lbHMoY29sb3IucmdiYSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIsICRhKVxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlPcGFjaXR5KGNvbG9yOiBJQ29sb3IsIGZhY3RvcjogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IGNvbG9yLnJnYmEgJiAweEZGO1xuICAgIHJldHVybiBvcGFjaXR5KGNvbG9yLCAoJGEgKiBmYWN0b3IpIC8gMHhGRik7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvclJHQihjb2xvcjogSUNvbG9yKTogSUNvbG9yUkdCIHtcbiAgICByZXR1cm4gWyhjb2xvci5yZ2JhID4+IDI0KSAmIDB4RkYsIChjb2xvci5yZ2JhID4+IDE2KSAmIDB4RkYsIChjb2xvci5yZ2JhID4+IDgpICYgMHhGRl07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcImNzc1wiIChzdHJpbmc6ICcjcmdiJywgJyNyZ2JhJywgJyNycmdnYmInLFxuICogJyNycmdnYmJhYScpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNzcyB7XG4gIC8vIEF0dGVtcHQgdG8gc2V0IGdldCB0aGUgc2hhcmVkIGNhbnZhcyBjb250ZXh0XG4gIGxldCAkY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCB1bmRlZmluZWQ7XG4gIGxldCAkbGl0bXVzQ29sb3I6IENhbnZhc0dyYWRpZW50IHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBydW4gaW4gdGhlIGZpcnN0IHdpbmRvdywgc28gZG9jdW1lbnQgc2hvdWxkIGJlIGNvcnJlY3RcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSAxO1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChjdHgpIHtcbiAgICAgICRjdHggPSBjdHg7XG4gICAgICAkY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdjb3B5JztcbiAgICAgICRsaXRtdXNDb2xvciA9ICRjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMSwgMSk7XG4gICAgfVxuICB9XG4gIGNhdGNoIHtcbiAgICAvLyBub29wXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBjc3Mgc3RyaW5nIHRvIGFuIElDb2xvciwgdGhpcyBzaG91bGQgaGFuZGxlIGFsbCB2YWxpZCBDU1MgY29sb3Igc3RyaW5ncyBhbmQgd2lsbFxuICAgKiB0aHJvdyBpZiBpdCdzIGludmFsaWQuIFRoZSBpZGVhbCBmb3JtYXQgdG8gdXNlIGlzIGAjcnJnZ2JiW2FhXWAgYXMgaXQncyB0aGUgZmFzdGVzdCB0byBwYXJzZS5cbiAgICpcbiAgICogT25seSBgI3JnYlthXWAsIGAjcnJnZ2JiW2FhXWAsIGByZ2IoKWAgYW5kIGByZ2JhKClgIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCB3aGVuIHJ1biBpbiBhIE5vZGVcbiAgICogZW52aXJvbm1lbnQuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvcihjc3M6IHN0cmluZyk6IElDb2xvciB7XG4gICAgLy8gRm9ybWF0czogI3JnYlthXSBhbmQgI3JyZ2diYlthYV1cbiAgICBpZiAoY3NzLm1hdGNoKC8jW1xcZGEtZl17Myw4fS9pKSkge1xuICAgICAgc3dpdGNoIChjc3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgNDogeyAvLyAjcmdiXG4gICAgICAgICAgJHIgPSBwYXJzZUludChjc3Muc2xpY2UoMSwgMikucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGcgPSBwYXJzZUludChjc3Muc2xpY2UoMiwgMykucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGIgPSBwYXJzZUludChjc3Muc2xpY2UoMywgNCkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA1OiB7IC8vICNyZ2JhXG4gICAgICAgICAgJHIgPSBwYXJzZUludChjc3Muc2xpY2UoMSwgMikucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGcgPSBwYXJzZUludChjc3Muc2xpY2UoMiwgMykucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGIgPSBwYXJzZUludChjc3Muc2xpY2UoMywgNCkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGEgPSBwYXJzZUludChjc3Muc2xpY2UoNCwgNSkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNzogLy8gI3JyZ2diYlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiAocGFyc2VJbnQoY3NzLnNsaWNlKDEpLCAxNikgPDwgOCB8IDB4RkYpID4+PiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSA5OiAvLyAjcnJnZ2JiYWFcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3NzLFxuICAgICAgICAgICAgcmdiYTogcGFyc2VJbnQoY3NzLnNsaWNlKDEpLCAxNikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcm1hdHM6IHJnYigpIG9yIHJnYmEoKVxuICAgIGNvbnN0IHJnYmFNYXRjaCA9IGNzcy5tYXRjaCgvcmdiYT9cXChcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKigsXFxzKigwfDF8XFxkP1xcLihcXGQrKSlcXHMqKT9cXCkvKTtcbiAgICBpZiAocmdiYU1hdGNoKSB7XG4gICAgICAkciA9IHBhcnNlSW50KHJnYmFNYXRjaFsxXSk7XG4gICAgICAkZyA9IHBhcnNlSW50KHJnYmFNYXRjaFsyXSk7XG4gICAgICAkYiA9IHBhcnNlSW50KHJnYmFNYXRjaFszXSk7XG4gICAgICAkYSA9IE1hdGgucm91bmQoKHJnYmFNYXRjaFs1XSA9PT0gdW5kZWZpbmVkID8gMSA6IHBhcnNlRmxvYXQocmdiYU1hdGNoWzVdKSkgKiAweEZGKTtcbiAgICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKCRyLCAkZywgJGIsICRhKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29udGV4dCBpcyBhdmFpbGFibGUgZm9yIGNhbnZhcy1iYXNlZCBjb2xvciBwYXJzaW5nXG4gICAgaWYgKCEkY3R4IHx8ICEkbGl0bXVzQ29sb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgdXNpbmcgY2FudmFzIGZpbGxTdHlsZVxuICAgIC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jYW52YXMuaHRtbCNmaWxsLWFuZC1zdHJva2Utc3R5bGVzXG4gICAgJGN0eC5maWxsU3R5bGUgPSAkbGl0bXVzQ29sb3I7XG4gICAgJGN0eC5maWxsU3R5bGUgPSBjc3M7XG4gICAgaWYgKHR5cGVvZiAkY3R4LmZpbGxTdHlsZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAkY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuICAgIFskciwgJGcsICRiLCAkYV0gPSAkY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGNvbG9yIGlzIG5vbi10cmFuc3BhcmVudCBhcyBjb2xvciBodWUgZ2V0cyBsb3N0IHdoZW4gZHJhd24gdG8gdGhlIGNhbnZhc1xuICAgIGlmICgkYSAhPT0gMHhGRikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgdGhlIGNvbG9yIGZyb20gdGhlIGNhbnZhcycgZmlsbFN0eWxlIHByb3BlcnR5IHdoaWNoIGV4cG9zZXMgdGhlIGNvbG9yIHZhbHVlIGluIHJnYmEoKVxuICAgIC8vIGZvcm1hdFxuICAgIC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jYW52YXMuaHRtbCNzZXJpYWxpc2F0aW9uLW9mLWEtY29sb3JcbiAgICByZXR1cm4ge1xuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIsICRhKSxcbiAgICAgIGNzc1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcInJnYlwiIChudW1iZXI6IDB4cnJnZ2JiKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSByZ2Ige1xuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHJnYiBUaGUgY29sb3IgdG8gdXNlLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMdW1pbmFuY2UocmdiOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByZWxhdGl2ZUx1bWluYW5jZTIoXG4gICAgICAocmdiID4+IDE2KSAmIDB4RkYsXG4gICAgICAocmdiID4+IDggKSAmIDB4RkYsXG4gICAgICAocmdiICAgICAgKSAmIDB4RkYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlbGF0aXZlIGx1bWluYW5jZSBvZiBhbiBSR0IgY29sb3IsIHRoaXMgaXMgdXNlZnVsIGluIGRldGVybWluaW5nIHRoZSBjb250cmFzdCByYXRpb1xuICAgKiBiZXR3ZWVuIHR3byBjb2xvcnMuXG4gICAqIEBwYXJhbSByIFRoZSByZWQgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGcgVGhlIGdyZWVuIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBwYXJhbSBiIFRoZSBibHVlIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZTIocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcnMgPSByIC8gMjU1O1xuICAgIGNvbnN0IGdzID0gZyAvIDI1NTtcbiAgICBjb25zdCBicyA9IGIgLyAyNTU7XG4gICAgY29uc3QgcnIgPSBycyA8PSAwLjAzOTI4ID8gcnMgLyAxMi45MiA6IE1hdGgucG93KChycyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJnID0gZ3MgPD0gMC4wMzkyOCA/IGdzIC8gMTIuOTIgOiBNYXRoLnBvdygoZ3MgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBjb25zdCByYiA9IGJzIDw9IDAuMDM5MjggPyBicyAvIDEyLjkyIDogTWF0aC5wb3coKGJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgcmV0dXJuIHJyICogMC4yMTI2ICsgcmcgKiAwLjcxNTIgKyByYiAqIDAuMDcyMjtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiYVwiIChudW1iZXI6IDB4cnJnZ2JiYWEpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYmEge1xuICBleHBvcnQgZnVuY3Rpb24gYmxlbmQoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IG51bWJlciB7XG4gICAgJGEgPSAoZmcgJiAweEZGKSAvIDB4RkY7XG4gICAgaWYgKCRhID09PSAxKSB7XG4gICAgICByZXR1cm4gZmc7XG4gICAgfVxuICAgIGNvbnN0IGZnUiA9IChmZyA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZyA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGZnQiA9IChmZyA+PiA4KSAmIDB4RkY7XG4gICAgY29uc3QgYmdSID0gKGJnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnID4+IDgpICYgMHhGRjtcbiAgICAkciA9IGJnUiArIE1hdGgucm91bmQoKGZnUiAtIGJnUikgKiAkYSk7XG4gICAgJGcgPSBiZ0cgKyBNYXRoLnJvdW5kKChmZ0cgLSBiZ0cpICogJGEpO1xuICAgICRiID0gYmdCICsgTWF0aC5yb3VuZCgoZmdCIC0gYmdCKSAqICRhKTtcbiAgICByZXR1cm4gY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgZm9yZWdyb3VuZCBjb2xvciBhbmQgYSBiYWNrZ3JvdW5kIGNvbG9yLCBlaXRoZXIgaW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBsdW1pbmFuY2Ugb2YgdGhlXG4gICAqIGZvcmVncm91bmQgY29sb3IgdW50aWwgdGhlIHNwZWNpZmllZCBjb250cmFzdCByYXRpbyBpcyBtZXQuIElmIHB1cmUgd2hpdGUgb3IgYmxhY2sgaXMgaGl0XG4gICAqIHdpdGhvdXQgdGhlIGNvbnRyYXN0IHJhdGlvIGJlaW5nIG1ldCwgZ28gdGhlIG90aGVyIGRpcmVjdGlvbiB1c2luZyB0aGUgYmFja2dyb3VuZCBjb2xvciBhcyB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciBhbmQgdGFrZSBlaXRoZXIgdGhlIGZpcnN0IG9yIHNlY29uZCByZXN1bHQgZGVwZW5kaW5nIG9uIHdoaWNoIGhhcyB0aGUgaGlnaGVyXG4gICAqIGNvbnRyYXN0IHJhdGlvLlxuICAgKlxuICAgKiBgdW5kZWZpbmVkYCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBjb250cmFzdCByYXRpbyBpcyBhbHJlYWR5IG1ldC5cbiAgICpcbiAgICogQHBhcmFtIGJnUmdiYSBUaGUgYmFja2dyb3VuZCBjb2xvciBpbiByZ2JhIGZvcm1hdC5cbiAgICogQHBhcmFtIGZnUmdiYSBUaGUgZm9yZWdyb3VuZCBjb2xvciBpbiByZ2JhIGZvcm1hdC5cbiAgICogQHBhcmFtIHJhdGlvIFRoZSBjb250cmFzdCByYXRpbyB0byBhY2hpZXZlLlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbnRyYXN0UmF0aW8oYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBiZ0wgPSByZ2IucmVsYXRpdmVMdW1pbmFuY2UoYmdSZ2JhID4+IDgpO1xuICAgIGNvbnN0IGZnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShmZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgY3IgPSBjb250cmFzdFJhdGlvKGJnTCwgZmdMKTtcbiAgICBpZiAoY3IgPCByYXRpbykge1xuICAgICAgaWYgKGZnTCA8IGJnTCkge1xuICAgICAgICBjb25zdCByZXN1bHRBID0gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICAgIGlmIChyZXN1bHRBUmF0aW8gPCByYXRpbykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEIgPSBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEJSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QiA+PiA4KSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdEFSYXRpbyA+IHJlc3VsdEJSYXRpbyA/IHJlc3VsdEEgOiByZXN1bHRCO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRBO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0QSA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICBjb25zdCByZXN1bHRBUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEEgPj4gOCkpO1xuICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEIgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdEFSYXRpbyA+IHJlc3VsdEJSYXRpbyA/IHJlc3VsdEEgOiByZXN1bHRCO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIHJlZHVjaW5nIGx1bWluYW5jZSBhcyBjb252ZXJ0aW5nIHRvXG4gICAgLy8gSFNMIGFuZCBiYWNrIGlzIGV4cGVuc2l2ZVxuICAgIGNvbnN0IGJnUiA9IChiZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBmZ1IgPSAoZmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgbGV0IGZnRyA9IChmZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBsZXQgZmdCID0gKGZnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgd2hpbGUgKGNyIDwgcmF0aW8gJiYgKGZnUiA+IDAgfHwgZmdHID4gMCB8fCBmZ0IgPiAwKSkge1xuICAgICAgLy8gUmVkdWNlIGJ5IDEwJSB1bnRpbCB0aGUgcmF0aW8gaXMgaGl0XG4gICAgICBmZ1IgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnUiAqIDAuMSkpO1xuICAgICAgZmdHIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0cgKiAwLjEpKTtcbiAgICAgIGZnQiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdCICogMC4xKSk7XG4gICAgICBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgfVxuICAgIHJldHVybiAoZmdSIDw8IDI0IHwgZmdHIDw8IDE2IHwgZmdCIDw8IDggfCAweEZGKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFRoaXMgaXMgYSBuYWl2ZSBidXQgZmFzdCBhcHByb2FjaCB0byBpbmNyZWFzaW5nIGx1bWluYW5jZSBhcyBjb252ZXJ0aW5nIHRvXG4gICAgLy8gSFNMIGFuZCBiYWNrIGlzIGV4cGVuc2l2ZVxuICAgIGNvbnN0IGJnUiA9IChiZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBmZ1IgPSAoZmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgbGV0IGZnRyA9IChmZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBsZXQgZmdCID0gKGZnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgd2hpbGUgKGNyIDwgcmF0aW8gJiYgKGZnUiA8IDB4RkYgfHwgZmdHIDwgMHhGRiB8fCBmZ0IgPCAweEZGKSkge1xuICAgICAgLy8gSW5jcmVhc2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiA9IE1hdGgubWluKDB4RkYsIGZnUiArIE1hdGguY2VpbCgoMjU1IC0gZmdSKSAqIDAuMSkpO1xuICAgICAgZmdHID0gTWF0aC5taW4oMHhGRiwgZmdHICsgTWF0aC5jZWlsKCgyNTUgLSBmZ0cpICogMC4xKSk7XG4gICAgICBmZ0IgPSBNYXRoLm1pbigweEZGLCBmZ0IgKyBNYXRoLmNlaWwoKDI1NSAtIGZnQikgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ2hhbm5lbHModmFsdWU6IG51bWJlcik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gWyh2YWx1ZSA+PiAyNCkgJiAweEZGLCAodmFsdWUgPj4gMTYpICYgMHhGRiwgKHZhbHVlID4+IDgpICYgMHhGRiwgdmFsdWUgJiAweEZGXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9QYWRkZWRIZXgoYzogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IGMudG9TdHJpbmcoMTYpO1xuICByZXR1cm4gcy5sZW5ndGggPCAyID8gJzAnICsgcyA6IHM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29udHJhc3QgcmF0aW8gYmV0d2VlbiB0d28gcmVsYXRpdmUgbHVtaW5hbmNlIHZhbHVlcy5cbiAqIEBwYXJhbSBsMSBUaGUgZmlyc3QgcmVsYXRpdmUgbHVtaW5hbmNlLlxuICogQHBhcmFtIGwyIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI2NvbnRyYXN0LXJhdGlvZGVmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFzdFJhdGlvKGwxOiBudW1iZXIsIGwyOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAobDEgPCBsMikge1xuICAgIHJldHVybiAobDIgKyAwLjA1KSAvIChsMSArIDAuMDUpO1xuICB9XG4gIHJldHVybiAobDEgKyAwLjA1KSAvIChsMiArIDAuMDUpO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMjAgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgQ2hyaXN0b3BoZXIgSmVmZnJleSAoTUlUIExpY2Vuc2UpXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBPcmlnaW5hbGx5IGZvcmtlZCBmcm9tICh3aXRoIHRoZSBhdXRob3IncyBwZXJtaXNzaW9uKTpcbiAqICAgRmFicmljZSBCZWxsYXJkJ3MgamF2YXNjcmlwdCB2dDEwMCBmb3IganNsaW51eDpcbiAqICAgaHR0cDovL2JlbGxhcmQub3JnL2pzbGludXgvXG4gKiAgIENvcHlyaWdodCAoYykgMjAxMSBGYWJyaWNlIEJlbGxhcmRcbiAqICAgVGhlIG9yaWdpbmFsIGRlc2lnbiByZW1haW5zLiBUaGUgdGVybWluYWwgaXRzZWxmXG4gKiAgIGhhcyBiZWVuIGV4dGVuZGVkIHRvIGluY2x1ZGUgeHRlcm0gQ1NJIGNvZGVzLCBhbW9uZ1xuICogICBvdGhlciBmZWF0dXJlcy5cbiAqXG4gKiBUZXJtaW5hbCBFbXVsYXRpb24gUmVmZXJlbmNlczpcbiAqICAgaHR0cDovL3Z0MTAwLm5ldC9cbiAqICAgaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy50eHRcbiAqICAgaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy5odG1sXG4gKiAgIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC92dHRlc3QvXG4gKiAgIGh0dHA6Ly93d3cuaW53YXAuY29tL3BkcDEwL2Fuc2ljb2RlLnR4dFxuICogICBodHRwOi8vbGludXguZGllLm5ldC9tYW4vNC9jb25zb2xlX2NvZGVzXG4gKiAgIGh0dHA6Ly9saW51eC5kaWUubmV0L21hbi83L3VyeHZ0XG4gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSwgTXV0YWJsZURpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSUluc3RhbnRpYXRpb25TZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UsIElCdWZmZXJTZXJ2aWNlLCBJTG9nU2VydmljZSwgSUNoYXJzZXRTZXJ2aWNlLCBJQ29yZVNlcnZpY2UsIElDb3JlTW91c2VTZXJ2aWNlLCBJVW5pY29kZVNlcnZpY2UsIExvZ0xldmVsRW51bSwgSVRlcm1pbmFsT3B0aW9ucywgSU9zY0xpbmtTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEluc3RhbnRpYXRpb25TZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL0luc3RhbnRpYXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvTG9nU2VydmljZSc7XG5pbXBvcnQgeyBCdWZmZXJTZXJ2aWNlLCBNSU5JTVVNX0NPTFMsIE1JTklNVU1fUk9XUyB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9CdWZmZXJTZXJ2aWNlJztcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL09wdGlvbnNTZXJ2aWNlJztcbmltcG9ydCB7IElEaXNwb3NhYmxlLCBJQXR0cmlidXRlRGF0YSwgSUNvcmVUZXJtaW5hbCwgSVNjcm9sbEV2ZW50LCBTY3JvbGxTb3VyY2UgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgQ29yZVNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvQ29yZVNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJRXZlbnQsIGZvcndhcmRFdmVudCB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgQ29yZU1vdXNlU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Db3JlTW91c2VTZXJ2aWNlJztcbmltcG9ydCB7IFVuaWNvZGVTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1VuaWNvZGVTZXJ2aWNlJztcbmltcG9ydCB7IENoYXJzZXRTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL0NoYXJzZXRTZXJ2aWNlJztcbmltcG9ydCB7IHVwZGF0ZVdpbmRvd3NNb2RlV3JhcHBlZFN0YXRlIH0gZnJvbSAnY29tbW9uL1dpbmRvd3NNb2RlJztcbmltcG9ydCB7IElGdW5jdGlvbklkZW50aWZpZXIsIElQYXJhbXMgfSBmcm9tICdjb21tb24vcGFyc2VyL1R5cGVzJztcbmltcG9ydCB7IElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElucHV0SGFuZGxlciB9IGZyb20gJ2NvbW1vbi9JbnB1dEhhbmRsZXInO1xuaW1wb3J0IHsgV3JpdGVCdWZmZXIgfSBmcm9tICdjb21tb24vaW5wdXQvV3JpdGVCdWZmZXInO1xuaW1wb3J0IHsgT3NjTGlua1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvT3NjTGlua1NlcnZpY2UnO1xuXG4vLyBPbmx5IHRyaWdnZXIgdGhpcyB3YXJuaW5nIGEgc2luZ2xlIHRpbWUgcGVyIHNlc3Npb25cbmxldCBoYXNXcml0ZVN5bmNXYXJuSGFwcGVuZWQgPSBmYWxzZTtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvcmVUZXJtaW5hbCBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJQ29yZVRlcm1pbmFsIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9pbnN0YW50aWF0aW9uU2VydmljZTogSUluc3RhbnRpYXRpb25TZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2xvZ1NlcnZpY2U6IElMb2dTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NoYXJzZXRTZXJ2aWNlOiBJQ2hhcnNldFNlcnZpY2U7XG4gIHByb3RlY3RlZCByZWFkb25seSBfb3NjTGlua1NlcnZpY2U6IElPc2NMaW5rU2VydmljZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29yZU1vdXNlU2VydmljZTogSUNvcmVNb3VzZVNlcnZpY2U7XG4gIHB1YmxpYyByZWFkb25seSBjb3JlU2VydmljZTogSUNvcmVTZXJ2aWNlO1xuICBwdWJsaWMgcmVhZG9ubHkgdW5pY29kZVNlcnZpY2U6IElVbmljb2RlU2VydmljZTtcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2U7XG5cbiAgcHJvdGVjdGVkIF9pbnB1dEhhbmRsZXI6IElucHV0SGFuZGxlcjtcbiAgcHJpdmF0ZSBfd3JpdGVCdWZmZXI6IFdyaXRlQnVmZmVyO1xuICBwcml2YXRlIF93aW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25CaW5hcnkgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQmluYXJ5ID0gdGhpcy5fb25CaW5hcnkuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRGF0YSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25EYXRhID0gdGhpcy5fb25EYXRhLmV2ZW50O1xuICBwcm90ZWN0ZWQgX29uTGluZUZlZWQgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkxpbmVGZWVkID0gdGhpcy5fb25MaW5lRmVlZC5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXNpemUgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8eyBjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlciB9PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVzaXplID0gdGhpcy5fb25SZXNpemUuZXZlbnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBfb25Xcml0ZVBhcnNlZCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uV3JpdGVQYXJzZWQgPSB0aGlzLl9vbldyaXRlUGFyc2VkLmV2ZW50O1xuXG4gIC8qKlxuICAgKiBJbnRlcm5hbGx5IHdlIHRyYWNrIHRoZSBzb3VyY2Ugb2YgdGhlIHNjcm9sbCBidXQgdGhpcyBpcyBtZWFuaW5nbGVzcyBvdXRzaWRlIHRoZSBsaWJyYXJ5IHNvXG4gICAqIGl0J3MgZmlsdGVyZWQgb3V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIF9vblNjcm9sbEFwaT86IEV2ZW50RW1pdHRlcjxudW1iZXIsIHZvaWQ+O1xuICBwcm90ZWN0ZWQgX29uU2Nyb2xsID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElTY3JvbGxFdmVudCwgdm9pZD4oKSk7XG4gIHB1YmxpYyBnZXQgb25TY3JvbGwoKTogSUV2ZW50PG51bWJlciwgdm9pZD4ge1xuICAgIGlmICghdGhpcy5fb25TY3JvbGxBcGkpIHtcbiAgICAgIHRoaXMuX29uU2Nyb2xsQXBpID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPG51bWJlciwgdm9pZD4oKSk7XG4gICAgICB0aGlzLl9vblNjcm9sbC5ldmVudChldiA9PiB7XG4gICAgICAgIHRoaXMuX29uU2Nyb2xsQXBpPy5maXJlKGV2LnBvc2l0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb25TY3JvbGxBcGkuZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHMoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29sczsgfVxuICBwdWJsaWMgZ2V0IHJvd3MoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93czsgfVxuICBwdWJsaWMgZ2V0IGJ1ZmZlcnMoKTogSUJ1ZmZlclNldCB7IHJldHVybiB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnM7IH1cbiAgcHVibGljIGdldCBvcHRpb25zKCk6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+IHsgcmV0dXJuIHRoaXMub3B0aW9uc1NlcnZpY2Uub3B0aW9uczsgfVxuICBwdWJsaWMgc2V0IG9wdGlvbnMob3B0aW9uczogSVRlcm1pbmFsT3B0aW9ucykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9uc1NlcnZpY2Uub3B0aW9uc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8SVRlcm1pbmFsT3B0aW9ucz5cbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIFNldHVwIGFuZCBpbml0aWFsaXplIHNlcnZpY2VzXG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UgPSBuZXcgSW5zdGFudGlhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLm9wdGlvbnNTZXJ2aWNlID0gdGhpcy5yZWdpc3RlcihuZXcgT3B0aW9uc1NlcnZpY2Uob3B0aW9ucykpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSU9wdGlvbnNTZXJ2aWNlLCB0aGlzLm9wdGlvbnNTZXJ2aWNlKTtcbiAgICB0aGlzLl9idWZmZXJTZXJ2aWNlID0gdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShCdWZmZXJTZXJ2aWNlKSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQnVmZmVyU2VydmljZSwgdGhpcy5fYnVmZmVyU2VydmljZSk7XG4gICAgdGhpcy5fbG9nU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoTG9nU2VydmljZSkpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSUxvZ1NlcnZpY2UsIHRoaXMuX2xvZ1NlcnZpY2UpO1xuICAgIHRoaXMuY29yZVNlcnZpY2UgPSB0aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKENvcmVTZXJ2aWNlKSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQ29yZVNlcnZpY2UsIHRoaXMuY29yZVNlcnZpY2UpO1xuICAgIHRoaXMuY29yZU1vdXNlU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoQ29yZU1vdXNlU2VydmljZSkpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSUNvcmVNb3VzZVNlcnZpY2UsIHRoaXMuY29yZU1vdXNlU2VydmljZSk7XG4gICAgdGhpcy51bmljb2RlU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoVW5pY29kZVNlcnZpY2UpKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElVbmljb2RlU2VydmljZSwgdGhpcy51bmljb2RlU2VydmljZSk7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2UgPSB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShDaGFyc2V0U2VydmljZSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQ2hhcnNldFNlcnZpY2UsIHRoaXMuX2NoYXJzZXRTZXJ2aWNlKTtcbiAgICB0aGlzLl9vc2NMaW5rU2VydmljZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKE9zY0xpbmtTZXJ2aWNlKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElPc2NMaW5rU2VydmljZSwgdGhpcy5fb3NjTGlua1NlcnZpY2UpO1xuXG5cbiAgICAvLyBSZWdpc3RlciBpbnB1dCBoYW5kbGVyIGFuZCBoYW5kbGUvZm9yd2FyZCBldmVudHNcbiAgICB0aGlzLl9pbnB1dEhhbmRsZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBJbnB1dEhhbmRsZXIodGhpcy5fYnVmZmVyU2VydmljZSwgdGhpcy5fY2hhcnNldFNlcnZpY2UsIHRoaXMuY29yZVNlcnZpY2UsIHRoaXMuX2xvZ1NlcnZpY2UsIHRoaXMub3B0aW9uc1NlcnZpY2UsIHRoaXMuX29zY0xpbmtTZXJ2aWNlLCB0aGlzLmNvcmVNb3VzZVNlcnZpY2UsIHRoaXMudW5pY29kZVNlcnZpY2UpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9pbnB1dEhhbmRsZXIub25MaW5lRmVlZCwgdGhpcy5fb25MaW5lRmVlZCkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyKTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVyc1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX2J1ZmZlclNlcnZpY2Uub25SZXNpemUsIHRoaXMuX29uUmVzaXplKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5jb3JlU2VydmljZS5vbkRhdGEsIHRoaXMuX29uRGF0YSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuY29yZVNlcnZpY2Uub25CaW5hcnksIHRoaXMuX29uQmluYXJ5KSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLmNvcmVTZXJ2aWNlLm9uUmVxdWVzdFNjcm9sbFRvQm90dG9tKCgpID0+IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5jb3JlU2VydmljZS5vblVzZXJJbnB1dCgoKSA9PiAgdGhpcy5fd3JpdGVCdWZmZXIuaGFuZGxlVXNlcklucHV0KCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMub3B0aW9uc1NlcnZpY2Uub25NdWx0aXBsZU9wdGlvbkNoYW5nZShbJ3dpbmRvd3NNb2RlJywgJ3dpbmRvd3NQdHknXSwgKCkgPT4gdGhpcy5faGFuZGxlV2luZG93c1B0eU9wdGlvbkNoYW5nZSgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLm9uU2Nyb2xsKGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuX29uU2Nyb2xsLmZpcmUoeyBwb3NpdGlvbjogdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3AsIHNvdXJjZTogU2Nyb2xsU291cmNlLlRFUk1JTkFMIH0pO1xuICAgICAgdGhpcy5faW5wdXRIYW5kbGVyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnNjcm9sbFRvcCwgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25TY3JvbGwoZXZlbnQgPT4ge1xuICAgICAgdGhpcy5fb25TY3JvbGwuZmlyZSh7IHBvc2l0aW9uOiB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCwgc291cmNlOiBTY3JvbGxTb3VyY2UuVEVSTUlOQUwgfSk7XG4gICAgICB0aGlzLl9pbnB1dEhhbmRsZXIubWFya1JhbmdlRGlydHkodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIH0pKTtcblxuICAgIC8vIFNldHVwIFdyaXRlQnVmZmVyXG4gICAgdGhpcy5fd3JpdGVCdWZmZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBXcml0ZUJ1ZmZlcigoZGF0YSwgcHJvbWlzZVJlc3VsdCkgPT4gdGhpcy5faW5wdXRIYW5kbGVyLnBhcnNlKGRhdGEsIHByb21pc2VSZXN1bHQpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5fd3JpdGVCdWZmZXIub25Xcml0ZVBhcnNlZCwgdGhpcy5fb25Xcml0ZVBhcnNlZCkpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlKGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXksIGNhbGxiYWNrPzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX3dyaXRlQnVmZmVyLndyaXRlKGRhdGEsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBkYXRhIHRvIHRlcm1pbmFsIHN5bmNob25vdXNseS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgdW5yZWxpYWJsZSB3aXRoIGFzeW5jIHBhcnNlciBoYW5kbGVycywgdGh1cyBzaG91bGQgbm90XG4gICAqIGJlIHVzZWQgYW55bW9yZS4gSWYgeW91IG5lZWQgYmxvY2tpbmcgc2VtYW50aWNzIG9uIGRhdGEgaW5wdXQgY29uc2lkZXJcbiAgICogYHdyaXRlYCB3aXRoIGEgY2FsbGJhY2sgaW5zdGVhZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVW5yZWxpYWJsZSwgd2lsbCBiZSByZW1vdmVkIHNvb24uXG4gICAqL1xuICBwdWJsaWMgd3JpdGVTeW5jKGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXksIG1heFN1YnNlcXVlbnRDYWxscz86IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dTZXJ2aWNlLmxvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5XQVJOICYmICFoYXNXcml0ZVN5bmNXYXJuSGFwcGVuZWQpIHtcbiAgICAgIHRoaXMuX2xvZ1NlcnZpY2Uud2Fybignd3JpdGVTeW5jIGlzIHVucmVsaWFibGUgYW5kIHdpbGwgYmUgcmVtb3ZlZCBzb29uLicpO1xuICAgICAgaGFzV3JpdGVTeW5jV2FybkhhcHBlbmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fd3JpdGVCdWZmZXIud3JpdGVTeW5jKGRhdGEsIG1heFN1YnNlcXVlbnRDYWxscyk7XG4gIH1cblxuICBwdWJsaWMgaW5wdXQoZGF0YTogc3RyaW5nLCB3YXNVc2VySW5wdXQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGRhdGEsIHdhc1VzZXJJbnB1dCk7XG4gIH1cblxuICBwdWJsaWMgcmVzaXplKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGlzTmFOKHgpIHx8IGlzTmFOKHkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgeCA9IE1hdGgubWF4KHgsIE1JTklNVU1fQ09MUyk7XG4gICAgeSA9IE1hdGgubWF4KHksIE1JTklNVU1fUk9XUyk7XG5cbiAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLnJlc2l6ZSh4LCB5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGwgdGhlIHRlcm1pbmFsIGRvd24gMSByb3csIGNyZWF0aW5nIGEgYmxhbmsgbGluZS5cbiAgICogQHBhcmFtIGVyYXNlQXR0ciBUaGUgYXR0cmlidXRlIGRhdGEgdG8gdXNlIHRoZSBmb3IgYmxhbmsgbGluZS5cbiAgICogQHBhcmFtIGlzV3JhcHBlZCBXaGV0aGVyIHRoZSBuZXcgbGluZSBpcyB3cmFwcGVkIGZyb20gdGhlIHByZXZpb3VzIGxpbmUuXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsKGVyYXNlQXR0cjogSUF0dHJpYnV0ZURhdGEsIGlzV3JhcHBlZDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGwoZXJhc2VBdHRyLCBpc1dyYXBwZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCB0aGUgZGlzcGxheSBvZiB0aGUgdGVybWluYWxcbiAgICogQHBhcmFtIGRpc3AgVGhlIG51bWJlciBvZiBsaW5lcyB0byBzY3JvbGwgZG93biAobmVnYXRpdmUgc2Nyb2xsIHVwKS5cbiAgICogQHBhcmFtIHN1cHByZXNzU2Nyb2xsRXZlbnQgRG9uJ3QgZW1pdCB0aGUgc2Nyb2xsIGV2ZW50IGFzIHNjcm9sbExpbmVzLiBUaGlzIGlzIHVzZWQgdG8gYXZvaWRcbiAgICogdW53YW50ZWQgZXZlbnRzIGJlaW5nIGhhbmRsZWQgYnkgdGhlIHZpZXdwb3J0IHdoZW4gdGhlIGV2ZW50IHdhcyB0cmlnZ2VyZWQgZnJvbSB0aGUgdmlld3BvcnRcbiAgICogb3JpZ2luYWxseS5cbiAgICogQHBhcmFtIHNvdXJjZSBXaGljaCBjb21wb25lbnQgdGhlIGV2ZW50IGNhbWUgZnJvbS5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ/OiBib29sZWFuLCBzb3VyY2U/OiBTY3JvbGxTb3VyY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLnNjcm9sbExpbmVzKGRpc3AsIHN1cHByZXNzU2Nyb2xsRXZlbnQsIHNvdXJjZSk7XG4gIH1cblxuICBwdWJsaWMgc2Nyb2xsUGFnZXMocGFnZUNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbExpbmVzKHBhZ2VDb3VudCAqICh0aGlzLnJvd3MgLSAxKSk7XG4gIH1cblxuICBwdWJsaWMgc2Nyb2xsVG9Ub3AoKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxMaW5lcygtdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3ApO1xuICB9XG5cbiAgcHVibGljIHNjcm9sbFRvQm90dG9tKCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsTGluZXModGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UgLSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCk7XG4gIH1cblxuICBwdWJsaWMgc2Nyb2xsVG9MaW5lKGxpbmU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNjcm9sbEFtb3VudCA9IGxpbmUgLSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcDtcbiAgICBpZiAoc2Nyb2xsQW1vdW50ICE9PSAwKSB7XG4gICAgICB0aGlzLnNjcm9sbExpbmVzKHNjcm9sbEFtb3VudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEFkZCBoYW5kbGVyIGZvciBFU0MgZXNjYXBlIHNlcXVlbmNlLiBTZWUgeHRlcm0uZC50cyBmb3IgZGV0YWlscy4gKi9cbiAgcHVibGljIHJlZ2lzdGVyRXNjSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgY2FsbGJhY2s6ICgpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dEhhbmRsZXIucmVnaXN0ZXJFc2NIYW5kbGVyKGlkLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQWRkIGhhbmRsZXIgZm9yIERDUyBlc2NhcGUgc2VxdWVuY2UuIFNlZSB4dGVybS5kLnRzIGZvciBkZXRhaWxzLiAqL1xuICBwdWJsaWMgcmVnaXN0ZXJEY3NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZywgcGFyYW06IElQYXJhbXMpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dEhhbmRsZXIucmVnaXN0ZXJEY3NIYW5kbGVyKGlkLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQWRkIGhhbmRsZXIgZm9yIENTSSBlc2NhcGUgc2VxdWVuY2UuIFNlZSB4dGVybS5kLnRzIGZvciBkZXRhaWxzLiAqL1xuICBwdWJsaWMgcmVnaXN0ZXJDc2lIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBjYWxsYmFjazogKHBhcmFtczogSVBhcmFtcykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0SGFuZGxlci5yZWdpc3RlckNzaUhhbmRsZXIoaWQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBBZGQgaGFuZGxlciBmb3IgT1NDIGVzY2FwZSBzZXF1ZW5jZS4gU2VlIHh0ZXJtLmQudHMgZm9yIGRldGFpbHMuICovXG4gIHB1YmxpYyByZWdpc3Rlck9zY0hhbmRsZXIoaWRlbnQ6IG51bWJlciwgY2FsbGJhY2s6IChkYXRhOiBzdHJpbmcpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dEhhbmRsZXIucmVnaXN0ZXJPc2NIYW5kbGVyKGlkZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NldHVwKCk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZVdpbmRvd3NQdHlPcHRpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnB1dEhhbmRsZXIucmVzZXQoKTtcbiAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLnJlc2V0KCk7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLmNvcmVTZXJ2aWNlLnJlc2V0KCk7XG4gICAgdGhpcy5jb3JlTW91c2VTZXJ2aWNlLnJlc2V0KCk7XG4gIH1cblxuXG4gIHByaXZhdGUgX2hhbmRsZVdpbmRvd3NQdHlPcHRpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgbGV0IHZhbHVlID0gZmFsc2U7XG4gICAgY29uc3Qgd2luZG93c1B0eSA9IHRoaXMub3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dzUHR5O1xuICAgIGlmICh3aW5kb3dzUHR5ICYmIHdpbmRvd3NQdHkuYnVpbGROdW1iZXIgIT09IHVuZGVmaW5lZCAmJiB3aW5kb3dzUHR5LmJ1aWxkTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gISEod2luZG93c1B0eS5iYWNrZW5kID09PSAnY29ucHR5JyAmJiB3aW5kb3dzUHR5LmJ1aWxkTnVtYmVyIDwgMjEzNzYpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd3NNb2RlKSB7XG4gICAgICB2YWx1ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fZW5hYmxlV2luZG93c1dyYXBwaW5nSGV1cmlzdGljcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl93aW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9lbmFibGVXaW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fd2luZG93c1dyYXBwaW5nSGV1cmlzdGljcy52YWx1ZSkge1xuICAgICAgY29uc3QgZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10gPSBbXTtcbiAgICAgIGRpc3Bvc2FibGVzLnB1c2godGhpcy5vbkxpbmVGZWVkKHVwZGF0ZVdpbmRvd3NNb2RlV3JhcHBlZFN0YXRlLmJpbmQobnVsbCwgdGhpcy5fYnVmZmVyU2VydmljZSkpKTtcbiAgICAgIGRpc3Bvc2FibGVzLnB1c2godGhpcy5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0gnIH0sICgpID0+IHtcbiAgICAgICAgdXBkYXRlV2luZG93c01vZGVXcmFwcGVkU3RhdGUodGhpcy5fYnVmZmVyU2VydmljZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMuX3dpbmRvd3NXcmFwcGluZ0hldXJpc3RpY3MudmFsdWUgPSB0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGQgb2YgZGlzcG9zYWJsZXMpIHtcbiAgICAgICAgICBkLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmludGVyZmFjZSBJTGlzdGVuZXI8VCwgVSA9IHZvaWQ+IHtcbiAgKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudDxULCBVID0gdm9pZD4ge1xuICAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiB7XG4gIGV2ZW50OiBJRXZlbnQ8VCwgVT47XG4gIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG4gIGRpc3Bvc2UoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlcjxULCBVID0gdm9pZD4gaW1wbGVtZW50cyBJRXZlbnRFbWl0dGVyPFQsIFU+IHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICBwcml2YXRlIF9ldmVudD86IElFdmVudDxULCBVPjtcbiAgcHJpdmF0ZSBfZGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgZ2V0IGV2ZW50KCk6IElFdmVudDxULCBVPiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudCkge1xuICAgICAgdGhpcy5fZXZlbnQgPSAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlID0ge1xuICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW2ldID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBkaXNwb3NhYmxlO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50O1xuICB9XG5cbiAgcHVibGljIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXVlOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZS5wdXNoKHRoaXMuX2xpc3RlbmVyc1tpXSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlW2ldLmNhbGwodW5kZWZpbmVkLCBhcmcxLCBhcmcyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZEV2ZW50PFQ+KGZyb206IElFdmVudDxUPiwgdG86IElFdmVudEVtaXR0ZXI8VD4pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiBmcm9tKGUgPT4gdG8uZmlyZShlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5BbmRTdWJzY3JpYmU8VD4oZXZlbnQ6IElFdmVudDxUPiwgaGFuZGxlcjogKGU6IFQgfCB1bmRlZmluZWQpID0+IGFueSk6IElEaXNwb3NhYmxlIHtcbiAgaGFuZGxlcih1bmRlZmluZWQpO1xuICByZXR1cm4gZXZlbnQoZSA9PiBoYW5kbGVyKGUpKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBDaHJpc3RvcGhlciBKZWZmcmV5IChNSVQgTGljZW5zZSlcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElJbnB1dEhhbmRsZXIsIElBdHRyaWJ1dGVEYXRhLCBJRGlzcG9zYWJsZSwgSVdpbmRvd09wdGlvbnMsIElDb2xvckV2ZW50LCBJUGFyc2VTdGFjaywgQ29sb3JJbmRleCwgQ29sb3JSZXF1ZXN0VHlwZSwgU3BlY2lhbENvbG9ySW5kZXggfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgQzAsIEMxIH0gZnJvbSAnY29tbW9uL2RhdGEvRXNjYXBlU2VxdWVuY2VzJztcbmltcG9ydCB7IENIQVJTRVRTLCBERUZBVUxUX0NIQVJTRVQgfSBmcm9tICdjb21tb24vZGF0YS9DaGFyc2V0cyc7XG5pbXBvcnQgeyBFc2NhcGVTZXF1ZW5jZVBhcnNlciB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvRXNjYXBlU2VxdWVuY2VQYXJzZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgU3RyaW5nVG9VdGYzMiwgc3RyaW5nRnJvbUNvZGVQb2ludCwgVXRmOFRvVXRmMzIgfSBmcm9tICdjb21tb24vaW5wdXQvVGV4dERlY29kZXInO1xuaW1wb3J0IHsgQnVmZmVyTGluZSwgREVGQVVMVF9BVFRSX0RBVEEgfSBmcm9tICdjb21tb24vYnVmZmVyL0J1ZmZlckxpbmUnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJUGFyc2luZ1N0YXRlLCBJRXNjYXBlU2VxdWVuY2VQYXJzZXIsIElQYXJhbXMsIElGdW5jdGlvbklkZW50aWZpZXIgfSBmcm9tICdjb21tb24vcGFyc2VyL1R5cGVzJztcbmltcG9ydCB7IE5VTExfQ0VMTF9DT0RFLCBOVUxMX0NFTExfV0lEVEgsIEF0dHJpYnV0ZXMsIEZnRmxhZ3MsIEJnRmxhZ3MsIENvbnRlbnQsIFVuZGVybGluZVN0eWxlIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuaW1wb3J0IHsgSUNvcmVTZXJ2aWNlLCBJQnVmZmVyU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlLCBJTG9nU2VydmljZSwgSUNvcmVNb3VzZVNlcnZpY2UsIElDaGFyc2V0U2VydmljZSwgSVVuaWNvZGVTZXJ2aWNlLCBMb2dMZXZlbEVudW0sIElPc2NMaW5rU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBVbmljb2RlU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Vbmljb2RlU2VydmljZSc7XG5pbXBvcnQgeyBPc2NIYW5kbGVyIH0gZnJvbSAnY29tbW9uL3BhcnNlci9Pc2NQYXJzZXInO1xuaW1wb3J0IHsgRGNzSGFuZGxlciB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvRGNzUGFyc2VyJztcbmltcG9ydCB7IElCdWZmZXIgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IHBhcnNlQ29sb3IgfSBmcm9tICdjb21tb24vaW5wdXQvWFBhcnNlQ29sb3InO1xuXG4vKipcbiAqIE1hcCBjb2xsZWN0IHRvIGdsZXZlbC4gVXNlZCBpbiBgc2VsZWN0Q2hhcnNldGAuXG4gKi9cbmNvbnN0IEdMRVZFTDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHsgJygnOiAwLCAnKSc6IDEsICcqJzogMiwgJysnOiAzLCAnLSc6IDEsICcuJzogMiB9O1xuXG4vKipcbiAqIFZUIGNvbW1hbmRzIGRvbmUgYnkgdGhlIHBhcnNlciAtIEZJWE1FOiBtb3ZlIHRoaXMgdG8gdGhlIHBhcnNlcj9cbiAqL1xuLy8gQHZ0OiAjWSAgIEVTQyAgIENTSSAgIFwiQ29udHJvbCBTZXF1ZW5jZSBJbnRyb2R1Y2VyXCIgICBcIkVTQyBbXCIgICBcIlN0YXJ0IG9mIGEgQ1NJIHNlcXVlbmNlLlwiXG4vLyBAdnQ6ICNZICAgRVNDICAgT1NDICAgXCJPcGVyYXRpbmcgU3lzdGVtIENvbW1hbmRcIiAgICAgIFwiRVNDIF1cIiAgIFwiU3RhcnQgb2YgYW4gT1NDIHNlcXVlbmNlLlwiXG4vLyBAdnQ6ICNZICAgRVNDICAgRENTICAgXCJEZXZpY2UgQ29udHJvbCBTdHJpbmdcIiAgICAgICAgIFwiRVNDIFBcIiAgIFwiU3RhcnQgb2YgYSBEQ1Mgc2VxdWVuY2UuXCJcbi8vIEB2dDogI1kgICBFU0MgICBTVCAgICBcIlN0cmluZyBUZXJtaW5hdG9yXCIgICAgICAgICAgICAgXCJFU0MgXFxcIiAgIFwiVGVybWluYXRvciB1c2VkIGZvciBzdHJpbmcgdHlwZSBzZXF1ZW5jZXMuXCJcbi8vIEB2dDogI1kgICBFU0MgICBQTSAgICBcIlByaXZhY3kgTWVzc2FnZVwiICAgICAgICAgICAgICAgXCJFU0MgXlwiICAgXCJTdGFydCBvZiBhIHByaXZhY3kgbWVzc2FnZS5cIlxuLy8gQHZ0OiAjWSAgIEVTQyAgIEFQQyAgIFwiQXBwbGljYXRpb24gUHJvZ3JhbSBDb21tYW5kXCIgICBcIkVTQyBfXCIgICBcIlN0YXJ0IG9mIGFuIEFQQyBzZXF1ZW5jZS5cIlxuLy8gQHZ0OiAjWSAgIEMxICAgIENTSSAgIFwiQ29udHJvbCBTZXF1ZW5jZSBJbnRyb2R1Y2VyXCIgICBcIlxceDlCXCIgICAgXCJTdGFydCBvZiBhIENTSSBzZXF1ZW5jZS5cIlxuLy8gQHZ0OiAjWSAgIEMxICAgIE9TQyAgIFwiT3BlcmF0aW5nIFN5c3RlbSBDb21tYW5kXCIgICAgICBcIlxceDlEXCIgICAgXCJTdGFydCBvZiBhbiBPU0Mgc2VxdWVuY2UuXCJcbi8vIEB2dDogI1kgICBDMSAgICBEQ1MgICBcIkRldmljZSBDb250cm9sIFN0cmluZ1wiICAgICAgICAgXCJcXHg5MFwiICAgIFwiU3RhcnQgb2YgYSBEQ1Mgc2VxdWVuY2UuXCJcbi8vIEB2dDogI1kgICBDMSAgICBTVCAgICBcIlN0cmluZyBUZXJtaW5hdG9yXCIgICAgICAgICAgICAgXCJcXHg5Q1wiICAgIFwiVGVybWluYXRvciB1c2VkIGZvciBzdHJpbmcgdHlwZSBzZXF1ZW5jZXMuXCJcbi8vIEB2dDogI1kgICBDMSAgICBQTSAgICBcIlByaXZhY3kgTWVzc2FnZVwiICAgICAgICAgICAgICAgXCJcXHg5RVwiICAgIFwiU3RhcnQgb2YgYSBwcml2YWN5IG1lc3NhZ2UuXCJcbi8vIEB2dDogI1kgICBDMSAgICBBUEMgICBcIkFwcGxpY2F0aW9uIFByb2dyYW0gQ29tbWFuZFwiICAgXCJcXHg5RlwiICAgIFwiU3RhcnQgb2YgYW4gQVBDIHNlcXVlbmNlLlwiXG4vLyBAdnQ6ICNZICAgQzAgICAgTlVMICAgXCJOdWxsXCIgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFwwLCBcXHgwMFwiICBcIk5VTCBpcyBpZ25vcmVkLlwiXG4vLyBAdnQ6ICNZICAgQzAgICAgRVNDICAgXCJFc2NhcGVcIiAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxlLCBcXHgxQlwiICBcIlN0YXJ0IG9mIGEgc2VxdWVuY2UuIENhbmNlbHMgYW55IG90aGVyIHNlcXVlbmNlLlwiXG5cbi8qKlxuICogRG9jdW1lbnQgeHRlcm0gVlQgZmVhdHVyZXMgaGVyZSB0aGF0IGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWRcbiAqL1xuLy8gQHZ0OiAjRVtTdXBwb3J0ZWQgdmlhIEB4dGVybS9hZGRvbi1pbWFnZS5dICBEQ1MgICBTSVhFTCAgICAgICBcIlNJWEVMIEdyYXBoaWNzXCIgICAgICAgICAgXCJEQ1MgUHMgOyBQcyA7IFBzIDsgcSBcdFB0IFNUXCIgIFwiRHJhdyBTSVhFTCBpbWFnZS5cIlxuLy8gQHZ0OiAjTiAgRENTICAgREVDVURLICAgICAgXCJVc2VyIERlZmluZWQgS2V5c1wiICAgICAgIFwiRENTIFBzIDsgUHMgXFx8IFB0IFNUXCIgICAgICAgICAgIFwiRGVmaW5pdGlvbnMgZm9yIHVzZXItZGVmaW5lZCBrZXlzLlwiXG4vLyBAdnQ6ICNOICBEQ1MgICBYVEdFVFRDQVAgICBcIlJlcXVlc3QgVGVybWluZm8gU3RyaW5nXCIgXCJEQ1MgKyBxIFB0IFNUXCIgICAgICAgICAgICAgICAgIFwiUmVxdWVzdCBUZXJtaW5mbyBTdHJpbmcuXCJcbi8vIEB2dDogI04gIERDUyAgIFhUU0VUVENBUCAgIFwiU2V0IFRlcm1pbmZvIERhdGFcIiAgICAgICBcIkRDUyArIHAgUHQgU1RcIiAgICAgICAgICAgICAgICAgXCJTZXQgVGVybWluZm8gRGF0YS5cIlxuLy8gQHZ0OiAjTiAgT1NDICAgMSAgICAgICAgICAgXCJTZXQgSWNvbiBOYW1lXCIgICAgICAgICAgIFwiT1NDIDEgOyBQdCBCRUxcIiAgICAgICAgICAgICAgICBcIlNldCBpY29uIG5hbWUuXCJcblxuLyoqXG4gKiBNYXggbGVuZ3RoIG9mIHRoZSBVVEYzMiBpbnB1dCBidWZmZXIuIFJlYWwgbWVtb3J5IGNvbnN1bXB0aW9uIGlzIDQgdGltZXMgaGlnaGVyLlxuICovXG5jb25zdCBNQVhfUEFSU0VCVUZGRVJfTEVOR1RIID0gMTMxMDcyO1xuXG4vKipcbiAqIExpbWl0IGxlbmd0aCBvZiB0aXRsZSBhbmQgaWNvbiBuYW1lIHN0YWNrcy5cbiAqL1xuY29uc3QgU1RBQ0tfTElNSVQgPSAxMDtcblxuLy8gbWFwIHBhcmFtcyB0byB3aW5kb3cgb3B0aW9uXG5mdW5jdGlvbiBwYXJhbVRvV2luZG93T3B0aW9uKG46IG51bWJlciwgb3B0czogSVdpbmRvd09wdGlvbnMpOiBib29sZWFuIHtcbiAgaWYgKG4gPiAyNCkge1xuICAgIHJldHVybiBvcHRzLnNldFdpbkxpbmVzIHx8IGZhbHNlO1xuICB9XG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgMTogcmV0dXJuICEhb3B0cy5yZXN0b3JlV2luO1xuICAgIGNhc2UgMjogcmV0dXJuICEhb3B0cy5taW5pbWl6ZVdpbjtcbiAgICBjYXNlIDM6IHJldHVybiAhIW9wdHMuc2V0V2luUG9zaXRpb247XG4gICAgY2FzZSA0OiByZXR1cm4gISFvcHRzLnNldFdpblNpemVQaXhlbHM7XG4gICAgY2FzZSA1OiByZXR1cm4gISFvcHRzLnJhaXNlV2luO1xuICAgIGNhc2UgNjogcmV0dXJuICEhb3B0cy5sb3dlcldpbjtcbiAgICBjYXNlIDc6IHJldHVybiAhIW9wdHMucmVmcmVzaFdpbjtcbiAgICBjYXNlIDg6IHJldHVybiAhIW9wdHMuc2V0V2luU2l6ZUNoYXJzO1xuICAgIGNhc2UgOTogcmV0dXJuICEhb3B0cy5tYXhpbWl6ZVdpbjtcbiAgICBjYXNlIDEwOiByZXR1cm4gISFvcHRzLmZ1bGxzY3JlZW5XaW47XG4gICAgY2FzZSAxMTogcmV0dXJuICEhb3B0cy5nZXRXaW5TdGF0ZTtcbiAgICBjYXNlIDEzOiByZXR1cm4gISFvcHRzLmdldFdpblBvc2l0aW9uO1xuICAgIGNhc2UgMTQ6IHJldHVybiAhIW9wdHMuZ2V0V2luU2l6ZVBpeGVscztcbiAgICBjYXNlIDE1OiByZXR1cm4gISFvcHRzLmdldFNjcmVlblNpemVQaXhlbHM7XG4gICAgY2FzZSAxNjogcmV0dXJuICEhb3B0cy5nZXRDZWxsU2l6ZVBpeGVscztcbiAgICBjYXNlIDE4OiByZXR1cm4gISFvcHRzLmdldFdpblNpemVDaGFycztcbiAgICBjYXNlIDE5OiByZXR1cm4gISFvcHRzLmdldFNjcmVlblNpemVDaGFycztcbiAgICBjYXNlIDIwOiByZXR1cm4gISFvcHRzLmdldEljb25UaXRsZTtcbiAgICBjYXNlIDIxOiByZXR1cm4gISFvcHRzLmdldFdpblRpdGxlO1xuICAgIGNhc2UgMjI6IHJldHVybiAhIW9wdHMucHVzaFRpdGxlO1xuICAgIGNhc2UgMjM6IHJldHVybiAhIW9wdHMucG9wVGl0bGU7XG4gICAgY2FzZSAyNDogcmV0dXJuICEhb3B0cy5zZXRXaW5MaW5lcztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBlbnVtIFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZSB7XG4gIEdFVF9XSU5fU0laRV9QSVhFTFMgPSAwLFxuICBHRVRfQ0VMTF9TSVpFX1BJWEVMUyA9IDFcbn1cblxuLy8gY3JlYXRlIGEgd2FybmluZyBsb2cgaWYgYW4gYXN5bmMgaGFuZGxlciB0YWtlcyBsb25nZXIgdGhhbiB0aGUgbGltaXQgKGluIG1zKVxuY29uc3QgU0xPV19BU1lOQ19MSU1JVCA9IDUwMDA7XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICR0ZW1wID0gMDtcblxuLyoqXG4gKiBUaGUgdGVybWluYWwncyBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiBJSW5wdXRIYW5kbGVyLCB0aGlzIGhhbmRsZXMgYWxsXG4gKiBpbnB1dCBmcm9tIHRoZSBQYXJzZXIuXG4gKlxuICogUmVmZXIgdG8gaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy5odG1sIHRvIHVuZGVyc3RhbmRcbiAqIGVhY2ggZnVuY3Rpb24ncyBoZWFkZXIgY29tbWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIElucHV0SGFuZGxlciBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJSW5wdXRIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfcGFyc2VCdWZmZXI6IFVpbnQzMkFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDQwOTYpO1xuICBwcml2YXRlIF9zdHJpbmdEZWNvZGVyOiBTdHJpbmdUb1V0ZjMyID0gbmV3IFN0cmluZ1RvVXRmMzIoKTtcbiAgcHJpdmF0ZSBfdXRmOERlY29kZXI6IFV0ZjhUb1V0ZjMyID0gbmV3IFV0ZjhUb1V0ZjMyKCk7XG4gIHByaXZhdGUgX3dvcmtDZWxsOiBDZWxsRGF0YSA9IG5ldyBDZWxsRGF0YSgpO1xuICBwcml2YXRlIF93aW5kb3dUaXRsZSA9ICcnO1xuICBwcml2YXRlIF9pY29uTmFtZSA9ICcnO1xuICBwcml2YXRlIF9kaXJ0eVJvd1RyYWNrZXI6IElEaXJ0eVJvd1RyYWNrZXI7XG4gIHByb3RlY3RlZCBfd2luZG93VGl0bGVTdGFjazogc3RyaW5nW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pY29uTmFtZVN0YWNrOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHByaXZhdGUgX2N1ckF0dHJEYXRhOiBJQXR0cmlidXRlRGF0YSA9IERFRkFVTFRfQVRUUl9EQVRBLmNsb25lKCk7XG4gIHB1YmxpYyBnZXRBdHRyRGF0YSgpOiBJQXR0cmlidXRlRGF0YSB7IHJldHVybiB0aGlzLl9jdXJBdHRyRGF0YTsgfVxuICBwcml2YXRlIF9lcmFzZUF0dHJEYXRhSW50ZXJuYWw6IElBdHRyaWJ1dGVEYXRhID0gREVGQVVMVF9BVFRSX0RBVEEuY2xvbmUoKTtcblxuICBwcml2YXRlIF9hY3RpdmVCdWZmZXI6IElCdWZmZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXF1ZXN0QmVsbCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdEJlbGwgPSB0aGlzLl9vblJlcXVlc3RCZWxsLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RSZWZyZXNoUm93cyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxudW1iZXIsIG51bWJlcj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RSZWZyZXNoUm93cyA9IHRoaXMuX29uUmVxdWVzdFJlZnJlc2hSb3dzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RSZXNldCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdFJlc2V0ID0gdGhpcy5fb25SZXF1ZXN0UmVzZXQuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVxdWVzdFNlbmRGb2N1cyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdFNlbmRGb2N1cyA9IHRoaXMuX29uUmVxdWVzdFNlbmRGb2N1cy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXF1ZXN0U3luY1Njcm9sbEJhciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdFN5bmNTY3JvbGxCYXIgPSB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RXaW5kb3dzT3B0aW9uc1JlcG9ydCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxXaW5kb3dzT3B0aW9uc1JlcG9ydFR5cGU+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQgPSB0aGlzLl9vblJlcXVlc3RXaW5kb3dzT3B0aW9uc1JlcG9ydC5ldmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkExMXlDaGFyID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkExMXlDaGFyID0gdGhpcy5fb25BMTF5Q2hhci5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25BMTF5VGFiID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkExMXlUYWIgPSB0aGlzLl9vbkExMXlUYWIuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ3Vyc29yTW92ZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ3Vyc29yTW92ZSA9IHRoaXMuX29uQ3Vyc29yTW92ZS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25MaW5lRmVlZCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uTGluZUZlZWQgPSB0aGlzLl9vbkxpbmVGZWVkLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblNjcm9sbCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25TY3JvbGwgPSB0aGlzLl9vblNjcm9sbC5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25UaXRsZUNoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25UaXRsZUNoYW5nZSA9IHRoaXMuX29uVGl0bGVDaGFuZ2UuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ29sb3IgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SUNvbG9yRXZlbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25Db2xvciA9IHRoaXMuX29uQ29sb3IuZXZlbnQ7XG5cbiAgcHJpdmF0ZSBfcGFyc2VTdGFjazogSVBhcnNlU3RhY2sgPSB7XG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICBjdXJzb3JTdGFydFg6IDAsXG4gICAgY3Vyc29yU3RhcnRZOiAwLFxuICAgIGRlY29kZWRMZW5ndGg6IDAsXG4gICAgcG9zaXRpb246IDBcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFyc2V0U2VydmljZTogSUNoYXJzZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nU2VydmljZTogSUxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vc2NMaW5rU2VydmljZTogSU9zY0xpbmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVNb3VzZVNlcnZpY2U6IElDb3JlTW91c2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3VuaWNvZGVTZXJ2aWNlOiBJVW5pY29kZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcGFyc2VyOiBJRXNjYXBlU2VxdWVuY2VQYXJzZXIgPSBuZXcgRXNjYXBlU2VxdWVuY2VQYXJzZXIoKVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcGFyc2VyKTtcbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIgPSBuZXcgRGlydHlSb3dUcmFja2VyKHRoaXMuX2J1ZmZlclNlcnZpY2UpO1xuXG4gICAgLy8gVHJhY2sgcHJvcGVydGllcyB1c2VkIGluIHBlcmZvcm1hbmNlIGNyaXRpY2FsIGNvZGUgbWFudWFsbHkgdG8gYXZvaWQgdXNpbmcgc2xvdyBnZXR0ZXJzXG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMub25CdWZmZXJBY3RpdmF0ZShlID0+IHRoaXMuX2FjdGl2ZUJ1ZmZlciA9IGUuYWN0aXZlQnVmZmVyKSk7XG5cbiAgICAvKipcbiAgICAgKiBjdXN0b20gZmFsbGJhY2sgaGFuZGxlcnNcbiAgICAgKi9cbiAgICB0aGlzLl9wYXJzZXIuc2V0Q3NpSGFuZGxlckZhbGxiYWNrKChpZGVudCwgcGFyYW1zKSA9PiB7XG4gICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdVbmtub3duIENTSSBjb2RlOiAnLCB7IGlkZW50aWZpZXI6IHRoaXMuX3BhcnNlci5pZGVudFRvU3RyaW5nKGlkZW50KSwgcGFyYW1zOiBwYXJhbXMudG9BcnJheSgpIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFc2NIYW5kbGVyRmFsbGJhY2soaWRlbnQgPT4ge1xuICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnVW5rbm93biBFU0MgY29kZTogJywgeyBpZGVudGlmaWVyOiB0aGlzLl9wYXJzZXIuaWRlbnRUb1N0cmluZyhpZGVudCkgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyRmFsbGJhY2soY29kZSA9PiB7XG4gICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdVbmtub3duIEVYRUNVVEUgY29kZTogJywgeyBjb2RlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3BhcnNlci5zZXRPc2NIYW5kbGVyRmFsbGJhY2soKGlkZW50aWZpZXIsIGFjdGlvbiwgZGF0YSkgPT4ge1xuICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnVW5rbm93biBPU0MgY29kZTogJywgeyBpZGVudGlmaWVyLCBhY3Rpb24sIGRhdGEgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fcGFyc2VyLnNldERjc0hhbmRsZXJGYWxsYmFjaygoaWRlbnQsIGFjdGlvbiwgcGF5bG9hZCkgPT4ge1xuICAgICAgaWYgKGFjdGlvbiA9PT0gJ0hPT0snKSB7XG4gICAgICAgIHBheWxvYWQgPSBwYXlsb2FkLnRvQXJyYXkoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1Vua25vd24gRENTIGNvZGU6ICcsIHsgaWRlbnRpZmllcjogdGhpcy5fcGFyc2VyLmlkZW50VG9TdHJpbmcoaWRlbnQpLCBhY3Rpb24sIHBheWxvYWQgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBwcmludCBoYW5kbGVyXG4gICAgICovXG4gICAgdGhpcy5fcGFyc2VyLnNldFByaW50SGFuZGxlcigoZGF0YSwgc3RhcnQsIGVuZCkgPT4gdGhpcy5wcmludChkYXRhLCBzdGFydCwgZW5kKSk7XG5cbiAgICAvKipcbiAgICAgKiBDU0kgaGFuZGxlclxuICAgICAqL1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0AnIH0sIHBhcmFtcyA9PiB0aGlzLmluc2VydENoYXJzKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnICcsIGZpbmFsOiAnQCcgfSwgcGFyYW1zID0+IHRoaXMuc2Nyb2xsTGVmdChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdBJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JVcChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJyAnLCBmaW5hbDogJ0EnIH0sIHBhcmFtcyA9PiB0aGlzLnNjcm9sbFJpZ2h0KHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0InIH0sIHBhcmFtcyA9PiB0aGlzLmN1cnNvckRvd24ocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnQycgfSwgcGFyYW1zID0+IHRoaXMuY3Vyc29yRm9yd2FyZChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdEJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JCYWNrd2FyZChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdFJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JOZXh0TGluZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdGJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JQcmVjZWRpbmdMaW5lKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0cnIH0sIHBhcmFtcyA9PiB0aGlzLmN1cnNvckNoYXJBYnNvbHV0ZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdIJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JQb3NpdGlvbihwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdJJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JGb3J3YXJkVGFiKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0onIH0sIHBhcmFtcyA9PiB0aGlzLmVyYXNlSW5EaXNwbGF5KHBhcmFtcywgZmFsc2UpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgcHJlZml4OiAnPycsIGZpbmFsOiAnSicgfSwgcGFyYW1zID0+IHRoaXMuZXJhc2VJbkRpc3BsYXkocGFyYW1zLCB0cnVlKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnSycgfSwgcGFyYW1zID0+IHRoaXMuZXJhc2VJbkxpbmUocGFyYW1zLCBmYWxzZSkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBwcmVmaXg6ICc/JywgZmluYWw6ICdLJyB9LCBwYXJhbXMgPT4gdGhpcy5lcmFzZUluTGluZShwYXJhbXMsIHRydWUpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdMJyB9LCBwYXJhbXMgPT4gdGhpcy5pbnNlcnRMaW5lcyhwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdNJyB9LCBwYXJhbXMgPT4gdGhpcy5kZWxldGVMaW5lcyhwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdQJyB9LCBwYXJhbXMgPT4gdGhpcy5kZWxldGVDaGFycyhwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdTJyB9LCBwYXJhbXMgPT4gdGhpcy5zY3JvbGxVcChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdUJyB9LCBwYXJhbXMgPT4gdGhpcy5zY3JvbGxEb3duKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ1gnIH0sIHBhcmFtcyA9PiB0aGlzLmVyYXNlQ2hhcnMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnWicgfSwgcGFyYW1zID0+IHRoaXMuY3Vyc29yQmFja3dhcmRUYWIocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnYCcgfSwgcGFyYW1zID0+IHRoaXMuY2hhclBvc0Fic29sdXRlKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2EnIH0sIHBhcmFtcyA9PiB0aGlzLmhQb3NpdGlvblJlbGF0aXZlKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2InIH0sIHBhcmFtcyA9PiB0aGlzLnJlcGVhdFByZWNlZGluZ0NoYXJhY3RlcihwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdjJyB9LCBwYXJhbXMgPT4gdGhpcy5zZW5kRGV2aWNlQXR0cmlidXRlc1ByaW1hcnkocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IHByZWZpeDogJz4nLCBmaW5hbDogJ2MnIH0sIHBhcmFtcyA9PiB0aGlzLnNlbmREZXZpY2VBdHRyaWJ1dGVzU2Vjb25kYXJ5KHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2QnIH0sIHBhcmFtcyA9PiB0aGlzLmxpbmVQb3NBYnNvbHV0ZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdlJyB9LCBwYXJhbXMgPT4gdGhpcy52UG9zaXRpb25SZWxhdGl2ZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdmJyB9LCBwYXJhbXMgPT4gdGhpcy5oVlBvc2l0aW9uKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2cnIH0sIHBhcmFtcyA9PiB0aGlzLnRhYkNsZWFyKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2gnIH0sIHBhcmFtcyA9PiB0aGlzLnNldE1vZGUocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IHByZWZpeDogJz8nLCBmaW5hbDogJ2gnIH0sIHBhcmFtcyA9PiB0aGlzLnNldE1vZGVQcml2YXRlKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2wnIH0sIHBhcmFtcyA9PiB0aGlzLnJlc2V0TW9kZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgcHJlZml4OiAnPycsIGZpbmFsOiAnbCcgfSwgcGFyYW1zID0+IHRoaXMucmVzZXRNb2RlUHJpdmF0ZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdtJyB9LCBwYXJhbXMgPT4gdGhpcy5jaGFyQXR0cmlidXRlcyhwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICduJyB9LCBwYXJhbXMgPT4gdGhpcy5kZXZpY2VTdGF0dXMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IHByZWZpeDogJz8nLCBmaW5hbDogJ24nIH0sIHBhcmFtcyA9PiB0aGlzLmRldmljZVN0YXR1c1ByaXZhdGUocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICchJywgZmluYWw6ICdwJyB9LCBwYXJhbXMgPT4gdGhpcy5zb2Z0UmVzZXQocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICcgJywgZmluYWw6ICdxJyB9LCBwYXJhbXMgPT4gdGhpcy5zZXRDdXJzb3JTdHlsZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdyJyB9LCBwYXJhbXMgPT4gdGhpcy5zZXRTY3JvbGxSZWdpb24ocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAncycgfSwgcGFyYW1zID0+IHRoaXMuc2F2ZUN1cnNvcihwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICd0JyB9LCBwYXJhbXMgPT4gdGhpcy53aW5kb3dPcHRpb25zKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ3UnIH0sIHBhcmFtcyA9PiB0aGlzLnJlc3RvcmVDdXJzb3IocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICdcXCcnLCBmaW5hbDogJ30nIH0sIHBhcmFtcyA9PiB0aGlzLmluc2VydENvbHVtbnMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICdcXCcnLCBmaW5hbDogJ34nIH0sIHBhcmFtcyA9PiB0aGlzLmRlbGV0ZUNvbHVtbnMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICdcIicsIGZpbmFsOiAncScgfSwgcGFyYW1zID0+IHRoaXMuc2VsZWN0UHJvdGVjdGVkKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnJCcsIGZpbmFsOiAncCcgfSwgcGFyYW1zID0+IHRoaXMucmVxdWVzdE1vZGUocGFyYW1zLCB0cnVlKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IHByZWZpeDogJz8nLCBpbnRlcm1lZGlhdGVzOiAnJCcsIGZpbmFsOiAncCcgfSwgcGFyYW1zID0+IHRoaXMucmVxdWVzdE1vZGUocGFyYW1zLCBmYWxzZSkpO1xuXG4gICAgLyoqXG4gICAgICogZXhlY3V0ZSBoYW5kbGVyXG4gICAgICovXG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKEMwLkJFTCwgKCkgPT4gdGhpcy5iZWxsKCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMC5MRiwgKCkgPT4gdGhpcy5saW5lRmVlZCgpKTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIoQzAuVlQsICgpID0+IHRoaXMubGluZUZlZWQoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKEMwLkZGLCAoKSA9PiB0aGlzLmxpbmVGZWVkKCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMC5DUiwgKCkgPT4gdGhpcy5jYXJyaWFnZVJldHVybigpKTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIoQzAuQlMsICgpID0+IHRoaXMuYmFja3NwYWNlKCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMC5IVCwgKCkgPT4gdGhpcy50YWIoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKEMwLlNPLCAoKSA9PiB0aGlzLnNoaWZ0T3V0KCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMC5TSSwgKCkgPT4gdGhpcy5zaGlmdEluKCkpO1xuICAgIC8vIEZJWE1FOiAgIFdoYXQgZG8gdG8gd2l0aCBtaXNzaW5nPyBPbGQgY29kZSBqdXN0IGFkZGVkIHRob3NlIHRvIHByaW50LlxuXG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKEMxLklORCwgKCkgPT4gdGhpcy5pbmRleCgpKTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIoQzEuTkVMLCAoKSA9PiB0aGlzLm5leHRMaW5lKCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMS5IVFMsICgpID0+IHRoaXMudGFiU2V0KCkpO1xuXG4gICAgLyoqXG4gICAgICogT1NDIGhhbmRsZXJcbiAgICAgKi9cbiAgICAvLyAgIDAgLSBpY29uIG5hbWUgKyB0aXRsZVxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMCwgbmV3IE9zY0hhbmRsZXIoZGF0YSA9PiB7IHRoaXMuc2V0VGl0bGUoZGF0YSk7IHRoaXMuc2V0SWNvbk5hbWUoZGF0YSk7IHJldHVybiB0cnVlOyB9KSk7XG4gICAgLy8gICAxIC0gaWNvbiBuYW1lXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigxLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMuc2V0SWNvbk5hbWUoZGF0YSkpKTtcbiAgICAvLyAgIDIgLSB0aXRsZVxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMiwgbmV3IE9zY0hhbmRsZXIoZGF0YSA9PiB0aGlzLnNldFRpdGxlKGRhdGEpKSk7XG4gICAgLy8gICAzIC0gc2V0IHByb3BlcnR5IFggaW4gdGhlIGZvcm0gXCJwcm9wPXZhbHVlXCJcbiAgICAvLyAgIDQgLSBDaGFuZ2UgQ29sb3IgTnVtYmVyXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcig0LCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMuc2V0T3JSZXBvcnRJbmRleGVkQ29sb3IoZGF0YSkpKTtcbiAgICAvLyAgIDUgLSBDaGFuZ2UgU3BlY2lhbCBDb2xvciBOdW1iZXJcbiAgICAvLyAgIDYgLSBFbmFibGUvZGlzYWJsZSBTcGVjaWFsIENvbG9yIE51bWJlciBjXG4gICAgLy8gICA3IC0gY3VycmVudCBkaXJlY3Rvcnk/IChub3QgaW4geHRlcm0gc3BlYywgc2VlIGh0dHBzOi8vZ2l0bGFiLmNvbS9nbmFjaG1hbi9pdGVybTIvaXNzdWVzLzM5MzkpXG4gICAgLy8gICA4IC0gY3JlYXRlIGh5cGVybGluayAobm90IGluIHh0ZXJtIHNwZWMsIHNlZSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9lZ21vbnRrb2IvZWIxMTQyOTRlZmJjZDVhZGIxOTQ0YzlmM2NiNWZlZGEpXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcig4LCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMuc2V0SHlwZXJsaW5rKGRhdGEpKSk7XG4gICAgLy8gIDEwIC0gQ2hhbmdlIFZUMTAwIHRleHQgZm9yZWdyb3VuZCBjb2xvciB0byBQdC5cbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDEwLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMuc2V0T3JSZXBvcnRGZ0NvbG9yKGRhdGEpKSk7XG4gICAgLy8gIDExIC0gQ2hhbmdlIFZUMTAwIHRleHQgYmFja2dyb3VuZCBjb2xvciB0byBQdC5cbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDExLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMuc2V0T3JSZXBvcnRCZ0NvbG9yKGRhdGEpKSk7XG4gICAgLy8gIDEyIC0gQ2hhbmdlIHRleHQgY3Vyc29yIGNvbG9yIHRvIFB0LlxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMTIsIG5ldyBPc2NIYW5kbGVyKGRhdGEgPT4gdGhpcy5zZXRPclJlcG9ydEN1cnNvckNvbG9yKGRhdGEpKSk7XG4gICAgLy8gIDEzIC0gQ2hhbmdlIG1vdXNlIGZvcmVncm91bmQgY29sb3IgdG8gUHQuXG4gICAgLy8gIDE0IC0gQ2hhbmdlIG1vdXNlIGJhY2tncm91bmQgY29sb3IgdG8gUHQuXG4gICAgLy8gIDE1IC0gQ2hhbmdlIFRla3Ryb25peCBmb3JlZ3JvdW5kIGNvbG9yIHRvIFB0LlxuICAgIC8vICAxNiAtIENoYW5nZSBUZWt0cm9uaXggYmFja2dyb3VuZCBjb2xvciB0byBQdC5cbiAgICAvLyAgMTcgLSBDaGFuZ2UgaGlnaGxpZ2h0IGJhY2tncm91bmQgY29sb3IgdG8gUHQuXG4gICAgLy8gIDE4IC0gQ2hhbmdlIFRla3Ryb25peCBjdXJzb3IgY29sb3IgdG8gUHQuXG4gICAgLy8gIDE5IC0gQ2hhbmdlIGhpZ2hsaWdodCBmb3JlZ3JvdW5kIGNvbG9yIHRvIFB0LlxuICAgIC8vICA0NiAtIENoYW5nZSBMb2cgRmlsZSB0byBQdC5cbiAgICAvLyAgNTAgLSBTZXQgRm9udCB0byBQdC5cbiAgICAvLyAgNTEgLSByZXNlcnZlZCBmb3IgRW1hY3Mgc2hlbGwuXG4gICAgLy8gIDUyIC0gTWFuaXB1bGF0ZSBTZWxlY3Rpb24gRGF0YS5cbiAgICAvLyAxMDQgOyBjIC0gUmVzZXQgQ29sb3IgTnVtYmVyIGMuXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigxMDQsIG5ldyBPc2NIYW5kbGVyKGRhdGEgPT4gdGhpcy5yZXN0b3JlSW5kZXhlZENvbG9yKGRhdGEpKSk7XG4gICAgLy8gMTA1IDsgYyAtIFJlc2V0IFNwZWNpYWwgQ29sb3IgTnVtYmVyIGMuXG4gICAgLy8gMTA2IDsgYzsgZiAtIEVuYWJsZS9kaXNhYmxlIFNwZWNpYWwgQ29sb3IgTnVtYmVyIGMuXG4gICAgLy8gMTEwIC0gUmVzZXQgVlQxMDAgdGV4dCBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMTEwLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMucmVzdG9yZUZnQ29sb3IoZGF0YSkpKTtcbiAgICAvLyAxMTEgLSBSZXNldCBWVDEwMCB0ZXh0IGJhY2tncm91bmQgY29sb3IuXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigxMTEsIG5ldyBPc2NIYW5kbGVyKGRhdGEgPT4gdGhpcy5yZXN0b3JlQmdDb2xvcihkYXRhKSkpO1xuICAgIC8vIDExMiAtIFJlc2V0IHRleHQgY3Vyc29yIGNvbG9yLlxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMTEyLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMucmVzdG9yZUN1cnNvckNvbG9yKGRhdGEpKSk7XG4gICAgLy8gMTEzIC0gUmVzZXQgbW91c2UgZm9yZWdyb3VuZCBjb2xvci5cbiAgICAvLyAxMTQgLSBSZXNldCBtb3VzZSBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgIC8vIDExNSAtIFJlc2V0IFRla3Ryb25peCBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgIC8vIDExNiAtIFJlc2V0IFRla3Ryb25peCBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgIC8vIDExNyAtIFJlc2V0IGhpZ2hsaWdodCBjb2xvci5cbiAgICAvLyAxMTggLSBSZXNldCBUZWt0cm9uaXggY3Vyc29yIGNvbG9yLlxuICAgIC8vIDExOSAtIFJlc2V0IGhpZ2hsaWdodCBmb3JlZ3JvdW5kIGNvbG9yLlxuXG4gICAgLyoqXG4gICAgICogRVNDIGhhbmRsZXJzXG4gICAgICovXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnNycgfSwgKCkgPT4gdGhpcy5zYXZlQ3Vyc29yKCkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJzgnIH0sICgpID0+IHRoaXMucmVzdG9yZUN1cnNvcigpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICdEJyB9LCAoKSA9PiB0aGlzLmluZGV4KCkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJ0UnIH0sICgpID0+IHRoaXMubmV4dExpbmUoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnSCcgfSwgKCkgPT4gdGhpcy50YWJTZXQoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnTScgfSwgKCkgPT4gdGhpcy5yZXZlcnNlSW5kZXgoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnPScgfSwgKCkgPT4gdGhpcy5rZXlwYWRBcHBsaWNhdGlvbk1vZGUoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnPicgfSwgKCkgPT4gdGhpcy5rZXlwYWROdW1lcmljTW9kZSgpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICdjJyB9LCAoKSA9PiB0aGlzLmZ1bGxSZXNldCgpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICduJyB9LCAoKSA9PiB0aGlzLnNldGdMZXZlbCgyKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnbycgfSwgKCkgPT4gdGhpcy5zZXRnTGV2ZWwoMykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJ3wnIH0sICgpID0+IHRoaXMuc2V0Z0xldmVsKDMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICd9JyB9LCAoKSA9PiB0aGlzLnNldGdMZXZlbCgyKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnficgfSwgKCkgPT4gdGhpcy5zZXRnTGV2ZWwoMSkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnJScsIGZpbmFsOiAnQCcgfSwgKCkgPT4gdGhpcy5zZWxlY3REZWZhdWx0Q2hhcnNldCgpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJyUnLCBmaW5hbDogJ0cnIH0sICgpID0+IHRoaXMuc2VsZWN0RGVmYXVsdENoYXJzZXQoKSk7XG4gICAgZm9yIChjb25zdCBmbGFnIGluIENIQVJTRVRTKSB7XG4gICAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJygnLCBmaW5hbDogZmxhZyB9LCAoKSA9PiB0aGlzLnNlbGVjdENoYXJzZXQoJygnICsgZmxhZykpO1xuICAgICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICcpJywgZmluYWw6IGZsYWcgfSwgKCkgPT4gdGhpcy5zZWxlY3RDaGFyc2V0KCcpJyArIGZsYWcpKTtcbiAgICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnKicsIGZpbmFsOiBmbGFnIH0sICgpID0+IHRoaXMuc2VsZWN0Q2hhcnNldCgnKicgKyBmbGFnKSk7XG4gICAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJysnLCBmaW5hbDogZmxhZyB9LCAoKSA9PiB0aGlzLnNlbGVjdENoYXJzZXQoJysnICsgZmxhZykpO1xuICAgICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICctJywgZmluYWw6IGZsYWcgfSwgKCkgPT4gdGhpcy5zZWxlY3RDaGFyc2V0KCctJyArIGZsYWcpKTtcbiAgICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnLicsIGZpbmFsOiBmbGFnIH0sICgpID0+IHRoaXMuc2VsZWN0Q2hhcnNldCgnLicgKyBmbGFnKSk7XG4gICAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJy8nLCBmaW5hbDogZmxhZyB9LCAoKSA9PiB0aGlzLnNlbGVjdENoYXJzZXQoJy8nICsgZmxhZykpOyAvLyBUT0RPOiBzdXBwb3J0ZWQ/XG4gICAgfVxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnIycsIGZpbmFsOiAnOCcgfSwgKCkgPT4gdGhpcy5zY3JlZW5BbGlnbm1lbnRQYXR0ZXJuKCkpO1xuXG4gICAgLyoqXG4gICAgICogZXJyb3IgaGFuZGxlclxuICAgICAqL1xuICAgIHRoaXMuX3BhcnNlci5zZXRFcnJvckhhbmRsZXIoKHN0YXRlOiBJUGFyc2luZ1N0YXRlKSA9PiB7XG4gICAgICB0aGlzLl9sb2dTZXJ2aWNlLmVycm9yKCdQYXJzaW5nIGVycm9yOiAnLCBzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBEQ1MgaGFuZGxlclxuICAgICAqL1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckRjc0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnJCcsIGZpbmFsOiAncScgfSwgbmV3IERjc0hhbmRsZXIoKGRhdGEsIHBhcmFtcykgPT4gdGhpcy5yZXF1ZXN0U3RhdHVzU3RyaW5nKGRhdGEsIHBhcmFtcykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luYyBwYXJzZSBzdXBwb3J0LlxuICAgKi9cbiAgcHJpdmF0ZSBfcHJlc2VydmVTdGFjayhjdXJzb3JTdGFydFg6IG51bWJlciwgY3Vyc29yU3RhcnRZOiBudW1iZXIsIGRlY29kZWRMZW5ndGg6IG51bWJlciwgcG9zaXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3BhcnNlU3RhY2sucGF1c2VkID0gdHJ1ZTtcbiAgICB0aGlzLl9wYXJzZVN0YWNrLmN1cnNvclN0YXJ0WCA9IGN1cnNvclN0YXJ0WDtcbiAgICB0aGlzLl9wYXJzZVN0YWNrLmN1cnNvclN0YXJ0WSA9IGN1cnNvclN0YXJ0WTtcbiAgICB0aGlzLl9wYXJzZVN0YWNrLmRlY29kZWRMZW5ndGggPSBkZWNvZGVkTGVuZ3RoO1xuICAgIHRoaXMuX3BhcnNlU3RhY2sucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgX2xvZ1Nsb3dSZXNvbHZpbmdBc3luYyhwOiBQcm9taXNlPGJvb2xlYW4+KTogdm9pZCB7XG4gICAgLy8gbG9nIGEgbGltaXRlZCB3YXJuaW5nIGFib3V0IGFuIGFzeW5jIGhhbmRsZXIgdGFraW5nIHRvbyBsb25nXG4gICAgaWYgKHRoaXMuX2xvZ1NlcnZpY2UubG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLldBUk4pIHtcbiAgICAgIFByb21pc2UucmFjZShbcCwgbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlaignI1NMT1dfVElNRU9VVCcpLCBTTE9XX0FTWU5DX0xJTUlUKSldKVxuICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBpZiAoZXJyICE9PSAnI1NMT1dfVElNRU9VVCcpIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS53YXJuKGBhc3luYyBwYXJzZXIgaGFuZGxlciB0YWtpbmcgbG9uZ2VyIHRoYW4gJHtTTE9XX0FTWU5DX0xJTUlUfSBtc2ApO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRDdXJyZW50TGlua0lkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkLnVybElkO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGNhbGwgd2l0aCBhc3luYyBoYW5kbGVyIHN1cHBvcnQuXG4gICAqXG4gICAqIFdoZXRoZXIgdGhlIHN0YWNrIHN0YXRlIGdvdCBwcmVzZXJ2ZWQgZm9yIHRoZSBuZXh0IGNhbGwsIGlzIGluZGljYXRlZCBieSB0aGUgcmV0dXJuIHZhbHVlOlxuICAgKiAtIHVuZGVmaW5lZCAodm9pZCk6XG4gICAqICAgYWxsIGhhbmRsZXJzIHdlcmUgc3luYywgbm8gc3RhY2sgc2F2ZSwgY29udGludWUgbm9ybWFsbHkgd2l0aCBuZXh0IGNodW5rXG4gICAqIC0gUHJvbWlzZVxcPGJvb2xlYW5cXD46XG4gICAqICAgZXhlY3V0aW9uIHN0b3BwZWQgYXQgYXN5bmMgaGFuZGxlciwgc3RhY2sgc2F2ZWQsIGNvbnRpbnVlIHdpdGggc2FtZSBjaHVuayBhbmQgdGhlIHByb21pc2VcbiAgICogICByZXNvbHZlIHZhbHVlIGFzIGBwcm9taXNlUmVzdWx0YCB1bnRpbCB0aGUgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICpcbiAgICogTm90ZTogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IGBUZXJtaW5hbC53cml0ZWAgdG8gZW5zdXJlIGNvcnJlY3QgZXhlY3V0aW9uIG9yZGVyXG4gICAqIGFuZCBwcm9wZXIgY29udGludWF0aW9uIG9mIGFzeW5jIHBhcnNlciBoYW5kbGVycy5cbiAgICovXG4gIHB1YmxpYyBwYXJzZShkYXRhOiBzdHJpbmcgfCBVaW50OEFycmF5LCBwcm9taXNlUmVzdWx0PzogYm9vbGVhbik6IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgcmVzdWx0OiB2b2lkIHwgUHJvbWlzZTxib29sZWFuPjtcbiAgICBsZXQgY3Vyc29yU3RhcnRYID0gdGhpcy5fYWN0aXZlQnVmZmVyLng7XG4gICAgbGV0IGN1cnNvclN0YXJ0WSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci55O1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgY29uc3Qgd2FzUGF1c2VkID0gdGhpcy5fcGFyc2VTdGFjay5wYXVzZWQ7XG5cbiAgICBpZiAod2FzUGF1c2VkKSB7XG4gICAgICAvLyBhc3N1bXB0aW9uOiBfcGFyc2VCdWZmZXIgbmV2ZXIgbXV0YXRlcyBiZXR3ZWVuIGFzeW5jIGNhbGxzXG4gICAgICBpZiAocmVzdWx0ID0gdGhpcy5fcGFyc2VyLnBhcnNlKHRoaXMuX3BhcnNlQnVmZmVyLCB0aGlzLl9wYXJzZVN0YWNrLmRlY29kZWRMZW5ndGgsIHByb21pc2VSZXN1bHQpKSB7XG4gICAgICAgIHRoaXMuX2xvZ1Nsb3dSZXNvbHZpbmdBc3luYyhyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgY3Vyc29yU3RhcnRYID0gdGhpcy5fcGFyc2VTdGFjay5jdXJzb3JTdGFydFg7XG4gICAgICBjdXJzb3JTdGFydFkgPSB0aGlzLl9wYXJzZVN0YWNrLmN1cnNvclN0YXJ0WTtcbiAgICAgIHRoaXMuX3BhcnNlU3RhY2sucGF1c2VkID0gZmFsc2U7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiBNQVhfUEFSU0VCVUZGRVJfTEVOR1RIKSB7XG4gICAgICAgIHN0YXJ0ID0gdGhpcy5fcGFyc2VTdGFjay5wb3NpdGlvbiArIE1BWF9QQVJTRUJVRkZFUl9MRU5HVEg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9nIGRlYnVnIGRhdGEsIHRoZSBsb2cgbGV2ZWwgZ2F0ZSBpcyB0byBwcmV2ZW50IGV4dHJhIHdvcmsgaW4gdGhpcyBob3QgcGF0aFxuICAgIGlmICh0aGlzLl9sb2dTZXJ2aWNlLmxvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5ERUJVRykge1xuICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZyhgcGFyc2luZyBkYXRhJHt0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgPyBgIFwiJHtkYXRhfVwiYCA6IGAgXCIke0FycmF5LnByb3RvdHlwZS5tYXAuY2FsbChkYXRhLCBlID0+IFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLmpvaW4oJycpfVwiYH1gLCB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBkYXRhLnNwbGl0KCcnKS5tYXAoZSA9PiBlLmNoYXJDb2RlQXQoMCkpXG4gICAgICAgIDogZGF0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZXNpemUgaW5wdXQgYnVmZmVyIGlmIG5lZWRlZFxuICAgIGlmICh0aGlzLl9wYXJzZUJ1ZmZlci5sZW5ndGggPCBkYXRhLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX3BhcnNlQnVmZmVyLmxlbmd0aCA8IE1BWF9QQVJTRUJVRkZFUl9MRU5HVEgpIHtcbiAgICAgICAgdGhpcy5fcGFyc2VCdWZmZXIgPSBuZXcgVWludDMyQXJyYXkoTWF0aC5taW4oZGF0YS5sZW5ndGgsIE1BWF9QQVJTRUJVRkZFUl9MRU5HVEgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciB0aGUgZGlydHkgcm93IHNlcnZpY2Ugc28gd2Uga25vdyB3aGljaCBsaW5lcyBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHBhcnNpbmdcbiAgICAvLyBJbXBvcnRhbnQ6IGRvIG5vdCBjbGVhciBiZXR3ZWVuIGFzeW5jIGNhbGxzLCBvdGhlcndpc2Ugd2UgbG9zdCBwZW5kaW5nIHVwZGF0ZSBpbmZvcm1hdGlvbi5cbiAgICBpZiAoIXdhc1BhdXNlZCkge1xuICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLmNsZWFyUmFuZ2UoKTtcbiAgICB9XG5cbiAgICAvLyBwcm9jZXNzIGJpZyBkYXRhIGluIHNtYWxsZXIgY2h1bmtzXG4gICAgaWYgKGRhdGEubGVuZ3RoID4gTUFYX1BBUlNFQlVGRkVSX0xFTkdUSCkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gTUFYX1BBUlNFQlVGRkVSX0xFTkdUSCkge1xuICAgICAgICBjb25zdCBlbmQgPSBpICsgTUFYX1BBUlNFQlVGRkVSX0xFTkdUSCA8IGRhdGEubGVuZ3RoID8gaSArIE1BWF9QQVJTRUJVRkZFUl9MRU5HVEggOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbGVuID0gKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJylcbiAgICAgICAgICA/IHRoaXMuX3N0cmluZ0RlY29kZXIuZGVjb2RlKGRhdGEuc3Vic3RyaW5nKGksIGVuZCksIHRoaXMuX3BhcnNlQnVmZmVyKVxuICAgICAgICAgIDogdGhpcy5fdXRmOERlY29kZXIuZGVjb2RlKGRhdGEuc3ViYXJyYXkoaSwgZW5kKSwgdGhpcy5fcGFyc2VCdWZmZXIpO1xuICAgICAgICBpZiAocmVzdWx0ID0gdGhpcy5fcGFyc2VyLnBhcnNlKHRoaXMuX3BhcnNlQnVmZmVyLCBsZW4pKSB7XG4gICAgICAgICAgdGhpcy5fcHJlc2VydmVTdGFjayhjdXJzb3JTdGFydFgsIGN1cnNvclN0YXJ0WSwgbGVuLCBpKTtcbiAgICAgICAgICB0aGlzLl9sb2dTbG93UmVzb2x2aW5nQXN5bmMocmVzdWx0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghd2FzUGF1c2VkKSB7XG4gICAgICAgIGNvbnN0IGxlbiA9ICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgPyB0aGlzLl9zdHJpbmdEZWNvZGVyLmRlY29kZShkYXRhLCB0aGlzLl9wYXJzZUJ1ZmZlcilcbiAgICAgICAgICA6IHRoaXMuX3V0ZjhEZWNvZGVyLmRlY29kZShkYXRhLCB0aGlzLl9wYXJzZUJ1ZmZlcik7XG4gICAgICAgIGlmIChyZXN1bHQgPSB0aGlzLl9wYXJzZXIucGFyc2UodGhpcy5fcGFyc2VCdWZmZXIsIGxlbikpIHtcbiAgICAgICAgICB0aGlzLl9wcmVzZXJ2ZVN0YWNrKGN1cnNvclN0YXJ0WCwgY3Vyc29yU3RhcnRZLCBsZW4sIDApO1xuICAgICAgICAgIHRoaXMuX2xvZ1Nsb3dSZXNvbHZpbmdBc3luYyhyZXN1bHQpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggIT09IGN1cnNvclN0YXJ0WCB8fCB0aGlzLl9hY3RpdmVCdWZmZXIueSAhPT0gY3Vyc29yU3RhcnRZKSB7XG4gICAgICB0aGlzLl9vbkN1cnNvck1vdmUuZmlyZSgpO1xuICAgIH1cblxuICAgIC8vIFJlZnJlc2ggYW55IGRpcnR5IHJvd3MgYWNjdW11bGF0ZWQgYXMgcGFydCBvZiBwYXJzaW5nLCBmaXJlIG9ubHkgZm9yIHJvd3Mgd2l0aGluIHRoZVxuICAgIC8vIF92aWV3cG9ydF8gd2hpY2ggaXMgcmVsYXRpdmUgdG8geWRpc3AsIG5vdCByZWxhdGl2ZSB0byB5YmFzZS5cbiAgICBjb25zdCB2aWV3cG9ydEVuZCA9IHRoaXMuX2RpcnR5Um93VHJhY2tlci5lbmQgKyAodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UgLSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCk7XG4gICAgY29uc3Qgdmlld3BvcnRTdGFydCA9IHRoaXMuX2RpcnR5Um93VHJhY2tlci5zdGFydCArICh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55YmFzZSAtIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwKTtcbiAgICBpZiAodmlld3BvcnRTdGFydCA8IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cykge1xuICAgICAgdGhpcy5fb25SZXF1ZXN0UmVmcmVzaFJvd3MuZmlyZShNYXRoLm1pbih2aWV3cG9ydFN0YXJ0LCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxKSwgTWF0aC5taW4odmlld3BvcnRFbmQsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJpbnQoZGF0YTogVWludDMyQXJyYXksIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGNvZGU6IG51bWJlcjtcbiAgICBsZXQgY2hXaWR0aDogbnVtYmVyO1xuICAgIGNvbnN0IGNoYXJzZXQgPSB0aGlzLl9jaGFyc2V0U2VydmljZS5jaGFyc2V0O1xuICAgIGNvbnN0IHNjcmVlblJlYWRlck1vZGUgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcmVlblJlYWRlck1vZGU7XG4gICAgY29uc3QgY29scyA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztcbiAgICBjb25zdCB3cmFwYXJvdW5kTW9kZSA9IHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy53cmFwYXJvdW5kO1xuICAgIGNvbnN0IGluc2VydE1vZGUgPSB0aGlzLl9jb3JlU2VydmljZS5tb2Rlcy5pbnNlcnRNb2RlO1xuICAgIGNvbnN0IGN1ckF0dHIgPSB0aGlzLl9jdXJBdHRyRGF0YTtcbiAgICBsZXQgYnVmZmVyUm93ID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSkhO1xuXG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG5cbiAgICAvLyBoYW5kbGUgd2lkZSBjaGFyczogcmVzZXQgc3RhcnRfY2VsbC0xIGlmIHdlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgc2Vjb25kIGNlbGwgb2YgYSB3aWRlIGNoYXJcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggJiYgZW5kIC0gc3RhcnQgPiAwICYmIGJ1ZmZlclJvdy5nZXRXaWR0aCh0aGlzLl9hY3RpdmVCdWZmZXIueCAtIDEpID09PSAyKSB7XG4gICAgICBidWZmZXJSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQodGhpcy5fYWN0aXZlQnVmZmVyLnggLSAxLCAwLCAxLCBjdXJBdHRyKTtcbiAgICB9XG5cbiAgICBsZXQgcHJlY2VkaW5nSm9pblN0YXRlID0gdGhpcy5fcGFyc2VyLnByZWNlZGluZ0pvaW5TdGF0ZTtcbiAgICBmb3IgKGxldCBwb3MgPSBzdGFydDsgcG9zIDwgZW5kOyArK3Bvcykge1xuICAgICAgY29kZSA9IGRhdGFbcG9zXTtcblxuICAgICAgLy8gZ2V0IGNoYXJzZXQgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG4gICAgICAvLyBjaGFyc2V0IGlzIG9ubHkgZGVmaW5lZCBmb3IgQVNDSUksIHRoZXJlZm9yZSB3ZSBvbmx5XG4gICAgICAvLyBzZWFyY2ggZm9yIGFuIHJlcGxhY2VtZW50IGNoYXIgaWYgY29kZSA8IDEyN1xuICAgICAgaWYgKGNvZGUgPCAxMjcgJiYgY2hhcnNldCkge1xuICAgICAgICBjb25zdCBjaCA9IGNoYXJzZXRbU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKV07XG4gICAgICAgIGlmIChjaCkge1xuICAgICAgICAgIGNvZGUgPSBjaC5jaGFyQ29kZUF0KDApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRJbmZvID0gdGhpcy5fdW5pY29kZVNlcnZpY2UuY2hhclByb3BlcnRpZXMoY29kZSwgcHJlY2VkaW5nSm9pblN0YXRlKTtcbiAgICAgIGNoV2lkdGggPSBVbmljb2RlU2VydmljZS5leHRyYWN0V2lkdGgoY3VycmVudEluZm8pO1xuICAgICAgY29uc3Qgc2hvdWxkSm9pbiA9IFVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RTaG91bGRKb2luKGN1cnJlbnRJbmZvKTtcbiAgICAgIGNvbnN0IG9sZFdpZHRoID0gc2hvdWxkSm9pbiA/IFVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RXaWR0aChwcmVjZWRpbmdKb2luU3RhdGUpIDogMDtcbiAgICAgIHByZWNlZGluZ0pvaW5TdGF0ZSA9IGN1cnJlbnRJbmZvO1xuXG4gICAgICBpZiAoc2NyZWVuUmVhZGVyTW9kZSkge1xuICAgICAgICB0aGlzLl9vbkExMXlDaGFyLmZpcmUoc3RyaW5nRnJvbUNvZGVQb2ludChjb2RlKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fZ2V0Q3VycmVudExpbmtJZCgpKSB7XG4gICAgICAgIHRoaXMuX29zY0xpbmtTZXJ2aWNlLmFkZExpbmVUb0xpbmsodGhpcy5fZ2V0Q3VycmVudExpbmtJZCgpLCB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGdvdG8gbmV4dCBsaW5lIGlmIGNoIHdvdWxkIG92ZXJmbG93XG4gICAgICAvLyBOT1RFOiBUbyBhdm9pZCBjb3N0bHkgd2lkdGggY2hlY2tzIGhlcmUsXG4gICAgICAvLyB0aGUgdGVybWluYWwgZG9lcyBub3QgYWxsb3cgYSBjb2xzIDwgMi5cbiAgICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCArIGNoV2lkdGggLSBvbGRXaWR0aCA+IGNvbHMpIHtcbiAgICAgICAgLy8gYXV0b3dyYXAgLSBERUNBV01cbiAgICAgICAgLy8gYXV0b21hdGljYWxseSB3cmFwcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmVcbiAgICAgICAgaWYgKHdyYXBhcm91bmRNb2RlKSB7XG4gICAgICAgICAgY29uc3Qgb2xkUm93ID0gYnVmZmVyUm93O1xuICAgICAgICAgIGxldCBvbGRDb2wgPSB0aGlzLl9hY3RpdmVCdWZmZXIueCAtIG9sZFdpZHRoO1xuICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gb2xkV2lkdGg7XG4gICAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkrKztcbiAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPT09IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gKyAxKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueS0tO1xuICAgICAgICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpLCB0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID49IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cykge1xuICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueSA9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgbGluZSBhbHJlYWR5IGV4aXN0cyAoZWcuIHRoZSBpbml0aWFsIHZpZXdwb3J0KSwgbWFyayBpdCBhcyBhXG4gICAgICAgICAgICAvLyB3cmFwcGVkIGxpbmVcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpIS5pc1dyYXBwZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyByb3cgY2hhbmdlZCwgZ2V0IGl0IGFnYWluXG4gICAgICAgICAgYnVmZmVyUm93ID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSkhO1xuICAgICAgICAgIGlmIChvbGRXaWR0aCA+IDAgJiYgYnVmZmVyUm93IGluc3RhbmNlb2YgQnVmZmVyTGluZSkge1xuICAgICAgICAgICAgLy8gQ29tYmluaW5nIGNoYXJhY3RlciB3aWRlbnMgMSBjb2x1bW4gdG8gMi5cbiAgICAgICAgICAgIC8vIE1vdmUgb2xkIGNoYXJhY3RlciB0byBuZXh0IGxpbmUuXG4gICAgICAgICAgICBidWZmZXJSb3cuY29weUNlbGxzRnJvbShvbGRSb3cgYXMgQnVmZmVyTGluZSxcbiAgICAgICAgICAgICAgb2xkQ29sLCAwLCBvbGRXaWR0aCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBjbGVhciBsZWZ0IG92ZXIgY2VsbHMgdG8gdGhlIHJpZ2h0XG4gICAgICAgICAgd2hpbGUgKG9sZENvbCA8IGNvbHMpIHtcbiAgICAgICAgICAgIG9sZFJvdy5zZXRDZWxsRnJvbUNvZGVwb2ludChvbGRDb2wrKywgMCwgMSwgY3VyQXR0cik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gY29scyAtIDE7XG4gICAgICAgICAgaWYgKGNoV2lkdGggPT09IDIpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FOiBjaGVjayBmb3IgeHRlcm0gYmVoYXZpb3JcbiAgICAgICAgICAgIC8vIFdoYXQgdG8gZG8gaGVyZT8gV2UgZ290IGEgd2lkZSBjaGFyIHRoYXQgZG9lcyBub3QgZml0IGludG8gbGFzdCBjZWxsXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaW5zZXJ0IGNvbWJpbmluZyBjaGFyIGF0IGxhc3QgY3Vyc29yIHBvc2l0aW9uXG4gICAgICAvLyB0aGlzLl9hY3RpdmVCdWZmZXIueCBzaG91bGQgbmV2ZXIgYmUgMCBmb3IgYSBjb21iaW5pbmcgY2hhclxuICAgICAgLy8gc2luY2UgdGhleSBhbHdheXMgZm9sbG93IGEgY2VsbCBjb25zdW1pbmcgY2hhclxuICAgICAgLy8gdGhlcmVmb3JlIHdlIGNhbiB0ZXN0IGZvciB0aGlzLl9hY3RpdmVCdWZmZXIueCB0byBhdm9pZCBvdmVyZmxvdyBsZWZ0XG4gICAgICBpZiAoc2hvdWxkSm9pbiAmJiB0aGlzLl9hY3RpdmVCdWZmZXIueCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWZmZXJSb3cuZ2V0V2lkdGgodGhpcy5fYWN0aXZlQnVmZmVyLnggLSAxKSA/IDEgOiAyO1xuICAgICAgICAvLyBpZiBlbXB0eSBjZWxsIGFmdGVyIGZ1bGx3aWR0aCwgbmVlZCB0byBnbyAyIGNlbGxzIGJhY2tcbiAgICAgICAgLy8gaXQgaXMgc2F2ZSB0byBzdGVwIDIgY2VsbHMgYmFjayBoZXJlXG4gICAgICAgIC8vIHNpbmNlIGFuIGVtcHR5IGNlbGwgaXMgb25seSBzZXQgYnkgZnVsbHdpZHRoIGNoYXJzXG4gICAgICAgIGJ1ZmZlclJvdy5hZGRDb2RlcG9pbnRUb0NlbGwodGhpcy5fYWN0aXZlQnVmZmVyLnggLSBvZmZzZXQsXG4gICAgICAgICAgY29kZSwgY2hXaWR0aCk7XG4gICAgICAgIGZvciAobGV0IGRlbHRhID0gY2hXaWR0aCAtIG9sZFdpZHRoOyAtLWRlbHRhID49IDA7ICkge1xuICAgICAgICAgIGJ1ZmZlclJvdy5zZXRDZWxsRnJvbUNvZGVwb2ludCh0aGlzLl9hY3RpdmVCdWZmZXIueCsrLCAwLCAwLCBjdXJBdHRyKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaW5zZXJ0IG1vZGU6IG1vdmUgY2hhcmFjdGVycyB0byByaWdodFxuICAgICAgaWYgKGluc2VydE1vZGUpIHtcbiAgICAgICAgLy8gcmlnaHQgc2hpZnQgY2VsbHMgYWNjb3JkaW5nIHRvIHRoZSB3aWR0aFxuICAgICAgICBidWZmZXJSb3cuaW5zZXJ0Q2VsbHModGhpcy5fYWN0aXZlQnVmZmVyLngsIGNoV2lkdGggLSBvbGRXaWR0aCwgdGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKGN1ckF0dHIpKTtcbiAgICAgICAgLy8gdGVzdCBsYXN0IGNlbGwgLSBzaW5jZSB0aGUgbGFzdCBjZWxsIGhhcyBvbmx5IHJvb20gZm9yXG4gICAgICAgIC8vIGEgaGFsZndpZHRoIGNoYXIgYW55IGZ1bGx3aWR0aCBzaGlmdGVkIHRoZXJlIGlzIGxvc3RcbiAgICAgICAgLy8gYW5kIHdpbGwgYmUgc2V0IHRvIGVtcHR5IGNlbGxcbiAgICAgICAgaWYgKGJ1ZmZlclJvdy5nZXRXaWR0aChjb2xzIC0gMSkgPT09IDIpIHtcbiAgICAgICAgICBidWZmZXJSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQoY29scyAtIDEsIE5VTExfQ0VMTF9DT0RFLCBOVUxMX0NFTExfV0lEVEgsIGN1ckF0dHIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHdyaXRlIGN1cnJlbnQgY2hhciB0byBidWZmZXIgYW5kIGFkdmFuY2UgY3Vyc29yXG4gICAgICBidWZmZXJSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQodGhpcy5fYWN0aXZlQnVmZmVyLngrKywgY29kZSwgY2hXaWR0aCwgY3VyQXR0cik7XG5cbiAgICAgIC8vIGZ1bGx3aWR0aCBjaGFyIC0gYWxzbyBzZXQgbmV4dCBjZWxsIHRvIHBsYWNlaG9sZGVyIHN0dWIgYW5kIGFkdmFuY2UgY3Vyc29yXG4gICAgICAvLyBmb3IgZ3JhcGhlbWVzIGJpZ2dlciB0aGFuIGZ1bGx3aWR0aCB3ZSBjYW4gc2ltcGx5IGxvb3AgdG8gemVyb1xuICAgICAgLy8gd2UgYWxyZWFkeSBtYWRlIHN1cmUgYWJvdmUsIHRoYXQgdGhpcy5fYWN0aXZlQnVmZmVyLnggKyBjaFdpZHRoIHdpbGwgbm90IG92ZXJmbG93IHJpZ2h0XG4gICAgICBpZiAoY2hXaWR0aCA+IDApIHtcbiAgICAgICAgd2hpbGUgKC0tY2hXaWR0aCkge1xuICAgICAgICAgIC8vIG90aGVyIHRoYW4gYSByZWd1bGFyIGVtcHR5IGNlbGwgYSBjZWxsIGZvbGxvd2luZyBhIHdpZGUgY2hhciBoYXMgbm8gd2lkdGhcbiAgICAgICAgICBidWZmZXJSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQodGhpcy5fYWN0aXZlQnVmZmVyLngrKywgMCwgMCwgY3VyQXR0cik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9wYXJzZXIucHJlY2VkaW5nSm9pblN0YXRlID0gcHJlY2VkaW5nSm9pblN0YXRlO1xuXG4gICAgLy8gaGFuZGxlIHdpZGUgY2hhcnM6IHJlc2V0IGNlbGwgdG8gdGhlIHJpZ2h0IGlmIGl0IGlzIHNlY29uZCBjZWxsIG9mIGEgd2lkZSBjaGFyXG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci54IDwgY29scyAmJiBlbmQgLSBzdGFydCA+IDAgJiYgYnVmZmVyUm93LmdldFdpZHRoKHRoaXMuX2FjdGl2ZUJ1ZmZlci54KSA9PT0gMCAmJiAhYnVmZmVyUm93Lmhhc0NvbnRlbnQodGhpcy5fYWN0aXZlQnVmZmVyLngpKSB7XG4gICAgICBidWZmZXJSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQodGhpcy5fYWN0aXZlQnVmZmVyLngsIDAsIDEsIGN1ckF0dHIpO1xuICAgIH1cblxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcndhcmQgcmVnaXN0ZXJDc2lIYW5kbGVyIGZyb20gcGFyc2VyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyQ3NpSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgY2FsbGJhY2s6IChwYXJhbXM6IElQYXJhbXMpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIGlmIChpZC5maW5hbCA9PT0gJ3QnICYmICFpZC5wcmVmaXggJiYgIWlkLmludGVybWVkaWF0ZXMpIHtcbiAgICAgIC8vIHNlY3VyaXR5OiBhbHdheXMgY2hlY2sgd2hldGhlciB3aW5kb3cgb3B0aW9uIGlzIGFsbG93ZWRcbiAgICAgIHJldHVybiB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKGlkLCBwYXJhbXMgPT4ge1xuICAgICAgICBpZiAoIXBhcmFtVG9XaW5kb3dPcHRpb24ocGFyYW1zLnBhcmFtc1swXSwgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dPcHRpb25zKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhwYXJhbXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKGlkLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogRm9yd2FyZCByZWdpc3RlckRjc0hhbmRsZXIgZnJvbSBwYXJzZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJEY3NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZywgcGFyYW06IElQYXJhbXMpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9wYXJzZXIucmVnaXN0ZXJEY3NIYW5kbGVyKGlkLCBuZXcgRGNzSGFuZGxlcihjYWxsYmFjaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcndhcmQgcmVnaXN0ZXJFc2NIYW5kbGVyIGZyb20gcGFyc2VyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyRXNjSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgY2FsbGJhY2s6ICgpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKGlkLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogRm9yd2FyZCByZWdpc3Rlck9zY0hhbmRsZXIgZnJvbSBwYXJzZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPc2NIYW5kbGVyKGlkZW50OiBudW1iZXIsIGNhbGxiYWNrOiAoZGF0YTogc3RyaW5nKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcihpZGVudCwgbmV3IE9zY0hhbmRsZXIoY2FsbGJhY2spKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCRUxcbiAgICogQmVsbCAoQ3RybC1HKS5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMwICAgIEJFTCAgIFwiQmVsbFwiICBcIlxcYSwgXFx4MDdcIiAgXCJSaW5nIHRoZSBiZWxsLlwiXG4gICAqIFRoZSBiZWhhdmlvciBvZiB0aGUgYmVsbCBpcyBmdXJ0aGVyIGN1c3RvbWl6YWJsZSB3aXRoIGBJVGVybWluYWxPcHRpb25zLmJlbGxTdHlsZWBcbiAgICogYW5kIGBJVGVybWluYWxPcHRpb25zLmJlbGxTb3VuZGAuXG4gICAqL1xuICBwdWJsaWMgYmVsbCgpOiBib29sZWFuIHtcbiAgICB0aGlzLl9vblJlcXVlc3RCZWxsLmZpcmUoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMRlxuICAgKiBMaW5lIEZlZWQgb3IgTmV3IExpbmUgKE5MKS4gIChMRiAgaXMgQ3RybC1KKS5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMwICAgIExGICAgXCJMaW5lIEZlZWRcIiAgICAgICAgICAgIFwiXFxuLCBcXHgwQVwiICBcIk1vdmUgdGhlIGN1cnNvciBvbmUgcm93IGRvd24sIHNjcm9sbGluZyBpZiBuZWVkZWQuXCJcbiAgICogU2Nyb2xsaW5nIGlzIHJlc3RyaWN0ZWQgdG8gc2Nyb2xsIG1hcmdpbnMgYW5kIHdpbGwgb25seSBoYXBwZW4gb24gdGhlIGJvdHRvbSBsaW5lLlxuICAgKlxuICAgKiBAdnQ6ICNZICAgQzAgICAgVlQgICBcIlZlcnRpY2FsIFRhYnVsYXRpb25cIiAgXCJcXHYsIFxceDBCXCIgIFwiVHJlYXRlZCBhcyBMRi5cIlxuICAgKiBAdnQ6ICNZICAgQzAgICAgRkYgICBcIkZvcm0gRmVlZFwiICAgICAgICAgICAgXCJcXGYsIFxceDBDXCIgIFwiVHJlYXRlZCBhcyBMRi5cIlxuICAgKi9cbiAgcHVibGljIGxpbmVGZWVkKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmNvbnZlcnRFb2wpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gMDtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkrKztcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPT09IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gKyAxKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueS0tO1xuICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID49IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cykge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGVyZSB3YXMgYW4gZXhwbGljaXQgbGluZSBmZWVkIChub3QganVzdCBhIGNhcnJpYWdlIHJldHVybiksIHNvIGNsZWFyIHRoZSB3cmFwcGVkIHN0YXRlIG9mXG4gICAgICAvLyB0aGUgbGluZS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIGNvbnB0eS9XaW5kb3dzIHdoZXJlIHJldmlzaXRpbmcgbGluZXMgdG9cbiAgICAgIC8vIHJlcHJpbnQgaXMgY29tbW9uLCBlc3BlY2lhbGx5IG9uIHJlc2l6ZS4gTm90ZSB0aGF0IHRoZSB3aW5kb3dzTW9kZSB3cmFwcGVkIGxpbmUgaGV1cmlzdGljc1xuICAgICAgLy8gY2FuIG1lc3Mgd2l0aCB0aGlzIHNvIHdpbmRvd3NNb2RlIHNob3VsZCBiZSBkaXNhYmxlZCwgd2hpY2ggaXMgcmVjb21tZW5kZWQgb24gV2luZG93cyBidWlsZFxuICAgICAgLy8gMjEzNzYgYW5kIGFib3ZlLlxuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSkhLmlzV3JhcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBJZiB0aGUgZW5kIG9mIHRoZSBsaW5lIGlzIGhpdCwgcHJldmVudCB0aGlzIGFjdGlvbiBmcm9tIHdyYXBwaW5nIGFyb3VuZCB0byB0aGUgbmV4dCBsaW5lLlxuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54LS07XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuXG4gICAgdGhpcy5fb25MaW5lRmVlZC5maXJlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1JcbiAgICogQ2FycmlhZ2UgUmV0dXJuIChDdHJsLU0pLlxuICAgKlxuICAgKiBAdnQ6ICNZICAgQzAgICAgQ1IgICBcIkNhcnJpYWdlIFJldHVyblwiICBcIlxcciwgXFx4MERcIiAgXCJNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcm93LlwiXG4gICAqL1xuICBwdWJsaWMgY2FycmlhZ2VSZXR1cm4oKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEJTXG4gICAqIEJhY2tzcGFjZSAoQ3RybC1IKS5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMwICAgIEJTICAgXCJCYWNrc3BhY2VcIiAgXCJcXGIsIFxceDA4XCIgIFwiTW92ZSB0aGUgY3Vyc29yIG9uZSBwb3NpdGlvbiB0byB0aGUgbGVmdC5cIlxuICAgKiBCeSBkZWZhdWx0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBtb3ZlIHRoZSBjdXJzb3IgcGFzdCB0aGUgbGVmdG1vc3QgcG9zaXRpb24uXG4gICAqIElmIGByZXZlcnNlIHdyYXAtYXJvdW5kYCAoYENTSSA/IDQ1IGhgKSBpcyBzZXQsIGEgcHJldmlvdXMgc29mdCBsaW5lIHdyYXAgKERFQ0FXTSlcbiAgICogY2FuIGJlIHVuZG9uZSB3aXRoIEJTIHdpdGhpbiB0aGUgc2Nyb2xsIG1hcmdpbnMuIEluIHRoYXQgY2FzZSB0aGUgY3Vyc29yIHdpbGwgd3JhcCBiYWNrXG4gICAqIHRvIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIHJvdy4gTm90ZSB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwZWVrIGJhY2sgaW50byB0aGUgc2Nyb2xsYnVmZmVyXG4gICAqIHdpdGggdGhlIGN1cnNvciwgdGh1cyBhdCB0aGUgaG9tZSBwb3NpdGlvbiAodG9wLWxlZnRtb3N0IGNlbGwpIHRoaXMgaGFzIG5vIGVmZmVjdC5cbiAgICovXG4gIHB1YmxpYyBiYWNrc3BhY2UoKTogYm9vbGVhbiB7XG4gICAgLy8gcmV2ZXJzZSB3cmFwLWFyb3VuZCBpcyBkaXNhYmxlZFxuICAgIGlmICghdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLnJldmVyc2VXcmFwYXJvdW5kKSB7XG4gICAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID4gMCkge1xuICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueC0tO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gcmV2ZXJzZSB3cmFwLWFyb3VuZCBpcyBlbmFibGVkXG4gICAgLy8gb3RoZXIgdGhhbiBmb3Igbm9ybWFsIG9wZXJhdGlvbiBtb2RlLCByZXZlcnNlIHdyYXAtYXJvdW5kIGFsbG93cyB0aGUgY3Vyc29yXG4gICAgLy8gdG8gYmUgYXQgeD1jb2xzIHRvIGJlIGFibGUgdG8gYWRkcmVzcyB0aGUgbGFzdCBjZWxsIG9mIGEgcm93IGJ5IEJTXG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKTtcblxuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA+IDApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54LS07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qKlxuICAgICAgICogcmV2ZXJzZSB3cmFwLWFyb3VuZCBoYW5kbGluZzpcbiAgICAgICAqIE91ciBpbXBsZW1lbnRhdGlvbiBkZXZpYXRlcyBmcm9tIHh0ZXJtIG9uIHB1cnBvc2UuIERldGFpbHM6XG4gICAgICAgKiAtIG9ubHkgcHJldmlvdXMgc29mdCBOTHMgY2FuIGJlIHJldmVyc2VkIChpc1dyYXBwZWQ9dHJ1ZSlcbiAgICAgICAqIC0gb25seSB3b3JrcyB3aXRoaW4gc2Nyb2xsYm9yZGVycyAodG9wL2JvdHRvbSwgbGVmdC9yaWdodCBub3QgeWV0IHN1cHBvcnRlZClcbiAgICAgICAqIC0gY2Fubm90IHBlZWsgaW50byBzY3JvbGxidWZmZXJcbiAgICAgICAqIC0gYW55IGN1cnNvciBtb3ZlbWVudCBzZXF1ZW5jZSBrZWVwcyB3b3JraW5nIGFzIGV4cGVjdGVkXG4gICAgICAgKi9cbiAgICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA9PT0gMFxuICAgICAgICAmJiB0aGlzLl9hY3RpdmVCdWZmZXIueSA+IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3BcbiAgICAgICAgJiYgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPD0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbVxuICAgICAgICAmJiB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55KT8uaXNXcmFwcGVkKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpIS5pc1dyYXBwZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnktLTtcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxO1xuICAgICAgICAvLyBmaW5kIGxhc3QgdGFrZW4gY2VsbCAtIGxhc3QgY2VsbCBjYW4gaGF2ZSAzIGRpZmZlcmVudCBzdGF0ZXM6XG4gICAgICAgIC8vIC0gaGFzQ29udGVudCh0cnVlKSArIGhhc1dpZHRoKDEpOiBuYXJyb3cgY2hhciAtIHdlIGFyZSBkb25lXG4gICAgICAgIC8vIC0gaGFzV2lkdGgoMCk6IHNlY29uZCBwYXJ0IG9mIHdpZGUgY2hhciAtIHdlIGFyZSBkb25lXG4gICAgICAgIC8vIC0gaGFzQ29udGVudChmYWxzZSkgKyBoYXNXaWR0aCgxKTogZW1wdHkgY2VsbCBkdWUgdG8gZWFybHkgd3JhcHBpbmcgd2lkZSBjaGFyLCBnbyBvbmVcbiAgICAgICAgLy8gICBjZWxsIGZ1cnRoZXIgYmFja1xuICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSkhO1xuICAgICAgICBpZiAobGluZS5oYXNXaWR0aCh0aGlzLl9hY3RpdmVCdWZmZXIueCkgJiYgIWxpbmUuaGFzQ29udGVudCh0aGlzLl9hY3RpdmVCdWZmZXIueCkpIHtcbiAgICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueC0tO1xuICAgICAgICAgIC8vIFdlIGRvIHRoaXMgb25seSBvbmNlLCBzaW5jZSB3aWR0aD0xICsgaGFzQ29udGVudD1mYWxzZSBjdXJyZW50bHkgaGFwcGVucyBvbmx5IG9uY2VcbiAgICAgICAgICAvLyBiZWZvcmUgZWFybHkgd3JhcHBpbmcgb2YgYSB3aWRlIGNoYXIuXG4gICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBvbmNlIHdlIHN1cHBvcnQgZ3JhcGhlbWVzIHRha2luZyBtb3JlIHRoYW4gMiBjZWxscy5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRBQlxuICAgKiBIb3Jpem9udGFsIFRhYiAoSFQpIChDdHJsLUkpLlxuICAgKlxuICAgKiBAdnQ6ICNZICAgQzAgICAgSFQgICBcIkhvcml6b250YWwgVGFidWxhdGlvblwiICBcIlxcdCwgXFx4MDlcIiAgXCJNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgY2hhcmFjdGVyIHRhYiBzdG9wLlwiXG4gICAqL1xuICBwdWJsaWMgdGFiKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFggPSB0aGlzLl9hY3RpdmVCdWZmZXIueDtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5uZXh0U3RvcCgpO1xuICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcmVlblJlYWRlck1vZGUpIHtcbiAgICAgIHRoaXMuX29uQTExeVRhYi5maXJlKHRoaXMuX2FjdGl2ZUJ1ZmZlci54IC0gb3JpZ2luYWxYKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU09cbiAgICogU2hpZnQgT3V0IChDdHJsLU4pIC0+IFN3aXRjaCB0byBBbHRlcm5hdGUgQ2hhcmFjdGVyIFNldC4gIFRoaXMgaW52b2tlcyB0aGVcbiAgICogRzEgY2hhcmFjdGVyIHNldC5cbiAgICpcbiAgICogQHZ0OiAjUFtPbmx5IGxpbWl0ZWQgSVNPLTIwMjIgY2hhcnNldCBzdXBwb3J0Ll0gIEMwICAgIFNPICAgXCJTaGlmdCBPdXRcIiAgXCJcXHgwRVwiICBcIlN3aXRjaCB0byBhbiBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXIgc2V0LlwiXG4gICAqL1xuICBwdWJsaWMgc2hpZnRPdXQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0xldmVsKDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNJXG4gICAqIFNoaWZ0IEluIChDdHJsLU8pIC0+IFN3aXRjaCB0byBTdGFuZGFyZCBDaGFyYWN0ZXIgU2V0LiAgVGhpcyBpbnZva2VzIHRoZSBHMFxuICAgKiBjaGFyYWN0ZXIgc2V0ICh0aGUgZGVmYXVsdCkuXG4gICAqXG4gICAqIEB2dDogI1kgICBDMCAgICBTSSAgIFwiU2hpZnQgSW5cIiAgIFwiXFx4MEZcIiAgXCJSZXR1cm4gdG8gcmVndWxhciBjaGFyYWN0ZXIgc2V0IGFmdGVyIFNoaWZ0IE91dC5cIlxuICAgKi9cbiAgcHVibGljIHNoaWZ0SW4oKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0xldmVsKDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyaWN0IGN1cnNvciB0byB2aWV3cG9ydCBzaXplIC8gc2Nyb2xsIG1hcmdpbiAob3JpZ2luIG1vZGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzdHJpY3RDdXJzb3IobWF4Q29sOiBudW1iZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSBNYXRoLm1pbihtYXhDb2wsIE1hdGgubWF4KDAsIHRoaXMuX2FjdGl2ZUJ1ZmZlci54KSk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPSB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMub3JpZ2luXG4gICAgICA/IE1hdGgubWluKHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20sIE1hdGgubWF4KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsIHRoaXMuX2FjdGl2ZUJ1ZmZlci55KSlcbiAgICAgIDogTWF0aC5taW4odGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMSwgTWF0aC5tYXgoMCwgdGhpcy5fYWN0aXZlQnVmZmVyLnkpKTtcbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYWJzb2x1dGUgY3Vyc29yIHBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0Q3Vyc29yKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgaWYgKHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5vcmlnaW4pIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0geDtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCArIHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0geDtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID0geTtcbiAgICB9XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVsYXRpdmUgY3Vyc29yIHBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfbW92ZUN1cnNvcih4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGZvciByZWxhdGl2ZSBjaGFuZ2VzIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHdlIGFyZSB3aXRoaW4gMCAuLiBjb2xzL3Jvd3MgLSAxXG4gICAgLy8gYmVmb3JlIGNhbGN1bGF0aW5nIHRoZSBuZXcgcG9zaXRpb25cbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgIHRoaXMuX3NldEN1cnNvcih0aGlzLl9hY3RpdmVCdWZmZXIueCArIHgsIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ICsgeSk7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIEFcbiAgICogQ3Vyc29yIFVwIFBzIFRpbWVzIChkZWZhdWx0ID0gMSkgKENVVSkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENVVSAgIFwiQ3Vyc29yIFVwXCIgICBcIkNTSSBQcyBBXCIgIFwiTW92ZSBjdXJzb3IgYFBzYCB0aW1lcyB1cCAoZGVmYXVsdD0xKS5cIlxuICAgKiBJZiB0aGUgY3Vyc29yIHdvdWxkIHBhc3MgdGhlIHRvcCBzY3JvbGwgbWFyZ2luLCBpdCB3aWxsIHN0b3AgdGhlcmUuXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yVXAocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgLy8gc3RvcCBhdCBzY3JvbGxUb3BcbiAgICBjb25zdCBkaWZmVG9Ub3AgPSB0aGlzLl9hY3RpdmVCdWZmZXIueSAtIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3A7XG4gICAgaWYgKGRpZmZUb1RvcCA+PSAwKSB7XG4gICAgICB0aGlzLl9tb3ZlQ3Vyc29yKDAsIC1NYXRoLm1pbihkaWZmVG9Ub3AsIHBhcmFtcy5wYXJhbXNbMF0gfHwgMSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tb3ZlQ3Vyc29yKDAsIC0ocGFyYW1zLnBhcmFtc1swXSB8fCAxKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBCXG4gICAqIEN1cnNvciBEb3duIFBzIFRpbWVzIChkZWZhdWx0ID0gMSkgKENVRCkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENVRCAgIFwiQ3Vyc29yIERvd25cIiAgIFwiQ1NJIFBzIEJcIiAgXCJNb3ZlIGN1cnNvciBgUHNgIHRpbWVzIGRvd24gKGRlZmF1bHQ9MSkuXCJcbiAgICogSWYgdGhlIGN1cnNvciB3b3VsZCBwYXNzIHRoZSBib3R0b20gc2Nyb2xsIG1hcmdpbiwgaXQgd2lsbCBzdG9wIHRoZXJlLlxuICAgKi9cbiAgcHVibGljIGN1cnNvckRvd24ocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgLy8gc3RvcCBhdCBzY3JvbGxCb3R0b21cbiAgICBjb25zdCBkaWZmVG9Cb3R0b20gPSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tIC0gdGhpcy5fYWN0aXZlQnVmZmVyLnk7XG4gICAgaWYgKGRpZmZUb0JvdHRvbSA+PSAwKSB7XG4gICAgICB0aGlzLl9tb3ZlQ3Vyc29yKDAsIE1hdGgubWluKGRpZmZUb0JvdHRvbSwgcGFyYW1zLnBhcmFtc1swXSB8fCAxKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21vdmVDdXJzb3IoMCwgcGFyYW1zLnBhcmFtc1swXSB8fCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIENcbiAgICogQ3Vyc29yIEZvcndhcmQgUHMgVGltZXMgKGRlZmF1bHQgPSAxKSAoQ1VGKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgQ1VGICAgXCJDdXJzb3IgRm9yd2FyZFwiICAgIFwiQ1NJIFBzIENcIiAgXCJNb3ZlIGN1cnNvciBgUHNgIHRpbWVzIGZvcndhcmQgKGRlZmF1bHQ9MSkuXCJcbiAgICovXG4gIHB1YmxpYyBjdXJzb3JGb3J3YXJkKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX21vdmVDdXJzb3IocGFyYW1zLnBhcmFtc1swXSB8fCAxLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgRFxuICAgKiBDdXJzb3IgQmFja3dhcmQgUHMgVGltZXMgKGRlZmF1bHQgPSAxKSAoQ1VCKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgQ1VCICAgXCJDdXJzb3IgQmFja3dhcmRcIiAgIFwiQ1NJIFBzIERcIiAgXCJNb3ZlIGN1cnNvciBgUHNgIHRpbWVzIGJhY2t3YXJkIChkZWZhdWx0PTEpLlwiXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yQmFja3dhcmQocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fbW92ZUN1cnNvcigtKHBhcmFtcy5wYXJhbXNbMF0gfHwgMSksIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBFXG4gICAqIEN1cnNvciBOZXh0IExpbmUgUHMgVGltZXMgKGRlZmF1bHQgPSAxKSAoQ05MKS5cbiAgICogT3RoZXIgdGhhbiBjdXJzb3JEb3duIChDVUQpIGFsc28gc2V0IHRoZSBjdXJzb3IgdG8gZmlyc3QgY29sdW1uLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBDTkwgICBcIkN1cnNvciBOZXh0IExpbmVcIiAgXCJDU0kgUHMgRVwiICBcIk1vdmUgY3Vyc29yIGBQc2AgdGltZXMgZG93biAoZGVmYXVsdD0xKSBhbmQgdG8gdGhlIGZpcnN0IGNvbHVtbi5cIlxuICAgKiBTYW1lIGFzIENVRCwgYWRkaXRpb25hbGx5IHBsYWNlcyB0aGUgY3Vyc29yIGF0IHRoZSBmaXJzdCBjb2x1bW4uXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yTmV4dExpbmUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5jdXJzb3JEb3duKHBhcmFtcyk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBGXG4gICAqIEN1cnNvciBQcmV2aW91cyBMaW5lIFBzIFRpbWVzIChkZWZhdWx0ID0gMSkgKENQTCkuXG4gICAqIE90aGVyIHRoYW4gY3Vyc29yVXAgKENVVSkgYWxzbyBzZXQgdGhlIGN1cnNvciB0byBmaXJzdCBjb2x1bW4uXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENQTCAgIFwiQ3Vyc29yIEJhY2t3YXJkXCIgICBcIkNTSSBQcyBGXCIgIFwiTW92ZSBjdXJzb3IgYFBzYCB0aW1lcyB1cCAoZGVmYXVsdD0xKSBhbmQgdG8gdGhlIGZpcnN0IGNvbHVtbi5cIlxuICAgKiBTYW1lIGFzIENVVSwgYWRkaXRpb25hbGx5IHBsYWNlcyB0aGUgY3Vyc29yIGF0IHRoZSBmaXJzdCBjb2x1bW4uXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yUHJlY2VkaW5nTGluZShwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLmN1cnNvclVwKHBhcmFtcyk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBHXG4gICAqIEN1cnNvciBDaGFyYWN0ZXIgQWJzb2x1dGUgIFtjb2x1bW5dIChkZWZhdWx0ID0gW3JvdywxXSkgKENIQSkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENIQSAgIFwiQ3Vyc29yIEhvcml6b250YWwgQWJzb2x1dGVcIiBcIkNTSSBQcyBHXCIgXCJNb3ZlIGN1cnNvciB0byBgUHNgLXRoIGNvbHVtbiBvZiB0aGUgYWN0aXZlIHJvdyAoZGVmYXVsdD0xKS5cIlxuICAgKi9cbiAgcHVibGljIGN1cnNvckNoYXJBYnNvbHV0ZShwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLl9zZXRDdXJzb3IoKHBhcmFtcy5wYXJhbXNbMF0gfHwgMSkgLSAxLCB0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIDsgUHMgSFxuICAgKiBDdXJzb3IgUG9zaXRpb24gW3Jvdztjb2x1bW5dIChkZWZhdWx0ID0gWzEsMV0pIChDVVApLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBDVVAgICBcIkN1cnNvciBQb3NpdGlvblwiICAgXCJDU0kgUHMgOyBQcyBIXCIgIFwiU2V0IGN1cnNvciB0byBwb3NpdGlvbiBbYFBzYCwgYFBzYF0gKGRlZmF1bHQgPSBbMSwgMV0pLlwiXG4gICAqIElmIE9SSUdJTiBtb2RlIGlzIHNldCwgcGxhY2VzIHRoZSBjdXJzb3IgdG8gdGhlIGFic29sdXRlIHBvc2l0aW9uIHdpdGhpbiB0aGUgc2Nyb2xsIG1hcmdpbnMuXG4gICAqIElmIE9SSUdJTiBtb2RlIGlzIG5vdCBzZXQsIHBsYWNlcyB0aGUgY3Vyc29yIHRvIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHZpZXdwb3J0LlxuICAgKiBOb3RlIHRoYXQgdGhlIGNvb3JkaW5hdGVzIGFyZSAxLWJhc2VkLCB0aHVzIHRoZSB0b3AgbGVmdCBwb3NpdGlvbiBzdGFydHMgYXQgYDEgOyAxYC5cbiAgICovXG4gIHB1YmxpYyBjdXJzb3JQb3NpdGlvbihwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLl9zZXRDdXJzb3IoXG4gICAgICAvLyBjb2xcbiAgICAgIChwYXJhbXMubGVuZ3RoID49IDIpID8gKHBhcmFtcy5wYXJhbXNbMV0gfHwgMSkgLSAxIDogMCxcbiAgICAgIC8vIHJvd1xuICAgICAgKHBhcmFtcy5wYXJhbXNbMF0gfHwgMSkgLSAxXG4gICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUG0gYCAgQ2hhcmFjdGVyIFBvc2l0aW9uIEFic29sdXRlXG4gICAqICAgW2NvbHVtbl0gKGRlZmF1bHQgPSBbcm93LDFdKSAoSFBBKS5cbiAgICogQ3VycmVudGx5IHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBDSEEuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIEhQQSAgIFwiSG9yaXpvbnRhbCBQb3NpdGlvbiBBYnNvbHV0ZVwiICBcIkNTSSBQcyBgIFwiIFwiU2FtZSBhcyBDSEEuXCJcbiAgICovXG4gIHB1YmxpYyBjaGFyUG9zQWJzb2x1dGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fc2V0Q3Vyc29yKChwYXJhbXMucGFyYW1zWzBdIHx8IDEpIC0gMSwgdGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQbSBhICBDaGFyYWN0ZXIgUG9zaXRpb24gUmVsYXRpdmVcbiAgICogICBbY29sdW1uc10gKGRlZmF1bHQgPSBbcm93LGNvbCsxXSkgKEhQUilcbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgSFBSICAgXCJIb3Jpem9udGFsIFBvc2l0aW9uIFJlbGF0aXZlXCIgIFwiQ1NJIFBzIGFcIiAgXCJTYW1lIGFzIENVRi5cIlxuICAgKi9cbiAgcHVibGljIGhQb3NpdGlvblJlbGF0aXZlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX21vdmVDdXJzb3IocGFyYW1zLnBhcmFtc1swXSB8fCAxLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUG0gZCAgVmVydGljYWwgUG9zaXRpb24gQWJzb2x1dGUgKFZQQSlcbiAgICogICBbcm93XSAoZGVmYXVsdCA9IFsxLGNvbHVtbl0pXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIFZQQSAgIFwiVmVydGljYWwgUG9zaXRpb24gQWJzb2x1dGVcIiAgICBcIkNTSSBQcyBkXCIgIFwiTW92ZSBjdXJzb3IgdG8gYFBzYC10aCByb3cgKGRlZmF1bHQ9MSkuXCJcbiAgICovXG4gIHB1YmxpYyBsaW5lUG9zQWJzb2x1dGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fc2V0Q3Vyc29yKHRoaXMuX2FjdGl2ZUJ1ZmZlci54LCAocGFyYW1zLnBhcmFtc1swXSB8fCAxKSAtIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQbSBlICBWZXJ0aWNhbCBQb3NpdGlvbiBSZWxhdGl2ZSAoVlBSKVxuICAgKiAgIFtyb3dzXSAoZGVmYXVsdCA9IFtyb3crMSxjb2x1bW5dKVxuICAgKiByZXVzZSBDU0kgUHMgQiA/XG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIFZQUiAgIFwiVmVydGljYWwgUG9zaXRpb24gUmVsYXRpdmVcIiAgICBcIkNTSSBQcyBlXCIgIFwiTW92ZSBjdXJzb3IgYFBzYCB0aW1lcyBkb3duIChkZWZhdWx0PTEpLlwiXG4gICAqL1xuICBwdWJsaWMgdlBvc2l0aW9uUmVsYXRpdmUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fbW92ZUN1cnNvcigwLCBwYXJhbXMucGFyYW1zWzBdIHx8IDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyA7IFBzIGZcbiAgICogICBIb3Jpem9udGFsIGFuZCBWZXJ0aWNhbCBQb3NpdGlvbiBbcm93O2NvbHVtbl0gKGRlZmF1bHQgPVxuICAgKiAgIFsxLDFdKSAoSFZQKS5cbiAgICogICBTYW1lIGFzIENVUC5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgSFZQICAgXCJIb3Jpem9udGFsIGFuZCBWZXJ0aWNhbCBQb3NpdGlvblwiIFwiQ1NJIFBzIDsgUHMgZlwiICBcIlNhbWUgYXMgQ1VQLlwiXG4gICAqL1xuICBwdWJsaWMgaFZQb3NpdGlvbihwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uKHBhcmFtcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIGcgIFRhYiBDbGVhciAoVEJDKS5cbiAgICogICAgIFBzID0gMCAgLT4gQ2xlYXIgQ3VycmVudCBDb2x1bW4gKGRlZmF1bHQpLlxuICAgKiAgICAgUHMgPSAzICAtPiBDbGVhciBBbGwuXG4gICAqIFBvdGVudGlhbGx5OlxuICAgKiAgIFBzID0gMiAgLT4gQ2xlYXIgU3RvcHMgb24gTGluZS5cbiAgICogICBodHRwOi8vdnQxMDAubmV0L2FubmFyYm9yL2FhYS11Zy9zZWN0aW9uNi5odG1sXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIFRCQyAgIFwiVGFiIENsZWFyXCIgXCJDU0kgUHMgZ1wiICBcIkNsZWFyIHRhYiBzdG9wcyBhdCBjdXJyZW50IHBvc2l0aW9uICgwKSBvciBhbGwgKDMpIChkZWZhdWx0PTApLlwiXG4gICAqIENsZWFyaW5nIHRhYnN0b3BzIG9mZiB0aGUgYWN0aXZlIHJvdyAoUHMgPSAyLCBWVDEwMCkgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuXG4gICAqL1xuICBwdWJsaWMgdGFiQ2xlYXIocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdO1xuICAgIGlmIChwYXJhbSA9PT0gMCkge1xuICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZUJ1ZmZlci50YWJzW3RoaXMuX2FjdGl2ZUJ1ZmZlci54XTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtID09PSAzKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIudGFicyA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgSVxuICAgKiAgIEN1cnNvciBGb3J3YXJkIFRhYnVsYXRpb24gUHMgdGFiIHN0b3BzIChkZWZhdWx0ID0gMSkgKENIVCkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENIVCAgIFwiQ3Vyc29yIEhvcml6b250YWwgVGFidWxhdGlvblwiIFwiQ1NJIFBzIElcIiBcIk1vdmUgY3Vyc29yIGBQc2AgdGltZXMgdGFicyBmb3J3YXJkIChkZWZhdWx0PTEpLlwiXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yRm9yd2FyZFRhYihwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggPj0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuICAgIHdoaWxlIChwYXJhbS0tKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5uZXh0U3RvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgWiAgQ3Vyc29yIEJhY2t3YXJkIFRhYnVsYXRpb24gUHMgdGFiIHN0b3BzIChkZWZhdWx0ID0gMSkgKENCVCkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENCVCAgIFwiQ3Vyc29yIEJhY2t3YXJkIFRhYnVsYXRpb25cIiAgXCJDU0kgUHMgWlwiICBcIk1vdmUgY3Vyc29yIGBQc2AgdGFicyBiYWNrd2FyZCAoZGVmYXVsdD0xKS5cIlxuICAgKi9cbiAgcHVibGljIGN1cnNvckJhY2t3YXJkVGFiKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG5cbiAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSB0aGlzLl9hY3RpdmVCdWZmZXIucHJldlN0b3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIFwiIHEgIFNlbGVjdCBDaGFyYWN0ZXIgUHJvdGVjdGlvbiBBdHRyaWJ1dGUgKERFQ1NDQSkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERFQ1NDQSAgIFwiU2VsZWN0IENoYXJhY3RlciBQcm90ZWN0aW9uIEF0dHJpYnV0ZVwiICBcIkNTSSBQcyBcIiBxXCIgIFwiV2hldGhlciBERUNTRUQgYW5kIERFQ1NFTCBjYW4gZXJhc2UgKDA9ZGVmYXVsdCwgMikgb3Igbm90ICgxKS5cIlxuICAgKi9cbiAgcHVibGljIHNlbGVjdFByb3RlY3RlZChwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCBwID0gcGFyYW1zLnBhcmFtc1swXTtcbiAgICBpZiAocCA9PT0gMSkgdGhpcy5fY3VyQXR0ckRhdGEuYmcgfD0gQmdGbGFncy5QUk9URUNURUQ7XG4gICAgaWYgKHAgPT09IDIgfHwgcCA9PT0gMCkgdGhpcy5fY3VyQXR0ckRhdGEuYmcgJj0gfkJnRmxhZ3MuUFJPVEVDVEVEO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBlcmFzZSBjZWxscyBpbiBhIHRlcm1pbmFsIHJvdy5cbiAgICogVGhlIGNlbGwgZ2V0cyByZXBsYWNlZCB3aXRoIHRoZSBlcmFzZUNoYXIgb2YgdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0geSBUaGUgcm93IGluZGV4IHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydC5cbiAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCB4IGluZGV4IG9mIHRoZSByYW5nZSB0byBiZSBlcmFzZWQuXG4gICAqIEBwYXJhbSBlbmQgVGhlIGVuZCB4IGluZGV4IG9mIHRoZSByYW5nZSB0byBiZSBlcmFzZWQgKGV4Y2x1c2l2ZSkuXG4gICAqIEBwYXJhbSBjbGVhcldyYXAgY2xlYXIgdGhlIGlzV3JhcHBlZCBmbGFnXG4gICAqIEBwYXJhbSByZXNwZWN0UHJvdGVjdCBXaGV0aGVyIHRvIHJlc3BlY3QgdGhlIHByb3RlY3Rpb24gYXR0cmlidXRlIChERUNTQ0EpLlxuICAgKi9cbiAgcHJpdmF0ZSBfZXJhc2VJbkJ1ZmZlckxpbmUoeTogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgY2xlYXJXcmFwOiBib29sZWFuID0gZmFsc2UsIHJlc3BlY3RQcm90ZWN0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB5KSE7XG4gICAgbGluZS5yZXBsYWNlQ2VsbHMoXG4gICAgICBzdGFydCxcbiAgICAgIGVuZCxcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpLFxuICAgICAgcmVzcGVjdFByb3RlY3RcbiAgICApO1xuICAgIGlmIChjbGVhcldyYXApIHtcbiAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gcmVzZXQgY2VsbHMgaW4gYSB0ZXJtaW5hbCByb3cuIFRoZSBjZWxsIGdldHMgcmVwbGFjZWQgd2l0aCB0aGUgZXJhc2VDaGFyIG9mXG4gICAqIHRoZSB0ZXJtaW5hbCBhbmQgdGhlIGlzV3JhcHBlZCBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UuXG4gICAqIEBwYXJhbSB5IHJvdyBpbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzZXRCdWZmZXJMaW5lKHk6IG51bWJlciwgcmVzcGVjdFByb3RlY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHkpO1xuICAgIGlmIChsaW5lKSB7XG4gICAgICBsaW5lLmZpbGwodGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSksIHJlc3BlY3RQcm90ZWN0KTtcbiAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmNsZWFyTWFya2Vycyh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB5KTtcbiAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBKICBFcmFzZSBpbiBEaXNwbGF5IChFRCkuXG4gICAqICAgICBQcyA9IDAgIC0+IEVyYXNlIEJlbG93IChkZWZhdWx0KS5cbiAgICogICAgIFBzID0gMSAgLT4gRXJhc2UgQWJvdmUuXG4gICAqICAgICBQcyA9IDIgIC0+IEVyYXNlIEFsbC5cbiAgICogICAgIFBzID0gMyAgLT4gRXJhc2UgU2F2ZWQgTGluZXMgKHh0ZXJtKS5cbiAgICogQ1NJID8gUHMgSlxuICAgKiAgIEVyYXNlIGluIERpc3BsYXkgKERFQ1NFRCkuXG4gICAqICAgICBQcyA9IDAgIC0+IFNlbGVjdGl2ZSBFcmFzZSBCZWxvdyAoZGVmYXVsdCkuXG4gICAqICAgICBQcyA9IDEgIC0+IFNlbGVjdGl2ZSBFcmFzZSBBYm92ZS5cbiAgICogICAgIFBzID0gMiAgLT4gU2VsZWN0aXZlIEVyYXNlIEFsbC5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgRUQgIFwiRXJhc2UgSW4gRGlzcGxheVwiICBcIkNTSSBQcyBKXCIgIFwiRXJhc2UgdmFyaW91cyBwYXJ0cyBvZiB0aGUgdmlld3BvcnQuXCJcbiAgICogU3VwcG9ydGVkIHBhcmFtIHZhbHVlczpcbiAgICpcbiAgICogfCBQcyB8IEVmZmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgKiB8IDAgIHwgRXJhc2UgZnJvbSB0aGUgY3Vyc29yIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgdmlld3BvcnQuICAgICAgIHxcbiAgICogfCAxICB8IEVyYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdmlld3BvcnQgdGhyb3VnaCB0aGUgY3Vyc29yLiB8XG4gICAqIHwgMiAgfCBFcmFzZSBjb21wbGV0ZSB2aWV3cG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IDMgIHwgRXJhc2Ugc2Nyb2xsYmFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgREVDU0VEICAgXCJTZWxlY3RpdmUgRXJhc2UgSW4gRGlzcGxheVwiICBcIkNTSSA/IFBzIEpcIiAgXCJTYW1lIGFzIEVEIHdpdGggcmVzcGVjdGluZyBwcm90ZWN0aW9uIGZsYWcuXCJcbiAgICovXG4gIHB1YmxpYyBlcmFzZUluRGlzcGxheShwYXJhbXM6IElQYXJhbXMsIHJlc3BlY3RQcm90ZWN0OiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcih0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpO1xuICAgIGxldCBqO1xuICAgIHN3aXRjaCAocGFyYW1zLnBhcmFtc1swXSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBqID0gdGhpcy5fYWN0aXZlQnVmZmVyLnk7XG4gICAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkoaik7XG4gICAgICAgIHRoaXMuX2VyYXNlSW5CdWZmZXJMaW5lKGorKywgdGhpcy5fYWN0aXZlQnVmZmVyLngsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5fYWN0aXZlQnVmZmVyLnggPT09IDAsIHJlc3BlY3RQcm90ZWN0KTtcbiAgICAgICAgZm9yICg7IGogPCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3M7IGorKykge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0QnVmZmVyTGluZShqLCByZXNwZWN0UHJvdGVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eShqKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGogPSB0aGlzLl9hY3RpdmVCdWZmZXIueTtcbiAgICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eShqKTtcbiAgICAgICAgLy8gRGVsZXRlZCBmcm9udCBwYXJ0IG9mIGxpbmUgYW5kIGV2ZXJ5dGhpbmcgYmVmb3JlLiBUaGlzIGxpbmUgd2lsbCBubyBsb25nZXIgYmUgd3JhcHBlZC5cbiAgICAgICAgdGhpcy5fZXJhc2VJbkJ1ZmZlckxpbmUoaiwgMCwgdGhpcy5fYWN0aXZlQnVmZmVyLnggKyAxLCB0cnVlLCByZXNwZWN0UHJvdGVjdCk7XG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCArIDEgPj0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICAgICAgLy8gRGVsZXRlZCBlbnRpcmUgcHJldmlvdXMgbGluZS4gVGhpcyBuZXh0IGxpbmUgY2FuIG5vIGxvbmdlciBiZSB3cmFwcGVkLlxuICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQoaiArIDEpIS5pc1dyYXBwZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoai0tKSB7XG4gICAgICAgICAgdGhpcy5fcmVzZXRCdWZmZXJMaW5lKGosIHJlc3BlY3RQcm90ZWN0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaiA9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cztcbiAgICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eShqIC0gMSk7XG4gICAgICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgICB0aGlzLl9yZXNldEJ1ZmZlckxpbmUoaiwgcmVzcGVjdFByb3RlY3QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkoMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICAvLyBDbGVhciBzY3JvbGxiYWNrIChldmVyeXRoaW5nIG5vdCBpbiB2aWV3cG9ydClcbiAgICAgICAgY29uc3Qgc2Nyb2xsQmFja1NpemUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMubGVuZ3RoIC0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzO1xuICAgICAgICBpZiAoc2Nyb2xsQmFja1NpemUgPiAwKSB7XG4gICAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnRyaW1TdGFydChzY3JvbGxCYWNrU2l6ZSk7XG4gICAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlID0gTWF0aC5tYXgodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlIC0gc2Nyb2xsQmFja1NpemUsIDApO1xuICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ZGlzcCA9IE1hdGgubWF4KHRoaXMuX2FjdGl2ZUJ1ZmZlci55ZGlzcCAtIHNjcm9sbEJhY2tTaXplLCAwKTtcbiAgICAgICAgICAvLyBGb3JjZSBhIHNjcm9sbCBldmVudCB0byByZWZyZXNoIHZpZXdwb3J0XG4gICAgICAgICAgdGhpcy5fb25TY3JvbGwuZmlyZSgwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIEsgIEVyYXNlIGluIExpbmUgKEVMKS5cbiAgICogICAgIFBzID0gMCAgLT4gRXJhc2UgdG8gUmlnaHQgKGRlZmF1bHQpLlxuICAgKiAgICAgUHMgPSAxICAtPiBFcmFzZSB0byBMZWZ0LlxuICAgKiAgICAgUHMgPSAyICAtPiBFcmFzZSBBbGwuXG4gICAqIENTSSA/IFBzIEtcbiAgICogICBFcmFzZSBpbiBMaW5lIChERUNTRUwpLlxuICAgKiAgICAgUHMgPSAwICAtPiBTZWxlY3RpdmUgRXJhc2UgdG8gUmlnaHQgKGRlZmF1bHQpLlxuICAgKiAgICAgUHMgPSAxICAtPiBTZWxlY3RpdmUgRXJhc2UgdG8gTGVmdC5cbiAgICogICAgIFBzID0gMiAgLT4gU2VsZWN0aXZlIEVyYXNlIEFsbC5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgRUwgICAgXCJFcmFzZSBJbiBMaW5lXCIgIFwiQ1NJIFBzIEtcIiAgXCJFcmFzZSB2YXJpb3VzIHBhcnRzIG9mIHRoZSBhY3RpdmUgcm93LlwiXG4gICAqIFN1cHBvcnRlZCBwYXJhbSB2YWx1ZXM6XG4gICAqXG4gICAqIHwgUHMgfCBFZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAqIHwgMCAgfCBFcmFzZSBmcm9tIHRoZSBjdXJzb3IgdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSByb3cuICAgICAgICB8XG4gICAqIHwgMSAgfCBFcmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgdGhyb3VnaCB0aGUgY3Vyc29yLiB8XG4gICAqIHwgMiAgfCBFcmFzZSBjb21wbGV0ZSBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERFQ1NFTCAgIFwiU2VsZWN0aXZlIEVyYXNlIEluIExpbmVcIiAgXCJDU0kgPyBQcyBLXCIgIFwiU2FtZSBhcyBFTCB3aXRoIHJlc3BlY3RpbmcgcHJvdGVjdGluZyBmbGFnLlwiXG4gICAqL1xuICBwdWJsaWMgZXJhc2VJbkxpbmUocGFyYW1zOiBJUGFyYW1zLCByZXNwZWN0UHJvdGVjdDogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKTtcbiAgICBzd2l0Y2ggKHBhcmFtcy5wYXJhbXNbMF0pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgdGhpcy5fZXJhc2VJbkJ1ZmZlckxpbmUodGhpcy5fYWN0aXZlQnVmZmVyLnksIHRoaXMuX2FjdGl2ZUJ1ZmZlci54LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID09PSAwLCByZXNwZWN0UHJvdGVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICB0aGlzLl9lcmFzZUluQnVmZmVyTGluZSh0aGlzLl9hY3RpdmVCdWZmZXIueSwgMCwgdGhpcy5fYWN0aXZlQnVmZmVyLnggKyAxLCBmYWxzZSwgcmVzcGVjdFByb3RlY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdGhpcy5fZXJhc2VJbkJ1ZmZlckxpbmUodGhpcy5fYWN0aXZlQnVmZmVyLnksIDAsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdHJ1ZSwgcmVzcGVjdFByb3RlY3QpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIExcbiAgICogSW5zZXJ0IFBzIExpbmUocykgKGRlZmF1bHQgPSAxKSAoSUwpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBJTCAgXCJJbnNlcnQgTGluZVwiICAgXCJDU0kgUHMgTFwiICBcIkluc2VydCBgUHNgIGJsYW5rIGxpbmVzIGF0IGFjdGl2ZSByb3cgKGRlZmF1bHQ9MSkuXCJcbiAgICogRm9yIGV2ZXJ5IGluc2VydGVkIGxpbmUgYXQgdGhlIHNjcm9sbCB0b3Agb25lIGxpbmUgYXQgdGhlIHNjcm9sbCBib3R0b20gZ2V0cyByZW1vdmVkLlxuICAgKiBUaGUgY3Vyc29yIGlzIHNldCB0byB0aGUgZmlyc3QgY29sdW1uLlxuICAgKiBJTCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBjdXJzb3IgaXMgb3V0c2lkZSB0aGUgc2Nyb2xsIG1hcmdpbnMuXG4gICAqL1xuICBwdWJsaWMgaW5zZXJ0TGluZXMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICBsZXQgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPiB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tIHx8IHRoaXMuX2FjdGl2ZUJ1ZmZlci55IDwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93OiBudW1iZXIgPSB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueTtcblxuICAgIGNvbnN0IHNjcm9sbEJvdHRvbVJvd3NPZmZzZXQgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxIC0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbTtcbiAgICBjb25zdCBzY3JvbGxCb3R0b21BYnNvbHV0ZSA9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEgKyB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgLSBzY3JvbGxCb3R0b21Sb3dzT2Zmc2V0ICsgMTtcbiAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgLy8gdGVzdDogZWNobyAtZSAnXFxlWzQ0bVxcZVsxTFxcZVswbSdcbiAgICAgIC8vIGJsYW5rTGluZSh0cnVlKSAtIHh0ZXJtL2xpbnV4IGJlaGF2aW9yXG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHNjcm9sbEJvdHRvbUFic29sdXRlIC0gMSwgMSk7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHJvdywgMCwgdGhpcy5fYWN0aXZlQnVmZmVyLmdldEJsYW5rTGluZSh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnksIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gMDsgLy8gc2VlIGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vY2hhcHRlcjQuaHRtbCAtIHZ0MjIwIG9ubHk/XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIE1cbiAgICogRGVsZXRlIFBzIExpbmUocykgKGRlZmF1bHQgPSAxKSAoREwpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBETCAgXCJEZWxldGUgTGluZVwiICAgXCJDU0kgUHMgTVwiICBcIkRlbGV0ZSBgUHNgIGxpbmVzIGF0IGFjdGl2ZSByb3cgKGRlZmF1bHQ9MSkuXCJcbiAgICogRm9yIGV2ZXJ5IGRlbGV0ZWQgbGluZSBhdCB0aGUgc2Nyb2xsIHRvcCBvbmUgYmxhbmsgbGluZSBhdCB0aGUgc2Nyb2xsIGJvdHRvbSBnZXRzIGFwcGVuZGVkLlxuICAgKiBUaGUgY3Vyc29yIGlzIHNldCB0byB0aGUgZmlyc3QgY29sdW1uLlxuICAgKiBETCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBjdXJzb3IgaXMgb3V0c2lkZSB0aGUgc2Nyb2xsIG1hcmdpbnMuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlTGluZXMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICBsZXQgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPiB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tIHx8IHRoaXMuX2FjdGl2ZUJ1ZmZlci55IDwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93OiBudW1iZXIgPSB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueTtcblxuICAgIGxldCBqOiBudW1iZXI7XG4gICAgaiA9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEgLSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tO1xuICAgIGogPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxICsgdGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlIC0gajtcbiAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgLy8gdGVzdDogZWNobyAtZSAnXFxlWzQ0bVxcZVsxTVxcZVswbSdcbiAgICAgIC8vIGJsYW5rTGluZSh0cnVlKSAtIHh0ZXJtL2xpbnV4IGJlaGF2aW9yXG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHJvdywgMSk7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKGosIDAsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXRCbGFua0xpbmUodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55LCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IDA7IC8vIHNlZSBodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL2NoYXB0ZXI0Lmh0bWwgLSB2dDIyMCBvbmx5P1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBAXG4gICAqIEluc2VydCBQcyAoQmxhbmspIENoYXJhY3RlcihzKSAoZGVmYXVsdCA9IDEpIChJQ0gpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBJQ0ggIFwiSW5zZXJ0IENoYXJhY3RlcnNcIiAgIFwiQ1NJIFBzIEBcIiAgXCJJbnNlcnQgYFBzYCAoYmxhbmspIGNoYXJhY3RlcnMgKGRlZmF1bHQgPSAxKS5cIlxuICAgKiBUaGUgSUNIIHNlcXVlbmNlIGluc2VydHMgYFBzYCBibGFuayBjaGFyYWN0ZXJzLiBUaGUgY3Vyc29yIHJlbWFpbnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgICogYmxhbmsgY2hhcmFjdGVycy4gVGV4dCBiZXR3ZWVuIHRoZSBjdXJzb3IgYW5kIHJpZ2h0IG1hcmdpbiBtb3ZlcyB0byB0aGUgcmlnaHQuIENoYXJhY3RlcnMgbW92ZWRcbiAgICogcGFzdCB0aGUgcmlnaHQgbWFyZ2luIGFyZSBsb3N0LlxuICAgKlxuICAgKlxuICAgKiBGSVhNRTogY2hlY2sgYWdhaW5zdCB4dGVybSAtIHNob3VsZCBub3Qgd29yayBvdXRzaWRlIG9mIHNjcm9sbCBtYXJnaW5zIChzZWUgVlQ1MjAgbWFudWFsKVxuICAgKi9cbiAgcHVibGljIGluc2VydENoYXJzKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7XG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIGlmIChsaW5lKSB7XG4gICAgICBsaW5lLmluc2VydENlbGxzKFxuICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCxcbiAgICAgICAgcGFyYW1zLnBhcmFtc1swXSB8fCAxLFxuICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0TnVsbENlbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKVxuICAgICAgKTtcbiAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgUFxuICAgKiBEZWxldGUgUHMgQ2hhcmFjdGVyKHMpIChkZWZhdWx0ID0gMSkgKERDSCkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERDSCAgIFwiRGVsZXRlIENoYXJhY3RlclwiICBcIkNTSSBQcyBQXCIgIFwiRGVsZXRlIGBQc2AgY2hhcmFjdGVycyAoZGVmYXVsdD0xKS5cIlxuICAgKiBBcyBjaGFyYWN0ZXJzIGFyZSBkZWxldGVkLCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYmV0d2VlbiB0aGUgY3Vyc29yIGFuZCByaWdodCBtYXJnaW4gbW92ZSB0b1xuICAgKiB0aGUgbGVmdC4gQ2hhcmFjdGVyIGF0dHJpYnV0ZXMgbW92ZSB3aXRoIHRoZSBjaGFyYWN0ZXJzLiBUaGUgdGVybWluYWwgYWRkcyBibGFuayBjaGFyYWN0ZXJzIGF0XG4gICAqIHRoZSByaWdodCBtYXJnaW4uXG4gICAqXG4gICAqXG4gICAqIEZJWE1FOiBjaGVjayBhZ2FpbnN0IHh0ZXJtIC0gc2hvdWxkIG5vdCB3b3JrIG91dHNpZGUgb2Ygc2Nyb2xsIG1hcmdpbnMgKHNlZSBWVDUyMCBtYW51YWwpXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQ2hhcnMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgaWYgKGxpbmUpIHtcbiAgICAgIGxpbmUuZGVsZXRlQ2VsbHMoXG4gICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54LFxuICAgICAgICBwYXJhbXMucGFyYW1zWzBdIHx8IDEsXG4gICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpXG4gICAgICApO1xuICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBTICBTY3JvbGwgdXAgUHMgbGluZXMgKGRlZmF1bHQgPSAxKSAoU1UpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBTVSAgXCJTY3JvbGwgVXBcIiAgIFwiQ1NJIFBzIFNcIiAgXCJTY3JvbGwgYFBzYCBsaW5lcyB1cCAoZGVmYXVsdD0xKS5cIlxuICAgKlxuICAgKlxuICAgKiBGSVhNRTogc2Nyb2xsZWQgb3V0IGxpbmVzIGF0IHRvcCA9IDEgc2hvdWxkIGFkZCB0byBzY3JvbGxiYWNrICh4dGVybSlcbiAgICovXG4gIHB1YmxpYyBzY3JvbGxVcChwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBsZXQgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG5cbiAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnNwbGljZSh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCAxKTtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zcGxpY2UodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSwgMCwgdGhpcy5fYWN0aXZlQnVmZmVyLmdldEJsYW5rTGluZSh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtcbiAgICB9XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBUICBTY3JvbGwgZG93biBQcyBsaW5lcyAoZGVmYXVsdCA9IDEpIChTRCkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIFNEICBcIlNjcm9sbCBEb3duXCIgICBcIkNTSSBQcyBUXCIgIFwiU2Nyb2xsIGBQc2AgbGluZXMgZG93biAoZGVmYXVsdD0xKS5cIlxuICAgKi9cbiAgcHVibGljIHNjcm9sbERvd24ocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgbGV0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuXG4gICAgd2hpbGUgKHBhcmFtLS0pIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zcGxpY2UodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSwgMSk7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsIDAsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXRCbGFua0xpbmUoREVGQVVMVF9BVFRSX0RBVEEpKTtcbiAgICB9XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBTUCBAICBTY3JvbGwgbGVmdCBQcyBjb2x1bW5zIChkZWZhdWx0ID0gMSkgKFNMKSBFQ01BLTQ4XG4gICAqXG4gICAqIE5vdGF0aW9uOiAoUG4pXG4gICAqIFJlcHJlc2VudGF0aW9uOiBDU0kgUG4gMDIvMDAgMDQvMDBcbiAgICogUGFyYW1ldGVyIGRlZmF1bHQgdmFsdWU6IFBuID0gMVxuICAgKiBTTCBjYXVzZXMgdGhlIGRhdGEgaW4gdGhlIHByZXNlbnRhdGlvbiBjb21wb25lbnQgdG8gYmUgbW92ZWQgYnkgbiBjaGFyYWN0ZXIgcG9zaXRpb25zXG4gICAqIGlmIHRoZSBsaW5lIG9yaWVudGF0aW9uIGlzIGhvcml6b250YWwsIG9yIGJ5IG4gbGluZSBwb3NpdGlvbnMgaWYgdGhlIGxpbmUgb3JpZW50YXRpb25cbiAgICogaXMgdmVydGljYWwsIHN1Y2ggdGhhdCB0aGUgZGF0YSBhcHBlYXIgdG8gbW92ZSB0byB0aGUgbGVmdDsgd2hlcmUgbiBlcXVhbHMgdGhlIHZhbHVlIG9mIFBuLlxuICAgKiBUaGUgYWN0aXZlIHByZXNlbnRhdGlvbiBwb3NpdGlvbiBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyBjb250cm9sIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQ6XG4gICAqICAgLSBhbHdheXMgbGVmdCBzaGlmdCAobm8gbGluZSBvcmllbnRhdGlvbiBzZXR0aW5nIHJlc3BlY3RlZClcbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgU0wgIFwiU2Nyb2xsIExlZnRcIiBcIkNTSSBQcyBTUCBAXCIgXCJTY3JvbGwgdmlld3BvcnQgYFBzYCB0aW1lcyB0byB0aGUgbGVmdC5cIlxuICAgKiBTTCBtb3ZlcyB0aGUgY29udGVudCBvZiBhbGwgbGluZXMgd2l0aGluIHRoZSBzY3JvbGwgbWFyZ2lucyBgUHNgIHRpbWVzIHRvIHRoZSBsZWZ0LlxuICAgKiBTTCBoYXMgbm8gZWZmZWN0IG91dHNpZGUgb2YgdGhlIHNjcm9sbCBtYXJnaW5zLlxuICAgKi9cbiAgcHVibGljIHNjcm9sbExlZnQocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID4gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSB8fCB0aGlzLl9hY3RpdmVCdWZmZXIueSA8IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbSA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICBmb3IgKGxldCB5ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcDsgeSA8PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tOyArK3kpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHkpITtcbiAgICAgIGxpbmUuZGVsZXRlQ2VsbHMoMCwgcGFyYW0sIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtcbiAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgU1AgQSAgU2Nyb2xsIHJpZ2h0IFBzIGNvbHVtbnMgKGRlZmF1bHQgPSAxKSAoU1IpIEVDTUEtNDhcbiAgICpcbiAgICogTm90YXRpb246IChQbilcbiAgICogUmVwcmVzZW50YXRpb246IENTSSBQbiAwMi8wMCAwNC8wMVxuICAgKiBQYXJhbWV0ZXIgZGVmYXVsdCB2YWx1ZTogUG4gPSAxXG4gICAqIFNSIGNhdXNlcyB0aGUgZGF0YSBpbiB0aGUgcHJlc2VudGF0aW9uIGNvbXBvbmVudCB0byBiZSBtb3ZlZCBieSBuIGNoYXJhY3RlciBwb3NpdGlvbnNcbiAgICogaWYgdGhlIGxpbmUgb3JpZW50YXRpb24gaXMgaG9yaXpvbnRhbCwgb3IgYnkgbiBsaW5lIHBvc2l0aW9ucyBpZiB0aGUgbGluZSBvcmllbnRhdGlvblxuICAgKiBpcyB2ZXJ0aWNhbCwgc3VjaCB0aGF0IHRoZSBkYXRhIGFwcGVhciB0byBtb3ZlIHRvIHRoZSByaWdodDsgd2hlcmUgbiBlcXVhbHMgdGhlIHZhbHVlIG9mIFBuLlxuICAgKiBUaGUgYWN0aXZlIHByZXNlbnRhdGlvbiBwb3NpdGlvbiBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyBjb250cm9sIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQ6XG4gICAqICAgLSBhbHdheXMgcmlnaHQgc2hpZnQgKG5vIGxpbmUgb3JpZW50YXRpb24gc2V0dGluZyByZXNwZWN0ZWQpXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIFNSICBcIlNjcm9sbCBSaWdodFwiICBcIkNTSSBQcyBTUCBBXCIgICBcIlNjcm9sbCB2aWV3cG9ydCBgUHNgIHRpbWVzIHRvIHRoZSByaWdodC5cIlxuICAgKiBTTCBtb3ZlcyB0aGUgY29udGVudCBvZiBhbGwgbGluZXMgd2l0aGluIHRoZSBzY3JvbGwgbWFyZ2lucyBgUHNgIHRpbWVzIHRvIHRoZSByaWdodC5cbiAgICogQ29udGVudCBhdCB0aGUgcmlnaHQgbWFyZ2luIGlzIGxvc3QuXG4gICAqIFNMIGhhcyBubyBlZmZlY3Qgb3V0c2lkZSBvZiB0aGUgc2Nyb2xsIG1hcmdpbnMuXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsUmlnaHQocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID4gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSB8fCB0aGlzLl9hY3RpdmVCdWZmZXIueSA8IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbSA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICBmb3IgKGxldCB5ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcDsgeSA8PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tOyArK3kpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHkpITtcbiAgICAgIGxpbmUuaW5zZXJ0Q2VsbHMoMCwgcGFyYW0sIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtcbiAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUG0gJyB9XG4gICAqIEluc2VydCBQcyBDb2x1bW4ocykgKGRlZmF1bHQgPSAxKSAoREVDSUMpLCBWVDQyMCBhbmQgdXAuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERFQ0lDIFwiSW5zZXJ0IENvbHVtbnNcIiAgXCJDU0kgUHMgJyB9XCIgIFwiSW5zZXJ0IGBQc2AgY29sdW1ucyBhdCBjdXJzb3IgcG9zaXRpb24uXCJcbiAgICogREVDSUMgaW5zZXJ0cyBgUHNgIHRpbWVzIGJsYW5rIGNvbHVtbnMgYXQgdGhlIGN1cnNvciBwb3NpdGlvbiBmb3IgYWxsIGxpbmVzIHdpdGggdGhlIHNjcm9sbFxuICAgKiBtYXJnaW5zLCBtb3ZpbmcgY29udGVudCB0byB0aGUgcmlnaHQuIENvbnRlbnQgYXQgdGhlIHJpZ2h0IG1hcmdpbiBpcyBsb3N0LiBERUNJQyBoYXMgbm8gZWZmZWN0XG4gICAqIG91dHNpZGUgdGhlIHNjcm9sbGluZyBtYXJnaW5zLlxuICAgKi9cbiAgcHVibGljIGluc2VydENvbHVtbnMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID4gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSB8fCB0aGlzLl9hY3RpdmVCdWZmZXIueSA8IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbSA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICBmb3IgKGxldCB5ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcDsgeSA8PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tOyArK3kpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHkpITtcbiAgICAgIGxpbmUuaW5zZXJ0Q2VsbHModGhpcy5fYWN0aXZlQnVmZmVyLngsIHBhcmFtLCB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0TnVsbENlbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSk7XG4gICAgICBsaW5lLmlzV3JhcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBtICcgflxuICAgKiBEZWxldGUgUHMgQ29sdW1uKHMpIChkZWZhdWx0ID0gMSkgKERFQ0RDKSwgVlQ0MjAgYW5kIHVwLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBERUNEQyBcIkRlbGV0ZSBDb2x1bW5zXCIgIFwiQ1NJIFBzICcgflwiICBcIkRlbGV0ZSBgUHNgIGNvbHVtbnMgYXQgY3Vyc29yIHBvc2l0aW9uLlwiXG4gICAqIERFQ0RDIGRlbGV0ZXMgYFBzYCB0aW1lcyBjb2x1bW5zIGF0IHRoZSBjdXJzb3IgcG9zaXRpb24gZm9yIGFsbCBsaW5lcyB3aXRoIHRoZSBzY3JvbGwgbWFyZ2lucyxcbiAgICogbW92aW5nIGNvbnRlbnQgdG8gdGhlIGxlZnQuIEJsYW5rIGNvbHVtbnMgYXJlIGFkZGVkIGF0IHRoZSByaWdodCBtYXJnaW4uXG4gICAqIERFQ0RDIGhhcyBubyBlZmZlY3Qgb3V0c2lkZSB0aGUgc2Nyb2xsaW5nIG1hcmdpbnMuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQ29sdW1ucyhwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPiB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tIHx8IHRoaXMuX2FjdGl2ZUJ1ZmZlci55IDwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuICAgIGZvciAobGV0IHkgPSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wOyB5IDw9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b207ICsreSkge1xuICAgICAgY29uc3QgbGluZSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgeSkhO1xuICAgICAgbGluZS5kZWxldGVDZWxscyh0aGlzLl9hY3RpdmVCdWZmZXIueCwgcGFyYW0sIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtcbiAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgWFxuICAgKiBFcmFzZSBQcyBDaGFyYWN0ZXIocykgKGRlZmF1bHQgPSAxKSAoRUNIKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgRUNIICAgXCJFcmFzZSBDaGFyYWN0ZXJcIiAgIFwiQ1NJIFBzIFhcIiAgXCJFcmFzZSBgUHNgIGNoYXJhY3RlcnMgZnJvbSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiB0byB0aGUgcmlnaHQgKGRlZmF1bHQ9MSkuXCJcbiAgICogRUQgZXJhc2VzIGBQc2AgY2hhcmFjdGVycyBmcm9tIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIHRvIHRoZSByaWdodC5cbiAgICogRUQgd29ya3MgaW5zaWRlIG9yIG91dHNpZGUgdGhlIHNjcm9sbGluZyBtYXJnaW5zLlxuICAgKi9cbiAgcHVibGljIGVyYXNlQ2hhcnMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgaWYgKGxpbmUpIHtcbiAgICAgIGxpbmUucmVwbGFjZUNlbGxzKFxuICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCxcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggKyAocGFyYW1zLnBhcmFtc1swXSB8fCAxKSxcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSlcbiAgICAgICk7XG4gICAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIGIgIFJlcGVhdCB0aGUgcHJlY2VkaW5nIGdyYXBoaWMgY2hhcmFjdGVyIFBzIHRpbWVzIChSRVApLlxuICAgKiBGcm9tIEVDTUEgNDggKEBzZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VjbWEtMDQ4LnBkZilcbiAgICogICAgTm90YXRpb246IChQbilcbiAgICogICAgUmVwcmVzZW50YXRpb246IENTSSBQbiAwNi8wMlxuICAgKiAgICBQYXJhbWV0ZXIgZGVmYXVsdCB2YWx1ZTogUG4gPSAxXG4gICAqICAgIFJFUCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHByZWNlZGluZyBjaGFyYWN0ZXIgaW4gdGhlIGRhdGEgc3RyZWFtLFxuICAgKiAgICBpZiBpdCBpcyBhIGdyYXBoaWMgY2hhcmFjdGVyIChyZXByZXNlbnRlZCBieSBvbmUgb3IgbW9yZSBiaXQgY29tYmluYXRpb25zKSBpbmNsdWRpbmcgU1BBQ0UsXG4gICAqICAgIGlzIHRvIGJlIHJlcGVhdGVkIG4gdGltZXMsIHdoZXJlIG4gZXF1YWxzIHRoZSB2YWx1ZSBvZiBQbi5cbiAgICogICAgSWYgdGhlIGNoYXJhY3RlciBwcmVjZWRpbmcgUkVQIGlzIGEgY29udHJvbCBmdW5jdGlvbiBvciBwYXJ0IG9mIGEgY29udHJvbCBmdW5jdGlvbixcbiAgICogICAgdGhlIGVmZmVjdCBvZiBSRVAgaXMgbm90IGRlZmluZWQgYnkgdGhpcyBTdGFuZGFyZC5cbiAgICpcbiAgICogV2UgZXh0ZW5kIHh0ZXJtJ3MgYmVoYXZpb3IgdG8gYWxsb3cgcmVwZWF0aW5nIGVudGlyZSBncmFwaGVtZSBjbHVzdGVycy5cbiAgICogVGhpcyBpc24ndCAxMDAlIHh0ZXJtLWNvbXBhdGlibGUsIGJ1dCBpdCBzZWVtcyBzYW5lciBhbmQgbW9yZSB1c2VmdWwuXG4gICAqICAgIC0gdGV4dCBhdHRycyBhcmUgYXBwbGllZCBub3JtYWxseVxuICAgKiAgICAtIHdyYXAgYXJvdW5kIGlzIHJlc3BlY3RlZFxuICAgKiAgICAtIGFueSB2YWxpZCBzZXF1ZW5jZSByZXNldHMgdGhlIGNhcnJpZWQgZm9yd2FyZCBjaGFyXG4gICAqXG4gICAqIE5vdGU6IFRvIGdldCByZXNldCBvbiBhIHZhbGlkIHNlcXVlbmNlIHdvcmtpbmcgY29ycmVjdGx5IHdpdGhvdXQgbXVjaCBydW50aW1lIHBlbmFsdHksIHRoZVxuICAgKiBwcmVjZWRpbmcgY29kZXBvaW50IGlzIHN0b3JlZCBvbiB0aGUgcGFyc2VyIGluIGB0aGlzLnByaW50YCBhbmQgcmVzZXQgZHVyaW5nIGBwYXJzZXIucGFyc2VgLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBSRVAgICBcIlJlcGVhdCBQcmVjZWRpbmcgQ2hhcmFjdGVyXCIgICAgXCJDU0kgUHMgYlwiICBcIlJlcGVhdCBwcmVjZWRpbmcgY2hhcmFjdGVyIGBQc2AgdGltZXMgKGRlZmF1bHQ9MSkuXCJcbiAgICogUkVQIHJlcGVhdHMgdGhlIHByZXZpb3VzIGNoYXJhY3RlciBgUHNgIHRpbWVzIGFkdmFuY2luZyB0aGUgY3Vyc29yLCBhbHNvIHdyYXBwaW5nIGlmIERFQ0FXTSBpc1xuICAgKiBzZXQuIFJFUCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBzZXF1ZW5jZSBkb2VzIG5vdCBmb2xsb3cgYSBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVyXG4gICAqIChOT09QIGZvciBhbnkgb3RoZXIgc2VxdWVuY2UgaW4gYmV0d2VlbiBvciBOT04gQVNDSUkgY2hhcmFjdGVycykuXG4gICAqL1xuICBwdWJsaWMgcmVwZWF0UHJlY2VkaW5nQ2hhcmFjdGVyKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGpvaW5TdGF0ZSA9IHRoaXMuX3BhcnNlci5wcmVjZWRpbmdKb2luU3RhdGU7XG4gICAgaWYgKCFqb2luU3RhdGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBjYWxsIHByaW50IHRvIGluc2VydCB0aGUgY2hhcnMgYW5kIGhhbmRsZSBjb3JyZWN0IHdyYXBwaW5nXG4gICAgY29uc3QgbGVuZ3RoID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuICAgIGNvbnN0IGNoV2lkdGggPSBVbmljb2RlU2VydmljZS5leHRyYWN0V2lkdGgoam9pblN0YXRlKTtcbiAgICBjb25zdCB4ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnggLSBjaFdpZHRoO1xuICAgIGNvbnN0IGJ1ZmZlclJvdyA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpITtcbiAgICBjb25zdCB0ZXh0ID0gYnVmZmVyUm93LmdldFN0cmluZyh4KTtcbiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQzMkFycmF5KHRleHQubGVuZ3RoICogbGVuZ3RoKTtcbiAgICBsZXQgaWRhdGEgPSAwO1xuICAgIGZvciAobGV0IGl0ZXh0ID0gMDsgaXRleHQgPCB0ZXh0Lmxlbmd0aDsgKSB7XG4gICAgICBjb25zdCBjaCA9IHRleHQuY29kZVBvaW50QXQoaXRleHQpIHx8IDA7XG4gICAgICBkYXRhW2lkYXRhKytdID0gY2g7XG4gICAgICBpdGV4dCArPSBjaCA+IDB4ZmZmZiA/IDIgOiAxO1xuICAgIH1cbiAgICBsZXQgdGxlbmd0aCA9IGlkYXRhO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGRhdGEuY29weVdpdGhpbih0bGVuZ3RoLCAwLCBpZGF0YSk7XG4gICAgICB0bGVuZ3RoICs9IGlkYXRhO1xuICAgIH1cbiAgICB0aGlzLnByaW50KGRhdGEsIDAsIHRsZW5ndGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBjICBTZW5kIERldmljZSBBdHRyaWJ1dGVzIChQcmltYXJ5IERBKS5cbiAgICogICAgIFBzID0gMCAgb3Igb21pdHRlZCAtPiByZXF1ZXN0IGF0dHJpYnV0ZXMgZnJvbSB0ZXJtaW5hbC4gIFRoZVxuICAgKiAgICAgcmVzcG9uc2UgZGVwZW5kcyBvbiB0aGUgZGVjVGVybWluYWxJRCByZXNvdXJjZSBzZXR0aW5nLlxuICAgKiAgICAgLT4gQ1NJID8gMSA7IDIgYyAgKGBgVlQxMDAgd2l0aCBBZHZhbmNlZCBWaWRlbyBPcHRpb24nJylcbiAgICogICAgIC0+IENTSSA/IDEgOyAwIGMgIChgYFZUMTAxIHdpdGggTm8gT3B0aW9ucycnKVxuICAgKiAgICAgLT4gQ1NJID8gNiBjICAoYGBWVDEwMicnKVxuICAgKiAgICAgLT4gQ1NJID8gNiAwIDsgMSA7IDIgOyA2IDsgOCA7IDkgOyAxIDUgOyBjICAoYGBWVDIyMCcnKVxuICAgKiAgIFRoZSBWVDEwMC1zdHlsZSByZXNwb25zZSBwYXJhbWV0ZXJzIGRvIG5vdCBtZWFuIGFueXRoaW5nIGJ5XG4gICAqICAgdGhlbXNlbHZlcy4gIFZUMjIwIHBhcmFtZXRlcnMgZG8sIHRlbGxpbmcgdGhlIGhvc3Qgd2hhdCBmZWEtXG4gICAqICAgdHVyZXMgdGhlIHRlcm1pbmFsIHN1cHBvcnRzOlxuICAgKiAgICAgUHMgPSAxICAtPiAxMzItY29sdW1ucy5cbiAgICogICAgIFBzID0gMiAgLT4gUHJpbnRlci5cbiAgICogICAgIFBzID0gNiAgLT4gU2VsZWN0aXZlIGVyYXNlLlxuICAgKiAgICAgUHMgPSA4ICAtPiBVc2VyLWRlZmluZWQga2V5cy5cbiAgICogICAgIFBzID0gOSAgLT4gTmF0aW9uYWwgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIHNldHMuXG4gICAqICAgICBQcyA9IDEgNSAgLT4gVGVjaG5pY2FsIGNoYXJhY3RlcnMuXG4gICAqICAgICBQcyA9IDIgMiAgLT4gQU5TSSBjb2xvciwgZS5nLiwgVlQ1MjUuXG4gICAqICAgICBQcyA9IDIgOSAgLT4gQU5TSSB0ZXh0IGxvY2F0b3IgKGkuZS4sIERFQyBMb2NhdG9yIG1vZGUpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBEQTEgICBcIlByaW1hcnkgRGV2aWNlIEF0dHJpYnV0ZXNcIiAgICAgXCJDU0kgY1wiICBcIlNlbmQgcHJpbWFyeSBkZXZpY2UgYXR0cmlidXRlcy5cIlxuICAgKlxuICAgKlxuICAgKiBUT0RPOiBmaXggYW5kIGNsZWFudXAgcmVzcG9uc2VcbiAgICovXG4gIHB1YmxpYyBzZW5kRGV2aWNlQXR0cmlidXRlc1ByaW1hcnkocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKHBhcmFtcy5wYXJhbXNbMF0gPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzKCd4dGVybScpIHx8IHRoaXMuX2lzKCdyeHZ0LXVuaWNvZGUnKSB8fCB0aGlzLl9pcygnc2NyZWVuJykpIHtcbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoQzAuRVNDICsgJ1s/MTsyYycpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5faXMoJ2xpbnV4JykpIHtcbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoQzAuRVNDICsgJ1s/NmMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJID4gUHMgY1xuICAgKiAgIFNlbmQgRGV2aWNlIEF0dHJpYnV0ZXMgKFNlY29uZGFyeSBEQSkuXG4gICAqICAgICBQcyA9IDAgIG9yIG9taXR0ZWQgLT4gcmVxdWVzdCB0aGUgdGVybWluYWwncyBpZGVudGlmaWNhdGlvblxuICAgKiAgICAgY29kZS4gIFRoZSByZXNwb25zZSBkZXBlbmRzIG9uIHRoZSBkZWNUZXJtaW5hbElEIHJlc291cmNlIHNldC1cbiAgICogICAgIHRpbmcuICBJdCBzaG91bGQgYXBwbHkgb25seSB0byBWVDIyMCBhbmQgdXAsIGJ1dCB4dGVybSBleHRlbmRzXG4gICAqICAgICB0aGlzIHRvIFZUMTAwLlxuICAgKiAgICAgLT4gQ1NJICA+IFBwIDsgUHYgOyBQYyBjXG4gICAqICAgd2hlcmUgUHAgZGVub3RlcyB0aGUgdGVybWluYWwgdHlwZVxuICAgKiAgICAgUHAgPSAwICAtPiBgYFZUMTAwJycuXG4gICAqICAgICBQcCA9IDEgIC0+IGBgVlQyMjAnJy5cbiAgICogICBhbmQgUHYgaXMgdGhlIGZpcm13YXJlIHZlcnNpb24gKGZvciB4dGVybSwgdGhpcyB3YXMgb3JpZ2luYWxseVxuICAgKiAgIHRoZSBYRnJlZTg2IHBhdGNoIG51bWJlciwgc3RhcnRpbmcgd2l0aCA5NSkuICBJbiBhIERFQyB0ZXJtaS1cbiAgICogICBuYWwsIFBjIGluZGljYXRlcyB0aGUgUk9NIGNhcnRyaWRnZSByZWdpc3RyYXRpb24gbnVtYmVyIGFuZCBpc1xuICAgKiAgIGFsd2F5cyB6ZXJvLlxuICAgKiBNb3JlIGluZm9ybWF0aW9uOlxuICAgKiAgIHh0ZXJtL2NoYXJwcm9jLmMgLSBsaW5lIDIwMTIsIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKiAgIHZpbSByZXNwb25kcyB3aXRoIF5bWz8wYyBvciBeW1s/MWMgYWZ0ZXIgdGhlIHRlcm1pbmFsJ3MgcmVzcG9uc2UgKD8pXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERBMiAgIFwiU2Vjb25kYXJ5IERldmljZSBBdHRyaWJ1dGVzXCIgICBcIkNTSSA+IGNcIiBcIlNlbmQgcHJpbWFyeSBkZXZpY2UgYXR0cmlidXRlcy5cIlxuICAgKlxuICAgKlxuICAgKiBUT0RPOiBmaXggYW5kIGNsZWFudXAgcmVzcG9uc2VcbiAgICovXG4gIHB1YmxpYyBzZW5kRGV2aWNlQXR0cmlidXRlc1NlY29uZGFyeShwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBpZiAocGFyYW1zLnBhcmFtc1swXSA+IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyB4dGVybSBhbmQgdXJ4dnRcbiAgICAvLyBzZWVtIHRvIHNwaXQgdGhpc1xuICAgIC8vIG91dCBhcm91bmQgfjM3MCB0aW1lcyAoPykuXG4gICAgaWYgKHRoaXMuX2lzKCd4dGVybScpKSB7XG4gICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KEMwLkVTQyArICdbPjA7Mjc2OzBjJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9pcygncnh2dC11bmljb2RlJykpIHtcbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoQzAuRVNDICsgJ1s+ODU7OTU7MGMnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2lzKCdsaW51eCcpKSB7XG4gICAgICAvLyBub3Qgc3VwcG9ydGVkIGJ5IGxpbnV4IGNvbnNvbGUuXG4gICAgICAvLyBsaW51eCBjb25zb2xlIGVjaG9lcyBwYXJhbWV0ZXJzLlxuICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChwYXJhbXMucGFyYW1zWzBdICsgJ2MnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2lzKCdzY3JlZW4nKSkge1xuICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChDMC5FU0MgKyAnWz44Mzs0MDAwMzswYycpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZSBpZiB0aGUgY3VycmVudCB0ZXJtaW5hbCBpcyB0aGUgZ2l2ZW4gYXJndW1lbnQuXG4gICAqIEBwYXJhbSB0ZXJtIFRoZSB0ZXJtaW5hbCBuYW1lIHRvIGV2YWx1YXRlXG4gICAqL1xuICBwcml2YXRlIF9pcyh0ZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGVybU5hbWUgKyAnJykuaW5kZXhPZih0ZXJtKSA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUG0gaCAgU2V0IE1vZGUgKFNNKS5cbiAgICogICAgIFBzID0gMiAgLT4gS2V5Ym9hcmQgQWN0aW9uIE1vZGUgKEFNKS5cbiAgICogICAgIFBzID0gNCAgLT4gSW5zZXJ0IE1vZGUgKElSTSkuXG4gICAqICAgICBQcyA9IDEgMiAgLT4gU2VuZC9yZWNlaXZlIChTUk0pLlxuICAgKiAgICAgUHMgPSAyIDAgIC0+IEF1dG9tYXRpYyBOZXdsaW5lIChMTk0pLlxuICAgKlxuICAgKiBAdnQ6ICNQW09ubHkgSVJNIGlzIHN1cHBvcnRlZC5dICAgIENTSSBTTSAgICBcIlNldCBNb2RlXCIgIFwiQ1NJIFBtIGhcIiAgXCJTZXQgdmFyaW91cyB0ZXJtaW5hbCBtb2Rlcy5cIlxuICAgKiBTdXBwb3J0ZWQgcGFyYW0gdmFsdWVzIGJ5IFNNOlxuICAgKlxuICAgKiB8IFBhcmFtIHwgQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdXBwb3J0IHxcbiAgICogfCAtLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLSB8XG4gICAqIHwgMiAgICAgfCBLZXlib2FyZCBBY3Rpb24gTW9kZSAoS0FNKS4gQWx3YXlzIG9uLiB8ICNOICAgICAgfFxuICAgKiB8IDQgICAgIHwgSW5zZXJ0IE1vZGUgKElSTSkuICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMiAgICB8IFNlbmQvcmVjZWl2ZSAoU1JNKS4gQWx3YXlzIG9mZi4gICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgMjAgICAgfCBBdXRvbWF0aWMgTmV3bGluZSAoTE5NKS4gICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKi9cbiAgcHVibGljIHNldE1vZGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHN3aXRjaCAocGFyYW1zLnBhcmFtc1tpXSkge1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UubW9kZXMuaW5zZXJ0TW9kZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jb252ZXJ0RW9sID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJID8gUG0gaFxuICAgKiAgIERFQyBQcml2YXRlIE1vZGUgU2V0IChERUNTRVQpLlxuICAgKiAgICAgUHMgPSAxICAtPiBBcHBsaWNhdGlvbiBDdXJzb3IgS2V5cyAoREVDQ0tNKS5cbiAgICogICAgIFBzID0gMiAgLT4gRGVzaWduYXRlIFVTQVNDSUkgZm9yIGNoYXJhY3RlciBzZXRzIEcwLUczXG4gICAqICAgICAoREVDQU5NKSwgYW5kIHNldCBWVDEwMCBtb2RlLlxuICAgKiAgICAgUHMgPSAzICAtPiAxMzIgQ29sdW1uIE1vZGUgKERFQ0NPTE0pLlxuICAgKiAgICAgUHMgPSA0ICAtPiBTbW9vdGggKFNsb3cpIFNjcm9sbCAoREVDU0NMTSkuXG4gICAqICAgICBQcyA9IDUgIC0+IFJldmVyc2UgVmlkZW8gKERFQ1NDTk0pLlxuICAgKiAgICAgUHMgPSA2ICAtPiBPcmlnaW4gTW9kZSAoREVDT00pLlxuICAgKiAgICAgUHMgPSA3ICAtPiBXcmFwYXJvdW5kIE1vZGUgKERFQ0FXTSkuXG4gICAqICAgICBQcyA9IDggIC0+IEF1dG8tcmVwZWF0IEtleXMgKERFQ0FSTSkuXG4gICAqICAgICBQcyA9IDkgIC0+IFNlbmQgTW91c2UgWCAmIFkgb24gYnV0dG9uIHByZXNzLiAgU2VlIHRoZSBzZWMtXG4gICAqICAgICB0aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgIC0+IFNob3cgdG9vbGJhciAocnh2dCkuXG4gICAqICAgICBQcyA9IDEgMiAgLT4gU3RhcnQgQmxpbmtpbmcgQ3Vyc29yIChhdHQ2MTApLlxuICAgKiAgICAgUHMgPSAxIDggIC0+IFByaW50IGZvcm0gZmVlZCAoREVDUEZGKS5cbiAgICogICAgIFBzID0gMSA5ICAtPiBTZXQgcHJpbnQgZXh0ZW50IHRvIGZ1bGwgc2NyZWVuIChERUNQRVgpLlxuICAgKiAgICAgUHMgPSAyIDUgIC0+IFNob3cgQ3Vyc29yIChERUNUQ0VNKS5cbiAgICogICAgIFBzID0gMyAwICAtPiBTaG93IHNjcm9sbGJhciAocnh2dCkuXG4gICAqICAgICBQcyA9IDMgNSAgLT4gRW5hYmxlIGZvbnQtc2hpZnRpbmcgZnVuY3Rpb25zIChyeHZ0KS5cbiAgICogICAgIFBzID0gMyA4ICAtPiBFbnRlciBUZWt0cm9uaXggTW9kZSAoREVDVEVLKS5cbiAgICogICAgIFBzID0gNCAwICAtPiBBbGxvdyA4MCAtPiAxMzIgTW9kZS5cbiAgICogICAgIFBzID0gNCAxICAtPiBtb3JlKDEpIGZpeCAoc2VlIGN1cnNlcyByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDQgMiAgLT4gRW5hYmxlIE5hdGlvbiBSZXBsYWNlbWVudCBDaGFyYWN0ZXIgc2V0cyAoREVDTi1cbiAgICogICAgIFJDTSkuXG4gICAqICAgICBQcyA9IDQgNCAgLT4gVHVybiBPbiBNYXJnaW4gQmVsbC5cbiAgICogICAgIFBzID0gNCA1ICAtPiBSZXZlcnNlLXdyYXBhcm91bmQgTW9kZS5cbiAgICogICAgIFBzID0gNCA2ICAtPiBTdGFydCBMb2dnaW5nLiAgVGhpcyBpcyBub3JtYWxseSBkaXNhYmxlZCBieSBhXG4gICAqICAgICBjb21waWxlLXRpbWUgb3B0aW9uLlxuICAgKiAgICAgUHMgPSA0IDcgIC0+IFVzZSBBbHRlcm5hdGUgU2NyZWVuIEJ1ZmZlci4gIChUaGlzIG1heSBiZSBkaXMtXG4gICAqICAgICBhYmxlZCBieSB0aGUgdGl0ZUluaGliaXQgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSA2IDYgIC0+IEFwcGxpY2F0aW9uIGtleXBhZCAoREVDTktNKS5cbiAgICogICAgIFBzID0gNiA3ICAtPiBCYWNrYXJyb3cga2V5IHNlbmRzIGJhY2tzcGFjZSAoREVDQktNKS5cbiAgICogICAgIFBzID0gMSAwIDAgMCAgLT4gU2VuZCBNb3VzZSBYICYgWSBvbiBidXR0b24gcHJlc3MgYW5kXG4gICAqICAgICByZWxlYXNlLiAgU2VlIHRoZSBzZWN0aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCAxICAtPiBVc2UgSGlsaXRlIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCAyICAtPiBVc2UgQ2VsbCBNb3Rpb24gTW91c2UgVHJhY2tpbmcuXG4gICAqICAgICBQcyA9IDEgMCAwIDMgIC0+IFVzZSBBbGwgTW90aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCA0ICAtPiBTZW5kIEZvY3VzSW4vRm9jdXNPdXQgZXZlbnRzLlxuICAgKiAgICAgUHMgPSAxIDAgMCA1ICAtPiBFbmFibGUgRXh0ZW5kZWQgTW91c2UgTW9kZS5cbiAgICogICAgIFBzID0gMSAwIDEgMCAgLT4gU2Nyb2xsIHRvIGJvdHRvbSBvbiB0dHkgb3V0cHV0IChyeHZ0KS5cbiAgICogICAgIFBzID0gMSAwIDEgMSAgLT4gU2Nyb2xsIHRvIGJvdHRvbSBvbiBrZXkgcHJlc3MgKHJ4dnQpLlxuICAgKiAgICAgUHMgPSAxIDAgMyA0ICAtPiBJbnRlcnByZXQgXCJtZXRhXCIga2V5LCBzZXRzIGVpZ2h0aCBiaXQuXG4gICAqICAgICAoZW5hYmxlcyB0aGUgZWlnaHRCaXRJbnB1dCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCAzIDUgIC0+IEVuYWJsZSBzcGVjaWFsIG1vZGlmaWVycyBmb3IgQWx0IGFuZCBOdW0tXG4gICAqICAgICBMb2NrIGtleXMuICAoVGhpcyBlbmFibGVzIHRoZSBudW1Mb2NrIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDMgNiAgLT4gU2VuZCBFU0MgICB3aGVuIE1ldGEgbW9kaWZpZXMgYSBrZXkuICAoVGhpc1xuICAgKiAgICAgZW5hYmxlcyB0aGUgbWV0YVNlbmRzRXNjYXBlIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDMgNyAgLT4gU2VuZCBERUwgZnJvbSB0aGUgZWRpdGluZy1rZXlwYWQgRGVsZXRlXG4gICAqICAgICBrZXkuXG4gICAqICAgICBQcyA9IDEgMCAzIDkgIC0+IFNlbmQgRVNDICB3aGVuIEFsdCBtb2RpZmllcyBhIGtleS4gIChUaGlzXG4gICAqICAgICBlbmFibGVzIHRoZSBhbHRTZW5kc0VzY2FwZSByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDAgIC0+IEtlZXAgc2VsZWN0aW9uIGV2ZW4gaWYgbm90IGhpZ2hsaWdodGVkLlxuICAgKiAgICAgKFRoaXMgZW5hYmxlcyB0aGUga2VlcFNlbGVjdGlvbiByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDEgIC0+IFVzZSB0aGUgQ0xJUEJPQVJEIHNlbGVjdGlvbi4gIChUaGlzIGVuYWJsZXNcbiAgICogICAgIHRoZSBzZWxlY3RUb0NsaXBib2FyZCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDIgIC0+IEVuYWJsZSBVcmdlbmN5IHdpbmRvdyBtYW5hZ2VyIGhpbnQgd2hlblxuICAgKiAgICAgQ29udHJvbC1HIGlzIHJlY2VpdmVkLiAgKFRoaXMgZW5hYmxlcyB0aGUgYmVsbElzVXJnZW50XG4gICAqICAgICByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDMgIC0+IEVuYWJsZSByYWlzaW5nIG9mIHRoZSB3aW5kb3cgd2hlbiBDb250cm9sLUdcbiAgICogICAgIGlzIHJlY2VpdmVkLiAgKGVuYWJsZXMgdGhlIHBvcE9uQmVsbCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDcgIC0+IFVzZSBBbHRlcm5hdGUgU2NyZWVuIEJ1ZmZlci4gIChUaGlzIG1heSBiZVxuICAgKiAgICAgZGlzYWJsZWQgYnkgdGhlIHRpdGVJbmhpYml0IHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDQgOCAgLT4gU2F2ZSBjdXJzb3IgYXMgaW4gREVDU0MuICAoVGhpcyBtYXkgYmUgZGlzLVxuICAgKiAgICAgYWJsZWQgYnkgdGhlIHRpdGVJbmhpYml0IHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDQgOSAgLT4gU2F2ZSBjdXJzb3IgYXMgaW4gREVDU0MgYW5kIHVzZSBBbHRlcm5hdGVcbiAgICogICAgIFNjcmVlbiBCdWZmZXIsIGNsZWFyaW5nIGl0IGZpcnN0LiAgKFRoaXMgbWF5IGJlIGRpc2FibGVkIGJ5XG4gICAqICAgICB0aGUgdGl0ZUluaGliaXQgcmVzb3VyY2UpLiAgVGhpcyBjb21iaW5lcyB0aGUgZWZmZWN0cyBvZiB0aGUgMVxuICAgKiAgICAgMCA0IDcgIGFuZCAxIDAgNCA4ICBtb2Rlcy4gIFVzZSB0aGlzIHdpdGggdGVybWluZm8tYmFzZWRcbiAgICogICAgIGFwcGxpY2F0aW9ucyByYXRoZXIgdGhhbiB0aGUgNCA3ICBtb2RlLlxuICAgKiAgICAgUHMgPSAxIDAgNSAwICAtPiBTZXQgdGVybWluZm8vdGVybWNhcCBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMSAgLT4gU2V0IFN1biBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMiAgLT4gU2V0IEhQIGZ1bmN0aW9uLWtleSBtb2RlLlxuICAgKiAgICAgUHMgPSAxIDAgNSAzICAtPiBTZXQgU0NPIGZ1bmN0aW9uLWtleSBtb2RlLlxuICAgKiAgICAgUHMgPSAxIDAgNiAwICAtPiBTZXQgbGVnYWN5IGtleWJvYXJkIGVtdWxhdGlvbiAoWDExUjYpLlxuICAgKiAgICAgUHMgPSAxIDAgNiAxICAtPiBTZXQgVlQyMjAga2V5Ym9hcmQgZW11bGF0aW9uLlxuICAgKiAgICAgUHMgPSAyIDAgMCA0ICAtPiBTZXQgYnJhY2tldGVkIHBhc3RlIG1vZGUuXG4gICAqIE1vZGVzOlxuICAgKiAgIGh0dHA6ICp2dDEwMC5uZXQvZG9jcy92dDIyMC1ybS9jaGFwdGVyNC5odG1sXG4gICAqXG4gICAqIEB2dDogI1BbU2VlIGJlbG93IGZvciBzdXBwb3J0ZWQgbW9kZXMuXSAgICBDU0kgREVDU0VUICBcIkRFQyBQcml2YXRlIFNldCBNb2RlXCIgXCJDU0kgPyBQbSBoXCIgIFwiU2V0IHZhcmlvdXMgdGVybWluYWwgYXR0cmlidXRlcy5cIlxuICAgKiBTdXBwb3J0ZWQgcGFyYW0gdmFsdWVzIGJ5IERFQ1NFVDpcbiAgICpcbiAgICogfCBwYXJhbSB8IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdXBwb3J0IHxcbiAgICogfCAtLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLXxcbiAgICogfCAxICAgICB8IEFwcGxpY2F0aW9uIEN1cnNvciBLZXlzIChERUNDS00pLiAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyICAgICB8IERlc2lnbmF0ZSBVUy1BU0NJSSBmb3IgY2hhcmFjdGVyIHNldHMgRzAtRzMgKERFQ0FOTSkuICAgfCAjWSAgICAgIHxcbiAgICogfCAzICAgICB8IDEzMiBDb2x1bW4gTW9kZSAoREVDQ09MTSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA2ICAgICB8IE9yaWdpbiBNb2RlIChERUNPTSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA3ICAgICB8IEF1dG8td3JhcCBNb2RlIChERUNBV00pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA4ICAgICB8IEF1dG8tcmVwZWF0IEtleXMgKERFQ0FSTSkuIEFsd2F5cyBvbi4gICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCA5ICAgICB8IFgxMCB4dGVybSBtb3VzZSBwcm90b2NvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMiAgICB8IFN0YXJ0IEJsaW5raW5nIEN1cnNvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyNSAgICB8IFNob3cgQ3Vyc29yIChERUNUQ0VNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0NSAgICB8IFJldmVyc2Ugd3JhcC1hcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0NyAgICB8IFVzZSBBbHRlcm5hdGUgU2NyZWVuIEJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA2NiAgICB8IEFwcGxpY2F0aW9uIGtleXBhZCAoREVDTktNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAwICB8IFgxMSB4dGVybSBtb3VzZSBwcm90b2NvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAyICB8IFVzZSBDZWxsIE1vdGlvbiBNb3VzZSBUcmFja2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAzICB8IFVzZSBBbGwgTW90aW9uIE1vdXNlIFRyYWNraW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDA0ICB8IFNlbmQgRm9jdXNJbi9Gb2N1c091dCBldmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDA1ICB8IEVuYWJsZSBVVEYtOCBNb3VzZSBNb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCAxMDA2ICB8IEVuYWJsZSBTR1IgTW91c2UgTW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDE1ICB8IEVuYWJsZSB1cnh2dCBNb3VzZSBNb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCAxMDE2ICB8IEVuYWJsZSBTR1ItUGl4ZWxzIE1vdXNlIE1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ3ICB8IFVzZSBBbHRlcm5hdGUgU2NyZWVuIEJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ4ICB8IFNhdmUgY3Vyc29yIGFzIGluIERFQ1NDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ5ICB8IFNhdmUgY3Vyc29yIGFuZCBzd2l0Y2ggdG8gYWx0ZXJuYXRlIGJ1ZmZlciBjbGVhcmluZyBpdC4gfCAjUFtEb2VzIG5vdCBjbGVhciB0aGUgYWx0ZXJuYXRlIGJ1ZmZlci5dIHxcbiAgICogfCAyMDA0ICB8IFNldCBicmFja2V0ZWQgcGFzdGUgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICpcbiAgICpcbiAgICogRklYTUU6IGltcGxlbWVudCBERUNTQ05NLCAxMDQ5IHNob3VsZCBjbGVhciBhbHRidWZmZXJcbiAgICovXG4gIHB1YmxpYyBzZXRNb2RlUHJpdmF0ZShwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgc3dpdGNoIChwYXJhbXMucGFyYW1zW2ldKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYXBwbGljYXRpb25DdXJzb3JLZXlzID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLnNldGdDaGFyc2V0KDAsIERFRkFVTFRfQ0hBUlNFVCk7XG4gICAgICAgICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoMSwgREVGQVVMVF9DSEFSU0VUKTtcbiAgICAgICAgICB0aGlzLl9jaGFyc2V0U2VydmljZS5zZXRnQ2hhcnNldCgyLCBERUZBVUxUX0NIQVJTRVQpO1xuICAgICAgICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLnNldGdDaGFyc2V0KDMsIERFRkFVTFRfQ0hBUlNFVCk7XG4gICAgICAgICAgLy8gc2V0IFZUMTAwIG1vZGUgaGVyZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogREVDQ09MTSAtIDEzMiBjb2x1bW4gbW9kZS5cbiAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgYWN0aXZlIGlmICdTZXRXaW5MaW5lcycgKDI0KSBpcyBlbmFibGVkXG4gICAgICAgICAgICogdGhyb3VnaCBgb3B0aW9ucy53aW5kb3dzT3B0aW9uc2AuXG4gICAgICAgICAgICovXG4gICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93T3B0aW9ucy5zZXRXaW5MaW5lcykge1xuICAgICAgICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5yZXNpemUoMTMyLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpO1xuICAgICAgICAgICAgdGhpcy5fb25SZXF1ZXN0UmVzZXQuZmlyZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5vcmlnaW4gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX3NldEN1cnNvcigwLCAwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy53cmFwYXJvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmN1cnNvckJsaW5rID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMucmV2ZXJzZVdyYXBhcm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY2OlxuICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1NlcmlhbCBwb3J0IHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBrZXlwYWQuJyk7XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uS2V5cGFkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmZpcmUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5OiAvLyBYMTAgTW91c2VcbiAgICAgICAgICAvLyBubyByZWxlYXNlLCBubyBtb3Rpb24sIG5vIHdoZWVsLCBubyBtb2RpZmllcnMuXG4gICAgICAgICAgdGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVQcm90b2NvbCA9ICdYMTAnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDA6IC8vIHZ0MjAwIG1vdXNlXG4gICAgICAgICAgLy8gbm8gbW90aW9uLlxuICAgICAgICAgIHRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2wgPSAnVlQyMDAnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDI6IC8vIGJ1dHRvbiBldmVudCBtb3VzZVxuICAgICAgICAgIHRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2wgPSAnRFJBRyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAwMzogLy8gYW55IGV2ZW50IG1vdXNlXG4gICAgICAgICAgLy8gYW55IGV2ZW50IC0gc2VuZHMgbW90aW9uIGV2ZW50cyxcbiAgICAgICAgICAvLyBldmVuIGlmIHRoZXJlIGlzIG5vIGJ1dHRvbiBoZWxkIGRvd24uXG4gICAgICAgICAgdGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVQcm90b2NvbCA9ICdBTlknO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDQ6IC8vIHNlbmQgZm9jdXNpbi9mb2N1c291dCBldmVudHNcbiAgICAgICAgICAvLyBmb2N1c2luOiBeW1tJXG4gICAgICAgICAgLy8gZm9jdXNvdXQ6IF5bW09cbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuc2VuZEZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9vblJlcXVlc3RTZW5kRm9jdXMuZmlyZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDU6IC8vIHV0ZjggZXh0IG1vZGUgbW91c2UgLSByZW1vdmVkIGluICMyNTA3XG4gICAgICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnREVDU0VUIDEwMDUgbm90IHN1cHBvcnRlZCAoc2VlICMyNTA3KScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDY6IC8vIHNnciBleHQgbW9kZSBtb3VzZVxuICAgICAgICAgIHRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlRW5jb2RpbmcgPSAnU0dSJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDE1OiAvLyB1cnh2dCBleHQgbW9kZSBtb3VzZSAtIHJlbW92ZWQgaW4gIzI1MDdcbiAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdERUNTRVQgMTAxNSBub3Qgc3VwcG9ydGVkIChzZWUgIzI1MDcpJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAxNjogLy8gc2dyIHBpeGVscyBtb2RlIG1vdXNlXG4gICAgICAgICAgdGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVFbmNvZGluZyA9ICdTR1JfUElYRUxTJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTogLy8gc2hvdyBjdXJzb3JcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwNDg6IC8vIGFsdCBzY3JlZW4gY3Vyc29yXG4gICAgICAgICAgdGhpcy5zYXZlQ3Vyc29yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTA0OTogLy8gYWx0IHNjcmVlbiBidWZmZXIgY3Vyc29yXG4gICAgICAgICAgdGhpcy5zYXZlQ3Vyc29yKCk7XG4gICAgICAgIC8vIEZBTEwtVEhST1VHSFxuICAgICAgICBjYXNlIDQ3OiAvLyBhbHQgc2NyZWVuIGJ1ZmZlclxuICAgICAgICBjYXNlIDEwNDc6IC8vIGFsdCBzY3JlZW4gYnVmZmVyXG4gICAgICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2YXRlQWx0QnVmZmVyKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSk7XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fb25SZXF1ZXN0UmVmcmVzaFJvd3MuZmlyZSgwLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxKTtcbiAgICAgICAgICB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmZpcmUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMDA0OiAvLyBicmFja2V0ZWQgcGFzdGUgbW9kZSAoaHR0cHM6Ly9jaXJ3LmluL2Jsb2cvYnJhY2tldGVkLXBhc3RlKVxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5icmFja2V0ZWRQYXN0ZU1vZGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIENTSSBQbSBsICBSZXNldCBNb2RlIChSTSkuXG4gICAqICAgICBQcyA9IDIgIC0+IEtleWJvYXJkIEFjdGlvbiBNb2RlIChBTSkuXG4gICAqICAgICBQcyA9IDQgIC0+IFJlcGxhY2UgTW9kZSAoSVJNKS5cbiAgICogICAgIFBzID0gMSAyICAtPiBTZW5kL3JlY2VpdmUgKFNSTSkuXG4gICAqICAgICBQcyA9IDIgMCAgLT4gTm9ybWFsIExpbmVmZWVkIChMTk0pLlxuICAgKlxuICAgKiBAdnQ6ICNQW09ubHkgSVJNIGlzIHN1cHBvcnRlZC5dICAgIENTSSBSTSAgICBcIlJlc2V0IE1vZGVcIiAgXCJDU0kgUG0gbFwiICBcIlNldCB2YXJpb3VzIHRlcm1pbmFsIGF0dHJpYnV0ZXMuXCJcbiAgICogU3VwcG9ydGVkIHBhcmFtIHZhbHVlcyBieSBSTTpcbiAgICpcbiAgICogfCBQYXJhbSB8IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3VwcG9ydCB8XG4gICAqIHwgLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0gfFxuICAgKiB8IDIgICAgIHwgS2V5Ym9hcmQgQWN0aW9uIE1vZGUgKEtBTSkuIEFsd2F5cyBvbi4gfCAjTiAgICAgIHxcbiAgICogfCA0ICAgICB8IFJlcGxhY2UgTW9kZSAoSVJNKS4gKGRlZmF1bHQpICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTIgICAgfCBTZW5kL3JlY2VpdmUgKFNSTSkuIEFsd2F5cyBvZmYuICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDIwICAgIHwgTm9ybWFsIExpbmVmZWVkIChMTk0pLiAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICpcbiAgICpcbiAgICogRklYTUU6IHdoeSBpcyBMTk0gY29tbWVudGVkIG91dD9cbiAgICovXG4gIHB1YmxpYyByZXNldE1vZGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHN3aXRjaCAocGFyYW1zLnBhcmFtc1tpXSkge1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UubW9kZXMuaW5zZXJ0TW9kZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMuY29udmVydEVvbCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgPyBQbSBsXG4gICAqICAgREVDIFByaXZhdGUgTW9kZSBSZXNldCAoREVDUlNUKS5cbiAgICogICAgIFBzID0gMSAgLT4gTm9ybWFsIEN1cnNvciBLZXlzIChERUNDS00pLlxuICAgKiAgICAgUHMgPSAyICAtPiBEZXNpZ25hdGUgVlQ1MiBtb2RlIChERUNBTk0pLlxuICAgKiAgICAgUHMgPSAzICAtPiA4MCBDb2x1bW4gTW9kZSAoREVDQ09MTSkuXG4gICAqICAgICBQcyA9IDQgIC0+IEp1bXAgKEZhc3QpIFNjcm9sbCAoREVDU0NMTSkuXG4gICAqICAgICBQcyA9IDUgIC0+IE5vcm1hbCBWaWRlbyAoREVDU0NOTSkuXG4gICAqICAgICBQcyA9IDYgIC0+IE5vcm1hbCBDdXJzb3IgTW9kZSAoREVDT00pLlxuICAgKiAgICAgUHMgPSA3ICAtPiBObyBXcmFwYXJvdW5kIE1vZGUgKERFQ0FXTSkuXG4gICAqICAgICBQcyA9IDggIC0+IE5vIEF1dG8tcmVwZWF0IEtleXMgKERFQ0FSTSkuXG4gICAqICAgICBQcyA9IDkgIC0+IERvbid0IHNlbmQgTW91c2UgWCAmIFkgb24gYnV0dG9uIHByZXNzLlxuICAgKiAgICAgUHMgPSAxIDAgIC0+IEhpZGUgdG9vbGJhciAocnh2dCkuXG4gICAqICAgICBQcyA9IDEgMiAgLT4gU3RvcCBCbGlua2luZyBDdXJzb3IgKGF0dDYxMCkuXG4gICAqICAgICBQcyA9IDEgOCAgLT4gRG9uJ3QgcHJpbnQgZm9ybSBmZWVkIChERUNQRkYpLlxuICAgKiAgICAgUHMgPSAxIDkgIC0+IExpbWl0IHByaW50IHRvIHNjcm9sbGluZyByZWdpb24gKERFQ1BFWCkuXG4gICAqICAgICBQcyA9IDIgNSAgLT4gSGlkZSBDdXJzb3IgKERFQ1RDRU0pLlxuICAgKiAgICAgUHMgPSAzIDAgIC0+IERvbid0IHNob3cgc2Nyb2xsYmFyIChyeHZ0KS5cbiAgICogICAgIFBzID0gMyA1ICAtPiBEaXNhYmxlIGZvbnQtc2hpZnRpbmcgZnVuY3Rpb25zIChyeHZ0KS5cbiAgICogICAgIFBzID0gNCAwICAtPiBEaXNhbGxvdyA4MCAtPiAxMzIgTW9kZS5cbiAgICogICAgIFBzID0gNCAxICAtPiBObyBtb3JlKDEpIGZpeCAoc2VlIGN1cnNlcyByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDQgMiAgLT4gRGlzYWJsZSBOYXRpb24gUmVwbGFjZW1lbnQgQ2hhcmFjdGVyIHNldHMgKERFQy1cbiAgICogICAgIE5SQ00pLlxuICAgKiAgICAgUHMgPSA0IDQgIC0+IFR1cm4gT2ZmIE1hcmdpbiBCZWxsLlxuICAgKiAgICAgUHMgPSA0IDUgIC0+IE5vIFJldmVyc2Utd3JhcGFyb3VuZCBNb2RlLlxuICAgKiAgICAgUHMgPSA0IDYgIC0+IFN0b3AgTG9nZ2luZy4gIChUaGlzIGlzIG5vcm1hbGx5IGRpc2FibGVkIGJ5IGFcbiAgICogICAgIGNvbXBpbGUtdGltZSBvcHRpb24pLlxuICAgKiAgICAgUHMgPSA0IDcgIC0+IFVzZSBOb3JtYWwgU2NyZWVuIEJ1ZmZlci5cbiAgICogICAgIFBzID0gNiA2ICAtPiBOdW1lcmljIGtleXBhZCAoREVDTktNKS5cbiAgICogICAgIFBzID0gNiA3ICAtPiBCYWNrYXJyb3cga2V5IHNlbmRzIGRlbGV0ZSAoREVDQktNKS5cbiAgICogICAgIFBzID0gMSAwIDAgMCAgLT4gRG9uJ3Qgc2VuZCBNb3VzZSBYICYgWSBvbiBidXR0b24gcHJlc3MgYW5kXG4gICAqICAgICByZWxlYXNlLiAgU2VlIHRoZSBzZWN0aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCAxICAtPiBEb24ndCB1c2UgSGlsaXRlIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCAyICAtPiBEb24ndCB1c2UgQ2VsbCBNb3Rpb24gTW91c2UgVHJhY2tpbmcuXG4gICAqICAgICBQcyA9IDEgMCAwIDMgIC0+IERvbid0IHVzZSBBbGwgTW90aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCA0ICAtPiBEb24ndCBzZW5kIEZvY3VzSW4vRm9jdXNPdXQgZXZlbnRzLlxuICAgKiAgICAgUHMgPSAxIDAgMCA1ICAtPiBEaXNhYmxlIEV4dGVuZGVkIE1vdXNlIE1vZGUuXG4gICAqICAgICBQcyA9IDEgMCAxIDAgIC0+IERvbid0IHNjcm9sbCB0byBib3R0b20gb24gdHR5IG91dHB1dFxuICAgKiAgICAgKHJ4dnQpLlxuICAgKiAgICAgUHMgPSAxIDAgMSAxICAtPiBEb24ndCBzY3JvbGwgdG8gYm90dG9tIG9uIGtleSBwcmVzcyAocnh2dCkuXG4gICAqICAgICBQcyA9IDEgMCAzIDQgIC0+IERvbid0IGludGVycHJldCBcIm1ldGFcIiBrZXkuICAoVGhpcyBkaXNhYmxlc1xuICAgKiAgICAgdGhlIGVpZ2h0Qml0SW5wdXQgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgMyA1ICAtPiBEaXNhYmxlIHNwZWNpYWwgbW9kaWZpZXJzIGZvciBBbHQgYW5kIE51bS1cbiAgICogICAgIExvY2sga2V5cy4gIChUaGlzIGRpc2FibGVzIHRoZSBudW1Mb2NrIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDMgNiAgLT4gRG9uJ3Qgc2VuZCBFU0MgIHdoZW4gTWV0YSBtb2RpZmllcyBhIGtleS5cbiAgICogICAgIChUaGlzIGRpc2FibGVzIHRoZSBtZXRhU2VuZHNFc2NhcGUgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgMyA3ICAtPiBTZW5kIFZUMjIwIFJlbW92ZSBmcm9tIHRoZSBlZGl0aW5nLWtleXBhZFxuICAgKiAgICAgRGVsZXRlIGtleS5cbiAgICogICAgIFBzID0gMSAwIDMgOSAgLT4gRG9uJ3Qgc2VuZCBFU0MgIHdoZW4gQWx0IG1vZGlmaWVzIGEga2V5LlxuICAgKiAgICAgKFRoaXMgZGlzYWJsZXMgdGhlIGFsdFNlbmRzRXNjYXBlIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDQgMCAgLT4gRG8gbm90IGtlZXAgc2VsZWN0aW9uIHdoZW4gbm90IGhpZ2hsaWdodGVkLlxuICAgKiAgICAgKFRoaXMgZGlzYWJsZXMgdGhlIGtlZXBTZWxlY3Rpb24gcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCAxICAtPiBVc2UgdGhlIFBSSU1BUlkgc2VsZWN0aW9uLiAgKFRoaXMgZGlzYWJsZXNcbiAgICogICAgIHRoZSBzZWxlY3RUb0NsaXBib2FyZCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDIgIC0+IERpc2FibGUgVXJnZW5jeSB3aW5kb3cgbWFuYWdlciBoaW50IHdoZW5cbiAgICogICAgIENvbnRyb2wtRyBpcyByZWNlaXZlZC4gIChUaGlzIGRpc2FibGVzIHRoZSBiZWxsSXNVcmdlbnRcbiAgICogICAgIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDQgMyAgLT4gRGlzYWJsZSByYWlzaW5nIG9mIHRoZSB3aW5kb3cgd2hlbiBDb250cm9sLVxuICAgKiAgICAgRyBpcyByZWNlaXZlZC4gIChUaGlzIGRpc2FibGVzIHRoZSBwb3BPbkJlbGwgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCA3ICAtPiBVc2UgTm9ybWFsIFNjcmVlbiBCdWZmZXIsIGNsZWFyaW5nIHNjcmVlblxuICAgKiAgICAgZmlyc3QgaWYgaW4gdGhlIEFsdGVybmF0ZSBTY3JlZW4uICAoVGhpcyBtYXkgYmUgZGlzYWJsZWQgYnlcbiAgICogICAgIHRoZSB0aXRlSW5oaWJpdCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDggIC0+IFJlc3RvcmUgY3Vyc29yIGFzIGluIERFQ1JDLiAgKFRoaXMgbWF5IGJlXG4gICAqICAgICBkaXNhYmxlZCBieSB0aGUgdGl0ZUluaGliaXQgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCA5ICAtPiBVc2UgTm9ybWFsIFNjcmVlbiBCdWZmZXIgYW5kIHJlc3RvcmUgY3Vyc29yXG4gICAqICAgICBhcyBpbiBERUNSQy4gIChUaGlzIG1heSBiZSBkaXNhYmxlZCBieSB0aGUgdGl0ZUluaGliaXRcbiAgICogICAgIHJlc291cmNlKS4gIFRoaXMgY29tYmluZXMgdGhlIGVmZmVjdHMgb2YgdGhlIDEgMCA0IDcgIGFuZCAxIDBcbiAgICogICAgIDQgOCAgbW9kZXMuICBVc2UgdGhpcyB3aXRoIHRlcm1pbmZvLWJhc2VkIGFwcGxpY2F0aW9ucyByYXRoZXJcbiAgICogICAgIHRoYW4gdGhlIDQgNyAgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMCAgLT4gUmVzZXQgdGVybWluZm8vdGVybWNhcCBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMSAgLT4gUmVzZXQgU3VuIGZ1bmN0aW9uLWtleSBtb2RlLlxuICAgKiAgICAgUHMgPSAxIDAgNSAyICAtPiBSZXNldCBIUCBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMyAgLT4gUmVzZXQgU0NPIGZ1bmN0aW9uLWtleSBtb2RlLlxuICAgKiAgICAgUHMgPSAxIDAgNiAwICAtPiBSZXNldCBsZWdhY3kga2V5Ym9hcmQgZW11bGF0aW9uIChYMTFSNikuXG4gICAqICAgICBQcyA9IDEgMCA2IDEgIC0+IFJlc2V0IGtleWJvYXJkIGVtdWxhdGlvbiB0byBTdW4vUEMgc3R5bGUuXG4gICAqICAgICBQcyA9IDIgMCAwIDQgIC0+IFJlc2V0IGJyYWNrZXRlZCBwYXN0ZSBtb2RlLlxuICAgKlxuICAgKiBAdnQ6ICNQW1NlZSBiZWxvdyBmb3Igc3VwcG9ydGVkIG1vZGVzLl0gICAgQ1NJIERFQ1JTVCAgXCJERUMgUHJpdmF0ZSBSZXNldCBNb2RlXCIgXCJDU0kgPyBQbSBsXCIgIFwiUmVzZXQgdmFyaW91cyB0ZXJtaW5hbCBhdHRyaWJ1dGVzLlwiXG4gICAqIFN1cHBvcnRlZCBwYXJhbSB2YWx1ZXMgYnkgREVDUlNUOlxuICAgKlxuICAgKiB8IHBhcmFtIHwgQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN1cHBvcnQgfFxuICAgKiB8IC0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0gfFxuICAgKiB8IDEgICAgIHwgTm9ybWFsIEN1cnNvciBLZXlzIChERUNDS00pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDIgICAgIHwgRGVzaWduYXRlIFZUNTIgbW9kZSAoREVDQU5NKS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDMgICAgIHwgODAgQ29sdW1uIE1vZGUgKERFQ0NPTE0pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNCW1N3aXRjaGVzIHRvIG9sZCBjb2x1bW4gd2lkdGggaW5zdGVhZCBvZiA4MC5dIHxcbiAgICogfCA2ICAgICB8IE5vcm1hbCBDdXJzb3IgTW9kZSAoREVDT00pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA3ICAgICB8IE5vIFdyYXBhcm91bmQgTW9kZSAoREVDQVdNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA4ICAgICB8IE5vIEF1dG8tcmVwZWF0IEtleXMgKERFQ0FSTSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCA5ICAgICB8IERvbid0IHNlbmQgTW91c2UgWCAmIFkgb24gYnV0dG9uIHByZXNzLiAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMiAgICB8IFN0b3AgQmxpbmtpbmcgQ3Vyc29yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyNSAgICB8IEhpZGUgQ3Vyc29yIChERUNUQ0VNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0NSAgICB8IE5vIHJldmVyc2Ugd3JhcC1hcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0NyAgICB8IFVzZSBOb3JtYWwgU2NyZWVuIEJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA2NiAgICB8IE51bWVyaWMga2V5cGFkIChERUNOS00pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAwICB8IERvbid0IHNlbmQgTW91c2UgcmVwb3J0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAyICB8IERvbid0IHVzZSBDZWxsIE1vdGlvbiBNb3VzZSBUcmFja2luZy4gICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAzICB8IERvbid0IHVzZSBBbGwgTW90aW9uIE1vdXNlIFRyYWNraW5nLiAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDA0ICB8IERvbid0IHNlbmQgRm9jdXNJbi9Gb2N1c091dCBldmVudHMuICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDA1ICB8IERpc2FibGUgVVRGLTggTW91c2UgTW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCAxMDA2ICB8IERpc2FibGUgU0dSIE1vdXNlIE1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDE1ICB8IERpc2FibGUgdXJ4dnQgTW91c2UgTW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCAxMDE2ICB8IERpc2FibGUgU0dSLVBpeGVscyBNb3VzZSBNb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ3ICB8IFVzZSBOb3JtYWwgU2NyZWVuIEJ1ZmZlciAoY2xlYXJpbmcgc2NyZWVuIGlmIGluIGFsdCkuICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ4ICB8IFJlc3RvcmUgY3Vyc29yIGFzIGluIERFQ1JDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ5ICB8IFVzZSBOb3JtYWwgU2NyZWVuIEJ1ZmZlciBhbmQgcmVzdG9yZSBjdXJzb3IuICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyMDA0ICB8IFJlc2V0IGJyYWNrZXRlZCBwYXN0ZSBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICpcbiAgICpcbiAgICogRklYTUU6IERFQ0NPTE0gaXMgY3VycmVudGx5IGJyb2tlbiAoYWxyZWFkeSBmaXhlZCBpbiB3aW5kb3cgb3B0aW9ucyBQUilcbiAgICovXG4gIHB1YmxpYyByZXNldE1vZGVQcml2YXRlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzd2l0Y2ggKHBhcmFtcy5wYXJhbXNbaV0pIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbkN1cnNvcktleXMgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIERFQ0NPTE0gLSA4MCBjb2x1bW4gbW9kZS5cbiAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgYWN0aXZlIGlmICdTZXRXaW5MaW5lcycgKDI0KSBpcyBlbmFibGVkXG4gICAgICAgICAgICogdGhyb3VnaCBgb3B0aW9ucy53aW5kb3dzT3B0aW9uc2AuXG4gICAgICAgICAgICovXG4gICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93T3B0aW9ucy5zZXRXaW5MaW5lcykge1xuICAgICAgICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5yZXNpemUoODAsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyk7XG4gICAgICAgICAgICB0aGlzLl9vblJlcXVlc3RSZXNldC5maXJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLm9yaWdpbiA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX3NldEN1cnNvcigwLCAwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy53cmFwYXJvdW5kID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jdXJzb3JCbGluayA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ1OlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5yZXZlcnNlV3JhcGFyb3VuZCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY2OlxuICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1N3aXRjaGluZyBiYWNrIHRvIG5vcm1hbCBrZXlwYWQuJyk7XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uS2V5cGFkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTogLy8gWDEwIE1vdXNlXG4gICAgICAgIGNhc2UgMTAwMDogLy8gdnQyMDAgbW91c2VcbiAgICAgICAgY2FzZSAxMDAyOiAvLyBidXR0b24gZXZlbnQgbW91c2VcbiAgICAgICAgY2FzZSAxMDAzOiAvLyBhbnkgZXZlbnQgbW91c2VcbiAgICAgICAgICB0aGlzLl9jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZVByb3RvY29sID0gJ05PTkUnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDQ6IC8vIHNlbmQgZm9jdXNpbi9mb2N1c291dCBldmVudHNcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuc2VuZEZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAwNTogLy8gdXRmOCBleHQgbW9kZSBtb3VzZSAtIHJlbW92ZWQgaW4gIzI1MDdcbiAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdERUNSU1QgMTAwNSBub3Qgc3VwcG9ydGVkIChzZWUgIzI1MDcpJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAwNjogLy8gc2dyIGV4dCBtb2RlIG1vdXNlXG4gICAgICAgICAgdGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVFbmNvZGluZyA9ICdERUZBVUxUJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDE1OiAvLyB1cnh2dCBleHQgbW9kZSBtb3VzZSAtIHJlbW92ZWQgaW4gIzI1MDdcbiAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdERUNSU1QgMTAxNSBub3Qgc3VwcG9ydGVkIChzZWUgIzI1MDcpJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAxNjogLy8gc2dyIHBpeGVscyBtb2RlIG1vdXNlXG4gICAgICAgICAgdGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVFbmNvZGluZyA9ICdERUZBVUxUJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTogLy8gaGlkZSBjdXJzb3JcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTA0ODogLy8gYWx0IHNjcmVlbiBjdXJzb3JcbiAgICAgICAgICB0aGlzLnJlc3RvcmVDdXJzb3IoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDQ5OiAvLyBhbHQgc2NyZWVuIGJ1ZmZlciBjdXJzb3JcbiAgICAgICAgLy8gRkFMTC1USFJPVUdIXG4gICAgICAgIGNhc2UgNDc6IC8vIG5vcm1hbCBzY3JlZW4gYnVmZmVyXG4gICAgICAgIGNhc2UgMTA0NzogLy8gbm9ybWFsIHNjcmVlbiBidWZmZXIgLSBjbGVhcmluZyBpdCBmaXJzdFxuICAgICAgICAgIC8vIEVuc3VyZSB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgaGFzIHRoZSBjb3JyZWN0IGJ1ZmZlclxuICAgICAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmF0ZU5vcm1hbEJ1ZmZlcigpO1xuICAgICAgICAgIGlmIChwYXJhbXMucGFyYW1zW2ldID09PSAxMDQ5KSB7XG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVDdXJzb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fb25SZXF1ZXN0UmVmcmVzaFJvd3MuZmlyZSgwLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxKTtcbiAgICAgICAgICB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmZpcmUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMDA0OiAvLyBicmFja2V0ZWQgcGFzdGUgbW9kZSAoaHR0cHM6Ly9jaXJ3LmluL2Jsb2cvYnJhY2tldGVkLXBhc3RlKVxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5icmFja2V0ZWRQYXN0ZU1vZGUgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzICQgcCBSZXF1ZXN0IEFOU0kgTW9kZSAoREVDUlFNKS5cbiAgICpcbiAgICogUmVwb3J0cyBDU0kgUHM7IFBtICQgeSAoREVDUlBNKSwgd2hlcmUgUHMgaXMgdGhlIG1vZGUgbnVtYmVyIGFzIGluIFNNL1JNLFxuICAgKiBhbmQgUG0gaXMgdGhlIG1vZGUgdmFsdWU6XG4gICAqICAgIDAgLSBub3QgcmVjb2duaXplZFxuICAgKiAgICAxIC0gc2V0XG4gICAqICAgIDIgLSByZXNldFxuICAgKiAgICAzIC0gcGVybWFuZW50bHkgc2V0XG4gICAqICAgIDQgLSBwZXJtYW5lbnRseSByZXNldFxuICAgKlxuICAgKiBAdnQ6ICNZICBDU0kgICBERUNSUU0gIFwiUmVxdWVzdCBNb2RlXCIgIFwiQ1NJIFBzICRwXCIgIFwiUmVxdWVzdCBtb2RlIHN0YXRlLlwiXG4gICAqIFJldHVybnMgYSByZXBvcnQgYXMgYENTSSBQczsgUG0gJCB5YCAoREVDUlBNKSwgd2hlcmUgYFBzYCBpcyB0aGUgbW9kZSBudW1iZXIgYXMgaW4gU00vUk1cbiAgICogb3IgREVDU0VUL0RFQ1JTVCwgYW5kIGBQbWAgaXMgdGhlIG1vZGUgdmFsdWU6XG4gICAqIC0gMDogbm90IHJlY29nbml6ZWRcbiAgICogLSAxOiBzZXRcbiAgICogLSAyOiByZXNldFxuICAgKiAtIDM6IHBlcm1hbmVudGx5IHNldFxuICAgKiAtIDQ6IHBlcm1hbmVudGx5IHJlc2V0XG4gICAqXG4gICAqIEZvciBtb2RlcyBub3QgdW5kZXJzdG9vZCB4dGVybS5qcyBhbHdheXMgcmV0dXJucyBgbm90UmVjb2duaXplZGAuIEluIGdlbmVyYWwgdGhpcyBtZWFucyxcbiAgICogdGhhdCBhIGNlcnRhaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IGltcGxlbWVudGVkIGFuZCBjYW5ub3QgYmUgdXNlZC5cbiAgICpcbiAgICogTW9kZXMgY2hhbmdpbmcgdGhlIGFjdGl2ZSB0ZXJtaW5hbCBidWZmZXIgKDQ3LCAxMDQ3LCAxMDQ5KSBhcmUgbm90IHN1YnF1ZXJpZWRcbiAgICogYW5kIG9ubHkgcmVwb3J0LCB3aGV0aGVyIHRoZSBhbHRlcm5hdGUgYnVmZmVyIGlzIHNldC5cbiAgICpcbiAgICogTW91c2UgZW5jb2RpbmdzIGFuZCBtb3VzZSBwcm90b2NvbHMgYXJlIGhhbmRsZWQgbXV0dWFsIGV4Y2x1c2l2ZSxcbiAgICogdGh1cyBvbmx5IG9uZSBvZiBlYWNoIG9mIHRob3NlIGNhbiBiZSBzZXQgYXQgYSBnaXZlbiB0aW1lLlxuICAgKlxuICAgKiBUaGVyZSBpcyBhIGNoYW5jZSwgdGhhdCBzb21lIG1vZGUgcmVwb3J0cyBhcmUgbm90IGZ1bGx5IGluIGxpbmUgd2l0aCB4dGVybS5qcycgYmVoYXZpb3IsXG4gICAqIGUuZy4gaWYgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxyZWFkeSBleHBvc2VzIGEgY2VydGFpbiBiZWhhdmlvci4gSWYgeW91IGZpbmRcbiAgICogZGlzY3JlcGFuY2llcyBpbiB0aGUgbW9kZSByZXBvcnRzLCBwbGVhc2UgZmlsZSBhIGJ1Zy5cbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0TW9kZShwYXJhbXM6IElQYXJhbXMsIGFuc2k6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAvLyByZXR1cm4gdmFsdWUgYXMgaW4gREVDUlBNXG4gICAgY29uc3QgZW51bSBWIHtcbiAgICAgIE5PVF9SRUNPR05JWkVEID0gMCxcbiAgICAgIFNFVCA9IDEsXG4gICAgICBSRVNFVCA9IDIsXG4gICAgICBQRVJNQU5FTlRMWV9TRVQgPSAzLFxuICAgICAgUEVSTUFORU5UTFlfUkVTRVQgPSA0XG4gICAgfVxuXG4gICAgLy8gYWNjZXNzIGhlbHBlcnNcbiAgICBjb25zdCBkbSA9IHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2RlcztcbiAgICBjb25zdCB7IGFjdGl2ZVByb3RvY29sOiBtb3VzZVByb3RvY29sLCBhY3RpdmVFbmNvZGluZzogbW91c2VFbmNvZGluZyB9ID0gdGhpcy5fY29yZU1vdXNlU2VydmljZTtcbiAgICBjb25zdCBjcyA9IHRoaXMuX2NvcmVTZXJ2aWNlO1xuICAgIGNvbnN0IHsgYnVmZmVycywgY29scyB9ID0gdGhpcy5fYnVmZmVyU2VydmljZTtcbiAgICBjb25zdCB7IGFjdGl2ZSwgYWx0IH0gPSBidWZmZXJzO1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zO1xuXG4gICAgY29uc3QgZiA9IChtOiBudW1iZXIsIHY6IFYpOiBib29sZWFuID0+IHtcbiAgICAgIGNzLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfVske2Fuc2kgPyAnJyA6ICc/J30ke219OyR7dn0keWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBjb25zdCBiMnYgPSAodmFsdWU6IGJvb2xlYW4pOiBWID0+IHZhbHVlID8gVi5TRVQgOiBWLlJFU0VUO1xuXG4gICAgY29uc3QgcCA9IHBhcmFtcy5wYXJhbXNbMF07XG5cbiAgICBpZiAoYW5zaSkge1xuICAgICAgaWYgKHAgPT09IDIpIHJldHVybiBmKHAsIFYuUEVSTUFORU5UTFlfUkVTRVQpO1xuICAgICAgaWYgKHAgPT09IDQpIHJldHVybiBmKHAsIGIydihjcy5tb2Rlcy5pbnNlcnRNb2RlKSk7XG4gICAgICBpZiAocCA9PT0gMTIpIHJldHVybiBmKHAsIFYuUEVSTUFORU5UTFlfU0VUKTtcbiAgICAgIGlmIChwID09PSAyMCkgcmV0dXJuIGYocCwgYjJ2KG9wdHMuY29udmVydEVvbCkpO1xuICAgICAgcmV0dXJuIGYocCwgVi5OT1RfUkVDT0dOSVpFRCk7XG4gICAgfVxuXG4gICAgaWYgKHAgPT09IDEpIHJldHVybiBmKHAsIGIydihkbS5hcHBsaWNhdGlvbkN1cnNvcktleXMpKTtcbiAgICBpZiAocCA9PT0gMykgcmV0dXJuIGYocCwgb3B0cy53aW5kb3dPcHRpb25zLnNldFdpbkxpbmVzID8gKGNvbHMgPT09IDgwID8gVi5SRVNFVCA6IGNvbHMgPT09IDEzMiA/IFYuU0VUIDogVi5OT1RfUkVDT0dOSVpFRCkgOiBWLk5PVF9SRUNPR05JWkVEKTtcbiAgICBpZiAocCA9PT0gNikgcmV0dXJuIGYocCwgYjJ2KGRtLm9yaWdpbikpO1xuICAgIGlmIChwID09PSA3KSByZXR1cm4gZihwLCBiMnYoZG0ud3JhcGFyb3VuZCkpO1xuICAgIGlmIChwID09PSA4KSByZXR1cm4gZihwLCBWLlBFUk1BTkVOVExZX1NFVCk7XG4gICAgaWYgKHAgPT09IDkpIHJldHVybiBmKHAsIGIydihtb3VzZVByb3RvY29sID09PSAnWDEwJykpO1xuICAgIGlmIChwID09PSAxMikgcmV0dXJuIGYocCwgYjJ2KG9wdHMuY3Vyc29yQmxpbmspKTtcbiAgICBpZiAocCA9PT0gMjUpIHJldHVybiBmKHAsIGIydighY3MuaXNDdXJzb3JIaWRkZW4pKTtcbiAgICBpZiAocCA9PT0gNDUpIHJldHVybiBmKHAsIGIydihkbS5yZXZlcnNlV3JhcGFyb3VuZCkpO1xuICAgIGlmIChwID09PSA2NikgcmV0dXJuIGYocCwgYjJ2KGRtLmFwcGxpY2F0aW9uS2V5cGFkKSk7XG4gICAgaWYgKHAgPT09IDY3KSByZXR1cm4gZihwLCBWLlBFUk1BTkVOVExZX1JFU0VUKTtcbiAgICBpZiAocCA9PT0gMTAwMCkgcmV0dXJuIGYocCwgYjJ2KG1vdXNlUHJvdG9jb2wgPT09ICdWVDIwMCcpKTtcbiAgICBpZiAocCA9PT0gMTAwMikgcmV0dXJuIGYocCwgYjJ2KG1vdXNlUHJvdG9jb2wgPT09ICdEUkFHJykpO1xuICAgIGlmIChwID09PSAxMDAzKSByZXR1cm4gZihwLCBiMnYobW91c2VQcm90b2NvbCA9PT0gJ0FOWScpKTtcbiAgICBpZiAocCA9PT0gMTAwNCkgcmV0dXJuIGYocCwgYjJ2KGRtLnNlbmRGb2N1cykpO1xuICAgIGlmIChwID09PSAxMDA1KSByZXR1cm4gZihwLCBWLlBFUk1BTkVOVExZX1JFU0VUKTtcbiAgICBpZiAocCA9PT0gMTAwNikgcmV0dXJuIGYocCwgYjJ2KG1vdXNlRW5jb2RpbmcgPT09ICdTR1InKSk7XG4gICAgaWYgKHAgPT09IDEwMTUpIHJldHVybiBmKHAsIFYuUEVSTUFORU5UTFlfUkVTRVQpO1xuICAgIGlmIChwID09PSAxMDE2KSByZXR1cm4gZihwLCBiMnYobW91c2VFbmNvZGluZyA9PT0gJ1NHUl9QSVhFTFMnKSk7XG4gICAgaWYgKHAgPT09IDEwNDgpIHJldHVybiBmKHAsIFYuU0VUKTsgLy8geHRlcm0gYWx3YXlzIHJldHVybnMgU0VUIGhlcmVcbiAgICBpZiAocCA9PT0gNDcgfHwgcCA9PT0gMTA0NyB8fCBwID09PSAxMDQ5KSByZXR1cm4gZihwLCBiMnYoYWN0aXZlID09PSBhbHQpKTtcbiAgICBpZiAocCA9PT0gMjAwNCkgcmV0dXJuIGYocCwgYjJ2KGRtLmJyYWNrZXRlZFBhc3RlTW9kZSkpO1xuICAgIHJldHVybiBmKHAsIFYuTk9UX1JFQ09HTklaRUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byB3cml0ZSBjb2xvciBpbmZvcm1hdGlvbiBwYWNrZWQgd2l0aCBjb2xvciBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlQXR0ckNvbG9yKGNvbG9yOiBudW1iZXIsIG1vZGU6IG51bWJlciwgYzE6IG51bWJlciwgYzI6IG51bWJlciwgYzM6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKG1vZGUgPT09IDIpIHtcbiAgICAgIGNvbG9yIHw9IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgY29sb3IgJj0gfkF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICBjb2xvciB8PSBBdHRyaWJ1dGVEYXRhLmZyb21Db2xvclJHQihbYzEsIGMyLCBjM10pO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gNSkge1xuICAgICAgY29sb3IgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLKTtcbiAgICAgIGNvbG9yIHw9IEF0dHJpYnV0ZXMuQ01fUDI1NiB8IChjMSAmIDB4ZmYpO1xuICAgIH1cbiAgICByZXR1cm4gY29sb3I7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGV4dHJhY3QgYW5kIGFwcGx5IGNvbG9yIHBhcmFtcy9zdWJwYXJhbXMuXG4gICAqIFJldHVybnMgYWR2YW5jZSBmb3IgcGFyYW1zIGluZGV4LlxuICAgKi9cbiAgcHJpdmF0ZSBfZXh0cmFjdENvbG9yKHBhcmFtczogSVBhcmFtcywgcG9zOiBudW1iZXIsIGF0dHI6IElBdHRyaWJ1dGVEYXRhKTogbnVtYmVyIHtcbiAgICAvLyBub3JtYWxpemUgcGFyYW1zXG4gICAgLy8gbWVhbmluZzogW3RhcmdldCwgQ00sIGlnbiwgdmFsLCB2YWwsIHZhbF1cbiAgICAvLyBSR0IgICAgOiBbIDM4LzQ4LCAgMiwgaWduLCAgIHIsICAgZywgICBiXVxuICAgIC8vIFAyNTYgICA6IFsgMzgvNDgsICA1LCBpZ24sICAgdiwgaWduLCBpZ25dXG4gICAgY29uc3QgYWNjdSA9IFswLCAwLCAtMSwgMCwgMCwgMF07XG5cbiAgICAvLyBhbGlnbm1lbnQgcGxhY2Vob2xkZXIgZm9yIG5vbiBjb2xvciBzcGFjZSBzZXF1ZW5jZXNcbiAgICBsZXQgY1NwYWNlID0gMDtcblxuICAgIC8vIHJldHVybiBhZHZhbmNlIHdlIHRvb2sgaW4gcGFyYW1zXG4gICAgbGV0IGFkdmFuY2UgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgYWNjdVthZHZhbmNlICsgY1NwYWNlXSA9IHBhcmFtcy5wYXJhbXNbcG9zICsgYWR2YW5jZV07XG4gICAgICBpZiAocGFyYW1zLmhhc1N1YlBhcmFtcyhwb3MgKyBhZHZhbmNlKSkge1xuICAgICAgICBjb25zdCBzdWJwYXJhbXMgPSBwYXJhbXMuZ2V0U3ViUGFyYW1zKHBvcyArIGFkdmFuY2UpITtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgaWYgKGFjY3VbMV0gPT09IDUpIHtcbiAgICAgICAgICAgIGNTcGFjZSA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjY3VbYWR2YW5jZSArIGkgKyAxICsgY1NwYWNlXSA9IHN1YnBhcmFtc1tpXTtcbiAgICAgICAgfSB3aGlsZSAoKytpIDwgc3VicGFyYW1zLmxlbmd0aCAmJiBpICsgYWR2YW5jZSArIDEgKyBjU3BhY2UgPCBhY2N1Lmxlbmd0aCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gZXhpdCBlYXJseSBpZiBjYW4gZGVjaWRlIGNvbG9yIG1vZGUgd2l0aCBzZW1pY29sb25zXG4gICAgICBpZiAoKGFjY3VbMV0gPT09IDUgJiYgYWR2YW5jZSArIGNTcGFjZSA+PSAyKVxuICAgICAgICB8fCAoYWNjdVsxXSA9PT0gMiAmJiBhZHZhbmNlICsgY1NwYWNlID49IDUpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gb2Zmc2V0IGNvbG9yU3BhY2Ugc2xvdCBmb3Igc2VtaWNvbG9uIG1vZGVcbiAgICAgIGlmIChhY2N1WzFdKSB7XG4gICAgICAgIGNTcGFjZSA9IDE7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoKythZHZhbmNlICsgcG9zIDwgcGFyYW1zLmxlbmd0aCAmJiBhZHZhbmNlICsgY1NwYWNlIDwgYWNjdS5sZW5ndGgpO1xuXG4gICAgLy8gc2V0IGRlZmF1bHQgdmFsdWVzIHRvIDBcbiAgICBmb3IgKGxldCBpID0gMjsgaSA8IGFjY3UubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChhY2N1W2ldID09PSAtMSkge1xuICAgICAgICBhY2N1W2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhcHBseSBjb2xvcnNcbiAgICBzd2l0Y2ggKGFjY3VbMF0pIHtcbiAgICAgIGNhc2UgMzg6XG4gICAgICAgIGF0dHIuZmcgPSB0aGlzLl91cGRhdGVBdHRyQ29sb3IoYXR0ci5mZywgYWNjdVsxXSwgYWNjdVszXSwgYWNjdVs0XSwgYWNjdVs1XSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0ODpcbiAgICAgICAgYXR0ci5iZyA9IHRoaXMuX3VwZGF0ZUF0dHJDb2xvcihhdHRyLmJnLCBhY2N1WzFdLCBhY2N1WzNdLCBhY2N1WzRdLCBhY2N1WzVdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDU4OlxuICAgICAgICBhdHRyLmV4dGVuZGVkID0gYXR0ci5leHRlbmRlZC5jbG9uZSgpO1xuICAgICAgICBhdHRyLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yID0gdGhpcy5fdXBkYXRlQXR0ckNvbG9yKGF0dHIuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IsIGFjY3VbMV0sIGFjY3VbM10sIGFjY3VbNF0sIGFjY3VbNV0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZHZhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNHUiA0IHN1YnBhcmFtczpcbiAgICogICAgNDowICAgLSAgIGVxdWFsIHRvIFNHUiAyNCAodHVybiBvZmYgYWxsIHVuZGVybGluZSlcbiAgICogICAgNDoxICAgLSAgIGVxdWFsIHRvIFNHUiA0IChzaW5nbGUgdW5kZXJsaW5lKVxuICAgKiAgICA0OjIgICAtICAgZXF1YWwgdG8gU0dSIDIxIChkb3VibGUgdW5kZXJsaW5lKVxuICAgKiAgICA0OjMgICAtICAgY3VybHkgdW5kZXJsaW5lXG4gICAqICAgIDQ6NCAgIC0gICBkb3R0ZWQgdW5kZXJsaW5lXG4gICAqICAgIDQ6NSAgIC0gICBkYXNoZWQgdW5kZXJsaW5lXG4gICAqL1xuICBwcml2YXRlIF9wcm9jZXNzVW5kZXJsaW5lKHN0eWxlOiBudW1iZXIsIGF0dHI6IElBdHRyaWJ1dGVEYXRhKTogdm9pZCB7XG4gICAgLy8gdHJlYXQgZXh0ZW5kZWQgYXR0cnMgYXMgaW1tdXRhYmxlLCB0aHVzIGFsd2F5cyBjbG9uZSBmcm9tIG9sZCBvbmVcbiAgICAvLyB0aGlzIGlzIG5lZWRlZCBzaW5jZSB0aGUgYnVmZmVyIG9ubHkgaG9sZHMgcmVmZXJlbmNlcyB0byBpdFxuICAgIGF0dHIuZXh0ZW5kZWQgPSBhdHRyLmV4dGVuZGVkLmNsb25lKCk7XG5cbiAgICAvLyBkZWZhdWx0IHRvIDEgPT0gc2luZ2xlIHVuZGVybGluZVxuICAgIGlmICghfnN0eWxlIHx8IHN0eWxlID4gNSkge1xuICAgICAgc3R5bGUgPSAxO1xuICAgIH1cbiAgICBhdHRyLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlID0gc3R5bGU7XG4gICAgYXR0ci5mZyB8PSBGZ0ZsYWdzLlVOREVSTElORTtcblxuICAgIC8vIDAgZGVhY3RpdmF0ZXMgdW5kZXJsaW5lXG4gICAgaWYgKHN0eWxlID09PSAwKSB7XG4gICAgICBhdHRyLmZnICY9IH5GZ0ZsYWdzLlVOREVSTElORTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgSEFTX0VYVEVOREVEIGluIEJHXG4gICAgYXR0ci51cGRhdGVFeHRlbmRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2Vzc1NHUjAoYXR0cjogSUF0dHJpYnV0ZURhdGEpOiB2b2lkIHtcbiAgICBhdHRyLmZnID0gREVGQVVMVF9BVFRSX0RBVEEuZmc7XG4gICAgYXR0ci5iZyA9IERFRkFVTFRfQVRUUl9EQVRBLmJnO1xuICAgIGF0dHIuZXh0ZW5kZWQgPSBhdHRyLmV4dGVuZGVkLmNsb25lKCk7XG4gICAgLy8gUmVzZXQgdW5kZXJsaW5lIHN0eWxlIGFuZCBjb2xvci4gTm90ZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gcmVzZXQgb3RoZXJcbiAgICAvLyBmaWVsZHMgc3VjaCBhcyB0aGUgdXJsIGlkLlxuICAgIGF0dHIuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGUgPSBVbmRlcmxpbmVTdHlsZS5OT05FO1xuICAgIGF0dHIuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgICBhdHRyLnVwZGF0ZUV4dGVuZGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBtIG0gIENoYXJhY3RlciBBdHRyaWJ1dGVzIChTR1IpLlxuICAgKlxuICAgKiBAdnQ6ICNQW1NlZSBiZWxvdyBmb3Igc3VwcG9ydGVkIGF0dHJpYnV0ZXMuXSAgICBDU0kgU0dSICAgXCJTZWxlY3QgR3JhcGhpYyBSZW5kaXRpb25cIiAgXCJDU0kgUG0gbVwiICBcIlNldC9SZXNldCB2YXJpb3VzIHRleHQgYXR0cmlidXRlcy5cIlxuICAgKiBTR1Igc2VsZWN0cyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXIgYXR0cmlidXRlcyBhdCB0aGUgc2FtZSB0aW1lLiBNdWx0aXBsZSBwYXJhbXMgKHVwIHRvIDMyKVxuICAgKiBhcmUgYXBwbGllZCBpbiBvcmRlciBmcm9tIGxlZnQgdG8gcmlnaHQuIFRoZSBjaGFuZ2VkIGF0dHJpYnV0ZXMgYXJlIGFwcGxpZWQgdG8gYWxsIG5ld1xuICAgKiBjaGFyYWN0ZXJzIHJlY2VpdmVkLiBJZiB5b3UgbW92ZSBjaGFyYWN0ZXJzIGluIHRoZSB2aWV3cG9ydCBieSBzY3JvbGxpbmcgb3IgYW55IG90aGVyIG1lYW5zLFxuICAgKiB0aGVuIHRoZSBhdHRyaWJ1dGVzIG1vdmUgd2l0aCB0aGUgY2hhcmFjdGVycy5cbiAgICpcbiAgICogU3VwcG9ydGVkIHBhcmFtIHZhbHVlcyBieSBTR1I6XG4gICAqXG4gICAqIHwgUGFyYW0gICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdXBwb3J0IHxcbiAgICogfCAtLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0gfFxuICAgKiB8IDAgICAgICAgICB8IE5vcm1hbCAoZGVmYXVsdCkuIFJlc2V0cyBhbnkgb3RoZXIgcHJlY2VkaW5nIFNHUi4gICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMSAgICAgICAgIHwgQm9sZC4gKGFsc28gc2VlIGBvcHRpb25zLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzYCkgICAgfCAjWSAgICAgIHxcbiAgICogfCAyICAgICAgICAgfCBGYWludCwgZGVjcmVhc2VkIGludGVuc2l0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDMgICAgICAgICB8IEl0YWxpYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNCAgICAgICAgIHwgVW5kZXJsaW5lZCAoc2VlIGJlbG93IGZvciBzdHlsZSBzdXBwb3J0KS4gICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA1ICAgICAgICAgfCBTbG93bHkgYmxpbmtpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDYgICAgICAgICB8IFJhcGlkbHkgYmxpbmtpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgNyAgICAgICAgIHwgSW52ZXJzZS4gRmxpcHMgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvci4gICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA4ICAgICAgICAgfCBJbnZpc2libGUgKGhpZGRlbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDkgICAgICAgICB8IENyb3NzZWQtb3V0IGNoYXJhY3RlcnMgKHN0cmlrZXRocm91Z2gpLiAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjEgICAgICAgIHwgRG91Ymx5IHVuZGVybGluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyMiAgICAgICAgfCBOb3JtYWwgKG5laXRoZXIgYm9sZCBub3IgZmFpbnQpLiAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDIzICAgICAgICB8IE5vIGl0YWxpYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjQgICAgICAgIHwgTm90IHVuZGVybGluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyNSAgICAgICAgfCBTdGVhZHkgKG5vdCBibGlua2luZykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDI3ICAgICAgICB8IFBvc2l0aXZlIChub3QgaW52ZXJzZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjggICAgICAgIHwgVmlzaWJsZSAobm90IGhpZGRlbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyOSAgICAgICAgfCBOb3QgQ3Jvc3NlZC1vdXQgKHN0cmlrZXRocm91Z2gpLiAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDMwICAgICAgICB8IEZvcmVncm91bmQgY29sb3I6IEJsYWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMzEgICAgICAgIHwgRm9yZWdyb3VuZCBjb2xvcjogUmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAzMiAgICAgICAgfCBGb3JlZ3JvdW5kIGNvbG9yOiBHcmVlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDMzICAgICAgICB8IEZvcmVncm91bmQgY29sb3I6IFllbGxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMzQgICAgICAgIHwgRm9yZWdyb3VuZCBjb2xvcjogQmx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAzNSAgICAgICAgfCBGb3JlZ3JvdW5kIGNvbG9yOiBNYWdlbnRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDM2ICAgICAgICB8IEZvcmVncm91bmQgY29sb3I6IEN5YW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMzcgICAgICAgIHwgRm9yZWdyb3VuZCBjb2xvcjogV2hpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAzOCAgICAgICAgfCBGb3JlZ3JvdW5kIGNvbG9yOiBFeHRlbmRlZCBjb2xvci4gICAgICAgICAgICAgICAgICAgICAgICB8ICNQW1N1cHBvcnQgZm9yIFJHQiBhbmQgaW5kZXhlZCBjb2xvcnMsIHNlZSBiZWxvdy5dIHxcbiAgICogfCAzOSAgICAgICAgfCBGb3JlZ3JvdW5kIGNvbG9yOiBEZWZhdWx0IChvcmlnaW5hbCkuICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQwICAgICAgICB8IEJhY2tncm91bmQgY29sb3I6IEJsYWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDEgICAgICAgIHwgQmFja2dyb3VuZCBjb2xvcjogUmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0MiAgICAgICAgfCBCYWNrZ3JvdW5kIGNvbG9yOiBHcmVlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQzICAgICAgICB8IEJhY2tncm91bmQgY29sb3I6IFllbGxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDQgICAgICAgIHwgQmFja2dyb3VuZCBjb2xvcjogQmx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0NSAgICAgICAgfCBCYWNrZ3JvdW5kIGNvbG9yOiBNYWdlbnRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQ2ICAgICAgICB8IEJhY2tncm91bmQgY29sb3I6IEN5YW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDcgICAgICAgIHwgQmFja2dyb3VuZCBjb2xvcjogV2hpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0OCAgICAgICAgfCBCYWNrZ3JvdW5kIGNvbG9yOiBFeHRlbmRlZCBjb2xvci4gICAgICAgICAgICAgICAgICAgICAgICB8ICNQW1N1cHBvcnQgZm9yIFJHQiBhbmQgaW5kZXhlZCBjb2xvcnMsIHNlZSBiZWxvdy5dIHxcbiAgICogfCA0OSAgICAgICAgfCBCYWNrZ3JvdW5kIGNvbG9yOiBEZWZhdWx0IChvcmlnaW5hbCkuICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDUzICAgICAgICB8IE92ZXJsaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNTUgICAgICAgIHwgTm90IE92ZXJsaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA1OCAgICAgICAgfCBVbmRlcmxpbmUgY29sb3I6IEV4dGVuZGVkIGNvbG9yLiAgICAgICAgICAgICAgICAgICAgICAgICB8ICNQW1N1cHBvcnQgZm9yIFJHQiBhbmQgaW5kZXhlZCBjb2xvcnMsIHNlZSBiZWxvdy5dIHxcbiAgICogfCA5MCAtIDk3ICAgfCBCcmlnaHQgZm9yZWdyb3VuZCBjb2xvciAoYW5hbG9nb3VzIHRvIDMwIC0gMzcpLiAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDEwMCAtIDEwNyB8IEJyaWdodCBiYWNrZ3JvdW5kIGNvbG9yIChhbmFsb2dvdXMgdG8gNDAgLSA0NykuICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqXG4gICAqIFVuZGVybGluZSBzdXBwb3J0cyBzdWJwYXJhbXMgdG8gZGVub3RlIHRoZSBzdHlsZSBpbiB0aGUgZm9ybSBgNCA6IHhgOlxuICAgKlxuICAgKiB8IHggICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdXBwb3J0IHxcbiAgICogfCAtLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLSB8XG4gICAqIHwgMCAgICAgIHwgTm8gdW5kZXJsaW5lLiBTYW1lIGFzIGBTR1IgMjQgbWAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDEgICAgICB8IFNpbmdsZSB1bmRlcmxpbmUuIFNhbWUgYXMgYFNHUiA0IG1gLiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyICAgICAgfCBEb3VibGUgdW5kZXJsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMyAgICAgIHwgQ3VybHkgdW5kZXJsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQgICAgICB8IERvdHRlZCB1bmRlcmxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA1ICAgICAgfCBEYXNoZWQgdW5kZXJsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgb3RoZXIgIHwgU2luZ2xlIHVuZGVybGluZS4gU2FtZSBhcyBgU0dSIDQgbWAuICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKlxuICAgKiBFeHRlbmRlZCBjb2xvcnMgYXJlIHN1cHBvcnRlZCBmb3IgZm9yZWdyb3VuZCAoUHM9MzgpLCBiYWNrZ3JvdW5kIChQcz00OCkgYW5kIHVuZGVybGluZSAoUHM9NTgpXG4gICAqIGFzIGZvbGxvd3M6XG4gICAqXG4gICAqIHwgUHMgKyAxIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN1cHBvcnQgfFxuICAgKiB8IC0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tIHxcbiAgICogfCAwICAgICAgfCBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgMSAgICAgIHwgVHJhbnNwYXJlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDIgICAgICB8IFJHQiBjb2xvciBhcyBgUHMgOyAyIDsgUiA7IEcgOyBCYCBvciBgUHMgOiAyIDogOiBSIDogRyA6IEJgLiAgfCAjWSAgICAgIHxcbiAgICogfCAzICAgICAgfCBDTVkgY29sb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgNCAgICAgIHwgQ01ZSyBjb2xvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDUgICAgICB8IEluZGV4ZWQgKDI1NiBjb2xvcnMpIGFzIGBQcyA7IDUgOyBJTkRFWGAgb3IgYFBzIDogNSA6IElOREVYYC4gfCAjWSAgICAgIHxcbiAgICpcbiAgICpcbiAgICogRklYTUU6IGJsaW5raW5nIGlzIGltcGxlbWVudGVkIGluIGF0dHJzLCBidXQgbm90IHdvcmtpbmcgaW4gcmVuZGVyZXJzP1xuICAgKiBGSVhNRTogcmVtb3ZlIGRlYWQgYnJhbmNoIGZvciBwPTEwMFxuICAgKi9cbiAgcHVibGljIGNoYXJBdHRyaWJ1dGVzKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIC8vIE9wdGltaXplIGEgc2luZ2xlIFNHUjAuXG4gICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDEgJiYgcGFyYW1zLnBhcmFtc1swXSA9PT0gMCkge1xuICAgICAgdGhpcy5fcHJvY2Vzc1NHUjAodGhpcy5fY3VyQXR0ckRhdGEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbCA9IHBhcmFtcy5sZW5ndGg7XG4gICAgbGV0IHA7XG4gICAgY29uc3QgYXR0ciA9IHRoaXMuX2N1ckF0dHJEYXRhO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIHAgPSBwYXJhbXMucGFyYW1zW2ldO1xuICAgICAgaWYgKHAgPj0gMzAgJiYgcCA8PSAzNykge1xuICAgICAgICAvLyBmZyBjb2xvciA4XG4gICAgICAgIGF0dHIuZmcgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLKTtcbiAgICAgICAgYXR0ci5mZyB8PSBBdHRyaWJ1dGVzLkNNX1AxNiB8IChwIC0gMzApO1xuICAgICAgfSBlbHNlIGlmIChwID49IDQwICYmIHAgPD0gNDcpIHtcbiAgICAgICAgLy8gYmcgY29sb3IgOFxuICAgICAgICBhdHRyLmJnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5QQ09MT1JfTUFTSyk7XG4gICAgICAgIGF0dHIuYmcgfD0gQXR0cmlidXRlcy5DTV9QMTYgfCAocCAtIDQwKTtcbiAgICAgIH0gZWxzZSBpZiAocCA+PSA5MCAmJiBwIDw9IDk3KSB7XG4gICAgICAgIC8vIGZnIGNvbG9yIDE2XG4gICAgICAgIGF0dHIuZmcgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLKTtcbiAgICAgICAgYXR0ci5mZyB8PSBBdHRyaWJ1dGVzLkNNX1AxNiB8IChwIC0gOTApIHwgODtcbiAgICAgIH0gZWxzZSBpZiAocCA+PSAxMDAgJiYgcCA8PSAxMDcpIHtcbiAgICAgICAgLy8gYmcgY29sb3IgMTZcbiAgICAgICAgYXR0ci5iZyAmPSB+KEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUENPTE9SX01BU0spO1xuICAgICAgICBhdHRyLmJnIHw9IEF0dHJpYnV0ZXMuQ01fUDE2IHwgKHAgLSAxMDApIHwgODtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMCkge1xuICAgICAgICAvLyBkZWZhdWx0XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NTR1IwKGF0dHIpO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAxKSB7XG4gICAgICAgIC8vIGJvbGQgdGV4dFxuICAgICAgICBhdHRyLmZnIHw9IEZnRmxhZ3MuQk9MRDtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMykge1xuICAgICAgICAvLyBpdGFsaWMgdGV4dFxuICAgICAgICBhdHRyLmJnIHw9IEJnRmxhZ3MuSVRBTElDO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA0KSB7XG4gICAgICAgIC8vIHVuZGVybGluZWQgdGV4dFxuICAgICAgICBhdHRyLmZnIHw9IEZnRmxhZ3MuVU5ERVJMSU5FO1xuICAgICAgICB0aGlzLl9wcm9jZXNzVW5kZXJsaW5lKHBhcmFtcy5oYXNTdWJQYXJhbXMoaSkgPyBwYXJhbXMuZ2V0U3ViUGFyYW1zKGkpIVswXSA6IFVuZGVybGluZVN0eWxlLlNJTkdMRSwgYXR0cik7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDUpIHtcbiAgICAgICAgLy8gYmxpbmtcbiAgICAgICAgYXR0ci5mZyB8PSBGZ0ZsYWdzLkJMSU5LO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA3KSB7XG4gICAgICAgIC8vIGludmVyc2UgYW5kIHBvc2l0aXZlXG4gICAgICAgIC8vIHRlc3Qgd2l0aDogZWNobyAtZSAnXFxlWzMxbVxcZVs0Mm1oZWxsb1xcZVs3bXdvcmxkXFxlWzI3bWhpXFxlW20nXG4gICAgICAgIGF0dHIuZmcgfD0gRmdGbGFncy5JTlZFUlNFO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA4KSB7XG4gICAgICAgIC8vIGludmlzaWJsZVxuICAgICAgICBhdHRyLmZnIHw9IEZnRmxhZ3MuSU5WSVNJQkxFO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA5KSB7XG4gICAgICAgIC8vIHN0cmlrZXRocm91Z2hcbiAgICAgICAgYXR0ci5mZyB8PSBGZ0ZsYWdzLlNUUklLRVRIUk9VR0g7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDIpIHtcbiAgICAgICAgLy8gZGltbWVkIHRleHRcbiAgICAgICAgYXR0ci5iZyB8PSBCZ0ZsYWdzLkRJTTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMjEpIHtcbiAgICAgICAgLy8gZG91YmxlIHVuZGVybGluZVxuICAgICAgICB0aGlzLl9wcm9jZXNzVW5kZXJsaW5lKFVuZGVybGluZVN0eWxlLkRPVUJMRSwgYXR0cik7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDIyKSB7XG4gICAgICAgIC8vIG5vdCBib2xkIG5vciBmYWludFxuICAgICAgICBhdHRyLmZnICY9IH5GZ0ZsYWdzLkJPTEQ7XG4gICAgICAgIGF0dHIuYmcgJj0gfkJnRmxhZ3MuRElNO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAyMykge1xuICAgICAgICAvLyBub3QgaXRhbGljXG4gICAgICAgIGF0dHIuYmcgJj0gfkJnRmxhZ3MuSVRBTElDO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAyNCkge1xuICAgICAgICAvLyBub3QgdW5kZXJsaW5lZFxuICAgICAgICBhdHRyLmZnICY9IH5GZ0ZsYWdzLlVOREVSTElORTtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc1VuZGVybGluZShVbmRlcmxpbmVTdHlsZS5OT05FLCBhdHRyKTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMjUpIHtcbiAgICAgICAgLy8gbm90IGJsaW5rXG4gICAgICAgIGF0dHIuZmcgJj0gfkZnRmxhZ3MuQkxJTks7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDI3KSB7XG4gICAgICAgIC8vIG5vdCBpbnZlcnNlXG4gICAgICAgIGF0dHIuZmcgJj0gfkZnRmxhZ3MuSU5WRVJTRTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMjgpIHtcbiAgICAgICAgLy8gbm90IGludmlzaWJsZVxuICAgICAgICBhdHRyLmZnICY9IH5GZ0ZsYWdzLklOVklTSUJMRTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMjkpIHtcbiAgICAgICAgLy8gbm90IHN0cmlrZXRocm91Z2hcbiAgICAgICAgYXR0ci5mZyAmPSB+RmdGbGFncy5TVFJJS0VUSFJPVUdIO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAzOSkge1xuICAgICAgICAvLyByZXNldCBmZ1xuICAgICAgICBhdHRyLmZnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgICAgIGF0dHIuZmcgfD0gREVGQVVMVF9BVFRSX0RBVEEuZmcgJiAoQXR0cmlidXRlcy5QQ09MT1JfTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA0OSkge1xuICAgICAgICAvLyByZXNldCBiZ1xuICAgICAgICBhdHRyLmJnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgICAgIGF0dHIuYmcgfD0gREVGQVVMVF9BVFRSX0RBVEEuYmcgJiAoQXR0cmlidXRlcy5QQ09MT1JfTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAzOCB8fCBwID09PSA0OCB8fCBwID09PSA1OCkge1xuICAgICAgICAvLyBmZyBjb2xvciAyNTYgYW5kIFJHQlxuICAgICAgICBpICs9IHRoaXMuX2V4dHJhY3RDb2xvcihwYXJhbXMsIGksIGF0dHIpO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA1Mykge1xuICAgICAgICAvLyBvdmVybGluZVxuICAgICAgICBhdHRyLmJnIHw9IEJnRmxhZ3MuT1ZFUkxJTkU7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDU1KSB7XG4gICAgICAgIC8vIG5vdCBvdmVybGluZVxuICAgICAgICBhdHRyLmJnICY9IH5CZ0ZsYWdzLk9WRVJMSU5FO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA1OSkge1xuICAgICAgICBhdHRyLmV4dGVuZGVkID0gYXR0ci5leHRlbmRlZC5jbG9uZSgpO1xuICAgICAgICBhdHRyLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yID0gLTE7XG4gICAgICAgIGF0dHIudXBkYXRlRXh0ZW5kZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMTAwKSB7IC8vIEZJWE1FOiBkZWFkIGJyYW5jaCwgcD0xMDAgYWxyZWFkeSBoYW5kbGVkIGFib3ZlIVxuICAgICAgICAvLyByZXNldCBmZy9iZ1xuICAgICAgICBhdHRyLmZnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgICAgIGF0dHIuZmcgfD0gREVGQVVMVF9BVFRSX0RBVEEuZmcgJiAoQXR0cmlidXRlcy5QQ09MT1JfTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgICBhdHRyLmJnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgICAgIGF0dHIuYmcgfD0gREVGQVVMVF9BVFRSX0RBVEEuYmcgJiAoQXR0cmlidXRlcy5QQ09MT1JfTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnVW5rbm93biBTR1IgYXR0cmlidXRlOiAlZC4nLCBwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIG4gIERldmljZSBTdGF0dXMgUmVwb3J0IChEU1IpLlxuICAgKiAgICAgUHMgPSA1ICAtPiBTdGF0dXMgUmVwb3J0LiAgUmVzdWx0IChgYE9LJycpIGlzXG4gICAqICAgQ1NJIDAgblxuICAgKiAgICAgUHMgPSA2ICAtPiBSZXBvcnQgQ3Vyc29yIFBvc2l0aW9uIChDUFIpIFtyb3c7Y29sdW1uXS5cbiAgICogICBSZXN1bHQgaXNcbiAgICogICBDU0kgciA7IGMgUlxuICAgKiBDU0kgPyBQcyBuXG4gICAqICAgRGV2aWNlIFN0YXR1cyBSZXBvcnQgKERTUiwgREVDLXNwZWNpZmljKS5cbiAgICogICAgIFBzID0gNiAgLT4gUmVwb3J0IEN1cnNvciBQb3NpdGlvbiAoQ1BSKSBbcm93O2NvbHVtbl0gYXMgQ1NJXG4gICAqICAgICA/IHIgOyBjIFIgKGFzc3VtZXMgcGFnZSBpcyB6ZXJvKS5cbiAgICogICAgIFBzID0gMSA1ICAtPiBSZXBvcnQgUHJpbnRlciBzdGF0dXMgYXMgQ1NJID8gMSAwICBuICAocmVhZHkpLlxuICAgKiAgICAgb3IgQ1NJID8gMSAxICBuICAobm90IHJlYWR5KS5cbiAgICogICAgIFBzID0gMiA1ICAtPiBSZXBvcnQgVURLIHN0YXR1cyBhcyBDU0kgPyAyIDAgIG4gICh1bmxvY2tlZClcbiAgICogICAgIG9yIENTSSA/IDIgMSAgbiAgKGxvY2tlZCkuXG4gICAqICAgICBQcyA9IDIgNiAgLT4gUmVwb3J0IEtleWJvYXJkIHN0YXR1cyBhc1xuICAgKiAgIENTSSA/IDIgNyAgOyAgMSAgOyAgMCAgOyAgMCAgbiAgKE5vcnRoIEFtZXJpY2FuKS5cbiAgICogICBUaGUgbGFzdCB0d28gcGFyYW1ldGVycyBhcHBseSB0byBWVDQwMCAmIHVwLCBhbmQgZGVub3RlIGtleS1cbiAgICogICBib2FyZCByZWFkeSBhbmQgTEswMSByZXNwZWN0aXZlbHkuXG4gICAqICAgICBQcyA9IDUgMyAgLT4gUmVwb3J0IExvY2F0b3Igc3RhdHVzIGFzXG4gICAqICAgQ1NJID8gNSAzICBuICBMb2NhdG9yIGF2YWlsYWJsZSwgaWYgY29tcGlsZWQtaW4sIG9yXG4gICAqICAgQ1NJID8gNSAwICBuICBObyBMb2NhdG9yLCBpZiBub3QuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERTUiAgIFwiRGV2aWNlIFN0YXR1cyBSZXBvcnRcIiAgXCJDU0kgUHMgblwiICBcIlJlcXVlc3QgY3Vyc29yIHBvc2l0aW9uIChDUFIpIHdpdGggYFBzYCA9IDYuXCJcbiAgICovXG4gIHB1YmxpYyBkZXZpY2VTdGF0dXMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChwYXJhbXMucGFyYW1zWzBdKSB7XG4gICAgICBjYXNlIDU6XG4gICAgICAgIC8vIHN0YXR1cyByZXBvcnRcbiAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtDMC5FU0N9WzBuYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2OlxuICAgICAgICAvLyBjdXJzb3IgcG9zaXRpb25cbiAgICAgICAgY29uc3QgeSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci55ICsgMTtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci54ICsgMTtcbiAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtDMC5FU0N9WyR7eX07JHt4fVJgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQHZ0OiAjUFtPbmx5IENQUiBpcyBzdXBwb3J0ZWQuXSAgQ1NJIERFQ0RTUiAgXCJERUMgRGV2aWNlIFN0YXR1cyBSZXBvcnRcIiAgXCJDU0kgPyBQcyBuXCIgIFwiT25seSBDUFIgaXMgc3VwcG9ydGVkIChzYW1lIGFzIERTUikuXCJcbiAgcHVibGljIGRldmljZVN0YXR1c1ByaXZhdGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgLy8gbW9kZXJuIHh0ZXJtIGRvZXNudCBzZWVtIHRvXG4gICAgLy8gcmVzcG9uZCB0byBhbnkgb2YgdGhlc2UgZXhjZXB0ID82LCA2LCBhbmQgNVxuICAgIHN3aXRjaCAocGFyYW1zLnBhcmFtc1swXSkge1xuICAgICAgY2FzZSA2OlxuICAgICAgICAvLyBjdXJzb3IgcG9zaXRpb25cbiAgICAgICAgY29uc3QgeSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci55ICsgMTtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci54ICsgMTtcbiAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtDMC5FU0N9Wz8ke3l9OyR7eH1SYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNTpcbiAgICAgICAgLy8gbm8gcHJpbnRlclxuICAgICAgICAvLyB0aGlzLmhhbmRsZXIoQzAuRVNDICsgJ1s/MTFuJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNTpcbiAgICAgICAgLy8gZG9udCBzdXBwb3J0IHVzZXIgZGVmaW5lZCBrZXlzXG4gICAgICAgIC8vIHRoaXMuaGFuZGxlcihDMC5FU0MgKyAnWz8yMW4nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI2OlxuICAgICAgICAvLyBub3J0aCBhbWVyaWNhbiBrZXlib2FyZFxuICAgICAgICAvLyB0aGlzLmhhbmRsZXIoQzAuRVNDICsgJ1s/Mjc7MTswOzBuJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1MzpcbiAgICAgICAgLy8gbm8gZGVjIGxvY2F0b3IvbW91c2VcbiAgICAgICAgLy8gdGhpcy5oYW5kbGVyKEMwLkVTQyArICdbPzUwbicpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJICEgcCAgIFNvZnQgdGVybWluYWwgcmVzZXQgKERFQ1NUUikuXG4gICAqIGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTQtMTAuaHRtbFxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBERUNTVFIgIFwiU29mdCBUZXJtaW5hbCBSZXNldFwiICAgXCJDU0kgISBwXCIgICBcIlJlc2V0IHNldmVyYWwgdGVybWluYWwgYXR0cmlidXRlcyB0byBpbml0aWFsIHN0YXRlLlwiXG4gICAqIFRoZXJlIGFyZSB0d28gdGVybWluYWwgcmVzZXQgc2VxdWVuY2VzIC0gUklTIGFuZCBERUNTVFIuIFdoaWxlIFJJUyBwZXJmb3JtcyBhbG1vc3QgYSBmdWxsXG4gICAqIHRlcm1pbmFsIGJvb3RzdHJhcCwgREVDU1RSIG9ubHkgcmVzZXRzIGNlcnRhaW4gYXR0cmlidXRlcy4gRm9yIG1vc3QgbmVlZHMgREVDU1RSIHNob3VsZCBiZVxuICAgKiBzdWZmaWNpZW50LlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIHRlcm1pbmFsIGF0dHJpYnV0ZXMgYXJlIHJlc2V0IHRvIGRlZmF1bHQgdmFsdWVzOlxuICAgKiAtIElSTSBpcyByZXNldCAoZGFmYXVsdCA9IGZhbHNlKVxuICAgKiAtIHNjcm9sbCBtYXJnaW5zIGFyZSByZXNldCAoZGVmYXVsdCA9IHZpZXdwb3J0IHNpemUpXG4gICAqIC0gZXJhc2UgYXR0cmlidXRlcyBhcmUgcmVzZXQgdG8gZGVmYXVsdFxuICAgKiAtIGNoYXJzZXRzIGFyZSByZXNldFxuICAgKiAtIERFQ1NDIGRhdGEgaXMgcmVzZXQgdG8gaW5pdGlhbCB2YWx1ZXNcbiAgICogLSBERUNPTSBpcyByZXNldCB0byBhYnNvbHV0ZSBtb2RlXG4gICAqXG4gICAqXG4gICAqIEZJWE1FOiB0aGVyZSBhcmUgc2V2ZXJhbCBtb3JlIGF0dHJpYnV0ZXMgbWlzc2luZyAoc2VlIFZUNTIwIG1hbnVhbClcbiAgICovXG4gIHB1YmxpYyBzb2Z0UmVzZXQocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JIaWRkZW4gPSBmYWxzZTtcbiAgICB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmZpcmUoKTtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wID0gMDtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tID0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMTtcbiAgICB0aGlzLl9jdXJBdHRyRGF0YSA9IERFRkFVTFRfQVRUUl9EQVRBLmNsb25lKCk7XG4gICAgdGhpcy5fY29yZVNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLl9jaGFyc2V0U2VydmljZS5yZXNldCgpO1xuXG4gICAgLy8gcmVzZXQgREVDU0MgZGF0YVxuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZFggPSAwO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZFkgPSB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2U7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkQ3VyQXR0ckRhdGEuZmcgPSB0aGlzLl9jdXJBdHRyRGF0YS5mZztcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDdXJBdHRyRGF0YS5iZyA9IHRoaXMuX2N1ckF0dHJEYXRhLmJnO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZENoYXJzZXQgPSB0aGlzLl9jaGFyc2V0U2VydmljZS5jaGFyc2V0O1xuXG4gICAgLy8gcmVzZXQgREVDT01cbiAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMub3JpZ2luID0gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIFNQIHEgIFNldCBjdXJzb3Igc3R5bGUgKERFQ1NDVVNSLCBWVDUyMCkuXG4gICAqICAgUHMgPSAwICAtPiBibGlua2luZyBibG9jay5cbiAgICogICBQcyA9IDEgIC0+IGJsaW5raW5nIGJsb2NrIChkZWZhdWx0KS5cbiAgICogICBQcyA9IDIgIC0+IHN0ZWFkeSBibG9jay5cbiAgICogICBQcyA9IDMgIC0+IGJsaW5raW5nIHVuZGVybGluZS5cbiAgICogICBQcyA9IDQgIC0+IHN0ZWFkeSB1bmRlcmxpbmUuXG4gICAqICAgUHMgPSA1ICAtPiBibGlua2luZyBiYXIgKHh0ZXJtKS5cbiAgICogICBQcyA9IDYgIC0+IHN0ZWFkeSBiYXIgKHh0ZXJtKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgREVDU0NVU1IgIFwiU2V0IEN1cnNvciBTdHlsZVwiICBcIkNTSSBQcyBTUCBxXCIgICBcIlNldCBjdXJzb3Igc3R5bGUuXCJcbiAgICogU3VwcG9ydGVkIGN1cnNvciBzdHlsZXM6XG4gICAqICAtIGVtcHR5LCAwIG9yIDE6IHN0ZWFkeSBibG9ja1xuICAgKiAgLSAyOiBibGluayBibG9ja1xuICAgKiAgLSAzOiBzdGVhZHkgdW5kZXJsaW5lXG4gICAqICAtIDQ6IGJsaW5rIHVuZGVybGluZVxuICAgKiAgLSA1OiBzdGVhZHkgYmFyXG4gICAqICAtIDY6IGJsaW5rIGJhclxuICAgKi9cbiAgcHVibGljIHNldEN1cnNvclN0eWxlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuICAgIHN3aXRjaCAocGFyYW0pIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jdXJzb3JTdHlsZSA9ICdibG9jayc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgY2FzZSA0OlxuICAgICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmN1cnNvclN0eWxlID0gJ3VuZGVybGluZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1OlxuICAgICAgY2FzZSA2OlxuICAgICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmN1cnNvclN0eWxlID0gJ2Jhcic7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBpc0JsaW5raW5nID0gcGFyYW0gJSAyID09PSAxO1xuICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMuY3Vyc29yQmxpbmsgPSBpc0JsaW5raW5nO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyA7IFBzIHJcbiAgICogICBTZXQgU2Nyb2xsaW5nIFJlZ2lvbiBbdG9wO2JvdHRvbV0gKGRlZmF1bHQgPSBmdWxsIHNpemUgb2Ygd2luLVxuICAgKiAgIGRvdykgKERFQ1NUQk0pLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBERUNTVEJNIFwiU2V0IFRvcCBhbmQgQm90dG9tIE1hcmdpblwiIFwiQ1NJIFBzIDsgUHMgclwiIFwiU2V0IHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgdGhlIHZpZXdwb3J0IFt0b3A7Ym90dG9tXSAoZGVmYXVsdCA9IHZpZXdwb3J0IHNpemUpLlwiXG4gICAqL1xuICBwdWJsaWMgc2V0U2Nyb2xsUmVnaW9uKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRvcCA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICBsZXQgYm90dG9tOiBudW1iZXI7XG5cbiAgICBpZiAocGFyYW1zLmxlbmd0aCA8IDIgfHwgKGJvdHRvbSA9IHBhcmFtcy5wYXJhbXNbMV0pID4gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIHx8IGJvdHRvbSA9PT0gMCkge1xuICAgICAgYm90dG9tID0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzO1xuICAgIH1cblxuICAgIGlmIChib3R0b20gPiB0b3ApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AgPSB0b3AgLSAxO1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSA9IGJvdHRvbSAtIDE7XG4gICAgICB0aGlzLl9zZXRDdXJzb3IoMCwgMCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyA7IFBzIDsgUHMgdCAtIFZhcmlvdXMgd2luZG93IG1hbmlwdWxhdGlvbnMgYW5kIHJlcG9ydHMgKHh0ZXJtKVxuICAgKlxuICAgKiBOb3RlOiBPbmx5IHRob3NlIGxpc3RlZCBiZWxvdyBhcmUgc3VwcG9ydGVkLiBBbGwgb3RoZXJzIGFyZSBsZWZ0IHRvIGludGVncmF0b3JzIGFuZFxuICAgKiBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IGJhc2VkIG9uIHRoZSBlbWJlZGRpbmcgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqICAgIFBzID0gMSA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZFxuICAgKiAgICAgIFJlcG9ydCB4dGVybSB0ZXh0IGFyZWEgc2l6ZSBpbiBwaXhlbHMuXG4gICAqICAgICAgUmVzdWx0IGlzIENTSSA0IDsgaGVpZ2h0IDsgd2lkdGggdFxuICAgKiAgICBQcyA9IDE0IDsgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaW1wbGVtZW50ZWRcbiAgICogICAgUHMgPSAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkXG4gICAqICAgICAgUmVwb3J0IHh0ZXJtIGNoYXJhY3RlciBjZWxsIHNpemUgaW4gcGl4ZWxzLlxuICAgKiAgICAgIFJlc3VsdCBpcyBDU0kgNiA7IGhlaWdodCA7IHdpZHRoIHRcbiAgICogICAgUHMgPSAxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkXG4gICAqICAgICAgUmVwb3J0IHRoZSBzaXplIG9mIHRoZSB0ZXh0IGFyZWEgaW4gY2hhcmFjdGVycy5cbiAgICogICAgICBSZXN1bHQgaXMgQ1NJIDggOyBoZWlnaHQgOyB3aWR0aCB0XG4gICAqICAgIFBzID0gMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZFxuICAgKiAgICAgIFJlcG9ydCB4dGVybSB3aW5kb3cncyBpY29uIGxhYmVsLlxuICAgKiAgICAgIFJlc3VsdCBpcyBPU0MgTCBsYWJlbCBTVFxuICAgKiAgICBQcyA9IDIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRcbiAgICogICAgICBSZXBvcnQgeHRlcm0gd2luZG93J3MgdGl0bGUuXG4gICAqICAgICAgUmVzdWx0IGlzIE9TQyBsIGxhYmVsIFNUXG4gICAqICAgIFBzID0gMjIgOyAwICAtPiBTYXZlIHh0ZXJtIGljb24gYW5kIHdpbmRvdyB0aXRsZSBvbiBzdGFjay4gICAgICAgIHN1cHBvcnRlZFxuICAgKiAgICBQcyA9IDIyIDsgMSAgLT4gU2F2ZSB4dGVybSBpY29uIHRpdGxlIG9uIHN0YWNrLiAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRcbiAgICogICAgUHMgPSAyMiA7IDIgIC0+IFNhdmUgeHRlcm0gd2luZG93IHRpdGxlIG9uIHN0YWNrLiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkXG4gICAqICAgIFBzID0gMjMgOyAwICAtPiBSZXN0b3JlIHh0ZXJtIGljb24gYW5kIHdpbmRvdyB0aXRsZSBmcm9tIHN0YWNrLiAgIHN1cHBvcnRlZFxuICAgKiAgICBQcyA9IDIzIDsgMSAgLT4gUmVzdG9yZSB4dGVybSBpY29uIHRpdGxlIGZyb20gc3RhY2suICAgICAgICAgICAgICBzdXBwb3J0ZWRcbiAgICogICAgUHMgPSAyMyA7IDIgIC0+IFJlc3RvcmUgeHRlcm0gd2luZG93IHRpdGxlIGZyb20gc3RhY2suICAgICAgICAgICAgc3VwcG9ydGVkXG4gICAqICAgIFBzID49IDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpbXBsZW1lbnRlZFxuICAgKi9cbiAgcHVibGljIHdpbmRvd09wdGlvbnMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKCFwYXJhbVRvV2luZG93T3B0aW9uKHBhcmFtcy5wYXJhbXNbMF0sIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93T3B0aW9ucykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBzZWNvbmQgPSAocGFyYW1zLmxlbmd0aCA+IDEpID8gcGFyYW1zLnBhcmFtc1sxXSA6IDA7XG4gICAgc3dpdGNoIChwYXJhbXMucGFyYW1zWzBdKSB7XG4gICAgICBjYXNlIDE0OiAgLy8gR2V0V2luU2l6ZVBpeGVscywgcmV0dXJucyBDU0kgNCA7IGhlaWdodCA7IHdpZHRoIHRcbiAgICAgICAgaWYgKHNlY29uZCAhPT0gMikge1xuICAgICAgICAgIHRoaXMuX29uUmVxdWVzdFdpbmRvd3NPcHRpb25zUmVwb3J0LmZpcmUoV2luZG93c09wdGlvbnNSZXBvcnRUeXBlLkdFVF9XSU5fU0laRV9QSVhFTFMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNjogIC8vIEdldENlbGxTaXplUGl4ZWxzLCByZXR1cm5zIENTSSA2IDsgaGVpZ2h0IDsgd2lkdGggdFxuICAgICAgICB0aGlzLl9vblJlcXVlc3RXaW5kb3dzT3B0aW9uc1JlcG9ydC5maXJlKFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZS5HRVRfQ0VMTF9TSVpFX1BJWEVMUyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODogIC8vIEdldFdpblNpemVDaGFycywgcmV0dXJucyBDU0kgOCA7IGhlaWdodCA7IHdpZHRoIHRcbiAgICAgICAgaWYgKHRoaXMuX2J1ZmZlclNlcnZpY2UpIHtcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGAke0MwLkVTQ31bODske3RoaXMuX2J1ZmZlclNlcnZpY2Uucm93c307JHt0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHN9dGApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyMjogIC8vIFB1c2hUaXRsZVxuICAgICAgICBpZiAoc2Vjb25kID09PSAwIHx8IHNlY29uZCA9PT0gMikge1xuICAgICAgICAgIHRoaXMuX3dpbmRvd1RpdGxlU3RhY2sucHVzaCh0aGlzLl93aW5kb3dUaXRsZSk7XG4gICAgICAgICAgaWYgKHRoaXMuX3dpbmRvd1RpdGxlU3RhY2subGVuZ3RoID4gU1RBQ0tfTElNSVQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvd1RpdGxlU3RhY2suc2hpZnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY29uZCA9PT0gMCB8fCBzZWNvbmQgPT09IDEpIHtcbiAgICAgICAgICB0aGlzLl9pY29uTmFtZVN0YWNrLnB1c2godGhpcy5faWNvbk5hbWUpO1xuICAgICAgICAgIGlmICh0aGlzLl9pY29uTmFtZVN0YWNrLmxlbmd0aCA+IFNUQUNLX0xJTUlUKSB7XG4gICAgICAgICAgICB0aGlzLl9pY29uTmFtZVN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyMzogIC8vIFBvcFRpdGxlXG4gICAgICAgIGlmIChzZWNvbmQgPT09IDAgfHwgc2Vjb25kID09PSAyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3dpbmRvd1RpdGxlU3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNldFRpdGxlKHRoaXMuX3dpbmRvd1RpdGxlU3RhY2sucG9wKCkhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY29uZCA9PT0gMCB8fCBzZWNvbmQgPT09IDEpIHtcbiAgICAgICAgICBpZiAodGhpcy5faWNvbk5hbWVTdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SWNvbk5hbWUodGhpcy5faWNvbk5hbWVTdGFjay5wb3AoKSEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDU0kgc1xuICAgKiBFU0MgN1xuICAgKiAgIFNhdmUgY3Vyc29yIChBTlNJLlNZUykuXG4gICAqXG4gICAqIEB2dDogI1BbVE9ETy4uLl0gIENTSSBTQ09TQyAgIFwiU2F2ZSBDdXJzb3JcIiAgIFwiQ1NJIHNcIiAgIFwiU2F2ZSBjdXJzb3IgcG9zaXRpb24sIGNoYXJtYXAgYW5kIHRleHQgYXR0cmlidXRlcy5cIlxuICAgKiBAdnQ6ICNZIEVTQyAgU0MgICBcIlNhdmUgQ3Vyc29yXCIgICBcIkVTQyA3XCIgICBcIlNhdmUgY3Vyc29yIHBvc2l0aW9uLCBjaGFybWFwIGFuZCB0ZXh0IGF0dHJpYnV0ZXMuXCJcbiAgICovXG4gIHB1YmxpYyBzYXZlQ3Vyc29yKHBhcmFtcz86IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRYID0gdGhpcy5fYWN0aXZlQnVmZmVyLng7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkWSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55O1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZEN1ckF0dHJEYXRhLmZnID0gdGhpcy5fY3VyQXR0ckRhdGEuZmc7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkQ3VyQXR0ckRhdGEuYmcgPSB0aGlzLl9jdXJBdHRyRGF0YS5iZztcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDaGFyc2V0ID0gdGhpcy5fY2hhcnNldFNlcnZpY2UuY2hhcnNldDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIENTSSB1XG4gICAqIEVTQyA4XG4gICAqICAgUmVzdG9yZSBjdXJzb3IgKEFOU0kuU1lTKS5cbiAgICpcbiAgICogQHZ0OiAjUFtUT0RPLi4uXSAgQ1NJIFNDT1JDIFwiUmVzdG9yZSBDdXJzb3JcIiAgXCJDU0kgdVwiICAgXCJSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiwgY2hhcm1hcCBhbmQgdGV4dCBhdHRyaWJ1dGVzLlwiXG4gICAqIEB2dDogI1kgRVNDICBSQyBcIlJlc3RvcmUgQ3Vyc29yXCIgIFwiRVNDIDhcIiAgIFwiUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24sIGNoYXJtYXAgYW5kIHRleHQgYXR0cmlidXRlcy5cIlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmVDdXJzb3IocGFyYW1zPzogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkWCB8fCAwO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID0gTWF0aC5tYXgodGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkWSAtIHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSwgMCk7XG4gICAgdGhpcy5fY3VyQXR0ckRhdGEuZmcgPSB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDdXJBdHRyRGF0YS5mZztcbiAgICB0aGlzLl9jdXJBdHRyRGF0YS5iZyA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZEN1ckF0dHJEYXRhLmJnO1xuICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLmNoYXJzZXQgPSAodGhpcyBhcyBhbnkpLl9zYXZlZENoYXJzZXQ7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZENoYXJzZXQpIHtcbiAgICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLmNoYXJzZXQgPSB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDaGFyc2V0O1xuICAgIH1cbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cblxuICAvKipcbiAgICogT1NDIDI7IDxkYXRhPiBTVCAoc2V0IHdpbmRvdyB0aXRsZSlcbiAgICogICBQcm94eSB0byBzZXQgd2luZG93IHRpdGxlLlxuICAgKlxuICAgKiBAdnQ6ICNQW0ljb24gbmFtZSBpcyBub3QgZXhwb3NlZC5dICAgT1NDICAgIDAgICBcIlNldCBXaW5kb3dzIFRpdGxlIGFuZCBJY29uIE5hbWVcIiAgXCJPU0MgMCA7IFB0IEJFTFwiICBcIlNldCB3aW5kb3cgdGl0bGUgYW5kIGljb24gbmFtZS5cIlxuICAgKiBJY29uIG5hbWUgaXMgbm90IHN1cHBvcnRlZC4gRm9yIFdpbmRvdyBUaXRsZSBzZWUgYmVsb3cuXG4gICAqXG4gICAqIEB2dDogI1kgICAgIE9TQyAgICAyICAgXCJTZXQgV2luZG93cyBUaXRsZVwiICBcIk9TQyAyIDsgUHQgQkVMXCIgIFwiU2V0IHdpbmRvdyB0aXRsZS5cIlxuICAgKiB4dGVybS5qcyBkb2VzIG5vdCBtYW5pcHVsYXRlIHRoZSB0aXRsZSBkaXJlY3RseSwgaW5zdGVhZCBleHBvc2VzIGNoYW5nZXMgdmlhIHRoZSBldmVudFxuICAgKiBgVGVybWluYWwub25UaXRsZUNoYW5nZWAuXG4gICAqL1xuICBwdWJsaWMgc2V0VGl0bGUoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fd2luZG93VGl0bGUgPSBkYXRhO1xuICAgIHRoaXMuX29uVGl0bGVDaGFuZ2UuZmlyZShkYXRhKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0MgMTsgPGRhdGE+IFNUXG4gICAqIE5vdGU6IEljb24gbmFtZSBpcyBub3QgZXhwb3NlZC5cbiAgICovXG4gIHB1YmxpYyBzZXRJY29uTmFtZShkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aGlzLl9pY29uTmFtZSA9IGRhdGE7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDQ7IDxudW0+IDsgPHRleHQ+IFNUIChzZXQgQU5TSSBjb2xvciA8bnVtPiB0byA8dGV4dD4pXG4gICAqXG4gICAqIEB2dDogI1kgICAgT1NDICAgIDQgICAgXCJTZXQgQU5TSSBjb2xvclwiICAgXCJPU0MgNCA7IGMgOyBzcGVjIEJFTFwiIFwiQ2hhbmdlIGNvbG9yIG51bWJlciBgY2AgdG8gdGhlIGNvbG9yIHNwZWNpZmllZCBieSBgc3BlY2AuXCJcbiAgICogYGNgIGlzIHRoZSBjb2xvciBpbmRleCBiZXR3ZWVuIDAgYW5kIDI1NS4gVGhlIGNvbG9yIGZvcm1hdCBvZiBgc3BlY2AgaXMgZGVyaXZlZCBmcm9tXG4gICAqIGBYUGFyc2VDb2xvcmAgKHNlZSBPU0MgMTAgZm9yIHN1cHBvcnRlZCBmb3JtYXRzKS4gVGhlcmUgbWF5IGJlIG11bHRpcGUgYGMgOyBzcGVjYCBwYWlycyBwcmVzZW50XG4gICAqIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiBJZiBgc3BlY2AgY29udGFpbnMgYD9gIHRoZSB0ZXJtaW5hbCByZXR1cm5zIGEgc2VxdWVuY2Ugd2l0aCB0aGVcbiAgICogY3VycmVudGx5IHNldCBjb2xvci5cbiAgICovXG4gIHB1YmxpYyBzZXRPclJlcG9ydEluZGV4ZWRDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBldmVudDogSUNvbG9yRXZlbnQgPSBbXTtcbiAgICBjb25zdCBzbG90cyA9IGRhdGEuc3BsaXQoJzsnKTtcbiAgICB3aGlsZSAoc2xvdHMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgaWR4ID0gc2xvdHMuc2hpZnQoKSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBzcGVjID0gc2xvdHMuc2hpZnQoKSBhcyBzdHJpbmc7XG4gICAgICBpZiAoL15cXGQrJC8uZXhlYyhpZHgpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaWR4KTtcbiAgICAgICAgaWYgKGlzVmFsaWRDb2xvckluZGV4KGluZGV4KSkge1xuICAgICAgICAgIGlmIChzcGVjID09PSAnPycpIHtcbiAgICAgICAgICAgIGV2ZW50LnB1c2goeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFUE9SVCwgaW5kZXggfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gcGFyc2VDb2xvcihzcGVjKTtcbiAgICAgICAgICAgIGlmIChjb2xvcikge1xuICAgICAgICAgICAgICBldmVudC5wdXNoKHsgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5TRVQsIGluZGV4LCBjb2xvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fb25Db2xvci5maXJlKGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDggOyA8cGFyYW1zPiA7IDx1cmk+IFNUIC0gY3JlYXRlIGh5cGVybGlua1xuICAgKiBPU0MgOCA7IDsgU1QgLSBmaW5pc2ggaHlwZXJsaW5rXG4gICAqXG4gICAqIFRlc3QgY2FzZTpcbiAgICpcbiAgICogYGBgc2hcbiAgICogcHJpbnRmICdcXGVdODs7aHR0cDovL2V4YW1wbGUuY29tXFxlXFxcXFRoaXMgaXMgYSBsaW5rXFxlXTg7O1xcZVxcXFxcXG4nXG4gICAqIGBgYFxuICAgKlxuICAgKiBAdnQ6ICNZICAgIE9TQyAgICA4ICAgIFwiQ3JlYXRlIGh5cGVybGlua1wiICAgXCJPU0MgOCA7IHBhcmFtcyA7IHVyaSBCRUxcIiBcIkNyZWF0ZSBhIGh5cGVybGluayB0byBgdXJpYCB1c2luZyBgcGFyYW1zYC5cIlxuICAgKiBgdXJpYCBpcyBhIGh5cGVybGluayBzdGFydGluZyB3aXRoIGBodHRwOi8vYCwgYGh0dHBzOi8vYCwgYGZ0cDovL2AsIGBmaWxlOi8vYCBvciBgbWFpbHRvOi8vYC4gYHBhcmFtc2AgaXMgYW5cbiAgICogb3B0aW9uYWwgbGlzdCBvZiBrZXk9dmFsdWUgYXNzaWdubWVudHMsIHNlcGFyYXRlZCBieSB0aGUgOiBjaGFyYWN0ZXIuXG4gICAqIEV4YW1wbGU6IGBpZD14eXoxMjM6Zm9vPWJhcjpiYXo9cXV1eGAuXG4gICAqIEN1cnJlbnRseSBvbmx5IHRoZSBpZCBrZXkgaXMgZGVmaW5lZC4gQ2VsbHMgdGhhdCBzaGFyZSB0aGUgc2FtZSBJRCBhbmQgVVJJIHNoYXJlIGhvdmVyXG4gICAqIGZlZWRiYWNrLiBVc2UgYE9TQyA4IDsgOyBCRUxgIHRvIGZpbmlzaCB0aGUgY3VycmVudCBoeXBlcmxpbmsuXG4gICAqL1xuICBwdWJsaWMgc2V0SHlwZXJsaW5rKGRhdGE6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFyZ3MgPSBkYXRhLnNwbGl0KCc7Jyk7XG4gICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYXJnc1sxXSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUh5cGVybGluayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICB9XG4gICAgaWYgKGFyZ3NbMF0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZpbmlzaEh5cGVybGluaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlSHlwZXJsaW5rKHBhcmFtczogc3RyaW5nLCB1cmk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIEl0J3MgbGVnYWwgdG8gb3BlbiBhIG5ldyBoeXBlcmxpbmsgd2l0aG91dCBleHBsaWNpdGx5IGZpbmlzaGluZyB0aGUgcHJldmlvdXMgb25lXG4gICAgaWYgKHRoaXMuX2dldEN1cnJlbnRMaW5rSWQoKSkge1xuICAgICAgdGhpcy5fZmluaXNoSHlwZXJsaW5rKCk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZFBhcmFtcyA9IHBhcmFtcy5zcGxpdCgnOicpO1xuICAgIGxldCBpZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlkUGFyYW1JbmRleCA9IHBhcnNlZFBhcmFtcy5maW5kSW5kZXgoZSA9PiBlLnN0YXJ0c1dpdGgoJ2lkPScpKTtcbiAgICBpZiAoaWRQYXJhbUluZGV4ICE9PSAtMSkge1xuICAgICAgaWQgPSBwYXJzZWRQYXJhbXNbaWRQYXJhbUluZGV4XS5zbGljZSgzKSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkID0gdGhpcy5fY3VyQXR0ckRhdGEuZXh0ZW5kZWQuY2xvbmUoKTtcbiAgICB0aGlzLl9jdXJBdHRyRGF0YS5leHRlbmRlZC51cmxJZCA9IHRoaXMuX29zY0xpbmtTZXJ2aWNlLnJlZ2lzdGVyTGluayh7IGlkLCB1cmkgfSk7XG4gICAgdGhpcy5fY3VyQXR0ckRhdGEudXBkYXRlRXh0ZW5kZWQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmlzaEh5cGVybGluaygpOiBib29sZWFuIHtcbiAgICB0aGlzLl9jdXJBdHRyRGF0YS5leHRlbmRlZCA9IHRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkLmNsb25lKCk7XG4gICAgdGhpcy5fY3VyQXR0ckRhdGEuZXh0ZW5kZWQudXJsSWQgPSAwO1xuICAgIHRoaXMuX2N1ckF0dHJEYXRhLnVwZGF0ZUV4dGVuZGVkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBzcGVjaWFsIGNvbG9ycyAtIE9TQyAxMCB8IDExIHwgMTJcbiAgcHJpdmF0ZSBfc3BlY2lhbENvbG9ycyA9IFtTcGVjaWFsQ29sb3JJbmRleC5GT1JFR1JPVU5ELCBTcGVjaWFsQ29sb3JJbmRleC5CQUNLR1JPVU5ELCBTcGVjaWFsQ29sb3JJbmRleC5DVVJTT1JdO1xuXG4gIC8qKlxuICAgKiBBcHBseSBjb2xvcnMgcmVxdWVzdHMgZm9yIHNwZWNpYWwgY29sb3JzIGluIE9TQyAxMCB8IDExIHwgMTIuXG4gICAqIFNpbmNlIHRoZXNlIGNvbW1hbmRzIGFyZSBzdGFja2luZyBmcm9tIG11bHRpcGxlIHBhcmFtZXRlcnMsXG4gICAqIHdlIGhhbmRsZSB0aGVtIGluIGEgbG9vcCB3aXRoIGFuIGVudHJ5IG9mZnNldCB0byBgX3NwZWNpYWxDb2xvcnNgLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0T3JSZXBvcnRTcGVjaWFsQ29sb3IoZGF0YTogc3RyaW5nLCBvZmZzZXQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNsb3RzID0gZGF0YS5zcGxpdCgnOycpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xvdHMubGVuZ3RoOyArK2ksICsrb2Zmc2V0KSB7XG4gICAgICBpZiAob2Zmc2V0ID49IHRoaXMuX3NwZWNpYWxDb2xvcnMubGVuZ3RoKSBicmVhaztcbiAgICAgIGlmIChzbG90c1tpXSA9PT0gJz8nKSB7XG4gICAgICAgIHRoaXMuX29uQ29sb3IuZmlyZShbeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFUE9SVCwgaW5kZXg6IHRoaXMuX3NwZWNpYWxDb2xvcnNbb2Zmc2V0XSB9XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2xvciA9IHBhcnNlQ29sb3Ioc2xvdHNbaV0pO1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICB0aGlzLl9vbkNvbG9yLmZpcmUoW3sgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5TRVQsIGluZGV4OiB0aGlzLl9zcGVjaWFsQ29sb3JzW29mZnNldF0sIGNvbG9yIH1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0MgMTAgOyA8eGNvbG9yIG5hbWU+fDw/PiBTVCAtIHNldCBvciBxdWVyeSBkZWZhdWx0IGZvcmVncm91bmQgY29sb3JcbiAgICpcbiAgICogQHZ0OiAjWSAgT1NDICAgMTAgICAgXCJTZXQgb3IgcXVlcnkgZGVmYXVsdCBmb3JlZ3JvdW5kIGNvbG9yXCIgICBcIk9TQyAxMCA7IFB0IEJFTFwiICBcIlNldCBvciBxdWVyeSBkZWZhdWx0IGZvcmVncm91bmQgY29sb3IuXCJcbiAgICogVG8gc2V0IHRoZSBjb2xvciwgdGhlIGZvbGxvd2luZyBjb2xvciBzcGVjaWZpY2F0aW9uIGZvcm1hdHMgYXJlIHN1cHBvcnRlZDpcbiAgICogLSBgcmdiOjxyZWQ+LzxncmVlbj4vPGJsdWU+YCBmb3IgIGA8cmVkPiwgPGdyZWVuPiwgPGJsdWU+YCBpbiBgaCB8IGhoIHwgaGhoIHwgaGhoaGAsIHdoZXJlXG4gICAqICAgYGhgIGlzIGEgc2luZ2xlIGhleGFkZWNpbWFsIGRpZ2l0IChjYXNlIGluc2lnbmlmaWNhbnQpLiBUaGUgZGlmZmVyZW50IHdpZHRocyBzY2FsZVxuICAgKiAgIGZyb20gNCBiaXQgKGBoYCkgdG8gMTYgYml0IChgaGhoaGApIGFuZCBnZXQgY29udmVydGVkIHRvIDggYml0IChgaGhgKS5cbiAgICogLSBgI1JHQmAgLSA0IGJpdHMgcGVyIGNoYW5uZWwsIGV4cGFuZGVkIHRvIGAjUjBHMEIwYFxuICAgKiAtIGAjUlJHR0JCYCAtIDggYml0cyBwZXIgY2hhbm5lbFxuICAgKiAtIGAjUlJSR0dHQkJCYCAtIDEyIGJpdHMgcGVyIGNoYW5uZWwsIHRydW5jYXRlZCB0byBgI1JSR0dCQmBcbiAgICogLSBgI1JSUlJHR0dHQkJCQmAgLSAxNiBiaXRzIHBlciBjaGFubmVsLCB0cnVuY2F0ZWQgdG8gYCNSUkdHQkJgXG4gICAqXG4gICAqICoqTm90ZToqKiBYMTEgbmFtZWQgY29sb3JzIGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuXG4gICAqXG4gICAqIElmIGBQdGAgY29udGFpbnMgYD9gIGluc3RlYWQgb2YgYSBjb2xvciBzcGVjaWZpY2F0aW9uLCB0aGUgdGVybWluYWxcbiAgICogcmV0dXJucyBhIHNlcXVlbmNlIHdpdGggdGhlIGN1cnJlbnQgZGVmYXVsdCBmb3JlZ3JvdW5kIGNvbG9yXG4gICAqICh1c2UgdGhhdCBzZXF1ZW5jZSB0byByZXN0b3JlIHRoZSBjb2xvciBhZnRlciBjaGFuZ2VzKS5cbiAgICpcbiAgICogKipOb3RlOioqIE90aGVyIHRoYW4geHRlcm0sIHh0ZXJtLmpzIGRvZXMgbm90IHN1cHBvcnQgT1NDIDEyIC0gMTkuXG4gICAqIFRoZXJlZm9yZSBzdGFja2luZyBtdWx0aXBsZSBgUHRgIHNlcGFyYXRlZCBieSBgO2Agb25seSB3b3JrcyBmb3IgdGhlIGZpcnN0IHR3byBlbnRyaWVzLlxuICAgKi9cbiAgcHVibGljIHNldE9yUmVwb3J0RmdDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0T3JSZXBvcnRTcGVjaWFsQ29sb3IoZGF0YSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDExIDsgPHhjb2xvciBuYW1lPnw8Pz4gU1QgLSBzZXQgb3IgcXVlcnkgZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yXG4gICAqXG4gICAqIEB2dDogI1kgIE9TQyAgIDExICAgIFwiU2V0IG9yIHF1ZXJ5IGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvclwiICAgXCJPU0MgMTEgOyBQdCBCRUxcIiAgXCJTYW1lIGFzIE9TQyAxMCwgYnV0IGZvciBkZWZhdWx0IGJhY2tncm91bmQuXCJcbiAgICovXG4gIHB1YmxpYyBzZXRPclJlcG9ydEJnQ29sb3IoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldE9yUmVwb3J0U3BlY2lhbENvbG9yKGRhdGEsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9TQyAxMiA7IDx4Y29sb3IgbmFtZT58PD8+IFNUIC0gc2V0IG9yIHF1ZXJ5IGRlZmF1bHQgY3Vyc29yIGNvbG9yXG4gICAqXG4gICAqIEB2dDogI1kgIE9TQyAgIDEyICAgIFwiU2V0IG9yIHF1ZXJ5IGRlZmF1bHQgY3Vyc29yIGNvbG9yXCIgICBcIk9TQyAxMiA7IFB0IEJFTFwiICBcIlNhbWUgYXMgT1NDIDEwLCBidXQgZm9yIGRlZmF1bHQgY3Vyc29yIGNvbG9yLlwiXG4gICAqL1xuICBwdWJsaWMgc2V0T3JSZXBvcnRDdXJzb3JDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0T3JSZXBvcnRTcGVjaWFsQ29sb3IoZGF0YSwgMik7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDEwNCA7IDxudW0+IFNUIC0gcmVzdG9yZSBBTlNJIGNvbG9yIDxudW0+XG4gICAqXG4gICAqIEB2dDogI1kgIE9TQyAgIDEwNCAgICBcIlJlc2V0IEFOU0kgY29sb3JcIiAgIFwiT1NDIDEwNCA7IGMgQkVMXCIgXCJSZXNldCBjb2xvciBudW1iZXIgYGNgIHRvIHRoZW1lZCBjb2xvci5cIlxuICAgKiBgY2AgaXMgdGhlIGNvbG9yIGluZGV4IGJldHdlZW4gMCBhbmQgMjU1LiBUaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSBkZWZhdWx0IGNvbG9yIGZvciBgY2AgYXNcbiAgICogc3BlY2lmaWVkIGJ5IHRoZSBsb2FkZWQgdGhlbWUuIEFueSBudW1iZXIgb2YgYGNgIHBhcmFtZXRlcnMgbWF5IGJlIGdpdmVuLlxuICAgKiBJZiBubyBwYXJhbWV0ZXJzIGFyZSBnaXZlbiwgdGhlIGVudGlyZSBpbmRleGVkIGNvbG9yIHRhYmxlIHdpbGwgYmUgcmVzZXQuXG4gICAqL1xuICBwdWJsaWMgcmVzdG9yZUluZGV4ZWRDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHRoaXMuX29uQ29sb3IuZmlyZShbeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFU1RPUkUgfV0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50OiBJQ29sb3JFdmVudCA9IFtdO1xuICAgIGNvbnN0IHNsb3RzID0gZGF0YS5zcGxpdCgnOycpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xvdHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICgvXlxcZCskLy5leGVjKHNsb3RzW2ldKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHNsb3RzW2ldKTtcbiAgICAgICAgaWYgKGlzVmFsaWRDb2xvckluZGV4KGluZGV4KSkge1xuICAgICAgICAgIGV2ZW50LnB1c2goeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFU1RPUkUsIGluZGV4IH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChldmVudC5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX29uQ29sb3IuZmlyZShldmVudCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9TQyAxMTAgU1QgLSByZXN0b3JlIGRlZmF1bHQgZm9yZWdyb3VuZCBjb2xvclxuICAgKlxuICAgKiBAdnQ6ICNZICBPU0MgICAxMTAgICAgXCJSZXN0b3JlIGRlZmF1bHQgZm9yZWdyb3VuZCBjb2xvclwiICAgXCJPU0MgMTEwIEJFTFwiICBcIlJlc3RvcmUgZGVmYXVsdCBmb3JlZ3JvdW5kIHRvIHRoZW1lZCBjb2xvci5cIlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmVGZ0NvbG9yKGRhdGE6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX29uQ29sb3IuZmlyZShbeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFU1RPUkUsIGluZGV4OiBTcGVjaWFsQ29sb3JJbmRleC5GT1JFR1JPVU5EIH1dKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0MgMTExIFNUIC0gcmVzdG9yZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3JcbiAgICpcbiAgICogQHZ0OiAjWSAgT1NDICAgMTExICAgIFwiUmVzdG9yZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3JcIiAgIFwiT1NDIDExMSBCRUxcIiAgXCJSZXN0b3JlIGRlZmF1bHQgYmFja2dyb3VuZCB0byB0aGVtZWQgY29sb3IuXCJcbiAgICovXG4gIHB1YmxpYyByZXN0b3JlQmdDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aGlzLl9vbkNvbG9yLmZpcmUoW3sgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5SRVNUT1JFLCBpbmRleDogU3BlY2lhbENvbG9ySW5kZXguQkFDS0dST1VORCB9XSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDExMiBTVCAtIHJlc3RvcmUgZGVmYXVsdCBjdXJzb3IgY29sb3JcbiAgICpcbiAgICogQHZ0OiAjWSAgT1NDICAgMTEyICAgIFwiUmVzdG9yZSBkZWZhdWx0IGN1cnNvciBjb2xvclwiICAgXCJPU0MgMTEyIEJFTFwiICBcIlJlc3RvcmUgZGVmYXVsdCBjdXJzb3IgdG8gdGhlbWVkIGNvbG9yLlwiXG4gICAqL1xuICBwdWJsaWMgcmVzdG9yZUN1cnNvckNvbG9yKGRhdGE6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX29uQ29sb3IuZmlyZShbeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFU1RPUkUsIGluZGV4OiBTcGVjaWFsQ29sb3JJbmRleC5DVVJTT1IgfV0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVTQyBFXG4gICAqIEMxLk5FTFxuICAgKiAgIERFQyBtbmVtb25pYzogTkVMIChodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0NTEwLXJtL05FTClcbiAgICogICBNb3ZlcyBjdXJzb3IgdG8gZmlyc3QgcG9zaXRpb24gb24gbmV4dCBsaW5lLlxuICAgKlxuICAgKiBAdnQ6ICNZICAgQzEgICAgTkVMICAgXCJOZXh0IExpbmVcIiAgIFwiXFx4ODVcIiAgICBcIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHJvdy5cIlxuICAgKiBAdnQ6ICNZICAgRVNDICAgTkVMICAgXCJOZXh0IExpbmVcIiAgIFwiRVNDIEVcIiAgIFwiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcm93LlwiXG4gICAqL1xuICBwdWJsaWMgbmV4dExpbmUoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSAwO1xuICAgIHRoaXMuaW5kZXgoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgPVxuICAgKiAgIERFQyBtbmVtb25pYzogREVDS1BBTSAoaHR0cHM6Ly92dDEwMC5uZXQvZG9jcy92dDUxMC1ybS9ERUNLUEFNLmh0bWwpXG4gICAqICAgRW5hYmxlcyB0aGUgbnVtZXJpYyBrZXlwYWQgdG8gc2VuZCBhcHBsaWNhdGlvbiBzZXF1ZW5jZXMgdG8gdGhlIGhvc3QuXG4gICAqL1xuICBwdWJsaWMga2V5cGFkQXBwbGljYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1NlcmlhbCBwb3J0IHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBrZXlwYWQuJyk7XG4gICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uS2V5cGFkID0gdHJ1ZTtcbiAgICB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmZpcmUoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgPlxuICAgKiAgIERFQyBtbmVtb25pYzogREVDS1BOTSAoaHR0cHM6Ly92dDEwMC5uZXQvZG9jcy92dDUxMC1ybS9ERUNLUE5NLmh0bWwpXG4gICAqICAgRW5hYmxlcyB0aGUga2V5cGFkIHRvIHNlbmQgbnVtZXJpYyBjaGFyYWN0ZXJzIHRvIHRoZSBob3N0LlxuICAgKi9cbiAgcHVibGljIGtleXBhZE51bWVyaWNNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1N3aXRjaGluZyBiYWNrIHRvIG5vcm1hbCBrZXlwYWQuJyk7XG4gICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uS2V5cGFkID0gZmFsc2U7XG4gICAgdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRVNDICUgQFxuICAgKiBFU0MgJSBHXG4gICAqICAgU2VsZWN0IGRlZmF1bHQgY2hhcmFjdGVyIHNldC4gVVRGLTggaXMgbm90IHN1cHBvcnRlZCAoc3RyaW5nIGFyZSB1bmljb2RlIGFueXdheXMpXG4gICAqICAgdGhlcmVmb3JlIEVTQyAlIEcgZG9lcyB0aGUgc2FtZS5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3REZWZhdWx0Q2hhcnNldCgpOiBib29sZWFuIHtcbiAgICB0aGlzLl9jaGFyc2V0U2VydmljZS5zZXRnTGV2ZWwoMCk7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoMCwgREVGQVVMVF9DSEFSU0VUKTsgLy8gVVMgKGRlZmF1bHQpXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRVNDICggQ1xuICAgKiAgIERlc2lnbmF0ZSBHMCBDaGFyYWN0ZXIgU2V0LCBWVDEwMCwgSVNPIDIwMjIuXG4gICAqIEVTQyApIENcbiAgICogICBEZXNpZ25hdGUgRzEgQ2hhcmFjdGVyIFNldCAoSVNPIDIwMjIsIFZUMTAwKS5cbiAgICogRVNDICogQ1xuICAgKiAgIERlc2lnbmF0ZSBHMiBDaGFyYWN0ZXIgU2V0IChJU08gMjAyMiwgVlQyMjApLlxuICAgKiBFU0MgKyBDXG4gICAqICAgRGVzaWduYXRlIEczIENoYXJhY3RlciBTZXQgKElTTyAyMDIyLCBWVDIyMCkuXG4gICAqIEVTQyAtIENcbiAgICogICBEZXNpZ25hdGUgRzEgQ2hhcmFjdGVyIFNldCAoVlQzMDApLlxuICAgKiBFU0MgLiBDXG4gICAqICAgRGVzaWduYXRlIEcyIENoYXJhY3RlciBTZXQgKFZUMzAwKS5cbiAgICogRVNDIC8gQ1xuICAgKiAgIERlc2lnbmF0ZSBHMyBDaGFyYWN0ZXIgU2V0IChWVDMwMCkuIEMgPSBBICAtPiBJU08gTGF0aW4tMSBTdXBwbGVtZW50YWwuIC0gU3VwcG9ydGVkP1xuICAgKi9cbiAgcHVibGljIHNlbGVjdENoYXJzZXQoY29sbGVjdEFuZEZsYWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChjb2xsZWN0QW5kRmxhZy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdENoYXJzZXQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29sbGVjdEFuZEZsYWdbMF0gPT09ICcvJykge1xuICAgICAgcmV0dXJuIHRydWU7ICAvLyBUT0RPOiBJcyB0aGlzIHN1cHBvcnRlZD9cbiAgICB9XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoR0xFVkVMW2NvbGxlY3RBbmRGbGFnWzBdXSwgQ0hBUlNFVFNbY29sbGVjdEFuZEZsYWdbMV1dIHx8IERFRkFVTFRfQ0hBUlNFVCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRVNDIERcbiAgICogQzEuSU5EXG4gICAqICAgREVDIG1uZW1vbmljOiBJTkQgKGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQ1MTAtcm0vSU5ELmh0bWwpXG4gICAqICAgTW92ZXMgdGhlIGN1cnNvciBkb3duIG9uZSBsaW5lIGluIHRoZSBzYW1lIGNvbHVtbi5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMxICAgIElORCAgIFwiSW5kZXhcIiAgIFwiXFx4ODRcIiAgICBcIk1vdmUgdGhlIGN1cnNvciBvbmUgbGluZSBkb3duIHNjcm9sbGluZyBpZiBuZWVkZWQuXCJcbiAgICogQHZ0OiAjWSAgIEVTQyAgIElORCAgIFwiSW5kZXhcIiAgIFwiRVNDIERcIiAgIFwiTW92ZSB0aGUgY3Vyc29yIG9uZSBsaW5lIGRvd24gc2Nyb2xsaW5nIGlmIG5lZWRlZC5cIlxuICAgKi9cbiAgcHVibGljIGluZGV4KCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkrKztcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPT09IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gKyAxKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueS0tO1xuICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID49IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cykge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxO1xuICAgIH1cbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVTQyBIXG4gICAqIEMxLkhUU1xuICAgKiAgIERFQyBtbmVtb25pYzogSFRTIChodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0NTEwLXJtL0hUUy5odG1sKVxuICAgKiAgIFNldHMgYSBob3Jpem9udGFsIHRhYiBzdG9wIGF0IHRoZSBjb2x1bW4gcG9zaXRpb24gaW5kaWNhdGVkIGJ5XG4gICAqICAgdGhlIHZhbHVlIG9mIHRoZSBhY3RpdmUgY29sdW1uIHdoZW4gdGhlIHRlcm1pbmFsIHJlY2VpdmVzIGFuIEhUUy5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMxICAgIEhUUyAgIFwiSG9yaXpvbnRhbCBUYWJ1bGF0aW9uIFNldFwiIFwiXFx4ODhcIiAgICBcIlBsYWNlcyBhIHRhYiBzdG9wIGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi5cIlxuICAgKiBAdnQ6ICNZICAgRVNDICAgSFRTICAgXCJIb3Jpem9udGFsIFRhYnVsYXRpb24gU2V0XCIgXCJFU0MgSFwiICAgXCJQbGFjZXMgYSB0YWIgc3RvcCBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uXCJcbiAgICovXG4gIHB1YmxpYyB0YWJTZXQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnRhYnNbdGhpcy5fYWN0aXZlQnVmZmVyLnhdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgTVxuICAgKiBDMS5SSVxuICAgKiAgIERFQyBtbmVtb25pYzogSFRTXG4gICAqICAgTW92ZXMgdGhlIGN1cnNvciB1cCBvbmUgbGluZSBpbiB0aGUgc2FtZSBjb2x1bW4uIElmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHRvcCBtYXJnaW4sXG4gICAqICAgdGhlIHBhZ2Ugc2Nyb2xscyBkb3duLlxuICAgKlxuICAgKiBAdnQ6ICNZIEVTQyAgSVIgXCJSZXZlcnNlIEluZGV4XCIgXCJFU0MgTVwiICBcIk1vdmUgdGhlIGN1cnNvciBvbmUgbGluZSB1cCBzY3JvbGxpbmcgaWYgbmVlZGVkLlwiXG4gICAqL1xuICBwdWJsaWMgcmV2ZXJzZUluZGV4KCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID09PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wKSB7XG4gICAgICAvLyBwb3NzaWJseSBtb3ZlIHRoZSBjb2RlIGJlbG93IHRvIHRlcm0ucmV2ZXJzZVNjcm9sbCgpO1xuICAgICAgLy8gdGVzdDogZWNobyAtbmUgJ1xcZVsxOzFIXFxlWzQ0bVxcZU1cXGVbMG0nXG4gICAgICAvLyBibGFua0xpbmUodHJ1ZSkgaXMgeHRlcm0vbGludXggYmVoYXZpb3JcbiAgICAgIGNvbnN0IHNjcm9sbFJlZ2lvbkhlaWdodCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gLSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wO1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnNoaWZ0RWxlbWVudHModGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnksIHNjcm9sbFJlZ2lvbkhlaWdodCwgMSk7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55LCB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0QmxhbmtMaW5lKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSkpO1xuICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueS0tO1xuICAgICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTsgLy8gcXVpY2tmaXggdG8gbm90IHJ1biBvdXQgb2YgYm91bmRzXG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVTQyBjXG4gICAqICAgREVDIG1uZW1vbmljOiBSSVMgKGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQ1MTAtcm0vUklTLmh0bWwpXG4gICAqICAgUmVzZXQgdG8gaW5pdGlhbCBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBmdWxsUmVzZXQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcGFyc2VyLnJlc2V0KCk7XG4gICAgdGhpcy5fb25SZXF1ZXN0UmVzZXQuZmlyZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2N1ckF0dHJEYXRhID0gREVGQVVMVF9BVFRSX0RBVEEuY2xvbmUoKTtcbiAgICB0aGlzLl9lcmFzZUF0dHJEYXRhSW50ZXJuYWwgPSBERUZBVUxUX0FUVFJfREFUQS5jbG9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGJhY2tfY29sb3JfZXJhc2UgZmVhdHVyZSBmb3IgeHRlcm0uXG4gICAqL1xuICBwcml2YXRlIF9lcmFzZUF0dHJEYXRhKCk6IElBdHRyaWJ1dGVEYXRhIHtcbiAgICB0aGlzLl9lcmFzZUF0dHJEYXRhSW50ZXJuYWwuYmcgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCAweEZGRkZGRik7XG4gICAgdGhpcy5fZXJhc2VBdHRyRGF0YUludGVybmFsLmJnIHw9IHRoaXMuX2N1ckF0dHJEYXRhLmJnICYgfjB4RkMwMDAwMDA7XG4gICAgcmV0dXJuIHRoaXMuX2VyYXNlQXR0ckRhdGFJbnRlcm5hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgblxuICAgKiBFU0Mgb1xuICAgKiBFU0MgfFxuICAgKiBFU0MgfVxuICAgKiBFU0MgflxuICAgKiAgIERFQyBtbmVtb25pYzogTFMgKGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQ1MTAtcm0vTFMuaHRtbClcbiAgICogICBXaGVuIHlvdSB1c2UgYSBsb2NraW5nIHNoaWZ0LCB0aGUgY2hhcmFjdGVyIHNldCByZW1haW5zIGluIEdMIG9yIEdSIHVudGlsXG4gICAqICAgeW91IHVzZSBhbm90aGVyIGxvY2tpbmcgc2hpZnQuIChwYXJ0bHkgc3VwcG9ydGVkKVxuICAgKi9cbiAgcHVibGljIHNldGdMZXZlbChsZXZlbDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0xldmVsKGxldmVsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgIyA4XG4gICAqICAgREVDIG1uZW1vbmljOiBERUNBTE4gKGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQ1MTAtcm0vREVDQUxOLmh0bWwpXG4gICAqICAgVGhpcyBjb250cm9sIGZ1bmN0aW9uIGZpbGxzIHRoZSBjb21wbGV0ZSBzY3JlZW4gYXJlYSB3aXRoXG4gICAqICAgYSB0ZXN0IHBhdHRlcm4gKEUpIHVzZWQgZm9yIGFkanVzdGluZyBzY3JlZW4gYWxpZ25tZW50LlxuICAgKlxuICAgKiBAdnQ6ICNZICAgRVNDICAgREVDQUxOICAgXCJTY3JlZW4gQWxpZ25tZW50IFBhdHRlcm5cIiAgXCJFU0MgIyA4XCIgIFwiRmlsbCB2aWV3cG9ydCB3aXRoIGEgdGVzdCBwYXR0ZXJuIChFKS5cIlxuICAgKi9cbiAgcHVibGljIHNjcmVlbkFsaWdubWVudFBhdHRlcm4oKTogYm9vbGVhbiB7XG4gICAgLy8gcHJlcGFyZSBjZWxsIGRhdGFcbiAgICBjb25zdCBjZWxsID0gbmV3IENlbGxEYXRhKCk7XG4gICAgY2VsbC5jb250ZW50ID0gMSA8PCBDb250ZW50LldJRFRIX1NISUZUIHwgJ0UnLmNoYXJDb2RlQXQoMCk7XG4gICAgY2VsbC5mZyA9IHRoaXMuX2N1ckF0dHJEYXRhLmZnO1xuICAgIGNlbGwuYmcgPSB0aGlzLl9jdXJBdHRyRGF0YS5iZztcblxuXG4gICAgdGhpcy5fc2V0Q3Vyc29yKDAsIDApO1xuICAgIGZvciAobGV0IHlPZmZzZXQgPSAwOyB5T2Zmc2V0IDwgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzOyArK3lPZmZzZXQpIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ICsgeU9mZnNldDtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHJvdyk7XG4gICAgICBpZiAobGluZSkge1xuICAgICAgICBsaW5lLmZpbGwoY2VsbCk7XG4gICAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrQWxsRGlydHkoKTtcbiAgICB0aGlzLl9zZXRDdXJzb3IoMCwgMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBEQ1MgJCBxIFB0IFNUXG4gICAqICAgREVDUlFTUyAoaHR0cHM6Ly92dDEwMC5uZXQvZG9jcy92dDUxMC1ybS9ERUNSUVNTLmh0bWwpXG4gICAqICAgUmVxdWVzdCBTdGF0dXMgU3RyaW5nIChERUNSUVNTKSwgVlQ0MjAgYW5kIHVwLlxuICAgKiAgIFJlc3BvbnNlOiBERUNSUFNTIChodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0NTEwLXJtL0RFQ1JQU1MuaHRtbClcbiAgICpcbiAgICogQHZ0OiAjUFtMaW1pdGVkIHN1cHBvcnQsIHNlZSBiZWxvdy5dICBEQ1MgICBERUNSUVNTICAgXCJSZXF1ZXN0IFNlbGVjdGlvbiBvciBTZXR0aW5nXCIgIFwiRENTICQgcSBQdCBTVFwiICAgXCJSZXF1ZXN0IHNldmVyYWwgdGVybWluYWwgc2V0dGluZ3MuXCJcbiAgICogUmVzcG9uc2UgaXMgaW4gdGhlIGZvcm0gYEVTQyBQIDEgJCByIFB0IFNUYCBmb3IgdmFsaWQgcmVxdWVzdHMsIHdoZXJlIGBQdGAgY29udGFpbnMgdGhlXG4gICAqIGNvcnJlc3BvbmRpbmcgQ1NJIHN0cmluZywgYEVTQyBQIDAgU1RgIGZvciBpbnZhbGlkIHJlcXVlc3RzLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQgcmVxdWVzdHMgYW5kIHJlc3BvbnNlczpcbiAgICpcbiAgICogfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlcXVlc3QgICAgICAgICAgIHwgUmVzcG9uc2UgKGBQdGApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAqIHwgR3JhcGhpYyBSZW5kaXRpb24gKFNHUikgICAgICAgICAgfCBgRENTICQgcSBtIFNUYCAgICB8IGFsd2F5cyByZXBvcnRpbmcgYDBtYCAoY3VycmVudGx5IGJyb2tlbikgICAgICAgICAgICAgIHxcbiAgICogfCBUb3AgYW5kIEJvdHRvbSBNYXJnaW5zIChERUNTVEJNKSB8IGBEQ1MgJCBxIHIgU1RgICAgIHwgYFBzIDsgUHMgcmAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IEN1cnNvciBTdHlsZSAoREVDU0NVU1IpICAgICAgICAgIHwgYERDUyAkIHEgU1AgcSBTVGAgfCBgUHMgU1AgcWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgUHJvdGVjdGlvbiBBdHRyaWJ1dGUgKERFQ1NDQSkgICAgfCBgRENTICQgcSBcIiBxIFNUYCAgfCBgUHMgXCIgcWAgKERFQ1NDQSAyIGlzIHJlcG9ydGVkIGFzIFBzID0gMCkgICAgICAgICAgICAgfFxuICAgKiB8IENvbmZvcm1hbmNlIExldmVsIChERUNTQ0wpICAgICAgIHwgYERDUyAkIHEgXCIgcCBTVGAgIHwgYWx3YXlzIHJlcG9ydGluZyBgNjEgOyAxIFwiIHBgIChERUNTQ0wgaXMgdW5zdXBwb3J0ZWQpIHxcbiAgICpcbiAgICpcbiAgICogVE9ETzpcbiAgICogLSBmaXggU0dSIHJlcG9ydFxuICAgKiAtIGVpdGhlciBjaGVjayB3aGljaCBjb25mb3JtYW5jZSBpcyBiZXR0ZXIgc3VpdGVkIG9yIHJlbW92ZSB0aGUgcmVwb3J0IGNvbXBsZXRlbHlcbiAgICogICAtLT4gd2UgYXJlIGN1cnJlbnRseSBhIG1peHR1cmUgb2YgYWxsIHVwIHRvIFZUNDAwIGJ1dCBkb250IGZvbGxvdyBhbnlvbmUgc3RyaWN0bHlcbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0U3RhdHVzU3RyaW5nKGRhdGE6IHN0cmluZywgcGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZiA9IChzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfSR7c30ke0MwLkVTQ31cXFxcYCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLy8gYWNjZXNzIGhlbHBlcnNcbiAgICBjb25zdCBiID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnM7XG4gICAgY29uc3QgU1RZTEVTOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0geyAnYmxvY2snOiAyLCAndW5kZXJsaW5lJzogNCwgJ2Jhcic6IDYgfTtcblxuICAgIGlmIChkYXRhID09PSAnXCJxJykgcmV0dXJuIGYoYFAxJHIke3RoaXMuX2N1ckF0dHJEYXRhLmlzUHJvdGVjdGVkKCkgPyAxIDogMH1cInFgKTtcbiAgICBpZiAoZGF0YSA9PT0gJ1wicCcpIHJldHVybiBmKGBQMSRyNjE7MVwicGApO1xuICAgIGlmIChkYXRhID09PSAncicpIHJldHVybiBmKGBQMSRyJHtiLnNjcm9sbFRvcCArIDF9OyR7Yi5zY3JvbGxCb3R0b20gKyAxfXJgKTtcbiAgICAvLyBGSVhNRTogcmVwb3J0IHJlYWwgU0dSIHNldHRpbmdzIGluc3RlYWQgb2YgMG1cbiAgICBpZiAoZGF0YSA9PT0gJ20nKSByZXR1cm4gZihgUDEkcjBtYCk7XG4gICAgaWYgKGRhdGEgPT09ICcgcScpIHJldHVybiBmKGBQMSRyJHtTVFlMRVNbb3B0cy5jdXJzb3JTdHlsZV0gLSAob3B0cy5jdXJzb3JCbGluayA/IDEgOiAwKX0gcWApO1xuICAgIHJldHVybiBmKGBQMCRyYCk7XG4gIH1cblxuICBwdWJsaWMgbWFya1JhbmdlRGlydHkoeTE6IG51bWJlciwgeTI6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh5MSwgeTIpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpcnR5Um93VHJhY2tlciB7XG4gIHJlYWRvbmx5IHN0YXJ0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGVuZDogbnVtYmVyO1xuXG4gIGNsZWFyUmFuZ2UoKTogdm9pZDtcbiAgbWFya0RpcnR5KHk6IG51bWJlcik6IHZvaWQ7XG4gIG1hcmtSYW5nZURpcnR5KHkxOiBudW1iZXIsIHkyOiBudW1iZXIpOiB2b2lkO1xuICBtYXJrQWxsRGlydHkoKTogdm9pZDtcbn1cblxuY2xhc3MgRGlydHlSb3dUcmFja2VyIGltcGxlbWVudHMgSURpcnR5Um93VHJhY2tlciB7XG4gIHB1YmxpYyBzdGFydCE6IG51bWJlcjtcbiAgcHVibGljIGVuZCE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5jbGVhclJhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJSYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0ID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueTtcbiAgICB0aGlzLmVuZCA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnk7XG4gIH1cblxuICBwdWJsaWMgbWFya0RpcnR5KHk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh5IDwgdGhpcy5zdGFydCkge1xuICAgICAgdGhpcy5zdGFydCA9IHk7XG4gICAgfSBlbHNlIGlmICh5ID4gdGhpcy5lbmQpIHtcbiAgICAgIHRoaXMuZW5kID0geTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbWFya1JhbmdlRGlydHkoeTE6IG51bWJlciwgeTI6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh5MSA+IHkyKSB7XG4gICAgICAkdGVtcCA9IHkxO1xuICAgICAgeTEgPSB5MjtcbiAgICAgIHkyID0gJHRlbXA7XG4gICAgfVxuICAgIGlmICh5MSA8IHRoaXMuc3RhcnQpIHtcbiAgICAgIHRoaXMuc3RhcnQgPSB5MTtcbiAgICB9XG4gICAgaWYgKHkyID4gdGhpcy5lbmQpIHtcbiAgICAgIHRoaXMuZW5kID0geTI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1hcmtBbGxEaXJ0eSgpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtSYW5nZURpcnR5KDAsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRDb2xvckluZGV4KHZhbHVlOiBudW1iZXIpOiB2YWx1ZSBpcyBDb2xvckluZGV4IHtcbiAgcmV0dXJuIDAgPD0gdmFsdWUgJiYgdmFsdWUgPCAyNTY7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgbWFuYWdpbmcgdGhlIGxpZmVjeWNsZSBvZiBhblxuICogb2JqZWN0IGFuZCBpdHMgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByb3RlY3RlZCBfZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pc0Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QsIHRyaWdnZXJpbmcgdGhlIGBkaXNwb3NlYCBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSURpc3Bvc2FibGVzLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBkIG9mIHRoaXMuX2Rpc3Bvc2FibGVzKSB7XG4gICAgICBkLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdC5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBkaXNwb3NhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IFQge1xuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnB1c2goZCk7XG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBkaXNwb3NhYmxlIG9iamVjdCBpZiBpdCBoYXMgYmVlbiByZWdpc3RlcmVkLCBpZiBub3QgZG9cbiAgICogbm90aGluZy5cbiAgICogQHBhcmFtIGQgVGhlIGRpc3Bvc2FibGUgdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyPFQgZXh0ZW5kcyBJRGlzcG9zYWJsZT4oZDogVCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZGlzcG9zYWJsZXMuaW5kZXhPZihkKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9kaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXV0YWJsZURpc3Bvc2FibGU8VCBleHRlbmRzIElEaXNwb3NhYmxlPiBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSBfdmFsdWU/OiBUO1xuICBwcml2YXRlIF9pc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQgPyB1bmRlZmluZWQgOiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSwgZGlzcG9zaW5nIG9mIHRoZSBvbGQgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHZhbHVlID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZWQgdmFsdWUgYW5kIGRpc3Bvc2VzIG9mIHRoZSBwcmV2aW91c2x5IHN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5fdmFsdWU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXAgYSBmdW5jdGlvbiBpbiBhIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGUoZjogKCkgPT4gdm9pZCk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogZiB9O1xufVxuXG4vKipcbiAqIERpc3Bvc2Ugb2YgYWxsIGRpc3Bvc2FibGVzIGluIGFuIGFycmF5IGFuZCBzZXQgaXRzIGxlbmd0aCB0byAwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZUFycmF5KGRpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZCBvZiBkaXNwb3NhYmxlcykge1xuICAgIGQuZGlzcG9zZSgpO1xuICB9XG4gIGRpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgdGhhdCB3aWxsIGRpc3Bvc2Ugb2YgYW4gYXJyYXkgb2YgZGlzcG9zYWJsZXMgd2hlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUoYXJyYXk6IElEaXNwb3NhYmxlW10pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGRpc3Bvc2VBcnJheShhcnJheSkgfTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmV4cG9ydCBjbGFzcyBUd29LZXlNYXA8VEZpcnN0IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUU2Vjb25kIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogeyBbYmc6IHN0cmluZyB8IG51bWJlcl06IHsgW2ZnOiBzdHJpbmcgfCBudW1iZXJdOiBUVmFsdWUgfCB1bmRlZmluZWQgfSB8IHVuZGVmaW5lZCB9ID0ge307XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHZhbHVlOiBUVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2RhdGFbZmlyc3RdKSB7XG4gICAgICB0aGlzLl9kYXRhW2ZpcnN0XSA9IHt9O1xuICAgIH1cbiAgICB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kKTogVFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtmaXJzdCBhcyBzdHJpbmcgfCBudW1iZXJdID8gdGhpcy5fZGF0YVtmaXJzdCBhcyBzdHJpbmcgfCBudW1iZXJdIVtzZWNvbmRdIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRm91cktleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRUaGlyZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVEZvdXJ0aCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFZhbHVlPiB7XG4gIHByaXZhdGUgX2RhdGE6IFR3b0tleU1hcDxURmlyc3QsIFRTZWNvbmQsIFR3b0tleU1hcDxUVGhpcmQsIFRGb3VydGgsIFRWYWx1ZT4+ID0gbmV3IFR3b0tleU1hcCgpO1xuXG4gIHB1YmxpYyBzZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kLCB0aGlyZDogVFRoaXJkLCBmb3VydGg6IFRGb3VydGgsIHZhbHVlOiBUVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpKSB7XG4gICAgICB0aGlzLl9kYXRhLnNldChmaXJzdCwgc2Vjb25kLCBuZXcgVHdvS2V5TWFwKCkpO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhLmdldChmaXJzdCwgc2Vjb25kKSEuc2V0KHRoaXJkLCBmb3VydGgsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kLCB0aGlyZDogVFRoaXJkLCBmb3VydGg6IFRGb3VydGgpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLmdldChmaXJzdCwgc2Vjb25kKT8uZ2V0KHRoaXJkLCBmb3VydGgpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEuY2xlYXIoKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW50ZXJmYWNlIElOYXZpZ2F0b3Ige1xuICB1c2VyQWdlbnQ6IHN0cmluZztcbiAgbGFuZ3VhZ2U6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbn1cblxuLy8gV2UncmUgZGVjbGFyaW5nIGEgbmF2aWdhdG9yIGdsb2JhbCBoZXJlIGFzIHdlIGV4cGVjdCBpdCBpbiBhbGwgcnVudGltZXMgKG5vZGUgYW5kIGJyb3dzZXIpLCBidXRcbi8vIHdlIHdhbnQgdGhpcyBtb2R1bGUgdG8gbGl2ZSBpbiBjb21tb24uXG5kZWNsYXJlIGNvbnN0IG5hdmlnYXRvcjogSU5hdmlnYXRvcjtcbmRlY2xhcmUgY29uc3QgcHJvY2VzczogdW5rbm93bjtcblxuZXhwb3J0IGNvbnN0IGlzTm9kZSA9ICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ3RpdGxlJyBpbiAocHJvY2VzcyBhcyBhbnkpKSA/IHRydWUgOiBmYWxzZTtcbmNvbnN0IHVzZXJBZ2VudCA9IChpc05vZGUpID8gJ25vZGUnIDogbmF2aWdhdG9yLnVzZXJBZ2VudDtcbmNvbnN0IHBsYXRmb3JtID0gKGlzTm9kZSkgPyAnbm9kZScgOiBuYXZpZ2F0b3IucGxhdGZvcm07XG5cbmV4cG9ydCBjb25zdCBpc0ZpcmVmb3ggPSB1c2VyQWdlbnQuaW5jbHVkZXMoJ0ZpcmVmb3gnKTtcbmV4cG9ydCBjb25zdCBpc0xlZ2FjeUVkZ2UgPSB1c2VyQWdlbnQuaW5jbHVkZXMoJ0VkZ2UnKTtcbmV4cG9ydCBjb25zdCBpc1NhZmFyaSA9IC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QodXNlckFnZW50KTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZhcmlWZXJzaW9uKCk6IG51bWJlciB7XG4gIGlmICghaXNTYWZhcmkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBtYWpvclZlcnNpb24gPSB1c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cXC8oXFxkKykvKTtcbiAgaWYgKG1ham9yVmVyc2lvbiA9PT0gbnVsbCB8fCBtYWpvclZlcnNpb24ubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBwYXJzZUludChtYWpvclZlcnNpb25bMV0pO1xufVxuXG4vLyBGaW5kIHRoZSB1c2VycyBwbGF0Zm9ybS4gV2UgdXNlIHRoaXMgdG8gaW50ZXJwcmV0IHRoZSBtZXRhIGtleVxuLy8gYW5kIElTTyB0aGlyZCBsZXZlbCBzaGlmdHMuXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8xOTg3NzkyNC81Nzc1OThcbmV4cG9ydCBjb25zdCBpc01hYyA9IFsnTWFjaW50b3NoJywgJ01hY0ludGVsJywgJ01hY1BQQycsICdNYWM2OEsnXS5pbmNsdWRlcyhwbGF0Zm9ybSk7XG5leHBvcnQgY29uc3QgaXNJcGFkID0gcGxhdGZvcm0gPT09ICdpUGFkJztcbmV4cG9ydCBjb25zdCBpc0lwaG9uZSA9IHBsYXRmb3JtID09PSAnaVBob25lJztcbmV4cG9ydCBjb25zdCBpc1dpbmRvd3MgPSBbJ1dpbmRvd3MnLCAnV2luMTYnLCAnV2luMzInLCAnV2luQ0UnXS5pbmNsdWRlcyhwbGF0Zm9ybSk7XG5leHBvcnQgY29uc3QgaXNMaW51eCA9IHBsYXRmb3JtLmluZGV4T2YoJ0xpbnV4JykgPj0gMDtcbi8vIE5vdGUgdGhhdCB3aGVuIHRoaXMgaXMgdHJ1ZSwgaXNMaW51eCB3aWxsIGFsc28gYmUgdHJ1ZS5cbmV4cG9ydCBjb25zdCBpc0Nocm9tZU9TID0gL1xcYkNyT1NcXGIvLnRlc3QodXNlckFnZW50KTtcbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbi5cbmxldCBpID0gMDtcblxuLyoqXG4gKiBBIGdlbmVyaWMgbGlzdCB0aGF0IGlzIG1haW50YWluZWQgaW4gc29ydGVkIG9yZGVyIGFuZCBhbGxvd3MgdmFsdWVzIHdpdGggZHVwbGljYXRlIGtleXMuIFRoaXNcbiAqIGxpc3QgaXMgYmFzZWQgb24gYmluYXJ5IHNlYXJjaCBhbmQgYXMgc3VjaCBsb2NhdGluZyBhIGtleSB3aWxsIHRha2UgTyhsb2cgbikgYW1vcnRpemVkLCB0aGlzXG4gKiBpbmNsdWRlcyB0aGUgYnkga2V5IGl0ZXJhdG9yLlxuICovXG5leHBvcnQgY2xhc3MgU29ydGVkTGlzdDxUPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FycmF5OiBUW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9nZXRLZXk6ICh2YWx1ZTogVCkgPT4gbnVtYmVyXG4gICkge1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2FycmF5Lmxlbmd0aCA9IDA7XG4gIH1cblxuICBwdWJsaWMgaW5zZXJ0KHZhbHVlOiBUKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGkgPSB0aGlzLl9zZWFyY2godGhpcy5fZ2V0S2V5KHZhbHVlKSk7XG4gICAgdGhpcy5fYXJyYXkuc3BsaWNlKGksIDAsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUodmFsdWU6IFQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHRoaXMuX2dldEtleSh2YWx1ZSk7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGkgPSB0aGlzLl9zZWFyY2goa2V5KTtcbiAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2dldEtleSh0aGlzLl9hcnJheVtpXSkgIT09IGtleSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBkbyB7XG4gICAgICBpZiAodGhpcy5fYXJyYXlbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2FycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpIDwgdGhpcy5fYXJyYXkubGVuZ3RoICYmIHRoaXMuX2dldEtleSh0aGlzLl9hcnJheVtpXSkgPT09IGtleSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljICpnZXRLZXlJdGVyYXRvcihrZXk6IG51bWJlcik6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICAgIGlmICh0aGlzLl9hcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaSA9IHRoaXMuX3NlYXJjaChrZXkpO1xuICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W2ldKSAhPT0ga2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvIHtcbiAgICAgIHlpZWxkIHRoaXMuX2FycmF5W2ldO1xuICAgIH0gd2hpbGUgKCsraSA8IHRoaXMuX2FycmF5Lmxlbmd0aCAmJiB0aGlzLl9nZXRLZXkodGhpcy5fYXJyYXlbaV0pID09PSBrZXkpO1xuICB9XG5cbiAgcHVibGljIGZvckVhY2hCeUtleShrZXk6IG51bWJlciwgY2FsbGJhY2s6ICh2YWx1ZTogVCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaSA9IHRoaXMuX3NlYXJjaChrZXkpO1xuICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W2ldKSAhPT0ga2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvIHtcbiAgICAgIGNhbGxiYWNrKHRoaXMuX2FycmF5W2ldKTtcbiAgICB9IHdoaWxlICgrK2kgPCB0aGlzLl9hcnJheS5sZW5ndGggJiYgdGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W2ldKSA9PT0ga2V5KTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxUPiB7XG4gICAgLy8gRHVwbGljYXRlIHRoZSBhcnJheSB0byBhdm9pZCBpc3N1ZXMgd2hlbiBfYXJyYXkgY2hhbmdlcyB3aGlsZSBpdGVyYXRpbmdcbiAgICByZXR1cm4gWy4uLnRoaXMuX2FycmF5XS52YWx1ZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlYXJjaChrZXk6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IG1pbiA9IDA7XG4gICAgbGV0IG1heCA9IHRoaXMuX2FycmF5Lmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKG1heCA+PSBtaW4pIHtcbiAgICAgIGxldCBtaWQgPSAobWluICsgbWF4KSA+PiAxO1xuICAgICAgY29uc3QgbWlkS2V5ID0gdGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W21pZF0pO1xuICAgICAgaWYgKG1pZEtleSA+IGtleSkge1xuICAgICAgICBtYXggPSBtaWQgLSAxO1xuICAgICAgfSBlbHNlIGlmIChtaWRLZXkgPCBrZXkpIHtcbiAgICAgICAgbWluID0gbWlkICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGtleSBpbiBsaXN0LCB3YWxrIHRvIGxvd2VzdCBkdXBsaWNhdGVcbiAgICAgICAgd2hpbGUgKG1pZCA+IDAgJiYgdGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W21pZCAtIDFdKSA9PT0ga2V5KSB7XG4gICAgICAgICAgbWlkLS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pZDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8ga2V5IG5vdCBpbiBsaXN0XG4gICAgLy8gc3RpbGwgcmV0dXJuIGNsb3Nlc3QgbWluIChhbHNvIHVzZWQgYXMgaW5zZXJ0IHBvc2l0aW9uKVxuICAgIHJldHVybiBtaW47XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gJ2NvbW1vbi9QbGF0Zm9ybSc7XG5cbmludGVyZmFjZSBJVGFza1F1ZXVlIHtcbiAgLyoqXG4gICAqIEFkZHMgYSB0YXNrIHRvIHRoZSBxdWV1ZSB3aGljaCB3aWxsIHJ1biBpbiBhIGZ1dHVyZSBpZGxlIGNhbGxiYWNrLlxuICAgKiBUbyBhdm9pZCBwZXJjZWl2YWJsZSBzdGFsbHMgb24gdGhlIG1haW50aHJlYWQsIHRhc2tzIHdpdGggaGVhdnkgd29ya2xvYWRcbiAgICogc2hvdWxkIHNwbGl0IHRoZWlyIHdvcmsgaW50byBzbWFsbGVyIHBpZWNlcyBhbmQgcmV0dXJuIGB0cnVlYCB0byBnZXRcbiAgICogY2FsbGVkIGFnYWluIHVudGlsIHRoZSB3b3JrIGlzIGRvbmUgKG9uIGZhbHN5IHJldHVybiB2YWx1ZSkuXG4gICAqL1xuICBlbnF1ZXVlKHRhc2s6ICgpID0+IGJvb2xlYW4gfCB2b2lkKTogdm9pZDtcblxuICAvKipcbiAgICogRmx1c2hlcyB0aGUgcXVldWUsIHJ1bm5pbmcgYWxsIHJlbWFpbmluZyB0YXNrcyBzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgZmx1c2goKTogdm9pZDtcblxuICAvKipcbiAgICogQ2xlYXJzIGFueSByZW1haW5pbmcgdGFza3MgZnJvbSB0aGUgcXVldWUsIHRoZXNlIHdpbGwgbm90IGJlIHJ1bi5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJVGFza0RlYWRsaW5lIHtcbiAgdGltZVJlbWFpbmluZygpOiBudW1iZXI7XG59XG50eXBlIENhbGxiYWNrV2l0aERlYWRsaW5lID0gKGRlYWRsaW5lOiBJVGFza0RlYWRsaW5lKSA9PiB2b2lkO1xuXG5hYnN0cmFjdCBjbGFzcyBUYXNrUXVldWUgaW1wbGVtZW50cyBJVGFza1F1ZXVlIHtcbiAgcHJpdmF0ZSBfdGFza3M6ICgoKSA9PiBib29sZWFuIHwgdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIF9pZGxlQ2FsbGJhY2s/OiBudW1iZXI7XG4gIHByaXZhdGUgX2kgPSAwO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBfcmVxdWVzdENhbGxiYWNrKGNhbGxiYWNrOiBDYWxsYmFja1dpdGhEZWFkbGluZSk6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9jYW5jZWxDYWxsYmFjayhpZGVudGlmaWVyOiBudW1iZXIpOiB2b2lkO1xuXG4gIHB1YmxpYyBlbnF1ZXVlKHRhc2s6ICgpID0+IGJvb2xlYW4gfCB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fdGFza3MucHVzaCh0YXNrKTtcbiAgICB0aGlzLl9zdGFydCgpO1xuICB9XG5cbiAgcHVibGljIGZsdXNoKCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLl9pIDwgdGhpcy5fdGFza3MubGVuZ3RoKSB7XG4gICAgICBpZiAoIXRoaXMuX3Rhc2tzW3RoaXMuX2ldKCkpIHtcbiAgICAgICAgdGhpcy5faSsrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lkbGVDYWxsYmFjaykge1xuICAgICAgdGhpcy5fY2FuY2VsQ2FsbGJhY2sodGhpcy5faWRsZUNhbGxiYWNrKTtcbiAgICAgIHRoaXMuX2lkbGVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5faSA9IDA7XG4gICAgdGhpcy5fdGFza3MubGVuZ3RoID0gMDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0YXJ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faWRsZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9pZGxlQ2FsbGJhY2sgPSB0aGlzLl9yZXF1ZXN0Q2FsbGJhY2sodGhpcy5fcHJvY2Vzcy5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wcm9jZXNzKGRlYWRsaW5lOiBJVGFza0RlYWRsaW5lKTogdm9pZCB7XG4gICAgdGhpcy5faWRsZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgIGxldCB0YXNrRHVyYXRpb24gPSAwO1xuICAgIGxldCBsb25nZXN0VGFzayA9IDA7XG4gICAgbGV0IGxhc3REZWFkbGluZVJlbWFpbmluZyA9IGRlYWRsaW5lLnRpbWVSZW1haW5pbmcoKTtcbiAgICBsZXQgZGVhZGxpbmVSZW1haW5pbmcgPSAwO1xuICAgIHdoaWxlICh0aGlzLl9pIDwgdGhpcy5fdGFza3MubGVuZ3RoKSB7XG4gICAgICB0YXNrRHVyYXRpb24gPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKCF0aGlzLl90YXNrc1t0aGlzLl9pXSgpKSB7XG4gICAgICAgIHRoaXMuX2krKztcbiAgICAgIH1cbiAgICAgIC8vIG90aGVyIHRoYW4gcGVyZm9ybWFuY2Uubm93LCBEYXRlLm5vdyBtaWdodCBub3QgYmUgc3RhYmxlIChjaGFuZ2VzIG9uIHdhbGwgY2xvY2sgY2hhbmdlcyksXG4gICAgICAvLyB0aGlzIGlzIG5vdCBhbiBpc3N1ZSBoZXJlIGFzIGEgY2xvY2sgY2hhbmdlIGR1cmluZyBhIHNob3J0IHJ1bm5pbmcgdGFzayBpcyB2ZXJ5IHVubGlrZWx5XG4gICAgICAvLyBpbiBjYXNlIGl0IHN0aWxsIGhhcHBlbmVkIGFuZCBsZWFkcyB0byBuZWdhdGl2ZSBkdXJhdGlvbiwgc2ltcGx5IGFzc3VtZSAxIG1zZWNcbiAgICAgIHRhc2tEdXJhdGlvbiA9IE1hdGgubWF4KDEsIERhdGUubm93KCkgLSB0YXNrRHVyYXRpb24pO1xuICAgICAgbG9uZ2VzdFRhc2sgPSBNYXRoLm1heCh0YXNrRHVyYXRpb24sIGxvbmdlc3RUYXNrKTtcbiAgICAgIC8vIEd1ZXNzIHRoZSBmb2xsb3dpbmcgdGFzayB3aWxsIHRha2UgYSBzaW1pbGFyIHRpbWUgdG8gdGhlIGxvbmdlc3QgdGFzayBpbiB0aGlzIGJhdGNoLCBhbGxvd1xuICAgICAgLy8gYWRkaXRpb25hbCByb29tIHRvIHRyeSBhdm9pZCBleGNlZWRpbmcgdGhlIGRlYWRsaW5lXG4gICAgICBkZWFkbGluZVJlbWFpbmluZyA9IGRlYWRsaW5lLnRpbWVSZW1haW5pbmcoKTtcbiAgICAgIGlmIChsb25nZXN0VGFzayAqIDEuNSA+IGRlYWRsaW5lUmVtYWluaW5nKSB7XG4gICAgICAgIC8vIFdhcm4gd2hlbiB0aGUgdGltZSBleGNlZWRpbmcgdGhlIGRlYWRsaW5lIGlzIG92ZXIgMjBtcywgaWYgdGhpcyBoYXBwZW5zIGluIHByYWN0aWNlIHRoZVxuICAgICAgICAvLyB0YXNrIHNob3VsZCBiZSBzcGxpdCBpbnRvIHN1Yi10YXNrcyB0byBlbnN1cmUgdGhlIFVJIHJlbWFpbnMgcmVzcG9uc2l2ZS5cbiAgICAgICAgaWYgKGxhc3REZWFkbGluZVJlbWFpbmluZyAtIHRhc2tEdXJhdGlvbiA8IC0yMCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgdGFzayBxdWV1ZSBleGNlZWRlZCBhbGxvdHRlZCBkZWFkbGluZSBieSAke01hdGguYWJzKE1hdGgucm91bmQobGFzdERlYWRsaW5lUmVtYWluaW5nIC0gdGFza0R1cmF0aW9uKSl9bXNgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGFydCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0RGVhZGxpbmVSZW1haW5pbmcgPSBkZWFkbGluZVJlbWFpbmluZztcbiAgICB9XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG59XG5cbi8qKlxuICogQSBxdWV1ZSBvZiB0aGF0IHJ1bnMgdGFza3Mgb3ZlciBzZXZlcmFsIHRhc2tzIHZpYSBzZXRUaW1lb3V0LCB0cnlpbmcgdG8gbWFpbnRhaW4gYWJvdmUgNjAgZnJhbWVzXG4gKiBwZXIgc2Vjb25kLiBUaGUgdGFza3Mgd2lsbCBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGVucXVldWVkLCBidXQgdGhleSB3aWxsIHJ1biBzb21lIHRpbWUgbGF0ZXIsXG4gKiBhbmQgY2FyZSBzaG91bGQgYmUgdGFrZW4gdG8gZW5zdXJlIHRoZXkncmUgbm9uLXVyZ2VudCBhbmQgd2lsbCBub3QgaW50cm9kdWNlIHJhY2UgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFByaW9yaXR5VGFza1F1ZXVlIGV4dGVuZHMgVGFza1F1ZXVlIHtcbiAgcHJvdGVjdGVkIF9yZXF1ZXN0Q2FsbGJhY2soY2FsbGJhY2s6IENhbGxiYWNrV2l0aERlYWRsaW5lKTogbnVtYmVyIHtcbiAgICByZXR1cm4gc2V0VGltZW91dCgoKSA9PiBjYWxsYmFjayh0aGlzLl9jcmVhdGVEZWFkbGluZSgxNikpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2FuY2VsQ2FsbGJhY2soaWRlbnRpZmllcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KGlkZW50aWZpZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRGVhZGxpbmUoZHVyYXRpb246IG51bWJlcik6IElUYXNrRGVhZGxpbmUge1xuICAgIGNvbnN0IGVuZCA9IERhdGUubm93KCkgKyBkdXJhdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgdGltZVJlbWFpbmluZzogKCkgPT4gTWF0aC5tYXgoMCwgZW5kIC0gRGF0ZS5ub3coKSlcbiAgICB9O1xuICB9XG59XG5cbmNsYXNzIElkbGVUYXNrUXVldWVJbnRlcm5hbCBleHRlbmRzIFRhc2tRdWV1ZSB7XG4gIHByb3RlY3RlZCBfcmVxdWVzdENhbGxiYWNrKGNhbGxiYWNrOiBJZGxlUmVxdWVzdENhbGxiYWNrKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcmVxdWVzdElkbGVDYWxsYmFjayhjYWxsYmFjayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2NhbmNlbENhbGxiYWNrKGlkZW50aWZpZXI6IG51bWJlcik6IHZvaWQge1xuICAgIGNhbmNlbElkbGVDYWxsYmFjayhpZGVudGlmaWVyKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcXVldWUgb2YgdGhhdCBydW5zIHRhc2tzIG92ZXIgc2V2ZXJhbCBpZGxlIGNhbGxiYWNrcywgdHJ5aW5nIHRvIHJlc3BlY3QgdGhlIGlkbGUgY2FsbGJhY2snc1xuICogZGVhZGxpbmUgZ2l2ZW4gYnkgdGhlIGVudmlyb25tZW50LiBUaGUgdGFza3Mgd2lsbCBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGVucXVldWVkLCBidXQgdGhleVxuICogd2lsbCBydW4gc29tZSB0aW1lIGxhdGVyLCBhbmQgY2FyZSBzaG91bGQgYmUgdGFrZW4gdG8gZW5zdXJlIHRoZXkncmUgbm9uLXVyZ2VudCBhbmQgd2lsbCBub3RcbiAqIGludHJvZHVjZSByYWNlIGNvbmRpdGlvbnMuXG4gKlxuICogVGhpcyByZXZlcnRzIHRvIGEge0BsaW5rIFByaW9yaXR5VGFza1F1ZXVlfSBpZiB0aGUgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBpZGxlIGNhbGxiYWNrcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IElkbGVUYXNrUXVldWUgPSAoIWlzTm9kZSAmJiAncmVxdWVzdElkbGVDYWxsYmFjaycgaW4gd2luZG93KSA/IElkbGVUYXNrUXVldWVJbnRlcm5hbCA6IFByaW9yaXR5VGFza1F1ZXVlO1xuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IHRyYWNrcyBhIHNpbmdsZSBkZWJvdW5jZWQgdGFzayB0aGF0IHdpbGwgcnVuIG9uIHRoZSBuZXh0IGlkbGUgZnJhbWUuIFdoZW4gY2FsbGVkXG4gKiBtdWx0aXBsZSB0aW1lcywgb25seSB0aGUgbGFzdCBzZXQgdGFzayB3aWxsIHJ1bi5cbiAqL1xuZXhwb3J0IGNsYXNzIERlYm91bmNlZElkbGVUYXNrIHtcbiAgcHJpdmF0ZSBfcXVldWU6IElUYXNrUXVldWU7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fcXVldWUgPSBuZXcgSWRsZVRhc2tRdWV1ZSgpO1xuICB9XG5cbiAgcHVibGljIHNldCh0YXNrOiAoKSA9PiBib29sZWFuIHwgdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX3F1ZXVlLmNsZWFyKCk7XG4gICAgdGhpcy5fcXVldWUuZW5xdWV1ZSh0YXNrKTtcbiAgfVxuXG4gIHB1YmxpYyBmbHVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLl9xdWV1ZS5mbHVzaCgpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBDSEFSX0RBVEFfQ09ERV9JTkRFWCwgTlVMTF9DRUxMX0NPREUsIFdISVRFU1BBQ0VfQ0VMTF9DT0RFIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlV2luZG93c01vZGVXcmFwcGVkU3RhdGUoYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UpOiB2b2lkIHtcbiAgLy8gV2lucHR5IGRvZXMgbm90IHN1cHBvcnQgd3JhcGFyb3VuZCBtb2RlIHdoaWNoIG1lYW5zIHRoYXQgbGluZXMgd2lsbCBuZXZlclxuICAvLyBiZSBtYXJrZWQgYXMgd3JhcHBlZC4gVGhpcyBjYXVzZXMgaXNzdWVzIGZvciB0aGluZ3MgbGlrZSBjb3B5aW5nIGEgbGluZVxuICAvLyByZXRhaW5pbmcgdGhlIHdyYXBwZWQgbmV3IGxpbmUgY2hhcmFjdGVycyBvciBpZiBjb25zdW1lcnMgYXJlIGxpc3RlbmluZ1xuICAvLyBpbiBvbiB0aGUgZGF0YSBzdHJlYW0uXG4gIC8vXG4gIC8vIFRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGlzIHRvIGxpc3RlbiB0byBldmVyeSBpbmNvbWluZyBsaW5lIGZlZWQgYW5kIG1hcmtcbiAgLy8gdGhlIGxpbmUgYXMgd3JhcHBlZCBpZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHByZXZpb3VzIGxpbmUgaXMgbm90IGFcbiAgLy8gc3BhY2UuIFRoaXMgaXMgY2VydGFpbmx5IG5vdCB3aXRob3V0IGl0cyBwcm9ibGVtcywgYnV0IGdlbmVyYWxseSBvblxuICAvLyBXaW5kb3dzIHdoZW4gdGV4dCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHRlcm1pbmFsIGl0J3MgbGlrZWx5IGdvaW5nIHRvIGJlXG4gIC8vIHdyYXBwZWQuXG4gIGNvbnN0IGxpbmUgPSBidWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5nZXQoYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UgKyBidWZmZXJTZXJ2aWNlLmJ1ZmZlci55IC0gMSk7XG4gIGNvbnN0IGxhc3RDaGFyID0gbGluZT8uZ2V0KGJ1ZmZlclNlcnZpY2UuY29scyAtIDEpO1xuXG4gIGNvbnN0IG5leHRMaW5lID0gYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMuZ2V0KGJ1ZmZlclNlcnZpY2UuYnVmZmVyLnliYXNlICsgYnVmZmVyU2VydmljZS5idWZmZXIueSk7XG4gIGlmIChuZXh0TGluZSAmJiBsYXN0Q2hhcikge1xuICAgIG5leHRMaW5lLmlzV3JhcHBlZCA9IChsYXN0Q2hhcltDSEFSX0RBVEFfQ09ERV9JTkRFWF0gIT09IE5VTExfQ0VMTF9DT0RFICYmIGxhc3RDaGFyW0NIQVJfREFUQV9DT0RFX0lOREVYXSAhPT0gV0hJVEVTUEFDRV9DRUxMX0NPREUpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQXR0cmlidXRlRGF0YSwgSUNvbG9yUkdCLCBJRXh0ZW5kZWRBdHRycyB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBGZ0ZsYWdzLCBCZ0ZsYWdzLCBVbmRlcmxpbmVTdHlsZSwgRXh0RmxhZ3MgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVEYXRhIGltcGxlbWVudHMgSUF0dHJpYnV0ZURhdGEge1xuICBwdWJsaWMgc3RhdGljIHRvQ29sb3JSR0IodmFsdWU6IG51bWJlcik6IElDb2xvclJHQiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHZhbHVlID4+PiBBdHRyaWJ1dGVzLlJFRF9TSElGVCAmIDI1NSxcbiAgICAgIHZhbHVlID4+PiBBdHRyaWJ1dGVzLkdSRUVOX1NISUZUICYgMjU1LFxuICAgICAgdmFsdWUgJiAyNTVcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29sb3JSR0IodmFsdWU6IElDb2xvclJHQik6IG51bWJlciB7XG4gICAgcmV0dXJuICh2YWx1ZVswXSAmIDI1NSkgPDwgQXR0cmlidXRlcy5SRURfU0hJRlQgfCAodmFsdWVbMV0gJiAyNTUpIDw8IEF0dHJpYnV0ZXMuR1JFRU5fU0hJRlQgfCB2YWx1ZVsyXSAmIDI1NTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZSgpOiBJQXR0cmlidXRlRGF0YSB7XG4gICAgY29uc3QgbmV3T2JqID0gbmV3IEF0dHJpYnV0ZURhdGEoKTtcbiAgICBuZXdPYmouZmcgPSB0aGlzLmZnO1xuICAgIG5ld09iai5iZyA9IHRoaXMuYmc7XG4gICAgbmV3T2JqLmV4dGVuZGVkID0gdGhpcy5leHRlbmRlZC5jbG9uZSgpO1xuICAgIHJldHVybiBuZXdPYmo7XG4gIH1cblxuICAvLyBkYXRhXG4gIHB1YmxpYyBmZyA9IDA7XG4gIHB1YmxpYyBiZyA9IDA7XG4gIHB1YmxpYyBleHRlbmRlZDogSUV4dGVuZGVkQXR0cnMgPSBuZXcgRXh0ZW5kZWRBdHRycygpO1xuXG4gIC8vIGZsYWdzXG4gIHB1YmxpYyBpc0ludmVyc2UoKTogbnVtYmVyICAgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLklOVkVSU0U7IH1cbiAgcHVibGljIGlzQm9sZCgpOiBudW1iZXIgICAgICAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuQk9MRDsgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmUoKTogbnVtYmVyICAgICB7XG4gICAgaWYgKHRoaXMuaGFzRXh0ZW5kZWRBdHRycygpICYmIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGUgIT09IFVuZGVybGluZVN0eWxlLk5PTkUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuVU5ERVJMSU5FO1xuICB9XG4gIHB1YmxpYyBpc0JsaW5rKCk6IG51bWJlciAgICAgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLkJMSU5LOyB9XG4gIHB1YmxpYyBpc0ludmlzaWJsZSgpOiBudW1iZXIgICAgIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLklOVklTSUJMRTsgfVxuICBwdWJsaWMgaXNJdGFsaWMoKTogbnVtYmVyICAgICAgICB7IHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5JVEFMSUM7IH1cbiAgcHVibGljIGlzRGltKCk6IG51bWJlciAgICAgICAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuRElNOyB9XG4gIHB1YmxpYyBpc1N0cmlrZXRocm91Z2goKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLlNUUklLRVRIUk9VR0g7IH1cbiAgcHVibGljIGlzUHJvdGVjdGVkKCk6IG51bWJlciAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuUFJPVEVDVEVEOyB9XG4gIHB1YmxpYyBpc092ZXJsaW5lKCk6IG51bWJlciAgICAgIHsgcmV0dXJuIHRoaXMuYmcgJiBCZ0ZsYWdzLk9WRVJMSU5FOyB9XG5cbiAgLy8gY29sb3IgbW9kZXNcbiAgcHVibGljIGdldEZnQ29sb3JNb2RlKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLOyB9XG4gIHB1YmxpYyBnZXRCZ0NvbG9yTW9kZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSzsgfVxuICBwdWJsaWMgaXNGZ1JHQigpOiBib29sZWFuICAgICAgIHsgcmV0dXJuICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9SR0I7IH1cbiAgcHVibGljIGlzQmdSR0IoKTogYm9vbGVhbiAgICAgICB7IHJldHVybiAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUkdCOyB9XG4gIHB1YmxpYyBpc0ZnUGFsZXR0ZSgpOiBib29sZWFuICAgeyByZXR1cm4gKHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNiB8fCAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1NjsgfVxuICBwdWJsaWMgaXNCZ1BhbGV0dGUoKTogYm9vbGVhbiAgIHsgcmV0dXJuICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMTYgfHwgKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AyNTY7IH1cbiAgcHVibGljIGlzRmdEZWZhdWx0KCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDA7IH1cbiAgcHVibGljIGlzQmdEZWZhdWx0KCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDA7IH1cbiAgcHVibGljIGlzQXR0cmlidXRlRGVmYXVsdCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZmcgPT09IDAgJiYgdGhpcy5iZyA9PT0gMDsgfVxuXG4gIC8vIGNvbG9yc1xuICBwdWJsaWMgZ2V0RmdDb2xvcigpOiBudW1iZXIge1xuICAgIHN3aXRjaCAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OiAgcmV0dXJuIHRoaXMuZmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjogICByZXR1cm4gdGhpcy5mZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgIC8vIENNX0RFRkFVTFQgZGVmYXVsdHMgdG8gLTFcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldEJnQ29sb3IoKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjogIHJldHVybiB0aGlzLmJnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTSztcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6ICAgcmV0dXJuIHRoaXMuYmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAvLyBDTV9ERUZBVUxUIGRlZmF1bHRzIHRvIC0xXG4gICAgfVxuICB9XG5cbiAgLy8gZXh0ZW5kZWQgYXR0cnNcbiAgcHVibGljIGhhc0V4dGVuZGVkQXR0cnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVFeHRlbmRlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leHRlbmRlZC5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMuYmcgJj0gfkJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJnIHw9IEJnRmxhZ3MuSEFTX0VYVEVOREVEO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lQ29sb3IoKTogbnVtYmVyIHtcbiAgICBpZiAoKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjogIHJldHVybiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTSztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjogICByZXR1cm4gdGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmdDb2xvcigpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRGZ0NvbG9yKCk7XG4gIH1cbiAgcHVibGljIGdldFVuZGVybGluZUNvbG9yTW9kZSgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyB0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLXG4gICAgICA6IHRoaXMuZ2V0RmdDb2xvck1vZGUoKTtcbiAgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmVDb2xvclJHQigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3JcbiAgICAgID8gKHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1JHQlxuICAgICAgOiB0aGlzLmlzRmdSR0IoKTtcbiAgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmVDb2xvclBhbGV0dGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yXG4gICAgICA/ICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMTZcbiAgICAgICAgICB8fCAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1NlxuICAgICAgOiB0aGlzLmlzRmdQYWxldHRlKCk7XG4gIH1cbiAgcHVibGljIGlzVW5kZXJsaW5lQ29sb3JEZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IDBcbiAgICAgIDogdGhpcy5pc0ZnRGVmYXVsdCgpO1xuICB9XG4gIHB1YmxpYyBnZXRVbmRlcmxpbmVTdHlsZSgpOiBVbmRlcmxpbmVTdHlsZSB7XG4gICAgcmV0dXJuIHRoaXMuZmcgJiBGZ0ZsYWdzLlVOREVSTElORVxuICAgICAgPyAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEID8gdGhpcy5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSA6IFVuZGVybGluZVN0eWxlLlNJTkdMRSlcbiAgICAgIDogVW5kZXJsaW5lU3R5bGUuTk9ORTtcbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lVmFyaWFudE9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZVZhcmlhbnRPZmZzZXQ7XG4gIH1cbn1cblxuXG4vKipcbiAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIGEgY2VsbC5cbiAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGRpZmZlcmVudCB1bmRlcmxpbmUgc3R5bGVzIGFuZCBjb2xvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVuZGVkQXR0cnMgaW1wbGVtZW50cyBJRXh0ZW5kZWRBdHRycyB7XG4gIHByaXZhdGUgX2V4dDogbnVtYmVyID0gMDtcbiAgcHVibGljIGdldCBleHQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fdXJsSWQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0aGlzLl9leHQgJiB+RXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFKSB8XG4gICAgICAgICh0aGlzLnVuZGVybGluZVN0eWxlIDw8IDI2KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V4dDtcbiAgfVxuICBwdWJsaWMgc2V0IGV4dCh2YWx1ZTogbnVtYmVyKSB7IHRoaXMuX2V4dCA9IHZhbHVlOyB9XG5cbiAgcHVibGljIGdldCB1bmRlcmxpbmVTdHlsZSgpOiBVbmRlcmxpbmVTdHlsZSB7XG4gICAgLy8gQWx3YXlzIHJldHVybiB0aGUgVVJMIHN0eWxlIGlmIGl0IGhhcyBvbmVcbiAgICBpZiAodGhpcy5fdXJsSWQpIHtcbiAgICAgIHJldHVybiBVbmRlcmxpbmVTdHlsZS5EQVNIRUQ7XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5fZXh0ICYgRXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFKSA+PiAyNjtcbiAgfVxuICBwdWJsaWMgc2V0IHVuZGVybGluZVN0eWxlKHZhbHVlOiBVbmRlcmxpbmVTdHlsZSkge1xuICAgIHRoaXMuX2V4dCAmPSB+RXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFO1xuICAgIHRoaXMuX2V4dCB8PSAodmFsdWUgPDwgMjYpICYgRXh0RmxhZ3MuVU5ERVJMSU5FX1NUWUxFO1xuICB9XG5cbiAgcHVibGljIGdldCB1bmRlcmxpbmVDb2xvcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9leHQgJiAoQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gIH1cbiAgcHVibGljIHNldCB1bmRlcmxpbmVDb2xvcih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXh0ICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgdGhpcy5fZXh0IHw9IHZhbHVlICYgKEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXJsSWQ6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBnZXQgdXJsSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsSWQ7XG4gIH1cbiAgcHVibGljIHNldCB1cmxJZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdXJsSWQgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5kZXJsaW5lVmFyaWFudE9mZnNldCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbCA9ICh0aGlzLl9leHQgJiBFeHRGbGFncy5WQVJJQU5UX09GRlNFVCkgPj4gMjk7XG4gICAgaWYgKHZhbCA8IDApIHtcbiAgICAgIHJldHVybiB2YWwgXiAweEZGRkZGRkY4O1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHB1YmxpYyBzZXQgdW5kZXJsaW5lVmFyaWFudE9mZnNldCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXh0ICY9IH5FeHRGbGFncy5WQVJJQU5UX09GRlNFVDtcbiAgICB0aGlzLl9leHQgfD0gKHZhbHVlIDw8IDI5KSAmIEV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZXh0OiBudW1iZXIgPSAwLFxuICAgIHVybElkOiBudW1iZXIgPSAwXG4gICkge1xuICAgIHRoaXMuX2V4dCA9IGV4dDtcbiAgICB0aGlzLl91cmxJZCA9IHVybElkO1xuICB9XG5cbiAgcHVibGljIGNsb25lKCk6IElFeHRlbmRlZEF0dHJzIHtcbiAgICByZXR1cm4gbmV3IEV4dGVuZGVkQXR0cnModGhpcy5fZXh0LCB0aGlzLl91cmxJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVudCBtZXRob2QgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgb2JqZWN0IGhvbGRzIG5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sXG4gICAqIHRoYXQgbmVlZHMgdG8gYmUgcGVyc2lzdGFudCBpbiB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudW5kZXJsaW5lU3R5bGUgPT09IFVuZGVybGluZVN0eWxlLk5PTkUgJiYgdGhpcy5fdXJsSWQgPT09IDA7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IENpcmN1bGFyTGlzdCwgSUluc2VydEV2ZW50IH0gZnJvbSAnY29tbW9uL0NpcmN1bGFyTGlzdCc7XG5pbXBvcnQgeyBJZGxlVGFza1F1ZXVlIH0gZnJvbSAnY29tbW9uL1Rhc2tRdWV1ZSc7XG5pbXBvcnQgeyBJQXR0cmlidXRlRGF0YSwgSUJ1ZmZlckxpbmUsIElDZWxsRGF0YSwgSUNoYXJzZXQgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgRXh0ZW5kZWRBdHRycyB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YSc7XG5pbXBvcnQgeyBCdWZmZXJMaW5lLCBERUZBVUxUX0FUVFJfREFUQSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQnVmZmVyTGluZSc7XG5pbXBvcnQgeyBnZXRXcmFwcGVkTGluZVRyaW1tZWRMZW5ndGgsIHJlZmxvd0xhcmdlckFwcGx5TmV3TGF5b3V0LCByZWZsb3dMYXJnZXJDcmVhdGVOZXdMYXlvdXQsIHJlZmxvd0xhcmdlckdldExpbmVzVG9SZW1vdmUsIHJlZmxvd1NtYWxsZXJHZXROZXdMaW5lTGVuZ3RocyB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQnVmZmVyUmVmbG93JztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBOVUxMX0NFTExfQ0hBUiwgTlVMTF9DRUxMX0NPREUsIE5VTExfQ0VMTF9XSURUSCwgV0hJVEVTUEFDRV9DRUxMX0NIQVIsIFdISVRFU1BBQ0VfQ0VMTF9DT0RFLCBXSElURVNQQUNFX0NFTExfV0lEVEggfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBNYXJrZXIgfSBmcm9tICdjb21tb24vYnVmZmVyL01hcmtlcic7XG5pbXBvcnQgeyBJQnVmZmVyIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBERUZBVUxUX0NIQVJTRVQgfSBmcm9tICdjb21tb24vZGF0YS9DaGFyc2V0cyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGNvbnN0IE1BWF9CVUZGRVJfU0laRSA9IDQyOTQ5NjcyOTU7IC8vIDJeMzIgLSAxXG5cbi8qKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgdGVybWluYWwgYnVmZmVyIChhbiBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgdGVybWluYWwpLCB3aGVyZSB0aGVcbiAqIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgKGluIGhpZ2gtbGV2ZWwpOlxuICogICAtIHRleHQgY29udGVudCBvZiB0aGlzIHBhcnRpY3VsYXIgYnVmZmVyXG4gKiAgIC0gY3Vyc29yIHBvc2l0aW9uXG4gKiAgIC0gc2Nyb2xsIHBvc2l0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWZmZXIgaW1wbGVtZW50cyBJQnVmZmVyIHtcbiAgcHVibGljIGxpbmVzOiBDaXJjdWxhckxpc3Q8SUJ1ZmZlckxpbmU+O1xuICBwdWJsaWMgeWRpc3A6IG51bWJlciA9IDA7XG4gIHB1YmxpYyB5YmFzZTogbnVtYmVyID0gMDtcbiAgcHVibGljIHk6IG51bWJlciA9IDA7XG4gIHB1YmxpYyB4OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgc2Nyb2xsQm90dG9tOiBudW1iZXI7XG4gIHB1YmxpYyBzY3JvbGxUb3A6IG51bWJlcjtcbiAgcHVibGljIHRhYnM6IHsgW2NvbHVtbjogbnVtYmVyXTogYm9vbGVhbiB8IHVuZGVmaW5lZCB9ID0ge307XG4gIHB1YmxpYyBzYXZlZFk6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBzYXZlZFg6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBzYXZlZEN1ckF0dHJEYXRhID0gREVGQVVMVF9BVFRSX0RBVEEuY2xvbmUoKTtcbiAgcHVibGljIHNhdmVkQ2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQgPSBERUZBVUxUX0NIQVJTRVQ7XG4gIHB1YmxpYyBtYXJrZXJzOiBNYXJrZXJbXSA9IFtdO1xuICBwcml2YXRlIF9udWxsQ2VsbDogSUNlbGxEYXRhID0gQ2VsbERhdGEuZnJvbUNoYXJEYXRhKFswLCBOVUxMX0NFTExfQ0hBUiwgTlVMTF9DRUxMX1dJRFRILCBOVUxMX0NFTExfQ09ERV0pO1xuICBwcml2YXRlIF93aGl0ZXNwYWNlQ2VsbDogSUNlbGxEYXRhID0gQ2VsbERhdGEuZnJvbUNoYXJEYXRhKFswLCBXSElURVNQQUNFX0NFTExfQ0hBUiwgV0hJVEVTUEFDRV9DRUxMX1dJRFRILCBXSElURVNQQUNFX0NFTExfQ09ERV0pO1xuICBwcml2YXRlIF9jb2xzOiBudW1iZXI7XG4gIHByaXZhdGUgX3Jvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSBfaXNDbGVhcmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2hhc1Njcm9sbGJhY2s6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZVxuICApIHtcbiAgICB0aGlzLl9jb2xzID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgIHRoaXMuX3Jvd3MgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3M7XG4gICAgdGhpcy5saW5lcyA9IG5ldyBDaXJjdWxhckxpc3Q8SUJ1ZmZlckxpbmU+KHRoaXMuX2dldENvcnJlY3RCdWZmZXJMZW5ndGgodGhpcy5fcm93cykpO1xuICAgIHRoaXMuc2Nyb2xsVG9wID0gMDtcbiAgICB0aGlzLnNjcm9sbEJvdHRvbSA9IHRoaXMuX3Jvd3MgLSAxO1xuICAgIHRoaXMuc2V0dXBUYWJTdG9wcygpO1xuICB9XG5cbiAgcHVibGljIGdldE51bGxDZWxsKGF0dHI/OiBJQXR0cmlidXRlRGF0YSk6IElDZWxsRGF0YSB7XG4gICAgaWYgKGF0dHIpIHtcbiAgICAgIHRoaXMuX251bGxDZWxsLmZnID0gYXR0ci5mZztcbiAgICAgIHRoaXMuX251bGxDZWxsLmJnID0gYXR0ci5iZztcbiAgICAgIHRoaXMuX251bGxDZWxsLmV4dGVuZGVkID0gYXR0ci5leHRlbmRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbnVsbENlbGwuZmcgPSAwO1xuICAgICAgdGhpcy5fbnVsbENlbGwuYmcgPSAwO1xuICAgICAgdGhpcy5fbnVsbENlbGwuZXh0ZW5kZWQgPSBuZXcgRXh0ZW5kZWRBdHRycygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbnVsbENlbGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0V2hpdGVzcGFjZUNlbGwoYXR0cj86IElBdHRyaWJ1dGVEYXRhKTogSUNlbGxEYXRhIHtcbiAgICBpZiAoYXR0cikge1xuICAgICAgdGhpcy5fd2hpdGVzcGFjZUNlbGwuZmcgPSBhdHRyLmZnO1xuICAgICAgdGhpcy5fd2hpdGVzcGFjZUNlbGwuYmcgPSBhdHRyLmJnO1xuICAgICAgdGhpcy5fd2hpdGVzcGFjZUNlbGwuZXh0ZW5kZWQgPSBhdHRyLmV4dGVuZGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl93aGl0ZXNwYWNlQ2VsbC5mZyA9IDA7XG4gICAgICB0aGlzLl93aGl0ZXNwYWNlQ2VsbC5iZyA9IDA7XG4gICAgICB0aGlzLl93aGl0ZXNwYWNlQ2VsbC5leHRlbmRlZCA9IG5ldyBFeHRlbmRlZEF0dHJzKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93aGl0ZXNwYWNlQ2VsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRCbGFua0xpbmUoYXR0cjogSUF0dHJpYnV0ZURhdGEsIGlzV3JhcHBlZD86IGJvb2xlYW4pOiBJQnVmZmVyTGluZSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXJMaW5lKHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5nZXROdWxsQ2VsbChhdHRyKSwgaXNXcmFwcGVkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzU2Nyb2xsYmFjaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGFzU2Nyb2xsYmFjayAmJiB0aGlzLmxpbmVzLm1heExlbmd0aCA+IHRoaXMuX3Jvd3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ3Vyc29ySW5WaWV3cG9ydCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBhYnNvbHV0ZVkgPSB0aGlzLnliYXNlICsgdGhpcy55O1xuICAgIGNvbnN0IHJlbGF0aXZlWSA9IGFic29sdXRlWSAtIHRoaXMueWRpc3A7XG4gICAgcmV0dXJuIChyZWxhdGl2ZVkgPj0gMCAmJiByZWxhdGl2ZVkgPCB0aGlzLl9yb3dzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb3JyZWN0IGJ1ZmZlciBsZW5ndGggYmFzZWQgb24gdGhlIHJvd3MgcHJvdmlkZWQsIHRoZSB0ZXJtaW5hbCdzXG4gICAqIHNjcm9sbGJhY2sgYW5kIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgZmxhZ2dlZCB0byBoYXZlIHNjcm9sbGJhY2sgb3Igbm90LlxuICAgKiBAcGFyYW0gcm93cyBUaGUgdGVybWluYWwgcm93cyB0byB1c2UgaW4gdGhlIGNhbGN1bGF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29ycmVjdEJ1ZmZlckxlbmd0aChyb3dzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5faGFzU2Nyb2xsYmFjaykge1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfVxuXG4gICAgY29uc3QgY29ycmVjdEJ1ZmZlckxlbmd0aCA9IHJvd3MgKyB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcm9sbGJhY2s7XG5cbiAgICByZXR1cm4gY29ycmVjdEJ1ZmZlckxlbmd0aCA+IE1BWF9CVUZGRVJfU0laRSA/IE1BWF9CVUZGRVJfU0laRSA6IGNvcnJlY3RCdWZmZXJMZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogRmlsbHMgdGhlIGJ1ZmZlcidzIHZpZXdwb3J0IHdpdGggYmxhbmsgbGluZXMuXG4gICAqL1xuICBwdWJsaWMgZmlsbFZpZXdwb3J0Um93cyhmaWxsQXR0cj86IElBdHRyaWJ1dGVEYXRhKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoZmlsbEF0dHIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmaWxsQXR0ciA9IERFRkFVTFRfQVRUUl9EQVRBO1xuICAgICAgfVxuICAgICAgbGV0IGkgPSB0aGlzLl9yb3dzO1xuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICB0aGlzLmxpbmVzLnB1c2godGhpcy5nZXRCbGFua0xpbmUoZmlsbEF0dHIpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBidWZmZXIgdG8gaXQncyBpbml0aWFsIHN0YXRlLCBkaXNjYXJkaW5nIGFsbCBwcmV2aW91cyBkYXRhLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMueWRpc3AgPSAwO1xuICAgIHRoaXMueWJhc2UgPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLmxpbmVzID0gbmV3IENpcmN1bGFyTGlzdDxJQnVmZmVyTGluZT4odGhpcy5fZ2V0Q29ycmVjdEJ1ZmZlckxlbmd0aCh0aGlzLl9yb3dzKSk7XG4gICAgdGhpcy5zY3JvbGxUb3AgPSAwO1xuICAgIHRoaXMuc2Nyb2xsQm90dG9tID0gdGhpcy5fcm93cyAtIDE7XG4gICAgdGhpcy5zZXR1cFRhYlN0b3BzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzaXplcyB0aGUgYnVmZmVyLCBhZGp1c3RpbmcgaXRzIGRhdGEgYWNjb3JkaW5nbHkuXG4gICAqIEBwYXJhbSBuZXdDb2xzIFRoZSBuZXcgbnVtYmVyIG9mIGNvbHVtbnMuXG4gICAqIEBwYXJhbSBuZXdSb3dzIFRoZSBuZXcgbnVtYmVyIG9mIHJvd3MuXG4gICAqL1xuICBwdWJsaWMgcmVzaXplKG5ld0NvbHM6IG51bWJlciwgbmV3Um93czogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gc3RvcmUgcmVmZXJlbmNlIHRvIG51bGwgY2VsbCB3aXRoIGRlZmF1bHQgYXR0cnNcbiAgICBjb25zdCBudWxsQ2VsbCA9IHRoaXMuZ2V0TnVsbENlbGwoREVGQVVMVF9BVFRSX0RBVEEpO1xuXG4gICAgLy8gY291bnQgYnVmZmVybGluZXMgd2l0aCBvdmVybHkgYmlnIG1lbW9yeSB0byBiZSBjbGVhbmVkIGFmdGVyd2FyZHNcbiAgICBsZXQgZGlydHlNZW1vcnlMaW5lcyA9IDA7XG5cbiAgICAvLyBJbmNyZWFzZSBtYXggbGVuZ3RoIGlmIG5lZWRlZCBiZWZvcmUgYWRqdXN0bWVudHMgdG8gYWxsb3cgc3BhY2UgdG8gZmlsbFxuICAgIC8vIGFzIHJlcXVpcmVkLlxuICAgIGNvbnN0IG5ld01heExlbmd0aCA9IHRoaXMuX2dldENvcnJlY3RCdWZmZXJMZW5ndGgobmV3Um93cyk7XG4gICAgaWYgKG5ld01heExlbmd0aCA+IHRoaXMubGluZXMubWF4TGVuZ3RoKSB7XG4gICAgICB0aGlzLmxpbmVzLm1heExlbmd0aCA9IG5ld01heExlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIGFkanVzdG1lbnRzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGUgYnVmZmVyIGhhcyBiZWVuXG4gICAgLy8gaW5pdGlhbGl6ZWQvZmlsbGVkLlxuICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIERlYWwgd2l0aCBjb2x1bW5zIGluY3JlYXNpbmcgKHJlZHVjaW5nIG5lZWRzIHRvIGhhcHBlbiBhZnRlciByZWZsb3cpXG4gICAgICBpZiAodGhpcy5fY29scyA8IG5ld0NvbHMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgLy8gK2Jvb2xlYW4gZm9yIGZhc3QgMCBvciAxIGNvbnZlcnNpb25cbiAgICAgICAgICBkaXJ0eU1lbW9yeUxpbmVzICs9ICt0aGlzLmxpbmVzLmdldChpKSEucmVzaXplKG5ld0NvbHMsIG51bGxDZWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXNpemUgcm93cyBpbiBib3RoIGRpcmVjdGlvbnMgYXMgbmVlZGVkXG4gICAgICBsZXQgYWRkVG9ZID0gMDtcbiAgICAgIGlmICh0aGlzLl9yb3dzIDwgbmV3Um93cykge1xuICAgICAgICBmb3IgKGxldCB5ID0gdGhpcy5fcm93czsgeSA8IG5ld1Jvd3M7IHkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IG5ld1Jvd3MgKyB0aGlzLnliYXNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dzTW9kZSB8fCB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd3NQdHkuYmFja2VuZCAhPT0gdW5kZWZpbmVkIHx8IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93c1B0eS5idWlsZE51bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIEp1c3QgYWRkIHRoZSBuZXcgbWlzc2luZyByb3dzIG9uIFdpbmRvd3MgYXMgY29ucHR5IHJlcHJpbnRzIHRoZSBzY3JlZW4gd2l0aCBpdCdzXG4gICAgICAgICAgICAgIC8vIHZpZXcgb2YgdGhlIHdvcmxkLiBPbmNlIGEgbGluZSBlbnRlcnMgc2Nyb2xsYmFjayBmb3IgY29ucHR5IGl0IHJlbWFpbnMgdGhlcmVcbiAgICAgICAgICAgICAgdGhpcy5saW5lcy5wdXNoKG5ldyBCdWZmZXJMaW5lKG5ld0NvbHMsIG51bGxDZWxsKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAodGhpcy55YmFzZSA+IDAgJiYgdGhpcy5saW5lcy5sZW5ndGggPD0gdGhpcy55YmFzZSArIHRoaXMueSArIGFkZFRvWSArIDEpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyByb29tIGFib3ZlIHRoZSBidWZmZXIgYW5kIHRoZXJlIGFyZSBubyBlbXB0eSBlbGVtZW50cyBiZWxvdyB0aGUgbGluZSxcbiAgICAgICAgICAgICAgICAvLyBzY3JvbGwgdXBcbiAgICAgICAgICAgICAgICB0aGlzLnliYXNlLS07XG4gICAgICAgICAgICAgICAgYWRkVG9ZKys7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMueWRpc3AgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAvLyBWaWV3cG9ydCBpcyBhdCB0aGUgdG9wIG9mIHRoZSBidWZmZXIsIG11c3QgaW5jcmVhc2UgZG93bndhcmRzXG4gICAgICAgICAgICAgICAgICB0aGlzLnlkaXNwLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFkZCBhIGJsYW5rIGxpbmUgaWYgdGhlcmUgaXMgbm8gYnVmZmVyIGxlZnQgYXQgdGhlIHRvcCB0byBzY3JvbGwgdG8sIG9yIGlmIHRoZXJlXG4gICAgICAgICAgICAgICAgLy8gYXJlIGJsYW5rIGxpbmVzIGFmdGVyIHRoZSBjdXJzb3JcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVzLnB1c2gobmV3IEJ1ZmZlckxpbmUobmV3Q29scywgbnVsbENlbGwpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gKHRoaXMuX3Jvd3MgPj0gbmV3Um93cylcbiAgICAgICAgZm9yIChsZXQgeSA9IHRoaXMuX3Jvd3M7IHkgPiBuZXdSb3dzOyB5LS0pIHtcbiAgICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPiBuZXdSb3dzICsgdGhpcy55YmFzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubGluZXMubGVuZ3RoID4gdGhpcy55YmFzZSArIHRoaXMueSArIDEpIHtcbiAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgaXMgYSBibGFuayBsaW5lIGJlbG93IHRoZSBjdXJzb3IsIHJlbW92ZSBpdFxuICAgICAgICAgICAgICB0aGlzLmxpbmVzLnBvcCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgaXMgdGhlIGN1cnNvciwgc2Nyb2xsIGRvd25cbiAgICAgICAgICAgICAgdGhpcy55YmFzZSsrO1xuICAgICAgICAgICAgICB0aGlzLnlkaXNwKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZHVjZSBtYXggbGVuZ3RoIGlmIG5lZWRlZCBhZnRlciBhZGp1c3RtZW50cywgdGhpcyBpcyBkb25lIGFmdGVyIGFzIGl0XG4gICAgICAvLyB3b3VsZCBvdGhlcndpc2UgY3V0IGRhdGEgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBidWZmZXIuXG4gICAgICBpZiAobmV3TWF4TGVuZ3RoIDwgdGhpcy5saW5lcy5tYXhMZW5ndGgpIHtcbiAgICAgICAgLy8gVHJpbSBmcm9tIHRoZSB0b3Agb2YgdGhlIGJ1ZmZlciBhbmQgYWRqdXN0IHliYXNlIGFuZCB5ZGlzcC5cbiAgICAgICAgY29uc3QgYW1vdW50VG9UcmltID0gdGhpcy5saW5lcy5sZW5ndGggLSBuZXdNYXhMZW5ndGg7XG4gICAgICAgIGlmIChhbW91bnRUb1RyaW0gPiAwKSB7XG4gICAgICAgICAgdGhpcy5saW5lcy50cmltU3RhcnQoYW1vdW50VG9UcmltKTtcbiAgICAgICAgICB0aGlzLnliYXNlID0gTWF0aC5tYXgodGhpcy55YmFzZSAtIGFtb3VudFRvVHJpbSwgMCk7XG4gICAgICAgICAgdGhpcy55ZGlzcCA9IE1hdGgubWF4KHRoaXMueWRpc3AgLSBhbW91bnRUb1RyaW0sIDApO1xuICAgICAgICAgIHRoaXMuc2F2ZWRZID0gTWF0aC5tYXgodGhpcy5zYXZlZFkgLSBhbW91bnRUb1RyaW0sIDApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGluZXMubWF4TGVuZ3RoID0gbmV3TWF4TGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgY3Vyc29yIHN0YXlzIG9uIHNjcmVlblxuICAgICAgdGhpcy54ID0gTWF0aC5taW4odGhpcy54LCBuZXdDb2xzIC0gMSk7XG4gICAgICB0aGlzLnkgPSBNYXRoLm1pbih0aGlzLnksIG5ld1Jvd3MgLSAxKTtcbiAgICAgIGlmIChhZGRUb1kpIHtcbiAgICAgICAgdGhpcy55ICs9IGFkZFRvWTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2F2ZWRYID0gTWF0aC5taW4odGhpcy5zYXZlZFgsIG5ld0NvbHMgLSAxKTtcblxuICAgICAgdGhpcy5zY3JvbGxUb3AgPSAwO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsQm90dG9tID0gbmV3Um93cyAtIDE7XG5cbiAgICBpZiAodGhpcy5faXNSZWZsb3dFbmFibGVkKSB7XG4gICAgICB0aGlzLl9yZWZsb3cobmV3Q29scywgbmV3Um93cyk7XG5cbiAgICAgIC8vIFRyaW0gdGhlIGVuZCBvZiB0aGUgbGluZSBvZmYgaWYgY29scyBzaHJ1bmtcbiAgICAgIGlmICh0aGlzLl9jb2xzID4gbmV3Q29scykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyArYm9vbGVhbiBmb3IgZmFzdCAwIG9yIDEgY29udmVyc2lvblxuICAgICAgICAgIGRpcnR5TWVtb3J5TGluZXMgKz0gK3RoaXMubGluZXMuZ2V0KGkpIS5yZXNpemUobmV3Q29scywgbnVsbENlbGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fY29scyA9IG5ld0NvbHM7XG4gICAgdGhpcy5fcm93cyA9IG5ld1Jvd3M7XG5cbiAgICB0aGlzLl9tZW1vcnlDbGVhbnVwUXVldWUuY2xlYXIoKTtcbiAgICAvLyBzY2hlZHVsZSBtZW1vcnkgY2xlYW51cCBvbmx5LCBpZiBtb3JlIHRoYW4gMTAlIG9mIHRoZSBsaW5lcyBhcmUgYWZmZWN0ZWRcbiAgICBpZiAoZGlydHlNZW1vcnlMaW5lcyA+IDAuMSAqIHRoaXMubGluZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9tZW1vcnlDbGVhbnVwUG9zaXRpb24gPSAwO1xuICAgICAgdGhpcy5fbWVtb3J5Q2xlYW51cFF1ZXVlLmVucXVldWUoKCkgPT4gdGhpcy5fYmF0Y2hlZE1lbW9yeUNsZWFudXAoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbWVtb3J5Q2xlYW51cFF1ZXVlID0gbmV3IElkbGVUYXNrUXVldWUoKTtcbiAgcHJpdmF0ZSBfbWVtb3J5Q2xlYW51cFBvc2l0aW9uID0gMDtcblxuICBwcml2YXRlIF9iYXRjaGVkTWVtb3J5Q2xlYW51cCgpOiBib29sZWFuIHtcbiAgICBsZXQgbm9ybWFsUnVuID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fbWVtb3J5Q2xlYW51cFBvc2l0aW9uID49IHRoaXMubGluZXMubGVuZ3RoKSB7XG4gICAgICAvLyBjbGVhbnVwIG1hZGUgaXQgb25jZSB0aHJvdWdoIGFsbCBsaW5lcywgdGh1cyByZXNjYW4gaW4gbG9vcCBiZWxvdyB0byBhbHNvIGNhdGNoIHNoaWZ0ZWRcbiAgICAgIC8vIGxpbmVzLCB3aGljaCBzaG91bGQgZmluaXNoIHJhdGhlciBxdWljayBpZiB0aGVyZSBhcmUgbm8gbW9yZSBjbGVhbnVwcyBwZW5kaW5nXG4gICAgICB0aGlzLl9tZW1vcnlDbGVhbnVwUG9zaXRpb24gPSAwO1xuICAgICAgbm9ybWFsUnVuID0gZmFsc2U7XG4gICAgfVxuICAgIGxldCBjb3VudGVkID0gMDtcbiAgICB3aGlsZSAodGhpcy5fbWVtb3J5Q2xlYW51cFBvc2l0aW9uIDwgdGhpcy5saW5lcy5sZW5ndGgpIHtcbiAgICAgIGNvdW50ZWQgKz0gdGhpcy5saW5lcy5nZXQodGhpcy5fbWVtb3J5Q2xlYW51cFBvc2l0aW9uKyspIS5jbGVhbnVwTWVtb3J5KCk7XG4gICAgICAvLyBjbGVhbnVwIG1heCAxMDAgbGluZXMgcGVyIGJhdGNoXG4gICAgICBpZiAoY291bnRlZCA+IDEwMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm9ybWFsIHJ1bnMgYWx3YXlzIG5lZWQgYW5vdGhlciByZXNjYW4gYWZ0ZXJ3YXJkc1xuICAgIC8vIGlmIHdlIG1hZGUgaXQgaGVyZSB3aXRoIG5vcm1hbFJ1bj1mYWxzZSwgd2UgYXJlIGluIGEgZmluYWwgcnVuXG4gICAgLy8gYW5kIGNhbiBlbmQgdGhlIGNsZWFudXAgdGFzayBmb3Igc3VyZVxuICAgIHJldHVybiBub3JtYWxSdW47XG4gIH1cblxuICBwcml2YXRlIGdldCBfaXNSZWZsb3dFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHdpbmRvd3NQdHkgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd3NQdHk7XG4gICAgaWYgKHdpbmRvd3NQdHkgJiYgd2luZG93c1B0eS5idWlsZE51bWJlcikge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhc1Njcm9sbGJhY2sgJiYgd2luZG93c1B0eS5iYWNrZW5kID09PSAnY29ucHR5JyAmJiB3aW5kb3dzUHR5LmJ1aWxkTnVtYmVyID49IDIxMzc2O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faGFzU2Nyb2xsYmFjayAmJiAhdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dzTW9kZTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZmxvdyhuZXdDb2xzOiBudW1iZXIsIG5ld1Jvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jb2xzID09PSBuZXdDb2xzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHJvd3MsIGlnbm9yZSB0aGUgbGFzdCBvbmUgYXMgaXQgY2Fubm90IGJlIHdyYXBwZWRcbiAgICBpZiAobmV3Q29scyA+IHRoaXMuX2NvbHMpIHtcbiAgICAgIHRoaXMuX3JlZmxvd0xhcmdlcihuZXdDb2xzLCBuZXdSb3dzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVmbG93U21hbGxlcihuZXdDb2xzLCBuZXdSb3dzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWZsb3dMYXJnZXIobmV3Q29sczogbnVtYmVyLCBuZXdSb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0b1JlbW92ZTogbnVtYmVyW10gPSByZWZsb3dMYXJnZXJHZXRMaW5lc1RvUmVtb3ZlKHRoaXMubGluZXMsIHRoaXMuX2NvbHMsIG5ld0NvbHMsIHRoaXMueWJhc2UgKyB0aGlzLnksIHRoaXMuZ2V0TnVsbENlbGwoREVGQVVMVF9BVFRSX0RBVEEpKTtcbiAgICBpZiAodG9SZW1vdmUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV3TGF5b3V0UmVzdWx0ID0gcmVmbG93TGFyZ2VyQ3JlYXRlTmV3TGF5b3V0KHRoaXMubGluZXMsIHRvUmVtb3ZlKTtcbiAgICAgIHJlZmxvd0xhcmdlckFwcGx5TmV3TGF5b3V0KHRoaXMubGluZXMsIG5ld0xheW91dFJlc3VsdC5sYXlvdXQpO1xuICAgICAgdGhpcy5fcmVmbG93TGFyZ2VyQWRqdXN0Vmlld3BvcnQobmV3Q29scywgbmV3Um93cywgbmV3TGF5b3V0UmVzdWx0LmNvdW50UmVtb3ZlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVmbG93TGFyZ2VyQWRqdXN0Vmlld3BvcnQobmV3Q29sczogbnVtYmVyLCBuZXdSb3dzOiBudW1iZXIsIGNvdW50UmVtb3ZlZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbnVsbENlbGwgPSB0aGlzLmdldE51bGxDZWxsKERFRkFVTFRfQVRUUl9EQVRBKTtcbiAgICAvLyBBZGp1c3Qgdmlld3BvcnQgYmFzZWQgb24gbnVtYmVyIG9mIGl0ZW1zIHJlbW92ZWRcbiAgICBsZXQgdmlld3BvcnRBZGp1c3RtZW50cyA9IGNvdW50UmVtb3ZlZDtcbiAgICB3aGlsZSAodmlld3BvcnRBZGp1c3RtZW50cy0tID4gMCkge1xuICAgICAgaWYgKHRoaXMueWJhc2UgPT09IDApIHtcbiAgICAgICAgaWYgKHRoaXMueSA+IDApIHtcbiAgICAgICAgICB0aGlzLnktLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPCBuZXdSb3dzKSB7XG4gICAgICAgICAgLy8gQWRkIGFuIGV4dHJhIHJvdyBhdCB0aGUgYm90dG9tIG9mIHRoZSB2aWV3cG9ydFxuICAgICAgICAgIHRoaXMubGluZXMucHVzaChuZXcgQnVmZmVyTGluZShuZXdDb2xzLCBudWxsQ2VsbCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy55ZGlzcCA9PT0gdGhpcy55YmFzZSkge1xuICAgICAgICAgIHRoaXMueWRpc3AtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnliYXNlLS07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2F2ZWRZID0gTWF0aC5tYXgodGhpcy5zYXZlZFkgLSBjb3VudFJlbW92ZWQsIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmbG93U21hbGxlcihuZXdDb2xzOiBudW1iZXIsIG5ld1Jvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG51bGxDZWxsID0gdGhpcy5nZXROdWxsQ2VsbChERUZBVUxUX0FUVFJfREFUQSk7XG4gICAgLy8gR2F0aGVyIGFsbCBCdWZmZXJMaW5lcyB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgQnVmZmVyIGhlcmUgc28gdGhhdCB0aGV5IGNhbiBiZVxuICAgIC8vIGJhdGNoZWQgdXAgYW5kIG9ubHkgY29tbWl0dGVkIG9uY2VcbiAgICBjb25zdCB0b0luc2VydCA9IFtdO1xuICAgIGxldCBjb3VudFRvSW5zZXJ0ID0gMDtcbiAgICAvLyBHbyBiYWNrd2FyZHMgYXMgbWFueSBsaW5lcyBtYXkgYmUgdHJpbW1lZCBhbmQgdGhpcyB3aWxsIGF2b2lkIGNvbnNpZGVyaW5nIHRoZW1cbiAgICBmb3IgKGxldCB5ID0gdGhpcy5saW5lcy5sZW5ndGggLSAxOyB5ID49IDA7IHktLSkge1xuICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIGxpbmUgaXMgYSBwcm9ibGVtXG4gICAgICBsZXQgbmV4dExpbmUgPSB0aGlzLmxpbmVzLmdldCh5KSBhcyBCdWZmZXJMaW5lO1xuICAgICAgaWYgKCFuZXh0TGluZSB8fCAhbmV4dExpbmUuaXNXcmFwcGVkICYmIG5leHRMaW5lLmdldFRyaW1tZWRMZW5ndGgoKSA8PSBuZXdDb2xzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBHYXRoZXIgd3JhcHBlZCBsaW5lcyBhbmQgYWRqdXN0IHkgdG8gYmUgdGhlIHN0YXJ0aW5nIGxpbmVcbiAgICAgIGNvbnN0IHdyYXBwZWRMaW5lczogQnVmZmVyTGluZVtdID0gW25leHRMaW5lXTtcbiAgICAgIHdoaWxlIChuZXh0TGluZS5pc1dyYXBwZWQgJiYgeSA+IDApIHtcbiAgICAgICAgbmV4dExpbmUgPSB0aGlzLmxpbmVzLmdldCgtLXkpIGFzIEJ1ZmZlckxpbmU7XG4gICAgICAgIHdyYXBwZWRMaW5lcy51bnNoaWZ0KG5leHRMaW5lKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlc2UgbGluZXMgY29udGFpbiB0aGUgY3Vyc29yIGRvbid0IHRvdWNoIHRoZW0sIHRoZSBwcm9ncmFtIHdpbGwgaGFuZGxlIGZpeGluZyB1cFxuICAgICAgLy8gd3JhcHBlZCBsaW5lcyB3aXRoIHRoZSBjdXJzb3JcbiAgICAgIGNvbnN0IGFic29sdXRlWSA9IHRoaXMueWJhc2UgKyB0aGlzLnk7XG4gICAgICBpZiAoYWJzb2x1dGVZID49IHkgJiYgYWJzb2x1dGVZIDwgeSArIHdyYXBwZWRMaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxhc3RMaW5lTGVuZ3RoID0gd3JhcHBlZExpbmVzW3dyYXBwZWRMaW5lcy5sZW5ndGggLSAxXS5nZXRUcmltbWVkTGVuZ3RoKCk7XG4gICAgICBjb25zdCBkZXN0TGluZUxlbmd0aHMgPSByZWZsb3dTbWFsbGVyR2V0TmV3TGluZUxlbmd0aHMod3JhcHBlZExpbmVzLCB0aGlzLl9jb2xzLCBuZXdDb2xzKTtcbiAgICAgIGNvbnN0IGxpbmVzVG9BZGQgPSBkZXN0TGluZUxlbmd0aHMubGVuZ3RoIC0gd3JhcHBlZExpbmVzLmxlbmd0aDtcbiAgICAgIGxldCB0cmltbWVkTGluZXM6IG51bWJlcjtcbiAgICAgIGlmICh0aGlzLnliYXNlID09PSAwICYmIHRoaXMueSAhPT0gdGhpcy5saW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIElmIHRoZSB0b3Agc2VjdGlvbiBvZiB0aGUgYnVmZmVyIGlzIG5vdCB5ZXQgZmlsbGVkXG4gICAgICAgIHRyaW1tZWRMaW5lcyA9IE1hdGgubWF4KDAsIHRoaXMueSAtIHRoaXMubGluZXMubWF4TGVuZ3RoICsgbGluZXNUb0FkZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmltbWVkTGluZXMgPSBNYXRoLm1heCgwLCB0aGlzLmxpbmVzLmxlbmd0aCAtIHRoaXMubGluZXMubWF4TGVuZ3RoICsgbGluZXNUb0FkZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0aGUgbmV3IGxpbmVzXG4gICAgICBjb25zdCBuZXdMaW5lczogQnVmZmVyTGluZVtdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzVG9BZGQ7IGkrKykge1xuICAgICAgICBjb25zdCBuZXdMaW5lID0gdGhpcy5nZXRCbGFua0xpbmUoREVGQVVMVF9BVFRSX0RBVEEsIHRydWUpIGFzIEJ1ZmZlckxpbmU7XG4gICAgICAgIG5ld0xpbmVzLnB1c2gobmV3TGluZSk7XG4gICAgICB9XG4gICAgICBpZiAobmV3TGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0b0luc2VydC5wdXNoKHtcbiAgICAgICAgICAvLyBjb3VudFRvSW5zZXJ0IGhlcmUgZ2V0cyB0aGUgYWN0dWFsIGluZGV4LCB0YWtpbmcgaW50byBhY2NvdW50IG90aGVyIGluc2VydGVkIGl0ZW1zLlxuICAgICAgICAgIC8vIHVzaW5nIHRoaXMgd2UgY2FuIGl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBmb3J3YXJkc1xuICAgICAgICAgIHN0YXJ0OiB5ICsgd3JhcHBlZExpbmVzLmxlbmd0aCArIGNvdW50VG9JbnNlcnQsXG4gICAgICAgICAgbmV3TGluZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGNvdW50VG9JbnNlcnQgKz0gbmV3TGluZXMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgd3JhcHBlZExpbmVzLnB1c2goLi4ubmV3TGluZXMpO1xuXG4gICAgICAvLyBDb3B5IGJ1ZmZlciBkYXRhIHRvIG5ldyBsb2NhdGlvbnMsIHRoaXMgbmVlZHMgdG8gaGFwcGVuIGJhY2t3YXJkcyB0byBkbyBpbi1wbGFjZVxuICAgICAgbGV0IGRlc3RMaW5lSW5kZXggPSBkZXN0TGluZUxlbmd0aHMubGVuZ3RoIC0gMTsgLy8gTWF0aC5mbG9vcihjZWxsc05lZWRlZCAvIG5ld0NvbHMpO1xuICAgICAgbGV0IGRlc3RDb2wgPSBkZXN0TGluZUxlbmd0aHNbZGVzdExpbmVJbmRleF07IC8vIGNlbGxzTmVlZGVkICUgbmV3Q29scztcbiAgICAgIGlmIChkZXN0Q29sID09PSAwKSB7XG4gICAgICAgIGRlc3RMaW5lSW5kZXgtLTtcbiAgICAgICAgZGVzdENvbCA9IGRlc3RMaW5lTGVuZ3Roc1tkZXN0TGluZUluZGV4XTtcbiAgICAgIH1cbiAgICAgIGxldCBzcmNMaW5lSW5kZXggPSB3cmFwcGVkTGluZXMubGVuZ3RoIC0gbGluZXNUb0FkZCAtIDE7XG4gICAgICBsZXQgc3JjQ29sID0gbGFzdExpbmVMZW5ndGg7XG4gICAgICB3aGlsZSAoc3JjTGluZUluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgY2VsbHNUb0NvcHkgPSBNYXRoLm1pbihzcmNDb2wsIGRlc3RDb2wpO1xuICAgICAgICBpZiAod3JhcHBlZExpbmVzW2Rlc3RMaW5lSW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgbGluZSBleGlzdHMsIHRoaXMgaGFzIGJlZW4ga25vd24gdG8gZmFpbCBmb3IgYW4gdW5rbm93biByZWFzb25cbiAgICAgICAgICAvLyB3aGljaCB3b3VsZCBzdG9wIHRoZSByZWZsb3cgZnJvbSBoYXBwZW5pbmcgaWYgYW4gZXhjZXB0aW9uIHdvdWxkIHRocm93LlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZWRMaW5lc1tkZXN0TGluZUluZGV4XS5jb3B5Q2VsbHNGcm9tKHdyYXBwZWRMaW5lc1tzcmNMaW5lSW5kZXhdLCBzcmNDb2wgLSBjZWxsc1RvQ29weSwgZGVzdENvbCAtIGNlbGxzVG9Db3B5LCBjZWxsc1RvQ29weSwgdHJ1ZSk7XG4gICAgICAgIGRlc3RDb2wgLT0gY2VsbHNUb0NvcHk7XG4gICAgICAgIGlmIChkZXN0Q29sID09PSAwKSB7XG4gICAgICAgICAgZGVzdExpbmVJbmRleC0tO1xuICAgICAgICAgIGRlc3RDb2wgPSBkZXN0TGluZUxlbmd0aHNbZGVzdExpbmVJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgc3JjQ29sIC09IGNlbGxzVG9Db3B5O1xuICAgICAgICBpZiAoc3JjQ29sID09PSAwKSB7XG4gICAgICAgICAgc3JjTGluZUluZGV4LS07XG4gICAgICAgICAgY29uc3Qgd3JhcHBlZExpbmVzSW5kZXggPSBNYXRoLm1heChzcmNMaW5lSW5kZXgsIDApO1xuICAgICAgICAgIHNyY0NvbCA9IGdldFdyYXBwZWRMaW5lVHJpbW1lZExlbmd0aCh3cmFwcGVkTGluZXMsIHdyYXBwZWRMaW5lc0luZGV4LCB0aGlzLl9jb2xzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOdWxsIG91dCB0aGUgZW5kIG9mIHRoZSBsaW5lIGVuZHMgaWYgYSB3aWRlIGNoYXJhY3RlciB3cmFwcGVkIHRvIHRoZSBmb2xsb3dpbmcgbGluZVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3cmFwcGVkTGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGRlc3RMaW5lTGVuZ3Roc1tpXSA8IG5ld0NvbHMpIHtcbiAgICAgICAgICB3cmFwcGVkTGluZXNbaV0uc2V0Q2VsbChkZXN0TGluZUxlbmd0aHNbaV0sIG51bGxDZWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3Qgdmlld3BvcnQgYXMgbmVlZGVkXG4gICAgICBsZXQgdmlld3BvcnRBZGp1c3RtZW50cyA9IGxpbmVzVG9BZGQgLSB0cmltbWVkTGluZXM7XG4gICAgICB3aGlsZSAodmlld3BvcnRBZGp1c3RtZW50cy0tID4gMCkge1xuICAgICAgICBpZiAodGhpcy55YmFzZSA9PT0gMCkge1xuICAgICAgICAgIGlmICh0aGlzLnkgPCBuZXdSb3dzIC0gMSkge1xuICAgICAgICAgICAgdGhpcy55Kys7XG4gICAgICAgICAgICB0aGlzLmxpbmVzLnBvcCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnliYXNlKys7XG4gICAgICAgICAgICB0aGlzLnlkaXNwKys7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEVuc3VyZSB5YmFzZSBkb2VzIG5vdCBleGNlZWQgaXRzIG1heGltdW0gdmFsdWVcbiAgICAgICAgICBpZiAodGhpcy55YmFzZSA8IE1hdGgubWluKHRoaXMubGluZXMubWF4TGVuZ3RoLCB0aGlzLmxpbmVzLmxlbmd0aCArIGNvdW50VG9JbnNlcnQpIC0gbmV3Um93cykge1xuICAgICAgICAgICAgaWYgKHRoaXMueWJhc2UgPT09IHRoaXMueWRpc3ApIHtcbiAgICAgICAgICAgICAgdGhpcy55ZGlzcCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy55YmFzZSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zYXZlZFkgPSBNYXRoLm1pbih0aGlzLnNhdmVkWSArIGxpbmVzVG9BZGQsIHRoaXMueWJhc2UgKyBuZXdSb3dzIC0gMSk7XG4gICAgfVxuXG4gICAgLy8gUmVhcnJhbmdlIGxpbmVzIGluIHRoZSBidWZmZXIgaWYgdGhlcmUgYXJlIGFueSBpbnNlcnRpb25zLCB0aGlzIGlzIGRvbmUgYXQgdGhlIGVuZCByYXRoZXJcbiAgICAvLyB0aGFuIGVhcmxpZXIgc28gdGhhdCBpdCdzIGEgc2luZ2xlIE8obikgcGFzcyB0aHJvdWdoIHRoZSBidWZmZXIsIGluc3RlYWQgb2YgTyhuXjIpIGZyb20gbWFueVxuICAgIC8vIGNvc3RseSBjYWxscyB0byBDaXJjdWxhckxpc3Quc3BsaWNlLlxuICAgIGlmICh0b0luc2VydC5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBSZWNvcmQgYnVmZmVyIGluc2VydCBldmVudHMgYW5kIHRoZW4gcGxheSB0aGVtIGJhY2sgYmFja3dhcmRzIHNvIHRoYXQgdGhlIGluZGV4ZXMgYXJlXG4gICAgICAvLyBjb3JyZWN0XG4gICAgICBjb25zdCBpbnNlcnRFdmVudHM6IElJbnNlcnRFdmVudFtdID0gW107XG5cbiAgICAgIC8vIFJlY29yZCBvcmlnaW5hbCBsaW5lcyBzbyB0aGV5IGRvbid0IGdldCBvdmVycmlkZGVuIHdoZW4gd2UgcmVhcnJhbmdlIHRoZSBsaXN0XG4gICAgICBjb25zdCBvcmlnaW5hbExpbmVzOiBCdWZmZXJMaW5lW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvcmlnaW5hbExpbmVzLnB1c2godGhpcy5saW5lcy5nZXQoaSkgYXMgQnVmZmVyTGluZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvcmlnaW5hbExpbmVzTGVuZ3RoID0gdGhpcy5saW5lcy5sZW5ndGg7XG5cbiAgICAgIGxldCBvcmlnaW5hbExpbmVJbmRleCA9IG9yaWdpbmFsTGluZXNMZW5ndGggLSAxO1xuICAgICAgbGV0IG5leHRUb0luc2VydEluZGV4ID0gMDtcbiAgICAgIGxldCBuZXh0VG9JbnNlcnQgPSB0b0luc2VydFtuZXh0VG9JbnNlcnRJbmRleF07XG4gICAgICB0aGlzLmxpbmVzLmxlbmd0aCA9IE1hdGgubWluKHRoaXMubGluZXMubWF4TGVuZ3RoLCB0aGlzLmxpbmVzLmxlbmd0aCArIGNvdW50VG9JbnNlcnQpO1xuICAgICAgbGV0IGNvdW50SW5zZXJ0ZWRTb0ZhciA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gTWF0aC5taW4odGhpcy5saW5lcy5tYXhMZW5ndGggLSAxLCBvcmlnaW5hbExpbmVzTGVuZ3RoICsgY291bnRUb0luc2VydCAtIDEpOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAobmV4dFRvSW5zZXJ0ICYmIG5leHRUb0luc2VydC5zdGFydCA+IG9yaWdpbmFsTGluZUluZGV4ICsgY291bnRJbnNlcnRlZFNvRmFyKSB7XG4gICAgICAgICAgLy8gSW5zZXJ0IGV4dHJhIGxpbmVzIGhlcmUsIGFkanVzdGluZyBpIGFzIG5lZWRlZFxuICAgICAgICAgIGZvciAobGV0IG5leHRJID0gbmV4dFRvSW5zZXJ0Lm5ld0xpbmVzLmxlbmd0aCAtIDE7IG5leHRJID49IDA7IG5leHRJLS0pIHtcbiAgICAgICAgICAgIHRoaXMubGluZXMuc2V0KGktLSwgbmV4dFRvSW5zZXJ0Lm5ld0xpbmVzW25leHRJXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGkrKztcblxuICAgICAgICAgIC8vIENyZWF0ZSBpbnNlcnQgZXZlbnRzIGZvciBsYXRlclxuICAgICAgICAgIGluc2VydEV2ZW50cy5wdXNoKHtcbiAgICAgICAgICAgIGluZGV4OiBvcmlnaW5hbExpbmVJbmRleCArIDEsXG4gICAgICAgICAgICBhbW91bnQ6IG5leHRUb0luc2VydC5uZXdMaW5lcy5sZW5ndGhcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvdW50SW5zZXJ0ZWRTb0ZhciArPSBuZXh0VG9JbnNlcnQubmV3TGluZXMubGVuZ3RoO1xuICAgICAgICAgIG5leHRUb0luc2VydCA9IHRvSW5zZXJ0WysrbmV4dFRvSW5zZXJ0SW5kZXhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubGluZXMuc2V0KGksIG9yaWdpbmFsTGluZXNbb3JpZ2luYWxMaW5lSW5kZXgtLV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBtYXJrZXJzXG4gICAgICBsZXQgaW5zZXJ0Q291bnRFbWl0dGVkID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSBpbnNlcnRFdmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaW5zZXJ0RXZlbnRzW2ldLmluZGV4ICs9IGluc2VydENvdW50RW1pdHRlZDtcbiAgICAgICAgdGhpcy5saW5lcy5vbkluc2VydEVtaXR0ZXIuZmlyZShpbnNlcnRFdmVudHNbaV0pO1xuICAgICAgICBpbnNlcnRDb3VudEVtaXR0ZWQgKz0gaW5zZXJ0RXZlbnRzW2ldLmFtb3VudDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFtb3VudFRvVHJpbSA9IE1hdGgubWF4KDAsIG9yaWdpbmFsTGluZXNMZW5ndGggKyBjb3VudFRvSW5zZXJ0IC0gdGhpcy5saW5lcy5tYXhMZW5ndGgpO1xuICAgICAgaWYgKGFtb3VudFRvVHJpbSA+IDApIHtcbiAgICAgICAgdGhpcy5saW5lcy5vblRyaW1FbWl0dGVyLmZpcmUoYW1vdW50VG9UcmltKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNsYXRlcyBhIGJ1ZmZlciBsaW5lIHRvIGEgc3RyaW5nLCB3aXRoIG9wdGlvbmFsIHN0YXJ0IGFuZCBlbmQgY29sdW1ucy5cbiAgICogV2lkZSBjaGFyYWN0ZXJzIHdpbGwgY291bnQgYXMgdHdvIGNvbHVtbnMgaW4gdGhlIHJlc3VsdGluZyBzdHJpbmcuIFRoaXNcbiAgICogZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBnZXR0aW5nIHRoZSBhY3R1YWwgdGV4dCB1bmRlcm5lYXRoIHRoZSByYXcgc2VsZWN0aW9uXG4gICAqIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gbGluZUluZGV4IFRoZSBhYnNvbHV0ZSBpbmRleCBvZiB0aGUgbGluZSBiZWluZyB0cmFuc2xhdGVkLlxuICAgKiBAcGFyYW0gdHJpbVJpZ2h0IFdoZXRoZXIgdG8gdHJpbSB3aGl0ZXNwYWNlIHRvIHRoZSByaWdodC5cbiAgICogQHBhcmFtIHN0YXJ0Q29sIFRoZSBjb2x1bW4gdG8gc3RhcnQgYXQuXG4gICAqIEBwYXJhbSBlbmRDb2wgVGhlIGNvbHVtbiB0byBlbmQgYXQuXG4gICAqL1xuICBwdWJsaWMgdHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nKGxpbmVJbmRleDogbnVtYmVyLCB0cmltUmlnaHQ6IGJvb2xlYW4sIHN0YXJ0Q29sOiBudW1iZXIgPSAwLCBlbmRDb2w/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmxpbmVzLmdldChsaW5lSW5kZXgpO1xuICAgIGlmICghbGluZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gbGluZS50cmFuc2xhdGVUb1N0cmluZyh0cmltUmlnaHQsIHN0YXJ0Q29sLCBlbmRDb2wpO1xuICB9XG5cbiAgcHVibGljIGdldFdyYXBwZWRSYW5nZUZvckxpbmUoeTogbnVtYmVyKTogeyBmaXJzdDogbnVtYmVyLCBsYXN0OiBudW1iZXIgfSB7XG4gICAgbGV0IGZpcnN0ID0geTtcbiAgICBsZXQgbGFzdCA9IHk7XG4gICAgLy8gU2NhbiB1cHdhcmRzIGZvciB3cmFwcGVkIGxpbmVzXG4gICAgd2hpbGUgKGZpcnN0ID4gMCAmJiB0aGlzLmxpbmVzLmdldChmaXJzdCkhLmlzV3JhcHBlZCkge1xuICAgICAgZmlyc3QtLTtcbiAgICB9XG4gICAgLy8gU2NhbiBkb3dud2FyZHMgZm9yIHdyYXBwZWQgbGluZXNcbiAgICB3aGlsZSAobGFzdCArIDEgPCB0aGlzLmxpbmVzLmxlbmd0aCAmJiB0aGlzLmxpbmVzLmdldChsYXN0ICsgMSkhLmlzV3JhcHBlZCkge1xuICAgICAgbGFzdCsrO1xuICAgIH1cbiAgICByZXR1cm4geyBmaXJzdCwgbGFzdCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSB0YWIgc3RvcHMuXG4gICAqIEBwYXJhbSBpIFRoZSBpbmRleCB0byBzdGFydCBzZXR0aW5nIHVwIHRhYiBzdG9wcyBmcm9tLlxuICAgKi9cbiAgcHVibGljIHNldHVwVGFiU3RvcHMoaT86IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChpICE9PSBudWxsICYmIGkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCF0aGlzLnRhYnNbaV0pIHtcbiAgICAgICAgaSA9IHRoaXMucHJldlN0b3AoaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFicyA9IHt9O1xuICAgICAgaSA9IDA7XG4gICAgfVxuXG4gICAgZm9yICg7IGkgPCB0aGlzLl9jb2xzOyBpICs9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGFiU3RvcFdpZHRoKSB7XG4gICAgICB0aGlzLnRhYnNbaV0gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHByZXZpb3VzIHRhYiBzdG9wIGZyb20gdGhlIGdpdmVuIHBvc2l0aW9uIChkZWZhdWx0IGlzIGN1cnJlbnQpLlxuICAgKiBAcGFyYW0geCBUaGUgcG9zaXRpb24gdG8gbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyB0YWIgc3RvcC5cbiAgICovXG4gIHB1YmxpYyBwcmV2U3RvcCh4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoeCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHggPSB0aGlzLng7XG4gICAgfVxuICAgIHdoaWxlICghdGhpcy50YWJzWy0teF0gJiYgeCA+IDApO1xuICAgIHJldHVybiB4ID49IHRoaXMuX2NvbHMgPyB0aGlzLl9jb2xzIC0gMSA6IHggPCAwID8gMCA6IHg7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgY3Vyc29yIG9uZSB0YWIgc3RvcCBmb3J3YXJkIGZyb20gdGhlIGdpdmVuIHBvc2l0aW9uIChkZWZhdWx0IGlzIGN1cnJlbnQpLlxuICAgKiBAcGFyYW0geCBUaGUgcG9zaXRpb24gdG8gbW92ZSB0aGUgY3Vyc29yIG9uZSB0YWIgc3RvcCBmb3J3YXJkLlxuICAgKi9cbiAgcHVibGljIG5leHRTdG9wKHg/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh4ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgeCA9IHRoaXMueDtcbiAgICB9XG4gICAgd2hpbGUgKCF0aGlzLnRhYnNbKyt4XSAmJiB4IDwgdGhpcy5fY29scyk7XG4gICAgcmV0dXJuIHggPj0gdGhpcy5fY29scyA/IHRoaXMuX2NvbHMgLSAxIDogeCA8IDAgPyAwIDogeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgbWFya2VycyBvbiBzaW5nbGUgbGluZS5cbiAgICogQHBhcmFtIHkgVGhlIGxpbmUgdG8gY2xlYXIuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJNYXJrZXJzKHk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2lzQ2xlYXJpbmcgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5tYXJrZXJzW2ldLmxpbmUgPT09IHkpIHtcbiAgICAgICAgdGhpcy5tYXJrZXJzW2ldLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5tYXJrZXJzLnNwbGljZShpLS0sIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pc0NsZWFyaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIG1hcmtlcnMgb24gYWxsIGxpbmVzXG4gICAqL1xuICBwdWJsaWMgY2xlYXJBbGxNYXJrZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzQ2xlYXJpbmcgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLm1hcmtlcnNbaV0uZGlzcG9zZSgpO1xuICAgICAgdGhpcy5tYXJrZXJzLnNwbGljZShpLS0sIDEpO1xuICAgIH1cbiAgICB0aGlzLl9pc0NsZWFyaW5nID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYWRkTWFya2VyKHk6IG51bWJlcik6IE1hcmtlciB7XG4gICAgY29uc3QgbWFya2VyID0gbmV3IE1hcmtlcih5KTtcbiAgICB0aGlzLm1hcmtlcnMucHVzaChtYXJrZXIpO1xuICAgIG1hcmtlci5yZWdpc3Rlcih0aGlzLmxpbmVzLm9uVHJpbShhbW91bnQgPT4ge1xuICAgICAgbWFya2VyLmxpbmUgLT0gYW1vdW50O1xuICAgICAgLy8gVGhlIG1hcmtlciBzaG91bGQgYmUgZGlzcG9zZWQgd2hlbiB0aGUgbGluZSBpcyB0cmltbWVkIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgaWYgKG1hcmtlci5saW5lIDwgMCkge1xuICAgICAgICBtYXJrZXIuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgICBtYXJrZXIucmVnaXN0ZXIodGhpcy5saW5lcy5vbkluc2VydChldmVudCA9PiB7XG4gICAgICBpZiAobWFya2VyLmxpbmUgPj0gZXZlbnQuaW5kZXgpIHtcbiAgICAgICAgbWFya2VyLmxpbmUgKz0gZXZlbnQuYW1vdW50O1xuICAgICAgfVxuICAgIH0pKTtcbiAgICBtYXJrZXIucmVnaXN0ZXIodGhpcy5saW5lcy5vbkRlbGV0ZShldmVudCA9PiB7XG4gICAgICAvLyBEZWxldGUgdGhlIG1hcmtlciBpZiBpdCdzIHdpdGhpbiB0aGUgcmFuZ2VcbiAgICAgIGlmIChtYXJrZXIubGluZSA+PSBldmVudC5pbmRleCAmJiBtYXJrZXIubGluZSA8IGV2ZW50LmluZGV4ICsgZXZlbnQuYW1vdW50KSB7XG4gICAgICAgIG1hcmtlci5kaXNwb3NlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNoaWZ0IHRoZSBtYXJrZXIgaWYgaXQncyBhZnRlciB0aGUgZGVsZXRlZCByYW5nZVxuICAgICAgaWYgKG1hcmtlci5saW5lID4gZXZlbnQuaW5kZXgpIHtcbiAgICAgICAgbWFya2VyLmxpbmUgLT0gZXZlbnQuYW1vdW50O1xuICAgICAgfVxuICAgIH0pKTtcbiAgICBtYXJrZXIucmVnaXN0ZXIobWFya2VyLm9uRGlzcG9zZSgoKSA9PiB0aGlzLl9yZW1vdmVNYXJrZXIobWFya2VyKSkpO1xuICAgIHJldHVybiBtYXJrZXI7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVNYXJrZXIobWFya2VyOiBNYXJrZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzQ2xlYXJpbmcpIHtcbiAgICAgIHRoaXMubWFya2Vycy5zcGxpY2UodGhpcy5tYXJrZXJzLmluZGV4T2YobWFya2VyKSwgMSk7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBDaGFyRGF0YSwgSUF0dHJpYnV0ZURhdGEsIElCdWZmZXJMaW5lLCBJQ2VsbERhdGEsIElFeHRlbmRlZEF0dHJzIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIEJnRmxhZ3MsIENIQVJfREFUQV9BVFRSX0lOREVYLCBDSEFSX0RBVEFfQ0hBUl9JTkRFWCwgQ0hBUl9EQVRBX1dJRFRIX0lOREVYLCBDb250ZW50LCBOVUxMX0NFTExfQ0hBUiwgTlVMTF9DRUxMX0NPREUsIE5VTExfQ0VMTF9XSURUSCwgV0hJVEVTUEFDRV9DRUxMX0NIQVIgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBzdHJpbmdGcm9tQ29kZVBvaW50IH0gZnJvbSAnY29tbW9uL2lucHV0L1RleHREZWNvZGVyJztcblxuLyoqXG4gKiBidWZmZXIgbWVtb3J5IGxheW91dDpcbiAqXG4gKiAgIHwgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgfCAgICAgICAgdWludDMyX3QgICAgICAgICB8ICAgICAgICB1aW50MzJfdCAgICAgICAgIHxcbiAqICAgfCAgICAgICAgICAgICBgY29udGVudGAgICAgICAgICAgICB8ICAgICAgICAgIGBGR2AgICAgICAgICAgIHwgICAgICAgICAgYEJHYCAgICAgICAgICAgfFxuICogICB8IHdjd2lkdGgoMikgY29tYigxKSBjb2RlcG9pbnQoMjEpIHwgZmxhZ3MoOCkgUig4KSBHKDgpIEIoOCkgfCBmbGFncyg4KSBSKDgpIEcoOCkgQig4KSB8XG4gKi9cblxuXG4vKiogdHlwZWQgYXJyYXkgc2xvdHMgdGFrZW4gYnkgb25lIGNlbGwgKi9cbmNvbnN0IENFTExfU0laRSA9IDM7XG5cbi8qKlxuICogQ2VsbCBtZW1iZXIgaW5kaWNlcy5cbiAqXG4gKiBEaXJlY3QgYWNjZXNzOlxuICogICAgYGNvbnRlbnQgPSBkYXRhW2NvbHVtbiAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF07YFxuICogICAgYGZnID0gZGF0YVtjb2x1bW4gKiBDRUxMX1NJWkUgKyBDZWxsLkZHXTtgXG4gKiAgICBgYmcgPSBkYXRhW2NvbHVtbiAqIENFTExfU0laRSArIENlbGwuQkddO2BcbiAqL1xuY29uc3QgZW51bSBDZWxsIHtcbiAgQ09OVEVOVCA9IDAsXG4gIEZHID0gMSwgLy8gY3VycmVudGx5IHNpbXBseSBob2xkcyBhbGwga25vd24gYXR0cnNcbiAgQkcgPSAyICAvLyBjdXJyZW50bHkgdW51c2VkXG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FUVFJfREFUQSA9IE9iamVjdC5mcmVlemUobmV3IEF0dHJpYnV0ZURhdGEoKSk7XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRzdGFydEluZGV4ID0gMDtcblxuLyoqIEZhY3RvciB3aGVuIHRvIGNsZWFudXAgdW5kZXJseWluZyBhcnJheSBidWZmZXIgYWZ0ZXIgc2hyaW5raW5nLiAqL1xuY29uc3QgQ0xFQU5VUF9USFJFU0hPTEQgPSAyO1xuXG4vKipcbiAqIFR5cGVkIGFycmF5IGJhc2VkIGJ1ZmZlcmxpbmUgaW1wbGVtZW50YXRpb24uXG4gKlxuICogVGhlcmUgYXJlIDIgd2F5cyB0byBpbnNlcnQgZGF0YSBpbnRvIHRoZSBjZWxsIGJ1ZmZlcjpcbiAqIC0gYHNldENlbGxGcm9tQ29kZXBvaW50YCArIGBhZGRDb2RlcG9pbnRUb0NlbGxgXG4gKiAgIFVzZSB0aGVzZSBmb3IgZGF0YSB0aGF0IGlzIGFscmVhZHkgVVRGMzIuXG4gKiAgIFVzZWQgZHVyaW5nIG5vcm1hbCBpbnB1dCBpbiBgSW5wdXRIYW5kbGVyYCBmb3IgZmFzdGVyIGJ1ZmZlciBhY2Nlc3MuXG4gKiAtIGBzZXRDZWxsYFxuICogICBUaGlzIG1ldGhvZCB0YWtlcyBhIENlbGxEYXRhIG9iamVjdCBhbmQgc3RvcmVzIHRoZSBkYXRhIGluIHRoZSBidWZmZXIuXG4gKiAgIFVzZSBgQ2VsbERhdGEuZnJvbUNoYXJEYXRhYCB0byBjcmVhdGUgdGhlIENlbGxEYXRhIG9iamVjdCAoZS5nLiBmcm9tIEpTIHN0cmluZykuXG4gKlxuICogVG8gcmV0cmlldmUgZGF0YSBmcm9tIHRoZSBidWZmZXIgdXNlIGVpdGhlciBvbmUgb2YgdGhlIHByaW1pdGl2ZSBtZXRob2RzXG4gKiAoaWYgb25seSBvbmUgcGFydGljdWxhciB2YWx1ZSBpcyBuZWVkZWQpIG9yIGBsb2FkQ2VsbGAuIEZvciBgbG9hZENlbGxgIGluIGEgbG9vcFxuICogbWVtb3J5IGFsbG9jcyAvIEdDIHByZXNzdXJlIGNhbiBiZSBncmVhdGx5IHJlZHVjZWQgYnkgcmV1c2luZyB0aGUgQ2VsbERhdGEgb2JqZWN0LlxuICovXG5leHBvcnQgY2xhc3MgQnVmZmVyTGluZSBpbXBsZW1lbnRzIElCdWZmZXJMaW5lIHtcbiAgcHJvdGVjdGVkIF9kYXRhOiBVaW50MzJBcnJheTtcbiAgcHJvdGVjdGVkIF9jb21iaW5lZDoge1tpbmRleDogbnVtYmVyXTogc3RyaW5nfSA9IHt9O1xuICBwcm90ZWN0ZWQgX2V4dGVuZGVkQXR0cnM6IHtbaW5kZXg6IG51bWJlcl06IElFeHRlbmRlZEF0dHJzIHwgdW5kZWZpbmVkfSA9IHt9O1xuICBwdWJsaWMgbGVuZ3RoOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29sczogbnVtYmVyLCBmaWxsQ2VsbERhdGE/OiBJQ2VsbERhdGEsIHB1YmxpYyBpc1dyYXBwZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgVWludDMyQXJyYXkoY29scyAqIENFTExfU0laRSk7XG4gICAgY29uc3QgY2VsbCA9IGZpbGxDZWxsRGF0YSB8fCBDZWxsRGF0YS5mcm9tQ2hhckRhdGEoWzAsIE5VTExfQ0VMTF9DSEFSLCBOVUxMX0NFTExfV0lEVEgsIE5VTExfQ0VMTF9DT0RFXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xzOyArK2kpIHtcbiAgICAgIHRoaXMuc2V0Q2VsbChpLCBjZWxsKTtcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBjb2xzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjZWxsIGRhdGEgQ2hhckRhdGEuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBDaGFyRGF0YSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdO1xuICAgIGNvbnN0IGNwID0gY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0s7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkZHXSxcbiAgICAgIChjb250ZW50ICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLKVxuICAgICAgICA/IHRoaXMuX2NvbWJpbmVkW2luZGV4XVxuICAgICAgICA6IChjcCkgPyBzdHJpbmdGcm9tQ29kZVBvaW50KGNwKSA6ICcnLFxuICAgICAgY29udGVudCA+PiBDb250ZW50LldJRFRIX1NISUZULFxuICAgICAgKGNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0spXG4gICAgICAgID8gdGhpcy5fY29tYmluZWRbaW5kZXhdLmNoYXJDb2RlQXQodGhpcy5fY29tYmluZWRbaW5kZXhdLmxlbmd0aCAtIDEpXG4gICAgICAgIDogY3BcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjZWxsIGRhdGEgZnJvbSBDaGFyRGF0YS5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHB1YmxpYyBzZXQoaW5kZXg6IG51bWJlciwgdmFsdWU6IENoYXJEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuRkddID0gdmFsdWVbQ0hBUl9EQVRBX0FUVFJfSU5ERVhdO1xuICAgIGlmICh2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0ubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5fY29tYmluZWRbaW5kZXhdID0gdmFsdWVbMV07XG4gICAgICB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXSA9IGluZGV4IHwgQ29udGVudC5JU19DT01CSU5FRF9NQVNLIHwgKHZhbHVlW0NIQVJfREFUQV9XSURUSF9JTkRFWF0gPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMCkgfCAodmFsdWVbQ0hBUl9EQVRBX1dJRFRIX0lOREVYXSA8PCBDb250ZW50LldJRFRIX1NISUZUKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcHJpbWl0aXZlIGdldHRlcnNcbiAgICogdXNlIHRoZXNlIHdoZW4gb25seSBvbmUgdmFsdWUgaXMgbmVlZGVkLCBvdGhlcndpc2UgdXNlIGBsb2FkQ2VsbGBcbiAgICovXG4gIHB1YmxpYyBnZXRXaWR0aChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gPj4gQ29udGVudC5XSURUSF9TSElGVDtcbiAgfVxuXG4gIC8qKiBUZXN0IHdoZXRoZXIgY29udGVudCBoYXMgd2lkdGguICovXG4gIHB1YmxpYyBoYXNXaWR0aChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gJiBDb250ZW50LldJRFRIX01BU0s7XG4gIH1cblxuICAvKiogR2V0IEZHIGNlbGwgY29tcG9uZW50LiAqL1xuICBwdWJsaWMgZ2V0RmcoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkZHXTtcbiAgfVxuXG4gIC8qKiBHZXQgQkcgY2VsbCBjb21wb25lbnQuICovXG4gIHB1YmxpYyBnZXRCZyhpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQkddO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3Qgd2hldGhlciBjb250YWlucyBhbnkgY2hhcnMuXG4gICAqIEJhc2ljYWxseSBhbiBlbXB0eSBoYXMgbm8gY29udGVudCwgYnV0IG90aGVyIGNlbGxzIG1pZ2h0IGRpZmZlciBpbiBGRy9CR1xuICAgKiBmcm9tIHJlYWwgZW1wdHkgY2VsbHMuXG4gICAqL1xuICBwdWJsaWMgaGFzQ29udGVudChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gJiBDb250ZW50LkhBU19DT05URU5UX01BU0s7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvZGVwb2ludCBvZiB0aGUgY2VsbC5cbiAgICogVG8gYmUgaW4gbGluZSB3aXRoIGBjb2RlYCBpbiBDaGFyRGF0YSB0aGlzIGVpdGhlciByZXR1cm5zXG4gICAqIGEgc2luZ2xlIFVURjMyIGNvZGVwb2ludCBvciB0aGUgbGFzdCBjb2RlcG9pbnQgb2YgYSBjb21iaW5lZCBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29kZVBvaW50KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXTtcbiAgICBpZiAoY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSykge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbWJpbmVkW2luZGV4XS5jaGFyQ29kZUF0KHRoaXMuX2NvbWJpbmVkW2luZGV4XS5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLO1xuICB9XG5cbiAgLyoqIFRlc3Qgd2hldGhlciB0aGUgY2VsbCBjb250YWlucyBhIGNvbWJpbmVkIHN0cmluZy4gKi9cbiAgcHVibGljIGlzQ29tYmluZWQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHN0cmluZyBjb250ZW50IG9mIHRoZSBjZWxsLiAqL1xuICBwdWJsaWMgZ2V0U3RyaW5nKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXTtcbiAgICBpZiAoY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSykge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbWJpbmVkW2luZGV4XTtcbiAgICB9XG4gICAgaWYgKGNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLKSB7XG4gICAgICByZXR1cm4gc3RyaW5nRnJvbUNvZGVQb2ludChjb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSyk7XG4gICAgfVxuICAgIC8vIHJldHVybiBlbXB0eSBzdHJpbmcgZm9yIGVtcHR5IGNlbGxzXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqIEdldCBzdGF0ZSBvZiBwcm90ZWN0ZWQgZmxhZy4gKi9cbiAgcHVibGljIGlzUHJvdGVjdGVkKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5CR10gJiBCZ0ZsYWdzLlBST1RFQ1RFRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGRhdGEgYXQgYGluZGV4YCBpbnRvIGBjZWxsYC4gVGhpcyBpcyB1c2VkIHRvIGFjY2VzcyBjZWxscyBpbiBhIHdheSB0aGF0J3MgbW9yZSBmcmllbmRseVxuICAgKiB0byBHQyBhcyBpdCBzaWduaWZpY2FudGx5IHJlZHVjZWQgdGhlIGFtb3VudCBvZiBuZXcgb2JqZWN0cy9yZWZlcmVuY2VzIG5lZWRlZC5cbiAgICovXG4gIHB1YmxpYyBsb2FkQ2VsbChpbmRleDogbnVtYmVyLCBjZWxsOiBJQ2VsbERhdGEpOiBJQ2VsbERhdGEge1xuICAgICRzdGFydEluZGV4ID0gaW5kZXggKiBDRUxMX1NJWkU7XG4gICAgY2VsbC5jb250ZW50ID0gdGhpcy5fZGF0YVskc3RhcnRJbmRleCArIENlbGwuQ09OVEVOVF07XG4gICAgY2VsbC5mZyA9IHRoaXMuX2RhdGFbJHN0YXJ0SW5kZXggKyBDZWxsLkZHXTtcbiAgICBjZWxsLmJnID0gdGhpcy5fZGF0YVskc3RhcnRJbmRleCArIENlbGwuQkddO1xuICAgIGlmIChjZWxsLmNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0spIHtcbiAgICAgIGNlbGwuY29tYmluZWREYXRhID0gdGhpcy5fY29tYmluZWRbaW5kZXhdO1xuICAgIH1cbiAgICBpZiAoY2VsbC5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSB7XG4gICAgICBjZWxsLmV4dGVuZGVkID0gdGhpcy5fZXh0ZW5kZWRBdHRyc1tpbmRleF0hO1xuICAgIH1cbiAgICByZXR1cm4gY2VsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZGF0YSBhdCBgaW5kZXhgIHRvIGBjZWxsYC5cbiAgICovXG4gIHB1YmxpYyBzZXRDZWxsKGluZGV4OiBudW1iZXIsIGNlbGw6IElDZWxsRGF0YSk6IHZvaWQge1xuICAgIGlmIChjZWxsLmNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0spIHtcbiAgICAgIHRoaXMuX2NvbWJpbmVkW2luZGV4XSA9IGNlbGwuY29tYmluZWREYXRhO1xuICAgIH1cbiAgICBpZiAoY2VsbC5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSB7XG4gICAgICB0aGlzLl9leHRlbmRlZEF0dHJzW2luZGV4XSA9IGNlbGwuZXh0ZW5kZWQ7XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdID0gY2VsbC5jb250ZW50O1xuICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkZHXSA9IGNlbGwuZmc7XG4gICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQkddID0gY2VsbC5iZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY2VsbCBkYXRhIGZyb20gaW5wdXQgaGFuZGxlci5cbiAgICogU2luY2UgdGhlIGlucHV0IGhhbmRsZXIgc2VlIHRoZSBpbmNvbWluZyBjaGFycyBhcyBVVEYzMiBjb2RlcG9pbnRzLFxuICAgKiBpdCBnZXRzIGFuIG9wdGltaXplZCBhY2Nlc3MgbWV0aG9kLlxuICAgKi9cbiAgcHVibGljIHNldENlbGxGcm9tQ29kZXBvaW50KGluZGV4OiBudW1iZXIsIGNvZGVQb2ludDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBhdHRyczogSUF0dHJpYnV0ZURhdGEpOiB2b2lkIHtcbiAgICBpZiAoYXR0cnMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkge1xuICAgICAgdGhpcy5fZXh0ZW5kZWRBdHRyc1tpbmRleF0gPSBhdHRycy5leHRlbmRlZDtcbiAgICB9XG4gICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gPSBjb2RlUG9pbnQgfCAod2lkdGggPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuRkddID0gYXR0cnMuZmc7XG4gICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQkddID0gYXR0cnMuYmc7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29kZXBvaW50IHRvIGEgY2VsbCBmcm9tIGlucHV0IGhhbmRsZXIuXG4gICAqIER1cmluZyBpbnB1dCBzdGFnZSBjb21iaW5pbmcgY2hhcnMgd2l0aCBhIHdpZHRoIG9mIDAgZm9sbG93IGFuZCBzdGFja1xuICAgKiBvbnRvIGEgbGVhZGluZyBjaGFyLiBTaW5jZSB3ZSBhbHJlYWR5IHNldCB0aGUgYXR0cnNcbiAgICogYnkgdGhlIHByZXZpb3VzIGBzZXREYXRhRnJvbUNvZGVQb2ludGAgY2FsbCwgd2UgY2FuIG9taXQgaXQgaGVyZS5cbiAgICovXG4gIHB1YmxpYyBhZGRDb2RlcG9pbnRUb0NlbGwoaW5kZXg6IG51bWJlciwgY29kZVBvaW50OiBudW1iZXIsIHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgY29udGVudCA9IHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdO1xuICAgIGlmIChjb250ZW50ICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLKSB7XG4gICAgICAvLyB3ZSBhbHJlYWR5IGhhdmUgYSBjb21iaW5lZCBzdHJpbmcsIHNpbXBseSBhZGRcbiAgICAgIHRoaXMuX2NvbWJpbmVkW2luZGV4XSArPSBzdHJpbmdGcm9tQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSykge1xuICAgICAgICAvLyBub3JtYWwgY2FzZSBmb3IgY29tYmluaW5nIGNoYXJzOlxuICAgICAgICAvLyAgLSBtb3ZlIGN1cnJlbnQgbGVhZGluZyBjaGFyICsgbmV3IG9uZSBpbnRvIGNvbWJpbmVkIHN0cmluZ1xuICAgICAgICAvLyAgLSBzZXQgY29tYmluZWQgZmxhZ1xuICAgICAgICB0aGlzLl9jb21iaW5lZFtpbmRleF0gPSBzdHJpbmdGcm9tQ29kZVBvaW50KGNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLKSArIHN0cmluZ0Zyb21Db2RlUG9pbnQoY29kZVBvaW50KTtcbiAgICAgICAgY29udGVudCAmPSB+Q29udGVudC5DT0RFUE9JTlRfTUFTSzsgLy8gc2V0IGNvZGVwb2ludCBpbiBidWZmZXIgdG8gMFxuICAgICAgICBjb250ZW50IHw9IENvbnRlbnQuSVNfQ09NQklORURfTUFTSztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIC0gd2UgYWN0dWFsbHkgaGF2ZSBubyBkYXRhIGluIHRoZSBjZWxsIHlldFxuICAgICAgICAvLyBzaW1wbHkgc2V0IHRoZSBkYXRhIGluIHRoZSBjZWxsIGJ1ZmZlciB3aXRoIGEgd2lkdGggb2YgMVxuICAgICAgICBjb250ZW50ID0gY29kZVBvaW50IHwgKDEgPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3aWR0aCkge1xuICAgICAgY29udGVudCAmPSB+Q29udGVudC5XSURUSF9NQVNLO1xuICAgICAgY29udGVudCB8PSB3aWR0aCA8PCBDb250ZW50LldJRFRIX1NISUZUO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXSA9IGNvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgaW5zZXJ0Q2VsbHMocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmlsbENlbGxEYXRhOiBJQ2VsbERhdGEpOiB2b2lkIHtcbiAgICBwb3MgJT0gdGhpcy5sZW5ndGg7XG5cbiAgICAvLyBoYW5kbGUgZnVsbHdpZHRoIGF0IHBvczogcmVzZXQgY2VsbCBvbmUgdG8gdGhlIGxlZnQgaWYgcG9zIGlzIHNlY29uZCBjZWxsIG9mIGEgd2lkZSBjaGFyXG4gICAgaWYgKHBvcyAmJiB0aGlzLmdldFdpZHRoKHBvcyAtIDEpID09PSAyKSB7XG4gICAgICB0aGlzLnNldENlbGxGcm9tQ29kZXBvaW50KHBvcyAtIDEsIDAsIDEsIGZpbGxDZWxsRGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKG4gPCB0aGlzLmxlbmd0aCAtIHBvcykge1xuICAgICAgY29uc3QgY2VsbCA9IG5ldyBDZWxsRGF0YSgpO1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGVuZ3RoIC0gcG9zIC0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHRoaXMuc2V0Q2VsbChwb3MgKyBuICsgaSwgdGhpcy5sb2FkQ2VsbChwb3MgKyBpLCBjZWxsKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICB0aGlzLnNldENlbGwocG9zICsgaSwgZmlsbENlbGxEYXRhKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdGhpcy5zZXRDZWxsKGksIGZpbGxDZWxsRGF0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIGZ1bGx3aWR0aCBhdCBsaW5lIGVuZDogcmVzZXQgbGFzdCBjZWxsIGlmIGl0IGlzIGZpcnN0IGNlbGwgb2YgYSB3aWRlIGNoYXJcbiAgICBpZiAodGhpcy5nZXRXaWR0aCh0aGlzLmxlbmd0aCAtIDEpID09PSAyKSB7XG4gICAgICB0aGlzLnNldENlbGxGcm9tQ29kZXBvaW50KHRoaXMubGVuZ3RoIC0gMSwgMCwgMSwgZmlsbENlbGxEYXRhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlQ2VsbHMocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmlsbENlbGxEYXRhOiBJQ2VsbERhdGEpOiB2b2lkIHtcbiAgICBwb3MgJT0gdGhpcy5sZW5ndGg7XG4gICAgaWYgKG4gPCB0aGlzLmxlbmd0aCAtIHBvcykge1xuICAgICAgY29uc3QgY2VsbCA9IG5ldyBDZWxsRGF0YSgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aCAtIHBvcyAtIG47ICsraSkge1xuICAgICAgICB0aGlzLnNldENlbGwocG9zICsgaSwgdGhpcy5sb2FkQ2VsbChwb3MgKyBuICsgaSwgY2VsbCkpO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGVuZ3RoIC0gbjsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdGhpcy5zZXRDZWxsKGksIGZpbGxDZWxsRGF0YSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHRoaXMuc2V0Q2VsbChpLCBmaWxsQ2VsbERhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGhhbmRsZSBmdWxsd2lkdGggYXQgcG9zOlxuICAgIC8vIC0gcmVzZXQgcG9zLTEgaWYgd2lkZSBjaGFyXG4gICAgLy8gLSByZXNldCBwb3MgaWYgd2lkdGg9PTAgKHByZXZpb3VzIHNlY29uZCBjZWxsIG9mIGEgd2lkZSBjaGFyKVxuICAgIGlmIChwb3MgJiYgdGhpcy5nZXRXaWR0aChwb3MgLSAxKSA9PT0gMikge1xuICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChwb3MgLSAxLCAwLCAxLCBmaWxsQ2VsbERhdGEpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRXaWR0aChwb3MpID09PSAwICYmICF0aGlzLmhhc0NvbnRlbnQocG9zKSkge1xuICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChwb3MsIDAsIDEsIGZpbGxDZWxsRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlcGxhY2VDZWxscyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZmlsbENlbGxEYXRhOiBJQ2VsbERhdGEsIHJlc3BlY3RQcm90ZWN0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBmdWxsIGJyYW5jaGluZyBvbiByZXNwZWN0UHJvdGVjdD09dHJ1ZSwgaG9wZWZ1bGx5IGdldHRpbmcgZmFzdCBKSVQgZm9yIHN0YW5kYXJkIGNhc2VcbiAgICBpZiAocmVzcGVjdFByb3RlY3QpIHtcbiAgICAgIGlmIChzdGFydCAmJiB0aGlzLmdldFdpZHRoKHN0YXJ0IC0gMSkgPT09IDIgJiYgIXRoaXMuaXNQcm90ZWN0ZWQoc3RhcnQgLSAxKSkge1xuICAgICAgICB0aGlzLnNldENlbGxGcm9tQ29kZXBvaW50KHN0YXJ0IC0gMSwgMCwgMSwgZmlsbENlbGxEYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmdldFdpZHRoKGVuZCAtIDEpID09PSAyICYmICF0aGlzLmlzUHJvdGVjdGVkKGVuZCkpIHtcbiAgICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChlbmQsIDAsIDEsIGZpbGxDZWxsRGF0YSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoc3RhcnQgPCBlbmQgICYmIHN0YXJ0IDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzUHJvdGVjdGVkKHN0YXJ0KSkge1xuICAgICAgICAgIHRoaXMuc2V0Q2VsbChzdGFydCwgZmlsbENlbGxEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydCsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZSBmdWxsd2lkdGggYXQgc3RhcnQ6IHJlc2V0IGNlbGwgb25lIHRvIHRoZSBsZWZ0IGlmIHN0YXJ0IGlzIHNlY29uZCBjZWxsIG9mIGEgd2lkZSBjaGFyXG4gICAgaWYgKHN0YXJ0ICYmIHRoaXMuZ2V0V2lkdGgoc3RhcnQgLSAxKSA9PT0gMikge1xuICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChzdGFydCAtIDEsIDAsIDEsIGZpbGxDZWxsRGF0YSk7XG4gICAgfVxuICAgIC8vIGhhbmRsZSBmdWxsd2lkdGggYXQgbGFzdCBjZWxsICsgMTogcmVzZXQgdG8gZW1wdHkgY2VsbCBpZiBpdCBpcyBzZWNvbmQgcGFydCBvZiBhIHdpZGUgY2hhclxuICAgIGlmIChlbmQgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmdldFdpZHRoKGVuZCAtIDEpID09PSAyKSB7XG4gICAgICB0aGlzLnNldENlbGxGcm9tQ29kZXBvaW50KGVuZCwgMCwgMSwgZmlsbENlbGxEYXRhKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoc3RhcnQgPCBlbmQgICYmIHN0YXJ0IDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2V0Q2VsbChzdGFydCsrLCBmaWxsQ2VsbERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgQnVmZmVyTGluZSB0byBgY29sc2AgZmlsbGluZyBleGNlc3MgY2VsbHMgd2l0aCBgZmlsbENlbGxEYXRhYC5cbiAgICogVGhlIHVuZGVybHlpbmcgYXJyYXkgYnVmZmVyIHdpbGwgbm90IGNoYW5nZSBpZiB0aGVyZSBpcyBzdGlsbCBlbm91Z2ggc3BhY2VcbiAgICogdG8gaG9sZCB0aGUgbmV3IGJ1ZmZlciBsaW5lIGRhdGEuXG4gICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcsIHdoZXRoZXIgYSBgY2xlYW51cE1lbW9yeWAgY2FsbCB3b3VsZCBmcmVlXG4gICAqIGV4Y2VzcyBtZW1vcnkgKHRydWUgYWZ0ZXIgc2hyaW5raW5nID4gQ0xFQU5VUF9USFJFU0hPTEQpLlxuICAgKi9cbiAgcHVibGljIHJlc2l6ZShjb2xzOiBudW1iZXIsIGZpbGxDZWxsRGF0YTogSUNlbGxEYXRhKTogYm9vbGVhbiB7XG4gICAgaWYgKGNvbHMgPT09IHRoaXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGF0YS5sZW5ndGggKiA0ICogQ0xFQU5VUF9USFJFU0hPTEQgPCB0aGlzLl9kYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCB1aW50MzJDZWxscyA9IGNvbHMgKiBDRUxMX1NJWkU7XG4gICAgaWYgKGNvbHMgPiB0aGlzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2RhdGEuYnVmZmVyLmJ5dGVMZW5ndGggPj0gdWludDMyQ2VsbHMgKiA0KSB7XG4gICAgICAgIC8vIG9wdGltaXphdGlvbjogYXZvaWQgYWxsb2MgYW5kIGRhdGEgY29weSBpZiBidWZmZXIgaGFzIGVub3VnaCByb29tXG4gICAgICAgIHRoaXMuX2RhdGEgPSBuZXcgVWludDMyQXJyYXkodGhpcy5fZGF0YS5idWZmZXIsIDAsIHVpbnQzMkNlbGxzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNsb3cgcGF0aDogbmV3IGFsbG9jIGFuZCBmdWxsIGRhdGEgY29weVxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQzMkFycmF5KHVpbnQzMkNlbGxzKTtcbiAgICAgICAgZGF0YS5zZXQodGhpcy5fZGF0YSk7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGVuZ3RoOyBpIDwgY29sczsgKytpKSB7XG4gICAgICAgIHRoaXMuc2V0Q2VsbChpLCBmaWxsQ2VsbERhdGEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvcHRpbWl6YXRpb246IGp1c3Qgc2hyaW5rIHRoZSB2aWV3IG9uIGV4aXN0aW5nIGJ1ZmZlclxuICAgICAgdGhpcy5fZGF0YSA9IHRoaXMuX2RhdGEuc3ViYXJyYXkoMCwgdWludDMyQ2VsbHMpO1xuICAgICAgLy8gUmVtb3ZlIGFueSBjdXQgb2ZmIGNvbWJpbmVkIGRhdGFcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLl9jb21iaW5lZCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gcGFyc2VJbnQoa2V5c1tpXSwgMTApO1xuICAgICAgICBpZiAoa2V5ID49IGNvbHMpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fY29tYmluZWRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIGFueSBjdXQgb2ZmIGV4dGVuZGVkIGF0dHJpYnV0ZXNcbiAgICAgIGNvbnN0IGV4dEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLl9leHRlbmRlZEF0dHJzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0S2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBwYXJzZUludChleHRLZXlzW2ldLCAxMCk7XG4gICAgICAgIGlmIChrZXkgPj0gY29scykge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9leHRlbmRlZEF0dHJzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBjb2xzO1xuICAgIHJldHVybiB1aW50MzJDZWxscyAqIDQgKiBDTEVBTlVQX1RIUkVTSE9MRCA8IHRoaXMuX2RhdGEuYnVmZmVyLmJ5dGVMZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cCB1bmRlcmx5aW5nIGFycmF5IGJ1ZmZlci5cbiAgICogQSBjbGVhbnVwIHdpbGwgYmUgdHJpZ2dlcmVkIGlmIHRoZSBhcnJheSBidWZmZXIgZXhjZWVkcyB0aGUgYWN0dWFsIHVzZWRcbiAgICogbWVtb3J5IGJ5IGEgZmFjdG9yIG9mIENMRUFOVVBfVEhSRVNIT0xELlxuICAgKiBSZXR1cm5zIDAgb3IgMSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBjbGVhbnVwIGhhcHBlbmVkLlxuICAgKi9cbiAgcHVibGljIGNsZWFudXBNZW1vcnkoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fZGF0YS5sZW5ndGggKiA0ICogQ0xFQU5VUF9USFJFU0hPTEQgPCB0aGlzLl9kYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuX2RhdGEubGVuZ3RoKTtcbiAgICAgIGRhdGEuc2V0KHRoaXMuX2RhdGEpO1xuICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKiogZmlsbCBhIGxpbmUgd2l0aCBmaWxsQ2hhckRhdGEgKi9cbiAgcHVibGljIGZpbGwoZmlsbENlbGxEYXRhOiBJQ2VsbERhdGEsIHJlc3BlY3RQcm90ZWN0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBmdWxsIGJyYW5jaGluZyBvbiByZXNwZWN0UHJvdGVjdD09dHJ1ZSwgaG9wZWZ1bGx5IGdldHRpbmcgZmFzdCBKSVQgZm9yIHN0YW5kYXJkIGNhc2VcbiAgICBpZiAocmVzcGVjdFByb3RlY3QpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNQcm90ZWN0ZWQoaSkpIHtcbiAgICAgICAgICB0aGlzLnNldENlbGwoaSwgZmlsbENlbGxEYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jb21iaW5lZCA9IHt9O1xuICAgIHRoaXMuX2V4dGVuZGVkQXR0cnMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHRoaXMuc2V0Q2VsbChpLCBmaWxsQ2VsbERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBhbHRlciB0byBhIGZ1bGwgY29weSBvZiBsaW5lICAqL1xuICBwdWJsaWMgY29weUZyb20obGluZTogQnVmZmVyTGluZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxlbmd0aCAhPT0gbGluZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXcgVWludDMyQXJyYXkobGluZS5fZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVzZSBoaWdoIHNwZWVkIGNvcHkgaWYgbGVuZ3RocyBhcmUgZXF1YWxcbiAgICAgIHRoaXMuX2RhdGEuc2V0KGxpbmUuX2RhdGEpO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IGxpbmUubGVuZ3RoO1xuICAgIHRoaXMuX2NvbWJpbmVkID0ge307XG4gICAgZm9yIChjb25zdCBlbCBpbiBsaW5lLl9jb21iaW5lZCkge1xuICAgICAgdGhpcy5fY29tYmluZWRbZWxdID0gbGluZS5fY29tYmluZWRbZWxdO1xuICAgIH1cbiAgICB0aGlzLl9leHRlbmRlZEF0dHJzID0ge307XG4gICAgZm9yIChjb25zdCBlbCBpbiBsaW5lLl9leHRlbmRlZEF0dHJzKSB7XG4gICAgICB0aGlzLl9leHRlbmRlZEF0dHJzW2VsXSA9IGxpbmUuX2V4dGVuZGVkQXR0cnNbZWxdO1xuICAgIH1cbiAgICB0aGlzLmlzV3JhcHBlZCA9IGxpbmUuaXNXcmFwcGVkO1xuICB9XG5cbiAgLyoqIGNyZWF0ZSBhIG5ldyBjbG9uZSAqL1xuICBwdWJsaWMgY2xvbmUoKTogSUJ1ZmZlckxpbmUge1xuICAgIGNvbnN0IG5ld0xpbmUgPSBuZXcgQnVmZmVyTGluZSgwKTtcbiAgICBuZXdMaW5lLl9kYXRhID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuX2RhdGEpO1xuICAgIG5ld0xpbmUubGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgZm9yIChjb25zdCBlbCBpbiB0aGlzLl9jb21iaW5lZCkge1xuICAgICAgbmV3TGluZS5fY29tYmluZWRbZWxdID0gdGhpcy5fY29tYmluZWRbZWxdO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVsIGluIHRoaXMuX2V4dGVuZGVkQXR0cnMpIHtcbiAgICAgIG5ld0xpbmUuX2V4dGVuZGVkQXR0cnNbZWxdID0gdGhpcy5fZXh0ZW5kZWRBdHRyc1tlbF07XG4gICAgfVxuICAgIG5ld0xpbmUuaXNXcmFwcGVkID0gdGhpcy5pc1dyYXBwZWQ7XG4gICAgcmV0dXJuIG5ld0xpbmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHJpbW1lZExlbmd0aCgpOiBudW1iZXIge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBpZiAoKHRoaXMuX2RhdGFbaSAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gJiBDb250ZW50LkhBU19DT05URU5UX01BU0spKSB7XG4gICAgICAgIHJldHVybiBpICsgKHRoaXMuX2RhdGFbaSAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gPj4gQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHVibGljIGdldE5vQmdUcmltbWVkTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIGlmICgodGhpcy5fZGF0YVtpICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXSAmIENvbnRlbnQuSEFTX0NPTlRFTlRfTUFTSykgfHwgKHRoaXMuX2RhdGFbaSAqIENFTExfU0laRSArIENlbGwuQkddICYgQXR0cmlidXRlcy5DTV9NQVNLKSkge1xuICAgICAgICByZXR1cm4gaSArICh0aGlzLl9kYXRhW2kgKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdID4+IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBjb3B5Q2VsbHNGcm9tKHNyYzogQnVmZmVyTGluZSwgc3JjQ29sOiBudW1iZXIsIGRlc3RDb2w6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIGFwcGx5SW5SZXZlcnNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgc3JjRGF0YSA9IHNyYy5fZGF0YTtcbiAgICBpZiAoYXBwbHlJblJldmVyc2UpIHtcbiAgICAgIGZvciAobGV0IGNlbGwgPSBsZW5ndGggLSAxOyBjZWxsID49IDA7IGNlbGwtLSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENFTExfU0laRTsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5fZGF0YVsoZGVzdENvbCArIGNlbGwpICogQ0VMTF9TSVpFICsgaV0gPSBzcmNEYXRhWyhzcmNDb2wgKyBjZWxsKSAqIENFTExfU0laRSArIGldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcmNEYXRhWyhzcmNDb2wgKyBjZWxsKSAqIENFTExfU0laRSArIENlbGwuQkddICYgQmdGbGFncy5IQVNfRVhURU5ERUQpIHtcbiAgICAgICAgICB0aGlzLl9leHRlbmRlZEF0dHJzW2Rlc3RDb2wgKyBjZWxsXSA9IHNyYy5fZXh0ZW5kZWRBdHRyc1tzcmNDb2wgKyBjZWxsXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBjZWxsID0gMDsgY2VsbCA8IGxlbmd0aDsgY2VsbCsrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ0VMTF9TSVpFOyBpKyspIHtcbiAgICAgICAgICB0aGlzLl9kYXRhWyhkZXN0Q29sICsgY2VsbCkgKiBDRUxMX1NJWkUgKyBpXSA9IHNyY0RhdGFbKHNyY0NvbCArIGNlbGwpICogQ0VMTF9TSVpFICsgaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNyY0RhdGFbKHNyY0NvbCArIGNlbGwpICogQ0VMTF9TSVpFICsgQ2VsbC5CR10gJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkge1xuICAgICAgICAgIHRoaXMuX2V4dGVuZGVkQXR0cnNbZGVzdENvbCArIGNlbGxdID0gc3JjLl9leHRlbmRlZEF0dHJzW3NyY0NvbCArIGNlbGxdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTW92ZSBhbnkgY29tYmluZWQgZGF0YSBvdmVyIGFzIG5lZWRlZCwgRklYTUU6IHJlcGVhdCBmb3IgZXh0ZW5kZWQgYXR0cnNcbiAgICBjb25zdCBzcmNDb21iaW5lZEtleXMgPSBPYmplY3Qua2V5cyhzcmMuX2NvbWJpbmVkKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNyY0NvbWJpbmVkS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcGFyc2VJbnQoc3JjQ29tYmluZWRLZXlzW2ldLCAxMCk7XG4gICAgICBpZiAoa2V5ID49IHNyY0NvbCkge1xuICAgICAgICB0aGlzLl9jb21iaW5lZFtrZXkgLSBzcmNDb2wgKyBkZXN0Q29sXSA9IHNyYy5fY29tYmluZWRba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNsYXRlcyB0aGUgYnVmZmVyIGxpbmUgdG8gYSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB0cmltUmlnaHQgV2hldGhlciB0byB0cmltIGFueSBlbXB0eSBjZWxscyBvbiB0aGUgcmlnaHQuXG4gICAqIEBwYXJhbSBzdGFydENvbCBUaGUgY29sdW1uIHRvIHN0YXJ0IHRoZSBzdHJpbmcgKDAtYmFzZWQgaW5jbHVzaXZlKS5cbiAgICogQHBhcmFtIGVuZENvbCBUaGUgY29sdW1uIHRvIGVuZCB0aGUgc3RyaW5nICgwLWJhc2VkIGV4Y2x1c2l2ZSkuXG4gICAqIEBwYXJhbSBvdXRDb2x1bW5zIGlmIHNwZWNpZmllZCwgdGhpcyBhcnJheSB3aWxsIGJlIGZpbGxlZCB3aXRoIGNvbHVtbiBudW1iZXJzIHN1Y2ggdGhhdFxuICAgKiBgcmV0dXJuZWRTdHJpbmdbaV1gIGlzIGRpc3BsYXllZCBhdCBgb3V0Q29sdW1uc1tpXWAgY29sdW1uLiBgb3V0Q29sdW1uc1tyZXR1cm5lZFN0cmluZy5sZW5ndGhdYFxuICAgKiBpcyB3aGVyZSB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZyBgcmV0dXJuZWRTdHJpbmdgIHdpbGwgYmUgZGlzcGxheWVkLlxuICAgKlxuICAgKiBXaGVuIGEgc2luZ2xlIGNlbGwgaXMgdHJhbnNsYXRlZCB0byBtdWx0aXBsZSBVVEYtMTYgY29kZSB1bml0cyAoZS5nLiBzdXJyb2dhdGUgcGFpcikgaW4gdGhlXG4gICAqIHJldHVybmVkIHN0cmluZywgdGhlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiBgb3V0Q29sdW1uc2Agd2lsbCBoYXZlIHRoZSBzYW1lIGNvbHVtbiBudW1iZXIuXG4gICAqL1xuICBwdWJsaWMgdHJhbnNsYXRlVG9TdHJpbmcodHJpbVJpZ2h0PzogYm9vbGVhbiwgc3RhcnRDb2w/OiBudW1iZXIsIGVuZENvbD86IG51bWJlciwgb3V0Q29sdW1ucz86IG51bWJlcltdKTogc3RyaW5nIHtcbiAgICBzdGFydENvbCA9IHN0YXJ0Q29sID8/IDA7XG4gICAgZW5kQ29sID0gZW5kQ29sID8/IHRoaXMubGVuZ3RoO1xuICAgIGlmICh0cmltUmlnaHQpIHtcbiAgICAgIGVuZENvbCA9IE1hdGgubWluKGVuZENvbCwgdGhpcy5nZXRUcmltbWVkTGVuZ3RoKCkpO1xuICAgIH1cbiAgICBpZiAob3V0Q29sdW1ucykge1xuICAgICAgb3V0Q29sdW1ucy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgd2hpbGUgKHN0YXJ0Q29sIDwgZW5kQ29sKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fZGF0YVtzdGFydENvbCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF07XG4gICAgICBjb25zdCBjcCA9IGNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLO1xuICAgICAgY29uc3QgY2hhcnMgPSAoY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSykgPyB0aGlzLl9jb21iaW5lZFtzdGFydENvbF0gOiAoY3ApID8gc3RyaW5nRnJvbUNvZGVQb2ludChjcCkgOiBXSElURVNQQUNFX0NFTExfQ0hBUjtcbiAgICAgIHJlc3VsdCArPSBjaGFycztcbiAgICAgIGlmIChvdXRDb2x1bW5zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBvdXRDb2x1bW5zLnB1c2goc3RhcnRDb2wpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFydENvbCArPSAoY29udGVudCA+PiBDb250ZW50LldJRFRIX1NISUZUKSB8fCAxOyAvLyBhbHdheXMgYWR2YW5jZSBieSBhdCBsZWFzdCAxXG4gICAgfVxuICAgIGlmIChvdXRDb2x1bW5zKSB7XG4gICAgICBvdXRDb2x1bW5zLnB1c2goc3RhcnRDb2wpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQnVmZmVyUmFuZ2UgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZ2VMZW5ndGgocmFuZ2U6IElCdWZmZXJSYW5nZSwgYnVmZmVyQ29sczogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHJhbmdlLnN0YXJ0LnkgPiByYW5nZS5lbmQueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQnVmZmVyIHJhbmdlIGVuZCAoJHtyYW5nZS5lbmQueH0sICR7cmFuZ2UuZW5kLnl9KSBjYW5ub3QgYmUgYmVmb3JlIHN0YXJ0ICgke3JhbmdlLnN0YXJ0Lnh9LCAke3JhbmdlLnN0YXJ0Lnl9KWApO1xuICB9XG4gIHJldHVybiBidWZmZXJDb2xzICogKHJhbmdlLmVuZC55IC0gcmFuZ2Uuc3RhcnQueSkgKyAocmFuZ2UuZW5kLnggLSByYW5nZS5zdGFydC54ICsgMSk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBCdWZmZXJMaW5lIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9CdWZmZXJMaW5lJztcbmltcG9ydCB7IENpcmN1bGFyTGlzdCB9IGZyb20gJ2NvbW1vbi9DaXJjdWxhckxpc3QnO1xuaW1wb3J0IHsgSUJ1ZmZlckxpbmUsIElDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU5ld0xheW91dFJlc3VsdCB7XG4gIGxheW91dDogbnVtYmVyW107XG4gIGNvdW50UmVtb3ZlZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV2YWx1YXRlcyBhbmQgcmV0dXJucyBpbmRleGVzIHRvIGJlIHJlbW92ZWQgYWZ0ZXIgYSByZWZsb3cgbGFyZ2VyIG9jY3Vycy4gTGluZXMgd2lsbCBiZSByZW1vdmVkXG4gKiB3aGVuIGEgd3JhcHBlZCBsaW5lIHVud3JhcHMuXG4gKiBAcGFyYW0gbGluZXMgVGhlIGJ1ZmZlciBsaW5lcy5cbiAqIEBwYXJhbSBvbGRDb2xzIFRoZSBjb2x1bW5zIGJlZm9yZSByZXNpemVcbiAqIEBwYXJhbSBuZXdDb2xzIFRoZSBjb2x1bW5zIGFmdGVyIHJlc2l6ZS5cbiAqIEBwYXJhbSBidWZmZXJBYnNvbHV0ZVkgVGhlIGFic29sdXRlIHkgcG9zaXRpb24gb2YgdGhlIGN1cnNvciAoYmFzZVkgKyBjdXJzb3JZKS5cbiAqIEBwYXJhbSBudWxsQ2VsbCBUaGUgY2VsbCBkYXRhIHRvIHVzZSB3aGVuIGZpbGxpbmcgaW4gZW1wdHkgY2VsbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsb3dMYXJnZXJHZXRMaW5lc1RvUmVtb3ZlKGxpbmVzOiBDaXJjdWxhckxpc3Q8SUJ1ZmZlckxpbmU+LCBvbGRDb2xzOiBudW1iZXIsIG5ld0NvbHM6IG51bWJlciwgYnVmZmVyQWJzb2x1dGVZOiBudW1iZXIsIG51bGxDZWxsOiBJQ2VsbERhdGEpOiBudW1iZXJbXSB7XG4gIC8vIEdhdGhlciBhbGwgQnVmZmVyTGluZXMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgQnVmZmVyIGhlcmUgc28gdGhhdCB0aGV5IGNhbiBiZVxuICAvLyBiYXRjaGVkIHVwIGFuZCBvbmx5IGNvbW1pdHRlZCBvbmNlXG4gIGNvbnN0IHRvUmVtb3ZlOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAobGV0IHkgPSAwOyB5IDwgbGluZXMubGVuZ3RoIC0gMTsgeSsrKSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyByb3cgaXMgd3JhcHBlZFxuICAgIGxldCBpID0geTtcbiAgICBsZXQgbmV4dExpbmUgPSBsaW5lcy5nZXQoKytpKSBhcyBCdWZmZXJMaW5lO1xuICAgIGlmICghbmV4dExpbmUuaXNXcmFwcGVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBob3cgbWFueSBsaW5lcyBpdCdzIHdyYXBwZWQgZm9yXG4gICAgY29uc3Qgd3JhcHBlZExpbmVzOiBCdWZmZXJMaW5lW10gPSBbbGluZXMuZ2V0KHkpIGFzIEJ1ZmZlckxpbmVdO1xuICAgIHdoaWxlIChpIDwgbGluZXMubGVuZ3RoICYmIG5leHRMaW5lLmlzV3JhcHBlZCkge1xuICAgICAgd3JhcHBlZExpbmVzLnB1c2gobmV4dExpbmUpO1xuICAgICAgbmV4dExpbmUgPSBsaW5lcy5nZXQoKytpKSBhcyBCdWZmZXJMaW5lO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXNlIGxpbmVzIGNvbnRhaW4gdGhlIGN1cnNvciBkb24ndCB0b3VjaCB0aGVtLCB0aGUgcHJvZ3JhbSB3aWxsIGhhbmRsZSBmaXhpbmcgdXAgd3JhcHBlZFxuICAgIC8vIGxpbmVzIHdpdGggdGhlIGN1cnNvclxuICAgIGlmIChidWZmZXJBYnNvbHV0ZVkgPj0geSAmJiBidWZmZXJBYnNvbHV0ZVkgPCBpKSB7XG4gICAgICB5ICs9IHdyYXBwZWRMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gQ29weSBidWZmZXIgZGF0YSB0byBuZXcgbG9jYXRpb25zXG4gICAgbGV0IGRlc3RMaW5lSW5kZXggPSAwO1xuICAgIGxldCBkZXN0Q29sID0gZ2V0V3JhcHBlZExpbmVUcmltbWVkTGVuZ3RoKHdyYXBwZWRMaW5lcywgZGVzdExpbmVJbmRleCwgb2xkQ29scyk7XG4gICAgbGV0IHNyY0xpbmVJbmRleCA9IDE7XG4gICAgbGV0IHNyY0NvbCA9IDA7XG4gICAgd2hpbGUgKHNyY0xpbmVJbmRleCA8IHdyYXBwZWRMaW5lcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNyY1RyaW1tZWRUaW5lTGVuZ3RoID0gZ2V0V3JhcHBlZExpbmVUcmltbWVkTGVuZ3RoKHdyYXBwZWRMaW5lcywgc3JjTGluZUluZGV4LCBvbGRDb2xzKTtcbiAgICAgIGNvbnN0IHNyY1JlbWFpbmluZ0NlbGxzID0gc3JjVHJpbW1lZFRpbmVMZW5ndGggLSBzcmNDb2w7XG4gICAgICBjb25zdCBkZXN0UmVtYWluaW5nQ2VsbHMgPSBuZXdDb2xzIC0gZGVzdENvbDtcbiAgICAgIGNvbnN0IGNlbGxzVG9Db3B5ID0gTWF0aC5taW4oc3JjUmVtYWluaW5nQ2VsbHMsIGRlc3RSZW1haW5pbmdDZWxscyk7XG5cbiAgICAgIHdyYXBwZWRMaW5lc1tkZXN0TGluZUluZGV4XS5jb3B5Q2VsbHNGcm9tKHdyYXBwZWRMaW5lc1tzcmNMaW5lSW5kZXhdLCBzcmNDb2wsIGRlc3RDb2wsIGNlbGxzVG9Db3B5LCBmYWxzZSk7XG5cbiAgICAgIGRlc3RDb2wgKz0gY2VsbHNUb0NvcHk7XG4gICAgICBpZiAoZGVzdENvbCA9PT0gbmV3Q29scykge1xuICAgICAgICBkZXN0TGluZUluZGV4Kys7XG4gICAgICAgIGRlc3RDb2wgPSAwO1xuICAgICAgfVxuICAgICAgc3JjQ29sICs9IGNlbGxzVG9Db3B5O1xuICAgICAgaWYgKHNyY0NvbCA9PT0gc3JjVHJpbW1lZFRpbmVMZW5ndGgpIHtcbiAgICAgICAgc3JjTGluZUluZGV4Kys7XG4gICAgICAgIHNyY0NvbCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbGFzdCBjZWxsIGlzbid0IHdpZGUsIGlmIGl0IGlzIGNvcHkgaXQgdG8gdGhlIGN1cnJlbnQgZGVzdFxuICAgICAgaWYgKGRlc3RDb2wgPT09IDAgJiYgZGVzdExpbmVJbmRleCAhPT0gMCkge1xuICAgICAgICBpZiAod3JhcHBlZExpbmVzW2Rlc3RMaW5lSW5kZXggLSAxXS5nZXRXaWR0aChuZXdDb2xzIC0gMSkgPT09IDIpIHtcbiAgICAgICAgICB3cmFwcGVkTGluZXNbZGVzdExpbmVJbmRleF0uY29weUNlbGxzRnJvbSh3cmFwcGVkTGluZXNbZGVzdExpbmVJbmRleCAtIDFdLCBuZXdDb2xzIC0gMSwgZGVzdENvbCsrLCAxLCBmYWxzZSk7XG4gICAgICAgICAgLy8gTnVsbCBvdXQgdGhlIGVuZCBvZiB0aGUgbGFzdCByb3dcbiAgICAgICAgICB3cmFwcGVkTGluZXNbZGVzdExpbmVJbmRleCAtIDFdLnNldENlbGwobmV3Q29scyAtIDEsIG51bGxDZWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFyIG91dCByZW1haW5pbmcgY2VsbHMgb3IgZnJhZ21lbnRzIGNvdWxkIHJlbWFpbjtcbiAgICB3cmFwcGVkTGluZXNbZGVzdExpbmVJbmRleF0ucmVwbGFjZUNlbGxzKGRlc3RDb2wsIG5ld0NvbHMsIG51bGxDZWxsKTtcblxuICAgIC8vIFdvcmsgYmFja3dhcmRzIGFuZCByZW1vdmUgYW55IHJvd3MgYXQgdGhlIGVuZCB0aGF0IG9ubHkgY29udGFpbiBudWxsIGNlbGxzXG4gICAgbGV0IGNvdW50VG9SZW1vdmUgPSAwO1xuICAgIGZvciAobGV0IGkgPSB3cmFwcGVkTGluZXMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgaWYgKGkgPiBkZXN0TGluZUluZGV4IHx8IHdyYXBwZWRMaW5lc1tpXS5nZXRUcmltbWVkTGVuZ3RoKCkgPT09IDApIHtcbiAgICAgICAgY291bnRUb1JlbW92ZSsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvdW50VG9SZW1vdmUgPiAwKSB7XG4gICAgICB0b1JlbW92ZS5wdXNoKHkgKyB3cmFwcGVkTGluZXMubGVuZ3RoIC0gY291bnRUb1JlbW92ZSk7IC8vIGluZGV4XG4gICAgICB0b1JlbW92ZS5wdXNoKGNvdW50VG9SZW1vdmUpO1xuICAgIH1cblxuICAgIHkgKz0gd3JhcHBlZExpbmVzLmxlbmd0aCAtIDE7XG4gIH1cbiAgcmV0dXJuIHRvUmVtb3ZlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybiB0aGUgbmV3IGxheW91dCBmb3IgbGluZXMgZ2l2ZW4gYW4gYXJyYXkgb2YgaW5kZXhlcyB0byBiZSByZW1vdmVkLlxuICogQHBhcmFtIGxpbmVzIFRoZSBidWZmZXIgbGluZXMuXG4gKiBAcGFyYW0gdG9SZW1vdmUgVGhlIGluZGV4ZXMgdG8gcmVtb3ZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmbG93TGFyZ2VyQ3JlYXRlTmV3TGF5b3V0KGxpbmVzOiBDaXJjdWxhckxpc3Q8SUJ1ZmZlckxpbmU+LCB0b1JlbW92ZTogbnVtYmVyW10pOiBJTmV3TGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgbGF5b3V0OiBudW1iZXJbXSA9IFtdO1xuICAvLyBGaXJzdCBpdGVyYXRlIHRocm91Z2ggdGhlIGxpc3QgYW5kIGdldCB0aGUgYWN0dWFsIGluZGV4ZXMgdG8gdXNlIGZvciByb3dzXG4gIGxldCBuZXh0VG9SZW1vdmVJbmRleCA9IDA7XG4gIGxldCBuZXh0VG9SZW1vdmVTdGFydCA9IHRvUmVtb3ZlW25leHRUb1JlbW92ZUluZGV4XTtcbiAgbGV0IGNvdW50UmVtb3ZlZFNvRmFyID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChuZXh0VG9SZW1vdmVTdGFydCA9PT0gaSkge1xuICAgICAgY29uc3QgY291bnRUb1JlbW92ZSA9IHRvUmVtb3ZlWysrbmV4dFRvUmVtb3ZlSW5kZXhdO1xuXG4gICAgICAvLyBUZWxsIG1hcmtlcnMgdGhhdCB0aGVyZSB3YXMgYSBkZWxldGlvblxuICAgICAgbGluZXMub25EZWxldGVFbWl0dGVyLmZpcmUoe1xuICAgICAgICBpbmRleDogaSAtIGNvdW50UmVtb3ZlZFNvRmFyLFxuICAgICAgICBhbW91bnQ6IGNvdW50VG9SZW1vdmVcbiAgICAgIH0pO1xuXG4gICAgICBpICs9IGNvdW50VG9SZW1vdmUgLSAxO1xuICAgICAgY291bnRSZW1vdmVkU29GYXIgKz0gY291bnRUb1JlbW92ZTtcbiAgICAgIG5leHRUb1JlbW92ZVN0YXJ0ID0gdG9SZW1vdmVbKytuZXh0VG9SZW1vdmVJbmRleF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheW91dC5wdXNoKGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGxheW91dCxcbiAgICBjb3VudFJlbW92ZWQ6IGNvdW50UmVtb3ZlZFNvRmFyXG4gIH07XG59XG5cbi8qKlxuICogQXBwbGllcyBhIG5ldyBsYXlvdXQgdG8gdGhlIGJ1ZmZlci4gVGhpcyBlc3NlbnRpYWxseSBkb2VzIHRoZSBzYW1lIGFzIG1hbnkgc3BsaWNlIGNhbGxzIGJ1dCBpdCdzXG4gKiBkb25lIGFsbCBhdCBvbmNlIGluIGEgc2luZ2xlIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBsaXN0IHNpbmNlIHNwbGljZSBpcyB2ZXJ5IGV4cGVuc2l2ZS5cbiAqIEBwYXJhbSBsaW5lcyBUaGUgYnVmZmVyIGxpbmVzLlxuICogQHBhcmFtIG5ld0xheW91dCBUaGUgbmV3IGxheW91dCB0byBhcHBseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxvd0xhcmdlckFwcGx5TmV3TGF5b3V0KGxpbmVzOiBDaXJjdWxhckxpc3Q8SUJ1ZmZlckxpbmU+LCBuZXdMYXlvdXQ6IG51bWJlcltdKTogdm9pZCB7XG4gIC8vIFJlY29yZCBvcmlnaW5hbCBsaW5lcyBzbyB0aGV5IGRvbid0IGdldCBvdmVycmlkZGVuIHdoZW4gd2UgcmVhcnJhbmdlIHRoZSBsaXN0XG4gIGNvbnN0IG5ld0xheW91dExpbmVzOiBCdWZmZXJMaW5lW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdMYXlvdXQubGVuZ3RoOyBpKyspIHtcbiAgICBuZXdMYXlvdXRMaW5lcy5wdXNoKGxpbmVzLmdldChuZXdMYXlvdXRbaV0pIGFzIEJ1ZmZlckxpbmUpO1xuICB9XG5cbiAgLy8gUmVhcnJhbmdlIHRoZSBsaXN0XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3TGF5b3V0TGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBsaW5lcy5zZXQoaSwgbmV3TGF5b3V0TGluZXNbaV0pO1xuICB9XG4gIGxpbmVzLmxlbmd0aCA9IG5ld0xheW91dC5sZW5ndGg7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV3IGxpbmUgbGVuZ3RocyBmb3IgYSBnaXZlbiB3cmFwcGVkIGxpbmUuIFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXQgdG8gcHJlLVxuICogY29tcHV0ZSB0aGUgd3JhcHBpbmcgcG9pbnRzIHNpbmNlIHdpZGUgY2hhcmFjdGVycyBtYXkgbmVlZCB0byBiZSB3cmFwcGVkIG9udG8gdGhlIGZvbGxvd2luZyBsaW5lLlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBudW1iZXJzIG9mIHdoZXJlIGVhY2ggbGluZSB3cmFwcyB0bywgdGhlIHJlc3VsdGluZyBhcnJheVxuICogd2lsbCBvbmx5IGNvbnRhaW4gdGhlIHZhbHVlcyBgbmV3Q29sc2AgKHdoZW4gdGhlIGxpbmUgZG9lcyBub3QgZW5kIHdpdGggYSB3aWRlIGNoYXJhY3RlcikgYW5kXG4gKiBgbmV3Q29scyAtIDFgICh3aGVuIHRoZSBsaW5lIGRvZXMgZW5kIHdpdGggYSB3aWRlIGNoYXJhY3RlciksIGV4Y2VwdCBmb3IgdGhlIGxhc3QgdmFsdWUgd2hpY2hcbiAqIHdpbGwgY29udGFpbiB0aGUgcmVtYWluaW5nIGl0ZW1zIHRvIGZpbGwgdGhlIGxpbmUuXG4gKlxuICogQ2FsbGluZyB0aGlzIHdpdGggYSBgbmV3Q29sc2AgdmFsdWUgb2YgYDFgIHdpbGwgbG9jayB1cC5cbiAqXG4gKiBAcGFyYW0gd3JhcHBlZExpbmVzIFRoZSB3cmFwcGVkIGxpbmVzIHRvIGV2YWx1YXRlLlxuICogQHBhcmFtIG9sZENvbHMgVGhlIGNvbHVtbnMgYmVmb3JlIHJlc2l6ZS5cbiAqIEBwYXJhbSBuZXdDb2xzIFRoZSBjb2x1bW5zIGFmdGVyIHJlc2l6ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxvd1NtYWxsZXJHZXROZXdMaW5lTGVuZ3Rocyh3cmFwcGVkTGluZXM6IEJ1ZmZlckxpbmVbXSwgb2xkQ29sczogbnVtYmVyLCBuZXdDb2xzOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGNvbnN0IG5ld0xpbmVMZW5ndGhzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBjZWxsc05lZWRlZCA9IHdyYXBwZWRMaW5lcy5tYXAoKGwsIGkpID0+IGdldFdyYXBwZWRMaW5lVHJpbW1lZExlbmd0aCh3cmFwcGVkTGluZXMsIGksIG9sZENvbHMpKS5yZWR1Y2UoKHAsIGMpID0+IHAgKyBjKTtcblxuICAvLyBVc2Ugc3JjQ29sIGFuZCBzcmNMaW5lIHRvIGZpbmQgdGhlIG5ldyB3cmFwcGluZyBwb2ludCwgdXNlIHRoYXQgdG8gZ2V0IHRoZSBjZWxsc0F2YWlsYWJsZSBhbmRcbiAgLy8gbGluZXNOZWVkZWRcbiAgbGV0IHNyY0NvbCA9IDA7XG4gIGxldCBzcmNMaW5lID0gMDtcbiAgbGV0IGNlbGxzQXZhaWxhYmxlID0gMDtcbiAgd2hpbGUgKGNlbGxzQXZhaWxhYmxlIDwgY2VsbHNOZWVkZWQpIHtcbiAgICBpZiAoY2VsbHNOZWVkZWQgLSBjZWxsc0F2YWlsYWJsZSA8IG5ld0NvbHMpIHtcbiAgICAgIC8vIEFkZCB0aGUgZmluYWwgbGluZSBhbmQgZXhpdCB0aGUgbG9vcFxuICAgICAgbmV3TGluZUxlbmd0aHMucHVzaChjZWxsc05lZWRlZCAtIGNlbGxzQXZhaWxhYmxlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzcmNDb2wgKz0gbmV3Q29scztcbiAgICBjb25zdCBvbGRUcmltbWVkTGVuZ3RoID0gZ2V0V3JhcHBlZExpbmVUcmltbWVkTGVuZ3RoKHdyYXBwZWRMaW5lcywgc3JjTGluZSwgb2xkQ29scyk7XG4gICAgaWYgKHNyY0NvbCA+IG9sZFRyaW1tZWRMZW5ndGgpIHtcbiAgICAgIHNyY0NvbCAtPSBvbGRUcmltbWVkTGVuZ3RoO1xuICAgICAgc3JjTGluZSsrO1xuICAgIH1cbiAgICBjb25zdCBlbmRzV2l0aFdpZGUgPSB3cmFwcGVkTGluZXNbc3JjTGluZV0uZ2V0V2lkdGgoc3JjQ29sIC0gMSkgPT09IDI7XG4gICAgaWYgKGVuZHNXaXRoV2lkZSkge1xuICAgICAgc3JjQ29sLS07XG4gICAgfVxuICAgIGNvbnN0IGxpbmVMZW5ndGggPSBlbmRzV2l0aFdpZGUgPyBuZXdDb2xzIC0gMSA6IG5ld0NvbHM7XG4gICAgbmV3TGluZUxlbmd0aHMucHVzaChsaW5lTGVuZ3RoKTtcbiAgICBjZWxsc0F2YWlsYWJsZSArPSBsaW5lTGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIG5ld0xpbmVMZW5ndGhzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V3JhcHBlZExpbmVUcmltbWVkTGVuZ3RoKGxpbmVzOiBCdWZmZXJMaW5lW10sIGk6IG51bWJlciwgY29sczogbnVtYmVyKTogbnVtYmVyIHtcbiAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCByb3cgaW4gdGhlIHdyYXBwZWQgbGluZSwgZ2V0IHRoZSBhY3R1YWwgdHJpbW1lZCBsZW5ndGhcbiAgaWYgKGkgPT09IGxpbmVzLmxlbmd0aCAtIDEpIHtcbiAgICByZXR1cm4gbGluZXNbaV0uZ2V0VHJpbW1lZExlbmd0aCgpO1xuICB9XG4gIC8vIERldGVjdCB3aGV0aGVyIHRoZSBmb2xsb3dpbmcgbGluZSBzdGFydHMgd2l0aCBhIHdpZGUgY2hhcmFjdGVyIGFuZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpbmVcbiAgLy8gaXMgbnVsbCwgaWYgc28gdGhlbiB3ZSBjYW4gYmUgcHJldHR5IHN1cmUgdGhlIG51bGwgY2hhcmFjdGVyIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBsaW5lXG4gIC8vIGxlbmd0aF1cbiAgY29uc3QgZW5kc0luTnVsbCA9ICEobGluZXNbaV0uaGFzQ29udGVudChjb2xzIC0gMSkpICYmIGxpbmVzW2ldLmdldFdpZHRoKGNvbHMgLSAxKSA9PT0gMTtcbiAgY29uc3QgZm9sbG93aW5nTGluZVN0YXJ0c1dpdGhXaWRlID0gbGluZXNbaSArIDFdLmdldFdpZHRoKDApID09PSAyO1xuICBpZiAoZW5kc0luTnVsbCAmJiBmb2xsb3dpbmdMaW5lU3RhcnRzV2l0aFdpZGUpIHtcbiAgICByZXR1cm4gY29scyAtIDE7XG4gIH1cbiAgcmV0dXJuIGNvbHM7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElBdHRyaWJ1dGVEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQnVmZmVyJztcbmltcG9ydCB7IElCdWZmZXIsIElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG4vKipcbiAqIFRoZSBCdWZmZXJTZXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHR3byBidWZmZXJzIHVzZWQgYnkgeHRlcm0gdGVybWluYWxzIChub3JtYWwgYW5kIGFsdCkgYW5kXG4gKiBwcm92aWRlcyBhbHNvIHV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWZmZXJTZXQgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUJ1ZmZlclNldCB7XG4gIHByaXZhdGUgX25vcm1hbCE6IEJ1ZmZlcjtcbiAgcHJpdmF0ZSBfYWx0ITogQnVmZmVyO1xuICBwcml2YXRlIF9hY3RpdmVCdWZmZXIhOiBCdWZmZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25CdWZmZXJBY3RpdmF0ZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7YWN0aXZlQnVmZmVyOiBJQnVmZmVyLCBpbmFjdGl2ZUJ1ZmZlcjogSUJ1ZmZlcn0+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25CdWZmZXJBY3RpdmF0ZSA9IHRoaXMuX29uQnVmZmVyQWN0aXZhdGUuZXZlbnQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBCdWZmZXJTZXQgZm9yIHRoZSBnaXZlbiB0ZXJtaW5hbC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdzY3JvbGxiYWNrJywgKCkgPT4gdGhpcy5yZXNpemUodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCd0YWJTdG9wV2lkdGgnLCAoKSA9PiB0aGlzLnNldHVwVGFiU3RvcHMoKSkpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX25vcm1hbCA9IG5ldyBCdWZmZXIodHJ1ZSwgdGhpcy5fb3B0aW9uc1NlcnZpY2UsIHRoaXMuX2J1ZmZlclNlcnZpY2UpO1xuICAgIHRoaXMuX25vcm1hbC5maWxsVmlld3BvcnRSb3dzKCk7XG5cbiAgICAvLyBUaGUgYWx0IGJ1ZmZlciBzaG91bGQgbmV2ZXIgaGF2ZSBzY3JvbGxiYWNrLlxuICAgIC8vIFNlZSBodHRwOi8vaW52aXNpYmxlLWlzbGFuZC5uZXQveHRlcm0vY3Rsc2Vxcy9jdGxzZXFzLmh0bWwjaDItVGhlLUFsdGVybmF0ZS1TY3JlZW4tQnVmZmVyXG4gICAgdGhpcy5fYWx0ID0gbmV3IEJ1ZmZlcihmYWxzZSwgdGhpcy5fb3B0aW9uc1NlcnZpY2UsIHRoaXMuX2J1ZmZlclNlcnZpY2UpO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlciA9IHRoaXMuX25vcm1hbDtcbiAgICB0aGlzLl9vbkJ1ZmZlckFjdGl2YXRlLmZpcmUoe1xuICAgICAgYWN0aXZlQnVmZmVyOiB0aGlzLl9ub3JtYWwsXG4gICAgICBpbmFjdGl2ZUJ1ZmZlcjogdGhpcy5fYWx0XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHVwVGFiU3RvcHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhbHQgQnVmZmVyIG9mIHRoZSBCdWZmZXJTZXRcbiAgICovXG4gIHB1YmxpYyBnZXQgYWx0KCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgYWN0aXZlIEJ1ZmZlciBvZiB0aGUgQnVmZmVyU2V0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVCdWZmZXI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbm9ybWFsIEJ1ZmZlciBvZiB0aGUgQnVmZmVyU2V0XG4gICAqL1xuICBwdWJsaWMgZ2V0IG5vcm1hbCgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLl9ub3JtYWw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbm9ybWFsIEJ1ZmZlciBvZiB0aGUgQnVmZmVyU2V0IGFzIGl0cyBjdXJyZW50bHkgYWN0aXZlIEJ1ZmZlclxuICAgKi9cbiAgcHVibGljIGFjdGl2YXRlTm9ybWFsQnVmZmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIgPT09IHRoaXMuX25vcm1hbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9ub3JtYWwueCA9IHRoaXMuX2FsdC54O1xuICAgIHRoaXMuX25vcm1hbC55ID0gdGhpcy5fYWx0Lnk7XG4gICAgLy8gVGhlIGFsdCBidWZmZXIgc2hvdWxkIGFsd2F5cyBiZSBjbGVhcmVkIHdoZW4gd2Ugc3dpdGNoIHRvIHRoZSBub3JtYWxcbiAgICAvLyBidWZmZXIuIFRoaXMgZnJlZXMgdXAgbWVtb3J5IHNpbmNlIHRoZSBhbHQgYnVmZmVyIHNob3VsZCBhbHdheXMgYmUgbmV3XG4gICAgLy8gd2hlbiBhY3RpdmF0ZWQuXG4gICAgdGhpcy5fYWx0LmNsZWFyQWxsTWFya2VycygpO1xuICAgIHRoaXMuX2FsdC5jbGVhcigpO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlciA9IHRoaXMuX25vcm1hbDtcbiAgICB0aGlzLl9vbkJ1ZmZlckFjdGl2YXRlLmZpcmUoe1xuICAgICAgYWN0aXZlQnVmZmVyOiB0aGlzLl9ub3JtYWwsXG4gICAgICBpbmFjdGl2ZUJ1ZmZlcjogdGhpcy5fYWx0XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWx0IEJ1ZmZlciBvZiB0aGUgQnVmZmVyU2V0IGFzIGl0cyBjdXJyZW50bHkgYWN0aXZlIEJ1ZmZlclxuICAgKi9cbiAgcHVibGljIGFjdGl2YXRlQWx0QnVmZmVyKGZpbGxBdHRyPzogSUF0dHJpYnV0ZURhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyID09PSB0aGlzLl9hbHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU2luY2UgdGhlIGFsdCBidWZmZXIgaXMgYWx3YXlzIGNsZWFyZWQgd2hlbiB0aGUgbm9ybWFsIGJ1ZmZlciBpc1xuICAgIC8vIGFjdGl2YXRlZCwgd2Ugd2FudCB0byBmaWxsIGl0IHdoZW4gc3dpdGNoaW5nIHRvIGl0LlxuICAgIHRoaXMuX2FsdC5maWxsVmlld3BvcnRSb3dzKGZpbGxBdHRyKTtcbiAgICB0aGlzLl9hbHQueCA9IHRoaXMuX25vcm1hbC54O1xuICAgIHRoaXMuX2FsdC55ID0gdGhpcy5fbm9ybWFsLnk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyID0gdGhpcy5fYWx0O1xuICAgIHRoaXMuX29uQnVmZmVyQWN0aXZhdGUuZmlyZSh7XG4gICAgICBhY3RpdmVCdWZmZXI6IHRoaXMuX2FsdCxcbiAgICAgIGluYWN0aXZlQnVmZmVyOiB0aGlzLl9ub3JtYWxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemVzIGJvdGggbm9ybWFsIGFuZCBhbHQgYnVmZmVycywgYWRqdXN0aW5nIHRoZWlyIGRhdGEgYWNjb3JkaW5nbHkuXG4gICAqIEBwYXJhbSBuZXdDb2xzIFRoZSBuZXcgbnVtYmVyIG9mIGNvbHVtbnMuXG4gICAqIEBwYXJhbSBuZXdSb3dzIFRoZSBuZXcgbnVtYmVyIG9mIHJvd3MuXG4gICAqL1xuICBwdWJsaWMgcmVzaXplKG5ld0NvbHM6IG51bWJlciwgbmV3Um93czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm9ybWFsLnJlc2l6ZShuZXdDb2xzLCBuZXdSb3dzKTtcbiAgICB0aGlzLl9hbHQucmVzaXplKG5ld0NvbHMsIG5ld1Jvd3MpO1xuICAgIHRoaXMuc2V0dXBUYWJTdG9wcyhuZXdDb2xzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCB0aGUgdGFiIHN0b3BzLlxuICAgKiBAcGFyYW0gaSBUaGUgaW5kZXggdG8gc3RhcnQgc2V0dGluZyB1cCB0YWIgc3RvcHMgZnJvbS5cbiAgICovXG4gIHB1YmxpYyBzZXR1cFRhYlN0b3BzKGk/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3JtYWwuc2V0dXBUYWJTdG9wcyhpKTtcbiAgICB0aGlzLl9hbHQuc2V0dXBUYWJTdG9wcyhpKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ2hhckRhdGEsIElDZWxsRGF0YSwgSUV4dGVuZGVkQXR0cnMgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgc3RyaW5nRnJvbUNvZGVQb2ludCB9IGZyb20gJ2NvbW1vbi9pbnB1dC9UZXh0RGVjb2Rlcic7XG5pbXBvcnQgeyBDSEFSX0RBVEFfQ0hBUl9JTkRFWCwgQ0hBUl9EQVRBX1dJRFRIX0lOREVYLCBDSEFSX0RBVEFfQVRUUl9JTkRFWCwgQ29udGVudCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEsIEV4dGVuZGVkQXR0cnMgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuXG4vKipcbiAqIENlbGxEYXRhIC0gcmVwcmVzZW50cyBhIHNpbmdsZSBDZWxsIGluIHRoZSB0ZXJtaW5hbCBidWZmZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZWxsRGF0YSBleHRlbmRzIEF0dHJpYnV0ZURhdGEgaW1wbGVtZW50cyBJQ2VsbERhdGEge1xuICAvKiogSGVscGVyIHRvIGNyZWF0ZSBDZWxsRGF0YSBmcm9tIENoYXJEYXRhLiAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21DaGFyRGF0YSh2YWx1ZTogQ2hhckRhdGEpOiBDZWxsRGF0YSB7XG4gICAgY29uc3Qgb2JqID0gbmV3IENlbGxEYXRhKCk7XG4gICAgb2JqLnNldEZyb21DaGFyRGF0YSh2YWx1ZSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICAvKiogUHJpbWl0aXZlcyBmcm9tIHRlcm1pbmFsIGJ1ZmZlci4gKi9cbiAgcHVibGljIGNvbnRlbnQgPSAwO1xuICBwdWJsaWMgZmcgPSAwO1xuICBwdWJsaWMgYmcgPSAwO1xuICBwdWJsaWMgZXh0ZW5kZWQ6IElFeHRlbmRlZEF0dHJzID0gbmV3IEV4dGVuZGVkQXR0cnMoKTtcbiAgcHVibGljIGNvbWJpbmVkRGF0YSA9ICcnO1xuICAvKiogV2hldGhlciBjZWxsIGNvbnRhaW5zIGEgY29tYmluZWQgc3RyaW5nLiAqL1xuICBwdWJsaWMgaXNDb21iaW5lZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0s7XG4gIH1cbiAgLyoqIFdpZHRoIG9mIHRoZSBjZWxsLiAqL1xuICBwdWJsaWMgZ2V0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50ID4+IENvbnRlbnQuV0lEVEhfU0hJRlQ7XG4gIH1cbiAgLyoqIEpTIHN0cmluZyBvZiB0aGUgY29udGVudC4gKi9cbiAgcHVibGljIGdldENoYXJzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSykge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWREYXRhO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSykge1xuICAgICAgcmV0dXJuIHN0cmluZ0Zyb21Db2RlUG9pbnQodGhpcy5jb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSyk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuICAvKipcbiAgICogQ29kZXBvaW50IG9mIGNlbGxcbiAgICogTm90ZSB0aGlzIHJldHVybnMgdGhlIFVURjMyIGNvZGVwb2ludCBvZiBzaW5nbGUgY2hhcnMsXG4gICAqIGlmIGNvbnRlbnQgaXMgYSBjb21iaW5lZCBzdHJpbmcgaXQgcmV0dXJucyB0aGUgY29kZXBvaW50XG4gICAqIG9mIHRoZSBsYXN0IGNoYXIgaW4gc3RyaW5nIHRvIGJlIGluIGxpbmUgd2l0aCBjb2RlIGluIENoYXJEYXRhLlxuICAgKi9cbiAgcHVibGljIGdldENvZGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuaXNDb21iaW5lZCgpKVxuICAgICAgPyB0aGlzLmNvbWJpbmVkRGF0YS5jaGFyQ29kZUF0KHRoaXMuY29tYmluZWREYXRhLmxlbmd0aCAtIDEpXG4gICAgICA6IHRoaXMuY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0s7XG4gIH1cbiAgLyoqIFNldCBkYXRhIGZyb20gQ2hhckRhdGEgKi9cbiAgcHVibGljIHNldEZyb21DaGFyRGF0YSh2YWx1ZTogQ2hhckRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLmZnID0gdmFsdWVbQ0hBUl9EQVRBX0FUVFJfSU5ERVhdO1xuICAgIHRoaXMuYmcgPSAwO1xuICAgIGxldCBjb21iaW5lZCA9IGZhbHNlO1xuICAgIC8vIHN1cnJvZ2F0ZXMgYW5kIGNvbWJpbmVkIHN0cmluZ3MgbmVlZCBzcGVjaWFsIHRyZWF0bWVudFxuICAgIGlmICh2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0ubGVuZ3RoID4gMikge1xuICAgICAgY29tYmluZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCBjb2RlID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMCk7XG4gICAgICAvLyBpZiB0aGUgMi1jaGFyIHN0cmluZyBpcyBhIHN1cnJvZ2F0ZSBjcmVhdGUgc2luZ2xlIGNvZGVwb2ludFxuICAgICAgLy8gZXZlcnl0aGluZyBlbHNlIGlzIGNvbWJpbmVkXG4gICAgICBpZiAoMHhEODAwIDw9IGNvZGUgJiYgY29kZSA8PSAweERCRkYpIHtcbiAgICAgICAgY29uc3Qgc2Vjb25kID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMSk7XG4gICAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnQgPSAoKGNvZGUgLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwKSB8ICh2YWx1ZVtDSEFSX0RBVEFfV0lEVEhfSU5ERVhdIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbWJpbmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbWJpbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSB2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0uY2hhckNvZGVBdCgwKSB8ICh2YWx1ZVtDSEFSX0RBVEFfV0lEVEhfSU5ERVhdIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgIH1cbiAgICBpZiAoY29tYmluZWQpIHtcbiAgICAgIHRoaXMuY29tYmluZWREYXRhID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdO1xuICAgICAgdGhpcy5jb250ZW50ID0gQ29udGVudC5JU19DT01CSU5FRF9NQVNLIHwgKHZhbHVlW0NIQVJfREFUQV9XSURUSF9JTkRFWF0gPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgfVxuICB9XG4gIC8qKiBHZXQgZGF0YSBhcyBDaGFyRGF0YS4gKi9cbiAgcHVibGljIGdldEFzQ2hhckRhdGEoKTogQ2hhckRhdGEge1xuICAgIHJldHVybiBbdGhpcy5mZywgdGhpcy5nZXRDaGFycygpLCB0aGlzLmdldFdpZHRoKCksIHRoaXMuZ2V0Q29kZSgpXTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ09MT1IgPSAwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQVRUUiA9ICgwIDw8IDE4KSB8IChERUZBVUxUX0NPTE9SIDw8IDkpIHwgKDI1NiA8PCAwKTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYVCA9IDA7XG5cbmV4cG9ydCBjb25zdCBDSEFSX0RBVEFfQVRUUl9JTkRFWCA9IDA7XG5leHBvcnQgY29uc3QgQ0hBUl9EQVRBX0NIQVJfSU5ERVggPSAxO1xuZXhwb3J0IGNvbnN0IENIQVJfREFUQV9XSURUSF9JTkRFWCA9IDI7XG5leHBvcnQgY29uc3QgQ0hBUl9EQVRBX0NPREVfSU5ERVggPSAzO1xuXG4vKipcbiAqIE51bGwgY2VsbCAtIGEgcmVhbCBlbXB0eSBjZWxsIChjb250YWluaW5nIG5vdGhpbmcpLlxuICogTm90ZSB0aGF0IGNvZGUgc2hvdWxkIGFsd2F5cyBiZSAwIGZvciBhIG51bGwgY2VsbCBhc1xuICogc2V2ZXJhbCB0ZXN0IGNvbmRpdGlvbiBvZiB0aGUgYnVmZmVyIGxpbmUgcmVseSBvbiB0aGlzLlxuICovXG5leHBvcnQgY29uc3QgTlVMTF9DRUxMX0NIQVIgPSAnJztcbmV4cG9ydCBjb25zdCBOVUxMX0NFTExfV0lEVEggPSAxO1xuZXhwb3J0IGNvbnN0IE5VTExfQ0VMTF9DT0RFID0gMDtcblxuLyoqXG4gKiBXaGl0ZXNwYWNlIGNlbGwuXG4gKiBUaGlzIGlzIG1lYW50IGFzIGEgcmVwbGFjZW1lbnQgZm9yIGVtcHR5IGNlbGxzIHdoZW4gbmVlZGVkXG4gKiBkdXJpbmcgcmVuZGVyaW5nIGxpbmVzIHRvIHByZXNlcnZlIGNvcnJlY3QgYWxpZ21lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBXSElURVNQQUNFX0NFTExfQ0hBUiA9ICcgJztcbmV4cG9ydCBjb25zdCBXSElURVNQQUNFX0NFTExfV0lEVEggPSAxO1xuZXhwb3J0IGNvbnN0IFdISVRFU1BBQ0VfQ0VMTF9DT0RFID0gMzI7XG5cbi8qKlxuICogQml0bWFza3MgZm9yIGFjY2Vzc2luZyBkYXRhIGluIGBjb250ZW50YC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gQ29udGVudCB7XG4gIC8qKlxuICAgKiBiaXQgMS4uMjEgICAgY29kZXBvaW50LCBtYXggYWxsb3dlZCBpbiBVVEYzMiBpcyAweDEwRkZGRiAoMjEgYml0cyB0YWtlbilcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYGNvZGVwb2ludCA9IGNvbnRlbnQgJiBDb250ZW50LmNvZGVwb2ludE1hc2s7YFxuICAgKiAgICAgICAgICAgICAgd3JpdGU6ICBgY29udGVudCB8PSBjb2RlcG9pbnQgJiBDb250ZW50LmNvZGVwb2ludE1hc2s7YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydGN1dCBpZiBwcmVjb25kaXRpb24gYGNvZGVwb2ludCA8PSAweDEwRkZGRmAgaXMgbWV0OlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBgY29udGVudCB8PSBjb2RlcG9pbnQ7YFxuICAgKi9cbiAgQ09ERVBPSU5UX01BU0sgPSAweDFGRkZGRixcblxuICAvKipcbiAgICogYml0IDIyICAgICAgIGZsYWcgaW5kaWNhdGlvbiB3aGV0aGVyIGEgY2VsbCBjb250YWlucyBjb21iaW5lZCBjb250ZW50XG4gICAqICAgICAgICAgICAgICByZWFkOiAgIGBpc0NvbWJpbmVkID0gY29udGVudCAmIENvbnRlbnQuaXNDb21iaW5lZDtgXG4gICAqICAgICAgICAgICAgICBzZXQ6ICAgIGBjb250ZW50IHw9IENvbnRlbnQuaXNDb21iaW5lZDtgXG4gICAqICAgICAgICAgICAgICBjbGVhcjogIGBjb250ZW50ICY9IH5Db250ZW50LmlzQ29tYmluZWQ7YFxuICAgKi9cbiAgSVNfQ09NQklORURfTUFTSyA9IDB4MjAwMDAwLCAgLy8gMSA8PCAyMVxuXG4gIC8qKlxuICAgKiBiaXQgMS4uMjIgICAgbWFzayB0byBjaGVjayB3aGV0aGVyIGEgY2VsbCBjb250YWlucyBhbnkgc3RyaW5nIGRhdGFcbiAgICogICAgICAgICAgICAgIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGNvZGVwb2ludCBhbmQgaXNDb21iaW5lZCBiaXRzIHRvIHNlZVxuICAgKiAgICAgICAgICAgICAgd2hldGhlciBhIGNlbGwgY29udGFpbnMgYW55dGhpbmdcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYGlzRW1wdHkgPSAhKGNvbnRlbnQgJiBDb250ZW50Lmhhc0NvbnRlbnQpYFxuICAgKi9cbiAgSEFTX0NPTlRFTlRfTUFTSyA9IDB4M0ZGRkZGLFxuXG4gIC8qKlxuICAgKiBiaXQgMjMuLjI0ICAgd2N3aWR0aCB2YWx1ZSBvZiBjZWxsLCB0YWtlcyAyIGJpdHMgKHJhbmdlcyBmcm9tIDAuLjIpXG4gICAqICAgICAgICAgICAgICByZWFkOiAgIGB3aWR0aCA9IChjb250ZW50ICYgQ29udGVudC53aWR0aE1hc2spID4+IENvbnRlbnQud2lkdGhTaGlmdDtgXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGBoYXNXaWR0aCA9IGNvbnRlbnQgJiBDb250ZW50LndpZHRoTWFzaztgXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGFzIGxvbmcgYXMgd2N3aWR0aCBpcyBoaWdoZXN0IHZhbHVlIGluIGBjb250ZW50YDpcbiAgICogICAgICAgICAgICAgICAgICAgICAgYHdpZHRoID0gY29udGVudCA+PiBDb250ZW50LndpZHRoU2hpZnQ7YFxuICAgKiAgICAgICAgICAgICAgd3JpdGU6ICBgY29udGVudCB8PSAod2lkdGggPDwgQ29udGVudC53aWR0aFNoaWZ0KSAmIENvbnRlbnQud2lkdGhNYXNrO2BcbiAgICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgaWYgcHJlY29uZGl0aW9uIGAwIDw9IHdpZHRoIDw9IDNgIGlzIG1ldDpcbiAgICogICAgICAgICAgICAgICAgICAgICAgYGNvbnRlbnQgfD0gd2lkdGggPDwgQ29udGVudC53aWR0aFNoaWZ0O2BcbiAgICovXG4gIFdJRFRIX01BU0sgPSAweEMwMDAwMCwgICAvLyAzIDw8IDIyXG4gIFdJRFRIX1NISUZUID0gMjJcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBiaXQgMS4uOCAgICAgYmx1ZSBpbiBSR0IsIGNvbG9yIGluIFAyNTYgYW5kIFAxNlxuICAgKi9cbiAgQkxVRV9NQVNLID0gMHhGRixcbiAgQkxVRV9TSElGVCA9IDAsXG4gIFBDT0xPUl9NQVNLID0gMHhGRixcbiAgUENPTE9SX1NISUZUID0gMCxcblxuICAvKipcbiAgICogYml0IDkuLjE2ICAgIGdyZWVuIGluIFJHQlxuICAgKi9cbiAgR1JFRU5fTUFTSyA9IDB4RkYwMCxcbiAgR1JFRU5fU0hJRlQgPSA4LFxuXG4gIC8qKlxuICAgKiBiaXQgMTcuLjI0ICAgcmVkIGluIFJHQlxuICAgKi9cbiAgUkVEX01BU0sgPSAweEZGMDAwMCxcbiAgUkVEX1NISUZUID0gMTYsXG5cbiAgLyoqXG4gICAqIGJpdCAyNS4uMjYgICBjb2xvciBtb2RlOiBERUZBVUxUICgwKSB8IFAxNiAoMSkgfCBQMjU2ICgyKSB8IFJHQiAoMylcbiAgICovXG4gIENNX01BU0sgPSAweDMwMDAwMDAsXG4gIENNX0RFRkFVTFQgPSAwLFxuICBDTV9QMTYgPSAweDEwMDAwMDAsXG4gIENNX1AyNTYgPSAweDIwMDAwMDAsXG4gIENNX1JHQiA9IDB4MzAwMDAwMCxcblxuICAvKipcbiAgICogYml0IDEuLjI0ICBSR0Igcm9vbVxuICAgKi9cbiAgUkdCX01BU0sgPSAweEZGRkZGRlxufVxuXG5leHBvcnQgY29uc3QgZW51bSBGZ0ZsYWdzIHtcbiAgLyoqXG4gICAqIGJpdCAyNy4uMzJcbiAgICovXG4gIElOVkVSU0UgPSAweDQwMDAwMDAsXG4gIEJPTEQgPSAweDgwMDAwMDAsXG4gIFVOREVSTElORSA9IDB4MTAwMDAwMDAsXG4gIEJMSU5LID0gMHgyMDAwMDAwMCxcbiAgSU5WSVNJQkxFID0gMHg0MDAwMDAwMCxcbiAgU1RSSUtFVEhST1VHSCA9IDB4ODAwMDAwMDAsXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEJnRmxhZ3Mge1xuICAvKipcbiAgICogYml0IDI3Li4zMiAodXBwZXIgMiB1bnVzZWQpXG4gICAqL1xuICBJVEFMSUMgPSAweDQwMDAwMDAsXG4gIERJTSA9IDB4ODAwMDAwMCxcbiAgSEFTX0VYVEVOREVEID0gMHgxMDAwMDAwMCxcbiAgUFJPVEVDVEVEID0gMHgyMDAwMDAwMCxcbiAgT1ZFUkxJTkUgPSAweDQwMDAwMDAwXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEV4dEZsYWdzIHtcbiAgLyoqXG4gICAqIGJpdCAyNy4uMjlcbiAgICovXG4gIFVOREVSTElORV9TVFlMRSA9IDB4MUMwMDAwMDAsXG5cbiAgLyoqXG4gICAqIGJpdCAzMC4uMzJcbiAgICpcbiAgICogQW4gb3B0aW9uYWwgdmFyaWFudCBmb3IgdGhlIGdseXBoLCB0aGlzIGNhbiBiZSB1c2VkIGZvciBleGFtcGxlIHRvIG9mZnNldCB1bmRlcmxpbmVzIGJ5IGFcbiAgICogbnVtYmVyIG9mIHBpeGVscyB0byBjcmVhdGUgYSBwZXJmZWN0IHBhdHRlcm4uXG4gICAqL1xuICBWQVJJQU5UX09GRlNFVCA9IDB4RTAwMDAwMDBcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gVW5kZXJsaW5lU3R5bGUge1xuICBOT05FID0gMCxcbiAgU0lOR0xFID0gMSxcbiAgRE9VQkxFID0gMixcbiAgQ1VSTFkgPSAzLFxuICBET1RURUQgPSA0LFxuICBEQVNIRUQgPSA1XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IGRpc3Bvc2VBcnJheSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSURpc3Bvc2FibGUsIElNYXJrZXIgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgTWFya2VyIGltcGxlbWVudHMgSU1hcmtlciB7XG4gIHByaXZhdGUgc3RhdGljIF9uZXh0SWQgPSAxO1xuXG4gIHB1YmxpYyBpc0Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdID0gW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaWQ6IG51bWJlciA9IE1hcmtlci5fbmV4dElkKys7XG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2lkOyB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25EaXNwb3NlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25EaXNwb3NlID0gdGhpcy5fb25EaXNwb3NlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBsaW5lOiBudW1iZXJcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5saW5lID0gLTE7XG4gICAgLy8gRW1pdCBiZWZvcmUgc3VwZXIuZGlzcG9zZSBzdWNoIHRoYXQgZGlzcG9zZSBsaXN0ZW5lcnMgZ2V0IGEgY2hhbmdlIHRvIHJlYWN0XG4gICAgdGhpcy5fb25EaXNwb3NlLmZpcmUoKTtcbiAgICBkaXNwb3NlQXJyYXkodGhpcy5fZGlzcG9zYWJsZXMpO1xuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXI8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkaXNwb3NhYmxlOiBUKTogVCB7XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChkaXNwb3NhYmxlKTtcbiAgICByZXR1cm4gZGlzcG9zYWJsZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNoYXJzZXQgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG4vKipcbiAqIFRoZSBjaGFyYWN0ZXIgc2V0cyBzdXBwb3J0ZWQgYnkgdGhlIHRlcm1pbmFsLiBUaGVzZSBlbmFibGUgc2V2ZXJhbCBsYW5ndWFnZXNcbiAqIHRvIGJlIHJlcHJlc2VudGVkIHdpdGhpbiB0aGUgdGVybWluYWwgd2l0aCBvbmx5IDgtYml0IGVuY29kaW5nLiBTZWUgSVNPIDIwMjJcbiAqIGZvciBhIGRpc2N1c3Npb24gb24gY2hhcmFjdGVyIHNldHMuIE9ubHkgVlQxMDAgY2hhcmFjdGVyIHNldHMgYXJlIHN1cHBvcnRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IENIQVJTRVRTOiB7IFtrZXk6IHN0cmluZ106IElDaGFyc2V0IHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0LCBVUy5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0hBUlNFVDogSUNoYXJzZXQgfCB1bmRlZmluZWQgPSBDSEFSU0VUU1snQiddO1xuXG4vKipcbiAqIERFQyBTcGVjaWFsIENoYXJhY3RlciBhbmQgTGluZSBEcmF3aW5nIFNldC5cbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MTAyLXVnL3RhYmxlNS0xMy5odG1sXG4gKiBBIGxvdCBvZiBjdXJzZXMgYXBwcyB1c2UgdGhpcyBpZiB0aGV5IHNlZSBURVJNPXh0ZXJtLlxuICogdGVzdGluZzogZWNobyAtZSAnXFxlKDBhXFxlKEInXG4gKiBUaGUgeHRlcm0gb3V0cHV0IHNvbWV0aW1lcyBzZWVtcyB0byBjb25mbGljdCB3aXRoIHRoZVxuICogcmVmZXJlbmNlIGFib3ZlLiB4dGVybSBzZWVtcyBpbiBsaW5lIHdpdGggdGhlIHJlZmVyZW5jZVxuICogd2hlbiBydW5uaW5nIHZ0dGVzdCBob3dldmVyLlxuICogVGhlIHRhYmxlIGJlbG93IG5vdyB1c2VzIHh0ZXJtJ3Mgb3V0cHV0IGZyb20gdnR0ZXN0LlxuICovXG5DSEFSU0VUU1snMCddID0ge1xuICAnYCc6ICdcXHUyNWM2JywgLy8gJ+KXhidcbiAgJ2EnOiAnXFx1MjU5MicsIC8vICfilpInXG4gICdiJzogJ1xcdTI0MDknLCAvLyAn4pCJJyAoSFQpXG4gICdjJzogJ1xcdTI0MGMnLCAvLyAn4pCMJyAoRkYpXG4gICdkJzogJ1xcdTI0MGQnLCAvLyAn4pCNJyAoQ1IpXG4gICdlJzogJ1xcdTI0MGEnLCAvLyAn4pCKJyAoTEYpXG4gICdmJzogJ1xcdTAwYjAnLCAvLyAnwrAnXG4gICdnJzogJ1xcdTAwYjEnLCAvLyAnwrEnXG4gICdoJzogJ1xcdTI0MjQnLCAvLyAn4pCkJyAoTkwpXG4gICdpJzogJ1xcdTI0MGInLCAvLyAn4pCLJyAoVlQpXG4gICdqJzogJ1xcdTI1MTgnLCAvLyAn4pSYJ1xuICAnayc6ICdcXHUyNTEwJywgLy8gJ+KUkCdcbiAgJ2wnOiAnXFx1MjUwYycsIC8vICfilIwnXG4gICdtJzogJ1xcdTI1MTQnLCAvLyAn4pSUJ1xuICAnbic6ICdcXHUyNTNjJywgLy8gJ+KUvCdcbiAgJ28nOiAnXFx1MjNiYScsIC8vICfijronXG4gICdwJzogJ1xcdTIzYmInLCAvLyAn4o67J1xuICAncSc6ICdcXHUyNTAwJywgLy8gJ+KUgCdcbiAgJ3InOiAnXFx1MjNiYycsIC8vICfijrwnXG4gICdzJzogJ1xcdTIzYmQnLCAvLyAn4o69J1xuICAndCc6ICdcXHUyNTFjJywgLy8gJ+KUnCdcbiAgJ3UnOiAnXFx1MjUyNCcsIC8vICfilKQnXG4gICd2JzogJ1xcdTI1MzQnLCAvLyAn4pS0J1xuICAndyc6ICdcXHUyNTJjJywgLy8gJ+KUrCdcbiAgJ3gnOiAnXFx1MjUwMicsIC8vICfilIInXG4gICd5JzogJ1xcdTIyNjQnLCAvLyAn4omkJ1xuICAneic6ICdcXHUyMjY1JywgLy8gJ+KJpSdcbiAgJ3snOiAnXFx1MDNjMCcsIC8vICfPgCdcbiAgJ3wnOiAnXFx1MjI2MCcsIC8vICfiiaAnXG4gICd9JzogJ1xcdTAwYTMnLCAvLyAnwqMnXG4gICd+JzogJ1xcdTAwYjcnICAvLyAnwrcnXG59O1xuXG4vKipcbiAqIEJyaXRpc2ggY2hhcmFjdGVyIHNldFxuICogRVNDIChBXG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItNS5odG1sXG4gKi9cbkNIQVJTRVRTWydBJ10gPSB7XG4gICcjJzogJ8KjJ1xufTtcblxuLyoqXG4gKiBVbml0ZWQgU3RhdGVzIGNoYXJhY3RlciBzZXRcbiAqIEVTQyAoQlxuICovXG5DSEFSU0VUU1snQiddID0gdW5kZWZpbmVkO1xuXG4vKipcbiAqIER1dGNoIGNoYXJhY3RlciBzZXRcbiAqIEVTQyAoNFxuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGUyLTYuaHRtbFxuICovXG5DSEFSU0VUU1snNCddID0ge1xuICAnIyc6ICfCoycsXG4gICdAJzogJ8K+JyxcbiAgJ1snOiAnaWonLFxuICAnXFxcXCc6ICfCvScsXG4gICddJzogJ3wnLFxuICAneyc6ICfCqCcsXG4gICd8JzogJ2YnLFxuICAnfSc6ICfCvCcsXG4gICd+JzogJ8K0J1xufTtcblxuLyoqXG4gKiBGaW5uaXNoIGNoYXJhY3RlciBzZXRcbiAqIEVTQyAoQyBvciBFU0MgKDVcbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL3RhYmxlMi03Lmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ0MnXSA9XG5DSEFSU0VUU1snNSddID0ge1xuICAnWyc6ICfDhCcsXG4gICdcXFxcJzogJ8OWJyxcbiAgJ10nOiAnw4UnLFxuICAnXic6ICfDnCcsXG4gICdgJzogJ8OpJyxcbiAgJ3snOiAnw6QnLFxuICAnfCc6ICfDticsXG4gICd9JzogJ8OlJyxcbiAgJ34nOiAnw7wnXG59O1xuXG4vKipcbiAqIEZyZW5jaCBjaGFyYWN0ZXIgc2V0XG4gKiBFU0MgKFJcbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL3RhYmxlMi04Lmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ1InXSA9IHtcbiAgJyMnOiAnwqMnLFxuICAnQCc6ICfDoCcsXG4gICdbJzogJ8KwJyxcbiAgJ1xcXFwnOiAnw6cnLFxuICAnXSc6ICfCpycsXG4gICd7JzogJ8OpJyxcbiAgJ3wnOiAnw7knLFxuICAnfSc6ICfDqCcsXG4gICd+JzogJ8KoJ1xufTtcblxuLyoqXG4gKiBGcmVuY2ggQ2FuYWRpYW4gY2hhcmFjdGVyIHNldFxuICogRVNDIChRXG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItOS5odG1sXG4gKi9cbkNIQVJTRVRTWydRJ10gPSB7XG4gICdAJzogJ8OgJyxcbiAgJ1snOiAnw6InLFxuICAnXFxcXCc6ICfDpycsXG4gICddJzogJ8OqJyxcbiAgJ14nOiAnw64nLFxuICAnYCc6ICfDtCcsXG4gICd7JzogJ8OpJyxcbiAgJ3wnOiAnw7knLFxuICAnfSc6ICfDqCcsXG4gICd+JzogJ8O7J1xufTtcblxuLyoqXG4gKiBHZXJtYW4gY2hhcmFjdGVyIHNldFxuICogRVNDIChLXG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItMTAuaHRtbFxuICovXG5DSEFSU0VUU1snSyddID0ge1xuICAnQCc6ICfCpycsXG4gICdbJzogJ8OEJyxcbiAgJ1xcXFwnOiAnw5YnLFxuICAnXSc6ICfDnCcsXG4gICd7JzogJ8OkJyxcbiAgJ3wnOiAnw7YnLFxuICAnfSc6ICfDvCcsXG4gICd+JzogJ8OfJ1xufTtcblxuLyoqXG4gKiBJdGFsaWFuIGNoYXJhY3RlciBzZXRcbiAqIEVTQyAoWVxuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGUyLTExLmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ1knXSA9IHtcbiAgJyMnOiAnwqMnLFxuICAnQCc6ICfCpycsXG4gICdbJzogJ8KwJyxcbiAgJ1xcXFwnOiAnw6cnLFxuICAnXSc6ICfDqScsXG4gICdgJzogJ8O5JyxcbiAgJ3snOiAnw6AnLFxuICAnfCc6ICfDsicsXG4gICd9JzogJ8OoJyxcbiAgJ34nOiAnw6wnXG59O1xuXG4vKipcbiAqIE5vcndlZ2lhbi9EYW5pc2ggY2hhcmFjdGVyIHNldFxuICogRVNDIChFIG9yIEVTQyAoNlxuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGUyLTEyLmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ0UnXSA9XG5DSEFSU0VUU1snNiddID0ge1xuICAnQCc6ICfDhCcsXG4gICdbJzogJ8OGJyxcbiAgJ1xcXFwnOiAnw5gnLFxuICAnXSc6ICfDhScsXG4gICdeJzogJ8OcJyxcbiAgJ2AnOiAnw6QnLFxuICAneyc6ICfDpicsXG4gICd8JzogJ8O4JyxcbiAgJ30nOiAnw6UnLFxuICAnfic6ICfDvCdcbn07XG5cbi8qKlxuICogU3BhbmlzaCBjaGFyYWN0ZXIgc2V0XG4gKiBFU0MgKFpcbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL3RhYmxlMi0xMy5odG1sXG4gKi9cbkNIQVJTRVRTWydaJ10gPSB7XG4gICcjJzogJ8KjJyxcbiAgJ0AnOiAnwqcnLFxuICAnWyc6ICfCoScsXG4gICdcXFxcJzogJ8ORJyxcbiAgJ10nOiAnwr8nLFxuICAneyc6ICfCsCcsXG4gICd8JzogJ8OxJyxcbiAgJ30nOiAnw6cnXG59O1xuXG4vKipcbiAqIFN3ZWRpc2ggY2hhcmFjdGVyIHNldFxuICogRVNDIChIIG9yIEVTQyAoN1xuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGUyLTE0Lmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ0gnXSA9XG5DSEFSU0VUU1snNyddID0ge1xuICAnQCc6ICfDiScsXG4gICdbJzogJ8OEJyxcbiAgJ1xcXFwnOiAnw5YnLFxuICAnXSc6ICfDhScsXG4gICdeJzogJ8OcJyxcbiAgJ2AnOiAnw6knLFxuICAneyc6ICfDpCcsXG4gICd8JzogJ8O2JyxcbiAgJ30nOiAnw6UnLFxuICAnfic6ICfDvCdcbn07XG5cbi8qKlxuICogU3dpc3MgY2hhcmFjdGVyIHNldFxuICogRVNDICg9XG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItMTUuaHRtbFxuICovXG5DSEFSU0VUU1snPSddID0ge1xuICAnIyc6ICfDuScsXG4gICdAJzogJ8OgJyxcbiAgJ1snOiAnw6knLFxuICAnXFxcXCc6ICfDpycsXG4gICddJzogJ8OqJyxcbiAgJ14nOiAnw64nLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICdfJzogJ8OoJyxcbiAgJ2AnOiAnw7QnLFxuICAneyc6ICfDpCcsXG4gICd8JzogJ8O2JyxcbiAgJ30nOiAnw7wnLFxuICAnfic6ICfDuydcbn07XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG4vKipcbiAqIEMwIGNvbnRyb2wgY29kZXNcbiAqIFNlZSA9IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0MwX2FuZF9DMV9jb250cm9sX2NvZGVzXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgQzAge1xuICAvKiogTnVsbCAoQ2FyZXQgPSBeQCwgQyA9IFxcMCkgKi9cbiAgZXhwb3J0IGNvbnN0IE5VTCA9ICdcXHgwMCc7XG4gIC8qKiBTdGFydCBvZiBIZWFkaW5nIChDYXJldCA9IF5BKSAqL1xuICBleHBvcnQgY29uc3QgU09IID0gJ1xceDAxJztcbiAgLyoqIFN0YXJ0IG9mIFRleHQgKENhcmV0ID0gXkIpICovXG4gIGV4cG9ydCBjb25zdCBTVFggPSAnXFx4MDInO1xuICAvKiogRW5kIG9mIFRleHQgKENhcmV0ID0gXkMpICovXG4gIGV4cG9ydCBjb25zdCBFVFggPSAnXFx4MDMnO1xuICAvKiogRW5kIG9mIFRyYW5zbWlzc2lvbiAoQ2FyZXQgPSBeRCkgKi9cbiAgZXhwb3J0IGNvbnN0IEVPVCA9ICdcXHgwNCc7XG4gIC8qKiBFbnF1aXJ5IChDYXJldCA9IF5FKSAqL1xuICBleHBvcnQgY29uc3QgRU5RID0gJ1xceDA1JztcbiAgLyoqIEFja25vd2xlZGdlIChDYXJldCA9IF5GKSAqL1xuICBleHBvcnQgY29uc3QgQUNLID0gJ1xceDA2JztcbiAgLyoqIEJlbGwgKENhcmV0ID0gXkcsIEMgPSBcXGEpICovXG4gIGV4cG9ydCBjb25zdCBCRUwgPSAnXFx4MDcnO1xuICAvKiogQmFja3NwYWNlIChDYXJldCA9IF5ILCBDID0gXFxiKSAqL1xuICBleHBvcnQgY29uc3QgQlMgID0gJ1xceDA4JztcbiAgLyoqIENoYXJhY3RlciBUYWJ1bGF0aW9uLCBIb3Jpem9udGFsIFRhYnVsYXRpb24gKENhcmV0ID0gXkksIEMgPSBcXHQpICovXG4gIGV4cG9ydCBjb25zdCBIVCAgPSAnXFx4MDknO1xuICAvKiogTGluZSBGZWVkIChDYXJldCA9IF5KLCBDID0gXFxuKSAqL1xuICBleHBvcnQgY29uc3QgTEYgID0gJ1xceDBhJztcbiAgLyoqIExpbmUgVGFidWxhdGlvbiwgVmVydGljYWwgVGFidWxhdGlvbiAoQ2FyZXQgPSBeSywgQyA9IFxcdikgKi9cbiAgZXhwb3J0IGNvbnN0IFZUICA9ICdcXHgwYic7XG4gIC8qKiBGb3JtIEZlZWQgKENhcmV0ID0gXkwsIEMgPSBcXGYpICovXG4gIGV4cG9ydCBjb25zdCBGRiAgPSAnXFx4MGMnO1xuICAvKiogQ2FycmlhZ2UgUmV0dXJuIChDYXJldCA9IF5NLCBDID0gXFxyKSAqL1xuICBleHBvcnQgY29uc3QgQ1IgID0gJ1xceDBkJztcbiAgLyoqIFNoaWZ0IE91dCAoQ2FyZXQgPSBeTikgKi9cbiAgZXhwb3J0IGNvbnN0IFNPICA9ICdcXHgwZSc7XG4gIC8qKiBTaGlmdCBJbiAoQ2FyZXQgPSBeTykgKi9cbiAgZXhwb3J0IGNvbnN0IFNJICA9ICdcXHgwZic7XG4gIC8qKiBEYXRhIExpbmsgRXNjYXBlIChDYXJldCA9IF5QKSAqL1xuICBleHBvcnQgY29uc3QgRExFID0gJ1xceDEwJztcbiAgLyoqIERldmljZSBDb250cm9sIE9uZSAoWE9OKSAoQ2FyZXQgPSBeUSkgKi9cbiAgZXhwb3J0IGNvbnN0IERDMSA9ICdcXHgxMSc7XG4gIC8qKiBEZXZpY2UgQ29udHJvbCBUd28gKENhcmV0ID0gXlIpICovXG4gIGV4cG9ydCBjb25zdCBEQzIgPSAnXFx4MTInO1xuICAvKiogRGV2aWNlIENvbnRyb2wgVGhyZWUgKFhPRkYpIChDYXJldCA9IF5TKSAqL1xuICBleHBvcnQgY29uc3QgREMzID0gJ1xceDEzJztcbiAgLyoqIERldmljZSBDb250cm9sIEZvdXIgKENhcmV0ID0gXlQpICovXG4gIGV4cG9ydCBjb25zdCBEQzQgPSAnXFx4MTQnO1xuICAvKiogTmVnYXRpdmUgQWNrbm93bGVkZ2UgKENhcmV0ID0gXlUpICovXG4gIGV4cG9ydCBjb25zdCBOQUsgPSAnXFx4MTUnO1xuICAvKiogU3luY2hyb25vdXMgSWRsZSAoQ2FyZXQgPSBeVikgKi9cbiAgZXhwb3J0IGNvbnN0IFNZTiA9ICdcXHgxNic7XG4gIC8qKiBFbmQgb2YgVHJhbnNtaXNzaW9uIEJsb2NrIChDYXJldCA9IF5XKSAqL1xuICBleHBvcnQgY29uc3QgRVRCID0gJ1xceDE3JztcbiAgLyoqIENhbmNlbCAoQ2FyZXQgPSBeWCkgKi9cbiAgZXhwb3J0IGNvbnN0IENBTiA9ICdcXHgxOCc7XG4gIC8qKiBFbmQgb2YgTWVkaXVtIChDYXJldCA9IF5ZKSAqL1xuICBleHBvcnQgY29uc3QgRU0gID0gJ1xceDE5JztcbiAgLyoqIFN1YnN0aXR1dGUgKENhcmV0ID0gXlopICovXG4gIGV4cG9ydCBjb25zdCBTVUIgPSAnXFx4MWEnO1xuICAvKiogRXNjYXBlIChDYXJldCA9IF5bLCBDID0gXFxlKSAqL1xuICBleHBvcnQgY29uc3QgRVNDID0gJ1xceDFiJztcbiAgLyoqIEZpbGUgU2VwYXJhdG9yIChDYXJldCA9IF5cXCkgKi9cbiAgZXhwb3J0IGNvbnN0IEZTICA9ICdcXHgxYyc7XG4gIC8qKiBHcm91cCBTZXBhcmF0b3IgKENhcmV0ID0gXl0pICovXG4gIGV4cG9ydCBjb25zdCBHUyAgPSAnXFx4MWQnO1xuICAvKiogUmVjb3JkIFNlcGFyYXRvciAoQ2FyZXQgPSBeXikgKi9cbiAgZXhwb3J0IGNvbnN0IFJTICA9ICdcXHgxZSc7XG4gIC8qKiBVbml0IFNlcGFyYXRvciAoQ2FyZXQgPSBeXykgKi9cbiAgZXhwb3J0IGNvbnN0IFVTICA9ICdcXHgxZic7XG4gIC8qKiBTcGFjZSAqL1xuICBleHBvcnQgY29uc3QgU1AgID0gJ1xceDIwJztcbiAgLyoqIERlbGV0ZSAoQ2FyZXQgPSBePykgKi9cbiAgZXhwb3J0IGNvbnN0IERFTCA9ICdcXHg3Zic7XG59XG5cbi8qKlxuICogQzEgY29udHJvbCBjb2Rlc1xuICogU2VlID0gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQzBfYW5kX0MxX2NvbnRyb2xfY29kZXNcbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBDMSB7XG4gIC8qKiBwYWRkaW5nIGNoYXJhY3RlciAqL1xuICBleHBvcnQgY29uc3QgUEFEID0gJ1xceDgwJztcbiAgLyoqIEhpZ2ggT2N0ZXQgUHJlc2V0ICovXG4gIGV4cG9ydCBjb25zdCBIT1AgPSAnXFx4ODEnO1xuICAvKiogQnJlYWsgUGVybWl0dGVkIEhlcmUgKi9cbiAgZXhwb3J0IGNvbnN0IEJQSCA9ICdcXHg4Mic7XG4gIC8qKiBObyBCcmVhayBIZXJlICovXG4gIGV4cG9ydCBjb25zdCBOQkggPSAnXFx4ODMnO1xuICAvKiogSW5kZXggKi9cbiAgZXhwb3J0IGNvbnN0IElORCA9ICdcXHg4NCc7XG4gIC8qKiBOZXh0IExpbmUgKi9cbiAgZXhwb3J0IGNvbnN0IE5FTCA9ICdcXHg4NSc7XG4gIC8qKiBTdGFydCBvZiBTZWxlY3RlZCBBcmVhICovXG4gIGV4cG9ydCBjb25zdCBTU0EgPSAnXFx4ODYnO1xuICAvKiogRW5kIG9mIFNlbGVjdGVkIEFyZWEgKi9cbiAgZXhwb3J0IGNvbnN0IEVTQSA9ICdcXHg4Nyc7XG4gIC8qKiBIb3Jpem9udGFsIFRhYnVsYXRpb24gU2V0ICovXG4gIGV4cG9ydCBjb25zdCBIVFMgPSAnXFx4ODgnO1xuICAvKiogSG9yaXpvbnRhbCBUYWJ1bGF0aW9uIFdpdGggSnVzdGlmaWNhdGlvbiAqL1xuICBleHBvcnQgY29uc3QgSFRKID0gJ1xceDg5JztcbiAgLyoqIFZlcnRpY2FsIFRhYnVsYXRpb24gU2V0ICovXG4gIGV4cG9ydCBjb25zdCBWVFMgPSAnXFx4OGEnO1xuICAvKiogUGFydGlhbCBMaW5lIERvd24gKi9cbiAgZXhwb3J0IGNvbnN0IFBMRCA9ICdcXHg4Yic7XG4gIC8qKiBQYXJ0aWFsIExpbmUgVXAgKi9cbiAgZXhwb3J0IGNvbnN0IFBMVSA9ICdcXHg4Yyc7XG4gIC8qKiBSZXZlcnNlIEluZGV4ICovXG4gIGV4cG9ydCBjb25zdCBSSSA9ICdcXHg4ZCc7XG4gIC8qKiBTaW5nbGUtU2hpZnQgMiAqL1xuICBleHBvcnQgY29uc3QgU1MyID0gJ1xceDhlJztcbiAgLyoqIFNpbmdsZS1TaGlmdCAzICovXG4gIGV4cG9ydCBjb25zdCBTUzMgPSAnXFx4OGYnO1xuICAvKiogRGV2aWNlIENvbnRyb2wgU3RyaW5nICovXG4gIGV4cG9ydCBjb25zdCBEQ1MgPSAnXFx4OTAnO1xuICAvKiogUHJpdmF0ZSBVc2UgMSAqL1xuICBleHBvcnQgY29uc3QgUFUxID0gJ1xceDkxJztcbiAgLyoqIFByaXZhdGUgVXNlIDIgKi9cbiAgZXhwb3J0IGNvbnN0IFBVMiA9ICdcXHg5Mic7XG4gIC8qKiBTZXQgVHJhbnNtaXQgU3RhdGUgKi9cbiAgZXhwb3J0IGNvbnN0IFNUUyA9ICdcXHg5Myc7XG4gIC8qKiBEZXN0cnVjdGl2ZSBiYWNrc3BhY2UsIGludGVuZGVkIHRvIGVsaW1pbmF0ZSBhbWJpZ3VpdHkgYWJvdXQgbWVhbmluZyBvZiBCUy4gKi9cbiAgZXhwb3J0IGNvbnN0IENDSCA9ICdcXHg5NCc7XG4gIC8qKiBNZXNzYWdlIFdhaXRpbmcgKi9cbiAgZXhwb3J0IGNvbnN0IE1XID0gJ1xceDk1JztcbiAgLyoqIFN0YXJ0IG9mIFByb3RlY3RlZCBBcmVhICovXG4gIGV4cG9ydCBjb25zdCBTUEEgPSAnXFx4OTYnO1xuICAvKiogRW5kIG9mIFByb3RlY3RlZCBBcmVhICovXG4gIGV4cG9ydCBjb25zdCBFUEEgPSAnXFx4OTcnO1xuICAvKiogU3RhcnQgb2YgU3RyaW5nICovXG4gIGV4cG9ydCBjb25zdCBTT1MgPSAnXFx4OTgnO1xuICAvKiogU2luZ2xlIEdyYXBoaWMgQ2hhcmFjdGVyIEludHJvZHVjZXIgKi9cbiAgZXhwb3J0IGNvbnN0IFNHQ0kgPSAnXFx4OTknO1xuICAvKiogU2luZ2xlIENoYXJhY3RlciBJbnRyb2R1Y2VyICovXG4gIGV4cG9ydCBjb25zdCBTQ0kgPSAnXFx4OWEnO1xuICAvKiogQ29udHJvbCBTZXF1ZW5jZSBJbnRyb2R1Y2VyICovXG4gIGV4cG9ydCBjb25zdCBDU0kgPSAnXFx4OWInO1xuICAvKiogU3RyaW5nIFRlcm1pbmF0b3IgKi9cbiAgZXhwb3J0IGNvbnN0IFNUID0gJ1xceDljJztcbiAgLyoqIE9wZXJhdGluZyBTeXN0ZW0gQ29tbWFuZCAqL1xuICBleHBvcnQgY29uc3QgT1NDID0gJ1xceDlkJztcbiAgLyoqIFByaXZhY3kgTWVzc2FnZSAqL1xuICBleHBvcnQgY29uc3QgUE0gPSAnXFx4OWUnO1xuICAvKiogQXBwbGljYXRpb24gUHJvZ3JhbSBDb21tYW5kICovXG4gIGV4cG9ydCBjb25zdCBBUEMgPSAnXFx4OWYnO1xufVxuZXhwb3J0IG5hbWVzcGFjZSBDMV9FU0NBUEVEIHtcbiAgZXhwb3J0IGNvbnN0IFNUID0gYCR7QzAuRVNDfVxcXFxgO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIENocmlzdG9waGVyIEplZmZyZXkgKE1JVCBMaWNlbnNlKVxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUtleWJvYXJkRXZlbnQsIElLZXlib2FyZFJlc3VsdCwgS2V5Ym9hcmRSZXN1bHRUeXBlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEMwIH0gZnJvbSAnY29tbW9uL2RhdGEvRXNjYXBlU2VxdWVuY2VzJztcblxuLy8gcmVnICsgc2hpZnQga2V5IG1hcHBpbmdzIGZvciBkaWdpdHMgYW5kIHNwZWNpYWwgY2hhcnNcbmNvbnN0IEtFWUNPREVfS0VZX01BUFBJTkdTOiB7IFtrZXk6IG51bWJlcl06IFtzdHJpbmcsIHN0cmluZ119ID0ge1xuICAvLyBkaWdpdHMgMC05XG4gIDQ4OiBbJzAnLCAnKSddLFxuICA0OTogWycxJywgJyEnXSxcbiAgNTA6IFsnMicsICdAJ10sXG4gIDUxOiBbJzMnLCAnIyddLFxuICA1MjogWyc0JywgJyQnXSxcbiAgNTM6IFsnNScsICclJ10sXG4gIDU0OiBbJzYnLCAnXiddLFxuICA1NTogWyc3JywgJyYnXSxcbiAgNTY6IFsnOCcsICcqJ10sXG4gIDU3OiBbJzknLCAnKCddLFxuXG4gIC8vIHNwZWNpYWwgY2hhcnNcbiAgMTg2OiBbJzsnLCAnOiddLFxuICAxODc6IFsnPScsICcrJ10sXG4gIDE4ODogWycsJywgJzwnXSxcbiAgMTg5OiBbJy0nLCAnXyddLFxuICAxOTA6IFsnLicsICc+J10sXG4gIDE5MTogWycvJywgJz8nXSxcbiAgMTkyOiBbJ2AnLCAnfiddLFxuICAyMTk6IFsnWycsICd7J10sXG4gIDIyMDogWydcXFxcJywgJ3wnXSxcbiAgMjIxOiBbJ10nLCAnfSddLFxuICAyMjI6IFsnXFwnJywgJ1wiJ11cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUtleWJvYXJkRXZlbnQoXG4gIGV2OiBJS2V5Ym9hcmRFdmVudCxcbiAgYXBwbGljYXRpb25DdXJzb3JNb2RlOiBib29sZWFuLFxuICBpc01hYzogYm9vbGVhbixcbiAgbWFjT3B0aW9uSXNNZXRhOiBib29sZWFuXG4pOiBJS2V5Ym9hcmRSZXN1bHQge1xuICBjb25zdCByZXN1bHQ6IElLZXlib2FyZFJlc3VsdCA9IHtcbiAgICB0eXBlOiBLZXlib2FyZFJlc3VsdFR5cGUuU0VORF9LRVksXG4gICAgLy8gV2hldGhlciB0byBjYW5jZWwgZXZlbnQgcHJvcGFnYXRpb24gKE5PVEU6IHRoaXMgbWF5IG5vdCBiZSBuZWVkZWQgc2luY2UgdGhlIGV2ZW50IGlzXG4gICAgLy8gY2FuY2VsZWQgYXQgdGhlIGVuZCBvZiBrZXlEb3duXG4gICAgY2FuY2VsOiBmYWxzZSxcbiAgICAvLyBUaGUgbmV3IGtleSBldmVuIHRvIGVtaXRcbiAgICBrZXk6IHVuZGVmaW5lZFxuICB9O1xuICBjb25zdCBtb2RpZmllcnMgPSAoZXYuc2hpZnRLZXkgPyAxIDogMCkgfCAoZXYuYWx0S2V5ID8gMiA6IDApIHwgKGV2LmN0cmxLZXkgPyA0IDogMCkgfCAoZXYubWV0YUtleSA/IDggOiAwKTtcbiAgc3dpdGNoIChldi5rZXlDb2RlKSB7XG4gICAgY2FzZSAwOlxuICAgICAgaWYgKGV2LmtleSA9PT0gJ1VJS2V5SW5wdXRVcEFycm93Jykge1xuICAgICAgICBpZiAoYXBwbGljYXRpb25DdXJzb3JNb2RlKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPQSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbQSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGV2LmtleSA9PT0gJ1VJS2V5SW5wdXRMZWZ0QXJyb3cnKSB7XG4gICAgICAgIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09EJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tEJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZXYua2V5ID09PSAnVUlLZXlJbnB1dFJpZ2h0QXJyb3cnKSB7XG4gICAgICAgIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09DJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tDJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZXYua2V5ID09PSAnVUlLZXlJbnB1dERvd25BcnJvdycpIHtcbiAgICAgICAgaWYgKGFwcGxpY2F0aW9uQ3Vyc29yTW9kZSkge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT0InO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnW0InO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICAvLyBiYWNrc3BhY2VcbiAgICAgIHJlc3VsdC5rZXkgPSBldi5jdHJsS2V5ID8gJ1xcYicgOiBDMC5ERUw7IC8vIF5IIG9yIF4/XG4gICAgICBpZiAoZXYuYWx0S2V5KSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyByZXN1bHQua2V5O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA5OlxuICAgICAgLy8gdGFiXG4gICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbWic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmtleSA9IEMwLkhUO1xuICAgICAgcmVzdWx0LmNhbmNlbCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEzOlxuICAgICAgLy8gcmV0dXJuL2VudGVyXG4gICAgICByZXN1bHQua2V5ID0gZXYuYWx0S2V5ID8gQzAuRVNDICsgQzAuQ1IgOiBDMC5DUjtcbiAgICAgIHJlc3VsdC5jYW5jZWwgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyNzpcbiAgICAgIC8vIGVzY2FwZVxuICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQztcbiAgICAgIGlmIChldi5hbHRLZXkpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArIEMwLkVTQztcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5jYW5jZWwgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzNzpcbiAgICAgIC8vIGxlZnQtYXJyb3dcbiAgICAgIGlmIChldi5tZXRhS2V5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnRCc7XG4gICAgICAgIC8vIEhBQ0s6IE1ha2UgQWx0ICsgbGVmdC1hcnJvdyBiZWhhdmUgbGlrZSBDdHJsICsgbGVmdC1hcnJvdzogbW92ZSBvbmUgd29yZCBiYWNrd2FyZHNcbiAgICAgICAgLy8gaHR0cDovL3VuaXguc3RhY2tleGNoYW5nZS5jb20vYS8xMDgxMDZcbiAgICAgICAgLy8gbWFjT1MgdXNlcyBkaWZmZXJlbnQgZXNjYXBlIHNlcXVlbmNlcyB0aGFuIGxpbnV4XG4gICAgICAgIGlmIChyZXN1bHQua2V5ID09PSBDMC5FU0MgKyAnWzE7M0QnKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArIChpc01hYyA/ICdiJyA6ICdbMTs1RCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFwcGxpY2F0aW9uQ3Vyc29yTW9kZSkge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09EJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnW0QnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOTpcbiAgICAgIC8vIHJpZ2h0LWFycm93XG4gICAgICBpZiAoZXYubWV0YUtleSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0MnO1xuICAgICAgICAvLyBIQUNLOiBNYWtlIEFsdCArIHJpZ2h0LWFycm93IGJlaGF2ZSBsaWtlIEN0cmwgKyByaWdodC1hcnJvdzogbW92ZSBvbmUgd29yZCBmb3J3YXJkXG4gICAgICAgIC8vIGh0dHA6Ly91bml4LnN0YWNrZXhjaGFuZ2UuY29tL2EvMTA4MTA2XG4gICAgICAgIC8vIG1hY09TIHVzZXMgZGlmZmVyZW50IGVzY2FwZSBzZXF1ZW5jZXMgdGhhbiBsaW51eFxuICAgICAgICBpZiAocmVzdWx0LmtleSA9PT0gQzAuRVNDICsgJ1sxOzNDJykge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAoaXNNYWMgPyAnZicgOiAnWzE7NUMnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPQyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tDJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzg6XG4gICAgICAvLyB1cC1hcnJvd1xuICAgICAgaWYgKGV2Lm1ldGFLZXkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdBJztcbiAgICAgICAgLy8gSEFDSzogTWFrZSBBbHQgKyB1cC1hcnJvdyBiZWhhdmUgbGlrZSBDdHJsICsgdXAtYXJyb3dcbiAgICAgICAgLy8gaHR0cDovL3VuaXguc3RhY2tleGNoYW5nZS5jb20vYS8xMDgxMDZcbiAgICAgICAgLy8gbWFjT1MgdXNlcyBkaWZmZXJlbnQgZXNjYXBlIHNlcXVlbmNlcyB0aGFuIGxpbnV4XG4gICAgICAgIGlmICghaXNNYWMgJiYgcmVzdWx0LmtleSA9PT0gQzAuRVNDICsgJ1sxOzNBJykge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7NUEnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFwcGxpY2F0aW9uQ3Vyc29yTW9kZSkge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09BJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnW0EnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0MDpcbiAgICAgIC8vIGRvd24tYXJyb3dcbiAgICAgIGlmIChldi5tZXRhS2V5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnQic7XG4gICAgICAgIC8vIEhBQ0s6IE1ha2UgQWx0ICsgZG93bi1hcnJvdyBiZWhhdmUgbGlrZSBDdHJsICsgZG93bi1hcnJvd1xuICAgICAgICAvLyBodHRwOi8vdW5peC5zdGFja2V4Y2hhbmdlLmNvbS9hLzEwODEwNlxuICAgICAgICAvLyBtYWNPUyB1c2VzIGRpZmZlcmVudCBlc2NhcGUgc2VxdWVuY2VzIHRoYW4gbGludXhcbiAgICAgICAgaWYgKCFpc01hYyAmJiByZXN1bHQua2V5ID09PSBDMC5FU0MgKyAnWzE7M0InKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTs1Qic7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYXBwbGljYXRpb25DdXJzb3JNb2RlKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT0InO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbQic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ1OlxuICAgICAgLy8gaW5zZXJ0XG4gICAgICBpZiAoIWV2LnNoaWZ0S2V5ICYmICFldi5jdHJsS2V5KSB7XG4gICAgICAgIC8vIDxDdHJsPiBvciA8U2hpZnQ+ICsgPEluc2VydD4gYXJlIHVzZWQgdG9cbiAgICAgICAgLy8gY29weS1wYXN0ZSBvbiBzb21lIHN5c3RlbXMuXG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzJ+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDY6XG4gICAgICAvLyBkZWxldGVcbiAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMzsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbM34nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzNjpcbiAgICAgIC8vIGhvbWVcbiAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0gnO1xuICAgICAgfSBlbHNlIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPSCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tIJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzU6XG4gICAgICAvLyBlbmRcbiAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0YnO1xuICAgICAgfSBlbHNlIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPRic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tGJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzM6XG4gICAgICAvLyBwYWdlIHVwXG4gICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgcmVzdWx0LnR5cGUgPSBLZXlib2FyZFJlc3VsdFR5cGUuUEFHRV9VUDtcbiAgICAgIH0gZWxzZSBpZiAoZXYuY3RybEtleSkge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1s1OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1s1fic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM0OlxuICAgICAgLy8gcGFnZSBkb3duXG4gICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgcmVzdWx0LnR5cGUgPSBLZXlib2FyZFJlc3VsdFR5cGUuUEFHRV9ET1dOO1xuICAgICAgfSBlbHNlIGlmIChldi5jdHJsS2V5KSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzY7JyArIChtb2RpZmllcnMgKyAxKSArICd+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzZ+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTEyOlxuICAgICAgLy8gRjEtRjEyXG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdQJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT1AnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTM6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdRJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT1EnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTQ6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdSJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT1InO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTU6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdTJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT1MnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTY6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE1OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxNX4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTc6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE3OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxN34nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTg6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE4OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOH4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTk6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE5OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOX4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjA6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzIwOycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syMH4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjE6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzIxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syMX4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjI6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzIzOycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syM34nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjM6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzI0OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syNH4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGEteiBhbmQgc3BhY2VcbiAgICAgIGlmIChldi5jdHJsS2V5ICYmICFldi5zaGlmdEtleSAmJiAhZXYuYWx0S2V5ICYmICFldi5tZXRhS2V5KSB7XG4gICAgICAgIGlmIChldi5rZXlDb2RlID49IDY1ICYmIGV2LmtleUNvZGUgPD0gOTApIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShldi5rZXlDb2RlIC0gNjQpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2LmtleUNvZGUgPT09IDMyKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLk5VTDtcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID49IDUxICYmIGV2LmtleUNvZGUgPD0gNTUpIHtcbiAgICAgICAgICAvLyBlc2NhcGUsIGZpbGUgc2VwLCBncm91cCBzZXAsIHJlY29yZCBzZXAsIHVuaXQgc2VwXG4gICAgICAgICAgcmVzdWx0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXYua2V5Q29kZSAtIDUxICsgMjcpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2LmtleUNvZGUgPT09IDU2KSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkRFTDtcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID09PSAyMTkpIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDO1xuICAgICAgICB9IGVsc2UgaWYgKGV2LmtleUNvZGUgPT09IDIyMCkge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5GUztcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID09PSAyMjEpIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuR1M7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKCFpc01hYyB8fCBtYWNPcHRpb25Jc01ldGEpICYmIGV2LmFsdEtleSAmJiAhZXYubWV0YUtleSkge1xuICAgICAgICAvLyBPbiBtYWNPUyB0aGlzIGlzIGEgdGhpcmQgbGV2ZWwgc2hpZnQgd2hlbiAhbWFjT3B0aW9uSXNNZXRhLiBVc2UgPEVzYz4gaW5zdGVhZC5cbiAgICAgICAgY29uc3Qga2V5TWFwcGluZyA9IEtFWUNPREVfS0VZX01BUFBJTkdTW2V2LmtleUNvZGVdO1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlNYXBwaW5nPy5bIWV2LnNoaWZ0S2V5ID8gMCA6IDFdO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArIGtleTtcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID49IDY1ICYmIGV2LmtleUNvZGUgPD0gOTApIHtcbiAgICAgICAgICBjb25zdCBrZXlDb2RlID0gZXYuY3RybEtleSA/IGV2LmtleUNvZGUgLSA2NCA6IGV2LmtleUNvZGUgKyAzMjtcbiAgICAgICAgICBsZXQga2V5U3RyaW5nID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXlDb2RlKTtcbiAgICAgICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgIGtleVN0cmluZyA9IGtleVN0cmluZy50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsga2V5U3RyaW5nO1xuICAgICAgICB9IGVsc2UgaWYgKGV2LmtleUNvZGUgPT09IDMyKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArIChldi5jdHJsS2V5ID8gQzAuTlVMIDogJyAnKTtcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXkgPT09ICdEZWFkJyAmJiBldi5jb2RlLnN0YXJ0c1dpdGgoJ0tleScpKSB7XG4gICAgICAgICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20veHRlcm1qcy94dGVybS5qcy9pc3N1ZXMvMzcyNVxuICAgICAgICAgIC8vIEFsdCB3aWxsIHByb2R1Y2UgYSBcImRlYWQga2V5XCIgKGluaXRhdGUgY29tcG9zaXRpb24pIHdpdGggc29tZVxuICAgICAgICAgIC8vIG9mIHRoZSBsZXR0ZXJzIGluIFVTIGxheW91dCAoZS5nLiBOL0UvVSkuXG4gICAgICAgICAgLy8gSXQncyBzYWZlIHRvIG1hdGNoIGFnYWluc3QgS2V5KiBzaW5jZSBubyBvdGhlciBgY29kZWAgdmFsdWVzIGJlZ2luIHdpdGggXCJLZXlcIi5cbiAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9jb2RlL2NvZGVfdmFsdWVzI2NvZGVfdmFsdWVzX29uX21hY1xuICAgICAgICAgIGxldCBrZXlTdHJpbmcgPSBldi5jb2RlLnNsaWNlKDMsIDQpO1xuICAgICAgICAgIGlmICghZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgIGtleVN0cmluZyA9IGtleVN0cmluZy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsga2V5U3RyaW5nO1xuICAgICAgICAgIHJlc3VsdC5jYW5jZWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzTWFjICYmICFldi5hbHRLZXkgJiYgIWV2LmN0cmxLZXkgJiYgIWV2LnNoaWZ0S2V5ICYmIGV2Lm1ldGFLZXkpIHtcbiAgICAgICAgaWYgKGV2LmtleUNvZGUgPT09IDY1KSB7IC8vIGNtZCArIGFcbiAgICAgICAgICByZXN1bHQudHlwZSA9IEtleWJvYXJkUmVzdWx0VHlwZS5TRUxFQ1RfQUxMO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2LmtleSAmJiAhZXYuY3RybEtleSAmJiAhZXYuYWx0S2V5ICYmICFldi5tZXRhS2V5ICYmIGV2LmtleUNvZGUgPj0gNDggJiYgZXYua2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBJbmNsdWRlIG9ubHkga2V5cyB0aGF0IHRoYXQgcmVzdWx0IGluIGEgX3NpbmdsZV8gY2hhcmFjdGVyOyBkb24ndCBpbmNsdWRlIG51bSBsb2NrLFxuICAgICAgICAvLyB2b2x1bWUgdXAsIGV0Yy5cbiAgICAgICAgcmVzdWx0LmtleSA9IGV2LmtleTtcbiAgICAgIH0gZWxzZSBpZiAoZXYua2V5ICYmIGV2LmN0cmxLZXkpIHtcbiAgICAgICAgaWYgKGV2LmtleSA9PT0gJ18nKSB7IC8vIF5fXG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLlVTO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldi5rZXkgPT09ICdAJykgeyAvLyBeICsgc2hpZnQgKyAyID0gXiArIEBcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuTlVMO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG4vKipcbiAqIFBvbHlmaWxsIC0gQ29udmVydCBVVEYzMiBjb2RlcG9pbnQgaW50byBKUyBzdHJpbmcuXG4gKiBOb3RlOiBUaGUgYnVpbHQtaW4gU3RyaW5nLmZyb21Db2RlUG9pbnQgaGFwcGVucyB0byBiZSBtdWNoIHNsb3dlclxuICogICAgICAgZHVlIHRvIGFkZGl0aW9uYWwgc2FuaXR5IGNoZWNrcy4gV2UgY2FuIGF2b2lkIHRoZW0gc2luY2VcbiAqICAgICAgIHdlIGFsd2F5cyBvcGVyYXRlIG9uIGxlZ2FsIFVURjMyIChncmFudGVkIGJ5IHRoZSBpbnB1dCBkZWNvZGVycylcbiAqICAgICAgIGFuZCB1c2UgdGhpcyBmYXN0ZXIgdmVyc2lvbiBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRnJvbUNvZGVQb2ludChjb2RlUG9pbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZVBvaW50ID4+IDEwKSArIDB4RDgwMCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlUG9pbnQgJSAweDQwMCkgKyAweERDMDApO1xuICB9XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG59XG5cbi8qKlxuICogQ29udmVydCBVVEYzMiBjaGFyIGNvZGVzIGludG8gSlMgc3RyaW5nLlxuICogQmFzaWNhbGx5IHRoZSBzYW1lIGFzIGBzdHJpbmdGcm9tQ29kZVBvaW50YCBidXQgZm9yIG11bHRpcGxlIGNvZGVwb2ludHNcbiAqIGluIGEgbG9vcCAod2hpY2ggaXMgYSBsb3QgZmFzdGVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV0ZjMyVG9TdHJpbmcoZGF0YTogVWludDMyQXJyYXksIHN0YXJ0OiBudW1iZXIgPSAwLCBlbmQ6IG51bWJlciA9IGRhdGEubGVuZ3RoKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIGxldCBjb2RlcG9pbnQgPSBkYXRhW2ldO1xuICAgIGlmIChjb2RlcG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIEpTIHN0cmluZ3MgYXJlIGVuY29kZWQgYXMgVVRGMTYsIHRodXMgYSBub24gQk1QIGNvZGVwb2ludCBnZXRzIGNvbnZlcnRlZCBpbnRvIGEgc3Vycm9nYXRlXG4gICAgICAvLyBwYWlyIGNvbnZlcnNpb24gcnVsZXM6XG4gICAgICAvLyAgLSBzdWJ0cmFjdCAweDEwMDAwIGZyb20gY29kZSBwb2ludCwgbGVhdmluZyBhIDIwIGJpdCBudW1iZXJcbiAgICAgIC8vICAtIGFkZCBoaWdoIDEwIGJpdHMgdG8gMHhEODAwICAtLT4gZmlyc3Qgc3Vycm9nYXRlXG4gICAgICAvLyAgLSBhZGQgbG93IDEwIGJpdHMgdG8gMHhEQzAwICAgLS0+IHNlY29uZCBzdXJyb2dhdGVcbiAgICAgIGNvZGVwb2ludCAtPSAweDEwMDAwO1xuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVwb2ludCA+PiAxMCkgKyAweEQ4MDApICsgU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZXBvaW50ICUgMHg0MDApICsgMHhEQzAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZXBvaW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmdUb1V0ZjMyIC0gZGVjb2RlcyBVVEYxNiBzZXF1ZW5jZXMgaW50byBVVEYzMiBjb2RlcG9pbnRzLlxuICogVG8ga2VlcCB0aGUgZGVjb2RlciBpbiBsaW5lIHdpdGggSlMgc3RyaW5ncyBpdCBoYW5kbGVzIHNpbmdsZSBzdXJyb2dhdGVzIGFzIFVDUzIuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpbmdUb1V0ZjMyIHtcbiAgcHJpdmF0ZSBfaW50ZXJpbTogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogQ2xlYXJzIGludGVyaW0gYW5kIHJlc2V0cyBkZWNvZGVyIHRvIGNsZWFuIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2ludGVyaW0gPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBKUyBzdHJpbmcgdG8gVVRGMzIgY29kZXBvaW50cy5cbiAgICogVGhlIG1ldGhvZHMgYXNzdW1lcyBzdHJlYW0gaW5wdXQgYW5kIHdpbGwgc3RvcmUgcGFydGx5IHRyYW5zbWl0dGVkXG4gICAqIHN1cnJvZ2F0ZSBwYWlycyBhbmQgZGVjb2RlIHRoZW0gd2l0aCB0aGUgbmV4dCBkYXRhIGNodW5rLlxuICAgKiBOb3RlOiBUaGUgbWV0aG9kIGRvZXMgbm8gYm91bmQgY2hlY2tzIGZvciB0YXJnZXQsIHRoZXJlZm9yZSBtYWtlIHN1cmVcbiAgICogdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEgZG9lcyBub3QgZXhjZWVkIHRoZSBzaXplIG9mIGB0YXJnZXRgLlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBjb2RlcG9pbnRzIGluIGB0YXJnZXRgLlxuICAgKi9cbiAgcHVibGljIGRlY29kZShpbnB1dDogc3RyaW5nLCB0YXJnZXQ6IFVpbnQzMkFycmF5KTogbnVtYmVyIHtcbiAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGxldCBzdGFydFBvcyA9IDA7XG5cbiAgICAvLyBoYW5kbGUgbGVmdG92ZXIgc3Vycm9nYXRlIGhpZ2hcbiAgICBpZiAodGhpcy5faW50ZXJpbSkge1xuICAgICAgY29uc3Qgc2Vjb25kID0gaW5wdXQuY2hhckNvZGVBdChzdGFydFBvcysrKTtcbiAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSAodGhpcy5faW50ZXJpbSAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCAoVVNDMiBoYW5kbGluZylcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSB0aGlzLl9pbnRlcmltO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IHNlY29uZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ludGVyaW0gPSAwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSBzdGFydFBvczsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBjb2RlID0gaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyIGZpcnN0XG4gICAgICBpZiAoMHhEODAwIDw9IGNvZGUgJiYgY29kZSA8PSAweERCRkYpIHtcbiAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLl9pbnRlcmltID0gY29kZTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWNvbmQgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoMHhEQzAwIDw9IHNlY29uZCAmJiBzZWNvbmQgPD0gMHhERkZGKSB7XG4gICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSAoY29kZSAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQgKFVTQzIgaGFuZGxpbmcpXG4gICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlO1xuICAgICAgICAgIHRhcmdldFtzaXplKytdID0gc2Vjb25kO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUgPT09IDB4RkVGRikge1xuICAgICAgICAvLyBCT01cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGU7XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xuICB9XG59XG5cbi8qKlxuICogVXRmOERlY29kZXIgLSBkZWNvZGVzIFVURjggYnl0ZSBzZXF1ZW5jZXMgaW50byBVVEYzMiBjb2RlcG9pbnRzLlxuICovXG5leHBvcnQgY2xhc3MgVXRmOFRvVXRmMzIge1xuICBwdWJsaWMgaW50ZXJpbTogVWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KDMpO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgaW50ZXJpbSBieXRlcyBhbmQgcmVzZXRzIGRlY29kZXIgdG8gY2xlYW4gc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcmltLmZpbGwoMCk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBVVEY4IGJ5dGUgc2VxdWVuY2VzIGluIGBpbnB1dGAgdG8gVVRGMzIgY29kZXBvaW50cyBpbiBgdGFyZ2V0YC5cbiAgICogVGhlIG1ldGhvZHMgYXNzdW1lcyBzdHJlYW0gaW5wdXQgYW5kIHdpbGwgc3RvcmUgcGFydGx5IHRyYW5zbWl0dGVkIGJ5dGVzXG4gICAqIGFuZCBkZWNvZGUgdGhlbSB3aXRoIHRoZSBuZXh0IGRhdGEgY2h1bmsuXG4gICAqIE5vdGU6IFRoZSBtZXRob2QgZG9lcyBubyBib3VuZCBjaGVja3MgZm9yIHRhcmdldCwgdGhlcmVmb3JlIG1ha2Ugc3VyZVxuICAgKiB0aGUgcHJvdmlkZWQgZGF0YSBjaHVuayBkb2VzIG5vdCBleGNlZWQgdGhlIHNpemUgb2YgYHRhcmdldGAuXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3cml0dGVuIGNvZGVwb2ludHMgaW4gYHRhcmdldGAuXG4gICAqL1xuICBwdWJsaWMgZGVjb2RlKGlucHV0OiBVaW50OEFycmF5LCB0YXJnZXQ6IFVpbnQzMkFycmF5KTogbnVtYmVyIHtcbiAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGxldCBieXRlMTogbnVtYmVyO1xuICAgIGxldCBieXRlMjogbnVtYmVyO1xuICAgIGxldCBieXRlMzogbnVtYmVyO1xuICAgIGxldCBieXRlNDogbnVtYmVyO1xuICAgIGxldCBjb2RlcG9pbnQgPSAwO1xuICAgIGxldCBzdGFydFBvcyA9IDA7XG5cbiAgICAvLyBoYW5kbGUgbGVmdG92ZXIgYnl0ZXNcbiAgICBpZiAodGhpcy5pbnRlcmltWzBdKSB7XG4gICAgICBsZXQgZGlzY2FyZEludGVyaW0gPSBmYWxzZTtcbiAgICAgIGxldCBjcCA9IHRoaXMuaW50ZXJpbVswXTtcbiAgICAgIGNwICY9ICgoKChjcCAmIDB4RTApID09PSAweEMwKSkgPyAweDFGIDogKCgoY3AgJiAweEYwKSA9PT0gMHhFMCkpID8gMHgwRiA6IDB4MDcpO1xuICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICBsZXQgdG1wOiBudW1iZXI7XG4gICAgICB3aGlsZSAoKHRtcCA9IHRoaXMuaW50ZXJpbVsrK3Bvc10gJiAweDNGKSAmJiBwb3MgPCA0KSB7XG4gICAgICAgIGNwIDw8PSA2O1xuICAgICAgICBjcCB8PSB0bXA7XG4gICAgICB9XG4gICAgICAvLyBtaXNzaW5nIGJ5dGVzIC0gcmVhZCBhaGVhZCBmcm9tIGlucHV0XG4gICAgICBjb25zdCB0eXBlID0gKCgodGhpcy5pbnRlcmltWzBdICYgMHhFMCkgPT09IDB4QzApKSA/IDIgOiAoKCh0aGlzLmludGVyaW1bMF0gJiAweEYwKSA9PT0gMHhFMCkpID8gMyA6IDQ7XG4gICAgICBjb25zdCBtaXNzaW5nID0gdHlwZSAtIHBvcztcbiAgICAgIHdoaWxlIChzdGFydFBvcyA8IG1pc3NpbmcpIHtcbiAgICAgICAgaWYgKHN0YXJ0UG9zID49IGxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHRtcCA9IGlucHV0W3N0YXJ0UG9zKytdO1xuICAgICAgICBpZiAoKHRtcCAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uLCBkaXNjYXJkIGludGVyaW0gYnl0ZXMgY29tcGxldGVseVxuICAgICAgICAgIHN0YXJ0UG9zLS07XG4gICAgICAgICAgZGlzY2FyZEludGVyaW0gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5lZWQgdG8gc2F2ZSBzbyB3ZSBjYW4gY29udGludWUgc2hvcnQgaW5wdXRzIGluIG5leHQgY2FsbFxuICAgICAgICAgIHRoaXMuaW50ZXJpbVtwb3MrK10gPSB0bXA7XG4gICAgICAgICAgY3AgPDw9IDY7XG4gICAgICAgICAgY3AgfD0gdG1wICYgMHgzRjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFkaXNjYXJkSW50ZXJpbSkge1xuICAgICAgICAvLyBmaW5hbCB0ZXN0IGlzIHR5cGUgZGVwZW5kZW50XG4gICAgICAgIGlmICh0eXBlID09PSAyKSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHg4MCkge1xuICAgICAgICAgICAgLy8gd3Jvbmcgc3RhcnRlciBieXRlXG4gICAgICAgICAgICBzdGFydFBvcy0tO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAzKSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHgwODAwIHx8IChjcCA+PSAweEQ4MDAgJiYgY3AgPD0gMHhERkZGKSB8fCBjcCA9PT0gMHhGRUZGKSB7XG4gICAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCBvciBCT01cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjcDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHgwMTAwMDAgfHwgY3AgPiAweDEwRkZGRikge1xuICAgICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuaW50ZXJpbS5maWxsKDApO1xuICAgIH1cblxuICAgIC8vIGxvb3AgdGhyb3VnaCBpbnB1dFxuICAgIGNvbnN0IGZvdXJTdG9wID0gbGVuZ3RoIC0gNDtcbiAgICBsZXQgaSA9IHN0YXJ0UG9zO1xuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEFTQ0lJIHNob3J0Y3V0IHdpdGggbG9vcCB1bnJvbGxlZCB0byA0IGNvbnNlY3V0aXZlIEFTQ0lJIGNoYXJzLlxuICAgICAgICogVGhpcyBpcyBhIGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBnYWluIGZvciBBU0NJSVxuICAgICAgICogYW5kIHBlbmFsdHkgZm9yIG5vbiBBU0NJSTpcbiAgICAgICAqIEZvciBiZXN0IEFTQ0lJIHBlcmZvcm1hbmNlIHRoZSBjaGFyIHNob3VsZCBiZSBzdG9yZWQgZGlyZWN0bHkgaW50byB0YXJnZXQsXG4gICAgICAgKiBidXQgZXZlbiBhIHNpbmdsZSBhdHRlbXB0IHRvIHdyaXRlIHRvIHRhcmdldCBhbmQgY29tcGFyZSBhZnRlcndhcmRzXG4gICAgICAgKiBwZW5hbGl6ZXMgbm9uIEFTQ0lJIHJlYWxseSBiYWQgKC01MCUpLCB0aHVzIHdlIGxvYWQgdGhlIGNoYXIgaW50byBieXRlWCBmaXJzdCxcbiAgICAgICAqIHdoaWNoIHJlZHVjZXMgQVNDSUkgcGVyZm9ybWFuY2UgYnkgfjE1JS5cbiAgICAgICAqIFRoaXMgdHJpYWwgZm9yIEFTQ0lJIHJlZHVjZXMgbm9uIEFTQ0lJIHBlcmZvcm1hbmNlIGJ5IH4xMCUgd2hpY2ggc2VlbXMgYWNjZXB0aWJsZVxuICAgICAgICogY29tcGFyZWQgdG8gdGhlIGdhaW5zLlxuICAgICAgICogTm90ZSB0aGF0IHRoaXMgb3B0aW1pemF0aW9uIG9ubHkgdGFrZXMgcGxhY2UgZm9yIDQgY29uc2VjdXRpdmUgQVNDSUkgY2hhcnMsXG4gICAgICAgKiBmb3IgYW55IHNob3J0ZXIgaXQgYmFpbHMgb3V0LiBXb3JzdCBjYXNlIC0gYWxsIDQgYnl0ZXMgYmVpbmcgcmVhZCBidXRcbiAgICAgICAqIHRocm93biBhd2F5IGR1ZSB0byB0aGUgbGFzdCBiZWluZyBhIG5vbiBBU0NJSSBjaGFyICgtMTAlIHBlcmZvcm1hbmNlKS5cbiAgICAgICAqL1xuICAgICAgd2hpbGUgKGkgPCBmb3VyU3RvcFxuICAgICAgICAmJiAhKChieXRlMSA9IGlucHV0W2ldKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGUyID0gaW5wdXRbaSArIDFdKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGUzID0gaW5wdXRbaSArIDJdKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGU0ID0gaW5wdXRbaSArIDNdKSAmIDB4ODApKVxuICAgICAge1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUxO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUyO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUzO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGU0O1xuICAgICAgICBpICs9IDQ7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlcmVhZCBieXRlMVxuICAgICAgYnl0ZTEgPSBpbnB1dFtpKytdO1xuXG4gICAgICAvLyAxIGJ5dGVcbiAgICAgIGlmIChieXRlMSA8IDB4ODApIHtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlMTtcblxuICAgICAgICAvLyAyIGJ5dGVzXG4gICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4RTApID09PSAweEMwKSB7XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUyID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMiAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludCA9IChieXRlMSAmIDB4MUYpIDw8IDYgfCAoYnl0ZTIgJiAweDNGKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCA8IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBzdGFydGVyIGJ5dGVcbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlcG9pbnQ7XG5cbiAgICAgICAgLy8gMyBieXRlc1xuICAgICAgfSBlbHNlIGlmICgoYnl0ZTEgJiAweEYwKSA9PT0gMHhFMCkge1xuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMiA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTIgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMV0gPSBieXRlMjtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMyA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTMgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb2RlcG9pbnQgPSAoYnl0ZTEgJiAweDBGKSA8PCAxMiB8IChieXRlMiAmIDB4M0YpIDw8IDYgfCAoYnl0ZTMgJiAweDNGKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCA8IDB4MDgwMCB8fCAoY29kZXBvaW50ID49IDB4RDgwMCAmJiBjb2RlcG9pbnQgPD0gMHhERkZGKSB8fCBjb2RlcG9pbnQgPT09IDB4RkVGRikge1xuICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50IG9yIEJPTSwgbm8gaS0tIGhlcmVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGVwb2ludDtcblxuICAgICAgICAvLyA0IGJ5dGVzXG4gICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4RjgpID09PSAweEYwKSB7XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUyID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMiAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsxXSA9IGJ5dGUyO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUzID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMyAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsxXSA9IGJ5dGUyO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsyXSA9IGJ5dGUzO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGU0ID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlNCAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludCA9IChieXRlMSAmIDB4MDcpIDw8IDE4IHwgKGJ5dGUyICYgMHgzRikgPDwgMTIgfCAoYnl0ZTMgJiAweDNGKSA8PCA2IHwgKGJ5dGU0ICYgMHgzRik7XG4gICAgICAgIGlmIChjb2RlcG9pbnQgPCAweDAxMDAwMCB8fCBjb2RlcG9pbnQgPiAweDEwRkZGRikge1xuICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50LCBubyBpLS0gaGVyZVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gY29kZXBvaW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWxsZWdhbCBieXRlLCBqdXN0IHNraXBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5pbXBvcnQgeyBJVW5pY29kZVZlcnNpb25Qcm92aWRlciwgVW5pY29kZUNoYXJQcm9wZXJ0aWVzLCBVbmljb2RlQ2hhcldpZHRoIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFVuaWNvZGVTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1VuaWNvZGVTZXJ2aWNlJztcblxuY29uc3QgQk1QX0NPTUJJTklORyA9IFtcbiAgWzB4MDMwMCwgMHgwMzZGXSwgWzB4MDQ4MywgMHgwNDg2XSwgWzB4MDQ4OCwgMHgwNDg5XSxcbiAgWzB4MDU5MSwgMHgwNUJEXSwgWzB4MDVCRiwgMHgwNUJGXSwgWzB4MDVDMSwgMHgwNUMyXSxcbiAgWzB4MDVDNCwgMHgwNUM1XSwgWzB4MDVDNywgMHgwNUM3XSwgWzB4MDYwMCwgMHgwNjAzXSxcbiAgWzB4MDYxMCwgMHgwNjE1XSwgWzB4MDY0QiwgMHgwNjVFXSwgWzB4MDY3MCwgMHgwNjcwXSxcbiAgWzB4MDZENiwgMHgwNkU0XSwgWzB4MDZFNywgMHgwNkU4XSwgWzB4MDZFQSwgMHgwNkVEXSxcbiAgWzB4MDcwRiwgMHgwNzBGXSwgWzB4MDcxMSwgMHgwNzExXSwgWzB4MDczMCwgMHgwNzRBXSxcbiAgWzB4MDdBNiwgMHgwN0IwXSwgWzB4MDdFQiwgMHgwN0YzXSwgWzB4MDkwMSwgMHgwOTAyXSxcbiAgWzB4MDkzQywgMHgwOTNDXSwgWzB4MDk0MSwgMHgwOTQ4XSwgWzB4MDk0RCwgMHgwOTREXSxcbiAgWzB4MDk1MSwgMHgwOTU0XSwgWzB4MDk2MiwgMHgwOTYzXSwgWzB4MDk4MSwgMHgwOTgxXSxcbiAgWzB4MDlCQywgMHgwOUJDXSwgWzB4MDlDMSwgMHgwOUM0XSwgWzB4MDlDRCwgMHgwOUNEXSxcbiAgWzB4MDlFMiwgMHgwOUUzXSwgWzB4MEEwMSwgMHgwQTAyXSwgWzB4MEEzQywgMHgwQTNDXSxcbiAgWzB4MEE0MSwgMHgwQTQyXSwgWzB4MEE0NywgMHgwQTQ4XSwgWzB4MEE0QiwgMHgwQTREXSxcbiAgWzB4MEE3MCwgMHgwQTcxXSwgWzB4MEE4MSwgMHgwQTgyXSwgWzB4MEFCQywgMHgwQUJDXSxcbiAgWzB4MEFDMSwgMHgwQUM1XSwgWzB4MEFDNywgMHgwQUM4XSwgWzB4MEFDRCwgMHgwQUNEXSxcbiAgWzB4MEFFMiwgMHgwQUUzXSwgWzB4MEIwMSwgMHgwQjAxXSwgWzB4MEIzQywgMHgwQjNDXSxcbiAgWzB4MEIzRiwgMHgwQjNGXSwgWzB4MEI0MSwgMHgwQjQzXSwgWzB4MEI0RCwgMHgwQjREXSxcbiAgWzB4MEI1NiwgMHgwQjU2XSwgWzB4MEI4MiwgMHgwQjgyXSwgWzB4MEJDMCwgMHgwQkMwXSxcbiAgWzB4MEJDRCwgMHgwQkNEXSwgWzB4MEMzRSwgMHgwQzQwXSwgWzB4MEM0NiwgMHgwQzQ4XSxcbiAgWzB4MEM0QSwgMHgwQzREXSwgWzB4MEM1NSwgMHgwQzU2XSwgWzB4MENCQywgMHgwQ0JDXSxcbiAgWzB4MENCRiwgMHgwQ0JGXSwgWzB4MENDNiwgMHgwQ0M2XSwgWzB4MENDQywgMHgwQ0NEXSxcbiAgWzB4MENFMiwgMHgwQ0UzXSwgWzB4MEQ0MSwgMHgwRDQzXSwgWzB4MEQ0RCwgMHgwRDREXSxcbiAgWzB4MERDQSwgMHgwRENBXSwgWzB4MEREMiwgMHgwREQ0XSwgWzB4MERENiwgMHgwREQ2XSxcbiAgWzB4MEUzMSwgMHgwRTMxXSwgWzB4MEUzNCwgMHgwRTNBXSwgWzB4MEU0NywgMHgwRTRFXSxcbiAgWzB4MEVCMSwgMHgwRUIxXSwgWzB4MEVCNCwgMHgwRUI5XSwgWzB4MEVCQiwgMHgwRUJDXSxcbiAgWzB4MEVDOCwgMHgwRUNEXSwgWzB4MEYxOCwgMHgwRjE5XSwgWzB4MEYzNSwgMHgwRjM1XSxcbiAgWzB4MEYzNywgMHgwRjM3XSwgWzB4MEYzOSwgMHgwRjM5XSwgWzB4MEY3MSwgMHgwRjdFXSxcbiAgWzB4MEY4MCwgMHgwRjg0XSwgWzB4MEY4NiwgMHgwRjg3XSwgWzB4MEY5MCwgMHgwRjk3XSxcbiAgWzB4MEY5OSwgMHgwRkJDXSwgWzB4MEZDNiwgMHgwRkM2XSwgWzB4MTAyRCwgMHgxMDMwXSxcbiAgWzB4MTAzMiwgMHgxMDMyXSwgWzB4MTAzNiwgMHgxMDM3XSwgWzB4MTAzOSwgMHgxMDM5XSxcbiAgWzB4MTA1OCwgMHgxMDU5XSwgWzB4MTE2MCwgMHgxMUZGXSwgWzB4MTM1RiwgMHgxMzVGXSxcbiAgWzB4MTcxMiwgMHgxNzE0XSwgWzB4MTczMiwgMHgxNzM0XSwgWzB4MTc1MiwgMHgxNzUzXSxcbiAgWzB4MTc3MiwgMHgxNzczXSwgWzB4MTdCNCwgMHgxN0I1XSwgWzB4MTdCNywgMHgxN0JEXSxcbiAgWzB4MTdDNiwgMHgxN0M2XSwgWzB4MTdDOSwgMHgxN0QzXSwgWzB4MTdERCwgMHgxN0REXSxcbiAgWzB4MTgwQiwgMHgxODBEXSwgWzB4MThBOSwgMHgxOEE5XSwgWzB4MTkyMCwgMHgxOTIyXSxcbiAgWzB4MTkyNywgMHgxOTI4XSwgWzB4MTkzMiwgMHgxOTMyXSwgWzB4MTkzOSwgMHgxOTNCXSxcbiAgWzB4MUExNywgMHgxQTE4XSwgWzB4MUIwMCwgMHgxQjAzXSwgWzB4MUIzNCwgMHgxQjM0XSxcbiAgWzB4MUIzNiwgMHgxQjNBXSwgWzB4MUIzQywgMHgxQjNDXSwgWzB4MUI0MiwgMHgxQjQyXSxcbiAgWzB4MUI2QiwgMHgxQjczXSwgWzB4MURDMCwgMHgxRENBXSwgWzB4MURGRSwgMHgxREZGXSxcbiAgWzB4MjAwQiwgMHgyMDBGXSwgWzB4MjAyQSwgMHgyMDJFXSwgWzB4MjA2MCwgMHgyMDYzXSxcbiAgWzB4MjA2QSwgMHgyMDZGXSwgWzB4MjBEMCwgMHgyMEVGXSwgWzB4MzAyQSwgMHgzMDJGXSxcbiAgWzB4MzA5OSwgMHgzMDlBXSwgWzB4QTgwNiwgMHhBODA2XSwgWzB4QTgwQiwgMHhBODBCXSxcbiAgWzB4QTgyNSwgMHhBODI2XSwgWzB4RkIxRSwgMHhGQjFFXSwgWzB4RkUwMCwgMHhGRTBGXSxcbiAgWzB4RkUyMCwgMHhGRTIzXSwgWzB4RkVGRiwgMHhGRUZGXSwgWzB4RkZGOSwgMHhGRkZCXVxuXTtcbmNvbnN0IEhJR0hfQ09NQklOSU5HID0gW1xuICBbMHgxMEEwMSwgMHgxMEEwM10sIFsweDEwQTA1LCAweDEwQTA2XSwgWzB4MTBBMEMsIDB4MTBBMEZdLFxuICBbMHgxMEEzOCwgMHgxMEEzQV0sIFsweDEwQTNGLCAweDEwQTNGXSwgWzB4MUQxNjcsIDB4MUQxNjldLFxuICBbMHgxRDE3MywgMHgxRDE4Ml0sIFsweDFEMTg1LCAweDFEMThCXSwgWzB4MUQxQUEsIDB4MUQxQURdLFxuICBbMHgxRDI0MiwgMHgxRDI0NF0sIFsweEUwMDAxLCAweEUwMDAxXSwgWzB4RTAwMjAsIDB4RTAwN0ZdLFxuICBbMHhFMDEwMCwgMHhFMDFFRl1cbl07XG5cbi8vIEJNUCBsb29rdXAgdGFibGUsIGxhenkgaW5pdGlhbGl6ZWQgZHVyaW5nIGZpcnN0IGFkZG9uIGxvYWRpbmdcbmxldCB0YWJsZTogVWludDhBcnJheTtcblxuZnVuY3Rpb24gYmlzZWFyY2godWNzOiBudW1iZXIsIGRhdGE6IG51bWJlcltdW10pOiBib29sZWFuIHtcbiAgbGV0IG1pbiA9IDA7XG4gIGxldCBtYXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGxldCBtaWQ7XG4gIGlmICh1Y3MgPCBkYXRhWzBdWzBdIHx8IHVjcyA+IGRhdGFbbWF4XVsxXSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB3aGlsZSAobWF4ID49IG1pbikge1xuICAgIG1pZCA9IChtaW4gKyBtYXgpID4+IDE7XG4gICAgaWYgKHVjcyA+IGRhdGFbbWlkXVsxXSkge1xuICAgICAgbWluID0gbWlkICsgMTtcbiAgICB9IGVsc2UgaWYgKHVjcyA8IGRhdGFbbWlkXVswXSkge1xuICAgICAgbWF4ID0gbWlkIC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIFVuaWNvZGVWNiBpbXBsZW1lbnRzIElVbmljb2RlVmVyc2lvblByb3ZpZGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24gPSAnNic7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gaW5pdCBsb29rdXAgdGFibGUgb25jZVxuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHRhYmxlID0gbmV3IFVpbnQ4QXJyYXkoNjU1MzYpO1xuICAgICAgdGFibGUuZmlsbCgxKTtcbiAgICAgIHRhYmxlWzBdID0gMDtcbiAgICAgIC8vIGNvbnRyb2wgY2hhcnNcbiAgICAgIHRhYmxlLmZpbGwoMCwgMSwgMzIpO1xuICAgICAgdGFibGUuZmlsbCgwLCAweDdmLCAweGEwKTtcblxuICAgICAgLy8gYXBwbHkgd2lkZSBjaGFyIHJ1bGVzIGZpcnN0XG4gICAgICAvLyB3aWRlIGNoYXJzXG4gICAgICB0YWJsZS5maWxsKDIsIDB4MTEwMCwgMHgxMTYwKTtcbiAgICAgIHRhYmxlWzB4MjMyOV0gPSAyO1xuICAgICAgdGFibGVbMHgyMzJhXSA9IDI7XG4gICAgICB0YWJsZS5maWxsKDIsIDB4MmU4MCwgMHhhNGQwKTtcbiAgICAgIHRhYmxlWzB4MzAzZl0gPSAxOyAgLy8gd3JvbmdseSBpbiBsYXN0IGxpbmVcblxuICAgICAgdGFibGUuZmlsbCgyLCAweGFjMDAsIDB4ZDdhNCk7XG4gICAgICB0YWJsZS5maWxsKDIsIDB4ZjkwMCwgMHhmYjAwKTtcbiAgICAgIHRhYmxlLmZpbGwoMiwgMHhmZTEwLCAweGZlMWEpO1xuICAgICAgdGFibGUuZmlsbCgyLCAweGZlMzAsIDB4ZmU3MCk7XG4gICAgICB0YWJsZS5maWxsKDIsIDB4ZmYwMCwgMHhmZjYxKTtcbiAgICAgIHRhYmxlLmZpbGwoMiwgMHhmZmUwLCAweGZmZTcpO1xuXG4gICAgICAvLyBhcHBseSBjb21iaW5pbmcgbGFzdCB0byBlbnN1cmUgd2Ugb3ZlcndyaXRlXG4gICAgICAvLyB3cm9uZ2x5IHdpZGUgc2V0IGNoYXJzOlxuICAgICAgLy8gICAgdGhlIG9yaWdpbmFsIGFsZ28gZXZhbHMgY29tYmluaW5nIGZpcnN0IGFuZCBmYWxsc1xuICAgICAgLy8gICAgdGhyb3VnaCB0byB3aWRlIGNoZWNrIHNvIHdlIHNpbXBseSBkbyBoZXJlIHRoZSBvcHBvc2l0ZVxuICAgICAgLy8gY29tYmluaW5nIDBcbiAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgQk1QX0NPTUJJTklORy5sZW5ndGg7ICsrcikge1xuICAgICAgICB0YWJsZS5maWxsKDAsIEJNUF9DT01CSU5JTkdbcl1bMF0sIEJNUF9DT01CSU5JTkdbcl1bMV0gKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd2N3aWR0aChudW06IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGgge1xuICAgIGlmIChudW0gPCAzMikgcmV0dXJuIDA7XG4gICAgaWYgKG51bSA8IDEyNykgcmV0dXJuIDE7XG4gICAgaWYgKG51bSA8IDY1NTM2KSByZXR1cm4gdGFibGVbbnVtXSBhcyBVbmljb2RlQ2hhcldpZHRoO1xuICAgIGlmIChiaXNlYXJjaChudW0sIEhJR0hfQ09NQklOSU5HKSkgcmV0dXJuIDA7XG4gICAgaWYgKChudW0gPj0gMHgyMDAwMCAmJiBudW0gPD0gMHgyZmZmZCkgfHwgKG51bSA+PSAweDMwMDAwICYmIG51bSA8PSAweDNmZmZkKSkgcmV0dXJuIDI7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBwdWJsaWMgY2hhclByb3BlcnRpZXMoY29kZXBvaW50OiBudW1iZXIsIHByZWNlZGluZzogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzIHtcbiAgICBsZXQgd2lkdGggPSB0aGlzLndjd2lkdGgoY29kZXBvaW50KTtcbiAgICBsZXQgc2hvdWxkSm9pbiA9IHdpZHRoID09PSAwICYmIHByZWNlZGluZyAhPT0gMDtcbiAgICBpZiAoc2hvdWxkSm9pbikge1xuICAgICAgY29uc3Qgb2xkV2lkdGggPSBVbmljb2RlU2VydmljZS5leHRyYWN0V2lkdGgocHJlY2VkaW5nKTtcbiAgICAgIGlmIChvbGRXaWR0aCA9PT0gMCkge1xuICAgICAgICBzaG91bGRKb2luID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKG9sZFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgd2lkdGggPSBvbGRXaWR0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFVuaWNvZGVTZXJ2aWNlLmNyZWF0ZVByb3BlcnR5VmFsdWUoMCwgd2lkdGgsIHNob3VsZEpvaW4pO1xuICB9XG59XG4iLCAiXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuXG5kZWNsYXJlIGNvbnN0IHNldFRpbWVvdXQ6IChoYW5kbGVyOiAoKSA9PiB2b2lkLCB0aW1lb3V0PzogbnVtYmVyKSA9PiB2b2lkO1xuXG4vKipcbiAqIFNhZmV0eSB3YXRlcm1hcmsgdG8gYXZvaWQgbWVtb3J5IGV4aGF1c3Rpb24gYW5kIGJyb3dzZXIgZW5naW5lIGNyYXNoIG9uIGZhc3QgZGF0YSBpbnB1dC5cbiAqIEVuYWJsZSBmbG93IGNvbnRyb2wgdG8gYXZvaWQgdGhpcyBsaW1pdCBhbmQgbWFrZSBzdXJlIHRoYXQgeW91ciBiYWNrZW5kIGNvcnJlY3RseVxuICogcHJvcGFnYXRlcyB0aGlzIHRvIHRoZSB1bmRlcmx5aW5nIHB0eS4gKHNlZSBkb2NzIGZvciBmdXJ0aGVyIGluc3RydWN0aW9ucylcbiAqIFNpbmNlIHRoaXMgbGltaXQgaXMgbWVhbnQgYXMgYSBzYWZldHkgcGFyYWNodXRlIHRvIHByZXZlbnQgYnJvd3NlciBjcmFzaHMsXG4gKiBpdCBpcyBzZXQgdG8gYSB2ZXJ5IGhpZ2ggbnVtYmVyLiBUeXBpY2FsbHkgeHRlcm0uanMgZ2V0cyB1bnJlc3BvbnNpdmUgd2l0aFxuICogYSAxMDAgdGltZXMgbG93ZXIgbnVtYmVyICg+NTAwIGtCKS5cbiAqL1xuY29uc3QgRElTQ0FSRF9XQVRFUk1BUksgPSA1MDAwMDAwMDsgLy8gfjUwIE1CXG5cbi8qKlxuICogVGhlIG1heCBudW1iZXIgb2YgbXMgdG8gc3BlbmQgb24gd3JpdGVzIGJlZm9yZSBhbGxvd2luZyB0aGUgcmVuZGVyZXIgdG9cbiAqIGNhdGNoIHVwIHdpdGggYSAwbXMgc2V0VGltZW91dC4gQSB2YWx1ZSBvZiA8IDMzIHRvIGtlZXAgdXMgY2xvc2UgdG9cbiAqIDMwZnBzLCBhbmQgYSB2YWx1ZSBvZiA8IDE2IHRvIHRyeSB0byBydW4gYXQgNjBmcHMuIE9mIGNvdXJzZSwgdGhlIHJlYWwgRlBTXG4gKiBkZXBlbmRzIG9uIHRoZSB0aW1lIGl0IHRha2VzIGZvciB0aGUgcmVuZGVyZXIgdG8gZHJhdyB0aGUgZnJhbWUuXG4gKi9cbmNvbnN0IFdSSVRFX1RJTUVPVVRfTVMgPSAxMjtcblxuLyoqXG4gKiBUaHJlc2hvbGQgb2YgbWF4IGhlbGQgY2h1bmtzIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoYXQgd2VyZSBhbHJlYWR5IHByb2Nlc3NlZC5cbiAqIFRoaXMgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIGV4dGVuc2l2ZSB3cml0ZSBidWZmZXIgc2hpZnRzIChiYWQgcnVudGltZSkgYW5kIGhpZ2hcbiAqIG1lbW9yeSBjb25zdW1wdGlvbiBieSBkYXRhIHRoYXRzIG5vdCB1c2VkIGFueW1vcmUuXG4gKi9cbmNvbnN0IFdSSVRFX0JVRkZFUl9MRU5HVEhfVEhSRVNIT0xEID0gNTA7XG5cbmV4cG9ydCBjbGFzcyBXcml0ZUJ1ZmZlciBleHRlbmRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIF93cml0ZUJ1ZmZlcjogKHN0cmluZyB8IFVpbnQ4QXJyYXkpW10gPSBbXTtcbiAgcHJpdmF0ZSBfY2FsbGJhY2tzOiAoKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkKVtdID0gW107XG4gIHByaXZhdGUgX3BlbmRpbmdEYXRhID0gMDtcbiAgcHJpdmF0ZSBfYnVmZmVyT2Zmc2V0ID0gMDtcbiAgcHJpdmF0ZSBfaXNTeW5jV3JpdGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF9zeW5jQ2FsbHMgPSAwO1xuICBwcml2YXRlIF9kaWRVc2VySW5wdXQgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbldyaXRlUGFyc2VkID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25Xcml0ZVBhcnNlZCA9IHRoaXMuX29uV3JpdGVQYXJzZWQuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfYWN0aW9uOiAoZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSwgcHJvbWlzZVJlc3VsdD86IGJvb2xlYW4pID0+IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVVc2VySW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZGlkVXNlcklucHV0ID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVbnJlbGlhYmxlLCB0byBiZSByZW1vdmVkIHNvb24uXG4gICAqL1xuICBwdWJsaWMgd3JpdGVTeW5jKGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXksIG1heFN1YnNlcXVlbnRDYWxscz86IG51bWJlcik6IHZvaWQge1xuICAgIC8vIHN0b3Agd3JpdGVTeW5jIHJlY3Vyc2lvbnMgd2l0aCBtYXhTdWJzZXF1ZW50Q2FsbHMgYXJndW1lbnRcbiAgICAvLyBUaGlzIGlzIGRhbmdlcm91cyB0byB1c2UgYXMgaXQgd2lsbCBsb3NlIHRoZSBjdXJyZW50IGRhdGEgY2h1bmtcbiAgICAvLyBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LlxuICAgIGlmIChtYXhTdWJzZXF1ZW50Q2FsbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9zeW5jQ2FsbHMgPiBtYXhTdWJzZXF1ZW50Q2FsbHMpIHtcbiAgICAgIC8vIGNvbW1lbnQgbmV4dCBsaW5lIGlmIGEgd2hvbGUgbG9vcCBibG9jayBzaG91bGQgb25seSBjb250YWluIHggYHdyaXRlU3luY2AgY2FsbHNcbiAgICAgIC8vICh0b3RhbCBmbGF0IHZzLiBkZWVwIG5lc3RlZCBsaW1pdClcbiAgICAgIHRoaXMuX3N5bmNDYWxscyA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGFwcGVuZCBjaHVuayB0byBidWZmZXJcbiAgICB0aGlzLl9wZW5kaW5nRGF0YSArPSBkYXRhLmxlbmd0aDtcbiAgICB0aGlzLl93cml0ZUJ1ZmZlci5wdXNoKGRhdGEpO1xuICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKHVuZGVmaW5lZCk7XG5cbiAgICAvLyBpbmNyZWFzZSByZWN1cnNpb24gY291bnRlclxuICAgIHRoaXMuX3N5bmNDYWxscysrO1xuICAgIC8vIGV4aXQgZWFybHkgaWYgYW5vdGhlciB3cml0ZVN5bmMgbG9vcCBpcyBhY3RpdmVcbiAgICBpZiAodGhpcy5faXNTeW5jV3JpdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc1N5bmNXcml0aW5nID0gdHJ1ZTtcblxuICAgIC8vIGZvcmNlIHN5bmMgcHJvY2Vzc2luZyBvbiBwZW5kaW5nIGRhdGEgY2h1bmtzIHRvIGF2b2lkIGluLWJhbmQgZGF0YSBzY3JhbWJsaW5nXG4gICAgLy8gZG9lcyB0aGUgc2FtZSBhcyBpbm5lcldyaXRlIGJ1dCB3aXRob3V0IGV2ZW50IGxvb3BcbiAgICAvLyB3ZSBoYXZlIHRvIGRvIGl0IGhlcmUgYXMgc2luZ2xlIGxvb3Agc3RlcHMgdG8gbm90IGNvcnJ1cHQgbG9vcCBzdWJqZWN0XG4gICAgLy8gYnkgYW5vdGhlciB3cml0ZVN5bmMgY2FsbCB0cmlnZ2VyZWQgZnJvbSBfYWN0aW9uXG4gICAgbGV0IGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICAgIHdoaWxlIChjaHVuayA9IHRoaXMuX3dyaXRlQnVmZmVyLnNoaWZ0KCkpIHtcbiAgICAgIHRoaXMuX2FjdGlvbihjaHVuayk7XG4gICAgICBjb25zdCBjYiA9IHRoaXMuX2NhbGxiYWNrcy5zaGlmdCgpO1xuICAgICAgaWYgKGNiKSBjYigpO1xuICAgIH1cbiAgICAvLyByZXNldCB0byBhdm9pZCByZXByb2Nlc3Npbmcgb2YgY2h1bmtzIHdpdGggc2NoZWR1bGVkIGlubmVyV3JpdGUgY2FsbFxuICAgIC8vIHN0b3BwaW5nIHNjaGVkdWxlZCBpbm5lcldyaXRlIGJ5IG9mZnNldCA+IGxlbmd0aCBjb25kaXRpb25cbiAgICB0aGlzLl9wZW5kaW5nRGF0YSA9IDA7XG4gICAgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gMHg3RkZGRkZGRjtcblxuICAgIC8vIGFsbG93IGFub3RoZXIgd3JpdGVTeW5jIHRvIGxvb3BcbiAgICB0aGlzLl9pc1N5bmNXcml0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5fc3luY0NhbGxzID0gMDtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZShkYXRhOiBzdHJpbmcgfCBVaW50OEFycmF5LCBjYWxsYmFjaz86ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGVuZGluZ0RhdGEgPiBESVNDQVJEX1dBVEVSTUFSSykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZSBkYXRhIGRpc2NhcmRlZCwgdXNlIGZsb3cgY29udHJvbCB0byBhdm9pZCBsb3NpbmcgZGF0YScpO1xuICAgIH1cblxuICAgIC8vIHNjaGVkdWxlIGNodW5rIHByb2Nlc3NpbmcgZm9yIG5leHQgZXZlbnQgbG9vcCBydW5cbiAgICBpZiAoIXRoaXMuX3dyaXRlQnVmZmVyLmxlbmd0aCkge1xuICAgICAgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gMDtcblxuICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgd3JpdGUgY2FsbCBhZnRlciB0aGUgdXNlciBoYXMgZG9uZSBzb21lIGlucHV0LFxuICAgICAgLy8gcGFyc2UgaXQgaW1tZWRpYXRlbHkgdG8gbWluaW1pemUgaW5wdXQgbGF0ZW5jeSxcbiAgICAgIC8vIG90aGVyd2lzZSBzY2hlZHVsZSBmb3IgdGhlIG5leHQgZXZlbnRcbiAgICAgIGlmICh0aGlzLl9kaWRVc2VySW5wdXQpIHtcbiAgICAgICAgdGhpcy5fZGlkVXNlcklucHV0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdEYXRhICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICB0aGlzLl93cml0ZUJ1ZmZlci5wdXNoKGRhdGEpO1xuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2lubmVyV3JpdGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2lubmVyV3JpdGUoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcGVuZGluZ0RhdGEgKz0gZGF0YS5sZW5ndGg7XG4gICAgdGhpcy5fd3JpdGVCdWZmZXIucHVzaChkYXRhKTtcbiAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogSW5uZXIgd3JpdGUgY2FsbCwgdGhhdCBlbnRlcnMgdGhlIHNsaWNlZCBjaHVuayBwcm9jZXNzaW5nIGJ5IHRpbWluZy5cbiAgICpcbiAgICogYGxhc3RUaW1lYCBpbmRpY2F0ZXMsIHdoZW4gdGhlIGxhc3QgX2lubmVyV3JpdGUgY2FsbCBoYWQgc3RhcnRlZC5cbiAgICogSXQgaXMgdXNlZCB0byBhZ2dyZWdhdGUgYXN5bmMgaGFuZGxlciBleGVjdXRpb24gdW5kZXIgYSB0aW1lb3V0IGNvbnN0cmFpbnRcbiAgICogZWZmZWN0aXZlbHkgbG93ZXJpbmcgdGhlIHJlZHJhd2luZyBuZWVkcywgc2NoZW1hdGljYWxseTpcbiAgICpcbiAgICogICBtYWNyb1Rhc2sgX2lubmVyV3JpdGU6XG4gICAqICAgICBpZiAoRGF0ZS5ub3coKSAtIChsYXN0VGltZSB8IDApIDwgV1JJVEVfVElNRU9VVF9NUyk6XG4gICAqICAgICAgICBzY2hlZHVsZSBtaWNyb1Rhc2sgX2lubmVyV3JpdGUobGFzdFRpbWUpXG4gICAqICAgICBlbHNlOlxuICAgKiAgICAgICAgc2NoZWR1bGUgbWFjcm9UYXNrIF9pbm5lcldyaXRlKDApXG4gICAqXG4gICAqICAgb3ZlcmFsbCBleGVjdXRpb24gb3JkZXIgb24gdGFzayBxdWV1ZXM6XG4gICAqXG4gICAqICAgbWFjcm90YXNrczogIFsuLi5dICAtLT4gIF9pbm5lcldyaXRlKDApICAtLT4gIFsuLi5dICAtLT4gIHNjcmVlblVwZGF0ZSAgLS0+ICBbLi4uXVxuICAgKiAgICAgICAgIG0gIHQ6ICAgICAgICAgICAgICAgICAgICB8XG4gICAqICAgICAgICAgaSAgYTogICAgICAgICAgICAgICAgICBbLi4uXVxuICAgKiAgICAgICAgIGMgIHM6ICAgICAgICAgICAgICAgICAgICB8XG4gICAqICAgICAgICAgciAgazogICAgICAgICAgICAgIHdoaWxlIDwgdGltZW91dDpcbiAgICogICAgICAgICBvICBzOiAgICAgICAgICAgICAgICBfaW5uZXJXcml0ZSh0aW1lb3V0KVxuICAgKlxuICAgKiBgcHJvbWlzZVJlc3VsdGAgZGVwaWN0cyB0aGUgcHJvbWlzZSByZXNvbHZlIHZhbHVlIG9mIGFuIGFzeW5jIGhhbmRsZXIuXG4gICAqIFRoaXMgdmFsdWUgZ2V0cyBjYXJyaWVkIGZvcndhcmQgdGhyb3VnaCBhbGwgc2F2ZWQgc3RhY2sgc3RhdGVzIG9mIHRoZVxuICAgKiBwYXVzZWQgcGFyc2VyIGZvciBwcm9wZXIgY29udGludWF0aW9uLlxuICAgKlxuICAgKiBOb3RlLCBmb3IgcHVyZSBzeW5jIGNvZGUgYGxhc3RUaW1lYCBhbmQgYHByb21pc2VSZXN1bHRgIGhhdmUgbm8gbWVhbmluZy5cbiAgICovXG4gIHByb3RlY3RlZCBfaW5uZXJXcml0ZShsYXN0VGltZTogbnVtYmVyID0gMCwgcHJvbWlzZVJlc3VsdDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBsYXN0VGltZSB8fCBEYXRlLm5vdygpO1xuICAgIHdoaWxlICh0aGlzLl93cml0ZUJ1ZmZlci5sZW5ndGggPiB0aGlzLl9idWZmZXJPZmZzZXQpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl93cml0ZUJ1ZmZlclt0aGlzLl9idWZmZXJPZmZzZXRdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fYWN0aW9uKGRhdGEsIHByb21pc2VSZXN1bHQpO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgd2UgZ2V0IGEgcHJvbWlzZSBhcyByZXR1cm4gdmFsdWUsIHdlIHJlLXNjaGVkdWxlIHRoZSBjb250aW51YXRpb25cbiAgICAgICAgICogYXMgdGhlbmFibGUgb24gdGhlIHByb21pc2UgYW5kIGV4aXQgcmlnaHQgYXdheS5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGV4aXQgaGVyZSBtZWFucywgdGhhdCB3ZSBibG9jayBpbnB1dCBwcm9jZXNzaW5nIGF0IHRoZSBjdXJyZW50IGFjdGl2ZSBjaHVuayxcbiAgICAgICAgICogdGhlIGV4YWN0IGV4ZWN1dGlvbiBwb3NpdGlvbiB3aXRoaW4gdGhlIGNodW5rIGlzIHByZXNlcnZlZCBieSB0aGUgc2F2ZWRcbiAgICAgICAgICogc3RhY2sgY29udGVudCBpbiBJbnB1dEhhbmRsZXIgYW5kIEVzY2FwZVNlcXVlbmNlUGFyc2VyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBSZXN1bWluZyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGF0IHNhdmVkIHN0YWNrIHN0YXRlLlxuICAgICAgICAgKiBBbHNvIHRoZSByZXNvbHZlZCBwcm9taXNlIHZhbHVlIGlzIHBhc3NlZCBhbG9uZyB0aGUgY2FsbHN0YWNrIHRvXG4gICAgICAgICAqIGBFc2NhcGVTZXF1ZW5jZVBhcnNlci5wYXJzZWAgdG8gY29ycmVjdGx5IHJlc3VtZSB0aGUgc3RvcHBlZCBoYW5kbGVyIGxvb3AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEV4Y2VwdGlvbnMgb24gYXN5bmMgaGFuZGxlcnMgd2lsbCBiZSBsb2dnZWQgdG8gY29uc29sZSBhc3luYywgYnV0IGRvIG5vdCBpbnRlcnJ1cHRcbiAgICAgICAgICogdGhlIGlucHV0IHByb2Nlc3NpbmcgKGNvbnRpbnVlcyB3aXRoIG5leHQgaGFuZGxlciBhdCB0aGUgY3VycmVudCBpbnB1dCBwb3NpdGlvbikuXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBhIHByb21pc2UgdGFrZXMgbG9uZyB0byByZXNvbHZlLCB3ZSBzaG91bGQgc2NoZWR1bGUgY29udGludWF0aW9uIGJlaGluZCBzZXRUaW1lb3V0LlxuICAgICAgICAgKiBUaGlzIG1pZ2h0IGFscmVhZHkgYmUgdG9vIGxhdGUsIGlmIG91ciAudGhlbiBlbnRlcnMgcmVhbGx5IGxhdGUgKGV4ZWN1dG9yICsgcHJldiB0aGVuc1xuICAgICAgICAgKiB0b29rIHZlcnkgbG9uZykuIFRoaXMgY2Fubm90IGJlIHNvbHZlZCBoZXJlIGZvciB0aGUgaGFuZGxlciBpdHNlbGYgKGl0IGlzIHRoZSBoYW5kbGVyc1xuICAgICAgICAgKiByZXNwb25zaWJpbGl0eSB0byBzbGljZSBoYXJkIHdvcmspLCBidXQgd2UgY2FuIGF0IGxlYXN0IHNjaGVkdWxlIGEgc2NyZWVuIHVwZGF0ZSBhcyB3ZVxuICAgICAgICAgKiBnYWluIGNvbnRyb2wuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBjb250aW51YXRpb246IChyOiBib29sZWFuKSA9PiB2b2lkID0gKHI6IGJvb2xlYW4pID0+IERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gV1JJVEVfVElNRU9VVF9NU1xuICAgICAgICAgID8gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9pbm5lcldyaXRlKDAsIHIpKVxuICAgICAgICAgIDogdGhpcy5faW5uZXJXcml0ZShzdGFydFRpbWUsIHIpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcHRpbWl6YXRpb24gY29uc2lkZXJhdGlvbnM6XG4gICAgICAgICAqIFRoZSBjb250aW51YXRpb24gYWJvdmUgZmF2b3JzIEZQUyBvdmVyIHRocm91Z2hwdXQgYnkgZXZhbCdpbmcgYHN0YXJ0VGltZWAgb24gcmVzb2x2ZS5cbiAgICAgICAgICogVGhpcyBtaWdodCBzY2hlZHVsZSB0b28gbWFueSBzY3JlZW4gdXBkYXRlcyB3aXRoIGJhZCB0aHJvdWdocHV0IGRyb3BzIChpbiBjYXNlIGEgc2xvd1xuICAgICAgICAgKiByZXNvbHZpbmcgaGFuZGxlciBzbGljZWQgaXRzIHdvcmsgcHJvcGVybHkgYmVoaW5kIHNldFRpbWVvdXQgY2FsbHMpLiBXZSBjYW5ub3Qgc3BvdFxuICAgICAgICAgKiB0aGlzIGNvbmRpdGlvbiBoZXJlLCBhbHNvIHRoZSByZW5kZXJlciBoYXMgbm8gd2F5IHRvIHNwb3Qgbm9uc2Vuc2UgdXBkYXRlcyBlaXRoZXIuXG4gICAgICAgICAqIEZJWE1FOiBBIHByb3BlciBmaXggZm9yIHRoaXMgd291bGQgdHJhY2sgdGhlIEZQUyBhdCB0aGUgcmVuZGVyZXIgZW50cnkgbGV2ZWwgc2VwYXJhdGVseS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgZmF2b3Jpbmcgb2YgRlBTIHNob3dzIGJhZCB0aHJvdWdodHB1dCBpbXBhY3QsIHVzZSB0aGUgZm9sbG93aW5nIGluc3RlYWQuIEl0IGZhdm9yc1xuICAgICAgICAgKiB0aHJvdWdocHV0IGJ5IGV2YWwnaW5nIGBzdGFydFRpbWVgIHVwZnJvbnQgcHVsbGluZyBhdCBsZWFzdCBvbmUgbW9yZSBjaHVuayBpbnRvIHRoZVxuICAgICAgICAgKiBjdXJyZW50IG1pY3JvdGFzayBxdWV1ZSAoZXhlY3V0ZWQgYmVmb3JlIHNldFRpbWVvdXQpLlxuICAgICAgICAgKi9cbiAgICAgICAgLy8gY29uc3QgY29udGludWF0aW9uOiAocjogYm9vbGVhbikgPT4gdm9pZCA9IERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gV1JJVEVfVElNRU9VVF9NU1xuICAgICAgICAvLyAgID8gciA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2lubmVyV3JpdGUoMCwgcikpXG4gICAgICAgIC8vICAgOiByID0+IHRoaXMuX2lubmVyV3JpdGUoc3RhcnRUaW1lLCByKTtcblxuICAgICAgICAvLyBIYW5kbGUgZXhjZXB0aW9ucyBzeW5jaHJvbm91c2x5IHRvIGN1cnJlbnQgYmFuZCBwb3NpdGlvbiwgaWRlYTpcbiAgICAgICAgLy8gMS4gc3Bhd24gYSBzaW5nbGUgbWljcm90YXNrIHdoaWNoIHdlIGFsbG93IHRvIHRocm93IGhhcmRcbiAgICAgICAgLy8gMi4gc3Bhd24gYSBwcm9taXNlIGltbWVkaWF0ZWx5IHJlc29sdmluZyB0byBgdHJ1ZWBcbiAgICAgICAgLy8gKGV4ZWN1dGVkIG9uIHRoZSBzYW1lIHF1ZXVlLCB0aHVzIHByb3Blcmx5IGFsaWduZWQgYmVmb3JlIGNvbnRpbnVhdGlvbiBoYXBwZW5zKVxuICAgICAgICByZXN1bHQuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7dGhyb3cgZXJyO30pO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9KS50aGVuKGNvbnRpbnVhdGlvbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2IgPSB0aGlzLl9jYWxsYmFja3NbdGhpcy5fYnVmZmVyT2Zmc2V0XTtcbiAgICAgIGlmIChjYikgY2IoKTtcbiAgICAgIHRoaXMuX2J1ZmZlck9mZnNldCsrO1xuICAgICAgdGhpcy5fcGVuZGluZ0RhdGEgLT0gZGF0YS5sZW5ndGg7XG5cbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID49IFdSSVRFX1RJTUVPVVRfTVMpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl93cml0ZUJ1ZmZlci5sZW5ndGggPiB0aGlzLl9idWZmZXJPZmZzZXQpIHtcbiAgICAgIC8vIEFsbG93IHJlbmRlcmVyIHRvIGNhdGNoIHVwIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBuZXh0IGJhdGNoXG4gICAgICAvLyB0cmltIGFscmVhZHkgcHJvY2Vzc2VkIGNodW5rcyBpZiB3ZSBhcmUgYWJvdmUgdGhyZXNob2xkXG4gICAgICBpZiAodGhpcy5fYnVmZmVyT2Zmc2V0ID4gV1JJVEVfQlVGRkVSX0xFTkdUSF9USFJFU0hPTEQpIHtcbiAgICAgICAgdGhpcy5fd3JpdGVCdWZmZXIgPSB0aGlzLl93cml0ZUJ1ZmZlci5zbGljZSh0aGlzLl9idWZmZXJPZmZzZXQpO1xuICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3Muc2xpY2UodGhpcy5fYnVmZmVyT2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gMDtcbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5faW5uZXJXcml0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fd3JpdGVCdWZmZXIubGVuZ3RoID0gMDtcbiAgICAgIHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgICAgdGhpcy5fcGVuZGluZ0RhdGEgPSAwO1xuICAgICAgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgdGhpcy5fb25Xcml0ZVBhcnNlZC5maXJlKCk7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cblxuLy8gJ3JnYjonIHJ1bGUgLSBtYXRjaGluZzogci9nL2IgfCByci9nZy9iYiB8IHJyci9nZ2cvYmJiIHwgcnJyci9nZ2dnL2JiYmIgKGhleCBkaWdpdHMpXG5jb25zdCBSR0JfUkVYID0gL14oW1xcZGEtZl0pXFwvKFtcXGRhLWZdKVxcLyhbXFxkYS1mXSkkfF4oW1xcZGEtZl17Mn0pXFwvKFtcXGRhLWZdezJ9KVxcLyhbXFxkYS1mXXsyfSkkfF4oW1xcZGEtZl17M30pXFwvKFtcXGRhLWZdezN9KVxcLyhbXFxkYS1mXXszfSkkfF4oW1xcZGEtZl17NH0pXFwvKFtcXGRhLWZdezR9KVxcLyhbXFxkYS1mXXs0fSkkLztcbi8vICcjLi4uJyBydWxlIC0gbWF0Y2hpbmcgYW55IGhleCBkaWdpdHNcbmNvbnN0IEhBU0hfUkVYID0gL15bXFxkYS1mXSskLztcblxuLyoqXG4gKiBQYXJzZSBjb2xvciBzcGVjIHRvIFJHQiB2YWx1ZXMgKDggYml0IHBlciBjaGFubmVsKS5cbiAqIFNlZSBgbWFuIHhwYXJzZWNvbG9yYCBmb3IgZGV0YWlscyBhYm91dCBjZXJ0YWluIGZvcm1hdCBzcGVjaWZpY2F0aW9ucy5cbiAqXG4gKiBTdXBwb3J0ZWQgZm9ybWF0czpcbiAqIC0gcmdiOjxyZWQ+LzxncmVlbj4vPGJsdWU+IHdpdGggPHJlZD4sIDxncmVlbj4sIDxibHVlPiBpbiBoIHwgaGggfCBoaGggfCBoaGhoXG4gKiAtICNSR0IsICNSUkdHQkIsICNSUlJHR0dCQkIsICNSUlJSR0dHR0JCQkJcbiAqXG4gKiBBbGwgb3RoZXIgZm9ybWF0cyBsaWtlIHJnYmk6IG9yIGRldmljZS1pbmRlcGVuZGVudCBzdHJpbmcgc3BlY2lmaWNhdGlvbnNcbiAqIHdpdGggZmxvYXQgbnVtYmVyaW5nIGFyZSBub3Qgc3VwcG9ydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb2xvcihkYXRhOiBzdHJpbmcpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICBpZiAoIWRhdGEpIHJldHVybjtcbiAgLy8gYWxzbyBoYW5kbGUgdXBwZXJjYXNlc1xuICBsZXQgbG93ID0gZGF0YS50b0xvd2VyQ2FzZSgpO1xuICBpZiAobG93LmluZGV4T2YoJ3JnYjonKSA9PT0gMCkge1xuICAgIC8vICdyZ2I6JyBzcGVjaWZpZXJcbiAgICBsb3cgPSBsb3cuc2xpY2UoNCk7XG4gICAgY29uc3QgbSA9IFJHQl9SRVguZXhlYyhsb3cpO1xuICAgIGlmIChtKSB7XG4gICAgICBjb25zdCBiYXNlID0gbVsxXSA/IDE1IDogbVs0XSA/IDI1NSA6IG1bN10gPyA0MDk1IDogNjU1MzU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBNYXRoLnJvdW5kKHBhcnNlSW50KG1bMV0gfHwgbVs0XSB8fCBtWzddIHx8IG1bMTBdLCAxNikgLyBiYXNlICogMjU1KSxcbiAgICAgICAgTWF0aC5yb3VuZChwYXJzZUludChtWzJdIHx8IG1bNV0gfHwgbVs4XSB8fCBtWzExXSwgMTYpIC8gYmFzZSAqIDI1NSksXG4gICAgICAgIE1hdGgucm91bmQocGFyc2VJbnQobVszXSB8fCBtWzZdIHx8IG1bOV0gfHwgbVsxMl0sIDE2KSAvIGJhc2UgKiAyNTUpXG4gICAgICBdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChsb3cuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgLy8gJyMnIHNwZWNpZmllclxuICAgIGxvdyA9IGxvdy5zbGljZSgxKTtcbiAgICBpZiAoSEFTSF9SRVguZXhlYyhsb3cpICYmIFszLCA2LCA5LCAxMl0uaW5jbHVkZXMobG93Lmxlbmd0aCkpIHtcbiAgICAgIGNvbnN0IGFkdiA9IGxvdy5sZW5ndGggLyAzO1xuICAgICAgY29uc3QgcmVzdWx0OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMCwgMCwgMF07XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkge1xuICAgICAgICBjb25zdCBjID0gcGFyc2VJbnQobG93LnNsaWNlKGFkdiAqIGksIGFkdiAqIGkgKyBhZHYpLCAxNik7XG4gICAgICAgIHJlc3VsdFtpXSA9IGFkdiA9PT0gMSA/IGMgPDwgNCA6IGFkdiA9PT0gMiA/IGMgOiBhZHYgPT09IDMgPyBjID4+IDQgOiBjID4+IDg7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8vIE5hbWVkIGNvbG9ycyBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgZHVlIHRvIHRoZSBsYXJnZSBhZGRpdGlvbiB0byB0aGUgeHRlcm0uanMgYnVuZGxlIHNpemVcbiAgLy8gdGhleSB3b3VsZCBhZGQuIEluIG9yZGVyIHRvIHN1cHBvcnQgbmFtZWQgY29sb3JzLCB3ZSB3b3VsZCBuZWVkIHNvbWUgd2F5IG9mIG9wdGlvbmFsbHkgbG9hZGluZ1xuICAvLyBhZGRpdGlvbmFsIHBheWxvYWRzIHNvIHN0YXJ0dXAvZG93bmxvYWQgdGltZSBpcyBub3QgYmxvYXRlZCAoc2VlICMzNTMwKS5cbn1cblxuLy8gcGFkIGhleCBvdXRwdXQgdG8gcmVxdWVzdGVkIGJpdCB3aWR0aFxuZnVuY3Rpb24gcGFkKG46IG51bWJlciwgYml0czogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IG4udG9TdHJpbmcoMTYpO1xuICBjb25zdCBzMiA9IHMubGVuZ3RoIDwgMiA/ICcwJyArIHMgOiBzO1xuICBzd2l0Y2ggKGJpdHMpIHtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gc1swXTtcbiAgICBjYXNlIDg6XG4gICAgICByZXR1cm4gczI7XG4gICAgY2FzZSAxMjpcbiAgICAgIHJldHVybiAoczIgKyBzMikuc2xpY2UoMCwgMyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzMiArIHMyO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIGdpdmVuIGNvbG9yIHRvIHJnYjouLi8uLi8uLiBzdHJpbmcgb2YgYGJpdHNgIGRlcHRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9SZ2JTdHJpbmcoY29sb3I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYml0czogbnVtYmVyID0gMTYpOiBzdHJpbmcge1xuICBjb25zdCBbciwgZywgYl0gPSBjb2xvcjtcbiAgcmV0dXJuIGByZ2I6JHtwYWQociwgYml0cyl9LyR7cGFkKGcsIGJpdHMpfS8ke3BhZChiLCBiaXRzKX1gO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuLyoqXG4gKiBJbnRlcm5hbCBzdGF0ZXMgb2YgRXNjYXBlU2VxdWVuY2VQYXJzZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIFBhcnNlclN0YXRlIHtcbiAgR1JPVU5EID0gMCxcbiAgRVNDQVBFID0gMSxcbiAgRVNDQVBFX0lOVEVSTUVESUFURSA9IDIsXG4gIENTSV9FTlRSWSA9IDMsXG4gIENTSV9QQVJBTSA9IDQsXG4gIENTSV9JTlRFUk1FRElBVEUgPSA1LFxuICBDU0lfSUdOT1JFID0gNixcbiAgU09TX1BNX0FQQ19TVFJJTkcgPSA3LFxuICBPU0NfU1RSSU5HID0gOCxcbiAgRENTX0VOVFJZID0gOSxcbiAgRENTX1BBUkFNID0gMTAsXG4gIERDU19JR05PUkUgPSAxMSxcbiAgRENTX0lOVEVSTUVESUFURSA9IDEyLFxuICBEQ1NfUEFTU1RIUk9VR0ggPSAxM1xufVxuXG4vKipcbiAqIEludGVybmFsIGFjdGlvbnMgb2YgRXNjYXBlU2VxdWVuY2VQYXJzZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIFBhcnNlckFjdGlvbiB7XG4gIElHTk9SRSA9IDAsXG4gIEVSUk9SID0gMSxcbiAgUFJJTlQgPSAyLFxuICBFWEVDVVRFID0gMyxcbiAgT1NDX1NUQVJUID0gNCxcbiAgT1NDX1BVVCA9IDUsXG4gIE9TQ19FTkQgPSA2LFxuICBDU0lfRElTUEFUQ0ggPSA3LFxuICBQQVJBTSA9IDgsXG4gIENPTExFQ1QgPSA5LFxuICBFU0NfRElTUEFUQ0ggPSAxMCxcbiAgQ0xFQVIgPSAxMSxcbiAgRENTX0hPT0sgPSAxMixcbiAgRENTX1BVVCA9IDEzLFxuICBEQ1NfVU5IT09LID0gMTRcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBzdGF0ZXMgb2YgT3NjUGFyc2VyLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBPc2NTdGF0ZSB7XG4gIFNUQVJUID0gMCxcbiAgSUQgPSAxLFxuICBQQVlMT0FEID0gMixcbiAgQUJPUlQgPSAzXG59XG5cbi8vIHBheWxvYWQgbGltaXQgZm9yIE9TQyBhbmQgRENTXG5leHBvcnQgY29uc3QgUEFZTE9BRF9MSU1JVCA9IDEwMDAwMDAwO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgSURjc0hhbmRsZXIsIElQYXJhbXMsIElIYW5kbGVyQ29sbGVjdGlvbiwgSURjc1BhcnNlciwgRGNzRmFsbGJhY2tIYW5kbGVyVHlwZSwgSVN1YlBhcnNlclN0YWNrU3RhdGUgfSBmcm9tICdjb21tb24vcGFyc2VyL1R5cGVzJztcbmltcG9ydCB7IHV0ZjMyVG9TdHJpbmcgfSBmcm9tICdjb21tb24vaW5wdXQvVGV4dERlY29kZXInO1xuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnY29tbW9uL3BhcnNlci9QYXJhbXMnO1xuaW1wb3J0IHsgUEFZTE9BRF9MSU1JVCB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvQ29uc3RhbnRzJztcblxuY29uc3QgRU1QVFlfSEFORExFUlM6IElEY3NIYW5kbGVyW10gPSBbXTtcblxuZXhwb3J0IGNsYXNzIERjc1BhcnNlciBpbXBsZW1lbnRzIElEY3NQYXJzZXIge1xuICBwcml2YXRlIF9oYW5kbGVyczogSUhhbmRsZXJDb2xsZWN0aW9uPElEY3NIYW5kbGVyPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHByaXZhdGUgX2FjdGl2ZTogSURjc0hhbmRsZXJbXSA9IEVNUFRZX0hBTkRMRVJTO1xuICBwcml2YXRlIF9pZGVudDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfaGFuZGxlckZiOiBEY3NGYWxsYmFja0hhbmRsZXJUeXBlID0gKCkgPT4geyB9O1xuICBwcml2YXRlIF9zdGFjazogSVN1YlBhcnNlclN0YWNrU3RhdGUgPSB7XG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICBsb29wUG9zaXRpb246IDAsXG4gICAgZmFsbFRocm91Z2g6IGZhbHNlXG4gIH07XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2hhbmRsZXJGYiA9ICgpID0+IHsgfTtcbiAgICB0aGlzLl9hY3RpdmUgPSBFTVBUWV9IQU5ETEVSUztcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckhhbmRsZXIoaWRlbnQ6IG51bWJlciwgaGFuZGxlcjogSURjc0hhbmRsZXIpOiBJRGlzcG9zYWJsZSB7XG4gICAgaWYgKHRoaXMuX2hhbmRsZXJzW2lkZW50XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9oYW5kbGVyc1tpZGVudF0gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgaGFuZGxlckxpc3QgPSB0aGlzLl9oYW5kbGVyc1tpZGVudF07XG4gICAgaGFuZGxlckxpc3QucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5kZXggPSBoYW5kbGVyTGlzdC5pbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaGFuZGxlckluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGhhbmRsZXJMaXN0LnNwbGljZShoYW5kbGVySW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckhhbmRsZXIoaWRlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9oYW5kbGVyc1tpZGVudF0pIGRlbGV0ZSB0aGlzLl9oYW5kbGVyc1tpZGVudF07XG4gIH1cblxuICBwdWJsaWMgc2V0SGFuZGxlckZhbGxiYWNrKGhhbmRsZXI6IERjc0ZhbGxiYWNrSGFuZGxlclR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl9oYW5kbGVyRmIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIC8vIGZvcmNlIGNsZWFudXAgbGVmdG92ZXIgaGFuZGxlcnNcbiAgICBpZiAodGhpcy5fYWN0aXZlLmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaiA9IHRoaXMuX3N0YWNrLnBhdXNlZCA/IHRoaXMuX3N0YWNrLmxvb3BQb3NpdGlvbiAtIDEgOiB0aGlzLl9hY3RpdmUubGVuZ3RoIC0gMTsgaiA+PSAwOyAtLWopIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlW2pdLnVuaG9vayhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3N0YWNrLnBhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGl2ZSA9IEVNUFRZX0hBTkRMRVJTO1xuICAgIHRoaXMuX2lkZW50ID0gMDtcbiAgfVxuXG4gIHB1YmxpYyBob29rKGlkZW50OiBudW1iZXIsIHBhcmFtczogSVBhcmFtcyk6IHZvaWQge1xuICAgIC8vIGFsd2F5cyByZXNldCBsZWZ0b3ZlciBoYW5kbGVyc1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLl9pZGVudCA9IGlkZW50O1xuICAgIHRoaXMuX2FjdGl2ZSA9IHRoaXMuX2hhbmRsZXJzW2lkZW50XSB8fCBFTVBUWV9IQU5ETEVSUztcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2hhbmRsZXJGYih0aGlzLl9pZGVudCwgJ0hPT0snLCBwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBqID0gdGhpcy5fYWN0aXZlLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVtqXS5ob29rKHBhcmFtcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHB1dChkYXRhOiBVaW50MzJBcnJheSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2hhbmRsZXJGYih0aGlzLl9pZGVudCwgJ1BVVCcsIHV0ZjMyVG9TdHJpbmcoZGF0YSwgc3RhcnQsIGVuZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBqID0gdGhpcy5fYWN0aXZlLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVtqXS5wdXQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVuaG9vayhzdWNjZXNzOiBib29sZWFuLCBwcm9taXNlUmVzdWx0OiBib29sZWFuID0gdHJ1ZSk6IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2hhbmRsZXJGYih0aGlzLl9pZGVudCwgJ1VOSE9PSycsIHN1Y2Nlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaGFuZGxlclJlc3VsdDogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gPSBmYWxzZTtcbiAgICAgIGxldCBqID0gdGhpcy5fYWN0aXZlLmxlbmd0aCAtIDE7XG4gICAgICBsZXQgZmFsbFRocm91Z2ggPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLl9zdGFjay5wYXVzZWQpIHtcbiAgICAgICAgaiA9IHRoaXMuX3N0YWNrLmxvb3BQb3NpdGlvbiAtIDE7XG4gICAgICAgIGhhbmRsZXJSZXN1bHQgPSBwcm9taXNlUmVzdWx0O1xuICAgICAgICBmYWxsVGhyb3VnaCA9IHRoaXMuX3N0YWNrLmZhbGxUaHJvdWdoO1xuICAgICAgICB0aGlzLl9zdGFjay5wYXVzZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghZmFsbFRocm91Z2ggJiYgaGFuZGxlclJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHRoaXMuX2FjdGl2ZVtqXS51bmhvb2soc3VjY2Vzcyk7XG4gICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlclJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YWNrLnBhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9zdGFjay5sb29wUG9zaXRpb24gPSBqO1xuICAgICAgICAgICAgdGhpcy5fc3RhY2suZmFsbFRocm91Z2ggPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBqLS07XG4gICAgICB9XG4gICAgICAvLyBjbGVhbnVwIGxlZnQgb3ZlciBoYW5kbGVycyAoZmFsbFRocm91Z2ggZm9yIGFzeW5jKVxuICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIGhhbmRsZXJSZXN1bHQgPSB0aGlzLl9hY3RpdmVbal0udW5ob29rKGZhbHNlKTtcbiAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgdGhpcy5fc3RhY2sucGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zdGFjay5sb29wUG9zaXRpb24gPSBqO1xuICAgICAgICAgIHRoaXMuX3N0YWNrLmZhbGxUaHJvdWdoID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9hY3RpdmUgPSBFTVBUWV9IQU5ETEVSUztcbiAgICB0aGlzLl9pZGVudCA9IDA7XG4gIH1cbn1cblxuLy8gcHJlZGVmaW5lIGVtcHR5IHBhcmFtcyBhcyBbMF0gKFpETSlcbmNvbnN0IEVNUFRZX1BBUkFNUyA9IG5ldyBQYXJhbXMoKTtcbkVNUFRZX1BBUkFNUy5hZGRQYXJhbSgwKTtcblxuLyoqXG4gKiBDb252ZW5pZW50IGNsYXNzIHRvIGNyZWF0ZSBhIERDUyBoYW5kbGVyIGZyb20gYSBzaW5nbGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBOb3RlOiBUaGUgcGF5bG9hZCBpcyBjdXJyZW50bHkgbGltaXRlZCB0byA1MCBNQiAoaGFyZGNvZGVkKS5cbiAqL1xuZXhwb3J0IGNsYXNzIERjc0hhbmRsZXIgaW1wbGVtZW50cyBJRGNzSGFuZGxlciB7XG4gIHByaXZhdGUgX2RhdGEgPSAnJztcbiAgcHJpdmF0ZSBfcGFyYW1zOiBJUGFyYW1zID0gRU1QVFlfUEFSQU1TO1xuICBwcml2YXRlIF9oaXRMaW1pdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2hhbmRsZXI6IChkYXRhOiBzdHJpbmcsIHBhcmFtczogSVBhcmFtcykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pIHsgfVxuXG4gIHB1YmxpYyBob29rKHBhcmFtczogSVBhcmFtcyk6IHZvaWQge1xuICAgIC8vIHNpbmNlIHdlIG5lZWQgdG8gcHJlc2VydmUgcGFyYW1zIHVudGlsIGB1bmhvb2tgLCB3ZSBoYXZlIHRvIGNsb25lIGl0XG4gICAgLy8gKG9ubHkgYm9ycm93ZWQgZnJvbSBwYXJzZXIgYW5kIHNwYW5zIG11bHRpcGxlIHBhcnNlciBzdGF0ZXMpXG4gICAgLy8gcGVyZiBvcHRpbWl6YXRpb246XG4gICAgLy8gY2xvbmUgb25seSwgaWYgd2UgaGF2ZSBub24gZW1wdHkgcGFyYW1zLCBvdGhlcndpc2Ugc3RpY2sgd2l0aCBkZWZhdWx0XG4gICAgdGhpcy5fcGFyYW1zID0gKHBhcmFtcy5sZW5ndGggPiAxIHx8IHBhcmFtcy5wYXJhbXNbMF0pID8gcGFyYW1zLmNsb25lKCkgOiBFTVBUWV9QQVJBTVM7XG4gICAgdGhpcy5fZGF0YSA9ICcnO1xuICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcHV0KGRhdGE6IFVpbnQzMkFycmF5LCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9oaXRMaW1pdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhICs9IHV0ZjMyVG9TdHJpbmcoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgaWYgKHRoaXMuX2RhdGEubGVuZ3RoID4gUEFZTE9BRF9MSU1JVCkge1xuICAgICAgdGhpcy5fZGF0YSA9ICcnO1xuICAgICAgdGhpcy5faGl0TGltaXQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1bmhvb2soc3VjY2VzczogYm9vbGVhbik6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgcmV0OiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9oaXRMaW1pdCkge1xuICAgICAgcmV0ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChzdWNjZXNzKSB7XG4gICAgICByZXQgPSB0aGlzLl9oYW5kbGVyKHRoaXMuX2RhdGEsIHRoaXMuX3BhcmFtcyk7XG4gICAgICBpZiAocmV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAvLyBuZWVkIHRvIGhvbGQgZGF0YSBhbmQgcGFyYW1zIHVudGlsIGByZXRgIGdvdCByZXNvbHZlZFxuICAgICAgICAvLyBkb250IGNhcmUgZm9yIGVycm9ycywgZGF0YSB3aWxsIGJlIGZyZWVkIGFueXdheSBvbiBuZXh0IHN0YXJ0XG4gICAgICAgIHJldHVybiByZXQudGhlbihyZXMgPT4ge1xuICAgICAgICAgIHRoaXMuX3BhcmFtcyA9IEVNUFRZX1BBUkFNUztcbiAgICAgICAgICB0aGlzLl9kYXRhID0gJyc7XG4gICAgICAgICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcGFyYW1zID0gRU1QVFlfUEFSQU1TO1xuICAgIHRoaXMuX2RhdGEgPSAnJztcbiAgICB0aGlzLl9oaXRMaW1pdCA9IGZhbHNlO1xuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElQYXJzaW5nU3RhdGUsIElEY3NIYW5kbGVyLCBJRXNjYXBlU2VxdWVuY2VQYXJzZXIsIElQYXJhbXMsIElPc2NIYW5kbGVyLCBJSGFuZGxlckNvbGxlY3Rpb24sIENzaUhhbmRsZXJUeXBlLCBPc2NGYWxsYmFja0hhbmRsZXJUeXBlLCBJT3NjUGFyc2VyLCBFc2NIYW5kbGVyVHlwZSwgSURjc1BhcnNlciwgRGNzRmFsbGJhY2tIYW5kbGVyVHlwZSwgSUZ1bmN0aW9uSWRlbnRpZmllciwgRXhlY3V0ZUZhbGxiYWNrSGFuZGxlclR5cGUsIENzaUZhbGxiYWNrSGFuZGxlclR5cGUsIEVzY0ZhbGxiYWNrSGFuZGxlclR5cGUsIFByaW50SGFuZGxlclR5cGUsIFByaW50RmFsbGJhY2tIYW5kbGVyVHlwZSwgRXhlY3V0ZUhhbmRsZXJUeXBlLCBJUGFyc2VyU3RhY2tTdGF0ZSwgUGFyc2VyU3RhY2tUeXBlLCBSZXN1bWFibGVIYW5kbGVyc1R5cGUgfSBmcm9tICdjb21tb24vcGFyc2VyL1R5cGVzJztcbmltcG9ydCB7IFBhcnNlclN0YXRlLCBQYXJzZXJBY3Rpb24gfSBmcm9tICdjb21tb24vcGFyc2VyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IFBhcmFtcyB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvUGFyYW1zJztcbmltcG9ydCB7IE9zY1BhcnNlciB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvT3NjUGFyc2VyJztcbmltcG9ydCB7IERjc1BhcnNlciB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvRGNzUGFyc2VyJztcblxuLyoqXG4gKiBUYWJsZSB2YWx1ZXMgYXJlIGdlbmVyYXRlZCBsaWtlIHRoaXM6XG4gKiAgICBpbmRleDogIGN1cnJlbnRTdGF0ZSA8PCBUYWJsZVZhbHVlLklOREVYX1NUQVRFX1NISUZUIHwgY2hhckNvZGVcbiAqICAgIHZhbHVlOiAgYWN0aW9uIDw8IFRhYmxlVmFsdWUuVFJBTlNJVElPTl9BQ1RJT05fU0hJRlQgfCBuZXh0U3RhdGVcbiAqL1xuY29uc3QgZW51bSBUYWJsZUFjY2VzcyB7XG4gIFRSQU5TSVRJT05fQUNUSU9OX1NISUZUID0gNCxcbiAgVFJBTlNJVElPTl9TVEFURV9NQVNLID0gMTUsXG4gIElOREVYX1NUQVRFX1NISUZUID0gOFxufVxuXG4vKipcbiAqIFRyYW5zaXRpb24gdGFibGUgZm9yIEVzY2FwZVNlcXVlbmNlUGFyc2VyLlxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvblRhYmxlIHtcbiAgcHVibGljIHRhYmxlOiBVaW50OEFycmF5O1xuXG4gIGNvbnN0cnVjdG9yKGxlbmd0aDogbnVtYmVyKSB7XG4gICAgdGhpcy50YWJsZSA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRlZmF1bHQgdHJhbnNpdGlvbi5cbiAgICogQHBhcmFtIGFjdGlvbiBkZWZhdWx0IGFjdGlvblxuICAgKiBAcGFyYW0gbmV4dCBkZWZhdWx0IG5leHQgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXREZWZhdWx0KGFjdGlvbjogUGFyc2VyQWN0aW9uLCBuZXh0OiBQYXJzZXJTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMudGFibGUuZmlsbChhY3Rpb24gPDwgVGFibGVBY2Nlc3MuVFJBTlNJVElPTl9BQ1RJT05fU0hJRlQgfCBuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB0cmFuc2l0aW9uIHRvIHRoZSB0cmFuc2l0aW9uIHRhYmxlLlxuICAgKiBAcGFyYW0gY29kZSBpbnB1dCBjaGFyYWN0ZXIgY29kZVxuICAgKiBAcGFyYW0gc3RhdGUgY3VycmVudCBwYXJzZXIgc3RhdGVcbiAgICogQHBhcmFtIGFjdGlvbiBwYXJzZXIgYWN0aW9uIHRvIGJlIGRvbmVcbiAgICogQHBhcmFtIG5leHQgbmV4dCBwYXJzZXIgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBhZGQoY29kZTogbnVtYmVyLCBzdGF0ZTogUGFyc2VyU3RhdGUsIGFjdGlvbjogUGFyc2VyQWN0aW9uLCBuZXh0OiBQYXJzZXJTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMudGFibGVbc3RhdGUgPDwgVGFibGVBY2Nlc3MuSU5ERVhfU1RBVEVfU0hJRlQgfCBjb2RlXSA9IGFjdGlvbiA8PCBUYWJsZUFjY2Vzcy5UUkFOU0lUSU9OX0FDVElPTl9TSElGVCB8IG5leHQ7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYW5zaXRpb25zIGZvciBtdWx0aXBsZSBpbnB1dCBjaGFyYWN0ZXIgY29kZXMuXG4gICAqIEBwYXJhbSBjb2RlcyBpbnB1dCBjaGFyYWN0ZXIgY29kZSBhcnJheVxuICAgKiBAcGFyYW0gc3RhdGUgY3VycmVudCBwYXJzZXIgc3RhdGVcbiAgICogQHBhcmFtIGFjdGlvbiBwYXJzZXIgYWN0aW9uIHRvIGJlIGRvbmVcbiAgICogQHBhcmFtIG5leHQgbmV4dCBwYXJzZXIgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBhZGRNYW55KGNvZGVzOiBudW1iZXJbXSwgc3RhdGU6IFBhcnNlclN0YXRlLCBhY3Rpb246IFBhcnNlckFjdGlvbiwgbmV4dDogUGFyc2VyU3RhdGUpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnRhYmxlW3N0YXRlIDw8IFRhYmxlQWNjZXNzLklOREVYX1NUQVRFX1NISUZUIHwgY29kZXNbaV1dID0gYWN0aW9uIDw8IFRhYmxlQWNjZXNzLlRSQU5TSVRJT05fQUNUSU9OX1NISUZUIHwgbmV4dDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBQc2V1ZG8tY2hhcmFjdGVyIHBsYWNlaG9sZGVyIGZvciBwcmludGFibGUgbm9uLWFzY2lpIGNoYXJhY3RlcnMgKHVuaWNvZGUpLlxuY29uc3QgTk9OX0FTQ0lJX1BSSU5UQUJMRSA9IDB4QTA7XG5cblxuLyoqXG4gKiBWVDUwMCBjb21wYXRpYmxlIHRyYW5zaXRpb24gdGFibGUuXG4gKiBUYWtlbiBmcm9tIGh0dHBzOi8vdnQxMDAubmV0L2VtdS9kZWNfYW5zaV9wYXJzZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBWVDUwMF9UUkFOU0lUSU9OX1RBQkxFID0gKGZ1bmN0aW9uICgpOiBUcmFuc2l0aW9uVGFibGUge1xuICBjb25zdCB0YWJsZTogVHJhbnNpdGlvblRhYmxlID0gbmV3IFRyYW5zaXRpb25UYWJsZSg0MDk1KTtcblxuICAvLyByYW5nZSBtYWNybyBmb3IgYnl0ZVxuICBjb25zdCBCWVRFX1ZBTFVFUyA9IDI1NjtcbiAgY29uc3QgYmx1ZXByaW50ID0gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkoQllURV9WQUxVRVMpKS5tYXAoKHVudXNlZDogYW55LCBpOiBudW1iZXIpID0+IGkpO1xuICBjb25zdCByID0gKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogbnVtYmVyW10gPT4gYmx1ZXByaW50LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gIC8vIERlZmF1bHQgZGVmaW5pdGlvbnMuXG4gIGNvbnN0IFBSSU5UQUJMRVMgPSByKDB4MjAsIDB4N2YpOyAvLyAweDIwIChTUCkgaW5jbHVkZWQsIDB4N0YgKERFTCkgZXhjbHVkZWRcbiAgY29uc3QgRVhFQ1VUQUJMRVMgPSByKDB4MDAsIDB4MTgpO1xuICBFWEVDVVRBQkxFUy5wdXNoKDB4MTkpO1xuICBFWEVDVVRBQkxFUy5wdXNoLmFwcGx5KEVYRUNVVEFCTEVTLCByKDB4MWMsIDB4MjApKTtcblxuICBjb25zdCBzdGF0ZXM6IG51bWJlcltdID0gcihQYXJzZXJTdGF0ZS5HUk9VTkQsIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCArIDEpO1xuICBsZXQgc3RhdGU6IGFueTtcblxuICAvLyBzZXQgZGVmYXVsdCB0cmFuc2l0aW9uXG4gIHRhYmxlLnNldERlZmF1bHQoUGFyc2VyQWN0aW9uLkVSUk9SLCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICAvLyBwcmludGFibGVzXG4gIHRhYmxlLmFkZE1hbnkoUFJJTlRBQkxFUywgUGFyc2VyU3RhdGUuR1JPVU5ELCBQYXJzZXJBY3Rpb24uUFJJTlQsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIC8vIGdsb2JhbCBhbnl3aGVyZSBydWxlc1xuICBmb3IgKHN0YXRlIGluIHN0YXRlcykge1xuICAgIHRhYmxlLmFkZE1hbnkoWzB4MTgsIDB4MWEsIDB4OTksIDB4OWFdLCBzdGF0ZSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gICAgdGFibGUuYWRkTWFueShyKDB4ODAsIDB4OTApLCBzdGF0ZSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gICAgdGFibGUuYWRkTWFueShyKDB4OTAsIDB4OTgpLCBzdGF0ZSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gICAgdGFibGUuYWRkKDB4OWMsIHN0YXRlLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5HUk9VTkQpOyAvLyBTVCBhcyB0ZXJtaW5hdG9yXG4gICAgdGFibGUuYWRkKDB4MWIsIHN0YXRlLCBQYXJzZXJBY3Rpb24uQ0xFQVIsIFBhcnNlclN0YXRlLkVTQ0FQRSk7ICAvLyBFU0NcbiAgICB0YWJsZS5hZGQoMHg5ZCwgc3RhdGUsIFBhcnNlckFjdGlvbi5PU0NfU1RBUlQsIFBhcnNlclN0YXRlLk9TQ19TVFJJTkcpOyAgLy8gT1NDXG4gICAgdGFibGUuYWRkTWFueShbMHg5OCwgMHg5ZSwgMHg5Zl0sIHN0YXRlLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORyk7XG4gICAgdGFibGUuYWRkKDB4OWIsIHN0YXRlLCBQYXJzZXJBY3Rpb24uQ0xFQVIsIFBhcnNlclN0YXRlLkNTSV9FTlRSWSk7ICAvLyBDU0lcbiAgICB0YWJsZS5hZGQoMHg5MCwgc3RhdGUsIFBhcnNlckFjdGlvbi5DTEVBUiwgUGFyc2VyU3RhdGUuRENTX0VOVFJZKTsgIC8vIERDU1xuICB9XG4gIC8vIHJ1bGVzIGZvciBleGVjdXRhYmxlcyBhbmQgN2ZcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuR1JPVU5ELCBQYXJzZXJBY3Rpb24uRVhFQ1VURSwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuRVNDQVBFLCBQYXJzZXJBY3Rpb24uRVhFQ1VURSwgUGFyc2VyU3RhdGUuRVNDQVBFKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRVNDQVBFKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuT1NDX1NUUklORywgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuT1NDX1NUUklORyk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkNTSV9FTlRSWSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkNTSV9FTlRSWSk7XG4gIHRhYmxlLmFkZCgweDdmLCBQYXJzZXJTdGF0ZS5DU0lfRU5UUlksIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkNTSV9FTlRSWSk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkNTSV9QQVJBTSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkNTSV9QQVJBTSk7XG4gIHRhYmxlLmFkZCgweDdmLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0sIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkNTSV9QQVJBTSk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkNTSV9JR05PUkUsIFBhcnNlckFjdGlvbi5FWEVDVVRFLCBQYXJzZXJTdGF0ZS5DU0lfSUdOT1JFKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkNTSV9JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGQoMHg3ZiwgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5FWEVDVVRFLCBQYXJzZXJTdGF0ZS5FU0NBUEVfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUpO1xuICAvLyBvc2NcbiAgdGFibGUuYWRkKDB4NWQsIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLk9TQ19TVEFSVCwgUGFyc2VyU3RhdGUuT1NDX1NUUklORyk7XG4gIHRhYmxlLmFkZE1hbnkoUFJJTlRBQkxFUywgUGFyc2VyU3RhdGUuT1NDX1NUUklORywgUGFyc2VyQWN0aW9uLk9TQ19QVVQsIFBhcnNlclN0YXRlLk9TQ19TVFJJTkcpO1xuICB0YWJsZS5hZGQoMHg3ZiwgUGFyc2VyU3RhdGUuT1NDX1NUUklORywgUGFyc2VyQWN0aW9uLk9TQ19QVVQsIFBhcnNlclN0YXRlLk9TQ19TVFJJTkcpO1xuICB0YWJsZS5hZGRNYW55KFsweDljLCAweDFiLCAweDE4LCAweDFhLCAweDA3XSwgUGFyc2VyU3RhdGUuT1NDX1NUUklORywgUGFyc2VyQWN0aW9uLk9TQ19FTkQsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZE1hbnkocigweDFjLCAweDIwKSwgUGFyc2VyU3RhdGUuT1NDX1NUUklORywgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuT1NDX1NUUklORyk7XG4gIC8vIHNvcy9wbS9hcGMgZG9lcyBub3RoaW5nXG4gIHRhYmxlLmFkZE1hbnkoWzB4NTgsIDB4NWUsIDB4NWZdLCBQYXJzZXJTdGF0ZS5FU0NBUEUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLlNPU19QTV9BUENfU1RSSU5HKTtcbiAgdGFibGUuYWRkTWFueShQUklOVEFCTEVTLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORywgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuU09TX1BNX0FQQ19TVFJJTkcpO1xuICB0YWJsZS5hZGRNYW55KEVYRUNVVEFCTEVTLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORywgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuU09TX1BNX0FQQ19TVFJJTkcpO1xuICB0YWJsZS5hZGQoMHg5YywgUGFyc2VyU3RhdGUuU09TX1BNX0FQQ19TVFJJTkcsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZCgweDdmLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORywgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuU09TX1BNX0FQQ19TVFJJTkcpO1xuICAvLyBjc2kgZW50cmllc1xuICB0YWJsZS5hZGQoMHg1YiwgUGFyc2VyU3RhdGUuRVNDQVBFLCBQYXJzZXJBY3Rpb24uQ0xFQVIsIFBhcnNlclN0YXRlLkNTSV9FTlRSWSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDQwLCAweDdmKSwgUGFyc2VyU3RhdGUuQ1NJX0VOVFJZLCBQYXJzZXJBY3Rpb24uQ1NJX0RJU1BBVENILCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgzMCwgMHgzYyksIFBhcnNlclN0YXRlLkNTSV9FTlRSWSwgUGFyc2VyQWN0aW9uLlBBUkFNLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0pO1xuICB0YWJsZS5hZGRNYW55KFsweDNjLCAweDNkLCAweDNlLCAweDNmXSwgUGFyc2VyU3RhdGUuQ1NJX0VOVFJZLCBQYXJzZXJBY3Rpb24uQ09MTEVDVCwgUGFyc2VyU3RhdGUuQ1NJX1BBUkFNKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MzAsIDB4M2MpLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0sIFBhcnNlckFjdGlvbi5QQVJBTSwgUGFyc2VyU3RhdGUuQ1NJX1BBUkFNKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NDAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0sIFBhcnNlckFjdGlvbi5DU0lfRElTUEFUQ0gsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZE1hbnkoWzB4M2MsIDB4M2QsIDB4M2UsIDB4M2ZdLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0sIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkNTSV9JR05PUkUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHg0MCksIFBhcnNlclN0YXRlLkNTSV9JR05PUkUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkNTSV9JR05PUkUpO1xuICB0YWJsZS5hZGQoMHg3ZiwgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDQwLCAweDdmKSwgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MjAsIDB4MzApLCBQYXJzZXJTdGF0ZS5DU0lfRU5UUlksIFBhcnNlckFjdGlvbi5DT0xMRUNULCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MjAsIDB4MzApLCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uQ09MTEVDVCwgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDMwLCAweDQwKSwgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDQwLCAweDdmKSwgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLkNTSV9ESVNQQVRDSCwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MjAsIDB4MzApLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0sIFBhcnNlckFjdGlvbi5DT0xMRUNULCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFKTtcbiAgLy8gZXNjX2ludGVybWVkaWF0ZVxuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLkNPTExFQ1QsIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5DT0xMRUNULCBQYXJzZXJTdGF0ZS5FU0NBUEVfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MzAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5FU0NBUEVfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uRVNDX0RJU1BBVENILCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgzMCwgMHg1MCksIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLkVTQ19ESVNQQVRDSCwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NTEsIDB4NTgpLCBQYXJzZXJTdGF0ZS5FU0NBUEUsIFBhcnNlckFjdGlvbi5FU0NfRElTUEFUQ0gsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZE1hbnkoWzB4NTksIDB4NWEsIDB4NWNdLCBQYXJzZXJTdGF0ZS5FU0NBUEUsIFBhcnNlckFjdGlvbi5FU0NfRElTUEFUQ0gsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZE1hbnkocigweDYwLCAweDdmKSwgUGFyc2VyU3RhdGUuRVNDQVBFLCBQYXJzZXJBY3Rpb24uRVNDX0RJU1BBVENILCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICAvLyBkY3MgZW50cnlcbiAgdGFibGUuYWRkKDB4NTAsIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLkNMRUFSLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlkpO1xuICB0YWJsZS5hZGRNYW55KEVYRUNVVEFCTEVTLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlksIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19FTlRSWSk7XG4gIHRhYmxlLmFkZCgweDdmLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlksIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19FTlRSWSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDFjLCAweDIwKSwgUGFyc2VyU3RhdGUuRENTX0VOVFJZLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlkpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkRDU19FTlRSWSwgUGFyc2VyQWN0aW9uLkNPTExFQ1QsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgzMCwgMHgzYyksIFBhcnNlclN0YXRlLkRDU19FTlRSWSwgUGFyc2VyQWN0aW9uLlBBUkFNLCBQYXJzZXJTdGF0ZS5EQ1NfUEFSQU0pO1xuICB0YWJsZS5hZGRNYW55KFsweDNjLCAweDNkLCAweDNlLCAweDNmXSwgUGFyc2VyU3RhdGUuRENTX0VOVFJZLCBQYXJzZXJBY3Rpb24uQ09MTEVDVCwgUGFyc2VyU3RhdGUuRENTX1BBUkFNKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDIwLCAweDgwKSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDFjLCAweDIwKSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkRDU19QQVJBTSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX1BBUkFNKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkRDU19QQVJBTSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX1BBUkFNKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MWMsIDB4MjApLCBQYXJzZXJTdGF0ZS5EQ1NfUEFSQU0sIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19QQVJBTSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDMwLCAweDNjKSwgUGFyc2VyU3RhdGUuRENTX1BBUkFNLCBQYXJzZXJBY3Rpb24uUEFSQU0sIFBhcnNlclN0YXRlLkRDU19QQVJBTSk7XG4gIHRhYmxlLmFkZE1hbnkoWzB4M2MsIDB4M2QsIDB4M2UsIDB4M2ZdLCBQYXJzZXJTdGF0ZS5EQ1NfUEFSQU0sIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19JR05PUkUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkRDU19QQVJBTSwgUGFyc2VyQWN0aW9uLkNPTExFQ1QsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KEVYRUNVVEFCTEVTLCBQYXJzZXJTdGF0ZS5EQ1NfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgxYywgMHgyMCksIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5DT0xMRUNULCBQYXJzZXJTdGF0ZS5EQ1NfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MzAsIDB4NDApLCBQYXJzZXJTdGF0ZS5EQ1NfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfSUdOT1JFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NDAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5EQ1NfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uRENTX0hPT0ssIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCk7XG4gIHRhYmxlLmFkZE1hbnkocigweDQwLCAweDdmKSwgUGFyc2VyU3RhdGUuRENTX1BBUkFNLCBQYXJzZXJBY3Rpb24uRENTX0hPT0ssIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCk7XG4gIHRhYmxlLmFkZE1hbnkocigweDQwLCAweDdmKSwgUGFyc2VyU3RhdGUuRENTX0VOVFJZLCBQYXJzZXJBY3Rpb24uRENTX0hPT0ssIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCwgUGFyc2VyQWN0aW9uLkRDU19QVVQsIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCk7XG4gIHRhYmxlLmFkZE1hbnkoUFJJTlRBQkxFUywgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdILCBQYXJzZXJBY3Rpb24uRENTX1BVVCwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdIKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdIKTtcbiAgdGFibGUuYWRkTWFueShbMHgxYiwgMHg5YywgMHgxOCwgMHgxYV0sIFBhcnNlclN0YXRlLkRDU19QQVNTVEhST1VHSCwgUGFyc2VyQWN0aW9uLkRDU19VTkhPT0ssIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIC8vIHNwZWNpYWwgaGFuZGxpbmcgb2YgdW5pY29kZSBjaGFyc1xuICB0YWJsZS5hZGQoTk9OX0FTQ0lJX1BSSU5UQUJMRSwgUGFyc2VyU3RhdGUuR1JPVU5ELCBQYXJzZXJBY3Rpb24uUFJJTlQsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZChOT05fQVNDSUlfUFJJTlRBQkxFLCBQYXJzZXJTdGF0ZS5PU0NfU1RSSU5HLCBQYXJzZXJBY3Rpb24uT1NDX1BVVCwgUGFyc2VyU3RhdGUuT1NDX1NUUklORyk7XG4gIHRhYmxlLmFkZChOT05fQVNDSUlfUFJJTlRBQkxFLCBQYXJzZXJTdGF0ZS5DU0lfSUdOT1JFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5DU0lfSUdOT1JFKTtcbiAgdGFibGUuYWRkKE5PTl9BU0NJSV9QUklOVEFCTEUsIFBhcnNlclN0YXRlLkRDU19JR05PUkUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19JR05PUkUpO1xuICB0YWJsZS5hZGQoTk9OX0FTQ0lJX1BSSU5UQUJMRSwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdILCBQYXJzZXJBY3Rpb24uRENTX1BVVCwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdIKTtcbiAgcmV0dXJuIHRhYmxlO1xufSkoKTtcblxuXG4vKipcbiAqIEVzY2FwZVNlcXVlbmNlUGFyc2VyLlxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBBTlNJL0RFQyBjb21wYXRpYmxlIHBhcnNlciBkZXNjcmliZWQgYnlcbiAqIFBhdWwgV2lsbGlhbXMgKGh0dHBzOi8vdnQxMDAubmV0L2VtdS9kZWNfYW5zaV9wYXJzZXIpLlxuICpcbiAqIFRvIGltcGxlbWVudCBjdXN0b20gQU5TSSBjb21wbGlhbnQgZXNjYXBlIHNlcXVlbmNlcyBpdCBpcyBub3QgbmVlZGVkIHRvXG4gKiBhbHRlciB0aGlzIHBhcnNlciwgaW5zdGVhZCBjb25zaWRlciByZWdpc3RlcmluZyBhIGN1c3RvbSBoYW5kbGVyLlxuICogRm9yIG5vbiBBTlNJIGNvbXBsaWFudCBzZXF1ZW5jZXMgY2hhbmdlIHRoZSB0cmFuc2l0aW9uIHRhYmxlIHdpdGhcbiAqIHRoZSBvcHRpb25hbCBgdHJhbnNpdGlvbnNgIGNvbnN0cnVjdG9yIGFyZ3VtZW50IGFuZFxuICogcmVpbXBsZW1lbnQgdGhlIGBwYXJzZWAgbWV0aG9kLlxuICpcbiAqIFRoaXMgcGFyc2VyIGlzIGN1cnJlbnRseSBoYXJkY29kZWQgdG8gb3BlcmF0ZSBpbiBaRE0gKFplcm8gRGVmYXVsdCBNb2RlKVxuICogYXMgc3VnZ2VzdGVkIGJ5IHRoZSBvcmlnaW5hbCBwYXJzZXIsIHRodXMgZW1wdHkgcGFyYW1ldGVycyBhcmUgc2V0IHRvIDAuXG4gKiBUaGlzIHRoaXMgaXMgbm90IGluIGxpbmUgd2l0aCB0aGUgbGF0ZXN0IEVDTUEtNDggc3BlY2lmaWNhdGlvblxuICogKFpETSB3YXMgcGFydCBvZiB0aGUgZWFybHkgc3BlY3MgYW5kIGdvdCBjb21wbGV0ZWx5IHJlbW92ZWQgbGF0ZXIgb24pLlxuICpcbiAqIE90aGVyIHRoYW4gdGhlIG9yaWdpbmFsIHBhcnNlciBmcm9tIHZ0MTAwLm5ldCB0aGlzIHBhcnNlciBzdXBwb3J0c1xuICogc3ViIHBhcmFtZXRlcnMgaW4gZGlnaXRhbCBwYXJhbWV0ZXJzIHNlcGFyYXRlZCBieSBjb2xvbnMuIEVtcHR5IHN1YiBwYXJhbWV0ZXJzXG4gKiBhcmUgc2V0IHRvIC0xIChubyBaRE0gZm9yIHN1YiBwYXJhbWV0ZXJzKS5cbiAqXG4gKiBBYm91dCBwcmVmaXggYW5kIGludGVybWVkaWF0ZSBieXRlczpcbiAqIFRoaXMgcGFyc2VyIGZvbGxvd3MgdGhlIGFzc3VtcHRpb25zIG9mIHRoZSB2dDEwMC5uZXQgcGFyc2VyIHdpdGggdGhlc2UgcmVzdHJpY3Rpb25zOlxuICogLSBvbmx5IG9uZSBwcmVmaXggYnl0ZSBpcyBhbGxvd2VkIGFzIGZpcnN0IHBhcmFtZXRlciBieXRlLCBieXRlIHJhbmdlIDB4M2MgLi4gMHgzZlxuICogLSBtYXguIHR3byBpbnRlcm1lZGlhdGVzIGFyZSByZXNwZWN0ZWQsIGJ5dGUgcmFuZ2UgMHgyMCAuLiAweDJmXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgaW4gbGluZSB3aXRoIEVDTUEtNDggd2hpY2ggZG9lcyBub3QgbGltaXQgZWl0aGVyIG9mIHRob3NlLlxuICogRnVydGhlcm1vcmUgRUNNQS00OCBhbGxvd3MgdGhlIHByZWZpeCBieXRlIHJhbmdlIGF0IGFueSBwYXJhbSBieXRlIHBvc2l0aW9uLiBDdXJyZW50bHlcbiAqIHRoZXJlIGFyZSBubyBrbm93biBzZXF1ZW5jZXMgdGhhdCBmb2xsb3cgdGhlIGJyb2FkZXIgZGVmaW5pdGlvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBUT0RPOiBpbXBsZW1lbnQgZXJyb3IgcmVjb3ZlcnkgaG9vayB2aWEgZXJyb3IgaGFuZGxlciByZXR1cm4gdmFsdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBFc2NhcGVTZXF1ZW5jZVBhcnNlciBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRXNjYXBlU2VxdWVuY2VQYXJzZXIge1xuICBwdWJsaWMgaW5pdGlhbFN0YXRlOiBudW1iZXI7XG4gIHB1YmxpYyBjdXJyZW50U3RhdGU6IG51bWJlcjtcbiAgcHVibGljIHByZWNlZGluZ0pvaW5TdGF0ZTogbnVtYmVyOyAvLyBVbmljb2RlSm9pblByb3BlcnRpZXNcblxuICAvLyBidWZmZXJzIG92ZXIgc2V2ZXJhbCBwYXJzZSBjYWxsc1xuICBwcm90ZWN0ZWQgX3BhcmFtczogUGFyYW1zO1xuICBwcm90ZWN0ZWQgX2NvbGxlY3Q6IG51bWJlcjtcblxuICAvLyBoYW5kbGVyIGxvb2t1cCBjb250YWluZXJzXG4gIHByb3RlY3RlZCBfcHJpbnRIYW5kbGVyOiBQcmludEhhbmRsZXJUeXBlO1xuICBwcm90ZWN0ZWQgX2V4ZWN1dGVIYW5kbGVyczogeyBbZmxhZzogbnVtYmVyXTogRXhlY3V0ZUhhbmRsZXJUeXBlIH07XG4gIHByb3RlY3RlZCBfY3NpSGFuZGxlcnM6IElIYW5kbGVyQ29sbGVjdGlvbjxDc2lIYW5kbGVyVHlwZT47XG4gIHByb3RlY3RlZCBfZXNjSGFuZGxlcnM6IElIYW5kbGVyQ29sbGVjdGlvbjxFc2NIYW5kbGVyVHlwZT47XG4gIHByb3RlY3RlZCByZWFkb25seSBfb3NjUGFyc2VyOiBJT3NjUGFyc2VyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Rjc1BhcnNlcjogSURjc1BhcnNlcjtcbiAgcHJvdGVjdGVkIF9lcnJvckhhbmRsZXI6IChzdGF0ZTogSVBhcnNpbmdTdGF0ZSkgPT4gSVBhcnNpbmdTdGF0ZTtcblxuICAvLyBmYWxsYmFjayBoYW5kbGVyc1xuICBwcm90ZWN0ZWQgX3ByaW50SGFuZGxlckZiOiBQcmludEZhbGxiYWNrSGFuZGxlclR5cGU7XG4gIHByb3RlY3RlZCBfZXhlY3V0ZUhhbmRsZXJGYjogRXhlY3V0ZUZhbGxiYWNrSGFuZGxlclR5cGU7XG4gIHByb3RlY3RlZCBfY3NpSGFuZGxlckZiOiBDc2lGYWxsYmFja0hhbmRsZXJUeXBlO1xuICBwcm90ZWN0ZWQgX2VzY0hhbmRsZXJGYjogRXNjRmFsbGJhY2tIYW5kbGVyVHlwZTtcbiAgcHJvdGVjdGVkIF9lcnJvckhhbmRsZXJGYjogKHN0YXRlOiBJUGFyc2luZ1N0YXRlKSA9PiBJUGFyc2luZ1N0YXRlO1xuXG4gIC8vIHBhcnNlciBzdGFjayBzYXZlIGZvciBhc3luYyBoYW5kbGVyIHN1cHBvcnRcbiAgcHJvdGVjdGVkIF9wYXJzZVN0YWNrOiBJUGFyc2VyU3RhY2tTdGF0ZSA9IHtcbiAgICBzdGF0ZTogUGFyc2VyU3RhY2tUeXBlLk5PTkUsXG4gICAgaGFuZGxlcnM6IFtdLFxuICAgIGhhbmRsZXJQb3M6IDAsXG4gICAgdHJhbnNpdGlvbjogMCxcbiAgICBjaHVua1BvczogMFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfdHJhbnNpdGlvbnM6IFRyYW5zaXRpb25UYWJsZSA9IFZUNTAwX1RSQU5TSVRJT05fVEFCTEVcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuaW5pdGlhbFN0YXRlID0gUGFyc2VyU3RhdGUuR1JPVU5EO1xuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5pbml0aWFsU3RhdGU7XG4gICAgdGhpcy5fcGFyYW1zID0gbmV3IFBhcmFtcygpOyAvLyBkZWZhdWx0cyB0byAzMiBzdG9yYWJsZSBwYXJhbXMvc3VicGFyYW1zXG4gICAgdGhpcy5fcGFyYW1zLmFkZFBhcmFtKDApOyAgICAvLyBaRE1cbiAgICB0aGlzLl9jb2xsZWN0ID0gMDtcbiAgICB0aGlzLnByZWNlZGluZ0pvaW5TdGF0ZSA9IDA7XG5cbiAgICAvLyBzZXQgZGVmYXVsdCBmYWxsYmFjayBoYW5kbGVycyBhbmQgaGFuZGxlciBsb29rdXAgY29udGFpbmVyc1xuICAgIHRoaXMuX3ByaW50SGFuZGxlckZiID0gKGRhdGEsIHN0YXJ0LCBlbmQpOiB2b2lkID0+IHsgfTtcbiAgICB0aGlzLl9leGVjdXRlSGFuZGxlckZiID0gKGNvZGU6IG51bWJlcik6IHZvaWQgPT4geyB9O1xuICAgIHRoaXMuX2NzaUhhbmRsZXJGYiA9IChpZGVudDogbnVtYmVyLCBwYXJhbXM6IElQYXJhbXMpOiB2b2lkID0+IHsgfTtcbiAgICB0aGlzLl9lc2NIYW5kbGVyRmIgPSAoaWRlbnQ6IG51bWJlcik6IHZvaWQgPT4geyB9O1xuICAgIHRoaXMuX2Vycm9ySGFuZGxlckZiID0gKHN0YXRlOiBJUGFyc2luZ1N0YXRlKTogSVBhcnNpbmdTdGF0ZSA9PiBzdGF0ZTtcbiAgICB0aGlzLl9wcmludEhhbmRsZXIgPSB0aGlzLl9wcmludEhhbmRsZXJGYjtcbiAgICB0aGlzLl9leGVjdXRlSGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2NzaUhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9lc2NIYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgdGhpcy5fY3NpSGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdGhpcy5fZXhlY3V0ZUhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHRoaXMuX2VzY0hhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9KSk7XG4gICAgdGhpcy5fb3NjUGFyc2VyID0gdGhpcy5yZWdpc3RlcihuZXcgT3NjUGFyc2VyKCkpO1xuICAgIHRoaXMuX2Rjc1BhcnNlciA9IHRoaXMucmVnaXN0ZXIobmV3IERjc1BhcnNlcigpKTtcbiAgICB0aGlzLl9lcnJvckhhbmRsZXIgPSB0aGlzLl9lcnJvckhhbmRsZXJGYjtcblxuICAgIC8vIHN3YWxsb3cgN2JpdCBTVCAoRVNDK1xcKVxuICAgIHRoaXMucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICdcXFxcJyB9LCAoKSA9PiB0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfaWRlbnRpZmllcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgZmluYWxSYW5nZTogbnVtYmVyW10gPSBbMHg0MCwgMHg3ZV0pOiBudW1iZXIge1xuICAgIGxldCByZXMgPSAwO1xuICAgIGlmIChpZC5wcmVmaXgpIHtcbiAgICAgIGlmIChpZC5wcmVmaXgubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29ubHkgb25lIGJ5dGUgYXMgcHJlZml4IHN1cHBvcnRlZCcpO1xuICAgICAgfVxuICAgICAgcmVzID0gaWQucHJlZml4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAocmVzICYmIDB4M2MgPiByZXMgfHwgcmVzID4gMHgzZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByZWZpeCBtdXN0IGJlIGluIHJhbmdlIDB4M2MgLi4gMHgzZicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaWQuaW50ZXJtZWRpYXRlcykge1xuICAgICAgaWYgKGlkLmludGVybWVkaWF0ZXMubGVuZ3RoID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29ubHkgdHdvIGJ5dGVzIGFzIGludGVybWVkaWF0ZXMgYXJlIHN1cHBvcnRlZCcpO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5pbnRlcm1lZGlhdGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGludGVybWVkaWF0ZSA9IGlkLmludGVybWVkaWF0ZXMuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKDB4MjAgPiBpbnRlcm1lZGlhdGUgfHwgaW50ZXJtZWRpYXRlID4gMHgyZikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW50ZXJtZWRpYXRlIG11c3QgYmUgaW4gcmFuZ2UgMHgyMCAuLiAweDJmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzIDw8PSA4O1xuICAgICAgICByZXMgfD0gaW50ZXJtZWRpYXRlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaWQuZmluYWwubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpbmFsIG11c3QgYmUgYSBzaW5nbGUgYnl0ZScpO1xuICAgIH1cbiAgICBjb25zdCBmaW5hbENvZGUgPSBpZC5maW5hbC5jaGFyQ29kZUF0KDApO1xuICAgIGlmIChmaW5hbFJhbmdlWzBdID4gZmluYWxDb2RlIHx8IGZpbmFsQ29kZSA+IGZpbmFsUmFuZ2VbMV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluYWwgbXVzdCBiZSBpbiByYW5nZSAke2ZpbmFsUmFuZ2VbMF19IC4uICR7ZmluYWxSYW5nZVsxXX1gKTtcbiAgICB9XG4gICAgcmVzIDw8PSA4O1xuICAgIHJlcyB8PSBmaW5hbENvZGU7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHVibGljIGlkZW50VG9TdHJpbmcoaWRlbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHdoaWxlIChpZGVudCkge1xuICAgICAgcmVzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShpZGVudCAmIDB4RkYpKTtcbiAgICAgIGlkZW50ID4+PSA4O1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJldmVyc2UoKS5qb2luKCcnKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQcmludEhhbmRsZXIoaGFuZGxlcjogUHJpbnRIYW5kbGVyVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3ByaW50SGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cbiAgcHVibGljIGNsZWFyUHJpbnRIYW5kbGVyKCk6IHZvaWQge1xuICAgIHRoaXMuX3ByaW50SGFuZGxlciA9IHRoaXMuX3ByaW50SGFuZGxlckZiO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyRXNjSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgaGFuZGxlcjogRXNjSGFuZGxlclR5cGUpOiBJRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgaWRlbnQgPSB0aGlzLl9pZGVudGlmaWVyKGlkLCBbMHgzMCwgMHg3ZV0pO1xuICAgIGlmICh0aGlzLl9lc2NIYW5kbGVyc1tpZGVudF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZXNjSGFuZGxlcnNbaWRlbnRdID0gW107XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXJMaXN0ID0gdGhpcy5fZXNjSGFuZGxlcnNbaWRlbnRdO1xuICAgIGhhbmRsZXJMaXN0LnB1c2goaGFuZGxlcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZGV4ID0gaGFuZGxlckxpc3QuaW5kZXhPZihoYW5kbGVyKTtcbiAgICAgICAgaWYgKGhhbmRsZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBoYW5kbGVyTGlzdC5zcGxpY2UoaGFuZGxlckluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcHVibGljIGNsZWFyRXNjSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9lc2NIYW5kbGVyc1t0aGlzLl9pZGVudGlmaWVyKGlkLCBbMHgzMCwgMHg3ZV0pXSkgZGVsZXRlIHRoaXMuX2VzY0hhbmRsZXJzW3RoaXMuX2lkZW50aWZpZXIoaWQsIFsweDMwLCAweDdlXSldO1xuICB9XG4gIHB1YmxpYyBzZXRFc2NIYW5kbGVyRmFsbGJhY2soaGFuZGxlcjogRXNjRmFsbGJhY2tIYW5kbGVyVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX2VzY0hhbmRsZXJGYiA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0RXhlY3V0ZUhhbmRsZXIoZmxhZzogc3RyaW5nLCBoYW5kbGVyOiBFeGVjdXRlSGFuZGxlclR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl9leGVjdXRlSGFuZGxlcnNbZmxhZy5jaGFyQ29kZUF0KDApXSA9IGhhbmRsZXI7XG4gIH1cbiAgcHVibGljIGNsZWFyRXhlY3V0ZUhhbmRsZXIoZmxhZzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2V4ZWN1dGVIYW5kbGVyc1tmbGFnLmNoYXJDb2RlQXQoMCldKSBkZWxldGUgdGhpcy5fZXhlY3V0ZUhhbmRsZXJzW2ZsYWcuY2hhckNvZGVBdCgwKV07XG4gIH1cbiAgcHVibGljIHNldEV4ZWN1dGVIYW5kbGVyRmFsbGJhY2soaGFuZGxlcjogRXhlY3V0ZUZhbGxiYWNrSGFuZGxlclR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl9leGVjdXRlSGFuZGxlckZiID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckNzaUhhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGhhbmRsZXI6IENzaUhhbmRsZXJUeXBlKTogSURpc3Bvc2FibGUge1xuICAgIGNvbnN0IGlkZW50ID0gdGhpcy5faWRlbnRpZmllcihpZCk7XG4gICAgaWYgKHRoaXMuX2NzaUhhbmRsZXJzW2lkZW50XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9jc2lIYW5kbGVyc1tpZGVudF0gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgaGFuZGxlckxpc3QgPSB0aGlzLl9jc2lIYW5kbGVyc1tpZGVudF07XG4gICAgaGFuZGxlckxpc3QucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5kZXggPSBoYW5kbGVyTGlzdC5pbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaGFuZGxlckluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGhhbmRsZXJMaXN0LnNwbGljZShoYW5kbGVySW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgY2xlYXJDc2lIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NzaUhhbmRsZXJzW3RoaXMuX2lkZW50aWZpZXIoaWQpXSkgZGVsZXRlIHRoaXMuX2NzaUhhbmRsZXJzW3RoaXMuX2lkZW50aWZpZXIoaWQpXTtcbiAgfVxuICBwdWJsaWMgc2V0Q3NpSGFuZGxlckZhbGxiYWNrKGNhbGxiYWNrOiAoaWRlbnQ6IG51bWJlciwgcGFyYW1zOiBJUGFyYW1zKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fY3NpSGFuZGxlckZiID0gY2FsbGJhY2s7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJEY3NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBoYW5kbGVyOiBJRGNzSGFuZGxlcik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fZGNzUGFyc2VyLnJlZ2lzdGVySGFuZGxlcih0aGlzLl9pZGVudGlmaWVyKGlkKSwgaGFuZGxlcik7XG4gIH1cbiAgcHVibGljIGNsZWFyRGNzSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllcik6IHZvaWQge1xuICAgIHRoaXMuX2Rjc1BhcnNlci5jbGVhckhhbmRsZXIodGhpcy5faWRlbnRpZmllcihpZCkpO1xuICB9XG4gIHB1YmxpYyBzZXREY3NIYW5kbGVyRmFsbGJhY2soaGFuZGxlcjogRGNzRmFsbGJhY2tIYW5kbGVyVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX2Rjc1BhcnNlci5zZXRIYW5kbGVyRmFsbGJhY2soaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPc2NIYW5kbGVyKGlkZW50OiBudW1iZXIsIGhhbmRsZXI6IElPc2NIYW5kbGVyKTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9vc2NQYXJzZXIucmVnaXN0ZXJIYW5kbGVyKGlkZW50LCBoYW5kbGVyKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJPc2NIYW5kbGVyKGlkZW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9vc2NQYXJzZXIuY2xlYXJIYW5kbGVyKGlkZW50KTtcbiAgfVxuICBwdWJsaWMgc2V0T3NjSGFuZGxlckZhbGxiYWNrKGhhbmRsZXI6IE9zY0ZhbGxiYWNrSGFuZGxlclR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl9vc2NQYXJzZXIuc2V0SGFuZGxlckZhbGxiYWNrKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHNldEVycm9ySGFuZGxlcihjYWxsYmFjazogKHN0YXRlOiBJUGFyc2luZ1N0YXRlKSA9PiBJUGFyc2luZ1N0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5fZXJyb3JIYW5kbGVyID0gY2FsbGJhY2s7XG4gIH1cbiAgcHVibGljIGNsZWFyRXJyb3JIYW5kbGVyKCk6IHZvaWQge1xuICAgIHRoaXMuX2Vycm9ySGFuZGxlciA9IHRoaXMuX2Vycm9ySGFuZGxlckZiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHBhcnNlciB0byBpbml0aWFsIHZhbHVlcy5cbiAgICpcbiAgICogVGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGxpZnQgdGhlIGltcHJvcGVyIGNvbnRpbnVhdGlvbiBlcnJvciBjb25kaXRpb25cbiAgICogd2hlbiBkZWFsaW5nIHdpdGggYXN5bmMgaGFuZGxlcnMuIFVzZSB0aGlzIG9ubHkgYXMgYSBsYXN0IHJlc29ydCB0byBzaWxlbmNlXG4gICAqIHRoYXQgZXJyb3Igd2hlbiB0aGUgdGVybWluYWwgaGFzIG5vIHBlbmRpbmcgZGF0YSB0byBiZSBwcm9jZXNzZWQuIE5vdGUgdGhhdFxuICAgKiB0aGUgaW50ZXJydXB0ZWQgYXN5bmMgaGFuZGxlciBtaWdodCBjb250aW51ZSBpdHMgd29yayBpbiB0aGUgZnV0dXJlIG1lc3NpbmdcbiAgICogdXAgdGhlIHRlcm1pbmFsIHN0YXRlIGV2ZW4gZnVydGhlci5cbiAgICovXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMuaW5pdGlhbFN0YXRlO1xuICAgIHRoaXMuX29zY1BhcnNlci5yZXNldCgpO1xuICAgIHRoaXMuX2Rjc1BhcnNlci5yZXNldCgpO1xuICAgIHRoaXMuX3BhcmFtcy5yZXNldCgpO1xuICAgIHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKTsgLy8gWkRNXG4gICAgdGhpcy5fY29sbGVjdCA9IDA7XG4gICAgdGhpcy5wcmVjZWRpbmdKb2luU3RhdGUgPSAwO1xuICAgIC8vIGFib3J0IHBlbmRpbmcgY29udGludWF0aW9uIGZyb20gYXN5bmMgaGFuZGxlclxuICAgIC8vIEhlcmUgdGhlIFJFU0VUIHR5cGUgaW5kaWNhdGVzLCB0aGF0IHRoZSBuZXh0IHBhcnNlIGNhbGwgd2lsbFxuICAgIC8vIGlnbm9yZSBhbnkgc2F2ZWQgc3RhY2ssIGluc3RlYWQgY29udGludWVzIHN5bmMgd2l0aCBuZXh0IGNvZGVwb2ludCBmcm9tIEdST1VORFxuICAgIGlmICh0aGlzLl9wYXJzZVN0YWNrLnN0YXRlICE9PSBQYXJzZXJTdGFja1R5cGUuTk9ORSkge1xuICAgICAgdGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9IFBhcnNlclN0YWNrVHlwZS5SRVNFVDtcbiAgICAgIHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlcnMgPSBbXTsgLy8gYWxzbyByZWxlYXNlIGhhbmRsZXJzIHJlZlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luYyBwYXJzZSBzdXBwb3J0LlxuICAgKi9cbiAgcHJvdGVjdGVkIF9wcmVzZXJ2ZVN0YWNrKFxuICAgIHN0YXRlOiBQYXJzZXJTdGFja1R5cGUsXG4gICAgaGFuZGxlcnM6IFJlc3VtYWJsZUhhbmRsZXJzVHlwZSxcbiAgICBoYW5kbGVyUG9zOiBudW1iZXIsXG4gICAgdHJhbnNpdGlvbjogbnVtYmVyLFxuICAgIGNodW5rUG9zOiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlcnMgPSBoYW5kbGVycztcbiAgICB0aGlzLl9wYXJzZVN0YWNrLmhhbmRsZXJQb3MgPSBoYW5kbGVyUG9zO1xuICAgIHRoaXMuX3BhcnNlU3RhY2sudHJhbnNpdGlvbiA9IHRyYW5zaXRpb247XG4gICAgdGhpcy5fcGFyc2VTdGFjay5jaHVua1BvcyA9IGNodW5rUG9zO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIFVURjMyIGNvZGVwb2ludHMgaW4gYGRhdGFgIHVwIHRvIGBsZW5ndGhgLlxuICAgKlxuICAgKiBOb3RlOiBGb3Igc2V2ZXJhbCBhY3Rpb25zIHdpdGggaGlnaCBkYXRhIGxvYWQgdGhlIHBhcnNpbmcgaXMgb3B0aW1pemVkXG4gICAqIGJ5IHVzaW5nIGxvY2FsIHJlYWQgYWhlYWQgbG9vcHMgd2l0aCBoYXJkY29kZWQgY29uZGl0aW9ucyB0b1xuICAgKiBhdm9pZCBjb3N0bHkgdGFibGUgbG9va3Vwcy4gTWFrZSBzdXJlIHRoYXQgYW55IGNoYW5nZSBvZiB0YWJsZSB2YWx1ZXNcbiAgICogd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGxvb3AgY29uZGl0aW9ucyBhcyB3ZWxsIGFuZCB2aWNlIHZlcnNhLlxuICAgKiBBZmZlY3RlZCBzdGF0ZXMvYWN0aW9uczpcbiAgICogLSBHUk9VTkQ6UFJJTlRcbiAgICogLSBDU0lfUEFSQU06UEFSQU1cbiAgICogLSBEQ1NfUEFSQU06UEFSQU1cbiAgICogLSBPU0NfU1RSSU5HOk9TQ19QVVRcbiAgICogLSBEQ1NfUEFTU1RIUk9VR0g6RENTX1BVVFxuICAgKlxuICAgKiBOb3RlIG9uIGFzeW5jaHJvbm91cyBoYW5kbGVyIHN1cHBvcnQ6XG4gICAqIEFueSBoYW5kbGVyIHJldHVybmluZyBhIHByb21pc2Ugd2lsbCBiZSB0cmVhdGVkIGFzIGFzeW5jaHJvbm91cy5cbiAgICogVG8ga2VlcCB0aGUgaW4tYmFuZCBibG9ja2luZyB3b3JraW5nIGZvciBhc3luYyBoYW5kbGVycywgYHBhcnNlYCBwYXVzZXMgZXhlY3V0aW9uLFxuICAgKiBjcmVhdGVzIGEgc3RhY2sgc2F2ZSBhbmQgcmV0dXJucyB0aGUgcHJvbWlzZSB0byB0aGUgY2FsbGVyLlxuICAgKiBGb3IgcHJvcGVyIGNvbnRpbnVhdGlvbiBvZiB0aGUgcGF1c2VkIHN0YXRlIGl0IGlzIGltcG9ydGFudFxuICAgKiB0byBhd2FpdCB0aGUgcHJvbWlzZSByZXNvbHZpbmcuIE9uIHJlc29sdmUgdGhlIHBhcnNlIG11c3QgYmUgcmVwZWF0ZWRcbiAgICogd2l0aCB0aGUgc2FtZSBjaHVuayBvZiBkYXRhIGFuZCB0aGUgcmVzb2x2ZWQgdmFsdWUgaW4gYHByb21pc2VSZXN1bHRgXG4gICAqIHVudGlsIG5vIHByb21pc2UgaXMgcmV0dXJuZWQuXG4gICAqXG4gICAqIEltcG9ydGFudDogV2l0aCBvbmx5IHN5bmMgaGFuZGxlcnMgZGVmaW5lZCwgcGFyc2luZyBpcyBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIGFzIHdlbGwuXG4gICAqIEFzIHNvb24gYXMgYW4gYXN5bmMgaGFuZGxlciBpcyBpbnZvbHZlZCwgc3luY2hyb25vdXMgcGFyc2luZyBpcyBub3QgcG9zc2libGUgYW55bW9yZS5cbiAgICpcbiAgICogQm9pbGVycGxhdGUgZm9yIHByb3BlciBwYXJzaW5nIG9mIG11bHRpcGxlIGNodW5rcyB3aXRoIGFzeW5jIGhhbmRsZXJzOlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIGZ1bmN0aW9uIHBhcnNlTXVsdGlwbGVDaHVua3MoY2h1bmtzOiBVaW50MzJBcnJheVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAqICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICogICAgIGxldCByZXN1bHQ6IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+O1xuICAgKiAgICAgbGV0IHByZXY6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAqICAgICB3aGlsZSAocmVzdWx0ID0gcGFyc2VyLnBhcnNlKGNodW5rLCBjaHVuay5sZW5ndGgsIHByZXYpKSB7XG4gICAqICAgICAgIHByZXYgPSBhd2FpdCByZXN1bHQ7XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiAgIC8vIGZpbmlzaGVkIHBhcnNpbmcgYWxsIGNodW5rcy4uLlxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIHBhcnNlKGRhdGE6IFVpbnQzMkFycmF5LCBsZW5ndGg6IG51bWJlciwgcHJvbWlzZVJlc3VsdD86IGJvb2xlYW4pOiB2b2lkIHwgUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IGNvZGUgPSAwO1xuICAgIGxldCB0cmFuc2l0aW9uID0gMDtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBoYW5kbGVyUmVzdWx0OiB2b2lkIHwgYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgICAvLyByZXN1bWUgZnJvbSBhc3luYyBoYW5kbGVyXG4gICAgaWYgKHRoaXMuX3BhcnNlU3RhY2suc3RhdGUpIHtcbiAgICAgIC8vIGFsbG93IHN5bmMgcGFyc2VyIHJlc2V0IGV2ZW4gaW4gY29udGludWF0aW9uIG1vZGVcbiAgICAgIC8vIE5vdGU6IGNhbiBiZSB1c2VkIHRvIHJlY292ZXIgcGFyc2VyIGZyb20gaW1wcm9wZXIgY29udGludWF0aW9uIGVycm9yIGJlbG93XG4gICAgICBpZiAodGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9PT0gUGFyc2VyU3RhY2tUeXBlLlJFU0VUKSB7XG4gICAgICAgIHRoaXMuX3BhcnNlU3RhY2suc3RhdGUgPSBQYXJzZXJTdGFja1R5cGUuTk9ORTtcbiAgICAgICAgc3RhcnQgPSB0aGlzLl9wYXJzZVN0YWNrLmNodW5rUG9zICsgMTsgLy8gY29udGludWUgd2l0aCBuZXh0IGNvZGVwb2ludCBpbiBHUk9VTkRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9taXNlUmVzdWx0ID09PSB1bmRlZmluZWQgfHwgdGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9PT0gUGFyc2VyU3RhY2tUeXBlLkZBSUwpIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBSZWplY3QgZnVydGhlciBwYXJzaW5nIG9uIGltcHJvcGVyIGNvbnRpbnVhdGlvbiBhZnRlciBwYXVzaW5nLiBUaGlzIGlzIGEgcmVhbGx5IGJhZFxuICAgICAgICAgICAqIGNvbmRpdGlvbiB3aXRoIHNjcmV3ZWQgdXAgZXhlY3V0aW9uIG9yZGVyIGFuZCBwcm9sbHkgbWVzc2VkIHVwIHRlcm1pbmFsIHN0YXRlLFxuICAgICAgICAgICAqIHRoZXJlZm9yZSB3ZSBleGl0IGhhcmQgd2l0aCBhbiBleGNlcHRpb24gYW5kIHJlamVjdCBhbnkgZnVydGhlciBwYXJzaW5nLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogTm90ZTogV2l0aCBgVGVybWluYWwud3JpdGVgIHVzYWdlIHRoaXMgZXhjZXB0aW9uIHNob3VsZCBuZXZlciBvY2N1ciwgYXMgdGhlIHRvcCBsZXZlbFxuICAgICAgICAgICAqIGNhbGxzIGFyZSBndWFyYW50ZWVkIHRvIGhhbmRsZSBhc3luYyBjb25kaXRpb25zIHByb3Blcmx5LiBJZiB5b3UgZXZlciBlbmNvdW50ZXIgdGhpc1xuICAgICAgICAgICAqIGV4Y2VwdGlvbiBpbiB5b3VyIHRlcm1pbmFsIGludGVncmF0aW9uIGl0IGluZGljYXRlcywgdGhhdCB5b3UgaW5qZWN0ZWQgZGF0YSBjaHVua3MgdG9cbiAgICAgICAgICAgKiBgSW5wdXRIYW5kbGVyLnBhcnNlYCBvciBgRXNjYXBlU2VxdWVuY2VQYXJzZXIucGFyc2VgIHN5bmNocm9ub3VzbHkgd2l0aG91dCB3YWl0aW5nIGZvclxuICAgICAgICAgICAqIGNvbnRpbnVhdGlvbiBvZiBhIHJ1bm5pbmcgYXN5bmMgaGFuZGxlci5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEl0IGlzIHBvc3NpYmxlIHRvIGdldCByaWQgb2YgdGhpcyBlcnJvciBieSBjYWxsaW5nIGByZXNldGAuIEJ1dCBkb250IHJlbHkgb24gdGhhdCwgYXNcbiAgICAgICAgICAgKiB0aGUgcGVuZGluZyBhc3luYyBoYW5kbGVyIHN0aWxsIG1pZ2h0IG1lc3MgdXAgdGhlIHRlcm1pbmFsIGxhdGVyLiBJbnN0ZWFkIGZpeCB0aGVcbiAgICAgICAgICAgKiBmYXVsdHkgYXN5bmMgaGFuZGxpbmcsIHNvIHRoaXMgZXJyb3Igd2lsbCBub3QgYmUgdGhyb3duIGFueW1vcmUuXG4gICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9IFBhcnNlclN0YWNrVHlwZS5GQUlMO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW1wcm9wZXIgY29udGludWF0aW9uIGR1ZSB0byBwcmV2aW91cyBhc3luYyBoYW5kbGVyLCBnaXZpbmcgdXAgcGFyc2luZycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2UgaGF2ZSB0byByZXN1bWUgdGhlIG9sZCBoYW5kbGVyIGxvb3AgaWY6XG4gICAgICAgIC8vIC0gcmV0dXJuIHZhbHVlIG9mIHRoZSBwcm9taXNlIHdhcyBgZmFsc2VgXG4gICAgICAgIC8vIC0gaGFuZGxlcnMgYXJlIG5vdCBleGhhdXN0ZWQgeWV0XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVycztcbiAgICAgICAgbGV0IGhhbmRsZXJQb3MgPSB0aGlzLl9wYXJzZVN0YWNrLmhhbmRsZXJQb3MgLSAxO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuX3BhcnNlU3RhY2suc3RhdGUpIHtcbiAgICAgICAgICBjYXNlIFBhcnNlclN0YWNrVHlwZS5DU0k6XG4gICAgICAgICAgICBpZiAocHJvbWlzZVJlc3VsdCA9PT0gZmFsc2UgJiYgaGFuZGxlclBvcyA+IC0xKSB7XG4gICAgICAgICAgICAgIGZvciAoOyBoYW5kbGVyUG9zID49IDA7IGhhbmRsZXJQb3MtLSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSAoaGFuZGxlcnMgYXMgQ3NpSGFuZGxlclR5cGVbXSlbaGFuZGxlclBvc10odGhpcy5fcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlclJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVyUG9zID0gaGFuZGxlclBvcztcbiAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVycyA9IFtdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBQYXJzZXJTdGFja1R5cGUuRVNDOlxuICAgICAgICAgICAgaWYgKHByb21pc2VSZXN1bHQgPT09IGZhbHNlICYmIGhhbmRsZXJQb3MgPiAtMSkge1xuICAgICAgICAgICAgICBmb3IgKDsgaGFuZGxlclBvcyA+PSAwOyBoYW5kbGVyUG9zLS0pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gKGhhbmRsZXJzIGFzIEVzY0hhbmRsZXJUeXBlW10pW2hhbmRsZXJQb3NdKCk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlclJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlclBvcyA9IGhhbmRsZXJQb3M7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlcnMgPSBbXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUGFyc2VyU3RhY2tUeXBlLkRDUzpcbiAgICAgICAgICAgIGNvZGUgPSBkYXRhW3RoaXMuX3BhcnNlU3RhY2suY2h1bmtQb3NdO1xuICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHRoaXMuX2Rjc1BhcnNlci51bmhvb2soY29kZSAhPT0gMHgxOCAmJiBjb2RlICE9PSAweDFhLCBwcm9taXNlUmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyUmVzdWx0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IDB4MWIpIHRoaXMuX3BhcnNlU3RhY2sudHJhbnNpdGlvbiB8PSBQYXJzZXJTdGF0ZS5FU0NBUEU7XG4gICAgICAgICAgICB0aGlzLl9wYXJhbXMucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKTsgLy8gWkRNXG4gICAgICAgICAgICB0aGlzLl9jb2xsZWN0ID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUGFyc2VyU3RhY2tUeXBlLk9TQzpcbiAgICAgICAgICAgIGNvZGUgPSBkYXRhW3RoaXMuX3BhcnNlU3RhY2suY2h1bmtQb3NdO1xuICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHRoaXMuX29zY1BhcnNlci5lbmQoY29kZSAhPT0gMHgxOCAmJiBjb2RlICE9PSAweDFhLCBwcm9taXNlUmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyUmVzdWx0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IDB4MWIpIHRoaXMuX3BhcnNlU3RhY2sudHJhbnNpdGlvbiB8PSBQYXJzZXJTdGF0ZS5FU0NBUEU7XG4gICAgICAgICAgICB0aGlzLl9wYXJhbXMucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKTsgLy8gWkRNXG4gICAgICAgICAgICB0aGlzLl9jb2xsZWN0ID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsZWFudXAgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCB0aGUgbWFpbiBzeW5jIGxvb3BcbiAgICAgICAgdGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9IFBhcnNlclN0YWNrVHlwZS5OT05FO1xuICAgICAgICBzdGFydCA9IHRoaXMuX3BhcnNlU3RhY2suY2h1bmtQb3MgKyAxO1xuICAgICAgICB0aGlzLnByZWNlZGluZ0pvaW5TdGF0ZSA9IDA7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5fcGFyc2VTdGFjay50cmFuc2l0aW9uICYgVGFibGVBY2Nlc3MuVFJBTlNJVElPTl9TVEFURV9NQVNLO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnRpbnVlIHdpdGggbWFpbiBzeW5jIGxvb3BcblxuICAgIC8vIHByb2Nlc3MgaW5wdXQgc3RyaW5nXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvZGUgPSBkYXRhW2ldO1xuXG4gICAgICAvLyBub3JtYWwgdHJhbnNpdGlvbiAmIGFjdGlvbiBsb29rdXBcbiAgICAgIHRyYW5zaXRpb24gPSB0aGlzLl90cmFuc2l0aW9ucy50YWJsZVt0aGlzLmN1cnJlbnRTdGF0ZSA8PCBUYWJsZUFjY2Vzcy5JTkRFWF9TVEFURV9TSElGVCB8IChjb2RlIDwgMHhhMCA/IGNvZGUgOiBOT05fQVNDSUlfUFJJTlRBQkxFKV07XG4gICAgICBzd2l0Y2ggKHRyYW5zaXRpb24gPj4gVGFibGVBY2Nlc3MuVFJBTlNJVElPTl9BQ1RJT05fU0hJRlQpIHtcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uUFJJTlQ6XG4gICAgICAgICAgLy8gcmVhZCBhaGVhZCB3aXRoIGxvb3AgdW5yb2xsaW5nXG4gICAgICAgICAgLy8gTm90ZTogMHgyMCAoU1ApIGlzIGluY2x1ZGVkLCAweDdGIChERUwpIGlzIGV4Y2x1ZGVkXG4gICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyA7ICsraikge1xuICAgICAgICAgICAgaWYgKGogPj0gbGVuZ3RoIHx8IChjb2RlID0gZGF0YVtqXSkgPCAweDIwIHx8IChjb2RlID4gMHg3ZSAmJiBjb2RlIDwgTk9OX0FTQ0lJX1BSSU5UQUJMRSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJpbnRIYW5kbGVyKGRhdGEsIGksIGopO1xuICAgICAgICAgICAgICBpID0gaiAtIDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCsraiA+PSBsZW5ndGggfHwgKGNvZGUgPSBkYXRhW2pdKSA8IDB4MjAgfHwgKGNvZGUgPiAweDdlICYmIGNvZGUgPCBOT05fQVNDSUlfUFJJTlRBQkxFKSkge1xuICAgICAgICAgICAgICB0aGlzLl9wcmludEhhbmRsZXIoZGF0YSwgaSwgaik7XG4gICAgICAgICAgICAgIGkgPSBqIC0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKytqID49IGxlbmd0aCB8fCAoY29kZSA9IGRhdGFbal0pIDwgMHgyMCB8fCAoY29kZSA+IDB4N2UgJiYgY29kZSA8IE5PTl9BU0NJSV9QUklOVEFCTEUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3ByaW50SGFuZGxlcihkYXRhLCBpLCBqKTtcbiAgICAgICAgICAgICAgaSA9IGogLSAxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgrK2ogPj0gbGVuZ3RoIHx8IChjb2RlID0gZGF0YVtqXSkgPCAweDIwIHx8IChjb2RlID4gMHg3ZSAmJiBjb2RlIDwgTk9OX0FTQ0lJX1BSSU5UQUJMRSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJpbnRIYW5kbGVyKGRhdGEsIGksIGopO1xuICAgICAgICAgICAgICBpID0gaiAtIDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uRVhFQ1VURTpcbiAgICAgICAgICBpZiAodGhpcy5fZXhlY3V0ZUhhbmRsZXJzW2NvZGVdKSB0aGlzLl9leGVjdXRlSGFuZGxlcnNbY29kZV0oKTtcbiAgICAgICAgICBlbHNlIHRoaXMuX2V4ZWN1dGVIYW5kbGVyRmIoY29kZSk7XG4gICAgICAgICAgdGhpcy5wcmVjZWRpbmdKb2luU3RhdGUgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5JR05PUkU6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUGFyc2VyQWN0aW9uLkVSUk9SOlxuICAgICAgICAgIGNvbnN0IGluamVjdDogSVBhcnNpbmdTdGF0ZSA9IHRoaXMuX2Vycm9ySGFuZGxlcihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IGksXG4gICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZTogdGhpcy5jdXJyZW50U3RhdGUsXG4gICAgICAgICAgICAgIGNvbGxlY3Q6IHRoaXMuX2NvbGxlY3QsXG4gICAgICAgICAgICAgIHBhcmFtczogdGhpcy5fcGFyYW1zLFxuICAgICAgICAgICAgICBhYm9ydDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpbmplY3QuYWJvcnQpIHJldHVybjtcbiAgICAgICAgICAvLyBpbmplY3QgdmFsdWVzOiBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUGFyc2VyQWN0aW9uLkNTSV9ESVNQQVRDSDpcbiAgICAgICAgICAvLyBUcmlnZ2VyIENTSSBIYW5kbGVyXG4gICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLl9jc2lIYW5kbGVyc1t0aGlzLl9jb2xsZWN0IDw8IDggfCBjb2RlXTtcbiAgICAgICAgICBsZXQgaiA9IGhhbmRsZXJzID8gaGFuZGxlcnMubGVuZ3RoIC0gMSA6IC0xO1xuICAgICAgICAgIGZvciAoOyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgLy8gdHJ1ZSBtZWFucyBzdWNjZXNzIGFuZCB0byBzdG9wIGJ1YmJsaW5nXG4gICAgICAgICAgICAvLyBhIHByb21pc2UgaW5kaWNhdGVzIGFuIGFzeW5jIGhhbmRsZXIgdGhhdCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHByb2dyZXNzaW5nXG4gICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gaGFuZGxlcnNbal0odGhpcy5fcGFyYW1zKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICB0aGlzLl9wcmVzZXJ2ZVN0YWNrKFBhcnNlclN0YWNrVHlwZS5DU0ksIGhhbmRsZXJzLCBqLCB0cmFuc2l0aW9uLCBpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5fY3NpSGFuZGxlckZiKHRoaXMuX2NvbGxlY3QgPDwgOCB8IGNvZGUsIHRoaXMuX3BhcmFtcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucHJlY2VkaW5nSm9pblN0YXRlID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uUEFSQU06XG4gICAgICAgICAgLy8gaW5uZXIgbG9vcDogZGlnaXRzICgweDMwIC0gMHgzOSkgYW5kIDsgKDB4M2IpIGFuZCA6ICgweDNhKVxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgICBjYXNlIDB4M2I6XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyYW1zLmFkZFBhcmFtKDApOyAgLy8gWkRNXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgMHgzYTpcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJhbXMuYWRkU3ViUGFyYW0oLTEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OiAgLy8gMHgzMCAtIDB4MzlcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJhbXMuYWRkRGlnaXQoY29kZSAtIDQ4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlICgrK2kgPCBsZW5ndGggJiYgKGNvZGUgPSBkYXRhW2ldKSA+IDB4MmYgJiYgY29kZSA8IDB4M2MpO1xuICAgICAgICAgIGktLTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uQ09MTEVDVDpcbiAgICAgICAgICB0aGlzLl9jb2xsZWN0IDw8PSA4O1xuICAgICAgICAgIHRoaXMuX2NvbGxlY3QgfD0gY29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uRVNDX0RJU1BBVENIOlxuICAgICAgICAgIGNvbnN0IGhhbmRsZXJzRXNjID0gdGhpcy5fZXNjSGFuZGxlcnNbdGhpcy5fY29sbGVjdCA8PCA4IHwgY29kZV07XG4gICAgICAgICAgbGV0IGpqID0gaGFuZGxlcnNFc2MgPyBoYW5kbGVyc0VzYy5sZW5ndGggLSAxIDogLTE7XG4gICAgICAgICAgZm9yICg7IGpqID49IDA7IGpqLS0pIHtcbiAgICAgICAgICAgIC8vIHRydWUgbWVhbnMgc3VjY2VzcyBhbmQgdG8gc3RvcCBidWJibGluZ1xuICAgICAgICAgICAgLy8gYSBwcm9taXNlIGluZGljYXRlcyBhbiBhc3luYyBoYW5kbGVyIHRoYXQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSBwcm9ncmVzc2luZ1xuICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IGhhbmRsZXJzRXNjW2pqXSgpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3ByZXNlcnZlU3RhY2soUGFyc2VyU3RhY2tUeXBlLkVTQywgaGFuZGxlcnNFc2MsIGpqLCB0cmFuc2l0aW9uLCBpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqaiA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2VzY0hhbmRsZXJGYih0aGlzLl9jb2xsZWN0IDw8IDggfCBjb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wcmVjZWRpbmdKb2luU3RhdGUgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5DTEVBUjpcbiAgICAgICAgICB0aGlzLl9wYXJhbXMucmVzZXQoKTtcbiAgICAgICAgICB0aGlzLl9wYXJhbXMuYWRkUGFyYW0oMCk7IC8vIFpETVxuICAgICAgICAgIHRoaXMuX2NvbGxlY3QgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5EQ1NfSE9PSzpcbiAgICAgICAgICB0aGlzLl9kY3NQYXJzZXIuaG9vayh0aGlzLl9jb2xsZWN0IDw8IDggfCBjb2RlLCB0aGlzLl9wYXJhbXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5EQ1NfUFVUOlxuICAgICAgICAgIC8vIGlubmVyIGxvb3AgLSBleGl0IERDU19QVVQ6IDB4MTgsIDB4MWEsIDB4MWIsIDB4N2YsIDB4ODAgLSAweDlmXG4gICAgICAgICAgLy8gdW5ob29rIHRyaWdnZXJlZCBieTogMHgxYiwgMHg5YyAoc3VjY2VzcykgYW5kIDB4MTgsIDB4MWEgKGFib3J0KVxuICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgOyArK2opIHtcbiAgICAgICAgICAgIGlmIChqID49IGxlbmd0aCB8fCAoY29kZSA9IGRhdGFbal0pID09PSAweDE4IHx8IGNvZGUgPT09IDB4MWEgfHwgY29kZSA9PT0gMHgxYiB8fCAoY29kZSA+IDB4N2YgJiYgY29kZSA8IE5PTl9BU0NJSV9QUklOVEFCTEUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Rjc1BhcnNlci5wdXQoZGF0YSwgaSwgaik7XG4gICAgICAgICAgICAgIGkgPSBqIC0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5EQ1NfVU5IT09LOlxuICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSB0aGlzLl9kY3NQYXJzZXIudW5ob29rKGNvZGUgIT09IDB4MTggJiYgY29kZSAhPT0gMHgxYSk7XG4gICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXNlcnZlU3RhY2soUGFyc2VyU3RhY2tUeXBlLkRDUywgW10sIDAsIHRyYW5zaXRpb24sIGkpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2RlID09PSAweDFiKSB0cmFuc2l0aW9uIHw9IFBhcnNlclN0YXRlLkVTQ0FQRTtcbiAgICAgICAgICB0aGlzLl9wYXJhbXMucmVzZXQoKTtcbiAgICAgICAgICB0aGlzLl9wYXJhbXMuYWRkUGFyYW0oMCk7IC8vIFpETVxuICAgICAgICAgIHRoaXMuX2NvbGxlY3QgPSAwO1xuICAgICAgICAgIHRoaXMucHJlY2VkaW5nSm9pblN0YXRlID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uT1NDX1NUQVJUOlxuICAgICAgICAgIHRoaXMuX29zY1BhcnNlci5zdGFydCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5PU0NfUFVUOlxuICAgICAgICAgIC8vIGlubmVyIGxvb3A6IDB4MjAgKFNQKSBpbmNsdWRlZCwgMHg3RiAoREVMKSBpbmNsdWRlZFxuICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChqID49IGxlbmd0aCB8fCAoY29kZSA9IGRhdGFbal0pIDwgMHgyMCB8fCAoY29kZSA+IDB4N2YgJiYgY29kZSA8IE5PTl9BU0NJSV9QUklOVEFCTEUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX29zY1BhcnNlci5wdXQoZGF0YSwgaSwgaik7XG4gICAgICAgICAgICAgIGkgPSBqIC0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5PU0NfRU5EOlxuICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSB0aGlzLl9vc2NQYXJzZXIuZW5kKGNvZGUgIT09IDB4MTggJiYgY29kZSAhPT0gMHgxYSk7XG4gICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXNlcnZlU3RhY2soUGFyc2VyU3RhY2tUeXBlLk9TQywgW10sIDAsIHRyYW5zaXRpb24sIGkpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2RlID09PSAweDFiKSB0cmFuc2l0aW9uIHw9IFBhcnNlclN0YXRlLkVTQ0FQRTtcbiAgICAgICAgICB0aGlzLl9wYXJhbXMucmVzZXQoKTtcbiAgICAgICAgICB0aGlzLl9wYXJhbXMuYWRkUGFyYW0oMCk7IC8vIFpETVxuICAgICAgICAgIHRoaXMuX2NvbGxlY3QgPSAwO1xuICAgICAgICAgIHRoaXMucHJlY2VkaW5nSm9pblN0YXRlID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gdHJhbnNpdGlvbiAmIFRhYmxlQWNjZXNzLlRSQU5TSVRJT05fU1RBVEVfTUFTSztcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElPc2NIYW5kbGVyLCBJSGFuZGxlckNvbGxlY3Rpb24sIE9zY0ZhbGxiYWNrSGFuZGxlclR5cGUsIElPc2NQYXJzZXIsIElTdWJQYXJzZXJTdGFja1N0YXRlIH0gZnJvbSAnY29tbW9uL3BhcnNlci9UeXBlcyc7XG5pbXBvcnQgeyBPc2NTdGF0ZSwgUEFZTE9BRF9MSU1JVCB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IHV0ZjMyVG9TdHJpbmcgfSBmcm9tICdjb21tb24vaW5wdXQvVGV4dERlY29kZXInO1xuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5jb25zdCBFTVBUWV9IQU5ETEVSUzogSU9zY0hhbmRsZXJbXSA9IFtdO1xuXG5leHBvcnQgY2xhc3MgT3NjUGFyc2VyIGltcGxlbWVudHMgSU9zY1BhcnNlciB7XG4gIHByaXZhdGUgX3N0YXRlID0gT3NjU3RhdGUuU1RBUlQ7XG4gIHByaXZhdGUgX2FjdGl2ZSA9IEVNUFRZX0hBTkRMRVJTO1xuICBwcml2YXRlIF9pZCA9IC0xO1xuICBwcml2YXRlIF9oYW5kbGVyczogSUhhbmRsZXJDb2xsZWN0aW9uPElPc2NIYW5kbGVyPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHByaXZhdGUgX2hhbmRsZXJGYjogT3NjRmFsbGJhY2tIYW5kbGVyVHlwZSA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBfc3RhY2s6IElTdWJQYXJzZXJTdGFja1N0YXRlID0ge1xuICAgIHBhdXNlZDogZmFsc2UsXG4gICAgbG9vcFBvc2l0aW9uOiAwLFxuICAgIGZhbGxUaHJvdWdoOiBmYWxzZVxuICB9O1xuXG4gIHB1YmxpYyByZWdpc3RlckhhbmRsZXIoaWRlbnQ6IG51bWJlciwgaGFuZGxlcjogSU9zY0hhbmRsZXIpOiBJRGlzcG9zYWJsZSB7XG4gICAgaWYgKHRoaXMuX2hhbmRsZXJzW2lkZW50XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9oYW5kbGVyc1tpZGVudF0gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgaGFuZGxlckxpc3QgPSB0aGlzLl9oYW5kbGVyc1tpZGVudF07XG4gICAgaGFuZGxlckxpc3QucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5kZXggPSBoYW5kbGVyTGlzdC5pbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaGFuZGxlckluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGhhbmRsZXJMaXN0LnNwbGljZShoYW5kbGVySW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgY2xlYXJIYW5kbGVyKGlkZW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faGFuZGxlcnNbaWRlbnRdKSBkZWxldGUgdGhpcy5faGFuZGxlcnNbaWRlbnRdO1xuICB9XG4gIHB1YmxpYyBzZXRIYW5kbGVyRmFsbGJhY2soaGFuZGxlcjogT3NjRmFsbGJhY2tIYW5kbGVyVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZXJGYiA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9oYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5faGFuZGxlckZiID0gKCkgPT4geyB9O1xuICAgIHRoaXMuX2FjdGl2ZSA9IEVNUFRZX0hBTkRMRVJTO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIC8vIGZvcmNlIGNsZWFudXAgaGFuZGxlcnMgaWYgcGF5bG9hZCB3YXMgYWxyZWFkeSBzZW50XG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBPc2NTdGF0ZS5QQVlMT0FEKSB7XG4gICAgICBmb3IgKGxldCBqID0gdGhpcy5fc3RhY2sucGF1c2VkID8gdGhpcy5fc3RhY2subG9vcFBvc2l0aW9uIC0gMSA6IHRoaXMuX2FjdGl2ZS5sZW5ndGggLSAxOyBqID49IDA7IC0taikge1xuICAgICAgICB0aGlzLl9hY3RpdmVbal0uZW5kKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc3RhY2sucGF1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5fYWN0aXZlID0gRU1QVFlfSEFORExFUlM7XG4gICAgdGhpcy5faWQgPSAtMTtcbiAgICB0aGlzLl9zdGF0ZSA9IE9zY1N0YXRlLlNUQVJUO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aXZlID0gdGhpcy5faGFuZGxlcnNbdGhpcy5faWRdIHx8IEVNUFRZX0hBTkRMRVJTO1xuICAgIGlmICghdGhpcy5fYWN0aXZlLmxlbmd0aCkge1xuICAgICAgdGhpcy5faGFuZGxlckZiKHRoaXMuX2lkLCAnU1RBUlQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaiA9IHRoaXMuX2FjdGl2ZS5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVbal0uc3RhcnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wdXQoZGF0YTogVWludDMyQXJyYXksIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmUubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9oYW5kbGVyRmIodGhpcy5faWQsICdQVVQnLCB1dGYzMlRvU3RyaW5nKGRhdGEsIHN0YXJ0LCBlbmQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaiA9IHRoaXMuX2FjdGl2ZS5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVbal0ucHV0KGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBhbHdheXMgcmVzZXQgbGVmdG92ZXIgaGFuZGxlcnNcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5fc3RhdGUgPSBPc2NTdGF0ZS5JRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgZGF0YSB0byBjdXJyZW50IE9TQyBjb21tYW5kLlxuICAgKiBFeHBlY3RzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBPU0MgY29tbWFuZCBpbiB0aGUgZm9ybVxuICAgKiBPU0MgaWQgOyBwYXlsb2FkIFNUL0JFTFxuICAgKiBQYXlsb2FkIGNodW5rcyBhcmUgbm90IGZ1cnRoZXIgcHJvY2Vzc2VkIGFuZCBnZXRcbiAgICogZGlyZWN0bHkgcGFzc2VkIHRvIHRoZSBoYW5kbGVycy5cbiAgICovXG4gIHB1YmxpYyBwdXQoZGF0YTogVWludDMyQXJyYXksIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBPc2NTdGF0ZS5BQk9SVCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IE9zY1N0YXRlLklEKSB7XG4gICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGRhdGFbc3RhcnQrK107XG4gICAgICAgIGlmIChjb2RlID09PSAweDNiKSB7XG4gICAgICAgICAgdGhpcy5fc3RhdGUgPSBPc2NTdGF0ZS5QQVlMT0FEO1xuICAgICAgICAgIHRoaXMuX3N0YXJ0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGUgPCAweDMwIHx8IDB4MzkgPCBjb2RlKSB7XG4gICAgICAgICAgdGhpcy5fc3RhdGUgPSBPc2NTdGF0ZS5BQk9SVDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lkID09PSAtMSkge1xuICAgICAgICAgIHRoaXMuX2lkID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pZCA9IHRoaXMuX2lkICogMTAgKyBjb2RlIC0gNDg7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gT3NjU3RhdGUuUEFZTE9BRCAmJiBlbmQgLSBzdGFydCA+IDApIHtcbiAgICAgIHRoaXMuX3B1dChkYXRhLCBzdGFydCwgZW5kKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGVuZCBvZiBhbiBPU0MgY29tbWFuZC5cbiAgICogV2hldGhlciB0aGUgT1NDIGdvdCBhYm9ydGVkIG9yIGZpbmlzaGVkIG5vcm1hbGx5XG4gICAqIGlzIGluZGljYXRlZCBieSBgc3VjY2Vzc2AuXG4gICAqL1xuICBwdWJsaWMgZW5kKHN1Y2Nlc3M6IGJvb2xlYW4sIHByb21pc2VSZXN1bHQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB8IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gT3NjU3RhdGUuU1RBUlQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gZG8gbm90aGluZyBpZiBjb21tYW5kIHdhcyBmYXVsdHlcbiAgICBpZiAodGhpcy5fc3RhdGUgIT09IE9zY1N0YXRlLkFCT1JUKSB7XG4gICAgICAvLyBpZiB3ZSBhcmUgc3RpbGwgaW4gSUQgc3RhdGUgYW5kIGdldCBhbiBlYXJseSBlbmRcbiAgICAgIC8vIG1lYW5zIHRoYXQgdGhlIGNvbW1hbmQgaGFzIG5vIHBheWxvYWQgdGh1cyB3ZSBzdGlsbCBoYXZlXG4gICAgICAvLyB0byBhbm5vdW5jZSBTVEFSVCBhbmQgc2VuZCBFTkQgcmlnaHQgYWZ0ZXJcbiAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gT3NjU3RhdGUuSUQpIHtcbiAgICAgICAgdGhpcy5fc3RhcnQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9hY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX2hhbmRsZXJGYih0aGlzLl9pZCwgJ0VORCcsIHN1Y2Nlc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+ID0gZmFsc2U7XG4gICAgICAgIGxldCBqID0gdGhpcy5fYWN0aXZlLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBmYWxsVGhyb3VnaCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fc3RhY2sucGF1c2VkKSB7XG4gICAgICAgICAgaiA9IHRoaXMuX3N0YWNrLmxvb3BQb3NpdGlvbiAtIDE7XG4gICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHByb21pc2VSZXN1bHQ7XG4gICAgICAgICAgZmFsbFRocm91Z2ggPSB0aGlzLl9zdGFjay5mYWxsVGhyb3VnaDtcbiAgICAgICAgICB0aGlzLl9zdGFjay5wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZhbGxUaHJvdWdoICYmIGhhbmRsZXJSZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gdGhpcy5fYWN0aXZlW2pdLmVuZChzdWNjZXNzKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICB0aGlzLl9zdGFjay5wYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB0aGlzLl9zdGFjay5sb29wUG9zaXRpb24gPSBqO1xuICAgICAgICAgICAgICB0aGlzLl9zdGFjay5mYWxsVGhyb3VnaCA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgai0tO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsZWFudXAgbGVmdCBvdmVyIGhhbmRsZXJzXG4gICAgICAgIC8vIHdlIGFsd2F5cyBoYXZlIHRvIGNhbGwgLmVuZCBmb3IgcHJvcGVyIGNsZWFudXAsXG4gICAgICAgIC8vIGhlcmUgd2UgdXNlIGBzdWNjZXNzYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgaGFuZGxlciBzaG91bGQgZXhlY3V0ZVxuICAgICAgICBmb3IgKDsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gdGhpcy5fYWN0aXZlW2pdLmVuZChmYWxzZSk7XG4gICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGFjay5wYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fc3RhY2subG9vcFBvc2l0aW9uID0gajtcbiAgICAgICAgICAgIHRoaXMuX3N0YWNrLmZhbGxUaHJvdWdoID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZSA9IEVNUFRZX0hBTkRMRVJTO1xuICAgIHRoaXMuX2lkID0gLTE7XG4gICAgdGhpcy5fc3RhdGUgPSBPc2NTdGF0ZS5TVEFSVDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlbmllbnQgY2xhc3MgdG8gYWxsb3cgYXR0YWNoaW5nIHN0cmluZyBiYXNlZCBoYW5kbGVyIGZ1bmN0aW9uc1xuICogYXMgT1NDIGhhbmRsZXJzLlxuICovXG5leHBvcnQgY2xhc3MgT3NjSGFuZGxlciBpbXBsZW1lbnRzIElPc2NIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfZGF0YSA9ICcnO1xuICBwcml2YXRlIF9oaXRMaW1pdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2hhbmRsZXI6IChkYXRhOiBzdHJpbmcpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KSB7IH1cblxuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YSA9ICcnO1xuICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcHV0KGRhdGE6IFVpbnQzMkFycmF5LCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9oaXRMaW1pdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhICs9IHV0ZjMyVG9TdHJpbmcoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgaWYgKHRoaXMuX2RhdGEubGVuZ3RoID4gUEFZTE9BRF9MSU1JVCkge1xuICAgICAgdGhpcy5fZGF0YSA9ICcnO1xuICAgICAgdGhpcy5faGl0TGltaXQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlbmQoc3VjY2VzczogYm9vbGVhbik6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgcmV0OiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9oaXRMaW1pdCkge1xuICAgICAgcmV0ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChzdWNjZXNzKSB7XG4gICAgICByZXQgPSB0aGlzLl9oYW5kbGVyKHRoaXMuX2RhdGEpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgLy8gbmVlZCB0byBob2xkIGRhdGEgdW50aWwgYHJldGAgZ290IHJlc29sdmVkXG4gICAgICAgIC8vIGRvbnQgY2FyZSBmb3IgZXJyb3JzLCBkYXRhIHdpbGwgYmUgZnJlZWQgYW55d2F5IG9uIG5leHQgc3RhcnRcbiAgICAgICAgcmV0dXJuIHJldC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5fZGF0YSA9ICcnO1xuICAgICAgICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2RhdGEgPSAnJztcbiAgICB0aGlzLl9oaXRMaW1pdCA9IGZhbHNlO1xuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5pbXBvcnQgeyBJUGFyYW1zLCBQYXJhbXNBcnJheSB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvVHlwZXMnO1xuXG4vLyBtYXggdmFsdWUgc3VwcG9ydGVkIGZvciBhIHNpbmdsZSBwYXJhbS9zdWJwYXJhbSAoY2xhbXBlZCB0byBwb3NpdGl2ZSBpbnQzMiByYW5nZSlcbmNvbnN0IE1BWF9WQUxVRSA9IDB4N0ZGRkZGRkY7XG4vLyBtYXggYWxsb3dlZCBzdWJwYXJhbXMgZm9yIGEgc2luZ2xlIHNlcXVlbmNlIChoYXJkY29kZWQgbGltaXRhdGlvbilcbmNvbnN0IE1BWF9TVUJQQVJBTVMgPSAyNTY7XG5cbi8qKlxuICogUGFyYW1zIHN0b3JhZ2UgY2xhc3MuXG4gKiBUaGlzIHR5cGUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGFjY3VtdWxhdGUgc2VxdWVuY2UgcGFyYW1ldGVycyBhbmQgc3ViIHBhcmFtZXRlcnNcbiAqIGFuZCB0cmFuc21pdCB0aGVtIHRvIHRoZSBpbnB1dCBoYW5kbGVyIGFjdGlvbnMuXG4gKlxuICogTk9URVM6XG4gKiAgLSBwYXJhbXMgb2JqZWN0IGZvciBhY3Rpb24gaGFuZGxlcnMgaXMgYm9ycm93ZWQsIHVzZSBgLnRvQXJyYXlgIG9yIGAuY2xvbmVgIHRvIGdldCBhIGNvcHlcbiAqICAtIG5ldmVyIHJlYWQgYmV5b25kIGBwYXJhbXMubGVuZ3RoIC0gMWAgKGxpa2VseSB0byBjb250YWluIGFyYml0cmFyeSBkYXRhKVxuICogIC0gYC5nZXRTdWJQYXJhbXNgIHJldHVybnMgYSBib3Jyb3dlZCB0eXBlZCBhcnJheSwgdXNlIGAuZ2V0U3ViUGFyYW1zQWxsYCBmb3IgY2xvbmVkIHN1YiBwYXJhbXNcbiAqICAtIGhhcmRjb2RlZCBsaW1pdGF0aW9uczpcbiAqICAgIC0gbWF4LiB2YWx1ZSBmb3IgYSBzaW5nbGUgKHN1YikgcGFyYW0gaXMgMl4zMSAtIDEgKGdyZWF0ZXIgdmFsdWVzIGFyZSBjbGFtcGVkIHRvIHRoYXQpXG4gKiAgICAtIG1heC4gMjU2IHN1YiBwYXJhbXMgcG9zc2libGVcbiAqICAgIC0gbmVnYXRpdmUgdmFsdWVzIGFyZSBub3QgYWxsb3dlZCBiZXNpZGUgLTEgKHBsYWNlaG9sZGVyIGZvciBkZWZhdWx0IHZhbHVlKVxuICpcbiAqIEFib3V0IFpETSAoWmVybyBEZWZhdWx0IE1vZGUpOlxuICogWkRNIGlzIG5vdCBvcmNoZXN0cmF0ZWQgYnkgdGhpcyBjbGFzcy4gSWYgdGhlIHBhcnNlciBpcyBpbiBaRE0sXG4gKiBpdCBzaG91bGQgYWRkIDAgZm9yIGVtcHR5IHBhcmFtcywgb3RoZXJ3aXNlIC0xLiBUaGlzIGRvZXMgbm90IGFwcGx5XG4gKiB0byBzdWJwYXJhbXMsIGVtcHR5IHN1YnBhcmFtcyBzaG91bGQgYWx3YXlzIGJlIGFkZGVkIHdpdGggLTEuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbXMgaW1wbGVtZW50cyBJUGFyYW1zIHtcbiAgLy8gcGFyYW1zIHN0b3JlIGFuZCBsZW5ndGhcbiAgcHVibGljIHBhcmFtczogSW50MzJBcnJheTtcbiAgcHVibGljIGxlbmd0aDogbnVtYmVyO1xuXG4gIC8vIHN1YiBwYXJhbXMgc3RvcmUgYW5kIGxlbmd0aFxuICBwcm90ZWN0ZWQgX3N1YlBhcmFtczogSW50MzJBcnJheTtcbiAgcHJvdGVjdGVkIF9zdWJQYXJhbXNMZW5ndGg6IG51bWJlcjtcblxuICAvLyBzdWIgcGFyYW1zIG9mZnNldHMgZnJvbSBwYXJhbTogcGFyYW0gaWR4IC0tPiBbc3RhcnQsIGVuZF0gb2Zmc2V0XG4gIHByaXZhdGUgX3N1YlBhcmFtc0lkeDogVWludDE2QXJyYXk7XG4gIHByaXZhdGUgX3JlamVjdERpZ2l0czogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfcmVqZWN0U3ViRGlnaXRzOiBib29sZWFuO1xuICBwcml2YXRlIF9kaWdpdElzU3ViOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBgUGFyYW1zYCB0eXBlIGZyb20gSlMgYXJyYXkgcmVwcmVzZW50YXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BcnJheSh2YWx1ZXM6IFBhcmFtc0FycmF5KTogUGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgUGFyYW1zKCk7XG4gICAgaWYgKCF2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICAvLyBza2lwIGxlYWRpbmcgc3ViIHBhcmFtc1xuICAgIGZvciAobGV0IGkgPSAoQXJyYXkuaXNBcnJheSh2YWx1ZXNbMF0pKSA/IDEgOiAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHZhbHVlLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgcGFyYW1zLmFkZFN1YlBhcmFtKHZhbHVlW2tdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zLmFkZFBhcmFtKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWF4TGVuZ3RoIG1heCBsZW5ndGggb2Ygc3RvcmFibGUgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gbWF4U3ViUGFyYW1zTGVuZ3RoIG1heCBsZW5ndGggb2Ygc3RvcmFibGUgc3ViIHBhcmFtZXRlcnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtYXhMZW5ndGg6IG51bWJlciA9IDMyLCBwdWJsaWMgbWF4U3ViUGFyYW1zTGVuZ3RoOiBudW1iZXIgPSAzMikge1xuICAgIGlmIChtYXhTdWJQYXJhbXNMZW5ndGggPiBNQVhfU1VCUEFSQU1TKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21heFN1YlBhcmFtc0xlbmd0aCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMjU2Jyk7XG4gICAgfVxuICAgIHRoaXMucGFyYW1zID0gbmV3IEludDMyQXJyYXkobWF4TGVuZ3RoKTtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fc3ViUGFyYW1zID0gbmV3IEludDMyQXJyYXkobWF4U3ViUGFyYW1zTGVuZ3RoKTtcbiAgICB0aGlzLl9zdWJQYXJhbXNMZW5ndGggPSAwO1xuICAgIHRoaXMuX3N1YlBhcmFtc0lkeCA9IG5ldyBVaW50MTZBcnJheShtYXhMZW5ndGgpO1xuICAgIHRoaXMuX3JlamVjdERpZ2l0cyA9IGZhbHNlO1xuICAgIHRoaXMuX3JlamVjdFN1YkRpZ2l0cyA9IGZhbHNlO1xuICAgIHRoaXMuX2RpZ2l0SXNTdWIgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgY2xvbmUoKTogUGFyYW1zIHtcbiAgICBjb25zdCBuZXdQYXJhbXMgPSBuZXcgUGFyYW1zKHRoaXMubWF4TGVuZ3RoLCB0aGlzLm1heFN1YlBhcmFtc0xlbmd0aCk7XG4gICAgbmV3UGFyYW1zLnBhcmFtcy5zZXQodGhpcy5wYXJhbXMpO1xuICAgIG5ld1BhcmFtcy5sZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICBuZXdQYXJhbXMuX3N1YlBhcmFtcy5zZXQodGhpcy5fc3ViUGFyYW1zKTtcbiAgICBuZXdQYXJhbXMuX3N1YlBhcmFtc0xlbmd0aCA9IHRoaXMuX3N1YlBhcmFtc0xlbmd0aDtcbiAgICBuZXdQYXJhbXMuX3N1YlBhcmFtc0lkeC5zZXQodGhpcy5fc3ViUGFyYW1zSWR4KTtcbiAgICBuZXdQYXJhbXMuX3JlamVjdERpZ2l0cyA9IHRoaXMuX3JlamVjdERpZ2l0cztcbiAgICBuZXdQYXJhbXMuX3JlamVjdFN1YkRpZ2l0cyA9IHRoaXMuX3JlamVjdFN1YkRpZ2l0cztcbiAgICBuZXdQYXJhbXMuX2RpZ2l0SXNTdWIgPSB0aGlzLl9kaWdpdElzU3ViO1xuICAgIHJldHVybiBuZXdQYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgSlMgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgcGFyYW1ldGVycyBhbmQgc3ViIHBhcmFtZXRlcnMuXG4gICAqIFRoZSBhcnJheSBpcyBzdHJ1Y3R1cmVkIGFzIGZvbGxvd3M6XG4gICAqICAgIHNlcXVlbmNlOiBcIjE7MjozOjQ7NTo6NlwiXG4gICAqICAgIGFycmF5ICAgOiBbMSwgMiwgWzMsIDRdLCA1LCBbLTEsIDZdXVxuICAgKi9cbiAgcHVibGljIHRvQXJyYXkoKTogUGFyYW1zQXJyYXkge1xuICAgIGNvbnN0IHJlczogUGFyYW1zQXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHJlcy5wdXNoKHRoaXMucGFyYW1zW2ldKTtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fc3ViUGFyYW1zSWR4W2ldID4+IDg7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLl9zdWJQYXJhbXNJZHhbaV0gJiAweEZGO1xuICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gMCkge1xuICAgICAgICByZXMucHVzaChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9zdWJQYXJhbXMsIHN0YXJ0LCBlbmQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0byBpbml0aWFsIGVtcHR5IHN0YXRlLlxuICAgKi9cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9zdWJQYXJhbXNMZW5ndGggPSAwO1xuICAgIHRoaXMuX3JlamVjdERpZ2l0cyA9IGZhbHNlO1xuICAgIHRoaXMuX3JlamVjdFN1YkRpZ2l0cyA9IGZhbHNlO1xuICAgIHRoaXMuX2RpZ2l0SXNTdWIgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXJhbWV0ZXIgdmFsdWUuXG4gICAqIGBQYXJhbXNgIG9ubHkgc3RvcmVzIHVwIHRvIGBtYXhMZW5ndGhgIHBhcmFtZXRlcnMsIGFueSBsYXRlclxuICAgKiBwYXJhbWV0ZXIgd2lsbCBiZSBpZ25vcmVkLlxuICAgKiBOb3RlOiBWVCBkZXZpY2VzIG9ubHkgc3RvcmVkIHVwIHRvIDE2IHZhbHVlcywgeHRlcm0gc2VlbXMgdG9cbiAgICogc3RvcmUgdXAgdG8gMzAuXG4gICAqL1xuICBwdWJsaWMgYWRkUGFyYW0odmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2RpZ2l0SXNTdWIgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5sZW5ndGggPj0gdGhpcy5tYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMuX3JlamVjdERpZ2l0cyA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWx1ZSA8IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbHVlcyBsZXNzZXIgdGhhbiAtMSBhcmUgbm90IGFsbG93ZWQnKTtcbiAgICB9XG4gICAgdGhpcy5fc3ViUGFyYW1zSWR4W3RoaXMubGVuZ3RoXSA9IHRoaXMuX3N1YlBhcmFtc0xlbmd0aCA8PCA4IHwgdGhpcy5fc3ViUGFyYW1zTGVuZ3RoO1xuICAgIHRoaXMucGFyYW1zW3RoaXMubGVuZ3RoKytdID0gdmFsdWUgPiBNQVhfVkFMVUUgPyBNQVhfVkFMVUUgOiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBzdWIgcGFyYW1ldGVyIHZhbHVlLlxuICAgKiBUaGUgc3ViIHBhcmFtZXRlciBpcyBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGFzdCBwYXJhbWV0ZXIgdmFsdWUuXG4gICAqIFRodXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGFkZCBhIHN1YnBhcmFtZXRlciB3aXRob3V0IGFueSBwYXJhbWV0ZXIgYWRkZWQgeWV0LlxuICAgKiBgUGFyYW1zYCBvbmx5IHN0b3JlcyB1cCB0byBgc3ViUGFyYW1zTGVuZ3RoYCBzdWIgcGFyYW1ldGVycywgYW55IGxhdGVyXG4gICAqIHN1YiBwYXJhbWV0ZXIgd2lsbCBiZSBpZ25vcmVkLlxuICAgKi9cbiAgcHVibGljIGFkZFN1YlBhcmFtKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9kaWdpdElzU3ViID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZWplY3REaWdpdHMgfHwgdGhpcy5fc3ViUGFyYW1zTGVuZ3RoID49IHRoaXMubWF4U3ViUGFyYW1zTGVuZ3RoKSB7XG4gICAgICB0aGlzLl9yZWplY3RTdWJEaWdpdHMgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPCAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMgbGVzc2VyIHRoYW4gLTEgYXJlIG5vdCBhbGxvd2VkJyk7XG4gICAgfVxuICAgIHRoaXMuX3N1YlBhcmFtc1t0aGlzLl9zdWJQYXJhbXNMZW5ndGgrK10gPSB2YWx1ZSA+IE1BWF9WQUxVRSA/IE1BWF9WQUxVRSA6IHZhbHVlO1xuICAgIHRoaXMuX3N1YlBhcmFtc0lkeFt0aGlzLmxlbmd0aCAtIDFdKys7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBwYXJhbWV0ZXIgYXQgaW5kZXggYGlkeGAgaGFzIHN1YiBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGhhc1N1YlBhcmFtcyhpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoKHRoaXMuX3N1YlBhcmFtc0lkeFtpZHhdICYgMHhGRikgLSAodGhpcy5fc3ViUGFyYW1zSWR4W2lkeF0gPj4gOCkgPiAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc3ViIHBhcmFtZXRlcnMgZm9yIHBhcmFtZXRlciBhdCBpbmRleCBgaWR4YC5cbiAgICogTm90ZTogVGhlIHZhbHVlcyBhcmUgYm9ycm93ZWQsIHRodXMgeW91IG5lZWQgdG8gY29weVxuICAgKiB0aGUgdmFsdWVzIGlmIHlvdSBuZWVkIHRvIGhvbGQgdGhlbSBpbiBub25sb2NhbCBzY29wZS5cbiAgICovXG4gIHB1YmxpYyBnZXRTdWJQYXJhbXMoaWR4OiBudW1iZXIpOiBJbnQzMkFycmF5IHwgbnVsbCB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9zdWJQYXJhbXNJZHhbaWR4XSA+PiA4O1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX3N1YlBhcmFtc0lkeFtpZHhdICYgMHhGRjtcbiAgICBpZiAoZW5kIC0gc3RhcnQgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3ViUGFyYW1zLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIHN1YiBwYXJhbWV0ZXJzIGFzIHtpZHg6IHN1YnBhcmFtc30gbWFwcGluZy5cbiAgICogTm90ZTogVGhlIHZhbHVlcyBhcmUgbm90IGJvcnJvd2VkLlxuICAgKi9cbiAgcHVibGljIGdldFN1YlBhcmFtc0FsbCgpOiB7W2lkeDogbnVtYmVyXTogSW50MzJBcnJheX0ge1xuICAgIGNvbnN0IHJlc3VsdDoge1tpZHg6IG51bWJlcl06IEludDMyQXJyYXl9ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N1YlBhcmFtc0lkeFtpXSA+PiA4O1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5fc3ViUGFyYW1zSWR4W2ldICYgMHhGRjtcbiAgICAgIGlmIChlbmQgLSBzdGFydCA+IDApIHtcbiAgICAgICAgcmVzdWx0W2ldID0gdGhpcy5fc3ViUGFyYW1zLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNpbmdsZSBkaWdpdCB2YWx1ZSB0byBjdXJyZW50IHBhcmFtZXRlci5cbiAgICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgdG8gYWNjb3VudCBkaWdpdHMgb24gYSBjaGFyIGJ5IGNoYXIgYmFzaXMuXG4gICAqL1xuICBwdWJsaWMgYWRkRGlnaXQodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBsZW5ndGg7XG4gICAgaWYgKHRoaXMuX3JlamVjdERpZ2l0c1xuICAgICAgfHwgIShsZW5ndGggPSB0aGlzLl9kaWdpdElzU3ViID8gdGhpcy5fc3ViUGFyYW1zTGVuZ3RoIDogdGhpcy5sZW5ndGgpXG4gICAgICB8fCAodGhpcy5fZGlnaXRJc1N1YiAmJiB0aGlzLl9yZWplY3RTdWJEaWdpdHMpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLl9kaWdpdElzU3ViID8gdGhpcy5fc3ViUGFyYW1zIDogdGhpcy5wYXJhbXM7XG4gICAgY29uc3QgY3VyID0gc3RvcmVbbGVuZ3RoIC0gMV07XG4gICAgc3RvcmVbbGVuZ3RoIC0gMV0gPSB+Y3VyID8gTWF0aC5taW4oY3VyICogMTAgKyB2YWx1ZSwgTUFYX1ZBTFVFKSA6IHZhbHVlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJVGVybWluYWxBZGRvbiwgSURpc3Bvc2FibGUsIFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuZXhwb3J0IGludGVyZmFjZSBJTG9hZGVkQWRkb24ge1xuICBpbnN0YW5jZTogSVRlcm1pbmFsQWRkb247XG4gIGRpc3Bvc2U6ICgpID0+IHZvaWQ7XG4gIGlzRGlzcG9zZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBBZGRvbk1hbmFnZXIgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7XG4gIHByb3RlY3RlZCBfYWRkb25zOiBJTG9hZGVkQWRkb25bXSA9IFtdO1xuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLl9hZGRvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMuX2FkZG9uc1tpXS5pbnN0YW5jZS5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGxvYWRBZGRvbih0ZXJtaW5hbDogVGVybWluYWwsIGluc3RhbmNlOiBJVGVybWluYWxBZGRvbik6IHZvaWQge1xuICAgIGNvbnN0IGxvYWRlZEFkZG9uOiBJTG9hZGVkQWRkb24gPSB7XG4gICAgICBpbnN0YW5jZSxcbiAgICAgIGRpc3Bvc2U6IGluc3RhbmNlLmRpc3Bvc2UsXG4gICAgICBpc0Rpc3Bvc2VkOiBmYWxzZVxuICAgIH07XG4gICAgdGhpcy5fYWRkb25zLnB1c2gobG9hZGVkQWRkb24pO1xuICAgIGluc3RhbmNlLmRpc3Bvc2UgPSAoKSA9PiB0aGlzLl93cmFwcGVkQWRkb25EaXNwb3NlKGxvYWRlZEFkZG9uKTtcbiAgICBpbnN0YW5jZS5hY3RpdmF0ZSh0ZXJtaW5hbCBhcyBhbnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfd3JhcHBlZEFkZG9uRGlzcG9zZShsb2FkZWRBZGRvbjogSUxvYWRlZEFkZG9uKTogdm9pZCB7XG4gICAgaWYgKGxvYWRlZEFkZG9uLmlzRGlzcG9zZWQpIHtcbiAgICAgIC8vIERvIG5vdGhpbmcgaWYgYWxyZWFkeSBkaXNwb3NlZFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2FkZG9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2FkZG9uc1tpXSA9PT0gbG9hZGVkQWRkb24pIHtcbiAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZGlzcG9zZSBhbiBhZGRvbiB0aGF0IGhhcyBub3QgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG4gICAgbG9hZGVkQWRkb24uaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgbG9hZGVkQWRkb24uZGlzcG9zZS5hcHBseShsb2FkZWRBZGRvbi5pbnN0YW5jZSk7XG4gICAgdGhpcy5fYWRkb25zLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElCdWZmZXIgYXMgSUJ1ZmZlckFwaSwgSUJ1ZmZlckxpbmUgYXMgSUJ1ZmZlckxpbmVBcGksIElCdWZmZXJDZWxsIGFzIElCdWZmZXJDZWxsQXBpIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IElCdWZmZXIgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IEJ1ZmZlckxpbmVBcGlWaWV3IH0gZnJvbSAnY29tbW9uL3B1YmxpYy9CdWZmZXJMaW5lQXBpVmlldyc7XG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuXG5leHBvcnQgY2xhc3MgQnVmZmVyQXBpVmlldyBpbXBsZW1lbnRzIElCdWZmZXJBcGkge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9idWZmZXI6IElCdWZmZXIsXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6ICdub3JtYWwnIHwgJ2FsdGVybmF0ZSdcbiAgKSB7IH1cblxuICBwdWJsaWMgaW5pdChidWZmZXI6IElCdWZmZXIpOiBCdWZmZXJBcGlWaWV3IHtcbiAgICB0aGlzLl9idWZmZXIgPSBidWZmZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnNvclkoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2J1ZmZlci55OyB9XG4gIHB1YmxpYyBnZXQgY3Vyc29yWCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fYnVmZmVyLng7IH1cbiAgcHVibGljIGdldCB2aWV3cG9ydFkoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2J1ZmZlci55ZGlzcDsgfVxuICBwdWJsaWMgZ2V0IGJhc2VZKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9idWZmZXIueWJhc2U7IH1cbiAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2J1ZmZlci5saW5lcy5sZW5ndGg7IH1cbiAgcHVibGljIGdldExpbmUoeTogbnVtYmVyKTogSUJ1ZmZlckxpbmVBcGkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9idWZmZXIubGluZXMuZ2V0KHkpO1xuICAgIGlmICghbGluZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBCdWZmZXJMaW5lQXBpVmlldyhsaW5lKTtcbiAgfVxuICBwdWJsaWMgZ2V0TnVsbENlbGwoKTogSUJ1ZmZlckNlbGxBcGkgeyByZXR1cm4gbmV3IENlbGxEYXRhKCk7IH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBJQnVmZmVyTGluZSwgSUNlbGxEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IElCdWZmZXJDZWxsIGFzIElCdWZmZXJDZWxsQXBpLCBJQnVmZmVyTGluZSBhcyBJQnVmZmVyTGluZUFwaSB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5cbmV4cG9ydCBjbGFzcyBCdWZmZXJMaW5lQXBpVmlldyBpbXBsZW1lbnRzIElCdWZmZXJMaW5lQXBpIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbGluZTogSUJ1ZmZlckxpbmUpIHsgfVxuXG4gIHB1YmxpYyBnZXQgaXNXcmFwcGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fbGluZS5pc1dyYXBwZWQ7IH1cbiAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2xpbmUubGVuZ3RoOyB9XG4gIHB1YmxpYyBnZXRDZWxsKHg6IG51bWJlciwgY2VsbD86IElCdWZmZXJDZWxsQXBpKTogSUJ1ZmZlckNlbGxBcGkgfCB1bmRlZmluZWQge1xuICAgIGlmICh4IDwgMCB8fCB4ID49IHRoaXMuX2xpbmUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChjZWxsKSB7XG4gICAgICB0aGlzLl9saW5lLmxvYWRDZWxsKHgsIGNlbGwgYXMgSUNlbGxEYXRhKTtcbiAgICAgIHJldHVybiBjZWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbGluZS5sb2FkQ2VsbCh4LCBuZXcgQ2VsbERhdGEoKSk7XG4gIH1cbiAgcHVibGljIHRyYW5zbGF0ZVRvU3RyaW5nKHRyaW1SaWdodD86IGJvb2xlYW4sIHN0YXJ0Q29sdW1uPzogbnVtYmVyLCBlbmRDb2x1bW4/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9saW5lLnRyYW5zbGF0ZVRvU3RyaW5nKHRyaW1SaWdodCwgc3RhcnRDb2x1bW4sIGVuZENvbHVtbik7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElCdWZmZXIgYXMgSUJ1ZmZlckFwaSwgSUJ1ZmZlck5hbWVzcGFjZSBhcyBJQnVmZmVyTmFtZXNwYWNlQXBpIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IEJ1ZmZlckFwaVZpZXcgfSBmcm9tICdjb21tb24vcHVibGljL0J1ZmZlckFwaVZpZXcnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJQ29yZVRlcm1pbmFsIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcblxuZXhwb3J0IGNsYXNzIEJ1ZmZlck5hbWVzcGFjZUFwaSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJQnVmZmVyTmFtZXNwYWNlQXBpIHtcbiAgcHJpdmF0ZSBfbm9ybWFsOiBCdWZmZXJBcGlWaWV3O1xuICBwcml2YXRlIF9hbHRlcm5hdGU6IEJ1ZmZlckFwaVZpZXc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25CdWZmZXJDaGFuZ2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SUJ1ZmZlckFwaT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkJ1ZmZlckNoYW5nZSA9IHRoaXMuX29uQnVmZmVyQ2hhbmdlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NvcmU6IElDb3JlVGVybWluYWwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX25vcm1hbCA9IG5ldyBCdWZmZXJBcGlWaWV3KHRoaXMuX2NvcmUuYnVmZmVycy5ub3JtYWwsICdub3JtYWwnKTtcbiAgICB0aGlzLl9hbHRlcm5hdGUgPSBuZXcgQnVmZmVyQXBpVmlldyh0aGlzLl9jb3JlLmJ1ZmZlcnMuYWx0LCAnYWx0ZXJuYXRlJyk7XG4gICAgdGhpcy5fY29yZS5idWZmZXJzLm9uQnVmZmVyQWN0aXZhdGUoKCkgPT4gdGhpcy5fb25CdWZmZXJDaGFuZ2UuZmlyZSh0aGlzLmFjdGl2ZSkpO1xuICB9XG4gIHB1YmxpYyBnZXQgYWN0aXZlKCk6IElCdWZmZXJBcGkge1xuICAgIGlmICh0aGlzLl9jb3JlLmJ1ZmZlcnMuYWN0aXZlID09PSB0aGlzLl9jb3JlLmJ1ZmZlcnMubm9ybWFsKSB7IHJldHVybiB0aGlzLm5vcm1hbDsgfVxuICAgIGlmICh0aGlzLl9jb3JlLmJ1ZmZlcnMuYWN0aXZlID09PSB0aGlzLl9jb3JlLmJ1ZmZlcnMuYWx0KSB7IHJldHVybiB0aGlzLmFsdGVybmF0ZTsgfVxuICAgIHRocm93IG5ldyBFcnJvcignQWN0aXZlIGJ1ZmZlciBpcyBuZWl0aGVyIG5vcm1hbCBub3IgYWx0ZXJuYXRlJyk7XG4gIH1cbiAgcHVibGljIGdldCBub3JtYWwoKTogSUJ1ZmZlckFwaSB7XG4gICAgcmV0dXJuIHRoaXMuX25vcm1hbC5pbml0KHRoaXMuX2NvcmUuYnVmZmVycy5ub3JtYWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgYWx0ZXJuYXRlKCk6IElCdWZmZXJBcGkge1xuICAgIHJldHVybiB0aGlzLl9hbHRlcm5hdGUuaW5pdCh0aGlzLl9jb3JlLmJ1ZmZlcnMuYWx0KTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSVBhcmFtcyB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSURpc3Bvc2FibGUsIElGdW5jdGlvbklkZW50aWZpZXIsIElQYXJzZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgSUNvcmVUZXJtaW5hbCB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBQYXJzZXJBcGkgaW1wbGVtZW50cyBJUGFyc2VyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY29yZTogSUNvcmVUZXJtaW5hbCkgeyB9XG5cbiAgcHVibGljIHJlZ2lzdGVyQ3NpSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgY2FsbGJhY2s6IChwYXJhbXM6IChudW1iZXIgfCBudW1iZXJbXSlbXSkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUucmVnaXN0ZXJDc2lIYW5kbGVyKGlkLCAocGFyYW1zOiBJUGFyYW1zKSA9PiBjYWxsYmFjayhwYXJhbXMudG9BcnJheSgpKSk7XG4gIH1cbiAgcHVibGljIGFkZENzaUhhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGNhbGxiYWNrOiAocGFyYW1zOiAobnVtYmVyIHwgbnVtYmVyW10pW10pID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyQ3NpSGFuZGxlcihpZCwgY2FsbGJhY2spO1xuICB9XG4gIHB1YmxpYyByZWdpc3RlckRjc0hhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGNhbGxiYWNrOiAoZGF0YTogc3RyaW5nLCBwYXJhbTogKG51bWJlciB8IG51bWJlcltdKVtdKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5yZWdpc3RlckRjc0hhbmRsZXIoaWQsIChkYXRhOiBzdHJpbmcsIHBhcmFtczogSVBhcmFtcykgPT4gY2FsbGJhY2soZGF0YSwgcGFyYW1zLnRvQXJyYXkoKSkpO1xuICB9XG4gIHB1YmxpYyBhZGREY3NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZywgcGFyYW06IChudW1iZXIgfCBudW1iZXJbXSlbXSkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJEY3NIYW5kbGVyKGlkLCBjYWxsYmFjayk7XG4gIH1cbiAgcHVibGljIHJlZ2lzdGVyRXNjSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUucmVnaXN0ZXJFc2NIYW5kbGVyKGlkLCBoYW5kbGVyKTtcbiAgfVxuICBwdWJsaWMgYWRkRXNjSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJFc2NIYW5kbGVyKGlkLCBoYW5kbGVyKTtcbiAgfVxuICBwdWJsaWMgcmVnaXN0ZXJPc2NIYW5kbGVyKGlkZW50OiBudW1iZXIsIGNhbGxiYWNrOiAoZGF0YTogc3RyaW5nKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5yZWdpc3Rlck9zY0hhbmRsZXIoaWRlbnQsIGNhbGxiYWNrKTtcbiAgfVxuICBwdWJsaWMgYWRkT3NjSGFuZGxlcihpZGVudDogbnVtYmVyLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJPc2NIYW5kbGVyKGlkZW50LCBjYWxsYmFjayk7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb3JlVGVybWluYWwgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgSVVuaWNvZGVIYW5kbGluZywgSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgY2xhc3MgVW5pY29kZUFwaSBpbXBsZW1lbnRzIElVbmljb2RlSGFuZGxpbmcge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb3JlOiBJQ29yZVRlcm1pbmFsKSB7IH1cblxuICBwdWJsaWMgcmVnaXN0ZXIocHJvdmlkZXI6IElVbmljb2RlVmVyc2lvblByb3ZpZGVyKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS51bmljb2RlU2VydmljZS5yZWdpc3Rlcihwcm92aWRlcik7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZlcnNpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZS51bmljb2RlU2VydmljZS52ZXJzaW9ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb3JlLnVuaWNvZGVTZXJ2aWNlLmFjdGl2ZVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZVZlcnNpb24odmVyc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29yZS51bmljb2RlU2VydmljZS5hY3RpdmVWZXJzaW9uID0gdmVyc2lvbjtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJQXR0cmlidXRlRGF0YSwgSUJ1ZmZlckxpbmUsIFNjcm9sbFNvdXJjZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL0J1ZmZlclNldCc7XG5pbXBvcnQgeyBJQnVmZmVyLCBJQnVmZmVyU2V0IH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGNvbnN0IE1JTklNVU1fQ09MUyA9IDI7IC8vIExlc3MgdGhhbiAyIGNhbiBtZXNzIHdpdGggd2lkZSBjaGFyc1xuZXhwb3J0IGNvbnN0IE1JTklNVU1fUk9XUyA9IDE7XG5cbmV4cG9ydCBjbGFzcyBCdWZmZXJTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElCdWZmZXJTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogYW55O1xuXG4gIHB1YmxpYyBjb2xzOiBudW1iZXI7XG4gIHB1YmxpYyByb3dzOiBudW1iZXI7XG4gIHB1YmxpYyBidWZmZXJzOiBJQnVmZmVyU2V0O1xuICAvKiogV2hldGhlciB0aGUgdXNlciBpcyBzY3JvbGxpbmcgKGxvY2tzIHRoZSBzY3JvbGwgcG9zaXRpb24pICovXG4gIHB1YmxpYyBpc1VzZXJTY3JvbGxpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlc2l6ZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7IGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyIH0+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXNpemUgPSB0aGlzLl9vblJlc2l6ZS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25TY3JvbGwgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uU2Nyb2xsID0gdGhpcy5fb25TY3JvbGwuZXZlbnQ7XG5cbiAgcHVibGljIGdldCBidWZmZXIoKTogSUJ1ZmZlciB7IHJldHVybiB0aGlzLmJ1ZmZlcnMuYWN0aXZlOyB9XG5cbiAgLyoqIEFuIElCdWZmZXJsaW5lIHRvIGNsb25lL2NvcHkgZnJvbSBmb3IgbmV3IGJsYW5rIGxpbmVzICovXG4gIHByaXZhdGUgX2NhY2hlZEJsYW5rTGluZTogSUJ1ZmZlckxpbmUgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoQElPcHRpb25zU2VydmljZSBvcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbHMgPSBNYXRoLm1heChvcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmNvbHMgfHwgMCwgTUlOSU1VTV9DT0xTKTtcbiAgICB0aGlzLnJvd3MgPSBNYXRoLm1heChvcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnJvd3MgfHwgMCwgTUlOSU1VTV9ST1dTKTtcbiAgICB0aGlzLmJ1ZmZlcnMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBCdWZmZXJTZXQob3B0aW9uc1NlcnZpY2UsIHRoaXMpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHMgPSBjb2xzO1xuICAgIHRoaXMucm93cyA9IHJvd3M7XG4gICAgdGhpcy5idWZmZXJzLnJlc2l6ZShjb2xzLCByb3dzKTtcbiAgICAvLyBUT0RPOiBUaGlzIGRvZXNuJ3QgZmlyZSB3aGVuIHNjcm9sbGJhY2sgY2hhbmdlcyAtIGFkZCBhIHJlc2l6ZSBldmVudCB0byBCdWZmZXJTZXQgYW5kIGZvcndhcmRcbiAgICAvLyAgICAgICBldmVudFxuICAgIHRoaXMuX29uUmVzaXplLmZpcmUoeyBjb2xzLCByb3dzIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVycy5yZXNldCgpO1xuICAgIHRoaXMuaXNVc2VyU2Nyb2xsaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIHRoZSB0ZXJtaW5hbCBkb3duIDEgcm93LCBjcmVhdGluZyBhIGJsYW5rIGxpbmUuXG4gICAqIEBwYXJhbSBlcmFzZUF0dHIgVGhlIGF0dHJpYnV0ZSBkYXRhIHRvIHVzZSB0aGUgZm9yIGJsYW5rIGxpbmUuXG4gICAqIEBwYXJhbSBpc1dyYXBwZWQgV2hldGhlciB0aGUgbmV3IGxpbmUgaXMgd3JhcHBlZCBmcm9tIHRoZSBwcmV2aW91cyBsaW5lLlxuICAgKi9cbiAgcHVibGljIHNjcm9sbChlcmFzZUF0dHI6IElBdHRyaWJ1dGVEYXRhLCBpc1dyYXBwZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuXG4gICAgbGV0IG5ld0xpbmU6IElCdWZmZXJMaW5lIHwgdW5kZWZpbmVkO1xuICAgIG5ld0xpbmUgPSB0aGlzLl9jYWNoZWRCbGFua0xpbmU7XG4gICAgaWYgKCFuZXdMaW5lIHx8IG5ld0xpbmUubGVuZ3RoICE9PSB0aGlzLmNvbHMgfHwgbmV3TGluZS5nZXRGZygwKSAhPT0gZXJhc2VBdHRyLmZnIHx8IG5ld0xpbmUuZ2V0QmcoMCkgIT09IGVyYXNlQXR0ci5iZykge1xuICAgICAgbmV3TGluZSA9IGJ1ZmZlci5nZXRCbGFua0xpbmUoZXJhc2VBdHRyLCBpc1dyYXBwZWQpO1xuICAgICAgdGhpcy5fY2FjaGVkQmxhbmtMaW5lID0gbmV3TGluZTtcbiAgICB9XG4gICAgbmV3TGluZS5pc1dyYXBwZWQgPSBpc1dyYXBwZWQ7XG5cbiAgICBjb25zdCB0b3BSb3cgPSBidWZmZXIueWJhc2UgKyBidWZmZXIuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IGJvdHRvbVJvdyA9IGJ1ZmZlci55YmFzZSArIGJ1ZmZlci5zY3JvbGxCb3R0b207XG5cbiAgICBpZiAoYnVmZmVyLnNjcm9sbFRvcCA9PT0gMCkge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyBnb2luZyB0byBiZSB0cmltbWVkIGFmdGVyIGluc2VydGlvbi5cbiAgICAgIGNvbnN0IHdpbGxCdWZmZXJCZVRyaW1tZWQgPSBidWZmZXIubGluZXMuaXNGdWxsO1xuXG4gICAgICAvLyBJbnNlcnQgdGhlIGxpbmUgdXNpbmcgdGhlIGZhc3Rlc3QgbWV0aG9kXG4gICAgICBpZiAoYm90dG9tUm93ID09PSBidWZmZXIubGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAod2lsbEJ1ZmZlckJlVHJpbW1lZCkge1xuICAgICAgICAgIGJ1ZmZlci5saW5lcy5yZWN5Y2xlKCkuY29weUZyb20obmV3TGluZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVmZmVyLmxpbmVzLnB1c2gobmV3TGluZS5jbG9uZSgpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyLmxpbmVzLnNwbGljZShib3R0b21Sb3cgKyAxLCAwLCBuZXdMaW5lLmNsb25lKCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IGFkanVzdCB5YmFzZSBhbmQgeWRpc3Agd2hlbiB0aGUgYnVmZmVyIGlzIG5vdCB0cmltbWVkXG4gICAgICBpZiAoIXdpbGxCdWZmZXJCZVRyaW1tZWQpIHtcbiAgICAgICAgYnVmZmVyLnliYXNlKys7XG4gICAgICAgIC8vIE9ubHkgc2Nyb2xsIHRoZSB5ZGlzcCB3aXRoIHliYXNlIGlmIHRoZSB1c2VyIGhhcyBub3Qgc2Nyb2xsZWQgdXBcbiAgICAgICAgaWYgKCF0aGlzLmlzVXNlclNjcm9sbGluZykge1xuICAgICAgICAgIGJ1ZmZlci55ZGlzcCsrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXaGVuIHRoZSBidWZmZXIgaXMgZnVsbCBhbmQgdGhlIHVzZXIgaGFzIHNjcm9sbGVkIHVwLCBrZWVwIHRoZSB0ZXh0XG4gICAgICAgIC8vIHN0YWJsZSB1bmxlc3MgeWRpc3AgaXMgcmlnaHQgYXQgdGhlIHRvcFxuICAgICAgICBpZiAodGhpcy5pc1VzZXJTY3JvbGxpbmcpIHtcbiAgICAgICAgICBidWZmZXIueWRpc3AgPSBNYXRoLm1heChidWZmZXIueWRpc3AgLSAxLCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzY3JvbGxUb3AgaXMgbm9uLXplcm8gd2hpY2ggbWVhbnMgbm8gbGluZSB3aWxsIGJlIGdvaW5nIHRvIHRoZVxuICAgICAgLy8gc2Nyb2xsYmFjaywgaW5zdGVhZCB3ZSBjYW4ganVzdCBzaGlmdCB0aGVtIGluLXBsYWNlLlxuICAgICAgY29uc3Qgc2Nyb2xsUmVnaW9uSGVpZ2h0ID0gYm90dG9tUm93IC0gdG9wUm93ICsgMSAvKiBhcyBpdCdzIHplcm8tYmFzZWQgKi87XG4gICAgICBidWZmZXIubGluZXMuc2hpZnRFbGVtZW50cyh0b3BSb3cgKyAxLCBzY3JvbGxSZWdpb25IZWlnaHQgLSAxLCAtMSk7XG4gICAgICBidWZmZXIubGluZXMuc2V0KGJvdHRvbVJvdywgbmV3TGluZS5jbG9uZSgpKTtcbiAgICB9XG5cbiAgICAvLyBNb3ZlIHRoZSB2aWV3cG9ydCB0byB0aGUgYm90dG9tIG9mIHRoZSBidWZmZXIgdW5sZXNzIHRoZSB1c2VyIGlzXG4gICAgLy8gc2Nyb2xsaW5nLlxuICAgIGlmICghdGhpcy5pc1VzZXJTY3JvbGxpbmcpIHtcbiAgICAgIGJ1ZmZlci55ZGlzcCA9IGJ1ZmZlci55YmFzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9vblNjcm9sbC5maXJlKGJ1ZmZlci55ZGlzcCk7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIHRoZSBkaXNwbGF5IG9mIHRoZSB0ZXJtaW5hbFxuICAgKiBAcGFyYW0gZGlzcCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRvIHNjcm9sbCBkb3duIChuZWdhdGl2ZSBzY3JvbGwgdXApLlxuICAgKiBAcGFyYW0gc3VwcHJlc3NTY3JvbGxFdmVudCBEb24ndCBlbWl0IHRoZSBzY3JvbGwgZXZlbnQgYXMgc2Nyb2xsTGluZXMuIFRoaXMgaXMgdXNlZFxuICAgKiB0byBhdm9pZCB1bndhbnRlZCBldmVudHMgYmVpbmcgaGFuZGxlZCBieSB0aGUgdmlld3BvcnQgd2hlbiB0aGUgZXZlbnQgd2FzIHRyaWdnZXJlZCBmcm9tIHRoZVxuICAgKiB2aWV3cG9ydCBvcmlnaW5hbGx5LlxuICAgKi9cbiAgcHVibGljIHNjcm9sbExpbmVzKGRpc3A6IG51bWJlciwgc3VwcHJlc3NTY3JvbGxFdmVudD86IGJvb2xlYW4sIHNvdXJjZT86IFNjcm9sbFNvdXJjZSk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgIGlmIChkaXNwIDwgMCkge1xuICAgICAgaWYgKGJ1ZmZlci55ZGlzcCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmlzVXNlclNjcm9sbGluZyA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkaXNwICsgYnVmZmVyLnlkaXNwID49IGJ1ZmZlci55YmFzZSkge1xuICAgICAgdGhpcy5pc1VzZXJTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRZZGlzcCA9IGJ1ZmZlci55ZGlzcDtcbiAgICBidWZmZXIueWRpc3AgPSBNYXRoLm1heChNYXRoLm1pbihidWZmZXIueWRpc3AgKyBkaXNwLCBidWZmZXIueWJhc2UpLCAwKTtcblxuICAgIC8vIE5vIGNoYW5nZSBvY2N1cnJlZCwgZG9uJ3QgdHJpZ2dlciBzY3JvbGwvcmVmcmVzaFxuICAgIGlmIChvbGRZZGlzcCA9PT0gYnVmZmVyLnlkaXNwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFzdXBwcmVzc1Njcm9sbEV2ZW50KSB7XG4gICAgICB0aGlzLl9vblNjcm9sbC5maXJlKGJ1ZmZlci55ZGlzcCk7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ2hhcnNldFNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNoYXJzZXQgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ2hhcnNldFNlcnZpY2UgaW1wbGVtZW50cyBJQ2hhcnNldFNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgcHVibGljIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgZ2xldmVsOiBudW1iZXIgPSAwO1xuXG4gIHByaXZhdGUgX2NoYXJzZXRzOiAoSUNoYXJzZXQgfCB1bmRlZmluZWQpW10gPSBbXTtcblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFyc2V0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NoYXJzZXRzID0gW107XG4gICAgdGhpcy5nbGV2ZWwgPSAwO1xuICB9XG5cbiAgcHVibGljIHNldGdMZXZlbChnOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmdsZXZlbCA9IGc7XG4gICAgdGhpcy5jaGFyc2V0ID0gdGhpcy5fY2hhcnNldHNbZ107XG4gIH1cblxuICBwdWJsaWMgc2V0Z0NoYXJzZXQoZzogbnVtYmVyLCBjaGFyc2V0OiBJQ2hhcnNldCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuX2NoYXJzZXRzW2ddID0gY2hhcnNldDtcbiAgICBpZiAodGhpcy5nbGV2ZWwgPT09IGcpIHtcbiAgICAgIHRoaXMuY2hhcnNldCA9IGNoYXJzZXQ7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElDb3JlU2VydmljZSwgSUNvcmVNb3VzZVNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJQ29yZU1vdXNlUHJvdG9jb2wsIElDb3JlTW91c2VFdmVudCwgQ29yZU1vdXNlRW5jb2RpbmcsIENvcmVNb3VzZUV2ZW50VHlwZSwgQ29yZU1vdXNlQnV0dG9uLCBDb3JlTW91c2VBY3Rpb24gfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuXG4vKipcbiAqIFN1cHBvcnRlZCBkZWZhdWx0IHByb3RvY29scy5cbiAqL1xuY29uc3QgREVGQVVMVF9QUk9UT0NPTFM6IHsgW2tleTogc3RyaW5nXTogSUNvcmVNb3VzZVByb3RvY29sIH0gPSB7XG4gIC8qKlxuICAgKiBOT05FXG4gICAqIEV2ZW50czogbm9uZVxuICAgKiBNb2RpZmllcnM6IG5vbmVcbiAgICovXG4gIE5PTkU6IHtcbiAgICBldmVudHM6IENvcmVNb3VzZUV2ZW50VHlwZS5OT05FLFxuICAgIHJlc3RyaWN0OiAoKSA9PiBmYWxzZVxuICB9LFxuICAvKipcbiAgICogWDEwXG4gICAqIEV2ZW50czogbW91c2Vkb3duXG4gICAqIE1vZGlmaWVyczogbm9uZVxuICAgKi9cbiAgWDEwOiB7XG4gICAgZXZlbnRzOiBDb3JlTW91c2VFdmVudFR5cGUuRE9XTixcbiAgICByZXN0cmljdDogKGU6IElDb3JlTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gbm8gd2hlZWwsIG5vIG1vdmUsIG5vIHVwXG4gICAgICBpZiAoZS5idXR0b24gPT09IENvcmVNb3VzZUJ1dHRvbi5XSEVFTCB8fCBlLmFjdGlvbiAhPT0gQ29yZU1vdXNlQWN0aW9uLkRPV04pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gbm8gbW9kaWZpZXJzXG4gICAgICBlLmN0cmwgPSBmYWxzZTtcbiAgICAgIGUuYWx0ID0gZmFsc2U7XG4gICAgICBlLnNoaWZ0ID0gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBWVDIwMFxuICAgKiBFdmVudHM6IG1vdXNlZG93biAvIG1vdXNldXAgLyB3aGVlbFxuICAgKiBNb2RpZmllcnM6IGFsbFxuICAgKi9cbiAgVlQyMDA6IHtcbiAgICBldmVudHM6IENvcmVNb3VzZUV2ZW50VHlwZS5ET1dOIHwgQ29yZU1vdXNlRXZlbnRUeXBlLlVQIHwgQ29yZU1vdXNlRXZlbnRUeXBlLldIRUVMLFxuICAgIHJlc3RyaWN0OiAoZTogSUNvcmVNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAvLyBubyBtb3ZlXG4gICAgICBpZiAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5NT1ZFKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIERSQUdcbiAgICogRXZlbnRzOiBtb3VzZWRvd24gLyBtb3VzZXVwIC8gd2hlZWwgLyBtb3VzZWRyYWdcbiAgICogTW9kaWZpZXJzOiBhbGxcbiAgICovXG4gIERSQUc6IHtcbiAgICBldmVudHM6IENvcmVNb3VzZUV2ZW50VHlwZS5ET1dOIHwgQ29yZU1vdXNlRXZlbnRUeXBlLlVQIHwgQ29yZU1vdXNlRXZlbnRUeXBlLldIRUVMIHwgQ29yZU1vdXNlRXZlbnRUeXBlLkRSQUcsXG4gICAgcmVzdHJpY3Q6IChlOiBJQ29yZU1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIG5vIG1vdmUgd2l0aG91dCBidXR0b25cbiAgICAgIGlmIChlLmFjdGlvbiA9PT0gQ29yZU1vdXNlQWN0aW9uLk1PVkUgJiYgZS5idXR0b24gPT09IENvcmVNb3VzZUJ1dHRvbi5OT05FKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEFOWVxuICAgKiBFdmVudHM6IGFsbCBtb3VzZSByZWxhdGVkIGV2ZW50c1xuICAgKiBNb2RpZmllcnM6IGFsbFxuICAgKi9cbiAgQU5ZOiB7XG4gICAgZXZlbnRzOlxuICAgICAgQ29yZU1vdXNlRXZlbnRUeXBlLkRPV04gfCBDb3JlTW91c2VFdmVudFR5cGUuVVAgfCBDb3JlTW91c2VFdmVudFR5cGUuV0hFRUxcbiAgICAgIHwgQ29yZU1vdXNlRXZlbnRUeXBlLkRSQUcgfCBDb3JlTW91c2VFdmVudFR5cGUuTU9WRSxcbiAgICByZXN0cmljdDogKGU6IElDb3JlTW91c2VFdmVudCkgPT4gdHJ1ZVxuICB9XG59O1xuXG5jb25zdCBlbnVtIE1vZGlmaWVycyB7XG4gIFNISUZUID0gNCxcbiAgQUxUID0gOCxcbiAgQ1RSTCA9IDE2XG59XG5cbi8vIGhlbHBlciBmb3IgZGVmYXVsdCBlbmNvZGVycyB0byBnZW5lcmF0ZSB0aGUgZXZlbnQgY29kZS5cbmZ1bmN0aW9uIGV2ZW50Q29kZShlOiBJQ29yZU1vdXNlRXZlbnQsIGlzU0dSOiBib29sZWFuKTogbnVtYmVyIHtcbiAgbGV0IGNvZGUgPSAoZS5jdHJsID8gTW9kaWZpZXJzLkNUUkwgOiAwKSB8IChlLnNoaWZ0ID8gTW9kaWZpZXJzLlNISUZUIDogMCkgfCAoZS5hbHQgPyBNb2RpZmllcnMuQUxUIDogMCk7XG4gIGlmIChlLmJ1dHRvbiA9PT0gQ29yZU1vdXNlQnV0dG9uLldIRUVMKSB7XG4gICAgY29kZSB8PSA2NDtcbiAgICBjb2RlIHw9IGUuYWN0aW9uO1xuICB9IGVsc2Uge1xuICAgIGNvZGUgfD0gZS5idXR0b24gJiAzO1xuICAgIGlmIChlLmJ1dHRvbiAmIDQpIHtcbiAgICAgIGNvZGUgfD0gNjQ7XG4gICAgfVxuICAgIGlmIChlLmJ1dHRvbiAmIDgpIHtcbiAgICAgIGNvZGUgfD0gMTI4O1xuICAgIH1cbiAgICBpZiAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5NT1ZFKSB7XG4gICAgICBjb2RlIHw9IENvcmVNb3VzZUFjdGlvbi5NT1ZFO1xuICAgIH0gZWxzZSBpZiAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5VUCAmJiAhaXNTR1IpIHtcbiAgICAgIC8vIHNwZWNpYWwgY2FzZSAtIG9ubHkgU0dSIGNhbiByZXBvcnQgYnV0dG9uIG9uIHJlbGVhc2VcbiAgICAgIC8vIGFsbCBvdGhlcnMgaGF2ZSB0byBnbyB3aXRoIE5PTkVcbiAgICAgIGNvZGUgfD0gQ29yZU1vdXNlQnV0dG9uLk5PTkU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb2RlO1xufVxuXG5jb25zdCBTID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcblxuLyoqXG4gKiBTdXBwb3J0ZWQgZGVmYXVsdCBlbmNvZGluZ3MuXG4gKi9cbmNvbnN0IERFRkFVTFRfRU5DT0RJTkdTOiB7IFtrZXk6IHN0cmluZ106IENvcmVNb3VzZUVuY29kaW5nIH0gPSB7XG4gIC8qKlxuICAgKiBERUZBVUxUIC0gQ1NJIE0gUGIgUHggUHlcbiAgICogU2luZ2xlIGJ5dGUgZW5jb2RpbmcgZm9yIGNvb3JkcyBhbmQgZXZlbnQgY29kZS5cbiAgICogQ2FuIGVuY29kZSB2YWx1ZXMgdXAgdG8gMjIzICgxLWJhc2VkKS5cbiAgICovXG4gIERFRkFVTFQ6IChlOiBJQ29yZU1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBbZXZlbnRDb2RlKGUsIGZhbHNlKSArIDMyLCBlLmNvbCArIDMyLCBlLnJvdyArIDMyXTtcbiAgICAvLyBzdXByZXNzIG1vdXNlIHJlcG9ydCBpZiB3ZSBleGNlZWQgYWRkcmVzc2libGUgcmFuZ2VcbiAgICAvLyBOb3RlIHRoaXMgaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBieSBlbXVsYXRvcnNcbiAgICAvLyAtIHh0ZXJtOiAgICAgICAgIHNlbmRzIDA7MCBjb29yZHMgaW5zdGVhZFxuICAgIC8vIC0gdnRlLCBrb25zb2xlOiAgbm8gcmVwb3J0XG4gICAgaWYgKHBhcmFtc1swXSA+IDI1NSB8fCBwYXJhbXNbMV0gPiAyNTUgfHwgcGFyYW1zWzJdID4gMjU1KSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBgXFx4MWJbTSR7UyhwYXJhbXNbMF0pfSR7UyhwYXJhbXNbMV0pfSR7UyhwYXJhbXNbMl0pfWA7XG4gIH0sXG4gIC8qKlxuICAgKiBTR1IgLSBDU0kgPCBQYiA7IFB4IDsgUHkgTXxtXG4gICAqIE5vIGVuY29kaW5nIGxpbWl0YXRpb24uXG4gICAqIENhbiByZXBvcnQgYnV0dG9uIG9uIHJlbGVhc2UgYW5kIHdvcmtzIHdpdGggYSB3ZWxsIGZvcm1lZCBzZXF1ZW5jZS5cbiAgICovXG4gIFNHUjogKGU6IElDb3JlTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IGZpbmFsID0gKGUuYWN0aW9uID09PSBDb3JlTW91c2VBY3Rpb24uVVAgJiYgZS5idXR0b24gIT09IENvcmVNb3VzZUJ1dHRvbi5XSEVFTCkgPyAnbScgOiAnTSc7XG4gICAgcmV0dXJuIGBcXHgxYls8JHtldmVudENvZGUoZSwgdHJ1ZSl9OyR7ZS5jb2x9OyR7ZS5yb3d9JHtmaW5hbH1gO1xuICB9LFxuICBTR1JfUElYRUxTOiAoZTogSUNvcmVNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgZmluYWwgPSAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5VUCAmJiBlLmJ1dHRvbiAhPT0gQ29yZU1vdXNlQnV0dG9uLldIRUVMKSA/ICdtJyA6ICdNJztcbiAgICByZXR1cm4gYFxceDFiWzwke2V2ZW50Q29kZShlLCB0cnVlKX07JHtlLnh9OyR7ZS55fSR7ZmluYWx9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBDb3JlTW91c2VTZXJ2aWNlXG4gKlxuICogUHJvdmlkZXMgbW91c2UgdHJhY2tpbmcgcmVwb3J0cyB3aXRoIGRpZmZlcmVudCBwcm90b2NvbHMgYW5kIGVuY29kaW5ncy5cbiAqICAtIHByb3RvY29sczogTk9ORSAoZGVmYXVsdCksIFgxMCwgVlQyMDAsIERSQUcsIEFOWVxuICogIC0gZW5jb2RpbmdzOiBERUZBVUxULCBTR1IgKFVURjgsIFVSWFZUIHJlbW92ZWQgaW4gIzI1MDcpXG4gKlxuICogQ3VzdG9tIHByb3RvY29scy9lbmNvZGluZ3MgY2FuIGJlIGFkZGVkIGJ5IGBhZGRQcm90b2NvbGAgLyBgYWRkRW5jb2RpbmdgLlxuICogVG8gYWN0aXZhdGUgYSBwcm90b2NvbC9lbmNvZGluZywgc2V0IGBhY3RpdmVQcm90b2NvbGAgLyBgYWN0aXZlRW5jb2RpbmdgLlxuICogU3dpdGNoaW5nIGEgcHJvdG9jb2wgd2lsbCBzZW5kIGEgbm90aWZpY2F0aW9uIGV2ZW50IGBvblByb3RvY29sQ2hhbmdlYFxuICogd2l0aCBhIGxpc3Qgb2YgbmVlZGVkIGV2ZW50cyB0byB0cmFjay5cbiAqXG4gKiBUaGUgc2VydmljZSBoYW5kbGVzIHRoZSBtb3VzZSB0cmFja2luZyBzdGF0ZSBhbmQgZGVjaWRlcyB3aGV0aGVyIHRvIHNlbmRcbiAqIGEgdHJhY2tpbmcgcmVwb3J0IHRvIHRoZSBiYWNrZW5kIGJhc2VkIG9uIHByb3RvY29sIGFuZCBlbmNvZGluZyBsaW1pdGF0aW9ucy5cbiAqIFRvIHNlbmQgYSBtb3VzZSBldmVudCBjYWxsIGB0cmlnZ2VyTW91c2VFdmVudGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlTW91c2VTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElDb3JlTW91c2VTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfcHJvdG9jb2xzOiB7IFtuYW1lOiBzdHJpbmddOiBJQ29yZU1vdXNlUHJvdG9jb2wgfSA9IHt9O1xuICBwcml2YXRlIF9lbmNvZGluZ3M6IHsgW25hbWU6IHN0cmluZ106IENvcmVNb3VzZUVuY29kaW5nIH0gPSB7fTtcbiAgcHJpdmF0ZSBfYWN0aXZlUHJvdG9jb2w6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9hY3RpdmVFbmNvZGluZzogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2xhc3RFdmVudDogSUNvcmVNb3VzZUV2ZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25Qcm90b2NvbENoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxDb3JlTW91c2VFdmVudFR5cGU+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25Qcm90b2NvbENoYW5nZSA9ICB0aGlzLl9vblByb3RvY29sQ2hhbmdlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASUNvcmVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyByZWdpc3RlciBkZWZhdWx0IHByb3RvY29scyBhbmQgZW5jb2RpbmdzXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKERFRkFVTFRfUFJPVE9DT0xTKSkgdGhpcy5hZGRQcm90b2NvbChuYW1lLCBERUZBVUxUX1BST1RPQ09MU1tuYW1lXSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKERFRkFVTFRfRU5DT0RJTkdTKSkgdGhpcy5hZGRFbmNvZGluZyhuYW1lLCBERUZBVUxUX0VOQ09ESU5HU1tuYW1lXSk7XG4gICAgLy8gY2FsbCByZXNldCB0byBzZXQgZGVmYXVsdHNcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cblxuICBwdWJsaWMgYWRkUHJvdG9jb2wobmFtZTogc3RyaW5nLCBwcm90b2NvbDogSUNvcmVNb3VzZVByb3RvY29sKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvdG9jb2xzW25hbWVdID0gcHJvdG9jb2w7XG4gIH1cblxuICBwdWJsaWMgYWRkRW5jb2RpbmcobmFtZTogc3RyaW5nLCBlbmNvZGluZzogQ29yZU1vdXNlRW5jb2RpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmNvZGluZ3NbbmFtZV0gPSBlbmNvZGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlUHJvdG9jb2woKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlUHJvdG9jb2w7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFyZU1vdXNlRXZlbnRzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wcm90b2NvbHNbdGhpcy5fYWN0aXZlUHJvdG9jb2xdLmV2ZW50cyAhPT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlUHJvdG9jb2wobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLl9wcm90b2NvbHNbbmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBwcm90b2NvbCBcIiR7bmFtZX1cImApO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVQcm90b2NvbCA9IG5hbWU7XG4gICAgdGhpcy5fb25Qcm90b2NvbENoYW5nZS5maXJlKHRoaXMuX3Byb3RvY29sc1tuYW1lXS5ldmVudHMpO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVFbmNvZGluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVFbmNvZGluZztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlRW5jb2RpbmcobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLl9lbmNvZGluZ3NbbmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBlbmNvZGluZyBcIiR7bmFtZX1cImApO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVFbmNvZGluZyA9IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVQcm90b2NvbCA9ICdOT05FJztcbiAgICB0aGlzLmFjdGl2ZUVuY29kaW5nID0gJ0RFRkFVTFQnO1xuICAgIHRoaXMuX2xhc3RFdmVudCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBtb3VzZSBldmVudCB0byBiZSBzZW50LlxuICAgKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHBhc3NlZCBhbGwgcHJvdG9jb2wgcmVzdHJpY3Rpb25zIGFuZCBhIHJlcG9ydFxuICAgKiB3YXMgc2VudCwgb3RoZXJ3aXNlIGZhbHNlLiBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyXG4gICAqIHRoZSBkZWZhdWx0IGV2ZW50IGFjdGlvbiBpbiB0aGUgYm93c2VyIGNvbXBvbmVudCBzaG91bGQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogTm90ZTogVGhlIG1ldGhvZCB3aWxsIGNoYW5nZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGV2ZW50IG9iamVjdFxuICAgKiB0byBmdWxsZmlsbCBwcm90b2NvbCBhbmQgZW5jb2RpbmcgcmVzdHJpY3Rpb25zLlxuICAgKi9cbiAgcHVibGljIHRyaWdnZXJNb3VzZUV2ZW50KGU6IElDb3JlTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgIC8vIHJhbmdlIGNoZWNrIGZvciBjb2wvcm93XG4gICAgaWYgKGUuY29sIDwgMCB8fCBlLmNvbCA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHNcbiAgICAgIHx8IGUucm93IDwgMCB8fCBlLnJvdyA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgbm9uc2Vuc2UgY29tYmluYXRpb25zIG9mIGJ1dHRvbiArIGFjdGlvblxuICAgIGlmIChlLmJ1dHRvbiA9PT0gQ29yZU1vdXNlQnV0dG9uLldIRUVMICYmIGUuYWN0aW9uID09PSBDb3JlTW91c2VBY3Rpb24uTU9WRSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZS5idXR0b24gPT09IENvcmVNb3VzZUJ1dHRvbi5OT05FICYmIGUuYWN0aW9uICE9PSBDb3JlTW91c2VBY3Rpb24uTU9WRSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZS5idXR0b24gIT09IENvcmVNb3VzZUJ1dHRvbi5XSEVFTCAmJiAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5MRUZUIHx8IGUuYWN0aW9uID09PSBDb3JlTW91c2VBY3Rpb24uUklHSFQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmVwb3J0IDEtYmFzZWQgY29vcmRzXG4gICAgZS5jb2wrKztcbiAgICBlLnJvdysrO1xuXG4gICAgLy8gZGVib3VuY2UgbW92ZSBldmVudHMgYXQgZ3JpZCBvciBwaXhlbCBsZXZlbFxuICAgIGlmIChlLmFjdGlvbiA9PT0gQ29yZU1vdXNlQWN0aW9uLk1PVkVcbiAgICAgICYmIHRoaXMuX2xhc3RFdmVudFxuICAgICAgJiYgdGhpcy5fZXF1YWxFdmVudHModGhpcy5fbGFzdEV2ZW50LCBlLCB0aGlzLl9hY3RpdmVFbmNvZGluZyA9PT0gJ1NHUl9QSVhFTFMnKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IHByb3RvY29sIHJlc3RyaWN0aW9uc1xuICAgIGlmICghdGhpcy5fcHJvdG9jb2xzW3RoaXMuX2FjdGl2ZVByb3RvY29sXS5yZXN0cmljdChlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSByZXBvcnQgYW5kIHNlbmRcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLl9lbmNvZGluZ3NbdGhpcy5fYWN0aXZlRW5jb2RpbmddKGUpO1xuICAgIGlmIChyZXBvcnQpIHtcbiAgICAgIC8vIGFsd2F5cyBzZW5kIERFRkFVTFQgYXMgYmluYXJ5IGRhdGFcbiAgICAgIGlmICh0aGlzLl9hY3RpdmVFbmNvZGluZyA9PT0gJ0RFRkFVTFQnKSB7XG4gICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJCaW5hcnlFdmVudChyZXBvcnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChyZXBvcnQsIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xhc3RFdmVudCA9IGU7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBleHBsYWluRXZlbnRzKGV2ZW50czogQ29yZU1vdXNlRXZlbnRUeXBlKTogeyBbZXZlbnQ6IHN0cmluZ106IGJvb2xlYW4gfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvd246ICEhKGV2ZW50cyAmIENvcmVNb3VzZUV2ZW50VHlwZS5ET1dOKSxcbiAgICAgIHVwOiAhIShldmVudHMgJiBDb3JlTW91c2VFdmVudFR5cGUuVVApLFxuICAgICAgZHJhZzogISEoZXZlbnRzICYgQ29yZU1vdXNlRXZlbnRUeXBlLkRSQUcpLFxuICAgICAgbW92ZTogISEoZXZlbnRzICYgQ29yZU1vdXNlRXZlbnRUeXBlLk1PVkUpLFxuICAgICAgd2hlZWw6ICEhKGV2ZW50cyAmIENvcmVNb3VzZUV2ZW50VHlwZS5XSEVFTClcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfZXF1YWxFdmVudHMoZTE6IElDb3JlTW91c2VFdmVudCwgZTI6IElDb3JlTW91c2VFdmVudCwgcGl4ZWxzOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHBpeGVscykge1xuICAgICAgaWYgKGUxLnggIT09IGUyLngpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChlMS55ICE9PSBlMi55KSByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlMS5jb2wgIT09IGUyLmNvbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGUxLnJvdyAhPT0gZTIucm93KSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChlMS5idXR0b24gIT09IGUyLmJ1dHRvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChlMS5hY3Rpb24gIT09IGUyLmFjdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChlMS5jdHJsICE9PSBlMi5jdHJsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGUxLmFsdCAhPT0gZTIuYWx0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGUxLnNoaWZ0ICE9PSBlMi5zaGlmdCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gJ2NvbW1vbi9DbG9uZSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElEZWNQcml2YXRlTW9kZXMsIElNb2RlcyB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSUNvcmVTZXJ2aWNlLCBJTG9nU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuY29uc3QgREVGQVVMVF9NT0RFUzogSU1vZGVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGluc2VydE1vZGU6IGZhbHNlXG59KTtcblxuY29uc3QgREVGQVVMVF9ERUNfUFJJVkFURV9NT0RFUzogSURlY1ByaXZhdGVNb2RlcyA9IE9iamVjdC5mcmVlemUoe1xuICBhcHBsaWNhdGlvbkN1cnNvcktleXM6IGZhbHNlLFxuICBhcHBsaWNhdGlvbktleXBhZDogZmFsc2UsXG4gIGJyYWNrZXRlZFBhc3RlTW9kZTogZmFsc2UsXG4gIG9yaWdpbjogZmFsc2UsXG4gIHJldmVyc2VXcmFwYXJvdW5kOiBmYWxzZSxcbiAgc2VuZEZvY3VzOiBmYWxzZSxcbiAgd3JhcGFyb3VuZDogdHJ1ZSAvLyBkZWZhdWx0czogeHRlcm0gLSB0cnVlLCB2dDEwMCAtIGZhbHNlXG59KTtcblxuZXhwb3J0IGNsYXNzIENvcmVTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElDb3JlU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IGFueTtcblxuICBwdWJsaWMgaXNDdXJzb3JJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNDdXJzb3JIaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIG1vZGVzOiBJTW9kZXM7XG4gIHB1YmxpYyBkZWNQcml2YXRlTW9kZXM6IElEZWNQcml2YXRlTW9kZXM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25EYXRhID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkRhdGEgPSB0aGlzLl9vbkRhdGEuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uVXNlcklucHV0ID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25Vc2VySW5wdXQgPSB0aGlzLl9vblVzZXJJbnB1dC5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25CaW5hcnkgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQmluYXJ5ID0gdGhpcy5fb25CaW5hcnkuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVxdWVzdFNjcm9sbFRvQm90dG9tID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b20gPSB0aGlzLl9vblJlcXVlc3RTY3JvbGxUb0JvdHRvbS5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElMb2dTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2xvZ1NlcnZpY2U6IElMb2dTZXJ2aWNlLFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubW9kZXMgPSBjbG9uZShERUZBVUxUX01PREVTKTtcbiAgICB0aGlzLmRlY1ByaXZhdGVNb2RlcyA9IGNsb25lKERFRkFVTFRfREVDX1BSSVZBVEVfTU9ERVMpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubW9kZXMgPSBjbG9uZShERUZBVUxUX01PREVTKTtcbiAgICB0aGlzLmRlY1ByaXZhdGVNb2RlcyA9IGNsb25lKERFRkFVTFRfREVDX1BSSVZBVEVfTU9ERVMpO1xuICB9XG5cbiAgcHVibGljIHRyaWdnZXJEYXRhRXZlbnQoZGF0YTogc3RyaW5nLCB3YXNVc2VySW5wdXQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIC8vIFByZXZlbnRzIGFsbCBldmVudHMgdG8gcHR5IHByb2Nlc3MgaWYgc3RkaW4gaXMgZGlzYWJsZWRcbiAgICBpZiAodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5kaXNhYmxlU3RkaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbnB1dCBpcyBiZWluZyBzZW50IHRvIHRoZSB0ZXJtaW5hbCwgdGhlIHRlcm1pbmFsIHNob3VsZCBmb2N1cyB0aGUgcHJvbXB0LlxuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO1xuICAgIGlmICh3YXNVc2VySW5wdXQgJiYgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zY3JvbGxPblVzZXJJbnB1dCAmJiBidWZmZXIueWJhc2UgIT09IGJ1ZmZlci55ZGlzcCkge1xuICAgICAgdGhpcy5fb25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b20uZmlyZSgpO1xuICAgIH1cblxuICAgIC8vIEZpcmUgb25Vc2VySW5wdXQgc28gbGlzdGVuZXJzIGNhbiByZWFjdCBhcyB3ZWxsIChlZy4gY2xlYXIgc2VsZWN0aW9uKVxuICAgIGlmICh3YXNVc2VySW5wdXQpIHtcbiAgICAgIHRoaXMuX29uVXNlcklucHV0LmZpcmUoKTtcbiAgICB9XG5cbiAgICAvLyBGaXJlIG9uRGF0YSBBUElcbiAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKGBzZW5kaW5nIGRhdGEgXCIke2RhdGF9XCJgLCAoKSA9PiBkYXRhLnNwbGl0KCcnKS5tYXAoZSA9PiBlLmNoYXJDb2RlQXQoMCkpKTtcbiAgICB0aGlzLl9vbkRhdGEuZmlyZShkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmlnZ2VyQmluYXJ5RXZlbnQoZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZGlzYWJsZVN0ZGluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoYHNlbmRpbmcgYmluYXJ5IFwiJHtkYXRhfVwiYCwgKCkgPT4gZGF0YS5zcGxpdCgnJykubWFwKGUgPT4gZS5jaGFyQ29kZUF0KDApKSk7XG4gICAgdGhpcy5fb25CaW5hcnkuZmlyZShkYXRhKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgY3NzIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJRGVjb3JhdGlvblNlcnZpY2UsIElJbnRlcm5hbERlY29yYXRpb24gfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgU29ydGVkTGlzdCB9IGZyb20gJ2NvbW1vbi9Tb3J0ZWRMaXN0JztcbmltcG9ydCB7IElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBJRGVjb3JhdGlvbiwgSURlY29yYXRpb25PcHRpb25zLCBJTWFya2VyIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuLy8gV29yayB2YXJpYWJsZXMgdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uXG5sZXQgJHhtaW4gPSAwO1xubGV0ICR4bWF4ID0gMDtcblxuZXhwb3J0IGNsYXNzIERlY29yYXRpb25TZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElEZWNvcmF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IGFueTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGFsbCBkZWNvcmF0aW9ucywgc29ydGVkIGJ5IHRoZSBtYXJrZXIncyBsaW5lIHZhbHVlLiBUaGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0XG4gICAqIHdoaWxlIG1hcmtlciBsaW5lIHZhbHVlcyBkbyBjaGFuZ2UsIHRoZXkgc2hvdWxkIGFsbCBjaGFuZ2UgYnkgdGhlIHNhbWUgYW1vdW50IHNvIHRoaXMgc2hvdWxkXG4gICAqIG5ldmVyIGJlY29tZSBvdXQgb2Ygb3JkZXIuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWNvcmF0aW9uczogU29ydGVkTGlzdDxJSW50ZXJuYWxEZWNvcmF0aW9uPiA9IG5ldyBTb3J0ZWRMaXN0KGUgPT4gZT8ubWFya2VyLmxpbmUpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRGVjb3JhdGlvblJlZ2lzdGVyZWQgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SUludGVybmFsRGVjb3JhdGlvbj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkRlY29yYXRpb25SZWdpc3RlcmVkID0gdGhpcy5fb25EZWNvcmF0aW9uUmVnaXN0ZXJlZC5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25EZWNvcmF0aW9uUmVtb3ZlZCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJSW50ZXJuYWxEZWNvcmF0aW9uPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uRGVjb3JhdGlvblJlbW92ZWQgPSB0aGlzLl9vbkRlY29yYXRpb25SZW1vdmVkLmV2ZW50O1xuXG4gIHB1YmxpYyBnZXQgZGVjb3JhdGlvbnMoKTogSXRlcmFibGVJdGVyYXRvcjxJSW50ZXJuYWxEZWNvcmF0aW9uPiB7IHJldHVybiB0aGlzLl9kZWNvcmF0aW9ucy52YWx1ZXMoKTsgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB0aGlzLnJlc2V0KCkpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckRlY29yYXRpb24ob3B0aW9uczogSURlY29yYXRpb25PcHRpb25zKTogSURlY29yYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGlmIChvcHRpb25zLm1hcmtlci5pc0Rpc3Bvc2VkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBkZWNvcmF0aW9uID0gbmV3IERlY29yYXRpb24ob3B0aW9ucyk7XG4gICAgaWYgKGRlY29yYXRpb24pIHtcbiAgICAgIGNvbnN0IG1hcmtlckRpc3Bvc2UgPSBkZWNvcmF0aW9uLm1hcmtlci5vbkRpc3Bvc2UoKCkgPT4gZGVjb3JhdGlvbi5kaXNwb3NlKCkpO1xuICAgICAgZGVjb3JhdGlvbi5vbkRpc3Bvc2UoKCkgPT4ge1xuICAgICAgICBpZiAoZGVjb3JhdGlvbikge1xuICAgICAgICAgIGlmICh0aGlzLl9kZWNvcmF0aW9ucy5kZWxldGUoZGVjb3JhdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRGVjb3JhdGlvblJlbW92ZWQuZmlyZShkZWNvcmF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFya2VyRGlzcG9zZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fZGVjb3JhdGlvbnMuaW5zZXJ0KGRlY29yYXRpb24pO1xuICAgICAgdGhpcy5fb25EZWNvcmF0aW9uUmVnaXN0ZXJlZC5maXJlKGRlY29yYXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gZGVjb3JhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGQgb2YgdGhpcy5fZGVjb3JhdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIGQuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLl9kZWNvcmF0aW9ucy5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljICpnZXREZWNvcmF0aW9uc0F0Q2VsbCh4OiBudW1iZXIsIGxpbmU6IG51bWJlciwgbGF5ZXI/OiAnYm90dG9tJyB8ICd0b3AnKTogSXRlcmFibGVJdGVyYXRvcjxJSW50ZXJuYWxEZWNvcmF0aW9uPiB7XG4gICAgbGV0IHhtaW4gPSAwO1xuICAgIGxldCB4bWF4ID0gMDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgdGhpcy5fZGVjb3JhdGlvbnMuZ2V0S2V5SXRlcmF0b3IobGluZSkpIHtcbiAgICAgIHhtaW4gPSBkLm9wdGlvbnMueCA/PyAwO1xuICAgICAgeG1heCA9IHhtaW4gKyAoZC5vcHRpb25zLndpZHRoID8/IDEpO1xuICAgICAgaWYgKHggPj0geG1pbiAmJiB4IDwgeG1heCAmJiAoIWxheWVyIHx8IChkLm9wdGlvbnMubGF5ZXIgPz8gJ2JvdHRvbScpID09PSBsYXllcikpIHtcbiAgICAgICAgeWllbGQgZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9yRWFjaERlY29yYXRpb25BdENlbGwoeDogbnVtYmVyLCBsaW5lOiBudW1iZXIsIGxheWVyOiAnYm90dG9tJyB8ICd0b3AnIHwgdW5kZWZpbmVkLCBjYWxsYmFjazogKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9kZWNvcmF0aW9ucy5mb3JFYWNoQnlLZXkobGluZSwgZCA9PiB7XG4gICAgICAkeG1pbiA9IGQub3B0aW9ucy54ID8/IDA7XG4gICAgICAkeG1heCA9ICR4bWluICsgKGQub3B0aW9ucy53aWR0aCA/PyAxKTtcbiAgICAgIGlmICh4ID49ICR4bWluICYmIHggPCAkeG1heCAmJiAoIWxheWVyIHx8IChkLm9wdGlvbnMubGF5ZXIgPz8gJ2JvdHRvbScpID09PSBsYXllcikpIHtcbiAgICAgICAgY2FsbGJhY2soZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgRGVjb3JhdGlvbiBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJSW50ZXJuYWxEZWNvcmF0aW9uIHtcbiAgcHVibGljIHJlYWRvbmx5IG1hcmtlcjogSU1hcmtlcjtcbiAgcHVibGljIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgZ2V0IGlzRGlzcG9zZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0Rpc3Bvc2VkOyB9XG5cbiAgcHVibGljIHJlYWRvbmx5IG9uUmVuZGVyRW1pdHRlciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxIVE1MRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbmRlciA9IHRoaXMub25SZW5kZXJFbWl0dGVyLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkRpc3Bvc2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkRpc3Bvc2UgPSB0aGlzLl9vbkRpc3Bvc2UuZXZlbnQ7XG5cbiAgcHJpdmF0ZSBfY2FjaGVkQmc6IElDb2xvciB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgZ2V0IGJhY2tncm91bmRDb2xvclJHQigpOiBJQ29sb3IgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9jYWNoZWRCZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVkQmcgPSBjc3MudG9Db2xvcih0aGlzLm9wdGlvbnMuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NhY2hlZEJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkQmc7XG4gIH1cblxuICBwcml2YXRlIF9jYWNoZWRGZzogSUNvbG9yIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBnZXQgZm9yZWdyb3VuZENvbG9yUkdCKCk6IElDb2xvciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX2NhY2hlZEZnID09PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZvcmVncm91bmRDb2xvcikge1xuICAgICAgICB0aGlzLl9jYWNoZWRGZyA9IGNzcy50b0NvbG9yKHRoaXMub3B0aW9ucy5mb3JlZ3JvdW5kQ29sb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY2FjaGVkRmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRGZztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1hcmtlciA9IG9wdGlvbnMubWFya2VyO1xuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMgJiYgIXRoaXMub3B0aW9ucy5vdmVydmlld1J1bGVyT3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgdGhpcy5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLnBvc2l0aW9uID0gJ2Z1bGwnO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX29uRGlzcG9zZS5maXJlKCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBUaGlzIHdhcyBoZWF2aWx5IGluc3BpcmVkIGZyb20gbWljcm9zb2Z0L3ZzY29kZSdzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbSAoTUlUKS5cbiAqL1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IElJbnN0YW50aWF0aW9uU2VydmljZSwgSVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IGdldFNlcnZpY2VEZXBlbmRlbmNpZXMgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcblxuZXhwb3J0IGNsYXNzIFNlcnZpY2VDb2xsZWN0aW9uIHtcblxuICBwcml2YXRlIF9lbnRyaWVzID0gbmV3IE1hcDxJU2VydmljZUlkZW50aWZpZXI8YW55PiwgYW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKC4uLmVudHJpZXM6IFtJU2VydmljZUlkZW50aWZpZXI8YW55PiwgYW55XVtdKSB7XG4gICAgZm9yIChjb25zdCBbaWQsIHNlcnZpY2VdIG9mIGVudHJpZXMpIHtcbiAgICAgIHRoaXMuc2V0KGlkLCBzZXJ2aWNlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0PFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4sIGluc3RhbmNlOiBUKTogVCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZW50cmllcy5nZXQoaWQpO1xuICAgIHRoaXMuX2VudHJpZXMuc2V0KGlkLCBpbnN0YW5jZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBmb3JFYWNoKGNhbGxiYWNrOiAoaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxhbnk+LCBpbnN0YW5jZTogYW55KSA9PiBhbnkpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgY2FsbGJhY2soa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhcyhpZDogSVNlcnZpY2VJZGVudGlmaWVyPGFueT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllcy5oYXMoaWQpO1xuICB9XG5cbiAgcHVibGljIGdldDxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXMuZ2V0KGlkKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5zdGFudGlhdGlvblNlcnZpY2UgaW1wbGVtZW50cyBJSW5zdGFudGlhdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc2VydmljZXM6IFNlcnZpY2VDb2xsZWN0aW9uID0gbmV3IFNlcnZpY2VDb2xsZWN0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2VydmljZXMuc2V0KElJbnN0YW50aWF0aW9uU2VydmljZSwgdGhpcyk7XG4gIH1cblxuICBwdWJsaWMgc2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+LCBpbnN0YW5jZTogVCk6IHZvaWQge1xuICAgIHRoaXMuX3NlcnZpY2VzLnNldChpZCwgaW5zdGFuY2UpO1xuICB9XG5cbiAgcHVibGljIGdldFNlcnZpY2U8VD4oaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxUPik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlcy5nZXQoaWQpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUluc3RhbmNlPFQ+KGN0b3I6IGFueSwgLi4uYXJnczogYW55W10pOiBUIHtcbiAgICBjb25zdCBzZXJ2aWNlRGVwZW5kZW5jaWVzID0gZ2V0U2VydmljZURlcGVuZGVuY2llcyhjdG9yKS5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlQXJnczogYW55W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygc2VydmljZURlcGVuZGVuY2llcykge1xuICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuX3NlcnZpY2VzLmdldChkZXBlbmRlbmN5LmlkKTtcbiAgICAgIGlmICghc2VydmljZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtjcmVhdGVJbnN0YW5jZV0gJHtjdG9yLm5hbWV9IGRlcGVuZHMgb24gVU5LTk9XTiBzZXJ2aWNlICR7ZGVwZW5kZW5jeS5pZH0uYCk7XG4gICAgICB9XG4gICAgICBzZXJ2aWNlQXJncy5wdXNoKHNlcnZpY2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0U2VydmljZUFyZ1BvcyA9IHNlcnZpY2VEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCA/IHNlcnZpY2VEZXBlbmRlbmNpZXNbMF0uaW5kZXggOiBhcmdzLmxlbmd0aDtcblxuICAgIC8vIGNoZWNrIGZvciBhcmd1bWVudCBtaXNtYXRjaGVzLCBhZGp1c3Qgc3RhdGljIGFyZ3MgaWYgbmVlZGVkXG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSBmaXJzdFNlcnZpY2VBcmdQb3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW2NyZWF0ZUluc3RhbmNlXSBGaXJzdCBzZXJ2aWNlIGRlcGVuZGVuY3kgb2YgJHtjdG9yLm5hbWV9IGF0IHBvc2l0aW9uICR7Zmlyc3RTZXJ2aWNlQXJnUG9zICsgMX0gY29uZmxpY3RzIHdpdGggJHthcmdzLmxlbmd0aH0gc3RhdGljIGFyZ3VtZW50c2ApO1xuICAgIH1cblxuICAgIC8vIG5vdyBjcmVhdGUgdGhlIGluc3RhbmNlXG4gICAgcmV0dXJuIG5ldyBjdG9yKC4uLlsuLi5hcmdzLCAuLi5zZXJ2aWNlQXJnc10pO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJTG9nU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlLCBMb2dMZXZlbEVudW0gfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG50eXBlIExvZ1R5cGUgPSAobWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgSUNvbnNvbGUge1xuICBsb2c6IExvZ1R5cGU7XG4gIGVycm9yOiBMb2dUeXBlO1xuICBpbmZvOiBMb2dUeXBlO1xuICB0cmFjZTogTG9nVHlwZTtcbiAgd2FybjogTG9nVHlwZTtcbn1cblxuLy8gY29uc29sZSBpcyBhdmFpbGFibGUgb24gYm90aCBub2RlLmpzIGFuZCBicm93c2VyIGNvbnRleHRzIGJ1dCB0aGUgY29tbW9uXG4vLyBtb2R1bGUgZG9lc24ndCBkZXBlbmQgb24gdGhlbSBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgZGVjbGFyZSBpdC5cbmRlY2xhcmUgY29uc3QgY29uc29sZTogSUNvbnNvbGU7XG5cbmNvbnN0IG9wdGlvbnNLZXlUb0xvZ0xldmVsOiB7IFtrZXk6IHN0cmluZ106IExvZ0xldmVsRW51bSB9ID0ge1xuICB0cmFjZTogTG9nTGV2ZWxFbnVtLlRSQUNFLFxuICBkZWJ1ZzogTG9nTGV2ZWxFbnVtLkRFQlVHLFxuICBpbmZvOiBMb2dMZXZlbEVudW0uSU5GTyxcbiAgd2FybjogTG9nTGV2ZWxFbnVtLldBUk4sXG4gIGVycm9yOiBMb2dMZXZlbEVudW0uRVJST1IsXG4gIG9mZjogTG9nTGV2ZWxFbnVtLk9GRlxufTtcblxuY29uc3QgTE9HX1BSRUZJWCA9ICd4dGVybS5qczogJztcblxuZXhwb3J0IGNsYXNzIExvZ1NlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUxvZ1NlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgcHJpdmF0ZSBfbG9nTGV2ZWw6IExvZ0xldmVsRW51bSA9IExvZ0xldmVsRW51bS5PRkY7XG4gIHB1YmxpYyBnZXQgbG9nTGV2ZWwoKTogTG9nTGV2ZWxFbnVtIHsgcmV0dXJuIHRoaXMuX2xvZ0xldmVsOyB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdXBkYXRlTG9nTGV2ZWwoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ2xvZ0xldmVsJywgKCkgPT4gdGhpcy5fdXBkYXRlTG9nTGV2ZWwoKSkpO1xuXG4gICAgLy8gRm9yIHRyYWNlIGxvZ2dpbmcsIGFzc3VtZSB0aGUgbGF0ZXN0IGNyZWF0ZWQgbG9nIHNlcnZpY2UgaXMgdmFsaWRcbiAgICB0cmFjZUxvZ2dlciA9IHRoaXM7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVMb2dMZXZlbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2dMZXZlbCA9IG9wdGlvbnNLZXlUb0xvZ0xldmVsW3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubG9nTGV2ZWxdO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXZhbExhenlPcHRpb25hbFBhcmFtcyhvcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbmFsUGFyYW1zW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbmFsUGFyYW1zW2ldID0gb3B0aW9uYWxQYXJhbXNbaV0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9sb2codHlwZTogTG9nVHlwZSwgbWVzc2FnZTogc3RyaW5nLCBvcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLl9ldmFsTGF6eU9wdGlvbmFsUGFyYW1zKG9wdGlvbmFsUGFyYW1zKTtcbiAgICB0eXBlLmNhbGwoY29uc29sZSwgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyID8gJycgOiBMT0dfUFJFRklYKSArIG1lc3NhZ2UsIC4uLm9wdGlvbmFsUGFyYW1zKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFjZShtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uVFJBQ0UpIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8udHJhY2UuYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS5sb2csIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLkRFQlVHKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/LmRlYnVnLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUubG9nLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLklORk8pIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8uaW5mby5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLmluZm8sIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uV0FSTikge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy53YXJuLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUud2FybiwgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uRVJST1IpIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8uZXJyb3IuYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS5lcnJvciwgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxufVxuXG5sZXQgdHJhY2VMb2dnZXI6IElMb2dTZXJ2aWNlO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRyYWNlTG9nZ2VyKGxvZ2dlcjogSUxvZ1NlcnZpY2UpOiB2b2lkIHtcbiAgdHJhY2VMb2dnZXIgPSBsb2dnZXI7XG59XG5cbi8qKlxuICogQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGxvZyB0cmFjZSBjYWxscyB0byB0aGUgZGVjb3JhdGVkIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhY2VDYWxsKF90YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IGFueSk6IGFueSB7XG4gIGlmICh0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCcpO1xuICB9XG4gIGNvbnN0IGZuS2V5ID0gJ3ZhbHVlJztcbiAgY29uc3QgZm4gPSBkZXNjcmlwdG9yLnZhbHVlO1xuICBkZXNjcmlwdG9yW2ZuS2V5XSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgIC8vIEVhcmx5IGV4aXRcbiAgICBpZiAodHJhY2VMb2dnZXIubG9nTGV2ZWwgIT09IExvZ0xldmVsRW51bS5UUkFDRSkge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cblxuICAgIHRyYWNlTG9nZ2VyLnRyYWNlKGBHbHlwaFJlbmRlcmVyIyR7Zm4ubmFtZX0oJHthcmdzLm1hcChlID0+IEpTT04uc3RyaW5naWZ5KGUpKS5qb2luKCcsICcpfSlgKTtcbiAgICBjb25zdCByZXN1bHQgPSBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB0cmFjZUxvZ2dlci50cmFjZShgR2x5cGhSZW5kZXJlciMke2ZuLm5hbWV9IHJldHVybmAsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBpc01hYyB9IGZyb20gJ2NvbW1vbi9QbGF0Zm9ybSc7XG5pbXBvcnQgeyBDdXJzb3JTdHlsZSwgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgRm9udFdlaWdodCwgSU9wdGlvbnNTZXJ2aWNlLCBJVGVybWluYWxPcHRpb25zIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1BUSU9OUzogUmVhZG9ubHk8UmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz4+ID0ge1xuICBjb2xzOiA4MCxcbiAgcm93czogMjQsXG4gIGN1cnNvckJsaW5rOiBmYWxzZSxcbiAgY3Vyc29yU3R5bGU6ICdibG9jaycsXG4gIGN1cnNvcldpZHRoOiAxLFxuICBjdXJzb3JJbmFjdGl2ZVN0eWxlOiAnb3V0bGluZScsXG4gIGN1c3RvbUdseXBoczogdHJ1ZSxcbiAgZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnM6IHRydWUsXG4gIGRvY3VtZW50T3ZlcnJpZGU6IG51bGwsXG4gIGZhc3RTY3JvbGxNb2RpZmllcjogJ2FsdCcsXG4gIGZhc3RTY3JvbGxTZW5zaXRpdml0eTogNSxcbiAgZm9udEZhbWlseTogJ2NvdXJpZXItbmV3LCBjb3VyaWVyLCBtb25vc3BhY2UnLFxuICBmb250U2l6ZTogMTUsXG4gIGZvbnRXZWlnaHQ6ICdub3JtYWwnLFxuICBmb250V2VpZ2h0Qm9sZDogJ2JvbGQnLFxuICBpZ25vcmVCcmFja2V0ZWRQYXN0ZU1vZGU6IGZhbHNlLFxuICBsaW5lSGVpZ2h0OiAxLjAsXG4gIGxldHRlclNwYWNpbmc6IDAsXG4gIGxpbmtIYW5kbGVyOiBudWxsLFxuICBsb2dMZXZlbDogJ2luZm8nLFxuICBsb2dnZXI6IG51bGwsXG4gIHNjcm9sbGJhY2s6IDEwMDAsXG4gIHNjcm9sbE9uVXNlcklucHV0OiB0cnVlLFxuICBzY3JvbGxTZW5zaXRpdml0eTogMSxcbiAgc2NyZWVuUmVhZGVyTW9kZTogZmFsc2UsXG4gIHNtb290aFNjcm9sbER1cmF0aW9uOiAwLFxuICBtYWNPcHRpb25Jc01ldGE6IGZhbHNlLFxuICBtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbjogZmFsc2UsXG4gIG1pbmltdW1Db250cmFzdFJhdGlvOiAxLFxuICBkaXNhYmxlU3RkaW46IGZhbHNlLFxuICBhbGxvd1Byb3Bvc2VkQXBpOiBmYWxzZSxcbiAgYWxsb3dUcmFuc3BhcmVuY3k6IGZhbHNlLFxuICB0YWJTdG9wV2lkdGg6IDgsXG4gIHRoZW1lOiB7fSxcbiAgcmVzY2FsZU92ZXJsYXBwaW5nR2x5cGhzOiBmYWxzZSxcbiAgcmlnaHRDbGlja1NlbGVjdHNXb3JkOiBpc01hYyxcbiAgd2luZG93T3B0aW9uczoge30sXG4gIHdpbmRvd3NNb2RlOiBmYWxzZSxcbiAgd2luZG93c1B0eToge30sXG4gIHdvcmRTZXBhcmF0b3I6ICcgKClbXXt9XFwnLFwiYCcsXG4gIGFsdENsaWNrTW92ZXNDdXJzb3I6IHRydWUsXG4gIGNvbnZlcnRFb2w6IGZhbHNlLFxuICB0ZXJtTmFtZTogJ3h0ZXJtJyxcbiAgY2FuY2VsRXZlbnRzOiBmYWxzZSxcbiAgb3ZlcnZpZXdSdWxlcldpZHRoOiAwXG59O1xuXG5jb25zdCBGT05UX1dFSUdIVF9PUFRJT05TOiBFeHRyYWN0PEZvbnRXZWlnaHQsIHN0cmluZz5bXSA9IFsnbm9ybWFsJywgJ2JvbGQnLCAnMTAwJywgJzIwMCcsICczMDAnLCAnNDAwJywgJzUwMCcsICc2MDAnLCAnNzAwJywgJzgwMCcsICc5MDAnXTtcblxuZXhwb3J0IGNsYXNzIE9wdGlvbnNTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElPcHRpb25zU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IGFueTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmF3T3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz47XG4gIHB1YmxpYyBvcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbk9wdGlvbkNoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxrZXlvZiBJVGVybWluYWxPcHRpb25zPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uT3B0aW9uQ2hhbmdlID0gdGhpcy5fb25PcHRpb25DaGFuZ2UuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGFydGlhbDxJVGVybWluYWxPcHRpb25zPikge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIGVhY2ggb3B0aW9uXG4gICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfT1BUSU9OUyB9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICAgIGlmIChrZXkgaW4gZGVmYXVsdE9wdGlvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IG9wdGlvbnNba2V5XTtcbiAgICAgICAgICBkZWZhdWx0T3B0aW9uc1trZXldID0gdGhpcy5fc2FuaXRpemVBbmRWYWxpZGF0ZU9wdGlvbihrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBvcHRpb25cbiAgICB0aGlzLnJhd09wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB0aGlzLm9wdGlvbnMgPSB7IC4uLiBkZWZhdWx0T3B0aW9ucyB9O1xuICAgIHRoaXMuX3NldHVwT3B0aW9ucygpO1xuXG4gICAgLy8gQ2xlYXIgb3V0IG9wdGlvbnMgdGhhdCBjb3VsZCBsaW5rIG91dHNpZGUgeHRlcm0uanMgYXMgdGhleSBjb3VsZCBlYXNpbHkgY2F1c2UgYW4gZW1iZWRkZXJcbiAgICAvLyBtZW1vcnkgbGVha1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgIHRoaXMucmF3T3B0aW9ucy5saW5rSGFuZGxlciA9IG51bGw7XG4gICAgICB0aGlzLnJhd09wdGlvbnMuZG9jdW1lbnRPdmVycmlkZSA9IG51bGw7XG4gICAgfSkpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICBwdWJsaWMgb25TcGVjaWZpY09wdGlvbkNoYW5nZTxUIGV4dGVuZHMga2V5b2YgSVRlcm1pbmFsT3B0aW9ucz4oa2V5OiBULCBsaXN0ZW5lcjogKHZhbHVlOiBJVGVybWluYWxPcHRpb25zW1RdKSA9PiBhbnkpOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMub25PcHRpb25DaGFuZ2UoZXZlbnRLZXkgPT4ge1xuICAgICAgaWYgKGV2ZW50S2V5ID09PSBrZXkpIHtcbiAgICAgICAgbGlzdGVuZXIodGhpcy5yYXdPcHRpb25zW2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICBwdWJsaWMgb25NdWx0aXBsZU9wdGlvbkNoYW5nZShrZXlzOiAoa2V5b2YgSVRlcm1pbmFsT3B0aW9ucylbXSwgbGlzdGVuZXI6ICgpID0+IGFueSk6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5vbk9wdGlvbkNoYW5nZShldmVudEtleSA9PiB7XG4gICAgICBpZiAoa2V5cy5pbmRleE9mKGV2ZW50S2V5KSAhPT0gLTEpIHtcbiAgICAgICAgbGlzdGVuZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwT3B0aW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBnZXR0ZXIgPSAocHJvcE5hbWU6IHN0cmluZyk6IGFueSA9PiB7XG4gICAgICBpZiAoIShwcm9wTmFtZSBpbiBERUZBVUxUX09QVElPTlMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gb3B0aW9uIHdpdGgga2V5IFwiJHtwcm9wTmFtZX1cImApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmF3T3B0aW9uc1twcm9wTmFtZV07XG4gICAgfTtcblxuICAgIGNvbnN0IHNldHRlciA9IChwcm9wTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIShwcm9wTmFtZSBpbiBERUZBVUxUX09QVElPTlMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gb3B0aW9uIHdpdGgga2V5IFwiJHtwcm9wTmFtZX1cImApO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IHRoaXMuX3Nhbml0aXplQW5kVmFsaWRhdGVPcHRpb24ocHJvcE5hbWUsIHZhbHVlKTtcbiAgICAgIC8vIERvbid0IGZpcmUgYW4gb3B0aW9uIGNoYW5nZSBldmVudCBpZiB0aGV5IGRpZG4ndCBjaGFuZ2VcbiAgICAgIGlmICh0aGlzLnJhd09wdGlvbnNbcHJvcE5hbWVdICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLnJhd09wdGlvbnNbcHJvcE5hbWVdID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX29uT3B0aW9uQ2hhbmdlLmZpcmUocHJvcE5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIGluIHRoaXMucmF3T3B0aW9ucykge1xuICAgICAgY29uc3QgZGVzYyA9IHtcbiAgICAgICAgZ2V0OiBnZXR0ZXIuYmluZCh0aGlzLCBwcm9wTmFtZSksXG4gICAgICAgIHNldDogc2V0dGVyLmJpbmQodGhpcywgcHJvcE5hbWUpXG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMub3B0aW9ucywgcHJvcE5hbWUsIGRlc2MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Nhbml0aXplQW5kVmFsaWRhdGVPcHRpb24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICdjdXJzb3JTdHlsZSc6XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICB2YWx1ZSA9IERFRkFVTFRfT1BUSU9OU1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNDdXJzb3JTdHlsZSh2YWx1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiJHt2YWx1ZX1cIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3b3JkU2VwYXJhdG9yJzpcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgIHZhbHVlID0gREVGQVVMVF9PUFRJT05TW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmb250V2VpZ2h0JzpcbiAgICAgIGNhc2UgJ2ZvbnRXZWlnaHRCb2xkJzpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgMSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAxMDAwKSB7XG4gICAgICAgICAgLy8gYWxyZWFkeSB2YWxpZCBudW1lcmljIHZhbHVlXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBGT05UX1dFSUdIVF9PUFRJT05TLmluY2x1ZGVzKHZhbHVlKSA/IHZhbHVlIDogREVGQVVMVF9PUFRJT05TW2tleV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3Vyc29yV2lkdGgnOlxuICAgICAgICB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2ggZm9yIGJvdW5kcyBjaGVja1xuICAgICAgY2FzZSAnbGluZUhlaWdodCc6XG4gICAgICBjYXNlICd0YWJTdG9wV2lkdGgnOlxuICAgICAgICBpZiAodmFsdWUgPCAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gY2Fubm90IGJlIGxlc3MgdGhhbiAxLCB2YWx1ZTogJHt2YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbmltdW1Db250cmFzdFJhdGlvJzpcbiAgICAgICAgdmFsdWUgPSBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgTWF0aC5yb3VuZCh2YWx1ZSAqIDEwKSAvIDEwKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2Nyb2xsYmFjayc6XG4gICAgICAgIHZhbHVlID0gTWF0aC5taW4odmFsdWUsIDQyOTQ5NjcyOTUpO1xuICAgICAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gY2Fubm90IGJlIGxlc3MgdGhhbiAwLCB2YWx1ZTogJHt2YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Zhc3RTY3JvbGxTZW5zaXRpdml0eSc6XG4gICAgICBjYXNlICdzY3JvbGxTZW5zaXRpdml0eSc6XG4gICAgICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gY2Fubm90IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAwLCB2YWx1ZTogJHt2YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Jvd3MnOlxuICAgICAgY2FzZSAnY29scyc6XG4gICAgICAgIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBtdXN0IGJlIG51bWVyaWMsIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2luZG93c1B0eSc6XG4gICAgICAgIHZhbHVlID0gdmFsdWUgPz8ge307XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDdXJzb3JTdHlsZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEN1cnNvclN0eWxlIHtcbiAgcmV0dXJuIHZhbHVlID09PSAnYmxvY2snIHx8IHZhbHVlID09PSAndW5kZXJsaW5lJyB8fCB2YWx1ZSA9PT0gJ2Jhcic7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElPc2NMaW5rU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJTWFya2VyLCBJT3NjTGlua0RhdGEgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgT3NjTGlua1NlcnZpY2UgaW1wbGVtZW50cyBJT3NjTGlua1NlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgcHJpdmF0ZSBfbmV4dElkID0gMTtcblxuICAvKipcbiAgICogQSBtYXAgb2YgdGhlIGxpbmsga2V5IHRvIGxpbmsgZW50cnkuIFRoaXMgaXMgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBsaW5lcyB0byBsaW5rcyB3aXRoIGlkcy5cbiAgICovXG4gIHByaXZhdGUgX2VudHJpZXNXaXRoSWQ6IE1hcDxzdHJpbmcsIElPc2NMaW5rRW50cnlXaXRoSWQ+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiB0aGUgbGluayBpZCB0byB0aGUgbGluayBlbnRyeS4gVGhlIFwibGluayBpZFwiIChudW1iZXIpIHdoaWNoIGlzIHRoZSBudW1iZXJpY1xuICAgKiByZXByZXNlbnRhdGlvbiBvZiBhIHVuaXF1ZSBsaW5rIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCBcImlkXCIgKHN0cmluZykgd2hpY2ggY29tZXMgaW4gd2l0aFxuICAgKiBgaWQ9YCBpbiB0aGUgT1NDIGxpbmsncyBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZGF0YUJ5TGlua0lkOiBNYXA8bnVtYmVyLCBJT3NjTGlua0VudHJ5Tm9JZCB8IElPc2NMaW5rRW50cnlXaXRoSWQ+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZVxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckxpbmsoZGF0YTogSU9zY0xpbmtEYXRhKTogbnVtYmVyIHtcbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcjtcblxuICAgIC8vIExpbmtzIHdpdGggbm8gaWQgd2lsbCBvbmx5IGV2ZXIgYmUgcmVnaXN0ZXJlZCBhIHNpbmdsZSB0aW1lXG4gICAgaWYgKGRhdGEuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWFya2VyID0gYnVmZmVyLmFkZE1hcmtlcihidWZmZXIueWJhc2UgKyBidWZmZXIueSk7XG4gICAgICBjb25zdCBlbnRyeTogSU9zY0xpbmtFbnRyeU5vSWQgPSB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIGlkOiB0aGlzLl9uZXh0SWQrKyxcbiAgICAgICAgbGluZXM6IFttYXJrZXJdXG4gICAgICB9O1xuICAgICAgbWFya2VyLm9uRGlzcG9zZSgoKSA9PiB0aGlzLl9yZW1vdmVNYXJrZXJGcm9tTGluayhlbnRyeSwgbWFya2VyKSk7XG4gICAgICB0aGlzLl9kYXRhQnlMaW5rSWQuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgICByZXR1cm4gZW50cnkuaWQ7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBsaW5lIHRvIHRoZSBsaW5rIGlmIGl0IGFscmVhZHkgZXhpc3RzXG4gICAgY29uc3QgY2FzdERhdGEgPSBkYXRhIGFzIFJlcXVpcmVkPElPc2NMaW5rRGF0YT47XG4gICAgY29uc3Qga2V5ID0gdGhpcy5fZ2V0RW50cnlJZEtleShjYXN0RGF0YSk7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLl9lbnRyaWVzV2l0aElkLmdldChrZXkpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgdGhpcy5hZGRMaW5lVG9MaW5rKG1hdGNoLmlkLCBidWZmZXIueWJhc2UgKyBidWZmZXIueSk7XG4gICAgICByZXR1cm4gbWF0Y2guaWQ7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBsaW5rXG4gICAgY29uc3QgbWFya2VyID0gYnVmZmVyLmFkZE1hcmtlcihidWZmZXIueWJhc2UgKyBidWZmZXIueSk7XG4gICAgY29uc3QgZW50cnk6IElPc2NMaW5rRW50cnlXaXRoSWQgPSB7XG4gICAgICBpZDogdGhpcy5fbmV4dElkKyssXG4gICAgICBrZXk6IHRoaXMuX2dldEVudHJ5SWRLZXkoY2FzdERhdGEpLFxuICAgICAgZGF0YTogY2FzdERhdGEsXG4gICAgICBsaW5lczogW21hcmtlcl1cbiAgICB9O1xuICAgIG1hcmtlci5vbkRpc3Bvc2UoKCkgPT4gdGhpcy5fcmVtb3ZlTWFya2VyRnJvbUxpbmsoZW50cnksIG1hcmtlcikpO1xuICAgIHRoaXMuX2VudHJpZXNXaXRoSWQuc2V0KGVudHJ5LmtleSwgZW50cnkpO1xuICAgIHRoaXMuX2RhdGFCeUxpbmtJZC5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnkuaWQ7XG4gIH1cblxuICBwdWJsaWMgYWRkTGluZVRvTGluayhsaW5rSWQ6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLl9kYXRhQnlMaW5rSWQuZ2V0KGxpbmtJZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZW50cnkubGluZXMuZXZlcnkoZSA9PiBlLmxpbmUgIT09IHkpKSB7XG4gICAgICBjb25zdCBtYXJrZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5hZGRNYXJrZXIoeSk7XG4gICAgICBlbnRyeS5saW5lcy5wdXNoKG1hcmtlcik7XG4gICAgICBtYXJrZXIub25EaXNwb3NlKCgpID0+IHRoaXMuX3JlbW92ZU1hcmtlckZyb21MaW5rKGVudHJ5LCBtYXJrZXIpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0TGlua0RhdGEobGlua0lkOiBudW1iZXIpOiBJT3NjTGlua0RhdGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhQnlMaW5rSWQuZ2V0KGxpbmtJZCk/LmRhdGE7XG4gIH1cblxuICBwcml2YXRlIF9nZXRFbnRyeUlkS2V5KGxpbmtEYXRhOiBSZXF1aXJlZDxJT3NjTGlua0RhdGE+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7bGlua0RhdGEuaWR9Ozske2xpbmtEYXRhLnVyaX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlTWFya2VyRnJvbUxpbmsoZW50cnk6IElPc2NMaW5rRW50cnlOb0lkIHwgSU9zY0xpbmtFbnRyeVdpdGhJZCwgbWFya2VyOiBJTWFya2VyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSBlbnRyeS5saW5lcy5pbmRleE9mKG1hcmtlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyeS5saW5lcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmIChlbnRyeS5saW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChlbnRyeS5kYXRhLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fZW50cmllc1dpdGhJZC5kZWxldGUoKGVudHJ5IGFzIElPc2NMaW5rRW50cnlXaXRoSWQpLmtleSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9kYXRhQnlMaW5rSWQuZGVsZXRlKGVudHJ5LmlkKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIElPc2NMaW5rRW50cnk8VCBleHRlbmRzIElPc2NMaW5rRGF0YT4ge1xuICBkYXRhOiBUO1xuICBpZDogbnVtYmVyO1xuICBsaW5lczogSU1hcmtlcltdO1xufVxuXG5pbnRlcmZhY2UgSU9zY0xpbmtFbnRyeU5vSWQgZXh0ZW5kcyBJT3NjTGlua0VudHJ5PElPc2NMaW5rRGF0YT4ge1xufVxuXG5pbnRlcmZhY2UgSU9zY0xpbmtFbnRyeVdpdGhJZCBleHRlbmRzIElPc2NMaW5rRW50cnk8UmVxdWlyZWQ8SU9zY0xpbmtEYXRhPj4ge1xuICBrZXk6IHN0cmluZztcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIFRoaXMgd2FzIGhlYXZpbHkgaW5zcGlyZWQgZnJvbSBtaWNyb3NvZnQvdnNjb2RlJ3MgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtIChNSVQpLlxuICovXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgSVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuY29uc3QgRElfVEFSR0VUID0gJ2RpJHRhcmdldCc7XG5jb25zdCBESV9ERVBFTkRFTkNJRVMgPSAnZGkkZGVwZW5kZW5jaWVzJztcblxuZXhwb3J0IGNvbnN0IHNlcnZpY2VSZWdpc3RyeTogTWFwPHN0cmluZywgSVNlcnZpY2VJZGVudGlmaWVyPGFueT4+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZURlcGVuZGVuY2llcyhjdG9yOiBhbnkpOiB7IGlkOiBJU2VydmljZUlkZW50aWZpZXI8YW55PiwgaW5kZXg6IG51bWJlciwgb3B0aW9uYWw6IGJvb2xlYW4gfVtdIHtcbiAgcmV0dXJuIGN0b3JbRElfREVQRU5ERU5DSUVTXSB8fCBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlY29yYXRvcjxUPihpZDogc3RyaW5nKTogSVNlcnZpY2VJZGVudGlmaWVyPFQ+IHtcbiAgaWYgKHNlcnZpY2VSZWdpc3RyeS5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIHNlcnZpY2VSZWdpc3RyeS5nZXQoaWQpITtcbiAgfVxuXG4gIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZnVuY3Rpb24gKHRhcmdldDogRnVuY3Rpb24sIGtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdASVNlcnZpY2VOYW1lLWRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIHRvIGRlY29yYXRlIGEgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShkZWNvcmF0b3IsIHRhcmdldCwgaW5kZXgpO1xuICB9O1xuXG4gIGRlY29yYXRvci50b1N0cmluZyA9ICgpID0+IGlkO1xuXG4gIHNlcnZpY2VSZWdpc3RyeS5zZXQoaWQsIGRlY29yYXRvcik7XG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG5cbmZ1bmN0aW9uIHN0b3JlU2VydmljZURlcGVuZGVuY3koaWQ6IEZ1bmN0aW9uLCB0YXJnZXQ6IEZ1bmN0aW9uLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICgodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9PT0gdGFyZ2V0KSB7XG4gICAgKHRhcmdldCBhcyBhbnkpW0RJX0RFUEVOREVOQ0lFU10ucHVzaCh7IGlkLCBpbmRleCB9KTtcbiAgfSBlbHNlIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXSA9IFt7IGlkLCBpbmRleCB9XTtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfVEFSR0VUXSA9IHRhcmdldDtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUV2ZW50LCBJRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJQnVmZmVyLCBJQnVmZmVyU2V0IH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBJRGVjUHJpdmF0ZU1vZGVzLCBJQ29yZU1vdXNlRXZlbnQsIENvcmVNb3VzZUVuY29kaW5nLCBJQ29yZU1vdXNlUHJvdG9jb2wsIENvcmVNb3VzZUV2ZW50VHlwZSwgSUNoYXJzZXQsIElXaW5kb3dPcHRpb25zLCBJTW9kZXMsIElBdHRyaWJ1dGVEYXRhLCBTY3JvbGxTb3VyY2UsIElEaXNwb3NhYmxlLCBJQ29sb3IsIEN1cnNvclN0eWxlLCBDdXJzb3JJbmFjdGl2ZVN0eWxlLCBJT3NjTGlua0RhdGEgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlRGVjb3JhdG9yIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBJRGVjb3JhdGlvbk9wdGlvbnMsIElEZWNvcmF0aW9uLCBJTGlua0hhbmRsZXIsIElXaW5kb3dzUHR5LCBJTG9nZ2VyIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuZXhwb3J0IGNvbnN0IElCdWZmZXJTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElCdWZmZXJTZXJ2aWNlPignQnVmZmVyU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQnVmZmVyU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGNvbHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcm93czogbnVtYmVyO1xuICByZWFkb25seSBidWZmZXI6IElCdWZmZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcnM6IElCdWZmZXJTZXQ7XG4gIGlzVXNlclNjcm9sbGluZzogYm9vbGVhbjtcbiAgb25SZXNpemU6IElFdmVudDx7IGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyIH0+O1xuICBvblNjcm9sbDogSUV2ZW50PG51bWJlcj47XG4gIHNjcm9sbChlcmFzZUF0dHI6IElBdHRyaWJ1dGVEYXRhLCBpc1dyYXBwZWQ/OiBib29sZWFuKTogdm9pZDtcbiAgc2Nyb2xsTGluZXMoZGlzcDogbnVtYmVyLCBzdXBwcmVzc1Njcm9sbEV2ZW50PzogYm9vbGVhbiwgc291cmNlPzogU2Nyb2xsU291cmNlKTogdm9pZDtcbiAgcmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlTW91c2VTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDb3JlTW91c2VTZXJ2aWNlPignQ29yZU1vdXNlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZU1vdXNlU2VydmljZSB7XG4gIGFjdGl2ZVByb3RvY29sOiBzdHJpbmc7XG4gIGFjdGl2ZUVuY29kaW5nOiBzdHJpbmc7XG4gIGFyZU1vdXNlRXZlbnRzQWN0aXZlOiBib29sZWFuO1xuICBhZGRQcm90b2NvbChuYW1lOiBzdHJpbmcsIHByb3RvY29sOiBJQ29yZU1vdXNlUHJvdG9jb2wpOiB2b2lkO1xuICBhZGRFbmNvZGluZyhuYW1lOiBzdHJpbmcsIGVuY29kaW5nOiBDb3JlTW91c2VFbmNvZGluZyk6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbW91c2UgZXZlbnQgdG8gYmUgc2VudC5cbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBwYXNzZWQgYWxsIHByb3RvY29sIHJlc3RyaWN0aW9ucyBhbmQgYSByZXBvcnRcbiAgICogd2FzIHNlbnQsIG90aGVyd2lzZSBmYWxzZS4gVGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgdXNlZCB0byBkZWNpZGUgd2hldGhlclxuICAgKiB0aGUgZGVmYXVsdCBldmVudCBhY3Rpb24gaW4gdGhlIGJvd3NlciBjb21wb25lbnQgc2hvdWxkIGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBtZXRob2Qgd2lsbCBjaGFuZ2UgdmFsdWVzIG9mIHRoZSBnaXZlbiBldmVudCBvYmplY3RcbiAgICogdG8gZnVsbGZpbGwgcHJvdG9jb2wgYW5kIGVuY29kaW5nIHJlc3RyaWN0aW9ucy5cbiAgICovXG4gIHRyaWdnZXJNb3VzZUV2ZW50KGV2ZW50OiBJQ29yZU1vdXNlRXZlbnQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFdmVudCB0byBhbm5vdW5jZSBjaGFuZ2VzIGluIG1vdXNlIHRyYWNraW5nLlxuICAgKi9cbiAgb25Qcm90b2NvbENoYW5nZTogSUV2ZW50PENvcmVNb3VzZUV2ZW50VHlwZT47XG5cbiAgLyoqXG4gICAqIEh1bWFuIHJlYWRhYmxlIHZlcnNpb24gb2YgbW91c2UgZXZlbnRzLlxuICAgKi9cbiAgZXhwbGFpbkV2ZW50cyhldmVudHM6IENvcmVNb3VzZUV2ZW50VHlwZSk6IHsgW2V2ZW50OiBzdHJpbmddOiBib29sZWFuIH07XG59XG5cbmV4cG9ydCBjb25zdCBJQ29yZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVTZXJ2aWNlPignQ29yZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNvcmVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxseSB0aGUgY3Vyc29yIHdpbGwgbm90IGJlIHZpc2libGUgdW50aWwgdGhlIGZpcnN0IHRpbWUgdGhlIHRlcm1pbmFsXG4gICAqIGlzIGZvY3VzZWQuXG4gICAqL1xuICBpc0N1cnNvckluaXRpYWxpemVkOiBib29sZWFuO1xuICBpc0N1cnNvckhpZGRlbjogYm9vbGVhbjtcblxuICByZWFkb25seSBtb2RlczogSU1vZGVzO1xuICByZWFkb25seSBkZWNQcml2YXRlTW9kZXM6IElEZWNQcml2YXRlTW9kZXM7XG5cbiAgcmVhZG9ubHkgb25EYXRhOiBJRXZlbnQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgb25Vc2VySW5wdXQ6IElFdmVudDx2b2lkPjtcbiAgcmVhZG9ubHkgb25CaW5hcnk6IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblJlcXVlc3RTY3JvbGxUb0JvdHRvbTogSUV2ZW50PHZvaWQ+O1xuXG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBvbkRhdGEgZXZlbnQgaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRoYXQgaXMgYmVpbmcgZW1pdHRlZC5cbiAgICogQHBhcmFtIHdhc1VzZXJJbnB1dCBXaGV0aGVyIHRoZSBkYXRhIG9yaWdpbmF0ZWQgZnJvbSB0aGUgdXNlciAoYXMgb3Bwb3NlZCB0b1xuICAgKiByZXN1bHRpbmcgZnJvbSBwYXJzaW5nIGluY29taW5nIGRhdGEpLiBXaGVuIHRydWUgdGhpcyB3aWxsIGFsc286XG4gICAqIC0gU2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIGJ1ZmZlciBpZiBvcHRpb24gc2Nyb2xsT25Vc2VySW5wdXQgaXMgdHJ1ZS5cbiAgICogLSBGaXJlIHRoZSBgb25Vc2VySW5wdXRgIGV2ZW50IChzbyBzZWxlY3Rpb24gY2FuIGJlIGNsZWFyZWQpLlxuICAgKi9cbiAgdHJpZ2dlckRhdGFFdmVudChkYXRhOiBzdHJpbmcsIHdhc1VzZXJJbnB1dD86IGJvb2xlYW4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyB0aGUgb25CaW5hcnkgZXZlbnQgaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRoYXQgaXMgYmVpbmcgZW1pdHRlZC5cbiAgICovXG4gIHRyaWdnZXJCaW5hcnlFdmVudChkYXRhOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNoYXJzZXRTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDaGFyc2V0U2VydmljZT4oJ0NoYXJzZXRTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDaGFyc2V0U2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBnbGV2ZWw6IG51bWJlcjtcblxuICByZXNldCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIEcgbGV2ZWwgb2YgdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gZ1xuICAgKi9cbiAgc2V0Z0xldmVsKGc6IG51bWJlcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2hhcnNldCBmb3IgdGhlIGdpdmVuIEcgbGV2ZWwgb2YgdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gZ1xuICAgKiBAcGFyYW0gY2hhcnNldFxuICAgKi9cbiAgc2V0Z0NoYXJzZXQoZzogbnVtYmVyLCBjaGFyc2V0OiBJQ2hhcnNldCB8IHVuZGVmaW5lZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlcnZpY2VJZGVudGlmaWVyPFQ+IHtcbiAgKC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcbiAgdHlwZTogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQnJhbmRlZFNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbn1cblxudHlwZSBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEFyZ3MgZXh0ZW5kcyBhbnlbXT4gPSBUQXJncyBleHRlbmRzIFtdID8gW11cbiAgOiBUQXJncyBleHRlbmRzIFsuLi5pbmZlciBURmlyc3QsIGluZmVyIFRMYXN0XSA/IFRMYXN0IGV4dGVuZHMgSUJyYW5kZWRTZXJ2aWNlID8gR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPFRGaXJzdD4gOiBUQXJnc1xuICAgIDogbmV2ZXI7XG5cbmV4cG9ydCBjb25zdCBJSW5zdGFudGlhdGlvblNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUluc3RhbnRpYXRpb25TZXJ2aWNlPignSW5zdGFudGlhdGlvblNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUluc3RhbnRpYXRpb25TZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgc2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+LCBpbnN0YW5jZTogVCk6IHZvaWQ7XG4gIGdldFNlcnZpY2U8VD4oaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxUPik6IFQgfCB1bmRlZmluZWQ7XG4gIGNyZWF0ZUluc3RhbmNlPEN0b3IgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIFIgZXh0ZW5kcyBJbnN0YW5jZVR5cGU8Q3Rvcj4+KHQ6IEN0b3IsIC4uLmFyZ3M6IEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxDb25zdHJ1Y3RvclBhcmFtZXRlcnM8Q3Rvcj4+KTogUjtcbn1cblxuZXhwb3J0IGVudW0gTG9nTGV2ZWxFbnVtIHtcbiAgVFJBQ0UgPSAwLFxuICBERUJVRyA9IDEsXG4gIElORk8gPSAyLFxuICBXQVJOID0gMyxcbiAgRVJST1IgPSA0LFxuICBPRkYgPSA1XG59XG5cbmV4cG9ydCBjb25zdCBJTG9nU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJTG9nU2VydmljZT4oJ0xvZ1NlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBsb2dMZXZlbDogTG9nTGV2ZWxFbnVtO1xuXG4gIHRyYWNlKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZGVidWcobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBpbmZvKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgd2FybihtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElPcHRpb25zU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJT3B0aW9uc1NlcnZpY2U+KCdPcHRpb25zU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJT3B0aW9uc1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVhZCBvbmx5IGFjY2VzcyB0byB0aGUgcmF3IG9wdGlvbnMgb2JqZWN0LCB0aGlzIGlzIGFuIGludGVybmFsLW9ubHkgZmFzdCBwYXRoIGZvciBhY2Nlc3NpbmdcbiAgICogc2luZ2xlIG9wdGlvbnMgd2l0aG91dCBhbnkgdmFsaWRhdGlvbiBhcyB3ZSB0cnVzdCBUeXBlU2NyaXB0IHRvIGVuZm9yY2UgY29ycmVjdCB1c2FnZVxuICAgKiBpbnRlcm5hbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3T3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgYXMgZXhwb3NlZCB0aHJvdWdoIHRoZSBwdWJsaWMgQVBJLCB0aGlzIHByb3BlcnR5IHVzZXMgZ2V0dGVycyBhbmQgc2V0dGVycyB3aXRoXG4gICAqIHZhbGlkYXRpb24gd2hpY2ggbWFrZXMgaXQgc2FmZXIgYnV0IHNsb3dlci4ge0BsaW5rIHJhd09wdGlvbnN9IHNob3VsZCBiZSB1c2VkIGZvciBwcmV0dHkgbXVjaFxuICAgKiBhbGwgaW50ZXJuYWwgdXNhZ2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhbnkgb3B0aW9uIGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBvbk9wdGlvbkNoYW5nZTogSUV2ZW50PGtleW9mIElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGEgc3BlY2lmaWMgb3B0aW9uIGNoYW5nZXMsIHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBpc1xuICAgKiBwcmVmZXJyZWQgb3ZlciB7QGxpbmsgb25PcHRpb25DaGFuZ2V9IHdoZW4gb25seSBhIHNpbmdsZSBvcHRpb24gaXMgYmVpbmcgbGlzdGVuZWQgdG8uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIG9uU3BlY2lmaWNPcHRpb25DaGFuZ2U8VCBleHRlbmRzIGtleW9mIElUZXJtaW5hbE9wdGlvbnM+KGtleTogVCwgbGlzdGVuZXI6IChhcmcxOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPltUXSkgPT4gYW55KTogSURpc3Bvc2FibGU7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYSBzZXQgb2Ygc3BlY2lmaWMgb3B0aW9ucyBjaGFuZ2UsIHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2RcbiAgICogdGhhdCBpcyBwcmVmZXJyZWQgb3ZlciB7QGxpbmsgb25PcHRpb25DaGFuZ2V9IHdoZW4gbXVsdGlwbGUgb3B0aW9ucyBhcmUgYmVpbmcgbGlzdGVuZWQgdG8gYW5kXG4gICAqIGhhbmRsZWQgdGhlIHNhbWUgd2F5LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICBvbk11bHRpcGxlT3B0aW9uQ2hhbmdlKGtleXM6IChrZXlvZiBJVGVybWluYWxPcHRpb25zKVtdLCBsaXN0ZW5lcjogKCkgPT4gYW55KTogSURpc3Bvc2FibGU7XG59XG5cbmV4cG9ydCB0eXBlIEZvbnRXZWlnaHQgPSAnbm9ybWFsJyB8ICdib2xkJyB8ICcxMDAnIHwgJzIwMCcgfCAnMzAwJyB8ICc0MDAnIHwgJzUwMCcgfCAnNjAwJyB8ICc3MDAnIHwgJzgwMCcgfCAnOTAwJyB8IG51bWJlcjtcbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ3RyYWNlJyB8ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ29mZic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRlcm1pbmFsT3B0aW9ucyB7XG4gIGFsbG93UHJvcG9zZWRBcGk/OiBib29sZWFuO1xuICBhbGxvd1RyYW5zcGFyZW5jeT86IGJvb2xlYW47XG4gIGFsdENsaWNrTW92ZXNDdXJzb3I/OiBib29sZWFuO1xuICBjb2xzPzogbnVtYmVyO1xuICBjb252ZXJ0RW9sPzogYm9vbGVhbjtcbiAgY3Vyc29yQmxpbms/OiBib29sZWFuO1xuICBjdXJzb3JTdHlsZT86IEN1cnNvclN0eWxlO1xuICBjdXJzb3JXaWR0aD86IG51bWJlcjtcbiAgY3Vyc29ySW5hY3RpdmVTdHlsZT86IEN1cnNvckluYWN0aXZlU3R5bGU7XG4gIGN1c3RvbUdseXBocz86IGJvb2xlYW47XG4gIGRpc2FibGVTdGRpbj86IGJvb2xlYW47XG4gIGRvY3VtZW50T3ZlcnJpZGU/OiBhbnkgfCBudWxsO1xuICBkcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycz86IGJvb2xlYW47XG4gIGZhc3RTY3JvbGxNb2RpZmllcj86ICdub25lJyB8ICdhbHQnIHwgJ2N0cmwnIHwgJ3NoaWZ0JztcbiAgZmFzdFNjcm9sbFNlbnNpdGl2aXR5PzogbnVtYmVyO1xuICBmb250U2l6ZT86IG51bWJlcjtcbiAgZm9udEZhbWlseT86IHN0cmluZztcbiAgZm9udFdlaWdodD86IEZvbnRXZWlnaHQ7XG4gIGZvbnRXZWlnaHRCb2xkPzogRm9udFdlaWdodDtcbiAgaWdub3JlQnJhY2tldGVkUGFzdGVNb2RlPzogYm9vbGVhbjtcbiAgbGV0dGVyU3BhY2luZz86IG51bWJlcjtcbiAgbGluZUhlaWdodD86IG51bWJlcjtcbiAgbGlua0hhbmRsZXI/OiBJTGlua0hhbmRsZXIgfCBudWxsO1xuICBsb2dMZXZlbD86IExvZ0xldmVsO1xuICBsb2dnZXI/OiBJTG9nZ2VyIHwgbnVsbDtcbiAgbWFjT3B0aW9uSXNNZXRhPzogYm9vbGVhbjtcbiAgbWFjT3B0aW9uQ2xpY2tGb3JjZXNTZWxlY3Rpb24/OiBib29sZWFuO1xuICBtaW5pbXVtQ29udHJhc3RSYXRpbz86IG51bWJlcjtcbiAgcmVzY2FsZU92ZXJsYXBwaW5nR2x5cGhzPzogYm9vbGVhbjtcbiAgcmlnaHRDbGlja1NlbGVjdHNXb3JkPzogYm9vbGVhbjtcbiAgcm93cz86IG51bWJlcjtcbiAgc2NyZWVuUmVhZGVyTW9kZT86IGJvb2xlYW47XG4gIHNjcm9sbGJhY2s/OiBudW1iZXI7XG4gIHNjcm9sbE9uVXNlcklucHV0PzogYm9vbGVhbjtcbiAgc2Nyb2xsU2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIHNtb290aFNjcm9sbER1cmF0aW9uPzogbnVtYmVyO1xuICB0YWJTdG9wV2lkdGg/OiBudW1iZXI7XG4gIHRoZW1lPzogSVRoZW1lO1xuICB3aW5kb3dzTW9kZT86IGJvb2xlYW47XG4gIHdpbmRvd3NQdHk/OiBJV2luZG93c1B0eTtcbiAgd2luZG93T3B0aW9ucz86IElXaW5kb3dPcHRpb25zO1xuICB3b3JkU2VwYXJhdG9yPzogc3RyaW5nO1xuICBvdmVydmlld1J1bGVyV2lkdGg/OiBudW1iZXI7XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBjYW5jZWxFdmVudHM6IGJvb2xlYW47XG4gIHRlcm1OYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRoZW1lIHtcbiAgZm9yZWdyb3VuZD86IHN0cmluZztcbiAgYmFja2dyb3VuZD86IHN0cmluZztcbiAgY3Vyc29yPzogc3RyaW5nO1xuICBjdXJzb3JBY2NlbnQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkZvcmVncm91bmQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIHNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZD86IHN0cmluZztcbiAgYmxhY2s/OiBzdHJpbmc7XG4gIHJlZD86IHN0cmluZztcbiAgZ3JlZW4/OiBzdHJpbmc7XG4gIHllbGxvdz86IHN0cmluZztcbiAgYmx1ZT86IHN0cmluZztcbiAgbWFnZW50YT86IHN0cmluZztcbiAgY3lhbj86IHN0cmluZztcbiAgd2hpdGU/OiBzdHJpbmc7XG4gIGJyaWdodEJsYWNrPzogc3RyaW5nO1xuICBicmlnaHRSZWQ/OiBzdHJpbmc7XG4gIGJyaWdodEdyZWVuPzogc3RyaW5nO1xuICBicmlnaHRZZWxsb3c/OiBzdHJpbmc7XG4gIGJyaWdodEJsdWU/OiBzdHJpbmc7XG4gIGJyaWdodE1hZ2VudGE/OiBzdHJpbmc7XG4gIGJyaWdodEN5YW4/OiBzdHJpbmc7XG4gIGJyaWdodFdoaXRlPzogc3RyaW5nO1xuICBleHRlbmRlZEFuc2k/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IElPc2NMaW5rU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJT3NjTGlua1NlcnZpY2U+KCdPc2NMaW5rU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJT3NjTGlua1NlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGxpbmsgdG8gdGhlIHNlcnZpY2UsIHJldHVybmluZyB0aGUgbGluayBJRC4gVGhlIGxpbmsgZGF0YSBpcyBtYW5hZ2VkIGJ5IHRoaXNcbiAgICogc2VydmljZSBhbmQgd2lsbCBiZSBmcmVlZCB3aGVuIHRoaXMgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaXMgdHJpbW1lZCBvZmYgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHJlZ2lzdGVyTGluayhsaW5rRGF0YTogSU9zY0xpbmtEYXRhKTogbnVtYmVyO1xuICAvKipcbiAgICogQWRkcyBhIGxpbmUgdG8gYSBsaW5rIGlmIG5lZWRlZC5cbiAgICovXG4gIGFkZExpbmVUb0xpbmsobGlua0lkOiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQ7XG4gIC8qKiBHZXQgdGhlIGxpbmsgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rIElELiAqL1xuICBnZXRMaW5rRGF0YShsaW5rSWQ6IG51bWJlcik6IElPc2NMaW5rRGF0YSB8IHVuZGVmaW5lZDtcbn1cblxuLypcbiAqIFdpZHRoIGFuZCBHcmFwaGVtZV9DbHVzdGVyX0JyZWFrIHByb3BlcnRpZXMgb2YgYSBjaGFyYWN0ZXIgYXMgYSBiaXQgbWFzay5cbiAqXG4gKiBiaXQgMDogc2hvdWxkSm9pbiAtIHNob3VsZCBjb21iaW5lIHdpdGggcHJlY2VkaW5nIGNoYXJhY3Rlci5cbiAqIGJpdCAxLi4yOiB3Y3dpZHRoIC0gc2VlIFVuaWNvZGVDaGFyV2lkdGguXG4gKiBiaXQgMy4uMzE6IGNsYXNzIG9mIGNoYXJhY3RlciAoY3VycmVudGx5IG9ubHkgNCBiaXRzIGFyZSB1c2VkKS5cbiAqICAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZWQgZ3JhcGhlbWUgY2x1c3RlcmluZyAtIGkuZS4gd2hpY2ggY29kZXBvaW50c1xuICogICBhcmUgdG8gYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBjb21wb3VuZCBjaGFyYWN0ZXIuXG4gKlxuICogVXNlIHRoZSBVbmljb2RlU2VydmljZSBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlWYWx1ZSB0byBjcmVhdGUgYVxuICogVW5pY29kZUNoYXJQcm9wZXJ0aWVzOyB1c2UgZXh0cmFjdFNob3VsZEpvaW4sIGV4dHJhY3RXaWR0aCwgYW5kXG4gKiBleHRyYWN0Q2hhcktpbmQgdG8gZXh0cmFjdCB0aGUgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgVW5pY29kZUNoYXJQcm9wZXJ0aWVzID0gbnVtYmVyO1xuXG4vKipcbiAqIFdpZHRoIGluIGNvbHVtbnMgb2YgYSBjaGFyYWN0ZXIuXG4gKiBJbiBhIENKSyBjb250ZXh0LCBcImhhbGYtd2lkdGhcIiBjaGFyYWN0ZXJzIChzdWNoIGFzIExhdGluKSBhcmUgd2lkdGggMSxcbiAqIHdoaWxlIFwiZnVsbC13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgS2FuamkpIGFyZSAyIGNvbHVtbnMgd2lkZS5cbiAqIENvbWJpbmluZyBjaGFyYWN0ZXJzIChzdWNoIGFzIGFjY2VudHMpIGFyZSB3aWR0aCAwLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhcldpZHRoID0gMCB8IDEgfCAyO1xuXG5leHBvcnQgY29uc3QgSVVuaWNvZGVTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElVbmljb2RlU2VydmljZT4oJ1VuaWNvZGVTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElVbmljb2RlU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKiogUmVnaXN0ZXIgYW4gVW5pY29kZSB2ZXJzaW9uIHByb3ZpZGVyLiAqL1xuICByZWdpc3Rlcihwcm92aWRlcjogSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIpOiB2b2lkO1xuICAvKiogUmVnaXN0ZXJlZCBVbmljb2RlIHZlcnNpb25zLiAqL1xuICByZWFkb25seSB2ZXJzaW9uczogc3RyaW5nW107XG4gIC8qKiBDdXJyZW50bHkgYWN0aXZlIHZlcnNpb24uICovXG4gIGFjdGl2ZVZlcnNpb246IHN0cmluZztcbiAgLyoqIEV2ZW50IHRyaWdnZXJlZCwgd2hlbiBhY3RpdmF0ZSB2ZXJzaW9uIGNoYW5nZWQuICovXG4gIHJlYWRvbmx5IG9uQ2hhbmdlOiBJRXZlbnQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogVW5pY29kZSB2ZXJzaW9uIGRlcGVuZGVudFxuICAgKi9cbiAgd2N3aWR0aChjb2RlcG9pbnQ6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGdldFN0cmluZ0NlbGxXaWR0aChzOiBzdHJpbmcpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZXR1cm4gY2hhcmFjdGVyIHdpZHRoIGFuZCB0eXBlIGZvciBncmFwaGVtZSBjbHVzdGVyaW5nLlxuICAgKiBJZiBwcmVjZWRpbmcgIT0gMCwgaXQgaXMgdGhlIHJldHVybiBjb2RlIGZyb20gdGhlIHByZXZpb3VzIGNoYXJhY3RlcjtcbiAgICogaW4gdGhhdCBjYXNlIHRoZSByZXN1bHQgc3BlY2lmaWVzIGlmIHRoZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBqb2luZWQuXG4gICAqL1xuICBjaGFyUHJvcGVydGllcyhjb2RlcG9pbnQ6IG51bWJlciwgcHJlY2VkaW5nOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBVbmljb2RlQ2hhclByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIge1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHdjd2lkdGgodWNzOiBudW1iZXIpOiBVbmljb2RlQ2hhcldpZHRoO1xuICBjaGFyUHJvcGVydGllcyhjb2RlcG9pbnQ6IG51bWJlciwgcHJlY2VkaW5nOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBVbmljb2RlQ2hhclByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBjb25zdCBJRGVjb3JhdGlvblNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SURlY29yYXRpb25TZXJ2aWNlPignRGVjb3JhdGlvblNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSURlY29yYXRpb25TZXJ2aWNlIGV4dGVuZHMgSURpc3Bvc2FibGUge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZGVjb3JhdGlvbnM6IEl0ZXJhYmxlSXRlcmF0b3I8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlYWRvbmx5IG9uRGVjb3JhdGlvblJlZ2lzdGVyZWQ6IElFdmVudDxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVtb3ZlZDogSUV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWdpc3RlckRlY29yYXRpb24oZGVjb3JhdGlvbk9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucyk6IElEZWNvcmF0aW9uIHwgdW5kZWZpbmVkO1xuICByZXNldCgpOiB2b2lkO1xuICAvKipcbiAgICogVHJpZ2dlciBhIGNhbGxiYWNrIG92ZXIgdGhlIGRlY29yYXRpb24gYXQgYSBjZWxsIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS4gVGhpcyB1c2VzIGEgY2FsbGJhY2tcbiAgICogaW5zdGVhZCBvZiBhbiBpdGVyYXRvciBhcyBpdCdzIHR5cGljYWxseSB1c2VkIGluIGhvdCBjb2RlIHBhdGhzLlxuICAgKi9cbiAgZm9yRWFjaERlY29yYXRpb25BdENlbGwoeDogbnVtYmVyLCBsaW5lOiBudW1iZXIsIGxheWVyOiAnYm90dG9tJyB8ICd0b3AnIHwgdW5kZWZpbmVkLCBjYWxsYmFjazogKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pID0+IHZvaWQpOiB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBJSW50ZXJuYWxEZWNvcmF0aW9uIGV4dGVuZHMgSURlY29yYXRpb24ge1xuICByZWFkb25seSBvcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnM7XG4gIHJlYWRvbmx5IGJhY2tncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBmb3JlZ3JvdW5kQ29sb3JSR0I6IElDb2xvciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb25SZW5kZXJFbWl0dGVyOiBJRXZlbnRFbWl0dGVyPEhUTUxFbGVtZW50Pjtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgVW5pY29kZVY2IH0gZnJvbSAnY29tbW9uL2lucHV0L1VuaWNvZGVWNic7XG5pbXBvcnQgeyBJVW5pY29kZVNlcnZpY2UsIElVbmljb2RlVmVyc2lvblByb3ZpZGVyLCBVbmljb2RlQ2hhclByb3BlcnRpZXMsIFVuaWNvZGVDaGFyV2lkdGggfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgY2xhc3MgVW5pY29kZVNlcnZpY2UgaW1wbGVtZW50cyBJVW5pY29kZVNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgcHJpdmF0ZSBfcHJvdmlkZXJzOiB7W2tleTogc3RyaW5nXTogSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXJ9ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcHJpdmF0ZSBfYWN0aXZlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfYWN0aXZlUHJvdmlkZXI6IElVbmljb2RlVmVyc2lvblByb3ZpZGVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmV2ZW50O1xuXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdFNob3VsZEpvaW4odmFsdWU6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodmFsdWUgJiAxKSAhPT0gMDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGV4dHJhY3RXaWR0aCh2YWx1ZTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogVW5pY29kZUNoYXJXaWR0aCB7XG4gICAgcmV0dXJuICgodmFsdWUgPj4gMSkgJiAweDMpIGFzIFVuaWNvZGVDaGFyV2lkdGg7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0Q2hhcktpbmQodmFsdWU6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHZhbHVlID4+IDM7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eVZhbHVlKHN0YXRlOiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIHNob3VsZEpvaW46IGJvb2xlYW4gPSBmYWxzZSk6IFVuaWNvZGVDaGFyUHJvcGVydGllcyB7XG4gICAgcmV0dXJuICgoc3RhdGUgJiAweGZmZmZmZikgPDwgMykgfCAoKHdpZHRoICYgMykgPDwgMSkgfCAoc2hvdWxkSm9pbj8xOjApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgZGVmYXVsdFByb3ZpZGVyID0gbmV3IFVuaWNvZGVWNigpO1xuICAgIHRoaXMucmVnaXN0ZXIoZGVmYXVsdFByb3ZpZGVyKTtcbiAgICB0aGlzLl9hY3RpdmUgPSBkZWZhdWx0UHJvdmlkZXIudmVyc2lvbjtcbiAgICB0aGlzLl9hY3RpdmVQcm92aWRlciA9IGRlZmF1bHRQcm92aWRlcjtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmVyc2lvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9wcm92aWRlcnMpO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuX3Byb3ZpZGVyc1t2ZXJzaW9uXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIFVuaWNvZGUgdmVyc2lvbiBcIiR7dmVyc2lvbn1cImApO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmUgPSB2ZXJzaW9uO1xuICAgIHRoaXMuX2FjdGl2ZVByb3ZpZGVyID0gdGhpcy5fcHJvdmlkZXJzW3ZlcnNpb25dO1xuICAgIHRoaXMuX29uQ2hhbmdlLmZpcmUodmVyc2lvbik7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXIocHJvdmlkZXI6IElVbmljb2RlVmVyc2lvblByb3ZpZGVyKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvdmlkZXJzW3Byb3ZpZGVyLnZlcnNpb25dID0gcHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogVW5pY29kZSB2ZXJzaW9uIGRlcGVuZGVudCBpbnRlcmZhY2UuXG4gICAqL1xuICBwdWJsaWMgd2N3aWR0aChudW06IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGgge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVQcm92aWRlci53Y3dpZHRoKG51bSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RyaW5nQ2VsbFdpZHRoKHM6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgbGV0IHByZWNlZGluZ0luZm8gPSAwO1xuICAgIGNvbnN0IGxlbmd0aCA9IHMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGxldCBjb2RlID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgICAgLy8gc3Vycm9nYXRlIHBhaXIgZmlyc3RcbiAgICAgIGlmICgweEQ4MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4REJGRikge1xuICAgICAgICBpZiAoKytpID49IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gd2l0aCBzdHJpbmdzIHJldHJpZXZlZCBmcm9tXG4gICAgICAgICAgLy8gQnVmZmVyLnRyYW5zbGF0ZVRvU3RyaW5nIGFzIGl0IGNvbnZlcnRzIGZyb20gVVRGLTMyXG4gICAgICAgICAgLy8gYW5kIHRoZXJlZm9yZSBhbHdheXMgc2hvdWxkIGNvbnRhaW4gdGhlIHNlY29uZCBwYXJ0XG4gICAgICAgICAgLy8gZm9yIGFueSBvdGhlciBzdHJpbmcgd2Ugc3RpbGwgaGF2ZSB0byBoYW5kbGUgaXQgc29tZWhvdzpcbiAgICAgICAgICAvLyBzaW1wbHkgdHJlYXQgdGhlIGxvbmVseSBzdXJyb2dhdGUgZmlyc3QgYXMgYSBzaW5nbGUgY2hhciAoVUNTLTIgYmVoYXZpb3IpXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCArIHRoaXMud2N3aWR0aChjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWNvbmQgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIC8vIGNvbnZlcnQgc3Vycm9nYXRlIHBhaXIgdG8gaGlnaCBjb2RlcG9pbnQgb25seSBmb3IgdmFsaWQgc2Vjb25kIHBhcnQgKFVURi0xNilcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHRyZWF0IHRoZW0gaW5kZXBlbmRlbnRseSAoVUNTLTIgYmVoYXZpb3IpXG4gICAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgICBjb2RlID0gKGNvZGUgLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCArPSB0aGlzLndjd2lkdGgoc2Vjb25kKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudEluZm8gPSB0aGlzLmNoYXJQcm9wZXJ0aWVzKGNvZGUsIHByZWNlZGluZ0luZm8pO1xuICAgICAgbGV0IGNoV2lkdGggPSBVbmljb2RlU2VydmljZS5leHRyYWN0V2lkdGgoY3VycmVudEluZm8pO1xuICAgICAgaWYgKFVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RTaG91bGRKb2luKGN1cnJlbnRJbmZvKSkge1xuICAgICAgICBjaFdpZHRoIC09IFVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RXaWR0aChwcmVjZWRpbmdJbmZvKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBjaFdpZHRoO1xuICAgICAgcHJlY2VkaW5nSW5mbyA9IGN1cnJlbnRJbmZvO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVByb3ZpZGVyLmNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludCwgcHJlY2VkaW5nKTtcbiAgfVxufVxuIiwgIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgKiBhcyBTdHJpbmdzIGZyb20gJ2Jyb3dzZXIvTG9jYWxpemFibGVTdHJpbmdzJztcbmltcG9ydCB7IFRlcm1pbmFsIGFzIFRlcm1pbmFsQ29yZSB9IGZyb20gJ2Jyb3dzZXIvVGVybWluYWwnO1xuaW1wb3J0IHsgSUJ1ZmZlclJhbmdlLCBJVGVybWluYWwgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElFdmVudCB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSVRlcm1pbmFsT3B0aW9ucyB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBBZGRvbk1hbmFnZXIgfSBmcm9tICdjb21tb24vcHVibGljL0FkZG9uTWFuYWdlcic7XG5pbXBvcnQgeyBCdWZmZXJOYW1lc3BhY2VBcGkgfSBmcm9tICdjb21tb24vcHVibGljL0J1ZmZlck5hbWVzcGFjZUFwaSc7XG5pbXBvcnQgeyBQYXJzZXJBcGkgfSBmcm9tICdjb21tb24vcHVibGljL1BhcnNlckFwaSc7XG5pbXBvcnQgeyBVbmljb2RlQXBpIH0gZnJvbSAnY29tbW9uL3B1YmxpYy9Vbmljb2RlQXBpJztcbmltcG9ydCB7IElCdWZmZXJOYW1lc3BhY2UgYXMgSUJ1ZmZlck5hbWVzcGFjZUFwaSwgSURlY29yYXRpb24sIElEZWNvcmF0aW9uT3B0aW9ucywgSURpc3Bvc2FibGUsIElMaW5rUHJvdmlkZXIsIElMb2NhbGl6YWJsZVN0cmluZ3MsIElNYXJrZXIsIElNb2RlcywgSVBhcnNlciwgSVRlcm1pbmFsQWRkb24sIFRlcm1pbmFsIGFzIElUZXJtaW5hbEFwaSwgSVRlcm1pbmFsSW5pdE9ubHlPcHRpb25zLCBJVW5pY29kZUhhbmRsaW5nIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuLyoqXG4gKiBUaGUgc2V0IG9mIG9wdGlvbnMgdGhhdCBvbmx5IGhhdmUgYW4gZWZmZWN0IHdoZW4gc2V0IGluIHRoZSBUZXJtaW5hbCBjb25zdHJ1Y3Rvci5cbiAqL1xuY29uc3QgQ09OU1RSVUNUT1JfT05MWV9PUFRJT05TID0gWydjb2xzJywgJ3Jvd3MnXTtcblxuZXhwb3J0IGNsYXNzIFRlcm1pbmFsIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElUZXJtaW5hbEFwaSB7XG4gIHByaXZhdGUgX2NvcmU6IElUZXJtaW5hbDtcbiAgcHJpdmF0ZSBfYWRkb25NYW5hZ2VyOiBBZGRvbk1hbmFnZXI7XG4gIHByaXZhdGUgX3BhcnNlcjogSVBhcnNlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYnVmZmVyOiBCdWZmZXJOYW1lc3BhY2VBcGkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3B1YmxpY09wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBJVGVybWluYWxPcHRpb25zICYgSVRlcm1pbmFsSW5pdE9ubHlPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2NvcmUgPSB0aGlzLnJlZ2lzdGVyKG5ldyBUZXJtaW5hbENvcmUob3B0aW9ucykpO1xuICAgIHRoaXMuX2FkZG9uTWFuYWdlciA9IHRoaXMucmVnaXN0ZXIobmV3IEFkZG9uTWFuYWdlcigpKTtcblxuICAgIHRoaXMuX3B1YmxpY09wdGlvbnMgPSB7IC4uLiB0aGlzLl9jb3JlLm9wdGlvbnMgfTtcbiAgICBjb25zdCBnZXR0ZXIgPSAocHJvcE5hbWU6IHN0cmluZyk6IGFueSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fY29yZS5vcHRpb25zW3Byb3BOYW1lXTtcbiAgICB9O1xuICAgIGNvbnN0IHNldHRlciA9IChwcm9wTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCA9PiB7XG4gICAgICB0aGlzLl9jaGVja1JlYWRvbmx5T3B0aW9ucyhwcm9wTmFtZSk7XG4gICAgICB0aGlzLl9jb3JlLm9wdGlvbnNbcHJvcE5hbWVdID0gdmFsdWU7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gdGhpcy5fY29yZS5vcHRpb25zKSB7XG4gICAgICBjb25zdCBkZXNjID0ge1xuICAgICAgICBnZXQ6IGdldHRlci5iaW5kKHRoaXMsIHByb3BOYW1lKSxcbiAgICAgICAgc2V0OiBzZXR0ZXIuYmluZCh0aGlzLCBwcm9wTmFtZSlcbiAgICAgIH07XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5fcHVibGljT3B0aW9ucywgcHJvcE5hbWUsIGRlc2MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrUmVhZG9ubHlPcHRpb25zKHByb3BOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiBhbnkgY29uc3RydWN0b3Igb25seSBvcHRpb24gaXMgbW9kaWZpZWRcbiAgICAvLyBmcm9tIHRlcm1pbmFsLm9wdGlvbnNcbiAgICAvLyBNb2RpZmljYXRpb25zIGZyb20gYW55d2hlcmUgZWxzZSBhcmUgYWxsb3dlZFxuICAgIGlmIChDT05TVFJVQ1RPUl9PTkxZX09QVElPTlMuaW5jbHVkZXMocHJvcE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wdGlvbiBcIiR7cHJvcE5hbWV9XCIgY2FuIG9ubHkgYmUgc2V0IGluIHRoZSBjb25zdHJ1Y3RvcmApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrUHJvcG9zZWRBcGkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9jb3JlLm9wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuYWxsb3dQcm9wb3NlZEFwaSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBzZXQgdGhlIGFsbG93UHJvcG9zZWRBcGkgb3B0aW9uIHRvIHRydWUgdG8gdXNlIHByb3Bvc2VkIEFQSScpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgb25CZWxsKCk6IElFdmVudDx2b2lkPiB7IHJldHVybiB0aGlzLl9jb3JlLm9uQmVsbDsgfVxuICBwdWJsaWMgZ2V0IG9uQmluYXJ5KCk6IElFdmVudDxzdHJpbmc+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25CaW5hcnk7IH1cbiAgcHVibGljIGdldCBvbkN1cnNvck1vdmUoKTogSUV2ZW50PHZvaWQ+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25DdXJzb3JNb3ZlOyB9XG4gIHB1YmxpYyBnZXQgb25EYXRhKCk6IElFdmVudDxzdHJpbmc+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25EYXRhOyB9XG4gIHB1YmxpYyBnZXQgb25LZXkoKTogSUV2ZW50PHsga2V5OiBzdHJpbmcsIGRvbUV2ZW50OiBLZXlib2FyZEV2ZW50IH0+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25LZXk7IH1cbiAgcHVibGljIGdldCBvbkxpbmVGZWVkKCk6IElFdmVudDx2b2lkPiB7IHJldHVybiB0aGlzLl9jb3JlLm9uTGluZUZlZWQ7IH1cbiAgcHVibGljIGdldCBvblJlbmRlcigpOiBJRXZlbnQ8eyBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciB9PiB7IHJldHVybiB0aGlzLl9jb3JlLm9uUmVuZGVyOyB9XG4gIHB1YmxpYyBnZXQgb25SZXNpemUoKTogSUV2ZW50PHsgY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIgfT4geyByZXR1cm4gdGhpcy5fY29yZS5vblJlc2l6ZTsgfVxuICBwdWJsaWMgZ2V0IG9uU2Nyb2xsKCk6IElFdmVudDxudW1iZXI+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25TY3JvbGw7IH1cbiAgcHVibGljIGdldCBvblNlbGVjdGlvbkNoYW5nZSgpOiBJRXZlbnQ8dm9pZD4geyByZXR1cm4gdGhpcy5fY29yZS5vblNlbGVjdGlvbkNoYW5nZTsgfVxuICBwdWJsaWMgZ2V0IG9uVGl0bGVDaGFuZ2UoKTogSUV2ZW50PHN0cmluZz4geyByZXR1cm4gdGhpcy5fY29yZS5vblRpdGxlQ2hhbmdlOyB9XG4gIHB1YmxpYyBnZXQgb25Xcml0ZVBhcnNlZCgpOiBJRXZlbnQ8dm9pZD4geyByZXR1cm4gdGhpcy5fY29yZS5vbldyaXRlUGFyc2VkOyB9XG5cbiAgcHVibGljIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2NvcmUuZWxlbWVudDsgfVxuICBwdWJsaWMgZ2V0IHBhcnNlcigpOiBJUGFyc2VyIHtcbiAgICBpZiAoIXRoaXMuX3BhcnNlcikge1xuICAgICAgdGhpcy5fcGFyc2VyID0gbmV3IFBhcnNlckFwaSh0aGlzLl9jb3JlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhcnNlcjtcbiAgfVxuICBwdWJsaWMgZ2V0IHVuaWNvZGUoKTogSVVuaWNvZGVIYW5kbGluZyB7XG4gICAgdGhpcy5fY2hlY2tQcm9wb3NlZEFwaSgpO1xuICAgIHJldHVybiBuZXcgVW5pY29kZUFwaSh0aGlzLl9jb3JlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRleHRhcmVhKCk6IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fY29yZS50ZXh0YXJlYTsgfVxuICBwdWJsaWMgZ2V0IHJvd3MoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2NvcmUucm93czsgfVxuICBwdWJsaWMgZ2V0IGNvbHMoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2NvcmUuY29sczsgfVxuICBwdWJsaWMgZ2V0IGJ1ZmZlcigpOiBJQnVmZmVyTmFtZXNwYWNlQXBpIHtcbiAgICBpZiAoIXRoaXMuX2J1ZmZlcikge1xuICAgICAgdGhpcy5fYnVmZmVyID0gdGhpcy5yZWdpc3RlcihuZXcgQnVmZmVyTmFtZXNwYWNlQXBpKHRoaXMuX2NvcmUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2J1ZmZlcjtcbiAgfVxuICBwdWJsaWMgZ2V0IG1hcmtlcnMoKTogUmVhZG9ubHlBcnJheTxJTWFya2VyPiB7XG4gICAgdGhpcy5fY2hlY2tQcm9wb3NlZEFwaSgpO1xuICAgIHJldHVybiB0aGlzLl9jb3JlLm1hcmtlcnM7XG4gIH1cbiAgcHVibGljIGdldCBtb2RlcygpOiBJTW9kZXMge1xuICAgIGNvbnN0IG0gPSB0aGlzLl9jb3JlLmNvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2RlcztcbiAgICBsZXQgbW91c2VUcmFja2luZ01vZGU6ICdub25lJyB8ICd4MTAnIHwgJ3Z0MjAwJyB8ICdkcmFnJyB8ICdhbnknID0gJ25vbmUnO1xuICAgIHN3aXRjaCAodGhpcy5fY29yZS5jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZVByb3RvY29sKSB7XG4gICAgICBjYXNlICdYMTAnOiBtb3VzZVRyYWNraW5nTW9kZSA9ICd4MTAnOyBicmVhaztcbiAgICAgIGNhc2UgJ1ZUMjAwJzogbW91c2VUcmFja2luZ01vZGUgPSAndnQyMDAnOyBicmVhaztcbiAgICAgIGNhc2UgJ0RSQUcnOiBtb3VzZVRyYWNraW5nTW9kZSA9ICdkcmFnJzsgYnJlYWs7XG4gICAgICBjYXNlICdBTlknOiBtb3VzZVRyYWNraW5nTW9kZSA9ICdhbnknOyBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcGxpY2F0aW9uQ3Vyc29yS2V5c01vZGU6IG0uYXBwbGljYXRpb25DdXJzb3JLZXlzLFxuICAgICAgYXBwbGljYXRpb25LZXlwYWRNb2RlOiBtLmFwcGxpY2F0aW9uS2V5cGFkLFxuICAgICAgYnJhY2tldGVkUGFzdGVNb2RlOiBtLmJyYWNrZXRlZFBhc3RlTW9kZSxcbiAgICAgIGluc2VydE1vZGU6IHRoaXMuX2NvcmUuY29yZVNlcnZpY2UubW9kZXMuaW5zZXJ0TW9kZSxcbiAgICAgIG1vdXNlVHJhY2tpbmdNb2RlOiBtb3VzZVRyYWNraW5nTW9kZSxcbiAgICAgIG9yaWdpbk1vZGU6IG0ub3JpZ2luLFxuICAgICAgcmV2ZXJzZVdyYXBhcm91bmRNb2RlOiBtLnJldmVyc2VXcmFwYXJvdW5kLFxuICAgICAgc2VuZEZvY3VzTW9kZTogbS5zZW5kRm9jdXMsXG4gICAgICB3cmFwYXJvdW5kTW9kZTogbS53cmFwYXJvdW5kXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IG9wdGlvbnMoKTogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz4ge1xuICAgIHJldHVybiB0aGlzLl9wdWJsaWNPcHRpb25zO1xuICB9XG4gIHB1YmxpYyBzZXQgb3B0aW9ucyhvcHRpb25zOiBJVGVybWluYWxPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBvcHRpb25zKSB7XG4gICAgICB0aGlzLl9wdWJsaWNPcHRpb25zW3Byb3BOYW1lXSA9IG9wdGlvbnNbcHJvcE5hbWVdO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLmJsdXIoKTtcbiAgfVxuICBwdWJsaWMgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5mb2N1cygpO1xuICB9XG4gIHB1YmxpYyBpbnB1dChkYXRhOiBzdHJpbmcsIHdhc1VzZXJJbnB1dDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLmlucHV0KGRhdGEsIHdhc1VzZXJJbnB1dCk7XG4gIH1cbiAgcHVibGljIHJlc2l6ZShjb2x1bW5zOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3ZlcmlmeUludGVnZXJzKGNvbHVtbnMsIHJvd3MpO1xuICAgIHRoaXMuX2NvcmUucmVzaXplKGNvbHVtbnMsIHJvd3MpO1xuICB9XG4gIHB1YmxpYyBvcGVuKHBhcmVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLm9wZW4ocGFyZW50KTtcbiAgfVxuICBwdWJsaWMgYXR0YWNoQ3VzdG9tS2V5RXZlbnRIYW5kbGVyKGN1c3RvbUtleUV2ZW50SGFuZGxlcjogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5hdHRhY2hDdXN0b21LZXlFdmVudEhhbmRsZXIoY3VzdG9tS2V5RXZlbnRIYW5kbGVyKTtcbiAgfVxuICBwdWJsaWMgYXR0YWNoQ3VzdG9tV2hlZWxFdmVudEhhbmRsZXIoY3VzdG9tV2hlZWxFdmVudEhhbmRsZXI6IChldmVudDogV2hlZWxFdmVudCkgPT4gYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUuYXR0YWNoQ3VzdG9tV2hlZWxFdmVudEhhbmRsZXIoY3VzdG9tV2hlZWxFdmVudEhhbmRsZXIpO1xuICB9XG4gIHB1YmxpYyByZWdpc3RlckxpbmtQcm92aWRlcihsaW5rUHJvdmlkZXI6IElMaW5rUHJvdmlkZXIpOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUucmVnaXN0ZXJMaW5rUHJvdmlkZXIobGlua1Byb3ZpZGVyKTtcbiAgfVxuICBwdWJsaWMgcmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIoaGFuZGxlcjogKHRleHQ6IHN0cmluZykgPT4gW251bWJlciwgbnVtYmVyXVtdKTogbnVtYmVyIHtcbiAgICB0aGlzLl9jaGVja1Byb3Bvc2VkQXBpKCk7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUucmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIoaGFuZGxlcik7XG4gIH1cbiAgcHVibGljIGRlcmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIoam9pbmVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2NoZWNrUHJvcG9zZWRBcGkoKTtcbiAgICB0aGlzLl9jb3JlLmRlcmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIoam9pbmVySWQpO1xuICB9XG4gIHB1YmxpYyByZWdpc3Rlck1hcmtlcihjdXJzb3JZT2Zmc2V0OiBudW1iZXIgPSAwKTogSU1hcmtlciB7XG4gICAgdGhpcy5fdmVyaWZ5SW50ZWdlcnMoY3Vyc29yWU9mZnNldCk7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUucmVnaXN0ZXJNYXJrZXIoY3Vyc29yWU9mZnNldCk7XG4gIH1cbiAgcHVibGljIHJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9uczogSURlY29yYXRpb25PcHRpb25zKTogSURlY29yYXRpb24gfCB1bmRlZmluZWQge1xuICAgIHRoaXMuX2NoZWNrUHJvcG9zZWRBcGkoKTtcbiAgICB0aGlzLl92ZXJpZnlQb3NpdGl2ZUludGVnZXJzKGRlY29yYXRpb25PcHRpb25zLnggPz8gMCwgZGVjb3JhdGlvbk9wdGlvbnMud2lkdGggPz8gMCwgZGVjb3JhdGlvbk9wdGlvbnMuaGVpZ2h0ID8/IDApO1xuICAgIHJldHVybiB0aGlzLl9jb3JlLnJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9ucyk7XG4gIH1cbiAgcHVibGljIGhhc1NlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5oYXNTZWxlY3Rpb24oKTtcbiAgfVxuICBwdWJsaWMgc2VsZWN0KGNvbHVtbjogbnVtYmVyLCByb3c6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJpZnlJbnRlZ2Vycyhjb2x1bW4sIHJvdywgbGVuZ3RoKTtcbiAgICB0aGlzLl9jb3JlLnNlbGVjdChjb2x1bW4sIHJvdywgbGVuZ3RoKTtcbiAgfVxuICBwdWJsaWMgZ2V0U2VsZWN0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUuZ2V0U2VsZWN0aW9uKCk7XG4gIH1cbiAgcHVibGljIGdldFNlbGVjdGlvblBvc2l0aW9uKCk6IElCdWZmZXJSYW5nZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUuZ2V0U2VsZWN0aW9uUG9zaXRpb24oKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5jbGVhclNlbGVjdGlvbigpO1xuICB9XG4gIHB1YmxpYyBzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5zZWxlY3RBbGwoKTtcbiAgfVxuICBwdWJsaWMgc2VsZWN0TGluZXMoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJpZnlJbnRlZ2VycyhzdGFydCwgZW5kKTtcbiAgICB0aGlzLl9jb3JlLnNlbGVjdExpbmVzKHN0YXJ0LCBlbmQpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxuICBwdWJsaWMgc2Nyb2xsTGluZXMoYW1vdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJpZnlJbnRlZ2VycyhhbW91bnQpO1xuICAgIHRoaXMuX2NvcmUuc2Nyb2xsTGluZXMoYW1vdW50KTtcbiAgfVxuICBwdWJsaWMgc2Nyb2xsUGFnZXMocGFnZUNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJpZnlJbnRlZ2VycyhwYWdlQ291bnQpO1xuICAgIHRoaXMuX2NvcmUuc2Nyb2xsUGFnZXMocGFnZUNvdW50KTtcbiAgfVxuICBwdWJsaWMgc2Nyb2xsVG9Ub3AoKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5zY3JvbGxUb1RvcCgpO1xuICB9XG4gIHB1YmxpYyBzY3JvbGxUb0JvdHRvbSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLnNjcm9sbFRvQm90dG9tKCk7XG4gIH1cbiAgcHVibGljIHNjcm9sbFRvTGluZShsaW5lOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJpZnlJbnRlZ2VycyhsaW5lKTtcbiAgICB0aGlzLl9jb3JlLnNjcm9sbFRvTGluZShsaW5lKTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5jbGVhcigpO1xuICB9XG4gIHB1YmxpYyB3cml0ZShkYXRhOiBzdHJpbmcgfCBVaW50OEFycmF5LCBjYWxsYmFjaz86ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLndyaXRlKGRhdGEsIGNhbGxiYWNrKTtcbiAgfVxuICBwdWJsaWMgd3JpdGVsbihkYXRhOiBzdHJpbmcgfCBVaW50OEFycmF5LCBjYWxsYmFjaz86ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLndyaXRlKGRhdGEpO1xuICAgIHRoaXMuX2NvcmUud3JpdGUoJ1xcclxcbicsIGNhbGxiYWNrKTtcbiAgfVxuICBwdWJsaWMgcGFzdGUoZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5wYXN0ZShkYXRhKTtcbiAgfVxuICBwdWJsaWMgcmVmcmVzaChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3ZlcmlmeUludGVnZXJzKHN0YXJ0LCBlbmQpO1xuICAgIHRoaXMuX2NvcmUucmVmcmVzaChzdGFydCwgZW5kKTtcbiAgfVxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5yZXNldCgpO1xuICB9XG4gIHB1YmxpYyBjbGVhclRleHR1cmVBdGxhcygpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLmNsZWFyVGV4dHVyZUF0bGFzKCk7XG4gIH1cbiAgcHVibGljIGxvYWRBZGRvbihhZGRvbjogSVRlcm1pbmFsQWRkb24pOiB2b2lkIHtcbiAgICB0aGlzLl9hZGRvbk1hbmFnZXIubG9hZEFkZG9uKHRoaXMsIGFkZG9uKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldCBzdHJpbmdzKCk6IElMb2NhbGl6YWJsZVN0cmluZ3Mge1xuICAgIHJldHVybiBTdHJpbmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmVyaWZ5SW50ZWdlcnMoLi4udmFsdWVzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgPT09IEluZmluaXR5IHx8IGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSAlIDEgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIEFQSSBvbmx5IGFjY2VwdHMgaW50ZWdlcnMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF92ZXJpZnlQb3NpdGl2ZUludGVnZXJzKC4uLnZhbHVlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICYmICh2YWx1ZSA9PT0gSW5maW5pdHkgfHwgaXNOYU4odmFsdWUpIHx8IHZhbHVlICUgMSAhPT0gMCB8fCB2YWx1ZSA8IDApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBBUEkgb25seSBhY2NlcHRzIHBvc2l0aXZlIGludGVnZXJzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiRml0QWRkb25cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiRml0QWRkb25cIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBUZXJtaW5hbCwgSVRlcm1pbmFsQWRkb24gfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHR5cGUgeyBGaXRBZGRvbiBhcyBJRml0QXBpIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLWZpdCc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcblxuaW50ZXJmYWNlIElUZXJtaW5hbERpbWVuc2lvbnMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB0ZXJtaW5hbC5cbiAgICovXG4gIHJvd3M6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0ZXJtaW5hbC5cbiAgICovXG4gIGNvbHM6IG51bWJlcjtcbn1cblxuY29uc3QgTUlOSU1VTV9DT0xTID0gMjtcbmNvbnN0IE1JTklNVU1fUk9XUyA9IDE7XG5cbmV4cG9ydCBjbGFzcyBGaXRBZGRvbiBpbXBsZW1lbnRzIElUZXJtaW5hbEFkZG9uICwgSUZpdEFwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgYWN0aXZhdGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgdGhpcy5fdGVybWluYWwgPSB0ZXJtaW5hbDtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge31cblxuICBwdWJsaWMgZml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGRpbXMgPSB0aGlzLnByb3Bvc2VEaW1lbnNpb25zKCk7XG4gICAgaWYgKCFkaW1zIHx8ICF0aGlzLl90ZXJtaW5hbCB8fCBpc05hTihkaW1zLmNvbHMpIHx8IGlzTmFOKGRpbXMucm93cykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBSZW1vdmUgcmVsaWFuY2Ugb24gcHJpdmF0ZSBBUElcbiAgICBjb25zdCBjb3JlID0gKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmU7XG5cbiAgICAvLyBGb3JjZSBhIGZ1bGwgcmVuZGVyXG4gICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnJvd3MgIT09IGRpbXMucm93cyB8fCB0aGlzLl90ZXJtaW5hbC5jb2xzICE9PSBkaW1zLmNvbHMpIHtcbiAgICAgIGNvcmUuX3JlbmRlclNlcnZpY2UuY2xlYXIoKTtcbiAgICAgIHRoaXMuX3Rlcm1pbmFsLnJlc2l6ZShkaW1zLmNvbHMsIGRpbXMucm93cyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb3Bvc2VEaW1lbnNpb25zKCk6IElUZXJtaW5hbERpbWVuc2lvbnMgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl90ZXJtaW5hbC5lbGVtZW50IHx8ICF0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogUmVtb3ZlIHJlbGlhbmNlIG9uIHByaXZhdGUgQVBJXG4gICAgY29uc3QgY29yZSA9ICh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlO1xuICAgIGNvbnN0IGRpbXM6IElSZW5kZXJEaW1lbnNpb25zID0gY29yZS5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zO1xuXG4gICAgaWYgKGRpbXMuY3NzLmNlbGwud2lkdGggPT09IDAgfHwgZGltcy5jc3MuY2VsbC5oZWlnaHQgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl90ZXJtaW5hbC5vcHRpb25zLnNjcm9sbGJhY2sgPT09IDAgP1xuICAgICAgMCA6IGNvcmUudmlld3BvcnQuc2Nyb2xsQmFyV2lkdGg7XG5cbiAgICBjb25zdCBwYXJlbnRFbGVtZW50U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnRIZWlnaHQgPSBwYXJzZUludChwYXJlbnRFbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JykpO1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnRXaWR0aCA9IE1hdGgubWF4KDAsIHBhcnNlSW50KHBhcmVudEVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpKSk7XG4gICAgY29uc3QgZWxlbWVudFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fdGVybWluYWwuZWxlbWVudCk7XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmcgPSB7XG4gICAgICB0b3A6IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXRvcCcpKSxcbiAgICAgIGJvdHRvbTogcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctYm90dG9tJykpLFxuICAgICAgcmlnaHQ6IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXJpZ2h0JykpLFxuICAgICAgbGVmdDogcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctbGVmdCcpKVxuICAgIH07XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmdWZXIgPSBlbGVtZW50UGFkZGluZy50b3AgKyBlbGVtZW50UGFkZGluZy5ib3R0b207XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmdIb3IgPSBlbGVtZW50UGFkZGluZy5yaWdodCArIGVsZW1lbnRQYWRkaW5nLmxlZnQ7XG4gICAgY29uc3QgYXZhaWxhYmxlSGVpZ2h0ID0gcGFyZW50RWxlbWVudEhlaWdodCAtIGVsZW1lbnRQYWRkaW5nVmVyO1xuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gcGFyZW50RWxlbWVudFdpZHRoIC0gZWxlbWVudFBhZGRpbmdIb3IgLSBzY3JvbGxiYXJXaWR0aDtcbiAgICBjb25zdCBnZW9tZXRyeSA9IHtcbiAgICAgIGNvbHM6IE1hdGgubWF4KE1JTklNVU1fQ09MUywgTWF0aC5mbG9vcihhdmFpbGFibGVXaWR0aCAvIGRpbXMuY3NzLmNlbGwud2lkdGgpKSxcbiAgICAgIHJvd3M6IE1hdGgubWF4KE1JTklNVU1fUk9XUywgTWF0aC5mbG9vcihhdmFpbGFibGVIZWlnaHQgLyBkaW1zLmNzcy5jZWxsLmhlaWdodCkpXG4gICAgfTtcbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cbiIsICIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJXZWJMaW5rc0FkZG9uXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIldlYkxpbmtzQWRkb25cIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUxpbmtQcm92aWRlciwgSUxpbmssIFRlcm1pbmFsLCBJVmlld3BvcnRSYW5nZSwgSUJ1ZmZlckxpbmUgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIElMaW5rUHJvdmlkZXJPcHRpb25zIHtcbiAgaG92ZXI/KGV2ZW50OiBNb3VzZUV2ZW50LCB0ZXh0OiBzdHJpbmcsIGxvY2F0aW9uOiBJVmlld3BvcnRSYW5nZSk6IHZvaWQ7XG4gIGxlYXZlPyhldmVudDogTW91c2VFdmVudCwgdGV4dDogc3RyaW5nKTogdm9pZDtcbiAgdXJsUmVnZXg/OiBSZWdFeHA7XG59XG5cbmV4cG9ydCBjbGFzcyBXZWJMaW5rUHJvdmlkZXIgaW1wbGVtZW50cyBJTGlua1Byb3ZpZGVyIHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXJtaW5hbDogVGVybWluYWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVnZXg6IFJlZ0V4cCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9oYW5kbGVyOiAoZXZlbnQ6IE1vdXNlRXZlbnQsIHVyaTogc3RyaW5nKSA9PiB2b2lkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IElMaW5rUHJvdmlkZXJPcHRpb25zID0ge31cbiAgKSB7XG5cbiAgfVxuXG4gIHB1YmxpYyBwcm92aWRlTGlua3MoeTogbnVtYmVyLCBjYWxsYmFjazogKGxpbmtzOiBJTGlua1tdIHwgdW5kZWZpbmVkKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgbGlua3MgPSBMaW5rQ29tcHV0ZXIuY29tcHV0ZUxpbmsoeSwgdGhpcy5fcmVnZXgsIHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl9oYW5kbGVyKTtcbiAgICBjYWxsYmFjayh0aGlzLl9hZGRDYWxsYmFja3MobGlua3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZENhbGxiYWNrcyhsaW5rczogSUxpbmtbXSk6IElMaW5rW10ge1xuICAgIHJldHVybiBsaW5rcy5tYXAobGluayA9PiB7XG4gICAgICBsaW5rLmxlYXZlID0gdGhpcy5fb3B0aW9ucy5sZWF2ZTtcbiAgICAgIGxpbmsuaG92ZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQsIHVyaTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmhvdmVyKSB7XG4gICAgICAgICAgY29uc3QgeyByYW5nZSB9ID0gbGluaztcbiAgICAgICAgICB0aGlzLl9vcHRpb25zLmhvdmVyKGV2ZW50LCB1cmksIHJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBsaW5rO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVXJsKHVybFN0cmluZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpO1xuICAgIGNvbnN0IHBhcnNlZEJhc2UgPSB1cmwucGFzc3dvcmQgJiYgdXJsLnVzZXJuYW1lXG4gICAgICA/IGAke3VybC5wcm90b2NvbH0vLyR7dXJsLnVzZXJuYW1lfToke3VybC5wYXNzd29yZH1AJHt1cmwuaG9zdH1gXG4gICAgICA6IHVybC51c2VybmFtZVxuICAgICAgICA/IGAke3VybC5wcm90b2NvbH0vLyR7dXJsLnVzZXJuYW1lfUAke3VybC5ob3N0fWBcbiAgICAgICAgOiBgJHt1cmwucHJvdG9jb2x9Ly8ke3VybC5ob3N0fWA7XG4gICAgcmV0dXJuIHVybFN0cmluZy50b0xvY2FsZUxvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocGFyc2VkQmFzZS50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlua0NvbXB1dGVyIHtcbiAgcHVibGljIHN0YXRpYyBjb21wdXRlTGluayh5OiBudW1iZXIsIHJlZ2V4OiBSZWdFeHAsIHRlcm1pbmFsOiBUZXJtaW5hbCwgYWN0aXZhdGU6IChldmVudDogTW91c2VFdmVudCwgdXJpOiBzdHJpbmcpID0+IHZvaWQpOiBJTGlua1tdIHtcbiAgICBjb25zdCByZXggPSBuZXcgUmVnRXhwKHJlZ2V4LnNvdXJjZSwgKHJlZ2V4LmZsYWdzIHx8ICcnKSArICdnJyk7XG5cbiAgICBjb25zdCBbbGluZXMsIHN0YXJ0TGluZUluZGV4XSA9IExpbmtDb21wdXRlci5fZ2V0V2luZG93ZWRMaW5lU3RyaW5ncyh5IC0gMSwgdGVybWluYWwpO1xuICAgIGNvbnN0IGxpbmUgPSBsaW5lcy5qb2luKCcnKTtcblxuICAgIGxldCBtYXRjaDtcbiAgICBjb25zdCByZXN1bHQ6IElMaW5rW10gPSBbXTtcblxuICAgIHdoaWxlIChtYXRjaCA9IHJleC5leGVjKGxpbmUpKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gbWF0Y2hbMF07XG5cbiAgICAgIC8vIGNoZWNrIHZpYSBVUkwgaWYgdGhlIG1hdGNoZWQgdGV4dCB3b3VsZCBmb3JtIGEgcHJvcGVyIHVybFxuICAgICAgaWYgKCFpc1VybCh0ZXh0KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gbWFwIHN0cmluZyBwb3NpdGlvbnMgYmFjayB0byBidWZmZXIgcG9zaXRpb25zXG4gICAgICAvLyB2YWx1ZXMgYXJlIDAtYmFzZWQgcmlnaHQgc2lkZSBleGNsdWRpbmdcbiAgICAgIGNvbnN0IFtzdGFydFksIHN0YXJ0WF0gPSBMaW5rQ29tcHV0ZXIuX21hcFN0cklkeCh0ZXJtaW5hbCwgc3RhcnRMaW5lSW5kZXgsIDAsIG1hdGNoLmluZGV4KTtcbiAgICAgIGNvbnN0IFtlbmRZLCBlbmRYXSA9IExpbmtDb21wdXRlci5fbWFwU3RySWR4KHRlcm1pbmFsLCBzdGFydFksIHN0YXJ0WCwgdGV4dC5sZW5ndGgpO1xuXG4gICAgICBpZiAoc3RhcnRZID09PSAtMSB8fCBzdGFydFggPT09IC0xIHx8IGVuZFkgPT09IC0xIHx8IGVuZFggPT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyByYW5nZSBleHBlY3RzIHZhbHVlcyAxLWJhc2VkIHJpZ2h0IHNpZGUgaW5jbHVkaW5nLCB0aHVzICsxIGV4Y2VwdCBmb3IgZW5kWFxuICAgICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgeDogc3RhcnRYICsgMSxcbiAgICAgICAgICB5OiBzdGFydFkgKyAxXG4gICAgICAgIH0sXG4gICAgICAgIGVuZDoge1xuICAgICAgICAgIHg6IGVuZFgsXG4gICAgICAgICAgeTogZW5kWSArIDFcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmVzdWx0LnB1c2goeyByYW5nZSwgdGV4dCwgYWN0aXZhdGUgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd3JhcHBlZCBjb250ZW50IGxpbmVzIGZvciB0aGUgY3VycmVudCBsaW5lIGluZGV4LlxuICAgKiBUaGUgdG9wL2JvdHRvbSBsaW5lIGV4cGFuc2lvbiBzdG9wcyBhdCB3aGl0ZXNwYWNlcyBvciBsZW5ndGggPiAyMDQ4LlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggbGluZSBzdHJpbmdzIGFuZCB0aGUgdG9wIGxpbmUgaW5kZXguXG4gICAqXG4gICAqIE5PVEU6IFdlIHB1bGwgbGluZSBzdHJpbmdzIHdpdGggdHJpbVJpZ2h0PXRydWUgb24gcHVycG9zZSB0byBtYWtlIHN1cmVcbiAgICogdG8gY29ycmVjdGx5IG1hdGNoIHVybHMgd2l0aCBlYXJseSB3cmFwcGVkIHdpZGUgY2hhcnMuIFRoaXMgY29ycnVwdHMgdGhlIHN0cmluZyBpbmRleFxuICAgKiBmb3IgMToxIGJhY2ttYXBwaW5nIHRvIGJ1ZmZlciBwb3NpdGlvbnMsIHRodXMgbmVlZHMgYW4gYWRkaXRpb25hbCBjb3JyZWN0aW9uIGluIF9tYXBTdHJJZHguXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfZ2V0V2luZG93ZWRMaW5lU3RyaW5ncyhsaW5lSW5kZXg6IG51bWJlciwgdGVybWluYWw6IFRlcm1pbmFsKTogW3N0cmluZ1tdLCBudW1iZXJdIHtcbiAgICBsZXQgbGluZTogSUJ1ZmZlckxpbmUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRvcElkeCA9IGxpbmVJbmRleDtcbiAgICBsZXQgYm90dG9tSWR4ID0gbGluZUluZGV4O1xuICAgIGxldCBsZW5ndGggPSAwO1xuICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoKGxpbmUgPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmdldExpbmUobGluZUluZGV4KSkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gbGluZS50cmFuc2xhdGVUb1N0cmluZyh0cnVlKTtcblxuICAgICAgLy8gZXhwYW5kIHRvcCwgc3RvcCBvbiB3aGl0ZXNwYWNlcyBvciBsZW5ndGggPiAyMDQ4XG4gICAgICBpZiAobGluZS5pc1dyYXBwZWQgJiYgY3VycmVudENvbnRlbnRbMF0gIT09ICcgJykge1xuICAgICAgICBsZW5ndGggPSAwO1xuICAgICAgICB3aGlsZSAoKGxpbmUgPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmdldExpbmUoLS10b3BJZHgpKSAmJiBsZW5ndGggPCAyMDQ4KSB7XG4gICAgICAgICAgY29udGVudCA9IGxpbmUudHJhbnNsYXRlVG9TdHJpbmcodHJ1ZSk7XG4gICAgICAgICAgbGVuZ3RoICs9IGNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgIGxpbmVzLnB1c2goY29udGVudCk7XG4gICAgICAgICAgaWYgKCFsaW5lLmlzV3JhcHBlZCB8fCBjb250ZW50LmluZGV4T2YoJyAnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaW5lcy5yZXZlcnNlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFwcGVuZCBjdXJyZW50IGxpbmVcbiAgICAgIGxpbmVzLnB1c2goY3VycmVudENvbnRlbnQpO1xuXG4gICAgICAvLyBleHBhbmQgYm90dG9tLCBzdG9wIG9uIHdoaXRlc3BhY2VzIG9yIGxlbmd0aCA+IDIwNDhcbiAgICAgIGxlbmd0aCA9IDA7XG4gICAgICB3aGlsZSAoKGxpbmUgPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmdldExpbmUoKytib3R0b21JZHgpKSAmJiBsaW5lLmlzV3JhcHBlZCAmJiBsZW5ndGggPCAyMDQ4KSB7XG4gICAgICAgIGNvbnRlbnQgPSBsaW5lLnRyYW5zbGF0ZVRvU3RyaW5nKHRydWUpO1xuICAgICAgICBsZW5ndGggKz0gY29udGVudC5sZW5ndGg7XG4gICAgICAgIGxpbmVzLnB1c2goY29udGVudCk7XG4gICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoJyAnKSAhPT0gLTEpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2xpbmVzLCB0b3BJZHhdO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcCBhIHN0cmluZyBpbmRleCBiYWNrIHRvIGJ1ZmZlciBwb3NpdGlvbnMuXG4gICAqIFJldHVybnMgYnVmZmVyIHBvc2l0aW9uIGFzIFtsaW5lSW5kZXgsIGNvbHVtbkluZGV4XSAwLWJhc2VkLFxuICAgKiBvciBbLTEsIC0xXSBpbiBjYXNlIHRoZSBsb29rdXAgcmFuIGludG8gYSBub24tZXhpc3RpbmcgbGluZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9tYXBTdHJJZHgodGVybWluYWw6IFRlcm1pbmFsLCBsaW5lSW5kZXg6IG51bWJlciwgcm93SW5kZXg6IG51bWJlciwgc3RyaW5nSW5kZXg6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIGNvbnN0IGJ1ZiA9IHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmU7XG4gICAgY29uc3QgY2VsbCA9IGJ1Zi5nZXROdWxsQ2VsbCgpO1xuICAgIGxldCBzdGFydCA9IHJvd0luZGV4O1xuICAgIHdoaWxlIChzdHJpbmdJbmRleCkge1xuICAgICAgY29uc3QgbGluZSA9IGJ1Zi5nZXRMaW5lKGxpbmVJbmRleCk7XG4gICAgICBpZiAoIWxpbmUpIHtcbiAgICAgICAgcmV0dXJuIFstMSwgLTFdO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbGluZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBsaW5lLmdldENlbGwoaSwgY2VsbCk7XG4gICAgICAgIGNvbnN0IGNoYXJzID0gY2VsbC5nZXRDaGFycygpO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGNlbGwuZ2V0V2lkdGgoKTtcbiAgICAgICAgaWYgKHdpZHRoKSB7XG4gICAgICAgICAgc3RyaW5nSW5kZXggLT0gY2hhcnMubGVuZ3RoIHx8IDE7XG5cbiAgICAgICAgICAvLyBjb3JyZWN0IHN0cmluZ0luZGV4IGZvciBlYXJseSB3cmFwcGVkIHdpZGUgY2hhcnM6XG4gICAgICAgICAgLy8gLSBjdXJyZW50bHkgb25seSBoYXBwZW5zIGF0IGxhc3QgY2VsbFxuICAgICAgICAgIC8vIC0gY2VsbHMgdG8gdGhlIHJpZ2h0IGFyZSByZXNldCB3aXRoIGNoYXJzPScnIGFuZCB3aWR0aD0xIGluIElucHV0SGFuZGxlci5wcmludFxuICAgICAgICAgIC8vIC0gZm9sbG93LXVwIGxpbmUgbXVzdCBiZSB3cmFwcGVkIGFuZCBjb250YWluIHdpZGUgY2hhciBhdCBmaXJzdCBjZWxsXG4gICAgICAgICAgLy8gLS0+IGlmIGFsbCB0aGVzZSBjb25kaXRpb25zIGFyZSBtZXQsIGNvcnJlY3Qgc3RyaW5nSW5kZXggYnkgKzFcbiAgICAgICAgICBpZiAoaSA9PT0gbGluZS5sZW5ndGggLSAxICYmIGNoYXJzID09PSAnJykge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IGJ1Zi5nZXRMaW5lKGxpbmVJbmRleCArIDEpO1xuICAgICAgICAgICAgaWYgKGxpbmUgJiYgbGluZS5pc1dyYXBwZWQpIHtcbiAgICAgICAgICAgICAgbGluZS5nZXRDZWxsKDAsIGNlbGwpO1xuICAgICAgICAgICAgICBpZiAoY2VsbC5nZXRXaWR0aCgpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgc3RyaW5nSW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyaW5nSW5kZXggPCAwKSB7XG4gICAgICAgICAgcmV0dXJuIFtsaW5lSW5kZXgsIGldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaW5lSW5kZXgrKztcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIFtsaW5lSW5kZXgsIHN0YXJ0XTtcbiAgfVxufVxuIiwgIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlcm1pbmFsLCBJVGVybWluYWxBZGRvbiwgSURpc3Bvc2FibGUgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHR5cGUgeyBXZWJMaW5rc0FkZG9uIGFzIElXZWJMaW5rc0FwaSB9IGZyb20gJ0B4dGVybS9hZGRvbi13ZWItbGlua3MnO1xuaW1wb3J0IHsgSUxpbmtQcm92aWRlck9wdGlvbnMsIFdlYkxpbmtQcm92aWRlciB9IGZyb20gJy4vV2ViTGlua1Byb3ZpZGVyJztcblxuLy8gY29uc2lkZXIgZXZlcnRoaW5nIHN0YXJ0aW5nIHdpdGggaHR0cDovLyBvciBodHRwczovL1xuLy8gdXAgdG8gZmlyc3Qgd2hpdGVzcGFjZSwgYFwiYCBvciBgJ2AgYXMgdXJsXG4vLyBOT1RFOiBUaGUgcmVwZWF0ZWQgZW5kIGNsYXVzZSBpcyBuZWVkZWQgdG8gbm90IG1hdGNoIGEgZGFuZ2xpbmcgYDpgXG4vLyByZXNlbWJsaW5nIHRoZSBvbGQgKC4uLikqKFteOlwiXFwnXFxcXHNdKSBmaW5hbCBwYXRoIGNsYXVzZVxuLy8gYWRkaXRpb25hbGx5IGV4Y2x1ZGUgZWFybHkgKyBmaW5hbDpcbi8vIC0gdW5zYWZlIGZyb20gcmZjMzk4NjogISonKClcbi8vIC0gdW5zYWZlIGNoYXJzIGZyb20gcmZjMTczODoge318XFxefltdYCAobWludXMgW10gYXMgd2UgbmVlZCB0aGVtIGZvciBpcHY2IGFkcmVzc2VzLCBhbHNvIGFsbG93IH4pXG4vLyBhbHNvIGV4Y2x1ZGUgYXMgZmluYWxzOlxuLy8gLSBmaW5hbCBpbnRlcnB1bmN0aW9uIGxpa2UgLC4hP1xuLy8gLSBhbnkgc29ydCBvZiBicmFja2V0cyA8PigpW117fSAobm90IHNwZWMgY29uZm9ybSwgYnV0IG9mdGVuIHVzZWQgdG8gZW5jbG9zZSB1cmxzKVxuLy8gLSB1bnNhZmUgY2hhcnMgZnJvbSByZmMxNzM4OiB7fXxcXF5+W11gXG5jb25zdCBzdHJpY3RVcmxSZWdleCA9IC8oaHR0cHM/fEhUVFBTPyk6Wy9dezJ9W15cXHNcIichKigpe318XFxcXFxcXjw+YF0qW15cXHNcIic6LC4hP3t9fFxcXFxcXF5+XFxbXFxdYCgpPD5dLztcblxuXG5mdW5jdGlvbiBoYW5kbGVMaW5rKGV2ZW50OiBNb3VzZUV2ZW50LCB1cmk6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBuZXdXaW5kb3cgPSB3aW5kb3cub3BlbigpO1xuICBpZiAobmV3V2luZG93KSB7XG4gICAgdHJ5IHtcbiAgICAgIG5ld1dpbmRvdy5vcGVuZXIgPSBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbm8tb3AsIEVsZWN0cm9uIGNhbiB0aHJvd1xuICAgIH1cbiAgICBuZXdXaW5kb3cubG9jYXRpb24uaHJlZiA9IHVyaTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLndhcm4oJ09wZW5pbmcgbGluayBibG9ja2VkIGFzIG9wZW5lciBjb3VsZCBub3QgYmUgY2xlYXJlZCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXZWJMaW5rc0FkZG9uIGltcGxlbWVudHMgSVRlcm1pbmFsQWRkb24gLCBJV2ViTGlua3NBcGkge1xuICBwcml2YXRlIF90ZXJtaW5hbDogVGVybWluYWwgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2xpbmtQcm92aWRlcjogSURpc3Bvc2FibGUgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfaGFuZGxlcjogKGV2ZW50OiBNb3VzZUV2ZW50LCB1cmk6IHN0cmluZykgPT4gdm9pZCA9IGhhbmRsZUxpbmssXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogSUxpbmtQcm92aWRlck9wdGlvbnMgPSB7fVxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZSh0ZXJtaW5hbDogVGVybWluYWwpOiB2b2lkIHtcbiAgICB0aGlzLl90ZXJtaW5hbCA9IHRlcm1pbmFsO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9vcHRpb25zIGFzIElMaW5rUHJvdmlkZXJPcHRpb25zO1xuICAgIGNvbnN0IHJlZ2V4ID0gb3B0aW9ucy51cmxSZWdleCB8fCBzdHJpY3RVcmxSZWdleDtcbiAgICB0aGlzLl9saW5rUHJvdmlkZXIgPSB0aGlzLl90ZXJtaW5hbC5yZWdpc3RlckxpbmtQcm92aWRlcihuZXcgV2ViTGlua1Byb3ZpZGVyKHRoaXMuX3Rlcm1pbmFsLCByZWdleCwgdGhpcy5faGFuZGxlciwgb3B0aW9ucykpO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fbGlua1Byb3ZpZGVyPy5kaXNwb3NlKCk7XG4gIH1cbn1cbiIsICIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJTZWFyY2hBZGRvblwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJTZWFyY2hBZGRvblwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+IHtcbnJldHVybiAiLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmludGVyZmFjZSBJTGlzdGVuZXI8VCwgVSA9IHZvaWQ+IHtcbiAgKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudDxULCBVID0gdm9pZD4ge1xuICAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiB7XG4gIGV2ZW50OiBJRXZlbnQ8VCwgVT47XG4gIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG4gIGRpc3Bvc2UoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlcjxULCBVID0gdm9pZD4gaW1wbGVtZW50cyBJRXZlbnRFbWl0dGVyPFQsIFU+IHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICBwcml2YXRlIF9ldmVudD86IElFdmVudDxULCBVPjtcbiAgcHJpdmF0ZSBfZGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgZ2V0IGV2ZW50KCk6IElFdmVudDxULCBVPiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudCkge1xuICAgICAgdGhpcy5fZXZlbnQgPSAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlID0ge1xuICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW2ldID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBkaXNwb3NhYmxlO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50O1xuICB9XG5cbiAgcHVibGljIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXVlOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZS5wdXNoKHRoaXMuX2xpc3RlbmVyc1tpXSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlW2ldLmNhbGwodW5kZWZpbmVkLCBhcmcxLCBhcmcyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZEV2ZW50PFQ+KGZyb206IElFdmVudDxUPiwgdG86IElFdmVudEVtaXR0ZXI8VD4pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiBmcm9tKGUgPT4gdG8uZmlyZShlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5BbmRTdWJzY3JpYmU8VD4oZXZlbnQ6IElFdmVudDxUPiwgaGFuZGxlcjogKGU6IFQgfCB1bmRlZmluZWQpID0+IGFueSk6IElEaXNwb3NhYmxlIHtcbiAgaGFuZGxlcih1bmRlZmluZWQpO1xuICByZXR1cm4gZXZlbnQoZSA9PiBoYW5kbGVyKGUpKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQgdG8gcHJvdmlkZSBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBtYW5hZ2luZyB0aGUgbGlmZWN5Y2xlIG9mIGFuXG4gKiBvYmplY3QgYW5kIGl0cyBjb21wb25lbnRzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJvdGVjdGVkIF9kaXNwb3NhYmxlczogSURpc3Bvc2FibGVbXSA9IFtdO1xuICBwcm90ZWN0ZWQgX2lzRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIG9iamVjdCwgdHJpZ2dlcmluZyB0aGUgYGRpc3Bvc2VgIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJRGlzcG9zYWJsZXMuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGQgb2YgdGhpcy5fZGlzcG9zYWJsZXMpIHtcbiAgICAgIGQuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGRpc3Bvc2FibGUgb2JqZWN0LlxuICAgKiBAcGFyYW0gZCBUaGUgZGlzcG9zYWJsZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIGRpc3Bvc2FibGUuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXI8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkOiBUKTogVCB7XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChkKTtcbiAgICByZXR1cm4gZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGRpc3Bvc2FibGUgb2JqZWN0IGlmIGl0IGhhcyBiZWVuIHJlZ2lzdGVyZWQsIGlmIG5vdCBkb1xuICAgKiBub3RoaW5nLlxuICAgKiBAcGFyYW0gZCBUaGUgZGlzcG9zYWJsZSB0byB1bnJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXI8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkOiBUKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9kaXNwb3NhYmxlcy5pbmRleE9mKGQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhYmxlRGlzcG9zYWJsZTxUIGV4dGVuZHMgSURpc3Bvc2FibGU+IGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuICBwcml2YXRlIF92YWx1ZT86IFQ7XG4gIHByaXZhdGUgX2lzRGlzcG9zZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNEaXNwb3NlZCA/IHVuZGVmaW5lZCA6IHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlLCBkaXNwb3Npbmcgb2YgdGhlIG9sZCB2YWx1ZSBpZiBpdCBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuX2lzRGlzcG9zZWQgfHwgdmFsdWUgPT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHN0b3JlZCB2YWx1ZSBhbmQgZGlzcG9zZXMgb2YgdGhlIHByZXZpb3VzbHkgc3RvcmVkIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogV3JhcCBhIGZ1bmN0aW9uIGluIGEgZGlzcG9zYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRGlzcG9zYWJsZShmOiAoKSA9PiB2b2lkKTogSURpc3Bvc2FibGUge1xuICByZXR1cm4geyBkaXNwb3NlOiBmIH07XG59XG5cbi8qKlxuICogRGlzcG9zZSBvZiBhbGwgZGlzcG9zYWJsZXMgaW4gYW4gYXJyYXkgYW5kIHNldCBpdHMgbGVuZ3RoIHRvIDAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlQXJyYXkoZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBkIG9mIGRpc3Bvc2FibGVzKSB7XG4gICAgZC5kaXNwb3NlKCk7XG4gIH1cbiAgZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzcG9zYWJsZSB0aGF0IHdpbGwgZGlzcG9zZSBvZiBhbiBhcnJheSBvZiBkaXNwb3NhYmxlcyB3aGVuIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZShhcnJheTogSURpc3Bvc2FibGVbXSk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogKCkgPT4gZGlzcG9zZUFycmF5KGFycmF5KSB9O1xufVxuIiwgIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlcm1pbmFsLCBJRGlzcG9zYWJsZSwgSVRlcm1pbmFsQWRkb24sIElEZWNvcmF0aW9uIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB0eXBlIHsgU2VhcmNoQWRkb24gYXMgSVNlYXJjaEFwaSB9IGZyb20gJ0B4dGVybS9hZGRvbi1zZWFyY2gnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUsIGRpc3Bvc2VBcnJheSwgTXV0YWJsZURpc3Bvc2FibGUsIGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcblxuZXhwb3J0IGludGVyZmFjZSBJU2VhcmNoT3B0aW9ucyB7XG4gIHJlZ2V4PzogYm9vbGVhbjtcbiAgd2hvbGVXb3JkPzogYm9vbGVhbjtcbiAgY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW47XG4gIGluY3JlbWVudGFsPzogYm9vbGVhbjtcbiAgZGVjb3JhdGlvbnM/OiBJU2VhcmNoRGVjb3JhdGlvbk9wdGlvbnM7XG4gIG5vU2Nyb2xsPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIElTZWFyY2hEZWNvcmF0aW9uT3B0aW9ucyB7XG4gIG1hdGNoQmFja2dyb3VuZD86IHN0cmluZztcbiAgbWF0Y2hCb3JkZXI/OiBzdHJpbmc7XG4gIG1hdGNoT3ZlcnZpZXdSdWxlcjogc3RyaW5nO1xuICBhY3RpdmVNYXRjaEJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIGFjdGl2ZU1hdGNoQm9yZGVyPzogc3RyaW5nO1xuICBhY3RpdmVNYXRjaENvbG9yT3ZlcnZpZXdSdWxlcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWFyY2hQb3NpdGlvbiB7XG4gIHN0YXJ0Q29sOiBudW1iZXI7XG4gIHN0YXJ0Um93OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaEFkZG9uT3B0aW9ucyB7XG4gIGhpZ2hsaWdodExpbWl0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaFJlc3VsdCB7XG4gIHRlcm06IHN0cmluZztcbiAgY29sOiBudW1iZXI7XG4gIHJvdzogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7XG59XG5cbnR5cGUgTGluZUNhY2hlRW50cnkgPSBbXG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbGluZSAoYXMgb3Bwb3NlZCB0byB0aGUgYnVmZmVyIGNlbGwgcmVwcmVzZW50YXRpb24pLlxuICAgKi9cbiAgbGluZUFzU3RyaW5nOiBzdHJpbmcsXG4gIC8qKlxuICAgKiBUaGUgb2Zmc2V0cyB3aGVyZSBlYWNoIGxpbmUgc3RhcnRzIHdoZW4gdGhlIGVudHJ5IGRlc2NyaWJlcyBhIHdyYXBwZWQgbGluZS5cbiAgICovXG4gIGxpbmVPZmZzZXRzOiBudW1iZXJbXVxuXTtcblxuaW50ZXJmYWNlIElIaWdobGlnaHQgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIGRlY29yYXRpb246IElEZWNvcmF0aW9uO1xuICBtYXRjaDogSVNlYXJjaFJlc3VsdDtcbn1cblxuY29uc3QgTk9OX1dPUkRfQ0hBUkFDVEVSUyA9ICcgfiFAIyQlXiYqKCkrYC09W117fXxcXFxcOzpcIlxcJywuLzw+Pyc7XG5jb25zdCBMSU5FU19DQUNIRV9USU1FX1RPX0xJVkUgPSAxNSAqIDEwMDA7IC8vIDE1IHNlY3NcbmNvbnN0IERFRkFVTFRfSElHSExJR0hUX0xJTUlUID0gMTAwMDtcblxuZXhwb3J0IGNsYXNzIFNlYXJjaEFkZG9uIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElUZXJtaW5hbEFkZG9uICwgSVNlYXJjaEFwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfY2FjaGVkU2VhcmNoVGVybTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9oaWdobGlnaHRlZExpbmVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBfaGlnaGxpZ2h0RGVjb3JhdGlvbnM6IElIaWdobGlnaHRbXSA9IFtdO1xuICBwcml2YXRlIF9zZWxlY3RlZERlY29yYXRpb246IE11dGFibGVEaXNwb3NhYmxlPElIaWdobGlnaHQ+ID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG4gIHByaXZhdGUgX2hpZ2hsaWdodExpbWl0OiBudW1iZXI7XG4gIHByaXZhdGUgX2xhc3RTZWFyY2hPcHRpb25zOiBJU2VhcmNoT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfaGlnaGxpZ2h0VGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogdHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nV2l0aFdyYXAgaXMgYSBmYWlybHkgZXhwZW5zaXZlIGNhbGwuXG4gICAqIFdlIG1lbW9pemUgdGhlIGNhbGxzIGludG8gYW4gYXJyYXkgdGhhdCBoYXMgYSB0aW1lIGJhc2VkIHR0bC5cbiAgICogX2xpbmVzQ2FjaGUgaXMgYWxzbyBpbnZhbGlkYXRlZCB3aGVuIHRoZSB0ZXJtaW5hbCBjdXJzb3IgbW92ZXMuXG4gICAqL1xuICBwcml2YXRlIF9saW5lc0NhY2hlOiBMaW5lQ2FjaGVFbnRyeVtdIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9saW5lc0NhY2hlVGltZW91dElkID0gMDtcbiAgcHJpdmF0ZSBfbGluZXNDYWNoZURpc3Bvc2FibGVzID0gbmV3IE11dGFibGVEaXNwb3NhYmxlKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25EaWRDaGFuZ2VSZXN1bHRzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHsgcmVzdWx0SW5kZXg6IG51bWJlciwgcmVzdWx0Q291bnQ6IG51bWJlciB9PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uRGlkQ2hhbmdlUmVzdWx0cyA9IHRoaXMuX29uRGlkQ2hhbmdlUmVzdWx0cy5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxJU2VhcmNoQWRkb25PcHRpb25zPikge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9oaWdobGlnaHRMaW1pdCA9IG9wdGlvbnM/LmhpZ2hsaWdodExpbWl0ID8/IERFRkFVTFRfSElHSExJR0hUX0xJTUlUO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlKHRlcm1pbmFsOiBUZXJtaW5hbCk6IHZvaWQge1xuICAgIHRoaXMuX3Rlcm1pbmFsID0gdGVybWluYWw7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vbldyaXRlUGFyc2VkKCgpID0+IHRoaXMuX3VwZGF0ZU1hdGNoZXMoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGVybWluYWwub25SZXNpemUoKCkgPT4gdGhpcy5fdXBkYXRlTWF0Y2hlcygpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gdGhpcy5jbGVhckRlY29yYXRpb25zKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZU1hdGNoZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2hpZ2hsaWdodFRpbWVvdXQpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5faGlnaGxpZ2h0VGltZW91dCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jYWNoZWRTZWFyY2hUZXJtICYmIHRoaXMuX2xhc3RTZWFyY2hPcHRpb25zPy5kZWNvcmF0aW9ucykge1xuICAgICAgdGhpcy5faGlnaGxpZ2h0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXJtID0gdGhpcy5fY2FjaGVkU2VhcmNoVGVybTtcbiAgICAgICAgdGhpcy5fY2FjaGVkU2VhcmNoVGVybSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5maW5kUHJldmlvdXModGVybSEsIHsgLi4udGhpcy5fbGFzdFNlYXJjaE9wdGlvbnMsIGluY3JlbWVudGFsOiB0cnVlLCBub1Njcm9sbDogdHJ1ZSB9KTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyRGVjb3JhdGlvbnMocmV0YWluQ2FjaGVkU2VhcmNoVGVybT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZERlY29yYXRpb24uY2xlYXIoKTtcbiAgICBkaXNwb3NlQXJyYXkodGhpcy5faGlnaGxpZ2h0RGVjb3JhdGlvbnMpO1xuICAgIHRoaXMuX2hpZ2hsaWdodERlY29yYXRpb25zID0gW107XG4gICAgdGhpcy5faGlnaGxpZ2h0ZWRMaW5lcy5jbGVhcigpO1xuICAgIGlmICghcmV0YWluQ2FjaGVkU2VhcmNoVGVybSkge1xuICAgICAgdGhpcy5fY2FjaGVkU2VhcmNoVGVybSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXJBY3RpdmVEZWNvcmF0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkRGVjb3JhdGlvbi5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIG5leHQgaW5zdGFuY2Ugb2YgdGhlIHRlcm0sIHRoZW4gc2Nyb2xsIHRvIGFuZCBzZWxlY3QgaXQuIElmIGl0XG4gICAqIGRvZXNuJ3QgZXhpc3QsIGRvIG5vdGhpbmcuXG4gICAqIEBwYXJhbSB0ZXJtIFRoZSBzZWFyY2ggdGVybS5cbiAgICogQHBhcmFtIHNlYXJjaE9wdGlvbnMgU2VhcmNoIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgYSByZXN1bHQgd2FzIGZvdW5kLlxuICAgKi9cbiAgcHVibGljIGZpbmROZXh0KHRlcm06IHN0cmluZywgc2VhcmNoT3B0aW9ucz86IElTZWFyY2hPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl90ZXJtaW5hbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXNlIGFkZG9uIHVudGlsIGl0IGhhcyBiZWVuIGxvYWRlZCcpO1xuICAgIH1cbiAgICBjb25zdCBkaWRPcHRpb25zQ2hhbmdlZCA9IHRoaXMuX2xhc3RTZWFyY2hPcHRpb25zID8gdGhpcy5fZGlkT3B0aW9uc0NoYW5nZSh0aGlzLl9sYXN0U2VhcmNoT3B0aW9ucywgc2VhcmNoT3B0aW9ucykgOiB0cnVlO1xuICAgIHRoaXMuX2xhc3RTZWFyY2hPcHRpb25zID0gc2VhcmNoT3B0aW9ucztcbiAgICBpZiAoc2VhcmNoT3B0aW9ucz8uZGVjb3JhdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLl9jYWNoZWRTZWFyY2hUZXJtID09PSB1bmRlZmluZWQgfHwgdGVybSAhPT0gdGhpcy5fY2FjaGVkU2VhcmNoVGVybSB8fCBkaWRPcHRpb25zQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLl9oaWdobGlnaHRBbGxNYXRjaGVzKHRlcm0sIHNlYXJjaE9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5fZmluZE5leHRBbmRTZWxlY3QodGVybSwgc2VhcmNoT3B0aW9ucyk7XG4gICAgdGhpcy5fZmlyZVJlc3VsdHMoc2VhcmNoT3B0aW9ucyk7XG4gICAgdGhpcy5fY2FjaGVkU2VhcmNoVGVybSA9IHRlcm07XG5cbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBwcml2YXRlIF9oaWdobGlnaHRBbGxNYXRjaGVzKHRlcm06IHN0cmluZywgc2VhcmNoT3B0aW9uczogSVNlYXJjaE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgYWRkb24gdW50aWwgaXQgaGFzIGJlZW4gbG9hZGVkJyk7XG4gICAgfVxuICAgIGlmICghdGVybSB8fCB0ZXJtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jbGVhckRlY29yYXRpb25zKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlYXJjaE9wdGlvbnMgPSBzZWFyY2hPcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gbmV3IHNlYXJjaCwgY2xlYXIgb3V0IHRoZSBvbGQgZGVjb3JhdGlvbnNcbiAgICB0aGlzLmNsZWFyRGVjb3JhdGlvbnModHJ1ZSk7XG5cbiAgICBjb25zdCBzZWFyY2hSZXN1bHRzV2l0aEhpZ2hsaWdodDogSVNlYXJjaFJlc3VsdFtdID0gW107XG4gICAgbGV0IHByZXZSZXN1bHQ6IElTZWFyY2hSZXN1bHQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuX2ZpbmQodGVybSwgMCwgMCwgc2VhcmNoT3B0aW9ucyk7XG4gICAgd2hpbGUgKHJlc3VsdCAmJiAocHJldlJlc3VsdD8ucm93ICE9PSByZXN1bHQucm93IHx8IHByZXZSZXN1bHQ/LmNvbCAhPT0gcmVzdWx0LmNvbCkpIHtcbiAgICAgIGlmIChzZWFyY2hSZXN1bHRzV2l0aEhpZ2hsaWdodC5sZW5ndGggPj0gdGhpcy5faGlnaGxpZ2h0TGltaXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwcmV2UmVzdWx0ID0gcmVzdWx0O1xuICAgICAgc2VhcmNoUmVzdWx0c1dpdGhIaWdobGlnaHQucHVzaChwcmV2UmVzdWx0KTtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmQoXG4gICAgICAgIHRlcm0sXG4gICAgICAgIHByZXZSZXN1bHQuY29sICsgcHJldlJlc3VsdC50ZXJtLmxlbmd0aCA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzID8gcHJldlJlc3VsdC5yb3cgKyAxIDogcHJldlJlc3VsdC5yb3csXG4gICAgICAgIHByZXZSZXN1bHQuY29sICsgcHJldlJlc3VsdC50ZXJtLmxlbmd0aCA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzID8gMCA6IHByZXZSZXN1bHQuY29sICsgMSxcbiAgICAgICAgc2VhcmNoT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBzZWFyY2hSZXN1bHRzV2l0aEhpZ2hsaWdodCkge1xuICAgICAgY29uc3QgZGVjb3JhdGlvbiA9IHRoaXMuX2NyZWF0ZVJlc3VsdERlY29yYXRpb24obWF0Y2gsIHNlYXJjaE9wdGlvbnMuZGVjb3JhdGlvbnMhKTtcbiAgICAgIGlmIChkZWNvcmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2hpZ2hsaWdodGVkTGluZXMuYWRkKGRlY29yYXRpb24ubWFya2VyLmxpbmUpO1xuICAgICAgICB0aGlzLl9oaWdobGlnaHREZWNvcmF0aW9ucy5wdXNoKHsgZGVjb3JhdGlvbiwgbWF0Y2gsIGRpc3Bvc2UoKSB7IGRlY29yYXRpb24uZGlzcG9zZSgpOyB9IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmQodGVybTogc3RyaW5nLCBzdGFydFJvdzogbnVtYmVyLCBzdGFydENvbDogbnVtYmVyLCBzZWFyY2hPcHRpb25zPzogSVNlYXJjaE9wdGlvbnMpOiBJU2VhcmNoUmVzdWx0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsIHx8ICF0ZXJtIHx8IHRlcm0ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl90ZXJtaW5hbD8uY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuY2xlYXJEZWNvcmF0aW9ucygpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHN0YXJ0Q29sID4gdGhpcy5fdGVybWluYWwuY29scykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbDogJHtzdGFydENvbH0gdG8gc2VhcmNoIGluIHRlcm1pbmFsIG9mICR7dGhpcy5fdGVybWluYWwuY29sc30gY29sc2ApO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQ6IElTZWFyY2hSZXN1bHQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLl9pbml0TGluZXNDYWNoZSgpO1xuXG4gICAgY29uc3Qgc2VhcmNoUG9zaXRpb246IElTZWFyY2hQb3NpdGlvbiA9IHtcbiAgICAgIHN0YXJ0Um93LFxuICAgICAgc3RhcnRDb2xcbiAgICB9O1xuXG4gICAgLy8gU2VhcmNoIHN0YXJ0Um93XG4gICAgcmVzdWx0ID0gdGhpcy5fZmluZEluTGluZSh0ZXJtLCBzZWFyY2hQb3NpdGlvbiwgc2VhcmNoT3B0aW9ucyk7XG4gICAgLy8gU2VhcmNoIGZyb20gc3RhcnRSb3cgKyAxIHRvIGVuZFxuICAgIGlmICghcmVzdWx0KSB7XG5cbiAgICAgIGZvciAobGV0IHkgPSBzdGFydFJvdyArIDE7IHkgPCB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmJhc2VZICsgdGhpcy5fdGVybWluYWwucm93czsgeSsrKSB7XG4gICAgICAgIHNlYXJjaFBvc2l0aW9uLnN0YXJ0Um93ID0geTtcbiAgICAgICAgc2VhcmNoUG9zaXRpb24uc3RhcnRDb2wgPSAwO1xuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBsaW5lIGlzIHdyYXBwZWQgbGluZSwgaW5jcmVhc2UgaW5kZXggb2YgY29sdW1uIHRvIGlnbm9yZSB0aGUgcHJldmlvdXMgc2NhblxuICAgICAgICAvLyBPdGhlcndpc2UsIHJlc2V0IGJlZ2lubmluZyBjb2x1bW4gaW5kZXggdG8gemVybyB3aXRoIHNldCBuZXcgdW53cmFwcGVkIGxpbmUgaW5kZXhcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZEluTGluZSh0ZXJtLCBzZWFyY2hQb3NpdGlvbiwgc2VhcmNoT3B0aW9ucyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZE5leHRBbmRTZWxlY3QodGVybTogc3RyaW5nLCBzZWFyY2hPcHRpb25zPzogSVNlYXJjaE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsIHx8ICF0ZXJtIHx8IHRlcm0ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl90ZXJtaW5hbD8uY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuY2xlYXJEZWNvcmF0aW9ucygpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZTZWxlY3RlZFBvcyA9IHRoaXMuX3Rlcm1pbmFsLmdldFNlbGVjdGlvblBvc2l0aW9uKCk7XG4gICAgdGhpcy5fdGVybWluYWwuY2xlYXJTZWxlY3Rpb24oKTtcblxuICAgIGxldCBzdGFydENvbCA9IDA7XG4gICAgbGV0IHN0YXJ0Um93ID0gMDtcbiAgICBpZiAocHJldlNlbGVjdGVkUG9zKSB7XG4gICAgICBpZiAodGhpcy5fY2FjaGVkU2VhcmNoVGVybSA9PT0gdGVybSkge1xuICAgICAgICBzdGFydENvbCA9IHByZXZTZWxlY3RlZFBvcy5lbmQueDtcbiAgICAgICAgc3RhcnRSb3cgPSBwcmV2U2VsZWN0ZWRQb3MuZW5kLnk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydENvbCA9IHByZXZTZWxlY3RlZFBvcy5zdGFydC54O1xuICAgICAgICBzdGFydFJvdyA9IHByZXZTZWxlY3RlZFBvcy5zdGFydC55O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2luaXRMaW5lc0NhY2hlKCk7XG5cbiAgICBjb25zdCBzZWFyY2hQb3NpdGlvbjogSVNlYXJjaFBvc2l0aW9uID0ge1xuICAgICAgc3RhcnRSb3csXG4gICAgICBzdGFydENvbFxuICAgIH07XG5cbiAgICAvLyBTZWFyY2ggc3RhcnRSb3dcbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5fZmluZEluTGluZSh0ZXJtLCBzZWFyY2hQb3NpdGlvbiwgc2VhcmNoT3B0aW9ucyk7XG4gICAgLy8gU2VhcmNoIGZyb20gc3RhcnRSb3cgKyAxIHRvIGVuZFxuICAgIGlmICghcmVzdWx0KSB7XG5cbiAgICAgIGZvciAobGV0IHkgPSBzdGFydFJvdyArIDE7IHkgPCB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmJhc2VZICsgdGhpcy5fdGVybWluYWwucm93czsgeSsrKSB7XG4gICAgICAgIHNlYXJjaFBvc2l0aW9uLnN0YXJ0Um93ID0geTtcbiAgICAgICAgc2VhcmNoUG9zaXRpb24uc3RhcnRDb2wgPSAwO1xuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBsaW5lIGlzIHdyYXBwZWQgbGluZSwgaW5jcmVhc2UgaW5kZXggb2YgY29sdW1uIHRvIGlnbm9yZSB0aGUgcHJldmlvdXMgc2NhblxuICAgICAgICAvLyBPdGhlcndpc2UsIHJlc2V0IGJlZ2lubmluZyBjb2x1bW4gaW5kZXggdG8gemVybyB3aXRoIHNldCBuZXcgdW53cmFwcGVkIGxpbmUgaW5kZXhcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZEluTGluZSh0ZXJtLCBzZWFyY2hQb3NpdGlvbiwgc2VhcmNoT3B0aW9ucyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB3ZSBoaXQgdGhlIGJvdHRvbSBhbmQgZGlkbid0IHNlYXJjaCBmcm9tIHRoZSB2ZXJ5IHRvcCB3cmFwIGJhY2sgdXBcbiAgICBpZiAoIXJlc3VsdCAmJiBzdGFydFJvdyAhPT0gMCkge1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBzdGFydFJvdzsgeSsrKSB7XG4gICAgICAgIHNlYXJjaFBvc2l0aW9uLnN0YXJ0Um93ID0geTtcbiAgICAgICAgc2VhcmNoUG9zaXRpb24uc3RhcnRDb2wgPSAwO1xuICAgICAgICByZXN1bHQgPSB0aGlzLl9maW5kSW5MaW5lKHRlcm0sIHNlYXJjaFBvc2l0aW9uLCBzZWFyY2hPcHRpb25zKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgcmVzdWx0LCB3cmFwIGJhY2sgYW5kIHJldHVybiBzZWxlY3Rpb24gaWYgaXQgZXhpc3RzLlxuICAgIGlmICghcmVzdWx0ICYmIHByZXZTZWxlY3RlZFBvcykge1xuICAgICAgc2VhcmNoUG9zaXRpb24uc3RhcnRSb3cgPSBwcmV2U2VsZWN0ZWRQb3Muc3RhcnQueTtcbiAgICAgIHNlYXJjaFBvc2l0aW9uLnN0YXJ0Q29sID0gMDtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRJbkxpbmUodGVybSwgc2VhcmNoUG9zaXRpb24sIHNlYXJjaE9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIFNldCBzZWxlY3Rpb24gYW5kIHNjcm9sbCBpZiBhIHJlc3VsdCB3YXMgZm91bmRcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0UmVzdWx0KHJlc3VsdCwgc2VhcmNoT3B0aW9ucz8uZGVjb3JhdGlvbnMsIHNlYXJjaE9wdGlvbnM/Lm5vU2Nyb2xsKTtcbiAgfVxuICAvKipcbiAgICogRmluZCB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb2YgdGhlIHRlcm0sIHRoZW4gc2Nyb2xsIHRvIGFuZCBzZWxlY3QgaXQuIElmIGl0XG4gICAqIGRvZXNuJ3QgZXhpc3QsIGRvIG5vdGhpbmcuXG4gICAqIEBwYXJhbSB0ZXJtIFRoZSBzZWFyY2ggdGVybS5cbiAgICogQHBhcmFtIHNlYXJjaE9wdGlvbnMgU2VhcmNoIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgYSByZXN1bHQgd2FzIGZvdW5kLlxuICAgKi9cbiAgcHVibGljIGZpbmRQcmV2aW91cyh0ZXJtOiBzdHJpbmcsIHNlYXJjaE9wdGlvbnM/OiBJU2VhcmNoT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBhZGRvbiB1bnRpbCBpdCBoYXMgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG4gICAgY29uc3QgZGlkT3B0aW9uc0NoYW5nZWQgPSB0aGlzLl9sYXN0U2VhcmNoT3B0aW9ucyA/IHRoaXMuX2RpZE9wdGlvbnNDaGFuZ2UodGhpcy5fbGFzdFNlYXJjaE9wdGlvbnMsIHNlYXJjaE9wdGlvbnMpIDogdHJ1ZTtcbiAgICB0aGlzLl9sYXN0U2VhcmNoT3B0aW9ucyA9IHNlYXJjaE9wdGlvbnM7XG4gICAgaWYgKHNlYXJjaE9wdGlvbnM/LmRlY29yYXRpb25zKSB7XG4gICAgICBpZiAodGhpcy5fY2FjaGVkU2VhcmNoVGVybSA9PT0gdW5kZWZpbmVkIHx8IHRlcm0gIT09IHRoaXMuX2NhY2hlZFNlYXJjaFRlcm0gfHwgZGlkT3B0aW9uc0NoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5faGlnaGxpZ2h0QWxsTWF0Y2hlcyh0ZXJtLCBzZWFyY2hPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuX2ZpbmRQcmV2aW91c0FuZFNlbGVjdCh0ZXJtLCBzZWFyY2hPcHRpb25zKTtcbiAgICB0aGlzLl9maXJlUmVzdWx0cyhzZWFyY2hPcHRpb25zKTtcbiAgICB0aGlzLl9jYWNoZWRTZWFyY2hUZXJtID0gdGVybTtcblxuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgX2RpZE9wdGlvbnNDaGFuZ2UobGFzdFNlYXJjaE9wdGlvbnM6IElTZWFyY2hPcHRpb25zLCBzZWFyY2hPcHRpb25zPzogSVNlYXJjaE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBpZiAoIXNlYXJjaE9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxhc3RTZWFyY2hPcHRpb25zLmNhc2VTZW5zaXRpdmUgIT09IHNlYXJjaE9wdGlvbnMuY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChsYXN0U2VhcmNoT3B0aW9ucy5yZWdleCAhPT0gc2VhcmNoT3B0aW9ucy5yZWdleCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChsYXN0U2VhcmNoT3B0aW9ucy53aG9sZVdvcmQgIT09IHNlYXJjaE9wdGlvbnMud2hvbGVXb3JkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVJlc3VsdHMoc2VhcmNoT3B0aW9ucz86IElTZWFyY2hPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKHNlYXJjaE9wdGlvbnM/LmRlY29yYXRpb25zKSB7XG4gICAgICBsZXQgcmVzdWx0SW5kZXggPSAtMTtcbiAgICAgIGlmICh0aGlzLl9zZWxlY3RlZERlY29yYXRpb24udmFsdWUpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRNYXRjaCA9IHRoaXMuX3NlbGVjdGVkRGVjb3JhdGlvbi52YWx1ZS5tYXRjaDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9oaWdobGlnaHREZWNvcmF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5faGlnaGxpZ2h0RGVjb3JhdGlvbnNbaV0ubWF0Y2g7XG4gICAgICAgICAgaWYgKG1hdGNoLnJvdyA9PT0gc2VsZWN0ZWRNYXRjaC5yb3cgJiYgbWF0Y2guY29sID09PSBzZWxlY3RlZE1hdGNoLmNvbCAmJiBtYXRjaC5zaXplID09PSBzZWxlY3RlZE1hdGNoLnNpemUpIHtcbiAgICAgICAgICAgIHJlc3VsdEluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fb25EaWRDaGFuZ2VSZXN1bHRzLmZpcmUoeyByZXN1bHRJbmRleCwgcmVzdWx0Q291bnQ6IHRoaXMuX2hpZ2hsaWdodERlY29yYXRpb25zLmxlbmd0aCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9maW5kUHJldmlvdXNBbmRTZWxlY3QodGVybTogc3RyaW5nLCBzZWFyY2hPcHRpb25zPzogSVNlYXJjaE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgYWRkb24gdW50aWwgaXQgaGFzIGJlZW4gbG9hZGVkJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fdGVybWluYWwgfHwgIXRlcm0gfHwgdGVybS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3Rlcm1pbmFsPy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgdGhpcy5jbGVhckRlY29yYXRpb25zKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldlNlbGVjdGVkUG9zID0gdGhpcy5fdGVybWluYWwuZ2V0U2VsZWN0aW9uUG9zaXRpb24oKTtcbiAgICB0aGlzLl90ZXJtaW5hbC5jbGVhclNlbGVjdGlvbigpO1xuXG4gICAgbGV0IHN0YXJ0Um93ID0gdGhpcy5fdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5iYXNlWSArIHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxO1xuICAgIGxldCBzdGFydENvbCA9IHRoaXMuX3Rlcm1pbmFsLmNvbHM7XG4gICAgY29uc3QgaXNSZXZlcnNlU2VhcmNoID0gdHJ1ZTtcblxuICAgIHRoaXMuX2luaXRMaW5lc0NhY2hlKCk7XG4gICAgY29uc3Qgc2VhcmNoUG9zaXRpb246IElTZWFyY2hQb3NpdGlvbiA9IHtcbiAgICAgIHN0YXJ0Um93LFxuICAgICAgc3RhcnRDb2xcbiAgICB9O1xuXG4gICAgbGV0IHJlc3VsdDogSVNlYXJjaFJlc3VsdCB8IHVuZGVmaW5lZDtcbiAgICBpZiAocHJldlNlbGVjdGVkUG9zKSB7XG4gICAgICBzZWFyY2hQb3NpdGlvbi5zdGFydFJvdyA9IHN0YXJ0Um93ID0gcHJldlNlbGVjdGVkUG9zLnN0YXJ0Lnk7XG4gICAgICBzZWFyY2hQb3NpdGlvbi5zdGFydENvbCA9IHN0YXJ0Q29sID0gcHJldlNlbGVjdGVkUG9zLnN0YXJ0Lng7XG4gICAgICBpZiAodGhpcy5fY2FjaGVkU2VhcmNoVGVybSAhPT0gdGVybSkge1xuICAgICAgICAvLyBUcnkgdG8gZXhwYW5kIHNlbGVjdGlvbiB0byByaWdodCBmaXJzdC5cbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZEluTGluZSh0ZXJtLCBzZWFyY2hQb3NpdGlvbiwgc2VhcmNoT3B0aW9ucywgZmFsc2UpO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIC8vIElmIHNlbGVjdGlvbiB3YXMgbm90IGFibGUgdG8gYmUgZXhwYW5kZWQgdG8gdGhlIHJpZ2h0LCB0aGVuIHRyeSByZXZlcnNlIHNlYXJjaFxuICAgICAgICAgIHNlYXJjaFBvc2l0aW9uLnN0YXJ0Um93ID0gc3RhcnRSb3cgPSBwcmV2U2VsZWN0ZWRQb3MuZW5kLnk7XG4gICAgICAgICAgc2VhcmNoUG9zaXRpb24uc3RhcnRDb2wgPSBzdGFydENvbCA9IHByZXZTZWxlY3RlZFBvcy5lbmQueDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9maW5kSW5MaW5lKHRlcm0sIHNlYXJjaFBvc2l0aW9uLCBzZWFyY2hPcHRpb25zLCBpc1JldmVyc2VTZWFyY2gpO1xuICAgIH1cblxuICAgIC8vIFNlYXJjaCBmcm9tIHN0YXJ0Um93IC0gMSB0byB0b3BcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgc2VhcmNoUG9zaXRpb24uc3RhcnRDb2wgPSBNYXRoLm1heChzZWFyY2hQb3NpdGlvbi5zdGFydENvbCwgdGhpcy5fdGVybWluYWwuY29scyk7XG4gICAgICBmb3IgKGxldCB5ID0gc3RhcnRSb3cgLSAxOyB5ID49IDA7IHktLSkge1xuICAgICAgICBzZWFyY2hQb3NpdGlvbi5zdGFydFJvdyA9IHk7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRJbkxpbmUodGVybSwgc2VhcmNoUG9zaXRpb24sIHNlYXJjaE9wdGlvbnMsIGlzUmV2ZXJzZVNlYXJjaCk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB3ZSBoaXQgdGhlIHRvcCBhbmQgZGlkbid0IHNlYXJjaCBmcm9tIHRoZSB2ZXJ5IGJvdHRvbSB3cmFwIGJhY2sgZG93blxuICAgIGlmICghcmVzdWx0ICYmIHN0YXJ0Um93ICE9PSAodGhpcy5fdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5iYXNlWSArIHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxKSkge1xuICAgICAgZm9yIChsZXQgeSA9ICh0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmJhc2VZICsgdGhpcy5fdGVybWluYWwucm93cyAtIDEpOyB5ID49IHN0YXJ0Um93OyB5LS0pIHtcbiAgICAgICAgc2VhcmNoUG9zaXRpb24uc3RhcnRSb3cgPSB5O1xuICAgICAgICByZXN1bHQgPSB0aGlzLl9maW5kSW5MaW5lKHRlcm0sIHNlYXJjaFBvc2l0aW9uLCBzZWFyY2hPcHRpb25zLCBpc1JldmVyc2VTZWFyY2gpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgc2VsZWN0aW9uIGFuZCBzY3JvbGwgaWYgYSByZXN1bHQgd2FzIGZvdW5kXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdFJlc3VsdChyZXN1bHQsIHNlYXJjaE9wdGlvbnM/LmRlY29yYXRpb25zLCBzZWFyY2hPcHRpb25zPy5ub1Njcm9sbCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBhIGxpbmUgY2FjaGUgd2l0aCBhIHR0bFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdExpbmVzQ2FjaGUoKTogdm9pZCB7XG4gICAgY29uc3QgdGVybWluYWwgPSB0aGlzLl90ZXJtaW5hbCE7XG4gICAgaWYgKCF0aGlzLl9saW5lc0NhY2hlKSB7XG4gICAgICB0aGlzLl9saW5lc0NhY2hlID0gbmV3IEFycmF5KHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmUubGVuZ3RoKTtcbiAgICAgIHRoaXMuX2xpbmVzQ2FjaGVEaXNwb3NhYmxlcy52YWx1ZSA9IGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUoW1xuICAgICAgICB0ZXJtaW5hbC5vbkxpbmVGZWVkKCgpID0+IHRoaXMuX2Rlc3Ryb3lMaW5lc0NhY2hlKCkpLFxuICAgICAgICB0ZXJtaW5hbC5vbkN1cnNvck1vdmUoKCkgPT4gdGhpcy5fZGVzdHJveUxpbmVzQ2FjaGUoKSksXG4gICAgICAgIHRlcm1pbmFsLm9uUmVzaXplKCgpID0+IHRoaXMuX2Rlc3Ryb3lMaW5lc0NhY2hlKCkpXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2xpbmVzQ2FjaGVUaW1lb3V0SWQpO1xuICAgIHRoaXMuX2xpbmVzQ2FjaGVUaW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLl9kZXN0cm95TGluZXNDYWNoZSgpLCBMSU5FU19DQUNIRV9USU1FX1RPX0xJVkUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGVzdHJveUxpbmVzQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5fbGluZXNDYWNoZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9saW5lc0NhY2hlRGlzcG9zYWJsZXMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5fbGluZXNDYWNoZVRpbWVvdXRJZCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9saW5lc0NhY2hlVGltZW91dElkKTtcbiAgICAgIHRoaXMuX2xpbmVzQ2FjaGVUaW1lb3V0SWQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZvdW5kIHN1YnN0cmluZyBpcyBhIHdob2xlIHdvcmQgaWYgaXQgZG9lc24ndCBoYXZlIGFuIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgZGlyZWN0bHlcbiAgICogYWRqYWNlbnQgdG8gaXQuXG4gICAqIEBwYXJhbSBzZWFyY2hJbmRleCBzdGFydGluZyBpbmRleHQgb2YgdGhlIHBvdGVudGlhbCB3aG9sZSB3b3JkIHN1YnN0cmluZ1xuICAgKiBAcGFyYW0gbGluZSBlbnRpcmUgc3RyaW5nIGluIHdoaWNoIHRoZSBwb3RlbnRpYWwgd2hvbGUgd29yZCB3YXMgZm91bmRcbiAgICogQHBhcmFtIHRlcm0gdGhlIHN1YnN0cmluZyB0aGF0IHN0YXJ0cyBhdCBzZWFyY2hJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfaXNXaG9sZVdvcmQoc2VhcmNoSW5kZXg6IG51bWJlciwgbGluZTogc3RyaW5nLCB0ZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKChzZWFyY2hJbmRleCA9PT0gMCkgfHwgKE5PTl9XT1JEX0NIQVJBQ1RFUlMuaW5jbHVkZXMobGluZVtzZWFyY2hJbmRleCAtIDFdKSkpICYmXG4gICAgICAoKChzZWFyY2hJbmRleCArIHRlcm0ubGVuZ3RoKSA9PT0gbGluZS5sZW5ndGgpIHx8IChOT05fV09SRF9DSEFSQUNURVJTLmluY2x1ZGVzKGxpbmVbc2VhcmNoSW5kZXggKyB0ZXJtLmxlbmd0aF0pKSk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoZXMgYSBsaW5lIGZvciBhIHNlYXJjaCB0ZXJtLiBUYWtlcyB0aGUgcHJvdmlkZWQgdGVybWluYWwgbGluZSBhbmQgc2VhcmNoZXMgdGhlIHRleHQgbGluZSxcbiAgICogd2hpY2ggbWF5IGNvbnRhaW4gc3Vic2VxdWVudCB0ZXJtaW5hbCBsaW5lcyBpZiB0aGUgdGV4dCBpcyB3cmFwcGVkLiBJZiB0aGUgcHJvdmlkZWQgbGluZSBudW1iZXJcbiAgICogaXMgcGFydCBvZiBhIHdyYXBwZWQgdGV4dCBsaW5lIHRoYXQgc3RhcnRlZCBvbiBhbiBlYXJsaWVyIGxpbmUgdGhlbiBpdCBpcyBza2lwcGVkIHNpbmNlIGl0IHdpbGxcbiAgICogYmUgcHJvcGVybHkgc2VhcmNoZWQgd2hlbiB0aGUgdGVybWluYWwgbGluZSB0aGF0IHRoZSB0ZXh0IHN0YXJ0cyBvbiBpcyBzZWFyY2hlZC5cbiAgICogQHBhcmFtIHRlcm0gVGhlIHNlYXJjaCB0ZXJtLlxuICAgKiBAcGFyYW0gc2VhcmNoUG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIHN0YXJ0IHRoZSBzZWFyY2guXG4gICAqIEBwYXJhbSBzZWFyY2hPcHRpb25zIFNlYXJjaCBvcHRpb25zLlxuICAgKiBAcGFyYW0gaXNSZXZlcnNlU2VhcmNoIFdoZXRoZXIgdGhlIHNlYXJjaCBzaG91bGQgc3RhcnQgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgdGVybWluYWwgYW5kXG4gICAqIHNlYXJjaCB0byB0aGUgbGVmdC5cbiAgICogQHJldHVybnMgVGhlIHNlYXJjaCByZXN1bHQgaWYgaXQgd2FzIGZvdW5kLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9maW5kSW5MaW5lKHRlcm06IHN0cmluZywgc2VhcmNoUG9zaXRpb246IElTZWFyY2hQb3NpdGlvbiwgc2VhcmNoT3B0aW9uczogSVNlYXJjaE9wdGlvbnMgPSB7fSwgaXNSZXZlcnNlU2VhcmNoOiBib29sZWFuID0gZmFsc2UpOiBJU2VhcmNoUmVzdWx0IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0ZXJtaW5hbCA9IHRoaXMuX3Rlcm1pbmFsITtcbiAgICBjb25zdCByb3cgPSBzZWFyY2hQb3NpdGlvbi5zdGFydFJvdztcbiAgICBjb25zdCBjb2wgPSBzZWFyY2hQb3NpdGlvbi5zdGFydENvbDtcblxuICAgIC8vIElnbm9yZSB3cmFwcGVkIGxpbmVzLCBvbmx5IGNvbnNpZGVyIG9uIHVud3JhcHBlZCBsaW5lIChmaXJzdCByb3cgb2YgY29tbWFuZCBzdHJpbmcpLlxuICAgIGNvbnN0IGZpcnN0TGluZSA9IHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmUuZ2V0TGluZShyb3cpO1xuICAgIGlmIChmaXJzdExpbmU/LmlzV3JhcHBlZCkge1xuICAgICAgaWYgKGlzUmV2ZXJzZVNlYXJjaCkge1xuICAgICAgICBzZWFyY2hQb3NpdGlvbi5zdGFydENvbCArPSB0ZXJtaW5hbC5jb2xzO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgd2lsbCBpdGVyYXRlIHVudGlsIHdlIGZpbmQgdGhlIGxpbmUgc3RhcnQuXG4gICAgICAvLyBXaGVuIHdlIGZpbmQgaXQsIHdlIHdpbGwgc2VhcmNoIHVzaW5nIHRoZSBjYWxjdWxhdGVkIHN0YXJ0IGNvbHVtbi5cbiAgICAgIHNlYXJjaFBvc2l0aW9uLnN0YXJ0Um93LS07XG4gICAgICBzZWFyY2hQb3NpdGlvbi5zdGFydENvbCArPSB0ZXJtaW5hbC5jb2xzO1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRJbkxpbmUodGVybSwgc2VhcmNoUG9zaXRpb24sIHNlYXJjaE9wdGlvbnMpO1xuICAgIH1cbiAgICBsZXQgY2FjaGUgPSB0aGlzLl9saW5lc0NhY2hlPy5bcm93XTtcbiAgICBpZiAoIWNhY2hlKSB7XG4gICAgICBjYWNoZSA9IHRoaXMuX3RyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZ1dpdGhXcmFwKHJvdywgdHJ1ZSk7XG4gICAgICBpZiAodGhpcy5fbGluZXNDYWNoZSkge1xuICAgICAgICB0aGlzLl9saW5lc0NhY2hlW3Jvd10gPSBjYWNoZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgW3N0cmluZ0xpbmUsIG9mZnNldHNdID0gY2FjaGU7XG5cbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9idWZmZXJDb2xzVG9TdHJpbmdPZmZzZXQocm93LCBjb2wpO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBzZWFyY2hPcHRpb25zLmNhc2VTZW5zaXRpdmUgPyB0ZXJtIDogdGVybS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHNlYXJjaFN0cmluZ0xpbmUgPSBzZWFyY2hPcHRpb25zLmNhc2VTZW5zaXRpdmUgPyBzdHJpbmdMaW5lIDogc3RyaW5nTGluZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgbGV0IHJlc3VsdEluZGV4ID0gLTE7XG4gICAgaWYgKHNlYXJjaE9wdGlvbnMucmVnZXgpIHtcbiAgICAgIGNvbnN0IHNlYXJjaFJlZ2V4ID0gUmVnRXhwKHNlYXJjaFRlcm0sICdnJyk7XG4gICAgICBsZXQgZm91bmRUZXJtOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgICAgaWYgKGlzUmV2ZXJzZVNlYXJjaCkge1xuICAgICAgICAvLyBUaGlzIGxvb3Agd2lsbCBnZXQgdGhlIHJlc3VsdEluZGV4IG9mIHRoZSBfbGFzdF8gcmVnZXggbWF0Y2ggaW4gdGhlIHJhbmdlIDAuLm9mZnNldFxuICAgICAgICB3aGlsZSAoZm91bmRUZXJtID0gc2VhcmNoUmVnZXguZXhlYyhzZWFyY2hTdHJpbmdMaW5lLnNsaWNlKDAsIG9mZnNldCkpKSB7XG4gICAgICAgICAgcmVzdWx0SW5kZXggPSBzZWFyY2hSZWdleC5sYXN0SW5kZXggLSBmb3VuZFRlcm1bMF0ubGVuZ3RoO1xuICAgICAgICAgIHRlcm0gPSBmb3VuZFRlcm1bMF07XG4gICAgICAgICAgc2VhcmNoUmVnZXgubGFzdEluZGV4IC09ICh0ZXJtLmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3VuZFRlcm0gPSBzZWFyY2hSZWdleC5leGVjKHNlYXJjaFN0cmluZ0xpbmUuc2xpY2Uob2Zmc2V0KSk7XG4gICAgICAgIGlmIChmb3VuZFRlcm0gJiYgZm91bmRUZXJtWzBdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXN1bHRJbmRleCA9IG9mZnNldCArIChzZWFyY2hSZWdleC5sYXN0SW5kZXggLSBmb3VuZFRlcm1bMF0ubGVuZ3RoKTtcbiAgICAgICAgICB0ZXJtID0gZm91bmRUZXJtWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1JldmVyc2VTZWFyY2gpIHtcbiAgICAgICAgaWYgKG9mZnNldCAtIHNlYXJjaFRlcm0ubGVuZ3RoID49IDApIHtcbiAgICAgICAgICByZXN1bHRJbmRleCA9IHNlYXJjaFN0cmluZ0xpbmUubGFzdEluZGV4T2Yoc2VhcmNoVGVybSwgb2Zmc2V0IC0gc2VhcmNoVGVybS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRJbmRleCA9IHNlYXJjaFN0cmluZ0xpbmUuaW5kZXhPZihzZWFyY2hUZXJtLCBvZmZzZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXN1bHRJbmRleCA+PSAwKSB7XG4gICAgICBpZiAoc2VhcmNoT3B0aW9ucy53aG9sZVdvcmQgJiYgIXRoaXMuX2lzV2hvbGVXb3JkKHJlc3VsdEluZGV4LCBzZWFyY2hTdHJpbmdMaW5lLCB0ZXJtKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFkanVzdCB0aGUgcm93IG51bWJlciBhbmQgc2VhcmNoIGluZGV4IGlmIG5lZWRlZCBzaW5jZSBhIFwibGluZVwiIG9mIHRleHQgY2FuIHNwYW4gbXVsdGlwbGVcbiAgICAgIC8vIHJvd3NcbiAgICAgIGxldCBzdGFydFJvd09mZnNldCA9IDA7XG4gICAgICB3aGlsZSAoc3RhcnRSb3dPZmZzZXQgPCBvZmZzZXRzLmxlbmd0aCAtIDEgJiYgcmVzdWx0SW5kZXggPj0gb2Zmc2V0c1tzdGFydFJvd09mZnNldCArIDFdKSB7XG4gICAgICAgIHN0YXJ0Um93T2Zmc2V0Kys7XG4gICAgICB9XG4gICAgICBsZXQgZW5kUm93T2Zmc2V0ID0gc3RhcnRSb3dPZmZzZXQ7XG4gICAgICB3aGlsZSAoZW5kUm93T2Zmc2V0IDwgb2Zmc2V0cy5sZW5ndGggLSAxICYmIHJlc3VsdEluZGV4ICsgdGVybS5sZW5ndGggPj0gb2Zmc2V0c1tlbmRSb3dPZmZzZXQgKyAxXSkge1xuICAgICAgICBlbmRSb3dPZmZzZXQrKztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXJ0Q29sT2Zmc2V0ID0gcmVzdWx0SW5kZXggLSBvZmZzZXRzW3N0YXJ0Um93T2Zmc2V0XTtcbiAgICAgIGNvbnN0IGVuZENvbE9mZnNldCA9IHJlc3VsdEluZGV4ICsgdGVybS5sZW5ndGggLSBvZmZzZXRzW2VuZFJvd09mZnNldF07XG4gICAgICBjb25zdCBzdGFydENvbEluZGV4ID0gdGhpcy5fc3RyaW5nTGVuZ3RoVG9CdWZmZXJTaXplKHJvdyArIHN0YXJ0Um93T2Zmc2V0LCBzdGFydENvbE9mZnNldCk7XG4gICAgICBjb25zdCBlbmRDb2xJbmRleCA9IHRoaXMuX3N0cmluZ0xlbmd0aFRvQnVmZmVyU2l6ZShyb3cgKyBlbmRSb3dPZmZzZXQsIGVuZENvbE9mZnNldCk7XG4gICAgICBjb25zdCBzaXplID0gZW5kQ29sSW5kZXggLSBzdGFydENvbEluZGV4ICsgdGVybWluYWwuY29scyAqIChlbmRSb3dPZmZzZXQgLSBzdGFydFJvd09mZnNldCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRlcm0sXG4gICAgICAgIGNvbDogc3RhcnRDb2xJbmRleCxcbiAgICAgICAgcm93OiByb3cgKyBzdGFydFJvd09mZnNldCxcbiAgICAgICAgc2l6ZVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdHJpbmdMZW5ndGhUb0J1ZmZlclNpemUocm93OiBudW1iZXIsIG9mZnNldDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5fdGVybWluYWwhLmJ1ZmZlci5hY3RpdmUuZ2V0TGluZShyb3cpO1xuICAgIGlmICghbGluZSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2Zmc2V0OyBpKyspIHtcbiAgICAgIGNvbnN0IGNlbGwgPSBsaW5lLmdldENlbGwoaSk7XG4gICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBBZGp1c3QgdGhlIHNlYXJjaEluZGV4IHRvIG5vcm1hbGl6ZSBlbW9qaSBpbnRvIHNpbmdsZSBjaGFyc1xuICAgICAgY29uc3QgY2hhciA9IGNlbGwuZ2V0Q2hhcnMoKTtcbiAgICAgIGlmIChjaGFyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgb2Zmc2V0IC09IGNoYXIubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICAgIC8vIEFkanVzdCB0aGUgc2VhcmNoSW5kZXggZm9yIGVtcHR5IGNoYXJhY3RlcnMgZm9sbG93aW5nIHdpZGUgdW5pY29kZVxuICAgICAgLy8gY2hhcnMgKGVnLiBDSkspXG4gICAgICBjb25zdCBuZXh0Q2VsbCA9IGxpbmUuZ2V0Q2VsbChpICsgMSk7XG4gICAgICBpZiAobmV4dENlbGwgJiYgbmV4dENlbGwuZ2V0V2lkdGgoKSA9PT0gMCkge1xuICAgICAgICBvZmZzZXQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuXG4gIHByaXZhdGUgX2J1ZmZlckNvbHNUb1N0cmluZ09mZnNldChzdGFydFJvdzogbnVtYmVyLCBjb2xzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRlcm1pbmFsID0gdGhpcy5fdGVybWluYWwhO1xuICAgIGxldCBsaW5lSW5kZXggPSBzdGFydFJvdztcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBsZXQgbGluZSA9IHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmUuZ2V0TGluZShsaW5lSW5kZXgpO1xuICAgIHdoaWxlIChjb2xzID4gMCAmJiBsaW5lKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHMgJiYgaSA8IHRlcm1pbmFsLmNvbHM7IGkrKykge1xuICAgICAgICBjb25zdCBjZWxsID0gbGluZS5nZXRDZWxsKGkpO1xuICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2VsbC5nZXRXaWR0aCgpKSB7XG4gICAgICAgICAgLy8gVHJlYXQgbnVsbCBjaGFyYWN0ZXJzIGFzIHdoaXRlc3BhY2UgdG8gYWxpZ24gd2l0aCB0aGUgdHJhbnNsYXRlVG9TdHJpbmcgQVBJXG4gICAgICAgICAgb2Zmc2V0ICs9IGNlbGwuZ2V0Q29kZSgpID09PSAwID8gMSA6IGNlbGwuZ2V0Q2hhcnMoKS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpbmVJbmRleCsrO1xuICAgICAgbGluZSA9IHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmUuZ2V0TGluZShsaW5lSW5kZXgpO1xuICAgICAgaWYgKGxpbmUgJiYgIWxpbmUuaXNXcmFwcGVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29scyAtPSB0ZXJtaW5hbC5jb2xzO1xuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgYSBidWZmZXIgbGluZSB0byBhIHN0cmluZywgaW5jbHVkaW5nIHN1YnNlcXVlbnQgbGluZXMgaWYgdGhleSBhcmUgd3JhcHMuXG4gICAqIFdpZGUgY2hhcmFjdGVycyB3aWxsIGNvdW50IGFzIHR3byBjb2x1bW5zIGluIHRoZSByZXN1bHRpbmcgc3RyaW5nLiBUaGlzXG4gICAqIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgZ2V0dGluZyB0aGUgYWN0dWFsIHRleHQgdW5kZXJuZWF0aCB0aGUgcmF3IHNlbGVjdGlvblxuICAgKiBwb3NpdGlvbi5cbiAgICogQHBhcmFtIGxpbmVJbmRleCBUaGUgaW5kZXggb2YgdGhlIGxpbmUgYmVpbmcgdHJhbnNsYXRlZC5cbiAgICogQHBhcmFtIHRyaW1SaWdodCBXaGV0aGVyIHRvIHRyaW0gd2hpdGVzcGFjZSB0byB0aGUgcmlnaHQuXG4gICAqL1xuICBwcml2YXRlIF90cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmdXaXRoV3JhcChsaW5lSW5kZXg6IG51bWJlciwgdHJpbVJpZ2h0OiBib29sZWFuKTogTGluZUNhY2hlRW50cnkge1xuICAgIGNvbnN0IHRlcm1pbmFsID0gdGhpcy5fdGVybWluYWwhO1xuICAgIGNvbnN0IHN0cmluZ3MgPSBbXTtcbiAgICBjb25zdCBsaW5lT2Zmc2V0cyA9IFswXTtcbiAgICBsZXQgbGluZSA9IHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmUuZ2V0TGluZShsaW5lSW5kZXgpO1xuICAgIHdoaWxlIChsaW5lKSB7XG4gICAgICBjb25zdCBuZXh0TGluZSA9IHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmUuZ2V0TGluZShsaW5lSW5kZXggKyAxKTtcbiAgICAgIGNvbnN0IGxpbmVXcmFwc1RvTmV4dCA9IG5leHRMaW5lID8gbmV4dExpbmUuaXNXcmFwcGVkIDogZmFsc2U7XG4gICAgICBsZXQgc3RyaW5nID0gbGluZS50cmFuc2xhdGVUb1N0cmluZyghbGluZVdyYXBzVG9OZXh0ICYmIHRyaW1SaWdodCk7XG4gICAgICBpZiAobGluZVdyYXBzVG9OZXh0ICYmIG5leHRMaW5lKSB7XG4gICAgICAgIGNvbnN0IGxhc3RDZWxsID0gbGluZS5nZXRDZWxsKGxpbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgIGNvbnN0IGxhc3RDZWxsSXNOdWxsID0gbGFzdENlbGwgJiYgbGFzdENlbGwuZ2V0Q29kZSgpID09PSAwICYmIGxhc3RDZWxsLmdldFdpZHRoKCkgPT09IDE7XG4gICAgICAgIC8vIGEgd2lkZSBjaGFyYWN0ZXIgd3JhcHBlZCB0byB0aGUgbmV4dCBsaW5lXG4gICAgICAgIGlmIChsYXN0Q2VsbElzTnVsbCAmJiBuZXh0TGluZS5nZXRDZWxsKDApPy5nZXRXaWR0aCgpID09PSAyKSB7XG4gICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RyaW5ncy5wdXNoKHN0cmluZyk7XG4gICAgICBpZiAobGluZVdyYXBzVG9OZXh0KSB7XG4gICAgICAgIGxpbmVPZmZzZXRzLnB1c2gobGluZU9mZnNldHNbbGluZU9mZnNldHMubGVuZ3RoIC0gMV0gKyBzdHJpbmcubGVuZ3RoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbGluZUluZGV4Kys7XG4gICAgICBsaW5lID0gbmV4dExpbmU7XG4gICAgfVxuICAgIHJldHVybiBbc3RyaW5ncy5qb2luKCcnKSwgbGluZU9mZnNldHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYW5kIHNjcm9sbHMgdG8gYSByZXN1bHQuXG4gICAqIEBwYXJhbSByZXN1bHQgVGhlIHJlc3VsdCB0byBzZWxlY3QuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgYSByZXN1bHQgd2FzIHNlbGVjdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VsZWN0UmVzdWx0KHJlc3VsdDogSVNlYXJjaFJlc3VsdCB8IHVuZGVmaW5lZCwgb3B0aW9ucz86IElTZWFyY2hEZWNvcmF0aW9uT3B0aW9ucywgbm9TY3JvbGw/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGVybWluYWwgPSB0aGlzLl90ZXJtaW5hbCE7XG4gICAgdGhpcy5fc2VsZWN0ZWREZWNvcmF0aW9uLmNsZWFyKCk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRlcm1pbmFsLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRlcm1pbmFsLnNlbGVjdChyZXN1bHQuY29sLCByZXN1bHQucm93LCByZXN1bHQuc2l6ZSk7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IHRlcm1pbmFsLnJlZ2lzdGVyTWFya2VyKC10ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmJhc2VZIC0gdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5jdXJzb3JZICsgcmVzdWx0LnJvdyk7XG4gICAgICBpZiAobWFya2VyKSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRpb24gPSB0ZXJtaW5hbC5yZWdpc3RlckRlY29yYXRpb24oe1xuICAgICAgICAgIG1hcmtlcixcbiAgICAgICAgICB4OiByZXN1bHQuY29sLFxuICAgICAgICAgIHdpZHRoOiByZXN1bHQuc2l6ZSxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYWN0aXZlTWF0Y2hCYWNrZ3JvdW5kLFxuICAgICAgICAgIGxheWVyOiAndG9wJyxcbiAgICAgICAgICBvdmVydmlld1J1bGVyT3B0aW9uczoge1xuICAgICAgICAgICAgY29sb3I6IG9wdGlvbnMuYWN0aXZlTWF0Y2hDb2xvck92ZXJ2aWV3UnVsZXJcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZGVjb3JhdGlvbikge1xuICAgICAgICAgIGNvbnN0IGRpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdID0gW107XG4gICAgICAgICAgZGlzcG9zYWJsZXMucHVzaChtYXJrZXIpO1xuICAgICAgICAgIGRpc3Bvc2FibGVzLnB1c2goZGVjb3JhdGlvbi5vblJlbmRlcigoZSkgPT4gdGhpcy5fYXBwbHlTdHlsZXMoZSwgb3B0aW9ucy5hY3RpdmVNYXRjaEJvcmRlciwgdHJ1ZSkpKTtcbiAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKGRlY29yYXRpb24ub25EaXNwb3NlKCgpID0+IGRpc3Bvc2VBcnJheShkaXNwb3NhYmxlcykpKTtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZERlY29yYXRpb24udmFsdWUgPSB7IGRlY29yYXRpb24sIG1hdGNoOiByZXN1bHQsIGRpc3Bvc2UoKSB7IGRlY29yYXRpb24uZGlzcG9zZSgpOyB9IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5vU2Nyb2xsKSB7XG4gICAgICAvLyBJZiBpdCBpcyBub3QgaW4gdGhlIHZpZXdwb3J0IHRoZW4gd2Ugc2Nyb2xsIGVsc2UgaXQganVzdCBnZXRzIHNlbGVjdGVkXG4gICAgICBpZiAocmVzdWx0LnJvdyA+PSAodGVybWluYWwuYnVmZmVyLmFjdGl2ZS52aWV3cG9ydFkgKyB0ZXJtaW5hbC5yb3dzKSB8fCByZXN1bHQucm93IDwgdGVybWluYWwuYnVmZmVyLmFjdGl2ZS52aWV3cG9ydFkpIHtcbiAgICAgICAgbGV0IHNjcm9sbCA9IHJlc3VsdC5yb3cgLSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlLnZpZXdwb3J0WTtcbiAgICAgICAgc2Nyb2xsIC09IE1hdGguZmxvb3IodGVybWluYWwucm93cyAvIDIpO1xuICAgICAgICB0ZXJtaW5hbC5zY3JvbGxMaW5lcyhzY3JvbGwpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHN0eWxlcyB0byB0aGUgZGVjb3JhdGlvbiB3aGVuIGl0IGlzIHJlbmRlcmVkLlxuICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZGVjb3JhdGlvbidzIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBib3JkZXJDb2xvciBUaGUgYm9yZGVyIGNvbG9yIHRvIGFwcGx5LlxuICAgKiBAcGFyYW0gaXNBY3RpdmVSZXN1bHQgV2hldGhlciB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSBhY3RpdmUgc2VhcmNoIHJlc3VsdC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgX2FwcGx5U3R5bGVzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBib3JkZXJDb2xvcjogc3RyaW5nIHwgdW5kZWZpbmVkLCBpc0FjdGl2ZVJlc3VsdDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3h0ZXJtLWZpbmQtcmVzdWx0LWRlY29yYXRpb24nKSkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd4dGVybS1maW5kLXJlc3VsdC1kZWNvcmF0aW9uJyk7XG4gICAgICBpZiAoYm9yZGVyQ29sb3IpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5vdXRsaW5lID0gYDFweCBzb2xpZCAke2JvcmRlckNvbG9yfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0FjdGl2ZVJlc3VsdCkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd4dGVybS1maW5kLWFjdGl2ZS1yZXN1bHQtZGVjb3JhdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGVjb3JhdGlvbiBmb3IgdGhlIHJlc3VsdCBhbmQgYXBwbGllcyBzdHlsZXNcbiAgICogQHBhcmFtIHJlc3VsdCB0aGUgc2VhcmNoIHJlc3VsdCBmb3Igd2hpY2ggdG8gY3JlYXRlIHRoZSBkZWNvcmF0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zIGZvciB0aGUgZGVjb3JhdGlvblxuICAgKiBAcmV0dXJucyB0aGUge0BsaW5rIElEZWNvcmF0aW9ufSBvciB1bmRlZmluZWQgaWYgdGhlIG1hcmtlciBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIG9mXG4gICAqL1xuICBwcml2YXRlIF9jcmVhdGVSZXN1bHREZWNvcmF0aW9uKHJlc3VsdDogSVNlYXJjaFJlc3VsdCwgb3B0aW9uczogSVNlYXJjaERlY29yYXRpb25PcHRpb25zKTogSURlY29yYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRlcm1pbmFsID0gdGhpcy5fdGVybWluYWwhO1xuICAgIGNvbnN0IG1hcmtlciA9IHRlcm1pbmFsLnJlZ2lzdGVyTWFya2VyKC10ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmJhc2VZIC0gdGVybWluYWwuYnVmZmVyLmFjdGl2ZS5jdXJzb3JZICsgcmVzdWx0LnJvdyk7XG4gICAgaWYgKCFtYXJrZXIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGZpbmRSZXN1bHREZWNvcmF0aW9uID0gdGVybWluYWwucmVnaXN0ZXJEZWNvcmF0aW9uKHtcbiAgICAgIG1hcmtlcixcbiAgICAgIHg6IHJlc3VsdC5jb2wsXG4gICAgICB3aWR0aDogcmVzdWx0LnNpemUsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMubWF0Y2hCYWNrZ3JvdW5kLFxuICAgICAgb3ZlcnZpZXdSdWxlck9wdGlvbnM6IHRoaXMuX2hpZ2hsaWdodGVkTGluZXMuaGFzKG1hcmtlci5saW5lKSA/IHVuZGVmaW5lZCA6IHtcbiAgICAgICAgY29sb3I6IG9wdGlvbnMubWF0Y2hPdmVydmlld1J1bGVyLFxuICAgICAgICBwb3NpdGlvbjogJ2NlbnRlcidcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZmluZFJlc3VsdERlY29yYXRpb24pIHtcbiAgICAgIGNvbnN0IGRpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdID0gW107XG4gICAgICBkaXNwb3NhYmxlcy5wdXNoKG1hcmtlcik7XG4gICAgICBkaXNwb3NhYmxlcy5wdXNoKGZpbmRSZXN1bHREZWNvcmF0aW9uLm9uUmVuZGVyKChlKSA9PiB0aGlzLl9hcHBseVN0eWxlcyhlLCBvcHRpb25zLm1hdGNoQm9yZGVyLCBmYWxzZSkpKTtcbiAgICAgIGRpc3Bvc2FibGVzLnB1c2goZmluZFJlc3VsdERlY29yYXRpb24ub25EaXNwb3NlKCgpID0+IGRpc3Bvc2VBcnJheShkaXNwb3NhYmxlcykpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbmRSZXN1bHREZWNvcmF0aW9uO1xuICB9XG59XG4iLCAiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiVW5pY29kZTExQWRkb25cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiVW5pY29kZTExQWRkb25cIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCAoKSA9PiB7XG5yZXR1cm4gIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgVW5pY29kZUNoYXJQcm9wZXJ0aWVzLCBVbmljb2RlQ2hhcldpZHRoIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFVuaWNvZGVTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1VuaWNvZGVTZXJ2aWNlJztcblxuY29uc3QgQk1QX0NPTUJJTklORyA9IFtcbiAgWzB4MDMwMCwgMHgwMzZGXSwgWzB4MDQ4MywgMHgwNDg5XSwgWzB4MDU5MSwgMHgwNUJEXSxcbiAgWzB4MDVCRiwgMHgwNUJGXSwgWzB4MDVDMSwgMHgwNUMyXSwgWzB4MDVDNCwgMHgwNUM1XSxcbiAgWzB4MDVDNywgMHgwNUM3XSwgWzB4MDYwMCwgMHgwNjA1XSwgWzB4MDYxMCwgMHgwNjFBXSxcbiAgWzB4MDYxQywgMHgwNjFDXSwgWzB4MDY0QiwgMHgwNjVGXSwgWzB4MDY3MCwgMHgwNjcwXSxcbiAgWzB4MDZENiwgMHgwNkREXSwgWzB4MDZERiwgMHgwNkU0XSwgWzB4MDZFNywgMHgwNkU4XSxcbiAgWzB4MDZFQSwgMHgwNkVEXSwgWzB4MDcwRiwgMHgwNzBGXSwgWzB4MDcxMSwgMHgwNzExXSxcbiAgWzB4MDczMCwgMHgwNzRBXSwgWzB4MDdBNiwgMHgwN0IwXSwgWzB4MDdFQiwgMHgwN0YzXSxcbiAgWzB4MDdGRCwgMHgwN0ZEXSwgWzB4MDgxNiwgMHgwODE5XSwgWzB4MDgxQiwgMHgwODIzXSxcbiAgWzB4MDgyNSwgMHgwODI3XSwgWzB4MDgyOSwgMHgwODJEXSwgWzB4MDg1OSwgMHgwODVCXSxcbiAgWzB4MDhEMywgMHgwOTAyXSwgWzB4MDkzQSwgMHgwOTNBXSwgWzB4MDkzQywgMHgwOTNDXSxcbiAgWzB4MDk0MSwgMHgwOTQ4XSwgWzB4MDk0RCwgMHgwOTREXSwgWzB4MDk1MSwgMHgwOTU3XSxcbiAgWzB4MDk2MiwgMHgwOTYzXSwgWzB4MDk4MSwgMHgwOTgxXSwgWzB4MDlCQywgMHgwOUJDXSxcbiAgWzB4MDlDMSwgMHgwOUM0XSwgWzB4MDlDRCwgMHgwOUNEXSwgWzB4MDlFMiwgMHgwOUUzXSxcbiAgWzB4MDlGRSwgMHgwOUZFXSwgWzB4MEEwMSwgMHgwQTAyXSwgWzB4MEEzQywgMHgwQTNDXSxcbiAgWzB4MEE0MSwgMHgwQTQyXSwgWzB4MEE0NywgMHgwQTQ4XSwgWzB4MEE0QiwgMHgwQTREXSxcbiAgWzB4MEE1MSwgMHgwQTUxXSwgWzB4MEE3MCwgMHgwQTcxXSwgWzB4MEE3NSwgMHgwQTc1XSxcbiAgWzB4MEE4MSwgMHgwQTgyXSwgWzB4MEFCQywgMHgwQUJDXSwgWzB4MEFDMSwgMHgwQUM1XSxcbiAgWzB4MEFDNywgMHgwQUM4XSwgWzB4MEFDRCwgMHgwQUNEXSwgWzB4MEFFMiwgMHgwQUUzXSxcbiAgWzB4MEFGQSwgMHgwQUZGXSwgWzB4MEIwMSwgMHgwQjAxXSwgWzB4MEIzQywgMHgwQjNDXSxcbiAgWzB4MEIzRiwgMHgwQjNGXSwgWzB4MEI0MSwgMHgwQjQ0XSwgWzB4MEI0RCwgMHgwQjREXSxcbiAgWzB4MEI1NiwgMHgwQjU2XSwgWzB4MEI2MiwgMHgwQjYzXSwgWzB4MEI4MiwgMHgwQjgyXSxcbiAgWzB4MEJDMCwgMHgwQkMwXSwgWzB4MEJDRCwgMHgwQkNEXSwgWzB4MEMwMCwgMHgwQzAwXSxcbiAgWzB4MEMwNCwgMHgwQzA0XSwgWzB4MEMzRSwgMHgwQzQwXSwgWzB4MEM0NiwgMHgwQzQ4XSxcbiAgWzB4MEM0QSwgMHgwQzREXSwgWzB4MEM1NSwgMHgwQzU2XSwgWzB4MEM2MiwgMHgwQzYzXSxcbiAgWzB4MEM4MSwgMHgwQzgxXSwgWzB4MENCQywgMHgwQ0JDXSwgWzB4MENCRiwgMHgwQ0JGXSxcbiAgWzB4MENDNiwgMHgwQ0M2XSwgWzB4MENDQywgMHgwQ0NEXSwgWzB4MENFMiwgMHgwQ0UzXSxcbiAgWzB4MEQwMCwgMHgwRDAxXSwgWzB4MEQzQiwgMHgwRDNDXSwgWzB4MEQ0MSwgMHgwRDQ0XSxcbiAgWzB4MEQ0RCwgMHgwRDREXSwgWzB4MEQ2MiwgMHgwRDYzXSwgWzB4MERDQSwgMHgwRENBXSxcbiAgWzB4MEREMiwgMHgwREQ0XSwgWzB4MERENiwgMHgwREQ2XSwgWzB4MEUzMSwgMHgwRTMxXSxcbiAgWzB4MEUzNCwgMHgwRTNBXSwgWzB4MEU0NywgMHgwRTRFXSwgWzB4MEVCMSwgMHgwRUIxXSxcbiAgWzB4MEVCNCwgMHgwRUJDXSwgWzB4MEVDOCwgMHgwRUNEXSwgWzB4MEYxOCwgMHgwRjE5XSxcbiAgWzB4MEYzNSwgMHgwRjM1XSwgWzB4MEYzNywgMHgwRjM3XSwgWzB4MEYzOSwgMHgwRjM5XSxcbiAgWzB4MEY3MSwgMHgwRjdFXSwgWzB4MEY4MCwgMHgwRjg0XSwgWzB4MEY4NiwgMHgwRjg3XSxcbiAgWzB4MEY4RCwgMHgwRjk3XSwgWzB4MEY5OSwgMHgwRkJDXSwgWzB4MEZDNiwgMHgwRkM2XSxcbiAgWzB4MTAyRCwgMHgxMDMwXSwgWzB4MTAzMiwgMHgxMDM3XSwgWzB4MTAzOSwgMHgxMDNBXSxcbiAgWzB4MTAzRCwgMHgxMDNFXSwgWzB4MTA1OCwgMHgxMDU5XSwgWzB4MTA1RSwgMHgxMDYwXSxcbiAgWzB4MTA3MSwgMHgxMDc0XSwgWzB4MTA4MiwgMHgxMDgyXSwgWzB4MTA4NSwgMHgxMDg2XSxcbiAgWzB4MTA4RCwgMHgxMDhEXSwgWzB4MTA5RCwgMHgxMDlEXSwgWzB4MTE2MCwgMHgxMUZGXSxcbiAgWzB4MTM1RCwgMHgxMzVGXSwgWzB4MTcxMiwgMHgxNzE0XSwgWzB4MTczMiwgMHgxNzM0XSxcbiAgWzB4MTc1MiwgMHgxNzUzXSwgWzB4MTc3MiwgMHgxNzczXSwgWzB4MTdCNCwgMHgxN0I1XSxcbiAgWzB4MTdCNywgMHgxN0JEXSwgWzB4MTdDNiwgMHgxN0M2XSwgWzB4MTdDOSwgMHgxN0QzXSxcbiAgWzB4MTdERCwgMHgxN0REXSwgWzB4MTgwQiwgMHgxODBFXSwgWzB4MTg4NSwgMHgxODg2XSxcbiAgWzB4MThBOSwgMHgxOEE5XSwgWzB4MTkyMCwgMHgxOTIyXSwgWzB4MTkyNywgMHgxOTI4XSxcbiAgWzB4MTkzMiwgMHgxOTMyXSwgWzB4MTkzOSwgMHgxOTNCXSwgWzB4MUExNywgMHgxQTE4XSxcbiAgWzB4MUExQiwgMHgxQTFCXSwgWzB4MUE1NiwgMHgxQTU2XSwgWzB4MUE1OCwgMHgxQTVFXSxcbiAgWzB4MUE2MCwgMHgxQTYwXSwgWzB4MUE2MiwgMHgxQTYyXSwgWzB4MUE2NSwgMHgxQTZDXSxcbiAgWzB4MUE3MywgMHgxQTdDXSwgWzB4MUE3RiwgMHgxQTdGXSwgWzB4MUFCMCwgMHgxQUJFXSxcbiAgWzB4MUIwMCwgMHgxQjAzXSwgWzB4MUIzNCwgMHgxQjM0XSwgWzB4MUIzNiwgMHgxQjNBXSxcbiAgWzB4MUIzQywgMHgxQjNDXSwgWzB4MUI0MiwgMHgxQjQyXSwgWzB4MUI2QiwgMHgxQjczXSxcbiAgWzB4MUI4MCwgMHgxQjgxXSwgWzB4MUJBMiwgMHgxQkE1XSwgWzB4MUJBOCwgMHgxQkE5XSxcbiAgWzB4MUJBQiwgMHgxQkFEXSwgWzB4MUJFNiwgMHgxQkU2XSwgWzB4MUJFOCwgMHgxQkU5XSxcbiAgWzB4MUJFRCwgMHgxQkVEXSwgWzB4MUJFRiwgMHgxQkYxXSwgWzB4MUMyQywgMHgxQzMzXSxcbiAgWzB4MUMzNiwgMHgxQzM3XSwgWzB4MUNEMCwgMHgxQ0QyXSwgWzB4MUNENCwgMHgxQ0UwXSxcbiAgWzB4MUNFMiwgMHgxQ0U4XSwgWzB4MUNFRCwgMHgxQ0VEXSwgWzB4MUNGNCwgMHgxQ0Y0XSxcbiAgWzB4MUNGOCwgMHgxQ0Y5XSwgWzB4MURDMCwgMHgxREY5XSwgWzB4MURGQiwgMHgxREZGXSxcbiAgWzB4MjAwQiwgMHgyMDBGXSwgWzB4MjAyQSwgMHgyMDJFXSwgWzB4MjA2MCwgMHgyMDY0XSxcbiAgWzB4MjA2NiwgMHgyMDZGXSwgWzB4MjBEMCwgMHgyMEYwXSwgWzB4MkNFRiwgMHgyQ0YxXSxcbiAgWzB4MkQ3RiwgMHgyRDdGXSwgWzB4MkRFMCwgMHgyREZGXSwgWzB4MzAyQSwgMHgzMDJEXSxcbiAgWzB4MzA5OSwgMHgzMDlBXSwgWzB4QTY2RiwgMHhBNjcyXSwgWzB4QTY3NCwgMHhBNjdEXSxcbiAgWzB4QTY5RSwgMHhBNjlGXSwgWzB4QTZGMCwgMHhBNkYxXSwgWzB4QTgwMiwgMHhBODAyXSxcbiAgWzB4QTgwNiwgMHhBODA2XSwgWzB4QTgwQiwgMHhBODBCXSwgWzB4QTgyNSwgMHhBODI2XSxcbiAgWzB4QThDNCwgMHhBOEM1XSwgWzB4QThFMCwgMHhBOEYxXSwgWzB4QThGRiwgMHhBOEZGXSxcbiAgWzB4QTkyNiwgMHhBOTJEXSwgWzB4QTk0NywgMHhBOTUxXSwgWzB4QTk4MCwgMHhBOTgyXSxcbiAgWzB4QTlCMywgMHhBOUIzXSwgWzB4QTlCNiwgMHhBOUI5XSwgWzB4QTlCQywgMHhBOUJEXSxcbiAgWzB4QTlFNSwgMHhBOUU1XSwgWzB4QUEyOSwgMHhBQTJFXSwgWzB4QUEzMSwgMHhBQTMyXSxcbiAgWzB4QUEzNSwgMHhBQTM2XSwgWzB4QUE0MywgMHhBQTQzXSwgWzB4QUE0QywgMHhBQTRDXSxcbiAgWzB4QUE3QywgMHhBQTdDXSwgWzB4QUFCMCwgMHhBQUIwXSwgWzB4QUFCMiwgMHhBQUI0XSxcbiAgWzB4QUFCNywgMHhBQUI4XSwgWzB4QUFCRSwgMHhBQUJGXSwgWzB4QUFDMSwgMHhBQUMxXSxcbiAgWzB4QUFFQywgMHhBQUVEXSwgWzB4QUFGNiwgMHhBQUY2XSwgWzB4QUJFNSwgMHhBQkU1XSxcbiAgWzB4QUJFOCwgMHhBQkU4XSwgWzB4QUJFRCwgMHhBQkVEXSwgWzB4RkIxRSwgMHhGQjFFXSxcbiAgWzB4RkUwMCwgMHhGRTBGXSwgWzB4RkUyMCwgMHhGRTJGXSwgWzB4RkVGRiwgMHhGRUZGXSxcbiAgWzB4RkZGOSwgMHhGRkZCXVxuXTtcbmNvbnN0IEhJR0hfQ09NQklOSU5HID0gW1xuICBbMHgxMDFGRCwgMHgxMDFGRF0sIFsweDEwMkUwLCAweDEwMkUwXSxcbiAgWzB4MTAzNzYsIDB4MTAzN0FdLCBbMHgxMEEwMSwgMHgxMEEwM10sIFsweDEwQTA1LCAweDEwQTA2XSxcbiAgWzB4MTBBMEMsIDB4MTBBMEZdLCBbMHgxMEEzOCwgMHgxMEEzQV0sIFsweDEwQTNGLCAweDEwQTNGXSxcbiAgWzB4MTBBRTUsIDB4MTBBRTZdLCBbMHgxMEQyNCwgMHgxMEQyN10sIFsweDEwRjQ2LCAweDEwRjUwXSxcbiAgWzB4MTEwMDEsIDB4MTEwMDFdLCBbMHgxMTAzOCwgMHgxMTA0Nl0sIFsweDExMDdGLCAweDExMDgxXSxcbiAgWzB4MTEwQjMsIDB4MTEwQjZdLCBbMHgxMTBCOSwgMHgxMTBCQV0sIFsweDExMEJELCAweDExMEJEXSxcbiAgWzB4MTEwQ0QsIDB4MTEwQ0RdLCBbMHgxMTEwMCwgMHgxMTEwMl0sIFsweDExMTI3LCAweDExMTJCXSxcbiAgWzB4MTExMkQsIDB4MTExMzRdLCBbMHgxMTE3MywgMHgxMTE3M10sIFsweDExMTgwLCAweDExMTgxXSxcbiAgWzB4MTExQjYsIDB4MTExQkVdLCBbMHgxMTFDOSwgMHgxMTFDQ10sIFsweDExMjJGLCAweDExMjMxXSxcbiAgWzB4MTEyMzQsIDB4MTEyMzRdLCBbMHgxMTIzNiwgMHgxMTIzN10sIFsweDExMjNFLCAweDExMjNFXSxcbiAgWzB4MTEyREYsIDB4MTEyREZdLCBbMHgxMTJFMywgMHgxMTJFQV0sIFsweDExMzAwLCAweDExMzAxXSxcbiAgWzB4MTEzM0IsIDB4MTEzM0NdLCBbMHgxMTM0MCwgMHgxMTM0MF0sIFsweDExMzY2LCAweDExMzZDXSxcbiAgWzB4MTEzNzAsIDB4MTEzNzRdLCBbMHgxMTQzOCwgMHgxMTQzRl0sIFsweDExNDQyLCAweDExNDQ0XSxcbiAgWzB4MTE0NDYsIDB4MTE0NDZdLCBbMHgxMTQ1RSwgMHgxMTQ1RV0sIFsweDExNEIzLCAweDExNEI4XSxcbiAgWzB4MTE0QkEsIDB4MTE0QkFdLCBbMHgxMTRCRiwgMHgxMTRDMF0sIFsweDExNEMyLCAweDExNEMzXSxcbiAgWzB4MTE1QjIsIDB4MTE1QjVdLCBbMHgxMTVCQywgMHgxMTVCRF0sIFsweDExNUJGLCAweDExNUMwXSxcbiAgWzB4MTE1REMsIDB4MTE1RERdLCBbMHgxMTYzMywgMHgxMTYzQV0sIFsweDExNjNELCAweDExNjNEXSxcbiAgWzB4MTE2M0YsIDB4MTE2NDBdLCBbMHgxMTZBQiwgMHgxMTZBQl0sIFsweDExNkFELCAweDExNkFEXSxcbiAgWzB4MTE2QjAsIDB4MTE2QjVdLCBbMHgxMTZCNywgMHgxMTZCN10sIFsweDExNzFELCAweDExNzFGXSxcbiAgWzB4MTE3MjIsIDB4MTE3MjVdLCBbMHgxMTcyNywgMHgxMTcyQl0sIFsweDExODJGLCAweDExODM3XSxcbiAgWzB4MTE4MzksIDB4MTE4M0FdLCBbMHgxMTlENCwgMHgxMTlEN10sIFsweDExOURBLCAweDExOURCXSxcbiAgWzB4MTE5RTAsIDB4MTE5RTBdLCBbMHgxMUEwMSwgMHgxMUEwQV0sIFsweDExQTMzLCAweDExQTM4XSxcbiAgWzB4MTFBM0IsIDB4MTFBM0VdLCBbMHgxMUE0NywgMHgxMUE0N10sIFsweDExQTUxLCAweDExQTU2XSxcbiAgWzB4MTFBNTksIDB4MTFBNUJdLCBbMHgxMUE4QSwgMHgxMUE5Nl0sIFsweDExQTk4LCAweDExQTk5XSxcbiAgWzB4MTFDMzAsIDB4MTFDMzZdLCBbMHgxMUMzOCwgMHgxMUMzRF0sIFsweDExQzNGLCAweDExQzNGXSxcbiAgWzB4MTFDOTIsIDB4MTFDQTddLCBbMHgxMUNBQSwgMHgxMUNCMF0sIFsweDExQ0IyLCAweDExQ0IzXSxcbiAgWzB4MTFDQjUsIDB4MTFDQjZdLCBbMHgxMUQzMSwgMHgxMUQzNl0sIFsweDExRDNBLCAweDExRDNBXSxcbiAgWzB4MTFEM0MsIDB4MTFEM0RdLCBbMHgxMUQzRiwgMHgxMUQ0NV0sIFsweDExRDQ3LCAweDExRDQ3XSxcbiAgWzB4MTFEOTAsIDB4MTFEOTFdLCBbMHgxMUQ5NSwgMHgxMUQ5NV0sIFsweDExRDk3LCAweDExRDk3XSxcbiAgWzB4MTFFRjMsIDB4MTFFRjRdLCBbMHgxMzQzMCwgMHgxMzQzOF0sIFsweDE2QUYwLCAweDE2QUY0XSxcbiAgWzB4MTZCMzAsIDB4MTZCMzZdLCBbMHgxNkY0RiwgMHgxNkY0Rl0sIFsweDE2RjhGLCAweDE2RjkyXSxcbiAgWzB4MUJDOUQsIDB4MUJDOUVdLCBbMHgxQkNBMCwgMHgxQkNBM10sIFsweDFEMTY3LCAweDFEMTY5XSxcbiAgWzB4MUQxNzMsIDB4MUQxODJdLCBbMHgxRDE4NSwgMHgxRDE4Ql0sIFsweDFEMUFBLCAweDFEMUFEXSxcbiAgWzB4MUQyNDIsIDB4MUQyNDRdLCBbMHgxREEwMCwgMHgxREEzNl0sIFsweDFEQTNCLCAweDFEQTZDXSxcbiAgWzB4MURBNzUsIDB4MURBNzVdLCBbMHgxREE4NCwgMHgxREE4NF0sIFsweDFEQTlCLCAweDFEQTlGXSxcbiAgWzB4MURBQTEsIDB4MURBQUZdLCBbMHgxRTAwMCwgMHgxRTAwNl0sIFsweDFFMDA4LCAweDFFMDE4XSxcbiAgWzB4MUUwMUIsIDB4MUUwMjFdLCBbMHgxRTAyMywgMHgxRTAyNF0sIFsweDFFMDI2LCAweDFFMDJBXSxcbiAgWzB4MUUxMzAsIDB4MUUxMzZdLCBbMHgxRTJFQywgMHgxRTJFRl0sIFsweDFFOEQwLCAweDFFOEQ2XSxcbiAgWzB4MUU5NDQsIDB4MUU5NEFdLCBbMHhFMDAwMSwgMHhFMDAwMV0sIFsweEUwMDIwLCAweEUwMDdGXSxcbiAgWzB4RTAxMDAsIDB4RTAxRUZdXG5dO1xuY29uc3QgQk1QX1dJREUgPSBbXG4gIFsweDExMDAsIDB4MTE1Rl0sIFsweDIzMUEsIDB4MjMxQl0sIFsweDIzMjksIDB4MjMyQV0sXG4gIFsweDIzRTksIDB4MjNFQ10sIFsweDIzRjAsIDB4MjNGMF0sIFsweDIzRjMsIDB4MjNGM10sXG4gIFsweDI1RkQsIDB4MjVGRV0sIFsweDI2MTQsIDB4MjYxNV0sIFsweDI2NDgsIDB4MjY1M10sXG4gIFsweDI2N0YsIDB4MjY3Rl0sIFsweDI2OTMsIDB4MjY5M10sIFsweDI2QTEsIDB4MjZBMV0sXG4gIFsweDI2QUEsIDB4MjZBQl0sIFsweDI2QkQsIDB4MjZCRV0sIFsweDI2QzQsIDB4MjZDNV0sXG4gIFsweDI2Q0UsIDB4MjZDRV0sIFsweDI2RDQsIDB4MjZENF0sIFsweDI2RUEsIDB4MjZFQV0sXG4gIFsweDI2RjIsIDB4MjZGM10sIFsweDI2RjUsIDB4MjZGNV0sIFsweDI2RkEsIDB4MjZGQV0sXG4gIFsweDI2RkQsIDB4MjZGRF0sIFsweDI3MDUsIDB4MjcwNV0sIFsweDI3MEEsIDB4MjcwQl0sXG4gIFsweDI3MjgsIDB4MjcyOF0sIFsweDI3NEMsIDB4Mjc0Q10sIFsweDI3NEUsIDB4Mjc0RV0sXG4gIFsweDI3NTMsIDB4Mjc1NV0sIFsweDI3NTcsIDB4Mjc1N10sIFsweDI3OTUsIDB4Mjc5N10sXG4gIFsweDI3QjAsIDB4MjdCMF0sIFsweDI3QkYsIDB4MjdCRl0sIFsweDJCMUIsIDB4MkIxQ10sXG4gIFsweDJCNTAsIDB4MkI1MF0sIFsweDJCNTUsIDB4MkI1NV0sIFsweDJFODAsIDB4MkU5OV0sXG4gIFsweDJFOUIsIDB4MkVGM10sIFsweDJGMDAsIDB4MkZENV0sIFsweDJGRjAsIDB4MkZGQl0sXG4gIFsweDMwMDAsIDB4MzAyOV0sIFsweDMwMkUsIDB4MzAzRV0sIFsweDMwNDEsIDB4MzA5Nl0sXG4gIFsweDMwOUIsIDB4MzBGRl0sIFsweDMxMDUsIDB4MzEyRl0sIFsweDMxMzEsIDB4MzE4RV0sXG4gIFsweDMxOTAsIDB4MzFCQV0sIFsweDMxQzAsIDB4MzFFM10sIFsweDMxRjAsIDB4MzIxRV0sXG4gIFsweDMyMjAsIDB4MzI0N10sIFsweDMyNTAsIDB4NERCRl0sIFsweDRFMDAsIDB4QTQ4Q10sXG4gIFsweEE0OTAsIDB4QTRDNl0sIFsweEE5NjAsIDB4QTk3Q10sIFsweEFDMDAsIDB4RDdBM10sXG4gIFsweEY5MDAsIDB4RkFGRl0sIFsweEZFMTAsIDB4RkUxOV0sIFsweEZFMzAsIDB4RkU1Ml0sXG4gIFsweEZFNTQsIDB4RkU2Nl0sIFsweEZFNjgsIDB4RkU2Ql0sIFsweEZGMDEsIDB4RkY2MF0sXG4gIFsweEZGRTAsIDB4RkZFNl1cbl07XG5jb25zdCBISUdIX1dJREUgPSBbXG4gIFsweDE2RkUwLCAweDE2RkUzXSwgWzB4MTcwMDAsIDB4MTg3RjddLFxuICBbMHgxODgwMCwgMHgxOEFGMl0sIFsweDFCMDAwLCAweDFCMTFFXSwgWzB4MUIxNTAsIDB4MUIxNTJdLFxuICBbMHgxQjE2NCwgMHgxQjE2N10sIFsweDFCMTcwLCAweDFCMkZCXSwgWzB4MUYwMDQsIDB4MUYwMDRdLFxuICBbMHgxRjBDRiwgMHgxRjBDRl0sIFsweDFGMThFLCAweDFGMThFXSwgWzB4MUYxOTEsIDB4MUYxOUFdLFxuICBbMHgxRjIwMCwgMHgxRjIwMl0sIFsweDFGMjEwLCAweDFGMjNCXSwgWzB4MUYyNDAsIDB4MUYyNDhdLFxuICBbMHgxRjI1MCwgMHgxRjI1MV0sIFsweDFGMjYwLCAweDFGMjY1XSwgWzB4MUYzMDAsIDB4MUYzMjBdLFxuICBbMHgxRjMyRCwgMHgxRjMzNV0sIFsweDFGMzM3LCAweDFGMzdDXSwgWzB4MUYzN0UsIDB4MUYzOTNdLFxuICBbMHgxRjNBMCwgMHgxRjNDQV0sIFsweDFGM0NGLCAweDFGM0QzXSwgWzB4MUYzRTAsIDB4MUYzRjBdLFxuICBbMHgxRjNGNCwgMHgxRjNGNF0sIFsweDFGM0Y4LCAweDFGNDNFXSwgWzB4MUY0NDAsIDB4MUY0NDBdLFxuICBbMHgxRjQ0MiwgMHgxRjRGQ10sIFsweDFGNEZGLCAweDFGNTNEXSwgWzB4MUY1NEIsIDB4MUY1NEVdLFxuICBbMHgxRjU1MCwgMHgxRjU2N10sIFsweDFGNTdBLCAweDFGNTdBXSwgWzB4MUY1OTUsIDB4MUY1OTZdLFxuICBbMHgxRjVBNCwgMHgxRjVBNF0sIFsweDFGNUZCLCAweDFGNjRGXSwgWzB4MUY2ODAsIDB4MUY2QzVdLFxuICBbMHgxRjZDQywgMHgxRjZDQ10sIFsweDFGNkQwLCAweDFGNkQyXSwgWzB4MUY2RDUsIDB4MUY2RDVdLFxuICBbMHgxRjZFQiwgMHgxRjZFQ10sIFsweDFGNkY0LCAweDFGNkZBXSwgWzB4MUY3RTAsIDB4MUY3RUJdLFxuICBbMHgxRjkwRCwgMHgxRjk3MV0sIFsweDFGOTczLCAweDFGOTc2XSwgWzB4MUY5N0EsIDB4MUY5QTJdLFxuICBbMHgxRjlBNSwgMHgxRjlBQV0sIFsweDFGOUFFLCAweDFGOUNBXSwgWzB4MUY5Q0QsIDB4MUY5RkZdLFxuICBbMHgxRkE3MCwgMHgxRkE3M10sIFsweDFGQTc4LCAweDFGQTdBXSwgWzB4MUZBODAsIDB4MUZBODJdLFxuICBbMHgxRkE5MCwgMHgxRkE5NV0sIFsweDIwMDAwLCAweDJGRkZEXSwgWzB4MzAwMDAsIDB4M0ZGRkRdXG5dO1xuXG4vLyBCTVAgbG9va3VwIHRhYmxlLCBsYXp5IGluaXRpYWxpemVkIGR1cmluZyBmaXJzdCBhZGRvbiBsb2FkaW5nXG5sZXQgdGFibGU6IFVpbnQ4QXJyYXk7XG5cbmZ1bmN0aW9uIGJpc2VhcmNoKHVjczogbnVtYmVyLCBkYXRhOiBudW1iZXJbXVtdKTogYm9vbGVhbiB7XG4gIGxldCBtaW4gPSAwO1xuICBsZXQgbWF4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBsZXQgbWlkO1xuICBpZiAodWNzIDwgZGF0YVswXVswXSB8fCB1Y3MgPiBkYXRhW21heF1bMV0pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgd2hpbGUgKG1heCA+PSBtaW4pIHtcbiAgICBtaWQgPSAobWluICsgbWF4KSA+PiAxO1xuICAgIGlmICh1Y3MgPiBkYXRhW21pZF1bMV0pIHtcbiAgICAgIG1pbiA9IG1pZCArIDE7XG4gICAgfSBlbHNlIGlmICh1Y3MgPCBkYXRhW21pZF1bMF0pIHtcbiAgICAgIG1heCA9IG1pZCAtIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cblxuZXhwb3J0IGNsYXNzIFVuaWNvZGVWMTEgaW1wbGVtZW50cyBJVW5pY29kZVZlcnNpb25Qcm92aWRlciB7XG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uID0gJzExJztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICB0YWJsZSA9IG5ldyBVaW50OEFycmF5KDY1NTM2KTtcbiAgICAgIHRhYmxlLmZpbGwoMSk7XG4gICAgICB0YWJsZVswXSA9IDA7XG4gICAgICB0YWJsZS5maWxsKDAsIDEsIDMyKTtcbiAgICAgIHRhYmxlLmZpbGwoMCwgMHg3ZiwgMHhhMCk7XG4gICAgICBmb3IgKGxldCByID0gMDsgciA8IEJNUF9DT01CSU5JTkcubGVuZ3RoOyArK3IpIHtcbiAgICAgICAgdGFibGUuZmlsbCgwLCBCTVBfQ09NQklOSU5HW3JdWzBdLCBCTVBfQ09NQklOSU5HW3JdWzFdICsgMSk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCByID0gMDsgciA8IEJNUF9XSURFLmxlbmd0aDsgKytyKSB7XG4gICAgICAgIHRhYmxlLmZpbGwoMiwgQk1QX1dJREVbcl1bMF0sIEJNUF9XSURFW3JdWzFdICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdjd2lkdGgobnVtOiBudW1iZXIpOiBVbmljb2RlQ2hhcldpZHRoIHtcbiAgICBpZiAobnVtIDwgMzIpIHJldHVybiAwO1xuICAgIGlmIChudW0gPCAxMjcpIHJldHVybiAxO1xuICAgIGlmIChudW0gPCA2NTUzNikgcmV0dXJuIHRhYmxlW251bV0gYXMgVW5pY29kZUNoYXJXaWR0aDtcbiAgICBpZiAoYmlzZWFyY2gobnVtLCBISUdIX0NPTUJJTklORykpIHJldHVybiAwO1xuICAgIGlmIChiaXNlYXJjaChudW0sIEhJR0hfV0lERSkpIHJldHVybiAyO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcHVibGljIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcyB7XG4gICAgbGV0IHdpZHRoID0gdGhpcy53Y3dpZHRoKGNvZGVwb2ludCk7XG4gICAgbGV0IHNob3VsZEpvaW4gPSB3aWR0aCA9PT0gMCAmJiBwcmVjZWRpbmcgIT09IDA7XG4gICAgaWYgKHNob3VsZEpvaW4pIHtcbiAgICAgIGNvbnN0IG9sZFdpZHRoID0gVW5pY29kZVNlcnZpY2UuZXh0cmFjdFdpZHRoKHByZWNlZGluZyk7XG4gICAgICBpZiAob2xkV2lkdGggPT09IDApIHtcbiAgICAgICAgc2hvdWxkSm9pbiA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChvbGRXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgIHdpZHRoID0gb2xkV2lkdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBVbmljb2RlU2VydmljZS5jcmVhdGVQcm9wZXJ0eVZhbHVlKDAsIHdpZHRoLCBzaG91bGRKb2luKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5pbnRlcmZhY2UgSUxpc3RlbmVyPFQsIFUgPSB2b2lkPiB7XG4gIChhcmcxOiBULCBhcmcyOiBVKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXZlbnQ8VCwgVSA9IHZvaWQ+IHtcbiAgKGxpc3RlbmVyOiAoYXJnMTogVCwgYXJnMjogVSkgPT4gYW55KTogSURpc3Bvc2FibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50RW1pdHRlcjxULCBVID0gdm9pZD4ge1xuICBldmVudDogSUV2ZW50PFQsIFU+O1xuICBmaXJlKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkO1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXI8VCwgVSA9IHZvaWQ+IGltcGxlbWVudHMgSUV2ZW50RW1pdHRlcjxULCBVPiB7XG4gIHByaXZhdGUgX2xpc3RlbmVyczogSUxpc3RlbmVyPFQsIFU+W10gPSBbXTtcbiAgcHJpdmF0ZSBfZXZlbnQ/OiBJRXZlbnQ8VCwgVT47XG4gIHByaXZhdGUgX2Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIGdldCBldmVudCgpOiBJRXZlbnQ8VCwgVT4ge1xuICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyOiAoYXJnMTogVCwgYXJnMjogVSkgPT4gYW55KSA9PiB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgY29uc3QgZGlzcG9zYWJsZSA9IHtcbiAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1tpXSA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGlzcG9zYWJsZTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBmaXJlKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkIHtcbiAgICBjb25zdCBxdWV1ZTogSUxpc3RlbmVyPFQsIFU+W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVldWUucHVzaCh0aGlzLl9saXN0ZW5lcnNbaV0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZVtpXS5jYWxsKHVuZGVmaW5lZCwgYXJnMSwgYXJnMik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckxpc3RlbmVycygpO1xuICAgIHRoaXMuX2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckxpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoID0gMDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmRFdmVudDxUPihmcm9tOiBJRXZlbnQ8VD4sIHRvOiBJRXZlbnRFbWl0dGVyPFQ+KTogSURpc3Bvc2FibGUge1xuICByZXR1cm4gZnJvbShlID0+IHRvLmZpcmUoZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuQW5kU3Vic2NyaWJlPFQ+KGV2ZW50OiBJRXZlbnQ8VD4sIGhhbmRsZXI6IChlOiBUIHwgdW5kZWZpbmVkKSA9PiBhbnkpOiBJRGlzcG9zYWJsZSB7XG4gIGhhbmRsZXIodW5kZWZpbmVkKTtcbiAgcmV0dXJuIGV2ZW50KGUgPT4gaGFuZGxlcihlKSk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuaW1wb3J0IHsgSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIsIFVuaWNvZGVDaGFyUHJvcGVydGllcywgVW5pY29kZUNoYXJXaWR0aCB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBVbmljb2RlU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Vbmljb2RlU2VydmljZSc7XG5cbmNvbnN0IEJNUF9DT01CSU5JTkcgPSBbXG4gIFsweDAzMDAsIDB4MDM2Rl0sIFsweDA0ODMsIDB4MDQ4Nl0sIFsweDA0ODgsIDB4MDQ4OV0sXG4gIFsweDA1OTEsIDB4MDVCRF0sIFsweDA1QkYsIDB4MDVCRl0sIFsweDA1QzEsIDB4MDVDMl0sXG4gIFsweDA1QzQsIDB4MDVDNV0sIFsweDA1QzcsIDB4MDVDN10sIFsweDA2MDAsIDB4MDYwM10sXG4gIFsweDA2MTAsIDB4MDYxNV0sIFsweDA2NEIsIDB4MDY1RV0sIFsweDA2NzAsIDB4MDY3MF0sXG4gIFsweDA2RDYsIDB4MDZFNF0sIFsweDA2RTcsIDB4MDZFOF0sIFsweDA2RUEsIDB4MDZFRF0sXG4gIFsweDA3MEYsIDB4MDcwRl0sIFsweDA3MTEsIDB4MDcxMV0sIFsweDA3MzAsIDB4MDc0QV0sXG4gIFsweDA3QTYsIDB4MDdCMF0sIFsweDA3RUIsIDB4MDdGM10sIFsweDA5MDEsIDB4MDkwMl0sXG4gIFsweDA5M0MsIDB4MDkzQ10sIFsweDA5NDEsIDB4MDk0OF0sIFsweDA5NEQsIDB4MDk0RF0sXG4gIFsweDA5NTEsIDB4MDk1NF0sIFsweDA5NjIsIDB4MDk2M10sIFsweDA5ODEsIDB4MDk4MV0sXG4gIFsweDA5QkMsIDB4MDlCQ10sIFsweDA5QzEsIDB4MDlDNF0sIFsweDA5Q0QsIDB4MDlDRF0sXG4gIFsweDA5RTIsIDB4MDlFM10sIFsweDBBMDEsIDB4MEEwMl0sIFsweDBBM0MsIDB4MEEzQ10sXG4gIFsweDBBNDEsIDB4MEE0Ml0sIFsweDBBNDcsIDB4MEE0OF0sIFsweDBBNEIsIDB4MEE0RF0sXG4gIFsweDBBNzAsIDB4MEE3MV0sIFsweDBBODEsIDB4MEE4Ml0sIFsweDBBQkMsIDB4MEFCQ10sXG4gIFsweDBBQzEsIDB4MEFDNV0sIFsweDBBQzcsIDB4MEFDOF0sIFsweDBBQ0QsIDB4MEFDRF0sXG4gIFsweDBBRTIsIDB4MEFFM10sIFsweDBCMDEsIDB4MEIwMV0sIFsweDBCM0MsIDB4MEIzQ10sXG4gIFsweDBCM0YsIDB4MEIzRl0sIFsweDBCNDEsIDB4MEI0M10sIFsweDBCNEQsIDB4MEI0RF0sXG4gIFsweDBCNTYsIDB4MEI1Nl0sIFsweDBCODIsIDB4MEI4Ml0sIFsweDBCQzAsIDB4MEJDMF0sXG4gIFsweDBCQ0QsIDB4MEJDRF0sIFsweDBDM0UsIDB4MEM0MF0sIFsweDBDNDYsIDB4MEM0OF0sXG4gIFsweDBDNEEsIDB4MEM0RF0sIFsweDBDNTUsIDB4MEM1Nl0sIFsweDBDQkMsIDB4MENCQ10sXG4gIFsweDBDQkYsIDB4MENCRl0sIFsweDBDQzYsIDB4MENDNl0sIFsweDBDQ0MsIDB4MENDRF0sXG4gIFsweDBDRTIsIDB4MENFM10sIFsweDBENDEsIDB4MEQ0M10sIFsweDBENEQsIDB4MEQ0RF0sXG4gIFsweDBEQ0EsIDB4MERDQV0sIFsweDBERDIsIDB4MERENF0sIFsweDBERDYsIDB4MERENl0sXG4gIFsweDBFMzEsIDB4MEUzMV0sIFsweDBFMzQsIDB4MEUzQV0sIFsweDBFNDcsIDB4MEU0RV0sXG4gIFsweDBFQjEsIDB4MEVCMV0sIFsweDBFQjQsIDB4MEVCOV0sIFsweDBFQkIsIDB4MEVCQ10sXG4gIFsweDBFQzgsIDB4MEVDRF0sIFsweDBGMTgsIDB4MEYxOV0sIFsweDBGMzUsIDB4MEYzNV0sXG4gIFsweDBGMzcsIDB4MEYzN10sIFsweDBGMzksIDB4MEYzOV0sIFsweDBGNzEsIDB4MEY3RV0sXG4gIFsweDBGODAsIDB4MEY4NF0sIFsweDBGODYsIDB4MEY4N10sIFsweDBGOTAsIDB4MEY5N10sXG4gIFsweDBGOTksIDB4MEZCQ10sIFsweDBGQzYsIDB4MEZDNl0sIFsweDEwMkQsIDB4MTAzMF0sXG4gIFsweDEwMzIsIDB4MTAzMl0sIFsweDEwMzYsIDB4MTAzN10sIFsweDEwMzksIDB4MTAzOV0sXG4gIFsweDEwNTgsIDB4MTA1OV0sIFsweDExNjAsIDB4MTFGRl0sIFsweDEzNUYsIDB4MTM1Rl0sXG4gIFsweDE3MTIsIDB4MTcxNF0sIFsweDE3MzIsIDB4MTczNF0sIFsweDE3NTIsIDB4MTc1M10sXG4gIFsweDE3NzIsIDB4MTc3M10sIFsweDE3QjQsIDB4MTdCNV0sIFsweDE3QjcsIDB4MTdCRF0sXG4gIFsweDE3QzYsIDB4MTdDNl0sIFsweDE3QzksIDB4MTdEM10sIFsweDE3REQsIDB4MTdERF0sXG4gIFsweDE4MEIsIDB4MTgwRF0sIFsweDE4QTksIDB4MThBOV0sIFsweDE5MjAsIDB4MTkyMl0sXG4gIFsweDE5MjcsIDB4MTkyOF0sIFsweDE5MzIsIDB4MTkzMl0sIFsweDE5MzksIDB4MTkzQl0sXG4gIFsweDFBMTcsIDB4MUExOF0sIFsweDFCMDAsIDB4MUIwM10sIFsweDFCMzQsIDB4MUIzNF0sXG4gIFsweDFCMzYsIDB4MUIzQV0sIFsweDFCM0MsIDB4MUIzQ10sIFsweDFCNDIsIDB4MUI0Ml0sXG4gIFsweDFCNkIsIDB4MUI3M10sIFsweDFEQzAsIDB4MURDQV0sIFsweDFERkUsIDB4MURGRl0sXG4gIFsweDIwMEIsIDB4MjAwRl0sIFsweDIwMkEsIDB4MjAyRV0sIFsweDIwNjAsIDB4MjA2M10sXG4gIFsweDIwNkEsIDB4MjA2Rl0sIFsweDIwRDAsIDB4MjBFRl0sIFsweDMwMkEsIDB4MzAyRl0sXG4gIFsweDMwOTksIDB4MzA5QV0sIFsweEE4MDYsIDB4QTgwNl0sIFsweEE4MEIsIDB4QTgwQl0sXG4gIFsweEE4MjUsIDB4QTgyNl0sIFsweEZCMUUsIDB4RkIxRV0sIFsweEZFMDAsIDB4RkUwRl0sXG4gIFsweEZFMjAsIDB4RkUyM10sIFsweEZFRkYsIDB4RkVGRl0sIFsweEZGRjksIDB4RkZGQl1cbl07XG5jb25zdCBISUdIX0NPTUJJTklORyA9IFtcbiAgWzB4MTBBMDEsIDB4MTBBMDNdLCBbMHgxMEEwNSwgMHgxMEEwNl0sIFsweDEwQTBDLCAweDEwQTBGXSxcbiAgWzB4MTBBMzgsIDB4MTBBM0FdLCBbMHgxMEEzRiwgMHgxMEEzRl0sIFsweDFEMTY3LCAweDFEMTY5XSxcbiAgWzB4MUQxNzMsIDB4MUQxODJdLCBbMHgxRDE4NSwgMHgxRDE4Ql0sIFsweDFEMUFBLCAweDFEMUFEXSxcbiAgWzB4MUQyNDIsIDB4MUQyNDRdLCBbMHhFMDAwMSwgMHhFMDAwMV0sIFsweEUwMDIwLCAweEUwMDdGXSxcbiAgWzB4RTAxMDAsIDB4RTAxRUZdXG5dO1xuXG4vLyBCTVAgbG9va3VwIHRhYmxlLCBsYXp5IGluaXRpYWxpemVkIGR1cmluZyBmaXJzdCBhZGRvbiBsb2FkaW5nXG5sZXQgdGFibGU6IFVpbnQ4QXJyYXk7XG5cbmZ1bmN0aW9uIGJpc2VhcmNoKHVjczogbnVtYmVyLCBkYXRhOiBudW1iZXJbXVtdKTogYm9vbGVhbiB7XG4gIGxldCBtaW4gPSAwO1xuICBsZXQgbWF4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBsZXQgbWlkO1xuICBpZiAodWNzIDwgZGF0YVswXVswXSB8fCB1Y3MgPiBkYXRhW21heF1bMV0pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgd2hpbGUgKG1heCA+PSBtaW4pIHtcbiAgICBtaWQgPSAobWluICsgbWF4KSA+PiAxO1xuICAgIGlmICh1Y3MgPiBkYXRhW21pZF1bMV0pIHtcbiAgICAgIG1pbiA9IG1pZCArIDE7XG4gICAgfSBlbHNlIGlmICh1Y3MgPCBkYXRhW21pZF1bMF0pIHtcbiAgICAgIG1heCA9IG1pZCAtIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBVbmljb2RlVjYgaW1wbGVtZW50cyBJVW5pY29kZVZlcnNpb25Qcm92aWRlciB7XG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uID0gJzYnO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIGluaXQgbG9va3VwIHRhYmxlIG9uY2VcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICB0YWJsZSA9IG5ldyBVaW50OEFycmF5KDY1NTM2KTtcbiAgICAgIHRhYmxlLmZpbGwoMSk7XG4gICAgICB0YWJsZVswXSA9IDA7XG4gICAgICAvLyBjb250cm9sIGNoYXJzXG4gICAgICB0YWJsZS5maWxsKDAsIDEsIDMyKTtcbiAgICAgIHRhYmxlLmZpbGwoMCwgMHg3ZiwgMHhhMCk7XG5cbiAgICAgIC8vIGFwcGx5IHdpZGUgY2hhciBydWxlcyBmaXJzdFxuICAgICAgLy8gd2lkZSBjaGFyc1xuICAgICAgdGFibGUuZmlsbCgyLCAweDExMDAsIDB4MTE2MCk7XG4gICAgICB0YWJsZVsweDIzMjldID0gMjtcbiAgICAgIHRhYmxlWzB4MjMyYV0gPSAyO1xuICAgICAgdGFibGUuZmlsbCgyLCAweDJlODAsIDB4YTRkMCk7XG4gICAgICB0YWJsZVsweDMwM2ZdID0gMTsgIC8vIHdyb25nbHkgaW4gbGFzdCBsaW5lXG5cbiAgICAgIHRhYmxlLmZpbGwoMiwgMHhhYzAwLCAweGQ3YTQpO1xuICAgICAgdGFibGUuZmlsbCgyLCAweGY5MDAsIDB4ZmIwMCk7XG4gICAgICB0YWJsZS5maWxsKDIsIDB4ZmUxMCwgMHhmZTFhKTtcbiAgICAgIHRhYmxlLmZpbGwoMiwgMHhmZTMwLCAweGZlNzApO1xuICAgICAgdGFibGUuZmlsbCgyLCAweGZmMDAsIDB4ZmY2MSk7XG4gICAgICB0YWJsZS5maWxsKDIsIDB4ZmZlMCwgMHhmZmU3KTtcblxuICAgICAgLy8gYXBwbHkgY29tYmluaW5nIGxhc3QgdG8gZW5zdXJlIHdlIG92ZXJ3cml0ZVxuICAgICAgLy8gd3JvbmdseSB3aWRlIHNldCBjaGFyczpcbiAgICAgIC8vICAgIHRoZSBvcmlnaW5hbCBhbGdvIGV2YWxzIGNvbWJpbmluZyBmaXJzdCBhbmQgZmFsbHNcbiAgICAgIC8vICAgIHRocm91Z2ggdG8gd2lkZSBjaGVjayBzbyB3ZSBzaW1wbHkgZG8gaGVyZSB0aGUgb3Bwb3NpdGVcbiAgICAgIC8vIGNvbWJpbmluZyAwXG4gICAgICBmb3IgKGxldCByID0gMDsgciA8IEJNUF9DT01CSU5JTkcubGVuZ3RoOyArK3IpIHtcbiAgICAgICAgdGFibGUuZmlsbCgwLCBCTVBfQ09NQklOSU5HW3JdWzBdLCBCTVBfQ09NQklOSU5HW3JdWzFdICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdjd2lkdGgobnVtOiBudW1iZXIpOiBVbmljb2RlQ2hhcldpZHRoIHtcbiAgICBpZiAobnVtIDwgMzIpIHJldHVybiAwO1xuICAgIGlmIChudW0gPCAxMjcpIHJldHVybiAxO1xuICAgIGlmIChudW0gPCA2NTUzNikgcmV0dXJuIHRhYmxlW251bV0gYXMgVW5pY29kZUNoYXJXaWR0aDtcbiAgICBpZiAoYmlzZWFyY2gobnVtLCBISUdIX0NPTUJJTklORykpIHJldHVybiAwO1xuICAgIGlmICgobnVtID49IDB4MjAwMDAgJiYgbnVtIDw9IDB4MmZmZmQpIHx8IChudW0gPj0gMHgzMDAwMCAmJiBudW0gPD0gMHgzZmZmZCkpIHJldHVybiAyO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcHVibGljIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcyB7XG4gICAgbGV0IHdpZHRoID0gdGhpcy53Y3dpZHRoKGNvZGVwb2ludCk7XG4gICAgbGV0IHNob3VsZEpvaW4gPSB3aWR0aCA9PT0gMCAmJiBwcmVjZWRpbmcgIT09IDA7XG4gICAgaWYgKHNob3VsZEpvaW4pIHtcbiAgICAgIGNvbnN0IG9sZFdpZHRoID0gVW5pY29kZVNlcnZpY2UuZXh0cmFjdFdpZHRoKHByZWNlZGluZyk7XG4gICAgICBpZiAob2xkV2lkdGggPT09IDApIHtcbiAgICAgICAgc2hvdWxkSm9pbiA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChvbGRXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgIHdpZHRoID0gb2xkV2lkdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBVbmljb2RlU2VydmljZS5jcmVhdGVQcm9wZXJ0eVZhbHVlKDAsIHdpZHRoLCBzaG91bGRKb2luKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBVbmljb2RlVjYgfSBmcm9tICdjb21tb24vaW5wdXQvVW5pY29kZVY2JztcbmltcG9ydCB7IElVbmljb2RlU2VydmljZSwgSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIsIFVuaWNvZGVDaGFyUHJvcGVydGllcywgVW5pY29kZUNoYXJXaWR0aCB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmV4cG9ydCBjbGFzcyBVbmljb2RlU2VydmljZSBpbXBsZW1lbnRzIElVbmljb2RlU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IGFueTtcblxuICBwcml2YXRlIF9wcm92aWRlcnM6IHtba2V5OiBzdHJpbmddOiBJVW5pY29kZVZlcnNpb25Qcm92aWRlcn0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwcml2YXRlIF9hY3RpdmU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9hY3RpdmVQcm92aWRlcjogSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhbmdlID0gdGhpcy5fb25DaGFuZ2UuZXZlbnQ7XG5cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0U2hvdWxkSm9pbih2YWx1ZTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh2YWx1ZSAmIDEpICE9PSAwO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdFdpZHRoKHZhbHVlOiBVbmljb2RlQ2hhclByb3BlcnRpZXMpOiBVbmljb2RlQ2hhcldpZHRoIHtcbiAgICByZXR1cm4gKCh2YWx1ZSA+PiAxKSAmIDB4MykgYXMgVW5pY29kZUNoYXJXaWR0aDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGV4dHJhY3RDaGFyS2luZCh2YWx1ZTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdmFsdWUgPj4gMztcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVByb3BlcnR5VmFsdWUoc3RhdGU6IG51bWJlciwgd2lkdGg6IG51bWJlciwgc2hvdWxkSm9pbjogYm9vbGVhbiA9IGZhbHNlKTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzIHtcbiAgICByZXR1cm4gKChzdGF0ZSAmIDB4ZmZmZmZmKSA8PCAzKSB8ICgod2lkdGggJiAzKSA8PCAxKSB8IChzaG91bGRKb2luPzE6MCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBkZWZhdWx0UHJvdmlkZXIgPSBuZXcgVW5pY29kZVY2KCk7XG4gICAgdGhpcy5yZWdpc3RlcihkZWZhdWx0UHJvdmlkZXIpO1xuICAgIHRoaXMuX2FjdGl2ZSA9IGRlZmF1bHRQcm92aWRlci52ZXJzaW9uO1xuICAgIHRoaXMuX2FjdGl2ZVByb3ZpZGVyID0gZGVmYXVsdFByb3ZpZGVyO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2UuZGlzcG9zZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCB2ZXJzaW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3Byb3ZpZGVycyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmVWZXJzaW9uKHZlcnNpb246IHN0cmluZykge1xuICAgIGlmICghdGhpcy5fcHJvdmlkZXJzW3ZlcnNpb25dKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gVW5pY29kZSB2ZXJzaW9uIFwiJHt2ZXJzaW9ufVwiYCk7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZSA9IHZlcnNpb247XG4gICAgdGhpcy5fYWN0aXZlUHJvdmlkZXIgPSB0aGlzLl9wcm92aWRlcnNbdmVyc2lvbl07XG4gICAgdGhpcy5fb25DaGFuZ2UuZmlyZSh2ZXJzaW9uKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlcihwcm92aWRlcjogSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9wcm92aWRlcnNbcHJvdmlkZXIudmVyc2lvbl0gPSBwcm92aWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmljb2RlIHZlcnNpb24gZGVwZW5kZW50IGludGVyZmFjZS5cbiAgICovXG4gIHB1YmxpYyB3Y3dpZHRoKG51bTogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aCB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVByb3ZpZGVyLndjd2lkdGgobnVtKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHJpbmdDZWxsV2lkdGgoczogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBsZXQgcHJlY2VkaW5nSW5mbyA9IDA7XG4gICAgY29uc3QgbGVuZ3RoID0gcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgbGV0IGNvZGUgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAvLyBzdXJyb2dhdGUgcGFpciBmaXJzdFxuICAgICAgaWYgKDB4RDgwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICAgIGlmICgrK2kgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiB3aXRoIHN0cmluZ3MgcmV0cmlldmVkIGZyb21cbiAgICAgICAgICAvLyBCdWZmZXIudHJhbnNsYXRlVG9TdHJpbmcgYXMgaXQgY29udmVydHMgZnJvbSBVVEYtMzJcbiAgICAgICAgICAvLyBhbmQgdGhlcmVmb3JlIGFsd2F5cyBzaG91bGQgY29udGFpbiB0aGUgc2Vjb25kIHBhcnRcbiAgICAgICAgICAvLyBmb3IgYW55IG90aGVyIHN0cmluZyB3ZSBzdGlsbCBoYXZlIHRvIGhhbmRsZSBpdCBzb21laG93OlxuICAgICAgICAgIC8vIHNpbXBseSB0cmVhdCB0aGUgbG9uZWx5IHN1cnJvZ2F0ZSBmaXJzdCBhcyBhIHNpbmdsZSBjaGFyIChVQ1MtMiBiZWhhdmlvcilcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgdGhpcy53Y3dpZHRoKGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlY29uZCA9IHMuY2hhckNvZGVBdChpKTtcbiAgICAgICAgLy8gY29udmVydCBzdXJyb2dhdGUgcGFpciB0byBoaWdoIGNvZGVwb2ludCBvbmx5IGZvciB2YWxpZCBzZWNvbmQgcGFydCAoVVRGLTE2KVxuICAgICAgICAvLyBvdGhlcndpc2UgdHJlYXQgdGhlbSBpbmRlcGVuZGVudGx5IChVQ1MtMiBiZWhhdmlvcilcbiAgICAgICAgaWYgKDB4REMwMCA8PSBzZWNvbmQgJiYgc2Vjb25kIDw9IDB4REZGRikge1xuICAgICAgICAgIGNvZGUgPSAoY29kZSAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ICs9IHRoaXMud2N3aWR0aChzZWNvbmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50SW5mbyA9IHRoaXMuY2hhclByb3BlcnRpZXMoY29kZSwgcHJlY2VkaW5nSW5mbyk7XG4gICAgICBsZXQgY2hXaWR0aCA9IFVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RXaWR0aChjdXJyZW50SW5mbyk7XG4gICAgICBpZiAoVW5pY29kZVNlcnZpY2UuZXh0cmFjdFNob3VsZEpvaW4oY3VycmVudEluZm8pKSB7XG4gICAgICAgIGNoV2lkdGggLT0gVW5pY29kZVNlcnZpY2UuZXh0cmFjdFdpZHRoKHByZWNlZGluZ0luZm8pO1xuICAgICAgfVxuICAgICAgcmVzdWx0ICs9IGNoV2lkdGg7XG4gICAgICBwcmVjZWRpbmdJbmZvID0gY3VycmVudEluZm87XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgY2hhclByb3BlcnRpZXMoY29kZXBvaW50OiBudW1iZXIsIHByZWNlZGluZzogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlUHJvdmlkZXIuY2hhclByb3BlcnRpZXMoY29kZXBvaW50LCBwcmVjZWRpbmcpO1xuICB9XG59XG4iLCAiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIFVuaWNvZGVWZXJzaW9uUHJvdmlkZXIgZm9yIFYxMS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlcm1pbmFsLCBJVGVybWluYWxBZGRvbiB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgdHlwZSB7IFVuaWNvZGUxMUFkZG9uIGFzIElVbmljb2RlMTFBcGkgfSBmcm9tICdAeHRlcm0vYWRkb24tdW5pY29kZTExJztcbmltcG9ydCB7IFVuaWNvZGVWMTEgfSBmcm9tICcuL1VuaWNvZGVWMTEnO1xuXG5leHBvcnQgY2xhc3MgVW5pY29kZTExQWRkb24gaW1wbGVtZW50cyBJVGVybWluYWxBZGRvbiAsIElVbmljb2RlMTFBcGkge1xuICBwdWJsaWMgYWN0aXZhdGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgdGVybWluYWwudW5pY29kZS5yZWdpc3RlcihuZXcgVW5pY29kZVYxMSgpKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHsgfVxufVxuIiwgIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIldlYmdsQWRkb25cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiV2ViZ2xBZGRvblwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+IHtcbnJldHVybiAiLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBhbGxvd1Jlc2NhbGluZywgdGhyb3dJZkZhbHN5IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5pbXBvcnQgeyBUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UZXh0dXJlQXRsYXMnO1xuaW1wb3J0IHsgSVJhc3Rlcml6ZWRHbHlwaCwgSVJlbmRlckRpbWVuc2lvbnMsIElUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBOVUxMX0NFTExfQ09ERSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgSVJlbmRlck1vZGVsLCBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dCwgSVdlYkdMVmVydGV4QXJyYXlPYmplY3QgfSBmcm9tICcuL1R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVByb2dyYW0sIEdMVGV4dHVyZSwgUFJPSkVDVElPTl9NQVRSSVggfSBmcm9tICcuL1dlYmdsVXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5pbnRlcmZhY2UgSVZlcnRpY2VzIHtcbiAgYXR0cmlidXRlczogRmxvYXQzMkFycmF5O1xuICAvKipcbiAgICogVGhlc2UgYnVmZmVycyBhcmUgdGhlIG9uZXMgdXNlZCB0byBiaW5kIHRvIFdlYkdMLCB0aGUgcmVhc29uIHRoZXJlIGFyZVxuICAgKiBtdWx0aXBsZSBpcyB0byBhbGxvdyBkb3VibGUgYnVmZmVyaW5nIHRvIHdvcmsgYXMgeW91IGNhbm5vdCBtb2RpZnkgdGhlXG4gICAqIGJ1ZmZlciB3aGlsZSBpdCdzIGJlaW5nIHVzZWQgYnkgdGhlIEdQVS4gSGF2aW5nIG11bHRpcGxlIGxldHMgdXMgc3RhcnRcbiAgICogd29ya2luZyBvbiB0aGUgbmV4dCBmcmFtZS5cbiAgICovXG4gIGF0dHJpYnV0ZXNCdWZmZXJzOiBGbG9hdDMyQXJyYXlbXTtcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuY29uc3QgZW51bSBWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMge1xuICBVTklUX1FVQUQgPSAwLFxuICBDRUxMX1BPU0lUSU9OID0gMSxcbiAgT0ZGU0VUID0gMixcbiAgU0laRSA9IDMsXG4gIFRFWFBBR0UgPSA0LFxuICBURVhDT09SRCA9IDUsXG4gIFRFWFNJWkUgPSA2XG59XG5cbmNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGAjdmVyc2lvbiAzMDAgZXNcbmxheW91dCAobG9jYXRpb24gPSAke1ZlcnRleEF0dHJpYkxvY2F0aW9ucy5VTklUX1FVQUR9KSBpbiB2ZWMyIGFfdW5pdHF1YWQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ0VMTF9QT1NJVElPTn0pIGluIHZlYzIgYV9jZWxscG9zO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLk9GRlNFVH0pIGluIHZlYzIgYV9vZmZzZXQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuU0laRX0pIGluIHZlYzIgYV9zaXplO1xubGF5b3V0IChsb2NhdGlvbiA9ICR7VmVydGV4QXR0cmliTG9jYXRpb25zLlRFWFBBR0V9KSBpbiBmbG9hdCBhX3RleHBhZ2U7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYQ09PUkR9KSBpbiB2ZWMyIGFfdGV4Y29vcmQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYU0laRX0pIGluIHZlYzIgYV90ZXhzaXplO1xuXG51bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xudW5pZm9ybSB2ZWMyIHVfcmVzb2x1dGlvbjtcblxub3V0IHZlYzIgdl90ZXhjb29yZDtcbmZsYXQgb3V0IGludCB2X3RleHBhZ2U7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiB6ZXJvVG9PbmUgPSAoYV9vZmZzZXQgLyB1X3Jlc29sdXRpb24pICsgYV9jZWxscG9zICsgKGFfdW5pdHF1YWQgKiBhX3NpemUpO1xuICBnbF9Qb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHZlYzQoemVyb1RvT25lLCAwLjAsIDEuMCk7XG4gIHZfdGV4cGFnZSA9IGludChhX3RleHBhZ2UpO1xuICB2X3RleGNvb3JkID0gYV90ZXhjb29yZCArIGFfdW5pdHF1YWQgKiBhX3RleHNpemU7XG59YDtcblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRTaGFkZXJTb3VyY2UobWF4RnJhZ21lbnRTaGFkZXJUZXh0dXJlVW5pdHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGxldCB0ZXh0dXJlQ29uZGl0aW9uYWxzID0gJyc7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbWF4RnJhZ21lbnRTaGFkZXJUZXh0dXJlVW5pdHM7IGkrKykge1xuICAgIHRleHR1cmVDb25kaXRpb25hbHMgKz0gYCBlbHNlIGlmICh2X3RleHBhZ2UgPT0gJHtpfSkgeyBvdXRDb2xvciA9IHRleHR1cmUodV90ZXh0dXJlWyR7aX1dLCB2X3RleGNvb3JkKTsgfWA7XG4gIH1cbiAgcmV0dXJuIChgI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbG93cCBmbG9hdDtcblxuaW4gdmVjMiB2X3RleGNvb3JkO1xuZmxhdCBpbiBpbnQgdl90ZXhwYWdlO1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmVbJHttYXhGcmFnbWVudFNoYWRlclRleHR1cmVVbml0c31dO1xuXG5vdXQgdmVjNCBvdXRDb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBpZiAodl90ZXhwYWdlID09IDApIHtcbiAgICBvdXRDb2xvciA9IHRleHR1cmUodV90ZXh0dXJlWzBdLCB2X3RleGNvb3JkKTtcbiAgfSAke3RleHR1cmVDb25kaXRpb25hbHN9XG59YCk7XG59XG5cbmNvbnN0IElORElDRVNfUEVSX0NFTEwgPSAxMTtcbmNvbnN0IEJZVEVTX1BFUl9DRUxMID0gSU5ESUNFU19QRVJfQ0VMTCAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbmNvbnN0IENFTExfUE9TSVRJT05fSU5ESUNFUyA9IDI7XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRpID0gMDtcbmxldCAkZ2x5cGg6IElSYXN0ZXJpemVkR2x5cGggfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5sZXQgJGxlZnRDZWxsUGFkZGluZyA9IDA7XG5sZXQgJGNsaXBwZWRQaXhlbHMgPSAwO1xuXG5leHBvcnQgY2xhc3MgR2x5cGhSZW5kZXJlciBleHRlbmRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZlcnRleEFycmF5T2JqZWN0OiBJV2ViR0xWZXJ0ZXhBcnJheU9iamVjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvamVjdGlvbkxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzb2x1dGlvbkxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGV4dHVyZUxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYXRsYXNUZXh0dXJlczogR0xUZXh0dXJlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX2F0dHJpYnV0ZXNCdWZmZXI6IFdlYkdMQnVmZmVyO1xuXG4gIHByaXZhdGUgX2F0bGFzOiBJVGV4dHVyZUF0bGFzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hY3RpdmVCdWZmZXI6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZlcnRpY2VzOiBJVmVydGljZXMgPSB7XG4gICAgY291bnQ6IDAsXG4gICAgYXR0cmlidXRlczogbmV3IEZsb2F0MzJBcnJheSgwKSxcbiAgICBhdHRyaWJ1dGVzQnVmZmVyczogW1xuICAgICAgbmV3IEZsb2F0MzJBcnJheSgwKSxcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoMClcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2dsOiBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dCxcbiAgICBwcml2YXRlIF9kaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCBnbCA9IHRoaXMuX2dsO1xuXG4gICAgaWYgKFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFR5cGljYWxseSA4IG9yIDE2XG4gICAgICBUZXh0dXJlQXRsYXMubWF4QXRsYXNQYWdlcyA9IE1hdGgubWluKDMyLCB0aHJvd0lmRmFsc3koZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKSBhcyBudW1iZXIgfCBudWxsKSk7XG4gICAgICAvLyBBbG1vc3QgYWxsIGNsaWVudHMgd2lsbCBzdXBwb3J0ID49IDQwOTZcbiAgICAgIFRleHR1cmVBdGxhcy5tYXhUZXh0dXJlU2l6ZSA9IHRocm93SWZGYWxzeShnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSkgYXMgbnVtYmVyIHwgbnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvZ3JhbSA9IHRocm93SWZGYWxzeShjcmVhdGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UsIGNyZWF0ZUZyYWdtZW50U2hhZGVyU291cmNlKFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IGdsLmRlbGV0ZVByb2dyYW0odGhpcy5fcHJvZ3JhbSkpKTtcblxuICAgIC8vIFVuaWZvcm0gbG9jYXRpb25zXG4gICAgdGhpcy5fcHJvamVjdGlvbkxvY2F0aW9uID0gdGhyb3dJZkZhbHN5KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLl9wcm9ncmFtLCAndV9wcm9qZWN0aW9uJykpO1xuICAgIHRoaXMuX3Jlc29sdXRpb25Mb2NhdGlvbiA9IHRocm93SWZGYWxzeShnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5fcHJvZ3JhbSwgJ3VfcmVzb2x1dGlvbicpKTtcbiAgICB0aGlzLl90ZXh0dXJlTG9jYXRpb24gPSB0aHJvd0lmRmFsc3koZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuX3Byb2dyYW0sICd1X3RleHR1cmUnKSk7XG5cbiAgICAvLyBDcmVhdGUgYW5kIHNldCB0aGUgdmVydGV4IGFycmF5IG9iamVjdFxuICAgIHRoaXMuX3ZlcnRleEFycmF5T2JqZWN0ID0gZ2wuY3JlYXRlVmVydGV4QXJyYXkoKTtcbiAgICBnbC5iaW5kVmVydGV4QXJyYXkodGhpcy5fdmVydGV4QXJyYXlPYmplY3QpO1xuXG4gICAgLy8gU2V0dXAgYV91bml0cXVhZCwgdGhpcyBkZWZpbmVzIHRoZSA0IHZlcnRpY2VzIG9mIGEgcmVjdGFuZ2xlXG4gICAgY29uc3QgdW5pdFF1YWRWZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDEsIDAsIDAsIDEsIDEsIDFdKTtcbiAgICBjb25zdCB1bml0UXVhZFZlcnRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKHVuaXRRdWFkVmVydGljZXNCdWZmZXIpKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHVuaXRRdWFkVmVydGljZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCB1bml0UXVhZFZlcnRpY2VzLCBnbC5TVEFUSUNfRFJBVyk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLlVOSVRfUVVBRCk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVU5JVF9RVUFELCAyLCB0aGlzLl9nbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuXG4gICAgLy8gU2V0dXAgdGhlIHVuaXQgcXVhZCBlbGVtZW50IGFycmF5IGJ1ZmZlciwgdGhpcyBwb2ludHMgdG8gaW5kaWNlcyBpblxuICAgIC8vIHVuaXRRdWFkVmVydGljZXMgdG8gYWxsb3cgaXMgdG8gZHJhdyAyIHRyaWFuZ2xlcyBmcm9tIHRoZSB2ZXJ0aWNlcyB2aWEgYVxuICAgIC8vIHRyaWFuZ2xlIHN0cmlwXG4gICAgY29uc3QgdW5pdFF1YWRFbGVtZW50SW5kaWNlcyA9IG5ldyBVaW50OEFycmF5KFswLCAxLCAyLCAzXSk7XG4gICAgY29uc3QgZWxlbWVudEluZGljZXNCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVCdWZmZXIoZWxlbWVudEluZGljZXNCdWZmZXIpKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEluZGljZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHVuaXRRdWFkRWxlbWVudEluZGljZXMsIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgIC8vIFNldHVwIGF0dHJpYnV0ZXNcbiAgICB0aGlzLl9hdHRyaWJ1dGVzQnVmZmVyID0gdGhyb3dJZkZhbHN5KGdsLmNyZWF0ZUJ1ZmZlcigpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiBnbC5kZWxldGVCdWZmZXIodGhpcy5fYXR0cmlidXRlc0J1ZmZlcikpKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy5fYXR0cmlidXRlc0J1ZmZlcik7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLk9GRlNFVCk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuT0ZGU0VULCAyLCBnbC5GTE9BVCwgZmFsc2UsIEJZVEVTX1BFUl9DRUxMLCAwKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5PRkZTRVQsIDEpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFLCAyLCBnbC5GTE9BVCwgZmFsc2UsIEJZVEVTX1BFUl9DRUxMLCAyICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFLCAxKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYUEFHRSk7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYUEFHRSwgMSwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgNCAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYUEFHRSwgMSk7XG4gICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoVmVydGV4QXR0cmliTG9jYXRpb25zLlRFWENPT1JEKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5URVhDT09SRCwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgNSAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVEVYQ09PUkQsIDEpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5URVhTSVpFKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5URVhTSVpFLCAyLCBnbC5GTE9BVCwgZmFsc2UsIEJZVEVTX1BFUl9DRUxMLCA3ICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5URVhTSVpFLCAxKTtcbiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ0VMTF9QT1NJVElPTik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ0VMTF9QT1NJVElPTiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCBCWVRFU19QRVJfQ0VMTCwgOSAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ0VMTF9QT1NJVElPTiwgMSk7XG5cbiAgICAvLyBTZXR1cCBzdGF0aWMgdW5pZm9ybXNcbiAgICBnbC51c2VQcm9ncmFtKHRoaXMuX3Byb2dyYW0pO1xuICAgIGNvbnN0IHRleHR1cmVVbml0cyA9IG5ldyBJbnQzMkFycmF5KFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzOyBpKyspIHtcbiAgICAgIHRleHR1cmVVbml0c1tpXSA9IGk7XG4gICAgfVxuICAgIGdsLnVuaWZvcm0xaXYodGhpcy5fdGV4dHVyZUxvY2F0aW9uLCB0ZXh0dXJlVW5pdHMpO1xuICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5fcHJvamVjdGlvbkxvY2F0aW9uLCBmYWxzZSwgUFJPSkVDVElPTl9NQVRSSVgpO1xuXG4gICAgLy8gU2V0dXAgMXgxIHJlZCBwaXhlbCB0ZXh0dXJlcyBmb3IgYWxsIHBvdGVudGlhbCBhdGxhcyBwYWdlcywgaWYgb25lIG9mIHRoZXNlIGludmFsaWQgdGV4dHVyZXNcbiAgICAvLyBpcyBldmVyIGRyYXduIGl0IHdpbGwgc2hvdyBjaGFyYWN0ZXJzIGFzIHJlZCByZWN0YW5nbGVzLlxuICAgIHRoaXMuX2F0bGFzVGV4dHVyZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzOyBpKyspIHtcbiAgICAgIGNvbnN0IGdsVGV4dHVyZSA9IG5ldyBHTFRleHR1cmUodGhyb3dJZkZhbHN5KGdsLmNyZWF0ZVRleHR1cmUoKSkpO1xuICAgICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlVGV4dHVyZShnbFRleHR1cmUudGV4dHVyZSkpKTtcbiAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTAgKyBpKTtcbiAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGdsVGV4dHVyZS50ZXh0dXJlKTtcbiAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIDEsIDEsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIG5ldyBVaW50OEFycmF5KFsyNTUsIDAsIDAsIDI1NV0pKTtcbiAgICAgIHRoaXMuX2F0bGFzVGV4dHVyZXNbaV0gPSBnbFRleHR1cmU7XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgZHJhd2luZyBvZiB0cmFuc3BhcmVudCB0ZXh0dXJlXG4gICAgZ2wuZW5hYmxlKGdsLkJMRU5EKTtcbiAgICBnbC5ibGVuZEZ1bmMoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcblxuICAgIC8vIFNldCB2aWV3cG9ydFxuICAgIHRoaXMuaGFuZGxlUmVzaXplKCk7XG4gIH1cblxuICBwdWJsaWMgYmVnaW5GcmFtZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYXRsYXMgPyB0aGlzLl9hdGxhcy5iZWdpbkZyYW1lKCkgOiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNlbGwoeDogbnVtYmVyLCB5OiBudW1iZXIsIGNvZGU6IG51bWJlciwgYmc6IG51bWJlciwgZmc6IG51bWJlciwgZXh0OiBudW1iZXIsIGNoYXJzOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGxhc3RCZzogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGNlbGwgKGByb3dzKmNvbHNgKSwgaXQgbXVzdCBiZSB2ZXJ5IG9wdGltaXplZC4gSXRcbiAgICAvLyBzaG91bGQgbm90IGluc3RhbnRpYXRlIGFueSB2YXJpYWJsZXMgdW5sZXNzIGEgbmV3IGdseXBoIGlzIGRyYXduIHRvIHRoZSBjYWNoZSB3aGVyZSB0aGVcbiAgICAvLyBzbGlnaHQgc2xvd2Rvd24gaXMgYWNjZXB0YWJsZSBmb3IgdGhlIGRldmVsb3BlciBlcmdvbm9taWNzIHByb3ZpZGVkIGFzIGl0J3MgYSBvbmNlIG9mIGZvclxuICAgIC8vIGVhY2ggZ2x5cGguXG4gICAgdGhpcy5fdXBkYXRlQ2VsbCh0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzLCB4LCB5LCBjb2RlLCBiZywgZmcsIGV4dCwgY2hhcnMsIHdpZHRoLCBsYXN0QmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQ2VsbChhcnJheTogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIsIHk6IG51bWJlciwgY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBiZzogbnVtYmVyLCBmZzogbnVtYmVyLCBleHQ6IG51bWJlciwgY2hhcnM6IHN0cmluZywgd2lkdGg6IG51bWJlciwgbGFzdEJnOiBudW1iZXIpOiB2b2lkIHtcbiAgICAkaSA9ICh5ICogdGhpcy5fdGVybWluYWwuY29scyArIHgpICogSU5ESUNFU19QRVJfQ0VMTDtcblxuICAgIC8vIEV4aXQgZWFybHkgaWYgdGhpcyBpcyBhIG51bGwgY2hhcmFjdGVyLCBhbGxvdyBzcGFjZSBjaGFyYWN0ZXIgdG8gY29udGludWUgYXMgaXQgbWF5IGhhdmVcbiAgICAvLyB1bmRlcmxpbmUvc3RyaWtldGhyb3VnaCBzdHlsZXNcbiAgICBpZiAoY29kZSA9PT0gTlVMTF9DRUxMX0NPREUgfHwgY29kZSA9PT0gdW5kZWZpbmVkLyogVGhpcyBpcyB1c2VkIGZvciB0aGUgcmlnaHQgc2lkZSBvZiB3aWRlIGNoYXJzICovKSB7XG4gICAgICBhcnJheS5maWxsKDAsICRpLCAkaSArIElORElDRVNfUEVSX0NFTEwgLSAxIC0gQ0VMTF9QT1NJVElPTl9JTkRJQ0VTKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2F0bGFzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBnbHlwaFxuICAgIGlmIChjaGFycyAmJiBjaGFycy5sZW5ndGggPiAxKSB7XG4gICAgICAkZ2x5cGggPSB0aGlzLl9hdGxhcy5nZXRSYXN0ZXJpemVkR2x5cGhDb21iaW5lZENoYXIoY2hhcnMsIGJnLCBmZywgZXh0LCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRnbHlwaCA9IHRoaXMuX2F0bGFzLmdldFJhc3Rlcml6ZWRHbHlwaChjb2RlLCBiZywgZmcsIGV4dCwgZmFsc2UpO1xuICAgIH1cblxuICAgICRsZWZ0Q2VsbFBhZGRpbmcgPSBNYXRoLmZsb29yKCh0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoIC0gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2hhci53aWR0aCkgLyAyKTtcbiAgICBpZiAoYmcgIT09IGxhc3RCZyAmJiAkZ2x5cGgub2Zmc2V0LnggPiAkbGVmdENlbGxQYWRkaW5nKSB7XG4gICAgICAkY2xpcHBlZFBpeGVscyA9ICRnbHlwaC5vZmZzZXQueCAtICRsZWZ0Q2VsbFBhZGRpbmc7XG4gICAgICAvLyBhX29yaWdpblxuICAgICAgYXJyYXlbJGkgICAgXSA9IC0oJGdseXBoLm9mZnNldC54IC0gJGNsaXBwZWRQaXhlbHMpICsgdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2hhci5sZWZ0O1xuICAgICAgYXJyYXlbJGkgKyAxXSA9IC0kZ2x5cGgub2Zmc2V0LnkgKyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jaGFyLnRvcDtcbiAgICAgIC8vIGFfc2l6ZVxuICAgICAgYXJyYXlbJGkgKyAyXSA9ICgkZ2x5cGguc2l6ZS54IC0gJGNsaXBwZWRQaXhlbHMpIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgICAgYXJyYXlbJGkgKyAzXSA9ICRnbHlwaC5zaXplLnkgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgICAgLy8gYV90ZXhwYWdlXG4gICAgICBhcnJheVskaSArIDRdID0gJGdseXBoLnRleHR1cmVQYWdlO1xuICAgICAgLy8gYV90ZXhjb29yZFxuICAgICAgYXJyYXlbJGkgKyA1XSA9ICRnbHlwaC50ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2UueCArICRjbGlwcGVkUGl4ZWxzIC8gdGhpcy5fYXRsYXMucGFnZXNbJGdseXBoLnRleHR1cmVQYWdlXS5jYW52YXMud2lkdGg7XG4gICAgICBhcnJheVskaSArIDZdID0gJGdseXBoLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS55O1xuICAgICAgLy8gYV90ZXhzaXplXG4gICAgICBhcnJheVskaSArIDddID0gJGdseXBoLnNpemVDbGlwU3BhY2UueCAtICRjbGlwcGVkUGl4ZWxzIC8gdGhpcy5fYXRsYXMucGFnZXNbJGdseXBoLnRleHR1cmVQYWdlXS5jYW52YXMud2lkdGg7XG4gICAgICBhcnJheVskaSArIDhdID0gJGdseXBoLnNpemVDbGlwU3BhY2UueTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYV9vcmlnaW5cbiAgICAgIGFycmF5WyRpICAgIF0gPSAtJGdseXBoLm9mZnNldC54ICsgdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2hhci5sZWZ0O1xuICAgICAgYXJyYXlbJGkgKyAxXSA9IC0kZ2x5cGgub2Zmc2V0LnkgKyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jaGFyLnRvcDtcbiAgICAgIC8vIGFfc2l6ZVxuICAgICAgYXJyYXlbJGkgKyAyXSA9ICRnbHlwaC5zaXplLnggLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgICBhcnJheVskaSArIDNdID0gJGdseXBoLnNpemUueSAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy5oZWlnaHQ7XG4gICAgICAvLyBhX3RleHBhZ2VcbiAgICAgIGFycmF5WyRpICsgNF0gPSAkZ2x5cGgudGV4dHVyZVBhZ2U7XG4gICAgICAvLyBhX3RleGNvb3JkXG4gICAgICBhcnJheVskaSArIDVdID0gJGdseXBoLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS54O1xuICAgICAgYXJyYXlbJGkgKyA2XSA9ICRnbHlwaC50ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2UueTtcbiAgICAgIC8vIGFfdGV4c2l6ZVxuICAgICAgYXJyYXlbJGkgKyA3XSA9ICRnbHlwaC5zaXplQ2xpcFNwYWNlLng7XG4gICAgICBhcnJheVskaSArIDhdID0gJGdseXBoLnNpemVDbGlwU3BhY2UueTtcbiAgICB9XG4gICAgLy8gYV9jZWxscG9zIG9ubHkgY2hhbmdlcyBvbiByZXNpemVcblxuICAgIC8vIFJlZHVjZSBzY2FsZSBob3Jpem9udGFsbHkgZm9yIHdpZGUgZ2x5cGhzIHByaW50ZWQgaW4gY2VsbHMgdGhhdCB3b3VsZCBvdmVybGFwIHdpdGggdGhlXG4gICAgLy8gZm9sbG93aW5nIGNlbGwgKGllLiB0aGUgd2lkdGggaXMgbm90IDIpLlxuICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnJlc2NhbGVPdmVybGFwcGluZ0dseXBocykge1xuICAgICAgaWYgKGFsbG93UmVzY2FsaW5nKGNvZGUsIHdpZHRoLCAkZ2x5cGguc2l6ZS54LCB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoKSkge1xuICAgICAgICBhcnJheVskaSArIDJdID0gKHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGggLSAxKSAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aDsgLy8gLSAxIHRvIGltcHJvdmUgcmVhZGFiaWxpdHlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgY29uc3QgdGVybWluYWwgPSB0aGlzLl90ZXJtaW5hbDtcbiAgICBjb25zdCBuZXdDb3VudCA9IHRlcm1pbmFsLmNvbHMgKiB0ZXJtaW5hbC5yb3dzICogSU5ESUNFU19QRVJfQ0VMTDtcblxuICAgIC8vIENsZWFyIHZlcnRpY2VzXG4gICAgaWYgKHRoaXMuX3ZlcnRpY2VzLmNvdW50ICE9PSBuZXdDb3VudCkge1xuICAgICAgdGhpcy5fdmVydGljZXMuYXR0cmlidXRlcyA9IG5ldyBGbG9hdDMyQXJyYXkobmV3Q291bnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzLmZpbGwoMCk7XG4gICAgfVxuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKDsgaSA8IHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXNCdWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fdmVydGljZXMuY291bnQgIT09IG5ld0NvdW50KSB7XG4gICAgICAgIHRoaXMuX3ZlcnRpY2VzLmF0dHJpYnV0ZXNCdWZmZXJzW2ldID0gbmV3IEZsb2F0MzJBcnJheShuZXdDb3VudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzQnVmZmVyc1tpXS5maWxsKDApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl92ZXJ0aWNlcy5jb3VudCA9IG5ld0NvdW50O1xuICAgIGkgPSAwO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGVybWluYWwucm93czsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRlcm1pbmFsLmNvbHM7IHgrKykge1xuICAgICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzW2kgKyA5XSA9IHggLyB0ZXJtaW5hbC5jb2xzO1xuICAgICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzW2kgKyAxMF0gPSB5IC8gdGVybWluYWwucm93cztcbiAgICAgICAgaSArPSBJTkRJQ0VTX1BFUl9DRUxMO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVSZXNpemUoKTogdm9pZCB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9nbDtcbiAgICBnbC51c2VQcm9ncmFtKHRoaXMuX3Byb2dyYW0pO1xuICAgIGdsLnZpZXdwb3J0KDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCk7XG4gICAgZ2wudW5pZm9ybTJmKHRoaXMuX3Jlc29sdXRpb25Mb2NhdGlvbiwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKHJlbmRlck1vZGVsOiBJUmVuZGVyTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2F0bGFzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZ2wgPSB0aGlzLl9nbDtcblxuICAgIGdsLnVzZVByb2dyYW0odGhpcy5fcHJvZ3JhbSk7XG4gICAgZ2wuYmluZFZlcnRleEFycmF5KHRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KTtcblxuICAgIC8vIEFsdGVybmF0ZSBidWZmZXJzIGVhY2ggZnJhbWUgYXMgdGhlIGFjdGl2ZSBidWZmZXIgZ2V0cyBsb2NrZWQgd2hpbGUgaXQncyBpbiB1c2UgYnkgdGhlIEdQVVxuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlciA9ICh0aGlzLl9hY3RpdmVCdWZmZXIgKyAxKSAlIDI7XG4gICAgY29uc3QgYWN0aXZlQnVmZmVyID0gdGhpcy5fdmVydGljZXMuYXR0cmlidXRlc0J1ZmZlcnNbdGhpcy5fYWN0aXZlQnVmZmVyXTtcblxuICAgIC8vIENvcHkgZGF0YSBmb3IgZWFjaCBjZWxsIG9mIGVhY2ggbGluZSB1cCB0byBpdHMgbGluZSBsZW5ndGggKHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNlbGwpXG4gICAgLy8gZnJvbSB0aGUgYXR0cmlidXRlcyBidWZmZXIgaW50byBhY3RpdmVCdWZmZXIsIHdoaWNoIGlzIHRoZSBvbmUgdGhhdCBnZXRzIGJvdW5kIHRvIHRoZSBHUFUuXG4gICAgLy8gVGhlIHJlYXNvbnMgZm9yIHRoaXMgYXJlIGFzIGZvbGxvd3M6XG4gICAgLy8gLSBTbyB0aGUgYWN0aXZlIGJ1ZmZlciBjYW4gYmUgYWx0ZXJuYXRlZCBzbyB3ZSBkb24ndCBnZXQgYmxvY2tlZCBvbiByZW5kZXJpbmcgZmluaXNoaW5nXG4gICAgLy8gLSBUbyBjb3B5IGVpdGhlciB0aGUgbm9ybWFsIGF0dHJpYnV0ZXMgYnVmZmVyIG9yIHRoZSBzZWxlY3Rpb24gYXR0cmlidXRlcyBidWZmZXIgd2hlbiB0aGVyZVxuICAgIC8vICAgaXMgYSBzZWxlY3Rpb25cbiAgICAvLyAtIFNvIHdlIGRvbid0IHNlbmQgdmVydGljZXMgZm9yIGFsbCB0aGUgbGluZS1lbmRpbmcgd2hpdGVzcGFjZSB0byB0aGUgR1BVXG4gICAgbGV0IGJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCByZW5kZXJNb2RlbC5saW5lTGVuZ3Rocy5sZW5ndGg7IHkrKykge1xuICAgICAgY29uc3Qgc2kgPSB5ICogdGhpcy5fdGVybWluYWwuY29scyAqIElORElDRVNfUEVSX0NFTEw7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzLnN1YmFycmF5KHNpLCBzaSArIHJlbmRlck1vZGVsLmxpbmVMZW5ndGhzW3ldICogSU5ESUNFU19QRVJfQ0VMTCk7XG4gICAgICBhY3RpdmVCdWZmZXIuc2V0KHN1YiwgYnVmZmVyTGVuZ3RoKTtcbiAgICAgIGJ1ZmZlckxlbmd0aCArPSBzdWIubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIEJpbmQgdGhlIGF0dHJpYnV0ZXMgYnVmZmVyXG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBhY3RpdmVCdWZmZXIuc3ViYXJyYXkoMCwgYnVmZmVyTGVuZ3RoKSwgZ2wuU1RSRUFNX0RSQVcpO1xuXG4gICAgLy8gQmluZCB0aGUgYXRsYXMgcGFnZSB0ZXh0dXJlIGlmIHRoZXkgaGF2ZSBjaGFuZ2VkXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9hdGxhcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX2F0bGFzLnBhZ2VzW2ldLnZlcnNpb24gIT09IHRoaXMuX2F0bGFzVGV4dHVyZXNbaV0udmVyc2lvbikge1xuICAgICAgICB0aGlzLl9iaW5kQXRsYXNQYWdlVGV4dHVyZShnbCwgdGhpcy5fYXRsYXMsIGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIHZpZXdwb3J0XG4gICAgZ2wuZHJhd0VsZW1lbnRzSW5zdGFuY2VkKGdsLlRSSUFOR0xFX1NUUklQLCA0LCBnbC5VTlNJR05FRF9CWVRFLCAwLCBidWZmZXJMZW5ndGggLyBJTkRJQ0VTX1BFUl9DRUxMKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBdGxhcyhhdGxhczogSVRleHR1cmVBdGxhcyk6IHZvaWQge1xuICAgIHRoaXMuX2F0bGFzID0gYXRsYXM7XG4gICAgZm9yIChjb25zdCBnbFRleHR1cmUgb2YgdGhpcy5fYXRsYXNUZXh0dXJlcykge1xuICAgICAgZ2xUZXh0dXJlLnZlcnNpb24gPSAtMTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9iaW5kQXRsYXNQYWdlVGV4dHVyZShnbDogSVdlYkdMMlJlbmRlcmluZ0NvbnRleHQsIGF0bGFzOiBJVGV4dHVyZUF0bGFzLCBpOiBudW1iZXIpOiB2b2lkIHtcbiAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgaSk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy5fYXRsYXNUZXh0dXJlc1tpXS50ZXh0dXJlKTtcbiAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGF0bGFzLnBhZ2VzW2ldLmNhbnZhcyk7XG4gICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XG4gICAgdGhpcy5fYXRsYXNUZXh0dXJlc1tpXS52ZXJzaW9uID0gYXRsYXMucGFnZXNbaV0udmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaW1lbnNpb25zKGRpbWVuc2lvbnM6IElSZW5kZXJEaW1lbnNpb25zKTogdm9pZCB7XG4gICAgdGhpcy5fZGltZW5zaW9ucyA9IGRpbWVuc2lvbnM7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBGZ0ZsYWdzIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJQ29sb3IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgUkVOREVSX01PREVMX0JHX09GRlNFVCwgUkVOREVSX01PREVMX0ZHX09GRlNFVCwgUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMIH0gZnJvbSAnLi9SZW5kZXJNb2RlbCc7XG5pbXBvcnQgeyBJUmVuZGVyTW9kZWwsIElXZWJHTDJSZW5kZXJpbmdDb250ZXh0LCBJV2ViR0xWZXJ0ZXhBcnJheU9iamVjdCB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlUHJvZ3JhbSwgZXhwYW5kRmxvYXQzMkFycmF5LCBQUk9KRUNUSU9OX01BVFJJWCB9IGZyb20gJy4vV2ViZ2xVdGlscyc7XG5cbmNvbnN0IGVudW0gVmVydGV4QXR0cmliTG9jYXRpb25zIHtcbiAgUE9TSVRJT04gPSAwLFxuICBTSVpFID0gMSxcbiAgQ09MT1IgPSAyLFxuICBVTklUX1FVQUQgPSAzXG59XG5cbmNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGAjdmVyc2lvbiAzMDAgZXNcbmxheW91dCAobG9jYXRpb24gPSAke1ZlcnRleEF0dHJpYkxvY2F0aW9ucy5QT1NJVElPTn0pIGluIHZlYzIgYV9wb3NpdGlvbjtcbmxheW91dCAobG9jYXRpb24gPSAke1ZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFfSkgaW4gdmVjMiBhX3NpemU7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ09MT1J9KSBpbiB2ZWM0IGFfY29sb3I7XG5sYXlvdXQgKGxvY2F0aW9uID0gJHtWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuVU5JVF9RVUFEfSkgaW4gdmVjMiBhX3VuaXRxdWFkO1xuXG51bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xuXG5vdXQgdmVjNCB2X2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzIgemVyb1RvT25lID0gYV9wb3NpdGlvbiArIChhX3VuaXRxdWFkICogYV9zaXplKTtcbiAgZ2xfUG9zaXRpb24gPSB1X3Byb2plY3Rpb24gKiB2ZWM0KHplcm9Ub09uZSwgMC4wLCAxLjApO1xuICB2X2NvbG9yID0gYV9jb2xvcjtcbn1gO1xuXG5jb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBsb3dwIGZsb2F0O1xuXG5pbiB2ZWM0IHZfY29sb3I7XG5cbm91dCB2ZWM0IG91dENvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIG91dENvbG9yID0gdl9jb2xvcjtcbn1gO1xuXG5jb25zdCBJTkRJQ0VTX1BFUl9SRUNUQU5HTEUgPSA4O1xuY29uc3QgQllURVNfUEVSX1JFQ1RBTkdMRSA9IElORElDRVNfUEVSX1JFQ1RBTkdMRSAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcblxuY29uc3QgSU5JVElBTF9CVUZGRVJfUkVDVEFOR0xFX0NBUEFDSVRZID0gMjAgKiBJTkRJQ0VTX1BFUl9SRUNUQU5HTEU7XG5cbmNsYXNzIFZlcnRpY2VzIHtcbiAgcHVibGljIGF0dHJpYnV0ZXM6IEZsb2F0MzJBcnJheTtcbiAgcHVibGljIGNvdW50OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hdHRyaWJ1dGVzID0gbmV3IEZsb2F0MzJBcnJheShJTklUSUFMX0JVRkZFUl9SRUNUQU5HTEVfQ0FQQUNJVFkpO1xuICAgIHRoaXMuY291bnQgPSAwO1xuICB9XG59XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRyZ2JhID0gMDtcbmxldCAkeDEgPSAwO1xubGV0ICR5MSA9IDA7XG5sZXQgJHIgPSAwO1xubGV0ICRnID0gMDtcbmxldCAkYiA9IDA7XG5sZXQgJGEgPSAwO1xuXG5leHBvcnQgY2xhc3MgUmVjdGFuZ2xlUmVuZGVyZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcblxuICBwcml2YXRlIF9wcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gIHByaXZhdGUgX3ZlcnRleEFycmF5T2JqZWN0OiBJV2ViR0xWZXJ0ZXhBcnJheU9iamVjdDtcbiAgcHJpdmF0ZSBfYXR0cmlidXRlc0J1ZmZlcjogV2ViR0xCdWZmZXI7XG4gIHByaXZhdGUgX3Byb2plY3Rpb25Mb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIHByaXZhdGUgX2JnRmxvYXQhOiBGbG9hdDMyQXJyYXk7XG4gIHByaXZhdGUgX2N1cnNvckZsb2F0ITogRmxvYXQzMkFycmF5O1xuXG4gIHByaXZhdGUgX3ZlcnRpY2VzOiBWZXJ0aWNlcyA9IG5ldyBWZXJ0aWNlcygpO1xuICBwcml2YXRlIF92ZXJ0aWNlc0N1cnNvcjogVmVydGljZXMgPSBuZXcgVmVydGljZXMoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF90ZXJtaW5hbDogVGVybWluYWwsXG4gICAgcHJpdmF0ZSBfZ2w6IElXZWJHTDJSZW5kZXJpbmdDb250ZXh0LFxuICAgIHByaXZhdGUgX2RpbWVuc2lvbnM6IElSZW5kZXJEaW1lbnNpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3QgZ2wgPSB0aGlzLl9nbDtcblxuICAgIHRoaXMuX3Byb2dyYW0gPSB0aHJvd0lmRmFsc3koY3JlYXRlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyU291cmNlLCBmcmFnbWVudFNoYWRlclNvdXJjZSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IGdsLmRlbGV0ZVByb2dyYW0odGhpcy5fcHJvZ3JhbSkpKTtcblxuICAgIC8vIFVuaWZvcm0gbG9jYXRpb25zXG4gICAgdGhpcy5fcHJvamVjdGlvbkxvY2F0aW9uID0gdGhyb3dJZkZhbHN5KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLl9wcm9ncmFtLCAndV9wcm9qZWN0aW9uJykpO1xuXG4gICAgLy8gQ3JlYXRlIGFuZCBzZXQgdGhlIHZlcnRleCBhcnJheSBvYmplY3RcbiAgICB0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCA9IGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7XG4gICAgZ2wuYmluZFZlcnRleEFycmF5KHRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KTtcblxuICAgIC8vIFNldHVwIGFfdW5pdHF1YWQsIHRoaXMgZGVmaW5lcyB0aGUgNCB2ZXJ0aWNlcyBvZiBhIHJlY3RhbmdsZVxuICAgIGNvbnN0IHVuaXRRdWFkVmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAxLCAwLCAwLCAxLCAxLCAxXSk7XG4gICAgY29uc3QgdW5pdFF1YWRWZXJ0aWNlc0J1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IGdsLmRlbGV0ZUJ1ZmZlcih1bml0UXVhZFZlcnRpY2VzQnVmZmVyKSkpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB1bml0UXVhZFZlcnRpY2VzQnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgdW5pdFF1YWRWZXJ0aWNlcywgZ2wuU1RBVElDX0RSQVcpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5VTklUX1FVQUQpO1xuICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoVmVydGV4QXR0cmliTG9jYXRpb25zLlVOSVRfUVVBRCwgMiwgdGhpcy5fZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcblxuICAgIC8vIFNldHVwIHRoZSB1bml0IHF1YWQgZWxlbWVudCBhcnJheSBidWZmZXIsIHRoaXMgcG9pbnRzIHRvIGluZGljZXMgaW5cbiAgICAvLyB1bml0UXVhZFZlcnRpY2VzIHRvIGFsbG93IGlzIHRvIGRyYXcgMiB0cmlhbmdsZXMgZnJvbSB0aGUgdmVydGljZXMgdmlhIGFcbiAgICAvLyB0cmlhbmdsZSBzdHJpcFxuICAgIGNvbnN0IHVuaXRRdWFkRWxlbWVudEluZGljZXMgPSBuZXcgVWludDhBcnJheShbMCwgMSwgMiwgM10pO1xuICAgIGNvbnN0IGVsZW1lbnRJbmRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKGVsZW1lbnRJbmRpY2VzQnVmZmVyKSkpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRJbmRpY2VzQnVmZmVyKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB1bml0UXVhZEVsZW1lbnRJbmRpY2VzLCBnbC5TVEFUSUNfRFJBVyk7XG5cbiAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fYXR0cmlidXRlc0J1ZmZlciA9IHRocm93SWZGYWxzeShnbC5jcmVhdGVCdWZmZXIoKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5QT1NJVElPTik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuUE9TSVRJT04sIDIsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX1JFQ1RBTkdMRSwgMCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuUE9TSVRJT04sIDEpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFKTtcbiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFZlcnRleEF0dHJpYkxvY2F0aW9ucy5TSVpFLCAyLCBnbC5GTE9BVCwgZmFsc2UsIEJZVEVTX1BFUl9SRUNUQU5HTEUsIDIgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpO1xuICAgIGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoVmVydGV4QXR0cmliTG9jYXRpb25zLlNJWkUsIDEpO1xuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYkxvY2F0aW9ucy5DT0xPUik7XG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ09MT1IsIDQsIGdsLkZMT0FULCBmYWxzZSwgQllURVNfUEVSX1JFQ1RBTkdMRSwgNCAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgZ2wudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJMb2NhdGlvbnMuQ09MT1IsIDEpO1xuXG4gICAgdGhpcy5fdXBkYXRlQ2FjaGVkQ29sb3JzKF90aGVtZVNlcnZpY2UuY29sb3JzKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3RoZW1lU2VydmljZS5vbkNoYW5nZUNvbG9ycyhlID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZUNhY2hlZENvbG9ycyhlKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVZpZXdwb3J0UmVjdGFuZ2xlKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHJlbmRlckJhY2tncm91bmRzKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlclZlcnRpY2VzKHRoaXMuX3ZlcnRpY2VzKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXJDdXJzb3IoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyVmVydGljZXModGhpcy5fdmVydGljZXNDdXJzb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyVmVydGljZXModmVydGljZXM6IFZlcnRpY2VzKTogdm9pZCB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9nbDtcblxuICAgIGdsLnVzZVByb2dyYW0odGhpcy5fcHJvZ3JhbSk7XG5cbiAgICBnbC5iaW5kVmVydGV4QXJyYXkodGhpcy5fdmVydGV4QXJyYXlPYmplY3QpO1xuXG4gICAgZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLl9wcm9qZWN0aW9uTG9jYXRpb24sIGZhbHNlLCBQUk9KRUNUSU9OX01BVFJJWCk7XG5cbiAgICAvLyBCaW5kIGF0dHJpYnV0ZXMgYnVmZmVyIGFuZCBkcmF3XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHRoaXMuX2F0dHJpYnV0ZXNCdWZmZXIpO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0aWNlcy5hdHRyaWJ1dGVzLCBnbC5EWU5BTUlDX0RSQVcpO1xuICAgIGdsLmRyYXdFbGVtZW50c0luc3RhbmNlZCh0aGlzLl9nbC5UUklBTkdMRV9TVFJJUCwgNCwgZ2wuVU5TSUdORURfQllURSwgMCwgdmVydGljZXMuY291bnQpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVWaWV3cG9ydFJlY3RhbmdsZSgpO1xuICB9XG5cbiAgcHVibGljIHNldERpbWVuc2lvbnMoZGltZW5zaW9uczogSVJlbmRlckRpbWVuc2lvbnMpOiB2b2lkIHtcbiAgICB0aGlzLl9kaW1lbnNpb25zID0gZGltZW5zaW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUNhY2hlZENvbG9ycyhjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQpOiB2b2lkIHtcbiAgICB0aGlzLl9iZ0Zsb2F0ID0gdGhpcy5fY29sb3JUb0Zsb2F0MzJBcnJheShjb2xvcnMuYmFja2dyb3VuZCk7XG4gICAgdGhpcy5fY3Vyc29yRmxvYXQgPSB0aGlzLl9jb2xvclRvRmxvYXQzMkFycmF5KGNvbG9ycy5jdXJzb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlVmlld3BvcnRSZWN0YW5nbGUoKTogdm9pZCB7XG4gICAgLy8gU2V0IGZpcnN0IHJlY3RhbmdsZSB0aGF0IGNsZWFycyB0aGUgc2NyZWVuXG4gICAgdGhpcy5fYWRkUmVjdGFuZ2xlRmxvYXQoXG4gICAgICB0aGlzLl92ZXJ0aWNlcy5hdHRyaWJ1dGVzLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgdGhpcy5fdGVybWluYWwuY29scyAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsXG4gICAgICB0aGlzLl90ZXJtaW5hbC5yb3dzICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQsXG4gICAgICB0aGlzLl9iZ0Zsb2F0XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVCYWNrZ3JvdW5kcyhtb2RlbDogSVJlbmRlck1vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgdGVybWluYWwgPSB0aGlzLl90ZXJtaW5hbDtcbiAgICBjb25zdCB2ZXJ0aWNlcyA9IHRoaXMuX3ZlcnRpY2VzO1xuXG4gICAgLy8gRGVjbGFyZSB2YXJpYWJsZSBhaGVhZCBvZiB0aW1lIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgIGxldCByZWN0YW5nbGVDb3VudCA9IDE7XG4gICAgbGV0IHk6IG51bWJlcjtcbiAgICBsZXQgeDogbnVtYmVyO1xuICAgIGxldCBjdXJyZW50U3RhcnRYOiBudW1iZXI7XG4gICAgbGV0IGN1cnJlbnRCZzogbnVtYmVyO1xuICAgIGxldCBjdXJyZW50Rmc6IG51bWJlcjtcbiAgICBsZXQgY3VycmVudEludmVyc2U6IGJvb2xlYW47XG4gICAgbGV0IG1vZGVsSW5kZXg6IG51bWJlcjtcbiAgICBsZXQgYmc6IG51bWJlcjtcbiAgICBsZXQgZmc6IG51bWJlcjtcbiAgICBsZXQgaW52ZXJzZTogYm9vbGVhbjtcbiAgICBsZXQgb2Zmc2V0OiBudW1iZXI7XG5cbiAgICBmb3IgKHkgPSAwOyB5IDwgdGVybWluYWwucm93czsgeSsrKSB7XG4gICAgICBjdXJyZW50U3RhcnRYID0gLTE7XG4gICAgICBjdXJyZW50QmcgPSAwO1xuICAgICAgY3VycmVudEZnID0gMDtcbiAgICAgIGN1cnJlbnRJbnZlcnNlID0gZmFsc2U7XG4gICAgICBmb3IgKHggPSAwOyB4IDwgdGVybWluYWwuY29sczsgeCsrKSB7XG4gICAgICAgIG1vZGVsSW5kZXggPSAoKHkgKiB0ZXJtaW5hbC5jb2xzKSArIHgpICogUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMO1xuICAgICAgICBiZyA9IG1vZGVsLmNlbGxzW21vZGVsSW5kZXggKyBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VUXTtcbiAgICAgICAgZmcgPSBtb2RlbC5jZWxsc1ttb2RlbEluZGV4ICsgUkVOREVSX01PREVMX0ZHX09GRlNFVF07XG4gICAgICAgIGludmVyc2UgPSAhIShmZyAmIEZnRmxhZ3MuSU5WRVJTRSk7XG4gICAgICAgIGlmIChiZyAhPT0gY3VycmVudEJnIHx8IChmZyAhPT0gY3VycmVudEZnICYmIChjdXJyZW50SW52ZXJzZSB8fCBpbnZlcnNlKSkpIHtcbiAgICAgICAgICAvLyBBIHJlY3RhbmdsZSBuZWVkcyB0byBiZSBkcmF3biBpZiBnb2luZyBmcm9tIG5vbi1kZWZhdWx0IHRvIGFub3RoZXIgY29sb3JcbiAgICAgICAgICBpZiAoY3VycmVudEJnICE9PSAwIHx8IChjdXJyZW50SW52ZXJzZSAmJiBjdXJyZW50RmcgIT09IDApKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSByZWN0YW5nbGVDb3VudCsrICogSU5ESUNFU19QRVJfUkVDVEFOR0xFO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUmVjdGFuZ2xlKHZlcnRpY2VzLCBvZmZzZXQsIGN1cnJlbnRGZywgY3VycmVudEJnLCBjdXJyZW50U3RhcnRYLCB4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFN0YXJ0WCA9IHg7XG4gICAgICAgICAgY3VycmVudEJnID0gYmc7XG4gICAgICAgICAgY3VycmVudEZnID0gZmc7XG4gICAgICAgICAgY3VycmVudEludmVyc2UgPSBpbnZlcnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBGaW5pc2ggcmVjdGFuZ2xlIGlmIGl0J3Mgc3RpbGwgZ29pbmdcbiAgICAgIGlmIChjdXJyZW50QmcgIT09IDAgfHwgKGN1cnJlbnRJbnZlcnNlICYmIGN1cnJlbnRGZyAhPT0gMCkpIHtcbiAgICAgICAgb2Zmc2V0ID0gcmVjdGFuZ2xlQ291bnQrKyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRTtcbiAgICAgICAgdGhpcy5fdXBkYXRlUmVjdGFuZ2xlKHZlcnRpY2VzLCBvZmZzZXQsIGN1cnJlbnRGZywgY3VycmVudEJnLCBjdXJyZW50U3RhcnRYLCB0ZXJtaW5hbC5jb2xzLCB5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmVydGljZXMuY291bnQgPSByZWN0YW5nbGVDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDdXJzb3IobW9kZWw6IElSZW5kZXJNb2RlbCk6IHZvaWQge1xuICAgIGNvbnN0IHZlcnRpY2VzID0gdGhpcy5fdmVydGljZXNDdXJzb3I7XG4gICAgY29uc3QgY3Vyc29yID0gbW9kZWwuY3Vyc29yO1xuICAgIGlmICghY3Vyc29yIHx8IGN1cnNvci5zdHlsZSA9PT0gJ2Jsb2NrJykge1xuICAgICAgdmVydGljZXMuY291bnQgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXQ6IG51bWJlcjtcbiAgICBsZXQgcmVjdGFuZ2xlQ291bnQgPSAwO1xuXG4gICAgaWYgKGN1cnNvci5zdHlsZSA9PT0gJ2JhcicgfHwgY3Vyc29yLnN0eWxlID09PSAnb3V0bGluZScpIHtcbiAgICAgIC8vIExlZnQgZWRnZVxuICAgICAgb2Zmc2V0ID0gcmVjdGFuZ2xlQ291bnQrKyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRTtcbiAgICAgIHRoaXMuX2FkZFJlY3RhbmdsZUZsb2F0KFxuICAgICAgICB2ZXJ0aWNlcy5hdHRyaWJ1dGVzLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGN1cnNvci54ICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCxcbiAgICAgICAgY3Vyc29yLnkgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCxcbiAgICAgICAgY3Vyc29yLnN0eWxlID09PSAnYmFyJyA/IGN1cnNvci5kcHIgKiBjdXJzb3IuY3Vyc29yV2lkdGggOiBjdXJzb3IuZHByLFxuICAgICAgICB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCxcbiAgICAgICAgdGhpcy5fY3Vyc29yRmxvYXRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXJzb3Iuc3R5bGUgPT09ICd1bmRlcmxpbmUnIHx8IGN1cnNvci5zdHlsZSA9PT0gJ291dGxpbmUnKSB7XG4gICAgICAvLyBCb3R0b20gZWRnZVxuICAgICAgb2Zmc2V0ID0gcmVjdGFuZ2xlQ291bnQrKyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRTtcbiAgICAgIHRoaXMuX2FkZFJlY3RhbmdsZUZsb2F0KFxuICAgICAgICB2ZXJ0aWNlcy5hdHRyaWJ1dGVzLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGN1cnNvci54ICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCxcbiAgICAgICAgKGN1cnNvci55ICsgMSkgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCAtIGN1cnNvci5kcHIsXG4gICAgICAgIGN1cnNvci53aWR0aCAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsXG4gICAgICAgIGN1cnNvci5kcHIsXG4gICAgICAgIHRoaXMuX2N1cnNvckZsb2F0XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3Vyc29yLnN0eWxlID09PSAnb3V0bGluZScpIHtcbiAgICAgIC8vIFRvcCBlZGdlXG4gICAgICBvZmZzZXQgPSByZWN0YW5nbGVDb3VudCsrICogSU5ESUNFU19QRVJfUkVDVEFOR0xFO1xuICAgICAgdGhpcy5fYWRkUmVjdGFuZ2xlRmxvYXQoXG4gICAgICAgIHZlcnRpY2VzLmF0dHJpYnV0ZXMsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgY3Vyc29yLnggKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLFxuICAgICAgICBjdXJzb3IueSAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LFxuICAgICAgICBjdXJzb3Iud2lkdGggKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLFxuICAgICAgICBjdXJzb3IuZHByLFxuICAgICAgICB0aGlzLl9jdXJzb3JGbG9hdFxuICAgICAgKTtcbiAgICAgIC8vIFJpZ2h0IGVkZ2VcbiAgICAgIG9mZnNldCA9IHJlY3RhbmdsZUNvdW50KysgKiBJTkRJQ0VTX1BFUl9SRUNUQU5HTEU7XG4gICAgICB0aGlzLl9hZGRSZWN0YW5nbGVGbG9hdChcbiAgICAgICAgdmVydGljZXMuYXR0cmlidXRlcyxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICAoY3Vyc29yLnggKyBjdXJzb3Iud2lkdGgpICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCAtIGN1cnNvci5kcHIsXG4gICAgICAgIGN1cnNvci55ICogdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQsXG4gICAgICAgIGN1cnNvci5kcHIsXG4gICAgICAgIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LFxuICAgICAgICB0aGlzLl9jdXJzb3JGbG9hdFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2ZXJ0aWNlcy5jb3VudCA9IHJlY3RhbmdsZUNvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUmVjdGFuZ2xlKHZlcnRpY2VzOiBWZXJ0aWNlcywgb2Zmc2V0OiBudW1iZXIsIGZnOiBudW1iZXIsIGJnOiBudW1iZXIsIHN0YXJ0WDogbnVtYmVyLCBlbmRYOiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChmZyAmIEZnRmxhZ3MuSU5WRVJTRSkge1xuICAgICAgc3dpdGNoIChmZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICAkcmdiYSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVtmZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0tdLnJnYmE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgJHJnYmEgPSAoZmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSA8PCA4O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAkcmdiYSA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgICRyZ2JhID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW2JnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgICAkcmdiYSA9IChiZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIDw8IDg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICRyZ2JhID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5iYWNrZ3JvdW5kLnJnYmE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZlcnRpY2VzLmF0dHJpYnV0ZXMubGVuZ3RoIDwgb2Zmc2V0ICsgNCkge1xuICAgICAgdmVydGljZXMuYXR0cmlidXRlcyA9IGV4cGFuZEZsb2F0MzJBcnJheSh2ZXJ0aWNlcy5hdHRyaWJ1dGVzLCB0aGlzLl90ZXJtaW5hbC5yb3dzICogdGhpcy5fdGVybWluYWwuY29scyAqIElORElDRVNfUEVSX1JFQ1RBTkdMRSk7XG4gICAgfVxuICAgICR4MSA9IHN0YXJ0WCAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGg7XG4gICAgJHkxID0geSAqIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0O1xuICAgICRyID0gKCgkcmdiYSA+PiAyNCkgJiAweEZGKSAvIDI1NTtcbiAgICAkZyA9ICgoJHJnYmEgPj4gMTYpICYgMHhGRikgLyAyNTU7XG4gICAgJGIgPSAoKCRyZ2JhID4+IDggKSAmIDB4RkYpIC8gMjU1O1xuICAgICRhID0gMTtcblxuICAgIHRoaXMuX2FkZFJlY3RhbmdsZSh2ZXJ0aWNlcy5hdHRyaWJ1dGVzLCBvZmZzZXQsICR4MSwgJHkxLCAoZW5kWCAtIHN0YXJ0WCkgKiB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoLCB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCwgJHIsICRnLCAkYiwgJGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkUmVjdGFuZ2xlKGFycmF5OiBGbG9hdDMyQXJyYXksIG9mZnNldDogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyKTogdm9pZCB7XG4gICAgYXJyYXlbb2Zmc2V0ICAgIF0gPSB4MSAvIHRoaXMuX2RpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy53aWR0aDtcbiAgICBhcnJheVtvZmZzZXQgKyAxXSA9IHkxIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICBhcnJheVtvZmZzZXQgKyAyXSA9IHdpZHRoIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgIGFycmF5W29mZnNldCArIDNdID0gaGVpZ2h0IC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICBhcnJheVtvZmZzZXQgKyA0XSA9IHI7XG4gICAgYXJyYXlbb2Zmc2V0ICsgNV0gPSBnO1xuICAgIGFycmF5W29mZnNldCArIDZdID0gYjtcbiAgICBhcnJheVtvZmZzZXQgKyA3XSA9IGE7XG4gIH1cblxuICBwcml2YXRlIF9hZGRSZWN0YW5nbGVGbG9hdChhcnJheTogRmxvYXQzMkFycmF5LCBvZmZzZXQ6IG51bWJlciwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGNvbG9yOiBGbG9hdDMyQXJyYXkpOiB2b2lkIHtcbiAgICBhcnJheVtvZmZzZXQgICAgXSA9IHgxIC8gdGhpcy5fZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoO1xuICAgIGFycmF5W29mZnNldCArIDFdID0geTEgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgIGFycmF5W29mZnNldCArIDJdID0gd2lkdGggLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgYXJyYXlbb2Zmc2V0ICsgM10gPSBoZWlnaHQgLyB0aGlzLl9kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0O1xuICAgIGFycmF5W29mZnNldCArIDRdID0gY29sb3JbMF07XG4gICAgYXJyYXlbb2Zmc2V0ICsgNV0gPSBjb2xvclsxXTtcbiAgICBhcnJheVtvZmZzZXQgKyA2XSA9IGNvbG9yWzJdO1xuICAgIGFycmF5W29mZnNldCArIDddID0gY29sb3JbM107XG4gIH1cblxuICBwcml2YXRlIF9jb2xvclRvRmxvYXQzMkFycmF5KGNvbG9yOiBJQ29sb3IpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgICgoY29sb3IucmdiYSA+PiAyNCkgJiAweEZGKSAvIDI1NSxcbiAgICAgICgoY29sb3IucmdiYSA+PiAxNikgJiAweEZGKSAvIDI1NSxcbiAgICAgICgoY29sb3IucmdiYSA+PiA4ICkgJiAweEZGKSAvIDI1NSxcbiAgICAgICgoY29sb3IucmdiYSAgICAgICkgJiAweEZGKSAvIDI1NVxuICAgIF0pO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ3Vyc29yUmVuZGVyTW9kZWwsIElSZW5kZXJNb2RlbCB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgSVNlbGVjdGlvblJlbmRlck1vZGVsIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlU2VsZWN0aW9uUmVuZGVyTW9kZWwgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9TZWxlY3Rpb25SZW5kZXJNb2RlbCc7XG5cbmV4cG9ydCBjb25zdCBSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEwgPSA0O1xuZXhwb3J0IGNvbnN0IFJFTkRFUl9NT0RFTF9CR19PRkZTRVQgPSAxO1xuZXhwb3J0IGNvbnN0IFJFTkRFUl9NT0RFTF9GR19PRkZTRVQgPSAyO1xuZXhwb3J0IGNvbnN0IFJFTkRFUl9NT0RFTF9FWFRfT0ZGU0VUID0gMztcblxuZXhwb3J0IGNvbnN0IENPTUJJTkVEX0NIQVJfQklUX01BU0sgPSAweDgwMDAwMDAwO1xuXG5leHBvcnQgY2xhc3MgUmVuZGVyTW9kZWwgaW1wbGVtZW50cyBJUmVuZGVyTW9kZWwge1xuICBwdWJsaWMgY2VsbHM6IFVpbnQzMkFycmF5O1xuICBwdWJsaWMgbGluZUxlbmd0aHM6IFVpbnQzMkFycmF5O1xuICBwdWJsaWMgc2VsZWN0aW9uOiBJU2VsZWN0aW9uUmVuZGVyTW9kZWw7XG4gIHB1YmxpYyBjdXJzb3I/OiBJQ3Vyc29yUmVuZGVyTW9kZWw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jZWxscyA9IG5ldyBVaW50MzJBcnJheSgwKTtcbiAgICB0aGlzLmxpbmVMZW5ndGhzID0gbmV3IFVpbnQzMkFycmF5KDApO1xuICAgIHRoaXMuc2VsZWN0aW9uID0gY3JlYXRlU2VsZWN0aW9uUmVuZGVyTW9kZWwoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleENvdW50ID0gY29scyAqIHJvd3MgKiBSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEw7XG4gICAgaWYgKGluZGV4Q291bnQgIT09IHRoaXMuY2VsbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNlbGxzID0gbmV3IFVpbnQzMkFycmF5KGluZGV4Q291bnQpO1xuICAgICAgdGhpcy5saW5lTGVuZ3RocyA9IG5ldyBVaW50MzJBcnJheShyb3dzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jZWxscy5maWxsKDAsIDApO1xuICAgIHRoaXMubGluZUxlbmd0aHMuZmlsbCgwLCAwKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyIH0gZnJvbSAnYnJvd3Nlci9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSVRlcm1pbmFsIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBDZWxsQ29sb3JSZXNvbHZlciB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NlbGxDb2xvclJlc29sdmVyJztcbmltcG9ydCB7IGFjcXVpcmVUZXh0dXJlQXRsYXMsIHJlbW92ZVRlcm1pbmFsRnJvbUNhY2hlIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ2hhckF0bGFzQ2FjaGUnO1xuaW1wb3J0IHsgQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DdXJzb3JCbGlua1N0YXRlTWFuYWdlcic7XG5pbXBvcnQgeyBvYnNlcnZlRGV2aWNlUGl4ZWxEaW1lbnNpb25zIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvRGV2aWNlUGl4ZWxPYnNlcnZlcic7XG5pbXBvcnQgeyBjcmVhdGVSZW5kZXJEaW1lbnNpb25zIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucywgSVJlbmRlcmVyLCBJUmVxdWVzdFJlZHJhd0V2ZW50LCBJVGV4dHVyZUF0bGFzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNoYXJTaXplU2VydmljZSwgSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsIElDb3JlQnJvd3NlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgZm9yd2FyZEV2ZW50IH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCBNdXRhYmxlRGlzcG9zYWJsZSwgZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBDaGFyRGF0YSwgSUJ1ZmZlckxpbmUsIElDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhJztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBDb250ZW50LCBOVUxMX0NFTExfQ0hBUiwgTlVMTF9DRUxMX0NPREUgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBJQ29yZVNlcnZpY2UsIElEZWNvcmF0aW9uU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IEdseXBoUmVuZGVyZXIgfSBmcm9tICcuL0dseXBoUmVuZGVyZXInO1xuaW1wb3J0IHsgUmVjdGFuZ2xlUmVuZGVyZXIgfSBmcm9tICcuL1JlY3RhbmdsZVJlbmRlcmVyJztcbmltcG9ydCB7IENPTUJJTkVEX0NIQVJfQklUX01BU0ssIFJFTkRFUl9NT0RFTF9CR19PRkZTRVQsIFJFTkRFUl9NT0RFTF9FWFRfT0ZGU0VULCBSRU5ERVJfTU9ERUxfRkdfT0ZGU0VULCBSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEwsIFJlbmRlck1vZGVsIH0gZnJvbSAnLi9SZW5kZXJNb2RlbCc7XG5pbXBvcnQgeyBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgTGlua1JlbmRlckxheWVyIH0gZnJvbSAnLi9yZW5kZXJMYXllci9MaW5rUmVuZGVyTGF5ZXInO1xuaW1wb3J0IHsgSVJlbmRlckxheWVyIH0gZnJvbSAnLi9yZW5kZXJMYXllci9UeXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJnbFJlbmRlcmVyIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElSZW5kZXJlciB7XG4gIHByaXZhdGUgX3JlbmRlckxheWVyczogSVJlbmRlckxheWVyW107XG4gIHByaXZhdGUgX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyOiBNdXRhYmxlRGlzcG9zYWJsZTxDdXJzb3JCbGlua1N0YXRlTWFuYWdlcj4gPSBuZXcgTXV0YWJsZURpc3Bvc2FibGUoKTtcbiAgcHJpdmF0ZSBfY2hhckF0bGFzRGlzcG9zYWJsZSA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuICBwcml2YXRlIF9jaGFyQXRsYXM6IElUZXh0dXJlQXRsYXMgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2RldmljZVBpeGVsUmF0aW86IG51bWJlcjtcbiAgcHJpdmF0ZSBfb2JzZXJ2ZXJEaXNwb3NhYmxlID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG5cbiAgcHJpdmF0ZSBfbW9kZWw6IFJlbmRlck1vZGVsID0gbmV3IFJlbmRlck1vZGVsKCk7XG4gIHByaXZhdGUgX3dvcmtDZWxsOiBJQ2VsbERhdGEgPSBuZXcgQ2VsbERhdGEoKTtcbiAgcHJpdmF0ZSBfd29ya0NlbGwyOiBJQ2VsbERhdGEgPSBuZXcgQ2VsbERhdGEoKTtcbiAgcHJpdmF0ZSBfY2VsbENvbG9yUmVzb2x2ZXI6IENlbGxDb2xvclJlc29sdmVyO1xuXG4gIHByaXZhdGUgX2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHByaXZhdGUgX2dsOiBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgcHJpdmF0ZSBfcmVjdGFuZ2xlUmVuZGVyZXI6IE11dGFibGVEaXNwb3NhYmxlPFJlY3RhbmdsZVJlbmRlcmVyPiA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuICBwcml2YXRlIF9nbHlwaFJlbmRlcmVyOiBNdXRhYmxlRGlzcG9zYWJsZTxHbHlwaFJlbmRlcmVyPiA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuXG4gIHB1YmxpYyByZWFkb25seSBkaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucztcblxuICBwcml2YXRlIF9jb3JlOiBJVGVybWluYWw7XG4gIHByaXZhdGUgX2lzQXR0YWNoZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2NvbnRleHRSZXN0b3JhdGlvblRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYW5nZVRleHR1cmVBdGxhcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNoYW5nZVRleHR1cmVBdGxhcyA9IHRoaXMuX29uQ2hhbmdlVGV4dHVyZUF0bGFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkFkZFRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxIVE1MQ2FudmFzRWxlbWVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcyA9IHRoaXMuX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RSZWRyYXcgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SVJlcXVlc3RSZWRyYXdFdmVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RSZWRyYXcgPSB0aGlzLl9vblJlcXVlc3RSZWRyYXcuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ29udGV4dExvc3MgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNvbnRleHRMb3NzID0gdGhpcy5fb25Db250ZXh0TG9zcy5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF90ZXJtaW5hbDogVGVybWluYWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhcmFjdGVySm9pbmVyU2VydmljZTogSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhclNpemVTZXJ2aWNlOiBJQ2hhclNpemVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb3JlU2VydmljZTogSUNvcmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlY29yYXRpb25TZXJ2aWNlOiBJRGVjb3JhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2UsXG4gICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyPzogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90aGVtZVNlcnZpY2Uub25DaGFuZ2VDb2xvcnMoKCkgPT4gdGhpcy5faGFuZGxlQ29sb3JDaGFuZ2UoKSkpO1xuXG4gICAgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIgPSBuZXcgQ2VsbENvbG9yUmVzb2x2ZXIodGhpcy5fdGVybWluYWwsIHRoaXMuX29wdGlvbnNTZXJ2aWNlLCB0aGlzLl9tb2RlbC5zZWxlY3Rpb24sIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UsIHRoaXMuX3RoZW1lU2VydmljZSk7XG5cbiAgICB0aGlzLl9jb3JlID0gKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmU7XG5cbiAgICB0aGlzLl9yZW5kZXJMYXllcnMgPSBbXG4gICAgICBuZXcgTGlua1JlbmRlckxheWVyKHRoaXMuX2NvcmUuc2NyZWVuRWxlbWVudCEsIDIsIHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl9jb3JlLmxpbmtpZmllciEsIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSwgX29wdGlvbnNTZXJ2aWNlLCB0aGlzLl90aGVtZVNlcnZpY2UpXG4gICAgXTtcbiAgICB0aGlzLmRpbWVuc2lvbnMgPSBjcmVhdGVSZW5kZXJEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbyA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHI7XG4gICAgdGhpcy5fdXBkYXRlRGltZW5zaW9ucygpO1xuICAgIHRoaXMuX3VwZGF0ZUN1cnNvckJsaW5rKCk7XG4gICAgdGhpcy5yZWdpc3Rlcihfb3B0aW9uc1NlcnZpY2Uub25PcHRpb25DaGFuZ2UoKCkgPT4gdGhpcy5faGFuZGxlT3B0aW9uc0NoYW5nZWQoKSkpO1xuXG4gICAgdGhpcy5fY2FudmFzID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblxuICAgIGNvbnN0IGNvbnRleHRBdHRyaWJ1dGVzID0ge1xuICAgICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICAgIGRlcHRoOiBmYWxzZSxcbiAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlclxuICAgIH07XG4gICAgdGhpcy5fZ2wgPSB0aGlzLl9jYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wyJywgY29udGV4dEF0dHJpYnV0ZXMpIGFzIElXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICAgIGlmICghdGhpcy5fZ2wpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViR0wyIG5vdCBzdXBwb3J0ZWQgJyArIHRoaXMuX2dsKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLl9jYW52YXMsICd3ZWJnbGNvbnRleHRsb3N0JywgKGUpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCd3ZWJnbGNvbnRleHRsb3N0IGV2ZW50IHJlY2VpdmVkJyk7XG4gICAgICAvLyBQcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGluIG9yZGVyIHRvIGVuYWJsZSBXZWJHTCBjb250ZXh0IHJlc3RvcmF0aW9uLlxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gV2FpdCBhIGZldyBzZWNvbmRzIHRvIHNlZSBpZiB0aGUgJ3dlYmdsY29udGV4dHJlc3RvcmVkJyBldmVudCBpcyBmaXJlZC5cbiAgICAgIC8vIElmIG5vdCwgZGlzcGF0Y2ggdGhlIG9uQ29udGV4dExvc3Mgbm90aWZpY2F0aW9uIHRvIG9ic2VydmVycy5cbiAgICAgIHRoaXMuX2NvbnRleHRSZXN0b3JhdGlvblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fY29udGV4dFJlc3RvcmF0aW9uVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc29sZS53YXJuKCd3ZWJnbCBjb250ZXh0IG5vdCByZXN0b3JlZDsgZmlyaW5nIG9uQ29udGV4dExvc3MnKTtcbiAgICAgICAgdGhpcy5fb25Db250ZXh0TG9zcy5maXJlKGUpO1xuICAgICAgfSwgMzAwMCAvKiBtcyAqLyk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuX2NhbnZhcywgJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgKGUpID0+IHtcbiAgICAgIGNvbnNvbGUud2Fybignd2ViZ2xjb250ZXh0cmVzdG9yZWQgZXZlbnQgcmVjZWl2ZWQnKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jb250ZXh0UmVzdG9yYXRpb25UaW1lb3V0KTtcbiAgICAgIHRoaXMuX2NvbnRleHRSZXN0b3JhdGlvblRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAvLyBUaGUgdGV4dHVyZSBhdGxhcyBhbmQgZ2x5cGggcmVuZGVyZXIgbXVzdCBiZSBmdWxseSByZWluaXRpYWxpemVkXG4gICAgICAvLyBiZWNhdXNlIHRoZWlyIGNvbnRlbnRzIGhhdmUgYmVlbiBsb3N0LlxuICAgICAgcmVtb3ZlVGVybWluYWxGcm9tQ2FjaGUodGhpcy5fdGVybWluYWwpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZVdlYkdMU3RhdGUoKTtcbiAgICAgIHRoaXMuX3JlcXVlc3RSZWRyYXdWaWV3cG9ydCgpO1xuICAgIH0pKTtcblxuICAgIHRoaXMuX29ic2VydmVyRGlzcG9zYWJsZS52YWx1ZSA9IG9ic2VydmVEZXZpY2VQaXhlbERpbWVuc2lvbnModGhpcy5fY2FudmFzLCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LCAodywgaCkgPT4gdGhpcy5fc2V0Q2FudmFzRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHcsIGgpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5vbldpbmRvd0NoYW5nZSh3ID0+IHtcbiAgICAgIHRoaXMuX29ic2VydmVyRGlzcG9zYWJsZS52YWx1ZSA9IG9ic2VydmVEZXZpY2VQaXhlbERpbWVuc2lvbnModGhpcy5fY2FudmFzLCB3LCAodywgaCkgPT4gdGhpcy5fc2V0Q2FudmFzRGV2aWNlUGl4ZWxEaW1lbnNpb25zKHcsIGgpKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLl9jb3JlLnNjcmVlbkVsZW1lbnQhLmFwcGVuZENoaWxkKHRoaXMuX2NhbnZhcyk7XG5cbiAgICBbdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUsIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWVdID0gdGhpcy5faW5pdGlhbGl6ZVdlYkdMU3RhdGUoKTtcblxuICAgIHRoaXMuX2lzQXR0YWNoZWQgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fY29yZS5zY3JlZW5FbGVtZW50ISk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5fcmVuZGVyTGF5ZXJzKSB7XG4gICAgICAgIGwuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2FudmFzLnBhcmVudEVsZW1lbnQ/LnJlbW92ZUNoaWxkKHRoaXMuX2NhbnZhcyk7XG4gICAgICByZW1vdmVUZXJtaW5hbEZyb21DYWNoZSh0aGlzLl90ZXJtaW5hbCk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIGdldCB0ZXh0dXJlQXRsYXMoKTogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jaGFyQXRsYXM/LnBhZ2VzWzBdLmNhbnZhcztcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNvbG9yQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlZnJlc2hDaGFyQXRsYXMoKTtcblxuICAgIC8vIEZvcmNlIGEgZnVsbCByZWZyZXNoXG4gICAgdGhpcy5fY2xlYXJNb2RlbCh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVEZXZpY2VQaXhlbFJhdGlvQ2hhbmdlKCk6IHZvaWQge1xuICAgIC8vIElmIHRoZSBkZXZpY2UgcGl4ZWwgcmF0aW8gY2hhbmdlZCwgdGhlIGNoYXIgYXRsYXMgbmVlZHMgdG8gYmUgcmVnZW5lcmF0ZWRcbiAgICAvLyBhbmQgdGhlIHRlcm1pbmFsIG5lZWRzIHRvIHJlZnJlc2hlZFxuICAgIGlmICh0aGlzLl9kZXZpY2VQaXhlbFJhdGlvICE9PSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByKSB7XG4gICAgICB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjtcbiAgICAgIHRoaXMuaGFuZGxlUmVzaXplKHRoaXMuX3Rlcm1pbmFsLmNvbHMsIHRoaXMuX3Rlcm1pbmFsLnJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVSZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgY2hhcmFjdGVyIGFuZCBjYW52YXMgZGltZW5zaW9uc1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcblxuICAgIHRoaXMuX21vZGVsLnJlc2l6ZSh0aGlzLl90ZXJtaW5hbC5jb2xzLCB0aGlzLl90ZXJtaW5hbC5yb3dzKTtcblxuICAgIC8vIFJlc2l6ZSBhbGwgcmVuZGVyIGxheWVyc1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwucmVzaXplKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLmRpbWVuc2lvbnMpO1xuICAgIH1cblxuICAgIC8vIFJlc2l6ZSB0aGUgY2FudmFzXG4gICAgdGhpcy5fY2FudmFzLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICB0aGlzLl9jYW52YXMuc3R5bGUud2lkdGggPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aH1weGA7XG4gICAgdGhpcy5fY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke3RoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodH1weGA7XG5cbiAgICAvLyBSZXNpemUgdGhlIHNjcmVlblxuICAgIHRoaXMuX2NvcmUuc2NyZWVuRWxlbWVudCEuc3R5bGUud2lkdGggPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aH1weGA7XG4gICAgdGhpcy5fY29yZS5zY3JlZW5FbGVtZW50IS5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHR9cHhgO1xuXG4gICAgdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWU/LnNldERpbWVuc2lvbnModGhpcy5kaW1lbnNpb25zKTtcbiAgICB0aGlzLl9yZWN0YW5nbGVSZW5kZXJlci52YWx1ZT8uaGFuZGxlUmVzaXplKCk7XG4gICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZT8uc2V0RGltZW5zaW9ucyh0aGlzLmRpbWVuc2lvbnMpO1xuICAgIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWU/LmhhbmRsZVJlc2l6ZSgpO1xuXG4gICAgdGhpcy5fcmVmcmVzaENoYXJBdGxhcygpO1xuXG4gICAgLy8gRm9yY2UgYSBmdWxsIHJlZnJlc2guIFJlc2l6aW5nIGBfZ2x5cGhSZW5kZXJlcmAgc2hvdWxkIGNsZWFyIGl0IGFscmVhZHksXG4gICAgLy8gc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjbGVhciBpdCBhZ2FpbiBoZXJlLlxuICAgIHRoaXMuX2NsZWFyTW9kZWwoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUNoYXJTaXplQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZVJlc2l6ZSh0aGlzLl90ZXJtaW5hbC5jb2xzLCB0aGlzLl90ZXJtaW5hbC5yb3dzKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVCbHVyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlQmx1cih0aGlzLl90ZXJtaW5hbCk7XG4gICAgfVxuICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlPy5wYXVzZSgpO1xuICAgIC8vIFJlcXVlc3QgYSByZWRyYXcgZm9yIGFjdGl2ZS9pbmFjdGl2ZSBzZWxlY3Rpb24gYmFja2dyb3VuZFxuICAgIHRoaXMuX3JlcXVlc3RSZWRyYXdWaWV3cG9ydCgpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUZvY3VzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlRm9jdXModGhpcy5fdGVybWluYWwpO1xuICAgIH1cbiAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci52YWx1ZT8ucmVzdW1lKCk7XG4gICAgLy8gUmVxdWVzdCBhIHJlZHJhdyBmb3IgYWN0aXZlL2luYWN0aXZlIHNlbGVjdGlvbiBiYWNrZ3JvdW5kXG4gICAgdGhpcy5fcmVxdWVzdFJlZHJhd1ZpZXdwb3J0KCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsIG9mIHRoaXMuX3JlbmRlckxheWVycykge1xuICAgICAgbC5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHRoaXMuX3Rlcm1pbmFsLCBzdGFydCwgZW5kLCBjb2x1bW5TZWxlY3RNb2RlKTtcbiAgICB9XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uLnVwZGF0ZSh0aGlzLl9jb3JlLCBzdGFydCwgZW5kLCBjb2x1bW5TZWxlY3RNb2RlKTtcbiAgICB0aGlzLl9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDdXJzb3JNb3ZlKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlQ3Vyc29yTW92ZSh0aGlzLl90ZXJtaW5hbCk7XG4gICAgfVxuICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlPy5yZXN0YXJ0QmxpbmtBbmltYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl9yZWZyZXNoQ2hhckF0bGFzKCk7XG4gICAgdGhpcy5fdXBkYXRlQ3Vyc29yQmxpbmsoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBtZW1iZXJzIGRlcGVuZGVudCBvbiBXZWJHTCBjb250ZXh0IHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZVdlYkdMU3RhdGUoKTogW1JlY3RhbmdsZVJlbmRlcmVyLCBHbHlwaFJlbmRlcmVyXSB7XG4gICAgdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUgPSBuZXcgUmVjdGFuZ2xlUmVuZGVyZXIodGhpcy5fdGVybWluYWwsIHRoaXMuX2dsLCB0aGlzLmRpbWVuc2lvbnMsIHRoaXMuX3RoZW1lU2VydmljZSk7XG4gICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZSA9IG5ldyBHbHlwaFJlbmRlcmVyKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl9nbCwgdGhpcy5kaW1lbnNpb25zLCB0aGlzLl9vcHRpb25zU2VydmljZSk7XG5cbiAgICAvLyBVcGRhdGUgZGltZW5zaW9ucyBhbmQgYWNxdWlyZSBjaGFyIGF0bGFzXG4gICAgdGhpcy5oYW5kbGVDaGFyU2l6ZUNoYW5nZWQoKTtcblxuICAgIHJldHVybiBbdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUsIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgY2hhciBhdGxhcywgYXF1aXJpbmcgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIHByaXZhdGUgX3JlZnJlc2hDaGFyQXRsYXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci53aWR0aCA8PSAwICYmIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5oZWlnaHQgPD0gMCkge1xuICAgICAgLy8gTWFyayBhcyBub3QgYXR0YWNoZWQgc28gY2hhciBhdGxhcyBnZXRzIHJlZnJlc2hlZCBvbiBuZXh0IHJlbmRlclxuICAgICAgdGhpcy5faXNBdHRhY2hlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGF0bGFzID0gYWNxdWlyZVRleHR1cmVBdGxhcyhcbiAgICAgIHRoaXMuX3Rlcm1pbmFsLFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucyxcbiAgICAgIHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMsXG4gICAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGgsXG4gICAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LFxuICAgICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLndpZHRoLFxuICAgICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCxcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHJcbiAgICApO1xuICAgIGlmICh0aGlzLl9jaGFyQXRsYXMgIT09IGF0bGFzKSB7XG4gICAgICB0aGlzLl9vbkNoYW5nZVRleHR1cmVBdGxhcy5maXJlKGF0bGFzLnBhZ2VzWzBdLmNhbnZhcyk7XG4gICAgICB0aGlzLl9jaGFyQXRsYXNEaXNwb3NhYmxlLnZhbHVlID0gZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZShbXG4gICAgICAgIGZvcndhcmRFdmVudChhdGxhcy5vbkFkZFRleHR1cmVBdGxhc0NhbnZhcywgdGhpcy5fb25BZGRUZXh0dXJlQXRsYXNDYW52YXMpLFxuICAgICAgICBmb3J3YXJkRXZlbnQoYXRsYXMub25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMsIHRoaXMuX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzKVxuICAgICAgXSk7XG4gICAgfVxuICAgIHRoaXMuX2NoYXJBdGxhcyA9IGF0bGFzO1xuICAgIHRoaXMuX2NoYXJBdGxhcy53YXJtVXAoKTtcbiAgICB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlPy5zZXRBdGxhcyh0aGlzLl9jaGFyQXRsYXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBtb2RlbC5cbiAgICogQHBhcmFtIGNsZWFyR2x5cGhSZW5kZXJlciBXaGV0aGVyIHRvIGFsc28gY2xlYXIgdGhlIGdseXBoIHJlbmRlcmVyLiBUaGlzXG4gICAqIHNob3VsZCBiZSB0cnVlIGdlbmVyYWxseSB0byBtYWtlIHN1cmUgaXQgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgdGhlIG1vZGVsLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2xlYXJNb2RlbChjbGVhckdseXBoUmVuZGVyZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RlbC5jbGVhcigpO1xuICAgIGlmIChjbGVhckdseXBoUmVuZGVyZXIpIHtcbiAgICAgIHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWU/LmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyVGV4dHVyZUF0bGFzKCk6IHZvaWQge1xuICAgIHRoaXMuX2NoYXJBdGxhcz8uY2xlYXJUZXh0dXJlKCk7XG4gICAgdGhpcy5fY2xlYXJNb2RlbCh0cnVlKTtcbiAgICB0aGlzLl9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhck1vZGVsKHRydWUpO1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwucmVzZXQodGhpcy5fdGVybWluYWwpO1xuICAgIH1cblxuICAgIHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlPy5yZXN0YXJ0QmxpbmtBbmltYXRpb24oKTtcbiAgICB0aGlzLl91cGRhdGVDdXJzb3JCbGluaygpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyKGhhbmRsZXI6ICh0ZXh0OiBzdHJpbmcpID0+IFtudW1iZXIsIG51bWJlcl1bXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcHVibGljIGRlcmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIoam9pbmVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXJSb3dzKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0F0dGFjaGVkKSB7XG4gICAgICBpZiAodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5kb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMuX2NvcmUuc2NyZWVuRWxlbWVudCEpICYmIHRoaXMuX2NoYXJTaXplU2VydmljZS53aWR0aCAmJiB0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICAgICAgdGhpcy5fcmVmcmVzaENoYXJBdGxhcygpO1xuICAgICAgICB0aGlzLl9pc0F0dGFjaGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcmVuZGVyIGxheWVyc1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLl9yZW5kZXJMYXllcnMpIHtcbiAgICAgIGwuaGFuZGxlR3JpZENoYW5nZWQodGhpcy5fdGVybWluYWwsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZSB8fCAhdGhpcy5fcmVjdGFuZ2xlUmVuZGVyZXIudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUZWxsIHJlbmRlcmVyIHRoZSBmcmFtZSBpcyBiZWdpbm5pbmdcbiAgICAvLyB1cG9uIGEgbW9kZWwgY2xlYXIgYWxzbyByZWZyZXNoIHRoZSBmdWxsIHZpZXdwb3J0IG1vZGVsXG4gICAgLy8gKGFsc28gdHJpZ2dlcmVkIGJ5IGFuIGF0bGFzIHBhZ2UgbWVyZ2UsIHBhcnQgb2YgIzQ0ODApXG4gICAgaWYgKHRoaXMuX2dseXBoUmVuZGVyZXIudmFsdWUuYmVnaW5GcmFtZSgpKSB7XG4gICAgICB0aGlzLl9jbGVhck1vZGVsKHRydWUpO1xuICAgICAgdGhpcy5fdXBkYXRlTW9kZWwoMCwgdGhpcy5fdGVybWluYWwucm93cyAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IHVwZGF0ZSBjaGFuZ2VkIGxpbmVzIHRvIGRyYXdcbiAgICAgIHRoaXMuX3VwZGF0ZU1vZGVsKHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8vIFJlbmRlclxuICAgIHRoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlLnJlbmRlckJhY2tncm91bmRzKCk7XG4gICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZS5yZW5kZXIodGhpcy5fbW9kZWwpO1xuICAgIGlmICghdGhpcy5fY3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIudmFsdWUgfHwgdGhpcy5fY3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIudmFsdWUuaXNDdXJzb3JWaXNpYmxlKSB7XG4gICAgICB0aGlzLl9yZWN0YW5nbGVSZW5kZXJlci52YWx1ZS5yZW5kZXJDdXJzb3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDdXJzb3JCbGluaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdGVybWluYWwub3B0aW9ucy5jdXJzb3JCbGluaykge1xuICAgICAgdGhpcy5fY3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIudmFsdWUgPSBuZXcgQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIoKCkgPT4ge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0UmVkcmF3Q3Vyc29yKCk7XG4gICAgICB9LCB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdXJzb3JCbGlua1N0YXRlTWFuYWdlci5jbGVhcigpO1xuICAgIH1cbiAgICAvLyBSZXF1ZXN0IGEgcmVmcmVzaCBmcm9tIHRoZSB0ZXJtaW5hbCBhcyBtYW5hZ2VtZW50IG9mIHJlbmRlcmluZyBpcyBiZWluZ1xuICAgIC8vIG1vdmVkIGJhY2sgdG8gdGhlIHRlcm1pbmFsXG4gICAgdGhpcy5fcmVxdWVzdFJlZHJhd0N1cnNvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlTW9kZWwoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXJtaW5hbCA9IHRoaXMuX2NvcmU7XG4gICAgbGV0IGNlbGw6IElDZWxsRGF0YSA9IHRoaXMuX3dvcmtDZWxsO1xuXG4gICAgLy8gRGVjbGFyZSB2YXJpYWJsZSBhaGVhZCBvZiB0aW1lIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgIGxldCBsYXN0Qmc6IG51bWJlcjtcbiAgICBsZXQgeTogbnVtYmVyO1xuICAgIGxldCByb3c6IG51bWJlcjtcbiAgICBsZXQgbGluZTogSUJ1ZmZlckxpbmU7XG4gICAgbGV0IGpvaW5lZFJhbmdlczogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIGxldCBpc0pvaW5lZDogYm9vbGVhbjtcbiAgICBsZXQgbGFzdENoYXJYOiBudW1iZXI7XG4gICAgbGV0IHJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIGxldCBjaGFyczogc3RyaW5nO1xuICAgIGxldCBjb2RlOiBudW1iZXI7XG4gICAgbGV0IHdpZHRoOiBudW1iZXI7XG4gICAgbGV0IGk6IG51bWJlcjtcbiAgICBsZXQgeDogbnVtYmVyO1xuICAgIGxldCBqOiBudW1iZXI7XG4gICAgc3RhcnQgPSBjbGFtcChzdGFydCwgdGVybWluYWwucm93cyAtIDEsIDApO1xuICAgIGVuZCA9IGNsYW1wKGVuZCwgdGVybWluYWwucm93cyAtIDEsIDApO1xuXG4gICAgY29uc3QgY3Vyc29yWSA9IHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5hY3RpdmUuYmFzZVkgKyB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmN1cnNvclk7XG4gICAgY29uc3Qgdmlld3BvcnRSZWxhdGl2ZUN1cnNvclkgPSBjdXJzb3JZIC0gdGVybWluYWwuYnVmZmVyLnlkaXNwO1xuICAgIC8vIGluIGNhc2UgY3Vyc29yLnggPT0gY29scyBhZGp1c3QgdmlzdWFsIGN1cnNvciB0byBjb2xzIC0gMVxuICAgIGNvbnN0IGN1cnNvclggPSBNYXRoLm1pbih0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWN0aXZlLmN1cnNvclgsIHRlcm1pbmFsLmNvbHMgLSAxKTtcbiAgICBsZXQgbGFzdEN1cnNvclggPSAtMTtcbiAgICBjb25zdCBpc0N1cnNvclZpc2libGUgPVxuICAgICAgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZCAmJlxuICAgICAgIXRoaXMuX2NvcmVTZXJ2aWNlLmlzQ3Vyc29ySGlkZGVuICYmXG4gICAgICAoIXRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlIHx8IHRoaXMuX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyLnZhbHVlLmlzQ3Vyc29yVmlzaWJsZSk7XG4gICAgdGhpcy5fbW9kZWwuY3Vyc29yID0gdW5kZWZpbmVkO1xuICAgIGxldCBtb2RlbFVwZGF0ZWQgPSBmYWxzZTtcblxuICAgIGZvciAoeSA9IHN0YXJ0OyB5IDw9IGVuZDsgeSsrKSB7XG4gICAgICByb3cgPSB5ICsgdGVybWluYWwuYnVmZmVyLnlkaXNwO1xuICAgICAgbGluZSA9IHRlcm1pbmFsLmJ1ZmZlci5saW5lcy5nZXQocm93KSE7XG4gICAgICB0aGlzLl9tb2RlbC5saW5lTGVuZ3Roc1t5XSA9IDA7XG4gICAgICBqb2luZWRSYW5nZXMgPSB0aGlzLl9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLmdldEpvaW5lZENoYXJhY3RlcnMocm93KTtcbiAgICAgIGZvciAoeCA9IDA7IHggPCB0ZXJtaW5hbC5jb2xzOyB4KyspIHtcbiAgICAgICAgbGFzdEJnID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnO1xuICAgICAgICBsaW5lLmxvYWRDZWxsKHgsIGNlbGwpO1xuXG4gICAgICAgIGlmICh4ID09PSAwKSB7XG4gICAgICAgICAgbGFzdEJnID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgY2hhcmFjdGVyKHMpIHRvIGRyYXcgd2VyZSBqb2luZWQuXG4gICAgICAgIGlzSm9pbmVkID0gZmFsc2U7XG4gICAgICAgIGxhc3RDaGFyWCA9IHg7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBhbnkgam9pbmVkIGNoYXJhY3RlciByYW5nZXMgYXMgbmVlZGVkLiBCZWNhdXNlIG9mIGhvdyB0aGVcbiAgICAgICAgLy8gcmFuZ2VzIGFyZSBwcm9kdWNlZCwgd2Uga25vdyB0aGF0IHRoZXkgYXJlIHZhbGlkIGZvciB0aGUgY2hhcmFjdGVyc1xuICAgICAgICAvLyBhbmQgYXR0cmlidXRlcyBvZiBvdXIgaW5wdXQuXG4gICAgICAgIGlmIChqb2luZWRSYW5nZXMubGVuZ3RoID4gMCAmJiB4ID09PSBqb2luZWRSYW5nZXNbMF1bMF0pIHtcbiAgICAgICAgICBpc0pvaW5lZCA9IHRydWU7XG4gICAgICAgICAgcmFuZ2UgPSBqb2luZWRSYW5nZXMuc2hpZnQoKSE7XG5cbiAgICAgICAgICAvLyBXZSBhbHJlYWR5IGtub3cgdGhlIGV4YWN0IHN0YXJ0IGFuZCBlbmQgY29sdW1uIG9mIHRoZSBqb2luZWQgcmFuZ2UsXG4gICAgICAgICAgLy8gc28gd2UgZ2V0IHRoZSBzdHJpbmcgYW5kIHdpZHRoIHJlcHJlc2VudGluZyBpdCBkaXJlY3RseS5cbiAgICAgICAgICBjZWxsID0gbmV3IEpvaW5lZENlbGxEYXRhKFxuICAgICAgICAgICAgY2VsbCxcbiAgICAgICAgICAgIGxpbmUhLnRyYW5zbGF0ZVRvU3RyaW5nKHRydWUsIHJhbmdlWzBdLCByYW5nZVsxXSksXG4gICAgICAgICAgICByYW5nZVsxXSAtIHJhbmdlWzBdXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgb3ZlciB0aGUgY2VsbHMgb2NjdXBpZWQgYnkgdGhpcyByYW5nZSBpbiB0aGUgbG9vcFxuICAgICAgICAgIGxhc3RDaGFyWCA9IHJhbmdlWzFdIC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoYXJzID0gY2VsbC5nZXRDaGFycygpO1xuICAgICAgICBjb2RlID0gY2VsbC5nZXRDb2RlKCk7XG4gICAgICAgIGkgPSAoKHkgKiB0ZXJtaW5hbC5jb2xzKSArIHgpICogUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMO1xuXG4gICAgICAgIC8vIExvYWQgY29sb3JzL3Jlc29sdmUgb3ZlcnJpZGVzIGludG8gd29yayBjb2xvcnNcbiAgICAgICAgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzb2x2ZShjZWxsLCB4LCByb3csIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCk7XG5cbiAgICAgICAgLy8gT3ZlcnJpZGUgY29sb3JzIGZvciBjdXJzb3IgY2VsbFxuICAgICAgICBpZiAoaXNDdXJzb3JWaXNpYmxlICYmIHJvdyA9PT0gY3Vyc29yWSkge1xuICAgICAgICAgIGlmICh4ID09PSBjdXJzb3JYKSB7XG4gICAgICAgICAgICB0aGlzLl9tb2RlbC5jdXJzb3IgPSB7XG4gICAgICAgICAgICAgIHg6IGN1cnNvclgsXG4gICAgICAgICAgICAgIHk6IHZpZXdwb3J0UmVsYXRpdmVDdXJzb3JZLFxuICAgICAgICAgICAgICB3aWR0aDogY2VsbC5nZXRXaWR0aCgpLFxuICAgICAgICAgICAgICBzdHlsZTogdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/XG4gICAgICAgICAgICAgICAgKHRlcm1pbmFsLm9wdGlvbnMuY3Vyc29yU3R5bGUgfHwgJ2Jsb2NrJykgOiB0ZXJtaW5hbC5vcHRpb25zLmN1cnNvckluYWN0aXZlU3R5bGUsXG4gICAgICAgICAgICAgIGN1cnNvcldpZHRoOiB0ZXJtaW5hbC5vcHRpb25zLmN1cnNvcldpZHRoLFxuICAgICAgICAgICAgICBkcHI6IHRoaXMuX2RldmljZVBpeGVsUmF0aW9cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsYXN0Q3Vyc29yWCA9IGN1cnNvclggKyBjZWxsLmdldFdpZHRoKCkgLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoeCA+PSBjdXJzb3JYICYmIHggPD0gbGFzdEN1cnNvclggJiZcbiAgICAgICAgICAgICAgKCh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkICYmXG4gICAgICAgICAgICAgICh0ZXJtaW5hbC5vcHRpb25zLmN1cnNvclN0eWxlIHx8ICdibG9jaycpID09PSAnYmxvY2snKSB8fFxuICAgICAgICAgICAgICAodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgdGVybWluYWwub3B0aW9ucy5jdXJzb3JJbmFjdGl2ZVN0eWxlID09PSAnYmxvY2snKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5mZyA9XG4gICAgICAgICAgICAgIEF0dHJpYnV0ZXMuQ01fUkdCIHwgKHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuY3Vyc29yQWNjZW50LnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgICAgICAgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnID1cbiAgICAgICAgICAgICAgQXR0cmlidXRlcy5DTV9SR0IgfCAodGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5jdXJzb3IucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgIT09IE5VTExfQ0VMTF9DT0RFKSB7XG4gICAgICAgICAgdGhpcy5fbW9kZWwubGluZUxlbmd0aHNbeV0gPSB4ICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGhpbmcgaGFzIGNoYW5nZWQsIG5vIHVwZGF0ZXMgbmVlZGVkXG4gICAgICAgIGlmICh0aGlzLl9tb2RlbC5jZWxsc1tpXSA9PT0gY29kZSAmJlxuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaSArIFJFTkRFUl9NT0RFTF9CR19PRkZTRVRdID09PSB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuYmcgJiZcbiAgICAgICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2kgKyBSRU5ERVJfTU9ERUxfRkdfT0ZGU0VUXSA9PT0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmZnICYmXG4gICAgICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tpICsgUkVOREVSX01PREVMX0VYVF9PRkZTRVRdID09PSB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuZXh0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBtb2RlbFVwZGF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZsYWcgY29tYmluZWQgY2hhcnMgd2l0aCBhIGJpdCBtYXNrIHNvIHRoZXkncmUgZWFzaWx5IGlkZW50aWZpYWJsZVxuICAgICAgICBpZiAoY2hhcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGNvZGUgfD0gQ09NQklORURfQ0hBUl9CSVRfTUFTSztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRzIGluIHRoZSBtb2RlbFxuICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tpXSA9IGNvZGU7XG4gICAgICAgIHRoaXMuX21vZGVsLmNlbGxzW2kgKyBSRU5ERVJfTU9ERUxfQkdfT0ZGU0VUXSA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5iZztcbiAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaSArIFJFTkRFUl9NT0RFTF9GR19PRkZTRVRdID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmZnO1xuICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tpICsgUkVOREVSX01PREVMX0VYVF9PRkZTRVRdID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmV4dDtcblxuICAgICAgICB3aWR0aCA9IGNlbGwuZ2V0V2lkdGgoKTtcbiAgICAgICAgdGhpcy5fZ2x5cGhSZW5kZXJlci52YWx1ZSEudXBkYXRlQ2VsbCh4LCB5LCBjb2RlLCB0aGlzLl9jZWxsQ29sb3JSZXNvbHZlci5yZXN1bHQuYmcsIHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5mZywgdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmV4dCwgY2hhcnMsIHdpZHRoLCBsYXN0QmcpO1xuXG4gICAgICAgIGlmIChpc0pvaW5lZCkge1xuICAgICAgICAgIC8vIFJlc3RvcmUgd29yayBjZWxsXG4gICAgICAgICAgY2VsbCA9IHRoaXMuX3dvcmtDZWxsO1xuXG4gICAgICAgICAgLy8gTnVsbCBvdXQgbm9uLWZpcnN0IGNlbGxzXG4gICAgICAgICAgZm9yICh4Kys7IHggPCBsYXN0Q2hhclg7IHgrKykge1xuICAgICAgICAgICAgaiA9ICgoeSAqIHRlcm1pbmFsLmNvbHMpICsgeCkgKiBSRU5ERVJfTU9ERUxfSU5ESUNJRVNfUEVSX0NFTEw7XG4gICAgICAgICAgICB0aGlzLl9nbHlwaFJlbmRlcmVyLnZhbHVlIS51cGRhdGVDZWxsKHgsIHksIE5VTExfQ0VMTF9DT0RFLCAwLCAwLCAwLCBOVUxMX0NFTExfQ0hBUiwgMCwgMCk7XG4gICAgICAgICAgICB0aGlzLl9tb2RlbC5jZWxsc1tqXSA9IE5VTExfQ0VMTF9DT0RFO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaiArIFJFTkRFUl9NT0RFTF9CR19PRkZTRVRdID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmJnO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaiArIFJFTkRFUl9NT0RFTF9GR19PRkZTRVRdID0gdGhpcy5fY2VsbENvbG9yUmVzb2x2ZXIucmVzdWx0LmZnO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWwuY2VsbHNbaiArIFJFTkRFUl9NT0RFTF9FWFRfT0ZGU0VUXSA9IHRoaXMuX2NlbGxDb2xvclJlc29sdmVyLnJlc3VsdC5leHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2RlbFVwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlIS51cGRhdGVCYWNrZ3JvdW5kcyh0aGlzLl9tb2RlbCk7XG4gICAgfVxuICAgIHRoaXMuX3JlY3RhbmdsZVJlbmRlcmVyLnZhbHVlIS51cGRhdGVDdXJzb3IodGhpcy5fbW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlcyB0aGUgY2hhcmFjdGVyIGFuZCBjYW52YXMgZGltZW5zaW9ucy5cbiAgICovXG4gIHByaXZhdGUgX3VwZGF0ZURpbWVuc2lvbnMoKTogdm9pZCB7XG4gICAgLy8gUGVyZm9ybSBhIG5ldyBtZWFzdXJlIGlmIHRoZSBDaGFyTWVhc3VyZSBkaW1lbnNpb25zIGFyZSBub3QgeWV0IGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy5fY2hhclNpemVTZXJ2aWNlLndpZHRoIHx8ICF0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXZpY2UgY2hhcmFjdGVyIHdpZHRoLiBXaWR0aCBpcyBmbG9vcmVkIGFzIGl0IG11c3QgYmUgZHJhd24gdG8gYW4gaW50ZWdlciBncmlkXG4gICAgLy8gaW4gb3JkZXIgZm9yIHRoZSBjaGFyIGF0bGFzIGdseXBocyB0byBub3QgYmUgYmx1cnJ5LlxuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci53aWR0aCA9IE1hdGguZmxvb3IodGhpcy5fY2hhclNpemVTZXJ2aWNlLndpZHRoICogdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRldmljZSBjaGFyYWN0ZXIgaGVpZ2h0LiBIZWlnaHQgaXMgY2VpbGVkIGluIGNhc2UgZGV2aWNlUGl4ZWxSYXRpbyBpcyBhXG4gICAgLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGluIG9yZGVyIHRvIGVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gZHJhdyB0aGUgY2hhcmFjdGVyIHRvIHRoZVxuICAgIC8vIGNlbGwuXG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCA9IE1hdGguY2VpbCh0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGVpZ2h0ICogdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRldmljZSBjZWxsIGhlaWdodCwgaWYgbGluZUhlaWdodCBpcyBfbm90XyAxLCB0aGUgcmVzdWx0aW5nIHZhbHVlIHdpbGwgYmVcbiAgICAvLyBmbG9vcmVkIHNpbmNlIGxpbmVIZWlnaHQgY2FuIG5ldmVyIGJlIGxvd2VyIHRoZW4gMSwgdGhpcyBndWFyZW50ZWVzIHRoZSBkZXZpY2UgY2VsbCBoZWlnaHRcbiAgICAvLyB3aWxsIGFsd2F5cyBiZSBsYXJnZXIgdGhhbiBkZXZpY2UgY2hhciBoZWlnaHQuXG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCAqIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubGluZUhlaWdodCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHkgb2Zmc2V0IHdpdGhpbiBhIGNlbGwgdGhhdCBnbHlwaCBzaG91bGQgZHJhdyBhdCBpbiBvcmRlciBmb3IgaXQgdG8gYmUgY2VudGVyZWRcbiAgICAvLyBjb3JyZWN0bHkgd2l0aGluIHRoZSBjZWxsLlxuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci50b3AgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxpbmVIZWlnaHQgPT09IDEgPyAwIDogTWF0aC5yb3VuZCgodGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCAtIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5oZWlnaHQpIC8gMik7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRldmljZSBjZWxsIHdpZHRoLCB0YWtpbmcgdGhlIGxldHRlclNwYWNpbmcgaW50byBhY2NvdW50LlxuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci53aWR0aCArIE1hdGgucm91bmQodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sZXR0ZXJTcGFjaW5nKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgeCBvZmZzZXQgd2l0aCBhIGNlbGwgdGhhdCB0ZXh0IHNob3VsZCBkcmF3IGZyb20gaW4gb3JkZXIgZm9yIGl0IHRvIGJlIGNlbnRlcmVkXG4gICAgLy8gY29ycmVjdGx5IHdpdGhpbiB0aGUgY2VsbC5cbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIubGVmdCA9IE1hdGguZmxvb3IodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sZXR0ZXJTcGFjaW5nIC8gMik7XG5cbiAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgY2FudmFzIGRpbWVuc2lvbnMsIHRoZSBkZXZpY2UgZGltZW5zaW9ucyBkZWZpbmUgdGhlIGFjdHVhbCBudW1iZXIgb2YgcGl4ZWwgaW5cbiAgICAvLyB0aGUgY2FudmFzXG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0ID0gdGhpcy5fdGVybWluYWwucm93cyAqIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQ7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGggPSB0aGlzLl90ZXJtaW5hbC5jb2xzICogdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoO1xuXG4gICAgLy8gVGhlIHRoZSBzaXplIG9mIHRoZSBjYW52YXMgb24gdGhlIHBhZ2UuIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhpcyByb3VuZHMgdG8gbmVhcmVzdCBpbnRlZ2VyXG4gICAgLy8gYW5kIG5vdCBjZWlscyBhcyBicm93c2VycyBvZnRlbiBoYXZlIGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpc3N1ZXMgd2hlcmVcbiAgICAvLyBgd2luZG93LmRldmljZVBpeGVsUmF0aW9gIGVuZHMgdXAgYmVpbmcgc29tZXRoaW5nIGxpa2UgYDEuMTAwMDAwMDIzODQxODU4YCBmb3IgZXhhbXBsZSwgd2hlblxuICAgIC8vIGl0J3MgYWN0dWFsbHkgMS4xLiBDZWlsaW5nIG1heSBjYXVzZXMgYmx1cnJpbmVzcyBhcyB0aGUgYmFja2luZyBjYW52YXMgaW1hZ2UgaXMgMSBwaXhlbCB0b29cbiAgICAvLyBsYXJnZSBmb3IgdGhlIGNhbnZhcyBlbGVtZW50IHNpemUuXG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZCh0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNhbnZhcy5oZWlnaHQgLyB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICB0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aCA9IE1hdGgucm91bmQodGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGggLyB0aGlzLl9kZXZpY2VQaXhlbFJhdGlvKTtcblxuICAgIC8vIEdldCB0aGUgQ1NTIGRpbWVuc2lvbnMgb2YgYW4gaW5kaXZpZHVhbCBjZWxsLiBUaGlzIG5lZWRzIHRvIGJlIGRlcml2ZWQgZnJvbSB0aGUgY2FsY3VsYXRlZFxuICAgIC8vIGRldmljZSBwaXhlbCBjYW52YXMgdmFsdWUgYWJvdmUuIENoYXJNZWFzdXJlLndpZHRoL2hlaWdodCBieSBpdHNlbGYgaXMgaW5zdWZmaWNpZW50IHdoZW4gdGhlXG4gICAgLy8gcGFnZSBpcyBub3QgYXQgMTAwJSB6b29tIGxldmVsIGFzIENoYXJNZWFzdXJlIGlzIG1lYXN1cmVkIGluIENTUyBwaXhlbHMsIGJ1dCB0aGUgYWN0dWFsIGNoYXJcbiAgICAvLyBzaXplIG9uIHRoZSBjYW52YXMgY2FuIGRpZmZlci5cbiAgICB0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0ID0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCAvIHRoaXMuX2RldmljZVBpeGVsUmF0aW87XG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoIC8gdGhpcy5fZGV2aWNlUGl4ZWxSYXRpbztcbiAgfVxuXG4gIHByaXZhdGUgX3NldENhbnZhc0RldmljZVBpeGVsRGltZW5zaW9ucyh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jYW52YXMud2lkdGggPT09IHdpZHRoICYmIHRoaXMuX2NhbnZhcy5oZWlnaHQgPT09IGhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBXaGlsZSB0aGUgYWN0dWFsIGNhbnZhcyBzaXplIGhhcyBjaGFuZ2VkLCBrZWVwIGRldmljZSBjYW52YXMgZGltZW5zaW9ucyBhcyB0aGUgdmFsdWUgYmVmb3JlXG4gICAgLy8gdGhlIGNoYW5nZSBhcyBpdCdzIGFuIGV4YWN0IG11bHRpcGxlIG9mIHRoZSBjZWxsIHNpemVzLlxuICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5fcmVxdWVzdFJlZHJhd1ZpZXdwb3J0KCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fb25SZXF1ZXN0UmVkcmF3LmZpcmUoeyBzdGFydDogMCwgZW5kOiB0aGlzLl90ZXJtaW5hbC5yb3dzIC0gMSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3RSZWRyYXdDdXJzb3IoKTogdm9pZCB7XG4gICAgY29uc3QgY3Vyc29yWSA9IHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5hY3RpdmUuY3Vyc29yWTtcbiAgICB0aGlzLl9vblJlcXVlc3RSZWRyYXcuZmlyZSh7IHN0YXJ0OiBjdXJzb3JZLCBlbmQ6IGN1cnNvclkgfSk7XG4gIH1cbn1cblxuLy8gVE9ETzogU2hhcmUgaW1wbCB3aXRoIGNvcmVcbmV4cG9ydCBjbGFzcyBKb2luZWRDZWxsRGF0YSBleHRlbmRzIEF0dHJpYnV0ZURhdGEgaW1wbGVtZW50cyBJQ2VsbERhdGEge1xuICBwcml2YXRlIF93aWR0aDogbnVtYmVyO1xuICAvLyAuY29udGVudCBjYXJyaWVzIG5vIG1lYW5pbmcgZm9yIGpvaW5lZCBDZWxsRGF0YSwgc2ltcGx5IG51bGxpZnkgaXRcbiAgLy8gdGh1cyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGFsbCBvdGhlciAuY29udGVudCBhY2Nlc3NvcnNcbiAgcHVibGljIGNvbnRlbnQ6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBmZzogbnVtYmVyO1xuICBwdWJsaWMgYmc6IG51bWJlcjtcbiAgcHVibGljIGNvbWJpbmVkRGF0YTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoZmlyc3RDZWxsOiBJQ2VsbERhdGEsIGNoYXJzOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZmcgPSBmaXJzdENlbGwuZmc7XG4gICAgdGhpcy5iZyA9IGZpcnN0Q2VsbC5iZztcbiAgICB0aGlzLmNvbWJpbmVkRGF0YSA9IGNoYXJzO1xuICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XG4gIH1cblxuICBwdWJsaWMgaXNDb21iaW5lZCgpOiBudW1iZXIge1xuICAgIC8vIGFsd2F5cyBtYXJrIGpvaW5lZCBjZWxsIGRhdGEgYXMgY29tYmluZWRcbiAgICByZXR1cm4gQ29udGVudC5JU19DT01CSU5FRF9NQVNLO1xuICB9XG5cbiAgcHVibGljIGdldFdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICB9XG5cbiAgcHVibGljIGdldENoYXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tYmluZWREYXRhO1xuICB9XG5cbiAgcHVibGljIGdldENvZGUoKTogbnVtYmVyIHtcbiAgICAvLyBjb2RlIGFsd2F5cyBnZXRzIHRoZSBoaWdoZXN0IHBvc3NpYmxlIGZha2UgY29kZXBvaW50IChyZWFkIGFzIC0xKVxuICAgIC8vIHRoaXMgaXMgbmVlZGVkIGFzIGNvZGUgaXMgdXNlZCBieSBjYWNoZXMgYXMgaWRlbnRpZmllclxuICAgIHJldHVybiAweDFGRkZGRjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGcm9tQ2hhckRhdGEodmFsdWU6IENoYXJEYXRhKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBc0NoYXJEYXRhKCk6IENoYXJEYXRhIHtcbiAgICByZXR1cm4gW3RoaXMuZmcsIHRoaXMuZ2V0Q2hhcnMoKSwgdGhpcy5nZXRXaWR0aCgpLCB0aGlzLmdldENvZGUoKV07XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWF4OiBudW1iZXIsIG1pbjogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih2YWx1ZSwgbWF4KSwgbWluKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuXG4vKipcbiAqIEEgbWF0cml4IHRoYXQgd2hlbiBtdWx0aXBsaWVzIHdpbGwgdHJhbnNsYXRlIDAtMSBjb29yZGluYXRlcyAobGVmdCB0byByaWdodCxcbiAqIHRvcCB0byBib3R0b20pIHRvIGNsaXAgc3BhY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBQUk9KRUNUSU9OX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAyLCAwLCAwLCAwLFxuICAwLCAtMiwgMCwgMCxcbiAgMCwgMCwgMSwgMCxcbiAgLTEsIDEsIDAsIDFcbl0pO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbShnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB2ZXJ0ZXhTb3VyY2U6IHN0cmluZywgZnJhZ21lbnRTb3VyY2U6IHN0cmluZyk6IFdlYkdMUHJvZ3JhbSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2dyYW0gPSB0aHJvd0lmRmFsc3koZ2wuY3JlYXRlUHJvZ3JhbSgpKTtcbiAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHRocm93SWZGYWxzeShjcmVhdGVTaGFkZXIoZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleFNvdXJjZSkpKTtcbiAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHRocm93SWZGYWxzeShjcmVhdGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTb3VyY2UpKSk7XG4gIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xuICBjb25zdCBzdWNjZXNzID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyk7XG4gIGlmIChzdWNjZXNzKSB7XG4gICAgcmV0dXJuIHByb2dyYW07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pKTtcbiAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNoYWRlcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0eXBlOiBudW1iZXIsIHNvdXJjZTogc3RyaW5nKTogV2ViR0xTaGFkZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBzaGFkZXIgPSB0aHJvd0lmRmFsc3koZ2wuY3JlYXRlU2hhZGVyKHR5cGUpKTtcbiAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKTtcbiAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpO1xuICBjb25zdCBzdWNjZXNzID0gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpO1xuICBpZiAoc3VjY2Vzcykge1xuICAgIHJldHVybiBzaGFkZXI7XG4gIH1cblxuICBjb25zb2xlLmVycm9yKGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKSk7XG4gIGdsLmRlbGV0ZVNoYWRlcihzaGFkZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kRmxvYXQzMkFycmF5KHNvdXJjZTogRmxvYXQzMkFycmF5LCBtYXg6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IG5ld0xlbmd0aCA9IE1hdGgubWluKHNvdXJjZS5sZW5ndGggKiAyLCBtYXgpO1xuICBjb25zdCBuZXdBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkobmV3TGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcbiAgICBuZXdBcnJheVtpXSA9IHNvdXJjZVtpXTtcbiAgfVxuICByZXR1cm4gbmV3QXJyYXk7XG59XG5cbmV4cG9ydCBjbGFzcyBHTFRleHR1cmUge1xuICBwdWJsaWMgdGV4dHVyZTogV2ViR0xUZXh0dXJlO1xuICBwdWJsaWMgdmVyc2lvbjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHRleHR1cmU6IFdlYkdMVGV4dHVyZSkge1xuICAgIHRoaXMudGV4dHVyZSA9IHRleHR1cmU7XG4gICAgdGhpcy52ZXJzaW9uID0gLTE7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IGFjcXVpcmVUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DaGFyQXRsYXNDYWNoZSc7XG5pbXBvcnQgeyBURVhUX0JBU0VMSU5FIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ29uc3RhbnRzJztcbmltcG9ydCB7IHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMsIElUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgSVJlbmRlckxheWVyIH0gZnJvbSAnLi9UeXBlcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlUmVuZGVyTGF5ZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSVJlbmRlckxheWVyIHtcbiAgcHJpdmF0ZSBfY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHJvdGVjdGVkIF9jdHghOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHByaXZhdGUgX2RldmljZUNoYXJXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZGV2aWNlQ2hhckhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kZXZpY2VDZWxsSGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kZXZpY2VDaGFyTGVmdDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZGV2aWNlQ2hhclRvcDogbnVtYmVyID0gMDtcblxuICBwcm90ZWN0ZWQgX2NoYXJBdGxhczogSVRleHR1cmVBdGxhcyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB0ZXJtaW5hbDogVGVybWluYWwsXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHpJbmRleDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FscGhhOiBib29sZWFuLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3RoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NhbnZhcyA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5tYWluRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdGhpcy5fY2FudmFzLmNsYXNzTGlzdC5hZGQoYHh0ZXJtLSR7aWR9LWxheWVyYCk7XG4gICAgdGhpcy5fY2FudmFzLnN0eWxlLnpJbmRleCA9IHpJbmRleC50b1N0cmluZygpO1xuICAgIHRoaXMuX2luaXRDYW52YXMoKTtcbiAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fY2FudmFzKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3RoZW1lU2VydmljZS5vbkNoYW5nZUNvbG9ycyhlID0+IHtcbiAgICAgIHRoaXMuX3JlZnJlc2hDaGFyQXRsYXModGVybWluYWwsIGUpO1xuICAgICAgdGhpcy5yZXNldCh0ZXJtaW5hbCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgIHRoaXMuX2NhbnZhcy5yZW1vdmUoKTtcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0Q2FudmFzKCk6IHZvaWQge1xuICAgIHRoaXMuX2N0eCA9IHRocm93SWZGYWxzeSh0aGlzLl9jYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IGFscGhhOiB0aGlzLl9hbHBoYSB9KSk7XG4gICAgLy8gRHJhdyB0aGUgYmFja2dyb3VuZCBpZiB0aGlzIGlzIGFuIG9wYXF1ZSBsYXllclxuICAgIGlmICghdGhpcy5fYWxwaGEpIHtcbiAgICAgIHRoaXMuX2NsZWFyQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZUJsdXIodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7fVxuICBwdWJsaWMgaGFuZGxlRm9jdXModGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7fVxuICBwdWJsaWMgaGFuZGxlQ3Vyc29yTW92ZSh0ZXJtaW5hbDogVGVybWluYWwpOiB2b2lkIHt9XG4gIHB1YmxpYyBoYW5kbGVHcmlkQ2hhbmdlZCh0ZXJtaW5hbDogVGVybWluYWwsIHN0YXJ0Um93OiBudW1iZXIsIGVuZFJvdzogbnVtYmVyKTogdm9pZCB7fVxuICBwdWJsaWMgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCh0ZXJtaW5hbDogVGVybWluYWwsIHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgX3NldFRyYW5zcGFyZW5jeSh0ZXJtaW5hbDogVGVybWluYWwsIGFscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gRG8gbm90aGluZyB3aGVuIGFscGhhIGRvZXNuJ3QgY2hhbmdlXG4gICAgaWYgKGFscGhhID09PSB0aGlzLl9hbHBoYSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBuZXcgY2FudmFzIGFuZCByZXBsYWNlIG9sZCBvbmVcbiAgICBjb25zdCBvbGRDYW52YXMgPSB0aGlzLl9jYW52YXM7XG4gICAgdGhpcy5fYWxwaGEgPSBhbHBoYTtcbiAgICAvLyBDbG9uaW5nIHByZXNlcnZlcyBwcm9wZXJ0aWVzXG4gICAgdGhpcy5fY2FudmFzID0gdGhpcy5fY2FudmFzLmNsb25lTm9kZSgpIGFzIEhUTUxDYW52YXNFbGVtZW50O1xuICAgIHRoaXMuX2luaXRDYW52YXMoKTtcbiAgICB0aGlzLl9jb250YWluZXIucmVwbGFjZUNoaWxkKHRoaXMuX2NhbnZhcywgb2xkQ2FudmFzKTtcblxuICAgIC8vIFJlZ2VuZXJhdGUgY2hhciBhdGxhcyBhbmQgZm9yY2UgYSBmdWxsIHJlZHJhd1xuICAgIHRoaXMuX3JlZnJlc2hDaGFyQXRsYXModGVybWluYWwsIHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMpO1xuICAgIHRoaXMuaGFuZGxlR3JpZENoYW5nZWQodGVybWluYWwsIDAsIHRlcm1pbmFsLnJvd3MgLSAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgdGhlIGNoYXIgYXRsYXMsIGFxdWlyaW5nIGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkuXG4gICAqIEBwYXJhbSB0ZXJtaW5hbCBUaGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBjb2xvclNldCBUaGUgY29sb3Igc2V0IHRvIHVzZSBmb3IgdGhlIGNoYXIgYXRsYXMuXG4gICAqL1xuICBwcml2YXRlIF9yZWZyZXNoQ2hhckF0bGFzKHRlcm1pbmFsOiBUZXJtaW5hbCwgY29sb3JTZXQ6IFJlYWRvbmx5Q29sb3JTZXQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGV2aWNlQ2hhcldpZHRoIDw9IDAgJiYgdGhpcy5fZGV2aWNlQ2hhckhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NoYXJBdGxhcyA9IGFjcXVpcmVUZXh0dXJlQXRsYXModGVybWluYWwsIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMsIGNvbG9yU2V0LCB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsIHRoaXMuX2RldmljZUNlbGxIZWlnaHQsIHRoaXMuX2RldmljZUNoYXJXaWR0aCwgdGhpcy5fZGV2aWNlQ2hhckhlaWdodCwgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcik7XG4gICAgdGhpcy5fY2hhckF0bGFzLndhcm1VcCgpO1xuICB9XG5cbiAgcHVibGljIHJlc2l6ZSh0ZXJtaW5hbDogVGVybWluYWwsIGRpbTogSVJlbmRlckRpbWVuc2lvbnMpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXZpY2VDZWxsV2lkdGggPSBkaW0uZGV2aWNlLmNlbGwud2lkdGg7XG4gICAgdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCA9IGRpbS5kZXZpY2UuY2VsbC5oZWlnaHQ7XG4gICAgdGhpcy5fZGV2aWNlQ2hhcldpZHRoID0gZGltLmRldmljZS5jaGFyLndpZHRoO1xuICAgIHRoaXMuX2RldmljZUNoYXJIZWlnaHQgPSBkaW0uZGV2aWNlLmNoYXIuaGVpZ2h0O1xuICAgIHRoaXMuX2RldmljZUNoYXJMZWZ0ID0gZGltLmRldmljZS5jaGFyLmxlZnQ7XG4gICAgdGhpcy5fZGV2aWNlQ2hhclRvcCA9IGRpbS5kZXZpY2UuY2hhci50b3A7XG4gICAgdGhpcy5fY2FudmFzLndpZHRoID0gZGltLmRldmljZS5jYW52YXMud2lkdGg7XG4gICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IGRpbS5kZXZpY2UuY2FudmFzLmhlaWdodDtcbiAgICB0aGlzLl9jYW52YXMuc3R5bGUud2lkdGggPSBgJHtkaW0uY3NzLmNhbnZhcy53aWR0aH1weGA7XG4gICAgdGhpcy5fY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2RpbS5jc3MuY2FudmFzLmhlaWdodH1weGA7XG5cbiAgICAvLyBEcmF3IHRoZSBiYWNrZ3JvdW5kIGlmIHRoaXMgaXMgYW4gb3BhcXVlIGxheWVyXG4gICAgaWYgKCF0aGlzLl9hbHBoYSkge1xuICAgICAgdGhpcy5fY2xlYXJBbGwoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWZyZXNoQ2hhckF0bGFzKHRlcm1pbmFsLCB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzKTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZXNldCh0ZXJtaW5hbDogVGVybWluYWwpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBGaWxscyBhIDFweCBsaW5lICgycHggb24gSERQSSkgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY2VsbC4gVGhpcyB1c2VzIHRoZVxuICAgKiBleGlzdGluZyBmaWxsU3R5bGUgb24gdGhlIGNvbnRleHQuXG4gICAqIEBwYXJhbSB4IFRoZSBjb2x1bW4gdG8gZmlsbC5cbiAgICogQHBhcmFtIHkgVGhlIHJvdyB0byBmaWxsLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9maWxsQm90dG9tTGluZUF0Q2VsbHMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgdGhpcy5fY3R4LmZpbGxSZWN0KFxuICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgICh5ICsgMSkgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0IC0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwciAtIDEgLyogRW5zdXJlIGl0J3MgZHJhd24gd2l0aGluIHRoZSBjZWxsICovLFxuICAgICAgd2lkdGggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGVudGlyZSBjYW52YXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2NsZWFyQWxsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hbHBoYSkge1xuICAgICAgdGhpcy5fY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLl9jYW52YXMud2lkdGgsIHRoaXMuX2NhbnZhcy5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5iYWNrZ3JvdW5kLmNzcztcbiAgICAgIHRoaXMuX2N0eC5maWxsUmVjdCgwLCAwLCB0aGlzLl9jYW52YXMud2lkdGgsIHRoaXMuX2NhbnZhcy5oZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgMSsgY2VsbHMgY29tcGxldGVseS5cbiAgICogQHBhcmFtIHggVGhlIGNvbHVtbiB0byBzdGFydCBhdC5cbiAgICogQHBhcmFtIHkgVGhlIHJvdyB0byBzdGFydCBhdC5cbiAgICogQHBhcmFtIHdpZHRoIFRoZSBudW1iZXIgb2YgY29sdW1ucyB0byBjbGVhci5cbiAgICogQHBhcmFtIGhlaWdodCBUaGUgbnVtYmVyIG9mIHJvd3MgdG8gY2xlYXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2NsZWFyQ2VsbHMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FscGhhKSB7XG4gICAgICB0aGlzLl9jdHguY2xlYXJSZWN0KFxuICAgICAgICB4ICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCxcbiAgICAgICAgd2lkdGggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICAgIGhlaWdodCAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5iYWNrZ3JvdW5kLmNzcztcbiAgICAgIHRoaXMuX2N0eC5maWxsUmVjdChcbiAgICAgICAgeCAqIHRoaXMuX2RldmljZUNlbGxXaWR0aCxcbiAgICAgICAgeSAqIHRoaXMuX2RldmljZUNlbGxIZWlnaHQsXG4gICAgICAgIHdpZHRoICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgICBoZWlnaHQgKiB0aGlzLl9kZXZpY2VDZWxsSGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYSB0cnVlY29sb3IgY2hhcmFjdGVyIGF0IHRoZSBjZWxsLiBUaGUgY2hhcmFjdGVyIHdpbGwgYmUgY2xpcHBlZCB0b1xuICAgKiBlbnN1cmUgdGhhdCBpdCBmaXRzIHdpdGggdGhlIGNlbGwsIGluY2x1ZGluZyB0aGUgY2VsbCB0byB0aGUgcmlnaHQgaWYgaXQnc1xuICAgKiBhIHdpZGUgY2hhcmFjdGVyLiBUaGlzIHVzZXMgdGhlIGV4aXN0aW5nIGZpbGxTdHlsZSBvbiB0aGUgY29udGV4dC5cbiAgICogQHBhcmFtIHRlcm1pbmFsIFRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGNlbGwgVGhlIGNlbGwgZGF0YSBmb3IgdGhlIGNoYXJhY3RlciB0byBkcmF3LlxuICAgKiBAcGFyYW0geCBUaGUgY29sdW1uIHRvIGRyYXcgYXQuXG4gICAqIEBwYXJhbSB5IFRoZSByb3cgdG8gZHJhdyBhdC5cbiAgICovXG4gIHByb3RlY3RlZCBfZmlsbENoYXJUcnVlQ29sb3IodGVybWluYWw6IFRlcm1pbmFsLCBjZWxsOiBDZWxsRGF0YSwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jdHguZm9udCA9IHRoaXMuX2dldEZvbnQodGVybWluYWwsIGZhbHNlLCBmYWxzZSk7XG4gICAgdGhpcy5fY3R4LnRleHRCYXNlbGluZSA9IFRFWFRfQkFTRUxJTkU7XG4gICAgdGhpcy5fY2xpcENlbGwoeCwgeSwgY2VsbC5nZXRXaWR0aCgpKTtcbiAgICB0aGlzLl9jdHguZmlsbFRleHQoXG4gICAgICBjZWxsLmdldENoYXJzKCksXG4gICAgICB4ICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoICsgdGhpcy5fZGV2aWNlQ2hhckxlZnQsXG4gICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCArIHRoaXMuX2RldmljZUNoYXJUb3AgKyB0aGlzLl9kZXZpY2VDaGFySGVpZ2h0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlwcyBhIGNlbGwgdG8gZW5zdXJlIG5vIHBpeGVscyB3aWxsIGJlIGRyYXduIG91dHNpZGUgb2YgaXQuXG4gICAqIEBwYXJhbSB4IFRoZSBjb2x1bW4gdG8gY2xpcC5cbiAgICogQHBhcmFtIHkgVGhlIHJvdyB0byBjbGlwLlxuICAgKiBAcGFyYW0gd2lkdGggVGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGNsaXAuXG4gICAqL1xuICBwcml2YXRlIF9jbGlwQ2VsbCh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2N0eC5iZWdpblBhdGgoKTtcbiAgICB0aGlzLl9jdHgucmVjdChcbiAgICAgIHggKiB0aGlzLl9kZXZpY2VDZWxsV2lkdGgsXG4gICAgICB5ICogdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCxcbiAgICAgIHdpZHRoICogdGhpcy5fZGV2aWNlQ2VsbFdpZHRoLFxuICAgICAgdGhpcy5fZGV2aWNlQ2VsbEhlaWdodCk7XG4gICAgdGhpcy5fY3R4LmNsaXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGZvbnQuXG4gICAqIEBwYXJhbSB0ZXJtaW5hbCBUaGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBpc0JvbGQgSWYgd2Ugc2hvdWxkIHVzZSB0aGUgYm9sZCBmb250V2VpZ2h0LlxuICAgKi9cbiAgcHJvdGVjdGVkIF9nZXRGb250KHRlcm1pbmFsOiBUZXJtaW5hbCwgaXNCb2xkOiBib29sZWFuLCBpc0l0YWxpYzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgY29uc3QgZm9udFdlaWdodCA9IGlzQm9sZCA/IHRlcm1pbmFsLm9wdGlvbnMuZm9udFdlaWdodEJvbGQgOiB0ZXJtaW5hbC5vcHRpb25zLmZvbnRXZWlnaHQ7XG4gICAgY29uc3QgZm9udFN0eWxlID0gaXNJdGFsaWMgPyAnaXRhbGljJyA6ICcnO1xuXG4gICAgcmV0dXJuIGAke2ZvbnRTdHlsZX0gJHtmb250V2VpZ2h0fSAke3Rlcm1pbmFsLm9wdGlvbnMuZm9udFNpemUhICogdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcn1weCAke3Rlcm1pbmFsLm9wdGlvbnMuZm9udEZhbWlseX1gO1xuICB9XG59XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGlzMjU2Q29sb3IgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9DaGFyQXRsYXNVdGlscyc7XG5pbXBvcnQgeyBJTlZFUlRFRF9ERUZBVUxUX0NPTE9SIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ29uc3RhbnRzJztcbmltcG9ydCB7IElSZW5kZXJEaW1lbnNpb25zIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUxpbmtpZmllcjIsIElMaW5raWZpZXJFdmVudCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IEJhc2VSZW5kZXJMYXllciB9IGZyb20gJy4vQmFzZVJlbmRlckxheWVyJztcblxuZXhwb3J0IGNsYXNzIExpbmtSZW5kZXJMYXllciBleHRlbmRzIEJhc2VSZW5kZXJMYXllciB7XG4gIHByaXZhdGUgX3N0YXRlOiBJTGlua2lmaWVyRXZlbnQgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICB6SW5kZXg6IG51bWJlcixcbiAgICB0ZXJtaW5hbDogVGVybWluYWwsXG4gICAgbGlua2lmaWVyMjogSUxpbmtpZmllcjIsXG4gICAgY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIG9wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKHRlcm1pbmFsLCBjb250YWluZXIsICdsaW5rJywgekluZGV4LCB0cnVlLCBjb3JlQnJvd3NlclNlcnZpY2UsIG9wdGlvbnNTZXJ2aWNlLCB0aGVtZVNlcnZpY2UpO1xuXG4gICAgdGhpcy5yZWdpc3RlcihsaW5raWZpZXIyLm9uU2hvd0xpbmtVbmRlcmxpbmUoZSA9PiB0aGlzLl9oYW5kbGVTaG93TGlua1VuZGVybGluZShlKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIobGlua2lmaWVyMi5vbkhpZGVMaW5rVW5kZXJsaW5lKGUgPT4gdGhpcy5faGFuZGxlSGlkZUxpbmtVbmRlcmxpbmUoZSkpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUodGVybWluYWw6IFRlcm1pbmFsLCBkaW06IElSZW5kZXJEaW1lbnNpb25zKTogdm9pZCB7XG4gICAgc3VwZXIucmVzaXplKHRlcm1pbmFsLCBkaW0pO1xuICAgIC8vIFJlc2l6aW5nIHRoZSBjYW52YXMgZGlzY2FyZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYW52YXMgc28gY2xlYXIgc3RhdGVcbiAgICB0aGlzLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCh0ZXJtaW5hbDogVGVybWluYWwpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhckN1cnJlbnRMaW5rKCk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhckN1cnJlbnRMaW5rKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhpcy5fY2xlYXJDZWxscyh0aGlzLl9zdGF0ZS54MSwgdGhpcy5fc3RhdGUueTEsIHRoaXMuX3N0YXRlLmNvbHMgLSB0aGlzLl9zdGF0ZS54MSwgMSk7XG4gICAgICBjb25zdCBtaWRkbGVSb3dDb3VudCA9IHRoaXMuX3N0YXRlLnkyIC0gdGhpcy5fc3RhdGUueTEgLSAxO1xuICAgICAgaWYgKG1pZGRsZVJvd0NvdW50ID4gMCkge1xuICAgICAgICB0aGlzLl9jbGVhckNlbGxzKDAsIHRoaXMuX3N0YXRlLnkxICsgMSwgdGhpcy5fc3RhdGUuY29scywgbWlkZGxlUm93Q291bnQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2xlYXJDZWxscygwLCB0aGlzLl9zdGF0ZS55MiwgdGhpcy5fc3RhdGUueDIsIDEpO1xuICAgICAgdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlU2hvd0xpbmtVbmRlcmxpbmUoZTogSUxpbmtpZmllckV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGUuZmcgPT09IElOVkVSVEVEX0RFRkFVTFRfQ09MT1IpIHtcbiAgICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmJhY2tncm91bmQuY3NzO1xuICAgIH0gZWxzZSBpZiAoZS5mZyAhPT0gdW5kZWZpbmVkICYmIGlzMjU2Q29sb3IoZS5mZykpIHtcbiAgICAgIC8vIDI1NiBjb2xvciBzdXBwb3J0XG4gICAgICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW2UuZmchXS5jc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmZvcmVncm91bmQuY3NzO1xuICAgIH1cblxuICAgIGlmIChlLnkxID09PSBlLnkyKSB7XG4gICAgICAvLyBTaW5nbGUgbGluZSBsaW5rXG4gICAgICB0aGlzLl9maWxsQm90dG9tTGluZUF0Q2VsbHMoZS54MSwgZS55MSwgZS54MiAtIGUueDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNdWx0aS1saW5lIGxpbmtcbiAgICAgIHRoaXMuX2ZpbGxCb3R0b21MaW5lQXRDZWxscyhlLngxLCBlLnkxLCBlLmNvbHMgLSBlLngxKTtcbiAgICAgIGZvciAobGV0IHkgPSBlLnkxICsgMTsgeSA8IGUueTI7IHkrKykge1xuICAgICAgICB0aGlzLl9maWxsQm90dG9tTGluZUF0Q2VsbHMoMCwgeSwgZS5jb2xzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpbGxCb3R0b21MaW5lQXRDZWxscygwLCBlLnkyLCBlLngyKTtcbiAgICB9XG4gICAgdGhpcy5fc3RhdGUgPSBlO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlSGlkZUxpbmtVbmRlcmxpbmUoZTogSUxpbmtpZmllckV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJDdXJyZW50TGluaygpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogQWRkcyBhIGRpc3Bvc2FibGUgbGlzdGVuZXIgdG8gYSBub2RlIGluIHRoZSBET00sIHJldHVybmluZyB0aGUgZGlzcG9zYWJsZS5cbiAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGFkZCBhIGxpc3RlbmVyIHRvLlxuICogQHBhcmFtIHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBmb3IgdGhlIGxpc3RlbmVyLlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIGJvb2xlYW4gb3Igb3B0aW9ucyBvYmplY3QgdG8gcGFzcyBvbiB0byB0aGUgZXZlbnRcbiAqIGxpc3RlbmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKFxuICBub2RlOiBFbGVtZW50IHwgV2luZG93IHwgRG9jdW1lbnQsXG4gIHR5cGU6IHN0cmluZyxcbiAgaGFuZGxlcjogKGU6IGFueSkgPT4gdm9pZCxcbiAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9uc1xuKTogSURpc3Bvc2FibGUge1xuICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gIGxldCBkaXNwb3NlZCA9IGZhbHNlO1xuICByZXR1cm4ge1xuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGlmIChkaXNwb3NlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkaXNwb3NlZCA9IHRydWU7XG4gICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgfVxuICB9O1xufVxuIiwgImltcG9ydCB7IElTZWxlY3Rpb25SZW5kZXJNb2RlbCB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IElDb3JlQnJvd3NlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIEJnRmxhZ3MsIEV4dEZsYWdzLCBGZ0ZsYWdzLCBOVUxMX0NFTExfQ09ERSwgVW5kZXJsaW5lU3R5bGUgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBJRGVjb3JhdGlvblNlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJQ2VsbERhdGEgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgcmdiYSB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyB0cmVhdEdseXBoQXNCYWNrZ3JvdW5kQ29sb3IgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzJztcblxuLy8gV29yayB2YXJpYWJsZXMgdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uXG5sZXQgJGZnID0gMDtcbmxldCAkYmcgPSAwO1xubGV0ICRoYXNGZyA9IGZhbHNlO1xubGV0ICRoYXNCZyA9IGZhbHNlO1xubGV0ICRpc1NlbGVjdGVkID0gZmFsc2U7XG5sZXQgJGNvbG9yczogUmVhZG9ubHlDb2xvclNldCB8IHVuZGVmaW5lZDtcbmxldCAkdmFyaWFudE9mZnNldCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBDZWxsQ29sb3JSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBUaGUgc2hhcmVkIHJlc3VsdCBvZiB0aGUge0BsaW5rIHJlc29sdmV9IGNhbGwuIFRoaXMgaXMgb25seSBzYWZlIHRvIHVzZSBpbW1lZGlhdGVseSBhZnRlciBhc1xuICAgKiBhbnkgb3RoZXIgY2FsbHMgd2lsbCBzaGFyZSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzdWx0OiB7IGZnOiBudW1iZXIsIGJnOiBudW1iZXIsIGV4dDogbnVtYmVyIH0gPSB7XG4gICAgZmc6IDAsXG4gICAgYmc6IDAsXG4gICAgZXh0OiAwXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvblNlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3Rpb25SZW5kZXJNb2RlbDogSVNlbGVjdGlvblJlbmRlck1vZGVsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlY29yYXRpb25TZXJ2aWNlOiBJRGVjb3JhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjb2xvcnMgZm9yIHRoZSBjZWxsLCBwdXR0aW5nIHRoZSByZXN1bHQgaW50byB0aGUgc2hhcmVkIHtAbGluayByZXN1bHR9LiBUaGlzIHJlc29sdmVzXG4gICAqIG92ZXJyaWRlcywgaW52ZXJzZSBhbmQgc2VsZWN0aW9uIGZvciB0aGUgY2VsbCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIHRvIGZlZWQgaW50byB0aGUgcmVuZGVyZXIuXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZShjZWxsOiBJQ2VsbERhdGEsIHg6IG51bWJlciwgeTogbnVtYmVyLCBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVzdWx0LmJnID0gY2VsbC5iZztcbiAgICB0aGlzLnJlc3VsdC5mZyA9IGNlbGwuZmc7XG4gICAgdGhpcy5yZXN1bHQuZXh0ID0gY2VsbC5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEID8gY2VsbC5leHRlbmRlZC5leHQgOiAwO1xuICAgIC8vIEdldCBhbnkgZm9yZWdyb3VuZC9iYWNrZ3JvdW5kIG92ZXJyaWRlcywgdGhpcyBoYXBwZW5zIG9uIHRoZSBtb2RlbCB0byBhdm9pZCBzcHJlYWRpbmdcbiAgICAvLyBvdmVycmlkZSBsb2dpYyB0aHJvdWdob3V0IHRoZSBkaWZmZXJlbnQgc3ViLXJlbmRlcmVyc1xuXG4gICAgLy8gUmVzZXQgb3ZlcnJpZGVzIHdvcmsgdmFyaWFibGVzXG4gICAgJGJnID0gMDtcbiAgICAkZmcgPSAwO1xuICAgICRoYXNCZyA9IGZhbHNlO1xuICAgICRoYXNGZyA9IGZhbHNlO1xuICAgICRpc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgJGNvbG9ycyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnM7XG4gICAgJHZhcmlhbnRPZmZzZXQgPSAwO1xuXG4gICAgY29uc3QgY29kZSA9IGNlbGwuZ2V0Q29kZSgpO1xuICAgIGlmIChjb2RlICE9PSBOVUxMX0NFTExfQ09ERSAmJiBjZWxsLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlID09PSBVbmRlcmxpbmVTdHlsZS5ET1RURUQpIHtcbiAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IodGhpcy5fb3B0aW9uU2VydmljZS5yYXdPcHRpb25zLmZvbnRTaXplICogdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwciAvIDE1KSk7XG4gICAgICAkdmFyaWFudE9mZnNldCA9IHggKiBkZXZpY2VDZWxsV2lkdGggJSAoTWF0aC5yb3VuZChsaW5lV2lkdGgpICogMik7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGVjb3JhdGlvbnMgb24gdGhlIGJvdHRvbSBsYXllclxuICAgIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLmZvckVhY2hEZWNvcmF0aW9uQXRDZWxsKHgsIHksICdib3R0b20nLCBkID0+IHtcbiAgICAgIGlmIChkLmJhY2tncm91bmRDb2xvclJHQikge1xuICAgICAgICAkYmcgPSBkLmJhY2tncm91bmRDb2xvclJHQi5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICAkaGFzQmcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGQuZm9yZWdyb3VuZENvbG9yUkdCKSB7XG4gICAgICAgICRmZyA9IGQuZm9yZWdyb3VuZENvbG9yUkdCLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgICRoYXNGZyA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBcHBseSB0aGUgc2VsZWN0aW9uIGNvbG9yIGlmIG5lZWRlZFxuICAgICRpc1NlbGVjdGVkID0gdGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwuaXNDZWxsU2VsZWN0ZWQodGhpcy5fdGVybWluYWwsIHgsIHkpO1xuICAgIGlmICgkaXNTZWxlY3RlZCkge1xuICAgICAgLy8gSWYgdGhlIGNlbGwgaGFzIGEgYmcgY29sb3IsIHJldGFpbiB0aGUgY29sb3IgYnkgYmxlbmRpbmcgaXQgd2l0aCB0aGUgc2VsZWN0aW9uIGNvbG9yXG4gICAgICBpZiAoXG4gICAgICAgICh0aGlzLnJlc3VsdC5mZyAmIEZnRmxhZ3MuSU5WRVJTRSkgfHxcbiAgICAgICAgKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSAhPT0gQXR0cmlidXRlcy5DTV9ERUZBVUxUXG4gICAgICApIHtcbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgc3RhbmRhcmQgYmcgY29sb3JcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0LmZnICYgRmdGbGFncy5JTlZFUlNFKSB7XG4gICAgICAgICAgc3dpdGNoICh0aGlzLnJlc3VsdC5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgICAgICAkYmcgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmFuc2lbdGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLXS5yZ2JhO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgICAgICRiZyA9ICgodGhpcy5yZXN1bHQuZmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSA8PCA4KSB8IDB4RkY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAkYmcgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmZvcmVncm91bmQucmdiYTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpdGNoICh0aGlzLnJlc3VsdC5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgICAgICAkYmcgPSB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmFuc2lbdGhpcy5yZXN1bHQuYmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLXS5yZ2JhO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgICAgICRiZyA9ICgodGhpcy5yZXN1bHQuYmcgJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSA8PCA4KSB8IDB4RkY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjb25zaWRlciBkZWZhdWx0IGJnIGNvbG9yIGhlcmUgYXMgaXQncyBub3QgcG9zc2libGVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQmxlbmQgd2l0aCBzZWxlY3Rpb24gYmcgY29sb3JcbiAgICAgICAgJGJnID0gcmdiYS5ibGVuZChcbiAgICAgICAgICAkYmcsXG4gICAgICAgICAgKCh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkID8gJGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlIDogJGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWUpLnJnYmEgJiAweEZGRkZGRjAwKSB8IDB4ODBcbiAgICAgICAgKSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRiZyA9ICh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkID8gJGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlIDogJGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWUpLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICB9XG4gICAgICAkaGFzQmcgPSB0cnVlO1xuXG4gICAgICAvLyBBcHBseSBleHBsaWNpdCBzZWxlY3Rpb24gZm9yZWdyb3VuZCBpZiBwcmVzZW50XG4gICAgICBpZiAoJGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kKSB7XG4gICAgICAgICRmZyA9ICRjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZC5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICAkaGFzRmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBPdmVyd3JpdGUgZmcgYXMgYmcgaWYgaXQncyBhIHNwZWNpYWwgZGVjb3JhdGl2ZSBnbHlwaCAoZWcuIHBvd2VybGluZSlcbiAgICAgIGlmICh0cmVhdEdseXBoQXNCYWNrZ3JvdW5kQ29sb3IoY2VsbC5nZXRDb2RlKCkpKSB7XG4gICAgICAgIC8vIEludmVyc2UgZGVmYXVsdCBiYWNrZ3JvdW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzIHRyYW5zcGFyZW50XG4gICAgICAgIGlmIChcbiAgICAgICAgICAodGhpcy5yZXN1bHQuZmcgJiBGZ0ZsYWdzLklOVkVSU0UpICYmXG4gICAgICAgICAgKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9ERUZBVUxUXG4gICAgICAgICkge1xuICAgICAgICAgICRmZyA9ICh0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkID8gJGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlIDogJGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWUpLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICBpZiAodGhpcy5yZXN1bHQuZmcgJiBGZ0ZsYWdzLklOVkVSU0UpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5yZXN1bHQuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spIHtcbiAgICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgICAgICAgICAgJGZnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW3RoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5QQ09MT1JfTUFTS10ucmdiYTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgICAgICAgICAkZmcgPSAoKHRoaXMucmVzdWx0LmJnICYgQXR0cmlidXRlcy5SR0JfTUFTSykgPDwgOCkgfCAweEZGO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNvbnNpZGVyIGRlZmF1bHQgYmcgY29sb3IgaGVyZSBhcyBpdCdzIG5vdCBwb3NzaWJsZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMucmVzdWx0LmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICAgICAgICAgICRmZyA9IHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaVt0aGlzLnJlc3VsdC5mZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0tdLnJnYmE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgICAgICAgICAgJGZnID0gKCh0aGlzLnJlc3VsdC5mZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIDw8IDgpIHwgMHhGRjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgJGZnID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJGZnID0gcmdiYS5ibGVuZChcbiAgICAgICAgICAgICRmZyxcbiAgICAgICAgICAgICgodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/ICRjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA6ICRjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlKS5yZ2JhICYgMHhGRkZGRkYwMCkgfCAweDgwXG4gICAgICAgICAgKSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgfVxuICAgICAgICAkaGFzRmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlY29yYXRpb25zIG9uIHRoZSB0b3AgbGF5ZXJcbiAgICB0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5mb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4LCB5LCAndG9wJywgZCA9PiB7XG4gICAgICBpZiAoZC5iYWNrZ3JvdW5kQ29sb3JSR0IpIHtcbiAgICAgICAgJGJnID0gZC5iYWNrZ3JvdW5kQ29sb3JSR0IucmdiYSA+PiA4ICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgJGhhc0JnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkLmZvcmVncm91bmRDb2xvclJHQikge1xuICAgICAgICAkZmcgPSBkLmZvcmVncm91bmRDb2xvclJHQi5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLO1xuICAgICAgICAkaGFzRmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCBhbnkgb3ZlcnJpZGVzIGZyb20gcmdiYSB0byB0aGUgZmcvYmcgcGFja2VkIGZvcm1hdC4gVGhpcyByZXNvbHZlcyB0aGUgaW52ZXJzZSBmbGFnXG4gICAgLy8gYWhlYWQgb2YgdGltZSBpbiBvcmRlciB0byB1c2UgdGhlIGNvcnJlY3QgY2FjaGUga2V5XG4gICAgaWYgKCRoYXNCZykge1xuICAgICAgaWYgKCRpc1NlbGVjdGVkKSB7XG4gICAgICAgIC8vIE5vbi1SR0IgYXR0cmlidXRlcyBmcm9tIG1vZGVsICsgZm9yY2Ugbm9uLWRpbSArIG92ZXJyaWRlICsgZm9yY2UgUkdCIGNvbG9yIG1vZGVcbiAgICAgICAgJGJnID0gKGNlbGwuYmcgJiB+QXR0cmlidXRlcy5SR0JfTUFTSyAmIH5CZ0ZsYWdzLkRJTSkgfCAkYmcgfCBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vbi1SR0IgYXR0cmlidXRlcyBmcm9tIG1vZGVsICsgb3ZlcnJpZGUgKyBmb3JjZSBSR0IgY29sb3IgbW9kZVxuICAgICAgICAkYmcgPSAoY2VsbC5iZyAmIH5BdHRyaWJ1dGVzLlJHQl9NQVNLKSB8ICRiZyB8IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoJGhhc0ZnKSB7XG4gICAgICAvLyBOb24tUkdCIGF0dHJpYnV0ZXMgZnJvbSBtb2RlbCArIGZvcmNlIGRpc2FibGUgaW52ZXJzZSArIG92ZXJyaWRlICsgZm9yY2UgUkdCIGNvbG9yIG1vZGVcbiAgICAgICRmZyA9IChjZWxsLmZnICYgfkF0dHJpYnV0ZXMuUkdCX01BU0sgJiB+RmdGbGFncy5JTlZFUlNFKSB8ICRmZyB8IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIGludmVyc2Ugd2FzIHNwZWNpZmllZCBieSBvbmx5IG9uZSBvZiBiZyBvdmVycmlkZSBvciBmZyBvdmVycmlkZSB3YXMgc2V0LFxuICAgIC8vIHJlc29sdmluZyB0aGUgb3RoZXIgaW52ZXJzZSBjb2xvciBhbmQgc2V0dGluZyB0aGUgaW52ZXJzZSBmbGFnIGlmIG5lZWRlZC5cbiAgICBpZiAodGhpcy5yZXN1bHQuZmcgJiBGZ0ZsYWdzLklOVkVSU0UpIHtcbiAgICAgIGlmICgkaGFzQmcgJiYgISRoYXNGZykge1xuICAgICAgICAvLyBSZXNvbHZlIGJnIGNvbG9yIHR5cGUgKGRlZmF1bHQgY29sb3IgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgaW4gZmcgdnMgYmcpXG4gICAgICAgIGlmICgodGhpcy5yZXN1bHQuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQpIHtcbiAgICAgICAgICAkZmcgPSAodGhpcy5yZXN1bHQuZmcgJiB+KEF0dHJpYnV0ZXMuUkdCX01BU0sgfCBGZ0ZsYWdzLklOVkVSU0UgfCBBdHRyaWJ1dGVzLkNNX01BU0spKSB8ICgoJGNvbG9ycy5iYWNrZ3JvdW5kLnJnYmEgPj4gOCAmIEF0dHJpYnV0ZXMuUkdCX01BU0spICYgQXR0cmlidXRlcy5SR0JfTUFTSykgfCBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkZmcgPSAodGhpcy5yZXN1bHQuZmcgJiB+KEF0dHJpYnV0ZXMuUkdCX01BU0sgfCBGZ0ZsYWdzLklOVkVSU0UgfCBBdHRyaWJ1dGVzLkNNX01BU0spKSB8IHRoaXMucmVzdWx0LmJnICYgKEF0dHJpYnV0ZXMuUkdCX01BU0sgfCBBdHRyaWJ1dGVzLkNNX01BU0spO1xuICAgICAgICB9XG4gICAgICAgICRoYXNGZyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoISRoYXNCZyAmJiAkaGFzRmcpIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBiZyBjb2xvciB0eXBlIChkZWZhdWx0IGNvbG9yIGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIGluIGZnIHZzIGJnKVxuICAgICAgICBpZiAoKHRoaXMucmVzdWx0LmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9ERUZBVUxUKSB7XG4gICAgICAgICAgJGJnID0gKHRoaXMucmVzdWx0LmJnICYgfihBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgQXR0cmlidXRlcy5DTV9NQVNLKSkgfCAoKCRjb2xvcnMuZm9yZWdyb3VuZC5yZ2JhID4+IDggJiBBdHRyaWJ1dGVzLlJHQl9NQVNLKSAmIEF0dHJpYnV0ZXMuUkdCX01BU0spIHwgQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGJnID0gKHRoaXMucmVzdWx0LmJnICYgfihBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgQXR0cmlidXRlcy5DTV9NQVNLKSkgfCB0aGlzLnJlc3VsdC5mZyAmIChBdHRyaWJ1dGVzLlJHQl9NQVNLIHwgQXR0cmlidXRlcy5DTV9NQVNLKTtcbiAgICAgICAgfVxuICAgICAgICAkaGFzQmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbGVhc2Ugb2JqZWN0XG4gICAgJGNvbG9ycyA9IHVuZGVmaW5lZDtcblxuICAgIC8vIFVzZSB0aGUgb3ZlcnJpZGUgaWYgaXQgZXhpc3RzXG4gICAgdGhpcy5yZXN1bHQuYmcgPSAkaGFzQmcgPyAkYmcgOiB0aGlzLnJlc3VsdC5iZztcbiAgICB0aGlzLnJlc3VsdC5mZyA9ICRoYXNGZyA/ICRmZyA6IHRoaXMucmVzdWx0LmZnO1xuXG4gICAgLy8gUmVzZXQgb3ZlcnJpZGVzIHZhcmlhbnRPZmZzZXRcbiAgICB0aGlzLnJlc3VsdC5leHQgJj0gfkV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUO1xuICAgIHRoaXMucmVzdWx0LmV4dCB8PSAoJHZhcmlhbnRPZmZzZXQgPDwgMjkpICYgRXh0RmxhZ3MuVkFSSUFOVF9PRkZTRVQ7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IFRleHR1cmVBdGxhcyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1RleHR1cmVBdGxhcyc7XG5pbXBvcnQgeyBJVGVybWluYWxPcHRpb25zLCBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBJVGVybWluYWwsIFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElDaGFyQXRsYXNDb25maWcsIElUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUNvbmZpZywgY29uZmlnRXF1YWxzIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ2hhckF0bGFzVXRpbHMnO1xuXG5pbnRlcmZhY2UgSVRleHR1cmVBdGxhc0NhY2hlRW50cnkge1xuICBhdGxhczogSVRleHR1cmVBdGxhcztcbiAgY29uZmlnOiBJQ2hhckF0bGFzQ29uZmlnO1xuICAvLyBOLkIuIFRoaXMgaW1wbGVtZW50YXRpb24gcG90ZW50aWFsbHkgaG9sZHMgb250byBjb3BpZXMgb2YgdGhlIHRlcm1pbmFsIGZvcmV2ZXIsIHNvXG4gIC8vIHRoaXMgbWF5IGNhdXNlIG1lbW9yeSBsZWFrcy5cbiAgb3duZWRCeTogVGVybWluYWxbXTtcbn1cblxuY29uc3QgY2hhckF0bGFzQ2FjaGU6IElUZXh0dXJlQXRsYXNDYWNoZUVudHJ5W10gPSBbXTtcblxuLyoqXG4gKiBBY3F1aXJlcyBhIGNoYXIgYXRsYXMsIGVpdGhlciBnZW5lcmF0aW5nIGEgbmV3IG9uZSBvciByZXR1cm5pbmcgYW4gZXhpc3RpbmdcbiAqIG9uZSB0aGF0IGlzIGluIHVzZSBieSBhbm90aGVyIHRlcm1pbmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWNxdWlyZVRleHR1cmVBdGxhcyhcbiAgdGVybWluYWw6IFRlcm1pbmFsLFxuICBvcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPixcbiAgY29sb3JzOiBSZWFkb25seUNvbG9yU2V0LFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBkZXZpY2VDaGFyV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2hhckhlaWdodDogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXJcbik6IElUZXh0dXJlQXRsYXMge1xuICBjb25zdCBuZXdDb25maWcgPSBnZW5lcmF0ZUNvbmZpZyhkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQsIGRldmljZUNoYXJXaWR0aCwgZGV2aWNlQ2hhckhlaWdodCwgb3B0aW9ucywgY29sb3JzLCBkZXZpY2VQaXhlbFJhdGlvKTtcblxuICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHRlcm1pbmFsIGFscmVhZHkgb3ducyB0aGlzIGNvbmZpZ1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJBdGxhc0NhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZW50cnkgPSBjaGFyQXRsYXNDYWNoZVtpXTtcbiAgICBjb25zdCBvd25lZEJ5SW5kZXggPSBlbnRyeS5vd25lZEJ5LmluZGV4T2YodGVybWluYWwpO1xuICAgIGlmIChvd25lZEJ5SW5kZXggPj0gMCkge1xuICAgICAgaWYgKGNvbmZpZ0VxdWFscyhlbnRyeS5jb25maWcsIG5ld0NvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5LmF0bGFzO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGNvbmZpZ3MgZGlmZmVyLCByZWxlYXNlIHRoZSB0ZXJtaW5hbCBmcm9tIHRoZSBlbnRyeVxuICAgICAgaWYgKGVudHJ5Lm93bmVkQnkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGVudHJ5LmF0bGFzLmRpc3Bvc2UoKTtcbiAgICAgICAgY2hhckF0bGFzQ2FjaGUuc3BsaWNlKGksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkub3duZWRCeS5zcGxpY2Uob3duZWRCeUluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRyeSBtYXRjaCBhIGNoYXIgYXRsYXMgZnJvbSB0aGUgY2FjaGVcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyQXRsYXNDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gY2hhckF0bGFzQ2FjaGVbaV07XG4gICAgaWYgKGNvbmZpZ0VxdWFscyhlbnRyeS5jb25maWcsIG5ld0NvbmZpZykpIHtcbiAgICAgIC8vIEFkZCB0aGUgdGVybWluYWwgdG8gdGhlIGNhY2hlIGVudHJ5IGFuZCByZXR1cm5cbiAgICAgIGVudHJ5Lm93bmVkQnkucHVzaCh0ZXJtaW5hbCk7XG4gICAgICByZXR1cm4gZW50cnkuYXRsYXM7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29yZTogSVRlcm1pbmFsID0gKHRlcm1pbmFsIGFzIGFueSkuX2NvcmU7XG4gIGNvbnN0IG5ld0VudHJ5OiBJVGV4dHVyZUF0bGFzQ2FjaGVFbnRyeSA9IHtcbiAgICBhdGxhczogbmV3IFRleHR1cmVBdGxhcyhkb2N1bWVudCwgbmV3Q29uZmlnLCBjb3JlLnVuaWNvZGVTZXJ2aWNlKSxcbiAgICBjb25maWc6IG5ld0NvbmZpZyxcbiAgICBvd25lZEJ5OiBbdGVybWluYWxdXG4gIH07XG4gIGNoYXJBdGxhc0NhY2hlLnB1c2gobmV3RW50cnkpO1xuICByZXR1cm4gbmV3RW50cnkuYXRsYXM7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIHRlcm1pbmFsIHJlZmVyZW5jZSBmcm9tIHRoZSBjYWNoZSwgYWxsb3dpbmcgaXRzIG1lbW9yeSB0byBiZSBmcmVlZC5cbiAqIEBwYXJhbSB0ZXJtaW5hbCBUaGUgdGVybWluYWwgdG8gcmVtb3ZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVGVybWluYWxGcm9tQ2FjaGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhckF0bGFzQ2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbmRleCA9IGNoYXJBdGxhc0NhY2hlW2ldLm93bmVkQnkuaW5kZXhPZih0ZXJtaW5hbCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgaWYgKGNoYXJBdGxhc0NhY2hlW2ldLm93bmVkQnkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgY2FjaGUgZW50cnkgaWYgaXQncyB0aGUgb25seSB0ZXJtaW5hbFxuICAgICAgICBjaGFyQXRsYXNDYWNoZVtpXS5hdGxhcy5kaXNwb3NlKCk7XG4gICAgICAgIGNoYXJBdGxhc0NhY2hlLnNwbGljZShpLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGNhY2hlIGVudHJ5XG4gICAgICAgIGNoYXJBdGxhc0NhY2hlW2ldLm93bmVkQnkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNoYXJBdGxhc0NvbmZpZyB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlcyB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IElUZXJtaW5hbE9wdGlvbnMgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgSUNvbG9yU2V0LCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBOVUxMX0NPTE9SIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ29uZmlnKGRldmljZUNlbGxXaWR0aDogbnVtYmVyLCBkZXZpY2VDZWxsSGVpZ2h0OiBudW1iZXIsIGRldmljZUNoYXJXaWR0aDogbnVtYmVyLCBkZXZpY2VDaGFySGVpZ2h0OiBudW1iZXIsIG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+LCBjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQsIGRldmljZVBpeGVsUmF0aW86IG51bWJlcik6IElDaGFyQXRsYXNDb25maWcge1xuICAvLyBudWxsIG91dCBzb21lIGZpZWxkcyB0aGF0IGRvbid0IG1hdHRlclxuICBjb25zdCBjbG9uZWRDb2xvcnM6IElDb2xvclNldCA9IHtcbiAgICBmb3JlZ3JvdW5kOiBjb2xvcnMuZm9yZWdyb3VuZCxcbiAgICBiYWNrZ3JvdW5kOiBjb2xvcnMuYmFja2dyb3VuZCxcbiAgICBjdXJzb3I6IE5VTExfQ09MT1IsXG4gICAgY3Vyc29yQWNjZW50OiBOVUxMX0NPTE9SLFxuICAgIHNlbGVjdGlvbkZvcmVncm91bmQ6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50OiBOVUxMX0NPTE9SLFxuICAgIHNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWU6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IE5VTExfQ09MT1IsXG4gICAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlOiBOVUxMX0NPTE9SLFxuICAgIC8vIEZvciB0aGUgc3RhdGljIGNoYXIgYXRsYXMsIHdlIG9ubHkgdXNlIHRoZSBmaXJzdCAxNiBjb2xvcnMsIGJ1dCB3ZSBuZWVkIGFsbCAyNTYgZm9yIHRoZVxuICAgIC8vIGR5bmFtaWMgY2hhcmFjdGVyIGF0bGFzLlxuICAgIGFuc2k6IGNvbG9ycy5hbnNpLnNsaWNlKCksXG4gICAgY29udHJhc3RDYWNoZTogY29sb3JzLmNvbnRyYXN0Q2FjaGUsXG4gICAgaGFsZkNvbnRyYXN0Q2FjaGU6IGNvbG9ycy5oYWxmQ29udHJhc3RDYWNoZVxuICB9O1xuICByZXR1cm4ge1xuICAgIGN1c3RvbUdseXBoczogb3B0aW9ucy5jdXN0b21HbHlwaHMsXG4gICAgZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICBsZXR0ZXJTcGFjaW5nOiBvcHRpb25zLmxldHRlclNwYWNpbmcsXG4gICAgbGluZUhlaWdodDogb3B0aW9ucy5saW5lSGVpZ2h0LFxuICAgIGRldmljZUNlbGxXaWR0aDogZGV2aWNlQ2VsbFdpZHRoLFxuICAgIGRldmljZUNlbGxIZWlnaHQ6IGRldmljZUNlbGxIZWlnaHQsXG4gICAgZGV2aWNlQ2hhcldpZHRoOiBkZXZpY2VDaGFyV2lkdGgsXG4gICAgZGV2aWNlQ2hhckhlaWdodDogZGV2aWNlQ2hhckhlaWdodCxcbiAgICBmb250RmFtaWx5OiBvcHRpb25zLmZvbnRGYW1pbHksXG4gICAgZm9udFNpemU6IG9wdGlvbnMuZm9udFNpemUsXG4gICAgZm9udFdlaWdodDogb3B0aW9ucy5mb250V2VpZ2h0LFxuICAgIGZvbnRXZWlnaHRCb2xkOiBvcHRpb25zLmZvbnRXZWlnaHRCb2xkLFxuICAgIGFsbG93VHJhbnNwYXJlbmN5OiBvcHRpb25zLmFsbG93VHJhbnNwYXJlbmN5LFxuICAgIGRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzOiBvcHRpb25zLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzLFxuICAgIG1pbmltdW1Db250cmFzdFJhdGlvOiBvcHRpb25zLm1pbmltdW1Db250cmFzdFJhdGlvLFxuICAgIGNvbG9yczogY2xvbmVkQ29sb3JzXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWdFcXVhbHMoYTogSUNoYXJBdGxhc0NvbmZpZywgYjogSUNoYXJBdGxhc0NvbmZpZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEuY29sb3JzLmFuc2kubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYS5jb2xvcnMuYW5zaVtpXS5yZ2JhICE9PSBiLmNvbG9ycy5hbnNpW2ldLnJnYmEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGEuZGV2aWNlUGl4ZWxSYXRpbyA9PT0gYi5kZXZpY2VQaXhlbFJhdGlvICYmXG4gICAgICBhLmN1c3RvbUdseXBocyA9PT0gYi5jdXN0b21HbHlwaHMgJiZcbiAgICAgIGEubGluZUhlaWdodCA9PT0gYi5saW5lSGVpZ2h0ICYmXG4gICAgICBhLmxldHRlclNwYWNpbmcgPT09IGIubGV0dGVyU3BhY2luZyAmJlxuICAgICAgYS5mb250RmFtaWx5ID09PSBiLmZvbnRGYW1pbHkgJiZcbiAgICAgIGEuZm9udFNpemUgPT09IGIuZm9udFNpemUgJiZcbiAgICAgIGEuZm9udFdlaWdodCA9PT0gYi5mb250V2VpZ2h0ICYmXG4gICAgICBhLmZvbnRXZWlnaHRCb2xkID09PSBiLmZvbnRXZWlnaHRCb2xkICYmXG4gICAgICBhLmFsbG93VHJhbnNwYXJlbmN5ID09PSBiLmFsbG93VHJhbnNwYXJlbmN5ICYmXG4gICAgICBhLmRldmljZUNoYXJXaWR0aCA9PT0gYi5kZXZpY2VDaGFyV2lkdGggJiZcbiAgICAgIGEuZGV2aWNlQ2hhckhlaWdodCA9PT0gYi5kZXZpY2VDaGFySGVpZ2h0ICYmXG4gICAgICBhLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzID09PSBiLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzICYmXG4gICAgICBhLm1pbmltdW1Db250cmFzdFJhdGlvID09PSBiLm1pbmltdW1Db250cmFzdFJhdGlvICYmXG4gICAgICBhLmNvbG9ycy5mb3JlZ3JvdW5kLnJnYmEgPT09IGIuY29sb3JzLmZvcmVncm91bmQucmdiYSAmJlxuICAgICAgYS5jb2xvcnMuYmFja2dyb3VuZC5yZ2JhID09PSBiLmNvbG9ycy5iYWNrZ3JvdW5kLnJnYmE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpczI1NkNvbG9yKGNvbG9yQ29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoY29sb3JDb2RlICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMTYgfHwgKGNvbG9yQ29kZSAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1Njtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGlzRmlyZWZveCwgaXNMZWdhY3lFZGdlIH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcblxuZXhwb3J0IGNvbnN0IElOVkVSVEVEX0RFRkFVTFRfQ09MT1IgPSAyNTc7XG5cbmV4cG9ydCBjb25zdCBESU1fT1BBQ0lUWSA9IDAuNTtcbi8vIFRoZSB0ZXh0IGJhc2VsaW5lIGlzIHNldCBjb25kaXRpb25hbGx5IGJ5IGJyb3dzZXIuIFVzaW5nICdpZGVvZ3JhcGhpYycgZm9yIEZpcmVmb3ggb3IgTGVnYWN5IEVkZ2Vcbi8vIHdvdWxkIHJlc3VsdCBpbiB0cnVuY2F0ZWQgdGV4dCAoSXNzdWUgMzM1MykuIFVzaW5nICdib3R0b20nIGZvciBDaHJvbWUgd291bGQgcmVzdWx0IGluIHNsaWdodGx5XG4vLyB1bmFsaWduZWQgUG93ZXJsaW5lIGZvbnRzIChQUiAzMzU2I2lzc3VlY29tbWVudC04NTA5MjgxNzkpLlxuZXhwb3J0IGNvbnN0IFRFWFRfQkFTRUxJTkU6IENhbnZhc1RleHRCYXNlbGluZSA9IGlzRmlyZWZveCB8fCBpc0xlZ2FjeUVkZ2UgPyAnYm90dG9tJyA6ICdpZGVvZ3JhcGhpYyc7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ29yZUJyb3dzZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbi8qKlxuICogVGhlIHRpbWUgYmV0d2VlbiBjdXJzb3IgYmxpbmtzLlxuICovXG5jb25zdCBCTElOS19JTlRFUlZBTCA9IDYwMDtcblxuZXhwb3J0IGNsYXNzIEN1cnNvckJsaW5rU3RhdGVNYW5hZ2VyIHtcbiAgcHVibGljIGlzQ3Vyc29yVmlzaWJsZTogYm9vbGVhbjtcblxuICBwcml2YXRlIF9hbmltYXRpb25GcmFtZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9ibGlua1N0YXJ0VGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9ibGlua0ludGVydmFsOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIGF0IHdoaWNoIHRoZSBhbmltYXRpb24gZnJhbWUgd2FzIHJlc3RhcnRlZCwgdGhpcyBpcyB1c2VkIG9uIHRoZVxuICAgKiBuZXh0IHJlbmRlciB0byByZXN0YXJ0IHRoZSB0aW1lcnMgc28gdGhleSBkb24ndCBuZWVkIHRvIHJlc3RhcnQgdGhlIHRpbWVyc1xuICAgKiBtdWx0aXBsZSB0aW1lcyBvdmVyIGEgc2hvcnQgcGVyaW9kLlxuICAgKi9cbiAgcHJpdmF0ZSBfYW5pbWF0aW9uVGltZVJlc3RhcnRlZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3JlbmRlckNhbGxiYWNrOiAoKSA9PiB2b2lkLFxuICAgIHByaXZhdGUgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZVxuICApIHtcbiAgICB0aGlzLmlzQ3Vyc29yVmlzaWJsZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQpIHtcbiAgICAgIHRoaXMuX3Jlc3RhcnRJbnRlcnZhbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQYXVzZWQoKTogYm9vbGVhbiB7IHJldHVybiAhKHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0IHx8IHRoaXMuX2JsaW5rSW50ZXJ2YWwpOyB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2JsaW5rSW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9ibGlua0ludGVydmFsKTtcbiAgICAgIHRoaXMuX2JsaW5rSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9ibGlua1N0YXJ0VGltZW91dCkge1xuICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYmxpbmtTdGFydFRpbWVvdXQpO1xuICAgICAgdGhpcy5fYmxpbmtTdGFydFRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9hbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZSk7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzdGFydEJsaW5rQW5pbWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUGF1c2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFNhdmUgYSB0aW1lc3RhbXAgc28gdGhhdCB0aGUgcmVzdGFydCBjYW4gYmUgZG9uZSBvbiB0aGUgbmV4dCBpbnRlcnZhbFxuICAgIHRoaXMuX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQgPSBEYXRlLm5vdygpO1xuICAgIC8vIEZvcmNlIGEgY3Vyc29yIHJlbmRlciB0byBlbnN1cmUgaXQncyB2aXNpYmxlIGFuZCBpbiB0aGUgY29ycmVjdCBwb3NpdGlvblxuICAgIHRoaXMuaXNDdXJzb3JWaXNpYmxlID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuX2FuaW1hdGlvbkZyYW1lKSB7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVuZGVyQ2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXN0YXJ0SW50ZXJ2YWwodGltZVRvU3RhcnQ6IG51bWJlciA9IEJMSU5LX0lOVEVSVkFMKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIGludGVydmFsXG4gICAgaWYgKHRoaXMuX2JsaW5rSW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9ibGlua0ludGVydmFsKTtcbiAgICAgIHRoaXMuX2JsaW5rSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgdGhlIGluaXRpYWwgdGltZW91dCB3aGljaCB3aWxsIGhpZGUgdGhlIGN1cnNvciwgdGhpcyBpcyBkb25lIGJlZm9yZVxuICAgIC8vIHRoZSByZWd1bGFyIGludGVydmFsIGlzIHNldHVwIGluIG9yZGVyIHRvIHN1cHBvcnQgcmVzdGFydGluZyB0aGUgYmxpbmtcbiAgICAvLyBhbmltYXRpb24gaW4gYSBsaWdodHdlaWdodCB3YXkgKHdpdGhvdXQgdGhyYXNoaW5nIGNsZWFySW50ZXJ2YWwgYW5kXG4gICAgLy8gc2V0SW50ZXJ2YWwpLlxuICAgIHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0ID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIGFub3RoZXIgYW5pbWF0aW9uIHJlc3RhcnQgd2FzIHJlcXVlc3RlZCB3aGlsZSB0aGlzIHdhcyBiZWluZ1xuICAgICAgLy8gc3RhcnRlZFxuICAgICAgaWYgKHRoaXMuX2FuaW1hdGlvblRpbWVSZXN0YXJ0ZWQpIHtcbiAgICAgICAgY29uc3QgdGltZSA9IEJMSU5LX0lOVEVSVkFMIC0gKERhdGUubm93KCkgLSB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkKTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRpbWUgPiAwKSB7XG4gICAgICAgICAgdGhpcy5fcmVzdGFydEludGVydmFsKHRpbWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIaWRlIHRoZSBjdXJzb3JcbiAgICAgIHRoaXMuaXNDdXJzb3JWaXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVuZGVyQ2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0dXAgdGhlIGJsaW5rIGludGVydmFsXG4gICAgICB0aGlzLl9ibGlua0ludGVydmFsID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIC8vIEFkanVzdCB0aGUgYW5pbWF0aW9uIHRpbWUgaWYgaXQgd2FzIHJlc3RhcnRlZFxuICAgICAgICBpZiAodGhpcy5fYW5pbWF0aW9uVGltZVJlc3RhcnRlZCkge1xuICAgICAgICAgIC8vIGNhbGMgdGltZSBkaWZmXG4gICAgICAgICAgLy8gTWFrZSByZXN0YXJ0IGludGVydmFsIGRvIGEgc2V0VGltZW91dCBpbml0aWFsbHk/XG4gICAgICAgICAgY29uc3QgdGltZSA9IEJMSU5LX0lOVEVSVkFMIC0gKERhdGUubm93KCkgLSB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkKTtcbiAgICAgICAgICB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMuX3Jlc3RhcnRJbnRlcnZhbCh0aW1lKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbnZlcnQgdmlzaWJpbGl0eSBhbmQgcmVuZGVyXG4gICAgICAgIHRoaXMuaXNDdXJzb3JWaXNpYmxlID0gIXRoaXMuaXNDdXJzb3JWaXNpYmxlO1xuICAgICAgICB0aGlzLl9hbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZW5kZXJDYWxsYmFjaygpO1xuICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgIH0sIEJMSU5LX0lOVEVSVkFMKTtcbiAgICB9LCB0aW1lVG9TdGFydCk7XG4gIH1cblxuICBwdWJsaWMgcGF1c2UoKTogdm9pZCB7XG4gICAgdGhpcy5pc0N1cnNvclZpc2libGUgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9ibGlua0ludGVydmFsKSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fYmxpbmtJbnRlcnZhbCk7XG4gICAgICB0aGlzLl9ibGlua0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYmxpbmtTdGFydFRpbWVvdXQpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0KTtcbiAgICAgIHRoaXMuX2JsaW5rU3RhcnRUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uRnJhbWUpO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc3VtZSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBvdXQgYW55IGV4aXN0aW5nIHRpbWVycyBqdXN0IGluIGNhc2VcbiAgICB0aGlzLnBhdXNlKCk7XG5cbiAgICB0aGlzLl9hbmltYXRpb25UaW1lUmVzdGFydGVkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jlc3RhcnRJbnRlcnZhbCgpO1xuICAgIHRoaXMucmVzdGFydEJsaW5rQW5pbWF0aW9uKCk7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IHRocm93SWZGYWxzeSB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuXG5pbnRlcmZhY2UgSUJsb2NrVmVjdG9yIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgaDogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgYmxvY2tFbGVtZW50RGVmaW5pdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBJQmxvY2tWZWN0b3JbXSB8IHVuZGVmaW5lZCB9ID0ge1xuICAvLyBCbG9jayBlbGVtZW50cyAoMHgyNTgwLTB4MjU5MClcbiAgJ+KWgCc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDQgfV0sIC8vIFVQUEVSIEhBTEYgQkxPQ0tcbiAgJ+KWgSc6IFt7IHg6IDAsIHk6IDcsIHc6IDgsIGg6IDEgfV0sIC8vIExPV0VSIE9ORSBFSUdIVEggQkxPQ0tcbiAgJ+KWgic6IFt7IHg6IDAsIHk6IDYsIHc6IDgsIGg6IDIgfV0sIC8vIExPV0VSIE9ORSBRVUFSVEVSIEJMT0NLXG4gICfiloMnOiBbeyB4OiAwLCB5OiA1LCB3OiA4LCBoOiAzIH1dLCAvLyBMT1dFUiBUSFJFRSBFSUdIVEhTIEJMT0NLXG4gICfiloQnOiBbeyB4OiAwLCB5OiA0LCB3OiA4LCBoOiA0IH1dLCAvLyBMT1dFUiBIQUxGIEJMT0NLXG4gICfiloUnOiBbeyB4OiAwLCB5OiAzLCB3OiA4LCBoOiA1IH1dLCAvLyBMT1dFUiBGSVZFIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWhic6IFt7IHg6IDAsIHk6IDIsIHc6IDgsIGg6IDYgfV0sIC8vIExPV0VSIFRIUkVFIFFVQVJURVJTIEJMT0NLXG4gICfilocnOiBbeyB4OiAwLCB5OiAxLCB3OiA4LCBoOiA3IH1dLCAvLyBMT1dFUiBTRVZFTiBFSUdIVEhTIEJMT0NLXG4gICfilognOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiA4IH1dLCAvLyBGVUxMIEJMT0NLXG4gICfiloknOiBbeyB4OiAwLCB5OiAwLCB3OiA3LCBoOiA4IH1dLCAvLyBMRUZUIFNFVkVOIEVJR0hUSFMgQkxPQ0tcbiAgJ+KWiic6IFt7IHg6IDAsIHk6IDAsIHc6IDYsIGg6IDggfV0sIC8vIExFRlQgVEhSRUUgUVVBUlRFUlMgQkxPQ0tcbiAgJ+KWiyc6IFt7IHg6IDAsIHk6IDAsIHc6IDUsIGg6IDggfV0sIC8vIExFRlQgRklWRSBFSUdIVEhTIEJMT0NLXG4gICfilownOiBbeyB4OiAwLCB5OiAwLCB3OiA0LCBoOiA4IH1dLCAvLyBMRUZUIEhBTEYgQkxPQ0tcbiAgJ+KWjSc6IFt7IHg6IDAsIHk6IDAsIHc6IDMsIGg6IDggfV0sIC8vIExFRlQgVEhSRUUgRUlHSFRIUyBCTE9DS1xuICAn4paOJzogW3sgeDogMCwgeTogMCwgdzogMiwgaDogOCB9XSwgLy8gTEVGVCBPTkUgUVVBUlRFUiBCTE9DS1xuICAn4paPJzogW3sgeDogMCwgeTogMCwgdzogMSwgaDogOCB9XSwgLy8gTEVGVCBPTkUgRUlHSFRIIEJMT0NLXG4gICfilpAnOiBbeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA4IH1dLCAvLyBSSUdIVCBIQUxGIEJMT0NLXG5cbiAgLy8gQmxvY2sgZWxlbWVudHMgKDB4MjU5NC0weDI1OTUpXG4gICfilpQnOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiAxIH1dLCAvLyBVUFBFUiBPTkUgRUlHSFRIIEJMT0NLXG4gICfilpUnOiBbeyB4OiA3LCB5OiAwLCB3OiAxLCBoOiA4IH1dLCAvLyBSSUdIVCBPTkUgRUlHSFRIIEJMT0NLXG5cbiAgLy8gVGVybWluYWwgZ3JhcGhpYyBjaGFyYWN0ZXJzICgweDI1OTYtMHgyNTlGKVxuICAn4paWJzogW3sgeDogMCwgeTogNCwgdzogNCwgaDogNCB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVQURSQU5UIExPV0VSIExFRlRcbiAgJ+KWlyc6IFt7IHg6IDQsIHk6IDQsIHc6IDQsIGg6IDQgfV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBRVUFEUkFOVCBMT1dFUiBSSUdIVFxuICAn4paYJzogW3sgeDogMCwgeTogMCwgdzogNCwgaDogNCB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVQURSQU5UIFVQUEVSIExFRlRcbiAgJ+KWmSc6IFt7IHg6IDAsIHk6IDAsIHc6IDQsIGg6IDggfSwgeyB4OiAwLCB5OiA0LCB3OiA4LCBoOiA0IH1dLCAvLyBRVUFEUkFOVCBVUFBFUiBMRUZUIEFORCBMT1dFUiBMRUZUIEFORCBMT1dFUiBSSUdIVFxuICAn4paaJzogW3sgeDogMCwgeTogMCwgdzogNCwgaDogNCB9LCB7IHg6IDQsIHk6IDQsIHc6IDQsIGg6IDQgfV0sIC8vIFFVQURSQU5UIFVQUEVSIExFRlQgQU5EIExPV0VSIFJJR0hUXG4gICfilpsnOiBbeyB4OiAwLCB5OiAwLCB3OiA0LCBoOiA4IH0sIHsgeDogNCwgeTogMCwgdzogNCwgaDogNCB9XSwgLy8gUVVBRFJBTlQgVVBQRVIgTEVGVCBBTkQgVVBQRVIgUklHSFQgQU5EIExPV0VSIExFRlRcbiAgJ+KWnCc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDQgfSwgeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA4IH1dLCAvLyBRVUFEUkFOVCBVUFBFUiBMRUZUIEFORCBVUFBFUiBSSUdIVCBBTkQgTE9XRVIgUklHSFRcbiAgJ+KWnSc6IFt7IHg6IDQsIHk6IDAsIHc6IDQsIGg6IDQgfV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBRVUFEUkFOVCBVUFBFUiBSSUdIVFxuICAn4paeJzogW3sgeDogNCwgeTogMCwgdzogNCwgaDogNCB9LCB7IHg6IDAsIHk6IDQsIHc6IDQsIGg6IDQgfV0sIC8vIFFVQURSQU5UIFVQUEVSIFJJR0hUIEFORCBMT1dFUiBMRUZUXG4gICfilp8nOiBbeyB4OiA0LCB5OiAwLCB3OiA0LCBoOiA4IH0sIHsgeDogMCwgeTogNCwgdzogOCwgaDogNCB9XSwgLy8gUVVBRFJBTlQgVVBQRVIgUklHSFQgQU5EIExPV0VSIExFRlQgQU5EIExPV0VSIFJJR0hUXG5cbiAgLy8gVkVSVElDQUwgT05FIEVJR0hUSCBCTE9DSy0yIHRocm91Z2ggVkVSVElDQUwgT05FIEVJR0hUSCBCTE9DSy03XG4gICdcXHV7MUZCNzB9JzogW3sgeDogMSwgeTogMCwgdzogMSwgaDogOCB9XSxcbiAgJ1xcdXsxRkI3MX0nOiBbeyB4OiAyLCB5OiAwLCB3OiAxLCBoOiA4IH1dLFxuICAnXFx1ezFGQjcyfSc6IFt7IHg6IDMsIHk6IDAsIHc6IDEsIGg6IDggfV0sXG4gICdcXHV7MUZCNzN9JzogW3sgeDogNCwgeTogMCwgdzogMSwgaDogOCB9XSxcbiAgJ1xcdXsxRkI3NH0nOiBbeyB4OiA1LCB5OiAwLCB3OiAxLCBoOiA4IH1dLFxuICAnXFx1ezFGQjc1fSc6IFt7IHg6IDYsIHk6IDAsIHc6IDEsIGg6IDggfV0sXG5cbiAgLy8gSE9SSVpPTlRBTCBPTkUgRUlHSFRIIEJMT0NLLTIgdGhyb3VnaCBIT1JJWk9OVEFMIE9ORSBFSUdIVEggQkxPQ0stN1xuICAnXFx1ezFGQjc2fSc6IFt7IHg6IDAsIHk6IDEsIHc6IDgsIGg6IDEgfV0sXG4gICdcXHV7MUZCNzd9JzogW3sgeDogMCwgeTogMiwgdzogOCwgaDogMSB9XSxcbiAgJ1xcdXsxRkI3OH0nOiBbeyB4OiAwLCB5OiAzLCB3OiA4LCBoOiAxIH1dLFxuICAnXFx1ezFGQjc5fSc6IFt7IHg6IDAsIHk6IDQsIHc6IDgsIGg6IDEgfV0sXG4gICdcXHV7MUZCN0F9JzogW3sgeDogMCwgeTogNSwgdzogOCwgaDogMSB9XSxcbiAgJ1xcdXsxRkI3Qn0nOiBbeyB4OiAwLCB5OiA2LCB3OiA4LCBoOiAxIH1dLFxuXG4gIC8vIExFRlQgQU5EIExPV0VSIE9ORSBFSUdIVEggQkxPQ0tcbiAgJ1xcdXsxRkI3Q30nOiBbeyB4OiAwLCB5OiAwLCB3OiAxLCBoOiA4IH0sIHsgeDogMCwgeTogNywgdzogOCwgaDogMSB9XSxcbiAgLy8gTEVGVCBBTkQgVVBQRVIgT05FIEVJR0hUSCBCTE9DS1xuICAnXFx1ezFGQjdEfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDEsIGg6IDggfSwgeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiAxIH1dLFxuICAvLyBSSUdIVCBBTkQgVVBQRVIgT05FIEVJR0hUSCBCTE9DS1xuICAnXFx1ezFGQjdFfSc6IFt7IHg6IDcsIHk6IDAsIHc6IDEsIGg6IDggfSwgeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiAxIH1dLFxuICAvLyBSSUdIVCBBTkQgTE9XRVIgT05FIEVJR0hUSCBCTE9DS1xuICAnXFx1ezFGQjdGfSc6IFt7IHg6IDcsIHk6IDAsIHc6IDEsIGg6IDggfSwgeyB4OiAwLCB5OiA3LCB3OiA4LCBoOiAxIH1dLFxuICAvLyBVUFBFUiBBTkQgTE9XRVIgT05FIEVJR0hUSCBCTE9DS1xuICAnXFx1ezFGQjgwfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfSwgeyB4OiAwLCB5OiA3LCB3OiA4LCBoOiAxIH1dLFxuICAvLyBIT1JJWk9OVEFMIE9ORSBFSUdIVEggQkxPQ0stMTM1OFxuICAnXFx1ezFGQjgxfSc6IFt7IHg6IDAsIHk6IDAsIHc6IDgsIGg6IDEgfSwgeyB4OiAwLCB5OiAyLCB3OiA4LCBoOiAxIH0sIHsgeDogMCwgeTogNCwgdzogOCwgaDogMSB9LCB7IHg6IDAsIHk6IDcsIHc6IDgsIGg6IDEgfV0sXG5cbiAgLy8gVVBQRVIgT05FIFFVQVJURVIgQkxPQ0tcbiAgJ1xcdXsxRkI4Mn0nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiAyIH1dLFxuICAvLyBVUFBFUiBUSFJFRSBFSUdIVEhTIEJMT0NLXG4gICdcXHV7MUZCODN9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogMyB9XSxcbiAgLy8gVVBQRVIgRklWRSBFSUdIVEhTIEJMT0NLXG4gICdcXHV7MUZCODR9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogNSB9XSxcbiAgLy8gVVBQRVIgVEhSRUUgUVVBUlRFUlMgQkxPQ0tcbiAgJ1xcdXsxRkI4NX0nOiBbeyB4OiAwLCB5OiAwLCB3OiA4LCBoOiA2IH1dLFxuICAvLyBVUFBFUiBTRVZFTiBFSUdIVEhTIEJMT0NLXG4gICdcXHV7MUZCODZ9JzogW3sgeDogMCwgeTogMCwgdzogOCwgaDogNyB9XSxcblxuICAvLyBSSUdIVCBPTkUgUVVBUlRFUiBCTE9DS1xuICAnXFx1ezFGQjg3fSc6IFt7IHg6IDYsIHk6IDAsIHc6IDIsIGg6IDggfV0sXG4gIC8vIFJJR0hUIFRIUkVFIEVJR0hUSFMgQjBPQ0tcbiAgJ1xcdXsxRkI4OH0nOiBbeyB4OiA1LCB5OiAwLCB3OiAzLCBoOiA4IH1dLFxuICAvLyBSSUdIVCBGSVZFIEVJR0hUSFMgQkwwQ0tcbiAgJ1xcdXsxRkI4OX0nOiBbeyB4OiAzLCB5OiAwLCB3OiA1LCBoOiA4IH1dLFxuICAvLyBSSUdIVCBUSFJFRSBRVUFSVEVSUyAwTE9DS1xuICAnXFx1ezFGQjhBfSc6IFt7IHg6IDIsIHk6IDAsIHc6IDYsIGg6IDggfV0sXG4gIC8vIFJJR0hUIFNFVkVOIEVJR0hUSFMgQjBPQ0tcbiAgJ1xcdXsxRkI4Qn0nOiBbeyB4OiAxLCB5OiAwLCB3OiA3LCBoOiA4IH1dLFxuXG4gIC8vIENIRUNLRVIgQk9BUkQgRklMTFxuICAnXFx1ezFGQjk1fSc6IFtcbiAgICB7IHg6IDAsIHk6IDAsIHc6IDIsIGg6IDIgfSwgeyB4OiA0LCB5OiAwLCB3OiAyLCBoOiAyIH0sXG4gICAgeyB4OiAyLCB5OiAyLCB3OiAyLCBoOiAyIH0sIHsgeDogNiwgeTogMiwgdzogMiwgaDogMiB9LFxuICAgIHsgeDogMCwgeTogNCwgdzogMiwgaDogMiB9LCB7IHg6IDQsIHk6IDQsIHc6IDIsIGg6IDIgfSxcbiAgICB7IHg6IDIsIHk6IDYsIHc6IDIsIGg6IDIgfSwgeyB4OiA2LCB5OiA2LCB3OiAyLCBoOiAyIH1cbiAgXSxcbiAgLy8gSU5WRVJTRSBDSEVDS0VSIEJPQVJEIEZJTExcbiAgJ1xcdXsxRkI5Nn0nOiBbXG4gICAgeyB4OiAyLCB5OiAwLCB3OiAyLCBoOiAyIH0sIHsgeDogNiwgeTogMCwgdzogMiwgaDogMiB9LFxuICAgIHsgeDogMCwgeTogMiwgdzogMiwgaDogMiB9LCB7IHg6IDQsIHk6IDIsIHc6IDIsIGg6IDIgfSxcbiAgICB7IHg6IDIsIHk6IDQsIHc6IDIsIGg6IDIgfSwgeyB4OiA2LCB5OiA0LCB3OiAyLCBoOiAyIH0sXG4gICAgeyB4OiAwLCB5OiA2LCB3OiAyLCBoOiAyIH0sIHsgeDogNCwgeTogNiwgdzogMiwgaDogMiB9XG4gIF0sXG4gIC8vIEhFQVZZIEhPUklaT05UQUwgRklMTCAodXBwZXIgbWlkZGxlIGFuZCBsb3dlciBvbmUgcXVhcnRlciBibG9jaylcbiAgJ1xcdXsxRkI5N30nOiBbeyB4OiAwLCB5OiAyLCB3OiA4LCBoOiAyIH0sIHsgeDogMCwgeTogNiwgdzogOCwgaDogMiB9XVxufTtcblxudHlwZSBQYXR0ZXJuRGVmaW5pdGlvbiA9IG51bWJlcltdW107XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVwZWF0aW5nIHBhdHRlcm4gdXNlZCBieSBzcGVjaWFsIGNoYXJhY3RlcnMsIHRoZSBwYXR0ZXJuIGlzIG1hZGUgdXAgb2YgYSAyZCBhcnJheSBvZlxuICogcGl4ZWwgdmFsdWVzIHRvIGJlIGZpbGxlZCAoMSkgb3Igbm90IGZpbGxlZCAoMCkuXG4gKi9cbmNvbnN0IHBhdHRlcm5DaGFyYWN0ZXJEZWZpbml0aW9uczogeyBba2V5OiBzdHJpbmddOiBQYXR0ZXJuRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB9ID0ge1xuICAvLyBTaGFkZSBjaGFyYWN0ZXJzICgweDI1OTEtMHgyNTkzKVxuICAn4paRJzogWyAvLyBMSUdIVCBTSEFERSAoMjUlKVxuICAgIFsxLCAwLCAwLCAwXSxcbiAgICBbMCwgMCwgMCwgMF0sXG4gICAgWzAsIDAsIDEsIDBdLFxuICAgIFswLCAwLCAwLCAwXVxuICBdLFxuICAn4paSJzogWyAvLyBNRURJVU0gU0hBREUgKDUwJSlcbiAgICBbMSwgMF0sXG4gICAgWzAsIDBdLFxuICAgIFswLCAxXSxcbiAgICBbMCwgMF1cbiAgXSxcbiAgJ+KWkyc6IFsgLy8gREFSSyBTSEFERSAoNzUlKVxuICAgIFswLCAxXSxcbiAgICBbMSwgMV0sXG4gICAgWzEsIDBdLFxuICAgIFsxLCAxXVxuICBdXG59O1xuXG5jb25zdCBlbnVtIFNoYXBlcyB7XG4gIC8qKiDilIIgKi8gVE9QX1RPX0JPVFRPTSA9ICdNLjUsMCBMLjUsMScsXG4gIC8qKiDilIAgKi8gTEVGVF9UT19SSUdIVCA9ICdNMCwuNSBMMSwuNScsXG5cbiAgLyoqIOKUlCAqLyBUT1BfVE9fUklHSFQgPSAnTS41LDAgTC41LC41IEwxLC41JyxcbiAgLyoqIOKUmCAqLyBUT1BfVE9fTEVGVCA9ICdNLjUsMCBMLjUsLjUgTDAsLjUnLFxuICAvKiog4pSQICovIExFRlRfVE9fQk9UVE9NID0gJ00wLC41IEwuNSwuNSBMLjUsMScsXG4gIC8qKiDilIwgKi8gUklHSFRfVE9fQk9UVE9NID0gJ00wLjUsMSBMLjUsLjUgTDEsLjUnLFxuXG4gIC8qKiDilbUgKi8gTUlERExFX1RPX1RPUCA9ICdNLjUsLjUgTC41LDAnLFxuICAvKiog4pW0ICovIE1JRERMRV9UT19MRUZUID0gJ00uNSwuNSBMMCwuNScsXG4gIC8qKiDilbYgKi8gTUlERExFX1RPX1JJR0hUID0gJ00uNSwuNSBMMSwuNScsXG4gIC8qKiDilbcgKi8gTUlERExFX1RPX0JPVFRPTSA9ICdNLjUsLjUgTC41LDEnLFxuXG4gIC8qKiDilLQgKi8gVF9UT1AgPSAnTTAsLjUgTDEsLjUgTS41LC41IEwuNSwwJyxcbiAgLyoqIOKUpCAqLyBUX0xFRlQgPSAnTS41LDAgTC41LDEgTS41LC41IEwwLC41JyxcbiAgLyoqIOKUnCAqLyBUX1JJR0hUID0gJ00uNSwwIEwuNSwxIE0uNSwuNSBMMSwuNScsXG4gIC8qKiDilKwgKi8gVF9CT1RUT00gPSAnTTAsLjUgTDEsLjUgTS41LC41IEwuNSwxJyxcblxuICAvKiog4pS8ICovIENST1NTID0gJ00wLC41IEwxLC41IE0uNSwwIEwuNSwxJyxcblxuICAvKiog4pWMICovIFRXT19EQVNIRVNfSE9SSVpPTlRBTCA9ICdNLjEsLjUgTC40LC41IE0uNiwuNSBMLjksLjUnLCAvLyAuMiBlbXB0eSwgLjMgZmlsbGVkXG4gIC8qKiDilIQgKi8gVEhSRUVfREFTSEVTX0hPUklaT05UQUwgPSAnTS4wNjY3LC41IEwuMjY2NywuNSBNLjQsLjUgTC42LC41IE0uNzMzMywuNSBMLjkzMzMsLjUnLCAvLyAuMTMzMyBlbXB0eSwgLjIgZmlsbGVkXG4gIC8qKiDilIkgKi8gRk9VUl9EQVNIRVNfSE9SSVpPTlRBTCA9ICdNLjA1LC41IEwuMiwuNSBNLjMsLjUgTC40NSwuNSBNLjU1LC41IEwuNywuNSBNLjgsLjUgTC45NSwuNScsIC8vIC4xIGVtcHR5LCAuMTUgZmlsbGVkXG4gIC8qKiDilY4gKi8gVFdPX0RBU0hFU19WRVJUSUNBTCA9ICdNLjUsLjEgTC41LC40IE0uNSwuNiBMLjUsLjknLFxuICAvKiog4pSGICovIFRIUkVFX0RBU0hFU19WRVJUSUNBTCA9ICdNLjUsLjA2NjcgTC41LC4yNjY3IE0uNSwuNCBMLjUsLjYgTS41LC43MzMzIEwuNSwuOTMzMycsXG4gIC8qKiDilIogKi8gRk9VUl9EQVNIRVNfVkVSVElDQUwgPSAnTS41LC4wNSBMLjUsLjIgTS41LC4zIEwuNSwuNDUgTC41LC41NSBNLjUsLjcgTC41LC45NScsXG59XG5cbmNvbnN0IGVudW0gU3R5bGUge1xuICBOT1JNQUwgPSAxLFxuICBCT0xEID0gM1xufVxuXG4vKipcbiAqIEBwYXJhbSB4cCBUaGUgcGVyY2VudGFnZSBvZiAxNSUgb2YgdGhlIHggYXhpcy5cbiAqIEBwYXJhbSB5cCBUaGUgcGVyY2VudGFnZSBvZiAxNSUgb2YgdGhlIHggYXhpcyBvbiB0aGUgeSBheGlzLlxuICovXG50eXBlIERyYXdGdW5jdGlvbkRlZmluaXRpb24gPSAoeHA6IG51bWJlciwgeXA6IG51bWJlcikgPT4gc3RyaW5nO1xuXG4vKipcbiAqIFRoaXMgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIGFsbCBib3ggZHJhd2luZyBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtYXQgb2YgU1ZHIHBhdGhzIChpZS4gdGhlXG4gKiBzdmcgZCBhdHRyaWJ1dGUpLlxuICovXG5leHBvcnQgY29uc3QgYm94RHJhd2luZ0RlZmluaXRpb25zOiB7IFtjaGFyYWN0ZXI6IHN0cmluZ106IHsgW2ZvbnRXZWlnaHQ6IG51bWJlcl06IHN0cmluZyB8IERyYXdGdW5jdGlvbkRlZmluaXRpb24gfSB8IHVuZGVmaW5lZCB9ID0ge1xuICAvLyBVbmlmb3JtIG5vcm1hbCBhbmQgYm9sZFxuICAn4pSAJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkxFRlRfVE9fUklHSFQgfSxcbiAgJ+KUgSc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5MRUZUX1RPX1JJR0hUIH0sXG4gICfilIInOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX0JPVFRPTSB9LFxuICAn4pSDJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRPUF9UT19CT1RUT00gfSxcbiAgJ+KUjCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00gfSxcbiAgJ+KUjyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5SSUdIVF9UT19CT1RUT00gfSxcbiAgJ+KUkCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX0JPVFRPTSB9LFxuICAn4pSTJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLkxFRlRfVE9fQk9UVE9NIH0sXG4gICfilJQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX1JJR0hUIH0sXG4gICfilJcnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVE9QX1RPX1JJR0hUIH0sXG4gICfilJgnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX0xFRlQgfSxcbiAgJ+KUmyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UT1BfVE9fTEVGVCB9LFxuICAn4pScJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRfUklHSFQgfSxcbiAgJ+KUoyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UX1JJR0hUIH0sXG4gICfilKQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVF9MRUZUIH0sXG4gICfilKsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVF9MRUZUIH0sXG4gICfilKwnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVF9CT1RUT00gfSxcbiAgJ+KUsyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UX0JPVFRPTSB9LFxuICAn4pS0JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRfVE9QIH0sXG4gICfilLsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVF9UT1AgfSxcbiAgJ+KUvCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5DUk9TUyB9LFxuICAn4pWLJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLkNST1NTIH0sXG4gICfilbQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KVuCc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5NSURETEVfVE9fTEVGVCB9LFxuICAn4pW1JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KVuSc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5NSURETEVfVE9fVE9QIH0sXG4gICfilbYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilbonOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuTUlERExFX1RPX1JJR0hUIH0sXG4gICfilbcnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pW7JzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLk1JRERMRV9UT19CT1RUT00gfSxcblxuICAvLyBEb3VibGUgYm9yZGVyXG4gICfilZAnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTAsJHsuNSAtIHlwfSBMMSwkey41IC0geXB9IE0wLCR7LjUgKyB5cH0gTDEsJHsuNSArIHlwfWAgfSxcbiAgJ+KVkSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNJHsuNSAtIHhwfSwwIEwkey41IC0geHB9LDEgTSR7LjUgKyB4cH0sMCBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWSJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwxIEwuNSwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTS41LCR7LjUgKyB5cH0gTDEsJHsuNSArIHlwfWAgfSxcbiAgJ+KVkyc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNJHsuNSAtIHhwfSwxIEwkey41IC0geHB9LC41IEwxLC41IE0key41ICsgeHB9LC41IEwkey41ICsgeHB9LDFgIH0sXG4gICfilZQnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTEsJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwkey41IC0geXB9IEwkey41IC0geHB9LDEgTTEsJHsuNSArIHlwfSBMJHsuNSArIHhwfSwkey41ICsgeXB9IEwkey41ICsgeHB9LDFgIH0sXG4gICfilZUnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTAsJHsuNSAtIHlwfSBMLjUsJHsuNSAtIHlwfSBMLjUsMSBNMCwkey41ICsgeXB9IEwuNSwkey41ICsgeXB9YCB9LFxuICAn4pWWJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41ICsgeHB9LDEgTCR7LjUgKyB4cH0sLjUgTDAsLjUgTSR7LjUgLSB4cH0sLjUgTCR7LjUgLSB4cH0sMWAgfSxcbiAgJ+KVlyc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41ICsgeXB9IEwkey41IC0geHB9LCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sMSBNMCwkey41IC0geXB9IEwkey41ICsgeHB9LCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVmCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMCBMLjUsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9IE0uNSwkey41IC0geXB9IEwxLCR7LjUgLSB5cH1gIH0sXG4gICfilZknOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTEsLjUgTCR7LjUgLSB4cH0sLjUgTCR7LjUgLSB4cH0sMCBNJHsuNSArIHhwfSwuNSBMJHsuNSArIHhwfSwwYCB9LFxuICAn4pWaJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0xLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwwIE0xLCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwwYCB9LFxuICAn4pWbJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0wLCR7LjUgKyB5cH0gTC41LCR7LjUgKyB5cH0gTC41LDAgTTAsJHsuNSAtIHlwfSBMLjUsJHsuNSAtIHlwfWAgfSxcbiAgJ+KVnCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwuNSBMJHsuNSArIHhwfSwuNSBMJHsuNSArIHhwfSwwIE0key41IC0geHB9LC41IEwkey41IC0geHB9LDBgIH0sXG4gICfilZ0nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTAsJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwkey41IC0geXB9IEwkey41IC0geHB9LDAgTTAsJHsuNSArIHlwfSBMJHsuNSArIHhwfSwkey41ICsgeXB9IEwkey41ICsgeHB9LDBgIH0sXG4gICfilZ4nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuVE9QX1RPX0JPVFRPTX0gTS41LCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNLjUsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9YCB9LFxuICAn4pWfJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41IC0geHB9LDAgTCR7LjUgLSB4cH0sMSBNJHsuNSArIHhwfSwwIEwkey41ICsgeHB9LDEgTSR7LjUgKyB4cH0sLjUgTDEsLjVgIH0sXG4gICfilaAnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTSR7LjUgLSB4cH0sMCBMJHsuNSAtIHhwfSwxIE0xLCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sJHsuNSArIHlwfSBMJHsuNSArIHhwfSwxIE0xLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwwYCB9LFxuICAn4pWhJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYCR7U2hhcGVzLlRPUF9UT19CT1RUT019IE0wLCR7LjUgLSB5cH0gTC41LCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMLjUsJHsuNSArIHlwfWAgfSxcbiAgJ+KVoic6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwuNSBMJHsuNSAtIHhwfSwuNSBNJHsuNSAtIHhwfSwwIEwkey41IC0geHB9LDEgTSR7LjUgKyB4cH0sMCBMJHsuNSArIHhwfSwxYCB9LFxuICAn4pWjJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0key41ICsgeHB9LDAgTCR7LjUgKyB4cH0sMSBNMCwkey41ICsgeXB9IEwkey41IC0geHB9LCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sMSBNMCwkey41IC0geXB9IEwkey41IC0geHB9LCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sMGAgfSxcbiAgJ+KVpCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9IE0uNSwkey41ICsgeXB9IEwuNSwxYCB9LFxuICAn4pWlJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYCR7U2hhcGVzLkxFRlRfVE9fUklHSFR9IE0key41IC0geHB9LC41IEwkey41IC0geHB9LDEgTSR7LjUgKyB4cH0sLjUgTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVpic6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41IC0geXB9IEwxLCR7LjUgLSB5cH0gTTAsJHsuNSArIHlwfSBMJHsuNSAtIHhwfSwkey41ICsgeXB9IEwkey41IC0geHB9LDEgTTEsJHsuNSArIHlwfSBMJHsuNSArIHhwfSwkey41ICsgeXB9IEwkey41ICsgeHB9LDFgIH0sXG4gICfilacnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTS41LDAgTC41LCR7LjUgLSB5cH0gTTAsJHsuNSAtIHlwfSBMMSwkey41IC0geXB9IE0wLCR7LjUgKyB5cH0gTDEsJHsuNSArIHlwfWAgfSxcbiAgJ+KVqCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfSBNJHsuNSAtIHhwfSwuNSBMJHsuNSAtIHhwfSwwIE0key41ICsgeHB9LC41IEwkey41ICsgeHB9LDBgIH0sXG4gICfilaknOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTTAsJHsuNSArIHlwfSBMMSwkey41ICsgeXB9IE0wLCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sJHsuNSAtIHlwfSBMJHsuNSAtIHhwfSwwIE0xLCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sJHsuNSAtIHlwfSBMJHsuNSArIHhwfSwwYCB9LFxuICAn4pWqJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYCR7U2hhcGVzLlRPUF9UT19CT1RUT019IE0wLCR7LjUgLSB5cH0gTDEsJHsuNSAtIHlwfSBNMCwkey41ICsgeXB9IEwxLCR7LjUgKyB5cH1gIH0sXG4gICfilasnOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgJHtTaGFwZXMuTEVGVF9UT19SSUdIVH0gTSR7LjUgLSB4cH0sMCBMJHsuNSAtIHhwfSwxIE0key41ICsgeHB9LDAgTCR7LjUgKyB4cH0sMWAgfSxcbiAgJ+KVrCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNMCwkey41ICsgeXB9IEwkey41IC0geHB9LCR7LjUgKyB5cH0gTCR7LjUgLSB4cH0sMSBNMSwkey41ICsgeXB9IEwkey41ICsgeHB9LCR7LjUgKyB5cH0gTCR7LjUgKyB4cH0sMSBNMCwkey41IC0geXB9IEwkey41IC0geHB9LCR7LjUgLSB5cH0gTCR7LjUgLSB4cH0sMCBNMSwkey41IC0geXB9IEwkey41ICsgeHB9LCR7LjUgLSB5cH0gTCR7LjUgKyB4cH0sMGAgfSxcblxuICAvLyBEaWFnb25hbFxuICAn4pWxJzogeyBbU3R5bGUuTk9STUFMXTogJ00xLDAgTDAsMScgfSxcbiAgJ+KVsic6IHsgW1N0eWxlLk5PUk1BTF06ICdNMCwwIEwxLDEnIH0sXG4gICfilbMnOiB7IFtTdHlsZS5OT1JNQUxdOiAnTTEsMCBMMCwxIE0wLDAgTDEsMScgfSxcblxuICAvLyBNaXhlZCB3ZWlnaHRcbiAgJ+KVvCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pW9JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pW+JzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KVvyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KUjSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pSOJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pSRJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUkic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00gfSxcbiAgJ+KUlSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fVE9QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pSWJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pSZJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQgfSxcbiAgJ+KUmic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fTEVGVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KUnSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCB9LFxuICAn4pSeJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlJJR0hUX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX1RPUCB9LFxuICAn4pSfJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRPUF9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSB9LFxuICAn4pSgJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX0JPVFRPTSB9LFxuICAn4pShJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuVE9QX1RPX1JJR0hUIH0sXG4gICfilKInOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1RPUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00gfSxcbiAgJ+KUpSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19MRUZUIH0sXG4gICfilKYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fVE9QIH0sXG4gICfilKcnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NIH0sXG4gICfilKgnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NIH0sXG4gICfilKknOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0JPVFRPTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fTEVGVCB9LFxuICAn4pSqJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00gfSxcbiAgJ+KUrSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19MRUZUIH0sXG4gICfilK4nOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KUryc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLkxFRlRfVE9fUklHSFQgfSxcbiAgJ+KUsCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00gfSxcbiAgJ+KUsSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLkxFRlRfVE9fQk9UVE9NIH0sXG4gICfilLInOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00gfSxcbiAgJ+KUtSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19MRUZUIH0sXG4gICfilLYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KUtyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fVE9QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLkxFRlRfVE9fUklHSFQgfSxcbiAgJ+KUuCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KUuSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19MRUZUIH0sXG4gICfilLonOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KUvSc6IHsgW1N0eWxlLk5PUk1BTF06IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSAke1NoYXBlcy5NSURETEVfVE9fUklHSFR9YCwgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19MRUZUIH0sXG4gICfilL4nOiB7IFtTdHlsZS5OT1JNQUxdOiBgJHtTaGFwZXMuVE9QX1RPX0JPVFRPTX0gJHtTaGFwZXMuTUlERExFX1RPX0xFRlR9YCwgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5NSURETEVfVE9fUklHSFQgfSxcbiAgJ+KUvyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLkxFRlRfVE9fUklHSFQgfSxcbiAgJ+KVgCc6IHsgW1N0eWxlLk5PUk1BTF06IGAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfSAke1NoYXBlcy5NSURETEVfVE9fQk9UVE9NfWAsIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19UT1AgfSxcbiAgJ+KVgSc6IHsgW1N0eWxlLk5PUk1BTF06IGAke1NoYXBlcy5NSURETEVfVE9fVE9QfSAke1NoYXBlcy5MRUZUX1RPX1JJR0hUfWAsICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLk1JRERMRV9UT19CT1RUT00gfSxcbiAgJ+KVgic6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5MRUZUX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19CT1RUT00gfSxcbiAgJ+KVgyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLlRPUF9UT19MRUZUIH0sXG4gICfilYQnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTEVGVF9UT19CT1RUT00sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5UT1BfVE9fUklHSFQgfSxcbiAgJ+KVhSc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5UT1BfVE9fUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogU2hhcGVzLkxFRlRfVE9fQk9UVE9NIH0sXG4gICfilYYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVE9QX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IFNoYXBlcy5SSUdIVF9UT19CT1RUT00gfSxcbiAgJ+KVhyc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5NSURETEVfVE9fQk9UVE9NLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTdHlsZS5CT0xEXTogYCR7U2hhcGVzLk1JRERMRV9UT19UT1B9ICR7U2hhcGVzLkxFRlRfVE9fUklHSFR9YCB9LFxuICAn4pWIJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLk1JRERMRV9UT19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1N0eWxlLkJPTERdOiBgJHtTaGFwZXMuTEVGVF9UT19SSUdIVH0gJHtTaGFwZXMuTUlERExFX1RPX0JPVFRPTX1gIH0sXG4gICfilYknOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSAke1NoYXBlcy5NSURETEVfVE9fTEVGVH1gIH0sXG4gICfilYonOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuTUlERExFX1RPX0xFRlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3R5bGUuQk9MRF06IGAke1NoYXBlcy5UT1BfVE9fQk9UVE9NfSAke1NoYXBlcy5NSURETEVfVE9fUklHSFR9YCB9LFxuXG4gIC8vIERhc2hlZFxuICAn4pWMJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRXT19EQVNIRVNfSE9SSVpPTlRBTCB9LFxuICAn4pWNJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRXT19EQVNIRVNfSE9SSVpPTlRBTCB9LFxuICAn4pSEJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRIUkVFX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilIUnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuVEhSRUVfREFTSEVTX0hPUklaT05UQUwgfSxcbiAgJ+KUiCc6IHsgW1N0eWxlLk5PUk1BTF06IFNoYXBlcy5GT1VSX0RBU0hFU19IT1JJWk9OVEFMIH0sXG4gICfilIknOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuRk9VUl9EQVNIRVNfSE9SSVpPTlRBTCB9LFxuICAn4pWOJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLlRXT19EQVNIRVNfVkVSVElDQUwgfSxcbiAgJ+KVjyc6IHsgW1N0eWxlLkJPTERdOiAgIFNoYXBlcy5UV09fREFTSEVTX1ZFUlRJQ0FMIH0sXG4gICfilIYnOiB7IFtTdHlsZS5OT1JNQUxdOiBTaGFwZXMuVEhSRUVfREFTSEVTX1ZFUlRJQ0FMICB9LFxuICAn4pSHJzogeyBbU3R5bGUuQk9MRF06ICAgU2hhcGVzLlRIUkVFX0RBU0hFU19WRVJUSUNBTCB9LFxuICAn4pSKJzogeyBbU3R5bGUuTk9STUFMXTogU2hhcGVzLkZPVVJfREFTSEVTX1ZFUlRJQ0FMIH0sXG4gICfilIsnOiB7IFtTdHlsZS5CT0xEXTogICBTaGFwZXMuRk9VUl9EQVNIRVNfVkVSVElDQUwgfSxcblxuICAvLyBDdXJ2ZWRcbiAgJ+KVrSc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMSBMLjUsJHsuNSArICh5cCAvIC4xNSAqIC41KX0gQy41LCR7LjUgKyAoeXAgLyAuMTUgKiAuNSl9LC41LC41LDEsLjVgIH0sXG4gICfila4nOiB7IFtTdHlsZS5OT1JNQUxdOiAoeHAsIHlwKSA9PiBgTS41LDEgTC41LCR7LjUgKyAoeXAgLyAuMTUgKiAuNSl9IEMuNSwkey41ICsgKHlwIC8gLjE1ICogLjUpfSwuNSwuNSwwLC41YCB9LFxuICAn4pWvJzogeyBbU3R5bGUuTk9STUFMXTogKHhwLCB5cCkgPT4gYE0uNSwwIEwuNSwkey41IC0gKHlwIC8gLjE1ICogLjUpfSBDLjUsJHsuNSAtICh5cCAvIC4xNSAqIC41KX0sLjUsLjUsMCwuNWAgfSxcbiAgJ+KVsCc6IHsgW1N0eWxlLk5PUk1BTF06ICh4cCwgeXApID0+IGBNLjUsMCBMLjUsJHsuNSAtICh5cCAvIC4xNSAqIC41KX0gQy41LCR7LjUgLSAoeXAgLyAuMTUgKiAuNSl9LC41LC41LDEsLjVgIH1cbn07XG5cbmludGVyZmFjZSBJVmVjdG9yU2hhcGUge1xuICBkOiBzdHJpbmc7XG4gIHR5cGU6IFZlY3RvclR5cGU7XG4gIGxlZnRQYWRkaW5nPzogbnVtYmVyO1xuICByaWdodFBhZGRpbmc/OiBudW1iZXI7XG59XG5cbmNvbnN0IGVudW0gVmVjdG9yVHlwZSB7XG4gIEZJTEwsXG4gIFNUUk9LRVxufVxuXG4vKipcbiAqIFRoaXMgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBwcmltYXJpbHkgdXNlZCBib3ggZHJhd2luZyBjaGFyYWN0ZXJzIGFzIHZlY3RvciBzaGFwZXMuIFRoZVxuICogcmVhc29uIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGRlZmluZWQgc3BlY2lhbGx5IGlzIHRvIGF2b2lkIGNvbW1vbiBwcm9ibGVtcyBpZiBhIHVzZXIncyBmb250IGhhc1xuICogbm90IGJlZW4gcGF0Y2hlZCB3aXRoIHBvd2VybGluZSBjaGFyYWN0ZXJzIGFuZCBhbHNvIHRvIGdldCBwaXhlbCBwZXJmZWN0IHJlbmRlcmluZyBhcyByZW5kZXJpbmdcbiAqIGlzc3VlcyBjYW4gb2NjdXIgYXJvdW5kIEFBL1NQQUEuXG4gKlxuICogVGhlIGxpbmUgdmFyaWFudHMgZHJhdyBiZXlvbmQgdGhlIGNlbGwgYW5kIGdldCBjbGlwcGVkIHRvIGVuc3VyZSB0aGUgZW5kIG9mIHRoZSBsaW5lIGlzIG5vdFxuICogdmlzaWJsZS5cbiAqXG4gKiBPcmlnaW5hbCBzeW1ib2xzIGRlZmluZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL3Bvd2VybGluZS9mb250cGF0Y2hlclxuICovXG5leHBvcnQgY29uc3QgcG93ZXJsaW5lRGVmaW5pdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBJVmVjdG9yU2hhcGUgfSA9IHtcbiAgLy8gUmlnaHQgdHJpYW5nbGUgc29saWRcbiAgJ1xcdXtFMEIwfSc6IHsgZDogJ00wLDAgTDEsLjUgTDAsMScsIHR5cGU6IFZlY3RvclR5cGUuRklMTCwgcmlnaHRQYWRkaW5nOiAyIH0sXG4gIC8vIFJpZ2h0IHRyaWFuZ2xlIGxpbmVcbiAgJ1xcdXtFMEIxfSc6IHsgZDogJ00tMSwtLjUgTDEsLjUgTC0xLDEuNScsIHR5cGU6IFZlY3RvclR5cGUuU1RST0tFLCBsZWZ0UGFkZGluZzogMSwgcmlnaHRQYWRkaW5nOiAxIH0sXG4gIC8vIExlZnQgdHJpYW5nbGUgc29saWRcbiAgJ1xcdXtFMEIyfSc6IHsgZDogJ00xLDAgTDAsLjUgTDEsMScsIHR5cGU6IFZlY3RvclR5cGUuRklMTCwgbGVmdFBhZGRpbmc6IDIgfSxcbiAgLy8gTGVmdCB0cmlhbmdsZSBsaW5lXG4gICdcXHV7RTBCM30nOiB7IGQ6ICdNMiwtLjUgTDAsLjUgTDIsMS41JywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gUmlnaHQgc2VtaS1jaXJjbGUgc29saWRcbiAgJ1xcdXtFMEI0fSc6IHsgZDogJ00wLDAgTDAsMSBDMC41NTIsMSwxLDAuNzc2LDEsLjUgQzEsMC4yMjQsMC41NTIsMCwwLDAnLCB0eXBlOiBWZWN0b3JUeXBlLkZJTEwsIHJpZ2h0UGFkZGluZzogMSB9LFxuICAvLyBSaWdodCBzZW1pLWNpcmNsZSBsaW5lXG4gICdcXHV7RTBCNX0nOiB7IGQ6ICdNLjIsMSBDLjQyMiwxLC44LC44MjYsLjc4LC41IEMuOCwuMTc0LDAuNDIyLDAsLjIsMCcsIHR5cGU6IFZlY3RvclR5cGUuU1RST0tFLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gTGVmdCBzZW1pLWNpcmNsZSBzb2xpZFxuICAnXFx1e0UwQjZ9JzogeyBkOiAnTTEsMCBMMSwxIEMwLjQ0OCwxLDAsMC43NzYsMCwuNSBDMCwwLjIyNCwwLjQ0OCwwLDEsMCcsIHR5cGU6IFZlY3RvclR5cGUuRklMTCwgbGVmdFBhZGRpbmc6IDEgfSxcbiAgLy8gTGVmdCBzZW1pLWNpcmNsZSBsaW5lXG4gICdcXHV7RTBCN30nOiB7IGQ6ICdNLjgsMSBDMC41NzgsMSwwLjIsLjgyNiwuMjIsLjUgQzAuMiwwLjE3NCwwLjU3OCwwLDAuOCwwJywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxIH0sXG4gIC8vIExvd2VyIGxlZnQgdHJpYW5nbGVcbiAgJ1xcdXtFMEI4fSc6IHsgZDogJ00tLjUsLS41IEwxLjUsMS41IEwtLjUsMS41JywgdHlwZTogVmVjdG9yVHlwZS5GSUxMIH0sXG4gIC8vIEJhY2tzbGFzaCBzZXBhcmF0b3JcbiAgJ1xcdXtFMEI5fSc6IHsgZDogJ00tLjUsLS41IEwxLjUsMS41JywgdHlwZTogVmVjdG9yVHlwZS5TVFJPS0UsIGxlZnRQYWRkaW5nOiAxLCByaWdodFBhZGRpbmc6IDEgfSxcbiAgLy8gTG93ZXIgcmlnaHQgdHJpYW5nbGVcbiAgJ1xcdXtFMEJBfSc6IHsgZDogJ00xLjUsLS41IEwtLjUsMS41IEwxLjUsMS41JywgdHlwZTogVmVjdG9yVHlwZS5GSUxMIH0sXG4gIC8vIFVwcGVyIGxlZnQgdHJpYW5nbGVcbiAgJ1xcdXtFMEJDfSc6IHsgZDogJ00xLjUsLS41IEwtLjUsMS41IEwtLjUsLS41JywgdHlwZTogVmVjdG9yVHlwZS5GSUxMIH0sXG4gIC8vIEZvcndhcmQgc2xhc2ggc2VwYXJhdG9yXG4gICdcXHV7RTBCRH0nOiB7IGQ6ICdNMS41LC0uNSBMLS41LDEuNScsIHR5cGU6IFZlY3RvclR5cGUuU1RST0tFLCBsZWZ0UGFkZGluZzogMSwgcmlnaHRQYWRkaW5nOiAxIH0sXG4gIC8vIFVwcGVyIHJpZ2h0IHRyaWFuZ2xlXG4gICdcXHV7RTBCRX0nOiB7IGQ6ICdNLS41LC0uNSBMMS41LDEuNSBMMS41LC0uNScsIHR5cGU6IFZlY3RvclR5cGUuRklMTCB9XG59O1xuLy8gRm9yd2FyZCBzbGFzaCBzZXBhcmF0b3IgcmVkdW5kYW50XG5wb3dlcmxpbmVEZWZpbml0aW9uc1snXFx1e0UwQkJ9J10gPSBwb3dlcmxpbmVEZWZpbml0aW9uc1snXFx1e0UwQkR9J107XG4vLyBCYWNrc2xhc2ggc2VwYXJhdG9yIHJlZHVuZGFudFxucG93ZXJsaW5lRGVmaW5pdGlvbnNbJ1xcdXtFMEJGfSddID0gcG93ZXJsaW5lRGVmaW5pdGlvbnNbJ1xcdXtFMEI5fSddO1xuXG4vKipcbiAqIFRyeSBkcmF3aW5nIGEgY3VzdG9tIGJsb2NrIGVsZW1lbnQgb3IgYm94IGRyYXdpbmcgY2hhcmFjdGVyLCByZXR1cm5pbmcgd2hldGhlciBpdCB3YXNcbiAqIHN1Y2Nlc3NmdWxseSBkcmF3bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeURyYXdDdXN0b21DaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgYzogc3RyaW5nLFxuICB4T2Zmc2V0OiBudW1iZXIsXG4gIHlPZmZzZXQ6IG51bWJlcixcbiAgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsXG4gIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlcixcbiAgZm9udFNpemU6IG51bWJlcixcbiAgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYmxvY2tFbGVtZW50RGVmaW5pdGlvbiA9IGJsb2NrRWxlbWVudERlZmluaXRpb25zW2NdO1xuICBpZiAoYmxvY2tFbGVtZW50RGVmaW5pdGlvbikge1xuICAgIGRyYXdCbG9ja0VsZW1lbnRDaGFyKGN0eCwgYmxvY2tFbGVtZW50RGVmaW5pdGlvbiwgeE9mZnNldCwgeU9mZnNldCwgZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHBhdHRlcm5EZWZpbml0aW9uID0gcGF0dGVybkNoYXJhY3RlckRlZmluaXRpb25zW2NdO1xuICBpZiAocGF0dGVybkRlZmluaXRpb24pIHtcbiAgICBkcmF3UGF0dGVybkNoYXIoY3R4LCBwYXR0ZXJuRGVmaW5pdGlvbiwgeE9mZnNldCwgeU9mZnNldCwgZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJveERyYXdpbmdEZWZpbml0aW9uID0gYm94RHJhd2luZ0RlZmluaXRpb25zW2NdO1xuICBpZiAoYm94RHJhd2luZ0RlZmluaXRpb24pIHtcbiAgICBkcmF3Qm94RHJhd2luZ0NoYXIoY3R4LCBib3hEcmF3aW5nRGVmaW5pdGlvbiwgeE9mZnNldCwgeU9mZnNldCwgZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0LCBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHBvd2VybGluZURlZmluaXRpb24gPSBwb3dlcmxpbmVEZWZpbml0aW9uc1tjXTtcbiAgaWYgKHBvd2VybGluZURlZmluaXRpb24pIHtcbiAgICBkcmF3UG93ZXJsaW5lQ2hhcihjdHgsIHBvd2VybGluZURlZmluaXRpb24sIHhPZmZzZXQsIHlPZmZzZXQsIGRldmljZUNlbGxXaWR0aCwgZGV2aWNlQ2VsbEhlaWdodCwgZm9udFNpemUsIGRldmljZVBpeGVsUmF0aW8pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBkcmF3QmxvY2tFbGVtZW50Q2hhcihcbiAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIGNoYXJEZWZpbml0aW9uOiBJQmxvY2tWZWN0b3JbXSxcbiAgeE9mZnNldDogbnVtYmVyLFxuICB5T2Zmc2V0OiBudW1iZXIsXG4gIGRldmljZUNlbGxXaWR0aDogbnVtYmVyLFxuICBkZXZpY2VDZWxsSGVpZ2h0OiBudW1iZXJcbik6IHZvaWQge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJEZWZpbml0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYm94ID0gY2hhckRlZmluaXRpb25baV07XG4gICAgY29uc3QgeEVpZ2h0aCA9IGRldmljZUNlbGxXaWR0aCAvIDg7XG4gICAgY29uc3QgeUVpZ2h0aCA9IGRldmljZUNlbGxIZWlnaHQgLyA4O1xuICAgIGN0eC5maWxsUmVjdChcbiAgICAgIHhPZmZzZXQgKyBib3gueCAqIHhFaWdodGgsXG4gICAgICB5T2Zmc2V0ICsgYm94LnkgKiB5RWlnaHRoLFxuICAgICAgYm94LncgKiB4RWlnaHRoLFxuICAgICAgYm94LmggKiB5RWlnaHRoXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBjYWNoZWRQYXR0ZXJuczogTWFwPFBhdHRlcm5EZWZpbml0aW9uLCBNYXA8LyogZmlsbFN0eWxlICovc3RyaW5nLCBDYW52YXNQYXR0ZXJuPj4gPSBuZXcgTWFwKCk7XG5cbmZ1bmN0aW9uIGRyYXdQYXR0ZXJuQ2hhcihcbiAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIGNoYXJEZWZpbml0aW9uOiBudW1iZXJbXVtdLFxuICB4T2Zmc2V0OiBudW1iZXIsXG4gIHlPZmZzZXQ6IG51bWJlcixcbiAgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsXG4gIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlclxuKTogdm9pZCB7XG4gIGxldCBwYXR0ZXJuU2V0ID0gY2FjaGVkUGF0dGVybnMuZ2V0KGNoYXJEZWZpbml0aW9uKTtcbiAgaWYgKCFwYXR0ZXJuU2V0KSB7XG4gICAgcGF0dGVyblNldCA9IG5ldyBNYXAoKTtcbiAgICBjYWNoZWRQYXR0ZXJucy5zZXQoY2hhckRlZmluaXRpb24sIHBhdHRlcm5TZXQpO1xuICB9XG4gIGNvbnN0IGZpbGxTdHlsZSA9IGN0eC5maWxsU3R5bGU7XG4gIGlmICh0eXBlb2YgZmlsbFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmaWxsU3R5bGUgdHlwZSBcIiR7ZmlsbFN0eWxlfVwiYCk7XG4gIH1cbiAgbGV0IHBhdHRlcm4gPSBwYXR0ZXJuU2V0LmdldChmaWxsU3R5bGUpO1xuICBpZiAoIXBhdHRlcm4pIHtcbiAgICBjb25zdCB3aWR0aCA9IGNoYXJEZWZpbml0aW9uWzBdLmxlbmd0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBjaGFyRGVmaW5pdGlvbi5sZW5ndGg7XG4gICAgY29uc3QgdG1wQ2FudmFzID0gY3R4LmNhbnZhcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIHRtcENhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIHRtcENhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgdG1wQ3R4ID0gdGhyb3dJZkZhbHN5KHRtcENhbnZhcy5nZXRDb250ZXh0KCcyZCcpKTtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgLy8gRXh0cmFjdCByZ2JhIGZyb20gZmlsbFN0eWxlXG4gICAgbGV0IHI6IG51bWJlcjtcbiAgICBsZXQgZzogbnVtYmVyO1xuICAgIGxldCBiOiBudW1iZXI7XG4gICAgbGV0IGE6IG51bWJlcjtcbiAgICBpZiAoZmlsbFN0eWxlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgciA9IHBhcnNlSW50KGZpbGxTdHlsZS5zbGljZSgxLCAzKSwgMTYpO1xuICAgICAgZyA9IHBhcnNlSW50KGZpbGxTdHlsZS5zbGljZSgzLCA1KSwgMTYpO1xuICAgICAgYiA9IHBhcnNlSW50KGZpbGxTdHlsZS5zbGljZSg1LCA3KSwgMTYpO1xuICAgICAgYSA9IGZpbGxTdHlsZS5sZW5ndGggPiA3ICYmIHBhcnNlSW50KGZpbGxTdHlsZS5zbGljZSg3LCA5KSwgMTYpIHx8IDE7XG4gICAgfSBlbHNlIGlmIChmaWxsU3R5bGUuc3RhcnRzV2l0aCgncmdiYScpKSB7XG4gICAgICAoW3IsIGcsIGIsIGFdID0gZmlsbFN0eWxlLnN1YnN0cmluZyg1LCBmaWxsU3R5bGUubGVuZ3RoIC0gMSkuc3BsaXQoJywnKS5tYXAoZSA9PiBwYXJzZUZsb2F0KGUpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmaWxsU3R5bGUgY29sb3IgZm9ybWF0IFwiJHtmaWxsU3R5bGV9XCIgd2hlbiBkcmF3aW5nIHBhdHRlcm4gZ2x5cGhgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbKHkgKiB3aWR0aCArIHgpICogNCAgICBdID0gcjtcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbKHkgKiB3aWR0aCArIHgpICogNCArIDFdID0gZztcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbKHkgKiB3aWR0aCArIHgpICogNCArIDJdID0gYjtcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbKHkgKiB3aWR0aCArIHgpICogNCArIDNdID0gY2hhckRlZmluaXRpb25beV1beF0gKiAoYSAqIDI1NSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRtcEN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICBwYXR0ZXJuID0gdGhyb3dJZkZhbHN5KGN0eC5jcmVhdGVQYXR0ZXJuKHRtcENhbnZhcywgbnVsbCkpO1xuICAgIHBhdHRlcm5TZXQuc2V0KGZpbGxTdHlsZSwgcGF0dGVybik7XG4gIH1cbiAgY3R4LmZpbGxTdHlsZSA9IHBhdHRlcm47XG4gIGN0eC5maWxsUmVjdCh4T2Zmc2V0LCB5T2Zmc2V0LCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQpO1xufVxuXG4vKipcbiAqIERyYXdzIHRoZSBmb2xsb3dpbmcgYm94IGRyYXdpbmcgY2hhcmFjdGVycyBieSBtYXBwaW5nIGEgc3Vic2V0IG9mIFNWRyBkIGF0dHJpYnV0ZSBpbnN0cnVjdGlvbnMgdG9cbiAqIGNhbnZhcyBkcmF3IGNhbGxzLlxuICpcbiAqIEJveCBzdHlsZXM6ICAgICAgIOKUjuKUsOKUkuKUjeKUr+KUkeKVk+KVpeKVluKVkuKVpOKVlSDilI/ilLPilJPilIzilLLilJPilIzilKzilJDilI/ilLHilJBcbiAqIOKUjOKUgOKUrOKUgOKUkCDilI/ilIHilLPilIHilJMg4pWU4pWQ4pWm4pWQ4pWXIOKUoOKVguKUqOKUneKUv+KUpeKVn+KVq+KVouKVnuKVquKVoSDilKHilYfilKnilJzilYrilKvilKLilYjilKrilKPilYnilKRcbiAqIOKUgiDilIIg4pSCIOKUgyDilIMg4pSDIOKVkSDilZEg4pWRIOKUluKUuOKUmuKUleKUt+KUmeKVmeKVqOKVnOKVmOKVp+KVmyDilJTilLTilJjilJTilLrilJvilJfilLvilJvilJfilLnilJhcbiAqIOKUnOKUgOKUvOKUgOKUpCDilKPilIHilYvilIHilKsg4pWg4pWQ4pWs4pWQ4pWjIOKUj+KUseKUkOKUjOKUsuKUk+KUjOKUrOKUkOKUjOKUrOKUkCDilI/ilLPilJPilIzilK7ilJPilIzilKzilJDilI/ilK3ilJBcbiAqIOKUgiDilIIg4pSCIOKUgyDilIMg4pSDIOKVkSDilZEg4pWRIOKUoeKVg+KUpOKUnOKVhOKUqeKUnOKVhuKUquKUouKVheKUpCDilJ7ilYDilKbilJzilL7ilKvilJ/ilYHilKfilKPilL3ilKRcbiAqIOKUlOKUgOKUtOKUgOKUmCDilJfilIHilLvilIHilJsg4pWa4pWQ4pWp4pWQ4pWdIOKUlOKUtOKUmOKUlOKUtOKUmOKUlOKUuuKUm+KUl+KUueKUmCDilJTilLTilJjilJTilLbilJvilJfilLvilJvilJfilLXilJhcbiAqXG4gKiBPdGhlcjpcbiAqIOKVreKUgOKVriDilbIg4pWxIOKVt+KVu+KVjuKVj+KUhuKUh+KUiuKUiyDilbrilb7ilbQg4pWM4pWM4pWMIOKUhOKUhOKUhCDilIjilIjilIhcbiAqIOKUgiDilIIgIOKVsyAg4pW94pW/4pWO4pWP4pSG4pSH4pSK4pSLIOKVtuKVvOKVuCDilY3ilY3ilY0g4pSF4pSF4pSFIOKUieKUieKUiVxuICog4pWw4pSA4pWvIOKVsSDilbIg4pW54pW14pWO4pWP4pSG4pSH4pSK4pSLXG4gKlxuICogQWxsIGJveCBkcmF3aW5nIGNoYXJhY3RlcnM6XG4gKiDilIAg4pSBIOKUgiDilIMg4pSEIOKUhSDilIYg4pSHIOKUiCDilIkg4pSKIOKUiyDilIwg4pSNIOKUjiDilI9cbiAqIOKUkCDilJEg4pSSIOKUkyDilJQg4pSVIOKUliDilJcg4pSYIOKUmSDilJog4pSbIOKUnCDilJ0g4pSeIOKUn1xuICog4pSgIOKUoSDilKIg4pSjIOKUpCDilKUg4pSmIOKUpyDilKgg4pSpIOKUqiDilKsg4pSsIOKUrSDilK4g4pSvXG4gKiDilLAg4pSxIOKUsiDilLMg4pS0IOKUtSDilLYg4pS3IOKUuCDilLkg4pS6IOKUuyDilLwg4pS9IOKUviDilL9cbiAqIOKVgCDilYEg4pWCIOKVgyDilYQg4pWFIOKVhiDilYcg4pWIIOKViSDilYog4pWLIOKVjCDilY0g4pWOIOKVj1xuICog4pWQIOKVkSDilZIg4pWTIOKVlCDilZUg4pWWIOKVlyDilZgg4pWZIOKVmiDilZsg4pWcIOKVnSDilZ4g4pWfXG4gKiDilaAg4pWhIOKVoiDilaMg4pWkIOKVpSDilaYg4pWnIOKVqCDilakg4pWqIOKVqyDilawg4pWtIOKVriDila9cbiAqIOKVsCDilbEg4pWyIOKVsyDilbQg4pW1IOKVtiDilbcg4pW4IOKVuSDilbog4pW7IOKVvCDilb0g4pW+IOKVv1xuICpcbiAqIC0tLVxuICpcbiAqIEJveCBkcmF3aW5nIGFsaWdubWVudCB0ZXN0czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilohcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilolcbiAqICAg4pWU4pWQ4pWQ4pWm4pWQ4pWQ4pWXICDilIzilIDilIDilKzilIDilIDilJAgIOKVreKUgOKUgOKUrOKUgOKUgOKVriAg4pWt4pSA4pSA4pSs4pSA4pSA4pWuICDilI/ilIHilIHilLPilIHilIHilJMgIOKUjuKUkuKUj+KUkSAgIOKVtyAg4pW7IOKUj+KUr+KUkyDilIzilLDilJAgICAg4paKIOKVseKVsuKVseKVsuKVs+KVs+KVs1xuICogICDilZHilIzilIDilajilIDilJDilZEgIOKUguKVlOKVkOKVp+KVkOKVl+KUgiAg4pSC4pWS4pWQ4pWq4pWQ4pWV4pSCICDilILilZPilIDilYHilIDilZbilIIgIOKUg+KUjOKUgOKVguKUgOKUkOKUgyAg4pSX4pWD4pWE4pSZICDilbbilLzilbTilbrilYvilbjilKDilLzilKgg4pSd4pWL4pSlICAgIOKWiyDilbLilbHilbLilbHilbPilbPilbNcbiAqICAg4pWR4pSC4pWyIOKVseKUguKVkSAg4pSC4pWRICAg4pWR4pSCICDilILilIIg4pSCIOKUguKUgiAg4pSC4pWRIOKUgyDilZHilIIgIOKUg+KUgiDilb8g4pSC4pSDICDilI3ilYXilYbilJMgICDilbUgIOKVuSDilJfilLfilJsg4pSU4pS44pSYICAgIOKWjCDilbHilbLilbHilbLilbPilbPilbNcbiAqICAg4pWg4pWhIOKVsyDilZ7ilaMgIOKUnOKVoiAgIOKVn+KUpCAg4pSc4pS84pSA4pS84pSA4pS84pSkICDilJzilavilIDilYLilIDilavilKQgIOKUo+KUv+KVvuKUvOKVvOKUv+KUqyAg4pSV4pSb4pSW4pSaICAgICDilIzilITilITilJAg4pWOIOKUj+KUheKUheKUkyDilIsg4paNIOKVsuKVseKVsuKVseKVs+KVs+KVs1xuICogICDilZHilILilbEg4pWy4pSC4pWRICDilILilZEgICDilZHilIIgIOKUguKUgiDilIIg4pSC4pSCICDilILilZEg4pSDIOKVkeKUgiAg4pSD4pSCIOKVvSDilILilIMgIOKWkeKWkeKWkuKWkuKWk+KWk+KWiOKWiCDilIogIOKUhiDilY4g4pWPICDilIcg4pSLIOKWjlxuICogICDilZHilJTilIDilaXilIDilJjilZEgIOKUguKVmuKVkOKVpOKVkOKVneKUgiAg4pSC4pWY4pWQ4pWq4pWQ4pWb4pSCICDilILilZnilIDilYDilIDilZzilIIgIOKUg+KUlOKUgOKVguKUgOKUmOKUgyAg4paR4paR4paS4paS4paT4paT4paI4paIIOKUiiAg4pSGIOKVjiDilY8gIOKUhyDilIsg4paPXG4gKiAgIOKVmuKVkOKVkOKVqeKVkOKVkOKVnSAg4pSU4pSA4pSA4pS04pSA4pSA4pSYICDilbDilIDilIDilLTilIDilIDila8gIOKVsOKUgOKUgOKUtOKUgOKUgOKVryAg4pSX4pSB4pSB4pS74pSB4pSB4pSbICAgICAgICAgICDilJTilYzilYzilJgg4pWOIOKUl+KVjeKVjeKUmyDilIsgIOKWgeKWguKWg+KWhOKWheKWhuKWh+KWiFxuICpcbiAqIFNvdXJjZTogaHR0cHM6Ly93d3cudzMub3JnLzIwMDEvMDYvdXRmLTgtdGVzdC9VVEYtOC1kZW1vLmh0bWxcbiAqL1xuZnVuY3Rpb24gZHJhd0JveERyYXdpbmdDaGFyKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgY2hhckRlZmluaXRpb246IHsgW2ZvbnRXZWlnaHQ6IG51bWJlcl06IHN0cmluZyB8ICgoeHA6IG51bWJlciwgeXA6IG51bWJlcikgPT4gc3RyaW5nKSB9LFxuICB4T2Zmc2V0OiBudW1iZXIsXG4gIHlPZmZzZXQ6IG51bWJlcixcbiAgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIsXG4gIGRldmljZUNlbGxIZWlnaHQ6IG51bWJlcixcbiAgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgY3R4LnN0cm9rZVN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgZm9yIChjb25zdCBbZm9udFdlaWdodCwgaW5zdHJ1Y3Rpb25zXSBvZiBPYmplY3QuZW50cmllcyhjaGFyRGVmaW5pdGlvbikpIHtcbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgY3R4LmxpbmVXaWR0aCA9IGRldmljZVBpeGVsUmF0aW8gKiBOdW1iZXIucGFyc2VJbnQoZm9udFdlaWdodCk7XG4gICAgbGV0IGFjdHVhbEluc3RydWN0aW9uczogc3RyaW5nO1xuICAgIGlmICh0eXBlb2YgaW5zdHJ1Y3Rpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCB4cCA9IC4xNTtcbiAgICAgIGNvbnN0IHlwID0gLjE1IC8gZGV2aWNlQ2VsbEhlaWdodCAqIGRldmljZUNlbGxXaWR0aDtcbiAgICAgIGFjdHVhbEluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucyh4cCwgeXApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3R1YWxJbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgYWN0dWFsSW5zdHJ1Y3Rpb25zLnNwbGl0KCcgJykpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBpbnN0cnVjdGlvblswXTtcbiAgICAgIGNvbnN0IGYgPSBzdmdUb0NhbnZhc0luc3RydWN0aW9uTWFwW3R5cGVdO1xuICAgICAgaWYgKCFmKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBmaW5kIGRyYXdpbmcgaW5zdHJ1Y3Rpb25zIGZvciBcIiR7dHlwZX1cImApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gaW5zdHJ1Y3Rpb24uc3Vic3RyaW5nKDEpLnNwbGl0KCcsJyk7XG4gICAgICBpZiAoIWFyZ3NbMF0gfHwgIWFyZ3NbMV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmKGN0eCwgdHJhbnNsYXRlQXJncyhhcmdzLCBkZXZpY2VDZWxsV2lkdGgsIGRldmljZUNlbGxIZWlnaHQsIHhPZmZzZXQsIHlPZmZzZXQsIHRydWUsIGRldmljZVBpeGVsUmF0aW8pKTtcbiAgICB9XG4gICAgY3R4LnN0cm9rZSgpO1xuICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkcmF3UG93ZXJsaW5lQ2hhcihcbiAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIGNoYXJEZWZpbml0aW9uOiBJVmVjdG9yU2hhcGUsXG4gIHhPZmZzZXQ6IG51bWJlcixcbiAgeU9mZnNldDogbnVtYmVyLFxuICBkZXZpY2VDZWxsV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlQ2VsbEhlaWdodDogbnVtYmVyLFxuICBmb250U2l6ZTogbnVtYmVyLFxuICBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXJcbik6IHZvaWQge1xuICAvLyBDbGlwIHRoZSBjZWxsIHRvIG1ha2Ugc3VyZSBkcmF3aW5nIGRvZXNuJ3Qgb2NjdXIgYmV5b25kIGJvdW5kc1xuICBjb25zdCBjbGlwUmVnaW9uID0gbmV3IFBhdGgyRCgpO1xuICBjbGlwUmVnaW9uLnJlY3QoeE9mZnNldCwgeU9mZnNldCwgZGV2aWNlQ2VsbFdpZHRoLCBkZXZpY2VDZWxsSGVpZ2h0KTtcbiAgY3R4LmNsaXAoY2xpcFJlZ2lvbik7XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuICAvLyBTY2FsZSB0aGUgc3Ryb2tlIHdpdGggRFBSIGFuZCBmb250IHNpemVcbiAgY29uc3QgY3NzTGluZVdpZHRoID0gZm9udFNpemUgLyAxMjtcbiAgY3R4LmxpbmVXaWR0aCA9IGRldmljZVBpeGVsUmF0aW8gKiBjc3NMaW5lV2lkdGg7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgY2hhckRlZmluaXRpb24uZC5zcGxpdCgnICcpKSB7XG4gICAgY29uc3QgdHlwZSA9IGluc3RydWN0aW9uWzBdO1xuICAgIGNvbnN0IGYgPSBzdmdUb0NhbnZhc0luc3RydWN0aW9uTWFwW3R5cGVdO1xuICAgIGlmICghZikge1xuICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IGZpbmQgZHJhd2luZyBpbnN0cnVjdGlvbnMgZm9yIFwiJHt0eXBlfVwiYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYXJnczogc3RyaW5nW10gPSBpbnN0cnVjdGlvbi5zdWJzdHJpbmcoMSkuc3BsaXQoJywnKTtcbiAgICBpZiAoIWFyZ3NbMF0gfHwgIWFyZ3NbMV0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmKGN0eCwgdHJhbnNsYXRlQXJncyhcbiAgICAgIGFyZ3MsXG4gICAgICBkZXZpY2VDZWxsV2lkdGgsXG4gICAgICBkZXZpY2VDZWxsSGVpZ2h0LFxuICAgICAgeE9mZnNldCxcbiAgICAgIHlPZmZzZXQsXG4gICAgICBmYWxzZSxcbiAgICAgIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAoY2hhckRlZmluaXRpb24ubGVmdFBhZGRpbmcgPz8gMCkgKiAoY3NzTGluZVdpZHRoIC8gMiksXG4gICAgICAoY2hhckRlZmluaXRpb24ucmlnaHRQYWRkaW5nID8/IDApICogKGNzc0xpbmVXaWR0aCAvIDIpXG4gICAgKSk7XG4gIH1cbiAgaWYgKGNoYXJEZWZpbml0aW9uLnR5cGUgPT09IFZlY3RvclR5cGUuU1RST0tFKSB7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgICBjdHguc3Ryb2tlKCk7XG4gIH0gZWxzZSB7XG4gICAgY3R4LmZpbGwoKTtcbiAgfVxuICBjdHguY2xvc2VQYXRoKCk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1heDogbnVtYmVyLCBtaW46IG51bWJlciA9IDApOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4odmFsdWUsIG1heCksIG1pbik7XG59XG5cbmNvbnN0IHN2Z1RvQ2FudmFzSW5zdHJ1Y3Rpb25NYXA6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHtcbiAgJ0MnOiAoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGFyZ3M6IG51bWJlcltdKSA9PiBjdHguYmV6aWVyQ3VydmVUbyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKSxcbiAgJ0wnOiAoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGFyZ3M6IG51bWJlcltdKSA9PiBjdHgubGluZVRvKGFyZ3NbMF0sIGFyZ3NbMV0pLFxuICAnTSc6IChjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgYXJnczogbnVtYmVyW10pID0+IGN0eC5tb3ZlVG8oYXJnc1swXSwgYXJnc1sxXSlcbn07XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUFyZ3MoYXJnczogc3RyaW5nW10sIGNlbGxXaWR0aDogbnVtYmVyLCBjZWxsSGVpZ2h0OiBudW1iZXIsIHhPZmZzZXQ6IG51bWJlciwgeU9mZnNldDogbnVtYmVyLCBkb0NsYW1wOiBib29sZWFuLCBkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXIsIGxlZnRQYWRkaW5nOiBudW1iZXIgPSAwLCByaWdodFBhZGRpbmc6IG51bWJlciA9IDApOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IGFyZ3MubWFwKGUgPT4gcGFyc2VGbG9hdChlKSB8fCBwYXJzZUludChlKSk7XG5cbiAgaWYgKHJlc3VsdC5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUb28gZmV3IGFyZ3VtZW50cyBmb3IgaW5zdHJ1Y3Rpb24nKTtcbiAgfVxuXG4gIGZvciAobGV0IHggPSAwOyB4IDwgcmVzdWx0Lmxlbmd0aDsgeCArPSAyKSB7XG4gICAgLy8gVHJhbnNsYXRlIGZyb20gMC0xIHRvIDAtY2VsbFdpZHRoXG4gICAgcmVzdWx0W3hdICo9IGNlbGxXaWR0aCAtIChsZWZ0UGFkZGluZyAqIGRldmljZVBpeGVsUmF0aW8pIC0gKHJpZ2h0UGFkZGluZyAqIGRldmljZVBpeGVsUmF0aW8pO1xuICAgIC8vIEVuc3VyZSBjb29yZGluYXRlIGRvZXNuJ3QgZXNjYXBlIGNlbGwgYm91bmRzIGFuZCByb3VuZCB0byB0aGUgbmVhcmVzdCAwLjUgdG8gZW5zdXJlIGEgY3Jpc3BcbiAgICAvLyBsaW5lIGF0IDEwMCUgZGV2aWNlUGl4ZWxSYXRpb1xuICAgIGlmIChkb0NsYW1wICYmIHJlc3VsdFt4XSAhPT0gMCkge1xuICAgICAgcmVzdWx0W3hdID0gY2xhbXAoTWF0aC5yb3VuZChyZXN1bHRbeF0gKyAwLjUpIC0gMC41LCBjZWxsV2lkdGgsIDApO1xuICAgIH1cbiAgICAvLyBBcHBseSB0aGUgY2VsbCdzIG9mZnNldCAoaWUuIHgqY2VsbFdpZHRoKVxuICAgIHJlc3VsdFt4XSArPSB4T2Zmc2V0ICsgKGxlZnRQYWRkaW5nICogZGV2aWNlUGl4ZWxSYXRpbyk7XG4gIH1cblxuICBmb3IgKGxldCB5ID0gMTsgeSA8IHJlc3VsdC5sZW5ndGg7IHkgKz0gMikge1xuICAgIC8vIFRyYW5zbGF0ZSBmcm9tIDAtMSB0byAwLWNlbGxIZWlnaHRcbiAgICByZXN1bHRbeV0gKj0gY2VsbEhlaWdodDtcbiAgICAvLyBFbnN1cmUgY29vcmRpbmF0ZSBkb2Vzbid0IGVzY2FwZSBjZWxsIGJvdW5kcyBhbmQgcm91bmQgdG8gdGhlIG5lYXJlc3QgMC41IHRvIGVuc3VyZSBhIGNyaXNwXG4gICAgLy8gbGluZSBhdCAxMDAlIGRldmljZVBpeGVsUmF0aW9cbiAgICBpZiAoZG9DbGFtcCAmJiByZXN1bHRbeV0gIT09IDApIHtcbiAgICAgIHJlc3VsdFt5XSA9IGNsYW1wKE1hdGgucm91bmQocmVzdWx0W3ldICsgMC41KSAtIDAuNSwgY2VsbEhlaWdodCwgMCk7XG4gICAgfVxuICAgIC8vIEFwcGx5IHRoZSBjZWxsJ3Mgb2Zmc2V0IChpZS4geCpjZWxsSGVpZ2h0KVxuICAgIHJlc3VsdFt5XSArPSB5T2Zmc2V0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZURldmljZVBpeGVsRGltZW5zaW9ucyhlbGVtZW50OiBIVE1MRWxlbWVudCwgcGFyZW50V2luZG93OiBXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcywgY2FsbGJhY2s6IChkZXZpY2VXaWR0aDogbnVtYmVyLCBkZXZpY2VIZWlnaHQ6IG51bWJlcikgPT4gdm9pZCk6IElEaXNwb3NhYmxlIHtcbiAgLy8gT2JzZXJ2ZSBhbnkgcmVzaXplcyB0byB0aGUgZWxlbWVudCBhbmQgZXh0cmFjdCB0aGUgYWN0dWFsIHBpeGVsIHNpemUgb2YgdGhlIGVsZW1lbnQgaWYgdGhlXG4gIC8vIGRldmljZVBpeGVsQ29udGVudEJveFNpemUgQVBJIGlzIHN1cHBvcnRlZC4gVGhpcyBhbGxvd3MgY29ycmVjdGluZyByb3VuZGluZyBlcnJvcnMgd2hlblxuICAvLyBjb252ZXJ0aW5nIGJldHdlZW4gQ1NTIHBpeGVscyBhbmQgZGV2aWNlIHBpeGVscyB3aGljaCBjYXVzZXMgYmx1cnJ5IHJlbmRlcmluZyB3aGVuIGRldmljZVxuICAvLyBwaXhlbCByYXRpbyBpcyBub3QgYSByb3VuZCBudW1iZXIuXG4gIGxldCBvYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQgPSBuZXcgcGFyZW50V2luZG93LlJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBlbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS50YXJnZXQgPT09IGVsZW1lbnQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEaXNjb25uZWN0IGlmIGRldmljZVBpeGVsQ29udGVudEJveFNpemUgaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyXG4gICAgaWYgKCEoJ2RldmljZVBpeGVsQ29udGVudEJveFNpemUnIGluIGVudHJ5KSkge1xuICAgICAgb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIG9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpcmUgdGhlIGNhbGxiYWNrLCBpZ25vcmUgZXZlbnRzIHdoZXJlIHRoZSBkaW1lbnNpb25zIGFyZSAweDAgYXMgdGhlIGNhbnZhcyBpcyBsaWtlbHkgaGlkZGVuXG4gICAgY29uc3Qgd2lkdGggPSBlbnRyeS5kZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplWzBdLmlubGluZVNpemU7XG4gICAgY29uc3QgaGVpZ2h0ID0gZW50cnkuZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZVswXS5ibG9ja1NpemU7XG4gICAgaWYgKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKSB7XG4gICAgICBjYWxsYmFjayh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gIH0pO1xuICB0cnkge1xuICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBib3g6IFsnZGV2aWNlLXBpeGVsLWNvbnRlbnQtYm94J10gfSBhcyBhbnkpO1xuICB9IGNhdGNoIHtcbiAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgb2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHRvRGlzcG9zYWJsZSgoKSA9PiBvYnNlcnZlcj8uZGlzY29ubmVjdCgpKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaW1lbnNpb25zLCBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRocm93SWZGYWxzeTxUPih2YWx1ZTogVCB8IHVuZGVmaW5lZCB8IG51bGwpOiBUIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndmFsdWUgbXVzdCBub3QgYmUgZmFsc3knKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Bvd2VybGluZUdseXBoKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgcmV0dXJuIHRydWUgZm9yIFBvd2VybGluZSBzeW1ib2xzIHdoaWNoIHJlcXVpcmVcbiAgLy8gZGlmZmVyZW50IHBhZGRpbmcgYW5kIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIG1pbmltdW0gY29udHJhc3RcbiAgLy8gcmF0aW8gc3RhbmRhcmRzXG4gIHJldHVybiAweEUwQTQgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweEUwRDY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gMHhFMEIwIDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPD0gMHhFMEI3O1xufVxuXG5mdW5jdGlvbiBpc05lcmRGb250R2x5cGgoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIDB4RTAwMCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDw9IDB4RjhGRjtcbn1cblxuZnVuY3Rpb24gaXNCb3hPckJsb2NrR2x5cGgoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIDB4MjUwMCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDw9IDB4MjU5Rjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1vamkoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjYwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjY0RiB8fCAvLyBFbW90aWNvbnNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjMwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjVGRiB8fCAvLyBNaXNjIFN5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzXG4gICAgY29kZXBvaW50ID49IDB4MUY2ODAgJiYgY29kZXBvaW50IDw9IDB4MUY2RkYgfHwgLy8gVHJhbnNwb3J0IGFuZCBNYXBcbiAgICBjb2RlcG9pbnQgPj0gMHgyNjAwICAmJiBjb2RlcG9pbnQgPD0gMHgyNkZGICB8fCAvLyBNaXNjIHN5bWJvbHNcbiAgICBjb2RlcG9pbnQgPj0gMHgyNzAwICAmJiBjb2RlcG9pbnQgPD0gMHgyN0JGICB8fCAvLyBEaW5nYmF0c1xuICAgIGNvZGVwb2ludCA+PSAweEZFMDAgICYmIGNvZGVwb2ludCA8PSAweEZFMEYgIHx8IC8vIFZhcmlhdGlvbiBTZWxlY3RvcnNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjkwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjlGRiB8fCAvLyBTdXBwbGVtZW50YWwgU3ltYm9scyBhbmQgUGljdG9ncmFwaHNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjFFNiAmJiBjb2RlcG9pbnQgPD0gMHgxRjFGRlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dSZXNjYWxpbmcoY29kZXBvaW50OiBudW1iZXIgfCB1bmRlZmluZWQsIHdpZHRoOiBudW1iZXIsIGdseXBoU2l6ZVg6IG51bWJlciwgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAvLyBJcyBzaW5nbGUgY2VsbCB3aWR0aFxuICAgIHdpZHRoID09PSAxICYmXG4gICAgLy8gR2x5cGggZXhjZWVkcyBjZWxsIGJvdW5kcywgYWRkIDUwJSB0byBhdm9pZCBodXJ0aW5nIHJlYWRhYmlsaXR5IGJ5IHJlc2NhbGluZyBnbHlwaHMgdGhhdFxuICAgIC8vIGJhcmVseSBvdmVybGFwXG4gICAgZ2x5cGhTaXplWCA+IE1hdGguY2VpbChkZXZpY2VDZWxsV2lkdGggKiAxLjUpICYmXG4gICAgLy8gTmV2ZXIgcmVzY2FsZSBhc2NpaVxuICAgIGNvZGVwb2ludCAhPT0gdW5kZWZpbmVkICYmIGNvZGVwb2ludCA+IDB4RkYgJiZcbiAgICAvLyBOZXZlciByZXNjYWxlIGVtb2ppXG4gICAgIWlzRW1vamkoY29kZXBvaW50KSAmJlxuICAgIC8vIE5ldmVyIHJlc2NhbGUgcG93ZXJsaW5lIG9yIG5lcmQgZm9udHNcbiAgICAhaXNQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQpICYmICFpc05lcmRGb250R2x5cGgoY29kZXBvaW50KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Bvd2VybGluZUdseXBoKGNvZGVwb2ludCkgfHwgaXNCb3hPckJsb2NrR2x5cGgoY29kZXBvaW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbmRlckRpbWVuc2lvbnMoKTogSVJlbmRlckRpbWVuc2lvbnMge1xuICByZXR1cm4ge1xuICAgIGNzczoge1xuICAgICAgY2FudmFzOiBjcmVhdGVEaW1lbnNpb24oKSxcbiAgICAgIGNlbGw6IGNyZWF0ZURpbWVuc2lvbigpXG4gICAgfSxcbiAgICBkZXZpY2U6IHtcbiAgICAgIGNhbnZhczogY3JlYXRlRGltZW5zaW9uKCksXG4gICAgICBjZWxsOiBjcmVhdGVEaW1lbnNpb24oKSxcbiAgICAgIGNoYXI6IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgdG9wOiAwXG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaW1lbnNpb24oKTogSURpbWVuc2lvbnMge1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0KGNlbGxXaWR0aDogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlciwgY3VycmVudE9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiAoY2VsbFdpZHRoIC0gKE1hdGgucm91bmQobGluZVdpZHRoKSAqIDIgLSBjdXJyZW50T2Zmc2V0KSkgJSAoTWF0aC5yb3VuZChsaW5lV2lkdGgpICogMik7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJVGVybWluYWwgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElTZWxlY3Rpb25SZW5kZXJNb2RlbCB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcbmltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuY2xhc3MgU2VsZWN0aW9uUmVuZGVyTW9kZWwgaW1wbGVtZW50cyBJU2VsZWN0aW9uUmVuZGVyTW9kZWwge1xuICBwdWJsaWMgaGFzU2VsZWN0aW9uITogYm9vbGVhbjtcbiAgcHVibGljIGNvbHVtblNlbGVjdE1vZGUhOiBib29sZWFuO1xuICBwdWJsaWMgdmlld3BvcnRTdGFydFJvdyE6IG51bWJlcjtcbiAgcHVibGljIHZpZXdwb3J0RW5kUm93ITogbnVtYmVyO1xuICBwdWJsaWMgdmlld3BvcnRDYXBwZWRTdGFydFJvdyE6IG51bWJlcjtcbiAgcHVibGljIHZpZXdwb3J0Q2FwcGVkRW5kUm93ITogbnVtYmVyO1xuICBwdWJsaWMgc3RhcnRDb2whOiBudW1iZXI7XG4gIHB1YmxpYyBlbmRDb2whOiBudW1iZXI7XG4gIHB1YmxpYyBzZWxlY3Rpb25TdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHNlbGVjdGlvbkVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5oYXNTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmNvbHVtblNlbGVjdE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPSAwO1xuICAgIHRoaXMudmlld3BvcnRFbmRSb3cgPSAwO1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IDA7XG4gICAgdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdyA9IDA7XG4gICAgdGhpcy5zdGFydENvbCA9IDA7XG4gICAgdGhpcy5lbmRDb2wgPSAwO1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZWxlY3Rpb25FbmQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlKHRlcm1pbmFsOiBJVGVybWluYWwsIHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IGVuZDtcbiAgICAvLyBTZWxlY3Rpb24gZG9lcyBub3QgZXhpc3RcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQgfHwgKHN0YXJ0WzBdID09PSBlbmRbMF0gJiYgc3RhcnRbMV0gPT09IGVuZFsxXSkpIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2xhdGUgZnJvbSBidWZmZXIgcG9zaXRpb24gdG8gdmlld3BvcnQgcG9zaXRpb25cbiAgICBjb25zdCB2aWV3cG9ydFkgPSB0ZXJtaW5hbC5idWZmZXJzLmFjdGl2ZS55ZGlzcDtcbiAgICBjb25zdCB2aWV3cG9ydFN0YXJ0Um93ID0gc3RhcnRbMV0gLSB2aWV3cG9ydFk7XG4gICAgY29uc3Qgdmlld3BvcnRFbmRSb3cgPSBlbmRbMV0gLSB2aWV3cG9ydFk7XG4gICAgY29uc3Qgdmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IE1hdGgubWF4KHZpZXdwb3J0U3RhcnRSb3csIDApO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2FwcGVkRW5kUm93ID0gTWF0aC5taW4odmlld3BvcnRFbmRSb3csIHRlcm1pbmFsLnJvd3MgLSAxKTtcblxuICAgIC8vIE5vIG5lZWQgdG8gZHJhdyB0aGUgc2VsZWN0aW9uXG4gICAgaWYgKHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPj0gdGVybWluYWwucm93cyB8fCB2aWV3cG9ydENhcHBlZEVuZFJvdyA8IDApIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhhc1NlbGVjdGlvbiA9IHRydWU7XG4gICAgdGhpcy5jb2x1bW5TZWxlY3RNb2RlID0gY29sdW1uU2VsZWN0TW9kZTtcbiAgICB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPSB2aWV3cG9ydFN0YXJ0Um93O1xuICAgIHRoaXMudmlld3BvcnRFbmRSb3cgPSB2aWV3cG9ydEVuZFJvdztcbiAgICB0aGlzLnZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPSB2aWV3cG9ydENhcHBlZFN0YXJ0Um93O1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRFbmRSb3cgPSB2aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICB0aGlzLnN0YXJ0Q29sID0gc3RhcnRbMF07XG4gICAgdGhpcy5lbmRDb2wgPSBlbmRbMF07XG4gIH1cblxuICBwdWJsaWMgaXNDZWxsU2VsZWN0ZWQodGVybWluYWw6IFRlcm1pbmFsLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgeSAtPSB0ZXJtaW5hbC5idWZmZXIuYWN0aXZlLnZpZXdwb3J0WTtcbiAgICBpZiAodGhpcy5jb2x1bW5TZWxlY3RNb2RlKSB7XG4gICAgICBpZiAodGhpcy5zdGFydENvbCA8PSB0aGlzLmVuZENvbCkge1xuICAgICAgICByZXR1cm4geCA+PSB0aGlzLnN0YXJ0Q29sICYmIHkgPj0gdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93ICYmXG4gICAgICAgICAgeCA8IHRoaXMuZW5kQ29sICYmIHkgPD0gdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICAgIH1cbiAgICAgIHJldHVybiB4IDwgdGhpcy5zdGFydENvbCAmJiB5ID49IHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyAmJlxuICAgICAgICB4ID49IHRoaXMuZW5kQ29sICYmIHkgPD0gdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdztcbiAgICB9XG4gICAgcmV0dXJuICh5ID4gdGhpcy52aWV3cG9ydFN0YXJ0Um93ICYmIHkgPCB0aGlzLnZpZXdwb3J0RW5kUm93KSB8fFxuICAgICAgKHRoaXMudmlld3BvcnRTdGFydFJvdyA9PT0gdGhpcy52aWV3cG9ydEVuZFJvdyAmJiB5ID09PSB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgJiYgeCA+PSB0aGlzLnN0YXJ0Q29sICYmIHggPCB0aGlzLmVuZENvbCkgfHxcbiAgICAgICh0aGlzLnZpZXdwb3J0U3RhcnRSb3cgPCB0aGlzLnZpZXdwb3J0RW5kUm93ICYmIHkgPT09IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeCA8IHRoaXMuZW5kQ29sKSB8fFxuICAgICAgKHRoaXMudmlld3BvcnRTdGFydFJvdyA8IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeSA9PT0gdGhpcy52aWV3cG9ydFN0YXJ0Um93ICYmIHggPj0gdGhpcy5zdGFydENvbCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsKCk6IElTZWxlY3Rpb25SZW5kZXJNb2RlbCB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uUmVuZGVyTW9kZWwoKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb2xvckNvbnRyYXN0Q2FjaGUgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IERJTV9PUEFDSVRZLCBURVhUX0JBU0VMSU5FIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ29uc3RhbnRzJztcbmltcG9ydCB7IHRyeURyYXdDdXN0b21DaGFyIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ3VzdG9tR2x5cGhzJztcbmltcG9ydCB7IGNvbXB1dGVOZXh0VmFyaWFudE9mZnNldCwgdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yLCBpc1Bvd2VybGluZUdseXBoLCBpc1Jlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaCwgdGhyb3dJZkZhbHN5IH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscyc7XG5pbXBvcnQgeyBJQm91bmRpbmdCb3gsIElDaGFyQXRsYXNDb25maWcsIElSYXN0ZXJpemVkR2x5cGgsIElUZXh0dXJlQXRsYXMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBOVUxMX0NPTE9SLCBjaGFubmVscywgY29sb3IsIHJnYmEgfSBmcm9tICdjb21tb24vQ29sb3InO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBGb3VyS2V5TWFwIH0gZnJvbSAnY29tbW9uL011bHRpS2V5TWFwJztcbmltcG9ydCB7IElkbGVUYXNrUXVldWUgfSBmcm9tICdjb21tb24vVGFza1F1ZXVlJztcbmltcG9ydCB7IElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhJztcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIERFRkFVTFRfQ09MT1IsIERFRkFVTFRfRVhULCBVbmRlcmxpbmVTdHlsZSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IElVbmljb2RlU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbi8qKlxuICogQSBzaGFyZWQgb2JqZWN0IHdoaWNoIGlzIHVzZWQgdG8gZHJhdyBub3RoaW5nIGZvciBhIHBhcnRpY3VsYXIgY2VsbC5cbiAqL1xuY29uc3QgTlVMTF9SQVNURVJJWkVEX0dMWVBIOiBJUmFzdGVyaXplZEdseXBoID0ge1xuICB0ZXh0dXJlUGFnZTogMCxcbiAgdGV4dHVyZVBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgdGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlOiB7IHg6IDAsIHk6IDAgfSxcbiAgb2Zmc2V0OiB7IHg6IDAsIHk6IDAgfSxcbiAgc2l6ZTogeyB4OiAwLCB5OiAwIH0sXG4gIHNpemVDbGlwU3BhY2U6IHsgeDogMCwgeTogMCB9XG59O1xuXG5jb25zdCBUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkcgPSAyO1xuXG5jb25zdCBlbnVtIENvbnN0YW50cyB7XG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIHBpeGVsIHBhZGRpbmcgdG8gYWxsb3cgaW4gZWFjaCByb3cuIFNldHRpbmcgdGhpcyB0byB6ZXJvIHdvdWxkIG1ha2UgdGhlIGF0bGFzXG4gICAqIHBhZ2UgcGFjayBhcyB0aWdodGx5IGFzIHBvc3NpYmxlLCBidXQgbW9yZSBwYWdlcyB3b3VsZCBlbmQgdXAgYmVpbmcgY3JlYXRlZCBhcyBhIHJlc3VsdC5cbiAgICovXG4gIFJPV19QSVhFTF9USFJFU0hPTEQgPSAyLFxuICAvKipcbiAgICogVGhlIG1heGltdW0gdGV4dHVyZSBzaXplIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgYWN0dWFsIGhhcmR3YXJlIG1heGltdW0gdHVybnMgb3V0IHRvIGJlLiBUaGlzXG4gICAqIGlzIGVuZm9yY2VkIHRvIGVuc3VyZSB1cGxvYWRpbmcgdGhlIHRleHR1cmUgc3RpbGwgZmluaXNoZXMgaW4gYSByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1lLiBBXG4gICAqIDQwOTYgc3F1YXJlZCBpbWFnZSB0YWtlcyB1cCAxNk1CIG9mIEdQVSBtZW1vcnkuXG4gICAqL1xuICBGT1JDRURfTUFYX1RFWFRVUkVfU0laRSA9IDQwOTZcbn1cblxuaW50ZXJmYWNlIElDaGFyQXRsYXNBY3RpdmVSb3cge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRnbHlwaCA9IHVuZGVmaW5lZDtcblxuZXhwb3J0IGNsYXNzIFRleHR1cmVBdGxhcyBpbXBsZW1lbnRzIElUZXh0dXJlQXRsYXMge1xuICBwcml2YXRlIF9kaWRXYXJtVXA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9jYWNoZU1hcDogRm91cktleU1hcDxudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIElSYXN0ZXJpemVkR2x5cGg+ID0gbmV3IEZvdXJLZXlNYXAoKTtcbiAgcHJpdmF0ZSBfY2FjaGVNYXBDb21iaW5lZDogRm91cktleU1hcDxzdHJpbmcsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIElSYXN0ZXJpemVkR2x5cGg+ID0gbmV3IEZvdXJLZXlNYXAoKTtcblxuICAvLyBUaGUgdGV4dHVyZSB0aGF0IHRoZSBhdGxhcyBpcyBkcmF3biB0b1xuICBwcml2YXRlIF9wYWdlczogQXRsYXNQYWdlW10gPSBbXTtcbiAgcHVibGljIGdldCBwYWdlcygpOiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIHZlcnNpb246IG51bWJlciB9W10geyByZXR1cm4gdGhpcy5fcGFnZXM7IH1cblxuICAvLyBUaGUgc2V0IG9mIGF0bGFzIHBhZ2VzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG9cbiAgcHJpdmF0ZSBfYWN0aXZlUGFnZXM6IEF0bGFzUGFnZVtdID0gW107XG5cbiAgcHJpdmF0ZSBfdG1wQ2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgLy8gQSB0ZW1wb3JhcnkgY29udGV4dCB0aGF0IGdseXBocyBhcmUgZHJhd24gdG8gYmVmb3JlIGJlaW5nIHRyYW5zZmVyZWQgdG8gdGhlIGF0bGFzLlxuICBwcml2YXRlIF90bXBDdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcblxuICBwcml2YXRlIF93b3JrQm91bmRpbmdCb3g6IElCb3VuZGluZ0JveCA9IHsgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IDAsIHJpZ2h0OiAwIH07XG4gIHByaXZhdGUgX3dvcmtBdHRyaWJ1dGVEYXRhOiBBdHRyaWJ1dGVEYXRhID0gbmV3IEF0dHJpYnV0ZURhdGEoKTtcblxuICBwcml2YXRlIF90ZXh0dXJlU2l6ZTogbnVtYmVyID0gNTEyO1xuXG4gIHB1YmxpYyBzdGF0aWMgbWF4QXRsYXNQYWdlczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgc3RhdGljIG1heFRleHR1cmVTaXplOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25BZGRUZXh0dXJlQXRsYXNDYW52YXMgPSBuZXcgRXZlbnRFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25BZGRUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMgPSBuZXcgRXZlbnRFbWl0dGVyPEhUTUxDYW52YXNFbGVtZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLl9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcy5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnOiBJQ2hhckF0bGFzQ29uZmlnLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3VuaWNvZGVTZXJ2aWNlOiBJVW5pY29kZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5fY3JlYXRlTmV3UGFnZSgpO1xuICAgIHRoaXMuX3RtcENhbnZhcyA9IGNyZWF0ZUNhbnZhcyhcbiAgICAgIF9kb2N1bWVudCxcbiAgICAgIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggKiA0ICsgVE1QX0NBTlZBU19HTFlQSF9QQURESU5HICogMixcbiAgICAgIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsSGVpZ2h0ICsgVE1QX0NBTlZBU19HTFlQSF9QQURESU5HICogMlxuICAgICk7XG4gICAgdGhpcy5fdG1wQ3R4ID0gdGhyb3dJZkZhbHN5KHRoaXMuX3RtcENhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgIGFscGhhOiB0aGlzLl9jb25maWcuYWxsb3dUcmFuc3BhcmVuY3ksXG4gICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWVcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgdGhpcy5wYWdlcykge1xuICAgICAgcGFnZS5jYW52YXMucmVtb3ZlKCk7XG4gICAgfVxuICAgIHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyB3YXJtVXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kaWRXYXJtVXApIHtcbiAgICAgIHRoaXMuX2RvV2FybVVwKCk7XG4gICAgICB0aGlzLl9kaWRXYXJtVXAgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2RvV2FybVVwKCk6IHZvaWQge1xuICAgIC8vIFByZS1maWxsIHdpdGggQVNDSUkgMzMtMTI2LCB0aGlzIGlzIG5vdCB1cmdlbnQgYW5kIGRvbmUgaW4gaWRsZSBjYWxsYmFja3NcbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBJZGxlVGFza1F1ZXVlKCk7XG4gICAgZm9yIChsZXQgaSA9IDMzOyBpIDwgMTI2OyBpKyspIHtcbiAgICAgIHF1ZXVlLmVucXVldWUoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlTWFwLmdldChpLCBERUZBVUxUX0NPTE9SLCBERUZBVUxUX0NPTE9SLCBERUZBVUxUX0VYVCkpIHtcbiAgICAgICAgICBjb25zdCByYXN0ZXJpemVkR2x5cGggPSB0aGlzLl9kcmF3VG9DYWNoZShpLCBERUZBVUxUX0NPTE9SLCBERUZBVUxUX0NPTE9SLCBERUZBVUxUX0VYVCk7XG4gICAgICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KGksIERFRkFVTFRfQ09MT1IsIERFRkFVTFRfQ09MT1IsIERFRkFVTFRfRVhULCByYXN0ZXJpemVkR2x5cGgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0Q2xlYXJNb2RlbCA9IGZhbHNlO1xuICBwdWJsaWMgYmVnaW5GcmFtZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdENsZWFyTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJUZXh0dXJlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wYWdlc1swXS5jdXJyZW50Um93LnggPT09IDAgJiYgdGhpcy5fcGFnZXNbMF0uY3VycmVudFJvdy55ID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLl9wYWdlcykge1xuICAgICAgcGFnZS5jbGVhcigpO1xuICAgIH1cbiAgICB0aGlzLl9jYWNoZU1hcC5jbGVhcigpO1xuICAgIHRoaXMuX2NhY2hlTWFwQ29tYmluZWQuY2xlYXIoKTtcbiAgICB0aGlzLl9kaWRXYXJtVXAgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZU5ld1BhZ2UoKTogQXRsYXNQYWdlIHtcbiAgICAvLyBUcnkgbWVyZ2UgdGhlIHNldCBvZiB0aGUgNCBtb3N0IHVzZWQgcGFnZXMgb2YgdGhlIGxhcmdlc3Qgc2l6ZS4gVGhpcyBpcyBpcyBkZWZlcnJlZCB0byBhXG4gICAgLy8gbWljcm90YXNrIHRvIGVuc3VyZSBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGV4dHVyZXMgdGhhdCB3aWxsIGJlIHJlbmRlcmVkIGluIHRoZSBjdXJyZW50XG4gICAgLy8gYW5pbWF0aW9uIGZyYW1lIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiBibGFuayByZW5kZXJlZCBhcmVhcy4gVGhpcyBpcyBhY3R1YWxseSBub3QgdGhhdFxuICAgIC8vIGV4cGVuc2l2ZSByZWxhdGl2ZSB0byBkcmF3aW5nIHRoZSBnbHlwaHMsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gd2FpdCBmb3IgYW4gaWRsZSBjYWxsYmFjay5cbiAgICBpZiAoVGV4dHVyZUF0bGFzLm1heEF0bGFzUGFnZXMgJiYgdGhpcy5fcGFnZXMubGVuZ3RoID49IE1hdGgubWF4KDQsIFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzKSkge1xuICAgICAgLy8gRmluZCB0aGUgc2V0IG9mIHRoZSBsYXJnZXN0IDQgaW1hZ2VzLCBiZWxvdyB0aGUgbWF4aW11bSBzaXplLCB3aXRoIHRoZSBoaWdoZXN0XG4gICAgICAvLyBwZXJjZW50YWdlcyB1c2VkXG4gICAgICBjb25zdCBwYWdlc0J5U2l6ZSA9IHRoaXMuX3BhZ2VzLmZpbHRlcihlID0+IHtcbiAgICAgICAgcmV0dXJuIGUuY2FudmFzLndpZHRoICogMiA8PSAoVGV4dHVyZUF0bGFzLm1heFRleHR1cmVTaXplIHx8IENvbnN0YW50cy5GT1JDRURfTUFYX1RFWFRVUkVfU0laRSk7XG4gICAgICB9KS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChiLmNhbnZhcy53aWR0aCAhPT0gYS5jYW52YXMud2lkdGgpIHtcbiAgICAgICAgICByZXR1cm4gYi5jYW52YXMud2lkdGggLSBhLmNhbnZhcy53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYi5wZXJjZW50YWdlVXNlZCAtIGEucGVyY2VudGFnZVVzZWQ7XG4gICAgICB9KTtcbiAgICAgIGxldCBzYW1lU2l6ZUkgPSAtMTtcbiAgICAgIGxldCBzaXplID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFnZXNCeVNpemUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhZ2VzQnlTaXplW2ldLmNhbnZhcy53aWR0aCAhPT0gc2l6ZSkge1xuICAgICAgICAgIHNhbWVTaXplSSA9IGk7XG4gICAgICAgICAgc2l6ZSA9IHBhZ2VzQnlTaXplW2ldLmNhbnZhcy53aWR0aDtcbiAgICAgICAgfSBlbHNlIGlmIChpIC0gc2FtZVNpemVJID09PSAzKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gR2F0aGVyIGRldGFpbHMgb2YgdGhlIG1lcmdlXG4gICAgICBjb25zdCBtZXJnaW5nUGFnZXMgPSBwYWdlc0J5U2l6ZS5zbGljZShzYW1lU2l6ZUksIHNhbWVTaXplSSArIDQpO1xuICAgICAgY29uc3Qgc29ydGVkTWVyZ2luZ1BhZ2VzSW5kZXhlcyA9IG1lcmdpbmdQYWdlcy5tYXAoZSA9PiBlLmdseXBoc1swXS50ZXh0dXJlUGFnZSkuc29ydCgoYSwgYikgPT4gYSA+IGIgPyAxIDogLTEpO1xuICAgICAgY29uc3QgbWVyZ2VkUGFnZUluZGV4ID0gdGhpcy5wYWdlcy5sZW5ndGggLSBtZXJnaW5nUGFnZXMubGVuZ3RoO1xuXG4gICAgICAvLyBNZXJnZSBpbnRvIHRoZSBuZXcgcGFnZVxuICAgICAgY29uc3QgbWVyZ2VkUGFnZSA9IHRoaXMuX21lcmdlUGFnZXMobWVyZ2luZ1BhZ2VzLCBtZXJnZWRQYWdlSW5kZXgpO1xuICAgICAgbWVyZ2VkUGFnZS52ZXJzaW9uKys7XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgcGFnZXMsIHNoaWZ0aW5nIGdseXBoIHRleHR1cmUgcGFnZXMgYXMgbmVlZGVkXG4gICAgICBmb3IgKGxldCBpID0gc29ydGVkTWVyZ2luZ1BhZ2VzSW5kZXhlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0aGlzLl9kZWxldGVQYWdlKHNvcnRlZE1lcmdpbmdQYWdlc0luZGV4ZXNbaV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdGhlIG5ldyBtZXJnZWQgcGFnZSB0byB0aGUgZW5kXG4gICAgICB0aGlzLnBhZ2VzLnB1c2gobWVyZ2VkUGFnZSk7XG5cbiAgICAgIC8vIFJlcXVlc3QgdGhlIG1vZGVsIHRvIGJlIGNsZWFyZWQgdG8gcmVmcmVzaCBhbGwgdGV4dHVyZSBwYWdlcy5cbiAgICAgIHRoaXMuX3JlcXVlc3RDbGVhck1vZGVsID0gdHJ1ZTtcbiAgICAgIHRoaXMuX29uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLmZpcmUobWVyZ2VkUGFnZS5jYW52YXMpO1xuICAgIH1cblxuICAgIC8vIEFsbCBuZXcgYXRsYXMgcGFnZXMgYXJlIGNyZWF0ZWQgc21hbGwgYXMgdGhleSBhcmUgaGlnaGx5IGR5bmFtaWNcbiAgICBjb25zdCBuZXdQYWdlID0gbmV3IEF0bGFzUGFnZSh0aGlzLl9kb2N1bWVudCwgdGhpcy5fdGV4dHVyZVNpemUpO1xuICAgIHRoaXMuX3BhZ2VzLnB1c2gobmV3UGFnZSk7XG4gICAgdGhpcy5fYWN0aXZlUGFnZXMucHVzaChuZXdQYWdlKTtcbiAgICB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcy5maXJlKG5ld1BhZ2UuY2FudmFzKTtcbiAgICByZXR1cm4gbmV3UGFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX21lcmdlUGFnZXMobWVyZ2luZ1BhZ2VzOiBBdGxhc1BhZ2VbXSwgbWVyZ2VkUGFnZUluZGV4OiBudW1iZXIpOiBBdGxhc1BhZ2Uge1xuICAgIGNvbnN0IG1lcmdlZFNpemUgPSBtZXJnaW5nUGFnZXNbMF0uY2FudmFzLndpZHRoICogMjtcbiAgICBjb25zdCBtZXJnZWRQYWdlID0gbmV3IEF0bGFzUGFnZSh0aGlzLl9kb2N1bWVudCwgbWVyZ2VkU2l6ZSwgbWVyZ2luZ1BhZ2VzKTtcbiAgICBmb3IgKGNvbnN0IFtpLCBwXSBvZiBtZXJnaW5nUGFnZXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCB4T2Zmc2V0ID0gaSAqIHAuY2FudmFzLndpZHRoICUgbWVyZ2VkU2l6ZTtcbiAgICAgIGNvbnN0IHlPZmZzZXQgPSBNYXRoLmZsb29yKGkgLyAyKSAqIHAuY2FudmFzLmhlaWdodDtcbiAgICAgIG1lcmdlZFBhZ2UuY3R4LmRyYXdJbWFnZShwLmNhbnZhcywgeE9mZnNldCwgeU9mZnNldCk7XG4gICAgICBmb3IgKGNvbnN0IGcgb2YgcC5nbHlwaHMpIHtcbiAgICAgICAgZy50ZXh0dXJlUGFnZSA9IG1lcmdlZFBhZ2VJbmRleDtcbiAgICAgICAgZy5zaXplQ2xpcFNwYWNlLnggPSBnLnNpemUueCAvIG1lcmdlZFNpemU7XG4gICAgICAgIGcuc2l6ZUNsaXBTcGFjZS55ID0gZy5zaXplLnkgLyBtZXJnZWRTaXplO1xuICAgICAgICBnLnRleHR1cmVQb3NpdGlvbi54ICs9IHhPZmZzZXQ7XG4gICAgICAgIGcudGV4dHVyZVBvc2l0aW9uLnkgKz0geU9mZnNldDtcbiAgICAgICAgZy50ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2UueCA9IGcudGV4dHVyZVBvc2l0aW9uLnggLyBtZXJnZWRTaXplO1xuICAgICAgICBnLnRleHR1cmVQb3NpdGlvbkNsaXBTcGFjZS55ID0gZy50ZXh0dXJlUG9zaXRpb24ueSAvIG1lcmdlZFNpemU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzLmZpcmUocC5jYW52YXMpO1xuXG4gICAgICAvLyBSZW1vdmUgdGhlIG1lcmdpbmcgcGFnZSBmcm9tIGFjdGl2ZSBwYWdlcyBpZiBpdCB3YXMgdGhlcmVcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fYWN0aXZlUGFnZXMuaW5kZXhPZihwKTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlUGFnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFBhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9kZWxldGVQYWdlKHBhZ2VJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcGFnZXMuc3BsaWNlKHBhZ2VJbmRleCwgMSk7XG4gICAgZm9yIChsZXQgaiA9IHBhZ2VJbmRleDsgaiA8IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhZGp1c3RpbmdQYWdlID0gdGhpcy5fcGFnZXNbal07XG4gICAgICBmb3IgKGNvbnN0IGcgb2YgYWRqdXN0aW5nUGFnZS5nbHlwaHMpIHtcbiAgICAgICAgZy50ZXh0dXJlUGFnZS0tO1xuICAgICAgfVxuICAgICAgYWRqdXN0aW5nUGFnZS52ZXJzaW9uKys7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFJhc3Rlcml6ZWRHbHlwaENvbWJpbmVkQ2hhcihjaGFyczogc3RyaW5nLCBiZzogbnVtYmVyLCBmZzogbnVtYmVyLCBleHQ6IG51bWJlciwgcmVzdHJpY3RUb0NlbGxIZWlnaHQ6IGJvb2xlYW4pOiBJUmFzdGVyaXplZEdseXBoIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0RnJvbUNhY2hlTWFwKHRoaXMuX2NhY2hlTWFwQ29tYmluZWQsIGNoYXJzLCBiZywgZmcsIGV4dCwgcmVzdHJpY3RUb0NlbGxIZWlnaHQpO1xuICB9XG5cbiAgcHVibGljIGdldFJhc3Rlcml6ZWRHbHlwaChjb2RlOiBudW1iZXIsIGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIGV4dDogbnVtYmVyLCByZXN0cmljdFRvQ2VsbEhlaWdodDogYm9vbGVhbik6IElSYXN0ZXJpemVkR2x5cGgge1xuICAgIHJldHVybiB0aGlzLl9nZXRGcm9tQ2FjaGVNYXAodGhpcy5fY2FjaGVNYXAsIGNvZGUsIGJnLCBmZywgZXh0LCByZXN0cmljdFRvQ2VsbEhlaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZ2x5cGhzIHRleHR1cmUgY29vcmRzLCBkcmF3aW5nIHRoZSB0ZXh0dXJlIGlmIGl0J3Mgbm90IGFscmVhZHlcbiAgICovXG4gIHByaXZhdGUgX2dldEZyb21DYWNoZU1hcChcbiAgICBjYWNoZU1hcDogRm91cktleU1hcDxzdHJpbmcgfCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIElSYXN0ZXJpemVkR2x5cGg+LFxuICAgIGtleTogc3RyaW5nIHwgbnVtYmVyLFxuICAgIGJnOiBudW1iZXIsXG4gICAgZmc6IG51bWJlcixcbiAgICBleHQ6IG51bWJlcixcbiAgICByZXN0cmljdFRvQ2VsbEhlaWdodDogYm9vbGVhbiA9IGZhbHNlXG4gICk6IElSYXN0ZXJpemVkR2x5cGgge1xuICAgICRnbHlwaCA9IGNhY2hlTWFwLmdldChrZXksIGJnLCBmZywgZXh0KTtcbiAgICBpZiAoISRnbHlwaCkge1xuICAgICAgJGdseXBoID0gdGhpcy5fZHJhd1RvQ2FjaGUoa2V5LCBiZywgZmcsIGV4dCwgcmVzdHJpY3RUb0NlbGxIZWlnaHQpO1xuICAgICAgY2FjaGVNYXAuc2V0KGtleSwgYmcsIGZnLCBleHQsICRnbHlwaCk7XG4gICAgfVxuICAgIHJldHVybiAkZ2x5cGg7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb2xvckZyb21BbnNpSW5kZXgoaWR4OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgIGlmIChpZHggPj0gdGhpcy5fY29uZmlnLmNvbG9ycy5hbnNpLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb2xvciBmb3VuZCBmb3IgaWR4ICcgKyBpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmNvbG9ycy5hbnNpW2lkeF07XG4gIH1cblxuICBwcml2YXRlIF9nZXRCYWNrZ3JvdW5kQ29sb3IoYmdDb2xvck1vZGU6IG51bWJlciwgYmdDb2xvcjogbnVtYmVyLCBpbnZlcnNlOiBib29sZWFuLCBkaW06IGJvb2xlYW4pOiBJQ29sb3Ige1xuICAgIGlmICh0aGlzLl9jb25maWcuYWxsb3dUcmFuc3BhcmVuY3kpIHtcbiAgICAgIC8vIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG1pZ2h0IGhhdmUgc29tZSB0cmFuc3BhcmVuY3ksIHNvIHdlIG5lZWQgdG8gcmVuZGVyIGl0IGFzIGZ1bGx5XG4gICAgICAvLyB0cmFuc3BhcmVudCBpbiB0aGUgYXRsYXMuIE90aGVyd2lzZSB3ZSdkIGVuZCB1cCBkcmF3aW5nIHRoZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIHR3aWNlXG4gICAgICAvLyBhcm91bmQgdGhlIGFudGktYWxpYXNlZCBlZGdlcyBvZiB0aGUgZ2x5cGgsIGFuZCBpdCB3b3VsZCBsb29rIHRvbyBkYXJrLlxuICAgICAgcmV0dXJuIE5VTExfQ09MT1I7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogSUNvbG9yO1xuICAgIHN3aXRjaCAoYmdDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0Q29sb3JGcm9tQW5zaUluZGV4KGJnQ29sb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgIGNvbnN0IGFyciA9IEF0dHJpYnV0ZURhdGEudG9Db2xvclJHQihiZ0NvbG9yKTtcbiAgICAgICAgcmVzdWx0ID0gY2hhbm5lbHMudG9Db2xvcihhcnJbMF0sIGFyclsxXSwgYXJyWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICAgICAgcmVzdWx0ID0gY29sb3Iub3BhcXVlKHRoaXMuX2NvbmZpZy5jb2xvcnMuZm9yZWdyb3VuZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5fY29uZmlnLmNvbG9ycy5iYWNrZ3JvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIF9nZXRGb3JlZ3JvdW5kQ29sb3IoYmc6IG51bWJlciwgYmdDb2xvck1vZGU6IG51bWJlciwgYmdDb2xvcjogbnVtYmVyLCBmZzogbnVtYmVyLCBmZ0NvbG9yTW9kZTogbnVtYmVyLCBmZ0NvbG9yOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4sIGRpbTogYm9vbGVhbiwgYm9sZDogYm9vbGVhbiwgZXhjbHVkZUZyb21Db250cmFzdFJhdGlvRGVtYW5kczogYm9vbGVhbik6IElDb2xvciB7XG4gICAgY29uc3QgbWluaW11bUNvbnRyYXN0Q29sb3IgPSB0aGlzLl9nZXRNaW5pbXVtQ29udHJhc3RDb2xvcihiZywgYmdDb2xvck1vZGUsIGJnQ29sb3IsIGZnLCBmZ0NvbG9yTW9kZSwgZmdDb2xvciwgaW52ZXJzZSwgYm9sZCwgZGltLCBleGNsdWRlRnJvbUNvbnRyYXN0UmF0aW9EZW1hbmRzKTtcbiAgICBpZiAobWluaW11bUNvbnRyYXN0Q29sb3IpIHtcbiAgICAgIHJldHVybiBtaW5pbXVtQ29udHJhc3RDb2xvcjtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0OiBJQ29sb3I7XG4gICAgc3dpdGNoIChmZ0NvbG9yTW9kZSkge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzICYmIGJvbGQgJiYgZmdDb2xvciA8IDgpIHtcbiAgICAgICAgICBmZ0NvbG9yICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0Q29sb3JGcm9tQW5zaUluZGV4KGZnQ29sb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9SR0I6XG4gICAgICAgIGNvbnN0IGFyciA9IEF0dHJpYnV0ZURhdGEudG9Db2xvclJHQihmZ0NvbG9yKTtcbiAgICAgICAgcmVzdWx0ID0gY2hhbm5lbHMudG9Db2xvcihhcnJbMF0sIGFyclsxXSwgYXJyWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5fY29uZmlnLmNvbG9ycy5iYWNrZ3JvdW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2NvbmZpZy5jb2xvcnMuZm9yZWdyb3VuZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsd2F5cyB1c2UgYW4gb3BhcXVlIGNvbG9yIHJlZ2FyZGxlc3Mgb2YgYWxsb3dUcmFuc3BhcmVuY3lcbiAgICBpZiAodGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5KSB7XG4gICAgICByZXN1bHQgPSBjb2xvci5vcGFxdWUocmVzdWx0KTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBkaW0gdG8gdGhlIGNvbG9yLCBvcGFjaXR5IGlzIGZpbmUgdG8gdXNlIGZvciB0aGUgZm9yZWdyb3VuZCBjb2xvclxuICAgIGlmIChkaW0pIHtcbiAgICAgIHJlc3VsdCA9IGNvbG9yLm11bHRpcGx5T3BhY2l0eShyZXN1bHQsIERJTV9PUEFDSVRZKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzb2x2ZUJhY2tncm91bmRSZ2JhKGJnQ29sb3JNb2RlOiBudW1iZXIsIGJnQ29sb3I6IG51bWJlciwgaW52ZXJzZTogYm9vbGVhbik6IG51bWJlciB7XG4gICAgc3dpdGNoIChiZ0NvbG9yTW9kZSkge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29sb3JGcm9tQW5zaUluZGV4KGJnQ29sb3IpLnJnYmE7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOlxuICAgICAgICByZXR1cm4gYmdDb2xvciA8PCA4O1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX0RFRkFVTFQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jb25maWcuY29sb3JzLmZvcmVncm91bmQucmdiYTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLmNvbG9ycy5iYWNrZ3JvdW5kLnJnYmE7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVzb2x2ZUZvcmVncm91bmRSZ2JhKGZnQ29sb3JNb2RlOiBudW1iZXIsIGZnQ29sb3I6IG51bWJlciwgaW52ZXJzZTogYm9vbGVhbiwgYm9sZDogYm9vbGVhbik6IG51bWJlciB7XG4gICAgc3dpdGNoIChmZ0NvbG9yTW9kZSkge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OlxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzICYmIGJvbGQgJiYgZmdDb2xvciA8IDgpIHtcbiAgICAgICAgICBmZ0NvbG9yICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbG9yRnJvbUFuc2lJbmRleChmZ0NvbG9yKS5yZ2JhO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgcmV0dXJuIGZnQ29sb3IgPDwgODtcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9ERUZBVUxUOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGludmVyc2UpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLmNvbG9ycy5iYWNrZ3JvdW5kLnJnYmE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuZm9yZWdyb3VuZC5yZ2JhO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldE1pbmltdW1Db250cmFzdENvbG9yKGJnOiBudW1iZXIsIGJnQ29sb3JNb2RlOiBudW1iZXIsIGJnQ29sb3I6IG51bWJlciwgZmc6IG51bWJlciwgZmdDb2xvck1vZGU6IG51bWJlciwgZmdDb2xvcjogbnVtYmVyLCBpbnZlcnNlOiBib29sZWFuLCBib2xkOiBib29sZWFuLCBkaW06IGJvb2xlYW4sIGV4Y2x1ZGVGcm9tQ29udHJhc3RSYXRpb0RlbWFuZHM6IGJvb2xlYW4pOiBJQ29sb3IgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9jb25maWcubWluaW11bUNvbnRyYXN0UmF0aW8gPT09IDEgfHwgZXhjbHVkZUZyb21Db250cmFzdFJhdGlvRGVtYW5kcykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBUcnkgZ2V0IGZyb20gY2FjaGUgZmlyc3RcbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuX2dldENvbnRyYXN0Q2FjaGUoZGltKTtcbiAgICBjb25zdCBhZGp1c3RlZENvbG9yID0gY2FjaGUuZ2V0Q29sb3IoYmcsIGZnKTtcbiAgICBpZiAoYWRqdXN0ZWRDb2xvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYWRqdXN0ZWRDb2xvciB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYmdSZ2JhID0gdGhpcy5fcmVzb2x2ZUJhY2tncm91bmRSZ2JhKGJnQ29sb3JNb2RlLCBiZ0NvbG9yLCBpbnZlcnNlKTtcbiAgICBjb25zdCBmZ1JnYmEgPSB0aGlzLl9yZXNvbHZlRm9yZWdyb3VuZFJnYmEoZmdDb2xvck1vZGUsIGZnQ29sb3IsIGludmVyc2UsIGJvbGQpO1xuICAgIC8vIERpbSBjZWxscyBvbmx5IHJlcXVpcmUgaGFsZiB0aGUgY29udHJhc3QsIG90aGVyd2lzZSB0aGV5IHdvdWxkbid0IGJlIGRpc3Rpbmd1aXNoYWJsZSBmcm9tXG4gICAgLy8gbm9uLWRpbSBjZWxsc1xuICAgIGNvbnN0IHJlc3VsdCA9IHJnYmEuZW5zdXJlQ29udHJhc3RSYXRpbyhiZ1JnYmEsIGZnUmdiYSwgdGhpcy5fY29uZmlnLm1pbmltdW1Db250cmFzdFJhdGlvIC8gKGRpbSA/IDIgOiAxKSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgY2FjaGUuc2V0Q29sb3IoYmcsIGZnLCBudWxsKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3IgPSBjaGFubmVscy50b0NvbG9yKFxuICAgICAgKHJlc3VsdCA+PiAyNCkgJiAweEZGLFxuICAgICAgKHJlc3VsdCA+PiAxNikgJiAweEZGLFxuICAgICAgKHJlc3VsdCA+PiA4KSAmIDB4RkZcbiAgICApO1xuICAgIGNhY2hlLnNldENvbG9yKGJnLCBmZywgY29sb3IpO1xuXG4gICAgcmV0dXJuIGNvbG9yO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29udHJhc3RDYWNoZShkaW06IGJvb2xlYW4pOiBJQ29sb3JDb250cmFzdENhY2hlIHtcbiAgICBpZiAoZGltKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29uZmlnLmNvbG9ycy5oYWxmQ29udHJhc3RDYWNoZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jb2xvcnMuY29udHJhc3RDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgX2RyYXdUb0NhY2hlKGNvZGVPckNoYXJzOiBudW1iZXIgfCBzdHJpbmcsIGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIGV4dDogbnVtYmVyLCByZXN0cmljdFRvQ2VsbEhlaWdodDogYm9vbGVhbiA9IGZhbHNlKTogSVJhc3Rlcml6ZWRHbHlwaCB7XG4gICAgY29uc3QgY2hhcnMgPSB0eXBlb2YgY29kZU9yQ2hhcnMgPT09ICdudW1iZXInID8gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlT3JDaGFycykgOiBjb2RlT3JDaGFycztcblxuICAgIC8vIFVuY29tbWVudCBmb3IgZGVidWdnaW5nXG4gICAgLy8gY29uc29sZS5sb2coYGRyYXcgdG8gY2FjaGUgXCIke2NoYXJzfVwiYCwgYmcsIGZnLCBleHQpO1xuXG4gICAgLy8gQWxsb3cgMSBjZWxsIHdpZHRoIHBlciBjaGFyYWN0ZXIsIHdpdGggYSBtaW5pbXVtIG9mIDIgKENKSyksIHBsdXMgc29tZSBwYWRkaW5nLiBUaGlzIGlzIHVzZWRcbiAgICAvLyB0byBkcmF3IHRoZSBnbHlwaCB0byB0aGUgY2FudmFzIGFzIHdlbGwgYXMgdG8gcmVzdHJpY3QgdGhlIGJvdW5kaW5nIGJveCBzZWFyY2ggdG8gZW5zdXJlXG4gICAgLy8gZ2lhbnQgbGlnYXR1cmVzIChlZy4gPT09PT0+KSBkb24ndCBpbXBhY3Qgb3ZlcmFsbCBwZXJmb3JtYW5jZS5cbiAgICBjb25zdCBhbGxvd2VkV2lkdGggPSBNYXRoLm1pbih0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoICogTWF0aC5tYXgoY2hhcnMubGVuZ3RoLCAyKSArIFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyAqIDIsIHRoaXMuX3RleHR1cmVTaXplKTtcbiAgICBpZiAodGhpcy5fdG1wQ2FudmFzLndpZHRoIDwgYWxsb3dlZFdpZHRoKSB7XG4gICAgICB0aGlzLl90bXBDYW52YXMud2lkdGggPSBhbGxvd2VkV2lkdGg7XG4gICAgfVxuICAgIC8vIEluY2x1ZGUgbGluZSBoZWlnaHQgd2hlbiBkcmF3aW5nIGdseXBoc1xuICAgIGNvbnN0IGFsbG93ZWRIZWlnaHQgPSBNYXRoLm1pbih0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCArIFRNUF9DQU5WQVNfR0xZUEhfUEFERElORyAqIDQsIHRoaXMuX3RleHR1cmVTaXplKTtcbiAgICBpZiAodGhpcy5fdG1wQ2FudmFzLmhlaWdodCA8IGFsbG93ZWRIZWlnaHQpIHtcbiAgICAgIHRoaXMuX3RtcENhbnZhcy5oZWlnaHQgPSBhbGxvd2VkSGVpZ2h0O1xuICAgIH1cbiAgICB0aGlzLl90bXBDdHguc2F2ZSgpO1xuXG4gICAgdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZmcgPSBmZztcbiAgICB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5iZyA9IGJnO1xuICAgIHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmV4dGVuZGVkLmV4dCA9IGV4dDtcblxuICAgIGNvbnN0IGludmlzaWJsZSA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNJbnZpc2libGUoKTtcbiAgICBpZiAoaW52aXNpYmxlKSB7XG4gICAgICByZXR1cm4gTlVMTF9SQVNURVJJWkVEX0dMWVBIO1xuICAgIH1cblxuICAgIGNvbnN0IGJvbGQgPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzQm9sZCgpO1xuICAgIGNvbnN0IGludmVyc2UgPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzSW52ZXJzZSgpO1xuICAgIGNvbnN0IGRpbSA9ICEhdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNEaW0oKTtcbiAgICBjb25zdCBpdGFsaWMgPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzSXRhbGljKCk7XG4gICAgY29uc3QgdW5kZXJsaW5lID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc1VuZGVybGluZSgpO1xuICAgIGNvbnN0IHN0cmlrZXRocm91Z2ggPSAhIXRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmlzU3RyaWtldGhyb3VnaCgpO1xuICAgIGNvbnN0IG92ZXJsaW5lID0gISF0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc092ZXJsaW5lKCk7XG4gICAgbGV0IGZnQ29sb3IgPSB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRGZ0NvbG9yKCk7XG4gICAgbGV0IGZnQ29sb3JNb2RlID0gdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZ2V0RmdDb2xvck1vZGUoKTtcbiAgICBsZXQgYmdDb2xvciA9IHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldEJnQ29sb3IoKTtcbiAgICBsZXQgYmdDb2xvck1vZGUgPSB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5nZXRCZ0NvbG9yTW9kZSgpO1xuICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICBjb25zdCB0ZW1wID0gZmdDb2xvcjtcbiAgICAgIGZnQ29sb3IgPSBiZ0NvbG9yO1xuICAgICAgYmdDb2xvciA9IHRlbXA7XG4gICAgICBjb25zdCB0ZW1wMiA9IGZnQ29sb3JNb2RlO1xuICAgICAgZmdDb2xvck1vZGUgPSBiZ0NvbG9yTW9kZTtcbiAgICAgIGJnQ29sb3JNb2RlID0gdGVtcDI7XG4gICAgfVxuXG4gICAgLy8gZHJhdyB0aGUgYmFja2dyb3VuZFxuICAgIGNvbnN0IGJhY2tncm91bmRDb2xvciA9IHRoaXMuX2dldEJhY2tncm91bmRDb2xvcihiZ0NvbG9yTW9kZSwgYmdDb2xvciwgaW52ZXJzZSwgZGltKTtcbiAgICAvLyBVc2UgYSAnY29weScgY29tcG9zaXRlIG9wZXJhdGlvbiB0byBjbGVhciBhbnkgZXhpc3RpbmcgZ2x5cGggb3V0IG9mIF90bXBDdHhXaXRoQWxwaGEsXG4gICAgLy8gcmVnYXJkbGVzcyBvZiB0cmFuc3BhcmVuY3kgaW4gYmFja2dyb3VuZENvbG9yXG4gICAgdGhpcy5fdG1wQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdjb3B5JztcbiAgICB0aGlzLl90bXBDdHguZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yLmNzcztcbiAgICB0aGlzLl90bXBDdHguZmlsbFJlY3QoMCwgMCwgdGhpcy5fdG1wQ2FudmFzLndpZHRoLCB0aGlzLl90bXBDYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLl90bXBDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcblxuICAgIC8vIGRyYXcgdGhlIGZvcmVncm91bmQvZ2x5cGhcbiAgICBjb25zdCBmb250V2VpZ2h0ID0gYm9sZCA/IHRoaXMuX2NvbmZpZy5mb250V2VpZ2h0Qm9sZCA6IHRoaXMuX2NvbmZpZy5mb250V2VpZ2h0O1xuICAgIGNvbnN0IGZvbnRTdHlsZSA9IGl0YWxpYyA/ICdpdGFsaWMnIDogJyc7XG4gICAgdGhpcy5fdG1wQ3R4LmZvbnQgPVxuICAgICAgYCR7Zm9udFN0eWxlfSAke2ZvbnRXZWlnaHR9ICR7dGhpcy5fY29uZmlnLmZvbnRTaXplICogdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW99cHggJHt0aGlzLl9jb25maWcuZm9udEZhbWlseX1gO1xuICAgIHRoaXMuX3RtcEN0eC50ZXh0QmFzZWxpbmUgPSBURVhUX0JBU0VMSU5FO1xuXG4gICAgY29uc3QgcG93ZXJsaW5lR2x5cGggPSBjaGFycy5sZW5ndGggPT09IDEgJiYgaXNQb3dlcmxpbmVHbHlwaChjaGFycy5jaGFyQ29kZUF0KDApKTtcbiAgICBjb25zdCByZXN0cmljdGVkUG93ZXJsaW5lR2x5cGggPSBjaGFycy5sZW5ndGggPT09IDEgJiYgaXNSZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgoY2hhcnMuY2hhckNvZGVBdCgwKSk7XG4gICAgY29uc3QgZm9yZWdyb3VuZENvbG9yID0gdGhpcy5fZ2V0Rm9yZWdyb3VuZENvbG9yKGJnLCBiZ0NvbG9yTW9kZSwgYmdDb2xvciwgZmcsIGZnQ29sb3JNb2RlLCBmZ0NvbG9yLCBpbnZlcnNlLCBkaW0sIGJvbGQsIHRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvcihjaGFycy5jaGFyQ29kZUF0KDApKSk7XG4gICAgdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZSA9IGZvcmVncm91bmRDb2xvci5jc3M7XG5cbiAgICAvLyBGb3IgcG93ZXJsaW5lIGdseXBocyBsZWZ0L3RvcCBwYWRkaW5nIGlzIGV4Y2x1ZGVkIChodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3ZzY29kZS9pc3N1ZXMvMTIwMTI5KVxuICAgIGNvbnN0IHBhZGRpbmcgPSByZXN0cmljdGVkUG93ZXJsaW5lR2x5cGggPyAwIDogVE1QX0NBTlZBU19HTFlQSF9QQURESU5HICogMjtcblxuICAgIC8vIERyYXcgY3VzdG9tIGNoYXJhY3RlcnMgaWYgYXBwbGljYWJsZVxuICAgIGxldCBjdXN0b21HbHlwaCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9jb25maWcuY3VzdG9tR2x5cGhzICE9PSBmYWxzZSkge1xuICAgICAgY3VzdG9tR2x5cGggPSB0cnlEcmF3Q3VzdG9tQ2hhcih0aGlzLl90bXBDdHgsIGNoYXJzLCBwYWRkaW5nLCBwYWRkaW5nLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCwgdGhpcy5fY29uZmlnLmZvbnRTaXplLCB0aGlzLl9jb25maWcuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgfVxuXG4gICAgLy8gV2hldGhlciB0byBjbGVhciBwaXhlbHMgYmFzZWQgb24gYSB0aHJlc2hvbGQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBnbHlwaCBjb2xvciBhbmQgdGhlXG4gICAgLy8gYmFja2dyb3VuZCBjb2xvci4gVGhpcyBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUgZ2x5cGggY29udGFpbnMgbXVsdGlwbGUgY29sb3JzIHN1Y2ggYXNcbiAgICAvLyB1bmRlcmxpbmUgY29sb3JzIHRvIHByZXZlbnQgaW1wb3J0YW50IGNvbG9ycyBjb3VsZCBnZXQgY2xlYXJlZC5cbiAgICBsZXQgZW5hYmxlQ2xlYXJUaHJlc2hvbGRDaGVjayA9ICFwb3dlcmxpbmVHbHlwaDtcblxuICAgIGxldCBjaFdpZHRoOiBudW1iZXI7XG4gICAgaWYgKHR5cGVvZiBjb2RlT3JDaGFycyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNoV2lkdGggPSB0aGlzLl91bmljb2RlU2VydmljZS53Y3dpZHRoKGNvZGVPckNoYXJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hXaWR0aCA9IHRoaXMuX3VuaWNvZGVTZXJ2aWNlLmdldFN0cmluZ0NlbGxXaWR0aChjb2RlT3JDaGFycyk7XG4gICAgfVxuXG4gICAgLy8gRHJhdyB1bmRlcmxpbmVcbiAgICBpZiAodW5kZXJsaW5lKSB7XG4gICAgICB0aGlzLl90bXBDdHguc2F2ZSgpO1xuICAgICAgY29uc3QgbGluZVdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih0aGlzLl9jb25maWcuZm9udFNpemUgKiB0aGlzLl9jb25maWcuZGV2aWNlUGl4ZWxSYXRpbyAvIDE1KSk7XG4gICAgICAvLyBXaGVuIHRoZSBsaW5lIHdpZHRoIGlzIG9kZCwgZHJhdyBhdCBhIDAuNSBwb3NpdGlvblxuICAgICAgY29uc3QgeU9mZnNldCA9IGxpbmVXaWR0aCAlIDIgPT09IDEgPyAwLjUgOiAwO1xuICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcblxuICAgICAgLy8gVW5kZXJsaW5lIGNvbG9yXG4gICAgICBpZiAodGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuaXNVbmRlcmxpbmVDb2xvckRlZmF1bHQoKSkge1xuICAgICAgICB0aGlzLl90bXBDdHguc3Ryb2tlU3R5bGUgPSB0aGlzLl90bXBDdHguZmlsbFN0eWxlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc1VuZGVybGluZUNvbG9yUkdCKCkpIHtcbiAgICAgICAgZW5hYmxlQ2xlYXJUaHJlc2hvbGRDaGVjayA9IGZhbHNlO1xuICAgICAgICB0aGlzLl90bXBDdHguc3Ryb2tlU3R5bGUgPSBgcmdiKCR7QXR0cmlidXRlRGF0YS50b0NvbG9yUkdCKHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldFVuZGVybGluZUNvbG9yKCkpLmpvaW4oJywnKX0pYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2sgPSBmYWxzZTtcbiAgICAgICAgbGV0IGZnID0gdGhpcy5fd29ya0F0dHJpYnV0ZURhdGEuZ2V0VW5kZXJsaW5lQ29sb3IoKTtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kcmF3Qm9sZFRleHRJbkJyaWdodENvbG9ycyAmJiB0aGlzLl93b3JrQXR0cmlidXRlRGF0YS5pc0JvbGQoKSAmJiBmZyA8IDgpIHtcbiAgICAgICAgICBmZyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VTdHlsZSA9IHRoaXMuX2dldENvbG9yRnJvbUFuc2lJbmRleChmZykuY3NzO1xuICAgICAgfVxuXG4gICAgICAvLyBVbmRlcmxpbmUgc3R5bGUvc3Ryb2tlXG4gICAgICB0aGlzLl90bXBDdHguYmVnaW5QYXRoKCk7XG4gICAgICBjb25zdCB4TGVmdCA9IHBhZGRpbmc7XG4gICAgICBjb25zdCB5VG9wID0gTWF0aC5jZWlsKHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCkgLSB5T2Zmc2V0IC0gKHJlc3RyaWN0VG9DZWxsSGVpZ2h0ID8gbGluZVdpZHRoICogMiA6IDApO1xuICAgICAgY29uc3QgeU1pZCA9IHlUb3AgKyBsaW5lV2lkdGg7XG4gICAgICBjb25zdCB5Qm90ID0geVRvcCArIGxpbmVXaWR0aCAqIDI7XG4gICAgICBsZXQgbmV4dE9mZnNldCA9IHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmdldFVuZGVybGluZVZhcmlhbnRPZmZzZXQoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaFdpZHRoOyBpKyspIHtcbiAgICAgICAgdGhpcy5fdG1wQ3R4LnNhdmUoKTtcbiAgICAgICAgY29uc3QgeENoTGVmdCA9IHhMZWZ0ICsgaSAqIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGg7XG4gICAgICAgIGNvbnN0IHhDaFJpZ2h0ID0geExlZnQgKyAoaSArIDEpICogdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aDtcbiAgICAgICAgY29uc3QgeENoTWlkID0geENoTGVmdCArIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLyAyO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuX3dvcmtBdHRyaWJ1dGVEYXRhLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlKSB7XG4gICAgICAgICAgY2FzZSBVbmRlcmxpbmVTdHlsZS5ET1VCTEU6XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQsIHlUb3ApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hSaWdodCwgeVRvcCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQsIHlCb3QpO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hSaWdodCwgeUJvdCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFVuZGVybGluZVN0eWxlLkNVUkxZOlxuICAgICAgICAgICAgLy8gQ2hvb3NlIHRoZSBiZXppZXIgdG9wIGFuZCBib3R0b20gYmFzZWQgb24gdGhlIGRldmljZSBwaXhlbCByYXRpbywgdGhlIGN1cmx5IGxpbmUgaXNcbiAgICAgICAgICAgIC8vIG1hZGUgdGFsbGVyIHdoZW4gdGhlIGxpbmUgd2lkdGggaXMgIGFzIG90aGVyd2lzZSBpdCdzIG5vdCB2ZXJ5IGNsZWFyIG90aGVyd2lzZS5cbiAgICAgICAgICAgIGNvbnN0IHlDdXJseUJvdCA9IGxpbmVXaWR0aCA8PSAxID8geUJvdCA6IE1hdGguY2VpbChwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQgLSBsaW5lV2lkdGggLyAyKSAtIHlPZmZzZXQ7XG4gICAgICAgICAgICBjb25zdCB5Q3VybHlUb3AgPSBsaW5lV2lkdGggPD0gMSA/IHlUb3AgOiBNYXRoLmNlaWwocGFkZGluZyArIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0ICsgbGluZVdpZHRoIC8gMikgLSB5T2Zmc2V0O1xuICAgICAgICAgICAgLy8gQ2xpcCB0aGUgbGVmdCBhbmQgcmlnaHQgZWRnZXMgb2YgdGhlIHVuZGVybGluZSBzdWNoIHRoYXQgaXQgY2FuIGJlIGRyYXduIGp1c3Qgb3V0c2lkZVxuICAgICAgICAgICAgLy8gdGhlIGVkZ2Ugb2YgdGhlIGNlbGwgdG8gZW5zdXJlIGEgY29udGludW91cyBzdHJva2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgdW5kZXJsaW5lZFxuICAgICAgICAgICAgLy8gZ2x5cGhzIGFkamFjZW50IHRvIG9uZSBhbm90aGVyLlxuICAgICAgICAgICAgY29uc3QgY2xpcFJlZ2lvbiA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgICAgIGNsaXBSZWdpb24ucmVjdCh4Q2hMZWZ0LCB5VG9wLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoLCB5Qm90IC0geVRvcCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguY2xpcChjbGlwUmVnaW9uKTtcbiAgICAgICAgICAgIC8vIFN0YXJ0IDEvMiBjZWxsIGJlZm9yZSBhbmQgZW5kIDEvMiBjZWxscyBhZnRlciB0byBlbnN1cmUgYSBzbW9vdGggY3VydmUgd2l0aCBvdGhlclxuICAgICAgICAgICAgLy8gY2VsbHNcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCAtIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLyAyLCB5TWlkKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5iZXppZXJDdXJ2ZVRvKFxuICAgICAgICAgICAgICB4Q2hMZWZ0IC0gdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAvIDIsIHlDdXJseVRvcCxcbiAgICAgICAgICAgICAgeENoTGVmdCwgeUN1cmx5VG9wLFxuICAgICAgICAgICAgICB4Q2hMZWZ0LCB5TWlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmJlemllckN1cnZlVG8oXG4gICAgICAgICAgICAgIHhDaExlZnQsIHlDdXJseUJvdCxcbiAgICAgICAgICAgICAgeENoTWlkLCB5Q3VybHlCb3QsXG4gICAgICAgICAgICAgIHhDaE1pZCwgeU1pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5iZXppZXJDdXJ2ZVRvKFxuICAgICAgICAgICAgICB4Q2hNaWQsIHlDdXJseVRvcCxcbiAgICAgICAgICAgICAgeENoUmlnaHQsIHlDdXJseVRvcCxcbiAgICAgICAgICAgICAgeENoUmlnaHQsIHlNaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHguYmV6aWVyQ3VydmVUbyhcbiAgICAgICAgICAgICAgeENoUmlnaHQsIHlDdXJseUJvdCxcbiAgICAgICAgICAgICAgeENoUmlnaHQgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoIC8gMiwgeUN1cmx5Qm90LFxuICAgICAgICAgICAgICB4Q2hSaWdodCArIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggLyAyLCB5TWlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBVbmRlcmxpbmVTdHlsZS5ET1RURUQ6XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IG5leHRPZmZzZXQgPT09IDAgPyAwIDpcbiAgICAgICAgICAgICAgKG5leHRPZmZzZXQgPj0gbGluZVdpZHRoID8gbGluZVdpZHRoICogMiAtIG5leHRPZmZzZXQgOiBsaW5lV2lkdGggLSBuZXh0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgLy8gYSBsaW5lIGFuZCBhIGdhcC5cbiAgICAgICAgICAgIGNvbnN0IGlzTGluZVN0YXJ0ID0gbmV4dE9mZnNldCA+PSBsaW5lV2lkdGggPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQgPT09IGZhbHNlIHx8IG9mZnNldFdpZHRoID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zZXRMaW5lRGFzaChbTWF0aC5yb3VuZChsaW5lV2lkdGgpLCBNYXRoLnJvdW5kKGxpbmVXaWR0aCldKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0ICsgb2Zmc2V0V2lkdGgsIHlUb3ApO1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVRvKHhDaFJpZ2h0LCB5VG9wKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zZXRMaW5lRGFzaChbTWF0aC5yb3VuZChsaW5lV2lkdGgpLCBNYXRoLnJvdW5kKGxpbmVXaWR0aCldKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4Lm1vdmVUbyh4Q2hMZWZ0LCB5VG9wKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hMZWZ0ICsgb2Zmc2V0V2lkdGgsIHlUb3ApO1xuICAgICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQgKyBvZmZzZXRXaWR0aCArIGxpbmVXaWR0aCwgeVRvcCk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5saW5lVG8oeENoUmlnaHQsIHlUb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE9mZnNldCA9IGNvbXB1dGVOZXh0VmFyaWFudE9mZnNldCh4Q2hSaWdodCAtIHhDaExlZnQsIGxpbmVXaWR0aCwgbmV4dE9mZnNldCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFVuZGVybGluZVN0eWxlLkRBU0hFRDpcbiAgICAgICAgICAgIGNvbnN0IGxpbmVSYXRpbyA9IDAuNjtcbiAgICAgICAgICAgIGNvbnN0IGdhcFJhdGlvID0gMC4zO1xuICAgICAgICAgICAgLy8gRW5kIGxpbmUgcmF0aW8gaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byAwLjFcbiAgICAgICAgICAgIGNvbnN0IHhDaFdpZHRoID0geENoUmlnaHQgLSB4Q2hMZWZ0O1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IE1hdGguZmxvb3IobGluZVJhdGlvICogeENoV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgZ2FwID0gTWF0aC5mbG9vcihnYXBSYXRpbyAqIHhDaFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHhDaFdpZHRoIC0gbGluZSAtIGdhcDtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zZXRMaW5lRGFzaChbbGluZSwgZ2FwLCBlbmRdKTtcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8oeENoTGVmdCwgeVRvcCk7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVRvKHhDaFJpZ2h0LCB5VG9wKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgVW5kZXJsaW5lU3R5bGUuU0lOR0xFOlxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubW92ZVRvKHhDaExlZnQsIHlUb3ApO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyh4Q2hSaWdodCwgeVRvcCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90bXBDdHguc3Ryb2tlKCk7XG4gICAgICAgIHRoaXMuX3RtcEN0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl90bXBDdHgucmVzdG9yZSgpO1xuXG4gICAgICAvLyBEcmF3IHN0cm9rZSBpbiB0aGUgYmFja2dyb3VuZCBjb2xvciBmb3Igbm9uIGN1c3RvbSBjaGFyYWN0ZXJzIGluIG9yZGVyIHRvIGdpdmUgYW4gb3V0bGluZVxuICAgICAgLy8gYmV0d2VlbiB0aGUgdGV4dCBhbmQgdGhlIHVuZGVybGluZS4gT25seSBkbyB0aGlzIHdoZW4gZm9udCBzaXplIGlzID49IDEyIGFzIHRoZSB1bmRlcmxpbmVcbiAgICAgIC8vIGxvb2tzIG9kZCB3aGVuIHRoZSBmb250IHNpemUgaXMgdG9vIHNtYWxsXG4gICAgICBpZiAoIWN1c3RvbUdseXBoICYmIHRoaXMuX2NvbmZpZy5mb250U2l6ZSA+PSAxMikge1xuICAgICAgICAvLyBUaGlzIG9ubHkgd29ya3Mgd2hlbiB0cmFuc3BhcmVuY3kgaXMgZGlzYWJsZWQgYmVjYXVzZSBpdCdzIG5vdCBjbGVhciBob3cgdG8gY2xlYXIgc3Ryb2tlZFxuICAgICAgICAvLyB0ZXh0XG4gICAgICAgIGlmICghdGhpcy5fY29uZmlnLmFsbG93VHJhbnNwYXJlbmN5ICYmIGNoYXJzICE9PSAnICcpIHtcbiAgICAgICAgICAvLyBNZWFzdXJlIHRoZSB0ZXh0LCBvbmx5IGRyYXcgdGhlIHN0cm9rZSBpZiB0aGVyZSBpcyBhIGRlc2NlbnQgYmV5b25kIGFuIGFscGhhYmV0aWMgdGV4dFxuICAgICAgICAgIC8vIGJhc2VsaW5lXG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LnNhdmUoKTtcbiAgICAgICAgICB0aGlzLl90bXBDdHgudGV4dEJhc2VsaW5lID0gJ2FscGhhYmV0aWMnO1xuICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLl90bXBDdHgubWVhc3VyZVRleHQoY2hhcnMpO1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgaWYgKCdhY3R1YWxCb3VuZGluZ0JveERlc2NlbnQnIGluIG1ldHJpY3MgJiYgbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveERlc2NlbnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHRyYW5zbGF0ZXMgdG8gMS8yIHRoZSBsaW5lIHdpZHRoIGluIGVpdGhlciBkaXJlY3Rpb25cbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zYXZlKCk7XG4gICAgICAgICAgICAvLyBDbGlwIHRoZSByZWdpb24gdG8gb25seSBkcmF3IGluIHZhbGlkIHBpeGVscyBuZWFyIHRoZSB1bmRlcmxpbmUgdG8gYXZvaWQgYSBzbGlnaHRcbiAgICAgICAgICAgIC8vIG91dGxpbmUgYXJvdW5kIHRoZSB3aG9sZSBnbHlwaCwgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIHBpeGVscyBpbiB0aGUgZ2x5cGggYXQgdGhlIHRvcFxuICAgICAgICAgICAgLy8gd2hpY2ggd291bGQgaW5jcmVhc2UgR1BVIG1lbW9yeSBkZW1hbmRzXG4gICAgICAgICAgICBjb25zdCBjbGlwUmVnaW9uID0gbmV3IFBhdGgyRCgpO1xuICAgICAgICAgICAgY2xpcFJlZ2lvbi5yZWN0KHhMZWZ0LCB5VG9wIC0gTWF0aC5jZWlsKGxpbmVXaWR0aCAvIDIpLCB0aGlzLl9jb25maWcuZGV2aWNlQ2VsbFdpZHRoICogY2hXaWR0aCwgeUJvdCAtIHlUb3AgKyBNYXRoLmNlaWwobGluZVdpZHRoIC8gMikpO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LmNsaXAoY2xpcFJlZ2lvbik7XG4gICAgICAgICAgICB0aGlzLl90bXBDdHgubGluZVdpZHRoID0gdGhpcy5fY29uZmlnLmRldmljZVBpeGVsUmF0aW8gKiAzO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVN0eWxlID0gYmFja2dyb3VuZENvbG9yLmNzcztcbiAgICAgICAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2VUZXh0KGNoYXJzLCBwYWRkaW5nLCBwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5fdG1wQ3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPdmVybGluZVxuICAgIGlmIChvdmVybGluZSkge1xuICAgICAgY29uc3QgbGluZVdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih0aGlzLl9jb25maWcuZm9udFNpemUgKiB0aGlzLl9jb25maWcuZGV2aWNlUGl4ZWxSYXRpbyAvIDE1KSk7XG4gICAgICBjb25zdCB5T2Zmc2V0ID0gbGluZVdpZHRoICUgMiA9PT0gMSA/IDAuNSA6IDA7XG4gICAgICB0aGlzLl90bXBDdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVN0eWxlID0gdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZTtcbiAgICAgIHRoaXMuX3RtcEN0eC5iZWdpblBhdGgoKTtcbiAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8ocGFkZGluZywgcGFkZGluZyArIHlPZmZzZXQpO1xuICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyhwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJXaWR0aCAqIGNoV2lkdGgsIHBhZGRpbmcgKyB5T2Zmc2V0KTtcbiAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2UoKTtcbiAgICB9XG5cbiAgICAvLyBEcmF3IHRoZSBjaGFyYWN0ZXJcbiAgICBpZiAoIWN1c3RvbUdseXBoKSB7XG4gICAgICB0aGlzLl90bXBDdHguZmlsbFRleHQoY2hhcnMsIHBhZGRpbmcsIHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBjaGFyYWN0ZXIgaXMgdW5kZXJzY29yZSBhbmQgYmV5b25kIHRoZSBjZWxsIGJvdW5kcywgc2hpZnQgaXQgdXAgdW50aWwgaXQgaXMgdmlzaWJsZVxuICAgIC8vIGV2ZW4gb24gdGhlIGJvdHRvbSByb3csIHRyeSBmb3IgYSBtYXhpbXVtIG9mIDUgcGl4ZWxzLlxuICAgIGlmIChjaGFycyA9PT0gJ18nICYmICF0aGlzLl9jb25maWcuYWxsb3dUcmFuc3BhcmVuY3kpIHtcbiAgICAgIGxldCBpc0JleW9uZENlbGxCb3VuZHMgPSBjbGVhckNvbG9yKHRoaXMuX3RtcEN0eC5nZXRJbWFnZURhdGEocGFkZGluZywgcGFkZGluZywgdGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCwgdGhpcy5fY29uZmlnLmRldmljZUNlbGxIZWlnaHQpLCBiYWNrZ3JvdW5kQ29sb3IsIGZvcmVncm91bmRDb2xvciwgZW5hYmxlQ2xlYXJUaHJlc2hvbGRDaGVjayk7XG4gICAgICBpZiAoaXNCZXlvbmRDZWxsQm91bmRzKSB7XG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IDE7IG9mZnNldCA8PSA1OyBvZmZzZXQrKykge1xuICAgICAgICAgIHRoaXMuX3RtcEN0eC5zYXZlKCk7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvci5jc3M7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMuX3RtcENhbnZhcy53aWR0aCwgdGhpcy5fdG1wQ2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgdGhpcy5fdG1wQ3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICB0aGlzLl90bXBDdHguZmlsbFRleHQoY2hhcnMsIHBhZGRpbmcsIHBhZGRpbmcgKyB0aGlzLl9jb25maWcuZGV2aWNlQ2hhckhlaWdodCAtIG9mZnNldCk7XG4gICAgICAgICAgaXNCZXlvbmRDZWxsQm91bmRzID0gY2xlYXJDb2xvcih0aGlzLl90bXBDdHguZ2V0SW1hZ2VEYXRhKHBhZGRpbmcsIHBhZGRpbmcsIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGgsIHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsSGVpZ2h0KSwgYmFja2dyb3VuZENvbG9yLCBmb3JlZ3JvdW5kQ29sb3IsIGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2spO1xuICAgICAgICAgIGlmICghaXNCZXlvbmRDZWxsQm91bmRzKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcmF3IHN0cm9rZXRocm91Z2hcbiAgICBpZiAoc3RyaWtldGhyb3VnaCkge1xuICAgICAgY29uc3QgbGluZVdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih0aGlzLl9jb25maWcuZm9udFNpemUgKiB0aGlzLl9jb25maWcuZGV2aWNlUGl4ZWxSYXRpbyAvIDEwKSk7XG4gICAgICBjb25zdCB5T2Zmc2V0ID0gdGhpcy5fdG1wQ3R4LmxpbmVXaWR0aCAlIDIgPT09IDEgPyAwLjUgOiAwOyAvLyBXaGVuIHRoZSB3aWR0aCBpcyBvZGQsIGRyYXcgYXQgMC41IHBvc2l0aW9uXG4gICAgICB0aGlzLl90bXBDdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgdGhpcy5fdG1wQ3R4LnN0cm9rZVN0eWxlID0gdGhpcy5fdG1wQ3R4LmZpbGxTdHlsZTtcbiAgICAgIHRoaXMuX3RtcEN0eC5iZWdpblBhdGgoKTtcbiAgICAgIHRoaXMuX3RtcEN0eC5tb3ZlVG8ocGFkZGluZywgcGFkZGluZyArIE1hdGguZmxvb3IodGhpcy5fY29uZmlnLmRldmljZUNoYXJIZWlnaHQgLyAyKSAtIHlPZmZzZXQpO1xuICAgICAgdGhpcy5fdG1wQ3R4LmxpbmVUbyhwYWRkaW5nICsgdGhpcy5fY29uZmlnLmRldmljZUNoYXJXaWR0aCAqIGNoV2lkdGgsIHBhZGRpbmcgKyBNYXRoLmZsb29yKHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0IC8gMikgLSB5T2Zmc2V0KTtcbiAgICAgIHRoaXMuX3RtcEN0eC5zdHJva2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLl90bXBDdHgucmVzdG9yZSgpO1xuXG4gICAgLy8gY2xlYXIgdGhlIGJhY2tncm91bmQgZnJvbSB0aGUgY2hhcmFjdGVyIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGRyYXdpbmcgb3ZlciB0aGUgcHJldmlvdXNcbiAgICAvLyBjaGFyYWN0ZXIgaWYgaXQgZXh0ZW5kcyBwYXN0IGl0J3MgYm91bmRzXG4gICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy5fdG1wQ3R4LmdldEltYWdlRGF0YShcbiAgICAgIDAsIDAsIHRoaXMuX3RtcENhbnZhcy53aWR0aCwgdGhpcy5fdG1wQ2FudmFzLmhlaWdodFxuICAgICk7XG5cbiAgICAvLyBDbGVhciBvdXQgdGhlIGJhY2tncm91bmQgY29sb3IgYW5kIGRldGVybWluZSBpZiB0aGUgZ2x5cGggaXMgZW1wdHkuXG4gICAgbGV0IGlzRW1wdHk6IGJvb2xlYW47XG4gICAgaWYgKCF0aGlzLl9jb25maWcuYWxsb3dUcmFuc3BhcmVuY3kpIHtcbiAgICAgIGlzRW1wdHkgPSBjbGVhckNvbG9yKGltYWdlRGF0YSwgYmFja2dyb3VuZENvbG9yLCBmb3JlZ3JvdW5kQ29sb3IsIGVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0VtcHR5ID0gY2hlY2tDb21wbGV0ZWx5VHJhbnNwYXJlbnQoaW1hZ2VEYXRhKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZW1wdHkgZ2x5cGhzXG4gICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgIHJldHVybiBOVUxMX1JBU1RFUklaRURfR0xZUEg7XG4gICAgfVxuXG4gICAgY29uc3QgcmFzdGVyaXplZEdseXBoID0gdGhpcy5fZmluZEdseXBoQm91bmRpbmdCb3goaW1hZ2VEYXRhLCB0aGlzLl93b3JrQm91bmRpbmdCb3gsIGFsbG93ZWRXaWR0aCwgcmVzdHJpY3RlZFBvd2VybGluZUdseXBoLCBjdXN0b21HbHlwaCwgcGFkZGluZyk7XG5cbiAgICAvLyBGaW5kIHRoZSBiZXN0IGF0bGFzIHJvdyB0byB1c2VcbiAgICBsZXQgYWN0aXZlUGFnZTogQXRsYXNQYWdlO1xuICAgIGxldCBhY3RpdmVSb3c6IElDaGFyQXRsYXNBY3RpdmVSb3c7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBhY3RpdmUgcGFnZXMgKHRoZSBsYXN0IHNtYWxsZXN0IDQgd2VyZSBtZXJnZWQpLCBjcmVhdGUgYSBuZXcgb25lXG4gICAgICBpZiAodGhpcy5fYWN0aXZlUGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IG5ld1BhZ2UgPSB0aGlzLl9jcmVhdGVOZXdQYWdlKCk7XG4gICAgICAgIGFjdGl2ZVBhZ2UgPSBuZXdQYWdlO1xuICAgICAgICBhY3RpdmVSb3cgPSBuZXdQYWdlLmN1cnJlbnRSb3c7XG4gICAgICAgIGFjdGl2ZVJvdy5oZWlnaHQgPSByYXN0ZXJpemVkR2x5cGguc2l6ZS55O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBiZXN0IGN1cnJlbnQgcm93IGZyb20gYWxsIGFjdGl2ZSBwYWdlc1xuICAgICAgYWN0aXZlUGFnZSA9IHRoaXMuX2FjdGl2ZVBhZ2VzW3RoaXMuX2FjdGl2ZVBhZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgYWN0aXZlUm93ID0gYWN0aXZlUGFnZS5jdXJyZW50Um93O1xuICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX2FjdGl2ZVBhZ2VzKSB7XG4gICAgICAgIGlmIChyYXN0ZXJpemVkR2x5cGguc2l6ZS55IDw9IHAuY3VycmVudFJvdy5oZWlnaHQpIHtcbiAgICAgICAgICBhY3RpdmVQYWdlID0gcDtcbiAgICAgICAgICBhY3RpdmVSb3cgPSBwLmN1cnJlbnRSb3c7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogVGhpcyBhbGdvcml0aG0gY291bGQgYmUgc2ltcGxpZmllZDpcbiAgICAgIC8vIC0gU2VhcmNoIGZvciB0aGUgcGFnZSB3aXRoIFJPV19QSVhFTF9USFJFU0hPTEQgaW4gbWluZFxuICAgICAgLy8gLSBLZWVwIHRyYWNrIG9mIGN1cnJlbnQvZml4ZWQgcm93cyBpbiBhIE1hcFxuXG4gICAgICAvLyBSZXBsYWNlIHRoZSBiZXN0IGN1cnJlbnQgcm93IHdpdGggYSBmaXhlZCByb3cgaWYgdGhlcmUgaXMgb25lIGF0IGxlYXN0IGFzIGdvb2QgYXMgdGhlXG4gICAgICAvLyBjdXJyZW50IHJvdy4gU2VhcmNoIGluIHJldmVyc2UgdG8gcHJpb3JpdGl6ZSBmaWxsaW5nIGluIG9sZGVyIHBhZ2VzLlxuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX2FjdGl2ZVBhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMuX2FjdGl2ZVBhZ2VzW2ldLmZpeGVkUm93cykge1xuICAgICAgICAgIGlmIChyb3cuaGVpZ2h0IDw9IGFjdGl2ZVJvdy5oZWlnaHQgJiYgcmFzdGVyaXplZEdseXBoLnNpemUueSA8PSByb3cuaGVpZ2h0KSB7XG4gICAgICAgICAgICBhY3RpdmVQYWdlID0gdGhpcy5fYWN0aXZlUGFnZXNbaV07XG4gICAgICAgICAgICBhY3RpdmVSb3cgPSByb3c7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYWdlIGlmIHRvbyBtdWNoIHZlcnRpY2FsIHNwYWNlIHdvdWxkIGJlIHdhc3RlZCBvciB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb21cbiAgICAgIC8vIGxlZnQgaW4gdGhlIHBhZ2UuIFRoZSBwcmV2aW91cyBhY3RpdmUgcm93IHdpbGwgYmVjb21lIGZpeGVkIGluIHRoZSBwcm9jZXNzIGFzIGl0IG5vdyBoYXMgYVxuICAgICAgLy8gZml4ZWQgaGVpZ2h0XG4gICAgICBpZiAoYWN0aXZlUm93LnkgKyByYXN0ZXJpemVkR2x5cGguc2l6ZS55ID49IGFjdGl2ZVBhZ2UuY2FudmFzLmhlaWdodCB8fCBhY3RpdmVSb3cuaGVpZ2h0ID4gcmFzdGVyaXplZEdseXBoLnNpemUueSArIENvbnN0YW50cy5ST1dfUElYRUxfVEhSRVNIT0xEKSB7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGZpeGVkIGhlaWdodCByb3csIGNyZWF0aW5nIGEgbmV3IHBhZ2UgaWYgdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gb24gdGhlXG4gICAgICAgIC8vIGN1cnJlbnQgcGFnZVxuICAgICAgICBsZXQgd2FzUGFnZUFuZFJvd0ZvdW5kID0gZmFsc2U7XG4gICAgICAgIGlmIChhY3RpdmVQYWdlLmN1cnJlbnRSb3cueSArIGFjdGl2ZVBhZ2UuY3VycmVudFJvdy5oZWlnaHQgKyByYXN0ZXJpemVkR2x5cGguc2l6ZS55ID49IGFjdGl2ZVBhZ2UuY2FudmFzLmhlaWdodCkge1xuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IHBhZ2Ugd2l0aCByb29tIHRvIGNyZWF0ZSB0aGUgbmV3IHJvdyBvblxuICAgICAgICAgIGxldCBjYW5kaWRhdGVQYWdlOiBBdGxhc1BhZ2UgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX2FjdGl2ZVBhZ2VzKSB7XG4gICAgICAgICAgICBpZiAocC5jdXJyZW50Um93LnkgKyBwLmN1cnJlbnRSb3cuaGVpZ2h0ICsgcmFzdGVyaXplZEdseXBoLnNpemUueSA8IHAuY2FudmFzLmhlaWdodCkge1xuICAgICAgICAgICAgICBjYW5kaWRhdGVQYWdlID0gcDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjYW5kaWRhdGVQYWdlKSB7XG4gICAgICAgICAgICBhY3RpdmVQYWdlID0gY2FuZGlkYXRlUGFnZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQmVmb3JlIGNyZWF0aW5nIGEgbmV3IGF0bGFzIHBhZ2UgdGhhdCB3b3VsZCB0cmlnZ2VyIGEgcGFnZSBtZXJnZSwgY2hlY2sgaWYgdGhlXG4gICAgICAgICAgICAvLyBjdXJyZW50IGFjdGl2ZSByb3cgaXMgc3VmZmljaWVudCB3aGVuIGlnbm9yaW5nIHRoZSBST1dfUElYRUxfVEhSRVNIT0xELiBUaGlzIHdpbGxcbiAgICAgICAgICAgIC8vIGltcHJvdmUgdGV4dHVyZSB1dGlsaXphdGlvbiBieSB1c2luZyB0aGUgYXZhaWxhYmxlIHNwYWNlIGJlZm9yZSB0aGUgcGFnZSBpcyBtZXJnZWRcbiAgICAgICAgICAgIC8vIGFuZCBiZWNvbWVzIHN0YXRpYy5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgVGV4dHVyZUF0bGFzLm1heEF0bGFzUGFnZXMgJiZcbiAgICAgICAgICAgICAgdGhpcy5fcGFnZXMubGVuZ3RoID49IFRleHR1cmVBdGxhcy5tYXhBdGxhc1BhZ2VzICYmXG4gICAgICAgICAgICAgIGFjdGl2ZVJvdy55ICsgcmFzdGVyaXplZEdseXBoLnNpemUueSA8PSBhY3RpdmVQYWdlLmNhbnZhcy5oZWlnaHQgJiZcbiAgICAgICAgICAgICAgYWN0aXZlUm93LmhlaWdodCA+PSByYXN0ZXJpemVkR2x5cGguc2l6ZS55ICYmXG4gICAgICAgICAgICAgIGFjdGl2ZVJvdy54ICsgcmFzdGVyaXplZEdseXBoLnNpemUueCA8PSBhY3RpdmVQYWdlLmNhbnZhcy53aWR0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIGFjdGl2ZVBhZ2UgYW5kIGFjdGl2ZVJvdyBpcyBhbHJlYWR5IHZhbGlkXG4gICAgICAgICAgICAgIHdhc1BhZ2VBbmRSb3dGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGFnZSBpZiB0aGVyZSBpcyBubyByb29tXG4gICAgICAgICAgICAgIGNvbnN0IG5ld1BhZ2UgPSB0aGlzLl9jcmVhdGVOZXdQYWdlKCk7XG4gICAgICAgICAgICAgIGFjdGl2ZVBhZ2UgPSBuZXdQYWdlO1xuICAgICAgICAgICAgICBhY3RpdmVSb3cgPSBuZXdQYWdlLmN1cnJlbnRSb3c7XG4gICAgICAgICAgICAgIGFjdGl2ZVJvdy5oZWlnaHQgPSByYXN0ZXJpemVkR2x5cGguc2l6ZS55O1xuICAgICAgICAgICAgICB3YXNQYWdlQW5kUm93Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXdhc1BhZ2VBbmRSb3dGb3VuZCkge1xuICAgICAgICAgIC8vIEZpeCB0aGUgY3VycmVudCByb3cgYXMgdGhlIG5ldyByb3cgaXMgYmVpbmcgYWRkZWQgYmVsb3dcbiAgICAgICAgICBpZiAoYWN0aXZlUGFnZS5jdXJyZW50Um93LmhlaWdodCA+IDApIHtcbiAgICAgICAgICAgIGFjdGl2ZVBhZ2UuZml4ZWRSb3dzLnB1c2goYWN0aXZlUGFnZS5jdXJyZW50Um93KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZlUm93ID0ge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IGFjdGl2ZVBhZ2UuY3VycmVudFJvdy55ICsgYWN0aXZlUGFnZS5jdXJyZW50Um93LmhlaWdodCxcbiAgICAgICAgICAgIGhlaWdodDogcmFzdGVyaXplZEdseXBoLnNpemUueVxuICAgICAgICAgIH07XG4gICAgICAgICAgYWN0aXZlUGFnZS5maXhlZFJvd3MucHVzaChhY3RpdmVSb3cpO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgY3VycmVudCByb3cgYmVsb3cgdGhlIG5ldyBmaXhlZCBoZWlnaHQgcm93XG4gICAgICAgICAgYWN0aXZlUGFnZS5jdXJyZW50Um93ID0ge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IGFjdGl2ZVJvdy55ICsgYWN0aXZlUm93LmhlaWdodCxcbiAgICAgICAgICAgIGhlaWdodDogMFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHBhZ2VzIGZyb20gX2FjdGl2ZVBhZ2VzIHdoZW4gYWxsIHJvd3MgYXJlIGZpbGxlZFxuICAgICAgfVxuXG4gICAgICAvLyBFeGl0IHRoZSBsb29wIGlmIHRoZXJlIGlzIGVub3VnaCByb29tIGluIHRoZSByb3dcbiAgICAgIGlmIChhY3RpdmVSb3cueCArIHJhc3Rlcml6ZWRHbHlwaC5zaXplLnggPD0gYWN0aXZlUGFnZS5jYW52YXMud2lkdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgY3VycmVudCByb3csIGZpbmlzaCBpdCBhbmQgdHJ5IGFnYWluXG4gICAgICBpZiAoYWN0aXZlUm93ID09PSBhY3RpdmVQYWdlLmN1cnJlbnRSb3cpIHtcbiAgICAgICAgYWN0aXZlUm93LnggPSAwO1xuICAgICAgICBhY3RpdmVSb3cueSArPSBhY3RpdmVSb3cuaGVpZ2h0O1xuICAgICAgICBhY3RpdmVSb3cuaGVpZ2h0ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2ZVBhZ2UuZml4ZWRSb3dzLnNwbGljZShhY3RpdmVQYWdlLmZpeGVkUm93cy5pbmRleE9mKGFjdGl2ZVJvdyksIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlY29yZCB0ZXh0dXJlIHBvc2l0aW9uXG4gICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQYWdlID0gdGhpcy5fcGFnZXMuaW5kZXhPZihhY3RpdmVQYWdlKTtcbiAgICByYXN0ZXJpemVkR2x5cGgudGV4dHVyZVBvc2l0aW9uLnggPSBhY3RpdmVSb3cueDtcbiAgICByYXN0ZXJpemVkR2x5cGgudGV4dHVyZVBvc2l0aW9uLnkgPSBhY3RpdmVSb3cueTtcbiAgICByYXN0ZXJpemVkR2x5cGgudGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlLnggPSBhY3RpdmVSb3cueCAvIGFjdGl2ZVBhZ2UuY2FudmFzLndpZHRoO1xuICAgIHJhc3Rlcml6ZWRHbHlwaC50ZXh0dXJlUG9zaXRpb25DbGlwU3BhY2UueSA9IGFjdGl2ZVJvdy55IC8gYWN0aXZlUGFnZS5jYW52YXMuaGVpZ2h0O1xuXG4gICAgLy8gRml4IHRoZSBjbGlwc3BhY2UgcG9zaXRpb24gYXMgcGFnZXMgbWF5IGJlIG9mIGRpZmZlcmluZyBzaXplXG4gICAgcmFzdGVyaXplZEdseXBoLnNpemVDbGlwU3BhY2UueCAvPSBhY3RpdmVQYWdlLmNhbnZhcy53aWR0aDtcbiAgICByYXN0ZXJpemVkR2x5cGguc2l6ZUNsaXBTcGFjZS55IC89IGFjdGl2ZVBhZ2UuY2FudmFzLmhlaWdodDtcblxuICAgIC8vIFVwZGF0ZSBhdGxhcyBjdXJyZW50IHJvdywgZm9yIGZpeGVkIHJvd3MgdGhlIGdseXBoIGhlaWdodCB3aWxsIG5ldmVyIGJlIGxhcmdlciB0aGFuIHRoZSByb3dcbiAgICAvLyBoZWlnaHRcbiAgICBhY3RpdmVSb3cuaGVpZ2h0ID0gTWF0aC5tYXgoYWN0aXZlUm93LmhlaWdodCwgcmFzdGVyaXplZEdseXBoLnNpemUueSk7XG4gICAgYWN0aXZlUm93LnggKz0gcmFzdGVyaXplZEdseXBoLnNpemUueDtcblxuICAgIC8vIHB1dEltYWdlRGF0YSBkb2Vzbid0IGRvIGFueSBibGVuZGluZywgc28gaXQgd2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGNhY2hlIGVudHJ5IGZvciB1c1xuICAgIGFjdGl2ZVBhZ2UuY3R4LnB1dEltYWdlRGF0YShcbiAgICAgIGltYWdlRGF0YSxcbiAgICAgIHJhc3Rlcml6ZWRHbHlwaC50ZXh0dXJlUG9zaXRpb24ueCAtIHRoaXMuX3dvcmtCb3VuZGluZ0JveC5sZWZ0LFxuICAgICAgcmFzdGVyaXplZEdseXBoLnRleHR1cmVQb3NpdGlvbi55IC0gdGhpcy5fd29ya0JvdW5kaW5nQm94LnRvcCxcbiAgICAgIHRoaXMuX3dvcmtCb3VuZGluZ0JveC5sZWZ0LFxuICAgICAgdGhpcy5fd29ya0JvdW5kaW5nQm94LnRvcCxcbiAgICAgIHJhc3Rlcml6ZWRHbHlwaC5zaXplLngsXG4gICAgICByYXN0ZXJpemVkR2x5cGguc2l6ZS55XG4gICAgKTtcbiAgICBhY3RpdmVQYWdlLmFkZEdseXBoKHJhc3Rlcml6ZWRHbHlwaCk7XG4gICAgYWN0aXZlUGFnZS52ZXJzaW9uKys7XG5cbiAgICByZXR1cm4gcmFzdGVyaXplZEdseXBoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIEltYWdlRGF0YSBvYmplY3QsIGZpbmQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgbm9uLXRyYW5zcGFyZW50XG4gICAqIHBvcnRpb24gb2YgdGhlIHRleHR1cmUgYW5kIHJldHVybiBhbiBJUmFzdGVyaXplZEdseXBoIHdpdGggdGhlc2VcbiAgICogZGltZW5zaW9ucy5cbiAgICogQHBhcmFtIGltYWdlRGF0YSBUaGUgaW1hZ2UgZGF0YSB0byByZWFkLlxuICAgKiBAcGFyYW0gYm91bmRpbmdCb3ggQW4gSUJvdW5kaW5nQm94IHRvIHB1dCB0aGUgY2xpcHBlZCBib3VuZGluZyBib3ggdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmluZEdseXBoQm91bmRpbmdCb3goaW1hZ2VEYXRhOiBJbWFnZURhdGEsIGJvdW5kaW5nQm94OiBJQm91bmRpbmdCb3gsIGFsbG93ZWRXaWR0aDogbnVtYmVyLCByZXN0cmljdGVkR2x5cGg6IGJvb2xlYW4sIGN1c3RvbUdseXBoOiBib29sZWFuLCBwYWRkaW5nOiBudW1iZXIpOiBJUmFzdGVyaXplZEdseXBoIHtcbiAgICBib3VuZGluZ0JveC50b3AgPSAwO1xuICAgIGNvbnN0IGhlaWdodCA9IHJlc3RyaWN0ZWRHbHlwaCA/IHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsSGVpZ2h0IDogdGhpcy5fdG1wQ2FudmFzLmhlaWdodDtcbiAgICBjb25zdCB3aWR0aCA9IHJlc3RyaWN0ZWRHbHlwaCA/IHRoaXMuX2NvbmZpZy5kZXZpY2VDZWxsV2lkdGggOiBhbGxvd2VkV2lkdGg7XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIGNvbnN0IGFscGhhT2Zmc2V0ID0geSAqIHRoaXMuX3RtcENhbnZhcy53aWR0aCAqIDQgKyB4ICogNCArIDM7XG4gICAgICAgIGlmIChpbWFnZURhdGEuZGF0YVthbHBoYU9mZnNldF0gIT09IDApIHtcbiAgICAgICAgICBib3VuZGluZ0JveC50b3AgPSB5O1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBib3VuZGluZ0JveC5sZWZ0ID0gMDtcbiAgICBmb3VuZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgcGFkZGluZyArIHdpZHRoOyB4KyspIHtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgY29uc3QgYWxwaGFPZmZzZXQgPSB5ICogdGhpcy5fdG1wQ2FudmFzLndpZHRoICogNCArIHggKiA0ICsgMztcbiAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhW2FscGhhT2Zmc2V0XSAhPT0gMCkge1xuICAgICAgICAgIGJvdW5kaW5nQm94LmxlZnQgPSB4O1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBib3VuZGluZ0JveC5yaWdodCA9IHdpZHRoO1xuICAgIGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChsZXQgeCA9IHBhZGRpbmcgKyB3aWR0aCAtIDE7IHggPj0gcGFkZGluZzsgeC0tKSB7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgIGNvbnN0IGFscGhhT2Zmc2V0ID0geSAqIHRoaXMuX3RtcENhbnZhcy53aWR0aCAqIDQgKyB4ICogNCArIDM7XG4gICAgICAgIGlmIChpbWFnZURhdGEuZGF0YVthbHBoYU9mZnNldF0gIT09IDApIHtcbiAgICAgICAgICBib3VuZGluZ0JveC5yaWdodCA9IHg7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGJvdW5kaW5nQm94LmJvdHRvbSA9IGhlaWdodDtcbiAgICBmb3VuZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHkgPSBoZWlnaHQgLSAxOyB5ID49IDA7IHktLSkge1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIGNvbnN0IGFscGhhT2Zmc2V0ID0geSAqIHRoaXMuX3RtcENhbnZhcy53aWR0aCAqIDQgKyB4ICogNCArIDM7XG4gICAgICAgIGlmIChpbWFnZURhdGEuZGF0YVthbHBoYU9mZnNldF0gIT09IDApIHtcbiAgICAgICAgICBib3VuZGluZ0JveC5ib3R0b20gPSB5O1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdGV4dHVyZVBhZ2U6IDAsXG4gICAgICB0ZXh0dXJlUG9zaXRpb246IHsgeDogMCwgeTogMCB9LFxuICAgICAgdGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgeDogYm91bmRpbmdCb3gucmlnaHQgLSBib3VuZGluZ0JveC5sZWZ0ICsgMSxcbiAgICAgICAgeTogYm91bmRpbmdCb3guYm90dG9tIC0gYm91bmRpbmdCb3gudG9wICsgMVxuICAgICAgfSxcbiAgICAgIHNpemVDbGlwU3BhY2U6IHtcbiAgICAgICAgeDogKGJvdW5kaW5nQm94LnJpZ2h0IC0gYm91bmRpbmdCb3gubGVmdCArIDEpLFxuICAgICAgICB5OiAoYm91bmRpbmdCb3guYm90dG9tIC0gYm91bmRpbmdCb3gudG9wICsgMSlcbiAgICAgIH0sXG4gICAgICBvZmZzZXQ6IHtcbiAgICAgICAgeDogLWJvdW5kaW5nQm94LmxlZnQgKyBwYWRkaW5nICsgKChyZXN0cmljdGVkR2x5cGggfHwgY3VzdG9tR2x5cGgpID8gTWF0aC5mbG9vcigodGhpcy5fY29uZmlnLmRldmljZUNlbGxXaWR0aCAtIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFyV2lkdGgpIC8gMikgOiAwKSxcbiAgICAgICAgeTogLWJvdW5kaW5nQm94LnRvcCArIHBhZGRpbmcgKyAoKHJlc3RyaWN0ZWRHbHlwaCB8fCBjdXN0b21HbHlwaCkgPyB0aGlzLl9jb25maWcubGluZUhlaWdodCA9PT0gMSA/IDAgOiBNYXRoLnJvdW5kKCh0aGlzLl9jb25maWcuZGV2aWNlQ2VsbEhlaWdodCAtIHRoaXMuX2NvbmZpZy5kZXZpY2VDaGFySGVpZ2h0KSAvIDIpIDogMClcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmNsYXNzIEF0bGFzUGFnZSB7XG4gIHB1YmxpYyByZWFkb25seSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICBwdWJsaWMgcmVhZG9ubHkgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgcHJpdmF0ZSBfdXNlZFBpeGVsczogbnVtYmVyID0gMDtcbiAgcHVibGljIGdldCBwZXJjZW50YWdlVXNlZCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fdXNlZFBpeGVscyAvICh0aGlzLmNhbnZhcy53aWR0aCAqIHRoaXMuY2FudmFzLmhlaWdodCk7IH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9nbHlwaHM6IElSYXN0ZXJpemVkR2x5cGhbXSA9IFtdO1xuICBwdWJsaWMgZ2V0IGdseXBocygpOiBSZWFkb25seUFycmF5PElSYXN0ZXJpemVkR2x5cGg+IHsgcmV0dXJuIHRoaXMuX2dseXBoczsgfVxuICBwdWJsaWMgYWRkR2x5cGgoZ2x5cGg6IElSYXN0ZXJpemVkR2x5cGgpOiB2b2lkIHtcbiAgICB0aGlzLl9nbHlwaHMucHVzaChnbHlwaCk7XG4gICAgdGhpcy5fdXNlZFBpeGVscyArPSBnbHlwaC5zaXplLnggKiBnbHlwaC5zaXplLnk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBjYW52YXMgb2YgdGhlIGF0bGFzIHBhZ2UgaGFzIGNoYW5nZWQuXG4gICAqL1xuICBwdWJsaWMgdmVyc2lvbiA9IDA7XG5cbiAgLy8gVGV4dHVyZSBhdGxhcyBjdXJyZW50IHBvc2l0aW9uaW5nIGRhdGEuIFRoZSB0ZXh0dXJlIHBhY2tpbmcgc3RyYXRlZ3kgdXNlZCBpcyB0byBmaWxsIGZyb21cbiAgLy8gbGVmdC10by1yaWdodCBhbmQgdG9wLXRvLWJvdHRvbS4gV2hlbiB0aGUgZ2x5cGggYmVpbmcgd3JpdHRlbiBpcyBsZXNzIHRoYW4gaGFsZiBvZiB0aGUgY3VycmVudFxuICAvLyByb3cncyBoZWlnaHQsIHRoZSBmb2xsb3dpbmcgaGFwcGVuczpcbiAgLy9cbiAgLy8gLSBUaGUgY3VycmVudCByb3cgYmVjb21lcyB0aGUgZml4ZWQgaGVpZ2h0IHJvdyBBXG4gIC8vIC0gQSBuZXcgZml4ZWQgaGVpZ2h0IHJvdyBCIHRoZSBleGFjdCBzaXplIG9mIHRoZSBnbHlwaCBpcyBjcmVhdGVkIGJlbG93IHRoZSBjdXJyZW50IHJvd1xuICAvLyAtIEEgbmV3IGR5bmFtaWMgaGVpZ2h0IGN1cnJlbnQgcm93IGlzIGNyZWF0ZWQgYmVsb3cgQlxuICAvL1xuICAvLyBUaGlzIHN0cmF0ZWd5IGRvZXMgYSBnb29kIGpvYiBwcmV2ZW50aW5nIHNwYWNlIGJlaW5nIHdhc3RlZCBmb3IgdmVyeSBzaG9ydCBnbHlwaHMgc3VjaCBhc1xuICAvLyB1bmRlcnNjb3JlcywgaHlwaGVucyBldGMuIG9yIHRob3NlIHdpdGggdW5kZXJsaW5lcyByZW5kZXJlZC5cbiAgcHVibGljIGN1cnJlbnRSb3c6IElDaGFyQXRsYXNBY3RpdmVSb3cgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xuICBwdWJsaWMgcmVhZG9ubHkgZml4ZWRSb3dzOiBJQ2hhckF0bGFzQWN0aXZlUm93W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIHNvdXJjZVBhZ2VzPzogQXRsYXNQYWdlW11cbiAgKSB7XG4gICAgaWYgKHNvdXJjZVBhZ2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHAgb2Ygc291cmNlUGFnZXMpIHtcbiAgICAgICAgdGhpcy5fZ2x5cGhzLnB1c2goLi4ucC5nbHlwaHMpO1xuICAgICAgICB0aGlzLl91c2VkUGl4ZWxzICs9IHAuX3VzZWRQaXhlbHM7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2FudmFzID0gY3JlYXRlQ2FudmFzKGRvY3VtZW50LCBzaXplLCBzaXplKTtcbiAgICAvLyBUaGUgY2FudmFzIG5lZWRzIGFscGhhIGJlY2F1c2Ugd2UgdXNlIGNsZWFyQ29sb3IgdG8gY29udmVydCB0aGUgYmFja2dyb3VuZCBjb2xvciB0byBhbHBoYS5cbiAgICAvLyBJdCBtaWdodCBhbHNvIGNvbnRhaW4gc29tZSBjaGFyYWN0ZXJzIHdpdGggdHJhbnNwYXJlbnQgYmFja2dyb3VuZHMgaWYgYWxsb3dUcmFuc3BhcmVuY3kgaXNcbiAgICAvLyBzZXQuXG4gICAgdGhpcy5jdHggPSB0aHJvd0lmRmFsc3kodGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IGFscGhhOiB0cnVlIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5jdXJyZW50Um93LnggPSAwO1xuICAgIHRoaXMuY3VycmVudFJvdy55ID0gMDtcbiAgICB0aGlzLmN1cnJlbnRSb3cuaGVpZ2h0ID0gMDtcbiAgICB0aGlzLmZpeGVkUm93cy5sZW5ndGggPSAwO1xuICAgIHRoaXMudmVyc2lvbisrO1xuICB9XG59XG5cbi8qKlxuICogTWFrZXMgYSBwYXJ0aWN1bGFyIHJnYiBjb2xvciBhbmQgY29sb3JzIHRoYXQgYXJlIG5lYXJseSB0aGUgc2FtZSBpbiBhbiBJbWFnZURhdGEgY29tcGxldGVseVxuICogdHJhbnNwYXJlbnQuXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSByZXN1bHQgaXMgXCJlbXB0eVwiLCBtZWFuaW5nIGFsbCBwaXhlbHMgYXJlIGZ1bGx5IHRyYW5zcGFyZW50LlxuICovXG5mdW5jdGlvbiBjbGVhckNvbG9yKGltYWdlRGF0YTogSW1hZ2VEYXRhLCBiZzogSUNvbG9yLCBmZzogSUNvbG9yLCBlbmFibGVUaHJlc2hvbGRDaGVjazogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAvLyBHZXQgY29sb3IgY2hhbm5lbHNcbiAgY29uc3QgciA9IGJnLnJnYmEgPj4+IDI0O1xuICBjb25zdCBnID0gYmcucmdiYSA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiID0gYmcucmdiYSA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IGZnUiA9IGZnLnJnYmEgPj4+IDI0O1xuICBjb25zdCBmZ0cgPSBmZy5yZ2JhID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGZnQiA9IGZnLnJnYmEgPj4+IDggJiAweEZGO1xuXG4gIC8vIENhbGN1bGF0ZSBhIHRocmVzaG9sZCB0aGF0IHdoZW4gYmVsb3cgYSBjb2xvciB3aWxsIGJlIHRyZWF0ZWQgYXMgdHJhbnNwYXJ0IHdoZW4gdGhlIHN1bSBvZlxuICAvLyBjaGFubmVsIHZhbHVlIGRpZmZlcnMuIFRoaXMgaGVscHMgaW1wcm92ZSByZW5kZXJpbmcgd2hlbiBnbHlwaHMgb3ZlcmxhcCB3aXRoIG90aGVycy4gVGhpc1xuICAvLyB0aHJlc2hvbGQgaXMgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kIHRvXG4gIC8vIGVuc3VyZSBpbXBvcnRhbnQgZGV0YWlscyBvZiB0aGUgZ2x5cGggYXJlIGFsd2F5cyBzaG93biwgZXZlbiB3aGVuIHRoZSBjb250cmFzdCByYXRpbyBpcyBsb3cuXG4gIC8vIFRoZSBudW1iZXIgMTIgaXMgbGFyZ2VseSBhcmJpdHJhcnkgdG8gZW5zdXJlIHRoZSBwaXhlbHMgdGhhdCBlc2NhcGUgdGhlIGNlbGwgaW4gdGhlIHRlc3QgY2FzZVxuICAvLyB3ZXJlIGNvdmVyZWQgKGZnPSM4YWUyMzQsIGJnPSNjNGEwMDApLlxuICBjb25zdCB0aHJlc2hvbGQgPSBNYXRoLmZsb29yKChNYXRoLmFicyhyIC0gZmdSKSArIE1hdGguYWJzKGcgLSBmZ0cpICsgTWF0aC5hYnMoYiAtIGZnQikpIC8gMTIpO1xuXG4gIC8vIFNldCBhbHBoYSBjaGFubmVsIG9mIHJlbGV2ZW50IHBpeGVscyB0byAwXG4gIGxldCBpc0VtcHR5ID0gdHJ1ZTtcbiAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgaW1hZ2VEYXRhLmRhdGEubGVuZ3RoOyBvZmZzZXQgKz0gNCkge1xuICAgIC8vIENoZWNrIGV4YWN0IG1hdGNoXG4gICAgaWYgKGltYWdlRGF0YS5kYXRhW29mZnNldF0gPT09IHIgJiZcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgMV0gPT09IGcgJiZcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgMl0gPT09IGIpIHtcbiAgICAgIGltYWdlRGF0YS5kYXRhW29mZnNldCArIDNdID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2hlY2sgdGhlIHRocmVzaG9sZCBiYXNlZCBkaWZmZXJlbmNlXG4gICAgICBpZiAoZW5hYmxlVGhyZXNob2xkQ2hlY2sgJiZcbiAgICAgICAgICAoTWF0aC5hYnMoaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0XSAtIHIpICtcbiAgICAgICAgICBNYXRoLmFicyhpbWFnZURhdGEuZGF0YVtvZmZzZXQgKyAxXSAtIGcpICtcbiAgICAgICAgICBNYXRoLmFicyhpbWFnZURhdGEuZGF0YVtvZmZzZXQgKyAyXSAtIGIpKSA8IHRocmVzaG9sZCkge1xuICAgICAgICBpbWFnZURhdGEuZGF0YVtvZmZzZXQgKyAzXSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0VtcHR5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzRW1wdHk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ29tcGxldGVseVRyYW5zcGFyZW50KGltYWdlRGF0YTogSW1hZ2VEYXRhKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGltYWdlRGF0YS5kYXRhLmxlbmd0aDsgb2Zmc2V0ICs9IDQpIHtcbiAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbb2Zmc2V0ICsgM10gPiAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDYW52YXMoZG9jdW1lbnQ6IERvY3VtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IEhUTUxDYW52YXNFbGVtZW50IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICByZXR1cm4gY2FudmFzO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yLCBJQ29sb3JSR0IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5sZXQgJHIgPSAwO1xubGV0ICRnID0gMDtcbmxldCAkYiA9IDA7XG5sZXQgJGEgPSAwO1xuXG5leHBvcnQgY29uc3QgTlVMTF9DT0xPUjogSUNvbG9yID0ge1xuICBjc3M6ICcjMDAwMDAwMDAnLFxuICByZ2JhOiAwXG59O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY2hhbm5lbHNcIiAoaW5kaXZpZHVhbCBjb2xvciBjaGFubmVscyBhcyBudW1iZXJzKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjaGFubmVscyB7XG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NzcyhyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX0ke3RvUGFkZGVkSGV4KGEpfWA7XG4gICAgfVxuICAgIHJldHVybiBgIyR7dG9QYWRkZWRIZXgocil9JHt0b1BhZGRlZEhleChnKX0ke3RvUGFkZGVkSGV4KGIpfWA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9SZ2JhKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciA9IDB4RkYpOiBudW1iZXIge1xuICAgIC8vIE5vdGU6IFRoZSBhZ2dyZWdhdGVkIG51bWJlciBpcyBSR0JBMzIgKEJFKSwgdGh1cyBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gQUJHUjMyXG4gICAgLy8gb24gTEUgc3lzdGVtcywgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGZvciBkaXJlY3QgMzItYml0IGJ1ZmZlciB3cml0ZXMuXG4gICAgLy8gPj4+IDAgZm9yY2VzIGFuIHVuc2lnbmVkIGludFxuICAgIHJldHVybiAociA8PCAyNCB8IGcgPDwgMTYgfCBiIDw8IDggfCBhKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE/OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKHIsIGcsIGIsIGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKHIsIGcsIGIsIGEpXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIGBJQ29sb3JgLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNvbG9yIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGJsZW5kKGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgICRhID0gKGZnLnJnYmEgJiAweEZGKSAvIDI1NTtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogZmcuY3NzLFxuICAgICAgICByZ2JhOiBmZy5yZ2JhXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmZ1IgPSAoZmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgIGNvbnN0IGJnUiA9IChiZy5yZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnLnJnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcucmdiYSA+PiA4KSAmIDB4RkY7XG4gICAgJHIgPSBiZ1IgKyBNYXRoLnJvdW5kKChmZ1IgLSBiZ1IpICogJGEpO1xuICAgICRnID0gYmdHICsgTWF0aC5yb3VuZCgoZmdHIC0gYmdHKSAqICRhKTtcbiAgICAkYiA9IGJnQiArIE1hdGgucm91bmQoKGZnQiAtIGJnQikgKiAkYSk7XG4gICAgY29uc3QgY3NzID0gY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYik7XG4gICAgY29uc3QgcmdiYSA9IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiKTtcbiAgICByZXR1cm4geyBjc3MsIHJnYmEgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc09wYXF1ZShjb2xvcjogSUNvbG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChjb2xvci5yZ2JhICYgMHhGRikgPT09IDB4RkY7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZzogSUNvbG9yLCBmZzogSUNvbG9yLCByYXRpbzogbnVtYmVyKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXN1bHQgPSByZ2JhLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmcucmdiYSwgZmcucmdiYSwgcmF0aW8pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcihcbiAgICAgIChyZXN1bHQgPj4gMjQgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gMTYgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gOCAgJiAweEZGKVxuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gb3BhcXVlKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgIGNvbnN0IHJnYmFDb2xvciA9IChjb2xvci5yZ2JhIHwgMHhGRikgPj4+IDA7XG4gICAgWyRyLCAkZywgJGJdID0gcmdiYS50b0NoYW5uZWxzKHJnYmFDb2xvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiksXG4gICAgICByZ2JhOiByZ2JhQ29sb3JcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYWNpdHkoY29sb3I6IElDb2xvciwgb3BhY2l0eTogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IE1hdGgucm91bmQob3BhY2l0eSAqIDB4RkYpO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhjb2xvci5yZ2JhKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcygkciwgJGcsICRiLCAkYSksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseU9wYWNpdHkoY29sb3I6IElDb2xvciwgZmFjdG9yOiBudW1iZXIpOiBJQ29sb3Ige1xuICAgICRhID0gY29sb3IucmdiYSAmIDB4RkY7XG4gICAgcmV0dXJuIG9wYWNpdHkoY29sb3IsICgkYSAqIGZhY3RvcikgLyAweEZGKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yUkdCKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3JSR0Ige1xuICAgIHJldHVybiBbKGNvbG9yLnJnYmEgPj4gMjQpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gMTYpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gOCkgJiAweEZGXTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY3NzXCIgKHN0cmluZzogJyNyZ2InLCAnI3JnYmEnLCAnI3JyZ2diYicsXG4gKiAnI3JyZ2diYmFhJykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY3NzIHtcbiAgLy8gQXR0ZW1wdCB0byBzZXQgZ2V0IHRoZSBzaGFyZWQgY2FudmFzIGNvbnRleHRcbiAgbGV0ICRjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IHVuZGVmaW5lZDtcbiAgbGV0ICRsaXRtdXNDb2xvcjogQ2FudmFzR3JhZGllbnQgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiB0aGUgZmlyc3Qgd2luZG93LCBzbyBkb2N1bWVudCBzaG91bGQgYmUgY29ycmVjdFxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgJGN0eCA9IGN0eDtcbiAgICAgICRjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2NvcHknO1xuICAgICAgJGxpdG11c0NvbG9yID0gJGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAxLCAxKTtcbiAgICB9XG4gIH1cbiAgY2F0Y2gge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGNzcyBzdHJpbmcgdG8gYW4gSUNvbG9yLCB0aGlzIHNob3VsZCBoYW5kbGUgYWxsIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCB3aWxsXG4gICAqIHRocm93IGlmIGl0J3MgaW52YWxpZC4gVGhlIGlkZWFsIGZvcm1hdCB0byB1c2UgaXMgYCNycmdnYmJbYWFdYCBhcyBpdCdzIHRoZSBmYXN0ZXN0IHRvIHBhcnNlLlxuICAgKlxuICAgKiBPbmx5IGAjcmdiW2FdYCwgYCNycmdnYmJbYWFdYCwgYHJnYigpYCBhbmQgYHJnYmEoKWAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIHdoZW4gcnVuIGluIGEgTm9kZVxuICAgKiBlbnZpcm9ubWVudC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKGNzczogc3RyaW5nKTogSUNvbG9yIHtcbiAgICAvLyBGb3JtYXRzOiAjcmdiW2FdIGFuZCAjcnJnZ2JiW2FhXVxuICAgIGlmIChjc3MubWF0Y2goLyNbXFxkYS1mXXszLDh9L2kpKSB7XG4gICAgICBzd2l0Y2ggKGNzcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA0OiB7IC8vICNyZ2JcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDU6IHsgLy8gI3JnYmFcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYSA9IHBhcnNlSW50KGNzcy5zbGljZSg0LCA1KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiLCAkYSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA3OiAvLyAjcnJnZ2JiXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNzcyxcbiAgICAgICAgICAgIHJnYmE6IChwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA8PCA4IHwgMHhGRikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIDk6IC8vICNycmdnYmJhYVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiBwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA+Pj4gMFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0czogcmdiKCkgb3IgcmdiYSgpXG4gICAgY29uc3QgcmdiYU1hdGNoID0gY3NzLm1hdGNoKC9yZ2JhP1xcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqKCxcXHMqKDB8MXxcXGQ/XFwuKFxcZCspKVxccyopP1xcKS8pO1xuICAgIGlmIChyZ2JhTWF0Y2gpIHtcbiAgICAgICRyID0gcGFyc2VJbnQocmdiYU1hdGNoWzFdKTtcbiAgICAgICRnID0gcGFyc2VJbnQocmdiYU1hdGNoWzJdKTtcbiAgICAgICRiID0gcGFyc2VJbnQocmdiYU1hdGNoWzNdKTtcbiAgICAgICRhID0gTWF0aC5yb3VuZCgocmdiYU1hdGNoWzVdID09PSB1bmRlZmluZWQgPyAxIDogcGFyc2VGbG9hdChyZ2JhTWF0Y2hbNV0pKSAqIDB4RkYpO1xuICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZSBmb3IgY2FudmFzLWJhc2VkIGNvbG9yIHBhcnNpbmdcbiAgICBpZiAoISRjdHggfHwgISRsaXRtdXNDb2xvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb2xvciB1c2luZyBjYW52YXMgZmlsbFN0eWxlXG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI2ZpbGwtYW5kLXN0cm9rZS1zdHlsZXNcbiAgICAkY3R4LmZpbGxTdHlsZSA9ICRsaXRtdXNDb2xvcjtcbiAgICAkY3R4LmZpbGxTdHlsZSA9IGNzcztcbiAgICBpZiAodHlwZW9mICRjdHguZmlsbFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgICRjdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgWyRyLCAkZywgJGIsICRhXSA9ICRjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgaXMgbm9uLXRyYW5zcGFyZW50IGFzIGNvbG9yIGh1ZSBnZXRzIGxvc3Qgd2hlbiBkcmF3biB0byB0aGUgY2FudmFzXG4gICAgaWYgKCRhICE9PSAweEZGKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgY29sb3IgZnJvbSB0aGUgY2FudmFzJyBmaWxsU3R5bGUgcHJvcGVydHkgd2hpY2ggZXhwb3NlcyB0aGUgY29sb3IgdmFsdWUgaW4gcmdiYSgpXG4gICAgLy8gZm9ybWF0XG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI3NlcmlhbGlzYXRpb24tb2YtYS1jb2xvclxuICAgIHJldHVybiB7XG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgY3NzXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiXCIgKG51bWJlcjogMHhycmdnYmIpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYW4gUkdCIGNvbG9yLCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXRlcm1pbmluZyB0aGUgY29udHJhc3QgcmF0aW9cbiAgICogYmV0d2VlbiB0d28gY29sb3JzLlxuICAgKiBAcGFyYW0gcmdiIFRoZSBjb2xvciB0byB1c2UuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZShyZ2I6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlbGF0aXZlTHVtaW5hbmNlMihcbiAgICAgIChyZ2IgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZ2IgPj4gOCApICYgMHhGRixcbiAgICAgIChyZ2IgICAgICApICYgMHhGRik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHIgVGhlIHJlZCBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAcGFyYW0gZyBUaGUgZ3JlZW4gY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGIgVGhlIGJsdWUgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlMihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBycyA9IHIgLyAyNTU7XG4gICAgY29uc3QgZ3MgPSBnIC8gMjU1O1xuICAgIGNvbnN0IGJzID0gYiAvIDI1NTtcbiAgICBjb25zdCByciA9IHJzIDw9IDAuMDM5MjggPyBycyAvIDEyLjkyIDogTWF0aC5wb3coKHJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgY29uc3QgcmcgPSBncyA8PSAwLjAzOTI4ID8gZ3MgLyAxMi45MiA6IE1hdGgucG93KChncyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJiID0gYnMgPD0gMC4wMzkyOCA/IGJzIC8gMTIuOTIgOiBNYXRoLnBvdygoYnMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gcnIgKiAwLjIxMjYgKyByZyAqIDAuNzE1MiArIHJiICogMC4wNzIyO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJyZ2JhXCIgKG51bWJlcjogMHhycmdnYmJhYSkuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgcmdiYSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAkYSA9IChmZyAmIDB4RkYpIC8gMHhGRjtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiBmZztcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIHJldHVybiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBmb3JlZ3JvdW5kIGNvbG9yIGFuZCBhIGJhY2tncm91bmQgY29sb3IsIGVpdGhlciBpbmNyZWFzZSBvciByZWR1Y2UgdGhlIGx1bWluYW5jZSBvZiB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciB1bnRpbCB0aGUgc3BlY2lmaWVkIGNvbnRyYXN0IHJhdGlvIGlzIG1ldC4gSWYgcHVyZSB3aGl0ZSBvciBibGFjayBpcyBoaXRcbiAgICogd2l0aG91dCB0aGUgY29udHJhc3QgcmF0aW8gYmVpbmcgbWV0LCBnbyB0aGUgb3RoZXIgZGlyZWN0aW9uIHVzaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIHRoZVxuICAgKiBmb3JlZ3JvdW5kIGNvbG9yIGFuZCB0YWtlIGVpdGhlciB0aGUgZmlyc3Qgb3Igc2Vjb25kIHJlc3VsdCBkZXBlbmRpbmcgb24gd2hpY2ggaGFzIHRoZSBoaWdoZXJcbiAgICogY29udHJhc3QgcmF0aW8uXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGFscmVhZHkgbWV0LlxuICAgKlxuICAgKiBAcGFyYW0gYmdSZ2JhIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gZmdSZ2JhIFRoZSBmb3JlZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gcmF0aW8gVGhlIGNvbnRyYXN0IHJhdGlvIHRvIGFjaGlldmUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGJnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShiZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgZmdMID0gcmdiLnJlbGF0aXZlTHVtaW5hbmNlKGZnUmdiYSA+PiA4KTtcbiAgICBjb25zdCBjciA9IGNvbnRyYXN0UmF0aW8oYmdMLCBmZ0wpO1xuICAgIGlmIChjciA8IHJhdGlvKSB7XG4gICAgICBpZiAoZmdMIDwgYmdMKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEEgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QVJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRBID4+IDgpKTtcbiAgICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QiA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRBID0gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICBpZiAocmVzdWx0QVJhdGlvIDwgcmF0aW8pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0QiA9IHJlZHVjZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICBjb25zdCByZXN1bHRCUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEIgPj4gOCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0QTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGlzIGlzIGEgbmFpdmUgYnV0IGZhc3QgYXBwcm9hY2ggdG8gcmVkdWNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSID4gMCB8fCBmZ0cgPiAwIHx8IGZnQiA+IDApKSB7XG4gICAgICAvLyBSZWR1Y2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdSICogMC4xKSk7XG4gICAgICBmZ0cgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnRyAqIDAuMSkpO1xuICAgICAgZmdCIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0IgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIGluY3JlYXNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSIDwgMHhGRiB8fCBmZ0cgPCAweEZGIHx8IGZnQiA8IDB4RkYpKSB7XG4gICAgICAvLyBJbmNyZWFzZSBieSAxMCUgdW50aWwgdGhlIHJhdGlvIGlzIGhpdFxuICAgICAgZmdSID0gTWF0aC5taW4oMHhGRiwgZmdSICsgTWF0aC5jZWlsKCgyNTUgLSBmZ1IpICogMC4xKSk7XG4gICAgICBmZ0cgPSBNYXRoLm1pbigweEZGLCBmZ0cgKyBNYXRoLmNlaWwoKDI1NSAtIGZnRykgKiAwLjEpKTtcbiAgICAgIGZnQiA9IE1hdGgubWluKDB4RkYsIGZnQiArIE1hdGguY2VpbCgoMjU1IC0gZmdCKSAqIDAuMSkpO1xuICAgICAgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIH1cbiAgICByZXR1cm4gKGZnUiA8PCAyNCB8IGZnRyA8PCAxNiB8IGZnQiA8PCA4IHwgMHhGRikgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9DaGFubmVscyh2YWx1ZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbKHZhbHVlID4+IDI0KSAmIDB4RkYsICh2YWx1ZSA+PiAxNikgJiAweEZGLCAodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkZdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhZGRlZEhleChjOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzID0gYy50b1N0cmluZygxNik7XG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAnMCcgKyBzIDogcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb250cmFzdCByYXRpbyBiZXR3ZWVuIHR3byByZWxhdGl2ZSBsdW1pbmFuY2UgdmFsdWVzLlxuICogQHBhcmFtIGwxIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAcGFyYW0gbDIgVGhlIGZpcnN0IHJlbGF0aXZlIGx1bWluYW5jZS5cbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0UmF0aW8obDE6IG51bWJlciwgbDI6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChsMSA8IGwyKSB7XG4gICAgcmV0dXJuIChsMiArIDAuMDUpIC8gKGwxICsgMC4wNSk7XG4gIH1cbiAgcmV0dXJuIChsMSArIDAuMDUpIC8gKGwyICsgMC4wNSk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmludGVyZmFjZSBJTGlzdGVuZXI8VCwgVSA9IHZvaWQ+IHtcbiAgKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudDxULCBVID0gdm9pZD4ge1xuICAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXZlbnRFbWl0dGVyPFQsIFUgPSB2b2lkPiB7XG4gIGV2ZW50OiBJRXZlbnQ8VCwgVT47XG4gIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQ7XG4gIGRpc3Bvc2UoKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlcjxULCBVID0gdm9pZD4gaW1wbGVtZW50cyBJRXZlbnRFbWl0dGVyPFQsIFU+IHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICBwcml2YXRlIF9ldmVudD86IElFdmVudDxULCBVPjtcbiAgcHJpdmF0ZSBfZGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgZ2V0IGV2ZW50KCk6IElFdmVudDxULCBVPiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudCkge1xuICAgICAgdGhpcy5fZXZlbnQgPSAobGlzdGVuZXI6IChhcmcxOiBULCBhcmcyOiBVKSA9PiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlID0ge1xuICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW2ldID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBkaXNwb3NhYmxlO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50O1xuICB9XG5cbiAgcHVibGljIGZpcmUoYXJnMTogVCwgYXJnMjogVSk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXVlOiBJTGlzdGVuZXI8VCwgVT5bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZS5wdXNoKHRoaXMuX2xpc3RlbmVyc1tpXSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlW2ldLmNhbGwodW5kZWZpbmVkLCBhcmcxLCBhcmcyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZEV2ZW50PFQ+KGZyb206IElFdmVudDxUPiwgdG86IElFdmVudEVtaXR0ZXI8VD4pOiBJRGlzcG9zYWJsZSB7XG4gIHJldHVybiBmcm9tKGUgPT4gdG8uZmlyZShlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5BbmRTdWJzY3JpYmU8VD4oZXZlbnQ6IElFdmVudDxUPiwgaGFuZGxlcjogKGU6IFQgfCB1bmRlZmluZWQpID0+IGFueSk6IElEaXNwb3NhYmxlIHtcbiAgaGFuZGxlcih1bmRlZmluZWQpO1xuICByZXR1cm4gZXZlbnQoZSA9PiBoYW5kbGVyKGUpKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQgdG8gcHJvdmlkZSBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBtYW5hZ2luZyB0aGUgbGlmZWN5Y2xlIG9mIGFuXG4gKiBvYmplY3QgYW5kIGl0cyBjb21wb25lbnRzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJvdGVjdGVkIF9kaXNwb3NhYmxlczogSURpc3Bvc2FibGVbXSA9IFtdO1xuICBwcm90ZWN0ZWQgX2lzRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIG9iamVjdCwgdHJpZ2dlcmluZyB0aGUgYGRpc3Bvc2VgIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJRGlzcG9zYWJsZXMuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGQgb2YgdGhpcy5fZGlzcG9zYWJsZXMpIHtcbiAgICAgIGQuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGRpc3Bvc2FibGUgb2JqZWN0LlxuICAgKiBAcGFyYW0gZCBUaGUgZGlzcG9zYWJsZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIGRpc3Bvc2FibGUuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXI8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkOiBUKTogVCB7XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChkKTtcbiAgICByZXR1cm4gZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGRpc3Bvc2FibGUgb2JqZWN0IGlmIGl0IGhhcyBiZWVuIHJlZ2lzdGVyZWQsIGlmIG5vdCBkb1xuICAgKiBub3RoaW5nLlxuICAgKiBAcGFyYW0gZCBUaGUgZGlzcG9zYWJsZSB0byB1bnJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXI8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkOiBUKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9kaXNwb3NhYmxlcy5pbmRleE9mKGQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhYmxlRGlzcG9zYWJsZTxUIGV4dGVuZHMgSURpc3Bvc2FibGU+IGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuICBwcml2YXRlIF92YWx1ZT86IFQ7XG4gIHByaXZhdGUgX2lzRGlzcG9zZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNEaXNwb3NlZCA/IHVuZGVmaW5lZCA6IHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlLCBkaXNwb3Npbmcgb2YgdGhlIG9sZCB2YWx1ZSBpZiBpdCBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuX2lzRGlzcG9zZWQgfHwgdmFsdWUgPT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHN0b3JlZCB2YWx1ZSBhbmQgZGlzcG9zZXMgb2YgdGhlIHByZXZpb3VzbHkgc3RvcmVkIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogV3JhcCBhIGZ1bmN0aW9uIGluIGEgZGlzcG9zYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRGlzcG9zYWJsZShmOiAoKSA9PiB2b2lkKTogSURpc3Bvc2FibGUge1xuICByZXR1cm4geyBkaXNwb3NlOiBmIH07XG59XG5cbi8qKlxuICogRGlzcG9zZSBvZiBhbGwgZGlzcG9zYWJsZXMgaW4gYW4gYXJyYXkgYW5kIHNldCBpdHMgbGVuZ3RoIHRvIDAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlQXJyYXkoZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBkIG9mIGRpc3Bvc2FibGVzKSB7XG4gICAgZC5kaXNwb3NlKCk7XG4gIH1cbiAgZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzcG9zYWJsZSB0aGF0IHdpbGwgZGlzcG9zZSBvZiBhbiBhcnJheSBvZiBkaXNwb3NhYmxlcyB3aGVuIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZShhcnJheTogSURpc3Bvc2FibGVbXSk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogKCkgPT4gZGlzcG9zZUFycmF5KGFycmF5KSB9O1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNsYXNzIFR3b0tleU1hcDxURmlyc3QgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRTZWNvbmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRWYWx1ZT4ge1xuICBwcml2YXRlIF9kYXRhOiB7IFtiZzogc3RyaW5nIHwgbnVtYmVyXTogeyBbZmc6IHN0cmluZyB8IG51bWJlcl06IFRWYWx1ZSB8IHVuZGVmaW5lZCB9IHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICBwdWJsaWMgc2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YVtmaXJzdF0pIHtcbiAgICAgIHRoaXMuX2RhdGFbZmlyc3RdID0ge307XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSFbc2Vjb25kXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQpOiBUVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0gPyB0aGlzLl9kYXRhW2ZpcnN0IGFzIHN0cmluZyB8IG51bWJlcl0hW3NlY29uZF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YSA9IHt9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGb3VyS2V5TWFwPFRGaXJzdCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFNlY29uZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFRoaXJkIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBURm91cnRoIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVmFsdWU+IHtcbiAgcHJpdmF0ZSBfZGF0YTogVHdvS2V5TWFwPFRGaXJzdCwgVFNlY29uZCwgVHdvS2V5TWFwPFRUaGlyZCwgVEZvdXJ0aCwgVFZhbHVlPj4gPSBuZXcgVHdvS2V5TWFwKCk7XG5cbiAgcHVibGljIHNldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCwgdmFsdWU6IFRWYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCkpIHtcbiAgICAgIHRoaXMuX2RhdGEuc2V0KGZpcnN0LCBzZWNvbmQsIG5ldyBUd29LZXlNYXAoKSk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpIS5zZXQodGhpcmQsIGZvdXJ0aCwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldChmaXJzdDogVEZpcnN0LCBzZWNvbmQ6IFRTZWNvbmQsIHRoaXJkOiBUVGhpcmQsIGZvdXJ0aDogVEZvdXJ0aCk6IFRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0KGZpcnN0LCBzZWNvbmQpPy5nZXQodGhpcmQsIGZvdXJ0aCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbnRlcmZhY2UgSU5hdmlnYXRvciB7XG4gIHVzZXJBZ2VudDogc3RyaW5nO1xuICBsYW5ndWFnZTogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xufVxuXG4vLyBXZSdyZSBkZWNsYXJpbmcgYSBuYXZpZ2F0b3IgZ2xvYmFsIGhlcmUgYXMgd2UgZXhwZWN0IGl0IGluIGFsbCBydW50aW1lcyAobm9kZSBhbmQgYnJvd3NlciksIGJ1dFxuLy8gd2Ugd2FudCB0aGlzIG1vZHVsZSB0byBsaXZlIGluIGNvbW1vbi5cbmRlY2xhcmUgY29uc3QgbmF2aWdhdG9yOiBJTmF2aWdhdG9yO1xuZGVjbGFyZSBjb25zdCBwcm9jZXNzOiB1bmtub3duO1xuXG5leHBvcnQgY29uc3QgaXNOb2RlID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAndGl0bGUnIGluIChwcm9jZXNzIGFzIGFueSkpID8gdHJ1ZSA6IGZhbHNlO1xuY29uc3QgdXNlckFnZW50ID0gKGlzTm9kZSkgPyAnbm9kZScgOiBuYXZpZ2F0b3IudXNlckFnZW50O1xuY29uc3QgcGxhdGZvcm0gPSAoaXNOb2RlKSA/ICdub2RlJyA6IG5hdmlnYXRvci5wbGF0Zm9ybTtcblxuZXhwb3J0IGNvbnN0IGlzRmlyZWZveCA9IHVzZXJBZ2VudC5pbmNsdWRlcygnRmlyZWZveCcpO1xuZXhwb3J0IGNvbnN0IGlzTGVnYWN5RWRnZSA9IHVzZXJBZ2VudC5pbmNsdWRlcygnRWRnZScpO1xuZXhwb3J0IGNvbnN0IGlzU2FmYXJpID0gL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdCh1c2VyQWdlbnQpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNhZmFyaVZlcnNpb24oKTogbnVtYmVyIHtcbiAgaWYgKCFpc1NhZmFyaSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IG1ham9yVmVyc2lvbiA9IHVzZXJBZ2VudC5tYXRjaCgvVmVyc2lvblxcLyhcXGQrKS8pO1xuICBpZiAobWFqb3JWZXJzaW9uID09PSBudWxsIHx8IG1ham9yVmVyc2lvbi5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHBhcnNlSW50KG1ham9yVmVyc2lvblsxXSk7XG59XG5cbi8vIEZpbmQgdGhlIHVzZXJzIHBsYXRmb3JtLiBXZSB1c2UgdGhpcyB0byBpbnRlcnByZXQgdGhlIG1ldGEga2V5XG4vLyBhbmQgSVNPIHRoaXJkIGxldmVsIHNoaWZ0cy5cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE5ODc3OTI0LzU3NzU5OFxuZXhwb3J0IGNvbnN0IGlzTWFjID0gWydNYWNpbnRvc2gnLCAnTWFjSW50ZWwnLCAnTWFjUFBDJywgJ01hYzY4SyddLmluY2x1ZGVzKHBsYXRmb3JtKTtcbmV4cG9ydCBjb25zdCBpc0lwYWQgPSBwbGF0Zm9ybSA9PT0gJ2lQYWQnO1xuZXhwb3J0IGNvbnN0IGlzSXBob25lID0gcGxhdGZvcm0gPT09ICdpUGhvbmUnO1xuZXhwb3J0IGNvbnN0IGlzV2luZG93cyA9IFsnV2luZG93cycsICdXaW4xNicsICdXaW4zMicsICdXaW5DRSddLmluY2x1ZGVzKHBsYXRmb3JtKTtcbmV4cG9ydCBjb25zdCBpc0xpbnV4ID0gcGxhdGZvcm0uaW5kZXhPZignTGludXgnKSA+PSAwO1xuLy8gTm90ZSB0aGF0IHdoZW4gdGhpcyBpcyB0cnVlLCBpc0xpbnV4IHdpbGwgYWxzbyBiZSB0cnVlLlxuZXhwb3J0IGNvbnN0IGlzQ2hyb21lT1MgPSAvXFxiQ3JPU1xcYi8udGVzdCh1c2VyQWdlbnQpO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcblxuaW50ZXJmYWNlIElUYXNrUXVldWUge1xuICAvKipcbiAgICogQWRkcyBhIHRhc2sgdG8gdGhlIHF1ZXVlIHdoaWNoIHdpbGwgcnVuIGluIGEgZnV0dXJlIGlkbGUgY2FsbGJhY2suXG4gICAqIFRvIGF2b2lkIHBlcmNlaXZhYmxlIHN0YWxscyBvbiB0aGUgbWFpbnRocmVhZCwgdGFza3Mgd2l0aCBoZWF2eSB3b3JrbG9hZFxuICAgKiBzaG91bGQgc3BsaXQgdGhlaXIgd29yayBpbnRvIHNtYWxsZXIgcGllY2VzIGFuZCByZXR1cm4gYHRydWVgIHRvIGdldFxuICAgKiBjYWxsZWQgYWdhaW4gdW50aWwgdGhlIHdvcmsgaXMgZG9uZSAob24gZmFsc3kgcmV0dXJuIHZhbHVlKS5cbiAgICovXG4gIGVucXVldWUodGFzazogKCkgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBGbHVzaGVzIHRoZSBxdWV1ZSwgcnVubmluZyBhbGwgcmVtYWluaW5nIHRhc2tzIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICBmbHVzaCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgYW55IHJlbWFpbmluZyB0YXNrcyBmcm9tIHRoZSBxdWV1ZSwgdGhlc2Ugd2lsbCBub3QgYmUgcnVuLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElUYXNrRGVhZGxpbmUge1xuICB0aW1lUmVtYWluaW5nKCk6IG51bWJlcjtcbn1cbnR5cGUgQ2FsbGJhY2tXaXRoRGVhZGxpbmUgPSAoZGVhZGxpbmU6IElUYXNrRGVhZGxpbmUpID0+IHZvaWQ7XG5cbmFic3RyYWN0IGNsYXNzIFRhc2tRdWV1ZSBpbXBsZW1lbnRzIElUYXNrUXVldWUge1xuICBwcml2YXRlIF90YXNrczogKCgpID0+IGJvb2xlYW4gfCB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgX2lkbGVDYWxsYmFjaz86IG51bWJlcjtcbiAgcHJpdmF0ZSBfaSA9IDA7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9yZXF1ZXN0Q2FsbGJhY2soY2FsbGJhY2s6IENhbGxiYWNrV2l0aERlYWRsaW5lKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2NhbmNlbENhbGxiYWNrKGlkZW50aWZpZXI6IG51bWJlcik6IHZvaWQ7XG5cbiAgcHVibGljIGVucXVldWUodGFzazogKCkgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl90YXNrcy5wdXNoKHRhc2spO1xuICAgIHRoaXMuX3N0YXJ0KCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMuX2kgPCB0aGlzLl90YXNrcy5sZW5ndGgpIHtcbiAgICAgIGlmICghdGhpcy5fdGFza3NbdGhpcy5faV0oKSkge1xuICAgICAgICB0aGlzLl9pKys7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faWRsZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9jYW5jZWxDYWxsYmFjayh0aGlzLl9pZGxlQ2FsbGJhY2spO1xuICAgICAgdGhpcy5faWRsZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLl9pID0gMDtcbiAgICB0aGlzLl90YXNrcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pZGxlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX2lkbGVDYWxsYmFjayA9IHRoaXMuX3JlcXVlc3RDYWxsYmFjayh0aGlzLl9wcm9jZXNzLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3MoZGVhZGxpbmU6IElUYXNrRGVhZGxpbmUpOiB2b2lkIHtcbiAgICB0aGlzLl9pZGxlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHRhc2tEdXJhdGlvbiA9IDA7XG4gICAgbGV0IGxvbmdlc3RUYXNrID0gMDtcbiAgICBsZXQgbGFzdERlYWRsaW5lUmVtYWluaW5nID0gZGVhZGxpbmUudGltZVJlbWFpbmluZygpO1xuICAgIGxldCBkZWFkbGluZVJlbWFpbmluZyA9IDA7XG4gICAgd2hpbGUgKHRoaXMuX2kgPCB0aGlzLl90YXNrcy5sZW5ndGgpIHtcbiAgICAgIHRhc2tEdXJhdGlvbiA9IERhdGUubm93KCk7XG4gICAgICBpZiAoIXRoaXMuX3Rhc2tzW3RoaXMuX2ldKCkpIHtcbiAgICAgICAgdGhpcy5faSsrO1xuICAgICAgfVxuICAgICAgLy8gb3RoZXIgdGhhbiBwZXJmb3JtYW5jZS5ub3csIERhdGUubm93IG1pZ2h0IG5vdCBiZSBzdGFibGUgKGNoYW5nZXMgb24gd2FsbCBjbG9jayBjaGFuZ2VzKSxcbiAgICAgIC8vIHRoaXMgaXMgbm90IGFuIGlzc3VlIGhlcmUgYXMgYSBjbG9jayBjaGFuZ2UgZHVyaW5nIGEgc2hvcnQgcnVubmluZyB0YXNrIGlzIHZlcnkgdW5saWtlbHlcbiAgICAgIC8vIGluIGNhc2UgaXQgc3RpbGwgaGFwcGVuZWQgYW5kIGxlYWRzIHRvIG5lZ2F0aXZlIGR1cmF0aW9uLCBzaW1wbHkgYXNzdW1lIDEgbXNlY1xuICAgICAgdGFza0R1cmF0aW9uID0gTWF0aC5tYXgoMSwgRGF0ZS5ub3coKSAtIHRhc2tEdXJhdGlvbik7XG4gICAgICBsb25nZXN0VGFzayA9IE1hdGgubWF4KHRhc2tEdXJhdGlvbiwgbG9uZ2VzdFRhc2spO1xuICAgICAgLy8gR3Vlc3MgdGhlIGZvbGxvd2luZyB0YXNrIHdpbGwgdGFrZSBhIHNpbWlsYXIgdGltZSB0byB0aGUgbG9uZ2VzdCB0YXNrIGluIHRoaXMgYmF0Y2gsIGFsbG93XG4gICAgICAvLyBhZGRpdGlvbmFsIHJvb20gdG8gdHJ5IGF2b2lkIGV4Y2VlZGluZyB0aGUgZGVhZGxpbmVcbiAgICAgIGRlYWRsaW5lUmVtYWluaW5nID0gZGVhZGxpbmUudGltZVJlbWFpbmluZygpO1xuICAgICAgaWYgKGxvbmdlc3RUYXNrICogMS41ID4gZGVhZGxpbmVSZW1haW5pbmcpIHtcbiAgICAgICAgLy8gV2FybiB3aGVuIHRoZSB0aW1lIGV4Y2VlZGluZyB0aGUgZGVhZGxpbmUgaXMgb3ZlciAyMG1zLCBpZiB0aGlzIGhhcHBlbnMgaW4gcHJhY3RpY2UgdGhlXG4gICAgICAgIC8vIHRhc2sgc2hvdWxkIGJlIHNwbGl0IGludG8gc3ViLXRhc2tzIHRvIGVuc3VyZSB0aGUgVUkgcmVtYWlucyByZXNwb25zaXZlLlxuICAgICAgICBpZiAobGFzdERlYWRsaW5lUmVtYWluaW5nIC0gdGFza0R1cmF0aW9uIDwgLTIwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGB0YXNrIHF1ZXVlIGV4Y2VlZGVkIGFsbG90dGVkIGRlYWRsaW5lIGJ5ICR7TWF0aC5hYnMoTWF0aC5yb3VuZChsYXN0RGVhZGxpbmVSZW1haW5pbmcgLSB0YXNrRHVyYXRpb24pKX1tc2ApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0YXJ0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxhc3REZWFkbGluZVJlbWFpbmluZyA9IGRlYWRsaW5lUmVtYWluaW5nO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHF1ZXVlIG9mIHRoYXQgcnVucyB0YXNrcyBvdmVyIHNldmVyYWwgdGFza3MgdmlhIHNldFRpbWVvdXQsIHRyeWluZyB0byBtYWludGFpbiBhYm92ZSA2MCBmcmFtZXNcbiAqIHBlciBzZWNvbmQuIFRoZSB0YXNrcyB3aWxsIHJ1biBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZW5xdWV1ZWQsIGJ1dCB0aGV5IHdpbGwgcnVuIHNvbWUgdGltZSBsYXRlcixcbiAqIGFuZCBjYXJlIHNob3VsZCBiZSB0YWtlbiB0byBlbnN1cmUgdGhleSdyZSBub24tdXJnZW50IGFuZCB3aWxsIG5vdCBpbnRyb2R1Y2UgcmFjZSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUHJpb3JpdHlUYXNrUXVldWUgZXh0ZW5kcyBUYXNrUXVldWUge1xuICBwcm90ZWN0ZWQgX3JlcXVlc3RDYWxsYmFjayhjYWxsYmFjazogQ2FsbGJhY2tXaXRoRGVhZGxpbmUpOiBudW1iZXIge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKHRoaXMuX2NyZWF0ZURlYWRsaW5lKDE2KSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYW5jZWxDYWxsYmFjayhpZGVudGlmaWVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQoaWRlbnRpZmllcik7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEZWFkbGluZShkdXJhdGlvbjogbnVtYmVyKTogSVRhc2tEZWFkbGluZSB7XG4gICAgY29uc3QgZW5kID0gRGF0ZS5ub3coKSArIGR1cmF0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICB0aW1lUmVtYWluaW5nOiAoKSA9PiBNYXRoLm1heCgwLCBlbmQgLSBEYXRlLm5vdygpKVxuICAgIH07XG4gIH1cbn1cblxuY2xhc3MgSWRsZVRhc2tRdWV1ZUludGVybmFsIGV4dGVuZHMgVGFza1F1ZXVlIHtcbiAgcHJvdGVjdGVkIF9yZXF1ZXN0Q2FsbGJhY2soY2FsbGJhY2s6IElkbGVSZXF1ZXN0Q2FsbGJhY2spOiBudW1iZXIge1xuICAgIHJldHVybiByZXF1ZXN0SWRsZUNhbGxiYWNrKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2FuY2VsQ2FsbGJhY2soaWRlbnRpZmllcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY2FuY2VsSWRsZUNhbGxiYWNrKGlkZW50aWZpZXIpO1xuICB9XG59XG5cbi8qKlxuICogQSBxdWV1ZSBvZiB0aGF0IHJ1bnMgdGFza3Mgb3ZlciBzZXZlcmFsIGlkbGUgY2FsbGJhY2tzLCB0cnlpbmcgdG8gcmVzcGVjdCB0aGUgaWRsZSBjYWxsYmFjaydzXG4gKiBkZWFkbGluZSBnaXZlbiBieSB0aGUgZW52aXJvbm1lbnQuIFRoZSB0YXNrcyB3aWxsIHJ1biBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZW5xdWV1ZWQsIGJ1dCB0aGV5XG4gKiB3aWxsIHJ1biBzb21lIHRpbWUgbGF0ZXIsIGFuZCBjYXJlIHNob3VsZCBiZSB0YWtlbiB0byBlbnN1cmUgdGhleSdyZSBub24tdXJnZW50IGFuZCB3aWxsIG5vdFxuICogaW50cm9kdWNlIHJhY2UgY29uZGl0aW9ucy5cbiAqXG4gKiBUaGlzIHJldmVydHMgdG8gYSB7QGxpbmsgUHJpb3JpdHlUYXNrUXVldWV9IGlmIHRoZSBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGlkbGUgY2FsbGJhY2tzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgSWRsZVRhc2tRdWV1ZSA9ICghaXNOb2RlICYmICdyZXF1ZXN0SWRsZUNhbGxiYWNrJyBpbiB3aW5kb3cpID8gSWRsZVRhc2tRdWV1ZUludGVybmFsIDogUHJpb3JpdHlUYXNrUXVldWU7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgdHJhY2tzIGEgc2luZ2xlIGRlYm91bmNlZCB0YXNrIHRoYXQgd2lsbCBydW4gb24gdGhlIG5leHQgaWRsZSBmcmFtZS4gV2hlbiBjYWxsZWRcbiAqIG11bHRpcGxlIHRpbWVzLCBvbmx5IHRoZSBsYXN0IHNldCB0YXNrIHdpbGwgcnVuLlxuICovXG5leHBvcnQgY2xhc3MgRGVib3VuY2VkSWRsZVRhc2sge1xuICBwcml2YXRlIF9xdWV1ZTogSVRhc2tRdWV1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9xdWV1ZSA9IG5ldyBJZGxlVGFza1F1ZXVlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KHRhc2s6ICgpID0+IGJvb2xlYW4gfCB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fcXVldWUuY2xlYXIoKTtcbiAgICB0aGlzLl9xdWV1ZS5lbnF1ZXVlKHRhc2spO1xuICB9XG5cbiAgcHVibGljIGZsdXNoKCk6IHZvaWQge1xuICAgIHRoaXMuX3F1ZXVlLmZsdXNoKCk7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElBdHRyaWJ1dGVEYXRhLCBJQ29sb3JSR0IsIElFeHRlbmRlZEF0dHJzIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIEZnRmxhZ3MsIEJnRmxhZ3MsIFVuZGVybGluZVN0eWxlLCBFeHRGbGFncyB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZURhdGEgaW1wbGVtZW50cyBJQXR0cmlidXRlRGF0YSB7XG4gIHB1YmxpYyBzdGF0aWMgdG9Db2xvclJHQih2YWx1ZTogbnVtYmVyKTogSUNvbG9yUkdCIHtcbiAgICByZXR1cm4gW1xuICAgICAgdmFsdWUgPj4+IEF0dHJpYnV0ZXMuUkVEX1NISUZUICYgMjU1LFxuICAgICAgdmFsdWUgPj4+IEF0dHJpYnV0ZXMuR1JFRU5fU0hJRlQgJiAyNTUsXG4gICAgICB2YWx1ZSAmIDI1NVxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZyb21Db2xvclJHQih2YWx1ZTogSUNvbG9yUkdCKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHZhbHVlWzBdICYgMjU1KSA8PCBBdHRyaWJ1dGVzLlJFRF9TSElGVCB8ICh2YWx1ZVsxXSAmIDI1NSkgPDwgQXR0cmlidXRlcy5HUkVFTl9TSElGVCB8IHZhbHVlWzJdICYgMjU1O1xuICB9XG5cbiAgcHVibGljIGNsb25lKCk6IElBdHRyaWJ1dGVEYXRhIHtcbiAgICBjb25zdCBuZXdPYmogPSBuZXcgQXR0cmlidXRlRGF0YSgpO1xuICAgIG5ld09iai5mZyA9IHRoaXMuZmc7XG4gICAgbmV3T2JqLmJnID0gdGhpcy5iZztcbiAgICBuZXdPYmouZXh0ZW5kZWQgPSB0aGlzLmV4dGVuZGVkLmNsb25lKCk7XG4gICAgcmV0dXJuIG5ld09iajtcbiAgfVxuXG4gIC8vIGRhdGFcbiAgcHVibGljIGZnID0gMDtcbiAgcHVibGljIGJnID0gMDtcbiAgcHVibGljIGV4dGVuZGVkOiBJRXh0ZW5kZWRBdHRycyA9IG5ldyBFeHRlbmRlZEF0dHJzKCk7XG5cbiAgLy8gZmxhZ3NcbiAgcHVibGljIGlzSW52ZXJzZSgpOiBudW1iZXIgICAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuSU5WRVJTRTsgfVxuICBwdWJsaWMgaXNCb2xkKCk6IG51bWJlciAgICAgICAgICB7IHJldHVybiB0aGlzLmZnICYgRmdGbGFncy5CT0xEOyB9XG4gIHB1YmxpYyBpc1VuZGVybGluZSgpOiBudW1iZXIgICAgIHtcbiAgICBpZiAodGhpcy5oYXNFeHRlbmRlZEF0dHJzKCkgJiYgdGhpcy5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSAhPT0gVW5kZXJsaW5lU3R5bGUuTk9ORSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZnICYgRmdGbGFncy5VTkRFUkxJTkU7XG4gIH1cbiAgcHVibGljIGlzQmxpbmsoKTogbnVtYmVyICAgICAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuQkxJTks7IH1cbiAgcHVibGljIGlzSW52aXNpYmxlKCk6IG51bWJlciAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuSU5WSVNJQkxFOyB9XG4gIHB1YmxpYyBpc0l0YWxpYygpOiBudW1iZXIgICAgICAgIHsgcmV0dXJuIHRoaXMuYmcgJiBCZ0ZsYWdzLklUQUxJQzsgfVxuICBwdWJsaWMgaXNEaW0oKTogbnVtYmVyICAgICAgICAgICB7IHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5ESU07IH1cbiAgcHVibGljIGlzU3RyaWtldGhyb3VnaCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuU1RSSUtFVEhST1VHSDsgfVxuICBwdWJsaWMgaXNQcm90ZWN0ZWQoKTogbnVtYmVyICAgICB7IHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5QUk9URUNURUQ7IH1cbiAgcHVibGljIGlzT3ZlcmxpbmUoKTogbnVtYmVyICAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuT1ZFUkxJTkU7IH1cblxuICAvLyBjb2xvciBtb2Rlc1xuICBwdWJsaWMgZ2V0RmdDb2xvck1vZGUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0s7IH1cbiAgcHVibGljIGdldEJnQ29sb3JNb2RlKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLOyB9XG4gIHB1YmxpYyBpc0ZnUkdCKCk6IGJvb2xlYW4gICAgICAgeyByZXR1cm4gKHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1JHQjsgfVxuICBwdWJsaWMgaXNCZ1JHQigpOiBib29sZWFuICAgICAgIHsgcmV0dXJuICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9SR0I7IH1cbiAgcHVibGljIGlzRmdQYWxldHRlKCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDE2IHx8ICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMjU2OyB9XG4gIHB1YmxpYyBpc0JnUGFsZXR0ZSgpOiBib29sZWFuICAgeyByZXR1cm4gKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNiB8fCAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1NjsgfVxuICBwdWJsaWMgaXNGZ0RlZmF1bHQoKTogYm9vbGVhbiAgIHsgcmV0dXJuICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gMDsgfVxuICBwdWJsaWMgaXNCZ0RlZmF1bHQoKTogYm9vbGVhbiAgIHsgcmV0dXJuICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gMDsgfVxuICBwdWJsaWMgaXNBdHRyaWJ1dGVEZWZhdWx0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5mZyA9PT0gMCAmJiB0aGlzLmJnID09PSAwOyB9XG5cbiAgLy8gY29sb3JzXG4gIHB1YmxpYyBnZXRGZ0NvbG9yKCk6IG51bWJlciB7XG4gICAgc3dpdGNoICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6ICByZXR1cm4gdGhpcy5mZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0s7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOiAgIHJldHVybiB0aGlzLmZnICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAgLy8gQ01fREVGQVVMVCBkZWZhdWx0cyB0byAtMVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0QmdDb2xvcigpOiBudW1iZXIge1xuICAgIHN3aXRjaCAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OiAgcmV0dXJuIHRoaXMuYmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjogICByZXR1cm4gdGhpcy5iZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgIC8vIENNX0RFRkFVTFQgZGVmYXVsdHMgdG8gLTFcbiAgICB9XG4gIH1cblxuICAvLyBleHRlbmRlZCBhdHRyc1xuICBwdWJsaWMgaGFzRXh0ZW5kZWRBdHRycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQ7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUV4dGVuZGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4dGVuZGVkLmlzRW1wdHkoKSkge1xuICAgICAgdGhpcy5iZyAmPSB+QmdGbGFncy5IQVNfRVhURU5ERUQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmcgfD0gQmdGbGFncy5IQVNfRVhURU5ERUQ7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRVbmRlcmxpbmVDb2xvcigpOiBudW1iZXIge1xuICAgIGlmICgodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvcikge1xuICAgICAgc3dpdGNoICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OiAgcmV0dXJuIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLO1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOiAgIHJldHVybiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGZ0NvbG9yKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldEZnQ29sb3IoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lQ29sb3JNb2RlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yXG4gICAgICA/IHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0tcbiAgICAgIDogdGhpcy5nZXRGZ0NvbG9yTW9kZSgpO1xuICB9XG4gIHB1YmxpYyBpc1VuZGVybGluZUNvbG9yUkdCKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUkdCXG4gICAgICA6IHRoaXMuaXNGZ1JHQigpO1xuICB9XG4gIHB1YmxpYyBpc1VuZGVybGluZUNvbG9yUGFsZXR0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3JcbiAgICAgID8gKHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNlxuICAgICAgICAgIHx8ICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMjU2XG4gICAgICA6IHRoaXMuaXNGZ1BhbGV0dGUoKTtcbiAgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmVDb2xvckRlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yXG4gICAgICA/ICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gMFxuICAgICAgOiB0aGlzLmlzRmdEZWZhdWx0KCk7XG4gIH1cbiAgcHVibGljIGdldFVuZGVybGluZVN0eWxlKCk6IFVuZGVybGluZVN0eWxlIHtcbiAgICByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuVU5ERVJMSU5FXG4gICAgICA/ICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQgPyB0aGlzLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlIDogVW5kZXJsaW5lU3R5bGUuU0lOR0xFKVxuICAgICAgOiBVbmRlcmxpbmVTdHlsZS5OT05FO1xuICB9XG4gIHB1YmxpYyBnZXRVbmRlcmxpbmVWYXJpYW50T2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lVmFyaWFudE9mZnNldDtcbiAgfVxufVxuXG5cbi8qKlxuICogRXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgYSBjZWxsLlxuICogSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgZGlmZmVyZW50IHVuZGVybGluZSBzdHlsZXMgYW5kIGNvbG9yLlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5kZWRBdHRycyBpbXBsZW1lbnRzIElFeHRlbmRlZEF0dHJzIHtcbiAgcHJpdmF0ZSBfZXh0OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgZ2V0IGV4dCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLl91cmxJZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHRoaXMuX2V4dCAmIH5FeHRGbGFncy5VTkRFUkxJTkVfU1RZTEUpIHxcbiAgICAgICAgKHRoaXMudW5kZXJsaW5lU3R5bGUgPDwgMjYpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgZXh0KHZhbHVlOiBudW1iZXIpIHsgdGhpcy5fZXh0ID0gdmFsdWU7IH1cblxuICBwdWJsaWMgZ2V0IHVuZGVybGluZVN0eWxlKCk6IFVuZGVybGluZVN0eWxlIHtcbiAgICAvLyBBbHdheXMgcmV0dXJuIHRoZSBVUkwgc3R5bGUgaWYgaXQgaGFzIG9uZVxuICAgIGlmICh0aGlzLl91cmxJZCkge1xuICAgICAgcmV0dXJuIFVuZGVybGluZVN0eWxlLkRBU0hFRDtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLl9leHQgJiBFeHRGbGFncy5VTkRFUkxJTkVfU1RZTEUpID4+IDI2O1xuICB9XG4gIHB1YmxpYyBzZXQgdW5kZXJsaW5lU3R5bGUodmFsdWU6IFVuZGVybGluZVN0eWxlKSB7XG4gICAgdGhpcy5fZXh0ICY9IH5FeHRGbGFncy5VTkRFUkxJTkVfU1RZTEU7XG4gICAgdGhpcy5fZXh0IHw9ICh2YWx1ZSA8PCAyNikgJiBFeHRGbGFncy5VTkRFUkxJTkVfU1RZTEU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVuZGVybGluZUNvbG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dCAmIChBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgfVxuICBwdWJsaWMgc2V0IHVuZGVybGluZUNvbG9yKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9leHQgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgICB0aGlzLl9leHQgfD0gdmFsdWUgJiAoQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gIH1cblxuICBwcml2YXRlIF91cmxJZDogbnVtYmVyID0gMDtcbiAgcHVibGljIGdldCB1cmxJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl91cmxJZDtcbiAgfVxuICBwdWJsaWMgc2V0IHVybElkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl91cmxJZCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCB1bmRlcmxpbmVWYXJpYW50T2Zmc2V0KCk6IG51bWJlciB7XG4gICAgY29uc3QgdmFsID0gKHRoaXMuX2V4dCAmIEV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUKSA+PiAyOTtcbiAgICBpZiAodmFsIDwgMCkge1xuICAgICAgcmV0dXJuIHZhbCBeIDB4RkZGRkZGRjg7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHVibGljIHNldCB1bmRlcmxpbmVWYXJpYW50T2Zmc2V0KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9leHQgJj0gfkV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUO1xuICAgIHRoaXMuX2V4dCB8PSAodmFsdWUgPDwgMjkpICYgRXh0RmxhZ3MuVkFSSUFOVF9PRkZTRVQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBleHQ6IG51bWJlciA9IDAsXG4gICAgdXJsSWQ6IG51bWJlciA9IDBcbiAgKSB7XG4gICAgdGhpcy5fZXh0ID0gZXh0O1xuICAgIHRoaXMuX3VybElkID0gdXJsSWQ7XG4gIH1cblxuICBwdWJsaWMgY2xvbmUoKTogSUV4dGVuZGVkQXR0cnMge1xuICAgIHJldHVybiBuZXcgRXh0ZW5kZWRBdHRycyh0aGlzLl9leHQsIHRoaXMuX3VybElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW50IG1ldGhvZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBvYmplY3QgaG9sZHMgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbixcbiAgICogdGhhdCBuZWVkcyB0byBiZSBwZXJzaXN0YW50IGluIHRoZSBidWZmZXIuXG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51bmRlcmxpbmVTdHlsZSA9PT0gVW5kZXJsaW5lU3R5bGUuTk9ORSAmJiB0aGlzLl91cmxJZCA9PT0gMDtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ2hhckRhdGEsIElDZWxsRGF0YSwgSUV4dGVuZGVkQXR0cnMgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgc3RyaW5nRnJvbUNvZGVQb2ludCB9IGZyb20gJ2NvbW1vbi9pbnB1dC9UZXh0RGVjb2Rlcic7XG5pbXBvcnQgeyBDSEFSX0RBVEFfQ0hBUl9JTkRFWCwgQ0hBUl9EQVRBX1dJRFRIX0lOREVYLCBDSEFSX0RBVEFfQVRUUl9JTkRFWCwgQ29udGVudCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEsIEV4dGVuZGVkQXR0cnMgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuXG4vKipcbiAqIENlbGxEYXRhIC0gcmVwcmVzZW50cyBhIHNpbmdsZSBDZWxsIGluIHRoZSB0ZXJtaW5hbCBidWZmZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZWxsRGF0YSBleHRlbmRzIEF0dHJpYnV0ZURhdGEgaW1wbGVtZW50cyBJQ2VsbERhdGEge1xuICAvKiogSGVscGVyIHRvIGNyZWF0ZSBDZWxsRGF0YSBmcm9tIENoYXJEYXRhLiAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21DaGFyRGF0YSh2YWx1ZTogQ2hhckRhdGEpOiBDZWxsRGF0YSB7XG4gICAgY29uc3Qgb2JqID0gbmV3IENlbGxEYXRhKCk7XG4gICAgb2JqLnNldEZyb21DaGFyRGF0YSh2YWx1ZSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICAvKiogUHJpbWl0aXZlcyBmcm9tIHRlcm1pbmFsIGJ1ZmZlci4gKi9cbiAgcHVibGljIGNvbnRlbnQgPSAwO1xuICBwdWJsaWMgZmcgPSAwO1xuICBwdWJsaWMgYmcgPSAwO1xuICBwdWJsaWMgZXh0ZW5kZWQ6IElFeHRlbmRlZEF0dHJzID0gbmV3IEV4dGVuZGVkQXR0cnMoKTtcbiAgcHVibGljIGNvbWJpbmVkRGF0YSA9ICcnO1xuICAvKiogV2hldGhlciBjZWxsIGNvbnRhaW5zIGEgY29tYmluZWQgc3RyaW5nLiAqL1xuICBwdWJsaWMgaXNDb21iaW5lZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0s7XG4gIH1cbiAgLyoqIFdpZHRoIG9mIHRoZSBjZWxsLiAqL1xuICBwdWJsaWMgZ2V0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50ID4+IENvbnRlbnQuV0lEVEhfU0hJRlQ7XG4gIH1cbiAgLyoqIEpTIHN0cmluZyBvZiB0aGUgY29udGVudC4gKi9cbiAgcHVibGljIGdldENoYXJzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSykge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWREYXRhO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSykge1xuICAgICAgcmV0dXJuIHN0cmluZ0Zyb21Db2RlUG9pbnQodGhpcy5jb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSyk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuICAvKipcbiAgICogQ29kZXBvaW50IG9mIGNlbGxcbiAgICogTm90ZSB0aGlzIHJldHVybnMgdGhlIFVURjMyIGNvZGVwb2ludCBvZiBzaW5nbGUgY2hhcnMsXG4gICAqIGlmIGNvbnRlbnQgaXMgYSBjb21iaW5lZCBzdHJpbmcgaXQgcmV0dXJucyB0aGUgY29kZXBvaW50XG4gICAqIG9mIHRoZSBsYXN0IGNoYXIgaW4gc3RyaW5nIHRvIGJlIGluIGxpbmUgd2l0aCBjb2RlIGluIENoYXJEYXRhLlxuICAgKi9cbiAgcHVibGljIGdldENvZGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuaXNDb21iaW5lZCgpKVxuICAgICAgPyB0aGlzLmNvbWJpbmVkRGF0YS5jaGFyQ29kZUF0KHRoaXMuY29tYmluZWREYXRhLmxlbmd0aCAtIDEpXG4gICAgICA6IHRoaXMuY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0s7XG4gIH1cbiAgLyoqIFNldCBkYXRhIGZyb20gQ2hhckRhdGEgKi9cbiAgcHVibGljIHNldEZyb21DaGFyRGF0YSh2YWx1ZTogQ2hhckRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLmZnID0gdmFsdWVbQ0hBUl9EQVRBX0FUVFJfSU5ERVhdO1xuICAgIHRoaXMuYmcgPSAwO1xuICAgIGxldCBjb21iaW5lZCA9IGZhbHNlO1xuICAgIC8vIHN1cnJvZ2F0ZXMgYW5kIGNvbWJpbmVkIHN0cmluZ3MgbmVlZCBzcGVjaWFsIHRyZWF0bWVudFxuICAgIGlmICh2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0ubGVuZ3RoID4gMikge1xuICAgICAgY29tYmluZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCBjb2RlID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMCk7XG4gICAgICAvLyBpZiB0aGUgMi1jaGFyIHN0cmluZyBpcyBhIHN1cnJvZ2F0ZSBjcmVhdGUgc2luZ2xlIGNvZGVwb2ludFxuICAgICAgLy8gZXZlcnl0aGluZyBlbHNlIGlzIGNvbWJpbmVkXG4gICAgICBpZiAoMHhEODAwIDw9IGNvZGUgJiYgY29kZSA8PSAweERCRkYpIHtcbiAgICAgICAgY29uc3Qgc2Vjb25kID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMSk7XG4gICAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnQgPSAoKGNvZGUgLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwKSB8ICh2YWx1ZVtDSEFSX0RBVEFfV0lEVEhfSU5ERVhdIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbWJpbmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbWJpbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSB2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0uY2hhckNvZGVBdCgwKSB8ICh2YWx1ZVtDSEFSX0RBVEFfV0lEVEhfSU5ERVhdIDw8IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgIH1cbiAgICBpZiAoY29tYmluZWQpIHtcbiAgICAgIHRoaXMuY29tYmluZWREYXRhID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdO1xuICAgICAgdGhpcy5jb250ZW50ID0gQ29udGVudC5JU19DT01CSU5FRF9NQVNLIHwgKHZhbHVlW0NIQVJfREFUQV9XSURUSF9JTkRFWF0gPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgfVxuICB9XG4gIC8qKiBHZXQgZGF0YSBhcyBDaGFyRGF0YS4gKi9cbiAgcHVibGljIGdldEFzQ2hhckRhdGEoKTogQ2hhckRhdGEge1xuICAgIHJldHVybiBbdGhpcy5mZywgdGhpcy5nZXRDaGFycygpLCB0aGlzLmdldFdpZHRoKCksIHRoaXMuZ2V0Q29kZSgpXTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ09MT1IgPSAwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQVRUUiA9ICgwIDw8IDE4KSB8IChERUZBVUxUX0NPTE9SIDw8IDkpIHwgKDI1NiA8PCAwKTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYVCA9IDA7XG5cbmV4cG9ydCBjb25zdCBDSEFSX0RBVEFfQVRUUl9JTkRFWCA9IDA7XG5leHBvcnQgY29uc3QgQ0hBUl9EQVRBX0NIQVJfSU5ERVggPSAxO1xuZXhwb3J0IGNvbnN0IENIQVJfREFUQV9XSURUSF9JTkRFWCA9IDI7XG5leHBvcnQgY29uc3QgQ0hBUl9EQVRBX0NPREVfSU5ERVggPSAzO1xuXG4vKipcbiAqIE51bGwgY2VsbCAtIGEgcmVhbCBlbXB0eSBjZWxsIChjb250YWluaW5nIG5vdGhpbmcpLlxuICogTm90ZSB0aGF0IGNvZGUgc2hvdWxkIGFsd2F5cyBiZSAwIGZvciBhIG51bGwgY2VsbCBhc1xuICogc2V2ZXJhbCB0ZXN0IGNvbmRpdGlvbiBvZiB0aGUgYnVmZmVyIGxpbmUgcmVseSBvbiB0aGlzLlxuICovXG5leHBvcnQgY29uc3QgTlVMTF9DRUxMX0NIQVIgPSAnJztcbmV4cG9ydCBjb25zdCBOVUxMX0NFTExfV0lEVEggPSAxO1xuZXhwb3J0IGNvbnN0IE5VTExfQ0VMTF9DT0RFID0gMDtcblxuLyoqXG4gKiBXaGl0ZXNwYWNlIGNlbGwuXG4gKiBUaGlzIGlzIG1lYW50IGFzIGEgcmVwbGFjZW1lbnQgZm9yIGVtcHR5IGNlbGxzIHdoZW4gbmVlZGVkXG4gKiBkdXJpbmcgcmVuZGVyaW5nIGxpbmVzIHRvIHByZXNlcnZlIGNvcnJlY3QgYWxpZ21lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBXSElURVNQQUNFX0NFTExfQ0hBUiA9ICcgJztcbmV4cG9ydCBjb25zdCBXSElURVNQQUNFX0NFTExfV0lEVEggPSAxO1xuZXhwb3J0IGNvbnN0IFdISVRFU1BBQ0VfQ0VMTF9DT0RFID0gMzI7XG5cbi8qKlxuICogQml0bWFza3MgZm9yIGFjY2Vzc2luZyBkYXRhIGluIGBjb250ZW50YC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gQ29udGVudCB7XG4gIC8qKlxuICAgKiBiaXQgMS4uMjEgICAgY29kZXBvaW50LCBtYXggYWxsb3dlZCBpbiBVVEYzMiBpcyAweDEwRkZGRiAoMjEgYml0cyB0YWtlbilcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYGNvZGVwb2ludCA9IGNvbnRlbnQgJiBDb250ZW50LmNvZGVwb2ludE1hc2s7YFxuICAgKiAgICAgICAgICAgICAgd3JpdGU6ICBgY29udGVudCB8PSBjb2RlcG9pbnQgJiBDb250ZW50LmNvZGVwb2ludE1hc2s7YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydGN1dCBpZiBwcmVjb25kaXRpb24gYGNvZGVwb2ludCA8PSAweDEwRkZGRmAgaXMgbWV0OlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBgY29udGVudCB8PSBjb2RlcG9pbnQ7YFxuICAgKi9cbiAgQ09ERVBPSU5UX01BU0sgPSAweDFGRkZGRixcblxuICAvKipcbiAgICogYml0IDIyICAgICAgIGZsYWcgaW5kaWNhdGlvbiB3aGV0aGVyIGEgY2VsbCBjb250YWlucyBjb21iaW5lZCBjb250ZW50XG4gICAqICAgICAgICAgICAgICByZWFkOiAgIGBpc0NvbWJpbmVkID0gY29udGVudCAmIENvbnRlbnQuaXNDb21iaW5lZDtgXG4gICAqICAgICAgICAgICAgICBzZXQ6ICAgIGBjb250ZW50IHw9IENvbnRlbnQuaXNDb21iaW5lZDtgXG4gICAqICAgICAgICAgICAgICBjbGVhcjogIGBjb250ZW50ICY9IH5Db250ZW50LmlzQ29tYmluZWQ7YFxuICAgKi9cbiAgSVNfQ09NQklORURfTUFTSyA9IDB4MjAwMDAwLCAgLy8gMSA8PCAyMVxuXG4gIC8qKlxuICAgKiBiaXQgMS4uMjIgICAgbWFzayB0byBjaGVjayB3aGV0aGVyIGEgY2VsbCBjb250YWlucyBhbnkgc3RyaW5nIGRhdGFcbiAgICogICAgICAgICAgICAgIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGNvZGVwb2ludCBhbmQgaXNDb21iaW5lZCBiaXRzIHRvIHNlZVxuICAgKiAgICAgICAgICAgICAgd2hldGhlciBhIGNlbGwgY29udGFpbnMgYW55dGhpbmdcbiAgICogICAgICAgICAgICAgIHJlYWQ6ICAgYGlzRW1wdHkgPSAhKGNvbnRlbnQgJiBDb250ZW50Lmhhc0NvbnRlbnQpYFxuICAgKi9cbiAgSEFTX0NPTlRFTlRfTUFTSyA9IDB4M0ZGRkZGLFxuXG4gIC8qKlxuICAgKiBiaXQgMjMuLjI0ICAgd2N3aWR0aCB2YWx1ZSBvZiBjZWxsLCB0YWtlcyAyIGJpdHMgKHJhbmdlcyBmcm9tIDAuLjIpXG4gICAqICAgICAgICAgICAgICByZWFkOiAgIGB3aWR0aCA9IChjb250ZW50ICYgQ29udGVudC53aWR0aE1hc2spID4+IENvbnRlbnQud2lkdGhTaGlmdDtgXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGBoYXNXaWR0aCA9IGNvbnRlbnQgJiBDb250ZW50LndpZHRoTWFzaztgXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGFzIGxvbmcgYXMgd2N3aWR0aCBpcyBoaWdoZXN0IHZhbHVlIGluIGBjb250ZW50YDpcbiAgICogICAgICAgICAgICAgICAgICAgICAgYHdpZHRoID0gY29udGVudCA+PiBDb250ZW50LndpZHRoU2hpZnQ7YFxuICAgKiAgICAgICAgICAgICAgd3JpdGU6ICBgY29udGVudCB8PSAod2lkdGggPDwgQ29udGVudC53aWR0aFNoaWZ0KSAmIENvbnRlbnQud2lkdGhNYXNrO2BcbiAgICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgaWYgcHJlY29uZGl0aW9uIGAwIDw9IHdpZHRoIDw9IDNgIGlzIG1ldDpcbiAgICogICAgICAgICAgICAgICAgICAgICAgYGNvbnRlbnQgfD0gd2lkdGggPDwgQ29udGVudC53aWR0aFNoaWZ0O2BcbiAgICovXG4gIFdJRFRIX01BU0sgPSAweEMwMDAwMCwgICAvLyAzIDw8IDIyXG4gIFdJRFRIX1NISUZUID0gMjJcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBiaXQgMS4uOCAgICAgYmx1ZSBpbiBSR0IsIGNvbG9yIGluIFAyNTYgYW5kIFAxNlxuICAgKi9cbiAgQkxVRV9NQVNLID0gMHhGRixcbiAgQkxVRV9TSElGVCA9IDAsXG4gIFBDT0xPUl9NQVNLID0gMHhGRixcbiAgUENPTE9SX1NISUZUID0gMCxcblxuICAvKipcbiAgICogYml0IDkuLjE2ICAgIGdyZWVuIGluIFJHQlxuICAgKi9cbiAgR1JFRU5fTUFTSyA9IDB4RkYwMCxcbiAgR1JFRU5fU0hJRlQgPSA4LFxuXG4gIC8qKlxuICAgKiBiaXQgMTcuLjI0ICAgcmVkIGluIFJHQlxuICAgKi9cbiAgUkVEX01BU0sgPSAweEZGMDAwMCxcbiAgUkVEX1NISUZUID0gMTYsXG5cbiAgLyoqXG4gICAqIGJpdCAyNS4uMjYgICBjb2xvciBtb2RlOiBERUZBVUxUICgwKSB8IFAxNiAoMSkgfCBQMjU2ICgyKSB8IFJHQiAoMylcbiAgICovXG4gIENNX01BU0sgPSAweDMwMDAwMDAsXG4gIENNX0RFRkFVTFQgPSAwLFxuICBDTV9QMTYgPSAweDEwMDAwMDAsXG4gIENNX1AyNTYgPSAweDIwMDAwMDAsXG4gIENNX1JHQiA9IDB4MzAwMDAwMCxcblxuICAvKipcbiAgICogYml0IDEuLjI0ICBSR0Igcm9vbVxuICAgKi9cbiAgUkdCX01BU0sgPSAweEZGRkZGRlxufVxuXG5leHBvcnQgY29uc3QgZW51bSBGZ0ZsYWdzIHtcbiAgLyoqXG4gICAqIGJpdCAyNy4uMzJcbiAgICovXG4gIElOVkVSU0UgPSAweDQwMDAwMDAsXG4gIEJPTEQgPSAweDgwMDAwMDAsXG4gIFVOREVSTElORSA9IDB4MTAwMDAwMDAsXG4gIEJMSU5LID0gMHgyMDAwMDAwMCxcbiAgSU5WSVNJQkxFID0gMHg0MDAwMDAwMCxcbiAgU1RSSUtFVEhST1VHSCA9IDB4ODAwMDAwMDAsXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEJnRmxhZ3Mge1xuICAvKipcbiAgICogYml0IDI3Li4zMiAodXBwZXIgMiB1bnVzZWQpXG4gICAqL1xuICBJVEFMSUMgPSAweDQwMDAwMDAsXG4gIERJTSA9IDB4ODAwMDAwMCxcbiAgSEFTX0VYVEVOREVEID0gMHgxMDAwMDAwMCxcbiAgUFJPVEVDVEVEID0gMHgyMDAwMDAwMCxcbiAgT1ZFUkxJTkUgPSAweDQwMDAwMDAwXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEV4dEZsYWdzIHtcbiAgLyoqXG4gICAqIGJpdCAyNy4uMjlcbiAgICovXG4gIFVOREVSTElORV9TVFlMRSA9IDB4MUMwMDAwMDAsXG5cbiAgLyoqXG4gICAqIGJpdCAzMC4uMzJcbiAgICpcbiAgICogQW4gb3B0aW9uYWwgdmFyaWFudCBmb3IgdGhlIGdseXBoLCB0aGlzIGNhbiBiZSB1c2VkIGZvciBleGFtcGxlIHRvIG9mZnNldCB1bmRlcmxpbmVzIGJ5IGFcbiAgICogbnVtYmVyIG9mIHBpeGVscyB0byBjcmVhdGUgYSBwZXJmZWN0IHBhdHRlcm4uXG4gICAqL1xuICBWQVJJQU5UX09GRlNFVCA9IDB4RTAwMDAwMDBcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gVW5kZXJsaW5lU3R5bGUge1xuICBOT05FID0gMCxcbiAgU0lOR0xFID0gMSxcbiAgRE9VQkxFID0gMixcbiAgQ1VSTFkgPSAzLFxuICBET1RURUQgPSA0LFxuICBEQVNIRUQgPSA1XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG4vKipcbiAqIFBvbHlmaWxsIC0gQ29udmVydCBVVEYzMiBjb2RlcG9pbnQgaW50byBKUyBzdHJpbmcuXG4gKiBOb3RlOiBUaGUgYnVpbHQtaW4gU3RyaW5nLmZyb21Db2RlUG9pbnQgaGFwcGVucyB0byBiZSBtdWNoIHNsb3dlclxuICogICAgICAgZHVlIHRvIGFkZGl0aW9uYWwgc2FuaXR5IGNoZWNrcy4gV2UgY2FuIGF2b2lkIHRoZW0gc2luY2VcbiAqICAgICAgIHdlIGFsd2F5cyBvcGVyYXRlIG9uIGxlZ2FsIFVURjMyIChncmFudGVkIGJ5IHRoZSBpbnB1dCBkZWNvZGVycylcbiAqICAgICAgIGFuZCB1c2UgdGhpcyBmYXN0ZXIgdmVyc2lvbiBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRnJvbUNvZGVQb2ludChjb2RlUG9pbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZVBvaW50ID4+IDEwKSArIDB4RDgwMCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlUG9pbnQgJSAweDQwMCkgKyAweERDMDApO1xuICB9XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG59XG5cbi8qKlxuICogQ29udmVydCBVVEYzMiBjaGFyIGNvZGVzIGludG8gSlMgc3RyaW5nLlxuICogQmFzaWNhbGx5IHRoZSBzYW1lIGFzIGBzdHJpbmdGcm9tQ29kZVBvaW50YCBidXQgZm9yIG11bHRpcGxlIGNvZGVwb2ludHNcbiAqIGluIGEgbG9vcCAod2hpY2ggaXMgYSBsb3QgZmFzdGVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV0ZjMyVG9TdHJpbmcoZGF0YTogVWludDMyQXJyYXksIHN0YXJ0OiBudW1iZXIgPSAwLCBlbmQ6IG51bWJlciA9IGRhdGEubGVuZ3RoKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIGxldCBjb2RlcG9pbnQgPSBkYXRhW2ldO1xuICAgIGlmIChjb2RlcG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIEpTIHN0cmluZ3MgYXJlIGVuY29kZWQgYXMgVVRGMTYsIHRodXMgYSBub24gQk1QIGNvZGVwb2ludCBnZXRzIGNvbnZlcnRlZCBpbnRvIGEgc3Vycm9nYXRlXG4gICAgICAvLyBwYWlyIGNvbnZlcnNpb24gcnVsZXM6XG4gICAgICAvLyAgLSBzdWJ0cmFjdCAweDEwMDAwIGZyb20gY29kZSBwb2ludCwgbGVhdmluZyBhIDIwIGJpdCBudW1iZXJcbiAgICAgIC8vICAtIGFkZCBoaWdoIDEwIGJpdHMgdG8gMHhEODAwICAtLT4gZmlyc3Qgc3Vycm9nYXRlXG4gICAgICAvLyAgLSBhZGQgbG93IDEwIGJpdHMgdG8gMHhEQzAwICAgLS0+IHNlY29uZCBzdXJyb2dhdGVcbiAgICAgIGNvZGVwb2ludCAtPSAweDEwMDAwO1xuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVwb2ludCA+PiAxMCkgKyAweEQ4MDApICsgU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZXBvaW50ICUgMHg0MDApICsgMHhEQzAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZXBvaW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmdUb1V0ZjMyIC0gZGVjb2RlcyBVVEYxNiBzZXF1ZW5jZXMgaW50byBVVEYzMiBjb2RlcG9pbnRzLlxuICogVG8ga2VlcCB0aGUgZGVjb2RlciBpbiBsaW5lIHdpdGggSlMgc3RyaW5ncyBpdCBoYW5kbGVzIHNpbmdsZSBzdXJyb2dhdGVzIGFzIFVDUzIuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpbmdUb1V0ZjMyIHtcbiAgcHJpdmF0ZSBfaW50ZXJpbTogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogQ2xlYXJzIGludGVyaW0gYW5kIHJlc2V0cyBkZWNvZGVyIHRvIGNsZWFuIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2ludGVyaW0gPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBKUyBzdHJpbmcgdG8gVVRGMzIgY29kZXBvaW50cy5cbiAgICogVGhlIG1ldGhvZHMgYXNzdW1lcyBzdHJlYW0gaW5wdXQgYW5kIHdpbGwgc3RvcmUgcGFydGx5IHRyYW5zbWl0dGVkXG4gICAqIHN1cnJvZ2F0ZSBwYWlycyBhbmQgZGVjb2RlIHRoZW0gd2l0aCB0aGUgbmV4dCBkYXRhIGNodW5rLlxuICAgKiBOb3RlOiBUaGUgbWV0aG9kIGRvZXMgbm8gYm91bmQgY2hlY2tzIGZvciB0YXJnZXQsIHRoZXJlZm9yZSBtYWtlIHN1cmVcbiAgICogdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEgZG9lcyBub3QgZXhjZWVkIHRoZSBzaXplIG9mIGB0YXJnZXRgLlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBjb2RlcG9pbnRzIGluIGB0YXJnZXRgLlxuICAgKi9cbiAgcHVibGljIGRlY29kZShpbnB1dDogc3RyaW5nLCB0YXJnZXQ6IFVpbnQzMkFycmF5KTogbnVtYmVyIHtcbiAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGxldCBzdGFydFBvcyA9IDA7XG5cbiAgICAvLyBoYW5kbGUgbGVmdG92ZXIgc3Vycm9nYXRlIGhpZ2hcbiAgICBpZiAodGhpcy5faW50ZXJpbSkge1xuICAgICAgY29uc3Qgc2Vjb25kID0gaW5wdXQuY2hhckNvZGVBdChzdGFydFBvcysrKTtcbiAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSAodGhpcy5faW50ZXJpbSAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCAoVVNDMiBoYW5kbGluZylcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSB0aGlzLl9pbnRlcmltO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IHNlY29uZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ludGVyaW0gPSAwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSBzdGFydFBvczsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBjb2RlID0gaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyIGZpcnN0XG4gICAgICBpZiAoMHhEODAwIDw9IGNvZGUgJiYgY29kZSA8PSAweERCRkYpIHtcbiAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLl9pbnRlcmltID0gY29kZTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWNvbmQgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoMHhEQzAwIDw9IHNlY29uZCAmJiBzZWNvbmQgPD0gMHhERkZGKSB7XG4gICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSAoY29kZSAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQgKFVTQzIgaGFuZGxpbmcpXG4gICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlO1xuICAgICAgICAgIHRhcmdldFtzaXplKytdID0gc2Vjb25kO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUgPT09IDB4RkVGRikge1xuICAgICAgICAvLyBCT01cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGU7XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xuICB9XG59XG5cbi8qKlxuICogVXRmOERlY29kZXIgLSBkZWNvZGVzIFVURjggYnl0ZSBzZXF1ZW5jZXMgaW50byBVVEYzMiBjb2RlcG9pbnRzLlxuICovXG5leHBvcnQgY2xhc3MgVXRmOFRvVXRmMzIge1xuICBwdWJsaWMgaW50ZXJpbTogVWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KDMpO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgaW50ZXJpbSBieXRlcyBhbmQgcmVzZXRzIGRlY29kZXIgdG8gY2xlYW4gc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcmltLmZpbGwoMCk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBVVEY4IGJ5dGUgc2VxdWVuY2VzIGluIGBpbnB1dGAgdG8gVVRGMzIgY29kZXBvaW50cyBpbiBgdGFyZ2V0YC5cbiAgICogVGhlIG1ldGhvZHMgYXNzdW1lcyBzdHJlYW0gaW5wdXQgYW5kIHdpbGwgc3RvcmUgcGFydGx5IHRyYW5zbWl0dGVkIGJ5dGVzXG4gICAqIGFuZCBkZWNvZGUgdGhlbSB3aXRoIHRoZSBuZXh0IGRhdGEgY2h1bmsuXG4gICAqIE5vdGU6IFRoZSBtZXRob2QgZG9lcyBubyBib3VuZCBjaGVja3MgZm9yIHRhcmdldCwgdGhlcmVmb3JlIG1ha2Ugc3VyZVxuICAgKiB0aGUgcHJvdmlkZWQgZGF0YSBjaHVuayBkb2VzIG5vdCBleGNlZWQgdGhlIHNpemUgb2YgYHRhcmdldGAuXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3cml0dGVuIGNvZGVwb2ludHMgaW4gYHRhcmdldGAuXG4gICAqL1xuICBwdWJsaWMgZGVjb2RlKGlucHV0OiBVaW50OEFycmF5LCB0YXJnZXQ6IFVpbnQzMkFycmF5KTogbnVtYmVyIHtcbiAgICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGxldCBieXRlMTogbnVtYmVyO1xuICAgIGxldCBieXRlMjogbnVtYmVyO1xuICAgIGxldCBieXRlMzogbnVtYmVyO1xuICAgIGxldCBieXRlNDogbnVtYmVyO1xuICAgIGxldCBjb2RlcG9pbnQgPSAwO1xuICAgIGxldCBzdGFydFBvcyA9IDA7XG5cbiAgICAvLyBoYW5kbGUgbGVmdG92ZXIgYnl0ZXNcbiAgICBpZiAodGhpcy5pbnRlcmltWzBdKSB7XG4gICAgICBsZXQgZGlzY2FyZEludGVyaW0gPSBmYWxzZTtcbiAgICAgIGxldCBjcCA9IHRoaXMuaW50ZXJpbVswXTtcbiAgICAgIGNwICY9ICgoKChjcCAmIDB4RTApID09PSAweEMwKSkgPyAweDFGIDogKCgoY3AgJiAweEYwKSA9PT0gMHhFMCkpID8gMHgwRiA6IDB4MDcpO1xuICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICBsZXQgdG1wOiBudW1iZXI7XG4gICAgICB3aGlsZSAoKHRtcCA9IHRoaXMuaW50ZXJpbVsrK3Bvc10gJiAweDNGKSAmJiBwb3MgPCA0KSB7XG4gICAgICAgIGNwIDw8PSA2O1xuICAgICAgICBjcCB8PSB0bXA7XG4gICAgICB9XG4gICAgICAvLyBtaXNzaW5nIGJ5dGVzIC0gcmVhZCBhaGVhZCBmcm9tIGlucHV0XG4gICAgICBjb25zdCB0eXBlID0gKCgodGhpcy5pbnRlcmltWzBdICYgMHhFMCkgPT09IDB4QzApKSA/IDIgOiAoKCh0aGlzLmludGVyaW1bMF0gJiAweEYwKSA9PT0gMHhFMCkpID8gMyA6IDQ7XG4gICAgICBjb25zdCBtaXNzaW5nID0gdHlwZSAtIHBvcztcbiAgICAgIHdoaWxlIChzdGFydFBvcyA8IG1pc3NpbmcpIHtcbiAgICAgICAgaWYgKHN0YXJ0UG9zID49IGxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHRtcCA9IGlucHV0W3N0YXJ0UG9zKytdO1xuICAgICAgICBpZiAoKHRtcCAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uLCBkaXNjYXJkIGludGVyaW0gYnl0ZXMgY29tcGxldGVseVxuICAgICAgICAgIHN0YXJ0UG9zLS07XG4gICAgICAgICAgZGlzY2FyZEludGVyaW0gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5lZWQgdG8gc2F2ZSBzbyB3ZSBjYW4gY29udGludWUgc2hvcnQgaW5wdXRzIGluIG5leHQgY2FsbFxuICAgICAgICAgIHRoaXMuaW50ZXJpbVtwb3MrK10gPSB0bXA7XG4gICAgICAgICAgY3AgPDw9IDY7XG4gICAgICAgICAgY3AgfD0gdG1wICYgMHgzRjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFkaXNjYXJkSW50ZXJpbSkge1xuICAgICAgICAvLyBmaW5hbCB0ZXN0IGlzIHR5cGUgZGVwZW5kZW50XG4gICAgICAgIGlmICh0eXBlID09PSAyKSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHg4MCkge1xuICAgICAgICAgICAgLy8gd3Jvbmcgc3RhcnRlciBieXRlXG4gICAgICAgICAgICBzdGFydFBvcy0tO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAzKSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHgwODAwIHx8IChjcCA+PSAweEQ4MDAgJiYgY3AgPD0gMHhERkZGKSB8fCBjcCA9PT0gMHhGRUZGKSB7XG4gICAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCBvciBCT01cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjcDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNwIDwgMHgwMTAwMDAgfHwgY3AgPiAweDEwRkZGRikge1xuICAgICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuaW50ZXJpbS5maWxsKDApO1xuICAgIH1cblxuICAgIC8vIGxvb3AgdGhyb3VnaCBpbnB1dFxuICAgIGNvbnN0IGZvdXJTdG9wID0gbGVuZ3RoIC0gNDtcbiAgICBsZXQgaSA9IHN0YXJ0UG9zO1xuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEFTQ0lJIHNob3J0Y3V0IHdpdGggbG9vcCB1bnJvbGxlZCB0byA0IGNvbnNlY3V0aXZlIEFTQ0lJIGNoYXJzLlxuICAgICAgICogVGhpcyBpcyBhIGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBnYWluIGZvciBBU0NJSVxuICAgICAgICogYW5kIHBlbmFsdHkgZm9yIG5vbiBBU0NJSTpcbiAgICAgICAqIEZvciBiZXN0IEFTQ0lJIHBlcmZvcm1hbmNlIHRoZSBjaGFyIHNob3VsZCBiZSBzdG9yZWQgZGlyZWN0bHkgaW50byB0YXJnZXQsXG4gICAgICAgKiBidXQgZXZlbiBhIHNpbmdsZSBhdHRlbXB0IHRvIHdyaXRlIHRvIHRhcmdldCBhbmQgY29tcGFyZSBhZnRlcndhcmRzXG4gICAgICAgKiBwZW5hbGl6ZXMgbm9uIEFTQ0lJIHJlYWxseSBiYWQgKC01MCUpLCB0aHVzIHdlIGxvYWQgdGhlIGNoYXIgaW50byBieXRlWCBmaXJzdCxcbiAgICAgICAqIHdoaWNoIHJlZHVjZXMgQVNDSUkgcGVyZm9ybWFuY2UgYnkgfjE1JS5cbiAgICAgICAqIFRoaXMgdHJpYWwgZm9yIEFTQ0lJIHJlZHVjZXMgbm9uIEFTQ0lJIHBlcmZvcm1hbmNlIGJ5IH4xMCUgd2hpY2ggc2VlbXMgYWNjZXB0aWJsZVxuICAgICAgICogY29tcGFyZWQgdG8gdGhlIGdhaW5zLlxuICAgICAgICogTm90ZSB0aGF0IHRoaXMgb3B0aW1pemF0aW9uIG9ubHkgdGFrZXMgcGxhY2UgZm9yIDQgY29uc2VjdXRpdmUgQVNDSUkgY2hhcnMsXG4gICAgICAgKiBmb3IgYW55IHNob3J0ZXIgaXQgYmFpbHMgb3V0LiBXb3JzdCBjYXNlIC0gYWxsIDQgYnl0ZXMgYmVpbmcgcmVhZCBidXRcbiAgICAgICAqIHRocm93biBhd2F5IGR1ZSB0byB0aGUgbGFzdCBiZWluZyBhIG5vbiBBU0NJSSBjaGFyICgtMTAlIHBlcmZvcm1hbmNlKS5cbiAgICAgICAqL1xuICAgICAgd2hpbGUgKGkgPCBmb3VyU3RvcFxuICAgICAgICAmJiAhKChieXRlMSA9IGlucHV0W2ldKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGUyID0gaW5wdXRbaSArIDFdKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGUzID0gaW5wdXRbaSArIDJdKSAmIDB4ODApXG4gICAgICAgICYmICEoKGJ5dGU0ID0gaW5wdXRbaSArIDNdKSAmIDB4ODApKVxuICAgICAge1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUxO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUyO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUzO1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGU0O1xuICAgICAgICBpICs9IDQ7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlcmVhZCBieXRlMVxuICAgICAgYnl0ZTEgPSBpbnB1dFtpKytdO1xuXG4gICAgICAvLyAxIGJ5dGVcbiAgICAgIGlmIChieXRlMSA8IDB4ODApIHtcbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBieXRlMTtcblxuICAgICAgICAvLyAyIGJ5dGVzXG4gICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4RTApID09PSAweEMwKSB7XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUyID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMiAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludCA9IChieXRlMSAmIDB4MUYpIDw8IDYgfCAoYnl0ZTIgJiAweDNGKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCA8IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBzdGFydGVyIGJ5dGVcbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlcG9pbnQ7XG5cbiAgICAgICAgLy8gMyBieXRlc1xuICAgICAgfSBlbHNlIGlmICgoYnl0ZTEgJiAweEYwKSA9PT0gMHhFMCkge1xuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMiA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTIgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMF0gPSBieXRlMTtcbiAgICAgICAgICB0aGlzLmludGVyaW1bMV0gPSBieXRlMjtcbiAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBieXRlMyA9IGlucHV0W2krK107XG4gICAgICAgIGlmICgoYnl0ZTMgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIGNvbnRpbnVhdGlvblxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb2RlcG9pbnQgPSAoYnl0ZTEgJiAweDBGKSA8PCAxMiB8IChieXRlMiAmIDB4M0YpIDw8IDYgfCAoYnl0ZTMgJiAweDNGKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCA8IDB4MDgwMCB8fCAoY29kZXBvaW50ID49IDB4RDgwMCAmJiBjb2RlcG9pbnQgPD0gMHhERkZGKSB8fCBjb2RlcG9pbnQgPT09IDB4RkVGRikge1xuICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50IG9yIEJPTSwgbm8gaS0tIGhlcmVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGVwb2ludDtcblxuICAgICAgICAvLyA0IGJ5dGVzXG4gICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4RjgpID09PSAweEYwKSB7XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUyID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMiAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsxXSA9IGJ5dGUyO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUzID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMyAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsxXSA9IGJ5dGUyO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsyXSA9IGJ5dGUzO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGU0ID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlNCAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludCA9IChieXRlMSAmIDB4MDcpIDw8IDE4IHwgKGJ5dGUyICYgMHgzRikgPDwgMTIgfCAoYnl0ZTMgJiAweDNGKSA8PCA2IHwgKGJ5dGU0ICYgMHgzRik7XG4gICAgICAgIGlmIChjb2RlcG9pbnQgPCAweDAxMDAwMCB8fCBjb2RlcG9pbnQgPiAweDEwRkZGRikge1xuICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50LCBubyBpLS0gaGVyZVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gY29kZXBvaW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWxsZWdhbCBieXRlLCBqdXN0IHNraXBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG4gIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElMb2dTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UsIExvZ0xldmVsRW51bSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbnR5cGUgTG9nVHlwZSA9IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+IHZvaWQ7XG5cbmludGVyZmFjZSBJQ29uc29sZSB7XG4gIGxvZzogTG9nVHlwZTtcbiAgZXJyb3I6IExvZ1R5cGU7XG4gIGluZm86IExvZ1R5cGU7XG4gIHRyYWNlOiBMb2dUeXBlO1xuICB3YXJuOiBMb2dUeXBlO1xufVxuXG4vLyBjb25zb2xlIGlzIGF2YWlsYWJsZSBvbiBib3RoIG5vZGUuanMgYW5kIGJyb3dzZXIgY29udGV4dHMgYnV0IHRoZSBjb21tb25cbi8vIG1vZHVsZSBkb2Vzbid0IGRlcGVuZCBvbiB0aGVtIHNvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBkZWNsYXJlIGl0LlxuZGVjbGFyZSBjb25zdCBjb25zb2xlOiBJQ29uc29sZTtcblxuY29uc3Qgb3B0aW9uc0tleVRvTG9nTGV2ZWw6IHsgW2tleTogc3RyaW5nXTogTG9nTGV2ZWxFbnVtIH0gPSB7XG4gIHRyYWNlOiBMb2dMZXZlbEVudW0uVFJBQ0UsXG4gIGRlYnVnOiBMb2dMZXZlbEVudW0uREVCVUcsXG4gIGluZm86IExvZ0xldmVsRW51bS5JTkZPLFxuICB3YXJuOiBMb2dMZXZlbEVudW0uV0FSTixcbiAgZXJyb3I6IExvZ0xldmVsRW51bS5FUlJPUixcbiAgb2ZmOiBMb2dMZXZlbEVudW0uT0ZGXG59O1xuXG5jb25zdCBMT0dfUFJFRklYID0gJ3h0ZXJtLmpzOiAnO1xuXG5leHBvcnQgY2xhc3MgTG9nU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJTG9nU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IGFueTtcblxuICBwcml2YXRlIF9sb2dMZXZlbDogTG9nTGV2ZWxFbnVtID0gTG9nTGV2ZWxFbnVtLk9GRjtcbiAgcHVibGljIGdldCBsb2dMZXZlbCgpOiBMb2dMZXZlbEVudW0geyByZXR1cm4gdGhpcy5fbG9nTGV2ZWw7IH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl91cGRhdGVMb2dMZXZlbCgpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgnbG9nTGV2ZWwnLCAoKSA9PiB0aGlzLl91cGRhdGVMb2dMZXZlbCgpKSk7XG5cbiAgICAvLyBGb3IgdHJhY2UgbG9nZ2luZywgYXNzdW1lIHRoZSBsYXRlc3QgY3JlYXRlZCBsb2cgc2VydmljZSBpcyB2YWxpZFxuICAgIHRyYWNlTG9nZ2VyID0gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUxvZ0xldmVsKCk6IHZvaWQge1xuICAgIHRoaXMuX2xvZ0xldmVsID0gb3B0aW9uc0tleVRvTG9nTGV2ZWxbdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sb2dMZXZlbF07XG4gIH1cblxuICBwcml2YXRlIF9ldmFsTGF6eU9wdGlvbmFsUGFyYW1zKG9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9uYWxQYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uYWxQYXJhbXNbaV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3B0aW9uYWxQYXJhbXNbaV0gPSBvcHRpb25hbFBhcmFtc1tpXSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xvZyh0eXBlOiBMb2dUeXBlLCBtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIHRoaXMuX2V2YWxMYXp5T3B0aW9uYWxQYXJhbXMob3B0aW9uYWxQYXJhbXMpO1xuICAgIHR5cGUuY2FsbChjb25zb2xlLCAodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIgPyAnJyA6IExPR19QUkVGSVgpICsgbWVzc2FnZSwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgcHVibGljIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5UUkFDRSkge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy50cmFjZS5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLmxvZywgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uREVCVUcpIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8uZGVidWcuYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS5sb2csIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uSU5GTykge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy5pbmZvLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUuaW5mbywgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5XQVJOKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/Lndhcm4uYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS53YXJuLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5FUlJPUikge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy5lcnJvci5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLmVycm9yLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG59XG5cbmxldCB0cmFjZUxvZ2dlcjogSUxvZ1NlcnZpY2U7XG5leHBvcnQgZnVuY3Rpb24gc2V0VHJhY2VMb2dnZXIobG9nZ2VyOiBJTG9nU2VydmljZSk6IHZvaWQge1xuICB0cmFjZUxvZ2dlciA9IGxvZ2dlcjtcbn1cblxuLyoqXG4gKiBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgbG9nIHRyYWNlIGNhbGxzIHRvIHRoZSBkZWNvcmF0ZWQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFjZUNhbGwoX3RhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzY3JpcHRvcjogYW55KTogYW55IHtcbiAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkJyk7XG4gIH1cbiAgY29uc3QgZm5LZXkgPSAndmFsdWUnO1xuICBjb25zdCBmbiA9IGRlc2NyaXB0b3IudmFsdWU7XG4gIGRlc2NyaXB0b3JbZm5LZXldID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgLy8gRWFybHkgZXhpdFxuICAgIGlmICh0cmFjZUxvZ2dlci5sb2dMZXZlbCAhPT0gTG9nTGV2ZWxFbnVtLlRSQUNFKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuXG4gICAgdHJhY2VMb2dnZXIudHJhY2UoYEdseXBoUmVuZGVyZXIjJHtmbi5uYW1lfSgke2FyZ3MubWFwKGUgPT4gSlNPTi5zdHJpbmdpZnkoZSkpLmpvaW4oJywgJyl9KWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIHRyYWNlTG9nZ2VyLnRyYWNlKGBHbHlwaFJlbmRlcmVyIyR7Zm4ubmFtZX0gcmV0dXJuYCwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogVGhpcyB3YXMgaGVhdmlseSBpbnNwaXJlZCBmcm9tIG1pY3Jvc29mdC92c2NvZGUncyBkZXBlbmRlbmN5IGluamVjdGlvbiBzeXN0ZW0gKE1JVCkuXG4gKi9cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBJU2VydmljZUlkZW50aWZpZXIgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5jb25zdCBESV9UQVJHRVQgPSAnZGkkdGFyZ2V0JztcbmNvbnN0IERJX0RFUEVOREVOQ0lFUyA9ICdkaSRkZXBlbmRlbmNpZXMnO1xuXG5leHBvcnQgY29uc3Qgc2VydmljZVJlZ2lzdHJ5OiBNYXA8c3RyaW5nLCBJU2VydmljZUlkZW50aWZpZXI8YW55Pj4gPSBuZXcgTWFwKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlRGVwZW5kZW5jaWVzKGN0b3I6IGFueSk6IHsgaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxhbnk+LCBpbmRleDogbnVtYmVyLCBvcHRpb25hbDogYm9vbGVhbiB9W10ge1xuICByZXR1cm4gY3RvcltESV9ERVBFTkRFTkNJRVNdIHx8IFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVjb3JhdG9yPFQ+KGlkOiBzdHJpbmcpOiBJU2VydmljZUlkZW50aWZpZXI8VD4ge1xuICBpZiAoc2VydmljZVJlZ2lzdHJ5LmhhcyhpZCkpIHtcbiAgICByZXR1cm4gc2VydmljZVJlZ2lzdHJ5LmdldChpZCkhO1xuICB9XG5cbiAgY29uc3QgZGVjb3JhdG9yOiBhbnkgPSBmdW5jdGlvbiAodGFyZ2V0OiBGdW5jdGlvbiwga2V5OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BJU2VydmljZU5hbWUtZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgdG8gZGVjb3JhdGUgYSBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICBzdG9yZVNlcnZpY2VEZXBlbmRlbmN5KGRlY29yYXRvciwgdGFyZ2V0LCBpbmRleCk7XG4gIH07XG5cbiAgZGVjb3JhdG9yLnRvU3RyaW5nID0gKCkgPT4gaWQ7XG5cbiAgc2VydmljZVJlZ2lzdHJ5LnNldChpZCwgZGVjb3JhdG9yKTtcbiAgcmV0dXJuIGRlY29yYXRvcjtcbn1cblxuZnVuY3Rpb24gc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShpZDogRnVuY3Rpb24sIHRhcmdldDogRnVuY3Rpb24sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCh0YXJnZXQgYXMgYW55KVtESV9UQVJHRVRdID09PSB0YXJnZXQpIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXS5wdXNoKHsgaWQsIGluZGV4IH0pO1xuICB9IGVsc2Uge1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9ERVBFTkRFTkNJRVNdID0gW3sgaWQsIGluZGV4IH1dO1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9UQVJHRVRdID0gdGFyZ2V0O1xuICB9XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRXZlbnQsIElFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IElCdWZmZXIsIElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElEZWNQcml2YXRlTW9kZXMsIElDb3JlTW91c2VFdmVudCwgQ29yZU1vdXNlRW5jb2RpbmcsIElDb3JlTW91c2VQcm90b2NvbCwgQ29yZU1vdXNlRXZlbnRUeXBlLCBJQ2hhcnNldCwgSVdpbmRvd09wdGlvbnMsIElNb2RlcywgSUF0dHJpYnV0ZURhdGEsIFNjcm9sbFNvdXJjZSwgSURpc3Bvc2FibGUsIElDb2xvciwgQ3Vyc29yU3R5bGUsIEN1cnNvckluYWN0aXZlU3R5bGUsIElPc2NMaW5rRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVEZWNvcmF0b3IgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IElEZWNvcmF0aW9uT3B0aW9ucywgSURlY29yYXRpb24sIElMaW5rSGFuZGxlciwgSVdpbmRvd3NQdHksIElMb2dnZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgY29uc3QgSUJ1ZmZlclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUJ1ZmZlclNlcnZpY2U+KCdCdWZmZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElCdWZmZXJTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgY29sczogbnVtYmVyO1xuICByZWFkb25seSByb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJ1ZmZlcjogSUJ1ZmZlcjtcbiAgcmVhZG9ubHkgYnVmZmVyczogSUJ1ZmZlclNldDtcbiAgaXNVc2VyU2Nyb2xsaW5nOiBib29sZWFuO1xuICBvblJlc2l6ZTogSUV2ZW50PHsgY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIgfT47XG4gIG9uU2Nyb2xsOiBJRXZlbnQ8bnVtYmVyPjtcbiAgc2Nyb2xsKGVyYXNlQXR0cjogSUF0dHJpYnV0ZURhdGEsIGlzV3JhcHBlZD86IGJvb2xlYW4pOiB2b2lkO1xuICBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ/OiBib29sZWFuLCBzb3VyY2U/OiBTY3JvbGxTb3VyY2UpOiB2b2lkO1xuICByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNvcmVNb3VzZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNvcmVNb3VzZVNlcnZpY2U+KCdDb3JlTW91c2VTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDb3JlTW91c2VTZXJ2aWNlIHtcbiAgYWN0aXZlUHJvdG9jb2w6IHN0cmluZztcbiAgYWN0aXZlRW5jb2Rpbmc6IHN0cmluZztcbiAgYXJlTW91c2VFdmVudHNBY3RpdmU6IGJvb2xlYW47XG4gIGFkZFByb3RvY29sKG5hbWU6IHN0cmluZywgcHJvdG9jb2w6IElDb3JlTW91c2VQcm90b2NvbCk6IHZvaWQ7XG4gIGFkZEVuY29kaW5nKG5hbWU6IHN0cmluZywgZW5jb2Rpbmc6IENvcmVNb3VzZUVuY29kaW5nKTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBtb3VzZSBldmVudCB0byBiZSBzZW50LlxuICAgKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHBhc3NlZCBhbGwgcHJvdG9jb2wgcmVzdHJpY3Rpb25zIGFuZCBhIHJlcG9ydFxuICAgKiB3YXMgc2VudCwgb3RoZXJ3aXNlIGZhbHNlLiBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyXG4gICAqIHRoZSBkZWZhdWx0IGV2ZW50IGFjdGlvbiBpbiB0aGUgYm93c2VyIGNvbXBvbmVudCBzaG91bGQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogTm90ZTogVGhlIG1ldGhvZCB3aWxsIGNoYW5nZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGV2ZW50IG9iamVjdFxuICAgKiB0byBmdWxsZmlsbCBwcm90b2NvbCBhbmQgZW5jb2RpbmcgcmVzdHJpY3Rpb25zLlxuICAgKi9cbiAgdHJpZ2dlck1vdXNlRXZlbnQoZXZlbnQ6IElDb3JlTW91c2VFdmVudCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV2ZW50IHRvIGFubm91bmNlIGNoYW5nZXMgaW4gbW91c2UgdHJhY2tpbmcuXG4gICAqL1xuICBvblByb3RvY29sQ2hhbmdlOiBJRXZlbnQ8Q29yZU1vdXNlRXZlbnRUeXBlPjtcblxuICAvKipcbiAgICogSHVtYW4gcmVhZGFibGUgdmVyc2lvbiBvZiBtb3VzZSBldmVudHMuXG4gICAqL1xuICBleHBsYWluRXZlbnRzKGV2ZW50czogQ29yZU1vdXNlRXZlbnRUeXBlKTogeyBbZXZlbnQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbn1cblxuZXhwb3J0IGNvbnN0IElDb3JlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZVNlcnZpY2U+KCdDb3JlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ29yZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5pdGlhbGx5IHRoZSBjdXJzb3Igd2lsbCBub3QgYmUgdmlzaWJsZSB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGUgdGVybWluYWxcbiAgICogaXMgZm9jdXNlZC5cbiAgICovXG4gIGlzQ3Vyc29ySW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIGlzQ3Vyc29ySGlkZGVuOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IG1vZGVzOiBJTW9kZXM7XG4gIHJlYWRvbmx5IGRlY1ByaXZhdGVNb2RlczogSURlY1ByaXZhdGVNb2RlcztcblxuICByZWFkb25seSBvbkRhdGE6IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblVzZXJJbnB1dDogSUV2ZW50PHZvaWQ+O1xuICByZWFkb25seSBvbkJpbmFyeTogSUV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uUmVxdWVzdFNjcm9sbFRvQm90dG9tOiBJRXZlbnQ8dm9pZD47XG5cbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIG9uRGF0YSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKiBAcGFyYW0gd2FzVXNlcklucHV0IFdoZXRoZXIgdGhlIGRhdGEgb3JpZ2luYXRlZCBmcm9tIHRoZSB1c2VyIChhcyBvcHBvc2VkIHRvXG4gICAqIHJlc3VsdGluZyBmcm9tIHBhcnNpbmcgaW5jb21pbmcgZGF0YSkuIFdoZW4gdHJ1ZSB0aGlzIHdpbGwgYWxzbzpcbiAgICogLSBTY3JvbGwgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYnVmZmVyIGlmIG9wdGlvbiBzY3JvbGxPblVzZXJJbnB1dCBpcyB0cnVlLlxuICAgKiAtIEZpcmUgdGhlIGBvblVzZXJJbnB1dGAgZXZlbnQgKHNvIHNlbGVjdGlvbiBjYW4gYmUgY2xlYXJlZCkuXG4gICAqL1xuICB0cmlnZ2VyRGF0YUV2ZW50KGRhdGE6IHN0cmluZywgd2FzVXNlcklucHV0PzogYm9vbGVhbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBvbkJpbmFyeSBldmVudCBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdGhhdCBpcyBiZWluZyBlbWl0dGVkLlxuICAgKi9cbiAgdHJpZ2dlckJpbmFyeUV2ZW50KGRhdGE6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJQ2hhcnNldFNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNoYXJzZXRTZXJ2aWNlPignQ2hhcnNldFNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXJzZXRTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGdsZXZlbDogbnVtYmVyO1xuXG4gIHJlc2V0KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqL1xuICBzZXRnTGV2ZWwoZzogbnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBjaGFyc2V0IGZvciB0aGUgZ2l2ZW4gRyBsZXZlbCBvZiB0aGUgdGVybWluYWwuXG4gICAqIEBwYXJhbSBnXG4gICAqIEBwYXJhbSBjaGFyc2V0XG4gICAqL1xuICBzZXRnQ2hhcnNldChnOiBudW1iZXIsIGNoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VydmljZUlkZW50aWZpZXI8VD4ge1xuICAoLi4uYXJnczogYW55W10pOiB2b2lkO1xuICB0eXBlOiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCcmFuZGVkU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xufVxuXG50eXBlIEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxUQXJncyBleHRlbmRzIGFueVtdPiA9IFRBcmdzIGV4dGVuZHMgW10gPyBbXVxuICA6IFRBcmdzIGV4dGVuZHMgWy4uLmluZmVyIFRGaXJzdCwgaW5mZXIgVExhc3RdID8gVExhc3QgZXh0ZW5kcyBJQnJhbmRlZFNlcnZpY2UgPyBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8VEZpcnN0PiA6IFRBcmdzXG4gICAgOiBuZXZlcjtcblxuZXhwb3J0IGNvbnN0IElJbnN0YW50aWF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJSW5zdGFudGlhdGlvblNlcnZpY2U+KCdJbnN0YW50aWF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJSW5zdGFudGlhdGlvblNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBzZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4sIGluc3RhbmNlOiBUKTogdm9pZDtcbiAgZ2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+KTogVCB8IHVuZGVmaW5lZDtcbiAgY3JlYXRlSW5zdGFuY2U8Q3RvciBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSwgUiBleHRlbmRzIEluc3RhbmNlVHlwZTxDdG9yPj4odDogQ3RvciwgLi4uYXJnczogR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPENvbnN0cnVjdG9yUGFyYW1ldGVyczxDdG9yPj4pOiBSO1xufVxuXG5leHBvcnQgZW51bSBMb2dMZXZlbEVudW0ge1xuICBUUkFDRSA9IDAsXG4gIERFQlVHID0gMSxcbiAgSU5GTyA9IDIsXG4gIFdBUk4gPSAzLFxuICBFUlJPUiA9IDQsXG4gIE9GRiA9IDVcbn1cblxuZXhwb3J0IGNvbnN0IElMb2dTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElMb2dTZXJ2aWNlPignTG9nU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJTG9nU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGxvZ0xldmVsOiBMb2dMZXZlbEVudW07XG5cbiAgdHJhY2UobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSU9wdGlvbnNTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPcHRpb25zU2VydmljZT4oJ09wdGlvbnNTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25zU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZWFkIG9ubHkgYWNjZXNzIHRvIHRoZSByYXcgb3B0aW9ucyBvYmplY3QsIHRoaXMgaXMgYW4gaW50ZXJuYWwtb25seSBmYXN0IHBhdGggZm9yIGFjY2Vzc2luZ1xuICAgKiBzaW5nbGUgb3B0aW9ucyB3aXRob3V0IGFueSB2YWxpZGF0aW9uIGFzIHdlIHRydXN0IFR5cGVTY3JpcHQgdG8gZW5mb3JjZSBjb3JyZWN0IHVzYWdlXG4gICAqIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSByYXdPcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogT3B0aW9ucyBhcyBleHBvc2VkIHRocm91Z2ggdGhlIHB1YmxpYyBBUEksIHRoaXMgcHJvcGVydHkgdXNlcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdpdGhcbiAgICogdmFsaWRhdGlvbiB3aGljaCBtYWtlcyBpdCBzYWZlciBidXQgc2xvd2VyLiB7QGxpbmsgcmF3T3B0aW9uc30gc2hvdWxkIGJlIHVzZWQgZm9yIHByZXR0eSBtdWNoXG4gICAqIGFsbCBpbnRlcm5hbCB1c2FnZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGFueSBvcHRpb24gY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG9uT3B0aW9uQ2hhbmdlOiBJRXZlbnQ8a2V5b2YgSVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYSBzcGVjaWZpYyBvcHRpb24gY2hhbmdlcywgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGlzXG4gICAqIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBvbmx5IGEgc2luZ2xlIG9wdGlvbiBpcyBiZWluZyBsaXN0ZW5lZCB0by5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgb25TcGVjaWZpY09wdGlvbkNoYW5nZTxUIGV4dGVuZHMga2V5b2YgSVRlcm1pbmFsT3B0aW9ucz4oa2V5OiBULCBsaXN0ZW5lcjogKGFyZzE6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+W1RdKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhIHNldCBvZiBzcGVjaWZpYyBvcHRpb25zIGNoYW5nZSwgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZFxuICAgKiB0aGF0IGlzIHByZWZlcnJlZCBvdmVyIHtAbGluayBvbk9wdGlvbkNoYW5nZX0gd2hlbiBtdWx0aXBsZSBvcHRpb25zIGFyZSBiZWluZyBsaXN0ZW5lZCB0byBhbmRcbiAgICogaGFuZGxlZCB0aGUgc2FtZSB3YXkuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIG9uTXVsdGlwbGVPcHRpb25DaGFuZ2Uoa2V5czogKGtleW9mIElUZXJtaW5hbE9wdGlvbnMpW10sIGxpc3RlbmVyOiAoKSA9PiBhbnkpOiBJRGlzcG9zYWJsZTtcbn1cblxuZXhwb3J0IHR5cGUgRm9udFdlaWdodCA9ICdub3JtYWwnIHwgJ2JvbGQnIHwgJzEwMCcgfCAnMjAwJyB8ICczMDAnIHwgJzQwMCcgfCAnNTAwJyB8ICc2MDAnIHwgJzcwMCcgfCAnODAwJyB8ICc5MDAnIHwgbnVtYmVyO1xuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAndHJhY2UnIHwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnb2ZmJztcblxuZXhwb3J0IGludGVyZmFjZSBJVGVybWluYWxPcHRpb25zIHtcbiAgYWxsb3dQcm9wb3NlZEFwaT86IGJvb2xlYW47XG4gIGFsbG93VHJhbnNwYXJlbmN5PzogYm9vbGVhbjtcbiAgYWx0Q2xpY2tNb3Zlc0N1cnNvcj86IGJvb2xlYW47XG4gIGNvbHM/OiBudW1iZXI7XG4gIGNvbnZlcnRFb2w/OiBib29sZWFuO1xuICBjdXJzb3JCbGluaz86IGJvb2xlYW47XG4gIGN1cnNvclN0eWxlPzogQ3Vyc29yU3R5bGU7XG4gIGN1cnNvcldpZHRoPzogbnVtYmVyO1xuICBjdXJzb3JJbmFjdGl2ZVN0eWxlPzogQ3Vyc29ySW5hY3RpdmVTdHlsZTtcbiAgY3VzdG9tR2x5cGhzPzogYm9vbGVhbjtcbiAgZGlzYWJsZVN0ZGluPzogYm9vbGVhbjtcbiAgZG9jdW1lbnRPdmVycmlkZT86IGFueSB8IG51bGw7XG4gIGRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzPzogYm9vbGVhbjtcbiAgZmFzdFNjcm9sbE1vZGlmaWVyPzogJ25vbmUnIHwgJ2FsdCcgfCAnY3RybCcgfCAnc2hpZnQnO1xuICBmYXN0U2Nyb2xsU2Vuc2l0aXZpdHk/OiBudW1iZXI7XG4gIGZvbnRTaXplPzogbnVtYmVyO1xuICBmb250RmFtaWx5Pzogc3RyaW5nO1xuICBmb250V2VpZ2h0PzogRm9udFdlaWdodDtcbiAgZm9udFdlaWdodEJvbGQ/OiBGb250V2VpZ2h0O1xuICBpZ25vcmVCcmFja2V0ZWRQYXN0ZU1vZGU/OiBib29sZWFuO1xuICBsZXR0ZXJTcGFjaW5nPzogbnVtYmVyO1xuICBsaW5lSGVpZ2h0PzogbnVtYmVyO1xuICBsaW5rSGFuZGxlcj86IElMaW5rSGFuZGxlciB8IG51bGw7XG4gIGxvZ0xldmVsPzogTG9nTGV2ZWw7XG4gIGxvZ2dlcj86IElMb2dnZXIgfCBudWxsO1xuICBtYWNPcHRpb25Jc01ldGE/OiBib29sZWFuO1xuICBtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbj86IGJvb2xlYW47XG4gIG1pbmltdW1Db250cmFzdFJhdGlvPzogbnVtYmVyO1xuICByZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHM/OiBib29sZWFuO1xuICByaWdodENsaWNrU2VsZWN0c1dvcmQ/OiBib29sZWFuO1xuICByb3dzPzogbnVtYmVyO1xuICBzY3JlZW5SZWFkZXJNb2RlPzogYm9vbGVhbjtcbiAgc2Nyb2xsYmFjaz86IG51bWJlcjtcbiAgc2Nyb2xsT25Vc2VySW5wdXQ/OiBib29sZWFuO1xuICBzY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoU2Nyb2xsRHVyYXRpb24/OiBudW1iZXI7XG4gIHRhYlN0b3BXaWR0aD86IG51bWJlcjtcbiAgdGhlbWU/OiBJVGhlbWU7XG4gIHdpbmRvd3NNb2RlPzogYm9vbGVhbjtcbiAgd2luZG93c1B0eT86IElXaW5kb3dzUHR5O1xuICB3aW5kb3dPcHRpb25zPzogSVdpbmRvd09wdGlvbnM7XG4gIHdvcmRTZXBhcmF0b3I/OiBzdHJpbmc7XG4gIG92ZXJ2aWV3UnVsZXJXaWR0aD86IG51bWJlcjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGNhbmNlbEV2ZW50czogYm9vbGVhbjtcbiAgdGVybU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGhlbWUge1xuICBmb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGN1cnNvckFjY2VudD86IHN0cmluZztcbiAgc2VsZWN0aW9uRm9yZWdyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uQmFja2dyb3VuZD86IHN0cmluZztcbiAgc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBibGFjaz86IHN0cmluZztcbiAgcmVkPzogc3RyaW5nO1xuICBncmVlbj86IHN0cmluZztcbiAgeWVsbG93Pzogc3RyaW5nO1xuICBibHVlPzogc3RyaW5nO1xuICBtYWdlbnRhPzogc3RyaW5nO1xuICBjeWFuPzogc3RyaW5nO1xuICB3aGl0ZT86IHN0cmluZztcbiAgYnJpZ2h0QmxhY2s/OiBzdHJpbmc7XG4gIGJyaWdodFJlZD86IHN0cmluZztcbiAgYnJpZ2h0R3JlZW4/OiBzdHJpbmc7XG4gIGJyaWdodFllbGxvdz86IHN0cmluZztcbiAgYnJpZ2h0Qmx1ZT86IHN0cmluZztcbiAgYnJpZ2h0TWFnZW50YT86IHN0cmluZztcbiAgYnJpZ2h0Q3lhbj86IHN0cmluZztcbiAgYnJpZ2h0V2hpdGU/OiBzdHJpbmc7XG4gIGV4dGVuZGVkQW5zaT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgSU9zY0xpbmtTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElPc2NMaW5rU2VydmljZT4oJ09zY0xpbmtTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElPc2NMaW5rU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGluayB0byB0aGUgc2VydmljZSwgcmV0dXJuaW5nIHRoZSBsaW5rIElELiBUaGUgbGluayBkYXRhIGlzIG1hbmFnZWQgYnkgdGhpc1xuICAgKiBzZXJ2aWNlIGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhpcyBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpcyB0cmltbWVkIG9mZiB0aGUgYnVmZmVyLlxuICAgKi9cbiAgcmVnaXN0ZXJMaW5rKGxpbmtEYXRhOiBJT3NjTGlua0RhdGEpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBZGRzIGEgbGluZSB0byBhIGxpbmsgaWYgbmVlZGVkLlxuICAgKi9cbiAgYWRkTGluZVRvTGluayhsaW5rSWQ6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEdldCB0aGUgbGluayBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsgSUQuICovXG4gIGdldExpbmtEYXRhKGxpbmtJZDogbnVtYmVyKTogSU9zY0xpbmtEYXRhIHwgdW5kZWZpbmVkO1xufVxuXG4vKlxuICogV2lkdGggYW5kIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWsgcHJvcGVydGllcyBvZiBhIGNoYXJhY3RlciBhcyBhIGJpdCBtYXNrLlxuICpcbiAqIGJpdCAwOiBzaG91bGRKb2luIC0gc2hvdWxkIGNvbWJpbmUgd2l0aCBwcmVjZWRpbmcgY2hhcmFjdGVyLlxuICogYml0IDEuLjI6IHdjd2lkdGggLSBzZWUgVW5pY29kZUNoYXJXaWR0aC5cbiAqIGJpdCAzLi4zMTogY2xhc3Mgb2YgY2hhcmFjdGVyIChjdXJyZW50bHkgb25seSA0IGJpdHMgYXJlIHVzZWQpLlxuICogICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lZCBncmFwaGVtZSBjbHVzdGVyaW5nIC0gaS5lLiB3aGljaCBjb2RlcG9pbnRzXG4gKiAgIGFyZSB0byBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGNvbXBvdW5kIGNoYXJhY3Rlci5cbiAqXG4gKiBVc2UgdGhlIFVuaWNvZGVTZXJ2aWNlIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eVZhbHVlIHRvIGNyZWF0ZSBhXG4gKiBVbmljb2RlQ2hhclByb3BlcnRpZXM7IHVzZSBleHRyYWN0U2hvdWxkSm9pbiwgZXh0cmFjdFdpZHRoLCBhbmRcbiAqIGV4dHJhY3RDaGFyS2luZCB0byBleHRyYWN0IHRoZSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgdHlwZSBVbmljb2RlQ2hhclByb3BlcnRpZXMgPSBudW1iZXI7XG5cbi8qKlxuICogV2lkdGggaW4gY29sdW1ucyBvZiBhIGNoYXJhY3Rlci5cbiAqIEluIGEgQ0pLIGNvbnRleHQsIFwiaGFsZi13aWR0aFwiIGNoYXJhY3RlcnMgKHN1Y2ggYXMgTGF0aW4pIGFyZSB3aWR0aCAxLFxuICogd2hpbGUgXCJmdWxsLXdpZHRoXCIgY2hhcmFjdGVycyAoc3VjaCBhcyBLYW5qaSkgYXJlIDIgY29sdW1ucyB3aWRlLlxuICogQ29tYmluaW5nIGNoYXJhY3RlcnMgKHN1Y2ggYXMgYWNjZW50cykgYXJlIHdpZHRoIDAuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaWNvZGVDaGFyV2lkdGggPSAwIHwgMSB8IDI7XG5cbmV4cG9ydCBjb25zdCBJVW5pY29kZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SVVuaWNvZGVTZXJ2aWNlPignVW5pY29kZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSVVuaWNvZGVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIC8qKiBSZWdpc3RlciBhbiBVbmljb2RlIHZlcnNpb24gcHJvdmlkZXIuICovXG4gIHJlZ2lzdGVyKHByb3ZpZGVyOiBJVW5pY29kZVZlcnNpb25Qcm92aWRlcik6IHZvaWQ7XG4gIC8qKiBSZWdpc3RlcmVkIFVuaWNvZGUgdmVyc2lvbnMuICovXG4gIHJlYWRvbmx5IHZlcnNpb25zOiBzdHJpbmdbXTtcbiAgLyoqIEN1cnJlbnRseSBhY3RpdmUgdmVyc2lvbi4gKi9cbiAgYWN0aXZlVmVyc2lvbjogc3RyaW5nO1xuICAvKiogRXZlbnQgdHJpZ2dlcmVkLCB3aGVuIGFjdGl2YXRlIHZlcnNpb24gY2hhbmdlZC4gKi9cbiAgcmVhZG9ubHkgb25DaGFuZ2U6IElFdmVudDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBVbmljb2RlIHZlcnNpb24gZGVwZW5kZW50XG4gICAqL1xuICB3Y3dpZHRoKGNvZGVwb2ludDogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aDtcbiAgZ2V0U3RyaW5nQ2VsbFdpZHRoKHM6IHN0cmluZyk6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybiBjaGFyYWN0ZXIgd2lkdGggYW5kIHR5cGUgZm9yIGdyYXBoZW1lIGNsdXN0ZXJpbmcuXG4gICAqIElmIHByZWNlZGluZyAhPSAwLCBpdCBpcyB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcHJldmlvdXMgY2hhcmFjdGVyO1xuICAgKiBpbiB0aGF0IGNhc2UgdGhlIHJlc3VsdCBzcGVjaWZpZXMgaWYgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGpvaW5lZC5cbiAgICovXG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVW5pY29kZVZlcnNpb25Qcm92aWRlciB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgd2N3aWR0aCh1Y3M6IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGg7XG4gIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IElEZWNvcmF0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJRGVjb3JhdGlvblNlcnZpY2U+KCdEZWNvcmF0aW9uU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJRGVjb3JhdGlvblNlcnZpY2UgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuICByZWFkb25seSBkZWNvcmF0aW9uczogSXRlcmFibGVJdGVyYXRvcjxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVnaXN0ZXJlZDogSUV2ZW50PElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWFkb25seSBvbkRlY29yYXRpb25SZW1vdmVkOiBJRXZlbnQ8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9uczogSURlY29yYXRpb25PcHRpb25zKTogSURlY29yYXRpb24gfCB1bmRlZmluZWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGEgY2FsbGJhY2sgb3ZlciB0aGUgZGVjb3JhdGlvbiBhdCBhIGNlbGwgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLiBUaGlzIHVzZXMgYSBjYWxsYmFja1xuICAgKiBpbnN0ZWFkIG9mIGFuIGl0ZXJhdG9yIGFzIGl0J3MgdHlwaWNhbGx5IHVzZWQgaW4gaG90IGNvZGUgcGF0aHMuXG4gICAqL1xuICBmb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbCh4OiBudW1iZXIsIGxpbmU6IG51bWJlciwgbGF5ZXI6ICdib3R0b20nIHwgJ3RvcCcgfCB1bmRlZmluZWQsIGNhbGxiYWNrOiAoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbikgPT4gdm9pZCk6IHZvaWQ7XG59XG5leHBvcnQgaW50ZXJmYWNlIElJbnRlcm5hbERlY29yYXRpb24gZXh0ZW5kcyBJRGVjb3JhdGlvbiB7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucztcbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yUkdCOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGZvcmVncm91bmRDb2xvclJHQjogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblJlbmRlckVtaXR0ZXI6IElFdmVudEVtaXR0ZXI8SFRNTEVsZW1lbnQ+O1xufVxuIiwgIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElUZXJtaW5hbEFkZG9uLCBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgdHlwZSB7IFdlYmdsQWRkb24gYXMgSVdlYmdsQXBpIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLXdlYmdsJztcbmltcG9ydCB7IElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLCBJQ2hhclNpemVTZXJ2aWNlLCBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSVRlcm1pbmFsIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIGZvcndhcmRFdmVudCB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBnZXRTYWZhcmlWZXJzaW9uLCBpc1NhZmFyaSB9IGZyb20gJ2NvbW1vbi9QbGF0Zm9ybSc7XG5pbXBvcnQgeyBJQ29yZVNlcnZpY2UsIElEZWNvcmF0aW9uU2VydmljZSwgSUxvZ1NlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgV2ViZ2xSZW5kZXJlciB9IGZyb20gJy4vV2ViZ2xSZW5kZXJlcic7XG5pbXBvcnQgeyBzZXRUcmFjZUxvZ2dlciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Mb2dTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFdlYmdsQWRkb24gZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSVRlcm1pbmFsQWRkb24gLCBJV2ViZ2xBcGkge1xuICBwcml2YXRlIF90ZXJtaW5hbD86IFRlcm1pbmFsO1xuICBwcml2YXRlIF9yZW5kZXJlcj86IFdlYmdsUmVuZGVyZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFuZ2VUZXh0dXJlQXRsYXMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SFRNTENhbnZhc0VsZW1lbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25DaGFuZ2VUZXh0dXJlQXRsYXMgPSB0aGlzLl9vbkNoYW5nZVRleHR1cmVBdGxhcy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25BZGRUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SFRNTENhbnZhc0VsZW1lbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25BZGRUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SFRNTENhbnZhc0VsZW1lbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMgPSB0aGlzLl9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25Db250ZXh0TG9zcyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ29udGV4dExvc3MgPSB0aGlzLl9vbkNvbnRleHRMb3NzLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3ByZXNlcnZlRHJhd2luZ0J1ZmZlcj86IGJvb2xlYW5cbiAgKSB7XG4gICAgaWYgKGlzU2FmYXJpICYmIGdldFNhZmFyaVZlcnNpb24oKSA8IDE2KSB7XG4gICAgICAvLyBQZXJmb3JtIGFuIGV4dHJhIGNoZWNrIHRvIGRldGVybWluZSBpZiBXZWJnbDIgaXMgbWFudWFsbHkgZW5hYmxlZCBpbiBkZXZlbG9wZXIgc2V0dGluZ3NcbiAgICAgIGNvbnN0IGNvbnRleHRBdHRyaWJ1dGVzID0ge1xuICAgICAgICBhbnRpYWxpYXM6IGZhbHNlLFxuICAgICAgICBkZXB0aDogZmFsc2UsXG4gICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdHJ1ZVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnd2ViZ2wyJywgY29udGV4dEF0dHJpYnV0ZXMpIGFzIElXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICAgICAgaWYgKCFnbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYmdsMiBpcyBvbmx5IHN1cHBvcnRlZCBvbiBTYWZhcmkgMTYgYW5kIGFib3ZlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgY29uc3QgY29yZSA9ICh0ZXJtaW5hbCBhcyBhbnkpLl9jb3JlIGFzIElUZXJtaW5hbDtcbiAgICBpZiAoIXRlcm1pbmFsLmVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXIoY29yZS5vbldpbGxPcGVuKCgpID0+IHRoaXMuYWN0aXZhdGUodGVybWluYWwpKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdGVybWluYWwgPSB0ZXJtaW5hbDtcbiAgICBjb25zdCBjb3JlU2VydmljZTogSUNvcmVTZXJ2aWNlID0gY29yZS5jb3JlU2VydmljZTtcbiAgICBjb25zdCBvcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlID0gY29yZS5vcHRpb25zU2VydmljZTtcblxuICAgIGNvbnN0IHVuc2FmZUNvcmUgPSBjb3JlIGFzIGFueTtcbiAgICBjb25zdCByZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZSA9IHVuc2FmZUNvcmUuX3JlbmRlclNlcnZpY2U7XG4gICAgY29uc3QgY2hhcmFjdGVySm9pbmVyU2VydmljZTogSUNoYXJhY3RlckpvaW5lclNlcnZpY2UgPSB1bnNhZmVDb3JlLl9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlO1xuICAgIGNvbnN0IGNoYXJTaXplU2VydmljZTogSUNoYXJTaXplU2VydmljZSA9IHVuc2FmZUNvcmUuX2NoYXJTaXplU2VydmljZTtcbiAgICBjb25zdCBjb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UgPSB1bnNhZmVDb3JlLl9jb3JlQnJvd3NlclNlcnZpY2U7XG4gICAgY29uc3QgZGVjb3JhdGlvblNlcnZpY2U6IElEZWNvcmF0aW9uU2VydmljZSA9IHVuc2FmZUNvcmUuX2RlY29yYXRpb25TZXJ2aWNlO1xuICAgIGNvbnN0IGxvZ1NlcnZpY2U6IElMb2dTZXJ2aWNlID0gdW5zYWZlQ29yZS5fbG9nU2VydmljZTtcbiAgICBjb25zdCB0aGVtZVNlcnZpY2U6IElUaGVtZVNlcnZpY2UgPSB1bnNhZmVDb3JlLl90aGVtZVNlcnZpY2U7XG5cbiAgICAvLyBTZXQgdHJhY2UgbG9nZ2VyIGp1c3QgaW4gY2FzZSBpdCBoYXNuJ3QgYmVlbiB5ZXQgd2hpY2ggY291bGQgaGFwcGVuIHdoZW4gdGhlIGFkZG9uIGlzXG4gICAgLy8gYnVuZGxlZCBzZXBhcmF0ZWx5IHRvIHRoZSBjb3JlIG1vZHVsZVxuICAgIHNldFRyYWNlTG9nZ2VyKGxvZ1NlcnZpY2UpO1xuXG4gICAgdGhpcy5fcmVuZGVyZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBXZWJnbFJlbmRlcmVyKFxuICAgICAgdGVybWluYWwsXG4gICAgICBjaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLFxuICAgICAgY2hhclNpemVTZXJ2aWNlLFxuICAgICAgY29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgICAgY29yZVNlcnZpY2UsXG4gICAgICBkZWNvcmF0aW9uU2VydmljZSxcbiAgICAgIG9wdGlvbnNTZXJ2aWNlLFxuICAgICAgdGhlbWVTZXJ2aWNlLFxuICAgICAgdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyXG4gICAgKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5fcmVuZGVyZXIub25Db250ZXh0TG9zcywgdGhpcy5fb25Db250ZXh0TG9zcykpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX3JlbmRlcmVyLm9uQ2hhbmdlVGV4dHVyZUF0bGFzLCB0aGlzLl9vbkNoYW5nZVRleHR1cmVBdGxhcykpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX3JlbmRlcmVyLm9uQWRkVGV4dHVyZUF0bGFzQ2FudmFzLCB0aGlzLl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcykpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX3JlbmRlcmVyLm9uUmVtb3ZlVGV4dHVyZUF0bGFzQ2FudmFzLCB0aGlzLl9vblJlbW92ZVRleHR1cmVBdGxhc0NhbnZhcykpO1xuICAgIHJlbmRlclNlcnZpY2Uuc2V0UmVuZGVyZXIodGhpcy5fcmVuZGVyZXIpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgY29uc3QgcmVuZGVyU2VydmljZTogSVJlbmRlclNlcnZpY2UgPSAodGhpcy5fdGVybWluYWwgYXMgYW55KS5fY29yZS5fcmVuZGVyU2VydmljZTtcbiAgICAgIHJlbmRlclNlcnZpY2Uuc2V0UmVuZGVyZXIoKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmUuX2NyZWF0ZVJlbmRlcmVyKCkpO1xuICAgICAgcmVuZGVyU2VydmljZS5oYW5kbGVSZXNpemUodGVybWluYWwuY29scywgdGVybWluYWwucm93cyk7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIGdldCB0ZXh0dXJlQXRsYXMoKTogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJlcj8udGV4dHVyZUF0bGFzO1xuICB9XG5cbiAgcHVibGljIGNsZWFyVGV4dHVyZUF0bGFzKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyPy5jbGVhclRleHR1cmVBdGxhcygpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDbGF1ZGUgQ29kZSBcdTIwMTQgdGVybWluYWwtaW4tYnJvd3NlclxuICpcbiAqIFdlYlNvY2tldCBwcm90b2NvbCAobWF0Y2hlcyBzcmMvc2VydmVyL3dlYi9zZXNzaW9uLW1hbmFnZXIudHMpOlxuICpcbiAqICBTZXJ2ZXIgXHUyMTkyIGNsaWVudCAodGV4dCwgSlNPTik6XG4gKiAgICB7IHR5cGU6IFwiY29ubmVjdGVkXCIsIHNlc3Npb25JZDogc3RyaW5nIH1cbiAqICAgIHsgdHlwZTogXCJwb25nXCIgfVxuICogICAgeyB0eXBlOiBcImVycm9yXCIsIG1lc3NhZ2U6IHN0cmluZyB9XG4gKiAgICB7IHR5cGU6IFwiZXhpdFwiLCBleGl0Q29kZTogbnVtYmVyLCBzaWduYWw6IG51bWJlciB8IHVuZGVmaW5lZCB9XG4gKlxuICogIFNlcnZlciBcdTIxOTIgY2xpZW50ICh0ZXh0LCByYXcpOlxuICogICAgUFRZIG91dHB1dCBcdTIwMTQgcGxhaW4gc3RyaW5nLCB3cml0dGVuIGRpcmVjdGx5IHRvIHh0ZXJtXG4gKlxuICogIENsaWVudCBcdTIxOTIgc2VydmVyICh0ZXh0KTpcbiAqICAgIHsgdHlwZTogXCJyZXNpemVcIiwgY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIgfVxuICogICAgeyB0eXBlOiBcInBpbmdcIiB9XG4gKiAgICByYXcgdGVybWluYWwgaW5wdXQgc3RyaW5nXG4gKi9cblxuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nXG5pbXBvcnQgeyBGaXRBZGRvbiB9IGZyb20gJ0B4dGVybS9hZGRvbi1maXQnXG5pbXBvcnQgeyBXZWJMaW5rc0FkZG9uIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLXdlYi1saW5rcydcbmltcG9ydCB7IFNlYXJjaEFkZG9uIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLXNlYXJjaCdcbmltcG9ydCB7IFVuaWNvZGUxMUFkZG9uIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLXVuaWNvZGUxMSdcbmltcG9ydCB7IFdlYmdsQWRkb24gfSBmcm9tICdAeHRlcm0vYWRkb24td2ViZ2wnXG5pbXBvcnQgJ0B4dGVybS94dGVybS9jc3MveHRlcm0uY3NzJ1xuaW1wb3J0ICcuL3N0eWxlcy5jc3MnXG5cbi8vIFx1MjUwMFx1MjUwMCBUeXBlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxudHlwZSBTZXJ2ZXJNZXNzYWdlID1cbiAgfCB7IHR5cGU6ICdjb25uZWN0ZWQnOyBzZXNzaW9uSWQ6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAncG9uZycgfVxuICB8IHsgdHlwZTogJ2Vycm9yJzsgbWVzc2FnZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdleGl0JzsgZXhpdENvZGU6IG51bWJlcjsgc2lnbmFsPzogbnVtYmVyIH1cblxuLy8gXHUyNTAwXHUyNTAwIENvbmZpZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuY29uc3QgUkVDT05ORUNUX0JBU0VfTVMgPSAxXzAwMFxuY29uc3QgUkVDT05ORUNUX01BWF9NUyA9IDMwXzAwMFxuY29uc3QgUElOR19JTlRFUlZBTF9NUyA9IDVfMDAwXG5cbi8vIFx1MjUwMFx1MjUwMCBTdGF0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxubGV0IHdzOiBXZWJTb2NrZXQgfCBudWxsID0gbnVsbFxubGV0IHRlcm06IFRlcm1pbmFsXG5sZXQgZml0QWRkb246IEZpdEFkZG9uXG5sZXQgc2VhcmNoQWRkb246IFNlYXJjaEFkZG9uXG5sZXQgcmVjb25uZWN0RGVsYXkgPSBSRUNPTk5FQ1RfQkFTRV9NU1xubGV0IHJlY29ubmVjdFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsXG5sZXQgcGluZ1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbFxubGV0IGxhc3RQaW5nU2VudCA9IDBcbmxldCBjb25uZWN0ZWQgPSBmYWxzZVxuXG4vLyBcdTI1MDBcdTI1MDAgRE9NIHJlZnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IGxvYWRpbmdPdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmctb3ZlcmxheScpIVxuY29uc3QgcmVjb25uZWN0T3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNvbm5lY3Qtb3ZlcmxheScpIVxuY29uc3QgcmVjb25uZWN0U3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY29ubmVjdC1zdWInKSFcbmNvbnN0IHN0YXR1c0RvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMtZG90JykhXG5jb25zdCBsYXRlbmN5RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGF0ZW5jeScpIVxuY29uc3QgYmFyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jhci1idG4nKSBhcyBIVE1MQnV0dG9uRWxlbWVudFxuY29uc3QgdG9wQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvcC1iYXInKSFcbmNvbnN0IHRvZ2dsZUJhckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtYmFyJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnRcbmNvbnN0IHRlcm1pbmFsQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlcm1pbmFsLWNvbnRhaW5lcicpIVxuXG4vLyBcdTI1MDBcdTI1MDAgVGhlbWUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGdldFRoZW1lKCk6IFRlcm1pbmFsWydvcHRpb25zJ11bJ3RoZW1lJ10ge1xuICBjb25zdCBzID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gIGNvbnN0IHYgPSAocHJvcDogc3RyaW5nKSA9PiBzLmdldFByb3BlcnR5VmFsdWUocHJvcCkudHJpbSgpXG4gIHJldHVybiB7XG4gICAgYmFja2dyb3VuZDogdignLS10ZXJtLWJnJyksXG4gICAgZm9yZWdyb3VuZDogdignLS10ZXJtLWZnJyksXG4gICAgY3Vyc29yOiB2KCctLXRlcm0tY3Vyc29yJyksXG4gICAgc2VsZWN0aW9uQmFja2dyb3VuZDogdignLS10ZXJtLXNlbGVjdGlvbicpLFxuICAgIGJsYWNrOiB2KCctLXRlcm0tYmxhY2snKSxcbiAgICByZWQ6IHYoJy0tdGVybS1yZWQnKSxcbiAgICBncmVlbjogdignLS10ZXJtLWdyZWVuJyksXG4gICAgeWVsbG93OiB2KCctLXRlcm0teWVsbG93JyksXG4gICAgYmx1ZTogdignLS10ZXJtLWJsdWUnKSxcbiAgICBtYWdlbnRhOiB2KCctLXRlcm0tbWFnZW50YScpLFxuICAgIGN5YW46IHYoJy0tdGVybS1jeWFuJyksXG4gICAgd2hpdGU6IHYoJy0tdGVybS13aGl0ZScpLFxuICAgIGJyaWdodEJsYWNrOiB2KCctLXRlcm0tYnJpZ2h0LWJsYWNrJyksXG4gICAgYnJpZ2h0UmVkOiB2KCctLXRlcm0tcmVkJyksXG4gICAgYnJpZ2h0R3JlZW46IHYoJy0tdGVybS1ncmVlbicpLFxuICAgIGJyaWdodFllbGxvdzogdignLS10ZXJtLXllbGxvdycpLFxuICAgIGJyaWdodEJsdWU6IHYoJy0tdGVybS1ibHVlJyksXG4gICAgYnJpZ2h0TWFnZW50YTogdignLS10ZXJtLW1hZ2VudGEnKSxcbiAgICBicmlnaHRDeWFuOiB2KCctLXRlcm0tY3lhbicpLFxuICAgIGJyaWdodFdoaXRlOiB2KCctLXRlcm0tYnJpZ2h0LXdoaXRlJyksXG4gIH1cbn1cblxuLy8gXHUyNTAwXHUyNTAwIFRlcm1pbmFsIGluaXRpYWxpc2F0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBpbml0VGVybWluYWwoKTogdm9pZCB7XG4gIHRlcm0gPSBuZXcgVGVybWluYWwoe1xuICAgIGN1cnNvckJsaW5rOiB0cnVlLFxuICAgIGN1cnNvclN0eWxlOiAnYmxvY2snLFxuICAgIGZvbnRGYW1pbHk6XG4gICAgICBcIidDYXNjYWRpYSBDb2RlJywgJ0ZpcmEgQ29kZScsICdKZXRCcmFpbnMgTW9ubycsICdTRiBNb25vJywgTWVubG8sIE1vbmFjbywgJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlXCIsXG4gICAgZm9udFNpemU6IDE0LFxuICAgIGxpbmVIZWlnaHQ6IDEuMixcbiAgICB0aGVtZTogZ2V0VGhlbWUoKSxcbiAgICBhbGxvd1Byb3Bvc2VkQXBpOiB0cnVlLFxuICAgIHNjcm9sbGJhY2s6IDEwXzAwMCxcbiAgICBjb252ZXJ0RW9sOiB0cnVlLFxuICB9KVxuXG4gIGZpdEFkZG9uID0gbmV3IEZpdEFkZG9uKClcbiAgdGVybS5sb2FkQWRkb24oZml0QWRkb24pXG4gIHRlcm0ubG9hZEFkZG9uKG5ldyBXZWJMaW5rc0FkZG9uKCkpXG5cbiAgc2VhcmNoQWRkb24gPSBuZXcgU2VhcmNoQWRkb24oKVxuICB0ZXJtLmxvYWRBZGRvbihzZWFyY2hBZGRvbilcblxuICBjb25zdCB1bmljb2RlMTEgPSBuZXcgVW5pY29kZTExQWRkb24oKVxuICB0ZXJtLmxvYWRBZGRvbih1bmljb2RlMTEpXG4gIHRlcm0udW5pY29kZS5hY3RpdmVWZXJzaW9uID0gJzExJ1xuXG4gIHRlcm0ub3Blbih0ZXJtaW5hbENvbnRhaW5lcilcblxuICAvLyBXZWJHTCByZW5kZXJlciB3aXRoIGNhbnZhcyBmYWxsYmFja1xuICB0cnkge1xuICAgIGNvbnN0IHdlYmdsID0gbmV3IFdlYmdsQWRkb24oKVxuICAgIHdlYmdsLm9uQ29udGV4dExvc3MoKCkgPT4gd2ViZ2wuZGlzcG9zZSgpKVxuICAgIHRlcm0ubG9hZEFkZG9uKHdlYmdsKVxuICB9IGNhdGNoIHtcbiAgICAvLyBDYW52YXMgcmVuZGVyZXIgaXMgYWxyZWFkeSBhY3RpdmUgXHUyMDE0IG5vIGFjdGlvbiBuZWVkZWRcbiAgfVxuXG4gIGZpdEFkZG9uLmZpdCgpXG5cbiAgLy8gS2VlcCB0ZXJtaW5hbCBmaXR0ZWQgdG8gY29udGFpbmVyXG4gIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IGZpdEFkZG9uLmZpdCgpKVxuICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHRlcm1pbmFsQ29udGFpbmVyKVxuXG4gIC8vIFByb3BhZ2F0ZSByZXNpemUgdG8gc2VydmVyXG4gIHRlcm0ub25SZXNpemUoKHsgY29scywgcm93cyB9KSA9PiBzZW5kSlNPTih7IHR5cGU6ICdyZXNpemUnLCBjb2xzLCByb3dzIH0pKVxuXG4gIC8vIEZvcndhcmQgYWxsIHRlcm1pbmFsIGlucHV0IHRvIFBUWVxuICB0ZXJtLm9uRGF0YSgoZGF0YSkgPT4ge1xuICAgIGlmICh3cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHdzLnNlbmQoZGF0YSlcbiAgfSlcblxuICAvLyBLZXlib2FyZCBpbnRlcmNlcHRzIChyZXR1cm4gZmFsc2UgPSBzd2FsbG93OyByZXR1cm4gdHJ1ZSA9IHBhc3MgdGhyb3VnaClcbiAgdGVybS5hdHRhY2hDdXN0b21LZXlFdmVudEhhbmRsZXIoKGV2KSA9PiB7XG4gICAgLy8gQ3RybCtTaGlmdCtGIFx1MjE5MiBpbi10ZXJtaW5hbCBzZWFyY2hcbiAgICBpZiAoZXYuY3RybEtleSAmJiBldi5zaGlmdEtleSAmJiBldi5rZXkgPT09ICdGJykge1xuICAgICAgaWYgKGV2LnR5cGUgPT09ICdrZXlkb3duJykge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHdpbmRvdy5wcm9tcHQoJ1NlYXJjaCB0ZXJtaW5hbDonKVxuICAgICAgICBpZiAocXVlcnkpIHNlYXJjaEFkZG9uLmZpbmROZXh0KHF1ZXJ5LCB7IGNhc2VTZW5zaXRpdmU6IGZhbHNlLCByZWdleDogZmFsc2UgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBDdHJsK1NoaWZ0K0MgXHUyMTkyIGNvcHkgc2VsZWN0aW9uIChMaW51eCBjb252ZW50aW9uKVxuICAgIGlmIChldi5jdHJsS2V5ICYmIGV2LnNoaWZ0S2V5ICYmIGV2LmtleSA9PT0gJ0MnKSB7XG4gICAgICBpZiAoZXYudHlwZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgICAgIGNvbnN0IHNlbCA9IHRlcm0uZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgaWYgKHNlbCkgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VsKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIEN0cmwrU2hpZnQrViBcdTIxOTIgcGFzdGUgKExpbnV4IGNvbnZlbnRpb24pXG4gICAgaWYgKGV2LmN0cmxLZXkgJiYgZXYuc2hpZnRLZXkgJiYgZXYua2V5ID09PSAnVicpIHtcbiAgICAgIGlmIChldi50eXBlID09PSAna2V5ZG93bicpIHtcbiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpLnRoZW4oKHRleHQpID0+IHtcbiAgICAgICAgICBpZiAod3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB3cy5zZW5kKHRleHQpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfSlcblxuICAvLyBVcGRhdGUgdGhlbWUgd2hlbiBPUyBwcmVmZXJlbmNlIGNoYW5nZXNcbiAgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgdGVybS5vcHRpb25zLnRoZW1lID0gZ2V0VGhlbWUoKVxuICB9KVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgV2ViU29ja2V0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBnZXRXc1VybCgpOiBzdHJpbmcge1xuICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3M6JyA6ICd3czonXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoYCR7cHJvdG99Ly8ke2xvY2F0aW9uLmhvc3R9L3dzYClcblxuICAvLyBBdXRoIHRva2VuOiBVUkwgcGFyYW0gd2lucywgdGhlbiBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpXG4gIGNvbnN0IHRva2VuID0gcGFyYW1zLmdldCgndG9rZW4nKSA/PyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2xhdWRlLXRlcm1pbmFsLXRva2VuJylcbiAgaWYgKHRva2VuKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3Rva2VuJywgdG9rZW4pXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NsYXVkZS10ZXJtaW5hbC10b2tlbicsIHRva2VuKVxuICB9XG5cbiAgLy8gUGFzcyBjdXJyZW50IHRlcm1pbmFsIGRpbWVuc2lvbnMgc28gdGhlIFBUWSBpcyBzcGF3bmVkIGF0IHRoZSByaWdodCBzaXplXG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdjb2xzJywgU3RyaW5nKHRlcm0uY29scykpXG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdyb3dzJywgU3RyaW5nKHRlcm0ucm93cykpXG5cbiAgcmV0dXJuIHVybC50b1N0cmluZygpXG59XG5cbmZ1bmN0aW9uIHNlbmRKU09OKG1zZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgaWYgKHdzPy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikgd3Muc2VuZChKU09OLnN0cmluZ2lmeShtc2cpKVxufVxuXG5mdW5jdGlvbiBjb25uZWN0KCk6IHZvaWQge1xuICBzZXRTdGF0dXMoJ2Nvbm5lY3RpbmcnKVxuXG4gIHdzID0gbmV3IFdlYlNvY2tldChnZXRXc1VybCgpKVxuXG4gIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgY29ubmVjdGVkID0gdHJ1ZVxuICAgIHJlY29ubmVjdERlbGF5ID0gUkVDT05ORUNUX0JBU0VfTVNcbiAgICBzZXRTdGF0dXMoJ2Nvbm5lY3RlZCcpXG4gICAgaGlkZU92ZXJsYXkobG9hZGluZ092ZXJsYXkpXG4gICAgaGlkZU92ZXJsYXkocmVjb25uZWN0T3ZlcmxheSlcbiAgICAvLyBSZS1zeW5jIHNpemUgaW4gY2FzZSB0aGUgd2luZG93IGNoYW5nZWQgd2hpbGUgY29ubmVjdGluZ1xuICAgIGZpdEFkZG9uLmZpdCgpXG4gICAgc2VuZEpTT04oeyB0eXBlOiAncmVzaXplJywgY29sczogdGVybS5jb2xzLCByb3dzOiB0ZXJtLnJvd3MgfSlcbiAgICBzdGFydFBpbmcoKVxuICB9KVxuXG4gIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhIH06IE1lc3NhZ2VFdmVudDxzdHJpbmc+KSA9PiB7XG4gICAgLy8gQWxsIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlciBhcmUgc3RyaW5ncy5cbiAgICAvLyBUcnkgSlNPTiBjb250cm9sIG1lc3NhZ2UgZmlyc3Q7IGZhbGwgYmFjayB0byByYXcgUFRZIG91dHB1dC5cbiAgICBpZiAoZGF0YS5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZUNvbnRyb2xNZXNzYWdlKEpTT04ucGFyc2UoZGF0YSkgYXMgU2VydmVyTWVzc2FnZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm90IEpTT04gXHUyMDE0IGZhbGwgdGhyb3VnaCB0byB3cml0ZSBhcyBQVFkgb3V0cHV0XG4gICAgICB9XG4gICAgfVxuICAgIHRlcm0ud3JpdGUoZGF0YSlcbiAgfSlcblxuICB3cy5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIG9uRGlzY29ubmVjdClcbiAgd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgLy8gJ2Vycm9yJyBhbHdheXMgZmlyZXMgYmVmb3JlICdjbG9zZSc7IGxldCBvbkRpc2Nvbm5lY3QgaGFuZGxlIHJlY29ubmVjdFxuICB9KVxufVxuXG5mdW5jdGlvbiBoYW5kbGVDb250cm9sTWVzc2FnZShtc2c6IFNlcnZlck1lc3NhZ2UpOiB2b2lkIHtcbiAgc3dpdGNoIChtc2cudHlwZSkge1xuICAgIGNhc2UgJ2Nvbm5lY3RlZCc6XG4gICAgICAvLyBTZXNzaW9uIGVzdGFibGlzaGVkIFx1MjAxNCBub3RoaW5nIGV4dHJhIG5lZWRlZFxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgJ3BvbmcnOlxuICAgICAgbGF0ZW5jeUVsLnRleHRDb250ZW50ID0gYCR7RGF0ZS5ub3coKSAtIGxhc3RQaW5nU2VudH1tc2BcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdlcnJvcic6XG4gICAgICB0ZXJtLndyaXRlbG4oYFxcclxcblxceDFiWzMxbVtlcnJvcl0gJHttc2cubWVzc2FnZX1cXHgxYlswbWApXG4gICAgICBicmVha1xuXG4gICAgY2FzZSAnZXhpdCc6XG4gICAgICB0ZXJtLndyaXRlbG4oXG4gICAgICAgIGBcXHJcXG5cXHgxYlszM21bc2Vzc2lvbiBlbmRlZCBcdTIwMTQgZXhpdCBjb2RlICR7bXNnLmV4aXRDb2RlID8/IDB9XVxceDFiWzBtYCxcbiAgICAgIClcbiAgICAgIGJyZWFrXG4gIH1cbn1cblxuZnVuY3Rpb24gb25EaXNjb25uZWN0KCk6IHZvaWQge1xuICBjb25uZWN0ZWQgPSBmYWxzZVxuICB3cyA9IG51bGxcbiAgc2V0U3RhdHVzKCdkaXNjb25uZWN0ZWQnKVxuICBzdG9wUGluZygpXG4gIHNob3dPdmVybGF5KHJlY29ubmVjdE92ZXJsYXkpXG4gIHNjaGVkdWxlUmVjb25uZWN0KClcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVSZWNvbm5lY3QoKTogdm9pZCB7XG4gIGlmIChyZWNvbm5lY3RUaW1lcikgY2xlYXJUaW1lb3V0KHJlY29ubmVjdFRpbWVyKVxuICByZWNvbm5lY3RTdWIudGV4dENvbnRlbnQgPSBgUmV0cnlpbmcgaW4gJHtNYXRoLnJvdW5kKHJlY29ubmVjdERlbGF5IC8gMV8wMDApfXNcdTIwMjZgXG4gIHJlY29ubmVjdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBjb25uZWN0KCksIHJlY29ubmVjdERlbGF5KVxuICByZWNvbm5lY3REZWxheSA9IE1hdGgubWluKHJlY29ubmVjdERlbGF5ICogMiwgUkVDT05ORUNUX01BWF9NUylcbn1cblxuZnVuY3Rpb24gbWFudWFsUmVjb25uZWN0KCk6IHZvaWQge1xuICBpZiAocmVjb25uZWN0VGltZXIpIGNsZWFyVGltZW91dChyZWNvbm5lY3RUaW1lcilcbiAgcmVjb25uZWN0RGVsYXkgPSBSRUNPTk5FQ1RfQkFTRV9NU1xuICB3cz8uY2xvc2UoKVxuICB3cyA9IG51bGxcbiAgdGVybS5jbGVhcigpXG4gIGNvbm5lY3QoKVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgUGluZyAvIGxhdGVuY3kgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHN0YXJ0UGluZygpOiB2b2lkIHtcbiAgc3RvcFBpbmcoKVxuICBwaW5nVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdzPy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgbGFzdFBpbmdTZW50ID0gRGF0ZS5ub3coKVxuICAgICAgc2VuZEpTT04oeyB0eXBlOiAncGluZycgfSlcbiAgICB9XG4gIH0sIFBJTkdfSU5URVJWQUxfTVMpXG59XG5cbmZ1bmN0aW9uIHN0b3BQaW5nKCk6IHZvaWQge1xuICBpZiAocGluZ1RpbWVyKSBjbGVhckludGVydmFsKHBpbmdUaW1lcilcbiAgcGluZ1RpbWVyID0gbnVsbFxuICBsYXRlbmN5RWwudGV4dENvbnRlbnQgPSAnLS0nXG59XG5cbi8vIFx1MjUwMFx1MjUwMCBVSSBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBzZXRTdGF0dXMoc3RhdGU6ICdjb25uZWN0ZWQnIHwgJ2Nvbm5lY3RpbmcnIHwgJ2Rpc2Nvbm5lY3RlZCcpOiB2b2lkIHtcbiAgc3RhdHVzRG90LmNsYXNzTmFtZSA9ICdzdGF0dXMtZG90J1xuICBpZiAoc3RhdGUgIT09ICdjb25uZWN0ZWQnKSBzdGF0dXNEb3QuY2xhc3NMaXN0LmFkZChzdGF0ZSlcbiAgYmFyQnRuLnRleHRDb250ZW50ID0gY29ubmVjdGVkID8gJ0Rpc2Nvbm5lY3QnIDogJ1JlY29ubmVjdCdcbn1cblxuZnVuY3Rpb24gc2hvd092ZXJsYXkoZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpXG4gIGVsLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKVxufVxuXG5mdW5jdGlvbiBoaWRlT3ZlcmxheShlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpXG4gIGVsLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpXG59XG5cbi8vIFx1MjUwMFx1MjUwMCBUb3AgYmFyIGNvbGxhcHNlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBzZXR1cEJhclRvZ2dsZSgpOiB2b2lkIHtcbiAgY29uc3QgU1RPUkFHRV9LRVkgPSAnY2xhdWRlLWJhci1jb2xsYXBzZWQnXG5cbiAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKSA9PT0gJ3RydWUnKSB7XG4gICAgdG9wQmFyLmNsYXNzTGlzdC5hZGQoJ2NvbGxhcHNlZCcpXG4gIH1cblxuICAvLyBTaG93IGJhciBidXR0b24gcmUtZXhwYW5kcyBpdFxuICB0b2dnbGVCYXJCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgdG9wQmFyLmNsYXNzTGlzdC5yZW1vdmUoJ2NvbGxhcHNlZCcpXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksICdmYWxzZScpXG4gICAgc2V0VGltZW91dCgoKSA9PiBmaXRBZGRvbi5maXQoKSwgMjAwKVxuICB9KVxuXG4gIC8vIERvdWJsZS1jbGljayBiYXIgdG8gY29sbGFwc2VcbiAgdG9wQmFyLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xuICAgIHRvcEJhci5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzZWQnKVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCAndHJ1ZScpXG4gICAgc2V0VGltZW91dCgoKSA9PiBmaXRBZGRvbi5maXQoKSwgMjAwKVxuICB9KVxuXG4gIGJhckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoY29ubmVjdGVkKSB7XG4gICAgICB3cz8uY2xvc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICBtYW51YWxSZWNvbm5lY3QoKVxuICAgIH1cbiAgfSlcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEJvb3QgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gIGluaXRUZXJtaW5hbCgpXG4gIHNldHVwQmFyVG9nZ2xlKClcbiAgY29ubmVjdCgpXG5cbiAgLy8gS2VlcCB0ZXJtaW5hbCBmb2N1c2VkXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGVybS5mb2N1cygpKVxuICB0ZXJtLmZvY3VzKClcbn0pXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFBQSxTQUEyQ0EsR0FBTUMsR0FBQUE7QUFDaEQsVUFBc0IsWUFBQSxPQUFaQyxXQUEwQyxZQUFBLE9BQVhDLE9BQ3hDQSxRQUFPRCxVQUFVRCxFQUFBQTtlQUNRLGNBQUEsT0FBWEcsVUFBeUJBLE9BQU9DLElBQzlDRCxRQUFPLENBQUEsR0FBSUgsQ0FBQUE7V0FDUDtBQUNKLFlBQUlLLElBQUlMLEVBQUFBO0FBQ1IsaUJBQVFNLEtBQUtELEVBQUFBLEVBQXVCLFlBQUEsT0FBWkosVUFBdUJBLFVBQVVGLEdBQU1PLENBQUFBLElBQUtELEVBQUVDLENBQUFBO01BQ3ZFO0lBQ0EsR0FBRUMsYUFBWSxPQUFBLE1BQUE7QUFBQTtBQUFBLFVBQUEsSUFBQSxFQUFBLE1BQUEsU0FBQUMsSUFBQUMsSUFBQUgsSUFBQTtBQUFBLFlBQUFJLEtBQUEsUUFBQSxLQUFBLGNBQUEsU0FBQUYsSUFBQUMsSUFBQUgsSUFBQUksSUFBQTtBQUFBLGNBQUFDLElBQUFDLEtBQUEsVUFBQSxRQUFBQyxLQUFBRCxLQUFBLElBQUFILEtBQUEsU0FBQUMsS0FBQUEsS0FBQSxPQUFBLHlCQUFBRCxJQUFBSCxFQUFBLElBQUFJO0FBQUEsY0FBQSxZQUFBLE9BQUEsV0FBQSxjQUFBLE9BQUEsUUFBQSxTQUFBLENB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USxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFT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Q0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FDN0MsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQzdDLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUM3QyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FDN0MsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQzdDLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUM3QyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FDN0MsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQzdDLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUM3QyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FDN0MsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQzdDLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUM3QyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FDN0MsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQzdDLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUM3QyxDQUFDLE9BQVEsS0FBQSxDQUFBLEdBRUxDLElBQWlCLENBQ3JCLENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FDOUIsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQ2xELENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUNsRCxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FDbEQsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQ2xELENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUNsRCxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FDbEQsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQ2xELENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUNsRCxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FDbEQsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQ2xELENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUNsRCxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FDbEQsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQ2xELENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUNsRCxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FDbEQsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQ2xELENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUNsRCxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FDbEQsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQ2xELENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUNsRCxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FDbEQsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQ2xELENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUNsRCxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FDbEQsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQ2xELENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUNsRCxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FDbEQsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQ2xELENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUNsRCxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FDbEQsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQ2xELENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUNsRCxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FDbEQsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQ2xELENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUNsRCxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FDbEQsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQ2xELENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUNsRCxDQUFDLFFBQVMsTUFBQSxDQUFBLEdBRU5DLElBQVcsQ0FDZixDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUM3QyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FDN0MsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQzdDLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUM3QyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FDN0MsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQzdDLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUM3QyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FDN0MsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQzdDLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUM3QyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FDN0MsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQzdDLENBQUMsT0FBUSxLQUFBLENBQUEsR0FFTEMsSUFBWSxDQUNoQixDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxNQUFBLEdBQzlCLENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUNsRCxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FDbEQsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQ2xELENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUNsRCxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FDbEQsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQ2xELENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUNsRCxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FDbEQsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQ2xELENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUNsRCxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FDbEQsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQ2xELENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUNsRCxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FDbEQsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQ2xELENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUNsRCxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsQ0FBQTtBQUlwRCxZQUFJQztBQUVKLGlCQUFTQyxFQUFTQyxJQUFhQyxJQUFBQTtBQUM3QixjQUVJQyxJQUZBQyxLQUFN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USxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FDN0MsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQzdDLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxNQUFRLElBQUEsR0FBUyxDQUFDLE1BQVEsSUFBQSxHQUM3QyxDQUFDLE1BQVEsSUFBQSxHQUFTLENBQUMsTUFBUSxJQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FDN0MsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQzdDLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsR0FBUyxDQUFDLE9BQVEsS0FBQSxHQUM3QyxDQUFDLE9BQVEsS0FBQSxHQUFTLENBQUMsT0FBUSxLQUFBLEdBQVMsQ0FBQyxPQUFRLEtBQUEsQ0FBQSxHQUV6Q0MsSUFBaUIsQ0FDckIsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLE9BQVMsS0FBQSxHQUFVLENBQUMsT0FBUyxLQUFBLEdBQ2xELENBQUMsT0FBUyxLQUFBLEdBQVUsQ0FBQyxPQUFTLEtBQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUNsRCxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQVUsQ0FBQyxRQUFTLE1BQUEsR0FDbEQsQ0FBQyxRQUFTLE1BQUEsR0FBVSxDQUFDLFFBQVMsTUFBQSxHQUFVLENBQUMsUUFBUyxNQUFBLEdBQ2xELENBQUMsUUFBUyxNQUFBLENBQUE7QUFJWixZ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LFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBRzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBRzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQzdCLFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxHQUFLLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLENBQUEsR0FDekQsVUFBSyxDQUFDLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLEdBQUssRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUN6RCxVQUFLLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsR0FBSyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQ3pELFVBQUssQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxHQUFLLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLENBQUEsR0FDekQsVUFBSyxDQUFDLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLENBQUEsR0FDN0IsVUFBSyxDQUFDLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLEdBQUssRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUN6RCxVQUFLLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsR0FBSyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBR3pELGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQ3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQ3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQ3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQ3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQ3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBR3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQ3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQ3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQ3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQ3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBQ3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBR3JDLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxHQUFLLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLENBQUEsR0FFakUsYUFBYSxDQUFDLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLEdBQUssRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUVqRSxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsR0FBSyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBRWpFLGFBQWEsQ0FBQyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxHQUFLLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLENBQUEsR0FFakUsYUFBYSxDQUFDLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLEdBQUssRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUVqRSxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsR0FBSyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxHQUFLLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLEdBQUssRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUd6SCxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUVyQyxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUVyQyxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUVyQyxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUVyQyxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUdyQyxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUVyQyxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUVyQyxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUVyQyxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUVyQyxhQUFhLENBQUMsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxHQUdyQyxhQUFhLENBQ1gsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsR0FBSyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxHQUNuRCxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxHQUFLLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLEdBQ25ELEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLEdBQUssRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsR0FDbkQsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsR0FBSyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxDQUFBLEdBR3JELGFBQWEsQ0FDWCxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxHQUFLLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLEdBQ25ELEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLEdBQUssRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsR0FDbkQsRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsR0FBSyxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxHQUNuRCxFQUFFNUwsR0FBRyxHQUFHQyxHQUFHLEdBQUcwTCxHQUFHLEdBQUdDLEdBQUcsRUFBQSxHQUFLLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLENBQUEsR0FHckQsYUFBYSxDQUFDLEVBQUU1TCxHQUFHLEdBQUdDLEdBQUcsR0FBRzBMLEdBQUcsR0FBR0MsR0FBRyxFQUFBLEdBQUssRUFBRTVMLEdBQUcsR0FBR0MsR0FBRyxHQUFHMEwsR0FBRyxHQUFHQyxHQUFHLEVBQUEsQ0FBQSxFQUFBO0FBU25FLGNBQU0wUSxJQUFnRixFQUVwRixV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QUEsS0FBQUEsR0FHMU8sVUFBSyxFQUFFLEdBQWdCLFlBQUEsR0FDdkIsVUFBSyxFQUFFLEdBQWdCLFlBQUEsR0FDdkIsVUFBSyxFQUFFLEdBQWdCLHNCQUFBLEdBR3ZCLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixlQUFzRCxHQUFjLGVBQUEsR0FDM0YsVUFBSyxFQUFFLEdBQWdCLHVCQUFzRCxHQUFjLGVBQUEsR0FDM0YsVUFBSyxFQUFFLEdBQWdCLHNCQUFzRCxHQUFjLGVBQUEsR0FDM0YsVUFBSyxFQUFFLEdBQWdCLGdCQUFzRCxHQUFjLGNBQUEsR0FDM0YsVUFBSyxFQUFFLEdBQWdCLGdCQUFzRCxHQUFjLHFCQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxzQkFBQSxHQUMzRixVQUFLLEVBQUUsR0FBZ0IsZUFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixzQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixzQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxjQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxxQkFBQSxHQUMzRixVQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMscUJBQUEsR0FDM0YsVUFBSyxFQUFFLEdBQWdCLHVCQUFzRCxHQUFjLGVBQUEsR0FDM0YsVUFBSyxFQUFFLEdBQWdCLHNCQUFzRCxHQUFjLGVBQUEsR0FDM0YsVUFBSyxFQUFFLEdBQWdCLGdCQUFzRCxHQUFjLGNBQUEsR0FDM0YsVUFBSyxFQUFFLEdBQWdCLGVBQXNELEdBQWMsZUFBQSxHQUMzRixVQUFLLEVBQUUsR0FBZ0IsZ0JBQXNELEdBQWMscUJBQUEsR0FDM0YsVUFBSyxFQUFFLEdBQWdCLGdCQUFzRCxHQUFjLHNCQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixzQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixzQkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxjQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixlQUFzRCxHQUFjLGVBQUEsR0FDM0YsVUFBSyxFQUFFLEdBQWdCLGdCQUFzRCxHQUFjLHFCQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixnQkFBc0QsR0FBYyxxQkFBQSxHQUMzRixVQUFLLEVBQUUsR0FBZ0IsNEJBQXNELEdBQWMsZUFBQSxHQUMzRixVQUFLLEVBQUUsR0FBZ0IsNEJBQXNELEdBQWMsZUFBQSxHQUMzRixVQUFLLEVBQUUsR0FBZ0IsZUFBc0QsR0FBYyxjQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQiw0QkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQiw0QkFBc0QsR0FBYyxlQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixlQUFzRCxHQUFjLGNBQUEsR0FDM0YsVUFBSyxFQUFFLEdBQWdCLHVCQUFzRCxHQUFjLHFCQUFBLEdBQzNGLFVBQUssRUFBRSxHQUFnQixzQkFBc0Qs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V0FBVztBQUNuQyxpQkFBYSxRQUFRLGFBQWEsT0FBTztBQUN6QyxlQUFXLE1BQU0sU0FBUyxJQUFJLEdBQUcsR0FBRztBQUFBLEVBQ3RDLENBQUM7QUFHRCxTQUFPLGlCQUFpQixZQUFZLE1BQU07QUFDeEMsV0FBTyxVQUFVLElBQUksV0FBVztBQUNoQyxpQkFBYSxRQUFRLGFBQWEsTUFBTTtBQUN4QyxlQUFXLE1BQU0sU0FBUyxJQUFJLEdBQUcsR0FBRztBQUFBLEVBQ3RDLENBQUM7QUFFRCxTQUFPLGlCQUFpQixTQUFTLE1BQU07QUFDckMsUUFBSSxXQUFXO0FBQ2IsK0JBQUk7QUFBQSxJQUNOLE9BQU87QUFDTCxzQkFBZ0I7QUFBQSxJQUNsQjtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBSUEsU0FBUyxpQkFBaUIsb0JBQW9CLE1BQU07QUFDbEQsZUFBYTtBQUNiLGlCQUFlO0FBQ2YsVUFBUTtBQUdSLFdBQVMsaUJBQWlCLFNBQVMsTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUNyRCxPQUFLLE1BQU07QUFDYixDQUFDOyIsCiAgIm5hbWVzIjogWyJyb290IiwgImZhY3RvcnkiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZGVmaW5lIiwgImFtZCIsICJhIiwgImkiLCAiZ2xvYmFsVGhpcyIsICJlIiwgInQiLCAicyIsICJyIiwgIm4iLCAibyIsICJBY2Nlc3NpYmlsaXR5TWFuYWdlciIsICJEaXNwb3NhYmxlIiwgIl90ZXJtaW5hbCIsICJpbnN0YW50aWF0aW9uU2VydmljZSIsICJzdXBlciIsICJfY29yZUJyb3dzZXJTZXJ2aWNlIiwgIl9yZW5kZXJTZXJ2aWNlIiwgIl9yb3dDb2x1bW5zIiwgIldlYWtNYXAiLCAiX2xpdmVSZWdpb25MaW5lQ291bnQiLCAiX2NoYXJzVG9Db25zdW1lIiwgIl9jaGFyc1RvQW5ub3VuY2UiLCAidGhpcyIsICJfYWNjZXNzaWJpbGl0eUNvbnRhaW5lciIsICJtYWluRG9jdW1lbnQiLCAiY3JlYXRlRWxlbWVudCIsICJjbGFzc0xpc3QiLCAiYWRkIiwgIl9yb3dDb250YWluZXIiLCAic2V0QXR0cmlidXRlIiwgIl9yb3dFbGVtZW50cyIsICJyb3dzIiwgIl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUiLCAiYXBwZW5kQ2hpbGQiLCAiX3RvcEJvdW5kYXJ5Rm9jdXNMaXN0ZW5lciIsICJfaGFuZGxlQm91bmRhcnlGb2N1cyIsICJfYm90dG9tQm91bmRhcnlGb2N1c0xpc3RlbmVyIiwgImFkZEV2ZW50TGlzdGVuZXIiLCAibGVuZ3RoIiwgIl9yZWZyZXNoUm93c0RpbWVuc2lvbnMiLCAiX2xpdmVSZWdpb24iLCAiX2xpdmVSZWdpb25EZWJvdW5jZXIiLCAicmVnaXN0ZXIiLCAiVGltZUJhc2VkRGVib3VuY2VyIiwgIl9yZW5kZXJSb3dzIiwgImJpbmQiLCAiZWxlbWVudCIsICJFcnJvciIsICJpbnNlcnRBZGphY2VudEVsZW1lbnQiLCAib25SZXNpemUiLCAiX2hhbmRsZVJlc2l6ZSIsICJvblJlbmRlciIsICJfcmVmcmVzaFJvd3MiLCAic3RhcnQiLCAiZW5kIiwgIm9uU2Nyb2xsIiwgIm9uQTExeUNoYXIiLCAiY2hhciIsICJfaGFuZGxlQ2hhciIsICJvbkxpbmVGZWVkIiwgIm9uQTExeVRhYiIsICJzcGFjZUNvdW50IiwgIl9oYW5kbGVUYWIiLCAib25LZXkiLCAiX2hhbmRsZUtleSIsICJrZXkiLCAib25CbHVyIiwgIl9jbGVhckxpdmVSZWdpb24iLCAib25EaW1lbnNpb25zQ2hhbmdlIiwgImFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciIsICJkb2N1bWVudCIsICJfaGFuZGxlU2VsZWN0aW9uQ2hhbmdlIiwgIm9uRHByQ2hhbmdlIiwgInRvRGlzcG9zYWJsZSIsICJyZW1vdmUiLCAiTUFYX1JPV1NfVE9fUkVBRCIsICJzaGlmdCIsICJ0ZXh0Q29udGVudCIsICJTdHJpbmdzIiwgInRvb011Y2hPdXRwdXQiLCAia2V5Q2hhciIsICJ0ZXN0IiwgInB1c2giLCAicmVmcmVzaCIsICJidWZmZXIiLCAic2V0U2l6ZSIsICJsaW5lcyIsICJ0b1N0cmluZyIsICJsaW5lIiwgImdldCIsICJ5ZGlzcCIsICJjb2x1bW5zIiwgImxpbmVEYXRhIiwgInRyYW5zbGF0ZVRvU3RyaW5nIiwgInVuZGVmaW5lZCIsICJwb3NJblNldCIsICJpbm5lclRleHQiLCAic2V0IiwgIl9hbm5vdW5jZUNoYXJhY3RlcnMiLCAicG9zaXRpb24iLCAiYm91bmRhcnlFbGVtZW50IiwgInRhcmdldCIsICJiZWZvcmVCb3VuZGFyeUVsZW1lbnQiLCAiZ2V0QXR0cmlidXRlIiwgInJlbGF0ZWRUYXJnZXQiLCAidG9wQm91bmRhcnlFbGVtZW50IiwgImJvdHRvbUJvdW5kYXJ5RWxlbWVudCIsICJwb3AiLCAicmVtb3ZlQ2hpbGQiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJuZXdFbGVtZW50IiwgInVuc2hpZnQiLCAic2Nyb2xsTGluZXMiLCAiZm9jdXMiLCAicHJldmVudERlZmF1bHQiLCAic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwgInNlbGVjdGlvbiIsICJnZXRTZWxlY3Rpb24iLCAiaXNDb2xsYXBzZWQiLCAiY29udGFpbnMiLCAiYW5jaG9yTm9kZSIsICJjbGVhclNlbGVjdGlvbiIsICJmb2N1c05vZGUiLCAiY29uc29sZSIsICJlcnJvciIsICJiZWdpbiIsICJub2RlIiwgIm9mZnNldCIsICJhbmNob3JPZmZzZXQiLCAiZm9jdXNPZmZzZXQiLCAiY29tcGFyZURvY3VtZW50UG9zaXRpb24iLCAiTm9kZSIsICJET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkciLCAiRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZIiwgIkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORyIsICJjaGlsZE5vZGVzIiwgImxhc3RSb3dFbGVtZW50IiwgInNsaWNlIiwgInRvUm93Q29sdW1uIiwgInJvd0VsZW1lbnQiLCAiVGV4dCIsICJwYXJlbnROb2RlIiwgInJvdyIsICJwYXJzZUludCIsICJpc05hTiIsICJ3YXJuIiwgImNvbHVtbiIsICJjb2xzIiwgImJlZ2luUm93Q29sdW1uIiwgImVuZFJvd0NvbHVtbiIsICJzZWxlY3QiLCAiY2hpbGRyZW4iLCAidGFiSW5kZXgiLCAiX3JlZnJlc2hSb3dEaW1lbnNpb25zIiwgImRpbWVuc2lvbnMiLCAiY3NzIiwgImNlbGwiLCAiaGVpZ2h0IiwgInN0eWxlIiwgIndpZHRoIiwgImNhbnZhcyIsICJJSW5zdGFudGlhdGlvblNlcnZpY2UiLCAiSUNvcmVCcm93c2VyU2VydmljZSIsICJJUmVuZGVyU2VydmljZSIsICJwcmVwYXJlVGV4dEZvclRlcm1pbmFsIiwgInRleHQiLCAicmVwbGFjZSIsICJicmFja2V0VGV4dEZvclBhc3RlIiwgImJyYWNrZXRlZFBhc3RlTW9kZSIsICJwYXN0ZSIsICJ0ZXh0YXJlYSIsICJjb3JlU2VydmljZSIsICJvcHRpb25zU2VydmljZSIsICJkZWNQcml2YXRlTW9kZXMiLCAicmF3T3B0aW9ucyIsICJpZ25vcmVCcmFja2V0ZWRQYXN0ZU1vZGUiLCAidHJpZ2dlckRhdGFFdmVudCIsICJ2YWx1ZSIsICJtb3ZlVGV4dEFyZWFVbmRlck1vdXNlQ3Vyc29yIiwgImV2IiwgInNjcmVlbkVsZW1lbnQiLCAicG9zIiwgImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsICJsZWZ0IiwgImNsaWVudFgiLCAidG9wIiwgImNsaWVudFkiLCAiekluZGV4IiwgInNlbGVjdGlvblNlcnZpY2UiLCAiY2xpcGJvYXJkRGF0YSIsICJzZXREYXRhIiwgInNlbGVjdGlvblRleHQiLCAic3RvcFByb3BhZ2F0aW9uIiwgImdldERhdGEiLCAic2hvdWxkU2VsZWN0V29yZCIsICJyaWdodENsaWNrU2VsZWN0IiwgIl9jb2xvciIsICJUd29LZXlNYXAiLCAiX2NzcyIsICJiZyIsICJmZyIsICJjbGVhciIsICJ0eXBlIiwgImhhbmRsZXIiLCAib3B0aW9ucyIsICJkaXNwb3NlZCIsICJkaXNwb3NlIiwgIkxpbmtpZmllciIsICJjdXJyZW50TGluayIsICJfY3VycmVudExpbmsiLCAiX2VsZW1lbnQiLCAiX21vdXNlU2VydmljZSIsICJfYnVmZmVyU2VydmljZSIsICJfbGlua1Byb3ZpZGVyU2VydmljZSIsICJfbGlua0NhY2hlRGlzcG9zYWJsZXMiLCAiX2lzTW91c2VPdXQiLCAiX3dhc1Jlc2l6ZWQiLCAiX2FjdGl2ZUxpbmUiLCAiX29uU2hvd0xpbmtVbmRlcmxpbmUiLCAiRXZlbnRFbWl0dGVyIiwgIm9uU2hvd0xpbmtVbmRlcmxpbmUiLCAiZXZlbnQiLCAiX29uSGlkZUxpbmtVbmRlcmxpbmUiLCAib25IaWRlTGlua1VuZGVybGluZSIsICJnZXREaXNwb3NlQXJyYXlEaXNwb3NhYmxlIiwgIl9sYXN0TW91c2VFdmVudCIsICJfYWN0aXZlUHJvdmlkZXJSZXBsaWVzIiwgIl9jbGVhckN1cnJlbnRMaW5rIiwgIl9oYW5kbGVNb3VzZU1vdmUiLCAiX2hhbmRsZU1vdXNlRG93biIsICJfaGFuZGxlTW91c2VVcCIsICJfcG9zaXRpb25Gcm9tTW91c2VFdmVudCIsICJjb21wb3NlZFBhdGgiLCAiX2xhc3RCdWZmZXJDZWxsIiwgIngiLCAieSIsICJfaGFuZGxlSG92ZXIiLCAiX2Fza0ZvckxpbmsiLCAiX2xpbmtBdFBvc2l0aW9uIiwgImxpbmsiLCAidXNlTGluZUNhY2hlIiwgImZvckVhY2giLCAicmVwbHkiLCAibGlua1dpdGhTdGF0ZSIsICJNYXAiLCAibGlua1Byb3ZpZGVkIiwgImxpbmtQcm92aWRlciIsICJsaW5rUHJvdmlkZXJzIiwgImVudHJpZXMiLCAiZXhpc3RpbmdSZXBseSIsICJfY2hlY2tMaW5rUHJvdmlkZXJSZXN1bHQiLCAicHJvdmlkZUxpbmtzIiwgImxpbmtzIiwgImxpbmtzV2l0aFN0YXRlIiwgIm1hcCIsICJzaXplIiwgIl9yZW1vdmVJbnRlcnNlY3RpbmdMaW5rcyIsICJyZXBsaWVzIiwgIm9jY3VwaWVkQ2VsbHMiLCAiU2V0IiwgInByb3ZpZGVyUmVwbHkiLCAic3RhcnRYIiwgInJhbmdlIiwgImVuZFgiLCAiaGFzIiwgInNwbGljZSIsICJpbmRleCIsICJoYXNMaW5rQmVmb3JlIiwgImoiLCAibGlua0F0UG9zaXRpb24iLCAiZmluZCIsICJfaGFuZGxlTmV3TGluayIsICJfbW91c2VEb3duTGluayIsICJhY3RpdmF0ZSIsICJzdGFydFJvdyIsICJlbmRSb3ciLCAiX2xpbmtMZWF2ZSIsICJkaXNwb3NlQXJyYXkiLCAic3RhdGUiLCAiZGVjb3JhdGlvbnMiLCAidW5kZXJsaW5lIiwgInBvaW50ZXJDdXJzb3IiLCAiaXNIb3ZlcmVkIiwgIl9saW5rSG92ZXIiLCAiT2JqZWN0IiwgImRlZmluZVByb3BlcnRpZXMiLCAidiIsICJ0b2dnbGUiLCAiX2ZpcmVVbmRlcmxpbmVFdmVudCIsICJvblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UiLCAiaG92ZXIiLCAic2hvd0V2ZW50IiwgInNjcm9sbE9mZnNldCIsICJfY3JlYXRlTGlua1VuZGVybGluZUV2ZW50IiwgImZpcmUiLCAibGVhdmUiLCAibG93ZXIiLCAidXBwZXIiLCAiY3VycmVudCIsICJtb3VzZVNlcnZpY2UiLCAiY29vcmRzIiwgImdldENvb3JkcyIsICJ4MSIsICJ5MSIsICJ4MiIsICJ5MiIsICJJTW91c2VTZXJ2aWNlIiwgIklCdWZmZXJTZXJ2aWNlIiwgIklMaW5rUHJvdmlkZXJTZXJ2aWNlIiwgInByb21wdExhYmVsIiwgIk9zY0xpbmtQcm92aWRlciIsICJfb3B0aW9uc1NlcnZpY2UiLCAiX29zY0xpbmtTZXJ2aWNlIiwgImNhbGxiYWNrIiwgInJlc3VsdCIsICJsaW5rSGFuZGxlciIsICJDZWxsRGF0YSIsICJsaW5lTGVuZ3RoIiwgImdldFRyaW1tZWRMZW5ndGgiLCAiY3VycmVudExpbmtJZCIsICJjdXJyZW50U3RhcnQiLCAiZmluaXNoTGluayIsICJoYXNDb250ZW50IiwgImxvYWRDZWxsIiwgImhhc0V4dGVuZGVkQXR0cnMiLCAiZXh0ZW5kZWQiLCAidXJsSWQiLCAiZ2V0TGlua0RhdGEiLCAidXJpIiwgImlnbm9yZUxpbmsiLCAiYWxsb3dOb25IdHRwUHJvdG9jb2xzIiwgInBhcnNlZCIsICJVUkwiLCAiaW5jbHVkZXMiLCAicHJvdG9jb2wiLCAiZGVmYXVsdEFjdGl2YXRlIiwgImNvbmZpcm0iLCAibmV3V2luZG93IiwgIndpbmRvdyIsICJvcGVuIiwgIm9wZW5lciIsICJsb2NhdGlvbiIsICJocmVmIiwgIklPcHRpb25zU2VydmljZSIsICJJT3NjTGlua1NlcnZpY2UiLCAiX3JlbmRlckNhbGxiYWNrIiwgIl9yZWZyZXNoQ2FsbGJhY2tzIiwgIl9hbmltYXRpb25GcmFtZSIsICJjYW5jZWxBbmltYXRpb25GcmFtZSIsICJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCAiX2lubmVyUmVmcmVzaCIsICJyb3dTdGFydCIsICJyb3dFbmQiLCAicm93Q291bnQiLCAiX3Jvd0NvdW50IiwgIl9yb3dTdGFydCIsICJNYXRoIiwgIm1pbiIsICJfcm93RW5kIiwgIm1heCIsICJfcnVuUmVmcmVzaENhbGxiYWNrcyIsICJUZXJtaW5hbCIsICJDb3JlVGVybWluYWwiLCAib25Gb2N1cyIsICJfb25Gb2N1cyIsICJfb25CbHVyIiwgIl9vbkExMXlDaGFyRW1pdHRlciIsICJfb25BMTF5VGFiRW1pdHRlciIsICJvbldpbGxPcGVuIiwgIl9vbldpbGxPcGVuIiwgImJyb3dzZXIiLCAiQnJvd3NlciIsICJfa2V5RG93bkhhbmRsZWQiLCAiX2tleURvd25TZWVuIiwgIl9rZXlQcmVzc0hhbmRsZWQiLCAiX3VucHJvY2Vzc2VkRGVhZEtleSIsICJfYWNjZXNzaWJpbGl0eU1hbmFnZXIiLCAiTXV0YWJsZURpc3Bvc2FibGUiLCAiX29uQ3Vyc29yTW92ZSIsICJvbkN1cnNvck1vdmUiLCAiX29uS2V5IiwgIl9vblJlbmRlciIsICJfb25TZWxlY3Rpb25DaGFuZ2UiLCAib25TZWxlY3Rpb25DaGFuZ2UiLCAiX29uVGl0bGVDaGFuZ2UiLCAib25UaXRsZUNoYW5nZSIsICJfb25CZWxsIiwgIm9uQmVsbCIsICJfc2V0dXAiLCAiX2RlY29yYXRpb25TZXJ2aWNlIiwgIl9pbnN0YW50aWF0aW9uU2VydmljZSIsICJjcmVhdGVJbnN0YW5jZSIsICJEZWNvcmF0aW9uU2VydmljZSIsICJzZXRTZXJ2aWNlIiwgIklEZWNvcmF0aW9uU2VydmljZSIsICJMaW5rUHJvdmlkZXJTZXJ2aWNlIiwgInJlZ2lzdGVyTGlua1Byb3ZpZGVyIiwgIl9pbnB1dEhhbmRsZXIiLCAib25SZXF1ZXN0QmVsbCIsICJvblJlcXVlc3RSZWZyZXNoUm93cyIsICJvblJlcXVlc3RTZW5kRm9jdXMiLCAiX3JlcG9ydEZvY3VzIiwgIm9uUmVxdWVzdFJlc2V0IiwgInJlc2V0IiwgIm9uUmVxdWVzdFdpbmRvd3NPcHRpb25zUmVwb3J0IiwgIl9yZXBvcnRXaW5kb3dzT3B0aW9ucyIsICJvbkNvbG9yIiwgIl9oYW5kbGVDb2xvckV2ZW50IiwgImZvcndhcmRFdmVudCIsICJfYWZ0ZXJSZXNpemUiLCAiX2N1c3RvbUtleUV2ZW50SGFuZGxlciIsICJfdGhlbWVTZXJ2aWNlIiwgInJlcSIsICJhY2MiLCAiaWRlbnQiLCAiY29sb3JSZ2IiLCAiY29sb3IiLCAidG9Db2xvclJHQiIsICJjb2xvcnMiLCAiYW5zaSIsICJDMCIsICJFU0MiLCAidG9SZ2JTdHJpbmciLCAiQzFfRVNDQVBFRCIsICJTVCIsICJtb2RpZnlDb2xvcnMiLCAiY2hhbm5lbHMiLCAidG9Db2xvciIsICJuYXJyb3dlZEFjYyIsICJyZXN0b3JlQ29sb3IiLCAiYnVmZmVycyIsICJhY3RpdmUiLCAicHJldmVudFNjcm9sbCIsICJzZW5kRm9jdXMiLCAiX3Nob3dDdXJzb3IiLCAiYmx1ciIsICJfaGFuZGxlVGV4dEFyZWFCbHVyIiwgIl9zeW5jVGV4dEFyZWEiLCAiaXNDdXJzb3JJblZpZXdwb3J0IiwgIl9jb21wb3NpdGlvbkhlbHBlciIsICJpc0NvbXBvc2luZyIsICJjdXJzb3JZIiwgInliYXNlIiwgImJ1ZmZlckxpbmUiLCAiY3Vyc29yWCIsICJjZWxsSGVpZ2h0IiwgImdldFdpZHRoIiwgImNlbGxXaWR0aCIsICJjdXJzb3JUb3AiLCAiY3Vyc29yTGVmdCIsICJsaW5lSGVpZ2h0IiwgIl9pbml0R2xvYmFsIiwgIl9iaW5kS2V5cyIsICJoYXNTZWxlY3Rpb24iLCAiY29weUhhbmRsZXIiLCAiX3NlbGVjdGlvblNlcnZpY2UiLCAicGFzdGVIYW5kbGVyV3JhcHBlciIsICJoYW5kbGVQYXN0ZUV2ZW50IiwgImlzRmlyZWZveCIsICJidXR0b24iLCAicmlnaHRDbGlja0hhbmRsZXIiLCAicmlnaHRDbGlja1NlbGVjdHNXb3JkIiwgImlzTGludXgiLCAiX2tleVVwIiwgIl9rZXlEb3duIiwgIl9rZXlQcmVzcyIsICJjb21wb3NpdGlvbnN0YXJ0IiwgImNvbXBvc2l0aW9udXBkYXRlIiwgImNvbXBvc2l0aW9uZW5kIiwgIl9pbnB1dEV2ZW50IiwgInVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHMiLCAicGFyZW50IiwgImlzQ29ubmVjdGVkIiwgIl9sb2dTZXJ2aWNlIiwgImRlYnVnIiwgIm93bmVyRG9jdW1lbnQiLCAiZGVmYXVsdFZpZXciLCAiX2RvY3VtZW50IiwgImRvY3VtZW50T3ZlcnJpZGUiLCAiRG9jdW1lbnQiLCAiZGlyIiwgImZyYWdtZW50IiwgImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCAiX3ZpZXdwb3J0RWxlbWVudCIsICJfdmlld3BvcnRTY3JvbGxBcmVhIiwgInVwZGF0ZUN1cnNvclN0eWxlIiwgIl9oZWxwZXJDb250YWluZXIiLCAiaXNDaHJvbWVPUyIsICJDb3JlQnJvd3NlclNlcnZpY2UiLCAiX2hhbmRsZVRleHRBcmVhRm9jdXMiLCAiX2NoYXJTaXplU2VydmljZSIsICJDaGFyU2l6ZVNlcnZpY2UiLCAiSUNoYXJTaXplU2VydmljZSIsICJUaGVtZVNlcnZpY2UiLCAiSVRoZW1lU2VydmljZSIsICJfY2hhcmFjdGVySm9pbmVyU2VydmljZSIsICJDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIiwgIklDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIiwgIlJlbmRlclNlcnZpY2UiLCAicmVzaXplIiwgIl9jb21wb3NpdGlvblZpZXciLCAiQ29tcG9zaXRpb25IZWxwZXIiLCAiTW91c2VTZXJ2aWNlIiwgImxpbmtpZmllciIsICJoYXNSZW5kZXJlciIsICJzZXRSZW5kZXJlciIsICJfY3JlYXRlUmVuZGVyZXIiLCAidmlld3BvcnQiLCAiVmlld3BvcnQiLCAib25SZXF1ZXN0U2Nyb2xsTGluZXMiLCAiYW1vdW50IiwgInN1cHByZXNzU2Nyb2xsRXZlbnQiLCAib25SZXF1ZXN0U3luY1Njcm9sbEJhciIsICJzeW5jU2Nyb2xsQXJlYSIsICJoYW5kbGVDdXJzb3JNb3ZlIiwgImhhbmRsZVJlc2l6ZSIsICJoYW5kbGVCbHVyIiwgImhhbmRsZUZvY3VzIiwgIlNlbGVjdGlvblNlcnZpY2UiLCAiSVNlbGVjdGlvblNlcnZpY2UiLCAib25SZXF1ZXN0UmVkcmF3IiwgImhhbmRsZVNlbGVjdGlvbkNoYW5nZWQiLCAiY29sdW1uU2VsZWN0TW9kZSIsICJvbkxpbnV4TW91c2VTZWxlY3Rpb24iLCAiX29uU2Nyb2xsIiwgIkJ1ZmZlckRlY29yYXRpb25SZW5kZXJlciIsICJoYW5kbGVNb3VzZURvd24iLCAiY29yZU1vdXNlU2VydmljZSIsICJhcmVNb3VzZUV2ZW50c0FjdGl2ZSIsICJkaXNhYmxlIiwgImVuYWJsZSIsICJzY3JlZW5SZWFkZXJNb2RlIiwgIm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UiLCAiX2hhbmRsZVNjcmVlblJlYWRlck1vZGVPcHRpb25DaGFuZ2UiLCAib3ZlcnZpZXdSdWxlcldpZHRoIiwgIl9vdmVydmlld1J1bGVyUmVuZGVyZXIiLCAiT3ZlcnZpZXdSdWxlclJlbmRlcmVyIiwgIm1lYXN1cmUiLCAiYmluZE1vdXNlIiwgIkRvbVJlbmRlcmVyIiwgInNlbGYiLCAiZWwiLCAic2VuZEV2ZW50IiwgImdldE1vdXNlUmVwb3J0Q29vcmRzIiwgImJ1dCIsICJhY3Rpb24iLCAib3ZlcnJpZGVUeXBlIiwgImJ1dHRvbnMiLCAiX2N1c3RvbVdoZWVsRXZlbnRIYW5kbGVyIiwgImdldExpbmVzU2Nyb2xsZWQiLCAiZGVsdGFZIiwgInRyaWdnZXJNb3VzZUV2ZW50IiwgImNvbCIsICJjdHJsIiwgImN0cmxLZXkiLCAiYWx0IiwgImFsdEtleSIsICJzaGlmdEtleSIsICJyZXF1ZXN0ZWRFdmVudHMiLCAibW91c2V1cCIsICJ3aGVlbCIsICJtb3VzZWRyYWciLCAibW91c2Vtb3ZlIiwgImV2ZW50TGlzdGVuZXJzIiwgImNhbmNlbCIsICJvblByb3RvY29sQ2hhbmdlIiwgImV2ZW50cyIsICJsb2dMZXZlbCIsICJleHBsYWluRXZlbnRzIiwgInBhc3NpdmUiLCAiYWN0aXZlUHJvdG9jb2wiLCAic2hvdWxkRm9yY2VTZWxlY3Rpb24iLCAiaGFzU2Nyb2xsYmFjayIsICJzZXF1ZW5jZSIsICJhcHBsaWNhdGlvbkN1cnNvcktleXMiLCAiZGF0YSIsICJhYnMiLCAiaGFuZGxlV2hlZWwiLCAiaGFuZGxlVG91Y2hTdGFydCIsICJoYW5kbGVUb3VjaE1vdmUiLCAicmVmcmVzaFJvd3MiLCAic2hvdWxkQ29sdW1uU2VsZWN0IiwgImlzQ3Vyc29ySW5pdGlhbGl6ZWQiLCAiZGlzcCIsICJzb3VyY2UiLCAiY3VzdG9tS2V5RXZlbnRIYW5kbGVyIiwgImN1c3RvbVdoZWVsRXZlbnRIYW5kbGVyIiwgImpvaW5lcklkIiwgImRlcmVnaXN0ZXIiLCAibWFya2VycyIsICJjdXJzb3JZT2Zmc2V0IiwgImFkZE1hcmtlciIsICJkZWNvcmF0aW9uT3B0aW9ucyIsICJyZWdpc3RlckRlY29yYXRpb24iLCAic2V0U2VsZWN0aW9uIiwgImdldFNlbGVjdGlvblBvc2l0aW9uIiwgInNlbGVjdGlvblN0YXJ0IiwgInNlbGVjdGlvbkVuZCIsICJzZWxlY3RBbGwiLCAic2VsZWN0TGluZXMiLCAic2hvdWxkSWdub3JlQ29tcG9zaXRpb24iLCAiaXNNYWMiLCAibWFjT3B0aW9uSXNNZXRhIiwgImtleWRvd24iLCAic2Nyb2xsT25Vc2VySW5wdXQiLCAic2Nyb2xsVG9Cb3R0b20iLCAiZXZhbHVhdGVLZXlib2FyZEV2ZW50IiwgInNjcm9sbENvdW50IiwgIl9pc1RoaXJkTGV2ZWxTaGlmdCIsICJtZXRhS2V5IiwgImNoYXJDb2RlQXQiLCAiRVRYIiwgIkNSIiwgImRvbUV2ZW50IiwgInRoaXJkTGV2ZWxLZXkiLCAiaXNXaW5kb3dzIiwgImdldE1vZGlmaWVyU3RhdGUiLCAia2V5Q29kZSIsICJjaGFyQ29kZSIsICJ3aGljaCIsICJTdHJpbmciLCAiZnJvbUNoYXJDb2RlIiwgImlucHV0VHlwZSIsICJjb21wb3NlZCIsICJoYXNWYWxpZFNpemUiLCAiY2xlYXJBbGxNYXJrZXJzIiwgImdldEJsYW5rTGluZSIsICJERUZBVUxUX0FUVFJfREFUQSIsICJjbGVhclRleHR1cmVBdGxhcyIsICJXaW5kb3dzT3B0aW9uc1JlcG9ydFR5cGUiLCAiR0VUX1dJTl9TSVpFX1BJWEVMUyIsICJjYW52YXNXaWR0aCIsICJ0b0ZpeGVkIiwgImNhbnZhc0hlaWdodCIsICJHRVRfQ0VMTF9TSVpFX1BJWEVMUyIsICJmb3JjZSIsICJjYW5jZWxFdmVudHMiLCAiX2RlYm91bmNlVGhyZXNob2xkTVMiLCAiX2xhc3RSZWZyZXNoTXMiLCAiX2FkZGl0aW9uYWxSZWZyZXNoUmVxdWVzdGVkIiwgIl9yZWZyZXNoVGltZW91dElEIiwgImNsZWFyVGltZW91dCIsICJyZWZyZXNoUmVxdWVzdFRpbWUiLCAiRGF0ZSIsICJub3ciLCAiZWxhcHNlZCIsICJ3YWl0UGVyaW9kQmVmb3JlVHJhaWxpbmdSZWZyZXNoIiwgInNldFRpbWVvdXQiLCAiX3Njcm9sbEFyZWEiLCAiaCIsICJ0aGVtZVNlcnZpY2UiLCAic2Nyb2xsQmFyV2lkdGgiLCAiX2N1cnJlbnRSb3dIZWlnaHQiLCAiX2N1cnJlbnREZXZpY2VDZWxsSGVpZ2h0IiwgIl9sYXN0UmVjb3JkZWRCdWZmZXJMZW5ndGgiLCAiX2xhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0IiwgIl9sYXN0UmVjb3JkZWRCdWZmZXJIZWlnaHQiLCAiX2xhc3RUb3VjaFkiLCAiX2xhc3RTY3JvbGxUb3AiLCAiX3doZWVsUGFydGlhbFNjcm9sbCIsICJfcmVmcmVzaEFuaW1hdGlvbkZyYW1lIiwgIl9pZ25vcmVOZXh0U2Nyb2xsRXZlbnQiLCAiX3Ntb290aFNjcm9sbFN0YXRlIiwgInN0YXJ0VGltZSIsICJvcmlnaW4iLCAiX29uUmVxdWVzdFNjcm9sbExpbmVzIiwgIm9mZnNldFdpZHRoIiwgIl9oYW5kbGVTY3JvbGwiLCAiX2FjdGl2ZUJ1ZmZlciIsICJvbkJ1ZmZlckFjdGl2YXRlIiwgImFjdGl2ZUJ1ZmZlciIsICJfcmVuZGVyRGltZW5zaW9ucyIsICJfaGFuZGxlVGhlbWVDaGFuZ2UiLCAib25DaGFuZ2VDb2xvcnMiLCAiYmFja2dyb3VuZENvbG9yIiwgImJhY2tncm91bmQiLCAiaW1tZWRpYXRlIiwgImRldmljZSIsICJkcHIiLCAib2Zmc2V0SGVpZ2h0IiwgIm5ld0J1ZmZlckhlaWdodCIsICJyb3VuZCIsICJzY3JvbGxUb3AiLCAiX3JlZnJlc2giLCAib2Zmc2V0UGFyZW50IiwgImRpZmYiLCAiX3Ntb290aFNjcm9sbCIsICJfaXNEaXNwb3NlZCIsICJwZXJjZW50IiwgIl9zbW9vdGhTY3JvbGxQZXJjZW50IiwgIl9jbGVhclNtb290aFNjcm9sbFN0YXRlIiwgInNtb290aFNjcm9sbER1cmF0aW9uIiwgInNjcm9sbFBvc0Zyb21Ub3AiLCAiY2FuY2VsYWJsZSIsICJfZ2V0UGl4ZWxzU2Nyb2xsZWQiLCAic2Nyb2xsSGVpZ2h0IiwgIl9idWJibGVTY3JvbGwiLCAiX2FwcGx5U2Nyb2xsTW9kaWZpZXIiLCAiZGVsdGFNb2RlIiwgIldoZWVsRXZlbnQiLCAiRE9NX0RFTFRBX0xJTkUiLCAiRE9NX0RFTFRBX1BBR0UiLCAic3RhcnRMaW5lIiwgImVuZExpbmUiLCAiY3Vyc29yRWxlbWVudCIsICJjdXJyZW50TGluZSIsICJidWZmZXJFbGVtZW50cyIsICJpc1dyYXBwZWQiLCAiZGl2IiwgIkRPTV9ERUxUQV9QSVhFTCIsICJmbG9vciIsICJtb2RpZmllciIsICJmYXN0U2Nyb2xsTW9kaWZpZXIiLCAiZmFzdFNjcm9sbFNlbnNpdGl2aXR5IiwgInNjcm9sbFNlbnNpdGl2aXR5IiwgInRvdWNoZXMiLCAicGFnZVkiLCAiX3NjcmVlbkVsZW1lbnQiLCAiX2RlY29yYXRpb25FbGVtZW50cyIsICJfYWx0QnVmZmVySXNBY3RpdmUiLCAiX2RpbWVuc2lvbnNDaGFuZ2VkIiwgIl9jb250YWluZXIiLCAiX2RvUmVmcmVzaERlY29yYXRpb25zIiwgIl9xdWV1ZVJlZnJlc2giLCAib25EZWNvcmF0aW9uUmVnaXN0ZXJlZCIsICJvbkRlY29yYXRpb25SZW1vdmVkIiwgImRlY29yYXRpb24iLCAiX3JlbW92ZURlY29yYXRpb24iLCAiYWRkUmVmcmVzaENhbGxiYWNrIiwgIl9yZW5kZXJEZWNvcmF0aW9uIiwgIl9yZWZyZXNoU3R5bGUiLCAiX3JlZnJlc2hYUG9zaXRpb24iLCAibGF5ZXIiLCAibWFya2VyIiwgImRpc3BsYXkiLCAib25SZW5kZXJFbWl0dGVyIiwgIl9jcmVhdGVFbGVtZW50IiwgIm9uRGlzcG9zZSIsICJkZWxldGUiLCAiYW5jaG9yIiwgInJpZ2h0IiwgIl96b25lcyIsICJfem9uZVBvb2wiLCAiX3pvbmVQb29sSW5kZXgiLCAiX2xpbmVQYWRkaW5nIiwgImZ1bGwiLCAiY2VudGVyIiwgInpvbmVzIiwgIm92ZXJ2aWV3UnVsZXJPcHRpb25zIiwgInoiLCAiX2xpbmVJbnRlcnNlY3RzWm9uZSIsICJfbGluZUFkamFjZW50VG9ab25lIiwgIl9hZGRMaW5lVG9ab25lIiwgInN0YXJ0QnVmZmVyTGluZSIsICJlbmRCdWZmZXJMaW5lIiwgInBhZGRpbmciLCAiem9uZSIsICJkcmF3SGVpZ2h0IiwgImRyYXdXaWR0aCIsICJkcmF3WCIsICJfd2lkdGgiLCAiX2NvbG9yWm9uZVN0b3JlIiwgIkNvbG9yWm9uZVN0b3JlIiwgIl9zaG91bGRVcGRhdGVEaW1lbnNpb25zIiwgIl9zaG91bGRVcGRhdGVBbmNob3IiLCAiX2xhc3RLbm93bkJ1ZmZlckxlbmd0aCIsICJfY2FudmFzIiwgIl9yZWZyZXNoQ2FudmFzRGltZW5zaW9ucyIsICJwYXJlbnRFbGVtZW50IiwgImluc2VydEJlZm9yZSIsICJjdHgiLCAiZ2V0Q29udGV4dCIsICJfY3R4IiwgIl9yZWdpc3RlckRlY29yYXRpb25MaXN0ZW5lcnMiLCAiX3JlZ2lzdGVyQnVmZmVyQ2hhbmdlTGlzdGVuZXJzIiwgIl9yZWdpc3RlckRpbWVuc2lvbkNoYW5nZUxpc3RlbmVycyIsICJub3JtYWwiLCAiX3JlZnJlc2hEcmF3SGVpZ2h0Q29uc3RhbnRzIiwgIl9yZWZyZXNoQ29sb3Jab25lUGFkZGluZyIsICJfY29udGFpbmVySGVpZ2h0IiwgImNsaWVudEhlaWdodCIsICJfcmVmcmVzaERyYXdDb25zdGFudHMiLCAib3V0ZXJXaWR0aCIsICJpbm5lcldpZHRoIiwgImNlaWwiLCAicGl4ZWxzUGVyTGluZSIsICJub25GdWxsSGVpZ2h0IiwgInNldFBhZGRpbmciLCAiX3JlZnJlc2hEZWNvcmF0aW9ucyIsICJjbGVhclJlY3QiLCAiYWRkRGVjb3JhdGlvbiIsICJsaW5lV2lkdGgiLCAiX3JlbmRlckNvbG9yWm9uZSIsICJmaWxsU3R5bGUiLCAiZmlsbFJlY3QiLCAidXBkYXRlQ2FudmFzRGltZW5zaW9ucyIsICJ1cGRhdGVBbmNob3IiLCAiX2lzQ29tcG9zaW5nIiwgIl90ZXh0YXJlYSIsICJfY29yZVNlcnZpY2UiLCAiX2lzU2VuZGluZ0NvbXBvc2l0aW9uIiwgIl9jb21wb3NpdGlvblBvc2l0aW9uIiwgIl9kYXRhQWxyZWFkeVNlbnQiLCAiX2ZpbmFsaXplQ29tcG9zaXRpb24iLCAiX2hhbmRsZUFueVRleHRhcmVhQ2hhbmdlcyIsICJ3YWl0Rm9yUHJvcGFnYXRpb24iLCAiY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb24iLCAiaW5wdXQiLCAic3Vic3RyaW5nIiwgIm9sZFZhbHVlIiwgIm5ld1ZhbHVlIiwgIkRFTCIsICJkb250UmVjdXJzZSIsICJmb250RmFtaWx5IiwgImZvbnRTaXplIiwgImNvbXBvc2l0aW9uVmlld0JvdW5kcyIsICJJQ29yZVNlcnZpY2UiLCAiZ2V0Q29vcmRzUmVsYXRpdmVUb0VsZW1lbnQiLCAicmVjdCIsICJlbGVtZW50U3R5bGUiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJsZWZ0UGFkZGluZyIsICJnZXRQcm9wZXJ0eVZhbHVlIiwgInRvcFBhZGRpbmciLCAiY29sQ291bnQiLCAiaGFzVmFsaWRDaGFyU2l6ZSIsICJjc3NDZWxsV2lkdGgiLCAiY3NzQ2VsbEhlaWdodCIsICJpc1NlbGVjdGlvbiIsICJtb3ZlVG9SZXF1ZXN0ZWRSb3ciLCAic3RhcnRZIiwgInRhcmdldFkiLCAiYnVmZmVyU2VydmljZSIsICJhcHBsaWNhdGlvbkN1cnNvciIsICJ3cmFwcGVkUm93c0ZvclJvdyIsICJyb3dzVG9Nb3ZlIiwgIndyYXBwZWRSb3dzIiwgImRpcmVjdGlvbiIsICJ2ZXJ0aWNhbERpcmVjdGlvbiIsICJyZXBlYXQiLCAiY3VycmVudFJvdyIsICJsaW5lV3JhcHMiLCAic3RhcnRDb2wiLCAiZW5kQ29sIiwgImZvcndhcmQiLCAiY3VycmVudENvbCIsICJidWZmZXJTdHIiLCAidHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nIiwgIm1vZCIsICJjb3VudCIsICJzdHIiLCAicnB0IiwgInRhcmdldFgiLCAicm93RGlmZmVyZW5jZSIsICJjdXJyWCIsICJURVJNSU5BTF9DTEFTU19QUkVGSVgiLCAiUk9XX0NPTlRBSU5FUl9DTEFTUyIsICJGR19DTEFTU19QUkVGSVgiLCAiQkdfQ0xBU1NfUFJFRklYIiwgIkZPQ1VTX0NMQVNTIiwgIlNFTEVDVElPTl9DTEFTUyIsICJuZXh0VGVybWluYWxJZCIsICJfbGlua2lmaWVyMiIsICJmIiwgImciLCAibSIsICJTIiwgInciLCAiX3Rlcm1pbmFsQ2xhc3MiLCAiX3NlbGVjdGlvblJlbmRlck1vZGVsIiwgImNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsIiwgIl9yZWZyZXNoUm93RWxlbWVudHMiLCAiX3NlbGVjdGlvbkNvbnRhaW5lciIsICJjcmVhdGVSZW5kZXJEaW1lbnNpb25zIiwgIl91cGRhdGVEaW1lbnNpb25zIiwgIm9uT3B0aW9uQ2hhbmdlIiwgIl9oYW5kbGVPcHRpb25zQ2hhbmdlZCIsICJfaW5qZWN0Q3NzIiwgIl9yb3dGYWN0b3J5IiwgIkRvbVJlbmRlcmVyUm93RmFjdG9yeSIsICJfaGFuZGxlTGlua0hvdmVyIiwgIl9oYW5kbGVMaW5rTGVhdmUiLCAiX3dpZHRoQ2FjaGUiLCAiX3RoZW1lU3R5bGVFbGVtZW50IiwgIl9kaW1lbnNpb25zU3R5bGVFbGVtZW50IiwgIldpZHRoQ2FjaGUiLCAic2V0Rm9udCIsICJmb250V2VpZ2h0IiwgImZvbnRXZWlnaHRCb2xkIiwgIl9zZXREZWZhdWx0U3BhY2luZyIsICJsZXR0ZXJTcGFjaW5nIiwgIm92ZXJmbG93IiwgInN0eWxlcyIsICJfdGVybWluYWxTZWxlY3RvciIsICJmb3JlZ3JvdW5kIiwgIm11bHRpcGx5T3BhY2l0eSIsICJibGlua0FuaW1hdGlvblVuZGVybGluZUlkIiwgImJsaW5rQW5pbWF0aW9uQmFySWQiLCAiYmxpbmtBbmltYXRpb25CbG9ja0lkIiwgImN1cnNvciIsICJjdXJzb3JBY2NlbnQiLCAiY3Vyc29yV2lkdGgiLCAic2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSIsICJzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWUiLCAiYyIsICJJTlZFUlRFRF9ERUZBVUxUX0NPTE9SIiwgIm9wYXF1ZSIsICJzcGFjaW5nIiwgImRlZmF1bHRTcGFjaW5nIiwgImhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UiLCAiaGFuZGxlQ2hhclNpemVDaGFuZ2VkIiwgInJlbmRlclJvd3MiLCAicmVwbGFjZUNoaWxkcmVuIiwgInVwZGF0ZSIsICJ2aWV3cG9ydFN0YXJ0Um93IiwgInZpZXdwb3J0RW5kUm93IiwgInZpZXdwb3J0Q2FwcGVkU3RhcnRSb3ciLCAidmlld3BvcnRDYXBwZWRFbmRSb3ciLCAiZG9jdW1lbnRGcmFnbWVudCIsICJpc1hGbGlwcGVkIiwgIl9jcmVhdGVTZWxlY3Rpb25FbGVtZW50IiwgIm1pZGRsZVJvd3NDb3VudCIsICJjb2xTdGFydCIsICJjb2xFbmQiLCAiY3Vyc29yQWJzb2x1dGVZIiwgImN1cnNvckJsaW5rIiwgImN1cnNvclN0eWxlIiwgImN1cnNvckluYWN0aXZlU3R5bGUiLCAiY3JlYXRlUm93IiwgIl9zZXRDZWxsVW5kZXJsaW5lIiwgImVuYWJsZWQiLCAibWF4WSIsICJidWZmZXJsaW5lIiwgIl93b3JrQ2VsbCIsICJfY29sdW1uU2VsZWN0TW9kZSIsICJfc2VsZWN0aW9uU3RhcnQiLCAiX3NlbGVjdGlvbkVuZCIsICJpc0N1cnNvclJvdyIsICJ3aWR0aENhY2hlIiwgImxpbmtTdGFydCIsICJsaW5rRW5kIiwgImVsZW1lbnRzIiwgImpvaW5lZFJhbmdlcyIsICJnZXRKb2luZWRDaGFyYWN0ZXJzIiwgImNoYXJFbGVtZW50IiwgImdldE5vQmdUcmltbWVkTGVuZ3RoIiwgImNlbGxBbW91bnQiLCAib2xkQmciLCAib2xkRmciLCAib2xkRXh0IiwgIm9sZExpbmtIb3ZlciIsICJvbGRTcGFjaW5nIiwgIm9sZElzSW5TZWxlY3Rpb24iLCAiY2xhc3NlcyIsICJoYXNIb3ZlciIsICJpc0pvaW5lZCIsICJsYXN0Q2hhclgiLCAiSm9pbmVkQ2VsbERhdGEiLCAiaXNJblNlbGVjdGlvbiIsICJfaXNDZWxsSW5TZWxlY3Rpb24iLCAiaXNDdXJzb3JDZWxsIiwgImlzTGlua0hvdmVyIiwgImlzRGVjb3JhdGVkIiwgImZvckVhY2hEZWNvcmF0aW9uQXRDZWxsIiwgImQiLCAiY2hhcnMiLCAiZ2V0Q2hhcnMiLCAiV0hJVEVTUEFDRV9DRUxMX0NIQVIiLCAiaXNVbmRlcmxpbmUiLCAiaXNPdmVybGluZSIsICJpc0JvbGQiLCAiaXNJdGFsaWMiLCAic2VsZWN0aW9uRm9yZWdyb3VuZCIsICJleHQiLCAiaXNJbnZpc2libGUiLCAiaXNDdXJzb3JIaWRkZW4iLCAiaXNGb2N1c2VkIiwgImlzRGltIiwgInVuZGVybGluZVN0eWxlIiwgImlzVW5kZXJsaW5lQ29sb3JEZWZhdWx0IiwgImlzVW5kZXJsaW5lQ29sb3JSR0IiLCAidGV4dERlY29yYXRpb25Db2xvciIsICJBdHRyaWJ1dGVEYXRhIiwgImdldFVuZGVybGluZUNvbG9yIiwgImpvaW4iLCAiZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMiLCAiaXNTdHJpa2V0aHJvdWdoIiwgInRleHREZWNvcmF0aW9uIiwgImdldEZnQ29sb3IiLCAiZmdDb2xvck1vZGUiLCAiZ2V0RmdDb2xvck1vZGUiLCAiZ2V0QmdDb2xvciIsICJiZ0NvbG9yTW9kZSIsICJnZXRCZ0NvbG9yTW9kZSIsICJpc0ludmVyc2UiLCAidGVtcCIsICJ0ZW1wMiIsICJiZ092ZXJyaWRlIiwgImZnT3ZlcnJpZGUiLCAicmVzb2x2ZWRCZyIsICJpc1RvcCIsICJiYWNrZ3JvdW5kQ29sb3JSR0IiLCAicmdiYSIsICJmb3JlZ3JvdW5kQ29sb3JSR0IiLCAiX2FkZFN0eWxlIiwgInBhZFN0YXJ0IiwgIl9hcHBseU1pbmltdW1Db250cmFzdCIsICJjbGFzc05hbWUiLCAibWluaW11bUNvbnRyYXN0UmF0aW8iLCAidHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yIiwgImdldENvZGUiLCAiY2FjaGUiLCAiX2dldENvbnRyYXN0Q2FjaGUiLCAiYWRqdXN0ZWRDb2xvciIsICJnZXRDb2xvciIsICJyYXRpbyIsICJlbnN1cmVDb250cmFzdFJhdGlvIiwgInNldENvbG9yIiwgImhhbGZDb250cmFzdENhY2hlIiwgImNvbnRyYXN0Q2FjaGUiLCAicGFkQ2hhciIsICJfZmxhdCIsICJGbG9hdDMyQXJyYXkiLCAiX2ZvbnQiLCAiX2ZvbnRTaXplIiwgIl93ZWlnaHQiLCAiX3dlaWdodEJvbGQiLCAiX21lYXN1cmVFbGVtZW50cyIsICJ3aGl0ZVNwYWNlIiwgImZvbnRLZXJuaW5nIiwgInJlZ3VsYXIiLCAiYm9sZCIsICJpdGFsaWMiLCAiZm9udFN0eWxlIiwgImJvbGRJdGFsaWMiLCAiX2hvbGV5IiwgImZpbGwiLCAiZm9udCIsICJ3ZWlnaHQiLCAid2VpZ2h0Qm9sZCIsICJjcCIsICJfbWVhc3VyZSIsICJ2YXJpYW50IiwgIkRJTV9PUEFDSVRZIiwgIlRFWFRfQkFTRUxJTkUiLCAiaXNMZWdhY3lFZGdlIiwgImlzUG93ZXJsaW5lR2x5cGgiLCAiY29kZXBvaW50IiwgImlzRW1vamkiLCAiZ2x5cGhTaXplWCIsICJkZXZpY2VDZWxsV2lkdGgiLCAiY3VycmVudE9mZnNldCIsICJTZWxlY3Rpb25SZW5kZXJNb2RlbCIsICJjb25zdHJ1Y3RvciIsICJ0ZXJtaW5hbCIsICJ2aWV3cG9ydFkiLCAiaXNTZWxlY3RBbGxBY3RpdmUiLCAic2VsZWN0aW9uU3RhcnRMZW5ndGgiLCAiZmluYWxTZWxlY3Rpb25TdGFydCIsICJhcmVTZWxlY3Rpb25WYWx1ZXNSZXZlcnNlZCIsICJmaW5hbFNlbGVjdGlvbkVuZCIsICJzdGFydFBsdXNMZW5ndGgiLCAiX29uQ2hhclNpemVDaGFuZ2UiLCAib25DaGFyU2l6ZUNoYW5nZSIsICJfbWVhc3VyZVN0cmF0ZWd5IiwgIlRleHRNZXRyaWNzTWVhc3VyZVN0cmF0ZWd5IiwgIkRvbU1lYXN1cmVTdHJhdGVneSIsICJvbk11bHRpcGxlT3B0aW9uQ2hhbmdlIiwgIkJhc2VNZWFzdXJlU3RhdGVneSIsICJfcmVzdWx0IiwgIl9wYXJlbnRFbGVtZW50IiwgIl9tZWFzdXJlRWxlbWVudCIsICJfdmFsaWRhdGVBbmRTZXQiLCAiTnVtYmVyIiwgIk9mZnNjcmVlbkNhbnZhcyIsICJtZWFzdXJlVGV4dCIsICJtZXRyaWNzIiwgImZvbnRCb3VuZGluZ0JveEFzY2VudCIsICJmb250Qm91bmRpbmdCb3hEZXNjZW50IiwgImZpcnN0Q2VsbCIsICJjb250ZW50IiwgImNvbWJpbmVkRGF0YSIsICJpc0NvbWJpbmVkIiwgImdldEFzQ2hhckRhdGEiLCAiX2NoYXJhY3RlckpvaW5lcnMiLCAiX25leHRDaGFyYWN0ZXJKb2luZXJJZCIsICJqb2luZXIiLCAiaWQiLCAicmFuZ2VzIiwgImxpbmVTdHIiLCAicmFuZ2VTdGFydENvbHVtbiIsICJjdXJyZW50U3RyaW5nSW5kZXgiLCAicmFuZ2VTdGFydFN0cmluZ0luZGV4IiwgInJhbmdlQXR0ckZHIiwgImdldEZnIiwgInJhbmdlQXR0ckJHIiwgImdldEJnIiwgIl9nZXRKb2luZWRSYW5nZXMiLCAic3RhcnRJbmRleCIsICJlbmRJbmRleCIsICJhbGxKb2luZWRSYW5nZXMiLCAiam9pbmVyUmFuZ2VzIiwgIl9tZXJnZVJhbmdlcyIsICJfc3RyaW5nUmFuZ2VzVG9DZWxsUmFuZ2VzIiwgImN1cnJlbnRSYW5nZUluZGV4IiwgImN1cnJlbnRSYW5nZVN0YXJ0ZWQiLCAiY3VycmVudFJhbmdlIiwgImdldFN0cmluZyIsICJuZXdSYW5nZSIsICJpblJhbmdlIiwgIl93aW5kb3ciLCAiX2lzRm9jdXNlZCIsICJfY2FjaGVkSXNGb2N1c2VkIiwgIl9zY3JlZW5EcHJNb25pdG9yIiwgIlNjcmVlbkRwck1vbml0b3IiLCAiX29uRHByQ2hhbmdlIiwgIl9vbldpbmRvd0NoYW5nZSIsICJvbldpbmRvd0NoYW5nZSIsICJzZXRXaW5kb3ciLCAiZGV2aWNlUGl4ZWxSYXRpbyIsICJoYXNGb2N1cyIsICJxdWV1ZU1pY3JvdGFzayIsICJfcGFyZW50V2luZG93IiwgIl93aW5kb3dSZXNpemVMaXN0ZW5lciIsICJfb3V0ZXJMaXN0ZW5lciIsICJfc2V0RHByQW5kRmlyZUlmRGlmZmVycyIsICJfY3VycmVudERldmljZVBpeGVsUmF0aW8iLCAiX3VwZGF0ZURwciIsICJfc2V0V2luZG93UmVzaXplTGlzdGVuZXIiLCAiY2xlYXJMaXN0ZW5lciIsICJwYXJlbnRXaW5kb3ciLCAiX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdCIsICJyZW1vdmVMaXN0ZW5lciIsICJtYXRjaE1lZGlhIiwgImFkZExpc3RlbmVyIiwgInByb3ZpZGVySW5kZXgiLCAiaW5kZXhPZiIsICJfcmVuZGVyZXIiLCAiZGVjb3JhdGlvblNlcnZpY2UiLCAiY29yZUJyb3dzZXJTZXJ2aWNlIiwgIl9wYXVzZWRSZXNpemVUYXNrIiwgIkRlYm91bmNlZElkbGVUYXNrIiwgIl9vYnNlcnZlckRpc3Bvc2FibGUiLCAiX2lzUGF1c2VkIiwgIl9uZWVkc0Z1bGxSZWZyZXNoIiwgIl9pc05leHRSZW5kZXJSZWRyYXdPbmx5IiwgIl9uZWVkc1NlbGVjdGlvblJlZnJlc2giLCAiX2NhbnZhc1dpZHRoIiwgIl9jYW52YXNIZWlnaHQiLCAiX3NlbGVjdGlvblN0YXRlIiwgIl9vbkRpbWVuc2lvbnNDaGFuZ2UiLCAiX29uUmVuZGVyZWRWaWV3cG9ydENoYW5nZSIsICJfb25SZWZyZXNoUmVxdWVzdCIsICJvblJlZnJlc2hSZXF1ZXN0IiwgIl9yZW5kZXJEZWJvdW5jZXIiLCAiUmVuZGVyRGVib3VuY2VyIiwgIl9mdWxsUmVmcmVzaCIsICJfcmVnaXN0ZXJJbnRlcnNlY3Rpb25PYnNlcnZlciIsICJvYnNlcnZlciIsICJJbnRlcnNlY3Rpb25PYnNlcnZlciIsICJfaGFuZGxlSW50ZXJzZWN0aW9uQ2hhbmdlIiwgInRocmVzaG9sZCIsICJvYnNlcnZlIiwgImRpc2Nvbm5lY3QiLCAiZW50cnkiLCAiaXNJbnRlcnNlY3RpbmciLCAiaW50ZXJzZWN0aW9uUmF0aW8iLCAiZmx1c2giLCAiaXNSZWRyYXdPbmx5IiwgIl9maXJlT25DYW52YXNSZXNpemUiLCAicmVuZGVyZXIiLCAiTk9OX0JSRUFLSU5HX1NQQUNFX0NIQVIiLCAiQUxMX05PTl9CUkVBS0lOR19TUEFDRV9SRUdFWCIsICJSZWdFeHAiLCAiX2xpbmtpZmllciIsICJfZHJhZ1Njcm9sbEFtb3VudCIsICJfZW5hYmxlZCIsICJfbW91c2VEb3duVGltZVN0YW1wIiwgIl9vbGRIYXNTZWxlY3Rpb24iLCAiX29sZFNlbGVjdGlvblN0YXJ0IiwgIl9vbGRTZWxlY3Rpb25FbmQiLCAiX29uTGludXhNb3VzZVNlbGVjdGlvbiIsICJfb25SZWRyYXdSZXF1ZXN0IiwgIl9tb3VzZU1vdmVMaXN0ZW5lciIsICJfbW91c2VVcExpc3RlbmVyIiwgIm9uVXNlcklucHV0IiwgIl90cmltTGlzdGVuZXIiLCAib25UcmltIiwgIl9oYW5kbGVUcmltIiwgIl9oYW5kbGVCdWZmZXJBY3RpdmF0ZSIsICJfbW9kZWwiLCAiU2VsZWN0aW9uTW9kZWwiLCAiX2FjdGl2ZVNlbGVjdGlvbk1vZGUiLCAiX3JlbW92ZU1vdXNlRG93bkxpc3RlbmVycyIsICJsaW5lVGV4dCIsICJzdGFydFJvd0VuZENvbCIsICJpc0xpbnV4TW91c2VTZWxlY3Rpb24iLCAiX2dldE1vdXNlQnVmZmVyQ29vcmRzIiwgIl9hcmVDb29yZHNJblNlbGVjdGlvbiIsICJhbGxvd1doaXRlc3BhY2VPbmx5U2VsZWN0aW9uIiwgImdldFJhbmdlTGVuZ3RoIiwgIl9zZWxlY3RXb3JkQXQiLCAiaGFuZGxlVHJpbSIsICJ0ZXJtaW5hbEhlaWdodCIsICJtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbiIsICJ0aW1lU3RhbXAiLCAiX2hhbmRsZUluY3JlbWVudGFsQ2xpY2siLCAiZGV0YWlsIiwgIl9oYW5kbGVTaW5nbGVDbGljayIsICJfaGFuZGxlRG91YmxlQ2xpY2siLCAiX2hhbmRsZVRyaXBsZUNsaWNrIiwgIl9hZGRNb3VzZURvd25MaXN0ZW5lcnMiLCAiX2RyYWdTY3JvbGxJbnRlcnZhbFRpbWVyIiwgInNldEludGVydmFsIiwgIl9kcmFnU2Nyb2xsIiwgImNsZWFySW50ZXJ2YWwiLCAiaGFzV2lkdGgiLCAiX3NlbGVjdFdvcmRBdEN1cnNvciIsICJfc2VsZWN0TGluZUF0IiwgInByZXZpb3VzU2VsZWN0aW9uRW5kIiwgIl9zZWxlY3RUb1dvcmRBdCIsICJfZ2V0TW91c2VFdmVudFNjcm9sbEFtb3VudCIsICJ0aW1lRWxhcHNlZCIsICJhbHRDbGlja01vdmVzQ3Vyc29yIiwgImNvb3JkaW5hdGVzIiwgIm1vdmVUb0NlbGxTZXF1ZW5jZSIsICJfZmlyZUV2ZW50SWZTZWxlY3Rpb25DaGFuZ2VkIiwgIl9maXJlT25TZWxlY3Rpb25DaGFuZ2UiLCAiY2hhckluZGV4IiwgIl9pc0NsaWNrSW5TZWxlY3Rpb24iLCAiZm9sbG93V3JhcHBlZExpbmVzQWJvdmUiLCAiZm9sbG93V3JhcHBlZExpbmVzQmVsb3ciLCAiX2NvbnZlcnRWaWV3cG9ydENvbFRvQ2hhcmFjdGVySW5kZXgiLCAiY2hhck9mZnNldCIsICJsZWZ0V2lkZUNoYXJDb3VudCIsICJyaWdodFdpZGVDaGFyQ291bnQiLCAibGVmdExvbmdDaGFyT2Zmc2V0IiwgInJpZ2h0TG9uZ0NoYXJPZmZzZXQiLCAiY2hhckF0IiwgIl9pc0NoYXJXb3JkU2VwYXJhdG9yIiwgInRyaW0iLCAiZ2V0Q29kZVBvaW50IiwgInByZXZpb3VzQnVmZmVyTGluZSIsICJwcmV2aW91c0xpbmVXb3JkUG9zaXRpb24iLCAiX2dldFdvcmRBdCIsICJuZXh0QnVmZmVyTGluZSIsICJuZXh0TGluZVdvcmRQb3NpdGlvbiIsICJ3b3JkUG9zaXRpb24iLCAid29yZFNlcGFyYXRvciIsICJ3cmFwcGVkUmFuZ2UiLCAiZ2V0V3JhcHBlZFJhbmdlRm9yTGluZSIsICJmaXJzdCIsICJsYXN0IiwgImNyZWF0ZURlY29yYXRvciIsICJERUZBVUxUX0ZPUkVHUk9VTkQiLCAiREVGQVVMVF9CQUNLR1JPVU5EIiwgIkRFRkFVTFRfQ1VSU09SIiwgIkRFRkFVTFRfQ1VSU09SX0FDQ0VOVCIsICJERUZBVUxUX1NFTEVDVElPTiIsICJERUZBVUxUX0FOU0lfQ09MT1JTIiwgImZyZWV6ZSIsICJiIiwgInRvQ3NzIiwgInRvUmdiYSIsICJfY29sb3JzIiwgIl9jb250cmFzdENhY2hlIiwgIkNvbG9yQ29udHJhc3RDYWNoZSIsICJfaGFsZkNvbnRyYXN0Q2FjaGUiLCAiX29uQ2hhbmdlQ29sb3JzIiwgInNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCIsICJibGVuZCIsICJzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudCIsICJfdXBkYXRlUmVzdG9yZUNvbG9ycyIsICJfc2V0VGhlbWUiLCAidGhlbWUiLCAicGFyc2VDb2xvciIsICJzZWxlY3Rpb25CYWNrZ3JvdW5kIiwgInNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZCIsICJOVUxMX0NPTE9SIiwgImlzT3BhcXVlIiwgIm9wYWNpdHkiLCAiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgIm1hZ2VudGEiLCAiY3lhbiIsICJ3aGl0ZSIsICJicmlnaHRCbGFjayIsICJicmlnaHRSZWQiLCAiYnJpZ2h0R3JlZW4iLCAiYnJpZ2h0WWVsbG93IiwgImJyaWdodEJsdWUiLCAiYnJpZ2h0TWFnZW50YSIsICJicmlnaHRDeWFuIiwgImJyaWdodFdoaXRlIiwgImV4dGVuZGVkQW5zaSIsICJjb2xvckNvdW50IiwgInNsb3QiLCAiX3Jlc3RvcmVDb2xvciIsICJfcmVzdG9yZUNvbG9ycyIsICJjc3NTdHJpbmciLCAiZmFsbGJhY2siLCAiQ2lyY3VsYXJMaXN0IiwgIl9tYXhMZW5ndGgiLCAib25EZWxldGVFbWl0dGVyIiwgIm9uRGVsZXRlIiwgIm9uSW5zZXJ0RW1pdHRlciIsICJvbkluc2VydCIsICJvblRyaW1FbWl0dGVyIiwgIl9hcnJheSIsICJBcnJheSIsICJfc3RhcnRJbmRleCIsICJfbGVuZ3RoIiwgIm1heExlbmd0aCIsICJuZXdNYXhMZW5ndGgiLCAibmV3QXJyYXkiLCAiX2dldEN5Y2xpY0luZGV4IiwgIm5ld0xlbmd0aCIsICJyZWN5Y2xlIiwgImlzRnVsbCIsICJkZWxldGVDb3VudCIsICJpdGVtcyIsICJjb3VudFRvVHJpbSIsICJleHBhbmRMaXN0QnkiLCAiY2xvbmUiLCAidmFsIiwgImRlcHRoIiwgImNsb25lZE9iamVjdCIsICJpc0FycmF5IiwgIiRyIiwgIiRnIiwgIiRiIiwgIiRhIiwgInJnYiIsICJ0b1BhZGRlZEhleCIsICJjb250cmFzdFJhdGlvIiwgImwxIiwgImwyIiwgInRvQ2hhbm5lbHMiLCAiZmdSIiwgImZnRyIsICJmZ0IiLCAiYmdSIiwgImJnRyIsICJiZ0IiLCAicmdiYUNvbG9yIiwgImZhY3RvciIsICIkY3R4IiwgIiRsaXRtdXNDb2xvciIsICJ3aWxsUmVhZEZyZXF1ZW50bHkiLCAiZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIiwgImNyZWF0ZUxpbmVhckdyYWRpZW50IiwgIm1hdGNoIiwgInJnYmFNYXRjaCIsICJwYXJzZUZsb2F0IiwgImdldEltYWdlRGF0YSIsICJyZWxhdGl2ZUx1bWluYW5jZTIiLCAicnMiLCAiZ3MiLCAiYnMiLCAicG93IiwgInJlbGF0aXZlTHVtaW5hbmNlIiwgInJlZHVjZUx1bWluYW5jZSIsICJiZ1JnYmEiLCAiZmdSZ2JhIiwgImNyIiwgImluY3JlYXNlTHVtaW5hbmNlIiwgImJnTCIsICJmZ0wiLCAicmVzdWx0QSIsICJyZXN1bHRBUmF0aW8iLCAicmVzdWx0QiIsICJoYXNXcml0ZVN5bmNXYXJuSGFwcGVuZWQiLCAiX29uU2Nyb2xsQXBpIiwgIl93aW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzIiwgIl9vbkJpbmFyeSIsICJvbkJpbmFyeSIsICJfb25EYXRhIiwgIm9uRGF0YSIsICJfb25MaW5lRmVlZCIsICJfb25SZXNpemUiLCAiX29uV3JpdGVQYXJzZWQiLCAib25Xcml0ZVBhcnNlZCIsICJJbnN0YW50aWF0aW9uU2VydmljZSIsICJPcHRpb25zU2VydmljZSIsICJCdWZmZXJTZXJ2aWNlIiwgIkxvZ1NlcnZpY2UiLCAiSUxvZ1NlcnZpY2UiLCAiQ29yZVNlcnZpY2UiLCAiQ29yZU1vdXNlU2VydmljZSIsICJJQ29yZU1vdXNlU2VydmljZSIsICJ1bmljb2RlU2VydmljZSIsICJVbmljb2RlU2VydmljZSIsICJJVW5pY29kZVNlcnZpY2UiLCAiX2NoYXJzZXRTZXJ2aWNlIiwgIkNoYXJzZXRTZXJ2aWNlIiwgIklDaGFyc2V0U2VydmljZSIsICJPc2NMaW5rU2VydmljZSIsICJJbnB1dEhhbmRsZXIiLCAib25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b20iLCAiX3dyaXRlQnVmZmVyIiwgImhhbmRsZVVzZXJJbnB1dCIsICJfaGFuZGxlV2luZG93c1B0eU9wdGlvbkNoYW5nZSIsICJtYXJrUmFuZ2VEaXJ0eSIsICJzY3JvbGxCb3R0b20iLCAiV3JpdGVCdWZmZXIiLCAicHJvbWlzZVJlc3VsdCIsICJwYXJzZSIsICJ3cml0ZSIsICJtYXhTdWJzZXF1ZW50Q2FsbHMiLCAiTG9nTGV2ZWxFbnVtIiwgIldBUk4iLCAid3JpdGVTeW5jIiwgIndhc1VzZXJJbnB1dCIsICJNSU5JTVVNX0NPTFMiLCAiTUlOSU1VTV9ST1dTIiwgImVyYXNlQXR0ciIsICJzY3JvbGwiLCAicGFnZUNvdW50IiwgInNjcm9sbFRvVG9wIiwgInNjcm9sbEFtb3VudCIsICJyZWdpc3RlckVzY0hhbmRsZXIiLCAicmVnaXN0ZXJEY3NIYW5kbGVyIiwgInJlZ2lzdGVyQ3NpSGFuZGxlciIsICJyZWdpc3Rlck9zY0hhbmRsZXIiLCAid2luZG93c1B0eSIsICJidWlsZE51bWJlciIsICJiYWNrZW5kIiwgIndpbmRvd3NNb2RlIiwgIl9lbmFibGVXaW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzIiwgImRpc3Bvc2FibGVzIiwgInVwZGF0ZVdpbmRvd3NNb2RlV3JhcHBlZFN0YXRlIiwgImZpbmFsIiwgIl9saXN0ZW5lcnMiLCAiX2Rpc3Bvc2VkIiwgIl9ldmVudCIsICJsaXN0ZW5lciIsICJhcmcxIiwgImFyZzIiLCAicXVldWUiLCAiY2FsbCIsICJjbGVhckxpc3RlbmVycyIsICJmcm9tIiwgInRvIiwgIkdMRVZFTCIsICJNQVhfUEFSU0VCVUZGRVJfTEVOR1RIIiwgInBhcmFtVG9XaW5kb3dPcHRpb24iLCAib3B0cyIsICJzZXRXaW5MaW5lcyIsICJyZXN0b3JlV2luIiwgIm1pbmltaXplV2luIiwgInNldFdpblBvc2l0aW9uIiwgInNldFdpblNpemVQaXhlbHMiLCAicmFpc2VXaW4iLCAibG93ZXJXaW4iLCAicmVmcmVzaFdpbiIsICJzZXRXaW5TaXplQ2hhcnMiLCAibWF4aW1pemVXaW4iLCAiZnVsbHNjcmVlbldpbiIsICJnZXRXaW5TdGF0ZSIsICJnZXRXaW5Qb3NpdGlvbiIsICJnZXRXaW5TaXplUGl4ZWxzIiwgImdldFNjcmVlblNpemVQaXhlbHMiLCAiZ2V0Q2VsbFNpemVQaXhlbHMiLCAiZ2V0V2luU2l6ZUNoYXJzIiwgImdldFNjcmVlblNpemVDaGFycyIsICJnZXRJY29uVGl0bGUiLCAiZ2V0V2luVGl0bGUiLCAicHVzaFRpdGxlIiwgInBvcFRpdGxlIiwgIiR0ZW1wIiwgImdldEF0dHJEYXRhIiwgIl9jdXJBdHRyRGF0YSIsICJfY29yZU1vdXNlU2VydmljZSIsICJfdW5pY29kZVNlcnZpY2UiLCAiX3BhcnNlciIsICJFc2NhcGVTZXF1ZW5jZVBhcnNlciIsICJfcGFyc2VCdWZmZXIiLCAiVWludDMyQXJyYXkiLCAiX3N0cmluZ0RlY29kZXIiLCAiU3RyaW5nVG9VdGYzMiIsICJfdXRmOERlY29kZXIiLCAiVXRmOFRvVXRmMzIiLCAiX3dpbmRvd1RpdGxlIiwgIl9pY29uTmFtZSIsICJfd2luZG93VGl0bGVTdGFjayIsICJfaWNvbk5hbWVTdGFjayIsICJfZXJhc2VBdHRyRGF0YUludGVybmFsIiwgIl9vblJlcXVlc3RCZWxsIiwgIl9vblJlcXVlc3RSZWZyZXNoUm93cyIsICJfb25SZXF1ZXN0UmVzZXQiLCAiX29uUmVxdWVzdFNlbmRGb2N1cyIsICJfb25SZXF1ZXN0U3luY1Njcm9sbEJhciIsICJfb25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQiLCAiX29uQTExeUNoYXIiLCAiX29uQTExeVRhYiIsICJfb25Db2xvciIsICJfcGFyc2VTdGFjayIsICJwYXVzZWQiLCAiY3Vyc29yU3RhcnRYIiwgImN1cnNvclN0YXJ0WSIsICJkZWNvZGVkTGVuZ3RoIiwgIl9zcGVjaWFsQ29sb3JzIiwgIl9kaXJ0eVJvd1RyYWNrZXIiLCAiRGlydHlSb3dUcmFja2VyIiwgInNldENzaUhhbmRsZXJGYWxsYmFjayIsICJwYXJhbXMiLCAiaWRlbnRpZmllciIsICJpZGVudFRvU3RyaW5nIiwgInRvQXJyYXkiLCAic2V0RXNjSGFuZGxlckZhbGxiYWNrIiwgInNldEV4ZWN1dGVIYW5kbGVyRmFsbGJhY2siLCAiY29kZSIsICJzZXRPc2NIYW5kbGVyRmFsbGJhY2siLCAic2V0RGNzSGFuZGxlckZhbGxiYWNrIiwgInBheWxvYWQiLCAic2V0UHJpbnRIYW5kbGVyIiwgInByaW50IiwgImluc2VydENoYXJzIiwgImludGVybWVkaWF0ZXMiLCAic2Nyb2xsTGVmdCIsICJjdXJzb3JVcCIsICJzY3JvbGxSaWdodCIsICJjdXJzb3JEb3duIiwgImN1cnNvckZvcndhcmQiLCAiY3Vyc29yQmFja3dhcmQiLCAiY3Vyc29yTmV4dExpbmUiLCAiY3Vyc29yUHJlY2VkaW5nTGluZSIsICJjdXJzb3JDaGFyQWJzb2x1dGUiLCAiY3Vyc29yUG9zaXRpb24iLCAiY3Vyc29yRm9yd2FyZFRhYiIsICJlcmFzZUluRGlzcGxheSIsICJwcmVmaXgiLCAiZXJhc2VJbkxpbmUiLCAiaW5zZXJ0TGluZXMiLCAiZGVsZXRlTGluZXMiLCAiZGVsZXRlQ2hhcnMiLCAic2Nyb2xsVXAiLCAic2Nyb2xsRG93biIsICJlcmFzZUNoYXJzIiwgImN1cnNvckJhY2t3YXJkVGFiIiwgImNoYXJQb3NBYnNvbHV0ZSIsICJoUG9zaXRpb25SZWxhdGl2ZSIsICJyZXBlYXRQcmVjZWRpbmdDaGFyYWN0ZXIiLCAic2VuZERldmljZUF0dHJpYnV0ZXNQcmltYXJ5IiwgInNlbmREZXZpY2VBdHRyaWJ1dGVzU2Vjb25kYXJ5IiwgImxpbmVQb3NBYnNvbHV0ZSIsICJ2UG9zaXRpb25SZWxhdGl2ZSIsICJoVlBvc2l0aW9uIiwgInRhYkNsZWFyIiwgInNldE1vZGUiLCAic2V0TW9kZVByaXZhdGUiLCAicmVzZXRNb2RlIiwgInJlc2V0TW9kZVByaXZhdGUiLCAiY2hhckF0dHJpYnV0ZXMiLCAiZGV2aWNlU3RhdHVzIiwgImRldmljZVN0YXR1c1ByaXZhdGUiLCAic29mdFJlc2V0IiwgInNldEN1cnNvclN0eWxlIiwgInNldFNjcm9sbFJlZ2lvbiIsICJzYXZlQ3Vyc29yIiwgIndpbmRvd09wdGlvbnMiLCAicmVzdG9yZUN1cnNvciIsICJpbnNlcnRDb2x1bW5zIiwgImRlbGV0ZUNvbHVtbnMiLCAic2VsZWN0UHJvdGVjdGVkIiwgInJlcXVlc3RNb2RlIiwgInNldEV4ZWN1dGVIYW5kbGVyIiwgIkJFTCIsICJiZWxsIiwgIkxGIiwgImxpbmVGZWVkIiwgIlZUIiwgIkZGIiwgImNhcnJpYWdlUmV0dXJuIiwgIkJTIiwgImJhY2tzcGFjZSIsICJIVCIsICJ0YWIiLCAiU08iLCAic2hpZnRPdXQiLCAiU0kiLCAic2hpZnRJbiIsICJDMSIsICJJTkQiLCAiTkVMIiwgIm5leHRMaW5lIiwgIkhUUyIsICJ0YWJTZXQiLCAiT3NjSGFuZGxlciIsICJzZXRUaXRsZSIsICJzZXRJY29uTmFtZSIsICJzZXRPclJlcG9ydEluZGV4ZWRDb2xvciIsICJzZXRIeXBlcmxpbmsiLCAic2V0T3JSZXBvcnRGZ0NvbG9yIiwgInNldE9yUmVwb3J0QmdDb2xvciIsICJzZXRPclJlcG9ydEN1cnNvckNvbG9yIiwgInJlc3RvcmVJbmRleGVkQ29sb3IiLCAicmVzdG9yZUZnQ29sb3IiLCAicmVzdG9yZUJnQ29sb3IiLCAicmVzdG9yZUN1cnNvckNvbG9yIiwgInJldmVyc2VJbmRleCIsICJrZXlwYWRBcHBsaWNhdGlvbk1vZGUiLCAia2V5cGFkTnVtZXJpY01vZGUiLCAiZnVsbFJlc2V0IiwgInNldGdMZXZlbCIsICJzZWxlY3REZWZhdWx0Q2hhcnNldCIsICJmbGFnIiwgIkNIQVJTRVRTIiwgInNlbGVjdENoYXJzZXQiLCAic2NyZWVuQWxpZ25tZW50UGF0dGVybiIsICJzZXRFcnJvckhhbmRsZXIiLCAiRGNzSGFuZGxlciIsICJyZXF1ZXN0U3RhdHVzU3RyaW5nIiwgInAiLCAiUHJvbWlzZSIsICJyYWNlIiwgInJlcyIsICJyZWoiLCAiY2F0Y2giLCAiZXJyIiwgIl9nZXRDdXJyZW50TGlua0lkIiwgIndhc1BhdXNlZCIsICJfbG9nU2xvd1Jlc29sdmluZ0FzeW5jIiwgIkRFQlVHIiwgInByb3RvdHlwZSIsICJzcGxpdCIsICJjbGVhclJhbmdlIiwgImxlbiIsICJkZWNvZGUiLCAic3ViYXJyYXkiLCAiX3ByZXNlcnZlU3RhY2siLCAidmlld3BvcnRFbmQiLCAidmlld3BvcnRTdGFydCIsICJjaFdpZHRoIiwgImNoYXJzZXQiLCAid3JhcGFyb3VuZE1vZGUiLCAid3JhcGFyb3VuZCIsICJpbnNlcnRNb2RlIiwgIm1vZGVzIiwgImN1ckF0dHIiLCAiYnVmZmVyUm93IiwgIm1hcmtEaXJ0eSIsICJzZXRDZWxsRnJvbUNvZGVwb2ludCIsICJwcmVjZWRpbmdKb2luU3RhdGUiLCAiY2giLCAiY3VycmVudEluZm8iLCAiY2hhclByb3BlcnRpZXMiLCAiZXh0cmFjdFdpZHRoIiwgInNob3VsZEpvaW4iLCAiZXh0cmFjdFNob3VsZEpvaW4iLCAib2xkV2lkdGgiLCAic3RyaW5nRnJvbUNvZGVQb2ludCIsICJhZGRMaW5lVG9MaW5rIiwgIm9sZFJvdyIsICJvbGRDb2wiLCAiX2VyYXNlQXR0ckRhdGEiLCAiQnVmZmVyTGluZSIsICJjb3B5Q2VsbHNGcm9tIiwgImFkZENvZGVwb2ludFRvQ2VsbCIsICJkZWx0YSIsICJpbnNlcnRDZWxscyIsICJnZXROdWxsQ2VsbCIsICJOVUxMX0NFTExfQ09ERSIsICJOVUxMX0NFTExfV0lEVEgiLCAiY29udmVydEVvbCIsICJyZXZlcnNlV3JhcGFyb3VuZCIsICJfcmVzdHJpY3RDdXJzb3IiLCAib3JpZ2luYWxYIiwgIm5leHRTdG9wIiwgIm1heENvbCIsICJfc2V0Q3Vyc29yIiwgImRpZmZUb1RvcCIsICJfbW92ZUN1cnNvciIsICJkaWZmVG9Cb3R0b20iLCAicGFyYW0iLCAidGFicyIsICJwcmV2U3RvcCIsICJjbGVhcldyYXAiLCAicmVzcGVjdFByb3RlY3QiLCAicmVwbGFjZUNlbGxzIiwgImNsZWFyTWFya2VycyIsICJfZXJhc2VJbkJ1ZmZlckxpbmUiLCAiX3Jlc2V0QnVmZmVyTGluZSIsICJzY3JvbGxCYWNrU2l6ZSIsICJ0cmltU3RhcnQiLCAic2Nyb2xsQm90dG9tUm93c09mZnNldCIsICJzY3JvbGxCb3R0b21BYnNvbHV0ZSIsICJkZWxldGVDZWxscyIsICJqb2luU3RhdGUiLCAiaWRhdGEiLCAiaXRleHQiLCAiY29kZVBvaW50QXQiLCAidGxlbmd0aCIsICJjb3B5V2l0aGluIiwgIl9pcyIsICJ0ZXJtIiwgInRlcm1OYW1lIiwgInNldGdDaGFyc2V0IiwgIkRFRkFVTFRfQ0hBUlNFVCIsICJhcHBsaWNhdGlvbktleXBhZCIsICJhY3RpdmVFbmNvZGluZyIsICJhY3RpdmF0ZUFsdEJ1ZmZlciIsICJhY3RpdmF0ZU5vcm1hbEJ1ZmZlciIsICJkbSIsICJtb3VzZVByb3RvY29sIiwgIm1vdXNlRW5jb2RpbmciLCAiY3MiLCAiYjJ2IiwgIm1vZGUiLCAiYzEiLCAiYzIiLCAiYzMiLCAiZnJvbUNvbG9yUkdCIiwgImF0dHIiLCAiYWNjdSIsICJjU3BhY2UiLCAiYWR2YW5jZSIsICJoYXNTdWJQYXJhbXMiLCAic3VicGFyYW1zIiwgImdldFN1YlBhcmFtcyIsICJfdXBkYXRlQXR0ckNvbG9yIiwgInVuZGVybGluZUNvbG9yIiwgInVwZGF0ZUV4dGVuZGVkIiwgIl9wcm9jZXNzU0dSMCIsICJsIiwgIl9wcm9jZXNzVW5kZXJsaW5lIiwgIl9leHRyYWN0Q29sb3IiLCAic2F2ZWRYIiwgInNhdmVkWSIsICJzYXZlZEN1ckF0dHJEYXRhIiwgInNhdmVkQ2hhcnNldCIsICJpc0JsaW5raW5nIiwgImJvdHRvbSIsICJzZWNvbmQiLCAiX3NhdmVkQ2hhcnNldCIsICJzbG90cyIsICJpZHgiLCAic3BlYyIsICJleGVjIiwgImlzVmFsaWRDb2xvckluZGV4IiwgImFyZ3MiLCAiX2NyZWF0ZUh5cGVybGluayIsICJfZmluaXNoSHlwZXJsaW5rIiwgInBhcnNlZFBhcmFtcyIsICJpZFBhcmFtSW5kZXgiLCAiZmluZEluZGV4IiwgInN0YXJ0c1dpdGgiLCAicmVnaXN0ZXJMaW5rIiwgIl9zZXRPclJlcG9ydFNwZWNpYWxDb2xvciIsICJjb2xsZWN0QW5kRmxhZyIsICJzY3JvbGxSZWdpb25IZWlnaHQiLCAic2hpZnRFbGVtZW50cyIsICJsZXZlbCIsICJ5T2Zmc2V0IiwgIm1hcmtBbGxEaXJ0eSIsICJpc1Byb3RlY3RlZCIsICJfZGlzcG9zYWJsZXMiLCAiX3ZhbHVlIiwgImFycmF5IiwgIl9kYXRhIiwgInRoaXJkIiwgImZvdXJ0aCIsICJpc05vZGUiLCAicHJvY2VzcyIsICJ1c2VyQWdlbnQiLCAibmF2aWdhdG9yIiwgInBsYXRmb3JtIiwgImlzU2FmYXJpIiwgIm1ham9yVmVyc2lvbiIsICJpc0lwYWQiLCAiaXNJcGhvbmUiLCAiX2dldEtleSIsICJfc2VhcmNoIiwgInZhbHVlcyIsICJtaWQiLCAibWlkS2V5IiwgIlRhc2tRdWV1ZSIsICJfdGFza3MiLCAiX2kiLCAidGFzayIsICJfc3RhcnQiLCAiX2lkbGVDYWxsYmFjayIsICJfY2FuY2VsQ2FsbGJhY2siLCAiX3JlcXVlc3RDYWxsYmFjayIsICJfcHJvY2VzcyIsICJkZWFkbGluZSIsICJ0YXNrRHVyYXRpb24iLCAibG9uZ2VzdFRhc2siLCAibGFzdERlYWRsaW5lUmVtYWluaW5nIiwgInRpbWVSZW1haW5pbmciLCAiZGVhZGxpbmVSZW1haW5pbmciLCAiUHJpb3JpdHlUYXNrUXVldWUiLCAiX2NyZWF0ZURlYWRsaW5lIiwgImR1cmF0aW9uIiwgIklkbGVUYXNrUXVldWUiLCAicmVxdWVzdElkbGVDYWxsYmFjayIsICJjYW5jZWxJZGxlQ2FsbGJhY2siLCAiX3F1ZXVlIiwgImVucXVldWUiLCAibGFzdENoYXIiLCAiQ0hBUl9EQVRBX0NPREVfSU5ERVgiLCAiV0hJVEVTUEFDRV9DRUxMX0NPREUiLCAiRXh0ZW5kZWRBdHRycyIsICJuZXdPYmoiLCAiaXNCbGluayIsICJpc0ZnUkdCIiwgImlzQmdSR0IiLCAiaXNGZ1BhbGV0dGUiLCAiaXNCZ1BhbGV0dGUiLCAiaXNGZ0RlZmF1bHQiLCAiaXNCZ0RlZmF1bHQiLCAiaXNBdHRyaWJ1dGVEZWZhdWx0IiwgImlzRW1wdHkiLCAiZ2V0VW5kZXJsaW5lQ29sb3JNb2RlIiwgImlzVW5kZXJsaW5lQ29sb3JQYWxldHRlIiwgImdldFVuZGVybGluZVN0eWxlIiwgImdldFVuZGVybGluZVZhcmlhbnRPZmZzZXQiLCAidW5kZXJsaW5lVmFyaWFudE9mZnNldCIsICJfdXJsSWQiLCAiX2V4dCIsICJNQVhfQlVGRkVSX1NJWkUiLCAiX2hhc1Njcm9sbGJhY2siLCAiX251bGxDZWxsIiwgImZyb21DaGFyRGF0YSIsICJOVUxMX0NFTExfQ0hBUiIsICJfd2hpdGVzcGFjZUNlbGwiLCAiV0hJVEVTUEFDRV9DRUxMX1dJRFRIIiwgIl9pc0NsZWFyaW5nIiwgIl9tZW1vcnlDbGVhbnVwUXVldWUiLCAiX21lbW9yeUNsZWFudXBQb3NpdGlvbiIsICJfY29scyIsICJfcm93cyIsICJfZ2V0Q29ycmVjdEJ1ZmZlckxlbmd0aCIsICJzZXR1cFRhYlN0b3BzIiwgInJlbGF0aXZlWSIsICJjb3JyZWN0QnVmZmVyTGVuZ3RoIiwgInNjcm9sbGJhY2siLCAiZmlsbEF0dHIiLCAibmV3Q29scyIsICJuZXdSb3dzIiwgIm51bGxDZWxsIiwgImRpcnR5TWVtb3J5TGluZXMiLCAiYWRkVG9ZIiwgImFtb3VudFRvVHJpbSIsICJfaXNSZWZsb3dFbmFibGVkIiwgIl9yZWZsb3ciLCAiX2JhdGNoZWRNZW1vcnlDbGVhbnVwIiwgIm5vcm1hbFJ1biIsICJjb3VudGVkIiwgImNsZWFudXBNZW1vcnkiLCAiX3JlZmxvd0xhcmdlciIsICJfcmVmbG93U21hbGxlciIsICJ0b1JlbW92ZSIsICJyZWZsb3dMYXJnZXJHZXRMaW5lc1RvUmVtb3ZlIiwgIm5ld0xheW91dFJlc3VsdCIsICJyZWZsb3dMYXJnZXJDcmVhdGVOZXdMYXlvdXQiLCAicmVmbG93TGFyZ2VyQXBwbHlOZXdMYXlvdXQiLCAibGF5b3V0IiwgIl9yZWZsb3dMYXJnZXJBZGp1c3RWaWV3cG9ydCIsICJjb3VudFJlbW92ZWQiLCAidmlld3BvcnRBZGp1c3RtZW50cyIsICJ0b0luc2VydCIsICJjb3VudFRvSW5zZXJ0IiwgIndyYXBwZWRMaW5lcyIsICJhYnNvbHV0ZVkiLCAibGFzdExpbmVMZW5ndGgiLCAiZGVzdExpbmVMZW5ndGhzIiwgInJlZmxvd1NtYWxsZXJHZXROZXdMaW5lTGVuZ3RocyIsICJsaW5lc1RvQWRkIiwgInRyaW1tZWRMaW5lcyIsICJuZXdMaW5lcyIsICJuZXdMaW5lIiwgImRlc3RMaW5lSW5kZXgiLCAiZGVzdENvbCIsICJzcmNMaW5lSW5kZXgiLCAic3JjQ29sIiwgImNlbGxzVG9Db3B5IiwgIndyYXBwZWRMaW5lc0luZGV4IiwgImdldFdyYXBwZWRMaW5lVHJpbW1lZExlbmd0aCIsICJzZXRDZWxsIiwgImluc2VydEV2ZW50cyIsICJvcmlnaW5hbExpbmVzIiwgIm9yaWdpbmFsTGluZXNMZW5ndGgiLCAib3JpZ2luYWxMaW5lSW5kZXgiLCAibmV4dFRvSW5zZXJ0SW5kZXgiLCAibmV4dFRvSW5zZXJ0IiwgImNvdW50SW5zZXJ0ZWRTb0ZhciIsICJuZXh0SSIsICJpbnNlcnRDb3VudEVtaXR0ZWQiLCAibGluZUluZGV4IiwgInRyaW1SaWdodCIsICJ0YWJTdG9wV2lkdGgiLCAiTWFya2VyIiwgIl9yZW1vdmVNYXJrZXIiLCAiJHN0YXJ0SW5kZXgiLCAiZmlsbENlbGxEYXRhIiwgIl9jb21iaW5lZCIsICJfZXh0ZW5kZWRBdHRycyIsICJDSEFSX0RBVEFfQVRUUl9JTkRFWCIsICJDSEFSX0RBVEFfQ0hBUl9JTkRFWCIsICJDSEFSX0RBVEFfV0lEVEhfSU5ERVgiLCAiY29kZVBvaW50IiwgImF0dHJzIiwgImJ5dGVMZW5ndGgiLCAidWludDMyQ2VsbHMiLCAia2V5cyIsICJleHRLZXlzIiwgInNyYyIsICJhcHBseUluUmV2ZXJzZSIsICJzcmNEYXRhIiwgInNyY0NvbWJpbmVkS2V5cyIsICJvdXRDb2x1bW5zIiwgImJ1ZmZlckNvbHMiLCAiZW5kc0luTnVsbCIsICJmb2xsb3dpbmdMaW5lU3RhcnRzV2l0aFdpZGUiLCAib2xkQ29scyIsICJidWZmZXJBYnNvbHV0ZVkiLCAic3JjVHJpbW1lZFRpbmVMZW5ndGgiLCAic3JjUmVtYWluaW5nQ2VsbHMiLCAiZGVzdFJlbWFpbmluZ0NlbGxzIiwgImNvdW50VG9SZW1vdmUiLCAibmV4dFRvUmVtb3ZlSW5kZXgiLCAibmV4dFRvUmVtb3ZlU3RhcnQiLCAiY291bnRSZW1vdmVkU29GYXIiLCAibmV3TGF5b3V0IiwgIm5ld0xheW91dExpbmVzIiwgIm5ld0xpbmVMZW5ndGhzIiwgImNlbGxzTmVlZGVkIiwgInJlZHVjZSIsICJzcmNMaW5lIiwgImNlbGxzQXZhaWxhYmxlIiwgIm9sZFRyaW1tZWRMZW5ndGgiLCAiZW5kc1dpdGhXaWRlIiwgIkJ1ZmZlclNldCIsICJfb25CdWZmZXJBY3RpdmF0ZSIsICJfbm9ybWFsIiwgIkJ1ZmZlciIsICJmaWxsVmlld3BvcnRSb3dzIiwgIl9hbHQiLCAiaW5hY3RpdmVCdWZmZXIiLCAib2JqIiwgInNldEZyb21DaGFyRGF0YSIsICJjb21iaW5lZCIsICJERUZBVUxUX0NPTE9SIiwgIkRFRkFVTFRfQVRUUiIsICJERUZBVUxUX0VYVCIsICJfaWQiLCAiaXNEaXNwb3NlZCIsICJfbmV4dElkIiwgIl9vbkRpc3Bvc2UiLCAiZGlzcG9zYWJsZSIsICJDIiwgIk5VTCIsICJTT0giLCAiU1RYIiwgIkVPVCIsICJFTlEiLCAiQUNLIiwgIkRMRSIsICJEQzEiLCAiREMyIiwgIkRDMyIsICJEQzQiLCAiTkFLIiwgIlNZTiIsICJFVEIiLCAiQ0FOIiwgIkVNIiwgIlNVQiIsICJGUyIsICJHUyIsICJSUyIsICJVUyIsICJTUCIsICJQQUQiLCAiSE9QIiwgIkJQSCIsICJOQkgiLCAiU1NBIiwgIkVTQSIsICJIVEoiLCAiVlRTIiwgIlBMRCIsICJQTFUiLCAiUkkiLCAiU1MyIiwgIlNTMyIsICJEQ1MiLCAiUFUxIiwgIlBVMiIsICJTVFMiLCAiQ0NIIiwgIk1XIiwgIlNQQSIsICJFUEEiLCAiU09TIiwgIlNHQ0kiLCAiU0NJIiwgIkNTSSIsICJPU0MiLCAiUE0iLCAiQVBDIiwgIktFWUNPREVfS0VZX01BUFBJTkdTIiwgImFwcGxpY2F0aW9uQ3Vyc29yTW9kZSIsICJtb2RpZmllcnMiLCAia2V5TWFwcGluZyIsICJrZXlTdHJpbmciLCAidG9VcHBlckNhc2UiLCAidG9Mb3dlckNhc2UiLCAiX2ludGVyaW0iLCAic3RhcnRQb3MiLCAiaW50ZXJpbSIsICJVaW50OEFycmF5IiwgImJ5dGUxIiwgImJ5dGUyIiwgImJ5dGUzIiwgImJ5dGU0IiwgImRpc2NhcmRJbnRlcmltIiwgInRtcCIsICJtaXNzaW5nIiwgImZvdXJTdG9wIiwgIkJNUF9DT01CSU5JTkciLCAiSElHSF9DT01CSU5JTkciLCAidGFibGUiLCAidmVyc2lvbiIsICJudW0iLCAidWNzIiwgInByZWNlZGluZyIsICJ3Y3dpZHRoIiwgImNyZWF0ZVByb3BlcnR5VmFsdWUiLCAiX2FjdGlvbiIsICJfY2FsbGJhY2tzIiwgIl9wZW5kaW5nRGF0YSIsICJfYnVmZmVyT2Zmc2V0IiwgIl9pc1N5bmNXcml0aW5nIiwgIl9zeW5jQ2FsbHMiLCAiX2RpZFVzZXJJbnB1dCIsICJjaHVuayIsICJjYiIsICJfaW5uZXJXcml0ZSIsICJsYXN0VGltZSIsICJjb250aW51YXRpb24iLCAicmVzb2x2ZSIsICJ0aGVuIiwgIlJHQl9SRVgiLCAiSEFTSF9SRVgiLCAicGFkIiwgImJpdHMiLCAiczIiLCAibG93IiwgImJhc2UiLCAiYWR2IiwgIlBBWUxPQURfTElNSVQiLCAiRU1QVFlfSEFORExFUlMiLCAiX2hhbmRsZXJzIiwgImNyZWF0ZSIsICJfYWN0aXZlIiwgIl9pZGVudCIsICJfaGFuZGxlckZiIiwgIl9zdGFjayIsICJsb29wUG9zaXRpb24iLCAiZmFsbFRocm91Z2giLCAiaGFuZGxlckxpc3QiLCAiaGFuZGxlckluZGV4IiwgInVuaG9vayIsICJob29rIiwgInB1dCIsICJ1dGYzMlRvU3RyaW5nIiwgInN1Y2Nlc3MiLCAiaGFuZGxlclJlc3VsdCIsICJFTVBUWV9QQVJBTVMiLCAiUGFyYW1zIiwgImFkZFBhcmFtIiwgIl9oYW5kbGVyIiwgIl9wYXJhbXMiLCAiX2hpdExpbWl0IiwgInJldCIsICJUcmFuc2l0aW9uVGFibGUiLCAibmV4dCIsICJjb2RlcyIsICJOT05fQVNDSUlfUFJJTlRBQkxFIiwgIlZUNTAwX1RSQU5TSVRJT05fVEFCTEUiLCAiYmx1ZXByaW50IiwgImFwcGx5IiwgInVudXNlZCIsICJQUklOVEFCTEVTIiwgIkVYRUNVVEFCTEVTIiwgInN0YXRlcyIsICJzZXREZWZhdWx0IiwgImFkZE1hbnkiLCAiX3RyYW5zaXRpb25zIiwgImhhbmRsZXJzIiwgImhhbmRsZXJQb3MiLCAidHJhbnNpdGlvbiIsICJjaHVua1BvcyIsICJpbml0aWFsU3RhdGUiLCAiY3VycmVudFN0YXRlIiwgIl9jb2xsZWN0IiwgIl9wcmludEhhbmRsZXJGYiIsICJfZXhlY3V0ZUhhbmRsZXJGYiIsICJfY3NpSGFuZGxlckZiIiwgIl9lc2NIYW5kbGVyRmIiLCAiX2Vycm9ySGFuZGxlckZiIiwgIl9wcmludEhhbmRsZXIiLCAiX2V4ZWN1dGVIYW5kbGVycyIsICJfY3NpSGFuZGxlcnMiLCAiX2VzY0hhbmRsZXJzIiwgIl9vc2NQYXJzZXIiLCAiT3NjUGFyc2VyIiwgIl9kY3NQYXJzZXIiLCAiRGNzUGFyc2VyIiwgIl9lcnJvckhhbmRsZXIiLCAiZmluYWxSYW5nZSIsICJpbnRlcm1lZGlhdGUiLCAiZmluYWxDb2RlIiwgInJldmVyc2UiLCAiY2xlYXJQcmludEhhbmRsZXIiLCAiX2lkZW50aWZpZXIiLCAicmVnaXN0ZXJIYW5kbGVyIiwgImNsZWFySGFuZGxlciIsICJzZXRIYW5kbGVyRmFsbGJhY2siLCAiY2xlYXJFcnJvckhhbmRsZXIiLCAiY29sbGVjdCIsICJhYm9ydCIsICJhZGRTdWJQYXJhbSIsICJhZGREaWdpdCIsICJoYW5kbGVyc0VzYyIsICJqaiIsICJfc3RhdGUiLCAiX3B1dCIsICJNQVhfVkFMVUUiLCAiayIsICJtYXhTdWJQYXJhbXNMZW5ndGgiLCAiSW50MzJBcnJheSIsICJfc3ViUGFyYW1zIiwgIl9zdWJQYXJhbXNMZW5ndGgiLCAiX3N1YlBhcmFtc0lkeCIsICJVaW50MTZBcnJheSIsICJfcmVqZWN0RGlnaXRzIiwgIl9yZWplY3RTdWJEaWdpdHMiLCAiX2RpZ2l0SXNTdWIiLCAibmV3UGFyYW1zIiwgImdldFN1YlBhcmFtc0FsbCIsICJzdG9yZSIsICJjdXIiLCAiX2FkZG9ucyIsICJpbnN0YW5jZSIsICJsb2FkZWRBZGRvbiIsICJfd3JhcHBlZEFkZG9uRGlzcG9zZSIsICJfYnVmZmVyIiwgImJhc2VZIiwgIkJ1ZmZlckxpbmVBcGlWaWV3IiwgIl9saW5lIiwgInN0YXJ0Q29sdW1uIiwgImVuZENvbHVtbiIsICJCdWZmZXJOYW1lc3BhY2VBcGkiLCAiX2NvcmUiLCAiX29uQnVmZmVyQ2hhbmdlIiwgIm9uQnVmZmVyQ2hhbmdlIiwgIkJ1ZmZlckFwaVZpZXciLCAiX2FsdGVybmF0ZSIsICJhbHRlcm5hdGUiLCAiaW5pdCIsICJwcm92aWRlciIsICJ2ZXJzaW9ucyIsICJhY3RpdmVWZXJzaW9uIiwgImlzVXNlclNjcm9sbGluZyIsICJfY2FjaGVkQmxhbmtMaW5lIiwgInRvcFJvdyIsICJib3R0b21Sb3ciLCAid2lsbEJ1ZmZlckJlVHJpbW1lZCIsICJjb3B5RnJvbSIsICJvbGRZZGlzcCIsICJnbGV2ZWwiLCAiX2NoYXJzZXRzIiwgIkRFRkFVTFRfUFJPVE9DT0xTIiwgIk5PTkUiLCAicmVzdHJpY3QiLCAiWDEwIiwgIlZUMjAwIiwgIkRSQUciLCAiQU5ZIiwgImV2ZW50Q29kZSIsICJpc1NHUiIsICJERUZBVUxUX0VOQ09ESU5HUyIsICJERUZBVUxUIiwgIlNHUiIsICJTR1JfUElYRUxTIiwgIl9wcm90b2NvbHMiLCAiX2VuY29kaW5ncyIsICJfYWN0aXZlUHJvdG9jb2wiLCAiX2FjdGl2ZUVuY29kaW5nIiwgIl9sYXN0RXZlbnQiLCAiX29uUHJvdG9jb2xDaGFuZ2UiLCAibmFtZSIsICJhZGRQcm90b2NvbCIsICJhZGRFbmNvZGluZyIsICJlbmNvZGluZyIsICJfZXF1YWxFdmVudHMiLCAicmVwb3J0IiwgInRyaWdnZXJCaW5hcnlFdmVudCIsICJkb3duIiwgInVwIiwgImRyYWciLCAibW92ZSIsICJlMSIsICJlMiIsICJwaXhlbHMiLCAiREVGQVVMVF9NT0RFUyIsICJERUZBVUxUX0RFQ19QUklWQVRFX01PREVTIiwgIl9vblVzZXJJbnB1dCIsICJfb25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b20iLCAiZGlzYWJsZVN0ZGluIiwgIiR4bWluIiwgIiR4bWF4IiwgIl9kZWNvcmF0aW9ucyIsICJTb3J0ZWRMaXN0IiwgIl9vbkRlY29yYXRpb25SZWdpc3RlcmVkIiwgIl9vbkRlY29yYXRpb25SZW1vdmVkIiwgIkRlY29yYXRpb24iLCAibWFya2VyRGlzcG9zZSIsICJpbnNlcnQiLCAieG1pbiIsICJ4bWF4IiwgImdldEtleUl0ZXJhdG9yIiwgImZvckVhY2hCeUtleSIsICJfY2FjaGVkQmciLCAiX2NhY2hlZEZnIiwgImZvcmVncm91bmRDb2xvciIsICJTZXJ2aWNlQ29sbGVjdGlvbiIsICJfZW50cmllcyIsICJzZXJ2aWNlIiwgIl9zZXJ2aWNlcyIsICJjdG9yIiwgInNlcnZpY2VEZXBlbmRlbmNpZXMiLCAiZ2V0U2VydmljZURlcGVuZGVuY2llcyIsICJzb3J0IiwgInNlcnZpY2VBcmdzIiwgImRlcGVuZGVuY3kiLCAiZmlyc3RTZXJ2aWNlQXJnUG9zIiwgIm9wdGlvbnNLZXlUb0xvZ0xldmVsIiwgInRyYWNlIiwgIlRSQUNFIiwgImluZm8iLCAiSU5GTyIsICJFUlJPUiIsICJvZmYiLCAiT0ZGIiwgInRyYWNlTG9nZ2VyIiwgIl9sb2dMZXZlbCIsICJfdXBkYXRlTG9nTGV2ZWwiLCAib3B0aW9uYWxQYXJhbXMiLCAibWVzc2FnZSIsICJfZXZhbExhenlPcHRpb25hbFBhcmFtcyIsICJsb2dnZXIiLCAiX2xvZyIsICJsb2ciLCAiX3RhcmdldCIsICJkZXNjcmlwdG9yIiwgImZuIiwgIkpTT04iLCAic3RyaW5naWZ5IiwgIkRFRkFVTFRfT1BUSU9OUyIsICJjdXN0b21HbHlwaHMiLCAiYWxsb3dQcm9wb3NlZEFwaSIsICJhbGxvd1RyYW5zcGFyZW5jeSIsICJyZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHMiLCAiRk9OVF9XRUlHSFRfT1BUSU9OUyIsICJfb25PcHRpb25DaGFuZ2UiLCAiZGVmYXVsdE9wdGlvbnMiLCAiX3Nhbml0aXplQW5kVmFsaWRhdGVPcHRpb24iLCAiX3NldHVwT3B0aW9ucyIsICJldmVudEtleSIsICJnZXR0ZXIiLCAicHJvcE5hbWUiLCAic2V0dGVyIiwgImRlc2MiLCAiZGVmaW5lUHJvcGVydHkiLCAiX2VudHJpZXNXaXRoSWQiLCAiX2RhdGFCeUxpbmtJZCIsICJfcmVtb3ZlTWFya2VyRnJvbUxpbmsiLCAiY2FzdERhdGEiLCAiX2dldEVudHJ5SWRLZXkiLCAibGlua0lkIiwgImV2ZXJ5IiwgImxpbmtEYXRhIiwgIkRJX1RBUkdFVCIsICJESV9ERVBFTkRFTkNJRVMiLCAic2VydmljZVJlZ2lzdHJ5IiwgImRlY29yYXRvciIsICJhcmd1bWVudHMiLCAiX3Byb3ZpZGVycyIsICJfb25DaGFuZ2UiLCAib25DaGFuZ2UiLCAiZGVmYXVsdFByb3ZpZGVyIiwgIlVuaWNvZGVWNiIsICJfYWN0aXZlUHJvdmlkZXIiLCAicHJlY2VkaW5nSW5mbyIsICJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCAiX193ZWJwYWNrX3JlcXVpcmVfXyIsICJtb2R1bGVJZCIsICJjYWNoZWRNb2R1bGUiLCAiX193ZWJwYWNrX21vZHVsZXNfXyIsICJDT05TVFJVQ1RPUl9PTkxZX09QVElPTlMiLCAiX2FkZG9uTWFuYWdlciIsICJBZGRvbk1hbmFnZXIiLCAiX3B1YmxpY09wdGlvbnMiLCAiX2NoZWNrUmVhZG9ubHlPcHRpb25zIiwgIl9jaGVja1Byb3Bvc2VkQXBpIiwgInBhcnNlciIsICJQYXJzZXJBcGkiLCAidW5pY29kZSIsICJVbmljb2RlQXBpIiwgIm1vdXNlVHJhY2tpbmdNb2RlIiwgImFwcGxpY2F0aW9uQ3Vyc29yS2V5c01vZGUiLCAiYXBwbGljYXRpb25LZXlwYWRNb2RlIiwgIm9yaWdpbk1vZGUiLCAicmV2ZXJzZVdyYXBhcm91bmRNb2RlIiwgInNlbmRGb2N1c01vZGUiLCAiX3ZlcmlmeUludGVnZXJzIiwgImF0dGFjaEN1c3RvbUtleUV2ZW50SGFuZGxlciIsICJhdHRhY2hDdXN0b21XaGVlbEV2ZW50SGFuZGxlciIsICJyZWdpc3RlckNoYXJhY3RlckpvaW5lciIsICJkZXJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyIiwgInJlZ2lzdGVyTWFya2VyIiwgIl92ZXJpZnlQb3NpdGl2ZUludGVnZXJzIiwgInNjcm9sbFBhZ2VzIiwgInNjcm9sbFRvTGluZSIsICJhZGRvbiIsICJsb2FkQWRkb24iLCAic3RyaW5ncyIsICJJbmZpbml0eSIsICJyb290IiwgImZhY3RvcnkiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZGVmaW5lIiwgImFtZCIsICJzZWxmIiwgInRlcm1pbmFsIiwgInRoaXMiLCAiX3Rlcm1pbmFsIiwgImRpc3Bvc2UiLCAiZml0IiwgImRpbXMiLCAicHJvcG9zZURpbWVuc2lvbnMiLCAiaXNOYU4iLCAiY29scyIsICJyb3dzIiwgImNvcmUiLCAiX2NvcmUiLCAiX3JlbmRlclNlcnZpY2UiLCAiY2xlYXIiLCAicmVzaXplIiwgImVsZW1lbnQiLCAicGFyZW50RWxlbWVudCIsICJkaW1lbnNpb25zIiwgImNzcyIsICJjZWxsIiwgIndpZHRoIiwgImhlaWdodCIsICJzY3JvbGxiYXJXaWR0aCIsICJvcHRpb25zIiwgInNjcm9sbGJhY2siLCAidmlld3BvcnQiLCAic2Nyb2xsQmFyV2lkdGgiLCAicGFyZW50RWxlbWVudFN0eWxlIiwgIndpbmRvdyIsICJnZXRDb21wdXRlZFN0eWxlIiwgInBhcmVudEVsZW1lbnRIZWlnaHQiLCAicGFyc2VJbnQiLCAiZ2V0UHJvcGVydHlWYWx1ZSIsICJwYXJlbnRFbGVtZW50V2lkdGgiLCAiTWF0aCIsICJtYXgiLCAiZWxlbWVudFN0eWxlIiwgImF2YWlsYWJsZUhlaWdodCIsICJhdmFpbGFibGVXaWR0aCIsICJmbG9vciIsICJyb290IiwgImZhY3RvcnkiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZGVmaW5lIiwgImFtZCIsICJzZWxmIiwgImUiLCAidCIsICJpc1VybCIsICJ1cmxTdHJpbmciLCAidXJsIiwgIlVSTCIsICJwYXJzZWRCYXNlIiwgInBhc3N3b3JkIiwgInVzZXJuYW1lIiwgInByb3RvY29sIiwgImhvc3QiLCAidG9Mb2NhbGVMb3dlckNhc2UiLCAic3RhcnRzV2l0aCIsICJfdGVybWluYWwiLCAiX3JlZ2V4IiwgIl9oYW5kbGVyIiwgIl9vcHRpb25zIiwgInkiLCAiY2FsbGJhY2siLCAibGlua3MiLCAiTGlua0NvbXB1dGVyIiwgImNvbXB1dGVMaW5rIiwgInRoaXMiLCAiX2FkZENhbGxiYWNrcyIsICJtYXAiLCAibGluayIsICJsZWF2ZSIsICJob3ZlciIsICJldmVudCIsICJ1cmkiLCAicmFuZ2UiLCAicmVnZXgiLCAidGVybWluYWwiLCAiYWN0aXZhdGUiLCAicmV4IiwgIlJlZ0V4cCIsICJzb3VyY2UiLCAiZmxhZ3MiLCAibGluZXMiLCAic3RhcnRMaW5lSW5kZXgiLCAiX2dldFdpbmRvd2VkTGluZVN0cmluZ3MiLCAibGluZSIsICJqb2luIiwgIm1hdGNoIiwgInJlc3VsdCIsICJleGVjIiwgInRleHQiLCAic3RhcnRZIiwgInN0YXJ0WCIsICJfbWFwU3RySWR4IiwgImluZGV4IiwgImVuZFkiLCAiZW5kWCIsICJsZW5ndGgiLCAic3RhcnQiLCAieCIsICJlbmQiLCAicHVzaCIsICJsaW5lSW5kZXgiLCAidG9wSWR4IiwgImJvdHRvbUlkeCIsICJjb250ZW50IiwgImJ1ZmZlciIsICJhY3RpdmUiLCAiZ2V0TGluZSIsICJjdXJyZW50Q29udGVudCIsICJ0cmFuc2xhdGVUb1N0cmluZyIsICJpc1dyYXBwZWQiLCAiaW5kZXhPZiIsICJyZXZlcnNlIiwgInJvd0luZGV4IiwgInN0cmluZ0luZGV4IiwgImJ1ZiIsICJjZWxsIiwgImdldE51bGxDZWxsIiwgImkiLCAiZ2V0Q2VsbCIsICJjaGFycyIsICJnZXRDaGFycyIsICJnZXRXaWR0aCIsICJvIiwgIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsICJfX3dlYnBhY2tfcmVxdWlyZV9fIiwgIm1vZHVsZUlkIiwgImNhY2hlZE1vZHVsZSIsICJfX3dlYnBhY2tfbW9kdWxlc19fIiwgInN0cmljdFVybFJlZ2V4IiwgImhhbmRsZUxpbmsiLCAibmV3V2luZG93IiwgIndpbmRvdyIsICJvcGVuIiwgIm9wZW5lciIsICJsb2NhdGlvbiIsICJocmVmIiwgImNvbnNvbGUiLCAid2FybiIsICJvcHRpb25zIiwgInVybFJlZ2V4IiwgIl9saW5rUHJvdmlkZXIiLCAicmVnaXN0ZXJMaW5rUHJvdmlkZXIiLCAiV2ViTGlua1Byb3ZpZGVyIiwgImRpc3Bvc2UiLCAicm9vdCIsICJmYWN0b3J5IiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImRlZmluZSIsICJhbWQiLCAic2VsZiIsICJlIiwgInQiLCAiX2xpc3RlbmVycyIsICJfZGlzcG9zZWQiLCAiZXZlbnQiLCAidGhpcyIsICJfZXZlbnQiLCAibGlzdGVuZXIiLCAicHVzaCIsICJkaXNwb3NlIiwgImkiLCAibGVuZ3RoIiwgInNwbGljZSIsICJhcmcxIiwgImFyZzIiLCAicXVldWUiLCAiY2FsbCIsICJjbGVhckxpc3RlbmVycyIsICJmcm9tIiwgInRvIiwgImZpcmUiLCAiaGFuZGxlciIsICJ1bmRlZmluZWQiLCAiZGlzcG9zZUFycmF5IiwgImRpc3Bvc2FibGVzIiwgImQiLCAiX2Rpc3Bvc2FibGVzIiwgIl9pc0Rpc3Bvc2VkIiwgImluZGV4IiwgImluZGV4T2YiLCAidmFsdWUiLCAiX3ZhbHVlIiwgImNsZWFyIiwgImYiLCAiYXJyYXkiLCAiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwgIl9fd2VicGFja19yZXF1aXJlX18iLCAibW9kdWxlSWQiLCAiY2FjaGVkTW9kdWxlIiwgIl9fd2VicGFja19tb2R1bGVzX18iLCAiTk9OX1dPUkRfQ0hBUkFDVEVSUyIsICJTZWFyY2hBZGRvbiIsICJEaXNwb3NhYmxlIiwgIm9wdGlvbnMiLCAic3VwZXIiLCAiX2hpZ2hsaWdodGVkTGluZXMiLCAiU2V0IiwgIl9oaWdobGlnaHREZWNvcmF0aW9ucyIsICJfc2VsZWN0ZWREZWNvcmF0aW9uIiwgInJlZ2lzdGVyIiwgIk11dGFibGVEaXNwb3NhYmxlIiwgIl9saW5lc0NhY2hlVGltZW91dElkIiwgIl9saW5lc0NhY2hlRGlzcG9zYWJsZXMiLCAiX29uRGlkQ2hhbmdlUmVzdWx0cyIsICJFdmVudEVtaXR0ZXIiLCAib25EaWRDaGFuZ2VSZXN1bHRzIiwgIl9oaWdobGlnaHRMaW1pdCIsICJoaWdobGlnaHRMaW1pdCIsICJ0ZXJtaW5hbCIsICJfdGVybWluYWwiLCAib25Xcml0ZVBhcnNlZCIsICJfdXBkYXRlTWF0Y2hlcyIsICJvblJlc2l6ZSIsICJ0b0Rpc3Bvc2FibGUiLCAiY2xlYXJEZWNvcmF0aW9ucyIsICJfaGlnaGxpZ2h0VGltZW91dCIsICJ3aW5kb3ciLCAiY2xlYXJUaW1lb3V0IiwgIl9jYWNoZWRTZWFyY2hUZXJtIiwgIl9sYXN0U2VhcmNoT3B0aW9ucyIsICJkZWNvcmF0aW9ucyIsICJzZXRUaW1lb3V0IiwgInRlcm0iLCAiZmluZFByZXZpb3VzIiwgImluY3JlbWVudGFsIiwgIm5vU2Nyb2xsIiwgInJldGFpbkNhY2hlZFNlYXJjaFRlcm0iLCAiY2xlYXJBY3RpdmVEZWNvcmF0aW9uIiwgInNlYXJjaE9wdGlvbnMiLCAiRXJyb3IiLCAiZGlkT3B0aW9uc0NoYW5nZWQiLCAiX2RpZE9wdGlvbnNDaGFuZ2UiLCAiX2hpZ2hsaWdodEFsbE1hdGNoZXMiLCAiZm91bmQiLCAiX2ZpbmROZXh0QW5kU2VsZWN0IiwgIl9maXJlUmVzdWx0cyIsICJzZWFyY2hSZXN1bHRzV2l0aEhpZ2hsaWdodCIsICJwcmV2UmVzdWx0IiwgInJlc3VsdCIsICJfZmluZCIsICJyb3ciLCAiY29sIiwgImNvbHMiLCAibWF0Y2giLCAiZGVjb3JhdGlvbiIsICJfY3JlYXRlUmVzdWx0RGVjb3JhdGlvbiIsICJhZGQiLCAibWFya2VyIiwgImxpbmUiLCAic3RhcnRSb3ciLCAic3RhcnRDb2wiLCAiY2xlYXJTZWxlY3Rpb24iLCAiX2luaXRMaW5lc0NhY2hlIiwgInNlYXJjaFBvc2l0aW9uIiwgIl9maW5kSW5MaW5lIiwgInkiLCAiYnVmZmVyIiwgImFjdGl2ZSIsICJiYXNlWSIsICJyb3dzIiwgInByZXZTZWxlY3RlZFBvcyIsICJnZXRTZWxlY3Rpb25Qb3NpdGlvbiIsICJlbmQiLCAieCIsICJzdGFydCIsICJfc2VsZWN0UmVzdWx0IiwgIl9maW5kUHJldmlvdXNBbmRTZWxlY3QiLCAibGFzdFNlYXJjaE9wdGlvbnMiLCAiY2FzZVNlbnNpdGl2ZSIsICJyZWdleCIsICJ3aG9sZVdvcmQiLCAicmVzdWx0SW5kZXgiLCAic2VsZWN0ZWRNYXRjaCIsICJzaXplIiwgInJlc3VsdENvdW50IiwgImlzUmV2ZXJzZVNlYXJjaCIsICJNYXRoIiwgIm1heCIsICJfbGluZXNDYWNoZSIsICJBcnJheSIsICJnZXREaXNwb3NlQXJyYXlEaXNwb3NhYmxlIiwgIm9uTGluZUZlZWQiLCAiX2Rlc3Ryb3lMaW5lc0NhY2hlIiwgIm9uQ3Vyc29yTW92ZSIsICJzZWFyY2hJbmRleCIsICJpbmNsdWRlcyIsICJmaXJzdExpbmUiLCAiZ2V0TGluZSIsICJpc1dyYXBwZWQiLCAiY2FjaGUiLCAiX3RyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZ1dpdGhXcmFwIiwgInN0cmluZ0xpbmUiLCAib2Zmc2V0cyIsICJvZmZzZXQiLCAiX2J1ZmZlckNvbHNUb1N0cmluZ09mZnNldCIsICJzZWFyY2hUZXJtIiwgInRvTG93ZXJDYXNlIiwgInNlYXJjaFN0cmluZ0xpbmUiLCAic2VhcmNoUmVnZXgiLCAiUmVnRXhwIiwgImZvdW5kVGVybSIsICJleGVjIiwgInNsaWNlIiwgImxhc3RJbmRleCIsICJsYXN0SW5kZXhPZiIsICJfaXNXaG9sZVdvcmQiLCAic3RhcnRSb3dPZmZzZXQiLCAiZW5kUm93T2Zmc2V0IiwgInN0YXJ0Q29sT2Zmc2V0IiwgImVuZENvbE9mZnNldCIsICJzdGFydENvbEluZGV4IiwgIl9zdHJpbmdMZW5ndGhUb0J1ZmZlclNpemUiLCAiY2VsbCIsICJnZXRDZWxsIiwgImNoYXIiLCAiZ2V0Q2hhcnMiLCAibmV4dENlbGwiLCAiZ2V0V2lkdGgiLCAibGluZUluZGV4IiwgImdldENvZGUiLCAidHJpbVJpZ2h0IiwgInN0cmluZ3MiLCAibGluZU9mZnNldHMiLCAibmV4dExpbmUiLCAibGluZVdyYXBzVG9OZXh0IiwgInN0cmluZyIsICJ0cmFuc2xhdGVUb1N0cmluZyIsICJsYXN0Q2VsbCIsICJqb2luIiwgInNlbGVjdCIsICJyZWdpc3Rlck1hcmtlciIsICJjdXJzb3JZIiwgInJlZ2lzdGVyRGVjb3JhdGlvbiIsICJ3aWR0aCIsICJiYWNrZ3JvdW5kQ29sb3IiLCAiYWN0aXZlTWF0Y2hCYWNrZ3JvdW5kIiwgImxheWVyIiwgIm92ZXJ2aWV3UnVsZXJPcHRpb25zIiwgImNvbG9yIiwgImFjdGl2ZU1hdGNoQ29sb3JPdmVydmlld1J1bGVyIiwgIm9uUmVuZGVyIiwgIl9hcHBseVN0eWxlcyIsICJhY3RpdmVNYXRjaEJvcmRlciIsICJvbkRpc3Bvc2UiLCAidmlld3BvcnRZIiwgInNjcm9sbCIsICJmbG9vciIsICJzY3JvbGxMaW5lcyIsICJlbGVtZW50IiwgImJvcmRlckNvbG9yIiwgImlzQWN0aXZlUmVzdWx0IiwgImNsYXNzTGlzdCIsICJjb250YWlucyIsICJzdHlsZSIsICJvdXRsaW5lIiwgImZpbmRSZXN1bHREZWNvcmF0aW9uIiwgIm1hdGNoQmFja2dyb3VuZCIsICJoYXMiLCAibWF0Y2hPdmVydmlld1J1bGVyIiwgInBvc2l0aW9uIiwgIm1hdGNoQm9yZGVyIiwgInJvb3QiLCAiZmFjdG9yeSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJkZWZpbmUiLCAiYW1kIiwgInRoaXMiLCAiZSIsICJ0IiwgImkiLCAiciIsICJCTVBfQ09NQklOSU5HIiwgIkhJR0hfQ09NQklOSU5HIiwgIkJNUF9XSURFIiwgIkhJR0hfV0lERSIsICJ0YWJsZSIsICJiaXNlYXJjaCIsICJ1Y3MiLCAiZGF0YSIsICJtaWQiLCAibWluIiwgIm1heCIsICJsZW5ndGgiLCAiY29uc3RydWN0b3IiLCAidmVyc2lvbiIsICJVaW50OEFycmF5IiwgImZpbGwiLCAibnVtIiwgImNvZGVwb2ludCIsICJwcmVjZWRpbmciLCAid2lkdGgiLCAid2N3aWR0aCIsICJzaG91bGRKb2luIiwgIm9sZFdpZHRoIiwgIlVuaWNvZGVTZXJ2aWNlIiwgImV4dHJhY3RXaWR0aCIsICJjcmVhdGVQcm9wZXJ0eVZhbHVlIiwgIl9saXN0ZW5lcnMiLCAiX2Rpc3Bvc2VkIiwgImV2ZW50IiwgIl9ldmVudCIsICJsaXN0ZW5lciIsICJwdXNoIiwgImRpc3Bvc2UiLCAic3BsaWNlIiwgImFyZzEiLCAiYXJnMiIsICJxdWV1ZSIsICJjYWxsIiwgImNsZWFyTGlzdGVuZXJzIiwgImZyb20iLCAidG8iLCAiZmlyZSIsICJoYW5kbGVyIiwgInVuZGVmaW5lZCIsICJ2YWx1ZSIsICJzdGF0ZSIsICJfcHJvdmlkZXJzIiwgIk9iamVjdCIsICJjcmVhdGUiLCAiX2FjdGl2ZSIsICJfb25DaGFuZ2UiLCAiRXZlbnRFbWl0dGVyIiwgIm9uQ2hhbmdlIiwgImRlZmF1bHRQcm92aWRlciIsICJVbmljb2RlVjYiLCAicmVnaXN0ZXIiLCAiX2FjdGl2ZVByb3ZpZGVyIiwgInZlcnNpb25zIiwgImtleXMiLCAiYWN0aXZlVmVyc2lvbiIsICJFcnJvciIsICJwcm92aWRlciIsICJzIiwgInJlc3VsdCIsICJwcmVjZWRpbmdJbmZvIiwgImNvZGUiLCAiY2hhckNvZGVBdCIsICJzZWNvbmQiLCAiY3VycmVudEluZm8iLCAiY2hhclByb3BlcnRpZXMiLCAiY2hXaWR0aCIsICJleHRyYWN0U2hvdWxkSm9pbiIsICJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCAiX193ZWJwYWNrX3JlcXVpcmVfXyIsICJtb2R1bGVJZCIsICJjYWNoZWRNb2R1bGUiLCAiX193ZWJwYWNrX21vZHVsZXNfXyIsICJ0ZXJtaW5hbCIsICJ1bmljb2RlIiwgIlVuaWNvZGVWMTEiLCAicm9vdCIsICJmYWN0b3J5IiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImRlZmluZSIsICJhbWQiLCAic2VsZiIsICJlIiwgInQiLCAiaSIsICJzIiwgIklORElDRVNfUEVSX0NFTEwiLCAiQllURVNfUEVSX0NFTEwiLCAiRmxvYXQzMkFycmF5IiwgIkJZVEVTX1BFUl9FTEVNRU5UIiwgIiRnbHlwaCIsICIkaSIsICIkbGVmdENlbGxQYWRkaW5nIiwgIiRjbGlwcGVkUGl4ZWxzIiwgIkdseXBoUmVuZGVyZXIiLCAiRGlzcG9zYWJsZSIsICJfdGVybWluYWwiLCAiX2dsIiwgIl9kaW1lbnNpb25zIiwgIl9vcHRpb25zU2VydmljZSIsICJzdXBlciIsICJfYWN0aXZlQnVmZmVyIiwgIl92ZXJ0aWNlcyIsICJjb3VudCIsICJhdHRyaWJ1dGVzIiwgImF0dHJpYnV0ZXNCdWZmZXJzIiwgImdsIiwgInRoaXMiLCAiVGV4dHVyZUF0bGFzIiwgIm1heEF0bGFzUGFnZXMiLCAiTWF0aCIsICJtaW4iLCAidGhyb3dJZkZhbHN5IiwgImdldFBhcmFtZXRlciIsICJNQVhfVEVYVFVSRV9JTUFHRV9VTklUUyIsICJtYXhUZXh0dXJlU2l6ZSIsICJNQVhfVEVYVFVSRV9TSVpFIiwgIl9wcm9ncmFtIiwgImNyZWF0ZVByb2dyYW0iLCAibWF4RnJhZ21lbnRTaGFkZXJUZXh0dXJlVW5pdHMiLCAidGV4dHVyZUNvbmRpdGlvbmFscyIsICJyZWdpc3RlciIsICJ0b0Rpc3Bvc2FibGUiLCAiZGVsZXRlUHJvZ3JhbSIsICJfcHJvamVjdGlvbkxvY2F0aW9uIiwgImdldFVuaWZvcm1Mb2NhdGlvbiIsICJfcmVzb2x1dGlvbkxvY2F0aW9uIiwgIl90ZXh0dXJlTG9jYXRpb24iLCAiX3ZlcnRleEFycmF5T2JqZWN0IiwgImNyZWF0ZVZlcnRleEFycmF5IiwgImJpbmRWZXJ0ZXhBcnJheSIsICJ1bml0UXVhZFZlcnRpY2VzIiwgInVuaXRRdWFkVmVydGljZXNCdWZmZXIiLCAiY3JlYXRlQnVmZmVyIiwgImRlbGV0ZUJ1ZmZlciIsICJiaW5kQnVmZmVyIiwgIkFSUkFZX0JVRkZFUiIsICJidWZmZXJEYXRhIiwgIlNUQVRJQ19EUkFXIiwgImVuYWJsZVZlcnRleEF0dHJpYkFycmF5IiwgInZlcnRleEF0dHJpYlBvaW50ZXIiLCAiRkxPQVQiLCAidW5pdFF1YWRFbGVtZW50SW5kaWNlcyIsICJVaW50OEFycmF5IiwgImVsZW1lbnRJbmRpY2VzQnVmZmVyIiwgIkVMRU1FTlRfQVJSQVlfQlVGRkVSIiwgIl9hdHRyaWJ1dGVzQnVmZmVyIiwgInZlcnRleEF0dHJpYkRpdmlzb3IiLCAidXNlUHJvZ3JhbSIsICJ0ZXh0dXJlVW5pdHMiLCAiSW50MzJBcnJheSIsICJ1bmlmb3JtMWl2IiwgInVuaWZvcm1NYXRyaXg0ZnYiLCAiUFJPSkVDVElPTl9NQVRSSVgiLCAiX2F0bGFzVGV4dHVyZXMiLCAiZ2xUZXh0dXJlIiwgIkdMVGV4dHVyZSIsICJjcmVhdGVUZXh0dXJlIiwgImRlbGV0ZVRleHR1cmUiLCAidGV4dHVyZSIsICJhY3RpdmVUZXh0dXJlIiwgIlRFWFRVUkUwIiwgImJpbmRUZXh0dXJlIiwgIlRFWFRVUkVfMkQiLCAidGV4UGFyYW1ldGVyaSIsICJURVhUVVJFX1dSQVBfUyIsICJDTEFNUF9UT19FREdFIiwgIlRFWFRVUkVfV1JBUF9UIiwgInRleEltYWdlMkQiLCAiUkdCQSIsICJVTlNJR05FRF9CWVRFIiwgImVuYWJsZSIsICJCTEVORCIsICJibGVuZEZ1bmMiLCAiU1JDX0FMUEhBIiwgIk9ORV9NSU5VU19TUkNfQUxQSEEiLCAiaGFuZGxlUmVzaXplIiwgImJlZ2luRnJhbWUiLCAiX2F0bGFzIiwgIngiLCAieSIsICJjb2RlIiwgImJnIiwgImZnIiwgImV4dCIsICJjaGFycyIsICJ3aWR0aCIsICJsYXN0QmciLCAiX3VwZGF0ZUNlbGwiLCAiYXJyYXkiLCAiY29scyIsICJOVUxMX0NFTExfQ09ERSIsICJsZW5ndGgiLCAiZ2V0UmFzdGVyaXplZEdseXBoQ29tYmluZWRDaGFyIiwgImdldFJhc3Rlcml6ZWRHbHlwaCIsICJmbG9vciIsICJkZXZpY2UiLCAiY2VsbCIsICJjaGFyIiwgIm9mZnNldCIsICJsZWZ0IiwgInRvcCIsICJzaXplIiwgImNhbnZhcyIsICJoZWlnaHQiLCAidGV4dHVyZVBhZ2UiLCAidGV4dHVyZVBvc2l0aW9uQ2xpcFNwYWNlIiwgInBhZ2VzIiwgInNpemVDbGlwU3BhY2UiLCAicmF3T3B0aW9ucyIsICJyZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHMiLCAiYWxsb3dSZXNjYWxpbmciLCAiZmlsbCIsICJjbGVhciIsICJ0ZXJtaW5hbCIsICJuZXdDb3VudCIsICJyb3dzIiwgInZpZXdwb3J0IiwgInVuaWZvcm0yZiIsICJyZW5kZXJNb2RlbCIsICJhY3RpdmVCdWZmZXIiLCAiYnVmZmVyTGVuZ3RoIiwgImxpbmVMZW5ndGhzIiwgInNpIiwgInN1YiIsICJzdWJhcnJheSIsICJzZXQiLCAiU1RSRUFNX0RSQVciLCAidmVyc2lvbiIsICJfYmluZEF0bGFzUGFnZVRleHR1cmUiLCAiZHJhd0VsZW1lbnRzSW5zdGFuY2VkIiwgIlRSSUFOR0xFX1NUUklQIiwgImF0bGFzIiwgImdlbmVyYXRlTWlwbWFwIiwgImRpbWVuc2lvbnMiLCAiQllURVNfUEVSX1JFQ1RBTkdMRSIsICJWZXJ0aWNlcyIsICJjb25zdHJ1Y3RvciIsICIkcmdiYSIsICIkeDEiLCAiJHkxIiwgIiRyIiwgIiRnIiwgIiRiIiwgIiRhIiwgIlJlY3RhbmdsZVJlbmRlcmVyIiwgIl90aGVtZVNlcnZpY2UiLCAiX3ZlcnRpY2VzQ3Vyc29yIiwgIl91cGRhdGVDYWNoZWRDb2xvcnMiLCAiY29sb3JzIiwgIm9uQ2hhbmdlQ29sb3JzIiwgIl91cGRhdGVWaWV3cG9ydFJlY3RhbmdsZSIsICJyZW5kZXJCYWNrZ3JvdW5kcyIsICJfcmVuZGVyVmVydGljZXMiLCAicmVuZGVyQ3Vyc29yIiwgInZlcnRpY2VzIiwgIkRZTkFNSUNfRFJBVyIsICJfYmdGbG9hdCIsICJfY29sb3JUb0Zsb2F0MzJBcnJheSIsICJiYWNrZ3JvdW5kIiwgIl9jdXJzb3JGbG9hdCIsICJjdXJzb3IiLCAiX2FkZFJlY3RhbmdsZUZsb2F0IiwgIm1vZGVsIiwgImN1cnJlbnRTdGFydFgiLCAiY3VycmVudEJnIiwgImN1cnJlbnRGZyIsICJjdXJyZW50SW52ZXJzZSIsICJtb2RlbEluZGV4IiwgImludmVyc2UiLCAicmVjdGFuZ2xlQ291bnQiLCAiUkVOREVSX01PREVMX0lORElDSUVTX1BFUl9DRUxMIiwgImNlbGxzIiwgIlJFTkRFUl9NT0RFTF9CR19PRkZTRVQiLCAiUkVOREVSX01PREVMX0ZHX09GRlNFVCIsICJfdXBkYXRlUmVjdGFuZ2xlIiwgInN0eWxlIiwgImRwciIsICJjdXJzb3JXaWR0aCIsICJzdGFydFgiLCAiZW5kWCIsICJhbnNpIiwgInJnYmEiLCAiZm9yZWdyb3VuZCIsICJleHBhbmRGbG9hdDMyQXJyYXkiLCAiX2FkZFJlY3RhbmdsZSIsICJ4MSIsICJ5MSIsICJyIiwgImciLCAiYiIsICJhIiwgImNvbG9yIiwgIlJFTkRFUl9NT0RFTF9FWFRfT0ZGU0VUIiwgIkNPTUJJTkVEX0NIQVJfQklUX01BU0siLCAiVWludDMyQXJyYXkiLCAic2VsZWN0aW9uIiwgImNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsIiwgImluZGV4Q291bnQiLCAiV2ViZ2xSZW5kZXJlciIsICJfY2hhcmFjdGVySm9pbmVyU2VydmljZSIsICJfY2hhclNpemVTZXJ2aWNlIiwgIl9jb3JlQnJvd3NlclNlcnZpY2UiLCAiX2NvcmVTZXJ2aWNlIiwgIl9kZWNvcmF0aW9uU2VydmljZSIsICJwcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCAiX2N1cnNvckJsaW5rU3RhdGVNYW5hZ2VyIiwgIk11dGFibGVEaXNwb3NhYmxlIiwgIl9jaGFyQXRsYXNEaXNwb3NhYmxlIiwgIl9vYnNlcnZlckRpc3Bvc2FibGUiLCAiX21vZGVsIiwgIlJlbmRlck1vZGVsIiwgIl93b3JrQ2VsbCIsICJDZWxsRGF0YSIsICJfd29ya0NlbGwyIiwgIl9yZWN0YW5nbGVSZW5kZXJlciIsICJfZ2x5cGhSZW5kZXJlciIsICJfb25DaGFuZ2VUZXh0dXJlQXRsYXMiLCAiRXZlbnRFbWl0dGVyIiwgIm9uQ2hhbmdlVGV4dHVyZUF0bGFzIiwgImV2ZW50IiwgIl9vbkFkZFRleHR1cmVBdGxhc0NhbnZhcyIsICJvbkFkZFRleHR1cmVBdGxhc0NhbnZhcyIsICJfb25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMiLCAib25SZW1vdmVUZXh0dXJlQXRsYXNDYW52YXMiLCAiX29uUmVxdWVzdFJlZHJhdyIsICJvblJlcXVlc3RSZWRyYXciLCAiX29uQ29udGV4dExvc3MiLCAib25Db250ZXh0TG9zcyIsICJfaGFuZGxlQ29sb3JDaGFuZ2UiLCAiX2NlbGxDb2xvclJlc29sdmVyIiwgIkNlbGxDb2xvclJlc29sdmVyIiwgIl9jb3JlIiwgIl9yZW5kZXJMYXllcnMiLCAiTGlua1JlbmRlckxheWVyIiwgInNjcmVlbkVsZW1lbnQiLCAibGlua2lmaWVyIiwgImNyZWF0ZVJlbmRlckRpbWVuc2lvbnMiLCAiX2RldmljZVBpeGVsUmF0aW8iLCAiX3VwZGF0ZURpbWVuc2lvbnMiLCAiX3VwZGF0ZUN1cnNvckJsaW5rIiwgIm9uT3B0aW9uQ2hhbmdlIiwgIl9oYW5kbGVPcHRpb25zQ2hhbmdlZCIsICJfY2FudmFzIiwgIm1haW5Eb2N1bWVudCIsICJjcmVhdGVFbGVtZW50IiwgImNvbnRleHRBdHRyaWJ1dGVzIiwgImFudGlhbGlhcyIsICJkZXB0aCIsICJnZXRDb250ZXh0IiwgIkVycm9yIiwgImFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciIsICJjb25zb2xlIiwgImxvZyIsICJwcmV2ZW50RGVmYXVsdCIsICJfY29udGV4dFJlc3RvcmF0aW9uVGltZW91dCIsICJzZXRUaW1lb3V0IiwgIndhcm4iLCAiZmlyZSIsICJjbGVhclRpbWVvdXQiLCAicmVtb3ZlVGVybWluYWxGcm9tQ2FjaGUiLCAiX2luaXRpYWxpemVXZWJHTFN0YXRlIiwgIl9yZXF1ZXN0UmVkcmF3Vmlld3BvcnQiLCAidmFsdWUiLCAib2JzZXJ2ZURldmljZVBpeGVsRGltZW5zaW9ucyIsICJ3aW5kb3ciLCAidyIsICJoIiwgIl9zZXRDYW52YXNEZXZpY2VQaXhlbERpbWVuc2lvbnMiLCAib25XaW5kb3dDaGFuZ2UiLCAiYXBwZW5kQ2hpbGQiLCAiX2lzQXR0YWNoZWQiLCAiZG9jdW1lbnQiLCAiYm9keSIsICJjb250YWlucyIsICJsIiwgImRpc3Bvc2UiLCAicGFyZW50RWxlbWVudCIsICJyZW1vdmVDaGlsZCIsICJ0ZXh0dXJlQXRsYXMiLCAiX2NoYXJBdGxhcyIsICJfcmVmcmVzaENoYXJBdGxhcyIsICJfY2xlYXJNb2RlbCIsICJoYW5kbGVEZXZpY2VQaXhlbFJhdGlvQ2hhbmdlIiwgInJlc2l6ZSIsICJjc3MiLCAic2V0RGltZW5zaW9ucyIsICJoYW5kbGVDaGFyU2l6ZUNoYW5nZWQiLCAiaGFuZGxlQmx1ciIsICJwYXVzZSIsICJoYW5kbGVGb2N1cyIsICJyZXN1bWUiLCAic3RhcnQiLCAiZW5kIiwgImNvbHVtblNlbGVjdE1vZGUiLCAiaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCIsICJ1cGRhdGUiLCAiaGFuZGxlQ3Vyc29yTW92ZSIsICJyZXN0YXJ0QmxpbmtBbmltYXRpb24iLCAiYWNxdWlyZVRleHR1cmVBdGxhcyIsICJnZXREaXNwb3NlQXJyYXlEaXNwb3NhYmxlIiwgImZvcndhcmRFdmVudCIsICJ3YXJtVXAiLCAic2V0QXRsYXMiLCAiY2xlYXJHbHlwaFJlbmRlcmVyIiwgImNsZWFyVGV4dHVyZUF0bGFzIiwgImNsZWFyVGV4dHVyZSIsICJyZXNldCIsICJoYW5kbGVyIiwgImpvaW5lcklkIiwgImhhbmRsZUdyaWRDaGFuZ2VkIiwgIl91cGRhdGVNb2RlbCIsICJyZW5kZXIiLCAiaXNDdXJzb3JWaXNpYmxlIiwgIm9wdGlvbnMiLCAiY3Vyc29yQmxpbmsiLCAiQ3Vyc29yQmxpbmtTdGF0ZU1hbmFnZXIiLCAiX3JlcXVlc3RSZWRyYXdDdXJzb3IiLCAicm93IiwgImxpbmUiLCAiam9pbmVkUmFuZ2VzIiwgImlzSm9pbmVkIiwgImxhc3RDaGFyWCIsICJyYW5nZSIsICJqIiwgImNsYW1wIiwgImN1cnNvclkiLCAiYnVmZmVyIiwgImFjdGl2ZSIsICJiYXNlWSIsICJ2aWV3cG9ydFJlbGF0aXZlQ3Vyc29yWSIsICJ5ZGlzcCIsICJjdXJzb3JYIiwgImxhc3RDdXJzb3JYIiwgImlzQ3Vyc29ySW5pdGlhbGl6ZWQiLCAiaXNDdXJzb3JIaWRkZW4iLCAibW9kZWxVcGRhdGVkIiwgImxpbmVzIiwgImdldCIsICJnZXRKb2luZWRDaGFyYWN0ZXJzIiwgInJlc3VsdCIsICJsb2FkQ2VsbCIsICJzaGlmdCIsICJKb2luZWRDZWxsRGF0YSIsICJ0cmFuc2xhdGVUb1N0cmluZyIsICJnZXRDaGFycyIsICJnZXRDb2RlIiwgInJlc29sdmUiLCAiZ2V0V2lkdGgiLCAiaXNGb2N1c2VkIiwgImN1cnNvclN0eWxlIiwgImN1cnNvckluYWN0aXZlU3R5bGUiLCAiY3Vyc29yQWNjZW50IiwgInVwZGF0ZUNlbGwiLCAiTlVMTF9DRUxMX0NIQVIiLCAidXBkYXRlQmFja2dyb3VuZHMiLCAidXBkYXRlQ3Vyc29yIiwgImNlaWwiLCAibGluZUhlaWdodCIsICJyb3VuZCIsICJsZXR0ZXJTcGFjaW5nIiwgIkF0dHJpYnV0ZURhdGEiLCAiZmlyc3RDZWxsIiwgImNvbnRlbnQiLCAiY29tYmluZWREYXRhIiwgIl93aWR0aCIsICJpc0NvbWJpbmVkIiwgImdldEFzQ2hhckRhdGEiLCAibWF4IiwgImNyZWF0ZVNoYWRlciIsICJ0eXBlIiwgInNvdXJjZSIsICJzaGFkZXIiLCAic2hhZGVyU291cmNlIiwgImNvbXBpbGVTaGFkZXIiLCAiZ2V0U2hhZGVyUGFyYW1ldGVyIiwgIkNPTVBJTEVfU1RBVFVTIiwgImVycm9yIiwgImdldFNoYWRlckluZm9Mb2ciLCAiZGVsZXRlU2hhZGVyIiwgInZlcnRleFNvdXJjZSIsICJmcmFnbWVudFNvdXJjZSIsICJwcm9ncmFtIiwgImF0dGFjaFNoYWRlciIsICJWRVJURVhfU0hBREVSIiwgIkZSQUdNRU5UX1NIQURFUiIsICJsaW5rUHJvZ3JhbSIsICJnZXRQcm9ncmFtUGFyYW1ldGVyIiwgIkxJTktfU1RBVFVTIiwgImdldFByb2dyYW1JbmZvTG9nIiwgIm5ld0xlbmd0aCIsICJuZXdBcnJheSIsICJCYXNlUmVuZGVyTGF5ZXIiLCAiX2NvbnRhaW5lciIsICJpZCIsICJ6SW5kZXgiLCAiX2FscGhhIiwgIl9kZXZpY2VDaGFyV2lkdGgiLCAiX2RldmljZUNoYXJIZWlnaHQiLCAiX2RldmljZUNlbGxXaWR0aCIsICJfZGV2aWNlQ2VsbEhlaWdodCIsICJfZGV2aWNlQ2hhckxlZnQiLCAiX2RldmljZUNoYXJUb3AiLCAiY2xhc3NMaXN0IiwgImFkZCIsICJ0b1N0cmluZyIsICJfaW5pdENhbnZhcyIsICJyZW1vdmUiLCAiX2N0eCIsICJhbHBoYSIsICJfY2xlYXJBbGwiLCAic3RhcnRSb3ciLCAiZW5kUm93IiwgIm9sZENhbnZhcyIsICJjbG9uZU5vZGUiLCAicmVwbGFjZUNoaWxkIiwgImNvbG9yU2V0IiwgImRpbSIsICJmaWxsUmVjdCIsICJjbGVhclJlY3QiLCAiZmlsbFN0eWxlIiwgImZvbnQiLCAiX2dldEZvbnQiLCAidGV4dEJhc2VsaW5lIiwgIlRFWFRfQkFTRUxJTkUiLCAiX2NsaXBDZWxsIiwgImZpbGxUZXh0IiwgImJlZ2luUGF0aCIsICJyZWN0IiwgImNsaXAiLCAiaXNCb2xkIiwgImlzSXRhbGljIiwgImZvbnRXZWlnaHRCb2xkIiwgImZvbnRXZWlnaHQiLCAiZm9udFNpemUiLCAiZm9udEZhbWlseSIsICJjb250YWluZXIiLCAibGlua2lmaWVyMiIsICJjb3JlQnJvd3NlclNlcnZpY2UiLCAib3B0aW9uc1NlcnZpY2UiLCAidGhlbWVTZXJ2aWNlIiwgIm9uU2hvd0xpbmtVbmRlcmxpbmUiLCAiX2hhbmRsZVNob3dMaW5rVW5kZXJsaW5lIiwgIm9uSGlkZUxpbmtVbmRlcmxpbmUiLCAiX2hhbmRsZUhpZGVMaW5rVW5kZXJsaW5lIiwgIl9zdGF0ZSIsICJfY2xlYXJDdXJyZW50TGluayIsICJfY2xlYXJDZWxscyIsICJtaWRkbGVSb3dDb3VudCIsICJ5MiIsICJ4MiIsICJ1bmRlZmluZWQiLCAiSU5WRVJURURfREVGQVVMVF9DT0xPUiIsICJpczI1NkNvbG9yIiwgIl9maWxsQm90dG9tTGluZUF0Q2VsbHMiLCAibm9kZSIsICJhZGRFdmVudExpc3RlbmVyIiwgImRpc3Bvc2VkIiwgInJlbW92ZUV2ZW50TGlzdGVuZXIiLCAiJGNvbG9ycyIsICIkZmciLCAiJGJnIiwgIiRoYXNGZyIsICIkaGFzQmciLCAiJGlzU2VsZWN0ZWQiLCAiJHZhcmlhbnRPZmZzZXQiLCAiX29wdGlvblNlcnZpY2UiLCAiX3NlbGVjdGlvblJlbmRlck1vZGVsIiwgImRldmljZUNlbGxXaWR0aCIsICJleHRlbmRlZCIsICJ1bmRlcmxpbmVTdHlsZSIsICJsaW5lV2lkdGgiLCAiZm9yRWFjaERlY29yYXRpb25BdENlbGwiLCAiZCIsICJiYWNrZ3JvdW5kQ29sb3JSR0IiLCAiZm9yZWdyb3VuZENvbG9yUkdCIiwgImlzQ2VsbFNlbGVjdGVkIiwgImJsZW5kIiwgInNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUiLCAic2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlIiwgInNlbGVjdGlvbkZvcmVncm91bmQiLCAidHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yIiwgImNoYXJBdGxhc0NhY2hlIiwgImRldmljZUNlbGxIZWlnaHQiLCAiZGV2aWNlQ2hhcldpZHRoIiwgImRldmljZUNoYXJIZWlnaHQiLCAiZGV2aWNlUGl4ZWxSYXRpbyIsICJuZXdDb25maWciLCAiZ2VuZXJhdGVDb25maWciLCAiZW50cnkiLCAib3duZWRCeUluZGV4IiwgIm93bmVkQnkiLCAiaW5kZXhPZiIsICJjb25maWdFcXVhbHMiLCAiY29uZmlnIiwgInNwbGljZSIsICJwdXNoIiwgImNvcmUiLCAibmV3RW50cnkiLCAidW5pY29kZVNlcnZpY2UiLCAiaW5kZXgiLCAiY2xvbmVkQ29sb3JzIiwgIk5VTExfQ09MT1IiLCAic2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50IiwgInNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50IiwgInNsaWNlIiwgImNvbnRyYXN0Q2FjaGUiLCAiaGFsZkNvbnRyYXN0Q2FjaGUiLCAiY3VzdG9tR2x5cGhzIiwgImFsbG93VHJhbnNwYXJlbmN5IiwgImRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzIiwgIm1pbmltdW1Db250cmFzdFJhdGlvIiwgImNvbG9yQ29kZSIsICJESU1fT1BBQ0lUWSIsICJpc0ZpcmVmb3giLCAiaXNMZWdhY3lFZGdlIiwgIl9yZW5kZXJDYWxsYmFjayIsICJfcmVzdGFydEludGVydmFsIiwgImlzUGF1c2VkIiwgIl9ibGlua1N0YXJ0VGltZW91dCIsICJfYmxpbmtJbnRlcnZhbCIsICJjbGVhckludGVydmFsIiwgIl9hbmltYXRpb25GcmFtZSIsICJjYW5jZWxBbmltYXRpb25GcmFtZSIsICJfYW5pbWF0aW9uVGltZVJlc3RhcnRlZCIsICJEYXRlIiwgIm5vdyIsICJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCAidGltZVRvU3RhcnQiLCAiQkxJTktfSU5URVJWQUwiLCAidGltZSIsICJzZXRJbnRlcnZhbCIsICJibG9ja0VsZW1lbnREZWZpbml0aW9ucyIsICJwYXR0ZXJuQ2hhcmFjdGVyRGVmaW5pdGlvbnMiLCAiYm94RHJhd2luZ0RlZmluaXRpb25zIiwgInhwIiwgInlwIiwgInBvd2VybGluZURlZmluaXRpb25zIiwgInJpZ2h0UGFkZGluZyIsICJsZWZ0UGFkZGluZyIsICJjdHgiLCAiYyIsICJ4T2Zmc2V0IiwgInlPZmZzZXQiLCAiYmxvY2tFbGVtZW50RGVmaW5pdGlvbiIsICJjaGFyRGVmaW5pdGlvbiIsICJib3giLCAieEVpZ2h0aCIsICJ5RWlnaHRoIiwgInBhdHRlcm5EZWZpbml0aW9uIiwgInBhdHRlcm5TZXQiLCAiY2FjaGVkUGF0dGVybnMiLCAiTWFwIiwgInBhdHRlcm4iLCAidG1wQ2FudmFzIiwgIm93bmVyRG9jdW1lbnQiLCAidG1wQ3R4IiwgImltYWdlRGF0YSIsICJJbWFnZURhdGEiLCAic3RhcnRzV2l0aCIsICJwYXJzZUludCIsICJzdWJzdHJpbmciLCAic3BsaXQiLCAibWFwIiwgInBhcnNlRmxvYXQiLCAiZGF0YSIsICJwdXRJbWFnZURhdGEiLCAiY3JlYXRlUGF0dGVybiIsICJib3hEcmF3aW5nRGVmaW5pdGlvbiIsICJzdHJva2VTdHlsZSIsICJpbnN0cnVjdGlvbnMiLCAiT2JqZWN0IiwgImVudHJpZXMiLCAiYWN0dWFsSW5zdHJ1Y3Rpb25zIiwgIk51bWJlciIsICJpbnN0cnVjdGlvbiIsICJmIiwgInN2Z1RvQ2FudmFzSW5zdHJ1Y3Rpb25NYXAiLCAiYXJncyIsICJ0cmFuc2xhdGVBcmdzIiwgInN0cm9rZSIsICJjbG9zZVBhdGgiLCAicG93ZXJsaW5lRGVmaW5pdGlvbiIsICJjbGlwUmVnaW9uIiwgIlBhdGgyRCIsICJjc3NMaW5lV2lkdGgiLCAiYmV6aWVyQ3VydmVUbyIsICJsaW5lVG8iLCAibW92ZVRvIiwgImNlbGxXaWR0aCIsICJjZWxsSGVpZ2h0IiwgImRvQ2xhbXAiLCAiZWxlbWVudCIsICJwYXJlbnRXaW5kb3ciLCAiY2FsbGJhY2siLCAib2JzZXJ2ZXIiLCAiUmVzaXplT2JzZXJ2ZXIiLCAiZmluZCIsICJ0YXJnZXQiLCAiZGlzY29ubmVjdCIsICJkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplIiwgImlubGluZVNpemUiLCAiYmxvY2tTaXplIiwgIm9ic2VydmUiLCAiaXNQb3dlcmxpbmVHbHlwaCIsICJjb2RlcG9pbnQiLCAiaXNFbW9qaSIsICJnbHlwaFNpemVYIiwgImN1cnJlbnRPZmZzZXQiLCAiU2VsZWN0aW9uUmVuZGVyTW9kZWwiLCAiaGFzU2VsZWN0aW9uIiwgInZpZXdwb3J0U3RhcnRSb3ciLCAidmlld3BvcnRFbmRSb3ciLCAidmlld3BvcnRDYXBwZWRTdGFydFJvdyIsICJ2aWV3cG9ydENhcHBlZEVuZFJvdyIsICJzdGFydENvbCIsICJlbmRDb2wiLCAic2VsZWN0aW9uU3RhcnQiLCAic2VsZWN0aW9uRW5kIiwgInZpZXdwb3J0WSIsICJidWZmZXJzIiwgIk5VTExfUkFTVEVSSVpFRF9HTFlQSCIsICJ0ZXh0dXJlUG9zaXRpb24iLCAiX3BhZ2VzIiwgIl9kb2N1bWVudCIsICJfY29uZmlnIiwgIl91bmljb2RlU2VydmljZSIsICJfZGlkV2FybVVwIiwgIl9jYWNoZU1hcCIsICJGb3VyS2V5TWFwIiwgIl9jYWNoZU1hcENvbWJpbmVkIiwgIl9hY3RpdmVQYWdlcyIsICJfd29ya0JvdW5kaW5nQm94IiwgImJvdHRvbSIsICJyaWdodCIsICJfd29ya0F0dHJpYnV0ZURhdGEiLCAiX3RleHR1cmVTaXplIiwgIl9yZXF1ZXN0Q2xlYXJNb2RlbCIsICJfY3JlYXRlTmV3UGFnZSIsICJfdG1wQ2FudmFzIiwgImNyZWF0ZUNhbnZhcyIsICJUTVBfQ0FOVkFTX0dMWVBIX1BBRERJTkciLCAiX3RtcEN0eCIsICJ3aWxsUmVhZEZyZXF1ZW50bHkiLCAicGFnZSIsICJfZG9XYXJtVXAiLCAicXVldWUiLCAiSWRsZVRhc2tRdWV1ZSIsICJlbnF1ZXVlIiwgIkRFRkFVTFRfQ09MT1IiLCAiREVGQVVMVF9FWFQiLCAicmFzdGVyaXplZEdseXBoIiwgIl9kcmF3VG9DYWNoZSIsICJjdXJyZW50Um93IiwgInBhZ2VzQnlTaXplIiwgImZpbHRlciIsICJzb3J0IiwgInBlcmNlbnRhZ2VVc2VkIiwgInNhbWVTaXplSSIsICJtZXJnaW5nUGFnZXMiLCAic29ydGVkTWVyZ2luZ1BhZ2VzSW5kZXhlcyIsICJnbHlwaHMiLCAibWVyZ2VkUGFnZUluZGV4IiwgIm1lcmdlZFBhZ2UiLCAiX21lcmdlUGFnZXMiLCAiX2RlbGV0ZVBhZ2UiLCAibmV3UGFnZSIsICJBdGxhc1BhZ2UiLCAibWVyZ2VkU2l6ZSIsICJwIiwgImRyYXdJbWFnZSIsICJwYWdlSW5kZXgiLCAiYWRqdXN0aW5nUGFnZSIsICJyZXN0cmljdFRvQ2VsbEhlaWdodCIsICJfZ2V0RnJvbUNhY2hlTWFwIiwgImNhY2hlTWFwIiwgImtleSIsICJpZHgiLCAiYmdDb2xvck1vZGUiLCAiYmdDb2xvciIsICJfZ2V0Q29sb3JGcm9tQW5zaUluZGV4IiwgImFyciIsICJ0b0NvbG9yUkdCIiwgImNoYW5uZWxzIiwgInRvQ29sb3IiLCAib3BhcXVlIiwgImZnQ29sb3JNb2RlIiwgImZnQ29sb3IiLCAiYm9sZCIsICJleGNsdWRlRnJvbUNvbnRyYXN0UmF0aW9EZW1hbmRzIiwgIm1pbmltdW1Db250cmFzdENvbG9yIiwgIl9nZXRNaW5pbXVtQ29udHJhc3RDb2xvciIsICJtdWx0aXBseU9wYWNpdHkiLCAiY2FjaGUiLCAiX2dldENvbnRyYXN0Q2FjaGUiLCAiYWRqdXN0ZWRDb2xvciIsICJnZXRDb2xvciIsICJiZ1JnYmEiLCAiX3Jlc29sdmVCYWNrZ3JvdW5kUmdiYSIsICJmZ1JnYmEiLCAiX3Jlc29sdmVGb3JlZ3JvdW5kUmdiYSIsICJlbnN1cmVDb250cmFzdFJhdGlvIiwgInNldENvbG9yIiwgImNvZGVPckNoYXJzIiwgIlN0cmluZyIsICJmcm9tQ2hhckNvZGUiLCAiYWxsb3dlZFdpZHRoIiwgImFsbG93ZWRIZWlnaHQiLCAic2F2ZSIsICJpc0ludmlzaWJsZSIsICJpc0ludmVyc2UiLCAiaXNEaW0iLCAiaXRhbGljIiwgInVuZGVybGluZSIsICJpc1VuZGVybGluZSIsICJzdHJpa2V0aHJvdWdoIiwgImlzU3RyaWtldGhyb3VnaCIsICJvdmVybGluZSIsICJpc092ZXJsaW5lIiwgImdldEZnQ29sb3IiLCAiZ2V0RmdDb2xvck1vZGUiLCAiZ2V0QmdDb2xvciIsICJnZXRCZ0NvbG9yTW9kZSIsICJ0ZW1wIiwgInRlbXAyIiwgImJhY2tncm91bmRDb2xvciIsICJfZ2V0QmFja2dyb3VuZENvbG9yIiwgImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsICJmb250U3R5bGUiLCAicG93ZXJsaW5lR2x5cGgiLCAiY2hhckNvZGVBdCIsICJyZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgiLCAiaXNSZXN0cmljdGVkUG93ZXJsaW5lR2x5cGgiLCAiZm9yZWdyb3VuZENvbG9yIiwgIl9nZXRGb3JlZ3JvdW5kQ29sb3IiLCAicGFkZGluZyIsICJjdXN0b21HbHlwaCIsICJ0cnlEcmF3Q3VzdG9tQ2hhciIsICJjaFdpZHRoIiwgImVuYWJsZUNsZWFyVGhyZXNob2xkQ2hlY2siLCAid2N3aWR0aCIsICJnZXRTdHJpbmdDZWxsV2lkdGgiLCAiaXNVbmRlcmxpbmVDb2xvckRlZmF1bHQiLCAiaXNVbmRlcmxpbmVDb2xvclJHQiIsICJnZXRVbmRlcmxpbmVDb2xvciIsICJqb2luIiwgInhMZWZ0IiwgInlUb3AiLCAieU1pZCIsICJ5Qm90IiwgIm5leHRPZmZzZXQiLCAiZ2V0VW5kZXJsaW5lVmFyaWFudE9mZnNldCIsICJ4Q2hMZWZ0IiwgInhDaFJpZ2h0IiwgInhDaE1pZCIsICJ5Q3VybHlCb3QiLCAieUN1cmx5VG9wIiwgIm9mZnNldFdpZHRoIiwgInNldExpbmVEYXNoIiwgImNvbXB1dGVOZXh0VmFyaWFudE9mZnNldCIsICJsaW5lUmF0aW8iLCAiZ2FwUmF0aW8iLCAieENoV2lkdGgiLCAiZ2FwIiwgInJlc3RvcmUiLCAibWV0cmljcyIsICJtZWFzdXJlVGV4dCIsICJhY3R1YWxCb3VuZGluZ0JveERlc2NlbnQiLCAic3Ryb2tlVGV4dCIsICJpc0JleW9uZENlbGxCb3VuZHMiLCAiY2xlYXJDb2xvciIsICJnZXRJbWFnZURhdGEiLCAiaXNFbXB0eSIsICJfZmluZEdseXBoQm91bmRpbmdCb3giLCAiYWN0aXZlUGFnZSIsICJhY3RpdmVSb3ciLCAiZml4ZWRSb3dzIiwgIndhc1BhZ2VBbmRSb3dGb3VuZCIsICJjYW5kaWRhdGVQYWdlIiwgImFkZEdseXBoIiwgImJvdW5kaW5nQm94IiwgInJlc3RyaWN0ZWRHbHlwaCIsICJmb3VuZCIsICJhbHBoYU9mZnNldCIsICJfdXNlZFBpeGVscyIsICJfZ2x5cGhzIiwgImdseXBoIiwgInNvdXJjZVBhZ2VzIiwgImVuYWJsZVRocmVzaG9sZENoZWNrIiwgImZnUiIsICJmZ0ciLCAiZmdCIiwgInRocmVzaG9sZCIsICJhYnMiLCAicmdiIiwgInRvUGFkZGVkSGV4IiwgImNvbnRyYXN0UmF0aW8iLCAibDEiLCAibDIiLCAidG9Dc3MiLCAidG9SZ2JhIiwgIm9wYWNpdHkiLCAidG9DaGFubmVscyIsICJiZ1IiLCAiYmdHIiwgImJnQiIsICJpc09wYXF1ZSIsICJyYXRpbyIsICJyZ2JhQ29sb3IiLCAiZmFjdG9yIiwgIiRjdHgiLCAiJGxpdG11c0NvbG9yIiwgImNyZWF0ZUxpbmVhckdyYWRpZW50IiwgIm1hdGNoIiwgInJlcGVhdCIsICJyZ2JhTWF0Y2giLCAicmVsYXRpdmVMdW1pbmFuY2UyIiwgInJzIiwgImdzIiwgImJzIiwgInBvdyIsICJyZWxhdGl2ZUx1bWluYW5jZSIsICJyZWR1Y2VMdW1pbmFuY2UiLCAiY3IiLCAiaW5jcmVhc2VMdW1pbmFuY2UiLCAiYmdMIiwgImZnTCIsICJyZXN1bHRBIiwgInJlc3VsdEFSYXRpbyIsICJyZXN1bHRCIiwgIl9saXN0ZW5lcnMiLCAiX2Rpc3Bvc2VkIiwgIl9ldmVudCIsICJsaXN0ZW5lciIsICJhcmcxIiwgImFyZzIiLCAiY2FsbCIsICJjbGVhckxpc3RlbmVycyIsICJmcm9tIiwgInRvIiwgImRpc3Bvc2VBcnJheSIsICJkaXNwb3NhYmxlcyIsICJfZGlzcG9zYWJsZXMiLCAiX2lzRGlzcG9zZWQiLCAiX3ZhbHVlIiwgIlR3b0tleU1hcCIsICJfZGF0YSIsICJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQiLCAiZm91cnRoIiwgImlzTm9kZSIsICJwcm9jZXNzIiwgInVzZXJBZ2VudCIsICJuYXZpZ2F0b3IiLCAicGxhdGZvcm0iLCAiaW5jbHVkZXMiLCAiaXNTYWZhcmkiLCAidGVzdCIsICJtYWpvclZlcnNpb24iLCAiaXNNYWMiLCAiaXNJcGFkIiwgImlzSXBob25lIiwgImlzV2luZG93cyIsICJpc0xpbnV4IiwgImlzQ2hyb21lT1MiLCAiVGFza1F1ZXVlIiwgIl90YXNrcyIsICJfaSIsICJ0YXNrIiwgIl9zdGFydCIsICJmbHVzaCIsICJfaWRsZUNhbGxiYWNrIiwgIl9jYW5jZWxDYWxsYmFjayIsICJfcmVxdWVzdENhbGxiYWNrIiwgIl9wcm9jZXNzIiwgImJpbmQiLCAiZGVhZGxpbmUiLCAidGFza0R1cmF0aW9uIiwgImxvbmdlc3RUYXNrIiwgImxhc3REZWFkbGluZVJlbWFpbmluZyIsICJ0aW1lUmVtYWluaW5nIiwgImRlYWRsaW5lUmVtYWluaW5nIiwgIlByaW9yaXR5VGFza1F1ZXVlIiwgIl9jcmVhdGVEZWFkbGluZSIsICJpZGVudGlmaWVyIiwgImR1cmF0aW9uIiwgInJlcXVlc3RJZGxlQ2FsbGJhY2siLCAiY2FuY2VsSWRsZUNhbGxiYWNrIiwgIl9xdWV1ZSIsICJFeHRlbmRlZEF0dHJzIiwgImNsb25lIiwgIm5ld09iaiIsICJoYXNFeHRlbmRlZEF0dHJzIiwgImlzQmxpbmsiLCAiaXNQcm90ZWN0ZWQiLCAiaXNGZ1JHQiIsICJpc0JnUkdCIiwgImlzRmdQYWxldHRlIiwgImlzQmdQYWxldHRlIiwgImlzRmdEZWZhdWx0IiwgImlzQmdEZWZhdWx0IiwgImlzQXR0cmlidXRlRGVmYXVsdCIsICJ1cGRhdGVFeHRlbmRlZCIsICJ1bmRlcmxpbmVDb2xvciIsICJnZXRVbmRlcmxpbmVDb2xvck1vZGUiLCAiaXNVbmRlcmxpbmVDb2xvclBhbGV0dGUiLCAiZ2V0VW5kZXJsaW5lU3R5bGUiLCAidW5kZXJsaW5lVmFyaWFudE9mZnNldCIsICJfdXJsSWQiLCAiX2V4dCIsICJ1cmxJZCIsICJ2YWwiLCAib2JqIiwgInNldEZyb21DaGFyRGF0YSIsICJzdHJpbmdGcm9tQ29kZVBvaW50IiwgIkNIQVJfREFUQV9BVFRSX0lOREVYIiwgImNvbWJpbmVkIiwgIkNIQVJfREFUQV9DSEFSX0lOREVYIiwgIkNIQVJfREFUQV9XSURUSF9JTkRFWCIsICJERUZBVUxUX0FUVFIiLCAiQ0hBUl9EQVRBX0NPREVfSU5ERVgiLCAiTlVMTF9DRUxMX1dJRFRIIiwgIldISVRFU1BBQ0VfQ0VMTF9DSEFSIiwgIldISVRFU1BBQ0VfQ0VMTF9XSURUSCIsICJXSElURVNQQUNFX0NFTExfQ09ERSIsICJjb2RlUG9pbnQiLCAiX2ludGVyaW0iLCAiaW5wdXQiLCAic3RhcnRQb3MiLCAiaW50ZXJpbSIsICJieXRlMSIsICJieXRlMiIsICJieXRlMyIsICJieXRlNCIsICJkaXNjYXJkSW50ZXJpbSIsICJjcCIsICJ0bXAiLCAicG9zIiwgIm1pc3NpbmciLCAiZm91clN0b3AiLCAibyIsICJuIiwgIm9wdGlvbnNLZXlUb0xvZ0xldmVsIiwgInRyYWNlIiwgIkxvZ0xldmVsRW51bSIsICJUUkFDRSIsICJkZWJ1ZyIsICJERUJVRyIsICJpbmZvIiwgIklORk8iLCAiV0FSTiIsICJFUlJPUiIsICJvZmYiLCAiT0ZGIiwgInRyYWNlTG9nZ2VyIiwgIkxvZ1NlcnZpY2UiLCAibG9nTGV2ZWwiLCAiX2xvZ0xldmVsIiwgIl91cGRhdGVMb2dMZXZlbCIsICJvblNwZWNpZmljT3B0aW9uQ2hhbmdlIiwgIm9wdGlvbmFsUGFyYW1zIiwgIm1lc3NhZ2UiLCAiX2V2YWxMYXp5T3B0aW9uYWxQYXJhbXMiLCAibG9nZ2VyIiwgIl9sb2ciLCAiSU9wdGlvbnNTZXJ2aWNlIiwgIl90YXJnZXQiLCAiZGVzY3JpcHRvciIsICJmbiIsICJhcHBseSIsICJuYW1lIiwgIkpTT04iLCAic3RyaW5naWZ5IiwgIkRJX1RBUkdFVCIsICJESV9ERVBFTkRFTkNJRVMiLCAic2VydmljZVJlZ2lzdHJ5IiwgImN0b3IiLCAiaGFzIiwgImRlY29yYXRvciIsICJhcmd1bWVudHMiLCAiSUJ1ZmZlclNlcnZpY2UiLCAiY3JlYXRlRGVjb3JhdG9yIiwgIklDb3JlTW91c2VTZXJ2aWNlIiwgIklDb3JlU2VydmljZSIsICJJQ2hhcnNldFNlcnZpY2UiLCAiSUluc3RhbnRpYXRpb25TZXJ2aWNlIiwgIklMb2dTZXJ2aWNlIiwgIklPc2NMaW5rU2VydmljZSIsICJJVW5pY29kZVNlcnZpY2UiLCAiSURlY29yYXRpb25TZXJ2aWNlIiwgIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsICJfX3dlYnBhY2tfcmVxdWlyZV9fIiwgIm1vZHVsZUlkIiwgImNhY2hlZE1vZHVsZSIsICJfX3dlYnBhY2tfbW9kdWxlc19fIiwgIldlYmdsQWRkb24iLCAiX3ByZXNlcnZlRHJhd2luZ0J1ZmZlciIsICJnZXRTYWZhcmlWZXJzaW9uIiwgIm9uV2lsbE9wZW4iLCAiYWN0aXZhdGUiLCAiY29yZVNlcnZpY2UiLCAidW5zYWZlQ29yZSIsICJyZW5kZXJTZXJ2aWNlIiwgIl9yZW5kZXJTZXJ2aWNlIiwgImNoYXJhY3RlckpvaW5lclNlcnZpY2UiLCAiY2hhclNpemVTZXJ2aWNlIiwgImRlY29yYXRpb25TZXJ2aWNlIiwgImxvZ1NlcnZpY2UiLCAiX2xvZ1NlcnZpY2UiLCAic2V0VHJhY2VMb2dnZXIiLCAiX3JlbmRlcmVyIiwgInNldFJlbmRlcmVyIiwgIl9jcmVhdGVSZW5kZXJlciJdCn0K diff --git a/src/server/web/session-manager.ts b/src/server/web/session-manager.ts index 4c02387..f25b324 100644 --- a/src/server/web/session-manager.ts +++ b/src/server/web/session-manager.ts @@ -1,26 +1,87 @@ import type { IPty } from "node-pty"; import type { WebSocket } from "ws"; import { SessionStore } from "./session-store.js"; +import type { AuthUser } from "./auth/adapter.js"; export type { SessionInfo } from "./session-store.js"; +// ── Per-user hourly rate limiter ───────────────────────────────────────────── + +/** + * Tracks new-session creations per user within a rolling 1-hour window. + * + * `allow(userId)` is a non-destructive peek so callers can check eligibility + * before committing. `record(userId)` commits an attempt (call only on + * successful creation). + */ +export class UserHourlyRateLimiter { + private readonly attempts = new Map(); + private readonly maxPerHour: number; + + constructor(maxPerHour: number) { + this.maxPerHour = maxPerHour; + setInterval(() => this.cleanup(), 5 * 60_000).unref(); + } + + allow(userId: string): boolean { + return this.recent(userId).length < this.maxPerHour; + } + + record(userId: string): void { + const r = this.recent(userId); + r.push(Date.now()); + this.attempts.set(userId, r); + } + + /** Seconds until the oldest attempt in the window falls off (for Retry-After). */ + retryAfterSeconds(userId: string): number { + const r = this.recent(userId); + if (r.length === 0) return 0; + return Math.ceil((Math.min(...r) + 3_600_000 - Date.now()) / 1000); + } + + private recent(userId: string): number[] { + const cutoff = Date.now() - 3_600_000; + const filtered = (this.attempts.get(userId) ?? []).filter((t) => t > cutoff); + this.attempts.set(userId, filtered); + return filtered; + } + + private cleanup(): void { + const cutoff = Date.now() - 3_600_000; + for (const [id, ts] of this.attempts) { + const r = ts.filter((t) => t > cutoff); + if (r.length === 0) this.attempts.delete(id); + else this.attempts.set(id, r); + } + } +} + +// ── SessionManager ──────────────────────────────────────────────────────────── + export class SessionManager { private store: SessionStore; private maxSessions: number; - private spawnPty: (cols: number, rows: number) => IPty; + private maxSessionsPerUser: number; + private spawnPty: (cols: number, rows: number, user?: AuthUser) => IPty; + private rateLimiter: UserHourlyRateLimiter; // Tracks which sessions have already had their PTY event listeners wired, // so we don't double-register on reconnect. private wiredPtys = new Set(); constructor( maxSessions: number, - spawnPty: (cols: number, rows: number) => IPty, + spawnPty: (cols: number, rows: number, user?: AuthUser) => IPty, gracePeriodMs?: number, scrollbackBytes?: number, + maxSessionsPerUser?: number, + maxSessionsPerHour?: number, ) { this.maxSessions = maxSessions; + this.maxSessionsPerUser = maxSessionsPerUser ?? maxSessions; this.spawnPty = spawnPty; this.store = new SessionStore(gracePeriodMs, scrollbackBytes); + this.rateLimiter = new UserHourlyRateLimiter(maxSessionsPerHour ?? 100); } get activeCount(): number { @@ -39,18 +100,70 @@ export class SessionManager { return this.store.list(); } + /** All sessions in the shape expected by the admin dashboard. */ + getAllSessions(): Array<{ id: string; userId: string; createdAt: number }> { + return this.store.getAll().map((s) => ({ + id: s.token, + userId: s.userId, + createdAt: s.createdAt.getTime(), + })); + } + + /** Sessions owned by a specific user — used by the per-user API. */ + getUserSessions(userId: string) { + return this.store.listByUser(userId); + } + + isUserAtConcurrentLimit(userId: string): boolean { + return this.store.countByUser(userId) >= this.maxSessionsPerUser; + } + + isUserRateLimited(userId: string): boolean { + return !this.rateLimiter.allow(userId); + } + + retryAfterSeconds(userId: string): number { + return this.rateLimiter.retryAfterSeconds(userId); + } + /** * Spawns a new PTY, registers it in the session store, and wires up all * event plumbing between the PTY and the WebSocket. * * Returns the session token, or null if at capacity or PTY spawn fails. + * When `user` is provided the session is associated with that user and + * per-user limits are enforced. */ - create(ws: WebSocket, cols = 80, rows = 24): string | null { + create(ws: WebSocket, cols = 80, rows = 24, user?: AuthUser): string | null { if (this.isFull) return null; + const userId = user?.id ?? "default"; + + if (this.isUserAtConcurrentLimit(userId)) { + ws.send( + JSON.stringify({ + type: "error", + message: `Session limit reached for your account (max ${this.maxSessionsPerUser}).`, + }), + ); + ws.close(1013, "Per-user session limit reached"); + return null; + } + + if (this.isUserRateLimited(userId)) { + ws.send( + JSON.stringify({ + type: "error", + message: "Too many sessions created recently. Please wait before starting a new session.", + }), + ); + ws.close(1013, "Rate limited"); + return null; + } + let pty: IPty; try { - pty = this.spawnPty(cols, rows); + pty = this.spawnPty(cols, rows, user); } catch (err) { const message = err instanceof Error ? err.message : "Unknown PTY spawn error"; @@ -61,7 +174,10 @@ export class SessionManager { return null; } - const session = this.store.register(pty); + // Record the creation only after a successful spawn. + this.rateLimiter.record(userId); + + const session = this.store.register(pty, userId); session.ws = ws; const { token } = session; @@ -69,7 +185,7 @@ export class SessionManager { this.wireWsEvents(token, ws, pty); console.log( - `[session ${token.slice(0, 8)}] Created (active: ${this.store.size}/${this.maxSessions})`, + `[session ${token.slice(0, 8)}] Created for user ${userId} (active: ${this.store.size}/${this.maxSessions})`, ); return token; } diff --git a/src/server/web/session-store.ts b/src/server/web/session-store.ts index 7f7526b..ae94123 100644 --- a/src/server/web/session-store.ts +++ b/src/server/web/session-store.ts @@ -7,6 +7,8 @@ const DEFAULT_SCROLLBACK_BYTES = 100 * 1024; // 100 KB export type StoredSession = { token: string; + /** ID of the user who owns this session. */ + userId: string; pty: IPty; scrollback: ScrollbackBuffer; ws: WebSocket | null; @@ -17,6 +19,8 @@ export type StoredSession = { export type SessionInfo = { token: string; + /** ID of the user who owns this session. */ + userId: string; created: string; lastActive: string; alive: boolean; @@ -44,11 +48,13 @@ export class SessionStore { /** * Register a newly spawned PTY under a fresh session token. + * @param userId - ID of the owning user (defaults to "default" for single-user deployments). */ - register(pty: IPty): StoredSession { + register(pty: IPty, userId = "default"): StoredSession { const token = crypto.randomUUID(); const session: StoredSession = { token, + userId, pty, scrollback: new ScrollbackBuffer(this.scrollbackBytes), ws: null, @@ -153,12 +159,32 @@ export class SessionStore { list(): SessionInfo[] { return [...this.sessions.values()].map((s) => ({ token: s.token, + userId: s.userId, created: s.createdAt.toISOString(), lastActive: s.lastActive.toISOString(), alive: s.ws !== null && s.ws.readyState === 1 /* OPEN */, })); } + /** Returns summary info for sessions owned by a specific user. */ + listByUser(userId: string): SessionInfo[] { + return this.list().filter((s) => s.userId === userId); + } + + /** How many sessions are owned by the given user. */ + countByUser(userId: string): number { + let n = 0; + for (const s of this.sessions.values()) { + if (s.userId === userId) n++; + } + return n; + } + + /** Returns all raw StoredSession objects (used internally by SessionManager). */ + getAll(): StoredSession[] { + return [...this.sessions.values()]; + } + get size(): number { return this.sessions.size; } diff --git a/web/app/api/export/route.ts b/web/app/api/export/route.ts new file mode 100644 index 0000000..3c62f21 --- /dev/null +++ b/web/app/api/export/route.ts @@ -0,0 +1,85 @@ +import { NextRequest, NextResponse } from "next/server"; +import type { Conversation, ExportOptions } from "@/lib/types"; +import { toMarkdown } from "@/lib/export/markdown"; +import { toJSON } from "@/lib/export/json"; +import { toHTML } from "@/lib/export/html"; +import { toPlainText } from "@/lib/export/plaintext"; + +interface ExportRequest { + conversation: Conversation; + options: ExportOptions; +} + +const MIME: Record = { + markdown: "text/markdown; charset=utf-8", + json: "application/json", + html: "text/html; charset=utf-8", + plaintext: "text/plain; charset=utf-8", +}; + +const EXT: Record = { + markdown: "md", + json: "json", + html: "html", + plaintext: "txt", +}; + +export async function POST(req: NextRequest) { + let body: ExportRequest; + try { + body = await req.json(); + } catch { + return NextResponse.json({ error: "Invalid JSON body" }, { status: 400 }); + } + + const { conversation, options } = body; + if (!conversation || !options) { + return NextResponse.json( + { error: "Missing conversation or options" }, + { status: 400 } + ); + } + + const { format } = options; + + if (format === "pdf") { + // PDF is handled client-side via window.print() + return NextResponse.json( + { error: "PDF export is handled client-side" }, + { status: 400 } + ); + } + + let content: string; + switch (format) { + case "markdown": + content = toMarkdown(conversation, options); + break; + case "json": + content = toJSON(conversation, options); + break; + case "html": + content = toHTML(conversation, options); + break; + case "plaintext": + content = toPlainText(conversation, options); + break; + default: + return NextResponse.json({ error: `Unknown format: ${format}` }, { status: 400 }); + } + + const slug = conversation.title + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-|-$/g, "") + .slice(0, 50); + const filename = `${slug || "conversation"}.${EXT[format]}`; + + return new NextResponse(content, { + status: 200, + headers: { + "Content-Type": MIME[format], + "Content-Disposition": `attachment; filename="${filename}"`, + }, + }); +} diff --git a/web/app/api/files/read/route.ts b/web/app/api/files/read/route.ts new file mode 100644 index 0000000..840f491 --- /dev/null +++ b/web/app/api/files/read/route.ts @@ -0,0 +1,55 @@ +import { NextRequest, NextResponse } from "next/server"; +import fs from "fs/promises"; +import path from "path"; + +const IMAGE_MIME: Record = { + png: "image/png", + jpg: "image/jpeg", + jpeg: "image/jpeg", + gif: "image/gif", + webp: "image/webp", + bmp: "image/bmp", + ico: "image/x-icon", +}; + +export async function GET(request: NextRequest) { + const filePath = request.nextUrl.searchParams.get("path"); + if (!filePath) { + return NextResponse.json({ error: "path parameter required" }, { status: 400 }); + } + + const resolvedPath = path.resolve(filePath); + + try { + const stats = await fs.stat(resolvedPath); + if (stats.isDirectory()) { + return NextResponse.json({ error: "path is a directory" }, { status: 400 }); + } + + const ext = resolvedPath.split(".").pop()?.toLowerCase() ?? ""; + + // Binary images: return base64 data URL + if (ext in IMAGE_MIME) { + const buffer = await fs.readFile(resolvedPath); + const base64 = buffer.toString("base64"); + return NextResponse.json({ + content: `data:${IMAGE_MIME[ext]};base64,${base64}`, + isImage: true, + size: stats.size, + modified: stats.mtime.toISOString(), + }); + } + + // Text (including SVG) + const content = await fs.readFile(resolvedPath, "utf-8"); + return NextResponse.json({ + content, + isImage: ext === "svg", + size: stats.size, + modified: stats.mtime.toISOString(), + }); + } catch (err) { + const message = err instanceof Error ? err.message : "Unknown error"; + return NextResponse.json({ error: message }, { status: 404 }); + } +} diff --git a/web/app/api/files/write/route.ts b/web/app/api/files/write/route.ts new file mode 100644 index 0000000..60ecda3 --- /dev/null +++ b/web/app/api/files/write/route.ts @@ -0,0 +1,31 @@ +import { NextRequest, NextResponse } from "next/server"; +import fs from "fs/promises"; +import path from "path"; + +export async function POST(request: NextRequest) { + let body: { path?: string; content?: string }; + try { + body = await request.json(); + } catch { + return NextResponse.json({ error: "invalid JSON body" }, { status: 400 }); + } + + const { path: filePath, content } = body; + if (!filePath || content === undefined) { + return NextResponse.json( + { error: "path and content are required" }, + { status: 400 } + ); + } + + const resolvedPath = path.resolve(filePath); + + try { + await fs.writeFile(resolvedPath, content, "utf-8"); + const stats = await fs.stat(resolvedPath); + return NextResponse.json({ success: true, size: stats.size }); + } catch (err) { + const message = err instanceof Error ? err.message : "Unknown error"; + return NextResponse.json({ error: message }, { status: 500 }); + } +} diff --git a/web/app/api/share/[shareId]/route.ts b/web/app/api/share/[shareId]/route.ts new file mode 100644 index 0000000..a22757c --- /dev/null +++ b/web/app/api/share/[shareId]/route.ts @@ -0,0 +1,42 @@ +import { NextRequest, NextResponse } from "next/server"; +import { getShare, revokeShare, verifySharePassword } from "@/lib/share-store"; + +interface RouteContext { + params: { shareId: string }; +} + +export async function GET(req: NextRequest, { params }: RouteContext) { + const { shareId } = params; + const share = getShare(shareId); + + if (!share) { + return NextResponse.json({ error: "Share not found or expired" }, { status: 404 }); + } + + if (share.visibility === "password") { + const pw = req.headers.get("x-share-password") ?? req.nextUrl.searchParams.get("password"); + if (!pw || !verifySharePassword(shareId, pw)) { + return NextResponse.json({ error: "Password required", requiresPassword: true }, { status: 401 }); + } + } + + return NextResponse.json({ + id: share.id, + title: share.conversation.title, + messages: share.conversation.messages, + model: share.conversation.model, + createdAt: share.conversation.createdAt, + shareCreatedAt: share.createdAt, + }); +} + +export async function DELETE(_req: NextRequest, { params }: RouteContext) { + const { shareId } = params; + const deleted = revokeShare(shareId); + + if (!deleted) { + return NextResponse.json({ error: "Share not found" }, { status: 404 }); + } + + return NextResponse.json({ success: true }); +} diff --git a/web/app/api/share/route.ts b/web/app/api/share/route.ts new file mode 100644 index 0000000..5b14bd3 --- /dev/null +++ b/web/app/api/share/route.ts @@ -0,0 +1,50 @@ +import { NextRequest, NextResponse } from "next/server"; +import { nanoid } from "nanoid"; +import type { Conversation } from "@/lib/types"; +import type { ShareVisibility, ShareExpiry } from "@/lib/share-store"; +import { createShare } from "@/lib/share-store"; + +interface CreateShareRequest { + conversation: Conversation; + visibility: ShareVisibility; + password?: string; + expiry: ShareExpiry; +} + +export async function POST(req: NextRequest) { + let body: CreateShareRequest; + try { + body = await req.json(); + } catch { + return NextResponse.json({ error: "Invalid JSON body" }, { status: 400 }); + } + + const { conversation, visibility, password, expiry } = body; + if (!conversation || !visibility || !expiry) { + return NextResponse.json({ error: "Missing required fields" }, { status: 400 }); + } + + if (visibility === "password" && !password) { + return NextResponse.json( + { error: "Password required for password-protected shares" }, + { status: 400 } + ); + } + + const shareId = nanoid(12); + const share = createShare(shareId, { conversation, visibility, password, expiry }); + + const origin = req.headers.get("origin") ?? ""; + const url = `${origin}/share/${shareId}`; + + return NextResponse.json({ + id: share.id, + conversationId: share.conversationId, + visibility: share.visibility, + hasPassword: !!share.passwordHash, + expiry: share.expiry, + expiresAt: share.expiresAt, + createdAt: share.createdAt, + url, + }); +} diff --git a/web/app/globals.css b/web/app/globals.css index 8cf7b9f..a14b817 100644 --- a/web/app/globals.css +++ b/web/app/globals.css @@ -2,39 +2,72 @@ @tailwind components; @tailwind utilities; +/* ===================================================== + DESIGN TOKENS — CSS Custom Properties + Dark theme is default; add .light to for light + ===================================================== */ @layer base { :root { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - --primary: 262.1 83.3% 57.8%; - --primary-foreground: 210 20% 98%; - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; - --ring: 262.1 83.3% 57.8%; - --radius: 0.5rem; - } + /* Backgrounds */ + --color-bg-primary: #09090b; + --color-bg-secondary: #18181b; + --color-bg-elevated: #27272a; - .dark { + /* Text */ + --color-text-primary: #fafafa; + --color-text-secondary: #a1a1aa; + --color-text-muted: #52525b; + + /* Accent (brand purple) */ + --color-accent: #8b5cf6; + --color-accent-hover: #7c3aed; + --color-accent-active: #6d28d9; + --color-accent-foreground: #ffffff; + + /* Borders */ + --color-border: #27272a; + --color-border-hover: #3f3f46; + + /* Status */ + --color-success: #22c55e; + --color-success-bg: rgba(34, 197, 94, 0.12); + --color-warning: #f59e0b; + --color-warning-bg: rgba(245, 158, 11, 0.12); + --color-error: #ef4444; + --color-error-bg: rgba(239, 68, 68, 0.12); + --color-info: #3b82f6; + --color-info-bg: rgba(59, 130, 246, 0.12); + + /* Code */ + --color-code-bg: #1f1f23; + --color-code-text: #a78bfa; + + /* Shadows */ + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.5); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.5), 0 2px 4px -2px rgba(0, 0, 0, 0.3); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -4px rgba(0, 0, 0, 0.3); + + /* Border radius */ + --radius-sm: 0.25rem; + --radius-md: 0.375rem; + --radius-lg: 0.5rem; + --radius-xl: 0.75rem; + --radius: 0.5rem; + + /* Animation tokens */ + --transition-fast: 100ms ease; + --transition-normal: 200ms ease; + --transition-slow: 300ms ease; + + /* Tailwind / shadcn compat (HSL channel values) */ --background: 240 10% 3.9%; --foreground: 0 0% 98%; - --card: 240 10% 3.9%; + --card: 240 3.7% 10%; --card-foreground: 0 0% 98%; - --popover: 240 10% 3.9%; + --popover: 240 3.7% 15.9%; --popover-foreground: 0 0% 98%; --primary: 263.4 70% 50.4%; - --primary-foreground: 210 20% 98%; + --primary-foreground: 0 0% 100%; --secondary: 240 3.7% 15.9%; --secondary-foreground: 0 0% 98%; --muted: 240 3.7% 15.9%; @@ -47,32 +80,148 @@ --input: 240 3.7% 15.9%; --ring: 263.4 70% 50.4%; } -} -@layer base { - * { - @apply border-border; + /* Light theme override */ + .light { + --color-bg-primary: #fafafa; + --color-bg-secondary: #f4f4f5; + --color-bg-elevated: #ffffff; + + --color-text-primary: #09090b; + --color-text-secondary: #52525b; + --color-text-muted: #a1a1aa; + + --color-accent: #7c3aed; + --color-accent-hover: #6d28d9; + --color-accent-active: #5b21b6; + --color-accent-foreground: #ffffff; + + --color-border: #e4e4e7; + --color-border-hover: #d4d4d8; + + --color-success: #16a34a; + --color-success-bg: rgba(22, 163, 74, 0.1); + --color-warning: #d97706; + --color-warning-bg: rgba(217, 119, 6, 0.1); + --color-error: #dc2626; + --color-error-bg: rgba(220, 38, 38, 0.1); + --color-info: #2563eb; + --color-info-bg: rgba(37, 99, 235, 0.1); + + --color-code-bg: #f4f4f5; + --color-code-text: #7c3aed; + + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.05); + + --background: 0 0% 98%; + --foreground: 240 10% 3.9%; + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; + --primary: 262.1 83.3% 57.8%; + --primary-foreground: 0 0% 100%; + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; + --muted: 240 4.8% 95.9%; + --muted-foreground: 240 3.8% 46.1%; + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.9% 10%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + --ring: 262.1 83.3% 57.8%; } + + *, *::before, *::after { + box-sizing: border-box; + border-color: var(--color-border); + } + + html { + color-scheme: dark; + } + + html.light { + color-scheme: light; + } + body { - @apply bg-background text-foreground; + background-color: var(--color-bg-primary); + color: var(--color-text-primary); font-feature-settings: "rlig" 1, "calt" 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + line-height: 1.5; + } + + /* Focus visible ring */ + :focus-visible { + outline: 2px solid var(--color-accent); + outline-offset: 2px; } } -/* Scrollbar styling */ +/* ===================================================== + ANIMATIONS + ===================================================== */ +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} +@keyframes fadeOut { + from { opacity: 1; } + to { opacity: 0; } +} +@keyframes slideUp { + from { transform: translateY(8px); opacity: 0; } + to { transform: translateY(0); opacity: 1; } +} +@keyframes slideDown { + from { transform: translateY(-8px); opacity: 0; } + to { transform: translateY(0); opacity: 1; } +} +@keyframes slideDownOut { + from { transform: translateY(0); opacity: 1; } + to { transform: translateY(8px); opacity: 0; } +} +@keyframes scaleIn { + from { transform: scale(0.95); opacity: 0; } + to { transform: scale(1); opacity: 1; } +} +@keyframes scaleOut { + from { transform: scale(1); opacity: 1; } + to { transform: scale(0.95); opacity: 0; } +} +@keyframes shimmer { + 0% { background-position: -200% 0; } + 100% { background-position: 200% 0; } +} +@keyframes spin { + to { transform: rotate(360deg); } +} +@keyframes progress { + from { transform: scaleX(1); } + to { transform: scaleX(0); } +} + +/* ===================================================== + SCROLLBAR + ===================================================== */ ::-webkit-scrollbar { width: 6px; height: 6px; } - ::-webkit-scrollbar-track { - @apply bg-transparent; + background: transparent; } - ::-webkit-scrollbar-thumb { - @apply bg-surface-300 dark:bg-surface-700 rounded-full; + background: var(--color-border-hover); + border-radius: 3px; } - ::-webkit-scrollbar-thumb:hover { - @apply bg-surface-400 dark:bg-surface-600; + background: var(--color-text-muted); } diff --git a/web/app/layout.tsx b/web/app/layout.tsx index fdbe163..b831d99 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -1,9 +1,9 @@ -import type { Metadata } from "next"; +import type { Metadata, Viewport } from "next"; import { Inter } from "next/font/google"; import localFont from "next/font/local"; import "./globals.css"; import { ThemeProvider } from "@/components/layout/ThemeProvider"; -import { ToastProvider } from "@/components/ui/ToastProvider"; +import { ToastProvider } from "@/components/notifications/ToastProvider"; const inter = Inter({ subsets: ["latin"], diff --git a/web/components/a11y/Announcer.tsx b/web/components/a11y/Announcer.tsx new file mode 100644 index 0000000..a79b41a --- /dev/null +++ b/web/components/a11y/Announcer.tsx @@ -0,0 +1,68 @@ +"use client"; + +import { createContext, useCallback, useContext, useRef, useState, type ReactNode } from "react"; + +interface AnnouncerContextValue { + announce: (message: string, politeness?: "polite" | "assertive") => void; +} + +const AnnouncerContext = createContext(null); + +/** + * Provides a programmatic screen-reader announcement API via context. + * Place near the root of the app, then call `useAnnouncer()` + * anywhere to imperatively announce status changes. + * + * @example + * const { announce } = useAnnouncer(); + * announce("File uploaded successfully"); + * announce("Error: request failed", "assertive"); + */ +export function AnnouncerProvider({ children }: { children: ReactNode }) { + const [politeMsg, setPoliteMsg] = useState(""); + const [assertiveMsg, setAssertiveMsg] = useState(""); + const politeTimer = useRef | null>(null); + const assertiveTimer = useRef | null>(null); + + const announce = useCallback((message: string, politeness: "polite" | "assertive" = "polite") => { + if (politeness === "assertive") { + setAssertiveMsg(""); + if (assertiveTimer.current) clearTimeout(assertiveTimer.current); + assertiveTimer.current = setTimeout(() => setAssertiveMsg(message), 50); + } else { + setPoliteMsg(""); + if (politeTimer.current) clearTimeout(politeTimer.current); + politeTimer.current = setTimeout(() => setPoliteMsg(message), 50); + } + }, []); + + const srStyle: React.CSSProperties = { + position: "absolute", + width: "1px", + height: "1px", + padding: 0, + margin: "-1px", + overflow: "hidden", + clip: "rect(0,0,0,0)", + whiteSpace: "nowrap", + borderWidth: 0, + }; + + return ( + + {children} +
+ {politeMsg} +
+
+ {assertiveMsg} +
+
+ ); +} + +export function useAnnouncer() { + const ctx = useContext(AnnouncerContext); + if (!ctx) throw new Error("useAnnouncer must be used within "); + return ctx; +} diff --git a/web/components/a11y/FocusTrap.tsx b/web/components/a11y/FocusTrap.tsx new file mode 100644 index 0000000..8d6a76e --- /dev/null +++ b/web/components/a11y/FocusTrap.tsx @@ -0,0 +1,72 @@ +"use client"; + +import { useEffect, useRef, type ReactNode } from "react"; + +interface FocusTrapProps { + children: ReactNode; + /** When false, the trap is inactive (e.g. when the panel is hidden) */ + active?: boolean; +} + +const FOCUSABLE_SELECTORS = [ + "a[href]", + "button:not([disabled])", + "input:not([disabled])", + "select:not([disabled])", + "textarea:not([disabled])", + '[tabindex]:not([tabindex="-1"])', +].join(", "); + +/** + * Traps keyboard focus within its children when `active` is true. + * Use for modals, drawers, and other overlay patterns. + * Note: Radix Dialog handles focus trapping natively — use this only for + * custom overlay components that don't use Radix primitives. + */ +export function FocusTrap({ children, active = true }: FocusTrapProps) { + const containerRef = useRef(null); + + useEffect(() => { + if (!active) return; + + const container = containerRef.current; + if (!container) return; + + const focusable = () => + Array.from(container.querySelectorAll(FOCUSABLE_SELECTORS)).filter( + (el) => !el.closest("[aria-hidden='true']") + ); + + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key !== "Tab") return; + const els = focusable(); + if (els.length === 0) return; + + const first = els[0]; + const last = els[els.length - 1]; + + if (e.shiftKey) { + if (document.activeElement === first) { + e.preventDefault(); + last.focus(); + } + } else { + if (document.activeElement === last) { + e.preventDefault(); + first.focus(); + } + } + }; + + // Move focus into the trap on mount + const els = focusable(); + if (els.length > 0 && !container.contains(document.activeElement)) { + els[0].focus(); + } + + document.addEventListener("keydown", handleKeyDown); + return () => document.removeEventListener("keydown", handleKeyDown); + }, [active]); + + return
{children}
; +} diff --git a/web/components/a11y/LiveRegion.tsx b/web/components/a11y/LiveRegion.tsx new file mode 100644 index 0000000..aacc898 --- /dev/null +++ b/web/components/a11y/LiveRegion.tsx @@ -0,0 +1,55 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; + +interface LiveRegionProps { + /** The message to announce. Changing this value triggers an announcement. */ + message: string; + /** + * "polite" — waits for user to be idle (new chat messages, status updates) + * "assertive" — interrupts immediately (errors, critical alerts) + */ + politeness?: "polite" | "assertive"; +} + +/** + * Managed aria-live region that announces dynamic content to screen readers. + * Clears after 500 ms to ensure repeated identical messages are re-announced. + */ +export function LiveRegion({ message, politeness = "polite" }: LiveRegionProps) { + const [announced, setAnnounced] = useState(""); + const timerRef = useRef | null>(null); + + useEffect(() => { + if (!message) return; + + // Clear first to force re-announcement of identical messages + setAnnounced(""); + timerRef.current = setTimeout(() => setAnnounced(message), 50); + + return () => { + if (timerRef.current) clearTimeout(timerRef.current); + }; + }, [message]); + + return ( +
+ {announced} +
+ ); +} diff --git a/web/components/a11y/SkipToContent.tsx b/web/components/a11y/SkipToContent.tsx new file mode 100644 index 0000000..61f8a78 --- /dev/null +++ b/web/components/a11y/SkipToContent.tsx @@ -0,0 +1,18 @@ +"use client"; + +export function SkipToContent() { + return ( + + Skip to main content + + ); +} diff --git a/web/components/a11y/VisuallyHidden.tsx b/web/components/a11y/VisuallyHidden.tsx new file mode 100644 index 0000000..cdbe3d7 --- /dev/null +++ b/web/components/a11y/VisuallyHidden.tsx @@ -0,0 +1,31 @@ +import type { ReactNode } from "react"; + +interface VisuallyHiddenProps { + children: ReactNode; + /** When true, renders as a span inline; defaults to span */ + as?: "span" | "div" | "p"; +} + +/** + * Visually hides content while keeping it accessible to screen readers. + * Use for icon-only buttons, supplemental context, etc. + */ +export function VisuallyHidden({ children, as: Tag = "span" }: VisuallyHiddenProps) { + return ( + + {children} + + ); +} diff --git a/web/components/adapted/Markdown.tsx b/web/components/adapted/Markdown.tsx new file mode 100644 index 0000000..da08ec3 --- /dev/null +++ b/web/components/adapted/Markdown.tsx @@ -0,0 +1,170 @@ +"use client"; + +/** + * Web-adapted Markdown renderer. + * + * The terminal Markdown (src/components/Markdown.tsx) uses marked + Ink's + * / to render tokenised markdown as coloured ANSI output. + * This web version uses react-markdown + remark-gfm + rehype-highlight, which + * are already present in the web package, to render proper HTML with Tailwind + * prose styles. + * + * Props are intentionally compatible with the terminal version so callers can + * swap between them via the platform conditional. + */ + +import * as React from "react"; +import { useMemo } from "react"; +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import { cn } from "@/lib/utils"; + +// ─── Types ──────────────────────────────────────────────────────────────────── + +export interface MarkdownProps { + /** Markdown source string — matches the terminal component's children prop. */ + children: string; + /** When true, render all text as visually dimmed (muted colour). */ + dimColor?: boolean; + /** Extra class names applied to the prose wrapper. */ + className?: string; +} + +// ─── Inline code / pre renderers ───────────────────────────────────────────── + +function InlineCode({ children }: { children?: React.ReactNode }) { + return ( + + {children} + + ); +} + +interface PreProps { + children?: React.ReactNode; +} + +function Pre({ children }: PreProps) { + return ( +
+      {children}
+    
+ ); +} + +// ─── Component ──────────────────────────────────────────────────────────────── + +export function Markdown({ children, dimColor = false, className }: MarkdownProps) { + // Memoised to avoid re-parsing on every parent render. + const content = useMemo(() => children, [children]); + + return ( +
+ + {codeChildren} + + ); + } + return {codeChildren}; + }, + pre: ({ children: preChildren }) =>
{preChildren}
, + }} + > + {content} +
+
+ ); +} + +// ─── Table component (matches MarkdownTable.tsx surface) ───────────────────── + +export interface MarkdownTableProps { + headers: string[]; + rows: string[][]; + className?: string; +} + +export function MarkdownTable({ headers, rows, className }: MarkdownTableProps) { + return ( +
+ + + + {headers.map((h, i) => ( + + ))} + + + + {rows.map((row, ri) => ( + + {row.map((cell, ci) => ( + + ))} + + ))} + +
+ {h} +
+ {cell} +
+
+ ); +} diff --git a/web/components/adapted/Spinner.tsx b/web/components/adapted/Spinner.tsx new file mode 100644 index 0000000..6a93ae2 --- /dev/null +++ b/web/components/adapted/Spinner.tsx @@ -0,0 +1,151 @@ +"use client"; + +/** + * Web-adapted Spinner. + * + * The terminal Spinner (src/components/Spinner.tsx) drives animation via + * useAnimationFrame and renders Unicode braille/block characters with ANSI + * colour via Ink's . In the browser we replace that with a pure-CSS + * spinning ring, preserving the same optional `tip` text and `mode` prop + * surface so callers can swap in this component without changing props. + */ + +import * as React from "react"; +import { cn } from "@/lib/utils"; + +// ─── Types ──────────────────────────────────────────────────────────────────── + +/** Mirrors the SpinnerMode type from src/components/Spinner/index.ts */ +export type SpinnerMode = + | "queued" + | "loading" + | "thinking" + | "auto" + | "disabled"; + +export interface SpinnerProps { + /** Visual mode — controls colour/appearance. */ + mode?: SpinnerMode; + /** Optional tip text shown next to the spinner. */ + spinnerTip?: string; + /** Override message replaces the default verb. */ + overrideMessage?: string | null; + /** Additional suffix appended after the main label. */ + spinnerSuffix?: string | null; + /** When true the spinner renders inline instead of as a block row. */ + inline?: boolean; + /** Extra class names for the wrapper element. */ + className?: string; +} + +// ─── Colour map ─────────────────────────────────────────────────────────────── + +const MODE_RING_CLASS: Record = { + queued: "border-surface-500", + loading: "border-brand-400", + thinking: "border-brand-500", + auto: "border-brand-400", + disabled: "border-surface-600", +}; + +const MODE_TEXT_CLASS: Record = { + queued: "text-surface-400", + loading: "text-brand-300", + thinking: "text-brand-300", + auto: "text-brand-300", + disabled: "text-surface-500", +}; + +const MODE_LABEL: Record = { + queued: "Queued…", + loading: "Loading…", + thinking: "Thinking…", + auto: "Working…", + disabled: "", +}; + +// ─── Component ──────────────────────────────────────────────────────────────── + +export function Spinner({ + mode = "loading", + spinnerTip, + overrideMessage, + spinnerSuffix, + inline = false, + className, +}: SpinnerProps) { + if (mode === "disabled") return null; + + const label = + overrideMessage ?? + spinnerTip ?? + MODE_LABEL[mode]; + + const ringClass = MODE_RING_CLASS[mode]; + const textClass = MODE_TEXT_CLASS[mode]; + + return ( + + {/* CSS spinning ring */} + + {/* Inner ring for the visible arc — achieved via box-shadow trick */} + + + {(label || spinnerSuffix) && ( + + {label} + {spinnerSuffix && ( + {spinnerSuffix} + )} + + )} + + ); +} + +// ─── Shimmer / glimmer variant ──────────────────────────────────────────────── + +/** Pulsing shimmer bar — web replacement for GlimmerMessage / ShimmerChar. */ +export function ShimmerBar({ className }: { className?: string }) { + return ( +
+ ); +} + +/** Inline flashing cursor dot — web replacement for FlashingChar. */ +export function FlashingCursor({ className }: { className?: string }) { + return ( + + ); +} diff --git a/web/components/chat/ChatInput.tsx b/web/components/chat/ChatInput.tsx index 475ac0a..5f5c47a 100644 --- a/web/components/chat/ChatInput.tsx +++ b/web/components/chat/ChatInput.tsx @@ -118,12 +118,16 @@ export function ChatInput({ conversationId }: ChatInputProps) { > +